Repository: NerdLang/nerd Branch: master Commit: 400b367708c2 Files: 1067 Total size: 13.0 MB Directory structure: gitextract_918hrja8/ ├── .gitignore ├── LICENSE ├── README.md ├── base/ │ ├── cli/ │ │ └── cliParser.js │ ├── compiler/ │ │ └── target.js │ └── util/ │ ├── copyDirSync.js │ ├── copyRecursive.js │ ├── flash.js │ ├── getExt.js │ └── getTips.js ├── compiler/ │ ├── native/ │ │ ├── compiler.js │ │ ├── env/ │ │ │ ├── arduino.js │ │ │ ├── js.js │ │ │ ├── std.js │ │ │ └── wasm.js │ │ ├── nerdcore/ │ │ │ ├── src/ │ │ │ │ ├── class/ │ │ │ │ │ ├── _meta.h │ │ │ │ │ ├── array.h │ │ │ │ │ ├── array_header.h │ │ │ │ │ ├── base_header.h │ │ │ │ │ ├── fixed_array.h │ │ │ │ │ ├── fixed_array_header.h │ │ │ │ │ ├── function.h │ │ │ │ │ ├── function_header.h │ │ │ │ │ ├── native.h │ │ │ │ │ ├── native_header.h │ │ │ │ │ ├── native_tpl_header.h │ │ │ │ │ ├── number.h │ │ │ │ │ ├── number_header.h │ │ │ │ │ ├── object.h │ │ │ │ │ ├── object_header.h │ │ │ │ │ ├── string.h │ │ │ │ │ ├── string_header.h │ │ │ │ │ ├── struct.h │ │ │ │ │ └── struct_header.h │ │ │ │ ├── classes.h │ │ │ │ ├── classes_header.h │ │ │ │ ├── enum.h │ │ │ │ ├── functions.h │ │ │ │ ├── functions_header.h │ │ │ │ ├── macro.h │ │ │ │ ├── native/ │ │ │ │ │ ├── double.h │ │ │ │ │ ├── double_header.h │ │ │ │ │ ├── int.h │ │ │ │ │ └── int_header.h │ │ │ │ ├── native.h │ │ │ │ ├── native_header.h │ │ │ │ ├── nerd.cpp │ │ │ │ ├── nerd.hpp │ │ │ │ ├── objmgmt.h │ │ │ │ ├── objmgmt_header.h │ │ │ │ ├── operator.h │ │ │ │ ├── operator_header.h │ │ │ │ ├── stdfn.h │ │ │ │ ├── stdfn_header.h │ │ │ │ ├── tsl/ │ │ │ │ │ ├── robin_growth_policy.h │ │ │ │ │ ├── robin_hash.h │ │ │ │ │ ├── robin_map.h │ │ │ │ │ └── robin_set.h │ │ │ │ ├── type_header.h │ │ │ │ ├── values.h │ │ │ │ ├── values_header.h │ │ │ │ ├── var.h │ │ │ │ └── var_header.h │ │ │ └── test/ │ │ │ ├── array.cpp │ │ │ ├── cast.cpp │ │ │ ├── native.cpp │ │ │ ├── object.cpp │ │ │ └── operators.cpp │ │ └── squel/ │ │ ├── arduino.cpp │ │ ├── js.cpp │ │ ├── std.cpp │ │ └── wasm.cpp │ └── self/ │ ├── base/ │ │ ├── cli/ │ │ │ └── cliParser.ng │ │ ├── compiler/ │ │ │ └── target.js │ │ └── util/ │ │ ├── copyDirSync.js │ │ ├── copyRecursive.js │ │ ├── flash.js │ │ ├── getExt.js │ │ ├── getTips.js │ │ ├── httpUtils.js │ │ └── rmdir.js │ └── nerd.ng ├── example/ │ ├── arduino-lcd.ng │ ├── arduino.ng │ ├── args.ng │ ├── circular_array.ng │ ├── circular_fixed_array.ng │ ├── circular_object.ng │ ├── const.ng │ ├── date.ng │ ├── exec.ng │ ├── exit.ng │ ├── fibo.ng │ ├── fiboit.ng │ ├── functional.ng │ ├── hello.ng │ ├── http.ng │ ├── http_post.ng │ ├── json.ng │ ├── loop.ng │ ├── match.ng │ ├── native.ng │ ├── nested_object.ng │ ├── new.ng │ ├── object_keys.ng │ ├── os.ng │ ├── path.ng │ ├── readfile.ng │ ├── thread.ng │ ├── throw.ng │ ├── wasm.html │ └── wasm_binding.ng ├── external/ │ ├── arduino/ │ │ ├── avr/ │ │ │ ├── LICENSE.txt │ │ │ ├── boards.txt │ │ │ ├── bootloaders/ │ │ │ │ ├── atmega/ │ │ │ │ │ ├── ATmegaBOOT_168.c │ │ │ │ │ ├── ATmegaBOOT_168_atmega1280.hex │ │ │ │ │ ├── ATmegaBOOT_168_atmega328.hex │ │ │ │ │ ├── ATmegaBOOT_168_atmega328_pro_8MHz.hex │ │ │ │ │ ├── ATmegaBOOT_168_diecimila.hex │ │ │ │ │ ├── ATmegaBOOT_168_ng.hex │ │ │ │ │ ├── ATmegaBOOT_168_pro_8MHz.hex │ │ │ │ │ └── Makefile │ │ │ │ ├── atmega8/ │ │ │ │ │ ├── ATmegaBOOT-prod-firmware-2009-11-07.hex │ │ │ │ │ ├── ATmegaBOOT.c │ │ │ │ │ ├── ATmegaBOOT.hex │ │ │ │ │ ├── ATmegaBOOT.txt │ │ │ │ │ └── Makefile │ │ │ │ ├── bt/ │ │ │ │ │ ├── ATmegaBOOT_168.c │ │ │ │ │ ├── ATmegaBOOT_168.hex │ │ │ │ │ ├── ATmegaBOOT_168_atmega328_bt.hex │ │ │ │ │ └── Makefile │ │ │ │ ├── caterina/ │ │ │ │ │ ├── Caterina-Circuitplay32u4.hex │ │ │ │ │ ├── Caterina-Esplora.hex │ │ │ │ │ ├── Caterina-Esplora.txt │ │ │ │ │ ├── Caterina-Industrial101.hex │ │ │ │ │ ├── Caterina-Leonardo.hex │ │ │ │ │ ├── Caterina-Leonardo.txt │ │ │ │ │ ├── Caterina-LeonardoEthernet.hex │ │ │ │ │ ├── Caterina-LininoOne.hex │ │ │ │ │ ├── Caterina-Micro.hex │ │ │ │ │ ├── Caterina-Micro.txt │ │ │ │ │ ├── Caterina-Yun-noblink.hex │ │ │ │ │ ├── Caterina-Yun.hex │ │ │ │ │ ├── Caterina-YunMini.hex │ │ │ │ │ ├── Caterina.c │ │ │ │ │ ├── Caterina.h │ │ │ │ │ ├── Descriptors.c │ │ │ │ │ ├── Descriptors.h │ │ │ │ │ ├── Esplora-prod-firmware-2012-12-10.hex │ │ │ │ │ ├── Esplora-prod-firmware-2012-12-10.txt │ │ │ │ │ ├── Leonardo-prod-firmware-2012-04-26.hex │ │ │ │ │ ├── Leonardo-prod-firmware-2012-04-26.txt │ │ │ │ │ ├── Leonardo-prod-firmware-2012-12-10.hex │ │ │ │ │ ├── Leonardo-prod-firmware-2012-12-10.txt │ │ │ │ │ ├── Makefile │ │ │ │ │ ├── Micro-prod-firmware-2012-11-23.hex │ │ │ │ │ ├── Micro-prod-firmware-2012-11-23.txt │ │ │ │ │ ├── Micro-prod-firmware-2012-12-10.hex │ │ │ │ │ └── Micro-prod-firmware-2012-12-10.txt │ │ │ │ ├── caterina-Arduino_Robot/ │ │ │ │ │ ├── Caterina-Robot-Control.hex │ │ │ │ │ ├── Caterina-Robot-Motor.hex │ │ │ │ │ ├── Caterina-Robot.txt │ │ │ │ │ ├── Caterina.c │ │ │ │ │ ├── Caterina.h │ │ │ │ │ ├── Descriptors.c │ │ │ │ │ ├── Descriptors.h │ │ │ │ │ ├── Makefile │ │ │ │ │ └── README.md │ │ │ │ ├── caterina-LilyPadUSB/ │ │ │ │ │ ├── Caterina-LilyPadUSB.hex │ │ │ │ │ ├── Caterina.c │ │ │ │ │ ├── Caterina.h │ │ │ │ │ ├── Descriptors.c │ │ │ │ │ ├── Descriptors.h │ │ │ │ │ ├── Makefile │ │ │ │ │ └── Readme.txt │ │ │ │ ├── gemma/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── avrdude.conf │ │ │ │ │ ├── gemma_v1.hex │ │ │ │ │ ├── usbconfig.h │ │ │ │ │ └── usbconfig.patch │ │ │ │ ├── lilypad/ │ │ │ │ │ ├── LilyPadBOOT_168.hex │ │ │ │ │ └── src/ │ │ │ │ │ ├── ATmegaBOOT.c │ │ │ │ │ └── Makefile │ │ │ │ ├── optiboot/ │ │ │ │ │ ├── Makefile │ │ │ │ │ ├── README.TXT │ │ │ │ │ ├── boot.h │ │ │ │ │ ├── makeall │ │ │ │ │ ├── omake │ │ │ │ │ ├── omake.bat │ │ │ │ │ ├── optiboot.c │ │ │ │ │ ├── optiboot_atmega168.hex │ │ │ │ │ ├── optiboot_atmega168.lst │ │ │ │ │ ├── optiboot_atmega328-Mini.hex │ │ │ │ │ ├── optiboot_atmega328.hex │ │ │ │ │ ├── optiboot_atmega328.lst │ │ │ │ │ ├── optiboot_atmega8.hex │ │ │ │ │ ├── optiboot_atmega8.lst │ │ │ │ │ ├── pin_defs.h │ │ │ │ │ └── stk500.h │ │ │ │ └── stk500v2/ │ │ │ │ ├── License.txt │ │ │ │ ├── Makefile │ │ │ │ ├── Mega2560-prod-firmware-2011-06-29.hex │ │ │ │ ├── STK500V2.pnproj │ │ │ │ ├── STK500V2.pnps │ │ │ │ ├── avr_cpunames.h │ │ │ │ ├── avrinterruptnames.h │ │ │ │ ├── command.h │ │ │ │ ├── stk500boot.c │ │ │ │ ├── stk500boot.ppg │ │ │ │ └── stk500boot_v2_mega2560.hex │ │ │ ├── cores/ │ │ │ │ └── arduino/ │ │ │ │ ├── Arduino.h │ │ │ │ ├── CDC.cpp │ │ │ │ ├── Client.h │ │ │ │ ├── HardwareSerial.cpp │ │ │ │ ├── HardwareSerial.h │ │ │ │ ├── HardwareSerial0.cpp │ │ │ │ ├── HardwareSerial1.cpp │ │ │ │ ├── HardwareSerial2.cpp │ │ │ │ ├── HardwareSerial3.cpp │ │ │ │ ├── HardwareSerial_private.h │ │ │ │ ├── IPAddress.cpp │ │ │ │ ├── IPAddress.h │ │ │ │ ├── PluggableUSB.cpp │ │ │ │ ├── PluggableUSB.h │ │ │ │ ├── Print.cpp │ │ │ │ ├── Print.h │ │ │ │ ├── Printable.h │ │ │ │ ├── Server.h │ │ │ │ ├── Stream.cpp │ │ │ │ ├── Stream.h │ │ │ │ ├── Tone.cpp │ │ │ │ ├── USBAPI.h │ │ │ │ ├── USBCore.cpp │ │ │ │ ├── USBCore.h │ │ │ │ ├── USBDesc.h │ │ │ │ ├── Udp.h │ │ │ │ ├── WCharacter.h │ │ │ │ ├── WInterrupts.c │ │ │ │ ├── WMath.cpp │ │ │ │ ├── WString.cpp │ │ │ │ ├── WString.h │ │ │ │ ├── abi.cpp │ │ │ │ ├── binary.h │ │ │ │ ├── hooks.c │ │ │ │ ├── main.cpp │ │ │ │ ├── new.cpp │ │ │ │ ├── new.h │ │ │ │ ├── wiring.c │ │ │ │ ├── wiring_analog.c │ │ │ │ ├── wiring_digital.c │ │ │ │ ├── wiring_private.h │ │ │ │ ├── wiring_pulse.S │ │ │ │ ├── wiring_pulse.c │ │ │ │ └── wiring_shift.c │ │ │ ├── extras/ │ │ │ │ ├── pack.hourlybuild.bash │ │ │ │ ├── pack.pullrequest.bash │ │ │ │ ├── pack.release.bash │ │ │ │ ├── package_index.json.Hourly.template │ │ │ │ └── package_index.json.PR.template │ │ │ ├── firmwares/ │ │ │ │ ├── arduinoISP/ │ │ │ │ │ └── readme.txt │ │ │ │ ├── atmegaxxu2/ │ │ │ │ │ ├── Arduino-COMBINED-dfu-usbserial-atmega16u2-Mega2560-Rev3.hex │ │ │ │ │ ├── Arduino-COMBINED-dfu-usbserial-atmega16u2-MegaADK-Rev3.hex │ │ │ │ │ ├── Arduino-COMBINED-dfu-usbserial-atmega16u2-Uno-Rev3.hex │ │ │ │ │ ├── Genuino-COMBINED-dfu-usbserial-atmega16u2-Mega2560-R3.hex │ │ │ │ │ ├── Genuino-COMBINED-dfu-usbserial-atmega16u2-Uno-R3.hex │ │ │ │ │ ├── MEGA-dfu_and_usbserial_combined.hex │ │ │ │ │ ├── README.txt │ │ │ │ │ ├── UNO-dfu_and_usbserial_combined.hex │ │ │ │ │ ├── arduino-usbdfu/ │ │ │ │ │ │ ├── Arduino-usbdfu.c │ │ │ │ │ │ ├── Arduino-usbdfu.h │ │ │ │ │ │ ├── Board/ │ │ │ │ │ │ │ └── LEDs.h │ │ │ │ │ │ ├── Descriptors.c │ │ │ │ │ │ ├── Descriptors.h │ │ │ │ │ │ ├── makefile │ │ │ │ │ │ └── readme.txt │ │ │ │ │ └── arduino-usbserial/ │ │ │ │ │ ├── Arduino-usbserial-atmega16u2-Mega2560-Rev3.hex │ │ │ │ │ ├── Arduino-usbserial-atmega16u2-MegaADK-Rev3.hex │ │ │ │ │ ├── Arduino-usbserial-atmega16u2-Uno-Rev3.hex │ │ │ │ │ ├── Arduino-usbserial-mega.hex │ │ │ │ │ ├── Arduino-usbserial-uno.hex │ │ │ │ │ ├── Arduino-usbserial.c │ │ │ │ │ ├── Arduino-usbserial.h │ │ │ │ │ ├── Board/ │ │ │ │ │ │ └── LEDs.h │ │ │ │ │ ├── Descriptors.c │ │ │ │ │ ├── Descriptors.h │ │ │ │ │ ├── Genuino-usbserial-atmega16u2-Mega2560-R3.hex │ │ │ │ │ ├── Genuino-usbserial-atmega16u2-Uno-R3.hex │ │ │ │ │ ├── Lib/ │ │ │ │ │ │ └── LightweightRingBuff.h │ │ │ │ │ ├── makefile │ │ │ │ │ └── readme.txt │ │ │ │ └── wifishield/ │ │ │ │ ├── binary/ │ │ │ │ │ ├── wifiHD.elf │ │ │ │ │ ├── wifiHD.hex │ │ │ │ │ ├── wifiHD_2_1.elf │ │ │ │ │ ├── wifi_dnld.elf │ │ │ │ │ ├── wifi_dnld.hex │ │ │ │ │ └── wifi_dnld_2_1.elf │ │ │ │ ├── scripts/ │ │ │ │ │ ├── ArduinoWifiShield_upgrade.sh │ │ │ │ │ └── ArduinoWifiShield_upgrade_mac.sh │ │ │ │ ├── wifiHD/ │ │ │ │ │ ├── .cproject │ │ │ │ │ ├── .project │ │ │ │ │ ├── Release/ │ │ │ │ │ │ ├── wifiHD.elf │ │ │ │ │ │ └── wifiHD.hex │ │ │ │ │ ├── src/ │ │ │ │ │ │ ├── CONFIG/ │ │ │ │ │ │ │ ├── conf_access.h │ │ │ │ │ │ │ ├── conf_at45dbx.h │ │ │ │ │ │ │ ├── conf_ebi.h │ │ │ │ │ │ │ └── conf_sd_mmc_spi.h │ │ │ │ │ │ ├── SOFTWARE_FRAMEWORK/ │ │ │ │ │ │ │ ├── ASM/ │ │ │ │ │ │ │ │ └── trampoline.x │ │ │ │ │ │ │ ├── BOARDS/ │ │ │ │ │ │ │ │ ├── ARDUINO/ │ │ │ │ │ │ │ │ │ ├── arduino.h │ │ │ │ │ │ │ │ │ ├── led.c │ │ │ │ │ │ │ │ │ └── led.h │ │ │ │ │ │ │ │ ├── EVK1105/ │ │ │ │ │ │ │ │ │ ├── evk1105.h │ │ │ │ │ │ │ │ │ ├── led.c │ │ │ │ │ │ │ │ │ └── led.h │ │ │ │ │ │ │ │ ├── board.h │ │ │ │ │ │ │ │ └── board.h.my │ │ │ │ │ │ │ ├── COMPONENTS/ │ │ │ │ │ │ │ │ ├── MEMORY/ │ │ │ │ │ │ │ │ │ └── DATA_FLASH/ │ │ │ │ │ │ │ │ │ └── AT45DBX/ │ │ │ │ │ │ │ │ │ ├── at45dbx.c │ │ │ │ │ │ │ │ │ ├── at45dbx.h │ │ │ │ │ │ │ │ │ ├── at45dbx_mem.c │ │ │ │ │ │ │ │ │ └── at45dbx_mem.h │ │ │ │ │ │ │ │ └── WIFI/ │ │ │ │ │ │ │ │ └── HD/ │ │ │ │ │ │ │ │ ├── v2.7.0/ │ │ │ │ │ │ │ │ │ ├── UCR1/ │ │ │ │ │ │ │ │ │ │ └── GCC/ │ │ │ │ │ │ │ │ │ │ ├── lib_ucr1_hd_sdio_v2.7.0.a │ │ │ │ │ │ │ │ │ │ ├── lib_ucr1_hd_spi_v2.7.0.a │ │ │ │ │ │ │ │ │ │ └── lib_ucr1_hd_wl_sta_intwpa_v2.7.0.a │ │ │ │ │ │ │ │ │ ├── UCR2/ │ │ │ │ │ │ │ │ │ │ └── GCC/ │ │ │ │ │ │ │ │ │ │ ├── lib_ucr2_hd_sdio_v2.7.0.a │ │ │ │ │ │ │ │ │ │ ├── lib_ucr2_hd_spi_v2.7.0.a │ │ │ │ │ │ │ │ │ │ └── lib_ucr2_hd_wl_sta_intwpa_v2.7.0.a │ │ │ │ │ │ │ │ │ └── revision.txt │ │ │ │ │ │ │ │ ├── wl_api.h │ │ │ │ │ │ │ │ ├── wl_fw.h │ │ │ │ │ │ │ │ ├── wl_os.h │ │ │ │ │ │ │ │ ├── wl_sdio.h │ │ │ │ │ │ │ │ ├── wl_spi.h │ │ │ │ │ │ │ │ └── wlap_api.h │ │ │ │ │ │ │ ├── DRIVERS/ │ │ │ │ │ │ │ │ ├── CPU/ │ │ │ │ │ │ │ │ │ └── CYCLE_COUNTER/ │ │ │ │ │ │ │ │ │ └── cycle_counter.h │ │ │ │ │ │ │ │ ├── EBI/ │ │ │ │ │ │ │ │ │ └── SMC/ │ │ │ │ │ │ │ │ │ ├── smc.c │ │ │ │ │ │ │ │ │ └── smc.h │ │ │ │ │ │ │ │ ├── EIC/ │ │ │ │ │ │ │ │ │ ├── eic.c │ │ │ │ │ │ │ │ │ └── eic.h │ │ │ │ │ │ │ │ ├── FLASHC/ │ │ │ │ │ │ │ │ │ ├── flashc.c │ │ │ │ │ │ │ │ │ └── flashc.h │ │ │ │ │ │ │ │ ├── GPIO/ │ │ │ │ │ │ │ │ │ ├── gpio.c │ │ │ │ │ │ │ │ │ └── gpio.h │ │ │ │ │ │ │ │ ├── INTC/ │ │ │ │ │ │ │ │ │ ├── exception.x │ │ │ │ │ │ │ │ │ ├── intc.c │ │ │ │ │ │ │ │ │ └── intc.h │ │ │ │ │ │ │ │ ├── PDCA/ │ │ │ │ │ │ │ │ │ ├── pdca.c │ │ │ │ │ │ │ │ │ └── pdca.h │ │ │ │ │ │ │ │ ├── PM/ │ │ │ │ │ │ │ │ │ ├── pm.c │ │ │ │ │ │ │ │ │ ├── pm.h │ │ │ │ │ │ │ │ │ ├── pm_conf_clocks.c │ │ │ │ │ │ │ │ │ ├── power_clocks_lib.c │ │ │ │ │ │ │ │ │ └── power_clocks_lib.h │ │ │ │ │ │ │ │ ├── RTC/ │ │ │ │ │ │ │ │ │ ├── rtc.c │ │ │ │ │ │ │ │ │ └── rtc.h │ │ │ │ │ │ │ │ ├── SPI/ │ │ │ │ │ │ │ │ │ ├── spi.c │ │ │ │ │ │ │ │ │ └── spi.h │ │ │ │ │ │ │ │ ├── TC/ │ │ │ │ │ │ │ │ │ ├── tc.c │ │ │ │ │ │ │ │ │ └── tc.h │ │ │ │ │ │ │ │ └── USART/ │ │ │ │ │ │ │ │ ├── usart.c │ │ │ │ │ │ │ │ └── usart.h │ │ │ │ │ │ │ ├── SERVICES/ │ │ │ │ │ │ │ │ ├── DELAY/ │ │ │ │ │ │ │ │ │ ├── delay.c │ │ │ │ │ │ │ │ │ └── delay.h │ │ │ │ │ │ │ │ ├── LWIP/ │ │ │ │ │ │ │ │ │ ├── lwip-1.3.2/ │ │ │ │ │ │ │ │ │ │ └── src/ │ │ │ │ │ │ │ │ │ │ ├── core/ │ │ │ │ │ │ │ │ │ │ │ ├── dhcp.c │ │ │ │ │ │ │ │ │ │ │ ├── dns.c │ │ │ │ │ │ │ │ │ │ │ ├── init.c │ │ │ │ │ │ │ │ │ │ │ ├── ipv4/ │ │ │ │ │ │ │ │ │ │ │ │ ├── autoip.c │ │ │ │ │ │ │ │ │ │ │ │ ├── icmp.c │ │ │ │ │ │ │ │ │ │ │ │ ├── igmp.c │ │ │ │ │ │ │ │ │ │ │ │ ├── inet.c │ │ │ │ │ │ │ │ │ │ │ │ ├── inet_chksum.c │ │ │ │ │ │ │ │ │ │ │ │ ├── ip.c │ │ │ │ │ │ │ │ │ │ │ │ ├── ip_addr.c │ │ │ │ │ │ │ │ │ │ │ │ └── ip_frag.c │ │ │ │ │ │ │ │ │ │ │ ├── mem.c │ │ │ │ │ │ │ │ │ │ │ ├── memp.c │ │ │ │ │ │ │ │ │ │ │ ├── netif.c │ │ │ │ │ │ │ │ │ │ │ ├── pbuf.c │ │ │ │ │ │ │ │ │ │ │ ├── raw.c │ │ │ │ │ │ │ │ │ │ │ ├── stats.c │ │ │ │ │ │ │ │ │ │ │ ├── tcp.c │ │ │ │ │ │ │ │ │ │ │ ├── tcp_in.c │ │ │ │ │ │ │ │ │ │ │ ├── tcp_out.c │ │ │ │ │ │ │ │ │ │ │ └── udp.c │ │ │ │ │ │ │ │ │ │ ├── include/ │ │ │ │ │ │ │ │ │ │ │ ├── ipv4/ │ │ │ │ │ │ │ │ │ │ │ │ └── lwip/ │ │ │ │ │ │ │ │ │ │ │ │ ├── autoip.h │ │ │ │ │ │ │ │ │ │ │ │ ├── icmp.h │ │ │ │ │ │ │ │ │ │ │ │ ├── igmp.h │ │ │ │ │ │ │ │ │ │ │ │ ├── inet.h │ │ │ │ │ │ │ │ │ │ │ │ ├── inet_chksum.h │ │ │ │ │ │ │ │ │ │ │ │ ├── ip.h │ │ │ │ │ │ │ │ │ │ │ │ ├── ip_addr.h │ │ │ │ │ │ │ │ │ │ │ │ └── ip_frag.h │ │ │ │ │ │ │ │ │ │ │ ├── lwip/ │ │ │ │ │ │ │ │ │ │ │ │ ├── api.h │ │ │ │ │ │ │ │ │ │ │ │ ├── api_msg.h │ │ │ │ │ │ │ │ │ │ │ │ ├── arch.h │ │ │ │ │ │ │ │ │ │ │ │ ├── debug.h │ │ │ │ │ │ │ │ │ │ │ │ ├── def.h │ │ │ │ │ │ │ │ │ │ │ │ ├── dhcp.h │ │ │ │ │ │ │ │ │ │ │ │ ├── dns.h │ │ │ │ │ │ │ │ │ │ │ │ ├── err.h │ │ │ │ │ │ │ │ │ │ │ │ ├── init.h │ │ │ │ │ │ │ │ │ │ │ │ ├── mem.h │ │ │ │ │ │ │ │ │ │ │ │ ├── memp.h │ │ │ │ │ │ │ │ │ │ │ │ ├── memp_std.h │ │ │ │ │ │ │ │ │ │ │ │ ├── netbuf.h │ │ │ │ │ │ │ │ │ │ │ │ ├── netdb.h │ │ │ │ │ │ │ │ │ │ │ │ ├── netif.h │ │ │ │ │ │ │ │ │ │ │ │ ├── netifapi.h │ │ │ │ │ │ │ │ │ │ │ │ ├── opt.h │ │ │ │ │ │ │ │ │ │ │ │ ├── pbuf.h │ │ │ │ │ │ │ │ │ │ │ │ ├── raw.h │ │ │ │ │ │ │ │ │ │ │ │ ├── sio.h │ │ │ │ │ │ │ │ │ │ │ │ ├── snmp.h │ │ │ │ │ │ │ │ │ │ │ │ ├── snmp_asn1.h │ │ │ │ │ │ │ │ │ │ │ │ ├── snmp_msg.h │ │ │ │ │ │ │ │ │ │ │ │ ├── snmp_structs.h │ │ │ │ │ │ │ │ │ │ │ │ ├── sockets.h │ │ │ │ │ │ │ │ │ │ │ │ ├── stats.h │ │ │ │ │ │ │ │ │ │ │ │ ├── sys.h │ │ │ │ │ │ │ │ │ │ │ │ ├── tcp.h │ │ │ │ │ │ │ │ │ │ │ │ ├── tcpip.h │ │ │ │ │ │ │ │ │ │ │ │ └── udp.h │ │ │ │ │ │ │ │ │ │ │ └── netif/ │ │ │ │ │ │ │ │ │ │ │ ├── etharp.h │ │ │ │ │ │ │ │ │ │ │ ├── loopif.h │ │ │ │ │ │ │ │ │ │ │ ├── ppp_oe.h │ │ │ │ │ │ │ │ │ │ │ └── slipif.h │ │ │ │ │ │ │ │ │ │ └── netif/ │ │ │ │ │ │ │ │ │ │ ├── etharp.c │ │ │ │ │ │ │ │ │ │ └── loopif.c │ │ │ │ │ │ │ │ │ └── lwip-port-1.3.2/ │ │ │ │ │ │ │ │ │ └── HD/ │ │ │ │ │ │ │ │ │ ├── if/ │ │ │ │ │ │ │ │ │ │ ├── include/ │ │ │ │ │ │ │ │ │ │ │ ├── arch/ │ │ │ │ │ │ │ │ │ │ │ │ ├── cc.h │ │ │ │ │ │ │ │ │ │ │ │ └── perf.h │ │ │ │ │ │ │ │ │ │ │ ├── lwipopts.h │ │ │ │ │ │ │ │ │ │ │ └── netif/ │ │ │ │ │ │ │ │ │ │ │ └── wlif.h │ │ │ │ │ │ │ │ │ │ └── netif/ │ │ │ │ │ │ │ │ │ │ └── wlif.c │ │ │ │ │ │ │ │ │ └── readme.txt │ │ │ │ │ │ │ │ └── MEMORY/ │ │ │ │ │ │ │ │ └── CTRL_ACCESS/ │ │ │ │ │ │ │ │ ├── ctrl_access.c │ │ │ │ │ │ │ │ └── ctrl_access.h │ │ │ │ │ │ │ └── UTILS/ │ │ │ │ │ │ │ ├── DEBUG/ │ │ │ │ │ │ │ │ ├── debug.c │ │ │ │ │ │ │ │ ├── debug.h │ │ │ │ │ │ │ │ ├── print_funcs.c │ │ │ │ │ │ │ │ └── print_funcs.h │ │ │ │ │ │ │ ├── LIBS/ │ │ │ │ │ │ │ │ └── NEWLIB_ADDONS/ │ │ │ │ │ │ │ │ ├── INCLUDE/ │ │ │ │ │ │ │ │ │ ├── nlao_cpu.h │ │ │ │ │ │ │ │ │ ├── nlao_exceptions.h │ │ │ │ │ │ │ │ │ ├── nlao_interrupts.h │ │ │ │ │ │ │ │ │ ├── nlao_io.h │ │ │ │ │ │ │ │ │ └── nlao_usart.h │ │ │ │ │ │ │ │ └── libnewlib_addons-at32ucr2-speed_opt.a │ │ │ │ │ │ │ ├── LINKER_SCRIPTS/ │ │ │ │ │ │ │ │ └── AT32UC3A/ │ │ │ │ │ │ │ │ ├── 0512/ │ │ │ │ │ │ │ │ │ └── GCC/ │ │ │ │ │ │ │ │ │ └── link_uc3a0512.lds │ │ │ │ │ │ │ │ └── 1256/ │ │ │ │ │ │ │ │ └── GCC/ │ │ │ │ │ │ │ │ └── link_uc3a1256.lds │ │ │ │ │ │ │ ├── PREPROCESSOR/ │ │ │ │ │ │ │ │ ├── mrepeat.h │ │ │ │ │ │ │ │ ├── preprocessor.h │ │ │ │ │ │ │ │ ├── stringz.h │ │ │ │ │ │ │ │ └── tpaste.h │ │ │ │ │ │ │ ├── STARTUP_FILES/ │ │ │ │ │ │ │ │ └── GCC/ │ │ │ │ │ │ │ │ └── crt0.x │ │ │ │ │ │ │ ├── compiler.h │ │ │ │ │ │ │ ├── conf_isp.h │ │ │ │ │ │ │ └── parts.h │ │ │ │ │ │ ├── ard_spi.c │ │ │ │ │ │ ├── ard_spi.h │ │ │ │ │ │ ├── ard_tcp.c │ │ │ │ │ │ ├── ard_tcp.h │ │ │ │ │ │ ├── ard_utils.c │ │ │ │ │ │ ├── ard_utils.h │ │ │ │ │ │ ├── avr32_spi.c │ │ │ │ │ │ ├── board_init.c │ │ │ │ │ │ ├── board_init.h │ │ │ │ │ │ ├── cmd_wl.c │ │ │ │ │ │ ├── cmd_wl.h │ │ │ │ │ │ ├── console.c │ │ │ │ │ │ ├── console.h │ │ │ │ │ │ ├── debug.h │ │ │ │ │ │ ├── fw_download.h │ │ │ │ │ │ ├── fw_download_extflash.c │ │ │ │ │ │ ├── license.txt │ │ │ │ │ │ ├── lwip_setup.c │ │ │ │ │ │ ├── lwip_setup.h │ │ │ │ │ │ ├── lwipopts.h │ │ │ │ │ │ ├── main.c │ │ │ │ │ │ ├── nvram.c │ │ │ │ │ │ ├── nvram.h │ │ │ │ │ │ ├── owl_os.c │ │ │ │ │ │ ├── ping.c │ │ │ │ │ │ ├── ping.h │ │ │ │ │ │ ├── printf-stdarg.c │ │ │ │ │ │ ├── printf-stdarg.h │ │ │ │ │ │ ├── timer.c │ │ │ │ │ │ ├── timer.h │ │ │ │ │ │ ├── top_defs.h │ │ │ │ │ │ ├── trace.h │ │ │ │ │ │ ├── util.c │ │ │ │ │ │ ├── util.h │ │ │ │ │ │ ├── wifi_spi.h │ │ │ │ │ │ ├── wl_cm.c │ │ │ │ │ │ ├── wl_cm.h │ │ │ │ │ │ └── wl_definitions.h │ │ │ │ │ └── wifiHD.cproj │ │ │ │ ├── wifi_dnld/ │ │ │ │ │ ├── .cproject │ │ │ │ │ ├── .project │ │ │ │ │ ├── Release/ │ │ │ │ │ │ └── wifi_dnld.elf │ │ │ │ │ ├── src/ │ │ │ │ │ │ ├── CONFIG/ │ │ │ │ │ │ │ ├── conf_access.h │ │ │ │ │ │ │ └── conf_at45dbx.h │ │ │ │ │ │ ├── SOFTWARE_FRAMEWORK/ │ │ │ │ │ │ │ ├── ASM/ │ │ │ │ │ │ │ │ └── trampoline.x │ │ │ │ │ │ │ ├── BOARDS/ │ │ │ │ │ │ │ │ ├── ARDUINO/ │ │ │ │ │ │ │ │ │ ├── arduino.h │ │ │ │ │ │ │ │ │ ├── led.c │ │ │ │ │ │ │ │ │ └── led.h │ │ │ │ │ │ │ │ ├── EVK1105/ │ │ │ │ │ │ │ │ │ ├── evk1105.h │ │ │ │ │ │ │ │ │ ├── led.c │ │ │ │ │ │ │ │ │ └── led.h │ │ │ │ │ │ │ │ ├── board.h │ │ │ │ │ │ │ │ └── board.h.ori │ │ │ │ │ │ │ ├── COMPONENTS/ │ │ │ │ │ │ │ │ └── MEMORY/ │ │ │ │ │ │ │ │ └── DATA_FLASH/ │ │ │ │ │ │ │ │ └── AT45DBX/ │ │ │ │ │ │ │ │ ├── at45dbx.c │ │ │ │ │ │ │ │ ├── at45dbx.h │ │ │ │ │ │ │ │ ├── at45dbx_mem.c │ │ │ │ │ │ │ │ └── at45dbx_mem.h │ │ │ │ │ │ │ ├── DRIVERS/ │ │ │ │ │ │ │ │ ├── FLASHC/ │ │ │ │ │ │ │ │ │ ├── flashc.c │ │ │ │ │ │ │ │ │ └── flashc.h │ │ │ │ │ │ │ │ ├── GPIO/ │ │ │ │ │ │ │ │ │ ├── gpio.c │ │ │ │ │ │ │ │ │ └── gpio.h │ │ │ │ │ │ │ │ ├── INTC/ │ │ │ │ │ │ │ │ │ ├── exception.x │ │ │ │ │ │ │ │ │ ├── intc.c │ │ │ │ │ │ │ │ │ └── intc.h │ │ │ │ │ │ │ │ ├── PM/ │ │ │ │ │ │ │ │ │ ├── pm.c │ │ │ │ │ │ │ │ │ ├── pm.h │ │ │ │ │ │ │ │ │ ├── pm_conf_clocks.c │ │ │ │ │ │ │ │ │ ├── power_clocks_lib.c │ │ │ │ │ │ │ │ │ └── power_clocks_lib.h │ │ │ │ │ │ │ │ ├── SPI/ │ │ │ │ │ │ │ │ │ ├── spi.c │ │ │ │ │ │ │ │ │ └── spi.h │ │ │ │ │ │ │ │ └── USART/ │ │ │ │ │ │ │ │ ├── usart.c │ │ │ │ │ │ │ │ └── usart.h │ │ │ │ │ │ │ ├── SERVICES/ │ │ │ │ │ │ │ │ └── MEMORY/ │ │ │ │ │ │ │ │ └── CTRL_ACCESS/ │ │ │ │ │ │ │ │ ├── ctrl_access.c │ │ │ │ │ │ │ │ └── ctrl_access.h │ │ │ │ │ │ │ └── UTILS/ │ │ │ │ │ │ │ ├── DEBUG/ │ │ │ │ │ │ │ │ ├── debug.c │ │ │ │ │ │ │ │ ├── debug.h │ │ │ │ │ │ │ │ ├── print_funcs.c │ │ │ │ │ │ │ │ └── print_funcs.h │ │ │ │ │ │ │ ├── LIBS/ │ │ │ │ │ │ │ │ └── NEWLIB_ADDONS/ │ │ │ │ │ │ │ │ ├── INCLUDE/ │ │ │ │ │ │ │ │ │ ├── nlao_cpu.h │ │ │ │ │ │ │ │ │ ├── nlao_exceptions.h │ │ │ │ │ │ │ │ │ ├── nlao_interrupts.h │ │ │ │ │ │ │ │ │ ├── nlao_io.h │ │ │ │ │ │ │ │ │ └── nlao_usart.h │ │ │ │ │ │ │ │ └── libnewlib_addons-at32ucr2-speed_opt.a │ │ │ │ │ │ │ ├── LINKER_SCRIPTS/ │ │ │ │ │ │ │ │ └── AT32UC3A/ │ │ │ │ │ │ │ │ ├── 0512/ │ │ │ │ │ │ │ │ │ └── GCC/ │ │ │ │ │ │ │ │ │ └── link_uc3a0512.lds │ │ │ │ │ │ │ │ └── 1256/ │ │ │ │ │ │ │ │ └── GCC/ │ │ │ │ │ │ │ │ └── link_uc3a1256.lds │ │ │ │ │ │ │ ├── PREPROCESSOR/ │ │ │ │ │ │ │ │ ├── mrepeat.h │ │ │ │ │ │ │ │ ├── preprocessor.h │ │ │ │ │ │ │ │ ├── stringz.h │ │ │ │ │ │ │ │ └── tpaste.h │ │ │ │ │ │ │ ├── STARTUP_FILES/ │ │ │ │ │ │ │ │ └── GCC/ │ │ │ │ │ │ │ │ └── crt0.x │ │ │ │ │ │ │ ├── compiler.h │ │ │ │ │ │ │ ├── conf_isp.h │ │ │ │ │ │ │ └── parts.h │ │ │ │ │ │ ├── clocks.c │ │ │ │ │ │ ├── clocks.h │ │ │ │ │ │ ├── flash_fw.c │ │ │ │ │ │ ├── license.txt │ │ │ │ │ │ ├── nor_flash.c │ │ │ │ │ │ ├── nor_flash.h │ │ │ │ │ │ ├── printf-stdarg.c │ │ │ │ │ │ ├── printf-stdarg.h │ │ │ │ │ │ ├── startup.c │ │ │ │ │ │ ├── startup.h │ │ │ │ │ │ └── wl_fw.h │ │ │ │ │ └── wifi_dnld.cproj │ │ │ │ └── wifishield.atsln │ │ │ ├── libraries/ │ │ │ │ ├── EEPROM/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── examples/ │ │ │ │ │ │ ├── eeprom_clear/ │ │ │ │ │ │ │ └── eeprom_clear.ino │ │ │ │ │ │ ├── eeprom_crc/ │ │ │ │ │ │ │ └── eeprom_crc.ino │ │ │ │ │ │ ├── eeprom_get/ │ │ │ │ │ │ │ └── eeprom_get.ino │ │ │ │ │ │ ├── eeprom_iteration/ │ │ │ │ │ │ │ └── eeprom_iteration.ino │ │ │ │ │ │ ├── eeprom_put/ │ │ │ │ │ │ │ └── eeprom_put.ino │ │ │ │ │ │ ├── eeprom_read/ │ │ │ │ │ │ │ └── eeprom_read.ino │ │ │ │ │ │ ├── eeprom_update/ │ │ │ │ │ │ │ └── eeprom_update.ino │ │ │ │ │ │ └── eeprom_write/ │ │ │ │ │ │ └── eeprom_write.ino │ │ │ │ │ ├── keywords.txt │ │ │ │ │ ├── library.properties │ │ │ │ │ └── src/ │ │ │ │ │ └── EEPROM.h │ │ │ │ ├── HID/ │ │ │ │ │ ├── keywords.txt │ │ │ │ │ ├── library.properties │ │ │ │ │ └── src/ │ │ │ │ │ ├── HID.cpp │ │ │ │ │ └── HID.h │ │ │ │ ├── SPI/ │ │ │ │ │ ├── examples/ │ │ │ │ │ │ ├── BarometricPressureSensor/ │ │ │ │ │ │ │ └── BarometricPressureSensor.ino │ │ │ │ │ │ └── DigitalPotControl/ │ │ │ │ │ │ └── DigitalPotControl.ino │ │ │ │ │ ├── keywords.txt │ │ │ │ │ ├── library.properties │ │ │ │ │ └── src/ │ │ │ │ │ ├── SPI.cpp │ │ │ │ │ └── SPI.h │ │ │ │ ├── SoftwareSerial/ │ │ │ │ │ ├── examples/ │ │ │ │ │ │ ├── SoftwareSerialExample/ │ │ │ │ │ │ │ └── SoftwareSerialExample.ino │ │ │ │ │ │ └── TwoPortReceive/ │ │ │ │ │ │ └── TwoPortReceive.ino │ │ │ │ │ ├── keywords.txt │ │ │ │ │ ├── library.properties │ │ │ │ │ └── src/ │ │ │ │ │ ├── SoftwareSerial.cpp │ │ │ │ │ └── SoftwareSerial.h │ │ │ │ └── Wire/ │ │ │ │ ├── examples/ │ │ │ │ │ ├── SFRRanger_reader/ │ │ │ │ │ │ └── SFRRanger_reader.ino │ │ │ │ │ ├── digital_potentiometer/ │ │ │ │ │ │ └── digital_potentiometer.ino │ │ │ │ │ ├── i2c_scanner/ │ │ │ │ │ │ └── i2c_scanner.ino │ │ │ │ │ ├── master_reader/ │ │ │ │ │ │ └── master_reader.ino │ │ │ │ │ ├── master_writer/ │ │ │ │ │ │ └── master_writer.ino │ │ │ │ │ ├── slave_receiver/ │ │ │ │ │ │ └── slave_receiver.ino │ │ │ │ │ └── slave_sender/ │ │ │ │ │ └── slave_sender.ino │ │ │ │ ├── keywords.txt │ │ │ │ ├── library.properties │ │ │ │ └── src/ │ │ │ │ ├── Wire.cpp │ │ │ │ ├── Wire.h │ │ │ │ └── utility/ │ │ │ │ ├── twi.c │ │ │ │ └── twi.h │ │ │ ├── platform.txt │ │ │ ├── programmers.txt │ │ │ └── variants/ │ │ │ ├── circuitplay32u4/ │ │ │ │ └── pins_arduino.h │ │ │ ├── eightanaloginputs/ │ │ │ │ └── pins_arduino.h │ │ │ ├── ethernet/ │ │ │ │ └── pins_arduino.h │ │ │ ├── gemma/ │ │ │ │ └── pins_arduino.h │ │ │ ├── leonardo/ │ │ │ │ └── pins_arduino.h │ │ │ ├── mega/ │ │ │ │ └── pins_arduino.h │ │ │ ├── micro/ │ │ │ │ └── pins_arduino.h │ │ │ ├── robot_control/ │ │ │ │ └── pins_arduino.h │ │ │ ├── robot_motor/ │ │ │ │ └── pins_arduino.h │ │ │ ├── standard/ │ │ │ │ └── pins_arduino.h │ │ │ └── yun/ │ │ │ └── pins_arduino.h │ │ └── stlarduino/ │ │ ├── ArduinoSTL.cpp │ │ ├── ArduinoSTL.h │ │ ├── LICENSE │ │ ├── abi/ │ │ │ ├── abi.cpp │ │ │ ├── libgcc_eh/ │ │ │ │ ├── Makefile │ │ │ │ └── Makefile.in │ │ │ └── libsupc/ │ │ │ ├── Makefile │ │ │ └── Makefile.in │ │ ├── algorithm │ │ ├── algorithm.cpp │ │ ├── associative_base │ │ ├── associative_base.cpp │ │ ├── basic_definitions │ │ ├── bitset │ │ ├── bitset.cpp │ │ ├── cassert │ │ ├── cctype │ │ ├── cerrno │ │ ├── cfloat │ │ ├── char_traits │ │ ├── char_traits.cpp │ │ ├── climits │ │ ├── clocale │ │ ├── cmath │ │ ├── complex │ │ ├── complex.cpp │ │ ├── csetjmp │ │ ├── csignal │ │ ├── cstdarg │ │ ├── cstddef │ │ ├── cstdio │ │ ├── cstdlib │ │ ├── cstring │ │ ├── ctime │ │ ├── cwchar │ │ ├── cwctype │ │ ├── del_op.cpp │ │ ├── del_opnt.cpp │ │ ├── del_ops.cpp │ │ ├── del_opv.cpp │ │ ├── del_opvnt.cpp │ │ ├── del_opvs.cpp │ │ ├── deque │ │ ├── deque.cpp │ │ ├── eh_alloc.cpp │ │ ├── eh_globals.cpp │ │ ├── exception │ │ ├── exception.cpp │ │ ├── func_exception │ │ ├── func_exception.cpp │ │ ├── functional │ │ ├── initializer_list │ │ ├── iomanip │ │ ├── iomanip.cpp │ │ ├── ios │ │ ├── ios.cpp │ │ ├── iosfwd │ │ ├── iostream │ │ ├── iostream.cpp │ │ ├── istream │ │ ├── istream.cpp │ │ ├── istream_helpers │ │ ├── iterator │ │ ├── iterator.cpp │ │ ├── iterator_base │ │ ├── limits │ │ ├── limits.cpp │ │ ├── list │ │ ├── list.cpp │ │ ├── locale │ │ ├── locale.cpp │ │ ├── map │ │ ├── map.cpp │ │ ├── memory │ │ ├── new │ │ ├── new_handler.cpp │ │ ├── new_op.cpp │ │ ├── new_opnt.cpp │ │ ├── new_opv.cpp │ │ ├── new_opvnt.cpp │ │ ├── nonstd-function.h │ │ ├── numeric │ │ ├── numeric.cpp │ │ ├── ostream │ │ ├── ostream.cpp │ │ ├── ostream_helpers │ │ ├── ostream_helpers.cpp │ │ ├── queue │ │ ├── queue.cpp │ │ ├── serstream │ │ ├── set │ │ ├── set.cpp │ │ ├── sstream │ │ ├── sstream.cpp │ │ ├── stack │ │ ├── stack.cpp │ │ ├── stdexcept │ │ ├── stdexcept.cpp │ │ ├── streambuf │ │ ├── streambuf.cpp │ │ ├── string │ │ ├── string.cpp │ │ ├── string_iostream │ │ ├── string_view │ │ ├── support │ │ ├── support.cpp │ │ ├── system_configuration.h │ │ ├── tuple │ │ ├── type_traits │ │ ├── typeinfo │ │ ├── typeinfo.cpp │ │ ├── unwind-cxx.h │ │ ├── utility │ │ ├── utility.cpp │ │ ├── valarray │ │ ├── valarray.cpp │ │ ├── vector │ │ └── vector.cpp │ └── libuv/ │ ├── LICENSE │ ├── include/ │ │ ├── uv/ │ │ │ ├── aix.h │ │ │ ├── android-ifaddrs.h │ │ │ ├── bsd.h │ │ │ ├── darwin.h │ │ │ ├── errno.h │ │ │ ├── linux.h │ │ │ ├── os390.h │ │ │ ├── posix.h │ │ │ ├── stdint-msvc2008.h │ │ │ ├── sunos.h │ │ │ ├── threadpool.h │ │ │ ├── tree.h │ │ │ ├── unix.h │ │ │ ├── version.h │ │ │ └── win.h │ │ └── uv.h │ └── src/ │ ├── fs-poll.c │ ├── heap-inl.h │ ├── idna.c │ ├── idna.h │ ├── inet.c │ ├── queue.h │ ├── random.c │ ├── strscpy.c │ ├── strscpy.h │ ├── threadpool.c │ ├── timer.c │ ├── unix/ │ │ ├── aix-common.c │ │ ├── aix.c │ │ ├── android-ifaddrs.c │ │ ├── async.c │ │ ├── atomic-ops.h │ │ ├── bsd-ifaddrs.c │ │ ├── bsd-proctitle.c │ │ ├── core.c │ │ ├── cygwin.c │ │ ├── darwin-proctitle.c │ │ ├── darwin-stub.h │ │ ├── darwin.c │ │ ├── dl.c │ │ ├── freebsd.c │ │ ├── fs.c │ │ ├── fsevents.c │ │ ├── getaddrinfo.c │ │ ├── getnameinfo.c │ │ ├── haiku.c │ │ ├── ibmi.c │ │ ├── internal.h │ │ ├── kqueue.c │ │ ├── linux-core.c │ │ ├── linux-inotify.c │ │ ├── linux-syscalls.c │ │ ├── linux-syscalls.h │ │ ├── loop-watcher.c │ │ ├── loop.c │ │ ├── netbsd.c │ │ ├── no-fsevents.c │ │ ├── no-proctitle.c │ │ ├── openbsd.c │ │ ├── os390-syscalls.c │ │ ├── os390-syscalls.h │ │ ├── os390.c │ │ ├── pipe.c │ │ ├── poll.c │ │ ├── posix-hrtime.c │ │ ├── posix-poll.c │ │ ├── process.c │ │ ├── procfs-exepath.c │ │ ├── proctitle.c │ │ ├── pthread-fixes.c │ │ ├── random-devurandom.c │ │ ├── random-getentropy.c │ │ ├── random-getrandom.c │ │ ├── random-sysctl-linux.c │ │ ├── signal.c │ │ ├── spinlock.h │ │ ├── stream.c │ │ ├── sunos.c │ │ ├── sysinfo-loadavg.c │ │ ├── sysinfo-memory.c │ │ ├── tcp.c │ │ ├── thread.c │ │ ├── tty.c │ │ └── udp.c │ ├── uv-common.c │ ├── uv-common.h │ ├── uv-data-getter-setters.c │ ├── version.c │ └── win/ │ ├── async.c │ ├── atomicops-inl.h │ ├── core.c │ ├── detect-wakeup.c │ ├── dl.c │ ├── error.c │ ├── fs-event.c │ ├── fs-fd-hash-inl.h │ ├── fs.c │ ├── getaddrinfo.c │ ├── getnameinfo.c │ ├── handle-inl.h │ ├── handle.c │ ├── internal.h │ ├── loop-watcher.c │ ├── pipe.c │ ├── poll.c │ ├── process-stdio.c │ ├── process.c │ ├── req-inl.h │ ├── signal.c │ ├── snprintf.c │ ├── stream-inl.h │ ├── stream.c │ ├── tcp.c │ ├── thread.c │ ├── tty.c │ ├── udp.c │ ├── util.c │ ├── winapi.c │ ├── winapi.h │ ├── winsock.c │ └── winsock.h ├── lib/ │ ├── check/ │ │ ├── isAssignment.js │ │ ├── isBoolean.js │ │ ├── isDelimiter.js │ │ ├── isIncrement.js │ │ ├── isInitOperator.js │ │ ├── isKeyword.js │ │ ├── isNative.js │ │ ├── isNumber.js │ │ ├── isObjectOperator.js │ │ ├── isOperator.js │ │ ├── isRegExp.js │ │ ├── isSemi.js │ │ ├── isString.js │ │ ├── isUnary.js │ │ └── isVariable.js │ ├── env.js │ ├── include.js │ ├── package.js │ ├── parser.js │ ├── require.js │ └── verify.js ├── nerd.js ├── nerd_modules/ │ ├── JSON/ │ │ ├── index.ng │ │ ├── lib/ │ │ │ ├── jsmn.h │ │ │ └── json.h │ │ └── package.json │ ├── Module/ │ │ └── index.ng │ ├── RegExp/ │ │ └── index.ng │ ├── String/ │ │ └── index.ng │ ├── arduino/ │ │ └── index.ng │ ├── arduino-lcd/ │ │ ├── index.ng │ │ ├── lib/ │ │ │ ├── LiquidCrystal.cpp │ │ │ └── LiquidCrystal.h │ │ └── package.json │ ├── child_process/ │ │ ├── index.ng │ │ └── package.json │ ├── console/ │ │ └── index.ng │ ├── date/ │ │ └── index.ng │ ├── error/ │ │ └── index.ng │ ├── fs/ │ │ ├── index.ng │ │ └── package.json │ ├── http/ │ │ ├── httpStruct.h │ │ ├── httplib/ │ │ │ ├── uSockets/ │ │ │ │ ├── LICENSE │ │ │ │ ├── bsd.c │ │ │ │ ├── context.c │ │ │ │ ├── crypto/ │ │ │ │ │ ├── openssl.c │ │ │ │ │ ├── sni_tree.cpp │ │ │ │ │ └── wolfssl.c │ │ │ │ ├── eventing/ │ │ │ │ │ ├── epoll_kqueue.c │ │ │ │ │ ├── gcd.c │ │ │ │ │ └── libuv.c │ │ │ │ ├── internal/ │ │ │ │ │ ├── eventing/ │ │ │ │ │ │ ├── epoll_kqueue.h │ │ │ │ │ │ ├── gcd.h │ │ │ │ │ │ └── libuv.h │ │ │ │ │ ├── internal.h │ │ │ │ │ ├── loop_data.h │ │ │ │ │ └── networking/ │ │ │ │ │ └── bsd.h │ │ │ │ ├── libusockets.h │ │ │ │ ├── loop.c │ │ │ │ └── socket.c │ │ │ └── uWS/ │ │ │ ├── App.h │ │ │ ├── AsyncSocket.h │ │ │ ├── AsyncSocketData.h │ │ │ ├── BloomFilter.h │ │ │ ├── HttpContext.h │ │ │ ├── HttpContextData.h │ │ │ ├── HttpParser.h │ │ │ ├── HttpResponse.h │ │ │ ├── HttpResponseData.h │ │ │ ├── HttpRouter.h │ │ │ ├── LICENSE │ │ │ ├── Loop.h │ │ │ ├── LoopData.h │ │ │ ├── MessageParser.h │ │ │ ├── MoveOnlyFunction.h │ │ │ ├── Multipart.h │ │ │ ├── PerMessageDeflate.h │ │ │ ├── ProxyParser.h │ │ │ ├── QueryParser.h │ │ │ ├── TopicTree.h │ │ │ ├── Utilities.h │ │ │ ├── WebSocket.h │ │ │ ├── WebSocketContext.h │ │ │ ├── WebSocketContextData.h │ │ │ ├── WebSocketData.h │ │ │ ├── WebSocketExtensions.h │ │ │ ├── WebSocketHandshake.h │ │ │ └── WebSocketProtocol.h │ │ ├── index.ng │ │ └── package.json │ ├── math/ │ │ └── index.ng │ ├── object/ │ │ └── index.ng │ ├── os/ │ │ └── index.ng │ ├── path/ │ │ └── index.ng │ ├── process/ │ │ └── index.ng │ ├── querystring/ │ │ └── index.ng │ ├── thread/ │ │ └── index.ng │ └── wasm/ │ ├── index.ng │ ├── lib/ │ │ └── wasm.hpp │ └── package.json ├── package.json ├── self/ │ ├── base/ │ │ ├── cli/ │ │ │ └── cliParser.js │ │ ├── compiler/ │ │ │ └── target.js │ │ └── util/ │ │ ├── copyDirSync.js │ │ ├── copyRecursive.js │ │ ├── flash.js │ │ ├── getExt.js │ │ ├── getTips.js │ │ └── rmdir.js │ ├── compiler/ │ │ ├── native/ │ │ │ ├── compiler.js │ │ │ ├── env/ │ │ │ │ ├── arduino.js │ │ │ │ ├── js.js │ │ │ │ ├── std.js │ │ │ │ └── wasm.js │ │ │ ├── nerdcore/ │ │ │ │ ├── src/ │ │ │ │ │ ├── class/ │ │ │ │ │ │ ├── _meta.h │ │ │ │ │ │ ├── array.h │ │ │ │ │ │ ├── array_header.h │ │ │ │ │ │ ├── base_header.h │ │ │ │ │ │ ├── fixed_array.h │ │ │ │ │ │ ├── fixed_array_header.h │ │ │ │ │ │ ├── function.h │ │ │ │ │ │ ├── function_header.h │ │ │ │ │ │ ├── native.h │ │ │ │ │ │ ├── native_header.h │ │ │ │ │ │ ├── native_tpl_header.h │ │ │ │ │ │ ├── number.h │ │ │ │ │ │ ├── number_header.h │ │ │ │ │ │ ├── object.h │ │ │ │ │ │ ├── object_header.h │ │ │ │ │ │ ├── string.h │ │ │ │ │ │ ├── string_header.h │ │ │ │ │ │ ├── struct.h │ │ │ │ │ │ └── struct_header.h │ │ │ │ │ ├── classes.h │ │ │ │ │ ├── classes_header.h │ │ │ │ │ ├── enum.h │ │ │ │ │ ├── functions.h │ │ │ │ │ ├── functions_header.h │ │ │ │ │ ├── macro.h │ │ │ │ │ ├── native/ │ │ │ │ │ │ ├── double.h │ │ │ │ │ │ ├── double_header.h │ │ │ │ │ │ ├── int.h │ │ │ │ │ │ └── int_header.h │ │ │ │ │ ├── native.h │ │ │ │ │ ├── native_header.h │ │ │ │ │ ├── nerd.cpp │ │ │ │ │ ├── nerd.hpp │ │ │ │ │ ├── objmgmt.h │ │ │ │ │ ├── objmgmt_header.h │ │ │ │ │ ├── operator.h │ │ │ │ │ ├── operator_header.h │ │ │ │ │ ├── stdfn.h │ │ │ │ │ ├── stdfn_header.h │ │ │ │ │ ├── tsl/ │ │ │ │ │ │ ├── robin_growth_policy.h │ │ │ │ │ │ ├── robin_hash.h │ │ │ │ │ │ ├── robin_map.h │ │ │ │ │ │ └── robin_set.h │ │ │ │ │ ├── type_header.h │ │ │ │ │ ├── values.h │ │ │ │ │ ├── values_header.h │ │ │ │ │ ├── var.h │ │ │ │ │ └── var_header.h │ │ │ │ └── test/ │ │ │ │ ├── array.cpp │ │ │ │ ├── cast.cpp │ │ │ │ ├── native.cpp │ │ │ │ ├── object.cpp │ │ │ │ └── operators.cpp │ │ │ └── squel/ │ │ │ ├── arduino.cpp │ │ │ ├── js.cpp │ │ │ ├── std.cpp │ │ │ └── wasm.cpp │ │ └── self/ │ │ ├── base/ │ │ │ ├── cli/ │ │ │ │ └── cliParser.ng │ │ │ ├── compiler/ │ │ │ │ └── target.js │ │ │ └── util/ │ │ │ ├── copyDirSync.js │ │ │ ├── copyRecursive.js │ │ │ ├── flash.js │ │ │ ├── getExt.js │ │ │ ├── getTips.js │ │ │ ├── httpUtils.js │ │ │ └── rmdir.js │ │ └── nerd.ng │ ├── lib/ │ │ ├── check/ │ │ │ ├── isAssignment.js │ │ │ ├── isBoolean.js │ │ │ ├── isDelimiter.js │ │ │ ├── isIncrement.js │ │ │ ├── isInitOperator.js │ │ │ ├── isKeyword.js │ │ │ ├── isNative.js │ │ │ ├── isNumber.js │ │ │ ├── isObjectOperator.js │ │ │ ├── isOperator.js │ │ │ ├── isSemi.js │ │ │ ├── isString.js │ │ │ ├── isUnary.js │ │ │ └── isVariable.js │ │ ├── env.js │ │ ├── include.js │ │ ├── package.js │ │ ├── parser.js │ │ ├── require.js │ │ └── verify.js │ ├── nerd.js │ └── package.json └── test/ ├── accessor.ng ├── builtin.ng ├── comments.ng ├── conditionals.ng ├── function.ng ├── loop.ng ├── native.ng └── var.ng ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ .nerd ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================

No VM. No Bytecode. No packaging. No Garbage Collector. Fully compiled to native binaries.

# NectarJS becomes Nerd Compile JavaScript and NerdLang in native binaries. # What is NerdLang NerdLang is a substract of JS with some additions, focus on efficiency. **Nerd** is a **JavaScript native compiler** aiming to make JavaScript universal, Nerd is able to compile native apps for Windows, Mac, Linux, iOS, Android, Raspberry, STM32 and more. > **Nerd** is in active development, join us on [Discord](https://discord.gg/cpe2UuN) if you need more information. - [Roadmap on Trello](https://trello.com/invite/b/6F4rvEj2/ATTI8842296bacc92724fa8b4114fe1dc80aA9FA431B/nerd) ## Main objectives * Supporting EcmaScript 3 standard (then 5, 6 ...) * Supporting NodeJS and NPM ecosystem * Supporting a maximum of platforms (Windows, Mac, Linux, Android, Arduino, ...) * Being secure * Embeding debuging tools * Compile everything that can be transpiled in JS: Ruby (Opal), Python (Transcript, Brython, JavaScrypthon), TypeScript ... # Get started ## Installation ### Install GCC/CLang for your platform - Windows Install Mingw and Clang for Windows here: http://winlibs.com/ or Clang here: https://releases.llvm.org/ You can also install Linux for Windows and use a linux system on Windows You need MinGW with POSIX threads - Linux / FreeBSD Install it with your distro (apt install gcc, yum install gcc, ...). You can use GCC, CLANG, as well as any derivative of those compilers (arm-gcc ...) - Apple iOS Install xCode and you are ready. You can check your installation with `npm start njs_test` ## Usage Simplest way to use Nerd: ``` nerd file.js / file.ng ``` The output file name will be automatically chosen regarding the target. You can specify another output with `-o something.out` You can select a preset ``` nerd file.js --preset [none|speed|size] ``` You can also run the compiled executable just after compilation using --run: ``` nerd file.js --run ``` You can enable the quiet mode with --quiet: ``` nerd file.js --quiet ``` Changing the stack size (useful on Windows): ``` nerd --stack 10000000 flood.js ``` For more informations about compilation output, use `--verbose` For help, use `--help` # Benchmarks * _Need update_ Compiled with GCC v10.2.0 on Windows | | NodeJS v12.8.1 | QuickJS 2020-07-05 | Nerd v0.6.104 | |-----------|----------------|--------------------|-------------------| | sort(1e6) [No preset] | | - Time: | 0.33s | - | **0.33s** | | - Memory: | 7.0Mb | - | **1.0Mb** | |- Filesize:| 28.6Mb | - | **424Kb** | | sort(1e6) [+Size preset] | |- Filesize:| 28.6Mb | - | **260Kb** | | sort(1e6) [+Speed preset] | | - Time: | 0.33s | - | **0.20s** | | matrix(256) [No preset] | | - Time: | 0.33s | - | **0.21s** | | - Memory: | 7.0Mb | - | **1.0Mb** | |- Filesize:| 28.6Mb | - | **405Kb** | | matrix(256) [+Size preset] | |- Filesize:| 28.6Mb | - | **251Kb** | | matrix(1e6) [+Speed preset] | | - Time: | 0.33s | - | **0.11s** | * _Some code can be evaluated compile-time_ # Supported platforms Actively tested for - Windows * - win-x86-32 * - win-x86-64 - Linux * - linux-x86-32 * - linux-x86-64 * - linux-arm32v7 - Arduino * - arduino-nano * - arduino-uno * - arduino-mega1280 * - arduino-mega2560 - STM32 Nucleo * - nucleo-l152re * - nucleo-l432kc * - nucleo-f446re - Mobile * - android - Web * - wasm * - wast * - asm-js - macOS - Sun OS # Development This project is in heavy development and a lot features are not implemented yet. ## ECMAScript Support Nerd already supports more than 80% of ES3.
Prototype
* .call() * .bind()
Array
* .length * .push(value)
Class
* constructor * methods * static methods
Console
* .log(variadic)
JSON
* .parse(str) * .stringify(obj)
Math **(DONE)**
* [All static methods and constants]
Object
* .keys
performance
* timeOrigin * .now()
String
* .length * .toString() * .indexOf(needle) * .lastIndexOf(needle) * .search(needle) * .slice(start, end) * .substring(start, end) * .substr(start, end) * .replace(needle, str)
Syntax
* for * while / do while * if / else if / else * try / catch / finally * function / lambda * class * new * typeof * instanceof * undefined * null * Infinite * NaN / isNaN * true / false
================================================ FILE: base/cli/cliParser.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var parseCLI = function(args) { var result = {error: false, msg: "", cli:{}, stack: [], useless: []}; var useless = [0]; if(!global["__NERD__"]) { useless.push(1); } var withArgs = ["--target", "--spec", "--env", "--stack", "-o", "--preset", "--flash", "--compiler", "-c", "--build", "-b", "--option", "--register", "-r", "--setauthor", "--setid", "--setkey", "--setapi", "--setport", "--sethash", "--setsdk", "--setndk", "--setwin_inc_ucrt", "--setwin_lib_ucrt", "--setwin_lib_um", "--setxcode"]; var noArgs = ["--install_external", "--debug", "--conserve", "--generate", "--config", "--reinit", "--example", "--examples" , "--prepare", "--project", "--run", "--clean", "--purge", "--check", "--no-check", "--verbose", "-v", "--tips", "--version", "--help", "-h", "--release", "--no-object-hashmap"]; for(var i = 0; i < args.length; i++) { if( useless.indexOf(i) > -1 ) { result.useless.push(args[i]); } else if( withArgs.indexOf(args[i]) > -1) { if(args[i+1]) { result.cli[args[i]] = { state: true, argument: args[i+1], }; i++; } else { result.error = true; result.msg = "[!] Missing argument for " + args[i]; break; } } else if(noArgs.indexOf(args[i]) > -1) { result.cli[args[i]] = { state: true, }; } else if(args[i].length > 0 && args[i][0] == "-") { if(withArgs.indexOf(args[i]) < 0 && noArgs.indexOf(args[i]) < 0) { result.error = true; result.msg = "[!] Unknown parameter : " + args[i]; break; } } else { result.stack.push(args[i]); } } return result; } module.exports = parseCLI; ================================================ FILE: base/compiler/target.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var target = ["win-x86-32", "win-x86-64", "linux-x86-32", "linux-x86-64", "linux-arm32v7", "arduino-uno", "arduino-mega1280", "arduino-mega2560", "wasm", "wast", "asm-js", "mac-osx", "nucleo-l152re", "nucleo-l432kc" ]; module.exports = target; ================================================ FILE: base/util/copyDirSync.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var fs = require("fs"); var path = require("path"); var copyDirSync = function( source, target ) { var targetFile = target; if ( fs.existsSync( target ) ) { if ( fs.lstatSync( target ).isDirectory() ) { targetFile = path.join( target, path.basename( source ) ); } } fs.copyFileSync(source, targetFile); } var copyFolderRecursiveSync = function( source, target, _root ) { var files = []; var targetFolder = path.join( target, path.basename( source ) ); if(_root) { targetFolder = target; } if ( !fs.existsSync( targetFolder ) ) { fs.mkdirSync( targetFolder ); } if ( fs.lstatSync( source ).isDirectory() ) { files = fs.readdirSync( source ); for(var i = 0; i < files.length; i++) { var curSource = path.join( source, files[i] ); if ( fs.lstatSync( curSource ).isDirectory() ) { copyFolderRecursiveSync( curSource, targetFolder ); } else { copyDirSync( curSource, targetFolder ); } } } } module.exports = copyFolderRecursiveSync; ================================================ FILE: base/util/copyRecursive.js ================================================ var fs = require("fs"); var path = require("path"); var copyRecursiveSync = function(src, dest) { if(!fs.existsSync(src)) { console.log("[!] Warning: " + src + " doesn't exist"); return; } if(fs.lstatSync( src ).isDirectory()) { var _newDest = path.dirname(dest); global.copyDirSync(src, _newDest, true); } else { var _path = []; var _newDest = path.dirname(dest); _path.push(_newDest); while(path.dirname(_newDest) != _newDest) { _newDest = path.dirname(_newDest); if(_newDest.indexOf(global.NERD_PATH) == 0) { _path.push(_newDest); } } for(var i = _path.length; i > -1; i--) { try { fs.mkdirSync(_path[i]); } catch(e){} } fs.copyFileSync(src, dest); } }; module.exports = copyRecursiveSync; ================================================ FILE: base/util/flash.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var fs = require("fs"); var path = require("path"); var execFlashArduino = function(from, to, model, driver, bauds, verb) { var spawn = require("child_process").spawn; var _flash = spawn("avrdude", ["-p", model, "-c", driver, "-P", to, "-b", bauds, "-F", "-U", "flash:w:"+from]); _flash.stdout.on("data", function(data) { if(verb) process.stdout.write(data.toString()); }); _flash.stderr.on("data", function(data) { if(verb) process.stdout.write(data.toString()); }); _flash.on("error", function(err) { console.log("[!] Error :"); console.log(err); }); _flash.on("close", function(code) { console.log("[+] Flashed"); }); } var execFlashSTM32 = function(from, to) { try { fs.writeFileSync(path.join(to, from), fs.readFileSync(from)); console.log("[+ Flashed]"); } catch(e) { console.log("[!] Your file is compiled, but an error occured while flashing, please try again."); } } var Flash = function(from, to, target, verb) { switch(target) { case "uno": execFlashArduino(from, to, "ATMEGA328P", "arduino", "19200", verb); break; case "mega1280": execFlashArduino(from, to, "m1280", "arduino", "57600", verb); break; case "mega2560": execFlashArduino(from, to, "m2560", "wiring", "115200", verb); break; case "nucleo-l152re": case "nucleo-l432kc": execFlashSTM32(from, to); break; default: console.log("Nothing to do for target : " + target); break; } } module.exports = Flash; ================================================ FILE: base/util/getExt.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var getExt = function(target) { switch(target) { case "wasm": return ".wasm"; break; case "asm-js": return ".asm.js"; break; case "wast": return ".wast"; break; case "win-x86-32": case "win-x86-64": return "-" + target + ".exe"; break; case "nucleo-l432kc": case "nucleo-l152re": case "mac-osx": case "linux-x86-32": case "linux-x86-64": case "linux-arm32v7": return "-" + target + ".bin"; break; case "arduino-uno": return "-" + target + ".hex"; break; case "arduino-mega1280": return "-" + target + ".hex"; break; case "arduino-mega2560": return "-" + target + ".hex"; break; default: return ".bin"; break; } } module.exports = getExt; ================================================ FILE: base/util/getTips.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var getTips = function(target, file) { switch(target) { case "wasm": return ""; break; case "asm-js": return "[*] Tips : run this file with node : 'node " + file + "', or embed it in a .html page with "; break; case "wast": return ""; break; case "win-x86-32": case "win-x86-64": return "[*] Tips : on Linux, you can run this .exe with Wine : 'wine " + file + "'"; break; case "linux-x86-32": case "linux-x86-64": case "linux-arm32v7": return "[*] Tips : on Linux, don't forget to : 'chmod +x " + file + "'."; break; case "arduino-uno": return "[*] Tips : avrdude -p ATMEGA328P -c arduino -P [COMPORT] -b 19200 -F -U flash:w:" + file; break; case "arduino-mega1280": return "[*] Tips : avrdude -p m1280 -c arduino -P [COMPORT] -b 57600 -F -U flash:w:" + file; break; case "arduino-mega2560": return "[*] Tips : avrdude -p m2560 -c wiring -P [COMPORT] -b 115200 -F -U flash:w:" + file; break; case "nucleo-l152re": case "nucleo-l432kc": return "[*] Connect your nucleo on your computer, and symple copy/paste " + file + " on the nucleo drive"; default: return ""; break; } } module.exports = getTips; ================================================ FILE: compiler/native/compiler.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ global.ENV = loadEnv(); function loadEnv() { var _res = {}; var _folder = path.join(__dirname, "/env/"); var _list = fs.readdirSync(_folder); for(var _el in _list) { var _name = _list[_el].substring(0, _list[_el].length-3); var _e = require(path.join(_folder, _list[_el])); _res[_name] = _e; } return _res; } function Compiler() { var _handler = this; this.MAIN_PATH = __dirname; this.TARGET = "standard"; this.SPEC; this.EXPOSE = ""; this.STD = ""; this.GEN = ""; this.PATH = ""; this.LIBS = ""; this.STATE = ""; this.PACK = []; this.DIR = []; if(CLI.stack[0]) this.PATH = path.dirname(CLI.stack[0]) + path.sep; this.ENV = ENV["std"]; if(CLI.cli["--env"]) { var _env = CLI.cli["--env"].argument; if(ENV[_env]) { this.ENV = ENV[_env]; } else { console.log("[!] ENV: " + _env + " does not exist, please select one of [" + Object.keys(ENV).toString() + "]"); process.exit(1); } } this.COMPILER = this.ENV.compiler; this.PRESET = "none"; this.MAIN = fs.readFileSync(path.join(__dirname, "squel", this.ENV.main)).toString(); this.IN = ""; this.OUT = ""; this.TMP_FOLDER = ""; this.OPTION = ""; this.INIT = ""; this.DECL = ""; this.REQUIRE = ""; this.INCLUDE = ""; this.INFO = { FUNCTION: [], CACHE: {}, VALUE: [], CALL: {}, SCOPE: {}, HOISTING: [], }; if(this.ENV.stdlib) { for(var _s in this.ENV.stdlib) { if(typeof this.ENV.stdlib[_s] == "string") { this.DECL += "var " + this.ENV.stdlib[_s] + ";"; this.STD += this.ENV.stdlib[_s] + " = require(\"" + this.ENV.stdlib[_s] + "\");"; } else if(typeof this.ENV.stdlib[_s] == "object") { this.DECL += "var " + this.ENV.stdlib[_s].bind + ";"; this.STD += this.ENV.stdlib[_s].bind + " = require(\"" + this.ENV.stdlib[_s].module + "\");"; } } } this.CODE = ""; this.FOOTER = ""; /*** METHODS ***/ this.Parse = function(code, _file) { var _env = createEnv(_handler.PATH, _file); code = this.STD + code; parseCode(code, 0, _env); parseAST(_env); var _generated = generateCode(_env); _handler.MAIN = _handler.MAIN.replace("{CODE}", _generated); _handler.MAIN = _handler.MAIN.replace("{INIT}", COMPILER.INIT); _handler.MAIN = _handler.MAIN.replace("{DECL}", COMPILER.DECL); _handler.MAIN = _handler.MAIN.replace("{INCLUDE}", COMPILER.INCLUDE); _handler.MAIN = _handler.MAIN.replace("{{__PLATFORM__}}", os.platform()); } this.Prepare = function(_folder) { if((!CLI.cli["--profile"]) || CLI.cli["--profile"].argument != "use") { copyDirSync(path.join(__dirname, "nerdcore"), _folder, false); } }; this.Out = function(_name) { if(os.platform() == "win32" && path.extname(_name) != ".exe") _handler.OUT = _name + ".exe"; else _handler.OUT = _name; if(COMPILER.ENV.out && typeof COMPILER.ENV.out == "function") { _handler.OUT = COMPILER.ENV.out(_name); } return _handler.OUT; } this.CLI = function(compiler, out, _in, option) { return this.ENV.cli(compiler, this.preset, out, _in, option, this.TARGET, this.SPEC); } this.Compile = function(_folder, _file) { fs.writeFileSync(_file, _handler.MAIN); process.chdir(_folder); var _exec = _handler.CLI(_handler.COMPILER, _handler.OUT, _file, _handler.OPTION); execSync(_exec); } this.Package = function() { if(this.PACK && this.PACK.length) { for(var i = 0; i < this.PACK.length; i++) { copyRecursiveSync(this.PACK[i], this.OUT); } } } /*** END METHODS ***/ } module.exports = new Compiler(); ================================================ FILE: compiler/native/env/arduino.js ================================================ var OPTIONS = { "mega": { preset: "-DF_CPU=16000000UL -mmcu=atmega2560", variant: "mega"}, "mega2560": { preset: "-DF_CPU=16000000UL -mmcu=atmega2560", variant: "mega"}, "mega1280": { preset: "-DF_CPU=16000000UL -mmcu=atmega1280", variant: "mega"}, "mega328p": { preset: "-DF_CPU=16000000UL -mmcu=atmega328p", variant: "standard"}, "uno": { preset: "-DF_CPU=16000000UL -mmcu=atmega328p", variant: "standard"}, "nano": { preset: "-DF_CPU=16000000UL -mmcu=atmega328p", variant: "standard"}, "nano2": { preset: "-DF_CPU=16000000UL -mmcu=atmega168", variant: "standard"}, "nano3": { preset: "-DF_CPU=16000000UL -mmcu=atmega328p", variant: "standard"} } function getOptions() { var OPT = { elf: false, cli: false, }; if(CLI.cli["--option"] && CLI.cli["--option"].argument) { var _args = CLI.cli["--option"].argument.split(","); for(var i = 0; i < _args.length; i++) { OPT[_args[i]] = true; } } return OPT; } var ARDUINO = { name: "arduino", main: "arduino.cpp", cli: function(compiler, preset, out, _in, option, target, spec) { var OPT = getOptions(); var _cliOption = ""; if(CLI.cli["--option"]) _cliOption = CLI.cli["--option"].argument; if(!target || !OPTIONS[target]) { console.log("[!] No target or bad target selected, switching to 'uno'"); target = "uno"; } var _cli = `${compiler} ${OPTIONS[target].preset} -D__NERD__OBJECT_VECTOR -DARDUINO_ARCH_AVR -w -Os -fno-exceptions -fno-rtti -fno-stack-protector -fomit-frame-pointer -ffunction-sections -fdata-sections -Wl,--gc-sections \ -I ${extern}/arduino/avr -I ${extern}/arduino/avr/variants/${OPTIONS[target].variant}/ -I ${extern}/arduino/avr/cores/arduino -I ${extern}/arduino/stlarduino ${extern}/arduino/stlarduino/ios.cpp ${extern}/arduino/avr/cores/arduino/abi.cpp ${extern}/arduino/stlarduino/new*.cpp ${extern}/arduino/stlarduino/char_traits.cpp ${extern}/arduino/stlarduino/del*.cpp ${extern}/arduino/stlarduino/stdexcept.cpp ${extern}/arduino/stlarduino/func_exception.cpp ${extern}/arduino/stlarduino/ostream_helpers.cpp -fno-threadsafe-statics -lm ${COMPILER.LIBS} -o ${out} ${_in} ${_cliOption}`; if(!OPT.elf) _cli += `&& avr-objcopy -O ihex -R .eeprom ${out}`; if(OPT.cli) console.log("[*]" + _cli); return _cli; }, compiler: "avr-g++ -std=c++17", stdlib:[], out: function(_name) { var OPT = getOptions(); if(OPT.elf) _name += ".elf"; else _name += ".hex"; return _name; }, } module.exports = ARDUINO; ================================================ FILE: compiler/native/env/js.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var _debug = " -g "; var JS = { name: "js", main: "js.cpp", compiler: "g++", stdlib: ["console", "JSON", "Module", "process", "RegExp", "Math"], cli: function(compiler, preset, out, _in, option) { var _cachePath = path.join(process.cwd(), "..", "cached_" + COMPILER.ENV.name + "_" + os.platform + "_" + VERSION); var _precompiled = path.join(_cachePath, "nerd.o"); var _stack = 0; if(CLI.cli["--stack"]) { try { _stack = parseInt(CLI.cli["--stack"].argument); } catch(e) { console.log("[!] Error: --stack flags required a number, received -> " + CLI.cli["--stack"].argument); process.exit(1); } } if(!fs.existsSync(_precompiled)) { var _args = " -flto -Ofast "; if(preset == "debug") { console.log("Building core with debug"); _args = _debug; } console.log(`[+] Creating Nerd binary lib for ${COMPILER.ENV.name + "_" + os.platform + "_" + VERSION}`); console.log(`${compiler} -std=c++17 ${_args} -c nerdcore/src/nerd.cpp -o "${_precompiled}"`); try { fs.mkdirSync(_cachePath); } catch(e){}; execSync(`${compiler} -std=c++17 ${_args} -c nerdcore/src/nerd.cpp -o "${_precompiled}"`); console.log("[+] Compiling with precompiled Nerd lib"); } if(compiler == "cl" || compiler.indexOf("cl ") == 0) { console.log("[!] cl is not supported, please use g++, clang++, em++ or avr-g++"); process.exit(1); } var _hashmap = ""; if(CLI.cli['--no-object-hashmap']) _hashmap = "-D__NERD__OBJECT_VECTOR"; if(_stack) _stack = "-Wl,--stack," + _stack; else _stack = ""; var _sysVNetLibs = ""; if(os.platform() == "sunos") _sysVNetLibs = "-lsocket -lnsl"; var _cliOption = ""; if(CLI.cli["--option"]) _cliOption = CLI.cli["--option"].argument; if(CLI.cli["--profile"]) { if(!CLI.cli["--conserve"]) CLI.cli["--conserve"] = true; if(CLI.cli["--profile"].argument == "gen") { _cliOption += " -fprofile-generate"; console.log("[*] Profiling data will be stored in: " + COMPILER.TMP_FOLDER); } else if(CLI.cli["--profile"].argument == "use") { _cliOption += " -fprofile-use"; console.log("[*] Using profile data from: " + COMPILER.TMP_FOLDER); } else { console.log("[!] Please use --profile with gen or use"); } } var _files = `"${_precompiled}" "${_in}"`; if(os.platform == "win32") _files = `"${_in}" "${_precompiled}"`; if(preset == "none") { return `${compiler} ${_stack} -std=c++17 ${_files} -g -s ${COMPILER.LIBS} -pthread -o "${out}" ${_sysVNetLibs} ${_cliOption}`; } else if(preset == "debug") { console.log(`${compiler} ${_stack} -std=c++17 ${_files} ${_debug} -s ${COMPILER.LIBS} -pthread -o "${out}" ${_sysVNetLibs} ${_cliOption}`); return `${compiler} ${_stack} -std=c++17 ${_files} ${_debug} -s ${COMPILER.LIBS} -pthread -o "${out}" ${_sysVNetLibs} ${_cliOption}`; } else if(preset == "size") { return `${compiler} ${_stack} -std=c++17 ${_files} -pthread -Os -fno-rtti -fno-stack-protector -fomit-frame-pointer -s ${COMPILER.LIBS} -o "${out}" ${_sysVNetLibs} ${_cliOption}`; } else { var _opt = "-O"; if(os.platform() == "darwin" || compiler.indexOf("clang") > -1) _opt += "3"; else _opt += "fast"; _opt += " -flto"; return `${compiler} ${_stack} -std=c++17 ${_files} ${_opt} -pthread -s ${COMPILER.LIBS} -o "${out}" ${_sysVNetLibs} ${_cliOption}`; } }, write: function(_content, _in) { if(CLI.cli["--profile"] && CLI.cli["--profile"].argument == "use") { return; } fs.writeFileSync(_in, _content); } } module.exports = JS; ================================================ FILE: compiler/native/env/std.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var _debug = " -g "; var STD = { name: "std", main: "std.cpp", compiler: "g++", stdlib: [], cli: function(compiler, preset, out, _in, option) { var _cachePath = path.join(process.cwd(), "..", "cached_" + COMPILER.ENV.name + "_" + os.platform + "_" + VERSION); var _precompiled = path.join(_cachePath, "nerd.o"); var _stack = 0; if(CLI.cli["--stack"]) { try { _stack = parseInt(CLI.cli["--stack"].argument); } catch(e) { console.log("[!] Error: --stack flags required a number, received -> " + CLI.cli["--stack"].argument); process.exit(1); } } if(!fs.existsSync(_precompiled)) { var _args = " -flto -Ofast "; if(preset == "debug") { console.log("Building core with debug"); _args = _debug; } console.log(`[+] Creating Nerd binary lib for ${COMPILER.ENV.name + "_" + os.platform + "_" + VERSION}`); console.log(`${compiler} -std=c++17 ${_args} -c nerdcore/src/nerd.cpp -o "${_precompiled}"`); try { fs.mkdirSync(_cachePath); } catch(e){}; execSync(`${compiler} -std=c++17 ${_args} -c nerdcore/src/nerd.cpp -o "${_precompiled}"`); console.log("[+] Compiling with precompiled Nerd lib"); } if(compiler == "cl" || compiler.indexOf("cl ") == 0) { console.log("[!] cl is not supported, please use g++, clang++, em++ or avr-g++"); process.exit(1); } var _hashmap = ""; if(CLI.cli['--no-object-hashmap']) _hashmap = "-D__NERD__OBJECT_VECTOR"; if(_stack) _stack = "-Wl,--stack," + _stack; else _stack = ""; var _sysVNetLibs = ""; if(os.platform() == "sunos") _sysVNetLibs = "-lsocket -lnsl"; var _cliOption = ""; if(CLI.cli["--option"]) _cliOption = CLI.cli["--option"].argument; if(CLI.cli["--profile"]) { if(!CLI.cli["--conserve"]) CLI.cli["--conserve"] = true; if(CLI.cli["--profile"].argument == "gen") { _cliOption += " -fprofile-generate"; console.log("[*] Profiling data will be stored in: " + COMPILER.TMP_FOLDER); } else if(CLI.cli["--profile"].argument == "use") { _cliOption += " -fprofile-use"; console.log("[*] Using profile data from: " + COMPILER.TMP_FOLDER); } else { console.log("[!] Please use --profile with gen or use"); } } var _files = `"${_precompiled}" "${_in}"`; if(os.platform == "win32") _files = `"${_in}" "${_precompiled}"`; if(preset == "none") { return `${compiler} ${_stack} -std=c++17 ${_files} -g -s ${COMPILER.LIBS} -pthread -o "${out}" ${_sysVNetLibs} ${_cliOption}`; } else if(preset == "debug") { console.log(`${compiler} ${_stack} -std=c++17 ${_files} ${_debug} -s ${COMPILER.LIBS} -pthread -o "${out}" ${_sysVNetLibs} ${_cliOption}`); return `${compiler} ${_stack} -std=c++17 ${_files} ${_debug} -s ${COMPILER.LIBS} -pthread -o "${out}" ${_sysVNetLibs} ${_cliOption}`; } else if(preset == "size") { return `${compiler} ${_stack} -std=c++17 ${_files} -pthread -Os -fno-rtti -fno-stack-protector -fomit-frame-pointer -s ${COMPILER.LIBS} -o "${out}" ${_sysVNetLibs} ${_cliOption}`; } else { var _opt = "-O"; if(os.platform() == "darwin" || compiler.indexOf("clang") > -1) _opt += "3"; else _opt += "fast"; _opt += " -flto"; return `${compiler} ${_stack} -std=c++17 ${_files} ${_opt} -pthread -s ${COMPILER.LIBS} -o "${out}" ${_sysVNetLibs} ${_cliOption}`; } }, write: function(_content, _in) { if(CLI.cli["--profile"] && CLI.cli["--profile"].argument == "use") { return; } fs.writeFileSync(_in, _content); } } module.exports = STD; ================================================ FILE: compiler/native/env/wasm.js ================================================ var WASM = { name: "wasm", main: "wasm.cpp", compiler: "em++", out: function(_name) { if(CLI.cli["--target"]) { if(CLI.cli["--target"].argument == "js") return _name + ".asm.js"; else if(CLI.cli["--target"].argument == "wasm") return _name + ".wasm"; else if(CLI.cli["--target"].argument == "html") return _name + ".html"; else { console.log("[!] Invalid target, expected js, wasm, html"); process.exit(1); } } return _name + ".wasm"; }, cli: function(compiler, preset, out, _in, option) { /* var _cachePath = path.join(process.cwd(), "..", "cached_" + COMPILER.ENV.name + "_" + VERSION); var _precompiled = path.join(_cachePath, "nerd.o"); if(!fs.existsSync(_precompiled)) { console.log(`[+] Creating Nerd binary lib for ${COMPILER.ENV.name + "_" + VERSION}`); try { fs.mkdirSync(_cachePath); } catch(e){}; execSync(`${compiler} -std=c++17 -c nerd.cpp -O3 -o "${_precompiled}"`); console.log("[+] Compiling with precompiled Nerd lib"); } */ var _cliOption = ""; if(CLI.cli["--option"]) _cliOption = CLI.cli["--option"].argument; if(preset == "none") { return `${compiler} nerdcore/src/nerd.cpp -D__NJS_REGISTER_SIZE=${COMPILER.REGISTER} ${_in} -O1 -w -s TOTAL_MEMORY=33554432 ${COMPILER.LIBS} -o ${out} ${_cliOption}`; } else if(preset == "size") { return `${compiler} nerdcore/src/nerd.cpp -D__NJS_REGISTER_SIZE=${COMPILER.REGISTER} ${_in} -Os -fno-rtti -fno-stack-protector -fomit-frame-pointer -w -s TOTAL_MEMORY=33554432 ${COMPILER.LIBS} -o ${out} ${_cliOption}`; } else { return `${compiler} nerdcore/src/nerd.cpp -D__NJS_REGISTER_SIZE=${COMPILER.REGISTER} ${_in} -O3 -w -s TOTAL_MEMORY=33554432 ${COMPILER.LIBS} -o ${out} ${_cliOption}`; } } } module.exports = WASM; ================================================ FILE: compiler/native/nerdcore/src/class/_meta.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include namespace NerdCore::Class { #ifdef __NERD_ENV_ARDUINO typedef uint16_t count_t; #else typedef int count_t; #endif class InvalidTypeException : public std::exception { }; #ifdef __NERD_ENV_ARDUINO const int SMI_MAX = 32767; const int SMI_MIN = -32768; #else const int SMI_MAX = 1073741823; const int SMI_MIN = -1073741824; #endif } // namespace NerdCore::Class ================================================ FILE: compiler/native/nerdcore/src/class/array.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "array_header.h" #include #include namespace NerdCore::Class { // Constructors Array::Array() { object["__proto__"] = NerdCore::Global::Array["prototype"]; } Array::Array(NerdCore::Type::vector_t vec) { object["__proto__"] = NerdCore::Global::Array["prototype"]; value = vec; } Array::Array(std::initializer_list l) : value(l) { object["__proto__"] = NerdCore::Global::Array["prototype"]; } // Methods inline void Array::Delete() noexcept { if (--counter == 0) { delete this; } } double Array::Size() { return value.size(); } inline void Array::jsDelete(NerdCore::VAR _key) noexcept { if(_key.type == NerdCore::Enum::Type::String) { // TODO: if string is a number, convert to number and erase } else if(_key.type == NerdCore::Enum::Type::Number) { value[(double)_key] = NerdCore::Global::null; } } inline void* Array::Copy() noexcept { counter++; return this; } // Native cast Array::operator bool() const noexcept { return true; } Array::operator double() const noexcept { if (value.size() == 1) { return (double)value[0]; } else { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } } Array::operator int() const noexcept { if (value.size() == 1) { return (int)value[0]; } else { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } } Array::operator long long() const noexcept { if (value.size() == 1) { return (long long)value[0]; } else { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } } Array::operator std::string() const noexcept { auto l = value.size(); if (l == 0) return ""; std::stringstream stream; stream << (std::string)value[0]; for (auto i = 1; i < l; i++) { stream << "," << (std::string)value[i]; } return stream.str(); } NerdCore::VAR &Array::GetSet(std::string key) { #ifndef __NERD__OBJECT_VECTOR // if current object[key] is null, we look for the prototypal chain if(object[key].type == NerdCore::Enum::Type::Null) { NerdCore::VAR __proto = object["__proto__"]; while(__proto.type != NerdCore::Enum::Type::Null) { if(__proto[key].type != NerdCore::Enum::Type::Null) { object[key] = __proto[key]; break; } __proto = __proto["__proto__"]; } } /* if(object[key].type == NerdCore::Enum::Type::Function) { (__NERD_FUNCTION(object[key]))->object["this"] = NerdCore::VAR(this); __NERD_FUNCTION(object[key])->bind = bind; } */ return object[key]; #else for (auto & search : object) { if (key.compare(search.first) == 0) { return search.second; } } object.push_back(NerdCore::Type::pair_t(key, NerdCore::Global::null)); return object[object.size() - 1].second; #endif } // Main operators NerdCore::VAR const Array::operator[](int key) const { if (key >= 0 && key <= value.size()) { return value.at(key); } return NerdCore::Global::null; } NerdCore::VAR &Array::operator[](NerdCore::VAR key) { if (key.type == NerdCore::Enum::Type::Number) { auto i = (int)key; if (i < 0) { return NerdCore::Global::null; } else { if (i >= value.size()) { value.resize(i + 1); } } return value[i]; } else { return GetSet(key); } return NerdCore::Global::null; } NerdCore::VAR &Array::operator[](int key) { if (key < 0) { return NerdCore::Global::null; } else { if (key >= value.size()) { value.resize(key + 1); } } return value[key]; } NerdCore::VAR &Array::operator[](double key) { if (key < 0) { return NerdCore::Global::null; } else { if (key >= value.size()) { value.resize(key + 1); } } return value[key]; } NerdCore::VAR &Array::operator[](const char* key) { return GetSet(key); } // Comparation operators Array Array::operator!() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } // Numeric operators Array Array::operator+() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator-() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator++(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator--(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator+(const Array &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator+=(const Array &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator-(const Array &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator-=(const Array &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator*(const Array &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator*=(const Array &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } // TODO: "**" and "**=" operators Array Array::operator/(const Array &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator/=(const Array &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator%(const Array &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator%=(const Array &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator&(const Array &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator|(const Array &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator^(const Array &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator~() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator>>(const Array &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator<<(const Array &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator&=(const Array &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator|=(const Array &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator^=(const Array &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator>>=(const Array &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator<<=(const Array &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } // TODO: ">>>" and ">>>=" operators } // namespace NerdCore::Class ================================================ FILE: compiler/native/nerdcore/src/class/array_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "_meta.h" namespace NerdCore::Class { class Array : public virtual Base { public: // Constructors Array(); Array(NerdCore::Type::vector_t vec); template Array(Args ... args) { NerdCore::Type::vector_t _vec = {args...}; value = _vec; } Array(std::initializer_list l); // Properties count_t counter = 0; NerdCore::Type::vector_t value; NerdCore::Type::object_t object; NerdCore::VAR length; // Methods double Size(); inline void Delete() noexcept; inline void jsDelete(const NerdCore::VAR _key) noexcept; inline void* Copy() noexcept; // Native cast explicit operator bool() const noexcept; explicit operator double() const noexcept; explicit operator int() const noexcept; explicit operator long long() const noexcept; explicit operator std::string() const noexcept; // Main operators NerdCore::VAR &GetSet(std::string key); NerdCore::VAR const operator[](int key) const; NerdCore::VAR &operator[](NerdCore::VAR key); NerdCore::VAR &operator[](int key); NerdCore::VAR &operator[](double key); NerdCore::VAR &operator[](const char* key); // Comparation operators Array operator!() const; template bool operator==(const t &_v1) const { return false; } // === emulated with __NERD_EQUAL_VALUE_AND_TYPE // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE template bool operator!=(const t &_v1) const { return true; } template bool operator<(const t &_v1) const { return (*this)[0] < _v1;} template bool operator<=(const t &_v1) const { return (*this)[0] <= _v1; } template bool operator>(const t &_v1) const { return (*this)[0] > _v1; } template bool operator>=(const t &_v1) const { return (*this)[0] >= _v1; } // Numeric operators Array operator+() const; Array operator-() const; Array operator++(const int _v1); Array operator--(const int _v1); Array operator+(const Array &_v1) const; Array operator+=(const Array &_v1); Array operator-(const Array &_v1) const; Array operator-=(const Array &_v1); Array operator*(const Array &_v1) const; Array operator*=(const Array &_v1); // TODO: "**" and "**=" operators Array operator/(const Array &_v1) const; Array operator/=(const Array &_v1); Array operator%(const Array &_v1) const; Array operator%=(const Array &_v1); Array operator&(const Array &_v1) const; Array operator|(const Array &_v1) const; Array operator^(const Array &_v1) const; Array operator~() const; Array operator>>(const Array &_v1) const; Array operator<<(const Array &_v1) const; Array operator&=(const Array &_v1); Array operator|=(const Array &_v1); Array operator^=(const Array &_v1); Array operator>>=(const Array &_v1); Array operator<<=(const Array &_v1); // TODO: ">>>" and ">>>=" operators NerdCore::VAR __iterator(NerdCore::VAR* args, int _length) const; NerdCore::VAR __unscopables(NerdCore::VAR* args, int _length) const; NerdCore::VAR concat(NerdCore::VAR* args, int _length) const; NerdCore::VAR copyWithin(NerdCore::VAR* args, int _length); NerdCore::VAR entries(NerdCore::VAR* args, int _length) const; NerdCore::VAR every(NerdCore::VAR* args, int _length) const; NerdCore::VAR fill(NerdCore::VAR* args, int _length) const; NerdCore::VAR filter(NerdCore::VAR* args, int _length) const; NerdCore::VAR find(NerdCore::VAR* args, int _length) const; NerdCore::VAR findIndex(NerdCore::VAR* args, int _length) const; NerdCore::VAR flat(NerdCore::VAR* args, int _length) const; NerdCore::VAR flatMap(NerdCore::VAR* args, int _length) const; NerdCore::VAR forEach(NerdCore::VAR* args, int _length) const; NerdCore::VAR includes(NerdCore::VAR* args, int _length) const; NerdCore::VAR indexOf(NerdCore::VAR* args, int _length) const; NerdCore::VAR join(NerdCore::VAR* args, int _length) const; NerdCore::VAR keys(NerdCore::VAR* args, int _length) const; NerdCore::VAR lastIndexOf(NerdCore::VAR* args, int _length) const; NerdCore::VAR map(NerdCore::VAR* args, int _length) const; NerdCore::VAR pop(NerdCore::VAR* args, int _length); NerdCore::VAR push(NerdCore::VAR* args, int _length); NerdCore::VAR reduce(NerdCore::VAR* args, int _length) const; NerdCore::VAR reduceRight(NerdCore::VAR* args, int _length) const; NerdCore::VAR reverse(NerdCore::VAR* args, int _length); NerdCore::VAR shift(NerdCore::VAR* args, int _length); NerdCore::VAR slice(NerdCore::VAR* args, int _length) const; NerdCore::VAR some(NerdCore::VAR* args, int _length) const; NerdCore::VAR sort(NerdCore::VAR* args, int _length) const; NerdCore::VAR splice(NerdCore::VAR* args, int _length); NerdCore::VAR toLocaleString(NerdCore::VAR* args, int _length) const; NerdCore::VAR toString(NerdCore::VAR* args, int _length) const; NerdCore::VAR unshift(NerdCore::VAR* args, int _length); NerdCore::VAR values(NerdCore::VAR* args, int _length) const; }; } // namespace NerdCore::Class ================================================ FILE: compiler/native/nerdcore/src/class/base_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "_meta.h" namespace NerdCore::Class { class Base { public: #ifdef __NERD_ENV_ESP32 virtual ~Base() { } #endif virtual void Delete() noexcept{}; virtual void* Copy() noexcept{ return nullptr; }; virtual explicit operator bool() const noexcept{ return true;}; virtual explicit operator std::string() const noexcept{ return "";}; virtual explicit operator int() const noexcept {return 0;}; virtual explicit operator double() const noexcept {return 0.0;}; virtual explicit operator long long() const noexcept {return 0;}; virtual NerdCore::VAR &operator[](NerdCore::VAR key){ return NerdCore::Global::null; }; virtual NerdCore::VAR &operator[](int key){ return NerdCore::Global::null; }; virtual NerdCore::VAR &operator[](double key){ return NerdCore::Global::null; }; virtual NerdCore::VAR &operator[](const char* key){ return NerdCore::Global::null; }; }; } ================================================ FILE: compiler/native/nerdcore/src/class/fixed_array.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "array_header.h" #include #include namespace NerdCore::Class { // Constructors FixedArray::FixedArray() { length = 8; value = new NerdCore::VAR[8]; } FixedArray::FixedArray(NerdCore::VAR _length) { length = _length; value = new NerdCore::VAR[(int)_length]; } FixedArray::FixedArray(int _length) { length = _length; value = new NerdCore::VAR[_length]; } FixedArray::FixedArray(NerdCore::VAR* _var, int _length) { length = _length; value = new NerdCore::VAR[_length]; for(int i = 0; i < _length; i++) { value[i] = _var[i]; } } // Methods inline void FixedArray::Delete() noexcept { if (--counter == 0) { delete[] value; delete this; } } inline void* FixedArray::Copy() noexcept { counter++; return this; } // Native cast FixedArray::operator bool() const noexcept { return true; } FixedArray::operator double() const noexcept { if ((int)length == 1) { return (double)value[0]; } else { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } } FixedArray::operator int() const noexcept { if ((int)length == 1) { return (int)value[0]; } else { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } } FixedArray::operator long long() const noexcept { if ((int)length == 1) { return (long long)value[0]; } else { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } } FixedArray::operator std::string() const noexcept { auto l = (int)length; std::stringstream stream; stream << (std::string)value[0]; for (auto i = 1; i < l; i++) { stream << "," << (std::string)value[i]; } return stream.str(); } // Main operators NerdCore::VAR const FixedArray::operator[](NerdCore::VAR key) const { if (key.type == NerdCore::Enum::Type::Number) { auto i = (int)key; if (i >= 0 && i <= (int)length) { return value[i]; } } return NerdCore::Global::null; } NerdCore::VAR const FixedArray::operator[](int key) const { if (key >= 0 && key <= (int)length) { return value[key]; } return NerdCore::Global::null; } NerdCore::VAR &FixedArray::operator[](NerdCore::VAR key) { if (key.type == NerdCore::Enum::Type::Number) { auto i = (int)key; if (i < 0) { return NerdCore::Global::null; } else { if (i >= (int)length) { return NerdCore::Global::null; } } return value[i]; } return NerdCore::Global::null; } NerdCore::VAR &FixedArray::operator[](int key) { if (key < 0) { return NerdCore::Global::null; } else { if (key >= (int)length) { return NerdCore::Global::null; } } return value[key]; } NerdCore::VAR &FixedArray::operator[](double key) { if (key < 0) { return NerdCore::Global::null; } else { if (key >= (int)length) { return NerdCore::Global::null; } } return value[(int)key]; } NerdCore::VAR &FixedArray::operator[](const char* key) { return NerdCore::Global::null; } // Comparation operators FixedArray FixedArray::operator!() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } // Numeric operators FixedArray FixedArray::operator+() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator-() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator++(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator--(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator+(const FixedArray &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator+=(const FixedArray &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator-(const FixedArray &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator-=(const FixedArray &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator*(const FixedArray &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator*=(const FixedArray &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } // TODO: "**" and "**=" operators FixedArray FixedArray::operator/(const FixedArray &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator/=(const FixedArray &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator%(const FixedArray &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator%=(const FixedArray &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator&(const FixedArray &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator|(const FixedArray &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator^(const FixedArray &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator~() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator>>(const FixedArray &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator<<(const FixedArray &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator&=(const FixedArray &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator|=(const FixedArray &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator^=(const FixedArray &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator>>=(const FixedArray &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator<<=(const FixedArray &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } // TODO: ">>>" and ">>>=" operators } // namespace NerdCore::Class ================================================ FILE: compiler/native/nerdcore/src/class/fixed_array_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "_meta.h" namespace NerdCore::Class { class FixedArray : public virtual Base { public: // Constructors FixedArray(); FixedArray(NerdCore::VAR length); FixedArray(int length); FixedArray(NerdCore::VAR* value, int length); // Properties count_t counter = 0; NerdCore::VAR length; NerdCore::VAR* value; // Methods inline void Delete() noexcept; inline void* Copy() noexcept; // Native cast explicit operator bool() const noexcept; explicit operator double() const noexcept; explicit operator int() const noexcept; explicit operator long long() const noexcept; explicit operator std::string() const noexcept; // Main operators NerdCore::VAR const operator[](NerdCore::VAR key) const; NerdCore::VAR const operator[](int key) const; NerdCore::VAR &operator[](NerdCore::VAR key); NerdCore::VAR &operator[](int key); NerdCore::VAR &operator[](double key); NerdCore::VAR &operator[](const char* key); // Comparation operators FixedArray operator!() const; template bool operator==(const t &_v1) const { return false; } // === emulated with __NERD_EQUAL_VALUE_AND_TYPE // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE template bool operator!=(const t &_v1) const { return true; } template bool operator<(const t &_v1) const { return (*this)[0] < _v1;} template bool operator<=(const t &_v1) const { return (*this)[0] <= _v1; } template bool operator>(const t &_v1) const { return (*this)[0] > _v1; } template bool operator>=(const t &_v1) const { return (*this)[0] >= _v1; } // Numeric operators FixedArray operator+() const; FixedArray operator-() const; FixedArray operator++(const int _v1); FixedArray operator--(const int _v1); FixedArray operator+(const FixedArray &_v1) const; FixedArray operator+=(const FixedArray &_v1); FixedArray operator-(const FixedArray &_v1) const; FixedArray operator-=(const FixedArray &_v1); FixedArray operator*(const FixedArray &_v1) const; FixedArray operator*=(const FixedArray &_v1); // TODO: "**" and "**=" operators FixedArray operator/(const FixedArray &_v1) const; FixedArray operator/=(const FixedArray &_v1); FixedArray operator%(const FixedArray &_v1) const; FixedArray operator%=(const FixedArray &_v1); FixedArray operator&(const FixedArray &_v1) const; FixedArray operator|(const FixedArray &_v1) const; FixedArray operator^(const FixedArray &_v1) const; FixedArray operator~() const; FixedArray operator>>(const FixedArray &_v1) const; FixedArray operator<<(const FixedArray &_v1) const; FixedArray operator&=(const FixedArray &_v1); FixedArray operator|=(const FixedArray &_v1); FixedArray operator^=(const FixedArray &_v1); FixedArray operator>>=(const FixedArray &_v1); FixedArray operator<<=(const FixedArray &_v1); // TODO: ">>>" and ">>>=" operators }; } // namespace NerdCore::Class ================================================ FILE: compiler/native/nerdcore/src/class/function.h ================================================ /* Copyright (c) 2022 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "function_header.h" #include #include namespace NerdCore::Class { // Constructors Function::Function() { (*this)["prototype"] = new NerdCore::Class::Object(); } Function::Function(void *val) { counter++; value = (NerdCore::Type::function_t*)val; if((*this)["prototype"].type == NerdCore::Enum::Type::Null) { (*this)["prototype"] = new NerdCore::Class::Object(); } } Function::Function(void *val, NerdCore::VAR __this) { counter++; (*this)["this"] = __this; value = (NerdCore::Type::function_t*)val; if((*this)["prototype"].type == NerdCore::Enum::Type::Null) { (*this)["prototype"] = new NerdCore::Class::Object(); } } // Methods inline void Function::Delete() noexcept { if (--counter < 1) { delete (NerdCore::Type::function_t*)value; delete this; } } inline void Function::jsDelete(const std::string _key) noexcept { } inline void* Function::Copy() noexcept { counter++; return this; } // Main operators NerdCore::VAR const Function::operator[](NerdCore::VAR key) const { return NerdCore::Global::null; } #ifndef __NERD__OBJECT_VECTOR NerdCore::VAR &Function::operator[](NerdCore::VAR key) { /* if(hasLazy && LazyRTM.count(key) && !object.count(key)) { object[key] = LazyRTM[key]; } */ return object[key]; } #else NerdCore::VAR &Function::operator[](NerdCore::VAR key) { std::string _str = ((std::string)key); NerdCore::Type::StringView _sview = _str; if (key.type == NerdCore::Enum::Type::Number) { auto i = (int)key; if (i < 0) { return NerdCore::Global::null; } else { if (i >= object.size()) { object.reserve(i + 1); object.resize(i + 1); } } return object[i].second; } for (auto & search : object) { if (_sview.compare(search.first) == 0) { return search.second; } } object.push_back(NerdCore::Type::pair_t(_str, NerdCore::Global::null)); return object[object.size() - 1].second; } #endif #ifndef __NERD__OBJECT_VECTOR NerdCore::VAR &Function::operator[](int key) { std::string _str = std::to_string(key); NerdCore::Type::StringView _sview = _str; return object[_str]; } #else NerdCore::VAR &Function::operator[](int key) { std::string _str = std::to_string(key); NerdCore::Type::StringView _sview = _str; for (auto & search : object) { if (_sview.compare(search.first) == 0) { return search.second; } } object.push_back(NerdCore::Type::pair_t(_str, NerdCore::Global::null)); return object[object.size() - 1].second; } #endif #ifndef __NERD__OBJECT_VECTOR NerdCore::VAR &Function::operator[](double key) { std::string _str = std::to_string(key); NerdCore::Type::StringView _sview = _str; return object[_str]; } #else NerdCore::VAR &Function::operator[](double key) { std::string _str = std::to_string(key); NerdCore::Type::StringView _sview = _str; for (auto & search : object) { if (_sview.compare(search.first) == 0) { return search.second; } } object.push_back(NerdCore::Type::pair_t(_str, NerdCore::Global::null)); return object[object.size() - 1].second; } #endif #ifndef __NERD__OBJECT_VECTOR NerdCore::VAR &Function::operator[](const char* key) { /* if(hasLazy && LazyRTM.count(key) && !object.count(key)) { object[key] = LazyRTM[key]; } */ return object[key]; } #else NerdCore::VAR &Function::operator[](const char* key) { std::string _str = key; NerdCore::Type::StringView _sview = _str; for (auto & search : object) { if (_sview.compare(search.first) == 0) { return search.second; } } object.push_back(NerdCore::Type::pair_t(_str, NerdCore::Global::null)); return object[object.size() - 1].second; } #endif // Comparation operators NerdCore::VAR Function::operator!() const { return __NERD_Boolean_FALSE; } bool Function::operator==(const Function &_v1) const { return false; } // === emulated with __NERD_EQUAL_VALUE_AND_TYPE // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE bool Function::operator!=(const Function &_v1) const { return true; } bool Function::operator<(const Function &_v1) const { return false; } bool Function::operator<=(const Function &_v1) const { return true; } bool Function::operator>(const Function &_v1) const { return false; } bool Function::operator>=(const Function &_v1) const { return true; } // Numeric operators Function Function::operator+() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator-() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator++(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator--(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator+(const Function &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator+=(const Function &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator-(const Function &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator-=(const Function &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator*(const Function &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator*=(const Function &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } // TODO: "**" and "**=" operators Function Function::operator/(const Function &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator/=(const Function &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator%(const Function &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator%=(const Function &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator&(const Function &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator|(const Function &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator^(const Function &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator~() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator>>(const Function &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator<<(const Function &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator&=(const Function &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator|=(const Function &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator^=(const Function &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator>>=(const Function &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator<<=(const Function &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } // TODO: ">>>" and ">>>=" operators } // namespace NerdCore::Class ================================================ FILE: compiler/native/nerdcore/src/class/function_header.h ================================================ /* Copyright (c) 2022 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "_meta.h" namespace NerdCore::Class { class Function : public virtual Base { public: // Constructors Function(); Function(void* val); Function(void* val, NerdCore::VAR __this); // Properties count_t counter = 0; NerdCore::Type::function_t* value = nullptr; NerdCore::Type::object_t object; NerdCore::VAR This; //void* bind = nullptr; // Methods inline void Delete() noexcept; inline void jsDelete(std::string _key) noexcept; inline void* Copy() noexcept; inline NerdCore::VAR Call(NerdCore::VAR __NERD_THIS, NerdCore::VAR* _args, int i) { #ifndef __NERD__OBJECT_VECTOR if(__NERD_THIS.type == NerdCore::Enum::Type::Null) { return std::invoke((*static_cast(value)), This, _args, i); } else { return std::invoke((*static_cast(value)), __NERD_THIS, _args, i); } #else return (*static_cast(value))(__NERD_THIS, _args, i); #endif } template NerdCore::VAR operator()(NerdCore::VAR __NERD_THIS, Args... args) { NerdCore::VAR _args[] = {args...}; int i = sizeof...(args); #ifndef __NERD__OBJECT_VECTOR if(__NERD_THIS.type == NerdCore::Enum::Type::Null) { return std::invoke((*static_cast(value)), This, _args, i); } else { return std::invoke((*static_cast(value)), __NERD_THIS, _args, i); } #else return (*static_cast(value))(__NERD_THIS, _args, i); #endif } template NerdCore::VAR New(NerdCore::VAR __NERD_THIS, Args... args) { NerdCore::VAR _args[] = {args...}; int i = sizeof...(args); NerdCore::VAR _this = new NerdCore::Class::Object(); //__NERD_Object_Clone((*this)["this"]); if(_this.type == NerdCore::Enum::Type::Null) _this = new NerdCore::Class::Object(); //((NerdCore::Class::Object*)_this.data.ptr)->bind = bind; NerdCore::VAR _return = this->Call(_this, _args, i); if(_return.type == NerdCore::Enum::Type::Object) { _this = _return; } _this["__proto__"] = object["prototype"]; return _this; } // Main operators NerdCore::VAR const operator[](NerdCore::VAR key) const; NerdCore::VAR &operator[](NerdCore::VAR key); NerdCore::VAR &operator[](int key); NerdCore::VAR &operator[](double key); NerdCore::VAR &operator[](const char* key); // Comparation operators NerdCore::VAR operator!() const; bool operator==(const Function &_v1) const; // === emulated with __NERD_EQUAL_VALUE_AND_TYPE // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE bool operator!=(const Function &_v1) const; bool operator<(const Function &_v1) const; bool operator<=(const Function &_v1) const; bool operator>(const Function &_v1) const; bool operator>=(const Function &_v1) const; // Numeric operators Function operator+() const; Function operator-() const; Function operator++(const int _v1); Function operator--(const int _v1); Function operator+(const Function &_v1) const; Function operator+=(const Function &_v1); Function operator-(const Function &_v1) const; Function operator-=(const Function &_v1); Function operator*(const Function &_v1) const; Function operator*=(const Function &_v1); // TODO: "**" and "**=" operators Function operator/(const Function &_v1) const; Function operator/=(const Function &_v1); Function operator%(const Function &_v1) const; Function operator%=(const Function &_v1); Function operator&(const Function &_v1) const; Function operator|(const Function &_v1) const; Function operator^(const Function &_v1) const; Function operator~() const; Function operator>>(const Function &_v1) const; Function operator<<(const Function &_v1) const; Function operator&=(const Function &_v1); Function operator|=(const Function &_v1); Function operator^=(const Function &_v1); Function operator>>=(const Function &_v1); Function operator<<=(const Function &_v1); // TODO: ">>>" and ">>>=" operators }; } // namespace NerdCore::Class ================================================ FILE: compiler/native/nerdcore/src/class/native.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "native_header.h" #include #include namespace NerdCore::Class { // Constructors Native::Native() {} Native::Native(void *val) { value = val; } // Methods inline void Native::Delete() noexcept { if (--counter < 1) { if((*this)["__NERD_On_Destroy"]) (*this)["__NERD_On_Destroy"](NerdCore::Global::null); delete this; } } inline void* Native::Copy() noexcept { counter++; return this; } // Native cast Native::operator bool() const noexcept { return true; } Native::operator double() const noexcept { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } Native::operator int() const noexcept { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } Native::operator long long() const noexcept { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } Native::operator std::string() const noexcept { return "[native code]"; } // Main operators NerdCore::VAR const Native::operator[](NerdCore::VAR key) const { return NerdCore::Global::null; } NerdCore::VAR &Native::operator[](NerdCore::VAR key) { return NerdCore::Global::null; } NerdCore::VAR &Native::operator[](int key) { return NerdCore::Global::null; } NerdCore::VAR &Native::operator[](double key) { return NerdCore::Global::null; } NerdCore::VAR &Native::operator[](const char* key) { return NerdCore::Global::null; } // Comparation operators Native Native::operator!() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } bool Native::operator==(const Native &_v1) const { return false; } // === emulated with __NERD_EQUAL_VALUE_AND_TYPE // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE bool Native::operator!=(const Native &_v1) const { return true; } bool Native::operator<(const Native &_v1) const { return false; } bool Native::operator<=(const Native &_v1) const { return true; } bool Native::operator>(const Native &_v1) const { return false; } bool Native::operator>=(const Native &_v1) const { return true; } // Numeric operators Native Native::operator+() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator-() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator++(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator--(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator+(const Native &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator+=(const Native &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator-(const Native &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator-=(const Native &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator*(const Native &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator*=(const Native &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } // TODO: "**" and "**=" operators Native Native::operator/(const Native &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator/=(const Native &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator%(const Native &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator%=(const Native &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator&(const Native &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator|(const Native &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator^(const Native &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator~() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator>>(const Native &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator<<(const Native &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator&=(const Native &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator|=(const Native &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator^=(const Native &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator>>=(const Native &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator<<=(const Native &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } // TODO: ">>>" and ">>>=" operators } // namespace NerdCore::Class ================================================ FILE: compiler/native/nerdcore/src/class/native_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "_meta.h" namespace NerdCore::Class { class Native : public virtual Base { public: // Constructors Native(); Native(void* val); // Properties count_t counter = 1; int length = 0; void* value = nullptr; // Methods inline void Delete() noexcept; inline void* Copy() noexcept; // Native cast explicit operator bool() const noexcept; explicit operator double() const noexcept; explicit operator int() const noexcept; explicit operator long long() const noexcept; explicit operator std::string() const noexcept; // Main operators NerdCore::VAR const operator[](NerdCore::VAR key) const; NerdCore::VAR &operator[](NerdCore::VAR key); NerdCore::VAR &operator[](int key); NerdCore::VAR &operator[](double key); NerdCore::VAR &operator[](const char* key); // Comparation operators Native operator!() const; bool operator==(const Native &_v1) const; // === emulated with __NERD_EQUAL_VALUE_AND_TYPE // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE bool operator!=(const Native &_v1) const; bool operator<(const Native &_v1) const; bool operator<=(const Native &_v1) const; bool operator>(const Native &_v1) const; bool operator>=(const Native &_v1) const; // Numeric operators Native operator+() const; Native operator-() const; Native operator++(const int _v1); Native operator--(const int _v1); Native operator+(const Native &_v1) const; Native operator+=(const Native &_v1); Native operator-(const Native &_v1) const; Native operator-=(const Native &_v1); Native operator*(const Native &_v1) const; Native operator*=(const Native &_v1); // TODO: "**" and "**=" operators Native operator/(const Native &_v1) const; Native operator/=(const Native &_v1); Native operator%(const Native &_v1) const; Native operator%=(const Native &_v1); Native operator&(const Native &_v1) const; Native operator|(const Native &_v1) const; Native operator^(const Native &_v1) const; Native operator~() const; Native operator>>(const Native &_v1) const; Native operator<<(const Native &_v1) const; Native operator&=(const Native &_v1); Native operator|=(const Native &_v1); Native operator^=(const Native &_v1); Native operator>>=(const Native &_v1); Native operator<<=(const Native &_v1); // TODO: ">>>" and ">>>=" operators }; } // namespace NerdCore::Class ================================================ FILE: compiler/native/nerdcore/src/class/native_tpl_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "_meta.h" namespace NerdCore::Class { template class NativeTPL : public virtual Base { private: inline void internalDelete() { if(is_ptr) { delete value; } } public: // Constructors bool is_ptr = true; int length = 0; std::string type; NativeTPL(T val) { is_ptr = true; value = val; type = "undef"; } NativeTPL(T val, const char str[]) { is_ptr = true; type = str; value = val; } NativeTPL(T val, bool isPtr) { is_ptr = isPtr; value = val; type = "undef"; } NativeTPL(T val, const char str[], bool isPtr) { is_ptr = isPtr; value = val; type = str; } // Properties count_t counter = 1; T value; NerdCore::Type::object_t object; // Methods inline void Delete() noexcept { if (--counter == 0) { internalDelete(); delete this; } } inline void* Copy() noexcept { counter++; return this; } template const inline T operator()(Cast& c) const { static_assert(std::is_same::value, "Casting must be same as NativeType"); return value; } inline T operator()() const { return value; } operator bool() const noexcept { return true; } operator double() const noexcept { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } operator int() const noexcept { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } operator long long() const noexcept { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } operator std::string() const noexcept { return std::string("[native ") + type + std::string("]"); } // Main operators NerdCore::VAR const operator[](NerdCore::VAR key) const { return NerdCore::Global::null; } NerdCore::VAR &operator[](NerdCore::VAR key) { return NerdCore::Global::null; } NerdCore::VAR &operator[](int key) { return NerdCore::Global::null; } NerdCore::VAR &operator[](double key) { return NerdCore::Global::null; } NerdCore::VAR &operator[](const char* key) { return NerdCore::Global::null; } // Comparation operators NativeTPL operator!() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } bool operator==(const NativeTPL &_v1) const { return false; } // === emulated with __NERD_EQUAL_VALUE_AND_TYPE // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE bool operator!=(const NativeTPL &_v1) const { return true; } bool operator<(const NativeTPL &_v1) const { return false; } bool operator<=(const NativeTPL &_v1) const { return true; } bool operator>(const NativeTPL &_v1) const { return false; } bool operator>=(const NativeTPL &_v1) const { return true; } // Numeric operators NativeTPL operator+() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator-() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator++(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator--(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator+(const NativeTPL &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator+=(const NativeTPL &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator-(const NativeTPL &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator-=(const NativeTPL &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator*(const NativeTPL &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator*=(const NativeTPL &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } // TODO: "**" and "**=" operators NativeTPL operator/(const NativeTPL &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator/=(const NativeTPL &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator%(const NativeTPL &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator%=(const NativeTPL &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator&(const NativeTPL &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator|(const NativeTPL &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator^(const NativeTPL &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator~() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator>>(const NativeTPL &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator<<(const NativeTPL &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator&=(const NativeTPL &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator|=(const NativeTPL &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator^=(const NativeTPL &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator>>=(const NativeTPL &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator<<=(const NativeTPL &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } // TODO: ">>>" and ">>>=" operators }; } // namespace NerdCore::Class ================================================ FILE: compiler/native/nerdcore/src/class/number.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ namespace NerdCore::Class::NUMBER { } ================================================ FILE: compiler/native/nerdcore/src/class/number_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ namespace NerdCore::Class::NUMBER { } ================================================ FILE: compiler/native/nerdcore/src/class/object.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "object_header.h" #include namespace NerdCore::Class { NerdCore::VAR __proxy; // Constructors Object::Object() { } /* Object::Object(const char* _key, NerdCore::VAR _value) { object[_key] = _value; } */ /* Object::Object(NerdCore::VAR _obj) { object = ((NerdCore::Class::Object*)_obj.data.ptr)->object; } */ Object::Object(NerdCore::Type::object_t obj) { object = obj; } Object::Object(std::initializer_list obj) { for (NerdCore::Type::pair_t p : obj) { object[p.first] = p.second; } } // Methods double Object::Size() { return object.size(); } inline void Object::Delete() noexcept { if (--counter < 1) { delete this; } } inline void Object::jsDelete(const std::string _key) noexcept { #ifndef __NERD__OBJECT_VECTOR object.erase(_key); #else for (NerdCore::Type::object_t::iterator it = object.begin() ; it != object.end(); ++it) { if (_key.compare(it->first) == 0) { object.erase(it); return; } } #endif } inline void* Object::Copy() noexcept { counter++; return this; } // Native cast Object::operator bool() const noexcept { return true; } Object::operator double() const noexcept { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } Object::operator int() const noexcept { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } Object::operator long long() const noexcept { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } Object::operator std::string() const noexcept { return "[object Object]"; } // Main operators NerdCore::VAR const Object::operator[](NerdCore::VAR key) const { return NerdCore::Global::null; } NerdCore::VAR &Object::GetSet(std::string key) { #ifndef __NERD__OBJECT_VECTOR // if current object[key] is null, we look for the prototypal chain if(object[key].type == NerdCore::Enum::Type::Null) { NerdCore::VAR __proto = object["__proto__"]; while(__proto.type != NerdCore::Enum::Type::Null) { if(__proto[key].type != NerdCore::Enum::Type::Null) { object[key] = __proto[key]; break; } __proto = __proto["__proto__"]; } } /* if(object[key].type == NerdCore::Enum::Type::Function) { (__NERD_FUNCTION(object[key]))->object["this"] = NerdCore::VAR(this); __NERD_FUNCTION(object[key])->bind = bind; } */ return object[key]; #else for (auto & search : object) { if (key.compare(search.first) == 0) { return search.second; } } object.push_back(NerdCore::Type::pair_t(key, NerdCore::Global::null)); return object[object.size() - 1].second; #endif } NerdCore::VAR &Object::operator[](NerdCore::VAR key) { return Object::GetSet(key); } NerdCore::VAR &Object::operator[](int key) { std::string _str = std::to_string(key); return Object::GetSet(_str); } NerdCore::VAR &Object::operator[](double key) { std::string _str = std::to_string(key); return Object::GetSet(_str); } NerdCore::VAR &Object::operator[](const char* key) { return Object::GetSet(key); } // Comparation operators Object Object::operator!() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } bool Object::operator==(const Object &_v1) const { return false; } // === emulated with __NERD_EQUAL_VALUE_AND_TYPE // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE bool Object::operator!=(const Object &_v1) const { return true; } bool Object::operator<(const Object &_v1) const { return false; } bool Object::operator<=(const Object &_v1) const { return true; } bool Object::operator>(const Object &_v1) const { return false; } bool Object::operator>=(const Object &_v1) const { return true; } // Numeric operators Object Object::operator+() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator-() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator++(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator--(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator+(const Object &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator+=(const Object &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator-(const Object &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator-=(const Object &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator*(const Object &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator*=(const Object &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } // TODO: "**" and "**=" operators Object Object::operator/(const Object &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator/=(const Object &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator%(const Object &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator%=(const Object &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator&(const Object &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator|(const Object &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator^(const Object &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator~() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator>>(const Object &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator<<(const Object &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator&=(const Object &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator|=(const Object &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator^=(const Object &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator>>=(const Object &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator<<=(const Object &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } // TODO: ">>>" and ">>>=" operators } // namespace NerdCore::Class ================================================ FILE: compiler/native/nerdcore/src/class/object_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "_meta.h" namespace NerdCore::Class { class Object : public virtual Base { public: // Constructors Object(); Object(NerdCore::Type::object_t obj); Object(std::initializer_list); //Object(NerdCore::VAR _obj); // Properties count_t counter = 0; bool deleted = false; //bool hasLazy = false; NerdCore::Type::object_t object; void* bind = nullptr; // Methods double Size(); inline void Delete() noexcept; inline void jsDelete(const std::string _key) noexcept; inline void* Copy() noexcept; // Native cast explicit operator bool() const noexcept; explicit operator double() const noexcept; explicit operator int() const noexcept; explicit operator long long() const noexcept; explicit operator std::string() const noexcept; // Main operators inline NerdCore::VAR& GetSet(std::string key); NerdCore::VAR const operator[](NerdCore::VAR key) const; NerdCore::VAR &operator[](NerdCore::VAR key); NerdCore::VAR &operator[](int key); NerdCore::VAR &operator[](double key); NerdCore::VAR &operator[](const char* key); // Comparation operators Object operator!() const; bool operator==(const Object &_v1) const; // === emulated with __NERD_EQUAL_VALUE_AND_TYPE // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE bool operator!=(const Object &_v1) const; bool operator<(const Object &_v1) const; bool operator<=(const Object &_v1) const; bool operator>(const Object &_v1) const; bool operator>=(const Object &_v1) const; // Numeric operators Object operator+() const; Object operator-() const; Object operator++(const int _v1); Object operator--(const int _v1); Object operator+(const Object &_v1) const; Object operator+=(const Object &_v1); Object operator-(const Object &_v1) const; Object operator-=(const Object &_v1); Object operator*(const Object &_v1) const; Object operator*=(const Object &_v1); // TODO: "**" and "**=" operators Object operator/(const Object &_v1) const; Object operator/=(const Object &_v1); Object operator%(const Object &_v1) const; Object operator%=(const Object &_v1); Object operator&(const Object &_v1) const; Object operator|(const Object &_v1) const; Object operator^(const Object &_v1) const; Object operator~() const; Object operator>>(const Object &_v1) const; Object operator<<(const Object &_v1) const; Object operator&=(const Object &_v1); Object operator|=(const Object &_v1); Object operator^=(const Object &_v1); Object operator>>=(const Object &_v1); Object operator<<=(const Object &_v1); // TODO: ">>>" and ">>>=" operators }; } // namespace NerdCore::Class ================================================ FILE: compiler/native/nerdcore/src/class/string.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "string_header.h" #include #include namespace NerdCore::Class { // Constructors String::String() { object["__proto__"] = NerdCore::Global::String["prototype"]; } String::String(std::string val) { object["__proto__"] = NerdCore::Global::String["prototype"]; value = val; } String::String(const char* val) { object["__proto__"] = NerdCore::Global::String["prototype"]; value = val; } // Methods inline void String::Delete() noexcept { if (--counter < 1) { delete this; } } inline void* String::Copy() noexcept { return new String(value); } // Native cast String::operator bool() const noexcept { return value.size() > 0; } String::operator double() const noexcept { std::string::size_type end; double res; #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) try { res = std::stod(value, &end); }catch(...){} #else res = std::stod(value, &end); #endif #ifdef __NERD_ENV_ARDUINO return 0; #else return end == value.size() ? res : std::numeric_limits::quiet_NaN(); #endif } String::operator int() const noexcept { std::string::size_type end; int res; #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) try { res = std::stoi(value, &end, 10); }catch(...){} #else res = std::stoi(value, &end, 10); #endif #ifdef __NERD_ENV_ARDUINO return 0; #else return end == value.size() ? res : std::numeric_limits::quiet_NaN(); #endif } String::operator long long() const noexcept { std::string::size_type end; long long res; #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) try { res = std::stoll(value, &end, 10); }catch(...){} #else res = std::stoll(value, &end, 10); #endif #ifdef __NERD_ENV_ARDUINO return 0; #else return end == value.size() ? res : std::numeric_limits::quiet_NaN(); #endif } String::operator std::string() const noexcept { return value; } // Main operators NerdCore::VAR const String::operator[](NerdCore::VAR key) const { return NerdCore::Global::null; } static NerdCore::Global::var _char = ""; NerdCore::VAR &String::GetSet(NerdCore::VAR keyVar) { if(keyVar.type == NerdCore::Enum::Type::Number) { int key = (int)keyVar; if(key > value.size() - 1) { return NerdCore::Global::null; } else { _char = std::string(1, value[key]); return _char; } } else if(keyVar.type == NerdCore::Enum::Type::String) { std::string key = ((NerdCore::Class::String*)(keyVar.data.ptr))->value; #ifndef __NERD__OBJECT_VECTOR // if current object[key] is null, we look for the prototypal chain if(object[key].type == NerdCore::Enum::Type::Null) { NerdCore::VAR __proto = object["__proto__"]; while(__proto.type != NerdCore::Enum::Type::Null) { if(__proto[key].type != NerdCore::Enum::Type::Null) { object[key] = __proto[key]; break; } __proto = __proto["__proto__"]; } } /* if(object[key].type == NerdCore::Enum::Type::Function) { value.copy((char*)__NERD_FUNCTION(object[key])->bind, value.length()); } */ return object[key]; #else for (auto & search : object) { if (key.compare(search.first) == 0) { return search.second; } } object.push_back(NerdCore::Type::pair_t(key, NerdCore::Global::null)); return object[object.size() - 1].second; #endif } else { return NerdCore::Global::null; } } NerdCore::VAR &String::operator[](NerdCore::VAR key) { return String::GetSet(key); } NerdCore::VAR &String::operator[](int key) { return String::GetSet(key); } NerdCore::VAR &String::operator[](double key) { return String::GetSet(key); } NerdCore::VAR &String::operator[](const char* key) { #ifndef __NERD__OBJECT_VECTOR // if current object[key] is null, we look for the prototypal chain if(object[key].type == NerdCore::Enum::Type::Null) { NerdCore::VAR __proto = object["__proto__"]; while(__proto.type != NerdCore::Enum::Type::Null) { if(__proto[key].type != NerdCore::Enum::Type::Null) { object[key] = __proto[key]; break; } __proto = __proto["__proto__"]; } } /* if(object[key].type == NerdCore::Enum::Type::Function) { //__NERD_FUNCTION(object[key])->bind = value.data(); //value.copy((char*)__NERD_FUNCTION(object[key])->bind, value.length()); } */ return object[key]; #else for (auto & search : object) { if (key.compare(search.first) == 0) { return search.second; } } object.push_back(NerdCore::Type::pair_t(key, NerdCore::Global::null)); return object[object.size() - 1].second; #endif } // Comparation operators String String::operator!() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } bool String::operator==(const String &_v1) const { return value.compare(_v1.value) == 0; } // === emulated with __NERD_EQUAL_VALUE_AND_TYPE // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE bool String::operator!=(const String &_v1) const { return value.compare(_v1.value) != 0; } bool String::operator<(const String &_v1) const { return value.at(0) < _v1.value.at(0); } bool String::operator<=(const String &_v1) const { return value.at(0) <= _v1.value.at(0); } bool String::operator>(const String &_v1) const { return value.at(0) > _v1.value.at(0); } bool String::operator>=(const String &_v1) const { return value.at(0) >= _v1.value.at(0); } // Numeric operators String String::operator+() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator-() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator++(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator--(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator+(const String &_v1) const { return value + _v1.value; } String String::operator+=(const String &_v1) { value += _v1.value; return *this; } String String::operator-(const String &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator-=(const String &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator*(const String &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator*=(const String &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } // TODO: "**" and "**=" operators String String::operator/(const String &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator/=(const String &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator%(const String &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator%=(const String &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator&(const String &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator|(const String &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator^(const String &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator~() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator>>(const String &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator<<(const String &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator&=(const String &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator|=(const String &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator^=(const String &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator>>=(const String &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator<<=(const String &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } // TODO: ">>>" and ">>>=" operators /*** STRING METHODS ***/ NerdCore::VAR String::toString(NerdCore::VAR* _args, int _length) const { return value; } NerdCore::VAR String::split(NerdCore::VAR* _args, int _length) const { NerdCore::VAR _needle; if (_length > 0) _needle = _args[0]; else return NerdCore::VAR(this->value); NerdCore::VAR _arr = new NerdCore::Class::Array(); char *_v = (char *)malloc(strlen(this->value.c_str()) + 1); strcpy(_v, this->value.c_str()); char *delim = (char *)malloc(strlen(((std::string)_needle).c_str()) + 1); strcpy(delim, ((std::string)_needle).c_str()); char *ptr = strtok(_v, delim); int i = 0; char *_new; while (ptr != NULL) { _new = (char *)malloc(strlen(ptr) + 1); strcpy(_new, ptr); __NERD_Object_Set(i, _new, _arr); free(_new); ptr = strtok(NULL, delim); i++; } free(delim); return _arr; } NerdCore::VAR String::indexOf(NerdCore::VAR* _args, int _length) const { NerdCore::VAR _needle; if (_length > 0) _needle = _args[0]; else return NerdCore::VAR(-1); std::string::size_type loc = this->value.find((std::string)_needle, 0); if (loc != std::string::npos) { return NerdCore::VAR((int)loc); } return NerdCore::VAR(-1); } NerdCore::VAR String::lastIndexOf(NerdCore::VAR* _args, int _length) const { NerdCore::VAR _needle; if (_length > 0) _needle = _args[0]; else return NerdCore::VAR(-1); std::string::size_type loc = this->value.find_last_of((std::string)_needle, 0); if (loc != std::string::npos) { return NerdCore::VAR((int)loc); } return NerdCore::VAR(-1); } NerdCore::VAR String::search(NerdCore::VAR* _args, int _length) const { NerdCore::VAR _needle; if (_length > 0) _needle = _args[0]; else return NerdCore::VAR(-1); std::string::size_type loc = this->value.find((std::string)_needle, 0); if (loc != std::string::npos) { return NerdCore::VAR((int)loc); } return NerdCore::VAR(-1); } NerdCore::VAR String::slice(NerdCore::VAR* _args, int _length) const { NerdCore::VAR _start; NerdCore::VAR _end; if (_length > 0) _start = _args[0]; else return NerdCore::VAR(this->value); if (_length > 1) _end = _args[1]; if (_end.type == NerdCore::Enum::Type::Null) return NerdCore::VAR(this->value.substr((int)_start, std::string::npos)); int _endIndex = (int)_end - (int)_start; return NerdCore::VAR(this->value.substr((int)_start, _endIndex)); } NerdCore::VAR String::substr(NerdCore::VAR* _args, int _length) const { NerdCore::VAR _start; NerdCore::VAR _end; if (_length > 0) _start = _args[0]; else return NerdCore::VAR(this->value); if (_length > 1) _end = _args[1]; if (_end.type == NerdCore::Enum::Type::Null) return NerdCore::VAR(this->value.substr((int)_start, std::string::npos)); return NerdCore::VAR(this->value.substr((int)_start, (int)_end)); } NerdCore::VAR String::replace(NerdCore::VAR* _args, int _length) const { NerdCore::VAR _search; NerdCore::VAR _replace; if (_length > 0) _search = _args[0]; else return NerdCore::VAR(this->value); if (_length > 1) _replace = _args[1]; size_t start_pos = this->value.find((std::string)_search); if (start_pos == std::string::npos) { return NerdCore::VAR(value); } std::string _new = value; return NerdCore::VAR(_new.replace(start_pos, ((std::string)_search).length(), (std::string)_replace)); } /* END STRING METHODS */ } // namespace NerdCore::Class ================================================ FILE: compiler/native/nerdcore/src/class/string_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "_meta.h" namespace NerdCore::Class { class String : public virtual Base { public: // Constructors String(); String(std::string val); String(const char* val); // Properties std::string value; NerdCore::Type::object_t object; NerdCore::VAR length; void* bind = nullptr; count_t counter = 1; // Methods inline void Delete() noexcept; inline void* Copy() noexcept; // Native cast explicit operator bool() const noexcept; explicit operator double() const noexcept; explicit operator int() const noexcept; explicit operator long long() const noexcept; explicit operator std::string() const noexcept; // Main operators inline NerdCore::VAR& GetSet(NerdCore::VAR keyVar); NerdCore::VAR const operator[](NerdCore::VAR key) const; NerdCore::VAR &operator[](NerdCore::VAR key); NerdCore::VAR &operator[](int key); NerdCore::VAR &operator[](double key); NerdCore::VAR &operator[](const char* key); // Comparation operators template NerdCore::VAR operator() (Args... args) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::Global::null; } String operator!() const; bool operator==(const String &_v1) const; // === emulated with __NERD_EQUAL_VALUE_AND_TYPE // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE bool operator!=(const String &_v1) const; bool operator<(const String &_v1) const; bool operator<=(const String &_v1) const; bool operator>(const String &_v1) const; bool operator>=(const String &_v1) const; // Numeric operators String operator+() const; String operator-() const; String operator++(const int _v1); String operator--(const int _v1); String operator+(const String &_v1) const; String operator+=(const String &_v1); String operator-(const String &_v1) const; String operator-=(const String &_v1); String operator*(const String &_v1) const; String operator*=(const String &_v1); // TODO: "**" and "**=" operators String operator/(const String &_v1) const; String operator/=(const String &_v1); String operator%(const String &_v1) const; String operator%=(const String &_v1); String operator&(const String &_v1) const; String operator|(const String &_v1) const; String operator^(const String &_v1) const; String operator~() const; String operator>>(const String &_v1) const; String operator<<(const String &_v1) const; String operator&=(const String &_v1); String operator|=(const String &_v1); String operator^=(const String &_v1); String operator>>=(const String &_v1); String operator<<=(const String &_v1); // TODO: ">>>" and ">>>=" operators /*** STRING METHODS ***/ NerdCore::VAR toString(NerdCore::VAR* _args, int _length) const; NerdCore::VAR split(NerdCore::VAR* _args, int _length) const; NerdCore::VAR indexOf(NerdCore::VAR* _args, int _length) const; NerdCore::VAR lastIndexOf(NerdCore::VAR* _args, int _length) const; NerdCore::VAR search(NerdCore::VAR* _args, int _length) const; NerdCore::VAR slice(NerdCore::VAR* _args, int _length) const; NerdCore::VAR substr(NerdCore::VAR* _args, int _length) const; NerdCore::VAR replace(NerdCore::VAR* _args, int _length) const; /* END STRING METHODS */ }; } // namespace NerdCore::Class ================================================ FILE: compiler/native/nerdcore/src/class/struct.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "struct_header.h" #include #include namespace NerdCore::Class { // Constructors Struct::Struct() {} Struct::Struct(void *val) { value = val; } Struct::Struct(void *val, void* fn) { value = val; Clean = (NerdCore::Type::clean_struct*)fn; } // Methods inline void Struct::Delete() noexcept { if (--counter == 0) { (*static_cast(Clean))(value); delete Clean; delete this; } } inline void* Struct::Copy() noexcept { counter++; return this; } // Native cast Struct::operator bool() const noexcept { return true; } Struct::operator double() const noexcept { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } Struct::operator int() const noexcept { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } Struct::operator long long() const noexcept { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } Struct::operator std::string() const noexcept { return "[native struct]"; } // Main operators NerdCore::VAR const Struct::operator[](NerdCore::VAR key) const { return NerdCore::Global::null; } NerdCore::VAR &Struct::operator[](NerdCore::VAR key) { #ifndef __NERD__OBJECT_VECTOR return object[(std::string)key]; #else for (auto & search : object) { if (((std::string)key).compare(search.first) == 0) { return search.second; } } object.push_back(NerdCore::Type::pair_t((std::string)key, NerdCore::VAR())); return object[object.size() - 1].second; #endif } NerdCore::VAR &Struct::operator[](int key) { #ifndef __NERD__OBJECT_VECTOR return object[std::to_string(key)]; #else std::string _str = std::to_string(key); for (auto & search : object) { if (_str.compare(search.first) == 0) { return search.second; } } object.push_back(NerdCore::Type::pair_t(_str, NerdCore::VAR())); return object[object.size() - 1].second; #endif } NerdCore::VAR &Struct::operator[](double key) { #ifndef __NERD__OBJECT_VECTOR return object[std::to_string(key)]; #else std::string _str = std::to_string(key); for (auto & search : object) { if (_str.compare(search.first) == 0) { return search.second; } } object.push_back(NerdCore::Type::pair_t(_str, NerdCore::VAR())); return object[object.size() - 1].second; #endif } NerdCore::VAR &Struct::operator[](const char* key) { std::string str = key; #ifndef __NERD__OBJECT_VECTOR return object[str]; #else for (auto & search : object) { if (str.compare(search.first) == 0) { return search.second; } } object.push_back(NerdCore::Type::pair_t(str, NerdCore::VAR())); return object[object.size() - 1].second; #endif } // Comparation operators NerdCore::VAR Struct::operator!() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } bool Struct::operator==(const NerdCore::VAR &_v1) const { return false; } // === emulated with __NERD_EQUAL_VALUE_AND_TYPE // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE bool Struct::operator!=(const NerdCore::VAR &_v1) const { return true; } bool Struct::operator<(const NerdCore::VAR &_v1) const { return false; } bool Struct::operator<=(const NerdCore::VAR &_v1) const { return true; } bool Struct::operator>(const NerdCore::VAR &_v1) const { return false; } bool Struct::operator>=(const NerdCore::VAR &_v1) const { return true; } // Numeric operators NerdCore::VAR Struct::operator+() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator-() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator++(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator--(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator+(const NerdCore::VAR &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator+=(const NerdCore::VAR &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator-(const NerdCore::VAR &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator-=(const NerdCore::VAR &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator*(const NerdCore::VAR &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator*=(const NerdCore::VAR &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } // TODO: "**" and "**=" operators NerdCore::VAR Struct::operator/(const NerdCore::VAR &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator/=(const NerdCore::VAR &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator%(const NerdCore::VAR &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator%=(const NerdCore::VAR &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator&(const NerdCore::VAR &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator|(const NerdCore::VAR &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator^(const NerdCore::VAR &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator~() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator>>(const NerdCore::VAR &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator<<(const NerdCore::VAR &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator&=(const NerdCore::VAR &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator|=(const NerdCore::VAR &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator^=(const NerdCore::VAR &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator>>=(const NerdCore::VAR &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator<<=(const NerdCore::VAR &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } // TODO: ">>>" and ">>>=" operators } // namespace NerdCore::Class ================================================ FILE: compiler/native/nerdcore/src/class/struct_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "_meta.h" namespace NerdCore::Class { class Struct : public virtual Base { public: // Constructors Struct(); Struct(void* val); Struct(void* val, void* fn); // Properties count_t counter = 1; void* value = nullptr; NerdCore::Type::object_t object; NerdCore::Type::clean_struct* Clean; // Methods inline void Delete() noexcept; inline void StructDelete() noexcept; inline void* Copy() noexcept; // Struct cast explicit operator bool() const noexcept; explicit operator double() const noexcept; explicit operator int() const noexcept; explicit operator long long() const noexcept; explicit operator std::string() const noexcept; // Main operators NerdCore::VAR const operator[](NerdCore::VAR key) const; NerdCore::VAR &operator[](NerdCore::VAR key); NerdCore::VAR &operator[](int key); NerdCore::VAR &operator[](double key); NerdCore::VAR &operator[](const char* key); template NerdCore::VAR operator()(Args... args) const { auto _args = NerdCore::Type::vector_t{(NerdCore::VAR)args...}; return (*static_cast *>(value))(_args); } // Comparation operators NerdCore::VAR operator!() const; bool operator==(const NerdCore::VAR &_v1) const; // === emulated with __NERD_EQUAL_VALUE_AND_TYPE // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE bool operator!=(const NerdCore::VAR &_v1) const; bool operator<(const NerdCore::VAR &_v1) const; bool operator<=(const NerdCore::VAR &_v1) const; bool operator>(const NerdCore::VAR &_v1) const; bool operator>=(const NerdCore::VAR &_v1) const; // Numeric operators NerdCore::VAR operator+() const; NerdCore::VAR operator-() const; NerdCore::VAR operator++(const int _v1); NerdCore::VAR operator--(const int _v1); NerdCore::VAR operator+(const NerdCore::VAR &_v1) const; NerdCore::VAR operator+=(const NerdCore::VAR &_v1); NerdCore::VAR operator-(const NerdCore::VAR &_v1) const; NerdCore::VAR operator-=(const NerdCore::VAR &_v1); NerdCore::VAR operator*(const NerdCore::VAR &_v1) const; NerdCore::VAR operator*=(const NerdCore::VAR &_v1); // TODO: "**" and "**=" operators NerdCore::VAR operator/(const NerdCore::VAR &_v1) const; NerdCore::VAR operator/=(const NerdCore::VAR &_v1); NerdCore::VAR operator%(const NerdCore::VAR &_v1) const; NerdCore::VAR operator%=(const NerdCore::VAR &_v1); NerdCore::VAR operator&(const NerdCore::VAR &_v1) const; NerdCore::VAR operator|(const NerdCore::VAR &_v1) const; NerdCore::VAR operator^(const NerdCore::VAR &_v1) const; NerdCore::VAR operator~() const; NerdCore::VAR operator>>(const NerdCore::VAR &_v1) const; NerdCore::VAR operator<<(const NerdCore::VAR &_v1) const; NerdCore::VAR operator&=(const NerdCore::VAR &_v1); NerdCore::VAR operator|=(const NerdCore::VAR &_v1); NerdCore::VAR operator^=(const NerdCore::VAR &_v1); NerdCore::VAR operator>>=(const NerdCore::VAR &_v1); NerdCore::VAR operator<<=(const NerdCore::VAR &_v1); // TODO: ">>>" and ">>>=" operators }; } // namespace NerdCore::Class ================================================ FILE: compiler/native/nerdcore/src/classes.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "./class/array.h" #include "./class/function.h" #include "./class/native.h" #include "./class/struct.h" #include "./class/fixed_array.h" #include "./class/object.h" #include "./class/string.h" ================================================ FILE: compiler/native/nerdcore/src/classes_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #define __INC_Nerd_CLASSES_HEADER #include "./class/base_header.h" #include "./class/array_header.h" #include "./class/object_header.h" #include "./class/function_header.h" #include "./class/native_header.h" //#include "./class/native_tpl_header.h" #include "./class/struct_header.h" #include "./class/fixed_array_header.h" #include "./class/string_header.h" ================================================ FILE: compiler/native/nerdcore/src/enum.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ namespace NerdCore::Enum { enum Type { Null, Boolean, Number, String, Native, NativeTPL, Struct, FixedArray, Array, Object, Function, }; } ================================================ FILE: compiler/native/nerdcore/src/functions.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ NerdCore::VAR getArguments(int argc, char** argv) { NerdCore::VAR __NJS_ARGS = new NerdCore::Class::Array(); for( int i = 0; i < argc; i++) { __NJS_ARGS[i] = argv[i]; } return __NJS_ARGS; } ================================================ FILE: compiler/native/nerdcore/src/functions_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ NerdCore::VAR __NERD_Log_Console(NerdCore::VAR _var); NerdCore::VAR __NERD_Object_Keys(NerdCore::VAR _var); NerdCore::VAR __NERD_Object_Stringify(NerdCore::VAR _var); NerdCore::VAR __NERD_Object_Stringify(NerdCore::VAR _var, bool _bracket); NerdCore::VAR __NERD_Object_Clone(NerdCore::VAR& _var); NerdCore::VAR __NERD_Object_Set(std::string _index, NerdCore::VAR _value, NerdCore::Type::object_t *_obj); std::string __NERD_DOUBLE_TO_STRING(double _var); /*** String MANIPULATION ***/ #ifdef __NERD_ENV_ARDUINO namespace std { template string to_string(m _var) { std::stringstream output; output << _var; return output.str(); } int isnan(double __x) { return ::isnan(__x); } inline int isfinite(double __x) { return ::isfinite(__x); } inline int signbit(double __x) { return ::signbit(__x); } inline double stod(std::string _str, std::string::size_type* sz) { *sz = _str.length(); return String(_str.c_str()).toFloat(); } inline int stoi(std::string _str, std::string::size_type* sz, int _base) { *sz = _str.length(); return String(_str.c_str()).toInt(); } inline long long stoll(std::string _str, std::string::size_type* sz, int _base) { *sz = _str.length(); return atol(_str.c_str()); } } template m remainder(m _dividend, n _divisor) { m quotient = (int)_dividend / (int)_divisor; m remainder = (int)_dividend % (int)_divisor; return remainder; } #endif template std::string __NERD_Concat_To_Str(m _left, n _right) { std::stringstream output; output << _left << _right; return output.str(); } /* END String MANIPULATION */ /*** Number MANIPULATION ***/ template int __NERD_Str_To_Int(m _left) { int out; std::stringstream output; output << _left; output >> out; return out; } template double __NERD_Str_To_Double(m _left) { double out; std::stringstream output; output << _left; output >> out; return out; } /* END Number MANIPULATION */ NerdCore::VAR getArguments(int argc, char** argv); ================================================ FILE: compiler/native/nerdcore/src/macro.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*** HELPERS ***/ #define __NERD_GET_String(_var) _var.get().s->value #define __NERD_Create_Boolean(_value) NerdCore::VAR(NerdCore::Enum::Type::Boolean, _value) #define __NERD_Create_Number(_value) NerdCore::VAR(_value) #define __NERD_Create_Function(_value) NerdCore::VAR(NerdCore::Enum::Type::Function, _value) #define __NERD_Create_Undefined() NerdCore::VAR() #define __NERD_Create_String(_value) NerdCore::VAR(_value) #define __NERD_Create_Infinity() NerdCore::VAR(std::numeric_limits::infinity) #define __NERD_Create_Null() NerdCore::VAR(NerdCore::Enum::Type::Null, 0) #define __NERD_Create_Struct(_value) NerdCore::VAR(new _value(), new NerdCore::Type::clean_struct([](void* _ptr){ delete (_value*)_ptr;})) #define __NERD_Create_FixedArray(_length) NerdCore::VAR(new NerdCore::Class::FixedArray(_length)) #define __NERD_Create_Lambda(name) NerdCore::Type::function_t* name = new NerdCore::Type::function_t([](NerdCore::VAR& __NERD_THIS, NerdCore::VAR* __NERD_VARARGS, int __NERD_VARLENGTH) #define __NERD_Create_Ptr_Scoped_Anon(__CONTENT__) new NerdCore::Type::function_t([&](NerdCore::VAR& __NERD_THIS, NerdCore::VAR* __NERD_VARARGS, int __NERD_VARLENGTH) mutable -> NerdCore::Global::var { __CONTENT__ }) #define __NERD_Create_Ptr_Scoped_Copy_Anon(__CONTENT__) new NerdCore::Type::function_t([=](NerdCore::VAR& __NERD_THIS, NerdCore::VAR* __NERD_VARARGS, int __NERD_VARLENGTH) mutable -> NerdCore::Global::var { __CONTENT__ }) #define __NERD_Create_Ptr_Scoped_Copy_Anon_With_Ref(__FN__, __CONTENT__) new NerdCore::Type::function_t([=, &__FN__](NerdCore::VAR& __NERD_THIS, NerdCore::VAR* __NERD_VARARGS, int __NERD_VARLENGTH) mutable -> NerdCore::Global::var { __CONTENT__ }) #define __NERD_Create_Ptr_Unscoped_With_Copy(__FN__, __CONTENT__) new NerdCore::Type::function_t([__FN__](NerdCore::VAR& __NERD_THIS, NerdCore::VAR* __NERD_VARARGS, int __NERD_VARLENGTH) mutable -> NerdCore::Global::var { __CONTENT__ }) #define __NERD_Create_Ptr_Unscoped_Anon(__CONTENT__) new NerdCore::Type::function_t([](NerdCore::VAR& __NERD_THIS, NerdCore::VAR* __NERD_VARARGS, int __NERD_VARLENGTH) -> NerdCore::Global::var{ __CONTENT__ }) #define __NERD_Create_Var_Scoped_Anon(__CONTENT__) NerdCore::VAR(NerdCore::Enum::Type::Function, __NERD_Create_Ptr_Scoped_Anon(__CONTENT__)) #define __NERD_Create_Var_Unscoped_Anon(__CONTENT__) NerdCore::VAR(NerdCore::Enum::Type::Function, __NERD_Create_Ptr_Unscoped_Anon(__CONTENT__)) #define __NERD_Create_Var_Scoped_Copy_Anon(__CONTENT__) NerdCore::VAR(NerdCore::Enum::Type::Function, __NERD_Create_Ptr_Scoped_Copy_Anon(__CONTENT__)) #define __NERD_Create_Var_Unscoped_With_Copy(__FN__, __CONTENT__) NerdCore::VAR(NerdCore::Enum::Type::Function, __NERD_Create_Ptr_Unscoped_With_Copy(__FN__, __CONTENT__)) #define __NERD_Create_Var_Scoped_Copy_Anon_With_Ref(__FN__, __CONTENT__) NerdCore::VAR(NerdCore::Enum::Type::Function, __NERD_Create_Ptr_Scoped_Copy_Anon_With_Ref(__FN__, __CONTENT__)) #define __NERD_Init_Int(_name, _value) int _name = _value #define __NERD_Init_Double(_name, _value) double _name = _value #define __NERD_Init_String(_name, _value) std::string _name = _value #define __NERD_EXCEPTION_PARAMETER NerdCore::VAR &e #define finally ; #define __NERD_Throw_Error(_err) NerdCore::VAR(NerdCore::VAR(_err) + NerdCore::VAR(", line: ") + std::to_string(__LINE__) + NerdCore::VAR(", file: ") + NerdCore::VAR(__FILE__)) #define __NERD_Boolean_TRUE __NERD_Create_Boolean(true) #define __NERD_Boolean_FALSE __NERD_Create_Boolean(false) #define __NERD_FAST_INT double #define __NERD_CreateMethodToClass(_name, _fn) __NERD_Object_Set(_name, __NERD_Create_Var_Scoped_Anon( return _fn(NerdCore::VAR& __NERD_THIS, __NERD_VARARGS, __NERD_VARLENGTH); ), &object); #define __NERD_NEW(_fn) ((NerdCore::Class::Function*)_fn.data.ptr)->New #define __NERD_Access_Struct(_exp, _name) (*(_name*)((NerdCore::Class::Struct*)_exp.data.ptr)->value) #define arguments() new NerdCore::Class::FixedArray(__NERD_VARARGS, __NERD_VARLENGTH); //#define __NERD_Native_Ptr(_var, _type) ((_type)((NerdCore::Class::NativeTPL<_type>*)_var.data.ptr)->value) #define __NERD_OBJECT(_var) ((NerdCore::Class::Object*)_var.data.ptr) #define __NERD_ARRAY(_var) ((NerdCore::Class::Array*)_var.data.ptr) #define __NERD_FUNCTION(_var) ((NerdCore::Class::Function*)_var.data.ptr) #define __NERD_BIND(_var, _function, _bind) _var = _function;((NerdCore::Class::Function*)_var.data.ptr)->bind = _bind; #define Prototype() __NERD_Create_Var_Scoped_Copy_Anon( return __NERD_THIS; ) ================================================ FILE: compiler/native/nerdcore/src/native/double.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ NerdCore::VAR operator+(double _i, NerdCore::VAR _v) { if(_v.type == NerdCore::Enum::Type::String) return __NERD_DOUBLE_TO_STRING(_i) + (std::string)_v; else return _i + (double)_v; } void operator+=(double& _i, NerdCore::VAR _v) { _i += (double)_v; } double operator-(double _i, NerdCore::VAR _v) { if(_v.type == NerdCore::Enum::Type::String) return std::numeric_limits::quiet_NaN(); return _i - (double)_v; } void operator-=(double& _i, NerdCore::VAR _v) { _i -= (double)_v; } double operator*(double _i, NerdCore::VAR _v) { if(_v.type == NerdCore::Enum::Type::String) return std::numeric_limits::quiet_NaN(); return _i * (double)_v; } void operator*=(double& _i, NerdCore::VAR _v) { _i *= (double)_v; } double operator/(double _i, NerdCore::VAR _v) { if(_v.type == NerdCore::Enum::Type::String) return std::numeric_limits::quiet_NaN(); return _i / (double)_v; } void operator/=(double& _i, NerdCore::VAR _v) { _i /= _v; } double operator%(double _i, NerdCore::VAR _v) { return (int)_i % (int)_v; } void operator%=(double& _i, NerdCore::VAR _v) { _i %= _v; } double operator==(double _i, NerdCore::VAR _v) { return _i == (double)_v; } double operator!=(double _i, NerdCore::VAR _v) { return _i != (double)_v; } double operator>(double _i, NerdCore::VAR _v) { return _i > (double)_v; } double operator>=(double _i, NerdCore::VAR _v) { return _i >= (double)_v; } double operator<(double _i, NerdCore::VAR _v) { return _i < (double)_v; } double operator<=(double _i, NerdCore::VAR _v) { return _i <= (double)_v; } ================================================ FILE: compiler/native/nerdcore/src/native/double_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ NerdCore::VAR operator+(double _i, NerdCore::VAR _v); void operator+=(double& _i, NerdCore::VAR _v); double operator-(double _i, NerdCore::VAR _v); void operator-=(double& _i, NerdCore::VAR _v); double operator*(double _i, NerdCore::VAR _v); void operator*=(double& _i, NerdCore::VAR _v); double operator/(double _i, NerdCore::VAR _v); void operator/=(double& _i, NerdCore::VAR _v); double operator%(double _i, NerdCore::VAR _v); void operator%=(double& _i, NerdCore::VAR _v); double operator==(double _i, NerdCore::VAR _v); double operator!=(double _i, NerdCore::VAR _v); double operator>(double _i, NerdCore::VAR _v); double operator>=(double _i, NerdCore::VAR _v); double operator<(double _i, NerdCore::VAR _v); double operator<=(double _i, NerdCore::VAR _v); ================================================ FILE: compiler/native/nerdcore/src/native/int.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ NerdCore::VAR operator+(int _i, NerdCore::VAR _v) { if(_v.type == NerdCore::Enum::Type::String) return __NERD_DOUBLE_TO_STRING(_i) + (std::string)_v; else return _i + (double)_v; } void operator+=(int& _i, NerdCore::VAR _v) { _i += (double)_v; } double operator-(int _i, NerdCore::VAR _v) { return _i - (double)_v; } void operator-=(int& _i, NerdCore::VAR _v) { _i -= (double)_v; } double operator*(int _i, NerdCore::VAR _v) { return _i * (double)_v; } void operator*=(int& _i, NerdCore::VAR _v) { _i *= _v; } double operator/(int _i, NerdCore::VAR _v) { return _i / (double)_v; } void operator/=(int& _i, NerdCore::VAR _v) { _i /= _v; } double operator%(int _i, NerdCore::VAR _v) { return (int)_i % (int)_v; } void operator%=(int& _i, NerdCore::VAR _v) { _i %= _v; } double operator==(int _i, NerdCore::VAR _v) { return _i == (double)_v; } double operator!=(int _i, NerdCore::VAR _v) { return _i != (double)_v; } double operator>(int _i, NerdCore::VAR _v) { return _i > (double)_v; } double operator>=(int _i, NerdCore::VAR _v) { return _i >= (double)_v; } double operator<(int _i, NerdCore::VAR _v) { return _i < (double)_v; } double operator<=(int _i, NerdCore::VAR _v) { return _i <= (double)_v; } ================================================ FILE: compiler/native/nerdcore/src/native/int_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ NerdCore::VAR operator+(int _i, NerdCore::VAR _v); void operator+=(int& _i, NerdCore::VAR _v); double operator-(int _i, NerdCore::VAR _v); void operator-=(int& _i, NerdCore::VAR _v); double operator*(int _i, NerdCore::VAR _v); void operator*=(int& _i, NerdCore::VAR _v); double operator/(int _i, NerdCore::VAR _v); void operator/=(int& _i, NerdCore::VAR _v); double operator%(int _i, NerdCore::VAR _v); void operator%=(int& _i, NerdCore::VAR _v); double operator==(int _i, NerdCore::VAR _v); double operator!=(int _i, NerdCore::VAR _v); double operator>(int _i, NerdCore::VAR _v); double operator>=(int _i, NerdCore::VAR _v); double operator<(int _i, NerdCore::VAR _v); double operator<=(int _i, NerdCore::VAR _v); ================================================ FILE: compiler/native/nerdcore/src/native.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "native/int.h" #include "native/double.h" ================================================ FILE: compiler/native/nerdcore/src/native_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "native/int_header.h" #include "native/double_header.h" ================================================ FILE: compiler/native/nerdcore/src/nerd.cpp ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "nerd.hpp" #include "functions.h" #include "native.h" #include "values.h" #include "class/number.h" #include "var.h" #include "objmgmt.h" #include "classes.h" #include "operator.h" #include "stdfn.h" ================================================ FILE: compiler/native/nerdcore/src/nerd.hpp ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #define _USE_MATH_DEFINES #include #include #include #include #include #include #include #include #include #include #include #define _USE_MATH_DEFINES #include #include #include #ifdef __NERD_ENV_ARDUINO #include #include #include #include #include #include #include #undef max #undef min #include #else #include #include #include #include #include #include #endif #include "enum.h" #include "macro.h" namespace NerdCore { struct VAR; namespace Class { class Base; class Undefined; class Boolean; class String; class Array; class Object; class Function; class Native; class Struct; class FixedArray; //template //class NativeTPL; } } // namespace NerdCore #include "type_header.h" #include "var_header.h" #include "values_header.h" #include "functions_header.h" #include "classes_header.h" #include "native_header.h" #include "class/number_header.h" #include "objmgmt_header.h" #include "operator_header.h" #include "stdfn_header.h" ================================================ FILE: compiler/native/nerdcore/src/objmgmt.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ NerdCore::VAR __NERD_delete(NerdCore::VAR _left, NerdCore::VAR _right) { if(_left.type == NerdCore::Enum::Type::Object) { ((NerdCore::Class::Object*)_left.data.ptr)->jsDelete(_right); return __NERD_Boolean_TRUE; } else if(_left.type == NerdCore::Enum::Type::Array) { ((NerdCore::Class::Array*)_left.data.ptr)->jsDelete(_right); return __NERD_Boolean_TRUE; } else if(_left.type == NerdCore::Enum::Type::Function) { ((NerdCore::Class::Function*)_left.data.ptr)->jsDelete(_right); return __NERD_Boolean_TRUE; } return __NERD_Boolean_FALSE; } /*** ***/ #ifndef __NERD__OBJECT_VECTOR NerdCore::VAR __NERD_Object_Set(std::string _index, NerdCore::VAR _value, NerdCore::Type::object_t *_obj) { if (_value.type == NerdCore::Enum::Type::String) { (*_obj)[_index] = new NerdCore::Class::String((std::string)_value); } else { (*_obj)[_index].data.ptr = _value.data.ptr; } return NerdCore::Global::null; } #else NerdCore::VAR __NERD_Object_Set(std::string _index, NerdCore::VAR _value, NerdCore::Type::object_t *_obj) { int _j = (*_obj).size(); for (int _i = 0; _i < _j; _i++) { if (_index.compare((*_obj)[_i].first) == 0) { if (_value.type == NerdCore::Enum::Type::String) { (*_obj)[_i].second = new NerdCore::Class::String((std::string)_value); } else { (*_obj)[_i].second.data.ptr = _value.data.ptr; } return NerdCore::Global::null; } } (*_obj).push_back(NerdCore::Type::pair_t(_index, _value)); return NerdCore::Global::null; } #endif /**/ NerdCore::VAR __NERD_Object_Set(NerdCore::VAR _index, NerdCore::VAR _value, NerdCore::VAR _array) { if (_array.type == NerdCore::Enum::Type::Array && _index.type == NerdCore::Enum::Type::Number) { if (((NerdCore::Class::Array*)_array.data.ptr)->value.size() <= (int)_index.data.number) { ((NerdCore::Class::Array*)_array.data.ptr)->value.resize( (int)_index.data.number + 1); } ((NerdCore::Class::Array*)_array.data.ptr)->value.at( (int)_index.data.number ) = _value; return NerdCore::Global::null; } else if (_array.type == NerdCore::Enum::Type::Object || _array.type == NerdCore::Enum::Type::String || _array.type == NerdCore::Enum::Type::Function || _array.type == NerdCore::Enum::Type::Array || _array.type == NerdCore::Enum::Type::Native) { NerdCore::Type::object_t *_obj; if (_array.type == NerdCore::Enum::Type::Object) _obj = &((NerdCore::Class::Object*)_array.data.ptr)->object; else return NerdCore::Global::null; return __NERD_Object_Set((std::string)_index, _value, _obj); } return NerdCore::Global::null; } /* typeof */ const std::string _array[] = {"null", "boolean", "number", "string", "native", "native", "struct", "fixed_array", "array", "object", "function" }; std::string type_of(NerdCore::Global::var _var) { return _array[_var.type]; } std::string typeof(NerdCore::Global::var _var) { return _array[_var.type]; } ================================================ FILE: compiler/native/nerdcore/src/objmgmt_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ NerdCore::VAR __NERD_delete(NerdCore::VAR _left, NerdCore::VAR _right); NerdCore::VAR __NERD_Object_Set(std::string _index, NerdCore::VAR _value, NerdCore::Type::object_t *_obj); NerdCore::VAR __NERD_Object_Set(NerdCore::VAR _index, NerdCore::VAR _value, NerdCore::VAR _array); std::string type_of(NerdCore::Global::var _var); std::string typeof(NerdCore::Global::var _var); /* inline NerdCore::Global::var Object() { return NerdCore::VAR((NerdCore::Class::Object *)new NerdCore::Class::Object()); } */ /* inline NerdCore::Global::var Object(NerdCore::Type::object_t _obj) { return new NerdCore::Class::Object(_obj); } */ inline NerdCore::Global::var NewArray() { return new NerdCore::Class::Array(); } inline NerdCore::Global::var FixedArray() { return new NerdCore::Class::FixedArray(); } inline NerdCore::Global::var FixedArray(NerdCore::Global::var _length) { return new NerdCore::Class::FixedArray(_length); } inline NerdCore::Global::var FixedArray(int _length) { return new NerdCore::Class::FixedArray(_length); } ================================================ FILE: compiler/native/nerdcore/src/operator.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ NerdCore::VAR operator+ (const char* _left, const NerdCore::VAR &_right) { return NerdCore::VAR(_left) + _right; } NerdCore::VAR operator+ (std::string _left, const NerdCore::VAR &_right) { return NerdCore::VAR(_left) + _right; } NerdCore::VAR operator* (const char* _left, const NerdCore::VAR &_right) { return NerdCore::Global::NaN; } NerdCore::VAR operator* (std::string _left, const NerdCore::VAR &_right) { return NerdCore::Global::NaN; } NerdCore::VAR operator- (const char* _left, const NerdCore::VAR &_right) { return NerdCore::Global::NaN; } NerdCore::VAR operator- (std::string _left, const NerdCore::VAR &_right) { return NerdCore::Global::NaN; } NerdCore::VAR operator/ (const char* _left, const NerdCore::VAR &_right) { return NerdCore::Global::NaN; } NerdCore::VAR operator/ (std::string _left, const NerdCore::VAR &_right) { return NerdCore::Global::NaN; } /*** operator== ***/ NerdCore::VAR operator== (NerdCore::VAR _left, int right) { return (double)_left == right; } NerdCore::VAR operator== (NerdCore::VAR _left, double right) { return (double)_left == right; } NerdCore::VAR operator== (NerdCore::VAR _left, std::string right) { return (std::string)_left == right; } NerdCore::VAR operator== (NerdCore::VAR _left, const char* right) { return (std::string)_left == std::string(right); } /* end operator== */ /*** operator!= ***/ NerdCore::VAR operator!= (NerdCore::VAR _left, int right) { return (double)_left != right; } NerdCore::VAR operator!= (NerdCore::VAR _left, double right) { return (double)_left != right; } NerdCore::VAR operator!= (NerdCore::VAR _left, std::string right) { return (std::string)_left != right; } NerdCore::VAR operator!= (NerdCore::VAR _left, const char* right) { return (std::string)_left != std::string(right); } /* end operator!= */ /*** operator| ***/ NerdCore::VAR operator| (NerdCore::VAR _left, int right) { return (int)_left | right; } NerdCore::VAR operator| (NerdCore::VAR _left, double right) { return (int)_left | (int)right; } NerdCore::VAR operator| (NerdCore::VAR _left, std::string right) { return (double)_left; } NerdCore::VAR operator| (NerdCore::VAR _left, const char* right) { return (double)_left; } /* end operator| */ /*** operator^ ***/ NerdCore::VAR operator^ (NerdCore::VAR _left, int right) { return (int)_left ^ right; } NerdCore::VAR operator^ (NerdCore::VAR _left, double right) { return (int)_left ^ (int)right; } NerdCore::VAR operator^ (NerdCore::VAR _left, std::string right) { return (double)_left; } NerdCore::VAR operator^ (NerdCore::VAR _left, const char* right) { return (double)_left; } /* end operator^ */ /*** operator& ***/ NerdCore::VAR operator& (NerdCore::VAR _left, int right) { return (int)_left & right; } NerdCore::VAR operator& (NerdCore::VAR _left, double right) { return (int)_left & (int)right; } NerdCore::VAR operator& (NerdCore::VAR _left, std::string right) { return (double)_left; } NerdCore::VAR operator& (NerdCore::VAR _left, const char* right) { return (double)_left; } /* end operator& */ /*** operator< ** inline NerdCore::VAR operator< (NerdCore::VAR _left, int right) { return _left.data.number < right; } inline NerdCore::VAR operator< (NerdCore::VAR _left, double right) { return _left.data.number < right; } */ NerdCore::VAR operator< (NerdCore::VAR _left, std::string right) { return (std::string)_left < right; } NerdCore::VAR operator< (NerdCore::VAR _left, const char* right) { return (std::string)_left < std::string(right); } /* end operator< */ /*** operator<< ***/ NerdCore::VAR operator<< (NerdCore::VAR _left, int right) { return (int)_left << right; } NerdCore::VAR operator<< (NerdCore::VAR _left, double right) { return (int)_left << (int)right; } NerdCore::VAR operator<< (NerdCore::VAR _left, std::string right) { return (std::string)_left << right; } NerdCore::VAR operator<< (NerdCore::VAR _left, const char* right) { return (std::string)_left << std::string(right); } /* end operator<< */ /*** operator>= ***/ NerdCore::VAR operator<= (NerdCore::VAR _left, std::string right) { return (std::string)_left <= right; } NerdCore::VAR operator<= (NerdCore::VAR _left, const char* right) { return (std::string)_left < std::string(right); } /* end operator<= */ /*** operator> ***/ NerdCore::VAR operator> (NerdCore::VAR _left, std::string right) { return (std::string)_left > right; } NerdCore::VAR operator> (NerdCore::VAR _left, const char* right) { return (std::string)_left > std::string(right); } /* end operator> */ /*** operator>> ***/ NerdCore::VAR operator>> (NerdCore::VAR _left, int right) { return (int)_left >> right; } NerdCore::VAR operator>> (NerdCore::VAR _left, double right) { return (int)_left >> (int)right; } NerdCore::VAR operator>> (NerdCore::VAR _left, std::string right) { return (std::string)_left >> right; } NerdCore::VAR operator>> (NerdCore::VAR _left, const char* right) { return (std::string)_left >> std::string(right); } /* end operator>> */ /*** operator>= ***/ NerdCore::VAR operator>= (NerdCore::VAR _left, std::string right) { return (std::string)_left >= right; } NerdCore::VAR operator>= (NerdCore::VAR _left, const char* right) { return (std::string)_left > std::string(right); } /* end operator>= */ NerdCore::VAR __NERD_Boolean_Result(NerdCore::VAR _v) { if (_v.type == NerdCore::Enum::Type::Number) return _v.data.number; else if (_v.type == NerdCore::Enum::Type::Boolean) return _v.data.number; else if (_v.type == NerdCore::Enum::Type::String) { if (strlen(((NerdCore::Class::String*)_v.data.ptr)->value.c_str()) > 0) return true; else return false; } else if (_v.type == NerdCore::Enum::Type::Array) return true; else return false; } std::string __NERD_DOUBLE_TO_STRING(double _var) { std::ostringstream strout ; strout << std::fixed << std::setprecision(14) << _var; std::string str = strout.str() ; size_t end = str.find_last_not_of( '0' ) + 1 ; str = str.erase( end ) ; end = str.find_last_not_of( '.' ) + 1 ; str = str.erase( end ) ; int exp = str.length(); if(exp > 21) { std::string first = str.substr(0, 1); std::string second = str.substr(1, 15); str = first + "." + second + "e+" + std::to_string(exp-1); } return str; } std::ostream &operator<<(std::ostream &os, const NerdCore::VAR &_v) { switch (_v.type) { case NerdCore::Enum::Type::Boolean: if(_v.data.number) os << "true"; else os << "false"; break; case NerdCore::Enum::Type::Number: os << std::setprecision(14) << _v.data.number; break; case NerdCore::Enum::Type::String: os << (std::string)(*(NerdCore::Class::String*)_v.data.ptr); break; case NerdCore::Enum::Type::Object: os << __NERD_Object_Stringify(_v); break; case NerdCore::Enum::Type::FixedArray: os << __NERD_Object_Stringify(_v); break; case NerdCore::Enum::Type::Array: os << __NERD_Object_Stringify(_v); break; case NerdCore::Enum::Type::Struct: os << (std::string)(*(NerdCore::Class::Struct*)_v.data.ptr); break; case NerdCore::Enum::Type::Native: os << (std::string)(*(NerdCore::Class::Native*)_v.data.ptr); break; case NerdCore::Enum::Type::Function: os << (std::string)(*(NerdCore::Class::Function*)_v.data.ptr); break; case NerdCore::Enum::Type::Null: os << "null"; break; default: os << "null"; break; } return os; } NerdCore::VAR parseInt(NerdCore::VAR _str) { if (_str.type == NerdCore::Enum::Type::String) { #ifdef __NERD_ENV_ARDUINO return NerdCore::Global::null; #else return __NERD_Create_Number((double)(*(NerdCore::Class::String*)_str.data.ptr)); #endif } else return NerdCore::Global::null; } NerdCore::VAR __NERD_Log_Console(NerdCore::VAR _var) { #ifdef __NERD_ENV_ARDUINO #else std::cout << _var; std::cout << std::endl; #endif return NerdCore::Global::null; } NerdCore::VAR __NERD_Log_Console(NerdCore::VAR* _var, int _length) { #ifdef __NERD_ENV_ARDUINO #else bool first = false; for(int i = 0; i < _length; i++) { if(first) std::cout << " "; std::cout << _var[i]; if(!first) first = true; } std::cout << std::endl; #endif return NerdCore::Global::null; } NerdCore::VAR __NERD_Object_Keys(NerdCore::VAR _var) { NerdCore::VAR _res = new NerdCore::Class::Array(); if (_var.type != NerdCore::Enum::Type::Object && _var.type != NerdCore::Enum::Type::Array) { return _res; } if(_var.type == NerdCore::Enum::Type::Array) { NerdCore::Type::vector_t *_arr = &((NerdCore::Class::Array*)_var.data.ptr)->value; int _j = (*_arr).size(); for (int _i = 0; _i < _j; _i++) { _res[_i] = std::to_string(_i); } } else { NerdCore::Type::object_t *_obj; if(_var.type == NerdCore::Enum::Type::Object) _obj = &((NerdCore::Class::Object*)_var.data.ptr)->object; #ifndef __NERD__OBJECT_VECTOR int _k = 0; for (auto _el: *_obj) { _res[_k] = _el.first; _k++; } #else int _j = (*_obj).size(); for (int _k = 0; _k < _j; _k++) { _res[_k] = (*_obj)[_k].first; } #endif } return _res; } NerdCore::VAR __NERD_Object_Stringify(NerdCore::VAR _var) { return __NERD_Object_Stringify(_var, true); } NerdCore::VAR __NERD_Object_Stringify(NerdCore::VAR _var, bool _bracket) { NerdCore::Enum::Type _t = _var.type; if (_t == NerdCore::Enum::Type::Number) { return "\e[33m" + _var + "\e[0m"; } else if (_t == NerdCore::Enum::Type::String) { return "\e[32m'" + ((NerdCore::Class::String*)_var.data.ptr)->value + "'\e[0m"; } else if (_t == NerdCore::Enum::Type::Function) { return "'" + (std::string)(*(NerdCore::Class::Function*)_var.data.ptr) + "'"; } else if (_t == NerdCore::Enum::Type::FixedArray) { NerdCore::VAR _res = ""; NerdCore::VAR *_arr = ((NerdCore::Class::FixedArray*)_var.data.ptr)->value; if(_bracket) _res += " [ "; int j = ((NerdCore::Class::FixedArray*)_var.data.ptr)->length; int k = 0; int l = 0; for (int i = 0; i < j; i++) { if (l > 0) _res += ", "; if(k > 0) { if(k == 1) _res += "\e[90m<1 empty item>\e[0m, "; else _res += "\e[90m<" + std::to_string(k) + " empty items>\e[0m, "; k = 0; } _res += __NERD_Object_Stringify((*_arr)[i], _bracket); l++; } if(k > 0) { if (l > 0) _res += ", "; if(k == 1) _res += "\e[90m<1 empty item>\e[0m"; else _res += "\e[90m<" + std::to_string(k) + " empty items>\e[0m"; l++; } if(_bracket) _res += " ] "; return _res; } else if (_t == NerdCore::Enum::Type::Array) { NerdCore::VAR _res = NerdCore::Global::var(""); NerdCore::Type::vector_t *_arr = &((NerdCore::Class::Array*)_var.data.ptr)->value; if(_bracket) _res += " [ "; int j = (*_arr).size(); int k = 0; int l = 0; for (int i = 0; i < j; i++) { if (l > 0) _res += ", "; if(k > 0) { if(k == 1) _res += "\e[90m<1 empty item>\e[0m, "; else _res += "\e[90m<" + std::to_string(k) + " empty items>\e[0m, "; k = 0; } NerdCore::Global::var test = _res += __NERD_Object_Stringify((*_arr)[i], _bracket); l++; } if(k > 0) { if (l > 0) _res += ", "; if(k == 1) _res += "\e[90m<1 empty item>\e[0m"; else _res += "\e[90m<" + std::to_string(k) + " empty items>\e[0m"; l++; } if(_bracket) _res += " ] "; return _res; } else if (_t == NerdCore::Enum::Type::Object) { NerdCore::VAR _res = ""; NerdCore::Type::object_t *_obj = &((NerdCore::Class::Object*)_var.data.ptr)->object; _res = "{"; #ifndef __NERD__OBJECT_VECTOR int _i = 0; int _comma = 0; for (auto _el: *_obj) { if(_el.second.type != NerdCore::Enum::Type::Null && _el.first != "__proto__" && _el.first != "prototype") { if (_comma > 0) _res += ", "; _res += NerdCore::VAR("\"") + _el.first + "\""; _res += ":"; _res += __NERD_Object_Stringify(_el.second); _comma++; } _i++; } #else int j = (*_obj).size(); for (int _i = 0; _i < j; _i++) { if (_i > 0) _res += ", "; _res += NerdCore::VAR("\"") + (*_obj)[_i].first + "\""; _res += ":"; _res += __NERD_Object_Stringify((*_obj)[_i].second); } #endif _res += "}"; return _res; } else return ""; } NerdCore::VAR __NERD_Object_Clone(NerdCore::VAR& _var) { NerdCore::Enum::Type _t = _var.type; switch(_t) { case NerdCore::Enum::Type::Null: case NerdCore::Enum::Type::Number: case NerdCore::Enum::Type::String: case NerdCore::Enum::Type::Function: return _var; case NerdCore::Enum::Type::Array: { NerdCore::VAR _res = new NerdCore::Class::Array(); std::vector *_arr = &((NerdCore::Class::Array*)_var.data.ptr)->value; int j = (*_arr).size(); for (int i = 0; i < j; i++) { _res[i] = __NERD_Object_Clone((*_arr)[i]); } return _res; } case NerdCore::Enum::Type::Object: { const NerdCore::VAR _res = new NerdCore::Class::Object(); NerdCore::Type::object_t *_obj = &((NerdCore::Class::Object*)_var.data.ptr)->object; #ifndef __NERD__OBJECT_VECTOR for (auto _el: *_obj) { _res[_el.first] = __NERD_Object_Clone(_el.second); } #else int j = (*_obj).size(); for (int _i = 0; _i < j; _i++) { _res[(*_obj)[_i].first] = __NERD_Object_Clone((*_obj)[_i].second); } #endif return _res; } default: return NerdCore::Global::null; } } void __NERD_Object_Construct(NerdCore::VAR _this, NerdCore::VAR _prototype) { if(_this.type == NerdCore::Enum::Type::Object && _prototype.type == NerdCore::Enum::Type::Object) { NerdCore::Type::object_t *_obj = &((NerdCore::Class::Object*)_prototype.data.ptr)->object; #ifndef __NERD__OBJECT_VECTOR for (auto _el: *_obj) { NerdCore::VAR _tmp = _this[_el.first]; if(_tmp.type == NerdCore::Enum::Type::Null) { _this[_el.first] = _el.second; } } #else int j = (*_obj).size(); for (int _i = 0; _i < j; _i++) { NerdCore::VAR _tmp = _this[(*_obj)[_i].first]; if(_tmp.type == NerdCore::Enum::Type::Null) { _this[(*_obj)[_i].first] = (*_obj)[_i].second; } } #endif } } NerdCore::VAR __NERD_CREATE_Function(void *_fn) { return NerdCore::VAR(NerdCore::Enum::Type::Function, _fn); } NerdCore::VAR __NERD_Create_Native(void *_native) { return NerdCore::VAR(NerdCore::Enum::Type::Null, _native); } void *__NERD_Get_Native(NerdCore::VAR _native) { return ((NerdCore::Class::Function*)_native.data.ptr); } __NERD_Create_Lambda(__IMPL_EVAL) { __NERD_Log_Console("eval not implemented, return NerdCore::Global::null"); return NerdCore::VAR(); }); NerdCore::VAR eval = __NERD_Create_Function(__IMPL_EVAL); std::function *__NERD_IS_NAN = new std::function([](NerdCore::Type::vector_t _Nerd_VARARGS) { NerdCore::VAR _test; if (_Nerd_VARARGS.size() > 0) _test = _Nerd_VARARGS[0]; else return __NERD_Create_Boolean(0); if (_test.type == NerdCore::Enum::Type::Number) { return __NERD_Create_Boolean(1); } return __NERD_Create_Boolean(0); }); NerdCore::VAR isNaN = NerdCore::VAR(NerdCore::Enum::Type::Function, __NERD_IS_NAN); NerdCore::VAR __NERD_EQUAL_VALUE_AND_TYPE(NerdCore::VAR _left, NerdCore::VAR _right) { if (_left.type == _right.type && (NerdCore::VAR)_left == (NerdCore::VAR)_right) { return __NERD_Create_Boolean(1); } return __NERD_Create_Boolean(0); } NerdCore::VAR __NERD_NOT_EQUAL_VALUE_AND_TYPE(NerdCore::VAR _left, NerdCore::VAR _right) { if (_left.type != _right.type || (bool)(_left != _right)) { return __NERD_Create_Boolean(1); } return __NERD_Create_Boolean(0); } NerdCore::VAR operator+ (NerdCore::VAR _left, int right) { if (_left.type == NerdCore::Enum::Type::String) return (std::string)_left + __NERD_DOUBLE_TO_STRING(right); else return (double)_left + right; } NerdCore::VAR operator+ (NerdCore::VAR _left, double right) { if (_left.type == NerdCore::Enum::Type::String) return (std::string)_left + __NERD_DOUBLE_TO_STRING(right); else return (double)_left + right; } NerdCore::VAR operator+ (NerdCore::VAR _left, const char* right) { return (std::string)_left + std::string(right); } void operator+= (NerdCore::VAR& _left, std::string right) { std::string _str = (std::string)_left; _str += right; _left = _str; } void operator+= (NerdCore::VAR& _left, const char* right) { std::string _str = (std::string)_left; _str += right; _left = _str; } void operator+= (NerdCore::VAR& _left, int right) { if(_left.type == NerdCore::Enum::Type::Number) _left.data.number += right; else { std::string _str = (std::string)_left; _str += right; _left = _str; } } void operator+= (NerdCore::VAR& _left, double right) { if(_left.type == NerdCore::Enum::Type::Number) _left.data.number += right; else { std::string _str = (std::string)_left; _str += right; _left.data.ptr = new NerdCore::Class::String(_str); _left.type = NerdCore::Enum::Type::String; } } NerdCore::VAR operator|| (NerdCore::VAR _left, int right) { if(_left.type != NerdCore::Enum::Type::Null) return _left; else return right; } NerdCore::VAR operator|| (NerdCore::VAR _left, double right) { if(_left.type != NerdCore::Enum::Type::Null) return _left; else return right; } NerdCore::VAR operator|| (NerdCore::VAR _left, std::string right) { if(_left.type != NerdCore::Enum::Type::Null) return _left; else return right; } NerdCore::VAR operator|| (NerdCore::VAR _left, const char* right) { if(_left.type != NerdCore::Enum::Type::Null) return _left; else return right; } /*** op* ***/ NerdCore::VAR operator* (NerdCore::VAR _left, int right) { return (double)_left * right; } NerdCore::VAR operator* (NerdCore::VAR _left, double right) { return (double)_left * right; } NerdCore::VAR operator* (NerdCore::VAR _left, std::string right) { return (double)_left * (double)(NerdCore::VAR(right)); } NerdCore::VAR operator* (NerdCore::VAR _left, const char* right) { return (double)_left * (double)(NerdCore::VAR(right)); } /* end op* */ /*** op- ***/ NerdCore::VAR operator- (NerdCore::VAR _left, int right) { return (double)_left - right; } NerdCore::VAR operator- (NerdCore::VAR _left, double right) { return (double)_left - right; } NerdCore::VAR operator- (NerdCore::VAR _left, std::string right) { return (double)_left - (double)(NerdCore::VAR(right)); } NerdCore::VAR operator- (NerdCore::VAR _left, const char* right) { return (double)_left - (double)(NerdCore::VAR(right)); } /* end op- */ /*** op/ ***/ NerdCore::VAR operator/ (NerdCore::VAR _left, int right) { return (double)_left / right; } NerdCore::VAR operator/ (NerdCore::VAR _left, double right) { return (double)_left / right; } NerdCore::VAR operator/ (NerdCore::VAR _left, std::string right) { return (double)_left / (double)(NerdCore::VAR(right)); } NerdCore::VAR operator/ (NerdCore::VAR _left, const char* right) { return (double)_left / (double)(NerdCore::VAR(right)); } /* end op/ */ /*** op% ***/ NerdCore::VAR operator% (NerdCore::VAR _left, int right) { return (int)_left % right; } NerdCore::VAR operator% (NerdCore::VAR _left, double right) { return (int)_left % (int)right; } NerdCore::VAR operator% (NerdCore::VAR _left, std::string right) { return (int)_left % (int)(NerdCore::VAR(right)); } NerdCore::VAR operator% (NerdCore::VAR _left, const char* right) { return (int)_left % (int)(NerdCore::VAR(right)); } /* end op% */ ================================================ FILE: compiler/native/nerdcore/src/operator_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifdef __NERD_ENV_ARDUINO bool operator==(std::string_view sw, const char* c) { return sw == std::string_view(c); } bool operator!=(std::string_view sw, const char* c) { return sw != std::string_view(c); } #else constexpr bool operator==(std::string_view sw, const char* c) { return sw == std::string_view(c); } constexpr bool operator!=(std::string_view sw, const char* c) { return sw != std::string_view(c); } #endif NerdCore::VAR __NERD_Boolean_Result(NerdCore::VAR _v); std::string __NERD_DOUBLE_TO_STRING(double _var); std::ostream &operator<<(std::ostream &os, const NerdCore::VAR &_v); NerdCore::VAR parseInt(NerdCore::VAR _str); NerdCore::VAR __NERD_Log_Console(NerdCore::VAR _var); NerdCore::VAR __NERD_Log_Console(NerdCore::VAR* _var, int _length); NerdCore::VAR __NERD_Object_Keys(NerdCore::VAR _var); NerdCore::VAR __NERD_Object_Stringify(NerdCore::VAR _var); NerdCore::VAR __NERD_Object_Stringify(NerdCore::VAR _var, bool _bracket); NerdCore::VAR __NERD_Object_Clone(NerdCore::VAR& _var); void __NERD_Object_Construct(NerdCore::VAR _this, NerdCore::VAR _prototype); NerdCore::VAR __NERD_CREATE_Function(void *_fn); NerdCore::VAR __NERD_Create_Native(void *_native); void *__NERD_Get_Native(NerdCore::VAR _native); /*** REDIFINING STD OPERATORS ***/ NerdCore::VAR operator+ (const char* _left, const NerdCore::VAR &_right); NerdCore::VAR operator+ (std::string _left, const NerdCore::VAR &_right); NerdCore::VAR operator- (const char* _left, const NerdCore::VAR &_right); NerdCore::VAR operator- (std::string _left, const NerdCore::VAR &_right); NerdCore::VAR operator* (const char* _left, const NerdCore::VAR &_right); NerdCore::VAR operator* (std::string _left, const NerdCore::VAR &_right); NerdCore::VAR operator/ (const char* _left, const NerdCore::VAR &_right); NerdCore::VAR operator/ (std::string _left, const NerdCore::VAR &_right); inline bool operator< (NerdCore::VAR _left, const int right) noexcept { return _left.data.number < right; } inline bool operator< (NerdCore::VAR _left, const long long int right) noexcept { return _left.data.number < right; } inline bool operator< (NerdCore::VAR _left, const double right) noexcept { return _left.data.number < right; } NerdCore::VAR operator< (NerdCore::VAR _left, std::string right); NerdCore::VAR operator< (NerdCore::VAR _left, const char* right); inline bool operator<= (NerdCore::VAR _left, const int right) noexcept { return _left.data.number <= right; } inline bool operator<= (NerdCore::VAR _left, const long long int right) noexcept { return _left.data.number <= right; } inline bool operator<= (NerdCore::VAR _left, const double right) noexcept { return _left.data.number <= right; } NerdCore::VAR operator<= (NerdCore::VAR _left, std::string right); NerdCore::VAR operator<= (NerdCore::VAR _left, const char* right); inline bool operator> (NerdCore::VAR _left, const int right) noexcept { return _left.data.number > right; } inline bool operator> (NerdCore::VAR _left, const long long int right) noexcept { return _left.data.number > right; } inline bool operator> (NerdCore::VAR _left, const double right) noexcept { return _left.data.number > right; } NerdCore::VAR operator> (NerdCore::VAR _left, std::string right); NerdCore::VAR operator> (NerdCore::VAR _left, const char* right); inline const bool operator>= (NerdCore::VAR _left, const int right) noexcept { return _left.data.number >= right; } inline bool operator>= (NerdCore::VAR _left, const long long int right) noexcept { return _left.data.number >= right; } inline bool operator>= (NerdCore::VAR _left, const double right) noexcept { return _left.data.number >= right; } NerdCore::VAR operator>= (NerdCore::VAR _left, std::string right); NerdCore::VAR operator>= (NerdCore::VAR _left, const char* right); /*** END REDIFINING STD OPERATORS ***/ extern NerdCore::VAR eval; extern std::function *__NERD_IS_NAN; extern NerdCore::VAR isNaN; NerdCore::VAR __NERD_EQUAL_VALUE_AND_TYPE(NerdCore::VAR _left, NerdCore::VAR _right); NerdCore::VAR __NERD_NOT_EQUAL_VALUE_AND_TYPE(NerdCore::VAR _left, NerdCore::VAR _right); NerdCore::VAR operator+ (NerdCore::VAR _left, int right); NerdCore::VAR operator+ (NerdCore::VAR _left, double right); void operator+= (NerdCore::VAR& _left, std::string right); void operator+= (NerdCore::VAR& _left, const char* right); void operator+= (NerdCore::VAR& _left, int right); void operator+= (NerdCore::VAR& _left, double right); NerdCore::VAR operator* (NerdCore::VAR _left, int right); NerdCore::VAR operator* (NerdCore::VAR _left, double right); NerdCore::VAR operator* (NerdCore::VAR _left, std::string right); NerdCore::VAR operator* (NerdCore::VAR _left, const char* right); NerdCore::VAR operator- (NerdCore::VAR _left, int right); NerdCore::VAR operator- (NerdCore::VAR _left, double right); NerdCore::VAR operator- (NerdCore::VAR _left, std::string right); NerdCore::VAR operator- (NerdCore::VAR _left, const char* right); NerdCore::VAR operator/ (NerdCore::VAR _left, int right); NerdCore::VAR operator/ (NerdCore::VAR _left, double right); NerdCore::VAR operator/ (NerdCore::VAR _left, std::string right); NerdCore::VAR operator/ (NerdCore::VAR _left, const char* right); NerdCore::VAR operator% (NerdCore::VAR _left, int right); NerdCore::VAR operator% (NerdCore::VAR _left, double right); NerdCore::VAR operator% (NerdCore::VAR _left, std::string right); NerdCore::VAR operator% (NerdCore::VAR _left, const char* right); NerdCore::VAR operator|| (NerdCore::VAR _left, int right); NerdCore::VAR operator|| (NerdCore::VAR _left, double right); NerdCore::VAR operator|| (NerdCore::VAR _left, std::string right); NerdCore::VAR operator|| (NerdCore::VAR _left, const char* right); NerdCore::VAR operator== (NerdCore::VAR _left, int right); NerdCore::VAR operator== (NerdCore::VAR _left, double right); NerdCore::VAR operator== (NerdCore::VAR _left, std::string right); NerdCore::VAR operator== (NerdCore::VAR _left, const char* right); NerdCore::VAR operator!= (NerdCore::VAR _left, int right); NerdCore::VAR operator!= (NerdCore::VAR _left, double right); NerdCore::VAR operator!= (NerdCore::VAR _left, std::string right); NerdCore::VAR operator!= (NerdCore::VAR _left, const char* right); NerdCore::VAR operator| (NerdCore::VAR _left, int right); NerdCore::VAR operator| (NerdCore::VAR _left, double right); NerdCore::VAR operator| (NerdCore::VAR _left, std::string right); NerdCore::VAR operator| (NerdCore::VAR _left, const char* right); NerdCore::VAR operator^ (NerdCore::VAR _left, int right); NerdCore::VAR operator^ (NerdCore::VAR _left, double right); NerdCore::VAR operator^ (NerdCore::VAR _left, std::string right); NerdCore::VAR operator^ (NerdCore::VAR _left, const char* right); NerdCore::VAR operator& (NerdCore::VAR _left, int right); NerdCore::VAR operator& (NerdCore::VAR _left, double right); NerdCore::VAR operator& (NerdCore::VAR _left, std::string right); NerdCore::VAR operator& (NerdCore::VAR _left, const char* right); NerdCore::VAR operator<< (NerdCore::VAR _left, int right); NerdCore::VAR operator<< (NerdCore::VAR _left, double right); NerdCore::VAR operator<< (NerdCore::VAR _left, std::string right); NerdCore::VAR operator<< (NerdCore::VAR _left, const char* right); NerdCore::VAR operator>> (NerdCore::VAR _left, int right); NerdCore::VAR operator>> (NerdCore::VAR _left, double right); NerdCore::VAR operator>> (NerdCore::VAR _left, std::string right); NerdCore::VAR operator>> (NerdCore::VAR _left, const char* right); ================================================ FILE: compiler/native/nerdcore/src/stdfn.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ namespace NerdCore::Functions { NerdCore::VAR println() { #ifndef __NERD_ENV_ARDUINO std::cout << std::endl; #endif return NerdCore::Global::null; } NerdCore::VAR println(NerdCore::VAR _var) { #ifndef __NERD_ENV_ARDUINO std::cout << _var << std::endl; #endif return NerdCore::Global::null; } NerdCore::VAR print() { return NerdCore::Global::null; } NerdCore::VAR print(NerdCore::VAR _var) { #ifndef __NERD_ENV_ARDUINO std::cout << _var; #endif return NerdCore::Global::null; } } // no namespace NerdCore::VAR length_of(NerdCore::VAR _var) { switch( _var.type) { case NerdCore::Enum::Type::Null: return 0; break; case NerdCore::Enum::Type::Boolean: return 1; break; case NerdCore::Enum::Type::Number: return 1; break; case NerdCore::Enum::Type::String: return (double)((std::string)_var).size(); break; case NerdCore::Enum::Type::Array: return (double)((NerdCore::Class::Array*)_var.data.ptr)->Size(); break; case NerdCore::Enum::Type::FixedArray: return (double)((NerdCore::Class::FixedArray*)_var.data.ptr)->length; break; case NerdCore::Enum::Type::Object: return (double)((NerdCore::Class::Object*)_var.data.ptr)->Size(); break; case NerdCore::Enum::Type::Native: return (double)((NerdCore::Class::Native*)_var.data.ptr)->length; break; default: return 0; break; } return 0; } NerdCore::VAR size_of(NerdCore::VAR _var) { return (double)sizeof(_var); } ================================================ FILE: compiler/native/nerdcore/src/stdfn_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ namespace NerdCore::Functions { NerdCore::VAR println(); NerdCore::VAR println(NerdCore::VAR _var); NerdCore::VAR print(); NerdCore::VAR print(NerdCore::VAR _var); } // no namespace NerdCore::VAR length_of(NerdCore::VAR _var); NerdCore::VAR size_of(NerdCore::VAR _var); ================================================ FILE: compiler/native/nerdcore/src/tsl/robin_growth_policy.h ================================================ /** * MIT License * * Copyright (c) 2017 Thibaut Goetghebuer-Planchon * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifndef TSL_ROBIN_GROWTH_POLICY_H #define TSL_ROBIN_GROWTH_POLICY_H #include #include #include #include #include #include #include #include #include #include #ifdef TSL_DEBUG #define tsl_rh_assert(expr) assert(expr) #else #define tsl_rh_assert(expr) (static_cast(0)) #endif /** * If exceptions are enabled, throw the exception passed in parameter, otherwise * call std::terminate. */ #if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || \ (defined(_MSC_VER) && defined(_CPPUNWIND))) && \ !defined(TSL_NO_EXCEPTIONS) #define TSL_RH_THROW_OR_TERMINATE(ex, msg) throw ex(msg) #else #define TSL_RH_NO_EXCEPTIONS #ifdef TSL_DEBUG #include #define TSL_RH_THROW_OR_TERMINATE(ex, msg) \ do { \ std::cerr << msg << std::endl; \ std::terminate(); \ } while (0) #else #define TSL_RH_THROW_OR_TERMINATE(ex, msg) std::terminate() #endif #endif #if defined(__GNUC__) || defined(__clang__) #define TSL_RH_LIKELY(exp) (__builtin_expect(!!(exp), true)) #else #define TSL_RH_LIKELY(exp) (exp) #endif #define TSL_RH_UNUSED(x) static_cast(x) namespace tsl { namespace rh { /** * Grow the hash table by a factor of GrowthFactor keeping the bucket count to a * power of two. It allows the table to use a mask operation instead of a modulo * operation to map a hash to a bucket. * * GrowthFactor must be a power of two >= 2. */ template class power_of_two_growth_policy { public: /** * Called on the hash table creation and on rehash. The number of buckets for * the table is passed in parameter. This number is a minimum, the policy may * update this value with a higher value if needed (but not lower). * * If 0 is given, min_bucket_count_in_out must still be 0 after the policy * creation and bucket_for_hash must always return 0 in this case. */ explicit power_of_two_growth_policy(std::size_t& min_bucket_count_in_out) { if (min_bucket_count_in_out > max_bucket_count()) { TSL_RH_THROW_OR_TERMINATE(std::length_error, "The hash table exceeds its maximum size."); } if (min_bucket_count_in_out > 0) { min_bucket_count_in_out = round_up_to_power_of_two(min_bucket_count_in_out); m_mask = min_bucket_count_in_out - 1; } else { m_mask = 0; } } /** * Return the bucket [0, bucket_count()) to which the hash belongs. * If bucket_count() is 0, it must always return 0. */ std::size_t bucket_for_hash(std::size_t hash) const noexcept { return hash & m_mask; } /** * Return the number of buckets that should be used on next growth. */ std::size_t next_bucket_count() const { if ((m_mask + 1) > max_bucket_count() / GrowthFactor) { TSL_RH_THROW_OR_TERMINATE(std::length_error, "The hash table exceeds its maximum size."); } return (m_mask + 1) * GrowthFactor; } /** * Return the maximum number of buckets supported by the policy. */ std::size_t max_bucket_count() const { // Largest power of two. return (std::numeric_limits::max() / 2) + 1; } /** * Reset the growth policy as if it was created with a bucket count of 0. * After a clear, the policy must always return 0 when bucket_for_hash is * called. */ void clear() noexcept { m_mask = 0; } private: static std::size_t round_up_to_power_of_two(std::size_t value) { if (is_power_of_two(value)) { return value; } if (value == 0) { return 1; } --value; for (std::size_t i = 1; i < sizeof(std::size_t) * CHAR_BIT; i *= 2) { value |= value >> i; } return value + 1; } static constexpr bool is_power_of_two(std::size_t value) { return value != 0 && (value & (value - 1)) == 0; } protected: static_assert(is_power_of_two(GrowthFactor) && GrowthFactor >= 2, "GrowthFactor must be a power of two >= 2."); std::size_t m_mask; }; /** * Grow the hash table by GrowthFactor::num / GrowthFactor::den and use a modulo * to map a hash to a bucket. Slower but it can be useful if you want a slower * growth. */ template > class mod_growth_policy { public: explicit mod_growth_policy(std::size_t& min_bucket_count_in_out) { if (min_bucket_count_in_out > max_bucket_count()) { TSL_RH_THROW_OR_TERMINATE(std::length_error, "The hash table exceeds its maximum size."); } if (min_bucket_count_in_out > 0) { m_mod = min_bucket_count_in_out; } else { m_mod = 1; } } std::size_t bucket_for_hash(std::size_t hash) const noexcept { return hash % m_mod; } std::size_t next_bucket_count() const { if (m_mod == max_bucket_count()) { TSL_RH_THROW_OR_TERMINATE(std::length_error, "The hash table exceeds its maximum size."); } const double next_bucket_count = std::ceil(double(m_mod) * REHASH_SIZE_MULTIPLICATION_FACTOR); if (!std::isnormal(next_bucket_count)) { TSL_RH_THROW_OR_TERMINATE(std::length_error, "The hash table exceeds its maximum size."); } if (next_bucket_count > double(max_bucket_count())) { return max_bucket_count(); } else { return std::size_t(next_bucket_count); } } std::size_t max_bucket_count() const { return MAX_BUCKET_COUNT; } void clear() noexcept { m_mod = 1; } private: static constexpr double REHASH_SIZE_MULTIPLICATION_FACTOR = 1.0 * GrowthFactor::num / GrowthFactor::den; static const std::size_t MAX_BUCKET_COUNT = std::size_t(double(std::numeric_limits::max() / REHASH_SIZE_MULTIPLICATION_FACTOR)); static_assert(REHASH_SIZE_MULTIPLICATION_FACTOR >= 1.1, "Growth factor should be >= 1.1."); std::size_t m_mod; }; namespace detail { #if SIZE_MAX >= ULLONG_MAX #define TSL_RH_NB_PRIMES 51 #elif SIZE_MAX >= ULONG_MAX #define TSL_RH_NB_PRIMES 40 #else #define TSL_RH_NB_PRIMES 23 #endif static constexpr const std::array PRIMES = {{ 1u, 5u, 17u, 29u, 37u, 53u, 67u, 79u, 97u, 131u, 193u, 257u, 389u, 521u, 769u, 1031u, 1543u, 2053u, 3079u, 6151u, 12289u, 24593u, 49157u, #if SIZE_MAX >= ULONG_MAX 98317ul, 196613ul, 393241ul, 786433ul, 1572869ul, 3145739ul, 6291469ul, 12582917ul, 25165843ul, 50331653ul, 100663319ul, 201326611ul, 402653189ul, 805306457ul, 1610612741ul, 3221225473ul, 4294967291ul, #endif #if SIZE_MAX >= ULLONG_MAX 6442450939ull, 12884901893ull, 25769803751ull, 51539607551ull, 103079215111ull, 206158430209ull, 412316860441ull, 824633720831ull, 1649267441651ull, 3298534883309ull, 6597069766657ull, #endif }}; template static constexpr std::size_t mod(std::size_t hash) { return hash % PRIMES[IPrime]; } // MOD_PRIME[iprime](hash) returns hash % PRIMES[iprime]. This table allows for // faster modulo as the compiler can optimize the modulo code better with a // constant known at the compilation. static constexpr const std::array MOD_PRIME = {{ &mod<0>, &mod<1>, &mod<2>, &mod<3>, &mod<4>, &mod<5>, &mod<6>, &mod<7>, &mod<8>, &mod<9>, &mod<10>, &mod<11>, &mod<12>, &mod<13>, &mod<14>, &mod<15>, &mod<16>, &mod<17>, &mod<18>, &mod<19>, &mod<20>, &mod<21>, &mod<22>, #if SIZE_MAX >= ULONG_MAX &mod<23>, &mod<24>, &mod<25>, &mod<26>, &mod<27>, &mod<28>, &mod<29>, &mod<30>, &mod<31>, &mod<32>, &mod<33>, &mod<34>, &mod<35>, &mod<36>, &mod<37>, &mod<38>, &mod<39>, #endif #if SIZE_MAX >= ULLONG_MAX &mod<40>, &mod<41>, &mod<42>, &mod<43>, &mod<44>, &mod<45>, &mod<46>, &mod<47>, &mod<48>, &mod<49>, &mod<50>, #endif }}; } // namespace detail /** * Grow the hash table by using prime numbers as bucket count. Slower than * tsl::rh::power_of_two_growth_policy in general but will probably distribute * the values around better in the buckets with a poor hash function. * * To allow the compiler to optimize the modulo operation, a lookup table is * used with constant primes numbers. * * With a switch the code would look like: * \code * switch(iprime) { // iprime is the current prime of the hash table * case 0: hash % 5ul; * break; * case 1: hash % 17ul; * break; * case 2: hash % 29ul; * break; * ... * } * \endcode * * Due to the constant variable in the modulo the compiler is able to optimize * the operation by a series of multiplications, substractions and shifts. * * The 'hash % 5' could become something like 'hash - (hash * 0xCCCCCCCD) >> 34) * * 5' in a 64 bits environment. */ class prime_growth_policy { public: explicit prime_growth_policy(std::size_t& min_bucket_count_in_out) { auto it_prime = std::lower_bound( detail::PRIMES.begin(), detail::PRIMES.end(), min_bucket_count_in_out); if (it_prime == detail::PRIMES.end()) { TSL_RH_THROW_OR_TERMINATE(std::length_error, "The hash table exceeds its maximum size."); } m_iprime = static_cast( std::distance(detail::PRIMES.begin(), it_prime)); if (min_bucket_count_in_out > 0) { min_bucket_count_in_out = *it_prime; } else { min_bucket_count_in_out = 0; } } std::size_t bucket_for_hash(std::size_t hash) const noexcept { return detail::MOD_PRIME[m_iprime](hash); } std::size_t next_bucket_count() const { if (m_iprime + 1 >= detail::PRIMES.size()) { TSL_RH_THROW_OR_TERMINATE(std::length_error, "The hash table exceeds its maximum size."); } return detail::PRIMES[m_iprime + 1]; } std::size_t max_bucket_count() const { return detail::PRIMES.back(); } void clear() noexcept { m_iprime = 0; } private: unsigned int m_iprime; static_assert(std::numeric_limits::max() >= detail::PRIMES.size(), "The type of m_iprime is not big enough."); }; } // namespace rh } // namespace tsl #endif ================================================ FILE: compiler/native/nerdcore/src/tsl/robin_hash.h ================================================ /** * MIT License * * Copyright (c) 2017 Thibaut Goetghebuer-Planchon * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifndef TSL_ROBIN_HASH_H #define TSL_ROBIN_HASH_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "robin_growth_policy.h" namespace tsl { namespace detail_robin_hash { template struct make_void { using type = void; }; template struct has_is_transparent : std::false_type {}; template struct has_is_transparent::type> : std::true_type {}; template struct is_power_of_two_policy : std::false_type {}; template struct is_power_of_two_policy> : std::true_type {}; // Only available in C++17, we need to be compatible with C++11 template const T& clamp(const T& v, const T& lo, const T& hi) { return std::min(hi, std::max(lo, v)); } template static T numeric_cast(U value, const char* error_message = "numeric_cast() failed.") { T ret = static_cast(value); if (static_cast(ret) != value) { TSL_RH_THROW_OR_TERMINATE(std::runtime_error, error_message); } const bool is_same_signedness = (std::is_unsigned::value && std::is_unsigned::value) || (std::is_signed::value && std::is_signed::value); if (!is_same_signedness && (ret < T{}) != (value < U{})) { TSL_RH_THROW_OR_TERMINATE(std::runtime_error, error_message); } return ret; } template static T deserialize_value(Deserializer& deserializer) { // MSVC < 2017 is not conformant, circumvent the problem by removing the // template keyword #if defined(_MSC_VER) && _MSC_VER < 1910 return deserializer.Deserializer::operator()(); #else return deserializer.Deserializer::template operator()(); #endif } /** * Fixed size type used to represent size_type values on serialization. Need to * be big enough to represent a std::size_t on 32 and 64 bits platforms, and * must be the same size on both platforms. */ using slz_size_type = std::uint64_t; static_assert(std::numeric_limits::max() >= std::numeric_limits::max(), "slz_size_type must be >= std::size_t"); using truncated_hash_type = std::uint32_t; /** * Helper class that stores a truncated hash if StoreHash is true and nothing * otherwise. */ template class bucket_entry_hash { public: bool bucket_hash_equal(std::size_t /*hash*/) const noexcept { return true; } truncated_hash_type truncated_hash() const noexcept { return 0; } protected: void set_hash(truncated_hash_type /*hash*/) noexcept {} }; template <> class bucket_entry_hash { public: bool bucket_hash_equal(std::size_t hash) const noexcept { return m_hash == truncated_hash_type(hash); } truncated_hash_type truncated_hash() const noexcept { return m_hash; } protected: void set_hash(truncated_hash_type hash) noexcept { m_hash = truncated_hash_type(hash); } private: truncated_hash_type m_hash; }; /** * Each bucket entry has: * - A value of type `ValueType`. * - An integer to store how far the value of the bucket, if any, is from its * ideal bucket (ex: if the current bucket 5 has the value 'foo' and * `hash('foo') % nb_buckets` == 3, `dist_from_ideal_bucket()` will return 2 as * the current value of the bucket is two buckets away from its ideal bucket) If * there is no value in the bucket (i.e. `empty()` is true) * `dist_from_ideal_bucket()` will be < 0. * - A marker which tells us if the bucket is the last bucket of the bucket * array (useful for the iterator of the hash table). * - If `StoreHash` is true, 32 bits of the hash of the value, if any, are also * stored in the bucket. If the size of the hash is more than 32 bits, it is * truncated. We don't store the full hash as storing the hash is a potential * opportunity to use the unused space due to the alignment of the bucket_entry * structure. We can thus potentially store the hash without any extra space * (which would not be possible with 64 bits of the hash). */ template class bucket_entry : public bucket_entry_hash { using bucket_hash = bucket_entry_hash; public: using value_type = ValueType; using distance_type = std::int16_t; bucket_entry() noexcept : bucket_hash(), m_dist_from_ideal_bucket(EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET), m_last_bucket(false) { tsl_rh_assert(empty()); } bucket_entry(bool last_bucket) noexcept : bucket_hash(), m_dist_from_ideal_bucket(EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET), m_last_bucket(last_bucket) { tsl_rh_assert(empty()); } bucket_entry(const bucket_entry& other) noexcept( std::is_nothrow_copy_constructible::value) : bucket_hash(other), m_dist_from_ideal_bucket(EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET), m_last_bucket(other.m_last_bucket) { if (!other.empty()) { ::new (static_cast(std::addressof(m_value))) value_type(other.value()); m_dist_from_ideal_bucket = other.m_dist_from_ideal_bucket; } tsl_rh_assert(empty() == other.empty()); } /** * Never really used, but still necessary as we must call resize on an empty * `std::vector`. and we need to support move-only types. See * robin_hash constructor for details. */ bucket_entry(bucket_entry&& other) noexcept( std::is_nothrow_move_constructible::value) : bucket_hash(std::move(other)), m_dist_from_ideal_bucket(EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET), m_last_bucket(other.m_last_bucket) { if (!other.empty()) { ::new (static_cast(std::addressof(m_value))) value_type(std::move(other.value())); m_dist_from_ideal_bucket = other.m_dist_from_ideal_bucket; } tsl_rh_assert(empty() == other.empty()); } bucket_entry& operator=(const bucket_entry& other) noexcept( std::is_nothrow_copy_constructible::value) { if (this != &other) { clear(); bucket_hash::operator=(other); if (!other.empty()) { ::new (static_cast(std::addressof(m_value))) value_type(other.value()); } m_dist_from_ideal_bucket = other.m_dist_from_ideal_bucket; m_last_bucket = other.m_last_bucket; } return *this; } bucket_entry& operator=(bucket_entry&&) = delete; ~bucket_entry() noexcept { clear(); } void clear() noexcept { if (!empty()) { destroy_value(); m_dist_from_ideal_bucket = EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET; } } bool empty() const noexcept { return m_dist_from_ideal_bucket == EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET; } value_type& value() noexcept { tsl_rh_assert(!empty()); #if defined(__cplusplus) && __cplusplus >= 201703L return *std::launder( reinterpret_cast(std::addressof(m_value))); #else return *reinterpret_cast(std::addressof(m_value)); #endif } const value_type& value() const noexcept { tsl_rh_assert(!empty()); #if defined(__cplusplus) && __cplusplus >= 201703L return *std::launder( reinterpret_cast(std::addressof(m_value))); #else return *reinterpret_cast(std::addressof(m_value)); #endif } distance_type dist_from_ideal_bucket() const noexcept { return m_dist_from_ideal_bucket; } bool last_bucket() const noexcept { return m_last_bucket; } void set_as_last_bucket() noexcept { m_last_bucket = true; } template void set_value_of_empty_bucket(distance_type dist_from_ideal_bucket, truncated_hash_type hash, Args&&... value_type_args) { tsl_rh_assert(dist_from_ideal_bucket >= 0); tsl_rh_assert(empty()); ::new (static_cast(std::addressof(m_value))) value_type(std::forward(value_type_args)...); this->set_hash(hash); m_dist_from_ideal_bucket = dist_from_ideal_bucket; tsl_rh_assert(!empty()); } void swap_with_value_in_bucket(distance_type& dist_from_ideal_bucket, truncated_hash_type& hash, value_type& value) { tsl_rh_assert(!empty()); tsl_rh_assert(dist_from_ideal_bucket > m_dist_from_ideal_bucket); using std::swap; swap(value, this->value()); swap(dist_from_ideal_bucket, m_dist_from_ideal_bucket); if (StoreHash) { const truncated_hash_type tmp_hash = this->truncated_hash(); this->set_hash(hash); hash = tmp_hash; } else { // Avoid warning of unused variable if StoreHash is false TSL_RH_UNUSED(hash); } } static truncated_hash_type truncate_hash(std::size_t hash) noexcept { return truncated_hash_type(hash); } private: void destroy_value() noexcept { tsl_rh_assert(!empty()); value().~value_type(); } public: static const distance_type EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET = -1; static const distance_type DIST_FROM_IDEAL_BUCKET_LIMIT = 4096; static_assert(DIST_FROM_IDEAL_BUCKET_LIMIT <= std::numeric_limits::max() - 1, "DIST_FROM_IDEAL_BUCKET_LIMIT must be <= " "std::numeric_limits::max() - 1."); private: using storage = typename std::aligned_storage::type; distance_type m_dist_from_ideal_bucket; bool m_last_bucket; storage m_value; }; /** * Internal common class used by `robin_map` and `robin_set`. * * ValueType is what will be stored by `robin_hash` (usually `std::pair` * for map and `Key` for set). * * `KeySelect` should be a `FunctionObject` which takes a `ValueType` in * parameter and returns a reference to the key. * * `ValueSelect` should be a `FunctionObject` which takes a `ValueType` in * parameter and returns a reference to the value. `ValueSelect` should be void * if there is no value (in a set for example). * * The strong exception guarantee only holds if the expression * `std::is_nothrow_swappable::value && * std::is_nothrow_move_constructible::value` is true. * * Behaviour is undefined if the destructor of `ValueType` throws. */ template class robin_hash : private Hash, private KeyEqual, private GrowthPolicy { private: template using has_mapped_type = typename std::integral_constant::value>; static_assert( noexcept(std::declval().bucket_for_hash(std::size_t(0))), "GrowthPolicy::bucket_for_hash must be noexcept."); static_assert(noexcept(std::declval().clear()), "GrowthPolicy::clear must be noexcept."); public: template class robin_iterator; using key_type = typename KeySelect::key_type; using value_type = ValueType; using size_type = std::size_t; using difference_type = std::ptrdiff_t; using hasher = Hash; using key_equal = KeyEqual; using allocator_type = Allocator; using reference = value_type&; using const_reference = const value_type&; using pointer = value_type*; using const_pointer = const value_type*; using iterator = robin_iterator; using const_iterator = robin_iterator; private: /** * Either store the hash because we are asked by the `StoreHash` template * parameter or store the hash because it doesn't cost us anything in size and * can be used to speed up rehash. */ static constexpr bool STORE_HASH = StoreHash || ((sizeof(tsl::detail_robin_hash::bucket_entry) == sizeof(tsl::detail_robin_hash::bucket_entry)) && (sizeof(std::size_t) == sizeof(truncated_hash_type) || is_power_of_two_policy::value) && // Don't store the hash for primitive types with default hash. (!std::is_arithmetic::value || !std::is_same>::value)); /** * Only use the stored hash on lookup if we are explicitly asked. We are not * sure how slow the KeyEqual operation is. An extra comparison may slow * things down with a fast KeyEqual. */ static constexpr bool USE_STORED_HASH_ON_LOOKUP = StoreHash; /** * We can only use the hash on rehash if the size of the hash type is the same * as the stored one or if we use a power of two modulo. In the case of the * power of two modulo, we just mask the least significant bytes, we just have * to check that the truncated_hash_type didn't truncated more bytes. */ static bool USE_STORED_HASH_ON_REHASH(size_type bucket_count) { if (STORE_HASH && sizeof(std::size_t) == sizeof(truncated_hash_type)) { TSL_RH_UNUSED(bucket_count); return true; } else if (STORE_HASH && is_power_of_two_policy::value) { return bucket_count == 0 || (bucket_count - 1) <= std::numeric_limits::max(); } else { TSL_RH_UNUSED(bucket_count); return false; } } using bucket_entry = tsl::detail_robin_hash::bucket_entry; using distance_type = typename bucket_entry::distance_type; using buckets_allocator = typename std::allocator_traits< allocator_type>::template rebind_alloc; using buckets_container_type = std::vector; public: /** * The 'operator*()' and 'operator->()' methods return a const reference and * const pointer respectively to the stored value type. * * In case of a map, to get a mutable reference to the value associated to a * key (the '.second' in the stored pair), you have to call 'value()'. * * The main reason for this is that if we returned a `std::pair&` * instead of a `const std::pair&`, the user may modify the key which * will put the map in a undefined state. */ template class robin_iterator { friend class robin_hash; private: using bucket_entry_ptr = typename std::conditional::type; robin_iterator(bucket_entry_ptr bucket) noexcept : m_bucket(bucket) {} public: using iterator_category = std::forward_iterator_tag; using value_type = const typename robin_hash::value_type; using difference_type = std::ptrdiff_t; using reference = value_type&; using pointer = value_type*; robin_iterator() noexcept {} // Copy constructor from iterator to const_iterator. template ::type* = nullptr> robin_iterator(const robin_iterator& other) noexcept : m_bucket(other.m_bucket) {} robin_iterator(const robin_iterator& other) = default; robin_iterator(robin_iterator&& other) = default; robin_iterator& operator=(const robin_iterator& other) = default; robin_iterator& operator=(robin_iterator&& other) = default; const typename robin_hash::key_type& key() const { return KeySelect()(m_bucket->value()); } template ::value && IsConst>::type* = nullptr> const typename U::value_type& value() const { return U()(m_bucket->value()); } template ::value && !IsConst>::type* = nullptr> typename U::value_type& value() const { return U()(m_bucket->value()); } reference operator*() const { return m_bucket->value(); } pointer operator->() const { return std::addressof(m_bucket->value()); } robin_iterator& operator++() { while (true) { if (m_bucket->last_bucket()) { ++m_bucket; return *this; } ++m_bucket; if (!m_bucket->empty()) { return *this; } } } robin_iterator operator++(int) { robin_iterator tmp(*this); ++*this; return tmp; } friend bool operator==(const robin_iterator& lhs, const robin_iterator& rhs) { return lhs.m_bucket == rhs.m_bucket; } friend bool operator!=(const robin_iterator& lhs, const robin_iterator& rhs) { return !(lhs == rhs); } private: bucket_entry_ptr m_bucket; }; public: #if defined(__cplusplus) && __cplusplus >= 201402L robin_hash(size_type bucket_count, const Hash& hash, const KeyEqual& equal, const Allocator& alloc, float min_load_factor = DEFAULT_MIN_LOAD_FACTOR, float max_load_factor = DEFAULT_MAX_LOAD_FACTOR) : Hash(hash), KeyEqual(equal), GrowthPolicy(bucket_count), m_buckets_data(bucket_count, alloc), m_buckets(m_buckets_data.empty() ? static_empty_bucket_ptr() : m_buckets_data.data()), m_bucket_count(bucket_count), m_nb_elements(0), m_grow_on_next_insert(false), m_try_shrink_on_next_insert(false) { if (bucket_count > max_bucket_count()) { TSL_RH_THROW_OR_TERMINATE(std::length_error, "The map exceeds its maximum bucket count."); } if (m_bucket_count > 0) { tsl_rh_assert(!m_buckets_data.empty()); m_buckets_data.back().set_as_last_bucket(); } this->min_load_factor(min_load_factor); this->max_load_factor(max_load_factor); } #else /** * C++11 doesn't support the creation of a std::vector with a custom allocator * and 'count' default-inserted elements. The needed contructor `explicit * vector(size_type count, const Allocator& alloc = Allocator());` is only * available in C++14 and later. We thus must resize after using the * `vector(const Allocator& alloc)` constructor. * * We can't use `vector(size_type count, const T& value, const Allocator& * alloc)` as it requires the value T to be copyable. */ robin_hash(size_type bucket_count, const Hash& hash, const KeyEqual& equal, const Allocator& alloc, float min_load_factor = DEFAULT_MIN_LOAD_FACTOR, float max_load_factor = DEFAULT_MAX_LOAD_FACTOR) : Hash(hash), KeyEqual(equal), GrowthPolicy(bucket_count), m_buckets_data(alloc), m_buckets(static_empty_bucket_ptr()), m_bucket_count(bucket_count), m_nb_elements(0), m_grow_on_next_insert(false), m_try_shrink_on_next_insert(false) { if (bucket_count > max_bucket_count()) { TSL_RH_THROW_OR_TERMINATE(std::length_error, "The map exceeds its maximum bucket count."); } if (m_bucket_count > 0) { m_buckets_data.resize(m_bucket_count); m_buckets = m_buckets_data.data(); tsl_rh_assert(!m_buckets_data.empty()); m_buckets_data.back().set_as_last_bucket(); } this->min_load_factor(min_load_factor); this->max_load_factor(max_load_factor); } #endif robin_hash(const robin_hash& other) : Hash(other), KeyEqual(other), GrowthPolicy(other), m_buckets_data(other.m_buckets_data), m_buckets(m_buckets_data.empty() ? static_empty_bucket_ptr() : m_buckets_data.data()), m_bucket_count(other.m_bucket_count), m_nb_elements(other.m_nb_elements), m_load_threshold(other.m_load_threshold), m_min_load_factor(other.m_min_load_factor), m_max_load_factor(other.m_max_load_factor), m_grow_on_next_insert(other.m_grow_on_next_insert), m_try_shrink_on_next_insert(other.m_try_shrink_on_next_insert) {} robin_hash(robin_hash&& other) noexcept( std::is_nothrow_move_constructible< Hash>::value&& std::is_nothrow_move_constructible::value&& std::is_nothrow_move_constructible::value&& std::is_nothrow_move_constructible::value) : Hash(std::move(static_cast(other))), KeyEqual(std::move(static_cast(other))), GrowthPolicy(std::move(static_cast(other))), m_buckets_data(std::move(other.m_buckets_data)), m_buckets(m_buckets_data.empty() ? static_empty_bucket_ptr() : m_buckets_data.data()), m_bucket_count(other.m_bucket_count), m_nb_elements(other.m_nb_elements), m_load_threshold(other.m_load_threshold), m_min_load_factor(other.m_min_load_factor), m_max_load_factor(other.m_max_load_factor), m_grow_on_next_insert(other.m_grow_on_next_insert), m_try_shrink_on_next_insert(other.m_try_shrink_on_next_insert) { other.clear_and_shrink(); } robin_hash& operator=(const robin_hash& other) { if (&other != this) { Hash::operator=(other); KeyEqual::operator=(other); GrowthPolicy::operator=(other); m_buckets_data = other.m_buckets_data; m_buckets = m_buckets_data.empty() ? static_empty_bucket_ptr() : m_buckets_data.data(); m_bucket_count = other.m_bucket_count; m_nb_elements = other.m_nb_elements; m_load_threshold = other.m_load_threshold; m_min_load_factor = other.m_min_load_factor; m_max_load_factor = other.m_max_load_factor; m_grow_on_next_insert = other.m_grow_on_next_insert; m_try_shrink_on_next_insert = other.m_try_shrink_on_next_insert; } return *this; } robin_hash& operator=(robin_hash&& other) { other.swap(*this); other.clear_and_shrink(); return *this; } allocator_type get_allocator() const { return m_buckets_data.get_allocator(); } /* * Iterators */ iterator begin() noexcept { std::size_t i = 0; while (i < m_bucket_count && m_buckets[i].empty()) { i++; } return iterator(m_buckets + i); } const_iterator begin() const noexcept { return cbegin(); } const_iterator cbegin() const noexcept { std::size_t i = 0; while (i < m_bucket_count && m_buckets[i].empty()) { i++; } return const_iterator(m_buckets + i); } iterator end() noexcept { return iterator(m_buckets + m_bucket_count); } const_iterator end() const noexcept { return cend(); } const_iterator cend() const noexcept { return const_iterator(m_buckets + m_bucket_count); } /* * Capacity */ bool empty() const noexcept { return m_nb_elements == 0; } size_type size() const noexcept { return m_nb_elements; } size_type max_size() const noexcept { return m_buckets_data.max_size(); } /* * Modifiers */ void clear() noexcept { if (m_min_load_factor > 0.0f) { clear_and_shrink(); } else { for (auto& bucket : m_buckets_data) { bucket.clear(); } m_nb_elements = 0; m_grow_on_next_insert = false; } } template std::pair insert(P&& value) { return insert_impl(KeySelect()(value), std::forward

(value)); } template iterator insert_hint(const_iterator hint, P&& value) { if (hint != cend() && compare_keys(KeySelect()(*hint), KeySelect()(value))) { return mutable_iterator(hint); } return insert(std::forward

(value)).first; } template void insert(InputIt first, InputIt last) { if (std::is_base_of< std::forward_iterator_tag, typename std::iterator_traits::iterator_category>::value) { const auto nb_elements_insert = std::distance(first, last); const size_type nb_free_buckets = m_load_threshold - size(); tsl_rh_assert(m_load_threshold >= size()); if (nb_elements_insert > 0 && nb_free_buckets < size_type(nb_elements_insert)) { reserve(size() + size_type(nb_elements_insert)); } } for (; first != last; ++first) { insert(*first); } } template std::pair insert_or_assign(K&& key, M&& obj) { auto it = try_emplace(std::forward(key), std::forward(obj)); if (!it.second) { it.first.value() = std::forward(obj); } return it; } template iterator insert_or_assign(const_iterator hint, K&& key, M&& obj) { if (hint != cend() && compare_keys(KeySelect()(*hint), key)) { auto it = mutable_iterator(hint); it.value() = std::forward(obj); return it; } return insert_or_assign(std::forward(key), std::forward(obj)).first; } template std::pair emplace(Args&&... args) { return insert(value_type(std::forward(args)...)); } template iterator emplace_hint(const_iterator hint, Args&&... args) { return insert_hint(hint, value_type(std::forward(args)...)); } template std::pair try_emplace(K&& key, Args&&... args) { return insert_impl(key, std::piecewise_construct, std::forward_as_tuple(std::forward(key)), std::forward_as_tuple(std::forward(args)...)); } template iterator try_emplace_hint(const_iterator hint, K&& key, Args&&... args) { if (hint != cend() && compare_keys(KeySelect()(*hint), key)) { return mutable_iterator(hint); } return try_emplace(std::forward(key), std::forward(args)...).first; } /** * Here to avoid `template size_type erase(const K& key)` being used * when we use an `iterator` instead of a `const_iterator`. */ iterator erase(iterator pos) { erase_from_bucket(pos); /** * Erase bucket used a backward shift after clearing the bucket. * Check if there is a new value in the bucket, if not get the next * non-empty. */ if (pos.m_bucket->empty()) { ++pos; } m_try_shrink_on_next_insert = true; return pos; } iterator erase(const_iterator pos) { return erase(mutable_iterator(pos)); } iterator erase(const_iterator first, const_iterator last) { if (first == last) { return mutable_iterator(first); } auto first_mutable = mutable_iterator(first); auto last_mutable = mutable_iterator(last); for (auto it = first_mutable.m_bucket; it != last_mutable.m_bucket; ++it) { if (!it->empty()) { it->clear(); m_nb_elements--; } } if (last_mutable == end()) { m_try_shrink_on_next_insert = true; return end(); } /* * Backward shift on the values which come after the deleted values. * We try to move the values closer to their ideal bucket. */ std::size_t icloser_bucket = static_cast(first_mutable.m_bucket - m_buckets); std::size_t ito_move_closer_value = static_cast(last_mutable.m_bucket - m_buckets); tsl_rh_assert(ito_move_closer_value > icloser_bucket); const std::size_t ireturn_bucket = ito_move_closer_value - std::min( ito_move_closer_value - icloser_bucket, std::size_t( m_buckets[ito_move_closer_value].dist_from_ideal_bucket())); while (ito_move_closer_value < m_bucket_count && m_buckets[ito_move_closer_value].dist_from_ideal_bucket() > 0) { icloser_bucket = ito_move_closer_value - std::min( ito_move_closer_value - icloser_bucket, std::size_t( m_buckets[ito_move_closer_value].dist_from_ideal_bucket())); tsl_rh_assert(m_buckets[icloser_bucket].empty()); const distance_type new_distance = distance_type( m_buckets[ito_move_closer_value].dist_from_ideal_bucket() - (ito_move_closer_value - icloser_bucket)); m_buckets[icloser_bucket].set_value_of_empty_bucket( new_distance, m_buckets[ito_move_closer_value].truncated_hash(), std::move(m_buckets[ito_move_closer_value].value())); m_buckets[ito_move_closer_value].clear(); ++icloser_bucket; ++ito_move_closer_value; } m_try_shrink_on_next_insert = true; return iterator(m_buckets + ireturn_bucket); } template size_type erase(const K& key) { return erase(key, hash_key(key)); } template size_type erase(const K& key, std::size_t hash) { auto it = find(key, hash); if (it != end()) { erase_from_bucket(it); m_try_shrink_on_next_insert = true; return 1; } else { return 0; } } void swap(robin_hash& other) { using std::swap; swap(static_cast(*this), static_cast(other)); swap(static_cast(*this), static_cast(other)); swap(static_cast(*this), static_cast(other)); swap(m_buckets_data, other.m_buckets_data); swap(m_buckets, other.m_buckets); swap(m_bucket_count, other.m_bucket_count); swap(m_nb_elements, other.m_nb_elements); swap(m_load_threshold, other.m_load_threshold); swap(m_min_load_factor, other.m_min_load_factor); swap(m_max_load_factor, other.m_max_load_factor); swap(m_grow_on_next_insert, other.m_grow_on_next_insert); swap(m_try_shrink_on_next_insert, other.m_try_shrink_on_next_insert); } /* * Lookup */ template ::value>::type* = nullptr> typename U::value_type& at(const K& key) { return at(key, hash_key(key)); } template ::value>::type* = nullptr> typename U::value_type& at(const K& key, std::size_t hash) { return const_cast( static_cast(this)->at(key, hash)); } template ::value>::type* = nullptr> const typename U::value_type& at(const K& key) const { return at(key, hash_key(key)); } template ::value>::type* = nullptr> const typename U::value_type& at(const K& key, std::size_t hash) const { auto it = find(key, hash); if (it != cend()) { return it.value(); } else { TSL_RH_THROW_OR_TERMINATE(std::out_of_range, "Couldn't find key."); } } template ::value>::type* = nullptr> typename U::value_type& operator[](K&& key) { return try_emplace(std::forward(key)).first.value(); } template size_type count(const K& key) const { return count(key, hash_key(key)); } template size_type count(const K& key, std::size_t hash) const { if (find(key, hash) != cend()) { return 1; } else { return 0; } } template iterator find(const K& key) { return find_impl(key, hash_key(key)); } template iterator find(const K& key, std::size_t hash) { return find_impl(key, hash); } template const_iterator find(const K& key) const { return find_impl(key, hash_key(key)); } template const_iterator find(const K& key, std::size_t hash) const { return find_impl(key, hash); } template bool contains(const K& key) const { return contains(key, hash_key(key)); } template bool contains(const K& key, std::size_t hash) const { return count(key, hash) != 0; } template std::pair equal_range(const K& key) { return equal_range(key, hash_key(key)); } template std::pair equal_range(const K& key, std::size_t hash) { iterator it = find(key, hash); return std::make_pair(it, (it == end()) ? it : std::next(it)); } template std::pair equal_range(const K& key) const { return equal_range(key, hash_key(key)); } template std::pair equal_range( const K& key, std::size_t hash) const { const_iterator it = find(key, hash); return std::make_pair(it, (it == cend()) ? it : std::next(it)); } /* * Bucket interface */ size_type bucket_count() const { return m_bucket_count; } size_type max_bucket_count() const { return std::min(GrowthPolicy::max_bucket_count(), m_buckets_data.max_size()); } /* * Hash policy */ float load_factor() const { if (bucket_count() == 0) { return 0; } return float(m_nb_elements) / float(bucket_count()); } float min_load_factor() const { return m_min_load_factor; } float max_load_factor() const { return m_max_load_factor; } void min_load_factor(float ml) { m_min_load_factor = clamp(ml, float(MINIMUM_MIN_LOAD_FACTOR), float(MAXIMUM_MIN_LOAD_FACTOR)); } void max_load_factor(float ml) { m_max_load_factor = clamp(ml, float(MINIMUM_MAX_LOAD_FACTOR), float(MAXIMUM_MAX_LOAD_FACTOR)); m_load_threshold = size_type(float(bucket_count()) * m_max_load_factor); tsl_rh_assert(bucket_count() == 0 || m_load_threshold < bucket_count()); } void rehash(size_type count_) { count_ = std::max(count_, size_type(std::ceil(float(size()) / max_load_factor()))); rehash_impl(count_); } void reserve(size_type count_) { rehash(size_type(std::ceil(float(count_) / max_load_factor()))); } /* * Observers */ hasher hash_function() const { return static_cast(*this); } key_equal key_eq() const { return static_cast(*this); } /* * Other */ iterator mutable_iterator(const_iterator pos) { return iterator(const_cast(pos.m_bucket)); } template void serialize(Serializer& serializer) const { serialize_impl(serializer); } template void deserialize(Deserializer& deserializer, bool hash_compatible) { deserialize_impl(deserializer, hash_compatible); } private: template std::size_t hash_key(const K& key) const { return Hash::operator()(key); } template bool compare_keys(const K1& key1, const K2& key2) const { return KeyEqual::operator()(key1, key2); } std::size_t bucket_for_hash(std::size_t hash) const { const std::size_t bucket = GrowthPolicy::bucket_for_hash(hash); tsl_rh_assert(bucket < m_bucket_count || (bucket == 0 && m_bucket_count == 0)); return bucket; } template ::value>::type* = nullptr> std::size_t next_bucket(std::size_t index) const noexcept { tsl_rh_assert(index < bucket_count()); return (index + 1) & this->m_mask; } template ::value>::type* = nullptr> std::size_t next_bucket(std::size_t index) const noexcept { tsl_rh_assert(index < bucket_count()); index++; return (index != bucket_count()) ? index : 0; } template iterator find_impl(const K& key, std::size_t hash) { return mutable_iterator( static_cast(this)->find(key, hash)); } template const_iterator find_impl(const K& key, std::size_t hash) const { std::size_t ibucket = bucket_for_hash(hash); distance_type dist_from_ideal_bucket = 0; while (dist_from_ideal_bucket <= m_buckets[ibucket].dist_from_ideal_bucket()) { if (TSL_RH_LIKELY( (!USE_STORED_HASH_ON_LOOKUP || m_buckets[ibucket].bucket_hash_equal(hash)) && compare_keys(KeySelect()(m_buckets[ibucket].value()), key))) { return const_iterator(m_buckets + ibucket); } ibucket = next_bucket(ibucket); dist_from_ideal_bucket++; } return cend(); } void erase_from_bucket(iterator pos) { pos.m_bucket->clear(); m_nb_elements--; /** * Backward shift, swap the empty bucket, previous_ibucket, with the values * on its right, ibucket, until we cross another empty bucket or if the * other bucket has a distance_from_ideal_bucket == 0. * * We try to move the values closer to their ideal bucket. */ std::size_t previous_ibucket = static_cast(pos.m_bucket - m_buckets); std::size_t ibucket = next_bucket(previous_ibucket); while (m_buckets[ibucket].dist_from_ideal_bucket() > 0) { tsl_rh_assert(m_buckets[previous_ibucket].empty()); const distance_type new_distance = distance_type(m_buckets[ibucket].dist_from_ideal_bucket() - 1); m_buckets[previous_ibucket].set_value_of_empty_bucket( new_distance, m_buckets[ibucket].truncated_hash(), std::move(m_buckets[ibucket].value())); m_buckets[ibucket].clear(); previous_ibucket = ibucket; ibucket = next_bucket(ibucket); } } template std::pair insert_impl(const K& key, Args&&... value_type_args) { const std::size_t hash = hash_key(key); std::size_t ibucket = bucket_for_hash(hash); distance_type dist_from_ideal_bucket = 0; while (dist_from_ideal_bucket <= m_buckets[ibucket].dist_from_ideal_bucket()) { if ((!USE_STORED_HASH_ON_LOOKUP || m_buckets[ibucket].bucket_hash_equal(hash)) && compare_keys(KeySelect()(m_buckets[ibucket].value()), key)) { return std::make_pair(iterator(m_buckets + ibucket), false); } ibucket = next_bucket(ibucket); dist_from_ideal_bucket++; } if (rehash_on_extreme_load()) { ibucket = bucket_for_hash(hash); dist_from_ideal_bucket = 0; while (dist_from_ideal_bucket <= m_buckets[ibucket].dist_from_ideal_bucket()) { ibucket = next_bucket(ibucket); dist_from_ideal_bucket++; } } if (m_buckets[ibucket].empty()) { m_buckets[ibucket].set_value_of_empty_bucket( dist_from_ideal_bucket, bucket_entry::truncate_hash(hash), std::forward(value_type_args)...); } else { insert_value(ibucket, dist_from_ideal_bucket, bucket_entry::truncate_hash(hash), std::forward(value_type_args)...); } m_nb_elements++; /* * The value will be inserted in ibucket in any case, either because it was * empty or by stealing the bucket (robin hood). */ return std::make_pair(iterator(m_buckets + ibucket), true); } template void insert_value(std::size_t ibucket, distance_type dist_from_ideal_bucket, truncated_hash_type hash, Args&&... value_type_args) { value_type value(std::forward(value_type_args)...); insert_value_impl(ibucket, dist_from_ideal_bucket, hash, value); } void insert_value(std::size_t ibucket, distance_type dist_from_ideal_bucket, truncated_hash_type hash, value_type&& value) { insert_value_impl(ibucket, dist_from_ideal_bucket, hash, value); } /* * We don't use `value_type&& value` as last argument due to a bug in MSVC * when `value_type` is a pointer, The compiler is not able to see the * difference between `std::string*` and `std::string*&&` resulting in a * compilation error. * * The `value` will be in a moved state at the end of the function. */ void insert_value_impl(std::size_t ibucket, distance_type dist_from_ideal_bucket, truncated_hash_type hash, value_type& value) { tsl_rh_assert(dist_from_ideal_bucket > m_buckets[ibucket].dist_from_ideal_bucket()); m_buckets[ibucket].swap_with_value_in_bucket(dist_from_ideal_bucket, hash, value); ibucket = next_bucket(ibucket); dist_from_ideal_bucket++; while (!m_buckets[ibucket].empty()) { if (dist_from_ideal_bucket > m_buckets[ibucket].dist_from_ideal_bucket()) { if (dist_from_ideal_bucket >= bucket_entry::DIST_FROM_IDEAL_BUCKET_LIMIT) { /** * The number of probes is really high, rehash the map on the next * insert. Difficult to do now as rehash may throw an exception. */ m_grow_on_next_insert = true; } m_buckets[ibucket].swap_with_value_in_bucket(dist_from_ideal_bucket, hash, value); } ibucket = next_bucket(ibucket); dist_from_ideal_bucket++; } m_buckets[ibucket].set_value_of_empty_bucket(dist_from_ideal_bucket, hash, std::move(value)); } void rehash_impl(size_type count_) { robin_hash new_table(count_, static_cast(*this), static_cast(*this), get_allocator(), m_min_load_factor, m_max_load_factor); tsl_rh_assert(size() <= new_table.m_load_threshold); const bool use_stored_hash = USE_STORED_HASH_ON_REHASH(new_table.bucket_count()); for (auto& bucket : m_buckets_data) { if (bucket.empty()) { continue; } const std::size_t hash = use_stored_hash ? bucket.truncated_hash() : new_table.hash_key(KeySelect()(bucket.value())); new_table.insert_value_on_rehash(new_table.bucket_for_hash(hash), 0, bucket_entry::truncate_hash(hash), std::move(bucket.value())); } new_table.m_nb_elements = m_nb_elements; new_table.swap(*this); } void clear_and_shrink() noexcept { GrowthPolicy::clear(); m_buckets_data.clear(); m_buckets = static_empty_bucket_ptr(); m_bucket_count = 0; m_nb_elements = 0; m_load_threshold = 0; m_grow_on_next_insert = false; m_try_shrink_on_next_insert = false; } void insert_value_on_rehash(std::size_t ibucket, distance_type dist_from_ideal_bucket, truncated_hash_type hash, value_type&& value) { while (true) { if (dist_from_ideal_bucket > m_buckets[ibucket].dist_from_ideal_bucket()) { if (m_buckets[ibucket].empty()) { m_buckets[ibucket].set_value_of_empty_bucket(dist_from_ideal_bucket, hash, std::move(value)); return; } else { m_buckets[ibucket].swap_with_value_in_bucket(dist_from_ideal_bucket, hash, value); } } dist_from_ideal_bucket++; ibucket = next_bucket(ibucket); } } /** * Grow the table if m_grow_on_next_insert is true or we reached the * max_load_factor. Shrink the table if m_try_shrink_on_next_insert is true * (an erase occurred) and we're below the min_load_factor. * * Return true if the table has been rehashed. */ bool rehash_on_extreme_load() { if (m_grow_on_next_insert || size() >= m_load_threshold) { rehash_impl(GrowthPolicy::next_bucket_count()); m_grow_on_next_insert = false; return true; } if (m_try_shrink_on_next_insert) { m_try_shrink_on_next_insert = false; if (m_min_load_factor != 0.0f && load_factor() < m_min_load_factor) { reserve(size() + 1); return true; } } return false; } template void serialize_impl(Serializer& serializer) const { const slz_size_type version = SERIALIZATION_PROTOCOL_VERSION; serializer(version); // Indicate if the truncated hash of each bucket is stored. Use a // std::int16_t instead of a bool to avoid the need for the serializer to // support an extra 'bool' type. const std::int16_t hash_stored_for_bucket = static_cast(STORE_HASH); serializer(hash_stored_for_bucket); const slz_size_type nb_elements = m_nb_elements; serializer(nb_elements); const slz_size_type bucket_count = m_buckets_data.size(); serializer(bucket_count); const float min_load_factor = m_min_load_factor; serializer(min_load_factor); const float max_load_factor = m_max_load_factor; serializer(max_load_factor); for (const bucket_entry& bucket : m_buckets_data) { if (bucket.empty()) { const std::int16_t empty_bucket = bucket_entry::EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET; serializer(empty_bucket); } else { const std::int16_t dist_from_ideal_bucket = bucket.dist_from_ideal_bucket(); serializer(dist_from_ideal_bucket); if (STORE_HASH) { const std::uint32_t truncated_hash = bucket.truncated_hash(); serializer(truncated_hash); } serializer(bucket.value()); } } } template void deserialize_impl(Deserializer& deserializer, bool hash_compatible) { tsl_rh_assert(m_buckets_data.empty()); // Current hash table must be empty const slz_size_type version = deserialize_value(deserializer); // For now we only have one version of the serialization protocol. // If it doesn't match there is a problem with the file. if (version != SERIALIZATION_PROTOCOL_VERSION) { TSL_RH_THROW_OR_TERMINATE(std::runtime_error, "Can't deserialize the ordered_map/set. " "The protocol version header is invalid."); } const bool hash_stored_for_bucket = deserialize_value(deserializer) ? true : false; if (hash_compatible && STORE_HASH != hash_stored_for_bucket) { TSL_RH_THROW_OR_TERMINATE( std::runtime_error, "Can't deserialize a map with a different StoreHash " "than the one used during the serialization when " "hash compatibility is used"); } const slz_size_type nb_elements = deserialize_value(deserializer); const slz_size_type bucket_count_ds = deserialize_value(deserializer); const float min_load_factor = deserialize_value(deserializer); const float max_load_factor = deserialize_value(deserializer); if (min_load_factor < MINIMUM_MIN_LOAD_FACTOR || min_load_factor > MAXIMUM_MIN_LOAD_FACTOR) { TSL_RH_THROW_OR_TERMINATE( std::runtime_error, "Invalid min_load_factor. Check that the serializer " "and deserializer support floats correctly as they " "can be converted implicitly to ints."); } if (max_load_factor < MINIMUM_MAX_LOAD_FACTOR || max_load_factor > MAXIMUM_MAX_LOAD_FACTOR) { TSL_RH_THROW_OR_TERMINATE( std::runtime_error, "Invalid max_load_factor. Check that the serializer " "and deserializer support floats correctly as they " "can be converted implicitly to ints."); } this->min_load_factor(min_load_factor); this->max_load_factor(max_load_factor); if (bucket_count_ds == 0) { tsl_rh_assert(nb_elements == 0); return; } if (!hash_compatible) { reserve(numeric_cast(nb_elements, "Deserialized nb_elements is too big.")); for (slz_size_type ibucket = 0; ibucket < bucket_count_ds; ibucket++) { const distance_type dist_from_ideal_bucket = deserialize_value(deserializer); if (dist_from_ideal_bucket != bucket_entry::EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET) { if (hash_stored_for_bucket) { TSL_RH_UNUSED(deserialize_value(deserializer)); } insert(deserialize_value(deserializer)); } } tsl_rh_assert(nb_elements == size()); } else { m_bucket_count = numeric_cast( bucket_count_ds, "Deserialized bucket_count is too big."); GrowthPolicy::operator=(GrowthPolicy(m_bucket_count)); // GrowthPolicy should not modify the bucket count we got from // deserialization if (m_bucket_count != bucket_count_ds) { TSL_RH_THROW_OR_TERMINATE(std::runtime_error, "The GrowthPolicy is not the same even " "though hash_compatible is true."); } m_nb_elements = numeric_cast( nb_elements, "Deserialized nb_elements is too big."); m_buckets_data.resize(m_bucket_count); m_buckets = m_buckets_data.data(); for (bucket_entry& bucket : m_buckets_data) { const distance_type dist_from_ideal_bucket = deserialize_value(deserializer); if (dist_from_ideal_bucket != bucket_entry::EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET) { truncated_hash_type truncated_hash = 0; if (hash_stored_for_bucket) { tsl_rh_assert(hash_stored_for_bucket); truncated_hash = deserialize_value(deserializer); } bucket.set_value_of_empty_bucket( dist_from_ideal_bucket, truncated_hash, deserialize_value(deserializer)); } } if (!m_buckets_data.empty()) { m_buckets_data.back().set_as_last_bucket(); } } } public: static const size_type DEFAULT_INIT_BUCKETS_SIZE = 0; static constexpr float DEFAULT_MAX_LOAD_FACTOR = 0.5f; static constexpr float MINIMUM_MAX_LOAD_FACTOR = 0.2f; static constexpr float MAXIMUM_MAX_LOAD_FACTOR = 0.95f; static constexpr float DEFAULT_MIN_LOAD_FACTOR = 0.0f; static constexpr float MINIMUM_MIN_LOAD_FACTOR = 0.0f; static constexpr float MAXIMUM_MIN_LOAD_FACTOR = 0.15f; static_assert(MINIMUM_MAX_LOAD_FACTOR < MAXIMUM_MAX_LOAD_FACTOR, "MINIMUM_MAX_LOAD_FACTOR should be < MAXIMUM_MAX_LOAD_FACTOR"); static_assert(MINIMUM_MIN_LOAD_FACTOR < MAXIMUM_MIN_LOAD_FACTOR, "MINIMUM_MIN_LOAD_FACTOR should be < MAXIMUM_MIN_LOAD_FACTOR"); static_assert(MAXIMUM_MIN_LOAD_FACTOR < MINIMUM_MAX_LOAD_FACTOR, "MAXIMUM_MIN_LOAD_FACTOR should be < MINIMUM_MAX_LOAD_FACTOR"); private: /** * Protocol version currenlty used for serialization. */ static const slz_size_type SERIALIZATION_PROTOCOL_VERSION = 1; /** * Return an always valid pointer to an static empty bucket_entry with * last_bucket() == true. */ bucket_entry* static_empty_bucket_ptr() noexcept { static bucket_entry empty_bucket(true); tsl_rh_assert(empty_bucket.empty()); return &empty_bucket; } private: buckets_container_type m_buckets_data; /** * Points to m_buckets_data.data() if !m_buckets_data.empty() otherwise points * to static_empty_bucket_ptr. This variable is useful to avoid the cost of * checking if m_buckets_data is empty when trying to find an element. * * TODO Remove m_buckets_data and only use a pointer instead of a * pointer+vector to save some space in the robin_hash object. Manage the * Allocator manually. */ bucket_entry* m_buckets; /** * Used a lot in find, avoid the call to m_buckets_data.size() which is a bit * slower. */ size_type m_bucket_count; size_type m_nb_elements; size_type m_load_threshold; float m_min_load_factor; float m_max_load_factor; bool m_grow_on_next_insert; /** * We can't shrink down the map on erase operations as the erase methods need * to return the next iterator. Shrinking the map would invalidate all the * iterators and we could not return the next iterator in a meaningful way, On * erase, we thus just indicate on erase that we should try to shrink the hash * table on the next insert if we go below the min_load_factor. */ bool m_try_shrink_on_next_insert; }; } // namespace detail_robin_hash } // namespace tsl #endif ================================================ FILE: compiler/native/nerdcore/src/tsl/robin_map.h ================================================ /** * MIT License * * Copyright (c) 2017 Thibaut Goetghebuer-Planchon * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifndef TSL_ROBIN_MAP_H #define TSL_ROBIN_MAP_H #include #include #include #include #include #include #include "robin_hash.h" namespace tsl { /** * Implementation of a hash map using open-addressing and the robin hood hashing * algorithm with backward shift deletion. * * For operations modifying the hash map (insert, erase, rehash, ...), the * strong exception guarantee is only guaranteed when the expression * `std::is_nothrow_swappable>::value && * std::is_nothrow_move_constructible>::value` is true, * otherwise if an exception is thrown during the swap or the move, the hash map * may end up in a undefined state. Per the standard a `Key` or `T` with a * noexcept copy constructor and no move constructor also satisfies the * `std::is_nothrow_move_constructible>::value` criterion (and * will thus guarantee the strong exception for the map). * * When `StoreHash` is true, 32 bits of the hash are stored alongside the * values. It can improve the performance during lookups if the `KeyEqual` * function takes time (if it engenders a cache-miss for example) as we then * compare the stored hashes before comparing the keys. When * `tsl::rh::power_of_two_growth_policy` is used as `GrowthPolicy`, it may also * speed-up the rehash process as we can avoid to recalculate the hash. When it * is detected that storing the hash will not incur any memory penalty due to * alignment (i.e. `sizeof(tsl::detail_robin_hash::bucket_entry) == sizeof(tsl::detail_robin_hash::bucket_entry)`) * and `tsl::rh::power_of_two_growth_policy` is used, the hash will be stored * even if `StoreHash` is false so that we can speed-up the rehash (but it will * not be used on lookups unless `StoreHash` is true). * * `GrowthPolicy` defines how the map grows and consequently how a hash value is * mapped to a bucket. By default the map uses * `tsl::rh::power_of_two_growth_policy`. This policy keeps the number of * buckets to a power of two and uses a mask to map the hash to a bucket instead * of the slow modulo. Other growth policies are available and you may define * your own growth policy, check `tsl::rh::power_of_two_growth_policy` for the * interface. * * `std::pair` must be swappable. * * `Key` and `T` must be copy and/or move constructible. * * If the destructor of `Key` or `T` throws an exception, the behaviour of the * class is undefined. * * Iterators invalidation: * - clear, operator=, reserve, rehash: always invalidate the iterators. * - insert, emplace, emplace_hint, operator[]: if there is an effective * insert, invalidate the iterators. * - erase: always invalidate the iterators. */ template , class KeyEqual = std::equal_to, class Allocator = std::allocator>, bool StoreHash = false, class GrowthPolicy = tsl::rh::power_of_two_growth_policy<2>> class robin_map { private: template using has_is_transparent = tsl::detail_robin_hash::has_is_transparent; class KeySelect { public: using key_type = Key; const key_type& operator()( const std::pair& key_value) const noexcept { return key_value.first; } key_type& operator()(std::pair& key_value) noexcept { return key_value.first; } }; class ValueSelect { public: using value_type = T; const value_type& operator()( const std::pair& key_value) const noexcept { return key_value.second; } value_type& operator()(std::pair& key_value) noexcept { return key_value.second; } }; using ht = detail_robin_hash::robin_hash, KeySelect, ValueSelect, Hash, KeyEqual, Allocator, StoreHash, GrowthPolicy>; public: using key_type = typename ht::key_type; using mapped_type = T; using value_type = typename ht::value_type; using size_type = typename ht::size_type; using difference_type = typename ht::difference_type; using hasher = typename ht::hasher; using key_equal = typename ht::key_equal; using allocator_type = typename ht::allocator_type; using reference = typename ht::reference; using const_reference = typename ht::const_reference; using pointer = typename ht::pointer; using const_pointer = typename ht::const_pointer; using iterator = typename ht::iterator; using const_iterator = typename ht::const_iterator; public: /* * Constructors */ robin_map() : robin_map(ht::DEFAULT_INIT_BUCKETS_SIZE) {} explicit robin_map(size_type bucket_count, const Hash& hash = Hash(), const KeyEqual& equal = KeyEqual(), const Allocator& alloc = Allocator()) : m_ht(bucket_count, hash, equal, alloc) {} robin_map(size_type bucket_count, const Allocator& alloc) : robin_map(bucket_count, Hash(), KeyEqual(), alloc) {} robin_map(size_type bucket_count, const Hash& hash, const Allocator& alloc) : robin_map(bucket_count, hash, KeyEqual(), alloc) {} explicit robin_map(const Allocator& alloc) : robin_map(ht::DEFAULT_INIT_BUCKETS_SIZE, alloc) {} template robin_map(InputIt first, InputIt last, size_type bucket_count = ht::DEFAULT_INIT_BUCKETS_SIZE, const Hash& hash = Hash(), const KeyEqual& equal = KeyEqual(), const Allocator& alloc = Allocator()) : robin_map(bucket_count, hash, equal, alloc) { insert(first, last); } template robin_map(InputIt first, InputIt last, size_type bucket_count, const Allocator& alloc) : robin_map(first, last, bucket_count, Hash(), KeyEqual(), alloc) {} template robin_map(InputIt first, InputIt last, size_type bucket_count, const Hash& hash, const Allocator& alloc) : robin_map(first, last, bucket_count, hash, KeyEqual(), alloc) {} robin_map(std::initializer_list init, size_type bucket_count = ht::DEFAULT_INIT_BUCKETS_SIZE, const Hash& hash = Hash(), const KeyEqual& equal = KeyEqual(), const Allocator& alloc = Allocator()) : robin_map(init.begin(), init.end(), bucket_count, hash, equal, alloc) {} robin_map(std::initializer_list init, size_type bucket_count, const Allocator& alloc) : robin_map(init.begin(), init.end(), bucket_count, Hash(), KeyEqual(), alloc) {} robin_map(std::initializer_list init, size_type bucket_count, const Hash& hash, const Allocator& alloc) : robin_map(init.begin(), init.end(), bucket_count, hash, KeyEqual(), alloc) {} robin_map& operator=(std::initializer_list ilist) { m_ht.clear(); m_ht.reserve(ilist.size()); m_ht.insert(ilist.begin(), ilist.end()); return *this; } allocator_type get_allocator() const { return m_ht.get_allocator(); } /* * Iterators */ iterator begin() noexcept { return m_ht.begin(); } const_iterator begin() const noexcept { return m_ht.begin(); } const_iterator cbegin() const noexcept { return m_ht.cbegin(); } iterator end() noexcept { return m_ht.end(); } const_iterator end() const noexcept { return m_ht.end(); } const_iterator cend() const noexcept { return m_ht.cend(); } /* * Capacity */ bool empty() const noexcept { return m_ht.empty(); } size_type size() const noexcept { return m_ht.size(); } size_type max_size() const noexcept { return m_ht.max_size(); } /* * Modifiers */ void clear() noexcept { m_ht.clear(); } std::pair insert(const value_type& value) { return m_ht.insert(value); } template ::value>::type* = nullptr> std::pair insert(P&& value) { return m_ht.emplace(std::forward

(value)); } std::pair insert(value_type&& value) { return m_ht.insert(std::move(value)); } iterator insert(const_iterator hint, const value_type& value) { return m_ht.insert_hint(hint, value); } template ::value>::type* = nullptr> iterator insert(const_iterator hint, P&& value) { return m_ht.emplace_hint(hint, std::forward

(value)); } iterator insert(const_iterator hint, value_type&& value) { return m_ht.insert_hint(hint, std::move(value)); } template void insert(InputIt first, InputIt last) { m_ht.insert(first, last); } void insert(std::initializer_list ilist) { m_ht.insert(ilist.begin(), ilist.end()); } template std::pair insert_or_assign(const key_type& k, M&& obj) { return m_ht.insert_or_assign(k, std::forward(obj)); } template std::pair insert_or_assign(key_type&& k, M&& obj) { return m_ht.insert_or_assign(std::move(k), std::forward(obj)); } template iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj) { return m_ht.insert_or_assign(hint, k, std::forward(obj)); } template iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj) { return m_ht.insert_or_assign(hint, std::move(k), std::forward(obj)); } /** * Due to the way elements are stored, emplace will need to move or copy the * key-value once. The method is equivalent to * insert(value_type(std::forward(args)...)); * * Mainly here for compatibility with the std::unordered_map interface. */ template std::pair emplace(Args&&... args) { return m_ht.emplace(std::forward(args)...); } /** * Due to the way elements are stored, emplace_hint will need to move or copy * the key-value once. The method is equivalent to insert(hint, * value_type(std::forward(args)...)); * * Mainly here for compatibility with the std::unordered_map interface. */ template iterator emplace_hint(const_iterator hint, Args&&... args) { return m_ht.emplace_hint(hint, std::forward(args)...); } template std::pair try_emplace(const key_type& k, Args&&... args) { return m_ht.try_emplace(k, std::forward(args)...); } template std::pair try_emplace(key_type&& k, Args&&... args) { return m_ht.try_emplace(std::move(k), std::forward(args)...); } template iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args) { return m_ht.try_emplace_hint(hint, k, std::forward(args)...); } template iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args) { return m_ht.try_emplace_hint(hint, std::move(k), std::forward(args)...); } iterator erase(iterator pos) { return m_ht.erase(pos); } iterator erase(const_iterator pos) { return m_ht.erase(pos); } iterator erase(const_iterator first, const_iterator last) { return m_ht.erase(first, last); } size_type erase(const key_type& key) { return m_ht.erase(key); } /** * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup to the value if you already have the hash. */ size_type erase(const key_type& key, std::size_t precalculated_hash) { return m_ht.erase(key, precalculated_hash); } /** * This overload only participates in the overload resolution if the typedef * KeyEqual::is_transparent exists. If so, K must be hashable and comparable * to Key. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> size_type erase(const K& key) { return m_ht.erase(key); } /** * @copydoc erase(const K& key) * * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup to the value if you already have the hash. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> size_type erase(const K& key, std::size_t precalculated_hash) { return m_ht.erase(key, precalculated_hash); } void swap(robin_map& other) { other.m_ht.swap(m_ht); } /* * Lookup */ T& at(const Key& key) { return m_ht.at(key); } /** * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ T& at(const Key& key, std::size_t precalculated_hash) { return m_ht.at(key, precalculated_hash); } const T& at(const Key& key) const { return m_ht.at(key); } /** * @copydoc at(const Key& key, std::size_t precalculated_hash) */ const T& at(const Key& key, std::size_t precalculated_hash) const { return m_ht.at(key, precalculated_hash); } /** * This overload only participates in the overload resolution if the typedef * KeyEqual::is_transparent exists. If so, K must be hashable and comparable * to Key. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> T& at(const K& key) { return m_ht.at(key); } /** * @copydoc at(const K& key) * * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> T& at(const K& key, std::size_t precalculated_hash) { return m_ht.at(key, precalculated_hash); } /** * @copydoc at(const K& key) */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> const T& at(const K& key) const { return m_ht.at(key); } /** * @copydoc at(const K& key, std::size_t precalculated_hash) */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> const T& at(const K& key, std::size_t precalculated_hash) const { return m_ht.at(key, precalculated_hash); } T& operator[](const Key& key) { return m_ht[key]; } T& operator[](Key&& key) { return m_ht[std::move(key)]; } size_type count(const Key& key) const { return m_ht.count(key); } /** * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ size_type count(const Key& key, std::size_t precalculated_hash) const { return m_ht.count(key, precalculated_hash); } /** * This overload only participates in the overload resolution if the typedef * KeyEqual::is_transparent exists. If so, K must be hashable and comparable * to Key. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> size_type count(const K& key) const { return m_ht.count(key); } /** * @copydoc count(const K& key) const * * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> size_type count(const K& key, std::size_t precalculated_hash) const { return m_ht.count(key, precalculated_hash); } iterator find(const Key& key) { return m_ht.find(key); } /** * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ iterator find(const Key& key, std::size_t precalculated_hash) { return m_ht.find(key, precalculated_hash); } const_iterator find(const Key& key) const { return m_ht.find(key); } /** * @copydoc find(const Key& key, std::size_t precalculated_hash) */ const_iterator find(const Key& key, std::size_t precalculated_hash) const { return m_ht.find(key, precalculated_hash); } /** * This overload only participates in the overload resolution if the typedef * KeyEqual::is_transparent exists. If so, K must be hashable and comparable * to Key. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> iterator find(const K& key) { return m_ht.find(key); } /** * @copydoc find(const K& key) * * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> iterator find(const K& key, std::size_t precalculated_hash) { return m_ht.find(key, precalculated_hash); } /** * @copydoc find(const K& key) */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> const_iterator find(const K& key) const { return m_ht.find(key); } /** * @copydoc find(const K& key) * * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> const_iterator find(const K& key, std::size_t precalculated_hash) const { return m_ht.find(key, precalculated_hash); } bool contains(const Key& key) const { return m_ht.contains(key); } /** * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ bool contains(const Key& key, std::size_t precalculated_hash) const { return m_ht.contains(key, precalculated_hash); } /** * This overload only participates in the overload resolution if the typedef * KeyEqual::is_transparent exists. If so, K must be hashable and comparable * to Key. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> bool contains(const K& key) const { return m_ht.contains(key); } /** * @copydoc contains(const K& key) const * * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> bool contains(const K& key, std::size_t precalculated_hash) const { return m_ht.contains(key, precalculated_hash); } std::pair equal_range(const Key& key) { return m_ht.equal_range(key); } /** * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ std::pair equal_range(const Key& key, std::size_t precalculated_hash) { return m_ht.equal_range(key, precalculated_hash); } std::pair equal_range(const Key& key) const { return m_ht.equal_range(key); } /** * @copydoc equal_range(const Key& key, std::size_t precalculated_hash) */ std::pair equal_range( const Key& key, std::size_t precalculated_hash) const { return m_ht.equal_range(key, precalculated_hash); } /** * This overload only participates in the overload resolution if the typedef * KeyEqual::is_transparent exists. If so, K must be hashable and comparable * to Key. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> std::pair equal_range(const K& key) { return m_ht.equal_range(key); } /** * @copydoc equal_range(const K& key) * * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> std::pair equal_range(const K& key, std::size_t precalculated_hash) { return m_ht.equal_range(key, precalculated_hash); } /** * @copydoc equal_range(const K& key) */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> std::pair equal_range(const K& key) const { return m_ht.equal_range(key); } /** * @copydoc equal_range(const K& key, std::size_t precalculated_hash) */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> std::pair equal_range( const K& key, std::size_t precalculated_hash) const { return m_ht.equal_range(key, precalculated_hash); } /* * Bucket interface */ size_type bucket_count() const { return m_ht.bucket_count(); } size_type max_bucket_count() const { return m_ht.max_bucket_count(); } /* * Hash policy */ float load_factor() const { return m_ht.load_factor(); } float min_load_factor() const { return m_ht.min_load_factor(); } float max_load_factor() const { return m_ht.max_load_factor(); } /** * Set the `min_load_factor` to `ml`. When the `load_factor` of the map goes * below `min_load_factor` after some erase operations, the map will be * shrunk when an insertion occurs. The erase method itself never shrinks * the map. * * The default value of `min_load_factor` is 0.0f, the map never shrinks by * default. */ void min_load_factor(float ml) { m_ht.min_load_factor(ml); } void max_load_factor(float ml) { m_ht.max_load_factor(ml); } void rehash(size_type count_) { m_ht.rehash(count_); } void reserve(size_type count_) { m_ht.reserve(count_); } /* * Observers */ hasher hash_function() const { return m_ht.hash_function(); } key_equal key_eq() const { return m_ht.key_eq(); } /* * Other */ /** * Convert a const_iterator to an iterator. */ iterator mutable_iterator(const_iterator pos) { return m_ht.mutable_iterator(pos); } /** * Serialize the map through the `serializer` parameter. * * The `serializer` parameter must be a function object that supports the * following call: * - `template void operator()(const U& value);` where the types * `std::int16_t`, `std::uint32_t`, `std::uint64_t`, `float` and * `std::pair` must be supported for U. * * The implementation leaves binary compatibility (endianness, IEEE 754 for * floats, ...) of the types it serializes in the hands of the `Serializer` * function object if compatibility is required. */ template void serialize(Serializer& serializer) const { m_ht.serialize(serializer); } /** * Deserialize a previously serialized map through the `deserializer` * parameter. * * The `deserializer` parameter must be a function object that supports the * following call: * - `template U operator()();` where the types `std::int16_t`, * `std::uint32_t`, `std::uint64_t`, `float` and `std::pair` must be * supported for U. * * If the deserialized hash map type is hash compatible with the serialized * map, the deserialization process can be sped up by setting * `hash_compatible` to true. To be hash compatible, the Hash, KeyEqual and * GrowthPolicy must behave the same way than the ones used on the serialized * map and the StoreHash must have the same value. The `std::size_t` must also * be of the same size as the one on the platform used to serialize the map. * If these criteria are not met, the behaviour is undefined with * `hash_compatible` sets to true. * * The behaviour is undefined if the type `Key` and `T` of the `robin_map` are * not the same as the types used during serialization. * * The implementation leaves binary compatibility (endianness, IEEE 754 for * floats, size of int, ...) of the types it deserializes in the hands of the * `Deserializer` function object if compatibility is required. */ template static robin_map deserialize(Deserializer& deserializer, bool hash_compatible = false) { robin_map map(0); map.m_ht.deserialize(deserializer, hash_compatible); return map; } friend bool operator==(const robin_map& lhs, const robin_map& rhs) { if (lhs.size() != rhs.size()) { return false; } for (const auto& element_lhs : lhs) { const auto it_element_rhs = rhs.find(element_lhs.first); if (it_element_rhs == rhs.cend() || element_lhs.second != it_element_rhs->second) { return false; } } return true; } friend bool operator!=(const robin_map& lhs, const robin_map& rhs) { return !operator==(lhs, rhs); } friend void swap(robin_map& lhs, robin_map& rhs) { lhs.swap(rhs); } private: ht m_ht; }; /** * Same as `tsl::robin_map`. */ template , class KeyEqual = std::equal_to, class Allocator = std::allocator>, bool StoreHash = false> using robin_pg_map = robin_map; } // end namespace tsl #endif ================================================ FILE: compiler/native/nerdcore/src/tsl/robin_set.h ================================================ /** * MIT License * * Copyright (c) 2017 Thibaut Goetghebuer-Planchon * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifndef TSL_ROBIN_SET_H #define TSL_ROBIN_SET_H #include #include #include #include #include #include #include "robin_hash.h" namespace tsl { /** * Implementation of a hash set using open-addressing and the robin hood hashing * algorithm with backward shift deletion. * * For operations modifying the hash set (insert, erase, rehash, ...), the * strong exception guarantee is only guaranteed when the expression * `std::is_nothrow_swappable::value && * std::is_nothrow_move_constructible::value` is true, otherwise if an * exception is thrown during the swap or the move, the hash set may end up in a * undefined state. Per the standard a `Key` with a noexcept copy constructor * and no move constructor also satisfies the * `std::is_nothrow_move_constructible::value` criterion (and will thus * guarantee the strong exception for the set). * * When `StoreHash` is true, 32 bits of the hash are stored alongside the * values. It can improve the performance during lookups if the `KeyEqual` * function takes time (or engenders a cache-miss for example) as we then * compare the stored hashes before comparing the keys. When * `tsl::rh::power_of_two_growth_policy` is used as `GrowthPolicy`, it may also * speed-up the rehash process as we can avoid to recalculate the hash. When it * is detected that storing the hash will not incur any memory penalty due to * alignment (i.e. `sizeof(tsl::detail_robin_hash::bucket_entry) == sizeof(tsl::detail_robin_hash::bucket_entry)`) * and `tsl::rh::power_of_two_growth_policy` is used, the hash will be stored * even if `StoreHash` is false so that we can speed-up the rehash (but it will * not be used on lookups unless `StoreHash` is true). * * `GrowthPolicy` defines how the set grows and consequently how a hash value is * mapped to a bucket. By default the set uses * `tsl::rh::power_of_two_growth_policy`. This policy keeps the number of * buckets to a power of two and uses a mask to set the hash to a bucket instead * of the slow modulo. Other growth policies are available and you may define * your own growth policy, check `tsl::rh::power_of_two_growth_policy` for the * interface. * * `Key` must be swappable. * * `Key` must be copy and/or move constructible. * * If the destructor of `Key` throws an exception, the behaviour of the class is * undefined. * * Iterators invalidation: * - clear, operator=, reserve, rehash: always invalidate the iterators. * - insert, emplace, emplace_hint, operator[]: if there is an effective * insert, invalidate the iterators. * - erase: always invalidate the iterators. */ template , class KeyEqual = std::equal_to, class Allocator = std::allocator, bool StoreHash = false, class GrowthPolicy = tsl::rh::power_of_two_growth_policy<2>> class robin_set { private: template using has_is_transparent = tsl::detail_robin_hash::has_is_transparent; class KeySelect { public: using key_type = Key; const key_type& operator()(const Key& key) const noexcept { return key; } key_type& operator()(Key& key) noexcept { return key; } }; using ht = detail_robin_hash::robin_hash; public: using key_type = typename ht::key_type; using value_type = typename ht::value_type; using size_type = typename ht::size_type; using difference_type = typename ht::difference_type; using hasher = typename ht::hasher; using key_equal = typename ht::key_equal; using allocator_type = typename ht::allocator_type; using reference = typename ht::reference; using const_reference = typename ht::const_reference; using pointer = typename ht::pointer; using const_pointer = typename ht::const_pointer; using iterator = typename ht::iterator; using const_iterator = typename ht::const_iterator; /* * Constructors */ robin_set() : robin_set(ht::DEFAULT_INIT_BUCKETS_SIZE) {} explicit robin_set(size_type bucket_count, const Hash& hash = Hash(), const KeyEqual& equal = KeyEqual(), const Allocator& alloc = Allocator()) : m_ht(bucket_count, hash, equal, alloc) {} robin_set(size_type bucket_count, const Allocator& alloc) : robin_set(bucket_count, Hash(), KeyEqual(), alloc) {} robin_set(size_type bucket_count, const Hash& hash, const Allocator& alloc) : robin_set(bucket_count, hash, KeyEqual(), alloc) {} explicit robin_set(const Allocator& alloc) : robin_set(ht::DEFAULT_INIT_BUCKETS_SIZE, alloc) {} template robin_set(InputIt first, InputIt last, size_type bucket_count = ht::DEFAULT_INIT_BUCKETS_SIZE, const Hash& hash = Hash(), const KeyEqual& equal = KeyEqual(), const Allocator& alloc = Allocator()) : robin_set(bucket_count, hash, equal, alloc) { insert(first, last); } template robin_set(InputIt first, InputIt last, size_type bucket_count, const Allocator& alloc) : robin_set(first, last, bucket_count, Hash(), KeyEqual(), alloc) {} template robin_set(InputIt first, InputIt last, size_type bucket_count, const Hash& hash, const Allocator& alloc) : robin_set(first, last, bucket_count, hash, KeyEqual(), alloc) {} robin_set(std::initializer_list init, size_type bucket_count = ht::DEFAULT_INIT_BUCKETS_SIZE, const Hash& hash = Hash(), const KeyEqual& equal = KeyEqual(), const Allocator& alloc = Allocator()) : robin_set(init.begin(), init.end(), bucket_count, hash, equal, alloc) {} robin_set(std::initializer_list init, size_type bucket_count, const Allocator& alloc) : robin_set(init.begin(), init.end(), bucket_count, Hash(), KeyEqual(), alloc) {} robin_set(std::initializer_list init, size_type bucket_count, const Hash& hash, const Allocator& alloc) : robin_set(init.begin(), init.end(), bucket_count, hash, KeyEqual(), alloc) {} robin_set& operator=(std::initializer_list ilist) { m_ht.clear(); m_ht.reserve(ilist.size()); m_ht.insert(ilist.begin(), ilist.end()); return *this; } allocator_type get_allocator() const { return m_ht.get_allocator(); } /* * Iterators */ iterator begin() noexcept { return m_ht.begin(); } const_iterator begin() const noexcept { return m_ht.begin(); } const_iterator cbegin() const noexcept { return m_ht.cbegin(); } iterator end() noexcept { return m_ht.end(); } const_iterator end() const noexcept { return m_ht.end(); } const_iterator cend() const noexcept { return m_ht.cend(); } /* * Capacity */ bool empty() const noexcept { return m_ht.empty(); } size_type size() const noexcept { return m_ht.size(); } size_type max_size() const noexcept { return m_ht.max_size(); } /* * Modifiers */ void clear() noexcept { m_ht.clear(); } std::pair insert(const value_type& value) { return m_ht.insert(value); } std::pair insert(value_type&& value) { return m_ht.insert(std::move(value)); } iterator insert(const_iterator hint, const value_type& value) { return m_ht.insert_hint(hint, value); } iterator insert(const_iterator hint, value_type&& value) { return m_ht.insert_hint(hint, std::move(value)); } template void insert(InputIt first, InputIt last) { m_ht.insert(first, last); } void insert(std::initializer_list ilist) { m_ht.insert(ilist.begin(), ilist.end()); } /** * Due to the way elements are stored, emplace will need to move or copy the * key-value once. The method is equivalent to * insert(value_type(std::forward(args)...)); * * Mainly here for compatibility with the std::unordered_map interface. */ template std::pair emplace(Args&&... args) { return m_ht.emplace(std::forward(args)...); } /** * Due to the way elements are stored, emplace_hint will need to move or copy * the key-value once. The method is equivalent to insert(hint, * value_type(std::forward(args)...)); * * Mainly here for compatibility with the std::unordered_map interface. */ template iterator emplace_hint(const_iterator hint, Args&&... args) { return m_ht.emplace_hint(hint, std::forward(args)...); } iterator erase(iterator pos) { return m_ht.erase(pos); } iterator erase(const_iterator pos) { return m_ht.erase(pos); } iterator erase(const_iterator first, const_iterator last) { return m_ht.erase(first, last); } size_type erase(const key_type& key) { return m_ht.erase(key); } /** * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup to the value if you already have the hash. */ size_type erase(const key_type& key, std::size_t precalculated_hash) { return m_ht.erase(key, precalculated_hash); } /** * This overload only participates in the overload resolution if the typedef * KeyEqual::is_transparent exists. If so, K must be hashable and comparable * to Key. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> size_type erase(const K& key) { return m_ht.erase(key); } /** * @copydoc erase(const K& key) * * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup to the value if you already have the hash. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> size_type erase(const K& key, std::size_t precalculated_hash) { return m_ht.erase(key, precalculated_hash); } void swap(robin_set& other) { other.m_ht.swap(m_ht); } /* * Lookup */ size_type count(const Key& key) const { return m_ht.count(key); } /** * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ size_type count(const Key& key, std::size_t precalculated_hash) const { return m_ht.count(key, precalculated_hash); } /** * This overload only participates in the overload resolution if the typedef * KeyEqual::is_transparent exists. If so, K must be hashable and comparable * to Key. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> size_type count(const K& key) const { return m_ht.count(key); } /** * @copydoc count(const K& key) const * * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> size_type count(const K& key, std::size_t precalculated_hash) const { return m_ht.count(key, precalculated_hash); } iterator find(const Key& key) { return m_ht.find(key); } /** * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ iterator find(const Key& key, std::size_t precalculated_hash) { return m_ht.find(key, precalculated_hash); } const_iterator find(const Key& key) const { return m_ht.find(key); } /** * @copydoc find(const Key& key, std::size_t precalculated_hash) */ const_iterator find(const Key& key, std::size_t precalculated_hash) const { return m_ht.find(key, precalculated_hash); } /** * This overload only participates in the overload resolution if the typedef * KeyEqual::is_transparent exists. If so, K must be hashable and comparable * to Key. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> iterator find(const K& key) { return m_ht.find(key); } /** * @copydoc find(const K& key) * * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> iterator find(const K& key, std::size_t precalculated_hash) { return m_ht.find(key, precalculated_hash); } /** * @copydoc find(const K& key) */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> const_iterator find(const K& key) const { return m_ht.find(key); } /** * @copydoc find(const K& key) * * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> const_iterator find(const K& key, std::size_t precalculated_hash) const { return m_ht.find(key, precalculated_hash); } bool contains(const Key& key) const { return m_ht.contains(key); } /** * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ bool contains(const Key& key, std::size_t precalculated_hash) const { return m_ht.contains(key, precalculated_hash); } /** * This overload only participates in the overload resolution if the typedef * KeyEqual::is_transparent exists. If so, K must be hashable and comparable * to Key. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> bool contains(const K& key) const { return m_ht.contains(key); } /** * @copydoc contains(const K& key) const * * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> bool contains(const K& key, std::size_t precalculated_hash) const { return m_ht.contains(key, precalculated_hash); } std::pair equal_range(const Key& key) { return m_ht.equal_range(key); } /** * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ std::pair equal_range(const Key& key, std::size_t precalculated_hash) { return m_ht.equal_range(key, precalculated_hash); } std::pair equal_range(const Key& key) const { return m_ht.equal_range(key); } /** * @copydoc equal_range(const Key& key, std::size_t precalculated_hash) */ std::pair equal_range( const Key& key, std::size_t precalculated_hash) const { return m_ht.equal_range(key, precalculated_hash); } /** * This overload only participates in the overload resolution if the typedef * KeyEqual::is_transparent exists. If so, K must be hashable and comparable * to Key. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> std::pair equal_range(const K& key) { return m_ht.equal_range(key); } /** * @copydoc equal_range(const K& key) * * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> std::pair equal_range(const K& key, std::size_t precalculated_hash) { return m_ht.equal_range(key, precalculated_hash); } /** * @copydoc equal_range(const K& key) */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> std::pair equal_range(const K& key) const { return m_ht.equal_range(key); } /** * @copydoc equal_range(const K& key, std::size_t precalculated_hash) */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> std::pair equal_range( const K& key, std::size_t precalculated_hash) const { return m_ht.equal_range(key, precalculated_hash); } /* * Bucket interface */ size_type bucket_count() const { return m_ht.bucket_count(); } size_type max_bucket_count() const { return m_ht.max_bucket_count(); } /* * Hash policy */ float load_factor() const { return m_ht.load_factor(); } float min_load_factor() const { return m_ht.min_load_factor(); } float max_load_factor() const { return m_ht.max_load_factor(); } /** * Set the `min_load_factor` to `ml`. When the `load_factor` of the set goes * below `min_load_factor` after some erase operations, the set will be * shrunk when an insertion occurs. The erase method itself never shrinks * the set. * * The default value of `min_load_factor` is 0.0f, the set never shrinks by * default. */ void min_load_factor(float ml) { m_ht.min_load_factor(ml); } void max_load_factor(float ml) { m_ht.max_load_factor(ml); } void rehash(size_type count_) { m_ht.rehash(count_); } void reserve(size_type count_) { m_ht.reserve(count_); } /* * Observers */ hasher hash_function() const { return m_ht.hash_function(); } key_equal key_eq() const { return m_ht.key_eq(); } /* * Other */ /** * Convert a const_iterator to an iterator. */ iterator mutable_iterator(const_iterator pos) { return m_ht.mutable_iterator(pos); } friend bool operator==(const robin_set& lhs, const robin_set& rhs) { if (lhs.size() != rhs.size()) { return false; } for (const auto& element_lhs : lhs) { const auto it_element_rhs = rhs.find(element_lhs); if (it_element_rhs == rhs.cend()) { return false; } } return true; } /** * Serialize the set through the `serializer` parameter. * * The `serializer` parameter must be a function object that supports the * following call: * - `template void operator()(const U& value);` where the types * `std::int16_t`, `std::uint32_t`, `std::uint64_t`, `float` and `Key` must be * supported for U. * * The implementation leaves binary compatibility (endianness, IEEE 754 for * floats, ...) of the types it serializes in the hands of the `Serializer` * function object if compatibility is required. */ template void serialize(Serializer& serializer) const { m_ht.serialize(serializer); } /** * Deserialize a previously serialized set through the `deserializer` * parameter. * * The `deserializer` parameter must be a function object that supports the * following call: * - `template U operator()();` where the types `std::int16_t`, * `std::uint32_t`, `std::uint64_t`, `float` and `Key` must be supported for * U. * * If the deserialized hash set type is hash compatible with the serialized * set, the deserialization process can be sped up by setting * `hash_compatible` to true. To be hash compatible, the Hash, KeyEqual and * GrowthPolicy must behave the same way than the ones used on the serialized * set and the StoreHash must have the same value. The `std::size_t` must also * be of the same size as the one on the platform used to serialize the set. * If these criteria are not met, the behaviour is undefined with * `hash_compatible` sets to true. * * The behaviour is undefined if the type `Key` of the `robin_set` is not the * same as the type used during serialization. * * The implementation leaves binary compatibility (endianness, IEEE 754 for * floats, size of int, ...) of the types it deserializes in the hands of the * `Deserializer` function object if compatibility is required. */ template static robin_set deserialize(Deserializer& deserializer, bool hash_compatible = false) { robin_set set(0); set.m_ht.deserialize(deserializer, hash_compatible); return set; } friend bool operator!=(const robin_set& lhs, const robin_set& rhs) { return !operator==(lhs, rhs); } friend void swap(robin_set& lhs, robin_set& rhs) { lhs.swap(rhs); } private: ht m_ht; }; /** * Same as `tsl::robin_set`. */ template , class KeyEqual = std::equal_to, class Allocator = std::allocator, bool StoreHash = false> using robin_pg_set = robin_set; } // end namespace tsl #endif ================================================ FILE: compiler/native/nerdcore/src/type_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __NERD__OBJECT_VECTOR #include "tsl/robin_map.h" #endif namespace NerdCore { namespace Type { typedef std::vector vector_t; typedef std::vector vector_p; typedef std::pair pair_t; #ifndef __NERD__OBJECT_VECTOR typedef tsl::robin_map object_t; #else typedef std::vector object_t; #endif typedef std::function function_t; typedef std::function clean_struct; #ifdef __NERD_ENV_ARDUINO typedef std::string StringView; #else typedef std::string_view StringView; #endif } } ================================================ FILE: compiler/native/nerdcore/src/values.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ namespace NerdCore::Global { using var = NerdCore::VAR; NerdCore::VAR null = __NERD_Create_Null(); NerdCore::VAR undefined = __NERD_Create_Null(); NerdCore::VAR Infinity = std::numeric_limits::infinity(); NerdCore::VAR NaN = std::numeric_limits::quiet_NaN(); NerdCore::VAR String = __NERD_Create_Var_Unscoped_Anon( return null; ); NerdCore::VAR Object = __NERD_Create_Var_Unscoped_Anon( return null; ); NerdCore::VAR Array = __NERD_Create_Var_Unscoped_Anon( return new NerdCore::Class::Array(); ); NerdCore::VAR Function = __NERD_Create_Var_Unscoped_Anon( return null; ); NerdCore::VAR global = new NerdCore::Class::Object(); NerdCore::VAR __NERD_THIS = global; } ================================================ FILE: compiler/native/nerdcore/src/values_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ namespace NerdCore::Global { using var = NerdCore::VAR; using let = NerdCore::VAR; extern NerdCore::VAR null; extern NerdCore::VAR undefined; extern NerdCore::VAR Infinity; extern NerdCore::VAR NaN; extern NerdCore::VAR global; extern NerdCore::VAR __NERD_THIS; //extern NerdCore::VAR String; extern NerdCore::VAR String; extern NerdCore::VAR Object; extern NerdCore::VAR Array; } ================================================ FILE: compiler/native/nerdcore/src/var.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ namespace NerdCore { VAR::VAR() { type = NerdCore::Enum::Type::Null; data.number = 0; } VAR::~VAR() { if(type > NerdCore::Enum::Type::Number) { ((NerdCore::Class::Base*)data.ptr)->Delete(); } } /*** COPY ***/ VAR::VAR(VAR const &_v) { type = _v.type; if(type < NerdCore::Enum::Type::String) { data.number = _v.data.number; } else data.ptr = ((NerdCore::Class::Base*)_v.data.ptr)->Copy(); } /* END COPY */ /*** MOVE ***/ VAR::VAR(VAR const &&_v) { type = _v.type; if(type < NerdCore::Enum::Type::String) { data.number = _v.data.number; } else if(type == NerdCore::Enum::Type::String) { ((NerdCore::Class::String*)_v.data.ptr)->counter++; data.ptr = _v.data.ptr; } else data.ptr = ((NerdCore::Class::Base*)_v.data.ptr)->Copy(); } /* END MOVE */ /*** CONSTRUCTOR ***/ VAR::VAR(NerdCore::Enum::Type _type, int _value) { this->type = _type; data.number = _value; } VAR::VAR(NerdCore::Enum::Type _type, double _value) { this->type = _type; data.number = _value; } VAR::VAR(int _value) { this->type = NerdCore::Enum::Type::Number; data.number = _value; } VAR::VAR(double _value) { this->type = NerdCore::Enum::Type::Number; data.number = _value; } VAR::VAR(unsigned long _value) { this->type = NerdCore::Enum::Type::Number; data.number = _value; } VAR::VAR(long long _value) { this->type = NerdCore::Enum::Type::Number; data.number = _value; } VAR::VAR(long long unsigned int _value) { this->type = NerdCore::Enum::Type::Number; data.number = _value; } VAR::VAR(char *_value) { type = NerdCore::Enum::Type::String; std::string s(_value); data.ptr = new NerdCore::Class::String(_value); } VAR::VAR(std::string _value) { type = NerdCore::Enum::Type::String; data.ptr = new NerdCore::Class::String(_value); } VAR::VAR(const char *_value) { type = NerdCore::Enum::Type::String; data.ptr = new NerdCore::Class::String(_value); } VAR::VAR(std::string_view _value) { type = NerdCore::Enum::Type::String; data.ptr = new NerdCore::Class::String({_value.data(), _value.size()}); } VAR::VAR(NerdCore::Class::FixedArray *_value) { type = NerdCore::Enum::Type::FixedArray; _value->counter++; data.ptr = _value; } VAR::VAR(NerdCore::Class::Array *_value) { type = NerdCore::Enum::Type::Array; _value->counter++; data.ptr = _value; } /* VAR::VAR(std::initializer_list l) { type = NerdCore::Enum::Type::Array; NerdCore::Class::Array* _arr = new NerdCore::Class::Array(l); _arr->counter++; data.ptr = _arr; } */ VAR::VAR(const NerdCore::Class::Array *_value) { type = NerdCore::Enum::Type::Array; data.ptr = (NerdCore::Class::Array *)_value; ((NerdCore::Class::Array*)data.ptr)->counter++; } VAR::VAR(bool _value) { type = NerdCore::Enum::Type::Boolean; data.number =_value; } VAR::VAR(NerdCore::Class::Function *_value) { type = NerdCore::Enum::Type::Function; _value->counter++; data.ptr = _value; } VAR::VAR(NerdCore::Class::Object *_value) { type = NerdCore::Enum::Type::Object; _value->counter++; data.ptr = _value; } VAR::VAR(NerdCore::Class::String *_value) { type = NerdCore::Enum::Type::String; data.ptr = new NerdCore::Class::String(_value->value); } VAR::VAR(NerdCore::Class::Native *_value) { type = NerdCore::Enum::Type::Native; _value->counter++; data.ptr = _value; } VAR::VAR(void *_value, void* fn) { type = NerdCore::Enum::Type::Struct; data.ptr = new NerdCore::Class::Struct(_value, (NerdCore::Type::clean_struct*)fn); } VAR::VAR(NerdCore::Enum::Type _type, void *_value) { type = _type; data.ptr = new NerdCore::Class::Function(_value); } /* END CALL OVERLOAD */ VAR & VAR::operator[] (VAR _index) { if(type < NerdCore::Enum::Type::String) return NerdCore::Global::null; if(type == NerdCore::Enum::Type::Array) { if(_index == "length") { ((NerdCore::Class::Array*)data.ptr)->length = ((NerdCore::Class::Array*)data.ptr)->value.size(); return ((NerdCore::Class::Array*)data.ptr)->length; } } else if(type == NerdCore::Enum::Type::String) { if(_index == "length") { std::cout << "StrLength" << std::endl; ((NerdCore::Class::String*)data.ptr)->length = ((NerdCore::Class::String*)data.ptr)->value.length(); return ((NerdCore::Class::String*)data.ptr)->length; } } return (*(NerdCore::Class::Base*)data.ptr)[_index]; } VAR & VAR::operator[] (VAR _index) const { if(type < NerdCore::Enum::Type::String) return NerdCore::Global::null; if(type == NerdCore::Enum::Type::Array) { if(_index == "length") { ((NerdCore::Class::Array*)data.ptr)->length = ((NerdCore::Class::Array*)data.ptr)->value.size(); return ((NerdCore::Class::Array*)data.ptr)->length; } } else if(type == NerdCore::Enum::Type::String) { if(_index == "length") { std::cout << "StrLength" << std::endl; ((NerdCore::Class::String*)data.ptr)->length = ((NerdCore::Class::String*)data.ptr)->value.length(); return ((NerdCore::Class::String*)data.ptr)->length; } } return (*(NerdCore::Class::Base*)data.ptr)[_index]; } VAR & VAR::operator[] (int _index) const { if(type < NerdCore::Enum::Type::String) return NerdCore::Global::null; return (*(NerdCore::Class::Base*)data.ptr)[_index]; } VAR & VAR::operator[] (int _index) { if(type < NerdCore::Enum::Type::String) return NerdCore::Global::null; return (*(NerdCore::Class::Base*)data.ptr)[_index]; } VAR & VAR::operator[] (double _index) { if(type < NerdCore::Enum::Type::String) return NerdCore::Global::null; return (*(NerdCore::Class::Base*)data.ptr)[_index]; } VAR & VAR::operator[] (const char* _index) { if(type < NerdCore::Enum::Type::String) return NerdCore::Global::null; if(type == NerdCore::Enum::Type::Array) { if(strcmp(_index, "length") == 0) { ((NerdCore::Class::Array*)data.ptr)->length = ((NerdCore::Class::Array*)data.ptr)->value.size(); return ((NerdCore::Class::Array*)data.ptr)->length; } } else if(type == NerdCore::Enum::Type::String) { if(strcmp(_index, "length") == 0) { ((NerdCore::Class::String*)data.ptr)->length = ((NerdCore::Class::String*)data.ptr)->value.length(); return ((NerdCore::Class::String*)data.ptr)->length; } } return (*(NerdCore::Class::Base*)data.ptr)[_index]; } /* END ACCESS OVERLOAD */ /*** END CONSTRUCTOR ***/ /*** OPERATOR ***/ void VAR::operator=(const VAR &_v) { if(this == &_v) { return; } if(type > NerdCore::Enum::Type::String) { ((NerdCore::Class::Base*)data.ptr)->Delete(); } type = _v.type; if(type < NerdCore::Enum::Type::String) { data.number = (double)_v; } else { data.ptr = ((NerdCore::Class::Base*)_v.data.ptr)->Copy(); } } /// Unary VAR::operators VAR VAR::operator+() { if(type < NerdCore::Enum::Type::String) return data.number; return (double)*this; } VAR VAR::operator-() { if(type < NerdCore::Enum::Type::String) return -data.number; return -(double)*this; } VAR VAR::operator!() { if(type < NerdCore::Enum::Type::String) return !data.number; return !(bool)*this; }; /// Logical VAR::operators VAR VAR::operator&&(const VAR &_v1) const { return (bool)*this && (bool)_v1; } VAR VAR::operator||(const VAR &_v1) const { return (bool)*this || (bool)_v1; } /// Arithmetic VAR::operators VAR VAR::operator+(const VAR &_v1) { if (type < NerdCore::Enum::Type::String) { return data.number + _v1; } else if (type == NerdCore::Enum::Type::String || type == NerdCore::Enum::Type::Array || type == NerdCore::Enum::Type::Object || _v1.type == NerdCore::Enum::Type::String) { if(_v1.type == NerdCore::Enum::Type::Null) return ((std::string)*this) + "null"; else return __NERD_Concat_To_Str((std::string)*this, (std::string)_v1); } else { return NerdCore::Global::NaN; } } VAR VAR::operator+(const char _v1[]) { return __NERD_Concat_To_Str((std::string)*this, _v1); } VAR& VAR::operator+=(const VAR &_v1) { if(type < NerdCore::Enum::Type::String) { data.number += _v1; } else if(type == NerdCore::Enum::Type::String) { ((NerdCore::Class::String*)data.ptr)->value += (std::string)_v1; } else { std::string _s = (std::string)*this; type = NerdCore::Enum::Type::String; data.ptr = new NerdCore::Class::String(""); ((NerdCore::Class::String*)data.ptr)->value += _s + (std::string)_v1; } return *this; } VAR VAR::operator-(const VAR &_v1) { if (type < NerdCore::Enum::Type::String ) return data.number - _v1; else return NerdCore::Global::NaN; } VAR& VAR::operator-=(const VAR &_v1) { if(type < NerdCore::Enum::Type::String) data.number -= _v1; else { return NerdCore::Global::NaN; } return *this; } VAR VAR::operator*(const VAR &_v1) { if(type < NerdCore::Enum::Type::String) return data.number * _v1; return NerdCore::Global::NaN; } VAR& VAR::operator*=(const VAR &_v1) { if(type < NerdCore::Enum::Type::String) data.number *= _v1; return *this; } VAR VAR::operator/(const VAR &_v1) { if (type < NerdCore::Enum::Type::String) return data.number / _v1; return NerdCore::Global::NaN; } VAR& VAR::operator/=(const VAR &_v1) { if(type < NerdCore::Enum::Type::String) data.number /= _v1; return *this; } VAR VAR::operator%(const VAR &_v1) { if (type < NerdCore::Enum::Type::String && _v1.type < NerdCore::Enum::Type::String) { int _left = (int)_v1; if(_left == 0) return NerdCore::Global::NaN; return (int)data.number % _left; } else { double _left = (double)_v1; if(_left == 0) return NerdCore::Global::NaN; return remainder((double)*this, _left); } } VAR& VAR::operator%=(const VAR &_v1) { if (type < NerdCore::Enum::Type::String) { int _left = (int)data.number; _left %= (int)_v1; if(_left == 0) data.number = std::numeric_limits::quiet_NaN(); data.number = _left; } else { return NerdCore::Global::NaN; } return *this; } // TODO: "**" and "**=" VAR::operators // var++ /* inline VAR& VAR::operator++(const int _v1) { if (type < NerdCore::Enum::Type::String) { data.number++; } return *this; } // ++var VAR& VAR::operator++() { if (type < NerdCore::Enum::Type::String) { ++data.number; } return *this; } // var-- VAR& VAR::operator--(const int _v1) { if (type < NerdCore::Enum::Type::String) { data.number--; } return *this; } // --var VAR& VAR::operator--() { if (type < NerdCore::Enum::Type::String) { --data.number; } return *this; } */ /// Comparison VAR::operators VAR VAR::operator==(const VAR &_v1) const { if (type == _v1.type) { switch (type) { case NerdCore::Enum::Type::Number: return (bool)(data.number == _v1); case NerdCore::Enum::Type::Boolean: return __NERD_Create_Boolean((bool)data.number == (bool)_v1); case NerdCore::Enum::Type::String: return __NERD_Create_Boolean((((NerdCore::Class::String*)data.ptr)->value).compare((std::string)_v1) == 0); case NerdCore::Enum::Type::Null: case NerdCore::Enum::Type::Array: case NerdCore::Enum::Type::Native: case NerdCore::Enum::Type::Function: case NerdCore::Enum::Type::Object: default: return _v1.data.ptr == this->data.ptr; } } else { if (type == NerdCore::Enum::Type::String || _v1.type == NerdCore::Enum::Type::String) { return __NERD_Create_Boolean((std::string) * this == (std::string)_v1); } else return __NERD_Create_Boolean((double)*this == (double)_v1); } } // === emulated with __NERD_EQUAL_VALUE_AND_TYPE VAR VAR::operator!=(const VAR &_v1) { return !(*this == _v1); } // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE VAR VAR::operator<(const VAR &_v1) { return data.number < (double)_v1; } VAR VAR::operator<=(const VAR &_v1) { return (int)*this <= (int)_v1; } VAR VAR::operator>(const VAR &_v1) { return (int)*this > (int)_v1; } VAR VAR::operator>=(const VAR &_v1) { return (int)*this >= (int)_v1; } /// Bitwise VAR::operators VAR VAR::operator&(const VAR &_v1) { return (int)*this & (int)_v1; } VAR& VAR::operator&=(const VAR &_v1) { type = NerdCore::Enum::Type::Number; data.number = (int)*this & (int)_v1; return *this; } VAR VAR::operator|(const VAR &_v1) { return (int)*this | (int)_v1; } VAR VAR::operator|=(const VAR &_v1) { if (type < NerdCore::Enum::Type::String) { data.number = (int)data.number | (int)_v1; } else { return NerdCore::Global::NaN; } return *this; } VAR VAR::operator^(const VAR &_v1) { return (int)*this ^ (int)_v1; } VAR VAR::operator^=(const VAR &_v1) { if (type < NerdCore::Enum::Type::String) { data.number = (int)data.number ^ (int)_v1; } else { return NerdCore::Global::NaN; } return *this; } VAR VAR::operator~() { return ~(int)*this; } VAR VAR::operator>>(const VAR &_v1) { return (int)*this >> (int)_v1; } VAR VAR::operator>>=(const VAR &_v1) { if (type < NerdCore::Enum::Type::String) { data.number = (int)data.number >> (int)_v1; } else { return NerdCore::Global::NaN; } return *this; } VAR VAR::operator<<(const VAR &_v1) { return (int)*this << (int)_v1; } VAR VAR::operator<<=(const VAR &_v1) { if (type < NerdCore::Enum::Type::String) { data.number = (int)data.number << (int)_v1; } else { return NerdCore::Global::NaN; } return *this; } VAR::operator int() const { if(type < NerdCore::Enum::Type::String) return data.number; return (int)(*(NerdCore::Class::Base*)data.ptr); } VAR::operator int() { if(type < NerdCore::Enum::Type::String) return data.number; return (int)(*(NerdCore::Class::Base*)data.ptr); } VAR::operator double() const { if(type < NerdCore::Enum::Type::String) return data.number; return (double)(*(NerdCore::Class::Base*)data.ptr); } VAR::operator double() { if(type < NerdCore::Enum::Type::String) return data.number; return (double)(*(NerdCore::Class::Base*)data.ptr); } VAR::operator bool() const { if(type == NerdCore::Enum::Type::Null) return false; else if(type == NerdCore::Enum::Type::Boolean || type == NerdCore::Enum::Type::Number) return data.number; else return (bool)(*(NerdCore::Class::Base*)data.ptr); } VAR::operator bool() { if(type == NerdCore::Enum::Type::Null) return false; else if(type == NerdCore::Enum::Type::Boolean || type == NerdCore::Enum::Type::Number) return data.number; else return (bool)(*(NerdCore::Class::Base*)data.ptr); } VAR::operator const char*() const { if(type == NerdCore::Enum::Type::String) { return ((NerdCore::Class::String*)this->data.ptr)->value.c_str(); } else { throw(NerdCore::VAR("Char* conversion error: variable is not a string")); } } VAR::operator std::string() const { if(type < NerdCore::Enum::Type::String) return __NERD_DOUBLE_TO_STRING(data.number); return (std::string)(*(NerdCore::Class::Base*)data.ptr); } VAR::operator std::string() { if(type < NerdCore::Enum::Type::String) return __NERD_DOUBLE_TO_STRING(data.number); return (std::string)(*(NerdCore::Class::Base*)data.ptr); } VAR::operator long long() { if(type < NerdCore::Enum::Type::String) return data.number; return (long long)((double)*this); } VAR::operator long long() const { if(type < NerdCore::Enum::Type::String) return data.number; return (long long)((double)*this); } VAR::operator std::string_view() const { if(type == NerdCore::Enum::Type::String) { return std::string_view(((NerdCore::Class::String*)this->data.ptr)->value.c_str()); } else { throw(NerdCore::VAR("string_view conversion error: variable is not a string")); } } } // namespace NerdCore ================================================ FILE: compiler/native/nerdcore/src/var_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ namespace NerdCore { union Data { void* ptr; double number; }; struct VAR { NerdCore::Enum::Type type; Data data; VAR(); ~VAR(); /**/ VAR(VAR const &_v); VAR(VAR const &&_v); /**/ /*** CONSTRUCTOR ***/ VAR(NerdCore::Enum::Type _type, int _value); VAR(NerdCore::Enum::Type _type, double _value); VAR(int _value); VAR(double _value); VAR(long long _value); VAR(unsigned long _value); VAR(long long unsigned int _value); VAR(char *_value); VAR(std::string _value); VAR(const char *_value); VAR(std::string_view _value); VAR(NerdCore::Class::FixedArray *_value); VAR(NerdCore::Class::Array *_value); //VAR(std::initializer_list l); VAR(const NerdCore::Class::Array *_value); VAR(bool _value); VAR(NerdCore::Class::Function *_value); VAR(NerdCore::Class::Object *_value); VAR(NerdCore::Class::String *_value); VAR(NerdCore::Class::Native *_value); VAR(NerdCore::Class::Undefined *_value); VAR(void *_value, void* fn); VAR(NerdCore::Enum::Type _type, void *_value); VAR(NerdCore::Enum::Type _type, void *_value, VAR _this); VAR(std::function &_value); /* template VAR(NerdCore::Class::NativeTPL* _value) { this->type = NerdCore::Enum::Type::NativeTPL; data.ptr = _value; }; template T toNative (T _type) { if(type == NerdCore::Enum::Type::NativeTPL) { return (*(NerdCore::Class::NativeTPL*)data.ptr)(_type); } else { #ifndef __NERD_NO_EXCEPT throw VAR("TypeError: Object is not a Native object"); #endif exit(1); } } template T toNative () { if(type == NerdCore::Enum::Type::NativeTPL) { return (*(NerdCore::Class::NativeTPL*)data.ptr)(); } else { #ifndef __NERD_NO_EXCEPT throw VAR("TypeError: Object is not a Native object"); #endif exit(1); } } template T Ptr () { if(type == NerdCore::Enum::Type::NativeTPL) { return (NerdCore::Class::NativeTPL*)data.ptr; } else { #ifndef __NERD_NO_EXCEPT throw VAR("TypeError: Object is not a Native object"); #endif exit(1); } } */ template VAR operator() (NerdCore::VAR __NERD_THIS, Args... args) const { if (type != NerdCore::Enum::Type::Function) { #ifndef __NERD_NO_EXCEPT throw VAR("TypeError: object is not a function"); #endif exit(1); } else return (*(NerdCore::Class::Function*)data.ptr)(__NERD_THIS, (VAR)(args)...); } /* END CALL OVERLOAD */ VAR & operator[] (VAR _index); VAR & operator[] (VAR _index) const; VAR & operator[] (int _index) const; VAR & operator[] (int _index); VAR & operator[] (double _index); VAR & operator[] (const char* _index); /* END ACCESS OVERLOAD */ /*** END CONSTRUCTOR ***/ /*** OPERATOR ***/ void operator=(const VAR &_v); /// Unary operators VAR operator+(); VAR operator-(); VAR operator!(); /// Logical operators VAR operator&&(const VAR &_v1) const; VAR operator||(const VAR &_v1) const; /// Arithmetic operators VAR operator+(const VAR &_v1); VAR operator+(const char _v1[]); VAR& operator+=(const VAR &_v1); VAR operator-(const VAR &_v1); VAR& operator-=(const VAR &_v1); VAR operator*(const VAR &_v1); VAR& operator*=(const VAR &_v1); VAR operator/(const VAR &_v1); VAR& operator/=(const VAR &_v1); VAR operator%(const VAR &_v1); VAR& operator%=(const VAR &_v1); // TODO: "**" and "**=" operators // var++ inline VAR& operator++(const int _v1) noexcept { if (type < NerdCore::Enum::Type::String) { data.number++; } return *this; } // ++var inline VAR& operator++() { if (type < NerdCore::Enum::Type::String) { ++data.number; } return *this; } // var-- inline VAR& operator--(const int _v1) { if (type < NerdCore::Enum::Type::String) { data.number--; } return *this; } // --var inline VAR& operator--() { if (type < NerdCore::Enum::Type::String) { --data.number; } return *this; } /// Comparison operators VAR operator==(const VAR &_v1) const; // === emulated with __NERD_EQUAL_VALUE_AND_TYPE VAR operator!=(const VAR &_v1); // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE VAR operator<(long long int &_v1); VAR operator<(int &_v1); VAR operator<(double &_v1); VAR operator<(const VAR &_v1); VAR operator<=(const VAR &_v1); VAR operator>(const VAR &_v1); VAR operator>=(const VAR &_v1); /// Bitwise operators VAR operator&(const VAR &_v1); VAR& operator&=(const VAR &_v1); VAR operator|(const VAR &_v1); VAR operator|=(const VAR &_v1); VAR operator^(const VAR &_v1); VAR operator^=(const VAR &_v1); VAR operator~(); VAR operator>>(const VAR &_v1); VAR operator>>=(const VAR &_v1); VAR operator<<(const VAR &_v1); VAR operator<<=(const VAR &_v1); explicit operator int() const; operator int(); explicit operator double() const; operator double(); explicit operator bool() const; operator bool(); explicit operator std::string() const; operator std::string(); operator const char*() const; operator long long(); explicit operator long long() const; operator std::string_view() const; }; } // namespace NerdCore ================================================ FILE: compiler/native/nerdcore/test/array.cpp ================================================ #include "../src/nerd.hpp" using namespace NerdCore; using namespace NerdCore::Global; using namespace NerdCore::Class; using namespace NerdCore::Functions; int main(int argc, char** argv) { var arr = new Array(); println(arr); var initArr = new Array(0, "one", 2, "three"); println(initArr); var initArr2 = {"zero", 1, "two", 3}; println(initArr2); return 0; } ================================================ FILE: compiler/native/nerdcore/test/cast.cpp ================================================ #include "../src/nerd.hpp" using namespace NerdCore; using namespace NerdCore::Global; using namespace NerdCore::Class; using namespace NerdCore::Functions; int main() { try { var _str = "string"; std::cout << "_str: " << _str << std::endl; var _nbr = 123; std::cout << "_nbr: " << _nbr << std::endl; const char* c = _str; std::cout << "char: " << c << std::endl; std::string s = _str; std::cout << "string: " << s << std::endl; std::string_view sv = _str; std::cout << "string_view: " << sv << std::endl; int i = _nbr; std::cout << "int: " << i << std::endl; double d = _nbr; std::cout << "double: " << d << std::endl; long long ll = _nbr; std::cout << "long long: " << ll << std::endl; bool b = _nbr; std::cout << "bool: " << b << std::endl; } catch(var& error) { println(error); } return 0; } ================================================ FILE: compiler/native/nerdcore/test/native.cpp ================================================ #include "../src/nerd.hpp" using namespace NerdCore; using namespace NerdCore::Global; using namespace NerdCore::Class; using namespace NerdCore::Functions; struct s { int i = 10; int j; }; s* typeStruct = new s(); int main(int argc, char** argv) { try { #if __cplusplus > 202002L auto __fn = []() {std::cout << "Hello" << std::endl;}; var _struct = new NativeTPL(new s({3,4})); std::cout << _struct.toNative(typeStruct)->i << std::endl; var _fn = new NativeTPL(__fn); _fn.toNative(__fn)(); #else var _struct = new NativeTPL(new s({3,4})); std::cout << _struct.toNative(typeStruct)->i << std::endl; #endif } catch(var e) { println(e); } return 0; } ================================================ FILE: compiler/native/nerdcore/test/object.cpp ================================================ #include "../src/nerd.hpp" using namespace NerdCore; using namespace NerdCore::Global; using namespace NerdCore::Class; using namespace NerdCore::Functions; int main(int argc, char** argv) { var args = getArguments(argc, argv); println(args); var o = new Object(); o["int"] = 1; o["string"] = "str"; println(o); var init = new Object( { {"one", 1}, // number {"two", "2"}, // string {"three", {1,2,3}}, // array {"four", new Object("key", "value")}, // sub object with only one key {"five", new Object({"key", 1})}, // another way with non string value {"six", new Object({ {"key", 2} })}, // another way with non string value }); println(init); return 0; } ================================================ FILE: compiler/native/nerdcore/test/operators.cpp ================================================ #include "../src/nerd.hpp" using namespace NerdCore; using namespace NerdCore::Global; using namespace NerdCore::Class; using namespace NerdCore::Functions; int main() { try { var a = 1; println(a + a); println(a + 1); println(a + "1"); println(1 + a); println("1" + a); println(a - a); println(a - 1); println(a - "1"); println(1 - a); println("1" - a); println(a * a); println(a * 1); println(a * "1"); println(1 * a); println("1" * a); println(a / a); println(a / 1); println(a / "1"); println(1 / a); println("1" / a); println(a == a); println(a == 1); println(a == "1"); println(a != a); println(a != 1); println(a != "1"); println(a > a); println(a > 1); println(a > "1"); println(a < a); println(a < 1); println(a < "1"); println(a >= a); println(a >= 1); println(a >= "1"); println(a <= a); println(a <= 1); println(a <= "1"); println(a | a); println(a | 1); println(a | "1"); println(a & a); println(a & 1); println(a & "1"); println(a ^ a); println(a ^ 1); println(a ^ "1"); } catch(var& error) { println(error); } return 0; } ================================================ FILE: compiler/native/squel/arduino.cpp ================================================ #define _USE_MATH_DEFINES #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define __NERD_ENV_ARDUINO #define __NERD_NO_EXCEPT #include "nerdcore/src/nerd.cpp" using namespace NerdCore::Global; using namespace NerdCore::Functions; #define __NERD_Create_Object() new NerdCore::Class::Object() #define __NERD_Create_Array(_arr) new NerdCore::Class::Array(_arr) #define __NERD_InitVar() NerdCore::VAR() var __NERD_ENV = "arduino"; var __NERD_PLATFORM = "{{__PLATFORM__}}"; // Declared weak in Arduino.h to allow user redefinitions. int atexit(void (* /*func*/ )()) { return 0; } // Weak empty variant initialization function. // May be redefined by variant files. void initVariant() __attribute__((weak)); void initVariant() { } void setupUSB() __attribute__((weak)); void setupUSB() { } {INCLUDE} int main(int argc, char* argv[]) { {DECL} init(); initVariant(); #if defined(USBCON) USBDevice.attach(); #endif {INIT} { {CODE} } return 0; } ================================================ FILE: compiler/native/squel/js.cpp ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include #include #include #include #include #include #include "nerdcore/src/nerd.hpp" using namespace NerdCore::Global; var __NJS_ENV = "std"; var __NJS_PLATFORM = "{{__PLATFORM__}}"; NerdCore::Global::var __NERD_ARGS = new NerdCore::Class::Array(); NerdCore::Global::var _ = new NerdCore::Class::Object(); NerdCore::Global::var __dirname; {INCLUDE} std::string ToFixed(double number, size_t digits) { char format[10]; char str[64]; sprintf_s(format, "%%0.%zdf", digits); return std::string(str, sprintf_s(str, format, number)); } int main(int __NERD_VARLENGTH, char* __Nerd_Argv[]) { global["__NERD__"] = true; std::string argv_str(__Nerd_Argv[0]); #ifdef _WIN32 std::string __NERD_DIRNAME = argv_str.substr(0, argv_str.find_last_of("\\")); #elif _WIN64 std::string __NERD_DIRNAME = argv_str.substr(0, argv_str.find_last_of("\\")); #else std::string __NERD_DIRNAME = argv_str.substr(0, argv_str.find_last_of("/")); #endif if(__NERD_DIRNAME.size() == argv_str.size()) { __dirname = ""; } else { __dirname = __NERD_DIRNAME; } NerdCore::VAR __NERD_VARARGS[__NERD_VARLENGTH]; for( int i = 0; i < __NERD_VARLENGTH; i++) { __NERD_ARGS[i] = __Nerd_Argv[i]; __NERD_VARARGS[i] = __Nerd_Argv[i]; } //NerdCore::VAR Object = __NERD_Create_Var_Scoped_Copy_Anon( return __NERD_THIS; ); //NerdCore::VAR String = __NERD_Create_Var_Scoped_Copy_Anon( return __NERD_THIS; ); {DECL} Object["prototype"] = new NerdCore::Class::Object(); Object["prototype"]["valueOf"] = __NERD_Create_Var_Scoped_Copy_Anon({ return __NERD_THIS; }); Object["prototype"]["toString"] = __NERD_Create_Var_Scoped_Copy_Anon({ return __NERD_THIS; }); String["prototype"] = new NerdCore::Class::Object(); String["prototype"]["__proto__"] = Object["prototype"]; String["prototype"]["valueOf"] = __NERD_Create_Var_Scoped_Copy_Anon({ return ((char*)__NERD_OBJECT(__NERD_THIS)->bind); }); String["prototype"]["toString"] = __NERD_Create_Var_Scoped_Copy_Anon({ return ((char*)__NERD_OBJECT(__NERD_THIS)->bind); }); Array["prototype"] = new NerdCore::Class::Object(); Array["prototype"]["__proto__"] = Object["prototype"]; Array["prototype"]["indexOf"] = __NERD_Create_Var_Scoped_Copy_Anon({ if(__NERD_VARLENGTH == 0) { return -1; } else { int i = -1; int _max = __NERD_ARRAY(__NERD_THIS)->value.size(); while(++i < _max) { if(__NERD_ARRAY(__NERD_THIS)->value[i] == __NERD_VARARGS[0]) { return i; } } return -1; } }); Array["prototype"]["push"] = __NERD_Create_Var_Scoped_Copy_Anon({ if(__NERD_VARLENGTH == 0) { return 0; } else { for(int i = 0; i < __NERD_VARLENGTH; i++) { __NERD_ARRAY(__NERD_THIS)->value.push_back(__NERD_VARARGS[i]); } return __NERD_VARLENGTH; } }); Array["isArray"] = __NERD_Create_Var_Scoped_Copy_Anon({ if(__NERD_VARLENGTH == 0) { return false; } else { if(__NERD_VARARGS[0].type == NerdCore::Enum::Type::Array) { return true; } return false; } }); try { {INIT} #ifdef __NERD_INIT_RAND_SEED srand (time(NULL)); #endif { {CODE} } } catch(NerdCore::VAR __NERD_Global_Exception) { __NERD_Log_Console(__NERD_Global_Exception); exit(1); } return 0; } ================================================ FILE: compiler/native/squel/std.cpp ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include #include #include #include #include #include #include "nerdcore/src/nerd.hpp" using namespace NerdCore::Global; var __NJS_ENV = "std"; var __NJS_PLATFORM = "{{__PLATFORM__}}"; NerdCore::Global::var __NERD_ARGS = new NerdCore::Class::Array(); NerdCore::Global::var _ = new NerdCore::Class::Object(); NerdCore::Global::var __dirname; {INCLUDE} int main(int __NERD_VARLENGTH, char* __Nerd_Argv[]) { {DECL} Object["prototype"] = new NerdCore::Class::Object(); Object["prototype"]["valueOf"] = __NERD_Create_Var_Scoped_Copy_Anon({ return __NERD_THIS; }); Object["prototype"]["toString"] = __NERD_Create_Var_Scoped_Copy_Anon({ return __NERD_THIS; }); String["prototype"] = new NerdCore::Class::Object(); String["prototype"]["__proto__"] = Object["prototype"]; String["prototype"]["valueOf"] = __NERD_Create_Var_Scoped_Copy_Anon({ return ((char*)__NERD_OBJECT(__NERD_THIS)->bind); }); String["prototype"]["toString"] = __NERD_Create_Var_Scoped_Copy_Anon({ return ((char*)__NERD_OBJECT(__NERD_THIS)->bind); }); std::string argv_str(__Nerd_Argv[0]); #ifdef _WIN32 std::string __NERD_DIRNAME = argv_str.substr(0, argv_str.find_last_of("\\")); #elif _WIN64 __NERD_DIRNAME = argv_str.substr(0, argv_str.find_last_of("\\")); #else __NERD_DIRNAME = argv_str.substr(0, argv_str.find_last_of("/")); #endif if(__NERD_DIRNAME.size() == argv_str.size()) { __dirname = ""; } else { __dirname = __NERD_DIRNAME; } NerdCore::VAR __NERD_VARARGS[__NERD_VARLENGTH]; for( int i = 0; i < __NERD_VARLENGTH; i++) { __NERD_ARGS[i] = __Nerd_Argv[i]; __NERD_VARARGS[i] = __Nerd_Argv[i]; } try { {INIT} #ifdef __NERD_INIT_RAND_SEED srand (time(NULL)); #endif { {CODE} } } catch(NerdCore::VAR __NERD_Global_Exception) { __NERD_Log_Console(__NERD_Global_Exception); exit(1); } return 0; } ================================================ FILE: compiler/native/squel/wasm.cpp ================================================ #define __NERD_ENV_WASM #include "nerdcore/src/nerd.hpp" using namespace NerdCore::Global; using namespace NerdCore::Functions; var __NERD_ENV = "wasm"; var __NERD_PLATFORM = "{{__PLATFORM__}}"; NerdCore::Global::var __NERD_ARGS = new NerdCore::Class::Array(); {INCLUDE} int main(int __NERD_VARLENGTH, char* __Nerd_Argv[]) { {DECL} NerdCore::VAR __NERD_VARARGS[__NERD_VARLENGTH]; for( int i = 0; i < __NERD_VARLENGTH; i++) { __NERD_ARGS[i] = __Nerd_Argv[i]; __NERD_VARARGS[i] = __Nerd_Argv[i]; } try { {INIT} #ifdef __NERD_INIT_RAND_SEED srand (time(NULL)); #endif { {CODE} } } catch(NerdCore::VAR __NERD_Global_Exception) { __NERD_Log_Console(__NERD_Global_Exception); exit(1); } return 0; } ================================================ FILE: compiler/self/base/cli/cliParser.ng ================================================ var parseCLI = function(args) { var result = { error: false, msg: "", cli: {}, stack: [], useless: [] }; var useless = [0, 1]; var withArgs = ["--target", "--spec", "--env", "--stack", "-o", "--preset", "--flash", "--compiler", "-c", "--build", "-b", "--option", "--register", "-r", "--setauthor", "--setid", "--setkey", "--setapi", "--setport", "--sethash", "--setsdk", "--setndk", "--setwin_inc_ucrt", "--setwin_lib_ucrt", "--setwin_lib_um", "--setxcode"]; var noArgs = ["--install_external", "--debug", "--conserve", "--generate", "--config", "--reinit", "--example", "--examples" , "--prepare", "--project", "--run", "--clean", "--purge", "--check", "--no-check", "--verbose", "-v", "--tips", "--version", "--help", "-h", "--release", "--no-object-hashmap"]; for(var i = 0; i < args.length; i++) { if( useless.indexOf(i) > -1 ) { result.useless.push(args[i]); } else if( withArgs.indexOf(args[i]) > -1) { if(args[i+1]) { result.cli[args[i]] = { state: true, argument: args[i+1], }; i++; } else { result.error = true; result.msg = "[!] Missing argument for " + args[i]; break; } } else if(noArgs.indexOf(args[i]) > -1) { result.cli[args[i]] = { state: true, }; } else if(args[i].length > 0 && args[i][0] == "-") { if(withArgs.indexOf(args[i]) < 0 && noArgs.indexOf(args[i]) < 0) { result.error = true; result.msg = "[!] Unknown parameter : " + args[i]; break; } } else result.stack.push(args[i]); } return result; }; return parseCLI; ================================================ FILE: compiler/self/base/compiler/target.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var target = ["win-x86-32", "win-x86-64", "linux-x86-32", "linux-x86-64", "linux-arm32v7", "arduino-uno", "arduino-mega1280", "arduino-mega2560", "wasm", "wast", "asm-js", "mac-osx", "nucleo-l152re", "nucleo-l432kc" ]; module.exports = target; ================================================ FILE: compiler/self/base/util/copyDirSync.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function copyDirSync( source, target ) { var targetFile = target; if ( fs.existsSync( target ) ) { if ( fs.lstatSync( target ).isDirectory() ) { targetFile = path.join( target, path.basename( source ) ); } } fs.copyFileSync(source, targetFile); } function copyFolderRecursiveSync( source, target, _root ) { var files = []; var targetFolder = path.join( target, path.basename( source ) ); if(_root) targetFolder = target; if ( !fs.existsSync( targetFolder ) ) { fs.mkdirSync( targetFolder ); } if ( fs.lstatSync( source ).isDirectory() ) { files = fs.readdirSync( source ); files.forEach( function ( file ) { var curSource = path.join( source, file ); if ( fs.lstatSync( curSource ).isDirectory() ) { copyFolderRecursiveSync( curSource, targetFolder ); } else { copyDirSync( curSource, targetFolder ); } } ); } } module.exports = copyFolderRecursiveSync; ================================================ FILE: compiler/self/base/util/copyRecursive.js ================================================ var copyRecursiveSync = function(src, dest) { if(!fs.existsSync(src)) { console.log("[!] Warning: " + src + " doesn't exist"); return; } if(fs.lstatSync( src ).isDirectory()) { var _newDest = path.dirname(dest); copyDirSync(src, _newDest, true); } else { var _path = []; var _newDest = path.dirname(dest); _path.push(_newDest); while(path.dirname(_newDest) != _newDest) { _newDest = path.dirname(_newDest); if(_newDest.indexOf(NERD_PATH) == 0) { _path.push(_newDest); } } for(var i = _path.length; i > -1; i--) { try { fs.mkdirSync(_path[i]); } catch(e){} } fs.copyFileSync(src, dest); } }; module.exports = copyRecursiveSync; ================================================ FILE: compiler/self/base/util/flash.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module.exports = Flash; var fs = require("fs"); var path = require("path"); function Flash(from, to, target, verb) { switch(target) { case "uno": execFlashArduino(from, to, "ATMEGA328P", "arduino", "19200", verb) break; case "mega1280": execFlashArduino(from, to, "m1280", "arduino", "57600", verb) break; case "mega2560": execFlashArduino(from, to, "m2560", "wiring", "115200", verb) break; case "nucleo-l152re": case "nucleo-l432kc": execFlashSTM32(from, to); break; default: console.log("Nothing to do for target : " + target); break; } } function execFlashArduino(from, to, model, driver, bauds, verb) { var spawn = require('child_process').spawn; var _flash = spawn('avrdude', ['-p', model, "-c", driver, "-P", to, "-b", bauds, "-F", "-U", "flash:w:"+from]); _flash.stdout.on('data', function(data) { if(verb) process.stdout.write(data.toString()); }); _flash.stderr.on('data', function(data) { if(verb) process.stdout.write(data.toString()); }); _flash.on('error', function(err) { console.log("[!] Error :"); console.log(err) }); _flash.on('close', function(code) { console.log("[+] Flashed") }); } function execFlashSTM32(from, to) { try { fs.writeFileSync(path.join(to, from), fs.readFileSync(from)); console.log("[+ Flashed]"); } catch(e) { console.log("[!] Your file is compiled, but an error occured while flashing, please try again.") } } ================================================ FILE: compiler/self/base/util/getExt.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module.exports = getExt; function getExt(target) { switch(target) { case "wasm": return ".wasm"; break; case "asm-js": return ".asm.js"; break; case "wast": return ".wast"; break; case "win-x86-32": case "win-x86-64": return "-" + target + ".exe"; break; case "nucleo-l432kc": case "nucleo-l152re": case "mac-osx": case "linux-x86-32": case "linux-x86-64": case "linux-arm32v7": return "-" + target + ".bin"; break; case "arduino-uno": return "-" + target + ".hex"; break; case "arduino-mega1280": return "-" + target + ".hex"; break; case "arduino-mega2560": return "-" + target + ".hex"; break; default: return ".bin"; break; } } ================================================ FILE: compiler/self/base/util/getTips.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module.exports = getTips; function getTips(target, file) { switch(target) { case "wasm": return ""; break; case "asm-js": return "[*] Tips : run this file with node : 'node " + file + "', or embed it in a .html page with " break; case "wast": return ""; break; case "win-x86-32": case "win-x86-64": return "[*] Tips : on Linux, you can run this .exe with Wine : 'wine " + file + "'" break; case "linux-x86-32": case "linux-x86-64": case "linux-arm32v7": return "[*] Tips : on Linux, don't forget to : 'chmod +x " + file + "'." break; case "arduino-uno": return "[*] Tips : avrdude -p ATMEGA328P -c arduino -P [COMPORT] -b 19200 -F -U flash:w:" + file; break; case "arduino-mega1280": return "[*] Tips : avrdude -p m1280 -c arduino -P [COMPORT] -b 57600 -F -U flash:w:" + file; break; case "arduino-mega2560": return "[*] Tips : avrdude -p m2560 -c wiring -P [COMPORT] -b 115200 -F -U flash:w:" + file; break; case "nucleo-l152re": case "nucleo-l432kc": return "[*] Connect your nucleo on your computer, and symple copy/paste " + file + " on the nucleo drive" default: return ""; break; } } ================================================ FILE: compiler/self/base/util/httpUtils.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var http = require("http"); var https = require("https"); module.exports.httpUtil = new httpUtil(http); module.exports.httpsUtil = new httpUtil(https); /** * httpUtil Catalog of standard http call * @class httpUtil * @name httpUtil * @memberof WF * */ function httpUtil(httpHandler) { /** * Send a http request. * @memberof httpUtil * @example wf.httpUtil.httpReq(opt, cbError, cbOk, "utf-8"); * */ this.httpReq = function(opt, cbError, cbOk, encoding) { var data = ""; if(opt.data) data = opt.data; if(!encoding) encoding = "utf8"; opt.path = encodeURI(opt.path); var request = httpHandler.request(opt); request.on("error", function(err) { cbError(err); }); request.on("response", function(response) { var data = ""; response.on("data", function(chunk) { data += chunk.toString(encoding); }); response.on("end", function() { cbOk(data); }); }); request.end(data); return; }; /** * Send a http request and redirect output in a pipe, then call a callback when finished. * @memberof httpUtil * @example wf.httpUtil.httpReqPipe(opt, cbError, cbPipe, cbOk); * */ this.httpReqPipe = function(opt, cbError,cbPipe, cbOk) { var data = ""; if(opt.data) data = opt.data; opt.path = encodeURI(opt.path); var request = httpHandler.request(opt); request.on("error", function(err) { cbError(err); }); request.on("response", function(response) { if(cbPipe) cbPipe(response); response.on("end", function() { if(cbOk) cbOk(); }); }); request.end(data); return; }; } ================================================ FILE: compiler/self/base/util/rmdir.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var rmdir = function(dir, callback) { fs.readdir(dir, function(err, list) { if(err) { try { fs.unlink(dir, function(err) { callback(err); }); } catch(e){} } else { var i = 0; var j = list.length; var cb = function(){ fs.rmdir(dir, function(err){if(callback && typeof(callback) == "function") callback(err);});}; recursiveRm(dir, i, j, list, cb); return; } }); function recursiveRm(from, i, j, list, cb) { function nextFile() { i++; if(i < j) { recursiveRm(from, i, j, list, cb); } else { if(cb && typeof cb == "function") cb(); } } var filename = ""; try { filename = path.join(from, list[i]); } catch(e) { nextFile(); return; } fs.stat(filename, function(err, stat) { if(err) { nextFile(); } else if(stat.isDirectory()) { if(filename) { rmdir(filename, nextFile); } else { nextFile(); } } else { fs.unlink(filename, nextFile); } }); } }; module.exports = rmdir; ================================================ FILE: compiler/self/nerd.ng ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ _.VERSION = "0.1.1"; _.fs = require("fs"); _.console = require("console"); _.os = require("os"); _.path = require("path"); _.process = require("process"); _.querystring = require("querystring"); _.child_process = require("child_process"); _.execSync = _.child_process.execSync; _.JSON = require("JSON"); _.extern = _.path.join(__dirname, "external"); _.console.log(_.extern); //var _parseCLI = require("./base/cli/cliParser.ng"); ================================================ FILE: example/arduino-lcd.ng ================================================ var arduino = require("arduino"); var LCD = require("arduino-lcd"); var lcd = LCD(8, 9, 4, 5, 6, 7); lcd.clear(); lcd.begin(16, 2); lcd.print("Chrono:"); while(true) { lcd.setCursor(0,1); var _sec = arduino.seconds(); lcd.print(_sec); arduino.delay(1); } ================================================ FILE: example/arduino.ng ================================================ var arduino = require("arduino"); arduino.pinMode(arduino.led_builtin, arduino.output); while(true) { arduino.digitalWrite(arduino.led_builtin, arduino.high); arduino.delay(50); arduino.digitalWrite(arduino.led_builtin, arduino.low); arduino.delay(50); } ================================================ FILE: example/args.ng ================================================ var console = require("console"); var cliAgs = arguments(); // cli args console.log(); console.log("Cli Args:"); for(var i = 0; i < length_of(cliAgs); i++) { console.log("cliAgs", i, ":", cliAgs[i]); } var fn = function() { var fnArgs = arguments(); // local function args for(var i = 0; i < length_of(fnArgs); i++) { console.log("fnArgs", i, ":", fnArgs[i]); } }; console.log(); console.log(`FnArgs: fn(0, "one", 2, "three")`); fn(0, "one", 2, "three"); console.log(); console.log(`FnArgs: fn("Hello", "World", "!")`); fn("Hello", "World", "!"); ================================================ FILE: example/circular_array.ng ================================================ var console = require("console"); while (true) { var x = ["Hello Circular Array"]; var y = [x]; x[1] = y; console.log(x[1][0][0]); } ================================================ FILE: example/circular_fixed_array.ng ================================================ var console = require("console"); while (true) { var x = FixedArray(); x[0] = "Hello Circular Fixed Array"; var y = [x]; x[1] = y; console.log(x[1][0][0]); } ================================================ FILE: example/circular_object.ng ================================================ var console = require("console"); while (true) { var x = { a: "Hello Circular Object" }; // x = 1 var y = { x: x }; // x = 2 y = 1 x.y = y; // x = 2 y = 2 console.log(x.y.x.y.x.y.x.a); } ================================================ FILE: example/const.ng ================================================ var _world = "world"; var _console = require("console"); var _fn = function(_const, assignable ) { assignable = _world; _console.log(_const, assignable); }; _fn("hello", _world); ================================================ FILE: example/date.ng ================================================ var date = require("date"); var console = require("console"); console.log(date.now()); ================================================ FILE: example/exec.ng ================================================ var console = require("console"); var cp = require("child_process"); var _args = arguments(); if(_args[1]) { console.log(cp.exec(_args[1])); } else { console.log("[*] Usage:", _args[0], "process_to_launch"); console.log("[*] example:", _args[0], "ls"); } ================================================ FILE: example/exit.ng ================================================ var zero = 0; exit(zero); ================================================ FILE: example/fibo.ng ================================================ var console = require("console"); var fibonacci = function(n) { if (n < 2) { return n; } return fibonacci(n - 2) + fibonacci(n - 1); }; console.log(fibonacci(44)); ================================================ FILE: example/fiboit.ng ================================================ var _console = require("console"); var a = 1; var b = 0; var c = 0; var n = 102; while (n > 0) { c = a; a = b + a; b = c; n--; } _console.log(b); ================================================ FILE: example/functional.ng ================================================ var console = require("console"); var Functional = function() { var obj = {}; obj.fn = function(_arg) { console.write(_arg); return obj; }; return obj; }; var a = Functional(); var b = a.fn("Hello "); var c = b.fn("world"); var d = c.fn("!"); console.log(""); d.fn("Good ").fn("Morning").fn("!"); ================================================ FILE: example/hello.ng ================================================ var console = require("console"); console.log("Hello", "World", "!"); ================================================ FILE: example/http.ng ================================================ var console = require("console"); var http = require("http"); var _port = 8080; var _cb = function(req, res) { /* API EXAMPLE console.log(req.getUrl()); console.log(req.getHeader("user-agent")); console.log(req.getMethod()); res.setHeader("server", "Nerd"); res.setStatus(200); res.write("test - "); */ res.end("Hello Nerd World"); }; var _listenCB = function() { console.log("Listening on port", _port); }; var server = http.createServer(_cb).listen(_port, _listenCB); ================================================ FILE: example/http_post.ng ================================================ var console = require("console"); var http = require("http"); var _port = 8080; var _endCB = function(req, res) { res.end("Hello Nerd World"); }; var _cb = function(req, res) { if(req.getMethod() == "post") { req.data = ""; req.onData = function(chunk, last) { console.log(chunk, last); req.data += chunk; if(last) { res.write("Received: " + req.data + "\n"); _endCB(req, res); } }; } else { _endCB(req, res); } }; var _listenCB = function() { console.log("Listening on port", _port); }; var server = http.createServer(_cb).listen(_port, _listenCB); ================================================ FILE: example/json.ng ================================================ var _json = require("JSON"); var _console = require("console"); var obj = { "key": "value", }; var str = "{\"name\":\"Nerd\"}"; _console.log(_json.stringify(obj)); _console.log(_json.parse(str).name); ================================================ FILE: example/loop.ng ================================================ var console = require("console"); var a = 10; var obj = { a: "a", b: "b", c: "c", d: "d", }; while(a--) { console.log(a); } for(var i = 0; i < 10; i++) { console.log("i:", i); } do { console.log("a:", a); a++; }while(a < 10); for(var key in obj) { console.log(key, ":", obj[key]); } ================================================ FILE: example/match.ng ================================================ var console = require("console"); var regexp = require("regexp"); console.log(regexp.match(".*.", "1234")); ================================================ FILE: example/native.ng ================================================ var inNative = "Hello from native"; {{ std::cout << inNative << "!" << std::endl; }} ================================================ FILE: example/nested_object.ng ================================================ var console = require("console"); var a = { b: "ok", c: "hello", d: { x: "z", y: {}, p: "q", }, e: "e", }; console.log(a.d.p); ================================================ FILE: example/new.ng ================================================ var console = require("console"); var a = function() { this.dic = "Hello"; return this; }; a.prototype.dic = "ok"; a.prototype = Object(); a.prototype.talk = function() { console.log(this.dic); } var obj1 = new a(); obj1.dic = "ownProp"; obj1.talk(); var obj2 = new a(); obj2.talk(); ================================================ FILE: example/object_keys.ng ================================================ var console = require("console"); var object = require("object"); var obj = { "a": 0, "b": 1, "c": 8, "d": "ahah", }; console.log(object.keys(obj)); ================================================ FILE: example/os.ng ================================================ var os = require("os"); var console = require("console"); console.log(os.version(), os.arch()); ================================================ FILE: example/path.ng ================================================ var _path = require("path"); var _console = require("console"); _console.log(_path.join("a", "b", "c")); ================================================ FILE: example/readfile.ng ================================================ var console = require("console"); var fs = require("fs"); var args = arguments(); if(args[1]) { console.log(fs.readFile(args[1])); } else { console.log("[*] Usage:", args[0], " file_to_read.txt"); } ================================================ FILE: example/thread.ng ================================================ var _thread = require("thread"); var thread = _thread(); var console = require("console"); var fn1 = function() { for(var i = 0; i < 10; i++) { console.log("fn1"); } }; var fn2 = function() { for(var i = 0; i < 10; i++) { console.log("fn2"); } }; thread.run(fn1); thread.run(fn2); thread.waitForAll(); ================================================ FILE: example/throw.ng ================================================ var console = require("console"); var error = require("error"); try { error.throw("An error"); } catch(e) { console.log(e); } ================================================ FILE: example/wasm.html ================================================ ================================================ FILE: example/wasm_binding.ng ================================================ var wasm = require("wasm"); // function proto for binding : string(string) var callFromNerd = function(_data) { if(_data) { wasm.run("document.write('

" + _data + "

');"); } else { wasm.run("document.write('

No Data

');"); } return "Executed from wasm"; }; // bind function to be executed in Browser env with Module.call(_functionName, _data); wasm.bind("callFromNerd", callFromNerd); // Fire a JS function to know when env is set up, see wasm.html wasm.run("WasmLoaded();"); ================================================ FILE: external/arduino/avr/LICENSE.txt ================================================ The contents of avr-libc are licensed with a Modified BSD License. All of this is supposed to be Free Software, Open Source, DFSG-free, GPL-compatible, and OK to use in both free and proprietary applications. See the license information in the individual source files for details. Additions and corrections to this file are welcome. ******************************************************************************* Portions of avr-libc are Copyright (c) 1999-2010 Keith Gudger, Bjoern Haase, Steinar Haugen, Peter Jansen, Reinhard Jessich, Magnus Johansson, Artur Lipowski, Marek Michalkiewicz, Colin O'Flynn, Bob Paddock, Reiner Patommel, Michael Rickman, Theodore A. Roth, Juergen Schilling, Philip Soeberg, Anatoly Sokolov, Nils Kristian Strom, Michael Stumpf, Stefan Swanepoel, Eric B. Weddington, Joerg Wunsch, Dmitry Xmelkov, The Regents of the University of California. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************* ================================================ FILE: external/arduino/avr/boards.txt ================================================ # See: http://code.google.com/p/arduino/wiki/Platforms menu.cpu=Processor ############################################################## yun.name=Arduino Yún yun.upload.via_ssh=true yun.vid.0=0x2341 yun.pid.0=0x0041 yun.vid.1=0x2341 yun.pid.1=0x8041 yun.vid.2=0x2A03 yun.pid.2=0x0041 yun.vid.3=0x2A03 yun.pid.3=0x8041 yun.upload.tool=avrdude yun.upload.protocol=avr109 yun.upload.maximum_size=28672 yun.upload.maximum_data_size=2560 yun.upload.speed=57600 yun.upload.disable_flushing=true yun.upload.use_1200bps_touch=true yun.upload.wait_for_upload_port=true yun.bootloader.tool=avrdude yun.bootloader.low_fuses=0xff yun.bootloader.high_fuses=0xd8 yun.bootloader.extended_fuses=0xfb yun.bootloader.file=caterina/Caterina-Yun.hex yun.bootloader.noblink=caterina/Caterina-Yun-noblink.hex yun.bootloader.unlock_bits=0x3F yun.bootloader.lock_bits=0x2F yun.build.mcu=atmega32u4 yun.build.f_cpu=16000000L yun.build.vid=0x2341 yun.build.pid=0x8041 yun.build.usb_product="Arduino Yun" yun.build.board=AVR_YUN yun.build.core=arduino yun.build.variant=yun yun.build.extra_flags={build.usb_flags} ############################################################## uno.name=Arduino Uno uno.vid.0=0x2341 uno.pid.0=0x0043 uno.vid.1=0x2341 uno.pid.1=0x0001 uno.vid.2=0x2A03 uno.pid.2=0x0043 uno.vid.3=0x2341 uno.pid.3=0x0243 uno.upload.tool=avrdude uno.upload.protocol=arduino uno.upload.maximum_size=32256 uno.upload.maximum_data_size=2048 uno.upload.speed=115200 uno.bootloader.tool=avrdude uno.bootloader.low_fuses=0xFF uno.bootloader.high_fuses=0xDE uno.bootloader.extended_fuses=0xFD uno.bootloader.unlock_bits=0x3F uno.bootloader.lock_bits=0x0F uno.bootloader.file=optiboot/optiboot_atmega328.hex uno.build.mcu=atmega328p uno.build.f_cpu=16000000L uno.build.board=AVR_UNO uno.build.core=arduino uno.build.variant=standard ############################################################## diecimila.name=Arduino Duemilanove or Diecimila diecimila.upload.tool=avrdude diecimila.upload.protocol=arduino diecimila.bootloader.tool=avrdude diecimila.bootloader.low_fuses=0xFF diecimila.bootloader.unlock_bits=0x3F diecimila.bootloader.lock_bits=0x0F diecimila.build.f_cpu=16000000L diecimila.build.board=AVR_DUEMILANOVE diecimila.build.core=arduino diecimila.build.variant=standard ## Arduino Duemilanove or Diecimila w/ ATmega328P ## ---------------------------------------------- diecimila.menu.cpu.atmega328=ATmega328P diecimila.menu.cpu.atmega328.upload.maximum_size=30720 diecimila.menu.cpu.atmega328.upload.maximum_data_size=2048 diecimila.menu.cpu.atmega328.upload.speed=57600 diecimila.menu.cpu.atmega328.bootloader.high_fuses=0xDA diecimila.menu.cpu.atmega328.bootloader.extended_fuses=0xFD diecimila.menu.cpu.atmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex diecimila.menu.cpu.atmega328.build.mcu=atmega328p ## Arduino Duemilanove or Diecimila w/ ATmega168 ## --------------------------------------------- diecimila.menu.cpu.atmega168=ATmega168 diecimila.menu.cpu.atmega168.upload.maximum_size=14336 diecimila.menu.cpu.atmega168.upload.maximum_data_size=1024 diecimila.menu.cpu.atmega168.upload.speed=19200 diecimila.menu.cpu.atmega168.bootloader.high_fuses=0xdd diecimila.menu.cpu.atmega168.bootloader.extended_fuses=0xF8 diecimila.menu.cpu.atmega168.bootloader.file=atmega/ATmegaBOOT_168_diecimila.hex diecimila.menu.cpu.atmega168.build.mcu=atmega168 ############################################################## nano.name=Arduino Nano nano.upload.tool=avrdude nano.upload.protocol=arduino nano.bootloader.tool=avrdude nano.bootloader.unlock_bits=0x3F nano.bootloader.lock_bits=0x0F nano.build.f_cpu=16000000L nano.build.board=AVR_NANO nano.build.core=arduino nano.build.variant=eightanaloginputs ## Arduino Nano w/ ATmega328P ## -------------------------- nano.menu.cpu.atmega328=ATmega328P nano.menu.cpu.atmega328.upload.maximum_size=30720 nano.menu.cpu.atmega328.upload.maximum_data_size=2048 nano.menu.cpu.atmega328.upload.speed=115200 nano.menu.cpu.atmega328.bootloader.low_fuses=0xFF nano.menu.cpu.atmega328.bootloader.high_fuses=0xDA nano.menu.cpu.atmega328.bootloader.extended_fuses=0xFD nano.menu.cpu.atmega328.bootloader.file=optiboot/optiboot_atmega328.hex nano.menu.cpu.atmega328.build.mcu=atmega328p ## Arduino Nano w/ ATmega328P (old bootloader) ## -------------------------- nano.menu.cpu.atmega328old=ATmega328P (Old Bootloader) nano.menu.cpu.atmega328old.upload.maximum_size=30720 nano.menu.cpu.atmega328old.upload.maximum_data_size=2048 nano.menu.cpu.atmega328old.upload.speed=57600 nano.menu.cpu.atmega328old.bootloader.low_fuses=0xFF nano.menu.cpu.atmega328old.bootloader.high_fuses=0xDA nano.menu.cpu.atmega328old.bootloader.extended_fuses=0xFD nano.menu.cpu.atmega328old.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex nano.menu.cpu.atmega328old.build.mcu=atmega328p ## Arduino Nano w/ ATmega168 ## ------------------------- nano.menu.cpu.atmega168=ATmega168 nano.menu.cpu.atmega168.upload.maximum_size=14336 nano.menu.cpu.atmega168.upload.maximum_data_size=1024 nano.menu.cpu.atmega168.upload.speed=19200 nano.menu.cpu.atmega168.bootloader.low_fuses=0xff nano.menu.cpu.atmega168.bootloader.high_fuses=0xdd nano.menu.cpu.atmega168.bootloader.extended_fuses=0xF8 nano.menu.cpu.atmega168.bootloader.file=atmega/ATmegaBOOT_168_diecimila.hex nano.menu.cpu.atmega168.build.mcu=atmega168 ############################################################## mega.name=Arduino Mega or Mega 2560 mega.vid.0=0x2341 mega.pid.0=0x0010 mega.vid.1=0x2341 mega.pid.1=0x0042 mega.vid.2=0x2A03 mega.pid.2=0x0010 mega.vid.3=0x2A03 mega.pid.3=0x0042 mega.vid.4=0x2341 mega.pid.4=0x0210 mega.vid.5=0x2341 mega.pid.5=0x0242 mega.upload.tool=avrdude mega.upload.maximum_data_size=8192 mega.bootloader.tool=avrdude mega.bootloader.low_fuses=0xFF mega.bootloader.unlock_bits=0x3F mega.bootloader.lock_bits=0x0F mega.build.f_cpu=16000000L mega.build.core=arduino mega.build.variant=mega # default board may be overridden by the cpu menu mega.build.board=AVR_MEGA2560 ## Arduino Mega w/ ATmega2560 ## ------------------------- mega.menu.cpu.atmega2560=ATmega2560 (Mega 2560) mega.menu.cpu.atmega2560.upload.protocol=wiring mega.menu.cpu.atmega2560.upload.maximum_size=253952 mega.menu.cpu.atmega2560.upload.speed=115200 mega.menu.cpu.atmega2560.bootloader.high_fuses=0xD8 mega.menu.cpu.atmega2560.bootloader.extended_fuses=0xFD mega.menu.cpu.atmega2560.bootloader.file=stk500v2/stk500boot_v2_mega2560.hex mega.menu.cpu.atmega2560.build.mcu=atmega2560 mega.menu.cpu.atmega2560.build.board=AVR_MEGA2560 ## Arduino Mega w/ ATmega1280 ## ------------------------- mega.menu.cpu.atmega1280=ATmega1280 mega.menu.cpu.atmega1280.upload.protocol=arduino mega.menu.cpu.atmega1280.upload.maximum_size=126976 mega.menu.cpu.atmega1280.upload.speed=57600 mega.menu.cpu.atmega1280.bootloader.high_fuses=0xDA mega.menu.cpu.atmega1280.bootloader.extended_fuses=0xF5 mega.menu.cpu.atmega1280.bootloader.file=atmega/ATmegaBOOT_168_atmega1280.hex mega.menu.cpu.atmega1280.build.mcu=atmega1280 mega.menu.cpu.atmega1280.build.board=AVR_MEGA ############################################################## megaADK.name=Arduino Mega ADK megaADK.vid.0=0x2341 megaADK.pid.0=0x003f megaADK.vid.1=0x2341 megaADK.pid.1=0x0044 megaADK.vid.2=0x2A03 megaADK.pid.2=0x003f megaADK.vid.3=0x2A03 megaADK.pid.3=0x0044 megaADK.upload.tool=avrdude megaADK.upload.protocol=wiring megaADK.upload.maximum_size=253952 megaADK.upload.maximum_data_size=8192 megaADK.upload.speed=115200 megaADK.bootloader.tool=avrdude megaADK.bootloader.low_fuses=0xFF megaADK.bootloader.high_fuses=0xD8 megaADK.bootloader.extended_fuses=0xFD megaADK.bootloader.file=stk500v2/stk500boot_v2_mega2560.hex megaADK.bootloader.unlock_bits=0x3F megaADK.bootloader.lock_bits=0x0F megaADK.build.mcu=atmega2560 megaADK.build.f_cpu=16000000L megaADK.build.board=AVR_ADK megaADK.build.core=arduino megaADK.build.variant=mega ############################################################## leonardo.name=Arduino Leonardo leonardo.vid.0=0x2341 leonardo.pid.0=0x0036 leonardo.vid.1=0x2341 leonardo.pid.1=0x8036 leonardo.vid.2=0x2A03 leonardo.pid.2=0x0036 leonardo.vid.3=0x2A03 leonardo.pid.3=0x8036 leonardo.upload.tool=avrdude leonardo.upload.protocol=avr109 leonardo.upload.maximum_size=28672 leonardo.upload.maximum_data_size=2560 leonardo.upload.speed=57600 leonardo.upload.disable_flushing=true leonardo.upload.use_1200bps_touch=true leonardo.upload.wait_for_upload_port=true leonardo.bootloader.tool=avrdude leonardo.bootloader.low_fuses=0xff leonardo.bootloader.high_fuses=0xd8 leonardo.bootloader.extended_fuses=0xcb leonardo.bootloader.file=caterina/Caterina-Leonardo.hex leonardo.bootloader.unlock_bits=0x3F leonardo.bootloader.lock_bits=0x2F leonardo.build.mcu=atmega32u4 leonardo.build.f_cpu=16000000L leonardo.build.vid=0x2341 leonardo.build.pid=0x8036 leonardo.build.usb_product="Arduino Leonardo" leonardo.build.board=AVR_LEONARDO leonardo.build.core=arduino leonardo.build.variant=leonardo leonardo.build.extra_flags={build.usb_flags} ############################################################## leonardoeth.name=Arduino Leonardo ETH leonardoeth.vid.0=0x2a03 leonardoeth.pid.0=0x0040 leonardoeth.vid.1=0x2a03 leonardoeth.pid.1=0x8040 leonardoeth.upload.tool=avrdude leonardoeth.upload.protocol=avr109 leonardoeth.upload.maximum_size=28672 leonardoeth.upload.maximum_data_size=2560 leonardoeth.upload.speed=57600 leonardoeth.upload.disable_flushing=true leonardoeth.upload.use_1200bps_touch=true leonardoeth.upload.wait_for_upload_port=true leonardoeth.bootloader.tool=avrdude leonardoeth.bootloader.low_fuses=0xff leonardoeth.bootloader.high_fuses=0xd8 leonardoeth.bootloader.extended_fuses=0xcb leonardoeth.bootloader.file=caterina/Caterina-LeonardoEthernet.hex leonardoeth.bootloader.unlock_bits=0x3F leonardoeth.bootloader.lock_bits=0x2F leonardoeth.build.mcu=atmega32u4 leonardoeth.build.f_cpu=16000000L leonardoeth.build.vid=0x2a03 leonardoeth.build.pid=0x8040 leonardoeth.build.usb_product="Arduino Leonardo ETH" leonardoeth.build.board=AVR_LEONARDO_ETH leonardoeth.build.core=arduino leonardoeth.build.variant=leonardo leonardoeth.build.extra_flags={build.usb_flags} ############################################################## micro.name=Arduino Micro micro.vid.0=0x2341 micro.pid.0=0x0037 micro.vid.1=0x2341 micro.pid.1=0x8037 micro.vid.2=0x2A03 micro.pid.2=0x0037 micro.vid.3=0x2A03 micro.pid.3=0x8037 micro.vid.4=0x2341 micro.pid.4=0x0237 micro.vid.5=0x2341 micro.pid.5=0x8237 micro.upload.tool=avrdude micro.upload.protocol=avr109 micro.upload.maximum_size=28672 micro.upload.maximum_data_size=2560 micro.upload.speed=57600 micro.upload.disable_flushing=true micro.upload.use_1200bps_touch=true micro.upload.wait_for_upload_port=true micro.bootloader.tool=avrdude micro.bootloader.low_fuses=0xff micro.bootloader.high_fuses=0xd8 micro.bootloader.extended_fuses=0xcb micro.bootloader.file=caterina/Caterina-Micro.hex micro.bootloader.unlock_bits=0x3F micro.bootloader.lock_bits=0x2F micro.build.mcu=atmega32u4 micro.build.f_cpu=16000000L micro.build.vid=0x2341 micro.build.pid=0x8037 micro.build.usb_product="Arduino Micro" micro.build.board=AVR_MICRO micro.build.core=arduino micro.build.variant=micro micro.build.extra_flags={build.usb_flags} ############################################################## esplora.name=Arduino Esplora esplora.vid.0=0x2341 esplora.pid.0=0x003C esplora.vid.1=0x2341 esplora.pid.1=0x803C esplora.vid.2=0x2A03 esplora.pid.2=0x003C esplora.vid.3=0x2A03 esplora.pid.3=0x803C esplora.upload.tool=avrdude esplora.upload.protocol=avr109 esplora.upload.maximum_size=28672 esplora.upload.maximum_data_size=2560 esplora.upload.speed=57600 esplora.upload.disable_flushing=true esplora.upload.use_1200bps_touch=true esplora.upload.wait_for_upload_port=true esplora.bootloader.tool=avrdude esplora.bootloader.low_fuses=0xff esplora.bootloader.high_fuses=0xd8 esplora.bootloader.extended_fuses=0xcb esplora.bootloader.file=caterina/Caterina-Esplora.hex esplora.bootloader.unlock_bits=0x3F esplora.bootloader.lock_bits=0x2F esplora.build.mcu=atmega32u4 esplora.build.f_cpu=16000000L esplora.build.vid=0x2341 esplora.build.pid=0x803c esplora.build.usb_product="Arduino Esplora" esplora.build.board=AVR_ESPLORA esplora.build.core=arduino esplora.build.variant=leonardo esplora.build.extra_flags={build.usb_flags} ############################################################## mini.name=Arduino Mini mini.upload.tool=avrdude mini.upload.protocol=arduino mini.bootloader.tool=avrdude mini.bootloader.low_fuses=0xff mini.bootloader.unlock_bits=0x3F mini.bootloader.lock_bits=0x0F mini.build.f_cpu=16000000L mini.build.board=AVR_MINI mini.build.core=arduino mini.build.variant=eightanaloginputs ## Arduino Mini w/ ATmega328P ## -------------------------- mini.menu.cpu.atmega328=ATmega328P mini.menu.cpu.atmega328.upload.maximum_size=28672 mini.menu.cpu.atmega328.upload.maximum_data_size=2048 mini.menu.cpu.atmega328.upload.speed=115200 mini.menu.cpu.atmega328.bootloader.high_fuses=0xd8 mini.menu.cpu.atmega328.bootloader.extended_fuses=0xFD mini.menu.cpu.atmega328.bootloader.file=optiboot/optiboot_atmega328-Mini.hex mini.menu.cpu.atmega328.build.mcu=atmega328p ## Arduino Mini w/ ATmega168 ## ------------------------- mini.menu.cpu.atmega168=ATmega168 mini.menu.cpu.atmega168.upload.maximum_size=14336 mini.menu.cpu.atmega168.upload.maximum_data_size=1024 mini.menu.cpu.atmega168.upload.speed=19200 mini.menu.cpu.atmega168.bootloader.high_fuses=0xdd mini.menu.cpu.atmega168.bootloader.extended_fuses=0xF8 mini.menu.cpu.atmega168.bootloader.file=atmega/ATmegaBOOT_168_ng.hex mini.menu.cpu.atmega168.build.mcu=atmega168 ############################################################## ethernet.name=Arduino Ethernet ethernet.upload.tool=avrdude ethernet.upload.protocol=arduino ethernet.upload.maximum_size=32256 ethernet.upload.maximum_data_size=2048 ethernet.upload.speed=115200 ethernet.bootloader.tool=avrdude ethernet.bootloader.low_fuses=0xff ethernet.bootloader.high_fuses=0xde ethernet.bootloader.extended_fuses=0xFD ethernet.bootloader.file=optiboot/optiboot_atmega328.hex ethernet.bootloader.unlock_bits=0x3F ethernet.bootloader.lock_bits=0x0F ethernet.build.variant=ethernet ethernet.build.mcu=atmega328p ethernet.build.f_cpu=16000000L ethernet.build.board=AVR_ETHERNET ethernet.build.core=arduino ############################################################## fio.name=Arduino Fio fio.upload.tool=avrdude fio.upload.protocol=arduino fio.upload.maximum_size=30720 fio.upload.maximum_data_size=2048 fio.upload.speed=57600 fio.bootloader.tool=avrdude fio.bootloader.low_fuses=0xFF fio.bootloader.high_fuses=0xDA fio.bootloader.extended_fuses=0xFD fio.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex fio.bootloader.unlock_bits=0x3F fio.bootloader.lock_bits=0x0F fio.build.mcu=atmega328p fio.build.f_cpu=8000000L fio.build.board=AVR_FIO fio.build.core=arduino fio.build.variant=eightanaloginputs ############################################################## bt.name=Arduino BT bt.upload.tool=avrdude bt.upload.protocol=arduino bt.upload.speed=19200 bt.upload.disable_flushing=true bt.bootloader.tool=avrdude bt.bootloader.low_fuses=0xff bt.bootloader.unlock_bits=0x3F bt.bootloader.lock_bits=0x0F bt.build.f_cpu=16000000L bt.build.board=AVR_BT bt.build.core=arduino bt.build.variant=eightanaloginputs ## Arduino BT w/ ATmega328P ## ------------------------ bt.menu.cpu.atmega328=ATmega328P bt.menu.cpu.atmega328.upload.maximum_size=28672 bt.menu.cpu.atmega328.upload.maximum_data_size=2048 bt.menu.cpu.atmega328.bootloader.high_fuses=0xd8 bt.menu.cpu.atmega328.bootloader.extended_fuses=0xFD bt.menu.cpu.atmega328.bootloader.file=bt/ATmegaBOOT_168_atmega328_bt.hex bt.menu.cpu.atmega328.build.mcu=atmega328p ## Arduino BT w/ ATmega168 ## ----------------------- bt.menu.cpu.atmega168=ATmega168 bt.menu.cpu.atmega168.upload.maximum_size=14336 bt.menu.cpu.atmega168.upload.maximum_data_size=1024 bt.menu.cpu.atmega168.bootloader.high_fuses=0xdd bt.menu.cpu.atmega168.bootloader.extended_fuses=0xF8 bt.menu.cpu.atmega168.bootloader.file=bt/ATmegaBOOT_168.hex bt.menu.cpu.atmega168.build.mcu=atmega168 ############################################################## LilyPadUSB.name=LilyPad Arduino USB LilyPadUSB.vid.0=0x1B4F LilyPadUSB.pid.0=0x9207 LilyPadUSB.vid.1=0x1B4F LilyPadUSB.pid.1=0x9208 LilyPadUSB.upload.tool=avrdude LilyPadUSB.upload.protocol=avr109 LilyPadUSB.upload.maximum_size=28672 LilyPadUSB.upload.maximum_data_size=2560 LilyPadUSB.upload.speed=57600 LilyPadUSB.upload.disable_flushing=true LilyPadUSB.upload.use_1200bps_touch=true LilyPadUSB.upload.wait_for_upload_port=true LilyPadUSB.bootloader.tool=avrdude LilyPadUSB.bootloader.low_fuses=0xff LilyPadUSB.bootloader.high_fuses=0xd8 LilyPadUSB.bootloader.extended_fuses=0xce LilyPadUSB.bootloader.file=caterina-LilyPadUSB/Caterina-LilyPadUSB.hex LilyPadUSB.bootloader.unlock_bits=0x3F LilyPadUSB.bootloader.lock_bits=0x2F LilyPadUSB.build.mcu=atmega32u4 LilyPadUSB.build.f_cpu=8000000L LilyPadUSB.build.vid=0x1B4F LilyPadUSB.build.pid=0x9208 LilyPadUSB.build.usb_product="LilyPad USB" LilyPadUSB.build.board=AVR_LILYPAD_USB LilyPadUSB.build.core=arduino LilyPadUSB.build.variant=leonardo LilyPadUSB.build.extra_flags={build.usb_flags} ############################################################## lilypad.name=LilyPad Arduino lilypad.upload.tool=avrdude lilypad.upload.protocol=arduino lilypad.bootloader.tool=avrdude lilypad.bootloader.unlock_bits=0x3F lilypad.bootloader.lock_bits=0x0F lilypad.build.f_cpu=8000000L lilypad.build.board=AVR_LILYPAD lilypad.build.core=arduino lilypad.build.variant=standard ## LilyPad Arduino w/ ATmega328P ## ----------------------------- lilypad.menu.cpu.atmega328=ATmega328P lilypad.menu.cpu.atmega328.upload.maximum_size=30720 lilypad.menu.cpu.atmega328.upload.maximum_data_size=2048 lilypad.menu.cpu.atmega328.upload.speed=57600 lilypad.menu.cpu.atmega328.bootloader.low_fuses=0xFF lilypad.menu.cpu.atmega328.bootloader.high_fuses=0xDA lilypad.menu.cpu.atmega328.bootloader.extended_fuses=0xFD lilypad.menu.cpu.atmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex lilypad.menu.cpu.atmega328.build.mcu=atmega328p ## LilyPad Arduino w/ ATmega168 ## ---------------------------- lilypad.menu.cpu.atmega168=ATmega168 lilypad.menu.cpu.atmega168.upload.maximum_size=14336 lilypad.menu.cpu.atmega168.upload.maximum_data_size=1024 lilypad.menu.cpu.atmega168.upload.speed=19200 lilypad.menu.cpu.atmega168.bootloader.low_fuses=0xe2 lilypad.menu.cpu.atmega168.bootloader.high_fuses=0xdd lilypad.menu.cpu.atmega168.bootloader.extended_fuses=0xF8 lilypad.menu.cpu.atmega168.bootloader.file=lilypad/LilyPadBOOT_168.hex lilypad.menu.cpu.atmega168.build.mcu=atmega168 ############################################################## pro.name=Arduino Pro or Pro Mini pro.upload.tool=avrdude pro.upload.protocol=arduino pro.bootloader.tool=avrdude pro.bootloader.unlock_bits=0x3F pro.bootloader.lock_bits=0x0F pro.build.board=AVR_PRO pro.build.core=arduino pro.build.variant=eightanaloginputs ## Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328P ## -------------------------------------------------- pro.menu.cpu.16MHzatmega328=ATmega328P (5V, 16 MHz) pro.menu.cpu.16MHzatmega328.upload.maximum_size=30720 pro.menu.cpu.16MHzatmega328.upload.maximum_data_size=2048 pro.menu.cpu.16MHzatmega328.upload.speed=57600 pro.menu.cpu.16MHzatmega328.bootloader.low_fuses=0xFF pro.menu.cpu.16MHzatmega328.bootloader.high_fuses=0xDA pro.menu.cpu.16MHzatmega328.bootloader.extended_fuses=0xFD pro.menu.cpu.16MHzatmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex pro.menu.cpu.16MHzatmega328.build.mcu=atmega328p pro.menu.cpu.16MHzatmega328.build.f_cpu=16000000L ## Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328P ## --------------------------------------------------- pro.menu.cpu.8MHzatmega328=ATmega328P (3.3V, 8 MHz) pro.menu.cpu.8MHzatmega328.upload.maximum_size=30720 pro.menu.cpu.8MHzatmega328.upload.maximum_data_size=2048 pro.menu.cpu.8MHzatmega328.upload.speed=57600 pro.menu.cpu.8MHzatmega328.bootloader.low_fuses=0xFF pro.menu.cpu.8MHzatmega328.bootloader.high_fuses=0xDA pro.menu.cpu.8MHzatmega328.bootloader.extended_fuses=0xFD pro.menu.cpu.8MHzatmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex pro.menu.cpu.8MHzatmega328.build.mcu=atmega328p pro.menu.cpu.8MHzatmega328.build.f_cpu=8000000L ## Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega168 ## ------------------------------------------------- pro.menu.cpu.16MHzatmega168=ATmega168 (5V, 16 MHz) pro.menu.cpu.16MHzatmega168.upload.maximum_size=14336 pro.menu.cpu.16MHzatmega168.upload.maximum_data_size=1024 pro.menu.cpu.16MHzatmega168.upload.speed=19200 pro.menu.cpu.16MHzatmega168.bootloader.low_fuses=0xff pro.menu.cpu.16MHzatmega168.bootloader.high_fuses=0xdd pro.menu.cpu.16MHzatmega168.bootloader.extended_fuses=0xF8 pro.menu.cpu.16MHzatmega168.bootloader.file=atmega/ATmegaBOOT_168_diecimila.hex pro.menu.cpu.16MHzatmega168.build.mcu=atmega168 pro.menu.cpu.16MHzatmega168.build.f_cpu=16000000L ## Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega168 ## -------------------------------------------------- pro.menu.cpu.8MHzatmega168=ATmega168 (3.3V, 8 MHz) pro.menu.cpu.8MHzatmega168.upload.maximum_size=14336 pro.menu.cpu.8MHzatmega168.upload.maximum_data_size=1024 pro.menu.cpu.8MHzatmega168.upload.speed=19200 pro.menu.cpu.8MHzatmega168.bootloader.low_fuses=0xc6 pro.menu.cpu.8MHzatmega168.bootloader.high_fuses=0xdd pro.menu.cpu.8MHzatmega168.bootloader.extended_fuses=0xF8 pro.menu.cpu.8MHzatmega168.bootloader.file=atmega/ATmegaBOOT_168_pro_8MHz.hex pro.menu.cpu.8MHzatmega168.build.mcu=atmega168 pro.menu.cpu.8MHzatmega168.build.f_cpu=8000000L ############################################################## atmegang.name=Arduino NG or older atmegang.upload.tool=avrdude atmegang.upload.protocol=arduino atmegang.upload.speed=19200 atmegang.bootloader.tool=avrdude atmegang.bootloader.unlock_bits=0x3F atmegang.bootloader.lock_bits=0x0F atmegang.build.mcu=atmegang atmegang.build.f_cpu=16000000L atmegang.build.board=AVR_NG atmegang.build.core=arduino atmegang.build.variant=standard ## Arduino NG or older w/ ATmega168 ## -------------------------------- atmegang.menu.cpu.atmega168=ATmega168 atmegang.menu.cpu.atmega168.upload.maximum_size=14336 atmegang.menu.cpu.atmega168.upload.maximum_data_size=1024 atmegang.menu.cpu.atmega168.bootloader.low_fuses=0xff atmegang.menu.cpu.atmega168.bootloader.high_fuses=0xdd atmegang.menu.cpu.atmega168.bootloader.extended_fuses=0xF8 atmegang.menu.cpu.atmega168.bootloader.file=atmega/ATmegaBOOT_168_ng.hex atmegang.menu.cpu.atmega168.build.mcu=atmega168 ## Arduino NG or older w/ ATmega8 ## ------------------------------ atmegang.menu.cpu.atmega8=ATmega8 atmegang.menu.cpu.atmega8.upload.maximum_size=7168 atmegang.menu.cpu.atmega8.upload.maximum_data_size=1024 atmegang.menu.cpu.atmega8.bootloader.low_fuses=0xdf atmegang.menu.cpu.atmega8.bootloader.high_fuses=0xca atmegang.menu.cpu.atmega8.bootloader.extended_fuses= atmegang.menu.cpu.atmega8.bootloader.file=atmega8/ATmegaBOOT-prod-firmware-2009-11-07.hex atmegang.menu.cpu.atmega8.build.mcu=atmega8 ############################################################## robotControl.name=Arduino Robot Control robotControl.vid.0=0x2341 robotControl.pid.0=0x0038 robotControl.vid.1=0x2341 robotControl.pid.1=0x8038 robotControl.vid.2=0x2A03 robotControl.pid.2=0x0038 robotControl.vid.3=0x2A03 robotControl.pid.3=0x8038 robotControl.upload.tool=avrdude robotControl.upload.protocol=avr109 robotControl.upload.maximum_size=28672 robotControl.upload.maximum_data_size=2560 robotControl.upload.speed=57600 robotControl.upload.disable_flushing=true robotControl.upload.use_1200bps_touch=true robotControl.upload.wait_for_upload_port=true robotControl.bootloader.tool=avrdude robotControl.bootloader.low_fuses=0xff robotControl.bootloader.high_fuses=0xd8 robotControl.bootloader.extended_fuses=0xcb robotControl.bootloader.file=caterina-Arduino_Robot/Caterina-Robot-Control.hex robotControl.bootloader.unlock_bits=0x3F robotControl.bootloader.lock_bits=0x2F robotControl.build.mcu=atmega32u4 robotControl.build.f_cpu=16000000L robotControl.build.vid=0x2341 robotControl.build.pid=0x8038 robotControl.build.usb_product="Robot Control" robotControl.build.board=AVR_ROBOT_CONTROL robotControl.build.core=arduino robotControl.build.variant=robot_control robotControl.build.extra_flags={build.usb_flags} ############################################################## robotMotor.name=Arduino Robot Motor robotMotor.vid.0=0x2341 robotMotor.pid.0=0x0039 robotMotor.vid.1=0x2341 robotMotor.pid.1=0x8039 robotMotor.vid.2=0x2A03 robotMotor.pid.2=0x0039 robotMotor.vid.3=0x2A03 robotMotor.pid.3=0x8039 robotMotor.upload.tool=avrdude robotMotor.upload.protocol=avr109 robotMotor.upload.maximum_size=28672 robotMotor.upload.maximum_data_size=2560 robotMotor.upload.speed=57600 robotMotor.upload.disable_flushing=true robotMotor.upload.use_1200bps_touch=true robotMotor.upload.wait_for_upload_port=true robotMotor.bootloader.tool=avrdude robotMotor.bootloader.low_fuses=0xff robotMotor.bootloader.high_fuses=0xd8 robotMotor.bootloader.extended_fuses=0xcb robotMotor.bootloader.file=caterina-Arduino_Robot/Caterina-Robot-Motor.hex robotMotor.bootloader.unlock_bits=0x3F robotMotor.bootloader.lock_bits=0x2F robotMotor.build.mcu=atmega32u4 robotMotor.build.f_cpu=16000000L robotMotor.build.vid=0x2341 robotMotor.build.pid=0x8039 robotMotor.build.usb_product="Robot Motor" robotMotor.build.board=AVR_ROBOT_MOTOR robotMotor.build.core=arduino robotMotor.build.variant=robot_motor robotMotor.build.extra_flags={build.usb_flags} ############################################################## gemma.vid.0=0x2341 gemma.pid.0=0x0c9f gemma.name=Arduino Gemma gemma.bootloader.low_fuses=0xF1 gemma.bootloader.high_fuses=0xD5 gemma.bootloader.extended_fuses=0xFE gemma.bootloader.tool=avrdude gemma.bootloader.lock_bits= gemma.bootloader.unlock_bits= gemma.bootloader.file=gemma/gemma_v1.hex gemma.build.mcu=attiny85 gemma.build.f_cpu=8000000L gemma.build.core=arduino gemma.build.variant=gemma gemma.build.board=AVR_GEMMA gemma.upload.tool=avrdude gemma.upload.maximum_size=5310 ############################################################## # Adafruit Circuit Playground 32u4 w/Caterina Configuration circuitplay32u4cat.name=Adafruit Circuit Playground circuitplay32u4cat.bootloader.low_fuses=0xff circuitplay32u4cat.bootloader.high_fuses=0xd8 circuitplay32u4cat.bootloader.extended_fuses=0xcb circuitplay32u4cat.bootloader.file=caterina/Caterina-Circuitplay32u4.hex circuitplay32u4cat.bootloader.unlock_bits=0x3F circuitplay32u4cat.bootloader.lock_bits=0x2F circuitplay32u4cat.bootloader.tool=avrdude circuitplay32u4cat.build.mcu=atmega32u4 circuitplay32u4cat.build.f_cpu=8000000L circuitplay32u4cat.build.vid=0x239A circuitplay32u4cat.build.pid=0x8011 circuitplay32u4cat.build.core=arduino circuitplay32u4cat.build.variant=circuitplay32u4 circuitplay32u4cat.build.board=AVR_CIRCUITPLAY circuitplay32u4cat.build.usb_product="Circuit Playground" circuitplay32u4cat.build.usb_manufacturer="Adafruit" circuitplay32u4cat.build.extra_flags={build.usb_flags} circuitplay32u4cat.upload.protocol=avr109 circuitplay32u4cat.upload.maximum_size=28672 circuitplay32u4cat.upload.speed=57600 circuitplay32u4cat.upload.disable_flushing=true circuitplay32u4cat.upload.use_1200bps_touch=true circuitplay32u4cat.upload.wait_for_upload_port=true circuitplay32u4cat.upload.tool=avrdude circuitplay32u4cat.vid.0=0x239A circuitplay32u4cat.pid.0=0x8011 ############################################################## yunmini.name=Arduino Yún Mini yunmini.upload.via_ssh=true yunmini.vid.0=0x2a03 yunmini.pid.0=0x0050 yunmini.vid.1=0x2a03 yunmini.pid.1=0x8050 yunmini.upload.tool=avrdude yunmini.upload.protocol=avr109 yunmini.upload.maximum_size=28672 yunmini.upload.maximum_data_size=2560 yunmini.upload.speed=57600 yunmini.upload.disable_flushing=true yunmini.upload.use_1200bps_touch=true yunmini.upload.wait_for_upload_port=true yunmini.bootloader.tool=avrdude yunmini.bootloader.low_fuses=0xff yunmini.bootloader.high_fuses=0xd8 yunmini.bootloader.extended_fuses=0xfb yunmini.bootloader.file=caterina/Caterina-YunMini.hex yunmini.bootloader.unlock_bits=0x3F yunmini.bootloader.lock_bits=0x2F yunmini.build.mcu=atmega32u4 yunmini.build.f_cpu=16000000L yunmini.build.vid=0x2a03 yunmini.build.pid=0x8050 yunmini.build.usb_product="Arduino Yún Mini" yunmini.build.board=AVR_YUNMINI yunmini.build.core=arduino yunmini.build.variant=yun yunmini.build.extra_flags={build.usb_flags} ############################################################## chiwawa.name=Arduino Industrial 101 chiwawa.upload.via_ssh=true chiwawa.vid.0=0x2a03 chiwawa.pid.0=0x0056 chiwawa.vid.1=0x2a03 chiwawa.pid.1=0x8056 chiwawa.upload.tool=avrdude chiwawa.upload.protocol=avr109 chiwawa.upload.maximum_size=28672 chiwawa.upload.maximum_data_size=2560 chiwawa.upload.speed=57600 chiwawa.upload.disable_flushing=true chiwawa.upload.use_1200bps_touch=true chiwawa.upload.wait_for_upload_port=true chiwawa.bootloader.tool=avrdude chiwawa.bootloader.low_fuses=0xff chiwawa.bootloader.high_fuses=0xd8 chiwawa.bootloader.extended_fuses=0xfb chiwawa.bootloader.file=caterina/Caterina-Industrial101.hex chiwawa.bootloader.unlock_bits=0x3F chiwawa.bootloader.lock_bits=0x2F chiwawa.build.mcu=atmega32u4 chiwawa.build.f_cpu=16000000L chiwawa.build.vid=0x2a03 chiwawa.build.pid=0x8056 chiwawa.build.usb_product="Arduino Industrial 101" chiwawa.build.board=AVR_INDUSTRIAL101 chiwawa.build.core=arduino chiwawa.build.variant=yun chiwawa.build.extra_flags={build.usb_flags} ############################################################## one.name=Linino One one.upload.via_ssh=true one.vid.0=0x2a03 one.pid.0=0x0001 one.vid.1=0x2a03 one.pid.1=0x8001 one.upload.tool=avrdude one.upload.protocol=avr109 one.upload.maximum_size=28672 one.upload.maximum_data_size=2560 one.upload.speed=57600 one.upload.disable_flushing=true one.upload.use_1200bps_touch=true one.upload.wait_for_upload_port=true one.bootloader.tool=avrdude one.bootloader.low_fuses=0xff one.bootloader.high_fuses=0xd8 one.bootloader.extended_fuses=0xfb one.bootloader.file=caterina/Caterina-LininoOne.hex one.bootloader.unlock_bits=0x3F one.bootloader.lock_bits=0x2F one.build.mcu=atmega32u4 one.build.f_cpu=16000000L one.build.vid=0x2a03 one.build.pid=0x8001 one.build.usb_product="Linino One" one.build.board=AVR_LININO_ONE one.build.core=arduino one.build.variant=yun one.build.extra_flags={build.usb_flags} ############################################################## unowifi.name=Arduino Uno WiFi unowifi.vid.0=0x2A03 unowifi.pid.0=0x0057 unowifi.upload.tool=avrdude unowifi.upload.protocol=arduino unowifi.upload.maximum_size=32256 unowifi.upload.maximum_data_size=2048 unowifi.upload.speed=115200 unowifi.upload.network.endpoint_upload=/pgm/upload unowifi.upload.network.endpoint_sync=/pgm/sync unowifi.upload.network.sync_return=204:SYNC unowifi.upload.network.endpoint_reset=/log/reset unowifi.upload.network.port=80 unowifi.bootloader.tool=avrdude unowifi.bootloader.low_fuses=0xFF unowifi.bootloader.high_fuses=0xDE unowifi.bootloader.extended_fuses=0x05 unowifi.bootloader.unlock_bits=0x3F unowifi.bootloader.lock_bits=0x0F unowifi.bootloader.file=optiboot/optiboot_atmega328.hex unowifi.build.mcu=atmega328p unowifi.build.f_cpu=16000000L unowifi.build.board=AVR_UNO_WIFI_DEV_ED unowifi.build.core=arduino unowifi.build.variant=standard unowifi.build.esp_ch_uart_br=19200 unowifi.build.extra_flags=-DESP_CH_UART -DESP_CH_UART_BR={build.esp_ch_uart_br} ================================================ FILE: external/arduino/avr/bootloaders/atmega/ATmegaBOOT_168.c ================================================ /**********************************************************/ /* Serial Bootloader for Atmel megaAVR Controllers */ /* */ /* tested with ATmega8, ATmega128 and ATmega168 */ /* should work with other mega's, see code for details */ /* */ /* ATmegaBOOT.c */ /* */ /* */ /* 20090308: integrated Mega changes into main bootloader */ /* source by D. Mellis */ /* 20080930: hacked for Arduino Mega (with the 1280 */ /* processor, backwards compatible) */ /* by D. Cuartielles */ /* 20070626: hacked for Arduino Diecimila (which auto- */ /* resets when a USB connection is made to it) */ /* by D. Mellis */ /* 20060802: hacked for Arduino by D. Cuartielles */ /* based on a previous hack by D. Mellis */ /* and D. Cuartielles */ /* */ /* Monitor and debug functions were added to the original */ /* code by Dr. Erik Lins, chip45.com. (See below) */ /* */ /* Thanks to Karl Pitrich for fixing a bootloader pin */ /* problem and more informative LED blinking! */ /* */ /* For the latest version see: */ /* http://www.chip45.com/ */ /* */ /* ------------------------------------------------------ */ /* */ /* based on stk500boot.c */ /* Copyright (c) 2003, Jason P. Kyle */ /* All rights reserved. */ /* see avr1.org for original file and information */ /* */ /* This program is free software; you can redistribute it */ /* and/or modify it under the terms of the GNU General */ /* Public License as published by the Free Software */ /* Foundation; either version 2 of the License, or */ /* (at your option) any later version. */ /* */ /* This program is distributed in the hope that it will */ /* be useful, but WITHOUT ANY WARRANTY; without even the */ /* implied warranty of MERCHANTABILITY or FITNESS FOR A */ /* PARTICULAR PURPOSE. See the GNU General Public */ /* License for more details. */ /* */ /* You should have received a copy of the GNU General */ /* Public License along with this program; if not, write */ /* to the Free Software Foundation, Inc., */ /* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* */ /* Licence can be viewed at */ /* http://www.fsf.org/licenses/gpl.txt */ /* */ /* Target = Atmel AVR m128,m64,m32,m16,m8,m162,m163,m169, */ /* m8515,m8535. ATmega161 has a very small boot block so */ /* isn't supported. */ /* */ /* Tested with m168 */ /**********************************************************/ /* some includes */ #include #include #include #include #include #include /* the current avr-libc eeprom functions do not support the ATmega168 */ /* own eeprom write/read functions are used instead */ #if !defined(__AVR_ATmega168__) || !defined(__AVR_ATmega328P__) || !defined(__AVR_ATmega328__) #include #endif /* Use the F_CPU defined in Makefile */ /* 20060803: hacked by DojoCorp */ /* 20070626: hacked by David A. Mellis to decrease waiting time for auto-reset */ /* set the waiting time for the bootloader */ /* get this from the Makefile instead */ /* #define MAX_TIME_COUNT (F_CPU>>4) */ /* 20070707: hacked by David A. Mellis - after this many errors give up and launch application */ #define MAX_ERROR_COUNT 5 /* set the UART baud rate */ /* 20060803: hacked by DojoCorp */ //#define BAUD_RATE 115200 #ifndef BAUD_RATE #define BAUD_RATE 19200 #endif /* SW_MAJOR and MINOR needs to be updated from time to time to avoid warning message from AVR Studio */ /* never allow AVR Studio to do an update !!!! */ #define HW_VER 0x02 #define SW_MAJOR 0x01 #define SW_MINOR 0x10 /* Adjust to suit whatever pin your hardware uses to enter the bootloader */ /* ATmega128 has two UARTS so two pins are used to enter bootloader and select UART */ /* ATmega1280 has four UARTS, but for Arduino Mega, we will only use RXD0 to get code */ /* BL0... means UART0, BL1... means UART1 */ #ifdef __AVR_ATmega128__ #define BL_DDR DDRF #define BL_PORT PORTF #define BL_PIN PINF #define BL0 PINF7 #define BL1 PINF6 #elif defined __AVR_ATmega1280__ /* we just don't do anything for the MEGA and enter bootloader on reset anyway*/ #else /* other ATmegas have only one UART, so only one pin is defined to enter bootloader */ #define BL_DDR DDRD #define BL_PORT PORTD #define BL_PIN PIND #define BL PIND6 #endif /* onboard LED is used to indicate, that the bootloader was entered (3x flashing) */ /* if monitor functions are included, LED goes on after monitor was entered */ #if defined __AVR_ATmega128__ || defined __AVR_ATmega1280__ /* Onboard LED is connected to pin PB7 (e.g. Crumb128, PROBOmega128, Savvy128, Arduino Mega) */ #define LED_DDR DDRB #define LED_PORT PORTB #define LED_PIN PINB #define LED PINB7 #else /* Onboard LED is connected to pin PB5 in Arduino NG, Diecimila, and Duomilanuove */ /* other boards like e.g. Crumb8, Crumb168 are using PB2 */ #define LED_DDR DDRB #define LED_PORT PORTB #define LED_PIN PINB #define LED PINB5 #endif /* monitor functions will only be compiled when using ATmega128, due to bootblock size constraints */ #if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) #define MONITOR 1 #endif /* define various device id's */ /* manufacturer byte is always the same */ #define SIG1 0x1E // Yep, Atmel is the only manufacturer of AVR micros. Single source :( #if defined __AVR_ATmega1280__ #define SIG2 0x97 #define SIG3 0x03 #define PAGE_SIZE 0x80U //128 words #elif defined __AVR_ATmega1281__ #define SIG2 0x97 #define SIG3 0x04 #define PAGE_SIZE 0x80U //128 words #elif defined __AVR_ATmega128__ #define SIG2 0x97 #define SIG3 0x02 #define PAGE_SIZE 0x80U //128 words #elif defined __AVR_ATmega64__ #define SIG2 0x96 #define SIG3 0x02 #define PAGE_SIZE 0x80U //128 words #elif defined __AVR_ATmega32__ #define SIG2 0x95 #define SIG3 0x02 #define PAGE_SIZE 0x40U //64 words #elif defined __AVR_ATmega16__ #define SIG2 0x94 #define SIG3 0x03 #define PAGE_SIZE 0x40U //64 words #elif defined __AVR_ATmega8__ #define SIG2 0x93 #define SIG3 0x07 #define PAGE_SIZE 0x20U //32 words #elif defined __AVR_ATmega88__ #define SIG2 0x93 #define SIG3 0x0a #define PAGE_SIZE 0x20U //32 words #elif defined __AVR_ATmega168__ #define SIG2 0x94 #define SIG3 0x06 #define PAGE_SIZE 0x40U //64 words #elif defined __AVR_ATmega328P__ #define SIG2 0x95 #define SIG3 0x0F #define PAGE_SIZE 0x40U //64 words #elif defined __AVR_ATmega328__ #define SIG2 0x95 #define SIG3 0x14 #define PAGE_SIZE 0x40U //64 words #elif defined __AVR_ATmega162__ #define SIG2 0x94 #define SIG3 0x04 #define PAGE_SIZE 0x40U //64 words #elif defined __AVR_ATmega163__ #define SIG2 0x94 #define SIG3 0x02 #define PAGE_SIZE 0x40U //64 words #elif defined __AVR_ATmega169__ #define SIG2 0x94 #define SIG3 0x05 #define PAGE_SIZE 0x40U //64 words #elif defined __AVR_ATmega8515__ #define SIG2 0x93 #define SIG3 0x06 #define PAGE_SIZE 0x20U //32 words #elif defined __AVR_ATmega8535__ #define SIG2 0x93 #define SIG3 0x08 #define PAGE_SIZE 0x20U //32 words #endif /* function prototypes */ void putch(char); char getch(void); void getNch(uint8_t); void byte_response(uint8_t); void nothing_response(void); char gethex(void); void puthex(char); void flash_led(uint8_t); /* some variables */ union address_union { uint16_t word; uint8_t byte[2]; } address; union length_union { uint16_t word; uint8_t byte[2]; } length; struct flags_struct { unsigned eeprom : 1; unsigned rampz : 1; } flags; uint8_t buff[256]; uint8_t address_high; uint8_t pagesz=0x80; uint8_t i; uint8_t bootuart = 0; uint8_t error_count = 0; void (*app_start)(void) = 0x0000; /* main program starts here */ int main(void) { uint8_t ch,ch2; uint16_t w; #ifdef WATCHDOG_MODS ch = MCUSR; MCUSR = 0; WDTCSR |= _BV(WDCE) | _BV(WDE); WDTCSR = 0; // Check if the WDT was used to reset, in which case we dont bootload and skip straight to the code. woot. if (! (ch & _BV(EXTRF))) // if its a not an external reset... app_start(); // skip bootloader #else asm volatile("nop\n\t"); #endif /* set pin direction for bootloader pin and enable pullup */ /* for ATmega128, two pins need to be initialized */ #ifdef __AVR_ATmega128__ BL_DDR &= ~_BV(BL0); BL_DDR &= ~_BV(BL1); BL_PORT |= _BV(BL0); BL_PORT |= _BV(BL1); #else /* We run the bootloader regardless of the state of this pin. Thus, don't put it in a different state than the other pins. --DAM, 070709 This also applies to Arduino Mega -- DC, 080930 BL_DDR &= ~_BV(BL); BL_PORT |= _BV(BL); */ #endif #ifdef __AVR_ATmega128__ /* check which UART should be used for booting */ if(bit_is_clear(BL_PIN, BL0)) { bootuart = 1; } else if(bit_is_clear(BL_PIN, BL1)) { bootuart = 2; } #endif #if defined __AVR_ATmega1280__ /* the mega1280 chip has four serial ports ... we could eventually use any of them, or not? */ /* however, we don't wanna confuse people, to avoid making a mess, we will stick to RXD0, TXD0 */ bootuart = 1; #endif /* check if flash is programmed already, if not start bootloader anyway */ if(pgm_read_byte_near(0x0000) != 0xFF) { #ifdef __AVR_ATmega128__ /* no UART was selected, start application */ if(!bootuart) { app_start(); } #else /* check if bootloader pin is set low */ /* we don't start this part neither for the m8, nor m168 */ //if(bit_is_set(BL_PIN, BL)) { // app_start(); // } #endif } #ifdef __AVR_ATmega128__ /* no bootuart was selected, default to uart 0 */ if(!bootuart) { bootuart = 1; } #endif /* initialize UART(s) depending on CPU defined */ #if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) if(bootuart == 1) { UBRR0L = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1); UBRR0H = (F_CPU/(BAUD_RATE*16L)-1) >> 8; UCSR0A = 0x00; UCSR0C = 0x06; UCSR0B = _BV(TXEN0)|_BV(RXEN0); } if(bootuart == 2) { UBRR1L = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1); UBRR1H = (F_CPU/(BAUD_RATE*16L)-1) >> 8; UCSR1A = 0x00; UCSR1C = 0x06; UCSR1B = _BV(TXEN1)|_BV(RXEN1); } #elif defined __AVR_ATmega163__ UBRR = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1); UBRRHI = (F_CPU/(BAUD_RATE*16L)-1) >> 8; UCSRA = 0x00; UCSRB = _BV(TXEN)|_BV(RXEN); #elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328__) #ifdef DOUBLE_SPEED UCSR0A = (1<> 8; #else UBRR0L = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1); UBRR0H = (F_CPU/(BAUD_RATE*16L)-1) >> 8; #endif UCSR0B = (1<>8; // set baud rate UBRRL = (((F_CPU/BAUD_RATE)/16)-1); UCSRB = (1<> 8; UCSRA = 0x00; UCSRC = 0x06; UCSRB = _BV(TXEN)|_BV(RXEN); #endif #if defined __AVR_ATmega1280__ /* Enable internal pull-up resistor on pin D0 (RX), in order to supress line noise that prevents the bootloader from timing out (DAM: 20070509) */ /* feature added to the Arduino Mega --DC: 080930 */ DDRE &= ~_BV(PINE0); PORTE |= _BV(PINE0); #endif /* set LED pin as output */ LED_DDR |= _BV(LED); /* flash onboard LED to signal entering of bootloader */ #if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) // 4x for UART0, 5x for UART1 flash_led(NUM_LED_FLASHES + bootuart); #else flash_led(NUM_LED_FLASHES); #endif /* 20050803: by DojoCorp, this is one of the parts provoking the system to stop listening, cancelled from the original */ //putch('\0'); /* forever loop */ for (;;) { /* get character from UART */ ch = getch(); /* A bunch of if...else if... gives smaller code than switch...case ! */ /* Hello is anyone home ? */ if(ch=='0') { nothing_response(); } /* Request programmer ID */ /* Not using PROGMEM string due to boot block in m128 being beyond 64kB boundry */ /* Would need to selectively manipulate RAMPZ, and it's only 9 characters anyway so who cares. */ else if(ch=='1') { if (getch() == ' ') { putch(0x14); putch('A'); putch('V'); putch('R'); putch(' '); putch('I'); putch('S'); putch('P'); putch(0x10); } else { if (++error_count == MAX_ERROR_COUNT) app_start(); } } /* AVR ISP/STK500 board commands DON'T CARE so default nothing_response */ else if(ch=='@') { ch2 = getch(); if (ch2>0x85) getch(); nothing_response(); } /* AVR ISP/STK500 board requests */ else if(ch=='A') { ch2 = getch(); if(ch2==0x80) byte_response(HW_VER); // Hardware version else if(ch2==0x81) byte_response(SW_MAJOR); // Software major version else if(ch2==0x82) byte_response(SW_MINOR); // Software minor version else if(ch2==0x98) byte_response(0x03); // Unknown but seems to be required by avr studio 3.56 else byte_response(0x00); // Covers various unnecessary responses we don't care about } /* Device Parameters DON'T CARE, DEVICE IS FIXED */ else if(ch=='B') { getNch(20); nothing_response(); } /* Parallel programming stuff DON'T CARE */ else if(ch=='E') { getNch(5); nothing_response(); } /* P: Enter programming mode */ /* R: Erase device, don't care as we will erase one page at a time anyway. */ else if(ch=='P' || ch=='R') { nothing_response(); } /* Leave programming mode */ else if(ch=='Q') { nothing_response(); #ifdef WATCHDOG_MODS // autoreset via watchdog (sneaky!) WDTCSR = _BV(WDE); while (1); // 16 ms #endif } /* Set address, little endian. EEPROM in bytes, FLASH in words */ /* Perhaps extra address bytes may be added in future to support > 128kB FLASH. */ /* This might explain why little endian was used here, big endian used everywhere else. */ else if(ch=='U') { address.byte[0] = getch(); address.byte[1] = getch(); nothing_response(); } /* Universal SPI programming command, disabled. Would be used for fuses and lock bits. */ else if(ch=='V') { if (getch() == 0x30) { getch(); ch = getch(); getch(); if (ch == 0) { byte_response(SIG1); } else if (ch == 1) { byte_response(SIG2); } else { byte_response(SIG3); } } else { getNch(3); byte_response(0x00); } } /* Write memory, length is big endian and is in bytes */ else if(ch=='d') { length.byte[1] = getch(); length.byte[0] = getch(); flags.eeprom = 0; if (getch() == 'E') flags.eeprom = 1; for (w=0;w127) address_high = 0x01; //Only possible with m128, m256 will need 3rd address byte. FIXME else address_high = 0x00; #if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega1281__) RAMPZ = address_high; #endif address.word = address.word << 1; //address * 2 -> byte location /* if ((length.byte[0] & 0x01) == 0x01) length.word++; //Even up an odd number of bytes */ if ((length.byte[0] & 0x01)) length.word++; //Even up an odd number of bytes cli(); //Disable interrupts, just to be sure #if defined(EEPE) while(bit_is_set(EECR,EEPE)); //Wait for previous EEPROM writes to complete #else while(bit_is_set(EECR,EEWE)); //Wait for previous EEPROM writes to complete #endif asm volatile( "clr r17 \n\t" //page_word_count "lds r30,address \n\t" //Address of FLASH location (in bytes) "lds r31,address+1 \n\t" "ldi r28,lo8(buff) \n\t" //Start of buffer array in RAM "ldi r29,hi8(buff) \n\t" "lds r24,length \n\t" //Length of data to be written (in bytes) "lds r25,length+1 \n\t" "length_loop: \n\t" //Main loop, repeat for number of words in block "cpi r17,0x00 \n\t" //If page_word_count=0 then erase page "brne no_page_erase \n\t" "wait_spm1: \n\t" "lds r16,%0 \n\t" //Wait for previous spm to complete "andi r16,1 \n\t" "cpi r16,1 \n\t" "breq wait_spm1 \n\t" "ldi r16,0x03 \n\t" //Erase page pointed to by Z "sts %0,r16 \n\t" "spm \n\t" #ifdef __AVR_ATmega163__ ".word 0xFFFF \n\t" "nop \n\t" #endif "wait_spm2: \n\t" "lds r16,%0 \n\t" //Wait for previous spm to complete "andi r16,1 \n\t" "cpi r16,1 \n\t" "breq wait_spm2 \n\t" "ldi r16,0x11 \n\t" //Re-enable RWW section "sts %0,r16 \n\t" "spm \n\t" #ifdef __AVR_ATmega163__ ".word 0xFFFF \n\t" "nop \n\t" #endif "no_page_erase: \n\t" "ld r0,Y+ \n\t" //Write 2 bytes into page buffer "ld r1,Y+ \n\t" "wait_spm3: \n\t" "lds r16,%0 \n\t" //Wait for previous spm to complete "andi r16,1 \n\t" "cpi r16,1 \n\t" "breq wait_spm3 \n\t" "ldi r16,0x01 \n\t" //Load r0,r1 into FLASH page buffer "sts %0,r16 \n\t" "spm \n\t" "inc r17 \n\t" //page_word_count++ "cpi r17,%1 \n\t" "brlo same_page \n\t" //Still same page in FLASH "write_page: \n\t" "clr r17 \n\t" //New page, write current one first "wait_spm4: \n\t" "lds r16,%0 \n\t" //Wait for previous spm to complete "andi r16,1 \n\t" "cpi r16,1 \n\t" "breq wait_spm4 \n\t" #ifdef __AVR_ATmega163__ "andi r30,0x80 \n\t" // m163 requires Z6:Z1 to be zero during page write #endif "ldi r16,0x05 \n\t" //Write page pointed to by Z "sts %0,r16 \n\t" "spm \n\t" #ifdef __AVR_ATmega163__ ".word 0xFFFF \n\t" "nop \n\t" "ori r30,0x7E \n\t" // recover Z6:Z1 state after page write (had to be zero during write) #endif "wait_spm5: \n\t" "lds r16,%0 \n\t" //Wait for previous spm to complete "andi r16,1 \n\t" "cpi r16,1 \n\t" "breq wait_spm5 \n\t" "ldi r16,0x11 \n\t" //Re-enable RWW section "sts %0,r16 \n\t" "spm \n\t" #ifdef __AVR_ATmega163__ ".word 0xFFFF \n\t" "nop \n\t" #endif "same_page: \n\t" "adiw r30,2 \n\t" //Next word in FLASH "sbiw r24,2 \n\t" //length-2 "breq final_write \n\t" //Finished "rjmp length_loop \n\t" "final_write: \n\t" "cpi r17,0 \n\t" "breq block_done \n\t" "adiw r24,2 \n\t" //length+2, fool above check on length after short page write "rjmp write_page \n\t" "block_done: \n\t" "clr __zero_reg__ \n\t" //restore zero register #if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega1281__) : "=m" (SPMCSR) : "M" (PAGE_SIZE) : "r0","r16","r17","r24","r25","r28","r29","r30","r31" #else : "=m" (SPMCR) : "M" (PAGE_SIZE) : "r0","r16","r17","r24","r25","r28","r29","r30","r31" #endif ); /* Should really add a wait for RWW section to be enabled, don't actually need it since we never */ /* exit the bootloader without a power cycle anyhow */ } putch(0x14); putch(0x10); } else { if (++error_count == MAX_ERROR_COUNT) app_start(); } } /* Read memory block mode, length is big endian. */ else if(ch=='t') { length.byte[1] = getch(); length.byte[0] = getch(); #if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) if (address.word>0x7FFF) flags.rampz = 1; // No go with m256, FIXME else flags.rampz = 0; #endif address.word = address.word << 1; // address * 2 -> byte location if (getch() == 'E') flags.eeprom = 1; else flags.eeprom = 0; if (getch() == ' ') { // Command terminator putch(0x14); for (w=0;w < length.word;w++) { // Can handle odd and even lengths okay if (flags.eeprom) { // Byte access EEPROM read #if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) while(EECR & (1<= 'a') { return (a - 'a' + 0x0a); } else if(a >= '0') { return(a - '0'); } return a; } char gethex(void) { return (gethexnib() << 4) + gethexnib(); } void puthex(char ch) { char ah; ah = ch >> 4; if(ah >= 0x0a) { ah = ah - 0x0a + 'a'; } else { ah += '0'; } ch &= 0x0f; if(ch >= 0x0a) { ch = ch - 0x0a + 'a'; } else { ch += '0'; } putch(ah); putch(ch); } void putch(char ch) { #if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) if(bootuart == 1) { while (!(UCSR0A & _BV(UDRE0))); UDR0 = ch; } else if (bootuart == 2) { while (!(UCSR1A & _BV(UDRE1))); UDR1 = ch; } #elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328__) while (!(UCSR0A & _BV(UDRE0))); UDR0 = ch; #else /* m8,16,32,169,8515,8535,163 */ while (!(UCSRA & _BV(UDRE))); UDR = ch; #endif } char getch(void) { #if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) uint32_t count = 0; if(bootuart == 1) { while(!(UCSR0A & _BV(RXC0))) { /* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/ /* HACKME:: here is a good place to count times*/ count++; if (count > MAX_TIME_COUNT) app_start(); } return UDR0; } else if(bootuart == 2) { while(!(UCSR1A & _BV(RXC1))) { /* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/ /* HACKME:: here is a good place to count times*/ count++; if (count > MAX_TIME_COUNT) app_start(); } return UDR1; } return 0; #elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328__) uint32_t count = 0; while(!(UCSR0A & _BV(RXC0))){ /* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/ /* HACKME:: here is a good place to count times*/ count++; if (count > MAX_TIME_COUNT) app_start(); } return UDR0; #else /* m8,16,32,169,8515,8535,163 */ uint32_t count = 0; while(!(UCSRA & _BV(RXC))){ /* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/ /* HACKME:: here is a good place to count times*/ count++; if (count > MAX_TIME_COUNT) app_start(); } return UDR; #endif } void getNch(uint8_t count) { while(count--) { #if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) if(bootuart == 1) { while(!(UCSR0A & _BV(RXC0))); UDR0; } else if(bootuart == 2) { while(!(UCSR1A & _BV(RXC1))); UDR1; } #elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328__) getch(); #else /* m8,16,32,169,8515,8535,163 */ /* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/ //while(!(UCSRA & _BV(RXC))); //UDR; getch(); // need to handle time out #endif } } void byte_response(uint8_t val) { if (getch() == ' ') { putch(0x14); putch(val); putch(0x10); } else { if (++error_count == MAX_ERROR_COUNT) app_start(); } } void nothing_response(void) { if (getch() == ' ') { putch(0x14); putch(0x10); } else { if (++error_count == MAX_ERROR_COUNT) app_start(); } } void flash_led(uint8_t count) { while (count--) { LED_PORT |= _BV(LED); _delay_ms(100); LED_PORT &= ~_BV(LED); _delay_ms(100); } } /* end of file ATmegaBOOT.c */ ================================================ FILE: external/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_atmega1280.hex ================================================ :020000021000EC :10F000000C9472F80C9492F80C9492F80C9492F878 :10F010000C9492F80C9492F80C9492F80C9492F848 :10F020000C9492F80C9492F80C9492F80C9492F838 :10F030000C9492F80C9492F80C9492F80C9492F828 :10F040000C9492F80C9492F80C9492F80C9492F818 :10F050000C9492F80C9492F80C9492F80C9492F808 :10F060000C9492F80C9492F80C9492F80C9492F8F8 :10F070000C9492F80C9492F80C9492F80C9492F8E8 :10F080000C9492F80C9492F80C9492F80C9492F8D8 :10F090000C9492F80C9492F80C9492F80C9492F8C8 :10F0A0000C9492F80C9492F80C9492F80C9492F8B8 :10F0B0000C9492F80C9492F80C9492F80C9492F8A8 :10F0C0000C9492F80C9492F80C9492F80C9492F898 :10F0D0000C9492F80C9492F80C9492F80C9492F888 :10F0E0000C9492F811241FBECFEFD1E2DEBFCDBF4A :10F0F00012E0A0E0B2E0EEEDFEEF01E00BBF02C0D7 :10F1000007900D92A833B107D9F71BBE13E0A8E30F :10F11000B2E001C01D92A334B107E1F70E9412FAD8 :10F120000C946DFF0C9400F8982F959595959595F6 :10F130009595905D8F708A301CF1282F295A809107 :10F140003802813019F0823071F008958091C0004A :10F1500085FFFCCF9093C6008091C00085FFFCCF57 :10F160002093C60008958091C80085FFFCCF90933E :10F17000CE008091C80085FFFCCF2093CE0008957B :10F18000282F205DDCCF982F80913802813019F034 :10F19000823041F008958091C00085FFFCCF9093AC :10F1A000C60008958091C80085FFFCCF9093CE00E3 :10F1B0000895EF92FF920F931F9380913802813050 :10F1C00069F1823031F080E01F910F91FF90EF9054 :10F1D0000895EE24FF2487018091C80087FD17C0A1 :10F1E0000894E11CF11C011D111D81E4E81682E464 :10F1F000F8068FE0080780E0180770F3E0913A0204 :10F20000F0913B0209958091C80087FFE9CF80917A :10F21000CE001F910F91FF90EF900895EE24FF24F0 :10F2200087018091C00087FD17C00894E11CF11C84 :10F23000011D111D81E4E81682E4F8068FE008073D :10F2400080E0180770F3E0913A02F0913B020995D3 :10F250008091C00087FFE9CF8091C6001F910F9178 :10F26000FF90EF9008950E94D9F8982F809138026E :10F27000813049F0823091F091366CF490330CF08B :10F280009053892F08958091C00085FFFCCF909303 :10F29000C60091369CF39755892F08958091C80038 :10F2A00085FFFCCF9093CE00E7CF1F930E9433F9E8 :10F2B000182F0E9433F91295107F810F1F91089526 :10F2C000982F20913802992339F0213031F02230E3 :10F2D00061F091509923C9F708958091C00087FF8C :10F2E000FCCF8091C6009150F5CF8091C80087FF78 :10F2F000FCCF8091CE009150EDCF1F93182F0E942C :10F30000D9F8803249F0809139028F5F80933902B9 :10F31000853091F11F910895809138028130B9F0C4 :10F320008230C1F78091C80085FFFCCF84E18093D3 :10F33000CE008091C80085FFFCCF1093CE00809155 :10F34000C80085FFFCCF80E18093CE00E3CF8091A1 :10F35000C00085FFFCCF84E18093C6008091C0008F :10F3600085FFFCCF1093C6008091C00085FFFCCFC5 :10F3700080E18093C600CECFE0913A02F0913B024B :10F3800009951F9108950E94D9F8803241F080912B :10F3900039028F5F80933902853029F10895809179 :10F3A0003802813089F08230C9F78091C80085FF2A :10F3B000FCCF84E18093CE008091C80085FFFCCF14 :10F3C00080E18093CE0008958091C00085FFFCCF3E :10F3D00084E18093C6008091C00085FFFCCF80E16E :10F3E0008093C6000895E0913A02F0913B0209959E :10F3F000089540E951E08823A1F02F9A28EE33E0E8 :10F40000FA013197F1F721503040D1F72F9828EECB :10F4100033E0FA013197F1F721503040D1F78150B4 :10F4200061F708952F923F924F925F926F927F9271 :10F430008F929F92AF92BF92CF92DF92EF92FF9204 :10F440000F931F93CF93DF93000081E080933802E6 :10F4500080E18093C4001092C5001092C00086E045 :10F460008093C20088E18093C1006898709A279ABF :10F4700081E00E94F9F9E4E1EE2E7EE1D72E67E902 :10F48000C62E53E0B52E40E1A42E9924939431E486 :10F49000832E26E5722E92E5692E80E2582E09E42D :10F4A000402E13E5312EB0E52B2E0E94D9F8803383 :10F4B000C9F1813309F452C0803409F4C8C08134E1 :10F4C00009F4EAC0823489F1853409F4CAC0803570 :10F4D00049F1823539F1813529F1853509F4ECC0DE :10F4E000863509F409C1843609F428C1843709F442 :10F4F000ABC1853709F473C2863709F4D9C08132AC :10F5000009F4B7C2809139028F5F80933902853048 :10F5100061F6E0913A02F0913B0209950E94D9F818 :10F52000803339F60E94C3F9C0CF2091380293E1AD :10F5300005C0223061F09923A9F391502130C9F719 :10F540008091C00087FFFCCF8091C600F4CF8091EE :10F55000C80087FFFCCF8091CE00EDCF0E94D9F884 :10F56000803281F6809138028130D1F1823009F009 :10F570009CCF8091C80085FFFCCFE092CE008091A7 :10F58000C80085FFFCCF8092CE008091C80085FF27 :10F59000FCCF7092CE008091C80085FFFCCF6092B6 :10F5A000CE008091C80085FFFCCF5092CE008091A4 :10F5B000C80085FFFCCF4092CE008091C80085FF37 :10F5C000FCCF3092CE008091C80085FFFCCF209206 :10F5D000CE008091C80085FFFCCFA092CE0065CF01 :10F5E0008091C00085FFFCCFE092C6008091C000F2 :10F5F00085FFFCCF8092C6008091C00085FFFCCFC4 :10F600007092C6008091C00085FFFCCF6092C6005A :10F610008091C00085FFFCCF5092C6008091C00051 :10F6200085FFFCCF4092C6008091C00085FFFCCFD3 :10F630003092C6008091C00085FFFCCF2092C600AA :10F640008091C00085FFFCCFA092C6002ECF0E9403 :10F65000D9F8863808F466CF0E94D9F80E94C3F919 :10F6600024CF2091380294E0213041F0223069F01B :10F67000992309F457CF91502130C1F78091C000F0 :10F6800087FFFCCF8091C600F3CF8091C80087FF31 :10F69000FCCF8091CE00ECCF0E94D9F8803841F1A8 :10F6A000813809F447C0823809F4CAC08839E1F0CA :10F6B00080E00E947DF9F9CE0E94D9F880933C0247 :10F6C0000E94D9F880933D020E94C3F9EECE0E94B9 :10F6D000D9F80E94D9F8182F0E94D9F8112309F4FB :10F6E0007EC2113009F40AC283E00E947DF9DDCEAA :10F6F00082E00E947DF9D9CE0E94D9F8803339F397 :10F700002091380292E0213039F0223061F09923C3 :10F7100079F291502130C9F78091C00087FFFCCF6A :10F720008091C600F4CF8091C80087FFFCCF809104 :10F73000CE00EDCF81E00E947DF9B7CE0E94D9F8CE :10F7400080933F030E94D9F880933E038091420347 :10F750008E7F809342030E94D9F8853409F4B3C1A7 :10F7600080913E0390913F03892B89F000E010E0E7 :10F770000E94D9F8F801E25CFD4F80830F5F1F4FB4 :10F7800080913E0390913F030817190788F30E9468 :10F79000D9F8803209F0B6CE8091420380FFB2C121 :10F7A00040913C0250913D02440F551F50933D0241 :10F7B00040933C0260913E0370913F0361157105D7 :10F7C000F1F080E090E09A01280F391FFC01E25C23 :10F7D000FD4FE081F999FECF1FBA32BD21BDE0BDDA :10F7E0000FB6F894FA9AF99A0FBE01968617970702 :10F7F00050F3460F571F50933D0240933C028091B7 :10F800003802813081F0823009F04FCE8091C800FB :10F8100085FFFCCFE092CE008091C80085FFFCCF31 :10F82000A092CE0042CE8091C00085FFFCCFE09236 :10F83000C6008091C00085FFFCCFA092C60035CEE7 :10F8400080E10E947DF931CE0E94D9F880933F0378 :10F850000E94D9F880933E0320913C0230913D02F2 :10F8600037FD46C1809142038D7F80934203220F72 :10F87000331F30933D0220933C020E94D9F8853417 :10F8800009F430C1809142038E7F809342030E942D :10F89000D9F8803209F009CE60913802613009F45C :10F8A0006FC0623009F473C000913E0310913F03B2 :10F8B0000115110509F440C080914203782F717041 :10F8C000F82EF69481E0F82240913C0250913D02DE :10F8D00020E030E013C0FF2009F060C0FA019491ED :10F8E000613009F43BC0623009F441C0CA0101969D :10F8F0002F5F3F4FAC0120173107D0F4772359F326 :10F90000F999FECF52BD41BDF89A90B56130F9F03A :10F91000623061F78091C80085FFFCCF9093CE00E4 :10F92000CA0101962F5F3F4FAC012017310730F31A :10F9300090933D0280933C02613009F4CAC062306A :10F9400009F0B3CD8091C80085FFFCCF46CE8091F1 :10F95000C00085FFFCCF9093C600C8CF8091C00047 :10F9600085FDF9CF8091C00085FFF8CFF4CF80915D :10F97000C80085FDD3CF8091C80085FFF8CFCECFDA :10F980008091C00085FFFCCFE092C6008DCF8091B2 :10F99000C80085FFFCCFE092CE0086CFCA01A0E070 :10F9A000B0E080509040AF4FBF4FABBFFC0197918C :10F9B000613061F0623009F099CF8091C80085FD17 :10F9C000ADCF8091C80085FFF8CFA8CF8091C0004F :10F9D00085FDC1CF8091C00085FFF8CFBCCF0E94CC :10F9E000D9F8803209F08ECD80913802813011F142 :10F9F000823009F05ACD8091C80085FFFCCFE0929B :10FA0000CE008091C80085FFFCCFD092CE008091BF :10FA1000C80085FFFCCFC092CE008091C80085FF52 :10FA2000FCCFB092CE008091C80085FFFCCFA092A1 :10FA3000CE003BCD8091C00085FFFCCFE092C60098 :10FA40008091C00085FFFCCFD092C6008091C0009D :10FA500085FFFCCFC092C6008091C00085FFFCCF1F :10FA6000B092C6008091C00085FFFCCFA092C60076 :10FA70001CCD0E94D9F8813209F017CD0E94D9F827 :10FA8000813209F012CD279A2F98109240032091CD :10FA90003802E1E491E00EC0223009F4A4C0909352 :10FAA0004003E92FF0E0E050FE4FE0819F5FEE233E :10FAB00009F4A0C0213081F78091C00085FFFCCF00 :10FAC000E093C600ECCF80914203816080934203B3 :10FAD00047CE8091C00085FDB7CD8091C00085FFE5 :10FAE000F8CFB2CD80914203816080934203CFCEA4 :10FAF00080914203826080934203B9CE87E90E94DD :10FB00007DF9D3CC80913D028823880F880B892111 :10FB1000809341038BBF80913C0290913D02880FFE :10FB2000991F90933D0280933C0280913E0380FF99 :10FB300009C080913E0390913F03019690933F034B :10FB400080933E03F894F999FECF1127E0913C028F :10FB5000F0913D02CEE3D2E080913E0390913F03CD :10FB6000103091F40091570001700130D9F303E097 :10FB700000935700E8950091570001700130D9F3C8 :10FB800001E100935700E895099019900091570002 :10FB900001700130D9F301E000935700E895139507 :10FBA000103898F011270091570001700130D9F3F7 :10FBB00005E000935700E89500915700017001306F :10FBC000D9F301E100935700E8953296029709F0C6 :10FBD000C7CF103011F00296E5CF112410CE8EE180 :10FBE0000E947DF962CC8091C80085FFFCCFE09334 :10FBF000CE0055CF7AE0B72E6DE0A62E5AE3952EB3 :10FC000040E2842E3DE3732E90E3692E81E3582E6B :10FC1000213009F442C0223009F45FC00E94D9F8B3 :10FC2000982F20913802213089F1223009F44EC0FA :10FC3000943709F46BC0923709F405C1973709F47A :10FC40007BC0953799F0923609F4BDC09A3601F71A :10FC5000E0913A02F0913B02099520913802D8CF09 :10FC60008091C00085FFFCCF9093C6000E94D9F818 :10FC7000982F80913802813099F38230B9F78091C2 :10FC8000C80085FFFCCF9093CE00F0CF8091C000DC :10FC900085FFFCCF9093C600CBCF8091C00085FF3D :10FCA000FCCFB092C6008091C00085FFFCCFA0922F :10FCB000C6008091C00085FFFCCF9092C600809165 :10FCC000C00085FFFCCF8092C600A8CF8091C800FD :10FCD00085FFFCCF9093CE00ABCF8091C80085FF0D :10FCE000FCCFB092CE008091C80085FFFCCFA092DF :10FCF000CE008091C80085FFFCCF9092CE0080910D :10FD0000C80085FFFCCF8092CE0088CF1F9947C0E6 :10FD10002F9A213051F0223009F07ACF8091C8001B :10FD200085FFFCCF6092CE0073CF8091C00085FF2D :10FD3000FCCF6092C6006CCF0E94D9F8982F8091BA :10FD400038028130F1F0823009F4ABC00E9455F9DD :10FD5000082F0E9455F9182F0E94D9F8982F8091EA :10FD600038028130A9F0823009F4A2C00E9455F90E :10FD7000D02ECC24F601E10FF11D808320913802B2 :10FD800047CF8091C00085FFFCCF9093C600DECFA7 :10FD90008091C00085FFFCCF9093C600E7CF2F98DD :10FDA000213051F0223009F033CF8091C80085FF17 :10FDB000FCCF5092CE002CCF8091C00085FFFCCFAD :10FDC0005092C60025CF213041F1223081F080E8E9 :10FDD00085BF109274001092750080E091E1FC01E3 :10FDE000819180E091E13097D1F3CF01F8CF8091FC :10FDF000C80085FFFCCF82E68093CE008091C800CA :10FE000085FFFCCF85E78093CE008091C80085FFF9 :10FE1000FCCF83E78093CE00DACF8091C00085FFCE :10FE2000FCCF82E68093C6008091C00085FFFCCFA6 :10FE300085E78093C6008091C00085FFFCCF83E7F3 :10FE40008093C600C4CF0E94D9F8982F80913802C1 :10FE50008130C9F08230D1F10E9455F9182F0E94EB :10FE600055F9982F809138028130A1F0823039F114 :10FE7000F12EEE24F701E90FF11D80810E9494F824 :10FE800020913802C5CE8091C00085FFFCCF9093B1 :10FE9000C600E2CF8091C00085FFFCCF7092C60003 :10FEA000E7CF8091C80085FFFCCF9093CE004ECF66 :10FEB0008091C80085FFFCCF9093CE0057CF8091F2 :10FEC000C80085FFFCCF7092CE00D2CF8091C800D1 :0EFED00085FFFCCF9093CE00BFCFF894FFCFFC :10FEDE0041546D656761424F4F54202F204172642B :10FEEE0075696E6F204D656761202D20284329208E :10FEFE0041726475696E6F204C4C43202D20303951 :08FF0E00303933300A0D008088 :040000031000F000F9 :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_atmega328.hex ================================================ :107800000C94343C0C94513C0C94513C0C94513CE1 :107810000C94513C0C94513C0C94513C0C94513CB4 :107820000C94513C0C94513C0C94513C0C94513CA4 :107830000C94513C0C94513C0C94513C0C94513C94 :107840000C94513C0C94513C0C94513C0C94513C84 :107850000C94513C0C94513C0C94513C0C94513C74 :107860000C94513C0C94513C11241FBECFEFD8E036 :10787000DEBFCDBF11E0A0E0B1E0ECE9FFE702C060 :1078800005900D92A230B107D9F712E0A2E0B1E065 :1078900001C01D92AD30B107E1F70E942D3D0C945F :1078A000CC3F0C94003C982F959595959595959582 :1078B000905D8F708A307CF0282F295A8091C0000B :1078C00085FFFCCF9093C6008091C00085FFFCCF60 :1078D0002093C6000895282F205DF0CF982F809127 :1078E000C00085FFFCCF9093C6000895EF92FF92F1 :1078F0000F931F93EE24FF2487018091C00087FD22 :1079000017C00894E11CF11C011D111D81E4E8164B :1079100082E4F8068FE0080780E0180770F3E09132 :107920000401F091050109958091C00087FFE9CF1E :107930008091C6001F910F91FF90EF9008950E94D3 :10794000763C982F8091C00085FFFCCF9093C600B5 :1079500091362CF490330CF09053892F089597555D :10796000892F08951F930E949F3C182F0E949F3CCF :107970001295107F810F1F9108951F93182F882350 :1079800021F00E94763C1150E1F71F9108951F935A :10799000182F0E94763C803249F0809103018F5F5E :1079A000809303018530C1F01F9108958091C0003C :1079B00085FFFCCF84E18093C6008091C00085FFE5 :1079C000FCCF1093C6008091C00085FFFCCF80E102 :1079D0008093C6001F910895E0910401F091050184 :1079E00009951F9108950E94763C803241F0809164 :1079F00003018F5F80930301853081F008958091AA :107A0000C00085FFFCCF84E18093C6008091C00058 :107A100085FFFCCF80E18093C6000895E0910401CA :107A2000F09105010995089540E951E08823A1F0FE :107A30002D9A28EE33E0FA013197F1F721503040CA :107A4000D1F72D9828EE33E0FA013197F1F7215064 :107A50003040D1F7815061F708953F924F925F9285 :107A60006F927F928F929F92AF92BF92CF92DF924E :107A7000EF92FF920F931F93CF93DF93000080E16B :107A80008093C4001092C50088E18093C10086E015 :107A90008093C2005098589A259A81E00E94143D24 :107AA00024E1F22E9EE1E92E85E9D82E0FE0C02ECA :107AB00010E1B12EAA24A394B1E49B2EA6E58A2E50 :107AC000F2E57F2EE0E26E2E79E4572E63E5462E36 :107AD00050E5352E0E94763C8033B1F18133B9F107 :107AE000803409F46FC0813409F476C0823409F41B :107AF00085C0853409F488C0803531F1823521F1A3 :107B0000813511F1853509F485C0863509F48DC0BC :107B1000843609F496C0843709F403C1853709F423 :107B200072C1863709F466C0809103018F5F80932C :107B30000301853079F6E0910401F0910501099582 :107B40000E94763C803351F60E94F33CC3CF0E94E2 :107B5000763C803249F78091C00085FFFCCFF092DF :107B6000C6008091C00085FFFCCF9092C600809136 :107B7000C00085FFFCCF8092C6008091C00085FFC9 :107B8000FCCF7092C6008091C00085FFFCCF609250 :107B9000C6008091C00085FFFCCF5092C600809146 :107BA000C00085FFFCCF4092C6008091C00085FFD9 :107BB000FCCF3092C6008091C00085FFFCCFB09210 :107BC000C60088CF0E94763C863808F4BDCF0E945C :107BD000763C0E94F33C7ECF0E94763C803809F4CC :107BE0009CC0813809F40BC1823809F43CC1883942 :107BF00009F48FC080E00E94C73C6CCF84E10E94F2 :107C0000BD3C0E94F33C66CF85E00E94BD3C0E94D3 :107C1000F33C60CF0E94763C809306010E94763C44 :107C2000809307010E94F33C55CF0E94763C80333D :107C300009F41DC183E00E94BD3C80E00E94C73C66 :107C400049CF0E94763C809309020E94763C809343 :107C5000080280910C028E7F80930C020E94763C79 :107C6000853409F415C18091080290910902892B8D :107C700089F000E010E00E94763CF801E85FFE4FDA :107C800080830F5F1F4F80910802909109020817AF :107C9000190788F30E94763C803209F045CF809125 :107CA0000C0280FF01C16091060170910701660F0F :107CB000771F7093070160930601A0910802B091AD :107CC00009021097C9F0E8E0F1E09B01AD014E0F09 :107CD0005F1FF999FECF32BD21BD819180BDFA9A17 :107CE000F99A2F5F3F4FE417F50799F76A0F7B1F4B :107CF00070930701609306018091C00085FFFCCF5F :107D0000F092C6008091C00085FFFCCFB092C60003 :107D1000E1CE83E00E94C73CDDCE82E00E94C73CFA :107D2000D9CE0E94763C809309020E94763C8093D3 :107D300008028091060190910701880F991F909386 :107D40000701809306010E94763C853409F4A6C0A1 :107D500080910C028E7F80930C020E94763C8032D0 :107D600009F0B8CE8091C00085FFFCCFF092C6002C :107D7000609108027091090261157105B9F140E046 :107D800050E080910C02A82FA170B82FB27011C0E2 :107D9000BB2309F45CC0E0910601F0910701319624 :107DA000F0930701E09306014F5F5F4F46175707B7 :107DB000E8F4AA2369F3F999FECF209106013091E6 :107DC000070132BD21BDF89A90B58091C00085FFB2 :107DD000FCCF9093C6002F5F3F4F30930701209355 :107DE00006014F5F5F4F4617570718F38091C00099 :107DF00085FDE5CE8091C00085FFF8CFE0CE81E023 :107E00000E94C73C67CE0E94763C803209F08CCE3F :107E10008091C00085FFFCCFF092C6008091C00029 :107E200085FFFCCFE092C6008091C00085FFFCCFAB :107E3000D092C6008091C00085FFFCCFC092C600E2 :107E40008091C00085FFFCCFB092C60043CEE09188 :107E50000601F091070194918091C00085FFFCCF4D :107E60009093C6009CCF80E10E94C73C33CE0E9415 :107E7000763C0E94763C182F0E94763C112309F430 :107E800083C0113009F484C08FE00E94C73C22CE29 :107E900080910C02816080930C02E5CE80910C02EF :107EA000816080930C0259CF809107018823880F4D :107EB000880B8A2180930B02809106019091070123 :107EC000880F991F90930701809306018091080203 :107ED00080FF09C080910802909109020196909359 :107EE000090280930802F894F999FECF1127E091D6 :107EF0000601F0910701C8E0D1E08091080290915D :107F00000902103091F40091570001700130D9F34B :107F100003E000935700E89500915700017001308D :107F2000D9F301E100935700E89509901990009169 :107F3000570001700130D9F301E000935700E89534 :107F40001395103498F011270091570001700130FB :107F5000D9F305E000935700E895009157000170B0 :107F60000130D9F301E100935700E895329602976A :107F700009F0C7CF103011F00296E5CF112480919F :107F8000C00085FFB9CEBCCE8EE10E94C73CA2CD19 :0C7F900085E90E94C73C9ECDF894FFCF0D :027F9C00800063 :040000030000780081 :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex ================================================ :107800000C94343C0C94513C0C94513C0C94513CE1 :107810000C94513C0C94513C0C94513C0C94513CB4 :107820000C94513C0C94513C0C94513C0C94513CA4 :107830000C94513C0C94513C0C94513C0C94513C94 :107840000C94513C0C94513C0C94513C0C94513C84 :107850000C94513C0C94513C0C94513C0C94513C74 :107860000C94513C0C94513C11241FBECFEFD8E036 :10787000DEBFCDBF11E0A0E0B1E0EAE8FFE702C063 :1078800005900D92A230B107D9F712E0A2E0B1E065 :1078900001C01D92AD30B107E1F70E942D3D0C945F :1078A000C33F0C94003C982F95959595959595958B :1078B000905D8F708A307CF0282F295A8091C0000B :1078C00085FFFCCF9093C6008091C00085FFFCCF60 :1078D0002093C6000895282F205DF0CF982F809127 :1078E000C00085FFFCCF9093C6000895EF92FF92F1 :1078F0000F931F93EE24FF2487018091C00087FD22 :1079000017C00894E11CF11C011D111D81E2E8164D :1079100081EAF80687E0080780E0180770F3E09135 :107920000401F091050109958091C00087FFE9CF1E :107930008091C6001F910F91FF90EF9008950E94D3 :10794000763C982F8091C00085FFFCCF9093C600B5 :1079500091362CF490330CF09053892F089597555D :10796000892F08951F930E949F3C182F0E949F3CCF :107970001295107F810F1F9108951F93182F882350 :1079800021F00E94763C1150E1F71F9108951F935A :10799000182F0E94763C803249F0809103018F5F5E :1079A000809303018530C1F01F9108958091C0003C :1079B00085FFFCCF84E18093C6008091C00085FFE5 :1079C000FCCF1093C6008091C00085FFFCCF80E102 :1079D0008093C6001F910895E0910401F091050184 :1079E00009951F9108950E94763C803241F0809164 :1079F00003018F5F80930301853081F008958091AA :107A0000C00085FFFCCF84E18093C6008091C00058 :107A100085FFFCCF80E18093C6000895E0910401CA :107A2000F09105010995089548EC50E08823A1F0F4 :107A30002D9A28EE33E0FA013197F1F721503040CA :107A4000D1F72D9828EE33E0FA013197F1F7215064 :107A50003040D1F7815061F708953F924F925F9285 :107A60006F927F928F929F92AF92BF92CF92DF924E :107A7000EF92FF920F931F93CF93DF93000082E06A :107A80008093C00080E18093C4001092C50088E11B :107A90008093C10086E08093C2005098589A259A3E :107AA00081E00E94143D24E1F22E9EE1E92E85E959 :107AB000D82E0FE0C02E10E1B12EAA24A394B1E479 :107AC0009B2EA6E58A2EF2E57F2EE0E26E2E79E46B :107AD000572E63E5462E50E5352E0E94763C8033C6 :107AE000B1F18133B9F1803409F46FC0813409F404 :107AF00076C0823409F485C0853409F488C08035A5 :107B000031F1823521F1813511F1853509F485C0D6 :107B1000863509F48DC0843609F496C0843709F49B :107B200003C1853709F472C1863709F466C08091B4 :107B300003018F5F80930301853079F6E0910401A2 :107B4000F091050109950E94763C803351F60E9420 :107B5000F33CC3CF0E94763C803249F78091C0004D :107B600085FFFCCFF092C6008091C00085FFFCCF5E :107B70009092C6008091C00085FFFCCF8092C60025 :107B80008091C00085FFFCCF7092C6008091C0003C :107B900085FFFCCF6092C6008091C00085FFFCCFBE :107BA0005092C6008091C00085FFFCCF4092C60075 :107BB0008091C00085FFFCCF3092C6008091C0004C :107BC00085FFFCCFB092C60088CF0E94763C8638F5 :107BD00008F4BDCF0E94763C0E94F33C7ECF0E9409 :107BE000763C803809F49CC0813809F40BC1823896 :107BF00009F430C1883909F48FC080E00E94C73C85 :107C00006CCF84E10E94BD3C0E94F33C66CF85E0CE :107C10000E94BD3C0E94F33C60CF0E94763C809362 :107C200006010E94763C809307010E94F33C55CFE9 :107C30000E94763C803309F411C183E00E94BD3C70 :107C400080E00E94C73C49CF0E94763C80930902A5 :107C50000E94763C8093080280910C028E7F809374 :107C60000C020E94763C853409F409C18091080217 :107C700090910902892B89F000E010E00E94763C87 :107C8000F801E85FFE4F80830F5F1F4F809108026D :107C9000909109020817190788F30E94763C8032F8 :107CA00009F045CF80910C0280FFF5C0609106017C :107CB00070910701660F771F7093070160930601AB :107CC000A0910802B09109021097C9F0E8E0F1E034 :107CD0009B01AD014E0F5F1FF999FECF32BD21BD53 :107CE000819180BDFA9AF99A2F5F3F4FE417F5070B :107CF00099F76A0F7B1F70930701609306018091CB :107D0000C00085FFFCCFF092C6008091C00085FFC7 :107D1000FCCFB092C600E1CE83E00E94C73CDDCE2E :107D200082E00E94C73CD9CE0E94763C8093090233 :107D30000E94763C80930802809106019091070191 :107D4000880F991F90930701809306010E94763C4B :107D5000853409F49AC080910C028E7F80930C02C6 :107D60000E94763C803209F0B8CE8091C00085FF39 :107D7000FCCFF092C600A0910802B09109021097C2 :107D8000C1F180910C02082F0170182F1695117007 :107D9000E0910601F0910701AF014F5F5F4FBA011B :107DA00020E030E00023B1F4112339F49491809164 :107DB000C00085FFFCCF9093C6002F5F3F4FCB01E3 :107DC0000196FA012A173B0780F4BC014F5F5F4F11 :107DD000002351F3F999FECFF2BDE1BDF89A90B5B9 :107DE0008091C00085FFFCCFE6CF709307016093C0 :107DF00006018091C00085FDE5CE8091C00085FF21 :107E0000F8CFE0CE81E00E94C73C67CE0E94763C6E :107E1000803209F08CCE8091C00085FFFCCFF092BB :107E2000C6008091C00085FFFCCFE092C600809123 :107E3000C00085FFFCCFD092C6008091C00085FFB6 :107E4000FCCFC092C6008091C00085FFFCCFB092ED :107E5000C60043CE80E10E94C73C3FCE0E94763CE4 :107E60000E94763C182F0E94763C112309F483C0AF :107E7000113009F484C08FE00E94C73C2ECE80915F :107E80000C02816080930C02F1CE80910C02816023 :107E900080930C0265CF809107018823880F880B9F :107EA0008A2180930B028091060190910701880F2F :107EB000991F90930701809306018091080280FF2B :107EC00009C08091080290910902019690930902DD :107ED00080930802F894F999FECF1127E0910601EA :107EE000F0910701C8E0D1E0809108029091090269 :107EF000103091F40091570001700130D9F303E084 :107F000000935700E8950091570001700130D9F3B4 :107F100001E100935700E8950990199000915700EE :107F200001700130D9F301E000935700E8951395F3 :107F3000103498F011270091570001700130D9F3E7 :107F400005E000935700E89500915700017001305B :107F5000D9F301E100935700E8953296029709F0B2 :107F6000C7CF103011F00296E5CF11248091C000E8 :107F700085FFC5CEC8CE8EE10E94C73CAECD85E957 :0A7F80000E94C73CAACDF894FFCF81 :027F8A00800075 :040000030000780081 :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_diecimila.hex ================================================ :103800000C94341C0C94511C0C94511C0C94511CA1 :103810000C94511C0C94511C0C94511C0C94511C74 :103820000C94511C0C94511C0C94511C0C94511C64 :103830000C94511C0C94511C0C94511C0C94511C54 :103840000C94511C0C94511C0C94511C0C94511C44 :103850000C94511C0C94511C0C94511C0C94511C34 :103860000C94511C0C94511C11241FBECFEFD4E0BA :10387000DEBFCDBF11E0A0E0B1E0E4EAFFE302C0AB :1038800005900D92A230B107D9F712E0A2E0B1E0A5 :1038900001C01D92AD30B107E1F70E94361D0C94B6 :1038A000D01F0C94001C982F9595959595959595FE :1038B000905D8F708A307CF0282F295A8091C0004B :1038C00085FFFCCF9093C6008091C00085FFFCCFA0 :1038D0002093C6000895282F205DF0CF982F809167 :1038E000C00085FFFCCF9093C6000895EF92FF9231 :1038F0000F931F93EE24FF2487018091C00087FD62 :1039000017C00894E11CF11C011D111D81E4E8168B :1039100082E4F8068FE0080780E0180770F3E09172 :103920000401F091050109958091C00087FFE9CF5E :103930008091C6001F910F91FF90EF9008950E9413 :10394000761C982F8091C00085FFFCCF9093C60015 :1039500091362CF490330CF09053892F089597559D :10396000892F08951F930E949F1C182F0E949F1C4F :103970001295107F810F1F910895882351F0982F81 :1039800091508091C00087FFFCCF8091C6009923A1 :10399000B9F708951F93182F0E94761C803249F0C2 :1039A000809103018F5F809303018530C1F01F91E7 :1039B00008958091C00085FFFCCF84E18093C6000C :1039C0008091C00085FFFCCF1093C6008091C0009D :1039D00085FFFCCF80E18093C6001F910895E091A0 :1039E0000401F091050109951F9108950E94761C2C :1039F000803241F0809103018F5F80930301853015 :103A000081F008958091C00085FFFCCF84E1809310 :103A1000C6008091C00085FFFCCF80E18093C60086 :103A20000895E0910401F09105010995089510921F :103A30000A028823D1F090E040E951E02D9A28EE67 :103A400033E0FA013197F1F721503040D1F72D984A :103A500028EE33E0FA013197F1F721503040D1F7E9 :103A60009F5F981758F380930A0208953F924F92F0 :103A70005F926F927F928F929F92AF92BF92CF92FE :103A8000DF92EF92FF920F931F93CF93DF9300008B :103A900083E38093C4001092C50088E18093C10045 :103AA00086E08093C2005098589A259A81E00E943F :103AB000171D44E1F42E3EE1E32E24E9D22E96E0D8 :103AC000C92E80E1B82EAA24A39401E4902E16E515 :103AD000812EB2E57B2EA0E26A2EF9E45F2EE3E5AB :103AE0004E2E70E5372E0E94761C8033B1F1813363 :103AF00009F441C0803409F479C0813409F48CC0E0 :103B0000823471F1853409F47BC0803531F182351E :103B100021F1813511F1853509F48DC0863509F41F :103B20009DC0843609F4AEC0843709F41BC18537C3 :103B300009F485C1863709F47AC0809103018F5F4B :103B400080930301853079F6E0910401F09105013D :103B500009950E94761C803351F60E94F61CC3CF53 :103B600093E18091C00087FFFCCF8091C60099232C :103B7000A1F39150F6CF0E94761C8032F1F680912D :103B8000C00085FFFCCFF092C6008091C00085FF89 :103B9000FCCF9092C6008091C00085FFFCCF809240 :103BA000C6008091C00085FFFCCF7092C600809156 :103BB000C00085FFFCCF6092C6008091C00085FFE9 :103BC000FCCF5092C6008091C00085FFFCCF409290 :103BD000C6008091C00085FFFCCF3092C600809166 :103BE000C00085FFFCCFB092C6007DCF0E94761C3E :103BF000863808F4B2CF0E94761C0E94F61C73CF60 :103C000094E08091C00087FFFCCF8091C60099238B :103C100009F4A3CF9150F5CF0E94761C8038D1F0E3 :103C2000813861F1823809F499C0883979F080E0EF :103C30000E94CA1C58CF0E94761C809306010E94E5 :103C4000761C809307010E94F61C4DCF83E00E94F2 :103C5000CA1C49CF82E00E94CA1C45CF0E94761C34 :103C6000803309F486C192E08091C00087FFFCCFC9 :103C70008091C6009923D9F29150F6CF81E00E943D :103C8000CA1C31CF0E94761C809309020E94761CC8 :103C90008093080280910C028E7F80930C020E9418 :103CA000761C853429F480910C02816080930C028B :103CB0008091080290910902892B89F000E010E0C0 :103CC0000E94761CF801E85FFE4F80830F5F1F4F54 :103CD00080910802909109020817190788F30E9441 :103CE000761C803209F029CF80910C0280FFD1C070 :103CF0004091060150910701440F551F5093070151 :103D000040930601A0910802B09109021097C9F0F2 :103D1000E8E0F1E09A01BD016E0F7F1FF999FECF37 :103D200032BD21BD819180BDFA9AF99A2F5F3F4F34 :103D3000E617F70799F74A0F5B1F50930701409367 :103D400006018091C00085FFFCCFF092C6008091F3 :103D5000C00085FFFCCFB092C600C5CE80E10E94B6 :103D6000CA1CC1CE0E94761C809309020E94761C58 :103D7000809308028091060190910701880F991F96 :103D800090930701809306010E94761C853409F404 :103D90007AC080910C028E7F80930C020E94761C68 :103DA000803209F0A0CE8091C00085FFFCCFF09258 :103DB000C600A0910802B09109021097B9F1809154 :103DC0000C02182F1170082F0270E0910601F0917B :103DD00007019F012F5F3F4FB90140E050E01123E1 :103DE000B1F4002339F494918091C00085FFFCCF99 :103DF0009093C6004F5F5F4FCB010196F9014A17C0 :103E00005B0780F4BC012F5F3F4F112351F3F999F9 :103E1000FECFF2BDE1BDF89A90B58091C00085FF5C :103E2000FCCFE6CF70930701609306018091C0003C :103E300085FDD9CE8091C00085FFF8CFD4CE0E94F9 :103E4000761C803209F079CE8091C00085FFFCCFCE :103E5000F092C6008091C00085FFFCCFE092C600C2 :103E60008091C00085FFFCCFD092C6008091C00039 :103E700085FFFCCFC092C6008091C00085FFFCCFBB :103E8000B092C60030CE80910C02816080930C020B :103E900085CF809107018823880F880B8A21809322 :103EA0000B028091060190910701880F991F909352 :103EB0000701809306018091080280FF09C080916C :103EC00008029091090201969093090280930802DA :103ED000F894F999FECF1127E0910601F0910701BE :103EE000C8E0D1E08091080290910902103091F46D :103EF0000091570001700130D9F303E0009357009F :103F0000E8950091570001700130D9F301E1009369 :103F10005700E89509901990009157000170013001 :103F2000D9F301E000935700E8951395103498F009 :103F300011270091570001700130D9F305E000937B :103F40005700E8950091570001700130D9F301E165 :103F500000935700E8953296029709F0C7CF1030CA :103F600011F00296E5CF11248091C00085FFE9CEC3 :103F7000ECCE0E94761C0E94761C182F0E94761CA4 :103F8000112351F0113021F086E00E94CA1CABCD04 :103F900084E90E94CA1CA7CD8EE10E94CA1CA3CD51 :043FA000F894FFCFC3 :023FA40080009B :0400000300003800C1 :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_ng.hex ================================================ :103800000C94341C0C94511C0C94511C0C94511CA1 :103810000C94511C0C94511C0C94511C0C94511C74 :103820000C94511C0C94511C0C94511C0C94511C64 :103830000C94511C0C94511C0C94511C0C94511C54 :103840000C94511C0C94511C0C94511C0C94511C44 :103850000C94511C0C94511C0C94511C0C94511C34 :103860000C94511C0C94511C11241FBECFEFD4E0BA :10387000DEBFCDBF11E0A0E0B1E0E4EAFEE302C0AC :1038800005900D92A230B107D9F712E0A2E0B1E0A5 :1038900001C01D92AD30B107E1F70E94ED1C0C9400 :1038A000511F0C94001C482F10920A0280E08417CC :1038B000E0F4582F2D9A28EE33E080E991E001974B :1038C000F1F721503040C9F72D9828EE33E080E918 :1038D00091E00197F1F721503040C9F7852F8F5FB4 :1038E000582F841738F380930A020895EF92FF92BD :1038F0000F931F93EE24FF2487018091C00087FD62 :1039000017C00894E11CF11C011D111D81E0E8168F :1039100082E1F8068AE7080780E0180770F3E09173 :103920000201F091030109958091C00087FFE9CF62 :103930008091C600992787FD90951F910F91FF9068 :10394000EF900895982F8091C00085FFFCCF909351 :10395000C60008950E94761C803271F080910401A7 :103960008F5F80930401853009F00895E091020192 :10397000F09103010995089584E10E94A21C80E161 :103980000E94A21C0895CF93C82F0E94761C8032FB :1039900041F0809104018F5F80930401853081F4B0 :1039A0000AC084E10E94A21C8C2F0E94A21C80E10C :1039B0000E94A21C05C0E0910201F091030109954B :1039C000CF910895CF93C82FC150CF3F21F00E94CF :1039D000761CC150E0F7CF910895CFEFD4E0DEBF61 :1039E000CDBF000083E38093C4001092C50088E13E :1039F0008093C10086E08093C2005098589A259A1F :103A000083E00E94531C0E94761C8033B1F1813305 :103A1000B9F1803409F455C0813409F45BC08234B3 :103A200009F46DC0853409F470C0803531F18235F8 :103A300021F1813511F1853509F46BC0863509F422 :103A400073C0843609F47AC0843709F4CEC0853750 :103A500009F429C1863709F44AC0809104018F5FB7 :103A600080930401853079F6E0910201F091030121 :103A700009950E94761C803351F60E94AA1CC3CF80 :103A80000E94761CC82F803241F784E10E94A21C5C :103A900081E40E94A21C86E50E94A21C82E50E948D :103AA000A21C8C2F0E94A21C89E40E94A21C83E508 :103AB0000E94A21C80E50E94A21C80E10E94A21C20 :103AC000A2CF0E94761C8638C0F20E94761C0E940B :103AD000AA1C99CF0E94761C803809F486C18138CF :103AE00009F487C1823809F488C1883921F080E05F :103AF0000E94C31C88CF83E00E94C31C84CF84E152 :103B00000E94E21C0E94AA1C7ECF85E00E94E21C5B :103B1000F9CF0E94761C809306010E94761C809348 :103B200007010E94AA1C6FCF0E94761C803309F403 :103B3000CAC083E00E94E21C80E0DACF0E94761CBB :103B4000809309020E94761C8093080280910C02E7 :103B50008E7F80930C020E94761C853409F4C4C0C9 :103B600000E010E0809108029091090218161906F1 :103B700070F4C8E0D1E00E94761C89930F5F1F4F5C :103B8000809108029091090208171907A0F30E947A :103B9000761C803209F061CF80910C0280FFAEC0AC :103BA000E0910601F0910701EE0FFF1F00E010E029 :103BB00020910802309109021216130680F4A8E041 :103BC000B1E0F999FECFF2BDE1BD8D9180BDFA9AC9 :103BD000F99A31960F5F1F4F0217130790F3F09376 :103BE0000701E093060184E166CF0E94761C809372 :103BF00009020E94761C8093080280910601909130 :103C00000701880F991F90930701809306010E9476 :103C1000761C853409F46EC080910C028E7F8093EF :103C20000C020E94761C803209F0EDCE84E10E94E5 :103C3000A21C00E010E02091080230910902121647 :103C4000130608F03ACFE0910601F0910701809148 :103C50000C0280FF1FC0F999FECFF2BDE1BDF89ABA :103C600080B50E94A21CE0910601F09107013196F7 :103C7000F0930701E09306012091080230910902B8 :103C80000F5F1F4F0217130708F017CF80910C0228 :103C900080FDE1CF869580FFB4C03196F093070197 :103CA000E0930601EDCF0E94761C803209F0D5CE5C :103CB00084E10E94A21C8EE10E94A21C84E90E9461 :103CC000A21C86E0F8CE0E94761C0E94761CC82FAB :103CD0000E94761CCC2309F47CC0C13009F47DC05D :103CE00086E00E94C31C8FCE80910C02816080937D :103CF0000C0236CF80910C02816091CF8091070138 :103D000087FD6FC010920B02809106019091070110 :103D1000880F991F909307018093060180910802F4 :103D200080FF09C08091080290910902019690934A :103D3000090280930802F894F999FECF1127E091C7 :103D40000601F0910701C8E0D1E08091080290914E :103D50000902103091F40091570001700130D9F33D :103D600003E000935700E89500915700017001307F :103D7000D9F301E100935700E8950990199000915B :103D8000570001700130D9F301E000935700E89526 :103D90001395103498F011270091570001700130ED :103DA000D9F305E000935700E895009157000170A2 :103DB0000130D9F301E100935700E895329602975C :103DC00009F0C7CF103011F00296E5CF112484E13D :103DD00072CE8EE10E94C31C16CE84E90E94C31CE1 :103DE00012CE81E080930B028FCF82E00E94C31C31 :103DF0000ACE81E00E94C31C06CE80E10E94C31C53 :103E000002CE84910E94A21C2091080230910902E6 :103E1000E0910601F091070140CFCF930E94761CFC :103E2000C82F0E94A21CC13614F0C75503C0C0336E :103E30000CF0C0538C2F992787FD9095CF91089552 :103E40000F931F930E940D1F082F112707FD109538 :103E500002951295107F1027007F10270E940D1FDA :103E6000800F992787FD90951F910F910895CF930B :103E7000C82F85958595859585958A3034F0895A22 :103E8000CF70CA3034F0C95A05C0805DCF70CA30D7 :103E9000D4F7C05D0E94A21C8C2F0E94A21CCF915F :043EA0000895FFCFB3 :023EA40080009C :0400000300003800C1 :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_pro_8MHz.hex ================================================ :103800000C94341C0C94511C0C94511C0C94511CA1 :103810000C94511C0C94511C0C94511C0C94511C74 :103820000C94511C0C94511C0C94511C0C94511C64 :103830000C94511C0C94511C0C94511C0C94511C54 :103840000C94511C0C94511C0C94511C0C94511C44 :103850000C94511C0C94511C0C94511C0C94511C34 :103860000C94511C0C94511C11241FBECFEFD4E0BA :10387000DEBFCDBF11E0A0E0B1E0EEEAFFE302C0A1 :1038800005900D92A230B107D9F712E0A2E0B1E0A5 :1038900001C01D92AD30B107E1F70E94331D0C94B9 :1038A000D51F0C94001C982F9595959595959595F9 :1038B000905D8F708A307CF0282F295A8091C0004B :1038C00085FFFCCF9093C6008091C00085FFFCCFA0 :1038D0002093C6000895282F205DF0CF982F809167 :1038E000C00085FFFCCF9093C6000895EF92FF9231 :1038F0000F931F93EE24FF2487018091C00087FD62 :1039000017C00894E11CF11C011D111D81E2E8168D :1039100081EAF80687E0080780E0180770F3E09175 :103920000401F091050109958091C00087FFE9CF5E :103930008091C6001F910F91FF90EF9008950E9413 :10394000761C982F8091C00085FFFCCF9093C60015 :1039500091362CF490330CF09053892F089597559D :10396000892F08951F930E949F1C182F0E949F1C4F :103970001295107F810F1F9108951F93182F882390 :1039800021F00E94761C1150E1F71F9108951F93BA :10399000182F0E94761C803249F0809103018F5FBE :1039A000809303018530C1F01F9108958091C0007C :1039B00085FFFCCF84E18093C6008091C00085FF25 :1039C000FCCF1093C6008091C00085FFFCCF80E142 :1039D0008093C6001F910895E0910401F0910501C4 :1039E00009951F9108950E94761C803241F08091C4 :1039F00003018F5F80930301853081F008958091EA :103A0000C00085FFFCCF84E18093C6008091C00098 :103A100085FFFCCF80E18093C6000895E09104010A :103A2000F09105010995089510920A028823D1F0BA :103A300090E048EC50E02D9A28EE33E0FA013197FF :103A4000F1F721503040D1F72D9828EE33E0FA01FC :103A50003197F1F721503040D1F79F5F981758F315 :103A600080930A0208953F924F925F926F927F92E5 :103A70008F929F92AF92BF92CF92DF92EF92FF927E :103A80000F931F93CF93DF9394B714BE8091600080 :103A90008861809360001092600091FF0CC289E100 :103AA0008093C4001092C50088E18093C10086E035 :103AB0008093C2005098589A259A81E00E94141D64 :103AC00044E1F42E3EE1E32E24E9D22E96E0C92E05 :103AD00080E1B82EAA24A39401E4902E16E5812E4D :103AE000B2E57B2EA0E26A2EF9E45F2EE3E54E2ECE :103AF00070E5372E0E94761C8033B9F18133C1F115 :103B0000803409F470C0813409F477C0823409F438 :103B100086C0853409F489C0803539F1823529F1B0 :103B2000813509F4AFC1853509F485C0863509F4BE :103B30008DC0843609F435C1843709F4C1C0853796 :103B400009F490C0863709F466C0809103018F5F45 :103B500080930301853071F6E0910401F091050135 :103B600009950E94761C803349F60E94F31CC2CF4F :103B70000E94761C803249F78091C00085FFFCCFFF :103B8000F092C6008091C00085FFFCCF9092C600E5 :103B90008091C00085FFFCCF8092C6008091C0005C :103BA00085FFFCCF7092C6008091C00085FFFCCFDE :103BB0006092C6008091C00085FFFCCF5092C60085 :103BC0008091C00085FFFCCF4092C6008091C0006C :103BD00085FFFCCF3092C6008091C00085FFFCCFEE :103BE000B092C60087CF0E94761C863808F4BDCFFD :103BF0000E94761C0E94F31C7DCF0E94761C8038A8 :103C000009F45AC0813809F453C0823809F440C11C :103C1000883909F449C080E00E94C71C6BCF84E159 :103C20000E94BD1C0E94F31C65CF85E00E94BD1C54 :103C30000E94F31C5FCF0E94761C809306010E94B5 :103C4000761C809307010E94F31C54CF0E94761CBF :103C5000803309F421C183E00E94BD1C80E00E94F2 :103C6000C71C48CF0E94761C803209F06ECF80912D :103C7000C00085FFFCCFF092C6008091C00085FF98 :103C8000FCCFE092C6008091C00085FFFCCFD092AF :103C9000C6008091C00085FFFCCFC092C600809115 :103CA000C00085FFFCCF9CCF83E00E94C71C22CFC1 :103CB00081E00E94C71C1ECF82E00E94C71C1ACF61 :103CC0000E94761C809309020E94761C8093080251 :103CD0008091060190910701880F991F9093070129 :103CE000809306010E94761C853409F4C5C080913A :103CF0000C028E7F80930C020E94761C803209F0A9 :103D0000F9CE8091C00085FFFCCFF092C600609193 :103D10000802709109026115710591F140E050E0CF :103D200080910C02A82FA170B82FB27010C0BB23D5 :103D300061F1E0910601F09107013196F0930701DE :103D4000E09306014F5F5F4F46175707C8F4AA2359 :103D500071F3F999FECF209106013091070132BD30 :103D600021BDF89A90B58091C00085FFFCCF90935B :103D7000C6002F5F3F4F3093070120930601E2CF2B :103D80008091C00085FFFCCF2BCFE0910601F09120 :103D9000070194918091C00085FFFCCF9093C600ED :103DA000CCCF0E94761C809309020E94761C8093DF :103DB000080280910C028E7F80930C020E94761C78 :103DC000853429F480910C02816080930C028091EB :103DD000080290910902892B89F000E010E00E940E :103DE000761CF801E85FFE4F80830F5F1F4F8091C4 :103DF0000802909109020817190788F30E94761C9F :103E0000803209F0A2CE80910C0280FF62C0409106 :103E1000060150910701440F551F5093070140932D :103E20000601609108027091090261157105C9F0DF :103E3000E8E0F1E09A01DB01AE0FBF1FF999FECF78 :103E400032BD21BD819180BDFA9AF99A2F5F3F4F13 :103E5000EA17FB0799F7460F571F50930701409346 :103E600006018091C00085FFFCCFF092C6008091D2 :103E7000C00085FFFCCFB4CE80910C02816080939E :103E80000C023ACF0E94F31C88E080936000FFCFC1 :103E900080E10E94C71C2ECE0E94761C0E94761CD8 :103EA000182F0E94761C112381F0113051F086E00A :103EB0000E94C71C1FCEE0910401F09105010995F5 :103EC000EECD84E90E94C71C15CE8EE10E94C71C6E :103ED00011CE809107018823880F880B8A21809357 :103EE0000B028091060190910701880F991F909312 :103EF0000701809306018091080280FF09C080912C :103F00000802909109020196909309028093080299 :103F1000F894F999FECF1127E0910601F09107017D :103F2000C8E0D1E08091080290910902103091F42C :103F30000091570001700130D9F303E0009357005E :103F4000E8950091570001700130D9F301E1009329 :103F50005700E895099019900091570001700130C1 :103F6000D9F301E000935700E8951395103498F0C9 :103F700011270091570001700130D9F305E000933B :103F80005700E8950091570001700130D9F301E125 :103F900000935700E8953296029709F0C7CF10308A :0E3FA00011F00296E5CF11245CCFF894FFCF0C :023FAE00800091 :0400000300003800C1 :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/atmega/Makefile ================================================ # Makefile for ATmegaBOOT # E.Lins, 18.7.2005 # # Instructions # # To make bootloader .hex file: # make diecimila # make lilypad # make ng # etc... # # To burn bootloader .hex file: # make diecimila_isp # make lilypad_isp # make ng_isp # etc... # program name should not be changed... PROGRAM = ATmegaBOOT_168 # enter the parameters for the avrdude isp tool ISPTOOL = stk500v2 ISPPORT = usb ISPSPEED = -b 115200 MCU_TARGET = atmega168 LDSECTION = --section-start=.text=0x3800 # the efuse should really be 0xf8; since, however, only the lower # three bits of that byte are used on the atmega168, avrdude gets # confused if you specify 1's for the higher bits, see: # http://tinker.it/now/2007/02/24/the-tale-of-avrdude-atmega168-and-extended-bits-fuses/ # # similarly, the lock bits should be 0xff instead of 0x3f (to # unlock the bootloader section) and 0xcf instead of 0x0f (to # lock it), but since the high two bits of the lock byte are # unused, avrdude would get confused. ISPFUSES = avrdude -c $(ISPTOOL) -p $(MCU_TARGET) -P $(ISPPORT) $(ISPSPEED) \ -e -u -U lock:w:0x3f:m -U efuse:w:0x$(EFUSE):m -U hfuse:w:0x$(HFUSE):m -U lfuse:w:0x$(LFUSE):m ISPFLASH = avrdude -c $(ISPTOOL) -p $(MCU_TARGET) -P $(ISPPORT) $(ISPSPEED) \ -U flash:w:$(PROGRAM)_$(TARGET).hex -U lock:w:0x0f:m STK500 = "C:\Program Files\Atmel\AVR Tools\STK500\Stk500.exe" STK500-1 = $(STK500) -e -d$(MCU_TARGET) -pf -vf -if$(PROGRAM)_$(TARGET).hex \ -lFF -LFF -f$(HFUSE)$(LFUSE) -EF8 -ms -q -cUSB -I200kHz -s -wt STK500-2 = $(STK500) -d$(MCU_TARGET) -ms -q -lCF -LCF -cUSB -I200kHz -s -wt OBJ = $(PROGRAM).o OPTIMIZE = -Os DEFS = LIBS = CC = avr-gcc # Override is only needed by avr-lib build system. override CFLAGS = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) -DF_CPU=$(AVR_FREQ) $(DEFS) override LDFLAGS = -Wl,$(LDSECTION) #override LDFLAGS = -Wl,-Map,$(PROGRAM).map,$(LDSECTION) OBJCOPY = avr-objcopy OBJDUMP = avr-objdump all: lilypad: TARGET = lilypad lilypad: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>1' '-DNUM_LED_FLASHES=3' lilypad: AVR_FREQ = 8000000L lilypad: $(PROGRAM)_lilypad.hex lilypad_isp: lilypad lilypad_isp: TARGET = lilypad lilypad_isp: HFUSE = DD lilypad_isp: LFUSE = E2 lilypad_isp: EFUSE = 00 lilypad_isp: isp lilypad_resonator: TARGET = lilypad_resonator lilypad_resonator: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=3' lilypad_resonator: AVR_FREQ = 8000000L lilypad_resonator: $(PROGRAM)_lilypad_resonator.hex lilypad_resonator_isp: lilypad_resonator lilypad_resonator_isp: TARGET = lilypad_resonator lilypad_resonator_isp: HFUSE = DD lilypad_resonator_isp: LFUSE = C6 lilypad_resonator_isp: EFUSE = 00 lilypad_resonator_isp: isp pro8: TARGET = pro_8MHz pro8: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' '-DWATCHDOG_MODS' pro8: AVR_FREQ = 8000000L pro8: $(PROGRAM)_pro_8MHz.hex pro8_isp: pro8 pro8_isp: TARGET = pro_8MHz pro8_isp: HFUSE = DD pro8_isp: LFUSE = C6 pro8_isp: EFUSE = 00 pro8_isp: isp pro16: TARGET = pro_16MHz pro16: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' '-DWATCHDOG_MODS' pro16: AVR_FREQ = 16000000L pro16: $(PROGRAM)_pro_16MHz.hex pro16_isp: pro16 pro16_isp: TARGET = pro_16MHz pro16_isp: HFUSE = DD pro16_isp: LFUSE = C6 pro16_isp: EFUSE = 00 pro16_isp: isp pro20: TARGET = pro_20mhz pro20: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' '-DWATCHDOG_MODS' pro20: AVR_FREQ = 20000000L pro20: $(PROGRAM)_pro_20mhz.hex pro20_isp: pro20 pro20_isp: TARGET = pro_20mhz pro20_isp: HFUSE = DD pro20_isp: LFUSE = C6 pro20_isp: EFUSE = 00 pro20_isp: isp diecimila: TARGET = diecimila diecimila: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' diecimila: AVR_FREQ = 16000000L diecimila: $(PROGRAM)_diecimila.hex diecimila_isp: diecimila diecimila_isp: TARGET = diecimila diecimila_isp: HFUSE = DD diecimila_isp: LFUSE = FF diecimila_isp: EFUSE = 00 diecimila_isp: isp ng: TARGET = ng ng: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>1' '-DNUM_LED_FLASHES=3' ng: AVR_FREQ = 16000000L ng: $(PROGRAM)_ng.hex ng_isp: ng ng_isp: TARGET = ng ng_isp: HFUSE = DD ng_isp: LFUSE = FF ng_isp: EFUSE = 00 ng_isp: isp atmega328: TARGET = atmega328 atmega328: MCU_TARGET = atmega328p atmega328: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' -DBAUD_RATE=57600 atmega328: AVR_FREQ = 16000000L atmega328: LDSECTION = --section-start=.text=0x7800 atmega328: $(PROGRAM)_atmega328.hex atmega328_isp: atmega328 atmega328_isp: TARGET = atmega328 atmega328_isp: MCU_TARGET = atmega328p atmega328_isp: HFUSE = DA atmega328_isp: LFUSE = FF atmega328_isp: EFUSE = 05 atmega328_isp: isp atmega328_notp: TARGET = atmega328_notp atmega328_notp: MCU_TARGET = atmega328 atmega328_notp: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' -DBAUD_RATE=57600 atmega328_notp: AVR_FREQ = 16000000L atmega328_notp: LDSECTION = --section-start=.text=0x7800 atmega328_notp: $(PROGRAM)_atmega328_notp.hex atmega328_notp_isp: atmega328_notp atmega328_notp_isp: TARGET = atmega328 atmega328_notp_isp: MCU_TARGET = atmega328 atmega328_notp_isp: HFUSE = DA atmega328_notp_isp: LFUSE = FF atmega328_notp_isp: EFUSE = 05 atmega328_notp_isp: isp atmega328_pro8: TARGET = atmega328_pro_8MHz atmega328_pro8: MCU_TARGET = atmega328p atmega328_pro8: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' -DBAUD_RATE=57600 -DDOUBLE_SPEED atmega328_pro8: AVR_FREQ = 8000000L atmega328_pro8: LDSECTION = --section-start=.text=0x7800 atmega328_pro8: $(PROGRAM)_atmega328_pro_8MHz.hex atmega328_pro8_isp: atmega328_pro8 atmega328_pro8_isp: TARGET = atmega328_pro_8MHz atmega328_pro8_isp: MCU_TARGET = atmega328p atmega328_pro8_isp: HFUSE = DA atmega328_pro8_isp: LFUSE = FF atmega328_pro8_isp: EFUSE = 05 atmega328_pro8_isp: isp mega: TARGET = atmega1280 mega: MCU_TARGET = atmega1280 mega: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=0' -DBAUD_RATE=57600 mega: AVR_FREQ = 16000000L mega: LDSECTION = --section-start=.text=0x1F000 mega: $(PROGRAM)_atmega1280.hex mega_isp: mega mega_isp: TARGET = atmega1280 mega_isp: MCU_TARGET = atmega1280 mega_isp: HFUSE = DA mega_isp: LFUSE = FF mega_isp: EFUSE = F5 mega_isp: isp isp: $(TARGET) $(ISPFUSES) $(ISPFLASH) isp-stk500: $(PROGRAM)_$(TARGET).hex $(STK500-1) $(STK500-2) %.elf: $(OBJ) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS) clean: rm -rf *.o *.elf *.lst *.map *.sym *.lss *.eep *.srec *.bin *.hex %.lst: %.elf $(OBJDUMP) -h -S $< > $@ %.hex: %.elf $(OBJCOPY) -j .text -j .data -O ihex $< $@ %.srec: %.elf $(OBJCOPY) -j .text -j .data -O srec $< $@ %.bin: %.elf $(OBJCOPY) -j .text -j .data -O binary $< $@ ================================================ FILE: external/arduino/avr/bootloaders/atmega8/ATmegaBOOT-prod-firmware-2009-11-07.hex ================================================ :101C000012C02BC02AC029C028C027C026C025C0AA :101C100024C023C022C021C020C01FC01EC01DC0C0 :101C20001CC01BC01AC011241FBECFE5D4E0DEBF0C :101C3000CDBF10E0A0E6B0E0E8EEFFE102C0059005 :101C40000D92A236B107D9F711E0A2E6B0E001C0CB :101C50001D92AA36B107E1F74FC0D2CFEF92FF92A3 :101C60000F931F93EE24FF24870113C00894E11CF7 :101C7000F11C011D111D81E0E81682E1F8068AE7DA :101C8000080780E0180728F0E0916200F0916300F7 :101C900009955F9BEBCF8CB1992787FD90951F919C :101CA0000F91FF90EF9008955D9BFECF8CB9089542 :101CB000D5DF803221F484E1F7DF80E1F5DF08959C :101CC0001F93182FCBDF803231F484E1EDDF812FB9 :101CD000EBDF80E1E9DF1F9108951F93CF93DF933E :101CE000182FC0E0D0E002C0B9DF2196C117E0F3A1 :101CF000DF91CF911F910895CFE5D4E0DEBFCDBF36 :101D0000000010BC83E389B988E18AB986E880BD08 :101D1000BD9A1092680130E2E0E0F0E02FE088B375 :101D2000832788BBCF010197F1F7215027FFF7CF19 :101D300020E12093680192DF803381F1813399F4AF :101D40008DDF8032C1F784E1AFDF81E4ADDF86E56E :101D5000ABDF82E5A9DF80E2A7DF89E4A5DF83E5C9 :101D6000A3DF80E5C7C0803429F478DF8638B0F07F :101D700075DF14C0813471F471DF803811F482E0B2 :101D80001DC1813811F481E019C1823809F015C1F3 :101D900082E114C1823421F484E19FDF89DFCBCF5B :101DA000853411F485E0F9CF8035C1F38135B1F385 :101DB0008235A1F3853539F451DF809364004EDF1D :101DC00080936500EBCF863519F484E086DFF5C09B :101DD000843609F093C042DF809367013FDF809330 :101DE0006601809169018E7F8093690137DF8534B8 :101DF00029F480916901816080936901C0E0D0E09D :101E000006E610E005C02ADFF80181938F012196D4 :101E10008091660190916701C817D907A0F31EDF72 :101E2000803209F088CF8091690180FF1FC020E0D7 :101E300030E0E6E6F0E012C0A0916400B0916500E9 :101E40008191082EC5D08091640090916500019623 :101E500090936500809364002F5F3F4F80916601EF :101E6000909167012817390738F343C0F894E19936 :101E7000FECF1127E0916400F0916500EE0FFF1F87 :101E8000C6E6D0E0809166019091670180FF01C0B5 :101E90000196103051F422D003E000935700E895EA :101EA0001DD001E100935700E8950990199016D0D4 :101EB00001E000935700E8951395103258F0112770 :101EC0000DD005E000935700E89508D001E100939C :101ED0005700E8953296029739F0DBCF0091570012 :101EE00001700130D9F30895103011F00296E7CF58 :101EF000112484E1D9DE80E1D7DE1DCF843709F0DB :101F00004BC0ACDE80936701A9DE80936601A6DE3C :101F100090916901853421F49160909369010DC01D :101F20009E7F909369018091640090916500880F75 :101F3000991F909365008093640090DE803209F0D1 :101F4000FACE84E1B1DEC0E0D0E01EC0809169012C :101F500080FF07C0A0916400B091650031D0802D52 :101F600008C081FD07C0E0916400F0916500E49134 :101F70008E2F9ADE80916400909165000196909377 :101F800065008093640021968091660190916701BD :101F9000C817D907D8F2AFCF853761F45FDE80323A :101FA00009F0C9CE84E180DE8EE17EDE83E97CDE4D :101FB00087E0A0CF863709F0BECE80E081DEBBCEC1 :101FC000E199FECFBFBBAEBBE09A11960DB208956A :101FD000E199FECFBFBBAEBB0DBA11960FB6F89418 :081FE000E29AE19A0FBE089598 :021FE800800077 :0400000300001C00DD :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/atmega8/ATmegaBOOT.c ================================================ /**********************************************************/ /* Serial Bootloader for Atmel mega8 AVR Controller */ /* */ /* ATmegaBOOT.c */ /* */ /* Copyright (c) 2003, Jason P. Kyle */ /* */ /* Hacked by DojoCorp - ZGZ - MMX - IVR */ /* Hacked by David A. Mellis */ /* */ /* This program is free software; you can redistribute it */ /* and/or modify it under the terms of the GNU General */ /* Public License as published by the Free Software */ /* Foundation; either version 2 of the License, or */ /* (at your option) any later version. */ /* */ /* This program is distributed in the hope that it will */ /* be useful, but WITHOUT ANY WARRANTY; without even the */ /* implied warranty of MERCHANTABILITY or FITNESS FOR A */ /* PARTICULAR PURPOSE. See the GNU General Public */ /* License for more details. */ /* */ /* You should have received a copy of the GNU General */ /* Public License along with this program; if not, write */ /* to the Free Software Foundation, Inc., */ /* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* */ /* Licence can be viewed at */ /* http://www.fsf.org/licenses/gpl.txt */ /* */ /* Target = Atmel AVR m8 */ /**********************************************************/ #include #include #include #include #include #include //#define F_CPU 16000000 /* We, Malmoitians, like slow interaction * therefore the slow baud rate ;-) */ //#define BAUD_RATE 9600 /* 6.000.000 is more or less 8 seconds at the * speed configured here */ //#define MAX_TIME_COUNT 6000000 #define MAX_TIME_COUNT (F_CPU>>1) ///#define MAX_TIME_COUNT_MORATORY 1600000 /* SW_MAJOR and MINOR needs to be updated from time to time to avoid warning message from AVR Studio */ #define HW_VER 0x02 #define SW_MAJOR 0x01 #define SW_MINOR 0x12 // AVR-GCC compiler compatibility // avr-gcc compiler v3.1.x and older doesn't support outb() and inb() // if necessary, convert outb and inb to outp and inp #ifndef outb #define outb(sfr,val) (_SFR_BYTE(sfr) = (val)) #endif #ifndef inb #define inb(sfr) _SFR_BYTE(sfr) #endif /* defines for future compatibility */ #ifndef cbi #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) #endif #ifndef sbi #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) #endif /* Adjust to suit whatever pin your hardware uses to enter the bootloader */ #define eeprom_rb(addr) eeprom_read_byte ((uint8_t *)(addr)) #define eeprom_rw(addr) eeprom_read_word ((uint16_t *)(addr)) #define eeprom_wb(addr, val) eeprom_write_byte ((uint8_t *)(addr), (uint8_t)(val)) /* Onboard LED is connected to pin PB5 */ #define LED_DDR DDRB #define LED_PORT PORTB #define LED_PIN PINB #define LED PINB5 #define SIG1 0x1E // Yep, Atmel is the only manufacturer of AVR micros. Single source :( #define SIG2 0x93 #define SIG3 0x07 #define PAGE_SIZE 0x20U //32 words void putch(char); char getch(void); void getNch(uint8_t); void byte_response(uint8_t); void nothing_response(void); union address_union { uint16_t word; uint8_t byte[2]; } address; union length_union { uint16_t word; uint8_t byte[2]; } length; struct flags_struct { unsigned eeprom : 1; unsigned rampz : 1; } flags; uint8_t buff[256]; //uint8_t address_high; uint8_t pagesz=0x80; uint8_t i; //uint8_t bootuart0=0,bootuart1=0; void (*app_start)(void) = 0x0000; int main(void) { uint8_t ch,ch2; uint16_t w; //cbi(BL_DDR,BL); //sbi(BL_PORT,BL); asm volatile("nop\n\t"); /* check if flash is programmed already, if not start bootloader anyway */ //if(pgm_read_byte_near(0x0000) != 0xFF) { /* check if bootloader pin is set low */ //if(bit_is_set(BL_PIN,BL)) app_start(); //} /* initialize UART(s) depending on CPU defined */ /* m8 */ UBRRH = (((F_CPU/BAUD_RATE)/16)-1)>>8; // set baud rate UBRRL = (((F_CPU/BAUD_RATE)/16)-1); UCSRB = (1<> 8; //UCSRA = 0x00; //UCSRC = 0x86; //UCSRB = _BV(TXEN)|_BV(RXEN); /* this was giving uisp problems, so I removed it; without it, the boot works on with uisp and avrdude on the mac (at least). */ //putch('\0'); //uint32_t l; //uint32_t time_count; //time_count=0; /* set LED pin as output */ sbi(LED_DDR,LED); for (i = 0; i < 16; i++) { outb(LED_PORT, inb(LED_PORT) ^ _BV(LED)); _delay_loop_2(0); } //for (l=0; l<40000000; l++) //outb(LED_PORT, inb(LED_PORT) ^= _BV(LED)); /* flash onboard LED three times to signal entering of bootloader */ //for(i=0; i<3; ++i) { //for(l=0; l<40000000; ++l); //sbi(LED_PORT,LED); //for(l=0; l<40000000; ++l); //cbi(LED_PORT,LED); //} /* see comment at previous call to putch() */ //putch('\0'); // this line is needed for the synchronization of the programmer /* forever */ for (;;) { //if((inb(UCSRA) & _BV(RXC))){ /* get character from UART */ ch = getch(); /* A bunch of if...else if... gives smaller code than switch...case ! */ /* Hello is anyone home ? */ if(ch=='0') { nothing_response(); } /* Request programmer ID */ /* Not using PROGMEM string due to boot block in m128 being beyond 64kB boundry */ /* Would need to selectively manipulate RAMPZ, and it's only 9 characters anyway so who cares. */ else if(ch=='1') { if (getch() == ' ') { putch(0x14); putch('A'); putch('V'); putch('R'); putch(' '); putch('I'); putch('S'); putch('P'); putch(0x10); } } /* AVR ISP/STK500 board commands DON'T CARE so default nothing_response */ else if(ch=='@') { ch2 = getch(); if (ch2>0x85) getch(); nothing_response(); } /* AVR ISP/STK500 board requests */ else if(ch=='A') { ch2 = getch(); if(ch2==0x80) byte_response(HW_VER); // Hardware version else if(ch2==0x81) byte_response(SW_MAJOR); // Software major version else if(ch2==0x82) byte_response(SW_MINOR); // Software minor version //else if(ch2==0x98) byte_response(0x03); // Unknown but seems to be required by avr studio 3.56 else byte_response(0x00); // Covers various unnecessary responses we don't care about } /* Device Parameters DON'T CARE, DEVICE IS FIXED */ else if(ch=='B') { getNch(20); nothing_response(); } /* Parallel programming stuff DON'T CARE */ else if(ch=='E') { getNch(5); nothing_response(); } /* Enter programming mode */ else if(ch=='P') { nothing_response(); // FIXME: modified only here by DojoCorp, Mumbai, India, 20050626 //time_count=0; // exted the delay once entered prog.mode } /* Leave programming mode */ else if(ch=='Q') { nothing_response(); //time_count=MAX_TIME_COUNT_MORATORY; // once the programming is done, // we should start the application // but uisp has problems with this, // therefore we just change the times // and give the programmer 1 sec to react } /* Erase device, don't care as we will erase one page at a time anyway. */ else if(ch=='R') { nothing_response(); } /* Set address, little endian. EEPROM in bytes, FLASH in words */ /* Perhaps extra address bytes may be added in future to support > 128kB FLASH. */ /* This might explain why little endian was used here, big endian used everywhere else. */ else if(ch=='U') { address.byte[0] = getch(); address.byte[1] = getch(); nothing_response(); } /* Universal SPI programming command, disabled. Would be used for fuses and lock bits. */ else if(ch=='V') { getNch(4); byte_response(0x00); } /* Write memory, length is big endian and is in bytes */ else if(ch=='d') { length.byte[1] = getch(); length.byte[0] = getch(); flags.eeprom = 0; if (getch() == 'E') flags.eeprom = 1; for (w=0;w127) address_high = 0x01; //Only possible with m128, m256 will need 3rd address byte. FIXME //else address_high = 0x00; //address.word = address.word << 1; //address * 2 -> byte location //if ((length.byte[0] & 0x01)) length.word++; //Even up an odd number of bytes cli(); //Disable interrupts, just to be sure while(bit_is_set(EECR,EEWE)); //Wait for previous EEPROM writes to complete asm volatile( "clr r17 \n\t" //page_word_count "lds r30,address \n\t" //Address of FLASH location (in words) "lds r31,address+1 \n\t" "lsl r30 \n\t" //address * 2 -> byte location "rol r31 \n\t" "ldi r28,lo8(buff) \n\t" //Start of buffer array in RAM "ldi r29,hi8(buff) \n\t" "lds r24,length \n\t" //Length of data to be written (in bytes) "lds r25,length+1 \n\t" "sbrs r24,0 \n\t" //Even up an odd number of bytes "rjmp length_loop \n\t" "adiw r24,1 \n\t" "length_loop: \n\t" //Main loop, repeat for number of words in block "cpi r17,0x00 \n\t" //If page_word_count=0 then erase page "brne no_page_erase \n\t" "rcall wait_spm \n\t" // "wait_spm1: \n\t" // "lds r16,%0 \n\t" //Wait for previous spm to complete // "andi r16,1 \n\t" // "cpi r16,1 \n\t" // "breq wait_spm1 \n\t" "ldi r16,0x03 \n\t" //Erase page pointed to by Z "sts %0,r16 \n\t" "spm \n\t" "rcall wait_spm \n\t" // "wait_spm2: \n\t" // "lds r16,%0 \n\t" //Wait for previous spm to complete // "andi r16,1 \n\t" // "cpi r16,1 \n\t" // "breq wait_spm2 \n\t" "ldi r16,0x11 \n\t" //Re-enable RWW section "sts %0,r16 \n\t" "spm \n\t" "no_page_erase: \n\t" "ld r0,Y+ \n\t" //Write 2 bytes into page buffer "ld r1,Y+ \n\t" "rcall wait_spm \n\t" // "wait_spm3: \n\t" // "lds r16,%0 \n\t" //Wait for previous spm to complete // "andi r16,1 \n\t" // "cpi r16,1 \n\t" // "breq wait_spm3 \n\t" "ldi r16,0x01 \n\t" //Load r0,r1 into FLASH page buffer "sts %0,r16 \n\t" "spm \n\t" "inc r17 \n\t" //page_word_count++ "cpi r17,%1 \n\t" "brlo same_page \n\t" //Still same page in FLASH "write_page: \n\t" "clr r17 \n\t" //New page, write current one first "rcall wait_spm \n\t" // "wait_spm4: \n\t" // "lds r16,%0 \n\t" //Wait for previous spm to complete // "andi r16,1 \n\t" // "cpi r16,1 \n\t" // "breq wait_spm4 \n\t" "ldi r16,0x05 \n\t" //Write page pointed to by Z "sts %0,r16 \n\t" "spm \n\t" "rcall wait_spm \n\t" // "wait_spm5: \n\t" // "lds r16,%0 \n\t" //Wait for previous spm to complete // "andi r16,1 \n\t" // "cpi r16,1 \n\t" // "breq wait_spm5 \n\t" "ldi r16,0x11 \n\t" //Re-enable RWW section "sts %0,r16 \n\t" "spm \n\t" "same_page: \n\t" "adiw r30,2 \n\t" //Next word in FLASH "sbiw r24,2 \n\t" //length-2 "breq final_write \n\t" //Finished "rjmp length_loop \n\t" "wait_spm: \n\t" "lds r16,%0 \n\t" //Wait for previous spm to complete "andi r16,1 \n\t" "cpi r16,1 \n\t" "breq wait_spm \n\t" "ret \n\t" "final_write: \n\t" "cpi r17,0 \n\t" "breq block_done \n\t" "adiw r24,2 \n\t" //length+2, fool above check on length after short page write "rjmp write_page \n\t" "block_done: \n\t" "clr __zero_reg__ \n\t" //restore zero register : "=m" (SPMCR) : "M" (PAGE_SIZE) : "r0","r16","r17","r24","r25","r28","r29","r30","r31"); /* Should really add a wait for RWW section to be enabled, don't actually need it since we never */ /* exit the bootloader without a power cycle anyhow */ } putch(0x14); putch(0x10); } } /* Read memory block mode, length is big endian. */ else if(ch=='t') { length.byte[1] = getch(); length.byte[0] = getch(); if (getch() == 'E') flags.eeprom = 1; else { flags.eeprom = 0; address.word = address.word << 1; // address * 2 -> byte location } if (getch() == ' ') { // Command terminator putch(0x14); for (w=0;w < length.word;w++) { // Can handle odd and even lengths okay if (flags.eeprom) { // Byte access EEPROM read putch(eeprom_rb(address.word)); address.word++; } else { if (!flags.rampz) putch(pgm_read_byte_near(address.word)); address.word++; } } putch(0x10); } } /* Get device signature bytes */ else if(ch=='u') { if (getch() == ' ') { putch(0x14); putch(SIG1); putch(SIG2); putch(SIG3); putch(0x10); } } /* Read oscillator calibration byte */ else if(ch=='v') { byte_response(0x00); } // } else { // time_count++; // if (time_count>=MAX_TIME_COUNT) { // app_start(); // } // } } /* end of forever loop */ } void putch(char ch) { /* m8 */ while (!(inb(UCSRA) & _BV(UDRE))); outb(UDR,ch); } char getch(void) { /* m8 */ uint32_t count = 0; while(!(inb(UCSRA) & _BV(RXC))) { /* HACKME:: here is a good place to count times*/ count++; if (count > MAX_TIME_COUNT) app_start(); } return (inb(UDR)); } void getNch(uint8_t count) { uint8_t i; for(i=0;i $@ size: $(PROGRAM).hex $(SIZE) $^ # Rules for building the .text rom images text: hex bin srec hex: $(PROGRAM).hex bin: $(PROGRAM).bin srec: $(PROGRAM).srec %.hex: %.elf $(OBJCOPY) -j .text -j .data -O ihex $< $@ %.srec: %.elf $(OBJCOPY) -j .text -j .data -O srec $< $@ %.bin: %.elf $(OBJCOPY) -j .text -j .data -O binary $< $@ ================================================ FILE: external/arduino/avr/bootloaders/bt/ATmegaBOOT_168.c ================================================ /**********************************************************/ /* Serial Bootloader for Atmel megaAVR Controllers */ /* */ /* tested with ATmega8, ATmega128 and ATmega168 */ /* should work with other mega's, see code for details */ /* */ /* ATmegaBOOT.c */ /* */ /* build: 050815 */ /* date : 15.08.2005 */ /* */ /* 20060802: hacked for Arduino by D. Cuartielles */ /* based on a previous hack by D. Mellis */ /* and D. Cuartielles */ /* */ /* Monitor and debug functions were added to the original */ /* code by Dr. Erik Lins, chip45.com. (See below) */ /* */ /* Thanks to Karl Pitrich for fixing a bootloader pin */ /* problem and more informative LED blinking! */ /* */ /* For the latest version see: */ /* http://www.chip45.com/ */ /* */ /* ------------------------------------------------------ */ /* */ /* based on stk500boot.c */ /* Copyright (c) 2003, Jason P. Kyle */ /* All rights reserved. */ /* see avr1.org for original file and information */ /* */ /* This program is free software; you can redistribute it */ /* and/or modify it under the terms of the GNU General */ /* Public License as published by the Free Software */ /* Foundation; either version 2 of the License, or */ /* (at your option) any later version. */ /* */ /* This program is distributed in the hope that it will */ /* be useful, but WITHOUT ANY WARRANTY; without even the */ /* implied warranty of MERCHANTABILITY or FITNESS FOR A */ /* PARTICULAR PURPOSE. See the GNU General Public */ /* License for more details. */ /* */ /* You should have received a copy of the GNU General */ /* Public License along with this program; if not, write */ /* to the Free Software Foundation, Inc., */ /* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* */ /* Licence can be viewed at */ /* http://www.fsf.org/licenses/gpl.txt */ /* */ /* Target = Atmel AVR m128,m64,m32,m16,m8,m162,m163,m169, */ /* m8515,m8535. ATmega161 has a very small boot block so */ /* isn't supported. */ /* */ /* Tested with m128,m8,m163 - feel free to let me know */ /* how/if it works for you. */ /* */ /**********************************************************/ /* some includes */ #include #include #include #include #include #define set_output(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) #define set_input(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) #define high(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) #define low(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) /* the current avr-libc eeprom functions do not support the ATmega168 */ /* own eeprom write/read functions are used instead */ #if !defined(__AVR_ATmega168__) || !defined(__AVR_ATmega328P__) || !defined(__AVR_ATmega328__) #include #endif /* define F_CPU according to AVR_FREQ set in Makefile */ /* Is there a better way to pass such a parameter from Makefile to source code ? */ #define F_CPU 16000000L #include /* 20060803: hacked by DojoCorp */ /* set the waiting time for the bootloader */ #define MAX_TIME_COUNT (F_CPU>>1) /* set the UART baud rate */ /* 20060803: hacked by DojoCorp */ #define BAUD_RATE 115200 /* SW_MAJOR and MINOR needs to be updated from time to time to avoid warning message from AVR Studio */ /* never allow AVR Studio to do an update !!!! */ #define HW_VER 0x02 #define SW_MAJOR 0x01 #define SW_MINOR 0x0f /* Adjust to suit whatever pin your hardware uses to enter the bootloader */ /* ATmega128 has two UARTS so two pins are used to enter bootloader and select UART */ /* BL0... means UART0, BL1... means UART1 */ #ifdef __AVR_ATmega128__ #define BL_DDR DDRF #define BL_PORT PORTF #define BL_PIN PINF #define BL0 PINF7 #define BL1 PINF6 #else /* other ATmegas have only one UART, so only one pin is defined to enter bootloader */ #define BL_DDR DDRD #define BL_PORT PORTD #define BL_PIN PIND #define BL PIND6 #endif /* onboard LED is used to indicate, that the bootloader was entered (3x flashing) */ /* if monitor functions are included, LED goes on after monitor was entered */ #ifdef __AVR_ATmega128__ /* Onboard LED is connected to pin PB7 (e.g. Crumb128, PROBOmega128, Savvy128) */ #define LED_DDR DDRB #define LED_PORT PORTB #define LED_PIN PINB #define LED PINB7 #else /* Onboard LED is connected to pin PB2 (e.g. Crumb8, Crumb168) */ #define LED_DDR DDRB #define LED_PORT PORTB #define LED_PIN PINB /* 20060803: hacked by DojoCorp, LED pin is B5 in Arduino */ /* #define LED PINB2 */ #define LED PINB5 #endif /* monitor functions will only be compiled when using ATmega128, due to bootblock size constraints */ #ifdef __AVR_ATmega128__ #define MONITOR #endif /* define various device id's */ /* manufacturer byte is always the same */ #define SIG1 0x1E // Yep, Atmel is the only manufacturer of AVR micros. Single source :( #if defined __AVR_ATmega128__ #define SIG2 0x97 #define SIG3 0x02 #define PAGE_SIZE 0x80U //128 words #elif defined __AVR_ATmega64__ #define SIG2 0x96 #define SIG3 0x02 #define PAGE_SIZE 0x80U //128 words #elif defined __AVR_ATmega32__ #define SIG2 0x95 #define SIG3 0x02 #define PAGE_SIZE 0x40U //64 words #elif defined __AVR_ATmega16__ #define SIG2 0x94 #define SIG3 0x03 #define PAGE_SIZE 0x40U //64 words #elif defined __AVR_ATmega8__ #define SIG2 0x93 #define SIG3 0x07 #define PAGE_SIZE 0x20U //32 words #elif defined __AVR_ATmega88__ #define SIG2 0x93 #define SIG3 0x0a #define PAGE_SIZE 0x20U //32 words #elif defined __AVR_ATmega168__ #define SIG2 0x94 #define SIG3 0x06 #define PAGE_SIZE 0x40U //64 words #elif defined __AVR_ATmega328P__ #define SIG2 0x95 #define SIG3 0x0F #define PAGE_SIZE 0x40U //64 words #elif defined __AVR_ATmega328__ #define SIG2 0x95 #define SIG3 0x14 #define PAGE_SIZE 0x40U //64 words #elif defined __AVR_ATmega162__ #define SIG2 0x94 #define SIG3 0x04 #define PAGE_SIZE 0x40U //64 words #elif defined __AVR_ATmega163__ #define SIG2 0x94 #define SIG3 0x02 #define PAGE_SIZE 0x40U //64 words #elif defined __AVR_ATmega169__ #define SIG2 0x94 #define SIG3 0x05 #define PAGE_SIZE 0x40U //64 words #elif defined __AVR_ATmega8515__ #define SIG2 0x93 #define SIG3 0x06 #define PAGE_SIZE 0x20U //32 words #elif defined __AVR_ATmega8535__ #define SIG2 0x93 #define SIG3 0x08 #define PAGE_SIZE 0x20U //32 words #endif /* function prototypes */ void putch(char); char getch(void); void getNch(uint8_t); void byte_response(uint8_t); void nothing_response(void); char gethex(void); void puthex(char); void flash_led(uint8_t); /* some variables */ union address_union { uint16_t word; uint8_t byte[2]; } address; union length_union { uint16_t word; uint8_t byte[2]; } length; struct flags_struct { unsigned eeprom : 1; unsigned rampz : 1; } flags; uint8_t buff[256]; uint8_t address_high; uint8_t pagesz=0x80; uint8_t i; uint8_t bootuart = 0; void (*app_start)(void) = 0x0000; /* main program starts here */ int main(void) { uint8_t ch,ch2; uint16_t w; asm volatile("nop\n\t"); /* set pin direction for bootloader pin and enable pullup */ /* for ATmega128, two pins need to be initialized */ #ifdef __AVR_ATmega128__ BL_DDR &= ~_BV(BL0); BL_DDR &= ~_BV(BL1); BL_PORT |= _BV(BL0); BL_PORT |= _BV(BL1); #else BL_DDR &= ~_BV(BL); BL_PORT |= _BV(BL); #endif #ifdef __AVR_ATmega128__ /* check which UART should be used for booting */ if(bit_is_clear(BL_PIN, BL0)) { bootuart = 1; } else if(bit_is_clear(BL_PIN, BL1)) { bootuart = 2; } #endif /* check if flash is programmed already, if not start bootloader anyway */ if(pgm_read_byte_near(0x0000) != 0xFF) { #ifdef __AVR_ATmega128__ /* no UART was selected, start application */ if(!bootuart) { app_start(); } #else /* check if bootloader pin is set low */ /* we don't start this part neither for the m8, nor m168 */ //if(bit_is_set(BL_PIN, BL)) { // app_start(); // } #endif } #ifdef __AVR_ATmega128__ /* no bootuart was selected, default to uart 0 */ if(!bootuart) { bootuart = 1; } #endif /* initialize UART(s) depending on CPU defined */ #ifdef __AVR_ATmega128__ if(bootuart == 1) { UBRR0L = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1); UBRR0H = (F_CPU/(BAUD_RATE*16L)-1) >> 8; UCSR0A = 0x00; UCSR0C = 0x06; UCSR0B = _BV(TXEN0)|_BV(RXEN0); } if(bootuart == 2) { UBRR1L = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1); UBRR1H = (F_CPU/(BAUD_RATE*16L)-1) >> 8; UCSR1A = 0x00; UCSR1C = 0x06; UCSR1B = _BV(TXEN1)|_BV(RXEN1); } #elif defined __AVR_ATmega163__ UBRR = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1); UBRRHI = (F_CPU/(BAUD_RATE*16L)-1) >> 8; UCSRA = 0x00; UCSRB = _BV(TXEN)|_BV(RXEN); #elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) UBRR0H = ((F_CPU / 16 + BAUD_RATE / 2) / BAUD_RATE - 1) >> 8; UBRR0L = ((F_CPU / 16 + BAUD_RATE / 2) / BAUD_RATE - 1); //UBRR0L = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1); //UBRR0H = (F_CPU/(BAUD_RATE*16L)-1) >> 8; UCSR0B = (1<>8; // set baud rate UBRRL = (((F_CPU/BAUD_RATE)/16)-1); UCSRB = (1<> 8; UCSRA = 0x00; UCSRC = 0x06; UCSRB = _BV(TXEN)|_BV(RXEN); #endif /* set LED pin as output */ LED_DDR |= _BV(LED); set_output(DDRD,PIND7); high(PORTD,PD7); for (i = 0; i < 16; i++) { _delay_loop_2(0); } low(PORTD,PD7); /* flash onboard LED to signal entering of bootloader */ #ifdef __AVR_ATmega128__ // 4x for UART0, 5x for UART1 flash_led(3 + bootuart); #else flash_led(3); #endif /* 20050803: by DojoCorp, this is one of the parts provoking the system to stop listening, cancelled from the original */ //putch('\0'); //message("SET BT PAGEMODE 3 2000 1"); putch('S'); putch('E'); putch('T'); putch(' '); putch('B'); putch('T'); putch(' '); putch('P'); putch('A'); putch('G'); putch('E'); putch('M'); putch('O'); putch('D'); putch('E'); putch(' '); putch('3'); putch(' '); putch('2'); putch('0'); putch('0'); putch('0'); putch(' '); putch('1'); putch(0x0D); //put_s("SET BT ROLE 0 f 7d00"); putch('S'); putch('E'); putch('T'); putch(' '); putch('B'); putch('T'); putch(' '); putch('R'); putch('O'); putch('L'); putch('E'); putch(' '); putch('0'); putch(' '); putch('f'); putch(' '); putch('7'); putch('d'); putch('0'); putch('0'); putch(0x0D); /* forever loop */ for (;;) { /* get character from UART */ ch = getch(); /* A bunch of if...else if... gives smaller code than switch...case ! */ /* Hello is anyone home ? */ if(ch=='0') { nothing_response(); } /* Request programmer ID */ /* Not using PROGMEM string due to boot block in m128 being beyond 64kB boundry */ /* Would need to selectively manipulate RAMPZ, and it's only 9 characters anyway so who cares. */ else if(ch=='1') { if (getch() == ' ') { putch(0x14); putch('A'); putch('V'); putch('R'); putch(' '); putch('I'); putch('S'); putch('P'); putch(0x10); } } /* AVR ISP/STK500 board commands DON'T CARE so default nothing_response */ else if(ch=='@') { ch2 = getch(); if (ch2>0x85) getch(); nothing_response(); } /* AVR ISP/STK500 board requests */ else if(ch=='A') { ch2 = getch(); if(ch2==0x80) byte_response(HW_VER); // Hardware version else if(ch2==0x81) byte_response(SW_MAJOR); // Software major version else if(ch2==0x82) byte_response(SW_MINOR); // Software minor version else if(ch2==0x98) byte_response(0x03); // Unknown but seems to be required by avr studio 3.56 else byte_response(0x00); // Covers various unnecessary responses we don't care about } /* Device Parameters DON'T CARE, DEVICE IS FIXED */ else if(ch=='B') { getNch(20); nothing_response(); } /* Parallel programming stuff DON'T CARE */ else if(ch=='E') { getNch(5); nothing_response(); } /* Enter programming mode */ else if(ch=='P') { nothing_response(); } /* Leave programming mode */ else if(ch=='Q') { nothing_response(); } /* Erase device, don't care as we will erase one page at a time anyway. */ else if(ch=='R') { nothing_response(); } /* Set address, little endian. EEPROM in bytes, FLASH in words */ /* Perhaps extra address bytes may be added in future to support > 128kB FLASH. */ /* This might explain why little endian was used here, big endian used everywhere else. */ else if(ch=='U') { address.byte[0] = getch(); address.byte[1] = getch(); nothing_response(); } /* Universal SPI programming command, disabled. Would be used for fuses and lock bits. */ else if(ch=='V') { getNch(4); byte_response(0x00); } /* Write memory, length is big endian and is in bytes */ else if(ch=='d') { length.byte[1] = getch(); length.byte[0] = getch(); flags.eeprom = 0; if (getch() == 'E') flags.eeprom = 1; for (w=0;w127) address_high = 0x01; //Only possible with m128, m256 will need 3rd address byte. FIXME else address_high = 0x00; #ifdef __AVR_ATmega128__ RAMPZ = address_high; #endif address.word = address.word << 1; //address * 2 -> byte location /* if ((length.byte[0] & 0x01) == 0x01) length.word++; //Even up an odd number of bytes */ if ((length.byte[0] & 0x01)) length.word++; //Even up an odd number of bytes cli(); //Disable interrupts, just to be sure // HACKME: EEPE used to be EEWE while(bit_is_set(EECR,EEPE)); //Wait for previous EEPROM writes to complete asm volatile( "clr r17 \n\t" //page_word_count "lds r30,address \n\t" //Address of FLASH location (in bytes) "lds r31,address+1 \n\t" "ldi r28,lo8(buff) \n\t" //Start of buffer array in RAM "ldi r29,hi8(buff) \n\t" "lds r24,length \n\t" //Length of data to be written (in bytes) "lds r25,length+1 \n\t" "length_loop: \n\t" //Main loop, repeat for number of words in block "cpi r17,0x00 \n\t" //If page_word_count=0 then erase page "brne no_page_erase \n\t" "wait_spm1: \n\t" "lds r16,%0 \n\t" //Wait for previous spm to complete "andi r16,1 \n\t" "cpi r16,1 \n\t" "breq wait_spm1 \n\t" "ldi r16,0x03 \n\t" //Erase page pointed to by Z "sts %0,r16 \n\t" "spm \n\t" #ifdef __AVR_ATmega163__ ".word 0xFFFF \n\t" "nop \n\t" #endif "wait_spm2: \n\t" "lds r16,%0 \n\t" //Wait for previous spm to complete "andi r16,1 \n\t" "cpi r16,1 \n\t" "breq wait_spm2 \n\t" "ldi r16,0x11 \n\t" //Re-enable RWW section "sts %0,r16 \n\t" "spm \n\t" #ifdef __AVR_ATmega163__ ".word 0xFFFF \n\t" "nop \n\t" #endif "no_page_erase: \n\t" "ld r0,Y+ \n\t" //Write 2 bytes into page buffer "ld r1,Y+ \n\t" "wait_spm3: \n\t" "lds r16,%0 \n\t" //Wait for previous spm to complete "andi r16,1 \n\t" "cpi r16,1 \n\t" "breq wait_spm3 \n\t" "ldi r16,0x01 \n\t" //Load r0,r1 into FLASH page buffer "sts %0,r16 \n\t" "spm \n\t" "inc r17 \n\t" //page_word_count++ "cpi r17,%1 \n\t" "brlo same_page \n\t" //Still same page in FLASH "write_page: \n\t" "clr r17 \n\t" //New page, write current one first "wait_spm4: \n\t" "lds r16,%0 \n\t" //Wait for previous spm to complete "andi r16,1 \n\t" "cpi r16,1 \n\t" "breq wait_spm4 \n\t" #ifdef __AVR_ATmega163__ "andi r30,0x80 \n\t" // m163 requires Z6:Z1 to be zero during page write #endif "ldi r16,0x05 \n\t" //Write page pointed to by Z "sts %0,r16 \n\t" "spm \n\t" #ifdef __AVR_ATmega163__ ".word 0xFFFF \n\t" "nop \n\t" "ori r30,0x7E \n\t" // recover Z6:Z1 state after page write (had to be zero during write) #endif "wait_spm5: \n\t" "lds r16,%0 \n\t" //Wait for previous spm to complete "andi r16,1 \n\t" "cpi r16,1 \n\t" "breq wait_spm5 \n\t" "ldi r16,0x11 \n\t" //Re-enable RWW section "sts %0,r16 \n\t" "spm \n\t" #ifdef __AVR_ATmega163__ ".word 0xFFFF \n\t" "nop \n\t" #endif "same_page: \n\t" "adiw r30,2 \n\t" //Next word in FLASH "sbiw r24,2 \n\t" //length-2 "breq final_write \n\t" //Finished "rjmp length_loop \n\t" "final_write: \n\t" "cpi r17,0 \n\t" "breq block_done \n\t" "adiw r24,2 \n\t" //length+2, fool above check on length after short page write "rjmp write_page \n\t" "block_done: \n\t" "clr __zero_reg__ \n\t" //restore zero register #if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega_328__) : "=m" (SPMCSR) : "M" (PAGE_SIZE) : "r0","r16","r17","r24","r25","r28","r29","r30","r31" #else : "=m" (SPMCR) : "M" (PAGE_SIZE) : "r0","r16","r17","r24","r25","r28","r29","r30","r31" #endif ); /* Should really add a wait for RWW section to be enabled, don't actually need it since we never */ /* exit the bootloader without a power cycle anyhow */ } putch(0x14); putch(0x10); } } /* Read memory block mode, length is big endian. */ else if(ch=='t') { length.byte[1] = getch(); length.byte[0] = getch(); #if defined __AVR_ATmega128__ if (address.word>0x7FFF) flags.rampz = 1; // No go with m256, FIXME else flags.rampz = 0; #endif if (getch() == 'E') flags.eeprom = 1; else { flags.eeprom = 0; address.word = address.word << 1; // address * 2 -> byte location } if (getch() == ' ') { // Command terminator putch(0x14); for (w=0;w < length.word;w++) { // Can handle odd and even lengths okay if (flags.eeprom) { // Byte access EEPROM read #if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) while(EECR & (1<= 'a') { ah = ah - 'a' + 0x0a; } else if(ah >= '0') { ah -= '0'; } if(al >= 'a') { al = al - 'a' + 0x0a; } else if(al >= '0') { al -= '0'; } return (ah << 4) + al; } void puthex(char ch) { char ah,al; ah = (ch & 0xf0) >> 4; if(ah >= 0x0a) { ah = ah - 0x0a + 'a'; } else { ah += '0'; } al = (ch & 0x0f); if(al >= 0x0a) { al = al - 0x0a + 'a'; } else { al += '0'; } putch(ah); putch(al); } void putch(char ch) { #ifdef __AVR_ATmega128__ if(bootuart == 1) { while (!(UCSR0A & _BV(UDRE0))); UDR0 = ch; } else if (bootuart == 2) { while (!(UCSR1A & _BV(UDRE1))); UDR1 = ch; } #elif defined (__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) while (!(UCSR0A & _BV(UDRE0))); UDR0 = ch; #else /* m8,16,32,169,8515,8535,163 */ while (!(UCSRA & _BV(UDRE))); UDR = ch; #endif } char getch(void) { #ifdef __AVR_ATmega128__ if(bootuart == 1) { while(!(UCSR0A & _BV(RXC0))); return UDR0; } else if(bootuart == 2) { while(!(UCSR1A & _BV(RXC1))); return UDR1; } return 0; #elif defined (__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) uint32_t count = 0; while(!(UCSR0A & _BV(RXC0))){ /* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/ /* HACKME:: here is a good place to count times*/ count++; if (count > MAX_TIME_COUNT) app_start(); } return UDR0; #else /* m8,16,32,169,8515,8535,163 */ uint32_t count = 0; while(!(UCSRA & _BV(RXC))){ /* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/ /* HACKME:: here is a good place to count times*/ count++; if (count > MAX_TIME_COUNT) app_start(); } return UDR; #endif } void getNch(uint8_t count) { uint8_t i; for(i=0;i $@ %.hex: %.elf $(OBJCOPY) -j .text -j .data -O ihex $< $@ %.srec: %.elf $(OBJCOPY) -j .text -j .data -O srec $< $@ %.bin: %.elf $(OBJCOPY) -j .text -j .data -O binary $< $@ ================================================ FILE: external/arduino/avr/bootloaders/caterina/Caterina-Circuitplay32u4.hex ================================================ :1070000055C000006EC000006CC000006AC00000E7 :1070100068C0000066C0000064C0000062C00000DC :1070200060C000005EC00000B2C400005AC0000092 :1070300058C0000056C0000054C0000052C00000FC :1070400050C00000D7C000004CC000004AC0000083 :1070500048C0000046C0000044C0000042C000001C :1070600040C000003EC000003CC000003AC000002C :1070700038C0000036C0000034C0000032C000003C :1070800030C000002EC000002CC000002AC000004C :1070900028C0000026C0000024C0000022C000005C :1070A00020C000001EC000001CC0000011241FBE34 :1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E0EB62 :1070C000FEE702C005900D92A43DB107D9F711E08B :1070D000A4EDB1E001C01D92AA3EB107E1F755D37E :1070E000E5C68ECF84E08093E9000DC08091E80072 :1070F0008B778093E80003C08EB3882359F080918A :10710000E80082FFF9CF8091E80085FFEFCF809102 :10711000F100089580E0089593E09093E900909144 :10712000E80095FF09C08093F10084E690E0909319 :10713000D9018093D80108959091E8009E779093AB :10714000E80003C09EB3992329F09091E80090FFD6 :10715000F9CFE9CF0895F89410926F001092810052 :10716000109285001092840081E085BF15BE47987B :107170000C94000008958091DE019091DF0101964A :107180009093DF018093DE01292F97FF03C03EEF2C :10719000391B232F220F281710F447980895479A78 :1071A000089584B7877F84BF88E10FB6F8948093F1 :1071B0006000109260000FBE90E880E00FB6F89477 :1071C00090936100809361000FBE81E085BF82E0F3 :1071D00085BF3F9AE1E6F0E09083108247981092D5 :1071E00089009DE79093880080936F0083E08093EF :1071F0008100B5C31F920F920FB60F9211242F93E7 :107200008F939F93EF93FF931092850010928400C9 :107210008091D8019091D901009729F0019790931E :10722000D9018093D8018091D6019091D701009720 :1072300029F001979093D7018093D601E0E0F0E028 :1072400085919491019649F08091D4019091D50156 :1072500001969093D5018093D401FF91EF919F9176 :107260008F912F910F900FBE0F901F90189542E0B5 :1072700061EC82E007D342E161E883E003D342E1BD :1072800060E884E0FFC28091E201982F9F779132FD :1072900039F59091E301903291F0913209F5813AFC :1072A000F9F48091E800877F8093E80067E070E060 :1072B00083E091E01AD48091E8008B770FC081328F :1072C00079F48091E800877F8093E80067E070E0C0 :1072D00083E091E067D48091E8008E778093E800A6 :1072E00008954F925F926F927F928F929F92AF928A :1072F000BF92CF92DF92EF92FF920F931F93CF93A3 :10730000DF9384E08093E9008091E80082FF2CC243 :1073100084E690E09093D7018093D601E3DE082FB6 :10732000853481F48CE195E29093D5018093D4016A :1073300007B600FCFDCFF999FECF81E1809357009D :10734000E89503C0843521F4CDDE8DE0E5DEE3C1B0 :107350008C34D9F3803509F4F8CF843721F484E4F0 :10736000DBDE80E0F3CF813611F489E5EFCF8134A5 :1073700081F4B8DEC82FB6DE90E0880F991F3C2F4D :10738000330F20E0822B932BAA2797FDA095BA2FCD :1073900096C1803711F483E5D9CF833549F4CAEC1F :1073A000D1E08991B9DE21E0C13DD207D1F7B3C167 :1073B000863521F481E3B0DE80E3C8CF833731F432 :1073C00087E8AADE85E9A8DE8EE1C0CF8536B9F46C :1073D000E0E0F0E083E095E080935700E89507B6A1 :1073E00000FCFDCF90935700E89507B600FCFDCF59 :1073F000E058FF4FE11520E7F20771F7A6CF82377B :1074000019F4E1E0F0E00EC0863419F4E0E0F0E0B9 :1074100009C08E3419F4E3E0F0E004C0813539F49A :10742000E2E0F0E089E08093570084918FCF8236CC :1074300031F489E571DE80E06FDE80E887CF823449 :1074400019F0873609F0D1C01092D5011092D401FD :1074500049DEC82E47DED82E45DE182F85548230EF :1074600010F08FE373CFDC2D80E0C82FCD29109270 :107470006F00073609F041C081E180935700E8951D :10748000B12C01E037C0C090DA01D090DB01E09070 :10749000DC01F090DD011634B9F4EB2DF0E0EC29BD :1074A000FD29849139DEBB2069F0E2E0CE0ED11CCB :1074B000E11CF11CC092DA01D092DB01E092DC0108 :1074C000F092DD01B02615C0D701C601B695A7958B :1074D00097958795D5D420DEF2E0CF0ED11CE11C24 :1074E000F11CC092DA01D092DB01E092DC01F09253 :1074F000DD012197209739F674C08090DA019090D1 :10750000DB01A090DC01B090DD01163409F057C01A :1075100083E0F40180935700E89507B600FCFDCFA7 :107520004EC0163439F5DD2009F14090DA01509053 :10753000DB016090DC017090DD01D4DDF82EE12CE0 :1075400097012C29F201090100935700E8951124B5 :10755000F2E04F0E511C611C711C4092DA015092F6 :10756000DB016092DC017092DD0102C0BBDDC82E40 :10757000D02623C0B7DD682F8091DA019091DB011E :10758000A091DC01B091DD01B695A79597958795FF :107590007FD44091DA015091DB016091DC01709160 :1075A000DD014E5F5F4F6F4F7F4F4093DA01509385 :1075B000DB016093DC017093DD01219703C0C12CD6 :1075C000D12C01E0209709F0ACCF163441F485E0CE :1075D000F40180935700E89507B600FCFDCF8DE0DD :1075E0009BDD82E080936F0096C0833471F4C0917C :1075F000DA01D091DB0176DD90E021E0FE010C01A3 :1076000020935700E8951124A0CE833611F5C09041 :10761000DA01D090DB01E090DC01F090DD0162DD69 :10762000B701A601416090E021E0FA010C0120932E :107630005700E8951124F2E0CF0ED11CE11CF11C9B :10764000C092DA01D092DB01E092DC01F092DD0120 :107650007CCE8D3661F4E091DA01F091DB0185E0BA :1076600080935700E89507B600FCFDCF6ECE8235BB :1076700051F4E091DA01F091DB01C591D4918D2FA5 :107680004BDD8C2F63CE843419F52CDD682F80916F :10769000DA019091DB01A091DC01B091DD01B6959A :1076A000A79597958795F4D38091DA019091DB01A6 :1076B000A091DC01B091DD010296A11DB11D809366 :1076C000DA019093DB01A093DC01B093DD013DCEA4 :1076D0008436F1F4C090DA01D090DB01E090DC0157 :1076E000F090DD01D701C601B695A79597958795CE :1076F000C7D312DD22E0C20ED11CE11CF11CC092E6 :10770000DA01D092DB01E092DC01F092DD0103C0EE :107710008B3109F0A6CE83E08093E9009091E800D8 :107720008091E8008E778093E80095FD11C08091EC :10773000E80080FD04C08EB38111F9CF15C080919F :10774000E8008E778093E80003C08EB3882361F051 :107750008091E80080FFF9CF84E08093E900809178 :10776000E8008B778093E800DF91CF911F910F9114 :10777000FF90EF90DF90CF90BF90AF909F908F9051 :107780007F906F905F904F90089580910008909146 :107790000108109201081092000844B714BE28E1B5 :1077A0000FB6F89420936000109260000FBEE0E0E6 :1077B000F0E0259134912F3F3F4F79F040FF02C018 :1077C000CADC0BC041FD09C0483039F420910001EA :1077D000309101018217930799F7E3DC78941092B6 :1077E000D5011092D4010CC07CDD39D38091D40135 :1077F0009091D5018131974210F010920201BBDCCB :10780000809102018111F0CF8091E000816080932E :10781000E000A1DC80E090E00895292F30E03327DC :107820002230310539F02330310549F0213031055E :1078300089F00BC02EE330E08AE791E01EC0882378 :1078400071F0813089F08230A1F020E030E080E0FA :1078500090E013C022E130E088EB91E00EC024E01C :1078600030E086E791E009C022E230E08CE391E06D :1078700004C028E130E08AE091E0FA01918380833E :10788000C90108958093E900EBEEF0E0808181600A :107890008083EDEEF0E010826093EC0040838091F5 :1078A000EE00881F8827881F08958091E20187FDD8 :1078B00005C08091E80080FF0DC010C08091E800F5 :1078C00082FD04C08EB38111F9CF08958091E80044 :1078D0008B7707C08EB38111ECCF08958091E800BB :1078E0008E778093E80008950F931F93CF93DF93D3 :1078F00041D048D0C8EDD0E088818F7788838881D7 :107900008068888388818F7D888319BC1EBA109215 :10791000E00100EE10E0F80180818B7F8083888198 :107920008160888342E060E080E0ACDFE1EEF0E07F :1079300080818E7F8083E2EEF0E0808181608083B1 :10794000808188608083F80180818E7F8083888138 :1079500080618883DF91CF911F910F910895E7EDAA :10796000F0E08081816080838AE482BF81E080933F :10797000E101BACFE8EDF0E080818E7F8083109244 :10798000E20008951092DA001092E10008951F922B :107990000F920FB60F9211242F933F934F935F9343 :1079A0006F937F938F939F93AF93BF93EF93FF93C7 :1079B0008091DA0080FF19C08091D80080FF15C047 :1079C0008091DA008E7F8093DA008091D90019BC13 :1079D00080FF09C082E089BD09B400FEFDCF81E0CF :1079E0008EBB3CD202C01EBA39D28091E10080FF2A :1079F00017C08091E20080FF13C08091E2008E7F6B :107A00008093E2008091E20080618093E2008091A7 :107A1000D80080628093D80019BC85E08EBB1ED24E :107A20008091E10084FF2BC08091E20084FF27C099 :107A300019BC82E089BD09B400FEFDCF8091D80059 :107A40008F7D8093D8008091E1008F7E8093E1004C :107A50008091E2008F7E8093E2008091E20081605D :107A60008093E2008091E001811104C08091E300E5 :107A700087FF02C084E001C081E08EBBEFD180911E :107A8000E10083FF21C08091E20083FF1DC080914F :107A9000E100877F8093E10082E08EBB1092E001DD :107AA0008091E1008E7F8093E1008091E2008E7FE3 :107AB0008093E2008091E20080618093E20042E0E6 :107AC00060E080E0DFDECAD1FF91EF91BF91AF911E :107AD0009F918F917F916F915F914F913F912F91E6 :107AE0000F900FBE0F901F9018954091E801509194 :107AF000E9014617570748F06115710539F44091BF :107B0000E8004E774093E80001C0BA01FC0140E074 :107B100032C08EB3882309F441C0853009F440C0D7 :107B20008091E80083FD38C08091E80082FD2EC07E :107B30008091E80080FF1FC09091F3008091F200D7 :107B4000392F20E0A901482BCA0106C0419140937A :107B5000F1006150710901966115710519F08830C5 :107B60009105A0F341E0089709F040E08091E8001A :107B70008E778093E8006115710559F64111C9CFE0 :107B800005C08EB3882351F0853051F08091E80014 :107B900082FFF7CF80E0089581E0089582E00895A4 :107BA00083E008956115710529F44091E8004B7751 :107BB0004093E800AC0127C08EB38823B1F1853033 :107BC00071F18091E80083FD2CC08091E80082FF74 :107BD000F3CFFA0107C08091F1008193AF016150AA :107BE000710961F0AF019091F3008091F200392F9B :107BF00020E0D901A82BCD01892B69F78091E800FD :107C00008B778093E80061157105B1F68091E800EB :107C100080FD09C08EB3882341F08530B9F783E039 :107C2000089581E0089580E0089582E00895EF923C :107C3000FF920F931F93CF93DF9300D0CDB7DEB7A2 :107C4000E2EEF1E08091F100819381E0EA3EF807F5 :107C5000C9F719DB8091E80083FFE9C08091E20158 :107C60009091E301953009F46FC038F4913071F1CF :107C700070F0933009F0DBC029C0983009F4AAC035 :107C8000993009F4B9C0963009F0D1C083C080386A :107C900009F4CDC0823809F0CAC08091E601909104 :107CA000E701877099278093E9009091EB0010928B :107CB000E9008091E800877F8093E80095FB8827A2 :107CC00080F98093F1001092F1008FC0882319F0A1 :107CD000823009F0ACC08F71823009F0A8C0809169 :107CE000E40181112BC08091E6019091E70187703A :107CF0009927009709F49BC08093E9002091EB003D :107D000020FF1CC02091E301233021F48091EB007F :107D1000806212C09091EB0090619093EB0021E0A3 :107D200030E001C0220F8A95EAF72093EA00109212 :107D3000EA008091EB0088608093EB001092E900EC :107D40008091E800877F54C0811171C00091E401E7 :107D50001091E5010F771127E02EFFB6F89480917E :107D6000E800877F8093E800A0DD8091E80080FF35 :107D7000FCCF8091E3008078802B8093E3008068C3 :107D80008093E300EE2011F083E001C082E08EBB1F :107D9000FFBE4DC08058823008F049C0AE014F5F31 :107DA0005F4F6091E6018091E4019091E50135DD3E :107DB000009709F43CC02091E800277F2093E80059 :107DC000BC0189819A8191DE8091E8008B77809354 :107DD000E8002DC0803859F58091E800877F8093B6 :107DE000E8008091E0018093F1008091E8008E77B7 :107DF0008093E8005ADD1BC0811119C09091E40105 :107E00009230A8F48091E800877F8093E8009093F7 :107E1000E0014BDD8091E001811104C08091E3001D :107E200087FF02C084E001C081E08EBB20DA809130 :107E3000E80083FF0AC08091EB0080628093EB0032 :107E40008091E800877F8093E8000F900F90DF918A :107E5000CF911F910F91FF90EF9008950895CF93C8 :107E60008EB3882359F0C091E900C7701092E900E1 :107E70008091E80083FDDBDEC093E900CF91089597 :107E8000F999FECF92BD81BDF89A992780B50895E2 :107E9000262FF999FECF1FBA92BD81BD20BD0FB626 :107EA000F894FA9AF99A0FBE01960895F894FFCFC4 :107EB000777701000000000000081803410064000B :107EC00061006600720075006900740020004900BE :107ED0006E00640075007300740072006900650034 :107EE000730020004C004C004300000022034100BE :107EF0006400610066007200750069007400200073 :107F0000430069007200630075006900740020007E :107F100050006C0061007900670072006F0075000E :107F20006E00640000000403090409023E0002011F :107F30000080320904000001020201000524001043 :107F40000104240204052406000107058203080039 :107F5000FF09040100020A000000070504021000E6 :107F60000107058302100001120110010200000840 :107F70009A23110001000201000143415445524976 :047F80004E4100006E :040000030000700089 :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/caterina/Caterina-Esplora.hex ================================================ :200000000C946E010C9496010C9496010C9496010C9496010C9496010C9496010C94960150 :200020000C9496010C9496010C94F6040C947D050C9496010C9496010C9496010C949601BA :200040000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C94B501C9 :200060000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601C8 :200080000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601A8 :2000A0000C9496010C9496010C94960100000000240027002A002D003000000000002500A4 :2000C00028002B002E003100000000002300260029002C002F00040404040403040502027D :2000E0000202040302020202060606060606040402020204040802011040804010204080A8 :200100004080080204018040201002011080102040400000000200080E0000030401000BB2 :200120000000070605040100080A0B0C0D09040309042203410072006400750069006E00CD :200140006F0020004500730070006C006F007200610020001803410072006400750069000A :200160006E006F0020004C004C004300120100020000004041233C8000010102000112011A :2001800000020200004041233C8000010102000100C18081C1080B0002020201000904004C :2001A000000102020000052400100105240101010424020605240600010705810310004094 :2001C00009040100020A000000070502024000000705830240000005010902A1010901A186 :2001E000008501050919012903150025019503750181029501750581030501093009310943 :20020000381581257F750895038106C0C005010906A1018502050719E029E715002501754D :20022000019508810295017508810395067508150025650507190029658100C0090402004C :2002400001030000000921010100012265000705840340000100000000000000002A2B2895 :200260000000000000000000000000000000000000000000002C9EB4A0A1A2A434A6A7A553 :20028000AE362D3738271E1F20212223242526B333B62EB7B89F8485868788898A8B8C8D58 :2002A0008E8F909192939495969798999A9B9C9D2F3130A3AD350405060708090A0B0C0D7C :2002C0000E0F101112131415161718191A1B1C1DAFB1B0B5000032041007150811241FBE85 :2002E000CFEFDAE0DEBFCDBF11E0A0E0B1E0E0EAF2E102C005900D92AC32B107D9F711E071 :20030000ACE2B1E001C01D92AD39B107E1F712E0CCEDD2E004C02297FE010E944A09C63D07 :20032000D107C9F70E946C030C944E090C9400008091000161E00E94390368EE73E080E043 :2003400090E00E94FD018091000160E00E94390368EE73E080E090E00E94FD010895809196 :20036000000161E00E94AC0208951F920F920FB60F9211242F933F938F939F93AF93BF93E5 :200380008091300190913101A0913201B0913301309134010196A11DB11D232F2D5F2D3794 :2003A00020F02D570196A11DB11D209334018093300190933101A0933201B0933301809117 :2003C0002C0190912D01A0912E01B0912F010196A11DB11D80932C0190932D01A0932E01BA :2003E000B0932F01BF91AF919F918F913F912F910F900FBE0F901F9018959B01AC017FB734 :20040000F89480912C0190912D01A0912E01B0912F0166B5A89B05C06F3F19F00196A11DC3 :20042000B11D7FBFBA2FA92F982F8827860F911DA11DB11D62E0880F991FAA1FBB1F6A9577 :20044000D1F7BC012DC0FFB7F89480912C0190912D01A0912E01B0912F01E6B5A89B05C0E7 :20046000EF3F19F00196A11DB11DFFBFBA2FA92F982F88278E0F911DA11DB11DE2E0880FFD :20048000991FAA1FBB1FEA95D1F7861B970B885E9340C8F2215030404040504068517C4F8F :2004A000211531054105510571F60895789484B5826084BD84B5816084BD85B5826085BD0F :2004C00085B5816085BDEEE6F0E0808181608083E1E8F0E010828081826080838081816043 :2004E0008083E0E8F0E0808181608083E1E9F0E0808182608083808181608083E0E9F0E07E :20050000808181608083E1ECF0E0808184608083808182608083808181608083E3ECF0E007 :20052000808181608083E0ECF0E0808182608083E2ECF0E0808181608083EAE7F0E080812F :20054000846080838081826080838081816080838081806880830895CF93DF93482F50E0E5 :20056000CA018C509F4FFC0134914A525F4FFA018491882369F190E0880F991FFC01E455D0 :20058000FF4FA591B491FC01E654FF4FC591D491662351F42FB7F8948C91932F9095892362 :2005A0008C93888189230BC0623061F42FB7F8948C91932F909589238C938881832B8883B2 :2005C0002FBF06C09FB7F8948C91832B8C939FBFDF91CF910895883071F1893068F48230EF :2005E00031F1833020F4813009F042C01DC0833089F08430E9F512C08B3059F18C3028F41C :200600008930E9F08A30A1F51EC08C3031F18E3079F529C0809180008F7703C0809180003C :200620008F7D80938000089584B58F7702C084B58F7D84BD0895809190008F7707C08091DB :2006400090008F7D03C080919000877F8093900008958091C0008F7703C08091C0008F7DDD :200660008093C00008958091C200877F8093C2000895FF920F931F93F62E482F50E0CA0144 :200680008E5E9E4FFC012491CA018C509F4FFC0114914A525F4FFA0104910023C9F022239D :2006A00019F0822F0E94EB02E02FF0E0EE0FFF1FE654FF4FA591B4919FB7F894FF2021F4DE :2006C0008C911095812302C08C91812B8C939FBF1F910F91FF900895CF93DF930E94560262 :2006E0008DE391E00E9433040E94AF01C0E0D0E00E9498012097E1F30E940000F9CF282F17 :20070000809137018823C1F057FF1AC015C02898909336018091F1008193E217F307B9F75C :200720004115510539F08091F200882319F48BE68093E800AFBF02C04FEF5FEFCA01089599 :20074000AFB7F89427702093E9008091F200282F30E0241735070CF4A901FB019B01240F1E :20076000311D94E6DACFDF93CF930F92CDB7DEB7BE016F5F7F4F41E050E00E947F03019712 :2007800019F02FEF3FEF03C08981282F30E0C9010F90CF91DF910895FF920F931F93F82EEF :2007A000142F052F40913A0150913B01212F302FC901DC01FB016EEF29C0F7FE02C0949125 :2007C00001C09081209138013091390124173507ACF48091E8008570E1F38091E80082FF0F :2007E00003C02FEF3FEF17C09093F100C90101968F739070892B11F46093E8002F5F3F4FEC :200800003093390120933801119731961097A9F6812F902F9C01C9011F910F91FF900895E8 :200820009C018091E80082FFFCCFF901260F311D03C08091F1008193E217F307D1F7289805 :2008400084E6809336018BEF8093E800CB0108958093E9008091F200882319F08AE38093D3 :20086000E800089508951092370181E08093D70080EA8093D80082E189BD09B400FEFDCFAC :2008800061E070E080E090E00E94FD0180E98093D8008CE08093E2001092E000559A209A77 :2008A00008955F926F927F928F929F92AF92BF92CF92DF92EF92FF920F931F93CF93DF93A8 :2008C000E82E842E752E80913701882371F18B01242F352FC901EC017AEFF72E67E0962EC4 :2008E0009E2050E4552E8E2D90E040E2A42EB12CA822B9223AE3632E20E4C22ED12CC82259 :20090000D92258C09FB7F8949092E9008091E80085FD02C020E004C08091F200252D281B3E :200920009FBF222361F4FA9419F42FEF3FEF4DC061E070E080E090E00E94FD013BC0822F1E :2009400090E0C817D9070CF42C2FC21BD1094FB7F8949092E900A114B10421F406C01092D2 :20096000F10021502223D9F719C0E7FC03C0F801922F10C0C801322F06C0FC010196E491FE :20098000E093F10031503323C1F706C081918093F10091509923D1F7020F111D8091E800EB :2009A00085FF05C0209729F4C114D10411F06092E8004FBF209709F0A5CF5D9884E68093F1 :2009C0003501282D372DC9019C01C901DF91CF911F910F91FF90EF90DF90CF90BF90AF906D :2009E0009F908F907F906F905F9008951F920F920FB60F9211242F933F934F935F936F93B8 :200A00007F938F939F93AF93BF93EF93FF938091E1001092E100982F83FF0FC01092E900B0 :200A200081E08093EB001092EC0082E38093ED001092370188E08093F00092FF34C083E037 :200A40008093E9008091F200882319F08AE38093E8008FB7F89492E09093E9009091F20018 :200A60008FBF992321F082E891E00E94530780913501882351F080913501815080933501F0 :200A800080913501882309F45D9A80913601882351F0809136018150809336018091360191 :200AA000882309F4289AFF91EF91BF91AF919F918F917F916F915F914F913F912F910F90CD :200AC0000FBE0F901F9018950F931F93DF93CF930F92CDB7DEB719828E010F5F1F4FC8019D :200AE0000E947907C8010E941209898190E00F90CF91DF911F910F9108951F920F920FB661 :200B00000F921124EF92FF921F932F933F934F935F936F937F938F939F93AF93BF93EF9355 :200B2000FF93DF93CF93CDB7DEB76197DEBFCDBF1092E9008091E80083FF0FC1FE01319679 :200B40009E01275F3F4F03C08091F1008193E217F307D1F7289884E68093360182EF809356 :200B6000E800998197FF05C08091E80080FFFCCF03C08EEF8093E800292F30E0C901807672 :200B80009070892B09F0C2C08A81882329F41092F1001092F100D6C0813009F4D3C08330A3 :200BA00009F4D0C0853049F48091E80080FFFCCF8B8180688093E300C5C0863009F07CC019 :200BC0001C81EF80F8841230C1F51092E900109239011092380110923B0110923A010E94F6 :200BE000640599E0FE013996DF01292F1D922A95E9F799871A8791E09E8790E8988B9AEF44 :200C0000998B2091380130913901275F3F4F3C872B878D871092E9001092390110923801EC :200C2000F0923B01E0923A0180E0BF0149E050E00E94CC030E94640585C01092E9001092E2 :200C4000390110923801F0923B01E0923A01123241F482E290E00E940A09892B09F476C02B :200C600071C0113079F488E0E816F10419F481E080933C0180913C01882309F06BC0ECE68D :200C8000F1E013C0133009F061C08B81882319F4EEE2F1E00AC0823019F4E2E3F1E005C00A :200CA000813009F053C0E4E5F1E0449180E8BF0150E00E94CC0346C0873009F447C08830C6 :200CC00021F481E08093F1003DC08930D9F523703070232BD9F5E1E9F1E091E031E026E3A1 :200CE0009093E9003093EB0084918093EC002093ED009F5F3196953099F78EE78093EA00FA :200D00001092EA008B81809337011CC08F8198851092E900109239011092380190933B0146 :200D200080933A018D81882329F4CE0101960E94850706C0823051F4CE0101960E94DB0754 :200D4000882321F08EEF8093E80007C081E28093EB0003C0EEE7F1E0A8CF6196DEBFCDBF37 :200D6000CF91DF91FF91EF91BF91AF919F918F917F916F915F914F913F912F911F91FF9004 :200D8000EF900F900FBE0F901F90189520917E0130917F018091800190918101281B390B40 :200DA0002F733070C901089520917E0130917F0180918001909181012817390719F42FEF3A :200DC0003FEF09C0E0918001F0918101E25CFE4F8081282F30E0C901089520917E013091DC :200DE0007F0180918001909181012817390719F42FEF3FEF13C0E0918001F0918101E25C60 :200E0000FE4F2081809180019091810101968F739070909381018093800130E0C901089566 :200E2000109285011092840188EE93E0A0E0B0E08093860190938701A0938801B09389019C :200E400080E191E0909383018093820108950F931F93DF93CF930F92CDB7DEB78C0169838B :200E600080910901882369F083E0BE016F5F7F4F41E050E00E9451041816190614F49C015B :200E800007C081E090E0F8019383828320E030E0C9010F90CF91DF911F910F91089583E00D :200EA0000E9428040895CF93DF9312C082E00E94B3032FEF8F3F9207C9F0E0917E01F091B8 :200EC0007F01E25CFE4F8083D0937F01C0937E01C0917E01D0917F012196CF73D070809154 :200EE000800190918101C817D90701F7DF91CF910895FC0180818E5F808380E865E971E0B5 :200F000042E450E00E94CC030895FC0181819081913A59F4813209F04CC080E062E071E09A :200F200047E050E00E94CC0342C0913209F041C0803239F482E091E067E070E00E9410042B :200F400036C0823209F035C08281809309018091020190910301A0910401B0910501805B48 :200F60009440A040B04019F58091090180FD12C087E797E790930108809300082BE088E1AE :200F800090E00FB6F894A895809360000FBE209360000DC088E10FB6F89480936000109264 :200FA00060000FBEA895109201081092000881E0089580E00895FC0191818081813A31F487 :200FC000913089F080E0933089F40DC0813269F49B3021F4828180930A0105C09A3029F4AD :200FE000828180930B0181E0089580E00895EF92FF920F931F938C01E62EDC01ED91FC91E5 :201000000480F581E02D0995F82ED801ED91FC910680F781E02DC8016E2D09958F2D90E0E8 :201020001F910F91FF90EF90089510929001109294011092930182E291E090939201809377 :2010400091010895EF92FF920F931F93DF93CF930F92CDB7DEB789838B017A0184E0BE0137 :201060006F5F7F4F41E050E00E94510484E4B801A7010E9451040F90CF91DF911F910F910D :20108000FF90EF90089582E048E050E00E9422080895FC01168217821086118612861386F6 :2010A00014823496BF010E9443080895DC01683810F0685829C0E62FF0E067FF13C0E0580A :2010C000F04081E090E002C0880F991FEA95E2F7809514962C911497282314962C93149720 :2010E00060E012C0EB5AFD4F6491662319F420E030E01DC067FF08C014968C9114978D7F29 :2011000014968C9314976F77FD0190E0662321F08681861709F416829F5F31969630B1F701 :20112000CD011496BD010E94430821E030E0C9010895CF93DF93DC01683810F0685825C01E :20114000E62FF0E067FF12C0E058F04081E090E002C0880F991FEA95E2F714962C911497BE :20116000282B14962C93149760E00FC0EB5AFD4F64916623D9F167FF08C014968C91149780 :20118000826014968C9314976F7716968C9116978617A9F117968C911797861781F1189631 :2011A0008C911897861759F119968C911997861731F11A968C911A97861709F11B968C915E :2011C0001B978617E1F0ED01E0E0F0E09E2F8E81882321F4EA0FFB1F668306C09F5F31964E :2011E0002196E630F10591F7963049F481E090E013969C938E93129720E030E007C0CD0189 :201200001496BD010E94430821E030E0C901DF91CF91089580E867ED71E045E650E00E9427 :20122000CC030895FC0180818F5F808380E86CE372E049E150E00E94CC030895CF92DF9210 :20124000EF92FF920F931F93CF93DF937C016B018A01C0E0D0E00FC0D6016D916D01D701A6 :20126000ED91FC910190F081E02DC7010995C80FD91F015010400115110571F7CE01DF91AB :20128000CF911F910F91FF90EF90DF90CF900895EE0FFF1F0590F491E02D0994F894FFCFEC :2012A0000D0000E100000000000001010000000027071E09C606ED06D4064F0753070000A0 :2012C0000000F7071E09990856084908FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :2012E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :20130000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :20132000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20134000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20136000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20138000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :2013A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :2013C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2013E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :20140000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :20142000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20144000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20146000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20148000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :2014A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :2014C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2014E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :20150000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :20152000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20154000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20156000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20158000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :2015A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :2015C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2015E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :20160000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :20162000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20164000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20166000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20168000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :2016A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :2016C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2016E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :20170000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :20172000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20174000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20176000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20178000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :2017A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :2017C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2017E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :20180000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :20182000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20184000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20186000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20188000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :2018A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :2018C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2018E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :20190000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :20192000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :20194000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20196000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20198000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :2019A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :2019C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2019E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :201A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :201A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :201A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :201A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :201A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :201AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :201AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :201AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :201B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :201B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :201B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :201B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :201B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :201BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :201BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :201BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :201C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :201C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :201C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :201C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :201C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :201CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :201CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :201CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :201D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :201D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :201D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :201D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :201D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :201DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :201DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :201DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :201E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :201E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :201E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :201E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :201E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :201EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :201EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :201EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :201F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :201F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :201F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :201F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :201F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :201FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :201FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :201FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :20200000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :20202000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20204000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20206000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20208000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :2020A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :2020C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2020E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :20210000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :20212000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20214000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20216000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20218000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :2021A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :2021C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2021E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :20220000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :20222000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20224000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20226000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20228000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :2022A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :2022C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2022E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :20230000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :20232000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20234000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20236000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20238000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :2023A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :2023C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2023E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :20240000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :20242000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20244000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20246000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20248000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :2024A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :2024C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2024E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :20250000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :20252000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20254000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20256000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20258000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :2025A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :2025C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2025E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :20260000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :20262000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20264000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20266000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20268000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :2026A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :2026C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2026E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :20270000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :20272000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20274000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20276000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20278000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :2027A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :2027C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2027E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :20280000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :20282000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20284000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20286000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20288000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :2028A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :2028C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2028E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :20290000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :20292000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :20294000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20296000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20298000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :2029A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :2029C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2029E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :202A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :202A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :202A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :202A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :202A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :202AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :202AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :202AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :202B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :202B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :202B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :202B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :202B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :202BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :202BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :202BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :202C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :202C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :202C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :202C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :202C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :202CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :202CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :202CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :202D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :202D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :202D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :202D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :202D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :202DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :202DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :202DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :202E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :202E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :202E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :202E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :202E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :202EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :202EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :202EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :202F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :202F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :202F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :202F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :202F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :202FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :202FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :202FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :20300000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 :20302000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 :20304000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 :20306000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 :20308000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 :2030A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 :2030C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 :2030E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 :20310000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF :20312000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF :20314000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F :20316000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F :20318000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F :2031A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F :2031C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F :2031E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF :20320000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE :20322000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE :20324000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E :20326000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E :20328000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E :2032A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E :2032C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :2032E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE :20330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20332000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20334000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20336000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :20338000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :2033A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2033C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :2033E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :20340000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20342000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20344000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20346000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :20348000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :2034A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2034C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :2034E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :20350000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20352000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20354000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20356000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :20358000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :2035A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2035C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :2035E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :20360000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20362000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20364000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20366000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :20368000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :2036A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2036C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :2036E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :20370000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20372000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20374000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20376000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :20378000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :2037A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2037C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :2037E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :20380000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20382000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20384000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20386000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :20388000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :2038A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2038C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :2038E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :20390000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :20392000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20394000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20396000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :20398000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :2039A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2039C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :2039E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :203A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :203A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :203A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :203A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :203A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :203AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :203AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :203AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :203B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :203B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :203B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :203B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :203B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :203BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :203BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :203BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :203C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :203C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :203C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :203C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :203C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :203CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :203CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :203CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :203D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :203D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :203D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :203D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :203D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :203DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :203DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :203DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :203E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :203E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :203E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :203E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :203E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :203EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :203EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :203EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :203F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :203F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :203F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :203F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :203F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :203FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :203FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :203FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :20400000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20402000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20404000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20406000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :20408000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :2040A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2040C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :2040E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :20410000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20412000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20414000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20416000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :20418000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :2041A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2041C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :2041E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :20420000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20422000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20424000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20426000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :20428000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :2042A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2042C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :2042E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :20430000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20432000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20434000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20436000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :20438000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :2043A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2043C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :2043E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :20440000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20442000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20444000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20446000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :20448000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :2044A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2044C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :2044E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :20450000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20452000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20454000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20456000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :20458000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :2045A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2045C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :2045E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :20460000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20462000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20464000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20466000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :20468000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :2046A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2046C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :2046E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :20470000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20472000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20474000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20476000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :20478000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :2047A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2047C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :2047E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :20480000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20482000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20484000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20486000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :20488000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :2048A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2048C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :2048E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :20490000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :20492000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20494000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20496000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :20498000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :2049A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2049C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :2049E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :204A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :204A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :204A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :204A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :204A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :204AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :204AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :204AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :204B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :204B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :204B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :204B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :204B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :204BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :204BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :204BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :204C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :204C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :204C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :204C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :204C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :204CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :204CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :204CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :204D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :204D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :204D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :204D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :204D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :204DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :204DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :204DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :204E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :204E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :204E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :204E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :204E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :204EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :204EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :204EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :204F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :204F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :204F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :204F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :204F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :204FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :204FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :204FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :20500000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 :20502000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 :20504000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 :20506000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 :20508000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 :2050A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 :2050C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 :2050E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 :20510000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF :20512000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F :20514000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F :20516000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F :20518000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F :2051A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F :2051C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF :2051E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF :20520000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE :20522000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E :20524000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E :20526000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E :20528000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E :2052A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :2052C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE :2052E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE :20530000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20532000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20534000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :20536000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :20538000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2053A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :2053C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :2053E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20540000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20542000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20544000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :20546000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :20548000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2054A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :2054C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :2054E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20550000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20552000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20554000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :20556000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :20558000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2055A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :2055C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :2055E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20560000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20562000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20564000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :20566000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :20568000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2056A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :2056C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :2056E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20570000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20572000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20574000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :20576000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :20578000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2057A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :2057C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :2057E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20580000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20582000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20584000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :20586000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :20588000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2058A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :2058C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :2058E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20590000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20592000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20594000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :20596000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :20598000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2059A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :2059C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :2059E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :205A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :205A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :205A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :205A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :205A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :205AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :205AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :205AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :205B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :205B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :205B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :205B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :205B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :205BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :205BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :205BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :205C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :205C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :205C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :205C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :205C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :205CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :205CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :205CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :205D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :205D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :205D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :205D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :205D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :205DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :205DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :205DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :205E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :205E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :205E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :205E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :205E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :205EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :205EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :205EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :205F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :205F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :205F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :205F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :205F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :205FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :205FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :205FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :20600000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20602000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20604000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :20606000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :20608000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2060A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :2060C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :2060E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20610000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20612000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20614000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :20616000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :20618000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2061A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :2061C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :2061E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20620000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20622000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20624000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :20626000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :20628000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2062A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :2062C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :2062E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20630000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20632000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20634000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :20636000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :20638000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2063A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :2063C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :2063E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20640000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20642000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20644000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :20646000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :20648000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2064A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :2064C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :2064E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20650000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20652000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20654000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :20656000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :20658000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2065A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :2065C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :2065E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20660000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20662000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20664000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :20666000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :20668000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2066A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :2066C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :2066E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20670000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20672000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20674000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :20676000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :20678000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2067A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :2067C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :2067E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20680000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20682000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20684000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :20686000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :20688000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2068A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :2068C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :2068E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20690000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20692000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20694000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :20696000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :20698000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2069A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :2069C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :2069E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :206A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :206A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :206A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :206A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :206A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :206AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :206AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :206AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :206B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :206B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :206B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :206B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :206B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :206BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :206BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :206BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :206C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :206C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :206C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :206C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :206C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :206CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :206CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :206CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :206D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :206D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :206D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :206D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :206D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :206DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :206DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :206DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :206E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :206E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :206E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :206E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :206E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :206EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :206EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :206EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :206F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :206F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :206F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :206F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :206F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :206FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :206FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :206FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :2070000055C000006EC000006CC000006AC0000068C0000066C0000064C0000062C0000043 :2070200060C000005EC00000F2C400005AC0000058C0000056C0000054C0000052C00000EE :2070400050C0000078C000004CC000004AC0000048C0000046C0000044C0000042C00000BE :2070600040C000003EC000003CC000003AC0000038C0000036C0000034C0000032C0000048 :2070800030C000002EC000002CC000002AC0000028C0000026C0000024C0000022C00000A8 :2070A00020C000001EC000001CC0000011241FBECFEFDAE0DEBFCDBF11E0A0E0B1E0E2E3BC :2070C000FFE702C005900D92A83AB107D9F711E0A8EAB1E001C01D92AE3BB107E1F78FD30B :2070E00026C78ECFF89410926F0010928100109285001092840081E085BF15BE47985D9AEB :20710000289A0C94000008952091B2013091B3012F5F3F4F3093B3012093B201932F37FFA6 :2071200003C08EEF831B982F990F921710F447980895479A08951F920F920FB60F9211246E :207140002F938F939F93EF93FF9310928500109284008091A8019091A901009741F00197D3 :207160009093A9018093A801892B09F45D9A8091AA019091AB01009741F001979093AB0126 :207180008093AA01892B09F4289AE0E0F0E0859194918F5F9F4F49F08091AC019091AD0151 :2071A00001969093AD018093AC01FF91EF919F918F912F910F900FBE0F901F90189584E0BC :2071C0008093E9000DC08091E8008B778093E80003C08EB3882351F08091E80082FFF9CFBE :2071E0008091E80085FFEFCF8091F1000895982F83E08093E9008091E80085FD0DC0809136 :20720000E8008E778093E80003C08EB3882369F08091E80080FFF9CF9093F1005D9884E6CB :2072200090E09093A9018093A80108954F925F926F927F928F929F92AF92BF92CF92DF921E :20724000EF92FF920F931F93CF93DF9384E08093E9008091E80082FF57C2289884E690E067 :207260009093AB018093AA01AADF182F853481F48CE49DE19093AD018093AC0107B600FC4B :20728000FDCFF999FECF81E180935700E89503C0843519F494DF8DE00DC28C34E1F38035F9 :2072A000D1F3843721F484E4A2DF80E003C2813611F489E5FFC18134B1F481DF182F7FDFE3 :2072C00090E0880F991FAA2797FDA095BA2F312F330F20E0442737FD4095542F822B932B68 :2072E000A42BB52BB8C1803711F483E5E3C1833549F4C0E0D1E089917ADF21E0C730D20714 :20730000D1F7D9C1863521F481E371DF80E3D2C1833731F487E86BDF85E969DF8EE1CAC149 :207320008536B9F4E0E0F0E093E085E090935700E89507B600FCFDCF80935700E89507B65D :2073400000FCFDCFE058FF4FA0E7E030FA0771F7A2CF823739F4E1E0F0E089E08093570024 :207360008491A8C1863439F4E0E0F0E089E08093570084919FC18E3439F4E3E0F0E089E0E5 :2073800080935700849196C1813539F4E2E0F0E089E08093570084918DC1823631F489E521 :2073A00026DF80E024DF80E885C1823419F0873609F0E5C01092AD011092AC0100DF082FE8 :2073C000FEDEF82EFCDE682E8554823008F071C1902F80E0CF2DD0E0C82BD92B10926F00B3 :2073E000173609F04BC081E180935700E895DD24CC24C3943FC0E090AE01F090AF010091CC :20740000B0011091B101B6E46B16D9F4ED2DF0E0EE29FF29E4918E2FEADEDD2081F082E08D :2074200090E0A0E0B0E0E80EF91E0A1F1B1FE092AE01F092AF010093B0011093B101DC2470 :2074400018C0D801C701B695A7959795879559D5CEDE82E090E0A0E0B0E0E80EF91E0A1FF2 :207460001B1FE092AE01F092AF010093B0011093B1012197209709F0BECF7DC08090AE01F5 :207480009090AF01A090B001B090B10196E4691609F05DC083E0F40180935700E89507B63E :2074A00000FCFDCF54C0F6E46F1661F5772031F1E090AE01F090AF010091B0011091B1019E :2074C0007EDED82ECC24852D90E08C299D29F7010C0140925700E895112482E090E0A0E08B :2074E000B0E0E80EF91E0A1F1B1FE092AE01F092AF010093B0011093B10102C060DE582E1A :20750000742423C0E090AE01F090AF010091B0011091B10116950795F794E79450DE682FFA :20752000C701F7D48091AE019091AF01A091B001B091B1010296A11DB11D8093AE01909349 :20754000AF01A093B001B093B101219704C05524772444244394209709F0A5CF96E46916B6 :2075600041F485E0F40180935700E89507B600FCFDCF8DE03CDE82E080936F009CC0833492 :2075800071F40091AE011091AF0119DE90E021E0F8010C0120935700E89511247CCE8336C8 :2075A00019F5E090AE01F090AF010091B0011091B10105DEF701E16090E021E00C0120938C :2075C0005700E895112482E090E0A0E0B0E0E80EF91E0A1F1B1FE092AE01F092AF0100936A :2075E000B0011093B10157CE8D3661F4E091AE01F091AF0185E080935700E89507B600FCF2 :20760000FDCF49CE823551F4E091AE01F091AF0105911491812FEBDD802F4CC0843421F5FE :20762000E090AE01F090AF010091B0011091B10116950795F794E794C2DD682FC70169D4DE :207640008091AE019091AF01A091B001B091B1010296A11DB11D8093AE019093AF01A093D8 :20766000B001B093B10117CE843609F5E090AE01F090AF010091B0011091B101D801C70142 :20768000B695A795979587953CD4B1DD82E090E0A0E0B0E0E80EF91E0A1F1B1FE092AE010A :2076A000F092AF010093B0011093B10104C08B3111F08FE39CDD83E08093E9009091E8002B :2076C0008091E8008E778093E80095FF04C010C08EB38823C9F08091E80080FFF9CF809193 :2076E000E8008E778093E80003C08EB3882361F08091E80080FFF9CF84E08093E9008091F1 :20770000E8008B778093E800DF91CF911F910F91FF90EF90DF90CF90BF90AF909F908F90AC :207720007F906F905F904F9008959091B601892F8F77813249F58091B7018032A1F081328A :2077400019F5913A09F58091E800877F8093E8008DE091E067E070E00BD28091E8008B770B :207760008093E8000895913279F48091E800877F8093E8008DE091E067E070E05DD2809192 :20778000E8008E778093E800089582E061EC42E0B5D083E061E842E1B1D084E060E842E1EF :2077A000ADC084B7877F84BF88E10FB6F89480936000109260000FBE20E880E090E00FB63F :2077C000F89420936100809361000FBE81E085BF92E095BF3F9A209A559AE1E6F0E02083A1 :2077E000108247985D9A289A109289008AEF8093880090936F0083E080938100F0C0409116 :20780000000850910108109201081092000894B714BE88E10FB6F8948093600010926000D5 :207820000FBE292F30E0F901E270F07091FD18C090FF05C0859194918F5F9F4F81F423FFFF :207840000FC08091090190910A014817590741F0E0E0F0E0859194918F5F9F4F09F042DC64 :20786000A0DF78941092AD011092AC010CC0DEDC36D38091AC019091AD0181549F4110F00D :207880001092140141DC80911401882381F78091E00081608093E00025DC80E090E0089598 :2078A000FA01923049F0933061F09130F9F485E191E022E130E01EC087E291E02EE330E04D :2078C00019C0882329F485E691E024E030E012C0813029F489E691E022E230E00BC0823006 :2078E00029F48DE891E028E130E004C080E090E020E030E091838083C90108958093E9004E :207900008091EB0081608093EB001092ED006093EC004093ED008091EE00881F8827881F62 :2079200008958091B60188238CF403C08EB38823B1F08091E80082FFF9CF8091E8008B772A :207940008093E80008958EB3882349F08091E80080FFF9CF8091E8008E778093E800089594 :20796000EF92FF920F931F9345D04CD008ED10E0F80180818F77808380818068808380819B :207980008F7D808319BC1EBA1092B40180EEE82EF12CF70180818B7F8083F8018081816052 :2079A000808380E060E042E0A9DFE1EEF0E080818E7F8083E2EEF0E0808181608083808144 :2079C00088608083F70180818E7F8083F8018081806180831F910F91FF90EF900895E7ED06 :2079E000F0E08081816080838AE482BF81E08093B501B6CFE8EDF0E080818E7F808310921C :207A0000E20008951092DA001092E10008951F920F920FB60F9211242F933F934F935F93F6 :207A20006F937F938F939F93AF93BF93EF93FF938091DA0080FF1BC08091D80080FF17C0B2 :207A40008091DA008E7F8093DA008091D90080FF0BC080E189BD82E189BD09B400FEFDCF36 :207A600081E08EBB3BD203C019BC1EBA37D28091E10080FF17C08091E20080FF13C0809138 :207A8000E2008E7F8093E2008091E20080618093E2008091D80080628093D80019BC85E049 :207AA0008EBB1CD28091E10084FF2CC08091E20084FF28C080E189BD82E189BD09B400FEC5 :207AC000FDCF8091D8008F7D8093D8008091E1008F7E8093E1008091E2008F7E8093E20012 :207AE0008091E20081608093E2008091B401882331F48091E30087FD02C081E001C084E067 :207B00008EBBECD18091E10083FF21C08091E20083FF1DC08091E100877F8093E10082E06A :207B20008EBB1092B4018091E1008E7F8093E1008091E2008E7F8093E2008091E2008061E9 :207B40008093E20080E060E042E0D8DEC7D1FF91EF91BF91AF919F918F917F916F915F9130 :207B60004F913F912F910F900FBE0F901F9018959C014091BC015091BD014617570718F49D :207B8000F90190E044C06115710511F0AB01F8CF8091E8008E778093E80040E050E0F0CF0F :207BA0008EB3882309F444C0853009F443C08091E80083FF02C081E008958091E80082FD70 :207BC00031C08091E80080FF22C08091F3009091F200782F60E0292F30E0262B372B07C07A :207BE00081918093F100415050402F5F3F4F4115510519F02830310598F390E02830310566 :207C000009F491E08091E8008E778093E8004115510531F6992321F605C08EB3882341F075 :207C2000853041F08091E80082FFF7CF80E0089582E0089583E008959C016115710529F47C :207C40008091E8008B778093E800F90126C08EB3882391F1853091F18091E80083FF02C06C :207C600081E008958091E80082FFF1CF06C08091F10081936150704059F02091F300809191 :207C8000F200322F20E090E0822B932B892B79F78091E8008B778093E80061157105B9F601 :207CA00005C08EB3882341F0853041F08091E80080FFF7CF80E0089582E0089583E00895C2 :207CC0000F931F93DF93CF9300D0CDB7DEB7E6EBF1E08091F100819381E0EE3BF807C9F792 :207CE00024DD8091E80083FFE4C08091B6019091B701953009F46DC0963040F4913081F1A7 :207D0000913070F0933009F0D4C02AC0983009F4A3C0993009F4B2C0963009F0CAC07CC023 :207D2000803809F4C6C0823809F0C3C08091BA0187708093E9008091EB001092E9002091DB :207D4000E800277F2093E80090E025E0969587952A95E1F781708093F1001092F10087C0D8 :207D6000882319F0823009F0A4C08F71823009F0A0C08091B801882331F52091BA01277097 :207D800009F497C02093E9008091EB0080FF1BC0933021F48091EB00806213C08091EB0018 :207DA00080618093EB0081E090E002C0880F991F2A95E2F78093EA001092EA008091EB00E5 :207DC00088608093EB001092E9008091E800877F51C0882309F06DC01091B8011F770FB79B :207DE000F8948091E800877F8093E8009ADD8091E80080FFFCCF8091E3008078812B809398 :207E0000E30080688093E300112311F482E001C083E08EBB0FBF4DC08058823008F049C033 :207E20008091B8019091B9016091BA01AE014F5F5F4F36DDBC01009709F43BC08091E8008E :207E4000877F8093E80089819A8192DE8091E8008B778093E8002DC0803859F58091E800AA :207E6000877F8093E8008091B4018093F1008091E8008E778093E80054DD1BC08823C9F4CA :207E80009091B8019230A8F48091E800877F8093E8009093B40145DD8091B401882331F420 :207EA0008091E30087FD02C081E001C084E08EBB6CDC8091E80083FF0AC08091EB0080624E :207EC0008093EB008091E800877F8093E8000F900F90CF91DF911F910F91089508951F9360 :207EE0008EB3882361F01091E9001092E9008091E80083FF01C0E4DE17701093E9001F916F :207F00000895F999FECF92BD81BDF89A992780B50895262FF999FECF1FBA92BD81BD20BDBD :207F20000FB6F894FA9AF99A0FBE01960895F894FFCF4341544552494E4100777700080031 :207F400000000000000801120110010200000841233C0001000201000109023E00020100F9 :207F600080320904000001020201000524001001042402040524060001070582030800FF0C :207F800009040100020A000000070504021000010705830210000104030904220341007216 :207FA000006400750069006E006F0020004500730070006C006F0072006100200000001874 :1A7FC00003410072006400750069006E006F0020004C004C004300000000D7 :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/caterina/Caterina-Esplora.txt ================================================ LUFA: 111009 make: 3.81 avrdude: 5.11.1 avr-libc: 1.6.7 binutils-avr: 2.19 gcc-avr 4.3.3 ================================================ FILE: external/arduino/avr/bootloaders/caterina/Caterina-Industrial101.hex ================================================ :107000005FC0000078C0000076C0000074C00000BF :1070100072C0000070C000006EC000006CC00000B4 :107020006AC0000068C00000DAC4000064C000004C :1070300062C0000060C000005EC000005CC00000D4 :107040005AC000009DC0000056C0000054C000009F :1070500052C0000050C000004EC000004CC00000F4 :107060004AC0000048C0000046C0000044C0000004 :1070700042C0000040C000003EC000003CC0000014 :107080003AC0000038C0000036C0000034C0000024 :1070900032C0000030C000002EC000002CC0000034 :1070A0002AC0000028C0000026C00000583E713EE3 :1070B000153F713E153FA63EC83E153FE83EFA3EDD :1070C00011241FBECFEFDAE0DEBFCDBF11E0A0E09C :1070D000B1E0E4EBFEE702C005900D92A63BB107DC :1070E000D9F721E0A6EBB1E001C01D92AF3CB20799 :1070F000E1F720D3DDC684CF84E08093E90080915E :10710000E80085FD0EC08091E8008B778093E80051 :107110008091E80082FDF3CF8EB38111F9CF80E03A :1071200008958091F100089593E09093E900909183 :10713000E80095FF0AC08093F1005D9884E690E036 :107140009093BD018093BC0108959091E8009E77D3 :107150009093E8009091E80090FDEDCF9EB39111DF :10716000F9CF0895F89410926F001092810081E099 :1071700085BF15BE47985D9A289A0C940000089523 :107180001F920F920FB60F9211242F938F939F93FC :10719000EF93FF9310928500109284008091BC01C0 :1071A0009091BD01009741F001979093BD018093AC :1071B000BC01892B09F45D9A8091BA019091BB01C1 :1071C000009741F001979093BB018093BA01892BFE :1071D00009F4289A8091B6019091B7010196909395 :1071E000B7018093B601E0E0F0E0859194910196BB :1071F00049F08091B8019091B90101969093B9013D :107200008093B801FF91EF919F918F912F910F90F3 :107210000FBE0F901F90189542E061EC82E05AD3A8 :1072200042E161E883E056D342E160E884E052C382 :107230008091C701982F9F77913239F59091C801BD :10724000903291F0913209F5813AF9F48091E80099 :10725000877F8093E80067E070E082E091E070D47F :107260008091E8008B770FC0813279F48091E8003B :10727000877F8093E80067E070E082E091E0B9D416 :107280008091E8008E778093E80008954F925F9296 :107290006F927F928F929F92AF92BF92CF92DF9226 :1072A000EF92FF92CF93DF9384E08093E900809187 :1072B000E80082FF30C2289884E690E09093BB01FA :1072C0008093BA0119DFD82F853481F48CE49DE1D5 :1072D0009093B9018093B80107B600FCFDCFF999EE :1072E000FECF81E180935700E89503C0843521F4F7 :1072F00003DF8DE019DFE6C18C34D9F38035C9F3A3 :10730000843721F484E410DF80E0F4CF813611F477 :1073100089E5F0CF813491F4EFDEC82FEDDE90E007 :10732000880F991F2C2F30E0322F2227330F822B0A :10733000932BAA2797FDA095BA2F98C1803711F4F7 :1073400083E5D8CF833549F4CDEAD1E08991ECDEED :1073500021E0C43BD207D1F7B5C1863521F481E3E2 :10736000E3DE80E3C7CF833731F487E8DDDE85E9EC :10737000DBDE8EE1BFCF8536B9F4E0E0F0E083E0FC :1073800095E080935700E89507B600FCFDCF9093F9 :107390005700E89507B600FCFDCFE058FF4FE11518 :1073A00020E7F20771F7A5CF823719F4E1E0F0E0AA :1073B0000EC0863419F4E0E0F0E009C08E3419F410 :1073C000E3E0F0E004C0813539F4E2E0F0E089E088 :1073D0008093570084918ECF823631F489E5A4DE04 :1073E00080E0A2DE80E886CF823419F0873609F08B :1073F000D5C01092B9011092B8017EDED82E7CDE85 :10740000E82E7ADEC82F8BEB8C0F823010F08FE3E2 :1074100071CFF12CFD2810926F00D73609F045C0CE :1074200081E180935700E8955701912CD1E0A11498 :10743000B10409F4AFC0C090BF01D090C001E0908A :10744000C101F090C201C634B9F4E92DF0E0EC2995 :10745000FD29849169DE992069F082E0C80ED11C73 :10746000E11CF11CC092BF01D092C001E092C101A9 :10747000F092C2019D2615C0D701C601B695A79509 :1074800097958795FFD450DEE2E0CE0ED11CE11C2B :10749000F11CC092BF01D092C001E092C101F092F4 :1074A000C201F1E0AF1AB108C2CF8090BF01909045 :1074B000C001A090C101B090C201C63421F0C12C1E :1074C000D12CD1E030C083E0F40180935700E895DF :1074D00007B600FCFDCFF3CFC63461F5DD2039F1EE :1074E0004090BF015090C0016090C1017090C201F6 :1074F00003DE2C2D30E0382BF2010901D093570028 :10750000E8951124F2E04F0E511C611C711C409251 :10751000BF015092C0016092C1017092C201DD268C :1075200021E0E21AF108E114F104B1F627C0E4DD2C :10753000C82EF5CFE1DD682F8091BF019091C00189 :10754000A091C101B091C201B695A7959795879575 :10755000A1D44091BF015091C0016091C1017091CF :10756000C2014E5F5F4F6F4F7F4F4093BF015093FB :10757000C0016093C1017093C201D2CFC63441F4FF :1075800085E0F40180935700E89507B600FCFDCF35 :107590008DE0CADD82E080936F0094C0833471F483 :1075A000C091BF01D091C001A7DD90E021E0FE01B4 :1075B0000C0120935700E89511249BCE833601F5EA :1075C000C090BF01D090C001E090C101F090C20115 :1075D00093DDF601E16090E021E00C01209357007B :1075E000E8951124F2E0CF0ED11CE11CF11CC092F1 :1075F000BF01D092C001E092C101F092C20179CEE8 :107600008D3661F4E091BF01F091C00185E0809377 :107610005700E89507B600FCFDCF6BCE823551F4DC :10762000E091BF01F091C001C591D4918D2F7CDD17 :107630008C2F60CE843419F55FDD682F8091BF01F7 :107640009091C001A091C101B091C201B695A795DA :10765000979587951FD48091BF019091C001A0910B :10766000C101B091C2010296A11DB11D8093BF015D :107670009093C001A093C101B093C2013ACE843669 :10768000F1F4C090BF01D090C001E090C101F09032 :10769000C201D701C601B695A79597958795F2D3F4 :1076A00043DD22E0C20ED11CE11CF11CC092BF01DF :1076B000D092C001E092C101F092C20103C08B31AF :1076C00009F0A5CE83E08093E9009091E8008091D5 :1076D000E8008E778093E80095FD11C08091E80066 :1076E00080FD04C08EB38111F9CF15C08091E800F0 :1076F0008E778093E80003C08EB3882361F0809179 :10770000E80080FFF9CF84E08093E9008091E800F1 :107710008B778093E800DF91CF91FF90EF90DF901F :10772000CF90BF90AF909F908F907F906F905F9021 :107730004F900895CF93309100081092000824B71D :1077400014BE88E10FB6F894809360001092600038 :107750000FBE90E080E80FB6F8948093610090939C :1077600061000FBE81E085BF82E085BF3F9A209A0D :10777000559A90E8909361001092610047985D9A45 :10778000289A109289009AEF9093880080936F0056 :1077900083E080938100E0E0F0E085919491019690 :1077A00019F081E08093BE0121FF20C0809100018B :1077B0003817E1F0809300087894809101018823C4 :1077C00039F08091B6019091B70188379140C8F3A4 :1077D0001092010110920008F89481E08093010159 :1077E0008091BE01882371F0BDDC0CC020FF04C075 :1077F0008091BE018111F8CF23FF04C08091000168 :107800003813EECFD4D078941092B9011092B80109 :10781000CEEF80910101882301F138DD1CD38091E6 :10782000B8019091B90181349F4110F0109201018B :107830008091C3019091C40101969093C4018093FB :10784000C301292F97FF02C02C2F291B220F2817B5 :1078500010F44798DECF479ADCCF8091E00081603A :107860008093E0007FDC80E090E0CF910895292FA5 :1078700030E02230310539F02330310549F0213034 :10788000310561F410C08EE390E02DE531E01EC0BB :10789000882371F0813089F08230A1F080E090E09F :1078A00020E030E013C082E190E02BE931E00EC02F :1078B00084E090E029E531E009C08CE290E027E225 :1078C00031E004C08CE190E029E031E0FA0131833D :1078D000208308958093E900EBEEF0E080818160E1 :1078E0008083EDEEF0E010826093EC0040838091A5 :1078F000EE00881F8827881F08958091C70187FDA3 :1079000005C08091E80080FF0DC010C08091E800A4 :1079100082FD04C08EB38111F9CF08958091E800F3 :107920008B7707C08EB38111ECCF08958091E8006A :107930008E778093E80008950F931F93CF93DF9382 :1079400041D048D0C8EDD0E088818F778883888186 :107950008068888388818F7D888319BC1EBA1092C5 :10796000C50100EE10E0F80180818B7F8083888163 :107970008160888342E060E080E0ACDFE1EEF0E02F :1079800080818E7F8083E2EEF0E080818160808361 :10799000808188608083F80180818E7F80838881E8 :1079A00080618883DF91CF911F910F910895E7ED5A :1079B000F0E08081816080838AE482BF81E08093EF :1079C000C601BACFE8EDF0E080818E7F808310920F :1079D000E20008951092DA001092E10008951F92DB :1079E0000F920FB60F9211242F933F934F935F93F3 :1079F0006F937F938F939F93AF93BF93EF93FF9377 :107A00008091DA0080FF1BC08091D80080FF17C0F2 :107A10008091DA008E7F8093DA008091D90080FF18 :107A20000BC080E189BD82E189BD09B400FEFDCFB4 :107A300081E08EBB0FD203C019BC1EBA0BD280915D :107A4000E10080FF17C08091E20080FF13C08091A9 :107A5000E2008E7F8093E2008091E200806180935B :107A6000E2008091D80080628093D80019BC85E044 :107A70008EBBF0D18091E10084FF2CC08091E200A8 :107A800084FF28C080E189BD82E189BD09B400FE80 :107A9000FDCF8091D8008F7D8093D8008091E10048 :107AA0008F7E8093E1008091E2008F7E8093E200E0 :107AB0008091E20081608093E2008091C501811194 :107AC00004C08091E30087FF02C084E001C081E030 :107AD0008EBBC0D18091E10083FF21C08091E20084 :107AE00083FF1DC08091E100877F8093E10082E0E9 :107AF0008EBB1092C5018091E1008E7F8093E100E2 :107B00008091E2008E7F8093E2008091E2008061AC :107B10008093E20042E060E080E0DCDE9BD1FF91F8 :107B2000EF91BF91AF919F918F917F916F915F91F5 :107B30004F913F912F910F900FBE0F901F9018956E :107B40002091CD013091CE012617370748F06115FD :107B5000710539F42091E8002E772093E80001C0E8 :107B6000B901FC0120E061157105A1F18EB38823F4 :107B7000E1F18530E1F18091E80083FD34C080912E :107B8000E80082FF06C08091E80082FF26C080E006 :107B900008958091E80080FFE6CF2091F300809166 :107BA000F20090E0922B6115710551F0883091053B :107BB00038F421912093F100615071090196F3CFBF :107BC00021E0089709F020E08091E8008E7780930B :107BD000E800C9CF2111CACFD6CF8EB3882329F0B0 :107BE000853089F604C081E0089582E0089583E03D :107BF00008956115710529F42091E8002B772093F1 :107C0000E8006115710521F12EB3222351F12530D1 :107C100051F12091E80023FD20C02091E80022FFCF :107C2000F3CFFC01CF014091F3002091F20030E04E :107C3000342B232B09F38091F1008193CF01615004 :107C4000710981F7D9CF8EB3882359F0853059F067 :107C50008091E80080FFF7CF02C081E0089580E0C6 :107C6000089582E0089583E008950F931F93CF93C2 :107C7000DF9300D0CDB7DEB7E7ECF1E08091F10003 :107C8000819381E0EF3CF807C9F7D2DA8091E800F0 :107C900083FFCBC02091C7013091C801832F90E0B2 :107CA0008A30910508F0C1C0FC01EA5AF74CE4C0E3 :107CB000223809F0BAC08091CB0187708093E90027 :107CC0009091EB001092E9008091E800877F80930B :107CD000E80095FB882780F98093F1001092F1006D :107CE00082C0822F8D7F09F0A0C0223009F09DC094 :107CF0008091C901811124C02091CB01277009F422 :107D000094C02093E9008091EB0080FF19C080911E :107D1000EB00333011F4806211C080618093EB007E :107D200081E090E0022E01C0880F0A94EAF7809368 :107D3000EA001092EA008091EB0088608093EB00EB :107D40001092E9008091E800877F50C021116DC03A :107D50001091C9011F770FB7F8948091E800877FD1 :107D60008093E800CADD8091E80080FFFCCF80911D :107D7000E3008078812B8093E30080688093E300A8 :107D8000112311F083E001C082E08EBB0FBF4DC014 :107D90002058223008F049C0AE014F5F5F4F60911C :107DA000CB018091C9019091CA0161DD009709F46E :107DB0003CC02091E800277F2093E800BC01898126 :107DC0009A81BEDE8091E8008B778093E8002DC019 :107DD000203859F58091E800877F8093E8008091F2 :107DE000C5018093F1008091E8008E778093E800D0 :107DF00084DD1BC0211119C09091C9019230A8F4F3 :107E00008091E800877F8093E8009093C50175DD3D :107E10008091C501811104C08091E30087FF02C0F9 :107E200084E001C081E08EBBF7D98091E80083FF38 :107E30000AC08091EB0080628093EB008091E800A3 :107E4000877F8093E8000F900F90DF91CF911F9173 :107E50000F9108950895CF938EB3882359F0C09160 :107E6000E900C7701092E9008091E80083FDFDDE13 :107E7000C093E900CF910895EE0FFF1F0590F49194 :107E8000E02D0994F999FECF92BD81BDF89A99270A :107E900080B50895262FF999FECF1FBA92BD81BDF6 :107EA00020BD0FB6F894FA9AF99A0FBE019608957C :047EB000F894FFCF74 :107EB4007701000000000000081C03410072006408 :107EC40000750069006E006F002000730072006C82 :107ED400002000200000002C0341007200640075A3 :107EE4000069006E006F00200049006E0064007598 :107EF40000730074007200690061006C002000319E :107F04000030003100200000000403090409023E8F :107F14000002010080320904000001020201000590 :107F2400240010010424020405240600010705822C :107F3400030800FF09040100020A00000007050409 :107F44000210000107058302100001120110010252 :107F5400000008032A5600010002010001434154B5 :067F64004552494E4100A8 :040000030000700089 :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/caterina/Caterina-Leonardo.hex ================================================ :200000000C946E010C9496010C9496010C9496010C9496010C9496010C9496010C94960150 :200020000C9496010C9496010C94F6040C947D050C9496010C9496010C9496010C949601BA :200040000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C94B501C9 :200060000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601C8 :200080000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601A8 :2000A0000C9496010C9496010C94960100000000240027002A002D003000000000002500A4 :2000C00028002B002E003100000000002300260029002C002F00040404040403040502027D :2000E0000202040302020202060606060606040402020204040802011040804010204080A8 :200100004080080204018040201002011080102040400000000200080E0000030401000BB2 :200120000000070605040100080A0B0C0D09040309042203410072006400750069006E00CD :200140006F0020004C0065006F006E006100720064006F00180341007200640075006900CC :200160006E006F0020004C004C004300120100020000004041233680000101020001120120 :200180000002020000404123368000010102000100C18081C1080B00020202010009040052 :2001A000000102020000052400100105240101010424020605240600010705810310004094 :2001C00009040100020A000000070502024000000705830240000005010902A1010901A186 :2001E000008501050919012903150025019503750181029501750581030501093009310943 :20020000381581257F750895038106C0C005010906A1018502050719E029E715002501754D :20022000019508810295017508810395067508150025650507190029658100C0090402004C :2002400001030000000921010100012265000705840340000100000000000000002A2B2895 :200260000000000000000000000000000000000000000000002C9EB4A0A1A2A434A6A7A553 :20028000AE362D3738271E1F20212223242526B333B62EB7B89F8485868788898A8B8C8D58 :2002A0008E8F909192939495969798999A9B9C9D2F3130A3AD350405060708090A0B0C0D7C :2002C0000E0F101112131415161718191A1B1C1DAFB1B0B5000032041007150811241FBE85 :2002E000CFEFDAE0DEBFCDBF11E0A0E0B1E0E0EAF2E102C005900D92AC32B107D9F711E071 :20030000ACE2B1E001C01D92AD39B107E1F712E0CCEDD2E004C02297FE010E944A09C63D07 :20032000D107C9F70E946C030C944E090C9400008091000161E00E94390368EE73E080E043 :2003400090E00E94FD018091000160E00E94390368EE73E080E090E00E94FD010895809196 :20036000000161E00E94AC0208951F920F920FB60F9211242F933F938F939F93AF93BF93E5 :200380008091300190913101A0913201B0913301309134010196A11DB11D232F2D5F2D3794 :2003A00020F02D570196A11DB11D209334018093300190933101A0933201B0933301809117 :2003C0002C0190912D01A0912E01B0912F010196A11DB11D80932C0190932D01A0932E01BA :2003E000B0932F01BF91AF919F918F913F912F910F900FBE0F901F9018959B01AC017FB734 :20040000F89480912C0190912D01A0912E01B0912F0166B5A89B05C06F3F19F00196A11DC3 :20042000B11D7FBFBA2FA92F982F8827860F911DA11DB11D62E0880F991FAA1FBB1F6A9577 :20044000D1F7BC012DC0FFB7F89480912C0190912D01A0912E01B0912F01E6B5A89B05C0E7 :20046000EF3F19F00196A11DB11DFFBFBA2FA92F982F88278E0F911DA11DB11DE2E0880FFD :20048000991FAA1FBB1FEA95D1F7861B970B885E9340C8F2215030404040504068517C4F8F :2004A000211531054105510571F60895789484B5826084BD84B5816084BD85B5826085BD0F :2004C00085B5816085BDEEE6F0E0808181608083E1E8F0E010828081826080838081816043 :2004E0008083E0E8F0E0808181608083E1E9F0E0808182608083808181608083E0E9F0E07E :20050000808181608083E1ECF0E0808184608083808182608083808181608083E3ECF0E007 :20052000808181608083E0ECF0E0808182608083E2ECF0E0808181608083EAE7F0E080812F :20054000846080838081826080838081816080838081806880830895CF93DF93482F50E0E5 :20056000CA018C509F4FFC0134914A525F4FFA018491882369F190E0880F991FFC01E455D0 :20058000FF4FA591B491FC01E654FF4FC591D491662351F42FB7F8948C91932F9095892362 :2005A0008C93888189230BC0623061F42FB7F8948C91932F909589238C938881832B8883B2 :2005C0002FBF06C09FB7F8948C91832B8C939FBFDF91CF910895883071F1893068F48230EF :2005E00031F1833020F4813009F042C01DC0833089F08430E9F512C08B3059F18C3028F41C :200600008930E9F08A30A1F51EC08C3031F18E3079F529C0809180008F7703C0809180003C :200620008F7D80938000089584B58F7702C084B58F7D84BD0895809190008F7707C08091DB :2006400090008F7D03C080919000877F8093900008958091C0008F7703C08091C0008F7DDD :200660008093C00008958091C200877F8093C2000895FF920F931F93F62E482F50E0CA0144 :200680008E5E9E4FFC012491CA018C509F4FFC0114914A525F4FFA0104910023C9F022239D :2006A00019F0822F0E94EB02E02FF0E0EE0FFF1FE654FF4FA591B4919FB7F894FF2021F4DE :2006C0008C911095812302C08C91812B8C939FBF1F910F91FF900895CF93DF930E94560262 :2006E0008DE391E00E9433040E94AF01C0E0D0E00E9498012097E1F30E940000F9CF282F17 :20070000809137018823C1F057FF1AC015C02898909336018091F1008193E217F307B9F75C :200720004115510539F08091F200882319F48BE68093E800AFBF02C04FEF5FEFCA01089599 :20074000AFB7F89427702093E9008091F200282F30E0241735070CF4A901FB019B01240F1E :20076000311D94E6DACFDF93CF930F92CDB7DEB7BE016F5F7F4F41E050E00E947F03019712 :2007800019F02FEF3FEF03C08981282F30E0C9010F90CF91DF910895FF920F931F93F82EEF :2007A000142F052F40913A0150913B01212F302FC901DC01FB016EEF29C0F7FE02C0949125 :2007C00001C09081209138013091390124173507ACF48091E8008570E1F38091E80082FF0F :2007E00003C02FEF3FEF17C09093F100C90101968F739070892B11F46093E8002F5F3F4FEC :200800003093390120933801119731961097A9F6812F902F9C01C9011F910F91FF900895E8 :200820009C018091E80082FFFCCFF901260F311D03C08091F1008193E217F307D1F7289805 :2008400084E6809336018BEF8093E800CB0108958093E9008091F200882319F08AE38093D3 :20086000E800089508951092370181E08093D70080EA8093D80082E189BD09B400FEFDCFAC :2008800061E070E080E090E00E94FD0180E98093D8008CE08093E2001092E000559A209A77 :2008A00008955F926F927F928F929F92AF92BF92CF92DF92EF92FF920F931F93CF93DF93A8 :2008C000E82E842E752E80913701882371F18B01242F352FC901EC017AEFF72E67E0962EC4 :2008E0009E2050E4552E8E2D90E040E2A42EB12CA822B9223AE3632E20E4C22ED12CC82259 :20090000D92258C09FB7F8949092E9008091E80085FD02C020E004C08091F200252D281B3E :200920009FBF222361F4FA9419F42FEF3FEF4DC061E070E080E090E00E94FD013BC0822F1E :2009400090E0C817D9070CF42C2FC21BD1094FB7F8949092E900A114B10421F406C01092D2 :20096000F10021502223D9F719C0E7FC03C0F801922F10C0C801322F06C0FC010196E491FE :20098000E093F10031503323C1F706C081918093F10091509923D1F7020F111D8091E800EB :2009A00085FF05C0209729F4C114D10411F06092E8004FBF209709F0A5CF5D9884E68093F1 :2009C0003501282D372DC9019C01C901DF91CF911F910F91FF90EF90DF90CF90BF90AF906D :2009E0009F908F907F906F905F9008951F920F920FB60F9211242F933F934F935F936F93B8 :200A00007F938F939F93AF93BF93EF93FF938091E1001092E100982F83FF0FC01092E900B0 :200A200081E08093EB001092EC0082E38093ED001092370188E08093F00092FF34C083E037 :200A40008093E9008091F200882319F08AE38093E8008FB7F89492E09093E9009091F20018 :200A60008FBF992321F082E891E00E94530780913501882351F080913501815080933501F0 :200A800080913501882309F45D9A80913601882351F0809136018150809336018091360191 :200AA000882309F4289AFF91EF91BF91AF919F918F917F916F915F914F913F912F910F90CD :200AC0000FBE0F901F9018950F931F93DF93CF930F92CDB7DEB719828E010F5F1F4FC8019D :200AE0000E947907C8010E941209898190E00F90CF91DF911F910F9108951F920F920FB661 :200B00000F921124EF92FF921F932F933F934F935F936F937F938F939F93AF93BF93EF9355 :200B2000FF93DF93CF93CDB7DEB76197DEBFCDBF1092E9008091E80083FF0FC1FE01319679 :200B40009E01275F3F4F03C08091F1008193E217F307D1F7289884E68093360182EF809356 :200B6000E800998197FF05C08091E80080FFFCCF03C08EEF8093E800292F30E0C901807672 :200B80009070892B09F0C2C08A81882329F41092F1001092F100D6C0813009F4D3C08330A3 :200BA00009F4D0C0853049F48091E80080FFFCCF8B8180688093E300C5C0863009F07CC019 :200BC0001C81EF80F8841230C1F51092E900109239011092380110923B0110923A010E94F6 :200BE000640599E0FE013996DF01292F1D922A95E9F799871A8791E09E8790E8988B9AEF44 :200C0000998B2091380130913901275F3F4F3C872B878D871092E9001092390110923801EC :200C2000F0923B01E0923A0180E0BF0149E050E00E94CC030E94640585C01092E9001092E2 :200C4000390110923801F0923B01E0923A01123241F482E290E00E940A09892B09F476C02B :200C600071C0113079F488E0E816F10419F481E080933C0180913C01882309F06BC0ECE68D :200C8000F1E013C0133009F061C08B81882319F4EEE2F1E00AC0823019F4E2E3F1E005C00A :200CA000813009F053C0E4E5F1E0449180E8BF0150E00E94CC0346C0873009F447C08830C6 :200CC00021F481E08093F1003DC08930D9F523703070232BD9F5E1E9F1E091E031E026E3A1 :200CE0009093E9003093EB0084918093EC002093ED009F5F3196953099F78EE78093EA00FA :200D00001092EA008B81809337011CC08F8198851092E900109239011092380190933B0146 :200D200080933A018D81882329F4CE0101960E94850706C0823051F4CE0101960E94DB0754 :200D4000882321F08EEF8093E80007C081E28093EB0003C0EEE7F1E0A8CF6196DEBFCDBF37 :200D6000CF91DF91FF91EF91BF91AF919F918F917F916F915F914F913F912F911F91FF9004 :200D8000EF900F900FBE0F901F90189520917E0130917F018091800190918101281B390B40 :200DA0002F733070C901089520917E0130917F0180918001909181012817390719F42FEF3A :200DC0003FEF09C0E0918001F0918101E25CFE4F8081282F30E0C901089520917E013091DC :200DE0007F0180918001909181012817390719F42FEF3FEF13C0E0918001F0918101E25C60 :200E0000FE4F2081809180019091810101968F739070909381018093800130E0C901089566 :200E2000109285011092840188EE93E0A0E0B0E08093860190938701A0938801B09389019C :200E400080E191E0909383018093820108950F931F93DF93CF930F92CDB7DEB78C0169838B :200E600080910901882369F083E0BE016F5F7F4F41E050E00E9451041816190614F49C015B :200E800007C081E090E0F8019383828320E030E0C9010F90CF91DF911F910F91089583E00D :200EA0000E9428040895CF93DF9312C082E00E94B3032FEF8F3F9207C9F0E0917E01F091B8 :200EC0007F01E25CFE4F8083D0937F01C0937E01C0917E01D0917F012196CF73D070809154 :200EE000800190918101C817D90701F7DF91CF910895FC0180818E5F808380E865E971E0B5 :200F000042E450E00E94CC030895FC0181819081913A59F4813209F04CC080E062E071E09A :200F200047E050E00E94CC0342C0913209F041C0803239F482E091E067E070E00E9410042B :200F400036C0823209F035C08281809309018091020190910301A0910401B0910501805B48 :200F60009440A040B04019F58091090180FD12C087E797E790930108809300082BE088E1AE :200F800090E00FB6F894A895809360000FBE209360000DC088E10FB6F89480936000109264 :200FA00060000FBEA895109201081092000881E0089580E00895FC0191818081813A31F487 :200FC000913089F080E0933089F40DC0813269F49B3021F4828180930A0105C09A3029F4AD :200FE000828180930B0181E0089580E00895EF92FF920F931F938C01E62EDC01ED91FC91E5 :201000000480F581E02D0995F82ED801ED91FC910680F781E02DC8016E2D09958F2D90E0E8 :201020001F910F91FF90EF90089510929001109294011092930182E291E090939201809377 :2010400091010895EF92FF920F931F93DF93CF930F92CDB7DEB789838B017A0184E0BE0137 :201060006F5F7F4F41E050E00E94510484E4B801A7010E9451040F90CF91DF911F910F910D :20108000FF90EF90089582E048E050E00E9422080895FC01168217821086118612861386F6 :2010A00014823496BF010E9443080895DC01683810F0685829C0E62FF0E067FF13C0E0580A :2010C000F04081E090E002C0880F991FEA95E2F7809514962C911497282314962C93149720 :2010E00060E012C0EB5AFD4F6491662319F420E030E01DC067FF08C014968C9114978D7F29 :2011000014968C9314976F77FD0190E0662321F08681861709F416829F5F31969630B1F701 :20112000CD011496BD010E94430821E030E0C9010895CF93DF93DC01683810F0685825C01E :20114000E62FF0E067FF12C0E058F04081E090E002C0880F991FEA95E2F714962C911497BE :20116000282B14962C93149760E00FC0EB5AFD4F64916623D9F167FF08C014968C91149780 :20118000826014968C9314976F7716968C9116978617A9F117968C911797861781F1189631 :2011A0008C911897861759F119968C911997861731F11A968C911A97861709F11B968C915E :2011C0001B978617E1F0ED01E0E0F0E09E2F8E81882321F4EA0FFB1F668306C09F5F31964E :2011E0002196E630F10591F7963049F481E090E013969C938E93129720E030E007C0CD0189 :201200001496BD010E94430821E030E0C901DF91CF91089580E867ED71E045E650E00E9427 :20122000CC030895FC0180818F5F808380E86CE372E049E150E00E94CC030895CF92DF9210 :20124000EF92FF920F931F93CF93DF937C016B018A01C0E0D0E00FC0D6016D916D01D701A6 :20126000ED91FC910190F081E02DC7010995C80FD91F015010400115110571F7CE01DF91AB :20128000CF911F910F91FF90EF90DF90CF900895EE0FFF1F0590F491E02D0994F894FFCFEC :2012A0000D0000E100000000000001010000000027071E09C606ED06D4064F0753070000A0 :2012C0000000F7071E09990856084908FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :2012E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :20130000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :20132000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20134000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20136000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20138000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :2013A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :2013C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2013E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :20140000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :20142000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20144000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20146000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20148000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :2014A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :2014C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2014E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :20150000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :20152000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20154000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20156000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20158000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :2015A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :2015C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2015E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :20160000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :20162000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20164000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20166000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20168000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :2016A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :2016C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2016E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :20170000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :20172000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20174000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20176000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20178000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :2017A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :2017C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2017E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :20180000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :20182000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20184000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20186000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20188000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :2018A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :2018C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2018E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :20190000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :20192000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :20194000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20196000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20198000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :2019A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :2019C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2019E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :201A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :201A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :201A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :201A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :201A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :201AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :201AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :201AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :201B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :201B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :201B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :201B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :201B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :201BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :201BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :201BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :201C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :201C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :201C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :201C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :201C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :201CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :201CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :201CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :201D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :201D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :201D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :201D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :201D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :201DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :201DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :201DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :201E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :201E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :201E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :201E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :201E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :201EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :201EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :201EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :201F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :201F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :201F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :201F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :201F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :201FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :201FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :201FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :20200000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :20202000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20204000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20206000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20208000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :2020A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :2020C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2020E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :20210000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :20212000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20214000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20216000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20218000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :2021A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :2021C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2021E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :20220000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :20222000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20224000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20226000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20228000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :2022A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :2022C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2022E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :20230000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :20232000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20234000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20236000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20238000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :2023A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :2023C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2023E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :20240000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :20242000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20244000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20246000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20248000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :2024A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :2024C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2024E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :20250000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :20252000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20254000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20256000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20258000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :2025A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :2025C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2025E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :20260000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :20262000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20264000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20266000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20268000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :2026A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :2026C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2026E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :20270000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :20272000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20274000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20276000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20278000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :2027A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :2027C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2027E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :20280000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :20282000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20284000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20286000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20288000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :2028A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :2028C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2028E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :20290000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :20292000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :20294000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20296000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20298000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :2029A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :2029C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2029E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :202A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :202A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :202A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :202A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :202A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :202AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :202AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :202AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :202B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :202B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :202B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :202B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :202B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :202BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :202BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :202BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :202C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :202C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :202C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :202C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :202C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :202CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :202CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :202CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :202D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :202D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :202D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :202D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :202D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :202DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :202DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :202DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :202E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :202E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :202E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :202E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :202E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :202EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :202EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :202EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :202F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :202F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :202F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :202F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :202F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :202FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :202FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :202FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :20300000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 :20302000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 :20304000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 :20306000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 :20308000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 :2030A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 :2030C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 :2030E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 :20310000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF :20312000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF :20314000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F :20316000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F :20318000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F :2031A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F :2031C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F :2031E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF :20320000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE :20322000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE :20324000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E :20326000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E :20328000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E :2032A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E :2032C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :2032E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE :20330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20332000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20334000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20336000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :20338000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :2033A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2033C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :2033E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :20340000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20342000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20344000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20346000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :20348000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :2034A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2034C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :2034E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :20350000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20352000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20354000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20356000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :20358000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :2035A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2035C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :2035E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :20360000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20362000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20364000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20366000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :20368000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :2036A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2036C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :2036E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :20370000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20372000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20374000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20376000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :20378000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :2037A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2037C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :2037E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :20380000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20382000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20384000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20386000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :20388000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :2038A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2038C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :2038E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :20390000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :20392000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20394000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20396000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :20398000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :2039A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2039C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :2039E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :203A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :203A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :203A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :203A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :203A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :203AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :203AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :203AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :203B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :203B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :203B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :203B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :203B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :203BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :203BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :203BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :203C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :203C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :203C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :203C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :203C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :203CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :203CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :203CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :203D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :203D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :203D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :203D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :203D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :203DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :203DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :203DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :203E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :203E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :203E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :203E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :203E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :203EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :203EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :203EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :203F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :203F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :203F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :203F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :203F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :203FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :203FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :203FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :20400000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20402000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20404000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20406000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :20408000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :2040A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2040C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :2040E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :20410000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20412000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20414000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20416000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :20418000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :2041A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2041C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :2041E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :20420000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20422000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20424000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20426000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :20428000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :2042A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2042C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :2042E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :20430000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20432000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20434000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20436000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :20438000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :2043A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2043C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :2043E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :20440000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20442000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20444000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20446000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :20448000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :2044A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2044C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :2044E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :20450000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20452000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20454000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20456000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :20458000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :2045A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2045C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :2045E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :20460000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20462000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20464000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20466000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :20468000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :2046A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2046C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :2046E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :20470000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20472000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20474000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20476000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :20478000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :2047A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2047C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :2047E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :20480000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20482000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20484000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20486000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :20488000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :2048A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2048C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :2048E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :20490000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :20492000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20494000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20496000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :20498000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :2049A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2049C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :2049E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :204A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :204A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :204A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :204A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :204A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :204AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :204AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :204AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :204B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :204B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :204B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :204B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :204B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :204BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :204BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :204BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :204C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :204C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :204C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :204C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :204C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :204CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :204CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :204CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :204D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :204D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :204D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :204D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :204D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :204DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :204DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :204DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :204E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :204E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :204E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :204E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :204E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :204EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :204EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :204EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :204F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :204F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :204F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :204F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :204F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :204FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :204FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :204FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :20500000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 :20502000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 :20504000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 :20506000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 :20508000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 :2050A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 :2050C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 :2050E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 :20510000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF :20512000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F :20514000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F :20516000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F :20518000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F :2051A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F :2051C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF :2051E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF :20520000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE :20522000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E :20524000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E :20526000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E :20528000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E :2052A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :2052C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE :2052E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE :20530000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20532000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20534000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :20536000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :20538000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2053A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :2053C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :2053E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20540000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20542000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20544000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :20546000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :20548000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2054A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :2054C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :2054E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20550000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20552000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20554000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :20556000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :20558000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2055A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :2055C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :2055E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20560000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20562000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20564000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :20566000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :20568000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2056A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :2056C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :2056E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20570000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20572000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20574000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :20576000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :20578000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2057A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :2057C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :2057E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20580000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20582000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20584000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :20586000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :20588000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2058A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :2058C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :2058E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20590000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20592000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20594000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :20596000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :20598000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2059A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :2059C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :2059E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :205A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :205A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :205A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :205A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :205A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :205AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :205AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :205AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :205B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :205B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :205B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :205B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :205B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :205BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :205BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :205BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :205C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :205C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :205C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :205C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :205C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :205CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :205CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :205CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :205D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :205D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :205D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :205D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :205D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :205DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :205DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :205DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :205E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :205E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :205E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :205E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :205E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :205EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :205EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :205EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :205F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :205F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :205F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :205F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :205F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :205FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :205FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :205FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :20600000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20602000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20604000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :20606000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :20608000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2060A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :2060C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :2060E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20610000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20612000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20614000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :20616000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :20618000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2061A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :2061C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :2061E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20620000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20622000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20624000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :20626000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :20628000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2062A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :2062C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :2062E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20630000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20632000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20634000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :20636000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :20638000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2063A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :2063C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :2063E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20640000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20642000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20644000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :20646000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :20648000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2064A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :2064C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :2064E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20650000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20652000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20654000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :20656000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :20658000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2065A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :2065C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :2065E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20660000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20662000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20664000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :20666000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :20668000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2066A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :2066C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :2066E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20670000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20672000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20674000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :20676000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :20678000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2067A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :2067C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :2067E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20680000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20682000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20684000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :20686000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :20688000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2068A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :2068C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :2068E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20690000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20692000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20694000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :20696000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :20698000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2069A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :2069C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :2069E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :206A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :206A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :206A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :206A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :206A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :206AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :206AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :206AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :206B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :206B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :206B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :206B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :206B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :206BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :206BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :206BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :206C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :206C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :206C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :206C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :206C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :206CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :206CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :206CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :206D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :206D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :206D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :206D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :206D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :206DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :206DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :206DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :206E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :206E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :206E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :206E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :206E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :206EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :206EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :206EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :206F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :206F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :206F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :206F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :206F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :206FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :206FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :206FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :2070000055C000006EC000006CC000006AC0000068C0000066C0000064C0000062C0000043 :2070200060C000005EC00000F2C400005AC0000058C0000056C0000054C0000052C00000EE :2070400050C0000078C000004CC000004AC0000048C0000046C0000044C0000042C00000BE :2070600040C000003EC000003CC000003AC0000038C0000036C0000034C0000032C0000048 :2070800030C000002EC000002CC000002AC0000028C0000026C0000024C0000022C00000A8 :2070A00020C000001EC000001CC0000011241FBECFEFDAE0DEBFCDBF11E0A0E0B1E0E2E3BC :2070C000FFE702C005900D92A83AB107D9F711E0A8EAB1E001C01D92AE3BB107E1F78FD30B :2070E00026C78ECFF89410926F0010928100109285001092840081E085BF15BE47985D9AEB :20710000289A0C94000008952091B2013091B3012F5F3F4F3093B3012093B201932F37FFA6 :2071200003C08EEF831B982F990F921710F447980895479A08951F920F920FB60F9211246E :207140002F938F939F93EF93FF9310928500109284008091A8019091A901009741F00197D3 :207160009093A9018093A801892B09F45D9A8091AA019091AB01009741F001979093AB0126 :207180008093AA01892B09F4289AE0E0F0E0859194918F5F9F4F49F08091AC019091AD0151 :2071A00001969093AD018093AC01FF91EF919F918F912F910F900FBE0F901F90189584E0BC :2071C0008093E9000DC08091E8008B778093E80003C08EB3882351F08091E80082FFF9CFBE :2071E0008091E80085FFEFCF8091F1000895982F83E08093E9008091E80085FD0DC0809136 :20720000E8008E778093E80003C08EB3882369F08091E80080FFF9CF9093F1005D9884E6CB :2072200090E09093A9018093A80108954F925F926F927F928F929F92AF92BF92CF92DF921E :20724000EF92FF920F931F93CF93DF9384E08093E9008091E80082FF57C2289884E690E067 :207260009093AB018093AA01AADF182F853481F48CE49DE19093AD018093AC0107B600FC4B :20728000FDCFF999FECF81E180935700E89503C0843519F494DF8DE00DC28C34E1F38035F9 :2072A000D1F3843721F484E4A2DF80E003C2813611F489E5FFC18134B1F481DF182F7FDFE3 :2072C00090E0880F991FAA2797FDA095BA2F312F330F20E0442737FD4095542F822B932B68 :2072E000A42BB52BB8C1803711F483E5E3C1833549F4C0E0D1E089917ADF21E0C730D20714 :20730000D1F7D9C1863521F481E371DF80E3D2C1833731F487E86BDF85E969DF8EE1CAC149 :207320008536B9F4E0E0F0E093E085E090935700E89507B600FCFDCF80935700E89507B65D :2073400000FCFDCFE058FF4FA0E7E030FA0771F7A2CF823739F4E1E0F0E089E08093570024 :207360008491A8C1863439F4E0E0F0E089E08093570084919FC18E3439F4E3E0F0E089E0E5 :2073800080935700849196C1813539F4E2E0F0E089E08093570084918DC1823631F489E521 :2073A00026DF80E024DF80E885C1823419F0873609F0E5C01092AD011092AC0100DF082FE8 :2073C000FEDEF82EFCDE682E8554823008F071C1902F80E0CF2DD0E0C82BD92B10926F00B3 :2073E000173609F04BC081E180935700E895DD24CC24C3943FC0E090AE01F090AF010091CC :20740000B0011091B101B6E46B16D9F4ED2DF0E0EE29FF29E4918E2FEADEDD2081F082E08D :2074200090E0A0E0B0E0E80EF91E0A1F1B1FE092AE01F092AF010093B0011093B101DC2470 :2074400018C0D801C701B695A7959795879559D5CEDE82E090E0A0E0B0E0E80EF91E0A1FF2 :207460001B1FE092AE01F092AF010093B0011093B1012197209709F0BECF7DC08090AE01F5 :207480009090AF01A090B001B090B10196E4691609F05DC083E0F40180935700E89507B63E :2074A00000FCFDCF54C0F6E46F1661F5772031F1E090AE01F090AF010091B0011091B1019E :2074C0007EDED82ECC24852D90E08C299D29F7010C0140925700E895112482E090E0A0E08B :2074E000B0E0E80EF91E0A1F1B1FE092AE01F092AF010093B0011093B10102C060DE582E1A :20750000742423C0E090AE01F090AF010091B0011091B10116950795F794E79450DE682FFA :20752000C701F7D48091AE019091AF01A091B001B091B1010296A11DB11D8093AE01909349 :20754000AF01A093B001B093B101219704C05524772444244394209709F0A5CF96E46916B6 :2075600041F485E0F40180935700E89507B600FCFDCF8DE03CDE82E080936F009CC0833492 :2075800071F40091AE011091AF0119DE90E021E0F8010C0120935700E89511247CCE8336C8 :2075A00019F5E090AE01F090AF010091B0011091B10105DEF701E16090E021E00C0120938C :2075C0005700E895112482E090E0A0E0B0E0E80EF91E0A1F1B1FE092AE01F092AF0100936A :2075E000B0011093B10157CE8D3661F4E091AE01F091AF0185E080935700E89507B600FCF2 :20760000FDCF49CE823551F4E091AE01F091AF0105911491812FEBDD802F4CC0843421F5FE :20762000E090AE01F090AF010091B0011091B10116950795F794E794C2DD682FC70169D4DE :207640008091AE019091AF01A091B001B091B1010296A11DB11D8093AE019093AF01A093D8 :20766000B001B093B10117CE843609F5E090AE01F090AF010091B0011091B101D801C70142 :20768000B695A795979587953CD4B1DD82E090E0A0E0B0E0E80EF91E0A1F1B1FE092AE010A :2076A000F092AF010093B0011093B10104C08B3111F08FE39CDD83E08093E9009091E8002B :2076C0008091E8008E778093E80095FF04C010C08EB38823C9F08091E80080FFF9CF809193 :2076E000E8008E778093E80003C08EB3882361F08091E80080FFF9CF84E08093E9008091F1 :20770000E8008B778093E800DF91CF911F910F91FF90EF90DF90CF90BF90AF909F908F90AC :207720007F906F905F904F9008959091B601892F8F77813249F58091B7018032A1F081328A :2077400019F5913A09F58091E800877F8093E8008DE091E067E070E00BD28091E8008B770B :207760008093E8000895913279F48091E800877F8093E8008DE091E067E070E05DD2809192 :20778000E8008E778093E800089582E061EC42E0B5D083E061E842E1B1D084E060E842E1EF :2077A000ADC084B7877F84BF88E10FB6F89480936000109260000FBE20E880E090E00FB63F :2077C000F89420936100809361000FBE81E085BF92E095BF3F9A209A559AE1E6F0E02083A1 :2077E000108247985D9A289A109289008AEF8093880090936F0083E080938100F0C0409116 :20780000000850910108109201081092000894B714BE88E10FB6F8948093600010926000D5 :207820000FBE292F30E0F901E270F07091FD18C090FF05C0859194918F5F9F4F81F423FFFF :207840000FC08091090190910A014817590741F0E0E0F0E0859194918F5F9F4F09F042DC64 :20786000A0DF78941092AD011092AC010CC0DEDC36D38091AC019091AD0181549F4110F00D :207880001092140141DC80911401882381F78091E00081608093E00025DC80E090E0089598 :2078A000FA01923049F0933061F09130F9F485E191E022E130E01EC087E291E02EE330E04D :2078C00019C0882329F485E691E024E030E012C0813029F489E691E022E230E00BC0823006 :2078E00029F48DE891E028E130E004C080E090E020E030E091838083C90108958093E9004E :207900008091EB0081608093EB001092ED006093EC004093ED008091EE00881F8827881F62 :2079200008958091B60188238CF403C08EB38823B1F08091E80082FFF9CF8091E8008B772A :207940008093E80008958EB3882349F08091E80080FFF9CF8091E8008E778093E800089594 :20796000EF92FF920F931F9345D04CD008ED10E0F80180818F77808380818068808380819B :207980008F7D808319BC1EBA1092B40180EEE82EF12CF70180818B7F8083F8018081816052 :2079A000808380E060E042E0A9DFE1EEF0E080818E7F8083E2EEF0E0808181608083808144 :2079C00088608083F70180818E7F8083F8018081806180831F910F91FF90EF900895E7ED06 :2079E000F0E08081816080838AE482BF81E08093B501B6CFE8EDF0E080818E7F808310921C :207A0000E20008951092DA001092E10008951F920F920FB60F9211242F933F934F935F93F6 :207A20006F937F938F939F93AF93BF93EF93FF938091DA0080FF1BC08091D80080FF17C0B2 :207A40008091DA008E7F8093DA008091D90080FF0BC080E189BD82E189BD09B400FEFDCF36 :207A600081E08EBB3BD203C019BC1EBA37D28091E10080FF17C08091E20080FF13C0809138 :207A8000E2008E7F8093E2008091E20080618093E2008091D80080628093D80019BC85E049 :207AA0008EBB1CD28091E10084FF2CC08091E20084FF28C080E189BD82E189BD09B400FEC5 :207AC000FDCF8091D8008F7D8093D8008091E1008F7E8093E1008091E2008F7E8093E20012 :207AE0008091E20081608093E2008091B401882331F48091E30087FD02C081E001C084E067 :207B00008EBBECD18091E10083FF21C08091E20083FF1DC08091E100877F8093E10082E06A :207B20008EBB1092B4018091E1008E7F8093E1008091E2008E7F8093E2008091E2008061E9 :207B40008093E20080E060E042E0D8DEC7D1FF91EF91BF91AF919F918F917F916F915F9130 :207B60004F913F912F910F900FBE0F901F9018959C014091BC015091BD014617570718F49D :207B8000F90190E044C06115710511F0AB01F8CF8091E8008E778093E80040E050E0F0CF0F :207BA0008EB3882309F444C0853009F443C08091E80083FF02C081E008958091E80082FD70 :207BC00031C08091E80080FF22C08091F3009091F200782F60E0292F30E0262B372B07C07A :207BE00081918093F100415050402F5F3F4F4115510519F02830310598F390E02830310566 :207C000009F491E08091E8008E778093E8004115510531F6992321F605C08EB3882341F075 :207C2000853041F08091E80082FFF7CF80E0089582E0089583E008959C016115710529F47C :207C40008091E8008B778093E800F90126C08EB3882391F1853091F18091E80083FF02C06C :207C600081E008958091E80082FFF1CF06C08091F10081936150704059F02091F300809191 :207C8000F200322F20E090E0822B932B892B79F78091E8008B778093E80061157105B9F601 :207CA00005C08EB3882341F0853041F08091E80080FFF7CF80E0089582E0089583E00895C2 :207CC0000F931F93DF93CF9300D0CDB7DEB7E6EBF1E08091F100819381E0EE3BF807C9F792 :207CE00024DD8091E80083FFE4C08091B6019091B701953009F46DC0963040F4913081F1A7 :207D0000913070F0933009F0D4C02AC0983009F4A3C0993009F4B2C0963009F0CAC07CC023 :207D2000803809F4C6C0823809F0C3C08091BA0187708093E9008091EB001092E9002091DB :207D4000E800277F2093E80090E025E0969587952A95E1F781708093F1001092F10087C0D8 :207D6000882319F0823009F0A4C08F71823009F0A0C08091B801882331F52091BA01277097 :207D800009F497C02093E9008091EB0080FF1BC0933021F48091EB00806213C08091EB0018 :207DA00080618093EB0081E090E002C0880F991F2A95E2F78093EA001092EA008091EB00E5 :207DC00088608093EB001092E9008091E800877F51C0882309F06DC01091B8011F770FB79B :207DE000F8948091E800877F8093E8009ADD8091E80080FFFCCF8091E3008078812B809398 :207E0000E30080688093E300112311F482E001C083E08EBB0FBF4DC08058823008F049C033 :207E20008091B8019091B9016091BA01AE014F5F5F4F36DDBC01009709F43BC08091E8008E :207E4000877F8093E80089819A8192DE8091E8008B778093E8002DC0803859F58091E800AA :207E6000877F8093E8008091B4018093F1008091E8008E778093E80054DD1BC08823C9F4CA :207E80009091B8019230A8F48091E800877F8093E8009093B40145DD8091B401882331F420 :207EA0008091E30087FD02C081E001C084E08EBB6CDC8091E80083FF0AC08091EB0080624E :207EC0008093EB008091E800877F8093E8000F900F90CF91DF911F910F91089508951F9360 :207EE0008EB3882361F01091E9001092E9008091E80083FF01C0E4DE17701093E9001F916F :207F00000895F999FECF92BD81BDF89A992780B50895262FF999FECF1FBA92BD81BD20BDBD :207F20000FB6F894FA9AF99A0FBE01960895F894FFCF4341544552494E4100777700080031 :207F40000000000000080112011001020000084123360001000201000109023E00020100FF :207F600080320904000001020201000524001001042402040524060001070582030800FF0C :207F800009040100020A000000070504021000010705830210000104030904220341007216 :207FA000006400750069006E006F0020004C0065006F006E006100720064006F0000001836 :1A7FC00003410072006400750069006E006F0020004C004C004300000000D7 :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/caterina/Caterina-Leonardo.txt ================================================ Builds against LUFA version 111009 make version 3.81 avrdude version 5.11 All AVR tools except avrdude were installed by CrossPack 20100115: avr-gcc version 4.3.3 (GCC) Thread model: single Configured with: ../configure —prefix=/usr/local/CrossPack-AVR-20100115 —disable-dependency-tracking —disable-nls —disable-werror —target=avr —enable-languages=c,c++ —disable-nls —disable-libssp —with-dwarf2 avr-libc version 1.6.7 binutils version 2.19 ================================================ FILE: external/arduino/avr/bootloaders/caterina/Caterina-LeonardoEthernet.hex ================================================ :107000005FC0000078C0000076C0000074C00000BF :1070100072C0000070C000006EC000006CC00000B4 :107020006AC0000068C00000DAC4000064C000004C :1070300062C0000060C000005EC000005CC00000D4 :107040005AC000009DC0000056C0000054C000009F :1070500052C0000050C000004EC000004CC00000F4 :107060004AC0000048C0000046C0000044C0000004 :1070700042C0000040C000003EC000003CC0000014 :107080003AC0000038C0000036C0000034C0000024 :1070900032C0000030C000002EC000002CC0000034 :1070A0002AC0000028C0000026C00000583E713EE3 :1070B000153F713E153FA63EC83E153FE83EFA3EDD :1070C00011241FBECFEFDAE0DEBFCDBF11E0A0E09C :1070D000B1E0E4EBFEE702C005900D92A23BB107E0 :1070E000D9F721E0A2EBB1E001C01D92AB3CB207A1 :1070F000E1F720D3DDC684CF84E08093E90080915E :10710000E80085FD0EC08091E8008B778093E80051 :107110008091E80082FDF3CF8EB38111F9CF80E03A :1071200008958091F100089593E09093E900909183 :10713000E80095FF0AC08093F1005D9884E690E036 :107140009093B9018093B80108959091E8009E77DB :107150009093E8009091E80090FDEDCF9EB39111DF :10716000F9CF0895F89410926F001092810081E099 :1071700085BF15BE47985D9A289A0C940000089523 :107180001F920F920FB60F9211242F938F939F93FC :10719000EF93FF9310928500109284008091B801C4 :1071A0009091B901009741F001979093B9018093B4 :1071B000B801892B09F45D9A8091B6019091B701CD :1071C000009741F001979093B7018093B601892B06 :1071D00009F4289A8091B2019091B301019690939D :1071E000B3018093B201E0E0F0E0859194910196C3 :1071F00049F08091B4019091B50101969093B50149 :107200008093B401FF91EF919F918F912F910F90F7 :107210000FBE0F901F90189542E061EC82E05AD3A8 :1072200042E161E883E056D342E160E884E052C382 :107230008091C301982F9F77913239F59091C401C5 :10724000903291F0913209F5813AF9F48091E80099 :10725000877F8093E80067E070E082E091E070D47F :107260008091E8008B770FC0813279F48091E8003B :10727000877F8093E80067E070E082E091E0B9D416 :107280008091E8008E778093E80008954F925F9296 :107290006F927F928F929F92AF92BF92CF92DF9226 :1072A000EF92FF92CF93DF9384E08093E900809187 :1072B000E80082FF30C2289884E690E09093B701FE :1072C0008093B60119DFD82F853481F48CE49DE1D9 :1072D0009093B5018093B40107B600FCFDCFF999F6 :1072E000FECF81E180935700E89503C0843521F4F7 :1072F00003DF8DE019DFE6C18C34D9F38035C9F3A3 :10730000843721F484E410DF80E0F4CF813611F477 :1073100089E5F0CF813491F4EFDEC82FEDDE90E007 :10732000880F991F2C2F30E0322F2227330F822B0A :10733000932BAA2797FDA095BA2F98C1803711F4F7 :1073400083E5D8CF833549F4C9EAD1E08991ECDEF1 :1073500021E0C03BD207D1F7B5C1863521F481E3E6 :10736000E3DE80E3C7CF833731F487E8DDDE85E9EC :10737000DBDE8EE1BFCF8536B9F4E0E0F0E083E0FC :1073800095E080935700E89507B600FCFDCF9093F9 :107390005700E89507B600FCFDCFE058FF4FE11518 :1073A00020E7F20771F7A5CF823719F4E1E0F0E0AA :1073B0000EC0863419F4E0E0F0E009C08E3419F410 :1073C000E3E0F0E004C0813539F4E2E0F0E089E088 :1073D0008093570084918ECF823631F489E5A4DE04 :1073E00080E0A2DE80E886CF823419F0873609F08B :1073F000D5C01092B5011092B4017EDED82E7CDE8D :10740000E82E7ADEC82F8BEB8C0F823010F08FE3E2 :1074100071CFF12CFD2810926F00D73609F045C0CE :1074200081E180935700E8955701912CD1E0A11498 :10743000B10409F4AFC0C090BB01D090BC01E09092 :10744000BD01F090BE01C634B9F4E92DF0E0EC299D :10745000FD29849169DE992069F082E0C80ED11C73 :10746000E11CF11CC092BB01D092BC01E092BD01B5 :10747000F092BE019D2615C0D701C601B695A7950D :1074800097958795FFD450DEE2E0CE0ED11CE11C2B :10749000F11CC092BB01D092BC01E092BD01F09200 :1074A000BE01F1E0AF1AB108C2CF8090BB0190904D :1074B000BC01A090BD01B090BE01C63421F0C12C2A :1074C000D12CD1E030C083E0F40180935700E895DF :1074D00007B600FCFDCFF3CFC63461F5DD2039F1EE :1074E0004090BB015090BC016090BD017090BE0106 :1074F00003DE2C2D30E0382BF2010901D093570028 :10750000E8951124F2E04F0E511C611C711C409251 :10751000BB015092BC016092BD017092BE01DD269C :1075200021E0E21AF108E114F104B1F627C0E4DD2C :10753000C82EF5CFE1DD682F8091BB019091BC0191 :10754000A091BD01B091BE01B695A795979587957D :10755000A1D44091BB015091BC016091BD017091DB :10756000BE014E5F5F4F6F4F7F4F4093BB01509303 :10757000BC016093BD017093BE01D2CFC63441F40B :1075800085E0F40180935700E89507B600FCFDCF35 :107590008DE0CADD82E080936F0094C0833471F483 :1075A000C091BB01D091BC01A7DD90E021E0FE01BC :1075B0000C0120935700E89511249BCE833601F5EA :1075C000C090BB01D090BC01E090BD01F090BE0125 :1075D00093DDF601E16090E021E00C01209357007B :1075E000E8951124F2E0CF0ED11CE11CF11CC092F1 :1075F000BB01D092BC01E092BD01F092BE0179CEF8 :107600008D3661F4E091BB01F091BC0185E080937F :107610005700E89507B600FCFDCF6BCE823551F4DC :10762000E091BB01F091BC01C591D4918D2F7CDD1F :107630008C2F60CE843419F55FDD682F8091BB01FB :107640009091BC01A091BD01B091BE01B695A795E6 :10765000979587951FD48091BB019091BC01A09113 :10766000BD01B091BE010296A11DB11D8093BB0169 :107670009093BC01A093BD01B093BE013ACE843675 :10768000F1F4C090BB01D090BC01E090BD01F0903E :10769000BE01D701C601B695A79597958795F2D3F8 :1076A00043DD22E0C20ED11CE11CF11CC092BB01E3 :1076B000D092BC01E092BD01F092BE0103C08B31BB :1076C00009F0A5CE83E08093E9009091E8008091D5 :1076D000E8008E778093E80095FD11C08091E80066 :1076E00080FD04C08EB38111F9CF15C08091E800F0 :1076F0008E778093E80003C08EB3882361F0809179 :10770000E80080FFF9CF84E08093E9008091E800F1 :107710008B778093E800DF91CF91FF90EF90DF901F :10772000CF90BF90AF909F908F907F906F905F9021 :107730004F900895CF93309100081092000824B71D :1077400014BE88E10FB6F894809360001092600038 :107750000FBE90E080E80FB6F8948093610090939C :1077600061000FBE81E085BF82E085BF3F9A209A0D :10777000559A90E8909361001092610047985D9A45 :10778000289A109289009AEF9093880080936F0056 :1077900083E080938100E0E0F0E085919491019690 :1077A00019F081E08093BA0121FF20C0809100018F :1077B0003817E1F0809300087894809101018823C4 :1077C00039F08091B2019091B30188379140C8F3AC :1077D0001092010110920008F89481E08093010159 :1077E0008091BA01882371F0BDDC0CC020FF04C079 :1077F0008091BA018111F8CF23FF04C0809100016C :107800003813EECFD4D078941092B5011092B40111 :10781000CEEF80910101882301F138DD1CD38091E6 :10782000B4019091B50181349F4110F01092010193 :107830008091BF019091C00101969093C001809307 :10784000BF01292F97FF02C02C2F291B220F2817B9 :1078500010F44798DECF479ADCCF8091E00081603A :107860008093E0007FDC80E090E0CF910895292FA5 :1078700030E02230310539F02330310549F0213034 :10788000310561F410C08EE390E029E531E01EC0BF :10789000882371F0813089F08230A1F080E090E09F :1078A00020E030E013C082E190E027E931E00EC033 :1078B00084E090E025E531E009C08CE290E027E229 :1078C00031E004C08CE190E029E031E0FA0131833D :1078D000208308958093E900EBEEF0E080818160E1 :1078E0008083EDEEF0E010826093EC0040838091A5 :1078F000EE00881F8827881F08958091C30187FDA7 :1079000005C08091E80080FF0DC010C08091E800A4 :1079100082FD04C08EB38111F9CF08958091E800F3 :107920008B7707C08EB38111ECCF08958091E8006A :107930008E778093E80008950F931F93CF93DF9382 :1079400041D048D0C8EDD0E088818F778883888186 :107950008068888388818F7D888319BC1EBA1092C5 :10796000C10100EE10E0F80180818B7F8083888167 :107970008160888342E060E080E0ACDFE1EEF0E02F :1079800080818E7F8083E2EEF0E080818160808361 :10799000808188608083F80180818E7F80838881E8 :1079A00080618883DF91CF911F910F910895E7ED5A :1079B000F0E08081816080838AE482BF81E08093EF :1079C000C201BACFE8EDF0E080818E7F8083109213 :1079D000E20008951092DA001092E10008951F92DB :1079E0000F920FB60F9211242F933F934F935F93F3 :1079F0006F937F938F939F93AF93BF93EF93FF9377 :107A00008091DA0080FF1BC08091D80080FF17C0F2 :107A10008091DA008E7F8093DA008091D90080FF18 :107A20000BC080E189BD82E189BD09B400FEFDCFB4 :107A300081E08EBB0FD203C019BC1EBA0BD280915D :107A4000E10080FF17C08091E20080FF13C08091A9 :107A5000E2008E7F8093E2008091E200806180935B :107A6000E2008091D80080628093D80019BC85E044 :107A70008EBBF0D18091E10084FF2CC08091E200A8 :107A800084FF28C080E189BD82E189BD09B400FE80 :107A9000FDCF8091D8008F7D8093D8008091E10048 :107AA0008F7E8093E1008091E2008F7E8093E200E0 :107AB0008091E20081608093E2008091C101811198 :107AC00004C08091E30087FF02C084E001C081E030 :107AD0008EBBC0D18091E10083FF21C08091E20084 :107AE00083FF1DC08091E100877F8093E10082E0E9 :107AF0008EBB1092C1018091E1008E7F8093E100E6 :107B00008091E2008E7F8093E2008091E2008061AC :107B10008093E20042E060E080E0DCDE9BD1FF91F8 :107B2000EF91BF91AF919F918F917F916F915F91F5 :107B30004F913F912F910F900FBE0F901F9018956E :107B40002091C9013091CA012617370748F0611505 :107B5000710539F42091E8002E772093E80001C0E8 :107B6000B901FC0120E061157105A1F18EB38823F4 :107B7000E1F18530E1F18091E80083FD34C080912E :107B8000E80082FF06C08091E80082FF26C080E006 :107B900008958091E80080FFE6CF2091F300809166 :107BA000F20090E0922B6115710551F0883091053B :107BB00038F421912093F100615071090196F3CFBF :107BC00021E0089709F020E08091E8008E7780930B :107BD000E800C9CF2111CACFD6CF8EB3882329F0B0 :107BE000853089F604C081E0089582E0089583E03D :107BF00008956115710529F42091E8002B772093F1 :107C0000E8006115710521F12EB3222351F12530D1 :107C100051F12091E80023FD20C02091E80022FFCF :107C2000F3CFFC01CF014091F3002091F20030E04E :107C3000342B232B09F38091F1008193CF01615004 :107C4000710981F7D9CF8EB3882359F0853059F067 :107C50008091E80080FFF7CF02C081E0089580E0C6 :107C6000089582E0089583E008950F931F93CF93C2 :107C7000DF9300D0CDB7DEB7E3ECF1E08091F10007 :107C8000819381E0EB3CF807C9F7D2DA8091E800F4 :107C900083FFCBC02091C3013091C401832F90E0BA :107CA0008A30910508F0C1C0FC01EA5AF74CE4C0E3 :107CB000223809F0BAC08091C70187708093E9002B :107CC0009091EB001092E9008091E800877F80930B :107CD000E80095FB882780F98093F1001092F1006D :107CE00082C0822F8D7F09F0A0C0223009F09DC094 :107CF0008091C501811124C02091C701277009F42A :107D000094C02093E9008091EB0080FF19C080911E :107D1000EB00333011F4806211C080618093EB007E :107D200081E090E0022E01C0880F0A94EAF7809368 :107D3000EA001092EA008091EB0088608093EB00EB :107D40001092E9008091E800877F50C021116DC03A :107D50001091C5011F770FB7F8948091E800877FD5 :107D60008093E800CADD8091E80080FFFCCF80911D :107D7000E3008078812B8093E30080688093E300A8 :107D8000112311F083E001C082E08EBB0FBF4DC014 :107D90002058223008F049C0AE014F5F5F4F60911C :107DA000C7018091C5019091C60161DD009709F47A :107DB0003CC02091E800277F2093E800BC01898126 :107DC0009A81BEDE8091E8008B778093E8002DC019 :107DD000203859F58091E800877F8093E8008091F2 :107DE000C1018093F1008091E8008E778093E800D4 :107DF00084DD1BC0211119C09091C5019230A8F4F7 :107E00008091E800877F8093E8009093C10175DD41 :107E10008091C101811104C08091E30087FF02C0FD :107E200084E001C081E08EBBF7D98091E80083FF38 :107E30000AC08091EB0080628093EB008091E800A3 :107E4000877F8093E8000F900F90DF91CF911F9173 :107E50000F9108950895CF938EB3882359F0C09160 :107E6000E900C7701092E9008091E80083FDFDDE13 :107E7000C093E900CF910895EE0FFF1F0590F49194 :107E8000E02D0994F999FECF92BD81BDF89A99270A :107E900080B50895262FF999FECF1FBA92BD81BDF6 :107EA00020BD0FB6F894FA9AF99A0FBE019608957C :047EB000F894FFCF74 :107EB4007701000000000000081C03410072006408 :107EC40000750069006E006F002000730072006C82 :107ED400002000200000002C0341007200640075A3 :107EE4000069006E006F0020004C0065006F006E9A :107EF400006100720064006F0020004500540048D7 :107F040000200000000403090409023E00020100ED :107F1400803209040000010202010005240010015E :107F2400042402040524060001070582030800FF57 :107F340009040100020A0000000705040210000100 :107F4400070583021000011201100102000008035A :107F54002A40000100020100014341544552494EA8 :027F64004100DA :040000030000700089 :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/caterina/Caterina-LininoOne.hex ================================================ :107000005FC0000078C0000076C0000074C00000BF :1070100072C0000070C000006EC000006CC00000B4 :107020006AC0000068C00000DAC4000064C000004C :1070300062C0000060C000005EC000005CC00000D4 :107040005AC000009DC0000056C0000054C000009F :1070500052C0000050C000004EC000004CC00000F4 :107060004AC0000048C0000046C0000044C0000004 :1070700042C0000040C000003EC000003CC0000014 :107080003AC0000038C0000036C0000034C0000024 :1070900032C0000030C000002EC000002CC0000034 :1070A0002AC0000028C0000026C00000583E713EE3 :1070B000153F713E153FA63EC83E153FE83EFA3EDD :1070C00011241FBECFEFDAE0DEBFCDBF11E0A0E09C :1070D000B1E0E4EBFEE702C005900D92A83AB107DB :1070E000D9F721E0A8EAB1E001C01D92A13CB207A6 :1070F000E1F720D3DDC684CF84E08093E90080915E :10710000E80085FD0EC08091E8008B778093E80051 :107110008091E80082FDF3CF8EB38111F9CF80E03A :1071200008958091F100089593E09093E900909183 :10713000E80095FF0AC08093F1005D9884E690E036 :107140009093AF018093AE0108959091E8009E77EF :107150009093E8009091E80090FDEDCF9EB39111DF :10716000F9CF0895F89410926F001092810081E099 :1071700085BF15BE47985D9A289A0C940000089523 :107180001F920F920FB60F9211242F938F939F93FC :10719000EF93FF9310928500109284008091AE01CE :1071A0009091AF01009741F001979093AF018093C8 :1071B000AE01892B09F45D9A8091AC019091AD01EB :1071C000009741F001979093AD018093AC01892B1A :1071D00009F4289A8091A8019091A90101969093B1 :1071E000A9018093A801E0E0F0E0859194910196D7 :1071F00049F08091AA019091AB0101969093AB0167 :107200008093AA01FF91EF919F918F912F910F9001 :107210000FBE0F901F90189542E061EC82E05AD3A8 :1072200042E161E883E056D342E160E884E052C382 :107230008091B901982F9F77913239F59091BA01D9 :10724000903291F0913209F5813AF9F48091E80099 :10725000877F8093E80067E070E082E091E070D47F :107260008091E8008B770FC0813279F48091E8003B :10727000877F8093E80067E070E082E091E0B9D416 :107280008091E8008E778093E80008954F925F9296 :107290006F927F928F929F92AF92BF92CF92DF9226 :1072A000EF92FF92CF93DF9384E08093E900809187 :1072B000E80082FF30C2289884E690E09093AD0108 :1072C0008093AC0119DFD82F853481F48CE49DE1E3 :1072D0009093AB018093AA0107B600FCFDCFF9990A :1072E000FECF81E180935700E89503C0843521F4F7 :1072F00003DF8DE019DFE6C18C34D9F38035C9F3A3 :10730000843721F484E410DF80E0F4CF813611F477 :1073100089E5F0CF813491F4EFDEC82FEDDE90E007 :10732000880F991F2C2F30E0322F2227330F822B0A :10733000932BAA2797FDA095BA2F98C1803711F4F7 :1073400083E5D8CF833549F4CFE9D1E08991ECDEEC :1073500021E0C63AD207D1F7B5C1863521F481E3E1 :10736000E3DE80E3C7CF833731F487E8DDDE85E9EC :10737000DBDE8EE1BFCF8536B9F4E0E0F0E083E0FC :1073800095E080935700E89507B600FCFDCF9093F9 :107390005700E89507B600FCFDCFE058FF4FE11518 :1073A00020E7F20771F7A5CF823719F4E1E0F0E0AA :1073B0000EC0863419F4E0E0F0E009C08E3419F410 :1073C000E3E0F0E004C0813539F4E2E0F0E089E088 :1073D0008093570084918ECF823631F489E5A4DE04 :1073E00080E0A2DE80E886CF823419F0873609F08B :1073F000D5C01092AB011092AA017EDED82E7CDEA1 :10740000E82E7ADEC82F8BEB8C0F823010F08FE3E2 :1074100071CFF12CFD2810926F00D73609F045C0CE :1074200081E180935700E8955701912CD1E0A11498 :10743000B10409F4AFC0C090B101D090B201E090A6 :10744000B301F090B401C634B9F4E92DF0E0EC29B1 :10745000FD29849169DE992069F082E0C80ED11C73 :10746000E11CF11CC092B101D092B201E092B301D3 :10747000F092B4019D2615C0D701C601B695A79517 :1074800097958795FFD450DEE2E0CE0ED11CE11C2B :10749000F11CC092B101D092B201E092B301F0921E :1074A000B401F1E0AF1AB108C2CF8090B101909061 :1074B000B201A090B301B090B401C63421F0C12C48 :1074C000D12CD1E030C083E0F40180935700E895DF :1074D00007B600FCFDCFF3CFC63461F5DD2039F1EE :1074E0004090B1015090B2016090B3017090B4012E :1074F00003DE2C2D30E0382BF2010901D093570028 :10750000E8951124F2E04F0E511C611C711C409251 :10751000B1015092B2016092B3017092B401DD26C4 :1075200021E0E21AF108E114F104B1F627C0E4DD2C :10753000C82EF5CFE1DD682F8091B1019091B201A5 :10754000A091B301B091B401B695A7959795879591 :10755000A1D44091B1015091B2016091B3017091F9 :10756000B4014E5F5F4F6F4F7F4F4093B101509317 :10757000B2016093B3017093B401D2CFC63441F429 :1075800085E0F40180935700E89507B600FCFDCF35 :107590008DE0CADD82E080936F0094C0833471F483 :1075A000C091B101D091B201A7DD90E021E0FE01D0 :1075B0000C0120935700E89511249BCE833601F5EA :1075C000C090B101D090B201E090B301F090B4014D :1075D00093DDF601E16090E021E00C01209357007B :1075E000E8951124F2E0CF0ED11CE11CF11CC092F1 :1075F000B101D092B201E092B301F092B40179CE20 :107600008D3661F4E091B101F091B20185E0809393 :107610005700E89507B600FCFDCF6BCE823551F4DC :10762000E091B101F091B201C591D4918D2F7CDD33 :107630008C2F60CE843419F55FDD682F8091B10105 :107640009091B201A091B301B091B401B695A79504 :10765000979587951FD48091B1019091B201A09127 :10766000B301B091B4010296A11DB11D8093B10187 :107670009093B201A093B301B093B4013ACE843693 :10768000F1F4C090B101D090B201E090B301F0905C :10769000B401D701C601B695A79597958795F2D302 :1076A00043DD22E0C20ED11CE11CF11CC092B101ED :1076B000D092B201E092B301F092B40103C08B31D9 :1076C00009F0A5CE83E08093E9009091E8008091D5 :1076D000E8008E778093E80095FD11C08091E80066 :1076E00080FD04C08EB38111F9CF15C08091E800F0 :1076F0008E778093E80003C08EB3882361F0809179 :10770000E80080FFF9CF84E08093E9008091E800F1 :107710008B778093E800DF91CF91FF90EF90DF901F :10772000CF90BF90AF909F908F907F906F905F9021 :107730004F900895CF93309100081092000824B71D :1077400014BE88E10FB6F894809360001092600038 :107750000FBE90E080E80FB6F8948093610090939C :1077600061000FBE81E085BF82E085BF3F9A209A0D :10777000559A90E8909361001092610047985D9A45 :10778000289A109289009AEF9093880080936F0056 :1077900083E080938100E0E0F0E085919491019690 :1077A00019F081E08093B00121FF20C08091000199 :1077B0003817E1F0809300087894809101018823C4 :1077C00039F08091A8019091A90188379140C8F3C0 :1077D0001092010110920008F89481E08093010159 :1077E0008091B001882371F0BDDC0CC020FF04C083 :1077F0008091B0018111F8CF23FF04C08091000176 :107800003813EECFD4D078941092AB011092AA0125 :10781000CEEF80910101882301F138DD1CD38091E6 :10782000AA019091AB0181349F4110F010920101A7 :107830008091B5019091B60101969093B601809325 :10784000B501292F97FF02C02C2F291B220F2817C3 :1078500010F44798DECF479ADCCF8091E00081603A :107860008093E0007FDC80E090E0CF910895292FA5 :1078700030E02230310539F02330310549F0213034 :10788000310561F410C08EE390E02FE431E01EC0BA :10789000882371F0813089F08230A1F080E090E09F :1078A00020E030E013C082E190E02DE831E00EC02E :1078B00084E090E02BE431E009C082E290E027E22E :1078C00031E004C08CE190E029E031E0FA0131833D :1078D000208308958093E900EBEEF0E080818160E1 :1078E0008083EDEEF0E010826093EC0040838091A5 :1078F000EE00881F8827881F08958091B90187FDB1 :1079000005C08091E80080FF0DC010C08091E800A4 :1079100082FD04C08EB38111F9CF08958091E800F3 :107920008B7707C08EB38111ECCF08958091E8006A :107930008E778093E80008950F931F93CF93DF9382 :1079400041D048D0C8EDD0E088818F778883888186 :107950008068888388818F7D888319BC1EBA1092C5 :10796000B70100EE10E0F80180818B7F8083888171 :107970008160888342E060E080E0ACDFE1EEF0E02F :1079800080818E7F8083E2EEF0E080818160808361 :10799000808188608083F80180818E7F80838881E8 :1079A00080618883DF91CF911F910F910895E7ED5A :1079B000F0E08081816080838AE482BF81E08093EF :1079C000B801BACFE8EDF0E080818E7F808310921D :1079D000E20008951092DA001092E10008951F92DB :1079E0000F920FB60F9211242F933F934F935F93F3 :1079F0006F937F938F939F93AF93BF93EF93FF9377 :107A00008091DA0080FF1BC08091D80080FF17C0F2 :107A10008091DA008E7F8093DA008091D90080FF18 :107A20000BC080E189BD82E189BD09B400FEFDCFB4 :107A300081E08EBB0FD203C019BC1EBA0BD280915D :107A4000E10080FF17C08091E20080FF13C08091A9 :107A5000E2008E7F8093E2008091E200806180935B :107A6000E2008091D80080628093D80019BC85E044 :107A70008EBBF0D18091E10084FF2CC08091E200A8 :107A800084FF28C080E189BD82E189BD09B400FE80 :107A9000FDCF8091D8008F7D8093D8008091E10048 :107AA0008F7E8093E1008091E2008F7E8093E200E0 :107AB0008091E20081608093E2008091B7018111A2 :107AC00004C08091E30087FF02C084E001C081E030 :107AD0008EBBC0D18091E10083FF21C08091E20084 :107AE00083FF1DC08091E100877F8093E10082E0E9 :107AF0008EBB1092B7018091E1008E7F8093E100F0 :107B00008091E2008E7F8093E2008091E2008061AC :107B10008093E20042E060E080E0DCDE9BD1FF91F8 :107B2000EF91BF91AF919F918F917F916F915F91F5 :107B30004F913F912F910F900FBE0F901F9018956E :107B40002091BF013091C0012617370748F0611519 :107B5000710539F42091E8002E772093E80001C0E8 :107B6000B901FC0120E061157105A1F18EB38823F4 :107B7000E1F18530E1F18091E80083FD34C080912E :107B8000E80082FF06C08091E80082FF26C080E006 :107B900008958091E80080FFE6CF2091F300809166 :107BA000F20090E0922B6115710551F0883091053B :107BB00038F421912093F100615071090196F3CFBF :107BC00021E0089709F020E08091E8008E7780930B :107BD000E800C9CF2111CACFD6CF8EB3882329F0B0 :107BE000853089F604C081E0089582E0089583E03D :107BF00008956115710529F42091E8002B772093F1 :107C0000E8006115710521F12EB3222351F12530D1 :107C100051F12091E80023FD20C02091E80022FFCF :107C2000F3CFFC01CF014091F3002091F20030E04E :107C3000342B232B09F38091F1008193CF01615004 :107C4000710981F7D9CF8EB3882359F0853059F067 :107C50008091E80080FFF7CF02C081E0089580E0C6 :107C6000089582E0089583E008950F931F93CF93C2 :107C7000DF9300D0CDB7DEB7E9EBF1E08091F10002 :107C8000819381E0E13CF807C9F7D2DA8091E800FE :107C900083FFCBC02091B9013091BA01832F90E0CE :107CA0008A30910508F0C1C0FC01EA5AF74CE4C0E3 :107CB000223809F0BAC08091BD0187708093E90035 :107CC0009091EB001092E9008091E800877F80930B :107CD000E80095FB882780F98093F1001092F1006D :107CE00082C0822F8D7F09F0A0C0223009F09DC094 :107CF0008091BB01811124C02091BD01277009F43E :107D000094C02093E9008091EB0080FF19C080911E :107D1000EB00333011F4806211C080618093EB007E :107D200081E090E0022E01C0880F0A94EAF7809368 :107D3000EA001092EA008091EB0088608093EB00EB :107D40001092E9008091E800877F50C021116DC03A :107D50001091BB011F770FB7F8948091E800877FDF :107D60008093E800CADD8091E80080FFFCCF80911D :107D7000E3008078812B8093E30080688093E300A8 :107D8000112311F083E001C082E08EBB0FBF4DC014 :107D90002058223008F049C0AE014F5F5F4F60911C :107DA000BD018091BB019091BC0161DD009709F498 :107DB0003CC02091E800277F2093E800BC01898126 :107DC0009A81BEDE8091E8008B778093E8002DC019 :107DD000203859F58091E800877F8093E8008091F2 :107DE000B7018093F1008091E8008E778093E800DE :107DF00084DD1BC0211119C09091BB019230A8F401 :107E00008091E800877F8093E8009093B70175DD4B :107E10008091B701811104C08091E30087FF02C007 :107E200084E001C081E08EBBF7D98091E80083FF38 :107E30000AC08091EB0080628093EB008091E800A3 :107E4000877F8093E8000F900F90DF91CF911F9173 :107E50000F9108950895CF938EB3882359F0C09160 :107E6000E900C7701092E9008091E80083FDFDDE13 :107E7000C093E900CF910895EE0FFF1F0590F49194 :107E8000E02D0994F999FECF92BD81BDF89A99270A :107E900080B50895262FF999FECF1FBA92BD81BDF6 :107EA00020BD0FB6F894FA9AF99A0FBE019608957C :047EB000F894FFCF74 :107EB4007701000000000000081C0364006F0067E5 :107EC400002000680075006E0074006500720020D8 :107ED4000041004700000022034C0069006E006965 :107EE400006E006F0020004F006E0065002000202F :107EF40000200020002000200000000403090409E1 :107F0400023E000201008032090400000102020165 :107F140000052400100104240204052406000107BE :107F24000582030800FF09040100020A000000079B :107F3400050402100001070583021000011201105C :107F44000102000008032A010001000201000143AC :087F540041544552494E410021 :040000030000700089 :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/caterina/Caterina-Micro.hex ================================================ :200000000C946E010C9496010C9496010C9496010C9496010C9496010C9496010C94960150 :200020000C9496010C9496010C94F8040C947F050C9496010C9496010C9496010C949601B6 :200040000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C94B501C9 :200060000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601C8 :200080000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601A8 :2000A0000C9496010C9496010C94960100000000240027002A002D003000000000002500A4 :2000C00028002B002E003100000000002300260029002C002F00040404040403040502027D :2000E0000202040302020202060606060606040402020204040802011040804010204080A8 :200100004080080204018040201002011080102040400000000200080E0000030401000BB2 :200120000000070605040100080A0B0C0D09040309042203410072006400750069006E00CD :200140006F0020004D006900630072006F00200020002000180341007200640075006900A6 :200160006E006F0020004C004C00430012010002000000404123378000010102000112011F :200180000002020000404123378000010102000100C18081C1080B00020202010009040051 :2001A000000102020000052400100105240101010424020605240600010705810310004094 :2001C00009040100020A000000070502024000000705830240000005010902A1010901A186 :2001E000008501050919012903150025019503750181029501750581030501093009310943 :20020000381581257F750895038106C0C005010906A1018502050719E029E715002501754D :20022000019508810295017508810395067508150025650507190029658100C0090402004C :2002400001030000000921010100012265000705840340000100000000000000002A2B2895 :200260000000000000000000000000000000000000000000002C9EB4A0A1A2A434A6A7A553 :20028000AE362D3738271E1F20212223242526B333B62EB7B89F8485868788898A8B8C8D58 :2002A0008E8F909192939495969798999A9B9C9D2F3130A3AD350405060708090A0B0C0D7C :2002C0000E0F101112131415161718191A1B1C1DAFB1B0B5000032041207170811241FBE81 :2002E000CFEFDAE0DEBFCDBF11E0A0E0B1E0E4EAF2E102C005900D92AC32B107D9F711E06D :20030000ACE2B1E001C01D92AD39B107E1F712E0CCEDD2E004C02297FE010E944C09C63D05 :20032000D107C9F70E946C030C9450090C9400008091000161E00E94390368EE73E080E041 :2003400090E00E94FD018091000160E00E94390368EE73E080E090E00E94FD010895809196 :20036000000161E00E94AC0208951F920F920FB60F9211242F933F938F939F93AF93BF93E5 :200380008091300190913101A0913201B0913301309134010196A11DB11D232F2D5F2D3794 :2003A00020F02D570196A11DB11D209334018093300190933101A0933201B0933301809117 :2003C0002C0190912D01A0912E01B0912F010196A11DB11D80932C0190932D01A0932E01BA :2003E000B0932F01BF91AF919F918F913F912F910F900FBE0F901F9018959B01AC017FB734 :20040000F89480912C0190912D01A0912E01B0912F0166B5A89B05C06F3F19F00196A11DC3 :20042000B11D7FBFBA2FA92F982F8827860F911DA11DB11D62E0880F991FAA1FBB1F6A9577 :20044000D1F7BC012DC0FFB7F89480912C0190912D01A0912E01B0912F01E6B5A89B05C0E7 :20046000EF3F19F00196A11DB11DFFBFBA2FA92F982F88278E0F911DA11DB11DE2E0880FFD :20048000991FAA1FBB1FEA95D1F7861B970B885E9340C8F2215030404040504068517C4F8F :2004A000211531054105510571F60895789484B5826084BD84B5816084BD85B5826085BD0F :2004C00085B5816085BDEEE6F0E0808181608083E1E8F0E010828081826080838081816043 :2004E0008083E0E8F0E0808181608083E1E9F0E0808182608083808181608083E0E9F0E07E :20050000808181608083E1ECF0E0808184608083808182608083808181608083E3ECF0E007 :20052000808181608083E0ECF0E0808182608083E2ECF0E0808181608083EAE7F0E080812F :20054000846080838081826080838081816080838081806880830895CF93DF93482F50E0E5 :20056000CA018C509F4FFC0134914A525F4FFA018491882369F190E0880F991FFC01E455D0 :20058000FF4FA591B491FC01E654FF4FC591D491662351F42FB7F8948C91932F9095892362 :2005A0008C93888189230BC0623061F42FB7F8948C91932F909589238C938881832B8883B2 :2005C0002FBF06C09FB7F8948C91832B8C939FBFDF91CF910895883071F1893068F48230EF :2005E00031F1833020F4813009F042C01DC0833089F08430E9F512C08B3059F18C3028F41C :200600008930E9F08A30A1F51EC08C3031F18E3079F529C0809180008F7703C0809180003C :200620008F7D80938000089584B58F7702C084B58F7D84BD0895809190008F7707C08091DB :2006400090008F7D03C080919000877F8093900008958091C0008F7703C08091C0008F7DDD :200660008093C00008958091C200877F8093C2000895FF920F931F93F62E482F50E0CA0144 :200680008E5E9E4FFC012491CA018C509F4FFC0114914A525F4FFA0104910023C9F022239D :2006A00019F0822F0E94EB02E02FF0E0EE0FFF1FE654FF4FA591B4919FB7F894FF2021F4DE :2006C0008C911095812302C08C91812B8C939FBF1F910F91FF900895CF93DF930E94560262 :2006E0008DE391E00E9433040E94AF01C0E0D0E00E9498012097E1F30E940000F9CF282F17 :20070000809137018823C1F057FF1AC015C0289A909336018091F1008193E217F307B9F75A :200720004115510539F08091F200882319F48BE68093E800AFBF02C04FEF5FEFCA01089599 :20074000AFB7F89427702093E9008091F200282F30E0241735070CF4A901FB019B01240F1E :20076000311D94E6DACFDF93CF930F92CDB7DEB7BE016F5F7F4F41E050E00E947F03019712 :2007800019F02FEF3FEF03C08981282F30E0C9010F90CF91DF910895FF920F931F93F82EEF :2007A000142F052F40913A0150913B01212F302FC901DC01FB016EEF29C0F7FE02C0949125 :2007C00001C09081209138013091390124173507ACF48091E8008570E1F38091E80082FF0F :2007E00003C02FEF3FEF17C09093F100C90101968F739070892B11F46093E8002F5F3F4FEC :200800003093390120933801119731961097A9F6812F902F9C01C9011F910F91FF900895E8 :200820009C018091E80082FFFCCFF901260F311D03C08091F1008193E217F307D1F7289A03 :2008400084E6809336018BEF8093E800CB0108958093E9008091F200882319F08AE38093D3 :20086000E800089508951092370181E08093D70080EA8093D80082E189BD09B400FEFDCFAC :2008800061E070E080E090E00E94FD0180E98093D8008CE08093E2001092E000559A209A77 :2008A0005D98289808955F926F927F928F929F92AF92BF92CF92DF92EF92FF920F931F93C7 :2008C000CF93DF93E82E842E752E80913701882371F18B01242F352FC901EC017AEFF72EFB :2008E00067E0962E9E2050E4552E8E2D90E040E2A42EB12CA822B9223AE3632E20E4C22E35 :20090000D12CC822D92258C09FB7F8949092E9008091E80085FD02C020E004C08091F200EC :20092000252D281B9FBF222361F4FA9419F42FEF3FEF4DC061E070E080E090E00E94FD0135 :200940003BC0822F90E0C817D9070CF42C2FC21BD1094FB7F8949092E900A114B10421F48E :2009600006C01092F10021502223D9F719C0E7FC03C0F801922F10C0C801322F06C0FC01A2 :200980000196E491E093F10031503323C1F706C081918093F10091509923D1F7020F111DD8 :2009A0008091E80085FF05C0209729F4C114D10411F06092E8004FBF209709F0A5CF5D9A73 :2009C00084E680933501282D372DC9019C01C901DF91CF911F910F91FF90EF90DF90CF907E :2009E000BF90AF909F908F907F906F905F9008951F920F920FB60F9211242F933F934F931E :200A00005F936F937F938F939F93AF93BF93EF93FF938091E1001092E100982F83FF0FC047 :200A20001092E90081E08093EB001092EC0082E38093ED001092370188E08093F00092FF03 :200A400034C083E08093E9008091F200882319F08AE38093E8008FB7F89492E09093E900D4 :200A60009091F2008FBF992321F082E891E00E94550780913501882351F080913501815024 :200A80008093350180913501882309F45D9880913601882351F08091360181508093360192 :200AA00080913601882309F42898FF91EF91BF91AF919F918F917F916F915F914F913F91E6 :200AC0002F910F900FBE0F901F9018950F931F93DF93CF930F92CDB7DEB719828E010F5F75 :200AE0001F4FC8010E947B07C8010E941409898190E00F90CF91DF911F910F9108951F928C :200B00000F920FB60F921124EF92FF921F932F933F934F935F936F937F938F939F93AF93C3 :200B2000BF93EF93FF93DF93CF93CDB7DEB76197DEBFCDBF1092E9008091E80083FF0FC16B :200B4000FE0131969E01275F3F4F03C08091F1008193E217F307D1F7289A84E68093360112 :200B600082EF8093E800998197FF05C08091E80080FFFCCF03C08EEF8093E800292F30E0AE :200B8000C90180769070892B09F0C2C08A81882329F41092F1001092F100D6C0813009F429 :200BA000D3C0833009F4D0C0853049F48091E80080FFFCCF8B8180688093E300C5C0863008 :200BC00009F07CC01C81EF80F8841230C1F51092E900109239011092380110923B0110929E :200BE0003A010E94660599E0FE013996DF01292F1D922A95E9F799871A8791E09E8790E811 :200C0000988B9AEF998B2091380130913901275F3F4F3C872B878D871092E900109239011B :200C200010923801F0923B01E0923A0180E0BF0149E050E00E94CC030E94660585C0109290 :200C4000E9001092390110923801F0923B01E0923A01123241F482E290E00E940C09892BD1 :200C600009F476C071C0113079F488E0E816F10419F481E080933C0180913C01882309F057 :200C80006BC0ECE6F1E013C0133009F061C08B81882319F4EEE2F1E00AC0823019F4E2E3A3 :200CA000F1E005C0813009F053C0E4E5F1E0449180E8BF0150E00E94CC0346C0873009F4EF :200CC00047C0883021F481E08093F1003DC08930D9F523703070232BD9F5E1E9F1E091E0FC :200CE00031E026E39093E9003093EB0084918093EC002093ED009F5F3196953099F78EE7DD :200D00008093EA001092EA008B81809337011CC08F8198851092E9001092390110923801A8 :200D200090933B0180933A018D81882329F4CE0101960E94870706C0823051F4CE01019677 :200D40000E94DD07882321F08EEF8093E80007C081E28093EB0003C0EEE7F1E0A8CF6196DA :200D6000DEBFCDBFCF91DF91FF91EF91BF91AF919F918F917F916F915F914F913F912F911A :200D80001F91FF90EF900F900FBE0F901F90189520917E0130917F01809180019091810188 :200DA000281B390B2F733070C901089520917E0130917F01809180019091810128173907DE :200DC00019F42FEF3FEF09C0E0918001F0918101E25CFE4F8081282F30E0C90108952091F1 :200DE0007E0130917F0180918001909181012817390719F42FEF3FEF13C0E0918001F091E0 :200E00008101E25CFE4F2081809180019091810101968F739070909381018093800130E00D :200E2000C9010895109285011092840188EE93E0A0E0B0E08093860190938701A093880102 :200E4000B093890180E191E0909383018093820108950F931F93DF93CF930F92CDB7DEB737 :200E60008C01698380910901882369F083E0BE016F5F7F4F41E050E00E9453041816190685 :200E800014F49C0107C081E090E0F8019383828320E030E0C9010F90CF91DF911F910F9168 :200EA000089583E00E9428040895CF93DF9312C082E00E94B3032FEF8F3F9207C9F0E091B8 :200EC0007E01F0917F01E25CFE4F8083D0937F01C0937E01C0917E01D0917F012196CF73A5 :200EE000D0708091800190918101C817D90701F7DF91CF910895FC0180818E5F808380E803 :200F000065E971E042E450E00E94CC030895FC0181819081913A59F4813209F04CC080E08E :200F200062E071E047E050E00E94CC0342C0913209F041C0803239F482E091E067E070E04E :200F40000E94100436C0823209F035C08281809309018091020190910301A0910401B09173 :200F60000501805B9440A040B04019F58091090180FD12C087E797E7909301088093000841 :200F80002BE088E190E00FB6F894A895809360000FBE209360000DC088E10FB6F8948093F2 :200FA0006000109260000FBEA895109201081092000881E0089580E00895FC019181808165 :200FC000813A31F4913089F080E0933089F40DC0813269F49B3021F4828180930A0105C0B4 :200FE0009A3029F4828180930B0181E0089580E00895EF92FF920F931F938C01E62EDC0109 :20100000ED91FC910480F581E02D0995F82ED801ED91FC910680F781E02DC8016E2D099509 :201020008F2D90E01F910F91FF90EF90089510929001109294011092930182E291E09093F1 :201040009201809391010895EF92FF920F931F93DF93CF930F92CDB7DEB789838B017A01B4 :2010600084E0BE016F5F7F4F41E050E00E94530484E4B801A7010E9453040F90CF91DF9136 :201080001F910F91FF90EF90089582E048E050E00E9424080895FC011682178210861186D5 :2010A0001286138614823496BF010E9445080895DC01683810F0685829C0E62FF0E067FFE2 :2010C00013C0E058F04081E090E002C0880F991FEA95E2F7809514962C911497282314967F :2010E0002C93149760E012C0EB5AFD4F6491662319F420E030E01DC067FF08C014968C9176 :2011000014978D7F14968C9314976F77FD0190E0662321F08681861709F416829F5F3196B8 :201120009630B1F7CD011496BD010E94450821E030E0C9010895CF93DF93DC01683810F053 :20114000685825C0E62FF0E067FF12C0E058F04081E090E002C0880F991FEA95E2F7149681 :201160002C911497282B14962C93149760E00FC0EB5AFD4F64916623D9F167FF08C01496E0 :201180008C911497826014968C9314976F7716968C9116978617A9F117968C911797861789 :2011A00081F118968C911897861759F119968C911997861731F11A968C911A97861709F10C :2011C0001B968C911B978617E1F0ED01E0E0F0E09E2F8E81882321F4EA0FFB1F668306C045 :2011E0009F5F31962196E630F10591F7963049F481E090E013969C938E93129720E030E059 :2012000007C0CD011496BD010E94450821E030E0C901DF91CF91089580E867ED71E045E662 :2012200050E00E94CC030895FC0180818F5F808380E86CE372E049E150E00E94CC03089510 :20124000CF92DF92EF92FF920F931F93CF93DF937C016B018A01C0E0D0E00FC0D6016D911A :201260006D01D701ED91FC910190F081E02DC7010995C80FD91F015010400115110571F7A4 :20128000CE01DF91CF911F910F91FF90EF90DF90CF900895EE0FFF1F0590F491E02D099407 :2012A000F894FFCF0D0000E100000000000001010000000029072009C806EF06D606510794 :2012C000550700000000F90720099B0858084B08FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :2012E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :20130000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :20132000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20134000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20136000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20138000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :2013A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :2013C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2013E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :20140000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :20142000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20144000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20146000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20148000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :2014A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :2014C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2014E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :20150000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :20152000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20154000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20156000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20158000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :2015A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :2015C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2015E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :20160000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :20162000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20164000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20166000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20168000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :2016A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :2016C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2016E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :20170000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :20172000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20174000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20176000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20178000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :2017A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :2017C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2017E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :20180000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :20182000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20184000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20186000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20188000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :2018A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :2018C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2018E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :20190000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :20192000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :20194000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20196000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20198000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :2019A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :2019C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2019E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :201A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :201A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :201A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :201A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :201A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :201AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :201AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :201AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :201B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :201B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :201B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :201B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :201B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :201BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :201BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :201BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :201C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :201C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :201C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :201C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :201C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :201CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :201CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :201CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :201D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :201D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :201D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :201D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :201D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :201DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :201DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :201DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :201E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :201E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :201E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :201E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :201E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :201EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :201EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :201EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :201F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :201F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :201F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :201F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :201F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :201FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :201FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :201FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :20200000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :20202000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20204000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20206000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20208000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :2020A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :2020C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2020E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :20210000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :20212000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20214000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20216000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20218000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :2021A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :2021C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2021E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :20220000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :20222000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20224000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20226000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20228000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :2022A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :2022C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2022E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :20230000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :20232000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20234000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20236000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20238000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :2023A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :2023C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2023E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :20240000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :20242000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20244000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20246000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20248000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :2024A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :2024C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2024E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :20250000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :20252000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20254000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20256000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20258000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :2025A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :2025C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2025E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :20260000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :20262000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20264000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20266000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20268000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :2026A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :2026C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2026E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :20270000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :20272000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20274000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20276000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20278000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :2027A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :2027C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2027E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :20280000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :20282000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20284000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20286000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20288000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :2028A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :2028C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2028E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :20290000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :20292000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :20294000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20296000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20298000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :2029A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :2029C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2029E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :202A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :202A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :202A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :202A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :202A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :202AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :202AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :202AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :202B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :202B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :202B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :202B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :202B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :202BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :202BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :202BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :202C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :202C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :202C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :202C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :202C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :202CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :202CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :202CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :202D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :202D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :202D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :202D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :202D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :202DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :202DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :202DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :202E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :202E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :202E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :202E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :202E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :202EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :202EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :202EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :202F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :202F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :202F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :202F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :202F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :202FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :202FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :202FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :20300000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 :20302000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 :20304000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 :20306000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 :20308000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 :2030A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 :2030C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 :2030E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 :20310000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF :20312000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF :20314000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F :20316000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F :20318000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F :2031A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F :2031C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F :2031E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF :20320000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE :20322000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE :20324000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E :20326000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E :20328000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E :2032A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E :2032C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :2032E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE :20330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20332000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20334000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20336000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :20338000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :2033A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2033C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :2033E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :20340000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20342000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20344000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20346000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :20348000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :2034A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2034C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :2034E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :20350000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20352000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20354000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20356000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :20358000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :2035A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2035C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :2035E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :20360000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20362000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20364000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20366000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :20368000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :2036A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2036C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :2036E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :20370000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20372000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20374000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20376000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :20378000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :2037A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2037C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :2037E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :20380000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20382000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20384000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20386000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :20388000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :2038A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2038C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :2038E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :20390000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :20392000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20394000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20396000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :20398000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :2039A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2039C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :2039E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :203A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :203A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :203A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :203A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :203A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :203AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :203AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :203AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :203B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :203B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :203B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :203B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :203B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :203BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :203BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :203BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :203C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :203C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :203C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :203C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :203C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :203CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :203CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :203CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :203D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :203D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :203D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :203D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :203D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :203DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :203DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :203DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :203E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :203E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :203E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :203E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :203E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :203EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :203EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :203EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :203F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :203F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :203F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :203F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :203F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :203FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :203FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :203FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :20400000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20402000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20404000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20406000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :20408000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :2040A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2040C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :2040E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :20410000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20412000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20414000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20416000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :20418000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :2041A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2041C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :2041E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :20420000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20422000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20424000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20426000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :20428000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :2042A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2042C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :2042E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :20430000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20432000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20434000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20436000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :20438000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :2043A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2043C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :2043E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :20440000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20442000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20444000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20446000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :20448000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :2044A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2044C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :2044E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :20450000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20452000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20454000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20456000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :20458000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :2045A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2045C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :2045E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :20460000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20462000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20464000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20466000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :20468000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :2046A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2046C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :2046E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :20470000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20472000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20474000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20476000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :20478000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :2047A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2047C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :2047E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :20480000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20482000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20484000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20486000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :20488000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :2048A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2048C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :2048E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :20490000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :20492000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20494000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20496000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :20498000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :2049A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2049C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :2049E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :204A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :204A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :204A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :204A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :204A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :204AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :204AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :204AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :204B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :204B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :204B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :204B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :204B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :204BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :204BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :204BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :204C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :204C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :204C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :204C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :204C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :204CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :204CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :204CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :204D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :204D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :204D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :204D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :204D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :204DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :204DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :204DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :204E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :204E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :204E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :204E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :204E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :204EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :204EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :204EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :204F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :204F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :204F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :204F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :204F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :204FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :204FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :204FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :20500000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 :20502000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 :20504000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 :20506000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 :20508000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 :2050A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 :2050C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 :2050E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 :20510000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF :20512000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F :20514000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F :20516000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F :20518000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F :2051A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F :2051C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF :2051E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF :20520000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE :20522000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E :20524000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E :20526000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E :20528000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E :2052A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :2052C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE :2052E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE :20530000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20532000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20534000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :20536000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :20538000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2053A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :2053C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :2053E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20540000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20542000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20544000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :20546000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :20548000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2054A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :2054C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :2054E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20550000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20552000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20554000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :20556000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :20558000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2055A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :2055C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :2055E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20560000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20562000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20564000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :20566000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :20568000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2056A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :2056C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :2056E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20570000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20572000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20574000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :20576000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :20578000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2057A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :2057C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :2057E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20580000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20582000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20584000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :20586000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :20588000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2058A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :2058C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :2058E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20590000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20592000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20594000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :20596000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :20598000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2059A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :2059C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :2059E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :205A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :205A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :205A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :205A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :205A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :205AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :205AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :205AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :205B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :205B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :205B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :205B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :205B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :205BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :205BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :205BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :205C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :205C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :205C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :205C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :205C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :205CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :205CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :205CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :205D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :205D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :205D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :205D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :205D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :205DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :205DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :205DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :205E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :205E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :205E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :205E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :205E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :205EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :205EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :205EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :205F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :205F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :205F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :205F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :205F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :205FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :205FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :205FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :20600000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20602000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20604000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :20606000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :20608000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2060A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :2060C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :2060E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20610000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20612000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20614000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :20616000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :20618000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2061A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :2061C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :2061E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20620000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20622000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20624000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :20626000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :20628000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2062A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :2062C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :2062E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20630000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20632000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20634000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :20636000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :20638000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2063A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :2063C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :2063E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20640000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20642000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20644000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :20646000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :20648000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2064A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :2064C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :2064E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20650000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20652000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20654000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :20656000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :20658000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2065A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :2065C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :2065E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20660000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20662000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20664000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :20666000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :20668000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2066A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :2066C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :2066E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20670000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20672000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20674000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :20676000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :20678000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2067A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :2067C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :2067E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20680000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20682000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20684000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :20686000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :20688000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2068A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :2068C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :2068E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20690000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20692000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20694000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :20696000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :20698000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2069A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :2069C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :2069E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :206A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :206A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :206A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :206A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :206A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :206AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :206AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :206AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :206B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :206B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :206B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :206B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :206B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :206BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :206BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :206BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :206C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :206C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :206C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :206C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :206C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :206CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :206CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :206CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :206D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :206D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :206D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :206D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :206D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :206DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :206DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :206DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :206E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :206E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :206E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :206E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :206E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :206EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :206EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :206EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :206F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :206F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :206F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :206F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :206F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :206FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :206FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :206FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :2070000055C000006EC000006CC000006AC0000068C0000066C0000064C0000062C0000043 :2070200060C000005EC00000F2C400005AC0000058C0000056C0000054C0000052C00000EE :2070400050C0000078C000004CC000004AC0000048C0000046C0000044C0000042C00000BE :2070600040C000003EC000003CC000003AC0000038C0000036C0000034C0000032C0000048 :2070800030C000002EC000002CC000002AC0000028C0000026C0000024C0000022C00000A8 :2070A00020C000001EC000001CC0000011241FBECFEFDAE0DEBFCDBF11E0A0E0B1E0E2E3BC :2070C000FFE702C005900D92A83AB107D9F711E0A8EAB1E001C01D92AE3BB107E1F78FD30B :2070E00026C78ECFF89410926F0010928100109285001092840081E085BF15BE47985D98ED :2071000028980C94000008952091B2013091B3012F5F3F4F3093B3012093B201932F37FFA8 :2071200003C08EEF831B982F990F921710F447980895479A08951F920F920FB60F9211246E :207140002F938F939F93EF93FF9310928500109284008091A8019091A901009741F00197D3 :207160009093A9018093A801892B09F45D988091AA019091AB01009741F001979093AB0128 :207180008093AA01892B09F42898E0E0F0E0859194918F5F9F4F49F08091AC019091AD0153 :2071A00001969093AD018093AC01FF91EF919F918F912F910F900FBE0F901F90189584E0BC :2071C0008093E9000DC08091E8008B778093E80003C08EB3882351F08091E80082FFF9CFBE :2071E0008091E80085FFEFCF8091F1000895982F83E08093E9008091E80085FD0DC0809136 :20720000E8008E778093E80003C08EB3882369F08091E80080FFF9CF9093F1005D9A84E6C9 :2072200090E09093A9018093A80108954F925F926F927F928F929F92AF92BF92CF92DF921E :20724000EF92FF920F931F93CF93DF9384E08093E9008091E80082FF57C2289A84E690E065 :207260009093AB018093AA01AADF182F853481F48CE49DE19093AD018093AC0107B600FC4B :20728000FDCFF999FECF81E180935700E89503C0843519F494DF8DE00DC28C34E1F38035F9 :2072A000D1F3843721F484E4A2DF80E003C2813611F489E5FFC18134B1F481DF182F7FDFE3 :2072C00090E0880F991FAA2797FDA095BA2F312F330F20E0442737FD4095542F822B932B68 :2072E000A42BB52BB8C1803711F483E5E3C1833549F4C0E0D1E089917ADF21E0C730D20714 :20730000D1F7D9C1863521F481E371DF80E3D2C1833731F487E86BDF85E969DF8EE1CAC149 :207320008536B9F4E0E0F0E093E085E090935700E89507B600FCFDCF80935700E89507B65D :2073400000FCFDCFE058FF4FA0E7E030FA0771F7A2CF823739F4E1E0F0E089E08093570024 :207360008491A8C1863439F4E0E0F0E089E08093570084919FC18E3439F4E3E0F0E089E0E5 :2073800080935700849196C1813539F4E2E0F0E089E08093570084918DC1823631F489E521 :2073A00026DF80E024DF80E885C1823419F0873609F0E5C01092AD011092AC0100DF082FE8 :2073C000FEDEF82EFCDE682E8554823008F071C1902F80E0CF2DD0E0C82BD92B10926F00B3 :2073E000173609F04BC081E180935700E895DD24CC24C3943FC0E090AE01F090AF010091CC :20740000B0011091B101B6E46B16D9F4ED2DF0E0EE29FF29E4918E2FEADEDD2081F082E08D :2074200090E0A0E0B0E0E80EF91E0A1F1B1FE092AE01F092AF010093B0011093B101DC2470 :2074400018C0D801C701B695A7959795879559D5CEDE82E090E0A0E0B0E0E80EF91E0A1FF2 :207460001B1FE092AE01F092AF010093B0011093B1012197209709F0BECF7DC08090AE01F5 :207480009090AF01A090B001B090B10196E4691609F05DC083E0F40180935700E89507B63E :2074A00000FCFDCF54C0F6E46F1661F5772031F1E090AE01F090AF010091B0011091B1019E :2074C0007EDED82ECC24852D90E08C299D29F7010C0140925700E895112482E090E0A0E08B :2074E000B0E0E80EF91E0A1F1B1FE092AE01F092AF010093B0011093B10102C060DE582E1A :20750000742423C0E090AE01F090AF010091B0011091B10116950795F794E79450DE682FFA :20752000C701F7D48091AE019091AF01A091B001B091B1010296A11DB11D8093AE01909349 :20754000AF01A093B001B093B101219704C05524772444244394209709F0A5CF96E46916B6 :2075600041F485E0F40180935700E89507B600FCFDCF8DE03CDE82E080936F009CC0833492 :2075800071F40091AE011091AF0119DE90E021E0F8010C0120935700E89511247CCE8336C8 :2075A00019F5E090AE01F090AF010091B0011091B10105DEF701E16090E021E00C0120938C :2075C0005700E895112482E090E0A0E0B0E0E80EF91E0A1F1B1FE092AE01F092AF0100936A :2075E000B0011093B10157CE8D3661F4E091AE01F091AF0185E080935700E89507B600FCF2 :20760000FDCF49CE823551F4E091AE01F091AF0105911491812FEBDD802F4CC0843421F5FE :20762000E090AE01F090AF010091B0011091B10116950795F794E794C2DD682FC70169D4DE :207640008091AE019091AF01A091B001B091B1010296A11DB11D8093AE019093AF01A093D8 :20766000B001B093B10117CE843609F5E090AE01F090AF010091B0011091B101D801C70142 :20768000B695A795979587953CD4B1DD82E090E0A0E0B0E0E80EF91E0A1F1B1FE092AE010A :2076A000F092AF010093B0011093B10104C08B3111F08FE39CDD83E08093E9009091E8002B :2076C0008091E8008E778093E80095FF04C010C08EB38823C9F08091E80080FFF9CF809193 :2076E000E8008E778093E80003C08EB3882361F08091E80080FFF9CF84E08093E9008091F1 :20770000E8008B778093E800DF91CF911F910F91FF90EF90DF90CF90BF90AF909F908F90AC :207720007F906F905F904F9008959091B601892F8F77813249F58091B7018032A1F081328A :2077400019F5913A09F58091E800877F8093E8008DE091E067E070E00BD28091E8008B770B :207760008093E8000895913279F48091E800877F8093E8008DE091E067E070E05DD2809192 :20778000E8008E778093E800089582E061EC42E0B5D083E061E842E1B1D084E060E842E1EF :2077A000ADC084B7877F84BF88E10FB6F89480936000109260000FBE20E880E090E00FB63F :2077C000F89420936100809361000FBE81E085BF92E095BF3F9A209A559AE1E6F0E02083A1 :2077E000108247985D982898109289008AEF8093880090936F0083E080938100F0C040911A :20780000000850910108109201081092000894B714BE88E10FB6F8948093600010926000D5 :207820000FBE292F30E0F901E270F07091FD18C090FF05C0859194918F5F9F4F81F423FFFF :207840000FC08091090190910A014817590741F0E0E0F0E0859194918F5F9F4F09F042DC64 :20786000A0DF78941092AD011092AC010CC0DEDC36D38091AC019091AD0181549F4110F00D :207880001092140141DC80911401882381F78091E00081608093E00025DC80E090E0089598 :2078A000FA01923049F0933061F09130F9F485E191E022E130E01EC087E291E02EE330E04D :2078C00019C0882329F485E691E024E030E012C0813029F489E691E022E230E00BC0823006 :2078E00029F48DE891E028E130E004C080E090E020E030E091838083C90108958093E9004E :207900008091EB0081608093EB001092ED006093EC004093ED008091EE00881F8827881F62 :2079200008958091B60188238CF403C08EB38823B1F08091E80082FFF9CF8091E8008B772A :207940008093E80008958EB3882349F08091E80080FFF9CF8091E8008E778093E800089594 :20796000EF92FF920F931F9345D04CD008ED10E0F80180818F77808380818068808380819B :207980008F7D808319BC1EBA1092B40180EEE82EF12CF70180818B7F8083F8018081816052 :2079A000808380E060E042E0A9DFE1EEF0E080818E7F8083E2EEF0E0808181608083808144 :2079C00088608083F70180818E7F8083F8018081806180831F910F91FF90EF900895E7ED06 :2079E000F0E08081816080838AE482BF81E08093B501B6CFE8EDF0E080818E7F808310921C :207A0000E20008951092DA001092E10008951F920F920FB60F9211242F933F934F935F93F6 :207A20006F937F938F939F93AF93BF93EF93FF938091DA0080FF1BC08091D80080FF17C0B2 :207A40008091DA008E7F8093DA008091D90080FF0BC080E189BD82E189BD09B400FEFDCF36 :207A600081E08EBB3BD203C019BC1EBA37D28091E10080FF17C08091E20080FF13C0809138 :207A8000E2008E7F8093E2008091E20080618093E2008091D80080628093D80019BC85E049 :207AA0008EBB1CD28091E10084FF2CC08091E20084FF28C080E189BD82E189BD09B400FEC5 :207AC000FDCF8091D8008F7D8093D8008091E1008F7E8093E1008091E2008F7E8093E20012 :207AE0008091E20081608093E2008091B401882331F48091E30087FD02C081E001C084E067 :207B00008EBBECD18091E10083FF21C08091E20083FF1DC08091E100877F8093E10082E06A :207B20008EBB1092B4018091E1008E7F8093E1008091E2008E7F8093E2008091E2008061E9 :207B40008093E20080E060E042E0D8DEC7D1FF91EF91BF91AF919F918F917F916F915F9130 :207B60004F913F912F910F900FBE0F901F9018959C014091BC015091BD014617570718F49D :207B8000F90190E044C06115710511F0AB01F8CF8091E8008E778093E80040E050E0F0CF0F :207BA0008EB3882309F444C0853009F443C08091E80083FF02C081E008958091E80082FD70 :207BC00031C08091E80080FF22C08091F3009091F200782F60E0292F30E0262B372B07C07A :207BE00081918093F100415050402F5F3F4F4115510519F02830310598F390E02830310566 :207C000009F491E08091E8008E778093E8004115510531F6992321F605C08EB3882341F075 :207C2000853041F08091E80082FFF7CF80E0089582E0089583E008959C016115710529F47C :207C40008091E8008B778093E800F90126C08EB3882391F1853091F18091E80083FF02C06C :207C600081E008958091E80082FFF1CF06C08091F10081936150704059F02091F300809191 :207C8000F200322F20E090E0822B932B892B79F78091E8008B778093E80061157105B9F601 :207CA00005C08EB3882341F0853041F08091E80080FFF7CF80E0089582E0089583E00895C2 :207CC0000F931F93DF93CF9300D0CDB7DEB7E6EBF1E08091F100819381E0EE3BF807C9F792 :207CE00024DD8091E80083FFE4C08091B6019091B701953009F46DC0963040F4913081F1A7 :207D0000913070F0933009F0D4C02AC0983009F4A3C0993009F4B2C0963009F0CAC07CC023 :207D2000803809F4C6C0823809F0C3C08091BA0187708093E9008091EB001092E9002091DB :207D4000E800277F2093E80090E025E0969587952A95E1F781708093F1001092F10087C0D8 :207D6000882319F0823009F0A4C08F71823009F0A0C08091B801882331F52091BA01277097 :207D800009F497C02093E9008091EB0080FF1BC0933021F48091EB00806213C08091EB0018 :207DA00080618093EB0081E090E002C0880F991F2A95E2F78093EA001092EA008091EB00E5 :207DC00088608093EB001092E9008091E800877F51C0882309F06DC01091B8011F770FB79B :207DE000F8948091E800877F8093E8009ADD8091E80080FFFCCF8091E3008078812B809398 :207E0000E30080688093E300112311F482E001C083E08EBB0FBF4DC08058823008F049C033 :207E20008091B8019091B9016091BA01AE014F5F5F4F36DDBC01009709F43BC08091E8008E :207E4000877F8093E80089819A8192DE8091E8008B778093E8002DC0803859F58091E800AA :207E6000877F8093E8008091B4018093F1008091E8008E778093E80054DD1BC08823C9F4CA :207E80009091B8019230A8F48091E800877F8093E8009093B40145DD8091B401882331F420 :207EA0008091E30087FD02C081E001C084E08EBB6CDC8091E80083FF0AC08091EB0080624E :207EC0008093EB008091E800877F8093E8000F900F90CF91DF911F910F91089508951F9360 :207EE0008EB3882361F01091E9001092E9008091E80083FF01C0E4DE17701093E9001F916F :207F00000895F999FECF92BD81BDF89A992780B50895262FF999FECF1FBA92BD81BD20BDBD :207F20000FB6F894FA9AF99A0FBE01960895F894FFCF4341544552494E4100777700080031 :207F40000000000000080112011001020000084123370001000201000109023E00020100FE :207F600080320904000001020201000524001001042402040524060001070582030800FF0C :207F800009040100020A000000070504021000010705830210000104030904220341007216 :207FA000006400750069006E006F0020004D006900630072006F0020002000200000001810 :1A7FC00003410072006400750069006E006F0020004C004C004300000000D7 :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/caterina/Caterina-Micro.txt ================================================ Builds against LUFA version 111009 make version 3.81 avrdude version 5.11 All AVR tools except avrdude were installed by CrossPack 20100115: avr-gcc version 4.3.3 (GCC) Thread model: single Configured with: ../configure —prefix=/usr/local/CrossPack-AVR-20100115 —disable-dependency-tracking —disable-nls —disable-werror —target=avr —enable-languages=c,c++ —disable-nls —disable-libssp —with-dwarf2 avr-libc version 1.6.7 binutils version 2.19 ================================================ FILE: external/arduino/avr/bootloaders/caterina/Caterina-Yun-noblink.hex ================================================ :1070000055C000006EC000006CC000006AC00000E7 :1070100068C0000066C0000064C0000062C00000DC :1070200060C000005EC00000FCC400005AC0000048 :1070300058C0000056C0000054C0000052C00000FC :1070400050C000005DC000004CC000004AC00000FD :1070500048C0000046C0000044C0000042C000001C :1070600040C000003EC000003CC000003AC000002C :1070700038C0000036C0000034C0000032C000003C :1070800030C000002EC000002CC000002AC000004C :1070900028C0000026C0000024C0000022C000005C :1070A00020C000001EC000001CC0000011241FBE34 :1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E6E463 :1070C000FFE702C005900D92A63AB107D9F711E08B :1070D000A6EAB1E001C01D92AF3BB107E1F74FD383 :1070E00030C78ECFF89410926F001092810081E02B :1070F00085BF15BE47985D9A289A0C9400000895A4 :107100001F920F920FB60F9211242F938F939F937C :10711000EF93FF9310928500109284008091A60156 :107120009091A701009741F001979093A701809358 :10713000A601892B09F45D9A8091A8019091A9017B :10714000009741F001979093A9018093A801892BA2 :1071500009F4289A8091AC019091AD010196909329 :10716000AD018093AC01E0E0F0E0859194918F5FF8 :107170009F4F49F08091AA019091AB0101969093A5 :10718000AB018093AA01FF91EF919F918F912F9175 :107190000F900FBE0F901F90189584E08093E90028 :1071A0000DC08091E8008B778093E80003C08EB318 :1071B000882351F08091E80082FFF9CF8091E800A8 :1071C00085FFEFCF8091F1000895982F83E08093A1 :1071D000E9008091E80085FD0DC08091E8008E7780 :1071E0008093E80003C08EB3882369F08091E800A3 :1071F00080FFF9CF9093F1005D9884E690E0909342 :10720000A7018093A60108954F925F926F927F929B :107210008F929F92AF92BF92CF92DF92EF92FF92A6 :107220000F931F93CF93DF9384E08093E9008091C5 :10723000E80082FF57C2289884E690E09093A90165 :107240008093A801AADF182F853481F48CE49DE196 :107250009093AB018093AA0107B600FCFDCFF9998A :10726000FECF81E180935700E89503C0843519F47F :1072700094DF8DE00DC28C34E1F38035D1F3843797 :1072800021F484E4A2DF80E003C2813611F489E5B1 :10729000FFC18134B1F481DF182F7FDF90E0880FC8 :1072A000991FAA2797FDA095BA2F312F330F20E001 :1072B000442737FD4095542F822B932BA42BB52BBD :1072C000B8C1803711F483E5E3C1833549F4C0E0E8 :1072D000D1E089917ADF21E0C730D207D1F7D9C157 :1072E000863521F481E371DF80E3D2C1833731F445 :1072F00087E86BDF85E969DF8EE1CAC18536B9F4BD :10730000E0E0F0E093E085E090935700E89507B661 :1073100000FCFDCF80935700E89507B600FCFDCF39 :10732000E058FF4FA0E7E030FA0771F7A2CF8237AD :1073300039F4E1E0F0E089E0809357008491A8C13E :10734000863439F4E0E0F0E089E0809357008491DE :107350009FC18E3439F4E3E0F0E089E08093570078 :10736000849196C1813539F4E2E0F0E089E08093C0 :10737000570084918DC1823631F489E526DF80E0A3 :1073800024DF80E885C1823419F0873609F0E5C032 :107390001092AB011092AA0100DF082FFEDEF82E3A :1073A000FCDE682E8554823008F071C1902F80E099 :1073B000CF2DD0E0C82BD92B10926F00173609F0D3 :1073C0004BC081E180935700E895DD24CC24C39421 :1073D0003FC0E090AF01F090B0010091B101109179 :1073E000B201B6E46B16D9F4ED2DF0E0EE29FF29D9 :1073F000E4918E2FEADEDD2081F082E090E0A0E0D3 :10740000B0E0E80EF91E0A1F1B1FE092AF01F092D8 :10741000B0010093B1011093B201DC2418C0D8016F :10742000C701B695A7959795879575D5CEDE82E06D :1074300090E0A0E0B0E0E80EF91E0A1F1B1FE092EA :10744000AF01F092B0010093B1011093B201219706 :10745000209709F0BECF7DC08090AF019090B00121 :10746000A090B101B090B20196E4691609F05DC038 :1074700083E0F40180935700E89507B600FCFDCF48 :1074800054C0F6E46F1661F5772031F1E090AF015A :10749000F090B0010091B1011091B2017EDED82EC2 :1074A000CC24852D90E08C299D29F7010C01409278 :1074B0005700E895112482E090E0A0E0B0E0E80EEB :1074C000F91E0A1F1B1FE092AF01F092B00100935A :1074D000B1011093B20102C060DE582E742423C0A3 :1074E000E090AF01F090B0010091B1011091B201B4 :1074F00016950795F794E79450DE682FC70113D5CA :107500008091AF019091B001A091B101B091B20111 :107510000296A11DB11D8093AF019093B001A0937D :10752000B101B093B201219704C0552477244424BB :107530004394209709F0A5CF96E4691641F485E0BD :10754000F40180935700E89507B600FCFDCF8DE06D :107550003CDE82E080936F009CC0833471F4009124 :10756000AF011091B00119DE90E021E0F8010C01AB :1075700020935700E89511247CCE833619F5E090CE :10758000AF01F090B0010091B1011091B20105DEA0 :10759000F701E16090E021E00C0120935700E895AD :1075A000112482E090E0A0E0B0E0E80EF91E0A1F8E :1075B0001B1FE092AF01F092B0010093B101109354 :1075C000B20157CE8D3661F4E091AF01F091B00178 :1075D00085E080935700E89507B600FCFDCF49CEC3 :1075E000823551F4E091AF01F091B0010591149111 :1075F000812FEBDD802F4CC0843421F5E090AF016A :10760000F090B0010091B1011091B201169507956B :10761000F794E794C2DD682FC70185D48091AF014C :107620009091B001A091B101B091B2010296A11D5B :10763000B11D8093AF019093B001A093B101B093BD :10764000B20117CE843609F5E090AF01F090B00199 :107650000091B1011091B201D801C701B695A7956B :107660009795879558D4B1DD82E090E0A0E0B0E036 :10767000E80EF91E0A1F1B1FE092AF01F092B00145 :107680000093B1011093B20104C08B3111F08FE36C :107690009CDD83E08093E9009091E8008091E80010 :1076A0008E778093E80095FF04C010C08EB38823C6 :1076B000C9F08091E80080FFF9CF8091E8008E77D3 :1076C0008093E80003C08EB3882361F08091E800C6 :1076D00080FFF9CF84E08093E9008091E8008B7708 :1076E0008093E800DF91CF911F910F91FF90EF9071 :1076F000DF90CF90BF90AF909F908F907F906F90D2 :107700005F904F9008959091B701892F8F778132C4 :1077100049F58091B8018032A1F0813219F5913A92 :1077200009F58091E800877F8093E8008CE091E084 :1077300067E070E027D28091E8008B778093E800C3 :107740000895913279F48091E800877F8093E80072 :107750008CE091E067E070E079D28091E8008E776C :107760008093E800089582E061EC42E0D1D083E0AC :1077700061E842E1CDD084E060E842E1C9C01F93F6 :10778000209100081092000844B714BE88E10FB69B :10779000F89480936000109260000FBE80E8E0E0F3 :1077A000F0E00FB6F89480936100E09361000FBEA3 :1077B00031E035BF92E095BF3F9A209A559A809369 :1077C00061001092610047985D9A289A1092890092 :1077D0008AEF8093880090936F0083E0809381000C :1077E000859194918F5F9F4F11F03093AE01942F4C :1077F00041FF19C0809109012817A9F08093000862 :10780000789480911301882339F08091AC01909194 :10781000AD018F5E9240C8F310920008F89481E0A9 :10782000809313010CC090FF04C08091AE018823A7 :1078300051F493FF09C080910901281729F0809124 :10784000AE01882309F04EDCD4D078941092AB01BD :107850001092AA011EEF20C0D7DC4BD38091AA0161 :107860009091AB0181549F4110F0109213018091CF :10787000B3019091B40101969093B4018093B30148 :10788000292F97FF03C0512F591B252F220F28178F :1078900010F4479801C0479A809113018823E1F6BC :1078A0008091E00081608093E0001CDC80E090E04B :1078B0001F910895FA01923049F0933061F09130B0 :1078C000F9F484E191E022E130E01EC086E291E02B :1078D0002EE330E019C0882329F484E691E024E007 :1078E00030E012C0813029F488E691E022E230E0F5 :1078F0000BC0823029F48CE891E028E130E004C02C :1079000080E090E020E030E091838083C901089519 :107910008093E9008091EB0081608093EB001092EE :10792000ED006093EC004093ED008091EE00881F25 :107930008827881F08958091B70188238CF403C09D :107940008EB38823B1F08091E80082FFF9CF809157 :10795000E8008B778093E80008958EB3882349F080 :107960008091E80080FFF9CF8091E8008E778093C6 :10797000E8000895EF92FF920F931F9345D04CD0EB :1079800008ED10E0F80180818F7780838081806826 :10799000808380818F7D808319BC1EBA1092B501CF :1079A00080EEE82EF12CF70180818B7F8083F80137 :1079B00080818160808380E060E042E0A9DFE1EEC9 :1079C000F0E080818E7F8083E2EEF0E08081816054 :1079D0008083808188608083F70180818E7F8083AF :1079E000F8018081806180831F910F91FF90EF905B :1079F0000895E7EDF0E08081816080838AE482BFB2 :107A000081E08093B601B6CFE8EDF0E080818E7F13 :107A100080831092E20008951092DA001092E10043 :107A200008951F920F920FB60F9211242F933F9338 :107A30004F935F936F937F938F939F93AF93BF9376 :107A4000EF93FF938091DA0080FF1BC08091D800F4 :107A500080FF17C08091DA008E7F8093DA008091DA :107A6000D90080FF0BC080E189BD82E189BD09B4E6 :107A700000FEFDCF81E08EBB3BD203C019BC1EBA15 :107A800037D28091E10080FF17C08091E20080FF33 :107A900013C08091E2008E7F8093E2008091E2002B :107AA00080618093E2008091D80080628093D8004A :107AB00019BC85E08EBB1CD28091E10084FF2CC0F4 :107AC0008091E20084FF28C080E189BD82E189BD08 :107AD00009B400FEFDCF8091D8008F7D8093D8003F :107AE0008091E1008F7E8093E1008091E2008F7EA3 :107AF0008093E2008091E20081608093E2008091B7 :107B0000B501882331F48091E30087FD02C081E054 :107B100001C084E08EBBECD18091E10083FF21C0E5 :107B20008091E20083FF1DC08091E100877F8093F8 :107B3000E10082E08EBB1092B5018091E1008E7F62 :107B40008093E1008091E2008E7F8093E20080913B :107B5000E20080618093E20080E060E042E0D8DEF5 :107B6000C7D1FF91EF91BF91AF919F918F917F917D :107B70006F915F914F913F912F910F900FBE0F909A :107B80001F9018959C014091BD015091BE01461770 :107B9000570718F4F90190E044C06115710511F020 :107BA000AB01F8CF8091E8008E778093E80040E049 :107BB00050E0F0CF8EB3882309F444C0853009F437 :107BC00043C08091E80083FF02C081E00895809166 :107BD000E80082FD31C08091E80080FF22C08091E2 :107BE000F3009091F200782F60E0292F30E0262BEF :107BF000372B07C081918093F100415050402F5F97 :107C00003F4F4115510519F02830310598F390E0A8 :107C10002830310509F491E08091E8008E77809357 :107C2000E8004115510531F6992321F605C08EB3C0 :107C3000882341F0853041F08091E80082FFF7CF42 :107C400080E0089582E0089583E008959C01611525 :107C5000710529F48091E8008B778093E800F901A1 :107C600026C08EB3882391F1853091F18091E80090 :107C700083FF02C081E008958091E80082FFF1CF88 :107C800006C08091F10081936150704059F02091BD :107C9000F3008091F200322F20E090E0822B932BB2 :107CA000892B79F78091E8008B778093E800611544 :107CB0007105B9F605C08EB3882341F0853041F0D7 :107CC0008091E80080FFF7CF80E0089582E008957A :107CD00083E008950F931F93DF93CF9300D0CDB728 :107CE000DEB7E7EBF1E08091F100819381E0EF3BBB :107CF000F807C9F708DD8091E80083FFE4C08091B0 :107D0000B7019091B801953009F46DC0963040F4F8 :107D1000913081F1913070F0933009F0D4C02AC0D5 :107D2000983009F4A3C0993009F4B2C0963009F034 :107D3000CAC07CC0803809F4C6C0823809F0C3C00C :107D40008091BB0187708093E9008091EB001092D5 :107D5000E9002091E800277F2093E80090E025E0EB :107D6000969587952A95E1F781708093F10010929E :107D7000F10087C0882319F0823009F0A4C08F7108 :107D8000823009F0A0C08091B901882331F520919B :107D9000BB01277009F497C02093E9008091EB00A4 :107DA00080FF1BC0933021F48091EB00806213C0F0 :107DB0008091EB0080618093EB0081E090E002C055 :107DC000880F991F2A95E2F78093EA001092EA0043 :107DD0008091EB0088608093EB001092E900809125 :107DE000E800877F51C0882309F06DC01091B90168 :107DF0001F770FB7F8948091E800877F8093E800A1 :107E00009ADD8091E80080FFFCCF8091E3008078CC :107E1000812B8093E30080688093E300112311F4A9 :107E200082E001C083E08EBB0FBF4DC0805882301E :107E300008F049C08091B9019091BA016091BB01ED :107E4000AE014F5F5F4F36DDBC01009709F43BC0C8 :107E50008091E800877F8093E80089819A8192DE93 :107E60008091E8008B778093E8002DC0803859F529 :107E70008091E800877F8093E8008091B50180932E :107E8000F1008091E8008E778093E80054DD1BC0FC :107E90008823C9F49091B9019230A8F48091E80048 :107EA000877F8093E8009093B50145DD8091B5010F :107EB000882331F48091E30087FD02C081E001C096 :107EC00084E08EBB50DC8091E80083FF0AC0809183 :107ED000EB0080628093EB008091E800877F8093C5 :107EE000E8000F900F90CF91DF911F910F910895AF :107EF00008951F938EB3882361F01091E9001092CA :107F0000E9008091E80083FF01C0E4DE1770109360 :107F1000E9001F910895F999FECF92BD81BDF89AAD :107F2000992780B50895262FF999FECF1FBA92BDE3 :107F300081BD20BD0FB6F894FA9AF99A0FBE01964A :067F40000895F894FFCF44 :107F46004341544552494E41007700080000000065 :107F5600000008011201100102000008412341003F :107F660001000201000109023E00020100803209FF :107F7600040000010202010005240010010424028D :107F8600040524060001070582030800FF09040111 :107F960000020A000000070504021000010705831D :107FA6000210000104030904220341007200640068 :107FB600750069006E006F002000590075006E00A4 :107FC60020002000200020002000000018034100AF :107FD60072006400750069006E006F0020004C009E :067FE6004C004300000006 :040000030000700089 :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/caterina/Caterina-Yun.hex ================================================ :200000000C9475010C949D010C949D010C949D010C949D010C949D010C949D010C949D0118 :200020000C949D010C949D010C940C050C9493050C949D010C949D010C949D010C949D0163 :200040000C949D010C949D010C949D010C949D010C949D010C949D010C949D010C94BC0191 :200060000C949D010C949D010C949D010C949D010C949D010C949D010C949D010C949D0190 :200080000C949D010C949D010C949D010C949D010C949D010C949D010C949D010C949D0170 :2000A0000C949D010C949D010C949D0100000000240027002A002D0030000000000025008F :2000C00028002B002E003100000000002300260029002C002F00040404040403040502027D :2000E0000202040302020202060606060606040402020204040802011040804010204080A8 :200100004080080204018040201002011080102040400000000200080E0000030401000BB2 :2001200000000000000000000000000000000000070605040100080A0B0C0D090403090455 :200140002203410072006400750069006E006F002000590075006E002000200020002000CC :2001600020001803410072006400750069006E006F0020004C004C00430012010002000062 :2001800000404123418000010102000112010002020000404123418000010102000100C1B3 :2001A0008081C1080B000202020100090400000102020000052400100105240101010424C3 :2001C000020605240600010705810310004009040100020A00000007050202400000070591 :2001E000830240000005010902A1010901A100850105091901290315002501950375018138 :200200000295017505810305010930093109381581257F750895038106C0C005010906A182 :20022000018502050719E029E7150025017501950881029501750881039506750815002567 :20024000650507190029658100C009040200010300000009210101000122650007058403EB :2002600040000100000000000000002A2B28000000000000000000000000000000000000C0 :200280000000002C9EB4A0A1A2A434A6A7A5AE362D3738271E1F20212223242526B333B6BE :2002A0002EB7B89F8485868788898A8B8C8D8E8F909192939495969798999A9B9C9D2F31F5 :2002C00030A3AD350405060708090A0B0C0D0E0F101112131415161718191A1B1C1DAFB15C :2002E000B0B50000480426072B0811241FBECFEFDAE0DEBFCDBF11E0A0E0B1E0EEECF2E18B :2003000002C005900D92AC32B107D9F711E0ACE2B1E001C01D92AD39B107E1F712E0CAEEE1 :20032000D2E004C02297FE010E946109C43ED107C9F70E9482030C9465090C940000809103 :20034000000161E00E944F0368EE73E080E090E00E945A028091000160E00E944F0368EE54 :2003600073E080E090E00E945A0208958091000161E00E94C20208951F920F920FB60F92B1 :2003800011242F933F938F939F93AF93BF938091300190913101A0913201B091330130917D :2003A00034010196A11DB11D232F2D5F2D3720F02D570196A11DB11D2093340180933001C0 :2003C00090933101A0933201B093330180912C0190912D01A0912E01B0912F010196A11D38 :2003E000B11D80932C0190932D01A0932E01B0932F01BF91AF919F918F913F912F910F90BA :200400000FBE0F901F901895789484B5826084BD84B5816084BD85B5826085BD85B58160D8 :2004200085BDEEE6F0E0808181608083E1E8F0E01082808182608083808181608083E0E833 :20044000F0E0808181608083E1E9F0E0808182608083808181608083E0E9F0E08081816007 :200460008083E1ECF0E0808184608083808182608083808181608083E3ECF0E080818160A8 :200480008083E0ECF0E0808182608083E2ECF0E0808181608083EAE7F0E0808184608083CB :2004A0008081826080838081816080838081806880830895EF92FF920F931F93CF93DF93AE :2004C0007B018C013FB7F89480912C0190912D01A0912E01B0912F0126B5A89B05C02F3FE2 :2004E00019F00196A11DB11D3FBFBA2FA92F982F8827820F911DA11DB11D52E0880F991F4F :20050000AA1FBB1F5A95D1F7EC0130C00E9434093FB7F89480912C0190912D01A0912E0156 :20052000B0912F0126B5A89B05C02F3F19F00196A11DB11D3FBFBA2FA92F982F8827820F07 :20054000911DA11DB11D32E0880F991FAA1FBB1F3A95D1F78C1B9D0B885E9340B8F2089478 :20056000E108F10801091109C851DC4FE114F1040105110559F6DF91CF911F910F91FF902D :20058000EF900895CF93DF93482F50E0CA018C509F4FFC0134914A525F4FFA018491882368 :2005A00069F190E0880F991FFC01E455FF4FA591B491FC01E654FF4FC591D491662351F415 :2005C0002FB7F8948C91932F909589238C93888189230BC0623061F42FB7F8948C91932F22 :2005E000909589238C938881832B88832FBF06C09FB7F8948C91832B8C939FBFDF91CF919B :200600000895883071F1893068F4823031F1833020F4813009F042C01DC0833089F084300A :20062000E9F512C08B3059F18C3028F48930E9F08A30A1F51EC08C3031F18E3079F529C07A :20064000809180008F7703C0809180008F7D80938000089584B58F7702C084B58F7D84BDEC :200660000895809190008F7707C0809190008F7D03C080919000877F809390000895809107 :20068000C0008F7703C08091C0008F7D8093C00008958091C200877F8093C2000895FF92A8 :2006A0000F931F93F62E482F50E0CA018E5E9E4FFC012491CA018C509F4FFC0114914A52F2 :2006C0005F4FFA0104910023C9F0222319F0822F0E940103E02FF0E0EE0FFF1FE654FF4FD9 :2006E000A591B4919FB7F894FF2021F48C911095812302C08C91812B8C939FBF1F910F91AB :20070000FF900895CF93DF930E9404028DE391E00E9449040E94B601C0E0D0E00E949F0176 :200720002097E1F30E940000F9CF282F809137018823C1F057FF1AC015C0289890933601A9 :200740008091F1008193E217F307B9F74115510539F08091F200882319F48BE68093E800E4 :20076000AFBF02C04FEF5FEFCA010895AFB7F89427702093E9008091F200282F30E024178B :2007800035070CF4A901FB019B01240F311D94E6DACFDF93CF930F92CDB7DEB7BE016F5F1C :2007A0007F4F41E050E00E949503019719F02FEF3FEF03C08981282F30E0C9010F90CF91F6 :2007C000DF910895FF920F931F93F82E142F052F40913A0150913B01212F302FC901DC010B :2007E000FB016EEF29C0F7FE02C0949101C09081209138013091390124173507ACF48091FC :20080000E8008570E1F38091E80082FF03C02FEF3FEF17C09093F100C90101968F73907050 :20082000892B11F46093E8002F5F3F4F3093390120933801119731961097A9F6812F902FFB :200840009C01C9011F910F91FF9008959C018091E80082FFFCCFF901260F311D03C0809182 :20086000F1008193E217F307D1F7289884E6809336018BEF8093E800CB0108958093E9006A :200880008091F200882319F08AE38093E800089508951092370181E08093D70080EA80935D :2008A000D80082E189BD09B400FEFDCF61E070E080E090E00E945A0280E98093D8008CE011 :2008C0008093E2001092E000559A209A08955F926F927F928F929F92AF92BF92CF92DF92A2 :2008E000EF92FF920F931F93CF93DF93E82E842E752E80913701882371F18B01242F352FBA :20090000C901EC017AEFF72E67E0962E9E2050E4552E8E2D90E040E2A42EB12CA822B92271 :200920003AE3632E20E4C22ED12CC822D92258C09FB7F8949092E9008091E80085FD02C0F1 :2009400020E004C08091F200252D281B9FBF222361F4FA9419F42FEF3FEF4DC061E070E0BE :2009600080E090E00E945A023BC0822F90E0C817D9070CF42C2FC21BD1094FB7F894909208 :20098000E900A114B10421F406C01092F10021502223D9F719C0E7FC03C0F801922F10C007 :2009A000C801322F06C0FC010196E491E093F10031503323C1F706C081918093F10091508E :2009C0009923D1F7020F111D8091E80085FF05C0209729F4C114D10411F06092E8004FBFAB :2009E000209709F0A5CF5D9884E680933501282D372DC9019C01C901DF91CF911F910F9121 :200A0000FF90EF90DF90CF90BF90AF909F908F907F906F905F9008951F920F920FB60F92CC :200A200011242F933F934F935F936F937F938F939F93AF93BF93EF93FF938091E100109275 :200A4000E100982F83FF0FC01092E90081E08093EB001092EC0082E38093ED0010923701E6 :200A600088E08093F00092FF34C083E08093E9008091F200882319F08AE38093E8008FB7C2 :200A8000F89492E09093E9009091F2008FBF992321F082E891E00E9469078091350188233F :200AA00051F08091350181508093350180913501882309F45D9A80913601882351F0809169 :200AC000360181508093360180913601882309F4289AFF91EF91BF91AF919F918F917F9112 :200AE0006F915F914F913F912F910F900FBE0F901F9018950F931F93DF93CF930F92CDB7E2 :200B0000DEB719828E010F5F1F4FC8010E948F07C8010E942809898190E00F90CF91DF91B4 :200B20001F910F9108951F920F920FB60F921124EF92FF921F932F933F934F935F936F93AD :200B40007F938F939F93AF93BF93EF93FF93DF93CF93CDB7DEB76197DEBFCDBF1092E900EE :200B60008091E80083FF0FC1FE0131969E01275F3F4F03C08091F1008193E217F307D1F71D :200B8000289884E68093360182EF8093E800998197FF05C08091E80080FFFCCF03C08EEF7D :200BA0008093E800292F30E0C90180769070892B09F0C2C08A81882329F41092F1001092DB :200BC000F100D6C0813009F4D3C0833009F4D0C0853049F48091E80080FFFCCF8B818068E4 :200BE0008093E300C5C0863009F07CC01C81EF80F8841230C1F51092E90010923901109206 :200C0000380110923B0110923A010E947A0599E0FE013996DF01292F1D922A95E9F79987D2 :200C20001A8791E09E8790E8988B9AEF998B2091380130913901275F3F4F3C872B878D87B3 :200C40001092E9001092390110923801F0923B01E0923A0180E0BF0149E050E00E94E203E7 :200C60000E947A0585C01092E9001092390110923801F0923B01E0923A01123241F482E284 :200C800090E00E942009892B09F476C071C0113079F488E0E816F10419F481E080933C013A :200CA00080913C01882309F06BC0EAE7F1E013C0133009F061C08B81882319F4ECE3F1E0E1 :200CC0000AC0823019F4E0E4F1E005C0813009F053C0E2E6F1E0449180E8BF0150E00E940C :200CE000E20346C0873009F447C0883021F481E08093F1003DC08930D9F523703070232B17 :200D0000D9F5EFE9F1E091E031E026E39093E9003093EB0084918093EC002093ED009F5F65 :200D20003196953099F78EE78093EA001092EA008B81809337011CC08F8198851092E900AE :200D4000109239011092380190933B0180933A018D81882329F4CE0101960E949B0706C0E9 :200D6000823051F4CE0101960E94F107882321F08EEF8093E80007C081E28093EB0003C05D :200D8000ECE8F1E0A8CF6196DEBFCDBFCF91DF91FF91EF91BF91AF919F918F917F916F9147 :200DA0005F914F913F912F911F91FF90EF900F900FBE0F901F90189520917E0130917F013D :200DC0008091800190918101281B390B2F733070C901089520917E0130917F0180918001AB :200DE000909181012817390719F42FEF3FEF09C0E0918001F0918101E25CFE4F8081282FD7 :200E000030E0C901089520917E0130917F0180918001909181012817390719F42FEF3FEFDD :200E200013C0E0918001F0918101E25CFE4F2081809180019091810101968F7390709093CD :200E400081018093800130E0C9010895109285011092840188EE93E0A0E0B0E08093860123 :200E600090938701A0938801B093890180E191E0909383018093820108950F931F93DF93CC :200E8000CF930F92CDB7DEB78C01698380910901882369F083E0BE016F5F7F4F41E050E08F :200EA0000E9467041816190614F49C0107C081E090E0F8019383828320E030E0C9010F900E :200EC000CF91DF911F910F91089583E00E943E040895CF93DF9312C082E00E94C9032FEFDD :200EE0008F3F9207C9F0E0917E01F0917F01E25CFE4F8083D0937F01C0937E01C0917E01CE :200F0000D0917F012196CF73D0708091800190918101C817D90701F7DF91CF910895FC0161 :200F200080818E5F808380E863EA71E042E450E00E94E2030895FC0181819081913A59F418 :200F4000813209F04CC080E062E071E047E050E00E94E20342C0913209F041C0803239F46A :200F600082E091E067E070E00E94260436C0823209F035C08281809309018091020190914E :200F80000301A0910401B0910501805B9440A040B04019F58091090180FD12C087E797E7ED :200FA00090930108809300082BE088E190E00FB6F894A895809360000FBE209360000DC058 :200FC00088E10FB6F89480936000109260000FBEA895109201081092000881E0089580E025 :200FE0000895FC0191818081813A31F4913089F080E0933089F40DC0813269F49B3021F4CD :20100000828180930A0105C09A3029F4828180930B0181E0089580E00895EF92FF920F9332 :201020001F938C01E62EDC01ED91FC910480F581E02D0995F82ED801ED91FC910680F781C8 :20104000E02DC8016E2D09958F2D90E01F910F91FF90EF900895109290011092940110924E :20106000930182E291E090939201809391010895EF92FF920F931F93DF93CF930F92CDB7B0 :20108000DEB789838B017A0184E0BE016F5F7F4F41E050E00E94670484E4B801A7010E9420 :2010A00067040F90CF91DF911F910F91FF90EF90089582E048E050E00E9438080895FC0125 :2010C00016821782108611861286138614823496BF010E9459080895DC01683810F0685884 :2010E00029C0E62FF0E067FF13C0E058F04081E090E002C0880F991FEA95E2F78095149688 :201100002C911497282314962C93149760E012C0ED59FD4F6491662319F420E030E01DC0EC :2011200067FF08C014968C9114978D7F14968C9314976F77FD0190E0662321F086818617FD :2011400009F416829F5F31969630B1F7CD011496BD010E94590821E030E0C9010895CF93B4 :20116000DF93DC01683810F0685825C0E62FF0E067FF12C0E058F04081E090E002C0880F2C :20118000991FEA95E2F714962C911497282B14962C93149760E00FC0ED59FD4F64916623A7 :2011A000D9F167FF08C014968C911497826014968C9314976F7716968C9116978617A9F1DC :2011C00017968C911797861781F118968C911897861759F119968C911997861731F11A963C :2011E0008C911A97861709F11B968C911B978617E1F0ED01E0E0F0E09E2F8E81882321F482 :20120000EA0FFB1F668306C09F5F31962196E630F10591F7963049F481E090E013969C9350 :201220008E93129720E030E007C0CD011496BD010E94590821E030E0C901DF91CF9108958C :2012400080E865EE71E045E650E00E94E2030895FC0180818F5F808380E86AE472E049E1E2 :2012600050E00E94E20308950895CF92DF92EF92FF920F931F93CF93DF937C016B018A01FD :20128000C0E0D0E00FC0D6016D916D01D701ED91FC910190F081E02DC7010995C80FD91FC5 :2012A000015010400115110571F7CE01DF91CF911F910F91FF90EF90DF90CF900895EE0F94 :2012C000FF1F0590F491E02D0994F894FFCF0D0000E10000000000000101000000003D079E :2012E0003509DC060307EA0665076907000000000D083509AF086C085F08FFFFFFFFFFFF19 :20130000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :20132000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20134000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20136000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20138000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :2013A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :2013C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2013E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :20140000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :20142000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20144000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20146000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20148000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :2014A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :2014C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2014E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :20150000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :20152000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20154000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20156000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20158000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :2015A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :2015C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2015E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :20160000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :20162000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20164000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20166000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20168000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :2016A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :2016C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2016E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :20170000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :20172000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20174000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20176000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20178000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :2017A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :2017C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2017E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :20180000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :20182000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20184000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20186000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20188000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :2018A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :2018C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2018E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :20190000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :20192000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :20194000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20196000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20198000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :2019A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :2019C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2019E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :201A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :201A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :201A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :201A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :201A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :201AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :201AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :201AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :201B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :201B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :201B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :201B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :201B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :201BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :201BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :201BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :201C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :201C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :201C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :201C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :201C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :201CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :201CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :201CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :201D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :201D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :201D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :201D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :201D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :201DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :201DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :201DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :201E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :201E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :201E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :201E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :201E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :201EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :201EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :201EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :201F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :201F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :201F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :201F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :201F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :201FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :201FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :201FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :20200000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :20202000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20204000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20206000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20208000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :2020A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :2020C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2020E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :20210000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :20212000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20214000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20216000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20218000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :2021A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :2021C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2021E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :20220000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :20222000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20224000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20226000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20228000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :2022A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :2022C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2022E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :20230000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :20232000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20234000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20236000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20238000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :2023A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :2023C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2023E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :20240000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :20242000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20244000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20246000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20248000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :2024A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :2024C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2024E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :20250000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :20252000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20254000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20256000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20258000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :2025A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :2025C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2025E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :20260000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :20262000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20264000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20266000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20268000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :2026A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :2026C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2026E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :20270000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :20272000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20274000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20276000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20278000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :2027A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :2027C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2027E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :20280000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :20282000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20284000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20286000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20288000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :2028A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :2028C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2028E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :20290000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :20292000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :20294000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20296000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20298000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :2029A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :2029C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2029E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :202A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :202A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :202A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :202A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :202A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :202AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :202AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :202AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :202B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :202B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :202B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :202B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :202B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :202BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :202BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :202BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :202C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :202C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :202C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :202C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :202C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :202CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :202CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :202CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :202D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :202D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :202D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :202D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :202D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :202DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :202DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :202DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :202E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :202E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :202E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :202E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :202E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :202EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :202EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :202EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :202F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :202F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :202F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :202F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :202F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :202FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :202FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :202FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :20300000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 :20302000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 :20304000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 :20306000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 :20308000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 :2030A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 :2030C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 :2030E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 :20310000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF :20312000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF :20314000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F :20316000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F :20318000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F :2031A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F :2031C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F :2031E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF :20320000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE :20322000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE :20324000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E :20326000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E :20328000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E :2032A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E :2032C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :2032E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE :20330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20332000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20334000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20336000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :20338000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :2033A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2033C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :2033E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :20340000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20342000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20344000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20346000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :20348000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :2034A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2034C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :2034E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :20350000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20352000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20354000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20356000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :20358000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :2035A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2035C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :2035E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :20360000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20362000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20364000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20366000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :20368000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :2036A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2036C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :2036E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :20370000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20372000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20374000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20376000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :20378000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :2037A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2037C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :2037E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :20380000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20382000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20384000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20386000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :20388000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :2038A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2038C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :2038E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :20390000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :20392000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20394000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20396000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :20398000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :2039A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2039C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :2039E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :203A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :203A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :203A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :203A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :203A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :203AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :203AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :203AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :203B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :203B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :203B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :203B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :203B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :203BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :203BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :203BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :203C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :203C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :203C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :203C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :203C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :203CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :203CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :203CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :203D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :203D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :203D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :203D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :203D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :203DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :203DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :203DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :203E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :203E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :203E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :203E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :203E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :203EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :203EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :203EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :203F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :203F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :203F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :203F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :203F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :203FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :203FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :203FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :20400000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20402000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20404000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20406000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :20408000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :2040A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2040C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :2040E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :20410000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20412000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20414000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20416000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :20418000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :2041A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2041C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :2041E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :20420000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20422000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20424000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20426000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :20428000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :2042A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2042C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :2042E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :20430000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20432000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20434000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20436000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :20438000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :2043A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2043C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :2043E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :20440000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20442000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20444000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20446000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :20448000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :2044A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2044C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :2044E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :20450000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20452000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20454000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20456000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :20458000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :2045A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2045C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :2045E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :20460000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20462000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20464000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20466000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :20468000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :2046A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2046C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :2046E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :20470000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20472000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20474000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20476000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :20478000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :2047A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2047C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :2047E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :20480000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20482000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20484000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20486000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :20488000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :2048A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2048C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :2048E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :20490000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :20492000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20494000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20496000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :20498000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :2049A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2049C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :2049E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :204A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :204A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :204A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :204A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :204A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :204AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :204AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :204AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :204B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :204B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :204B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :204B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :204B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :204BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :204BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :204BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :204C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :204C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :204C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :204C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :204C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :204CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :204CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :204CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :204D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :204D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :204D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :204D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :204D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :204DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :204DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :204DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :204E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :204E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :204E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :204E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :204E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :204EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :204EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :204EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :204F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :204F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :204F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :204F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :204F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :204FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :204FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :204FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :20500000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 :20502000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 :20504000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 :20506000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 :20508000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 :2050A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 :2050C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 :2050E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 :20510000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF :20512000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F :20514000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F :20516000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F :20518000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F :2051A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F :2051C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF :2051E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF :20520000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE :20522000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E :20524000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E :20526000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E :20528000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E :2052A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :2052C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE :2052E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE :20530000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20532000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20534000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :20536000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :20538000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2053A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :2053C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :2053E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20540000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20542000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20544000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :20546000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :20548000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2054A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :2054C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :2054E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20550000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20552000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20554000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :20556000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :20558000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2055A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :2055C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :2055E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20560000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20562000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20564000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :20566000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :20568000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2056A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :2056C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :2056E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20570000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20572000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20574000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :20576000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :20578000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2057A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :2057C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :2057E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20580000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20582000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20584000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :20586000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :20588000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2058A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :2058C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :2058E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20590000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20592000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20594000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :20596000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :20598000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2059A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :2059C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :2059E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :205A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :205A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :205A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :205A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :205A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :205AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :205AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :205AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :205B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :205B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :205B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :205B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :205B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :205BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :205BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :205BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :205C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :205C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :205C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :205C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :205C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :205CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :205CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :205CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :205D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :205D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :205D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :205D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :205D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :205DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :205DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :205DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :205E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :205E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :205E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :205E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :205E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :205EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :205EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :205EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :205F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :205F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :205F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :205F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :205F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :205FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :205FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :205FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :20600000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20602000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20604000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :20606000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :20608000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2060A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :2060C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :2060E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20610000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20612000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20614000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :20616000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :20618000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2061A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :2061C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :2061E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20620000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20622000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20624000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :20626000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :20628000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2062A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :2062C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :2062E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20630000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20632000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20634000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :20636000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :20638000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2063A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :2063C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :2063E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20640000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20642000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20644000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :20646000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :20648000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2064A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :2064C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :2064E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20650000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20652000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20654000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :20656000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :20658000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2065A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :2065C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :2065E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20660000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20662000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20664000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :20666000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :20668000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2066A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :2066C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :2066E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20670000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20672000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20674000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :20676000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :20678000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2067A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :2067C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :2067E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20680000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20682000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20684000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :20686000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :20688000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2068A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :2068C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :2068E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20690000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20692000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20694000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :20696000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :20698000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2069A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :2069C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :2069E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :206A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :206A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :206A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :206A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :206A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :206AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :206AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :206AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :206B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :206B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :206B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :206B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :206B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :206BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :206BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :206BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :206C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :206C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :206C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :206C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :206C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :206CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :206CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :206CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :206D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :206D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :206D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :206D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :206D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :206DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :206DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :206DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :206E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :206E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :206E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :206E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :206E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :206EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :206EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :206EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :206F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :206F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :206F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :206F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :206F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :206FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :206FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :206FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :2070000055C000006EC000006CC000006AC0000068C0000066C0000064C0000062C0000043 :2070200060C000005EC00000FCC400005AC0000058C0000056C0000054C0000052C00000E4 :2070400050C000005DC000004CC000004AC0000048C0000046C0000044C0000042C00000D9 :2070600040C000003EC000003CC000003AC0000038C0000036C0000034C0000032C0000048 :2070800030C000002EC000002CC000002AC0000028C0000026C0000024C0000022C00000A8 :2070A00020C000001EC000001CC0000011241FBECFEFDAE0DEBFCDBF11E0A0E0B1E0E6E4B7 :2070C000FFE702C005900D92A63AB107D9F711E0A6EAB1E001C01D92AF3BB107E1F74FD34E :2070E00030C78ECFF89410926F001092810081E085BF15BE47985D9A289A0C94000008952F :207100001F920F920FB60F9211242F938F939F93EF93FF9310928500109284008091A60153 :207120009091A701009741F001979093A7018093A601892B09F45D9A8091A8019091A90174 :20714000009741F001979093A9018093A801892B09F4289A8091AC019091AD01019690938C :20716000AD018093AC01E0E0F0E0859194918F5F9F4F49F08091AA019091AB01019690937E :20718000AB018093AA01FF91EF919F918F912F910F900FBE0F901F90189584E08093E9009E :2071A0000DC08091E8008B778093E80003C08EB3882351F08091E80082FFF9CF8091E800E1 :2071C00085FFEFCF8091F1000895982F83E08093E9008091E80085FD0DC08091E8008E7762 :2071E0008093E80003C08EB3882369F08091E80080FFF9CF9093F1005D9884E690E0909346 :20720000A7018093A60108954F925F926F927F928F929F92AF92BF92CF92DF92EF92FF92C3 :207220000F931F93CF93DF9384E08093E9008091E80082FF57C2289884E690E09093A901CC :207240008093A801AADF182F853481F48CE49DE19093AB018093AA0107B600FCFDCFF999E2 :20726000FECF81E180935700E89503C0843519F494DF8DE00DC28C34E1F38035D1F38437F8 :2072800021F484E4A2DF80E003C2813611F489E5FFC18134B1F481DF182F7FDF90E0880F7B :2072A000991FAA2797FDA095BA2F312F330F20E0442737FD4095542F822B932BA42BB52BE0 :2072C000B8C1803711F483E5E3C1833549F4C0E0D1E089917ADF21E0C730D207D1F7D9C181 :2072E000863521F481E371DF80E3D2C1833731F487E86BDF85E969DF8EE1CAC18536B9F464 :20730000E0E0F0E093E085E090935700E89507B600FCFDCF80935700E89507B600FCFDCF1D :20732000E058FF4FA0E7E030FA0771F7A2CF823739F4E1E0F0E089E0809357008491A8C18E :20734000863439F4E0E0F0E089E08093570084919FC18E3439F4E3E0F0E089E08093570019 :20736000849196C1813539F4E2E0F0E089E08093570084918DC1823631F489E526DF80E046 :2073800024DF80E885C1823419F0873609F0E5C01092AB011092AA0100DF082FFEDEF82E6F :2073A000FCDE682E8554823008F071C1902F80E0CF2DD0E0C82BD92B10926F00173609F08F :2073C0004BC081E180935700E895DD24CC24C3943FC0E090AF01F090B0010091B1011091DD :2073E000B201B6E46B16D9F4ED2DF0E0EE29FF29E4918E2FEADEDD2081F082E090E0A0E00F :20740000B0E0E80EF91E0A1F1B1FE092AF01F092B0010093B1011093B201DC2418C0D801CB :20742000C701B695A7959795879575D5CEDE82E090E0A0E0B0E0E80EF91E0A1F1B1FE092FB :20744000AF01F092B0010093B1011093B2012197209709F0BECF7DC08090AF019090B001EB :20746000A090B101B090B20196E4691609F05DC083E0F40180935700E89507B600FCFDCF64 :2074800054C0F6E46F1661F5772031F1E090AF01F090B0010091B1011091B2017EDED82E20 :2074A000CC24852D90E08C299D29F7010C0140925700E895112482E090E0A0E0B0E0E80E87 :2074C000F91E0A1F1B1FE092AF01F092B0010093B1011093B20102C060DE582E742423C041 :2074E000E090AF01F090B0010091B1011091B20116950795F794E79450DE682FC70113D5E2 :207500008091AF019091B001A091B101B091B2010296A11DB11D8093AF019093B001A09313 :20752000B101B093B201219704C05524772444244394209709F0A5CF96E4691641F485E01D :20754000F40180935700E89507B600FCFDCF8DE03CDE82E080936F009CC0833471F4009156 :20756000AF011091B00119DE90E021E0F8010C0120935700E89511247CCE833619F5E0905E :20758000AF01F090B0010091B1011091B20105DEF701E16090E021E00C0120935700E89552 :2075A000112482E090E0A0E0B0E0E80EF91E0A1F1B1FE092AF01F092B0010093B101109307 :2075C000B20157CE8D3661F4E091AF01F091B00185E080935700E89507B600FCFDCF49CE80 :2075E000823551F4E091AF01F091B00105911491812FEBDD802F4CC0843421F5E090AF01E0 :20760000F090B0010091B1011091B20116950795F794E794C2DD682FC70185D48091AF013D :207620009091B001A091B101B091B2010296A11DB11D8093AF019093B001A093B101B093BE :20764000B20117CE843609F5E090AF01F090B0010091B1011091B201D801C701B695A795CA :207660009795879558D4B1DD82E090E0A0E0B0E0E80EF91E0A1F1B1FE092AF01F092B00161 :207680000093B1011093B20104C08B3111F08FE39CDD83E08093E9009091E8008091E80082 :2076A0008E778093E80095FF04C010C08EB38823C9F08091E80080FFF9CF8091E8008E77BF :2076C0008093E80003C08EB3882361F08091E80080FFF9CF84E08093E9008091E8008B7714 :2076E0008093E800DF91CF911F910F91FF90EF90DF90CF90BF90AF909F908F907F906F90A9 :207700005F904F9008959091B701892F8F77813249F58091B8018032A1F0813219F5913ADD :2077200009F58091E800877F8093E8008CE091E067E070E027D28091E8008B778093E800EE :207740000895913279F48091E800877F8093E8008CE091E067E070E079D28091E8008E77A5 :207760008093E800089582E061EC42E0D1D083E061E842E1CDD084E060E842E1C9C01F9389 :20778000209100081092000844B714BE88E10FB6F89480936000109260000FBE80E8E0E095 :2077A000F0E00FB6F89480936100E09361000FBE31E035BF92E095BF3F9A209A559A809333 :2077C00061001092610047985D9A289A109289008AEF8093880090936F0083E080938100E5 :2077E000859194918F5F9F4F11F03093AE01942F41FF19C0809109012817A9F08093000815 :20780000789480911301882339F08091AC019091AD018F5E9240C8F310920008F89481E0C5 :20782000809313010CC090FF04C08091AE01882351F493FF09C080910901281729F0809173 :20784000AE01882309F04EDCD4D078941092AB011092AA011EEF20C0D7DC4BD38091AA01E6 :207860009091AB0181549F4110F0109213018091B3019091B40101969093B4018093B301FF :20788000292F97FF03C0512F591B252F220F281710F4479801C0479A809113018823E1F653 :2078A0008091E00081608093E0001CDC80E090E01F910895FA01923049F0933061F0913023 :2078C000F9F484E191E022E130E01EC086E291E02EE330E019C0882329F484E691E024E07A :2078E00030E012C0813029F488E691E022E230E00BC0823029F48CE891E028E130E004C089 :2079000080E090E020E030E091838083C90108958093E9008091EB0081608093EB00109290 :20792000ED006093EC004093ED008091EE00881F8827881F08958091B70188238CF403C06B :207940008EB38823B1F08091E80082FFF9CF8091E8008B778093E80008958EB3882349F0A0 :207960008091E80080FFF9CF8091E8008E778093E8000895EF92FF920F931F9345D04CD09A :2079800008ED10E0F80180818F77808380818068808380818F7D808319BC1EBA1092B501FE :2079A00080EEE82EF12CF70180818B7F8083F80180818160808380E060E042E0A9DFE1EE29 :2079C000F0E080818E7F8083E2EEF0E0808181608083808188608083F70180818E7F80834C :2079E000F8018081806180831F910F91FF90EF900895E7EDF0E08081816080838AE482BF76 :207A000081E08093B601B6CFE8EDF0E080818E7F80831092E20008951092DA001092E100E0 :207A200008951F920F920FB60F9211242F933F934F935F936F937F938F939F93AF93BF9358 :207A4000EF93FF938091DA0080FF1BC08091D80080FF17C08091DA008E7F8093DA00809198 :207A6000D90080FF0BC080E189BD82E189BD09B400FEFDCF81E08EBB3BD203C019BC1EBAE5 :207A800037D28091E10080FF17C08091E20080FF13C08091E2008E7F8093E2008091E20068 :207AA00080618093E2008091D80080628093D80019BC85E08EBB1CD28091E10084FF2CC068 :207AC0008091E20084FF28C080E189BD82E189BD09B400FEFDCF8091D8008F7D8093D80091 :207AE0008091E1008F7E8093E1008091E2008F7E8093E2008091E20081608093E2008091C4 :207B0000B501882331F48091E30087FD02C081E001C084E08EBBECD18091E10083FF21C0C4 :207B20008091E20083FF1DC08091E100877F8093E10082E08EBB1092B5018091E1008E7F05 :207B40008093E1008091E2008E7F8093E2008091E20080618093E20080E060E042E0D8DEFB :207B6000C7D1FF91EF91BF91AF919F918F917F916F915F914F913F912F910F900FBE0F9002 :207B80001F9018959C014091BD015091BE014617570718F4F90190E044C06115710511F09B :207BA000AB01F8CF8091E8008E778093E80040E050E0F0CF8EB3882309F444C0853009F4AB :207BC00043C08091E80083FF02C081E008958091E80082FD31C08091E80080FF22C0809193 :207BE000F3009091F200782F60E0292F30E0262B372B07C081918093F100415050402F5FF1 :207C00003F4F4115510519F02830310598F390E02830310509F491E08091E8008E7780938B :207C2000E8004115510531F6992321F605C08EB3882341F0853041F08091E80082FFF7CFAE :207C400080E0089582E0089583E008959C016115710529F48091E8008B778093E800F90192 :207C600026C08EB3882391F1853091F18091E80083FF02C081E008958091E80082FFF1CF04 :207C800006C08091F10081936150704059F02091F3008091F200322F20E090E0822B932B7B :207CA000892B79F78091E8008B778093E80061157105B9F605C08EB3882341F0853041F047 :207CC0008091E80080FFF7CF80E0089582E0089583E008950F931F93DF93CF9300D0CDB7EE :207CE000DEB7E7EBF1E08091F100819381E0EF3BF807C9F708DD8091E80083FFE4C08091D7 :207D0000B7019091B801953009F46DC0963040F4913081F1913070F0933009F0D4C02AC05A :207D2000983009F4A3C0993009F4B2C0963009F0CAC07CC0803809F4C6C0823809F0C3C0ED :207D40008091BB0187708093E9008091EB001092E9002091E800277F2093E80090E025E08D :207D6000969587952A95E1F781708093F1001092F10087C0882319F0823009F0A4C08F7193 :207D8000823009F0A0C08091B901882331F52091BB01277009F497C02093E9008091EB004C :207DA00080FF1BC0933021F48091EB00806213C08091EB0080618093EB0081E090E002C072 :207DC000880F991F2A95E2F78093EA001092EA008091EB0088608093EB001092E9008091B5 :207DE000E800877F51C0882309F06DC01091B9011F770FB7F8948091E800877F8093E80076 :207E00009ADD8091E80080FFFCCF8091E3008078812B8093E30080688093E300112311F403 :207E200082E001C083E08EBB0FBF4DC08058823008F049C08091B9019091BA016091BB01B9 :207E4000AE014F5F5F4F36DDBC01009709F43BC08091E800877F8093E80089819A8192DE29 :207E60008091E8008B778093E8002DC0803859F58091E800877F8093E8008091B501809345 :207E8000F1008091E8008E778093E80054DD1BC08823C9F49091B9019230A8F48091E80052 :207EA000877F8093E8009093B50145DD8091B501882331F48091E30087FD02C081E001C0D3 :207EC00084E08EBB50DC8091E80083FF0AC08091EB0080628093EB008091E800877F809396 :207EE000E8000F900F90CF91DF911F910F91089508951F938EB3882361F01091E9001092E7 :207F0000E9008091E80083FF01C0E4DE17701093E9001F910895F999FECF92BD81BDF89A9C :207F2000992780B50895262FF999FECF1FBA92BD81BD20BD0FB6F894FA9AF99A0FBE0196DC :207F40000895F894FFCF4341544552494E4100770008000000000000080112011001020035 :207F600000084123410001000201000109023E000201008032090400000102020100052415 :207F8000001001042402040524060001070582030800FF09040100020A00000007050402AE :207FA00010000107058302100001040309042203410072006400750069006E006F002000E3 :207FC000590075006E002000200020002000200000001803410072006400750069006E0047 :0C7FE0006F0020004C004C00430000002B :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/caterina/Caterina-YunMini.hex ================================================ :107000005FC0000078C0000076C0000074C00000BF :1070100072C0000070C000006EC000006CC00000B4 :107020006AC0000068C00000D1C4000064C0000055 :1070300062C0000060C000005EC000005CC00000D4 :107040005AC000009CC0000056C0000054C00000A0 :1070500052C0000050C000004EC000004CC00000F4 :107060004AC0000048C0000046C0000044C0000004 :1070700042C0000040C000003EC000003CC0000014 :107080003AC0000038C0000036C0000034C0000024 :1070900032C0000030C000002EC000002CC0000034 :1070A0002AC0000028C0000026C00000553E6E3EE9 :1070B000173F6E3E173FA83ECA3E173FEA3EFC3ED2 :1070C00011241FBECFEFDAE0DEBFCDBF11E0A0E09C :1070D000B1E0E8EBFEE702C005900D92A23BB107DC :1070E000D9F711E0A2EBB1E001C01D92AB3CB107B2 :1070F000E1F71BD3DFC684CF84E08093E900809161 :10710000E80085FD0DC08091E8008B778093E80052 :107110008091E80082FDF3CF8EB38111F9CF02C0D8 :107120008091F100089593E09093E9009091E80038 :1071300095FF0AC08093F1005D9884E690E09093FB :10714000B9018093B80108959091E8009E779093DB :10715000E8009091E80090FDEDCF9EB39111F9CF3A :107160000895F89410926F001092810081E085BF1D :1071700015BE47985D9A289A0C94000008951F92B6 :107180000F920FB60F9211242F938F939F93EF932B :10719000FF9310928500109284008091B801909125 :1071A000B901009741F001979093B9018093B8011C :1071B000892B09F45D9A8091B6019091B7010097EF :1071C00041F001979093B7018093B601892B09F4A0 :1071D000289A8091B2019091B30101969093B301E6 :1071E0008093B201E0E0F0E085919491019649F03E :1071F0008091B4019091B50101969093B50180936F :10720000B401FF91EF919F918F912F910F900FBE3D :107210000F901F90189542E061EC82E054D342E158 :1072200061E883E050D342E160E884E04CC38091A0 :10723000C301982F9F77913239F59091C401903214 :1072400091F0913209F5813AF9F48091E800877F55 :107250008093E80067E070E082E091E068D480917C :10726000E8008B770FC0813279F48091E800877F46 :107270008093E80067E070E082E091E0B5D480910F :10728000E8008E778093E80008956F927F928F9246 :107290009F92AF92BF92CF92DF92EF92FF920F93A5 :1072A0001F93CF93DF9384E08093E9008091E800FF :1072B00082FF2CC2289884E690E09093B7018093D7 :1072C000B6011ADFC82F853481F48CE49DE19093D8 :1072D000B5018093B40107B600FCFDCFF999FECF4C :1072E00081E180935700E89503C0843521F404DFE1 :1072F0008DE019DFE2C18C34D9F38035C9F38437CE :1073000021F484E410DF80E0F4CF813611F489E5C4 :10731000F0CF813491F4F0DEC82FEEDE90E0880FDC :10732000991F2C2F30E0322F2227330F822B932BE3 :10733000AA2797FDA095BA2F94C1803711F483E551 :10734000D8CF833549F4C9EAD1E01C2F195F899160 :10735000EADE1C13FCCFB1C1863521F481E3E3DE04 :1073600080E3C7CF833731F487E8DDDE85E9DBDEF4 :107370008EE1BFCF8536B9F4E0E0F0E083E095E040 :1073800080935700E89507B600FCFDCF9093570017 :10739000E89507B600FCFDCFE058FF4FE11520E768 :1073A000F20771F7A5CF823719F4E1E0F0E00EC0E3 :1073B000863419F4E0E0F0E009C08E3419F4E3E01B :1073C000F0E004C0813539F4E2E0F0E089E0809338 :1073D000570084918ECF823631F489E5A4DE80E0B7 :1073E000A2DE80E886CF823419F0873609F0D1C05A :1073F0001092B5011092B4017FDE082F7DDED82FE8 :107400007BDE182F8BEB810F823010F08FE371CF72 :107410002D2F30E0302B10926F00C73609F043C09B :1074200081E180935700E895E90100E0BB24B39423 :10743000209709F4AAC0C090BB01D090BC01E09095 :10744000BD01F090BE011634B9F4E02FF0E0EC2954 :10745000FD29849168DE002369F082E0C80ED11C0A :10746000E11CF11CC092BB01D092BC01E092BD01B5 :10747000F092BE010B2515C0D701C601B695A795A0 :107480009795879501D54FDEE2E0CE0ED11CE11C29 :10749000F11CC092BB01D092BC01E092BD01F09200 :1074A000BE012197C5CF8090BB019090BC01A090F8 :1074B000BD01B090BE01163441F483E0F401809325 :1074C0005700E89507B600FCFDCFE901712C00E0FC :1074D00066246394209709F44CC0163431F50023D8 :1074E00001F1C090BB01D090BC01E090BD01F090D3 :1074F000BE0102DE272D30E0382BF6010901609233 :107500005700E8951124F2E0CF0ED11CE11CF11CCC :10751000C092BB01D092BC01E092BD01F092BE01CD :1075200002C0EADD782E062522C0E6DD682F8091B4 :10753000BB019091BC01A091BD01B091BE01B69577 :10754000A79597958795A8D48091BB019091BC0190 :10755000A091BD01B091BE010296A11DB11D809305 :10756000BB019093BC01A093BD01B093BE012197D4 :10757000B1CF163441F485E0F40180935700E895CB :1075800007B600FCFDCF8DE0CEDD82E080936F007A :1075900094C0833471F4C091BB01D091BC01ACDDC7 :1075A00090E021E0FE010C0120935700E8951124A2 :1075B0009FCE833601F5C090BB01D090BC01E09016 :1075C000BD01F090BE0198DDF601E16090E021E0A0 :1075D0000C0120935700E8951124F2E0CF0ED11C46 :1075E000E11CF11CC092BB01D092BC01E092BD0134 :1075F000F092BE017DCE8D3661F4E091BB01F09139 :10760000BC0185E080935700E89507B600FCFDCFEC :107610006FCE823551F4E091BB01F091BC01C59170 :10762000D4918D2F80DD8C2F64CE843419F564DDE8 :10763000682F8091BB019091BC01A091BD01B091D8 :10764000BE01B695A7959795879526D48091BB01E5 :107650009091BC01A091BD01B091BE010296A11D07 :10766000B11D8093BB019093BC01A093BD01B09369 :10767000BE013ECE8436F1F4C090BB01D090BC0177 :10768000E090BD01F090BE01D701C601B695A79567 :1076900097958795F9D347DD22E0C20ED11CE11CF6 :1076A000F11CC092BB01D092BC01E092BD01F092EE :1076B000BE0103C08B3109F0A9CE83E08093E900BD :1076C0009091E8008091E8008E778093E80095FD26 :1076D00011C08091E80080FD04C08EB38111F9CF04 :1076E00015C08091E8008E778093E80003C08EB3C8 :1076F000882361F08091E80080FFF9CF84E08093D7 :10770000E9008091E8008B778093E800DF91CF91CA :107710001F910F91FF90EF90DF90CF90BF90AF90AF :107720009F908F907F906F900895CF9390910008D5 :107730001092000884B714BE28E10FB6F894209385 :107740006000109260000FBE40E820E00FB6F89491 :1077500040936100209361000FBE21E025BF32E01D :1077600035BF3F9A209A559A40936100109261006C :1077700047985D9A289A109289004AEF40938800B2 :1077800030936F0033E030938100E0E0F0E045910A :1077900054914F3F5F4F11F02093BA0181FF20C0F9 :1077A000209100019217E1F02093000878948091D5 :1077B0000101882339F08091B2019091B30188379B :1077C0009140C8F31092010110920008F89481E0F2 :1077D000809301018091BA01882371F0C2DC0CC052 :1077E00080FF04C02091BA012111F8CF83FF04C0AB :1077F000809100019813EECFD1D078941092B5010A :107800001092B401CEEF80910101882301F13DDD9A :1078100024D38091B4019091B50181349F4110F03F :10782000109201018091BF019091C0010196909347 :10783000C0018093BF01292F97FF02C02C2F291B65 :10784000220F281710F44798DECF479ADCCF80919B :10785000E00081608093E00084DC80E090E0CF91E4 :107860000895292F30E02230310559F023303105B9 :1078700069F021303105F9F482E190E027E931E047 :107880001EC08EE390E029E531E019C0882349F05D :10789000813061F0823079F48CE190E029E031E0D0 :1078A0000EC084E090E025E531E009C08CE290E074 :1078B00027E231E004C080E090E020E030E0FA010F :1078C0003183208308958093E900EBEEF0E080811E :1078D00081608083EDEEF0E010826093EC004083E5 :1078E0008091EE00881F8827881F08958091C3012A :1078F00087FF0FC08091E80082FD04C08EB3811124 :10790000F9CF10C08091E8008B770AC08EB388232E :1079100049F08091E80080FFF9CF8091E8008E77F0 :107920008093E80008950F931F93CF93DF9341D086 :1079300048D0C8EDD0E088818F77888388818068BF :10794000888388818F7D888319BC1EBA1092C101FB :1079500000EE10E0F80180818B7F80838881816058 :10796000888342E060E080E0AEDFE1EEF0E080811D :107970008E7F8083E2EEF0E0808181608083808171 :1079800088608083F80180818E7F80838881806118 :107990008883DF91CF911F910F910895E7EDF0E07B :1079A0008081816080838AE482BF81E08093C2010C :1079B000BACFE8EDF0E080818E7F80831092E20004 :1079C00008951092DA001092E10008951F920F922C :1079D0000FB60F9211242F933F934F935F936F93A2 :1079E0007F938F939F93AF93BF93EF93FF93809178 :1079F000DA0080FF1BC08091D80080FF17C0809103 :107A0000DA008E7F8093DA008091D90080FF0BC06E :107A100080E189BD82E189BD09B400FEFDCF81E02E :107A20008EBB1AD203C019BC1EBA16D28091E100D7 :107A300080FF17C08091E20080FF13C08091E200B8 :107A40008E7F8093E2008091E20080618093E2006B :107A50008091D80080628093D80019BC85E08EBBED :107A6000FBD18091E10084FF2CC08091E20084FF73 :107A700028C080E189BD82E189BD09B400FEFDCF47 :107A80008091D8008F7D8093D8008091E1008F7E17 :107A90008093E1008091E2008F7E8093E2008091EC :107AA000E20081608093E2008091C101811106C0F3 :107AB0008091E30087FD02C081E001C084E08EBBBD :107AC000CBD18091E10083FF21C08091E20083FF50 :107AD0001DC08091E100877F8093E10082E08EBB32 :107AE0001092C1018091E1008E7F8093E10080912E :107AF000E2008E7F8093E2008091E20080618093BB :107B0000E20042E060E080E0DEDEA6D1FF91EF918E :107B1000BF91AF919F918F917F916F915F914F91A5 :107B20003F912F910F900FBE0F901F9018952091AD :107B3000C9013091CA012617370748F06115710550 :107B400039F42091E8002E772093E80001C0B901B4 :107B500040E061157105A1F12EB3222309F440C064 :107B6000253009F43FC02091E80023FD37C0209163 :107B7000E80022FD2DC02091E80020FFEACF4091CF :107B8000F3002091F20030E0342BFC01CF016115AD :107B9000710559F02830310540F481918093F1004E :107BA000615071092F5F3F4FF1CF41E0283031051F :107BB00009F040E02091E8002E772093E800C9CF3B :107BC0004111CACF05C08EB3882351F0853051F0E2 :107BD0008091E80082FFF7CF80E0089581E008956A :107BE00082E0089583E008956115710529F42091DC :107BF000E8002B772093E800FC016115710531F155 :107C00008EB3882359F1853059F18091E80083FDC6 :107C100023C08091E80082FFF0CF2091F300809193 :107C2000F20090E0922B892B31F08091F10081934A :107C30006150710991F78091E8008B778093E8009B :107C4000DCCF8EB3882351F0853051F08091E8006D :107C500080FFF7CF80E0089581E0089582E00895E5 :107C600083E008950F931F93CF93DF9300D0CDB798 :107C7000DEB7E3ECF1E088E08E0F9091F100919394 :107C80008E13FBCFD4DA8091E80083FFD0C08091BF :107C9000C301E091C4014E2F50E04A30510508F075 :107CA000C6C0FA01EA5AF74CE9C0823809F0BFC0F1 :107CB0008091C70187708093E9008091EB0010925A :107CC000E9009091E800977F9093E80085FB882772 :107CD00080F98093F1001092F10087C0982F9D7F6A :107CE00009F0A5C0823009F0A2C08091C5018111C0 :107CF00029C08091C701877009F499C08093E90079 :107D00009091EB0090FF1EC09091C401933021F43C :107D10008091EB00806214C09091EB009061909391 :107D2000EB0021E030E0A90102C0440F551F8A9505 :107D3000E2F74093EA001092EA008091EB0088603D :107D40008093EB001092E9008091E800877F50C09B :107D500081116DC01091C5011F770FB7F894809104 :107D6000E800877F8093E800C1DD8091E80080FF14 :107D7000FCCF8091E3008078812B8093E3008068C2 :107D80008093E300111102C082E001C083E08EBB4A :107D90000FBF4DC08058823008F049C0AE014F5F20 :107DA0005F4F6091C7018091C5019091C60159DD77 :107DB000BC01009709F43BC09091E800977F909335 :107DC000E80089819A81B3DE8091E8008B77809307 :107DD000E8002DC0803859F58091E800877F8093B6 :107DE000E8008091C1018093F1008091E8008E77D6 :107DF0008093E8007BDD1BC0811119C09091C50103 :107E00009230A8F48091E800877F8093E8009093F7 :107E1000C1016CDD8091C101811106C08091E30038 :107E200087FD02C081E001C084E08EBBF4D980915F :107E3000E80083FF0AC08091EB0080628093EB0032 :107E40008091E800877F8093E8000F900F90DF918A :107E5000CF911F910F9108950895CF938EB38823EA :107E600059F0C091E900C7701092E9008091E800D4 :107E700083FDF8DEC093E900CF910895EE0FFF1F58 :107E80000590F491E02D0994F999FECF92BD81BD42 :107E9000F89A992780B50895262FF999FECF1FBA31 :107EA00092BD81BD20BD0FB6F894FA9AF99A0FBE23 :087EB00001960895F894FFCF3C :107EB8007701000000000000081C03410072006404 :107EC80000750069006E006F002000730072006C7E :107ED800002000200000002C03410072006400759F :107EE8000069006E006F002000590075006E002DBB :107EF800004D0069006E006900200020002000206D :107F080000200000000403090409023E00020100E9 :107F1800803209040000010202010005240010015A :107F2800042402040524060001070582030800FF53 :107F380009040100020A00000007050402100001FC :107F48000705830210000112011001020000080356 :107F58002A50000100020100014341544552494E94 :027F68004100D6 :040000030000700089 :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/caterina/Caterina.c ================================================ /* LUFA Library Copyright (C) Dean Camera, 2011. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /** \file * * Main source file for the CDC class bootloader. This file contains the complete bootloader logic. */ #define INCLUDE_FROM_CATERINA_C #include "Caterina.h" /** Contains the current baud rate and other settings of the first virtual serial port. This must be retained as some * operating systems will not open the port unless the settings can be set successfully. */ static CDC_LineEncoding_t LineEncoding = { .BaudRateBPS = 0, .CharFormat = CDC_LINEENCODING_OneStopBit, .ParityType = CDC_PARITY_None, .DataBits = 8 }; /** Current address counter. This stores the current address of the FLASH or EEPROM as set by the host, * and is used when reading or writing to the AVRs memory (either FLASH or EEPROM depending on the issued * command.) */ static uint32_t CurrAddress; /** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run * via a watchdog reset. When cleared the bootloader will exit, starting the watchdog and entering an infinite * loop until the AVR restarts and the application runs. */ static bool RunBootloader = true; /* Pulse generation counters to keep track of the time remaining for each pulse type */ #define TX_RX_LED_PULSE_PERIOD 100 uint16_t TxLEDPulse = 0; // time remaining for Tx LED pulse uint16_t RxLEDPulse = 0; // time remaining for Rx LED pulse /* Bootloader timeout timer */ #define TIMEOUT_PERIOD 8000 uint16_t Timeout = 0; uint16_t bootKey = 0x7777; volatile uint16_t *const bootKeyPtr = (volatile uint16_t *)0x0800; void StartSketch(void) { cli(); /* Undo TIMER1 setup and clear the count before running the sketch */ TIMSK1 = 0; TCCR1B = 0; TCNT1H = 0; // 16-bit write to TCNT1 requires high byte be written first TCNT1L = 0; /* Relocate the interrupt vector table to the application section */ MCUCR = (1 << IVCE); MCUCR = 0; L_LED_OFF(); TX_LED_OFF(); RX_LED_OFF(); /* jump to beginning of application space */ __asm__ volatile("jmp 0x0000"); } /* Breathing animation on L LED indicates bootloader is running */ uint16_t LLEDPulse; void LEDPulse(void) { LLEDPulse++; uint8_t p = LLEDPulse >> 8; if (p > 127) p = 254-p; p += p; if (((uint8_t)LLEDPulse) > p) L_LED_OFF(); else L_LED_ON(); } /** Main program entry point. This routine configures the hardware required by the bootloader, then continuously * runs the bootloader processing routine until it times out or is instructed to exit. */ int main(void) { /* Save the value of the boot key memory before it is overwritten */ uint16_t bootKeyPtrVal = *bootKeyPtr; *bootKeyPtr = 0; /* Check the reason for the reset so we can act accordingly */ uint8_t mcusr_state = MCUSR; // store the initial state of the Status register MCUSR = 0; // clear all reset flags /* Watchdog may be configured with a 15 ms period so must disable it before going any further */ wdt_disable(); if (mcusr_state & (1< TIMEOUT_PERIOD) RunBootloader = false; LEDPulse(); } /* Disconnect from the host - USB interface will be reset later along with the AVR */ USB_Detach(); /* Jump to beginning of application space to run the sketch - do not reset */ StartSketch(); } /** Configures all hardware required for the bootloader. */ void SetupHardware(void) { /* Disable watchdog if enabled by bootloader/fuses */ MCUSR &= ~(1 << WDRF); wdt_disable(); /* Disable clock division */ clock_prescale_set(clock_div_1); /* Relocate the interrupt vector table to the bootloader section */ MCUCR = (1 << IVCE); MCUCR = (1 << IVSEL); LED_SETUP(); CPU_PRESCALE(0); L_LED_OFF(); TX_LED_OFF(); RX_LED_OFF(); /* Initialize TIMER1 to handle bootloader timeout and LED tasks. * With 16 MHz clock and 1/64 prescaler, timer 1 is clocked at 250 kHz * Our chosen compare match generates an interrupt every 1 ms. * This interrupt is disabled selectively when doing memory reading, erasing, * or writing since SPM has tight timing requirements. */ OCR1AH = 0; OCR1AL = 250; TIMSK1 = (1 << OCIE1A); // enable timer 1 output compare A match interrupt TCCR1B = ((1 << CS11) | (1 << CS10)); // 1/64 prescaler on timer 1 input /* Initialize USB Subsystem */ USB_Init(); } //uint16_t ctr = 0; ISR(TIMER1_COMPA_vect, ISR_BLOCK) { /* Reset counter */ TCNT1H = 0; TCNT1L = 0; /* Check whether the TX or RX LED one-shot period has elapsed. if so, turn off the LED */ if (TxLEDPulse && !(--TxLEDPulse)) TX_LED_OFF(); if (RxLEDPulse && !(--RxLEDPulse)) RX_LED_OFF(); if (pgm_read_word(0) != 0xFFFF) Timeout++; } /** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready * to relay data to and from the attached USB host. */ void EVENT_USB_Device_ConfigurationChanged(void) { /* Setup CDC Notification, Rx and Tx Endpoints */ Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, CDC_NOTIFICATION_EPSIZE, ENDPOINT_BANK_SINGLE); Endpoint_ConfigureEndpoint(CDC_TX_EPNUM, EP_TYPE_BULK, ENDPOINT_DIR_IN, CDC_TXRX_EPSIZE, ENDPOINT_BANK_SINGLE); Endpoint_ConfigureEndpoint(CDC_RX_EPNUM, EP_TYPE_BULK, ENDPOINT_DIR_OUT, CDC_TXRX_EPSIZE, ENDPOINT_BANK_SINGLE); } /** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to * the device from the USB host before passing along unhandled control requests to the library for processing * internally. */ void EVENT_USB_Device_ControlRequest(void) { /* Ignore any requests that aren't directed to the CDC interface */ if ((USB_ControlRequest.bmRequestType & (CONTROL_REQTYPE_TYPE | CONTROL_REQTYPE_RECIPIENT)) != (REQTYPE_CLASS | REQREC_INTERFACE)) { return; } /* Process CDC specific control requests */ switch (USB_ControlRequest.bRequest) { case CDC_REQ_GetLineEncoding: if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { Endpoint_ClearSETUP(); /* Write the line coding data to the control endpoint */ Endpoint_Write_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); Endpoint_ClearOUT(); } break; case CDC_REQ_SetLineEncoding: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { Endpoint_ClearSETUP(); /* Read the line coding data in from the host into the global struct */ Endpoint_Read_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); Endpoint_ClearIN(); } break; } } #if !defined(NO_BLOCK_SUPPORT) /** Reads or writes a block of EEPROM or FLASH memory to or from the appropriate CDC data endpoint, depending * on the AVR910 protocol command issued. * * \param[in] Command Single character AVR910 protocol command indicating what memory operation to perform */ static void ReadWriteMemoryBlock(const uint8_t Command) { uint16_t BlockSize; char MemoryType; bool HighByte = false; uint8_t LowByte = 0; BlockSize = (FetchNextCommandByte() << 8); BlockSize |= FetchNextCommandByte(); MemoryType = FetchNextCommandByte(); if ((MemoryType != 'E') && (MemoryType != 'F')) { /* Send error byte back to the host */ WriteNextResponseByte('?'); return; } /* Disable timer 1 interrupt - can't afford to process nonessential interrupts * while doing SPM tasks */ TIMSK1 = 0; /* Check if command is to read memory */ if (Command == 'g') { /* Re-enable RWW section */ boot_rww_enable(); while (BlockSize--) { if (MemoryType == 'F') { /* Read the next FLASH byte from the current FLASH page */ #if (FLASHEND > 0xFFFF) WriteNextResponseByte(pgm_read_byte_far(CurrAddress | HighByte)); #else WriteNextResponseByte(pgm_read_byte(CurrAddress | HighByte)); #endif /* If both bytes in current word have been read, increment the address counter */ if (HighByte) CurrAddress += 2; HighByte = !HighByte; } else { /* Read the next EEPROM byte into the endpoint */ WriteNextResponseByte(eeprom_read_byte((uint8_t*)(intptr_t)(CurrAddress >> 1))); /* Increment the address counter after use */ CurrAddress += 2; } } } else { uint32_t PageStartAddress = CurrAddress; if (MemoryType == 'F') { boot_page_erase(PageStartAddress); boot_spm_busy_wait(); } while (BlockSize--) { if (MemoryType == 'F') { /* If both bytes in current word have been written, increment the address counter */ if (HighByte) { /* Write the next FLASH word to the current FLASH page */ boot_page_fill(CurrAddress, ((FetchNextCommandByte() << 8) | LowByte)); /* Increment the address counter after use */ CurrAddress += 2; } else { LowByte = FetchNextCommandByte(); } HighByte = !HighByte; } else { /* Write the next EEPROM byte from the endpoint */ eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); /* Increment the address counter after use */ CurrAddress += 2; } } /* If in FLASH programming mode, commit the page after writing */ if (MemoryType == 'F') { /* Commit the flash page to memory */ boot_page_write(PageStartAddress); /* Wait until write operation has completed */ boot_spm_busy_wait(); } /* Send response byte back to the host */ WriteNextResponseByte('\r'); } /* Re-enable timer 1 interrupt disabled earlier in this routine */ TIMSK1 = (1 << OCIE1A); } #endif /** Retrieves the next byte from the host in the CDC data OUT endpoint, and clears the endpoint bank if needed * to allow reception of the next data packet from the host. * * \return Next received byte from the host in the CDC data OUT endpoint */ static uint8_t FetchNextCommandByte(void) { /* Select the OUT endpoint so that the next data byte can be read */ Endpoint_SelectEndpoint(CDC_RX_EPNUM); /* If OUT endpoint empty, clear it and wait for the next packet from the host */ while (!(Endpoint_IsReadWriteAllowed())) { Endpoint_ClearOUT(); while (!(Endpoint_IsOUTReceived())) { if (USB_DeviceState == DEVICE_STATE_Unattached) return 0; } } /* Fetch the next byte from the OUT endpoint */ return Endpoint_Read_8(); } /** Writes the next response byte to the CDC data IN endpoint, and sends the endpoint back if needed to free up the * bank when full ready for the next byte in the packet to the host. * * \param[in] Response Next response byte to send to the host */ static void WriteNextResponseByte(const uint8_t Response) { /* Select the IN endpoint so that the next data byte can be written */ Endpoint_SelectEndpoint(CDC_TX_EPNUM); /* If IN endpoint full, clear it and wait until ready for the next packet to the host */ if (!(Endpoint_IsReadWriteAllowed())) { Endpoint_ClearIN(); while (!(Endpoint_IsINReady())) { if (USB_DeviceState == DEVICE_STATE_Unattached) return; } } /* Write the next byte to the IN endpoint */ Endpoint_Write_8(Response); TX_LED_ON(); TxLEDPulse = TX_RX_LED_PULSE_PERIOD; } #define STK_OK 0x10 #define STK_INSYNC 0x14 // ' ' #define CRC_EOP 0x20 // 'SPACE' #define STK_GET_SYNC 0x30 // '0' #define STK_GET_PARAMETER 0x41 // 'A' #define STK_SET_DEVICE 0x42 // 'B' #define STK_SET_DEVICE_EXT 0x45 // 'E' #define STK_LOAD_ADDRESS 0x55 // 'U' #define STK_UNIVERSAL 0x56 // 'V' #define STK_PROG_PAGE 0x64 // 'd' #define STK_READ_PAGE 0x74 // 't' #define STK_READ_SIGN 0x75 // 'u' /** Task to read in AVR910 commands from the CDC data OUT endpoint, process them, perform the required actions * and send the appropriate response back to the host. */ void CDC_Task(void) { /* Select the OUT endpoint */ Endpoint_SelectEndpoint(CDC_RX_EPNUM); /* Check if endpoint has a command in it sent from the host */ if (!(Endpoint_IsOUTReceived())) return; RX_LED_ON(); RxLEDPulse = TX_RX_LED_PULSE_PERIOD; /* Read in the bootloader command (first byte sent from host) */ uint8_t Command = FetchNextCommandByte(); if (Command == 'E') { /* We nearly run out the bootloader timeout clock, * leaving just a few hundred milliseconds so the * bootloder has time to respond and service any * subsequent requests */ Timeout = TIMEOUT_PERIOD - 500; /* Re-enable RWW section - must be done here in case * user has disabled verification on upload. */ boot_rww_enable_safe(); // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if (Command == 'T') { FetchNextCommandByte(); // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if ((Command == 'L') || (Command == 'P')) { // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if (Command == 't') { // Return ATMEGA128 part code - this is only to allow AVRProg to use the bootloader WriteNextResponseByte(0x44); WriteNextResponseByte(0x00); } else if (Command == 'a') { // Indicate auto-address increment is supported WriteNextResponseByte('Y'); } else if (Command == 'A') { // Set the current address to that given by the host CurrAddress = (FetchNextCommandByte() << 9); CurrAddress |= (FetchNextCommandByte() << 1); // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if (Command == 'p') { // Indicate serial programmer back to the host WriteNextResponseByte('S'); } else if (Command == 'S') { // Write the 7-byte software identifier to the endpoint for (uint8_t CurrByte = 0; CurrByte < 7; CurrByte++) WriteNextResponseByte(SOFTWARE_IDENTIFIER[CurrByte]); } else if (Command == 'V') { WriteNextResponseByte('0' + BOOTLOADER_VERSION_MAJOR); WriteNextResponseByte('0' + BOOTLOADER_VERSION_MINOR); } else if (Command == 's') { WriteNextResponseByte(AVR_SIGNATURE_3); WriteNextResponseByte(AVR_SIGNATURE_2); WriteNextResponseByte(AVR_SIGNATURE_1); } else if (Command == 'e') { // Clear the application section of flash for (uint32_t CurrFlashAddress = 0; CurrFlashAddress < BOOT_START_ADDR; CurrFlashAddress += SPM_PAGESIZE) { boot_page_erase(CurrFlashAddress); boot_spm_busy_wait(); boot_page_write(CurrFlashAddress); boot_spm_busy_wait(); } // Send confirmation byte back to the host WriteNextResponseByte('\r'); } #if !defined(NO_LOCK_BYTE_WRITE_SUPPORT) else if (Command == 'l') { // Set the lock bits to those given by the host boot_lock_bits_set(FetchNextCommandByte()); // Send confirmation byte back to the host WriteNextResponseByte('\r'); } #endif else if (Command == 'r') { WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOCK_BITS)); } else if (Command == 'F') { WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS)); } else if (Command == 'N') { WriteNextResponseByte(boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS)); } else if (Command == 'Q') { WriteNextResponseByte(boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS)); } #if !defined(NO_BLOCK_SUPPORT) else if (Command == 'b') { WriteNextResponseByte('Y'); // Send block size to the host WriteNextResponseByte(SPM_PAGESIZE >> 8); WriteNextResponseByte(SPM_PAGESIZE & 0xFF); } else if ((Command == 'B') || (Command == 'g')) { // Keep resetting the timeout counter if we're receiving self-programming instructions Timeout = 0; // Delegate the block write/read to a separate function for clarity ReadWriteMemoryBlock(Command); } #endif #if !defined(NO_FLASH_BYTE_SUPPORT) else if (Command == 'C') { // Write the high byte to the current flash page boot_page_fill(CurrAddress, FetchNextCommandByte()); // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if (Command == 'c') { // Write the low byte to the current flash page boot_page_fill(CurrAddress | 0x01, FetchNextCommandByte()); // Increment the address CurrAddress += 2; // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if (Command == 'm') { // Commit the flash page to memory boot_page_write(CurrAddress); // Wait until write operation has completed boot_spm_busy_wait(); // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if (Command == 'R') { #if (FLASHEND > 0xFFFF) uint16_t ProgramWord = pgm_read_word_far(CurrAddress); #else uint16_t ProgramWord = pgm_read_word(CurrAddress); #endif WriteNextResponseByte(ProgramWord >> 8); WriteNextResponseByte(ProgramWord & 0xFF); } #endif #if !defined(NO_EEPROM_BYTE_SUPPORT) else if (Command == 'D') { // Read the byte from the endpoint and write it to the EEPROM eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); // Increment the address after use CurrAddress += 2; // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if (Command == 'd') { // Read the EEPROM byte and write it to the endpoint WriteNextResponseByte(eeprom_read_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)))); // Increment the address after use CurrAddress += 2; } #endif else if (Command != 27) { // Unknown (non-sync) command, return fail code WriteNextResponseByte('?'); } /* Select the IN endpoint */ Endpoint_SelectEndpoint(CDC_TX_EPNUM); /* Remember if the endpoint is completely full before clearing it */ bool IsEndpointFull = !(Endpoint_IsReadWriteAllowed()); /* Send the endpoint data to the host */ Endpoint_ClearIN(); /* If a full endpoint's worth of data was sent, we need to send an empty packet afterwards to signal end of transfer */ if (IsEndpointFull) { while (!(Endpoint_IsINReady())) { if (USB_DeviceState == DEVICE_STATE_Unattached) return; } Endpoint_ClearIN(); } /* Wait until the data has been sent to the host */ while (!(Endpoint_IsINReady())) { if (USB_DeviceState == DEVICE_STATE_Unattached) return; } /* Select the OUT endpoint */ Endpoint_SelectEndpoint(CDC_RX_EPNUM); /* Acknowledge the command from the host */ Endpoint_ClearOUT(); } ================================================ FILE: external/arduino/avr/bootloaders/caterina/Caterina.h ================================================ /* LUFA Library Copyright (C) Dean Camera, 2011. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /** \file * * Header file for BootloaderCDC.c. */ #ifndef _CDC_H_ #define _CDC_H_ /* Includes: */ #include #include #include #include #include #include #include #include "Descriptors.h" #include /* Macros: */ /** Version major of the CDC bootloader. */ #define BOOTLOADER_VERSION_MAJOR 0x01 /** Version minor of the CDC bootloader. */ #define BOOTLOADER_VERSION_MINOR 0x00 /** Hardware version major of the CDC bootloader. */ #define BOOTLOADER_HWVERSION_MAJOR 0x01 /** Hardware version minor of the CDC bootloader. */ #define BOOTLOADER_HWVERSION_MINOR 0x00 /** Eight character bootloader firmware identifier reported to the host when requested */ #define SOFTWARE_IDENTIFIER "CATERINA" #define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) #define LED_SETUP() DDRC |= (1<<7); DDRB |= (1<<0); DDRD |= (1<<5); #define L_LED_OFF() PORTC &= ~(1<<7) #define L_LED_ON() PORTC |= (1<<7) #define L_LED_TOGGLE() PORTC ^= (1<<7) #if DEVICE_PID == 0x0037 // polarity of the RX and TX LEDs is reversed on the Micro #define TX_LED_OFF() PORTD &= ~(1<<5) #define TX_LED_ON() PORTD |= (1<<5) #define RX_LED_OFF() PORTB &= ~(1<<0) #define RX_LED_ON() PORTB |= (1<<0) #else #define TX_LED_OFF() PORTD |= (1<<5) #define TX_LED_ON() PORTD &= ~(1<<5) #define RX_LED_OFF() PORTB |= (1<<0) #define RX_LED_ON() PORTB &= ~(1<<0) #endif /* Type Defines: */ /** Type define for a non-returning pointer to the start of the loaded application in flash memory. */ typedef void (*AppPtr_t)(void) ATTR_NO_RETURN; /* Function Prototypes: */ void StartSketch(void); void LEDPulse(void); void CDC_Task(void); void SetupHardware(void); void EVENT_USB_Device_ConfigurationChanged(void); #if defined(INCLUDE_FROM_CATERINA_C) || defined(__DOXYGEN__) #if !defined(NO_BLOCK_SUPPORT) static void ReadWriteMemoryBlock(const uint8_t Command); #endif static uint8_t FetchNextCommandByte(void); static void WriteNextResponseByte(const uint8_t Response); #endif #endif ================================================ FILE: external/arduino/avr/bootloaders/caterina/Descriptors.c ================================================ /* LUFA Library Copyright (C) Dean Camera, 2011. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /** \file * * USB Device Descriptors, for library use when in USB device mode. Descriptors are special * computer-readable structures which the host requests upon device enumeration, to determine * the device's capabilities and functions. */ #include "Descriptors.h" /** Device descriptor structure. This descriptor, located in SRAM memory, describes the overall * device characteristics, including the supported USB version, control endpoint size and the * number of device configurations. The descriptor is read out by the USB host when the enumeration * process begins. */ const USB_Descriptor_Device_t DeviceDescriptor = { .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, .USBSpecification = VERSION_BCD(01.10), .Class = CDC_CSCP_CDCClass, .SubClass = CDC_CSCP_NoSpecificSubclass, .Protocol = CDC_CSCP_NoSpecificProtocol, .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, .VendorID = DEVICE_VID, .ProductID = DEVICE_PID, .ReleaseNumber = VERSION_BCD(00.01), .ManufacturerStrIndex = 0x02, .ProductStrIndex = 0x01, .SerialNumStrIndex = NO_DESCRIPTOR, .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS }; /** Configuration descriptor structure. This descriptor, located in SRAM memory, describes the usage * of the device in one of its supported configurations, including information about any device interfaces * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting * a configuration so that the host may correctly communicate with the USB device. */ const USB_Descriptor_Configuration_t ConfigurationDescriptor = { .Config = { .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), .TotalInterfaces = 2, .ConfigurationNumber = 1, .ConfigurationStrIndex = NO_DESCRIPTOR, .ConfigAttributes = USB_CONFIG_ATTR_BUSPOWERED, .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) }, .CDC_CCI_Interface = { .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, .InterfaceNumber = 0, .AlternateSetting = 0, .TotalEndpoints = 1, .Class = CDC_CSCP_CDCClass, .SubClass = CDC_CSCP_ACMSubclass, .Protocol = CDC_CSCP_ATCommandProtocol, .InterfaceStrIndex = NO_DESCRIPTOR }, .CDC_Functional_Header = { .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t), .Type = DTYPE_CSInterface}, .Subtype = 0x00, .CDCSpecification = VERSION_BCD(01.10), }, .CDC_Functional_ACM = { .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = DTYPE_CSInterface}, .Subtype = 0x02, .Capabilities = 0x04, }, .CDC_Functional_Union = { .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = DTYPE_CSInterface}, .Subtype = 0x06, .MasterInterfaceNumber = 0, .SlaveInterfaceNumber = 1, }, .CDC_NotificationEndpoint = { .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, .EndpointAddress = (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM), .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), .EndpointSize = CDC_NOTIFICATION_EPSIZE, .PollingIntervalMS = 0xFF }, .CDC_DCI_Interface = { .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, .InterfaceNumber = 1, .AlternateSetting = 0, .TotalEndpoints = 2, .Class = CDC_CSCP_CDCDataClass, .SubClass = CDC_CSCP_NoDataSubclass, .Protocol = CDC_CSCP_NoDataProtocol, .InterfaceStrIndex = NO_DESCRIPTOR }, .CDC_DataOutEndpoint = { .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, .EndpointAddress = (ENDPOINT_DIR_OUT | CDC_RX_EPNUM), .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), .EndpointSize = CDC_TXRX_EPSIZE, .PollingIntervalMS = 0x01 }, .CDC_DataInEndpoint = { .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, .EndpointAddress = (ENDPOINT_DIR_IN | CDC_TX_EPNUM), .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), .EndpointSize = CDC_TXRX_EPSIZE, .PollingIntervalMS = 0x01 } }; /** Language descriptor structure. This descriptor, located in SRAM memory, is returned when the host requests * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate * via the language ID table available at USB.org what languages the device supports for its string descriptors. */ const USB_Descriptor_String_t LanguageString = { .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, .UnicodeString = {LANGUAGE_ID_ENG} }; /** Product descriptor string. This is a Unicode string containing the product's details in human readable form, * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device * Descriptor. */ const USB_Descriptor_String_t ProductString = { .Header = {.Size = USB_STRING_LEN(16), .Type = DTYPE_String}, #if DEVICE_PID == 0x0036 .UnicodeString = L"Arduino Leonardo" #elif DEVICE_PID == 0x0037 .UnicodeString = L"Arduino Micro " #elif DEVICE_PID == 0x003C .UnicodeString = L"Arduino Esplora " #else .UnicodeString = L"USB IO board " #endif }; const USB_Descriptor_String_t ManufNameString = { .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, #if DEVICE_VID == 0x2341 .UnicodeString = L"Arduino LLC" #else .UnicodeString = L"Unknown " #endif }; /** This function is called by the library when in device mode, and must be overridden (see LUFA library "USB Descriptors" * documentation) by the application code so that the address and size of a requested descriptor can be given * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the * USB host. */ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex, const void** const DescriptorAddress) { const uint8_t DescriptorType = (wValue >> 8); const uint8_t DescriptorNumber = (wValue & 0xFF); const void* Address = NULL; uint16_t Size = NO_DESCRIPTOR; switch (DescriptorType) { case DTYPE_Device: Address = &DeviceDescriptor; Size = sizeof(USB_Descriptor_Device_t); break; case DTYPE_Configuration: Address = &ConfigurationDescriptor; Size = sizeof(USB_Descriptor_Configuration_t); break; case DTYPE_String: if (!(DescriptorNumber)) { Address = &LanguageString; Size = LanguageString.Header.Size; } else if (DescriptorNumber == DeviceDescriptor.ProductStrIndex) { Address = &ProductString; Size = ProductString.Header.Size; } else if (DescriptorNumber == DeviceDescriptor.ManufacturerStrIndex) { Address = &ManufNameString; Size = ManufNameString.Header.Size; } break; } *DescriptorAddress = Address; return Size; } ================================================ FILE: external/arduino/avr/bootloaders/caterina/Descriptors.h ================================================ /* LUFA Library Copyright (C) Dean Camera, 2011. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /** \file * * Header file for Descriptors.c. */ #ifndef _DESCRIPTORS_H_ #define _DESCRIPTORS_H_ /* Includes: */ #include /* Macros: */ #if defined(__AVR_AT90USB1287__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x97 #define AVR_SIGNATURE_3 0x82 #elif defined(__AVR_AT90USB647__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x96 #define AVR_SIGNATURE_3 0x82 #elif defined(__AVR_AT90USB1286__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x97 #define AVR_SIGNATURE_3 0x82 #elif defined(__AVR_AT90USB646__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x96 #define AVR_SIGNATURE_3 0x82 #elif defined(__AVR_ATmega32U6__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x95 #define AVR_SIGNATURE_3 0x88 #elif defined(__AVR_ATmega32U4__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x95 #define AVR_SIGNATURE_3 0x87 #elif defined(__AVR_ATmega16U4__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x94 #define AVR_SIGNATURE_3 0x88 #elif defined(__AVR_ATmega32U2__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x95 #define AVR_SIGNATURE_3 0x8A #elif defined(__AVR_ATmega16U2__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x94 #define AVR_SIGNATURE_3 0x89 #elif defined(__AVR_AT90USB162__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x94 #define AVR_SIGNATURE_3 0x82 #elif defined(__AVR_ATmega8U2__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x93 #define AVR_SIGNATURE_3 0x89 #elif defined(__AVR_AT90USB82__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x94 #define AVR_SIGNATURE_3 0x82 #else #error The selected AVR part is not currently supported by this bootloader. #endif /** Endpoint number for the CDC control interface event notification endpoint. */ #define CDC_NOTIFICATION_EPNUM 2 /** Endpoint number for the CDC data interface TX (data IN) endpoint. */ #define CDC_TX_EPNUM 3 /** Endpoint number for the CDC data interface RX (data OUT) endpoint. */ #define CDC_RX_EPNUM 4 /** Size of the CDC data interface TX and RX data endpoint banks, in bytes. */ #define CDC_TXRX_EPSIZE 16 /** Size of the CDC control interface notification endpoint bank, in bytes. */ #define CDC_NOTIFICATION_EPSIZE 8 /* Type Defines: */ /** Type define for the device configuration descriptor structure. This must be defined in the * application code, as the configuration descriptor contains several sub-descriptors which * vary between devices, and which describe the device's usage to the host. */ typedef struct { USB_Descriptor_Configuration_Header_t Config; // CDC Control Interface USB_Descriptor_Interface_t CDC_CCI_Interface; USB_CDC_Descriptor_FunctionalHeader_t CDC_Functional_Header; USB_CDC_Descriptor_FunctionalACM_t CDC_Functional_ACM; USB_CDC_Descriptor_FunctionalUnion_t CDC_Functional_Union; USB_Descriptor_Endpoint_t CDC_NotificationEndpoint; // CDC Data Interface USB_Descriptor_Interface_t CDC_DCI_Interface; USB_Descriptor_Endpoint_t CDC_DataOutEndpoint; USB_Descriptor_Endpoint_t CDC_DataInEndpoint; } USB_Descriptor_Configuration_t; /* Function Prototypes: */ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex, const void** const DescriptorAddress) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); #endif ================================================ FILE: external/arduino/avr/bootloaders/caterina/Esplora-prod-firmware-2012-12-10.hex ================================================ :200000000C946E010C9496010C9496010C9496010C9496010C9496010C9496010C94960150 :200020000C9496010C9496010C94F6040C947D050C9496010C9496010C9496010C949601BA :200040000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C94B501C9 :200060000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601C8 :200080000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601A8 :2000A0000C9496010C9496010C94960100000000240027002A002D003000000000002500A4 :2000C00028002B002E003100000000002300260029002C002F00040404040403040502027D :2000E0000202040302020202060606060606040402020204040802011040804010204080A8 :200100004080080204018040201002011080102040400000000200080E0000030401000BB2 :200120000000070605040100080A0B0C0D09040309042203410072006400750069006E00CD :200140006F0020004500730070006C006F007200610020001803410072006400750069000A :200160006E006F0020004C004C004300120100020000004041233C8000010102000112011A :2001800000020200004041233C8000010102000100C18081C1080B0002020201000904004C :2001A000000102020000052400100105240101010424020605240600010705810310004094 :2001C00009040100020A000000070502024000000705830240000005010902A1010901A186 :2001E000008501050919012903150025019503750181029501750581030501093009310943 :20020000381581257F750895038106C0C005010906A1018502050719E029E715002501754D :20022000019508810295017508810395067508150025650507190029658100C0090402004C :2002400001030000000921010100012265000705840340000100000000000000002A2B2895 :200260000000000000000000000000000000000000000000002C9EB4A0A1A2A434A6A7A553 :20028000AE362D3738271E1F20212223242526B333B62EB7B89F8485868788898A8B8C8D58 :2002A0008E8F909192939495969798999A9B9C9D2F3130A3AD350405060708090A0B0C0D7C :2002C0000E0F101112131415161718191A1B1C1DAFB1B0B5000032041007150811241FBE85 :2002E000CFEFDAE0DEBFCDBF11E0A0E0B1E0E0EAF2E102C005900D92AC32B107D9F711E071 :20030000ACE2B1E001C01D92AD39B107E1F712E0CCEDD2E004C02297FE010E944A09C63D07 :20032000D107C9F70E946C030C944E090C9400008091000161E00E94390368EE73E080E043 :2003400090E00E94FD018091000160E00E94390368EE73E080E090E00E94FD010895809196 :20036000000161E00E94AC0208951F920F920FB60F9211242F933F938F939F93AF93BF93E5 :200380008091300190913101A0913201B0913301309134010196A11DB11D232F2D5F2D3794 :2003A00020F02D570196A11DB11D209334018093300190933101A0933201B0933301809117 :2003C0002C0190912D01A0912E01B0912F010196A11DB11D80932C0190932D01A0932E01BA :2003E000B0932F01BF91AF919F918F913F912F910F900FBE0F901F9018959B01AC017FB734 :20040000F89480912C0190912D01A0912E01B0912F0166B5A89B05C06F3F19F00196A11DC3 :20042000B11D7FBFBA2FA92F982F8827860F911DA11DB11D62E0880F991FAA1FBB1F6A9577 :20044000D1F7BC012DC0FFB7F89480912C0190912D01A0912E01B0912F01E6B5A89B05C0E7 :20046000EF3F19F00196A11DB11DFFBFBA2FA92F982F88278E0F911DA11DB11DE2E0880FFD :20048000991FAA1FBB1FEA95D1F7861B970B885E9340C8F2215030404040504068517C4F8F :2004A000211531054105510571F60895789484B5826084BD84B5816084BD85B5826085BD0F :2004C00085B5816085BDEEE6F0E0808181608083E1E8F0E010828081826080838081816043 :2004E0008083E0E8F0E0808181608083E1E9F0E0808182608083808181608083E0E9F0E07E :20050000808181608083E1ECF0E0808184608083808182608083808181608083E3ECF0E007 :20052000808181608083E0ECF0E0808182608083E2ECF0E0808181608083EAE7F0E080812F :20054000846080838081826080838081816080838081806880830895CF93DF93482F50E0E5 :20056000CA018C509F4FFC0134914A525F4FFA018491882369F190E0880F991FFC01E455D0 :20058000FF4FA591B491FC01E654FF4FC591D491662351F42FB7F8948C91932F9095892362 :2005A0008C93888189230BC0623061F42FB7F8948C91932F909589238C938881832B8883B2 :2005C0002FBF06C09FB7F8948C91832B8C939FBFDF91CF910895883071F1893068F48230EF :2005E00031F1833020F4813009F042C01DC0833089F08430E9F512C08B3059F18C3028F41C :200600008930E9F08A30A1F51EC08C3031F18E3079F529C0809180008F7703C0809180003C :200620008F7D80938000089584B58F7702C084B58F7D84BD0895809190008F7707C08091DB :2006400090008F7D03C080919000877F8093900008958091C0008F7703C08091C0008F7DDD :200660008093C00008958091C200877F8093C2000895FF920F931F93F62E482F50E0CA0144 :200680008E5E9E4FFC012491CA018C509F4FFC0114914A525F4FFA0104910023C9F022239D :2006A00019F0822F0E94EB02E02FF0E0EE0FFF1FE654FF4FA591B4919FB7F894FF2021F4DE :2006C0008C911095812302C08C91812B8C939FBF1F910F91FF900895CF93DF930E94560262 :2006E0008DE391E00E9433040E94AF01C0E0D0E00E9498012097E1F30E940000F9CF282F17 :20070000809137018823C1F057FF1AC015C02898909336018091F1008193E217F307B9F75C :200720004115510539F08091F200882319F48BE68093E800AFBF02C04FEF5FEFCA01089599 :20074000AFB7F89427702093E9008091F200282F30E0241735070CF4A901FB019B01240F1E :20076000311D94E6DACFDF93CF930F92CDB7DEB7BE016F5F7F4F41E050E00E947F03019712 :2007800019F02FEF3FEF03C08981282F30E0C9010F90CF91DF910895FF920F931F93F82EEF :2007A000142F052F40913A0150913B01212F302FC901DC01FB016EEF29C0F7FE02C0949125 :2007C00001C09081209138013091390124173507ACF48091E8008570E1F38091E80082FF0F :2007E00003C02FEF3FEF17C09093F100C90101968F739070892B11F46093E8002F5F3F4FEC :200800003093390120933801119731961097A9F6812F902F9C01C9011F910F91FF900895E8 :200820009C018091E80082FFFCCFF901260F311D03C08091F1008193E217F307D1F7289805 :2008400084E6809336018BEF8093E800CB0108958093E9008091F200882319F08AE38093D3 :20086000E800089508951092370181E08093D70080EA8093D80082E189BD09B400FEFDCFAC :2008800061E070E080E090E00E94FD0180E98093D8008CE08093E2001092E000559A209A77 :2008A00008955F926F927F928F929F92AF92BF92CF92DF92EF92FF920F931F93CF93DF93A8 :2008C000E82E842E752E80913701882371F18B01242F352FC901EC017AEFF72E67E0962EC4 :2008E0009E2050E4552E8E2D90E040E2A42EB12CA822B9223AE3632E20E4C22ED12CC82259 :20090000D92258C09FB7F8949092E9008091E80085FD02C020E004C08091F200252D281B3E :200920009FBF222361F4FA9419F42FEF3FEF4DC061E070E080E090E00E94FD013BC0822F1E :2009400090E0C817D9070CF42C2FC21BD1094FB7F8949092E900A114B10421F406C01092D2 :20096000F10021502223D9F719C0E7FC03C0F801922F10C0C801322F06C0FC010196E491FE :20098000E093F10031503323C1F706C081918093F10091509923D1F7020F111D8091E800EB :2009A00085FF05C0209729F4C114D10411F06092E8004FBF209709F0A5CF5D9884E68093F1 :2009C0003501282D372DC9019C01C901DF91CF911F910F91FF90EF90DF90CF90BF90AF906D :2009E0009F908F907F906F905F9008951F920F920FB60F9211242F933F934F935F936F93B8 :200A00007F938F939F93AF93BF93EF93FF938091E1001092E100982F83FF0FC01092E900B0 :200A200081E08093EB001092EC0082E38093ED001092370188E08093F00092FF34C083E037 :200A40008093E9008091F200882319F08AE38093E8008FB7F89492E09093E9009091F20018 :200A60008FBF992321F082E891E00E94530780913501882351F080913501815080933501F0 :200A800080913501882309F45D9A80913601882351F0809136018150809336018091360191 :200AA000882309F4289AFF91EF91BF91AF919F918F917F916F915F914F913F912F910F90CD :200AC0000FBE0F901F9018950F931F93DF93CF930F92CDB7DEB719828E010F5F1F4FC8019D :200AE0000E947907C8010E941209898190E00F90CF91DF911F910F9108951F920F920FB661 :200B00000F921124EF92FF921F932F933F934F935F936F937F938F939F93AF93BF93EF9355 :200B2000FF93DF93CF93CDB7DEB76197DEBFCDBF1092E9008091E80083FF0FC1FE01319679 :200B40009E01275F3F4F03C08091F1008193E217F307D1F7289884E68093360182EF809356 :200B6000E800998197FF05C08091E80080FFFCCF03C08EEF8093E800292F30E0C901807672 :200B80009070892B09F0C2C08A81882329F41092F1001092F100D6C0813009F4D3C08330A3 :200BA00009F4D0C0853049F48091E80080FFFCCF8B8180688093E300C5C0863009F07CC019 :200BC0001C81EF80F8841230C1F51092E900109239011092380110923B0110923A010E94F6 :200BE000640599E0FE013996DF01292F1D922A95E9F799871A8791E09E8790E8988B9AEF44 :200C0000998B2091380130913901275F3F4F3C872B878D871092E9001092390110923801EC :200C2000F0923B01E0923A0180E0BF0149E050E00E94CC030E94640585C01092E9001092E2 :200C4000390110923801F0923B01E0923A01123241F482E290E00E940A09892B09F476C02B :200C600071C0113079F488E0E816F10419F481E080933C0180913C01882309F06BC0ECE68D :200C8000F1E013C0133009F061C08B81882319F4EEE2F1E00AC0823019F4E2E3F1E005C00A :200CA000813009F053C0E4E5F1E0449180E8BF0150E00E94CC0346C0873009F447C08830C6 :200CC00021F481E08093F1003DC08930D9F523703070232BD9F5E1E9F1E091E031E026E3A1 :200CE0009093E9003093EB0084918093EC002093ED009F5F3196953099F78EE78093EA00FA :200D00001092EA008B81809337011CC08F8198851092E900109239011092380190933B0146 :200D200080933A018D81882329F4CE0101960E94850706C0823051F4CE0101960E94DB0754 :200D4000882321F08EEF8093E80007C081E28093EB0003C0EEE7F1E0A8CF6196DEBFCDBF37 :200D6000CF91DF91FF91EF91BF91AF919F918F917F916F915F914F913F912F911F91FF9004 :200D8000EF900F900FBE0F901F90189520917E0130917F018091800190918101281B390B40 :200DA0002F733070C901089520917E0130917F0180918001909181012817390719F42FEF3A :200DC0003FEF09C0E0918001F0918101E25CFE4F8081282F30E0C901089520917E013091DC :200DE0007F0180918001909181012817390719F42FEF3FEF13C0E0918001F0918101E25C60 :200E0000FE4F2081809180019091810101968F739070909381018093800130E0C901089566 :200E2000109285011092840188EE93E0A0E0B0E08093860190938701A0938801B09389019C :200E400080E191E0909383018093820108950F931F93DF93CF930F92CDB7DEB78C0169838B :200E600080910901882369F083E0BE016F5F7F4F41E050E00E9451041816190614F49C015B :200E800007C081E090E0F8019383828320E030E0C9010F90CF91DF911F910F91089583E00D :200EA0000E9428040895CF93DF9312C082E00E94B3032FEF8F3F9207C9F0E0917E01F091B8 :200EC0007F01E25CFE4F8083D0937F01C0937E01C0917E01D0917F012196CF73D070809154 :200EE000800190918101C817D90701F7DF91CF910895FC0180818E5F808380E865E971E0B5 :200F000042E450E00E94CC030895FC0181819081913A59F4813209F04CC080E062E071E09A :200F200047E050E00E94CC0342C0913209F041C0803239F482E091E067E070E00E9410042B :200F400036C0823209F035C08281809309018091020190910301A0910401B0910501805B48 :200F60009440A040B04019F58091090180FD12C087E797E790930108809300082BE088E1AE :200F800090E00FB6F894A895809360000FBE209360000DC088E10FB6F89480936000109264 :200FA00060000FBEA895109201081092000881E0089580E00895FC0191818081813A31F487 :200FC000913089F080E0933089F40DC0813269F49B3021F4828180930A0105C09A3029F4AD :200FE000828180930B0181E0089580E00895EF92FF920F931F938C01E62EDC01ED91FC91E5 :201000000480F581E02D0995F82ED801ED91FC910680F781E02DC8016E2D09958F2D90E0E8 :201020001F910F91FF90EF90089510929001109294011092930182E291E090939201809377 :2010400091010895EF92FF920F931F93DF93CF930F92CDB7DEB789838B017A0184E0BE0137 :201060006F5F7F4F41E050E00E94510484E4B801A7010E9451040F90CF91DF911F910F910D :20108000FF90EF90089582E048E050E00E9422080895FC01168217821086118612861386F6 :2010A00014823496BF010E9443080895DC01683810F0685829C0E62FF0E067FF13C0E0580A :2010C000F04081E090E002C0880F991FEA95E2F7809514962C911497282314962C93149720 :2010E00060E012C0EB5AFD4F6491662319F420E030E01DC067FF08C014968C9114978D7F29 :2011000014968C9314976F77FD0190E0662321F08681861709F416829F5F31969630B1F701 :20112000CD011496BD010E94430821E030E0C9010895CF93DF93DC01683810F0685825C01E :20114000E62FF0E067FF12C0E058F04081E090E002C0880F991FEA95E2F714962C911497BE :20116000282B14962C93149760E00FC0EB5AFD4F64916623D9F167FF08C014968C91149780 :20118000826014968C9314976F7716968C9116978617A9F117968C911797861781F1189631 :2011A0008C911897861759F119968C911997861731F11A968C911A97861709F11B968C915E :2011C0001B978617E1F0ED01E0E0F0E09E2F8E81882321F4EA0FFB1F668306C09F5F31964E :2011E0002196E630F10591F7963049F481E090E013969C938E93129720E030E007C0CD0189 :201200001496BD010E94430821E030E0C901DF91CF91089580E867ED71E045E650E00E9427 :20122000CC030895FC0180818F5F808380E86CE372E049E150E00E94CC030895CF92DF9210 :20124000EF92FF920F931F93CF93DF937C016B018A01C0E0D0E00FC0D6016D916D01D701A6 :20126000ED91FC910190F081E02DC7010995C80FD91F015010400115110571F7CE01DF91AB :20128000CF911F910F91FF90EF90DF90CF900895EE0FFF1F0590F491E02D0994F894FFCFEC :2012A0000D0000E100000000000001010000000027071E09C606ED06D4064F0753070000A0 :2012C0000000F7071E09990856084908FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :2012E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :20130000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :20132000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20134000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20136000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20138000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :2013A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :2013C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2013E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :20140000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :20142000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20144000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20146000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20148000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :2014A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :2014C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2014E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :20150000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :20152000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20154000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20156000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20158000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :2015A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :2015C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2015E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :20160000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :20162000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20164000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20166000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20168000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :2016A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :2016C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2016E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :20170000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :20172000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20174000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20176000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20178000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :2017A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :2017C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2017E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :20180000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :20182000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20184000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20186000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20188000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :2018A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :2018C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2018E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :20190000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :20192000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :20194000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20196000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20198000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :2019A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :2019C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2019E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :201A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :201A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :201A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :201A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :201A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :201AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :201AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :201AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :201B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :201B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :201B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :201B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :201B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :201BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :201BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :201BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :201C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :201C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :201C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :201C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :201C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :201CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :201CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :201CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :201D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :201D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :201D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :201D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :201D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :201DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :201DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :201DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :201E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :201E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :201E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :201E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :201E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :201EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :201EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :201EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :201F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :201F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :201F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :201F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :201F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :201FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :201FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :201FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :20200000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :20202000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20204000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20206000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20208000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :2020A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :2020C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2020E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :20210000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :20212000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20214000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20216000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20218000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :2021A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :2021C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2021E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :20220000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :20222000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20224000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20226000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20228000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :2022A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :2022C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2022E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :20230000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :20232000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20234000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20236000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20238000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :2023A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :2023C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2023E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :20240000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :20242000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20244000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20246000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20248000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :2024A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :2024C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2024E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :20250000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :20252000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20254000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20256000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20258000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :2025A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :2025C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2025E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :20260000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :20262000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20264000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20266000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20268000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :2026A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :2026C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2026E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :20270000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :20272000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20274000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20276000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20278000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :2027A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :2027C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2027E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :20280000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :20282000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20284000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20286000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20288000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :2028A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :2028C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2028E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :20290000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :20292000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :20294000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20296000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20298000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :2029A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :2029C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2029E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :202A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :202A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :202A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :202A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :202A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :202AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :202AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :202AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :202B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :202B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :202B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :202B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :202B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :202BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :202BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :202BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :202C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :202C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :202C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :202C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :202C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :202CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :202CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :202CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :202D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :202D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :202D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :202D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :202D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :202DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :202DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :202DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :202E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :202E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :202E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :202E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :202E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :202EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :202EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :202EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :202F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :202F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :202F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :202F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :202F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :202FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :202FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :202FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :20300000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 :20302000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 :20304000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 :20306000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 :20308000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 :2030A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 :2030C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 :2030E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 :20310000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF :20312000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF :20314000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F :20316000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F :20318000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F :2031A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F :2031C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F :2031E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF :20320000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE :20322000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE :20324000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E :20326000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E :20328000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E :2032A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E :2032C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :2032E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE :20330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20332000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20334000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20336000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :20338000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :2033A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2033C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :2033E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :20340000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20342000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20344000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20346000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :20348000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :2034A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2034C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :2034E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :20350000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20352000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20354000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20356000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :20358000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :2035A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2035C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :2035E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :20360000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20362000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20364000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20366000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :20368000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :2036A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2036C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :2036E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :20370000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20372000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20374000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20376000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :20378000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :2037A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2037C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :2037E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :20380000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20382000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20384000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20386000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :20388000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :2038A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2038C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :2038E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :20390000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :20392000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20394000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20396000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :20398000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :2039A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2039C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :2039E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :203A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :203A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :203A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :203A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :203A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :203AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :203AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :203AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :203B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :203B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :203B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :203B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :203B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :203BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :203BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :203BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :203C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :203C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :203C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :203C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :203C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :203CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :203CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :203CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :203D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :203D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :203D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :203D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :203D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :203DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :203DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :203DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :203E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :203E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :203E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :203E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :203E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :203EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :203EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :203EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :203F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :203F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :203F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :203F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :203F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :203FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :203FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :203FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :20400000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20402000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20404000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20406000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :20408000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :2040A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2040C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :2040E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :20410000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20412000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20414000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20416000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :20418000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :2041A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2041C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :2041E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :20420000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20422000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20424000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20426000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :20428000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :2042A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2042C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :2042E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :20430000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20432000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20434000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20436000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :20438000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :2043A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2043C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :2043E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :20440000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20442000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20444000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20446000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :20448000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :2044A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2044C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :2044E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :20450000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20452000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20454000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20456000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :20458000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :2045A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2045C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :2045E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :20460000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20462000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20464000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20466000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :20468000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :2046A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2046C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :2046E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :20470000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20472000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20474000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20476000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :20478000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :2047A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2047C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :2047E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :20480000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20482000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20484000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20486000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :20488000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :2048A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2048C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :2048E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :20490000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :20492000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20494000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20496000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :20498000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :2049A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2049C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :2049E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :204A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :204A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :204A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :204A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :204A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :204AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :204AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :204AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :204B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :204B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :204B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :204B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :204B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :204BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :204BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :204BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :204C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :204C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :204C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :204C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :204C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :204CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :204CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :204CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :204D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :204D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :204D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :204D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :204D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :204DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :204DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :204DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :204E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :204E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :204E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :204E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :204E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :204EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :204EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :204EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :204F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :204F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :204F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :204F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :204F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :204FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :204FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :204FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :20500000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 :20502000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 :20504000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 :20506000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 :20508000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 :2050A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 :2050C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 :2050E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 :20510000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF :20512000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F :20514000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F :20516000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F :20518000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F :2051A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F :2051C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF :2051E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF :20520000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE :20522000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E :20524000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E :20526000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E :20528000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E :2052A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :2052C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE :2052E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE :20530000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20532000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20534000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :20536000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :20538000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2053A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :2053C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :2053E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20540000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20542000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20544000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :20546000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :20548000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2054A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :2054C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :2054E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20550000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20552000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20554000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :20556000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :20558000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2055A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :2055C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :2055E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20560000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20562000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20564000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :20566000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :20568000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2056A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :2056C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :2056E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20570000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20572000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20574000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :20576000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :20578000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2057A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :2057C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :2057E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20580000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20582000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20584000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :20586000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :20588000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2058A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :2058C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :2058E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20590000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20592000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20594000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :20596000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :20598000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2059A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :2059C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :2059E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :205A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :205A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :205A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :205A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :205A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :205AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :205AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :205AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :205B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :205B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :205B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :205B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :205B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :205BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :205BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :205BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :205C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :205C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :205C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :205C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :205C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :205CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :205CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :205CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :205D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :205D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :205D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :205D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :205D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :205DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :205DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :205DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :205E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :205E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :205E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :205E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :205E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :205EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :205EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :205EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :205F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :205F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :205F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :205F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :205F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :205FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :205FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :205FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :20600000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20602000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20604000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :20606000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :20608000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2060A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :2060C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :2060E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20610000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20612000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20614000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :20616000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :20618000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2061A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :2061C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :2061E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20620000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20622000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20624000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :20626000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :20628000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2062A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :2062C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :2062E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20630000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20632000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20634000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :20636000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :20638000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2063A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :2063C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :2063E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20640000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20642000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20644000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :20646000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :20648000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2064A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :2064C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :2064E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20650000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20652000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20654000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :20656000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :20658000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2065A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :2065C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :2065E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20660000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20662000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20664000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :20666000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :20668000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2066A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :2066C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :2066E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20670000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20672000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20674000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :20676000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :20678000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2067A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :2067C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :2067E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20680000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20682000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20684000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :20686000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :20688000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2068A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :2068C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :2068E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20690000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20692000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20694000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :20696000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :20698000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2069A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :2069C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :2069E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :206A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :206A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :206A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :206A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :206A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :206AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :206AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :206AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :206B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :206B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :206B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :206B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :206B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :206BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :206BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :206BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :206C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :206C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :206C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :206C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :206C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :206CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :206CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :206CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :206D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :206D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :206D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :206D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :206D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :206DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :206DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :206DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :206E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :206E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :206E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :206E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :206E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :206EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :206EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :206EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :206F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :206F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :206F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :206F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :206F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :206FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :206FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :206FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :2070000055C000006EC000006CC000006AC0000068C0000066C0000064C0000062C0000043 :2070200060C000005EC00000F2C400005AC0000058C0000056C0000054C0000052C00000EE :2070400050C0000078C000004CC000004AC0000048C0000046C0000044C0000042C00000BE :2070600040C000003EC000003CC000003AC0000038C0000036C0000034C0000032C0000048 :2070800030C000002EC000002CC000002AC0000028C0000026C0000024C0000022C00000A8 :2070A00020C000001EC000001CC0000011241FBECFEFDAE0DEBFCDBF11E0A0E0B1E0E2E3BC :2070C000FFE702C005900D92A83AB107D9F711E0A8EAB1E001C01D92AE3BB107E1F78FD30B :2070E00026C78ECFF89410926F0010928100109285001092840081E085BF15BE47985D9AEB :20710000289A0C94000008952091B2013091B3012F5F3F4F3093B3012093B201932F37FFA6 :2071200003C08EEF831B982F990F921710F447980895479A08951F920F920FB60F9211246E :207140002F938F939F93EF93FF9310928500109284008091A8019091A901009741F00197D3 :207160009093A9018093A801892B09F45D9A8091AA019091AB01009741F001979093AB0126 :207180008093AA01892B09F4289AE0E0F0E0859194918F5F9F4F49F08091AC019091AD0151 :2071A00001969093AD018093AC01FF91EF919F918F912F910F900FBE0F901F90189584E0BC :2071C0008093E9000DC08091E8008B778093E80003C08EB3882351F08091E80082FFF9CFBE :2071E0008091E80085FFEFCF8091F1000895982F83E08093E9008091E80085FD0DC0809136 :20720000E8008E778093E80003C08EB3882369F08091E80080FFF9CF9093F1005D9884E6CB :2072200090E09093A9018093A80108954F925F926F927F928F929F92AF92BF92CF92DF921E :20724000EF92FF920F931F93CF93DF9384E08093E9008091E80082FF57C2289884E690E067 :207260009093AB018093AA01AADF182F853481F48CE49DE19093AD018093AC0107B600FC4B :20728000FDCFF999FECF81E180935700E89503C0843519F494DF8DE00DC28C34E1F38035F9 :2072A000D1F3843721F484E4A2DF80E003C2813611F489E5FFC18134B1F481DF182F7FDFE3 :2072C00090E0880F991FAA2797FDA095BA2F312F330F20E0442737FD4095542F822B932B68 :2072E000A42BB52BB8C1803711F483E5E3C1833549F4C0E0D1E089917ADF21E0C730D20714 :20730000D1F7D9C1863521F481E371DF80E3D2C1833731F487E86BDF85E969DF8EE1CAC149 :207320008536B9F4E0E0F0E093E085E090935700E89507B600FCFDCF80935700E89507B65D :2073400000FCFDCFE058FF4FA0E7E030FA0771F7A2CF823739F4E1E0F0E089E08093570024 :207360008491A8C1863439F4E0E0F0E089E08093570084919FC18E3439F4E3E0F0E089E0E5 :2073800080935700849196C1813539F4E2E0F0E089E08093570084918DC1823631F489E521 :2073A00026DF80E024DF80E885C1823419F0873609F0E5C01092AD011092AC0100DF082FE8 :2073C000FEDEF82EFCDE682E8554823008F071C1902F80E0CF2DD0E0C82BD92B10926F00B3 :2073E000173609F04BC081E180935700E895DD24CC24C3943FC0E090AE01F090AF010091CC :20740000B0011091B101B6E46B16D9F4ED2DF0E0EE29FF29E4918E2FEADEDD2081F082E08D :2074200090E0A0E0B0E0E80EF91E0A1F1B1FE092AE01F092AF010093B0011093B101DC2470 :2074400018C0D801C701B695A7959795879559D5CEDE82E090E0A0E0B0E0E80EF91E0A1FF2 :207460001B1FE092AE01F092AF010093B0011093B1012197209709F0BECF7DC08090AE01F5 :207480009090AF01A090B001B090B10196E4691609F05DC083E0F40180935700E89507B63E :2074A00000FCFDCF54C0F6E46F1661F5772031F1E090AE01F090AF010091B0011091B1019E :2074C0007EDED82ECC24852D90E08C299D29F7010C0140925700E895112482E090E0A0E08B :2074E000B0E0E80EF91E0A1F1B1FE092AE01F092AF010093B0011093B10102C060DE582E1A :20750000742423C0E090AE01F090AF010091B0011091B10116950795F794E79450DE682FFA :20752000C701F7D48091AE019091AF01A091B001B091B1010296A11DB11D8093AE01909349 :20754000AF01A093B001B093B101219704C05524772444244394209709F0A5CF96E46916B6 :2075600041F485E0F40180935700E89507B600FCFDCF8DE03CDE82E080936F009CC0833492 :2075800071F40091AE011091AF0119DE90E021E0F8010C0120935700E89511247CCE8336C8 :2075A00019F5E090AE01F090AF010091B0011091B10105DEF701E16090E021E00C0120938C :2075C0005700E895112482E090E0A0E0B0E0E80EF91E0A1F1B1FE092AE01F092AF0100936A :2075E000B0011093B10157CE8D3661F4E091AE01F091AF0185E080935700E89507B600FCF2 :20760000FDCF49CE823551F4E091AE01F091AF0105911491812FEBDD802F4CC0843421F5FE :20762000E090AE01F090AF010091B0011091B10116950795F794E794C2DD682FC70169D4DE :207640008091AE019091AF01A091B001B091B1010296A11DB11D8093AE019093AF01A093D8 :20766000B001B093B10117CE843609F5E090AE01F090AF010091B0011091B101D801C70142 :20768000B695A795979587953CD4B1DD82E090E0A0E0B0E0E80EF91E0A1F1B1FE092AE010A :2076A000F092AF010093B0011093B10104C08B3111F08FE39CDD83E08093E9009091E8002B :2076C0008091E8008E778093E80095FF04C010C08EB38823C9F08091E80080FFF9CF809193 :2076E000E8008E778093E80003C08EB3882361F08091E80080FFF9CF84E08093E9008091F1 :20770000E8008B778093E800DF91CF911F910F91FF90EF90DF90CF90BF90AF909F908F90AC :207720007F906F905F904F9008959091B601892F8F77813249F58091B7018032A1F081328A :2077400019F5913A09F58091E800877F8093E8008DE091E067E070E00BD28091E8008B770B :207760008093E8000895913279F48091E800877F8093E8008DE091E067E070E05DD2809192 :20778000E8008E778093E800089582E061EC42E0B5D083E061E842E1B1D084E060E842E1EF :2077A000ADC084B7877F84BF88E10FB6F89480936000109260000FBE20E880E090E00FB63F :2077C000F89420936100809361000FBE81E085BF92E095BF3F9A209A559AE1E6F0E02083A1 :2077E000108247985D9A289A109289008AEF8093880090936F0083E080938100F0C0409116 :20780000000850910108109201081092000894B714BE88E10FB6F8948093600010926000D5 :207820000FBE292F30E0F901E270F07091FD18C090FF05C0859194918F5F9F4F81F423FFFF :207840000FC08091090190910A014817590741F0E0E0F0E0859194918F5F9F4F09F042DC64 :20786000A0DF78941092AD011092AC010CC0DEDC36D38091AC019091AD0181549F4110F00D :207880001092140141DC80911401882381F78091E00081608093E00025DC80E090E0089598 :2078A000FA01923049F0933061F09130F9F485E191E022E130E01EC087E291E02EE330E04D :2078C00019C0882329F485E691E024E030E012C0813029F489E691E022E230E00BC0823006 :2078E00029F48DE891E028E130E004C080E090E020E030E091838083C90108958093E9004E :207900008091EB0081608093EB001092ED006093EC004093ED008091EE00881F8827881F62 :2079200008958091B60188238CF403C08EB38823B1F08091E80082FFF9CF8091E8008B772A :207940008093E80008958EB3882349F08091E80080FFF9CF8091E8008E778093E800089594 :20796000EF92FF920F931F9345D04CD008ED10E0F80180818F77808380818068808380819B :207980008F7D808319BC1EBA1092B40180EEE82EF12CF70180818B7F8083F8018081816052 :2079A000808380E060E042E0A9DFE1EEF0E080818E7F8083E2EEF0E0808181608083808144 :2079C00088608083F70180818E7F8083F8018081806180831F910F91FF90EF900895E7ED06 :2079E000F0E08081816080838AE482BF81E08093B501B6CFE8EDF0E080818E7F808310921C :207A0000E20008951092DA001092E10008951F920F920FB60F9211242F933F934F935F93F6 :207A20006F937F938F939F93AF93BF93EF93FF938091DA0080FF1BC08091D80080FF17C0B2 :207A40008091DA008E7F8093DA008091D90080FF0BC080E189BD82E189BD09B400FEFDCF36 :207A600081E08EBB3BD203C019BC1EBA37D28091E10080FF17C08091E20080FF13C0809138 :207A8000E2008E7F8093E2008091E20080618093E2008091D80080628093D80019BC85E049 :207AA0008EBB1CD28091E10084FF2CC08091E20084FF28C080E189BD82E189BD09B400FEC5 :207AC000FDCF8091D8008F7D8093D8008091E1008F7E8093E1008091E2008F7E8093E20012 :207AE0008091E20081608093E2008091B401882331F48091E30087FD02C081E001C084E067 :207B00008EBBECD18091E10083FF21C08091E20083FF1DC08091E100877F8093E10082E06A :207B20008EBB1092B4018091E1008E7F8093E1008091E2008E7F8093E2008091E2008061E9 :207B40008093E20080E060E042E0D8DEC7D1FF91EF91BF91AF919F918F917F916F915F9130 :207B60004F913F912F910F900FBE0F901F9018959C014091BC015091BD014617570718F49D :207B8000F90190E044C06115710511F0AB01F8CF8091E8008E778093E80040E050E0F0CF0F :207BA0008EB3882309F444C0853009F443C08091E80083FF02C081E008958091E80082FD70 :207BC00031C08091E80080FF22C08091F3009091F200782F60E0292F30E0262B372B07C07A :207BE00081918093F100415050402F5F3F4F4115510519F02830310598F390E02830310566 :207C000009F491E08091E8008E778093E8004115510531F6992321F605C08EB3882341F075 :207C2000853041F08091E80082FFF7CF80E0089582E0089583E008959C016115710529F47C :207C40008091E8008B778093E800F90126C08EB3882391F1853091F18091E80083FF02C06C :207C600081E008958091E80082FFF1CF06C08091F10081936150704059F02091F300809191 :207C8000F200322F20E090E0822B932B892B79F78091E8008B778093E80061157105B9F601 :207CA00005C08EB3882341F0853041F08091E80080FFF7CF80E0089582E0089583E00895C2 :207CC0000F931F93DF93CF9300D0CDB7DEB7E6EBF1E08091F100819381E0EE3BF807C9F792 :207CE00024DD8091E80083FFE4C08091B6019091B701953009F46DC0963040F4913081F1A7 :207D0000913070F0933009F0D4C02AC0983009F4A3C0993009F4B2C0963009F0CAC07CC023 :207D2000803809F4C6C0823809F0C3C08091BA0187708093E9008091EB001092E9002091DB :207D4000E800277F2093E80090E025E0969587952A95E1F781708093F1001092F10087C0D8 :207D6000882319F0823009F0A4C08F71823009F0A0C08091B801882331F52091BA01277097 :207D800009F497C02093E9008091EB0080FF1BC0933021F48091EB00806213C08091EB0018 :207DA00080618093EB0081E090E002C0880F991F2A95E2F78093EA001092EA008091EB00E5 :207DC00088608093EB001092E9008091E800877F51C0882309F06DC01091B8011F770FB79B :207DE000F8948091E800877F8093E8009ADD8091E80080FFFCCF8091E3008078812B809398 :207E0000E30080688093E300112311F482E001C083E08EBB0FBF4DC08058823008F049C033 :207E20008091B8019091B9016091BA01AE014F5F5F4F36DDBC01009709F43BC08091E8008E :207E4000877F8093E80089819A8192DE8091E8008B778093E8002DC0803859F58091E800AA :207E6000877F8093E8008091B4018093F1008091E8008E778093E80054DD1BC08823C9F4CA :207E80009091B8019230A8F48091E800877F8093E8009093B40145DD8091B401882331F420 :207EA0008091E30087FD02C081E001C084E08EBB6CDC8091E80083FF0AC08091EB0080624E :207EC0008093EB008091E800877F8093E8000F900F90CF91DF911F910F91089508951F9360 :207EE0008EB3882361F01091E9001092E9008091E80083FF01C0E4DE17701093E9001F916F :207F00000895F999FECF92BD81BDF89A992780B50895262FF999FECF1FBA92BD81BD20BDBD :207F20000FB6F894FA9AF99A0FBE01960895F894FFCF4341544552494E4100777700080031 :207F400000000000000801120110010200000841233C0001000201000109023E00020100F9 :207F600080320904000001020201000524001001042402040524060001070582030800FF0C :207F800009040100020A000000070504021000010705830210000104030904220341007216 :207FA000006400750069006E006F0020004500730070006C006F0072006100200000001874 :1A7FC00003410072006400750069006E006F0020004C004C004300000000D7 :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/caterina/Esplora-prod-firmware-2012-12-10.txt ================================================ LUFA: 111009 make: 3.81 avrdude: 5.11.1 avr-libc: 1.6.7 binutils-avr: 2.19 gcc-avr 4.3.3 ================================================ FILE: external/arduino/avr/bootloaders/caterina/Leonardo-prod-firmware-2012-04-26.hex ================================================ :200000000C946E010C9496010C9496010C9496010C9496010C9496010C9496010C94960150 :200020000C9496010C9496010C9410050C949B050C9496010C9496010C9496010C94960181 :200040000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C94B501C9 :200060000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601C8 :200080000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601A8 :2000A0000C9496010C9496010C94960100000000240027002A002D003000000000002500A4 :2000C00028002B002E003100000000002300260029002C002F00040404040403040502027D :2000E0000202040302020202060606060606040402020204040802011040804010204080A8 :200100004080080204018040201002011080102040400000000200080E0000030401000BB2 :200120000000070605040100080A0B0C0D09040309042203410072006400750069006E00CD :200140006F0020004C0065006F006E006100720064006F00180341007200640075006900CC :200160006E006F0020004C004C004300120100020000004041233680000101020001120120 :200180000002020000404123368000010102000100C18081C1080B00020202010009040052 :2001A000000102020000052400100105240101010424020605240600010705810310004094 :2001C00009040100020A000000070502024000000705830240000005010902A1010901A186 :2001E000008501050919012903150025019503750181029501750581030501093009310943 :20020000381581257F750895038106C0C005010906A1018502050719E029E715002501754D :20022000019508810295017508810395067508150025650507190029658100C0090402004C :2002400001030000000921010100012265000705840340000100000000000000002A2B2895 :200260000000000000000000000000000000000000000000002C9EB4A0A1A2A434A6A7A553 :20028000AE362D3738271E1F20212223242526B333B62EB7B89F8485868788898A8B8C8D58 :2002A0008E8F909192939495969798999A9B9C9D2F3130A3AD350405060708090A0B0C0D7C :2002C0000E0F101112131415161718191A1B1C1DAFB1B0B500004C042E072C0811241FBE36 :2002E000CFEFDAE0DEBFCDBF11E0A0E0B1E0EEECF2E102C005900D92AC32B107D9F711E061 :20030000ACE2B1E001C01D92AD39B107E1F712E0CCEDD2E004C02297FE010E946109C63DF0 :20032000D107C9F70E9486030C9465090C9400008091000161E00E94530364E873E080E002 :2003400090E00E94FD018091000160E00E9453036CE474E080E090E00E94FD010895809181 :20036000000161E00E94B60208951F920F920FB60F9211242F933F938F939F93AF93BF93DB :200380008091300190913101A0913201B0913301309134010196A11DB11D232F2D5F2D3794 :2003A00020F02D570196A11DB11D209334018093300190933101A0933201B0933301809117 :2003C0002C0190912D01A0912E01B0912F010196A11DB11D80932C0190932D01A0932E01BA :2003E000B0932F01BF91AF919F918F913F912F910F900FBE0F901F9018959B01AC017FB734 :20040000F89480912C0190912D01A0912E01B0912F0166B5A89B05C06F3F19F00196A11DC3 :20042000B11D7FBFBA2FA92F982F8827860F911DA11DB11D62E0880F991FAA1FBB1F6A9577 :20044000D1F7BC012DC0FFB7F89480912C0190912D01A0912E01B0912F01E6B5A89B05C0E7 :20046000EF3F19F00196A11DB11DFFBFBA2FA92F982F88278E0F911DA11DB11DE2E0880FFD :20048000991FAA1FBB1FEA95D1F7861B970B885E9340C8F2215030404040504068517C4F8F :2004A000211531054105510571F60895789484B5826084BD84B5816084BD85B5826085BD0F :2004C00085B5816085BDEEE6F0E0808181608083E1E8F0E010828081826080838081816043 :2004E0008083E0E8F0E0808181608083E1EBF0E0808184608083E0EBF0E080818160808378 :20050000E1E9F0E0808182608083808181608083E0E9F0E0808181608083E1ECF0E080815A :2005200084608083808182608083808181608083E3ECF0E0808181608083E0ECF0E08081E8 :2005400082608083E2ECF0E0808181608083EAE7F0E08081846080838081826080838081C3 :20056000816080838081806880830895CF93DF93482F50E0CA018C509F4FFC0134914A52A0 :200580005F4FFA018491882369F190E0880F991FFC01E455FF4FA591B491FC01E654FF4F55 :2005A000C591D491662351F42FB7F8948C91932F909589238C93888189230BC0623061F40A :2005C0002FB7F8948C91932F909589238C938881832B88832FBF06C09FB7F8948C91832BB7 :2005E0008C939FBFDF91CF9108958730C1F1883080F48330F9F0843030F4813029F182308B :2006000009F050C024C08430C9F0863009F04AC022C08A3091F18B3030F4883031F1893037 :2006200009F040C026C08C3091F18C3060F18E30C9F533C0809180008F7703C08091800036 :200640008F7D80938000089584B58F7702C084B58F7D84BD08958091B0008F7703C080919F :20066000B0008F7D8093B0000895809190008F7707C0809190008F7D03C080919000877FD9 :200680008093900008958091C0008F7703C08091C0008F7D8093C00008958091C200877F5A :2006A0008093C2000895FF920F931F93F62E482F50E0CA018E5E9E4FFC012491CA018C501B :2006C0009F4FFC0114914A525F4FFA0104910023C9F0222319F0822F0E94F502E02FF0E05D :2006E000EE0FFF1FE654FF4FA591B4919FB7F894FF2021F48C911095812302C08C91812BD5 :200700008C939FBF1F910F91FF900895CF93DF930E9456028DE391E00E944D040E94AF01EC :20072000C0E0D0E00E9498012097E1F30E940000F9CF282F809137018823C1F057FF1AC00D :2007400015C02898909336018091F1008193E217F307B9F74115510539F08091F20088236E :2007600019F48BE68093E800AFBF02C04FEF5FEFCA010895AFB7F89427702093E9008091A6 :20078000F200282F30E0241735070CF4A901FB019B01240F311D94E6DACFDF93CF930F922E :2007A000CDB7DEB7BE016F5F7F4F41E050E00E949903019719F02FEF3FEF03C08981282F25 :2007C00030E0C9010F90CF91DF910895FF920F931F93F82E142F052F40913A0150913B0188 :2007E000212F302FC901DC01FB016EEF29C0F7FE02C0949101C090812091380130913901CE :2008000024173507ACF48091E8008570E1F38091E80082FF03C02FEF3FEF17C09093F1008B :20082000C90101968F739070892B11F46093E8002F5F3F4F3093390120933801119731964D :200840001097A9F6812F902F9C01C9011F910F91FF9008959C018091E80082FFFCCFF90124 :20086000260F311D03C08091F1008193E217F307D1F7289884E6809336018BEF8093E80078 :20088000CB0108958093E9008091F200882319F08AE38093E800089508951092370181E05F :2008A0008093D70080EA8093D80082E189BD09B400FEFDCF61E070E080E090E00E94FD01C8 :2008C00080E98093D8008CE08093E2001092E000559A209A08955F926F927F928F929F9246 :2008E000AF92BF92CF92DF92EF92FF920F931F93CF93DF93E82E842E752E809137018823FB :2009000071F18B01242F352FC901EC017AEFF72E67E0962E9E2050E4552E8E2D90E040E220 :20092000A42EB12CA822B9223AE3632E20E4C22ED12CC822D92258C09FB7F8949092E900DA :200940008091E80085FD02C020E004C08091F200252D281B9FBF222361F4FA9419F42FEF4D :200960003FEF4DC061E070E080E090E00E94FD013BC0822F90E0C817D9070CF42C2FC21B28 :20098000D1094FB7F8949092E900A114B10421F406C01092F10021502223D9F719C0E7FCC6 :2009A00003C0F801922F10C0C801322F06C0FC010196E491E093F10031503323C1F706C038 :2009C00081918093F10091509923D1F7020F111D8091E80085FF05C0209729F4C114D1049D :2009E00011F06092E8004FBF209709F0A5CF5D9884E680933501282D372DC9019C01C90158 :200A0000DF91CF911F910F91FF90EF90DF90CF90BF90AF909F908F907F906F905F90089564 :200A20001F920F920FB60F9211241F932F933F934F935F936F937F938F939F93AF93BF93B3 :200A4000EF93FF938091E1001092E100982F83FF0FC01092E90081E08093EB001092EC007D :200A600082E38093ED001092370188E08093F00092FF36C083E08093E9008091F200882338 :200A800049F08AE38093E80005C082E891E00E94710701C012E09FB7F8941093E9008091C9 :200AA000F2009FBF882389F780913501882351F08091350181508093350180913501882335 :200AC00009F45D9A80913601882351F08091360181508093360180913601882309F4289AD9 :200AE000FF91EF91BF91AF919F918F917F916F915F914F913F912F911F910F900FBE0F90DB :200B00001F9018950F931F93DF93CF930F92CDB7DEB719828E010F5F1F4FC8010E9490078F :200B2000C8010E942909898190E00F90CF91DF911F910F9108951F920F920FB60F92112455 :200B4000EF92FF921F932F933F934F935F936F937F938F939F93AF93BF93EF93FF93DF93E7 :200B6000CF93CDB7DEB76197DEBFCDBF1092E9008091E80083FF0FC1FE0131969E01275F18 :200B80003F4F03C08091F1008193E217F307D1F7289884E68093360182EF8093E800998139 :200BA00097FF05C08091E80080FFFCCF03C08EEF8093E800292F30E0C90180769070892B80 :200BC00009F0C2C08A81882329F41092F1001092F100D6C0813009F4D3C0833009F4D0C08A :200BE000853049F48091E80080FFFCCF8B8180688093E300C5C0863009F07CC01C81EF805A :200C0000F8841230C1F51092E900109239011092380110923B0110923A010E94820599E0C1 :200C2000FE013996DF01292F1D922A95E9F799871A8791E09E8790E8988B9AEF998B209110 :200C4000380130913901275F3F4F3C872B878D871092E9001092390110923801F0923B01C3 :200C6000E0923A0180E0BF0149E050E00E94E6030E94820585C01092E9001092390110924C :200C80003801F0923B01E0923A01123241F482E290E00E942109892B09F476C071C011303E :200CA00079F488E0E816F10419F481E080933C0180913C01882309F06BC0ECE6F1E013C01B :200CC000133009F061C08B81882319F4EEE2F1E00AC0823019F4E2E3F1E005C0813009F0C4 :200CE00053C0E4E5F1E0449180E8BF0150E00E94E60346C0873009F447C0883021F481E0A0 :200D00008093F1003DC08930D9F523703070232BD9F5E1E9F1E091E031E026E39093E900CA :200D20003093EB0084918093EC002093ED009F5F3196953099F78EE78093EA001092EA0039 :200D40008B81809337011CC08F8198851092E900109239011092380190933B0180933A0144 :200D60008D81882329F4CE0101960E949C0706C0823051F4CE0101960E94F207882321F078 :200D80008EEF8093E80007C081E28093EB0003C0EEE7F1E0A8CF6196DEBFCDBFCF91DF91E3 :200DA000FF91EF91BF91AF919F918F917F916F915F914F913F912F911F91FF90EF900F9076 :200DC0000FBE0F901F90189520917E0130917F018091800190918101281B390B2F733070DC :200DE000C901089520917E0130917F0180918001909181012817390719F42FEF3FEF09C045 :200E0000E0918001F0918101E25CFE4F8081282F30E0C901089520917E0130917F01809101 :200E20008001909181012817390719F42FEF3FEF13C0E0918001F0918101E25CFE4F2081C2 :200E4000809180019091810101968F739070909381018093800130E0C901089510928501EC :200E60001092840188EE93E0A0E0B0E08093860190938701A0938801B093890180E191E0B2 :200E8000909383018093820108950F931F93DF93CF930F92CDB7DEB78C0169838091090102 :200EA000882369F083E0BE016F5F7F4F41E050E00E946B041816190614F49C0107C081E0F4 :200EC00090E0F8019383828320E030E0C9010F90CF91DF911F910F91089583E00E9442040D :200EE000089582E00E94CD03482F20917E0130917F012F5F3F4F2F73307080918001909188 :200F000081012817390759F0E0917E01F0917F01E25CFE4F408330937F0120937E01089536 :200F2000FC0180818E5F808380E865E971E042E450E00E94E6030895FC0181819081913A63 :200F400059F4813209F04CC080E062E071E047E050E00E94E60342C0913209F041C0803246 :200F600039F482E091E067E070E00E942A0436C0823209F035C0828180930901809102013E :200F800090910301A0910401B0910501805B9440A040B04019F58091090180FD12C087E74A :200FA00097E790930108809300082BE088E190E00FB6F894A895809360000FBE20936000A7 :200FC0000DC088E10FB6F89480936000109260000FBEA895109201081092000881E00895B8 :200FE00080E00895FC0191818081813A31F4913089F080E0933089F40DC0813269F49B3082 :2010000021F4828180930A0105C09A3029F4828180930B0181E0089580E00895EF92FF92BF :201020000F931F938C01E62EDC01ED91FC910480F581E02D0995F82ED801ED91FC9106809E :20104000F781E02DC8016E2D09958F2D90E01F910F91FF90EF900895109290011092940178 :201060001092930182E291E090939201809391010895EF92FF920F931F93DF93CF930F9292 :20108000CDB7DEB789838B017A0184E0BE016F5F7F4F41E050E00E946B0484E4B801A7013A :2010A0000E946B040F90CF91DF911F910F91FF90EF90089582E048E050E00E94390808957B :2010C000FC0116821782108611861286138614823496BF010E945A080895DC01683810F046 :2010E000685829C0E62FF0E067FF13C0E058F04081E090E002C0880F991FEA95E2F7809572 :2011000014962C911497282314962C93149760E012C0EB5AFD4F6491662319F420E030E020 :201120001DC067FF08C014968C9114978D7F14968C9314976F77FD0190E0662321F08681BD :20114000861709F416829F5F31969630B1F7CD011496BD010E945A0821E030E0C901089578 :20116000CF93DF93DC01683810F0685825C0E62FF0E067FF12C0E058F04081E090E002C061 :20118000880F991FEA95E2F714962C911497282B14962C93149760E00FC0EB5AFD4F64919A :2011A0006623D9F167FF08C014968C911497826014968C9314976F7716968C9116978617ED :2011C000A9F117968C911797861781F118968C911897861759F119968C911997861731F152 :2011E0001A968C911A97861709F11B968C911B978617E1F0ED01E0E0F0E09E2F8E818823E7 :2012000021F4EA0FFB1F668306C09F5F31962196E630F10591F7963049F481E090E013966A :201220009C938E93129720E030E007C0CD011496BD010E945A0821E030E0C901DF91CF91F9 :20124000089580E867ED71E045E650E00E94E6030895FC0180818F5F808380E86CE372E069 :2012600049E150E00E94E6030895CF92DF92EF92FF920F931F93CF93DF937C016B018A016C :20128000C0E0D0E00FC0D6016D916D01D701ED91FC910190F081E02DC7010995C80FD91FC5 :2012A000015010400115110571F7CE01DF91CF911F910F91FF90EF90DF90CF900895EE0F94 :2012C000FF1F0590F491E02D0994F894FFCF0D0000E1000000000000010100000000450796 :2012E0003509E4060B07F2066D077107000000000E083509B0086D086008FFFFFFFFFFFFED :20130000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :20132000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20134000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20136000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20138000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :2013A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :2013C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2013E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :20140000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :20142000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20144000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20146000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20148000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :2014A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :2014C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2014E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :20150000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :20152000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20154000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20156000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20158000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :2015A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :2015C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2015E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :20160000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :20162000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20164000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20166000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20168000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :2016A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :2016C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2016E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :20170000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :20172000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20174000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20176000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20178000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :2017A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :2017C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2017E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :20180000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :20182000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20184000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20186000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20188000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :2018A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :2018C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2018E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :20190000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :20192000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :20194000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20196000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20198000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :2019A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :2019C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2019E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :201A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :201A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :201A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :201A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :201A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :201AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :201AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :201AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :201B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :201B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :201B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :201B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :201B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :201BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :201BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :201BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :201C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :201C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :201C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :201C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :201C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :201CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :201CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :201CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :201D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :201D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :201D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :201D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :201D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :201DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :201DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :201DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :201E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :201E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :201E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :201E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :201E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :201EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :201EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :201EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :201F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :201F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :201F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :201F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :201F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :201FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :201FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :201FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :20200000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :20202000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20204000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20206000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20208000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :2020A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :2020C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2020E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :20210000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :20212000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20214000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20216000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20218000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :2021A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :2021C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2021E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :20220000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :20222000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20224000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20226000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20228000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :2022A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :2022C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2022E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :20230000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :20232000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20234000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20236000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20238000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :2023A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :2023C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2023E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :20240000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :20242000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20244000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20246000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20248000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :2024A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :2024C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2024E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :20250000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :20252000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20254000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20256000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20258000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :2025A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :2025C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2025E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :20260000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :20262000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20264000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20266000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20268000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :2026A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :2026C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2026E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :20270000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :20272000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20274000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20276000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20278000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :2027A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :2027C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2027E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :20280000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :20282000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20284000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20286000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20288000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :2028A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :2028C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2028E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :20290000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :20292000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :20294000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20296000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20298000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :2029A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :2029C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2029E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :202A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :202A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :202A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :202A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :202A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :202AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :202AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :202AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :202B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :202B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :202B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :202B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :202B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :202BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :202BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :202BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :202C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :202C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :202C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :202C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :202C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :202CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :202CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :202CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :202D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :202D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :202D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :202D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :202D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :202DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :202DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :202DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :202E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :202E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :202E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :202E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :202E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :202EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :202EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :202EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :202F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :202F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :202F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :202F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :202F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :202FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :202FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :202FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :20300000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 :20302000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 :20304000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 :20306000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 :20308000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 :2030A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 :2030C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 :2030E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 :20310000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF :20312000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF :20314000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F :20316000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F :20318000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F :2031A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F :2031C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F :2031E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF :20320000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE :20322000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE :20324000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E :20326000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E :20328000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E :2032A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E :2032C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :2032E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE :20330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20332000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20334000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20336000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :20338000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :2033A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2033C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :2033E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :20340000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20342000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20344000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20346000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :20348000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :2034A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2034C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :2034E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :20350000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20352000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20354000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20356000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :20358000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :2035A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2035C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :2035E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :20360000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20362000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20364000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20366000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :20368000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :2036A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2036C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :2036E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :20370000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20372000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20374000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20376000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :20378000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :2037A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2037C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :2037E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :20380000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20382000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20384000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20386000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :20388000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :2038A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2038C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :2038E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :20390000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :20392000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20394000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20396000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :20398000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :2039A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2039C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :2039E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :203A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :203A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :203A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :203A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :203A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :203AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :203AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :203AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :203B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :203B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :203B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :203B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :203B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :203BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :203BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :203BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :203C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :203C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :203C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :203C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :203C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :203CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :203CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :203CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :203D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :203D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :203D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :203D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :203D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :203DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :203DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :203DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :203E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :203E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :203E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :203E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :203E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :203EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :203EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :203EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :203F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :203F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :203F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :203F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :203F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :203FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :203FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :203FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :20400000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20402000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20404000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20406000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :20408000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :2040A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2040C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :2040E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :20410000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20412000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20414000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20416000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :20418000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :2041A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2041C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :2041E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :20420000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20422000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20424000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20426000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :20428000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :2042A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2042C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :2042E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :20430000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20432000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20434000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20436000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :20438000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :2043A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2043C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :2043E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :20440000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20442000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20444000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20446000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :20448000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :2044A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2044C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :2044E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :20450000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20452000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20454000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20456000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :20458000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :2045A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2045C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :2045E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :20460000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20462000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20464000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20466000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :20468000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :2046A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2046C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :2046E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :20470000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20472000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20474000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20476000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :20478000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :2047A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2047C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :2047E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :20480000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20482000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20484000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20486000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :20488000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :2048A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2048C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :2048E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :20490000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :20492000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20494000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20496000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :20498000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :2049A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2049C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :2049E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :204A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :204A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :204A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :204A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :204A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :204AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :204AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :204AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :204B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :204B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :204B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :204B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :204B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :204BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :204BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :204BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :204C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :204C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :204C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :204C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :204C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :204CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :204CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :204CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :204D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :204D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :204D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :204D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :204D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :204DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :204DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :204DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :204E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :204E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :204E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :204E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :204E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :204EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :204EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :204EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :204F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :204F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :204F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :204F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :204F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :204FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :204FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :204FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :20500000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 :20502000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 :20504000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 :20506000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 :20508000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 :2050A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 :2050C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 :2050E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 :20510000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF :20512000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F :20514000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F :20516000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F :20518000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F :2051A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F :2051C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF :2051E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF :20520000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE :20522000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E :20524000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E :20526000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E :20528000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E :2052A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :2052C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE :2052E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE :20530000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20532000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20534000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :20536000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :20538000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2053A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :2053C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :2053E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20540000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20542000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20544000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :20546000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :20548000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2054A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :2054C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :2054E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20550000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20552000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20554000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :20556000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :20558000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2055A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :2055C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :2055E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20560000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20562000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20564000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :20566000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :20568000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2056A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :2056C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :2056E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20570000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20572000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20574000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :20576000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :20578000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2057A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :2057C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :2057E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20580000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20582000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20584000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :20586000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :20588000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2058A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :2058C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :2058E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20590000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20592000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20594000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :20596000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :20598000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2059A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :2059C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :2059E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :205A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :205A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :205A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :205A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :205A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :205AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :205AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :205AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :205B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :205B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :205B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :205B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :205B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :205BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :205BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :205BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :205C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :205C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :205C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :205C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :205C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :205CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :205CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :205CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :205D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :205D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :205D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :205D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :205D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :205DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :205DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :205DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :205E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :205E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :205E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :205E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :205E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :205EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :205EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :205EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :205F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :205F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :205F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :205F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :205F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :205FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :205FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :205FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :20600000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20602000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20604000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :20606000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :20608000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2060A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :2060C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :2060E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20610000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20612000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20614000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :20616000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :20618000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2061A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :2061C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :2061E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20620000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20622000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20624000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :20626000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :20628000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2062A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :2062C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :2062E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20630000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20632000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20634000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :20636000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :20638000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2063A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :2063C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :2063E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20640000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20642000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20644000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :20646000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :20648000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2064A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :2064C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :2064E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20650000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20652000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20654000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :20656000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :20658000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2065A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :2065C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :2065E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20660000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20662000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20664000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :20666000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :20668000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2066A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :2066C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :2066E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20670000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20672000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20674000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :20676000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :20678000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2067A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :2067C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :2067E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20680000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20682000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20684000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :20686000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :20688000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2068A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :2068C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :2068E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20690000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20692000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20694000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :20696000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :20698000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2069A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :2069C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :2069E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :206A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :206A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :206A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :206A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :206A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :206AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :206AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :206AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :206B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :206B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :206B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :206B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :206B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :206BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :206BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :206BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :206C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :206C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :206C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :206C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :206C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :206CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :206CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :206CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :206D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :206D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :206D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :206D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :206D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :206DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :206DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :206DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :206E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :206E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :206E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :206E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :206E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :206EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :206EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :206EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :206F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :206F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :206F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :206F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :206F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :206FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :206FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :206FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :2070000055C000006EC000006CC000006AC0000068C0000066C0000064C0000062C0000043 :2070200060C000005EC00000EEC400005AC0000058C0000056C0000054C0000052C00000F2 :2070400050C0000078C000004CC000004AC0000048C0000046C0000044C0000042C00000BE :2070600040C000003EC000003CC000003AC0000038C0000036C0000034C0000032C0000048 :2070800030C000002EC000002CC000002AC0000028C0000026C0000024C0000022C00000A8 :2070A00020C000001EC000001CC0000011241FBECFEFDAE0DEBFCDBF11E0A0E0B1E0EAE2B5 :2070C000FFE702C005900D92A83AB107D9F711E0A8EAB1E001C01D92AE3BB107E1F78FD30B :2070E00022C78ECFF89410926F0010928100109285001092840081E085BF15BE47985D9AEF :20710000289A0C94000008952091B2013091B3012F5F3F4F3093B3012093B201932F37FFA6 :2071200003C08EEF831B982F990F921710F447980895479A08951F920F920FB60F9211246E :207140002F938F939F93EF93FF9310928500109284008091A8019091A901009741F00197D3 :207160009093A9018093A801892B09F45D9A8091AA019091AB01009741F001979093AB0126 :207180008093AA01892B09F4289AE0E0F0E0859194918F5F9F4F49F08091AC019091AD0151 :2071A00001969093AD018093AC01FF91EF919F918F912F910F900FBE0F901F90189584E0BC :2071C0008093E9000DC08091E8008B778093E80003C08EB3882351F08091E80082FFF9CFBE :2071E0008091E80085FFEFCF8091F1000895982F83E08093E9008091E80085FD0DC0809136 :20720000E8008E778093E80003C08EB3882369F08091E80080FFF9CF9093F1005D9884E6CB :2072200090E09093A9018093A80108954F925F926F927F928F929F92AF92BF92CF92DF921E :20724000EF92FF920F931F93CF93DF9384E08093E9008091E80082FF57C2289884E690E067 :207260009093AB018093AA01AADF182F853481F48CE49DE19093AD018093AC0107B600FC4B :20728000FDCFF999FECF81E180935700E89503C0843519F494DF8DE00DC28C34E1F38035F9 :2072A000D1F3843721F484E4A2DF80E003C2813611F489E5FFC18134B1F481DF182F7FDFE3 :2072C00090E0880F991FAA2797FDA095BA2F312F330F20E0442737FD4095542F822B932B68 :2072E000A42BB52BB8C1803711F483E5E3C1833549F4C0E0D1E089917ADF21E0C730D20714 :20730000D1F7D9C1863521F481E371DF80E3D2C1833731F487E86BDF85E969DF8EE1CAC149 :207320008536B9F4E0E0F0E093E085E090935700E89507B600FCFDCF80935700E89507B65D :2073400000FCFDCFE058FF4FA0E7E030FA0771F7A2CF823739F4E1E0F0E089E08093570024 :207360008491A8C1863439F4E0E0F0E089E08093570084919FC18E3439F4E3E0F0E089E0E5 :2073800080935700849196C1813539F4E2E0F0E089E08093570084918DC1823631F489E521 :2073A00026DF80E024DF80E885C1823419F0873609F0E5C01092AD011092AC0100DF082FE8 :2073C000FEDEF82EFCDE682E8554823008F071C1902F80E0CF2DD0E0C82BD92B10926F00B3 :2073E000173609F04BC081E180935700E895DD24CC24C3943FC0E090AE01F090AF010091CC :20740000B0011091B101B6E46B16D9F4ED2DF0E0EE29FF29E4918E2FEADEDD2081F082E08D :2074200090E0A0E0B0E0E80EF91E0A1F1B1FE092AE01F092AF010093B0011093B101DC2470 :2074400018C0D801C701B695A7959795879555D5CEDE82E090E0A0E0B0E0E80EF91E0A1FF6 :207460001B1FE092AE01F092AF010093B0011093B1012197209709F0BECF7DC08090AE01F5 :207480009090AF01A090B001B090B10196E4691609F05DC083E0F40180935700E89507B63E :2074A00000FCFDCF54C0F6E46F1661F5772031F1E090AE01F090AF010091B0011091B1019E :2074C0007EDED82ECC24852D90E08C299D29F7010C0140925700E895112482E090E0A0E08B :2074E000B0E0E80EF91E0A1F1B1FE092AE01F092AF010093B0011093B10102C060DE582E1A :20750000742423C0E090AE01F090AF010091B0011091B10116950795F794E79450DE682FFA :20752000C701F3D48091AE019091AF01A091B001B091B1010296A11DB11D8093AE0190934D :20754000AF01A093B001B093B101219704C05524772444244394209709F0A5CF96E46916B6 :2075600041F485E0F40180935700E89507B600FCFDCF8DE03CDE82E080936F009CC0833492 :2075800071F40091AE011091AF0119DE90E021E0F8010C0120935700E89511247CCE8336C8 :2075A00019F5E090AE01F090AF010091B0011091B10105DEF701E16090E021E00C0120938C :2075C0005700E895112482E090E0A0E0B0E0E80EF91E0A1F1B1FE092AE01F092AF0100936A :2075E000B0011093B10157CE8D3661F4E091AE01F091AF0185E080935700E89507B600FCF2 :20760000FDCF49CE823551F4E091AE01F091AF0105911491812FEBDD802F4CC0843421F5FE :20762000E090AE01F090AF010091B0011091B10116950795F794E794C2DD682FC70165D4E2 :207640008091AE019091AF01A091B001B091B1010296A11DB11D8093AE019093AF01A093D8 :20766000B001B093B10117CE843609F5E090AE01F090AF010091B0011091B101D801C70142 :20768000B695A7959795879538D4B1DD82E090E0A0E0B0E0E80EF91E0A1F1B1FE092AE010E :2076A000F092AF010093B0011093B10104C08B3111F08FE39CDD83E08093E9009091E8002B :2076C0008091E8008E778093E80095FF04C010C08EB38823C9F08091E80080FFF9CF809193 :2076E000E8008E778093E80003C08EB3882361F08091E80080FFF9CF84E08093E9008091F1 :20770000E8008B778093E800DF91CF911F910F91FF90EF90DF90CF90BF90AF909F908F90AC :207720007F906F905F904F9008959091B601892F8F77813249F58091B7018032A1F081328A :2077400019F5913A09F58091E800877F8093E8008DE091E067E070E007D28091E8008B770F :207760008093E8000895913279F48091E800877F8093E8008DE091E067E070E059D2809196 :20778000E8008E778093E800089582E061EC42E0B1D083E061E842E1ADD084E060E842E1F7 :2077A000A9C084B7877F84BF88E10FB6F89480936000109260000FBE20E880E090E00FB643 :2077C000F89420936100809361000FBE81E085BF92E095BF3F9A209A559AE1E6F0E02083A1 :2077E000108247985D9A289A109289008AEF8093880090936F0083E080938100ECC040911A :20780000000850910108109201081092000824B714BE88E10FB6F894809360001092600045 :207820000FBE822F90E0FC01E270F07021FD14C0213019F4859194910BC0283069F480918F :20784000090190910A014817590731F0859194918F5F9F4F09F046DCA4DF78941092AD0101 :207860001092AC010CC0E2DC36D38091AC019091AD0181549F4110F01092140145DC8091FB :207880001401882381F78091E00081608093E00029DC80E090E00895FA01923049F09330C0 :2078A00061F09130F9F485E191E022E130E01EC087E291E02EE330E019C0882329F485E6FA :2078C00091E024E030E012C0813029F489E691E022E230E00BC0823029F48DE891E028E106 :2078E00030E004C080E090E020E030E091838083C90108958093E9008091EB00816080936A :20790000EB001092ED006093EC004093ED008091EE00881F8827881F08958091B601882342 :207920008CF403C08EB38823B1F08091E80082FFF9CF8091E8008B778093E80008958EB361 :20794000882349F08091E80080FFF9CF8091E8008E778093E8000895EF92FF920F931F9307 :2079600045D04CD008ED10E0F80180818F77808380818068808380818F7D808319BC1EBA45 :207980001092B40180EEE82EF12CF70180818B7F8083F80180818160808380E060E042E049 :2079A000A9DFE1EEF0E080818E7F8083E2EEF0E0808181608083808188608083F701808125 :2079C0008E7F8083F8018081806180831F910F91FF90EF900895E7EDF0E080818160808335 :2079E0008AE482BF81E08093B501B6CFE8EDF0E080818E7F80831092E20008951092DA00D6 :207A00001092E10008951F920F920FB60F9211242F933F934F935F936F937F938F939F9389 :207A2000AF93BF93EF93FF938091DA0080FF1BC08091D80080FF17C08091DA008E7F80930F :207A4000DA008091D90080FF0BC080E189BD82E189BD09B400FEFDCF81E08EBB3BD203C0C7 :207A600019BC1EBA37D28091E10080FF17C08091E20080FF13C08091E2008E7F8093E200CE :207A80008091E20080618093E2008091D80080628093D80019BC85E08EBB1CD28091E10004 :207AA00084FF2CC08091E20084FF28C080E189BD82E189BD09B400FEFDCF8091D8008F7D2D :207AC0008093D8008091E1008F7E8093E1008091E2008F7E8093E2008091E20081608093EC :207AE000E2008091B401882331F48091E30087FD02C081E001C084E08EBBECD18091E10056 :207B000083FF21C08091E20083FF1DC08091E100877F8093E10082E08EBB1092B4018091B1 :207B2000E1008E7F8093E1008091E2008E7F8093E2008091E20080618093E20080E060E005 :207B400042E0D8DEC7D1FF91EF91BF91AF919F918F917F916F915F914F913F912F910F90B6 :207B60000FBE0F901F9018959C014091BC015091BD014617570718F4F90190E044C06115C8 :207B8000710511F0AB01F8CF8091E8008E778093E80040E050E0F0CF8EB3882309F444C006 :207BA000853009F443C08091E80083FF02C081E008958091E80082FD31C08091E80080FFF4 :207BC00022C08091F3009091F200782F60E0292F30E0262B372B07C081918093F10041503C :207BE00050402F5F3F4F4115510519F02830310598F390E02830310509F491E08091E800A6 :207C00008E778093E8004115510531F6992321F605C08EB3882341F0853041F08091E800FD :207C200082FFF7CF80E0089582E0089583E008959C016115710529F48091E8008B7780934D :207C4000E800F90126C08EB3882391F1853091F18091E80083FF02C081E008958091E80083 :207C600082FFF1CF06C08091F10081936150704059F02091F3008091F200322F20E090E0C5 :207C8000822B932B892B79F78091E8008B778093E80061157105B9F605C08EB3882341F0E2 :207CA000853041F08091E80080FFF7CF80E0089582E0089583E008950F931F93DF93CF937C :207CC00000D0CDB7DEB7E6EBF1E08091F100819381E0EE3BF807C9F728DD8091E80083FF3A :207CE000E4C08091B6019091B701953009F46DC0963040F4913081F1913070F0933009F046 :207D0000D4C02AC0983009F4A3C0993009F4B2C0963009F0CAC07CC0803809F4C6C082380B :207D200009F0C3C08091BA0187708093E9008091EB001092E9002091E800277F2093E800A7 :207D400090E025E0969587952A95E1F781708093F1001092F10087C0882319F0823009F0A2 :207D6000A4C08F71823009F0A0C08091B801882331F52091BA01277009F497C02093E90006 :207D80008091EB0080FF1BC0933021F48091EB00806213C08091EB0080618093EB0081E0C8 :207DA00090E002C0880F991F2A95E2F78093EA001092EA008091EB0088608093EB0010929D :207DC000E9008091E800877F51C0882309F06DC01091B8011F770FB7F8948091E800877F98 :207DE0008093E8009ADD8091E80080FFFCCF8091E3008078812B8093E30080688093E30062 :207E0000112311F482E001C083E08EBB0FBF4DC08058823008F049C08091B8019091B9014F :207E20006091BA01AE014F5F5F4F36DDBC01009709F43BC08091E800877F8093E800898128 :207E40009A8192DE8091E8008B778093E8002DC0803859F58091E800877F8093E8008091A3 :207E6000B4018093F1008091E8008E778093E80054DD1BC08823C9F49091B8019230A8F4A4 :207E80008091E800877F8093E8009093B40145DD8091B401882331F48091E30087FD02C01E :207EA00081E001C084E08EBB70DC8091E80083FF0AC08091EB0080628093EB008091E8008D :207EC000877F8093E8000F900F90CF91DF911F910F91089508951F938EB3882361F0109179 :207EE000E9001092E9008091E80083FF01C0E4DE17701093E9001F910895F999FECF92BD02 :207F000081BDF89A992780B50895262FF999FECF1FBA92BD81BD20BD0FB6F894FA9AF99A90 :207F20000FBE01960895F894FFCF4341544552494E4100777700080000000000000801128E :207F4000011001020000084123360001000201000109023E00020100803209040000010258 :207F60000201000524001001042402040524060001070582030800FF09040100020A0000B4 :207F8000000705040210000107058302100001040309042203410072006400750069006E80 :207FA000006F0020004C0065006F006E006100720064006F00000018034100720064007557 :127FC0000069006E006F0020004C004C0043000000006E :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/caterina/Leonardo-prod-firmware-2012-04-26.txt ================================================ Builds against LUFA version 111009 make version 3.81 avrdude version 5.11 All AVR tools except avrdude were installed by CrossPack 20100115: avr-gcc version 4.3.3 (GCC) Thread model: single Configured with: ../configure —prefix=/usr/local/CrossPack-AVR-20100115 —disable-dependency-tracking —disable-nls —disable-werror —target=avr —enable-languages=c,c++ —disable-nls —disable-libssp —with-dwarf2 avr-libc version 1.6.7 binutils version 2.19 ================================================ FILE: external/arduino/avr/bootloaders/caterina/Leonardo-prod-firmware-2012-12-10.hex ================================================ :200000000C946E010C9496010C9496010C9496010C9496010C9496010C9496010C94960150 :200020000C9496010C9496010C94F6040C947D050C9496010C9496010C9496010C949601BA :200040000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C94B501C9 :200060000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601C8 :200080000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601A8 :2000A0000C9496010C9496010C94960100000000240027002A002D003000000000002500A4 :2000C00028002B002E003100000000002300260029002C002F00040404040403040502027D :2000E0000202040302020202060606060606040402020204040802011040804010204080A8 :200100004080080204018040201002011080102040400000000200080E0000030401000BB2 :200120000000070605040100080A0B0C0D09040309042203410072006400750069006E00CD :200140006F0020004C0065006F006E006100720064006F00180341007200640075006900CC :200160006E006F0020004C004C004300120100020000004041233680000101020001120120 :200180000002020000404123368000010102000100C18081C1080B00020202010009040052 :2001A000000102020000052400100105240101010424020605240600010705810310004094 :2001C00009040100020A000000070502024000000705830240000005010902A1010901A186 :2001E000008501050919012903150025019503750181029501750581030501093009310943 :20020000381581257F750895038106C0C005010906A1018502050719E029E715002501754D :20022000019508810295017508810395067508150025650507190029658100C0090402004C :2002400001030000000921010100012265000705840340000100000000000000002A2B2895 :200260000000000000000000000000000000000000000000002C9EB4A0A1A2A434A6A7A553 :20028000AE362D3738271E1F20212223242526B333B62EB7B89F8485868788898A8B8C8D58 :2002A0008E8F909192939495969798999A9B9C9D2F3130A3AD350405060708090A0B0C0D7C :2002C0000E0F101112131415161718191A1B1C1DAFB1B0B5000032041007150811241FBE85 :2002E000CFEFDAE0DEBFCDBF11E0A0E0B1E0E0EAF2E102C005900D92AC32B107D9F711E071 :20030000ACE2B1E001C01D92AD39B107E1F712E0CCEDD2E004C02297FE010E944A09C63D07 :20032000D107C9F70E946C030C944E090C9400008091000161E00E94390368EE73E080E043 :2003400090E00E94FD018091000160E00E94390368EE73E080E090E00E94FD010895809196 :20036000000161E00E94AC0208951F920F920FB60F9211242F933F938F939F93AF93BF93E5 :200380008091300190913101A0913201B0913301309134010196A11DB11D232F2D5F2D3794 :2003A00020F02D570196A11DB11D209334018093300190933101A0933201B0933301809117 :2003C0002C0190912D01A0912E01B0912F010196A11DB11D80932C0190932D01A0932E01BA :2003E000B0932F01BF91AF919F918F913F912F910F900FBE0F901F9018959B01AC017FB734 :20040000F89480912C0190912D01A0912E01B0912F0166B5A89B05C06F3F19F00196A11DC3 :20042000B11D7FBFBA2FA92F982F8827860F911DA11DB11D62E0880F991FAA1FBB1F6A9577 :20044000D1F7BC012DC0FFB7F89480912C0190912D01A0912E01B0912F01E6B5A89B05C0E7 :20046000EF3F19F00196A11DB11DFFBFBA2FA92F982F88278E0F911DA11DB11DE2E0880FFD :20048000991FAA1FBB1FEA95D1F7861B970B885E9340C8F2215030404040504068517C4F8F :2004A000211531054105510571F60895789484B5826084BD84B5816084BD85B5826085BD0F :2004C00085B5816085BDEEE6F0E0808181608083E1E8F0E010828081826080838081816043 :2004E0008083E0E8F0E0808181608083E1E9F0E0808182608083808181608083E0E9F0E07E :20050000808181608083E1ECF0E0808184608083808182608083808181608083E3ECF0E007 :20052000808181608083E0ECF0E0808182608083E2ECF0E0808181608083EAE7F0E080812F :20054000846080838081826080838081816080838081806880830895CF93DF93482F50E0E5 :20056000CA018C509F4FFC0134914A525F4FFA018491882369F190E0880F991FFC01E455D0 :20058000FF4FA591B491FC01E654FF4FC591D491662351F42FB7F8948C91932F9095892362 :2005A0008C93888189230BC0623061F42FB7F8948C91932F909589238C938881832B8883B2 :2005C0002FBF06C09FB7F8948C91832B8C939FBFDF91CF910895883071F1893068F48230EF :2005E00031F1833020F4813009F042C01DC0833089F08430E9F512C08B3059F18C3028F41C :200600008930E9F08A30A1F51EC08C3031F18E3079F529C0809180008F7703C0809180003C :200620008F7D80938000089584B58F7702C084B58F7D84BD0895809190008F7707C08091DB :2006400090008F7D03C080919000877F8093900008958091C0008F7703C08091C0008F7DDD :200660008093C00008958091C200877F8093C2000895FF920F931F93F62E482F50E0CA0144 :200680008E5E9E4FFC012491CA018C509F4FFC0114914A525F4FFA0104910023C9F022239D :2006A00019F0822F0E94EB02E02FF0E0EE0FFF1FE654FF4FA591B4919FB7F894FF2021F4DE :2006C0008C911095812302C08C91812B8C939FBF1F910F91FF900895CF93DF930E94560262 :2006E0008DE391E00E9433040E94AF01C0E0D0E00E9498012097E1F30E940000F9CF282F17 :20070000809137018823C1F057FF1AC015C02898909336018091F1008193E217F307B9F75C :200720004115510539F08091F200882319F48BE68093E800AFBF02C04FEF5FEFCA01089599 :20074000AFB7F89427702093E9008091F200282F30E0241735070CF4A901FB019B01240F1E :20076000311D94E6DACFDF93CF930F92CDB7DEB7BE016F5F7F4F41E050E00E947F03019712 :2007800019F02FEF3FEF03C08981282F30E0C9010F90CF91DF910895FF920F931F93F82EEF :2007A000142F052F40913A0150913B01212F302FC901DC01FB016EEF29C0F7FE02C0949125 :2007C00001C09081209138013091390124173507ACF48091E8008570E1F38091E80082FF0F :2007E00003C02FEF3FEF17C09093F100C90101968F739070892B11F46093E8002F5F3F4FEC :200800003093390120933801119731961097A9F6812F902F9C01C9011F910F91FF900895E8 :200820009C018091E80082FFFCCFF901260F311D03C08091F1008193E217F307D1F7289805 :2008400084E6809336018BEF8093E800CB0108958093E9008091F200882319F08AE38093D3 :20086000E800089508951092370181E08093D70080EA8093D80082E189BD09B400FEFDCFAC :2008800061E070E080E090E00E94FD0180E98093D8008CE08093E2001092E000559A209A77 :2008A00008955F926F927F928F929F92AF92BF92CF92DF92EF92FF920F931F93CF93DF93A8 :2008C000E82E842E752E80913701882371F18B01242F352FC901EC017AEFF72E67E0962EC4 :2008E0009E2050E4552E8E2D90E040E2A42EB12CA822B9223AE3632E20E4C22ED12CC82259 :20090000D92258C09FB7F8949092E9008091E80085FD02C020E004C08091F200252D281B3E :200920009FBF222361F4FA9419F42FEF3FEF4DC061E070E080E090E00E94FD013BC0822F1E :2009400090E0C817D9070CF42C2FC21BD1094FB7F8949092E900A114B10421F406C01092D2 :20096000F10021502223D9F719C0E7FC03C0F801922F10C0C801322F06C0FC010196E491FE :20098000E093F10031503323C1F706C081918093F10091509923D1F7020F111D8091E800EB :2009A00085FF05C0209729F4C114D10411F06092E8004FBF209709F0A5CF5D9884E68093F1 :2009C0003501282D372DC9019C01C901DF91CF911F910F91FF90EF90DF90CF90BF90AF906D :2009E0009F908F907F906F905F9008951F920F920FB60F9211242F933F934F935F936F93B8 :200A00007F938F939F93AF93BF93EF93FF938091E1001092E100982F83FF0FC01092E900B0 :200A200081E08093EB001092EC0082E38093ED001092370188E08093F00092FF34C083E037 :200A40008093E9008091F200882319F08AE38093E8008FB7F89492E09093E9009091F20018 :200A60008FBF992321F082E891E00E94530780913501882351F080913501815080933501F0 :200A800080913501882309F45D9A80913601882351F0809136018150809336018091360191 :200AA000882309F4289AFF91EF91BF91AF919F918F917F916F915F914F913F912F910F90CD :200AC0000FBE0F901F9018950F931F93DF93CF930F92CDB7DEB719828E010F5F1F4FC8019D :200AE0000E947907C8010E941209898190E00F90CF91DF911F910F9108951F920F920FB661 :200B00000F921124EF92FF921F932F933F934F935F936F937F938F939F93AF93BF93EF9355 :200B2000FF93DF93CF93CDB7DEB76197DEBFCDBF1092E9008091E80083FF0FC1FE01319679 :200B40009E01275F3F4F03C08091F1008193E217F307D1F7289884E68093360182EF809356 :200B6000E800998197FF05C08091E80080FFFCCF03C08EEF8093E800292F30E0C901807672 :200B80009070892B09F0C2C08A81882329F41092F1001092F100D6C0813009F4D3C08330A3 :200BA00009F4D0C0853049F48091E80080FFFCCF8B8180688093E300C5C0863009F07CC019 :200BC0001C81EF80F8841230C1F51092E900109239011092380110923B0110923A010E94F6 :200BE000640599E0FE013996DF01292F1D922A95E9F799871A8791E09E8790E8988B9AEF44 :200C0000998B2091380130913901275F3F4F3C872B878D871092E9001092390110923801EC :200C2000F0923B01E0923A0180E0BF0149E050E00E94CC030E94640585C01092E9001092E2 :200C4000390110923801F0923B01E0923A01123241F482E290E00E940A09892B09F476C02B :200C600071C0113079F488E0E816F10419F481E080933C0180913C01882309F06BC0ECE68D :200C8000F1E013C0133009F061C08B81882319F4EEE2F1E00AC0823019F4E2E3F1E005C00A :200CA000813009F053C0E4E5F1E0449180E8BF0150E00E94CC0346C0873009F447C08830C6 :200CC00021F481E08093F1003DC08930D9F523703070232BD9F5E1E9F1E091E031E026E3A1 :200CE0009093E9003093EB0084918093EC002093ED009F5F3196953099F78EE78093EA00FA :200D00001092EA008B81809337011CC08F8198851092E900109239011092380190933B0146 :200D200080933A018D81882329F4CE0101960E94850706C0823051F4CE0101960E94DB0754 :200D4000882321F08EEF8093E80007C081E28093EB0003C0EEE7F1E0A8CF6196DEBFCDBF37 :200D6000CF91DF91FF91EF91BF91AF919F918F917F916F915F914F913F912F911F91FF9004 :200D8000EF900F900FBE0F901F90189520917E0130917F018091800190918101281B390B40 :200DA0002F733070C901089520917E0130917F0180918001909181012817390719F42FEF3A :200DC0003FEF09C0E0918001F0918101E25CFE4F8081282F30E0C901089520917E013091DC :200DE0007F0180918001909181012817390719F42FEF3FEF13C0E0918001F0918101E25C60 :200E0000FE4F2081809180019091810101968F739070909381018093800130E0C901089566 :200E2000109285011092840188EE93E0A0E0B0E08093860190938701A0938801B09389019C :200E400080E191E0909383018093820108950F931F93DF93CF930F92CDB7DEB78C0169838B :200E600080910901882369F083E0BE016F5F7F4F41E050E00E9451041816190614F49C015B :200E800007C081E090E0F8019383828320E030E0C9010F90CF91DF911F910F91089583E00D :200EA0000E9428040895CF93DF9312C082E00E94B3032FEF8F3F9207C9F0E0917E01F091B8 :200EC0007F01E25CFE4F8083D0937F01C0937E01C0917E01D0917F012196CF73D070809154 :200EE000800190918101C817D90701F7DF91CF910895FC0180818E5F808380E865E971E0B5 :200F000042E450E00E94CC030895FC0181819081913A59F4813209F04CC080E062E071E09A :200F200047E050E00E94CC0342C0913209F041C0803239F482E091E067E070E00E9410042B :200F400036C0823209F035C08281809309018091020190910301A0910401B0910501805B48 :200F60009440A040B04019F58091090180FD12C087E797E790930108809300082BE088E1AE :200F800090E00FB6F894A895809360000FBE209360000DC088E10FB6F89480936000109264 :200FA00060000FBEA895109201081092000881E0089580E00895FC0191818081813A31F487 :200FC000913089F080E0933089F40DC0813269F49B3021F4828180930A0105C09A3029F4AD :200FE000828180930B0181E0089580E00895EF92FF920F931F938C01E62EDC01ED91FC91E5 :201000000480F581E02D0995F82ED801ED91FC910680F781E02DC8016E2D09958F2D90E0E8 :201020001F910F91FF90EF90089510929001109294011092930182E291E090939201809377 :2010400091010895EF92FF920F931F93DF93CF930F92CDB7DEB789838B017A0184E0BE0137 :201060006F5F7F4F41E050E00E94510484E4B801A7010E9451040F90CF91DF911F910F910D :20108000FF90EF90089582E048E050E00E9422080895FC01168217821086118612861386F6 :2010A00014823496BF010E9443080895DC01683810F0685829C0E62FF0E067FF13C0E0580A :2010C000F04081E090E002C0880F991FEA95E2F7809514962C911497282314962C93149720 :2010E00060E012C0EB5AFD4F6491662319F420E030E01DC067FF08C014968C9114978D7F29 :2011000014968C9314976F77FD0190E0662321F08681861709F416829F5F31969630B1F701 :20112000CD011496BD010E94430821E030E0C9010895CF93DF93DC01683810F0685825C01E :20114000E62FF0E067FF12C0E058F04081E090E002C0880F991FEA95E2F714962C911497BE :20116000282B14962C93149760E00FC0EB5AFD4F64916623D9F167FF08C014968C91149780 :20118000826014968C9314976F7716968C9116978617A9F117968C911797861781F1189631 :2011A0008C911897861759F119968C911997861731F11A968C911A97861709F11B968C915E :2011C0001B978617E1F0ED01E0E0F0E09E2F8E81882321F4EA0FFB1F668306C09F5F31964E :2011E0002196E630F10591F7963049F481E090E013969C938E93129720E030E007C0CD0189 :201200001496BD010E94430821E030E0C901DF91CF91089580E867ED71E045E650E00E9427 :20122000CC030895FC0180818F5F808380E86CE372E049E150E00E94CC030895CF92DF9210 :20124000EF92FF920F931F93CF93DF937C016B018A01C0E0D0E00FC0D6016D916D01D701A6 :20126000ED91FC910190F081E02DC7010995C80FD91F015010400115110571F7CE01DF91AB :20128000CF911F910F91FF90EF90DF90CF900895EE0FFF1F0590F491E02D0994F894FFCFEC :2012A0000D0000E100000000000001010000000027071E09C606ED06D4064F0753070000A0 :2012C0000000F7071E09990856084908FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :2012E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :20130000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :20132000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20134000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20136000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20138000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :2013A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :2013C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2013E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :20140000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :20142000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20144000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20146000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20148000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :2014A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :2014C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2014E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :20150000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :20152000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20154000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20156000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20158000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :2015A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :2015C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2015E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :20160000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :20162000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20164000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20166000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20168000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :2016A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :2016C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2016E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :20170000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :20172000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20174000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20176000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20178000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :2017A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :2017C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2017E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :20180000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :20182000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20184000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20186000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20188000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :2018A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :2018C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2018E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :20190000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :20192000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :20194000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20196000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20198000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :2019A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :2019C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2019E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :201A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :201A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :201A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :201A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :201A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :201AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :201AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :201AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :201B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :201B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :201B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :201B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :201B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :201BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :201BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :201BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :201C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :201C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :201C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :201C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :201C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :201CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :201CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :201CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :201D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :201D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :201D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :201D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :201D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :201DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :201DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :201DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :201E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :201E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :201E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :201E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :201E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :201EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :201EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :201EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :201F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :201F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :201F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :201F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :201F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :201FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :201FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :201FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :20200000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :20202000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20204000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20206000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20208000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :2020A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :2020C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2020E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :20210000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :20212000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20214000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20216000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20218000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :2021A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :2021C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2021E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :20220000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :20222000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20224000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20226000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20228000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :2022A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :2022C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2022E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :20230000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :20232000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20234000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20236000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20238000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :2023A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :2023C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2023E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :20240000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :20242000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20244000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20246000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20248000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :2024A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :2024C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2024E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :20250000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :20252000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20254000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20256000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20258000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :2025A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :2025C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2025E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :20260000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :20262000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20264000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20266000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20268000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :2026A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :2026C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2026E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :20270000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :20272000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20274000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20276000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20278000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :2027A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :2027C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2027E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :20280000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :20282000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20284000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20286000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20288000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :2028A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :2028C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2028E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :20290000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :20292000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :20294000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20296000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20298000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :2029A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :2029C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2029E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :202A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :202A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :202A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :202A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :202A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :202AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :202AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :202AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :202B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :202B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :202B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :202B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :202B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :202BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :202BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :202BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :202C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :202C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :202C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :202C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :202C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :202CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :202CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :202CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :202D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :202D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :202D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :202D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :202D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :202DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :202DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :202DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :202E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :202E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :202E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :202E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :202E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :202EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :202EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :202EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :202F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :202F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :202F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :202F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :202F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :202FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :202FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :202FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :20300000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 :20302000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 :20304000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 :20306000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 :20308000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 :2030A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 :2030C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 :2030E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 :20310000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF :20312000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF :20314000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F :20316000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F :20318000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F :2031A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F :2031C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F :2031E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF :20320000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE :20322000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE :20324000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E :20326000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E :20328000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E :2032A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E :2032C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :2032E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE :20330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20332000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20334000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20336000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :20338000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :2033A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2033C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :2033E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :20340000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20342000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20344000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20346000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :20348000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :2034A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2034C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :2034E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :20350000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20352000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20354000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20356000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :20358000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :2035A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2035C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :2035E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :20360000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20362000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20364000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20366000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :20368000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :2036A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2036C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :2036E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :20370000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20372000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20374000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20376000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :20378000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :2037A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2037C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :2037E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :20380000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20382000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20384000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20386000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :20388000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :2038A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2038C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :2038E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :20390000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :20392000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20394000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20396000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :20398000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :2039A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2039C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :2039E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :203A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :203A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :203A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :203A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :203A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :203AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :203AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :203AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :203B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :203B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :203B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :203B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :203B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :203BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :203BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :203BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :203C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :203C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :203C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :203C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :203C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :203CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :203CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :203CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :203D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :203D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :203D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :203D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :203D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :203DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :203DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :203DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :203E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :203E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :203E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :203E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :203E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :203EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :203EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :203EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :203F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :203F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :203F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :203F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :203F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :203FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :203FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :203FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :20400000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20402000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20404000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20406000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :20408000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :2040A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2040C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :2040E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :20410000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20412000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20414000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20416000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :20418000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :2041A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2041C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :2041E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :20420000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20422000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20424000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20426000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :20428000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :2042A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2042C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :2042E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :20430000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20432000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20434000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20436000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :20438000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :2043A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2043C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :2043E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :20440000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20442000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20444000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20446000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :20448000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :2044A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2044C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :2044E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :20450000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20452000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20454000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20456000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :20458000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :2045A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2045C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :2045E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :20460000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20462000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20464000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20466000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :20468000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :2046A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2046C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :2046E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :20470000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20472000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20474000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20476000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :20478000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :2047A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2047C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :2047E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :20480000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20482000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20484000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20486000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :20488000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :2048A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2048C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :2048E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :20490000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :20492000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20494000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20496000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :20498000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :2049A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2049C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :2049E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :204A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :204A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :204A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :204A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :204A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :204AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :204AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :204AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :204B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :204B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :204B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :204B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :204B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :204BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :204BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :204BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :204C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :204C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :204C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :204C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :204C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :204CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :204CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :204CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :204D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :204D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :204D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :204D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :204D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :204DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :204DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :204DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :204E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :204E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :204E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :204E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :204E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :204EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :204EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :204EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :204F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :204F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :204F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :204F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :204F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :204FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :204FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :204FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :20500000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 :20502000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 :20504000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 :20506000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 :20508000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 :2050A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 :2050C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 :2050E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 :20510000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF :20512000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F :20514000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F :20516000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F :20518000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F :2051A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F :2051C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF :2051E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF :20520000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE :20522000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E :20524000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E :20526000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E :20528000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E :2052A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :2052C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE :2052E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE :20530000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20532000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20534000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :20536000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :20538000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2053A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :2053C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :2053E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20540000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20542000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20544000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :20546000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :20548000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2054A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :2054C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :2054E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20550000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20552000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20554000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :20556000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :20558000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2055A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :2055C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :2055E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20560000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20562000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20564000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :20566000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :20568000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2056A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :2056C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :2056E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20570000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20572000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20574000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :20576000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :20578000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2057A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :2057C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :2057E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20580000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20582000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20584000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :20586000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :20588000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2058A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :2058C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :2058E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20590000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20592000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20594000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :20596000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :20598000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2059A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :2059C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :2059E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :205A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :205A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :205A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :205A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :205A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :205AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :205AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :205AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :205B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :205B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :205B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :205B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :205B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :205BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :205BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :205BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :205C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :205C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :205C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :205C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :205C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :205CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :205CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :205CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :205D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :205D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :205D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :205D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :205D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :205DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :205DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :205DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :205E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :205E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :205E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :205E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :205E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :205EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :205EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :205EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :205F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :205F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :205F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :205F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :205F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :205FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :205FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :205FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :20600000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20602000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20604000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :20606000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :20608000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2060A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :2060C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :2060E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20610000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20612000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20614000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :20616000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :20618000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2061A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :2061C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :2061E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20620000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20622000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20624000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :20626000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :20628000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2062A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :2062C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :2062E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20630000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20632000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20634000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :20636000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :20638000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2063A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :2063C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :2063E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20640000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20642000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20644000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :20646000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :20648000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2064A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :2064C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :2064E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20650000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20652000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20654000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :20656000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :20658000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2065A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :2065C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :2065E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20660000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20662000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20664000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :20666000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :20668000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2066A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :2066C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :2066E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20670000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20672000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20674000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :20676000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :20678000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2067A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :2067C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :2067E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20680000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20682000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20684000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :20686000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :20688000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2068A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :2068C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :2068E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20690000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20692000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20694000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :20696000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :20698000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2069A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :2069C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :2069E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :206A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :206A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :206A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :206A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :206A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :206AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :206AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :206AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :206B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :206B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :206B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :206B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :206B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :206BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :206BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :206BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :206C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :206C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :206C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :206C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :206C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :206CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :206CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :206CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :206D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :206D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :206D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :206D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :206D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :206DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :206DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :206DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :206E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :206E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :206E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :206E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :206E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :206EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :206EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :206EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :206F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :206F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :206F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :206F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :206F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :206FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :206FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :206FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :2070000055C000006EC000006CC000006AC0000068C0000066C0000064C0000062C0000043 :2070200060C000005EC00000F2C400005AC0000058C0000056C0000054C0000052C00000EE :2070400050C0000078C000004CC000004AC0000048C0000046C0000044C0000042C00000BE :2070600040C000003EC000003CC000003AC0000038C0000036C0000034C0000032C0000048 :2070800030C000002EC000002CC000002AC0000028C0000026C0000024C0000022C00000A8 :2070A00020C000001EC000001CC0000011241FBECFEFDAE0DEBFCDBF11E0A0E0B1E0E2E3BC :2070C000FFE702C005900D92A83AB107D9F711E0A8EAB1E001C01D92AE3BB107E1F78FD30B :2070E00026C78ECFF89410926F0010928100109285001092840081E085BF15BE47985D9AEB :20710000289A0C94000008952091B2013091B3012F5F3F4F3093B3012093B201932F37FFA6 :2071200003C08EEF831B982F990F921710F447980895479A08951F920F920FB60F9211246E :207140002F938F939F93EF93FF9310928500109284008091A8019091A901009741F00197D3 :207160009093A9018093A801892B09F45D9A8091AA019091AB01009741F001979093AB0126 :207180008093AA01892B09F4289AE0E0F0E0859194918F5F9F4F49F08091AC019091AD0151 :2071A00001969093AD018093AC01FF91EF919F918F912F910F900FBE0F901F90189584E0BC :2071C0008093E9000DC08091E8008B778093E80003C08EB3882351F08091E80082FFF9CFBE :2071E0008091E80085FFEFCF8091F1000895982F83E08093E9008091E80085FD0DC0809136 :20720000E8008E778093E80003C08EB3882369F08091E80080FFF9CF9093F1005D9884E6CB :2072200090E09093A9018093A80108954F925F926F927F928F929F92AF92BF92CF92DF921E :20724000EF92FF920F931F93CF93DF9384E08093E9008091E80082FF57C2289884E690E067 :207260009093AB018093AA01AADF182F853481F48CE49DE19093AD018093AC0107B600FC4B :20728000FDCFF999FECF81E180935700E89503C0843519F494DF8DE00DC28C34E1F38035F9 :2072A000D1F3843721F484E4A2DF80E003C2813611F489E5FFC18134B1F481DF182F7FDFE3 :2072C00090E0880F991FAA2797FDA095BA2F312F330F20E0442737FD4095542F822B932B68 :2072E000A42BB52BB8C1803711F483E5E3C1833549F4C0E0D1E089917ADF21E0C730D20714 :20730000D1F7D9C1863521F481E371DF80E3D2C1833731F487E86BDF85E969DF8EE1CAC149 :207320008536B9F4E0E0F0E093E085E090935700E89507B600FCFDCF80935700E89507B65D :2073400000FCFDCFE058FF4FA0E7E030FA0771F7A2CF823739F4E1E0F0E089E08093570024 :207360008491A8C1863439F4E0E0F0E089E08093570084919FC18E3439F4E3E0F0E089E0E5 :2073800080935700849196C1813539F4E2E0F0E089E08093570084918DC1823631F489E521 :2073A00026DF80E024DF80E885C1823419F0873609F0E5C01092AD011092AC0100DF082FE8 :2073C000FEDEF82EFCDE682E8554823008F071C1902F80E0CF2DD0E0C82BD92B10926F00B3 :2073E000173609F04BC081E180935700E895DD24CC24C3943FC0E090AE01F090AF010091CC :20740000B0011091B101B6E46B16D9F4ED2DF0E0EE29FF29E4918E2FEADEDD2081F082E08D :2074200090E0A0E0B0E0E80EF91E0A1F1B1FE092AE01F092AF010093B0011093B101DC2470 :2074400018C0D801C701B695A7959795879559D5CEDE82E090E0A0E0B0E0E80EF91E0A1FF2 :207460001B1FE092AE01F092AF010093B0011093B1012197209709F0BECF7DC08090AE01F5 :207480009090AF01A090B001B090B10196E4691609F05DC083E0F40180935700E89507B63E :2074A00000FCFDCF54C0F6E46F1661F5772031F1E090AE01F090AF010091B0011091B1019E :2074C0007EDED82ECC24852D90E08C299D29F7010C0140925700E895112482E090E0A0E08B :2074E000B0E0E80EF91E0A1F1B1FE092AE01F092AF010093B0011093B10102C060DE582E1A :20750000742423C0E090AE01F090AF010091B0011091B10116950795F794E79450DE682FFA :20752000C701F7D48091AE019091AF01A091B001B091B1010296A11DB11D8093AE01909349 :20754000AF01A093B001B093B101219704C05524772444244394209709F0A5CF96E46916B6 :2075600041F485E0F40180935700E89507B600FCFDCF8DE03CDE82E080936F009CC0833492 :2075800071F40091AE011091AF0119DE90E021E0F8010C0120935700E89511247CCE8336C8 :2075A00019F5E090AE01F090AF010091B0011091B10105DEF701E16090E021E00C0120938C :2075C0005700E895112482E090E0A0E0B0E0E80EF91E0A1F1B1FE092AE01F092AF0100936A :2075E000B0011093B10157CE8D3661F4E091AE01F091AF0185E080935700E89507B600FCF2 :20760000FDCF49CE823551F4E091AE01F091AF0105911491812FEBDD802F4CC0843421F5FE :20762000E090AE01F090AF010091B0011091B10116950795F794E794C2DD682FC70169D4DE :207640008091AE019091AF01A091B001B091B1010296A11DB11D8093AE019093AF01A093D8 :20766000B001B093B10117CE843609F5E090AE01F090AF010091B0011091B101D801C70142 :20768000B695A795979587953CD4B1DD82E090E0A0E0B0E0E80EF91E0A1F1B1FE092AE010A :2076A000F092AF010093B0011093B10104C08B3111F08FE39CDD83E08093E9009091E8002B :2076C0008091E8008E778093E80095FF04C010C08EB38823C9F08091E80080FFF9CF809193 :2076E000E8008E778093E80003C08EB3882361F08091E80080FFF9CF84E08093E9008091F1 :20770000E8008B778093E800DF91CF911F910F91FF90EF90DF90CF90BF90AF909F908F90AC :207720007F906F905F904F9008959091B601892F8F77813249F58091B7018032A1F081328A :2077400019F5913A09F58091E800877F8093E8008DE091E067E070E00BD28091E8008B770B :207760008093E8000895913279F48091E800877F8093E8008DE091E067E070E05DD2809192 :20778000E8008E778093E800089582E061EC42E0B5D083E061E842E1B1D084E060E842E1EF :2077A000ADC084B7877F84BF88E10FB6F89480936000109260000FBE20E880E090E00FB63F :2077C000F89420936100809361000FBE81E085BF92E095BF3F9A209A559AE1E6F0E02083A1 :2077E000108247985D9A289A109289008AEF8093880090936F0083E080938100F0C0409116 :20780000000850910108109201081092000894B714BE88E10FB6F8948093600010926000D5 :207820000FBE292F30E0F901E270F07091FD18C090FF05C0859194918F5F9F4F81F423FFFF :207840000FC08091090190910A014817590741F0E0E0F0E0859194918F5F9F4F09F042DC64 :20786000A0DF78941092AD011092AC010CC0DEDC36D38091AC019091AD0181549F4110F00D :207880001092140141DC80911401882381F78091E00081608093E00025DC80E090E0089598 :2078A000FA01923049F0933061F09130F9F485E191E022E130E01EC087E291E02EE330E04D :2078C00019C0882329F485E691E024E030E012C0813029F489E691E022E230E00BC0823006 :2078E00029F48DE891E028E130E004C080E090E020E030E091838083C90108958093E9004E :207900008091EB0081608093EB001092ED006093EC004093ED008091EE00881F8827881F62 :2079200008958091B60188238CF403C08EB38823B1F08091E80082FFF9CF8091E8008B772A :207940008093E80008958EB3882349F08091E80080FFF9CF8091E8008E778093E800089594 :20796000EF92FF920F931F9345D04CD008ED10E0F80180818F77808380818068808380819B :207980008F7D808319BC1EBA1092B40180EEE82EF12CF70180818B7F8083F8018081816052 :2079A000808380E060E042E0A9DFE1EEF0E080818E7F8083E2EEF0E0808181608083808144 :2079C00088608083F70180818E7F8083F8018081806180831F910F91FF90EF900895E7ED06 :2079E000F0E08081816080838AE482BF81E08093B501B6CFE8EDF0E080818E7F808310921C :207A0000E20008951092DA001092E10008951F920F920FB60F9211242F933F934F935F93F6 :207A20006F937F938F939F93AF93BF93EF93FF938091DA0080FF1BC08091D80080FF17C0B2 :207A40008091DA008E7F8093DA008091D90080FF0BC080E189BD82E189BD09B400FEFDCF36 :207A600081E08EBB3BD203C019BC1EBA37D28091E10080FF17C08091E20080FF13C0809138 :207A8000E2008E7F8093E2008091E20080618093E2008091D80080628093D80019BC85E049 :207AA0008EBB1CD28091E10084FF2CC08091E20084FF28C080E189BD82E189BD09B400FEC5 :207AC000FDCF8091D8008F7D8093D8008091E1008F7E8093E1008091E2008F7E8093E20012 :207AE0008091E20081608093E2008091B401882331F48091E30087FD02C081E001C084E067 :207B00008EBBECD18091E10083FF21C08091E20083FF1DC08091E100877F8093E10082E06A :207B20008EBB1092B4018091E1008E7F8093E1008091E2008E7F8093E2008091E2008061E9 :207B40008093E20080E060E042E0D8DEC7D1FF91EF91BF91AF919F918F917F916F915F9130 :207B60004F913F912F910F900FBE0F901F9018959C014091BC015091BD014617570718F49D :207B8000F90190E044C06115710511F0AB01F8CF8091E8008E778093E80040E050E0F0CF0F :207BA0008EB3882309F444C0853009F443C08091E80083FF02C081E008958091E80082FD70 :207BC00031C08091E80080FF22C08091F3009091F200782F60E0292F30E0262B372B07C07A :207BE00081918093F100415050402F5F3F4F4115510519F02830310598F390E02830310566 :207C000009F491E08091E8008E778093E8004115510531F6992321F605C08EB3882341F075 :207C2000853041F08091E80082FFF7CF80E0089582E0089583E008959C016115710529F47C :207C40008091E8008B778093E800F90126C08EB3882391F1853091F18091E80083FF02C06C :207C600081E008958091E80082FFF1CF06C08091F10081936150704059F02091F300809191 :207C8000F200322F20E090E0822B932B892B79F78091E8008B778093E80061157105B9F601 :207CA00005C08EB3882341F0853041F08091E80080FFF7CF80E0089582E0089583E00895C2 :207CC0000F931F93DF93CF9300D0CDB7DEB7E6EBF1E08091F100819381E0EE3BF807C9F792 :207CE00024DD8091E80083FFE4C08091B6019091B701953009F46DC0963040F4913081F1A7 :207D0000913070F0933009F0D4C02AC0983009F4A3C0993009F4B2C0963009F0CAC07CC023 :207D2000803809F4C6C0823809F0C3C08091BA0187708093E9008091EB001092E9002091DB :207D4000E800277F2093E80090E025E0969587952A95E1F781708093F1001092F10087C0D8 :207D6000882319F0823009F0A4C08F71823009F0A0C08091B801882331F52091BA01277097 :207D800009F497C02093E9008091EB0080FF1BC0933021F48091EB00806213C08091EB0018 :207DA00080618093EB0081E090E002C0880F991F2A95E2F78093EA001092EA008091EB00E5 :207DC00088608093EB001092E9008091E800877F51C0882309F06DC01091B8011F770FB79B :207DE000F8948091E800877F8093E8009ADD8091E80080FFFCCF8091E3008078812B809398 :207E0000E30080688093E300112311F482E001C083E08EBB0FBF4DC08058823008F049C033 :207E20008091B8019091B9016091BA01AE014F5F5F4F36DDBC01009709F43BC08091E8008E :207E4000877F8093E80089819A8192DE8091E8008B778093E8002DC0803859F58091E800AA :207E6000877F8093E8008091B4018093F1008091E8008E778093E80054DD1BC08823C9F4CA :207E80009091B8019230A8F48091E800877F8093E8009093B40145DD8091B401882331F420 :207EA0008091E30087FD02C081E001C084E08EBB6CDC8091E80083FF0AC08091EB0080624E :207EC0008093EB008091E800877F8093E8000F900F90CF91DF911F910F91089508951F9360 :207EE0008EB3882361F01091E9001092E9008091E80083FF01C0E4DE17701093E9001F916F :207F00000895F999FECF92BD81BDF89A992780B50895262FF999FECF1FBA92BD81BD20BDBD :207F20000FB6F894FA9AF99A0FBE01960895F894FFCF4341544552494E4100777700080031 :207F40000000000000080112011001020000084123360001000201000109023E00020100FF :207F600080320904000001020201000524001001042402040524060001070582030800FF0C :207F800009040100020A000000070504021000010705830210000104030904220341007216 :207FA000006400750069006E006F0020004C0065006F006E006100720064006F0000001836 :1A7FC00003410072006400750069006E006F0020004C004C004300000000D7 :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/caterina/Leonardo-prod-firmware-2012-12-10.txt ================================================ Builds against LUFA version 111009 make version 3.81 avrdude version 5.11 All AVR tools except avrdude were installed by CrossPack 20100115: avr-gcc version 4.3.3 (GCC) Thread model: single Configured with: ../configure —prefix=/usr/local/CrossPack-AVR-20100115 —disable-dependency-tracking —disable-nls —disable-werror —target=avr —enable-languages=c,c++ —disable-nls —disable-libssp —with-dwarf2 avr-libc version 1.6.7 binutils version 2.19 ================================================ FILE: external/arduino/avr/bootloaders/caterina/Makefile ================================================ # Hey Emacs, this is a -*- makefile -*- #---------------------------------------------------------------------------- # WinAVR Makefile Template written by Eric B. Weddington, Jrg Wunsch, et al. # >> Modified for use with the LUFA project. << # # Released to the Public Domain # # Additional material for this makefile was written by: # Peter Fleury # Tim Henigan # Colin O'Flynn # Reiner Patommel # Markus Pfaff # Sander Pool # Frederik Rouleau # Carlos Lamas # Dean Camera # Opendous Inc. # Denver Gingerich # #---------------------------------------------------------------------------- # On command line: # # make all = Make software. # # make clean = Clean out built project files. # # make coff = Convert ELF to AVR COFF. # # make extcoff = Convert ELF to AVR Extended COFF. # # make program = Download the hex file to the device, using avrdude. # Please customize the avrdude settings below first! # # make doxygen = Generate DoxyGen documentation for the project (must have # DoxyGen installed) # # make debug = Start either simulavr or avarice as specified for debugging, # with avr-gdb or avr-insight as the front end for debugging. # # make filename.s = Just compile filename.c into the assembler code only. # # make filename.i = Create a preprocessed source file for use in submitting # bug reports to the GCC project. # # To rebuild project do "make clean" then "make all". #---------------------------------------------------------------------------- # USB vendor ID (VID) # reuse of this VID by others is forbidden by USB-IF # official Arduino LLC VID # VID = 0x2341 # USB product ID (PID) # official Leonardo PID # PID = 0x0036 # official Micro PID # PID = 0x0037 # official Esplora PID # PID = 0x003C # MCU name MCU = atmega32u4 # Target architecture (see library "Board Types" documentation). ARCH = AVR8 # Target board (see library "Board Types" documentation, NONE for projects not requiring # LUFA board drivers). If USER is selected, put custom board drivers in a directory called # "Board" inside the application directory. BOARD = USER # Processor frequency. # This will define a symbol, F_CPU, in all source code files equal to the # processor frequency in Hz. You can then use this symbol in your source code to # calculate timings. Do NOT tack on a 'UL' at the end, this will be done # automatically to create a 32-bit value in your source code. # # This will be an integer division of F_USB below, as it is sourced by # F_USB after it has run through any CPU prescalers. Note that this value # does not *change* the processor frequency - it should merely be updated to # reflect the processor speed set externally so that the code can use accurate # software delays. F_CPU = 16000000 # Input clock frequency. # This will define a symbol, F_USB, in all source code files equal to the # input clock frequency (before any prescaling is performed) in Hz. This value may # differ from F_CPU if prescaling is used on the latter, and is required as the # raw input clock is fed directly to the PLL sections of the AVR for high speed # clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' # at the end, this will be done automatically to create a 32-bit value in your # source code. # # If no clock division is performed on the input clock inside the AVR (via the # CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. F_USB = $(F_CPU) # Starting byte address of the bootloader, as a byte address - computed via the formula # BOOT_START = ((FLASH_SIZE_KB - BOOT_SECTION_SIZE_KB) * 1024) # # Note that the bootloader size and start address given in AVRStudio is in words and not # bytes, and so will need to be doubled to obtain the byte address needed by AVR-GCC. FLASH_SIZE_KB = 32 BOOT_SECTION_SIZE_KB = 4 BOOT_START = 0x$(shell echo "obase=16; ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024" | bc) # Output format. (can be srec, ihex, binary) FORMAT = ihex # Target file name (without extension). TARGET = Caterina # Object files directory # To put object files in current directory, use a dot (.), do NOT make # this an empty or blank macro! OBJDIR = . # Path to the LUFA library LUFA_PATH = ../../../../../../LUFA/LUFA-111009 # LUFA library compile-time options and predefined tokens LUFA_OPTS = -D USB_DEVICE_ONLY LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0 LUFA_OPTS += -D ORDERED_EP_CONFIG LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8 LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 LUFA_OPTS += -D USE_RAM_DESCRIPTORS LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" LUFA_OPTS += -D NO_INTERNAL_SERIAL LUFA_OPTS += -D NO_DEVICE_SELF_POWER LUFA_OPTS += -D NO_DEVICE_REMOTE_WAKEUP LUFA_OPTS += -D NO_SOF_EVENTS #LUFA_OPTS += -D NO_BLOCK_SUPPORT #LUFA_OPTS += -D NO_EEPROM_BYTE_SUPPORT #LUFA_OPTS += -D NO_FLASH_BYTE_SUPPORT LUFA_OPTS += -D NO_LOCK_BYTE_WRITE_SUPPORT # Create the LUFA source path variables by including the LUFA root makefile include $(LUFA_PATH)/LUFA/makefile # List C source files here. (C dependencies are automatically generated.) SRC = $(TARGET).c \ Descriptors.c \ $(LUFA_SRC_USB) \ # List C++ source files here. (C dependencies are automatically generated.) CPPSRC = # List Assembler source files here. # Make them always end in a capital .S. Files ending in a lowercase .s # will not be considered source files but generated files (assembler # output from the compiler), and will be deleted upon "make clean"! # Even though the DOS/Win* filesystem matches both .s and .S the same, # it will preserve the spelling of the filenames, and gcc itself does # care about how the name is spelled on its command-line. ASRC = # Optimization level, can be [0, 1, 2, 3, s]. # 0 = turn off optimization. s = optimize for size. # (Note: 3 is not always the best optimization level. See avr-libc FAQ.) OPT = s # Debugging format. # Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. # AVR Studio 4.10 requires dwarf-2. # AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. DEBUG = dwarf-2 # List any extra directories to look for include files here. # Each directory must be seperated by a space. # Use forward slashes for directory separators. # For a directory that has spaces, enclose it in quotes. EXTRAINCDIRS = $(LUFA_PATH)/ # Compiler flag to set the C Standard level. # c89 = "ANSI" C # gnu89 = c89 plus GCC extensions # c99 = ISO C99 standard (not yet fully implemented) # gnu99 = c99 plus GCC extensions CSTANDARD = -std=c99 # Place -D or -U options here for C sources CDEFS = -DF_CPU=$(F_CPU)UL CDEFS += -DF_USB=$(F_USB)UL CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH) CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL CDEFS += -DDEVICE_VID=$(VID)UL CDEFS += -DDEVICE_PID=$(PID)UL CDEFS += $(LUFA_OPTS) # Place -D or -U options here for ASM sources ADEFS = -DF_CPU=$(F_CPU) ADEFS += -DF_USB=$(F_USB)UL ADEFS += -DBOARD=BOARD_$(BOARD) ADEFS += -DBOOT_START_ADDR=$(BOOT_START)UL ADEFS += $(LUFA_OPTS) # Place -D or -U options here for C++ sources CPPDEFS = -DF_CPU=$(F_CPU)UL CPPDEFS += -DF_USB=$(F_USB)UL CPPDEFS += -DBOARD=BOARD_$(BOARD) CPPDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL CPPDEFS += $(LUFA_OPTS) #CPPDEFS += -D__STDC_LIMIT_MACROS #CPPDEFS += -D__STDC_CONSTANT_MACROS #---------------- Compiler Options C ---------------- # -g*: generate debugging information # -O*: optimization level # -f...: tuning, see GCC manual and avr-libc documentation # -Wall...: warning level # -Wa,...: tell GCC to pass this to the assembler. # -adhlns...: create assembler listing CFLAGS = -g$(DEBUG) CFLAGS += $(CDEFS) CFLAGS += -O$(OPT) CFLAGS += -funsigned-char CFLAGS += -funsigned-bitfields CFLAGS += -ffunction-sections CFLAGS += -fno-inline-small-functions CFLAGS += -fpack-struct CFLAGS += -fshort-enums CFLAGS += -fno-strict-aliasing CFLAGS += -Wall CFLAGS += -Wstrict-prototypes #CFLAGS += -mshort-calls #CFLAGS += -fno-unit-at-a-time #CFLAGS += -Wundef #CFLAGS += -Wunreachable-code #CFLAGS += -Wsign-compare CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) CFLAGS += $(CSTANDARD) #---------------- Compiler Options C++ ---------------- # -g*: generate debugging information # -O*: optimization level # -f...: tuning, see GCC manual and avr-libc documentation # -Wall...: warning level # -Wa,...: tell GCC to pass this to the assembler. # -adhlns...: create assembler listing CPPFLAGS = -g$(DEBUG) CPPFLAGS += $(CPPDEFS) CPPFLAGS += -O$(OPT) CPPFLAGS += -funsigned-char CPPFLAGS += -funsigned-bitfields CPPFLAGS += -fpack-struct CPPFLAGS += -fshort-enums CPPFLAGS += -fno-exceptions CPPFLAGS += -Wall CPPFLAGS += -Wundef #CPPFLAGS += -mshort-calls #CPPFLAGS += -fno-unit-at-a-time #CPPFLAGS += -Wstrict-prototypes #CPPFLAGS += -Wunreachable-code #CPPFLAGS += -Wsign-compare CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) #CPPFLAGS += $(CSTANDARD) #---------------- Assembler Options ---------------- # -Wa,...: tell GCC to pass this to the assembler. # -adhlns: create listing # -gstabs: have the assembler create line number information; note that # for use in COFF files, additional information about filenames # and function names needs to be present in the assembler source # files -- see avr-libc docs [FIXME: not yet described there] # -listing-cont-lines: Sets the maximum number of continuation lines of hex # dump that will be displayed for a given single line of source input. ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 #---------------- Library Options ---------------- # Minimalistic printf version PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min # Floating point printf version (requires MATH_LIB = -lm below) PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt # If this is left blank, then it will use the Standard printf version. PRINTF_LIB = #PRINTF_LIB = $(PRINTF_LIB_MIN) #PRINTF_LIB = $(PRINTF_LIB_FLOAT) # Minimalistic scanf version SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min # Floating point + %[ scanf version (requires MATH_LIB = -lm below) SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt # If this is left blank, then it will use the Standard scanf version. SCANF_LIB = #SCANF_LIB = $(SCANF_LIB_MIN) #SCANF_LIB = $(SCANF_LIB_FLOAT) MATH_LIB = -lm # List any extra directories to look for libraries here. # Each directory must be seperated by a space. # Use forward slashes for directory separators. # For a directory that has spaces, enclose it in quotes. EXTRALIBDIRS = #---------------- External Memory Options ---------------- # 64 KB of external RAM, starting after internal RAM (ATmega128!), # used for variables (.data/.bss) and heap (malloc()). #EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff # 64 KB of external RAM, starting after internal RAM (ATmega128!), # only used for heap (malloc()). #EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff EXTMEMOPTS = #---------------- Linker Options ---------------- # -Wl,...: tell GCC to pass this to linker. # -Map: create map file # --cref: add cross reference to map file LDFLAGS = -Wl,-Map=$(TARGET).map,--cref LDFLAGS += -Wl,--section-start=.text=$(BOOT_START) LDFLAGS += -Wl,--relax LDFLAGS += -Wl,--gc-sections LDFLAGS += $(EXTMEMOPTS) LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) #LDFLAGS += -T linker_script.x #---------------- Programming Options (avrdude) ---------------- # Programming hardware # Type: avrdude -c ? # to get a full listing. # AVRDUDE_PROGRAMMER = avrispmkII # com1 = serial port. Use lpt1 to connect to parallel port. AVRDUDE_PORT = usb AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex #AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep # Uncomment the following if you want avrdude's erase cycle counter. # Note that this counter needs to be initialized first using -Yn, # see avrdude manual. #AVRDUDE_ERASE_COUNTER = -y # Uncomment the following if you do /not/ wish a verification to be # performed after programming the device. #AVRDUDE_NO_VERIFY = -V # Increase verbosity level. Please use this when submitting bug # reports about avrdude. See # to submit bug reports. #AVRDUDE_VERBOSE = -v -v AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) #---------------- Debugging Options ---------------- # For simulavr only - target MCU frequency. DEBUG_MFREQ = $(F_CPU) # Set the DEBUG_UI to either gdb or insight. # DEBUG_UI = gdb DEBUG_UI = insight # Set the debugging back-end to either avarice, simulavr. DEBUG_BACKEND = avarice #DEBUG_BACKEND = simulavr # GDB Init Filename. GDBINIT_FILE = __avr_gdbinit # When using avarice settings for the JTAG JTAG_DEV = /dev/com1 # Debugging port used to communicate between GDB / avarice / simulavr. DEBUG_PORT = 4242 # Debugging host used to communicate between GDB / avarice / simulavr, normally # just set to localhost unless doing some sort of crazy debugging when # avarice is running on a different computer. DEBUG_HOST = localhost #============================================================================ # Define programs and commands. SHELL = sh CC = avr-gcc OBJCOPY = avr-objcopy OBJDUMP = avr-objdump SIZE = avr-size AR = avr-ar rcs NM = avr-nm AVRDUDE = /Applications/avrdude -C /Applications/avrdude.conf -B 1 REMOVE = rm -f REMOVEDIR = rm -rf COPY = cp WINSHELL = cmd # Define Messages # English MSG_ERRORS_NONE = Errors: none MSG_BEGIN = -------- begin -------- MSG_END = -------- end -------- MSG_SIZE_BEFORE = Size before: MSG_SIZE_AFTER = Size after: MSG_COFF = Converting to AVR COFF: MSG_EXTENDED_COFF = Converting to AVR Extended COFF: MSG_FLASH = Creating load file for Flash: MSG_EEPROM = Creating load file for EEPROM: MSG_EXTENDED_LISTING = Creating Extended Listing: MSG_SYMBOL_TABLE = Creating Symbol Table: MSG_LINKING = Linking: MSG_COMPILING = Compiling C: MSG_COMPILING_CPP = Compiling C++: MSG_ASSEMBLING = Assembling: MSG_CLEANING = Cleaning project: MSG_CREATING_LIBRARY = Creating library: # Define all object files. OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) # Define all listing files. LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) # Compiler flags to generate dependency files. GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d # Combine all necessary flags and optional flags. # Add target processor to flags. ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) # Default target. all: begin gccversion sizebefore build sizeafter end # Change the build target to build a HEX file or a library. build: elf hex eep lss sym #build: lib elf: $(TARGET).elf hex: $(TARGET).hex eep: $(TARGET).eep lss: $(TARGET).lss sym: $(TARGET).sym LIBNAME=lib$(TARGET).a lib: $(LIBNAME) # Eye candy. # AVR Studio 3.x does not check make's exit code but relies on # the following magic strings to be generated by the compile job. begin: @echo @echo $(MSG_BEGIN) end: @echo $(MSG_END) @echo # Display size of file. HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) sizebefore: @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ 2>/dev/null; echo; fi sizeafter: @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ 2>/dev/null; echo; fi # Display compiler version information. gccversion : @$(CC) --version # Program the device. program: $(TARGET).hex $(TARGET).eep $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) # Generate avr-gdb config/init file which does the following: # define the reset signal, load the target file, connect to target, and set # a breakpoint at main(). gdb-config: @$(REMOVE) $(GDBINIT_FILE) @echo define reset >> $(GDBINIT_FILE) @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) @echo end >> $(GDBINIT_FILE) @echo file $(TARGET).elf >> $(GDBINIT_FILE) @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) ifeq ($(DEBUG_BACKEND),simulavr) @echo load >> $(GDBINIT_FILE) endif @echo break main >> $(GDBINIT_FILE) debug: gdb-config $(TARGET).elf ifeq ($(DEBUG_BACKEND), avarice) @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) @$(WINSHELL) /c pause else @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ $(DEBUG_MFREQ) --port $(DEBUG_PORT) endif @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) # Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. COFFCONVERT = $(OBJCOPY) --debugging COFFCONVERT += --change-section-address .data-0x800000 COFFCONVERT += --change-section-address .bss-0x800000 COFFCONVERT += --change-section-address .noinit-0x800000 COFFCONVERT += --change-section-address .eeprom-0x810000 coff: $(TARGET).elf @echo @echo $(MSG_COFF) $(TARGET).cof $(COFFCONVERT) -O coff-avr $< $(TARGET).cof extcoff: $(TARGET).elf @echo @echo $(MSG_EXTENDED_COFF) $(TARGET).cof $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof # Create final output files (.hex, .eep) from ELF output file. %.hex: %.elf @echo @echo $(MSG_FLASH) $@ $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@ %.eep: %.elf @echo @echo $(MSG_EEPROM) $@ -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 # Create extended listing file from ELF output file. %.lss: %.elf @echo @echo $(MSG_EXTENDED_LISTING) $@ $(OBJDUMP) -h -S -z $< > $@ # Create a symbol table from ELF output file. %.sym: %.elf @echo @echo $(MSG_SYMBOL_TABLE) $@ $(NM) -n $< > $@ # Create library from object files. .SECONDARY : $(TARGET).a .PRECIOUS : $(OBJ) %.a: $(OBJ) @echo @echo $(MSG_CREATING_LIBRARY) $@ $(AR) $@ $(OBJ) # Link: create ELF output file from object files. .SECONDARY : $(TARGET).elf .PRECIOUS : $(OBJ) %.elf: $(OBJ) @echo @echo $(MSG_LINKING) $@ $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) # Compile: create object files from C source files. $(OBJDIR)/%.o : %.c @echo @echo $(MSG_COMPILING) $< $(CC) -c $(ALL_CFLAGS) $< -o $@ # Compile: create object files from C++ source files. $(OBJDIR)/%.o : %.cpp @echo @echo $(MSG_COMPILING_CPP) $< $(CC) -c $(ALL_CPPFLAGS) $< -o $@ # Compile: create assembler files from C source files. %.s : %.c $(CC) -S $(ALL_CFLAGS) $< -o $@ # Compile: create assembler files from C++ source files. %.s : %.cpp $(CC) -S $(ALL_CPPFLAGS) $< -o $@ # Assemble: create object files from assembler source files. $(OBJDIR)/%.o : %.S @echo @echo $(MSG_ASSEMBLING) $< $(CC) -c $(ALL_ASFLAGS) $< -o $@ # Create preprocessed source for use in sending a bug report. %.i : %.c $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ # Target: clean project. clean: begin clean_list end clean_list : @echo @echo $(MSG_CLEANING) $(REMOVE) $(TARGET).hex $(REMOVE) $(TARGET).eep $(REMOVE) $(TARGET).cof $(REMOVE) $(TARGET).elf $(REMOVE) $(TARGET).map $(REMOVE) $(TARGET).sym $(REMOVE) $(TARGET).lss $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) $(REMOVE) $(SRC:.c=.s) $(REMOVE) $(SRC:.c=.d) $(REMOVE) $(SRC:.c=.i) $(REMOVEDIR) .dep doxygen: @echo Generating Project Documentation \($(TARGET)\)... @doxygen Doxygen.conf @echo Documentation Generation Complete. clean_doxygen: rm -rf Documentation checksource: @for f in $(SRC) $(CPPSRC) $(ASRC); do \ if [ -f $$f ]; then \ echo "Found Source File: $$f" ; \ else \ echo "Source File Not Found: $$f" ; \ fi; done # Create object files directory $(shell mkdir $(OBJDIR) 2>/dev/null) # Include the dependency files. -include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) # Listing of phony targets. .PHONY : all begin finish end sizebefore sizeafter gccversion \ build elf hex eep lss sym coff extcoff doxygen clean \ clean_list clean_doxygen program debug gdb-config checksource ================================================ FILE: external/arduino/avr/bootloaders/caterina/Micro-prod-firmware-2012-11-23.hex ================================================ :200000000C946E010C9496010C9496010C9496010C9496010C9496010C9496010C94960150 :200020000C9496010C9496010C94F8040C947F050C9496010C9496010C9496010C949601B6 :200040000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C94B501C9 :200060000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601C8 :200080000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601A8 :2000A0000C9496010C9496010C94960100000000240027002A002D003000000000002500A4 :2000C00028002B002E003100000000002300260029002C002F00040404040403040502027D :2000E0000202040302020202060606060606040402020204040802011040804010204080A8 :200100004080080204018040201002011080102040400000000200080E0000030401000BB2 :200120000000070605040100080A0B0C0D09040309042203410072006400750069006E00CD :200140006F0020004D006900630072006F00200020002000180341007200640075006900A6 :200160006E006F0020004C004C00430012010002000000404123378000010102000112011F :200180000002020000404123378000010102000100C18081C1080B00020202010009040051 :2001A000000102020000052400100105240101010424020605240600010705810310004094 :2001C00009040100020A000000070502024000000705830240000005010902A1010901A186 :2001E000008501050919012903150025019503750181029501750581030501093009310943 :20020000381581257F750895038106C0C005010906A1018502050719E029E715002501754D :20022000019508810295017508810395067508150025650507190029658100C0090402004C :2002400001030000000921010100012265000705840340000100000000000000002A2B2895 :200260000000000000000000000000000000000000000000002C9EB4A0A1A2A434A6A7A553 :20028000AE362D3738271E1F20212223242526B333B62EB7B89F8485868788898A8B8C8D58 :2002A0008E8F909192939495969798999A9B9C9D2F3130A3AD350405060708090A0B0C0D7C :2002C0000E0F101112131415161718191A1B1C1DAFB1B0B5000032041207170811241FBE81 :2002E000CFEFDAE0DEBFCDBF11E0A0E0B1E0E4EAF2E102C005900D92AC32B107D9F711E06D :20030000ACE2B1E001C01D92AD39B107E1F712E0CCEDD2E004C02297FE010E944C09C63D05 :20032000D107C9F70E946C030C9450090C9400008091000161E00E94390368EE73E080E041 :2003400090E00E94FD018091000160E00E94390368EE73E080E090E00E94FD010895809196 :20036000000161E00E94AC0208951F920F920FB60F9211242F933F938F939F93AF93BF93E5 :200380008091300190913101A0913201B0913301309134010196A11DB11D232F2D5F2D3794 :2003A00020F02D570196A11DB11D209334018093300190933101A0933201B0933301809117 :2003C0002C0190912D01A0912E01B0912F010196A11DB11D80932C0190932D01A0932E01BA :2003E000B0932F01BF91AF919F918F913F912F910F900FBE0F901F9018959B01AC017FB734 :20040000F89480912C0190912D01A0912E01B0912F0166B5A89B05C06F3F19F00196A11DC3 :20042000B11D7FBFBA2FA92F982F8827860F911DA11DB11D62E0880F991FAA1FBB1F6A9577 :20044000D1F7BC012DC0FFB7F89480912C0190912D01A0912E01B0912F01E6B5A89B05C0E7 :20046000EF3F19F00196A11DB11DFFBFBA2FA92F982F88278E0F911DA11DB11DE2E0880FFD :20048000991FAA1FBB1FEA95D1F7861B970B885E9340C8F2215030404040504068517C4F8F :2004A000211531054105510571F60895789484B5826084BD84B5816084BD85B5826085BD0F :2004C00085B5816085BDEEE6F0E0808181608083E1E8F0E010828081826080838081816043 :2004E0008083E0E8F0E0808181608083E1E9F0E0808182608083808181608083E0E9F0E07E :20050000808181608083E1ECF0E0808184608083808182608083808181608083E3ECF0E007 :20052000808181608083E0ECF0E0808182608083E2ECF0E0808181608083EAE7F0E080812F :20054000846080838081826080838081816080838081806880830895CF93DF93482F50E0E5 :20056000CA018C509F4FFC0134914A525F4FFA018491882369F190E0880F991FFC01E455D0 :20058000FF4FA591B491FC01E654FF4FC591D491662351F42FB7F8948C91932F9095892362 :2005A0008C93888189230BC0623061F42FB7F8948C91932F909589238C938881832B8883B2 :2005C0002FBF06C09FB7F8948C91832B8C939FBFDF91CF910895883071F1893068F48230EF :2005E00031F1833020F4813009F042C01DC0833089F08430E9F512C08B3059F18C3028F41C :200600008930E9F08A30A1F51EC08C3031F18E3079F529C0809180008F7703C0809180003C :200620008F7D80938000089584B58F7702C084B58F7D84BD0895809190008F7707C08091DB :2006400090008F7D03C080919000877F8093900008958091C0008F7703C08091C0008F7DDD :200660008093C00008958091C200877F8093C2000895FF920F931F93F62E482F50E0CA0144 :200680008E5E9E4FFC012491CA018C509F4FFC0114914A525F4FFA0104910023C9F022239D :2006A00019F0822F0E94EB02E02FF0E0EE0FFF1FE654FF4FA591B4919FB7F894FF2021F4DE :2006C0008C911095812302C08C91812B8C939FBF1F910F91FF900895CF93DF930E94560262 :2006E0008DE391E00E9433040E94AF01C0E0D0E00E9498012097E1F30E940000F9CF282F17 :20070000809137018823C1F057FF1AC015C0289A909336018091F1008193E217F307B9F75A :200720004115510539F08091F200882319F48BE68093E800AFBF02C04FEF5FEFCA01089599 :20074000AFB7F89427702093E9008091F200282F30E0241735070CF4A901FB019B01240F1E :20076000311D94E6DACFDF93CF930F92CDB7DEB7BE016F5F7F4F41E050E00E947F03019712 :2007800019F02FEF3FEF03C08981282F30E0C9010F90CF91DF910895FF920F931F93F82EEF :2007A000142F052F40913A0150913B01212F302FC901DC01FB016EEF29C0F7FE02C0949125 :2007C00001C09081209138013091390124173507ACF48091E8008570E1F38091E80082FF0F :2007E00003C02FEF3FEF17C09093F100C90101968F739070892B11F46093E8002F5F3F4FEC :200800003093390120933801119731961097A9F6812F902F9C01C9011F910F91FF900895E8 :200820009C018091E80082FFFCCFF901260F311D03C08091F1008193E217F307D1F7289A03 :2008400084E6809336018BEF8093E800CB0108958093E9008091F200882319F08AE38093D3 :20086000E800089508951092370181E08093D70080EA8093D80082E189BD09B400FEFDCFAC :2008800061E070E080E090E00E94FD0180E98093D8008CE08093E2001092E000559A209A77 :2008A0005D98289808955F926F927F928F929F92AF92BF92CF92DF92EF92FF920F931F93C7 :2008C000CF93DF93E82E842E752E80913701882371F18B01242F352FC901EC017AEFF72EFB :2008E00067E0962E9E2050E4552E8E2D90E040E2A42EB12CA822B9223AE3632E20E4C22E35 :20090000D12CC822D92258C09FB7F8949092E9008091E80085FD02C020E004C08091F200EC :20092000252D281B9FBF222361F4FA9419F42FEF3FEF4DC061E070E080E090E00E94FD0135 :200940003BC0822F90E0C817D9070CF42C2FC21BD1094FB7F8949092E900A114B10421F48E :2009600006C01092F10021502223D9F719C0E7FC03C0F801922F10C0C801322F06C0FC01A2 :200980000196E491E093F10031503323C1F706C081918093F10091509923D1F7020F111DD8 :2009A0008091E80085FF05C0209729F4C114D10411F06092E8004FBF209709F0A5CF5D9A73 :2009C00084E680933501282D372DC9019C01C901DF91CF911F910F91FF90EF90DF90CF907E :2009E000BF90AF909F908F907F906F905F9008951F920F920FB60F9211242F933F934F931E :200A00005F936F937F938F939F93AF93BF93EF93FF938091E1001092E100982F83FF0FC047 :200A20001092E90081E08093EB001092EC0082E38093ED001092370188E08093F00092FF03 :200A400034C083E08093E9008091F200882319F08AE38093E8008FB7F89492E09093E900D4 :200A60009091F2008FBF992321F082E891E00E94550780913501882351F080913501815024 :200A80008093350180913501882309F45D9880913601882351F08091360181508093360192 :200AA00080913601882309F42898FF91EF91BF91AF919F918F917F916F915F914F913F91E6 :200AC0002F910F900FBE0F901F9018950F931F93DF93CF930F92CDB7DEB719828E010F5F75 :200AE0001F4FC8010E947B07C8010E941409898190E00F90CF91DF911F910F9108951F928C :200B00000F920FB60F921124EF92FF921F932F933F934F935F936F937F938F939F93AF93C3 :200B2000BF93EF93FF93DF93CF93CDB7DEB76197DEBFCDBF1092E9008091E80083FF0FC16B :200B4000FE0131969E01275F3F4F03C08091F1008193E217F307D1F7289A84E68093360112 :200B600082EF8093E800998197FF05C08091E80080FFFCCF03C08EEF8093E800292F30E0AE :200B8000C90180769070892B09F0C2C08A81882329F41092F1001092F100D6C0813009F429 :200BA000D3C0833009F4D0C0853049F48091E80080FFFCCF8B8180688093E300C5C0863008 :200BC00009F07CC01C81EF80F8841230C1F51092E900109239011092380110923B0110929E :200BE0003A010E94660599E0FE013996DF01292F1D922A95E9F799871A8791E09E8790E811 :200C0000988B9AEF998B2091380130913901275F3F4F3C872B878D871092E900109239011B :200C200010923801F0923B01E0923A0180E0BF0149E050E00E94CC030E94660585C0109290 :200C4000E9001092390110923801F0923B01E0923A01123241F482E290E00E940C09892BD1 :200C600009F476C071C0113079F488E0E816F10419F481E080933C0180913C01882309F057 :200C80006BC0ECE6F1E013C0133009F061C08B81882319F4EEE2F1E00AC0823019F4E2E3A3 :200CA000F1E005C0813009F053C0E4E5F1E0449180E8BF0150E00E94CC0346C0873009F4EF :200CC00047C0883021F481E08093F1003DC08930D9F523703070232BD9F5E1E9F1E091E0FC :200CE00031E026E39093E9003093EB0084918093EC002093ED009F5F3196953099F78EE7DD :200D00008093EA001092EA008B81809337011CC08F8198851092E9001092390110923801A8 :200D200090933B0180933A018D81882329F4CE0101960E94870706C0823051F4CE01019677 :200D40000E94DD07882321F08EEF8093E80007C081E28093EB0003C0EEE7F1E0A8CF6196DA :200D6000DEBFCDBFCF91DF91FF91EF91BF91AF919F918F917F916F915F914F913F912F911A :200D80001F91FF90EF900F900FBE0F901F90189520917E0130917F01809180019091810188 :200DA000281B390B2F733070C901089520917E0130917F01809180019091810128173907DE :200DC00019F42FEF3FEF09C0E0918001F0918101E25CFE4F8081282F30E0C90108952091F1 :200DE0007E0130917F0180918001909181012817390719F42FEF3FEF13C0E0918001F091E0 :200E00008101E25CFE4F2081809180019091810101968F739070909381018093800130E00D :200E2000C9010895109285011092840188EE93E0A0E0B0E08093860190938701A093880102 :200E4000B093890180E191E0909383018093820108950F931F93DF93CF930F92CDB7DEB737 :200E60008C01698380910901882369F083E0BE016F5F7F4F41E050E00E9453041816190685 :200E800014F49C0107C081E090E0F8019383828320E030E0C9010F90CF91DF911F910F9168 :200EA000089583E00E9428040895CF93DF9312C082E00E94B3032FEF8F3F9207C9F0E091B8 :200EC0007E01F0917F01E25CFE4F8083D0937F01C0937E01C0917E01D0917F012196CF73A5 :200EE000D0708091800190918101C817D90701F7DF91CF910895FC0180818E5F808380E803 :200F000065E971E042E450E00E94CC030895FC0181819081913A59F4813209F04CC080E08E :200F200062E071E047E050E00E94CC0342C0913209F041C0803239F482E091E067E070E04E :200F40000E94100436C0823209F035C08281809309018091020190910301A0910401B09173 :200F60000501805B9440A040B04019F58091090180FD12C087E797E7909301088093000841 :200F80002BE088E190E00FB6F894A895809360000FBE209360000DC088E10FB6F8948093F2 :200FA0006000109260000FBEA895109201081092000881E0089580E00895FC019181808165 :200FC000813A31F4913089F080E0933089F40DC0813269F49B3021F4828180930A0105C0B4 :200FE0009A3029F4828180930B0181E0089580E00895EF92FF920F931F938C01E62EDC0109 :20100000ED91FC910480F581E02D0995F82ED801ED91FC910680F781E02DC8016E2D099509 :201020008F2D90E01F910F91FF90EF90089510929001109294011092930182E291E09093F1 :201040009201809391010895EF92FF920F931F93DF93CF930F92CDB7DEB789838B017A01B4 :2010600084E0BE016F5F7F4F41E050E00E94530484E4B801A7010E9453040F90CF91DF9136 :201080001F910F91FF90EF90089582E048E050E00E9424080895FC011682178210861186D5 :2010A0001286138614823496BF010E9445080895DC01683810F0685829C0E62FF0E067FFE2 :2010C00013C0E058F04081E090E002C0880F991FEA95E2F7809514962C911497282314967F :2010E0002C93149760E012C0EB5AFD4F6491662319F420E030E01DC067FF08C014968C9176 :2011000014978D7F14968C9314976F77FD0190E0662321F08681861709F416829F5F3196B8 :201120009630B1F7CD011496BD010E94450821E030E0C9010895CF93DF93DC01683810F053 :20114000685825C0E62FF0E067FF12C0E058F04081E090E002C0880F991FEA95E2F7149681 :201160002C911497282B14962C93149760E00FC0EB5AFD4F64916623D9F167FF08C01496E0 :201180008C911497826014968C9314976F7716968C9116978617A9F117968C911797861789 :2011A00081F118968C911897861759F119968C911997861731F11A968C911A97861709F10C :2011C0001B968C911B978617E1F0ED01E0E0F0E09E2F8E81882321F4EA0FFB1F668306C045 :2011E0009F5F31962196E630F10591F7963049F481E090E013969C938E93129720E030E059 :2012000007C0CD011496BD010E94450821E030E0C901DF91CF91089580E867ED71E045E662 :2012200050E00E94CC030895FC0180818F5F808380E86CE372E049E150E00E94CC03089510 :20124000CF92DF92EF92FF920F931F93CF93DF937C016B018A01C0E0D0E00FC0D6016D911A :201260006D01D701ED91FC910190F081E02DC7010995C80FD91F015010400115110571F7A4 :20128000CE01DF91CF911F910F91FF90EF90DF90CF900895EE0FFF1F0590F491E02D099407 :2012A000F894FFCF0D0000E100000000000001010000000029072009C806EF06D606510794 :2012C000550700000000F90720099B0858084B08FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :2012E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :20130000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :20132000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20134000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20136000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20138000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :2013A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :2013C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2013E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :20140000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :20142000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20144000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20146000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20148000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :2014A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :2014C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2014E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :20150000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :20152000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20154000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20156000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20158000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :2015A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :2015C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2015E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :20160000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :20162000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20164000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20166000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20168000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :2016A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :2016C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2016E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :20170000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :20172000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20174000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20176000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20178000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :2017A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :2017C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2017E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :20180000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :20182000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20184000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20186000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20188000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :2018A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :2018C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2018E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :20190000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :20192000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :20194000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20196000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20198000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :2019A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :2019C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2019E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :201A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :201A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :201A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :201A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :201A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :201AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :201AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :201AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :201B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :201B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :201B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :201B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :201B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :201BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :201BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :201BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :201C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :201C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :201C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :201C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :201C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :201CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :201CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :201CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :201D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :201D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :201D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :201D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :201D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :201DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :201DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :201DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :201E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :201E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :201E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :201E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :201E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :201EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :201EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :201EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :201F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :201F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :201F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :201F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :201F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :201FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :201FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :201FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :20200000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :20202000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20204000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20206000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20208000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :2020A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :2020C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2020E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :20210000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :20212000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20214000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20216000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20218000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :2021A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :2021C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2021E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :20220000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :20222000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20224000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20226000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20228000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :2022A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :2022C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2022E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :20230000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :20232000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20234000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20236000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20238000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :2023A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :2023C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2023E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :20240000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :20242000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20244000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20246000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20248000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :2024A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :2024C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2024E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :20250000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :20252000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20254000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20256000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20258000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :2025A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :2025C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2025E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :20260000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :20262000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20264000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20266000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20268000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :2026A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :2026C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2026E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :20270000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :20272000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20274000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20276000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20278000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :2027A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :2027C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2027E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :20280000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :20282000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20284000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20286000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20288000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :2028A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :2028C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2028E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :20290000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :20292000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :20294000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20296000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20298000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :2029A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :2029C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2029E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :202A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :202A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :202A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :202A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :202A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :202AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :202AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :202AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :202B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :202B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :202B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :202B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :202B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :202BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :202BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :202BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :202C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :202C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :202C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :202C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :202C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :202CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :202CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :202CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :202D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :202D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :202D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :202D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :202D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :202DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :202DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :202DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :202E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :202E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :202E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :202E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :202E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :202EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :202EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :202EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :202F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :202F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :202F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :202F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :202F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :202FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :202FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :202FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :20300000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 :20302000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 :20304000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 :20306000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 :20308000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 :2030A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 :2030C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 :2030E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 :20310000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF :20312000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF :20314000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F :20316000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F :20318000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F :2031A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F :2031C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F :2031E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF :20320000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE :20322000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE :20324000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E :20326000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E :20328000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E :2032A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E :2032C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :2032E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE :20330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20332000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20334000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20336000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :20338000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :2033A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2033C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :2033E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :20340000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20342000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20344000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20346000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :20348000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :2034A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2034C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :2034E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :20350000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20352000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20354000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20356000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :20358000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :2035A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2035C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :2035E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :20360000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20362000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20364000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20366000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :20368000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :2036A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2036C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :2036E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :20370000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20372000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20374000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20376000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :20378000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :2037A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2037C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :2037E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :20380000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20382000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20384000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20386000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :20388000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :2038A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2038C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :2038E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :20390000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :20392000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20394000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20396000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :20398000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :2039A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2039C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :2039E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :203A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :203A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :203A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :203A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :203A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :203AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :203AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :203AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :203B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :203B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :203B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :203B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :203B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :203BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :203BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :203BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :203C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :203C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :203C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :203C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :203C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :203CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :203CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :203CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :203D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :203D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :203D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :203D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :203D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :203DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :203DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :203DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :203E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :203E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :203E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :203E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :203E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :203EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :203EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :203EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :203F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :203F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :203F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :203F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :203F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :203FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :203FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :203FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :20400000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20402000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20404000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20406000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :20408000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :2040A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2040C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :2040E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :20410000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20412000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20414000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20416000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :20418000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :2041A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2041C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :2041E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :20420000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20422000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20424000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20426000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :20428000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :2042A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2042C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :2042E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :20430000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20432000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20434000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20436000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :20438000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :2043A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2043C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :2043E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :20440000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20442000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20444000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20446000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :20448000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :2044A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2044C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :2044E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :20450000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20452000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20454000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20456000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :20458000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :2045A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2045C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :2045E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :20460000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20462000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20464000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20466000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :20468000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :2046A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2046C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :2046E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :20470000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20472000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20474000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20476000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :20478000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :2047A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2047C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :2047E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :20480000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20482000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20484000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20486000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :20488000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :2048A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2048C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :2048E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :20490000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :20492000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20494000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20496000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :20498000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :2049A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2049C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :2049E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :204A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :204A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :204A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :204A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :204A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :204AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :204AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :204AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :204B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :204B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :204B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :204B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :204B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :204BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :204BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :204BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :204C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :204C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :204C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :204C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :204C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :204CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :204CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :204CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :204D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :204D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :204D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :204D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :204D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :204DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :204DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :204DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :204E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :204E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :204E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :204E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :204E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :204EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :204EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :204EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :204F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :204F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :204F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :204F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :204F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :204FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :204FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :204FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :20500000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 :20502000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 :20504000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 :20506000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 :20508000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 :2050A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 :2050C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 :2050E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 :20510000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF :20512000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F :20514000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F :20516000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F :20518000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F :2051A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F :2051C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF :2051E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF :20520000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE :20522000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E :20524000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E :20526000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E :20528000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E :2052A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :2052C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE :2052E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE :20530000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20532000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20534000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :20536000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :20538000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2053A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :2053C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :2053E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20540000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20542000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20544000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :20546000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :20548000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2054A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :2054C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :2054E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20550000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20552000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20554000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :20556000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :20558000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2055A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :2055C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :2055E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20560000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20562000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20564000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :20566000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :20568000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2056A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :2056C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :2056E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20570000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20572000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20574000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :20576000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :20578000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2057A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :2057C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :2057E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20580000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20582000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20584000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :20586000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :20588000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2058A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :2058C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :2058E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20590000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20592000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20594000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :20596000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :20598000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2059A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :2059C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :2059E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :205A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :205A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :205A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :205A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :205A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :205AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :205AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :205AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :205B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :205B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :205B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :205B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :205B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :205BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :205BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :205BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :205C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :205C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :205C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :205C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :205C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :205CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :205CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :205CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :205D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :205D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :205D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :205D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :205D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :205DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :205DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :205DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :205E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :205E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :205E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :205E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :205E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :205EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :205EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :205EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :205F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :205F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :205F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :205F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :205F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :205FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :205FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :205FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :20600000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20602000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20604000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :20606000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :20608000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2060A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :2060C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :2060E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20610000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20612000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20614000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :20616000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :20618000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2061A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :2061C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :2061E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20620000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20622000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20624000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :20626000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :20628000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2062A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :2062C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :2062E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20630000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20632000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20634000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :20636000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :20638000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2063A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :2063C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :2063E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20640000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20642000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20644000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :20646000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :20648000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2064A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :2064C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :2064E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20650000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20652000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20654000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :20656000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :20658000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2065A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :2065C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :2065E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20660000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20662000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20664000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :20666000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :20668000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2066A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :2066C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :2066E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20670000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20672000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20674000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :20676000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :20678000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2067A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :2067C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :2067E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20680000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20682000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20684000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :20686000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :20688000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2068A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :2068C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :2068E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20690000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20692000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20694000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :20696000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :20698000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2069A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :2069C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :2069E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :206A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :206A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :206A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :206A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :206A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :206AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :206AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :206AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :206B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :206B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :206B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :206B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :206B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :206BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :206BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :206BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :206C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :206C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :206C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :206C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :206C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :206CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :206CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :206CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :206D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :206D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :206D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :206D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :206D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :206DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :206DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :206DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :206E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :206E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :206E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :206E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :206E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :206EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :206EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :206EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :206F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :206F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :206F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :206F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :206F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :206FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :206FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :206FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :2070000055C000006EC000006CC000006AC0000068C0000066C0000064C0000062C0000043 :2070200060C000005EC00000EEC400005AC0000058C0000056C0000054C0000052C00000F2 :2070400050C0000078C000004CC000004AC0000048C0000046C0000044C0000042C00000BE :2070600040C000003EC000003CC000003AC0000038C0000036C0000034C0000032C0000048 :2070800030C000002EC000002CC000002AC0000028C0000026C0000024C0000022C00000A8 :2070A00020C000001EC000001CC0000011241FBECFEFDAE0DEBFCDBF11E0A0E0B1E0EAE2B5 :2070C000FFE702C005900D92A83AB107D9F711E0A8EAB1E001C01D92AE3BB107E1F78FD30B :2070E00022C78ECFF89410926F0010928100109285001092840081E085BF15BE47985D98F1 :2071000028980C94000008952091B2013091B3012F5F3F4F3093B3012093B201932F37FFA8 :2071200003C08EEF831B982F990F921710F447980895479A08951F920F920FB60F9211246E :207140002F938F939F93EF93FF9310928500109284008091A8019091A901009741F00197D3 :207160009093A9018093A801892B09F45D988091AA019091AB01009741F001979093AB0128 :207180008093AA01892B09F42898E0E0F0E0859194918F5F9F4F49F08091AC019091AD0153 :2071A00001969093AD018093AC01FF91EF919F918F912F910F900FBE0F901F90189584E0BC :2071C0008093E9000DC08091E8008B778093E80003C08EB3882351F08091E80082FFF9CFBE :2071E0008091E80085FFEFCF8091F1000895982F83E08093E9008091E80085FD0DC0809136 :20720000E8008E778093E80003C08EB3882369F08091E80080FFF9CF9093F1005D9A84E6C9 :2072200090E09093A9018093A80108954F925F926F927F928F929F92AF92BF92CF92DF921E :20724000EF92FF920F931F93CF93DF9384E08093E9008091E80082FF57C2289A84E690E065 :207260009093AB018093AA01AADF182F853481F48CE49DE19093AD018093AC0107B600FC4B :20728000FDCFF999FECF81E180935700E89503C0843519F494DF8DE00DC28C34E1F38035F9 :2072A000D1F3843721F484E4A2DF80E003C2813611F489E5FFC18134B1F481DF182F7FDFE3 :2072C00090E0880F991FAA2797FDA095BA2F312F330F20E0442737FD4095542F822B932B68 :2072E000A42BB52BB8C1803711F483E5E3C1833549F4C0E0D1E089917ADF21E0C730D20714 :20730000D1F7D9C1863521F481E371DF80E3D2C1833731F487E86BDF85E969DF8EE1CAC149 :207320008536B9F4E0E0F0E093E085E090935700E89507B600FCFDCF80935700E89507B65D :2073400000FCFDCFE058FF4FA0E7E030FA0771F7A2CF823739F4E1E0F0E089E08093570024 :207360008491A8C1863439F4E0E0F0E089E08093570084919FC18E3439F4E3E0F0E089E0E5 :2073800080935700849196C1813539F4E2E0F0E089E08093570084918DC1823631F489E521 :2073A00026DF80E024DF80E885C1823419F0873609F0E5C01092AD011092AC0100DF082FE8 :2073C000FEDEF82EFCDE682E8554823008F071C1902F80E0CF2DD0E0C82BD92B10926F00B3 :2073E000173609F04BC081E180935700E895DD24CC24C3943FC0E090AE01F090AF010091CC :20740000B0011091B101B6E46B16D9F4ED2DF0E0EE29FF29E4918E2FEADEDD2081F082E08D :2074200090E0A0E0B0E0E80EF91E0A1F1B1FE092AE01F092AF010093B0011093B101DC2470 :2074400018C0D801C701B695A7959795879555D5CEDE82E090E0A0E0B0E0E80EF91E0A1FF6 :207460001B1FE092AE01F092AF010093B0011093B1012197209709F0BECF7DC08090AE01F5 :207480009090AF01A090B001B090B10196E4691609F05DC083E0F40180935700E89507B63E :2074A00000FCFDCF54C0F6E46F1661F5772031F1E090AE01F090AF010091B0011091B1019E :2074C0007EDED82ECC24852D90E08C299D29F7010C0140925700E895112482E090E0A0E08B :2074E000B0E0E80EF91E0A1F1B1FE092AE01F092AF010093B0011093B10102C060DE582E1A :20750000742423C0E090AE01F090AF010091B0011091B10116950795F794E79450DE682FFA :20752000C701F3D48091AE019091AF01A091B001B091B1010296A11DB11D8093AE0190934D :20754000AF01A093B001B093B101219704C05524772444244394209709F0A5CF96E46916B6 :2075600041F485E0F40180935700E89507B600FCFDCF8DE03CDE82E080936F009CC0833492 :2075800071F40091AE011091AF0119DE90E021E0F8010C0120935700E89511247CCE8336C8 :2075A00019F5E090AE01F090AF010091B0011091B10105DEF701E16090E021E00C0120938C :2075C0005700E895112482E090E0A0E0B0E0E80EF91E0A1F1B1FE092AE01F092AF0100936A :2075E000B0011093B10157CE8D3661F4E091AE01F091AF0185E080935700E89507B600FCF2 :20760000FDCF49CE823551F4E091AE01F091AF0105911491812FEBDD802F4CC0843421F5FE :20762000E090AE01F090AF010091B0011091B10116950795F794E794C2DD682FC70165D4E2 :207640008091AE019091AF01A091B001B091B1010296A11DB11D8093AE019093AF01A093D8 :20766000B001B093B10117CE843609F5E090AE01F090AF010091B0011091B101D801C70142 :20768000B695A7959795879538D4B1DD82E090E0A0E0B0E0E80EF91E0A1F1B1FE092AE010E :2076A000F092AF010093B0011093B10104C08B3111F08FE39CDD83E08093E9009091E8002B :2076C0008091E8008E778093E80095FF04C010C08EB38823C9F08091E80080FFF9CF809193 :2076E000E8008E778093E80003C08EB3882361F08091E80080FFF9CF84E08093E9008091F1 :20770000E8008B778093E800DF91CF911F910F91FF90EF90DF90CF90BF90AF909F908F90AC :207720007F906F905F904F9008959091B601892F8F77813249F58091B7018032A1F081328A :2077400019F5913A09F58091E800877F8093E8008DE091E067E070E007D28091E8008B770F :207760008093E8000895913279F48091E800877F8093E8008DE091E067E070E059D2809196 :20778000E8008E778093E800089582E061EC42E0B1D083E061E842E1ADD084E060E842E1F7 :2077A000A9C084B7877F84BF88E10FB6F89480936000109260000FBE20E880E090E00FB643 :2077C000F89420936100809361000FBE81E085BF92E095BF3F9A209A559AE1E6F0E02083A1 :2077E000108247985D982898109289008AEF8093880090936F0083E080938100ECC040911E :20780000000850910108109201081092000824B714BE88E10FB6F894809360001092600045 :207820000FBE822F90E0FC01E270F07021FD14C0213019F4859194910BC0283069F480918F :20784000090190910A014817590731F0859194918F5F9F4F09F046DCA4DF78941092AD0101 :207860001092AC010CC0E2DC36D38091AC019091AD0181549F4110F01092140145DC8091FB :207880001401882381F78091E00081608093E00029DC80E090E00895FA01923049F09330C0 :2078A00061F09130F9F485E191E022E130E01EC087E291E02EE330E019C0882329F485E6FA :2078C00091E024E030E012C0813029F489E691E022E230E00BC0823029F48DE891E028E106 :2078E00030E004C080E090E020E030E091838083C90108958093E9008091EB00816080936A :20790000EB001092ED006093EC004093ED008091EE00881F8827881F08958091B601882342 :207920008CF403C08EB38823B1F08091E80082FFF9CF8091E8008B778093E80008958EB361 :20794000882349F08091E80080FFF9CF8091E8008E778093E8000895EF92FF920F931F9307 :2079600045D04CD008ED10E0F80180818F77808380818068808380818F7D808319BC1EBA45 :207980001092B40180EEE82EF12CF70180818B7F8083F80180818160808380E060E042E049 :2079A000A9DFE1EEF0E080818E7F8083E2EEF0E0808181608083808188608083F701808125 :2079C0008E7F8083F8018081806180831F910F91FF90EF900895E7EDF0E080818160808335 :2079E0008AE482BF81E08093B501B6CFE8EDF0E080818E7F80831092E20008951092DA00D6 :207A00001092E10008951F920F920FB60F9211242F933F934F935F936F937F938F939F9389 :207A2000AF93BF93EF93FF938091DA0080FF1BC08091D80080FF17C08091DA008E7F80930F :207A4000DA008091D90080FF0BC080E189BD82E189BD09B400FEFDCF81E08EBB3BD203C0C7 :207A600019BC1EBA37D28091E10080FF17C08091E20080FF13C08091E2008E7F8093E200CE :207A80008091E20080618093E2008091D80080628093D80019BC85E08EBB1CD28091E10004 :207AA00084FF2CC08091E20084FF28C080E189BD82E189BD09B400FEFDCF8091D8008F7D2D :207AC0008093D8008091E1008F7E8093E1008091E2008F7E8093E2008091E20081608093EC :207AE000E2008091B401882331F48091E30087FD02C081E001C084E08EBBECD18091E10056 :207B000083FF21C08091E20083FF1DC08091E100877F8093E10082E08EBB1092B4018091B1 :207B2000E1008E7F8093E1008091E2008E7F8093E2008091E20080618093E20080E060E005 :207B400042E0D8DEC7D1FF91EF91BF91AF919F918F917F916F915F914F913F912F910F90B6 :207B60000FBE0F901F9018959C014091BC015091BD014617570718F4F90190E044C06115C8 :207B8000710511F0AB01F8CF8091E8008E778093E80040E050E0F0CF8EB3882309F444C006 :207BA000853009F443C08091E80083FF02C081E008958091E80082FD31C08091E80080FFF4 :207BC00022C08091F3009091F200782F60E0292F30E0262B372B07C081918093F10041503C :207BE00050402F5F3F4F4115510519F02830310598F390E02830310509F491E08091E800A6 :207C00008E778093E8004115510531F6992321F605C08EB3882341F0853041F08091E800FD :207C200082FFF7CF80E0089582E0089583E008959C016115710529F48091E8008B7780934D :207C4000E800F90126C08EB3882391F1853091F18091E80083FF02C081E008958091E80083 :207C600082FFF1CF06C08091F10081936150704059F02091F3008091F200322F20E090E0C5 :207C8000822B932B892B79F78091E8008B778093E80061157105B9F605C08EB3882341F0E2 :207CA000853041F08091E80080FFF7CF80E0089582E0089583E008950F931F93DF93CF937C :207CC00000D0CDB7DEB7E6EBF1E08091F100819381E0EE3BF807C9F728DD8091E80083FF3A :207CE000E4C08091B6019091B701953009F46DC0963040F4913081F1913070F0933009F046 :207D0000D4C02AC0983009F4A3C0993009F4B2C0963009F0CAC07CC0803809F4C6C082380B :207D200009F0C3C08091BA0187708093E9008091EB001092E9002091E800277F2093E800A7 :207D400090E025E0969587952A95E1F781708093F1001092F10087C0882319F0823009F0A2 :207D6000A4C08F71823009F0A0C08091B801882331F52091BA01277009F497C02093E90006 :207D80008091EB0080FF1BC0933021F48091EB00806213C08091EB0080618093EB0081E0C8 :207DA00090E002C0880F991F2A95E2F78093EA001092EA008091EB0088608093EB0010929D :207DC000E9008091E800877F51C0882309F06DC01091B8011F770FB7F8948091E800877F98 :207DE0008093E8009ADD8091E80080FFFCCF8091E3008078812B8093E30080688093E30062 :207E0000112311F482E001C083E08EBB0FBF4DC08058823008F049C08091B8019091B9014F :207E20006091BA01AE014F5F5F4F36DDBC01009709F43BC08091E800877F8093E800898128 :207E40009A8192DE8091E8008B778093E8002DC0803859F58091E800877F8093E8008091A3 :207E6000B4018093F1008091E8008E778093E80054DD1BC08823C9F49091B8019230A8F4A4 :207E80008091E800877F8093E8009093B40145DD8091B401882331F48091E30087FD02C01E :207EA00081E001C084E08EBB70DC8091E80083FF0AC08091EB0080628093EB008091E8008D :207EC000877F8093E8000F900F90CF91DF911F910F91089508951F938EB3882361F0109179 :207EE000E9001092E9008091E80083FF01C0E4DE17701093E9001F910895F999FECF92BD02 :207F000081BDF89A992780B50895262FF999FECF1FBA92BD81BD20BD0FB6F894FA9AF99A90 :207F20000FBE01960895F894FFCF4341544552494E4100777700080000000000000801128E :207F4000011001020000084123370001000201000109023E00020100803209040000010257 :207F60000201000524001001042402040524060001070582030800FF09040100020A0000B4 :207F8000000705040210000107058302100001040309042203410072006400750069006E80 :207FA000006F0020004D006900630072006F00200020002000000018034100720064007531 :127FC0000069006E006F0020004C004C0043000000006E :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/caterina/Micro-prod-firmware-2012-11-23.txt ================================================ Builds against LUFA version 111009 make version 3.81 avrdude version 5.11 All AVR tools except avrdude were installed by CrossPack 20100115: avr-gcc version 4.3.3 (GCC) Thread model: single Configured with: ../configure —prefix=/usr/local/CrossPack-AVR-20100115 —disable-dependency-tracking —disable-nls —disable-werror —target=avr —enable-languages=c,c++ —disable-nls —disable-libssp —with-dwarf2 avr-libc version 1.6.7 binutils version 2.19 ================================================ FILE: external/arduino/avr/bootloaders/caterina/Micro-prod-firmware-2012-12-10.hex ================================================ :200000000C946E010C9496010C9496010C9496010C9496010C9496010C9496010C94960150 :200020000C9496010C9496010C94F8040C947F050C9496010C9496010C9496010C949601B6 :200040000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C94B501C9 :200060000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601C8 :200080000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601A8 :2000A0000C9496010C9496010C94960100000000240027002A002D003000000000002500A4 :2000C00028002B002E003100000000002300260029002C002F00040404040403040502027D :2000E0000202040302020202060606060606040402020204040802011040804010204080A8 :200100004080080204018040201002011080102040400000000200080E0000030401000BB2 :200120000000070605040100080A0B0C0D09040309042203410072006400750069006E00CD :200140006F0020004D006900630072006F00200020002000180341007200640075006900A6 :200160006E006F0020004C004C00430012010002000000404123378000010102000112011F :200180000002020000404123378000010102000100C18081C1080B00020202010009040051 :2001A000000102020000052400100105240101010424020605240600010705810310004094 :2001C00009040100020A000000070502024000000705830240000005010902A1010901A186 :2001E000008501050919012903150025019503750181029501750581030501093009310943 :20020000381581257F750895038106C0C005010906A1018502050719E029E715002501754D :20022000019508810295017508810395067508150025650507190029658100C0090402004C :2002400001030000000921010100012265000705840340000100000000000000002A2B2895 :200260000000000000000000000000000000000000000000002C9EB4A0A1A2A434A6A7A553 :20028000AE362D3738271E1F20212223242526B333B62EB7B89F8485868788898A8B8C8D58 :2002A0008E8F909192939495969798999A9B9C9D2F3130A3AD350405060708090A0B0C0D7C :2002C0000E0F101112131415161718191A1B1C1DAFB1B0B5000032041207170811241FBE81 :2002E000CFEFDAE0DEBFCDBF11E0A0E0B1E0E4EAF2E102C005900D92AC32B107D9F711E06D :20030000ACE2B1E001C01D92AD39B107E1F712E0CCEDD2E004C02297FE010E944C09C63D05 :20032000D107C9F70E946C030C9450090C9400008091000161E00E94390368EE73E080E041 :2003400090E00E94FD018091000160E00E94390368EE73E080E090E00E94FD010895809196 :20036000000161E00E94AC0208951F920F920FB60F9211242F933F938F939F93AF93BF93E5 :200380008091300190913101A0913201B0913301309134010196A11DB11D232F2D5F2D3794 :2003A00020F02D570196A11DB11D209334018093300190933101A0933201B0933301809117 :2003C0002C0190912D01A0912E01B0912F010196A11DB11D80932C0190932D01A0932E01BA :2003E000B0932F01BF91AF919F918F913F912F910F900FBE0F901F9018959B01AC017FB734 :20040000F89480912C0190912D01A0912E01B0912F0166B5A89B05C06F3F19F00196A11DC3 :20042000B11D7FBFBA2FA92F982F8827860F911DA11DB11D62E0880F991FAA1FBB1F6A9577 :20044000D1F7BC012DC0FFB7F89480912C0190912D01A0912E01B0912F01E6B5A89B05C0E7 :20046000EF3F19F00196A11DB11DFFBFBA2FA92F982F88278E0F911DA11DB11DE2E0880FFD :20048000991FAA1FBB1FEA95D1F7861B970B885E9340C8F2215030404040504068517C4F8F :2004A000211531054105510571F60895789484B5826084BD84B5816084BD85B5826085BD0F :2004C00085B5816085BDEEE6F0E0808181608083E1E8F0E010828081826080838081816043 :2004E0008083E0E8F0E0808181608083E1E9F0E0808182608083808181608083E0E9F0E07E :20050000808181608083E1ECF0E0808184608083808182608083808181608083E3ECF0E007 :20052000808181608083E0ECF0E0808182608083E2ECF0E0808181608083EAE7F0E080812F :20054000846080838081826080838081816080838081806880830895CF93DF93482F50E0E5 :20056000CA018C509F4FFC0134914A525F4FFA018491882369F190E0880F991FFC01E455D0 :20058000FF4FA591B491FC01E654FF4FC591D491662351F42FB7F8948C91932F9095892362 :2005A0008C93888189230BC0623061F42FB7F8948C91932F909589238C938881832B8883B2 :2005C0002FBF06C09FB7F8948C91832B8C939FBFDF91CF910895883071F1893068F48230EF :2005E00031F1833020F4813009F042C01DC0833089F08430E9F512C08B3059F18C3028F41C :200600008930E9F08A30A1F51EC08C3031F18E3079F529C0809180008F7703C0809180003C :200620008F7D80938000089584B58F7702C084B58F7D84BD0895809190008F7707C08091DB :2006400090008F7D03C080919000877F8093900008958091C0008F7703C08091C0008F7DDD :200660008093C00008958091C200877F8093C2000895FF920F931F93F62E482F50E0CA0144 :200680008E5E9E4FFC012491CA018C509F4FFC0114914A525F4FFA0104910023C9F022239D :2006A00019F0822F0E94EB02E02FF0E0EE0FFF1FE654FF4FA591B4919FB7F894FF2021F4DE :2006C0008C911095812302C08C91812B8C939FBF1F910F91FF900895CF93DF930E94560262 :2006E0008DE391E00E9433040E94AF01C0E0D0E00E9498012097E1F30E940000F9CF282F17 :20070000809137018823C1F057FF1AC015C0289A909336018091F1008193E217F307B9F75A :200720004115510539F08091F200882319F48BE68093E800AFBF02C04FEF5FEFCA01089599 :20074000AFB7F89427702093E9008091F200282F30E0241735070CF4A901FB019B01240F1E :20076000311D94E6DACFDF93CF930F92CDB7DEB7BE016F5F7F4F41E050E00E947F03019712 :2007800019F02FEF3FEF03C08981282F30E0C9010F90CF91DF910895FF920F931F93F82EEF :2007A000142F052F40913A0150913B01212F302FC901DC01FB016EEF29C0F7FE02C0949125 :2007C00001C09081209138013091390124173507ACF48091E8008570E1F38091E80082FF0F :2007E00003C02FEF3FEF17C09093F100C90101968F739070892B11F46093E8002F5F3F4FEC :200800003093390120933801119731961097A9F6812F902F9C01C9011F910F91FF900895E8 :200820009C018091E80082FFFCCFF901260F311D03C08091F1008193E217F307D1F7289A03 :2008400084E6809336018BEF8093E800CB0108958093E9008091F200882319F08AE38093D3 :20086000E800089508951092370181E08093D70080EA8093D80082E189BD09B400FEFDCFAC :2008800061E070E080E090E00E94FD0180E98093D8008CE08093E2001092E000559A209A77 :2008A0005D98289808955F926F927F928F929F92AF92BF92CF92DF92EF92FF920F931F93C7 :2008C000CF93DF93E82E842E752E80913701882371F18B01242F352FC901EC017AEFF72EFB :2008E00067E0962E9E2050E4552E8E2D90E040E2A42EB12CA822B9223AE3632E20E4C22E35 :20090000D12CC822D92258C09FB7F8949092E9008091E80085FD02C020E004C08091F200EC :20092000252D281B9FBF222361F4FA9419F42FEF3FEF4DC061E070E080E090E00E94FD0135 :200940003BC0822F90E0C817D9070CF42C2FC21BD1094FB7F8949092E900A114B10421F48E :2009600006C01092F10021502223D9F719C0E7FC03C0F801922F10C0C801322F06C0FC01A2 :200980000196E491E093F10031503323C1F706C081918093F10091509923D1F7020F111DD8 :2009A0008091E80085FF05C0209729F4C114D10411F06092E8004FBF209709F0A5CF5D9A73 :2009C00084E680933501282D372DC9019C01C901DF91CF911F910F91FF90EF90DF90CF907E :2009E000BF90AF909F908F907F906F905F9008951F920F920FB60F9211242F933F934F931E :200A00005F936F937F938F939F93AF93BF93EF93FF938091E1001092E100982F83FF0FC047 :200A20001092E90081E08093EB001092EC0082E38093ED001092370188E08093F00092FF03 :200A400034C083E08093E9008091F200882319F08AE38093E8008FB7F89492E09093E900D4 :200A60009091F2008FBF992321F082E891E00E94550780913501882351F080913501815024 :200A80008093350180913501882309F45D9880913601882351F08091360181508093360192 :200AA00080913601882309F42898FF91EF91BF91AF919F918F917F916F915F914F913F91E6 :200AC0002F910F900FBE0F901F9018950F931F93DF93CF930F92CDB7DEB719828E010F5F75 :200AE0001F4FC8010E947B07C8010E941409898190E00F90CF91DF911F910F9108951F928C :200B00000F920FB60F921124EF92FF921F932F933F934F935F936F937F938F939F93AF93C3 :200B2000BF93EF93FF93DF93CF93CDB7DEB76197DEBFCDBF1092E9008091E80083FF0FC16B :200B4000FE0131969E01275F3F4F03C08091F1008193E217F307D1F7289A84E68093360112 :200B600082EF8093E800998197FF05C08091E80080FFFCCF03C08EEF8093E800292F30E0AE :200B8000C90180769070892B09F0C2C08A81882329F41092F1001092F100D6C0813009F429 :200BA000D3C0833009F4D0C0853049F48091E80080FFFCCF8B8180688093E300C5C0863008 :200BC00009F07CC01C81EF80F8841230C1F51092E900109239011092380110923B0110929E :200BE0003A010E94660599E0FE013996DF01292F1D922A95E9F799871A8791E09E8790E811 :200C0000988B9AEF998B2091380130913901275F3F4F3C872B878D871092E900109239011B :200C200010923801F0923B01E0923A0180E0BF0149E050E00E94CC030E94660585C0109290 :200C4000E9001092390110923801F0923B01E0923A01123241F482E290E00E940C09892BD1 :200C600009F476C071C0113079F488E0E816F10419F481E080933C0180913C01882309F057 :200C80006BC0ECE6F1E013C0133009F061C08B81882319F4EEE2F1E00AC0823019F4E2E3A3 :200CA000F1E005C0813009F053C0E4E5F1E0449180E8BF0150E00E94CC0346C0873009F4EF :200CC00047C0883021F481E08093F1003DC08930D9F523703070232BD9F5E1E9F1E091E0FC :200CE00031E026E39093E9003093EB0084918093EC002093ED009F5F3196953099F78EE7DD :200D00008093EA001092EA008B81809337011CC08F8198851092E9001092390110923801A8 :200D200090933B0180933A018D81882329F4CE0101960E94870706C0823051F4CE01019677 :200D40000E94DD07882321F08EEF8093E80007C081E28093EB0003C0EEE7F1E0A8CF6196DA :200D6000DEBFCDBFCF91DF91FF91EF91BF91AF919F918F917F916F915F914F913F912F911A :200D80001F91FF90EF900F900FBE0F901F90189520917E0130917F01809180019091810188 :200DA000281B390B2F733070C901089520917E0130917F01809180019091810128173907DE :200DC00019F42FEF3FEF09C0E0918001F0918101E25CFE4F8081282F30E0C90108952091F1 :200DE0007E0130917F0180918001909181012817390719F42FEF3FEF13C0E0918001F091E0 :200E00008101E25CFE4F2081809180019091810101968F739070909381018093800130E00D :200E2000C9010895109285011092840188EE93E0A0E0B0E08093860190938701A093880102 :200E4000B093890180E191E0909383018093820108950F931F93DF93CF930F92CDB7DEB737 :200E60008C01698380910901882369F083E0BE016F5F7F4F41E050E00E9453041816190685 :200E800014F49C0107C081E090E0F8019383828320E030E0C9010F90CF91DF911F910F9168 :200EA000089583E00E9428040895CF93DF9312C082E00E94B3032FEF8F3F9207C9F0E091B8 :200EC0007E01F0917F01E25CFE4F8083D0937F01C0937E01C0917E01D0917F012196CF73A5 :200EE000D0708091800190918101C817D90701F7DF91CF910895FC0180818E5F808380E803 :200F000065E971E042E450E00E94CC030895FC0181819081913A59F4813209F04CC080E08E :200F200062E071E047E050E00E94CC0342C0913209F041C0803239F482E091E067E070E04E :200F40000E94100436C0823209F035C08281809309018091020190910301A0910401B09173 :200F60000501805B9440A040B04019F58091090180FD12C087E797E7909301088093000841 :200F80002BE088E190E00FB6F894A895809360000FBE209360000DC088E10FB6F8948093F2 :200FA0006000109260000FBEA895109201081092000881E0089580E00895FC019181808165 :200FC000813A31F4913089F080E0933089F40DC0813269F49B3021F4828180930A0105C0B4 :200FE0009A3029F4828180930B0181E0089580E00895EF92FF920F931F938C01E62EDC0109 :20100000ED91FC910480F581E02D0995F82ED801ED91FC910680F781E02DC8016E2D099509 :201020008F2D90E01F910F91FF90EF90089510929001109294011092930182E291E09093F1 :201040009201809391010895EF92FF920F931F93DF93CF930F92CDB7DEB789838B017A01B4 :2010600084E0BE016F5F7F4F41E050E00E94530484E4B801A7010E9453040F90CF91DF9136 :201080001F910F91FF90EF90089582E048E050E00E9424080895FC011682178210861186D5 :2010A0001286138614823496BF010E9445080895DC01683810F0685829C0E62FF0E067FFE2 :2010C00013C0E058F04081E090E002C0880F991FEA95E2F7809514962C911497282314967F :2010E0002C93149760E012C0EB5AFD4F6491662319F420E030E01DC067FF08C014968C9176 :2011000014978D7F14968C9314976F77FD0190E0662321F08681861709F416829F5F3196B8 :201120009630B1F7CD011496BD010E94450821E030E0C9010895CF93DF93DC01683810F053 :20114000685825C0E62FF0E067FF12C0E058F04081E090E002C0880F991FEA95E2F7149681 :201160002C911497282B14962C93149760E00FC0EB5AFD4F64916623D9F167FF08C01496E0 :201180008C911497826014968C9314976F7716968C9116978617A9F117968C911797861789 :2011A00081F118968C911897861759F119968C911997861731F11A968C911A97861709F10C :2011C0001B968C911B978617E1F0ED01E0E0F0E09E2F8E81882321F4EA0FFB1F668306C045 :2011E0009F5F31962196E630F10591F7963049F481E090E013969C938E93129720E030E059 :2012000007C0CD011496BD010E94450821E030E0C901DF91CF91089580E867ED71E045E662 :2012200050E00E94CC030895FC0180818F5F808380E86CE372E049E150E00E94CC03089510 :20124000CF92DF92EF92FF920F931F93CF93DF937C016B018A01C0E0D0E00FC0D6016D911A :201260006D01D701ED91FC910190F081E02DC7010995C80FD91F015010400115110571F7A4 :20128000CE01DF91CF911F910F91FF90EF90DF90CF900895EE0FFF1F0590F491E02D099407 :2012A000F894FFCF0D0000E100000000000001010000000029072009C806EF06D606510794 :2012C000550700000000F90720099B0858084B08FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :2012E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :20130000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :20132000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20134000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20136000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20138000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :2013A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :2013C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2013E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :20140000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :20142000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20144000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20146000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20148000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :2014A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :2014C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2014E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :20150000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :20152000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20154000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20156000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20158000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :2015A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :2015C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2015E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :20160000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :20162000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20164000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20166000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20168000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :2016A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :2016C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2016E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :20170000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :20172000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20174000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20176000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20178000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :2017A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :2017C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2017E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :20180000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :20182000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20184000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20186000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20188000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :2018A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :2018C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2018E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :20190000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :20192000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :20194000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20196000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20198000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :2019A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :2019C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2019E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :201A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :201A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :201A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :201A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :201A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :201AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :201AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :201AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :201B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :201B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :201B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :201B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :201B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :201BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :201BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :201BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :201C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :201C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :201C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :201C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :201C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :201CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :201CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :201CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :201D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :201D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :201D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :201D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :201D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :201DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :201DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :201DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :201E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :201E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :201E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :201E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :201E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :201EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :201EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :201EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :201F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :201F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :201F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :201F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :201F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :201FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :201FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :201FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :20200000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :20202000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20204000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20206000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20208000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :2020A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :2020C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2020E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :20210000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :20212000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20214000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20216000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20218000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :2021A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :2021C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2021E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :20220000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :20222000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20224000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20226000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20228000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :2022A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :2022C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2022E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :20230000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :20232000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20234000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20236000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20238000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :2023A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :2023C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2023E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :20240000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :20242000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20244000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20246000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20248000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :2024A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :2024C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2024E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :20250000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :20252000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20254000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20256000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20258000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :2025A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :2025C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2025E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :20260000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :20262000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20264000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20266000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20268000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :2026A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :2026C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2026E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :20270000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :20272000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20274000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20276000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20278000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :2027A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :2027C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2027E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :20280000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :20282000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20284000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20286000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20288000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :2028A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :2028C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2028E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :20290000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :20292000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :20294000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20296000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20298000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :2029A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :2029C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2029E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :202A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :202A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :202A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :202A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :202A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :202AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :202AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :202AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :202B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :202B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :202B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :202B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :202B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :202BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :202BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :202BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :202C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :202C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :202C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :202C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :202C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :202CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :202CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :202CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :202D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :202D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :202D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :202D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :202D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :202DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :202DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :202DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :202E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :202E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :202E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :202E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :202E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :202EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :202EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :202EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :202F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :202F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :202F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :202F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :202F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :202FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :202FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :202FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :20300000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 :20302000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 :20304000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 :20306000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 :20308000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 :2030A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 :2030C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 :2030E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 :20310000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF :20312000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF :20314000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F :20316000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F :20318000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F :2031A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F :2031C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F :2031E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF :20320000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE :20322000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE :20324000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E :20326000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E :20328000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E :2032A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E :2032C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :2032E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE :20330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20332000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20334000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20336000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :20338000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :2033A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2033C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :2033E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :20340000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20342000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20344000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20346000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :20348000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :2034A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2034C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :2034E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :20350000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20352000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20354000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20356000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :20358000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :2035A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2035C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :2035E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :20360000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20362000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20364000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20366000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :20368000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :2036A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2036C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :2036E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :20370000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20372000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20374000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20376000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :20378000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :2037A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2037C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :2037E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :20380000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20382000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20384000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20386000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :20388000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :2038A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2038C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :2038E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :20390000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :20392000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20394000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20396000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :20398000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :2039A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2039C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :2039E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :203A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :203A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :203A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :203A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :203A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :203AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :203AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :203AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :203B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :203B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :203B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :203B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :203B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :203BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :203BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :203BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :203C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :203C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :203C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :203C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :203C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :203CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :203CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :203CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :203D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :203D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :203D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :203D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :203D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :203DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :203DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :203DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :203E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :203E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :203E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :203E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :203E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :203EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :203EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :203EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :203F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :203F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :203F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :203F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :203F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :203FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :203FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :203FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :20400000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20402000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20404000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20406000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :20408000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :2040A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2040C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :2040E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :20410000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20412000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20414000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20416000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :20418000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :2041A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2041C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :2041E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :20420000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20422000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20424000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20426000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :20428000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :2042A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2042C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :2042E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :20430000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20432000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20434000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20436000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :20438000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :2043A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2043C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :2043E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :20440000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20442000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20444000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20446000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :20448000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :2044A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2044C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :2044E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :20450000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20452000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20454000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20456000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :20458000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :2045A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2045C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :2045E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :20460000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20462000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20464000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20466000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :20468000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :2046A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2046C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :2046E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :20470000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20472000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20474000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20476000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :20478000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :2047A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2047C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :2047E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :20480000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20482000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20484000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20486000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :20488000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :2048A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2048C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :2048E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :20490000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :20492000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20494000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20496000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :20498000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :2049A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2049C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :2049E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :204A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :204A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :204A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :204A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :204A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :204AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :204AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :204AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :204B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :204B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :204B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :204B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :204B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :204BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :204BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :204BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :204C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :204C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :204C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :204C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :204C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :204CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :204CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :204CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :204D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :204D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :204D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :204D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :204D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :204DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :204DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :204DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :204E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :204E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :204E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :204E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :204E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :204EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :204EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :204EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :204F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :204F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :204F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :204F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :204F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :204FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :204FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :204FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :20500000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 :20502000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 :20504000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 :20506000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 :20508000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 :2050A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 :2050C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 :2050E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 :20510000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF :20512000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F :20514000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F :20516000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F :20518000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F :2051A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F :2051C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF :2051E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF :20520000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE :20522000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E :20524000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E :20526000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E :20528000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E :2052A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :2052C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE :2052E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE :20530000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20532000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20534000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :20536000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :20538000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2053A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :2053C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :2053E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20540000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20542000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20544000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :20546000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :20548000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2054A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :2054C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :2054E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20550000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20552000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20554000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :20556000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :20558000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2055A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :2055C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :2055E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20560000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20562000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20564000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :20566000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :20568000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2056A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :2056C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :2056E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20570000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20572000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20574000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :20576000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :20578000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2057A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :2057C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :2057E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20580000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20582000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20584000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :20586000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :20588000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2058A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :2058C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :2058E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20590000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20592000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20594000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :20596000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :20598000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2059A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :2059C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :2059E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :205A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :205A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :205A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :205A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :205A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :205AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :205AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :205AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :205B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :205B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :205B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :205B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :205B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :205BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :205BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :205BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :205C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :205C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :205C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :205C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :205C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :205CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :205CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :205CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :205D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :205D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :205D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :205D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :205D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :205DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :205DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :205DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :205E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :205E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :205E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :205E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :205E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :205EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :205EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :205EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :205F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :205F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :205F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :205F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :205F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :205FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :205FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :205FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :20600000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20602000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20604000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :20606000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :20608000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2060A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :2060C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :2060E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20610000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20612000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20614000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :20616000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :20618000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2061A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :2061C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :2061E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20620000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20622000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20624000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :20626000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :20628000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2062A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :2062C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :2062E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20630000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20632000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20634000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :20636000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :20638000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2063A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :2063C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :2063E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20640000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20642000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20644000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :20646000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :20648000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2064A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :2064C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :2064E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20650000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20652000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20654000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :20656000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :20658000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2065A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :2065C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :2065E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20660000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20662000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20664000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :20666000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :20668000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2066A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :2066C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :2066E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20670000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20672000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20674000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :20676000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :20678000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2067A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :2067C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :2067E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20680000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20682000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20684000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :20686000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :20688000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2068A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :2068C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :2068E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20690000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20692000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20694000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :20696000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :20698000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2069A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :2069C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :2069E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :206A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :206A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :206A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :206A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :206A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :206AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :206AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :206AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :206B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :206B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :206B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :206B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :206B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :206BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :206BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :206BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :206C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :206C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :206C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :206C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :206C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :206CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :206CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :206CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :206D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :206D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :206D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :206D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :206D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :206DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :206DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :206DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :206E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :206E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :206E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :206E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :206E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :206EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :206EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :206EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :206F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :206F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :206F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :206F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :206F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :206FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :206FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :206FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :2070000055C000006EC000006CC000006AC0000068C0000066C0000064C0000062C0000043 :2070200060C000005EC00000F2C400005AC0000058C0000056C0000054C0000052C00000EE :2070400050C0000078C000004CC000004AC0000048C0000046C0000044C0000042C00000BE :2070600040C000003EC000003CC000003AC0000038C0000036C0000034C0000032C0000048 :2070800030C000002EC000002CC000002AC0000028C0000026C0000024C0000022C00000A8 :2070A00020C000001EC000001CC0000011241FBECFEFDAE0DEBFCDBF11E0A0E0B1E0E2E3BC :2070C000FFE702C005900D92A83AB107D9F711E0A8EAB1E001C01D92AE3BB107E1F78FD30B :2070E00026C78ECFF89410926F0010928100109285001092840081E085BF15BE47985D98ED :2071000028980C94000008952091B2013091B3012F5F3F4F3093B3012093B201932F37FFA8 :2071200003C08EEF831B982F990F921710F447980895479A08951F920F920FB60F9211246E :207140002F938F939F93EF93FF9310928500109284008091A8019091A901009741F00197D3 :207160009093A9018093A801892B09F45D988091AA019091AB01009741F001979093AB0128 :207180008093AA01892B09F42898E0E0F0E0859194918F5F9F4F49F08091AC019091AD0153 :2071A00001969093AD018093AC01FF91EF919F918F912F910F900FBE0F901F90189584E0BC :2071C0008093E9000DC08091E8008B778093E80003C08EB3882351F08091E80082FFF9CFBE :2071E0008091E80085FFEFCF8091F1000895982F83E08093E9008091E80085FD0DC0809136 :20720000E8008E778093E80003C08EB3882369F08091E80080FFF9CF9093F1005D9A84E6C9 :2072200090E09093A9018093A80108954F925F926F927F928F929F92AF92BF92CF92DF921E :20724000EF92FF920F931F93CF93DF9384E08093E9008091E80082FF57C2289A84E690E065 :207260009093AB018093AA01AADF182F853481F48CE49DE19093AD018093AC0107B600FC4B :20728000FDCFF999FECF81E180935700E89503C0843519F494DF8DE00DC28C34E1F38035F9 :2072A000D1F3843721F484E4A2DF80E003C2813611F489E5FFC18134B1F481DF182F7FDFE3 :2072C00090E0880F991FAA2797FDA095BA2F312F330F20E0442737FD4095542F822B932B68 :2072E000A42BB52BB8C1803711F483E5E3C1833549F4C0E0D1E089917ADF21E0C730D20714 :20730000D1F7D9C1863521F481E371DF80E3D2C1833731F487E86BDF85E969DF8EE1CAC149 :207320008536B9F4E0E0F0E093E085E090935700E89507B600FCFDCF80935700E89507B65D :2073400000FCFDCFE058FF4FA0E7E030FA0771F7A2CF823739F4E1E0F0E089E08093570024 :207360008491A8C1863439F4E0E0F0E089E08093570084919FC18E3439F4E3E0F0E089E0E5 :2073800080935700849196C1813539F4E2E0F0E089E08093570084918DC1823631F489E521 :2073A00026DF80E024DF80E885C1823419F0873609F0E5C01092AD011092AC0100DF082FE8 :2073C000FEDEF82EFCDE682E8554823008F071C1902F80E0CF2DD0E0C82BD92B10926F00B3 :2073E000173609F04BC081E180935700E895DD24CC24C3943FC0E090AE01F090AF010091CC :20740000B0011091B101B6E46B16D9F4ED2DF0E0EE29FF29E4918E2FEADEDD2081F082E08D :2074200090E0A0E0B0E0E80EF91E0A1F1B1FE092AE01F092AF010093B0011093B101DC2470 :2074400018C0D801C701B695A7959795879559D5CEDE82E090E0A0E0B0E0E80EF91E0A1FF2 :207460001B1FE092AE01F092AF010093B0011093B1012197209709F0BECF7DC08090AE01F5 :207480009090AF01A090B001B090B10196E4691609F05DC083E0F40180935700E89507B63E :2074A00000FCFDCF54C0F6E46F1661F5772031F1E090AE01F090AF010091B0011091B1019E :2074C0007EDED82ECC24852D90E08C299D29F7010C0140925700E895112482E090E0A0E08B :2074E000B0E0E80EF91E0A1F1B1FE092AE01F092AF010093B0011093B10102C060DE582E1A :20750000742423C0E090AE01F090AF010091B0011091B10116950795F794E79450DE682FFA :20752000C701F7D48091AE019091AF01A091B001B091B1010296A11DB11D8093AE01909349 :20754000AF01A093B001B093B101219704C05524772444244394209709F0A5CF96E46916B6 :2075600041F485E0F40180935700E89507B600FCFDCF8DE03CDE82E080936F009CC0833492 :2075800071F40091AE011091AF0119DE90E021E0F8010C0120935700E89511247CCE8336C8 :2075A00019F5E090AE01F090AF010091B0011091B10105DEF701E16090E021E00C0120938C :2075C0005700E895112482E090E0A0E0B0E0E80EF91E0A1F1B1FE092AE01F092AF0100936A :2075E000B0011093B10157CE8D3661F4E091AE01F091AF0185E080935700E89507B600FCF2 :20760000FDCF49CE823551F4E091AE01F091AF0105911491812FEBDD802F4CC0843421F5FE :20762000E090AE01F090AF010091B0011091B10116950795F794E794C2DD682FC70169D4DE :207640008091AE019091AF01A091B001B091B1010296A11DB11D8093AE019093AF01A093D8 :20766000B001B093B10117CE843609F5E090AE01F090AF010091B0011091B101D801C70142 :20768000B695A795979587953CD4B1DD82E090E0A0E0B0E0E80EF91E0A1F1B1FE092AE010A :2076A000F092AF010093B0011093B10104C08B3111F08FE39CDD83E08093E9009091E8002B :2076C0008091E8008E778093E80095FF04C010C08EB38823C9F08091E80080FFF9CF809193 :2076E000E8008E778093E80003C08EB3882361F08091E80080FFF9CF84E08093E9008091F1 :20770000E8008B778093E800DF91CF911F910F91FF90EF90DF90CF90BF90AF909F908F90AC :207720007F906F905F904F9008959091B601892F8F77813249F58091B7018032A1F081328A :2077400019F5913A09F58091E800877F8093E8008DE091E067E070E00BD28091E8008B770B :207760008093E8000895913279F48091E800877F8093E8008DE091E067E070E05DD2809192 :20778000E8008E778093E800089582E061EC42E0B5D083E061E842E1B1D084E060E842E1EF :2077A000ADC084B7877F84BF88E10FB6F89480936000109260000FBE20E880E090E00FB63F :2077C000F89420936100809361000FBE81E085BF92E095BF3F9A209A559AE1E6F0E02083A1 :2077E000108247985D982898109289008AEF8093880090936F0083E080938100F0C040911A :20780000000850910108109201081092000894B714BE88E10FB6F8948093600010926000D5 :207820000FBE292F30E0F901E270F07091FD18C090FF05C0859194918F5F9F4F81F423FFFF :207840000FC08091090190910A014817590741F0E0E0F0E0859194918F5F9F4F09F042DC64 :20786000A0DF78941092AD011092AC010CC0DEDC36D38091AC019091AD0181549F4110F00D :207880001092140141DC80911401882381F78091E00081608093E00025DC80E090E0089598 :2078A000FA01923049F0933061F09130F9F485E191E022E130E01EC087E291E02EE330E04D :2078C00019C0882329F485E691E024E030E012C0813029F489E691E022E230E00BC0823006 :2078E00029F48DE891E028E130E004C080E090E020E030E091838083C90108958093E9004E :207900008091EB0081608093EB001092ED006093EC004093ED008091EE00881F8827881F62 :2079200008958091B60188238CF403C08EB38823B1F08091E80082FFF9CF8091E8008B772A :207940008093E80008958EB3882349F08091E80080FFF9CF8091E8008E778093E800089594 :20796000EF92FF920F931F9345D04CD008ED10E0F80180818F77808380818068808380819B :207980008F7D808319BC1EBA1092B40180EEE82EF12CF70180818B7F8083F8018081816052 :2079A000808380E060E042E0A9DFE1EEF0E080818E7F8083E2EEF0E0808181608083808144 :2079C00088608083F70180818E7F8083F8018081806180831F910F91FF90EF900895E7ED06 :2079E000F0E08081816080838AE482BF81E08093B501B6CFE8EDF0E080818E7F808310921C :207A0000E20008951092DA001092E10008951F920F920FB60F9211242F933F934F935F93F6 :207A20006F937F938F939F93AF93BF93EF93FF938091DA0080FF1BC08091D80080FF17C0B2 :207A40008091DA008E7F8093DA008091D90080FF0BC080E189BD82E189BD09B400FEFDCF36 :207A600081E08EBB3BD203C019BC1EBA37D28091E10080FF17C08091E20080FF13C0809138 :207A8000E2008E7F8093E2008091E20080618093E2008091D80080628093D80019BC85E049 :207AA0008EBB1CD28091E10084FF2CC08091E20084FF28C080E189BD82E189BD09B400FEC5 :207AC000FDCF8091D8008F7D8093D8008091E1008F7E8093E1008091E2008F7E8093E20012 :207AE0008091E20081608093E2008091B401882331F48091E30087FD02C081E001C084E067 :207B00008EBBECD18091E10083FF21C08091E20083FF1DC08091E100877F8093E10082E06A :207B20008EBB1092B4018091E1008E7F8093E1008091E2008E7F8093E2008091E2008061E9 :207B40008093E20080E060E042E0D8DEC7D1FF91EF91BF91AF919F918F917F916F915F9130 :207B60004F913F912F910F900FBE0F901F9018959C014091BC015091BD014617570718F49D :207B8000F90190E044C06115710511F0AB01F8CF8091E8008E778093E80040E050E0F0CF0F :207BA0008EB3882309F444C0853009F443C08091E80083FF02C081E008958091E80082FD70 :207BC00031C08091E80080FF22C08091F3009091F200782F60E0292F30E0262B372B07C07A :207BE00081918093F100415050402F5F3F4F4115510519F02830310598F390E02830310566 :207C000009F491E08091E8008E778093E8004115510531F6992321F605C08EB3882341F075 :207C2000853041F08091E80082FFF7CF80E0089582E0089583E008959C016115710529F47C :207C40008091E8008B778093E800F90126C08EB3882391F1853091F18091E80083FF02C06C :207C600081E008958091E80082FFF1CF06C08091F10081936150704059F02091F300809191 :207C8000F200322F20E090E0822B932B892B79F78091E8008B778093E80061157105B9F601 :207CA00005C08EB3882341F0853041F08091E80080FFF7CF80E0089582E0089583E00895C2 :207CC0000F931F93DF93CF9300D0CDB7DEB7E6EBF1E08091F100819381E0EE3BF807C9F792 :207CE00024DD8091E80083FFE4C08091B6019091B701953009F46DC0963040F4913081F1A7 :207D0000913070F0933009F0D4C02AC0983009F4A3C0993009F4B2C0963009F0CAC07CC023 :207D2000803809F4C6C0823809F0C3C08091BA0187708093E9008091EB001092E9002091DB :207D4000E800277F2093E80090E025E0969587952A95E1F781708093F1001092F10087C0D8 :207D6000882319F0823009F0A4C08F71823009F0A0C08091B801882331F52091BA01277097 :207D800009F497C02093E9008091EB0080FF1BC0933021F48091EB00806213C08091EB0018 :207DA00080618093EB0081E090E002C0880F991F2A95E2F78093EA001092EA008091EB00E5 :207DC00088608093EB001092E9008091E800877F51C0882309F06DC01091B8011F770FB79B :207DE000F8948091E800877F8093E8009ADD8091E80080FFFCCF8091E3008078812B809398 :207E0000E30080688093E300112311F482E001C083E08EBB0FBF4DC08058823008F049C033 :207E20008091B8019091B9016091BA01AE014F5F5F4F36DDBC01009709F43BC08091E8008E :207E4000877F8093E80089819A8192DE8091E8008B778093E8002DC0803859F58091E800AA :207E6000877F8093E8008091B4018093F1008091E8008E778093E80054DD1BC08823C9F4CA :207E80009091B8019230A8F48091E800877F8093E8009093B40145DD8091B401882331F420 :207EA0008091E30087FD02C081E001C084E08EBB6CDC8091E80083FF0AC08091EB0080624E :207EC0008093EB008091E800877F8093E8000F900F90CF91DF911F910F91089508951F9360 :207EE0008EB3882361F01091E9001092E9008091E80083FF01C0E4DE17701093E9001F916F :207F00000895F999FECF92BD81BDF89A992780B50895262FF999FECF1FBA92BD81BD20BDBD :207F20000FB6F894FA9AF99A0FBE01960895F894FFCF4341544552494E4100777700080031 :207F40000000000000080112011001020000084123370001000201000109023E00020100FE :207F600080320904000001020201000524001001042402040524060001070582030800FF0C :207F800009040100020A000000070504021000010705830210000104030904220341007216 :207FA000006400750069006E006F0020004D006900630072006F0020002000200000001810 :1A7FC00003410072006400750069006E006F0020004C004C004300000000D7 :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/caterina/Micro-prod-firmware-2012-12-10.txt ================================================ Builds against LUFA version 111009 make version 3.81 avrdude version 5.11 All AVR tools except avrdude were installed by CrossPack 20100115: avr-gcc version 4.3.3 (GCC) Thread model: single Configured with: ../configure —prefix=/usr/local/CrossPack-AVR-20100115 —disable-dependency-tracking —disable-nls —disable-werror —target=avr —enable-languages=c,c++ —disable-nls —disable-libssp —with-dwarf2 avr-libc version 1.6.7 binutils version 2.19 ================================================ FILE: external/arduino/avr/bootloaders/caterina-Arduino_Robot/Caterina-Robot-Control.hex ================================================ :1070000055C000006EC000006CC000006AC00000E7 :1070100068C0000066C0000064C0000062C00000DC :1070200060C000005EC00000FCC400005AC0000048 :1070300058C0000056C0000054C0000052C00000FC :1070400050C000005DC000004CC000004AC00000FD :1070500048C0000046C0000044C0000042C000001C :1070600040C000003EC000003CC000003AC000002C :1070700038C0000036C0000034C0000032C000003C :1070800030C000002EC000002CC000002AC000004C :1070900028C0000026C0000024C0000022C000005C :1070A00020C000001EC000001CC0000011241FBE34 :1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E6E463 :1070C000FFE702C005900D92AC3AB107D9F711E085 :1070D000ACEAB1E001C01D92A53CB107E1F74FD386 :1070E00030C78ECFF89410926F001092810081E02B :1070F00085BF15BE47985D9A289A0C9400000895A4 :107100001F920F920FB60F9211242F938F939F937C :10711000EF93FF9310928500109284008091AC0150 :107120009091AD01009741F001979093AD0180934C :10713000AC01892B09F45D9A8091AE019091AF0169 :10714000009741F001979093AF018093AE01892B96 :1071500009F4289A8091B2019091B301019690931D :10716000B3018093B201E0E0F0E0859194918F5FEC :107170009F4F49F08091B0019091B1010196909399 :10718000B1018093B001FF91EF919F918F912F9169 :107190000F900FBE0F901F90189584E08093E90028 :1071A0000DC08091E8008B778093E80003C08EB318 :1071B000882351F08091E80082FFF9CF8091E800A8 :1071C00085FFEFCF8091F1000895982F83E08093A1 :1071D000E9008091E80085FD0DC08091E8008E7780 :1071E0008093E80003C08EB3882369F08091E800A3 :1071F00080FFF9CF9093F1005D9884E690E0909342 :10720000AD018093AC0108954F925F926F927F928F :107210008F929F92AF92BF92CF92DF92EF92FF92A6 :107220000F931F93CF93DF9384E08093E9008091C5 :10723000E80082FF57C2289884E690E09093AF015F :107240008093AE01AADF182F853481F48CE49DE190 :107250009093B1018093B00107B600FCFDCFF9997E :10726000FECF81E180935700E89503C0843519F47F :1072700094DF8DE00DC28C34E1F38035D1F3843797 :1072800021F484E4A2DF80E003C2813611F489E5B1 :10729000FFC18134B1F481DF182F7FDF90E0880FC8 :1072A000991FAA2797FDA095BA2F312F330F20E001 :1072B000442737FD4095542F822B932BA42BB52BBD :1072C000B8C1803711F483E5E3C1833549F4C0E0E8 :1072D000D1E089917ADF21E0C730D207D1F7D9C157 :1072E000863521F481E371DF80E3D2C1833731F445 :1072F00087E86BDF85E969DF8EE1CAC18536B9F4BD :10730000E0E0F0E093E085E090935700E89507B661 :1073100000FCFDCF80935700E89507B600FCFDCF39 :10732000E058FF4FA0E7E030FA0771F7A2CF8237AD :1073300039F4E1E0F0E089E0809357008491A8C13E :10734000863439F4E0E0F0E089E0809357008491DE :107350009FC18E3439F4E3E0F0E089E08093570078 :10736000849196C1813539F4E2E0F0E089E08093C0 :10737000570084918DC1823631F489E526DF80E0A3 :1073800024DF80E885C1823419F0873609F0E5C032 :107390001092B1011092B00100DF082FFEDEF82E2E :1073A000FCDE682E8554823008F071C1902F80E099 :1073B000CF2DD0E0C82BD92B10926F00173609F0D3 :1073C0004BC081E180935700E895DD24CC24C39421 :1073D0003FC0E090B501F090B6010091B701109167 :1073E000B801B6E46B16D9F4ED2DF0E0EE29FF29D3 :1073F000E4918E2FEADEDD2081F082E090E0A0E0D3 :10740000B0E0E80EF91E0A1F1B1FE092B501F092D2 :10741000B6010093B7011093B801DC2418C0D8015D :10742000C701B695A7959795879575D5CEDE82E06D :1074300090E0A0E0B0E0E80EF91E0A1F1B1FE092EA :10744000B501F092B6010093B7011093B8012197EE :10745000209709F0BECF7DC08090B5019090B60115 :10746000A090B701B090B80196E4691609F05DC02C :1074700083E0F40180935700E89507B600FCFDCF48 :1074800054C0F6E46F1661F5772031F1E090B50154 :10749000F090B6010091B7011091B8017EDED82EB0 :1074A000CC24852D90E08C299D29F7010C01409278 :1074B0005700E895112482E090E0A0E0B0E0E80EEB :1074C000F91E0A1F1B1FE092B501F092B60100934E :1074D000B7011093B80102C060DE582E742423C097 :1074E000E090B501F090B6010091B7011091B8019C :1074F00016950795F794E79450DE682FC70113D5CA :107500008091B5019091B601A091B701B091B801F9 :107510000296A11DB11D8093B5019093B601A09371 :10752000B701B093B801219704C0552477244424AF :107530004394209709F0A5CF96E4691641F485E0BD :10754000F40180935700E89507B600FCFDCF8DE06D :107550003CDE82E080936F009CC0833471F4009124 :10756000B5011091B60119DE90E021E0F8010C019F :1075700020935700E89511247CCE833619F5E090CE :10758000B501F090B6010091B7011091B80105DE88 :10759000F701E16090E021E00C0120935700E895AD :1075A000112482E090E0A0E0B0E0E80EF91E0A1F8E :1075B0001B1FE092B501F092B6010093B701109342 :1075C000B80157CE8D3661F4E091B501F091B60166 :1075D00085E080935700E89507B600FCFDCF49CEC3 :1075E000823551F4E091B501F091B6010591149105 :1075F000812FEBDD802F4CC0843421F5E090B50164 :10760000F090B6010091B7011091B8011695079559 :10761000F794E794C2DD682FC70185D48091B50146 :107620009091B601A091B701B091B8010296A11D49 :10763000B11D8093B5019093B601A093B701B093AB :10764000B80117CE843609F5E090B501F090B60187 :107650000091B7011091B801D801C701B695A7955F :107660009795879558D4B1DD82E090E0A0E0B0E036 :10767000E80EF91E0A1F1B1FE092B501F092B60139 :107680000093B7011093B80104C08B3111F08FE360 :107690009CDD83E08093E9009091E8008091E80010 :1076A0008E778093E80095FF04C010C08EB38823C6 :1076B000C9F08091E80080FFF9CF8091E8008E77D3 :1076C0008093E80003C08EB3882361F08091E800C6 :1076D00080FFF9CF84E08093E9008091E8008B7708 :1076E0008093E800DF91CF911F910F91FF90EF9071 :1076F000DF90CF90BF90AF909F908F907F906F90D2 :107700005F904F9008959091BD01892F8F778132BE :1077100049F58091BE018032A1F0813219F5913A8C :1077200009F58091E800877F8093E8008CE091E084 :1077300067E070E027D28091E8008B778093E800C3 :107740000895913279F48091E800877F8093E80072 :107750008CE091E067E070E079D28091E8008E776C :107760008093E800089582E061EC42E0D1D083E0AC :1077700061E842E1CDD084E060E842E1C9C01F93F6 :10778000209100081092000844B714BE88E10FB69B :10779000F89480936000109260000FBE80E8E0E0F3 :1077A000F0E00FB6F89480936100E09361000FBEA3 :1077B00031E035BF92E095BF3F9A209A559A809369 :1077C00061001092610047985D9A289A1092890092 :1077D0008AEF8093880090936F0083E0809381000C :1077E000859194918F5F9F4F11F03093B401942F46 :1077F00041FF19C0809109012817A9F08093000862 :10780000789480911301882339F08091B20190918E :10781000B3018F5E9240C8F310920008F89481E0A3 :10782000809313010CC090FF04C08091B4018823A1 :1078300051F493FF09C080910901281729F0809124 :10784000B401882309F04EDCD4D078941092B101B1 :107850001092B0011EEF20C0D7DC4BD38091B00155 :107860009091B10181549F4110F0109213018091C9 :10787000B9019091BA0101969093BA018093B90130 :10788000292F97FF03C0512F591B252F220F28178F :1078900010F4479801C0479A809113018823E1F6BC :1078A0008091E00081608093E0001CDC80E090E04B :1078B0001F910895FA01923049F0933061F09130B0 :1078C000F9F484E191E022E130E01EC086E291E02B :1078D0002EE330E019C0882329F484E691E024E007 :1078E00030E012C0813029F488E691E028E230E0EF :1078F0000BC0823029F482E991E028E130E004C035 :1079000080E090E020E030E091838083C901089519 :107910008093E9008091EB0081608093EB001092EE :10792000ED006093EC004093ED008091EE00881F25 :107930008827881F08958091BD0188238CF403C097 :107940008EB38823B1F08091E80082FFF9CF809157 :10795000E8008B778093E80008958EB3882349F080 :107960008091E80080FFF9CF8091E8008E778093C6 :10797000E8000895EF92FF920F931F9345D04CD0EB :1079800008ED10E0F80180818F7780838081806826 :10799000808380818F7D808319BC1EBA1092BB01C9 :1079A00080EEE82EF12CF70180818B7F8083F80137 :1079B00080818160808380E060E042E0A9DFE1EEC9 :1079C000F0E080818E7F8083E2EEF0E08081816054 :1079D0008083808188608083F70180818E7F8083AF :1079E000F8018081806180831F910F91FF90EF905B :1079F0000895E7EDF0E08081816080838AE482BFB2 :107A000081E08093BC01B6CFE8EDF0E080818E7F0D :107A100080831092E20008951092DA001092E10043 :107A200008951F920F920FB60F9211242F933F9338 :107A30004F935F936F937F938F939F93AF93BF9376 :107A4000EF93FF938091DA0080FF1BC08091D800F4 :107A500080FF17C08091DA008E7F8093DA008091DA :107A6000D90080FF0BC080E189BD82E189BD09B4E6 :107A700000FEFDCF81E08EBB3BD203C019BC1EBA15 :107A800037D28091E10080FF17C08091E20080FF33 :107A900013C08091E2008E7F8093E2008091E2002B :107AA00080618093E2008091D80080628093D8004A :107AB00019BC85E08EBB1CD28091E10084FF2CC0F4 :107AC0008091E20084FF28C080E189BD82E189BD08 :107AD00009B400FEFDCF8091D8008F7D8093D8003F :107AE0008091E1008F7E8093E1008091E2008F7EA3 :107AF0008093E2008091E20081608093E2008091B7 :107B0000BB01882331F48091E30087FD02C081E04E :107B100001C084E08EBBECD18091E10083FF21C0E5 :107B20008091E20083FF1DC08091E100877F8093F8 :107B3000E10082E08EBB1092BB018091E1008E7F5C :107B40008093E1008091E2008E7F8093E20080913B :107B5000E20080618093E20080E060E042E0D8DEF5 :107B6000C7D1FF91EF91BF91AF919F918F917F917D :107B70006F915F914F913F912F910F900FBE0F909A :107B80001F9018959C014091C3015091C401461764 :107B9000570718F4F90190E044C06115710511F020 :107BA000AB01F8CF8091E8008E778093E80040E049 :107BB00050E0F0CF8EB3882309F444C0853009F437 :107BC00043C08091E80083FF02C081E00895809166 :107BD000E80082FD31C08091E80080FF22C08091E2 :107BE000F3009091F200782F60E0292F30E0262BEF :107BF000372B07C081918093F100415050402F5F97 :107C00003F4F4115510519F02830310598F390E0A8 :107C10002830310509F491E08091E8008E77809357 :107C2000E8004115510531F6992321F605C08EB3C0 :107C3000882341F0853041F08091E80082FFF7CF42 :107C400080E0089582E0089583E008959C01611525 :107C5000710529F48091E8008B778093E800F901A1 :107C600026C08EB3882391F1853091F18091E80090 :107C700083FF02C081E008958091E80082FFF1CF88 :107C800006C08091F10081936150704059F02091BD :107C9000F3008091F200322F20E090E0822B932BB2 :107CA000892B79F78091E8008B778093E800611544 :107CB0007105B9F605C08EB3882341F0853041F0D7 :107CC0008091E80080FFF7CF80E0089582E008957A :107CD00083E008950F931F93DF93CF9300D0CDB728 :107CE000DEB7EDEBF1E08091F100819381E0E53CBE :107CF000F807C9F708DD8091E80083FFE4C08091B0 :107D0000BD019091BE01953009F46DC0963040F4EC :107D1000913081F1913070F0933009F0D4C02AC0D5 :107D2000983009F4A3C0993009F4B2C0963009F034 :107D3000CAC07CC0803809F4C6C0823809F0C3C00C :107D40008091C10187708093E9008091EB001092CF :107D5000E9002091E800277F2093E80090E025E0EB :107D6000969587952A95E1F781708093F10010929E :107D7000F10087C0882319F0823009F0A4C08F7108 :107D8000823009F0A0C08091BF01882331F5209195 :107D9000C101277009F497C02093E9008091EB009E :107DA00080FF1BC0933021F48091EB00806213C0F0 :107DB0008091EB0080618093EB0081E090E002C055 :107DC000880F991F2A95E2F78093EA001092EA0043 :107DD0008091EB0088608093EB001092E900809125 :107DE000E800877F51C0882309F06DC01091BF0162 :107DF0001F770FB7F8948091E800877F8093E800A1 :107E00009ADD8091E80080FFFCCF8091E3008078CC :107E1000812B8093E30080688093E300112311F4A9 :107E200082E001C083E08EBB0FBF4DC0805882301E :107E300008F049C08091BF019091C0016091C101DB :107E4000AE014F5F5F4F36DDBC01009709F43BC0C8 :107E50008091E800877F8093E80089819A8192DE93 :107E60008091E8008B778093E8002DC0803859F529 :107E70008091E800877F8093E8008091BB01809328 :107E8000F1008091E8008E778093E80054DD1BC0FC :107E90008823C9F49091BF019230A8F48091E80042 :107EA000877F8093E8009093BB0145DD8091BB0103 :107EB000882331F48091E30087FD02C081E001C096 :107EC00084E08EBB50DC8091E80083FF0AC0809183 :107ED000EB0080628093EB008091E800877F8093C5 :107EE000E8000F900F90CF91DF911F910F910895AF :107EF00008951F938EB3882361F01091E9001092CA :107F0000E9008091E80083FF01C0E4DE1770109360 :107F1000E9001F910895F999FECF92BD81BDF89AAD :107F2000992780B50895262FF999FECF1FBA92BDE3 :107F300081BD20BD0FB6F894FA9AF99A0FBE01964A :067F40000895F894FFCF44 :107F46004341544552494E41007700080000000065 :107F56000000080112011001020000084123390047 :107F660001000201000109023E00020100803209FF :107F7600040000010202010005240010010424028D :107F8600040524060001070582030800FF09040111 :107F960000020A000000070504021000010705831D :107FA6000210000104030904280352006F00620056 :107FB6006F00740020004D006F0074006F007200A7 :107FC600200042006F006100720064002000200063 :107FD60000001803410072006400750069006E001D :0C7FE6006F0020004C004C004300000025 :040000030000700089 :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/caterina-Arduino_Robot/Caterina-Robot-Motor.hex ================================================ :1070000055C000006EC000006CC000006AC00000E7 :1070100068C0000066C0000064C0000062C00000DC :1070200060C000005EC00000FCC400005AC0000048 :1070300058C0000056C0000054C0000052C00000FC :1070400050C000005DC000004CC000004AC00000FD :1070500048C0000046C0000044C0000042C000001C :1070600040C000003EC000003CC000003AC000002C :1070700038C0000036C0000034C0000032C000003C :1070800030C000002EC000002CC000002AC000004C :1070900028C0000026C0000024C0000022C000005C :1070A00020C000001EC000001CC0000011241FBE34 :1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E6E463 :1070C000FFE702C005900D92AC3AB107D9F711E085 :1070D000ACEAB1E001C01D92A53CB107E1F74FD386 :1070E00030C78ECFF89410926F001092810081E02B :1070F00085BF15BE47985D9A289A0C9400000895A4 :107100001F920F920FB60F9211242F938F939F937C :10711000EF93FF9310928500109284008091AC0150 :107120009091AD01009741F001979093AD0180934C :10713000AC01892B09F45D9A8091AE019091AF0169 :10714000009741F001979093AF018093AE01892B96 :1071500009F4289A8091B2019091B301019690931D :10716000B3018093B201E0E0F0E0859194918F5FEC :107170009F4F49F08091B0019091B1010196909399 :10718000B1018093B001FF91EF919F918F912F9169 :107190000F900FBE0F901F90189584E08093E90028 :1071A0000DC08091E8008B778093E80003C08EB318 :1071B000882351F08091E80082FFF9CF8091E800A8 :1071C00085FFEFCF8091F1000895982F83E08093A1 :1071D000E9008091E80085FD0DC08091E8008E7780 :1071E0008093E80003C08EB3882369F08091E800A3 :1071F00080FFF9CF9093F1005D9884E690E0909342 :10720000AD018093AC0108954F925F926F927F928F :107210008F929F92AF92BF92CF92DF92EF92FF92A6 :107220000F931F93CF93DF9384E08093E9008091C5 :10723000E80082FF57C2289884E690E09093AF015F :107240008093AE01AADF182F853481F48CE49DE190 :107250009093B1018093B00107B600FCFDCFF9997E :10726000FECF81E180935700E89503C0843519F47F :1072700094DF8DE00DC28C34E1F38035D1F3843797 :1072800021F484E4A2DF80E003C2813611F489E5B1 :10729000FFC18134B1F481DF182F7FDF90E0880FC8 :1072A000991FAA2797FDA095BA2F312F330F20E001 :1072B000442737FD4095542F822B932BA42BB52BBD :1072C000B8C1803711F483E5E3C1833549F4C0E0E8 :1072D000D1E089917ADF21E0C730D207D1F7D9C157 :1072E000863521F481E371DF80E3D2C1833731F445 :1072F00087E86BDF85E969DF8EE1CAC18536B9F4BD :10730000E0E0F0E093E085E090935700E89507B661 :1073100000FCFDCF80935700E89507B600FCFDCF39 :10732000E058FF4FA0E7E030FA0771F7A2CF8237AD :1073300039F4E1E0F0E089E0809357008491A8C13E :10734000863439F4E0E0F0E089E0809357008491DE :107350009FC18E3439F4E3E0F0E089E08093570078 :10736000849196C1813539F4E2E0F0E089E08093C0 :10737000570084918DC1823631F489E526DF80E0A3 :1073800024DF80E885C1823419F0873609F0E5C032 :107390001092B1011092B00100DF082FFEDEF82E2E :1073A000FCDE682E8554823008F071C1902F80E099 :1073B000CF2DD0E0C82BD92B10926F00173609F0D3 :1073C0004BC081E180935700E895DD24CC24C39421 :1073D0003FC0E090B501F090B6010091B701109167 :1073E000B801B6E46B16D9F4ED2DF0E0EE29FF29D3 :1073F000E4918E2FEADEDD2081F082E090E0A0E0D3 :10740000B0E0E80EF91E0A1F1B1FE092B501F092D2 :10741000B6010093B7011093B801DC2418C0D8015D :10742000C701B695A7959795879575D5CEDE82E06D :1074300090E0A0E0B0E0E80EF91E0A1F1B1FE092EA :10744000B501F092B6010093B7011093B8012197EE :10745000209709F0BECF7DC08090B5019090B60115 :10746000A090B701B090B80196E4691609F05DC02C :1074700083E0F40180935700E89507B600FCFDCF48 :1074800054C0F6E46F1661F5772031F1E090B50154 :10749000F090B6010091B7011091B8017EDED82EB0 :1074A000CC24852D90E08C299D29F7010C01409278 :1074B0005700E895112482E090E0A0E0B0E0E80EEB :1074C000F91E0A1F1B1FE092B501F092B60100934E :1074D000B7011093B80102C060DE582E742423C097 :1074E000E090B501F090B6010091B7011091B8019C :1074F00016950795F794E79450DE682FC70113D5CA :107500008091B5019091B601A091B701B091B801F9 :107510000296A11DB11D8093B5019093B601A09371 :10752000B701B093B801219704C0552477244424AF :107530004394209709F0A5CF96E4691641F485E0BD :10754000F40180935700E89507B600FCFDCF8DE06D :107550003CDE82E080936F009CC0833471F4009124 :10756000B5011091B60119DE90E021E0F8010C019F :1075700020935700E89511247CCE833619F5E090CE :10758000B501F090B6010091B7011091B80105DE88 :10759000F701E16090E021E00C0120935700E895AD :1075A000112482E090E0A0E0B0E0E80EF91E0A1F8E :1075B0001B1FE092B501F092B6010093B701109342 :1075C000B80157CE8D3661F4E091B501F091B60166 :1075D00085E080935700E89507B600FCFDCF49CEC3 :1075E000823551F4E091B501F091B6010591149105 :1075F000812FEBDD802F4CC0843421F5E090B50164 :10760000F090B6010091B7011091B8011695079559 :10761000F794E794C2DD682FC70185D48091B50146 :107620009091B601A091B701B091B8010296A11D49 :10763000B11D8093B5019093B601A093B701B093AB :10764000B80117CE843609F5E090B501F090B60187 :107650000091B7011091B801D801C701B695A7955F :107660009795879558D4B1DD82E090E0A0E0B0E036 :10767000E80EF91E0A1F1B1FE092B501F092B60139 :107680000093B7011093B80104C08B3111F08FE360 :107690009CDD83E08093E9009091E8008091E80010 :1076A0008E778093E80095FF04C010C08EB38823C6 :1076B000C9F08091E80080FFF9CF8091E8008E77D3 :1076C0008093E80003C08EB3882361F08091E800C6 :1076D00080FFF9CF84E08093E9008091E8008B7708 :1076E0008093E800DF91CF911F910F91FF90EF9071 :1076F000DF90CF90BF90AF909F908F907F906F90D2 :107700005F904F9008959091BD01892F8F778132BE :1077100049F58091BE018032A1F0813219F5913A8C :1077200009F58091E800877F8093E8008CE091E084 :1077300067E070E027D28091E8008B778093E800C3 :107740000895913279F48091E800877F8093E80072 :107750008CE091E067E070E079D28091E8008E776C :107760008093E800089582E061EC42E0D1D083E0AC :1077700061E842E1CDD084E060E842E1C9C01F93F6 :10778000209100081092000844B714BE88E10FB69B :10779000F89480936000109260000FBE80E8E0E0F3 :1077A000F0E00FB6F89480936100E09361000FBEA3 :1077B00031E035BF92E095BF3F9A209A559A809369 :1077C00061001092610047985D9A289A1092890092 :1077D0008AEF8093880090936F0083E0809381000C :1077E000859194918F5F9F4F11F03093B401942F46 :1077F00041FF19C0809109012817A9F08093000862 :10780000789480911301882339F08091B20190918E :10781000B3018F5E9240C8F310920008F89481E0A3 :10782000809313010CC090FF04C08091B4018823A1 :1078300051F493FF09C080910901281729F0809124 :10784000B401882309F04EDCD4D078941092B101B1 :107850001092B0011EEF20C0D7DC4BD38091B00155 :107860009091B10181549F4110F0109213018091C9 :10787000B9019091BA0101969093BA018093B90130 :10788000292F97FF03C0512F591B252F220F28178F :1078900010F4479801C0479A809113018823E1F6BC :1078A0008091E00081608093E0001CDC80E090E04B :1078B0001F910895FA01923049F0933061F09130B0 :1078C000F9F484E191E022E130E01EC086E291E02B :1078D0002EE330E019C0882329F484E691E024E007 :1078E00030E012C0813029F488E691E028E230E0EF :1078F0000BC0823029F482E991E028E130E004C035 :1079000080E090E020E030E091838083C901089519 :107910008093E9008091EB0081608093EB001092EE :10792000ED006093EC004093ED008091EE00881F25 :107930008827881F08958091BD0188238CF403C097 :107940008EB38823B1F08091E80082FFF9CF809157 :10795000E8008B778093E80008958EB3882349F080 :107960008091E80080FFF9CF8091E8008E778093C6 :10797000E8000895EF92FF920F931F9345D04CD0EB :1079800008ED10E0F80180818F7780838081806826 :10799000808380818F7D808319BC1EBA1092BB01C9 :1079A00080EEE82EF12CF70180818B7F8083F80137 :1079B00080818160808380E060E042E0A9DFE1EEC9 :1079C000F0E080818E7F8083E2EEF0E08081816054 :1079D0008083808188608083F70180818E7F8083AF :1079E000F8018081806180831F910F91FF90EF905B :1079F0000895E7EDF0E08081816080838AE482BFB2 :107A000081E08093BC01B6CFE8EDF0E080818E7F0D :107A100080831092E20008951092DA001092E10043 :107A200008951F920F920FB60F9211242F933F9338 :107A30004F935F936F937F938F939F93AF93BF9376 :107A4000EF93FF938091DA0080FF1BC08091D800F4 :107A500080FF17C08091DA008E7F8093DA008091DA :107A6000D90080FF0BC080E189BD82E189BD09B4E6 :107A700000FEFDCF81E08EBB3BD203C019BC1EBA15 :107A800037D28091E10080FF17C08091E20080FF33 :107A900013C08091E2008E7F8093E2008091E2002B :107AA00080618093E2008091D80080628093D8004A :107AB00019BC85E08EBB1CD28091E10084FF2CC0F4 :107AC0008091E20084FF28C080E189BD82E189BD08 :107AD00009B400FEFDCF8091D8008F7D8093D8003F :107AE0008091E1008F7E8093E1008091E2008F7EA3 :107AF0008093E2008091E20081608093E2008091B7 :107B0000BB01882331F48091E30087FD02C081E04E :107B100001C084E08EBBECD18091E10083FF21C0E5 :107B20008091E20083FF1DC08091E100877F8093F8 :107B3000E10082E08EBB1092BB018091E1008E7F5C :107B40008093E1008091E2008E7F8093E20080913B :107B5000E20080618093E20080E060E042E0D8DEF5 :107B6000C7D1FF91EF91BF91AF919F918F917F917D :107B70006F915F914F913F912F910F900FBE0F909A :107B80001F9018959C014091C3015091C401461764 :107B9000570718F4F90190E044C06115710511F020 :107BA000AB01F8CF8091E8008E778093E80040E049 :107BB00050E0F0CF8EB3882309F444C0853009F437 :107BC00043C08091E80083FF02C081E00895809166 :107BD000E80082FD31C08091E80080FF22C08091E2 :107BE000F3009091F200782F60E0292F30E0262BEF :107BF000372B07C081918093F100415050402F5F97 :107C00003F4F4115510519F02830310598F390E0A8 :107C10002830310509F491E08091E8008E77809357 :107C2000E8004115510531F6992321F605C08EB3C0 :107C3000882341F0853041F08091E80082FFF7CF42 :107C400080E0089582E0089583E008959C01611525 :107C5000710529F48091E8008B778093E800F901A1 :107C600026C08EB3882391F1853091F18091E80090 :107C700083FF02C081E008958091E80082FFF1CF88 :107C800006C08091F10081936150704059F02091BD :107C9000F3008091F200322F20E090E0822B932BB2 :107CA000892B79F78091E8008B778093E800611544 :107CB0007105B9F605C08EB3882341F0853041F0D7 :107CC0008091E80080FFF7CF80E0089582E008957A :107CD00083E008950F931F93DF93CF9300D0CDB728 :107CE000DEB7EDEBF1E08091F100819381E0E53CBE :107CF000F807C9F708DD8091E80083FFE4C08091B0 :107D0000BD019091BE01953009F46DC0963040F4EC :107D1000913081F1913070F0933009F0D4C02AC0D5 :107D2000983009F4A3C0993009F4B2C0963009F034 :107D3000CAC07CC0803809F4C6C0823809F0C3C00C :107D40008091C10187708093E9008091EB001092CF :107D5000E9002091E800277F2093E80090E025E0EB :107D6000969587952A95E1F781708093F10010929E :107D7000F10087C0882319F0823009F0A4C08F7108 :107D8000823009F0A0C08091BF01882331F5209195 :107D9000C101277009F497C02093E9008091EB009E :107DA00080FF1BC0933021F48091EB00806213C0F0 :107DB0008091EB0080618093EB0081E090E002C055 :107DC000880F991F2A95E2F78093EA001092EA0043 :107DD0008091EB0088608093EB001092E900809125 :107DE000E800877F51C0882309F06DC01091BF0162 :107DF0001F770FB7F8948091E800877F8093E800A1 :107E00009ADD8091E80080FFFCCF8091E3008078CC :107E1000812B8093E30080688093E300112311F4A9 :107E200082E001C083E08EBB0FBF4DC0805882301E :107E300008F049C08091BF019091C0016091C101DB :107E4000AE014F5F5F4F36DDBC01009709F43BC0C8 :107E50008091E800877F8093E80089819A8192DE93 :107E60008091E8008B778093E8002DC0803859F529 :107E70008091E800877F8093E8008091BB01809328 :107E8000F1008091E8008E778093E80054DD1BC0FC :107E90008823C9F49091BF019230A8F48091E80042 :107EA000877F8093E8009093BB0145DD8091BB0103 :107EB000882331F48091E30087FD02C081E001C096 :107EC00084E08EBB50DC8091E80083FF0AC0809183 :107ED000EB0080628093EB008091E800877F8093C5 :107EE000E8000F900F90CF91DF911F910F910895AF :107EF00008951F938EB3882361F01091E9001092CA :107F0000E9008091E80083FF01C0E4DE1770109360 :107F1000E9001F910895F999FECF92BD81BDF89AAD :107F2000992780B50895262FF999FECF1FBA92BDE3 :107F300081BD20BD0FB6F894FA9AF99A0FBE01964A :067F40000895F894FFCF44 :107F46004341544552494E41007700080000000065 :107F56000000080112011001020000084123380048 :107F660001000201000109023E00020100803209FF :107F7600040000010202010005240010010424028D :107F8600040524060001070582030800FF09040111 :107F960000020A000000070504021000010705831D :107FA6000210000104030904280352006F00620056 :107FB6006F007400200043006F006E0074007200B2 :107FC6006F006C00200042006F00610072006400C8 :107FD60000001803410072006400750069006E001D :0C7FE6006F0020004C004C004300000025 :040000030000700089 :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/caterina-Arduino_Robot/Caterina-Robot.txt ================================================ Builds against LUFA version 111009 make version 3.81 avrdude version 5.11 All AVR tools except avrdude were installed by CrossPack 20100115: avr-gcc version 4.3.3 (GCC) Thread model: single Configured with: ../configure —prefix=/usr/local/CrossPack-AVR-20100115 —disable-dependency-tracking —disable-nls —disable-werror —target=avr —enable-languages=c,c++ —disable-nls —disable-libssp —with-dwarf2 avr-libc version 1.6.7 binutils version 2.19 ================================================ FILE: external/arduino/avr/bootloaders/caterina-Arduino_Robot/Caterina.c ================================================ /* LUFA Library Copyright (C) Dean Camera, 2011. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /** \file * * Main source file for the CDC class bootloader. This file contains the complete bootloader logic. */ #define INCLUDE_FROM_CATERINA_C #include "Caterina.h" /** Contains the current baud rate and other settings of the first virtual serial port. This must be retained as some * operating systems will not open the port unless the settings can be set successfully. */ static CDC_LineEncoding_t LineEncoding = { .BaudRateBPS = 0, .CharFormat = CDC_LINEENCODING_OneStopBit, .ParityType = CDC_PARITY_None, .DataBits = 8 }; /** Current address counter. This stores the current address of the FLASH or EEPROM as set by the host, * and is used when reading or writing to the AVRs memory (either FLASH or EEPROM depending on the issued * command.) */ static uint32_t CurrAddress; /** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run * via a watchdog reset. When cleared the bootloader will exit, starting the watchdog and entering an infinite * loop until the AVR restarts and the application runs. */ static bool RunBootloader = true; /* Pulse generation counters to keep track of the time remaining for each pulse type */ #define TX_RX_LED_PULSE_PERIOD 100 uint16_t TxLEDPulse = 0; // time remaining for Tx LED pulse uint16_t RxLEDPulse = 0; // time remaining for Rx LED pulse /* Bootloader timeout timer */ // MAH 8/15/12- change so timeouts work properly when the chip is running at 8MHz instead of 16. #define TIMEOUT_PERIOD 8000 #define EXT_RESET_TIMEOUT_PERIOD 750 /********************************************************************************************************* LilyPadUSB bootloader code The LilyPadUSB bootloader has been changed to remove the 8-second delay after external reset which is in the Leonardo. To enter the bootloader, the user should execute TWO external resets within 750 ms; that is, press the reset button twice, quickly.\ Some other changes were made to allow this code to compile tightly enough to fit in the alloted 4k of bootloader space. */ // MAH 8/15/12- added this flag to replace the bulky program memory reads to check for the presence of a sketch // at the top of the memory space. static bool sketchPresent = false; // MAH 8/15/12- make this volatile, since we modify it in one place and read it in another, we want to make // sure we're always working on the copy in memory and not an erroneous value stored in a cache somewhere. // This variable stores the length of time we've been in the bootloader when waiting for the 8 second delay. volatile uint16_t Timeout = 0; // MAH 8/15/12- added this for delay during startup. Did not use existing Timeout value b/c it only increments // when there's a sketch at the top of the memory. volatile uint16_t resetTimeout = 0; // MAH 8/15/12- let's make this an 8-bit value instead of 16- that saves on memory because 16-bit addition and // comparison compiles to bulkier code. Note that this does *not* require a change to the Arduino core- we're // just sort of ignoring the extra byte that the Arduino core puts at the next location. uint8_t bootKey = 0x77; volatile uint8_t *const bootKeyPtr = (volatile uint8_t *)0x0800; // StartSketch() is called to clean up our mess before passing execution to the sketch. void StartSketch(void) { cli(); /* Undo TIMER1 setup and clear the count before running the sketch */ TIMSK1 = 0; TCCR1B = 0; /* Relocate the interrupt vector table to the application section */ MCUCR = (1 << IVCE); MCUCR = 0; L_LED_OFF(); TX_LED_OFF(); RX_LED_OFF(); /* jump to beginning of application space */ __asm__ volatile("jmp 0x0000"); } uint16_t LLEDPulse; /** Main program entry point. This routine configures the hardware required by the bootloader, then continuously * runs the bootloader processing routine until it times out or is instructed to exit. */ int main(void) { /* Save the value of the boot key memory before it is overwritten */ uint8_t bootKeyPtrVal = *bootKeyPtr; *bootKeyPtr = 0; /* Check the reason for the reset so we can act accordingly */ uint8_t mcusr_state = MCUSR; // store the initial state of the Status register MCUSR = 0; // clear all reset flags /* Watchdog may be configured with a 15 ms period so must disable it before going any further */ // MAH 8/15/12- I removed this because wdt_disable() is the first thing SetupHardware() does- why // do it twice right in a row? //wdt_disable(); /* Setup hardware required for the bootloader */ // MAH 8/15/12- Moved this up to before the bootloader go/no-go decision tree so I could use the // timer in that decision tree. Removed the USBInit() call from it; if I'm not going to stay in // the bootloader, there's no point spending the time initializing the USB. // SetupHardware(); wdt_disable(); // Disable clock division clock_prescale_set(clock_div_1); // Relocate the interrupt vector table to the bootloader section MCUCR = (1 << IVCE); MCUCR = (1 << IVSEL); LED_SETUP(); CPU_PRESCALE(0); L_LED_OFF(); TX_LED_OFF(); RX_LED_OFF(); // Initialize TIMER1 to handle bootloader timeout and LED tasks. // With 16 MHz clock and 1/64 prescaler, timer 1 is clocked at 250 kHz // Our chosen compare match generates an interrupt every 1 ms. // This interrupt is disabled selectively when doing memory reading, erasing, // or writing since SPM has tight timing requirements. OCR1AH = 0; OCR1AL = 250; TIMSK1 = (1 << OCIE1A); // enable timer 1 output compare A match interrupt TCCR1B = ((1 << CS11) | (1 << CS10)); // 1/64 prescaler on timer 1 input // MAH 8/15/12- this replaces bulky pgm_read_word(0) calls later on, to save memory. if (pgm_read_word(0) != 0xFFFF) sketchPresent = true; // MAH 26 Oct 2012- The "bootload or not?" section has been modified since the code released // with Arduino 1.0.1. The simplest modification is the replacement of equivalence checks on // the reset bits with masked checks, so if more than one reset occurs before the register is // checked, the check doesn't fail and fall through to the bootloader unnecessarily. // The second, more in depth modification addresses behavior after an external reset (i.e., // user pushes the reset button). The Leonardo treats all external resets as requests to // re-enter the bootloader and wait for code to be loaded. It remains in bootloader mode for // 8 seconds before continuing on to the sketch (if one is present). By defining RESET_DELAY // equal to 1, this behavior will persist. // However, if RESET_DELAY is defined to 0, the reset timeout before loading the sketch drops // to 750ms. If, during that 750ms, another external reset occurs, THEN an 8-second delay // in the bootloader will occur. // This is the "no-8-second-delay" code. If this is the first time through the loop, we // don't expect to see the bootKey in memory. if ( (mcusr_state & (1< EXT_RESET_TIMEOUT_PERIOD) // resetTimeout is getting incremeted RunBootloader = false; // in the timer1 ISR. } // If we make it past that while loop, it's sketch loading time! *bootKeyPtr = 0; // clear out the bootKey; from now on, we want to treat a reset like // a normal reset. cli(); // Disable interrupts, in case no sketch is present. RunBootloader = true; // We want to hang out in the bootloader if no sketch is present. if (sketchPresent) StartSketch(); // If a sketch is present, go! Otherwise, wait around // in the bootloader until one is uploaded. } // On a power-on reset, we ALWAYS want to go to the sketch. If there is one. // This is a place where the old code had an equivalence and now there is a mask. else if ( (mcusr_state & (1< TIMEOUT_PERIOD) RunBootloader = false; // MAH 8/15/12- This used to be a function call- inlining it saves a few bytes. LLEDPulse++; uint8_t p = LLEDPulse >> 8; if (p > 127) p = 254-p; p += p; if (((uint8_t)LLEDPulse) > p) L_LED_OFF(); else L_LED_ON(); } /* Disconnect from the host - USB interface will be reset later along with the AVR */ USB_Detach(); /* Jump to beginning of application space to run the sketch - do not reset */ StartSketch(); } // Timer1 is set up to provide periodic interrupts. This is used to flicker the LEDs during // programming as well as to generate the clock counts which determine how long the board should // remain in bootloading mode. ISR(TIMER1_COMPA_vect, ISR_BLOCK) { /* Reset counter */ TCNT1H = 0; TCNT1L = 0; /* Check whether the TX or RX LED one-shot period has elapsed. if so, turn off the LED */ if (TxLEDPulse && !(--TxLEDPulse)) TX_LED_OFF(); if (RxLEDPulse && !(--RxLEDPulse)) RX_LED_OFF(); resetTimeout++; // Needed for the "short reset delay" mode- governs the time the board waits // for a second reset before loading the sketch. if (pgm_read_word(0) != 0xFFFF) Timeout++; } // MAH 29 Oct 2012 Nothing below this point has to change for the LilyPadUSB support /** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready * to relay data to and from the attached USB host. */ void EVENT_USB_Device_ConfigurationChanged(void) { /* Setup CDC Notification, Rx and Tx Endpoints */ Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, CDC_NOTIFICATION_EPSIZE, ENDPOINT_BANK_SINGLE); Endpoint_ConfigureEndpoint(CDC_TX_EPNUM, EP_TYPE_BULK, ENDPOINT_DIR_IN, CDC_TXRX_EPSIZE, ENDPOINT_BANK_SINGLE); Endpoint_ConfigureEndpoint(CDC_RX_EPNUM, EP_TYPE_BULK, ENDPOINT_DIR_OUT, CDC_TXRX_EPSIZE, ENDPOINT_BANK_SINGLE); } /** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to * the device from the USB host before passing along unhandled control requests to the library for processing * internally. */ void EVENT_USB_Device_ControlRequest(void) { /* Ignore any requests that aren't directed to the CDC interface */ if ((USB_ControlRequest.bmRequestType & (CONTROL_REQTYPE_TYPE | CONTROL_REQTYPE_RECIPIENT)) != (REQTYPE_CLASS | REQREC_INTERFACE)) { return; } /* Process CDC specific control requests */ switch (USB_ControlRequest.bRequest) { case CDC_REQ_GetLineEncoding: if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { Endpoint_ClearSETUP(); /* Write the line coding data to the control endpoint */ Endpoint_Write_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); Endpoint_ClearOUT(); } break; case CDC_REQ_SetLineEncoding: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { Endpoint_ClearSETUP(); /* Read the line coding data in from the host into the global struct */ Endpoint_Read_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); Endpoint_ClearIN(); } break; } } #if !defined(NO_BLOCK_SUPPORT) /** Reads or writes a block of EEPROM or FLASH memory to or from the appropriate CDC data endpoint, depending * on the AVR910 protocol command issued. * * \param[in] Command Single character AVR910 protocol command indicating what memory operation to perform */ static void ReadWriteMemoryBlock(const uint8_t Command) { uint16_t BlockSize; char MemoryType; bool HighByte = false; uint8_t LowByte = 0; BlockSize = (FetchNextCommandByte() << 8); BlockSize |= FetchNextCommandByte(); MemoryType = FetchNextCommandByte(); if ((MemoryType != 'E') && (MemoryType != 'F')) { /* Send error byte back to the host */ WriteNextResponseByte('?'); return; } /* Disable timer 1 interrupt - can't afford to process nonessential interrupts * while doing SPM tasks */ TIMSK1 = 0; /* Check if command is to read memory */ if (Command == 'g') { /* Re-enable RWW section */ boot_rww_enable(); while (BlockSize--) { if (MemoryType == 'F') { /* Read the next FLASH byte from the current FLASH page */ #if (FLASHEND > 0xFFFF) WriteNextResponseByte(pgm_read_byte_far(CurrAddress | HighByte)); #else WriteNextResponseByte(pgm_read_byte(CurrAddress | HighByte)); #endif /* If both bytes in current word have been read, increment the address counter */ if (HighByte) CurrAddress += 2; HighByte = !HighByte; } else { /* Read the next EEPROM byte into the endpoint */ WriteNextResponseByte(eeprom_read_byte((uint8_t*)(intptr_t)(CurrAddress >> 1))); /* Increment the address counter after use */ CurrAddress += 2; } } } else { uint32_t PageStartAddress = CurrAddress; if (MemoryType == 'F') { boot_page_erase(PageStartAddress); boot_spm_busy_wait(); } while (BlockSize--) { if (MemoryType == 'F') { /* If both bytes in current word have been written, increment the address counter */ if (HighByte) { /* Write the next FLASH word to the current FLASH page */ boot_page_fill(CurrAddress, ((FetchNextCommandByte() << 8) | LowByte)); /* Increment the address counter after use */ CurrAddress += 2; } else { LowByte = FetchNextCommandByte(); } HighByte = !HighByte; } else { /* Write the next EEPROM byte from the endpoint */ eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); /* Increment the address counter after use */ CurrAddress += 2; } } /* If in FLASH programming mode, commit the page after writing */ if (MemoryType == 'F') { /* Commit the flash page to memory */ boot_page_write(PageStartAddress); /* Wait until write operation has completed */ boot_spm_busy_wait(); } /* Send response byte back to the host */ WriteNextResponseByte('\r'); } /* Re-enable timer 1 interrupt disabled earlier in this routine */ TIMSK1 = (1 << OCIE1A); } #endif /** Retrieves the next byte from the host in the CDC data OUT endpoint, and clears the endpoint bank if needed * to allow reception of the next data packet from the host. * * \return Next received byte from the host in the CDC data OUT endpoint */ static uint8_t FetchNextCommandByte(void) { /* Select the OUT endpoint so that the next data byte can be read */ Endpoint_SelectEndpoint(CDC_RX_EPNUM); /* If OUT endpoint empty, clear it and wait for the next packet from the host */ while (!(Endpoint_IsReadWriteAllowed())) { Endpoint_ClearOUT(); while (!(Endpoint_IsOUTReceived())) { if (USB_DeviceState == DEVICE_STATE_Unattached) return 0; } } /* Fetch the next byte from the OUT endpoint */ return Endpoint_Read_8(); } /** Writes the next response byte to the CDC data IN endpoint, and sends the endpoint back if needed to free up the * bank when full ready for the next byte in the packet to the host. * * \param[in] Response Next response byte to send to the host */ static void WriteNextResponseByte(const uint8_t Response) { /* Select the IN endpoint so that the next data byte can be written */ Endpoint_SelectEndpoint(CDC_TX_EPNUM); /* If IN endpoint full, clear it and wait until ready for the next packet to the host */ if (!(Endpoint_IsReadWriteAllowed())) { Endpoint_ClearIN(); while (!(Endpoint_IsINReady())) { if (USB_DeviceState == DEVICE_STATE_Unattached) return; } } /* Write the next byte to the IN endpoint */ Endpoint_Write_8(Response); TX_LED_ON(); TxLEDPulse = TX_RX_LED_PULSE_PERIOD; } #define STK_OK 0x10 #define STK_INSYNC 0x14 // ' ' #define CRC_EOP 0x20 // 'SPACE' #define STK_GET_SYNC 0x30 // '0' #define STK_GET_PARAMETER 0x41 // 'A' #define STK_SET_DEVICE 0x42 // 'B' #define STK_SET_DEVICE_EXT 0x45 // 'E' #define STK_LOAD_ADDRESS 0x55 // 'U' #define STK_UNIVERSAL 0x56 // 'V' #define STK_PROG_PAGE 0x64 // 'd' #define STK_READ_PAGE 0x74 // 't' #define STK_READ_SIGN 0x75 // 'u' /** Task to read in AVR910 commands from the CDC data OUT endpoint, process them, perform the required actions * and send the appropriate response back to the host. */ void CDC_Task(void) { /* Select the OUT endpoint */ Endpoint_SelectEndpoint(CDC_RX_EPNUM); /* Check if endpoint has a command in it sent from the host */ if (!(Endpoint_IsOUTReceived())) return; RX_LED_ON(); RxLEDPulse = TX_RX_LED_PULSE_PERIOD; /* Read in the bootloader command (first byte sent from host) */ uint8_t Command = FetchNextCommandByte(); if (Command == 'E') { /* We nearly run out the bootloader timeout clock, * leaving just a few hundred milliseconds so the * bootloder has time to respond and service any * subsequent requests */ Timeout = TIMEOUT_PERIOD - 500; /* Re-enable RWW section - must be done here in case * user has disabled verification on upload. */ boot_rww_enable_safe(); // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if (Command == 'T') { FetchNextCommandByte(); // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if ((Command == 'L') || (Command == 'P')) { // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if (Command == 't') { // Return ATMEGA128 part code - this is only to allow AVRProg to use the bootloader WriteNextResponseByte(0x44); WriteNextResponseByte(0x00); } else if (Command == 'a') { // Indicate auto-address increment is supported WriteNextResponseByte('Y'); } else if (Command == 'A') { // Set the current address to that given by the host CurrAddress = (FetchNextCommandByte() << 9); CurrAddress |= (FetchNextCommandByte() << 1); // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if (Command == 'p') { // Indicate serial programmer back to the host WriteNextResponseByte('S'); } else if (Command == 'S') { // Write the 7-byte software identifier to the endpoint for (uint8_t CurrByte = 0; CurrByte < 7; CurrByte++) WriteNextResponseByte(SOFTWARE_IDENTIFIER[CurrByte]); } else if (Command == 'V') { WriteNextResponseByte('0' + BOOTLOADER_VERSION_MAJOR); WriteNextResponseByte('0' + BOOTLOADER_VERSION_MINOR); } else if (Command == 's') { WriteNextResponseByte(AVR_SIGNATURE_3); WriteNextResponseByte(AVR_SIGNATURE_2); WriteNextResponseByte(AVR_SIGNATURE_1); } else if (Command == 'e') { // Clear the application section of flash for (uint32_t CurrFlashAddress = 0; CurrFlashAddress < BOOT_START_ADDR; CurrFlashAddress += SPM_PAGESIZE) { boot_page_erase(CurrFlashAddress); boot_spm_busy_wait(); boot_page_write(CurrFlashAddress); boot_spm_busy_wait(); } // Send confirmation byte back to the host WriteNextResponseByte('\r'); } #if !defined(NO_LOCK_BYTE_WRITE_SUPPORT) else if (Command == 'l') { // Set the lock bits to those given by the host boot_lock_bits_set(FetchNextCommandByte()); // Send confirmation byte back to the host WriteNextResponseByte('\r'); } #endif else if (Command == 'r') { WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOCK_BITS)); } else if (Command == 'F') { WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS)); } else if (Command == 'N') { WriteNextResponseByte(boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS)); } else if (Command == 'Q') { WriteNextResponseByte(boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS)); } #if !defined(NO_BLOCK_SUPPORT) else if (Command == 'b') { WriteNextResponseByte('Y'); // Send block size to the host WriteNextResponseByte(SPM_PAGESIZE >> 8); WriteNextResponseByte(SPM_PAGESIZE & 0xFF); } else if ((Command == 'B') || (Command == 'g')) { // Keep resetting the timeout counter if we're receiving self-programming instructions Timeout = 0; // Delegate the block write/read to a separate function for clarity ReadWriteMemoryBlock(Command); } #endif #if !defined(NO_FLASH_BYTE_SUPPORT) else if (Command == 'C') { // Write the high byte to the current flash page boot_page_fill(CurrAddress, FetchNextCommandByte()); // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if (Command == 'c') { // Write the low byte to the current flash page boot_page_fill(CurrAddress | 0x01, FetchNextCommandByte()); // Increment the address CurrAddress += 2; // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if (Command == 'm') { // Commit the flash page to memory boot_page_write(CurrAddress); // Wait until write operation has completed boot_spm_busy_wait(); // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if (Command == 'R') { #if (FLASHEND > 0xFFFF) uint16_t ProgramWord = pgm_read_word_far(CurrAddress); #else uint16_t ProgramWord = pgm_read_word(CurrAddress); #endif WriteNextResponseByte(ProgramWord >> 8); WriteNextResponseByte(ProgramWord & 0xFF); } #endif #if !defined(NO_EEPROM_BYTE_SUPPORT) else if (Command == 'D') { // Read the byte from the endpoint and write it to the EEPROM eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); // Increment the address after use CurrAddress += 2; // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if (Command == 'd') { // Read the EEPROM byte and write it to the endpoint WriteNextResponseByte(eeprom_read_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)))); // Increment the address after use CurrAddress += 2; } #endif else if (Command != 27) { // Unknown (non-sync) command, return fail code WriteNextResponseByte('?'); } /* Select the IN endpoint */ Endpoint_SelectEndpoint(CDC_TX_EPNUM); /* Remember if the endpoint is completely full before clearing it */ bool IsEndpointFull = !(Endpoint_IsReadWriteAllowed()); /* Send the endpoint data to the host */ Endpoint_ClearIN(); /* If a full endpoint's worth of data was sent, we need to send an empty packet afterwards to signal end of transfer */ if (IsEndpointFull) { while (!(Endpoint_IsINReady())) { if (USB_DeviceState == DEVICE_STATE_Unattached) return; } Endpoint_ClearIN(); } /* Wait until the data has been sent to the host */ while (!(Endpoint_IsINReady())) { if (USB_DeviceState == DEVICE_STATE_Unattached) return; } /* Select the OUT endpoint */ Endpoint_SelectEndpoint(CDC_RX_EPNUM); /* Acknowledge the command from the host */ Endpoint_ClearOUT(); } ================================================ FILE: external/arduino/avr/bootloaders/caterina-Arduino_Robot/Caterina.h ================================================ /* LUFA Library Copyright (C) Dean Camera, 2011. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /** \file * * Header file for BootloaderCDC.c. */ #ifndef _CDC_H_ #define _CDC_H_ /* Includes: */ #include #include #include #include #include #include #include #include "Descriptors.h" #include /* Macros: */ /** Version major of the CDC bootloader. */ #define BOOTLOADER_VERSION_MAJOR 0x01 /** Version minor of the CDC bootloader. */ #define BOOTLOADER_VERSION_MINOR 0x00 /** Hardware version major of the CDC bootloader. */ #define BOOTLOADER_HWVERSION_MAJOR 0x01 /** Hardware version minor of the CDC bootloader. */ #define BOOTLOADER_HWVERSION_MINOR 0x00 /** Eight character bootloader firmware identifier reported to the host when requested */ #define SOFTWARE_IDENTIFIER "CATERINA" #define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) #define LED_SETUP() DDRC |= (1<<7); DDRB |= (1<<0); DDRD |= (1<<5); #define L_LED_OFF() PORTC &= ~(1<<7) #define L_LED_ON() PORTC |= (1<<7) #define L_LED_TOGGLE() PORTC ^= (1<<7) #if DEVICE_PID == 0x0037 // polarity of the RX and TX LEDs is reversed on the Micro #define TX_LED_OFF() PORTD &= ~(1<<5) #define TX_LED_ON() PORTD |= (1<<5) #define RX_LED_OFF() PORTB &= ~(1<<0) #define RX_LED_ON() PORTB |= (1<<0) #else #define TX_LED_OFF() PORTD |= (1<<5) #define TX_LED_ON() PORTD &= ~(1<<5) #define RX_LED_OFF() PORTB |= (1<<0) #define RX_LED_ON() PORTB &= ~(1<<0) #endif /* Type Defines: */ /** Type define for a non-returning pointer to the start of the loaded application in flash memory. */ typedef void (*AppPtr_t)(void) ATTR_NO_RETURN; /* Function Prototypes: */ void StartSketch(void); void LEDPulse(void); void CDC_Task(void); void SetupHardware(void); void EVENT_USB_Device_ConfigurationChanged(void); #if defined(INCLUDE_FROM_CATERINA_C) || defined(__DOXYGEN__) #if !defined(NO_BLOCK_SUPPORT) static void ReadWriteMemoryBlock(const uint8_t Command); #endif static uint8_t FetchNextCommandByte(void); static void WriteNextResponseByte(const uint8_t Response); #endif #endif ================================================ FILE: external/arduino/avr/bootloaders/caterina-Arduino_Robot/Descriptors.c ================================================ /* LUFA Library Copyright (C) Dean Camera, 2011. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /** \file * * USB Device Descriptors, for library use when in USB device mode. Descriptors are special * computer-readable structures which the host requests upon device enumeration, to determine * the device's capabilities and functions. */ #include "Descriptors.h" /** Device descriptor structure. This descriptor, located in SRAM memory, describes the overall * device characteristics, including the supported USB version, control endpoint size and the * number of device configurations. The descriptor is read out by the USB host when the enumeration * process begins. */ const USB_Descriptor_Device_t DeviceDescriptor = { .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, .USBSpecification = VERSION_BCD(01.10), .Class = CDC_CSCP_CDCClass, .SubClass = CDC_CSCP_NoSpecificSubclass, .Protocol = CDC_CSCP_NoSpecificProtocol, .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, .VendorID = DEVICE_VID, .ProductID = DEVICE_PID, .ReleaseNumber = VERSION_BCD(00.01), .ManufacturerStrIndex = 0x02, .ProductStrIndex = 0x01, .SerialNumStrIndex = NO_DESCRIPTOR, .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS }; /** Configuration descriptor structure. This descriptor, located in SRAM memory, describes the usage * of the device in one of its supported configurations, including information about any device interfaces * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting * a configuration so that the host may correctly communicate with the USB device. */ const USB_Descriptor_Configuration_t ConfigurationDescriptor = { .Config = { .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), .TotalInterfaces = 2, .ConfigurationNumber = 1, .ConfigurationStrIndex = NO_DESCRIPTOR, .ConfigAttributes = USB_CONFIG_ATTR_BUSPOWERED, .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) }, .CDC_CCI_Interface = { .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, .InterfaceNumber = 0, .AlternateSetting = 0, .TotalEndpoints = 1, .Class = CDC_CSCP_CDCClass, .SubClass = CDC_CSCP_ACMSubclass, .Protocol = CDC_CSCP_ATCommandProtocol, .InterfaceStrIndex = NO_DESCRIPTOR }, .CDC_Functional_Header = { .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t), .Type = DTYPE_CSInterface}, .Subtype = 0x00, .CDCSpecification = VERSION_BCD(01.10), }, .CDC_Functional_ACM = { .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = DTYPE_CSInterface}, .Subtype = 0x02, .Capabilities = 0x04, }, .CDC_Functional_Union = { .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = DTYPE_CSInterface}, .Subtype = 0x06, .MasterInterfaceNumber = 0, .SlaveInterfaceNumber = 1, }, .CDC_NotificationEndpoint = { .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, .EndpointAddress = (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM), .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), .EndpointSize = CDC_NOTIFICATION_EPSIZE, .PollingIntervalMS = 0xFF }, .CDC_DCI_Interface = { .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, .InterfaceNumber = 1, .AlternateSetting = 0, .TotalEndpoints = 2, .Class = CDC_CSCP_CDCDataClass, .SubClass = CDC_CSCP_NoDataSubclass, .Protocol = CDC_CSCP_NoDataProtocol, .InterfaceStrIndex = NO_DESCRIPTOR }, .CDC_DataOutEndpoint = { .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, .EndpointAddress = (ENDPOINT_DIR_OUT | CDC_RX_EPNUM), .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), .EndpointSize = CDC_TXRX_EPSIZE, .PollingIntervalMS = 0x01 }, .CDC_DataInEndpoint = { .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, .EndpointAddress = (ENDPOINT_DIR_IN | CDC_TX_EPNUM), .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), .EndpointSize = CDC_TXRX_EPSIZE, .PollingIntervalMS = 0x01 } }; /** Language descriptor structure. This descriptor, located in SRAM memory, is returned when the host requests * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate * via the language ID table available at USB.org what languages the device supports for its string descriptors. */ const USB_Descriptor_String_t LanguageString = { .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, .UnicodeString = {LANGUAGE_ID_ENG} }; /** Product descriptor string. This is a Unicode string containing the product's details in human readable form, * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device * Descriptor. */ const USB_Descriptor_String_t ProductString = { .Header = {.Size = USB_STRING_LEN(19), .Type = DTYPE_String}, #if DEVICE_PID == 0x0036 .UnicodeString = L"Arduino Leonardo" #elif DEVICE_PID == 0x0037 .UnicodeString = L"Arduino Micro " #elif DEVICE_PID == 0x0038 .UnicodeString = L"Robot Control Board" #elif DEVICE_PID == 0x0039 .UnicodeString = L"Robot Motor Board " #elif DEVICE_PID == 0x003C .UnicodeString = L"Arduino Esplora " #else .UnicodeString = L"USB IO board " #endif }; const USB_Descriptor_String_t ManufacturerString = { .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, #if DEVICE_VID == 0x2341 .UnicodeString = L"Arduino LLC" #else .UnicodeString = L"Unknown " #endif }; /** This function is called by the library when in device mode, and must be overridden (see LUFA library "USB Descriptors" * documentation) by the application code so that the address and size of a requested descriptor can be given * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the * USB host. */ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex, const void** const DescriptorAddress) { const uint8_t DescriptorType = (wValue >> 8); const uint8_t DescriptorNumber = (wValue & 0xFF); const void* Address = NULL; uint16_t Size = NO_DESCRIPTOR; switch (DescriptorType) { case DTYPE_Device: Address = &DeviceDescriptor; Size = sizeof(USB_Descriptor_Device_t); break; case DTYPE_Configuration: Address = &ConfigurationDescriptor; Size = sizeof(USB_Descriptor_Configuration_t); break; case DTYPE_String: if (!(DescriptorNumber)) { Address = &LanguageString; Size = LanguageString.Header.Size; } else if (DescriptorNumber == DeviceDescriptor.ProductStrIndex) { Address = &ProductString; Size = ProductString.Header.Size; } else if (DescriptorNumber == DeviceDescriptor.ManufacturerStrIndex) { Address = &ManufacturerString; Size = ManufacturerString.Header.Size; } break; } *DescriptorAddress = Address; return Size; } ================================================ FILE: external/arduino/avr/bootloaders/caterina-Arduino_Robot/Descriptors.h ================================================ /* LUFA Library Copyright (C) Dean Camera, 2011. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /** \file * * Header file for Descriptors.c. */ #ifndef _DESCRIPTORS_H_ #define _DESCRIPTORS_H_ /* Includes: */ #include /* Macros: */ #if defined(__AVR_AT90USB1287__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x97 #define AVR_SIGNATURE_3 0x82 #elif defined(__AVR_AT90USB647__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x96 #define AVR_SIGNATURE_3 0x82 #elif defined(__AVR_AT90USB1286__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x97 #define AVR_SIGNATURE_3 0x82 #elif defined(__AVR_AT90USB646__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x96 #define AVR_SIGNATURE_3 0x82 #elif defined(__AVR_ATmega32U6__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x95 #define AVR_SIGNATURE_3 0x88 #elif defined(__AVR_ATmega32U4__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x95 #define AVR_SIGNATURE_3 0x87 #elif defined(__AVR_ATmega16U4__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x94 #define AVR_SIGNATURE_3 0x88 #elif defined(__AVR_ATmega32U2__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x95 #define AVR_SIGNATURE_3 0x8A #elif defined(__AVR_ATmega16U2__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x94 #define AVR_SIGNATURE_3 0x89 #elif defined(__AVR_AT90USB162__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x94 #define AVR_SIGNATURE_3 0x82 #elif defined(__AVR_ATmega8U2__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x93 #define AVR_SIGNATURE_3 0x89 #elif defined(__AVR_AT90USB82__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x94 #define AVR_SIGNATURE_3 0x82 #else #error The selected AVR part is not currently supported by this bootloader. #endif /** Endpoint number for the CDC control interface event notification endpoint. */ #define CDC_NOTIFICATION_EPNUM 2 /** Endpoint number for the CDC data interface TX (data IN) endpoint. */ #define CDC_TX_EPNUM 3 /** Endpoint number for the CDC data interface RX (data OUT) endpoint. */ #define CDC_RX_EPNUM 4 /** Size of the CDC data interface TX and RX data endpoint banks, in bytes. */ #define CDC_TXRX_EPSIZE 16 /** Size of the CDC control interface notification endpoint bank, in bytes. */ #define CDC_NOTIFICATION_EPSIZE 8 /* Type Defines: */ /** Type define for the device configuration descriptor structure. This must be defined in the * application code, as the configuration descriptor contains several sub-descriptors which * vary between devices, and which describe the device's usage to the host. */ typedef struct { USB_Descriptor_Configuration_Header_t Config; // CDC Control Interface USB_Descriptor_Interface_t CDC_CCI_Interface; USB_CDC_Descriptor_FunctionalHeader_t CDC_Functional_Header; USB_CDC_Descriptor_FunctionalACM_t CDC_Functional_ACM; USB_CDC_Descriptor_FunctionalUnion_t CDC_Functional_Union; USB_Descriptor_Endpoint_t CDC_NotificationEndpoint; // CDC Data Interface USB_Descriptor_Interface_t CDC_DCI_Interface; USB_Descriptor_Endpoint_t CDC_DataOutEndpoint; USB_Descriptor_Endpoint_t CDC_DataInEndpoint; } USB_Descriptor_Configuration_t; /* Function Prototypes: */ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex, const void** const DescriptorAddress) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); #endif ================================================ FILE: external/arduino/avr/bootloaders/caterina-Arduino_Robot/Makefile ================================================ # Hey Emacs, this is a -*- makefile -*- #---------------------------------------------------------------------------- # WinAVR Makefile Template written by Eric B. Weddington, Jrg Wunsch, et al. # >> Modified for use with the LUFA project. << # # Released to the Public Domain # # Additional material for this makefile was written by: # Peter Fleury # Tim Henigan # Colin O'Flynn # Reiner Patommel # Markus Pfaff # Sander Pool # Frederik Rouleau # Carlos Lamas # Dean Camera # Opendous Inc. # Denver Gingerich # #---------------------------------------------------------------------------- # On command line: # # make all = Make software. # # make clean = Clean out built project files. # # make coff = Convert ELF to AVR COFF. # # make extcoff = Convert ELF to AVR Extended COFF. # # make program = Download the hex file to the device, using avrdude. # Please customize the avrdude settings below first! # # make doxygen = Generate DoxyGen documentation for the project (must have # DoxyGen installed) # # make debug = Start either simulavr or avarice as specified for debugging, # with avr-gdb or avr-insight as the front end for debugging. # # make filename.s = Just compile filename.c into the assembler code only. # # make filename.i = Create a preprocessed source file for use in submitting # bug reports to the GCC project. # # To rebuild project do "make clean" then "make all". #---------------------------------------------------------------------------- # USB vendor ID (VID) # reuse of this VID by others is forbidden by USB-IF # official Arduino LLC VID VID = 0x2341 # USB product ID (PID) # official Leonardo PID # PID = 0x0036 # official Micro PID # PID = 0x0037 # official Arduino Robot Control Board PID PID = 0x0038 # official Arduino Robot Motor Board PID # PID = 0x0039 # official Esplora PID # PID = 0x003C # MCU name MCU = atmega32u4 # Target architecture (see library "Board Types" documentation). ARCH = AVR8 # Target board (see library "Board Types" documentation, NONE for projects not requiring # LUFA board drivers). If USER is selected, put custom board drivers in a directory called # "Board" inside the application directory. BOARD = USER # Processor frequency. # This will define a symbol, F_CPU, in all source code files equal to the # processor frequency in Hz. You can then use this symbol in your source code to # calculate timings. Do NOT tack on a 'UL' at the end, this will be done # automatically to create a 32-bit value in your source code. # # This will be an integer division of F_USB below, as it is sourced by # F_USB after it has run through any CPU prescalers. Note that this value # does not *change* the processor frequency - it should merely be updated to # reflect the processor speed set externally so that the code can use accurate # software delays. F_CPU = 16000000 # Input clock frequency. # This will define a symbol, F_USB, in all source code files equal to the # input clock frequency (before any prescaling is performed) in Hz. This value may # differ from F_CPU if prescaling is used on the latter, and is required as the # raw input clock is fed directly to the PLL sections of the AVR for high speed # clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' # at the end, this will be done automatically to create a 32-bit value in your # source code. # # If no clock division is performed on the input clock inside the AVR (via the # CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. F_USB = $(F_CPU) # Starting byte address of the bootloader, as a byte address - computed via the formula # BOOT_START = ((FLASH_SIZE_KB - BOOT_SECTION_SIZE_KB) * 1024) # # Note that the bootloader size and start address given in AVRStudio is in words and not # bytes, and so will need to be doubled to obtain the byte address needed by AVR-GCC. FLASH_SIZE_KB = 32 BOOT_SECTION_SIZE_KB = 4 BOOT_START = 0x$(shell echo "obase=16; ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024" | bc) # Output format. (can be srec, ihex, binary) FORMAT = ihex # Target file name (without extension). TARGET = Caterina # Object files directory # To put object files in current directory, use a dot (.), do NOT make # this an empty or blank macro! OBJDIR = . # Path to the LUFA library LUFA_PATH = LUFA-111009 # LUFA library compile-time options and predefined tokens LUFA_OPTS = -D USB_DEVICE_ONLY LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0 LUFA_OPTS += -D ORDERED_EP_CONFIG LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8 LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 LUFA_OPTS += -D USE_RAM_DESCRIPTORS LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" LUFA_OPTS += -D NO_INTERNAL_SERIAL LUFA_OPTS += -D NO_DEVICE_SELF_POWER LUFA_OPTS += -D NO_DEVICE_REMOTE_WAKEUP LUFA_OPTS += -D NO_SOF_EVENTS #LUFA_OPTS += -D NO_BLOCK_SUPPORT #LUFA_OPTS += -D NO_EEPROM_BYTE_SUPPORT #LUFA_OPTS += -D NO_FLASH_BYTE_SUPPORT LUFA_OPTS += -D NO_LOCK_BYTE_WRITE_SUPPORT # Create the LUFA source path variables by including the LUFA root makefile include $(LUFA_PATH)/LUFA/makefile # List C source files here. (C dependencies are automatically generated.) SRC = $(TARGET).c \ Descriptors.c \ $(LUFA_SRC_USB) \ # List C++ source files here. (C dependencies are automatically generated.) CPPSRC = # List Assembler source files here. # Make them always end in a capital .S. Files ending in a lowercase .s # will not be considered source files but generated files (assembler # output from the compiler), and will be deleted upon "make clean"! # Even though the DOS/Win* filesystem matches both .s and .S the same, # it will preserve the spelling of the filenames, and gcc itself does # care about how the name is spelled on its command-line. ASRC = # Optimization level, can be [0, 1, 2, 3, s]. # 0 = turn off optimization. s = optimize for size. # (Note: 3 is not always the best optimization level. See avr-libc FAQ.) OPT = s # Debugging format. # Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. # AVR Studio 4.10 requires dwarf-2. # AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. DEBUG = dwarf-2 # List any extra directories to look for include files here. # Each directory must be seperated by a space. # Use forward slashes for directory separators. # For a directory that has spaces, enclose it in quotes. EXTRAINCDIRS = $(LUFA_PATH)/ # Compiler flag to set the C Standard level. # c89 = "ANSI" C # gnu89 = c89 plus GCC extensions # c99 = ISO C99 standard (not yet fully implemented) # gnu99 = c99 plus GCC extensions CSTANDARD = -std=c99 # Place -D or -U options here for C sources CDEFS = -DF_CPU=$(F_CPU)UL CDEFS += -DF_USB=$(F_USB)UL CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH) CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL CDEFS += -DDEVICE_VID=$(VID)UL CDEFS += -DDEVICE_PID=$(PID)UL CDEFS += $(LUFA_OPTS) # Place -D or -U options here for ASM sources ADEFS = -DF_CPU=$(F_CPU) ADEFS += -DF_USB=$(F_USB)UL ADEFS += -DBOARD=BOARD_$(BOARD) ADEFS += -DBOOT_START_ADDR=$(BOOT_START)UL ADEFS += $(LUFA_OPTS) # Place -D or -U options here for C++ sources CPPDEFS = -DF_CPU=$(F_CPU)UL CPPDEFS += -DF_USB=$(F_USB)UL CPPDEFS += -DBOARD=BOARD_$(BOARD) CPPDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL CPPDEFS += $(LUFA_OPTS) #CPPDEFS += -D__STDC_LIMIT_MACROS #CPPDEFS += -D__STDC_CONSTANT_MACROS #---------------- Compiler Options C ---------------- # -g*: generate debugging information # -O*: optimization level # -f...: tuning, see GCC manual and avr-libc documentation # -Wall...: warning level # -Wa,...: tell GCC to pass this to the assembler. # -adhlns...: create assembler listing CFLAGS = -g$(DEBUG) CFLAGS += $(CDEFS) CFLAGS += -O$(OPT) CFLAGS += -funsigned-char CFLAGS += -funsigned-bitfields CFLAGS += -ffunction-sections CFLAGS += -fno-inline-small-functions CFLAGS += -fpack-struct CFLAGS += -fshort-enums CFLAGS += -fno-strict-aliasing CFLAGS += -Wall CFLAGS += -Wstrict-prototypes #CFLAGS += -mshort-calls #CFLAGS += -fno-unit-at-a-time #CFLAGS += -Wundef #CFLAGS += -Wunreachable-code #CFLAGS += -Wsign-compare CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) CFLAGS += $(CSTANDARD) #---------------- Compiler Options C++ ---------------- # -g*: generate debugging information # -O*: optimization level # -f...: tuning, see GCC manual and avr-libc documentation # -Wall...: warning level # -Wa,...: tell GCC to pass this to the assembler. # -adhlns...: create assembler listing CPPFLAGS = -g$(DEBUG) CPPFLAGS += $(CPPDEFS) CPPFLAGS += -O$(OPT) CPPFLAGS += -funsigned-char CPPFLAGS += -funsigned-bitfields CPPFLAGS += -fpack-struct CPPFLAGS += -fshort-enums CPPFLAGS += -fno-exceptions CPPFLAGS += -Wall CPPFLAGS += -Wundef #CPPFLAGS += -mshort-calls #CPPFLAGS += -fno-unit-at-a-time #CPPFLAGS += -Wstrict-prototypes #CPPFLAGS += -Wunreachable-code #CPPFLAGS += -Wsign-compare CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) #CPPFLAGS += $(CSTANDARD) #---------------- Assembler Options ---------------- # -Wa,...: tell GCC to pass this to the assembler. # -adhlns: create listing # -gstabs: have the assembler create line number information; note that # for use in COFF files, additional information about filenames # and function names needs to be present in the assembler source # files -- see avr-libc docs [FIXME: not yet described there] # -listing-cont-lines: Sets the maximum number of continuation lines of hex # dump that will be displayed for a given single line of source input. ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 #---------------- Library Options ---------------- # Minimalistic printf version PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min # Floating point printf version (requires MATH_LIB = -lm below) PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt # If this is left blank, then it will use the Standard printf version. PRINTF_LIB = #PRINTF_LIB = $(PRINTF_LIB_MIN) #PRINTF_LIB = $(PRINTF_LIB_FLOAT) # Minimalistic scanf version SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min # Floating point + %[ scanf version (requires MATH_LIB = -lm below) SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt # If this is left blank, then it will use the Standard scanf version. SCANF_LIB = #SCANF_LIB = $(SCANF_LIB_MIN) #SCANF_LIB = $(SCANF_LIB_FLOAT) MATH_LIB = -lm # List any extra directories to look for libraries here. # Each directory must be seperated by a space. # Use forward slashes for directory separators. # For a directory that has spaces, enclose it in quotes. EXTRALIBDIRS = #---------------- External Memory Options ---------------- # 64 KB of external RAM, starting after internal RAM (ATmega128!), # used for variables (.data/.bss) and heap (malloc()). #EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff # 64 KB of external RAM, starting after internal RAM (ATmega128!), # only used for heap (malloc()). #EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff EXTMEMOPTS = #---------------- Linker Options ---------------- # -Wl,...: tell GCC to pass this to linker. # -Map: create map file # --cref: add cross reference to map file LDFLAGS = -Wl,-Map=$(TARGET).map,--cref LDFLAGS += -Wl,--section-start=.text=$(BOOT_START) LDFLAGS += -Wl,--relax LDFLAGS += -Wl,--gc-sections LDFLAGS += $(EXTMEMOPTS) LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) #LDFLAGS += -T linker_script.x #---------------- Programming Options (avrdude) ---------------- # Programming hardware # Type: avrdude -c ? # to get a full listing. # #AVRDUDE_PROGRAMMER = avrispmkII AVRDUDE_PROGRAMMER = usbtiny # com1 = serial port. Use lpt1 to connect to parallel port. AVRDUDE_PORT = usb AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex #AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep # Uncomment the following if you want avrdude's erase cycle counter. # Note that this counter needs to be initialized first using -Yn, # see avrdude manual. #AVRDUDE_ERASE_COUNTER = -y # Uncomment the following if you do /not/ wish a verification to be # performed after programming the device. #AVRDUDE_NO_VERIFY = -V # Increase verbosity level. Please use this when submitting bug # reports about avrdude. See # to submit bug reports. #AVRDUDE_VERBOSE = -v -v AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) #---------------- Debugging Options ---------------- # For simulavr only - target MCU frequency. DEBUG_MFREQ = $(F_CPU) # Set the DEBUG_UI to either gdb or insight. # DEBUG_UI = gdb DEBUG_UI = insight # Set the debugging back-end to either avarice, simulavr. DEBUG_BACKEND = avarice #DEBUG_BACKEND = simulavr # GDB Init Filename. GDBINIT_FILE = __avr_gdbinit # When using avarice settings for the JTAG JTAG_DEV = /dev/com1 # Debugging port used to communicate between GDB / avarice / simulavr. DEBUG_PORT = 4242 # Debugging host used to communicate between GDB / avarice / simulavr, normally # just set to localhost unless doing some sort of crazy debugging when # avarice is running on a different computer. DEBUG_HOST = localhost #============================================================================ # Define programs and commands. SHELL = sh CC = avr-gcc OBJCOPY = avr-objcopy OBJDUMP = avr-objdump SIZE = avr-size AR = avr-ar rcs NM = avr-nm #AVRDUDE = /Applications/avrdude -C /Applications/avrdude.conf -B 1 AVRDUDE = /home/david/tmp/Arduino-master/build/linux/dist/tools/avrdude -B 1 -C /home/david/tmp/Arduino-master/build/linux/dist/tools/avrdude.conf REMOVE = rm -f REMOVEDIR = rm -rf COPY = cp WINSHELL = cmd # Define Messages # English MSG_ERRORS_NONE = Errors: none MSG_BEGIN = -------- begin -------- MSG_END = -------- end -------- MSG_SIZE_BEFORE = Size before: MSG_SIZE_AFTER = Size after: MSG_COFF = Converting to AVR COFF: MSG_EXTENDED_COFF = Converting to AVR Extended COFF: MSG_FLASH = Creating load file for Flash: MSG_EEPROM = Creating load file for EEPROM: MSG_EXTENDED_LISTING = Creating Extended Listing: MSG_SYMBOL_TABLE = Creating Symbol Table: MSG_LINKING = Linking: MSG_COMPILING = Compiling C: MSG_COMPILING_CPP = Compiling C++: MSG_ASSEMBLING = Assembling: MSG_CLEANING = Cleaning project: MSG_CREATING_LIBRARY = Creating library: # Define all object files. OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) # Define all listing files. LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) # Compiler flags to generate dependency files. GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d # Combine all necessary flags and optional flags. # Add target processor to flags. ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) # Default target. all: begin gccversion sizebefore build sizeafter end # Change the build target to build a HEX file or a library. build: elf hex eep lss sym #build: lib elf: $(TARGET).elf hex: $(TARGET).hex eep: $(TARGET).eep lss: $(TARGET).lss sym: $(TARGET).sym LIBNAME=lib$(TARGET).a lib: $(LIBNAME) # Eye candy. # AVR Studio 3.x does not check make's exit code but relies on # the following magic strings to be generated by the compile job. begin: @echo @echo $(MSG_BEGIN) end: @echo $(MSG_END) @echo # Display size of file. HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) sizebefore: @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ 2>/dev/null; echo; fi sizeafter: @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ 2>/dev/null; echo; fi # Display compiler version information. gccversion : @$(CC) --version # Program the device. program: $(TARGET).hex $(TARGET).eep $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) # Generate avr-gdb config/init file which does the following: # define the reset signal, load the target file, connect to target, and set # a breakpoint at main(). gdb-config: @$(REMOVE) $(GDBINIT_FILE) @echo define reset >> $(GDBINIT_FILE) @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) @echo end >> $(GDBINIT_FILE) @echo file $(TARGET).elf >> $(GDBINIT_FILE) @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) ifeq ($(DEBUG_BACKEND),simulavr) @echo load >> $(GDBINIT_FILE) endif @echo break main >> $(GDBINIT_FILE) debug: gdb-config $(TARGET).elf ifeq ($(DEBUG_BACKEND), avarice) @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) @$(WINSHELL) /c pause else @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ $(DEBUG_MFREQ) --port $(DEBUG_PORT) endif @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) # Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. COFFCONVERT = $(OBJCOPY) --debugging COFFCONVERT += --change-section-address .data-0x800000 COFFCONVERT += --change-section-address .bss-0x800000 COFFCONVERT += --change-section-address .noinit-0x800000 COFFCONVERT += --change-section-address .eeprom-0x810000 coff: $(TARGET).elf @echo @echo $(MSG_COFF) $(TARGET).cof $(COFFCONVERT) -O coff-avr $< $(TARGET).cof extcoff: $(TARGET).elf @echo @echo $(MSG_EXTENDED_COFF) $(TARGET).cof $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof # Create final output files (.hex, .eep) from ELF output file. %.hex: %.elf @echo @echo $(MSG_FLASH) $@ $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@ %.eep: %.elf @echo @echo $(MSG_EEPROM) $@ -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 # Create extended listing file from ELF output file. %.lss: %.elf @echo @echo $(MSG_EXTENDED_LISTING) $@ $(OBJDUMP) -h -S -z $< > $@ # Create a symbol table from ELF output file. %.sym: %.elf @echo @echo $(MSG_SYMBOL_TABLE) $@ $(NM) -n $< > $@ # Create library from object files. .SECONDARY : $(TARGET).a .PRECIOUS : $(OBJ) %.a: $(OBJ) @echo @echo $(MSG_CREATING_LIBRARY) $@ $(AR) $@ $(OBJ) # Link: create ELF output file from object files. .SECONDARY : $(TARGET).elf .PRECIOUS : $(OBJ) %.elf: $(OBJ) @echo @echo $(MSG_LINKING) $@ $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) # Compile: create object files from C source files. $(OBJDIR)/%.o : %.c @echo @echo $(MSG_COMPILING) $< $(CC) -c $(ALL_CFLAGS) $< -o $@ # Compile: create object files from C++ source files. $(OBJDIR)/%.o : %.cpp @echo @echo $(MSG_COMPILING_CPP) $< $(CC) -c $(ALL_CPPFLAGS) $< -o $@ # Compile: create assembler files from C source files. %.s : %.c $(CC) -S $(ALL_CFLAGS) $< -o $@ # Compile: create assembler files from C++ source files. %.s : %.cpp $(CC) -S $(ALL_CPPFLAGS) $< -o $@ # Assemble: create object files from assembler source files. $(OBJDIR)/%.o : %.S @echo @echo $(MSG_ASSEMBLING) $< $(CC) -c $(ALL_ASFLAGS) $< -o $@ # Create preprocessed source for use in sending a bug report. %.i : %.c $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ # Target: clean project. clean: begin clean_list end clean_list : @echo @echo $(MSG_CLEANING) $(REMOVE) $(TARGET).hex $(REMOVE) $(TARGET).eep $(REMOVE) $(TARGET).cof $(REMOVE) $(TARGET).elf $(REMOVE) $(TARGET).map $(REMOVE) $(TARGET).sym $(REMOVE) $(TARGET).lss $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) $(REMOVE) $(SRC:.c=.s) $(REMOVE) $(SRC:.c=.d) $(REMOVE) $(SRC:.c=.i) $(REMOVEDIR) .dep doxygen: @echo Generating Project Documentation \($(TARGET)\)... @doxygen Doxygen.conf @echo Documentation Generation Complete. clean_doxygen: rm -rf Documentation checksource: @for f in $(SRC) $(CPPSRC) $(ASRC); do \ if [ -f $$f ]; then \ echo "Found Source File: $$f" ; \ else \ echo "Source File Not Found: $$f" ; \ fi; done # Create object files directory $(shell mkdir $(OBJDIR) 2>/dev/null) # Include the dependency files. -include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) # Listing of phony targets. .PHONY : all begin finish end sizebefore sizeafter gccversion \ build elf hex eep lss sym coff extcoff doxygen clean \ clean_list clean_doxygen program debug gdb-config checksource ================================================ FILE: external/arduino/avr/bootloaders/caterina-Arduino_Robot/README.md ================================================ Building the bootloader for the Arduino Robot ============================================= The Arduino Robot has two boards featuring the atmega32U4 processor from Atmel. Each one of them is identified as a different board at the USB level and has a different bootloader. The Arduino Robot Control board has the USB identifier 0x0038. This is the value configured by default in the Makefile. The Arduino Robot Motor board has the USB identifier 0x0039. If you want to compile/upload this version of the bootloader, you will have to edit the Makefile, comment away the like dedicated to the PID and uncomment the one that configures such variable accordingly. The general conditions for using these bootloaders require downloading a specific version of LUFA as explained here: 1. Download the LUFA-111009 file (http://fourwalledcubicle.com/blog/2011/10/lufa-111009-released/). 2. Extract that file directly to the Caterina-Arduino_Robot bootloader directory. 3. Open a command prompt in the Caterina-Arduino_Robot bootloader directory. 4. Type 'make'. 5. Enjoy! Programming the bootloader for one of the Arduino Robot boards 1. Open a command prompt in the Caterina-Arduino_Robot folder. 2. Connect your programmer- use a 2x3 .1" header, pressed against the programming vias. 3. Edit the make file for it to include the right programmer (e.g. in my lab I have AVRMKII and USBTINY ISP) 4. Type 'make program' into the command prompt. Differences between this bootoloader and the standard one for Leonardo boards ============================================================================= This bootloader is different from the one on the standard Leonardo boards. To enter the bootloader, you need to double click the reset button. You need to click twice in less that 3/4 of a second (easy uh?). This bootloader, designed in the first place for the LilypadUSB, seems to be optimal for situations when users are e.g. using their robots in soccer competitions where they make direct manipulation of the board as it runs. ================================================ FILE: external/arduino/avr/bootloaders/caterina-LilyPadUSB/Caterina-LilyPadUSB.hex ================================================ :1070000055C000006EC000006CC000006AC00000E7 :1070100068C0000066C0000064C0000062C00000DC :1070200060C000005EC00000FCC400005AC0000048 :1070300058C0000056C0000054C0000052C00000FC :1070400050C000005DC000004CC000004AC00000FD :1070500048C0000046C0000044C0000042C000001C :1070600040C000003EC000003CC000003AC000002C :1070700038C0000036C0000034C0000032C000003C :1070800030C000002EC000002CC000002AC000004C :1070900028C0000026C0000024C0000022C000005C :1070A00020C000001EC000001CC0000011241FBE34 :1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E2E467 :1070C000FFE702C005900D92A83BB107D9F711E088 :1070D000A8EBB1E001C01D92A13DB107E1F74FD38C :1070E0002EC78ECFF89410926F001092810081E02D :1070F00085BF15BE47985D9A289A0C9400000895A4 :107100001F920F920FB60F9211242F938F939F937C :10711000EF93FF9310928500109284008091B80144 :107120009091B901009741F001979093B901809334 :10713000B801892B09F45D9A8091BA019091BB0145 :10714000009741F001979093BB018093BA01892B7E :1071500009F4289A8091BE019091BF010196909305 :10716000BF018093BE01E0E0F0E0859194918F5FD4 :107170009F4F49F08091BC019091BD010196909381 :10718000BD018093BC01FF91EF919F918F912F9151 :107190000F900FBE0F901F90189584E08093E90028 :1071A0000DC08091E8008B778093E80003C08EB318 :1071B000882351F08091E80082FFF9CF8091E800A8 :1071C00085FFEFCF8091F1000895982F83E08093A1 :1071D000E9008091E80085FD0DC08091E8008E7780 :1071E0008093E80003C08EB3882369F08091E800A3 :1071F00080FFF9CF9093F1005D9884E690E0909342 :10720000B9018093B80108954F925F926F927F9277 :107210008F929F92AF92BF92CF92DF92EF92FF92A6 :107220000F931F93CF93DF9384E08093E9008091C5 :10723000E80082FF57C2289884E690E09093BB0153 :107240008093BA01AADF182F853481F48CEA9DE07F :107250009093BD018093BC0107B600FCFDCFF99966 :10726000FECF81E180935700E89503C0843519F47F :1072700094DF8DE00DC28C34E1F38035D1F3843797 :1072800021F484E4A2DF80E003C2813611F489E5B1 :10729000FFC18134B1F481DF182F7FDF90E0880FC8 :1072A000991FAA2797FDA095BA2F312F330F20E001 :1072B000442737FD4095542F822B932BA42BB52BBD :1072C000B8C1803711F483E5E3C1833549F4C0E0E8 :1072D000D1E089917ADF21E0C730D207D1F7D9C157 :1072E000863521F481E371DF80E3D2C1833731F445 :1072F00087E86BDF85E969DF8EE1CAC18536B9F4BD :10730000E0E0F0E093E085E090935700E89507B661 :1073100000FCFDCF80935700E89507B600FCFDCF39 :10732000E058FF4FA0E7E030FA0771F7A2CF8237AD :1073300039F4E1E0F0E089E0809357008491A8C13E :10734000863439F4E0E0F0E089E0809357008491DE :107350009FC18E3439F4E3E0F0E089E08093570078 :10736000849196C1813539F4E2E0F0E089E08093C0 :10737000570084918DC1823631F489E526DF80E0A3 :1073800024DF80E885C1823419F0873609F0E5C032 :107390001092BD011092BC0100DF082FFEDEF82E16 :1073A000FCDE682E8554823008F071C1902F80E099 :1073B000CF2DD0E0C82BD92B10926F00173609F0D3 :1073C0004BC081E180935700E895DD24CC24C39421 :1073D0003FC0E090C101F090C2010091C301109143 :1073E000C401B6E46B16D9F4ED2DF0E0EE29FF29C7 :1073F000E4918E2FEADEDD2081F082E090E0A0E0D3 :10740000B0E0E80EF91E0A1F1B1FE092C101F092C6 :10741000C2010093C3011093C401DC2418C0D80139 :10742000C701B695A7959795879573D5CEDE82E06F :1074300090E0A0E0B0E0E80EF91E0A1F1B1FE092EA :10744000C101F092C2010093C3011093C4012197BE :10745000209709F0BECF7DC08090C1019090C201FD :10746000A090C301B090C40196E4691609F05DC014 :1074700083E0F40180935700E89507B600FCFDCF48 :1074800054C0F6E46F1661F5772031F1E090C10148 :10749000F090C2010091C3011091C4017EDED82E8C :1074A000CC24852D90E08C299D29F7010C01409278 :1074B0005700E895112482E090E0A0E0B0E0E80EEB :1074C000F91E0A1F1B1FE092C101F092C201009336 :1074D000C3011093C40102C060DE582E742423C07F :1074E000E090C101F090C2010091C3011091C4016C :1074F00016950795F794E79450DE682FC70111D5CC :107500008091C1019091C201A091C301B091C401C9 :107510000296A11DB11D8093C1019093C201A09359 :10752000C301B093C401219704C055247724442497 :107530004394209709F0A5CF96E4691641F485E0BD :10754000F40180935700E89507B600FCFDCF8DE06D :107550003CDE82E080936F009CC0833471F4009124 :10756000C1011091C20119DE90E021E0F8010C0187 :1075700020935700E89511247CCE833619F5E090CE :10758000C101F090C2010091C3011091C40105DE58 :10759000F701E16090E021E00C0120935700E895AD :1075A000112482E090E0A0E0B0E0E80EF91E0A1F8E :1075B0001B1FE092C101F092C2010093C30110931E :1075C000C40157CE8D3661F4E091C101F091C20142 :1075D00085E080935700E89507B600FCFDCF49CEC3 :1075E000823551F4E091C101F091C20105911491ED :1075F000812FEBDD802F4CC0843421F5E090C10158 :10760000F090C2010091C3011091C4011695079535 :10761000F794E794C2DD682FC70183D48091C1013C :107620009091C201A091C301B091C4010296A11D25 :10763000B11D8093C1019093C201A093C301B09387 :10764000C40117CE843609F5E090C101F090C20163 :107650000091C3011091C401D801C701B695A79547 :107660009795879556D4B1DD82E090E0A0E0B0E038 :10767000E80EF91E0A1F1B1FE092C101F092C20121 :107680000093C3011093C40104C08B3111F08FE348 :107690009CDD83E08093E9009091E8008091E80010 :1076A0008E778093E80095FF04C010C08EB38823C6 :1076B000C9F08091E80080FFF9CF8091E8008E77D3 :1076C0008093E80003C08EB3882361F08091E800C6 :1076D00080FFF9CF84E08093E9008091E8008B7708 :1076E0008093E800DF91CF911F910F91FF90EF9071 :1076F000DF90CF90BF90AF909F908F907F906F90D2 :107700005F904F9008959091C901892F8F778132B2 :1077100049F58091CA018032A1F0813219F5913A80 :1077200009F58091E800877F8093E8008CE091E084 :1077300067E070E025D28091E8008B778093E800C5 :107740000895913279F48091E800877F8093E80072 :107750008CE091E067E070E077D28091E8008E776E :107760008093E800089582E061EC42E0D1D083E0AC :1077700061E842E1CDD084E060E842E1C9C01F93F6 :10778000209100081092000844B714BE88E10FB69B :10779000F89480936000109260000FBE80E8E0E0F3 :1077A000F0E00FB6F89480936100E09361000FBEA3 :1077B00031E035BF92E095BF3F9A209A559A809369 :1077C00061001092610047985D9A289A1092890092 :1077D0008AEF8093880090936F0083E0809381000C :1077E000859194918F5F9F4F11F03093C001942F3A :1077F00041FF19C0809109012817A9F08093000862 :10780000789480911301882339F08091BE01909182 :10781000BF0188579140C8F310920008F89481E0A6 :10782000809313010CC090FF04C08091C001882395 :1078300051F493FF09C080910901281729F0809124 :10784000C001882309F04EDCD4D078941092BD0199 :107850001092BC011EEF20C0D7DC49D38091BC013F :107860009091BD01815A9F4010F0109213018091B8 :10787000C5019091C60101969093C6018093C50100 :10788000292F97FF03C0512F591B252F220F28178F :1078900010F4479801C0479A809113018823E1F6BC :1078A0008091E00081608093E0001CDC80E090E04B :1078B0001F910895FA01923049F0933061F09130B0 :1078C000F9F484E191E022E130E01EC086E291E02B :1078D0002EE330E019C0882329F484E691E024E007 :1078E00030E012C0813029F488E691E022E230E0F5 :1078F0000BC0823029F48CE891E02AE230E004C029 :1079000080E090E020E030E091838083C901089519 :107910008093E9008091EB0081608093EB001092EE :10792000ED006093EC004093ED008091EE00881F25 :107930008827881F08958091C90188238CF403C08B :107940008EB38823B1F08091E80082FFF9CF809157 :10795000E8008B778093E80008958EB3882349F080 :107960008091E80080FFF9CF8091E8008E778093C6 :10797000E8000895EF92FF920F931F9345D04CD0EB :1079800008ED10E0F80180818F7780838081806826 :10799000808380818F7D808319BC1EBA1092C701BD :1079A00080EEE82EF12CF70180818B7F8083F80137 :1079B00080818160808380E060E042E0A9DFE1EEC9 :1079C000F0E080818E7F8083E2EEF0E08081816054 :1079D0008083808188608083F70180818E7F8083AF :1079E000F8018081806180831F910F91FF90EF905B :1079F0000895E7EDF0E08081816080838AE482BFB2 :107A000081E08093C801B6CFE8EDF0E080818E7F01 :107A100080831092E20008951092DA001092E10043 :107A200008951F920F920FB60F9211242F933F9338 :107A30004F935F936F937F938F939F93AF93BF9376 :107A4000EF93FF938091DA0080FF1AC08091D800F5 :107A500080FF16C08091DA008E7F8093DA008091DB :107A6000D90080FF0AC019BC82E089BD09B400FEBC :107A7000FDCF81E08EBB3AD203C019BC1EBA36D20C :107A80008091E10080FF17C08091E20080FF13C069 :107A90008091E2008E7F8093E2008091E20080611D :107AA0008093E2008091D80080628093D80019BC56 :107AB00085E08EBB1BD28091E10084FF2BC08091BA :107AC000E20084FF27C019BC82E089BD09B400FE32 :107AD000FDCF8091D8008F7D8093D8008091E10008 :107AE0008F7E8093E1008091E2008F7E8093E200A0 :107AF0008091E20081608093E2008091C701882339 :107B000031F48091E30087FD02C081E001C084E090 :107B10008EBBECD18091E10083FF21C08091E20017 :107B200083FF1DC08091E100877F8093E10082E0A8 :107B30008EBB1092C7018091E1008E7F8093E1009F :107B40008091E2008E7F8093E2008091E20080616C :107B50008093E20080E060E042E0DADEC7D1FF918E :107B6000EF91BF91AF919F918F917F916F915F91B5 :107B70004F913F912F910F900FBE0F901F9018952E :107B80009C014091CF015091D0014617570718F43E :107B9000F90190E044C06115710511F0AB01F8CF17 :107BA0008091E8008E778093E80040E050E0F0CFCD :107BB0008EB3882309F444C0853009F443C0809112 :107BC000E80083FF02C081E008958091E80082FD13 :107BD00031C08091E80080FF22C08091F300909135 :107BE000F200782F60E0292F30E0262B372B07C0DA :107BF00081918093F100415050402F5F3F4F4115DC :107C0000510519F02830310598F390E028303105FE :107C100009F491E08091E8008E778093E8004115A7 :107C2000510531F6992321F605C08EB3882341F022 :107C3000853041F08091E80082FFF7CF80E0089521 :107C400082E0089583E008959C016115710529F48F :107C50008091E8008B778093E800F90126C08EB30D :107C6000882391F1853091F18091E80083FF02C073 :107C700081E008958091E80082FFF1CF06C08091F5 :107C8000F10081936150704059F02091F300809190 :107C9000F200322F20E090E0822B932B892B79F792 :107CA0008091E8008B778093E80061157105B9F643 :107CB00005C08EB3882341F0853041F08091E80003 :107CC00080FFF7CF80E0089582E0089583E0089573 :107CD0000F931F93DF93CF9300D0CDB7DEB7E9ECBE :107CE000F1E08091F100819381E0E13DF807C9F76F :107CF0000ADD8091E80083FFE4C08091C901909182 :107D0000CA01953009F46DC0963040F4913081F18C :107D1000913070F0933009F0D4C02AC0983009F443 :107D2000A3C0993009F4B2C0963009F0CAC07CC033 :107D3000803809F4C6C0823809F0C3C08091CD01F3 :107D400087708093E9008091EB001092E900209108 :107D5000E800277F2093E80090E025E0969587953E :107D60002A95E1F781708093F1001092F10087C0AD :107D7000882319F0823009F0A4C08F71823009F095 :107D8000A0C08091CB01882331F52091CD012770CF :107D900009F497C02093E9008091EB0080FF1BC09D :107DA000933021F48091EB00806213C08091EB004E :107DB00080618093EB0081E090E002C0880F991F02 :107DC0002A95E2F78093EA001092EA008091EB0096 :107DD00088608093EB001092E9008091E800877F33 :107DE00051C0882309F06DC01091CB011F770FB7E8 :107DF000F8948091E800877F8093E8009CDD809173 :107E0000E80080FFFCCF8091E3008078812B809395 :107E1000E30080688093E300112311F482E001C045 :107E200083E08EBB0FBF4DC08058823008F049C040 :107E30008091CB019091CC016091CD01AE014F5F5B :107E40005F4F38DDBC01009709F43BC08091E8002A :107E5000877F8093E80089819A8192DE8091E80093 :107E60008B778093E8002DC0803859F58091E80029 :107E7000877F8093E8008091C7018093F100809113 :107E8000E8008E778093E80056DD1BC08823C9F494 :107E90009091CB019230A8F48091E800877F809385 :107EA000E8009093C70147DD8091C701882331F432 :107EB0008091E30087FD02C081E001C084E08EBBB9 :107EC00052DC8091E80083FF0AC08091EB00806261 :107ED0008093EB008091E800877F8093E8000F900B :107EE0000F90CF91DF911F910F91089508951F93E7 :107EF0008EB3882361F01091E9001092E90080911F :107F0000E80083FF01C0E4DE17701093E9001F91C1 :107F10000895F999FECF92BD81BDF89A992780B551 :107F20000895262FF999FECF1FBA92BD81BD20BDBD :107F30000FB6F894FA9AF99A0FBE01960895F8943C :027F4000FFCF71 :107F42004341544552494E41007700080000000069 :107F52000000080112011001020000084F1B0792E5 :107F620001000201000109023E0002010080320903 :107F72000400000102020100052400100104240291 :107F8200040524060001070582030800FF09040115 :107F920000020A0000000705040210000107058321 :107FA200021000010403090422034C0069006C0062 :107FB2007900500061006400550053004200200027 :107FC2002000200020002000200000002A0353008F :107FD2007000610072006B00460075006E002000A8 :107FE20045006C0065006300740072006F006E0053 :087FF200690063007300000048 :040000030000700089 :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/caterina-LilyPadUSB/Caterina.c ================================================ /* LUFA Library Copyright (C) Dean Camera, 2011. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /** \file * * Main source file for the CDC class bootloader. This file contains the complete bootloader logic. */ #define INCLUDE_FROM_CATERINA_C #include "Caterina.h" /** Contains the current baud rate and other settings of the first virtual serial port. This must be retained as some * operating systems will not open the port unless the settings can be set successfully. */ static CDC_LineEncoding_t LineEncoding = { .BaudRateBPS = 0, .CharFormat = CDC_LINEENCODING_OneStopBit, .ParityType = CDC_PARITY_None, .DataBits = 8 }; /** Current address counter. This stores the current address of the FLASH or EEPROM as set by the host, * and is used when reading or writing to the AVRs memory (either FLASH or EEPROM depending on the issued * command.) */ static uint32_t CurrAddress; /** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run * via a watchdog reset. When cleared the bootloader will exit, starting the watchdog and entering an infinite * loop until the AVR restarts and the application runs. */ static bool RunBootloader = true; /* Pulse generation counters to keep track of the time remaining for each pulse type */ #define TX_RX_LED_PULSE_PERIOD 100 uint16_t TxLEDPulse = 0; // time remaining for Tx LED pulse uint16_t RxLEDPulse = 0; // time remaining for Rx LED pulse /* Bootloader timeout timer */ // MAH 8/15/12- change so timeouts work properly when the chip is running at 8MHz instead of 16. #define TIMEOUT_PERIOD 4000 #define EXT_RESET_TIMEOUT_PERIOD 375 /********************************************************************************************************* LilyPadUSB bootloader code The LilyPadUSB bootloader has been changed to remove the 8-second delay after external reset which is in the Leonardo. To enter the bootloader, the user should execute TWO external resets within 750 ms; that is, press the reset button twice, quickly.\ Some other changes were made to allow this code to compile tightly enough to fit in the alloted 4k of bootloader space. */ // MAH 8/15/12- added this flag to replace the bulky program memory reads to check for the presence of a sketch // at the top of the memory space. static bool sketchPresent = false; // MAH 8/15/12- make this volatile, since we modify it in one place and read it in another, we want to make // sure we're always working on the copy in memory and not an erroneous value stored in a cache somewhere. // This variable stores the length of time we've been in the bootloader when waiting for the 8 second delay. volatile uint16_t Timeout = 0; // MAH 8/15/12- added this for delay during startup. Did not use existing Timeout value b/c it only increments // when there's a sketch at the top of the memory. volatile uint16_t resetTimeout = 0; // MAH 8/15/12- let's make this an 8-bit value instead of 16- that saves on memory because 16-bit addition and // comparison compiles to bulkier code. Note that this does *not* require a change to the Arduino core- we're // just sort of ignoring the extra byte that the Arduino core puts at the next location. uint8_t bootKey = 0x77; volatile uint8_t *const bootKeyPtr = (volatile uint8_t *)0x0800; // StartSketch() is called to clean up our mess before passing execution to the sketch. void StartSketch(void) { cli(); /* Undo TIMER1 setup and clear the count before running the sketch */ TIMSK1 = 0; TCCR1B = 0; /* Relocate the interrupt vector table to the application section */ MCUCR = (1 << IVCE); MCUCR = 0; L_LED_OFF(); TX_LED_OFF(); RX_LED_OFF(); /* jump to beginning of application space */ __asm__ volatile("jmp 0x0000"); } uint16_t LLEDPulse; /** Main program entry point. This routine configures the hardware required by the bootloader, then continuously * runs the bootloader processing routine until it times out or is instructed to exit. */ int main(void) { /* Save the value of the boot key memory before it is overwritten */ uint8_t bootKeyPtrVal = *bootKeyPtr; *bootKeyPtr = 0; /* Check the reason for the reset so we can act accordingly */ uint8_t mcusr_state = MCUSR; // store the initial state of the Status register MCUSR = 0; // clear all reset flags /* Watchdog may be configured with a 15 ms period so must disable it before going any further */ // MAH 8/15/12- I removed this because wdt_disable() is the first thing SetupHardware() does- why // do it twice right in a row? //wdt_disable(); /* Setup hardware required for the bootloader */ // MAH 8/15/12- Moved this up to before the bootloader go/no-go decision tree so I could use the // timer in that decision tree. Removed the USBInit() call from it; if I'm not going to stay in // the bootloader, there's no point spending the time initializing the USB. // SetupHardware(); wdt_disable(); // Disable clock division clock_prescale_set(clock_div_1); // Relocate the interrupt vector table to the bootloader section MCUCR = (1 << IVCE); MCUCR = (1 << IVSEL); LED_SETUP(); CPU_PRESCALE(0); L_LED_OFF(); TX_LED_OFF(); RX_LED_OFF(); // Initialize TIMER1 to handle bootloader timeout and LED tasks. // With 16 MHz clock and 1/64 prescaler, timer 1 is clocked at 250 kHz // Our chosen compare match generates an interrupt every 1 ms. // This interrupt is disabled selectively when doing memory reading, erasing, // or writing since SPM has tight timing requirements. OCR1AH = 0; OCR1AL = 250; TIMSK1 = (1 << OCIE1A); // enable timer 1 output compare A match interrupt TCCR1B = ((1 << CS11) | (1 << CS10)); // 1/64 prescaler on timer 1 input // MAH 8/15/12- this replaces bulky pgm_read_word(0) calls later on, to save memory. if (pgm_read_word(0) != 0xFFFF) sketchPresent = true; // MAH 26 Oct 2012- The "bootload or not?" section has been modified since the code released // with Arduino 1.0.1. The simplest modification is the replacement of equivalence checks on // the reset bits with masked checks, so if more than one reset occurs before the register is // checked, the check doesn't fail and fall through to the bootloader unnecessarily. // The second, more in depth modification addresses behavior after an external reset (i.e., // user pushes the reset button). The Leonardo treats all external resets as requests to // re-enter the bootloader and wait for code to be loaded. It remains in bootloader mode for // 8 seconds before continuing on to the sketch (if one is present). By defining RESET_DELAY // equal to 1, this behavior will persist. // However, if RESET_DELAY is defined to 0, the reset timeout before loading the sketch drops // to 750ms. If, during that 750ms, another external reset occurs, THEN an 8-second delay // in the bootloader will occur. // This is the "no-8-second-delay" code. If this is the first time through the loop, we // don't expect to see the bootKey in memory. if ( (mcusr_state & (1< EXT_RESET_TIMEOUT_PERIOD) // resetTimeout is getting incremeted RunBootloader = false; // in the timer1 ISR. } // If we make it past that while loop, it's sketch loading time! *bootKeyPtr = 0; // clear out the bootKey; from now on, we want to treat a reset like // a normal reset. cli(); // Disable interrupts, in case no sketch is present. RunBootloader = true; // We want to hang out in the bootloader if no sketch is present. if (sketchPresent) StartSketch(); // If a sketch is present, go! Otherwise, wait around // in the bootloader until one is uploaded. } // On a power-on reset, we ALWAYS want to go to the sketch. If there is one. // This is a place where the old code had an equivalence and now there is a mask. else if ( (mcusr_state & (1< TIMEOUT_PERIOD) RunBootloader = false; // MAH 8/15/12- This used to be a function call- inlining it saves a few bytes. LLEDPulse++; uint8_t p = LLEDPulse >> 8; if (p > 127) p = 254-p; p += p; if (((uint8_t)LLEDPulse) > p) L_LED_OFF(); else L_LED_ON(); } /* Disconnect from the host - USB interface will be reset later along with the AVR */ USB_Detach(); /* Jump to beginning of application space to run the sketch - do not reset */ StartSketch(); } // Timer1 is set up to provide periodic interrupts. This is used to flicker the LEDs during // programming as well as to generate the clock counts which determine how long the board should // remain in bootloading mode. ISR(TIMER1_COMPA_vect, ISR_BLOCK) { /* Reset counter */ TCNT1H = 0; TCNT1L = 0; /* Check whether the TX or RX LED one-shot period has elapsed. if so, turn off the LED */ if (TxLEDPulse && !(--TxLEDPulse)) TX_LED_OFF(); if (RxLEDPulse && !(--RxLEDPulse)) RX_LED_OFF(); resetTimeout++; // Needed for the "short reset delay" mode- governs the time the board waits // for a second reset before loading the sketch. if (pgm_read_word(0) != 0xFFFF) Timeout++; } // MAH 29 Oct 2012 Nothing below this point has to change for the LilyPadUSB support /** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready * to relay data to and from the attached USB host. */ void EVENT_USB_Device_ConfigurationChanged(void) { /* Setup CDC Notification, Rx and Tx Endpoints */ Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, CDC_NOTIFICATION_EPSIZE, ENDPOINT_BANK_SINGLE); Endpoint_ConfigureEndpoint(CDC_TX_EPNUM, EP_TYPE_BULK, ENDPOINT_DIR_IN, CDC_TXRX_EPSIZE, ENDPOINT_BANK_SINGLE); Endpoint_ConfigureEndpoint(CDC_RX_EPNUM, EP_TYPE_BULK, ENDPOINT_DIR_OUT, CDC_TXRX_EPSIZE, ENDPOINT_BANK_SINGLE); } /** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to * the device from the USB host before passing along unhandled control requests to the library for processing * internally. */ void EVENT_USB_Device_ControlRequest(void) { /* Ignore any requests that aren't directed to the CDC interface */ if ((USB_ControlRequest.bmRequestType & (CONTROL_REQTYPE_TYPE | CONTROL_REQTYPE_RECIPIENT)) != (REQTYPE_CLASS | REQREC_INTERFACE)) { return; } /* Process CDC specific control requests */ switch (USB_ControlRequest.bRequest) { case CDC_REQ_GetLineEncoding: if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { Endpoint_ClearSETUP(); /* Write the line coding data to the control endpoint */ Endpoint_Write_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); Endpoint_ClearOUT(); } break; case CDC_REQ_SetLineEncoding: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { Endpoint_ClearSETUP(); /* Read the line coding data in from the host into the global struct */ Endpoint_Read_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); Endpoint_ClearIN(); } break; } } #if !defined(NO_BLOCK_SUPPORT) /** Reads or writes a block of EEPROM or FLASH memory to or from the appropriate CDC data endpoint, depending * on the AVR910 protocol command issued. * * \param[in] Command Single character AVR910 protocol command indicating what memory operation to perform */ static void ReadWriteMemoryBlock(const uint8_t Command) { uint16_t BlockSize; char MemoryType; bool HighByte = false; uint8_t LowByte = 0; BlockSize = (FetchNextCommandByte() << 8); BlockSize |= FetchNextCommandByte(); MemoryType = FetchNextCommandByte(); if ((MemoryType != 'E') && (MemoryType != 'F')) { /* Send error byte back to the host */ WriteNextResponseByte('?'); return; } /* Disable timer 1 interrupt - can't afford to process nonessential interrupts * while doing SPM tasks */ TIMSK1 = 0; /* Check if command is to read memory */ if (Command == 'g') { /* Re-enable RWW section */ boot_rww_enable(); while (BlockSize--) { if (MemoryType == 'F') { /* Read the next FLASH byte from the current FLASH page */ #if (FLASHEND > 0xFFFF) WriteNextResponseByte(pgm_read_byte_far(CurrAddress | HighByte)); #else WriteNextResponseByte(pgm_read_byte(CurrAddress | HighByte)); #endif /* If both bytes in current word have been read, increment the address counter */ if (HighByte) CurrAddress += 2; HighByte = !HighByte; } else { /* Read the next EEPROM byte into the endpoint */ WriteNextResponseByte(eeprom_read_byte((uint8_t*)(intptr_t)(CurrAddress >> 1))); /* Increment the address counter after use */ CurrAddress += 2; } } } else { uint32_t PageStartAddress = CurrAddress; if (MemoryType == 'F') { boot_page_erase(PageStartAddress); boot_spm_busy_wait(); } while (BlockSize--) { if (MemoryType == 'F') { /* If both bytes in current word have been written, increment the address counter */ if (HighByte) { /* Write the next FLASH word to the current FLASH page */ boot_page_fill(CurrAddress, ((FetchNextCommandByte() << 8) | LowByte)); /* Increment the address counter after use */ CurrAddress += 2; } else { LowByte = FetchNextCommandByte(); } HighByte = !HighByte; } else { /* Write the next EEPROM byte from the endpoint */ eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); /* Increment the address counter after use */ CurrAddress += 2; } } /* If in FLASH programming mode, commit the page after writing */ if (MemoryType == 'F') { /* Commit the flash page to memory */ boot_page_write(PageStartAddress); /* Wait until write operation has completed */ boot_spm_busy_wait(); } /* Send response byte back to the host */ WriteNextResponseByte('\r'); } /* Re-enable timer 1 interrupt disabled earlier in this routine */ TIMSK1 = (1 << OCIE1A); } #endif /** Retrieves the next byte from the host in the CDC data OUT endpoint, and clears the endpoint bank if needed * to allow reception of the next data packet from the host. * * \return Next received byte from the host in the CDC data OUT endpoint */ static uint8_t FetchNextCommandByte(void) { /* Select the OUT endpoint so that the next data byte can be read */ Endpoint_SelectEndpoint(CDC_RX_EPNUM); /* If OUT endpoint empty, clear it and wait for the next packet from the host */ while (!(Endpoint_IsReadWriteAllowed())) { Endpoint_ClearOUT(); while (!(Endpoint_IsOUTReceived())) { if (USB_DeviceState == DEVICE_STATE_Unattached) return 0; } } /* Fetch the next byte from the OUT endpoint */ return Endpoint_Read_8(); } /** Writes the next response byte to the CDC data IN endpoint, and sends the endpoint back if needed to free up the * bank when full ready for the next byte in the packet to the host. * * \param[in] Response Next response byte to send to the host */ static void WriteNextResponseByte(const uint8_t Response) { /* Select the IN endpoint so that the next data byte can be written */ Endpoint_SelectEndpoint(CDC_TX_EPNUM); /* If IN endpoint full, clear it and wait until ready for the next packet to the host */ if (!(Endpoint_IsReadWriteAllowed())) { Endpoint_ClearIN(); while (!(Endpoint_IsINReady())) { if (USB_DeviceState == DEVICE_STATE_Unattached) return; } } /* Write the next byte to the IN endpoint */ Endpoint_Write_8(Response); TX_LED_ON(); TxLEDPulse = TX_RX_LED_PULSE_PERIOD; } #define STK_OK 0x10 #define STK_INSYNC 0x14 // ' ' #define CRC_EOP 0x20 // 'SPACE' #define STK_GET_SYNC 0x30 // '0' #define STK_GET_PARAMETER 0x41 // 'A' #define STK_SET_DEVICE 0x42 // 'B' #define STK_SET_DEVICE_EXT 0x45 // 'E' #define STK_LOAD_ADDRESS 0x55 // 'U' #define STK_UNIVERSAL 0x56 // 'V' #define STK_PROG_PAGE 0x64 // 'd' #define STK_READ_PAGE 0x74 // 't' #define STK_READ_SIGN 0x75 // 'u' /** Task to read in AVR910 commands from the CDC data OUT endpoint, process them, perform the required actions * and send the appropriate response back to the host. */ void CDC_Task(void) { /* Select the OUT endpoint */ Endpoint_SelectEndpoint(CDC_RX_EPNUM); /* Check if endpoint has a command in it sent from the host */ if (!(Endpoint_IsOUTReceived())) return; RX_LED_ON(); RxLEDPulse = TX_RX_LED_PULSE_PERIOD; /* Read in the bootloader command (first byte sent from host) */ uint8_t Command = FetchNextCommandByte(); if (Command == 'E') { /* We nearly run out the bootloader timeout clock, * leaving just a few hundred milliseconds so the * bootloder has time to respond and service any * subsequent requests */ Timeout = TIMEOUT_PERIOD - 500; /* Re-enable RWW section - must be done here in case * user has disabled verification on upload. */ boot_rww_enable_safe(); // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if (Command == 'T') { FetchNextCommandByte(); // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if ((Command == 'L') || (Command == 'P')) { // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if (Command == 't') { // Return ATMEGA128 part code - this is only to allow AVRProg to use the bootloader WriteNextResponseByte(0x44); WriteNextResponseByte(0x00); } else if (Command == 'a') { // Indicate auto-address increment is supported WriteNextResponseByte('Y'); } else if (Command == 'A') { // Set the current address to that given by the host CurrAddress = (FetchNextCommandByte() << 9); CurrAddress |= (FetchNextCommandByte() << 1); // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if (Command == 'p') { // Indicate serial programmer back to the host WriteNextResponseByte('S'); } else if (Command == 'S') { // Write the 7-byte software identifier to the endpoint for (uint8_t CurrByte = 0; CurrByte < 7; CurrByte++) WriteNextResponseByte(SOFTWARE_IDENTIFIER[CurrByte]); } else if (Command == 'V') { WriteNextResponseByte('0' + BOOTLOADER_VERSION_MAJOR); WriteNextResponseByte('0' + BOOTLOADER_VERSION_MINOR); } else if (Command == 's') { WriteNextResponseByte(AVR_SIGNATURE_3); WriteNextResponseByte(AVR_SIGNATURE_2); WriteNextResponseByte(AVR_SIGNATURE_1); } else if (Command == 'e') { // Clear the application section of flash for (uint32_t CurrFlashAddress = 0; CurrFlashAddress < BOOT_START_ADDR; CurrFlashAddress += SPM_PAGESIZE) { boot_page_erase(CurrFlashAddress); boot_spm_busy_wait(); boot_page_write(CurrFlashAddress); boot_spm_busy_wait(); } // Send confirmation byte back to the host WriteNextResponseByte('\r'); } #if !defined(NO_LOCK_BYTE_WRITE_SUPPORT) else if (Command == 'l') { // Set the lock bits to those given by the host boot_lock_bits_set(FetchNextCommandByte()); // Send confirmation byte back to the host WriteNextResponseByte('\r'); } #endif else if (Command == 'r') { WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOCK_BITS)); } else if (Command == 'F') { WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS)); } else if (Command == 'N') { WriteNextResponseByte(boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS)); } else if (Command == 'Q') { WriteNextResponseByte(boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS)); } #if !defined(NO_BLOCK_SUPPORT) else if (Command == 'b') { WriteNextResponseByte('Y'); // Send block size to the host WriteNextResponseByte(SPM_PAGESIZE >> 8); WriteNextResponseByte(SPM_PAGESIZE & 0xFF); } else if ((Command == 'B') || (Command == 'g')) { // Keep resetting the timeout counter if we're receiving self-programming instructions Timeout = 0; // Delegate the block write/read to a separate function for clarity ReadWriteMemoryBlock(Command); } #endif #if !defined(NO_FLASH_BYTE_SUPPORT) else if (Command == 'C') { // Write the high byte to the current flash page boot_page_fill(CurrAddress, FetchNextCommandByte()); // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if (Command == 'c') { // Write the low byte to the current flash page boot_page_fill(CurrAddress | 0x01, FetchNextCommandByte()); // Increment the address CurrAddress += 2; // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if (Command == 'm') { // Commit the flash page to memory boot_page_write(CurrAddress); // Wait until write operation has completed boot_spm_busy_wait(); // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if (Command == 'R') { #if (FLASHEND > 0xFFFF) uint16_t ProgramWord = pgm_read_word_far(CurrAddress); #else uint16_t ProgramWord = pgm_read_word(CurrAddress); #endif WriteNextResponseByte(ProgramWord >> 8); WriteNextResponseByte(ProgramWord & 0xFF); } #endif #if !defined(NO_EEPROM_BYTE_SUPPORT) else if (Command == 'D') { // Read the byte from the endpoint and write it to the EEPROM eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); // Increment the address after use CurrAddress += 2; // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if (Command == 'd') { // Read the EEPROM byte and write it to the endpoint WriteNextResponseByte(eeprom_read_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)))); // Increment the address after use CurrAddress += 2; } #endif else if (Command != 27) { // Unknown (non-sync) command, return fail code WriteNextResponseByte('?'); } /* Select the IN endpoint */ Endpoint_SelectEndpoint(CDC_TX_EPNUM); /* Remember if the endpoint is completely full before clearing it */ bool IsEndpointFull = !(Endpoint_IsReadWriteAllowed()); /* Send the endpoint data to the host */ Endpoint_ClearIN(); /* If a full endpoint's worth of data was sent, we need to send an empty packet afterwards to signal end of transfer */ if (IsEndpointFull) { while (!(Endpoint_IsINReady())) { if (USB_DeviceState == DEVICE_STATE_Unattached) return; } Endpoint_ClearIN(); } /* Wait until the data has been sent to the host */ while (!(Endpoint_IsINReady())) { if (USB_DeviceState == DEVICE_STATE_Unattached) return; } /* Select the OUT endpoint */ Endpoint_SelectEndpoint(CDC_RX_EPNUM); /* Acknowledge the command from the host */ Endpoint_ClearOUT(); } ================================================ FILE: external/arduino/avr/bootloaders/caterina-LilyPadUSB/Caterina.h ================================================ /* LUFA Library Copyright (C) Dean Camera, 2011. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /** \file * * Header file for BootloaderCDC.c. */ #ifndef _CDC_H_ #define _CDC_H_ /* Includes: */ #include #include #include #include #include #include #include #include "Descriptors.h" #include /* Macros: */ /** Version major of the CDC bootloader. */ #define BOOTLOADER_VERSION_MAJOR 0x01 /** Version minor of the CDC bootloader. */ #define BOOTLOADER_VERSION_MINOR 0x00 /** Hardware version major of the CDC bootloader. */ #define BOOTLOADER_HWVERSION_MAJOR 0x01 /** Hardware version minor of the CDC bootloader. */ #define BOOTLOADER_HWVERSION_MINOR 0x00 /** Eight character bootloader firmware identifier reported to the host when requested */ #define SOFTWARE_IDENTIFIER "CATERINA" #define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) #define LED_SETUP() DDRC |= (1<<7); DDRB |= (1<<0); DDRD |= (1<<5); #define L_LED_OFF() PORTC &= ~(1<<7) #define L_LED_ON() PORTC |= (1<<7) #define L_LED_TOGGLE() PORTC ^= (1<<7) #define TX_LED_OFF() PORTD |= (1<<5) #define TX_LED_ON() PORTD &= ~(1<<5) #define RX_LED_OFF() PORTB |= (1<<0) #define RX_LED_ON() PORTB &= ~(1<<0) /* Type Defines: */ /** Type define for a non-returning pointer to the start of the loaded application in flash memory. */ typedef void (*AppPtr_t)(void) ATTR_NO_RETURN; /* Function Prototypes: */ void StartSketch(void); void LEDPulse(void); void CDC_Task(void); void SetupHardware(void); void EVENT_USB_Device_ConfigurationChanged(void); #if defined(INCLUDE_FROM_CATERINA_C) || defined(__DOXYGEN__) #if !defined(NO_BLOCK_SUPPORT) static void ReadWriteMemoryBlock(const uint8_t Command); #endif static uint8_t FetchNextCommandByte(void); static void WriteNextResponseByte(const uint8_t Response); #endif #endif ================================================ FILE: external/arduino/avr/bootloaders/caterina-LilyPadUSB/Descriptors.c ================================================ /* LUFA Library Copyright (C) Dean Camera, 2011. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /** \file * * USB Device Descriptors, for library use when in USB device mode. Descriptors are special * computer-readable structures which the host requests upon device enumeration, to determine * the device's capabilities and functions. */ #include "Descriptors.h" /** Device descriptor structure. This descriptor, located in SRAM memory, describes the overall * device characteristics, including the supported USB version, control endpoint size and the * number of device configurations. The descriptor is read out by the USB host when the enumeration * process begins. */ const USB_Descriptor_Device_t DeviceDescriptor = { .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, .USBSpecification = VERSION_BCD(01.10), .Class = CDC_CSCP_CDCClass, .SubClass = CDC_CSCP_NoSpecificSubclass, .Protocol = CDC_CSCP_NoSpecificProtocol, .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, .VendorID = DEVICE_VID, .ProductID = DEVICE_PID, .ReleaseNumber = VERSION_BCD(00.01), .ManufacturerStrIndex = 0x02, .ProductStrIndex = 0x01, .SerialNumStrIndex = NO_DESCRIPTOR, .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS }; /** Configuration descriptor structure. This descriptor, located in SRAM memory, describes the usage * of the device in one of its supported configurations, including information about any device interfaces * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting * a configuration so that the host may correctly communicate with the USB device. */ const USB_Descriptor_Configuration_t ConfigurationDescriptor = { .Config = { .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), .TotalInterfaces = 2, .ConfigurationNumber = 1, .ConfigurationStrIndex = NO_DESCRIPTOR, .ConfigAttributes = USB_CONFIG_ATTR_BUSPOWERED, .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) }, .CDC_CCI_Interface = { .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, .InterfaceNumber = 0, .AlternateSetting = 0, .TotalEndpoints = 1, .Class = CDC_CSCP_CDCClass, .SubClass = CDC_CSCP_ACMSubclass, .Protocol = CDC_CSCP_ATCommandProtocol, .InterfaceStrIndex = NO_DESCRIPTOR }, .CDC_Functional_Header = { .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t), .Type = DTYPE_CSInterface}, .Subtype = 0x00, .CDCSpecification = VERSION_BCD(01.10), }, .CDC_Functional_ACM = { .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = DTYPE_CSInterface}, .Subtype = 0x02, .Capabilities = 0x04, }, .CDC_Functional_Union = { .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = DTYPE_CSInterface}, .Subtype = 0x06, .MasterInterfaceNumber = 0, .SlaveInterfaceNumber = 1, }, .CDC_NotificationEndpoint = { .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, .EndpointAddress = (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM), .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), .EndpointSize = CDC_NOTIFICATION_EPSIZE, .PollingIntervalMS = 0xFF }, .CDC_DCI_Interface = { .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, .InterfaceNumber = 1, .AlternateSetting = 0, .TotalEndpoints = 2, .Class = CDC_CSCP_CDCDataClass, .SubClass = CDC_CSCP_NoDataSubclass, .Protocol = CDC_CSCP_NoDataProtocol, .InterfaceStrIndex = NO_DESCRIPTOR }, .CDC_DataOutEndpoint = { .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, .EndpointAddress = (ENDPOINT_DIR_OUT | CDC_RX_EPNUM), .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), .EndpointSize = CDC_TXRX_EPSIZE, .PollingIntervalMS = 0x01 }, .CDC_DataInEndpoint = { .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, .EndpointAddress = (ENDPOINT_DIR_IN | CDC_TX_EPNUM), .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), .EndpointSize = CDC_TXRX_EPSIZE, .PollingIntervalMS = 0x01 } }; /** Language descriptor structure. This descriptor, located in SRAM memory, is returned when the host requests * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate * via the language ID table available at USB.org what languages the device supports for its string descriptors. */ const USB_Descriptor_String_t LanguageString = { .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, .UnicodeString = {LANGUAGE_ID_ENG} }; /** Product descriptor string. This is a Unicode string containing the product's details in human readable form, * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device * Descriptor. */ const USB_Descriptor_String_t ProductString = { .Header = {.Size = USB_STRING_LEN(16), .Type = DTYPE_String}, #if DEVICE_PID == 0x9207 .UnicodeString = L"LilyPadUSB " #else .UnicodeString = L"USB IO board " #endif }; const USB_Descriptor_String_t ManufNameString = { .Header = {.Size = USB_STRING_LEN(20), .Type = DTYPE_String}, #if DEVICE_VID == 0x1B4F .UnicodeString = L"SparkFun Electronics" #else .UnicodeString = L"Unknown " #endif }; /** This function is called by the library when in device mode, and must be overridden (see LUFA library "USB Descriptors" * documentation) by the application code so that the address and size of a requested descriptor can be given * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the * USB host. */ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex, const void** const DescriptorAddress) { const uint8_t DescriptorType = (wValue >> 8); const uint8_t DescriptorNumber = (wValue & 0xFF); const void* Address = NULL; uint16_t Size = NO_DESCRIPTOR; switch (DescriptorType) { case DTYPE_Device: Address = &DeviceDescriptor; Size = sizeof(USB_Descriptor_Device_t); break; case DTYPE_Configuration: Address = &ConfigurationDescriptor; Size = sizeof(USB_Descriptor_Configuration_t); break; case DTYPE_String: if (!(DescriptorNumber)) { Address = &LanguageString; Size = LanguageString.Header.Size; } else if (DescriptorNumber == DeviceDescriptor.ProductStrIndex) { Address = &ProductString; Size = ProductString.Header.Size; } else if (DescriptorNumber == DeviceDescriptor.ManufacturerStrIndex) { Address = &ManufNameString; Size = ManufNameString.Header.Size; } break; } *DescriptorAddress = Address; return Size; } ================================================ FILE: external/arduino/avr/bootloaders/caterina-LilyPadUSB/Descriptors.h ================================================ /* LUFA Library Copyright (C) Dean Camera, 2011. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /** \file * * Header file for Descriptors.c. */ #ifndef _DESCRIPTORS_H_ #define _DESCRIPTORS_H_ /* Includes: */ #include /* Macros: */ #if defined(__AVR_AT90USB1287__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x97 #define AVR_SIGNATURE_3 0x82 #elif defined(__AVR_AT90USB647__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x96 #define AVR_SIGNATURE_3 0x82 #elif defined(__AVR_AT90USB1286__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x97 #define AVR_SIGNATURE_3 0x82 #elif defined(__AVR_AT90USB646__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x96 #define AVR_SIGNATURE_3 0x82 #elif defined(__AVR_ATmega32U6__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x95 #define AVR_SIGNATURE_3 0x88 #elif defined(__AVR_ATmega32U4__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x95 #define AVR_SIGNATURE_3 0x87 #elif defined(__AVR_ATmega16U4__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x94 #define AVR_SIGNATURE_3 0x88 #elif defined(__AVR_ATmega32U2__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x95 #define AVR_SIGNATURE_3 0x8A #elif defined(__AVR_ATmega16U2__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x94 #define AVR_SIGNATURE_3 0x89 #elif defined(__AVR_AT90USB162__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x94 #define AVR_SIGNATURE_3 0x82 #elif defined(__AVR_ATmega8U2__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x93 #define AVR_SIGNATURE_3 0x89 #elif defined(__AVR_AT90USB82__) #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x94 #define AVR_SIGNATURE_3 0x82 #else #error The selected AVR part is not currently supported by this bootloader. #endif /** Endpoint number for the CDC control interface event notification endpoint. */ #define CDC_NOTIFICATION_EPNUM 2 /** Endpoint number for the CDC data interface TX (data IN) endpoint. */ #define CDC_TX_EPNUM 3 /** Endpoint number for the CDC data interface RX (data OUT) endpoint. */ #define CDC_RX_EPNUM 4 /** Size of the CDC data interface TX and RX data endpoint banks, in bytes. */ #define CDC_TXRX_EPSIZE 16 /** Size of the CDC control interface notification endpoint bank, in bytes. */ #define CDC_NOTIFICATION_EPSIZE 8 /* Type Defines: */ /** Type define for the device configuration descriptor structure. This must be defined in the * application code, as the configuration descriptor contains several sub-descriptors which * vary between devices, and which describe the device's usage to the host. */ typedef struct { USB_Descriptor_Configuration_Header_t Config; // CDC Control Interface USB_Descriptor_Interface_t CDC_CCI_Interface; USB_CDC_Descriptor_FunctionalHeader_t CDC_Functional_Header; USB_CDC_Descriptor_FunctionalACM_t CDC_Functional_ACM; USB_CDC_Descriptor_FunctionalUnion_t CDC_Functional_Union; USB_Descriptor_Endpoint_t CDC_NotificationEndpoint; // CDC Data Interface USB_Descriptor_Interface_t CDC_DCI_Interface; USB_Descriptor_Endpoint_t CDC_DataOutEndpoint; USB_Descriptor_Endpoint_t CDC_DataInEndpoint; } USB_Descriptor_Configuration_t; /* Function Prototypes: */ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex, const void** const DescriptorAddress) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); #endif ================================================ FILE: external/arduino/avr/bootloaders/caterina-LilyPadUSB/Makefile ================================================ # Hey Emacs, this is a -*- makefile -*- #---------------------------------------------------------------------------- # WinAVR Makefile Template written by Eric B. Weddington, Jrg Wunsch, et al. # >> Modified for use with the LUFA project. << # # Released to the Public Domain # # Additional material for this makefile was written by: # Peter Fleury # Tim Henigan # Colin O'Flynn # Reiner Patommel # Markus Pfaff # Sander Pool # Frederik Rouleau # Carlos Lamas # Dean Camera # Opendous Inc. # Denver Gingerich # #---------------------------------------------------------------------------- # On command line: # # make all = Make software. # # make clean = Clean out built project files. # # make coff = Convert ELF to AVR COFF. # # make extcoff = Convert ELF to AVR Extended COFF. # # make program = Download the hex file to the device, using avrdude. # Please customize the avrdude settings below first! # # make doxygen = Generate DoxyGen documentation for the project (must have # DoxyGen installed) # # make debug = Start either simulavr or avarice as specified for debugging, # with avr-gdb or avr-insight as the front end for debugging. # # make filename.s = Just compile filename.c into the assembler code only. # # make filename.i = Create a preprocessed source file for use in submitting # bug reports to the GCC project. # # To rebuild project do "make clean" then "make all". #---------------------------------------------------------------------------- # USB vendor ID (VID) # official Arduino LLC VID = 0x2341 # SparkFun VID = 0x1B4F VID = 0x1B4F # USB product ID (PID) # official Leonardo PID = 0x0036 # SparkFun LilyPadUSB PID = 0x9207 PID = 0x9207 # MCU name MCU = atmega32u4 # Target architecture (see library "Board Types" documentation). ARCH = AVR8 # Target board (see library "Board Types" documentation, NONE for projects not requiring # LUFA board drivers). If USER is selected, put custom board drivers in a directory called # "Board" inside the application directory. BOARD = USER # Processor frequency. # This will define a symbol, F_CPU, in all source code files equal to the # processor frequency in Hz. You can then use this symbol in your source code to # calculate timings. Do NOT tack on a 'UL' at the end, this will be done # automatically to create a 32-bit value in your source code. # # This will be an integer division of F_USB below, as it is sourced by # F_USB after it has run through any CPU prescalers. Note that this value # does not *change* the processor frequency - it should merely be updated to # reflect the processor speed set externally so that the code can use accurate # software delays. F_CPU = 8000000 # Input clock frequency. # This will define a symbol, F_USB, in all source code files equal to the # input clock frequency (before any prescaling is performed) in Hz. This value may # differ from F_CPU if prescaling is used on the latter, and is required as the # raw input clock is fed directly to the PLL sections of the AVR for high speed # clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' # at the end, this will be done automatically to create a 32-bit value in your # source code. # # If no clock division is performed on the input clock inside the AVR (via the # CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. F_USB = $(F_CPU) # Starting byte address of the bootloader, as a byte address - computed via the formula # BOOT_START = ((FLASH_SIZE_KB - BOOT_SECTION_SIZE_KB) * 1024) # # Note that the bootloader size and start address given in AVRStudio is in words and not # bytes, and so will need to be doubled to obtain the byte address needed by AVR-GCC. FLASH_SIZE_KB = 32 BOOT_SECTION_SIZE_KB = 4 BOOT_START = 0x$(shell echo "obase=16; ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024" | bc) # Output format. (can be srec, ihex, binary) FORMAT = ihex # Target file name (without extension). TARGET = Caterina # Object files directory # To put object files in current directory, use a dot (.), do NOT make # this an empty or blank macro! OBJDIR = . # Path to the LUFA library LUFA_PATH = LUFA-111009 # LUFA library compile-time options and predefined tokens LUFA_OPTS = -D USB_DEVICE_ONLY LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0 LUFA_OPTS += -D ORDERED_EP_CONFIG LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8 LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 LUFA_OPTS += -D USE_RAM_DESCRIPTORS LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" LUFA_OPTS += -D NO_INTERNAL_SERIAL LUFA_OPTS += -D NO_DEVICE_SELF_POWER LUFA_OPTS += -D NO_DEVICE_REMOTE_WAKEUP LUFA_OPTS += -D NO_SOF_EVENTS #LUFA_OPTS += -D NO_BLOCK_SUPPORT #LUFA_OPTS += -D NO_EEPROM_BYTE_SUPPORT #LUFA_OPTS += -D NO_FLASH_BYTE_SUPPORT LUFA_OPTS += -D NO_LOCK_BYTE_WRITE_SUPPORT # Create the LUFA source path variables by including the LUFA root makefile include $(LUFA_PATH)/LUFA/makefile # List C source files here. (C dependencies are automatically generated.) SRC = $(TARGET).c \ Descriptors.c \ $(LUFA_SRC_USB) \ # List C++ source files here. (C dependencies are automatically generated.) CPPSRC = # List Assembler source files here. # Make them always end in a capital .S. Files ending in a lowercase .s # will not be considered source files but generated files (assembler # output from the compiler), and will be deleted upon "make clean"! # Even though the DOS/Win* filesystem matches both .s and .S the same, # it will preserve the spelling of the filenames, and gcc itself does # care about how the name is spelled on its command-line. ASRC = # Optimization level, can be [0, 1, 2, 3, s]. # 0 = turn off optimization. s = optimize for size. # (Note: 3 is not always the best optimization level. See avr-libc FAQ.) OPT = s # Debugging format. # Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. # AVR Studio 4.10 requires dwarf-2. # AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. DEBUG = dwarf-2 # List any extra directories to look for include files here. # Each directory must be seperated by a space. # Use forward slashes for directory separators. # For a directory that has spaces, enclose it in quotes. EXTRAINCDIRS = $(LUFA_PATH)/ # Compiler flag to set the C Standard level. # c89 = "ANSI" C # gnu89 = c89 plus GCC extensions # c99 = ISO C99 standard (not yet fully implemented) # gnu99 = c99 plus GCC extensions CSTANDARD = -std=c99 # Place -D or -U options here for C sources CDEFS = -DF_CPU=$(F_CPU)UL CDEFS += -DF_USB=$(F_USB)UL CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH) CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL CDEFS += -DDEVICE_VID=$(VID)UL CDEFS += -DDEVICE_PID=$(PID)UL CDEFS += $(LUFA_OPTS) # Place -D or -U options here for ASM sources ADEFS = -DF_CPU=$(F_CPU) ADEFS += -DF_USB=$(F_USB)UL ADEFS += -DBOARD=BOARD_$(BOARD) ADEFS += -DBOOT_START_ADDR=$(BOOT_START)UL ADEFS += $(LUFA_OPTS) # Place -D or -U options here for C++ sources CPPDEFS = -DF_CPU=$(F_CPU)UL CPPDEFS += -DF_USB=$(F_USB)UL CPPDEFS += -DBOARD=BOARD_$(BOARD) CPPDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL CPPDEFS += $(LUFA_OPTS) #CPPDEFS += -D__STDC_LIMIT_MACROS #CPPDEFS += -D__STDC_CONSTANT_MACROS #---------------- Compiler Options C ---------------- # -g*: generate debugging information # -O*: optimization level # -f...: tuning, see GCC manual and avr-libc documentation # -Wall...: warning level # -Wa,...: tell GCC to pass this to the assembler. # -adhlns...: create assembler listing CFLAGS = -g$(DEBUG) CFLAGS += $(CDEFS) CFLAGS += -O$(OPT) CFLAGS += -funsigned-char CFLAGS += -funsigned-bitfields CFLAGS += -ffunction-sections CFLAGS += -fno-inline-small-functions CFLAGS += -fpack-struct CFLAGS += -fshort-enums CFLAGS += -fno-strict-aliasing CFLAGS += -Wall CFLAGS += -Wstrict-prototypes #CFLAGS += -mshort-calls #CFLAGS += -fno-unit-at-a-time #CFLAGS += -Wundef #CFLAGS += -Wunreachable-code #CFLAGS += -Wsign-compare CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) CFLAGS += $(CSTANDARD) #---------------- Compiler Options C++ ---------------- # -g*: generate debugging information # -O*: optimization level # -f...: tuning, see GCC manual and avr-libc documentation # -Wall...: warning level # -Wa,...: tell GCC to pass this to the assembler. # -adhlns...: create assembler listing CPPFLAGS = -g$(DEBUG) CPPFLAGS += $(CPPDEFS) CPPFLAGS += -O$(OPT) CPPFLAGS += -funsigned-char CPPFLAGS += -funsigned-bitfields CPPFLAGS += -fpack-struct CPPFLAGS += -fshort-enums CPPFLAGS += -fno-exceptions CPPFLAGS += -Wall CPPFLAGS += -Wundef #CPPFLAGS += -mshort-calls #CPPFLAGS += -fno-unit-at-a-time #CPPFLAGS += -Wstrict-prototypes #CPPFLAGS += -Wunreachable-code #CPPFLAGS += -Wsign-compare CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) #CPPFLAGS += $(CSTANDARD) #---------------- Assembler Options ---------------- # -Wa,...: tell GCC to pass this to the assembler. # -adhlns: create listing # -gstabs: have the assembler create line number information; note that # for use in COFF files, additional information about filenames # and function names needs to be present in the assembler source # files -- see avr-libc docs [FIXME: not yet described there] # -listing-cont-lines: Sets the maximum number of continuation lines of hex # dump that will be displayed for a given single line of source input. ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 #---------------- Library Options ---------------- # Minimalistic printf version PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min # Floating point printf version (requires MATH_LIB = -lm below) PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt # If this is left blank, then it will use the Standard printf version. PRINTF_LIB = #PRINTF_LIB = $(PRINTF_LIB_MIN) #PRINTF_LIB = $(PRINTF_LIB_FLOAT) # Minimalistic scanf version SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min # Floating point + %[ scanf version (requires MATH_LIB = -lm below) SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt # If this is left blank, then it will use the Standard scanf version. SCANF_LIB = #SCANF_LIB = $(SCANF_LIB_MIN) #SCANF_LIB = $(SCANF_LIB_FLOAT) MATH_LIB = -lm # List any extra directories to look for libraries here. # Each directory must be seperated by a space. # Use forward slashes for directory separators. # For a directory that has spaces, enclose it in quotes. EXTRALIBDIRS = #---------------- External Memory Options ---------------- # 64 KB of external RAM, starting after internal RAM (ATmega128!), # used for variables (.data/.bss) and heap (malloc()). #EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff # 64 KB of external RAM, starting after internal RAM (ATmega128!), # only used for heap (malloc()). #EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff EXTMEMOPTS = #---------------- Linker Options ---------------- # -Wl,...: tell GCC to pass this to linker. # -Map: create map file # --cref: add cross reference to map file LDFLAGS = -Wl,-Map=$(TARGET).map,--cref LDFLAGS += -Wl,--section-start=.text=$(BOOT_START) LDFLAGS += -Wl,--relax LDFLAGS += -Wl,--gc-sections LDFLAGS += $(EXTMEMOPTS) LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) #LDFLAGS += -T linker_script.x #---------------- Programming Options (avrdude) ---------------- # Programming hardware # Type: avrdude -c ? # to get a full listing. # AVRDUDE_PROGRAMMER = avrispmkII # com1 = serial port. Use lpt1 to connect to parallel port. AVRDUDE_PORT = usb AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex #AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep AVRDUDE_WRITE_FUSES = -U efuse:w:0xce:m AVRDUDE_WRITE_FUSES += -U hfuse:w:0xd8:m AVRDUDE_WRITE_FUSES += -U lfuse:w:0xff:m # Uncomment the following if you want avrdude's erase cycle counter. # Note that this counter needs to be initialized first using -Yn, # see avrdude manual. #AVRDUDE_ERASE_COUNTER = -y # Uncomment the following if you do /not/ wish a verification to be # performed after programming the device. #AVRDUDE_NO_VERIFY = -V # Increase verbosity level. Please use this when submitting bug # reports about avrdude. See # to submit bug reports. #AVRDUDE_VERBOSE = -v -v AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) #---------------- Debugging Options ---------------- # For simulavr only - target MCU frequency. DEBUG_MFREQ = $(F_CPU) # Set the DEBUG_UI to either gdb or insight. # DEBUG_UI = gdb DEBUG_UI = insight # Set the debugging back-end to either avarice, simulavr. DEBUG_BACKEND = avarice #DEBUG_BACKEND = simulavr # GDB Init Filename. GDBINIT_FILE = __avr_gdbinit # When using avarice settings for the JTAG JTAG_DEV = /dev/com1 # Debugging port used to communicate between GDB / avarice / simulavr. DEBUG_PORT = 4242 # Debugging host used to communicate between GDB / avarice / simulavr, normally # just set to localhost unless doing some sort of crazy debugging when # avarice is running on a different computer. DEBUG_HOST = localhost #============================================================================ # Define programs and commands. SHELL = sh CC = avr-gcc OBJCOPY = avr-objcopy OBJDUMP = avr-objdump SIZE = avr-size AR = avr-ar rcs NM = avr-nm AVRDUDE = avrdude -B 1 REMOVE = rm -f REMOVEDIR = rm -rf COPY = cp WINSHELL = cmd # Define Messages # English MSG_ERRORS_NONE = Errors: none MSG_BEGIN = -------- begin -------- MSG_END = -------- end -------- MSG_SIZE_BEFORE = Size before: MSG_SIZE_AFTER = Size after: MSG_COFF = Converting to AVR COFF: MSG_EXTENDED_COFF = Converting to AVR Extended COFF: MSG_FLASH = Creating load file for Flash: MSG_EEPROM = Creating load file for EEPROM: MSG_EXTENDED_LISTING = Creating Extended Listing: MSG_SYMBOL_TABLE = Creating Symbol Table: MSG_LINKING = Linking: MSG_COMPILING = Compiling C: MSG_COMPILING_CPP = Compiling C++: MSG_ASSEMBLING = Assembling: MSG_CLEANING = Cleaning project: MSG_CREATING_LIBRARY = Creating library: # Define all object files. OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) # Define all listing files. LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) # Compiler flags to generate dependency files. GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d # Combine all necessary flags and optional flags. # Add target processor to flags. ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) # Default target. all: begin gccversion sizebefore build sizeafter end # Change the build target to build a HEX file or a library. build: elf hex eep lss sym #build: lib elf: $(TARGET).elf hex: $(TARGET).hex eep: $(TARGET).eep lss: $(TARGET).lss sym: $(TARGET).sym LIBNAME=lib$(TARGET).a lib: $(LIBNAME) # Eye candy. # AVR Studio 3.x does not check make's exit code but relies on # the following magic strings to be generated by the compile job. begin: @echo @echo $(MSG_BEGIN) end: @echo $(MSG_END) @echo # Display size of file. HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) sizebefore: @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ 2>/dev/null; echo; fi sizeafter: @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ 2>/dev/null; echo; fi # Display compiler version information. gccversion : @$(CC) --version # Program the device. program: $(TARGET).hex $(TARGET).eep $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) $(AVRDUDE_WRITE_FUSES) # Generate avr-gdb config/init file which does the following: # define the reset signal, load the target file, connect to target, and set # a breakpoint at main(). gdb-config: @$(REMOVE) $(GDBINIT_FILE) @echo define reset >> $(GDBINIT_FILE) @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) @echo end >> $(GDBINIT_FILE) @echo file $(TARGET).elf >> $(GDBINIT_FILE) @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) ifeq ($(DEBUG_BACKEND),simulavr) @echo load >> $(GDBINIT_FILE) endif @echo break main >> $(GDBINIT_FILE) debug: gdb-config $(TARGET).elf ifeq ($(DEBUG_BACKEND), avarice) @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) @$(WINSHELL) /c pause else @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ $(DEBUG_MFREQ) --port $(DEBUG_PORT) endif @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) # Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. COFFCONVERT = $(OBJCOPY) --debugging COFFCONVERT += --change-section-address .data-0x800000 COFFCONVERT += --change-section-address .bss-0x800000 COFFCONVERT += --change-section-address .noinit-0x800000 COFFCONVERT += --change-section-address .eeprom-0x810000 coff: $(TARGET).elf @echo @echo $(MSG_COFF) $(TARGET).cof $(COFFCONVERT) -O coff-avr $< $(TARGET).cof extcoff: $(TARGET).elf @echo @echo $(MSG_EXTENDED_COFF) $(TARGET).cof $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof # Create final output files (.hex, .eep) from ELF output file. %.hex: %.elf @echo @echo $(MSG_FLASH) $@ $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@ %.eep: %.elf @echo @echo $(MSG_EEPROM) $@ -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 # Create extended listing file from ELF output file. %.lss: %.elf @echo @echo $(MSG_EXTENDED_LISTING) $@ $(OBJDUMP) -h -S -z $< > $@ # Create a symbol table from ELF output file. %.sym: %.elf @echo @echo $(MSG_SYMBOL_TABLE) $@ $(NM) -n $< > $@ # Create library from object files. .SECONDARY : $(TARGET).a .PRECIOUS : $(OBJ) %.a: $(OBJ) @echo @echo $(MSG_CREATING_LIBRARY) $@ $(AR) $@ $(OBJ) # Link: create ELF output file from object files. .SECONDARY : $(TARGET).elf .PRECIOUS : $(OBJ) %.elf: $(OBJ) @echo @echo $(MSG_LINKING) $@ $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) # Compile: create object files from C source files. $(OBJDIR)/%.o : %.c @echo @echo $(MSG_COMPILING) $< $(CC) -c $(ALL_CFLAGS) $< -o $@ # Compile: create object files from C++ source files. $(OBJDIR)/%.o : %.cpp @echo @echo $(MSG_COMPILING_CPP) $< $(CC) -c $(ALL_CPPFLAGS) $< -o $@ # Compile: create assembler files from C source files. %.s : %.c $(CC) -S $(ALL_CFLAGS) $< -o $@ # Compile: create assembler files from C++ source files. %.s : %.cpp $(CC) -S $(ALL_CPPFLAGS) $< -o $@ # Assemble: create object files from assembler source files. $(OBJDIR)/%.o : %.S @echo @echo $(MSG_ASSEMBLING) $< $(CC) -c $(ALL_ASFLAGS) $< -o $@ # Create preprocessed source for use in sending a bug report. %.i : %.c $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ # Target: clean project. clean: begin clean_list end clean_list : @echo @echo $(MSG_CLEANING) $(REMOVE) $(TARGET).hex $(REMOVE) $(TARGET).eep $(REMOVE) $(TARGET).cof $(REMOVE) $(TARGET).elf $(REMOVE) $(TARGET).map $(REMOVE) $(TARGET).sym $(REMOVE) $(TARGET).lss $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) $(REMOVE) $(SRC:.c=.s) $(REMOVE) $(SRC:.c=.d) $(REMOVE) $(SRC:.c=.i) $(REMOVEDIR) .dep doxygen: @echo Generating Project Documentation \($(TARGET)\)... @doxygen Doxygen.conf @echo Documentation Generation Complete. clean_doxygen: rm -rf Documentation checksource: @for f in $(SRC) $(CPPSRC) $(ASRC); do \ if [ -f $$f ]; then \ echo "Found Source File: $$f" ; \ else \ echo "Source File Not Found: $$f" ; \ fi; done # Create object files directory $(shell mkdir $(OBJDIR) 2>/dev/null) # Include the dependency files. -include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) # Listing of phony targets. .PHONY : all begin finish end sizebefore sizeafter gccversion \ build elf hex eep lss sym coff extcoff doxygen clean \ clean_list clean_doxygen program debug gdb-config checksource ================================================ FILE: external/arduino/avr/bootloaders/caterina-LilyPadUSB/Readme.txt ================================================ Building the bootloader for the LilyPadUSB 1. Download the LUFA-111009 file (http://fourwalledcubicle.com/blog/2011/10/lufa-111009-released/). 2. Extract that file directly to the Caterina-LilyPadUSB bootloader directory. 3. Open a command prompt in the Caterina-LilyPadUSB bootloader directory. 4. Type 'make'. 5. Enjoy! Programming the bootloader for the LilyPadUSB 1. Open a command prompt in the Caterina-LilyPadUSB folder. 2. Connect your programmer- use a 2x3 .1" header, pressed against the programming vias. 3. Type 'make program' into the command prompt. ================================================ FILE: external/arduino/avr/bootloaders/gemma/README.md ================================================ Arduino Gemma Bootloader ======================== The Arduino Gemma Bootloader is based on the Adafruit Trinket/Gemma Bootloader. In the Arduino Gemma bootloader the USB VID&PID, the Manufacturer name and the Device name parameters are changed. The source code of the bootloader of the version used at the compile time can be found at the following link: https://github.com/adafruit/Adafruit-Trinket-Gemma-Bootloader/tree/3bc1bb561273535d4d493518a233a3a1fccf6b76 The *'usbconfig.h'* and the *'usbconfig.patch'* files are provided if you want to recompile the bootloader. You only need to replace the original *'usbconfig.h'* file with this one or patch it with the provided patch file. **Please note: you cannot use the Arduino USB VID/PID for your own non-Gemma products or projects. Purchase a USB VID for yourself at** http://www.usb.org/developers/vendor/ ================================================ FILE: external/arduino/avr/bootloaders/gemma/avrdude.conf ================================================ # AVRDUDE Configuration File # # This file contains configuration data used by AVRDUDE which describes # the programming hardware pinouts and also provides part definitions. # AVRDUDE's "-C" command line option specifies the location of the # configuration file. The "-c" option names the programmer configuration # which must match one of the entry's "id" parameter. The "-p" option # identifies which part AVRDUDE is going to be programming and must match # one of the parts' "id" parameter. # # Possible entry formats are: # # programmer # parent # optional parent # id = [, [, ] ...] ; # are quoted strings # desc = ; # quoted string # type = ; # programmer type, quoted string # # supported programmer types can be listed by "-c ?type" # connection_type = parallel | serial | usb # baudrate = ; # baudrate for avr910-programmer # vcc = [, ... ] ; # pin number(s) # buff = [, ... ] ; # pin number(s) # reset = ; # pin number # sck = ; # pin number # mosi = ; # pin number # miso = ; # pin number # errled = ; # pin number # rdyled = ; # pin number # pgmled = ; # pin number # vfyled = ; # pin number # usbvid = ; # USB VID (Vendor ID) # usbpid = ; # USB PID (Product ID) # usbdev = ; # USB interface or other device info # usbvendor = ; # USB Vendor Name # usbproduct = ; # USB Product Name # usbsn = ; # USB Serial Number # # To invert a bit, use = ~ , the spaces are important. # For a pin list all pins must be inverted. # A single pin can be specified as usual = ~ , for lists # specify it as follows = ~ ( [, ... ] ) . # ; # # part # id = ; # quoted string # desc = ; # quoted string # has_jtag = ; # part has JTAG i/f # has_debugwire = ; # part has debugWire i/f # has_pdi = ; # part has PDI i/f # has_tpi = ; # part has TPI i/f # devicecode = ; # deprecated, use stk500_devcode # stk500_devcode = ; # numeric # avr910_devcode = ; # numeric # signature = ; # signature bytes # chip_erase_delay = ; # micro-seconds # reset = dedicated | io; # retry_pulse = reset | sck; # pgm_enable = ; # chip_erase = ; # chip_erase_delay = ; # chip erase delay (us) # # STK500 parameters (parallel programming IO lines) # pagel = ; # pin name in hex, i.e., 0xD7 # bs2 = ; # pin name in hex, i.e., 0xA0 # serial = ; # can use serial downloading # parallel = ; # can use par. programming # # STK500v2 parameters, to be taken from Atmel's XML files # timeout = ; # stabdelay = ; # cmdexedelay = ; # synchloops = ; # bytedelay = ; # pollvalue = ; # pollindex = ; # predelay = ; # postdelay = ; # pollmethod = ; # mode = ; # delay = ; # blocksize = ; # readsize = ; # hvspcmdexedelay = ; # # STK500v2 HV programming parameters, from XML # pp_controlstack = , , ...; # PP only # hvsp_controlstack = , , ...; # HVSP only # hventerstabdelay = ; # progmodedelay = ; # PP only # latchcycles = ; # togglevtg = ; # poweroffdelay = ; # resetdelayms = ; # resetdelayus = ; # hvleavestabdelay = ; # resetdelay = ; # synchcycles = ; # HVSP only # chiperasepulsewidth = ; # PP only # chiperasepolltimeout = ; # chiperasetime = ; # HVSP only # programfusepulsewidth = ; # PP only # programfusepolltimeout = ; # programlockpulsewidth = ; # PP only # programlockpolltimeout = ; # # JTAG ICE mkII parameters, also from XML files # allowfullpagebitstream = ; # enablepageprogramming = ; # idr = ; # IO addr of IDR (OCD) reg. # rampz = ; # IO addr of RAMPZ reg. # spmcr = ; # mem addr of SPMC[S]R reg. # eecr = ; # mem addr of EECR reg. # # (only when != 0x3c) # is_at90s1200 = ; # AT90S1200 part # is_avr32 = ; # AVR32 part # # memory # paged = ; # yes / no # size = ; # bytes # page_size = ; # bytes # num_pages = ; # numeric # min_write_delay = ; # micro-seconds # max_write_delay = ; # micro-seconds # readback_p1 = ; # byte value # readback_p2 = ; # byte value # pwroff_after_write = ; # yes / no # read = ; # write = ; # read_lo = ; # read_hi = ; # write_lo = ; # write_hi = ; # loadpage_lo = ; # loadpage_hi = ; # writepage = ; # ; # ; # # If any of the above parameters are not specified, the default value # of 0 is used for numerics or the empty string ("") for string # values. If a required parameter is left empty, AVRDUDE will # complain. # # Parts can also inherit parameters from previously defined parts # using the following syntax. In this case specified integer and # string values override parameter values from the parent part. New # memory definitions are added to the definitions inherited from the # parent. # # part parent # quoted string # id = ; # quoted string # # ; # # NOTES: # * 'devicecode' is the device code used by the STK500 (see codes # listed below) # * Not all memory types will implement all instructions. # * AVR Fuse bits and Lock bits are implemented as a type of memory. # * Example memory types are: # "flash", "eeprom", "fuse", "lfuse" (low fuse), "hfuse" (high # fuse), "signature", "calibration", "lock" # * The memory type specified on the avrdude command line must match # one of the memory types defined for the specified chip. # * The pwroff_after_write flag causes avrdude to attempt to # power the device off and back on after an unsuccessful write to # the affected memory area if VCC programmer pins are defined. If # VCC pins are not defined for the programmer, a message # indicating that the device needs a power-cycle is printed out. # This flag was added to work around a problem with the # at90s4433/2333's; see the at90s4433 errata at: # # http://www.atmel.com/dyn/resources/prod_documents/doc1280.pdf # # INSTRUCTION FORMATS # # Instruction formats are specified as a comma seperated list of # string values containing information (bit specifiers) about each # of the 32 bits of the instruction. Bit specifiers may be one of # the following formats: # # '1' = the bit is always set on input as well as output # # '0' = the bit is always clear on input as well as output # # 'x' = the bit is ignored on input and output # # 'a' = the bit is an address bit, the bit-number matches this bit # specifier's position within the current instruction byte # # 'aN' = the bit is the Nth address bit, bit-number = N, i.e., a12 # is address bit 12 on input, a0 is address bit 0. # # 'i' = the bit is an input data bit # # 'o' = the bit is an output data bit # # Each instruction must be composed of 32 bit specifiers. The # instruction specification closely follows the instruction data # provided in Atmel's data sheets for their parts. # # See below for some examples. # # # The following are STK500 part device codes to use for the # "devicecode" field of the part. These came from Atmel's software # section avr061.zip which accompanies the application note # AVR061 available from: # # http://www.atmel.com/dyn/resources/prod_documents/doc2525.pdf # #define ATTINY10 0x10 /* the _old_ one that never existed! */ #define ATTINY11 0x11 #define ATTINY12 0x12 #define ATTINY15 0x13 #define ATTINY13 0x14 #define ATTINY22 0x20 #define ATTINY26 0x21 #define ATTINY28 0x22 #define ATTINY2313 0x23 #define AT90S1200 0x33 #define AT90S2313 0x40 #define AT90S2323 0x41 #define AT90S2333 0x42 #define AT90S2343 0x43 #define AT90S4414 0x50 #define AT90S4433 0x51 #define AT90S4434 0x52 #define ATMEGA48 0x59 #define AT90S8515 0x60 #define AT90S8535 0x61 #define AT90C8534 0x62 #define ATMEGA8515 0x63 #define ATMEGA8535 0x64 #define ATMEGA8 0x70 #define ATMEGA88 0x73 #define ATMEGA168 0x86 #define ATMEGA161 0x80 #define ATMEGA163 0x81 #define ATMEGA16 0x82 #define ATMEGA162 0x83 #define ATMEGA169 0x84 #define ATMEGA323 0x90 #define ATMEGA32 0x91 #define ATMEGA64 0xA0 #define ATMEGA103 0xB1 #define ATMEGA128 0xB2 #define AT90CAN128 0xB3 #define AT90CAN64 0xB3 #define AT90CAN32 0xB3 #define AT86RF401 0xD0 #define AT89START 0xE0 #define AT89S51 0xE0 #define AT89S52 0xE1 # The following table lists the devices in the original AVR910 # appnote: # |Device |Signature | Code | # +-------+----------+------+ # |tiny12 | 1E 90 05 | 0x55 | # |tiny15 | 1E 90 06 | 0x56 | # | | | | # | S1200 | 1E 90 01 | 0x13 | # | | | | # | S2313 | 1E 91 01 | 0x20 | # | S2323 | 1E 91 02 | 0x48 | # | S2333 | 1E 91 05 | 0x34 | # | S2343 | 1E 91 03 | 0x4C | # | | | | # | S4414 | 1E 92 01 | 0x28 | # | S4433 | 1E 92 03 | 0x30 | # | S4434 | 1E 92 02 | 0x6C | # | | | | # | S8515 | 1E 93 01 | 0x38 | # | S8535 | 1E 93 03 | 0x68 | # | | | | # |mega32 | 1E 95 01 | 0x72 | # |mega83 | 1E 93 05 | 0x65 | # |mega103| 1E 97 01 | 0x41 | # |mega161| 1E 94 01 | 0x60 | # |mega163| 1E 94 02 | 0x64 | # Appnote AVR109 also has a table of AVR910 device codes, which # lists: # dev avr910 signature # ATmega8 0x77 0x1E 0x93 0x07 # ATmega8515 0x3B 0x1E 0x93 0x06 # ATmega8535 0x6A 0x1E 0x93 0x08 # ATmega16 0x75 0x1E 0x94 0x03 # ATmega162 0x63 0x1E 0x94 0x04 # ATmega163 0x66 0x1E 0x94 0x02 # ATmega169 0x79 0x1E 0x94 0x05 # ATmega32 0x7F 0x1E 0x95 0x02 # ATmega323 0x73 0x1E 0x95 0x01 # ATmega64 0x46 0x1E 0x96 0x02 # ATmega128 0x44 0x1E 0x97 0x02 # # These codes refer to "BOOT" device codes which are apparently # different than standard device codes, for whatever reasons # (often one above the standard code). # There are several extended versions of AVR910 implementations around # in the Internet. These add the following codes (only devices that # actually exist are listed): # ATmega8515 0x3A # ATmega128 0x43 # ATmega64 0x45 # ATtiny26 0x5E # ATmega8535 0x69 # ATmega32 0x72 # ATmega16 0x74 # ATmega8 0x76 # ATmega169 0x78 # # Overall avrdude defaults; suitable for ~/.avrduderc # default_parallel = "/dev/parport0"; default_serial = "/dev/ttyS0"; # default_bitclock = 2.5; # Turn off safemode by default #default_safemode = no; # # PROGRAMMER DEFINITIONS # # http://wiring.org.co/ # Basically STK500v2 protocol, with some glue to trigger the # bootloader. programmer id = "wiring"; desc = "Wiring"; type = "wiring"; connection_type = serial; ; programmer id = "arduino"; desc = "Arduino"; type = "arduino"; connection_type = serial; ; # this will interface with the chips on these programmers: # # http://real.kiev.ua/old/avreal/en/adapters # http://www.amontec.com/jtagkey.shtml, jtagkey-tiny.shtml # http://www.olimex.com/dev/arm-usb-ocd.html, arm-usb-tiny.html # http://www.ethernut.de/en/hardware/turtelizer/index.html # http://elk.informatik.fh-augsburg.de/hhweb/doc/openocd/usbjtag/usbjtag.html # http://dangerousprototypes.com/docs/FT2232_breakout_board # http://www.ftdichip.com/Products/Modules/DLPModules.htm,DLP-2232*,DLP-USB1232H # http://flashrom.org/FT2232SPI_Programmer # # The drivers will look for a specific device and use the first one found. # If you have mulitple devices, then look for unique information (like SN) # And fill that in here. # # Note that the pin numbers for the main ISP signals (reset, sck, # mosi, miso) are fixed and cannot be changed, since they must match # the way the Multi-Protocol Synchronous Serial Engine (MPSSE) of # these FTDI ICs has been designed. programmer id = "avrftdi"; desc = "FT2232D based generic programmer"; type = "avrftdi"; connection_type = usb; usbvid = 0x0403; usbpid = 0x6010; usbvendor = ""; usbproduct = ""; usbdev = "A"; usbsn = ""; #ISP-signals - lower ADBUS-Nibble (default) reset = 3; sck = 0; mosi = 1; miso = 2; #LED SIGNALs - higher ADBUS-Nibble # errled = 4; # rdyled = 5; # pgmled = 6; # vfyled = 7; #Buffer Signal - ACBUS - Nibble # buff = 8; ; # This is an implementation of the above with a buffer IC (74AC244) and # 4 LEDs directly attached, all active low. programmer id = "2232HIO"; desc = "FT2232H based generic programmer"; type = "avrftdi"; connection_type = usb; usbvid = 0x0403; # Note: This PID is reserved for generic H devices and # should be programmed into the EEPROM # usbpid = 0x8A48; usbpid = 0x6010; usbdev = "A"; usbvendor = ""; usbproduct = ""; usbsn = ""; #ISP-signals reset = 3; sck = 0; mosi = 1; miso = 2; buff = ~4; #LED SIGNALs errled = ~ 11; rdyled = ~ 14; pgmled = ~ 13; vfyled = ~ 12; ; #The FT4232H can be treated as FT2232H, but it has a different USB #device ID of 0x6011. programmer parent "avrftdi" id = "4232h"; desc = "FT4232H based generic programmer"; usbpid = 0x6011; ; programmer id = "jtagkey"; desc = "Amontec JTAGKey, JTAGKey-Tiny and JTAGKey2"; type = "avrftdi"; connection_type = usb; usbvid = 0x0403; # Note: This PID is used in all JTAGKey variants usbpid = 0xCFF8; usbdev = "A"; usbvendor = ""; usbproduct = ""; usbsn = ""; #ISP-signals => 20 - Pin connector on JTAGKey reset = 3; # TMS 7 violet sck = 0; # TCK 9 white mosi = 1; # TDI 5 green miso = 2; # TDO 13 orange buff = ~4; # VTG VREF 1 brown with red tip # GND GND 20 black # The colors are on the 20 pin breakout cable # from Amontec ; # On the adapter you can read "O-Link". On the PCB is printed "OpenJTAG v3.1" # You can find it as "OpenJTAG ARM JTAG USB" in the internet. # (But there are also several projects called Open JTAG, eg. # http://www.openjtag.org, which are completely different.) # http://www.100ask.net/shop/english.html (website seems to be outdated) # http://item.taobao.com/item.htm?id=1559277013 # http://www.micro4you.com/store/openjtag-arm-jtag-usb.html (schematics!) # some other sources which call it O-Link # http://www.andahammer.com/olink/ # http://www.developmentboard.net/31-o-link-debugger.html # http://armwerks.com/catalog/o-link-debugger-copy/ # or just have a look at ebay ... # It is basically the same entry as jtagkey with different usb ids. programmer parent "jtagkey" id = "o-link"; desc = "O-Link, OpenJTAG from www.100ask.net"; usbvid = 0x1457; usbpid = 0x5118; usbvendor = "www.100ask.net"; usbproduct = "USB<=>JTAG&RS232"; ; # http://wiki.openmoko.org/wiki/Debug_Board_v3 programmer id = "openmoko"; desc = "Openmoko debug board (v3)"; type = "avrftdi"; usbvid = 0x1457; usbpid = 0x5118; usbdev = "A"; usbvendor = ""; usbproduct = ""; usbsn = ""; reset = 3; # TMS 7 sck = 0; # TCK 9 mosi = 1; # TDI 5 miso = 2; # TDO 13 ; # Only Rev. A boards. # Schematic and user manual: http://www.cs.put.poznan.pl/wswitala/download/pdf/811EVBK.pdf programmer id = "lm3s811"; desc = "Luminary Micro LM3S811 Eval Board (Rev. A)"; type = "avrftdi"; connection_type = usb; usbvid = 0x0403; usbpid = 0xbcd9; usbvendor = "LMI"; usbproduct = "LM3S811 Evaluation Board"; usbdev = "A"; usbsn = ""; #ISP-signals - lower ACBUS-Nibble (default) reset = 3; sck = 0; mosi = 1; miso = 2; # Enable correct buffers buff = 7; ; programmer id = "avrisp"; desc = "Atmel AVR ISP"; type = "stk500"; connection_type = serial; ; programmer id = "avrispv2"; desc = "Atmel AVR ISP V2"; type = "stk500v2"; connection_type = serial; ; programmer id = "avrispmkII"; desc = "Atmel AVR ISP mkII"; type = "stk500v2"; connection_type = usb; ; programmer parent "avrispmkII" id = "avrisp2"; ; programmer id = "buspirate"; desc = "The Bus Pirate"; type = "buspirate"; connection_type = serial; ; programmer id = "buspirate_bb"; desc = "The Bus Pirate (bitbang interface, supports TPI)"; type = "buspirate_bb"; connection_type = serial; # pins are bits in bitbang byte (numbers are 87654321) # 1|POWER|PULLUP|AUX|MOSI|CLK|MISO|CS reset = 1; sck = 3; mosi = 4; miso = 2; #vcc = 7; This is internally set independent of this setting. ; # This is supposed to be the "default" STK500 entry. # Attempts to select the correct firmware version # by probing for it. Better use one of the entries # below instead. programmer id = "stk500"; desc = "Atmel STK500"; type = "stk500generic"; connection_type = serial; ; programmer id = "stk500v1"; desc = "Atmel STK500 Version 1.x firmware"; type = "stk500"; connection_type = serial; ; programmer id = "mib510"; desc = "Crossbow MIB510 programming board"; type = "stk500"; connection_type = serial; ; programmer id = "stk500v2"; desc = "Atmel STK500 Version 2.x firmware"; type = "stk500v2"; connection_type = serial; ; programmer id = "stk500pp"; desc = "Atmel STK500 V2 in parallel programming mode"; type = "stk500pp"; connection_type = serial; ; programmer id = "stk500hvsp"; desc = "Atmel STK500 V2 in high-voltage serial programming mode"; type = "stk500hvsp"; connection_type = serial; ; programmer id = "stk600"; desc = "Atmel STK600"; type = "stk600"; connection_type = usb; ; programmer id = "stk600pp"; desc = "Atmel STK600 in parallel programming mode"; type = "stk600pp"; connection_type = usb; ; programmer id = "stk600hvsp"; desc = "Atmel STK600 in high-voltage serial programming mode"; type = "stk600hvsp"; connection_type = usb; ; programmer id = "avr910"; desc = "Atmel Low Cost Serial Programmer"; type = "avr910"; connection_type = serial; ; programmer id = "ft245r"; desc = "FT245R Synchronous BitBang"; type = "ftdi_syncbb"; connection_type = usb; miso = 1; # D1 sck = 0; # D0 mosi = 2; # D2 reset = 4; # D4 ; programmer id = "ft232r"; desc = "FT232R Synchronous BitBang"; type = "ftdi_syncbb"; connection_type = usb; miso = 1; # RxD sck = 0; # RTS mosi = 2; # TxD reset = 4; # DTR ; # see http://www.bitwizard.nl/wiki/index.php/FTDI_ATmega programmer id = "bwmega"; desc = "BitWizard ftdi_atmega builtin programmer"; type = "ftdi_syncbb"; connection_type = usb; miso = 5; # DSR sck = 6; # DCD mosi = 3; # CTS reset = 7; # RI ; # see http://www.geocities.jp/arduino_diecimila/bootloader/index_en.html # Note: pins are numbered from 1! programmer id = "arduino-ft232r"; desc = "Arduino: FT232R connected to ISP"; type = "ftdi_syncbb"; connection_type = usb; miso = 3; # CTS X3(1) sck = 5; # DSR X3(2) mosi = 6; # DCD X3(3) reset = 7; # RI X3(4) ; # website mentioned above uses this id programmer parent "arduino-ft232r" id = "diecimila"; desc = "alias for arduino-ft232r"; ; programmer id = "usbasp"; desc = "USBasp, http://www.fischl.de/usbasp/"; type = "usbasp"; connection_type = usb; usbvid = 0x16C0; # VOTI usbpid = 0x05DC; # Obdev's free shared PID usbvendor = "www.fischl.de"; usbproduct = "USBasp"; # following variants are autodetected for id "usbasp" # original usbasp from fischl.de # see above "usbasp" # old usbasp from fischl.de #usbvid = 0x03EB; # ATMEL #usbpid = 0xC7B4; # (unoffical) USBasp #usbvendor = "www.fischl.de"; #usbproduct = "USBasp"; # NIBObee (only if -P nibobee is given on command line) # see below "nibobee" ; programmer id = "nibobee"; desc = "NIBObee"; type = "usbasp"; connection_type = usb; usbvid = 0x16C0; # VOTI usbpid = 0x092F; # NIBObee PID usbvendor = "www.nicai-systems.com"; usbproduct = "NIBObee"; ; programmer id = "usbasp-clone"; desc = "Any usbasp clone with correct VID/PID"; type = "usbasp"; connection_type = usb; usbvid = 0x16C0; # VOTI usbpid = 0x05DC; # Obdev's free shared PID #usbvendor = ""; #usbproduct = ""; ; programmer id = "usbtiny"; desc = "USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/"; type = "usbtiny"; connection_type = usb; usbvid = 0x1781; usbpid = 0x0c9f; ; programmer id = "arduinogemma"; desc = "Arduino Gemma. Based on USBtiny"; type = "usbtiny"; connection_type = usb; usbvid = 0x2341; usbpid = 0x0c9f; ; programmer id = "arduinoisp"; desc = " "; type = "usbtiny"; connection_type = usb; usbvid = 0x2341; usbpid = 0x0049; ; programmer id = "butterfly"; desc = "Atmel Butterfly Development Board"; type = "butterfly"; connection_type = serial; ; programmer id = "avr109"; desc = "Atmel AppNote AVR109 Boot Loader"; type = "butterfly"; connection_type = serial; ; programmer id = "avr911"; desc = "Atmel AppNote AVR911 AVROSP"; type = "butterfly"; connection_type = serial; ; # suggested in http://forum.mikrokopter.de/topic-post48317.html programmer id = "mkbutterfly"; desc = "Mikrokopter.de Butterfly"; type = "butterfly_mk"; connection_type = serial; ; programmer parent "mkbutterfly" id = "butterfly_mk"; ; programmer id = "jtagmkI"; desc = "Atmel JTAG ICE (mkI)"; baudrate = 115200; # default is 115200 type = "jtagmki"; connection_type = serial; ; # easier to type programmer parent "jtagmkI" id = "jtag1"; ; # easier to type programmer parent "jtag1" id = "jtag1slow"; baudrate = 19200; ; # The JTAG ICE mkII has both, serial and USB connectivity. As it is # mostly used through USB these days (AVR Studio 5 only supporting it # that way), we make connection_type = usb the default. Users are # still free to use a serial port with the -P option. programmer id = "jtagmkII"; desc = "Atmel JTAG ICE mkII"; baudrate = 19200; # default is 19200 type = "jtagmkii"; connection_type = usb; ; # easier to type programmer parent "jtagmkII" id = "jtag2slow"; ; # JTAG ICE mkII @ 115200 Bd programmer parent "jtag2slow" id = "jtag2fast"; baudrate = 115200; ; # make the fast one the default, people will love that programmer parent "jtag2fast" id = "jtag2"; ; # JTAG ICE mkII in ISP mode programmer id = "jtag2isp"; desc = "Atmel JTAG ICE mkII in ISP mode"; baudrate = 115200; type = "jtagmkii_isp"; connection_type = usb; ; # JTAG ICE mkII in debugWire mode programmer id = "jtag2dw"; desc = "Atmel JTAG ICE mkII in debugWire mode"; baudrate = 115200; type = "jtagmkii_dw"; connection_type = usb; ; # JTAG ICE mkII in AVR32 mode programmer id = "jtagmkII_avr32"; desc = "Atmel JTAG ICE mkII im AVR32 mode"; baudrate = 115200; type = "jtagmkii_avr32"; connection_type = usb; ; # JTAG ICE mkII in AVR32 mode programmer id = "jtag2avr32"; desc = "Atmel JTAG ICE mkII im AVR32 mode"; baudrate = 115200; type = "jtagmkii_avr32"; connection_type = usb; ; # JTAG ICE mkII in PDI mode programmer id = "jtag2pdi"; desc = "Atmel JTAG ICE mkII PDI mode"; baudrate = 115200; type = "jtagmkii_pdi"; connection_type = usb; ; # AVR Dragon in JTAG mode programmer id = "dragon_jtag"; desc = "Atmel AVR Dragon in JTAG mode"; baudrate = 115200; type = "dragon_jtag"; connection_type = usb; ; # AVR Dragon in ISP mode programmer id = "dragon_isp"; desc = "Atmel AVR Dragon in ISP mode"; baudrate = 115200; type = "dragon_isp"; connection_type = usb; ; # AVR Dragon in PP mode programmer id = "dragon_pp"; desc = "Atmel AVR Dragon in PP mode"; baudrate = 115200; type = "dragon_pp"; connection_type = usb; ; # AVR Dragon in HVSP mode programmer id = "dragon_hvsp"; desc = "Atmel AVR Dragon in HVSP mode"; baudrate = 115200; type = "dragon_hvsp"; connection_type = usb; ; # AVR Dragon in debugWire mode programmer id = "dragon_dw"; desc = "Atmel AVR Dragon in debugWire mode"; baudrate = 115200; type = "dragon_dw"; connection_type = usb; ; # AVR Dragon in PDI mode programmer id = "dragon_pdi"; desc = "Atmel AVR Dragon in PDI mode"; baudrate = 115200; type = "dragon_pdi"; connection_type = usb; ; programmer id = "jtag3"; desc = "Atmel AVR JTAGICE3 in JTAG mode"; type = "jtagice3"; connection_type = usb; ; programmer id = "jtag3pdi"; desc = "Atmel AVR JTAGICE3 in PDI mode"; type = "jtagice3_pdi"; connection_type = usb; ; programmer id = "jtag3dw"; desc = "Atmel AVR JTAGICE3 in debugWIRE mode"; type = "jtagice3_dw"; connection_type = usb; ; programmer id = "jtag3isp"; desc = "Atmel AVR JTAGICE3 in ISP mode"; type = "jtagice3_isp"; connection_type = usb; ; programmer id = "pavr"; desc = "Jason Kyle's pAVR Serial Programmer"; type = "avr910"; connection_type = serial; ; programmer id = "pickit2"; desc = "MicroChip's PICkit2 Programmer"; type = "pickit2"; connection_type = usb; ; # Parallel port programmers. programmer id = "bsd"; desc = "Brian Dean's Programmer, http://www.bsdhome.com/avrdude/"; type = "par"; connection_type = parallel; vcc = 2, 3, 4, 5; reset = 7; sck = 8; mosi = 9; miso = 10; ; programmer id = "stk200"; desc = "STK200"; type = "par"; connection_type = parallel; buff = 4, 5; sck = 6; mosi = 7; reset = 9; miso = 10; ; # The programming dongle used by the popular Ponyprog # utility. It is almost similar to the STK200 one, # except that there is a LED indicating that the # programming is currently in progress. programmer parent "stk200" id = "pony-stk200"; desc = "Pony Prog STK200"; pgmled = 8; ; programmer id = "dt006"; desc = "Dontronics DT006"; type = "par"; connection_type = parallel; reset = 4; sck = 5; mosi = 2; miso = 11; ; programmer parent "dt006" id = "bascom"; desc = "Bascom SAMPLE programming cable"; ; programmer id = "alf"; desc = "Nightshade ALF-PgmAVR, http://nightshade.homeip.net/"; type = "par"; connection_type = parallel; vcc = 2, 3, 4, 5; buff = 6; reset = 7; sck = 8; mosi = 9; miso = 10; errled = 1; rdyled = 14; pgmled = 16; vfyled = 17; ; programmer id = "sp12"; desc = "Steve Bolt's Programmer"; type = "par"; connection_type = parallel; vcc = 4,5,6,7,8; reset = 3; sck = 2; mosi = 9; miso = 11; ; programmer id = "picoweb"; desc = "Picoweb Programming Cable, http://www.picoweb.net/"; type = "par"; connection_type = parallel; reset = 2; sck = 3; mosi = 4; miso = 13; ; programmer id = "abcmini"; desc = "ABCmini Board, aka Dick Smith HOTCHIP"; type = "par"; connection_type = parallel; reset = 4; sck = 3; mosi = 2; miso = 10; ; programmer id = "futurlec"; desc = "Futurlec.com programming cable."; type = "par"; connection_type = parallel; reset = 3; sck = 2; mosi = 1; miso = 10; ; # From the contributor of the "xil" jtag cable: # The "vcc" definition isn't really vcc (the cable gets its power from # the programming circuit) but is necessary to switch one of the # buffer lines (trying to add it to the "buff" lines doesn't work in # avrdude versions before 5.5j). # With this, TMS connects to RESET, TDI to MOSI, TDO to MISO and TCK # to SCK (plus vcc/gnd of course) programmer id = "xil"; desc = "Xilinx JTAG cable"; type = "par"; connection_type = parallel; mosi = 2; sck = 3; reset = 4; buff = 5; miso = 13; vcc = 6; ; programmer id = "dapa"; desc = "Direct AVR Parallel Access cable"; type = "par"; connection_type = parallel; vcc = 3; reset = 16; sck = 1; mosi = 2; miso = 11; ; programmer id = "atisp"; desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; type = "par"; connection_type = parallel; reset = ~6; sck = ~8; mosi = ~7; miso = ~10; ; programmer id = "ere-isp-avr"; desc = "ERE ISP-AVR "; type = "par"; connection_type = parallel; reset = ~4; sck = 3; mosi = 2; miso = 10; ; programmer id = "blaster"; desc = "Altera ByteBlaster"; type = "par"; connection_type = parallel; sck = 2; miso = 11; reset = 3; mosi = 8; buff = 14; ; # It is almost same as pony-stk200, except vcc on pin 5 to auto # disconnect port (download on http://electropol.free.fr/spip/spip.php?article27) programmer parent "pony-stk200" id = "frank-stk200"; desc = "Frank STK200"; buff = ; # delete buff pin assignment vcc = 5; ; # The AT98ISP Cable is a simple parallel dongle for AT89 family. # http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2877 programmer id = "89isp"; desc = "Atmel at89isp cable"; type = "par"; connection_type = parallel; reset = 17; sck = 1; mosi = 2; miso = 10; ; #This programmer bitbangs GPIO lines using the Linux sysfs GPIO interface # #To enable it set the configuration below to match the GPIO lines connected to the #relevant ISP header pins and uncomment the entry definition. In case you don't #have the required permissions to edit this system wide config file put the #entry in a separate .conf file and use it with -C+.conf #on the command line. # #To check if your avrdude build has support for the linuxgpio programmer compiled in, #use -c?type on the command line and look for linuxgpio in the list. If it's not available #you need pass the --enable-linuxgpio=yes option to configure and recompile avrdude. # #programmer # id = "linuxgpio"; # desc = "Use the Linux sysfs interface to bitbang GPIO lines"; # type = "linuxgpio"; # reset = ?; # sck = ?; # mosi = ?; # miso = ?; #; #This programmer bitbangs GPIO lines using the Linux sysfs GPIO interface and direct #GPIO memory registers read/write. # #To enable it set the configuration below to match the GPIO lines connected to the #relevant ISP header pins and uncomment the entry definition. In case you don't #have the required permissions to edit this system wide config file put the #entry in a separate .conf file and use it with -C+.conf #on the command line. # #To check if your avrdude build has support for the arduinotre programmer compiled in, #use -c?type on the command line and look for arduinotre in the list. If it's not available #you need pass the --enable-arduinotre=yes option to configure and recompile avrdude. # #programmer # id = "arduinotre"; # desc = "Arduino TRE bitbanging using GPIO registers"; # type = "arduinotre"; # reset = ~65; # sck = 49; # mosi = 48; # miso = 61; #; # some ultra cheap programmers use bitbanging on the # serialport. # # PC - DB9 - Pins for RS232: # # GND 5 -- |O # | O| <- 9 RI # DTR 4 <- |O | # | O| <- 8 CTS # TXD 3 <- |O | # | O| -> 7 RTS # RXD 2 -> |O | # | O| <- 6 DSR # DCD 1 -> |O # # Using RXD is currently not supported. # Using RI is not supported under Win32 but is supported under Posix. # serial ponyprog design (dasa2 in uisp) # reset=!txd sck=rts mosi=dtr miso=cts programmer id = "ponyser"; desc = "design ponyprog serial, reset=!txd sck=rts mosi=dtr miso=cts"; type = "serbb"; connection_type = serial; reset = ~3; sck = 7; mosi = 4; miso = 8; ; # Same as above, different name # reset=!txd sck=rts mosi=dtr miso=cts programmer parent "ponyser" id = "siprog"; desc = "Lancos SI-Prog "; ; # unknown (dasa in uisp) # reset=rts sck=dtr mosi=txd miso=cts programmer id = "dasa"; desc = "serial port banging, reset=rts sck=dtr mosi=txd miso=cts"; type = "serbb"; connection_type = serial; reset = 7; sck = 4; mosi = 3; miso = 8; ; # unknown (dasa3 in uisp) # reset=!dtr sck=rts mosi=txd miso=cts programmer id = "dasa3"; desc = "serial port banging, reset=!dtr sck=rts mosi=txd miso=cts"; type = "serbb"; connection_type = serial; reset = ~4; sck = 7; mosi = 3; miso = 8; ; # C2N232i (jumper configuration "auto") # reset=dtr sck=!rts mosi=!txd miso=!cts programmer id = "c2n232i"; desc = "serial port banging, reset=dtr sck=!rts mosi=!txd miso=!cts"; type = "serbb"; connection_type = serial; reset = 4; sck = ~7; mosi = ~3; miso = ~8; ; # # PART DEFINITIONS # #------------------------------------------------------------ # ATtiny11 #------------------------------------------------------------ # This is an HVSP-only device. part id = "t11"; desc = "ATtiny11"; stk500_devcode = 0x11; signature = 0x1e 0x90 0x04; chip_erase_delay = 20000; timeout = 200; hvsp_controlstack = 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; hventerstabdelay = 100; progmodedelay = 0; hvspcmdexedelay = 0; synchcycles = 6; latchcycles = 1; togglevtg = 1; poweroffdelay = 25; resetdelayms = 0; resetdelayus = 50; hvleavestabdelay = 100; resetdelay = 25; chiperasepolltimeout = 40; chiperasetime = 0; programfusepolltimeout = 25; programlockpolltimeout = 25; memory "eeprom" size = 64; blocksize = 64; readsize = 256; delay = 5; ; memory "flash" size = 1024; blocksize = 128; readsize = 256; delay = 3; ; memory "signature" size = 3; ; memory "lock" size = 1; ; memory "calibration" size = 1; ; memory "fuse" size = 1; ; ; #------------------------------------------------------------ # ATtiny12 #------------------------------------------------------------ part id = "t12"; desc = "ATtiny12"; stk500_devcode = 0x12; avr910_devcode = 0x55; signature = 0x1e 0x90 0x05; chip_erase_delay = 20000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; hvsp_controlstack = 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; hventerstabdelay = 100; hvspcmdexedelay = 0; synchcycles = 6; latchcycles = 1; togglevtg = 1; poweroffdelay = 25; resetdelayms = 0; resetdelayus = 50; hvleavestabdelay = 100; resetdelay = 25; chiperasepolltimeout = 40; chiperasetime = 0; programfusepolltimeout = 25; programlockpolltimeout = 25; memory "eeprom" size = 64; min_write_delay = 9000; max_write_delay = 20000; readback_p1 = 0xff; readback_p2 = 0xff; read = "1 0 1 0 0 0 0 0 x x x x x x x x", "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; write = "1 1 0 0 0 0 0 0 x x x x x x x x", "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; mode = 0x04; delay = 8; blocksize = 64; readsize = 256; ; memory "flash" size = 1024; min_write_delay = 4500; max_write_delay = 20000; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " x x x x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " x x x x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; write_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; mode = 0x04; delay = 5; blocksize = 128; readsize = 256; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "0 0 0 0 0 0 a1 a0 o o o o o o o o"; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 x x x x x x x x", "x x x x x x x x x x x x x o o x"; write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", "x x x x x x x x x x x x x x x x"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 x x x x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; memory "fuse" size = 1; read = "0 1 0 1 0 0 0 0 x x x x x x x x", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", "x x x x x x x x i i i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; ; #------------------------------------------------------------ # ATtiny13 #------------------------------------------------------------ part id = "t13"; desc = "ATtiny13"; has_debugwire = yes; flash_instr = 0xB4, 0x0E, 0x1E; eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, 0xBC, 0x0E, 0xB4, 0x0E, 0xBA, 0x0D, 0xBB, 0xBC, 0x99, 0xE1, 0xBB, 0xAC; stk500_devcode = 0x14; signature = 0x1e 0x90 0x07; chip_erase_delay = 4000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; hvsp_controlstack = 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; hventerstabdelay = 100; progmodedelay = 0; hvspcmdexedelay = 0; synchcycles = 6; latchcycles = 1; togglevtg = 1; poweroffdelay = 25; resetdelayms = 0; resetdelayus = 90; hvleavestabdelay = 100; resetdelay = 25; chiperasepolltimeout = 40; chiperasetime = 0; programfusepolltimeout = 25; programlockpolltimeout = 25; ocdrev = 0; memory "eeprom" size = 64; page_size = 4; min_write_delay = 4000; max_write_delay = 4000; readback_p1 = 0xff; readback_p2 = 0xff; read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x x x x", " x x a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 5; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 1024; page_size = 32; num_pages = 32; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " 0 0 0 0 0 0 0 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 0 0 0 0 0 0 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 0 x x x x x", " x x x x a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 0 x x x x x", " x x x x a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 0 0 0 0 0 0 a8", " a7 a6 a5 a4 x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 32; readsize = 256; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "lock" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; ; memory "calibration" size = 2; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 a0 o o o o o o o o"; ; memory "lfuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; ; memory "hfuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; ; ; #------------------------------------------------------------ # ATtiny15 #------------------------------------------------------------ part id = "t15"; desc = "ATtiny15"; stk500_devcode = 0x13; avr910_devcode = 0x56; signature = 0x1e 0x90 0x06; chip_erase_delay = 8200; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; hvsp_controlstack = 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; hventerstabdelay = 100; hvspcmdexedelay = 5; synchcycles = 6; latchcycles = 16; togglevtg = 1; poweroffdelay = 25; resetdelayms = 0; resetdelayus = 50; hvleavestabdelay = 100; resetdelay = 25; chiperasepolltimeout = 40; chiperasetime = 0; programfusepolltimeout = 25; programlockpolltimeout = 25; memory "eeprom" size = 64; min_write_delay = 8200; max_write_delay = 8200; readback_p1 = 0xff; readback_p2 = 0xff; read = "1 0 1 0 0 0 0 0 x x x x x x x x", "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; write = "1 1 0 0 0 0 0 0 x x x x x x x x", "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; mode = 0x04; delay = 10; blocksize = 64; readsize = 256; ; memory "flash" size = 1024; min_write_delay = 4100; max_write_delay = 4100; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " x x x x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " x x x x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; write_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; mode = 0x04; delay = 5; blocksize = 128; readsize = 256; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "0 0 0 0 0 0 a1 a0 o o o o o o o o"; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 x x x x x x x x", "x x x x x x x x x x x x x o o x"; write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", "x x x x x x x x x x x x x x x x"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 x x x x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; memory "fuse" size = 1; read = "0 1 0 1 0 0 0 0 x x x x x x x x", "x x x x x x x x o o o o x x o o"; write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", "x x x x x x x x i i i i 1 1 i i"; min_write_delay = 9000; max_write_delay = 9000; ; ; #------------------------------------------------------------ # AT90s1200 #------------------------------------------------------------ part id = "1200"; desc = "AT90S1200"; is_at90s1200 = yes; stk500_devcode = 0x33; avr910_devcode = 0x13; signature = 0x1e 0x90 0x01; pagel = 0xd7; bs2 = 0xa0; chip_erase_delay = 20000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 1; bytedelay = 0; pollindex = 0; pollvalue = 0xFF; predelay = 1; postdelay = 1; pollmethod = 0; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 0; togglevtg = 0; poweroffdelay = 0; resetdelayms = 0; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 15; chiperasepolltimeout = 0; programfusepulsewidth = 2; programfusepolltimeout = 0; programlockpulsewidth = 0; programlockpolltimeout = 1; memory "eeprom" size = 64; min_write_delay = 4000; max_write_delay = 9000; readback_p1 = 0x00; readback_p2 = 0xff; read = "1 0 1 0 0 0 0 0 x x x x x x x x", "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; write = "1 1 0 0 0 0 0 0 x x x x x x x x", "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; mode = 0x04; delay = 20; blocksize = 32; readsize = 256; ; memory "flash" size = 1024; min_write_delay = 4000; max_write_delay = 9000; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " x x x x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " x x x x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; write_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; mode = 0x02; delay = 15; blocksize = 128; readsize = 256; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "fuse" size = 1; ; memory "lock" size = 1; min_write_delay = 9000; max_write_delay = 20000; write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", "x x x x x x x x x x x x x x x x"; ; ; #------------------------------------------------------------ # AT90s4414 #------------------------------------------------------------ part id = "4414"; desc = "AT90S4414"; stk500_devcode = 0x50; avr910_devcode = 0x28; signature = 0x1e 0x92 0x01; chip_erase_delay = 20000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 0; togglevtg = 0; poweroffdelay = 0; resetdelayms = 0; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 15; chiperasepolltimeout = 0; programfusepulsewidth = 2; programfusepolltimeout = 0; programlockpulsewidth = 0; programlockpolltimeout = 1; memory "eeprom" size = 256; min_write_delay = 9000; max_write_delay = 20000; readback_p1 = 0x80; readback_p2 = 0x7f; read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; mode = 0x04; delay = 12; blocksize = 64; readsize = 256; ; memory "flash" size = 4096; min_write_delay = 9000; max_write_delay = 20000; readback_p1 = 0x7f; readback_p2 = 0x7f; read_lo = " 0 0 1 0 0 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write_lo = " 0 1 0 0 0 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; write_hi = " 0 1 0 0 1 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; mode = 0x04; delay = 12; blocksize = 64; readsize = 256; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "fuse" size = 1; ; memory "lock" size = 1; write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", "x x x x x x x x x x x x x x x x"; min_write_delay = 9000; max_write_delay = 9000; ; ; #------------------------------------------------------------ # AT90s2313 #------------------------------------------------------------ part id = "2313"; desc = "AT90S2313"; stk500_devcode = 0x40; avr910_devcode = 0x20; signature = 0x1e 0x91 0x01; chip_erase_delay = 20000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 0; togglevtg = 0; poweroffdelay = 0; resetdelayms = 0; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 15; chiperasepolltimeout = 0; programfusepulsewidth = 2; programfusepolltimeout = 0; programlockpulsewidth = 0; programlockpolltimeout = 1; memory "eeprom" size = 128; min_write_delay = 4000; max_write_delay = 9000; readback_p1 = 0x80; readback_p2 = 0x7f; read = "1 0 1 0 0 0 0 0 x x x x x x x x", "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; write = "1 1 0 0 0 0 0 0 x x x x x x x x", "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; mode = 0x04; delay = 12; blocksize = 64; readsize = 256; ; memory "flash" size = 2048; min_write_delay = 4000; max_write_delay = 9000; readback_p1 = 0x7f; readback_p2 = 0x7f; read_lo = " 0 0 1 0 0 0 0 0", " x x x x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " x x x x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write_lo = " 0 1 0 0 0 0 0 0", " x x x x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; write_hi = " 0 1 0 0 1 0 0 0", " x x x x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; mode = 0x04; delay = 12; blocksize = 128; readsize = 256; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "fuse" size = 1; ; memory "lock" size = 1; write = "1 0 1 0 1 1 0 0 1 1 1 x x i i x", "x x x x x x x x x x x x x x x x"; min_write_delay = 9000; max_write_delay = 9000; ; ; #------------------------------------------------------------ # AT90s2333 #------------------------------------------------------------ part id = "2333"; ##### WARNING: No XML file for device 'AT90S2333'! ##### desc = "AT90S2333"; stk500_devcode = 0x42; avr910_devcode = 0x34; signature = 0x1e 0x91 0x05; chip_erase_delay = 20000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 0; togglevtg = 0; poweroffdelay = 0; resetdelayms = 0; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 15; chiperasepolltimeout = 0; programfusepulsewidth = 2; programfusepolltimeout = 0; programlockpulsewidth = 0; programlockpolltimeout = 1; memory "eeprom" size = 128; min_write_delay = 9000; max_write_delay = 20000; readback_p1 = 0x00; readback_p2 = 0xff; read = "1 0 1 0 0 0 0 0 x x x x x x x x", "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; write = "1 1 0 0 0 0 0 0 x x x x x x x x", "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; mode = 0x04; delay = 12; blocksize = 128; readsize = 256; ; memory "flash" size = 2048; min_write_delay = 9000; max_write_delay = 20000; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " x x x x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " x x x x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write_lo = " 0 1 0 0 0 0 0 0", " x x x x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; write_hi = " 0 1 0 0 1 0 0 0", " x x x x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; mode = 0x04; delay = 12; blocksize = 128; readsize = 256; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "fuse" size = 1; min_write_delay = 9000; max_write_delay = 20000; pwroff_after_write = yes; read = "0 1 0 1 0 0 0 0 x x x x x x x x", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", "x x x x x x x x x x x x x x x x"; ; memory "lock" size = 1; min_write_delay = 9000; max_write_delay = 20000; read = "0 1 0 1 1 0 0 0 x x x x x x x x", "x x x x x x x x x x x x x o o x"; write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", "x x x x x x x x x x x x x x x x"; ; ; #------------------------------------------------------------ # AT90s2343 (also AT90s2323 and ATtiny22) #------------------------------------------------------------ part id = "2343"; desc = "AT90S2343"; stk500_devcode = 0x43; avr910_devcode = 0x4c; signature = 0x1e 0x91 0x03; chip_erase_delay = 18000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; hvsp_controlstack = 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; hventerstabdelay = 100; hvspcmdexedelay = 0; synchcycles = 6; latchcycles = 1; togglevtg = 0; poweroffdelay = 25; resetdelayms = 0; resetdelayus = 50; hvleavestabdelay = 100; resetdelay = 25; chiperasepolltimeout = 40; chiperasetime = 0; programfusepolltimeout = 25; programlockpolltimeout = 25; memory "eeprom" size = 128; min_write_delay = 9000; max_write_delay = 20000; readback_p1 = 0x00; readback_p2 = 0xff; read = "1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0", "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; write = "1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0", "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; mode = 0x04; delay = 12; blocksize = 64; readsize = 256; ; memory "flash" size = 2048; min_write_delay = 9000; max_write_delay = 20000; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " x x x x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " x x x x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write_lo = " 0 1 0 0 0 0 0 0", " x x x x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; write_hi = " 0 1 0 0 1 0 0 0", " x x x x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; mode = 0x04; delay = 12; blocksize = 128; readsize = 128; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "fuse" size = 1; min_write_delay = 9000; max_write_delay = 20000; read = "0 1 0 1 1 0 0 0 x x x x x x x x", "x x x x x x x x o o o x x x x o"; write = "1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 i", "x x x x x x x x x x x x x x x x"; ; memory "lock" size = 1; min_write_delay = 9000; max_write_delay = 20000; read = "0 1 0 1 1 0 0 0 x x x x x x x x", "x x x x x x x x o o o x x x x o"; write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", "x x x x x x x x x x x x x x x x"; ; ; #------------------------------------------------------------ # AT90s4433 #------------------------------------------------------------ part id = "4433"; desc = "AT90S4433"; stk500_devcode = 0x51; avr910_devcode = 0x30; signature = 0x1e 0x92 0x03; chip_erase_delay = 20000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 0; togglevtg = 0; poweroffdelay = 0; resetdelayms = 0; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 15; chiperasepolltimeout = 0; programfusepulsewidth = 2; programfusepolltimeout = 0; programlockpulsewidth = 0; programlockpolltimeout = 1; memory "eeprom" size = 256; min_write_delay = 9000; max_write_delay = 20000; readback_p1 = 0x00; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0 x x x x x x x x", "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; write = " 1 1 0 0 0 0 0 0 x x x x x x x x", "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; mode = 0x04; delay = 12; blocksize = 128; readsize = 256; ; memory "flash" size = 4096; min_write_delay = 9000; max_write_delay = 20000; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " x x x x x a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " x x x x x a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write_lo = " 0 1 0 0 0 0 0 0", " x x x x x a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; write_hi = " 0 1 0 0 1 0 0 0", " x x x x x a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; mode = 0x04; delay = 12; blocksize = 128; readsize = 256; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "fuse" size = 1; min_write_delay = 9000; max_write_delay = 20000; pwroff_after_write = yes; read = "0 1 0 1 0 0 0 0 x x x x x x x x", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", "x x x x x x x x x x x x x x x x"; ; memory "lock" size = 1; min_write_delay = 9000; max_write_delay = 20000; read = "0 1 0 1 1 0 0 0 x x x x x x x x", "x x x x x x x x x x x x x o o x"; write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", "x x x x x x x x x x x x x x x x"; ; ; #------------------------------------------------------------ # AT90s4434 #------------------------------------------------------------ part id = "4434"; ##### WARNING: No XML file for device 'AT90S4434'! ##### desc = "AT90S4434"; stk500_devcode = 0x52; avr910_devcode = 0x6c; signature = 0x1e 0x92 0x02; chip_erase_delay = 20000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", "x x x x x x x x x x x x x x x x"; memory "eeprom" size = 256; min_write_delay = 9000; max_write_delay = 20000; readback_p1 = 0x00; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0 x x x x x x x x", "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; write = " 1 1 0 0 0 0 0 0 x x x x x x x x", "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; ; memory "flash" size = 4096; min_write_delay = 9000; max_write_delay = 20000; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " x x x x x a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " x x x x x a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write_lo = " 0 1 0 0 0 0 0 0", " x x x x x a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; write_hi = " 0 1 0 0 1 0 0 0", " x x x x x a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "fuse" size = 1; min_write_delay = 9000; max_write_delay = 20000; read = "0 1 0 1 0 0 0 0 x x x x x x x x", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", "x x x x x x x x x x x x x x x x"; ; memory "lock" size = 1; min_write_delay = 9000; max_write_delay = 20000; read = "0 1 0 1 1 0 0 0 x x x x x x x x", "x x x x x x x x x x x x x o o x"; write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", "x x x x x x x x x x x x x x x x"; ; ; #------------------------------------------------------------ # AT90s8515 #------------------------------------------------------------ part id = "8515"; desc = "AT90S8515"; stk500_devcode = 0x60; avr910_devcode = 0x38; signature = 0x1e 0x93 0x01; chip_erase_delay = 20000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 0; togglevtg = 0; poweroffdelay = 0; resetdelayms = 0; resetdelayus = 0; hvleavestabdelay = 15; resetdelay = 15; chiperasepulsewidth = 15; chiperasepolltimeout = 0; programfusepulsewidth = 2; programfusepolltimeout = 0; programlockpulsewidth = 0; programlockpolltimeout = 1; memory "eeprom" size = 512; min_write_delay = 4000; max_write_delay = 9000; readback_p1 = 0x80; readback_p2 = 0x7f; read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; mode = 0x04; delay = 12; blocksize = 128; readsize = 256; ; memory "flash" size = 8192; min_write_delay = 4000; max_write_delay = 9000; readback_p1 = 0x7f; readback_p2 = 0x7f; read_lo = " 0 0 1 0 0 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write_lo = " 0 1 0 0 0 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; write_hi = " 0 1 0 0 1 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; mode = 0x04; delay = 12; blocksize = 128; readsize = 256; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "fuse" size = 1; ; memory "lock" size = 1; write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", "x x x x x x x x x x x x x x x x"; min_write_delay = 9000; max_write_delay = 9000; ; ; #------------------------------------------------------------ # AT90s8535 #------------------------------------------------------------ part id = "8535"; desc = "AT90S8535"; stk500_devcode = 0x61; avr910_devcode = 0x68; signature = 0x1e 0x93 0x03; chip_erase_delay = 20000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 0; togglevtg = 0; poweroffdelay = 0; resetdelayms = 0; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 15; chiperasepolltimeout = 0; programfusepulsewidth = 2; programfusepolltimeout = 0; programlockpulsewidth = 0; programlockpolltimeout = 1; memory "eeprom" size = 512; min_write_delay = 9000; max_write_delay = 20000; readback_p1 = 0x00; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; mode = 0x04; delay = 12; blocksize = 128; readsize = 256; ; memory "flash" size = 8192; min_write_delay = 9000; max_write_delay = 20000; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write_lo = " 0 1 0 0 0 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; write_hi = " 0 1 0 0 1 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; mode = 0x04; delay = 12; blocksize = 128; readsize = 256; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "fuse" size = 1; read = "0 1 0 1 1 0 0 0 x x x x x x x x", "x x x x x x x x x x x x x x x o"; write = "1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 i", "x x x x x x x x x x x x x x x x"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 x x x x x x x x", "x x x x x x x x o o x x x x x x"; write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", "x x x x x x x x x x x x x x x x"; min_write_delay = 9000; max_write_delay = 9000; ; ; #------------------------------------------------------------ # ATmega103 #------------------------------------------------------------ part id = "m103"; desc = "ATmega103"; stk500_devcode = 0xB1; avr910_devcode = 0x41; signature = 0x1e 0x97 0x01; chip_erase_delay = 112000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; pp_controlstack = 0x0E, 0x1E, 0x8E, 0x9E, 0x2E, 0x3E, 0xAE, 0xBE, 0x4E, 0x5E, 0xCE, 0xDE, 0x6E, 0x7E, 0xEE, 0xDE, 0x66, 0x76, 0xE6, 0xF6, 0x6A, 0x7A, 0xEA, 0x7A, 0x7F, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 0; togglevtg = 0; poweroffdelay = 0; resetdelayms = 0; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 15; chiperasepolltimeout = 0; programfusepulsewidth = 2; programfusepolltimeout = 0; programlockpulsewidth = 0; programlockpolltimeout = 10; memory "eeprom" size = 4096; min_write_delay = 4000; max_write_delay = 9000; readback_p1 = 0x80; readback_p2 = 0x7f; read = " 1 0 1 0 0 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; mode = 0x04; delay = 12; blocksize = 64; readsize = 256; ; memory "flash" paged = yes; size = 131072; page_size = 256; num_pages = 512; min_write_delay = 22000; max_write_delay = 56000; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 x x x x x x x", " x x x x x x x x"; mode = 0x11; delay = 70; blocksize = 256; readsize = 256; ; memory "fuse" size = 1; read = "0 1 0 1 0 0 0 0 x x x x x x x x", "x x x x x x x x x x o x o 1 o o"; write = "1 0 1 0 1 1 0 0 1 0 1 1 i 1 i i", "x x x x x x x x x x x x x x x x"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 x x x x x x x x", "x x x x x x x x x x x x x o o x"; write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", "x x x x x x x x x x x x x x x x"; min_write_delay = 9000; max_write_delay = 9000; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega64 #------------------------------------------------------------ part id = "m64"; desc = "ATmega64"; has_jtag = yes; stk500_devcode = 0xA0; avr910_devcode = 0x45; signature = 0x1e 0x96 0x02; chip_erase_delay = 9000; pagel = 0xD7; bs2 = 0xA0; reset = dedicated; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 6; togglevtg = 0; poweroffdelay = 0; resetdelayms = 0; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; idr = 0x22; spmcr = 0x68; allowfullpagebitstream = yes; ocdrev = 2; memory "eeprom" paged = no; /* leave this "no" */ page_size = 8; /* for parallel programming */ size = 2048; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; mode = 0x04; delay = 20; blocksize = 64; readsize = 256; ; memory "flash" paged = yes; size = 65536; page_size = 256; num_pages = 256; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " x a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " x a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " x a14 a13 a12 a11 a10 a9 a8", " a7 x x x x x x x", " x x x x x x x x"; mode = 0x21; delay = 6; blocksize = 128; readsize = 256; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x x x i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 4; read = "0 0 1 1 1 0 0 0 x x x x x x x x", "0 0 0 0 0 0 a1 a0 o o o o o o o o"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega128 #------------------------------------------------------------ part id = "m128"; desc = "ATmega128"; has_jtag = yes; stk500_devcode = 0xB2; avr910_devcode = 0x43; signature = 0x1e 0x97 0x02; chip_erase_delay = 9000; pagel = 0xD7; bs2 = 0xA0; reset = dedicated; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 6; togglevtg = 0; poweroffdelay = 0; resetdelayms = 0; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; idr = 0x22; spmcr = 0x68; rampz = 0x3b; allowfullpagebitstream = yes; ocdrev = 1; memory "eeprom" paged = no; /* leave this "no" */ page_size = 8; /* for parallel programming */ size = 4096; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; mode = 0x04; delay = 12; blocksize = 64; readsize = 256; ; memory "flash" paged = yes; size = 131072; page_size = 256; num_pages = 512; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 x x x x x x x", " x x x x x x x x"; mode = 0x21; delay = 6; blocksize = 128; readsize = 256; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x x x i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 4; read = "0 0 1 1 1 0 0 0 x x x x x x x x", "0 0 0 0 0 0 a1 a0 o o o o o o o o"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # AT90CAN128 #------------------------------------------------------------ part id = "c128"; desc = "AT90CAN128"; has_jtag = yes; stk500_devcode = 0xB3; # avr910_devcode = 0x43; signature = 0x1e 0x97 0x81; chip_erase_delay = 9000; pagel = 0xD7; bs2 = 0xA0; reset = dedicated; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 6; togglevtg = 0; poweroffdelay = 0; resetdelayms = 0; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; idr = 0x31; spmcr = 0x57; rampz = 0x3b; eecr = 0x3f; allowfullpagebitstream = no; ocdrev = 3; memory "eeprom" paged = no; /* leave this "no" */ page_size = 8; /* for parallel programming */ size = 4096; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " 0 0 0 x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " 0 0 0 x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 a2 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 0 0 0", " x x x x x x x x"; mode = 0x41; delay = 20; blocksize = 8; readsize = 256; ; memory "flash" paged = yes; size = 131072; page_size = 256; num_pages = 512; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 0 x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 0 x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 x x x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 256; readsize = 256; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # AT90CAN64 #------------------------------------------------------------ part id = "c64"; desc = "AT90CAN64"; has_jtag = yes; stk500_devcode = 0xB3; # avr910_devcode = 0x43; signature = 0x1e 0x96 0x81; chip_erase_delay = 9000; pagel = 0xD7; bs2 = 0xA0; reset = dedicated; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 6; togglevtg = 0; poweroffdelay = 0; resetdelayms = 0; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; idr = 0x31; spmcr = 0x57; rampz = 0x3b; eecr = 0x3f; allowfullpagebitstream = no; ocdrev = 3; memory "eeprom" paged = no; /* leave this "no" */ page_size = 8; /* for parallel programming */ size = 2048; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " 0 0 0 x x a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " 0 0 0 x x a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 a2 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x a10 a9 a8", " a7 a6 a5 a4 a3 0 0 0", " x x x x x x x x"; mode = 0x41; delay = 20; blocksize = 8; readsize = 256; ; memory "flash" paged = yes; size = 65536; page_size = 256; num_pages = 256; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 0 x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 0 x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 x x x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 256; readsize = 256; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # AT90CAN32 #------------------------------------------------------------ part id = "c32"; desc = "AT90CAN32"; has_jtag = yes; stk500_devcode = 0xB3; # avr910_devcode = 0x43; signature = 0x1e 0x95 0x81; chip_erase_delay = 9000; pagel = 0xD7; bs2 = 0xA0; reset = dedicated; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 6; togglevtg = 0; poweroffdelay = 0; resetdelayms = 0; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; idr = 0x31; spmcr = 0x57; rampz = 0x3b; eecr = 0x3f; allowfullpagebitstream = no; ocdrev = 3; memory "eeprom" paged = no; /* leave this "no" */ page_size = 8; /* for parallel programming */ size = 1024; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " 0 0 0 x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " 0 0 0 x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 a2 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x x a9 a8", " a7 a6 a5 a4 a3 0 0 0", " x x x x x x x x"; mode = 0x41; delay = 20; blocksize = 8; readsize = 256; ; memory "flash" paged = yes; size = 32768; page_size = 256; num_pages = 128; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 0 x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 0 x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 x x x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 256; readsize = 256; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega16 #------------------------------------------------------------ part id = "m16"; desc = "ATmega16"; has_jtag = yes; stk500_devcode = 0x82; avr910_devcode = 0x74; signature = 0x1e 0x94 0x03; pagel = 0xd7; bs2 = 0xa0; chip_erase_delay = 9000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 100; latchcycles = 6; togglevtg = 0; poweroffdelay = 0; resetdelayms = 0; resetdelayus = 0; hvleavestabdelay = 15; resetdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; idr = 0x31; spmcr = 0x57; allowfullpagebitstream = yes; ocdrev = 2; memory "eeprom" paged = no; /* leave this "no" */ page_size = 4; /* for parallel programming */ size = 512; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " 0 0 x x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " 0 0 x x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x x a9 a8", " a7 a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x04; delay = 10; blocksize = 128; readsize = 256; ; memory "flash" paged = yes; size = 16384; page_size = 128; num_pages = 128; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " 0 0 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 0 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 0 a13 a12 a11 a10 a9 a8", " a7 a6 x x x x x x", " x x x x x x x x"; mode = 0x21; delay = 6; blocksize = 128; readsize = 256; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lfuse" size = 1; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "calibration" size = 4; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega164P #------------------------------------------------------------ # close to ATmega16 part parent "m16" id = "m164p"; desc = "ATmega164P"; signature = 0x1e 0x94 0x0a; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; allowfullpagebitstream = no; chip_erase_delay = 55000; ocdrev = 3; ; #------------------------------------------------------------ # ATmega324P #------------------------------------------------------------ # similar to ATmega164P part id = "m324p"; desc = "ATmega324P"; has_jtag = yes; stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one avr910_devcode = 0x74; signature = 0x1e 0x95 0x08; pagel = 0xd7; bs2 = 0xa0; chip_erase_delay = 55000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; idr = 0x31; spmcr = 0x57; allowfullpagebitstream = no; ocdrev = 3; memory "eeprom" paged = no; /* leave this "no" */ page_size = 4; /* for parallel programming */ size = 1024; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " 0 0 x x x a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " 0 0 x x x a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x a10 a9 a8", " a7 a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 10; blocksize = 128; readsize = 256; ; memory "flash" paged = yes; size = 32768; page_size = 128; num_pages = 256; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " 0 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 a14 a13 a12 a11 a10 a9 a8", " a7 a6 x x x x x x", " x x x x x x x x"; mode = 0x21; delay = 6; blocksize = 256; readsize = 256; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lfuse" size = 1; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x 1 1 1 1 1 i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega324PA #------------------------------------------------------------ # similar to ATmega324P part parent "m324p" id = "m324pa"; desc = "ATmega324PA"; signature = 0x1e 0x95 0x11; ocdrev = 3; ; #------------------------------------------------------------ # ATmega644 #------------------------------------------------------------ # similar to ATmega164 part id = "m644"; desc = "ATmega644"; has_jtag = yes; stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one avr910_devcode = 0x74; signature = 0x1e 0x96 0x09; pagel = 0xd7; bs2 = 0xa0; chip_erase_delay = 55000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 6; togglevtg = 0; poweroffdelay = 0; resetdelayms = 0; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; idr = 0x31; spmcr = 0x57; allowfullpagebitstream = no; ocdrev = 3; memory "eeprom" paged = no; /* leave this "no" */ page_size = 8; /* for parallel programming */ size = 2048; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " 0 0 x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " 0 0 x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 a2 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 0 0 0", " x x x x x x x x"; mode = 0x41; delay = 10; blocksize = 128; readsize = 256; ; memory "flash" paged = yes; size = 65536; page_size = 256; num_pages = 256; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 x x x x x x x", " x x x x x x x x"; mode = 0x21; delay = 6; blocksize = 256; readsize = 256; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lfuse" size = 1; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x 1 1 1 1 1 i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega644P #------------------------------------------------------------ # similar to ATmega164p part parent "m644" id = "m644p"; desc = "ATmega644P"; signature = 0x1e 0x96 0x0a; ocdrev = 3; ; #------------------------------------------------------------ # ATmega1284P #------------------------------------------------------------ # similar to ATmega164p part id = "m1284p"; desc = "ATmega1284P"; has_jtag = yes; stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one avr910_devcode = 0x74; signature = 0x1e 0x97 0x05; pagel = 0xd7; bs2 = 0xa0; chip_erase_delay = 55000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 6; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; idr = 0x31; spmcr = 0x57; allowfullpagebitstream = no; ocdrev = 3; memory "eeprom" paged = no; /* leave this "no" */ page_size = 8; /* for parallel programming */ size = 4096; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " 0 0 x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " 0 0 x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 a2 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 0 0 0", " x x x x x x x x"; mode = 0x41; delay = 10; blocksize = 128; readsize = 256; ; memory "flash" paged = yes; size = 131072; page_size = 256; num_pages = 512; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 x x x x x x x", " x x x x x x x x"; mode = 0x41; delay = 10; blocksize = 256; readsize = 256; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lfuse" size = 1; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x 1 1 1 1 1 i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega162 #------------------------------------------------------------ part id = "m162"; desc = "ATmega162"; has_jtag = yes; stk500_devcode = 0x83; avr910_devcode = 0x63; signature = 0x1e 0x94 0x04; chip_erase_delay = 9000; pagel = 0xd7; bs2 = 0xa0; idr = 0x04; spmcr = 0x57; allowfullpagebitstream = yes; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; ocdrev = 2; memory "flash" paged = yes; size = 16384; page_size = 128; num_pages = 128; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " 0 0 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 0 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 0 a13 a12 a11 a10 a9 a8", " a7 a6 x x x x x x", " x x x x x x x x"; mode = 0x41; delay = 10; blocksize = 128; readsize = 256; ; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 6; togglevtg = 0; poweroffdelay = 0; resetdelayms = 0; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; memory "eeprom" paged = no; /* leave this "no" */ page_size = 4; /* for parallel programming */ size = 512; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " 0 0 x x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " 0 0 x x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x x a9 a8", " a7 a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 20; blocksize = 4; readsize = 256; ; memory "lfuse" size = 1; min_write_delay = 16000; max_write_delay = 16000; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "hfuse" size = 1; min_write_delay = 16000; max_write_delay = 16000; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "efuse" size = 1; min_write_delay = 16000; max_write_delay = 16000; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x 1 1 1 1 1 i i i"; ; memory "lock" size = 1; min_write_delay = 16000; max_write_delay = 16000; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega163 #------------------------------------------------------------ part id = "m163"; desc = "ATmega163"; stk500_devcode = 0x81; avr910_devcode = 0x64; signature = 0x1e 0x94 0x02; chip_erase_delay = 32000; pagel = 0xd7; bs2 = 0xa0; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 0; togglevtg = 0; poweroffdelay = 0; resetdelayms = 0; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 30; programfusepulsewidth = 0; programfusepolltimeout = 2; programlockpulsewidth = 0; programlockpolltimeout = 2; memory "eeprom" size = 512; min_write_delay = 4000; max_write_delay = 4000; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " x x x x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " x x x x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; mode = 0x41; delay = 20; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 16384; page_size = 128; num_pages = 128; min_write_delay = 16000; max_write_delay = 16000; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " x x x a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " x x x a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " x x x a12 a11 a10 a9 a8", " a7 a6 x x x x x x", " x x x x x x x x"; mode = 0x11; delay = 20; blocksize = 128; readsize = 256; ; memory "lfuse" size = 1; min_write_delay = 2000; max_write_delay = 2000; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o x x o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i 1 1 i i i i"; ; memory "hfuse" size = 1; min_write_delay = 2000; max_write_delay = 2000; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x x x x x 1 o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x 1 1 1 1 1 i i i"; ; memory "lock" size = 1; min_write_delay = 2000; max_write_delay = 2000; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x 0 x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 x x x x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega169 #------------------------------------------------------------ part id = "m169"; desc = "ATmega169"; has_jtag = yes; stk500_devcode = 0x85; avr910_devcode = 0x78; signature = 0x1e 0x94 0x05; chip_erase_delay = 9000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; idr = 0x31; spmcr = 0x57; ocdrev = 2; memory "eeprom" paged = no; /* leave this "no" */ page_size = 4; /* for parallel programming */ size = 512; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " x x x x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " x x x x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x x x a8", " a7 a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 20; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 16384; page_size = 128; num_pages = 128; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " x x x a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " x x x a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " x x x a12 a11 a10 a9 a8", " a7 a6 x x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 128; readsize = 256; ; memory "lfuse" size = 1; min_write_delay = 2000; max_write_delay = 2000; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "hfuse" size = 1; min_write_delay = 2000; max_write_delay = 2000; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; ; memory "lock" size = 1; min_write_delay = 2000; max_write_delay = 2000; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega329 #------------------------------------------------------------ part id = "m329"; desc = "ATmega329"; has_jtag = yes; # stk500_devcode = 0x85; # no STK500 support, only STK500v2 # avr910_devcode = 0x?; # try the ATmega169 one: avr910_devcode = 0x75; signature = 0x1e 0x95 0x03; chip_erase_delay = 9000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; idr = 0x31; spmcr = 0x57; ocdrev = 3; memory "eeprom" paged = no; /* leave this "no" */ page_size = 4; /* for parallel programming */ size = 1024; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " x x x x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " x x x x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x x a9 a8", " a7 a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 20; blocksize = 8; readsize = 256; ; memory "flash" paged = yes; size = 32768; page_size = 128; num_pages = 256; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " x a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " x a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " x x x a12 a11 a10 a9 a8", " a7 a6 x x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 256; readsize = 256; ; memory "lfuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "hfuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "efuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x x i i i"; ; memory "lock" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega329P #------------------------------------------------------------ # Identical to ATmega329 except of the signature part parent "m329" id = "m329p"; desc = "ATmega329P"; signature = 0x1e 0x95 0x0b; ocdrev = 3; ; #------------------------------------------------------------ # ATmega3290 #------------------------------------------------------------ # identical to ATmega329 part parent "m329" id = "m3290"; desc = "ATmega3290"; signature = 0x1e 0x95 0x04; ocdrev = 3; ; #------------------------------------------------------------ # ATmega3290P #------------------------------------------------------------ # identical to ATmega3290 except of the signature part parent "m3290" id = "m3290p"; desc = "ATmega3290P"; signature = 0x1e 0x95 0x0c; ocdrev = 3; ; #------------------------------------------------------------ # ATmega649 #------------------------------------------------------------ part id = "m649"; desc = "ATmega649"; has_jtag = yes; # stk500_devcode = 0x85; # no STK500 support, only STK500v2 # avr910_devcode = 0x?; # try the ATmega169 one: avr910_devcode = 0x75; signature = 0x1e 0x96 0x03; chip_erase_delay = 9000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; idr = 0x31; spmcr = 0x57; ocdrev = 3; memory "eeprom" paged = no; /* leave this "no" */ page_size = 8; /* for parallel programming */ size = 2048; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " x x x x x a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " x x x x x a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 a2 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x a10 a9 a8", " a7 a6 a5 a4 a3 0 0 0", " x x x x x x x x"; mode = 0x41; delay = 20; blocksize = 8; readsize = 256; ; memory "flash" paged = yes; size = 65536; page_size = 256; num_pages = 256; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " x x x a12 a11 a10 a9 a8", " a7 x x x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 256; readsize = 256; ; memory "lfuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "hfuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "efuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x x i i i"; ; memory "lock" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega6490 #------------------------------------------------------------ # identical to ATmega649 part parent "m649" id = "m6490"; desc = "ATmega6490"; signature = 0x1e 0x96 0x04; ocdrev = 3; ; #------------------------------------------------------------ # ATmega32 #------------------------------------------------------------ part id = "m32"; desc = "ATmega32"; has_jtag = yes; stk500_devcode = 0x91; avr910_devcode = 0x72; signature = 0x1e 0x95 0x02; chip_erase_delay = 9000; pagel = 0xd7; bs2 = 0xa0; reset = dedicated; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 6; togglevtg = 0; poweroffdelay = 0; resetdelayms = 0; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; idr = 0x31; spmcr = 0x57; allowfullpagebitstream = yes; ocdrev = 2; memory "eeprom" paged = no; /* leave this "no" */ page_size = 4; /* for parallel programming */ size = 1024; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " 0 0 x x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " 0 0 x x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x x a9 a8", " a7 a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x04; delay = 10; blocksize = 64; readsize = 256; ; memory "flash" paged = yes; size = 32768; page_size = 128; num_pages = 256; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " 0 0 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 0 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 0 a13 a12 a11 a10 a9 a8", " a7 a6 x x x x x x", " x x x x x x x x"; mode = 0x21; delay = 6; blocksize = 64; readsize = 256; ; memory "lfuse" size = 1; min_write_delay = 2000; max_write_delay = 2000; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "hfuse" size = 1; min_write_delay = 2000; max_write_delay = 2000; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "lock" size = 1; min_write_delay = 2000; max_write_delay = 2000; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "calibration" size = 4; read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", "0 0 0 0 0 0 a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega161 #------------------------------------------------------------ part id = "m161"; desc = "ATmega161"; stk500_devcode = 0x80; avr910_devcode = 0x60; signature = 0x1e 0x94 0x01; chip_erase_delay = 28000; pagel = 0xd7; bs2 = 0xa0; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 0; togglevtg = 0; poweroffdelay = 0; resetdelayms = 0; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 30; programfusepulsewidth = 0; programfusepolltimeout = 2; programlockpulsewidth = 0; programlockpolltimeout = 2; memory "eeprom" size = 512; min_write_delay = 3400; max_write_delay = 3400; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " x x x x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " x x x x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; mode = 0x04; delay = 5; blocksize = 128; readsize = 256; ; memory "flash" paged = yes; size = 16384; page_size = 128; num_pages = 128; min_write_delay = 14000; max_write_delay = 14000; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " x x x a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " x x x a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " x x x a12 a11 a10 a9 a8", " a7 a6 x x x x x x", " x x x x x x x x"; mode = 0x21; delay = 16; blocksize = 128; readsize = 256; ; memory "fuse" size = 1; min_write_delay = 2000; max_write_delay = 2000; read = "0 1 0 1 0 0 0 0 x x x x x x x x", "x x x x x x x x x o x o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", "x x x x x x x x 1 i 1 i i i i i"; ; memory "lock" size = 1; min_write_delay = 2000; max_write_delay = 2000; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega8 #------------------------------------------------------------ part id = "m8"; desc = "ATmega8"; stk500_devcode = 0x70; avr910_devcode = 0x76; signature = 0x1e 0x93 0x07; pagel = 0xd7; bs2 = 0xc2; chip_erase_delay = 10000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 2; resetdelayus = 0; hvleavestabdelay = 15; resetdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; memory "eeprom" size = 512; page_size = 4; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " 0 0 x x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " 0 0 x x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; mode = 0x04; delay = 20; blocksize = 128; readsize = 256; ; memory "flash" paged = yes; size = 8192; page_size = 64; num_pages = 128; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0x00; read_lo = " 0 0 1 0 0 0 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 0 0 x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 0 0 x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 x x x x x", " x x x x x x x x"; mode = 0x21; delay = 10; blocksize = 64; readsize = 256; ; memory "lfuse" size = 1; min_write_delay = 2000; max_write_delay = 2000; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "hfuse" size = 1; min_write_delay = 2000; max_write_delay = 2000; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "lock" size = 1; min_write_delay = 2000; max_write_delay = 2000; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; ; memory "calibration" size = 4; read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", "0 0 0 0 0 0 a1 a0 o o o o o o o o"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega8515 #------------------------------------------------------------ part id = "m8515"; desc = "ATmega8515"; stk500_devcode = 0x63; avr910_devcode = 0x3A; signature = 0x1e 0x93 0x06; chip_erase_delay = 9000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 6; togglevtg = 0; poweroffdelay = 0; resetdelayms = 0; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; memory "eeprom" size = 512; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " 0 0 x x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " 0 0 x x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; mode = 0x04; delay = 20; blocksize = 128; readsize = 256; ; memory "flash" paged = yes; size = 8192; page_size = 64; num_pages = 128; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 0 0 x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 0 0 x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 x x x x x", " x x x x x x x x"; mode = 0x21; delay = 6; blocksize = 64; readsize = 256; ; memory "lfuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "hfuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "lock" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; ; memory "calibration" size = 4; read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", "0 0 0 0 0 0 a1 a0 o o o o o o o o"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega8535 #------------------------------------------------------------ part id = "m8535"; desc = "ATmega8535"; stk500_devcode = 0x64; avr910_devcode = 0x69; signature = 0x1e 0x93 0x08; pagel = 0xd7; bs2 = 0xa0; chip_erase_delay = 9000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 6; togglevtg = 0; poweroffdelay = 0; resetdelayms = 0; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; memory "eeprom" size = 512; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " 0 0 x x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " 0 0 x x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; mode = 0x04; delay = 20; blocksize = 128; readsize = 256; ; memory "flash" paged = yes; size = 8192; page_size = 64; num_pages = 128; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 0 0 x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 0 0 x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 x x x x x", " x x x x x x x x"; mode = 0x21; delay = 6; blocksize = 64; readsize = 256; ; memory "lfuse" size = 1; min_write_delay = 2000; max_write_delay = 2000; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "hfuse" size = 1; min_write_delay = 2000; max_write_delay = 2000; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "lock" size = 1; min_write_delay = 2000; max_write_delay = 2000; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; ; memory "calibration" size = 4; read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", "0 0 0 0 0 0 a1 a0 o o o o o o o o"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATtiny26 #------------------------------------------------------------ part id = "t26"; desc = "ATtiny26"; stk500_devcode = 0x21; avr910_devcode = 0x5e; signature = 0x1e 0x91 0x09; pagel = 0xb3; bs2 = 0xb2; chip_erase_delay = 9000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; pp_controlstack = 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 2; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; memory "eeprom" size = 128; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0xff; readback_p2 = 0xff; read = "1 0 1 0 0 0 0 0 x x x x x x x x", "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; write = "1 1 0 0 0 0 0 0 x x x x x x x x", "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; mode = 0x04; delay = 10; blocksize = 64; readsize = 256; ; memory "flash" paged = yes; size = 2048; page_size = 32; num_pages = 64; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " x x x x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " x x x x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x x", " x x x x a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x x", " x x x x a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " x x x x x x a9 a8", " a7 a6 a5 a4 x x x x", " x x x x x x x x"; mode = 0x21; delay = 6; blocksize = 16; readsize = 256; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "0 0 0 0 0 0 a1 a0 o o o o o o o o"; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 x x x x x x x x", "x x x x x x x x x x x x x x o o"; write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", "x x x x x x x x x x x x x x x x"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x x x x i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x x x x o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 4; read = "0 0 1 1 1 0 0 0 x x x x x x x x", "0 0 0 0 0 0 a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATtiny261 #------------------------------------------------------------ # Close to ATtiny26 part id = "t261"; desc = "ATtiny261"; has_debugwire = yes; flash_instr = 0xB4, 0x00, 0x10; eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, 0x99, 0xE1, 0xBB, 0xAC; # stk500_devcode = 0x21; # avr910_devcode = 0x5e; signature = 0x1e 0x91 0x0c; pagel = 0xb3; bs2 = 0xb2; chip_erase_delay = 4000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; pp_controlstack = 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 2; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; ocdrev = 1; memory "eeprom" paged = no; size = 128; page_size = 4; num_pages = 32; min_write_delay = 4000; max_write_delay = 4000; readback_p1 = 0xff; readback_p2 = 0xff; read = "1 0 1 0 0 0 0 0 x x x x x x x x", "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; write = "1 1 0 0 0 0 0 0 x x x x x x x x", "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x x x x", " x a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 10; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 2048; page_size = 32; num_pages = 64; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " x x x x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " x x x x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x x", " x x x x a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x x", " x x x x a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " x x x x x x a9 a8", " a7 a6 a5 a4 x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 32; readsize = 256; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "0 0 0 0 0 0 a1 a0 o o o o o o o o"; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 x x x x x x x x", "x x x x x x x x x x x x x x o o"; write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", "x x x x x x x x x x x x x x x x"; min_write_delay = 4500; max_write_delay = 4500; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 4500; max_write_delay = 4500; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 4500; max_write_delay = 4500; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x x x x i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x x x x x x x x o"; min_write_delay = 4500; max_write_delay = 4500; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 x x x x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATtiny461 #------------------------------------------------------------ # Close to ATtiny261 part id = "t461"; desc = "ATtiny461"; has_debugwire = yes; flash_instr = 0xB4, 0x00, 0x10; eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, 0x99, 0xE1, 0xBB, 0xAC; # stk500_devcode = 0x21; # avr910_devcode = 0x5e; signature = 0x1e 0x92 0x08; pagel = 0xb3; bs2 = 0xb2; chip_erase_delay = 4000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; pp_controlstack = 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 2; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; ocdrev = 1; memory "eeprom" paged = no; size = 256; page_size = 4; num_pages = 64; min_write_delay = 4000; max_write_delay = 4000; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0 x x x x x x x x", "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; write = " 1 1 0 0 0 0 0 0 x x x x x x x x", "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x x x x", " a7 a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 10; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 4096; page_size = 64; num_pages = 64; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " x x x x x a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " x x x x x a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " x x x x x a10 a9 a8", " a7 a6 a5 x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 64; readsize = 256; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "0 0 0 0 0 0 a1 a0 o o o o o o o o"; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 x x x x x x x x", "x x x x x x x x x x x x x x o o"; write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", "x x x x x x x x x x x x x x x x"; min_write_delay = 4500; max_write_delay = 4500; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 4500; max_write_delay = 4500; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 4500; max_write_delay = 4500; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x x x x i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x x x x x x x x o"; min_write_delay = 4500; max_write_delay = 4500; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 x x x x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATtiny861 #------------------------------------------------------------ # Close to ATtiny461 part id = "t861"; desc = "ATtiny861"; has_debugwire = yes; flash_instr = 0xB4, 0x00, 0x10; eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, 0x99, 0xE1, 0xBB, 0xAC; # stk500_devcode = 0x21; # avr910_devcode = 0x5e; signature = 0x1e 0x93 0x0d; pagel = 0xb3; bs2 = 0xb2; chip_erase_delay = 4000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; pp_controlstack = 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 2; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; ocdrev = 1; memory "eeprom" paged = no; size = 512; num_pages = 128; page_size = 4; min_write_delay = 4000; max_write_delay = 4000; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x x x a8", " a7 a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 10; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 8192; page_size = 64; num_pages = 128; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 64; readsize = 256; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "0 0 0 0 0 0 a1 a0 o o o o o o o o"; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 x x x x x x x x", "x x x x x x x x x x x x x x o o"; write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", "x x x x x x x x x x x x x x x x"; min_write_delay = 4500; max_write_delay = 4500; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 4500; max_write_delay = 4500; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 4500; max_write_delay = 4500; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x x x x i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x x x x x x x x o"; min_write_delay = 4500; max_write_delay = 4500; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 x x x x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega48 #------------------------------------------------------------ part id = "m48"; desc = "ATmega48"; has_debugwire = yes; flash_instr = 0xB6, 0x01, 0x11; eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, 0x99, 0xF9, 0xBB, 0xAF; stk500_devcode = 0x59; # avr910_devcode = 0x; signature = 0x1e 0x92 0x05; pagel = 0xd7; bs2 = 0xc2; chip_erase_delay = 45000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; resetdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; ocdrev = 1; memory "eeprom" paged = no; page_size = 4; size = 256; min_write_delay = 3600; max_write_delay = 3600; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " 0 0 0 x x x x x", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " 0 0 0 x x x x x", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x x x x", " a7 a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 20; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 4096; page_size = 64; num_pages = 64; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0x00; readback_p2 = 0x00; read_lo = " 0 0 1 0 0 0 0 0", " 0 0 0 0 0 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 0 0 0 0 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 0 x x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 0 x x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 0 0 0 0 a10 a9 a8", " a7 a6 a5 x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 64; readsize = 256; ; memory "lfuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "hfuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "efuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x x x x x x x x o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x x x x i"; ; memory "lock" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega48P #------------------------------------------------------------ part parent "m48" id = "m48p"; desc = "ATmega48P"; signature = 0x1e 0x92 0x0a; ocdrev = 1; ; #------------------------------------------------------------ # ATmega88 #------------------------------------------------------------ part id = "m88"; desc = "ATmega88"; has_debugwire = yes; flash_instr = 0xB6, 0x01, 0x11; eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, 0x99, 0xF9, 0xBB, 0xAF; stk500_devcode = 0x73; # avr910_devcode = 0x; signature = 0x1e 0x93 0x0a; pagel = 0xd7; bs2 = 0xc2; chip_erase_delay = 9000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; resetdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; ocdrev = 1; memory "eeprom" paged = no; page_size = 4; size = 512; min_write_delay = 3600; max_write_delay = 3600; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " 0 0 0 x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " 0 0 0 x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x x x a8", " a7 a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 20; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 8192; page_size = 64; num_pages = 128; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 0 x x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 0 x x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 64; readsize = 256; ; memory "lfuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "hfuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "efuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x x x x x x o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x x i i i"; ; memory "lock" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega88P #------------------------------------------------------------ part parent "m88" id = "m88p"; desc = "ATmega88P"; signature = 0x1e 0x93 0x0f; ocdrev = 1; ; #------------------------------------------------------------ # ATmega168 #------------------------------------------------------------ part id = "m168"; desc = "ATmega168"; has_debugwire = yes; flash_instr = 0xB6, 0x01, 0x11; eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, 0x99, 0xF9, 0xBB, 0xAF; stk500_devcode = 0x86; # avr910_devcode = 0x; signature = 0x1e 0x94 0x06; pagel = 0xd7; bs2 = 0xc2; chip_erase_delay = 9000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; resetdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; ocdrev = 1; memory "eeprom" paged = no; page_size = 4; size = 512; min_write_delay = 3600; max_write_delay = 3600; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " 0 0 0 x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " 0 0 0 x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x x x a8", " a7 a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 20; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 16384; page_size = 128; num_pages = 128; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " 0 0 0 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 0 0 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 0 x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 0 x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 0 0 a12 a11 a10 a9 a8", " a7 a6 x x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 128; readsize = 256; ; memory "lfuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "hfuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "efuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x x x x x x o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x x i i i"; ; memory "lock" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega168P #------------------------------------------------------------ part parent "m168" id = "m168p"; desc = "ATmega168P"; signature = 0x1e 0x94 0x0b; ocdrev = 1; ; #------------------------------------------------------------ # ATtiny88 #------------------------------------------------------------ part id = "t88"; desc = "ATtiny88"; has_debugwire = yes; flash_instr = 0xB6, 0x01, 0x11; eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, 0x99, 0xF9, 0xBB, 0xAF; stk500_devcode = 0x73; # avr910_devcode = 0x; signature = 0x1e 0x93 0x11; pagel = 0xd7; bs2 = 0xc2; chip_erase_delay = 9000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; resetdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; ocdrev = 1; memory "eeprom" paged = no; page_size = 4; size = 64; min_write_delay = 3600; max_write_delay = 3600; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " 0 0 0 x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " 0 0 0 x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x x x x", " x a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 20; blocksize = 4; readsize = 64; ; memory "flash" paged = yes; size = 8192; page_size = 64; num_pages = 128; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 0 x x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 0 x x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 64; readsize = 256; ; memory "lfuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "hfuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "efuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x x x x x x o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x x x x i"; ; memory "lock" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega328 #------------------------------------------------------------ part id = "m328"; desc = "ATmega328"; has_debugwire = yes; flash_instr = 0xB6, 0x01, 0x11; eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, 0x99, 0xF9, 0xBB, 0xAF; stk500_devcode = 0x86; # avr910_devcode = 0x; signature = 0x1e 0x95 0x14; pagel = 0xd7; bs2 = 0xc2; chip_erase_delay = 9000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; resetdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; ocdrev = 1; memory "eeprom" paged = no; page_size = 4; size = 1024; min_write_delay = 3600; max_write_delay = 3600; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " 0 0 0 x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " 0 0 0 x x x a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x x a9 a8", " a7 a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 20; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 32768; page_size = 128; num_pages = 256; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " 0 0 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 0 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 0 x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 0 x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 0 a13 a12 a11 a10 a9 a8", " a7 a6 x x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 128; readsize = 256; ; memory "lfuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "hfuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "efuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x x x x x x o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x x i i i"; ; memory "lock" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; part parent "m328" id = "m328p"; desc = "ATmega328P"; signature = 0x1e 0x95 0x0F; ocdrev = 1; ; #------------------------------------------------------------ # ATtiny2313 #------------------------------------------------------------ part id = "t2313"; desc = "ATtiny2313"; has_debugwire = yes; flash_instr = 0xB2, 0x0F, 0x1F; eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, 0xBA, 0x0F, 0xB2, 0x0F, 0xBA, 0x0D, 0xBB, 0xBC, 0x99, 0xE1, 0xBB, 0xAC; stk500_devcode = 0x23; ## Use the ATtiny26 devcode: avr910_devcode = 0x5e; signature = 0x1e 0x91 0x0a; pagel = 0xD4; bs2 = 0xD6; reset = io; chip_erase_delay = 9000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0E, 0x1E, 0x2E, 0x3E, 0x2E, 0x3E, 0x4E, 0x5E, 0x4E, 0x5E, 0x6E, 0x7E, 0x6E, 0x7E, 0x26, 0x36, 0x66, 0x76, 0x2A, 0x3A, 0x6A, 0x7A, 0x2E, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; ocdrev = 0; memory "eeprom" size = 128; paged = no; page_size = 4; min_write_delay = 4000; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x x x x", " x a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 2048; page_size = 32; num_pages = 64; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " 0 0 0 0 0 0 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 0 0 0 0 0 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; # The information in the data sheet of April/2004 is wrong, this works: loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 0 x x x x x", " x x x x a3 a2 a1 a0", " i i i i i i i i"; # The information in the data sheet of April/2004 is wrong, this works: loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 0 x x x x x", " x x x x a3 a2 a1 a0", " i i i i i i i i"; # The information in the data sheet of April/2004 is wrong, this works: writepage = " 0 1 0 0 1 1 0 0", " 0 0 0 0 0 0 a9 a8", " a7 a6 a5 a4 x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 32; readsize = 256; ; # ATtiny2313 has Signature Bytes: 0x1E 0x91 0x0A. memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "lock" size = 1; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x x x x i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; # The Tiny2313 has calibration data for both 4 MHz and 8 MHz. # The information in the data sheet of April/2004 is wrong, this works: memory "calibration" size = 2; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATtiny4313 #------------------------------------------------------------ part id = "t4313"; desc = "ATtiny4313"; has_debugwire = yes; flash_instr = 0xB2, 0x0F, 0x1F; eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, 0xBA, 0x0F, 0xB2, 0x0F, 0xBA, 0x0D, 0xBB, 0xBC, 0x99, 0xE1, 0xBB, 0xAC; stk500_devcode = 0x23; ## Use the ATtiny26 devcode: avr910_devcode = 0x5e; signature = 0x1e 0x92 0x0d; pagel = 0xD4; bs2 = 0xD6; reset = io; chip_erase_delay = 9000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0E, 0x1E, 0x2E, 0x3E, 0x2E, 0x3E, 0x4E, 0x5E, 0x4E, 0x5E, 0x6E, 0x7E, 0x6E, 0x7E, 0x26, 0x36, 0x66, 0x76, 0x2A, 0x3A, 0x6A, 0x7A, 0x2E, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; ocdrev = 0; memory "eeprom" size = 256; paged = no; page_size = 4; min_write_delay = 4000; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x x x x", " a7 a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 4096; page_size = 64; num_pages = 64; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " 0 0 0 0 0 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 0 0 0 0 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 0 x x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 0 x x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 0 0 0 0 a10 a9 a8", " a7 a6 a5 x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 32; readsize = 256; ; # ATtiny4313 has Signature Bytes: 0x1E 0x92 0x0D. memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "lock" size = 1; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x x x x i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 2; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # AT90PWM2 #------------------------------------------------------------ part id = "pwm2"; desc = "AT90PWM2"; has_debugwire = yes; flash_instr = 0xB6, 0x01, 0x11; eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, 0x99, 0xF9, 0xBB, 0xAF; stk500_devcode = 0x65; ## avr910_devcode = ?; signature = 0x1e 0x93 0x81; pagel = 0xD8; bs2 = 0xE2; reset = io; chip_erase_delay = 9000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; memory "eeprom" size = 512; paged = no; page_size = 4; min_write_delay = 4000; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x x x x", " a7 a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 8192; page_size = 64; num_pages = 128; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 0 x x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 0 x x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 64; readsize = 256; ; # AT90PWM2 has Signature Bytes: 0x1E 0x93 0x81. memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "lock" size = 1; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; ; #------------------------------------------------------------ # AT90PWM3 #------------------------------------------------------------ # Completely identical to AT90PWM2 (including the signature!) part parent "pwm2" id = "pwm3"; desc = "AT90PWM3"; ; #------------------------------------------------------------ # AT90PWM2B #------------------------------------------------------------ # Same as AT90PWM2 but different signature. part parent "pwm2" id = "pwm2b"; desc = "AT90PWM2B"; signature = 0x1e 0x93 0x83; ocdrev = 1; ; #------------------------------------------------------------ # AT90PWM3B #------------------------------------------------------------ # Completely identical to AT90PWM2B (including the signature!) part parent "pwm2b" id = "pwm3b"; desc = "AT90PWM3B"; ocdrev = 1; ; #------------------------------------------------------------ # AT90PWM316 #------------------------------------------------------------ # Similar to AT90PWM3B, but with 16 kiB flash, 512 B EEPROM, and 1024 B SRAM. part parent "pwm3b" id = "pwm316"; desc = "AT90PWM316"; signature = 0x1e 0x94 0x83; ocdrev = 1; memory "flash" paged = yes; size = 16384; page_size = 128; num_pages = 128; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " 0 0 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 0 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 0 a13 a12 a11 a10 a9 a8", " a7 a6 x x x x x x", " x x x x x x x x"; mode = 0x21; delay = 6; blocksize = 128; readsize = 256; ; ; #------------------------------------------------------------ # ATtiny25 #------------------------------------------------------------ part id = "t25"; desc = "ATtiny25"; has_debugwire = yes; flash_instr = 0xB4, 0x02, 0x12; eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, 0x99, 0xE1, 0xBB, 0xAC; ## no STK500 devcode in XML file, use the ATtiny45 one stk500_devcode = 0x14; ## avr910_devcode = ?; ## Try the AT90S2313 devcode: avr910_devcode = 0x20; signature = 0x1e 0x91 0x08; reset = io; chip_erase_delay = 4500; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; hvsp_controlstack = 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; hventerstabdelay = 100; hvspcmdexedelay = 0; synchcycles = 6; latchcycles = 1; togglevtg = 1; poweroffdelay = 25; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 100; resetdelay = 25; chiperasepolltimeout = 40; chiperasetime = 0; programfusepolltimeout = 25; programlockpolltimeout = 25; ocdrev = 1; memory "eeprom" size = 128; paged = no; page_size = 4; min_write_delay = 4000; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x x x x", " x a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 2048; page_size = 32; num_pages = 64; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " 0 0 0 0 0 0 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 0 0 0 0 0 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 0 x x x x x", " x x x x a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 0 x x x x x", " x x x x a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 0 0 0 0 0 a9 a8", " a7 a6 a5 a4 x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 32; readsize = 256; ; # ATtiny25 has Signature Bytes: 0x1E 0x91 0x08. memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "lock" size = 1; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x x x x i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 2; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATtiny45 #------------------------------------------------------------ part id = "t45"; desc = "ATtiny45"; has_debugwire = yes; flash_instr = 0xB4, 0x02, 0x12; eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, 0x99, 0xE1, 0xBB, 0xAC; stk500_devcode = 0x14; ## avr910_devcode = ?; ## Try the AT90S2313 devcode: avr910_devcode = 0x20; signature = 0x1e 0x92 0x06; reset = io; chip_erase_delay = 4500; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; hvsp_controlstack = 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; hventerstabdelay = 100; progmodedelay = 0; hvspcmdexedelay = 0; synchcycles = 6; latchcycles = 1; togglevtg = 1; poweroffdelay = 25; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 100; resetdelay = 25; chiperasepolltimeout = 40; chiperasetime = 0; programfusepolltimeout = 25; programlockpolltimeout = 25; ocdrev = 1; memory "eeprom" size = 256; page_size = 4; min_write_delay = 4000; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x x x x", " a7 a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 4096; page_size = 64; num_pages = 64; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " 0 0 0 0 0 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 0 0 0 0 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 0 x x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 0 x x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 0 0 0 0 a10 a9 a8", " a7 a6 a5 x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 32; readsize = 256; ; # ATtiny45 has Signature Bytes: 0x1E 0x92 0x08. (Data sheet 2586C-AVR-06/05 (doc2586.pdf) indicates otherwise!) memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "lock" size = 1; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x x x x i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 2; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATtiny85 #------------------------------------------------------------ part id = "t85"; desc = "ATtiny85"; has_debugwire = yes; flash_instr = 0xB4, 0x02, 0x12; eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, 0x99, 0xE1, 0xBB, 0xAC; ## no STK500 devcode in XML file, use the ATtiny45 one stk500_devcode = 0x14; ## avr910_devcode = ?; ## Try the AT90S2313 devcode: avr910_devcode = 0x20; signature = 0x1e 0x93 0x0b; reset = io; chip_erase_delay = 400000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; hvsp_controlstack = 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; hventerstabdelay = 100; hvspcmdexedelay = 0; synchcycles = 6; latchcycles = 1; togglevtg = 1; poweroffdelay = 25; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 100; resetdelay = 25; chiperasepolltimeout = 40; chiperasetime = 0; programfusepolltimeout = 25; programlockpolltimeout = 25; ocdrev = 1; memory "eeprom" size = 512; paged = no; page_size = 4; min_write_delay = 4000; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x x x a8", " a7 a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 12; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 8192; page_size = 64; num_pages = 128; min_write_delay = 30000; max_write_delay = 30000; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 0 x x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 0 x x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 32; readsize = 256; ; # ATtiny85 has Signature Bytes: 0x1E 0x93 0x08. memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "lock" size = 1; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x x x x i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 2; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega640 #------------------------------------------------------------ # Almost same as ATmega1280, except for different memory sizes part id = "m640"; desc = "ATmega640"; signature = 0x1e 0x96 0x08; has_jtag = yes; # stk500_devcode = 0xB2; # avr910_devcode = 0x43; chip_erase_delay = 9000; pagel = 0xD7; bs2 = 0xA0; reset = dedicated; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; idr = 0x31; spmcr = 0x57; rampz = 0x3b; allowfullpagebitstream = no; ocdrev = 3; memory "eeprom" paged = no; /* leave this "no" */ page_size = 8; /* for parallel programming */ size = 4096; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0x00; readback_p2 = 0x00; read = " 1 0 1 0 0 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 a2 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 0 0 0", " x x x x x x x x"; mode = 0x41; delay = 10; blocksize = 8; readsize = 256; ; memory "flash" paged = yes; size = 65536; page_size = 256; num_pages = 256; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0x00; readback_p2 = 0x00; read_lo = " 0 0 1 0 0 0 0 0", " 0 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 a14 a13 a12 a11 a10 a9 a8", " a7 x x x x x x x", " x x x x x x x x"; mode = 0x41; delay = 10; blocksize = 256; readsize = 256; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x x i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 x x x x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega1280 #------------------------------------------------------------ part id = "m1280"; desc = "ATmega1280"; signature = 0x1e 0x97 0x03; has_jtag = yes; # stk500_devcode = 0xB2; # avr910_devcode = 0x43; chip_erase_delay = 9000; pagel = 0xD7; bs2 = 0xA0; reset = dedicated; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; idr = 0x31; spmcr = 0x57; rampz = 0x3b; allowfullpagebitstream = no; ocdrev = 3; memory "eeprom" paged = no; /* leave this "no" */ page_size = 8; /* for parallel programming */ size = 4096; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0x00; readback_p2 = 0x00; read = " 1 0 1 0 0 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 a2 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 0 0 0", " x x x x x x x x"; mode = 0x41; delay = 10; blocksize = 8; readsize = 256; ; memory "flash" paged = yes; size = 131072; page_size = 256; num_pages = 512; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0x00; readback_p2 = 0x00; read_lo = " 0 0 1 0 0 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 x x x x x x x", " x x x x x x x x"; mode = 0x41; delay = 10; blocksize = 256; readsize = 256; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x x i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 x x x x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega1281 #------------------------------------------------------------ # Identical to ATmega1280 part parent "m1280" id = "m1281"; desc = "ATmega1281"; signature = 0x1e 0x97 0x04; ocdrev = 3; ; #------------------------------------------------------------ # ATmega2560 #------------------------------------------------------------ part id = "m2560"; desc = "ATmega2560"; signature = 0x1e 0x98 0x01; has_jtag = yes; # stk500_devcode = 0xB2; # avr910_devcode = 0x43; chip_erase_delay = 9000; pagel = 0xD7; bs2 = 0xA0; reset = dedicated; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; idr = 0x31; spmcr = 0x57; rampz = 0x3b; allowfullpagebitstream = no; ocdrev = 4; memory "eeprom" paged = no; /* leave this "no" */ page_size = 8; /* for parallel programming */ size = 4096; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0x00; readback_p2 = 0x00; read = " 1 0 1 0 0 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 a2 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 0 0 0", " x x x x x x x x"; mode = 0x41; delay = 10; blocksize = 8; readsize = 256; ; memory "flash" paged = yes; size = 262144; page_size = 256; num_pages = 1024; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0x00; readback_p2 = 0x00; read_lo = " 0 0 1 0 0 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 x x x x x x x", " x x x x x x x x"; load_ext_addr = " 0 1 0 0 1 1 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 0 a16", " 0 0 0 0 0 0 0 0"; mode = 0x41; delay = 10; blocksize = 256; readsize = 256; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x x i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 x x x x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega2561 #------------------------------------------------------------ part parent "m2560" id = "m2561"; desc = "ATmega2561"; signature = 0x1e 0x98 0x02; ocdrev = 4; ; #------------------------------------------------------------ # ATmega128RFA1 #------------------------------------------------------------ # Identical to ATmega2561 but half the ROM part parent "m2561" id = "m128rfa1"; desc = "ATmega128RFA1"; signature = 0x1e 0xa7 0x01; chip_erase_delay = 55000; bs2 = 0xE2; ocdrev = 3; memory "flash" paged = yes; size = 131072; page_size = 256; num_pages = 512; min_write_delay = 50000; max_write_delay = 50000; readback_p1 = 0x00; readback_p2 = 0x00; read_lo = " 0 0 1 0 0 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 x x x x x x x", " x x x x x x x x"; mode = 0x41; delay = 20; blocksize = 256; readsize = 256; ; ; #------------------------------------------------------------ # ATmega256RFR2 #------------------------------------------------------------ part parent "m2561" id = "m256rfr2"; desc = "ATmega256RFR2"; signature = 0x1e 0xa8 0x02; chip_erase_delay = 55000; bs2 = 0xE2; ocdrev = 4; ; #------------------------------------------------------------ # ATmega128RFR2 #------------------------------------------------------------ part parent "m128rfa1" id = "m128rfr2"; desc = "ATmega128RFR2"; signature = 0x1e 0xa7 0x02; ocdrev = 3; ; #------------------------------------------------------------ # ATmega64RFR2 #------------------------------------------------------------ part parent "m128rfa1" id = "m64rfr2"; desc = "ATmega64RFR2"; signature = 0x1e 0xa6 0x02; ocdrev = 3; memory "flash" paged = yes; size = 65536; page_size = 256; num_pages = 256; min_write_delay = 50000; max_write_delay = 50000; readback_p1 = 0x00; readback_p2 = 0x00; read_lo = " 0 0 1 0 0 0 0 0", " 0 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 a14 a13 a12 a11 a10 a9 a8", " a7 x x x x x x x", " x x x x x x x x"; mode = 0x41; delay = 20; blocksize = 256; readsize = 256; ; ; #------------------------------------------------------------ # ATmega2564RFR2 #------------------------------------------------------------ part parent "m256rfr2" id = "m2564rfr2"; desc = "ATmega2564RFR2"; signature = 0x1e 0xa8 0x03; ; #------------------------------------------------------------ # ATmega1284RFR2 #------------------------------------------------------------ part parent "m128rfr2" id = "m1284rfr2"; desc = "ATmega1284RFR2"; signature = 0x1e 0xa7 0x03; ; #------------------------------------------------------------ # ATmega644RFR2 #------------------------------------------------------------ part parent "m64rfr2" id = "m644rfr2"; desc = "ATmega644RFR2"; signature = 0x1e 0xa6 0x03; ; #------------------------------------------------------------ # ATtiny24 #------------------------------------------------------------ part id = "t24"; desc = "ATtiny24"; has_debugwire = yes; flash_instr = 0xB4, 0x07, 0x17; eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, 0x99, 0xE1, 0xBB, 0xAC; ## no STK500 devcode in XML file, use the ATtiny45 one stk500_devcode = 0x14; ## avr910_devcode = ?; ## Try the AT90S2313 devcode: avr910_devcode = 0x20; signature = 0x1e 0x91 0x0b; reset = io; chip_erase_delay = 4500; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; hvsp_controlstack = 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; hventerstabdelay = 100; hvspcmdexedelay = 0; synchcycles = 6; latchcycles = 1; togglevtg = 1; poweroffdelay = 25; resetdelayms = 0; resetdelayus = 70; hvleavestabdelay = 100; resetdelay = 25; chiperasepolltimeout = 40; chiperasetime = 0; programfusepolltimeout = 25; programlockpolltimeout = 25; ocdrev = 1; memory "eeprom" size = 128; paged = no; page_size = 4; min_write_delay = 4000; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x x x x", " x a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 2048; page_size = 32; num_pages = 64; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " 0 0 0 0 0 0 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 0 0 0 0 0 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 0 x x x x x", " x x x x a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 0 x x x x x", " x x x x a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 0 0 0 0 0 a9 a8", " a7 a6 a5 a4 x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 32; readsize = 256; ; # ATtiny24 has Signature Bytes: 0x1E 0x91 0x0B. memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "lock" size = 1; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x x x x x x x i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "0 0 0 0 0 0 0 0 o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x x x x i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATtiny44 #------------------------------------------------------------ part id = "t44"; desc = "ATtiny44"; has_debugwire = yes; flash_instr = 0xB4, 0x07, 0x17; eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, 0x99, 0xE1, 0xBB, 0xAC; ## no STK500 devcode in XML file, use the ATtiny45 one stk500_devcode = 0x14; ## avr910_devcode = ?; ## Try the AT90S2313 devcode: avr910_devcode = 0x20; signature = 0x1e 0x92 0x07; reset = io; chip_erase_delay = 4500; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; hvsp_controlstack = 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; hventerstabdelay = 100; hvspcmdexedelay = 0; synchcycles = 6; latchcycles = 1; togglevtg = 1; poweroffdelay = 25; resetdelayms = 0; resetdelayus = 70; hvleavestabdelay = 100; resetdelay = 25; chiperasepolltimeout = 40; chiperasetime = 0; programfusepolltimeout = 25; programlockpolltimeout = 25; ocdrev = 1; memory "eeprom" size = 256; paged = no; page_size = 4; min_write_delay = 4000; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x x x x", " x a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 4096; page_size = 64; num_pages = 64; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " 0 0 0 0 0 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 0 0 0 0 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 0 x x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 0 x x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 0 0 0 0 a10 a9 a8", " a7 a6 a5 x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 32; readsize = 256; ; # ATtiny44 has Signature Bytes: 0x1E 0x92 0x07. memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "lock" size = 1; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x x x x x x x i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "0 0 0 0 0 0 0 0 o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x x x x i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATtiny84 #------------------------------------------------------------ part id = "t84"; desc = "ATtiny84"; has_debugwire = yes; flash_instr = 0xB4, 0x07, 0x17; eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, 0x99, 0xE1, 0xBB, 0xAC; ## no STK500 devcode in XML file, use the ATtiny45 one stk500_devcode = 0x14; ## avr910_devcode = ?; ## Try the AT90S2313 devcode: avr910_devcode = 0x20; signature = 0x1e 0x93 0x0c; reset = io; chip_erase_delay = 4500; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; hvsp_controlstack = 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; hventerstabdelay = 100; hvspcmdexedelay = 0; synchcycles = 6; latchcycles = 1; togglevtg = 1; poweroffdelay = 25; resetdelayms = 0; resetdelayus = 70; hvleavestabdelay = 100; resetdelay = 25; chiperasepolltimeout = 40; chiperasetime = 0; programfusepolltimeout = 25; programlockpolltimeout = 25; ocdrev = 1; memory "eeprom" size = 512; paged = no; page_size = 4; min_write_delay = 4000; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x x x x", " x a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 8192; page_size = 64; num_pages = 128; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 0 x x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 0 x x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 32; readsize = 256; ; # ATtiny84 has Signature Bytes: 0x1E 0x93 0x0C. memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "lock" size = 1; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x x x x x x x i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "0 0 0 0 0 0 0 0 o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x x x x i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATtiny43U #------------------------------------------------------------ part id = "t43u"; desc = "ATtiny43u"; has_debugwire = yes; flash_instr = 0xB4, 0x07, 0x17; eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, 0x99, 0xE1, 0xBB, 0xAC; stk500_devcode = 0x14; ## avr910_devcode = ?; ## Try the AT90S2313 devcode: avr910_devcode = 0x20; signature = 0x1e 0x92 0x0C; reset = io; chip_erase_delay = 1000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0E, 0x1E, 0x2E, 0x3E, 0x2E, 0x3E, 0x4E, 0x5E, 0x4E, 0x5E, 0x6E, 0x7E, 0x6E, 0x7E, 0x06, 0x16, 0x46, 0x56, 0x0A, 0x1A, 0x4A, 0x5A, 0x1E, 0x7C, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; hvspcmdexedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 20; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; resetdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; memory "eeprom" size = 64; paged = yes; page_size = 4; num_pages = 16; min_write_delay = 4000; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", "0 0 a4 a3 a2 a1 a0 o o o o o o o o"; write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", "0 0 a5 a4 a3 a2 a1 a0 i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x x x x", " 0 0 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 5; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 4096; page_size = 64; num_pages = 64; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " 0 0 0 0 0 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 0 0 0 0 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 0 x x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 0 x x x x x", " x x x a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 0 0 0 0 a10 a9 a8", " a7 a6 a5 x x x x x", " x x x x x x x x"; mode = 0x41; delay = 10; blocksize = 64; readsize = 256; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "lock" size = 1; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; min_write_delay = 4500; max_write_delay = 4500; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 4500; max_write_delay = 4500; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 4500; max_write_delay = 4500; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x x x x i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 4500; max_write_delay = 4500; ; memory "calibration" size = 2; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega32u4 #------------------------------------------------------------ part id = "m32u4"; desc = "ATmega32U4"; signature = 0x1e 0x95 0x87; has_jtag = yes; # stk500_devcode = 0xB2; # avr910_devcode = 0x43; chip_erase_delay = 9000; pagel = 0xD7; bs2 = 0xA0; reset = dedicated; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; idr = 0x31; spmcr = 0x57; rampz = 0x3b; allowfullpagebitstream = no; ocdrev = 3; memory "eeprom" paged = no; /* leave this "no" */ page_size = 4; /* for parallel programming */ size = 1024; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0x00; readback_p2 = 0x00; read = " 1 0 1 0 0 0 0 0", " x x x x x a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " x x x x x a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 a2 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x a10 a9 a8", " a7 a6 a5 a4 a3 0 0 0", " x x x x x x x x"; mode = 0x41; delay = 20; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 32768; page_size = 128; num_pages = 256; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0x00; readback_p2 = 0x00; read_lo = " 0 0 1 0 0 0 0 0", " 0 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 x x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 128; readsize = 256; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 x x x x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # AT90USB646 #------------------------------------------------------------ part id = "usb646"; desc = "AT90USB646"; signature = 0x1e 0x96 0x82; has_jtag = yes; # stk500_devcode = 0xB2; # avr910_devcode = 0x43; chip_erase_delay = 9000; pagel = 0xD7; bs2 = 0xA0; reset = dedicated; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; idr = 0x31; spmcr = 0x57; rampz = 0x3b; allowfullpagebitstream = no; ocdrev = 3; memory "eeprom" paged = no; /* leave this "no" */ page_size = 8; /* for parallel programming */ size = 2048; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0x00; readback_p2 = 0x00; read = " 1 0 1 0 0 0 0 0", " x x x x x a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " x x x x x a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 a2 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x a10 a9 a8", " a7 a6 a5 a4 a3 0 0 0", " x x x x x x x x"; mode = 0x41; delay = 10; blocksize = 8; readsize = 256; ; memory "flash" paged = yes; size = 65536; page_size = 256; num_pages = 256; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0x00; readback_p2 = 0x00; read_lo = " 0 0 1 0 0 0 0 0", " 0 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 a14 a13 a12 a11 a10 a9 a8", " a7 x x x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 256; readsize = 256; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 x x x x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # AT90USB647 #------------------------------------------------------------ # identical to AT90USB646 part parent "usb646" id = "usb647"; desc = "AT90USB647"; signature = 0x1e 0x96 0x82; ocdrev = 3; ; #------------------------------------------------------------ # AT90USB1286 #------------------------------------------------------------ part id = "usb1286"; desc = "AT90USB1286"; signature = 0x1e 0x97 0x82; has_jtag = yes; # stk500_devcode = 0xB2; # avr910_devcode = 0x43; chip_erase_delay = 9000; pagel = 0xD7; bs2 = 0xA0; reset = dedicated; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; idr = 0x31; spmcr = 0x57; rampz = 0x3b; allowfullpagebitstream = no; ocdrev = 3; memory "eeprom" paged = no; /* leave this "no" */ page_size = 8; /* for parallel programming */ size = 4096; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0x00; readback_p2 = 0x00; read = " 1 0 1 0 0 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 a2 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x a10 a9 a8", " a7 a6 a5 a4 a3 0 0 0", " x x x x x x x x"; mode = 0x41; delay = 10; blocksize = 8; readsize = 256; ; memory "flash" paged = yes; size = 131072; page_size = 256; num_pages = 512; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0x00; readback_p2 = 0x00; read_lo = " 0 0 1 0 0 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 x x x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 256; readsize = 256; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 x x x x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # AT90USB1287 #------------------------------------------------------------ # identical to AT90USB1286 part parent "usb1286" id = "usb1287"; desc = "AT90USB1287"; signature = 0x1e 0x97 0x82; ocdrev = 3; ; #------------------------------------------------------------ # AT90USB162 #------------------------------------------------------------ part id = "usb162"; desc = "AT90USB162"; has_jtag = no; has_debugwire = yes; signature = 0x1e 0x94 0x82; chip_erase_delay = 9000; reset = io; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; pagel = 0xD7; bs2 = 0xC6; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; ocdrev = 1; memory "eeprom" paged = no; /* leave this "no" */ page_size = 4; /* for parallel programming */ size = 512; num_pages = 128; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0x00; readback_p2 = 0x00; read = " 1 0 1 0 0 0 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 20; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 16384; page_size = 128; num_pages = 128; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0x00; readback_p2 = 0x00; read_lo = " 0 0 1 0 0 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 x x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 128; readsize = 256; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # AT90USB82 #------------------------------------------------------------ # Changes against AT90USB162 (beside IDs) # memory "flash" # size = 8192; # num_pages = 64; part id = "usb82"; desc = "AT90USB82"; has_jtag = no; has_debugwire = yes; signature = 0x1e 0x93 0x82; chip_erase_delay = 9000; reset = io; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; pagel = 0xD7; bs2 = 0xC6; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; ocdrev = 1; memory "eeprom" paged = no; /* leave this "no" */ page_size = 4; /* for parallel programming */ size = 512; num_pages = 128; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0x00; readback_p2 = 0x00; read = " 1 0 1 0 0 0 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 20; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 8192; page_size = 128; num_pages = 64; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0x00; readback_p2 = 0x00; read_lo = " 0 0 1 0 0 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 x x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 128; readsize = 256; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega32U2 #------------------------------------------------------------ # Changes against AT90USB162 (beside IDs) # memory "flash" # size = 32768; # num_pages = 256; # memory "eeprom" # size = 1024; # num_pages = 256; part id = "m32u2"; desc = "ATmega32U2"; has_jtag = no; has_debugwire = yes; signature = 0x1e 0x95 0x8a; chip_erase_delay = 9000; reset = io; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; pagel = 0xD7; bs2 = 0xC6; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; ocdrev = 1; memory "eeprom" paged = no; /* leave this "no" */ page_size = 4; /* for parallel programming */ size = 1024; num_pages = 256; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0x00; readback_p2 = 0x00; read = " 1 0 1 0 0 0 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 20; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 32768; page_size = 128; num_pages = 256; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0x00; readback_p2 = 0x00; read_lo = " 0 0 1 0 0 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 x x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 128; readsize = 256; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega16U2 #------------------------------------------------------------ # Changes against ATmega32U2 (beside IDs) # memory "flash" # size = 16384; # num_pages = 128; # memory "eeprom" # size = 512; # num_pages = 128; part id = "m16u2"; desc = "ATmega16U2"; has_jtag = no; has_debugwire = yes; signature = 0x1e 0x94 0x89; chip_erase_delay = 9000; reset = io; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; pagel = 0xD7; bs2 = 0xC6; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; ocdrev = 1; memory "eeprom" paged = no; /* leave this "no" */ page_size = 4; /* for parallel programming */ size = 512; num_pages = 128; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0x00; readback_p2 = 0x00; read = " 1 0 1 0 0 0 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 20; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 16384; page_size = 128; num_pages = 128; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0x00; readback_p2 = 0x00; read_lo = " 0 0 1 0 0 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 x x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 128; readsize = 256; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega8U2 #------------------------------------------------------------ # Changes against ATmega16U2 (beside IDs) # memory "flash" # size = 8192; # page_size = 64; # blocksize = 64; part id = "m8u2"; desc = "ATmega8U2"; has_jtag = no; has_debugwire = yes; signature = 0x1e 0x93 0x89; chip_erase_delay = 9000; reset = io; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; pagel = 0xD7; bs2 = 0xC6; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; ocdrev = 1; memory "eeprom" paged = no; /* leave this "no" */ page_size = 4; /* for parallel programming */ size = 512; num_pages = 128; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0x00; readback_p2 = 0x00; read = " 1 0 1 0 0 0 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 0 0 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 20; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 8192; page_size = 64; num_pages = 128; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0x00; readback_p2 = 0x00; read_lo = " 0 0 1 0 0 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " x x x x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 x x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 64; readsize = 256; ; memory "lfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x i i i i i i i i"; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega325 #------------------------------------------------------------ part id = "m325"; desc = "ATmega325"; signature = 0x1e 0x95 0x05; has_jtag = yes; # stk500_devcode = 0x??; # No STK500v1 support? # avr910_devcode = 0x??; # Try the ATmega16 one avr910_devcode = 0x74; pagel = 0xd7; bs2 = 0xa0; chip_erase_delay = 9000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; idr = 0x31; spmcr = 0x57; allowfullpagebitstream = no; ocdrev = 3; memory "eeprom" paged = no; /* leave this "no" */ page_size = 4; /* for parallel programming */ size = 1024; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " 0 0 0 0 0 0 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " 0 0 0 0 0 0 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 0 0 0 0 a9 a8", " a7 a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 10; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 32768; page_size = 128; num_pages = 256; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " 0 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 0 0 0 0 0 0", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 0 0 0 0 0 0", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " x x x x x x x x"; mode = 0x41; delay = 10; blocksize = 128; readsize = 256; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", "0 0 0 0 0 0 0 0 1 1 i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lfuse" size = 1; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "0 0 0 0 0 0 0 0 o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "0 0 0 0 0 0 0 0 i i i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "0 0 0 0 0 0 0 0 o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "0 0 0 0 0 0 0 0 i i i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "0 0 0 0 0 0 0 0 o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", "0 0 0 0 0 0 a1 a0 o o o o o o o o"; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega645 #------------------------------------------------------------ part id = "m645"; desc = "ATmega645"; signature = 0x1E 0x96 0x05; has_jtag = yes; # stk500_devcode = 0x??; # No STK500v1 support? # avr910_devcode = 0x??; # Try the ATmega16 one avr910_devcode = 0x74; pagel = 0xd7; bs2 = 0xa0; chip_erase_delay = 9000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 5; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; idr = 0x31; spmcr = 0x57; allowfullpagebitstream = no; ocdrev = 3; memory "eeprom" paged = no; /* leave this "no" */ page_size = 8; /* for parallel programming */ size = 2048; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " 0 0 0 0 0 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " 0 0 0 0 0 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 a2 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 0 0 0 a10 a9 a8", " a7 a6 a5 a4 a3 0 0 0", " x x x x x x x x"; mode = 0x41; delay = 10; blocksize = 8; readsize = 256; ; memory "flash" paged = yes; size = 65536; page_size = 256; num_pages = 256; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 0 0 0 0 0 0", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 0 0 0 0 0 0", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " 0 0 0 0 0 0 0 0"; mode = 0x41; delay = 10; blocksize = 128; readsize = 256; ; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", "0 0 0 0 0 0 0 0 1 1 i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lfuse" size = 1; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "0 0 0 0 0 0 0 0 o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "0 0 0 0 0 0 0 0 i i i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "0 0 0 0 0 0 0 0 o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "0 0 0 0 0 0 0 0 i i i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "0 0 0 0 0 0 0 0 o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", "0 0 0 0 0 0 a1 a0 o o o o o o o o"; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; ; #------------------------------------------------------------ # ATmega3250 #------------------------------------------------------------ part parent "m325" id = "m3250"; desc = "ATmega3250"; signature = 0x1E 0x95 0x06; ocdrev = 3; ; #------------------------------------------------------------ # ATmega6450 #------------------------------------------------------------ part parent "m645" id = "m6450"; desc = "ATmega6450"; signature = 0x1E 0x96 0x06; ocdrev = 3; ; #------------------------------------------------------------ # AVR XMEGA family common values #------------------------------------------------------------ part id = ".xmega"; desc = "AVR XMEGA family common values"; has_pdi = yes; nvm_base = 0x01c0; mcu_base = 0x0090; memory "signature" size = 3; offset = 0x1000090; ; memory "prodsig" size = 0x32; offset = 0x8e0200; page_size = 0x32; readsize = 0x32; ; memory "fuse1" size = 1; offset = 0x8f0021; ; memory "fuse2" size = 1; offset = 0x8f0022; ; memory "fuse4" size = 1; offset = 0x8f0024; ; memory "fuse5" size = 1; offset = 0x8f0025; ; memory "lock" size = 1; offset = 0x8f0027; ; memory "data" # SRAM, only used to supply the offset offset = 0x1000000; ; ; #------------------------------------------------------------ # ATxmega16A4U #------------------------------------------------------------ part parent ".xmega" id = "x16a4u"; desc = "ATxmega16A4U"; signature = 0x1e 0x94 0x41; memory "eeprom" size = 0x400; offset = 0x8c0000; page_size = 0x20; readsize = 0x100; ; memory "application" size = 0x4000; offset = 0x800000; page_size = 0x100; readsize = 0x100; ; memory "apptable" size = 0x1000; offset = 0x803000; page_size = 0x100; readsize = 0x100; ; memory "boot" size = 0x1000; offset = 0x804000; page_size = 0x100; readsize = 0x100; ; memory "flash" size = 0x5000; offset = 0x800000; page_size = 0x100; readsize = 0x100; ; memory "usersig" size = 0x100; offset = 0x8e0400; page_size = 0x100; readsize = 0x100; ; ; #------------------------------------------------------------ # ATxmega16C4 #------------------------------------------------------------ part parent "x16a4u" id = "x16c4"; desc = "ATxmega16C4"; signature = 0x1e 0x95 0x44; ; #------------------------------------------------------------ # ATxmega16D4 #------------------------------------------------------------ part parent "x16a4u" id = "x16d4"; desc = "ATxmega16D4"; signature = 0x1e 0x94 0x42; ; #------------------------------------------------------------ # ATxmega16A4 #------------------------------------------------------------ part parent "x16a4u" id = "x16a4"; desc = "ATxmega16A4"; signature = 0x1e 0x94 0x41; has_jtag = yes; memory "fuse0" size = 1; offset = 0x8f0020; ; ; #------------------------------------------------------------ # ATxmega32A4U #------------------------------------------------------------ part parent ".xmega" id = "x32a4u"; desc = "ATxmega32A4U"; signature = 0x1e 0x95 0x41; memory "eeprom" size = 0x400; offset = 0x8c0000; page_size = 0x20; readsize = 0x100; ; memory "application" size = 0x8000; offset = 0x800000; page_size = 0x100; readsize = 0x100; ; memory "apptable" size = 0x1000; offset = 0x807000; page_size = 0x100; readsize = 0x100; ; memory "boot" size = 0x1000; offset = 0x808000; page_size = 0x100; readsize = 0x100; ; memory "flash" size = 0x9000; offset = 0x800000; page_size = 0x100; readsize = 0x100; ; memory "usersig" size = 0x100; offset = 0x8e0400; page_size = 0x100; readsize = 0x100; ; ; #------------------------------------------------------------ # ATxmega32C4 #------------------------------------------------------------ part parent "x32a4u" id = "x32c4"; desc = "ATxmega32C4"; signature = 0x1e 0x94 0x43; ; #------------------------------------------------------------ # ATxmega32D4 #------------------------------------------------------------ part parent "x32a4u" id = "x32d4"; desc = "ATxmega32D4"; signature = 0x1e 0x95 0x42; ; #------------------------------------------------------------ # ATxmega32A4 #------------------------------------------------------------ part parent "x32a4u" id = "x32a4"; desc = "ATxmega32A4"; signature = 0x1e 0x95 0x41; has_jtag = yes; memory "fuse0" size = 1; offset = 0x8f0020; ; ; #------------------------------------------------------------ # ATxmega64A4U #------------------------------------------------------------ part parent ".xmega" id = "x64a4u"; desc = "ATxmega64A4U"; signature = 0x1e 0x96 0x46; memory "eeprom" size = 0x800; offset = 0x8c0000; page_size = 0x20; readsize = 0x100; ; memory "application" size = 0x10000; offset = 0x800000; page_size = 0x100; readsize = 0x100; ; memory "apptable" size = 0x1000; offset = 0x80f000; page_size = 0x100; readsize = 0x100; ; memory "boot" size = 0x1000; offset = 0x810000; page_size = 0x100; readsize = 0x100; ; memory "flash" size = 0x11000; offset = 0x800000; page_size = 0x100; readsize = 0x100; ; memory "usersig" size = 0x100; offset = 0x8e0400; page_size = 0x100; readsize = 0x100; ; ; #------------------------------------------------------------ # ATxmega64C3 #------------------------------------------------------------ part parent "x64a4u" id = "x64c3"; desc = "ATxmega64C3"; signature = 0x1e 0x96 0x49; ; #------------------------------------------------------------ # ATxmega64D3 #------------------------------------------------------------ part parent "x64a4u" id = "x64d3"; desc = "ATxmega64D3"; signature = 0x1e 0x96 0x4a; ; #------------------------------------------------------------ # ATxmega64D4 #------------------------------------------------------------ part parent "x64a4u" id = "x64d4"; desc = "ATxmega64D4"; signature = 0x1e 0x96 0x47; ; #------------------------------------------------------------ # ATxmega64A1 #------------------------------------------------------------ part parent "x64a4u" id = "x64a1"; desc = "ATxmega64A1"; signature = 0x1e 0x96 0x4e; has_jtag = yes; memory "fuse0" size = 1; offset = 0x8f0020; ; ; #------------------------------------------------------------ # ATxmega64A1U #------------------------------------------------------------ part parent "x64a1" id = "x64a1u"; desc = "ATxmega64A1U"; signature = 0x1e 0x96 0x4e; ; #------------------------------------------------------------ # ATxmega64A3 #------------------------------------------------------------ part parent "x64a1" id = "x64a3"; desc = "ATxmega64A3"; signature = 0x1e 0x96 0x42; ; #------------------------------------------------------------ # ATxmega64A3U #------------------------------------------------------------ part parent "x64a1" id = "x64a3u"; desc = "ATxmega64A3U"; signature = 0x1e 0x96 0x42; ; #------------------------------------------------------------ # ATxmega64A4 #------------------------------------------------------------ part parent "x64a1" id = "x64a4"; desc = "ATxmega64A4"; signature = 0x1e 0x96 0x46; ; #------------------------------------------------------------ # ATxmega64B1 #------------------------------------------------------------ part parent "x64a1" id = "x64b1"; desc = "ATxmega64B1"; signature = 0x1e 0x96 0x52; ; #------------------------------------------------------------ # ATxmega64B3 #------------------------------------------------------------ part parent "x64a1" id = "x64b3"; desc = "ATxmega64B3"; signature = 0x1e 0x96 0x51; ; #------------------------------------------------------------ # ATxmega128C3 #------------------------------------------------------------ part parent ".xmega" id = "x128c3"; desc = "ATxmega128C3"; signature = 0x1e 0x97 0x52; memory "eeprom" size = 0x800; offset = 0x8c0000; page_size = 0x20; readsize = 0x100; ; memory "application" size = 0x20000; offset = 0x800000; page_size = 0x200; readsize = 0x100; ; memory "apptable" size = 0x2000; offset = 0x81e000; page_size = 0x200; readsize = 0x100; ; memory "boot" size = 0x2000; offset = 0x820000; page_size = 0x200; readsize = 0x100; ; memory "flash" size = 0x22000; offset = 0x800000; page_size = 0x200; readsize = 0x100; ; memory "usersig" size = 0x200; offset = 0x8e0400; page_size = 0x200; readsize = 0x100; ; ; #------------------------------------------------------------ # ATxmega128D3 #------------------------------------------------------------ part parent "x128c3" id = "x128d3"; desc = "ATxmega128D3"; signature = 0x1e 0x97 0x48; ; #------------------------------------------------------------ # ATxmega128D4 #------------------------------------------------------------ part parent "x128c3" id = "x128d4"; desc = "ATxmega128D4"; signature = 0x1e 0x97 0x47; ; #------------------------------------------------------------ # ATxmega128A1 #------------------------------------------------------------ part parent "x128c3" id = "x128a1"; desc = "ATxmega128A1"; signature = 0x1e 0x97 0x4c; has_jtag = yes; memory "fuse0" size = 1; offset = 0x8f0020; ; ; #------------------------------------------------------------ # ATxmega128A1 revision D #------------------------------------------------------------ part parent "x128a1" id = "x128a1d"; desc = "ATxmega128A1revD"; signature = 0x1e 0x97 0x41; ; #------------------------------------------------------------ # ATxmega128A1U #------------------------------------------------------------ part parent "x128a1" id = "x128a1u"; desc = "ATxmega128A1U"; signature = 0x1e 0x97 0x4c; ; #------------------------------------------------------------ # ATxmega128A3 #------------------------------------------------------------ part parent "x128a1" id = "x128a3"; desc = "ATxmega128A3"; signature = 0x1e 0x97 0x42; ; #------------------------------------------------------------ # ATxmega128A3U #------------------------------------------------------------ part parent "x128a1" id = "x128a3u"; desc = "ATxmega128A3U"; signature = 0x1e 0x97 0x42; ; #------------------------------------------------------------ # ATxmega128A4 #------------------------------------------------------------ part parent ".xmega" id = "x128a4"; desc = "ATxmega128A4"; signature = 0x1e 0x97 0x46; has_jtag = yes; memory "eeprom" size = 0x800; offset = 0x8c0000; page_size = 0x20; readsize = 0x100; ; memory "application" size = 0x20000; offset = 0x800000; page_size = 0x200; readsize = 0x100; ; memory "apptable" size = 0x1000; offset = 0x81f000; page_size = 0x200; readsize = 0x100; ; memory "boot" size = 0x2000; offset = 0x820000; page_size = 0x200; readsize = 0x100; ; memory "flash" size = 0x22000; offset = 0x800000; page_size = 0x200; readsize = 0x100; ; memory "usersig" size = 0x200; offset = 0x8e0400; page_size = 0x200; readsize = 0x100; ; memory "fuse0" size = 1; offset = 0x8f0020; ; ; #------------------------------------------------------------ # ATxmega128A4U #------------------------------------------------------------ part parent ".xmega" id = "x128a4u"; desc = "ATxmega128A4U"; signature = 0x1e 0x97 0x46; memory "eeprom" size = 0x800; offset = 0x8c0000; page_size = 0x20; readsize = 0x100; ; memory "application" size = 0x20000; offset = 0x800000; page_size = 0x100; readsize = 0x100; ; memory "apptable" size = 0x1000; offset = 0x81f000; page_size = 0x100; readsize = 0x100; ; memory "boot" size = 0x2000; offset = 0x820000; page_size = 0x100; readsize = 0x100; ; memory "flash" size = 0x22000; offset = 0x800000; page_size = 0x100; readsize = 0x100; ; memory "usersig" size = 0x100; offset = 0x8e0400; page_size = 0x100; readsize = 0x100; ; ; #------------------------------------------------------------ # ATxmega128B1 #------------------------------------------------------------ part parent ".xmega" id = "x128b1"; desc = "ATxmega128B1"; signature = 0x1e 0x97 0x4d; has_jtag = yes; memory "eeprom" size = 0x800; offset = 0x8c0000; page_size = 0x20; readsize = 0x100; ; memory "application" size = 0x20000; offset = 0x800000; page_size = 0x100; readsize = 0x100; ; memory "apptable" size = 0x2000; offset = 0x81e000; page_size = 0x100; readsize = 0x100; ; memory "boot" size = 0x2000; offset = 0x820000; page_size = 0x100; readsize = 0x100; ; memory "flash" size = 0x22000; offset = 0x800000; page_size = 0x100; readsize = 0x100; ; memory "usersig" size = 0x100; offset = 0x8e0400; page_size = 0x100; readsize = 0x100; ; memory "fuse0" size = 1; offset = 0x8f0020; ; ; #------------------------------------------------------------ # ATxmega128B3 #------------------------------------------------------------ part parent "x128b1" id = "x128b3"; desc = "ATxmega128B3"; signature = 0x1e 0x97 0x4b; ; #------------------------------------------------------------ # ATxmega192C3 #------------------------------------------------------------ part parent ".xmega" id = "x192c3"; desc = "ATxmega192C3"; signature = 0x1e 0x97 0x51; memory "eeprom" size = 0x800; offset = 0x8c0000; page_size = 0x20; readsize = 0x100; ; memory "application" size = 0x30000; offset = 0x800000; page_size = 0x200; readsize = 0x100; ; memory "apptable" size = 0x2000; offset = 0x82e000; page_size = 0x200; readsize = 0x100; ; memory "boot" size = 0x2000; offset = 0x830000; page_size = 0x200; readsize = 0x100; ; memory "flash" size = 0x32000; offset = 0x800000; page_size = 0x200; readsize = 0x100; ; memory "usersig" size = 0x200; offset = 0x8e0400; page_size = 0x200; readsize = 0x100; ; ; #------------------------------------------------------------ # ATxmega192D3 #------------------------------------------------------------ part parent "x192c3" id = "x192d3"; desc = "ATxmega192D3"; signature = 0x1e 0x97 0x49; ; #------------------------------------------------------------ # ATxmega192A1 #------------------------------------------------------------ part parent "x192c3" id = "x192a1"; desc = "ATxmega192A1"; signature = 0x1e 0x97 0x4e; has_jtag = yes; memory "fuse0" size = 1; offset = 0x8f0020; ; ; #------------------------------------------------------------ # ATxmega192A3 #------------------------------------------------------------ part parent "x192a1" id = "x192a3"; desc = "ATxmega192A3"; signature = 0x1e 0x97 0x44; ; #------------------------------------------------------------ # ATxmega192A3U #------------------------------------------------------------ part parent "x192a1" id = "x192a3u"; desc = "ATxmega192A3U"; signature = 0x1e 0x97 0x44; ; #------------------------------------------------------------ # ATxmega256C3 #------------------------------------------------------------ part parent ".xmega" id = "x256c3"; desc = "ATxmega256C3"; signature = 0x1e 0x98 0x46; memory "eeprom" size = 0x1000; offset = 0x8c0000; page_size = 0x20; readsize = 0x100; ; memory "application" size = 0x40000; offset = 0x800000; page_size = 0x200; readsize = 0x100; ; memory "apptable" size = 0x2000; offset = 0x83e000; page_size = 0x200; readsize = 0x100; ; memory "boot" size = 0x2000; offset = 0x840000; page_size = 0x200; readsize = 0x100; ; memory "flash" size = 0x42000; offset = 0x800000; page_size = 0x200; readsize = 0x100; ; memory "usersig" size = 0x200; offset = 0x8e0400; page_size = 0x200; readsize = 0x100; ; ; #------------------------------------------------------------ # ATxmega256D3 #------------------------------------------------------------ part parent "x256c3" id = "x256d3"; desc = "ATxmega256D3"; signature = 0x1e 0x98 0x44; ; #------------------------------------------------------------ # ATxmega256A1 #------------------------------------------------------------ part parent "x256c3" id = "x256a1"; desc = "ATxmega256A1"; signature = 0x1e 0x98 0x46; has_jtag = yes; memory "fuse0" size = 1; offset = 0x8f0020; ; ; #------------------------------------------------------------ # ATxmega256A3 #------------------------------------------------------------ part parent "x256a1" id = "x256a3"; desc = "ATxmega256A3"; signature = 0x1e 0x98 0x42; ; #------------------------------------------------------------ # ATxmega256A3U #------------------------------------------------------------ part parent "x256a1" id = "x256a3u"; desc = "ATxmega256A3U"; signature = 0x1e 0x98 0x42; ; #------------------------------------------------------------ # ATxmega256A3B #------------------------------------------------------------ part parent "x256a1" id = "x256a3b"; desc = "ATxmega256A3B"; signature = 0x1e 0x98 0x43; ; #------------------------------------------------------------ # ATxmega256A3BU #------------------------------------------------------------ part parent "x256a1" id = "x256a3bu"; desc = "ATxmega256A3BU"; signature = 0x1e 0x98 0x43; ; #------------------------------------------------------------ # ATxmega384C3 #------------------------------------------------------------ part parent ".xmega" id = "x384c3"; desc = "ATxmega384C3"; signature = 0x1e 0x98 0x45; memory "eeprom" size = 0x1000; offset = 0x8c0000; page_size = 0x20; readsize = 0x100; ; memory "application" size = 0x60000; offset = 0x800000; page_size = 0x200; readsize = 0x100; ; memory "apptable" size = 0x2000; offset = 0x85e000; page_size = 0x200; readsize = 0x100; ; memory "boot" size = 0x2000; offset = 0x860000; page_size = 0x200; readsize = 0x100; ; memory "flash" size = 0x62000; offset = 0x800000; page_size = 0x200; readsize = 0x100; ; memory "usersig" size = 0x200; offset = 0x8e0400; page_size = 0x200; readsize = 0x100; ; ; #------------------------------------------------------------ # ATxmega384D3 #------------------------------------------------------------ part parent "x384c3" id = "x384d3"; desc = "ATxmega384D3"; signature = 0x1e 0x98 0x47; ; #------------------------------------------------------------ # ATxmega8E5 #------------------------------------------------------------ part parent ".xmega" id = "x8e5"; desc = "ATxmega8E5"; signature = 0x1e 0x93 0x41; memory "eeprom" size = 0x0200; offset = 0x08c0000; page_size = 0x20; readsize = 0x100; ; memory "application" size = 0x2000; offset = 0x0800000; page_size = 0x80; readsize = 0x100; ; memory "apptable" size = 0x800; offset = 0x00801800; page_size = 0x80; readsize = 0x100; ; memory "boot" size = 0x800; offset = 0x00804000; page_size = 0x80; readsize = 0x100; ; memory "flash" size = 0x2800; offset = 0x0800000; page_size = 0x80; readsize = 0x100; ; memory "usersig" size = 0x80; offset = 0x8e0400; page_size = 0x80; readsize = 0x100; ; ; #------------------------------------------------------------ # ATxmega16E5 #------------------------------------------------------------ part parent ".xmega" id = "x16e5"; desc = "ATxmega16E5"; signature = 0x1e 0x94 0x45; memory "eeprom" size = 0x0200; offset = 0x08c0000; page_size = 0x20; readsize = 0x100; ; memory "application" size = 0x4000; offset = 0x0800000; page_size = 0x80; readsize = 0x100; ; memory "apptable" size = 0x1000; offset = 0x00803000; page_size = 0x80; readsize = 0x100; ; memory "boot" size = 0x1000; offset = 0x00804000; page_size = 0x80; readsize = 0x100; ; memory "flash" size = 0x5000; offset = 0x0800000; page_size = 0x80; readsize = 0x100; ; memory "usersig" size = 0x80; offset = 0x8e0400; page_size = 0x80; readsize = 0x100; ; ; #------------------------------------------------------------ # ATxmega32E5 #------------------------------------------------------------ part parent ".xmega" id = "x32e5"; desc = "ATxmega32E5"; signature = 0x1e 0x95 0x4c; memory "eeprom" size = 0x0400; offset = 0x08c0000; page_size = 0x20; readsize = 0x100; ; memory "application" size = 0x8000; offset = 0x0800000; page_size = 0x80; readsize = 0x100; ; memory "apptable" size = 0x1000; offset = 0x00807000; page_size = 0x80; readsize = 0x100; ; memory "boot" size = 0x1000; offset = 0x00804000; page_size = 0x80; readsize = 0x100; ; memory "flash" size = 0x9000; offset = 0x0800000; page_size = 0x80; readsize = 0x100; ; memory "usersig" size = 0x80; offset = 0x8e0400; page_size = 0x80; readsize = 0x100; ; ; #------------------------------------------------------------ # AVR32UC3A0512 #------------------------------------------------------------ part id = "uc3a0512"; desc = "AT32UC3A0512"; signature = 0xED 0xC0 0x3F; has_jtag = yes; is_avr32 = yes; memory "flash" paged = yes; page_size = 512; # bytes readsize = 512; # bytes num_pages = 1024; # could be set dynamicly size = 0x00080000; # could be set dynamicly offset = 0x80000000; ; ; part parent "uc3a0512" id = "ucr2"; desc = "deprecated, use 'uc3a0512'"; ; #------------------------------------------------------------ # ATtiny1634. #------------------------------------------------------------ part id = "t1634"; desc = "ATtiny1634"; has_debugwire = yes; flash_instr = 0xB6, 0x01, 0x11; eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, 0x99, 0xF9, 0xBB, 0xAF; stk500_devcode = 0x86; # avr910_devcode = 0x; signature = 0x1e 0x94 0x12; pagel = 0xB3; bs2 = 0xB1; reset = io; chip_erase_delay = 9000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0E, 0x1E, 0x2E, 0x3E, 0x2E, 0x3E, 0x4E, 0x5E, 0x4E, 0x5E, 0x6E, 0x7E, 0x6E, 0x7E, 0x26, 0x36, 0x66, 0x76, 0x2A, 0x3A, 0x6A, 0x7A, 0x2E, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 0; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; resetdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; memory "eeprom" paged = no; page_size = 4; size = 256; min_write_delay = 3600; max_write_delay = 3600; readback_p1 = 0xff; readback_p2 = 0xff; read = " 1 0 1 0 0 0 0 0", " 0 0 0 x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 1 1 0 0 0 0 0 0", " 0 0 0 x x x x a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x x x x a8", " a7 a6 a5 a4 a3 a2 0 0", " x x x x x x x x"; mode = 0x41; delay = 5; blocksize = 4; readsize = 256; ; memory "flash" paged = yes; size = 16384; page_size = 32; num_pages = 512; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", " 0 0 0 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", " 0 0 0 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 0 x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 0 x x x x x", " x x a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", " 0 0 0 a12 a11 a10 a9 a8", " a7 a6 x x x x x x", " x x x x x x x x"; mode = 0x41; delay = 6; blocksize = 128; readsize = 256; ; memory "lfuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "hfuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; ; memory "efuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x x x x o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x i i i i i"; ; memory "lock" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x x x x x o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 1 1 1 1 i i"; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; ; #------------------------------------------------------------ # Common values for reduced core tinys (4/5/9/10/20/40) #------------------------------------------------------------ part id = ".reduced_core_tiny"; desc = "Common values for reduced core tinys"; has_tpi = yes; memory "signature" size = 3; offset = 0x3fc0; page_size = 16; ; memory "fuse" size = 1; offset = 0x3f40; page_size = 16; blocksize = 4; ; memory "calibration" size = 1; offset = 0x3f80; page_size = 16; ; memory "lockbits" size = 1; offset = 0x3f00; page_size = 16; ; ; #------------------------------------------------------------ # ATtiny4 #------------------------------------------------------------ part parent ".reduced_core_tiny" id = "t4"; desc = "ATtiny4"; signature = 0x1e 0x8f 0x0a; memory "flash" size = 512; offset = 0x4000; page_size = 16; blocksize = 128; ; ; #------------------------------------------------------------ # ATtiny5 #------------------------------------------------------------ part parent "t4" id = "t5"; desc = "ATtiny5"; signature = 0x1e 0x8f 0x09; ; #------------------------------------------------------------ # ATtiny9 #------------------------------------------------------------ part parent ".reduced_core_tiny" id = "t9"; desc = "ATtiny9"; signature = 0x1e 0x90 0x08; memory "flash" size = 1024; offset = 0x4000; page_size = 16; blocksize = 128; ; ; #------------------------------------------------------------ # ATtiny10 #------------------------------------------------------------ part parent "t9" id = "t10"; desc = "ATtiny10"; signature = 0x1e 0x90 0x03; ; #------------------------------------------------------------ # ATtiny20 #------------------------------------------------------------ part parent ".reduced_core_tiny" id = "t20"; desc = "ATtiny20"; signature = 0x1e 0x91 0x0F; memory "flash" size = 2048; offset = 0x4000; page_size = 16; blocksize = 128; ; ; #------------------------------------------------------------ # ATtiny40 #------------------------------------------------------------ part parent ".reduced_core_tiny" id = "t40"; desc = "ATtiny40"; signature = 0x1e 0x92 0x0E; memory "flash" size = 4096; offset = 0x4000; page_size = 64; blocksize = 128; ; ; #------------------------------------------------------------ # ATmega406 #------------------------------------------------------------ part id = "m406"; desc = "ATMEGA406"; has_jtag = yes; signature = 0x1e 0x95 0x07; # STK500 parameters (parallel programming IO lines) pagel = 0xa7; bs2 = 0xa0; serial = no; parallel = yes; # STK500v2 HV programming parameters, from XML pp_controlstack = 0x0e, 0x1e, 0x0f, 0x1f, 0x2e, 0x3e, 0x2f, 0x3f, 0x4e, 0x5e, 0x4f, 0x5f, 0x6e, 0x7e, 0x6f, 0x7f, 0x66, 0x76, 0x67, 0x77, 0x6a, 0x7a, 0x6b, 0x7b, 0xbe, 0xfd, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; # JTAG ICE mkII parameters, also from XML files allowfullpagebitstream = no; enablepageprogramming = yes; idr = 0x51; rampz = 0x00; spmcr = 0x57; eecr = 0x3f; memory "eeprom" paged = no; size = 512; page_size = 4; blocksize = 4; readsize = 4; num_pages = 128; ; memory "flash" paged = yes; size = 40960; page_size = 128; blocksize = 128; readsize = 128; num_pages = 320; ; memory "hfuse" size = 1; ; memory "lfuse" size = 1; ; memory "lockbits" size = 1; ; memory "signature" size = 3; ; ; ================================================ FILE: external/arduino/avr/bootloaders/gemma/gemma_v1.hex ================================================ :100000005FCA5FCA5FCA5FCA5FCA5FCA5FCA5FCAA8 :1014C00033C05FC08BC05DC05CC05BC05AC059C038 :1014D00058C057C056C055C054C053C052C009026E :1014E0001200010100803209040000000000000029 :1014F00012011001FF00000841239F0C00010102AE :1015000000010C03470065006D006D0061001603CB :10151000410072006400750069006E006F002E00CB :10152000630063000403090411241FBECFE5D2E069 :10153000DEBFCDBF84B7877F84BF88E10FB6F89444 :1015400081BD11BC0FBE91E080E80FB6F89486BD56 :1015500096BD0FBE0AEA0F9310E0A0E6B0E0EEEDF4 :10156000FFE102C005900D92A236B107D9F711E054 :10157000A2E6B0E001C01D92A832B107E1F7EDD3B9 :101580002CC59ECFA82FB92F80E090E041E050EA13 :10159000609530E009C02D9182279795879510F0CE :1015A00084279527305EC8F36F5FA8F30895EADFBC :1015B0008D939D930895A6E088279927AA9569F0B1 :1015C0000197E1F3B399FCCFB39BFECF81E099275C :1015D000A6B3019611F0A871D9F70895CF93CFB7AC :1015E000CF93C0915F02CA3A21F0CF91CFBFCF9184 :1015F00065CFCC27C395B39BE9F7B39B0BC0B39BD7 :1016000009C0B39B07C0B39B05C0B39B03C0B39B8A :1016100001C0D3C00F92DF93C0910B01DD27CE5ED6 :10162000DE4F012EB39B03C0DF910F90E6CF2F93C7 :101630000F931F934F932FEF4F6F06B303FB20F9C8 :101640005F933F9350E03BE065C016B301265029FD :1016500053FDC89556B3012703FB25F92F7306B335 :10166000B1F05027102713FB26F906B22230F0F014 :1016700000C016B3012703FB27F90126502906B243 :101680002430E8F54F77206816B30000F6CF5027D6 :101690004F7D206206B2102F000000C006B3002666 :1016A0005029102713FB26F906B2E2CF4F7B06B371 :1016B000206400C0DACF01265029187106B269F102 :1016C0004E7F2160012F16B328C0002650294D7F80 :1016D00006B22260102F29C0012650294B7F06B286 :1016E0002460012F2DC016B301265029477F2860A2 :1016F000000006B22EC04F7E06B3206130C04227E4 :1017000006B3499300265029102706B24FEF13FB6A :1017100020F9297F16B379F2187159F10126502961 :1017200006B2012703FB21F9237F06B371F20026DD :1017300050293150D0F006B2102713FB22F9277E32 :1017400016B351F201265029012703FB06B223F9F3 :101750002F7C49F2000006B3102713FB24F9002662 :10176000502906B22F7939F270CF10E21ABF002744 :1017700017C03B503195C31BD04010E21ABF0881FF :10178000033CF9F00B34E9F0209109011981110FA4 :101790001213EDCF093651F10D3211F0013E39F738 :1017A000009310013F915F914F911F910F912F91E5 :1017B000DF910F90CAB7C5FD1DCFCF91CFBFCF919D :1017C000189520911001222369F310910E01112325 :1017D00021F5343022F130930E0120930A0110914B :1017E0000B013BE0311B30930B0119C000910E013E :1017F00001309CF40AE53091610034FD11C0009382 :101800006100CEEFD0E010C0052710E000C021C07D :10181000052710E0C89508BB14C03AE501C032EDB9 :10182000032EC0E0D0E032E017B31861C39A08B3CA :1018300017BB58E120E84FEF20FF052708BB27958D :1018400017951C3F28F700004552B0F720FF0527E9 :10185000279508BB17951C3FB8F629913A9561F773 :10186000077E10910F01110F08BBC250D04011F03C :101870001093090110E21ABF086017B3177E402FBA :10188000477E54E05A95F1F708BB17BB48BB8ACF97 :101890002091F9003091FA002D3B3441B8F421E059 :1018A0002093F600F894E091F900F091FA000C0111 :1018B00020935700E895112478948091F900909135 :1018C000FA0002969093FA008093F90008958091AF :1018D000F600882309F43DC08091F9009091FA0048 :1018E000813C944108F035C0F8948091F9009091C2 :1018F000FA008238944118F1809166009091670057 :101900008F559A409F70906CEEEBF4E121E00C0152 :1019100020935700E895112480916E0090916F00FC :101920008C559A409F70906CECEBF4E10C01209385 :101930005700E8951124789481E080936400E09149 :10194000F900F091FA00329785E080935700E8950E :1019500078941092F6000895FF920F931F93CF93FF :10196000DF9380910E01835087FD5AC190910B0146 :10197000ACE0B0E0A91BB109AE5EBE4F31E03093E0 :10198000620090910A019D3209F00AC1883009F085 :1019900045C183EC8093FE008AE58093610010923C :1019A000FD008C91807609F47DC01092F3001092B6 :1019B000F5001092F40011962C911197213009F442 :1019C00069C0263021F481E08093FC0067C0273095 :1019D00009F040C03093FC0089EE90E090930D0137 :1019E00080930C0113969C9113979093EB001092A7 :1019F000EC0012968C911297803379F491114CC0BF :101A00001496EC911497F0E0EE0FFF1F81E28093A3 :101A10005700E491E093EC003FC08C3A81F4903899 :101A2000D9F514968C911497811136C015968C9126 :101A30001597811131C081E08093E8002DC08C346E :101A400059F515968C911597811126C081E08093E8 :101A5000E70022C0283009F4B6CF14968D919C91EE :101A600015979093FA008093F90016968C9116972B :101A70008093F10087EF820F843080F48FE788BD78 :101A80003093FB002093F2002A3051F081E08093E4 :101A9000FC0006C021E077C024E075C020E073C0E0 :101AA0002FEF68C012969C91129710920701119621 :101AB0008C911197811106C01092080187E091E086 :101AC00022E052C0853019F490930F013FC0863058 :101AD000B9F513968C911397813019F480EF94E146 :101AE00004C0823041F48EED94E190930D01809317 :101AF0000C0122E121C08330F1F4911108C084E28D :101B000095E190930D0180930C0124E015C0913074 :101B100041F48EE095E190930D0180930C0126E154 :101B20000BC0923041F482E095E190930D018093D7 :101B30000C012CE001C020E080E48093FD0018C07F :101B4000883079F0893031F49093110187E091E089 :101B500020E00AC021E08A3009F020E087E091E02F :101B600003C081E191E021E090930D0180930C018D :101B70002F3F49F48C9187FF02C016962C9180E884 :101B80008093FD000AC017968C911797811105C0AC :101B900016968C91821708F4282F209360003EC07F :101BA0009091FD0097FF3AC09091F100182F98177F :101BB00008F4192F092F011B0093F1001092FC006B :101BC0008091F2008A3029F0011128C01092600043 :101BD00025C0FA2ECA2FDB2F8C2F8F198117A0F763 :101BE0008091F9009091FA008034910590F421E001 :101BF00020936500FC01EE0FFF1FEA59FF4F28817B :101C000039813183208302969093FA008093F90002 :101C100003C0888199813CDE2296DECF10920E01AE :101C20008091610084FF7BC0809160008F3F09F448 :101C300076C0182F893008F018E0811B809360006F :101C40008091FE0098E889278093FE00112309F413 :101C50005AC08091FD0087FF38C08091F100811744 :101C600008F4182F811B8093F1003091F200E0916D :101C7000F900F091FA0020E0AFEFB0E0211700F595 :101C80003B3009F4FFCF3930D9F7E034F10560F487 :101C9000EF01CC0FDD1FCA59DF4F888199818D93E9 :101CA0009D932E5F3296EACFEC3B84E1F80710F06B :101CB0008FEF01C084918C9311962F5F3196DECF08 :101CC000F093FA00E093F9001EC0E0910C01F0914E :101CD0000D0186FF0BC08FEF90E0DC0124912D9366 :101CE0003196212F280F2A13F9CF09C08FEF90E0EA :101CF000DC0121912D93212F280F2A13FACFF09385 :101D00000D01E0930C01612F8FEF90E050DC1C5F20 :101D10001C3019F08FEF809360001093610084E114 :101D200096B3987131F48150D9F710920F01109247 :101D30000901C1E08111C0E0809163008C1739F086 :101D4000C11103C0F89401D17894C0936300DF916E :101D5000CF911F910F91FF900895C1B7B99A83E277 :101D60008ABD81E083BFAC9A8BB780628BBFBB9A80 :101D70002FE132E18AE0215030408040E1F700C09D :101D80000000BB987894E8DD8091E800882321F179 :101D900082E090E09093F8008093F70013C0CF01A9 :101DA0008F739927892B21F483E080935700E8955E :101DB000D3DD8091F7009091F80002969093F8009F :101DC0008093F700E091F700F091F800E03C94E197 :101DD000F90728F31092E8008091E700882329F0A2 :101DE000BBDD75DD1092E700B7DD809162008823CE :101DF00041F08091FC00811104C08091FB008111B1 :101E0000C2CF80916200882371F08091E600811139 :101E10000AC088B5805F88BD88B5811104C08AB5C5 :101E200090E189278ABD8091E6008F5F8093E6006C :101E30008EEC90E00197F1F78091F4009091F5001D :101E400001969093F5008093F4002091F3000097A1 :101E500011F42F5F00C02093F30030916200311124 :101E600005C081323EE4930708F05AC03091FC006F :101E7000332321F08131974208F052C080916200F3 :101E8000882309F480CF8091FB0081117CCF23301F :101E900008F479CF45C080916400811149C08CEB72 :101EA00094E19093FA008093F90081E08093F6002A :101EB0000EDD3EC0DF01AA0FBB1FAA59BF4F8D9197 :101EC0009C919F012B7F232B31F4E054FB4E859195 :101ED0009491805A954FDCDCE091F900F091FA0082 :101EE000E034F10538F3F3DC10925F0217BA13BE49 :101EF0001ABC03C081B78F5F81BF81B78C17D0F345 :101F000003C081B7815081BF81B7C817D0F391E07A :101F100080E80FB6F89486BD96BD0FBED0CA13C038 :101F200015BA1BBEF894809165008111B4CFDCCF47 :101F3000E0E0F0E083E080935700E8951092FA002B :101F40001092F900C9CF80E090E0DF92EF92FF920B :101F50000F931F93CF93DF9390E080E80FB6F89430 :101F600086BD96BD0FBE08E010E0F12C80E8E82E9B :101F7000DF2CDE0CD1BE1FDBEC01C43389E0D807B7 :101F80000CF4FD2CE694015011090115110581F79F :101F90001F2D8FEF8F0D81BF21B730E0812F90E093 :101FA00001968217930784F006DB8453994097FFCC :101FB00003C09195819591098C179D0714F4F1B692 :101FC000EC0181B78F5FE7CFF1BEDF91CF911F9119 :0E1FD0000F91FF90EF90DF900895F894FFCFEF :021FDE00FF5AA8 :04000003000014C025 :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/gemma/usbconfig.h ================================================ /* Name: usbconfig.h * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers * Author: Christian Starkjohann * Creation Date: 2005-04-01 * Tabsize: 4 * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH * License: GNU GPL v2 or v3 (see License.txt) */ /* Modified by me@frank-zhao.com for project GemmaBoot * * GemmaBoot is a bootloader that emulates a USBtinyISP (from Adafruit Industries) * * Gemma will use GemmaBoot * * This code is heavily derived from USBaspLoader, but also from USBtiny, with USBtinyISP's settings Copyright (c) 2013 Adafruit Industries All rights reserved. GemmaBoot is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GemmaBoot is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with GemmaBoot. If not, see . */ #ifndef __usbconfig_h_included__ #define __usbconfig_h_included__ /* YOU SHOULD NOT NEED TO MODIFY THIS FILE! All configurations are supposed * to go into bootloaderconfig.h! */ /* ---------------------------- Hardware Config ---------------------------- */ /* All the port and pin assignments, as well as the clock speed and CRC setting are now in bootloaderconfig.h: */ #include "bootloaderconfig.h" /* --------------------------- Functional Range ---------------------------- */ #define USB_CFG_HAVE_INTRIN_ENDPOINT 0 /* Define this to 1 if you want to compile a version with two endpoints: The * default control endpoint 0 and an interrupt-in endpoint (any other endpoint * number). */ #define USB_CFG_HAVE_INTRIN_ENDPOINT3 0 /* Define this to 1 if you want to compile a version with three endpoints: The * default control endpoint 0, an interrupt-in endpoint 3 (or the number * configured below) and a catch-all default interrupt-in endpoint as above. * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature. */ #define USB_CFG_EP3_NUMBER 3 /* If the so-called endpoint 3 is used, it can now be configured to any other * endpoint number (except 0) with this macro. Default if undefined is 3. */ /* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */ /* The above macro defines the startup condition for data toggling on the * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1. * Since the token is toggled BEFORE sending any data, the first packet is * sent with the oposite value of this configuration! */ #define USB_CFG_IMPLEMENT_HALT 0 /* Define this to 1 if you also want to implement the ENDPOINT_HALT feature * for endpoint 1 (interrupt endpoint). Although you may not need this feature, * it is required by the standard. We have made it a config option because it * bloats the code considerably. */ #define USB_CFG_SUPPRESS_INTR_CODE 0 /* Define this to 1 if you want to declare interrupt-in endpoints, but don't * want to send any data over them. If this macro is defined to 1, functions * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if * you need the interrupt-in endpoints in order to comply to an interface * (e.g. HID), but never want to send any data. This option saves a couple * of bytes in flash memory and the transmit buffers in RAM. */ #define USB_CFG_INTR_POLL_INTERVAL 10 /* If you compile a version with endpoint 1 (interrupt-in), this is the poll * interval. The value is in milliseconds and must not be less than 10 ms for * low speed devices. */ #ifndef USB_CFG_IS_SELF_POWERED // allow bootloaderconfig.h to override #define USB_CFG_IS_SELF_POWERED 0 #endif /* Define this to 1 if the device has its own power supply. Set it to 0 if the * device is powered from the USB bus. */ #ifndef USB_CFG_MAX_BUS_POWER // allow bootloaderconfig.h to override #define USB_CFG_MAX_BUS_POWER 100 #endif /* Set this variable to the maximum USB bus power consumption of your device. * The value is in milliamperes. [It will be divided by two since USB * communicates power requirements in units of 2 mA.] */ #define USB_CFG_IMPLEMENT_FN_WRITE 1 /* Set this to 1 if you want usbFunctionWrite() to be called for control-out * transfers. Set it to 0 if you don't need it and want to save a couple of * bytes. */ #define USB_CFG_IMPLEMENT_FN_READ 1 /* Set this to 1 if you need to send control replies which are generated * "on the fly" when usbFunctionRead() is called. If you only want to send * data from a static buffer, set it to 0 and return the data from * usbFunctionSetup(). This saves a couple of bytes. */ #define USB_CFG_IMPLEMENT_FN_WRITEOUT 0 /* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints. * You must implement the function usbFunctionWriteOut() which receives all * interrupt/bulk data sent to any endpoint other than 0. The endpoint number * can be found in 'usbRxToken'. */ #define USB_CFG_HAVE_FLOWCONTROL 0 /* Define this to 1 if you want flowcontrol over USB data. See the definition * of the macros usbDisableAllRequests() and usbEnableAllRequests() in * usbdrv.h. */ #define USB_CFG_DRIVER_FLASH_PAGE 0 /* If the device has more than 64 kBytes of flash, define this to the 64 k page * where the driver's constants (descriptors) are located. Or in other words: * Define this to 1 for boot loaders on the ATMega128. */ #define USB_CFG_LONG_TRANSFERS 0 /* Define this to 1 if you want to send/receive blocks of more than 254 bytes * in a single control-in or control-out transfer. Note that the capability * for long transfers increases the driver size. */ #ifndef __ASSEMBLER__ extern volatile char usbHasRxed; #endif #define USB_RX_USER_HOOK(data, len) do { usbHasRxed = 1; } while (0); /* This macro is a hook if you want to do unconventional things. If it is * defined, it's inserted at the beginning of received message processing. * If you eat the received message and don't want default processing to * proceed, do a return after doing your things. One possible application * (besides debugging) is to flash a status LED on each packet. */ /* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */ /* This macro is a hook if you need to know when an USB RESET occurs. It has * one parameter which distinguishes between the start of RESET state and its * end. */ /* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */ /* This macro (if defined) is executed when a USB SET_ADDRESS request was * received. */ #define USB_COUNT_SOF 0 /* define this macro to 1 if you need the global variable "usbSofCount" which * counts SOF packets. This feature requires that the hardware interrupt is * connected to D- instead of D+. */ /* #ifdef __ASSEMBLER__ * macro myAssemblerMacro * in YL, TCNT0 * sts timer0Snapshot, YL * endm * #endif * #define USB_SOF_HOOK myAssemblerMacro * This macro (if defined) is executed in the assembler module when a * Start Of Frame condition is detected. It is recommended to define it to * the name of an assembler macro which is defined here as well so that more * than one assembler instruction can be used. The macro may use the register * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages * immediately after an SOF pulse may be lost and must be retried by the host. * What can you do with this hook? Since the SOF signal occurs exactly every * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in * designs running on the internal RC oscillator. * Please note that Start Of Frame detection works only if D- is wired to the * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES! */ #define USB_CFG_CHECK_DATA_TOGGLING 0 /* define this macro to 1 if you want to filter out duplicate data packets * sent by the host. Duplicates occur only as a consequence of communication * errors, when the host does not receive an ACK. Please note that you need to * implement the filtering yourself in usbFunctionWriteOut() and * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable * for each control- and out-endpoint to check for duplicate packets. */ #define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 1 /* define this macro to 1 if you want the function usbMeasureFrameLength() * compiled in. This function can be used to calibrate the AVR's RC oscillator. */ #define USB_USE_FAST_CRC 0 /* The assembler module has two implementations for the CRC algorithm. One is * faster, the other is smaller. This CRC routine is only used for transmitted * messages where timing is not critical. The faster routine needs 31 cycles * per byte while the smaller one needs 61 to 69 cycles. The faster routine * may be worth the 32 bytes bigger code size if you transmit lots of data and * run the AVR close to its limit. */ /* -------------------------- Device Description --------------------------- */ #define USB_CFG_VENDOR_ID 0x41, 0x23 /* = 0x16c0 = 5824 = voti.nl */ /* USB vendor ID for the device, low byte first. If you have registered your * own Vendor ID, define it here. Otherwise you may use one of obdev's free * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules! */ #define USB_CFG_DEVICE_ID 0x9F, 0x0c /* = 0x05dc = 1500 */ /* This is the ID of the product, low byte first. It is interpreted in the * scope of the vendor ID. If you have registered your own VID with usb.org * or if you have licensed a PID from somebody else, define it here. Otherwise * you may use one of obdev's free shared VID/PID pairs. See the file * USB-IDs-for-free.txt for details! */ #define USB_CFG_DEVICE_VERSION 0x00, 0x01 /* Version number of the device: Minor number first, then major number. */ #define USB_CFG_VENDOR_NAME 'A','r','d','u','i','n','o','.','c','c' #define USB_CFG_VENDOR_NAME_LEN 10 /* These two values define the vendor name returned by the USB device. The name * must be given as a list of characters under single quotes. The characters * are interpreted as Unicode (UTF-16) entities. * If you don't want a vendor name string, undefine these macros. * ALWAYS define a vendor name containing your Internet domain name if you use * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for * details. */ #define USB_CFG_DEVICE_NAME 'G','e','m','m','a' #define USB_CFG_DEVICE_NAME_LEN 5 /* Same as above for the device name. If you don't want a device name, undefine * the macros. See the file USB-IDs-for-free.txt before you assign a name if * you use a shared VID/PID. */ /*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */ /*#define USB_CFG_SERIAL_NUMBER_LEN 0 */ /* Same as above for the serial number. If you don't want a serial number, * undefine the macros. * It may be useful to provide the serial number through other means than at * compile time. See the section about descriptor properties below for how * to fine tune control over USB descriptors such as the string descriptor * for the serial number. */ #define USB_CFG_DEVICE_CLASS 0xFF /* set to 0 if deferred to interface */ #define USB_CFG_DEVICE_SUBCLASS 0 /* See USB specification if you want to conform to an existing device class. * Class 0xff is "vendor specific". */ #define USB_CFG_INTERFACE_CLASS 0 /* define class here if not at device level */ #define USB_CFG_INTERFACE_SUBCLASS 0 #define USB_CFG_INTERFACE_PROTOCOL 0 /* See USB specification if you want to conform to an existing device class or * protocol. The following classes must be set at interface level: * HID class is 3, no subclass and protocol required (but may be useful!) * CDC class is 2, use subclass 2 and protocol 1 for ACM */ /* #define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 42 */ /* Define this to the length of the HID report descriptor, if you implement * an HID device. Otherwise don't define it or define it to 0. * If you use this define, you must add a PROGMEM character array named * "usbHidReportDescriptor" to your code which contains the report descriptor. * Don't forget to keep the array and this define in sync! */ #define USB_PUBLIC static /* Use the define above if you #include usbdrv.c instead of linking against it. * This technique saves a couple of bytes in flash memory. */ /* ------------------- Fine Control over USB Descriptors ------------------- */ /* If you don't want to use the driver's default USB descriptors, you can * provide our own. These can be provided as (1) fixed length static data in * flash memory, (2) fixed length static data in RAM or (3) dynamically at * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more * information about this function. * Descriptor handling is configured through the descriptor's properties. If * no properties are defined or if they are 0, the default descriptor is used. * Possible properties are: * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if * you want RAM pointers. * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found * in static memory is in RAM, not in flash memory. * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash), * the driver must know the descriptor's length. The descriptor itself is * found at the address of a well known identifier (see below). * List of static descriptor names (must be declared PROGMEM if in flash): * char usbDescriptorDevice[]; * char usbDescriptorConfiguration[]; * char usbDescriptorHidReport[]; * char usbDescriptorString0[]; * int usbDescriptorStringVendor[]; * int usbDescriptorStringDevice[]; * int usbDescriptorStringSerialNumber[]; * Other descriptors can't be provided statically, they must be provided * dynamically at runtime. * * Descriptor properties are or-ed or added together, e.g.: * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18)) * * The following descriptors are defined: * USB_CFG_DESCR_PROPS_DEVICE * USB_CFG_DESCR_PROPS_CONFIGURATION * USB_CFG_DESCR_PROPS_STRINGS * USB_CFG_DESCR_PROPS_STRING_0 * USB_CFG_DESCR_PROPS_STRING_VENDOR * USB_CFG_DESCR_PROPS_STRING_PRODUCT * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER * USB_CFG_DESCR_PROPS_HID * USB_CFG_DESCR_PROPS_HID_REPORT * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver) * * Note about string descriptors: String descriptors are not just strings, they * are Unicode strings prefixed with a 2 byte header. Example: * int serialNumberDescriptor[] = { * USB_STRING_DESCRIPTOR_HEADER(6), * 'S', 'e', 'r', 'i', 'a', 'l' * }; */ #define USB_CFG_DESCR_PROPS_DEVICE 0 #define USB_CFG_DESCR_PROPS_CONFIGURATION 0 #define USB_CFG_DESCR_PROPS_STRINGS 0 #define USB_CFG_DESCR_PROPS_STRING_0 0 #define USB_CFG_DESCR_PROPS_STRING_VENDOR 0 #define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0 #define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0 #define USB_CFG_DESCR_PROPS_HID 0 #define USB_CFG_DESCR_PROPS_HID_REPORT 0 #define USB_CFG_DESCR_PROPS_UNKNOWN 0 #define usbMsgPtr_t unsigned short // scalar type yields shortest code /* ----------------------- Optional MCU Description ------------------------ */ /* The following configurations have working defaults in usbdrv.h. You * usually don't need to set them explicitly. Only if you want to run * the driver on a device which is not yet supported or with a compiler * which is not fully supported (such as IAR C) or if you use a differnt * interrupt than INT0, you may have to define some of these. */ #define USB_INTR_CFG PCMSK #define USB_INTR_CFG_SET (1 << USB_CFG_DPLUS_BIT) #define USB_INTR_CFG_CLR 0 #define USB_INTR_ENABLE GIMSK #define USB_INTR_ENABLE_BIT PCIE #define USB_INTR_PENDING GIFR #define USB_INTR_PENDING_BIT PCIF #define USB_INTR_VECTOR PCINT0_vect #endif /* __usbconfig_h_included__ */ ================================================ FILE: external/arduino/avr/bootloaders/gemma/usbconfig.patch ================================================ 203c203 < #define USB_CFG_VENDOR_ID 0x81, 0x17 /* = 0x16c0 = 5824 = voti.nl */ --- > #define USB_CFG_VENDOR_ID 0x41, 0x23 /* = 0x16c0 = 5824 = voti.nl */ 208c208 < #define USB_CFG_DEVICE_ID 0x9F, 0x0C /* = 0x05dc = 1500 */ --- > #define USB_CFG_DEVICE_ID 0x9F, 0x0c /* = 0x05dc = 1500 */ 215c215 < #define USB_CFG_DEVICE_VERSION 0x05, 0x01 --- > #define USB_CFG_DEVICE_VERSION 0x00, 0x01 218,219c218,219 < #define USB_CFG_VENDOR_NAME 'A','d','a','f','r','u','i','t' < #define USB_CFG_VENDOR_NAME_LEN 8 --- > #define USB_CFG_VENDOR_NAME 'A','r','d','u','i','n','o','.','c','c' > #define USB_CFG_VENDOR_NAME_LEN 10 228,229c228,229 < #define USB_CFG_DEVICE_NAME 'T','r','i','n','k','e','t' < #define USB_CFG_DEVICE_NAME_LEN 7 --- > #define USB_CFG_DEVICE_NAME 'G','e','m','m','a' > #define USB_CFG_DEVICE_NAME_LEN 5 ================================================ FILE: external/arduino/avr/bootloaders/lilypad/LilyPadBOOT_168.hex ================================================ :103800000C94341C0C944F1C0C944F1C0C944F1CA7 :103810000C944F1C0C944F1C0C944F1C0C944F1C7C :103820000C944F1C0C944F1C0C944F1C0C944F1C6C :103830000C944F1C0C944F1C0C944F1C0C944F1C5C :103840000C944F1C0C944F1C0C944F1C0C944F1C4C :103850000C944F1C0C944F1C0C944F1C0C944F1C3C :103860000C944F1C0C944F1C11241FBECFEFD4E0BE :10387000DEBFCDBF11E0A0E0B1E0E8E1FFE302C0B0 :1038800005900D92A230B107D9F712E0A2E0B1E0A5 :1038900001C01D92AD30B107E1F70C94311D0C94BD :1038A000001CCF93DF93CDB7DEB724970FB6F89403 :1038B000DEBF0FBECDBF382F882309F433E010924E :1038C0000A02332309F44BC020E02D9A19821A8290 :1038D0001B821C8289819A81AB81BC8180549F416B :1038E000A040B040A0F489819A81AB81BC8101964F :1038F000A11DB11D89839A83AB83BC8389819A8181 :10390000AB81BC8180549F41A040B04060F32D98B2 :1039100019821A821B821C8289819A81AB81BC81A7 :1039200080549F41A040B040A0F489819A81AB812E :10393000BC810196A11DB11D89839A83AB83BC8391 :1039400089819A81AB81BC8180549F41A040B04065 :1039500060F32F5F231708F4B8CF20930A02249650 :103960000FB6F894DEBF0FBECDBFDF91CF910895A3 :10397000EF92FF920F931F93EE24FF248701809113 :10398000C00087FD17C00894E11CF11C011D111D2A :1039900081E0E81689E0F8068DE3080780E0180763 :1039A00070F3E0910201F091030109958091C0004C :1039B00087FFE9CF8091C600992787FD90951F91D9 :1039C0000F91FF90EF900895982F8091C00085FF90 :1039D000FCCF9093C60008950E94B81C803271F00D :1039E000809104018F5F80930401853009F0089570 :1039F000E0910201F09103010995089584E10E948C :103A0000E41C80E10E94E41C08951F93182F0E947B :103A1000B81C803269F0809104018F5F80930401AB :103A2000853079F4E0910201F0910301099509C014 :103A300084E10E94E41C812F0E94E41C80E10E942A :103A4000E41C1F910895282F882351F090E0809165 :103A5000C00087FFFCCF8091C6009F5F2917B9F790 :103A60000895CFEFD4E0DEBFCDBF000089E18093A1 :103A7000C4001092C50088E18093C10086E0809365 :103A8000C2005098589A259A83E00E94511C0E94C7 :103A9000B81C8033B1F18133B9F1803409F454C0DA :103AA000813409F45AC0823409F469C0853409F4B8 :103AB0006CC0803531F1813521F1823511F18535C8 :103AC00009F4B2C0863509F4BAC0843609F463C07B :103AD000843709F4BBC0853709F40EC1863709F471 :103AE0004AC0809104018F5F80930401853079F68C :103AF000E0910201F091030109950E94B81C803306 :103B000051F60E94EC1CC3CF0E94B81C803249F7CA :103B100084E10E94E41C81E40E94E41C86E50E948A :103B2000E41C82E50E94E41C80E20E94E41C89E41B :103B30000E94E41C83E50E94E41C80E50E94E41CD2 :103B400080E10E94E41CA3CF0E94B81C8638C8F212 :103B50000E94B81C0E94EC1C9ACF0E94B81C8038AE :103B600009F4F7C0813809F4F8C0823809F4F9C0C3 :103B7000883909F4BDC080E00E94051D88CF84E12A :103B80000E94231D0E94EC1C82CF85E00E94231D11 :103B90000E94EC1C7CCF0E94B81C809309020E94FA :103BA000B81C8093080280910C028E7F80930C02D7 :103BB0000E94B81C853409F4C6C080910802909117 :103BC0000902892B09F0ADC00E94B81C803209F0AF :103BD00088CF80910C0280FFC8C08091080290912C :103BE00009020097D1F02091060130910701E8E029 :103BF000F1E0AC014E0F5F1FF999FECF32BD21BD40 :103C0000819180BDFA9AF99A2F5F3F4F4E175F0757 :103C100099F7309307012093060184E10E94E41C88 :103C200080E10E94E41C33CF0E94B81C80930601FF :103C30000E94B81C809307010E94EC1C28CF84E0EE :103C40000E94231D80E00E94051D21CF0E94B81C08 :103C5000809309020E94B81C809308020E94B81C3D :103C6000853409F4F4C080910C028E7F80930C029D :103C70008091060190910701880F991F9093070189 :103C8000809306010E94B81C803209F000CF84E1C5 :103C90000E94E41C2091080230910902211531058F :103CA00019F1C0E0D0E0E0910601F09107018091A8 :103CB0000C0280FFC4C0F999FECFF2BDE1BDF89AB5 :103CC00080B50E94E41CE0910601F0910701319655 :103CD000F0930701E0930601209108023091090258 :103CE0002196C217D30718F380E10E94E41CCFCEBF :103CF00083E00E94051DCBCE0E94B81C803209F0E3 :103D0000F0CE84E10E94E41C8EE10E94E41C84E970 :103D10000E94E41C86E00E94E41C80E10E94E41CF6 :103D2000B6CEC0E0D0E008E011E00E94B81CF80177 :103D300081938F0121968091080290910902C81702 :103D4000D90798F341CF80910C02816080930C02D7 :103D500034CF82E00E94051D9ACE81E00E94051DAD :103D600096CE80E10E94051D92CE8091070187FDCD :103D700080C010920B028091060190910701880F7C :103D8000991F90930701809306018091080280FF9C :103D900009C080910802909109020196909309024E :103DA00080930802F894F999FECF1127E09106015B :103DB000F0910701C8E0D1E08091080290910902DA :103DC000103091F40091570001700130D9F303E0F5 :103DD00000935700E8950091570001700130D9F326 :103DE00001E100935700E895099019900091570060 :103DF00001700130D9F301E000935700E895139565 :103E0000103498F011270091570001700130D9F358 :103E100005E000935700E8950091570001700130CC :103E2000D9F301E100935700E8953296029709F023 :103E3000C7CF103011F00296E5CF1124EECE81FFEE :103E40000CC03196F0930701E093060149CF8091B1 :103E50000C02816080930C0215CF84910E94E41CB7 :103E60002091080230910902E0910601F0910701CA :103E7000E8CF81E080930B027ECF0F931F930E94C7 :103E8000B81C182F0E94E41C0E94B81C082F0E9426 :103E9000E41C11362CF0175501363CF0075508C0CC :103EA0001033D4F310530136CCF700330CF0005329 :103EB0001295107F100F812F992787FD90951F91E4 :103EC0000F9108951F93282F992787FD9095807F44 :103ED00090709595879595958795959587959595E6 :103EE00087958A304CF0982F995A822F8F708A309C :103EF0004CF0182F195A08C0982F905D822F8F70A0 :103F00008A30BCF7182F105D892F0E94E41C812F86 :083F10000E94E41C1F910895BA :023F1800800027 :0400000300003800C1 :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/lilypad/src/ATmegaBOOT.c ================================================ /**********************************************************/ /* Serial Bootloader for Atmel megaAVR Controllers */ /* */ /* tested with ATmega8, ATmega128 and ATmega168 */ /* should work with other mega's, see code for details */ /* */ /* ATmegaBOOT.c */ /* */ /* 20070626: hacked for Arduino Diecimila (which auto- */ /* resets when a USB connection is made to it) */ /* by D. Mellis */ /* 20060802: hacked for Arduino by D. Cuartielles */ /* based on a previous hack by D. Mellis */ /* and D. Cuartielles */ /* */ /* Monitor and debug functions were added to the original */ /* code by Dr. Erik Lins, chip45.com. (See below) */ /* */ /* Thanks to Karl Pitrich for fixing a bootloader pin */ /* problem and more informative LED blinking! */ /* */ /* For the latest version see: */ /* http://www.chip45.com/ */ /* */ /* ------------------------------------------------------ */ /* */ /* based on stk500boot.c */ /* Copyright (c) 2003, Jason P. Kyle */ /* All rights reserved. */ /* see avr1.org for original file and information */ /* */ /* This program is free software; you can redistribute it */ /* and/or modify it under the terms of the GNU General */ /* Public License as published by the Free Software */ /* Foundation; either version 2 of the License, or */ /* (at your option) any later version. */ /* */ /* This program is distributed in the hope that it will */ /* be useful, but WITHOUT ANY WARRANTY; without even the */ /* implied warranty of MERCHANTABILITY or FITNESS FOR A */ /* PARTICULAR PURPOSE. See the GNU General Public */ /* License for more details. */ /* */ /* You should have received a copy of the GNU General */ /* Public License along with this program; if not, write */ /* to the Free Software Foundation, Inc., */ /* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* */ /* Licence can be viewed at */ /* http://www.fsf.org/licenses/gpl.txt */ /* */ /* Target = Atmel AVR m128,m64,m32,m16,m8,m162,m163,m169, */ /* m8515,m8535. ATmega161 has a very small boot block so */ /* isn't supported. */ /* */ /* Tested with m168 */ /**********************************************************/ /* some includes */ #include #include #include #include #include /* the current avr-libc eeprom functions do not support the ATmega168 */ /* own eeprom write/read functions are used instead */ #ifndef __AVR_ATmega168__ #include #endif /* Use the F_CPU defined in Makefile */ /* 20060803: hacked by DojoCorp */ /* 20070626: hacked by David A. Mellis to decrease waiting time for auto-reset */ /* set the waiting time for the bootloader */ /* get this from the Makefile instead */ /* #define MAX_TIME_COUNT (F_CPU>>4) */ /* 20070707: hacked by David A. Mellis - after this many errors give up and launch application */ #define MAX_ERROR_COUNT 5 /* set the UART baud rate */ /* 20060803: hacked by DojoCorp */ //#define BAUD_RATE 115200 #define BAUD_RATE 19200 /* SW_MAJOR and MINOR needs to be updated from time to time to avoid warning message from AVR Studio */ /* never allow AVR Studio to do an update !!!! */ #define HW_VER 0x02 #define SW_MAJOR 0x01 #define SW_MINOR 0x10 /* Adjust to suit whatever pin your hardware uses to enter the bootloader */ /* ATmega128 has two UARTS so two pins are used to enter bootloader and select UART */ /* BL0... means UART0, BL1... means UART1 */ #ifdef __AVR_ATmega128__ #define BL_DDR DDRF #define BL_PORT PORTF #define BL_PIN PINF #define BL0 PINF7 #define BL1 PINF6 #else /* other ATmegas have only one UART, so only one pin is defined to enter bootloader */ #define BL_DDR DDRD #define BL_PORT PORTD #define BL_PIN PIND #define BL PIND6 #endif /* onboard LED is used to indicate, that the bootloader was entered (3x flashing) */ /* if monitor functions are included, LED goes on after monitor was entered */ #ifdef __AVR_ATmega128__ /* Onboard LED is connected to pin PB7 (e.g. Crumb128, PROBOmega128, Savvy128) */ #define LED_DDR DDRB #define LED_PORT PORTB #define LED_PIN PINB #define LED PINB7 #else /* Onboard LED is connected to pin PB2 (e.g. Crumb8, Crumb168) */ #define LED_DDR DDRB #define LED_PORT PORTB #define LED_PIN PINB /* 20060803: hacked by DojoCorp, LED pin is B5 in Arduino */ /* #define LED PINB2 */ #define LED PINB5 #endif /* monitor functions will only be compiled when using ATmega128, due to bootblock size constraints */ #ifdef __AVR_ATmega128__ #define MONITOR #endif /* define various device id's */ /* manufacturer byte is always the same */ #define SIG1 0x1E // Yep, Atmel is the only manufacturer of AVR micros. Single source :( #if defined __AVR_ATmega128__ #define SIG2 0x97 #define SIG3 0x02 #define PAGE_SIZE 0x80U //128 words #elif defined __AVR_ATmega64__ #define SIG2 0x96 #define SIG3 0x02 #define PAGE_SIZE 0x80U //128 words #elif defined __AVR_ATmega32__ #define SIG2 0x95 #define SIG3 0x02 #define PAGE_SIZE 0x40U //64 words #elif defined __AVR_ATmega16__ #define SIG2 0x94 #define SIG3 0x03 #define PAGE_SIZE 0x40U //64 words #elif defined __AVR_ATmega8__ #define SIG2 0x93 #define SIG3 0x07 #define PAGE_SIZE 0x20U //32 words #elif defined __AVR_ATmega88__ #define SIG2 0x93 #define SIG3 0x0a #define PAGE_SIZE 0x20U //32 words #elif defined __AVR_ATmega168__ #define SIG2 0x94 #define SIG3 0x06 #define PAGE_SIZE 0x40U //64 words #elif defined __AVR_ATmega162__ #define SIG2 0x94 #define SIG3 0x04 #define PAGE_SIZE 0x40U //64 words #elif defined __AVR_ATmega163__ #define SIG2 0x94 #define SIG3 0x02 #define PAGE_SIZE 0x40U //64 words #elif defined __AVR_ATmega169__ #define SIG2 0x94 #define SIG3 0x05 #define PAGE_SIZE 0x40U //64 words #elif defined __AVR_ATmega8515__ #define SIG2 0x93 #define SIG3 0x06 #define PAGE_SIZE 0x20U //32 words #elif defined __AVR_ATmega8535__ #define SIG2 0x93 #define SIG3 0x08 #define PAGE_SIZE 0x20U //32 words #endif /* function prototypes */ void putch(char); char getch(void); void getNch(uint8_t); void byte_response(uint8_t); void nothing_response(void); char gethex(void); void puthex(char); void flash_led(uint8_t); /* some variables */ union address_union { uint16_t word; uint8_t byte[2]; } address; union length_union { uint16_t word; uint8_t byte[2]; } length; struct flags_struct { unsigned eeprom : 1; unsigned rampz : 1; } flags; uint8_t buff[256]; uint8_t address_high; uint8_t pagesz=0x80; uint8_t i; uint8_t bootuart = 0; uint8_t error_count = 0; void (*app_start)(void) = 0x0000; /* main program starts here */ int main(void) { uint8_t ch,ch2; uint16_t w; asm volatile("nop\n\t"); /* set pin direction for bootloader pin and enable pullup */ /* for ATmega128, two pins need to be initialized */ #ifdef __AVR_ATmega128__ BL_DDR &= ~_BV(BL0); BL_DDR &= ~_BV(BL1); BL_PORT |= _BV(BL0); BL_PORT |= _BV(BL1); #else /* We run the bootloader regardless of the state of this pin. Thus, don't put it in a different state than the other pins. --DAM, 070709 BL_DDR &= ~_BV(BL); BL_PORT |= _BV(BL); */ #endif #ifdef __AVR_ATmega128__ /* check which UART should be used for booting */ if(bit_is_clear(BL_PIN, BL0)) { bootuart = 1; } else if(bit_is_clear(BL_PIN, BL1)) { bootuart = 2; } #endif /* check if flash is programmed already, if not start bootloader anyway */ if(pgm_read_byte_near(0x0000) != 0xFF) { #ifdef __AVR_ATmega128__ /* no UART was selected, start application */ if(!bootuart) { app_start(); } #else /* check if bootloader pin is set low */ /* we don't start this part neither for the m8, nor m168 */ //if(bit_is_set(BL_PIN, BL)) { // app_start(); // } #endif } #ifdef __AVR_ATmega128__ /* no bootuart was selected, default to uart 0 */ if(!bootuart) { bootuart = 1; } #endif /* initialize UART(s) depending on CPU defined */ #ifdef __AVR_ATmega128__ if(bootuart == 1) { UBRR0L = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1); UBRR0H = (F_CPU/(BAUD_RATE*16L)-1) >> 8; UCSR0A = 0x00; UCSR0C = 0x06; UCSR0B = _BV(TXEN0)|_BV(RXEN0); } if(bootuart == 2) { UBRR1L = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1); UBRR1H = (F_CPU/(BAUD_RATE*16L)-1) >> 8; UCSR1A = 0x00; UCSR1C = 0x06; UCSR1B = _BV(TXEN1)|_BV(RXEN1); } #elif defined __AVR_ATmega163__ UBRR = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1); UBRRHI = (F_CPU/(BAUD_RATE*16L)-1) >> 8; UCSRA = 0x00; UCSRB = _BV(TXEN)|_BV(RXEN); #elif defined __AVR_ATmega168__ UBRR0L = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1); UBRR0H = (F_CPU/(BAUD_RATE*16L)-1) >> 8; UCSR0B = (1<>8; // set baud rate UBRRL = (((F_CPU/BAUD_RATE)/16)-1); UCSRB = (1<> 8; UCSRA = 0x00; UCSRC = 0x06; UCSRB = _BV(TXEN)|_BV(RXEN); #endif /* set LED pin as output */ LED_DDR |= _BV(LED); /* flash onboard LED to signal entering of bootloader */ #ifdef __AVR_ATmega128__ // 4x for UART0, 5x for UART1 flash_led(NUM_LED_FLASHES + bootuart); #else flash_led(NUM_LED_FLASHES); #endif /* 20050803: by DojoCorp, this is one of the parts provoking the system to stop listening, cancelled from the original */ //putch('\0'); /* forever loop */ for (;;) { /* get character from UART */ ch = getch(); /* A bunch of if...else if... gives smaller code than switch...case ! */ /* Hello is anyone home ? */ if(ch=='0') { nothing_response(); } /* Request programmer ID */ /* Not using PROGMEM string due to boot block in m128 being beyond 64kB boundry */ /* Would need to selectively manipulate RAMPZ, and it's only 9 characters anyway so who cares. */ else if(ch=='1') { if (getch() == ' ') { putch(0x14); putch('A'); putch('V'); putch('R'); putch(' '); putch('I'); putch('S'); putch('P'); putch(0x10); } else { if (++error_count == MAX_ERROR_COUNT) app_start(); } } /* AVR ISP/STK500 board commands DON'T CARE so default nothing_response */ else if(ch=='@') { ch2 = getch(); if (ch2>0x85) getch(); nothing_response(); } /* AVR ISP/STK500 board requests */ else if(ch=='A') { ch2 = getch(); if(ch2==0x80) byte_response(HW_VER); // Hardware version else if(ch2==0x81) byte_response(SW_MAJOR); // Software major version else if(ch2==0x82) byte_response(SW_MINOR); // Software minor version else if(ch2==0x98) byte_response(0x03); // Unknown but seems to be required by avr studio 3.56 else byte_response(0x00); // Covers various unnecessary responses we don't care about } /* Device Parameters DON'T CARE, DEVICE IS FIXED */ else if(ch=='B') { getNch(20); nothing_response(); } /* Parallel programming stuff DON'T CARE */ else if(ch=='E') { getNch(5); nothing_response(); } /* Enter programming mode */ else if(ch=='P') { nothing_response(); } /* Leave programming mode */ else if(ch=='Q') { nothing_response(); } /* Erase device, don't care as we will erase one page at a time anyway. */ else if(ch=='R') { nothing_response(); } /* Set address, little endian. EEPROM in bytes, FLASH in words */ /* Perhaps extra address bytes may be added in future to support > 128kB FLASH. */ /* This might explain why little endian was used here, big endian used everywhere else. */ else if(ch=='U') { address.byte[0] = getch(); address.byte[1] = getch(); nothing_response(); } /* Universal SPI programming command, disabled. Would be used for fuses and lock bits. */ else if(ch=='V') { getNch(4); byte_response(0x00); } /* Write memory, length is big endian and is in bytes */ else if(ch=='d') { length.byte[1] = getch(); length.byte[0] = getch(); flags.eeprom = 0; if (getch() == 'E') flags.eeprom = 1; for (w=0;w127) address_high = 0x01; //Only possible with m128, m256 will need 3rd address byte. FIXME else address_high = 0x00; #ifdef __AVR_ATmega128__ RAMPZ = address_high; #endif address.word = address.word << 1; //address * 2 -> byte location /* if ((length.byte[0] & 0x01) == 0x01) length.word++; //Even up an odd number of bytes */ if ((length.byte[0] & 0x01)) length.word++; //Even up an odd number of bytes cli(); //Disable interrupts, just to be sure // HACKME: EEPE used to be EEWE while(bit_is_set(EECR,EEPE)); //Wait for previous EEPROM writes to complete asm volatile( "clr r17 \n\t" //page_word_count "lds r30,address \n\t" //Address of FLASH location (in bytes) "lds r31,address+1 \n\t" "ldi r28,lo8(buff) \n\t" //Start of buffer array in RAM "ldi r29,hi8(buff) \n\t" "lds r24,length \n\t" //Length of data to be written (in bytes) "lds r25,length+1 \n\t" "length_loop: \n\t" //Main loop, repeat for number of words in block "cpi r17,0x00 \n\t" //If page_word_count=0 then erase page "brne no_page_erase \n\t" "wait_spm1: \n\t" "lds r16,%0 \n\t" //Wait for previous spm to complete "andi r16,1 \n\t" "cpi r16,1 \n\t" "breq wait_spm1 \n\t" "ldi r16,0x03 \n\t" //Erase page pointed to by Z "sts %0,r16 \n\t" "spm \n\t" #ifdef __AVR_ATmega163__ ".word 0xFFFF \n\t" "nop \n\t" #endif "wait_spm2: \n\t" "lds r16,%0 \n\t" //Wait for previous spm to complete "andi r16,1 \n\t" "cpi r16,1 \n\t" "breq wait_spm2 \n\t" "ldi r16,0x11 \n\t" //Re-enable RWW section "sts %0,r16 \n\t" "spm \n\t" #ifdef __AVR_ATmega163__ ".word 0xFFFF \n\t" "nop \n\t" #endif "no_page_erase: \n\t" "ld r0,Y+ \n\t" //Write 2 bytes into page buffer "ld r1,Y+ \n\t" "wait_spm3: \n\t" "lds r16,%0 \n\t" //Wait for previous spm to complete "andi r16,1 \n\t" "cpi r16,1 \n\t" "breq wait_spm3 \n\t" "ldi r16,0x01 \n\t" //Load r0,r1 into FLASH page buffer "sts %0,r16 \n\t" "spm \n\t" "inc r17 \n\t" //page_word_count++ "cpi r17,%1 \n\t" "brlo same_page \n\t" //Still same page in FLASH "write_page: \n\t" "clr r17 \n\t" //New page, write current one first "wait_spm4: \n\t" "lds r16,%0 \n\t" //Wait for previous spm to complete "andi r16,1 \n\t" "cpi r16,1 \n\t" "breq wait_spm4 \n\t" #ifdef __AVR_ATmega163__ "andi r30,0x80 \n\t" // m163 requires Z6:Z1 to be zero during page write #endif "ldi r16,0x05 \n\t" //Write page pointed to by Z "sts %0,r16 \n\t" "spm \n\t" #ifdef __AVR_ATmega163__ ".word 0xFFFF \n\t" "nop \n\t" "ori r30,0x7E \n\t" // recover Z6:Z1 state after page write (had to be zero during write) #endif "wait_spm5: \n\t" "lds r16,%0 \n\t" //Wait for previous spm to complete "andi r16,1 \n\t" "cpi r16,1 \n\t" "breq wait_spm5 \n\t" "ldi r16,0x11 \n\t" //Re-enable RWW section "sts %0,r16 \n\t" "spm \n\t" #ifdef __AVR_ATmega163__ ".word 0xFFFF \n\t" "nop \n\t" #endif "same_page: \n\t" "adiw r30,2 \n\t" //Next word in FLASH "sbiw r24,2 \n\t" //length-2 "breq final_write \n\t" //Finished "rjmp length_loop \n\t" "final_write: \n\t" "cpi r17,0 \n\t" "breq block_done \n\t" "adiw r24,2 \n\t" //length+2, fool above check on length after short page write "rjmp write_page \n\t" "block_done: \n\t" "clr __zero_reg__ \n\t" //restore zero register #if defined __AVR_ATmega168__ : "=m" (SPMCSR) : "M" (PAGE_SIZE) : "r0","r16","r17","r24","r25","r28","r29","r30","r31" #else : "=m" (SPMCR) : "M" (PAGE_SIZE) : "r0","r16","r17","r24","r25","r28","r29","r30","r31" #endif ); /* Should really add a wait for RWW section to be enabled, don't actually need it since we never */ /* exit the bootloader without a power cycle anyhow */ } putch(0x14); putch(0x10); } else { if (++error_count == MAX_ERROR_COUNT) app_start(); } } /* Read memory block mode, length is big endian. */ else if(ch=='t') { length.byte[1] = getch(); length.byte[0] = getch(); #if defined __AVR_ATmega128__ if (address.word>0x7FFF) flags.rampz = 1; // No go with m256, FIXME else flags.rampz = 0; #endif if (getch() == 'E') flags.eeprom = 1; else { flags.eeprom = 0; address.word = address.word << 1; // address * 2 -> byte location } if (getch() == ' ') { // Command terminator putch(0x14); for (w=0;w < length.word;w++) { // Can handle odd and even lengths okay if (flags.eeprom) { // Byte access EEPROM read #ifdef __AVR_ATmega168__ while(EECR & (1<= 'a') { ah = ah - 'a' + 0x0a; } else if(ah >= '0') { ah -= '0'; } if(al >= 'a') { al = al - 'a' + 0x0a; } else if(al >= '0') { al -= '0'; } return (ah << 4) + al; } void puthex(char ch) { char ah,al; ah = (ch & 0xf0) >> 4; if(ah >= 0x0a) { ah = ah - 0x0a + 'a'; } else { ah += '0'; } al = (ch & 0x0f); if(al >= 0x0a) { al = al - 0x0a + 'a'; } else { al += '0'; } putch(ah); putch(al); } void putch(char ch) { #ifdef __AVR_ATmega128__ if(bootuart == 1) { while (!(UCSR0A & _BV(UDRE0))); UDR0 = ch; } else if (bootuart == 2) { while (!(UCSR1A & _BV(UDRE1))); UDR1 = ch; } #elif defined __AVR_ATmega168__ while (!(UCSR0A & _BV(UDRE0))); UDR0 = ch; #else /* m8,16,32,169,8515,8535,163 */ while (!(UCSRA & _BV(UDRE))); UDR = ch; #endif } char getch(void) { #ifdef __AVR_ATmega128__ if(bootuart == 1) { while(!(UCSR0A & _BV(RXC0))); return UDR0; } else if(bootuart == 2) { while(!(UCSR1A & _BV(RXC1))); return UDR1; } return 0; #elif defined __AVR_ATmega168__ uint32_t count = 0; while(!(UCSR0A & _BV(RXC0))){ /* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/ /* HACKME:: here is a good place to count times*/ count++; if (count > MAX_TIME_COUNT) app_start(); } return UDR0; #else /* m8,16,32,169,8515,8535,163 */ uint32_t count = 0; while(!(UCSRA & _BV(RXC))){ /* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/ /* HACKME:: here is a good place to count times*/ count++; if (count > MAX_TIME_COUNT) app_start(); } return UDR; #endif } void getNch(uint8_t count) { uint8_t i; for(i=0;i $@ %.srec: %.elf $(OBJCOPY) -j .text -j .data -O srec $< $@ %.bin: %.elf $(OBJCOPY) -j .text -j .data -O binary $< $@ clean: rm -rf *.o *.elf *.lst *.map *.sym *.lss *.eep *.srec *.bin *.hex install: avrdude -p m168 -c stk500v2 -P /dev/cu.USA19H1b1P1.1 -e -u -U lock:w:0x3f:m -U efuse:w:0x00:m -U hfuse:w:0xdd:m -U lfuse:w:0xe2:m avrdude -p m168 -c stk500v2 -P /dev/cu.USA19H1b1P1.1 -e -u -U flash:w:ATmegaBOOT_168.hex -U lock:w:0x0f:m ================================================ FILE: external/arduino/avr/bootloaders/optiboot/Makefile ================================================ # Makefile for ATmegaBOOT # E.Lins, 18.7.2005 # # Instructions # # To make bootloader .hex file: # make diecimila # make lilypad # make ng # etc... # # To burn bootloader .hex file: # make diecimila_isp # make lilypad_isp # make ng_isp # etc... # program name should not be changed... PROGRAM = optiboot # The default behavior is to build using tools that are in the users # current path variables, but we can also build using an installed # Arduino user IDE setup, or the Arduino source tree. # Uncomment this next lines to build within the arduino environment, # using the arduino-included avrgcc toolset (mac and pc) # ENV ?= arduino # ENV ?= arduinodev # OS ?= macosx # OS ?= windows # enter the parameters for the avrdude isp tool ISPTOOL = stk500v2 ISPPORT = usb ISPSPEED = -b 115200 MCU_TARGET = atmega168 LDSECTIONS = -Wl,--section-start=.text=0x3e00 -Wl,--section-start=.version=0x3ffe # Build environments # Start of some ugly makefile-isms to allow optiboot to be built # in several different environments. See the README.TXT file for # details. # default fixpath = $(1) ifeq ($(ENV), arduino) # For Arduino, we assume that we're connected to the optiboot directory # included with the arduino distribution, which means that the full set # of avr-tools are "right up there" in standard places. TOOLROOT = ../../../tools GCCROOT = $(TOOLROOT)/avr/bin/ AVRDUDE_CONF = -C$(TOOLROOT)/avr/etc/avrdude.conf ifeq ($(OS), windows) # On windows, SOME of the tool paths will need to have backslashes instead # of forward slashes (because they use windows cmd.exe for execution instead # of a unix/mingw shell?) We also have to ensure that a consistent shell # is used even if a unix shell is installed (ie as part of WINAVR) fixpath = $(subst /,\,$1) SHELL = cmd.exe endif else ifeq ($(ENV), arduinodev) # Arduino IDE source code environment. Use the unpacked compilers created # by the build (you'll need to do "ant build" first.) ifeq ($(OS), macosx) TOOLROOT = ../../../../build/macosx/work/Arduino.app/Contents/Resources/Java/hardware/tools endif ifeq ($(OS), windows) TOOLROOT = ../../../../build/windows/work/hardware/tools endif GCCROOT = $(TOOLROOT)/avr/bin/ AVRDUDE_CONF = -C$(TOOLROOT)/avr/etc/avrdude.conf else GCCROOT = AVRDUDE_CONF = endif # # End of build environment code. # the efuse should really be 0xf8; since, however, only the lower # three bits of that byte are used on the atmega168, avrdude gets # confused if you specify 1's for the higher bits, see: # http://tinker.it/now/2007/02/24/the-tale-of-avrdude-atmega168-and-extended-bits-fuses/ # # similarly, the lock bits should be 0xff instead of 0x3f (to # unlock the bootloader section) and 0xcf instead of 0x2f (to # lock it), but since the high two bits of the lock byte are # unused, avrdude would get confused. ISPFUSES = $(GCCROOT)avrdude $(AVRDUDE_CONF) -c $(ISPTOOL) \ -p $(MCU_TARGET) -P $(ISPPORT) $(ISPSPEED) \ -e -u -U lock:w:0x3f:m -U efuse:w:0x$(EFUSE):m \ -U hfuse:w:0x$(HFUSE):m -U lfuse:w:0x$(LFUSE):m ISPFLASH = $(GCCROOT)avrdude $(AVRDUDE_CONF) -c $(ISPTOOL) \ -p $(MCU_TARGET) -P $(ISPPORT) $(ISPSPEED) \ -U flash:w:$(PROGRAM)_$(TARGET).hex -U lock:w:0x2f:m STK500 = "C:\Program Files\Atmel\AVR Tools\STK500\Stk500.exe" STK500-1 = $(STK500) -e -d$(MCU_TARGET) -pf -vf -if$(PROGRAM)_$(TARGET).hex \ -lFF -LFF -f$(HFUSE)$(LFUSE) -EF8 -ms -q -cUSB -I200kHz -s -wt STK500-2 = $(STK500) -d$(MCU_TARGET) -ms -q -lCF -LCF -cUSB -I200kHz -s -wt OBJ = $(PROGRAM).o OPTIMIZE = -Os -fno-inline-small-functions -fno-split-wide-types -mshort-calls DEFS = LIBS = CC = $(GCCROOT)avr-gcc # Override is only needed by avr-lib build system. override CFLAGS = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) -DF_CPU=$(AVR_FREQ) $(DEFS) override LDFLAGS = $(LDSECTIONS) -Wl,--relax -Wl,--gc-sections -nostartfiles -nostdlib OBJCOPY = $(GCCROOT)avr-objcopy OBJDUMP = $(call fixpath,$(GCCROOT)avr-objdump) SIZE = $(GCCROOT)avr-size # Test platforms # Virtual boot block test virboot328: TARGET = atmega328 virboot328: MCU_TARGET = atmega328p virboot328: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' '-DVIRTUAL_BOOT' virboot328: AVR_FREQ = 16000000L virboot328: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe virboot328: $(PROGRAM)_atmega328.hex virboot328: $(PROGRAM)_atmega328.lst # 20MHz clocked platforms # # These are capable of 230400 baud, or 115200 baud on PC (Arduino Avrdude issue) # pro20: TARGET = pro_20mhz pro20: MCU_TARGET = atmega168 pro20: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' pro20: AVR_FREQ = 20000000L pro20: $(PROGRAM)_pro_20mhz.hex pro20: $(PROGRAM)_pro_20mhz.lst pro20_isp: pro20 pro20_isp: TARGET = pro_20mhz # 2.7V brownout pro20_isp: HFUSE = DD # Full swing xtal (20MHz) 258CK/14CK+4.1ms pro20_isp: LFUSE = C6 # 512 byte boot pro20_isp: EFUSE = 04 pro20_isp: isp # 16MHz clocked platforms # # These are capable of 230400 baud, or 115200 baud on PC (Arduino Avrdude issue) # pro16: TARGET = pro_16MHz pro16: MCU_TARGET = atmega168 pro16: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' pro16: AVR_FREQ = 16000000L pro16: $(PROGRAM)_pro_16MHz.hex pro16: $(PROGRAM)_pro_16MHz.lst pro16_isp: pro16 pro16_isp: TARGET = pro_16MHz # 2.7V brownout pro16_isp: HFUSE = DD # Full swing xtal (20MHz) 258CK/14CK+4.1ms pro16_isp: LFUSE = C6 # 512 byte boot pro16_isp: EFUSE = 04 pro16_isp: isp # Diecimila, Duemilanove with m168, and NG use identical bootloaders # Call it "atmega168" for generality and clarity, keep "diecimila" for # backward compatibility of makefile # atmega168: TARGET = atmega168 atmega168: MCU_TARGET = atmega168 atmega168: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' atmega168: AVR_FREQ = 16000000L atmega168: $(PROGRAM)_atmega168.hex atmega168: $(PROGRAM)_atmega168.lst atmega168_isp: atmega168 atmega168_isp: TARGET = atmega168 # 2.7V brownout atmega168_isp: HFUSE = DD # Low power xtal (16MHz) 16KCK/14CK+65ms atmega168_isp: LFUSE = FF # 512 byte boot atmega168_isp: EFUSE = 04 atmega168_isp: isp diecimila: TARGET = diecimila diecimila: MCU_TARGET = atmega168 diecimila: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' diecimila: AVR_FREQ = 16000000L diecimila: $(PROGRAM)_diecimila.hex diecimila: $(PROGRAM)_diecimila.lst diecimila_isp: diecimila diecimila_isp: TARGET = diecimila # 2.7V brownout diecimila_isp: HFUSE = DD # Low power xtal (16MHz) 16KCK/14CK+65ms diecimila_isp: LFUSE = FF # 512 byte boot diecimila_isp: EFUSE = 04 diecimila_isp: isp atmega328: TARGET = atmega328 atmega328: MCU_TARGET = atmega328p atmega328: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' atmega328: AVR_FREQ = 16000000L atmega328: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe atmega328: $(PROGRAM)_atmega328.hex atmega328: $(PROGRAM)_atmega328.lst atmega328_isp: atmega328 atmega328_isp: TARGET = atmega328 atmega328_isp: MCU_TARGET = atmega328p # 512 byte boot, SPIEN atmega328_isp: HFUSE = DE # Low power xtal (16MHz) 16KCK/14CK+65ms atmega328_isp: LFUSE = FF # 2.7V brownout atmega328_isp: EFUSE = 05 atmega328_isp: isp # Sanguino has a minimum boot size of 1024 bytes, so enable extra functions # sanguino: TARGET = atmega644p sanguino: MCU_TARGET = atmega644p sanguino: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' '-DBIGBOOT' sanguino: AVR_FREQ = 16000000L sanguino: LDSECTIONS = -Wl,--section-start=.text=0xfc00 sanguino: $(PROGRAM)_atmega644p.hex sanguino: $(PROGRAM)_atmega644p.lst sanguino_isp: sanguino sanguino_isp: TARGET = atmega644p sanguino_isp: MCU_TARGET = atmega644p # 1024 byte boot sanguino_isp: HFUSE = DE # Low power xtal (16MHz) 16KCK/14CK+65ms sanguino_isp: LFUSE = FF # 2.7V brownout sanguino_isp: EFUSE = 05 sanguino_isp: isp # Mega has a minimum boot size of 1024 bytes, so enable extra functions #mega: TARGET = atmega1280 mega: MCU_TARGET = atmega1280 mega: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' '-DBIGBOOT' mega: AVR_FREQ = 16000000L mega: LDSECTIONS = -Wl,--section-start=.text=0x1fc00 mega: $(PROGRAM)_atmega1280.hex mega: $(PROGRAM)_atmega1280.lst mega_isp: mega mega_isp: TARGET = atmega1280 mega_isp: MCU_TARGET = atmega1280 # 1024 byte boot mega_isp: HFUSE = DE # Low power xtal (16MHz) 16KCK/14CK+65ms mega_isp: LFUSE = FF # 2.7V brownout mega_isp: EFUSE = 05 mega_isp: isp # ATmega8 # atmega8: TARGET = atmega8 atmega8: MCU_TARGET = atmega8 atmega8: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' atmega8: AVR_FREQ = 16000000L atmega8: LDSECTIONS = -Wl,--section-start=.text=0x1e00 -Wl,--section-start=.version=0x1ffe atmega8: $(PROGRAM)_atmega8.hex atmega8: $(PROGRAM)_atmega8.lst atmega8_isp: atmega8 atmega8_isp: TARGET = atmega8 atmega8_isp: MCU_TARGET = atmega8 # SPIEN, CKOPT, Bootsize=512B atmega8_isp: HFUSE = CC # 2.7V brownout, Low power xtal (16MHz) 16KCK/14CK+65ms atmega8_isp: LFUSE = BF atmega8_isp: isp # ATmega88 # atmega88: TARGET = atmega88 atmega88: MCU_TARGET = atmega88 atmega88: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' atmega88: AVR_FREQ = 16000000L atmega88: LDSECTIONS = -Wl,--section-start=.text=0x1e00 -Wl,--section-start=.version=0x1ffe atmega88: $(PROGRAM)_atmega88.hex atmega88: $(PROGRAM)_atmega88.lst atmega88_isp: atmega88 atmega88_isp: TARGET = atmega88 atmega88_isp: MCU_TARGET = atmega88 # 2.7V brownout atmega88_isp: HFUSE = DD # Low power xtal (16MHz) 16KCK/14CK+65ms atemga88_isp: LFUSE = FF # 512 byte boot atmega88_isp: EFUSE = 04 atmega88_isp: isp # 8MHz clocked platforms # # These are capable of 115200 baud # lilypad: TARGET = lilypad lilypad: MCU_TARGET = atmega168 lilypad: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' lilypad: AVR_FREQ = 8000000L lilypad: $(PROGRAM)_lilypad.hex lilypad: $(PROGRAM)_lilypad.lst lilypad_isp: lilypad lilypad_isp: TARGET = lilypad # 2.7V brownout lilypad_isp: HFUSE = DD # Internal 8MHz osc (8MHz) Slow rising power lilypad_isp: LFUSE = E2 # 512 byte boot lilypad_isp: EFUSE = 04 lilypad_isp: isp lilypad_resonator: TARGET = lilypad_resonator lilypad_resonator: MCU_TARGET = atmega168 lilypad_resonator: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' lilypad_resonator: AVR_FREQ = 8000000L lilypad_resonator: $(PROGRAM)_lilypad_resonator.hex lilypad_resonator: $(PROGRAM)_lilypad_resonator.lst lilypad_resonator_isp: lilypad_resonator lilypad_resonator_isp: TARGET = lilypad_resonator # 2.7V brownout lilypad_resonator_isp: HFUSE = DD # Full swing xtal (20MHz) 258CK/14CK+4.1ms lilypad_resonator_isp: LFUSE = C6 # 512 byte boot lilypad_resonator_isp: EFUSE = 04 lilypad_resonator_isp: isp pro8: TARGET = pro_8MHz pro8: MCU_TARGET = atmega168 pro8: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' pro8: AVR_FREQ = 8000000L pro8: $(PROGRAM)_pro_8MHz.hex pro8: $(PROGRAM)_pro_8MHz.lst pro8_isp: pro8 pro8_isp: TARGET = pro_8MHz # 2.7V brownout pro8_isp: HFUSE = DD # Full swing xtal (20MHz) 258CK/14CK+4.1ms pro8_isp: LFUSE = C6 # 512 byte boot pro8_isp: EFUSE = 04 pro8_isp: isp atmega328_pro8: TARGET = atmega328_pro_8MHz atmega328_pro8: MCU_TARGET = atmega328p atmega328_pro8: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' atmega328_pro8: AVR_FREQ = 8000000L atmega328_pro8: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe atmega328_pro8: $(PROGRAM)_atmega328_pro_8MHz.hex atmega328_pro8: $(PROGRAM)_atmega328_pro_8MHz.lst atmega328_pro8_isp: atmega328_pro8 atmega328_pro8_isp: TARGET = atmega328_pro_8MHz atmega328_pro8_isp: MCU_TARGET = atmega328p # 512 byte boot, SPIEN atmega328_pro8_isp: HFUSE = DE # Low power xtal (16MHz) 16KCK/14CK+65ms atmega328_pro8_isp: LFUSE = FF # 2.7V brownout atmega328_pro8_isp: EFUSE = 05 atmega328_pro8_isp: isp # 1MHz clocked platforms # # These are capable of 9600 baud # luminet: TARGET = luminet luminet: MCU_TARGET = attiny84 luminet: CFLAGS += '-DLED_START_FLASHES=3' '-DSOFT_UART' '-DBAUD_RATE=9600' luminet: CFLAGS += '-DVIRTUAL_BOOT_PARTITION' luminet: AVR_FREQ = 1000000L luminet: LDSECTIONS = -Wl,--section-start=.text=0x1d00 -Wl,--section-start=.version=0x1efe luminet: $(PROGRAM)_luminet.hex luminet: $(PROGRAM)_luminet.lst luminet_isp: luminet luminet_isp: TARGET = luminet luminet_isp: MCU_TARGET = attiny84 # Brownout disabled luminet_isp: HFUSE = DF # 1MHz internal oscillator, slowly rising power luminet_isp: LFUSE = 62 # Self-programming enable luminet_isp: EFUSE = FE luminet_isp: isp # # Generic build instructions # # isp: $(TARGET) $(ISPFUSES) $(ISPFLASH) isp-stk500: $(PROGRAM)_$(TARGET).hex $(STK500-1) $(STK500-2) %.elf: $(OBJ) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS) $(SIZE) $@ clean: rm -rf *.o *.elf *.lst *.map *.sym *.lss *.eep *.srec *.bin *.hex %.lst: %.elf $(OBJDUMP) -h -S $< > $@ %.hex: %.elf $(OBJCOPY) -j .text -j .data -j .version --set-section-flags .version=alloc,load -O ihex $< $@ %.srec: %.elf $(OBJCOPY) -j .text -j .data -j .version --set-section-flags .version=alloc,load -O srec $< $@ %.bin: %.elf $(OBJCOPY) -j .text -j .data -j .version --set-section-flags .version=alloc,load -O binary $< $@ ================================================ FILE: external/arduino/avr/bootloaders/optiboot/README.TXT ================================================ This directory contains the Optiboot small bootloader for AVR microcontrollers, somewhat modified specifically for the Arduino environment. Optiboot is more fully described here: http://code.google.com/p/optiboot/ and is the work of Peter Knight (aka Cathedrow), building on work of Jason P Kyle, Spiff, and Ladyada. Arduino-specific modification are by Bill Westfield (aka WestfW) Arduino-specific issues are tracked as part of the Arduino project at http://code.google.com/p/arduino ------------------------------------------------------------ Building optiboot for Arduino. Production builds of optiboot for Arduino are done on a Mac in "unix mode" using CrossPack-AVR-20100115. CrossPack tracks WINAVR (for windows), which is just a package of avr-gcc and related utilities, so similar builds should work on Windows or Linux systems. One of the Arduino-specific changes is modifications to the makefile to allow building optiboot using only the tools installed as part of the Arduino environment, or the Arduino source development tree. All three build procedures should yield identical binaries (.hex files) (although this may change if compiler versions drift apart between CrossPack and the Arduino IDE.) Building Optiboot in the Arduino IDE Install. Work in the .../hardware/arduino/bootloaders/optiboot/ and use the "omake " command, which just generates a command that uses the arduino-included "make" utility with a command like: make OS=windows ENV=arduino or make OS=macosx ENV=arduino On windows, this assumes you're using the windows command shell. If you're using a cygwin or mingw shell, or have one of those in your path, the build will probably break due to slash vs backslash issues. On a Mac, if you have the developer tools installed, you can use the Apple-supplied version of make. The makefile uses relative paths ("../../../tools/" and such) to find the programs it needs, so you need to work in the existing optiboot directory (or something created at the same "level") for it to work. Building Optiboot in the Arduino Source Development Install. In this case, there is no special shell script, and you're assumed to have "make" installed somewhere in your path. Build the Arduino source ("ant build") to unpack the tools into the expected directory. Work in Arduino/hardware/arduino/bootloaders/optiboot and use make OS=windows ENV=arduinodev or make OS=macosx ENV=arduinodev Programming Chips Using the _isp Targets The CPU targets have corresponding ISP targets that will actuall program the bootloader into a chip. "atmega328_isp" for the atmega328, for example. These will set the fuses and lock bits as appropriate as well as uploading the bootloader code. The makefiles default to using a USB programmer, but you can use a serial programmer like ArduinoISP by changing the appropriate variables when you invoke make: make ISPTOOL=stk500v1 ISPPORT=/dev/tty.usbserial-A20e1eAN \ ISPSPEED=-b19200 atmega328_isp The "atmega8_isp" target does not currently work, because the mega8 doesn't have the "extended" fuse that the generic ISP target wants to pass on to avrdude. You'll need to run avrdude manually. Standard Targets I've reduced the pre-built and source-version-controlled targets (.hex and .lst files included in the git repository) to just the three basic 16MHz targets: atmega8, atmega16, atmega328. ================================================ FILE: external/arduino/avr/bootloaders/optiboot/boot.h ================================================ /* Modified to use out for SPM access ** Peter Knight, Optiboot project http://optiboot.googlecode.com ** ** Todo: Tidy up ** ** "_short" routines execute 1 cycle faster and use 1 less word of flash ** by using "out" instruction instead of "sts". ** ** Additional elpm variants that trust the value of RAMPZ */ /* Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007 Eric B. Weddington All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _AVR_BOOT_H_ #define _AVR_BOOT_H_ 1 /** \file */ /** \defgroup avr_boot : Bootloader Support Utilities \code #include #include \endcode The macros in this module provide a C language interface to the bootloader support functionality of certain AVR processors. These macros are designed to work with all sizes of flash memory. Global interrupts are not automatically disabled for these macros. It is left up to the programmer to do this. See the code example below. Also see the processor datasheet for caveats on having global interrupts enabled during writing of the Flash. \note Not all AVR processors provide bootloader support. See your processor datasheet to see if it provides bootloader support. \todo From email with Marek: On smaller devices (all except ATmega64/128), __SPM_REG is in the I/O space, accessible with the shorter "in" and "out" instructions - since the boot loader has a limited size, this could be an important optimization. \par API Usage Example The following code shows typical usage of the boot API. \code #include #include #include void boot_program_page (uint32_t page, uint8_t *buf) { uint16_t i; uint8_t sreg; // Disable interrupts. sreg = SREG; cli(); eeprom_busy_wait (); boot_page_erase (page); boot_spm_busy_wait (); // Wait until the memory is erased. for (i=0; i #include #include #include /* Check for SPM Control Register in processor. */ #if defined (SPMCSR) # define __SPM_REG SPMCSR #elif defined (SPMCR) # define __SPM_REG SPMCR #else # error AVR processor does not provide bootloader support! #endif /* Check for SPM Enable bit. */ #if defined(SPMEN) # define __SPM_ENABLE SPMEN #elif defined(SELFPRGEN) # define __SPM_ENABLE SELFPRGEN #else # error Cannot find SPM Enable bit definition! #endif /** \ingroup avr_boot \def BOOTLOADER_SECTION Used to declare a function or variable to be placed into a new section called .bootloader. This section and its contents can then be relocated to any address (such as the bootloader NRWW area) at link-time. */ #define BOOTLOADER_SECTION __attribute__ ((section (".bootloader"))) /* Create common bit definitions. */ #ifdef ASB #define __COMMON_ASB ASB #else #define __COMMON_ASB RWWSB #endif #ifdef ASRE #define __COMMON_ASRE ASRE #else #define __COMMON_ASRE RWWSRE #endif /* Define the bit positions of the Boot Lock Bits. */ #define BLB12 5 #define BLB11 4 #define BLB02 3 #define BLB01 2 /** \ingroup avr_boot \def boot_spm_interrupt_enable() Enable the SPM interrupt. */ #define boot_spm_interrupt_enable() (__SPM_REG |= (uint8_t)_BV(SPMIE)) /** \ingroup avr_boot \def boot_spm_interrupt_disable() Disable the SPM interrupt. */ #define boot_spm_interrupt_disable() (__SPM_REG &= (uint8_t)~_BV(SPMIE)) /** \ingroup avr_boot \def boot_is_spm_interrupt() Check if the SPM interrupt is enabled. */ #define boot_is_spm_interrupt() (__SPM_REG & (uint8_t)_BV(SPMIE)) /** \ingroup avr_boot \def boot_rww_busy() Check if the RWW section is busy. */ #define boot_rww_busy() (__SPM_REG & (uint8_t)_BV(__COMMON_ASB)) /** \ingroup avr_boot \def boot_spm_busy() Check if the SPM instruction is busy. */ #define boot_spm_busy() (__SPM_REG & (uint8_t)_BV(__SPM_ENABLE)) /** \ingroup avr_boot \def boot_spm_busy_wait() Wait while the SPM instruction is busy. */ #define boot_spm_busy_wait() do{}while(boot_spm_busy()) #define __BOOT_PAGE_ERASE (_BV(__SPM_ENABLE) | _BV(PGERS)) #define __BOOT_PAGE_WRITE (_BV(__SPM_ENABLE) | _BV(PGWRT)) #define __BOOT_PAGE_FILL _BV(__SPM_ENABLE) #define __BOOT_RWW_ENABLE (_BV(__SPM_ENABLE) | _BV(__COMMON_ASRE)) #define __BOOT_LOCK_BITS_SET (_BV(__SPM_ENABLE) | _BV(BLBSET)) #define __boot_page_fill_short(address, data) \ (__extension__({ \ __asm__ __volatile__ \ ( \ "movw r0, %3\n\t" \ "out %0, %1\n\t" \ "spm\n\t" \ "clr r1\n\t" \ : \ : "i" (_SFR_IO_ADDR(__SPM_REG)), \ "r" ((uint8_t)__BOOT_PAGE_FILL), \ "z" ((uint16_t)address), \ "r" ((uint16_t)data) \ : "r0" \ ); \ })) #define __boot_page_fill_normal(address, data) \ (__extension__({ \ __asm__ __volatile__ \ ( \ "movw r0, %3\n\t" \ "sts %0, %1\n\t" \ "spm\n\t" \ "clr r1\n\t" \ : \ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ "r" ((uint8_t)__BOOT_PAGE_FILL), \ "z" ((uint16_t)address), \ "r" ((uint16_t)data) \ : "r0" \ ); \ })) #define __boot_page_fill_alternate(address, data)\ (__extension__({ \ __asm__ __volatile__ \ ( \ "movw r0, %3\n\t" \ "sts %0, %1\n\t" \ "spm\n\t" \ ".word 0xffff\n\t" \ "nop\n\t" \ "clr r1\n\t" \ : \ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ "r" ((uint8_t)__BOOT_PAGE_FILL), \ "z" ((uint16_t)address), \ "r" ((uint16_t)data) \ : "r0" \ ); \ })) #define __boot_page_fill_extended(address, data) \ (__extension__({ \ __asm__ __volatile__ \ ( \ "movw r0, %4\n\t" \ "movw r30, %A3\n\t" \ "sts %1, %C3\n\t" \ "sts %0, %2\n\t" \ "spm\n\t" \ "clr r1\n\t" \ : \ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ "i" (_SFR_MEM_ADDR(RAMPZ)), \ "r" ((uint8_t)__BOOT_PAGE_FILL), \ "r" ((uint32_t)address), \ "r" ((uint16_t)data) \ : "r0", "r30", "r31" \ ); \ })) #define __boot_page_fill_extended_short(address, data) \ (__extension__({ \ __asm__ __volatile__ \ ( \ "movw r0, %4\n\t" \ "movw r30, %A3\n\t" \ "out %1, %C3\n\t" \ "out %0, %2\n\t" \ "spm\n\t" \ "clr r1\n\t" \ : \ : "i" (_SFR_IO_ADDR(__SPM_REG)), \ "i" (_SFR_IO_ADDR(RAMPZ)), \ "r" ((uint8_t)__BOOT_PAGE_FILL), \ "r" ((uint32_t)address), \ "r" ((uint16_t)data) \ : "r0", "r30", "r31" \ ); \ })) #define __boot_page_erase_short(address) \ (__extension__({ \ __asm__ __volatile__ \ ( \ "out %0, %1\n\t" \ "spm\n\t" \ : \ : "i" (_SFR_IO_ADDR(__SPM_REG)), \ "r" ((uint8_t)__BOOT_PAGE_ERASE), \ "z" ((uint16_t)address) \ ); \ })) #define __boot_page_erase_normal(address) \ (__extension__({ \ __asm__ __volatile__ \ ( \ "sts %0, %1\n\t" \ "spm\n\t" \ : \ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ "r" ((uint8_t)__BOOT_PAGE_ERASE), \ "z" ((uint16_t)address) \ ); \ })) #define __boot_page_erase_alternate(address) \ (__extension__({ \ __asm__ __volatile__ \ ( \ "sts %0, %1\n\t" \ "spm\n\t" \ ".word 0xffff\n\t" \ "nop\n\t" \ : \ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ "r" ((uint8_t)__BOOT_PAGE_ERASE), \ "z" ((uint16_t)address) \ ); \ })) #define __boot_page_erase_extended(address) \ (__extension__({ \ __asm__ __volatile__ \ ( \ "movw r30, %A3\n\t" \ "sts %1, %C3\n\t" \ "sts %0, %2\n\t" \ "spm\n\t" \ : \ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ "i" (_SFR_MEM_ADDR(RAMPZ)), \ "r" ((uint8_t)__BOOT_PAGE_ERASE), \ "r" ((uint32_t)address) \ : "r30", "r31" \ ); \ })) #define __boot_page_erase_extended_short(address) \ (__extension__({ \ __asm__ __volatile__ \ ( \ "movw r30, %A3\n\t" \ "out %1, %C3\n\t" \ "out %0, %2\n\t" \ "spm\n\t" \ : \ : "i" (_SFR_IO_ADDR(__SPM_REG)), \ "i" (_SFR_IO_ADDR(RAMPZ)), \ "r" ((uint8_t)__BOOT_PAGE_ERASE), \ "r" ((uint32_t)address) \ : "r30", "r31" \ ); \ })) #define __boot_page_write_short(address) \ (__extension__({ \ __asm__ __volatile__ \ ( \ "out %0, %1\n\t" \ "spm\n\t" \ : \ : "i" (_SFR_IO_ADDR(__SPM_REG)), \ "r" ((uint8_t)__BOOT_PAGE_WRITE), \ "z" ((uint16_t)address) \ ); \ })) #define __boot_page_write_normal(address) \ (__extension__({ \ __asm__ __volatile__ \ ( \ "sts %0, %1\n\t" \ "spm\n\t" \ : \ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ "r" ((uint8_t)__BOOT_PAGE_WRITE), \ "z" ((uint16_t)address) \ ); \ })) #define __boot_page_write_alternate(address) \ (__extension__({ \ __asm__ __volatile__ \ ( \ "sts %0, %1\n\t" \ "spm\n\t" \ ".word 0xffff\n\t" \ "nop\n\t" \ : \ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ "r" ((uint8_t)__BOOT_PAGE_WRITE), \ "z" ((uint16_t)address) \ ); \ })) #define __boot_page_write_extended(address) \ (__extension__({ \ __asm__ __volatile__ \ ( \ "movw r30, %A3\n\t" \ "sts %1, %C3\n\t" \ "sts %0, %2\n\t" \ "spm\n\t" \ : \ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ "i" (_SFR_MEM_ADDR(RAMPZ)), \ "r" ((uint8_t)__BOOT_PAGE_WRITE), \ "r" ((uint32_t)address) \ : "r30", "r31" \ ); \ })) #define __boot_page_write_extended_short(address) \ (__extension__({ \ __asm__ __volatile__ \ ( \ "movw r30, %A3\n\t" \ "out %1, %C3\n\t" \ "out %0, %2\n\t" \ "spm\n\t" \ : \ : "i" (_SFR_IO_ADDR(__SPM_REG)), \ "i" (_SFR_IO_ADDR(RAMPZ)), \ "r" ((uint8_t)__BOOT_PAGE_WRITE), \ "r" ((uint32_t)address) \ : "r30", "r31" \ ); \ })) #define __boot_rww_enable_short() \ (__extension__({ \ __asm__ __volatile__ \ ( \ "out %0, %1\n\t" \ "spm\n\t" \ : \ : "i" (_SFR_IO_ADDR(__SPM_REG)), \ "r" ((uint8_t)__BOOT_RWW_ENABLE) \ ); \ })) #define __boot_rww_enable() \ (__extension__({ \ __asm__ __volatile__ \ ( \ "sts %0, %1\n\t" \ "spm\n\t" \ : \ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ "r" ((uint8_t)__BOOT_RWW_ENABLE) \ ); \ })) #define __boot_rww_enable_alternate() \ (__extension__({ \ __asm__ __volatile__ \ ( \ "sts %0, %1\n\t" \ "spm\n\t" \ ".word 0xffff\n\t" \ "nop\n\t" \ : \ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ "r" ((uint8_t)__BOOT_RWW_ENABLE) \ ); \ })) /* From the mega16/mega128 data sheets (maybe others): Bits by SPM To set the Boot Loader Lock bits, write the desired data to R0, write "X0001001" to SPMCR and execute SPM within four clock cycles after writing SPMCR. The only accessible Lock bits are the Boot Lock bits that may prevent the Application and Boot Loader section from any software update by the MCU. If bits 5..2 in R0 are cleared (zero), the corresponding Boot Lock bit will be programmed if an SPM instruction is executed within four cycles after BLBSET and SPMEN (or SELFPRGEN) are set in SPMCR. The Z-pointer is don't care during this operation, but for future compatibility it is recommended to load the Z-pointer with $0001 (same as used for reading the Lock bits). For future compatibility It is also recommended to set bits 7, 6, 1, and 0 in R0 to 1 when writing the Lock bits. When programming the Lock bits the entire Flash can be read during the operation. */ #define __boot_lock_bits_set_short(lock_bits) \ (__extension__({ \ uint8_t value = (uint8_t)(~(lock_bits)); \ __asm__ __volatile__ \ ( \ "ldi r30, 1\n\t" \ "ldi r31, 0\n\t" \ "mov r0, %2\n\t" \ "out %0, %1\n\t" \ "spm\n\t" \ : \ : "i" (_SFR_IO_ADDR(__SPM_REG)), \ "r" ((uint8_t)__BOOT_LOCK_BITS_SET), \ "r" (value) \ : "r0", "r30", "r31" \ ); \ })) #define __boot_lock_bits_set(lock_bits) \ (__extension__({ \ uint8_t value = (uint8_t)(~(lock_bits)); \ __asm__ __volatile__ \ ( \ "ldi r30, 1\n\t" \ "ldi r31, 0\n\t" \ "mov r0, %2\n\t" \ "sts %0, %1\n\t" \ "spm\n\t" \ : \ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ "r" ((uint8_t)__BOOT_LOCK_BITS_SET), \ "r" (value) \ : "r0", "r30", "r31" \ ); \ })) #define __boot_lock_bits_set_alternate(lock_bits) \ (__extension__({ \ uint8_t value = (uint8_t)(~(lock_bits)); \ __asm__ __volatile__ \ ( \ "ldi r30, 1\n\t" \ "ldi r31, 0\n\t" \ "mov r0, %2\n\t" \ "sts %0, %1\n\t" \ "spm\n\t" \ ".word 0xffff\n\t" \ "nop\n\t" \ : \ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ "r" ((uint8_t)__BOOT_LOCK_BITS_SET), \ "r" (value) \ : "r0", "r30", "r31" \ ); \ })) /* Reading lock and fuse bits: Similarly to writing the lock bits above, set BLBSET and SPMEN (or SELFPRGEN) bits in __SPMREG, and then (within four clock cycles) issue an LPM instruction. Z address: contents: 0x0000 low fuse bits 0x0001 lock bits 0x0002 extended fuse bits 0x0003 high fuse bits Sounds confusing, doesn't it? Unlike the macros in pgmspace.h, no need to care for non-enhanced cores here as these old cores do not provide SPM support anyway. */ /** \ingroup avr_boot \def GET_LOW_FUSE_BITS address to read the low fuse bits, using boot_lock_fuse_bits_get */ #define GET_LOW_FUSE_BITS (0x0000) /** \ingroup avr_boot \def GET_LOCK_BITS address to read the lock bits, using boot_lock_fuse_bits_get */ #define GET_LOCK_BITS (0x0001) /** \ingroup avr_boot \def GET_EXTENDED_FUSE_BITS address to read the extended fuse bits, using boot_lock_fuse_bits_get */ #define GET_EXTENDED_FUSE_BITS (0x0002) /** \ingroup avr_boot \def GET_HIGH_FUSE_BITS address to read the high fuse bits, using boot_lock_fuse_bits_get */ #define GET_HIGH_FUSE_BITS (0x0003) /** \ingroup avr_boot \def boot_lock_fuse_bits_get(address) Read the lock or fuse bits at \c address. Parameter \c address can be any of GET_LOW_FUSE_BITS, GET_LOCK_BITS, GET_EXTENDED_FUSE_BITS, or GET_HIGH_FUSE_BITS. \note The lock and fuse bits returned are the physical values, i.e. a bit returned as 0 means the corresponding fuse or lock bit is programmed. */ #define boot_lock_fuse_bits_get_short(address) \ (__extension__({ \ uint8_t __result; \ __asm__ __volatile__ \ ( \ "ldi r30, %3\n\t" \ "ldi r31, 0\n\t" \ "out %1, %2\n\t" \ "lpm %0, Z\n\t" \ : "=r" (__result) \ : "i" (_SFR_IO_ADDR(__SPM_REG)), \ "r" ((uint8_t)__BOOT_LOCK_BITS_SET), \ "M" (address) \ : "r0", "r30", "r31" \ ); \ __result; \ })) #define boot_lock_fuse_bits_get(address) \ (__extension__({ \ uint8_t __result; \ __asm__ __volatile__ \ ( \ "ldi r30, %3\n\t" \ "ldi r31, 0\n\t" \ "sts %1, %2\n\t" \ "lpm %0, Z\n\t" \ : "=r" (__result) \ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ "r" ((uint8_t)__BOOT_LOCK_BITS_SET), \ "M" (address) \ : "r0", "r30", "r31" \ ); \ __result; \ })) /** \ingroup avr_boot \def boot_signature_byte_get(address) Read the Signature Row byte at \c address. For some MCU types, this function can also retrieve the factory-stored oscillator calibration bytes. Parameter \c address can be 0-0x1f as documented by the datasheet. \note The values are MCU type dependent. */ #define __BOOT_SIGROW_READ (_BV(__SPM_ENABLE) | _BV(SIGRD)) #define boot_signature_byte_get_short(addr) \ (__extension__({ \ uint16_t __addr16 = (uint16_t)(addr); \ uint8_t __result; \ __asm__ __volatile__ \ ( \ "out %1, %2\n\t" \ "lpm %0, Z" "\n\t" \ : "=r" (__result) \ : "i" (_SFR_IO_ADDR(__SPM_REG)), \ "r" ((uint8_t) __BOOT_SIGROW_READ), \ "z" (__addr16) \ ); \ __result; \ })) #define boot_signature_byte_get(addr) \ (__extension__({ \ uint16_t __addr16 = (uint16_t)(addr); \ uint8_t __result; \ __asm__ __volatile__ \ ( \ "sts %1, %2\n\t" \ "lpm %0, Z" "\n\t" \ : "=r" (__result) \ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ "r" ((uint8_t) __BOOT_SIGROW_READ), \ "z" (__addr16) \ ); \ __result; \ })) /** \ingroup avr_boot \def boot_page_fill(address, data) Fill the bootloader temporary page buffer for flash address with data word. \note The address is a byte address. The data is a word. The AVR writes data to the buffer a word at a time, but addresses the buffer per byte! So, increment your address by 2 between calls, and send 2 data bytes in a word format! The LSB of the data is written to the lower address; the MSB of the data is written to the higher address.*/ /** \ingroup avr_boot \def boot_page_erase(address) Erase the flash page that contains address. \note address is a byte address in flash, not a word address. */ /** \ingroup avr_boot \def boot_page_write(address) Write the bootloader temporary page buffer to flash page that contains address. \note address is a byte address in flash, not a word address. */ /** \ingroup avr_boot \def boot_rww_enable() Enable the Read-While-Write memory section. */ /** \ingroup avr_boot \def boot_lock_bits_set(lock_bits) Set the bootloader lock bits. \param lock_bits A mask of which Boot Loader Lock Bits to set. \note In this context, a 'set bit' will be written to a zero value. Note also that only BLBxx bits can be programmed by this command. For example, to disallow the SPM instruction from writing to the Boot Loader memory section of flash, you would use this macro as such: \code boot_lock_bits_set (_BV (BLB11)); \endcode \note Like any lock bits, the Boot Loader Lock Bits, once set, cannot be cleared again except by a chip erase which will in turn also erase the boot loader itself. */ /* Normal versions of the macros use 16-bit addresses. Extended versions of the macros use 32-bit addresses. Alternate versions of the macros use 16-bit addresses and require special instruction sequences after LPM. FLASHEND is defined in the ioXXXX.h file. USHRT_MAX is defined in . */ #if defined(__AVR_ATmega161__) || defined(__AVR_ATmega163__) \ || defined(__AVR_ATmega323__) /* Alternate: ATmega161/163/323 and 16 bit address */ #define boot_page_fill(address, data) __boot_page_fill_alternate(address, data) #define boot_page_erase(address) __boot_page_erase_alternate(address) #define boot_page_write(address) __boot_page_write_alternate(address) #define boot_rww_enable() __boot_rww_enable_alternate() #define boot_lock_bits_set(lock_bits) __boot_lock_bits_set_alternate(lock_bits) #elif (FLASHEND > USHRT_MAX) /* Extended: >16 bit address */ #define boot_page_fill(address, data) __boot_page_fill_extended_short(address, data) #define boot_page_erase(address) __boot_page_erase_extended_short(address) #define boot_page_write(address) __boot_page_write_extended_short(address) #define boot_rww_enable() __boot_rww_enable_short() #define boot_lock_bits_set(lock_bits) __boot_lock_bits_set_short(lock_bits) #else /* Normal: 16 bit address */ #define boot_page_fill(address, data) __boot_page_fill_short(address, data) #define boot_page_erase(address) __boot_page_erase_short(address) #define boot_page_write(address) __boot_page_write_short(address) #define boot_rww_enable() __boot_rww_enable_short() #define boot_lock_bits_set(lock_bits) __boot_lock_bits_set_short(lock_bits) #endif /** \ingroup avr_boot Same as boot_page_fill() except it waits for eeprom and spm operations to complete before filling the page. */ #define boot_page_fill_safe(address, data) \ do { \ boot_spm_busy_wait(); \ eeprom_busy_wait(); \ boot_page_fill(address, data); \ } while (0) /** \ingroup avr_boot Same as boot_page_erase() except it waits for eeprom and spm operations to complete before erasing the page. */ #define boot_page_erase_safe(address) \ do { \ boot_spm_busy_wait(); \ eeprom_busy_wait(); \ boot_page_erase (address); \ } while (0) /** \ingroup avr_boot Same as boot_page_write() except it waits for eeprom and spm operations to complete before writing the page. */ #define boot_page_write_safe(address) \ do { \ boot_spm_busy_wait(); \ eeprom_busy_wait(); \ boot_page_write (address); \ } while (0) /** \ingroup avr_boot Same as boot_rww_enable() except waits for eeprom and spm operations to complete before enabling the RWW mameory. */ #define boot_rww_enable_safe() \ do { \ boot_spm_busy_wait(); \ eeprom_busy_wait(); \ boot_rww_enable(); \ } while (0) /** \ingroup avr_boot Same as boot_lock_bits_set() except waits for eeprom and spm operations to complete before setting the lock bits. */ #define boot_lock_bits_set_safe(lock_bits) \ do { \ boot_spm_busy_wait(); \ eeprom_busy_wait(); \ boot_lock_bits_set (lock_bits); \ } while (0) #endif /* _AVR_BOOT_H_ */ ================================================ FILE: external/arduino/avr/bootloaders/optiboot/makeall ================================================ #!/bin/bash make clean # # The "big three" standard bootloaders. make atmega8 make atmega168 make atmega328 # # additional buildable platforms of # somewhat questionable support level make lilypad make lilypad_resonator make pro8 make pro16 make pro20 make atmega328_pro8 make sanguino make mega make atmega88 make luminet ================================================ FILE: external/arduino/avr/bootloaders/optiboot/omake ================================================ echo ../../../tools/avr/bin/make OS=macosx ENV=arduino $* ../../../tools/avr/bin/make OS=macosx ENV=arduino $* ================================================ FILE: external/arduino/avr/bootloaders/optiboot/omake.bat ================================================ ..\..\..\tools\avr\utils\bin\make OS=windows ENV=arduino %* ================================================ FILE: external/arduino/avr/bootloaders/optiboot/optiboot.c ================================================ /**********************************************************/ /* Optiboot bootloader for Arduino */ /* */ /* http://optiboot.googlecode.com */ /* */ /* Arduino-maintained version : See README.TXT */ /* http://code.google.com/p/arduino/ */ /* */ /* Heavily optimised bootloader that is faster and */ /* smaller than the Arduino standard bootloader */ /* */ /* Enhancements: */ /* Fits in 512 bytes, saving 1.5K of code space */ /* Background page erasing speeds up programming */ /* Higher baud rate speeds up programming */ /* Written almost entirely in C */ /* Customisable timeout with accurate timeconstant */ /* Optional virtual UART. No hardware UART required. */ /* Optional virtual boot partition for devices without. */ /* */ /* What you lose: */ /* Implements a skeleton STK500 protocol which is */ /* missing several features including EEPROM */ /* programming and non-page-aligned writes */ /* High baud rate breaks compatibility with standard */ /* Arduino flash settings */ /* */ /* Fully supported: */ /* ATmega168 based devices (Diecimila etc) */ /* ATmega328P based devices (Duemilanove etc) */ /* */ /* Alpha test */ /* ATmega1280 based devices (Arduino Mega) */ /* */ /* Work in progress: */ /* ATmega644P based devices (Sanguino) */ /* ATtiny84 based devices (Luminet) */ /* */ /* Does not support: */ /* USB based devices (eg. Teensy) */ /* */ /* Assumptions: */ /* The code makes several assumptions that reduce the */ /* code size. They are all true after a hardware reset, */ /* but may not be true if the bootloader is called by */ /* other means or on other hardware. */ /* No interrupts can occur */ /* UART and Timer 1 are set to their reset state */ /* SP points to RAMEND */ /* */ /* Code builds on code, libraries and optimisations from: */ /* stk500boot.c by Jason P. Kyle */ /* Arduino bootloader http://www.arduino.cc */ /* Spiff's 1K bootloader http://spiffie.org/know/arduino_1k_bootloader/bootloader.shtml */ /* avr-libc project http://nongnu.org/avr-libc */ /* Adaboot http://www.ladyada.net/library/arduino/bootloader.html */ /* AVR305 Atmel Application Note */ /* */ /* This program is free software; you can redistribute it */ /* and/or modify it under the terms of the GNU General */ /* Public License as published by the Free Software */ /* Foundation; either version 2 of the License, or */ /* (at your option) any later version. */ /* */ /* This program is distributed in the hope that it will */ /* be useful, but WITHOUT ANY WARRANTY; without even the */ /* implied warranty of MERCHANTABILITY or FITNESS FOR A */ /* PARTICULAR PURPOSE. See the GNU General Public */ /* License for more details. */ /* */ /* You should have received a copy of the GNU General */ /* Public License along with this program; if not, write */ /* to the Free Software Foundation, Inc., */ /* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* */ /* Licence can be viewed at */ /* http://www.fsf.org/licenses/gpl.txt */ /* */ /**********************************************************/ /**********************************************************/ /* */ /* Optional defines: */ /* */ /**********************************************************/ /* */ /* BIG_BOOT: */ /* Build a 1k bootloader, not 512 bytes. This turns on */ /* extra functionality. */ /* */ /* BAUD_RATE: */ /* Set bootloader baud rate. */ /* */ /* LUDICROUS_SPEED: */ /* 230400 baud :-) */ /* */ /* SOFT_UART: */ /* Use AVR305 soft-UART instead of hardware UART. */ /* */ /* LED_START_FLASHES: */ /* Number of LED flashes on bootup. */ /* */ /* LED_DATA_FLASH: */ /* Flash LED when transferring data. For boards without */ /* TX or RX LEDs, or for people who like blinky lights. */ /* */ /* SUPPORT_EEPROM: */ /* Support reading and writing from EEPROM. This is not */ /* used by Arduino, so off by default. */ /* */ /* TIMEOUT_MS: */ /* Bootloader timeout period, in milliseconds. */ /* 500,1000,2000,4000,8000 supported. */ /* */ /**********************************************************/ /**********************************************************/ /* Version Numbers! */ /* */ /* Arduino Optiboot now includes this Version number in */ /* the source and object code. */ /* */ /* Version 3 was released as zip from the optiboot */ /* repository and was distributed with Arduino 0022. */ /* Version 4 starts with the arduino repository commit */ /* that brought the arduino repository up-to-date with */ /* the optiboot source tree changes since v3. */ /* */ /**********************************************************/ /**********************************************************/ /* Edit History: */ /* */ /* 4.4 WestfW: add initialization of address to keep */ /* the compiler happy. Change SC'ed targets. */ /* Return the SW version via READ PARAM */ /* 4.3 WestfW: catch framing errors in getch(), so that */ /* AVRISP works without HW kludges. */ /* http://code.google.com/p/arduino/issues/detail?id=368n*/ /* 4.2 WestfW: reduce code size, fix timeouts, change */ /* verifySpace to use WDT instead of appstart */ /* 4.1 WestfW: put version number in binary. */ /**********************************************************/ #define OPTIBOOT_MAJVER 4 #define OPTIBOOT_MINVER 4 #define MAKESTR(a) #a #define MAKEVER(a, b) MAKESTR(a*256+b) asm(" .section .version\n" "optiboot_version: .word " MAKEVER(OPTIBOOT_MAJVER, OPTIBOOT_MINVER) "\n" " .section .text\n"); #include #include #include // uses sts instructions, but this version uses out instructions // This saves cycles and program memory. #include "boot.h" // We don't use as those routines have interrupt overhead we don't need. #include "pin_defs.h" #include "stk500.h" #ifndef LED_START_FLASHES #define LED_START_FLASHES 0 #endif #ifdef LUDICROUS_SPEED #define BAUD_RATE 230400L #endif /* set the UART baud rate defaults */ #ifndef BAUD_RATE #if F_CPU >= 8000000L #define BAUD_RATE 115200L // Highest rate Avrdude win32 will support #elsif F_CPU >= 1000000L #define BAUD_RATE 9600L // 19200 also supported, but with significant error #elsif F_CPU >= 128000L #define BAUD_RATE 4800L // Good for 128kHz internal RC #else #define BAUD_RATE 1200L // Good even at 32768Hz #endif #endif /* Switch in soft UART for hard baud rates */ #if (F_CPU/BAUD_RATE) > 280 // > 57600 for 16MHz #ifndef SOFT_UART #define SOFT_UART #endif #endif /* Watchdog settings */ #define WATCHDOG_OFF (0) #define WATCHDOG_16MS (_BV(WDE)) #define WATCHDOG_32MS (_BV(WDP0) | _BV(WDE)) #define WATCHDOG_64MS (_BV(WDP1) | _BV(WDE)) #define WATCHDOG_125MS (_BV(WDP1) | _BV(WDP0) | _BV(WDE)) #define WATCHDOG_250MS (_BV(WDP2) | _BV(WDE)) #define WATCHDOG_500MS (_BV(WDP2) | _BV(WDP0) | _BV(WDE)) #define WATCHDOG_1S (_BV(WDP2) | _BV(WDP1) | _BV(WDE)) #define WATCHDOG_2S (_BV(WDP2) | _BV(WDP1) | _BV(WDP0) | _BV(WDE)) #ifndef __AVR_ATmega8__ #define WATCHDOG_4S (_BV(WDP3) | _BV(WDE)) #define WATCHDOG_8S (_BV(WDP3) | _BV(WDP0) | _BV(WDE)) #endif /* Function Prototypes */ /* The main function is in init9, which removes the interrupt vector table */ /* we don't need. It is also 'naked', which means the compiler does not */ /* generate any entry or exit code itself. */ int main(void) __attribute__ ((naked)) __attribute__ ((section (".init9"))); void putch(char); uint8_t getch(void); static inline void getNch(uint8_t); /* "static inline" is a compiler hint to reduce code size */ void verifySpace(); static inline void flash_led(uint8_t); uint8_t getLen(); static inline void watchdogReset(); void watchdogConfig(uint8_t x); #ifdef SOFT_UART void uartDelay() __attribute__ ((naked)); #endif void appStart() __attribute__ ((naked)); #if defined(__AVR_ATmega168__) #define RAMSTART (0x100) #define NRWWSTART (0x3800) #elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) #define RAMSTART (0x100) #define NRWWSTART (0x7000) #elif defined (__AVR_ATmega644P__) #define RAMSTART (0x100) #define NRWWSTART (0xE000) #elif defined(__AVR_ATtiny84__) #define RAMSTART (0x100) #define NRWWSTART (0x0000) #elif defined(__AVR_ATmega1280__) #define RAMSTART (0x200) #define NRWWSTART (0xE000) #elif defined(__AVR_ATmega8__) || defined(__AVR_ATmega88__) #define RAMSTART (0x100) #define NRWWSTART (0x1800) #endif /* C zero initialises all global variables. However, that requires */ /* These definitions are NOT zero initialised, but that doesn't matter */ /* This allows us to drop the zero init code, saving us memory */ #define buff ((uint8_t*)(RAMSTART)) #ifdef VIRTUAL_BOOT_PARTITION #define rstVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+4)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #endif /* main program starts here */ int main(void) { uint8_t ch; /* * Making these local and in registers prevents the need for initializing * them, and also saves space because code no longer stores to memory. * (initializing address keeps the compiler happy, but isn't really * necessary, and uses 4 bytes of flash.) */ register uint16_t address = 0; register uint8_t length; // After the zero init loop, this is the first code to run. // // This code makes the following assumptions: // No interrupts will execute // SP points to RAMEND // r1 contains zero // // If not, uncomment the following instructions: // cli(); asm volatile ("clr __zero_reg__"); #ifdef __AVR_ATmega8__ SP=RAMEND; // This is done by hardware reset #endif // Adaboot no-wait mod ch = MCUSR; MCUSR = 0; if (!(ch & _BV(EXTRF))) appStart(); #if LED_START_FLASHES > 0 // Set up Timer 1 for timeout counter TCCR1B = _BV(CS12) | _BV(CS10); // div 1024 #endif #ifndef SOFT_UART #ifdef __AVR_ATmega8__ UCSRA = _BV(U2X); //Double speed mode USART UCSRB = _BV(RXEN) | _BV(TXEN); // enable Rx & Tx UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); // config USART; 8N1 UBRRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); #else UCSR0A = _BV(U2X0); //Double speed mode USART0 UCSR0B = _BV(RXEN0) | _BV(TXEN0); UCSR0C = _BV(UCSZ00) | _BV(UCSZ01); UBRR0L = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); #endif #endif // Set up watchdog to trigger after 500ms watchdogConfig(WATCHDOG_1S); /* Set LED pin as output */ LED_DDR |= _BV(LED); #ifdef SOFT_UART /* Set TX pin as output */ UART_DDR |= _BV(UART_TX_BIT); #endif #if LED_START_FLASHES > 0 /* Flash onboard LED to signal entering of bootloader */ flash_led(LED_START_FLASHES * 2); #endif /* Forever loop */ for (;;) { /* get character from UART */ ch = getch(); if(ch == STK_GET_PARAMETER) { unsigned char which = getch(); verifySpace(); if (which == 0x82) { /* * Send optiboot version as "minor SW version" */ putch(OPTIBOOT_MINVER); } else if (which == 0x81) { putch(OPTIBOOT_MAJVER); } else { /* * GET PARAMETER returns a generic 0x03 reply for * other parameters - enough to keep Avrdude happy */ putch(0x03); } } else if(ch == STK_SET_DEVICE) { // SET DEVICE is ignored getNch(20); } else if(ch == STK_SET_DEVICE_EXT) { // SET DEVICE EXT is ignored getNch(5); } else if(ch == STK_LOAD_ADDRESS) { // LOAD ADDRESS uint16_t newAddress; newAddress = getch(); newAddress = (newAddress & 0xff) | (getch() << 8); #ifdef RAMPZ // Transfer top bit to RAMPZ RAMPZ = (newAddress & 0x8000) ? 1 : 0; #endif newAddress += newAddress; // Convert from word address to byte address address = newAddress; verifySpace(); } else if(ch == STK_UNIVERSAL) { // UNIVERSAL command is ignored getNch(4); putch(0x00); } /* Write memory, length is big endian and is in bytes */ else if(ch == STK_PROG_PAGE) { // PROGRAM PAGE - we support flash programming only, not EEPROM uint8_t *bufPtr; uint16_t addrPtr; getch(); /* getlen() */ length = getch(); getch(); // If we are in RWW section, immediately start page erase if (address < NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); // While that is going on, read in page contents bufPtr = buff; do *bufPtr++ = getch(); while (--length); // If we are in NRWW section, page erase has to be delayed until now. // Todo: Take RAMPZ into account if (address >= NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); // Read command terminator, start reply verifySpace(); // If only a partial page is to be programmed, the erase might not be complete. // So check that here boot_spm_busy_wait(); #ifdef VIRTUAL_BOOT_PARTITION if ((uint16_t)(void*)address == 0) { // This is the reset vector page. We need to live-patch the code so the // bootloader runs. // // Move RESET vector to WDT vector uint16_t vect = buff[0] | (buff[1]<<8); rstVect = vect; wdtVect = buff[8] | (buff[9]<<8); vect -= 4; // Instruction is a relative jump (rjmp), so recalculate. buff[8] = vect & 0xff; buff[9] = vect >> 8; // Add jump to bootloader at RESET vector buff[0] = 0x7f; buff[1] = 0xce; // rjmp 0x1d00 instruction } #endif // Copy buffer into programming buffer bufPtr = buff; addrPtr = (uint16_t)(void*)address; ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; a |= (*bufPtr++) << 8; __boot_page_fill_short((uint16_t)(void*)addrPtr,a); addrPtr += 2; } while (--ch); // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); boot_spm_busy_wait(); #if defined(RWWSRE) // Reenable read access to flash boot_rww_enable(); #endif } /* Read memory block mode, length is big endian. */ else if(ch == STK_READ_PAGE) { // READ PAGE - we only read flash getch(); /* getlen() */ length = getch(); getch(); verifySpace(); #ifdef VIRTUAL_BOOT_PARTITION do { // Undo vector patch in bottom page so verify passes if (address == 0) ch=rstVect & 0xff; else if (address == 1) ch=rstVect >> 8; else if (address == 8) ch=wdtVect & 0xff; else if (address == 9) ch=wdtVect >> 8; else ch = pgm_read_byte_near(address); address++; putch(ch); } while (--length); #else #ifdef __AVR_ATmega1280__ // do putch(pgm_read_byte_near(address++)); // while (--length); do { uint8_t result; __asm__ ("elpm %0,Z\n":"=r"(result):"z"(address)); putch(result); address++; } while (--length); #else do putch(pgm_read_byte_near(address++)); while (--length); #endif #endif } /* Get device signature bytes */ else if(ch == STK_READ_SIGN) { // READ SIGN - return what Avrdude wants to hear verifySpace(); putch(SIGNATURE_0); putch(SIGNATURE_1); putch(SIGNATURE_2); } else if (ch == 'Q') { // Adaboot no-wait mod watchdogConfig(WATCHDOG_16MS); verifySpace(); } else { // This covers the response to commands like STK_ENTER_PROGMODE verifySpace(); } putch(STK_OK); } } void putch(char ch) { #ifndef SOFT_UART while (!(UCSR0A & _BV(UDRE0))); UDR0 = ch; #else __asm__ __volatile__ ( " com %[ch]\n" // ones complement, carry set " sec\n" "1: brcc 2f\n" " cbi %[uartPort],%[uartBit]\n" " rjmp 3f\n" "2: sbi %[uartPort],%[uartBit]\n" " nop\n" "3: rcall uartDelay\n" " rcall uartDelay\n" " lsr %[ch]\n" " dec %[bitcnt]\n" " brne 1b\n" : : [bitcnt] "d" (10), [ch] "r" (ch), [uartPort] "I" (_SFR_IO_ADDR(UART_PORT)), [uartBit] "I" (UART_TX_BIT) : "r25" ); #endif } uint8_t getch(void) { uint8_t ch; #ifdef LED_DATA_FLASH #ifdef __AVR_ATmega8__ LED_PORT ^= _BV(LED); #else LED_PIN |= _BV(LED); #endif #endif #ifdef SOFT_UART __asm__ __volatile__ ( "1: sbic %[uartPin],%[uartBit]\n" // Wait for start edge " rjmp 1b\n" " rcall uartDelay\n" // Get to middle of start bit "2: rcall uartDelay\n" // Wait 1 bit period " rcall uartDelay\n" // Wait 1 bit period " clc\n" " sbic %[uartPin],%[uartBit]\n" " sec\n" " dec %[bitCnt]\n" " breq 3f\n" " ror %[ch]\n" " rjmp 2b\n" "3:\n" : [ch] "=r" (ch) : [bitCnt] "d" (9), [uartPin] "I" (_SFR_IO_ADDR(UART_PIN)), [uartBit] "I" (UART_RX_BIT) : "r25" ); #else while(!(UCSR0A & _BV(RXC0))) ; if (!(UCSR0A & _BV(FE0))) { /* * A Framing Error indicates (probably) that something is talking * to us at the wrong bit rate. Assume that this is because it * expects to be talking to the application, and DON'T reset the * watchdog. This should cause the bootloader to abort and run * the application "soon", if it keeps happening. (Note that we * don't care that an invalid char is returned...) */ watchdogReset(); } ch = UDR0; #endif #ifdef LED_DATA_FLASH #ifdef __AVR_ATmega8__ LED_PORT ^= _BV(LED); #else LED_PIN |= _BV(LED); #endif #endif return ch; } #ifdef SOFT_UART // AVR350 equation: #define UART_B_VALUE (((F_CPU/BAUD_RATE)-23)/6) // Adding 3 to numerator simulates nearest rounding for more accurate baud rates #define UART_B_VALUE (((F_CPU/BAUD_RATE)-20)/6) #if UART_B_VALUE > 255 #error Baud rate too slow for soft UART #endif void uartDelay() { __asm__ __volatile__ ( "ldi r25,%[count]\n" "1:dec r25\n" "brne 1b\n" "ret\n" ::[count] "M" (UART_B_VALUE) ); } #endif void getNch(uint8_t count) { do getch(); while (--count); verifySpace(); } void verifySpace() { if (getch() != CRC_EOP) { watchdogConfig(WATCHDOG_16MS); // shorten WD timeout while (1) // and busy-loop so that WD causes ; // a reset and app start. } putch(STK_INSYNC); } #if LED_START_FLASHES > 0 void flash_led(uint8_t count) { do { TCNT1 = -(F_CPU/(1024*16)); TIFR1 = _BV(TOV1); while(!(TIFR1 & _BV(TOV1))); #ifdef __AVR_ATmega8__ LED_PORT ^= _BV(LED); #else LED_PIN |= _BV(LED); #endif watchdogReset(); } while (--count); } #endif // Watchdog functions. These are only safe with interrupts turned off. void watchdogReset() { __asm__ __volatile__ ( "wdr\n" ); } void watchdogConfig(uint8_t x) { WDTCSR = _BV(WDCE) | _BV(WDE); WDTCSR = x; } void appStart() { watchdogConfig(WATCHDOG_OFF); __asm__ __volatile__ ( #ifdef VIRTUAL_BOOT_PARTITION // Jump to WDT vector "ldi r30,4\n" "clr r31\n" #else // Jump to RST vector "clr r30\n" "clr r31\n" #endif "ijmp\n" ); } ================================================ FILE: external/arduino/avr/bootloaders/optiboot/optiboot_atmega168.hex ================================================ :103E0000112484B714BE81FFF0D085E08093810037 :103E100082E08093C00088E18093C10086E08093B7 :103E2000C20080E18093C4008EE0C9D0259A86E06C :103E300020E33CEF91E0309385002093840096BB13 :103E4000B09BFECF1D9AA8958150A9F7CC24DD2404 :103E500088248394B5E0AB2EA1E19A2EF3E0BF2E27 :103E6000A2D0813461F49FD0082FAFD0023811F076 :103E7000013811F484E001C083E08DD089C0823420 :103E800011F484E103C0853419F485E0A6D080C024 :103E9000853579F488D0E82EFF2485D0082F10E0EE :103EA000102F00270E291F29000F111F8ED0680127 :103EB0006FC0863521F484E090D080E0DECF843678 :103EC00009F040C070D06FD0082F6DD080E0C816C8 :103ED00088E3D80618F4F601B7BEE895C0E0D1E053 :103EE00062D089930C17E1F7F0E0CF16F8E3DF0614 :103EF00018F0F601B7BEE89568D007B600FCFDCF14 :103F0000A601A0E0B1E02C9130E011968C911197C0 :103F100090E0982F8827822B932B1296FA010C01A0 :103F200087BEE89511244E5F5F4FF1E0A038BF07D0 :103F300051F7F601A7BEE89507B600FCFDCF97BE86 :103F4000E89526C08437B1F42ED02DD0F82E2BD092 :103F50003CD0F601EF2C8F010F5F1F4F84911BD0D7 :103F6000EA94F801C1F70894C11CD11CFA94CF0C53 :103F7000D11C0EC0853739F428D08EE10CD084E9ED :103F80000AD086E07ACF813511F488E018D01DD0B0 :103F900080E101D065CF982F8091C00085FFFCCFD4 :103FA0009093C60008958091C00087FFFCCF809158 :103FB000C00084FD01C0A8958091C6000895E0E688 :103FC000F0E098E1908380830895EDDF803219F06E :103FD00088E0F5DFFFCF84E1DECF1F93182FE3DF0A :103FE0001150E9F7F2DF1F91089580E0E8DFEE2736 :043FF000FF2709940A :023FFE000404B9 :0400000300003E00BB :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/optiboot/optiboot_atmega168.lst ================================================ optiboot_atmega168.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn 0 .text 000001f4 00003e00 00003e00 00000054 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE 1 .version 00000002 00003ffe 00003ffe 00000248 2**0 CONTENTS, READONLY 2 .debug_aranges 00000028 00000000 00000000 0000024a 2**0 CONTENTS, READONLY, DEBUGGING 3 .debug_pubnames 0000005f 00000000 00000000 00000272 2**0 CONTENTS, READONLY, DEBUGGING 4 .debug_info 000002a8 00000000 00000000 000002d1 2**0 CONTENTS, READONLY, DEBUGGING 5 .debug_abbrev 00000178 00000000 00000000 00000579 2**0 CONTENTS, READONLY, DEBUGGING 6 .debug_line 00000488 00000000 00000000 000006f1 2**0 CONTENTS, READONLY, DEBUGGING 7 .debug_frame 00000080 00000000 00000000 00000b7c 2**2 CONTENTS, READONLY, DEBUGGING 8 .debug_str 0000014f 00000000 00000000 00000bfc 2**0 CONTENTS, READONLY, DEBUGGING 9 .debug_loc 000002d8 00000000 00000000 00000d4b 2**0 CONTENTS, READONLY, DEBUGGING 10 .debug_ranges 00000078 00000000 00000000 00001023 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: 00003e00
: #define rstVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+4)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #endif /* main program starts here */ int main(void) { 3e00: 11 24 eor r1, r1 #ifdef __AVR_ATmega8__ SP=RAMEND; // This is done by hardware reset #endif // Adaboot no-wait mod ch = MCUSR; 3e02: 84 b7 in r24, 0x34 ; 52 MCUSR = 0; 3e04: 14 be out 0x34, r1 ; 52 if (!(ch & _BV(EXTRF))) appStart(); 3e06: 81 ff sbrs r24, 1 3e08: f0 d0 rcall .+480 ; 0x3fea #if LED_START_FLASHES > 0 // Set up Timer 1 for timeout counter TCCR1B = _BV(CS12) | _BV(CS10); // div 1024 3e0a: 85 e0 ldi r24, 0x05 ; 5 3e0c: 80 93 81 00 sts 0x0081, r24 UCSRA = _BV(U2X); //Double speed mode USART UCSRB = _BV(RXEN) | _BV(TXEN); // enable Rx & Tx UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); // config USART; 8N1 UBRRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); #else UCSR0A = _BV(U2X0); //Double speed mode USART0 3e10: 82 e0 ldi r24, 0x02 ; 2 3e12: 80 93 c0 00 sts 0x00C0, r24 UCSR0B = _BV(RXEN0) | _BV(TXEN0); 3e16: 88 e1 ldi r24, 0x18 ; 24 3e18: 80 93 c1 00 sts 0x00C1, r24 UCSR0C = _BV(UCSZ00) | _BV(UCSZ01); 3e1c: 86 e0 ldi r24, 0x06 ; 6 3e1e: 80 93 c2 00 sts 0x00C2, r24 UBRR0L = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); 3e22: 80 e1 ldi r24, 0x10 ; 16 3e24: 80 93 c4 00 sts 0x00C4, r24 #endif #endif // Set up watchdog to trigger after 500ms watchdogConfig(WATCHDOG_1S); 3e28: 8e e0 ldi r24, 0x0E ; 14 3e2a: c9 d0 rcall .+402 ; 0x3fbe /* Set LED pin as output */ LED_DDR |= _BV(LED); 3e2c: 25 9a sbi 0x04, 5 ; 4 3e2e: 86 e0 ldi r24, 0x06 ; 6 } #if LED_START_FLASHES > 0 void flash_led(uint8_t count) { do { TCNT1 = -(F_CPU/(1024*16)); 3e30: 20 e3 ldi r18, 0x30 ; 48 3e32: 3c ef ldi r19, 0xFC ; 252 TIFR1 = _BV(TOV1); 3e34: 91 e0 ldi r25, 0x01 ; 1 } #if LED_START_FLASHES > 0 void flash_led(uint8_t count) { do { TCNT1 = -(F_CPU/(1024*16)); 3e36: 30 93 85 00 sts 0x0085, r19 3e3a: 20 93 84 00 sts 0x0084, r18 TIFR1 = _BV(TOV1); 3e3e: 96 bb out 0x16, r25 ; 22 while(!(TIFR1 & _BV(TOV1))); 3e40: b0 9b sbis 0x16, 0 ; 22 3e42: fe cf rjmp .-4 ; 0x3e40 #ifdef __AVR_ATmega8__ LED_PORT ^= _BV(LED); #else LED_PIN |= _BV(LED); 3e44: 1d 9a sbi 0x03, 5 ; 3 } #endif // Watchdog functions. These are only safe with interrupts turned off. void watchdogReset() { __asm__ __volatile__ ( 3e46: a8 95 wdr LED_PORT ^= _BV(LED); #else LED_PIN |= _BV(LED); #endif watchdogReset(); } while (--count); 3e48: 81 50 subi r24, 0x01 ; 1 3e4a: a9 f7 brne .-22 ; 0x3e36 3e4c: cc 24 eor r12, r12 3e4e: dd 24 eor r13, r13 ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; a |= (*bufPtr++) << 8; __boot_page_fill_short((uint16_t)(void*)addrPtr,a); 3e50: 88 24 eor r8, r8 3e52: 83 94 inc r8 addrPtr += 2; } while (--ch); // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); 3e54: b5 e0 ldi r27, 0x05 ; 5 3e56: ab 2e mov r10, r27 boot_spm_busy_wait(); #if defined(RWWSRE) // Reenable read access to flash boot_rww_enable(); 3e58: a1 e1 ldi r26, 0x11 ; 17 3e5a: 9a 2e mov r9, r26 do *bufPtr++ = getch(); while (--length); // If we are in NRWW section, page erase has to be delayed until now. // Todo: Take RAMPZ into account if (address >= NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); 3e5c: f3 e0 ldi r31, 0x03 ; 3 3e5e: bf 2e mov r11, r31 #endif /* Forever loop */ for (;;) { /* get character from UART */ ch = getch(); 3e60: a2 d0 rcall .+324 ; 0x3fa6 if(ch == STK_GET_PARAMETER) { 3e62: 81 34 cpi r24, 0x41 ; 65 3e64: 61 f4 brne .+24 ; 0x3e7e unsigned char which = getch(); 3e66: 9f d0 rcall .+318 ; 0x3fa6 3e68: 08 2f mov r16, r24 verifySpace(); 3e6a: af d0 rcall .+350 ; 0x3fca if (which == 0x82) { 3e6c: 02 38 cpi r16, 0x82 ; 130 3e6e: 11 f0 breq .+4 ; 0x3e74 /* * Send optiboot version as "minor SW version" */ putch(OPTIBOOT_MINVER); } else if (which == 0x81) { 3e70: 01 38 cpi r16, 0x81 ; 129 3e72: 11 f4 brne .+4 ; 0x3e78 putch(OPTIBOOT_MAJVER); 3e74: 84 e0 ldi r24, 0x04 ; 4 3e76: 01 c0 rjmp .+2 ; 0x3e7a } else { /* * GET PARAMETER returns a generic 0x03 reply for * other parameters - enough to keep Avrdude happy */ putch(0x03); 3e78: 83 e0 ldi r24, 0x03 ; 3 3e7a: 8d d0 rcall .+282 ; 0x3f96 3e7c: 89 c0 rjmp .+274 ; 0x3f90 } } else if(ch == STK_SET_DEVICE) { 3e7e: 82 34 cpi r24, 0x42 ; 66 3e80: 11 f4 brne .+4 ; 0x3e86 // SET DEVICE is ignored getNch(20); 3e82: 84 e1 ldi r24, 0x14 ; 20 3e84: 03 c0 rjmp .+6 ; 0x3e8c } else if(ch == STK_SET_DEVICE_EXT) { 3e86: 85 34 cpi r24, 0x45 ; 69 3e88: 19 f4 brne .+6 ; 0x3e90 // SET DEVICE EXT is ignored getNch(5); 3e8a: 85 e0 ldi r24, 0x05 ; 5 3e8c: a6 d0 rcall .+332 ; 0x3fda 3e8e: 80 c0 rjmp .+256 ; 0x3f90 } else if(ch == STK_LOAD_ADDRESS) { 3e90: 85 35 cpi r24, 0x55 ; 85 3e92: 79 f4 brne .+30 ; 0x3eb2 // LOAD ADDRESS uint16_t newAddress; newAddress = getch(); 3e94: 88 d0 rcall .+272 ; 0x3fa6 newAddress = (newAddress & 0xff) | (getch() << 8); 3e96: e8 2e mov r14, r24 3e98: ff 24 eor r15, r15 3e9a: 85 d0 rcall .+266 ; 0x3fa6 3e9c: 08 2f mov r16, r24 3e9e: 10 e0 ldi r17, 0x00 ; 0 3ea0: 10 2f mov r17, r16 3ea2: 00 27 eor r16, r16 3ea4: 0e 29 or r16, r14 3ea6: 1f 29 or r17, r15 #ifdef RAMPZ // Transfer top bit to RAMPZ RAMPZ = (newAddress & 0x8000) ? 1 : 0; #endif newAddress += newAddress; // Convert from word address to byte address 3ea8: 00 0f add r16, r16 3eaa: 11 1f adc r17, r17 address = newAddress; verifySpace(); 3eac: 8e d0 rcall .+284 ; 0x3fca 3eae: 68 01 movw r12, r16 3eb0: 6f c0 rjmp .+222 ; 0x3f90 } else if(ch == STK_UNIVERSAL) { 3eb2: 86 35 cpi r24, 0x56 ; 86 3eb4: 21 f4 brne .+8 ; 0x3ebe // UNIVERSAL command is ignored getNch(4); 3eb6: 84 e0 ldi r24, 0x04 ; 4 3eb8: 90 d0 rcall .+288 ; 0x3fda putch(0x00); 3eba: 80 e0 ldi r24, 0x00 ; 0 3ebc: de cf rjmp .-68 ; 0x3e7a } /* Write memory, length is big endian and is in bytes */ else if(ch == STK_PROG_PAGE) { 3ebe: 84 36 cpi r24, 0x64 ; 100 3ec0: 09 f0 breq .+2 ; 0x3ec4 3ec2: 40 c0 rjmp .+128 ; 0x3f44 // PROGRAM PAGE - we support flash programming only, not EEPROM uint8_t *bufPtr; uint16_t addrPtr; getch(); /* getlen() */ 3ec4: 70 d0 rcall .+224 ; 0x3fa6 length = getch(); 3ec6: 6f d0 rcall .+222 ; 0x3fa6 3ec8: 08 2f mov r16, r24 getch(); 3eca: 6d d0 rcall .+218 ; 0x3fa6 // If we are in RWW section, immediately start page erase if (address < NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); 3ecc: 80 e0 ldi r24, 0x00 ; 0 3ece: c8 16 cp r12, r24 3ed0: 88 e3 ldi r24, 0x38 ; 56 3ed2: d8 06 cpc r13, r24 3ed4: 18 f4 brcc .+6 ; 0x3edc 3ed6: f6 01 movw r30, r12 3ed8: b7 be out 0x37, r11 ; 55 3eda: e8 95 spm 3edc: c0 e0 ldi r28, 0x00 ; 0 3ede: d1 e0 ldi r29, 0x01 ; 1 // While that is going on, read in page contents bufPtr = buff; do *bufPtr++ = getch(); 3ee0: 62 d0 rcall .+196 ; 0x3fa6 3ee2: 89 93 st Y+, r24 while (--length); 3ee4: 0c 17 cp r16, r28 3ee6: e1 f7 brne .-8 ; 0x3ee0 // If we are in NRWW section, page erase has to be delayed until now. // Todo: Take RAMPZ into account if (address >= NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); 3ee8: f0 e0 ldi r31, 0x00 ; 0 3eea: cf 16 cp r12, r31 3eec: f8 e3 ldi r31, 0x38 ; 56 3eee: df 06 cpc r13, r31 3ef0: 18 f0 brcs .+6 ; 0x3ef8 3ef2: f6 01 movw r30, r12 3ef4: b7 be out 0x37, r11 ; 55 3ef6: e8 95 spm // Read command terminator, start reply verifySpace(); 3ef8: 68 d0 rcall .+208 ; 0x3fca // If only a partial page is to be programmed, the erase might not be complete. // So check that here boot_spm_busy_wait(); 3efa: 07 b6 in r0, 0x37 ; 55 3efc: 00 fc sbrc r0, 0 3efe: fd cf rjmp .-6 ; 0x3efa 3f00: a6 01 movw r20, r12 3f02: a0 e0 ldi r26, 0x00 ; 0 3f04: b1 e0 ldi r27, 0x01 ; 1 bufPtr = buff; addrPtr = (uint16_t)(void*)address; ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; 3f06: 2c 91 ld r18, X 3f08: 30 e0 ldi r19, 0x00 ; 0 a |= (*bufPtr++) << 8; 3f0a: 11 96 adiw r26, 0x01 ; 1 3f0c: 8c 91 ld r24, X 3f0e: 11 97 sbiw r26, 0x01 ; 1 3f10: 90 e0 ldi r25, 0x00 ; 0 3f12: 98 2f mov r25, r24 3f14: 88 27 eor r24, r24 3f16: 82 2b or r24, r18 3f18: 93 2b or r25, r19 #define rstVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+4)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #endif /* main program starts here */ int main(void) { 3f1a: 12 96 adiw r26, 0x02 ; 2 ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; a |= (*bufPtr++) << 8; __boot_page_fill_short((uint16_t)(void*)addrPtr,a); 3f1c: fa 01 movw r30, r20 3f1e: 0c 01 movw r0, r24 3f20: 87 be out 0x37, r8 ; 55 3f22: e8 95 spm 3f24: 11 24 eor r1, r1 addrPtr += 2; 3f26: 4e 5f subi r20, 0xFE ; 254 3f28: 5f 4f sbci r21, 0xFF ; 255 } while (--ch); 3f2a: f1 e0 ldi r31, 0x01 ; 1 3f2c: a0 38 cpi r26, 0x80 ; 128 3f2e: bf 07 cpc r27, r31 3f30: 51 f7 brne .-44 ; 0x3f06 // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); 3f32: f6 01 movw r30, r12 3f34: a7 be out 0x37, r10 ; 55 3f36: e8 95 spm boot_spm_busy_wait(); 3f38: 07 b6 in r0, 0x37 ; 55 3f3a: 00 fc sbrc r0, 0 3f3c: fd cf rjmp .-6 ; 0x3f38 #if defined(RWWSRE) // Reenable read access to flash boot_rww_enable(); 3f3e: 97 be out 0x37, r9 ; 55 3f40: e8 95 spm 3f42: 26 c0 rjmp .+76 ; 0x3f90 #endif } /* Read memory block mode, length is big endian. */ else if(ch == STK_READ_PAGE) { 3f44: 84 37 cpi r24, 0x74 ; 116 3f46: b1 f4 brne .+44 ; 0x3f74 // READ PAGE - we only read flash getch(); /* getlen() */ 3f48: 2e d0 rcall .+92 ; 0x3fa6 length = getch(); 3f4a: 2d d0 rcall .+90 ; 0x3fa6 3f4c: f8 2e mov r15, r24 getch(); 3f4e: 2b d0 rcall .+86 ; 0x3fa6 verifySpace(); 3f50: 3c d0 rcall .+120 ; 0x3fca 3f52: f6 01 movw r30, r12 3f54: ef 2c mov r14, r15 putch(result); address++; } while (--length); #else do putch(pgm_read_byte_near(address++)); 3f56: 8f 01 movw r16, r30 3f58: 0f 5f subi r16, 0xFF ; 255 3f5a: 1f 4f sbci r17, 0xFF ; 255 3f5c: 84 91 lpm r24, Z+ 3f5e: 1b d0 rcall .+54 ; 0x3f96 while (--length); 3f60: ea 94 dec r14 3f62: f8 01 movw r30, r16 3f64: c1 f7 brne .-16 ; 0x3f56 #define rstVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+4)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #endif /* main program starts here */ int main(void) { 3f66: 08 94 sec 3f68: c1 1c adc r12, r1 3f6a: d1 1c adc r13, r1 3f6c: fa 94 dec r15 3f6e: cf 0c add r12, r15 3f70: d1 1c adc r13, r1 3f72: 0e c0 rjmp .+28 ; 0x3f90 #endif #endif } /* Get device signature bytes */ else if(ch == STK_READ_SIGN) { 3f74: 85 37 cpi r24, 0x75 ; 117 3f76: 39 f4 brne .+14 ; 0x3f86 // READ SIGN - return what Avrdude wants to hear verifySpace(); 3f78: 28 d0 rcall .+80 ; 0x3fca putch(SIGNATURE_0); 3f7a: 8e e1 ldi r24, 0x1E ; 30 3f7c: 0c d0 rcall .+24 ; 0x3f96 putch(SIGNATURE_1); 3f7e: 84 e9 ldi r24, 0x94 ; 148 3f80: 0a d0 rcall .+20 ; 0x3f96 putch(SIGNATURE_2); 3f82: 86 e0 ldi r24, 0x06 ; 6 3f84: 7a cf rjmp .-268 ; 0x3e7a } else if (ch == 'Q') { 3f86: 81 35 cpi r24, 0x51 ; 81 3f88: 11 f4 brne .+4 ; 0x3f8e // Adaboot no-wait mod watchdogConfig(WATCHDOG_16MS); 3f8a: 88 e0 ldi r24, 0x08 ; 8 3f8c: 18 d0 rcall .+48 ; 0x3fbe verifySpace(); } else { // This covers the response to commands like STK_ENTER_PROGMODE verifySpace(); 3f8e: 1d d0 rcall .+58 ; 0x3fca } putch(STK_OK); 3f90: 80 e1 ldi r24, 0x10 ; 16 3f92: 01 d0 rcall .+2 ; 0x3f96 3f94: 65 cf rjmp .-310 ; 0x3e60 00003f96 : } } void putch(char ch) { 3f96: 98 2f mov r25, r24 #ifndef SOFT_UART while (!(UCSR0A & _BV(UDRE0))); 3f98: 80 91 c0 00 lds r24, 0x00C0 3f9c: 85 ff sbrs r24, 5 3f9e: fc cf rjmp .-8 ; 0x3f98 UDR0 = ch; 3fa0: 90 93 c6 00 sts 0x00C6, r25 [uartBit] "I" (UART_TX_BIT) : "r25" ); #endif } 3fa4: 08 95 ret 00003fa6 : [uartBit] "I" (UART_RX_BIT) : "r25" ); #else while(!(UCSR0A & _BV(RXC0))) 3fa6: 80 91 c0 00 lds r24, 0x00C0 3faa: 87 ff sbrs r24, 7 3fac: fc cf rjmp .-8 ; 0x3fa6 ; if (!(UCSR0A & _BV(FE0))) { 3fae: 80 91 c0 00 lds r24, 0x00C0 3fb2: 84 fd sbrc r24, 4 3fb4: 01 c0 rjmp .+2 ; 0x3fb8 } #endif // Watchdog functions. These are only safe with interrupts turned off. void watchdogReset() { __asm__ __volatile__ ( 3fb6: a8 95 wdr * don't care that an invalid char is returned...) */ watchdogReset(); } ch = UDR0; 3fb8: 80 91 c6 00 lds r24, 0x00C6 LED_PIN |= _BV(LED); #endif #endif return ch; } 3fbc: 08 95 ret 00003fbe : "wdr\n" ); } void watchdogConfig(uint8_t x) { WDTCSR = _BV(WDCE) | _BV(WDE); 3fbe: e0 e6 ldi r30, 0x60 ; 96 3fc0: f0 e0 ldi r31, 0x00 ; 0 3fc2: 98 e1 ldi r25, 0x18 ; 24 3fc4: 90 83 st Z, r25 WDTCSR = x; 3fc6: 80 83 st Z, r24 } 3fc8: 08 95 ret 00003fca : do getch(); while (--count); verifySpace(); } void verifySpace() { if (getch() != CRC_EOP) { 3fca: ed df rcall .-38 ; 0x3fa6 3fcc: 80 32 cpi r24, 0x20 ; 32 3fce: 19 f0 breq .+6 ; 0x3fd6 watchdogConfig(WATCHDOG_16MS); // shorten WD timeout 3fd0: 88 e0 ldi r24, 0x08 ; 8 3fd2: f5 df rcall .-22 ; 0x3fbe 3fd4: ff cf rjmp .-2 ; 0x3fd4 while (1) // and busy-loop so that WD causes ; // a reset and app start. } putch(STK_INSYNC); 3fd6: 84 e1 ldi r24, 0x14 ; 20 } 3fd8: de cf rjmp .-68 ; 0x3f96 00003fda : ::[count] "M" (UART_B_VALUE) ); } #endif void getNch(uint8_t count) { 3fda: 1f 93 push r17 3fdc: 18 2f mov r17, r24 do getch(); while (--count); 3fde: e3 df rcall .-58 ; 0x3fa6 3fe0: 11 50 subi r17, 0x01 ; 1 3fe2: e9 f7 brne .-6 ; 0x3fde verifySpace(); 3fe4: f2 df rcall .-28 ; 0x3fca } 3fe6: 1f 91 pop r17 3fe8: 08 95 ret 00003fea : WDTCSR = _BV(WDCE) | _BV(WDE); WDTCSR = x; } void appStart() { watchdogConfig(WATCHDOG_OFF); 3fea: 80 e0 ldi r24, 0x00 ; 0 3fec: e8 df rcall .-48 ; 0x3fbe __asm__ __volatile__ ( 3fee: ee 27 eor r30, r30 3ff0: ff 27 eor r31, r31 3ff2: 09 94 ijmp ================================================ FILE: external/arduino/avr/bootloaders/optiboot/optiboot_atmega328-Mini.hex ================================================ :107E000085E08093810082E08093C00088E18093C8 :107E1000C10086E08093C20080E18093C40084B7F3 :107E200014BE81FFD0D089E2C8D0259A86E020E335 :107E30003CEF91E0309385002093840096BBB09B8B :107E4000FECF1D9AA8958150A9F7DD24D394A5E013 :107E5000EA2EF1E1FF2EA4D0813421F481E0BED0DE :107E600083E024C0823411F484E103C0853419F422 :107E700085E0B4D08AC08535A1F492D0082F10E0F7 :107E800010930102009300028BD090E0982F882776 :107E9000802B912B880F991F9093010280930002F1 :107EA00073C0863529F484E099D080E071D06DC02C :107EB000843609F043C07CD0E0910002F0910102C9 :107EC00083E080935700E895C0E0D1E069D08993C2 :107ED000809102028150809302028823B9F778D002 :107EE00007B600FCFDCF4091000250910102A0E0D6 :107EF000B1E02C9130E011968C91119790E0982F81 :107F00008827822B932B1296FA010C01D0925700EE :107F1000E89511244E5F5F4FF1E0A038BF0749F7A5 :107F2000E0910002F0910102E0925700E89507B657 :107F300000FCFDCFF0925700E89527C08437B9F4D4 :107F400037D046D0E0910002F09101023196F093D3 :107F50000102E09300023197E4918E2F19D08091B5 :107F60000202815080930202882361F70EC0853798 :107F700039F42ED08EE10CD085E90AD08FE096CF6F :107F8000813511F488E019D023D080E101D063CF8E :107F9000982F8091C00085FFFCCF9093C600089574 :107FA000A8958091C00087FFFCCF8091C6000895FE :107FB000F7DFF6DF80930202F3CFE0E6F0E098E12E :107FC00090838083089580E0F8DFEE27FF270994EF :107FD000E7DF803209F0F7DF84E1DACF1F93182F53 :0C7FE000DFDF1150E9F7F4DF1F91089576 :0400000300007E007B :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/optiboot/optiboot_atmega328.hex ================================================ :107E0000112484B714BE81FFF0D085E080938100F7 :107E100082E08093C00088E18093C10086E0809377 :107E2000C20080E18093C4008EE0C9D0259A86E02C :107E300020E33CEF91E0309385002093840096BBD3 :107E4000B09BFECF1D9AA8958150A9F7CC24DD24C4 :107E500088248394B5E0AB2EA1E19A2EF3E0BF2EE7 :107E6000A2D0813461F49FD0082FAFD0023811F036 :107E7000013811F484E001C083E08DD089C08234E0 :107E800011F484E103C0853419F485E0A6D080C0E4 :107E9000853579F488D0E82EFF2485D0082F10E0AE :107EA000102F00270E291F29000F111F8ED06801E7 :107EB0006FC0863521F484E090D080E0DECF843638 :107EC00009F040C070D06FD0082F6DD080E0C81688 :107ED00080E7D80618F4F601B7BEE895C0E0D1E017 :107EE00062D089930C17E1F7F0E0CF16F0E7DF06D8 :107EF00018F0F601B7BEE89568D007B600FCFDCFD4 :107F0000A601A0E0B1E02C9130E011968C91119780 :107F100090E0982F8827822B932B1296FA010C0160 :107F200087BEE89511244E5F5F4FF1E0A038BF0790 :107F300051F7F601A7BEE89507B600FCFDCF97BE46 :107F4000E89526C08437B1F42ED02DD0F82E2BD052 :107F50003CD0F601EF2C8F010F5F1F4F84911BD097 :107F6000EA94F801C1F70894C11CD11CFA94CF0C13 :107F7000D11C0EC0853739F428D08EE10CD085E9AC :107F80000AD08FE07ACF813511F488E018D01DD067 :107F900080E101D065CF982F8091C00085FFFCCF94 :107FA0009093C60008958091C00087FFFCCF809118 :107FB000C00084FD01C0A8958091C6000895E0E648 :107FC000F0E098E1908380830895EDDF803219F02E :107FD00088E0F5DFFFCF84E1DECF1F93182FE3DFCA :107FE0001150E9F7F2DF1F91089580E0E8DFEE27F6 :047FF000FF270994CA :027FFE00040479 :0400000300007E007B :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/optiboot/optiboot_atmega328.lst ================================================ optiboot_atmega328.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn 0 .text 000001f4 00007e00 00007e00 00000054 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE 1 .version 00000002 00007ffe 00007ffe 00000248 2**0 CONTENTS, READONLY 2 .debug_aranges 00000028 00000000 00000000 0000024a 2**0 CONTENTS, READONLY, DEBUGGING 3 .debug_pubnames 0000005f 00000000 00000000 00000272 2**0 CONTENTS, READONLY, DEBUGGING 4 .debug_info 000002a8 00000000 00000000 000002d1 2**0 CONTENTS, READONLY, DEBUGGING 5 .debug_abbrev 00000178 00000000 00000000 00000579 2**0 CONTENTS, READONLY, DEBUGGING 6 .debug_line 00000488 00000000 00000000 000006f1 2**0 CONTENTS, READONLY, DEBUGGING 7 .debug_frame 00000080 00000000 00000000 00000b7c 2**2 CONTENTS, READONLY, DEBUGGING 8 .debug_str 0000014f 00000000 00000000 00000bfc 2**0 CONTENTS, READONLY, DEBUGGING 9 .debug_loc 000002d8 00000000 00000000 00000d4b 2**0 CONTENTS, READONLY, DEBUGGING 10 .debug_ranges 00000078 00000000 00000000 00001023 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: 00007e00
: #define rstVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+4)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #endif /* main program starts here */ int main(void) { 7e00: 11 24 eor r1, r1 #ifdef __AVR_ATmega8__ SP=RAMEND; // This is done by hardware reset #endif // Adaboot no-wait mod ch = MCUSR; 7e02: 84 b7 in r24, 0x34 ; 52 MCUSR = 0; 7e04: 14 be out 0x34, r1 ; 52 if (!(ch & _BV(EXTRF))) appStart(); 7e06: 81 ff sbrs r24, 1 7e08: f0 d0 rcall .+480 ; 0x7fea #if LED_START_FLASHES > 0 // Set up Timer 1 for timeout counter TCCR1B = _BV(CS12) | _BV(CS10); // div 1024 7e0a: 85 e0 ldi r24, 0x05 ; 5 7e0c: 80 93 81 00 sts 0x0081, r24 UCSRA = _BV(U2X); //Double speed mode USART UCSRB = _BV(RXEN) | _BV(TXEN); // enable Rx & Tx UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); // config USART; 8N1 UBRRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); #else UCSR0A = _BV(U2X0); //Double speed mode USART0 7e10: 82 e0 ldi r24, 0x02 ; 2 7e12: 80 93 c0 00 sts 0x00C0, r24 UCSR0B = _BV(RXEN0) | _BV(TXEN0); 7e16: 88 e1 ldi r24, 0x18 ; 24 7e18: 80 93 c1 00 sts 0x00C1, r24 UCSR0C = _BV(UCSZ00) | _BV(UCSZ01); 7e1c: 86 e0 ldi r24, 0x06 ; 6 7e1e: 80 93 c2 00 sts 0x00C2, r24 UBRR0L = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); 7e22: 80 e1 ldi r24, 0x10 ; 16 7e24: 80 93 c4 00 sts 0x00C4, r24 #endif #endif // Set up watchdog to trigger after 500ms watchdogConfig(WATCHDOG_1S); 7e28: 8e e0 ldi r24, 0x0E ; 14 7e2a: c9 d0 rcall .+402 ; 0x7fbe /* Set LED pin as output */ LED_DDR |= _BV(LED); 7e2c: 25 9a sbi 0x04, 5 ; 4 7e2e: 86 e0 ldi r24, 0x06 ; 6 } #if LED_START_FLASHES > 0 void flash_led(uint8_t count) { do { TCNT1 = -(F_CPU/(1024*16)); 7e30: 20 e3 ldi r18, 0x30 ; 48 7e32: 3c ef ldi r19, 0xFC ; 252 TIFR1 = _BV(TOV1); 7e34: 91 e0 ldi r25, 0x01 ; 1 } #if LED_START_FLASHES > 0 void flash_led(uint8_t count) { do { TCNT1 = -(F_CPU/(1024*16)); 7e36: 30 93 85 00 sts 0x0085, r19 7e3a: 20 93 84 00 sts 0x0084, r18 TIFR1 = _BV(TOV1); 7e3e: 96 bb out 0x16, r25 ; 22 while(!(TIFR1 & _BV(TOV1))); 7e40: b0 9b sbis 0x16, 0 ; 22 7e42: fe cf rjmp .-4 ; 0x7e40 #ifdef __AVR_ATmega8__ LED_PORT ^= _BV(LED); #else LED_PIN |= _BV(LED); 7e44: 1d 9a sbi 0x03, 5 ; 3 } #endif // Watchdog functions. These are only safe with interrupts turned off. void watchdogReset() { __asm__ __volatile__ ( 7e46: a8 95 wdr LED_PORT ^= _BV(LED); #else LED_PIN |= _BV(LED); #endif watchdogReset(); } while (--count); 7e48: 81 50 subi r24, 0x01 ; 1 7e4a: a9 f7 brne .-22 ; 0x7e36 7e4c: cc 24 eor r12, r12 7e4e: dd 24 eor r13, r13 ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; a |= (*bufPtr++) << 8; __boot_page_fill_short((uint16_t)(void*)addrPtr,a); 7e50: 88 24 eor r8, r8 7e52: 83 94 inc r8 addrPtr += 2; } while (--ch); // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); 7e54: b5 e0 ldi r27, 0x05 ; 5 7e56: ab 2e mov r10, r27 boot_spm_busy_wait(); #if defined(RWWSRE) // Reenable read access to flash boot_rww_enable(); 7e58: a1 e1 ldi r26, 0x11 ; 17 7e5a: 9a 2e mov r9, r26 do *bufPtr++ = getch(); while (--length); // If we are in NRWW section, page erase has to be delayed until now. // Todo: Take RAMPZ into account if (address >= NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); 7e5c: f3 e0 ldi r31, 0x03 ; 3 7e5e: bf 2e mov r11, r31 #endif /* Forever loop */ for (;;) { /* get character from UART */ ch = getch(); 7e60: a2 d0 rcall .+324 ; 0x7fa6 if(ch == STK_GET_PARAMETER) { 7e62: 81 34 cpi r24, 0x41 ; 65 7e64: 61 f4 brne .+24 ; 0x7e7e unsigned char which = getch(); 7e66: 9f d0 rcall .+318 ; 0x7fa6 7e68: 08 2f mov r16, r24 verifySpace(); 7e6a: af d0 rcall .+350 ; 0x7fca if (which == 0x82) { 7e6c: 02 38 cpi r16, 0x82 ; 130 7e6e: 11 f0 breq .+4 ; 0x7e74 /* * Send optiboot version as "minor SW version" */ putch(OPTIBOOT_MINVER); } else if (which == 0x81) { 7e70: 01 38 cpi r16, 0x81 ; 129 7e72: 11 f4 brne .+4 ; 0x7e78 putch(OPTIBOOT_MAJVER); 7e74: 84 e0 ldi r24, 0x04 ; 4 7e76: 01 c0 rjmp .+2 ; 0x7e7a } else { /* * GET PARAMETER returns a generic 0x03 reply for * other parameters - enough to keep Avrdude happy */ putch(0x03); 7e78: 83 e0 ldi r24, 0x03 ; 3 7e7a: 8d d0 rcall .+282 ; 0x7f96 7e7c: 89 c0 rjmp .+274 ; 0x7f90 } } else if(ch == STK_SET_DEVICE) { 7e7e: 82 34 cpi r24, 0x42 ; 66 7e80: 11 f4 brne .+4 ; 0x7e86 // SET DEVICE is ignored getNch(20); 7e82: 84 e1 ldi r24, 0x14 ; 20 7e84: 03 c0 rjmp .+6 ; 0x7e8c } else if(ch == STK_SET_DEVICE_EXT) { 7e86: 85 34 cpi r24, 0x45 ; 69 7e88: 19 f4 brne .+6 ; 0x7e90 // SET DEVICE EXT is ignored getNch(5); 7e8a: 85 e0 ldi r24, 0x05 ; 5 7e8c: a6 d0 rcall .+332 ; 0x7fda 7e8e: 80 c0 rjmp .+256 ; 0x7f90 } else if(ch == STK_LOAD_ADDRESS) { 7e90: 85 35 cpi r24, 0x55 ; 85 7e92: 79 f4 brne .+30 ; 0x7eb2 // LOAD ADDRESS uint16_t newAddress; newAddress = getch(); 7e94: 88 d0 rcall .+272 ; 0x7fa6 newAddress = (newAddress & 0xff) | (getch() << 8); 7e96: e8 2e mov r14, r24 7e98: ff 24 eor r15, r15 7e9a: 85 d0 rcall .+266 ; 0x7fa6 7e9c: 08 2f mov r16, r24 7e9e: 10 e0 ldi r17, 0x00 ; 0 7ea0: 10 2f mov r17, r16 7ea2: 00 27 eor r16, r16 7ea4: 0e 29 or r16, r14 7ea6: 1f 29 or r17, r15 #ifdef RAMPZ // Transfer top bit to RAMPZ RAMPZ = (newAddress & 0x8000) ? 1 : 0; #endif newAddress += newAddress; // Convert from word address to byte address 7ea8: 00 0f add r16, r16 7eaa: 11 1f adc r17, r17 address = newAddress; verifySpace(); 7eac: 8e d0 rcall .+284 ; 0x7fca 7eae: 68 01 movw r12, r16 7eb0: 6f c0 rjmp .+222 ; 0x7f90 } else if(ch == STK_UNIVERSAL) { 7eb2: 86 35 cpi r24, 0x56 ; 86 7eb4: 21 f4 brne .+8 ; 0x7ebe // UNIVERSAL command is ignored getNch(4); 7eb6: 84 e0 ldi r24, 0x04 ; 4 7eb8: 90 d0 rcall .+288 ; 0x7fda putch(0x00); 7eba: 80 e0 ldi r24, 0x00 ; 0 7ebc: de cf rjmp .-68 ; 0x7e7a } /* Write memory, length is big endian and is in bytes */ else if(ch == STK_PROG_PAGE) { 7ebe: 84 36 cpi r24, 0x64 ; 100 7ec0: 09 f0 breq .+2 ; 0x7ec4 7ec2: 40 c0 rjmp .+128 ; 0x7f44 // PROGRAM PAGE - we support flash programming only, not EEPROM uint8_t *bufPtr; uint16_t addrPtr; getch(); /* getlen() */ 7ec4: 70 d0 rcall .+224 ; 0x7fa6 length = getch(); 7ec6: 6f d0 rcall .+222 ; 0x7fa6 7ec8: 08 2f mov r16, r24 getch(); 7eca: 6d d0 rcall .+218 ; 0x7fa6 // If we are in RWW section, immediately start page erase if (address < NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); 7ecc: 80 e0 ldi r24, 0x00 ; 0 7ece: c8 16 cp r12, r24 7ed0: 80 e7 ldi r24, 0x70 ; 112 7ed2: d8 06 cpc r13, r24 7ed4: 18 f4 brcc .+6 ; 0x7edc 7ed6: f6 01 movw r30, r12 7ed8: b7 be out 0x37, r11 ; 55 7eda: e8 95 spm 7edc: c0 e0 ldi r28, 0x00 ; 0 7ede: d1 e0 ldi r29, 0x01 ; 1 // While that is going on, read in page contents bufPtr = buff; do *bufPtr++ = getch(); 7ee0: 62 d0 rcall .+196 ; 0x7fa6 7ee2: 89 93 st Y+, r24 while (--length); 7ee4: 0c 17 cp r16, r28 7ee6: e1 f7 brne .-8 ; 0x7ee0 // If we are in NRWW section, page erase has to be delayed until now. // Todo: Take RAMPZ into account if (address >= NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); 7ee8: f0 e0 ldi r31, 0x00 ; 0 7eea: cf 16 cp r12, r31 7eec: f0 e7 ldi r31, 0x70 ; 112 7eee: df 06 cpc r13, r31 7ef0: 18 f0 brcs .+6 ; 0x7ef8 7ef2: f6 01 movw r30, r12 7ef4: b7 be out 0x37, r11 ; 55 7ef6: e8 95 spm // Read command terminator, start reply verifySpace(); 7ef8: 68 d0 rcall .+208 ; 0x7fca // If only a partial page is to be programmed, the erase might not be complete. // So check that here boot_spm_busy_wait(); 7efa: 07 b6 in r0, 0x37 ; 55 7efc: 00 fc sbrc r0, 0 7efe: fd cf rjmp .-6 ; 0x7efa 7f00: a6 01 movw r20, r12 7f02: a0 e0 ldi r26, 0x00 ; 0 7f04: b1 e0 ldi r27, 0x01 ; 1 bufPtr = buff; addrPtr = (uint16_t)(void*)address; ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; 7f06: 2c 91 ld r18, X 7f08: 30 e0 ldi r19, 0x00 ; 0 a |= (*bufPtr++) << 8; 7f0a: 11 96 adiw r26, 0x01 ; 1 7f0c: 8c 91 ld r24, X 7f0e: 11 97 sbiw r26, 0x01 ; 1 7f10: 90 e0 ldi r25, 0x00 ; 0 7f12: 98 2f mov r25, r24 7f14: 88 27 eor r24, r24 7f16: 82 2b or r24, r18 7f18: 93 2b or r25, r19 #define rstVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+4)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #endif /* main program starts here */ int main(void) { 7f1a: 12 96 adiw r26, 0x02 ; 2 ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; a |= (*bufPtr++) << 8; __boot_page_fill_short((uint16_t)(void*)addrPtr,a); 7f1c: fa 01 movw r30, r20 7f1e: 0c 01 movw r0, r24 7f20: 87 be out 0x37, r8 ; 55 7f22: e8 95 spm 7f24: 11 24 eor r1, r1 addrPtr += 2; 7f26: 4e 5f subi r20, 0xFE ; 254 7f28: 5f 4f sbci r21, 0xFF ; 255 } while (--ch); 7f2a: f1 e0 ldi r31, 0x01 ; 1 7f2c: a0 38 cpi r26, 0x80 ; 128 7f2e: bf 07 cpc r27, r31 7f30: 51 f7 brne .-44 ; 0x7f06 // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); 7f32: f6 01 movw r30, r12 7f34: a7 be out 0x37, r10 ; 55 7f36: e8 95 spm boot_spm_busy_wait(); 7f38: 07 b6 in r0, 0x37 ; 55 7f3a: 00 fc sbrc r0, 0 7f3c: fd cf rjmp .-6 ; 0x7f38 #if defined(RWWSRE) // Reenable read access to flash boot_rww_enable(); 7f3e: 97 be out 0x37, r9 ; 55 7f40: e8 95 spm 7f42: 26 c0 rjmp .+76 ; 0x7f90 #endif } /* Read memory block mode, length is big endian. */ else if(ch == STK_READ_PAGE) { 7f44: 84 37 cpi r24, 0x74 ; 116 7f46: b1 f4 brne .+44 ; 0x7f74 // READ PAGE - we only read flash getch(); /* getlen() */ 7f48: 2e d0 rcall .+92 ; 0x7fa6 length = getch(); 7f4a: 2d d0 rcall .+90 ; 0x7fa6 7f4c: f8 2e mov r15, r24 getch(); 7f4e: 2b d0 rcall .+86 ; 0x7fa6 verifySpace(); 7f50: 3c d0 rcall .+120 ; 0x7fca 7f52: f6 01 movw r30, r12 7f54: ef 2c mov r14, r15 putch(result); address++; } while (--length); #else do putch(pgm_read_byte_near(address++)); 7f56: 8f 01 movw r16, r30 7f58: 0f 5f subi r16, 0xFF ; 255 7f5a: 1f 4f sbci r17, 0xFF ; 255 7f5c: 84 91 lpm r24, Z+ 7f5e: 1b d0 rcall .+54 ; 0x7f96 while (--length); 7f60: ea 94 dec r14 7f62: f8 01 movw r30, r16 7f64: c1 f7 brne .-16 ; 0x7f56 #define rstVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+4)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #endif /* main program starts here */ int main(void) { 7f66: 08 94 sec 7f68: c1 1c adc r12, r1 7f6a: d1 1c adc r13, r1 7f6c: fa 94 dec r15 7f6e: cf 0c add r12, r15 7f70: d1 1c adc r13, r1 7f72: 0e c0 rjmp .+28 ; 0x7f90 #endif #endif } /* Get device signature bytes */ else if(ch == STK_READ_SIGN) { 7f74: 85 37 cpi r24, 0x75 ; 117 7f76: 39 f4 brne .+14 ; 0x7f86 // READ SIGN - return what Avrdude wants to hear verifySpace(); 7f78: 28 d0 rcall .+80 ; 0x7fca putch(SIGNATURE_0); 7f7a: 8e e1 ldi r24, 0x1E ; 30 7f7c: 0c d0 rcall .+24 ; 0x7f96 putch(SIGNATURE_1); 7f7e: 85 e9 ldi r24, 0x95 ; 149 7f80: 0a d0 rcall .+20 ; 0x7f96 putch(SIGNATURE_2); 7f82: 8f e0 ldi r24, 0x0F ; 15 7f84: 7a cf rjmp .-268 ; 0x7e7a } else if (ch == 'Q') { 7f86: 81 35 cpi r24, 0x51 ; 81 7f88: 11 f4 brne .+4 ; 0x7f8e // Adaboot no-wait mod watchdogConfig(WATCHDOG_16MS); 7f8a: 88 e0 ldi r24, 0x08 ; 8 7f8c: 18 d0 rcall .+48 ; 0x7fbe verifySpace(); } else { // This covers the response to commands like STK_ENTER_PROGMODE verifySpace(); 7f8e: 1d d0 rcall .+58 ; 0x7fca } putch(STK_OK); 7f90: 80 e1 ldi r24, 0x10 ; 16 7f92: 01 d0 rcall .+2 ; 0x7f96 7f94: 65 cf rjmp .-310 ; 0x7e60 00007f96 : } } void putch(char ch) { 7f96: 98 2f mov r25, r24 #ifndef SOFT_UART while (!(UCSR0A & _BV(UDRE0))); 7f98: 80 91 c0 00 lds r24, 0x00C0 7f9c: 85 ff sbrs r24, 5 7f9e: fc cf rjmp .-8 ; 0x7f98 UDR0 = ch; 7fa0: 90 93 c6 00 sts 0x00C6, r25 [uartBit] "I" (UART_TX_BIT) : "r25" ); #endif } 7fa4: 08 95 ret 00007fa6 : [uartBit] "I" (UART_RX_BIT) : "r25" ); #else while(!(UCSR0A & _BV(RXC0))) 7fa6: 80 91 c0 00 lds r24, 0x00C0 7faa: 87 ff sbrs r24, 7 7fac: fc cf rjmp .-8 ; 0x7fa6 ; if (!(UCSR0A & _BV(FE0))) { 7fae: 80 91 c0 00 lds r24, 0x00C0 7fb2: 84 fd sbrc r24, 4 7fb4: 01 c0 rjmp .+2 ; 0x7fb8 } #endif // Watchdog functions. These are only safe with interrupts turned off. void watchdogReset() { __asm__ __volatile__ ( 7fb6: a8 95 wdr * don't care that an invalid char is returned...) */ watchdogReset(); } ch = UDR0; 7fb8: 80 91 c6 00 lds r24, 0x00C6 LED_PIN |= _BV(LED); #endif #endif return ch; } 7fbc: 08 95 ret 00007fbe : "wdr\n" ); } void watchdogConfig(uint8_t x) { WDTCSR = _BV(WDCE) | _BV(WDE); 7fbe: e0 e6 ldi r30, 0x60 ; 96 7fc0: f0 e0 ldi r31, 0x00 ; 0 7fc2: 98 e1 ldi r25, 0x18 ; 24 7fc4: 90 83 st Z, r25 WDTCSR = x; 7fc6: 80 83 st Z, r24 } 7fc8: 08 95 ret 00007fca : do getch(); while (--count); verifySpace(); } void verifySpace() { if (getch() != CRC_EOP) { 7fca: ed df rcall .-38 ; 0x7fa6 7fcc: 80 32 cpi r24, 0x20 ; 32 7fce: 19 f0 breq .+6 ; 0x7fd6 watchdogConfig(WATCHDOG_16MS); // shorten WD timeout 7fd0: 88 e0 ldi r24, 0x08 ; 8 7fd2: f5 df rcall .-22 ; 0x7fbe 7fd4: ff cf rjmp .-2 ; 0x7fd4 while (1) // and busy-loop so that WD causes ; // a reset and app start. } putch(STK_INSYNC); 7fd6: 84 e1 ldi r24, 0x14 ; 20 } 7fd8: de cf rjmp .-68 ; 0x7f96 00007fda : ::[count] "M" (UART_B_VALUE) ); } #endif void getNch(uint8_t count) { 7fda: 1f 93 push r17 7fdc: 18 2f mov r17, r24 do getch(); while (--count); 7fde: e3 df rcall .-58 ; 0x7fa6 7fe0: 11 50 subi r17, 0x01 ; 1 7fe2: e9 f7 brne .-6 ; 0x7fde verifySpace(); 7fe4: f2 df rcall .-28 ; 0x7fca } 7fe6: 1f 91 pop r17 7fe8: 08 95 ret 00007fea : WDTCSR = _BV(WDCE) | _BV(WDE); WDTCSR = x; } void appStart() { watchdogConfig(WATCHDOG_OFF); 7fea: 80 e0 ldi r24, 0x00 ; 0 7fec: e8 df rcall .-48 ; 0x7fbe __asm__ __volatile__ ( 7fee: ee 27 eor r30, r30 7ff0: ff 27 eor r31, r31 7ff2: 09 94 ijmp ================================================ FILE: external/arduino/avr/bootloaders/optiboot/optiboot_atmega8.hex ================================================ :101E000011248FE594E09EBF8DBF84B714BE81FF7F :101E1000E2D085E08EBD82E08BB988E18AB986E8A0 :101E200080BD80E189B98EE0C2D0BD9A96E020E302 :101E30003CEF54E040E23DBD2CBD58BF08B602FE69 :101E4000FDCF88B3842788BBA8959150A1F7CC24F7 :101E5000DD2488248394B5E0AB2EA1E19A2EF3E033 :101E6000BF2E9ED0813461F49BD0082FA4D00238BD :101E700011F0013811F484E001C083E08DD089C0F5 :101E8000823411F484E103C0853419F485E09BD0D9 :101E900080C0853579F484D0E82EFF2481D0082FC6 :101EA00010E0102F00270E291F29000F111F83D0CB :101EB00068016FC0863521F484E085D080E0DECFF4 :101EC000843609F040C06CD06BD0082F69D080E018 :101ED000C81688E1D80618F4F601B7BEE895C0E048 :101EE000D1E05ED089930C17E1F7F0E0CF16F8E16E :101EF000DF0618F0F601B7BEE8955DD007B600FC26 :101F0000FDCFA601A0E0B1E02C9130E011968C91BC :101F1000119790E0982F8827822B932B1296FA0125 :101F20000C0187BEE89511244E5F5F4FF1E0A034AD :101F3000BF0751F7F601A7BEE89507B600FCFDCF35 :101F400097BEE89526C08437B1F42AD029D0F82E60 :101F500027D031D0F601EF2C8F010F5F1F4F8491F6 :101F60001BD0EA94F801C1F70894C11CD11CFA9463 :101F7000CF0CD11C0EC0853739F41DD08EE10CD0AA :101F800083E90AD087E07ACF813511F488E00FD059 :101F900012D080E101D065CF5D9BFECF8CB9089552 :101FA0005F9BFECF5C9901C0A8958CB1089598E124 :101FB00091BD81BD0895F4DF803219F088E0F7DF2C :101FC000FFCF84E1E9CF1F93182FEADF1150E9F723 :101FD000F2DF1F91089580E0EADFEE27FF270994E2 :021FFE000404D9 :0400000300001E00DB :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/optiboot/optiboot_atmega8.lst ================================================ optiboot_atmega8.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn 0 .text 000001e0 00001e00 00001e00 00000054 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE 1 .version 00000002 00001ffe 00001ffe 00000234 2**0 CONTENTS, READONLY 2 .debug_aranges 00000028 00000000 00000000 00000236 2**0 CONTENTS, READONLY, DEBUGGING 3 .debug_pubnames 0000005f 00000000 00000000 0000025e 2**0 CONTENTS, READONLY, DEBUGGING 4 .debug_info 000002a6 00000000 00000000 000002bd 2**0 CONTENTS, READONLY, DEBUGGING 5 .debug_abbrev 00000169 00000000 00000000 00000563 2**0 CONTENTS, READONLY, DEBUGGING 6 .debug_line 00000498 00000000 00000000 000006cc 2**0 CONTENTS, READONLY, DEBUGGING 7 .debug_frame 00000080 00000000 00000000 00000b64 2**2 CONTENTS, READONLY, DEBUGGING 8 .debug_str 0000014f 00000000 00000000 00000be4 2**0 CONTENTS, READONLY, DEBUGGING 9 .debug_loc 000002ba 00000000 00000000 00000d33 2**0 CONTENTS, READONLY, DEBUGGING 10 .debug_ranges 00000078 00000000 00000000 00000fed 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: 00001e00
: #define rstVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+4)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #endif /* main program starts here */ int main(void) { 1e00: 11 24 eor r1, r1 // // If not, uncomment the following instructions: // cli(); asm volatile ("clr __zero_reg__"); #ifdef __AVR_ATmega8__ SP=RAMEND; // This is done by hardware reset 1e02: 8f e5 ldi r24, 0x5F ; 95 1e04: 94 e0 ldi r25, 0x04 ; 4 1e06: 9e bf out 0x3e, r25 ; 62 1e08: 8d bf out 0x3d, r24 ; 61 #endif // Adaboot no-wait mod ch = MCUSR; 1e0a: 84 b7 in r24, 0x34 ; 52 MCUSR = 0; 1e0c: 14 be out 0x34, r1 ; 52 if (!(ch & _BV(EXTRF))) appStart(); 1e0e: 81 ff sbrs r24, 1 1e10: e2 d0 rcall .+452 ; 0x1fd6 #if LED_START_FLASHES > 0 // Set up Timer 1 for timeout counter TCCR1B = _BV(CS12) | _BV(CS10); // div 1024 1e12: 85 e0 ldi r24, 0x05 ; 5 1e14: 8e bd out 0x2e, r24 ; 46 #endif #ifndef SOFT_UART #ifdef __AVR_ATmega8__ UCSRA = _BV(U2X); //Double speed mode USART 1e16: 82 e0 ldi r24, 0x02 ; 2 1e18: 8b b9 out 0x0b, r24 ; 11 UCSRB = _BV(RXEN) | _BV(TXEN); // enable Rx & Tx 1e1a: 88 e1 ldi r24, 0x18 ; 24 1e1c: 8a b9 out 0x0a, r24 ; 10 UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); // config USART; 8N1 1e1e: 86 e8 ldi r24, 0x86 ; 134 1e20: 80 bd out 0x20, r24 ; 32 UBRRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); 1e22: 80 e1 ldi r24, 0x10 ; 16 1e24: 89 b9 out 0x09, r24 ; 9 UBRR0L = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); #endif #endif // Set up watchdog to trigger after 500ms watchdogConfig(WATCHDOG_1S); 1e26: 8e e0 ldi r24, 0x0E ; 14 1e28: c2 d0 rcall .+388 ; 0x1fae /* Set LED pin as output */ LED_DDR |= _BV(LED); 1e2a: bd 9a sbi 0x17, 5 ; 23 1e2c: 96 e0 ldi r25, 0x06 ; 6 } #if LED_START_FLASHES > 0 void flash_led(uint8_t count) { do { TCNT1 = -(F_CPU/(1024*16)); 1e2e: 20 e3 ldi r18, 0x30 ; 48 1e30: 3c ef ldi r19, 0xFC ; 252 TIFR1 = _BV(TOV1); 1e32: 54 e0 ldi r21, 0x04 ; 4 while(!(TIFR1 & _BV(TOV1))); #ifdef __AVR_ATmega8__ LED_PORT ^= _BV(LED); 1e34: 40 e2 ldi r20, 0x20 ; 32 } #if LED_START_FLASHES > 0 void flash_led(uint8_t count) { do { TCNT1 = -(F_CPU/(1024*16)); 1e36: 3d bd out 0x2d, r19 ; 45 1e38: 2c bd out 0x2c, r18 ; 44 TIFR1 = _BV(TOV1); 1e3a: 58 bf out 0x38, r21 ; 56 while(!(TIFR1 & _BV(TOV1))); 1e3c: 08 b6 in r0, 0x38 ; 56 1e3e: 02 fe sbrs r0, 2 1e40: fd cf rjmp .-6 ; 0x1e3c #ifdef __AVR_ATmega8__ LED_PORT ^= _BV(LED); 1e42: 88 b3 in r24, 0x18 ; 24 1e44: 84 27 eor r24, r20 1e46: 88 bb out 0x18, r24 ; 24 } #endif // Watchdog functions. These are only safe with interrupts turned off. void watchdogReset() { __asm__ __volatile__ ( 1e48: a8 95 wdr LED_PORT ^= _BV(LED); #else LED_PIN |= _BV(LED); #endif watchdogReset(); } while (--count); 1e4a: 91 50 subi r25, 0x01 ; 1 1e4c: a1 f7 brne .-24 ; 0x1e36 1e4e: cc 24 eor r12, r12 1e50: dd 24 eor r13, r13 ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; a |= (*bufPtr++) << 8; __boot_page_fill_short((uint16_t)(void*)addrPtr,a); 1e52: 88 24 eor r8, r8 1e54: 83 94 inc r8 addrPtr += 2; } while (--ch); // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); 1e56: b5 e0 ldi r27, 0x05 ; 5 1e58: ab 2e mov r10, r27 boot_spm_busy_wait(); #if defined(RWWSRE) // Reenable read access to flash boot_rww_enable(); 1e5a: a1 e1 ldi r26, 0x11 ; 17 1e5c: 9a 2e mov r9, r26 do *bufPtr++ = getch(); while (--length); // If we are in NRWW section, page erase has to be delayed until now. // Todo: Take RAMPZ into account if (address >= NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); 1e5e: f3 e0 ldi r31, 0x03 ; 3 1e60: bf 2e mov r11, r31 #endif /* Forever loop */ for (;;) { /* get character from UART */ ch = getch(); 1e62: 9e d0 rcall .+316 ; 0x1fa0 if(ch == STK_GET_PARAMETER) { 1e64: 81 34 cpi r24, 0x41 ; 65 1e66: 61 f4 brne .+24 ; 0x1e80 unsigned char which = getch(); 1e68: 9b d0 rcall .+310 ; 0x1fa0 1e6a: 08 2f mov r16, r24 verifySpace(); 1e6c: a4 d0 rcall .+328 ; 0x1fb6 if (which == 0x82) { 1e6e: 02 38 cpi r16, 0x82 ; 130 1e70: 11 f0 breq .+4 ; 0x1e76 /* * Send optiboot version as "minor SW version" */ putch(OPTIBOOT_MINVER); } else if (which == 0x81) { 1e72: 01 38 cpi r16, 0x81 ; 129 1e74: 11 f4 brne .+4 ; 0x1e7a putch(OPTIBOOT_MAJVER); 1e76: 84 e0 ldi r24, 0x04 ; 4 1e78: 01 c0 rjmp .+2 ; 0x1e7c } else { /* * GET PARAMETER returns a generic 0x03 reply for * other parameters - enough to keep Avrdude happy */ putch(0x03); 1e7a: 83 e0 ldi r24, 0x03 ; 3 1e7c: 8d d0 rcall .+282 ; 0x1f98 1e7e: 89 c0 rjmp .+274 ; 0x1f92 } } else if(ch == STK_SET_DEVICE) { 1e80: 82 34 cpi r24, 0x42 ; 66 1e82: 11 f4 brne .+4 ; 0x1e88 // SET DEVICE is ignored getNch(20); 1e84: 84 e1 ldi r24, 0x14 ; 20 1e86: 03 c0 rjmp .+6 ; 0x1e8e } else if(ch == STK_SET_DEVICE_EXT) { 1e88: 85 34 cpi r24, 0x45 ; 69 1e8a: 19 f4 brne .+6 ; 0x1e92 // SET DEVICE EXT is ignored getNch(5); 1e8c: 85 e0 ldi r24, 0x05 ; 5 1e8e: 9b d0 rcall .+310 ; 0x1fc6 1e90: 80 c0 rjmp .+256 ; 0x1f92 } else if(ch == STK_LOAD_ADDRESS) { 1e92: 85 35 cpi r24, 0x55 ; 85 1e94: 79 f4 brne .+30 ; 0x1eb4 // LOAD ADDRESS uint16_t newAddress; newAddress = getch(); 1e96: 84 d0 rcall .+264 ; 0x1fa0 newAddress = (newAddress & 0xff) | (getch() << 8); 1e98: e8 2e mov r14, r24 1e9a: ff 24 eor r15, r15 1e9c: 81 d0 rcall .+258 ; 0x1fa0 1e9e: 08 2f mov r16, r24 1ea0: 10 e0 ldi r17, 0x00 ; 0 1ea2: 10 2f mov r17, r16 1ea4: 00 27 eor r16, r16 1ea6: 0e 29 or r16, r14 1ea8: 1f 29 or r17, r15 #ifdef RAMPZ // Transfer top bit to RAMPZ RAMPZ = (newAddress & 0x8000) ? 1 : 0; #endif newAddress += newAddress; // Convert from word address to byte address 1eaa: 00 0f add r16, r16 1eac: 11 1f adc r17, r17 address = newAddress; verifySpace(); 1eae: 83 d0 rcall .+262 ; 0x1fb6 1eb0: 68 01 movw r12, r16 1eb2: 6f c0 rjmp .+222 ; 0x1f92 } else if(ch == STK_UNIVERSAL) { 1eb4: 86 35 cpi r24, 0x56 ; 86 1eb6: 21 f4 brne .+8 ; 0x1ec0 // UNIVERSAL command is ignored getNch(4); 1eb8: 84 e0 ldi r24, 0x04 ; 4 1eba: 85 d0 rcall .+266 ; 0x1fc6 putch(0x00); 1ebc: 80 e0 ldi r24, 0x00 ; 0 1ebe: de cf rjmp .-68 ; 0x1e7c } /* Write memory, length is big endian and is in bytes */ else if(ch == STK_PROG_PAGE) { 1ec0: 84 36 cpi r24, 0x64 ; 100 1ec2: 09 f0 breq .+2 ; 0x1ec6 1ec4: 40 c0 rjmp .+128 ; 0x1f46 // PROGRAM PAGE - we support flash programming only, not EEPROM uint8_t *bufPtr; uint16_t addrPtr; getch(); /* getlen() */ 1ec6: 6c d0 rcall .+216 ; 0x1fa0 length = getch(); 1ec8: 6b d0 rcall .+214 ; 0x1fa0 1eca: 08 2f mov r16, r24 getch(); 1ecc: 69 d0 rcall .+210 ; 0x1fa0 // If we are in RWW section, immediately start page erase if (address < NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); 1ece: 80 e0 ldi r24, 0x00 ; 0 1ed0: c8 16 cp r12, r24 1ed2: 88 e1 ldi r24, 0x18 ; 24 1ed4: d8 06 cpc r13, r24 1ed6: 18 f4 brcc .+6 ; 0x1ede 1ed8: f6 01 movw r30, r12 1eda: b7 be out 0x37, r11 ; 55 1edc: e8 95 spm 1ede: c0 e0 ldi r28, 0x00 ; 0 1ee0: d1 e0 ldi r29, 0x01 ; 1 // While that is going on, read in page contents bufPtr = buff; do *bufPtr++ = getch(); 1ee2: 5e d0 rcall .+188 ; 0x1fa0 1ee4: 89 93 st Y+, r24 while (--length); 1ee6: 0c 17 cp r16, r28 1ee8: e1 f7 brne .-8 ; 0x1ee2 // If we are in NRWW section, page erase has to be delayed until now. // Todo: Take RAMPZ into account if (address >= NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); 1eea: f0 e0 ldi r31, 0x00 ; 0 1eec: cf 16 cp r12, r31 1eee: f8 e1 ldi r31, 0x18 ; 24 1ef0: df 06 cpc r13, r31 1ef2: 18 f0 brcs .+6 ; 0x1efa 1ef4: f6 01 movw r30, r12 1ef6: b7 be out 0x37, r11 ; 55 1ef8: e8 95 spm // Read command terminator, start reply verifySpace(); 1efa: 5d d0 rcall .+186 ; 0x1fb6 // If only a partial page is to be programmed, the erase might not be complete. // So check that here boot_spm_busy_wait(); 1efc: 07 b6 in r0, 0x37 ; 55 1efe: 00 fc sbrc r0, 0 1f00: fd cf rjmp .-6 ; 0x1efc 1f02: a6 01 movw r20, r12 1f04: a0 e0 ldi r26, 0x00 ; 0 1f06: b1 e0 ldi r27, 0x01 ; 1 bufPtr = buff; addrPtr = (uint16_t)(void*)address; ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; 1f08: 2c 91 ld r18, X 1f0a: 30 e0 ldi r19, 0x00 ; 0 a |= (*bufPtr++) << 8; 1f0c: 11 96 adiw r26, 0x01 ; 1 1f0e: 8c 91 ld r24, X 1f10: 11 97 sbiw r26, 0x01 ; 1 1f12: 90 e0 ldi r25, 0x00 ; 0 1f14: 98 2f mov r25, r24 1f16: 88 27 eor r24, r24 1f18: 82 2b or r24, r18 1f1a: 93 2b or r25, r19 #define rstVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+4)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #endif /* main program starts here */ int main(void) { 1f1c: 12 96 adiw r26, 0x02 ; 2 ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; a |= (*bufPtr++) << 8; __boot_page_fill_short((uint16_t)(void*)addrPtr,a); 1f1e: fa 01 movw r30, r20 1f20: 0c 01 movw r0, r24 1f22: 87 be out 0x37, r8 ; 55 1f24: e8 95 spm 1f26: 11 24 eor r1, r1 addrPtr += 2; 1f28: 4e 5f subi r20, 0xFE ; 254 1f2a: 5f 4f sbci r21, 0xFF ; 255 } while (--ch); 1f2c: f1 e0 ldi r31, 0x01 ; 1 1f2e: a0 34 cpi r26, 0x40 ; 64 1f30: bf 07 cpc r27, r31 1f32: 51 f7 brne .-44 ; 0x1f08 // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); 1f34: f6 01 movw r30, r12 1f36: a7 be out 0x37, r10 ; 55 1f38: e8 95 spm boot_spm_busy_wait(); 1f3a: 07 b6 in r0, 0x37 ; 55 1f3c: 00 fc sbrc r0, 0 1f3e: fd cf rjmp .-6 ; 0x1f3a #if defined(RWWSRE) // Reenable read access to flash boot_rww_enable(); 1f40: 97 be out 0x37, r9 ; 55 1f42: e8 95 spm 1f44: 26 c0 rjmp .+76 ; 0x1f92 #endif } /* Read memory block mode, length is big endian. */ else if(ch == STK_READ_PAGE) { 1f46: 84 37 cpi r24, 0x74 ; 116 1f48: b1 f4 brne .+44 ; 0x1f76 // READ PAGE - we only read flash getch(); /* getlen() */ 1f4a: 2a d0 rcall .+84 ; 0x1fa0 length = getch(); 1f4c: 29 d0 rcall .+82 ; 0x1fa0 1f4e: f8 2e mov r15, r24 getch(); 1f50: 27 d0 rcall .+78 ; 0x1fa0 verifySpace(); 1f52: 31 d0 rcall .+98 ; 0x1fb6 1f54: f6 01 movw r30, r12 1f56: ef 2c mov r14, r15 putch(result); address++; } while (--length); #else do putch(pgm_read_byte_near(address++)); 1f58: 8f 01 movw r16, r30 1f5a: 0f 5f subi r16, 0xFF ; 255 1f5c: 1f 4f sbci r17, 0xFF ; 255 1f5e: 84 91 lpm r24, Z+ 1f60: 1b d0 rcall .+54 ; 0x1f98 while (--length); 1f62: ea 94 dec r14 1f64: f8 01 movw r30, r16 1f66: c1 f7 brne .-16 ; 0x1f58 #define rstVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+4)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #endif /* main program starts here */ int main(void) { 1f68: 08 94 sec 1f6a: c1 1c adc r12, r1 1f6c: d1 1c adc r13, r1 1f6e: fa 94 dec r15 1f70: cf 0c add r12, r15 1f72: d1 1c adc r13, r1 1f74: 0e c0 rjmp .+28 ; 0x1f92 #endif #endif } /* Get device signature bytes */ else if(ch == STK_READ_SIGN) { 1f76: 85 37 cpi r24, 0x75 ; 117 1f78: 39 f4 brne .+14 ; 0x1f88 // READ SIGN - return what Avrdude wants to hear verifySpace(); 1f7a: 1d d0 rcall .+58 ; 0x1fb6 putch(SIGNATURE_0); 1f7c: 8e e1 ldi r24, 0x1E ; 30 1f7e: 0c d0 rcall .+24 ; 0x1f98 putch(SIGNATURE_1); 1f80: 83 e9 ldi r24, 0x93 ; 147 1f82: 0a d0 rcall .+20 ; 0x1f98 putch(SIGNATURE_2); 1f84: 87 e0 ldi r24, 0x07 ; 7 1f86: 7a cf rjmp .-268 ; 0x1e7c } else if (ch == 'Q') { 1f88: 81 35 cpi r24, 0x51 ; 81 1f8a: 11 f4 brne .+4 ; 0x1f90 // Adaboot no-wait mod watchdogConfig(WATCHDOG_16MS); 1f8c: 88 e0 ldi r24, 0x08 ; 8 1f8e: 0f d0 rcall .+30 ; 0x1fae verifySpace(); } else { // This covers the response to commands like STK_ENTER_PROGMODE verifySpace(); 1f90: 12 d0 rcall .+36 ; 0x1fb6 } putch(STK_OK); 1f92: 80 e1 ldi r24, 0x10 ; 16 1f94: 01 d0 rcall .+2 ; 0x1f98 1f96: 65 cf rjmp .-310 ; 0x1e62 00001f98 : } } void putch(char ch) { #ifndef SOFT_UART while (!(UCSR0A & _BV(UDRE0))); 1f98: 5d 9b sbis 0x0b, 5 ; 11 1f9a: fe cf rjmp .-4 ; 0x1f98 UDR0 = ch; 1f9c: 8c b9 out 0x0c, r24 ; 12 [uartBit] "I" (UART_TX_BIT) : "r25" ); #endif } 1f9e: 08 95 ret 00001fa0 : [uartBit] "I" (UART_RX_BIT) : "r25" ); #else while(!(UCSR0A & _BV(RXC0))) 1fa0: 5f 9b sbis 0x0b, 7 ; 11 1fa2: fe cf rjmp .-4 ; 0x1fa0 ; if (!(UCSR0A & _BV(FE0))) { 1fa4: 5c 99 sbic 0x0b, 4 ; 11 1fa6: 01 c0 rjmp .+2 ; 0x1faa } #endif // Watchdog functions. These are only safe with interrupts turned off. void watchdogReset() { __asm__ __volatile__ ( 1fa8: a8 95 wdr * don't care that an invalid char is returned...) */ watchdogReset(); } ch = UDR0; 1faa: 8c b1 in r24, 0x0c ; 12 LED_PIN |= _BV(LED); #endif #endif return ch; } 1fac: 08 95 ret 00001fae : "wdr\n" ); } void watchdogConfig(uint8_t x) { WDTCSR = _BV(WDCE) | _BV(WDE); 1fae: 98 e1 ldi r25, 0x18 ; 24 1fb0: 91 bd out 0x21, r25 ; 33 WDTCSR = x; 1fb2: 81 bd out 0x21, r24 ; 33 } 1fb4: 08 95 ret 00001fb6 : do getch(); while (--count); verifySpace(); } void verifySpace() { if (getch() != CRC_EOP) { 1fb6: f4 df rcall .-24 ; 0x1fa0 1fb8: 80 32 cpi r24, 0x20 ; 32 1fba: 19 f0 breq .+6 ; 0x1fc2 watchdogConfig(WATCHDOG_16MS); // shorten WD timeout 1fbc: 88 e0 ldi r24, 0x08 ; 8 1fbe: f7 df rcall .-18 ; 0x1fae 1fc0: ff cf rjmp .-2 ; 0x1fc0 while (1) // and busy-loop so that WD causes ; // a reset and app start. } putch(STK_INSYNC); 1fc2: 84 e1 ldi r24, 0x14 ; 20 } 1fc4: e9 cf rjmp .-46 ; 0x1f98 00001fc6 : ::[count] "M" (UART_B_VALUE) ); } #endif void getNch(uint8_t count) { 1fc6: 1f 93 push r17 1fc8: 18 2f mov r17, r24 do getch(); while (--count); 1fca: ea df rcall .-44 ; 0x1fa0 1fcc: 11 50 subi r17, 0x01 ; 1 1fce: e9 f7 brne .-6 ; 0x1fca verifySpace(); 1fd0: f2 df rcall .-28 ; 0x1fb6 } 1fd2: 1f 91 pop r17 1fd4: 08 95 ret 00001fd6 : WDTCSR = _BV(WDCE) | _BV(WDE); WDTCSR = x; } void appStart() { watchdogConfig(WATCHDOG_OFF); 1fd6: 80 e0 ldi r24, 0x00 ; 0 1fd8: ea df rcall .-44 ; 0x1fae __asm__ __volatile__ ( 1fda: ee 27 eor r30, r30 1fdc: ff 27 eor r31, r31 1fde: 09 94 ijmp ================================================ FILE: external/arduino/avr/bootloaders/optiboot/pin_defs.h ================================================ #if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega88) || defined(__AVR_ATmega8__) || defined(__AVR_ATmega88__) /* Onboard LED is connected to pin PB5 in Arduino NG, Diecimila, and Duemilanove */ #define LED_DDR DDRB #define LED_PORT PORTB #define LED_PIN PINB #define LED PINB5 /* Ports for soft UART */ #ifdef SOFT_UART #define UART_PORT PORTD #define UART_PIN PIND #define UART_DDR DDRD #define UART_TX_BIT 1 #define UART_RX_BIT 0 #endif #endif #if defined(__AVR_ATmega8__) //Name conversion R.Wiersma #define UCSR0A UCSRA #define UDR0 UDR #define UDRE0 UDRE #define RXC0 RXC #define FE0 FE #define TIFR1 TIFR #define WDTCSR WDTCR #endif /* Luminet support */ #if defined(__AVR_ATtiny84__) /* Red LED is connected to pin PA4 */ #define LED_DDR DDRA #define LED_PORT PORTA #define LED_PIN PINA #define LED PINA4 /* Ports for soft UART - left port only for now. TX/RX on PA2/PA3 */ #ifdef SOFT_UART #define UART_PORT PORTA #define UART_PIN PINA #define UART_DDR DDRA #define UART_TX_BIT 2 #define UART_RX_BIT 3 #endif #endif /* Sanguino support */ #if defined(__AVR_ATmega644P__) /* Onboard LED is connected to pin PB0 on Sanguino */ #define LED_DDR DDRB #define LED_PORT PORTB #define LED_PIN PINB #define LED PINB0 /* Ports for soft UART */ #ifdef SOFT_UART #define UART_PORT PORTD #define UART_PIN PIND #define UART_DDR DDRD #define UART_TX_BIT 1 #define UART_RX_BIT 0 #endif #endif /* Mega support */ #if defined(__AVR_ATmega1280__) /* Onboard LED is connected to pin PB7 on Arduino Mega */ #define LED_DDR DDRB #define LED_PORT PORTB #define LED_PIN PINB #define LED PINB7 /* Ports for soft UART */ #ifdef SOFT_UART #define UART_PORT PORTE #define UART_PIN PINE #define UART_DDR DDRE #define UART_TX_BIT 1 #define UART_RX_BIT 0 #endif #endif ================================================ FILE: external/arduino/avr/bootloaders/optiboot/stk500.h ================================================ /* STK500 constants list, from AVRDUDE */ #define STK_OK 0x10 #define STK_FAILED 0x11 // Not used #define STK_UNKNOWN 0x12 // Not used #define STK_NODEVICE 0x13 // Not used #define STK_INSYNC 0x14 // ' ' #define STK_NOSYNC 0x15 // Not used #define ADC_CHANNEL_ERROR 0x16 // Not used #define ADC_MEASURE_OK 0x17 // Not used #define PWM_CHANNEL_ERROR 0x18 // Not used #define PWM_ADJUST_OK 0x19 // Not used #define CRC_EOP 0x20 // 'SPACE' #define STK_GET_SYNC 0x30 // '0' #define STK_GET_SIGN_ON 0x31 // '1' #define STK_SET_PARAMETER 0x40 // '@' #define STK_GET_PARAMETER 0x41 // 'A' #define STK_SET_DEVICE 0x42 // 'B' #define STK_SET_DEVICE_EXT 0x45 // 'E' #define STK_ENTER_PROGMODE 0x50 // 'P' #define STK_LEAVE_PROGMODE 0x51 // 'Q' #define STK_CHIP_ERASE 0x52 // 'R' #define STK_CHECK_AUTOINC 0x53 // 'S' #define STK_LOAD_ADDRESS 0x55 // 'U' #define STK_UNIVERSAL 0x56 // 'V' #define STK_PROG_FLASH 0x60 // '`' #define STK_PROG_DATA 0x61 // 'a' #define STK_PROG_FUSE 0x62 // 'b' #define STK_PROG_LOCK 0x63 // 'c' #define STK_PROG_PAGE 0x64 // 'd' #define STK_PROG_FUSE_EXT 0x65 // 'e' #define STK_READ_FLASH 0x70 // 'p' #define STK_READ_DATA 0x71 // 'q' #define STK_READ_FUSE 0x72 // 'r' #define STK_READ_LOCK 0x73 // 's' #define STK_READ_PAGE 0x74 // 't' #define STK_READ_SIGN 0x75 // 'u' #define STK_READ_OSCCAL 0x76 // 'v' #define STK_READ_FUSE_EXT 0x77 // 'w' #define STK_READ_OSCCAL_EXT 0x78 // 'x' ================================================ FILE: external/arduino/avr/bootloaders/stk500v2/License.txt ================================================ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS ================================================ FILE: external/arduino/avr/bootloaders/stk500v2/Makefile ================================================ # ---------------------------------------------------------------------------- # Makefile to compile and link stk500boot bootloader # Author: Peter Fleury # based on WinAVR Makefile Template written by Eric B. Weddington, Jrg Wunsch, et al. # # Adjust F_CPU below to the clock frequency in Mhz of your AVR target # Adjust BOOTLOADER_ADDRESS to your AVR target # #---------------------------------------------------------------------------- # On command line: # # make all = Make software. # # make clean = Clean out built project files. # # make coff = Convert ELF to AVR COFF. # # make extcoff = Convert ELF to AVR Extended COFF. # # make program = Download the hex file to the device, using avrdude. # Please customize the avrdude settings below first! # # make debug = Start either simulavr or avarice as specified for debugging, # with avr-gdb or avr-insight as the front end for debugging. # # make filename.s = Just compile filename.c into the assembler code only. # # make filename.i = Create a preprocessed source file for use in submitting # bug reports to the GCC project. # # To rebuild project do "make clean" then "make all". #---------------------------------------------------------------------------- # = Mark Sproul msproul-at-skychariot.com # MCU name #MCU = atmega128 # Processor frequency. # This will define a symbol, F_CPU, in all source code files equal to the # processor frequency. You can then use this symbol in your source code to # calculate timings. Do NOT tack on a 'UL' at the end, this will be done # automatically to create a 32-bit value in your source code. #F_CPU = 16000000 # Bootloader # Please adjust if using a different AVR # 0x0e00*2=0x1C00 for ATmega8 512 words Boot Size # 0xFC00*2=0x1F800 for ATmega128 1024 words Boot Size # 0xF800*2=0x1F000 for ATmega1280 # 0xF000*2=0x1E000 for ATmega1280 #BOOTLOADER_ADDRESS = 1E000 # Output format. (can be srec, ihex, binary) FORMAT = ihex # Target file name (without extension). TARGET = stk500boot # List C source files here. (C dependencies are automatically generated.) SRC = stk500boot.c # List Assembler source files here. # Make them always end in a capital .S. Files ending in a lowercase .s # will not be considered source files but generated files (assembler # output from the compiler), and will be deleted upon "make clean"! # Even though the DOS/Win* filesystem matches both .s and .S the same, # it will preserve the spelling of the filenames, and gcc itself does # care about how the name is spelled on its command-line. ASRC = # Optimization level, can be [0, 1, 2, 3, s]. # 0 = turn off optimization. s = optimize for size. # (Note: 3 is not always the best optimization level. See avr-libc FAQ.) OPT = s # Debugging format. # Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. # AVR Studio 4.10 requires dwarf-2. # AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. DEBUG = dwarf-2 # List any extra directories to look for include files here. # Each directory must be seperated by a space. # Use forward slashes for directory separators. # For a directory that has spaces, enclose it in quotes. EXTRAINCDIRS = # Compiler flag to set the C Standard level. # c89 = "ANSI" C # gnu89 = c89 plus GCC extensions # c99 = ISO C99 standard (not yet fully implemented) # gnu99 = c99 plus GCC extensions CSTANDARD = -std=gnu99 # Place -D or -U options here CDEFS = -DF_CPU=$(F_CPU)UL # Place -I options here CINCS = #---------------- Compiler Options ---------------- # -g*: generate debugging information # -O*: optimization level # -f...: tuning, see GCC manual and avr-libc documentation # -Wall...: warning level # -Wa,...: tell GCC to pass this to the assembler. # -adhlns...: create assembler listing CFLAGS = -g$(DEBUG) CFLAGS += $(CDEFS) $(CINCS) CFLAGS += -O$(OPT) CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -fno-jump-tables CFLAGS += -Wall -Wstrict-prototypes CFLAGS += -Wa,-adhlns=$(<:.c=.lst) CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) CFLAGS += $(CSTANDARD) #---------------- Assembler Options ---------------- # -Wa,...: tell GCC to pass this to the assembler. # -ahlms: create listing # -gstabs: have the assembler create line number information; note that # for use in COFF files, additional information about filenames # and function names needs to be present in the assembler source # files -- see avr-libc docs [FIXME: not yet described there] ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs #---------------- Library Options ---------------- # Minimalistic printf version PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min # Floating point printf version (requires MATH_LIB = -lm below) PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt # If this is left blank, then it will use the Standard printf version. PRINTF_LIB = #PRINTF_LIB = $(PRINTF_LIB_MIN) #PRINTF_LIB = $(PRINTF_LIB_FLOAT) # Minimalistic scanf version SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min # Floating point + %[ scanf version (requires MATH_LIB = -lm below) SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt # If this is left blank, then it will use the Standard scanf version. SCANF_LIB = #SCANF_LIB = $(SCANF_LIB_MIN) #SCANF_LIB = $(SCANF_LIB_FLOAT) MATH_LIB = -lm #---------------- External Memory Options ---------------- # 64 KB of external RAM, starting after internal RAM (ATmega128!), # used for variables (.data/.bss) and heap (malloc()). #EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff # 64 KB of external RAM, starting after internal RAM (ATmega128!), # only used for heap (malloc()). #EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff EXTMEMOPTS = #---------------- Linker Options ---------------- # -Wl,...: tell GCC to pass this to linker. # -Map: create map file # --cref: add cross reference to map file LDFLAGS = -Wl,-Map=$(TARGET).map,--cref LDFLAGS += $(EXTMEMOPTS) LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) #--------------- bootloader linker Options ------- # BOOTLOADER_ADDRESS (=Start of Boot Loader section # in bytes - not words) is defined above. #LDFLAGS += -Wl,--section-start=.text=$(BOOTLOADER_ADDRESS) -nostartfiles -nodefaultlibs #LDFLAGS += -Wl,--section-start=.text=$(BOOTLOADER_ADDRESS) -nostartfiles LDFLAGS += -Wl,--section-start=.text=$(BOOTLOADER_ADDRESS) #---------------- Programming Options (avrdude) ---------------- # Programming hardware: alf avr910 avrisp bascom bsd # dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 # # Type: avrdude -c ? # to get a full listing. # AVRDUDE_PROGRAMMER = stk500v2 # com1 = serial port. Use lpt1 to connect to parallel port. AVRDUDE_PORT = com1 # programmer connected to serial device AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex #AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep # Uncomment the following if you want avrdude's erase cycle counter. # Note that this counter needs to be initialized first using -Yn, # see avrdude manual. #AVRDUDE_ERASE_COUNTER = -y # Uncomment the following if you do /not/ wish a verification to be # performed after programming the device. #AVRDUDE_NO_VERIFY = -V # Increase verbosity level. Please use this when submitting bug # reports about avrdude. See # to submit bug reports. #AVRDUDE_VERBOSE = -v -v AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) #---------------- Debugging Options ---------------- # For simulavr only - target MCU frequency. DEBUG_MFREQ = $(F_CPU) # Set the DEBUG_UI to either gdb or insight. # DEBUG_UI = gdb DEBUG_UI = insight # Set the debugging back-end to either avarice, simulavr. DEBUG_BACKEND = avarice #DEBUG_BACKEND = simulavr # GDB Init Filename. GDBINIT_FILE = __avr_gdbinit # When using avarice settings for the JTAG JTAG_DEV = /dev/com1 # Debugging port used to communicate between GDB / avarice / simulavr. DEBUG_PORT = 4242 # Debugging host used to communicate between GDB / avarice / simulavr, normally # just set to localhost unless doing some sort of crazy debugging when # avarice is running on a different computer. DEBUG_HOST = localhost #============================================================================ # Define programs and commands. SHELL = sh CC = avr-gcc OBJCOPY = avr-objcopy OBJDUMP = avr-objdump SIZE = avr-size NM = avr-nm AVRDUDE = avrdude REMOVE = rm -f COPY = cp WINSHELL = cmd # Define Messages # English MSG_ERRORS_NONE = Errors: none MSG_BEGIN = -------- begin -------- MSG_END = -------- end -------- MSG_SIZE_BEFORE = Size before: MSG_SIZE_AFTER = Size after: MSG_COFF = Converting to AVR COFF: MSG_EXTENDED_COFF = Converting to AVR Extended COFF: MSG_FLASH = Creating load file for Flash: MSG_EEPROM = Creating load file for EEPROM: MSG_EXTENDED_LISTING = Creating Extended Listing: MSG_SYMBOL_TABLE = Creating Symbol Table: MSG_LINKING = Linking: MSG_COMPILING = Compiling: MSG_ASSEMBLING = Assembling: MSG_CLEANING = Cleaning project: # Define all object files. OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) # Define all listing files. LST = $(SRC:.c=.lst) $(ASRC:.S=.lst) # Compiler flags to generate dependency files. GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d # Combine all necessary flags and optional flags. # Add target processor to flags. ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) ############################################################ # May 25, 2010 Adding 1280 support mega1280: MCU = atmega1280 mega1280: F_CPU = 16000000 mega1280: BOOTLOADER_ADDRESS = 1E000 mega1280: CFLAGS += -D_MEGA_BOARD_ mega1280: begin gccversion sizebefore build sizeafter end mv $(TARGET).hex stk500boot_v2_mega1280.hex ############################################################ # Jul 6, 2010 Adding 2560 support mega2560: MCU = atmega2560 mega2560: F_CPU = 16000000 mega2560: BOOTLOADER_ADDRESS = 3E000 mega2560: CFLAGS += -D_MEGA_BOARD_ mega2560: begin gccversion sizebefore build sizeafter end mv $(TARGET).hex stk500boot_v2_mega2560.hex ############################################################ #Initial config on Amber128 board # avrdude: Device signature = 0x1e9702 # avrdude: safemode: lfuse reads as 8F # avrdude: safemode: hfuse reads as CB # avrdude: safemode: efuse reads as FF # Jul 17, 2010 Adding 128 support ############################################################ amber128: MCU = atmega128 #amber128: F_CPU = 16000000 amber128: F_CPU = 14745600 amber128: BOOTLOADER_ADDRESS = 1E000 amber128: CFLAGS += -D_BOARD_AMBER128_ amber128: begin gccversion sizebefore build sizeafter end mv $(TARGET).hex stk500boot_v2_amber128.hex ############################################################ # Aug 23, 2010 Adding atmega2561 support m2561: MCU = atmega2561 m2561: F_CPU = 8000000 m2561: BOOTLOADER_ADDRESS = 3E000 m2561: CFLAGS += -D_ANDROID_2561_ -DBAUDRATE=57600 m2561: begin gccversion sizebefore build sizeafter end mv $(TARGET).hex stk500boot_v2_android2561.hex ############################################################ # avrdude: Device signature = 0x1e9801 # avrdude: safemode: lfuse reads as EC # avrdude: safemode: hfuse reads as 18 # avrdude: safemode: efuse reads as FD # Aug 23, 2010 Adding cerebot 2560 @ 8mhz #avrdude -P usb -c usbtiny -p m2560 -v -U flash:w:/Arduino/WiringBootV2_upd1/stk500boot_v2_cerebotplus.hex ############################################################ cerebot: MCU = atmega2560 cerebot: F_CPU = 8000000 cerebot: BOOTLOADER_ADDRESS = 3E000 cerebot: CFLAGS += -D_CEREBOTPLUS_BOARD_ -DBAUDRATE=38400 -DUART_BAUDRATE_DOUBLE_SPEED=1 cerebot: begin gccversion sizebefore build sizeafter end mv $(TARGET).hex stk500boot_v2_cerebotplus.hex ############################################################ # Aug 23, 2010 Adding atmega2561 support penguino: MCU = atmega32 penguino: F_CPU = 16000000 penguino: BOOTLOADER_ADDRESS = 7800 penguino: CFLAGS += -D_PENGUINO_ -DBAUDRATE=57600 penguino: begin gccversion sizebefore build sizeafter end mv $(TARGET).hex stk500boot_v2_penguino.hex # Default target. all: begin gccversion sizebefore build sizeafter end build: elf hex eep lss sym #build: hex eep lss sym elf: $(TARGET).elf hex: $(TARGET).hex eep: $(TARGET).eep lss: $(TARGET).lss sym: $(TARGET).sym # Eye candy. # AVR Studio 3.x does not check make's exit code but relies on # the following magic strings to be generated by the compile job. begin: @echo @echo $(MSG_BEGIN) end: @echo $(MSG_END) @echo # Display size of file. HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex ELFSIZE = $(SIZE) --format=avr --mcu=$(MCU) $(TARGET).elf sizebefore: @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ 2>/dev/null; echo; fi sizeafter: @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ 2>/dev/null; echo; fi # Display compiler version information. gccversion : @$(CC) --version # Program the device. program: $(TARGET).hex $(TARGET).eep $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) # Generate avr-gdb config/init file which does the following: # define the reset signal, load the target file, connect to target, and set # a breakpoint at main(). gdb-config: @$(REMOVE) $(GDBINIT_FILE) @echo define reset >> $(GDBINIT_FILE) @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) @echo end >> $(GDBINIT_FILE) @echo file $(TARGET).elf >> $(GDBINIT_FILE) @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) ifeq ($(DEBUG_BACKEND),simulavr) @echo load >> $(GDBINIT_FILE) endif @echo break main >> $(GDBINIT_FILE) debug: gdb-config $(TARGET).elf ifeq ($(DEBUG_BACKEND), avarice) @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) @$(WINSHELL) /c pause else @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ $(DEBUG_MFREQ) --port $(DEBUG_PORT) endif @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) # Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. COFFCONVERT=$(OBJCOPY) --debugging \ --change-section-address .data-0x800000 \ --change-section-address .bss-0x800000 \ --change-section-address .noinit-0x800000 \ --change-section-address .eeprom-0x810000 coff: $(TARGET).elf @echo @echo $(MSG_COFF) $(TARGET).cof $(COFFCONVERT) -O coff-avr $< $(TARGET).cof extcoff: $(TARGET).elf @echo @echo $(MSG_EXTENDED_COFF) $(TARGET).cof $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof # Create final output files (.hex, .eep) from ELF output file. %.hex: %.elf @echo @echo $(MSG_FLASH) $@ $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ %.eep: %.elf @echo @echo $(MSG_EEPROM) $@ -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ --change-section-lma .eeprom=0 -O $(FORMAT) $< $@ # Create extended listing file from ELF output file. %.lss: %.elf @echo @echo $(MSG_EXTENDED_LISTING) $@ $(OBJDUMP) -h -S $< > $@ # Create a symbol table from ELF output file. %.sym: %.elf @echo @echo $(MSG_SYMBOL_TABLE) $@ $(NM) -n $< > $@ # Link: create ELF output file from object files. .SECONDARY : $(TARGET).elf .PRECIOUS : $(OBJ) %.elf: $(OBJ) @echo @echo $(MSG_LINKING) $@ $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) # Compile: create object files from C source files. %.o : %.c @echo @echo $(MSG_COMPILING) $< $(CC) -c $(ALL_CFLAGS) $< -o $@ # Compile: create assembler files from C source files. %.s : %.c $(CC) -S $(ALL_CFLAGS) $< -o $@ # Assemble: create object files from assembler source files. %.o : %.S @echo @echo $(MSG_ASSEMBLING) $< $(CC) -c $(ALL_ASFLAGS) $< -o $@ # Create preprocessed source for use in sending a bug report. %.i : %.c $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ # Target: clean project. clean: begin clean_list end clean_list : @echo @echo $(MSG_CLEANING) $(REMOVE) *.hex $(REMOVE) *.eep $(REMOVE) *.cof $(REMOVE) *.elf $(REMOVE) *.map $(REMOVE) *.sym $(REMOVE) *.lss $(REMOVE) $(OBJ) $(REMOVE) $(LST) $(REMOVE) $(SRC:.c=.s) $(REMOVE) $(SRC:.c=.d) $(REMOVE) .dep/* # Include the dependency files. -include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) # Listing of phony targets. .PHONY : all begin finish end sizebefore sizeafter gccversion \ build elf hex eep lss sym coff extcoff \ clean clean_list program debug gdb-config ================================================ FILE: external/arduino/avr/bootloaders/stk500v2/Mega2560-prod-firmware-2011-06-29.hex ================================================ :020000023000CC :10E000000D94F6F20D941FF30D941FF30D941FF36E :10E010000D941FF30D941FF30D941FF30D941FF334 :10E020000D941FF30D941FF30D941FF30D941FF324 :10E030000D941FF30D941FF30D941FF30D941FF314 :10E040000D941FF30D941FF30D941FF30D941FF304 :10E050000D941FF30D941FF30D941FF30D941FF3F4 :10E060000D941FF30D941FF30D941FF30D941FF3E4 :10E070000D941FF30D941FF30D941FF30D941FF3D4 :10E080000D941FF30D941FF30D941FF30D941FF3C4 :10E090000D941FF30D941FF30D941FF30D941FF3B4 :10E0A0000D941FF30D941FF30D941FF30D941FF3A4 :10E0B0000D941FF30D941FF30D941FF30D941FF394 :10E0C0000D941FF30D941FF30D941FF30D941FF384 :10E0D0000D941FF30D941FF30D941FF30D941FF374 :10E0E0000D941FF341546D65676132353630004140 :10E0F000726475696E6F206578706C6F72657220DE :10E1000073746B3530305632206279204D4C530099 :10E11000426F6F746C6F616465723E004875683F52 :10E1200000436F6D70696C6564206F6E20203D2028 :10E1300000435055205479706520202020203D2038 :10E14000005F5F4156525F415243485F5F203D2070 :10E1500000415652204C69624320566572203D2092 :10E16000004743432056657273696F6E20203D203F :10E1700000435055207369676E61747572653D2068 :10E18000004C6F77206675736520202020203D208D :10E1900000486967682066757365202020203D204F :10E1A00000457874206675736520202020203D206E :10E1B000004C6F636B2066757365202020203D2026 :10E1C00000536570202039203230313000312E3636 :10E1D0002E3700342E332E33005623202020414486 :10E1E00044522020206F7020636F6465202020201F :10E1F00020696E737472756374696F6E20616464F4 :10E2000072202020496E74657272757074006E6F92 :10E2100020766563746F7200726A6D702020006AE8 :10E220006D7020005768617420706F72743A0050EE :10E230006F7274206E6F7420737570706F72746576 :10E2400064004D7573742062652061206C65747480 :10E2500065720020005772697474696E67204545C5 :10E260000052656164696E6720454500656570729E :10E270006F6D206572726F7220636F756E743D00F2 :10E28000504F525400303D5A65726F206164647281 :10E290006573732063747273003F3D435055207360 :10E2A0007461747300403D454550524F4D20746574 :10E2B000737400423D426C696E6B204C45440045CE :10E2C0003D44756D7020454550524F4D00463D44CC :10E2D000756D7020464C41534800483D48656C7050 :10E2E000004C3D4C69737420492F4F20506F72745D :10E2F0007300513D517569742026206A756D702038 :10E30000746F20757365722070676D00523D44759F :10E310006D702052414D00563D73686F7720696ED5 :10E320007465727275707420566563746F727300D1 :10E33000593D506F727420626C696E6B002A0052F6 :10E340004553455400494E543000494E543100491C :10E350004E543200494E543300494E543400494E15 :10E36000543500494E543600494E54370050434905 :10E370004E5430005043494E5431005043494E549E :10E3800032005744540054494D45523020434F4DBC :10E3900050410054494D45523020434F4D504200AA :10E3A00054494D455230204F56460054494D455230 :10E3B0003120434150540054494D45523120434F80 :10E3C0004D50410054494D45523120434F4D50422C :10E3D0000054494D45523120434F4D50430054495C :10E3E0004D455231204F56460054494D455232203A :10E3F000434F4D50410054494D45523220434F4DFB :10E4000050420054494D455232204F56460054491F :10E410004D45523320434150540054494D455233E9 :10E4200020434F4D50410054494D45523320434FF6 :10E430004D50420054494D45523320434F4D5043B7 :10E440000054494D455233204F56460054494D45DE :10E45000523420434150540054494D4552342043D6 :10E460004F4D50410054494D45523420434F4D507B :10E47000420054494D45523420434F4D50430054BF :10E48000494D455234204F56460054494D4552356A :10E4900020434150540054494D45523520434F4D7F :10E4A00050410054494D45523520434F4D50420094 :10E4B00054494D45523520434F4D50430054494D2A :10E4C000455235204F564600555341525430205244 :10E4D000580055534152543020554452450055532D :10E4E0004152543020545800555341525431205217 :10E4F000580055534152543120554452450055530C :10E5000041525431205458005553415254322052F4 :10E5100058005553415254322055445245005553EA :10E5200041525432205458005553415254332052D2 :10E5300058005553415254332055445245005553C9 :10E5400041525433205458005350492053544300EF :10E5500041444300414E414C4F4720434F4D5000F2 :10E560004545205245414459005457490053504DA8 :10E57000205245414459002A003FE345E34AE34F16 :10E58000E354E359E35EE363E368E36DE374E37B41 :10E59000E382E3E9E3F6E303E4ABE3B7E3C4E3D107 :10E5A000E3DEE386E393E3A0E348E5C8E4D2E4DEF8 :10E5B000E454E550E560E50EE41AE427E434E44170 :10E5C000E4E8E4F2E4FEE469E56DE54CE458E46572 :10E5D000E472E47FE48AE496E4A3E4B0E4BDE408F2 :10E5E000E512E51EE528E532E53EE50011241FBEF3 :10E5F000CFEFD1E2DEBFCDBF01E00CBF12E0A0E063 :10E60000B2E0EAEDFFEF03E00BBF02C007900D920E :10E61000A030B107D9F712E0A0E0B2E001C01D922E :10E62000AC30B107E1F70F94FBF40D94EBFF01E27E :10E630000EBF0FEF0DBF11241FBE0D94FBF40D9400 :10E6400000F020E030E040ED57E005C0FA013197DE :10E65000F1F72F5F3F4F28173907C0F308959C014A :10E66000442737FD4095542FDA01C901860F911DCB :10E67000A11DB11DABBFFC018791882369F0809378 :10E68000C6008091C00086FFFCCF8091C0008064EE :10E690008093C0006F5FE8CF08958DE08093C6003F :10E6A0008091C00086FFFCCF8091C0008064809381 :10E6B000C0008AE08093C6008091C00086FFFCCF36 :10E6C0008091C00080648093C00008950F942FF360 :10E6D0000F944DF30895FC019081992359F0909384 :10E6E000C6008091C00086FFFCCF8091C00080648E :10E6F0008093C0003196992379F70895282F982F99 :10E7000092959F70892F805D8A3308F0895F80938E :10E71000C6008091C00086FFFCCF8091C00080645D :10E720008093C000822F8F70982F905D9A3308F0ED :10E73000995F9093C6008091C00086FFFCCF8091C6 :10E74000C00080648093C00008959C01FB01853661 :10E7500091051CF46330710594F0C90164E670E022 :10E760000F948CFF605D7F4F6093C6008091C00066 :10E7700086FFFCCF8091C00080648093C0002B3066 :10E78000310514F43297B4F0C90164E670E00F94D7 :10E790008CFF6AE070E00F948CFF605D7F4F6093A8 :10E7A000C6008091C00086FFFCCF8091C0008064CD :10E7B0008093C000C9016AE070E00F948CFFC0969E :10E7C0008093C6008091C00086FFFCCF8091C0007E :10E7D00080648093C0000895282F277020642093C0 :10E7E0007C0020917B0086958695869590E08170CF :10E7F000907033E0880F991F3A95E1F7277F282B17 :10E8000020937B0080917A00806480937A008091CD :10E810007A0086FDFCCF2091780040917900942FFA :10E8200080E030E0282B392BC90108951F93182F61 :10E8300080E892EE60E00F942FF31093C600809171 :10E84000C00086FFFCCF8091C00080648093C00030 :10E850000F944DF31F9108952F923F924F925F9224 :10E860006F927F928F929F92AF92BF92CF92DF92E0 :10E87000EF92FF920F931F93DF93CF93CDB7DEB745 :10E8800062970FB6F894DEBF0FBECDBF382E622E52 :10E89000CA01DB015C016D01772460E2262E2E01A6 :10E8A0000894411C511C8BC081E0A81680E0B8067A :10E8B00081E0C80680E0D80628F0C601AA27BB2759 :10E8C0000F947EF3BB27AD2D9C2D8B2D0F947EF3E3 :10E8D0008A2D0F947EF32092C6008091C00086FF9F :10E8E000FCCF8091C00080648093C0009DE2909333 :10E8F000C6008091C00086FFFCCF8091C00080647C :10E900008093C0002092C6008091C00086FFFCCF9B :10E910008091C00080648093C000198286017501D7 :10E9200088249924A1E03A1651F03A1620F0B2E07A :10E930003B1661F409C00BBFF701779007C0C70110 :10E940000F94D5FF782E02C0F7017080872D0F94A9 :10E950007EF32092C6008091C00086FFFCCF80919C :10E96000C00080648093C000872D8052F401EF7056 :10E97000F0708F3520F4E40DF51D708204C0E40DB5 :10E98000F51D8EE280830894E11CF11C011D111D10 :10E990000894811C911C90E18916910409F0C2CF62 :10E9A00080E190E0A0E0B0E0A80EB91ECA1EDB1E18 :10E9B000198AC2010F946BF30F944DF36A94662089 :10E9C00009F072CF62960FB6F894DEBF0FBECDBFCE :10E9D000CF91DF911F910F91FF90EF90DF90CF903B :10E9E000BF90AF909F908F907F906F905F904F906F :10E9F0003F902F9008952F923F924F925F926F9287 :10EA00007F928F929F92AF92BF92CF92DF92EF92BE :10EA1000FF920F931F93DF93CF93CDB7DEB7CD5304 :10EA2000D1400FB6F894DEBF0FBECDBF279A2F9A04 :10EA30008091C00082608093C00080E18093C40018 :10EA400088E18093C1000000EE24FF248701B4E038 :10EA5000AB2EB12CCC24DD2424C0C5010197F1F7E5 :10EA60000894E11CF11C011D111D21E2E2162EE4A7 :10EA7000F20620E0020720E0120718F0A1E0CA2EFB :10EA8000D12CC801B70128E53BE140E050E00F94EC :10EA90009FFF611571058105910519F485B18058B5 :10EAA00085B98091C00087FD03C0C114D104A9F2CB :10EAB000A6014F5F5F4FC25EDE4F59834883CE5140 :10EAC000D140C25EDE4F68817981CE51D140613044 :10EAD000710511F00D946EFFC05DDE4F1982188232 :10EAE000C053D14060E0C15DDE4F1882CF52D140AB :10EAF000AA24BB24C05EDE4F188219821A821B82B0 :10EB0000C052D140CE5CDE4F188219821A821B821D :10EB1000C253D14080E090E0A0E0B0E0ABBFFC0188 :10EB2000A791B691C45CDE4FB983A883CC53D14082 :10EB30000D9469FFC25EDE4FE881F981CE51D1406C :10EB4000319709F52091C600C25EDE4F1982188206 :10EB5000CE51D14022C02F5F3F4F4F4F5F4F2130EA :10EB6000F2E13F07FAE74F07F0E05F0780F0C45C8F :10EB7000DE4F08811981CC53D1400F5F1F4F19F030 :10EB8000EE27FF27099420E030E040E050E080913C :10EB9000C00087FFE0CF2091C600213209F094C663 :10EBA0000894A11CB11C33E0A316B10409F08EC671 :10EBB00000E010E018C041E24093C6008091C00020 :10EBC00086FFFCCF8091C00080648093C0002F5FDF :10EBD0003F4F2931310579F70F944DF30F5F1F4FE8 :10EBE0000530110519F020E030E0E5CF1092080261 :10EBF0001092090210920A0210920B021092040263 :10EC00001092050210920602109207021092000262 :10EC10001092010210920202109203028FEE90EE07 :10EC200060E00F9466F380E191EE60E00F942FF3C3 :10EC30008091C00087FFFCCF9091C600903608F00D :10EC40009F759032B8F09093C6008091C00086FF07 :10EC5000FCCF8091C00080648093C00080E28093EC :10EC6000C6008091C00086FFFCCF8091C000806408 :10EC70008093C000983409F4DBC19934B8F492341D :10EC800009F45DC1933458F4903319F1903308F4CA :10EC900018C69F33A1F1903409F013C6BDC0953456 :10ECA00009F474C1963409F00CC69CC1923509F47C :10ECB0002FC2933538F49C3409F4F9C1913509F029 :10ECC00000C61CC2963509F449C2993509F0F9C548 :10ECD0009CC485E892EE62E00F9466F31092040201 :10ECE000109205021092060210920702109208027A :10ECF0001092090210920A0210920B0217C189E9C0 :10ED000092EE62E00F9466F38FEE90EE60E00F9467 :10ED100066F381E291EE60E00F942FF381EC91EEC7 :10ED200060E00F9466F381E391EE60E00F942FF3BF :10ED300084EE90EE60E00F9466F381E491EE60E083 :10ED40000F942FF386E090E061E070E00F94A5F35C :10ED50000F944DF381E691EE60E00F942FF383ED75 :10ED600091EE60E00F9466F381E591EE60E00F9420 :10ED70002FF38DEC91EE60E00F9466F381E791EE56 :10ED800060E00F942FF38EE10F947EF388E90F94E7 :10ED90007EF381E00F947EF30F944DF381E891EEC2 :10EDA00060E00F942FF319E0E0E0F0E010935700DB :10EDB000E4918E2F0F947EF30F944DF381E991EE41 :10EDC00060E00F942FF3E3E0F0E010935700E4913C :10EDD0008E2F0F947EF30F944DF381EA91EE60E055 :10EDE0000F942FF3E2E0F0E010935700E4918E2FA0 :10EDF0000F947EF30F944DF381EB91EE60E00F944E :10EE00002FF3E1E0F0E0109357001491812F0F945D :10EE10007EF30F944DF307CF85EA92EE62E00F94F4 :10EE200066F385E592EE60E00F9466F30F944DF380 :10EE300000E010E019C0C8016F2D0F94DDFFFF2026 :10EE400031F483E592EE60E00F942FF30BC0F09263 :10EE5000C6008091C00086FFFCCF8091C000806416 :10EE60008093C0000F5F1F4FC80181519F41AA27A7 :10EE700097FDA095BA2FABBFFC01F7905AE2F516AB :10EE800021F062E000301607B1F60F944DF30F94B5 :10EE90004DF381E692EE60E00F9466F30F944DF32C :10EEA000CC24DD2400E010E01EC0C8010F94D5FF83 :10EEB000F82E882331F483E592EE60E00F942FF36F :10EEC0000BC08093C6008091C00086FFFCCF80916C :10EED000C00080648093C000FE1419F00894C11C27 :10EEE000D11C0F5F1F4FC80181519F41AA2797FD79 :10EEF000A095BA2FABBFFC01E7907AE2E71621F0AC :10EF000082E00030180789F60F944DF30F944DF30B :10EF10008CE692EE60E00F942FF3C60161E070E0A2 :10EF20000F94A5F30F944DF30F944DF3109200023C :10EF300010920102109202021092030274CE83EB2F :10EF400092EE62E00F9466F3279A2F9A16C02F98DC :10EF500080E090E0E0EDF7E03197F1F7019684363C :10EF60009105C1F72F9A80E090E0E0EDF7E031974E :10EF7000F1F7019684369105C1F78091C00087FFB3 :10EF8000E6CF8091C00087FFFCCF95C48FEB92EE57 :10EF900062E00F9466F3409100025091010260918B :10EFA00002027091030281E020E10F942CF4809121 :10EFB000000290910102A0910202B09103028050E0 :10EFC0009F4FAF4FBF4F8093000290930102A093D9 :10EFD0000202B093030280509041A040B04008F478 :10EFE00022CEA4CF8DEC92EE62E00F9466F34091B6 :10EFF000040250910502609106027091070280E0C0 :10F0000020E10F942CF48091040290910502A091CC :10F010000602B091070280509F4FAF4FBF4F8093C1 :10F02000040290930502A0930602B0930702FBCD61 :10F030008AED92EE62E00F9466F385E892EE60E06E :10F040000F9466F389E992EE60E00F9466F385EA27 :10F0500092EE60E00F9466F383EB92EE60E00F9423 :10F0600066F38FEB92EE60E00F9466F38DEC92EE18 :10F0700060E00F9466F38AED92EE60E00F9466F321 :10F0800081EE92EE60E00F9466F382EF92EE60E024 :10F090000F9466F38CE093EE60E00F9466F387E1E3 :10F0A00093EE60E00F9466F380E393EEB9CD81EECA :10F0B00092EE62E00F9466F381E40F9416F482E41A :10F0C0000F9416F483E40F9416F484E40F9416F46A :10F0D00085E40F9416F486E40F9416F487E40F94F5 :10F0E00016F488E40F9416F48AE40F9416F48BE473 :10F0F0000F9416F48CE40F9416F495CD82EF92EEF3 :10F1000062E00F9466F399249394AA24BB2445C427 :10F110008CE093EE62E00F9466F340910802509108 :10F12000090260910A0270910B0282E020E10F94C3 :10F130002CF48091080290910902A0910A02B091EA :10F140000B0280509F4FAF4FBF4F809308029093A8 :10F150000902A0930A02B0930B0265CD87E193EEFA :10F1600062E00F9466F384EE90EE60E00F9466F335 :10F1700089ED91EE60E00F9466F309E715EECC5D42 :10F18000DE4F19830883C452D1406624772443019B :10F19000CA5DDE4F19821882C652D140A401930184 :10F1A0005695479537952795C85DDE4F2883398357 :10F1B0004A835B83C852D140CA5DDE4F4881598182 :10F1C000C652D1404F5F5F4FCA5DDE4F59834883BF :10F1D000C652D140CA0162E070E00F94A5F350E23C :10F1E0005093C6008091C00086FFFCCF8091C00084 :10F1F00080648093C0006DE26093C6008091C0007F :10F2000086FFFCCF8091C00080648093C00070E2D4 :10F210007093C6008091C00086FFFCCF8091C00033 :10F2200080648093C000C85DDE4FE880F9800A8169 :10F230001B81C852D140BB27A12F902F8F2D0F9437 :10F240007EF3C85DDE4F8881C852D1400F947EF3B3 :10F2500070E2F72EF092C6008091C00086FFFCCFCE :10F260008091C00080648093C0000DE30093C600CD :10F270008091C00086FFFCCF8091C00080648093A5 :10F28000C00010E21093C6008091C00086FFFCCF42 :10F290008091C00080648093C0008BBEF3012791F1 :10F2A000C45DDE4F2883CC52D140A22EBB24CC2497 :10F2B000DD240894611C711C811C911C8BBEF30120 :10F2C0008791282E332444245524142D032DF22C09 :10F2D000EE24EA0CFB1C0C1D1D1D0894611C711C06 :10F2E000811C911C8BBEF3013791C35DDE4F3883C7 :10F2F000CD52D1400894611C711C811C911C8BBEA5 :10F30000F3014791C25DDE4F4883CE52D1402DEFCD :10F310003FEF4FEF5FEF620E731E841E951E0F943A :10F320007EF330E23093C6008091C00086FFFCCFB0 :10F330008091C00080648093C000C45DDE4F8881EE :10F34000CC52D1400F947EF340E24093C6008091AE :10F35000C00086FFFCCF8091C00080648093C00015 :10F36000C25DDE4F8881CE52D1400F947EF350E2D1 :10F370005093C6008091C00086FFFCCF8091C000F2 :10F3800080648093C000C35DDE4F8881CD52D14040 :10F390000F947EF360E26093C6008091C00086FF08 :10F3A000FCCF8091C00080648093C0007FEFE7169F :10F3B0007FEFF70670E0070770E0170731F48EE083 :10F3C00092EE60E00F942FF3DFC0D801C701807088 :10F3D000907CA070B0708050904CA040B040D1F5AF :10F3E0002FEF3FE340E050E0E222F3220423152315 :10F3F000C85DDE4FA880B980CA80DB80C852D1408A :10F40000AE0CBF1CC01ED11EAA0CBB1CCC1CDD1C2C :10F4100088E192EE60E00F942FF3BB27A12F902F8D :10F420008F2D0F947EF38E2D0F947EF330E2309368 :10F43000C6008091C00086FFFCCF8091C000806430 :10F440008093C0004EE34093C6008091C00086FFC9 :10F45000FCCF87C06EE07EEF80E090E0E622F722EE :10F46000082319237CE0E71674E9F70670E0070724 :10F4700070E0170709F088C0C25DDE4F8881CE5268 :10F48000D140E82EFF2400E010E0102F0F2DFE2CBD :10F49000EE24C35DDE4F9881CD52D140E90EF11CC0 :10F4A000011D111DD601C50181709070A070B07052 :10F4B000DC0199278827E80EF91E0A1F1B1F20EF81 :10F4C00030E040E050E0A222B322C422D522F1E194 :10F4D000AA0CBB1CCC1CDD1CFA95D1F7EA0CFB1C5A :10F4E0000C1D1D1D41E050E060E070E0242235223B :10F4F00046225722E5E1220C331C441C551CEA9598 :10F50000D1F7E20CF31C041D151D57016801AA0C6C :10F51000BB1CCC1CDD1C8FE192EE60E00F942FF33E :10F52000C801AA27BB270F947EF3BB27A12F902FDA :10F530008F2D0F947EF38E2D0F947EF350E2509317 :10F54000C6008091C00086FFFCCF8091C00080641F :10F550008093C0006EE36093C6008091C00086FF78 :10F56000FCCF8091C00080648093C000C601AA27B0 :10F57000BB270F947EF3BB27AD2D9C2D8B2D0F94B5 :10F580007EF38A2D0F947EF370E27093C600809113 :10F59000C00086FFFCCF8091C00080648093C000D3 :10F5A000CC5DDE4FE881F981C452D140CF01AA275A :10F5B00097FDA095BA2FABBFFC018791969160E0B3 :10F5C0000F942FF30F944DF3CC5DDE4F088119811A :10F5D000C452D1400E5F1F4FCC5DDE4F19830883AC :10F5E000C452D140CA5DDE4F28813981C652D14014 :10F5F0002933310509F417CB44E050E060E070E0B6 :10F60000640E751E861E971EC9CD80E393EE62E0E0 :10F610000F9466F384E292EE60E00F942FF38091F2 :10F62000C00087FFFCCF1091C6001F751093C60065 :10F630008091C00086FFFCCF8091C00080648093E1 :10F64000C0000F944DF3812F81548A3108F036C1E8 :10F65000163409F495C0173490F4133409F44EC0ED :10F66000143430F41134F1F0123409F01DC130C0FB :10F67000143409F459C0153409F016C16BC01A349A :10F6800009F4C4C01B3438F4173409F48FC018349B :10F6900009F00AC1A1C01B3409F4D2C01C3409F01E :10F6A00003C1E8C08FEF81B90DC082B1809582B9E6 :10F6B00080E090E0E0EDF7E03197F1F70196883CCB :10F6C0009105C1F78091C00087FFEFCF12B8EFC05E :10F6D0008FEF84B90DC085B1809585B980E090E049 :10F6E000E0EDF7E03197F1F70196883C9105C1F71D :10F6F0008091C00087FFEFCF15B8D9C08FEF87B9D1 :10F700000DC088B1809588B980E090E0E0EDF7E029 :10F710003197F1F70196883C9105C1F78091C000BF :10F7200087FFEFCF18B8C3C08FEF8AB90DC08BB178 :10F7300080958BB980E090E0E0EDF7E03197F1F74C :10F740000196883C9105C1F78091C00087FFEFCFFB :10F750001BB8ADC08FEF8DB90DC08EB180958EB93D :10F7600080E090E0E0EDF7E03197F1F70196883C1A :10F770009105C1F78091C00087FFEFCF1EB897C0F9 :10F780008FEF80BB0DC081B3809581BB80E090E09E :10F79000E0EDF7E03197F1F70196883C9105C1F76C :10F7A0008091C00087FFEFCF11BA81C08FEF83BB7C :10F7B0000DC084B3809584BB80E090E0E0EDF7E07D :10F7C0003197F1F70196883C9105C1F78091C0000F :10F7D00087FFEFCF14BA6BC08FEF809301010FC08A :10F7E0008091020180958093020180E090E0E0ED3D :10F7F000F7E03197F1F70196883C9105C1F78091C8 :10F80000C00087FFEDCF1092020151C08FEF8093AF :10F8100004010FC08091050180958093050180E06F :10F8200090E0E0EDF7E03197F1F70196883C910523 :10F83000C1F78091C00087FFEDCF1092050137C05E :10F840008FEF809307010FC080910801809580930E :10F85000080180E090E0E0EDF7E03197F1F70196E4 :10F86000883C9105C1F78091C00087FFEDCF1092D1 :10F8700008011DC08FEF80930A010FC080910B011A :10F88000809580930B0180E090E0E0EDF7E0319708 :10F89000F1F70196883C9105C1F78091C00087FF80 :10F8A000EDCF10920B0103C08FE292EEB9C98091A7 :10F8B000C00087FFFCCF8091C600B5C982E492EEFC :10F8C000AFC98CE191EEACC9AA24BB24933061F19D :10F8D000943028F4913089F0923008F508C09530C2 :10F8E000B1F1953040F1963009F053C04EC02B3144 :10F8F00009F020C991E06BE11DC9213041F0C15DE3 :10F90000DE4F5881CF52D140251709F002C362273C :10F91000C15DDE4F2883CF52D14092E00BC9B22F98 :10F92000A0E0622793E006C9822F90E0A82BB92BB4 :10F93000622794E0FFC82E3009F0EBC2622795E001 :10F94000C05DDE4F19821882C053D140F3C8E1E098 :10F95000F0E0EC0FFD1FC05DDE4FE880F980C05382 :10F96000D140EE0DFF1D208387010F5F1F4FC05D4B :10F97000DE4F19830883C053D14062270A171B0743 :10F9800009F0D8C8D80196E0D5C8261709F0C1C239 :10F9900003C0973009F0CEC899248981833109F4D6 :10F9A000FCC08431C8F4863009F4C2C0873050F4FA :10F9B000823009F4F0C0833009F458C0813009F076 :10F9C0000AC23EC0813109F462C0823108F0A6C08B :10F9D000803109F000C2DFC0883109F472C089317A :10F9E00050F4853109F4D9C0853108F477C18631E6 :10F9F00009F0F1C173C18A3109F457C08A3108F4A2 :10FA00007CC08B3109F446C08D3109F0E4C18D8191 :10FA1000803311F090E00AC08F81882311F49EE1B9 :10FA200005C0813011F091E001C098E91A821B8273 :10FA30008D818C831D829E831F8227E030E0CFC1A1 :10FA40001A8288E08B8381E48C8386E58D8382E54E :10FA50008E8389E48F8383E5888780E589878FE5B6 :10FA60008A8782E38B872BE030E0B9C18A818139B4 :10FA700041F0823941F0803911F48FE005C080E017 :10FA800003C082E001C08AE01A828B8344C09924BB :10FA9000939481C08D81882311F48EE12CC0813034 :10FAA00011F081E028C088E926C01A82E1E0F0E088 :10FAB00089E08093570084918B831C8224E030E09E :10FAC0008EC18B81803589F48C81883039F4E2E0F5 :10FAD000F0E089E08093570084910DC0E0E0F0E011 :10FAE00089E080935700849106C0E3E0F0E089E06C :10FAF0008093570084911A82DFCF8D81836C99E0C7 :10FB0000E1E0F0E0082E90935700E89507B600FC7E :10FB1000FDCF1A821B8223E030E061C11A82CE5CE5 :10FB2000DE4F188219821A821B82C253D14055C1FE :10FB30008A8190E0A0E0B0E0582F442733272227A5 :10FB40008B8190E0A0E0B0E0DC0199278827282B8A :10FB5000392B4A2B5B2B8D8190E0A0E0B0E0282B65 :10FB6000392B4A2B5B2B8C8190E0A0E0B0E0BA2FC0 :10FB7000A92F982F8827282B392B4A2B5B2B220F54 :10FB8000331F441F551FC05EDE4F288339834A83CD :10FB90005B83C052D1401A8220C19A812B8183316C :10FBA00049F0C05EDE4F488159816A817B81C05235 :10FBB000D1408AC0CE5CDE4F488159816A817B8109 :10FBC000C253D140403080EC580783E0680780E0A2 :10FBD0007807F0F483E0FA0160935B0080935700AC :10FBE000E89507B600FCFDCFCE5CDE4F4881598119 :10FBF0006A817B81C253D14040505F4F6F4F7F4F2E :10FC0000CE5CDE4F488359836A837B83C253D140E5 :10FC1000C95CDE4F9883C753D140CA5CDE4F18825F :10FC2000C653D140022F10E0CA5CDE4F6881798153 :10FC3000C653D140062B172BC05EDE4F4881598139 :10FC40006A817B81C052D140DE011B9631E08C91EC :10FC500011962C9111971296C75CDE4F2883C953D9 :10FC6000D140C85CDE4F1882C853D14090E0C85CD8 :10FC7000DE4FE881F981C853D1408E2B9F2B0C01B8 :10FC8000FA0160935B0030935700E89511244E5FB2 :10FC90005F4F6F4F7F4F02501040C9F685E0C05E46 :10FCA000DE4FE880F9800A811B81C052D140F70104 :10FCB00000935B0080935700E89507B600FCFDCFEA :10FCC00081E180935700E8951A82C05EDE4F488339 :10FCD00059836A837B83C052D1407FC0FA80C55C60 :10FCE000DE4FF882CB53D140C65CDE4F1882CA5338 :10FCF000D1408B81C82EDD24C65CDE4F088119817E :10FD0000CA53D140C02AD12A1A828981BE016D5FAF :10FD10007F4F843121F59601C05EDE4FE880F98087 :10FD20000A811B81C052D1400BBFF7018791969188 :10FD3000DB018C9311969C936E5F7F4FD801C701B6 :10FD40000296A11DB11DC05EDE4F88839983AA83F0 :10FD5000BB83C052D14022503040F1F636C0C05E65 :10FD6000DE4F288139814A815B81C052D14008949D :10FD7000C108D108760100E010E00894C11CD11C34 :10FD80000894E11CF11C011D111DE20EF31E041F5D :10FD9000151F21BDBB27A52F942F832F82BD2F5F59 :10FDA0003F4F4F4F5F4FF89A80B5DB018D93BD01F8 :10FDB0002E153F054007510761F7C05EDE4F2883CF :10FDC00039834A835B83C052D14096012D5F3F4FF8 :10FDD000FB01108204C080EC8A8322E030E08BE1DA :10FDE0008093C6008091C00086FFFCCF8091C00048 :10FDF00080648093C000C15DDE4FF881CF52D14056 :10FE0000F093C6008091C00086FFFCCF8091C000B7 :10FE100080648093C000432F3093C6008091C0005F :10FE200086FFFCCF8091C00080648093C000922F39 :10FE30002093C6008091C00086FFFCCF8091C00057 :10FE400080648093C0008EE08093C6008091C000E3 :10FE500086FFFCCF8091C00080648093C00065E184 :10FE6000C15DDE4FE880CF52D1406E2569276427FF :10FE7000FE01319610C090819093C6008091C00021 :10FE800086FFFCCF31968091C00080648093C000D3 :10FE90006927215030402115310569F76093C6006C :10FEA0008091C00086FFFCCF8091C0008064809369 :10FEB000C00085B1805885B9992081F4C15DDE4FBD :10FEC0000881CF52D1400F5FC15DDE4F0883CF5212 :10FED000D14090E0A0E0B0E00D949AF527982F98DB :10FEE00080E090E020ED37E0F9013197F1F70196DD :10FEF00084369105C9F700008091C0008D7F809302 :10FF0000C00081E180935700E895EE27FF27099410 :10FF1000FFCF90E00D949AF597FB092E07260AD0A3 :10FF200077FD04D02ED006D000201AF4709561958C :10FF30007F4F0895F6F7909581959F4F0895A1E220 :10FF40001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F53 :10FF5000FF1FA217B307E407F50720F0A21BB30B9E :10FF6000E40BF50B661F771F881F991F1A9469F71A :10FF700060957095809590959B01AC01BD01CF0176 :10FF80000895AA1BBB1B51E107C0AA1FBB1FA617E0 :10FF9000B70710F0A61BB70B881F991F5A95A9F732 :10FFA00080959095BC01CD010895F999FECF92BD41 :10FFB00081BDF89A992780B50895262FF999FECF2B :10FFC0001FBA92BD81BD20BD0FB6F894FA9AF99A76 :0AFFD0000FBE01960895F894FFCFCC :040000033000E000E9 :00000001FF ================================================ FILE: external/arduino/avr/bootloaders/stk500v2/STK500V2.pnproj ================================================ ================================================ FILE: external/arduino/avr/bootloaders/stk500v2/STK500V2.pnps ================================================ ================================================ FILE: external/arduino/avr/bootloaders/stk500v2/avr_cpunames.h ================================================ //************************************************************************************************** //* //* Atmel AVR CPU name strings //* //************************************************************************************************** //* Sep 19, 2010 Started on avr_cpunames.h //************************************************************************************************** //#include "avr_cpunames.h" //************************************************************************************************** #if defined (__AVR_AT94K__) #define _AVR_CPU_NAME_ "AT94k" #elif defined (__AVR_AT43USB320__) #elif defined (__AVR_AT43USB355__) #elif defined (__AVR_AT76C711__) #elif defined (__AVR_AT86RF401__) #elif defined (__AVR_AT90PWM1__) #elif defined (__AVR_AT90PWM2__) #elif defined (__AVR_AT90PWM2B__) #elif defined (__AVR_AT90PWM3__) #elif defined (__AVR_AT90PWM3B__) #elif defined (__AVR_AT90PWM216__) #elif defined (__AVR_AT90PWM316__) #elif defined (__AVR_ATmega32C1__) #elif defined (__AVR_ATmega32M1__) #elif defined (__AVR_ATmega32U4__) #define _AVR_CPU_NAME_ "ATmega32U4" #elif defined (__AVR_ATmega32U6__) #define _AVR_CPU_NAME_ "ATmega32U6" #elif defined (__AVR_ATmega128__) #define _AVR_CPU_NAME_ "Atmega128" #elif defined (__AVR_ATmega1280__) #define _AVR_CPU_NAME_ "ATmega1280" #elif defined (__AVR_ATmega1281__) #define _AVR_CPU_NAME_ "ATmega1281" #elif defined (__AVR_ATmega1284P__) #define _AVR_CPU_NAME_ "ATmega1284" #elif defined (__AVR_ATmega128RFA1__) #define _AVR_CPU_NAME_ "ATmega128RFA1" #elif defined (__AVR_ATmega2560__) #define _AVR_CPU_NAME_ "ATmega2560" #elif defined (__AVR_ATmega2561__) #define _AVR_CPU_NAME_ "ATmega2561" #elif defined (__AVR_AT90CAN32__) #define _AVR_CPU_NAME_ "AT90CAN32" #elif defined (__AVR_AT90CAN64__) #define _AVR_CPU_NAME_ "AT90CAN64" #elif defined (__AVR_AT90CAN128__) #define _AVR_CPU_NAME_ "AT90CAN128" #elif defined (__AVR_AT90USB82__) #define _AVR_CPU_NAME_ "AT90USB82" #elif defined (__AVR_AT90USB162__) #define _AVR_CPU_NAME_ "AT90USB162" #elif defined (__AVR_AT90USB646__) #define _AVR_CPU_NAME_ "AT90USB646" #elif defined (__AVR_AT90USB647__) #define _AVR_CPU_NAME_ "AT90USB647" #elif defined (__AVR_AT90USB1286__) #define _AVR_CPU_NAME_ "AT90USB1286" #elif defined (__AVR_AT90USB1287__) #define _AVR_CPU_NAME_ "AT90USB1287" #elif defined (__AVR_ATmega64__) #define _AVR_CPU_NAME_ "ATmega64" #elif defined (__AVR_ATmega640__) #define _AVR_CPU_NAME_ "ATmega640" #elif defined (__AVR_ATmega644__) #define _AVR_CPU_NAME_ "ATmega644" #elif defined (__AVR_ATmega644P__) #define _AVR_CPU_NAME_ "ATmega644P" #elif defined (__AVR_ATmega645__) #define _AVR_CPU_NAME_ "ATmega645" #elif defined (__AVR_ATmega6450__) #define _AVR_CPU_NAME_ "ATmega6450" #elif defined (__AVR_ATmega649__) #define _AVR_CPU_NAME_ "ATmega649" #elif defined (__AVR_ATmega6490__) #define _AVR_CPU_NAME_ "ATmega6490" #elif defined (__AVR_ATmega103__) #define _AVR_CPU_NAME_ "ATmega103" #elif defined (__AVR_ATmega32__) #define _AVR_CPU_NAME_ "Atmega32" #elif defined (__AVR_ATmega323__) #define _AVR_CPU_NAME_ "ATmega323" #elif defined (__AVR_ATmega324P__) #define _AVR_CPU_NAME_ "ATmega324P" #elif defined (__AVR_ATmega325__) #define _AVR_CPU_NAME_ "ATmega325" #elif defined (__AVR_ATmega325P__) #define _AVR_CPU_NAME_ "ATmega325P" #elif defined (__AVR_ATmega3250__) #define _AVR_CPU_NAME_ "ATmega3250" #elif defined (__AVR_ATmega3250P__) #define _AVR_CPU_NAME_ "ATmega3250P" #elif defined (__AVR_ATmega328P__) #define _AVR_CPU_NAME_ "ATmega328P" #elif defined (__AVR_ATmega329__) #define _AVR_CPU_NAME_ "ATmega329" #elif defined (__AVR_ATmega329P__) #define _AVR_CPU_NAME_ "ATmega329P" #elif defined (__AVR_ATmega3290__) #define _AVR_CPU_NAME_ "ATmega3290" #elif defined (__AVR_ATmega3290P__) #define _AVR_CPU_NAME_ "ATmega3290P" #elif defined (__AVR_ATmega32HVB__) #define _AVR_CPU_NAME_ "ATmega32HVB" #elif defined (__AVR_ATmega406__) #define _AVR_CPU_NAME_ "ATmega406" #elif defined (__AVR_ATmega16__) #define _AVR_CPU_NAME_ "Atmega16" #elif defined (__AVR_ATmega161__) #define _AVR_CPU_NAME_ "ATmega161" #elif defined (__AVR_ATmega162__) #define _AVR_CPU_NAME_ "ATmega162" #elif defined (__AVR_ATmega163__) #define _AVR_CPU_NAME_ "ATmega163" #elif defined (__AVR_ATmega164P__) #define _AVR_CPU_NAME_ "ATmega164P" #elif defined (__AVR_ATmega165__) #define _AVR_CPU_NAME_ "ATmega165" #elif defined (__AVR_ATmega165P__) #define _AVR_CPU_NAME_ "ATmega165P" #elif defined (__AVR_ATmega168__) #define _AVR_CPU_NAME_ "ATmega168" #elif defined (__AVR_ATmega168P__) #define _AVR_CPU_NAME_ "ATmega168P" #elif defined (__AVR_ATmega169__) #define _AVR_CPU_NAME_ "Atmega169" #elif defined (__AVR_ATmega169P__) #define _AVR_CPU_NAME_ "ATmega169P" #elif defined (__AVR_ATmega8HVA__) #define _AVR_CPU_NAME_ "ATmega8HVA" #elif defined (__AVR_ATmega16HVA__) #define _AVR_CPU_NAME_ "ATmega16HVA" #elif defined (__AVR_ATmega8__) #define _AVR_CPU_NAME_ "ATmega8" #elif defined (__AVR_ATmega48__) #define _AVR_CPU_NAME_ "ATmega48" #elif defined (__AVR_ATmega48P__) #define _AVR_CPU_NAME_ "ATmega48P" #elif defined (__AVR_ATmega88__) #define _AVR_CPU_NAME_ "ATmega88" #elif defined (__AVR_ATmega88P__) #define _AVR_CPU_NAME_ "ATmega88P" #elif defined (__AVR_ATmega8515__) #define _AVR_CPU_NAME_ "ATmega8515" #elif defined (__AVR_ATmega8535__) #define _AVR_CPU_NAME_ "ATmega8535" #elif defined (__AVR_AT90S8535__) #elif defined (__AVR_AT90C8534__) #elif defined (__AVR_AT90S8515__) #elif defined (__AVR_AT90S4434__) #elif defined (__AVR_AT90S4433__) #elif defined (__AVR_AT90S4414__) #elif defined (__AVR_ATtiny22__) #elif defined (__AVR_ATtiny26__) #elif defined (__AVR_AT90S2343__) #elif defined (__AVR_AT90S2333__) #elif defined (__AVR_AT90S2323__) #elif defined (__AVR_AT90S2313__) #elif defined (__AVR_ATtiny2313__) #define _AVR_CPU_NAME_ "ATtiny2313" #elif defined (__AVR_ATtiny13__) #elif defined (__AVR_ATtiny13A__) #elif defined (__AVR_ATtiny25__) #elif defined (__AVR_ATtiny45__) #elif defined (__AVR_ATtiny85__) #elif defined (__AVR_ATtiny24__) #elif defined (__AVR_ATtiny44__) #elif defined (__AVR_ATtiny84__) #elif defined (__AVR_ATtiny261__) #elif defined (__AVR_ATtiny461__) #elif defined (__AVR_ATtiny861__) #elif defined (__AVR_ATtiny43U__) #elif defined (__AVR_ATtiny48__) #elif defined (__AVR_ATtiny88__) #elif defined (__AVR_ATtiny167__) #elif defined (__AVR_ATmega8U2__) #define _AVR_CPU_NAME_ "ATmega8U2" #else #error cpu not defined #endif #if !defined (_AVR_CPU_NAME_) // #define _AVR_CPU_NAME_ "UNKNOWN" #endif ================================================ FILE: external/arduino/avr/bootloaders/stk500v2/avrinterruptnames.h ================================================ //************************************************************************************************** //* //* interrupt vector names //* //* It is important to note that the vector numbers listed here //* are the ATMEL documentation numbers. The Arduino numbers are 1 less //* This is because the Atmel docs start numbering the interrupts at 1 //* when it is actually vector #0 in the table. //************************************************************************************************** //* Jun 1, 2010 Added support for ATmega1281 //* Jun 30, 2010 Putting in more ifdefs to conserve space //* Jul 3, 2010 More #ifdefs to conserve space and testing on most of my boards //* Jul 4, 2010 Started using vector defs for #ifdefs as defined in //* Jul 13, 2010 Added support for __AVR_ATmega128__ //* Aug 26, 2010 Added support for __AVR_ATmega2561__ //* Sep 13, 2010 Added support for __AVR_AT90CAN32__ __AVR_AT90CAN64__ __AVR_AT90CAN128__ //************************************************************************************************** //#include "avrinterruptnames.h" //************************************************************************************************** //* this defines the interrupt vectors and allows us to compile ONLY those strings that are actually //* in the target CPU. This way we do not have to keep making changes based on cpu, it will be //* automatic even if we add a new CPU #ifndef _AVR_IO_H_ #include #endif //************************************************************************************************** #ifdef __MWERKS__ #define prog_char char #define PGM_P char * #endif prog_char gAvrInt_RESET[] PROGMEM = "RESET"; #ifdef INT0_vect prog_char gAvrInt_INT0[] PROGMEM = "INT0"; #endif #ifdef INT1_vect prog_char gAvrInt_INT1[] PROGMEM = "INT1"; #endif #ifdef INT2_vect prog_char gAvrInt_INT2[] PROGMEM = "INT2"; #endif #ifdef INT3_vect prog_char gAvrInt_INT3[] PROGMEM = "INT3"; #endif #ifdef INT4_vect prog_char gAvrInt_INT4[] PROGMEM = "INT4"; #endif #ifdef INT5_vect prog_char gAvrInt_INT5[] PROGMEM = "INT5"; #endif #ifdef INT6_vect prog_char gAvrInt_INT6[] PROGMEM = "INT6"; #endif #ifdef INT7_vect prog_char gAvrInt_INT7[] PROGMEM = "INT7"; #endif #ifdef PCINT0_vect prog_char gAvrInt_PCINT0[] PROGMEM = "PCINT0"; #endif #ifdef PCINT1_vect prog_char gAvrInt_PCINT1[] PROGMEM = "PCINT1"; #endif #ifdef PCINT2_vect prog_char gAvrInt_PCINT2[] PROGMEM = "PCINT2"; #endif #ifdef PCINT3_vect prog_char gAvrInt_PCINT3[] PROGMEM = "PCINT3"; #endif #ifdef WDT_vect prog_char gAvrInt_WDT[] PROGMEM = "WDT"; #endif #ifdef TIMER0_COMP_vect prog_char gAvrInt_TIMER0_COMP[] PROGMEM = "TIMER0 COMP"; #endif #ifdef TIMER0_COMPA_vect prog_char gAvrInt_TIMER0_COMPA[] PROGMEM = "TIMER0 COMPA"; #endif #ifdef TIMER0_COMPB_vect prog_char gAvrInt_TIMER0_COMPB[] PROGMEM = "TIMER0 COMPB"; #endif #ifdef TIMER0_OVF_vect prog_char gAvrInt_TIMER0_OVF[] PROGMEM = "TIMER0 OVF"; #endif #ifdef TIMER1_CAPT_vect prog_char gAvrInt_TIMER1_CAPT[] PROGMEM = "TIMER1 CAPT"; #endif #ifdef TIMER1_COMPA_vect prog_char gAvrInt_TIMER1_COMPA[] PROGMEM = "TIMER1 COMPA"; #endif #ifdef TIMER1_COMPB_vect prog_char gAvrInt_TIMER1_COMPB[] PROGMEM = "TIMER1 COMPB"; #endif #ifdef TIMER1_COMPC_vect prog_char gAvrInt_TIMER1_COMPC[] PROGMEM = "TIMER1 COMPC"; #endif #ifdef TIMER1_OVF_vect prog_char gAvrInt_TIMER1_OVF[] PROGMEM = "TIMER1 OVF"; #endif #ifdef TIMER2_COMP_vect prog_char gAvrInt_TIMER2_COMP[] PROGMEM = "TIMER2 COMP"; #endif #ifdef TIMER2_COMPA_vect prog_char gAvrInt_TIMER2_COMPA[] PROGMEM = "TIMER2 COMPA"; #endif #ifdef TIMER2_COMPB_vect prog_char gAvrInt_TIMER2_COMPB[] PROGMEM = "TIMER2 COMPB"; #endif #ifdef TIMER2_OVF_vect prog_char gAvrInt_TIMER2_OVF[] PROGMEM = "TIMER2 OVF"; #endif #ifdef TIMER3_CAPT_vect prog_char gAvrInt_TIMER3_CAPT[] PROGMEM = "TIMER3 CAPT"; #endif #ifdef TIMER3_COMPA_vect prog_char gAvrInt_TIMER3_COMPA[] PROGMEM = "TIMER3 COMPA"; #endif #ifdef TIMER3_COMPB_vect prog_char gAvrInt_TIMER3_COMPB[] PROGMEM = "TIMER3 COMPB"; #endif #ifdef TIMER3_COMPC_vect prog_char gAvrInt_TIMER3_COMPC[] PROGMEM = "TIMER3 COMPC"; #endif #ifdef TIMER3_OVF_vect prog_char gAvrInt_TIMER3_OVF[] PROGMEM = "TIMER3 OVF"; #endif #ifdef TIMER4_CAPT_vect prog_char gAvrInt_TIMER4_CAPT[] PROGMEM = "TIMER4 CAPT"; #endif #ifdef TIMER4_COMPA_vect prog_char gAvrInt_TIMER4_COMPA[] PROGMEM = "TIMER4 COMPA"; #endif #ifdef TIMER4_COMPB_vect prog_char gAvrInt_TIMER4_COMPB[] PROGMEM = "TIMER4 COMPB"; #endif #ifdef TIMER4_COMPC_vect prog_char gAvrInt_TIMER4_COMPC[] PROGMEM = "TIMER4 COMPC"; #endif #ifdef TIMER4_COMPD_vect prog_char gAvrInt_TIMER4_COMPD[] PROGMEM = "TIMER4 COMPD"; #endif #ifdef TIMER4_OVF_vect prog_char gAvrInt_TIMER4_OVF[] PROGMEM = "TIMER4 OVF"; #endif #ifdef TIMER4_FPF_vect prog_char gAvrInt_TIMER4_FPF[] PROGMEM = "TIMER4 Fault Protection"; #endif #ifdef TIMER5_CAPT_vect prog_char gAvrInt_TIMER5_CAPT[] PROGMEM = "TIMER5 CAPT"; #endif #ifdef TIMER5_COMPA_vect prog_char gAvrInt_TIMER5_COMPA[] PROGMEM = "TIMER5 COMPA"; #endif #ifdef TIMER5_COMPB_vect prog_char gAvrInt_TIMER5_COMPB[] PROGMEM = "TIMER5 COMPB"; #endif #ifdef TIMER5_COMPC_vect prog_char gAvrInt_TIMER5_COMPC[] PROGMEM = "TIMER5 COMPC"; #endif #ifdef TIMER5_OVF_vect prog_char gAvrInt_TIMER5_OVF[] PROGMEM = "TIMER5 OVF"; #endif //* when there is only 1 usart #if defined(USART_RX_vect) || defined(USART_RXC_vect) prog_char gAvrInt_USART_RX[] PROGMEM = "USART RX"; #endif #if defined(USART_UDRE_vect) prog_char gAvrInt_USART_UDRE[] PROGMEM = "USART UDRE"; #endif #if defined(USART_TX_vect) || defined(USART_TXC_vect) prog_char gAvrInt_USART_TX[] PROGMEM = "USART TX"; #endif //* usart 0 #if defined(USART0_RX_vect) prog_char gAvrInt_USART0_RX[] PROGMEM = "USART0 RX"; #endif #if defined(USART0_UDRE_vect) prog_char gAvrInt_USART0_UDRE[] PROGMEM = "USART0 UDRE"; #endif #if defined(USART0_TX_vect) prog_char gAvrInt_USART0_TX[] PROGMEM = "USART0 TX"; #endif //* usart 1 #ifdef USART1_RX_vect prog_char gAvrInt_USART1_RX[] PROGMEM = "USART1 RX"; #endif #ifdef USART1_UDRE_vect prog_char gAvrInt_USART1_UDRE[] PROGMEM = "USART1 UDRE"; #endif #ifdef USART1_TX_vect prog_char gAvrInt_USART1_TX[] PROGMEM = "USART1 TX"; #endif //* usart 2 #ifdef USART2_RX_vect prog_char gAvrInt_USART2_RX[] PROGMEM = "USART2 RX"; #endif #ifdef USART2_UDRE_vect prog_char gAvrInt_USART2_UDRE[] PROGMEM = "USART2 UDRE"; #endif #ifdef USART2_TX_vect prog_char gAvrInt_USART2_TX[] PROGMEM = "USART2 TX"; #endif //* usart 3 #ifdef USART3_RX_vect prog_char gAvrInt_USART3_RX[] PROGMEM = "USART3 RX"; #endif #ifdef USART3_UDRE_vect prog_char gAvrInt_USART3_UDRE[] PROGMEM = "USART3 UDRE"; #endif #ifdef USART3_TX_vect prog_char gAvrInt_USART3_TX[] PROGMEM = "USART3 TX"; #endif #ifdef SPI_STC_vect prog_char gAvrInt_SPI_STC[] PROGMEM = "SPI STC"; #endif #ifdef ADC_vect prog_char gAvrInt_ADC[] PROGMEM = "ADC"; #endif #if defined(ANALOG_COMP_vect) || defined(ANA_COMP_vect) prog_char gAvrInt_ANALOG_COMP[] PROGMEM = "ANALOG COMP"; #endif #if defined(EE_READY_vect) || defined(EE_RDY_vect) prog_char gAvrInt_EE_READY[] PROGMEM = "EE READY"; #endif #ifdef TWI_vect prog_char gAvrInt_TWI[] PROGMEM = "TWI"; #endif #if defined(SPM_READY_vect) || defined(SPM_RDY_vect) prog_char gAvrInt_SPM_READY[] PROGMEM = "SPM READY"; #endif #ifdef USI_START_vect prog_char gAvrInt_USI_START[] PROGMEM = "USI START"; #endif #ifdef USI_OVERFLOW_vect prog_char gAvrInt_USI_OVERFLOW[] PROGMEM = "USI OVERFLOW"; #endif #ifdef USB_GEN_vect prog_char gAvrInt_USB_General[] PROGMEM = "USB General"; #endif #ifdef USB_COM_vect prog_char gAvrInt_USB_Endpoint[] PROGMEM = "USB Endpoint"; #endif #ifdef LCD_vect prog_char gAvrInt_LCD_StartFrame[] PROGMEM = "LCD Start of Frame"; #endif //* these are for the chips with CAN bus support #ifdef CANIT_vect prog_char gAvrInt_CAN_TrafnsferCE[] PROGMEM = "CAN Transfer Complete or Error"; #endif #ifdef OVRIT_vect prog_char gAvrInt_CAN_TimerOverRun[] PROGMEM = "CAN Timer Overrun"; #endif //* these are for __AVR_ATmega128RFA1__ #ifdef TRX24_PLL_LOCK_vect prog_char gAvrInt_TRN_PLL_LOCK[] PROGMEM = "TRX24_PLL_LOCK"; #endif #ifdef TRX24_PLL_UNLOCK_vect prog_char gAvrInt_TRN_PLL_UNLOCK[] PROGMEM = "TRX24_PLL_UNLOCK"; #endif #ifdef TRX24_RX_START_vect prog_char gAvrInt_TRN_RX_START[] PROGMEM = "TRX24_RX_START"; #endif #ifdef TRX24_RX_END_vect prog_char gAvrInt_TRN_RX_END[] PROGMEM = "TRX24_RX_END"; #endif #ifdef TRX24_CCA_ED_DONE_vect prog_char gAvrInt_TRN_CAAED_DONE[] PROGMEM = "TRX24_CCA_ED_DONE"; #endif #ifdef TRX24_XAH_AMI_vect prog_char gAvrInt_TRN_FRAME_MATCH[] PROGMEM = "TRX24_FRAME_ADDRESS_MATCH"; #endif #ifdef TRX24_TX_END_vect prog_char gAvrInt_TRN_TX_END[] PROGMEM = "TRX24_TX_END"; #endif #ifdef TRX24_AWAKE_vect prog_char gAvrInt_TRN_AWAKE[] PROGMEM = "TRX24_AWAKE"; #endif #ifdef SCNT_CMP1_vect prog_char gAvrInt_SCNT_CMP1[] PROGMEM = "SCNT_CMP1"; #endif #ifdef SCNT_CMP2_vect prog_char gAvrInt_SCNT_CMP2[] PROGMEM = "SCNT_CMP2"; #endif #ifdef SCNT_CMP3_vect prog_char gAvrInt_SCNT_CMP3[] PROGMEM = "SCNT_CMP3"; #endif #ifdef SCNT_OVFL_vect prog_char gAvrInt_SCNT_OVFL[] PROGMEM = "SCNT_OVFL"; #endif #ifdef SCNT_BACKOFF_vect prog_char gAvrInt_SCNT_BACKOFF[] PROGMEM = "SCNT_BACKOFF"; #endif #ifdef AES_READY_vect prog_char gAvrInt_AES_READY[] PROGMEM = "AES_READY"; #endif #ifdef BAT_LOW_vect prog_char gAvrInt_BAT_LOW[] PROGMEM = "BAT_LOW"; #endif //************************************************************************************************** //* these do not have vector defs and have to be done by CPU type #if defined(__AVR_ATmega645__ ) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) prog_char gAvrInt_NOT_USED[] PROGMEM = "NOT_USED"; #endif #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega128RFA1__) prog_char gAvrInt_RESERVED[] PROGMEM = "Reserved"; #endif prog_char gAvrInt_END[] PROGMEM = "*"; //************************************************************************************************** #if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) #pragma mark __AVR_ATmega168__ / __AVR_ATmega328P__ / __AVR_ATmega328__ #define _INTERRUPT_NAMES_DEFINED_ PGM_P gInterruptNameTable[] PROGMEM = { gAvrInt_RESET, // 1 gAvrInt_INT0, // 2 gAvrInt_INT1, // 3 gAvrInt_PCINT0, // 4 gAvrInt_PCINT1, // 5 gAvrInt_PCINT2, // 6 gAvrInt_WDT, // 7 gAvrInt_TIMER2_COMPA, // 8 gAvrInt_TIMER2_COMPB, // 9 gAvrInt_TIMER2_OVF, // 10 gAvrInt_TIMER1_CAPT, // 11 gAvrInt_TIMER1_COMPA, // 12 gAvrInt_TIMER1_COMPB, // 13 gAvrInt_TIMER1_OVF, // 14 gAvrInt_TIMER0_COMPA, // 15 gAvrInt_TIMER0_COMPB, // 16 gAvrInt_TIMER0_OVF, // 17 gAvrInt_SPI_STC, // 18 gAvrInt_USART_RX, // 19 gAvrInt_USART_UDRE, // 20 gAvrInt_USART_TX, // 21 gAvrInt_ADC, // 22 gAvrInt_EE_READY, // 23 gAvrInt_ANALOG_COMP, // 24 gAvrInt_TWI, // 25 gAvrInt_SPM_READY, // 26 }; #endif //************************************************************************************************** #if defined(__AVR_ATmega169__) #pragma mark __AVR_ATmega169__ #define _INTERRUPT_NAMES_DEFINED_ PGM_P gInterruptNameTable[] PROGMEM = { gAvrInt_RESET, // 1 gAvrInt_INT0, // 2 gAvrInt_PCINT0, // 3 gAvrInt_PCINT1, // 4 gAvrInt_TIMER2_COMP, // 5 gAvrInt_TIMER2_OVF, // 6 gAvrInt_TIMER1_CAPT, // 7 gAvrInt_TIMER1_COMPA, // 8 gAvrInt_TIMER1_COMPB, // 9 gAvrInt_TIMER1_OVF, // 10 gAvrInt_TIMER0_COMP, // 11 gAvrInt_TIMER0_OVF, // 12 gAvrInt_SPI_STC, // 13 gAvrInt_USART0_RX, // 14 gAvrInt_USART0_UDRE, // 15 gAvrInt_USART0_TX, // 16 gAvrInt_USI_START, // 17 gAvrInt_USI_OVERFLOW, // 18 gAvrInt_ANALOG_COMP, // 19 gAvrInt_ADC, // 20 gAvrInt_EE_READY, // 21 gAvrInt_SPM_READY, // 22 gAvrInt_LCD_StartFrame, // 23 }; #endif //************************************************************************************************** #if defined(__AVR_ATmega640__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__) #pragma mark __AVR_ATmega640__ __AVR_ATmega1280__ __AVR_ATmega1281__ __AVR_ATmega2560__ __AVR_ATmega2561__ #define _INTERRUPT_NAMES_DEFINED_ PGM_P gInterruptNameTable[] PROGMEM = { gAvrInt_RESET, // 1 gAvrInt_INT0, // 2 gAvrInt_INT1, // 3 gAvrInt_INT2, // 4 gAvrInt_INT3, // 5 gAvrInt_INT4, // 6 gAvrInt_INT5, // 7 gAvrInt_INT6, // 8 gAvrInt_INT7, // 9 gAvrInt_PCINT0, // 10 gAvrInt_PCINT1, // 11 #if defined(__AVR_ATmega640__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) gAvrInt_PCINT2, // 12 #else gAvrInt_NOT_USED, // 12 #endif gAvrInt_WDT, // 13 gAvrInt_TIMER2_COMPA, // 14 gAvrInt_TIMER2_COMPB, // 15 gAvrInt_TIMER2_OVF, // 16 gAvrInt_TIMER1_CAPT, // 17 gAvrInt_TIMER1_COMPA, // 18 gAvrInt_TIMER1_COMPB, // 19 gAvrInt_TIMER1_COMPC, // 20 gAvrInt_TIMER1_OVF, // 21 gAvrInt_TIMER0_COMPA, // 22 gAvrInt_TIMER0_COMPB, // 23 gAvrInt_TIMER0_OVF, // 24 gAvrInt_SPI_STC, // 25 gAvrInt_USART0_RX, // 26 gAvrInt_USART0_UDRE, // 27 gAvrInt_USART0_TX, // 28 gAvrInt_ANALOG_COMP, // 29 gAvrInt_ADC, // 30 gAvrInt_EE_READY, // 31 gAvrInt_TIMER3_CAPT, // 32 gAvrInt_TIMER3_COMPA, // 33 gAvrInt_TIMER3_COMPB, // 34 gAvrInt_TIMER3_COMPC, // 35 gAvrInt_TIMER3_OVF, // 36 gAvrInt_USART1_RX, // 37 gAvrInt_USART1_UDRE, // 38 gAvrInt_USART1_TX, // 39 gAvrInt_TWI, // 40 gAvrInt_SPM_READY, // 41 #if defined(__AVR_ATmega640__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) gAvrInt_TIMER4_CAPT, // 42 #else gAvrInt_NOT_USED, // 42 #endif gAvrInt_TIMER4_COMPA, // 43 gAvrInt_TIMER4_COMPB, // 44 gAvrInt_TIMER4_COMPC, // 45 gAvrInt_TIMER4_OVF, // 46 #if defined(__AVR_ATmega640__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) gAvrInt_TIMER5_CAPT, // 47 #else gAvrInt_NOT_USED, // 47 #endif gAvrInt_TIMER5_COMPA, // 48 gAvrInt_TIMER5_COMPB, // 49 gAvrInt_TIMER5_COMPC, // 50 gAvrInt_TIMER5_OVF, // 51 #if defined(__AVR_ATmega640__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) gAvrInt_USART2_RX, // 52 gAvrInt_USART2_UDRE, // 53 gAvrInt_USART2_TX, // 54 gAvrInt_USART3_RX, // 55 gAvrInt_USART3_UDRE, // 56 gAvrInt_USART3_TX, // 57 #endif }; #endif //************************************************************************************************** #if defined(__AVR_ATmega324P__ ) || defined(__AVR_ATmega644__ ) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) #pragma mark __AVR_ATmega324P__ __AVR_ATmega644__ __AVR_ATmega644P__ __AVR_ATmega1284P__ #define _INTERRUPT_NAMES_DEFINED_ PGM_P gInterruptNameTable[] PROGMEM = { gAvrInt_RESET, // 1 gAvrInt_INT0, // 2 gAvrInt_INT1, // 3 gAvrInt_INT2, // 4 gAvrInt_PCINT0, // 5 gAvrInt_PCINT1, // 6 gAvrInt_PCINT2, // 7 gAvrInt_PCINT3, // 8 gAvrInt_WDT, // 9 gAvrInt_TIMER2_COMPA, // 10 gAvrInt_TIMER2_COMPB, // 11 gAvrInt_TIMER2_OVF, // 12 gAvrInt_TIMER1_CAPT, // 13 gAvrInt_TIMER1_COMPA, // 14 gAvrInt_TIMER1_COMPB, // 15 gAvrInt_TIMER1_OVF, // 16 gAvrInt_TIMER0_COMPA, // 17 gAvrInt_TIMER0_COMPB, // 18 gAvrInt_TIMER0_OVF, // 19 gAvrInt_SPI_STC, // 20 gAvrInt_USART0_RX, // 21 gAvrInt_USART0_UDRE, // 22 gAvrInt_USART0_TX, // 23 gAvrInt_ANALOG_COMP, // 24 gAvrInt_ADC, // 25 gAvrInt_EE_READY, // 26 gAvrInt_TWI, // 27 gAvrInt_SPM_READY, // 28 #if defined(__AVR_ATmega324P__ ) || defined(__AVR_ATmega644P__) gAvrInt_USART1_RX, // 29 gAvrInt_USART1_UDRE, // 30 gAvrInt_USART1_TX, // 31 #endif }; #endif //************************************************************************************************** #if defined(__AVR_ATmega1284P__ ) #pragma mark __AVR_ATmega1284P__ #define _INTERRUPT_NAMES_DEFINED_ PGM_P gInterruptNameTable[] PROGMEM = { gAvrInt_RESET, // 1 gAvrInt_INT0, // 2 gAvrInt_INT1, // 3 gAvrInt_INT2, // 4 gAvrInt_PCINT0, // 5 gAvrInt_PCINT1, // 6 gAvrInt_PCINT2, // 7 gAvrInt_PCINT3, // 8 gAvrInt_WDT, // 9 gAvrInt_TIMER2_COMPA, // 10 gAvrInt_TIMER2_COMPB, // 11 gAvrInt_TIMER2_OVF, // 12 gAvrInt_TIMER1_CAPT, // 13 gAvrInt_TIMER1_COMPA, // 14 gAvrInt_TIMER1_COMPB, // 15 gAvrInt_TIMER1_OVF, // 16 gAvrInt_TIMER0_COMPA, // 17 gAvrInt_TIMER0_COMPB, // 18 gAvrInt_TIMER0_OVF, // 19 gAvrInt_SPI_STC, // 20 gAvrInt_USART0_RX, // 21 gAvrInt_USART0_UDRE, // 22 gAvrInt_USART0_TX, // 23 gAvrInt_ANALOG_COMP, // 24 gAvrInt_ADC, // 25 gAvrInt_EE_READY, // 26 gAvrInt_TWI, // 27 gAvrInt_SPM_READY, // 28 gAvrInt_USART1_RX, // 29 gAvrInt_USART1_UDRE, // 30 gAvrInt_USART1_TX, // 31 //* these are NOT documented in doc8272.pdf //* they are in iom1284p.h gAvrInt_TIMER3_CAPT, // 32 gAvrInt_TIMER3_COMPA, // 33 gAvrInt_TIMER3_COMPB, // 34 gAvrInt_TIMER3_OVF, // 35 }; #endif //************************************************************************************************** #if defined(__AVR_ATmega645__ ) #pragma mark __AVR_ATmega645__ #define _INTERRUPT_NAMES_DEFINED_ PGM_P gInterruptNameTable[] PROGMEM = { gAvrInt_RESET, // 1 gAvrInt_INT0, // 2 gAvrInt_PCINT0, // 3 gAvrInt_PCINT1, // 4 gAvrInt_TIMER2_COMP, // 5 gAvrInt_TIMER2_OVF, // 6 gAvrInt_TIMER1_CAPT, // 7 gAvrInt_TIMER1_COMPA, // 8 gAvrInt_TIMER1_COMPB, // 9 gAvrInt_TIMER1_OVF, // 10 gAvrInt_TIMER0_COMP, // 11 gAvrInt_TIMER0_OVF, // 12 gAvrInt_SPI_STC, // 13 gAvrInt_USART0_RX, // 14 gAvrInt_USART0_UDRE, // 15 gAvrInt_USART0_TX, // 16 gAvrInt_USI_START, // 17 gAvrInt_USI_OVERFLOW, // 18 gAvrInt_ANALOG_COMP, // 19 gAvrInt_ADC, // 20 gAvrInt_EE_READY, // 21 gAvrInt_SPM_READY, // 22 gAvrInt_NOT_USED, // 23 #if defined(__AVR_ATmega3250__) || defined(__AVR_ATmega6450__) gAvrInt_PCINT2, // 24 gAvrInt_PCINT3, // 25 #endif }; #endif //************************************************************************************************** #if defined(__AVR_ATmega16__ ) #pragma mark __AVR_ATmega16__ #define _INTERRUPT_NAMES_DEFINED_ PGM_P gInterruptNameTable[] PROGMEM = { gAvrInt_RESET, // 1 gAvrInt_INT0, // 2 gAvrInt_INT1, // 3 gAvrInt_TIMER2_COMP, // 4 gAvrInt_TIMER2_OVF, // 5 gAvrInt_TIMER1_CAPT, // 6 gAvrInt_TIMER1_COMPA, // 7 gAvrInt_TIMER1_COMPB, // 8 gAvrInt_TIMER1_OVF, // 9 gAvrInt_TIMER0_OVF, // 10 gAvrInt_SPI_STC, // 11 gAvrInt_USART_RX, // 12 gAvrInt_USART_UDRE, // 13 gAvrInt_USART_TX, // 14 gAvrInt_ADC, // 15 gAvrInt_EE_READY, // 16 gAvrInt_ANALOG_COMP, // 17 gAvrInt_TWI, // 18 gAvrInt_INT2, // 19 gAvrInt_TIMER0_COMP, // 20 gAvrInt_SPM_READY, // 21 }; #endif //************************************************************************************************** #if defined(__AVR_ATmega32__ ) #pragma mark __AVR_ATmega32__ #define _INTERRUPT_NAMES_DEFINED_ PGM_P gInterruptNameTable[] PROGMEM = { gAvrInt_RESET, // 1 gAvrInt_INT0, // 2 gAvrInt_INT1, // 3 gAvrInt_INT2, // 4 gAvrInt_TIMER2_COMP, // 5 gAvrInt_TIMER2_OVF, // 6 gAvrInt_TIMER1_CAPT, // 7 gAvrInt_TIMER1_COMPA, // 8 gAvrInt_TIMER1_COMPB, // 9 gAvrInt_TIMER1_OVF, // 10 gAvrInt_TIMER0_COMP, // 11 gAvrInt_TIMER0_OVF, // 12 gAvrInt_SPI_STC, // 13 gAvrInt_USART_RX, // 14 gAvrInt_USART_UDRE, // 15 gAvrInt_USART_TX, // 16 gAvrInt_ADC, // 17 gAvrInt_EE_READY, // 18 gAvrInt_ANALOG_COMP, // 19 gAvrInt_TWI, // 20 gAvrInt_SPM_READY, // 21 }; #endif //************************************************************************************************** #if defined(__AVR_ATmega32U4__) #pragma mark __AVR_ATmega32U4__ //* teensy 2.0 //* http://www.pjrc.com/teensy/pinout.html #define _INTERRUPT_NAMES_DEFINED_ PGM_P gInterruptNameTable[] PROGMEM = { gAvrInt_RESET, // 1 gAvrInt_INT0, // 2 gAvrInt_INT1, // 3 gAvrInt_INT2, // 4 gAvrInt_INT3, // 5 gAvrInt_RESERVED, // 6 gAvrInt_RESERVED, // 7 gAvrInt_INT6, // 8 gAvrInt_RESERVED, // 9 gAvrInt_PCINT0, // 10 gAvrInt_USB_General, // 11 gAvrInt_USB_Endpoint, // 12 gAvrInt_WDT, // 13 gAvrInt_RESERVED, // 14 gAvrInt_RESERVED, // 15 gAvrInt_RESERVED, // 16 gAvrInt_TIMER1_CAPT, // 17 gAvrInt_TIMER1_COMPA, // 18 gAvrInt_TIMER1_COMPB, // 19 gAvrInt_TIMER1_COMPC, // 20 gAvrInt_TIMER1_OVF, // 21 gAvrInt_TIMER0_COMPA, // 22 gAvrInt_TIMER0_COMPB, // 23 gAvrInt_TIMER0_OVF, // 24 gAvrInt_SPI_STC, // 25 gAvrInt_USART1_RX, // 26 gAvrInt_USART1_UDRE, // 27 gAvrInt_USART1_TX, // 28 gAvrInt_ANALOG_COMP, // 29 gAvrInt_ADC, // 30 gAvrInt_EE_READY, // 31 gAvrInt_TIMER3_CAPT, // 32 gAvrInt_TIMER3_COMPA, // 33 gAvrInt_TIMER3_COMPB, // 34 gAvrInt_TIMER3_COMPC, // 35 gAvrInt_TIMER3_OVF, // 36 gAvrInt_TWI, // 37 gAvrInt_SPM_READY, // 38 gAvrInt_TIMER4_COMPA, // 39 gAvrInt_TIMER4_COMPB, // 40 gAvrInt_TIMER4_COMPD, // 41 gAvrInt_TIMER4_OVF, // 42 gAvrInt_TIMER4_FPF, // 43 }; #endif //************************************************************************************************** #if defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__) #pragma mark __AVR_AT90USB1286__ //* teensy++ 2.0 //* http://www.pjrc.com/teensy/pinout.html #define _INTERRUPT_NAMES_DEFINED_ PGM_P gInterruptNameTable[] PROGMEM = { gAvrInt_RESET, // 1 gAvrInt_INT0, // 2 gAvrInt_INT1, // 3 gAvrInt_INT2, // 4 gAvrInt_INT3, // 5 gAvrInt_INT4, // 6 gAvrInt_INT5, // 7 gAvrInt_INT6, // 8 gAvrInt_INT7, // 9 gAvrInt_PCINT0, // 10 gAvrInt_USB_General, // 11 gAvrInt_USB_Endpoint, // 12 gAvrInt_WDT, // 13 gAvrInt_TIMER2_COMPA, // 14 gAvrInt_TIMER2_COMPB, // 15 gAvrInt_TIMER2_OVF, // 16 gAvrInt_TIMER1_CAPT, // 17 gAvrInt_TIMER1_COMPA, // 18 gAvrInt_TIMER1_COMPB, // 19 gAvrInt_TIMER1_COMPC, // 20 gAvrInt_TIMER1_OVF, // 21 gAvrInt_TIMER0_COMPA, // 22 gAvrInt_TIMER0_COMPB, // 23 gAvrInt_TIMER0_OVF, // 24 gAvrInt_SPI_STC, // 25 gAvrInt_USART1_RX, // 26 gAvrInt_USART1_UDRE, // 27 gAvrInt_USART1_TX, // 28 gAvrInt_ANALOG_COMP, // 29 gAvrInt_ADC, // 30 gAvrInt_EE_READY, // 31 gAvrInt_TIMER3_CAPT, // 32 gAvrInt_TIMER3_COMPA, // 33 gAvrInt_TIMER3_COMPB, // 34 gAvrInt_TIMER3_COMPC, // 35 gAvrInt_TIMER3_OVF, // 36 gAvrInt_TWI, // 37 gAvrInt_SPM_READY, // 38 }; #endif //************************************************************************************************** #if defined(__AVR_ATmega128__) || defined(__AVR_ATmega64__) #pragma mark __AVR_ATmega64__ __AVR_ATmega128__ #define _INTERRUPT_NAMES_DEFINED_ PGM_P gInterruptNameTable[] PROGMEM = { gAvrInt_RESET, // 1 gAvrInt_INT0, // 2 gAvrInt_INT1, // 3 gAvrInt_INT2, // 4 gAvrInt_INT3, // 5 gAvrInt_INT4, // 6 gAvrInt_INT5, // 7 gAvrInt_INT6, // 8 gAvrInt_INT7, // 9 gAvrInt_TIMER2_COMP, // 10 gAvrInt_TIMER2_OVF, // 11 gAvrInt_TIMER1_CAPT, // 12 gAvrInt_TIMER1_COMPA, // 13 gAvrInt_TIMER1_COMPB, // 14 gAvrInt_TIMER1_OVF, // 15 gAvrInt_TIMER0_COMP, // 16 gAvrInt_TIMER0_OVF, // 17 gAvrInt_SPI_STC, // 18 gAvrInt_USART0_RX, // 19 gAvrInt_USART0_UDRE, // 20 gAvrInt_USART0_TX, // 21 gAvrInt_ADC, // 22 gAvrInt_EE_READY, // 23 gAvrInt_ANALOG_COMP, // 24 gAvrInt_TIMER1_COMPC, // 25 gAvrInt_TIMER3_CAPT, // 26 gAvrInt_TIMER3_COMPA, // 27 gAvrInt_TIMER3_COMPB, // 28 gAvrInt_TIMER3_COMPC, // 29 gAvrInt_TIMER3_OVF, // 30 gAvrInt_USART1_RX, // 31 gAvrInt_USART1_UDRE, // 32 gAvrInt_USART1_TX, // 33 gAvrInt_TWI, // 34 gAvrInt_SPM_READY, // 35 }; #endif //************************************************************************************************** #if defined(__AVR_AT90CAN32__) || defined(__AVR_AT90CAN64__) || defined(__AVR_AT90CAN128__) #pragma mark __AVR_AT90CAN32__ __AVR_AT90CAN64__ __AVR_AT90CAN128__ #define _INTERRUPT_NAMES_DEFINED_ PGM_P gInterruptNameTable[] PROGMEM = { gAvrInt_RESET, // 1 gAvrInt_INT0, // 2 gAvrInt_INT1, // 3 gAvrInt_INT2, // 4 gAvrInt_INT3, // 5 gAvrInt_INT4, // 6 gAvrInt_INT5, // 7 gAvrInt_INT6, // 8 gAvrInt_INT7, // 9 gAvrInt_TIMER2_COMP, // 10 gAvrInt_TIMER2_OVF, // 11 gAvrInt_TIMER1_CAPT, // 12 gAvrInt_TIMER1_COMPA, // 13 gAvrInt_TIMER1_COMPB, // 14 gAvrInt_TIMER1_COMPC, // 15 gAvrInt_TIMER1_OVF, // 16 gAvrInt_TIMER0_COMP, // 17 gAvrInt_TIMER0_OVF, // 18 gAvrInt_CAN_TrafnsferCE, // 19 gAvrInt_CAN_TimerOverRun, // 20 gAvrInt_SPI_STC, // 21 gAvrInt_USART0_RX, // 22 gAvrInt_USART0_UDRE, // 23 gAvrInt_USART0_TX, // 24 gAvrInt_ANALOG_COMP, // 25 gAvrInt_ADC, // 26 gAvrInt_EE_READY, // 27 gAvrInt_TIMER3_CAPT, // 28 gAvrInt_TIMER3_COMPA, // 29 gAvrInt_TIMER3_COMPB, // 30 gAvrInt_TIMER3_COMPC, // 31 gAvrInt_TIMER3_OVF, // 32 gAvrInt_USART1_RX, // 33 gAvrInt_USART1_UDRE, // 34 gAvrInt_USART1_TX, // 35 gAvrInt_TWI, // 36 gAvrInt_SPM_READY, // 37 }; #endif //************************************************************************************************** #if defined (__AVR_ATmega128RFA1__) #pragma mark __AVR_ATmega128RFA1__ #define _INTERRUPT_NAMES_DEFINED_ PGM_P gInterruptNameTable[] PROGMEM = { //* Atmel changed the number scheme for interrupt vectors gAvrInt_RESET, // 0 gAvrInt_INT0, // 1 gAvrInt_INT1, // 2 gAvrInt_INT2, // 3 gAvrInt_INT3, // 4 gAvrInt_INT4, // 5 gAvrInt_INT5, // 6 gAvrInt_INT6, // 7 gAvrInt_INT7, // 8 gAvrInt_PCINT0, // 9 gAvrInt_PCINT1, // 10 gAvrInt_PCINT2, // 11 gAvrInt_WDT, // 12 gAvrInt_TIMER2_COMPA, // 13 gAvrInt_TIMER2_COMPB, // 14 gAvrInt_TIMER2_OVF, // 15 gAvrInt_TIMER1_CAPT, // 16 gAvrInt_TIMER1_COMPA, // 17 gAvrInt_TIMER1_COMPB, // 18 gAvrInt_TIMER1_COMPC, // 19 gAvrInt_TIMER1_OVF, // 20 gAvrInt_TIMER0_COMPA, // 21 gAvrInt_TIMER0_COMPB, // 22 gAvrInt_TIMER0_OVF, // 23 gAvrInt_SPI_STC, // 24 gAvrInt_USART0_RX, // 25 gAvrInt_USART0_UDRE, // 26 gAvrInt_USART0_TX, // 27 gAvrInt_ANALOG_COMP, // 28 gAvrInt_ADC, // 29 gAvrInt_EE_READY, // 30 gAvrInt_TIMER3_CAPT, // 31 gAvrInt_TIMER3_COMPA, // 32 gAvrInt_TIMER3_COMPB, // 33 gAvrInt_TIMER3_COMPC, // 34 gAvrInt_TIMER3_OVF, // 35 gAvrInt_USART1_RX, // 36 gAvrInt_USART1_UDRE, // 37 gAvrInt_USART1_TX, // 38 gAvrInt_TWI, // 39 gAvrInt_SPM_READY, // 40 gAvrInt_TIMER4_CAPT, // 41 gAvrInt_TIMER4_COMPA, // 42 gAvrInt_TIMER4_COMPB, // 43 gAvrInt_TIMER4_COMPC, // 44 gAvrInt_TIMER4_OVF, // 45 gAvrInt_TIMER5_CAPT, // 46 gAvrInt_TIMER5_COMPA, // 47 gAvrInt_TIMER5_COMPB, // 48 gAvrInt_TIMER5_COMPC, // 49 gAvrInt_TIMER5_OVF, // 50 #if 1 gAvrInt_RESERVED, // 51 gAvrInt_RESERVED, // 52 gAvrInt_RESERVED, // 53 gAvrInt_RESERVED, // 54 gAvrInt_RESERVED, // 55 gAvrInt_RESERVED, // 56 #else gAvrInt_USART2_RX, // 51 gAvrInt_USART2_UDRE, // 52 gAvrInt_USART2_TX, // 53 gAvrInt_USART3_RX, // 54 gAvrInt_USART3_UDRE, // 55 gAvrInt_USART3_TX, // 56 #endif gAvrInt_TRN_PLL_LOCK, // 57 gAvrInt_TRN_PLL_UNLOCK, // 58 gAvrInt_TRN_RX_START, // 59 gAvrInt_TRN_RX_END, // 60 gAvrInt_TRN_CAAED_DONE, // 61 gAvrInt_TRN_FRAME_MATCH,// 62 gAvrInt_TRN_TX_END, // 63 gAvrInt_TRN_AWAKE, // 64 gAvrInt_SCNT_CMP1, // 65 gAvrInt_SCNT_CMP2, // 66 gAvrInt_SCNT_CMP3, // 67 gAvrInt_SCNT_OVFL, // 68 gAvrInt_SCNT_BACKOFF, // 69 gAvrInt_AES_READY, // 70 gAvrInt_BAT_LOW, // 71 }; #endif #if !defined(_INTERRUPT_NAMES_DEFINED_) #warning No interrupt string defs for this cpu #endif ================================================ FILE: external/arduino/avr/bootloaders/stk500v2/command.h ================================================ //**** ATMEL AVR - A P P L I C A T I O N N O T E ************************ //* //* Title: AVR068 - STK500 Communication Protocol //* Filename: command.h //* Version: 1.0 //* Last updated: 31.01.2005 //* //* Support E-mail: avr@atmel.com //* //************************************************************************** // *****************[ STK message constants ]*************************** #define MESSAGE_START 0x1B //= ESC = 27 decimal #define TOKEN 0x0E // *****************[ STK general command constants ]************************** #define CMD_SIGN_ON 0x01 #define CMD_SET_PARAMETER 0x02 #define CMD_GET_PARAMETER 0x03 #define CMD_SET_DEVICE_PARAMETERS 0x04 #define CMD_OSCCAL 0x05 #define CMD_LOAD_ADDRESS 0x06 #define CMD_FIRMWARE_UPGRADE 0x07 // *****************[ STK ISP command constants ]****************************** #define CMD_ENTER_PROGMODE_ISP 0x10 #define CMD_LEAVE_PROGMODE_ISP 0x11 #define CMD_CHIP_ERASE_ISP 0x12 #define CMD_PROGRAM_FLASH_ISP 0x13 #define CMD_READ_FLASH_ISP 0x14 #define CMD_PROGRAM_EEPROM_ISP 0x15 #define CMD_READ_EEPROM_ISP 0x16 #define CMD_PROGRAM_FUSE_ISP 0x17 #define CMD_READ_FUSE_ISP 0x18 #define CMD_PROGRAM_LOCK_ISP 0x19 #define CMD_READ_LOCK_ISP 0x1A #define CMD_READ_SIGNATURE_ISP 0x1B #define CMD_READ_OSCCAL_ISP 0x1C #define CMD_SPI_MULTI 0x1D // *****************[ STK PP command constants ]******************************* #define CMD_ENTER_PROGMODE_PP 0x20 #define CMD_LEAVE_PROGMODE_PP 0x21 #define CMD_CHIP_ERASE_PP 0x22 #define CMD_PROGRAM_FLASH_PP 0x23 #define CMD_READ_FLASH_PP 0x24 #define CMD_PROGRAM_EEPROM_PP 0x25 #define CMD_READ_EEPROM_PP 0x26 #define CMD_PROGRAM_FUSE_PP 0x27 #define CMD_READ_FUSE_PP 0x28 #define CMD_PROGRAM_LOCK_PP 0x29 #define CMD_READ_LOCK_PP 0x2A #define CMD_READ_SIGNATURE_PP 0x2B #define CMD_READ_OSCCAL_PP 0x2C #define CMD_SET_CONTROL_STACK 0x2D // *****************[ STK HVSP command constants ]***************************** #define CMD_ENTER_PROGMODE_HVSP 0x30 #define CMD_LEAVE_PROGMODE_HVSP 0x31 #define CMD_CHIP_ERASE_HVSP 0x32 #define CMD_PROGRAM_FLASH_HVSP ` 0x33 #define CMD_READ_FLASH_HVSP 0x34 #define CMD_PROGRAM_EEPROM_HVSP 0x35 #define CMD_READ_EEPROM_HVSP 0x36 #define CMD_PROGRAM_FUSE_HVSP 0x37 #define CMD_READ_FUSE_HVSP 0x38 #define CMD_PROGRAM_LOCK_HVSP 0x39 #define CMD_READ_LOCK_HVSP 0x3A #define CMD_READ_SIGNATURE_HVSP 0x3B #define CMD_READ_OSCCAL_HVSP 0x3C // *****************[ STK status constants ]*************************** // Success #define STATUS_CMD_OK 0x00 // Warnings #define STATUS_CMD_TOUT 0x80 #define STATUS_RDY_BSY_TOUT 0x81 #define STATUS_SET_PARAM_MISSING 0x82 // Errors #define STATUS_CMD_FAILED 0xC0 #define STATUS_CKSUM_ERROR 0xC1 #define STATUS_CMD_UNKNOWN 0xC9 // *****************[ STK parameter constants ]*************************** #define PARAM_BUILD_NUMBER_LOW 0x80 #define PARAM_BUILD_NUMBER_HIGH 0x81 #define PARAM_HW_VER 0x90 #define PARAM_SW_MAJOR 0x91 #define PARAM_SW_MINOR 0x92 #define PARAM_VTARGET 0x94 #define PARAM_VADJUST 0x95 #define PARAM_OSC_PSCALE 0x96 #define PARAM_OSC_CMATCH 0x97 #define PARAM_SCK_DURATION 0x98 #define PARAM_TOPCARD_DETECT 0x9A #define PARAM_STATUS 0x9C #define PARAM_DATA 0x9D #define PARAM_RESET_POLARITY 0x9E #define PARAM_CONTROLLER_INIT 0x9F // *****************[ STK answer constants ]*************************** #define ANSWER_CKSUM_ERROR 0xB0 ================================================ FILE: external/arduino/avr/bootloaders/stk500v2/stk500boot.c ================================================ /***************************************************************************** Title: STK500v2 compatible bootloader Modified for Wiring board ATMega128-16MHz Author: Peter Fleury http://jump.to/fleury Compiler: avr-gcc 3.4.5 or 4.1 / avr-libc 1.4.3 Hardware: All AVRs with bootloader support, tested with ATmega8 License: GNU General Public License Modified: Worapoht Kornkaewwattanakul http://www.avride.com Date: 17 October 2007 Update: 1st, 29 Dec 2007 : Enable CMD_SPI_MULTI but ignore unused command by return 0x00 byte response.. Compiler: WINAVR20060421 Description: add timeout feature like previous Wiring bootloader DESCRIPTION: This program allows an AVR with bootloader capabilities to read/write its own Flash/EEprom. To enter Programming mode an input pin is checked. If this pin is pulled low, programming mode is entered. If not, normal execution is done from $0000 "reset" vector in Application area. Size fits into a 1024 word bootloader section when compiled with avr-gcc 4.1 (direct replace on Wiring Board without fuse setting changed) USAGE: - Set AVR MCU type and clock-frequency (F_CPU) in the Makefile. - Set baud rate below (AVRISP only works with 115200 bps) - compile/link the bootloader with the supplied Makefile - program the "Boot Flash section size" (BOOTSZ fuses), for boot-size 1024 words: program BOOTSZ01 - enable the BOOT Reset Vector (program BOOTRST) - Upload the hex file to the AVR using any ISP programmer - Program Boot Lock Mode 3 (program BootLock 11 and BootLock 12 lock bits) // (leave them) - Reset your AVR while keeping PROG_PIN pulled low // (for enter bootloader by switch) - Start AVRISP Programmer (AVRStudio/Tools/Program AVR) - AVRISP will detect the bootloader - Program your application FLASH file and optional EEPROM file using AVRISP Note: Erasing the device without flashing, through AVRISP GUI button "Erase Device" is not implemented, due to AVRStudio limitations. Flash is always erased before programming. AVRdude: Please uncomment #define REMOVE_CMD_SPI_MULTI when using AVRdude. Comment #define REMOVE_PROGRAM_LOCK_BIT_SUPPORT to reduce code size Read Fuse Bits and Read/Write Lock Bits is not supported NOTES: Based on Atmel Application Note AVR109 - Self-programming Based on Atmel Application Note AVR068 - STK500v2 Protocol LICENSE: Copyright (C) 2006 Peter Fleury This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. *****************************************************************************/ //************************************************************************ //* Edit History //************************************************************************ //* Jul 7, 2010 = Mark Sproul msproul@skycharoit.com //* Jul 7, 2010 Working on mega2560. No Auto-restart //* Jul 7, 2010 Switched to 8K bytes (4K words) so that we have room for the monitor //* Jul 8, 2010 Found older version of source that had auto restart, put that code back in //* Jul 8, 2010 Adding monitor code //* Jul 11, 2010 Added blinking LED while waiting for download to start //* Jul 11, 2010 Added EEPROM test //* Jul 29, 2010 Added recchar_timeout for timing out on bootloading //* Aug 23, 2010 Added support for atmega2561 //* Aug 26, 2010 Removed support for BOOT_BY_SWITCH //* Sep 8, 2010 Added support for atmega16 //* Nov 9, 2010 Issue 392:Fixed bug that 3 !!! in code would cause it to jump to monitor //* Jun 24, 2011 Removed analogRead (was not used) //* Dec 29, 2011 Issue 181: added watch dog timmer support //* Dec 29, 2011 Issue 505: bootloader is comparing the seqNum to 1 or the current sequence //* Jan 1, 2012 Issue 543: CMD_CHIP_ERASE_ISP now returns STATUS_CMD_FAILED instead of STATUS_CMD_OK //* Jan 1, 2012 Issue 543: Write EEPROM now does something (NOT TESTED) //* Jan 1, 2012 Issue 544: stk500v2 bootloader doesn't support reading fuses //************************************************************************ //************************************************************************ //* these are used to test issues //* http://code.google.com/p/arduino/issues/detail?id=505 //* Reported by mark.stubbs, Mar 14, 2011 //* The STK500V2 bootloader is comparing the seqNum to 1 or the current sequence //* (IE: Requiring the sequence to be 1 or match seqNum before continuing). //* The correct behavior is for the STK500V2 to accept the PC's sequence number, and echo it back for the reply message. #define _FIX_ISSUE_505_ //************************************************************************ //* Issue 181: added watch dog timmer support #define _FIX_ISSUE_181_ #include #include #include #include #include #include #include #include #include #include "command.h" #if defined(_MEGA_BOARD_) || defined(_BOARD_AMBER128_) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) \ || defined(__AVR_ATmega2561__) || defined(__AVR_ATmega1284P__) || defined(ENABLE_MONITOR) #undef ENABLE_MONITOR #define ENABLE_MONITOR static void RunMonitor(void); #endif #ifndef EEWE #define EEWE 1 #endif #ifndef EEMWE #define EEMWE 2 #endif //#define _DEBUG_SERIAL_ //#define _DEBUG_WITH_LEDS_ /* * Uncomment the following lines to save code space */ //#define REMOVE_PROGRAM_LOCK_BIT_SUPPORT // disable program lock bits //#define REMOVE_BOOTLOADER_LED // no LED to show active bootloader //#define REMOVE_CMD_SPI_MULTI // disable processing of SPI_MULTI commands, Remark this line for AVRDUDE // //************************************************************************ //* LED on pin "PROGLED_PIN" on port "PROGLED_PORT" //* indicates that bootloader is active //* PG2 -> LED on Wiring board //************************************************************************ #define BLINK_LED_WHILE_WAITING #ifdef _MEGA_BOARD_ #define PROGLED_PORT PORTB #define PROGLED_DDR DDRB #define PROGLED_PIN PINB7 #elif defined( _BOARD_AMBER128_ ) //* this is for the amber 128 http://www.soc-robotics.com/ //* onbarod led is PORTE4 #define PROGLED_PORT PORTD #define PROGLED_DDR DDRD #define PROGLED_PIN PINE7 #elif defined( _CEREBOTPLUS_BOARD_ ) || defined(_CEREBOT_II_BOARD_) //* this is for the Cerebot 2560 board and the Cerebot-ii //* onbarod leds are on PORTE4-7 #define PROGLED_PORT PORTE #define PROGLED_DDR DDRE #define PROGLED_PIN PINE7 #elif defined( _PENGUINO_ ) //* this is for the Penguino //* onbarod led is PORTE4 #define PROGLED_PORT PORTC #define PROGLED_DDR DDRC #define PROGLED_PIN PINC6 #elif defined( _ANDROID_2561_ ) || defined( __AVR_ATmega2561__ ) //* this is for the Boston Android 2561 //* onbarod led is PORTE4 #define PROGLED_PORT PORTA #define PROGLED_DDR DDRA #define PROGLED_PIN PINA3 #elif defined( _BOARD_MEGA16 ) //* onbarod led is PORTA7 #define PROGLED_PORT PORTA #define PROGLED_DDR DDRA #define PROGLED_PIN PINA7 #define UART_BAUDRATE_DOUBLE_SPEED 0 #elif defined( _BOARD_BAHBOT_ ) //* dosent have an onboard LED but this is what will probably be added to this port #define PROGLED_PORT PORTB #define PROGLED_DDR DDRB #define PROGLED_PIN PINB0 #elif defined( _BOARD_ROBOTX_ ) #define PROGLED_PORT PORTB #define PROGLED_DDR DDRB #define PROGLED_PIN PINB6 #elif defined( _BOARD_CUSTOM1284_BLINK_B0_ ) #define PROGLED_PORT PORTB #define PROGLED_DDR DDRB #define PROGLED_PIN PINB0 #elif defined( _BOARD_CUSTOM1284_ ) #define PROGLED_PORT PORTD #define PROGLED_DDR DDRD #define PROGLED_PIN PIND5 #elif defined( _AVRLIP_ ) #define PROGLED_PORT PORTB #define PROGLED_DDR DDRB #define PROGLED_PIN PINB5 #elif defined( _BOARD_STK500_ ) #define PROGLED_PORT PORTA #define PROGLED_DDR DDRA #define PROGLED_PIN PINA7 #elif defined( _BOARD_STK502_ ) #define PROGLED_PORT PORTB #define PROGLED_DDR DDRB #define PROGLED_PIN PINB5 #elif defined( _BOARD_STK525_ ) #define PROGLED_PORT PORTB #define PROGLED_DDR DDRB #define PROGLED_PIN PINB7 #else #define PROGLED_PORT PORTG #define PROGLED_DDR DDRG #define PROGLED_PIN PING2 #endif /* * define CPU frequency in Mhz here if not defined in Makefile */ #ifndef F_CPU #define F_CPU 16000000UL #endif #define _BLINK_LOOP_COUNT_ (F_CPU / 2250) /* * UART Baudrate, AVRStudio AVRISP only accepts 115200 bps */ #ifndef BAUDRATE #define BAUDRATE 115200 #endif /* * Enable (1) or disable (0) USART double speed operation */ #ifndef UART_BAUDRATE_DOUBLE_SPEED #if defined (__AVR_ATmega32__) #define UART_BAUDRATE_DOUBLE_SPEED 0 #else #define UART_BAUDRATE_DOUBLE_SPEED 1 #endif #endif /* * HW and SW version, reported to AVRISP, must match version of AVRStudio */ #define CONFIG_PARAM_BUILD_NUMBER_LOW 0 #define CONFIG_PARAM_BUILD_NUMBER_HIGH 0 #define CONFIG_PARAM_HW_VER 0x0F #define CONFIG_PARAM_SW_MAJOR 2 #define CONFIG_PARAM_SW_MINOR 0x0A /* * Calculate the address where the bootloader starts from FLASHEND and BOOTSIZE * (adjust BOOTSIZE below and BOOTLOADER_ADDRESS in Makefile if you want to change the size of the bootloader) */ //#define BOOTSIZE 1024 #if FLASHEND > 0x0F000 #define BOOTSIZE 8192 #else #define BOOTSIZE 2048 #endif #define APP_END (FLASHEND -(2*BOOTSIZE) + 1) /* * Signature bytes are not available in avr-gcc io_xxx.h */ #if defined (__AVR_ATmega8__) #define SIGNATURE_BYTES 0x1E9307 #elif defined (__AVR_ATmega16__) #define SIGNATURE_BYTES 0x1E9403 #elif defined (__AVR_ATmega32__) #define SIGNATURE_BYTES 0x1E9502 #elif defined (__AVR_ATmega8515__) #define SIGNATURE_BYTES 0x1E9306 #elif defined (__AVR_ATmega8535__) #define SIGNATURE_BYTES 0x1E9308 #elif defined (__AVR_ATmega162__) #define SIGNATURE_BYTES 0x1E9404 #elif defined (__AVR_ATmega128__) #define SIGNATURE_BYTES 0x1E9702 #elif defined (__AVR_ATmega1280__) #define SIGNATURE_BYTES 0x1E9703 #elif defined (__AVR_ATmega2560__) #define SIGNATURE_BYTES 0x1E9801 #elif defined (__AVR_ATmega2561__) #define SIGNATURE_BYTES 0x1e9802 #elif defined (__AVR_ATmega1284P__) #define SIGNATURE_BYTES 0x1e9705 #elif defined (__AVR_ATmega640__) #define SIGNATURE_BYTES 0x1e9608 #elif defined (__AVR_ATmega64__) #define SIGNATURE_BYTES 0x1E9602 #elif defined (__AVR_ATmega169__) #define SIGNATURE_BYTES 0x1e9405 #elif defined (__AVR_AT90USB1287__) #define SIGNATURE_BYTES 0x1e9782 #else #error "no signature definition for MCU available" #endif #if defined(_BOARD_ROBOTX_) || defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB1286__) #define UART_BAUD_RATE_LOW UBRR1L #define UART_STATUS_REG UCSR1A #define UART_CONTROL_REG UCSR1B #define UART_ENABLE_TRANSMITTER TXEN1 #define UART_ENABLE_RECEIVER RXEN1 #define UART_TRANSMIT_COMPLETE TXC1 #define UART_RECEIVE_COMPLETE RXC1 #define UART_DATA_REG UDR1 #define UART_DOUBLE_SPEED U2X1 #elif defined(__AVR_ATmega8__) || defined(__AVR_ATmega16__) || defined(__AVR_ATmega32__) \ || defined(__AVR_ATmega8515__) || defined(__AVR_ATmega8535__) /* ATMega8 with one USART */ #define UART_BAUD_RATE_LOW UBRRL #define UART_STATUS_REG UCSRA #define UART_CONTROL_REG UCSRB #define UART_ENABLE_TRANSMITTER TXEN #define UART_ENABLE_RECEIVER RXEN #define UART_TRANSMIT_COMPLETE TXC #define UART_RECEIVE_COMPLETE RXC #define UART_DATA_REG UDR #define UART_DOUBLE_SPEED U2X #elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__) || defined(__AVR_ATmega162__) \ || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__) /* ATMega with two USART, use UART0 */ #define UART_BAUD_RATE_LOW UBRR0L #define UART_STATUS_REG UCSR0A #define UART_CONTROL_REG UCSR0B #define UART_ENABLE_TRANSMITTER TXEN0 #define UART_ENABLE_RECEIVER RXEN0 #define UART_TRANSMIT_COMPLETE TXC0 #define UART_RECEIVE_COMPLETE RXC0 #define UART_DATA_REG UDR0 #define UART_DOUBLE_SPEED U2X0 #elif defined(UBRR0L) && defined(UCSR0A) && defined(TXEN0) /* ATMega with two USART, use UART0 */ #define UART_BAUD_RATE_LOW UBRR0L #define UART_STATUS_REG UCSR0A #define UART_CONTROL_REG UCSR0B #define UART_ENABLE_TRANSMITTER TXEN0 #define UART_ENABLE_RECEIVER RXEN0 #define UART_TRANSMIT_COMPLETE TXC0 #define UART_RECEIVE_COMPLETE RXC0 #define UART_DATA_REG UDR0 #define UART_DOUBLE_SPEED U2X0 #elif defined(UBRRL) && defined(UCSRA) && defined(UCSRB) && defined(TXEN) && defined(RXEN) //* catch all #define UART_BAUD_RATE_LOW UBRRL #define UART_STATUS_REG UCSRA #define UART_CONTROL_REG UCSRB #define UART_ENABLE_TRANSMITTER TXEN #define UART_ENABLE_RECEIVER RXEN #define UART_TRANSMIT_COMPLETE TXC #define UART_RECEIVE_COMPLETE RXC #define UART_DATA_REG UDR #define UART_DOUBLE_SPEED U2X #else #error "no UART definition for MCU available" #endif /* * Macro to calculate UBBR from XTAL and baudrate */ #if defined(__AVR_ATmega32__) && UART_BAUDRATE_DOUBLE_SPEED #define UART_BAUD_SELECT(baudRate,xtalCpu) ((xtalCpu / 4 / baudRate - 1) / 2) #elif defined(__AVR_ATmega32__) #define UART_BAUD_SELECT(baudRate,xtalCpu) ((xtalCpu / 8 / baudRate - 1) / 2) #elif UART_BAUDRATE_DOUBLE_SPEED #define UART_BAUD_SELECT(baudRate,xtalCpu) (((float)(xtalCpu))/(((float)(baudRate))*8.0)-1.0+0.5) #else #define UART_BAUD_SELECT(baudRate,xtalCpu) (((float)(xtalCpu))/(((float)(baudRate))*16.0)-1.0+0.5) #endif /* * States used in the receive state machine */ #define ST_START 0 #define ST_GET_SEQ_NUM 1 #define ST_MSG_SIZE_1 2 #define ST_MSG_SIZE_2 3 #define ST_GET_TOKEN 4 #define ST_GET_DATA 5 #define ST_GET_CHECK 6 #define ST_PROCESS 7 /* * use 16bit address variable for ATmegas with <= 64K flash */ #if defined(RAMPZ) typedef uint32_t address_t; #else typedef uint16_t address_t; #endif /* * function prototypes */ static void sendchar(char c); static unsigned char recchar(void); /* * since this bootloader is not linked against the avr-gcc crt1 functions, * to reduce the code size, we need to provide our own initialization */ void __jumpMain (void) __attribute__ ((naked)) __attribute__ ((section (".init9"))); #include //#define SPH_REG 0x3E //#define SPL_REG 0x3D //***************************************************************************** void __jumpMain(void) { //* July 17, 2010 Added stack pointer initialzation //* the first line did not do the job on the ATmega128 asm volatile ( ".set __stack, %0" :: "i" (RAMEND) ); //* set stack pointer to top of RAM asm volatile ( "ldi 16, %0" :: "i" (RAMEND >> 8) ); asm volatile ( "out %0,16" :: "i" (AVR_STACK_POINTER_HI_ADDR) ); asm volatile ( "ldi 16, %0" :: "i" (RAMEND & 0x0ff) ); asm volatile ( "out %0,16" :: "i" (AVR_STACK_POINTER_LO_ADDR) ); asm volatile ( "clr __zero_reg__" ); // GCC depends on register r1 set to 0 asm volatile ( "out %0, __zero_reg__" :: "I" (_SFR_IO_ADDR(SREG)) ); // set SREG to 0 asm volatile ( "jmp main"); // jump to main() } //***************************************************************************** void delay_ms(unsigned int timedelay) { unsigned int i; for (i=0;i> 1) //***************************************************************************** static unsigned char recchar_timeout(void) { uint32_t count = 0; while (!(UART_STATUS_REG & (1 << UART_RECEIVE_COMPLETE))) { // wait for data count++; if (count > MAX_TIME_COUNT) { unsigned int data; #if (FLASHEND > 0x10000) data = pgm_read_word_far(0); //* get the first word of the user program #else data = pgm_read_word_near(0); //* get the first word of the user program #endif if (data != 0xffff) //* make sure its valid before jumping to it. { asm volatile( "clr r30 \n\t" "clr r31 \n\t" "ijmp \n\t" ); } count = 0; } } return UART_DATA_REG; } //* for watch dog timer startup void (*app_start)(void) = 0x0000; //***************************************************************************** int main(void) { address_t address = 0; address_t eraseAddress = 0; unsigned char msgParseState; unsigned int ii = 0; unsigned char checksum = 0; unsigned char seqNum = 0; unsigned int msgLength = 0; unsigned char msgBuffer[285]; unsigned char c, *p; unsigned char isLeave = 0; unsigned long boot_timeout; unsigned long boot_timer; unsigned int boot_state; #ifdef ENABLE_MONITOR unsigned int exPointCntr = 0; unsigned int rcvdCharCntr = 0; #endif //* some chips dont set the stack properly asm volatile ( ".set __stack, %0" :: "i" (RAMEND) ); asm volatile ( "ldi 16, %0" :: "i" (RAMEND >> 8) ); asm volatile ( "out %0,16" :: "i" (AVR_STACK_POINTER_HI_ADDR) ); asm volatile ( "ldi 16, %0" :: "i" (RAMEND & 0x0ff) ); asm volatile ( "out %0,16" :: "i" (AVR_STACK_POINTER_LO_ADDR) ); #ifdef _FIX_ISSUE_181_ //************************************************************************ //* Dec 29, 2011 Issue #181, added watch dog timmer support //* handle the watch dog timer uint8_t mcuStatusReg; mcuStatusReg = MCUSR; __asm__ __volatile__ ("cli"); __asm__ __volatile__ ("wdr"); MCUSR = 0; WDTCSR |= _BV(WDCE) | _BV(WDE); WDTCSR = 0; __asm__ __volatile__ ("sei"); // check if WDT generated the reset, if so, go straight to app if (mcuStatusReg & _BV(WDRF)) { app_start(); } //************************************************************************ #endif boot_timer = 0; boot_state = 0; #ifdef BLINK_LED_WHILE_WAITING // boot_timeout = 90000; //* should be about 4 seconds // boot_timeout = 170000; boot_timeout = 20000; //* should be about 1 second #else boot_timeout = 3500000; // 7 seconds , approx 2us per step when optimize "s" #endif /* * Branch to bootloader or application code ? */ #ifndef REMOVE_BOOTLOADER_LED /* PROG_PIN pulled low, indicate with LED that bootloader is active */ PROGLED_DDR |= (1< boot_timeout) { boot_state = 1; // (after ++ -> boot_state=2 bootloader timeout, jump to main 0x00000 ) } #ifdef BLINK_LED_WHILE_WAITING if ((boot_timer % _BLINK_LOOP_COUNT_) == 0) { //* toggle the LED PROGLED_PORT ^= (1<> 16) & 0x000000FF; } else if ( signatureIndex == 1 ) { answerByte = (SIGNATURE_BYTES >> 8) & 0x000000FF; } else { answerByte = SIGNATURE_BYTES & 0x000000FF; } } else if ( msgBuffer[4] & 0x50 ) { //* Issue 544: stk500v2 bootloader doesn't support reading fuses //* I cant find the docs that say what these are supposed to be but this was figured out by trial and error // answerByte = boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS); // answerByte = boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS); // answerByte = boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS); if (msgBuffer[4] == 0x50) { answerByte = boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS); } else if (msgBuffer[4] == 0x58) { answerByte = boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS); } else { answerByte = 0; } } else { answerByte = 0; // for all others command are not implemented, return dummy value for AVRDUDE happy } if ( !flag ) { msgLength = 7; msgBuffer[1] = STATUS_CMD_OK; msgBuffer[2] = 0; msgBuffer[3] = msgBuffer[4]; msgBuffer[4] = 0; msgBuffer[5] = answerByte; msgBuffer[6] = STATUS_CMD_OK; } } break; #endif case CMD_SIGN_ON: msgLength = 11; msgBuffer[1] = STATUS_CMD_OK; msgBuffer[2] = 8; msgBuffer[3] = 'A'; msgBuffer[4] = 'V'; msgBuffer[5] = 'R'; msgBuffer[6] = 'I'; msgBuffer[7] = 'S'; msgBuffer[8] = 'P'; msgBuffer[9] = '_'; msgBuffer[10] = '2'; break; case CMD_GET_PARAMETER: { unsigned char value; switch(msgBuffer[1]) { case PARAM_BUILD_NUMBER_LOW: value = CONFIG_PARAM_BUILD_NUMBER_LOW; break; case PARAM_BUILD_NUMBER_HIGH: value = CONFIG_PARAM_BUILD_NUMBER_HIGH; break; case PARAM_HW_VER: value = CONFIG_PARAM_HW_VER; break; case PARAM_SW_MAJOR: value = CONFIG_PARAM_SW_MAJOR; break; case PARAM_SW_MINOR: value = CONFIG_PARAM_SW_MINOR; break; default: value = 0; break; } msgLength = 3; msgBuffer[1] = STATUS_CMD_OK; msgBuffer[2] = value; } break; case CMD_LEAVE_PROGMODE_ISP: isLeave = 1; //* fall thru case CMD_SET_PARAMETER: case CMD_ENTER_PROGMODE_ISP: msgLength = 2; msgBuffer[1] = STATUS_CMD_OK; break; case CMD_READ_SIGNATURE_ISP: { unsigned char signatureIndex = msgBuffer[4]; unsigned char signature; if ( signatureIndex == 0 ) signature = (SIGNATURE_BYTES >>16) & 0x000000FF; else if ( signatureIndex == 1 ) signature = (SIGNATURE_BYTES >> 8) & 0x000000FF; else signature = SIGNATURE_BYTES & 0x000000FF; msgLength = 4; msgBuffer[1] = STATUS_CMD_OK; msgBuffer[2] = signature; msgBuffer[3] = STATUS_CMD_OK; } break; case CMD_READ_LOCK_ISP: msgLength = 4; msgBuffer[1] = STATUS_CMD_OK; msgBuffer[2] = boot_lock_fuse_bits_get( GET_LOCK_BITS ); msgBuffer[3] = STATUS_CMD_OK; break; case CMD_READ_FUSE_ISP: { unsigned char fuseBits; if ( msgBuffer[2] == 0x50 ) { if ( msgBuffer[3] == 0x08 ) fuseBits = boot_lock_fuse_bits_get( GET_EXTENDED_FUSE_BITS ); else fuseBits = boot_lock_fuse_bits_get( GET_LOW_FUSE_BITS ); } else { fuseBits = boot_lock_fuse_bits_get( GET_HIGH_FUSE_BITS ); } msgLength = 4; msgBuffer[1] = STATUS_CMD_OK; msgBuffer[2] = fuseBits; msgBuffer[3] = STATUS_CMD_OK; } break; #ifndef REMOVE_PROGRAM_LOCK_BIT_SUPPORT case CMD_PROGRAM_LOCK_ISP: { unsigned char lockBits = msgBuffer[4]; lockBits = (~lockBits) & 0x3C; // mask BLBxx bits boot_lock_bits_set(lockBits); // and program it boot_spm_busy_wait(); msgLength = 3; msgBuffer[1] = STATUS_CMD_OK; msgBuffer[2] = STATUS_CMD_OK; } break; #endif case CMD_CHIP_ERASE_ISP: eraseAddress = 0; msgLength = 2; // msgBuffer[1] = STATUS_CMD_OK; msgBuffer[1] = STATUS_CMD_FAILED; //* isue 543, return FAILED instead of OK break; case CMD_LOAD_ADDRESS: #if defined(RAMPZ) address = ( ((address_t)(msgBuffer[1])<<24)|((address_t)(msgBuffer[2])<<16)|((address_t)(msgBuffer[3])<<8)|(msgBuffer[4]) )<<1; #else address = ( ((msgBuffer[3])<<8)|(msgBuffer[4]) )<<1; //convert word to byte address #endif msgLength = 2; msgBuffer[1] = STATUS_CMD_OK; break; case CMD_PROGRAM_FLASH_ISP: case CMD_PROGRAM_EEPROM_ISP: { unsigned int size = ((msgBuffer[1])<<8) | msgBuffer[2]; unsigned char *p = msgBuffer+10; unsigned int data; unsigned char highByte, lowByte; address_t tempaddress = address; if ( msgBuffer[0] == CMD_PROGRAM_FLASH_ISP ) { // erase only main section (bootloader protection) if (eraseAddress < APP_END ) { boot_page_erase(eraseAddress); // Perform page erase boot_spm_busy_wait(); // Wait until the memory is erased. eraseAddress += SPM_PAGESIZE; // point to next page to be erase } /* Write FLASH */ do { lowByte = *p++; highByte = *p++; data = (highByte << 8) | lowByte; boot_page_fill(address,data); address = address + 2; // Select next word in memory size -= 2; // Reduce number of bytes to write by two } while (size); // Loop until all bytes written boot_page_write(tempaddress); boot_spm_busy_wait(); boot_rww_enable(); // Re-enable the RWW section } else { //* issue 543, this should work, It has not been tested. uint16_t ii = address >> 1; /* write EEPROM */ while (size) { eeprom_write_byte((uint8_t*)ii, *p++); address+=2; // Select next EEPROM byte ii++; size--; } } msgLength = 2; msgBuffer[1] = STATUS_CMD_OK; } break; case CMD_READ_FLASH_ISP: case CMD_READ_EEPROM_ISP: { unsigned int size = ((msgBuffer[1])<<8) | msgBuffer[2]; unsigned char *p = msgBuffer+1; msgLength = size+3; *p++ = STATUS_CMD_OK; if (msgBuffer[0] == CMD_READ_FLASH_ISP ) { unsigned int data; // Read FLASH do { //#if defined(RAMPZ) #if (FLASHEND > 0x10000) data = pgm_read_word_far(address); #else data = pgm_read_word_near(address); #endif *p++ = (unsigned char)data; //LSB *p++ = (unsigned char)(data >> 8); //MSB address += 2; // Select next word in memory size -= 2; }while (size); } else { /* Read EEPROM */ do { EEARL = address; // Setup EEPROM address EEARH = ((address >> 8)); address++; // Select next EEPROM byte EECR |= (1<>8)&0xFF); sendchar(c); checksum ^= c; c = msgLength&0x00FF; sendchar(c); checksum ^= c; sendchar(TOKEN); checksum ^= TOKEN; p = msgBuffer; while ( msgLength ) { c = *p++; sendchar(c); checksum ^=c; msgLength--; } sendchar(checksum); seqNum++; #ifndef REMOVE_BOOTLOADER_LED //* toggle the LED PROGLED_PORT ^= (1< base address = f000 avrdude: Device signature = 0x1e9703 avrdude: safemode: lfuse reads as FF avrdude: safemode: hfuse reads as D8 avrdude: safemode: efuse reads as F5 avrdude> */ //************************************************************************ #ifdef ENABLE_MONITOR #include unsigned long gRamIndex; unsigned long gFlashIndex; unsigned long gEepromIndex; #define true 1 #define false 0 #include "avr_cpunames.h" #ifndef _AVR_CPU_NAME_ #error cpu name not defined #endif #ifdef _VECTORS_SIZE #define kInterruptVectorCount (_VECTORS_SIZE / 4) #else #define kInterruptVectorCount 23 #endif void PrintDecInt(int theNumber, int digitCnt); #ifdef _AVR_CPU_NAME_ const char gTextMsg_CPU_Name[] PROGMEM = _AVR_CPU_NAME_; #else const char gTextMsg_CPU_Name[] PROGMEM = "UNKNOWN"; #endif const char gTextMsg_Explorer[] PROGMEM = "Arduino explorer stk500V2 by MLS"; const char gTextMsg_Prompt[] PROGMEM = "Bootloader>"; const char gTextMsg_HUH[] PROGMEM = "Huh?"; const char gTextMsg_COMPILED_ON[] PROGMEM = "Compiled on = "; const char gTextMsg_CPU_Type[] PROGMEM = "CPU Type = "; const char gTextMsg_AVR_ARCH[] PROGMEM = "__AVR_ARCH__= "; const char gTextMsg_AVR_LIBC[] PROGMEM = "AVR LibC Ver= "; const char gTextMsg_GCC_VERSION[] PROGMEM = "GCC Version = "; const char gTextMsg_CPU_SIGNATURE[] PROGMEM = "CPU ID = "; const char gTextMsg_FUSE_BYTE_LOW[] PROGMEM = "Low fuse = "; const char gTextMsg_FUSE_BYTE_HIGH[] PROGMEM = "High fuse = "; const char gTextMsg_FUSE_BYTE_EXT[] PROGMEM = "Ext fuse = "; const char gTextMsg_FUSE_BYTE_LOCK[] PROGMEM = "Lock fuse = "; const char gTextMsg_GCC_DATE_STR[] PROGMEM = __DATE__; const char gTextMsg_AVR_LIBC_VER_STR[] PROGMEM = __AVR_LIBC_VERSION_STRING__; const char gTextMsg_GCC_VERSION_STR[] PROGMEM = __VERSION__; const char gTextMsg_VECTOR_HEADER[] PROGMEM = "V# ADDR op code instruction addr Interrupt"; const char gTextMsg_noVector[] PROGMEM = "no vector"; const char gTextMsg_rjmp[] PROGMEM = "rjmp "; const char gTextMsg_jmp[] PROGMEM = "jmp "; const char gTextMsg_WHAT_PORT[] PROGMEM = "What port:"; const char gTextMsg_PortNotSupported[] PROGMEM = "Port not supported"; const char gTextMsg_MustBeLetter[] PROGMEM = "Must be a letter"; const char gTextMsg_SPACE[] PROGMEM = " "; const char gTextMsg_WriteToEEprom[] PROGMEM = "Writting EE"; const char gTextMsg_ReadingEEprom[] PROGMEM = "Reading EE"; const char gTextMsg_EEPROMerrorCnt[] PROGMEM = "EE err cnt="; const char gTextMsg_PORT[] PROGMEM = "PORT"; //************************************************************************ //* Help messages const char gTextMsg_HELP_MSG_0[] PROGMEM = "0=Zero addr"; const char gTextMsg_HELP_MSG_QM[] PROGMEM = "?=CPU stats"; const char gTextMsg_HELP_MSG_AT[] PROGMEM = "@=EEPROM test"; const char gTextMsg_HELP_MSG_B[] PROGMEM = "B=Blink LED"; const char gTextMsg_HELP_MSG_E[] PROGMEM = "E=Dump EEPROM"; const char gTextMsg_HELP_MSG_F[] PROGMEM = "F=Dump FLASH"; const char gTextMsg_HELP_MSG_H[] PROGMEM = "H=Help"; const char gTextMsg_HELP_MSG_L[] PROGMEM = "L=List I/O Ports"; // const char gTextMsg_HELP_MSG_Q[] PROGMEM = "Q=Quit & jump to user pgm"; const char gTextMsg_HELP_MSG_Q[] PROGMEM = "Q=Quit"; const char gTextMsg_HELP_MSG_R[] PROGMEM = "R=Dump RAM"; const char gTextMsg_HELP_MSG_V[] PROGMEM = "V=show interrupt Vectors"; const char gTextMsg_HELP_MSG_Y[] PROGMEM = "Y=Port blink"; const char gTextMsg_END[] PROGMEM = "*"; //************************************************************************ void PrintFromPROGMEM(const void *dataPtr, unsigned char offset) { char theChar; dataPtr += offset; do { #if (FLASHEND > 0x10000) theChar = pgm_read_byte_far((uint16_t)dataPtr++); #else theChar = pgm_read_byte_near((uint16_t)dataPtr++); #endif if (theChar != 0) { sendchar(theChar); } } while (theChar != 0); } //************************************************************************ void PrintNewLine(void) { sendchar(0x0d); sendchar(0x0a); } //************************************************************************ void PrintFromPROGMEMln(const void *dataPtr, unsigned char offset) { PrintFromPROGMEM(dataPtr, offset); PrintNewLine(); } //************************************************************************ void PrintString(char *textString) { char theChar; int ii; theChar = 1; ii = 0; while (theChar != 0) { theChar = textString[ii]; if (theChar != 0) { sendchar(theChar); } ii++; } } //************************************************************************ void PrintHexByte(unsigned char theByte) { char theChar; theChar = 0x30 + ((theByte >> 4) & 0x0f); if (theChar > 0x39) { theChar += 7; } sendchar(theChar ); theChar = 0x30 + (theByte & 0x0f); if (theChar > 0x39) { theChar += 7; } sendchar(theChar ); } //************************************************************************ void PrintDecInt(int theNumber, int digitCnt) { int theChar; int myNumber; myNumber = theNumber; if ((myNumber > 100) || (digitCnt >= 3)) { theChar = 0x30 + myNumber / 100; sendchar(theChar ); } if ((myNumber > 10) || (digitCnt >= 2)) { theChar = 0x30 + ((myNumber % 100) / 10 ); sendchar(theChar ); } theChar = 0x30 + (myNumber % 10); sendchar(theChar ); } //************************************************************************ static void PrintCPUstats(void) { unsigned char fuseByte; PrintFromPROGMEMln(gTextMsg_Explorer, 0); PrintFromPROGMEM(gTextMsg_COMPILED_ON, 0); PrintFromPROGMEMln(gTextMsg_GCC_DATE_STR, 0); PrintFromPROGMEM(gTextMsg_CPU_Type, 0); PrintFromPROGMEMln(gTextMsg_CPU_Name, 0); PrintFromPROGMEM(gTextMsg_AVR_ARCH, 0); PrintDecInt(__AVR_ARCH__, 1); PrintNewLine(); PrintFromPROGMEM(gTextMsg_GCC_VERSION, 0); PrintFromPROGMEMln(gTextMsg_GCC_VERSION_STR, 0); //* these can be found in avr/version.h PrintFromPROGMEM(gTextMsg_AVR_LIBC, 0); PrintFromPROGMEMln(gTextMsg_AVR_LIBC_VER_STR, 0); #if defined(SIGNATURE_0) PrintFromPROGMEM(gTextMsg_CPU_SIGNATURE, 0); //* these can be found in avr/iomxxx.h PrintHexByte(SIGNATURE_0); PrintHexByte(SIGNATURE_1); PrintHexByte(SIGNATURE_2); PrintNewLine(); #endif #if defined(GET_LOW_FUSE_BITS) //* fuse settings PrintFromPROGMEM(gTextMsg_FUSE_BYTE_LOW, 0); fuseByte = boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS); PrintHexByte(fuseByte); PrintNewLine(); PrintFromPROGMEM(gTextMsg_FUSE_BYTE_HIGH, 0); fuseByte = boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS); PrintHexByte(fuseByte); PrintNewLine(); PrintFromPROGMEM(gTextMsg_FUSE_BYTE_EXT, 0); fuseByte = boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS); PrintHexByte(fuseByte); PrintNewLine(); PrintFromPROGMEM(gTextMsg_FUSE_BYTE_LOCK, 0); fuseByte = boot_lock_fuse_bits_get(GET_LOCK_BITS); PrintHexByte(fuseByte); PrintNewLine(); #endif } //************************************************************************ static void BlinkLED(void) { PROGLED_DDR |= (1< 0) { if (myAddressPointer > 0x10000) { PrintHexByte((myAddressPointer >> 16) & 0x00ff); } PrintHexByte((myAddressPointer >> 8) & 0x00ff); PrintHexByte(myAddressPointer & 0x00ff); sendchar(0x20); sendchar('-'); sendchar(0x20); asciiDump[0] = 0; for (ii=0; ii<16; ii++) { switch(dumpWhat) { case kDUMP_FLASH: #if (FLASHEND > 0x10000) theValue = pgm_read_byte_far(myAddressPointer); #else theValue = pgm_read_byte_near(myAddressPointer); #endif break; case kDUMP_EEPROM: theValue = eeprom_read_byte((uint8_t *)(uint16_t)myAddressPointer); break; case kDUMP_RAM: theValue = ramPtr[myAddressPointer]; break; } PrintHexByte(theValue); sendchar(0x20); if ((theValue >= 0x20) && (theValue < 0x7f)) { asciiDump[ii % 16] = theValue; } else { asciiDump[ii % 16] = '.'; } myAddressPointer++; } asciiDump[16] = 0; PrintString(asciiDump); PrintNewLine(); numRows--; } } //************************************************************************ //* returns amount of extended memory static void EEPROMtest(void) { int ii; char theChar; char theEEPROMchar; int errorCount; PrintFromPROGMEMln(gTextMsg_WriteToEEprom, 0); PrintNewLine(); ii = 0; #if (FLASHEND > 0x10000) while (((theChar = pgm_read_byte_far(((uint16_t)gTextMsg_Explorer) + ii)) != '*') && (ii < 512)) #else while (((theChar = pgm_read_byte_near(((uint16_t)gTextMsg_Explorer) + ii)) != '*') && (ii < 512)) #endif { eeprom_write_byte((uint8_t *)ii, theChar); if (theChar == 0) { PrintFromPROGMEM(gTextMsg_SPACE, 0); } else { sendchar(theChar); } ii++; } //* no go back through and test PrintNewLine(); PrintNewLine(); PrintFromPROGMEMln(gTextMsg_ReadingEEprom, 0); PrintNewLine(); errorCount = 0; ii = 0; #if (FLASHEND > 0x10000) while (((theChar = pgm_read_byte_far((uint16_t)gTextMsg_Explorer + ii)) != '*') && (ii < 512)) #else while (((theChar = pgm_read_byte_near((uint16_t)gTextMsg_Explorer + ii)) != '*') && (ii < 512)) #endif { theEEPROMchar = eeprom_read_byte((uint8_t *)ii); if (theEEPROMchar == 0) { PrintFromPROGMEM(gTextMsg_SPACE, 0); } else { sendchar(theEEPROMchar); } if (theEEPROMchar != theChar) { errorCount++; } ii++; } PrintNewLine(); PrintNewLine(); PrintFromPROGMEM(gTextMsg_EEPROMerrorCnt, 0); PrintDecInt(errorCount, 1); PrintNewLine(); PrintNewLine(); gEepromIndex = 0; //* set index back to zero for next eeprom dump } #if (FLASHEND > 0x08000) //* this includes the interrupt names for the monitor portion. There is no longer enough //* memory to include this // #include "avrinterruptnames.h" // #ifndef _INTERRUPT_NAMES_DEFINED_ // #warning Interrupt vectors not defined // #endif #endif //************************************************************************ static void VectorDisplay(void) { unsigned long byte1; unsigned long byte2; unsigned long byte3; unsigned long byte4; unsigned long word1; unsigned long word2; int vectorIndex; unsigned long myMemoryPtr; unsigned long wordMemoryAddress; unsigned long realitiveAddr; unsigned long myFullAddress; unsigned long absoluteAddr; #if defined(_INTERRUPT_NAMES_DEFINED_) long stringPointer; #endif myMemoryPtr = 0; vectorIndex = 0; PrintFromPROGMEMln(gTextMsg_CPU_Name, 0); PrintFromPROGMEMln(gTextMsg_VECTOR_HEADER, 0); // V# ADDR op code // 1 - 0000 = C3 BB 00 00 rjmp 03BB >000776 RESET while (vectorIndex < kInterruptVectorCount) { wordMemoryAddress = myMemoryPtr / 2; // 01 - 0000 = 12 34 PrintDecInt(vectorIndex + 1, 2); sendchar(0x20); sendchar('-'); sendchar(0x20); PrintHexByte((wordMemoryAddress >> 8) & 0x00ff); PrintHexByte((wordMemoryAddress) & 0x00ff); sendchar(0x20); sendchar('='); sendchar(0x20); //* the AVR is LITTLE ENDIAN, swap the byte order #if (FLASHEND > 0x10000) byte1 = pgm_read_byte_far(myMemoryPtr++); byte2 = pgm_read_byte_far(myMemoryPtr++); byte3 = pgm_read_byte_far(myMemoryPtr++); byte4 = pgm_read_byte_far(myMemoryPtr++); #else byte1 = pgm_read_byte_near(myMemoryPtr++); byte2 = pgm_read_byte_near(myMemoryPtr++); byte3 = pgm_read_byte_near(myMemoryPtr++); byte4 = pgm_read_byte_near(myMemoryPtr++); #endif word1 = (byte2 << 8) + byte1; word2 = (byte4 << 8) + byte3; PrintHexByte(byte2); sendchar(0x20); PrintHexByte(byte1); sendchar(0x20); PrintHexByte(byte4); sendchar(0x20); PrintHexByte(byte3); sendchar(0x20); if (word1 == 0xffff) { PrintFromPROGMEM(gTextMsg_noVector, 0); } else if ((word1 & 0xc000) == 0xc000) { //* rjmp instruction realitiveAddr = word1 & 0x3FFF; absoluteAddr = wordMemoryAddress + realitiveAddr; //* add the offset to the current address absoluteAddr = absoluteAddr << 1; //* multiply by 2 for byte address PrintFromPROGMEM(gTextMsg_rjmp, 0); PrintHexByte((realitiveAddr >> 8) & 0x00ff); PrintHexByte((realitiveAddr) & 0x00ff); sendchar(0x20); sendchar('>'); PrintHexByte((absoluteAddr >> 16) & 0x00ff); PrintHexByte((absoluteAddr >> 8) & 0x00ff); PrintHexByte((absoluteAddr) & 0x00ff); } else if ((word1 & 0xfE0E) == 0x940c) { //* jmp instruction, this is REALLY complicated, refer to the instruction manual (JMP) myFullAddress = ((byte1 & 0x01) << 16) + ((byte1 & 0xf0) << 17) + ((byte2 & 0x01) << 21) + word2; absoluteAddr = myFullAddress << 1; PrintFromPROGMEM(gTextMsg_jmp, 0); PrintHexByte((myFullAddress >> 16) & 0x00ff); PrintHexByte((myFullAddress >> 8) & 0x00ff); PrintHexByte((myFullAddress) & 0x00ff); sendchar(0x20); sendchar('>'); PrintHexByte((absoluteAddr >> 16) & 0x00ff); PrintHexByte((absoluteAddr >> 8) & 0x00ff); PrintHexByte((absoluteAddr) & 0x00ff); } #if defined(_INTERRUPT_NAMES_DEFINED_) sendchar(0x20); #if (FLASHEND > 0x10000) stringPointer = pgm_read_word_far(&(gInterruptNameTable[vectorIndex])); #else stringPointer = pgm_read_word_near(&(gInterruptNameTable[vectorIndex])); #endif PrintFromPROGMEM((char *)stringPointer, 0); #endif PrintNewLine(); vectorIndex++; } } //************************************************************************ static void PrintAvailablePort(char thePortLetter) { PrintFromPROGMEM(gTextMsg_PORT, 0); sendchar(thePortLetter); PrintNewLine(); } //************************************************************************ static void ListAvailablePorts(void) { #ifdef DDRA PrintAvailablePort('A'); #endif #ifdef DDRB PrintAvailablePort('B'); #endif #ifdef DDRC PrintAvailablePort('C'); #endif #ifdef DDRD PrintAvailablePort('D'); #endif #ifdef DDRE PrintAvailablePort('E'); #endif #ifdef DDRF PrintAvailablePort('F'); #endif #ifdef DDRG PrintAvailablePort('G'); #endif #ifdef DDRH PrintAvailablePort('H'); #endif #ifdef DDRI PrintAvailablePort('I'); #endif #ifdef DDRJ PrintAvailablePort('J'); #endif #ifdef DDRK PrintAvailablePort('K'); #endif #ifdef DDRL PrintAvailablePort('L'); #endif } //************************************************************************ static void AVR_PortOutput(void) { char portLetter; char getCharFlag; PrintFromPROGMEM(gTextMsg_WHAT_PORT, 0); portLetter = recchar(); portLetter = portLetter & 0x5f; sendchar(portLetter); PrintNewLine(); if ((portLetter >= 'A') && (portLetter <= 'Z')) { getCharFlag = true; switch(portLetter) { #ifdef DDRA case 'A': DDRA = 0xff; while (!Serial_Available()) { PORTA ^= 0xff; delay_ms(200); } PORTA = 0; break; #endif #ifdef DDRB case 'B': DDRB = 0xff; while (!Serial_Available()) { PORTB ^= 0xff; delay_ms(200); } PORTB = 0; break; #endif #ifdef DDRC case 'C': DDRC = 0xff; while (!Serial_Available()) { PORTC ^= 0xff; delay_ms(200); } PORTC = 0; break; #endif #ifdef DDRD case 'D': DDRD = 0xff; while (!Serial_Available()) { PORTD ^= 0xff; delay_ms(200); } PORTD = 0; break; #endif #ifdef DDRE case 'E': DDRE = 0xff; while (!Serial_Available()) { PORTE ^= 0xff; delay_ms(200); } PORTE = 0; break; #endif #ifdef DDRF case 'F': DDRF = 0xff; while (!Serial_Available()) { PORTF ^= 0xff; delay_ms(200); } PORTF = 0; break; #endif #ifdef DDRG case 'G': DDRG = 0xff; while (!Serial_Available()) { PORTG ^= 0xff; delay_ms(200); } PORTG = 0; break; #endif #ifdef DDRH case 'H': DDRH = 0xff; while (!Serial_Available()) { PORTH ^= 0xff; delay_ms(200); } PORTH = 0; break; #endif #ifdef DDRI case 'I': DDRI = 0xff; while (!Serial_Available()) { PORTI ^= 0xff; delay_ms(200); } PORTI = 0; break; #endif #ifdef DDRJ case 'J': DDRJ = 0xff; while (!Serial_Available()) { PORTJ ^= 0xff; delay_ms(200); } PORTJ = 0; break; #endif #ifdef DDRK case 'K': DDRK = 0xff; while (!Serial_Available()) { PORTK ^= 0xff; delay_ms(200); } PORTK = 0; break; #endif #ifdef DDRL case 'L': DDRL = 0xff; while (!Serial_Available()) { PORTL ^= 0xff; delay_ms(200); } PORTL = 0; break; #endif default: PrintFromPROGMEMln(gTextMsg_PortNotSupported, 0); getCharFlag = false; break; } if (getCharFlag) { recchar(); } } else { PrintFromPROGMEMln(gTextMsg_MustBeLetter, 0); } } //******************************************************************* static void PrintHelp(void) { PrintFromPROGMEMln(gTextMsg_HELP_MSG_0, 0); PrintFromPROGMEMln(gTextMsg_HELP_MSG_QM, 0); PrintFromPROGMEMln(gTextMsg_HELP_MSG_AT, 0); PrintFromPROGMEMln(gTextMsg_HELP_MSG_B, 0); PrintFromPROGMEMln(gTextMsg_HELP_MSG_E, 0); PrintFromPROGMEMln(gTextMsg_HELP_MSG_F, 0); PrintFromPROGMEMln(gTextMsg_HELP_MSG_H, 0); PrintFromPROGMEMln(gTextMsg_HELP_MSG_L, 0); PrintFromPROGMEMln(gTextMsg_HELP_MSG_Q, 0); PrintFromPROGMEMln(gTextMsg_HELP_MSG_R, 0); PrintFromPROGMEMln(gTextMsg_HELP_MSG_V, 0); PrintFromPROGMEMln(gTextMsg_HELP_MSG_Y, 0); } //************************************************************************ static void RunMonitor(void) { char keepGoing; unsigned char theChar; int ii, jj; for (ii=0; ii<5; ii++) { for (jj=0; jj<25; jj++) { sendchar('!'); } PrintNewLine(); } gRamIndex = 0; gFlashIndex = 0; gEepromIndex = 0; PrintFromPROGMEMln(gTextMsg_Explorer, 0); keepGoing = 1; while (keepGoing) { PrintFromPROGMEM(gTextMsg_Prompt, 0); theChar = recchar(); if (theChar >= 0x60) { theChar = theChar & 0x5F; } if (theChar >= 0x20) { sendchar(theChar); sendchar(0x20); } switch(theChar) { case '0': PrintFromPROGMEMln(gTextMsg_HELP_MSG_0, 2); gFlashIndex = 0; gRamIndex = 0; gEepromIndex = 0; break; case '?': PrintFromPROGMEMln(gTextMsg_HELP_MSG_QM, 2); PrintCPUstats(); break; case '@': PrintFromPROGMEMln(gTextMsg_HELP_MSG_AT, 2); EEPROMtest(); break; case 'B': PrintFromPROGMEMln(gTextMsg_HELP_MSG_B, 2); BlinkLED(); break; case 'E': PrintFromPROGMEMln(gTextMsg_HELP_MSG_E, 2); DumpHex(kDUMP_EEPROM, gEepromIndex, 16); gEepromIndex += 256; if (gEepromIndex > E2END) { gEepromIndex = 0; } break; case 'F': PrintFromPROGMEMln(gTextMsg_HELP_MSG_F, 2); DumpHex(kDUMP_FLASH, gFlashIndex, 16); gFlashIndex += 256; break; case 'H': PrintFromPROGMEMln(gTextMsg_HELP_MSG_H, 2); PrintHelp(); break; case 'L': PrintFromPROGMEMln(gTextMsg_HELP_MSG_L, 2); ListAvailablePorts(); break; case 'Q': PrintFromPROGMEMln(gTextMsg_HELP_MSG_Q, 2); keepGoing = false; break; case 'R': PrintFromPROGMEMln(gTextMsg_HELP_MSG_R, 2); DumpHex(kDUMP_RAM, gRamIndex, 16); gRamIndex += 256; break; case 'V': PrintFromPROGMEMln(gTextMsg_HELP_MSG_V, 2); VectorDisplay(); break; case 'Y': PrintFromPROGMEMln(gTextMsg_HELP_MSG_Y, 2); AVR_PortOutput(); break; default: PrintFromPROGMEMln(gTextMsg_HUH, 0); break; } } } #endif ================================================ FILE: external/arduino/avr/bootloaders/stk500v2/stk500boot.ppg ================================================ ================================================ FILE: external/arduino/avr/bootloaders/stk500v2/stk500boot_v2_mega2560.hex ================================================ :020000023000CC :10E000000D9489F10D94B2F10D94B2F10D94B2F129 :10E010000D94B2F10D94B2F10D94B2F10D94B2F1F0 :10E020000D94B2F10D94B2F10D94B2F10D94B2F1E0 :10E030000D94B2F10D94B2F10D94B2F10D94B2F1D0 :10E040000D94B2F10D94B2F10D94B2F10D94B2F1C0 :10E050000D94B2F10D94B2F10D94B2F10D94B2F1B0 :10E060000D94B2F10D94B2F10D94B2F10D94B2F1A0 :10E070000D94B2F10D94B2F10D94B2F10D94B2F190 :10E080000D94B2F10D94B2F10D94B2F10D94B2F180 :10E090000D94B2F10D94B2F10D94B2F10D94B2F170 :10E0A0000D94B2F10D94B2F10D94B2F10D94B2F160 :10E0B0000D94B2F10D94B2F10D94B2F10D94B2F150 :10E0C0000D94B2F10D94B2F10D94B2F10D94B2F140 :10E0D0000D94B2F10D94B2F10D94B2F10D94B2F130 :10E0E0000D94B2F141546D656761323536300041AF :10E0F000726475696E6F206578706C6F72657220DE :10E1000073746B3530305632206279204D4C530099 :10E11000426F6F746C6F616465723E004875683F52 :10E1200000436F6D70696C6564206F6E203D200048 :10E130004350552054797065202020203D20005FF9 :10E140005F4156525F415243485F5F3D2000415658 :10E1500052204C696243205665723D20004743437C :10E160002056657273696F6E203D20004350552024 :10E1700049442020202020203D20004C6F7720663D :10E18000757365202020203D20004869676820665F :10E190007573652020203D200045787420667573D6 :10E1A00065202020203D20004C6F636B2066757336 :10E1B000652020203D20004D617220203720323024 :10E1C000313300312E362E3800342E332E350056A2 :10E1D00023202020414444522020206F7020636F70 :10E1E00064652020202020696E73747275637469E1 :10E1F0006F6E2061646472202020496E74657272B3 :10E20000757074006E6F20766563746F7200726A49 :10E210006D702020006A6D70200057686174207056 :10E220006F72743A00506F7274206E6F7420737541 :10E2300070706F72746564004D7573742062652030 :10E2400061206C6574746572002000577269747483 :10E25000696E672045450052656164696E672045B7 :10E26000450045452065727220636E743D00504F35 :10E27000525400303D5A65726F2061646472003FF1 :10E280003D43505520737461747300403D454550C3 :10E29000524F4D207465737400423D426C696E6B41 :10E2A000204C454400453D44756D70204545505215 :10E2B0004F4D00463D44756D7020464C415348001B :10E2C000483D48656C70004C3D4C69737420492F83 :10E2D0004F20506F72747300513D51756974005234 :10E2E0003D44756D702052414D00563D73686F7707 :10E2F00020696E7465727275707420566563746FF0 :10E30000727300593D506F727420626C696E6B00BD :10E310002A0011241FBECFEFD1E2DEBFCDBF01E046 :10E320000CBF12E0A0E0B2E0EEE1FDEF03E00BBFB6 :10E3300002C007900D92A030B107D9F712E0A0E01B :10E34000B2E001C01D92AE30B107E1F70F9460F367 :10E350000D948DFE01E20EBF0FEF0DBF11241FBE05 :10E360000D9460F30D9400F020E030E040ED57E0B4 :10E3700005C0FA013197F1F72F5F3F4F2817390792 :10E38000C0F308959C01260F311DC901A0E0B0E043 :10E390002F5F3F4FABBFFC018791882361F08093D3 :10E3A000C6008091C00086FFFCCF8091C0008064D1 :10E3B0008093C000EACF08958DE08093C6008091DD :10E3C000C00086FFFCCF8091C00080648093C000B5 :10E3D0008AE08093C6008091C00086FFFCCF8091C8 :10E3E000C00080648093C00008950F94C2F10F9420 :10E3F000DCF10895FC019081992359F09093C600B7 :10E400008091C00086FFFCCF8091C0008064809323 :10E41000C0003196992379F70895282F982F929567 :10E420009F70892F805D8A3308F0895F8093C600D2 :10E430008091C00086FFFCCF8091C00080648093F3 :10E44000C000822F8F70982F905D9A3308F0995FEB :10E450009093C6008091C00086FFFCCF8091C000E1 :10E4600080648093C00008959C01FB01853691056E :10E470001CF46330710594F0C90164E670E00F94F8 :10E480002EFE605D7F4F6093C6008091C00086FFC6 :10E49000FCCF8091C00080648093C0002B30310598 :10E4A00014F43297B4F0C90164E670E00F942EFEC4 :10E4B0006AE070E00F942EFE605D7F4F6093C600AF :10E4C0008091C00086FFFCCF8091C0008064809363 :10E4D000C000C9016AE070E00F942EFEC0968093E0 :10E4E000C6008091C00086FFFCCF8091C000806490 :10E4F0008093C00008951F93182F8EE692EE60E07F :10E500000F94C2F11093C6008091C00086FFFCCF2B :10E510008091C00080648093C0000F94DCF11F9153 :10E5200008952F923F924F925F926F927F928F92B7 :10E530009F92AF92BF92CF92DF92EF92FF920F9392 :10E540001F93DF93CF93CDB7DEB762970FB6F894E2 :10E55000DEBF0FBECDBF382E622ECA01DB015C01CB :10E560006D01772420E2222E2E010894411C511CBB :10E570008BC081E0A81680E0B80681E0C80680E084 :10E58000D80628F0C601AA27BB270F940DF2BB2797 :10E59000AD2D9C2D8B2D0F940DF28A2D0F940DF225 :10E5A0002092C6008091C00086FFFCCF8091C00001 :10E5B00080648093C0009DE29093C6008091C0006B :10E5C00086FFFCCF8091C00080648093C0002092C1 :10E5D000C6008091C00086FFFCCF8091C00080649F :10E5E0008093C00019828601750188249924A1E0D6 :10E5F0003A1651F03A1620F0B2E03B1661F409C029 :10E600000BBFF701779007C0C7010F9477FE782EF4 :10E6100002C0F7017080872D0F940DF22092C60082 :10E620008091C00086FFFCCF8091C0008064809301 :10E63000C000872D8052F401EF70F0708F3520F408 :10E64000E40DF51D708204C0E40DF51D8EE280839B :10E650000894E11CF11C011D111D0894811C911CE2 :10E6600090E18916910409F0C2CF80E190E0A0E02A :10E67000B0E0A80EB91ECA1EDB1E198AC2010F9493 :10E68000FAF10F94DCF16A94662009F072CF629679 :10E690000FB6F894DEBF0FBECDBFCF91DF911F91B3 :10E6A0000F91FF90EF90DF90CF90BF90AF909F9031 :10E6B0008F907F906F905F904F903F902F90089534 :10E6C0002F923F924F925F926F927F928F929F9282 :10E6D000AF92BF92CF92DF92EF92FF920F931F9370 :10E6E000DF93CF93CDB7DEB7CD53D1400FB6F894BB :10E6F000DEBF0FBECDBF01E20EBF0FEF0DBF94B75F :10E70000F894A89514BE80916000886180936000A1 :10E7100010926000789493FF05C0E0910002F091A0 :10E7200001021995279A2F9A8091C00082608093E8 :10E73000C00080E18093C40088E18093C1000000A4 :10E74000EE24FF24870144E0A42EB12CCC24DD2448 :10E7500024C0C5010197F1F70894E11CF11C011DCB :10E76000111D21E2E2162EE4F20620E0020720E06D :10E77000120718F031E0C32ED12CC801B70127ECE5 :10E780003BE140E050E00F9441FE611571058105C9 :10E79000910519F485B1805885B98091C00087FD35 :10E7A00003C0C114D104A9F2A6014F5F5F4FC25E3E :10E7B000DE4F59834883CE51D140C25EDE4F8881FF :10E7C0009981CE51D140019711F00D9410FEC05D9A :10E7D000DE4F19821882C053D14060E0C15DDE4F28 :10E7E0001882CF52D14088249924C35DDE4F19820C :10E7F0001882CD52D140C05EDE4F188219821A8233 :10E800001B82C052D140CE5CDE4F188219821A8220 :10E810001B82C253D140EE24FF2487010BBFF701B6 :10E8200007911691C45CDE4F19830883CC53D14005 :10E830000D940BFEC25EDE4F28813981CE51D1404E :10E840002130310509F52091C600C25EDE4F1982E4 :10E850001882CE51D14022C02F5F3F4F4F4F5F4FA4 :10E86000213082E138078AE7480780E0580780F0C6 :10E87000C45CDE4FE881F981CC53D140EF5FFF4F9C :10E8800019F0EE27FF27099420E030E040E050E047 :10E890008091C00087FFE0CF2091C600C35DDE4FAE :10E8A00048815981CD52D1404F5F5F4FC35DDE4FEC :10E8B00059834883CD52D140213209F063C64A3092 :10E8C000510508F05FC60894811C911C53E0851621 :10E8D000910409F059C600E010E018C081E280936D :10E8E000C6008091C00086FFFCCF8091C00080648C :10E8F0008093C0002F5F3F4F2931310579F70F9486 :10E90000DCF10F5F1F4F0530110519F020E030E0FA :10E91000E5CF10920A0210920B0210920C02109294 :10E920000D02109206021092070210920802109235 :10E930000902109202021092030210920402109235 :10E9400005028FEE90EE60E00F94F5F180E191EE1C :10E9500060E00F94C2F18091C00087FFFCCF9091DE :10E96000C600903608F09F759032B8F09093C600BC :10E970008091C00086FFFCCF8091C00080648093AE :10E98000C000A0E2A093C6008091C00086FFFCCF2B :10E990008091C00080648093C000983409F4D7C18E :10E9A0009934B8F4923409F459C1933458F490333B :10E9B00019F1903308F4E3C59F33A1F1903409F0C5 :10E9C000DEC5BDC0953409F470C1963409F0D7C5D1 :10E9D00098C1923509F42BC2933538F49C3409F46C :10E9E000F5C1913509F0CBC518C2963509F445C279 :10E9F000993509F0C4C567C483E792EE62E00F94CD :10EA0000F5F110920602109207021092080210927D :10EA1000090210920A0210920B0210920C0210923C :10EA20000D0213C18FE792EE62E00F94F5F18FEEC5 :10EA300090EE60E00F94F5F181E291EE60E00F94CA :10EA4000C2F187EB91EE60E00F94F5F180E391EE77 :10EA500060E00F94C2F184EE90EE60E00F94F5F167 :10EA60008FE391EE60E00F94C2F186E090E061E008 :10EA700070E00F9434F20F94DCF18DE591EE60E0DC :10EA80000F94C2F189EC91EE60E00F94F5F18EE401 :10EA900091EE60E00F94C2F183EC91EE60E00F9490 :10EAA000F5F18CE691EE60E00F94C2F18EE10F94E7 :10EAB0000DF288E90F940DF281E00F940DF20F949E :10EAC000DCF18BE791EE60E00F94C2F119E0E0E039 :10EAD000F0E010935700E4918E2F0F940DF20F94F5 :10EAE000DCF18AE891EE60E00F94C2F1E3E0F0E03F :10EAF00010935700E4918E2F0F940DF20F94DCF1D8 :10EB000089E991EE60E00F94C2F1E2E0F0E0109349 :10EB10005700E4918E2F0F940DF20F94DCF188EAE8 :10EB200091EE60E00F94C2F1E1E0F0E01093570045 :10EB30001491812F0F940DF20F94DCF107CF8BE825 :10EB400092EE62E00F94F5F18BE492EE60E00F94A8 :10EB5000F5F10F94DCF100E010E019C0C8016F2D51 :10EB60000F947FFEFF2031F489E492EE60E00F9471 :10EB7000C2F10BC0F092C6008091C00086FFFCCFAE :10EB80008091C00080648093C0000F5F1F4FC80158 :10EB900081519F41A0E0B0E0ABBFFC01F790BAE229 :10EBA000FB1621F0E2E000301E07C1F60F94DCF105 :10EBB0000F94DCF187E592EE60E00F94F5F10F948D :10EBC000DCF1CC24DD2400E010E01EC0C8010F946D :10EBD00077FEF82E882331F489E492EE60E00F94FA :10EBE000C2F10BC08093C6008091C00086FFFCCFAD :10EBF0008091C00080648093C000FE1419F00894D6 :10EC0000C11CD11C0F5F1F4FC80181519F41A0E063 :10EC1000B0E0ABBFFC01E790FAE2EF1621F022E092 :10EC20000030120799F60F94DCF10F94DCF182E6C4 :10EC300092EE60E00F94C2F1C60161E070E00F94C3 :10EC400034F20F94DCF10F94DCF110920202109276 :10EC50000302109204021092050278CE89E992EE26 :10EC600062E00F94F5F1279A2F9A16C02F9880E052 :10EC700090E0E0EDF7E03197F1F7019684369105E9 :10EC8000C1F72F9A80E090E0E0EDF7E03197F1F7DF :10EC9000019684369105C1F78091C00087FFE6CFC9 :10ECA0008091C00087FFFCCF64C485EA92EE62E0E9 :10ECB0000F94F5F140910202509103026091040219 :10ECC0007091050281E020E10F9491F2809102029F :10ECD00090910302A0910402B091050280509F4FD1 :10ECE000AF4FBF4F8093020290930302A0930402A0 :10ECF000B093050280509041A040B04008F426CE69 :10ED0000A4CF83EB92EE62E00F94F5F140910602FE :10ED100050910702609108027091090280E020E1A1 :10ED20000F9491F28091060290910702A09108023F :10ED3000B091090280509F4FAF4FBF4F80930602A2 :10ED400090930702A0930802B0930902FFCD80ECD4 :10ED500092EE62E00F94F5F183E792EE60E00F949B :10ED6000F5F18FE792EE60E00F94F5F18BE892EE0B :10ED700060E00F94F5F189E992EE60E00F94F5F10F :10ED800085EA92EE60E00F94F5F183EB92EE60E09D :10ED90000F94F5F180EC92EE60E00F94F5F187ECC2 :10EDA00092EE60E00F94F5F188ED92EE60E00F9442 :10EDB000F5F18FED92EE60E00F94F5F18AEE92EEB0 :10EDC00060E00F94F5F183E093EEBDCD87EC92EE19 :10EDD00062E00F94F5F181E40F947BF282E40F94EA :10EDE0007BF283E40F947BF284E40F947BF285E45E :10EDF0000F947BF286E40F947BF287E40F947BF20E :10EE000088E40F947BF28AE40F947BF28BE40F94F6 :10EE10007BF28CE40F947BF299CD88ED92EE62E068 :10EE20000F94F5F1772473948824992409C48FED05 :10EE300092EE62E00F94F5F140910A0250910B02BC :10EE400060910C0270910D0282E020E10F9491F22A :10EE500080910A0290910B02A0910C02B0910D02D8 :10EE600080509F4FAF4FBF4F80930A0290930B0289 :10EE7000A0930C02B0930D0269CD8AEE92EE62E08F :10EE80000F94F5F184EE90EE60E00F94F5F18FECC5 :10EE900091EE60E00F94F5F1662477244301CC5D98 :10EEA000DE4F19821882C452D140D401C301B695F5 :10EEB000A79597958795CA5DDE4F88839983AA8326 :10EEC000BB83C652D140CC5DDE4FA881B981C4520C :10EED000D1401196CC5DDE4FB983A883C452D14096 :10EEE000CD0162E070E00F9434F2B0E2B093C6005E :10EEF0008091C00086FFFCCF8091C0008064809329 :10EF0000C000EDE2E093C6008091C00086FFFCCF18 :10EF10008091C00080648093C000F0E2F093C6004E :10EF20008091C00086FFFCCF8091C00080648093F8 :10EF3000C000CA5DDE4FE880F9800A811B81C6529D :10EF4000D140BB27A12F902F8F2D0F940DF2CA5DBA :10EF5000DE4F8881C652D1400F940DF2B0E2FB2EF5 :10EF6000F092C6008091C00086FFFCCF8091C00067 :10EF700080648093C0000DE30093C6008091C000C0 :10EF800086FFFCCF8091C00080648093C00010E2B7 :10EF90001093C6008091C00086FFFCCF8091C00016 :10EFA00080648093C0008BBEF3012791C65DDE4F65 :10EFB0002883CA52D140A22EBB24CC24DD2408943D :10EFC000611C711C811C911C8BBEF3018791282E42 :10EFD0003324442455240894611C711C811C911C09 :10EFE0008BBEF3013791C55DDE4F3883CB52D140E4 :10EFF0000894611C711C811C911C8BBEF30147910C :10F00000C45DDE4F4883CC52D140ADEFEA2EAFEF66 :10F01000FA2EAFEF0A2FAFEF1A2F6E0C7F1C801E57 :10F02000911E142D032DF22CEE24EA0CFB1C0C1D5A :10F030001D1D0F940DF220E22093C6008091C000A8 :10F0400086FFFCCF8091C00080648093C000C65DC5 :10F05000DE4F8881CA52D1400F940DF230E23093D6 :10F06000C6008091C00086FFFCCF8091C000806404 :10F070008093C000C45DDE4F8881CC52D1400F9494 :10F080000DF240E24093C6008091C00086FFFCCFA5 :10F090008091C00080648093C000C55DDE4F888190 :10F0A000CB52D1400F940DF250E25093C6008091A4 :10F0B000C00086FFFCCF8091C00080648093C000B8 :10F0C0008FEFE8168FEFF80680E0080780E018075A :10F0D00031F484E092EE60E00F94C2F1DFC0D80119 :10F0E000C7018070907CA070B0708050904CA040A0 :10F0F000B040D1F52FEF3FE340E050E0E222F322B1 :10F1000004231523CA5DDE4FA880B980CA80DB8046 :10F11000C652D140AE0CBF1CC01ED11EAA0CBB1CD7 :10F12000CC1CDD1C8EE092EE60E00F94C2F1BB2798 :10F13000A12F902F8F2D0F940DF28E2D0F940DF285 :10F1400030E23093C6008091C00086FFFCCF8091F2 :10F15000C00080648093C0004EE34093C60080915D :10F16000C00086FFFCCF87C08EE09EEFA0E0B0E03D :10F17000E822F9220A231B239CE0E91694E9F90608 :10F1800090E0090790E0190709F088C0C45DDE4FE0 :10F19000A881CC52D140EA2EFF2400E010E0102FCD :10F1A0000F2DFE2CEE24C55DDE4FB881CB52D14031 :10F1B000EB0EF11C011D111DD601C501817090706F :10F1C000A070B070DC0199278827E80EF91E0A1F8D :10F1D0001B1F20EF30E040E050E0A222B322C42207 :10F1E000D52241E1AA0CBB1CCC1CDD1C4A95D1F7F1 :10F1F000EA0CFB1C0C1D1D1D81E090E0A0E0B0E0BE :10F20000282239224A225B2235E1220C331C441C7D :10F21000551C3A95D1F7E20CF31C041D151D57013E :10F220006801AA0CBB1CCC1CDD1C85E192EE60E0E1 :10F230000F94C2F1C801AA27BB270F940DF2BB2778 :10F24000A12F902F8F2D0F940DF28E2D0F940DF274 :10F2500090E29093C6008091C00086FFFCCF809121 :10F26000C00080648093C000AEE3A093C60080918C :10F27000C00086FFFCCF8091C00080648093C000F6 :10F28000C601AA27BB270F940DF2BB27AD2D9C2DDD :10F290008B2D0F940DF28A2D0F940DF20F94DCF14B :10F2A000CC5DDE4FE881F981C452D140F99709F471 :10F2B0004DCBF4E0EF2EF12C012D112D6E0C7F1CA7 :10F2C000801E911EF2CD83E093EE62E00F94F5F183 :10F2D0008AE192EE60E00F94C2F18091C00087FF56 :10F2E000FCCF1091C6001F751093C6008091C0001E :10F2F00086FFFCCF8091C00080648093C0000F9493 :10F30000DCF1812F81548A3108F036C1163409F4BA :10F3100095C0173490F4133409F44EC0143430F40B :10F320001134F1F0123409F01DC130C0143409F465 :10F3300059C0153409F016C16BC01A3409F4C4C0A1 :10F340001B3438F4173409F48FC0183409F00AC19B :10F35000A1C01B3409F4D2C01C3409F003C1E8C0B9 :10F360008FEF81B90DC082B1809582B980E090E0C5 :10F37000E0EDF7E03197F1F70196883C9105C1F790 :10F380008091C00087FFEFCF12B8EFC08FEF84B934 :10F390000DC085B1809585B980E090E0E0EDF7E0A3 :10F3A0003197F1F70196883C9105C1F78091C00033 :10F3B00087FFEFCF15B8D9C08FEF87B90DC088B1DF :10F3C000809588B980E090E0E0EDF7E03197F1F7C3 :10F3D0000196883C9105C1F78091C00087FFEFCF6F :10F3E00018B8C3C08FEF8AB90DC08BB180958BB9A7 :10F3F00080E090E0E0EDF7E03197F1F70196883C8E :10F400009105C1F78091C00087FFEFCF1BB8ADC059 :10F410008FEF8DB90DC08EB180958EB980E090E0F0 :10F42000E0EDF7E03197F1F70196883C9105C1F7DF :10F430008091C00087FFEFCF1EB897C08FEF80BBD1 :10F440000DC081B3809581BB80E090E0E0EDF7E0F6 :10F450003197F1F70196883C9105C1F78091C00082 :10F4600087FFEFCF11BA81C08FEF83BB0DC084B38C :10F47000809584BB80E090E0E0EDF7E03197F1F714 :10F480000196883C9105C1F78091C00087FFEFCFBE :10F4900014BA6BC08FEF809301010FC080910201FD :10F4A00080958093020180E090E0E0EDF7E03197F5 :10F4B000F1F70196883C9105C1F78091C00087FF64 :10F4C000EDCF1092020151C08FEF809304010FC065 :10F4D0008091050180958093050180E090E0E0ED4A :10F4E000F7E03197F1F70196883C9105C1F78091DB :10F4F000C00087FFEDCF1092050137C08FEF8093DA :10F5000007010FC08091080180958093080180E079 :10F5100090E0E0EDF7E03197F1F70196883C910536 :10F52000C1F78091C00087FFEDCF109208011DC088 :10F530008FEF80930A010FC080910B01809580931B :10F540000B0180E090E0E0EDF7E03197F1F70196F4 :10F55000883C9105C1F78091C00087FFEDCF1092E4 :10F560000B0103C085E292EEEEC98091C00087FFD7 :10F57000FCCF8091C600EAC988E392EEE4C98CE131 :10F5800091EEE1C988249924933011F1943028F444 :10F59000913089F09230B8F408C0953061F195301F :10F5A000F0F0963009F048C043C02B3109F042C951 :10F5B00091E06BE13FC96227C15DDE4F2883CF52E6 :10F5C000D14092E037C9B22FA0E0622793E032C960 :10F5D000822F90E0A82BB92B622794E02BC92E3004 :10F5E00009F039C3622795E0C05DDE4F19821882A9 :10F5F000C053D1401FC9E1E0F0E0EC0FFD1FC05D3A :10F60000DE4F08811981C053D140E00FF11F2083E4 :10F610000F5F1F4FC05DDE4F19830883C053D14079 :10F6200062270A171B0709F005C9D80196E002C92D :10F63000261709F010C303C0973009F0FBC87724E0 :10F640009981933109F412C19431C8F4963009F4C8 :10F65000D8C0973050F4923009F406C1933009F4C1 :10F660006DC0913009F059C253C0913109F477C08F :10F67000923108F0BBC0903109F04FC2F5C098310B :10F6800009F487C0993150F4953109F4EFC09531F0 :10F6900008F4C6C1963109F040C2C2C19A3109F4DA :10F6A0006CC09A3108F491C09B3109F45BC09D3164 :10F6B00009F033C29D81903359F48F81882311F46E :10F6C0009EE11CC0813011F091E018C098E916C08D :10F6D000892F807591F0903539F4E0E0F0E089E011 :10F6E0008093570094910AC0983539F4E3E0F0E034 :10F6F00089E080935700949101C090E01A821B82A8 :10F700008D818C831D829E831F8227E030E009C299 :10F710001A8288E08B8381E48C8386E58D8382E581 :10F720008E8389E48F8383E5888780E589878FE5E9 :10F730008A8782E38B872BE030E0F3C18A818139AD :10F7400041F0823941F0803911F48FE005C080E04A :10F7500003C082E001C08AE01A828B8344C0772410 :10F76000739482C08D81882311F48EE12CC0813086 :10F7700011F081E028C088E926C01A82E1E0F0E0BB :10F7800089E08093570084918B831C8224E030E0D1 :10F79000C8C18B81803589F48C81883039F4E2E0EE :10F7A000F0E089E08093570084910DC0E0E0F0E044 :10F7B00089E080935700849106C0E3E0F0E089E09F :10F7C0008093570084911A82DFCF8D81836C99E0FA :10F7D000E1E0F0E0082E90935700E89507B600FCB2 :10F7E000FDCF1A821B8223E030E09BC180EC8A832C :10F7F000CE5CDE4F188219821A821B82C253D1401E :10F800008EC18A8190E0A0E0B0E0582F44273327D2 :10F8100022278B8190E0A0E0B0E0DC0199278827C7 :10F82000282B392B4A2B5B2B8D8190E0A0E0B0E098 :10F83000282B392B4A2B5B2B8C8190E0A0E0B0E089 :10F84000BA2FA92F982F8827282B392B4A2B5B2BCF :10F85000220F331F441F551FC05EDE4F288339839C :10F860004A835B83C052D1401A8259C13A81C95C34 :10F87000DE4F3883C753D140CA5CDE4F1882C6536F :10F88000D1408B81C82EDD24CA5CDE4F488159816E :10F89000C653D140C42AD52A933109F082C0CE5C28 :10F8A000DE4F88819981AA81BB81C253D1408050AB :10F8B000904CA340B04030F583E0CE5CDE4FE88052 :10F8C000F9800A811B81C253D140F70100935B008C :10F8D00080935700E89507B600FCFDCFCE5CDE4F65 :10F8E000088119812A813B81C253D14000501F4FAA :10F8F0002F4F3F4FCE5CDE4F088319832A833B8313 :10F90000C253D140C05EDE4F488159816A817B81FC :10F91000C052D140DE011B9631E08C9111962C91A2 :10F9200011971296C75CDE4F2883C953D140C85C3B :10F93000DE4F1882C853D14090E0C85CDE4FE881AA :10F94000F981C853D1408E2B9F2B0C01FA01609393 :10F950005B0030935700E89511244E5F5F4F6F4F67 :10F960007F4F0EEFE02E0FEFF02ECE0CDF1CC114F8 :10F97000D10499F685E0C05EDE4F088119812A81A5 :10F980003B81C052D140F80120935B008093570027 :10F99000E89507B600FCFDCF81E180935700E8951C :10F9A00035C0C05EDE4F88819981AA81BB81C0527B :10F9B000D140B695A795979587957C018601ABE0D8 :10F9C000AA2EB12CAC0EBD1E0BC0D5016D915D01F0 :10F9D000C7010F947FFE0894E11CF11C01501040F8 :10F9E0000115110591F7A60160E070E0440F551F65 :10F9F000661F771FC05EDE4FE880F9800A811B8199 :10FA0000C052D1404E0D5F1D601F711F1A82C05E33 :10FA1000DE4F488359836A837B83C052D1407FC0C5 :10FA2000FA80C55CDE4FF882CB53D140C65CDE4F16 :10FA30001882CA53D1408B81C82EDD24C65CDE4FAC :10FA400008811981CA53D140C02AD12A1A828981DA :10FA5000BE016D5F7F4F843121F59601C05EDE4FA0 :10FA6000E880F9800A811B81C052D1400BBFF701A9 :10FA700087919691DB018C9311969C936E5F7F4FDB :10FA8000D801C7010296A11DB11DC05EDE4F88835B :10FA90009983AA83BB83C052D14022503040F1F6F3 :10FAA00036C0C05EDE4F288139814A815B81C052F9 :10FAB000D1400894C108D108760100E010E0089414 :10FAC000C11CD11C0894E11CF11C011D111DE20E8A :10FAD000F31E041F151F21BDBB27A52F942F832FB5 :10FAE00082BD2F5F3F4F4F4F5F4FF89A80B5DB01CC :10FAF0008D93BD012E153F054007510761F7C05E8C :10FB0000DE4F288339834A835B83C052D1409601FC :10FB10002D5F3F4FFB01108204C080EC8A8322E0FE :10FB200030E08BE18093C6008091C00086FFFCCF5F :10FB30008091C00080648093C000C15DDE4FF88179 :10FB4000CF52D140F093C6008091C00086FFFCCF19 :10FB50008091C00080648093C000432F3093C60022 :10FB60008091C00086FFFCCF8091C00080648093AC :10FB7000C000922F2093C6008091C00086FFFCCF6A :10FB80008091C00080648093C0008EE08093C600A6 :10FB90008091C00086FFFCCF8091C000806480937C :10FBA000C00065E1C15DDE4FE880CF52D1406E25D7 :10FBB00069276427FE01319610C090819093C6009A :10FBC0008091C00086FFFCCF31968091C000806498 :10FBD0008093C0006927215030402115310569F715 :10FBE0006093C6008091C00086FFFCCF8091C0006A :10FBF00080648093C00085B1805885B9772081F4F6 :10FC0000C15DDE4F0881CF52D1400F5FC15DDE4F35 :10FC10000883CF52D14090E0A0E0B0E00D941AF4F8 :10FC200027982F9880E090E020ED37E0F901319798 :10FC3000F1F7019684369105C9F700008091C00064 :10FC40008D7F8093C00081E180935700E895EE2777 :10FC5000FF270994FFCF90E00D941AF497FB092E2B :10FC600007260AD077FD04D02ED006D000201AF443 :10FC7000709561957F4F0895F6F7909581959F4F08 :10FC80000895A1E21A2EAA1BBB1BFD010DC0AA1FDD :10FC9000BB1FEE1FFF1FA217B307E407F50720F0F5 :10FCA000A21BB30BE40BF50B661F771F881F991F70 :10FCB0001A9469F760957095809590959B01AC01B9 :10FCC000BD01CF010895AA1BBB1B51E107C0AA1FAC :10FCD000BB1FA617B70710F0A61BB70B881F991FED :10FCE0005A95A9F780959095BC01CD010895F99991 :10FCF000FECF92BD81BDF89A992780B50895262F31 :10FD0000F999FECF1FBA92BD81BD20BD0FB6F89400 :0EFD1000FA9AF99A0FBE01960895F894FFCF63 :040000033000E000E9 :00000001FF ================================================ FILE: external/arduino/avr/cores/arduino/Arduino.h ================================================ /* Arduino.h - Main include file for the Arduino SDK Copyright (c) 2005-2013 Arduino Team. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef Arduino_h #define Arduino_h #include #include #include #include #include #include #include #include "binary.h" #ifdef __cplusplus extern "C"{ #endif void yield(void); #define HIGH 0x1 #define LOW 0x0 #define INPUT 0x0 #define OUTPUT 0x1 #define INPUT_PULLUP 0x2 #define PI 3.1415926535897932384626433832795 #define HALF_PI 1.5707963267948966192313216916398 #define TWO_PI 6.283185307179586476925286766559 #define DEG_TO_RAD 0.017453292519943295769236907684886 #define RAD_TO_DEG 57.295779513082320876798154814105 #define EULER 2.718281828459045235360287471352 #define SERIAL 0x0 #define DISPLAY 0x1 #define LSBFIRST 0 #define MSBFIRST 1 #define CHANGE 1 #define FALLING 2 #define RISING 3 #if defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) #define DEFAULT 0 #define EXTERNAL 1 #define INTERNAL1V1 2 #define INTERNAL INTERNAL1V1 #elif defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) #define DEFAULT 0 #define EXTERNAL 4 #define INTERNAL1V1 8 #define INTERNAL INTERNAL1V1 #define INTERNAL2V56 9 #define INTERNAL2V56_EXTCAP 13 #else #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega644__) || defined(__AVR_ATmega644A__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) #define INTERNAL1V1 2 #define INTERNAL2V56 3 #else #define INTERNAL 3 #endif #define DEFAULT 1 #define EXTERNAL 0 #endif // undefine stdlib's abs if encountered #ifdef abs #undef abs #endif #define min(a,b) ((a)<(b)?(a):(b)) #define max(a,b) ((a)>(b)?(a):(b)) #define abs(x) ((x)>0?(x):-(x)) #define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt))) #define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5)) #define radians(deg) ((deg)*DEG_TO_RAD) #define degrees(rad) ((rad)*RAD_TO_DEG) #define sq(x) ((x)*(x)) #define interrupts() sei() #define noInterrupts() cli() #define clockCyclesPerMicrosecond() ( F_CPU / 1000000L ) #define clockCyclesToMicroseconds(a) ( (a) / clockCyclesPerMicrosecond() ) #define microsecondsToClockCycles(a) ( (a) * clockCyclesPerMicrosecond() ) #define lowByte(w) ((uint8_t) ((w) & 0xff)) #define highByte(w) ((uint8_t) ((w) >> 8)) #define bitRead(value, bit) (((value) >> (bit)) & 0x01) #define bitSet(value, bit) ((value) |= (1UL << (bit))) #define bitClear(value, bit) ((value) &= ~(1UL << (bit))) #define bitToggle(value, bit) ((value) ^= (1UL << (bit))) #define bitWrite(value, bit, bitvalue) ((bitvalue) ? bitSet(value, bit) : bitClear(value, bit)) // avr-libc defines _NOP() since 1.6.2 #ifndef _NOP #define _NOP() do { __asm__ volatile ("nop"); } while (0) #endif typedef unsigned int word; #define bit(b) (1UL << (b)) typedef bool boolean; typedef uint8_t byte; void init(void); void initVariant(void); int atexit(void (*func)()) __attribute__((weak)); void pinMode(uint8_t pin, uint8_t mode); void digitalWrite(uint8_t pin, uint8_t val); int digitalRead(uint8_t pin); int analogRead(uint8_t pin); void analogReference(uint8_t mode); void analogWrite(uint8_t pin, int val); unsigned long millis(void); unsigned long micros(void); void delay(unsigned long ms); void delayMicroseconds(unsigned int us); unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout); unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout); void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val); uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder); void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode); void detachInterrupt(uint8_t interruptNum); //void setup(void); //void loop(void); // Get the bit location within the hardware port of the given virtual pin. // This comes from the pins_*.c file for the active board configuration. #define analogInPinToBit(P) (P) // On the ATmega1280, the addresses of some of the port registers are // greater than 255, so we can't store them in uint8_t's. extern const uint16_t PROGMEM port_to_mode_PGM[]; extern const uint16_t PROGMEM port_to_input_PGM[]; extern const uint16_t PROGMEM port_to_output_PGM[]; extern const uint8_t PROGMEM digital_pin_to_port_PGM[]; // extern const uint8_t PROGMEM digital_pin_to_bit_PGM[]; extern const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[]; extern const uint8_t PROGMEM digital_pin_to_timer_PGM[]; // Get the bit location within the hardware port of the given virtual pin. // This comes from the pins_*.c file for the active board configuration. // // These perform slightly better as macros compared to inline functions // #define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) ) #define digitalPinToBitMask(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM + (P) ) ) #define digitalPinToTimer(P) ( pgm_read_byte( digital_pin_to_timer_PGM + (P) ) ) #define analogInPinToBit(P) (P) #define portOutputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_output_PGM + (P))) ) #define portInputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_input_PGM + (P))) ) #define portModeRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_mode_PGM + (P))) ) #define NOT_A_PIN 0 #define NOT_A_PORT 0 #define NOT_AN_INTERRUPT -1 #ifdef ARDUINO_MAIN #define PA 1 #define PB 2 #define PC 3 #define PD 4 #define PE 5 #define PF 6 #define PG 7 #define PH 8 #define PJ 10 #define PK 11 #define PL 12 #endif #define NOT_ON_TIMER 0 #define TIMER0A 1 #define TIMER0B 2 #define TIMER1A 3 #define TIMER1B 4 #define TIMER1C 5 #define TIMER2 6 #define TIMER2A 7 #define TIMER2B 8 #define TIMER3A 9 #define TIMER3B 10 #define TIMER3C 11 #define TIMER4A 12 #define TIMER4B 13 #define TIMER4C 14 #define TIMER4D 15 #define TIMER5A 16 #define TIMER5B 17 #define TIMER5C 18 #ifdef __cplusplus } // extern "C" #endif #ifdef __cplusplus #include "WCharacter.h" #include "WString.h" #include "HardwareSerial.h" #include "USBAPI.h" #if defined(HAVE_HWSERIAL0) && defined(HAVE_CDCSERIAL) #error "Targets with both UART0 and CDC serial not supported" #endif uint16_t makeWord(uint16_t w); uint16_t makeWord(byte h, byte l); #define word(...) makeWord(__VA_ARGS__) unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L); unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L); void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0); void noTone(uint8_t _pin); // WMath prototypes long random(long); long random(long, long); void randomSeed(unsigned long); long map(long, long, long, long, long); #endif #include "pins_arduino.h" #endif ================================================ FILE: external/arduino/avr/cores/arduino/CDC.cpp ================================================ /* Copyright (c) 2011, Peter Barrett ** ** Permission to use, copy, modify, and/or distribute this software for ** any purpose with or without fee is hereby granted, provided that the ** above copyright notice and this permission notice appear in all copies. ** ** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL ** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED ** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR ** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES ** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, ** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ** SOFTWARE. */ #include "USBAPI.h" #include #include #if defined(USBCON) typedef struct { u32 dwDTERate; u8 bCharFormat; u8 bParityType; u8 bDataBits; u8 lineState; } LineInfo; static volatile LineInfo _usbLineInfo = { 57600, 0x00, 0x00, 0x00, 0x00 }; static volatile int32_t breakValue = -1; static u8 wdtcsr_save; #define WEAK __attribute__ ((weak)) extern const CDCDescriptor _cdcInterface PROGMEM; const CDCDescriptor _cdcInterface = { D_IAD(0,2,CDC_COMMUNICATION_INTERFACE_CLASS,CDC_ABSTRACT_CONTROL_MODEL,0), // CDC communication interface D_INTERFACE(CDC_ACM_INTERFACE,1,CDC_COMMUNICATION_INTERFACE_CLASS,CDC_ABSTRACT_CONTROL_MODEL,0), D_CDCCS(CDC_HEADER,0x10,0x01), // Header (1.10 bcd) D_CDCCS(CDC_CALL_MANAGEMENT,1,1), // Device handles call management (not) D_CDCCS4(CDC_ABSTRACT_CONTROL_MANAGEMENT,6), // SET_LINE_CODING, GET_LINE_CODING, SET_CONTROL_LINE_STATE supported D_CDCCS(CDC_UNION,CDC_ACM_INTERFACE,CDC_DATA_INTERFACE), // Communication interface is master, data interface is slave 0 D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_ACM),USB_ENDPOINT_TYPE_INTERRUPT,0x10,0x40), // CDC data interface D_INTERFACE(CDC_DATA_INTERFACE,2,CDC_DATA_INTERFACE_CLASS,0,0), D_ENDPOINT(USB_ENDPOINT_OUT(CDC_ENDPOINT_OUT),USB_ENDPOINT_TYPE_BULK,USB_EP_SIZE,0), D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_IN ),USB_ENDPOINT_TYPE_BULK,USB_EP_SIZE,0) }; bool isLUFAbootloader() { return pgm_read_word(FLASHEND - 1) == NEW_LUFA_SIGNATURE; } int CDC_GetInterface(u8* interfaceNum) { interfaceNum[0] += 2; // uses 2 return USB_SendControl(TRANSFER_PGM,&_cdcInterface,sizeof(_cdcInterface)); } bool CDC_Setup(USBSetup& setup) { u8 r = setup.bRequest; u8 requestType = setup.bmRequestType; if (REQUEST_DEVICETOHOST_CLASS_INTERFACE == requestType) { if (CDC_GET_LINE_CODING == r) { USB_SendControl(0,(void*)&_usbLineInfo,7); return true; } } if (REQUEST_HOSTTODEVICE_CLASS_INTERFACE == requestType) { if (CDC_SEND_BREAK == r) { breakValue = ((uint16_t)setup.wValueH << 8) | setup.wValueL; } if (CDC_SET_LINE_CODING == r) { USB_RecvControl((void*)&_usbLineInfo,7); } if (CDC_SET_CONTROL_LINE_STATE == r) { _usbLineInfo.lineState = setup.wValueL; // auto-reset into the bootloader is triggered when the port, already // open at 1200 bps, is closed. this is the signal to start the watchdog // with a relatively long period so it can finish housekeeping tasks // like servicing endpoints before the sketch ends uint16_t magic_key_pos = MAGIC_KEY_POS; // If we don't use the new RAMEND directly, check manually if we have a newer bootloader. // This is used to keep compatible with the old leonardo bootloaders. // You are still able to set the magic key position manually to RAMEND-1 to save a few bytes for this check. #if MAGIC_KEY_POS != (RAMEND-1) // For future boards save the key in the inproblematic RAMEND // Which is reserved for the main() return value (which will never return) if (isLUFAbootloader()) { // horray, we got a new bootloader! magic_key_pos = (RAMEND-1); } #endif // We check DTR state to determine if host port is open (bit 0 of lineState). if (1200 == _usbLineInfo.dwDTERate && (_usbLineInfo.lineState & 0x01) == 0) { #if MAGIC_KEY_POS != (RAMEND-1) // Backup ram value if its not a newer bootloader and it hasn't already been saved. // This should avoid memory corruption at least a bit, not fully if (magic_key_pos != (RAMEND-1) && *(uint16_t *)magic_key_pos != MAGIC_KEY) { *(uint16_t *)(RAMEND-1) = *(uint16_t *)magic_key_pos; } #endif // Store boot key *(uint16_t *)magic_key_pos = MAGIC_KEY; // Save the watchdog state in case the reset is aborted. wdtcsr_save = WDTCSR; wdt_enable(WDTO_120MS); } else if (*(uint16_t *)magic_key_pos == MAGIC_KEY) { // Most OSs do some intermediate steps when configuring ports and DTR can // twiggle more than once before stabilizing. // To avoid spurious resets we set the watchdog to 120ms and eventually // cancel if DTR goes back high. // Cancellation is only done if an auto-reset was started, which is // indicated by the magic key having been set. wdt_reset(); // Restore the watchdog state in case the sketch was using it. WDTCSR |= (1<= 0) { return 1 + USB_Available(CDC_RX); } return USB_Available(CDC_RX); } int Serial_::peek(void) { if (peek_buffer < 0) peek_buffer = USB_Recv(CDC_RX); return peek_buffer; } int Serial_::read(void) { if (peek_buffer >= 0) { int c = peek_buffer; peek_buffer = -1; return c; } return USB_Recv(CDC_RX); } int Serial_::availableForWrite(void) { return USB_SendSpace(CDC_TX); } void Serial_::flush(void) { USB_Flush(CDC_TX); } size_t Serial_::write(uint8_t c) { return write(&c, 1); } size_t Serial_::write(const uint8_t *buffer, size_t size) { /* only try to send bytes if the high-level CDC connection itself is open (not just the pipe) - the OS should set lineState when the port is opened and clear lineState when the port is closed. bytes sent before the user opens the connection or after the connection is closed are lost - just like with a UART. */ // TODO - ZE - check behavior on different OSes and test what happens if an // open connection isn't broken cleanly (cable is yanked out, host dies // or locks up, or host virtual serial port hangs) if (_usbLineInfo.lineState > 0) { int r = USB_Send(CDC_TX,buffer,size); if (r > 0) { return r; } else { setWriteError(); return 0; } } setWriteError(); return 0; } // This operator is a convenient way for a sketch to check whether the // port has actually been configured and opened by the host (as opposed // to just being connected to the host). It can be used, for example, in // setup() before printing to ensure that an application on the host is // actually ready to receive and display the data. // We add a short delay before returning to fix a bug observed by Federico // where the port is configured (lineState != 0) but not quite opened. Serial_::operator bool() { bool result = false; if (_usbLineInfo.lineState > 0) result = true; delay(10); return result; } unsigned long Serial_::baud() { // Disable interrupts while reading a multi-byte value uint32_t baudrate; ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { baudrate = _usbLineInfo.dwDTERate; } return baudrate; } uint8_t Serial_::stopbits() { return _usbLineInfo.bCharFormat; } uint8_t Serial_::paritytype() { return _usbLineInfo.bParityType; } uint8_t Serial_::numbits() { return _usbLineInfo.bDataBits; } bool Serial_::dtr() { return _usbLineInfo.lineState & 0x1; } bool Serial_::rts() { return _usbLineInfo.lineState & 0x2; } int32_t Serial_::readBreak() { int32_t ret; // Disable IRQs while reading and clearing breakValue to make // sure we don't overwrite a value just set by the ISR. ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { ret = breakValue; breakValue = -1; } return ret; } Serial_ Serial; #endif /* if defined(USBCON) */ ================================================ FILE: external/arduino/avr/cores/arduino/Client.h ================================================ /* Client.h - Base class that provides Client Copyright (c) 2011 Adrian McEwen. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef client_h #define client_h #include "Print.h" #include "Stream.h" #include "IPAddress.h" class Client : public Stream { public: virtual int connect(IPAddress ip, uint16_t port) =0; virtual int connect(const char *host, uint16_t port) =0; virtual size_t write(uint8_t) =0; virtual size_t write(const uint8_t *buf, size_t size) =0; virtual int available() = 0; virtual int read() = 0; virtual int read(uint8_t *buf, size_t size) = 0; virtual int peek() = 0; virtual void flush() = 0; virtual void stop() = 0; virtual uint8_t connected() = 0; virtual operator bool() = 0; protected: uint8_t* rawIPAddress(IPAddress& addr) { return addr.raw_address(); }; }; #endif ================================================ FILE: external/arduino/avr/cores/arduino/HardwareSerial.cpp ================================================ /* HardwareSerial.cpp - Hardware serial library for Wiring Copyright (c) 2006 Nicholas Zambetti. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Modified 23 November 2006 by David A. Mellis Modified 28 September 2010 by Mark Sproul Modified 14 August 2012 by Alarus Modified 3 December 2013 by Matthijs Kooijman */ #include #include #include #include #include #include "Arduino.h" #include "HardwareSerial.h" #include "HardwareSerial_private.h" // this next line disables the entire HardwareSerial.cpp, // this is so I can support Attiny series and any other chip without a uart #if defined(HAVE_HWSERIAL0) || defined(HAVE_HWSERIAL1) || defined(HAVE_HWSERIAL2) || defined(HAVE_HWSERIAL3) // SerialEvent functions are weak, so when the user doesn't define them, // the linker just sets their address to 0 (which is checked below). // The Serialx_available is just a wrapper around Serialx.available(), // but we can refer to it weakly so we don't pull in the entire // HardwareSerial instance if the user doesn't also refer to it. #if defined(HAVE_HWSERIAL0) void serialEvent() __attribute__((weak)); bool Serial0_available() __attribute__((weak)); #endif #if defined(HAVE_HWSERIAL1) void serialEvent1() __attribute__((weak)); bool Serial1_available() __attribute__((weak)); #endif #if defined(HAVE_HWSERIAL2) void serialEvent2() __attribute__((weak)); bool Serial2_available() __attribute__((weak)); #endif #if defined(HAVE_HWSERIAL3) void serialEvent3() __attribute__((weak)); bool Serial3_available() __attribute__((weak)); #endif void serialEventRun(void) { #if defined(HAVE_HWSERIAL0) if (Serial0_available && serialEvent && Serial0_available()) serialEvent(); #endif #if defined(HAVE_HWSERIAL1) if (Serial1_available && serialEvent1 && Serial1_available()) serialEvent1(); #endif #if defined(HAVE_HWSERIAL2) if (Serial2_available && serialEvent2 && Serial2_available()) serialEvent2(); #endif #if defined(HAVE_HWSERIAL3) if (Serial3_available && serialEvent3 && Serial3_available()) serialEvent3(); #endif } // macro to guard critical sections when needed for large TX buffer sizes #if (SERIAL_TX_BUFFER_SIZE>256) #define TX_BUFFER_ATOMIC ATOMIC_BLOCK(ATOMIC_RESTORESTATE) #else #define TX_BUFFER_ATOMIC #endif // Actual interrupt handlers ////////////////////////////////////////////////////////////// void HardwareSerial::_tx_udr_empty_irq(void) { // If interrupts are enabled, there must be more data in the output // buffer. Send the next byte unsigned char c = _tx_buffer[_tx_buffer_tail]; _tx_buffer_tail = (_tx_buffer_tail + 1) % SERIAL_TX_BUFFER_SIZE; *_udr = c; // clear the TXC bit -- "can be cleared by writing a one to its bit // location". This makes sure flush() won't return until the bytes // actually got written. Other r/w bits are preserved, and zeroes // written to the rest. #ifdef MPCM0 *_ucsra = ((*_ucsra) & ((1 << U2X0) | (1 << MPCM0))) | (1 << TXC0); #else *_ucsra = ((*_ucsra) & ((1 << U2X0) | (1 << TXC0))); #endif if (_tx_buffer_head == _tx_buffer_tail) { // Buffer empty, so disable interrupts cbi(*_ucsrb, UDRIE0); } } // Public Methods ////////////////////////////////////////////////////////////// void HardwareSerial::begin(unsigned long baud, byte config) { // Try u2x mode first uint16_t baud_setting = (F_CPU / 4 / baud - 1) / 2; *_ucsra = 1 << U2X0; // hardcoded exception for 57600 for compatibility with the bootloader // shipped with the Duemilanove and previous boards and the firmware // on the 8U2 on the Uno and Mega 2560. Also, The baud_setting cannot // be > 4095, so switch back to non-u2x mode if the baud rate is too // low. if (((F_CPU == 16000000UL) && (baud == 57600)) || (baud_setting >4095)) { *_ucsra = 0; baud_setting = (F_CPU / 8 / baud - 1) / 2; } // assign the baud_setting, a.k.a. ubrr (USART Baud Rate Register) *_ubrrh = baud_setting >> 8; *_ubrrl = baud_setting; _written = false; //set the data bits, parity, and stop bits #if defined(__AVR_ATmega8__) config |= 0x80; // select UCSRC register (shared with UBRRH) #endif *_ucsrc = config; sbi(*_ucsrb, RXEN0); sbi(*_ucsrb, TXEN0); sbi(*_ucsrb, RXCIE0); cbi(*_ucsrb, UDRIE0); } void HardwareSerial::end() { // wait for transmission of outgoing data flush(); cbi(*_ucsrb, RXEN0); cbi(*_ucsrb, TXEN0); cbi(*_ucsrb, RXCIE0); cbi(*_ucsrb, UDRIE0); // clear any received data _rx_buffer_head = _rx_buffer_tail; } int HardwareSerial::available(void) { return ((unsigned int)(SERIAL_RX_BUFFER_SIZE + _rx_buffer_head - _rx_buffer_tail)) % SERIAL_RX_BUFFER_SIZE; } int HardwareSerial::peek(void) { if (_rx_buffer_head == _rx_buffer_tail) { return -1; } else { return _rx_buffer[_rx_buffer_tail]; } } int HardwareSerial::read(void) { // if the head isn't ahead of the tail, we don't have any characters if (_rx_buffer_head == _rx_buffer_tail) { return -1; } else { unsigned char c = _rx_buffer[_rx_buffer_tail]; _rx_buffer_tail = (rx_buffer_index_t)(_rx_buffer_tail + 1) % SERIAL_RX_BUFFER_SIZE; return c; } } int HardwareSerial::availableForWrite(void) { tx_buffer_index_t head; tx_buffer_index_t tail; TX_BUFFER_ATOMIC { head = _tx_buffer_head; tail = _tx_buffer_tail; } if (head >= tail) return SERIAL_TX_BUFFER_SIZE - 1 - head + tail; return tail - head - 1; } void HardwareSerial::flush() { // If we have never written a byte, no need to flush. This special // case is needed since there is no way to force the TXC (transmit // complete) bit to 1 during initialization if (!_written) return; while (bit_is_set(*_ucsrb, UDRIE0) || bit_is_clear(*_ucsra, TXC0)) { if (bit_is_clear(SREG, SREG_I) && bit_is_set(*_ucsrb, UDRIE0)) // Interrupts are globally disabled, but the DR empty // interrupt should be enabled, so poll the DR empty flag to // prevent deadlock if (bit_is_set(*_ucsra, UDRE0)) _tx_udr_empty_irq(); } // If we get here, nothing is queued anymore (DRIE is disabled) and // the hardware finished tranmission (TXC is set). } size_t HardwareSerial::write(uint8_t c) { _written = true; // If the buffer and the data register is empty, just write the byte // to the data register and be done. This shortcut helps // significantly improve the effective datarate at high (> // 500kbit/s) bitrates, where interrupt overhead becomes a slowdown. if (_tx_buffer_head == _tx_buffer_tail && bit_is_set(*_ucsra, UDRE0)) { // If TXC is cleared before writing UDR and the previous byte // completes before writing to UDR, TXC will be set but a byte // is still being transmitted causing flush() to return too soon. // So writing UDR must happen first. // Writing UDR and clearing TC must be done atomically, otherwise // interrupts might delay the TXC clear so the byte written to UDR // is transmitted (setting TXC) before clearing TXC. Then TXC will // be cleared when no bytes are left, causing flush() to hang ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { *_udr = c; #ifdef MPCM0 *_ucsra = ((*_ucsra) & ((1 << U2X0) | (1 << MPCM0))) | (1 << TXC0); #else *_ucsra = ((*_ucsra) & ((1 << U2X0) | (1 << TXC0))); #endif } return 1; } tx_buffer_index_t i = (_tx_buffer_head + 1) % SERIAL_TX_BUFFER_SIZE; // If the output buffer is full, there's nothing for it other than to // wait for the interrupt handler to empty it a bit while (i == _tx_buffer_tail) { if (bit_is_clear(SREG, SREG_I)) { // Interrupts are disabled, so we'll have to poll the data // register empty flag ourselves. If it is set, pretend an // interrupt has happened and call the handler to free up // space for us. if(bit_is_set(*_ucsra, UDRE0)) _tx_udr_empty_irq(); } else { // nop, the interrupt handler will free up space for us } } _tx_buffer[_tx_buffer_head] = c; // make atomic to prevent execution of ISR between setting the // head pointer and setting the interrupt flag resulting in buffer // retransmission ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { _tx_buffer_head = i; sbi(*_ucsrb, UDRIE0); } return 1; } #endif // whole file ================================================ FILE: external/arduino/avr/cores/arduino/HardwareSerial.h ================================================ /* HardwareSerial.h - Hardware serial library for Wiring Copyright (c) 2006 Nicholas Zambetti. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Modified 28 September 2010 by Mark Sproul Modified 14 August 2012 by Alarus Modified 3 December 2013 by Matthijs Kooijman */ #ifndef HardwareSerial_h #define HardwareSerial_h #include #include "Stream.h" // Define constants and variables for buffering incoming serial data. We're // using a ring buffer (I think), in which head is the index of the location // to which to write the next incoming character and tail is the index of the // location from which to read. // NOTE: a "power of 2" buffer size is reccomended to dramatically // optimize all the modulo operations for ring buffers. // WARNING: When buffer sizes are increased to > 256, the buffer index // variables are automatically increased in size, but the extra // atomicity guards needed for that are not implemented. This will // often work, but occasionally a race condition can occur that makes // Serial behave erratically. See https://github.com/arduino/Arduino/issues/2405 #if !defined(SERIAL_TX_BUFFER_SIZE) #if ((RAMEND - RAMSTART) < 1023) #define SERIAL_TX_BUFFER_SIZE 16 #else #define SERIAL_TX_BUFFER_SIZE 64 #endif #endif #if !defined(SERIAL_RX_BUFFER_SIZE) #if ((RAMEND - RAMSTART) < 1023) #define SERIAL_RX_BUFFER_SIZE 16 #else #define SERIAL_RX_BUFFER_SIZE 64 #endif #endif #if (SERIAL_TX_BUFFER_SIZE>256) typedef uint16_t tx_buffer_index_t; #else typedef uint8_t tx_buffer_index_t; #endif #if (SERIAL_RX_BUFFER_SIZE>256) typedef uint16_t rx_buffer_index_t; #else typedef uint8_t rx_buffer_index_t; #endif // Define config for Serial.begin(baud, config); #define SERIAL_5N1 0x00 #define SERIAL_6N1 0x02 #define SERIAL_7N1 0x04 #define SERIAL_8N1 0x06 #define SERIAL_5N2 0x08 #define SERIAL_6N2 0x0A #define SERIAL_7N2 0x0C #define SERIAL_8N2 0x0E #define SERIAL_5E1 0x20 #define SERIAL_6E1 0x22 #define SERIAL_7E1 0x24 #define SERIAL_8E1 0x26 #define SERIAL_5E2 0x28 #define SERIAL_6E2 0x2A #define SERIAL_7E2 0x2C #define SERIAL_8E2 0x2E #define SERIAL_5O1 0x30 #define SERIAL_6O1 0x32 #define SERIAL_7O1 0x34 #define SERIAL_8O1 0x36 #define SERIAL_5O2 0x38 #define SERIAL_6O2 0x3A #define SERIAL_7O2 0x3C #define SERIAL_8O2 0x3E class HardwareSerial : public Stream { protected: volatile uint8_t * const _ubrrh; volatile uint8_t * const _ubrrl; volatile uint8_t * const _ucsra; volatile uint8_t * const _ucsrb; volatile uint8_t * const _ucsrc; volatile uint8_t * const _udr; // Has any byte been written to the UART since begin() bool _written; volatile rx_buffer_index_t _rx_buffer_head; volatile rx_buffer_index_t _rx_buffer_tail; volatile tx_buffer_index_t _tx_buffer_head; volatile tx_buffer_index_t _tx_buffer_tail; // Don't put any members after these buffers, since only the first // 32 bytes of this struct can be accessed quickly using the ldd // instruction. unsigned char _rx_buffer[SERIAL_RX_BUFFER_SIZE]; unsigned char _tx_buffer[SERIAL_TX_BUFFER_SIZE]; public: inline HardwareSerial( volatile uint8_t *ubrrh, volatile uint8_t *ubrrl, volatile uint8_t *ucsra, volatile uint8_t *ucsrb, volatile uint8_t *ucsrc, volatile uint8_t *udr); void begin(unsigned long baud) { begin(baud, SERIAL_8N1); } void begin(unsigned long, uint8_t); void end(); virtual int available(void); virtual int peek(void); virtual int read(void); virtual int availableForWrite(void); virtual void flush(void); virtual size_t write(uint8_t); inline size_t write(unsigned long n) { return write((uint8_t)n); } inline size_t write(long n) { return write((uint8_t)n); } inline size_t write(unsigned int n) { return write((uint8_t)n); } inline size_t write(int n) { return write((uint8_t)n); } using Print::write; // pull in write(str) and write(buf, size) from Print operator bool() { return true; } // Interrupt handlers - Not intended to be called externally inline void _rx_complete_irq(void); void _tx_udr_empty_irq(void); }; #if defined(UBRRH) || defined(UBRR0H) extern HardwareSerial Serial; #define HAVE_HWSERIAL0 #endif #if defined(UBRR1H) extern HardwareSerial Serial1; #define HAVE_HWSERIAL1 #endif #if defined(UBRR2H) extern HardwareSerial Serial2; #define HAVE_HWSERIAL2 #endif #if defined(UBRR3H) extern HardwareSerial Serial3; #define HAVE_HWSERIAL3 #endif extern void serialEventRun(void) __attribute__((weak)); #endif ================================================ FILE: external/arduino/avr/cores/arduino/HardwareSerial0.cpp ================================================ /* HardwareSerial0.cpp - Hardware serial library for Wiring Copyright (c) 2006 Nicholas Zambetti. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Modified 23 November 2006 by David A. Mellis Modified 28 September 2010 by Mark Sproul Modified 14 August 2012 by Alarus Modified 3 December 2013 by Matthijs Kooijman */ #include "Arduino.h" #include "HardwareSerial.h" #include "HardwareSerial_private.h" // Each HardwareSerial is defined in its own file, since the linker pulls // in the entire file when any element inside is used. --gc-sections can // additionally cause unused symbols to be dropped, but ISRs have the // "used" attribute so are never dropped and they keep the // HardwareSerial instance in as well. Putting each instance in its own // file prevents the linker from pulling in any unused instances in the // first place. #if defined(HAVE_HWSERIAL0) #if defined(USART_RX_vect) ISR(USART_RX_vect) #elif defined(USART0_RX_vect) ISR(USART0_RX_vect) #elif defined(USART_RXC_vect) ISR(USART_RXC_vect) // ATmega8 #else #error "Don't know what the Data Received vector is called for Serial" #endif { Serial._rx_complete_irq(); } #if defined(UART0_UDRE_vect) ISR(UART0_UDRE_vect) #elif defined(UART_UDRE_vect) ISR(UART_UDRE_vect) #elif defined(USART0_UDRE_vect) ISR(USART0_UDRE_vect) #elif defined(USART_UDRE_vect) ISR(USART_UDRE_vect) #else #error "Don't know what the Data Register Empty vector is called for Serial" #endif { Serial._tx_udr_empty_irq(); } #if defined(UBRRH) && defined(UBRRL) HardwareSerial Serial(&UBRRH, &UBRRL, &UCSRA, &UCSRB, &UCSRC, &UDR); #else HardwareSerial Serial(&UBRR0H, &UBRR0L, &UCSR0A, &UCSR0B, &UCSR0C, &UDR0); #endif // Function that can be weakly referenced by serialEventRun to prevent // pulling in this file if it's not otherwise used. bool Serial0_available() { return Serial.available(); } #endif // HAVE_HWSERIAL0 ================================================ FILE: external/arduino/avr/cores/arduino/HardwareSerial1.cpp ================================================ /* HardwareSerial1.cpp - Hardware serial library for Wiring Copyright (c) 2006 Nicholas Zambetti. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Modified 23 November 2006 by David A. Mellis Modified 28 September 2010 by Mark Sproul Modified 14 August 2012 by Alarus Modified 3 December 2013 by Matthijs Kooijman */ #include "Arduino.h" #include "HardwareSerial.h" #include "HardwareSerial_private.h" // Each HardwareSerial is defined in its own file, since the linker pulls // in the entire file when any element inside is used. --gc-sections can // additionally cause unused symbols to be dropped, but ISRs have the // "used" attribute so are never dropped and they keep the // HardwareSerial instance in as well. Putting each instance in its own // file prevents the linker from pulling in any unused instances in the // first place. #if defined(HAVE_HWSERIAL1) #if defined(UART1_RX_vect) ISR(UART1_RX_vect) #elif defined(USART1_RX_vect) ISR(USART1_RX_vect) #else #error "Don't know what the Data Register Empty vector is called for Serial1" #endif { Serial1._rx_complete_irq(); } #if defined(UART1_UDRE_vect) ISR(UART1_UDRE_vect) #elif defined(USART1_UDRE_vect) ISR(USART1_UDRE_vect) #else #error "Don't know what the Data Register Empty vector is called for Serial1" #endif { Serial1._tx_udr_empty_irq(); } HardwareSerial Serial1(&UBRR1H, &UBRR1L, &UCSR1A, &UCSR1B, &UCSR1C, &UDR1); // Function that can be weakly referenced by serialEventRun to prevent // pulling in this file if it's not otherwise used. bool Serial1_available() { return Serial1.available(); } #endif // HAVE_HWSERIAL1 ================================================ FILE: external/arduino/avr/cores/arduino/HardwareSerial2.cpp ================================================ /* HardwareSerial2.cpp - Hardware serial library for Wiring Copyright (c) 2006 Nicholas Zambetti. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Modified 23 November 2006 by David A. Mellis Modified 28 September 2010 by Mark Sproul Modified 14 August 2012 by Alarus Modified 3 December 2013 by Matthijs Kooijman */ #include "Arduino.h" #include "HardwareSerial.h" #include "HardwareSerial_private.h" // Each HardwareSerial is defined in its own file, since the linker pulls // in the entire file when any element inside is used. --gc-sections can // additionally cause unused symbols to be dropped, but ISRs have the // "used" attribute so are never dropped and they keep the // HardwareSerial instance in as well. Putting each instance in its own // file prevents the linker from pulling in any unused instances in the // first place. #if defined(HAVE_HWSERIAL2) ISR(USART2_RX_vect) { Serial2._rx_complete_irq(); } ISR(USART2_UDRE_vect) { Serial2._tx_udr_empty_irq(); } HardwareSerial Serial2(&UBRR2H, &UBRR2L, &UCSR2A, &UCSR2B, &UCSR2C, &UDR2); // Function that can be weakly referenced by serialEventRun to prevent // pulling in this file if it's not otherwise used. bool Serial2_available() { return Serial2.available(); } #endif // HAVE_HWSERIAL2 ================================================ FILE: external/arduino/avr/cores/arduino/HardwareSerial3.cpp ================================================ /* HardwareSerial3.cpp - Hardware serial library for Wiring Copyright (c) 2006 Nicholas Zambetti. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Modified 23 November 2006 by David A. Mellis Modified 28 September 2010 by Mark Sproul Modified 14 August 2012 by Alarus Modified 3 December 2013 by Matthijs Kooijman */ #include "Arduino.h" #include "HardwareSerial.h" #include "HardwareSerial_private.h" // Each HardwareSerial is defined in its own file, since the linker pulls // in the entire file when any element inside is used. --gc-sections can // additionally cause unused symbols to be dropped, but ISRs have the // "used" attribute so are never dropped and they keep the // HardwareSerial instance in as well. Putting each instance in its own // file prevents the linker from pulling in any unused instances in the // first place. #if defined(HAVE_HWSERIAL3) ISR(USART3_RX_vect) { Serial3._rx_complete_irq(); } ISR(USART3_UDRE_vect) { Serial3._tx_udr_empty_irq(); } HardwareSerial Serial3(&UBRR3H, &UBRR3L, &UCSR3A, &UCSR3B, &UCSR3C, &UDR3); // Function that can be weakly referenced by serialEventRun to prevent // pulling in this file if it's not otherwise used. bool Serial3_available() { return Serial3.available(); } #endif // HAVE_HWSERIAL3 ================================================ FILE: external/arduino/avr/cores/arduino/HardwareSerial_private.h ================================================ /* HardwareSerial_private.h - Hardware serial library for Wiring Copyright (c) 2006 Nicholas Zambetti. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Modified 23 November 2006 by David A. Mellis Modified 28 September 2010 by Mark Sproul Modified 14 August 2012 by Alarus */ #include "wiring_private.h" // this next line disables the entire HardwareSerial.cpp, // this is so I can support Attiny series and any other chip without a uart #if defined(HAVE_HWSERIAL0) || defined(HAVE_HWSERIAL1) || defined(HAVE_HWSERIAL2) || defined(HAVE_HWSERIAL3) // Ensure that the various bit positions we use are available with a 0 // postfix, so we can always use the values for UART0 for all UARTs. The // alternative, passing the various values for each UART to the // HardwareSerial constructor also works, but makes the code bigger and // slower. #if !defined(TXC0) #if defined(TXC) // Some chips like ATmega8 don't have UPE, only PE. The other bits are // named as expected. #if !defined(UPE) && defined(PE) #define UPE PE #endif // On ATmega8, the uart and its bits are not numbered, so there is no TXC0 etc. #define TXC0 TXC #define RXEN0 RXEN #define TXEN0 TXEN #define RXCIE0 RXCIE #define UDRIE0 UDRIE #define U2X0 U2X #define UPE0 UPE #define UDRE0 UDRE #elif defined(TXC1) // Some devices have uart1 but no uart0 #define TXC0 TXC1 #define RXEN0 RXEN1 #define TXEN0 TXEN1 #define RXCIE0 RXCIE1 #define UDRIE0 UDRIE1 #define U2X0 U2X1 #define UPE0 UPE1 #define UDRE0 UDRE1 #else #error No UART found in HardwareSerial.cpp #endif #endif // !defined TXC0 // Check at compiletime that it is really ok to use the bit positions of // UART0 for the other UARTs as well, in case these values ever get // changed for future hardware. #if defined(TXC1) && (TXC1 != TXC0 || RXEN1 != RXEN0 || RXCIE1 != RXCIE0 || \ UDRIE1 != UDRIE0 || U2X1 != U2X0 || UPE1 != UPE0 || \ UDRE1 != UDRE0) #error "Not all bit positions for UART1 are the same as for UART0" #endif #if defined(TXC2) && (TXC2 != TXC0 || RXEN2 != RXEN0 || RXCIE2 != RXCIE0 || \ UDRIE2 != UDRIE0 || U2X2 != U2X0 || UPE2 != UPE0 || \ UDRE2 != UDRE0) #error "Not all bit positions for UART2 are the same as for UART0" #endif #if defined(TXC3) && (TXC3 != TXC0 || RXEN3 != RXEN0 || RXCIE3 != RXCIE0 || \ UDRIE3 != UDRIE0 || U3X3 != U3X0 || UPE3 != UPE0 || \ UDRE3 != UDRE0) #error "Not all bit positions for UART3 are the same as for UART0" #endif // Constructors //////////////////////////////////////////////////////////////// HardwareSerial::HardwareSerial( volatile uint8_t *ubrrh, volatile uint8_t *ubrrl, volatile uint8_t *ucsra, volatile uint8_t *ucsrb, volatile uint8_t *ucsrc, volatile uint8_t *udr) : _ubrrh(ubrrh), _ubrrl(ubrrl), _ucsra(ucsra), _ucsrb(ucsrb), _ucsrc(ucsrc), _udr(udr), _rx_buffer_head(0), _rx_buffer_tail(0), _tx_buffer_head(0), _tx_buffer_tail(0) { } // Actual interrupt handlers ////////////////////////////////////////////////////////////// void HardwareSerial::_rx_complete_irq(void) { if (bit_is_clear(*_ucsra, UPE0)) { // No Parity error, read byte and store it in the buffer if there is // room unsigned char c = *_udr; rx_buffer_index_t i = (unsigned int)(_rx_buffer_head + 1) % SERIAL_RX_BUFFER_SIZE; // if we should be storing the received character into the location // just before the tail (meaning that the head would advance to the // current location of the tail), we're about to overflow the buffer // and so we don't write the character or advance the head. if (i != _rx_buffer_tail) { _rx_buffer[_rx_buffer_head] = c; _rx_buffer_head = i; } } else { // Parity error, read byte but discard it *_udr; }; } #endif // whole file ================================================ FILE: external/arduino/avr/cores/arduino/IPAddress.cpp ================================================ /* IPAddress.cpp - Base class that provides IPAddress Copyright (c) 2011 Adrian McEwen. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include IPAddress::IPAddress() { _address.dword = 0; } IPAddress::IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet) { _address.bytes[0] = first_octet; _address.bytes[1] = second_octet; _address.bytes[2] = third_octet; _address.bytes[3] = fourth_octet; } IPAddress::IPAddress(uint32_t address) { _address.dword = address; } IPAddress::IPAddress(const uint8_t *address) { memcpy(_address.bytes, address, sizeof(_address.bytes)); } bool IPAddress::fromString(const char *address) { uint16_t acc = 0; // Accumulator uint8_t dots = 0; while (*address) { char c = *address++; if (c >= '0' && c <= '9') { acc = acc * 10 + (c - '0'); if (acc > 255) { // Value out of [0..255] range return false; } } else if (c == '.') { if (dots == 3) { // Too much dots (there must be 3 dots) return false; } _address.bytes[dots++] = acc; acc = 0; } else { // Invalid char return false; } } if (dots != 3) { // Too few dots (there must be 3 dots) return false; } _address.bytes[3] = acc; return true; } IPAddress& IPAddress::operator=(const uint8_t *address) { memcpy(_address.bytes, address, sizeof(_address.bytes)); return *this; } IPAddress& IPAddress::operator=(uint32_t address) { _address.dword = address; return *this; } bool IPAddress::operator==(const uint8_t* addr) const { return memcmp(addr, _address.bytes, sizeof(_address.bytes)) == 0; } size_t IPAddress::printTo(Print& p) const { size_t n = 0; for (int i =0; i < 3; i++) { n += p.print(_address.bytes[i], DEC); n += p.print('.'); } n += p.print(_address.bytes[3], DEC); return n; } ================================================ FILE: external/arduino/avr/cores/arduino/IPAddress.h ================================================ /* IPAddress.h - Base class that provides IPAddress Copyright (c) 2011 Adrian McEwen. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef IPAddress_h #define IPAddress_h #include #include "Printable.h" #include "WString.h" // A class to make it easier to handle and pass around IP addresses class IPAddress : public Printable { private: union { uint8_t bytes[4]; // IPv4 address uint32_t dword; } _address; // Access the raw byte array containing the address. Because this returns a pointer // to the internal structure rather than a copy of the address this function should only // be used when you know that the usage of the returned uint8_t* will be transient and not // stored. uint8_t* raw_address() { return _address.bytes; }; public: // Constructors IPAddress(); IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet); IPAddress(uint32_t address); IPAddress(const uint8_t *address); bool fromString(const char *address); bool fromString(const String &address) { return fromString(address.c_str()); } // Overloaded cast operator to allow IPAddress objects to be used where a pointer // to a four-byte uint8_t array is expected operator uint32_t() const { return _address.dword; }; bool operator==(const IPAddress& addr) const { return _address.dword == addr._address.dword; }; bool operator==(const uint8_t* addr) const; // Overloaded index operator to allow getting and setting individual octets of the address uint8_t operator[](int index) const { return _address.bytes[index]; }; uint8_t& operator[](int index) { return _address.bytes[index]; }; // Overloaded copy operators to allow initialisation of IPAddress objects from other types IPAddress& operator=(const uint8_t *address); IPAddress& operator=(uint32_t address); virtual size_t printTo(Print& p) const; friend class EthernetClass; friend class UDP; friend class Client; friend class Server; friend class DhcpClass; friend class DNSClient; }; const IPAddress INADDR_NONE(0,0,0,0); #endif ================================================ FILE: external/arduino/avr/cores/arduino/PluggableUSB.cpp ================================================ /* PluggableUSB.cpp Copyright (c) 2015 Arduino LLC This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "USBAPI.h" #include "PluggableUSB.h" #if defined(USBCON) #ifdef PLUGGABLE_USB_ENABLED extern uint8_t _initEndpoints[]; int PluggableUSB_::getInterface(uint8_t* interfaceCount) { int sent = 0; PluggableUSBModule* node; for (node = rootNode; node; node = node->next) { int res = node->getInterface(interfaceCount); if (res < 0) return -1; sent += res; } return sent; } int PluggableUSB_::getDescriptor(USBSetup& setup) { PluggableUSBModule* node; for (node = rootNode; node; node = node->next) { int ret = node->getDescriptor(setup); // ret!=0 -> request has been processed if (ret) return ret; } return 0; } void PluggableUSB_::getShortName(char *iSerialNum) { PluggableUSBModule* node; for (node = rootNode; node; node = node->next) { iSerialNum += node->getShortName(iSerialNum); } *iSerialNum = 0; } bool PluggableUSB_::setup(USBSetup& setup) { PluggableUSBModule* node; for (node = rootNode; node; node = node->next) { if (node->setup(setup)) { return true; } } return false; } bool PluggableUSB_::plug(PluggableUSBModule *node) { if ((lastEp + node->numEndpoints) > USB_ENDPOINTS) { return false; } if (!rootNode) { rootNode = node; } else { PluggableUSBModule *current = rootNode; while (current->next) { current = current->next; } current->next = node; } node->pluggedInterface = lastIf; node->pluggedEndpoint = lastEp; lastIf += node->numInterfaces; for (uint8_t i = 0; i < node->numEndpoints; i++) { _initEndpoints[lastEp] = node->endpointType[i]; lastEp++; } return true; // restart USB layer??? } PluggableUSB_& PluggableUSB() { static PluggableUSB_ obj; return obj; } PluggableUSB_::PluggableUSB_() : lastIf(CDC_ACM_INTERFACE + CDC_INTERFACE_COUNT), lastEp(CDC_FIRST_ENDPOINT + CDC_ENPOINT_COUNT), rootNode(NULL) { // Empty } #endif #endif /* if defined(USBCON) */ ================================================ FILE: external/arduino/avr/cores/arduino/PluggableUSB.h ================================================ /* PluggableUSB.h Copyright (c) 2015 Arduino LLC This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PUSB_h #define PUSB_h #include "USBAPI.h" #include #if defined(USBCON) class PluggableUSBModule { public: PluggableUSBModule(uint8_t numEps, uint8_t numIfs, uint8_t *epType) : numEndpoints(numEps), numInterfaces(numIfs), endpointType(epType) { } protected: virtual bool setup(USBSetup& setup) = 0; virtual int getInterface(uint8_t* interfaceCount) = 0; virtual int getDescriptor(USBSetup& setup) = 0; virtual uint8_t getShortName(char *name) { name[0] = 'A'+pluggedInterface; return 1; } uint8_t pluggedInterface; uint8_t pluggedEndpoint; const uint8_t numEndpoints; const uint8_t numInterfaces; const uint8_t *endpointType; PluggableUSBModule *next = NULL; friend class PluggableUSB_; }; class PluggableUSB_ { public: PluggableUSB_(); bool plug(PluggableUSBModule *node); int getInterface(uint8_t* interfaceCount); int getDescriptor(USBSetup& setup); bool setup(USBSetup& setup); void getShortName(char *iSerialNum); private: uint8_t lastIf; uint8_t lastEp; PluggableUSBModule* rootNode; }; // Replacement for global singleton. // This function prevents static-initialization-order-fiasco // https://isocpp.org/wiki/faq/ctors#static-init-order-on-first-use PluggableUSB_& PluggableUSB(); #endif #endif ================================================ FILE: external/arduino/avr/cores/arduino/Print.cpp ================================================ /* Print.cpp - Base class that provides print() and println() Copyright (c) 2008 David A. Mellis. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Modified 23 November 2006 by David A. Mellis Modified 03 August 2015 by Chuck Todd */ #include #include #include #include #include "Arduino.h" #include "Print.h" // Public Methods ////////////////////////////////////////////////////////////// /* default implementation: may be overridden */ size_t Print::write(const uint8_t *buffer, size_t size) { size_t n = 0; while (size--) { if (write(*buffer++)) n++; else break; } return n; } size_t Print::print(const __FlashStringHelper *ifsh) { PGM_P p = reinterpret_cast(ifsh); size_t n = 0; while (1) { unsigned char c = pgm_read_byte(p++); if (c == 0) break; if (write(c)) n++; else break; } return n; } size_t Print::print(const String &s) { return write(s.c_str(), s.length()); } size_t Print::print(const char str[]) { return write(str); } size_t Print::print(char c) { return write(c); } size_t Print::print(unsigned char b, int base) { return print((unsigned long) b, base); } size_t Print::print(int n, int base) { return print((long) n, base); } size_t Print::print(unsigned int n, int base) { return print((unsigned long) n, base); } size_t Print::print(long n, int base) { if (base == 0) { return write(n); } else if (base == 10) { if (n < 0) { int t = print('-'); n = -n; return printNumber(n, 10) + t; } return printNumber(n, 10); } else { return printNumber(n, base); } } size_t Print::print(unsigned long n, int base) { if (base == 0) return write(n); else return printNumber(n, base); } size_t Print::print(double n, int digits) { return printFloat(n, digits); } size_t Print::println(const __FlashStringHelper *ifsh) { size_t n = print(ifsh); n += println(); return n; } size_t Print::print(const Printable& x) { return x.printTo(*this); } size_t Print::println(void) { return write("\r\n"); } size_t Print::println(const String &s) { size_t n = print(s); n += println(); return n; } size_t Print::println(const char c[]) { size_t n = print(c); n += println(); return n; } size_t Print::println(char c) { size_t n = print(c); n += println(); return n; } size_t Print::println(unsigned char b, int base) { size_t n = print(b, base); n += println(); return n; } size_t Print::println(int num, int base) { size_t n = print(num, base); n += println(); return n; } size_t Print::println(unsigned int num, int base) { size_t n = print(num, base); n += println(); return n; } size_t Print::println(long num, int base) { size_t n = print(num, base); n += println(); return n; } size_t Print::println(unsigned long num, int base) { size_t n = print(num, base); n += println(); return n; } size_t Print::println(double num, int digits) { size_t n = print(num, digits); n += println(); return n; } size_t Print::println(const Printable& x) { size_t n = print(x); n += println(); return n; } // Private Methods ///////////////////////////////////////////////////////////// size_t Print::printNumber(unsigned long n, uint8_t base) { char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte. char *str = &buf[sizeof(buf) - 1]; *str = '\0'; // prevent crash if called with base == 1 if (base < 2) base = 10; do { char c = n % base; n /= base; *--str = c < 10 ? c + '0' : c + 'A' - 10; } while(n); return write(str); } size_t Print::printFloat(double number, uint8_t digits) { size_t n = 0; if (isnan(number)) return print("nan"); if (isinf(number)) return print("inf"); if (number > 4294967040.0) return print ("ovf"); // constant determined empirically if (number <-4294967040.0) return print ("ovf"); // constant determined empirically // Handle negative numbers if (number < 0.0) { n += print('-'); number = -number; } // Round correctly so that print(1.999, 2) prints as "2.00" double rounding = 0.5; for (uint8_t i=0; i 0) { n += print('.'); } // Extract digits from the remainder one at a time while (digits-- > 0) { remainder *= 10.0; unsigned int toPrint = (unsigned int)(remainder); n += print(toPrint); remainder -= toPrint; } return n; } ================================================ FILE: external/arduino/avr/cores/arduino/Print.h ================================================ /* Print.h - Base class that provides print() and println() Copyright (c) 2008 David A. Mellis. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef Print_h #define Print_h #include #include // for size_t #include "WString.h" #include "Printable.h" #define DEC 10 #define HEX 16 #define OCT 8 #ifdef BIN // Prevent warnings if BIN is previously defined in "iotnx4.h" or similar #undef BIN #endif #define BIN 2 class Print { private: int write_error; size_t printNumber(unsigned long, uint8_t); size_t printFloat(double, uint8_t); protected: void setWriteError(int err = 1) { write_error = err; } public: Print() : write_error(0) {} int getWriteError() { return write_error; } void clearWriteError() { setWriteError(0); } virtual size_t write(uint8_t) = 0; size_t write(const char *str) { if (str == NULL) return 0; return write((const uint8_t *)str, strlen(str)); } virtual size_t write(const uint8_t *buffer, size_t size); size_t write(const char *buffer, size_t size) { return write((const uint8_t *)buffer, size); } // default to zero, meaning "a single write may block" // should be overriden by subclasses with buffering virtual int availableForWrite() { return 0; } size_t print(const __FlashStringHelper *); size_t print(const String &); size_t print(const char[]); size_t print(char); size_t print(unsigned char, int = DEC); size_t print(int, int = DEC); size_t print(unsigned int, int = DEC); size_t print(long, int = DEC); size_t print(unsigned long, int = DEC); size_t print(double, int = 2); size_t print(const Printable&); size_t println(const __FlashStringHelper *); size_t println(const String &s); size_t println(const char[]); size_t println(char); size_t println(unsigned char, int = DEC); size_t println(int, int = DEC); size_t println(unsigned int, int = DEC); size_t println(long, int = DEC); size_t println(unsigned long, int = DEC); size_t println(double, int = 2); size_t println(const Printable&); size_t println(void); virtual void flush() { /* Empty implementation for backward compatibility */ } }; #endif ================================================ FILE: external/arduino/avr/cores/arduino/Printable.h ================================================ /* Printable.h - Interface class that allows printing of complex types Copyright (c) 2011 Adrian McEwen. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef Printable_h #define Printable_h #include class Print; /** The Printable class provides a way for new classes to allow themselves to be printed. By deriving from Printable and implementing the printTo method, it will then be possible for users to print out instances of this class by passing them into the usual Print::print and Print::println methods. */ class Printable { public: virtual size_t printTo(Print& p) const = 0; }; #endif ================================================ FILE: external/arduino/avr/cores/arduino/Server.h ================================================ /* Server.h - Base class that provides Server Copyright (c) 2011 Adrian McEwen. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef server_h #define server_h #include "Print.h" class Server : public Print { public: virtual void begin() =0; }; #endif ================================================ FILE: external/arduino/avr/cores/arduino/Stream.cpp ================================================ /* Stream.cpp - adds parsing methods to Stream class Copyright (c) 2008 David A. Mellis. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Created July 2011 parsing functions based on TextFinder library by Michael Margolis findMulti/findUntil routines written by Jim Leonard/Xuth */ #include "Arduino.h" #include "Stream.h" #define PARSE_TIMEOUT 1000 // default number of milli-seconds to wait // protected method to read stream with timeout int Stream::timedRead() { int c; _startMillis = millis(); do { c = read(); if (c >= 0) return c; } while(millis() - _startMillis < _timeout); return -1; // -1 indicates timeout } // protected method to peek stream with timeout int Stream::timedPeek() { int c; _startMillis = millis(); do { c = peek(); if (c >= 0) return c; } while(millis() - _startMillis < _timeout); return -1; // -1 indicates timeout } // returns peek of the next digit in the stream or -1 if timeout // discards non-numeric characters int Stream::peekNextDigit(LookaheadMode lookahead, bool detectDecimal) { int c; while (1) { c = timedPeek(); if( c < 0 || c == '-' || (c >= '0' && c <= '9') || (detectDecimal && c == '.')) return c; switch( lookahead ){ case SKIP_NONE: return -1; // Fail code. case SKIP_WHITESPACE: switch( c ){ case ' ': case '\t': case '\r': case '\n': break; default: return -1; // Fail code. } case SKIP_ALL: break; } read(); // discard non-numeric } } // Public Methods ////////////////////////////////////////////////////////////// void Stream::setTimeout(unsigned long timeout) // sets the maximum number of milliseconds to wait { _timeout = timeout; } // find returns true if the target string is found bool Stream::find(char *target) { return findUntil(target, strlen(target), NULL, 0); } // reads data from the stream until the target string of given length is found // returns true if target string is found, false if timed out bool Stream::find(char *target, size_t length) { return findUntil(target, length, NULL, 0); } // as find but search ends if the terminator string is found bool Stream::findUntil(char *target, char *terminator) { return findUntil(target, strlen(target), terminator, strlen(terminator)); } // reads data from the stream until the target string of the given length is found // search terminated if the terminator string is found // returns true if target string is found, false if terminated or timed out bool Stream::findUntil(char *target, size_t targetLen, char *terminator, size_t termLen) { if (terminator == NULL) { MultiTarget t[1] = {{target, targetLen, 0}}; return findMulti(t, 1) == 0 ? true : false; } else { MultiTarget t[2] = {{target, targetLen, 0}, {terminator, termLen, 0}}; return findMulti(t, 2) == 0 ? true : false; } } // returns the first valid (long) integer value from the current position. // lookahead determines how parseInt looks ahead in the stream. // See LookaheadMode enumeration at the top of the file. // Lookahead is terminated by the first character that is not a valid part of an integer. // Once parsing commences, 'ignore' will be skipped in the stream. long Stream::parseInt(LookaheadMode lookahead, char ignore) { bool isNegative = false; long value = 0; int c; c = peekNextDigit(lookahead, false); // ignore non numeric leading characters if(c < 0) return 0; // zero returned if timeout do{ if(c == ignore) ; // ignore this character else if(c == '-') isNegative = true; else if(c >= '0' && c <= '9') // is c a digit? value = value * 10 + c - '0'; read(); // consume the character we got with peek c = timedPeek(); } while( (c >= '0' && c <= '9') || c == ignore ); if(isNegative) value = -value; return value; } // as parseInt but returns a floating point value float Stream::parseFloat(LookaheadMode lookahead, char ignore) { bool isNegative = false; bool isFraction = false; long value = 0; int c; float fraction = 1.0; c = peekNextDigit(lookahead, true); // ignore non numeric leading characters if(c < 0) return 0; // zero returned if timeout do{ if(c == ignore) ; // ignore else if(c == '-') isNegative = true; else if (c == '.') isFraction = true; else if(c >= '0' && c <= '9') { // is c a digit? value = value * 10 + c - '0'; if(isFraction) fraction *= 0.1; } read(); // consume the character we got with peek c = timedPeek(); } while( (c >= '0' && c <= '9') || (c == '.' && !isFraction) || c == ignore ); if(isNegative) value = -value; if(isFraction) return value * fraction; else return value; } // read characters from stream into buffer // terminates if length characters have been read, or timeout (see setTimeout) // returns the number of characters placed in the buffer // the buffer is NOT null terminated. // size_t Stream::readBytes(char *buffer, size_t length) { size_t count = 0; while (count < length) { int c = timedRead(); if (c < 0) break; *buffer++ = (char)c; count++; } return count; } // as readBytes with terminator character // terminates if length characters have been read, timeout, or if the terminator character detected // returns the number of characters placed in the buffer (0 means no valid data found) size_t Stream::readBytesUntil(char terminator, char *buffer, size_t length) { size_t index = 0; while (index < length) { int c = timedRead(); if (c < 0 || c == terminator) break; *buffer++ = (char)c; index++; } return index; // return number of characters, not including null terminator } String Stream::readString() { String ret; int c = timedRead(); while (c >= 0) { ret += (char)c; c = timedRead(); } return ret; } String Stream::readStringUntil(char terminator) { String ret; int c = timedRead(); while (c >= 0 && c != terminator) { ret += (char)c; c = timedRead(); } return ret; } int Stream::findMulti( struct Stream::MultiTarget *targets, int tCount) { // any zero length target string automatically matches and would make // a mess of the rest of the algorithm. for (struct MultiTarget *t = targets; t < targets+tCount; ++t) { if (t->len <= 0) return t - targets; } while (1) { int c = timedRead(); if (c < 0) return -1; for (struct MultiTarget *t = targets; t < targets+tCount; ++t) { // the simple case is if we match, deal with that first. if (c == t->str[t->index]) { if (++t->index == t->len) return t - targets; else continue; } // if not we need to walk back and see if we could have matched further // down the stream (ie '1112' doesn't match the first position in '11112' // but it will match the second position so we can't just reset the current // index to 0 when we find a mismatch. if (t->index == 0) continue; int origIndex = t->index; do { --t->index; // first check if current char works against the new current index if (c != t->str[t->index]) continue; // if it's the only char then we're good, nothing more to check if (t->index == 0) { t->index++; break; } // otherwise we need to check the rest of the found string int diff = origIndex - t->index; size_t i; for (i = 0; i < t->index; ++i) { if (t->str[i] != t->str[i + diff]) break; } // if we successfully got through the previous loop then our current // index is good. if (i == t->index) { t->index++; break; } // otherwise we just try the next index } while (t->index); } } // unreachable return -1; } ================================================ FILE: external/arduino/avr/cores/arduino/Stream.h ================================================ /* Stream.h - base class for character-based streams. Copyright (c) 2010 David A. Mellis. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA parsing functions based on TextFinder library by Michael Margolis */ #ifndef Stream_h #define Stream_h #include #include "Print.h" // compatability macros for testing /* #define getInt() parseInt() #define getInt(ignore) parseInt(ignore) #define getFloat() parseFloat() #define getFloat(ignore) parseFloat(ignore) #define getString( pre_string, post_string, buffer, length) readBytesBetween( pre_string, terminator, buffer, length) */ // This enumeration provides the lookahead options for parseInt(), parseFloat() // The rules set out here are used until either the first valid character is found // or a time out occurs due to lack of input. enum LookaheadMode{ SKIP_ALL, // All invalid characters are ignored. SKIP_NONE, // Nothing is skipped, and the stream is not touched unless the first waiting character is valid. SKIP_WHITESPACE // Only tabs, spaces, line feeds & carriage returns are skipped. }; #define NO_IGNORE_CHAR '\x01' // a char not found in a valid ASCII numeric field class Stream : public Print { protected: unsigned long _timeout; // number of milliseconds to wait for the next char before aborting timed read unsigned long _startMillis; // used for timeout measurement int timedRead(); // read stream with timeout int timedPeek(); // peek stream with timeout int peekNextDigit(LookaheadMode lookahead, bool detectDecimal); // returns the next numeric digit in the stream or -1 if timeout public: virtual int available() = 0; virtual int read() = 0; virtual int peek() = 0; Stream() {_timeout=1000;} // parsing methods void setTimeout(unsigned long timeout); // sets maximum milliseconds to wait for stream data, default is 1 second unsigned long getTimeout(void) { return _timeout; } bool find(char *target); // reads data from the stream until the target string is found bool find(uint8_t *target) { return find ((char *)target); } // returns true if target string is found, false if timed out (see setTimeout) bool find(char *target, size_t length); // reads data from the stream until the target string of given length is found bool find(uint8_t *target, size_t length) { return find ((char *)target, length); } // returns true if target string is found, false if timed out bool find(char target) { return find (&target, 1); } bool findUntil(char *target, char *terminator); // as find but search ends if the terminator string is found bool findUntil(uint8_t *target, char *terminator) { return findUntil((char *)target, terminator); } bool findUntil(char *target, size_t targetLen, char *terminate, size_t termLen); // as above but search ends if the terminate string is found bool findUntil(uint8_t *target, size_t targetLen, char *terminate, size_t termLen) {return findUntil((char *)target, targetLen, terminate, termLen); } long parseInt(LookaheadMode lookahead = SKIP_ALL, char ignore = NO_IGNORE_CHAR); // returns the first valid (long) integer value from the current position. // lookahead determines how parseInt looks ahead in the stream. // See LookaheadMode enumeration at the top of the file. // Lookahead is terminated by the first character that is not a valid part of an integer. // Once parsing commences, 'ignore' will be skipped in the stream. float parseFloat(LookaheadMode lookahead = SKIP_ALL, char ignore = NO_IGNORE_CHAR); // float version of parseInt size_t readBytes( char *buffer, size_t length); // read chars from stream into buffer size_t readBytes( uint8_t *buffer, size_t length) { return readBytes((char *)buffer, length); } // terminates if length characters have been read or timeout (see setTimeout) // returns the number of characters placed in the buffer (0 means no valid data found) size_t readBytesUntil( char terminator, char *buffer, size_t length); // as readBytes with terminator character size_t readBytesUntil( char terminator, uint8_t *buffer, size_t length) { return readBytesUntil(terminator, (char *)buffer, length); } // terminates if length characters have been read, timeout, or if the terminator character detected // returns the number of characters placed in the buffer (0 means no valid data found) // Arduino String functions to be added here String readString(); String readStringUntil(char terminator); protected: long parseInt(char ignore) { return parseInt(SKIP_ALL, ignore); } float parseFloat(char ignore) { return parseFloat(SKIP_ALL, ignore); } // These overload exists for compatibility with any class that has derived // Stream and used parseFloat/Int with a custom ignore character. To keep // the public API simple, these overload remains protected. struct MultiTarget { const char *str; // string you're searching for size_t len; // length of string you're searching for size_t index; // index used by the search routine. }; // This allows you to search for an arbitrary number of strings. // Returns index of the target that is found first or -1 if timeout occurs. int findMulti(struct MultiTarget *targets, int tCount); }; #undef NO_IGNORE_CHAR #endif ================================================ FILE: external/arduino/avr/cores/arduino/Tone.cpp ================================================ /* Tone.cpp A Tone Generator Library Written by Brett Hagman This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Version Modified By Date Comments ------- ----------- -------- -------- 0001 B Hagman 09/08/02 Initial coding 0002 B Hagman 09/08/18 Multiple pins 0003 B Hagman 09/08/18 Moved initialization from constructor to begin() 0004 B Hagman 09/09/26 Fixed problems with ATmega8 0005 B Hagman 09/11/23 Scanned prescalars for best fit on 8 bit timers 09/11/25 Changed pin toggle method to XOR 09/11/25 Fixed timer0 from being excluded 0006 D Mellis 09/12/29 Replaced objects with functions 0007 M Sproul 10/08/29 Changed #ifdefs from cpu to register 0008 S Kanemoto 12/06/22 Fixed for Leonardo by @maris_HY 0009 J Reucker 15/04/10 Issue #292 Fixed problems with ATmega8 (thanks to Pete62) 0010 jipp 15/04/13 added additional define check #2923 *************************************************/ #include #include #include "Arduino.h" #include "pins_arduino.h" #if defined(__AVR_ATmega8__) || defined(__AVR_ATmega128__) #define TCCR2A TCCR2 #define TCCR2B TCCR2 #define COM2A1 COM21 #define COM2A0 COM20 #define OCR2A OCR2 #define TIMSK2 TIMSK #define OCIE2A OCIE2 #define TIMER2_COMPA_vect TIMER2_COMP_vect #define TIMSK1 TIMSK #endif // timerx_toggle_count: // > 0 - duration specified // = 0 - stopped // < 0 - infinitely (until stop() method called, or new play() called) #if !defined(__AVR_ATmega8__) volatile long timer0_toggle_count; volatile uint8_t *timer0_pin_port; volatile uint8_t timer0_pin_mask; #endif volatile long timer1_toggle_count; volatile uint8_t *timer1_pin_port; volatile uint8_t timer1_pin_mask; volatile long timer2_toggle_count; volatile uint8_t *timer2_pin_port; volatile uint8_t timer2_pin_mask; #if defined(TIMSK3) volatile long timer3_toggle_count; volatile uint8_t *timer3_pin_port; volatile uint8_t timer3_pin_mask; #endif #if defined(TIMSK4) volatile long timer4_toggle_count; volatile uint8_t *timer4_pin_port; volatile uint8_t timer4_pin_mask; #endif #if defined(TIMSK5) volatile long timer5_toggle_count; volatile uint8_t *timer5_pin_port; volatile uint8_t timer5_pin_mask; #endif #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) #define AVAILABLE_TONE_PINS 1 #define USE_TIMER2 const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 2 /*, 3, 4, 5, 1, 0 */ }; static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255, 255, 255, 255, 255 */ }; #elif defined(__AVR_ATmega8__) #define AVAILABLE_TONE_PINS 1 #define USE_TIMER2 const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 2 /*, 1 */ }; static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255 */ }; #elif defined(__AVR_ATmega32U4__) #define AVAILABLE_TONE_PINS 1 #define USE_TIMER3 const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 3 /*, 1 */ }; static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255 */ }; #else #define AVAILABLE_TONE_PINS 1 #define USE_TIMER2 // Leave timer 0 to last. const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 2 /*, 1, 0 */ }; static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255, 255 */ }; #endif static int8_t toneBegin(uint8_t _pin) { int8_t _timer = -1; // if we're already using the pin, the timer should be configured. for (int i = 0; i < AVAILABLE_TONE_PINS; i++) { if (tone_pins[i] == _pin) { return pgm_read_byte(tone_pin_to_timer_PGM + i); } } // search for an unused timer. for (int i = 0; i < AVAILABLE_TONE_PINS; i++) { if (tone_pins[i] == 255) { tone_pins[i] = _pin; _timer = pgm_read_byte(tone_pin_to_timer_PGM + i); break; } } if (_timer != -1) { // Set timer specific stuff // All timers in CTC mode // 8 bit timers will require changing prescalar values, // whereas 16 bit timers are set to either ck/1 or ck/64 prescalar switch (_timer) { #if defined(TCCR0A) && defined(TCCR0B) && defined(WGM01) case 0: // 8 bit timer TCCR0A = 0; TCCR0B = 0; bitWrite(TCCR0A, WGM01, 1); bitWrite(TCCR0B, CS00, 1); timer0_pin_port = portOutputRegister(digitalPinToPort(_pin)); timer0_pin_mask = digitalPinToBitMask(_pin); break; #endif #if defined(TCCR1A) && defined(TCCR1B) && defined(WGM12) case 1: // 16 bit timer TCCR1A = 0; TCCR1B = 0; bitWrite(TCCR1B, WGM12, 1); bitWrite(TCCR1B, CS10, 1); timer1_pin_port = portOutputRegister(digitalPinToPort(_pin)); timer1_pin_mask = digitalPinToBitMask(_pin); break; #endif #if defined(TCCR2A) && defined(TCCR2B) case 2: // 8 bit timer TCCR2A = 0; TCCR2B = 0; bitWrite(TCCR2A, WGM21, 1); bitWrite(TCCR2B, CS20, 1); timer2_pin_port = portOutputRegister(digitalPinToPort(_pin)); timer2_pin_mask = digitalPinToBitMask(_pin); break; #endif #if defined(TCCR3A) && defined(TCCR3B) && defined(TIMSK3) case 3: // 16 bit timer TCCR3A = 0; TCCR3B = 0; bitWrite(TCCR3B, WGM32, 1); bitWrite(TCCR3B, CS30, 1); timer3_pin_port = portOutputRegister(digitalPinToPort(_pin)); timer3_pin_mask = digitalPinToBitMask(_pin); break; #endif #if defined(TCCR4A) && defined(TCCR4B) && defined(TIMSK4) case 4: // 16 bit timer TCCR4A = 0; TCCR4B = 0; #if defined(WGM42) bitWrite(TCCR4B, WGM42, 1); #elif defined(CS43) // TODO this may not be correct // atmega32u4 bitWrite(TCCR4B, CS43, 1); #endif bitWrite(TCCR4B, CS40, 1); timer4_pin_port = portOutputRegister(digitalPinToPort(_pin)); timer4_pin_mask = digitalPinToBitMask(_pin); break; #endif #if defined(TCCR5A) && defined(TCCR5B) && defined(TIMSK5) case 5: // 16 bit timer TCCR5A = 0; TCCR5B = 0; bitWrite(TCCR5B, WGM52, 1); bitWrite(TCCR5B, CS50, 1); timer5_pin_port = portOutputRegister(digitalPinToPort(_pin)); timer5_pin_mask = digitalPinToBitMask(_pin); break; #endif } } return _timer; } // frequency (in hertz) and duration (in milliseconds). void tone(uint8_t _pin, unsigned int frequency, unsigned long duration) { uint8_t prescalarbits = 0b001; long toggle_count = 0; uint32_t ocr = 0; int8_t _timer; _timer = toneBegin(_pin); if (_timer >= 0) { // Set the pinMode as OUTPUT pinMode(_pin, OUTPUT); // if we are using an 8 bit timer, scan through prescalars to find the best fit if (_timer == 0 || _timer == 2) { ocr = F_CPU / frequency / 2 - 1; prescalarbits = 0b001; // ck/1: same for both timers if (ocr > 255) { ocr = F_CPU / frequency / 2 / 8 - 1; prescalarbits = 0b010; // ck/8: same for both timers if (_timer == 2 && ocr > 255) { ocr = F_CPU / frequency / 2 / 32 - 1; prescalarbits = 0b011; } if (ocr > 255) { ocr = F_CPU / frequency / 2 / 64 - 1; prescalarbits = _timer == 0 ? 0b011 : 0b100; if (_timer == 2 && ocr > 255) { ocr = F_CPU / frequency / 2 / 128 - 1; prescalarbits = 0b101; } if (ocr > 255) { ocr = F_CPU / frequency / 2 / 256 - 1; prescalarbits = _timer == 0 ? 0b100 : 0b110; if (ocr > 255) { // can't do any better than /1024 ocr = F_CPU / frequency / 2 / 1024 - 1; prescalarbits = _timer == 0 ? 0b101 : 0b111; } } } } #if defined(TCCR0B) if (_timer == 0) { TCCR0B = (TCCR0B & 0b11111000) | prescalarbits; } else #endif #if defined(TCCR2B) { TCCR2B = (TCCR2B & 0b11111000) | prescalarbits; } #else { // dummy place holder to make the above ifdefs work } #endif } else { // two choices for the 16 bit timers: ck/1 or ck/64 ocr = F_CPU / frequency / 2 - 1; prescalarbits = 0b001; if (ocr > 0xffff) { ocr = F_CPU / frequency / 2 / 64 - 1; prescalarbits = 0b011; } if (_timer == 1) { #if defined(TCCR1B) TCCR1B = (TCCR1B & 0b11111000) | prescalarbits; #endif } #if defined(TCCR3B) else if (_timer == 3) TCCR3B = (TCCR3B & 0b11111000) | prescalarbits; #endif #if defined(TCCR4B) else if (_timer == 4) TCCR4B = (TCCR4B & 0b11111000) | prescalarbits; #endif #if defined(TCCR5B) else if (_timer == 5) TCCR5B = (TCCR5B & 0b11111000) | prescalarbits; #endif } // Calculate the toggle count if (duration > 0) { toggle_count = 2 * frequency * duration / 1000; } else { toggle_count = -1; } // Set the OCR for the given timer, // set the toggle count, // then turn on the interrupts switch (_timer) { #if defined(OCR0A) && defined(TIMSK0) && defined(OCIE0A) case 0: OCR0A = ocr; timer0_toggle_count = toggle_count; bitWrite(TIMSK0, OCIE0A, 1); break; #endif case 1: #if defined(OCR1A) && defined(TIMSK1) && defined(OCIE1A) OCR1A = ocr; timer1_toggle_count = toggle_count; bitWrite(TIMSK1, OCIE1A, 1); #elif defined(OCR1A) && defined(TIMSK) && defined(OCIE1A) // this combination is for at least the ATmega32 OCR1A = ocr; timer1_toggle_count = toggle_count; bitWrite(TIMSK, OCIE1A, 1); #endif break; #if defined(OCR2A) && defined(TIMSK2) && defined(OCIE2A) case 2: OCR2A = ocr; timer2_toggle_count = toggle_count; bitWrite(TIMSK2, OCIE2A, 1); break; #endif #if defined(OCR3A) && defined(TIMSK3) && defined(OCIE3A) case 3: OCR3A = ocr; timer3_toggle_count = toggle_count; bitWrite(TIMSK3, OCIE3A, 1); break; #endif #if defined(OCR4A) && defined(TIMSK4) && defined(OCIE4A) case 4: OCR4A = ocr; timer4_toggle_count = toggle_count; bitWrite(TIMSK4, OCIE4A, 1); break; #endif #if defined(OCR5A) && defined(TIMSK5) && defined(OCIE5A) case 5: OCR5A = ocr; timer5_toggle_count = toggle_count; bitWrite(TIMSK5, OCIE5A, 1); break; #endif } } } // XXX: this function only works properly for timer 2 (the only one we use // currently). for the others, it should end the tone, but won't restore // proper PWM functionality for the timer. void disableTimer(uint8_t _timer) { switch (_timer) { case 0: #if defined(TIMSK0) TIMSK0 = 0; #elif defined(TIMSK) TIMSK = 0; // atmega32 #endif break; #if defined(TIMSK1) && defined(OCIE1A) case 1: bitWrite(TIMSK1, OCIE1A, 0); break; #endif case 2: #if defined(TIMSK2) && defined(OCIE2A) bitWrite(TIMSK2, OCIE2A, 0); // disable interrupt #endif #if defined(TCCR2A) && defined(WGM20) TCCR2A = (1 << WGM20); #endif #if defined(TCCR2B) && defined(CS22) TCCR2B = (TCCR2B & 0b11111000) | (1 << CS22); #endif #if defined(OCR2A) OCR2A = 0; #endif break; #if defined(TIMSK3) && defined(OCIE3A) case 3: bitWrite(TIMSK3, OCIE3A, 0); break; #endif #if defined(TIMSK4) && defined(OCIE4A) case 4: bitWrite(TIMSK4, OCIE4A, 0); break; #endif #if defined(TIMSK5) && defined(OCIE5A) case 5: bitWrite(TIMSK5, OCIE5A, 0); break; #endif } } void noTone(uint8_t _pin) { int8_t _timer = -1; for (int i = 0; i < AVAILABLE_TONE_PINS; i++) { if (tone_pins[i] == _pin) { _timer = pgm_read_byte(tone_pin_to_timer_PGM + i); tone_pins[i] = 255; break; } } disableTimer(_timer); digitalWrite(_pin, 0); } #ifdef USE_TIMER0 ISR(TIMER0_COMPA_vect) { if (timer0_toggle_count != 0) { // toggle the pin *timer0_pin_port ^= timer0_pin_mask; if (timer0_toggle_count > 0) timer0_toggle_count--; } else { disableTimer(0); *timer0_pin_port &= ~(timer0_pin_mask); // keep pin low after stop } } #endif #ifdef USE_TIMER1 ISR(TIMER1_COMPA_vect) { if (timer1_toggle_count != 0) { // toggle the pin *timer1_pin_port ^= timer1_pin_mask; if (timer1_toggle_count > 0) timer1_toggle_count--; } else { disableTimer(1); *timer1_pin_port &= ~(timer1_pin_mask); // keep pin low after stop } } #endif #ifdef USE_TIMER2 ISR(TIMER2_COMPA_vect) { if (timer2_toggle_count != 0) { // toggle the pin *timer2_pin_port ^= timer2_pin_mask; if (timer2_toggle_count > 0) timer2_toggle_count--; } else { // need to call noTone() so that the tone_pins[] entry is reset, so the // timer gets initialized next time we call tone(). // XXX: this assumes timer 2 is always the first one used. noTone(tone_pins[0]); // disableTimer(2); // *timer2_pin_port &= ~(timer2_pin_mask); // keep pin low after stop } } #endif #ifdef USE_TIMER3 ISR(TIMER3_COMPA_vect) { if (timer3_toggle_count != 0) { // toggle the pin *timer3_pin_port ^= timer3_pin_mask; if (timer3_toggle_count > 0) timer3_toggle_count--; } else { disableTimer(3); *timer3_pin_port &= ~(timer3_pin_mask); // keep pin low after stop } } #endif #ifdef USE_TIMER4 ISR(TIMER4_COMPA_vect) { if (timer4_toggle_count != 0) { // toggle the pin *timer4_pin_port ^= timer4_pin_mask; if (timer4_toggle_count > 0) timer4_toggle_count--; } else { disableTimer(4); *timer4_pin_port &= ~(timer4_pin_mask); // keep pin low after stop } } #endif #ifdef USE_TIMER5 ISR(TIMER5_COMPA_vect) { if (timer5_toggle_count != 0) { // toggle the pin *timer5_pin_port ^= timer5_pin_mask; if (timer5_toggle_count > 0) timer5_toggle_count--; } else { disableTimer(5); *timer5_pin_port &= ~(timer5_pin_mask); // keep pin low after stop } } #endif ================================================ FILE: external/arduino/avr/cores/arduino/USBAPI.h ================================================ /* USBAPI.h Copyright (c) 2005-2014 Arduino. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef __USBAPI__ #define __USBAPI__ #include #include #include #include #include typedef unsigned char u8; typedef unsigned short u16; typedef unsigned long u32; #include "Arduino.h" // This definitions is usefull if you want to reduce the EP_SIZE to 16 // at the moment only 64 and 16 as EP_SIZE for all EPs are supported except the control endpoint #ifndef USB_EP_SIZE #define USB_EP_SIZE 64 #endif #if defined(USBCON) #include "USBDesc.h" #include "USBCore.h" //================================================================================ //================================================================================ // USB #define EP_TYPE_CONTROL (0x00) #define EP_TYPE_BULK_IN ((1<256) #error Please lower the CDC Buffer size #endif class Serial_ : public Stream { private: int peek_buffer; public: Serial_() { peek_buffer = -1; }; void begin(unsigned long); void begin(unsigned long, uint8_t); void end(void); virtual int available(void); virtual int peek(void); virtual int read(void); virtual int availableForWrite(void); virtual void flush(void); virtual size_t write(uint8_t); virtual size_t write(const uint8_t*, size_t); using Print::write; // pull in write(str) and write(buf, size) from Print operator bool(); volatile uint8_t _rx_buffer_head; volatile uint8_t _rx_buffer_tail; unsigned char _rx_buffer[SERIAL_BUFFER_SIZE]; // This method allows processing "SEND_BREAK" requests sent by // the USB host. Those requests indicate that the host wants to // send a BREAK signal and are accompanied by a single uint16_t // value, specifying the duration of the break. The value 0 // means to end any current break, while the value 0xffff means // to start an indefinite break. // readBreak() will return the value of the most recent break // request, but will return it at most once, returning -1 when // readBreak() is called again (until another break request is // received, which is again returned once). // This also mean that if two break requests are received // without readBreak() being called in between, the value of the // first request is lost. // Note that the value returned is a long, so it can return // 0-0xffff as well as -1. int32_t readBreak(); // These return the settings specified by the USB host for the // serial port. These aren't really used, but are offered here // in case a sketch wants to act on these settings. uint32_t baud(); uint8_t stopbits(); uint8_t paritytype(); uint8_t numbits(); bool dtr(); bool rts(); enum { ONE_STOP_BIT = 0, ONE_AND_HALF_STOP_BIT = 1, TWO_STOP_BITS = 2, }; enum { NO_PARITY = 0, ODD_PARITY = 1, EVEN_PARITY = 2, MARK_PARITY = 3, SPACE_PARITY = 4, }; }; extern Serial_ Serial; #define HAVE_CDCSERIAL //================================================================================ //================================================================================ // Low level API typedef struct { uint8_t bmRequestType; uint8_t bRequest; uint8_t wValueL; uint8_t wValueH; uint16_t wIndex; uint16_t wLength; } USBSetup; //================================================================================ //================================================================================ // MSC 'Driver' int MSC_GetInterface(uint8_t* interfaceNum); int MSC_GetDescriptor(int i); bool MSC_Setup(USBSetup& setup); bool MSC_Data(uint8_t rx,uint8_t tx); //================================================================================ //================================================================================ // CSC 'Driver' int CDC_GetInterface(uint8_t* interfaceNum); int CDC_GetDescriptor(int i); bool CDC_Setup(USBSetup& setup); //================================================================================ //================================================================================ #define TRANSFER_PGM 0x80 #define TRANSFER_RELEASE 0x40 #define TRANSFER_ZERO 0x20 int USB_SendControl(uint8_t flags, const void* d, int len); int USB_RecvControl(void* d, int len); int USB_RecvControlLong(void* d, int len); uint8_t USB_Available(uint8_t ep); uint8_t USB_SendSpace(uint8_t ep); int USB_Send(uint8_t ep, const void* data, int len); // blocking int USB_Recv(uint8_t ep, void* data, int len); // non-blocking int USB_Recv(uint8_t ep); // non-blocking void USB_Flush(uint8_t ep); #endif #endif /* if defined(USBCON) */ ================================================ FILE: external/arduino/avr/cores/arduino/USBCore.cpp ================================================ /* Copyright (c) 2010, Peter Barrett ** Sleep/Wakeup support added by Michael Dreher ** ** Permission to use, copy, modify, and/or distribute this software for ** any purpose with or without fee is hereby granted, provided that the ** above copyright notice and this permission notice appear in all copies. ** ** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL ** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED ** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR ** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES ** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, ** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ** SOFTWARE. */ #include "USBAPI.h" #include "PluggableUSB.h" #include #if defined(USBCON) /** Pulse generation counters to keep track of the number of milliseconds remaining for each pulse type */ #define TX_RX_LED_PULSE_MS 100 volatile u8 TxLEDPulse; /**< Milliseconds remaining for data Tx LED pulse */ volatile u8 RxLEDPulse; /**< Milliseconds remaining for data Rx LED pulse */ //================================================================== //================================================================== extern const u16 STRING_LANGUAGE[] PROGMEM; extern const u8 STRING_PRODUCT[] PROGMEM; extern const u8 STRING_MANUFACTURER[] PROGMEM; extern const DeviceDescriptor USB_DeviceDescriptorIAD PROGMEM; const u16 STRING_LANGUAGE[2] = { (3<<8) | (2+2), 0x0409 // English }; #ifndef USB_PRODUCT // If no product is provided, use USB IO Board #define USB_PRODUCT "USB IO Board" #endif const u8 STRING_PRODUCT[] PROGMEM = USB_PRODUCT; #if USB_VID == 0x2341 # if defined(USB_MANUFACTURER) # undef USB_MANUFACTURER # endif # define USB_MANUFACTURER "Arduino LLC" #elif USB_VID == 0x1b4f # if defined(USB_MANUFACTURER) # undef USB_MANUFACTURER # endif # define USB_MANUFACTURER "SparkFun" #elif !defined(USB_MANUFACTURER) // Fall through to unknown if no manufacturer name was provided in a macro # define USB_MANUFACTURER "Unknown" #endif const u8 STRING_MANUFACTURER[] PROGMEM = USB_MANUFACTURER; #define DEVICE_CLASS 0x02 // DEVICE DESCRIPTOR const DeviceDescriptor USB_DeviceDescriptorIAD = D_DEVICE(0xEF,0x02,0x01,64,USB_VID,USB_PID,0x100,IMANUFACTURER,IPRODUCT,ISERIAL,1); //================================================================== //================================================================== volatile u8 _usbConfiguration = 0; volatile u8 _usbCurrentStatus = 0; // meaning of bits see usb_20.pdf, Figure 9-4. Information Returned by a GetStatus() Request to a Device volatile u8 _usbSuspendState = 0; // copy of UDINT to check SUSPI and WAKEUPI bits static inline void WaitIN(void) { while (!(UEINTX & (1< len) { n = len; } { LockEP lock(ep); // Frame may have been released by the SOF interrupt handler if (!ReadWriteAllowed()) continue; len -= n; if (ep & TRANSFER_ZERO) { while (n--) Send8(0); } else if (ep & TRANSFER_PGM) { while (n--) Send8(pgm_read_byte(data++)); } else { while (n--) Send8(*data++); } if (sendZlp) { ReleaseTX(); sendZlp = false; } else if (!ReadWriteAllowed()) { // ...release if buffer is full... ReleaseTX(); if (len == 0) sendZlp = true; } else if ((len == 0) && (ep & TRANSFER_RELEASE)) { // ...or if forced with TRANSFER_RELEASE // XXX: TRANSFER_RELEASE is never used can be removed? ReleaseTX(); } } } TXLED1; // light the TX LED TxLEDPulse = TX_RX_LED_PULSE_MS; return r; } u8 _initEndpoints[USB_ENDPOINTS] = { 0, // Control Endpoint EP_TYPE_INTERRUPT_IN, // CDC_ENDPOINT_ACM EP_TYPE_BULK_OUT, // CDC_ENDPOINT_OUT EP_TYPE_BULK_IN, // CDC_ENDPOINT_IN // Following endpoints are automatically initialized to 0 }; #define EP_SINGLE_64 0x32 // EP0 #define EP_DOUBLE_64 0x36 // Other endpoints #define EP_SINGLE_16 0x12 static void InitEP(u8 index, u8 type, u8 size) { UENUM = index; UECONX = (1< 64){ recvLength = 64; } // Write data to fit to the end (not the beginning) of the array WaitOUT(); Recv((u8*)d + len - length, recvLength); ClearOUT(); length -= recvLength; } return len; } static u8 SendInterfaces() { u8 interfaces = 0; CDC_GetInterface(&interfaces); #ifdef PLUGGABLE_USB_ENABLED PluggableUSB().getInterface(&interfaces); #endif return interfaces; } // Construct a dynamic configuration descriptor // This really needs dynamic endpoint allocation etc // TODO static bool SendConfiguration(int maxlen) { // Count and measure interfaces InitControl(0); u8 interfaces = SendInterfaces(); ConfigDescriptor config = D_CONFIG(_cmark + sizeof(ConfigDescriptor),interfaces); // Now send them InitControl(maxlen); USB_SendControl(0,&config,sizeof(ConfigDescriptor)); SendInterfaces(); return true; } static bool SendDescriptor(USBSetup& setup) { u8 t = setup.wValueH; if (USB_CONFIGURATION_DESCRIPTOR_TYPE == t) return SendConfiguration(setup.wLength); InitControl(setup.wLength); #ifdef PLUGGABLE_USB_ENABLED int ret = PluggableUSB().getDescriptor(setup); if (ret != 0) { return (ret > 0 ? true : false); } #endif const u8* desc_addr = 0; if (USB_DEVICE_DESCRIPTOR_TYPE == t) { desc_addr = (const u8*)&USB_DeviceDescriptorIAD; } else if (USB_STRING_DESCRIPTOR_TYPE == t) { if (setup.wValueL == 0) { desc_addr = (const u8*)&STRING_LANGUAGE; } else if (setup.wValueL == IPRODUCT) { return USB_SendStringDescriptor(STRING_PRODUCT, strlen(USB_PRODUCT), TRANSFER_PGM); } else if (setup.wValueL == IMANUFACTURER) { return USB_SendStringDescriptor(STRING_MANUFACTURER, strlen(USB_MANUFACTURER), TRANSFER_PGM); } else if (setup.wValueL == ISERIAL) { #ifdef PLUGGABLE_USB_ENABLED char name[ISERIAL_MAX_LEN]; PluggableUSB().getShortName(name); return USB_SendStringDescriptor((uint8_t*)name, strlen(name), 0); #endif } else return false; } if (desc_addr == 0) return false; u8 desc_length = pgm_read_byte(desc_addr); USB_SendControl(TRANSFER_PGM,desc_addr,desc_length); return true; } // Endpoint 0 interrupt ISR(USB_COM_vect) { SetEP(0); if (!ReceivedSetupInt()) return; USBSetup setup; Recv((u8*)&setup,8); ClearSetupInt(); u8 requestType = setup.bmRequestType; if (requestType & REQUEST_DEVICETOHOST) WaitIN(); else ClearIN(); bool ok = true; if (REQUEST_STANDARD == (requestType & REQUEST_TYPE)) { // Standard Requests u8 r = setup.bRequest; u16 wValue = setup.wValueL | (setup.wValueH << 8); if (GET_STATUS == r) { if (requestType == (REQUEST_DEVICETOHOST | REQUEST_STANDARD | REQUEST_DEVICE)) { Send8(_usbCurrentStatus); Send8(0); } else { // TODO: handle the HALT state of an endpoint here // see "Figure 9-6. Information Returned by a GetStatus() Request to an Endpoint" in usb_20.pdf for more information Send8(0); Send8(0); } } else if (CLEAR_FEATURE == r) { if((requestType == (REQUEST_HOSTTODEVICE | REQUEST_STANDARD | REQUEST_DEVICE)) && (wValue == DEVICE_REMOTE_WAKEUP)) { _usbCurrentStatus &= ~FEATURE_REMOTE_WAKEUP_ENABLED; } } else if (SET_FEATURE == r) { if((requestType == (REQUEST_HOSTTODEVICE | REQUEST_STANDARD | REQUEST_DEVICE)) && (wValue == DEVICE_REMOTE_WAKEUP)) { _usbCurrentStatus |= FEATURE_REMOTE_WAKEUP_ENABLED; } } else if (SET_ADDRESS == r) { WaitIN(); UDADDR = setup.wValueL | (1<> 8) & 0xFF) #define CDC_V1_10 0x0110 #define CDC_COMMUNICATION_INTERFACE_CLASS 0x02 #define CDC_CALL_MANAGEMENT 0x01 #define CDC_ABSTRACT_CONTROL_MODEL 0x02 #define CDC_HEADER 0x00 #define CDC_ABSTRACT_CONTROL_MANAGEMENT 0x02 #define CDC_UNION 0x06 #define CDC_CS_INTERFACE 0x24 #define CDC_CS_ENDPOINT 0x25 #define CDC_DATA_INTERFACE_CLASS 0x0A #define MSC_SUBCLASS_SCSI 0x06 #define MSC_PROTOCOL_BULK_ONLY 0x50 #ifndef USB_VERSION #define USB_VERSION 0x200 #endif // Device typedef struct { u8 len; // 18 u8 dtype; // 1 USB_DEVICE_DESCRIPTOR_TYPE u16 usbVersion; // 0x200 or 0x210 u8 deviceClass; u8 deviceSubClass; u8 deviceProtocol; u8 packetSize0; // Packet 0 u16 idVendor; u16 idProduct; u16 deviceVersion; // 0x100 u8 iManufacturer; u8 iProduct; u8 iSerialNumber; u8 bNumConfigurations; } DeviceDescriptor; // Config typedef struct { u8 len; // 9 u8 dtype; // 2 u16 clen; // total length u8 numInterfaces; u8 config; u8 iconfig; u8 attributes; u8 maxPower; } ConfigDescriptor; // String // Interface typedef struct { u8 len; // 9 u8 dtype; // 4 u8 number; u8 alternate; u8 numEndpoints; u8 interfaceClass; u8 interfaceSubClass; u8 protocol; u8 iInterface; } InterfaceDescriptor; // Endpoint typedef struct { u8 len; // 7 u8 dtype; // 5 u8 addr; u8 attr; u16 packetSize; u8 interval; } EndpointDescriptor; // Interface Association Descriptor // Used to bind 2 interfaces together in CDC compostite device typedef struct { u8 len; // 8 u8 dtype; // 11 u8 firstInterface; u8 interfaceCount; u8 functionClass; u8 funtionSubClass; u8 functionProtocol; u8 iInterface; } IADDescriptor; // CDC CS interface descriptor typedef struct { u8 len; // 5 u8 dtype; // 0x24 u8 subtype; u8 d0; u8 d1; } CDCCSInterfaceDescriptor; typedef struct { u8 len; // 4 u8 dtype; // 0x24 u8 subtype; u8 d0; } CDCCSInterfaceDescriptor4; typedef struct { u8 len; u8 dtype; // 0x24 u8 subtype; // 1 u8 bmCapabilities; u8 bDataInterface; } CMFunctionalDescriptor; typedef struct { u8 len; u8 dtype; // 0x24 u8 subtype; // 1 u8 bmCapabilities; } ACMFunctionalDescriptor; typedef struct { // IAD IADDescriptor iad; // Only needed on compound device // Control InterfaceDescriptor cif; // CDCCSInterfaceDescriptor header; CMFunctionalDescriptor callManagement; // Call Management ACMFunctionalDescriptor controlManagement; // ACM CDCCSInterfaceDescriptor functionalDescriptor; // CDC_UNION EndpointDescriptor cifin; // Data InterfaceDescriptor dif; EndpointDescriptor in; EndpointDescriptor out; } CDCDescriptor; typedef struct { InterfaceDescriptor msc; EndpointDescriptor in; EndpointDescriptor out; } MSCDescriptor; #define D_DEVICE(_class,_subClass,_proto,_packetSize0,_vid,_pid,_version,_im,_ip,_is,_configs) \ { 18, 1, USB_VERSION, _class,_subClass,_proto,_packetSize0,_vid,_pid,_version,_im,_ip,_is,_configs } #define D_CONFIG(_totalLength,_interfaces) \ { 9, 2, _totalLength,_interfaces, 1, 0, USB_CONFIG_BUS_POWERED | USB_CONFIG_REMOTE_WAKEUP, USB_CONFIG_POWER_MA(USB_CONFIG_POWER) } #define D_INTERFACE(_n,_numEndpoints,_class,_subClass,_protocol) \ { 9, 4, _n, 0, _numEndpoints, _class,_subClass, _protocol, 0 } #define D_ENDPOINT(_addr,_attr,_packetSize, _interval) \ { 7, 5, _addr,_attr,_packetSize, _interval } #define D_IAD(_firstInterface, _count, _class, _subClass, _protocol) \ { 8, 11, _firstInterface, _count, _class, _subClass, _protocol, 0 } #define D_CDCCS(_subtype,_d0,_d1) { 5, 0x24, _subtype, _d0, _d1 } #define D_CDCCS4(_subtype,_d0) { 4, 0x24, _subtype, _d0 } // Bootloader related fields // Old Caterina bootloader places the MAGIC key into unsafe RAM locations (it can be rewritten // by the running sketch before to actual reboot). // Newer bootloaders, recognizable by the LUFA "signature" at the end of the flash, can handle both // the usafe and the safe location. #ifndef MAGIC_KEY #define MAGIC_KEY 0x7777 #endif #ifndef MAGIC_KEY_POS #define MAGIC_KEY_POS 0x0800 #endif #ifndef NEW_LUFA_SIGNATURE #define NEW_LUFA_SIGNATURE 0xDCFB #endif #endif ================================================ FILE: external/arduino/avr/cores/arduino/USBDesc.h ================================================ /* Copyright (c) 2011, Peter Barrett Copyright (c) 2015, Arduino LLC Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #define PLUGGABLE_USB_ENABLED #if defined(EPRST6) #define USB_ENDPOINTS 7 // AtMegaxxU4 #else #define USB_ENDPOINTS 5 // AtMegaxxU2 #endif #define ISERIAL_MAX_LEN 20 #define CDC_INTERFACE_COUNT 2 #define CDC_ENPOINT_COUNT 3 #define CDC_ACM_INTERFACE 0 // CDC ACM #define CDC_DATA_INTERFACE 1 // CDC Data #define CDC_FIRST_ENDPOINT 1 #define CDC_ENDPOINT_ACM (CDC_FIRST_ENDPOINT) // CDC First #define CDC_ENDPOINT_OUT (CDC_FIRST_ENDPOINT+1) #define CDC_ENDPOINT_IN (CDC_FIRST_ENDPOINT+2) #define INTERFACE_COUNT (MSC_INTERFACE + MSC_INTERFACE_COUNT) #define CDC_RX CDC_ENDPOINT_OUT #define CDC_TX CDC_ENDPOINT_IN #define IMANUFACTURER 1 #define IPRODUCT 2 #define ISERIAL 3 ================================================ FILE: external/arduino/avr/cores/arduino/Udp.h ================================================ /* * Udp.cpp: Library to send/receive UDP packets. * * NOTE: UDP is fast, but has some important limitations (thanks to Warren Gray for mentioning these) * 1) UDP does not guarantee the order in which assembled UDP packets are received. This * might not happen often in practice, but in larger network topologies, a UDP * packet can be received out of sequence. * 2) UDP does not guard against lost packets - so packets *can* disappear without the sender being * aware of it. Again, this may not be a concern in practice on small local networks. * For more information, see http://www.cafeaulait.org/course/week12/35.html * * MIT License: * Copyright (c) 2008 Bjoern Hartmann * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * * bjoern@cs.stanford.edu 12/30/2008 */ #ifndef udp_h #define udp_h #include #include class UDP : public Stream { public: virtual uint8_t begin(uint16_t) =0; // initialize, start listening on specified port. Returns 1 if successful, 0 if there are no sockets available to use virtual uint8_t beginMulticast(IPAddress, uint16_t) { return 0; } // initialize, start listening on specified multicast IP address and port. Returns 1 if successful, 0 on failure virtual void stop() =0; // Finish with the UDP socket // Sending UDP packets // Start building up a packet to send to the remote host specific in ip and port // Returns 1 if successful, 0 if there was a problem with the supplied IP address or port virtual int beginPacket(IPAddress ip, uint16_t port) =0; // Start building up a packet to send to the remote host specific in host and port // Returns 1 if successful, 0 if there was a problem resolving the hostname or port virtual int beginPacket(const char *host, uint16_t port) =0; // Finish off this packet and send it // Returns 1 if the packet was sent successfully, 0 if there was an error virtual int endPacket() =0; // Write a single byte into the packet virtual size_t write(uint8_t) =0; // Write size bytes from buffer into the packet virtual size_t write(const uint8_t *buffer, size_t size) =0; // Start processing the next available incoming packet // Returns the size of the packet in bytes, or 0 if no packets are available virtual int parsePacket() =0; // Number of bytes remaining in the current packet virtual int available() =0; // Read a single byte from the current packet virtual int read() =0; // Read up to len bytes from the current packet and place them into buffer // Returns the number of bytes read, or 0 if none are available virtual int read(unsigned char* buffer, size_t len) =0; // Read up to len characters from the current packet and place them into buffer // Returns the number of characters read, or 0 if none are available virtual int read(char* buffer, size_t len) =0; // Return the next byte from the current packet without moving on to the next byte virtual int peek() =0; virtual void flush() =0; // Finish reading the current packet // Return the IP address of the host who sent the current incoming packet virtual IPAddress remoteIP() =0; // Return the port of the host who sent the current incoming packet virtual uint16_t remotePort() =0; protected: uint8_t* rawIPAddress(IPAddress& addr) { return addr.raw_address(); }; }; #endif ================================================ FILE: external/arduino/avr/cores/arduino/WCharacter.h ================================================ /* WCharacter.h - Character utility functions for Wiring & Arduino Copyright (c) 2010 Hernando Barragan. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef Character_h #define Character_h #include // WCharacter.h prototypes inline boolean isAlphaNumeric(int c) __attribute__((always_inline)); inline boolean isAlpha(int c) __attribute__((always_inline)); inline boolean isAscii(int c) __attribute__((always_inline)); inline boolean isWhitespace(int c) __attribute__((always_inline)); inline boolean isControl(int c) __attribute__((always_inline)); inline boolean isDigit(int c) __attribute__((always_inline)); inline boolean isGraph(int c) __attribute__((always_inline)); inline boolean isLowerCase(int c) __attribute__((always_inline)); inline boolean isPrintable(int c) __attribute__((always_inline)); inline boolean isPunct(int c) __attribute__((always_inline)); inline boolean isSpace(int c) __attribute__((always_inline)); inline boolean isUpperCase(int c) __attribute__((always_inline)); inline boolean isHexadecimalDigit(int c) __attribute__((always_inline)); inline int toAscii(int c) __attribute__((always_inline)); inline int toLowerCase(int c) __attribute__((always_inline)); inline int toUpperCase(int c)__attribute__((always_inline)); // Checks for an alphanumeric character. // It is equivalent to (isalpha(c) || isdigit(c)). inline boolean isAlphaNumeric(int c) { return ( isalnum(c) == 0 ? false : true); } // Checks for an alphabetic character. // It is equivalent to (isupper(c) || islower(c)). inline boolean isAlpha(int c) { return ( isalpha(c) == 0 ? false : true); } // Checks whether c is a 7-bit unsigned char value // that fits into the ASCII character set. inline boolean isAscii(int c) { return ( isascii (c) == 0 ? false : true); } // Checks for a blank character, that is, a space or a tab. inline boolean isWhitespace(int c) { return ( isblank (c) == 0 ? false : true); } // Checks for a control character. inline boolean isControl(int c) { return ( iscntrl (c) == 0 ? false : true); } // Checks for a digit (0 through 9). inline boolean isDigit(int c) { return ( isdigit (c) == 0 ? false : true); } // Checks for any printable character except space. inline boolean isGraph(int c) { return ( isgraph (c) == 0 ? false : true); } // Checks for a lower-case character. inline boolean isLowerCase(int c) { return (islower (c) == 0 ? false : true); } // Checks for any printable character including space. inline boolean isPrintable(int c) { return ( isprint (c) == 0 ? false : true); } // Checks for any printable character which is not a space // or an alphanumeric character. inline boolean isPunct(int c) { return ( ispunct (c) == 0 ? false : true); } // Checks for white-space characters. For the avr-libc library, // these are: space, formfeed ('\f'), newline ('\n'), carriage // return ('\r'), horizontal tab ('\t'), and vertical tab ('\v'). inline boolean isSpace(int c) { return ( isspace (c) == 0 ? false : true); } // Checks for an uppercase letter. inline boolean isUpperCase(int c) { return ( isupper (c) == 0 ? false : true); } // Checks for a hexadecimal digits, i.e. one of 0 1 2 3 4 5 6 7 // 8 9 a b c d e f A B C D E F. inline boolean isHexadecimalDigit(int c) { return ( isxdigit (c) == 0 ? false : true); } // Converts c to a 7-bit unsigned char value that fits into the // ASCII character set, by clearing the high-order bits. inline int toAscii(int c) { return toascii (c); } // Warning: // Many people will be unhappy if you use this function. // This function will convert accented letters into random // characters. // Converts the letter c to lower case, if possible. inline int toLowerCase(int c) { return tolower (c); } // Converts the letter c to upper case, if possible. inline int toUpperCase(int c) { return toupper (c); } #endif ================================================ FILE: external/arduino/avr/cores/arduino/WInterrupts.c ================================================ /* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* Part of the Wiring project - http://wiring.uniandes.edu.co Copyright (c) 2004-05 Hernando Barragan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Modified 24 November 2006 by David A. Mellis Modified 1 August 2010 by Mark Sproul */ #include #include #include #include #include #include "wiring_private.h" static void nothing(void) { } static volatile voidFuncPtr intFunc[EXTERNAL_NUM_INTERRUPTS] = { #if EXTERNAL_NUM_INTERRUPTS > 8 #warning There are more than 8 external interrupts. Some callbacks may not be initialized. nothing, #endif #if EXTERNAL_NUM_INTERRUPTS > 7 nothing, #endif #if EXTERNAL_NUM_INTERRUPTS > 6 nothing, #endif #if EXTERNAL_NUM_INTERRUPTS > 5 nothing, #endif #if EXTERNAL_NUM_INTERRUPTS > 4 nothing, #endif #if EXTERNAL_NUM_INTERRUPTS > 3 nothing, #endif #if EXTERNAL_NUM_INTERRUPTS > 2 nothing, #endif #if EXTERNAL_NUM_INTERRUPTS > 1 nothing, #endif #if EXTERNAL_NUM_INTERRUPTS > 0 nothing, #endif }; void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) { if(interruptNum < EXTERNAL_NUM_INTERRUPTS) { intFunc[interruptNum] = userFunc; // Configure the interrupt mode (trigger on low input, any change, rising // edge, or falling edge). The mode constants were chosen to correspond // to the configuration bits in the hardware register, so we simply shift // the mode into place. // Enable the interrupt. switch (interruptNum) { #if defined(__AVR_ATmega32U4__) // I hate doing this, but the register assignment differs between the 1280/2560 // and the 32U4. Since avrlib defines registers PCMSK1 and PCMSK2 that aren't // even present on the 32U4 this is the only way to distinguish between them. case 0: EICRA = (EICRA & ~((1<= howbig) { return howsmall; } long diff = howbig - howsmall; return random(diff) + howsmall; } long map(long x, long in_min, long in_max, long out_min, long out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; } unsigned int makeWord(unsigned int w) { return w; } unsigned int makeWord(unsigned char h, unsigned char l) { return (h << 8) | l; } ================================================ FILE: external/arduino/avr/cores/arduino/WString.cpp ================================================ /* WString.cpp - String library for Wiring & Arduino ...mostly rewritten by Paul Stoffregen... Copyright (c) 2009-10 Hernando Barragan. All rights reserved. Copyright 2011, Paul Stoffregen, paul@pjrc.com This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "WString.h" /*********************************************/ /* Constructors */ /*********************************************/ String::String(const char *cstr) { init(); if (cstr) copy(cstr, strlen(cstr)); } String::String(const String &value) { init(); *this = value; } String::String(const __FlashStringHelper *pstr) { init(); *this = pstr; } #if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__) String::String(String &&rval) { init(); move(rval); } String::String(StringSumHelper &&rval) { init(); move(rval); } #endif String::String(char c) { init(); char buf[2]; buf[0] = c; buf[1] = 0; *this = buf; } String::String(unsigned char value, unsigned char base) { init(); char buf[1 + 8 * sizeof(unsigned char)]; utoa(value, buf, base); *this = buf; } String::String(int value, unsigned char base) { init(); char buf[2 + 8 * sizeof(int)]; itoa(value, buf, base); *this = buf; } String::String(unsigned int value, unsigned char base) { init(); char buf[1 + 8 * sizeof(unsigned int)]; utoa(value, buf, base); *this = buf; } String::String(long value, unsigned char base) { init(); char buf[2 + 8 * sizeof(long)]; ltoa(value, buf, base); *this = buf; } String::String(unsigned long value, unsigned char base) { init(); char buf[1 + 8 * sizeof(unsigned long)]; ultoa(value, buf, base); *this = buf; } String::String(float value, unsigned char decimalPlaces) { init(); char buf[33]; *this = dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf); } String::String(double value, unsigned char decimalPlaces) { init(); char buf[33]; *this = dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf); } String::~String() { if (buffer) free(buffer); } /*********************************************/ /* Memory Management */ /*********************************************/ inline void String::init(void) { buffer = NULL; capacity = 0; len = 0; } void String::invalidate(void) { if (buffer) free(buffer); buffer = NULL; capacity = len = 0; } unsigned char String::reserve(unsigned int size) { if (buffer && capacity >= size) return 1; if (changeBuffer(size)) { if (len == 0) buffer[0] = 0; return 1; } return 0; } unsigned char String::changeBuffer(unsigned int maxStrLen) { char *newbuffer = (char *)realloc(buffer, maxStrLen + 1); if (newbuffer) { buffer = newbuffer; capacity = maxStrLen; return 1; } return 0; } /*********************************************/ /* Copy and Move */ /*********************************************/ String & String::copy(const char *cstr, unsigned int length) { if (!reserve(length)) { invalidate(); return *this; } len = length; strcpy(buffer, cstr); return *this; } String & String::copy(const __FlashStringHelper *pstr, unsigned int length) { if (!reserve(length)) { invalidate(); return *this; } len = length; strcpy_P(buffer, (PGM_P)pstr); return *this; } #if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__) void String::move(String &rhs) { if (buffer) { if (rhs && capacity >= rhs.len) { strcpy(buffer, rhs.buffer); len = rhs.len; rhs.len = 0; return; } else { free(buffer); } } buffer = rhs.buffer; capacity = rhs.capacity; len = rhs.len; rhs.buffer = NULL; rhs.capacity = 0; rhs.len = 0; } #endif String & String::operator = (const String &rhs) { if (this == &rhs) return *this; if (rhs.buffer) copy(rhs.buffer, rhs.len); else invalidate(); return *this; } #if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__) String & String::operator = (String &&rval) { if (this != &rval) move(rval); return *this; } String & String::operator = (StringSumHelper &&rval) { if (this != &rval) move(rval); return *this; } #endif String & String::operator = (const char *cstr) { if (cstr) copy(cstr, strlen(cstr)); else invalidate(); return *this; } String & String::operator = (const __FlashStringHelper *pstr) { if (pstr) copy(pstr, strlen_P((PGM_P)pstr)); else invalidate(); return *this; } /*********************************************/ /* concat */ /*********************************************/ unsigned char String::concat(const String &s) { return concat(s.buffer, s.len); } unsigned char String::concat(const char *cstr, unsigned int length) { unsigned int newlen = len + length; if (!cstr) return 0; if (length == 0) return 1; if (!reserve(newlen)) return 0; strcpy(buffer + len, cstr); len = newlen; return 1; } unsigned char String::concat(const char *cstr) { if (!cstr) return 0; return concat(cstr, strlen(cstr)); } unsigned char String::concat(char c) { char buf[2]; buf[0] = c; buf[1] = 0; return concat(buf, 1); } unsigned char String::concat(unsigned char num) { char buf[1 + 3 * sizeof(unsigned char)]; itoa(num, buf, 10); return concat(buf, strlen(buf)); } unsigned char String::concat(int num) { char buf[2 + 3 * sizeof(int)]; itoa(num, buf, 10); return concat(buf, strlen(buf)); } unsigned char String::concat(unsigned int num) { char buf[1 + 3 * sizeof(unsigned int)]; utoa(num, buf, 10); return concat(buf, strlen(buf)); } unsigned char String::concat(long num) { char buf[2 + 3 * sizeof(long)]; ltoa(num, buf, 10); return concat(buf, strlen(buf)); } unsigned char String::concat(unsigned long num) { char buf[1 + 3 * sizeof(unsigned long)]; ultoa(num, buf, 10); return concat(buf, strlen(buf)); } unsigned char String::concat(float num) { char buf[20]; char* string = dtostrf(num, 4, 2, buf); return concat(string, strlen(string)); } unsigned char String::concat(double num) { char buf[20]; char* string = dtostrf(num, 4, 2, buf); return concat(string, strlen(string)); } unsigned char String::concat(const __FlashStringHelper * str) { if (!str) return 0; int length = strlen_P((const char *) str); if (length == 0) return 1; unsigned int newlen = len + length; if (!reserve(newlen)) return 0; strcpy_P(buffer + len, (const char *) str); len = newlen; return 1; } /*********************************************/ /* Concatenate */ /*********************************************/ StringSumHelper & operator + (const StringSumHelper &lhs, const String &rhs) { StringSumHelper &a = const_cast(lhs); if (!a.concat(rhs.buffer, rhs.len)) a.invalidate(); return a; } StringSumHelper & operator + (const StringSumHelper &lhs, const char *cstr) { StringSumHelper &a = const_cast(lhs); if (!cstr || !a.concat(cstr, strlen(cstr))) a.invalidate(); return a; } StringSumHelper & operator + (const StringSumHelper &lhs, char c) { StringSumHelper &a = const_cast(lhs); if (!a.concat(c)) a.invalidate(); return a; } StringSumHelper & operator + (const StringSumHelper &lhs, unsigned char num) { StringSumHelper &a = const_cast(lhs); if (!a.concat(num)) a.invalidate(); return a; } StringSumHelper & operator + (const StringSumHelper &lhs, int num) { StringSumHelper &a = const_cast(lhs); if (!a.concat(num)) a.invalidate(); return a; } StringSumHelper & operator + (const StringSumHelper &lhs, unsigned int num) { StringSumHelper &a = const_cast(lhs); if (!a.concat(num)) a.invalidate(); return a; } StringSumHelper & operator + (const StringSumHelper &lhs, long num) { StringSumHelper &a = const_cast(lhs); if (!a.concat(num)) a.invalidate(); return a; } StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num) { StringSumHelper &a = const_cast(lhs); if (!a.concat(num)) a.invalidate(); return a; } StringSumHelper & operator + (const StringSumHelper &lhs, float num) { StringSumHelper &a = const_cast(lhs); if (!a.concat(num)) a.invalidate(); return a; } StringSumHelper & operator + (const StringSumHelper &lhs, double num) { StringSumHelper &a = const_cast(lhs); if (!a.concat(num)) a.invalidate(); return a; } StringSumHelper & operator + (const StringSumHelper &lhs, const __FlashStringHelper *rhs) { StringSumHelper &a = const_cast(lhs); if (!a.concat(rhs)) a.invalidate(); return a; } /*********************************************/ /* Comparison */ /*********************************************/ int String::compareTo(const String &s) const { if (!buffer || !s.buffer) { if (s.buffer && s.len > 0) return 0 - *(unsigned char *)s.buffer; if (buffer && len > 0) return *(unsigned char *)buffer; return 0; } return strcmp(buffer, s.buffer); } unsigned char String::equals(const String &s2) const { return (len == s2.len && compareTo(s2) == 0); } unsigned char String::equals(const char *cstr) const { if (len == 0) return (cstr == NULL || *cstr == 0); if (cstr == NULL) return buffer[0] == 0; return strcmp(buffer, cstr) == 0; } unsigned char String::operator<(const String &rhs) const { return compareTo(rhs) < 0; } unsigned char String::operator>(const String &rhs) const { return compareTo(rhs) > 0; } unsigned char String::operator<=(const String &rhs) const { return compareTo(rhs) <= 0; } unsigned char String::operator>=(const String &rhs) const { return compareTo(rhs) >= 0; } unsigned char String::equalsIgnoreCase( const String &s2 ) const { if (this == &s2) return 1; if (len != s2.len) return 0; if (len == 0) return 1; const char *p1 = buffer; const char *p2 = s2.buffer; while (*p1) { if (tolower(*p1++) != tolower(*p2++)) return 0; } return 1; } unsigned char String::startsWith( const String &s2 ) const { if (len < s2.len) return 0; return startsWith(s2, 0); } unsigned char String::startsWith( const String &s2, unsigned int offset ) const { if (offset > len - s2.len || !buffer || !s2.buffer) return 0; return strncmp( &buffer[offset], s2.buffer, s2.len ) == 0; } unsigned char String::endsWith( const String &s2 ) const { if ( len < s2.len || !buffer || !s2.buffer) return 0; return strcmp(&buffer[len - s2.len], s2.buffer) == 0; } /*********************************************/ /* Character Access */ /*********************************************/ char String::charAt(unsigned int loc) const { return operator[](loc); } void String::setCharAt(unsigned int loc, char c) { if (loc < len) buffer[loc] = c; } char & String::operator[](unsigned int index) { static char dummy_writable_char; if (index >= len || !buffer) { dummy_writable_char = 0; return dummy_writable_char; } return buffer[index]; } char String::operator[]( unsigned int index ) const { if (index >= len || !buffer) return 0; return buffer[index]; } void String::getBytes(unsigned char *buf, unsigned int bufsize, unsigned int index) const { if (!bufsize || !buf) return; if (index >= len) { buf[0] = 0; return; } unsigned int n = bufsize - 1; if (n > len - index) n = len - index; strncpy((char *)buf, buffer + index, n); buf[n] = 0; } /*********************************************/ /* Search */ /*********************************************/ int String::indexOf(char c) const { return indexOf(c, 0); } int String::indexOf( char ch, unsigned int fromIndex ) const { if (fromIndex >= len) return -1; const char* temp = strchr(buffer + fromIndex, ch); if (temp == NULL) return -1; return temp - buffer; } int String::indexOf(const String &s2) const { return indexOf(s2, 0); } int String::indexOf(const String &s2, unsigned int fromIndex) const { if (fromIndex >= len) return -1; const char *found = strstr(buffer + fromIndex, s2.buffer); if (found == NULL) return -1; return found - buffer; } int String::lastIndexOf( char theChar ) const { return lastIndexOf(theChar, len - 1); } int String::lastIndexOf(char ch, unsigned int fromIndex) const { if (fromIndex >= len) return -1; char tempchar = buffer[fromIndex + 1]; buffer[fromIndex + 1] = '\0'; char* temp = strrchr( buffer, ch ); buffer[fromIndex + 1] = tempchar; if (temp == NULL) return -1; return temp - buffer; } int String::lastIndexOf(const String &s2) const { return lastIndexOf(s2, len - s2.len); } int String::lastIndexOf(const String &s2, unsigned int fromIndex) const { if (s2.len == 0 || len == 0 || s2.len > len) return -1; if (fromIndex >= len) fromIndex = len - 1; int found = -1; for (char *p = buffer; p <= buffer + fromIndex; p++) { p = strstr(p, s2.buffer); if (!p) break; if ((unsigned int)(p - buffer) <= fromIndex) found = p - buffer; } return found; } String String::substring(unsigned int left, unsigned int right) const { if (left > right) { unsigned int temp = right; right = left; left = temp; } String out; if (left >= len) return out; if (right > len) right = len; char temp = buffer[right]; // save the replaced character buffer[right] = '\0'; out = buffer + left; // pointer arithmetic buffer[right] = temp; //restore character return out; } /*********************************************/ /* Modification */ /*********************************************/ void String::replace(char find, char replace) { if (!buffer) return; for (char *p = buffer; *p; p++) { if (*p == find) *p = replace; } } void String::replace(const String& find, const String& replace) { if (len == 0 || find.len == 0) return; int diff = replace.len - find.len; char *readFrom = buffer; char *foundAt; if (diff == 0) { while ((foundAt = strstr(readFrom, find.buffer)) != NULL) { memcpy(foundAt, replace.buffer, replace.len); readFrom = foundAt + replace.len; } } else if (diff < 0) { char *writeTo = buffer; while ((foundAt = strstr(readFrom, find.buffer)) != NULL) { unsigned int n = foundAt - readFrom; memcpy(writeTo, readFrom, n); writeTo += n; memcpy(writeTo, replace.buffer, replace.len); writeTo += replace.len; readFrom = foundAt + find.len; len += diff; } strcpy(writeTo, readFrom); } else { unsigned int size = len; // compute size needed for result while ((foundAt = strstr(readFrom, find.buffer)) != NULL) { readFrom = foundAt + find.len; size += diff; } if (size == len) return; if (size > capacity && !changeBuffer(size)) return; // XXX: tell user! int index = len - 1; while (index >= 0 && (index = lastIndexOf(find, index)) >= 0) { readFrom = buffer + index + find.len; memmove(readFrom + diff, readFrom, len - (readFrom - buffer)); len += diff; buffer[len] = 0; memcpy(buffer + index, replace.buffer, replace.len); index--; } } } void String::remove(unsigned int index){ // Pass the biggest integer as the count. The remove method // below will take care of truncating it at the end of the // string. remove(index, (unsigned int)-1); } void String::remove(unsigned int index, unsigned int count){ if (index >= len) { return; } if (count <= 0) { return; } if (count > len - index) { count = len - index; } char *writeTo = buffer + index; len = len - count; strncpy(writeTo, buffer + index + count,len - index); buffer[len] = 0; } void String::toLowerCase(void) { if (!buffer) return; for (char *p = buffer; *p; p++) { *p = tolower(*p); } } void String::toUpperCase(void) { if (!buffer) return; for (char *p = buffer; *p; p++) { *p = toupper(*p); } } void String::trim(void) { if (!buffer || len == 0) return; char *begin = buffer; while (isspace(*begin)) begin++; char *end = buffer + len - 1; while (isspace(*end) && end >= begin) end--; len = end + 1 - begin; if (begin > buffer) memcpy(buffer, begin, len); buffer[len] = 0; } /*********************************************/ /* Parsing / Conversion */ /*********************************************/ long String::toInt(void) const { if (buffer) return atol(buffer); return 0; } float String::toFloat(void) const { return float(toDouble()); } double String::toDouble(void) const { if (buffer) return atof(buffer); return 0; } ================================================ FILE: external/arduino/avr/cores/arduino/WString.h ================================================ /* WString.h - String library for Wiring & Arduino ...mostly rewritten by Paul Stoffregen... Copyright (c) 2009-10 Hernando Barragan. All right reserved. Copyright 2011, Paul Stoffregen, paul@pjrc.com This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef String_class_h #define String_class_h #ifdef __cplusplus #include #include #include #include // When compiling programs with this class, the following gcc parameters // dramatically increase performance and memory (RAM) efficiency, typically // with little or no increase in code size. // -felide-constructors // -std=c++0x class __FlashStringHelper; #define F(string_literal) (reinterpret_cast(PSTR(string_literal))) // An inherited class for holding the result of a concatenation. These // result objects are assumed to be writable by subsequent concatenations. class StringSumHelper; // The string class class String { // use a function pointer to allow for "if (s)" without the // complications of an operator bool(). for more information, see: // http://www.artima.com/cppsource/safebool.html typedef void (String::*StringIfHelperType)() const; void StringIfHelper() const {} public: // constructors // creates a copy of the initial value. // if the initial value is null or invalid, or if memory allocation // fails, the string will be marked as invalid (i.e. "if (s)" will // be false). String(const char *cstr = ""); String(const String &str); String(const __FlashStringHelper *str); #if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__) String(String &&rval); String(StringSumHelper &&rval); #endif explicit String(char c); explicit String(unsigned char, unsigned char base=10); explicit String(int, unsigned char base=10); explicit String(unsigned int, unsigned char base=10); explicit String(long, unsigned char base=10); explicit String(unsigned long, unsigned char base=10); explicit String(float, unsigned char decimalPlaces=2); explicit String(double, unsigned char decimalPlaces=2); ~String(void); // memory management // return true on success, false on failure (in which case, the string // is left unchanged). reserve(0), if successful, will validate an // invalid string (i.e., "if (s)" will be true afterwards) unsigned char reserve(unsigned int size); inline unsigned int length(void) const {return len;} // creates a copy of the assigned value. if the value is null or // invalid, or if the memory allocation fails, the string will be // marked as invalid ("if (s)" will be false). String & operator = (const String &rhs); String & operator = (const char *cstr); String & operator = (const __FlashStringHelper *str); #if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__) String & operator = (String &&rval); String & operator = (StringSumHelper &&rval); #endif // concatenate (works w/ built-in types) // returns true on success, false on failure (in which case, the string // is left unchanged). if the argument is null or invalid, the // concatenation is considered unsucessful. unsigned char concat(const String &str); unsigned char concat(const char *cstr); unsigned char concat(char c); unsigned char concat(unsigned char c); unsigned char concat(int num); unsigned char concat(unsigned int num); unsigned char concat(long num); unsigned char concat(unsigned long num); unsigned char concat(float num); unsigned char concat(double num); unsigned char concat(const __FlashStringHelper * str); // if there's not enough memory for the concatenated value, the string // will be left unchanged (but this isn't signalled in any way) String & operator += (const String &rhs) {concat(rhs); return (*this);} String & operator += (const char *cstr) {concat(cstr); return (*this);} String & operator += (char c) {concat(c); return (*this);} String & operator += (unsigned char num) {concat(num); return (*this);} String & operator += (int num) {concat(num); return (*this);} String & operator += (unsigned int num) {concat(num); return (*this);} String & operator += (long num) {concat(num); return (*this);} String & operator += (unsigned long num) {concat(num); return (*this);} String & operator += (float num) {concat(num); return (*this);} String & operator += (double num) {concat(num); return (*this);} String & operator += (const __FlashStringHelper *str){concat(str); return (*this);} friend StringSumHelper & operator + (const StringSumHelper &lhs, const String &rhs); friend StringSumHelper & operator + (const StringSumHelper &lhs, const char *cstr); friend StringSumHelper & operator + (const StringSumHelper &lhs, char c); friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned char num); friend StringSumHelper & operator + (const StringSumHelper &lhs, int num); friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned int num); friend StringSumHelper & operator + (const StringSumHelper &lhs, long num); friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num); friend StringSumHelper & operator + (const StringSumHelper &lhs, float num); friend StringSumHelper & operator + (const StringSumHelper &lhs, double num); friend StringSumHelper & operator + (const StringSumHelper &lhs, const __FlashStringHelper *rhs); // comparison (only works w/ Strings and "strings") operator StringIfHelperType() const { return buffer ? &String::StringIfHelper : 0; } int compareTo(const String &s) const; unsigned char equals(const String &s) const; unsigned char equals(const char *cstr) const; unsigned char operator == (const String &rhs) const {return equals(rhs);} unsigned char operator == (const char *cstr) const {return equals(cstr);} unsigned char operator != (const String &rhs) const {return !equals(rhs);} unsigned char operator != (const char *cstr) const {return !equals(cstr);} unsigned char operator < (const String &rhs) const; unsigned char operator > (const String &rhs) const; unsigned char operator <= (const String &rhs) const; unsigned char operator >= (const String &rhs) const; unsigned char equalsIgnoreCase(const String &s) const; unsigned char startsWith( const String &prefix) const; unsigned char startsWith(const String &prefix, unsigned int offset) const; unsigned char endsWith(const String &suffix) const; // character acccess char charAt(unsigned int index) const; void setCharAt(unsigned int index, char c); char operator [] (unsigned int index) const; char& operator [] (unsigned int index); void getBytes(unsigned char *buf, unsigned int bufsize, unsigned int index=0) const; void toCharArray(char *buf, unsigned int bufsize, unsigned int index=0) const { getBytes((unsigned char *)buf, bufsize, index); } const char* c_str() const { return buffer; } char* begin() { return buffer; } char* end() { return buffer + length(); } const char* begin() const { return c_str(); } const char* end() const { return c_str() + length(); } // search int indexOf( char ch ) const; int indexOf( char ch, unsigned int fromIndex ) const; int indexOf( const String &str ) const; int indexOf( const String &str, unsigned int fromIndex ) const; int lastIndexOf( char ch ) const; int lastIndexOf( char ch, unsigned int fromIndex ) const; int lastIndexOf( const String &str ) const; int lastIndexOf( const String &str, unsigned int fromIndex ) const; String substring( unsigned int beginIndex ) const { return substring(beginIndex, len); }; String substring( unsigned int beginIndex, unsigned int endIndex ) const; // modification void replace(char find, char replace); void replace(const String& find, const String& replace); void remove(unsigned int index); void remove(unsigned int index, unsigned int count); void toLowerCase(void); void toUpperCase(void); void trim(void); // parsing/conversion long toInt(void) const; float toFloat(void) const; double toDouble(void) const; protected: char *buffer; // the actual char array unsigned int capacity; // the array length minus one (for the '\0') unsigned int len; // the String length (not counting the '\0') protected: void init(void); void invalidate(void); unsigned char changeBuffer(unsigned int maxStrLen); unsigned char concat(const char *cstr, unsigned int length); // copy and move String & copy(const char *cstr, unsigned int length); String & copy(const __FlashStringHelper *pstr, unsigned int length); #if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__) void move(String &rhs); #endif }; class StringSumHelper : public String { public: StringSumHelper(const String &s) : String(s) {} StringSumHelper(const char *p) : String(p) {} StringSumHelper(char c) : String(c) {} StringSumHelper(unsigned char num) : String(num) {} StringSumHelper(int num) : String(num) {} StringSumHelper(unsigned int num) : String(num) {} StringSumHelper(long num) : String(num) {} StringSumHelper(unsigned long num) : String(num) {} StringSumHelper(float num) : String(num) {} StringSumHelper(double num) : String(num) {} }; #endif // __cplusplus #endif // String_class_h ================================================ FILE: external/arduino/avr/cores/arduino/abi.cpp ================================================ /* Copyright (c) 2014 Arduino. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include extern "C" void __cxa_pure_virtual(void) __attribute__ ((__noreturn__)); extern "C" void __cxa_deleted_virtual(void) __attribute__ ((__noreturn__)); void __cxa_pure_virtual(void) { // We might want to write some diagnostics to uart in this case //std::terminate(); abort(); } void __cxa_deleted_virtual(void) { // We might want to write some diagnostics to uart in this case //std::terminate(); abort(); } ================================================ FILE: external/arduino/avr/cores/arduino/binary.h ================================================ /* binary.h - Definitions for binary constants Copyright (c) 2006 David A. Mellis. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef Binary_h #define Binary_h #define B0 0 #define B00 0 #define B000 0 #define B0000 0 #define B00000 0 #define B000000 0 #define B0000000 0 #define B00000000 0 #define B1 1 #define B01 1 #define B001 1 #define B0001 1 #define B00001 1 #define B000001 1 #define B0000001 1 #define B00000001 1 #define B10 2 #define B010 2 #define B0010 2 #define B00010 2 #define B000010 2 #define B0000010 2 #define B00000010 2 #define B11 3 #define B011 3 #define B0011 3 #define B00011 3 #define B000011 3 #define B0000011 3 #define B00000011 3 #define B100 4 #define B0100 4 #define B00100 4 #define B000100 4 #define B0000100 4 #define B00000100 4 #define B101 5 #define B0101 5 #define B00101 5 #define B000101 5 #define B0000101 5 #define B00000101 5 #define B110 6 #define B0110 6 #define B00110 6 #define B000110 6 #define B0000110 6 #define B00000110 6 #define B111 7 #define B0111 7 #define B00111 7 #define B000111 7 #define B0000111 7 #define B00000111 7 #define B1000 8 #define B01000 8 #define B001000 8 #define B0001000 8 #define B00001000 8 #define B1001 9 #define B01001 9 #define B001001 9 #define B0001001 9 #define B00001001 9 #define B1010 10 #define B01010 10 #define B001010 10 #define B0001010 10 #define B00001010 10 #define B1011 11 #define B01011 11 #define B001011 11 #define B0001011 11 #define B00001011 11 #define B1100 12 #define B01100 12 #define B001100 12 #define B0001100 12 #define B00001100 12 #define B1101 13 #define B01101 13 #define B001101 13 #define B0001101 13 #define B00001101 13 #define B1110 14 #define B01110 14 #define B001110 14 #define B0001110 14 #define B00001110 14 #define B1111 15 #define B01111 15 #define B001111 15 #define B0001111 15 #define B00001111 15 #define B10000 16 #define B010000 16 #define B0010000 16 #define B00010000 16 #define B10001 17 #define B010001 17 #define B0010001 17 #define B00010001 17 #define B10010 18 #define B010010 18 #define B0010010 18 #define B00010010 18 #define B10011 19 #define B010011 19 #define B0010011 19 #define B00010011 19 #define B10100 20 #define B010100 20 #define B0010100 20 #define B00010100 20 #define B10101 21 #define B010101 21 #define B0010101 21 #define B00010101 21 #define B10110 22 #define B010110 22 #define B0010110 22 #define B00010110 22 #define B10111 23 #define B010111 23 #define B0010111 23 #define B00010111 23 #define B11000 24 #define B011000 24 #define B0011000 24 #define B00011000 24 #define B11001 25 #define B011001 25 #define B0011001 25 #define B00011001 25 #define B11010 26 #define B011010 26 #define B0011010 26 #define B00011010 26 #define B11011 27 #define B011011 27 #define B0011011 27 #define B00011011 27 #define B11100 28 #define B011100 28 #define B0011100 28 #define B00011100 28 #define B11101 29 #define B011101 29 #define B0011101 29 #define B00011101 29 #define B11110 30 #define B011110 30 #define B0011110 30 #define B00011110 30 #define B11111 31 #define B011111 31 #define B0011111 31 #define B00011111 31 #define B100000 32 #define B0100000 32 #define B00100000 32 #define B100001 33 #define B0100001 33 #define B00100001 33 #define B100010 34 #define B0100010 34 #define B00100010 34 #define B100011 35 #define B0100011 35 #define B00100011 35 #define B100100 36 #define B0100100 36 #define B00100100 36 #define B100101 37 #define B0100101 37 #define B00100101 37 #define B100110 38 #define B0100110 38 #define B00100110 38 #define B100111 39 #define B0100111 39 #define B00100111 39 #define B101000 40 #define B0101000 40 #define B00101000 40 #define B101001 41 #define B0101001 41 #define B00101001 41 #define B101010 42 #define B0101010 42 #define B00101010 42 #define B101011 43 #define B0101011 43 #define B00101011 43 #define B101100 44 #define B0101100 44 #define B00101100 44 #define B101101 45 #define B0101101 45 #define B00101101 45 #define B101110 46 #define B0101110 46 #define B00101110 46 #define B101111 47 #define B0101111 47 #define B00101111 47 #define B110000 48 #define B0110000 48 #define B00110000 48 #define B110001 49 #define B0110001 49 #define B00110001 49 #define B110010 50 #define B0110010 50 #define B00110010 50 #define B110011 51 #define B0110011 51 #define B00110011 51 #define B110100 52 #define B0110100 52 #define B00110100 52 #define B110101 53 #define B0110101 53 #define B00110101 53 #define B110110 54 #define B0110110 54 #define B00110110 54 #define B110111 55 #define B0110111 55 #define B00110111 55 #define B111000 56 #define B0111000 56 #define B00111000 56 #define B111001 57 #define B0111001 57 #define B00111001 57 #define B111010 58 #define B0111010 58 #define B00111010 58 #define B111011 59 #define B0111011 59 #define B00111011 59 #define B111100 60 #define B0111100 60 #define B00111100 60 #define B111101 61 #define B0111101 61 #define B00111101 61 #define B111110 62 #define B0111110 62 #define B00111110 62 #define B111111 63 #define B0111111 63 #define B00111111 63 #define B1000000 64 #define B01000000 64 #define B1000001 65 #define B01000001 65 #define B1000010 66 #define B01000010 66 #define B1000011 67 #define B01000011 67 #define B1000100 68 #define B01000100 68 #define B1000101 69 #define B01000101 69 #define B1000110 70 #define B01000110 70 #define B1000111 71 #define B01000111 71 #define B1001000 72 #define B01001000 72 #define B1001001 73 #define B01001001 73 #define B1001010 74 #define B01001010 74 #define B1001011 75 #define B01001011 75 #define B1001100 76 #define B01001100 76 #define B1001101 77 #define B01001101 77 #define B1001110 78 #define B01001110 78 #define B1001111 79 #define B01001111 79 #define B1010000 80 #define B01010000 80 #define B1010001 81 #define B01010001 81 #define B1010010 82 #define B01010010 82 #define B1010011 83 #define B01010011 83 #define B1010100 84 #define B01010100 84 #define B1010101 85 #define B01010101 85 #define B1010110 86 #define B01010110 86 #define B1010111 87 #define B01010111 87 #define B1011000 88 #define B01011000 88 #define B1011001 89 #define B01011001 89 #define B1011010 90 #define B01011010 90 #define B1011011 91 #define B01011011 91 #define B1011100 92 #define B01011100 92 #define B1011101 93 #define B01011101 93 #define B1011110 94 #define B01011110 94 #define B1011111 95 #define B01011111 95 #define B1100000 96 #define B01100000 96 #define B1100001 97 #define B01100001 97 #define B1100010 98 #define B01100010 98 #define B1100011 99 #define B01100011 99 #define B1100100 100 #define B01100100 100 #define B1100101 101 #define B01100101 101 #define B1100110 102 #define B01100110 102 #define B1100111 103 #define B01100111 103 #define B1101000 104 #define B01101000 104 #define B1101001 105 #define B01101001 105 #define B1101010 106 #define B01101010 106 #define B1101011 107 #define B01101011 107 #define B1101100 108 #define B01101100 108 #define B1101101 109 #define B01101101 109 #define B1101110 110 #define B01101110 110 #define B1101111 111 #define B01101111 111 #define B1110000 112 #define B01110000 112 #define B1110001 113 #define B01110001 113 #define B1110010 114 #define B01110010 114 #define B1110011 115 #define B01110011 115 #define B1110100 116 #define B01110100 116 #define B1110101 117 #define B01110101 117 #define B1110110 118 #define B01110110 118 #define B1110111 119 #define B01110111 119 #define B1111000 120 #define B01111000 120 #define B1111001 121 #define B01111001 121 #define B1111010 122 #define B01111010 122 #define B1111011 123 #define B01111011 123 #define B1111100 124 #define B01111100 124 #define B1111101 125 #define B01111101 125 #define B1111110 126 #define B01111110 126 #define B1111111 127 #define B01111111 127 #define B10000000 128 #define B10000001 129 #define B10000010 130 #define B10000011 131 #define B10000100 132 #define B10000101 133 #define B10000110 134 #define B10000111 135 #define B10001000 136 #define B10001001 137 #define B10001010 138 #define B10001011 139 #define B10001100 140 #define B10001101 141 #define B10001110 142 #define B10001111 143 #define B10010000 144 #define B10010001 145 #define B10010010 146 #define B10010011 147 #define B10010100 148 #define B10010101 149 #define B10010110 150 #define B10010111 151 #define B10011000 152 #define B10011001 153 #define B10011010 154 #define B10011011 155 #define B10011100 156 #define B10011101 157 #define B10011110 158 #define B10011111 159 #define B10100000 160 #define B10100001 161 #define B10100010 162 #define B10100011 163 #define B10100100 164 #define B10100101 165 #define B10100110 166 #define B10100111 167 #define B10101000 168 #define B10101001 169 #define B10101010 170 #define B10101011 171 #define B10101100 172 #define B10101101 173 #define B10101110 174 #define B10101111 175 #define B10110000 176 #define B10110001 177 #define B10110010 178 #define B10110011 179 #define B10110100 180 #define B10110101 181 #define B10110110 182 #define B10110111 183 #define B10111000 184 #define B10111001 185 #define B10111010 186 #define B10111011 187 #define B10111100 188 #define B10111101 189 #define B10111110 190 #define B10111111 191 #define B11000000 192 #define B11000001 193 #define B11000010 194 #define B11000011 195 #define B11000100 196 #define B11000101 197 #define B11000110 198 #define B11000111 199 #define B11001000 200 #define B11001001 201 #define B11001010 202 #define B11001011 203 #define B11001100 204 #define B11001101 205 #define B11001110 206 #define B11001111 207 #define B11010000 208 #define B11010001 209 #define B11010010 210 #define B11010011 211 #define B11010100 212 #define B11010101 213 #define B11010110 214 #define B11010111 215 #define B11011000 216 #define B11011001 217 #define B11011010 218 #define B11011011 219 #define B11011100 220 #define B11011101 221 #define B11011110 222 #define B11011111 223 #define B11100000 224 #define B11100001 225 #define B11100010 226 #define B11100011 227 #define B11100100 228 #define B11100101 229 #define B11100110 230 #define B11100111 231 #define B11101000 232 #define B11101001 233 #define B11101010 234 #define B11101011 235 #define B11101100 236 #define B11101101 237 #define B11101110 238 #define B11101111 239 #define B11110000 240 #define B11110001 241 #define B11110010 242 #define B11110011 243 #define B11110100 244 #define B11110101 245 #define B11110110 246 #define B11110111 247 #define B11111000 248 #define B11111001 249 #define B11111010 250 #define B11111011 251 #define B11111100 252 #define B11111101 253 #define B11111110 254 #define B11111111 255 #endif ================================================ FILE: external/arduino/avr/cores/arduino/hooks.c ================================================ /* Copyright (c) 2012 Arduino. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /** * Empty yield() hook. * * This function is intended to be used by library writers to build * libraries or sketches that supports cooperative threads. * * Its defined as a weak symbol and it can be redefined to implement a * real cooperative scheduler. */ static void __empty() { // Empty } //void yield(void) __attribute__ ((weak, alias("__empty"))); void yield() {__empty();} ================================================ FILE: external/arduino/avr/cores/arduino/main.cpp ================================================ /* main.cpp - Main loop for Arduino sketches Copyright (c) 2005-2013 Arduino Team. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include // Declared weak in Arduino.h to allow user redefinitions. int atexit(void (* /*func*/ )()) { return 0; } // Weak empty variant initialization function. // May be redefined by variant files. void initVariant() __attribute__((weak)); void initVariant() { } void setupUSB() __attribute__((weak)); void setupUSB() { } int main(void) { init(); initVariant(); #if defined(USBCON) USBDevice.attach(); #endif setup(); for (;;) { loop(); if (serialEventRun) serialEventRun(); } return 0; } ================================================ FILE: external/arduino/avr/cores/arduino/new.cpp ================================================ /* Copyright (c) 2014 Arduino. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include void *operator new(size_t size) { return malloc(size); } void *operator new[](size_t size) { return malloc(size); } void * operator new(size_t size, void * ptr) noexcept { (void)size; return ptr; } void operator delete(void * ptr) { free(ptr); } void operator delete[](void * ptr) { free(ptr); } ================================================ FILE: external/arduino/avr/cores/arduino/new.h ================================================ /* Copyright (c) 2014 Arduino. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef NEW_H #define NEW_H #include void * operator new(size_t size); void * operator new[](size_t size); //void * operator new(size_t size, void * ptr) noexcept; void operator delete(void * ptr); void operator delete[](void * ptr); #endif ================================================ FILE: external/arduino/avr/cores/arduino/wiring.c ================================================ /* wiring.c - Partial implementation of the Wiring API for the ATmega8. Part of Arduino - http://www.arduino.cc/ Copyright (c) 2005-2006 David A. Mellis This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "wiring_private.h" // the prescaler is set so that timer0 ticks every 64 clock cycles, and the // the overflow handler is called every 256 ticks. #define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256)) // the whole number of milliseconds per timer0 overflow #define MILLIS_INC (MICROSECONDS_PER_TIMER0_OVERFLOW / 1000) // the fractional number of milliseconds per timer0 overflow. we shift right // by three to fit these numbers into a byte. (for the clock speeds we care // about - 8 and 16 MHz - this doesn't lose precision.) #define FRACT_INC ((MICROSECONDS_PER_TIMER0_OVERFLOW % 1000) >> 3) #define FRACT_MAX (1000 >> 3) volatile unsigned long timer0_overflow_count = 0; volatile unsigned long timer0_millis = 0; static unsigned char timer0_fract = 0; #if defined(TIM0_OVF_vect) ISR(TIM0_OVF_vect) #else ISR(TIMER0_OVF_vect) #endif { // copy these to local variables so they can be stored in registers // (volatile variables must be read from memory on every access) unsigned long m = timer0_millis; unsigned char f = timer0_fract; m += MILLIS_INC; f += FRACT_INC; if (f >= FRACT_MAX) { f -= FRACT_MAX; m += 1; } timer0_fract = f; timer0_millis = m; timer0_overflow_count++; } unsigned long millis() { unsigned long m; uint8_t oldSREG = SREG; // disable interrupts while we read timer0_millis or we might get an // inconsistent value (e.g. in the middle of a write to timer0_millis) cli(); m = timer0_millis; SREG = oldSREG; return m; } unsigned long micros() { unsigned long m; uint8_t oldSREG = SREG, t; cli(); m = timer0_overflow_count; #if defined(TCNT0) t = TCNT0; #elif defined(TCNT0L) t = TCNT0L; #else #error TIMER 0 not defined #endif #ifdef TIFR0 if ((TIFR0 & _BV(TOV0)) && (t < 255)) m++; #else if ((TIFR & _BV(TOV0)) && (t < 255)) m++; #endif SREG = oldSREG; return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond()); } void delay(unsigned long ms) { uint32_t start = micros(); while (ms > 0) { yield(); while ( ms > 0 && (micros() - start) >= 1000) { ms--; start += 1000; } } } /* Delay for the given number of microseconds. Assumes a 1, 8, 12, 16, 20 or 24 MHz clock. */ void delayMicroseconds(unsigned int us) { // call = 4 cycles + 2 to 4 cycles to init us(2 for constant delay, 4 for variable) // calling avrlib's delay_us() function with low values (e.g. 1 or // 2 microseconds) gives delays longer than desired. //delay_us(us); #if F_CPU >= 24000000L // for the 24 MHz clock for the aventurous ones, trying to overclock // zero delay fix if (!us) return; // = 3 cycles, (4 when true) // the following loop takes a 1/6 of a microsecond (4 cycles) // per iteration, so execute it six times for each microsecond of // delay requested. us *= 6; // x6 us, = 7 cycles // account for the time taken in the preceeding commands. // we just burned 22 (24) cycles above, remove 5, (5*4=20) // us is at least 6 so we can substract 5 us -= 5; //=2 cycles #elif F_CPU >= 20000000L // for the 20 MHz clock on rare Arduino boards // for a one-microsecond delay, simply return. the overhead // of the function call takes 18 (20) cycles, which is 1us __asm__ __volatile__ ( "nop" "\n\t" "nop" "\n\t" "nop" "\n\t" "nop"); //just waiting 4 cycles if (us <= 1) return; // = 3 cycles, (4 when true) // the following loop takes a 1/5 of a microsecond (4 cycles) // per iteration, so execute it five times for each microsecond of // delay requested. us = (us << 2) + us; // x5 us, = 7 cycles // account for the time taken in the preceeding commands. // we just burned 26 (28) cycles above, remove 7, (7*4=28) // us is at least 10 so we can substract 7 us -= 7; // 2 cycles #elif F_CPU >= 16000000L // for the 16 MHz clock on most Arduino boards // for a one-microsecond delay, simply return. the overhead // of the function call takes 14 (16) cycles, which is 1us if (us <= 1) return; // = 3 cycles, (4 when true) // the following loop takes 1/4 of a microsecond (4 cycles) // per iteration, so execute it four times for each microsecond of // delay requested. us <<= 2; // x4 us, = 4 cycles // account for the time taken in the preceeding commands. // we just burned 19 (21) cycles above, remove 5, (5*4=20) // us is at least 8 so we can substract 5 us -= 5; // = 2 cycles, #elif F_CPU >= 12000000L // for the 12 MHz clock if somebody is working with USB // for a 1 microsecond delay, simply return. the overhead // of the function call takes 14 (16) cycles, which is 1.5us if (us <= 1) return; // = 3 cycles, (4 when true) // the following loop takes 1/3 of a microsecond (4 cycles) // per iteration, so execute it three times for each microsecond of // delay requested. us = (us << 1) + us; // x3 us, = 5 cycles // account for the time taken in the preceeding commands. // we just burned 20 (22) cycles above, remove 5, (5*4=20) // us is at least 6 so we can substract 5 us -= 5; //2 cycles #elif F_CPU >= 8000000L // for the 8 MHz internal clock // for a 1 and 2 microsecond delay, simply return. the overhead // of the function call takes 14 (16) cycles, which is 2us if (us <= 2) return; // = 3 cycles, (4 when true) // the following loop takes 1/2 of a microsecond (4 cycles) // per iteration, so execute it twice for each microsecond of // delay requested. us <<= 1; //x2 us, = 2 cycles // account for the time taken in the preceeding commands. // we just burned 17 (19) cycles above, remove 4, (4*4=16) // us is at least 6 so we can substract 4 us -= 4; // = 2 cycles #else // for the 1 MHz internal clock (default settings for common Atmega microcontrollers) // the overhead of the function calls is 14 (16) cycles if (us <= 16) return; //= 3 cycles, (4 when true) if (us <= 25) return; //= 3 cycles, (4 when true), (must be at least 25 if we want to substract 22) // compensate for the time taken by the preceeding and next commands (about 22 cycles) us -= 22; // = 2 cycles // the following loop takes 4 microseconds (4 cycles) // per iteration, so execute it us/4 times // us is at least 4, divided by 4 gives us 1 (no zero delay bug) us >>= 2; // us div 4, = 4 cycles #endif // busy wait __asm__ __volatile__ ( "1: sbiw %0,1" "\n\t" // 2 cycles "brne 1b" : "=w" (us) : "0" (us) // 2 cycles ); // return = 4 cycles } void init() { // this needs to be called before setup() or some functions won't // work there sei(); // on the ATmega168, timer 0 is also used for fast hardware pwm // (using phase-correct PWM would mean that timer 0 overflowed half as often // resulting in different millis() behavior on the ATmega8 and ATmega168) #if defined(TCCR0A) && defined(WGM01) sbi(TCCR0A, WGM01); sbi(TCCR0A, WGM00); #endif // set timer 0 prescale factor to 64 #if defined(__AVR_ATmega128__) // CPU specific: different values for the ATmega128 sbi(TCCR0, CS02); #elif defined(TCCR0) && defined(CS01) && defined(CS00) // this combination is for the standard atmega8 sbi(TCCR0, CS01); sbi(TCCR0, CS00); #elif defined(TCCR0B) && defined(CS01) && defined(CS00) // this combination is for the standard 168/328/1280/2560 sbi(TCCR0B, CS01); sbi(TCCR0B, CS00); #elif defined(TCCR0A) && defined(CS01) && defined(CS00) // this combination is for the __AVR_ATmega645__ series sbi(TCCR0A, CS01); sbi(TCCR0A, CS00); #else #error Timer 0 prescale factor 64 not set correctly #endif // enable timer 0 overflow interrupt #if defined(TIMSK) && defined(TOIE0) sbi(TIMSK, TOIE0); #elif defined(TIMSK0) && defined(TOIE0) sbi(TIMSK0, TOIE0); #else #error Timer 0 overflow interrupt not set correctly #endif // timers 1 and 2 are used for phase-correct hardware pwm // this is better for motors as it ensures an even waveform // note, however, that fast pwm mode can achieve a frequency of up // 8 MHz (with a 16 MHz clock) at 50% duty cycle #if defined(TCCR1B) && defined(CS11) && defined(CS10) TCCR1B = 0; // set timer 1 prescale factor to 64 sbi(TCCR1B, CS11); #if F_CPU >= 8000000L sbi(TCCR1B, CS10); #endif #elif defined(TCCR1) && defined(CS11) && defined(CS10) sbi(TCCR1, CS11); #if F_CPU >= 8000000L sbi(TCCR1, CS10); #endif #endif // put timer 1 in 8-bit phase correct pwm mode #if defined(TCCR1A) && defined(WGM10) sbi(TCCR1A, WGM10); #endif // set timer 2 prescale factor to 64 #if defined(TCCR2) && defined(CS22) sbi(TCCR2, CS22); #elif defined(TCCR2B) && defined(CS22) sbi(TCCR2B, CS22); //#else // Timer 2 not finished (may not be present on this CPU) #endif // configure timer 2 for phase correct pwm (8-bit) #if defined(TCCR2) && defined(WGM20) sbi(TCCR2, WGM20); #elif defined(TCCR2A) && defined(WGM20) sbi(TCCR2A, WGM20); //#else // Timer 2 not finished (may not be present on this CPU) #endif #if defined(TCCR3B) && defined(CS31) && defined(WGM30) sbi(TCCR3B, CS31); // set timer 3 prescale factor to 64 sbi(TCCR3B, CS30); sbi(TCCR3A, WGM30); // put timer 3 in 8-bit phase correct pwm mode #endif #if defined(TCCR4A) && defined(TCCR4B) && defined(TCCR4D) /* beginning of timer4 block for 32U4 and similar */ sbi(TCCR4B, CS42); // set timer4 prescale factor to 64 sbi(TCCR4B, CS41); sbi(TCCR4B, CS40); sbi(TCCR4D, WGM40); // put timer 4 in phase- and frequency-correct PWM mode sbi(TCCR4A, PWM4A); // enable PWM mode for comparator OCR4A sbi(TCCR4C, PWM4D); // enable PWM mode for comparator OCR4D #else /* beginning of timer4 block for ATMEGA1280 and ATMEGA2560 */ #if defined(TCCR4B) && defined(CS41) && defined(WGM40) sbi(TCCR4B, CS41); // set timer 4 prescale factor to 64 sbi(TCCR4B, CS40); sbi(TCCR4A, WGM40); // put timer 4 in 8-bit phase correct pwm mode #endif #endif /* end timer4 block for ATMEGA1280/2560 and similar */ #if defined(TCCR5B) && defined(CS51) && defined(WGM50) sbi(TCCR5B, CS51); // set timer 5 prescale factor to 64 sbi(TCCR5B, CS50); sbi(TCCR5A, WGM50); // put timer 5 in 8-bit phase correct pwm mode #endif #if defined(ADCSRA) // set a2d prescaler so we are inside the desired 50-200 KHz range. #if F_CPU >= 16000000 // 16 MHz / 128 = 125 KHz sbi(ADCSRA, ADPS2); sbi(ADCSRA, ADPS1); sbi(ADCSRA, ADPS0); #elif F_CPU >= 8000000 // 8 MHz / 64 = 125 KHz sbi(ADCSRA, ADPS2); sbi(ADCSRA, ADPS1); cbi(ADCSRA, ADPS0); #elif F_CPU >= 4000000 // 4 MHz / 32 = 125 KHz sbi(ADCSRA, ADPS2); cbi(ADCSRA, ADPS1); sbi(ADCSRA, ADPS0); #elif F_CPU >= 2000000 // 2 MHz / 16 = 125 KHz sbi(ADCSRA, ADPS2); cbi(ADCSRA, ADPS1); cbi(ADCSRA, ADPS0); #elif F_CPU >= 1000000 // 1 MHz / 8 = 125 KHz cbi(ADCSRA, ADPS2); sbi(ADCSRA, ADPS1); sbi(ADCSRA, ADPS0); #else // 128 kHz / 2 = 64 KHz -> This is the closest you can get, the prescaler is 2 cbi(ADCSRA, ADPS2); cbi(ADCSRA, ADPS1); sbi(ADCSRA, ADPS0); #endif // enable a2d conversions sbi(ADCSRA, ADEN); #endif // the bootloader connects pins 0 and 1 to the USART; disconnect them // here so they can be used as normal digital i/o; they will be // reconnected in Serial.begin() #if defined(UCSRB) UCSRB = 0; #elif defined(UCSR0B) UCSR0B = 0; #endif } ================================================ FILE: external/arduino/avr/cores/arduino/wiring_analog.c ================================================ /* wiring_analog.c - analog input and output Part of Arduino - http://www.arduino.cc/ Copyright (c) 2005-2006 David A. Mellis This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Modified 28 September 2010 by Mark Sproul */ #include "wiring_private.h" #include "pins_arduino.h" uint8_t analog_reference = DEFAULT; void analogReference(uint8_t mode) { // can't actually set the register here because the default setting // will connect AVCC and the AREF pin, which would cause a short if // there's something connected to AREF. analog_reference = mode; } int analogRead(uint8_t pin) { uint8_t low, high; #if defined(analogPinToChannel) #if defined(__AVR_ATmega32U4__) if (pin >= 18) pin -= 18; // allow for channel or pin numbers #endif pin = analogPinToChannel(pin); #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) if (pin >= 54) pin -= 54; // allow for channel or pin numbers #elif defined(__AVR_ATmega32U4__) if (pin >= 18) pin -= 18; // allow for channel or pin numbers #elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega644__) || defined(__AVR_ATmega644A__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) if (pin >= 24) pin -= 24; // allow for channel or pin numbers #else if (pin >= 14) pin -= 14; // allow for channel or pin numbers #endif #if defined(ADCSRB) && defined(MUX5) // the MUX5 bit of ADCSRB selects whether we're reading from channels // 0 to 7 (MUX5 low) or 8 to 15 (MUX5 high). ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5); #endif // set the analog reference (high two bits of ADMUX) and select the // channel (low 4 bits). this also sets ADLAR (left-adjust result) // to 0 (the default). #if defined(ADMUX) #if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) ADMUX = (analog_reference << 4) | (pin & 0x07); #else ADMUX = (analog_reference << 6) | (pin & 0x07); #endif #endif // without a delay, we seem to read from the wrong channel //delay(1); #if defined(ADCSRA) && defined(ADCL) // start the conversion sbi(ADCSRA, ADSC); // ADSC is cleared when the conversion finishes while (bit_is_set(ADCSRA, ADSC)); // we have to read ADCL first; doing so locks both ADCL // and ADCH until ADCH is read. reading ADCL second would // cause the results of each conversion to be discarded, // as ADCL and ADCH would be locked when it completed. low = ADCL; high = ADCH; #else // we dont have an ADC, return 0 low = 0; high = 0; #endif // combine the two bytes return (high << 8) | low; } // Right now, PWM output only works on the pins with // hardware support. These are defined in the appropriate // pins_*.c file. For the rest of the pins, we default // to digital output. void analogWrite(uint8_t pin, int val) { // We need to make sure the PWM output is enabled for those pins // that support it, as we turn it off when digitally reading or // writing with them. Also, make sure the pin is in output mode // for consistenty with Wiring, which doesn't require a pinMode // call for the analog output pins. pinMode(pin, OUTPUT); if (val == 0) { digitalWrite(pin, LOW); } else if (val == 255) { digitalWrite(pin, HIGH); } else { switch(digitalPinToTimer(pin)) { // XXX fix needed for atmega8 #if defined(TCCR0) && defined(COM00) && !defined(__AVR_ATmega8__) case TIMER0A: // connect pwm to pin on timer 0 sbi(TCCR0, COM00); OCR0 = val; // set pwm duty break; #endif #if defined(TCCR0A) && defined(COM0A1) case TIMER0A: // connect pwm to pin on timer 0, channel A sbi(TCCR0A, COM0A1); OCR0A = val; // set pwm duty break; #endif #if defined(TCCR0A) && defined(COM0B1) case TIMER0B: // connect pwm to pin on timer 0, channel B sbi(TCCR0A, COM0B1); OCR0B = val; // set pwm duty break; #endif #if defined(TCCR1A) && defined(COM1A1) case TIMER1A: // connect pwm to pin on timer 1, channel A sbi(TCCR1A, COM1A1); OCR1A = val; // set pwm duty break; #endif #if defined(TCCR1A) && defined(COM1B1) case TIMER1B: // connect pwm to pin on timer 1, channel B sbi(TCCR1A, COM1B1); OCR1B = val; // set pwm duty break; #endif #if defined(TCCR1A) && defined(COM1C1) case TIMER1C: // connect pwm to pin on timer 1, channel B sbi(TCCR1A, COM1C1); OCR1C = val; // set pwm duty break; #endif #if defined(TCCR2) && defined(COM21) case TIMER2: // connect pwm to pin on timer 2 sbi(TCCR2, COM21); OCR2 = val; // set pwm duty break; #endif #if defined(TCCR2A) && defined(COM2A1) case TIMER2A: // connect pwm to pin on timer 2, channel A sbi(TCCR2A, COM2A1); OCR2A = val; // set pwm duty break; #endif #if defined(TCCR2A) && defined(COM2B1) case TIMER2B: // connect pwm to pin on timer 2, channel B sbi(TCCR2A, COM2B1); OCR2B = val; // set pwm duty break; #endif #if defined(TCCR3A) && defined(COM3A1) case TIMER3A: // connect pwm to pin on timer 3, channel A sbi(TCCR3A, COM3A1); OCR3A = val; // set pwm duty break; #endif #if defined(TCCR3A) && defined(COM3B1) case TIMER3B: // connect pwm to pin on timer 3, channel B sbi(TCCR3A, COM3B1); OCR3B = val; // set pwm duty break; #endif #if defined(TCCR3A) && defined(COM3C1) case TIMER3C: // connect pwm to pin on timer 3, channel C sbi(TCCR3A, COM3C1); OCR3C = val; // set pwm duty break; #endif #if defined(TCCR4A) case TIMER4A: //connect pwm to pin on timer 4, channel A sbi(TCCR4A, COM4A1); #if defined(COM4A0) // only used on 32U4 cbi(TCCR4A, COM4A0); #endif OCR4A = val; // set pwm duty break; #endif #if defined(TCCR4A) && defined(COM4B1) case TIMER4B: // connect pwm to pin on timer 4, channel B sbi(TCCR4A, COM4B1); OCR4B = val; // set pwm duty break; #endif #if defined(TCCR4A) && defined(COM4C1) case TIMER4C: // connect pwm to pin on timer 4, channel C sbi(TCCR4A, COM4C1); OCR4C = val; // set pwm duty break; #endif #if defined(TCCR4C) && defined(COM4D1) case TIMER4D: // connect pwm to pin on timer 4, channel D sbi(TCCR4C, COM4D1); #if defined(COM4D0) // only used on 32U4 cbi(TCCR4C, COM4D0); #endif OCR4D = val; // set pwm duty break; #endif #if defined(TCCR5A) && defined(COM5A1) case TIMER5A: // connect pwm to pin on timer 5, channel A sbi(TCCR5A, COM5A1); OCR5A = val; // set pwm duty break; #endif #if defined(TCCR5A) && defined(COM5B1) case TIMER5B: // connect pwm to pin on timer 5, channel B sbi(TCCR5A, COM5B1); OCR5B = val; // set pwm duty break; #endif #if defined(TCCR5A) && defined(COM5C1) case TIMER5C: // connect pwm to pin on timer 5, channel C sbi(TCCR5A, COM5C1); OCR5C = val; // set pwm duty break; #endif case NOT_ON_TIMER: default: if (val < 128) { digitalWrite(pin, LOW); } else { digitalWrite(pin, HIGH); } } } } ================================================ FILE: external/arduino/avr/cores/arduino/wiring_digital.c ================================================ /* wiring_digital.c - digital input and output functions Part of Arduino - http://www.arduino.cc/ Copyright (c) 2005-2006 David A. Mellis This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Modified 28 September 2010 by Mark Sproul */ #define ARDUINO_MAIN #include "wiring_private.h" #include "pins_arduino.h" void pinMode(uint8_t pin, uint8_t mode) { uint8_t bit = digitalPinToBitMask(pin); uint8_t port = digitalPinToPort(pin); volatile uint8_t *reg, *out; if (port == NOT_A_PIN) return; // JWS: can I let the optimizer do this? reg = portModeRegister(port); out = portOutputRegister(port); if (mode == INPUT) { uint8_t oldSREG = SREG; cli(); *reg &= ~bit; *out &= ~bit; SREG = oldSREG; } else if (mode == INPUT_PULLUP) { uint8_t oldSREG = SREG; cli(); *reg &= ~bit; *out |= bit; SREG = oldSREG; } else { uint8_t oldSREG = SREG; cli(); *reg |= bit; SREG = oldSREG; } } // Forcing this inline keeps the callers from having to push their own stuff // on the stack. It is a good performance win and only takes 1 more byte per // user than calling. (It will take more bytes on the 168.) // // But shouldn't this be moved into pinMode? Seems silly to check and do on // each digitalread or write. // // Mark Sproul: // - Removed inline. Save 170 bytes on atmega1280 // - changed to a switch statment; added 32 bytes but much easier to read and maintain. // - Added more #ifdefs, now compiles for atmega645 // //static inline void turnOffPWM(uint8_t timer) __attribute__ ((always_inline)); //static inline void turnOffPWM(uint8_t timer) static void turnOffPWM(uint8_t timer) { switch (timer) { #if defined(TCCR1A) && defined(COM1A1) case TIMER1A: cbi(TCCR1A, COM1A1); break; #endif #if defined(TCCR1A) && defined(COM1B1) case TIMER1B: cbi(TCCR1A, COM1B1); break; #endif #if defined(TCCR1A) && defined(COM1C1) case TIMER1C: cbi(TCCR1A, COM1C1); break; #endif #if defined(TCCR2) && defined(COM21) case TIMER2: cbi(TCCR2, COM21); break; #endif #if defined(TCCR0A) && defined(COM0A1) case TIMER0A: cbi(TCCR0A, COM0A1); break; #endif #if defined(TCCR0A) && defined(COM0B1) case TIMER0B: cbi(TCCR0A, COM0B1); break; #endif #if defined(TCCR2A) && defined(COM2A1) case TIMER2A: cbi(TCCR2A, COM2A1); break; #endif #if defined(TCCR2A) && defined(COM2B1) case TIMER2B: cbi(TCCR2A, COM2B1); break; #endif #if defined(TCCR3A) && defined(COM3A1) case TIMER3A: cbi(TCCR3A, COM3A1); break; #endif #if defined(TCCR3A) && defined(COM3B1) case TIMER3B: cbi(TCCR3A, COM3B1); break; #endif #if defined(TCCR3A) && defined(COM3C1) case TIMER3C: cbi(TCCR3A, COM3C1); break; #endif #if defined(TCCR4A) && defined(COM4A1) case TIMER4A: cbi(TCCR4A, COM4A1); break; #endif #if defined(TCCR4A) && defined(COM4B1) case TIMER4B: cbi(TCCR4A, COM4B1); break; #endif #if defined(TCCR4A) && defined(COM4C1) case TIMER4C: cbi(TCCR4A, COM4C1); break; #endif #if defined(TCCR4C) && defined(COM4D1) case TIMER4D: cbi(TCCR4C, COM4D1); break; #endif #if defined(TCCR5A) case TIMER5A: cbi(TCCR5A, COM5A1); break; case TIMER5B: cbi(TCCR5A, COM5B1); break; case TIMER5C: cbi(TCCR5A, COM5C1); break; #endif } } void digitalWrite(uint8_t pin, uint8_t val) { uint8_t timer = digitalPinToTimer(pin); uint8_t bit = digitalPinToBitMask(pin); uint8_t port = digitalPinToPort(pin); volatile uint8_t *out; if (port == NOT_A_PIN) return; // If the pin that support PWM output, we need to turn it off // before doing a digital write. if (timer != NOT_ON_TIMER) turnOffPWM(timer); out = portOutputRegister(port); uint8_t oldSREG = SREG; cli(); if (val == LOW) { *out &= ~bit; } else { *out |= bit; } SREG = oldSREG; } int digitalRead(uint8_t pin) { uint8_t timer = digitalPinToTimer(pin); uint8_t bit = digitalPinToBitMask(pin); uint8_t port = digitalPinToPort(pin); if (port == NOT_A_PIN) return LOW; // If the pin that support PWM output, we need to turn it off // before getting a digital reading. if (timer != NOT_ON_TIMER) turnOffPWM(timer); if (*portInputRegister(port) & bit) return HIGH; return LOW; } ================================================ FILE: external/arduino/avr/cores/arduino/wiring_private.h ================================================ /* wiring_private.h - Internal header file. Part of Arduino - http://www.arduino.cc/ Copyright (c) 2005-2006 David A. Mellis This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef WiringPrivate_h #define WiringPrivate_h #include #include #include #include #include "Arduino.h" #ifdef __cplusplus extern "C"{ #endif #ifndef cbi #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) #endif #ifndef sbi #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) #endif uint32_t countPulseASM(volatile uint8_t *port, uint8_t bit, uint8_t stateMask, unsigned long maxloops); #define EXTERNAL_INT_0 0 #define EXTERNAL_INT_1 1 #define EXTERNAL_INT_2 2 #define EXTERNAL_INT_3 3 #define EXTERNAL_INT_4 4 #define EXTERNAL_INT_5 5 #define EXTERNAL_INT_6 6 #define EXTERNAL_INT_7 7 #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega128RFA1__) || defined(__AVR_ATmega256RFR2__) || \ defined(__AVR_AT90USB82__) || defined(__AVR_AT90USB162__) || defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega8U2__) #define EXTERNAL_NUM_INTERRUPTS 8 #elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega644__) || defined(__AVR_ATmega644A__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) #define EXTERNAL_NUM_INTERRUPTS 3 #elif defined(__AVR_ATmega32U4__) #define EXTERNAL_NUM_INTERRUPTS 5 #else #define EXTERNAL_NUM_INTERRUPTS 2 #endif typedef void (*voidFuncPtr)(void); #ifdef __cplusplus } // extern "C" #endif #endif ================================================ FILE: external/arduino/avr/cores/arduino/wiring_pulse.S ================================================ /* wiring_pulse.s - pulseInASM() function in different flavours Part of Arduino - http://www.arduino.cc/ Copyright (c) 2014 Martino Facchin This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * The following routine was generated by avr-gcc 4.8.3 with the following parameters * -gstabs -Wa,-ahlmsd=output.lst -dp -fverbose-asm -O2 * on the original C function * * unsigned long pulseInSimpl(volatile uint8_t *port, uint8_t bit, uint8_t stateMask, unsigned long maxloops) * { * unsigned long width = 0; * // wait for any previous pulse to end * while ((*port & bit) == stateMask) * if (--maxloops == 0) * return 0; * * // wait for the pulse to start * while ((*port & bit) != stateMask) * if (--maxloops == 0) * return 0; * * // wait for the pulse to stop * while ((*port & bit) == stateMask) { * if (++width == maxloops) * return 0; * } * return width; * } * * some compiler outputs were removed but the rest of the code is untouched */ #include .section .text .global countPulseASM countPulseASM: .LM0: .LFBB1: push r12 ; ; 130 pushqi1/1 [length = 1] push r13 ; ; 131 pushqi1/1 [length = 1] push r14 ; ; 132 pushqi1/1 [length = 1] push r15 ; ; 133 pushqi1/1 [length = 1] push r16 ; ; 134 pushqi1/1 [length = 1] push r17 ; ; 135 pushqi1/1 [length = 1] /* prologue: function */ /* frame size = 0 */ /* stack size = 6 */ .L__stack_usage = 6 mov r30,r24 ; port, port ; 2 *movhi/1 [length = 2] mov r31,r25 ; port, port /* unsigned long width = 0; *** // wait for any previous pulse to end *** while ((*port & bit) == stateMask) */ .LM1: rjmp .L2 ; ; 181 jump [length = 1] .L4: /* if (--maxloops == 0) */ .LM2: subi r16,1 ; maxloops, ; 17 addsi3/2 [length = 4] sbc r17, r1 ; maxloops sbc r18, r1 ; maxloops sbc r19, r1 ; maxloops breq .L13 ; , ; 19 branch [length = 1] .L2: /* if (--maxloops == 0) */ .LM3: ld r25,Z ; D.1554, *port_7(D) ; 22 movqi_insn/4 [length = 1] and r25,r22 ; D.1554, bit ; 24 andqi3/1 [length = 1] cp r25,r20 ; D.1554, stateMask ; 25 *cmpqi/2 [length = 1] breq .L4 ; , ; 26 branch [length = 1] rjmp .L6 ; ; 184 jump [length = 1] .L7: /* return 0; *** *** // wait for the pulse to start *** while ((*port & bit) != stateMask) *** if (--maxloops == 0) */ .LM4: subi r16,1 ; maxloops, ; 31 addsi3/2 [length = 4] sbc r17, r1 ; maxloops sbc r18, r1 ; maxloops sbc r19, r1 ; maxloops breq .L13 ; , ; 33 branch [length = 1] .L6: /* if (--maxloops == 0) */ .LM5: ld r25,Z ; D.1554, *port_7(D) ; 41 movqi_insn/4 [length = 1] and r25,r22 ; D.1554, bit ; 43 andqi3/1 [length = 1] cpse r25,r20 ; D.1554, stateMask ; 44 enable_interrupt-3 [length = 1] rjmp .L7 ; mov r12, r1 ; width ; 7 *movsi/2 [length = 4] mov r13, r1 ; width mov r14, r1 ; width mov r15, r1 ; width rjmp .L9 ; ; 186 jump [length = 1] .L10: /* return 0; *** *** // wait for the pulse to stop *** while ((*port & bit) == stateMask) { *** if (++width == maxloops) */ .LM6: ldi r24,-1 ; , ; 50 addsi3/3 [length = 5] sub r12,r24 ; width, sbc r13,r24 ; width, sbc r14,r24 ; width, sbc r15,r24 ; width, cp r16,r12 ; maxloops, width ; 51 *cmpsi/2 [length = 4] cpc r17,r13 ; maxloops, width cpc r18,r14 ; maxloops, width cpc r19,r15 ; maxloops, width breq .L13 ; , ; 52 branch [length = 1] .L9: /* if (++width == maxloops) */ .LM7: ld r24,Z ; D.1554, *port_7(D) ; 60 movqi_insn/4 [length = 1] and r24,r22 ; D.1554, bit ; 62 andqi3/1 [length = 1] cp r24,r20 ; D.1554, stateMask ; 63 *cmpqi/2 [length = 1] breq .L10 ; , ; 64 branch [length = 1] /* return 0; *** } *** return width; */ .LM8: mov r22,r12 ; D.1553, width ; 108 movqi_insn/1 [length = 1] mov r23,r13 ; D.1553, width ; 109 movqi_insn/1 [length = 1] mov r24,r14 ; D.1553, width ; 110 movqi_insn/1 [length = 1] mov r25,r15 ; D.1553, width ; 111 movqi_insn/1 [length = 1] /* epilogue start */ .LM9: pop r17 ; ; 171 popqi [length = 1] pop r16 ; ; 172 popqi [length = 1] pop r15 ; ; 173 popqi [length = 1] pop r14 ; ; 174 popqi [length = 1] pop r13 ; ; 175 popqi [length = 1] pop r12 ; ; 176 popqi [length = 1] ret ; 177 return_from_epilogue [length = 1] .L13: .LM10: ldi r22,0 ; D.1553 ; 120 movqi_insn/1 [length = 1] ldi r23,0 ; D.1553 ; 121 movqi_insn/1 [length = 1] ldi r24,0 ; D.1553 ; 122 movqi_insn/1 [length = 1] ldi r25,0 ; D.1553 ; 123 movqi_insn/1 [length = 1] /* epilogue start */ .LM11: pop r17 ; ; 138 popqi [length = 1] pop r16 ; ; 139 popqi [length = 1] pop r15 ; ; 140 popqi [length = 1] pop r14 ; ; 141 popqi [length = 1] pop r13 ; ; 142 popqi [length = 1] pop r12 ; ; 143 popqi [length = 1] ret ; 144 return_from_epilogue [length = 1] ================================================ FILE: external/arduino/avr/cores/arduino/wiring_pulse.c ================================================ /* wiring_pulse.c - pulseIn() function Part of Arduino - http://www.arduino.cc/ Copyright (c) 2005-2006 David A. Mellis This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "wiring_private.h" #include "pins_arduino.h" /* Measures the length (in microseconds) of a pulse on the pin; state is HIGH * or LOW, the type of pulse to measure. Works on pulses from 2-3 microseconds * to 3 minutes in length, but must be called at least a few dozen microseconds * before the start of the pulse. * * This function performs better with short pulses in noInterrupt() context */ unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout) { // cache the port and bit of the pin in order to speed up the // pulse width measuring loop and achieve finer resolution. calling // digitalRead() instead yields much coarser resolution. uint8_t bit = digitalPinToBitMask(pin); uint8_t port = digitalPinToPort(pin); uint8_t stateMask = (state ? bit : 0); // convert the timeout from microseconds to a number of times through // the initial loop; it takes approximately 16 clock cycles per iteration unsigned long maxloops = microsecondsToClockCycles(timeout)/16; unsigned long width = countPulseASM(portInputRegister(port), bit, stateMask, maxloops); // prevent clockCyclesToMicroseconds to return bogus values if countPulseASM timed out if (width) return clockCyclesToMicroseconds(width * 16 + 16); else return 0; } /* Measures the length (in microseconds) of a pulse on the pin; state is HIGH * or LOW, the type of pulse to measure. Works on pulses from 2-3 microseconds * to 3 minutes in length, but must be called at least a few dozen microseconds * before the start of the pulse. * * ATTENTION: * this function relies on micros() so cannot be used in noInterrupt() context */ unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout) { // cache the port and bit of the pin in order to speed up the // pulse width measuring loop and achieve finer resolution. calling // digitalRead() instead yields much coarser resolution. uint8_t bit = digitalPinToBitMask(pin); uint8_t port = digitalPinToPort(pin); uint8_t stateMask = (state ? bit : 0); unsigned long startMicros = micros(); // wait for any previous pulse to end while ((*portInputRegister(port) & bit) == stateMask) { if (micros() - startMicros > timeout) return 0; } // wait for the pulse to start while ((*portInputRegister(port) & bit) != stateMask) { if (micros() - startMicros > timeout) return 0; } unsigned long start = micros(); // wait for the pulse to stop while ((*portInputRegister(port) & bit) == stateMask) { if (micros() - startMicros > timeout) return 0; } return micros() - start; } ================================================ FILE: external/arduino/avr/cores/arduino/wiring_shift.c ================================================ /* wiring_shift.c - shiftOut() function Part of Arduino - http://www.arduino.cc/ Copyright (c) 2005-2006 David A. Mellis This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "wiring_private.h" uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder) { uint8_t value = 0; uint8_t i; for (i = 0; i < 8; ++i) { digitalWrite(clockPin, HIGH); if (bitOrder == LSBFIRST) value |= digitalRead(dataPin) << i; else value |= digitalRead(dataPin) << (7 - i); digitalWrite(clockPin, LOW); } return value; } void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val) { uint8_t i; for (i = 0; i < 8; i++) { if (bitOrder == LSBFIRST) { digitalWrite(dataPin, val & 1); val >>= 1; } else { digitalWrite(dataPin, (val & 128) != 0); val <<= 1; } digitalWrite(clockPin, HIGH); digitalWrite(clockPin, LOW); } } ================================================ FILE: external/arduino/avr/extras/pack.hourlybuild.bash ================================================ #!/bin/bash -ex # pack.*.bash - Bash script to help packaging avr core releases. # Copyright (c) 2015 Arduino LLC. All right reserved. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA BUILD_NUMBER=$1 CURR_TIME=`date "+%Y-%m-%d %H:%M"` CURR_TIME_SED=`date "+%Y\\-%m\\-%d %H:%M"` VERSION=9.9.9-Hourly PWD=`pwd` FOLDERNAME=`basename $PWD` THIS_SCRIPT_NAME=`basename $0` FILENAME=package_avr-hourly-b${BUILD_NUMBER}.tar.bz2 rm -f $FILENAME # Change name in platform.txt sed -i "s/name=.*/name=SAMD Hourly Build ${BUILD_NUMBER} (${CURR_TIME})/" platform.txt cd .. tar --transform "s|$FOLDERNAME|avr-hourly_b${BUILD_NUMBER}|g" --exclude=extras/** --exclude=.git* --exclude=.idea -cjf $FILENAME $FOLDERNAME cd - mv ../$FILENAME . CHKSUM=`sha256sum $FILENAME | awk '{ print $1 }'` SIZE=`wc -c $FILENAME | awk '{ print $1 }'` cat extras/package_index.json.Hourly.template | sed "s/%%BUILD_NUMBER%%/${BUILD_NUMBER}/" | sed "s/%%CURR_TIME%%/${CURR_TIME_SED}/" | sed "s/%%VERSION%%/${VERSION}/" | sed "s/%%FILENAME%%/${FILENAME}/" | sed "s/%%CHECKSUM%%/${CHKSUM}/" | sed "s/%%SIZE%%/${SIZE}/" > package_avr-hourly-build_index.json ================================================ FILE: external/arduino/avr/extras/pack.pullrequest.bash ================================================ #!/bin/bash -ex # pack.*.bash - Bash script to help packaging avr core releases. # Copyright (c) 2015 Arduino LLC. All right reserved. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA PR_NUMBER=$1 BUILD_NUMBER=$2 VERSION=`grep version= platform.txt | sed 's/version=//g'` PWD=`pwd` FOLDERNAME=`basename $PWD` THIS_SCRIPT_NAME=`basename $0` FILENAME=package_avr-b${BUILD_NUMBER}.tar.bz2 rm -f $FILENAME # Change name in platform.txt sed -i "s/name=.*/name=SAMD Pull request #${PR_NUMBER} (Build ${BUILD_NUMBER})/" platform.txt cd .. tar --transform "s|$FOLDERNAME|avr-PR${PR_NUMBER}_b${BUILD_NUMBER}|g" --exclude=extras/** --exclude=.git* --exclude=.idea -cjf $FILENAME $FOLDERNAME cd - mv ../$FILENAME . CHKSUM=`sha256sum $FILENAME | awk '{ print $1 }'` SIZE=`wc -c $FILENAME | awk '{ print $1 }'` cat extras/package_index.json.PR.template | sed s/%%PR_NUMBER%%/${PR_NUMBER}/ | sed s/%%BUILD_NUMBER%%/${BUILD_NUMBER}/ | sed s/%%VERSION%%/${VERSION}-build-${BUILD_NUMBER}/ | sed s/%%FILENAME%%/${FILENAME}/ | sed s/%%CHECKSUM%%/${CHKSUM}/ | sed s/%%SIZE%%/${SIZE}/ > package_avr-b${BUILD_NUMBER}_index.json ================================================ FILE: external/arduino/avr/extras/pack.release.bash ================================================ #!/bin/bash -ex # pack.*.bash - Bash script to help packaging avr core releases. # Copyright (c) 2015 Arduino LLC. All right reserved. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA VERSION=`grep version= platform.txt | sed 's/version=//g'` PWD=`pwd` FOLDERNAME=`basename $PWD` THIS_SCRIPT_NAME=`basename $0` rm -f avr-$VERSION.tar.bz2 cd .. tar --transform "s|$FOLDERNAME|$FOLDERNAME-$VERSION|g" --exclude=extras/** --exclude=.git* --exclude=.idea -cjf avr-$VERSION.tar.bz2 $FOLDERNAME cd - mv ../avr-$VERSION.tar.bz2 . ================================================ FILE: external/arduino/avr/extras/package_index.json.Hourly.template ================================================ { "packages": [ { "name": "arduino-beta", "maintainer": "Arduino Betatesting", "websiteURL": "http://www.arduino.cc/", "email": "packages@arduino.cc", "help": { "online": "http://www.arduino.cc/en/Reference/HomePage" }, "platforms": [ { "name": "Arduino AVR core - Hourly build", "architecture": "avr", "version": "%%VERSION%%", "category": "Arduino", "url": "http://downloads.arduino.cc/Hourly/avr/%%FILENAME%%", "archiveFileName": "%%FILENAME%%", "checksum": "SHA-256:%%CHECKSUM%%", "size": "%%SIZE%%", "boards": [ {"name": "Arduino Yún"}, {"name": "Arduino Uno"}, {"name": "Arduino Uno WiFi"}, {"name": "Arduino Diecimila"}, {"name": "Arduino Nano"}, {"name": "Arduino Mega"}, {"name": "Arduino MegaADK"}, {"name": "Arduino Leonardo"}, {"name": "Arduino Leonardo Ethernet"}, {"name": "Arduino Micro"}, {"name": "Arduino Esplora"}, {"name": "Arduino Mini"}, {"name": "Arduino Ethernet"}, {"name": "Arduino Fio"}, {"name": "Arduino BT"}, {"name": "Arduino LilyPadUSB"}, {"name": "Arduino Lilypad"}, {"name": "Arduino Pro"}, {"name": "Arduino ATMegaNG"}, {"name": "Arduino Robot Control"}, {"name": "Arduino Robot Motor"}, {"name": "Arduino Gemma"}, {"name": "Adafruit Circuit Playground"}, {"name": "Arduino Yún Mini"}, {"name": "Arduino Industrial 101"}, {"name": "Linino One"} ], "toolsDependencies": [ { "packager": "arduino", "name": "avr-gcc", "version": "4.9.2-atmel3.5.4-arduino2" }, { "packager": "arduino", "name": "avrdude", "version": "6.3.0-arduino9" }, { "packager": "arduino", "name": "arduinoOTA", "version": "1.1.1" } ] } ], "tools": [ ] } ] } ================================================ FILE: external/arduino/avr/extras/package_index.json.PR.template ================================================ { "packages": [ { "name": "arduino-beta", "maintainer": "Arduino Betatesting", "websiteURL": "http://www.arduino.cc/", "email": "packages@arduino.cc", "help": { "online": "http://www.arduino.cc/en/Reference/HomePage" }, "platforms": [ { "name": "Arduino AVR core - Pull request #%%PR_NUMBER%% (build %%BUILD_NUMBER%%)", "architecture": "avr", "version": "%%VERSION%%", "category": "Arduino", "url": "http://downloads.arduino.cc/PR/a/%%FILENAME%%", "archiveFileName": "%%FILENAME%%", "checksum": "SHA-256:%%CHECKSUM%%", "size": "%%SIZE%%", "boards": [ {"name": "Arduino Yún"}, {"name": "Arduino Uno"}, {"name": "Arduino Uno WiFi"}, {"name": "Arduino Diecimila"}, {"name": "Arduino Nano"}, {"name": "Arduino Mega"}, {"name": "Arduino MegaADK"}, {"name": "Arduino Leonardo"}, {"name": "Arduino Leonardo Ethernet"}, {"name": "Arduino Micro"}, {"name": "Arduino Esplora"}, {"name": "Arduino Mini"}, {"name": "Arduino Ethernet"}, {"name": "Arduino Fio"}, {"name": "Arduino BT"}, {"name": "Arduino LilyPadUSB"}, {"name": "Arduino Lilypad"}, {"name": "Arduino Pro"}, {"name": "Arduino ATMegaNG"}, {"name": "Arduino Robot Control"}, {"name": "Arduino Robot Motor"}, {"name": "Arduino Gemma"}, {"name": "Adafruit Circuit Playground"}, {"name": "Arduino Yún Mini"}, {"name": "Arduino Industrial 101"}, {"name": "Linino One"} ], "toolsDependencies": [ { "packager": "arduino", "name": "avr-gcc", "version": "4.9.2-atmel3.5.4-arduino2" }, { "packager": "arduino", "name": "avrdude", "version": "6.3.0-arduino9" }, { "packager": "arduino", "name": "arduinoOTA", "version": "1.1.1" } ] } ], "tools": [ ] } ] } ================================================ FILE: external/arduino/avr/firmwares/arduinoISP/readme.txt ================================================ You can download the ArduinoISP firmware source files from: https://github.com/arduino/ArduinoISP ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/Arduino-COMBINED-dfu-usbserial-atmega16u2-Mega2560-Rev3.hex ================================================ :1000000090C00000A9C00000A7C00000A5C000006B :10001000A3C00000A1C000009FC000009DC0000060 :100020009BC0000099C0000097C0000048C40000B9 :100030000CC4000091C000008FC000008DC0000003 :100040008BC0000089C0000087C0000085C0000090 :1000500083C0000081C000007FC0000002C100001A :100060007BC0000079C0000077C0000075C00000B0 :1000700073C0000071C000006FC000006DC00000C0 :100080006BC0000069C0000067C0000065C00000D0 :1000900063C0000061C000001201100102000008EE :1000A0004123420001000102DC0109023E0002017D :1000B00000C0320904000001020201000524000111 :1000C0001004240206052406000107058203080027 :1000D000FF09040100020A000000070504024000B5 :1000E00001070583024000010403090432034100B3 :1000F00072006400750069006E006F002000280027 :100100007700770077002E006100720064007500B0 :1001100069006E006F002E0063006300290000007C :10012000000011241FBECFEFD2E0DEBFCDBF11E033 :10013000A0E0B1E0ECEAFFE002C005900D92A6312C :10014000B107D9F712E0A6E1B1E001C01D92AF32CC :10015000B107E1F7F1D028C753CF9C01DC01AE57BE :10016000BF4FED91FC91119741911196FC93EE9345 :1001700080589F4FE817F90711F42D933C939FB7D0 :10018000F894F901EC57FF4F8081815080839FBF25 :10019000842F0895DF92EF92FF920F931F93FC013B :1001A0008489813019F0823021F405C040E3D42ED7 :1001B00004C0DD2402C030E2D32E8389823011F4E2 :1001C00088E0D82A8589873031F0883031F0863050 :1001D00031F482E003C084E001C086E0D82A1092A6 :1001E000C9001092C8001092CA00E784F088018903 :1001F000128980E0E81681EEF80680E0080780E0CA :10020000180719F420E130E00FC0C801B701969536 :1002100087957795679560587B47814E9F4FA801DA :100220009701A0D6215030403093CD002093CC00D0 :10023000D092CA0080E0E81681EEF80680E0080758 :1002400080E0180711F082E001C080E08093C800D0 :1002500088E98093C9001F910F91FF90EF90DF9084 :1002600008951F920F920FB60F9211242F938F9320 :100270009F93EF93FF939091CE008EB38430F1F46F :10028000E0919901F0919A019083E0919901F091A8 :100290009A01CF01019690939A018093990189590F :1002A000914021F489E191E0928381839FB7F89492 :1002B00080919D018F5F80939D019FBFFF91EF9182 :1002C0009F918F912F910F900FBE0F901F901895B7 :1002D000FC01858580FF02C05F9808955F9A0895AC :1002E00080E091E0D5C580E091E088C584B7877F44 :1002F00084BF28E10FB6F89420936000109260004C :100300000FBE87E690E09093CD008093CC0086E00E :100310008093CA001092C8002093C900539A5A9A39 :100320008AB180638AB98BB180638BB983D284E050 :1003300085BD5F9A579A08950F931F93CF93DF93CC :10034000D5DF2FB7F8948EE991E090931F02809348 :100350001E0290932102809320022FBF2FB7F894A2 :1003600089E191E090939A018093990190939C0187 :1003700080939B012FBF7894CEE9D1E003E08FB743 :10038000F894909122028FBF903809F180E091E0BB :10039000ABD497FD1CC0E0911E02F0911F02808338 :1003A000E0911E02F0911F02CF01019690931F026F :1003B00080931E028E51924011F4D283C1839FB765 :1003C000F894809122028F5F809322029FBF8FB7A3 :1003D000F89410919D018FBFA89902C0113678F151 :1003E000A89A80919D01882361F05D980093160181 :1003F00008C089E191E0B1DE682F80E091E0DAD4B5 :1004000011501123B1F780911601882351F080918A :10041000160181508093160180911601882309F4FA :100420005D9A80911701882351F0809117018150C6 :100430008093170180911701882309F45C9A8FB784 :10044000F894909122028FBF992369F08EE991E090 :1004500084DE982F8091C80085FFFCCF9093CE005A :100460005C980093170180E091E095D42AD487CF5F :10047000DA01923049F0933061F09130F9F4E8E913 :10048000F0E022E130E01EC0EAEAF0E02EE330E0E6 :1004900019C0813049F0813018F0823079F408C0F9 :1004A000E8EEF0E0849107C0ECEEF0E0849103C048 :1004B000E0E2F1E08491282F30E004C0E0E0F0E0D9 :1004C00020E030E0ED93FC93C901089528E030E08E :1004D00040E003C04F5F220F331F28173907D0F3C6 :1004E000842F8295807F08958093E9008091EB00AE :1004F00081608093EB001092ED006093EC004093DC :10050000ED008091EE00881F8827881F08951092C3 :10051000F40090E09093E9001092F0001092E8004F :100520001092ED008091EB008E7F8093EB009F5F37 :10053000953081F708958091270288238CF403C0B9 :100540008EB38823B1F08091E80082FFF9CF8091CB :10055000E8008B778093E80008958EB3882349F0F4 :100560008091E80080FFF9CF8091E8008E7780933A :10057000E800089594E68091EC0080FF05C080912A :10058000E80080FF05C023C08091E80082FD1FC005 :100590008EB3882311F482E008958EB3853011F470 :1005A00083E008958091EB0085FF02C081E008950B :1005B0008091E10082FFDFCF8091E1008B7F80930B :1005C000E100992311F484E008959150D4CF80E0A4 :1005D00008959C0140912D0250912E024617570715 :1005E00018F4F90120E038C06115710511F0AB0174 :1005F000F8CF8091E8008E778093E80040E050E0EB :10060000F0CF8091E80083FF02C081E008958091DF :10061000E80082FD2DC08EB3882381F18EB3853032 :1006200079F18091E80080FF17C09091F20006C038 :1006300081918093F100415050409F5F41155105D9 :1006400011F09830A8F320E0983009F421E080916F :10065000E8008E778093E8004115510591F622233A :1006600081F606C08EB3882349F08EB3853041F001 :100670008091E80082FFF6CF80E0089582E008953F :1006800083E008959C0140912D0250912E0246175F :10069000570710F490E03BC06115710511F0AB01F4 :1006A000F9CF8091E8008E778093E80040E050E039 :1006B000F1CF8091E80083FF02C081E0089580912E :1006C000E80082FD30C08EB3882399F18EB3853067 :1006D00091F18091E80080FF1AC08091F20009C07A :1006E000F9012F5F3F4FE491E093F10041505040FA :1006F0008F5F4115510511F0883090F390E08830FC :1007000009F491E08091E8008E778093E80041152C :10071000510579F6992369F606C08EB3882349F00E :100720008EB3853041F08091E80082FFF6CF80E003 :10073000089582E0089583E008959C016115710594 :1007400029F48091E8008B778093E800F90120C0BC :100750008091E80083FF02C081E008958EB3882372 :1007600039F18EB3853031F18091E80082FFF0CF0E :1007700006C08091F10081936150704021F080911A :10078000F2008823B1F78091E8008B778093E8002E :1007900061157105E9F606C08EB3882349F08EB362 :1007A000853041F08091E80080FFF6CF80E0089529 :1007B00082E0089583E0089542D044D01EBA10929A :1007C0002502109224021092230284E089BD89B58B :1007D000826089BD09B400FEFDCF8091D800982FBA :1007E0009F779093D80080688093D80080916300B1 :1007F0008E7F809363008091D8008F7D8093D80096 :100800008091E0008E7F8093E0008091E1008E7FF8 :100810008093E1008091E20081608093E20080910A :10082000E100877F8093E1008091E20088608093FF :10083000E2000895C1DF81E08093260208951092BE :10084000E20008951092E10008951F920F920FB6F2 :100850000F9211241F932F933F934F935F936F93A6 :100860007F938F939F93AF93BF93EF93FF93E9EEA3 :10087000F0E0108117701082E0EFF0E08081877F58 :1008800080837894C3D0F894A9EEB0E01C92E0EF96 :10089000F0E08081886080831C93FF91EF91BF918D :1008A000AF919F918F917F916F915F914F913F9108 :1008B0002F911F910F900FBE0F901F9018951F92B0 :1008C0000F920FB60F9211242F933F934F935F9384 :1008D0006F937F938F939F93AF93BF93EF93FF9308 :1008E0008091E10080FF1BC08091E20080FF17C073 :1008F0008091E1008E7F8093E1008091E2008E7F05 :100900008093E2008091E20080618093E200809118 :10091000D80080628093D80019BC1EBAD1D18091D2 :10092000E10084FF29C08091E20084FF25C084E0BB :1009300089BD89B5826089BD09B400FEFDCF809173 :10094000D8008F7D8093D8008091E1008F7E8093C6 :10095000E1008091E2008F7E8093E2008091E200CE :1009600081608093E20080912502882311F481E068 :1009700001C084E08EBBA4D18091E10083FF27C039 :100980008091E20083FF23C08091E100877F809304 :10099000E10082E08EBB109225028091E1008E7F03 :1009A0008093E1008091E2008E7F8093E20080914D :1009B000E20080618093E200AADD80E060E042E036 :1009C00093DD8091F00088608093F00079D1809170 :1009D000E10082FF0AC08091E20082FF06C08091A0 :1009E000E1008B7F8093E1006BD1FF91EF91BF918C :1009F000AF919F918F917F916F915F914F913F91B7 :100A00002F910F900FBE0F901F9018951F93DF939B :100A1000CF93CDB7DEB7AC970FB6F894DEBF0FBE5D :100A2000CDBFE7E2F2E08091F100819322E0EF3266 :100A3000F207C9F78091270230912802353009F476 :100A400087C0363040F43130C9F1313070F0333086 :100A500009F01DC133C0383009F4EFC0393009F452 :100A6000FEC0363009F013C192C0803821F08238C0 :100A700009F00DC108C090912302809124028823BF :100A800099F0926011C080912B0287708093E900E9 :100A90008091EB0090E025E0969587952A95E1F707 :100AA000982F91701092E9008091E800877F8093E1 :100AB000E8009093F1001092F100CAC0882319F069 :100AC000823009F0E4C090E08F719070009721F0BF :100AD000029709F0DDC00CC080912902813009F035 :100AE000D7C010922402333069F5809324022AC0C3 :100AF00080912902882331F520912B02277009F477 :100B0000C7C02093E9008091EB0080FFC1C0333063 :100B100021F48091EB00806213C08091EB00806132 :100B20008093EB0081E090E002C0880F991F2A9526 :100B3000E2F78093EA001092EA008091EB0088606F :100B40008093EB001092E9008091E800877F83C0DA :100B5000882309F09CC0109129028091E800877FCA :100B60008093E800E8DC04C08EB3882309F490C0C9 :100B70008091E80080FFF8CF812F8F7711F492E009 :100B800001C093E09EBB80688093E30081C08058E1 :100B9000823008F07CC08091290290912A0223E0E3 :100BA0008C3D920799F55FB7F894DE0115964EE0FB :100BB00020E030E061E2E42FF0E0609357008491A0 :100BC00020FF03C082958F704F5F982F9F70892FF1 :100BD000805D8A3308F0895F8C9311961C9211977F :100BE0002F5F3F4F12962431310529F75FBF8AE20C :100BF0008B8383E08C838091E800877F8093E8007B :100C0000CE0103966AE270E0E4DC11C060912B0231 :100C1000AE014F5F5F4F2CDCBC010097C9F18091A2 :100C2000E800877F8093E80089819A812BDD80919D :100C3000E8008B778093E8002BC0803841F58091E5 :100C4000E800877F8093E800809125028093F1007F :100C50008091E8008E778093E8006DDC19C08823CE :100C6000B1F490912902923098F48091E800877F46 :100C70008093E800909325025EDC80912502882312 :100C800011F483E001C084E08EBB2DDB01C028DBC2 :100C90008091E80083FF0AC08091EB00806280931E :100CA000EB008091E800877F8093E800AC960FB658 :100CB000F894DEBF0FBECDBFCF91DF911F91089595 :100CC00008951F938EB3882361F01091E90010926C :100CD000E9008091E80083FF01C098DE177010934F :100CE000E9001F9108950895FC018EB3843021F529 :100CF00087859089A189B2890097A105B105E1F0A6 :100D000085818093E9008091E80082FF15C0809181 :100D1000F200882319F42FEF3FEF04C08091F10017 :100D2000282F30E08091F200882341F48091E80080 :100D30008B778093E80002C02FEF3FEFC901089541 :100D4000FC018EB3843011F587859089A189B28921 :100D50000097A105B105D1F081818093E9008091D0 :100D6000F2008823A9F09091E8008091E8008E7746 :100D70008093E80095FD0CC0FDDB982F882349F493 :100D80008091E8008E778093E80003C092E001C074 :100D900090E0892F0895FC018EB3843051F487854B :100DA0009089A189B2890097A105B10511F0CF0101 :100DB000C7CF08951F93FC01162F8EB38430D9F44A :100DC00087859089A189B2890097A105B10599F01D :100DD00081818093E9008091E80085FD08C08091C1 :100DE000E8008E778093E800C5DB882329F4109310 :100DF000F10080E001C082E01F9108950F931F93DE :100E0000CF93DF93EC010D96FC0189E0DF011D9289 :100E10008A95E9F72A813B8109818C81882311F425 :100E200010E001C014E0C90151DB182B1260802FC3 :100E300061E8412F59DB882329F12E813F810D8103 :100E40008885882311F410E001C014E0C9013EDB5D :100E5000182B1260802F60E8412F46DB882391F029 :100E60002A853B8509858C85882311F410E001C013 :100E700014E0C9012BDB182B1260802F61EC412F8D :100E800033DB01C080E0DF91CF911F910F91089576 :100E9000CF93DF93EC018091E80083FF60C08881ED :100EA00090E020912B0230912C022817390709F08D :100EB00056C080912802813261F0823220F4803263 :100EC00009F04DC019C0823269F1833209F047C080 :100ED00038C080912702813A09F041C08091E80032 :100EE000877F8093E800CE010F9667E070E071DBAA :100EF0008091E8008B7713C080912702813279F5C9 :100F00008091E800877F8093E800CE010F9667E02C :100F100070E013DCCE013ED98091E8008E7780939B :100F2000E8001DC0809127028132C9F48091E80059 :100F3000877F8093E800809129028D87CE01C8D9F0 :100F40000DC080912702813251F48091E800877FA3 :100F50008093E800CE0160912902C5DEECDADF91D2 :100F6000CF910895A1E21A2EAA1BBB1BFD010DC053 :100F7000AA1FBB1FEE1FFF1FA217B307E407F50749 :100F800020F0A21BB30BE40BF50B661F771F881F25 :100F9000991F1A9469F760957095809590959B01BB :0C0FA000AC01BD01CF010895F894FFCF13 :100FAC0000034000000440000002080000000000A4 :060FBC000000000000002F :103000004BC0000064C0000062C0000060C000004F :103010005EC000005CC000005AC0000058C0000044 :1030200056C0000054C0000052C00000EEC40000B2 :103030004EC000004CC000004AC0000048C0000064 :1030400046C0000044C0000042C0000040C0000074 :103050003EC000003CC000003AC0000038C0000084 :1030600036C0000034C0000032C0000030C0000094 :103070002EC000002CC000002AC0000028C00000A4 :1030800026C0000024C0000022C0000020C00000B4 :103090001EC000001CC0000011241FBECFEFD2E0F4 :1030A000DEBFCDBF11E0A0E0B1E0EAEFFCE302C07B :1030B00005900D92AA33B107D9F711E0AAE3B1E068 :1030C00001C01D92AB35B107E1F772D314C698CF9A :1030D000982F15C08091F200882371F48091E80048 :1030E0008B7F8093E80003C08EB3882351F08091DA :1030F000E80082FFF9CF02C08091F100915099233E :1031000049F7089520914A01309149018091480181 :103110009091470180933F0190934001C9018093B2 :103120004101909342010895DF93CF9300D000D0E6 :1031300000D0CDB7DEB780914501843009F45AC084 :10314000853030F4813059F0833009F0D7C01FC08A :10315000853009F4A0C0863009F0D0C0C3C080918A :103160004601823008F0CAC0CDDF80914601882335 :1031700061F480913F019091400123E0FC01209394 :103180005700E89507B600FCFDCF85E008C08091A8 :103190004601882311F0823029F4B4DF89E080935E :1031A0000101ACC0813009F0A9C020E030E040E06E :1031B00050E0F90184918F3F81F0CA01AA27BB2713 :1031C00080933E013093400120933F018AE0809339 :1031D000010185E080933B0191C02F5F3F4F4F4F2E :1031E0005F4F2030F0E33F07F0E04F07F0E05F076C :1031F00001F784C080914601833051F581E08093CE :103200003A0180914B0190914C01892B71F0809192 :103210004701813009F072C080914A0190914901C3 :1032200090933D0180933C0169C0809147018823C0 :1032300061F42CE088E190E00FB6F894A8958093B3 :1032400060000FBE2093600059C01092000156C06C :10325000882309F053C0809147018F3F09F04EC089 :10326000E0E0F0E093E085E090935700E89507B642 :1032700000FCFDCF80935700E89507B600FCFDCF1A :10328000E058FF4F20E3E030F20771F781E18093CF :103290005700E89533C0DE011196E5E0F1E083E0E8 :1032A00001900D928150E1F7DE011496E2E0F1E029 :1032B00083E001900D928150E1F790914701809158 :1032C0004601882329F4FE01E90FF11D818107C021 :1032D0008130A1F4FE01BC97E90FF11D808180933C :1032E00050010CC080914601833041F48091470128 :1032F000882321F48091480180933E0126960FB6E1 :10330000F894DEBF0FBECDBFCF91DF9108952F920D :103310003F924F925F926F927F929F92AF92BF9235 :10332000CF92DF92EF92FF920F931F93CF93DF9391 :103330008091590190915A0190934C0180934B01D7 :1033400080914D01882351F080914D0181508093EF :103350004D0180914D01882309F45D9A80914E01C1 :10336000882351F080914E01815080934E018091CD :103370004E01882309F45C9A80915401833009F44A :10338000B2C1843030F4813071F0823009F0E3C191 :1033900011C1853009F4C5C1853008F4BAC1863041 :1033A00009F0D9C1CDC15C9883E080934E01809132 :1033B000E800877F8093E80080913A01882329F014 :1033C000B3DE5D9A5C9A10923A0120914B013091E4 :1033D0004C012115310529F42AC08EB3882309F444 :1033E000BAC18091E80082FFF8CF8091F10080930C :1033F00045012150304030934C0120934B01E6E4CD :10340000F1E00CC08091F10081932150304081E0C7 :10341000EB34F80719F43183208308C08091F2005F :10342000882381F730934C0120934B017DDE8091FE :103430000101853009F0BAC080914B0190914C0197 :10344000892B21F482E080930101B0C08AE140DE43 :1034500080913F018F713CDEC0914101D0914201CA :1034600020913F013091400121968E01021B130BE8 :10347000219780914601882309F093C01801369462 :103480002794C901A0913E01B0E09C01AD0162E02A :10349000E62EF12C012D112DE20EF31E041F151F37 :1034A00059016A0190E099249394B5E0A3E048C0E3 :1034B0008091F200882371F48091E8008B7F8093E3 :1034C000E80004C08EB3882309F445C18091E80068 :1034D00082FFF8CF0894210831088091F100682F0D :1034E0008091F100782FF5010B0190925700E8953B :1034F00011249F5F903419F021143104A1F4F901D3 :10350000B0935700E89507B600FCFDCF21143104B5 :1035100051F0F701A0935700E89507B600FCFDCFE6 :10352000A801970190E042E0442E512C612C712CAF :10353000E40CF51C061D171DA40CB51CC61CD71CDD :103540002114310409F0B4CFD0934001C0933F015E :1035500081E180935700E89527C08091F20088238D :1035600071F48091E8008B7F8093E80004C08EB3F3 :10357000882309F4F0C08091E80082FFF8CF6091C1 :10358000F10080913F0190914001A7D380913F01CC :103590009091400101969093400180933F0101502A :1035A000104001151105C9F680E192DD8091E80017 :1035B0008B7FC3C08091E800877F8093E8005D988F :1035C00083E080934D0104C08EB3882309F4C3C007 :1035D0008091E80080FFF8CF80910101893091F05F :1035E0008A3069F480914601813049F480913F012D :1035F000909140018093F1009093F1009BC08091E5 :10360000500196C0609141017091420120913F01AB :10361000309140016F5F7F4F7B01E21AF30A6150E6 :10362000704080914601882389F58701169507959A :10363000C901A0913E01B0E09C01AD011FC0809185 :10364000F200803271F48091E8008E7F8093E80070 :1036500004C08EB3882309F47EC08091E80080FF07 :10366000F8CFF901859194918093F1009093F10046 :10367000015010402E5F3F4F4F4F5F4F0115110516 :10368000F1F67093400160933F0129C0823039F513 :1036900023C08091F200803271F48091E8008E7F27 :1036A0008093E80004C08EB3882309F454C080914D :1036B000E80080FFF8CF00913F0110914001C80160 :1036C00004D38093F1000F5F1F4F109340010093CC :1036D0003F010894E108F108E114F104D1F682E019 :1036E0008093010127C08091E800877F8093E800E4 :1036F00080913B018093F1001092F1001092F10053 :103700001092F100809101018093F1001092F1007C :1037100011C08091E800877F8093E80010923B0100 :1037200019C08091E800877F8093E80080910101B3 :103730008093F1008091E8008E7F8093E8000AC0BA :103740008091E800877F8093E8005D9A5C9A82E030 :103750008093010187D0DF91CF911F910F91FF904E :10376000EF90DF90CF90BF90AF909F907F906F9041 :103770005F904F903F902F9008952BD181E085BFAF :1037800015BE089584B7877F84BF88E10FB6F8948B :1037900080936000109260000FBE81E085BF82E0E0 :1037A00085BF8AB180638AB98BB180638BB90CC144 :1037B000E9DF789401C080D2809100018823D9F795 :1037C00080913A018823B9F7D8DFE0913C01F0916C :1037D0003D010995FA01923071F0933089F09130F2 :1037E00029F488E091E022E130E019C080E090E027 :1037F00020E030E014C08AE191E02BE130E00FC01E :10380000882339F480913501282F30E085E391E059 :1038100006C080914301282F30E083E491E091833A :103820008083C90108958091EB0081608093EB0053 :103830001092ED006093EC004093ED008091EE005B :10384000881F8827881F08951092F4001092F000B6 :103850001092E8001092ED00EBEEF0E080818E7F98 :10386000808308958091530188238CF403C08EB324 :103870008823B1F08091E80082FFF9CF8091E800C1 :103880008B7F8093E80008958EB3882349F0809160 :10389000E80080FFF9CF8091E8008E7F8093E800F8 :1038A00008959C014091590150915A0146175707BC :1038B00018F4F90120E038C06115710511F0AB0171 :1038C000F8CF8091E8008E7F8093E80040E050E0E0 :1038D000F0CF8091E80083FF02C081E008958091DD :1038E000E80082FD2DC08EB3882381F18EB3853030 :1038F00079F18091E80080FF17C09091F20006C036 :1039000081918093F100415050409F5F41155105D6 :1039100011F09032A8F320E0903209F421E0809178 :10392000E8008E7F8093E8004115510591F622232F :1039300081F606C08EB3882349F08EB3853041F0FE :103940008091E80082FFF6CF80E0089582E008953C :1039500083E0089554D056D01EBA1092510184E0ED :1039600089BD89B5826089BD09B400FEFDCF809113 :10397000D800982F9F779093D80080688093D800C4 :10398000809163008E7F809363008091D8008F7D4B :103990008093D8008091E0008E7F8093E00080913A :1039A000E1008E7F8093E1008091E200816080934E :1039B000E2008091E100877F8093E1008091E20046 :1039C00088608093E2000895C5DF81E08093520112 :1039D0000895C0DFE0EEF0E0808181608083E8ED53 :1039E000F0E080818F7780830AD00CD019BCE3E6A9 :1039F000F0E08081816080831092520108951092DE :103A0000E20008951092E10008951F920F920FB600 :103A10000F9211242F933F934F935F936F937F9354 :103A20008F939F93AF93BF93EF93FF938091E100A8 :103A300080FF1BC08091E20080FF17C08091E100F1 :103A40008E7F8093E1008091E2008E7F8093E20080 :103A50008091E20080618093E2008091D8008062D2 :103A60008093D80019BC1EBA26D18091E10084FF52 :103A700029C08091E20084FF25C084E089BD89B51A :103A8000826089BD09B400FEFDCF8091D8008F7D92 :103A90008093D8008091E1008F7E8093E100809137 :103AA000E2008F7E8093E2008091E200816080934B :103AB000E20080915101882311F481E001C084E08B :103AC0008EBBF9D08091E10083FF22C08091E2009B :103AD00083FF1EC08091E100877F8093E10082E038 :103AE0008EBB109251018091E1008E7F8093E100A6 :103AF0008091E2008E7F8093E2008091E2008061FD :103B00008093E200A1DE80E060E042E28CDED3D070 :103B10008091E10082FF0AC08091E20082FF06C02E :103B20008091E1008B7F8093E100C5D0FF91EF9100 :103B3000BF91AF919F918F917F916F915F914F91C5 :103B40003F912F910F900FBE0F901F9018951F93CC :103B5000DF93CF9300D0CDB7DEB7E3E5F1E08091FE :103B6000F100819381E0EB35F807C9F7909153019B :103B700080915401853011F1863040F48130B9F0E4 :103B8000813070F0833009F081C011C0883009F4B1 :103B900053C0893009F462C0863009F077C02DC067 :103BA000903809F474C0923809F070C070C099233D :103BB00009F46DC0923009F069C069C0992309F019 :103BC00065C0109155018091E800877F8093E800DF :103BD00049DE04C08EB3882309F459C08091E800FF :103BE00080FFF8CF812F8F7711F492E001C093E02E :103BF0009EBB80688093E3004AC09058923008F0E2 :103C000045C0809155019091560160915701AE01D8 :103C10004F5F5F4FDFDDBC010097C9F18091E80085 :103C2000877F8093E80089819A813BDE8091E8005C :103C30008B7F8093E8002BC0903841F58091E8009D :103C4000877F8093E800809151018093F1008091FB :103C5000E8008E7F8093E80005DE19C09923B1F457 :103C600090915501923098F48091E800877F80937D :103C7000E80090935101F6DD80915101882311F401 :103C800083E001C084E08EBB16D001C040DB809190 :103C9000E80083FF0AC08091EB0080628093EB0014 :103CA0008091E800877F8093E8000F900F90CF917C :103CB000DF911F91089508958EB3882329F0809194 :103CC000E80083FF01C043CF0895F999FECF92BD6C :103CD00081BDF89A992780B50895262FF999FECFCE :103CE0001FBA92BD81BD20BD0FB6F894FA9AF99A19 :0A3CF0000FBE01960895F894FFCF6F :103CFA0001021E948920DCFB120110010000002041 :103D0A00EB03EF2F00000001000109021B00010173 :103D1A000080320904000000FE01020009210300AC :0A3D2A0000000C000104030904006E :0400000300003000C9 :00000001FF ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/Arduino-COMBINED-dfu-usbserial-atmega16u2-MegaADK-Rev3.hex ================================================ :1000000090C00000A9C00000A7C00000A5C000006B :10001000A3C00000A1C000009FC000009DC0000060 :100020009BC0000099C0000097C0000048C40000B9 :100030000CC4000091C000008FC000008DC0000003 :100040008BC0000089C0000087C0000085C0000090 :1000500083C0000081C000007FC0000002C100001A :100060007BC0000079C0000077C0000075C00000B0 :1000700073C0000071C000006FC000006DC00000C0 :100080006BC0000069C0000067C0000065C00000D0 :1000900063C0000061C000001201100102000008EE :1000A0004123440001000102DC0109023E0002017B :1000B00000C0320904000001020201000524000111 :1000C0001004240206052406000107058203080027 :1000D000FF09040100020A000000070504024000B5 :1000E00001070583024000010403090432034100B3 :1000F00072006400750069006E006F002000280027 :100100007700770077002E006100720064007500B0 :1001100069006E006F002E0063006300290000007C :10012000000011241FBECFEFD2E0DEBFCDBF11E033 :10013000A0E0B1E0ECEAFFE002C005900D92A6312C :10014000B107D9F712E0A6E1B1E001C01D92AF32CC :10015000B107E1F7F1D028C753CF9C01DC01AE57BE :10016000BF4FED91FC91119741911196FC93EE9345 :1001700080589F4FE817F90711F42D933C939FB7D0 :10018000F894F901EC57FF4F8081815080839FBF25 :10019000842F0895DF92EF92FF920F931F93FC013B :1001A0008489813019F0823021F405C040E3D42ED7 :1001B00004C0DD2402C030E2D32E8389823011F4E2 :1001C00088E0D82A8589873031F0883031F0863050 :1001D00031F482E003C084E001C086E0D82A1092A6 :1001E000C9001092C8001092CA00E784F088018903 :1001F000128980E0E81681EEF80680E0080780E0CA :10020000180719F420E130E00FC0C801B701969536 :1002100087957795679560587B47814E9F4FA801DA :100220009701A0D6215030403093CD002093CC00D0 :10023000D092CA0080E0E81681EEF80680E0080758 :1002400080E0180711F082E001C080E08093C800D0 :1002500088E98093C9001F910F91FF90EF90DF9084 :1002600008951F920F920FB60F9211242F938F9320 :100270009F93EF93FF939091CE008EB38430F1F46F :10028000E0919901F0919A019083E0919901F091A8 :100290009A01CF01019690939A018093990189590F :1002A000914021F489E191E0928381839FB7F89492 :1002B00080919D018F5F80939D019FBFFF91EF9182 :1002C0009F918F912F910F900FBE0F901F901895B7 :1002D000FC01858580FF02C05F9808955F9A0895AC :1002E00080E091E0D5C580E091E088C584B7877F44 :1002F00084BF28E10FB6F89420936000109260004C :100300000FBE87E690E09093CD008093CC0086E00E :100310008093CA001092C8002093C900539A5A9A39 :100320008AB180638AB98BB180638BB983D284E050 :1003300085BD5F9A579A08950F931F93CF93DF93CC :10034000D5DF2FB7F8948EE991E090931F02809348 :100350001E0290932102809320022FBF2FB7F894A2 :1003600089E191E090939A018093990190939C0187 :1003700080939B012FBF7894CEE9D1E003E08FB743 :10038000F894909122028FBF903809F180E091E0BB :10039000ABD497FD1CC0E0911E02F0911F02808338 :1003A000E0911E02F0911F02CF01019690931F026F :1003B00080931E028E51924011F4D283C1839FB765 :1003C000F894809122028F5F809322029FBF8FB7A3 :1003D000F89410919D018FBFA89902C0113678F151 :1003E000A89A80919D01882361F05D980093160181 :1003F00008C089E191E0B1DE682F80E091E0DAD4B5 :1004000011501123B1F780911601882351F080918A :10041000160181508093160180911601882309F4FA :100420005D9A80911701882351F0809117018150C6 :100430008093170180911701882309F45C9A8FB784 :10044000F894909122028FBF992369F08EE991E090 :1004500084DE982F8091C80085FFFCCF9093CE005A :100460005C980093170180E091E095D42AD487CF5F :10047000DA01923049F0933061F09130F9F4E8E913 :10048000F0E022E130E01EC0EAEAF0E02EE330E0E6 :1004900019C0813049F0813018F0823079F408C0F9 :1004A000E8EEF0E0849107C0ECEEF0E0849103C048 :1004B000E0E2F1E08491282F30E004C0E0E0F0E0D9 :1004C00020E030E0ED93FC93C901089528E030E08E :1004D00040E003C04F5F220F331F28173907D0F3C6 :1004E000842F8295807F08958093E9008091EB00AE :1004F00081608093EB001092ED006093EC004093DC :10050000ED008091EE00881F8827881F08951092C3 :10051000F40090E09093E9001092F0001092E8004F :100520001092ED008091EB008E7F8093EB009F5F37 :10053000953081F708958091270288238CF403C0B9 :100540008EB38823B1F08091E80082FFF9CF8091CB :10055000E8008B778093E80008958EB3882349F0F4 :100560008091E80080FFF9CF8091E8008E7780933A :10057000E800089594E68091EC0080FF05C080912A :10058000E80080FF05C023C08091E80082FD1FC005 :100590008EB3882311F482E008958EB3853011F470 :1005A00083E008958091EB0085FF02C081E008950B :1005B0008091E10082FFDFCF8091E1008B7F80930B :1005C000E100992311F484E008959150D4CF80E0A4 :1005D00008959C0140912D0250912E024617570715 :1005E00018F4F90120E038C06115710511F0AB0174 :1005F000F8CF8091E8008E778093E80040E050E0EB :10060000F0CF8091E80083FF02C081E008958091DF :10061000E80082FD2DC08EB3882381F18EB3853032 :1006200079F18091E80080FF17C09091F20006C038 :1006300081918093F100415050409F5F41155105D9 :1006400011F09830A8F320E0983009F421E080916F :10065000E8008E778093E8004115510591F622233A :1006600081F606C08EB3882349F08EB3853041F001 :100670008091E80082FFF6CF80E0089582E008953F :1006800083E008959C0140912D0250912E0246175F :10069000570710F490E03BC06115710511F0AB01F4 :1006A000F9CF8091E8008E778093E80040E050E039 :1006B000F1CF8091E80083FF02C081E0089580912E :1006C000E80082FD30C08EB3882399F18EB3853067 :1006D00091F18091E80080FF1AC08091F20009C07A :1006E000F9012F5F3F4FE491E093F10041505040FA :1006F0008F5F4115510511F0883090F390E08830FC :1007000009F491E08091E8008E778093E80041152C :10071000510579F6992369F606C08EB3882349F00E :100720008EB3853041F08091E80082FFF6CF80E003 :10073000089582E0089583E008959C016115710594 :1007400029F48091E8008B778093E800F90120C0BC :100750008091E80083FF02C081E008958EB3882372 :1007600039F18EB3853031F18091E80082FFF0CF0E :1007700006C08091F10081936150704021F080911A :10078000F2008823B1F78091E8008B778093E8002E :1007900061157105E9F606C08EB3882349F08EB362 :1007A000853041F08091E80080FFF6CF80E0089529 :1007B00082E0089583E0089542D044D01EBA10929A :1007C0002502109224021092230284E089BD89B58B :1007D000826089BD09B400FEFDCF8091D800982FBA :1007E0009F779093D80080688093D80080916300B1 :1007F0008E7F809363008091D8008F7D8093D80096 :100800008091E0008E7F8093E0008091E1008E7FF8 :100810008093E1008091E20081608093E20080910A :10082000E100877F8093E1008091E20088608093FF :10083000E2000895C1DF81E08093260208951092BE :10084000E20008951092E10008951F920F920FB6F2 :100850000F9211241F932F933F934F935F936F93A6 :100860007F938F939F93AF93BF93EF93FF93E9EEA3 :10087000F0E0108117701082E0EFF0E08081877F58 :1008800080837894C3D0F894A9EEB0E01C92E0EF96 :10089000F0E08081886080831C93FF91EF91BF918D :1008A000AF919F918F917F916F915F914F913F9108 :1008B0002F911F910F900FBE0F901F9018951F92B0 :1008C0000F920FB60F9211242F933F934F935F9384 :1008D0006F937F938F939F93AF93BF93EF93FF9308 :1008E0008091E10080FF1BC08091E20080FF17C073 :1008F0008091E1008E7F8093E1008091E2008E7F05 :100900008093E2008091E20080618093E200809118 :10091000D80080628093D80019BC1EBAD1D18091D2 :10092000E10084FF29C08091E20084FF25C084E0BB :1009300089BD89B5826089BD09B400FEFDCF809173 :10094000D8008F7D8093D8008091E1008F7E8093C6 :10095000E1008091E2008F7E8093E2008091E200CE :1009600081608093E20080912502882311F481E068 :1009700001C084E08EBBA4D18091E10083FF27C039 :100980008091E20083FF23C08091E100877F809304 :10099000E10082E08EBB109225028091E1008E7F03 :1009A0008093E1008091E2008E7F8093E20080914D :1009B000E20080618093E200AADD80E060E042E036 :1009C00093DD8091F00088608093F00079D1809170 :1009D000E10082FF0AC08091E20082FF06C08091A0 :1009E000E1008B7F8093E1006BD1FF91EF91BF918C :1009F000AF919F918F917F916F915F914F913F91B7 :100A00002F910F900FBE0F901F9018951F93DF939B :100A1000CF93CDB7DEB7AC970FB6F894DEBF0FBE5D :100A2000CDBFE7E2F2E08091F100819322E0EF3266 :100A3000F207C9F78091270230912802353009F476 :100A400087C0363040F43130C9F1313070F0333086 :100A500009F01DC133C0383009F4EFC0393009F452 :100A6000FEC0363009F013C192C0803821F08238C0 :100A700009F00DC108C090912302809124028823BF :100A800099F0926011C080912B0287708093E900E9 :100A90008091EB0090E025E0969587952A95E1F707 :100AA000982F91701092E9008091E800877F8093E1 :100AB000E8009093F1001092F100CAC0882319F069 :100AC000823009F0E4C090E08F719070009721F0BF :100AD000029709F0DDC00CC080912902813009F035 :100AE000D7C010922402333069F5809324022AC0C3 :100AF00080912902882331F520912B02277009F477 :100B0000C7C02093E9008091EB0080FFC1C0333063 :100B100021F48091EB00806213C08091EB00806132 :100B20008093EB0081E090E002C0880F991F2A9526 :100B3000E2F78093EA001092EA008091EB0088606F :100B40008093EB001092E9008091E800877F83C0DA :100B5000882309F09CC0109129028091E800877FCA :100B60008093E800E8DC04C08EB3882309F490C0C9 :100B70008091E80080FFF8CF812F8F7711F492E009 :100B800001C093E09EBB80688093E30081C08058E1 :100B9000823008F07CC08091290290912A0223E0E3 :100BA0008C3D920799F55FB7F894DE0115964EE0FB :100BB00020E030E061E2E42FF0E0609357008491A0 :100BC00020FF03C082958F704F5F982F9F70892FF1 :100BD000805D8A3308F0895F8C9311961C9211977F :100BE0002F5F3F4F12962431310529F75FBF8AE20C :100BF0008B8383E08C838091E800877F8093E8007B :100C0000CE0103966AE270E0E4DC11C060912B0231 :100C1000AE014F5F5F4F2CDCBC010097C9F18091A2 :100C2000E800877F8093E80089819A812BDD80919D :100C3000E8008B778093E8002BC0803841F58091E5 :100C4000E800877F8093E800809125028093F1007F :100C50008091E8008E778093E8006DDC19C08823CE :100C6000B1F490912902923098F48091E800877F46 :100C70008093E800909325025EDC80912502882312 :100C800011F483E001C084E08EBB2DDB01C028DBC2 :100C90008091E80083FF0AC08091EB00806280931E :100CA000EB008091E800877F8093E800AC960FB658 :100CB000F894DEBF0FBECDBFCF91DF911F91089595 :100CC00008951F938EB3882361F01091E90010926C :100CD000E9008091E80083FF01C098DE177010934F :100CE000E9001F9108950895FC018EB3843021F529 :100CF00087859089A189B2890097A105B105E1F0A6 :100D000085818093E9008091E80082FF15C0809181 :100D1000F200882319F42FEF3FEF04C08091F10017 :100D2000282F30E08091F200882341F48091E80080 :100D30008B778093E80002C02FEF3FEFC901089541 :100D4000FC018EB3843011F587859089A189B28921 :100D50000097A105B105D1F081818093E9008091D0 :100D6000F2008823A9F09091E8008091E8008E7746 :100D70008093E80095FD0CC0FDDB982F882349F493 :100D80008091E8008E778093E80003C092E001C074 :100D900090E0892F0895FC018EB3843051F487854B :100DA0009089A189B2890097A105B10511F0CF0101 :100DB000C7CF08951F93FC01162F8EB38430D9F44A :100DC00087859089A189B2890097A105B10599F01D :100DD00081818093E9008091E80085FD08C08091C1 :100DE000E8008E778093E800C5DB882329F4109310 :100DF000F10080E001C082E01F9108950F931F93DE :100E0000CF93DF93EC010D96FC0189E0DF011D9289 :100E10008A95E9F72A813B8109818C81882311F425 :100E200010E001C014E0C90151DB182B1260802FC3 :100E300061E8412F59DB882329F12E813F810D8103 :100E40008885882311F410E001C014E0C9013EDB5D :100E5000182B1260802F60E8412F46DB882391F029 :100E60002A853B8509858C85882311F410E001C013 :100E700014E0C9012BDB182B1260802F61EC412F8D :100E800033DB01C080E0DF91CF911F910F91089576 :100E9000CF93DF93EC018091E80083FF60C08881ED :100EA00090E020912B0230912C022817390709F08D :100EB00056C080912802813261F0823220F4803263 :100EC00009F04DC019C0823269F1833209F047C080 :100ED00038C080912702813A09F041C08091E80032 :100EE000877F8093E800CE010F9667E070E071DBAA :100EF0008091E8008B7713C080912702813279F5C9 :100F00008091E800877F8093E800CE010F9667E02C :100F100070E013DCCE013ED98091E8008E7780939B :100F2000E8001DC0809127028132C9F48091E80059 :100F3000877F8093E800809129028D87CE01C8D9F0 :100F40000DC080912702813251F48091E800877FA3 :100F50008093E800CE0160912902C5DEECDADF91D2 :100F6000CF910895A1E21A2EAA1BBB1BFD010DC053 :100F7000AA1FBB1FEE1FFF1FA217B307E407F50749 :100F800020F0A21BB30BE40BF50B661F771F881F25 :100F9000991F1A9469F760957095809590959B01BB :0C0FA000AC01BD01CF010895F894FFCF13 :100FAC0000034000000440000002080000000000A4 :060FBC000000000000002F :103000004BC0000064C0000062C0000060C000004F :103010005EC000005CC000005AC0000058C0000044 :1030200056C0000054C0000052C00000EEC40000B2 :103030004EC000004CC000004AC0000048C0000064 :1030400046C0000044C0000042C0000040C0000074 :103050003EC000003CC000003AC0000038C0000084 :1030600036C0000034C0000032C0000030C0000094 :103070002EC000002CC000002AC0000028C00000A4 :1030800026C0000024C0000022C0000020C00000B4 :103090001EC000001CC0000011241FBECFEFD2E0F4 :1030A000DEBFCDBF11E0A0E0B1E0EAEFFCE302C07B :1030B00005900D92AA33B107D9F711E0AAE3B1E068 :1030C00001C01D92AB35B107E1F772D314C698CF9A :1030D000982F15C08091F200882371F48091E80048 :1030E0008B7F8093E80003C08EB3882351F08091DA :1030F000E80082FFF9CF02C08091F100915099233E :1031000049F7089520914A01309149018091480181 :103110009091470180933F0190934001C9018093B2 :103120004101909342010895DF93CF9300D000D0E6 :1031300000D0CDB7DEB780914501843009F45AC084 :10314000853030F4813059F0833009F0D7C01FC08A :10315000853009F4A0C0863009F0D0C0C3C080918A :103160004601823008F0CAC0CDDF80914601882335 :1031700061F480913F019091400123E0FC01209394 :103180005700E89507B600FCFDCF85E008C08091A8 :103190004601882311F0823029F4B4DF89E080935E :1031A0000101ACC0813009F0A9C020E030E040E06E :1031B00050E0F90184918F3F81F0CA01AA27BB2713 :1031C00080933E013093400120933F018AE0809339 :1031D000010185E080933B0191C02F5F3F4F4F4F2E :1031E0005F4F2030F0E33F07F0E04F07F0E05F076C :1031F00001F784C080914601833051F581E08093CE :103200003A0180914B0190914C01892B71F0809192 :103210004701813009F072C080914A0190914901C3 :1032200090933D0180933C0169C0809147018823C0 :1032300061F42CE088E190E00FB6F894A8958093B3 :1032400060000FBE2093600059C01092000156C06C :10325000882309F053C0809147018F3F09F04EC089 :10326000E0E0F0E093E085E090935700E89507B642 :1032700000FCFDCF80935700E89507B600FCFDCF1A :10328000E058FF4F20E3E030F20771F781E18093CF :103290005700E89533C0DE011196E5E0F1E083E0E8 :1032A00001900D928150E1F7DE011496E2E0F1E029 :1032B00083E001900D928150E1F790914701809158 :1032C0004601882329F4FE01E90FF11D818107C021 :1032D0008130A1F4FE01BC97E90FF11D808180933C :1032E00050010CC080914601833041F48091470128 :1032F000882321F48091480180933E0126960FB6E1 :10330000F894DEBF0FBECDBFCF91DF9108952F920D :103310003F924F925F926F927F929F92AF92BF9235 :10332000CF92DF92EF92FF920F931F93CF93DF9391 :103330008091590190915A0190934C0180934B01D7 :1033400080914D01882351F080914D0181508093EF :103350004D0180914D01882309F45D9A80914E01C1 :10336000882351F080914E01815080934E018091CD :103370004E01882309F45C9A80915401833009F44A :10338000B2C1843030F4813071F0823009F0E3C191 :1033900011C1853009F4C5C1853008F4BAC1863041 :1033A00009F0D9C1CDC15C9883E080934E01809132 :1033B000E800877F8093E80080913A01882329F014 :1033C000B3DE5D9A5C9A10923A0120914B013091E4 :1033D0004C012115310529F42AC08EB3882309F444 :1033E000BAC18091E80082FFF8CF8091F10080930C :1033F00045012150304030934C0120934B01E6E4CD :10340000F1E00CC08091F10081932150304081E0C7 :10341000EB34F80719F43183208308C08091F2005F :10342000882381F730934C0120934B017DDE8091FE :103430000101853009F0BAC080914B0190914C0197 :10344000892B21F482E080930101B0C08AE140DE43 :1034500080913F018F713CDEC0914101D0914201CA :1034600020913F013091400121968E01021B130BE8 :10347000219780914601882309F093C01801369462 :103480002794C901A0913E01B0E09C01AD0162E02A :10349000E62EF12C012D112DE20EF31E041F151F37 :1034A00059016A0190E099249394B5E0A3E048C0E3 :1034B0008091F200882371F48091E8008B7F8093E3 :1034C000E80004C08EB3882309F445C18091E80068 :1034D00082FFF8CF0894210831088091F100682F0D :1034E0008091F100782FF5010B0190925700E8953B :1034F00011249F5F903419F021143104A1F4F901D3 :10350000B0935700E89507B600FCFDCF21143104B5 :1035100051F0F701A0935700E89507B600FCFDCFE6 :10352000A801970190E042E0442E512C612C712CAF :10353000E40CF51C061D171DA40CB51CC61CD71CDD :103540002114310409F0B4CFD0934001C0933F015E :1035500081E180935700E89527C08091F20088238D :1035600071F48091E8008B7F8093E80004C08EB3F3 :10357000882309F4F0C08091E80082FFF8CF6091C1 :10358000F10080913F0190914001A7D380913F01CC :103590009091400101969093400180933F0101502A :1035A000104001151105C9F680E192DD8091E80017 :1035B0008B7FC3C08091E800877F8093E8005D988F :1035C00083E080934D0104C08EB3882309F4C3C007 :1035D0008091E80080FFF8CF80910101893091F05F :1035E0008A3069F480914601813049F480913F012D :1035F000909140018093F1009093F1009BC08091E5 :10360000500196C0609141017091420120913F01AB :10361000309140016F5F7F4F7B01E21AF30A6150E6 :10362000704080914601882389F58701169507959A :10363000C901A0913E01B0E09C01AD011FC0809185 :10364000F200803271F48091E8008E7F8093E80070 :1036500004C08EB3882309F47EC08091E80080FF07 :10366000F8CFF901859194918093F1009093F10046 :10367000015010402E5F3F4F4F4F5F4F0115110516 :10368000F1F67093400160933F0129C0823039F513 :1036900023C08091F200803271F48091E8008E7F27 :1036A0008093E80004C08EB3882309F454C080914D :1036B000E80080FFF8CF00913F0110914001C80160 :1036C00004D38093F1000F5F1F4F109340010093CC :1036D0003F010894E108F108E114F104D1F682E019 :1036E0008093010127C08091E800877F8093E800E4 :1036F00080913B018093F1001092F1001092F10053 :103700001092F100809101018093F1001092F1007C :1037100011C08091E800877F8093E80010923B0100 :1037200019C08091E800877F8093E80080910101B3 :103730008093F1008091E8008E7F8093E8000AC0BA :103740008091E800877F8093E8005D9A5C9A82E030 :103750008093010187D0DF91CF911F910F91FF904E :10376000EF90DF90CF90BF90AF909F907F906F9041 :103770005F904F903F902F9008952BD181E085BFAF :1037800015BE089584B7877F84BF88E10FB6F8948B :1037900080936000109260000FBE81E085BF82E0E0 :1037A00085BF8AB180638AB98BB180638BB90CC144 :1037B000E9DF789401C080D2809100018823D9F795 :1037C00080913A018823B9F7D8DFE0913C01F0916C :1037D0003D010995FA01923071F0933089F09130F2 :1037E00029F488E091E022E130E019C080E090E027 :1037F00020E030E014C08AE191E02BE130E00FC01E :10380000882339F480913501282F30E085E391E059 :1038100006C080914301282F30E083E491E091833A :103820008083C90108958091EB0081608093EB0053 :103830001092ED006093EC004093ED008091EE005B :10384000881F8827881F08951092F4001092F000B6 :103850001092E8001092ED00EBEEF0E080818E7F98 :10386000808308958091530188238CF403C08EB324 :103870008823B1F08091E80082FFF9CF8091E800C1 :103880008B7F8093E80008958EB3882349F0809160 :10389000E80080FFF9CF8091E8008E7F8093E800F8 :1038A00008959C014091590150915A0146175707BC :1038B00018F4F90120E038C06115710511F0AB0171 :1038C000F8CF8091E8008E7F8093E80040E050E0E0 :1038D000F0CF8091E80083FF02C081E008958091DD :1038E000E80082FD2DC08EB3882381F18EB3853030 :1038F00079F18091E80080FF17C09091F20006C036 :1039000081918093F100415050409F5F41155105D6 :1039100011F09032A8F320E0903209F421E0809178 :10392000E8008E7F8093E8004115510591F622232F :1039300081F606C08EB3882349F08EB3853041F0FE :103940008091E80082FFF6CF80E0089582E008953C :1039500083E0089554D056D01EBA1092510184E0ED :1039600089BD89B5826089BD09B400FEFDCF809113 :10397000D800982F9F779093D80080688093D800C4 :10398000809163008E7F809363008091D8008F7D4B :103990008093D8008091E0008E7F8093E00080913A :1039A000E1008E7F8093E1008091E200816080934E :1039B000E2008091E100877F8093E1008091E20046 :1039C00088608093E2000895C5DF81E08093520112 :1039D0000895C0DFE0EEF0E0808181608083E8ED53 :1039E000F0E080818F7780830AD00CD019BCE3E6A9 :1039F000F0E08081816080831092520108951092DE :103A0000E20008951092E10008951F920F920FB600 :103A10000F9211242F933F934F935F936F937F9354 :103A20008F939F93AF93BF93EF93FF938091E100A8 :103A300080FF1BC08091E20080FF17C08091E100F1 :103A40008E7F8093E1008091E2008E7F8093E20080 :103A50008091E20080618093E2008091D8008062D2 :103A60008093D80019BC1EBA26D18091E10084FF52 :103A700029C08091E20084FF25C084E089BD89B51A :103A8000826089BD09B400FEFDCF8091D8008F7D92 :103A90008093D8008091E1008F7E8093E100809137 :103AA000E2008F7E8093E2008091E200816080934B :103AB000E20080915101882311F481E001C084E08B :103AC0008EBBF9D08091E10083FF22C08091E2009B :103AD00083FF1EC08091E100877F8093E10082E038 :103AE0008EBB109251018091E1008E7F8093E100A6 :103AF0008091E2008E7F8093E2008091E2008061FD :103B00008093E200A1DE80E060E042E28CDED3D070 :103B10008091E10082FF0AC08091E20082FF06C02E :103B20008091E1008B7F8093E100C5D0FF91EF9100 :103B3000BF91AF919F918F917F916F915F914F91C5 :103B40003F912F910F900FBE0F901F9018951F93CC :103B5000DF93CF9300D0CDB7DEB7E3E5F1E08091FE :103B6000F100819381E0EB35F807C9F7909153019B :103B700080915401853011F1863040F48130B9F0E4 :103B8000813070F0833009F081C011C0883009F4B1 :103B900053C0893009F462C0863009F077C02DC067 :103BA000903809F474C0923809F070C070C099233D :103BB00009F46DC0923009F069C069C0992309F019 :103BC00065C0109155018091E800877F8093E800DF :103BD00049DE04C08EB3882309F459C08091E800FF :103BE00080FFF8CF812F8F7711F492E001C093E02E :103BF0009EBB80688093E3004AC09058923008F0E2 :103C000045C0809155019091560160915701AE01D8 :103C10004F5F5F4FDFDDBC010097C9F18091E80085 :103C2000877F8093E80089819A813BDE8091E8005C :103C30008B7F8093E8002BC0903841F58091E8009D :103C4000877F8093E800809151018093F1008091FB :103C5000E8008E7F8093E80005DE19C09923B1F457 :103C600090915501923098F48091E800877F80937D :103C7000E80090935101F6DD80915101882311F401 :103C800083E001C084E08EBB16D001C040DB809190 :103C9000E80083FF0AC08091EB0080628093EB0014 :103CA0008091E800877F8093E8000F900F90CF917C :103CB000DF911F91089508958EB3882329F0809194 :103CC000E80083FF01C043CF0895F999FECF92BD6C :103CD00081BDF89A992780B50895262FF999FECFCE :103CE0001FBA92BD81BD20BD0FB6F894FA9AF99A19 :0A3CF0000FBE01960895F894FFCF6F :103CFA0001021E948920DCFB120110010000002041 :103D0A00EB03EF2F00000001000109021B00010173 :103D1A000080320904000000FE01020009210300AC :0A3D2A0000000C000104030904006E :0400000300003000C9 :00000001FF ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/Arduino-COMBINED-dfu-usbserial-atmega16u2-Uno-Rev3.hex ================================================ :1000000090C00000A9C00000A7C00000A5C000006B :10001000A3C00000A1C000009FC000009DC0000060 :100020009BC0000099C0000097C0000048C40000B9 :100030000CC4000091C000008FC000008DC0000003 :100040008BC0000089C0000087C0000085C0000090 :1000500083C0000081C000007FC0000002C100001A :100060007BC0000079C0000077C0000075C00000B0 :1000700073C0000071C000006FC000006DC00000C0 :100080006BC0000069C0000067C0000065C00000D0 :1000900063C0000061C000001201100102000008EE :1000A0004123430001000102DC0109023E0002017C :1000B00000C0320904000001020201000524000111 :1000C0001004240206052406000107058203080027 :1000D000FF09040100020A000000070504024000B5 :1000E00001070583024000010403090432034100B3 :1000F00072006400750069006E006F002000280027 :100100007700770077002E006100720064007500B0 :1001100069006E006F002E0063006300290000007C :10012000000011241FBECFEFD2E0DEBFCDBF11E033 :10013000A0E0B1E0ECEAFFE002C005900D92A6312C :10014000B107D9F712E0A6E1B1E001C01D92AF32CC :10015000B107E1F7F1D028C753CF9C01DC01AE57BE :10016000BF4FED91FC91119741911196FC93EE9345 :1001700080589F4FE817F90711F42D933C939FB7D0 :10018000F894F901EC57FF4F8081815080839FBF25 :10019000842F0895DF92EF92FF920F931F93FC013B :1001A0008489813019F0823021F405C040E3D42ED7 :1001B00004C0DD2402C030E2D32E8389823011F4E2 :1001C00088E0D82A8589873031F0883031F0863050 :1001D00031F482E003C084E001C086E0D82A1092A6 :1001E000C9001092C8001092CA00E784F088018903 :1001F000128980E0E81681EEF80680E0080780E0CA :10020000180719F420E130E00FC0C801B701969536 :1002100087957795679560587B47814E9F4FA801DA :100220009701A0D6215030403093CD002093CC00D0 :10023000D092CA0080E0E81681EEF80680E0080758 :1002400080E0180711F082E001C080E08093C800D0 :1002500088E98093C9001F910F91FF90EF90DF9084 :1002600008951F920F920FB60F9211242F938F9320 :100270009F93EF93FF939091CE008EB38430F1F46F :10028000E0919901F0919A019083E0919901F091A8 :100290009A01CF01019690939A018093990189590F :1002A000914021F489E191E0928381839FB7F89492 :1002B00080919D018F5F80939D019FBFFF91EF9182 :1002C0009F918F912F910F900FBE0F901F901895B7 :1002D000FC01858580FF02C05F9808955F9A0895AC :1002E00080E091E0D5C580E091E088C584B7877F44 :1002F00084BF28E10FB6F89420936000109260004C :100300000FBE87E690E09093CD008093CC0086E00E :100310008093CA001092C8002093C900539A5A9A39 :100320008AB180638AB98BB180638BB983D284E050 :1003300085BD5F9A579A08950F931F93CF93DF93CC :10034000D5DF2FB7F8948EE991E090931F02809348 :100350001E0290932102809320022FBF2FB7F894A2 :1003600089E191E090939A018093990190939C0187 :1003700080939B012FBF7894CEE9D1E003E08FB743 :10038000F894909122028FBF903809F180E091E0BB :10039000ABD497FD1CC0E0911E02F0911F02808338 :1003A000E0911E02F0911F02CF01019690931F026F :1003B00080931E028E51924011F4D283C1839FB765 :1003C000F894809122028F5F809322029FBF8FB7A3 :1003D000F89410919D018FBFA89902C0113678F151 :1003E000A89A80919D01882361F05D980093160181 :1003F00008C089E191E0B1DE682F80E091E0DAD4B5 :1004000011501123B1F780911601882351F080918A :10041000160181508093160180911601882309F4FA :100420005D9A80911701882351F0809117018150C6 :100430008093170180911701882309F45C9A8FB784 :10044000F894909122028FBF992369F08EE991E090 :1004500084DE982F8091C80085FFFCCF9093CE005A :100460005C980093170180E091E095D42AD487CF5F :10047000DA01923049F0933061F09130F9F4E8E913 :10048000F0E022E130E01EC0EAEAF0E02EE330E0E6 :1004900019C0813049F0813018F0823079F408C0F9 :1004A000E8EEF0E0849107C0ECEEF0E0849103C048 :1004B000E0E2F1E08491282F30E004C0E0E0F0E0D9 :1004C00020E030E0ED93FC93C901089528E030E08E :1004D00040E003C04F5F220F331F28173907D0F3C6 :1004E000842F8295807F08958093E9008091EB00AE :1004F00081608093EB001092ED006093EC004093DC :10050000ED008091EE00881F8827881F08951092C3 :10051000F40090E09093E9001092F0001092E8004F :100520001092ED008091EB008E7F8093EB009F5F37 :10053000953081F708958091270288238CF403C0B9 :100540008EB38823B1F08091E80082FFF9CF8091CB :10055000E8008B778093E80008958EB3882349F0F4 :100560008091E80080FFF9CF8091E8008E7780933A :10057000E800089594E68091EC0080FF05C080912A :10058000E80080FF05C023C08091E80082FD1FC005 :100590008EB3882311F482E008958EB3853011F470 :1005A00083E008958091EB0085FF02C081E008950B :1005B0008091E10082FFDFCF8091E1008B7F80930B :1005C000E100992311F484E008959150D4CF80E0A4 :1005D00008959C0140912D0250912E024617570715 :1005E00018F4F90120E038C06115710511F0AB0174 :1005F000F8CF8091E8008E778093E80040E050E0EB :10060000F0CF8091E80083FF02C081E008958091DF :10061000E80082FD2DC08EB3882381F18EB3853032 :1006200079F18091E80080FF17C09091F20006C038 :1006300081918093F100415050409F5F41155105D9 :1006400011F09830A8F320E0983009F421E080916F :10065000E8008E778093E8004115510591F622233A :1006600081F606C08EB3882349F08EB3853041F001 :100670008091E80082FFF6CF80E0089582E008953F :1006800083E008959C0140912D0250912E0246175F :10069000570710F490E03BC06115710511F0AB01F4 :1006A000F9CF8091E8008E778093E80040E050E039 :1006B000F1CF8091E80083FF02C081E0089580912E :1006C000E80082FD30C08EB3882399F18EB3853067 :1006D00091F18091E80080FF1AC08091F20009C07A :1006E000F9012F5F3F4FE491E093F10041505040FA :1006F0008F5F4115510511F0883090F390E08830FC :1007000009F491E08091E8008E778093E80041152C :10071000510579F6992369F606C08EB3882349F00E :100720008EB3853041F08091E80082FFF6CF80E003 :10073000089582E0089583E008959C016115710594 :1007400029F48091E8008B778093E800F90120C0BC :100750008091E80083FF02C081E008958EB3882372 :1007600039F18EB3853031F18091E80082FFF0CF0E :1007700006C08091F10081936150704021F080911A :10078000F2008823B1F78091E8008B778093E8002E :1007900061157105E9F606C08EB3882349F08EB362 :1007A000853041F08091E80080FFF6CF80E0089529 :1007B00082E0089583E0089542D044D01EBA10929A :1007C0002502109224021092230284E089BD89B58B :1007D000826089BD09B400FEFDCF8091D800982FBA :1007E0009F779093D80080688093D80080916300B1 :1007F0008E7F809363008091D8008F7D8093D80096 :100800008091E0008E7F8093E0008091E1008E7FF8 :100810008093E1008091E20081608093E20080910A :10082000E100877F8093E1008091E20088608093FF :10083000E2000895C1DF81E08093260208951092BE :10084000E20008951092E10008951F920F920FB6F2 :100850000F9211241F932F933F934F935F936F93A6 :100860007F938F939F93AF93BF93EF93FF93E9EEA3 :10087000F0E0108117701082E0EFF0E08081877F58 :1008800080837894C3D0F894A9EEB0E01C92E0EF96 :10089000F0E08081886080831C93FF91EF91BF918D :1008A000AF919F918F917F916F915F914F913F9108 :1008B0002F911F910F900FBE0F901F9018951F92B0 :1008C0000F920FB60F9211242F933F934F935F9384 :1008D0006F937F938F939F93AF93BF93EF93FF9308 :1008E0008091E10080FF1BC08091E20080FF17C073 :1008F0008091E1008E7F8093E1008091E2008E7F05 :100900008093E2008091E20080618093E200809118 :10091000D80080628093D80019BC1EBAD1D18091D2 :10092000E10084FF29C08091E20084FF25C084E0BB :1009300089BD89B5826089BD09B400FEFDCF809173 :10094000D8008F7D8093D8008091E1008F7E8093C6 :10095000E1008091E2008F7E8093E2008091E200CE :1009600081608093E20080912502882311F481E068 :1009700001C084E08EBBA4D18091E10083FF27C039 :100980008091E20083FF23C08091E100877F809304 :10099000E10082E08EBB109225028091E1008E7F03 :1009A0008093E1008091E2008E7F8093E20080914D :1009B000E20080618093E200AADD80E060E042E036 :1009C00093DD8091F00088608093F00079D1809170 :1009D000E10082FF0AC08091E20082FF06C08091A0 :1009E000E1008B7F8093E1006BD1FF91EF91BF918C :1009F000AF919F918F917F916F915F914F913F91B7 :100A00002F910F900FBE0F901F9018951F93DF939B :100A1000CF93CDB7DEB7AC970FB6F894DEBF0FBE5D :100A2000CDBFE7E2F2E08091F100819322E0EF3266 :100A3000F207C9F78091270230912802353009F476 :100A400087C0363040F43130C9F1313070F0333086 :100A500009F01DC133C0383009F4EFC0393009F452 :100A6000FEC0363009F013C192C0803821F08238C0 :100A700009F00DC108C090912302809124028823BF :100A800099F0926011C080912B0287708093E900E9 :100A90008091EB0090E025E0969587952A95E1F707 :100AA000982F91701092E9008091E800877F8093E1 :100AB000E8009093F1001092F100CAC0882319F069 :100AC000823009F0E4C090E08F719070009721F0BF :100AD000029709F0DDC00CC080912902813009F035 :100AE000D7C010922402333069F5809324022AC0C3 :100AF00080912902882331F520912B02277009F477 :100B0000C7C02093E9008091EB0080FFC1C0333063 :100B100021F48091EB00806213C08091EB00806132 :100B20008093EB0081E090E002C0880F991F2A9526 :100B3000E2F78093EA001092EA008091EB0088606F :100B40008093EB001092E9008091E800877F83C0DA :100B5000882309F09CC0109129028091E800877FCA :100B60008093E800E8DC04C08EB3882309F490C0C9 :100B70008091E80080FFF8CF812F8F7711F492E009 :100B800001C093E09EBB80688093E30081C08058E1 :100B9000823008F07CC08091290290912A0223E0E3 :100BA0008C3D920799F55FB7F894DE0115964EE0FB :100BB00020E030E061E2E42FF0E0609357008491A0 :100BC00020FF03C082958F704F5F982F9F70892FF1 :100BD000805D8A3308F0895F8C9311961C9211977F :100BE0002F5F3F4F12962431310529F75FBF8AE20C :100BF0008B8383E08C838091E800877F8093E8007B :100C0000CE0103966AE270E0E4DC11C060912B0231 :100C1000AE014F5F5F4F2CDCBC010097C9F18091A2 :100C2000E800877F8093E80089819A812BDD80919D :100C3000E8008B778093E8002BC0803841F58091E5 :100C4000E800877F8093E800809125028093F1007F :100C50008091E8008E778093E8006DDC19C08823CE :100C6000B1F490912902923098F48091E800877F46 :100C70008093E800909325025EDC80912502882312 :100C800011F483E001C084E08EBB2DDB01C028DBC2 :100C90008091E80083FF0AC08091EB00806280931E :100CA000EB008091E800877F8093E800AC960FB658 :100CB000F894DEBF0FBECDBFCF91DF911F91089595 :100CC00008951F938EB3882361F01091E90010926C :100CD000E9008091E80083FF01C098DE177010934F :100CE000E9001F9108950895FC018EB3843021F529 :100CF00087859089A189B2890097A105B105E1F0A6 :100D000085818093E9008091E80082FF15C0809181 :100D1000F200882319F42FEF3FEF04C08091F10017 :100D2000282F30E08091F200882341F48091E80080 :100D30008B778093E80002C02FEF3FEFC901089541 :100D4000FC018EB3843011F587859089A189B28921 :100D50000097A105B105D1F081818093E9008091D0 :100D6000F2008823A9F09091E8008091E8008E7746 :100D70008093E80095FD0CC0FDDB982F882349F493 :100D80008091E8008E778093E80003C092E001C074 :100D900090E0892F0895FC018EB3843051F487854B :100DA0009089A189B2890097A105B10511F0CF0101 :100DB000C7CF08951F93FC01162F8EB38430D9F44A :100DC00087859089A189B2890097A105B10599F01D :100DD00081818093E9008091E80085FD08C08091C1 :100DE000E8008E778093E800C5DB882329F4109310 :100DF000F10080E001C082E01F9108950F931F93DE :100E0000CF93DF93EC010D96FC0189E0DF011D9289 :100E10008A95E9F72A813B8109818C81882311F425 :100E200010E001C014E0C90151DB182B1260802FC3 :100E300061E8412F59DB882329F12E813F810D8103 :100E40008885882311F410E001C014E0C9013EDB5D :100E5000182B1260802F60E8412F46DB882391F029 :100E60002A853B8509858C85882311F410E001C013 :100E700014E0C9012BDB182B1260802F61EC412F8D :100E800033DB01C080E0DF91CF911F910F91089576 :100E9000CF93DF93EC018091E80083FF60C08881ED :100EA00090E020912B0230912C022817390709F08D :100EB00056C080912802813261F0823220F4803263 :100EC00009F04DC019C0823269F1833209F047C080 :100ED00038C080912702813A09F041C08091E80032 :100EE000877F8093E800CE010F9667E070E071DBAA :100EF0008091E8008B7713C080912702813279F5C9 :100F00008091E800877F8093E800CE010F9667E02C :100F100070E013DCCE013ED98091E8008E7780939B :100F2000E8001DC0809127028132C9F48091E80059 :100F3000877F8093E800809129028D87CE01C8D9F0 :100F40000DC080912702813251F48091E800877FA3 :100F50008093E800CE0160912902C5DEECDADF91D2 :100F6000CF910895A1E21A2EAA1BBB1BFD010DC053 :100F7000AA1FBB1FEE1FFF1FA217B307E407F50749 :100F800020F0A21BB30BE40BF50B661F771F881F25 :100F9000991F1A9469F760957095809590959B01BB :0C0FA000AC01BD01CF010895F894FFCF13 :100FAC0000034000000440000002080000000000A4 :060FBC000000000000002F :103000004BC0000064C0000062C0000060C000004F :103010005EC000005CC000005AC0000058C0000044 :1030200056C0000054C0000052C00000EEC40000B2 :103030004EC000004CC000004AC0000048C0000064 :1030400046C0000044C0000042C0000040C0000074 :103050003EC000003CC000003AC0000038C0000084 :1030600036C0000034C0000032C0000030C0000094 :103070002EC000002CC000002AC0000028C00000A4 :1030800026C0000024C0000022C0000020C00000B4 :103090001EC000001CC0000011241FBECFEFD2E0F4 :1030A000DEBFCDBF11E0A0E0B1E0EAEFFCE302C07B :1030B00005900D92AA33B107D9F711E0AAE3B1E068 :1030C00001C01D92AB35B107E1F772D314C698CF9A :1030D000982F15C08091F200882371F48091E80048 :1030E0008B7F8093E80003C08EB3882351F08091DA :1030F000E80082FFF9CF02C08091F100915099233E :1031000049F7089520914A01309149018091480181 :103110009091470180933F0190934001C9018093B2 :103120004101909342010895DF93CF9300D000D0E6 :1031300000D0CDB7DEB780914501843009F45AC084 :10314000853030F4813059F0833009F0D7C01FC08A :10315000853009F4A0C0863009F0D0C0C3C080918A :103160004601823008F0CAC0CDDF80914601882335 :1031700061F480913F019091400123E0FC01209394 :103180005700E89507B600FCFDCF85E008C08091A8 :103190004601882311F0823029F4B4DF89E080935E :1031A0000101ACC0813009F0A9C020E030E040E06E :1031B00050E0F90184918F3F81F0CA01AA27BB2713 :1031C00080933E013093400120933F018AE0809339 :1031D000010185E080933B0191C02F5F3F4F4F4F2E :1031E0005F4F2030F0E33F07F0E04F07F0E05F076C :1031F00001F784C080914601833051F581E08093CE :103200003A0180914B0190914C01892B71F0809192 :103210004701813009F072C080914A0190914901C3 :1032200090933D0180933C0169C0809147018823C0 :1032300061F42CE088E190E00FB6F894A8958093B3 :1032400060000FBE2093600059C01092000156C06C :10325000882309F053C0809147018F3F09F04EC089 :10326000E0E0F0E093E085E090935700E89507B642 :1032700000FCFDCF80935700E89507B600FCFDCF1A :10328000E058FF4F20E3E030F20771F781E18093CF :103290005700E89533C0DE011196E5E0F1E083E0E8 :1032A00001900D928150E1F7DE011496E2E0F1E029 :1032B00083E001900D928150E1F790914701809158 :1032C0004601882329F4FE01E90FF11D818107C021 :1032D0008130A1F4FE01BC97E90FF11D808180933C :1032E00050010CC080914601833041F48091470128 :1032F000882321F48091480180933E0126960FB6E1 :10330000F894DEBF0FBECDBFCF91DF9108952F920D :103310003F924F925F926F927F929F92AF92BF9235 :10332000CF92DF92EF92FF920F931F93CF93DF9391 :103330008091590190915A0190934C0180934B01D7 :1033400080914D01882351F080914D0181508093EF :103350004D0180914D01882309F45D9A80914E01C1 :10336000882351F080914E01815080934E018091CD :103370004E01882309F45C9A80915401833009F44A :10338000B2C1843030F4813071F0823009F0E3C191 :1033900011C1853009F4C5C1853008F4BAC1863041 :1033A00009F0D9C1CDC15C9883E080934E01809132 :1033B000E800877F8093E80080913A01882329F014 :1033C000B3DE5D9A5C9A10923A0120914B013091E4 :1033D0004C012115310529F42AC08EB3882309F444 :1033E000BAC18091E80082FFF8CF8091F10080930C :1033F00045012150304030934C0120934B01E6E4CD :10340000F1E00CC08091F10081932150304081E0C7 :10341000EB34F80719F43183208308C08091F2005F :10342000882381F730934C0120934B017DDE8091FE :103430000101853009F0BAC080914B0190914C0197 :10344000892B21F482E080930101B0C08AE140DE43 :1034500080913F018F713CDEC0914101D0914201CA :1034600020913F013091400121968E01021B130BE8 :10347000219780914601882309F093C01801369462 :103480002794C901A0913E01B0E09C01AD0162E02A :10349000E62EF12C012D112DE20EF31E041F151F37 :1034A00059016A0190E099249394B5E0A3E048C0E3 :1034B0008091F200882371F48091E8008B7F8093E3 :1034C000E80004C08EB3882309F445C18091E80068 :1034D00082FFF8CF0894210831088091F100682F0D :1034E0008091F100782FF5010B0190925700E8953B :1034F00011249F5F903419F021143104A1F4F901D3 :10350000B0935700E89507B600FCFDCF21143104B5 :1035100051F0F701A0935700E89507B600FCFDCFE6 :10352000A801970190E042E0442E512C612C712CAF :10353000E40CF51C061D171DA40CB51CC61CD71CDD :103540002114310409F0B4CFD0934001C0933F015E :1035500081E180935700E89527C08091F20088238D :1035600071F48091E8008B7F8093E80004C08EB3F3 :10357000882309F4F0C08091E80082FFF8CF6091C1 :10358000F10080913F0190914001A7D380913F01CC :103590009091400101969093400180933F0101502A :1035A000104001151105C9F680E192DD8091E80017 :1035B0008B7FC3C08091E800877F8093E8005D988F :1035C00083E080934D0104C08EB3882309F4C3C007 :1035D0008091E80080FFF8CF80910101893091F05F :1035E0008A3069F480914601813049F480913F012D :1035F000909140018093F1009093F1009BC08091E5 :10360000500196C0609141017091420120913F01AB :10361000309140016F5F7F4F7B01E21AF30A6150E6 :10362000704080914601882389F58701169507959A :10363000C901A0913E01B0E09C01AD011FC0809185 :10364000F200803271F48091E8008E7F8093E80070 :1036500004C08EB3882309F47EC08091E80080FF07 :10366000F8CFF901859194918093F1009093F10046 :10367000015010402E5F3F4F4F4F5F4F0115110516 :10368000F1F67093400160933F0129C0823039F513 :1036900023C08091F200803271F48091E8008E7F27 :1036A0008093E80004C08EB3882309F454C080914D :1036B000E80080FFF8CF00913F0110914001C80160 :1036C00004D38093F1000F5F1F4F109340010093CC :1036D0003F010894E108F108E114F104D1F682E019 :1036E0008093010127C08091E800877F8093E800E4 :1036F00080913B018093F1001092F1001092F10053 :103700001092F100809101018093F1001092F1007C :1037100011C08091E800877F8093E80010923B0100 :1037200019C08091E800877F8093E80080910101B3 :103730008093F1008091E8008E7F8093E8000AC0BA :103740008091E800877F8093E8005D9A5C9A82E030 :103750008093010187D0DF91CF911F910F91FF904E :10376000EF90DF90CF90BF90AF909F907F906F9041 :103770005F904F903F902F9008952BD181E085BFAF :1037800015BE089584B7877F84BF88E10FB6F8948B :1037900080936000109260000FBE81E085BF82E0E0 :1037A00085BF8AB180638AB98BB180638BB90CC144 :1037B000E9DF789401C080D2809100018823D9F795 :1037C00080913A018823B9F7D8DFE0913C01F0916C :1037D0003D010995FA01923071F0933089F09130F2 :1037E00029F488E091E022E130E019C080E090E027 :1037F00020E030E014C08AE191E02BE130E00FC01E :10380000882339F480913501282F30E085E391E059 :1038100006C080914301282F30E083E491E091833A :103820008083C90108958091EB0081608093EB0053 :103830001092ED006093EC004093ED008091EE005B :10384000881F8827881F08951092F4001092F000B6 :103850001092E8001092ED00EBEEF0E080818E7F98 :10386000808308958091530188238CF403C08EB324 :103870008823B1F08091E80082FFF9CF8091E800C1 :103880008B7F8093E80008958EB3882349F0809160 :10389000E80080FFF9CF8091E8008E7F8093E800F8 :1038A00008959C014091590150915A0146175707BC :1038B00018F4F90120E038C06115710511F0AB0171 :1038C000F8CF8091E8008E7F8093E80040E050E0E0 :1038D000F0CF8091E80083FF02C081E008958091DD :1038E000E80082FD2DC08EB3882381F18EB3853030 :1038F00079F18091E80080FF17C09091F20006C036 :1039000081918093F100415050409F5F41155105D6 :1039100011F09032A8F320E0903209F421E0809178 :10392000E8008E7F8093E8004115510591F622232F :1039300081F606C08EB3882349F08EB3853041F0FE :103940008091E80082FFF6CF80E0089582E008953C :1039500083E0089554D056D01EBA1092510184E0ED :1039600089BD89B5826089BD09B400FEFDCF809113 :10397000D800982F9F779093D80080688093D800C4 :10398000809163008E7F809363008091D8008F7D4B :103990008093D8008091E0008E7F8093E00080913A :1039A000E1008E7F8093E1008091E200816080934E :1039B000E2008091E100877F8093E1008091E20046 :1039C00088608093E2000895C5DF81E08093520112 :1039D0000895C0DFE0EEF0E0808181608083E8ED53 :1039E000F0E080818F7780830AD00CD019BCE3E6A9 :1039F000F0E08081816080831092520108951092DE :103A0000E20008951092E10008951F920F920FB600 :103A10000F9211242F933F934F935F936F937F9354 :103A20008F939F93AF93BF93EF93FF938091E100A8 :103A300080FF1BC08091E20080FF17C08091E100F1 :103A40008E7F8093E1008091E2008E7F8093E20080 :103A50008091E20080618093E2008091D8008062D2 :103A60008093D80019BC1EBA26D18091E10084FF52 :103A700029C08091E20084FF25C084E089BD89B51A :103A8000826089BD09B400FEFDCF8091D8008F7D92 :103A90008093D8008091E1008F7E8093E100809137 :103AA000E2008F7E8093E2008091E200816080934B :103AB000E20080915101882311F481E001C084E08B :103AC0008EBBF9D08091E10083FF22C08091E2009B :103AD00083FF1EC08091E100877F8093E10082E038 :103AE0008EBB109251018091E1008E7F8093E100A6 :103AF0008091E2008E7F8093E2008091E2008061FD :103B00008093E200A1DE80E060E042E28CDED3D070 :103B10008091E10082FF0AC08091E20082FF06C02E :103B20008091E1008B7F8093E100C5D0FF91EF9100 :103B3000BF91AF919F918F917F916F915F914F91C5 :103B40003F912F910F900FBE0F901F9018951F93CC :103B5000DF93CF9300D0CDB7DEB7E3E5F1E08091FE :103B6000F100819381E0EB35F807C9F7909153019B :103B700080915401853011F1863040F48130B9F0E4 :103B8000813070F0833009F081C011C0883009F4B1 :103B900053C0893009F462C0863009F077C02DC067 :103BA000903809F474C0923809F070C070C099233D :103BB00009F46DC0923009F069C069C0992309F019 :103BC00065C0109155018091E800877F8093E800DF :103BD00049DE04C08EB3882309F459C08091E800FF :103BE00080FFF8CF812F8F7711F492E001C093E02E :103BF0009EBB80688093E3004AC09058923008F0E2 :103C000045C0809155019091560160915701AE01D8 :103C10004F5F5F4FDFDDBC010097C9F18091E80085 :103C2000877F8093E80089819A813BDE8091E8005C :103C30008B7F8093E8002BC0903841F58091E8009D :103C4000877F8093E800809151018093F1008091FB :103C5000E8008E7F8093E80005DE19C09923B1F457 :103C600090915501923098F48091E800877F80937D :103C7000E80090935101F6DD80915101882311F401 :103C800083E001C084E08EBB16D001C040DB809190 :103C9000E80083FF0AC08091EB0080628093EB0014 :103CA0008091E800877F8093E8000F900F90CF917C :103CB000DF911F91089508958EB3882329F0809194 :103CC000E80083FF01C043CF0895F999FECF92BD6C :103CD00081BDF89A992780B50895262FF999FECFCE :103CE0001FBA92BD81BD20BD0FB6F894FA9AF99A19 :0A3CF0000FBE01960895F894FFCF6F :103CFA0001021E948920DCFB120110010000002041 :103D0A00EB03EF2F00000001000109021B00010173 :103D1A000080320904000000FE01020009210300AC :0A3D2A0000000C000104030904006E :0400000300003000C9 :00000001FF ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/Genuino-COMBINED-dfu-usbserial-atmega16u2-Mega2560-R3.hex ================================================ :200000009EC00000B7C00000B5C00000B3C00000B1C00000AFC00000ADC00000ABC000006B :20002000A9C00000A7C00000A5C00000FCC30000A1C400009FC000009DC000009BC0000050 :2000400099C0000097C0000095C0000093C0000091C000008FC000008DC00000C6C10000D4 :2000600089C0000087C0000085C0000083C0000081C00000160538052206380522067A05C3 :2000800097052206EA05FC052403470065006E00750069006E006F0020004D006500670077 :2000A00061002000320035003600300000003A03410072006400750069006E006F002000C3 :2000C0004C004C004300200028007700770077002E00610072006400750069006E006F0078 :2000E0002E0063006300290000000403090409023E00020100C0320904000001020201007E :200100000524000110042402060524060001070582030800FF09040100020A000000070587 :2001200004024000010705830240000112011001020000084123420201000102DC011124BA :200140001FBECFEFD2E0DEBFCDBF11E0A0E0B1E0EEE4FFE002C005900D92A631B107D9F721 :2001600012E0A6E1B1E001C01D92AF32B107E1F764D0EBC645CFFC01E058FF4FA081B181C5 :200180006C93A081B1819D012F5F3F4F318320832E173F0721F412969C938E9311972FB7D6 :2001A000F894FC01EC57FF4F80818F5F80832FBF0895DC01AE57BF4FED91FC911197419133 :2001C0001196FC93EE939C0120583F4FE217F30711F48D939C932FB7F894FC01EC57FF4F7E :2001E0009081915090832FBF842F089584B7877F84BF88E10FB6F894809360001092600009 :200200000FBE87E690E09093CD008093CC0086E08093CA001092C80088E18093C900539A86 :200220005A9A8AB180638AB98BB180638BB9F0D284E085BD5F9A579A0895D8DF2FB7F894EE :200240008EE991E090931F0280931E0290932102809320022FBF2FB7F89489E191E0909366 :200260009A018093990190939C0180939B012FBF7894D3E09FB7F894809122029FBF8038ED :2002800049F080E091E00ED697FD04C0682F8EE991E071DF8FB7F894C0919D018FBFA899F9 :2002A00002C0C13658F1A89A80919D01882319F05D98D0931601CC2349F089E191E079DFCD :2002C000682F80E091E093D5C150F5CF80911601882341F0809116018150809316018111C0 :2002E00001C05D9A80911701882341F080911701815080931701811101C05C9A9FB7F894F1 :20030000809122029FBF882361F08EE991E051DF9091C80095FFFCCF8093CE005C98D093B6 :20032000170180E091E0B0D59AD4A4CF80E091E011C580E091E0A5C41F93CF93DF93EC011A :200340008C89813031F0823011F010E003C010E201C010E38B89823009F418608D898730A2 :2003600031F0883031F0863029F4126003C0146001C016601092C9001092C8001092CA008F :200380002F85388949895A89211581EE38074105510571F0CA01B90196958795779567957E :2003A00060587B47814E9F4FA8D52150310902C020E130E03093CD002093CC001093CA008F :2003C0008F859889A989BA898115914EA105B10511F480E001C082E08093C80088E98093BB :2003E000C900DF91CF911F9108951F920F920FB60F9211242F933F934F935F936F937F93AE :200400008F939F93AF93BF93EF93FF936091CE008EB3843019F489E191E0ADDEFF91EF91A9 :20042000BF91AF919F918F917F916F915F914F913F912F910F900FBE0F901F901895FC0108 :20044000858580FF02C05F9808955F9A0895292F33272230310559F02330310569F0213071 :200460003105F9F482E190E02CE231E01EC08EE390E02EEE30E019C099278130910541F06B :200480008230910541F0892B61F4EAEEF0E005C0EEEAF0E002C0E8E8F0E0849190E09F013E :2004A00004C080E090E020E030E0FA0131832083089528E030E040E02817390720F44F5F30 :2004C000220F331FF9CF842F8295807F08958093E900EBEEF0E0808181608083EDEEF0E036 :2004E00010826093EC0040838091EE00881F8827881F08951092F40080E08093E90010929B :20050000F0001092E8001092ED009091EB009E7F9093EB008F5F853081F7089580912702A9 :2005200087FD05C08091E80080FF0DC010C08091E80082FD04C08EB38111F9CF08958091D8 :20054000E8008B7707C08EB38111ECCF08958091E8008E778093E800089585E69091EC00B1 :2005600090FF05C09091E80090FF05C01BC09091E80092FD17C09EB39923B1F09EB39530BC :20058000A9F09091EB0095FD13C09091E10092FFE5CF9091E1009B7F9093E1008150F1F632 :2005A00084E0089580E0089582E0089583E0089581E0089520912D0230912E0226173707F4 :2005C00048F06115710539F42091E8002E772093E80001C0B90130E06115710591F1209147 :2005E000E80023FD38C02091E80022FF06C08091E80082FF29C080E008952EB3222369F19B :200600002EB3253061F12091E80020FFE5CF2091F200FC01CF016115710549F0283038F4CD :2006200081918093F100615071092F5FF3CF31E0283009F030E02091E8002E772093E800DE :20064000CBCF3111CCCFD3CF8EB3882331F08EB3853069F604C081E0089582E0089583E0FB :20066000089520912D0230912E022617370748F06115710539F42091E8002E772093E80067 :2006800001C0B90130E06115710599F12091E80023FD39C02091E80022FF06C08091E8002E :2006A00082FF2AC080E008952EB3222371F12EB3253069F12091E80020FFE5CF2091F200AB :2006C000FC01CF016115710551F0283040F484918093F100615071092F5F3196F2CF31E029 :2006E000283009F030E02091E8002E772093E800CACF3111CBCFD2CF8EB3882331F08EB35C :20070000853061F604C081E0089582E0089583E008956115710529F42091E8002B77209315 :20072000E8006115710549F12091E80023FD2AC02EB3222359F12EB3253051F12091E80087 :2007400022FFF2CFFC018091F200882371F09F012F5F3F4FC9014091F10040836150710975 :2007600061157105C9F2F901EECFCF01D5CF8EB3882361F08EB3853059F08091E80080FFB3 :20078000F6CF02C081E0089580E0089582E0089583E0089542D044D01EBA1092250210926F :2007A00024021092230284E089BD89B5826089BD09B400FEFDCF8091D800982F9F779093CC :2007C000D80080688093D800809163008E7F809363008091D8008F7D8093D8008091E000A6 :2007E0008E7F8093E0008091E1008E7F8093E1008091E20081608093E2008091E100877F45 :200800008093E1008091E20088608093E2000895C1DF81E08093260208951092E20008957D :200820001092E10008951F920F920FB60F9211242F933F934F935F936F937F938F939F93DB :20084000AF93BF93EF93FF938091E10080FF1BC08091E20080FF17C08091E1008E7F809349 :20086000E1008091E2008E7F8093E2008091E20080618093E2008091D80080628093D80023 :2008800019BC1EBAEBD18091E10084FF29C08091E20084FF25C084E089BD89B5826089BD26 :2008A00009B400FEFDCF8091D8008F7D8093D8008091E1008F7E8093E1008091E2008F7EDE :2008C0008093E2008091E20081608093E20080912502882311F084E001C081E08EBBBED118 :2008E0008091E10083FF27C08091E20083FF23C08091E100877F8093E10082E08EBB10920C :2009000025028091E1008E7F8093E1008091E2008E7F8093E2008091E20080618093E200FF :20092000E9DD42E060E080E0D2DD8091F00088608093F00093D18091E10082FF0AC08091E2 :20094000E20082FF06C08091E1008B7F8093E10085D1FF91EF91BF91AF919F918F917F9128 :200960006F915F914F913F912F910F900FBE0F901F9018951F920F920FB60F9211242F9301 :200980003F934F935F936F937F938F939F93AF93BF93CF93EF93FF93E9EEF0E0C081C77020 :2009A0001082E0EFF0E08081877F808378941CD0F894E9EEF0E01082A0EFB0E08C9188601B :2009C0008C93C083FF91EF91CF91BF91AF919F918F917F916F915F914F913F912F910F9056 :2009E0000FBE0F901F9018951F93CF93DF93CDB7DEB7AA970FB6F894DEBF0FBECDBFE7E23F :200A0000F2E08091F100819322E0EF32F207C9F72091270230912802832F90E08A309105DB :200A200008F010C1FC01E65CFF4F89C2203881F0223809F007C180912B0287708093E90000 :200A40008091EB0085FB882780F91092E90006C08091230290912402911182609091E80097 :200A6000977F9093E8008093F1001092F100BDC0822F8D7F09F0E6C0222319F0223061F0F4 :200A8000D2C080912902813009F0CDC0333009F080E08093240228C080912902811124C0C2 :200AA00020912B02277009F4BEC02093E9008091EB0080FFB8C08091EB00333011F4806271 :200AC00011C080618093EB0081E090E0022E01C0880F0A94EAF78093EA001092EA008091F4 :200AE000EB0088608093EB001092E9008091E800877F7EC02111A6C0109129028091E80000 :200B0000877F8093E8000ADD8091E80080FD04C08EB38111F9CF87C0812F8F7711F093E0A7 :200B200001C092E09EBB80688093E3007CC02058223008F087C08091290290912A028C3DB4 :200B400023E0920781F583E08A838AE289834FB7F894DE01139620E03EE051E2E32FF0E04E :200B600050935700E49120FF03C0E295EF703F5FEF7090E39E0F9A3310F0E95C01C0E92F06 :200B80008E2F90E08D939D932F5F243139F74FBF8091E800877F8093E8006AE270E0CE0152 :200BA000019608DD11C0AE014F5F5F4F60912B024EDC0097C1F12091E800277F2093E80072 :200BC000BC0189819A814DDD8091E8008B778093E80029C02038B1F58091E800877F80931A :200BE000E800809125028093F1008091E8008E778093E80093DC17C0211124C09091290230 :200C0000923088F48091E800877F8093E8009093250284DC80912502882311F084E001C0E9 :200C200083E08EBB83DB8091E80083FF0DC08091EB0080628093EB008091E800877F809374 :200C4000E80002C076DBEFCFAA960FB6F894DEBF0FBECDBFDF91CF911F9108950895CF9338 :200C60008EB3882359F0C091E900C7701092E9008091E80083FDB8DEC093E900CF910895FB :200C80000895CF93DF93EC018091E80083FF5FC0888190E020912B0230912C022817390797 :200CA00009F055C080912802813249F018F48032C9F04DC0823261F18332C9F148C08091ED :200CC0002702813A09F043C08091E800877F8093E80067E070E0CE010F966CDC8091E800EE :200CE0008B7713C080912702813289F58091E800877F8093E80067E070E0CE010F9609DDC9 :200D0000CE011ADB8091E8008E778093E8001FC0809127028132D9F48091E800877F80936B :200D2000E800809129028D87CE0189DB0DC080912702813261F48091E800877F8093E8003F :200D400060912902CE019CDFDF91CF91E7CBDF91CF9108950F931F93CF93DF93EC01FC012C :200D60003D9689E0DF011D928A95E9F72A813B818C81882311F014E001C010E00981C90190 :200D800098DB412F482B426061E8802FA0DB882341F12E813F818885882311F014E001C02E :200DA00010E00D81C90185DB412F482B426060E8802F8DDB8823A9F02A853B858C85882338 :200DC00011F014E001C010E0C985C90172DB412F482B426061EC8C2FDF91CF911F910F915B :200DE00076CB80E0DF91CF911F910F910895CF93C62F2EB32430E9F4FC01478550896189A0 :200E00007289452B462B472BA1F081818093E9008091E80085FF04C0C093F10080E00AC046 :200E20008091E8008E778093E80097DB8823A1F301C082E0CF9108952EB3243019F5FC01A8 :200E40004785508961897289452B462B472BD1F081818093E9008091F200882389F09091AE :200E6000E8008091E8008E778093E80095FD08C074DB811108C08091E8008E778093E80095 :200E800080E0089582E008952EB3243051F4FC014785508961897289452B462B472B09F009 :200EA000CBCF08952EB3243019F08FEF9FEF0895FC014785508961897289452B462B472B3A :200EC000A1F385818093E9008091E80082FFEDCF8091F200882321F02091F10030E002C013 :200EE0002FEF3FEF8091F200811105C08091E8008B778093E800C9010895A1E21A2EAA1B5F :200F0000BB1BFD010DC0AA1FBB1FEE1FFF1FA217B307E407F50720F0A21BB30BE40BF50B8E :200F2000661F771F881F991F1A9469F760957095809590959B01AC01BD01CF010895EE0F84 :200F4000FF1F0590F491E02D0994F894FFCF000340000004400000020800000000000000C4 :200F600000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :200F800020F0A21BB30BE40BF50B661F771F881F991F1A9469F760957095809590959B017F :200FA000AC01BD01CF010895F894FFCF00034000000440000002080000000000000000006E :200FC0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F :200FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :20100000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 :20102000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 :20104000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 :20106000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 :20108000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 :2010A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 :2010C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 :2010E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 :20110000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF :20112000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF :20114000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF :20116000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F :20118000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F :2011A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F :2011C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F :2011E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F :20120000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE :20122000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE :20124000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE :20126000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E :20128000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E :2012A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E :2012C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E :2012E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :20130000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :20132000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20134000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20136000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20138000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :2013A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :2013C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2013E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :20140000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :20142000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20144000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20146000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20148000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :2014A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :2014C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2014E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :20150000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :20152000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20154000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20156000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20158000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :2015A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :2015C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2015E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :20160000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :20162000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20164000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20166000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20168000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :2016A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :2016C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2016E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :20170000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :20172000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20174000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20176000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20178000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :2017A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :2017C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2017E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :20180000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :20182000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20184000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20186000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20188000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :2018A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :2018C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2018E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :20190000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :20192000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :20194000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20196000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20198000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :2019A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :2019C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2019E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :201A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :201A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :201A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :201A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :201A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :201AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :201AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :201AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :201B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :201B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :201B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :201B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :201B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :201BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :201BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :201BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :201C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :201C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :201C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :201C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :201C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :201CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :201CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :201CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :201D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :201D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :201D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :201D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :201D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :201DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :201DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :201DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :201E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :201E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :201E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :201E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :201E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :201EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :201EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :201EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :201F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :201F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :201F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :201F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :201F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :201FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :201FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :201FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :20200000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :20202000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20204000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20206000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20208000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :2020A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :2020C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2020E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :20210000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :20212000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20214000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20216000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20218000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :2021A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :2021C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2021E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :20220000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :20222000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20224000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20226000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20228000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :2022A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :2022C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2022E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :20230000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :20232000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20234000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20236000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20238000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :2023A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :2023C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2023E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :20240000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :20242000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20244000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20246000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20248000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :2024A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :2024C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2024E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :20250000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :20252000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20254000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20256000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20258000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :2025A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :2025C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2025E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :20260000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :20262000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20264000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20266000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20268000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :2026A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :2026C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2026E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :20270000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :20272000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20274000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20276000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20278000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :2027A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :2027C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2027E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :20280000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :20282000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20284000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20286000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20288000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :2028A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :2028C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2028E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :20290000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :20292000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :20294000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20296000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20298000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :2029A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :2029C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2029E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :202A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :202A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :202A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :202A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :202A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :202AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :202AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :202AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :202B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :202B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :202B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :202B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :202B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :202BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :202BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :202BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :202C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :202C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :202C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :202C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :202C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :202CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :202CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :202CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :202D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :202D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :202D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :202D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :202D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :202DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :202DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :202DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :202E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :202E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :202E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :202E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :202E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :202EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :202EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :202EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :202F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :202F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :202F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :202F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :202F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :202FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :202FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :202FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :203000004BC0000064C0000062C0000060C000005EC000005CC000005AC0000058C00000D3 :2030200056C0000054C0000052C00000CBC400004EC000004CC000004AC0000048C0000099 :2030400046C0000044C0000042C0000040C000003EC000003CC000003AC0000038C0000078 :2030600036C0000034C0000032C0000030C000002EC000002CC000002AC0000028C00000D8 :2030800026C0000024C0000022C0000020C000001EC000001CC0000011241FBECFEFD2E068 :2030A000DEBFCDBF11E0A0E0B1E0E4EBFCE302C005900D92A836B107D9F711E0A8E6B1E0CB :2030C00001C01D92A738B107E1F74FD3F1C598CF982F15C08091F200882371F48091E8002A :2030E0008B7F8093E80003C08EB3882351F08091E80082FFF9CF02C08091F1009150992338 :2031000049F708952091760130917501809174019091730180936D0190936E01C901809368 :203120006F0190937001089580917101843009F45AC0853030F4813059F0833009F0C3C09E :203140001FC0853009F4A0C0863009F0BCC0AFC080917201823008F0B6C0D4DF8091720109 :20316000882361F480916D0190916E0123E0FC0120935700E89507B600FCFDCF85E008C007 :2031800080917201882311F0823029F4BBDF89E0809301010895813009F095C020E030E06C :2031A00040E050E0F90184918F3F81F0CA01AA27BB2780936C0130936E0120936D018AE0B6 :2031C0008093010185E08093690108952F5F3F4F4F4F5F4F2030F0E33F07F0E04F07F0E094 :2031E0005F0701F7089580917201833051F581E0809368018091770190917801892B71F042 :2032000080917301813009F05EC0809176019091750190936B0180936A0108958091730113 :20322000882361F42CE088E190E00FB6F894A895809360000FBE2093600008951092000188 :203240000895882309F03FC0809173018F3F09F03AC0E0E0F0E093E085E090935700E89589 :2032600007B600FCFDCF80935700E89507B600FCFDCFE058FF4F20E3E030F20771F781E101 :2032800080935700E8950895E091730180917201882321F4F0E0EB5FFE4F05C0813099F417 :2032A000F0E0EE52FF4F808180937C01089580917201833041F480917301882321F48091C0 :2032C000740180936C0108952F923F924F925F926F927F929F92AF92BF92CF92DF92EF92D0 :2032E000FF920F931F93CF93DF938091850190918601909378018093770180917901882379 :2033000051F08091790181508093790180917901882309F45D9A80917A01882351F08091D0 :203320007A01815080937A0180917A01882309F45C9A80918001833009F4B2C1843030F4FC :20334000813071F0823009F0E3C111C1853009F4C5C1853008F4BAC1863009F0D9C1CDC1FF :203360005C9883E080937A018091E800877F8093E80080916801882329F0D6DE5D9A5C9A8F :203380001092680120917701309178012115310529F42AC08EB3882309F4BAC18091E800EF :2033A00082FFF8CF8091F10080937101215030403093780120937701E2E7F1E00CC080917F :2033C000F10081932150304081E0E737F80719F43183208308C08091F200882381F7309374 :2033E000780120937701A0DE80910101853009F0BAC08091770190917801892B21F482E022 :2034000080930101B0C08AE163DE80916D018F715FDEC0916F01D091700120916D0130914C :203420006E0121968E01021B130B219780917201882309F093C0180136942794C901A091D0 :203440006C01B0E09C01AD0162E0E62EF12C012D112DE20EF31E041F151F59016A0190E0B8 :2034600099249394B5E0A3E048C08091F200882371F48091E8008B7F8093E80004C08EB332 :20348000882309F445C18091E80082FFF8CF0894210831088091F100682F8091F100782FFD :2034A000F5010B0190925700E89511249F5F903419F021143104A1F4F901B0935700E89504 :2034C00007B600FCFDCF2114310451F0F701A0935700E89507B600FCFDCFA801970190E087 :2034E00042E0442E512C612C712CE40CF51C061D171DA40CB51CC61CD71C2114310409F080 :20350000B4CFD0936E01C0936D0181E180935700E89527C08091F200882371F48091E80059 :203520008B7F8093E80004C08EB3882309F4F0C08091E80082FFF8CF6091F10080916D0187 :2035400090916E01A7D380916D0190916E01019690936E0180936D010150104001151105DB :20356000C9F680E1B5DD8091E8008B7FC3C08091E800877F8093E8005D9883E08093790134 :2035800004C08EB3882309F4C3C08091E80080FFF8CF80910101893091F08A3069F4809147 :2035A0007201813049F480916D0190916E018093F1009093F1009BC080917C0196C0609153 :2035C0006F017091700120916D0130916E016F5F7F4F7B01E21AF30A6150704080917201C4 :2035E000882389F5870116950795C901A0916C01B0E09C01AD011FC08091F200803271F497 :203600008091E8008E7F8093E80004C08EB3882309F47EC08091E80080FFF8CFF90185916F :2036200094918093F1009093F100015010402E5F3F4F4F4F5F4F01151105F1F670936E01C0 :2036400060936D0129C0823039F523C08091F200803271F48091E8008E7F8093E80004C07E :203660008EB3882309F454C08091E80080FFF8CF00916D0110916E01C80104D38093F1005B :203680000F5F1F4F10936E0100936D010894E108F108E114F104D1F682E08093010127C0AE :2036A0008091E800877F8093E800809169018093F1001092F1001092F1001092F1008091C7 :2036C00001018093F1001092F10011C08091E800877F8093E8001092690119C08091E800A8 :2036E000877F8093E800809101018093F1008091E8008E7F8093E8000AC08091E800877FE8 :203700008093E8005D9A5C9A82E08093010187D0DF91CF911F910F91FF90EF90DF90CF90F7 :20372000BF90AF909F907F906F905F904F903F902F9008952BD181E085BF15BE089584B779 :20374000877F84BF88E10FB6F89480936000109260000FBE81E085BF82E085BF8AB18063BB :203760008AB98BB180638BB90CC1E9DF789401C080D2809100018823D9F78091680188233D :20378000B9F7D8DFE0916A01F0916B010995FA01923071F0933089F0913029F488E091E04A :2037A00022E130E019C080E090E020E030E014C08AE191E02BE130E00FC0882339F48091B9 :2037C0003501282F30E085E391E006C080913901282F30E089E391E091838083C9010895A0 :2037E0008091EB0081608093EB001092ED006093EC004093ED008091EE00881F8827881FC4 :2038000008951092F4001092F0001092E8001092ED00EBEEF0E080818E7F80830895809162 :203820007F0188238CF403C08EB38823B1F08091E80082FFF9CF8091E8008B7F8093E8004D :2038400008958EB3882349F08091E80080FFF9CF8091E8008E7F8093E80008959C0140915A :203860008501509186014617570718F4F90120E038C06115710511F0AB01F8CF8091E80048 :203880008E7F8093E80040E050E0F0CF8091E80083FF02C081E008958091E80082FD2DC071 :2038A0008EB3882381F18EB3853079F18091E80080FF17C09091F20006C081918093F1000C :2038C000415050409F5F4115510511F09032A8F320E0903209F421E08091E8008E7F8093E6 :2038E000E8004115510591F6222381F606C08EB3882349F08EB3853041F08091E80082FF65 :20390000F6CF80E0089582E0089583E0089554D056D01EBA10927D0184E089BD89B58260DA :2039200089BD09B400FEFDCF8091D800982F9F779093D80080688093D800809163008E7FA5 :20394000809363008091D8008F7D8093D8008091E0008E7F8093E0008091E1008E7F80930E :20396000E1008091E20081608093E2008091E100877F8093E1008091E20088608093E200E1 :203980000895C5DF81E080937E010895C0DFE0EEF0E0808181608083E8EDF0E080818F7788 :2039A00080830AD00CD019BCE3E6F0E080818160808310927E0108951092E200089510927A :2039C000E10008951F920F920FB60F9211242F933F934F935F936F937F938F939F93AF936A :2039E000BF93EF93FF938091E10080FF1BC08091E20080FF17C08091E1008E7F8093E100D9 :203A00008091E2008E7F8093E2008091E20080618093E2008091D80080628093D80019BC5D :203A20001EBA26D18091E10084FF29C08091E20084FF25C084E089BD89B5826089BD09B431 :203A400000FEFDCF8091D8008F7D8093D8008091E1008F7E8093E1008091E2008F7E8093B6 :203A6000E2008091E20081608093E20080917D01882311F481E001C084E08EBBF9D08091B3 :203A8000E10083FF22C08091E20083FF1EC08091E100877F8093E10082E08EBB10927D01D7 :203AA0008091E1008E7F8093E1008091E2008E7F8093E2008091E20080618093E200A1DED6 :203AC00080E060E042E28CDED3D08091E10082FF0AC08091E20082FF06C08091E1008B7FA2 :203AE0008093E100C5D0FF91EF91BF91AF919F918F917F916F915F914F913F912F910F903E :203B00000FBE0F901F9018951F93DF93CF9300D0CDB7DEB7EFE7F1E08091F100819381E050 :203B2000E738F807C9F790917F0180918001853011F1863040F48130B9F0813070F08330B5 :203B400009F081C011C0883009F453C0893009F462C0863009F077C02DC0903809F474C0EE :203B6000923809F070C070C0992309F46DC0923009F069C069C0992309F065C01091810132 :203B80008091E800877F8093E80049DE04C08EB3882309F459C08091E80080FFF8CF812F4F :203BA0008F7711F492E001C093E09EBB80688093E3004AC09058923008F045C080918101D9 :203BC0009091820160918301AE014F5F5F4FDFDDBC010097C9F18091E800877F8093E800FD :203BE00089819A813BDE8091E8008B7F8093E8002BC0903841F58091E800877F8093E800A6 :203C000080917D018093F1008091E8008E7F8093E80005DE19C09923B1F49091810192308E :203C200098F48091E800877F8093E80090937D01F6DD80917D01882311F483E001C084E0C3 :203C40008EBB16D001C040DB8091E80083FF0AC08091EB0080628093EB008091E800877F39 :203C60008093E8000F900F90CF91DF911F91089508958EB3882329F08091E80083FF01C010 :203C800043CF0895F999FECF92BD81BDF89A992780B50895262FF999FECF1FBA92BD81BD4B :203CA00020BD0FB6F894FA9AF99A0FBE01960895F894FFCF01021E948920DCFB12011001FB :203CC00000000020EB03EF2F00000001000109021B0001010080320904000000FE010200CE :203CE0000921030000000C0001040309042C03410054006D0065006700610031003600555C :1C3D00000032002000440046005500200020002000200020002000200000000096 :00000001FF ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/Genuino-COMBINED-dfu-usbserial-atmega16u2-Uno-R3.hex ================================================ :2000000098C00000B1C00000AFC00000ADC00000ABC00000A9C00000A7C00000A5C000009B :20002000A3C00000A1C000009FC00000F6C300009BC4000099C0000097C0000095C0000080 :2000400093C0000091C000008FC000008DC000008BC0000089C0000087C00000C0C1000004 :2000600083C0000081C000007FC000007DC000007BC00000100532051C0632051C06740505 :2000800091051C06E405F6051803470065006E00750069006E006F00200055006E006F0082 :2000A00000003A03410072006400750069006E006F0020004C004C00430020002800770077 :2000C000770077002E00610072006400750069006E006F002E0063006300290000000403EE :2000E000090409023E00020100C03209040000010202010005240001100424020605240609 :200100000001070582030800FF09040100020A000000070504024000010705830240000107 :2001200012011001020000084123430201000102DC0111241FBECFEFD2E0DEBFCDBF11E06B :20014000A0E0B1E0E2E4FFE002C005900D92A631B107D9F712E0A6E1B1E001C01D92AF3239 :20016000B107E1F764D0EBC64BCFFC01E058FF4FA081B1816C93A081B1819D012F5F3F4F0E :20018000318320832E173F0721F412969C938E9311972FB7F894FC01EC57FF4F80818F5FD9 :2001A00080832FBF0895DC01AE57BF4FED91FC91119741911196FC93EE939C0120583F4FE2 :2001C000E217F30711F48D939C932FB7F894FC01EC57FF4F9081915090832FBF842F089595 :2001E00084B7877F84BF88E10FB6F89480936000109260000FBE87E690E09093CD0080939F :20020000CC0086E08093CA001092C80088E18093C900539A5A9A8AB180638AB98BB18063BF :200220008BB9F0D284E085BD5F9A579A0895D8DF2FB7F8948EE991E090931F0280931E0203 :2002400090932102809320022FBF2FB7F89489E191E090939A018093990190939C018093AA :200260009B012FBF7894D3E09FB7F894809122029FBF803849F080E091E00ED697FD04C0C2 :20028000682F8EE991E071DF8FB7F894C0919D018FBFA89902C0C13658F1A89A80919D014C :2002A000882319F05D98D0931601CC2349F089E191E079DF682F80E091E093D5C150F5CF1B :2002C00080911601882341F080911601815080931601811101C05D9A80911701882341F0A8 :2002E00080911701815080931701811101C05C9A9FB7F894809122029FBF882361F08EE9A8 :2003000091E051DF9091C80095FFFCCF8093CE005C98D093170180E091E0B0D59AD4A4CF6D :2003200080E091E011C580E091E0A5C41F93CF93DF93EC018C89813031F0823011F010E0DF :2003400003C010E201C010E38B89823009F418608D89873031F0883031F0863029F41260ED :2003600003C0146001C016601092C9001092C8001092CA002F85388949895A89211581EEFF :2003800038074105510571F0CA01B901969587957795679560587B47814E9F4FA8D5215028 :2003A000310902C020E130E03093CD002093CC001093CA008F859889A989BA898115914E95 :2003C000A105B10511F480E001C082E08093C80088E98093C900DF91CF911F9108951F9243 :2003E0000F920FB60F9211242F933F934F935F936F937F938F939F93AF93BF93EF93FF9349 :200400006091CE008EB3843019F489E191E0ADDEFF91EF91BF91AF919F918F917F916F91B5 :200420005F914F913F912F910F900FBE0F901F901895FC01858580FF02C05F9808955F9A20 :200440000895292F33272230310559F02330310569F021303105F9F482E190E020E231E040 :200460001EC08EE390E022EE30E019C099278130910541F08230910541F0892B61F4EEED2F :20048000F0E005C0E2EAF0E002C0E8E8F0E0849190E09F0104C080E090E020E030E0FA0105 :2004A00031832083089528E030E040E02817390720F44F5F220F331FF9CF842F8295807FBB :2004C00008958093E900EBEEF0E0808181608083EDEEF0E010826093EC0040838091EE0017 :2004E000881F8827881F08951092F40080E08093E9001092F0001092E8001092ED009091A4 :20050000EB009E7F9093EB008F5F853081F708958091270287FD05C08091E80080FF0DC045 :2005200010C08091E80082FD04C08EB38111F9CF08958091E8008B7707C08EB38111ECCF27 :2005400008958091E8008E778093E800089585E69091EC0090FF05C09091E80090FF05C03F :200560001BC09091E80092FD17C09EB39923B1F09EB39530A9F09091EB0095FD13C0909142 :20058000E10092FFE5CF9091E1009B7F9093E1008150F1F684E0089580E0089582E0089560 :2005A00083E0089581E0089520912D0230912E022617370748F06115710539F42091E80007 :2005C0002E772093E80001C0B90130E06115710591F12091E80023FD38C02091E80022FF77 :2005E00006C08091E80082FF29C080E008952EB3222369F12EB3253061F12091E80020FF15 :20060000E5CF2091F200FC01CF016115710549F0283038F481918093F100615071092F5F3E :20062000F3CF31E0283009F030E02091E8002E772093E800CBCF3111CCCFD3CF8EB38823A8 :2006400031F08EB3853069F604C081E0089582E0089583E0089520912D0230912E02261755 :20066000370748F06115710539F42091E8002E772093E80001C0B90130E06115710599F111 :200680002091E80023FD39C02091E80022FF06C08091E80082FF2AC080E008952EB32223A1 :2006A00071F12EB3253069F12091E80020FFE5CF2091F200FC01CF016115710551F02830E7 :2006C00040F484918093F100615071092F5F3196F2CF31E0283009F030E02091E8002E77DC :2006E0002093E800CACF3111CBCFD2CF8EB3882331F08EB3853061F604C081E0089582E0CB :20070000089583E008956115710529F42091E8002B772093E8006115710549F12091E8009E :2007200023FD2AC02EB3222359F12EB3253051F12091E80022FFF2CFFC018091F2008823A1 :2007400071F09F012F5F3F4FC9014091F10040836150710961157105C9F2F901EECFCF01D4 :20076000D5CF8EB3882361F08EB3853059F08091E80080FFF6CF02C081E0089580E008955F :2007800082E0089583E0089542D044D01EBA10922502109224021092230284E089BD89B51C :2007A000826089BD09B400FEFDCF8091D800982F9F779093D80080688093D8008091630082 :2007C0008E7F809363008091D8008F7D8093D8008091E0008E7F8093E0008091E1008E7FC6 :2007E0008093E1008091E20081608093E2008091E100877F8093E1008091E2008860809362 :20080000E2000895C1DF81E08093260208951092E20008951092E10008951F920F920FB628 :200820000F9211242F933F934F935F936F937F938F939F93AF93BF93EF93FF938091E10078 :2008400080FF1BC08091E20080FF17C08091E1008E7F8093E1008091E2008E7F8093E2000D :200860008091E20080618093E2008091D80080628093D80019BC1EBAEBD18091E10084FF1B :2008800029C08091E20084FF25C084E089BD89B5826089BD09B400FEFDCF8091D8008F7D88 :2008A0008093D8008091E1008F7E8093E1008091E2008F7E8093E2008091E200816080937E :2008C000E20080912502882311F084E001C081E08EBBBED18091E10083FF27C08091E200A6 :2008E00083FF23C08091E100877F8093E10082E08EBB109225028091E1008E7F8093E10040 :200900008091E2008E7F8093E2008091E20080618093E200E9DD42E060E080E0D2DD8091D1 :20092000F00088608093F00093D18091E10082FF0AC08091E20082FF06C08091E1008B7F05 :200940008093E10085D1FF91EF91BF91AF919F918F917F916F915F914F913F912F910F904E :200960000FBE0F901F9018951F920F920FB60F9211242F933F934F935F936F937F938F9324 :200980009F93AF93BF93CF93EF93FF93E9EEF0E0C081C7701082E0EFF0E08081877F8083C1 :2009A00078941CD0F894E9EEF0E01082A0EFB0E08C9188608C93C083FF91EF91CF91BF9134 :2009C000AF919F918F917F916F915F914F913F912F910F900FBE0F901F9018951F93CF939C :2009E000DF93CDB7DEB7AA970FB6F894DEBF0FBECDBFE7E2F2E08091F100819322E0EF3210 :200A0000F207C9F72091270230912802832F90E08A30910508F010C1FC01E65CFF4F89C245 :200A2000203881F0223809F007C180912B0287708093E9008091EB0085FB882780F910925B :200A4000E90006C08091230290912402911182609091E800977F9093E8008093F100109216 :200A6000F100BDC0822F8D7F09F0E6C0222319F0223061F0D2C080912902813009F0CDC0B6 :200A8000333009F080E08093240228C080912902811124C020912B02277009F4BEC0209324 :200AA000E9008091EB0080FFB8C08091EB00333011F4806211C080618093EB0081E090E093 :200AC000022E01C0880F0A94EAF78093EA001092EA008091EB0088608093EB001092E90019 :200AE0008091E800877F7EC02111A6C0109129028091E800877F8093E8000ADD8091E8007B :200B000080FD04C08EB38111F9CF87C0812F8F7711F093E001C092E09EBB80688093E3001E :200B20007CC02058223008F087C08091290290912A028C3D23E0920781F583E08A838AE230 :200B400089834FB7F894DE01139620E03EE051E2E32FF0E050935700E49120FF03C0E29534 :200B6000EF703F5FEF7090E39E0F9A3310F0E95C01C0E92F8E2F90E08D939D932F5F2431AE :200B800039F74FBF8091E800877F8093E8006AE270E0CE01019608DD11C0AE014F5F5F4F5A :200BA00060912B024EDC0097C1F12091E800277F2093E800BC0189819A814DDD8091E800C5 :200BC0008B778093E80029C02038B1F58091E800877F8093E800809125028093F1008091EA :200BE000E8008E778093E80093DC17C0211124C090912902923088F48091E800877F809315 :200C0000E8009093250284DC80912502882311F084E001C083E08EBB83DB8091E80083FFB4 :200C20000DC08091EB0080628093EB008091E800877F8093E80002C076DBEFCFAA960FB63B :200C4000F894DEBF0FBECDBFDF91CF911F9108950895CF938EB3882359F0C091E900C77050 :200C60001092E9008091E80083FDB8DEC093E900CF9108950895CF93DF93EC018091E8004A :200C800083FF5FC0888190E020912B0230912C022817390709F055C080912802813249F0B9 :200CA00018F48032C9F04DC0823261F18332C9F148C080912702813A09F043C08091E80049 :200CC000877F8093E80067E070E0CE010F966CDC8091E8008B7713C080912702813289F587 :200CE0008091E800877F8093E80067E070E0CE010F9609DDCE011ADB8091E8008E77809334 :200D0000E8001FC0809127028132D9F48091E800877F8093E800809129028D87CE0189DBD5 :200D20000DC080912702813261F48091E800877F8093E80060912902CE019CDFDF91CF9174 :200D4000E7CBDF91CF9108950F931F93CF93DF93EC01FC013D9689E0DF011D928A95E9F798 :200D60002A813B818C81882311F014E001C010E00981C90198DB412F482B426061E8802F6A :200D8000A0DB882341F12E813F818885882311F014E001C010E00D81C90185DB412F482B93 :200DA000426060E8802F8DDB8823A9F02A853B858C85882311F014E001C010E0C985C90105 :200DC00072DB412F482B426061EC8C2FDF91CF911F910F9176CB80E0DF91CF911F910F9158 :200DE0000895CF93C62F2EB32430E9F4FC014785508961897289452B462B472BA1F0818180 :200E00008093E9008091E80085FF04C0C093F10080E00AC08091E8008E778093E80097DBBC :200E20008823A1F301C082E0CF9108952EB3243019F5FC014785508961897289452B462BA8 :200E4000472BD1F081818093E9008091F200882389F09091E8008091E8008E778093E80038 :200E600095FD08C074DB811108C08091E8008E778093E80080E0089582E008952EB3243045 :200E800051F4FC014785508961897289452B462B472B09F0CBCF08952EB3243019F08FEF47 :200EA0009FEF0895FC014785508961897289452B462B472BA1F385818093E9008091E8009E :200EC00082FFEDCF8091F200882321F02091F10030E002C02FEF3FEF8091F200811105C0FC :200EE0008091E8008B778093E800C9010895A1E21A2EAA1BBB1BFD010DC0AA1FBB1FEE1FB4 :200F0000FF1FA217B307E407F50720F0A21BB30BE40BF50B661F771F881F991F1A9469F757 :200F200060957095809590959B01AC01BD01CF010895EE0FFF1F0590F491E02D0994F8949E :200F4000FFCF00034000000440000002080000000000000000000000FFFFFFFFFFFFFFFF3A :200F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :200F800020F0A21BB30BE40BF50B661F771F881F991F1A9469F760957095809590959B017F :200FA000AC01BD01CF010895F894FFCF00034000000440000002080000000000000000006E :200FC0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F :200FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :20100000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 :20102000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 :20104000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 :20106000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 :20108000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 :2010A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 :2010C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 :2010E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 :20110000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF :20112000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF :20114000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF :20116000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F :20118000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F :2011A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F :2011C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F :2011E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F :20120000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE :20122000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE :20124000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE :20126000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E :20128000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E :2012A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E :2012C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E :2012E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :20130000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :20132000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20134000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20136000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :20138000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :2013A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :2013C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :2013E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :20140000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :20142000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :20144000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :20146000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :20148000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :2014A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :2014C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :2014E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :20150000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :20152000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :20154000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :20156000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :20158000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :2015A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :2015C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :2015E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :20160000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :20162000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :20164000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :20166000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :20168000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :2016A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :2016C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :2016E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :20170000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :20172000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :20174000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :20176000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :20178000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :2017A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :2017C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :2017E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :20180000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :20182000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :20184000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :20186000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :20188000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :2018A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :2018C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :2018E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :20190000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :20192000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :20194000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :20196000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :20198000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :2019A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :2019C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :2019E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :201A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :201A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :201A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :201A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :201A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :201AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :201AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :201AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :201B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :201B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :201B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :201B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :201B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :201BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :201BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :201BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :201C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :201C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :201C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :201C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :201C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :201CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :201CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :201CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :201D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :201D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :201D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :201D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :201D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :201DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :201DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :201DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :201E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :201E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :201E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :201E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :201E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :201EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :201EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :201EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :201F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :201F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :201F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :201F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :201F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :201FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :201FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :201FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :20200000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 :20202000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 :20204000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 :20206000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :20208000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :2020A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :2020C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :2020E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :20210000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :20212000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :20214000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :20216000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :20218000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :2021A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :2021C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :2021E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :20220000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :20222000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :20224000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20226000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :20228000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :2022A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :2022C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :2022E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :20230000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :20232000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :20234000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :20236000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :20238000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :2023A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :2023C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :2023E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :20240000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :20242000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :20244000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :20246000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :20248000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :2024A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :2024C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :2024E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :20250000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :20252000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :20254000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :20256000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :20258000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :2025A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :2025C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :2025E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :20260000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :20262000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :20264000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :20266000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :20268000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :2026A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :2026C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :2026E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :20270000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :20272000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :20274000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :20276000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :20278000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :2027A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :2027C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :2027E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :20280000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :20282000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :20284000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :20286000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :20288000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :2028A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :2028C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :2028E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :20290000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :20292000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :20294000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :20296000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :20298000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :2029A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :2029C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :2029E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :202A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :202A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :202A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :202A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :202A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :202AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :202AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :202AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :202B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :202B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :202B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :202B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :202B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :202BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :202BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :202BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :202C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :202C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :202C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :202C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :202C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :202CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :202CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :202CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :202D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :202D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :202D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :202D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :202D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :202DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :202DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :202DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :202E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :202E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :202E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :202E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :202E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :202EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :202EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :202EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :202F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :202F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :202F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :202F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :202F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :202FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :202FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :202FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :203000004BC0000064C0000062C0000060C000005EC000005CC000005AC0000058C00000D3 :2030200056C0000054C0000052C00000CBC400004EC000004CC000004AC0000048C0000099 :2030400046C0000044C0000042C0000040C000003EC000003CC000003AC0000038C0000078 :2030600036C0000034C0000032C0000030C000002EC000002CC000002AC0000028C00000D8 :2030800026C0000024C0000022C0000020C000001EC000001CC0000011241FBECFEFD2E068 :2030A000DEBFCDBF11E0A0E0B1E0E4EBFCE302C005900D92A836B107D9F711E0A8E6B1E0CB :2030C00001C01D92A738B107E1F74FD3F1C598CF982F15C08091F200882371F48091E8002A :2030E0008B7F8093E80003C08EB3882351F08091E80082FFF9CF02C08091F1009150992338 :2031000049F708952091760130917501809174019091730180936D0190936E01C901809368 :203120006F0190937001089580917101843009F45AC0853030F4813059F0833009F0C3C09E :203140001FC0853009F4A0C0863009F0BCC0AFC080917201823008F0B6C0D4DF8091720109 :20316000882361F480916D0190916E0123E0FC0120935700E89507B600FCFDCF85E008C007 :2031800080917201882311F0823029F4BBDF89E0809301010895813009F095C020E030E06C :2031A00040E050E0F90184918F3F81F0CA01AA27BB2780936C0130936E0120936D018AE0B6 :2031C0008093010185E08093690108952F5F3F4F4F4F5F4F2030F0E33F07F0E04F07F0E094 :2031E0005F0701F7089580917201833051F581E0809368018091770190917801892B71F042 :2032000080917301813009F05EC0809176019091750190936B0180936A0108958091730113 :20322000882361F42CE088E190E00FB6F894A895809360000FBE2093600008951092000188 :203240000895882309F03FC0809173018F3F09F03AC0E0E0F0E093E085E090935700E89589 :2032600007B600FCFDCF80935700E89507B600FCFDCFE058FF4F20E3E030F20771F781E101 :2032800080935700E8950895E091730180917201882321F4F0E0EB5FFE4F05C0813099F417 :2032A000F0E0EE52FF4F808180937C01089580917201833041F480917301882321F48091C0 :2032C000740180936C0108952F923F924F925F926F927F929F92AF92BF92CF92DF92EF92D0 :2032E000FF920F931F93CF93DF938091850190918601909378018093770180917901882379 :2033000051F08091790181508093790180917901882309F45D9A80917A01882351F08091D0 :203320007A01815080937A0180917A01882309F45C9A80918001833009F4B2C1843030F4FC :20334000813071F0823009F0E3C111C1853009F4C5C1853008F4BAC1863009F0D9C1CDC1FF :203360005C9883E080937A018091E800877F8093E80080916801882329F0D6DE5D9A5C9A8F :203380001092680120917701309178012115310529F42AC08EB3882309F4BAC18091E800EF :2033A00082FFF8CF8091F10080937101215030403093780120937701E2E7F1E00CC080917F :2033C000F10081932150304081E0E737F80719F43183208308C08091F200882381F7309374 :2033E000780120937701A0DE80910101853009F0BAC08091770190917801892B21F482E022 :2034000080930101B0C08AE163DE80916D018F715FDEC0916F01D091700120916D0130914C :203420006E0121968E01021B130B219780917201882309F093C0180136942794C901A091D0 :203440006C01B0E09C01AD0162E0E62EF12C012D112DE20EF31E041F151F59016A0190E0B8 :2034600099249394B5E0A3E048C08091F200882371F48091E8008B7F8093E80004C08EB332 :20348000882309F445C18091E80082FFF8CF0894210831088091F100682F8091F100782FFD :2034A000F5010B0190925700E89511249F5F903419F021143104A1F4F901B0935700E89504 :2034C00007B600FCFDCF2114310451F0F701A0935700E89507B600FCFDCFA801970190E087 :2034E00042E0442E512C612C712CE40CF51C061D171DA40CB51CC61CD71C2114310409F080 :20350000B4CFD0936E01C0936D0181E180935700E89527C08091F200882371F48091E80059 :203520008B7F8093E80004C08EB3882309F4F0C08091E80082FFF8CF6091F10080916D0187 :2035400090916E01A7D380916D0190916E01019690936E0180936D010150104001151105DB :20356000C9F680E1B5DD8091E8008B7FC3C08091E800877F8093E8005D9883E08093790134 :2035800004C08EB3882309F4C3C08091E80080FFF8CF80910101893091F08A3069F4809147 :2035A0007201813049F480916D0190916E018093F1009093F1009BC080917C0196C0609153 :2035C0006F017091700120916D0130916E016F5F7F4F7B01E21AF30A6150704080917201C4 :2035E000882389F5870116950795C901A0916C01B0E09C01AD011FC08091F200803271F497 :203600008091E8008E7F8093E80004C08EB3882309F47EC08091E80080FFF8CFF90185916F :2036200094918093F1009093F100015010402E5F3F4F4F4F5F4F01151105F1F670936E01C0 :2036400060936D0129C0823039F523C08091F200803271F48091E8008E7F8093E80004C07E :203660008EB3882309F454C08091E80080FFF8CF00916D0110916E01C80104D38093F1005B :203680000F5F1F4F10936E0100936D010894E108F108E114F104D1F682E08093010127C0AE :2036A0008091E800877F8093E800809169018093F1001092F1001092F1001092F1008091C7 :2036C00001018093F1001092F10011C08091E800877F8093E8001092690119C08091E800A8 :2036E000877F8093E800809101018093F1008091E8008E7F8093E8000AC08091E800877FE8 :203700008093E8005D9A5C9A82E08093010187D0DF91CF911F910F91FF90EF90DF90CF90F7 :20372000BF90AF909F907F906F905F904F903F902F9008952BD181E085BF15BE089584B779 :20374000877F84BF88E10FB6F89480936000109260000FBE81E085BF82E085BF8AB18063BB :203760008AB98BB180638BB90CC1E9DF789401C080D2809100018823D9F78091680188233D :20378000B9F7D8DFE0916A01F0916B010995FA01923071F0933089F0913029F488E091E04A :2037A00022E130E019C080E090E020E030E014C08AE191E02BE130E00FC0882339F48091B9 :2037C0003501282F30E085E391E006C080913901282F30E089E391E091838083C9010895A0 :2037E0008091EB0081608093EB001092ED006093EC004093ED008091EE00881F8827881FC4 :2038000008951092F4001092F0001092E8001092ED00EBEEF0E080818E7F80830895809162 :203820007F0188238CF403C08EB38823B1F08091E80082FFF9CF8091E8008B7F8093E8004D :2038400008958EB3882349F08091E80080FFF9CF8091E8008E7F8093E80008959C0140915A :203860008501509186014617570718F4F90120E038C06115710511F0AB01F8CF8091E80048 :203880008E7F8093E80040E050E0F0CF8091E80083FF02C081E008958091E80082FD2DC071 :2038A0008EB3882381F18EB3853079F18091E80080FF17C09091F20006C081918093F1000C :2038C000415050409F5F4115510511F09032A8F320E0903209F421E08091E8008E7F8093E6 :2038E000E8004115510591F6222381F606C08EB3882349F08EB3853041F08091E80082FF65 :20390000F6CF80E0089582E0089583E0089554D056D01EBA10927D0184E089BD89B58260DA :2039200089BD09B400FEFDCF8091D800982F9F779093D80080688093D800809163008E7FA5 :20394000809363008091D8008F7D8093D8008091E0008E7F8093E0008091E1008E7F80930E :20396000E1008091E20081608093E2008091E100877F8093E1008091E20088608093E200E1 :203980000895C5DF81E080937E010895C0DFE0EEF0E0808181608083E8EDF0E080818F7788 :2039A00080830AD00CD019BCE3E6F0E080818160808310927E0108951092E200089510927A :2039C000E10008951F920F920FB60F9211242F933F934F935F936F937F938F939F93AF936A :2039E000BF93EF93FF938091E10080FF1BC08091E20080FF17C08091E1008E7F8093E100D9 :203A00008091E2008E7F8093E2008091E20080618093E2008091D80080628093D80019BC5D :203A20001EBA26D18091E10084FF29C08091E20084FF25C084E089BD89B5826089BD09B431 :203A400000FEFDCF8091D8008F7D8093D8008091E1008F7E8093E1008091E2008F7E8093B6 :203A6000E2008091E20081608093E20080917D01882311F481E001C084E08EBBF9D08091B3 :203A8000E10083FF22C08091E20083FF1EC08091E100877F8093E10082E08EBB10927D01D7 :203AA0008091E1008E7F8093E1008091E2008E7F8093E2008091E20080618093E200A1DED6 :203AC00080E060E042E28CDED3D08091E10082FF0AC08091E20082FF06C08091E1008B7FA2 :203AE0008093E100C5D0FF91EF91BF91AF919F918F917F916F915F914F913F912F910F903E :203B00000FBE0F901F9018951F93DF93CF9300D0CDB7DEB7EFE7F1E08091F100819381E050 :203B2000E738F807C9F790917F0180918001853011F1863040F48130B9F0813070F08330B5 :203B400009F081C011C0883009F453C0893009F462C0863009F077C02DC0903809F474C0EE :203B6000923809F070C070C0992309F46DC0923009F069C069C0992309F065C01091810132 :203B80008091E800877F8093E80049DE04C08EB3882309F459C08091E80080FFF8CF812F4F :203BA0008F7711F492E001C093E09EBB80688093E3004AC09058923008F045C080918101D9 :203BC0009091820160918301AE014F5F5F4FDFDDBC010097C9F18091E800877F8093E800FD :203BE00089819A813BDE8091E8008B7F8093E8002BC0903841F58091E800877F8093E800A6 :203C000080917D018093F1008091E8008E7F8093E80005DE19C09923B1F49091810192308E :203C200098F48091E800877F8093E80090937D01F6DD80917D01882311F483E001C084E0C3 :203C40008EBB16D001C040DB8091E80083FF0AC08091EB0080628093EB008091E800877F39 :203C60008093E8000F900F90CF91DF911F91089508958EB3882329F08091E80083FF01C010 :203C800043CF0895F999FECF92BD81BDF89A992780B50895262FF999FECF1FBA92BD81BD4B :203CA00020BD0FB6F894FA9AF99A0FBE01960895F894FFCF01021E948920DCFB12011001FB :203CC00000000020EB03EF2F00000001000109021B0001010080320904000000FE010200CE :203CE0000921030000000C0001040309042C03410054006D0065006700610031003600555C :1C3D00000032002000440046005500200020002000200020002000200000000096 :00000001FF ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/MEGA-dfu_and_usbserial_combined.hex ================================================ :20000000A2C00000BBC00000B9C00000B7C00000B5C00000B3C00000B1C00000AFC000004B :20002000ADC00000ABC00000A9C000005AC400001EC40000A3C00000A1C000009FC000005C :200040009DC000009BC0000099C0000097C0000095C0000093C0000091C0000014C100006A :200060008DC000008BC0000089C0000087C0000085C0000083C0000081C000007FC0000050 :200080007DC000007BC0000079C0000077C0000075C0000073C000001201100102000008E2 :2000A0004123100001000102DC0109023E00020100C0320904000001020201000524000170 :2000C00010042402060524060001070582030800FF09040100020A000000070504024000AC :2000E0000107058302400001040309043203410072006400750069006E006F0020002800CA :200100007700770077002E00610072006400750069006E006F002E0063006300290000003D :200120002403410072006400750069006E006F0020004D00650067006100200032003500A5 :2001400036003000000011241FBECFEFD2E0DEBFCDBF11E0A0E0B1E0E0EDFFE002C0059089 :200160000D92A631B107D9F712E0A6E1B1E001C01D92AF32B107E1F7F1D028C741CF9C0139 :20018000DC01AE57BF4FED91FC91119741911196FC93EE9380589F4FE817F90711F42D93A9 :2001A0003C939FB7F894F901EC57FF4F8081815080839FBF842F0895DF92EF92FF920F935B :2001C0001F93FC018489813019F0823021F405C040E3D42E04C0DD2402C030E2D32E838952 :2001E000823011F488E0D82A8589873031F0883031F0863031F482E003C084E001C086E094 :20020000D82A1092C9001092C8001092CA00E784F0880189128980E0E81681EEF80680E068 :20022000080780E0180719F420E130E00FC0C801B701969587957795679560587B47814E2A :200240009F4FA8019701A0D6215030403093CD002093CC00D092CA0080E0E81681EEF80612 :2002600080E0080780E0180711F082E001C080E08093C80088E98093C9001F910F91FF9005 :20028000EF90DF9008951F920F920FB60F9211242F938F939F93EF93FF939091CE008EB38C :2002A0008430F1F4E0919901F0919A019083E0919901F0919A01CF01019690939A0180930C :2002C00099018959914021F489E191E0928381839FB7F89480919D018F5F80939D019FBF3A :2002E000FF91EF919F918F912F910F900FBE0F901F901895FC01858580FF02C05F9808959B :200300005F9A089580E091E0D5C580E091E088C584B7877F84BF28E10FB6F89420936000CD :20032000109260000FBE87E690E09093CD008093CC0086E08093CA001092C8002093C90019 :20034000539A5A9A8AB180638AB98BB180638BB983D284E085BD5F9A579A08950F931F9322 :20036000CF93DF93D5DF2FB7F8948EE991E090931F0280931E0290932102809320022FBFBB :200380002FB7F89489E191E090939A018093990190939C0180939B012FBF7894CEE9D1E0D4 :2003A00003E08FB7F894909122028FBF903809F180E091E0ABD497FD1CC0E0911E02F09161 :2003C0001F028083E0911E02F0911F02CF01019690931F0280931E028E51924011F4D283DD :2003E000C1839FB7F894809122028F5F809322029FBF8FB7F89410919D018FBFA89902C0BD :20040000113678F1A89A80919D01882361F05D980093160108C089E191E0B1DE682F80E077 :2004200091E0DAD411501123B1F780911601882351F0809116018150809316018091160101 :20044000882309F45D9A80911701882351F08091170181508093170180911701882309F4F2 :200460005C9A8FB7F894909122028FBF992369F08EE991E084DE982F8091C80085FFFCCFD3 :200480009093CE005C980093170180E091E095D42AD487CFDA01923049F0933061F0913093 :2004A000F9F4E8E9F0E022E130E01EC0EAEAF0E02EE330E019C0813049F0813018F08230CA :2004C00079F408C0E8EEF0E0849107C0ECEEF0E0849103C0E0E2F1E08491282F30E004C010 :2004E000E0E0F0E020E030E0ED93FC93C901089528E030E040E003C04F5F220F331F28177B :200500003907D0F3842F8295807F08958093E9008091EB0081608093EB001092ED00609319 :20052000EC004093ED008091EE00881F8827881F08951092F40090E09093E9001092F000D2 :200540001092E8001092ED008091EB008E7F8093EB009F5F953081F70895809127028823BE :200560008CF403C08EB38823B1F08091E80082FFF9CF8091E8008B778093E80008958EB395 :20058000882349F08091E80080FFF9CF8091E8008E778093E800089594E68091EC0080FFAB :2005A00005C08091E80080FF05C023C08091E80082FD1FC08EB3882311F482E008958EB3CE :2005C000853011F483E008958091EB0085FF02C081E008958091E10082FFDFCF8091E1000E :2005E0008B7F8093E100992311F484E008959150D4CF80E008959C0140912D0250912E020C :200600004617570718F4F90120E038C06115710511F0AB01F8CF8091E8008E778093E800C8 :2006200040E050E0F0CF8091E80083FF02C081E008958091E80082FD2DC08EB3882381F1AD :200640008EB3853079F18091E80080FF17C09091F20006C081918093F100415050409F5FDD :200660004115510511F09830A8F320E0983009F421E08091E8008E778093E80041155105FF :2006800091F6222381F606C08EB3882349F08EB3853041F08091E80082FFF6CF80E00895C9 :2006A00082E0089583E008959C0140912D0250912E024617570710F490E03BC06115710577 :2006C00011F0AB01F9CF8091E8008E778093E80040E050E0F1CF8091E80083FF02C081E0FE :2006E00008958091E80082FD30C08EB3882399F18EB3853091F18091E80080FF1AC08091A4 :20070000F20009C0F9012F5F3F4FE491E093F100415050408F5F4115510511F0883090F338 :2007200090E0883009F491E08091E8008E778093E8004115510579F6992369F606C08EB3ED :20074000882349F08EB3853041F08091E80082FFF6CF80E0089582E0089583E008959C01B6 :200760006115710529F48091E8008B778093E800F90120C08091E80083FF02C081E0089565 :200780008EB3882339F18EB3853031F18091E80082FFF0CF06C08091F100819361507040B5 :2007A00021F08091F2008823B1F78091E8008B778093E80061157105E9F606C08EB388235F :2007C00049F08EB3853041F08091E80080FFF6CF80E0089582E0089583E0089542D044D05A :2007E0001EBA10922502109224021092230284E089BD89B5826089BD09B400FEFDCF809121 :20080000D800982F9F779093D80080688093D800809163008E7F809363008091D8008F7D69 :200820008093D8008091E0008E7F8093E0008091E1008E7F8093E1008091E2008160809302 :20084000E2008091E100877F8093E1008091E20088608093E2000895C1DF81E08093260221 :2008600008951092E20008951092E10008951F920F920FB60F9211241F932F933F934F9385 :200880005F936F937F938F939F93AF93BF93EF93FF93E9EEF0E0108117701082E0EFF0E066 :2008A0008081877F80837894C3D0F894A9EEB0E01C92E0EFF0E08081886080831C93FF9164 :2008C000EF91BF91AF919F918F917F916F915F914F913F912F911F910F900FBE0F901F90DE :2008E00018951F920F920FB60F9211242F933F934F935F936F937F938F939F93AF93BF93FA :20090000EF93FF938091E10080FF1BC08091E20080FF17C08091E1008E7F8093E10080912A :20092000E2008E7F8093E2008091E20080618093E2008091D80080628093D80019BC1EBAA7 :20094000D1D18091E10084FF29C08091E20084FF25C084E089BD89B5826089BD09B400FE71 :20096000FDCF8091D8008F7D8093D8008091E1008F7E8093E1008091E2008F7E8093E200E3 :200980008091E20081608093E20080912502882311F481E001C084E08EBBA4D18091E10070 :2009A00083FF27C08091E20083FF23C08091E100877F8093E10082E08EBB10922502809105 :2009C000E1008E7F8093E1008091E2008E7F8093E2008091E20080618093E200AADD80E090 :2009E00060E042E093DD8091F00088608093F00079D18091E10082FF0AC08091E20082FF3E :200A000006C08091E1008B7F8093E1006BD1FF91EF91BF91AF919F918F917F916F915F91F4 :200A20004F913F912F910F900FBE0F901F9018951F93DF93CF93CDB7DEB7AC970FB6F894AC :200A4000DEBF0FBECDBFE7E2F2E08091F100819322E0EF32F207C9F78091270230912802EE :200A6000353009F487C0363040F43130C9F1313070F0333009F01DC133C0383009F4EFC016 :200A8000393009F4FEC0363009F013C192C0803821F0823809F00DC108C090912302809144 :200AA0002402882399F0926011C080912B0287708093E9008091EB0090E025E09695879530 :200AC0002A95E1F7982F91701092E9008091E800877F8093E8009093F1001092F100CAC001 :200AE000882319F0823009F0E4C090E08F719070009721F0029709F0DDC00CC080912902A4 :200B0000813009F0D7C010922402333069F5809324022AC080912902882331F520912B02FD :200B2000277009F4C7C02093E9008091EB0080FFC1C0333021F48091EB00806213C08091C8 :200B4000EB0080618093EB0081E090E002C0880F991F2A95E2F78093EA001092EA008091B7 :200B6000EB0088608093EB001092E9008091E800877F83C0882309F09CC0109129028091FA :200B8000E800877F8093E800E8DC04C08EB3882309F490C08091E80080FFF8CF812F8F77B6 :200BA00011F492E001C093E09EBB80688093E30081C08058823008F07CC0809129029091F7 :200BC0002A0223E08C3D920799F55FB7F894DE0115964EE020E030E061E2E42FF0E0609373 :200BE0005700849120FF03C082958F704F5F982F9F70892F805D8A3308F0895F8C93119615 :200C00001C9211972F5F3F4F12962431310529F75FBF8AE28B8383E08C838091E800877F06 :200C20008093E800CE0103966AE270E0E4DC11C060912B02AE014F5F5F4F2CDCBC0100979F :200C4000C9F18091E800877F8093E80089819A812BDD8091E8008B778093E8002BC080381A :200C600041F58091E800877F8093E800809125028093F1008091E8008E778093E8006DDCC6 :200C800019C08823B1F490912902923098F48091E800877F8093E800909325025EDC809102 :200CA0002502882311F483E001C084E08EBB2DDB01C028DB8091E80083FF0AC08091EB007F :200CC00080628093EB008091E800877F8093E800AC960FB6F894DEBF0FBECDBFCF91DF91E1 :200CE0001F91089508951F938EB3882361F01091E9001092E9008091E80083FF01C098DE54 :200D000017701093E9001F9108950895FC018EB3843021F587859089A189B2890097A10507 :200D2000B105E1F085818093E9008091E80082FF15C08091F200882319F42FEF3FEF04C010 :200D40008091F100282F30E08091F200882341F48091E8008B778093E80002C02FEF3FEF43 :200D6000C9010895FC018EB3843011F587859089A189B2890097A105B105D1F081818093C1 :200D8000E9008091F2008823A9F09091E8008091E8008E778093E80095FD0CC0FDDB982F24 :200DA000882349F48091E8008E778093E80003C092E001C090E0892F0895FC018EB38430A5 :200DC00051F487859089A189B2890097A105B10511F0CF01C7CF08951F93FC01162F8EB318 :200DE0008430D9F487859089A189B2890097A105B10599F081818093E9008091E80085FDF3 :200E000008C08091E8008E778093E800C5DB882329F41093F10080E001C082E01F91089545 :200E20000F931F93CF93DF93EC010D96FC0189E0DF011D928A95E9F72A813B8109818C8108 :200E4000882311F410E001C014E0C90151DB182B1260802F61E8412F59DB882329F12E8182 :200E60003F810D818885882311F410E001C014E0C9013EDB182B1260802F60E8412F46DBA2 :200E8000882391F02A853B8509858C85882311F410E001C014E0C9012BDB182B1260802F8F :200EA00061EC412F33DB01C080E0DF91CF911F910F910895CF93DF93EC018091E80083FF4D :200EC00060C0888190E020912B0230912C022817390709F056C080912802813261F082322B :200EE00020F4803209F04DC019C0823269F1833209F047C038C080912702813A09F041C0A3 :200F00008091E800877F8093E800CE010F9667E070E071DB8091E8008B7713C08091270278 :200F2000813279F58091E800877F8093E800CE010F9667E070E013DCCE013ED98091E800BD :200F40008E778093E8001DC0809127028132C9F48091E800877F8093E800809129028D87C0 :200F6000CE01C8D90DC080912702813251F48091E800877F8093E800CE0160912902C5DE7A :200F8000ECDADF91CF910895A1E21A2EAA1BBB1BFD010DC0AA1FBB1FEE1FFF1FA217B307AC :200FA000E407F50720F0A21BB30BE40BF50B661F771F881F991F1A9469F760957095809539 :200FC00090959B01AC01BD01CF010895F894FFCF000340000004400000020800000000008D :200FE000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :201000004BC0000064C0000062C0000060C000005EC000005CC000005AC0000058C00000F3 :2010200056C0000054C0000052C00000CBC400004EC000004CC000004AC0000048C00000B9 :2010400046C0000044C0000042C0000040C000003EC000003CC000003AC0000038C0000098 :2010600036C0000034C0000032C0000030C000002EC000002CC000002AC0000028C00000F8 :2010800026C0000024C0000022C0000020C000001EC000001CC0000011241FBECFEFD2E088 :2010A000DEBFCDBF11E0A0E0B1E0E4EBFCE102C005900D92A836B107D9F711E0A8E6B1E0ED :2010C00001C01D92A738B107E1F74FD3F1C598CF982F15C08091F200882371F48091E8004A :2010E0008B7F8093E80003C08EB3882351F08091E80082FFF9CF02C08091F1009150992358 :2011000049F708952091760130917501809174019091730180936D0190936E01C901809388 :201120006F0190937001089580917101843009F45AC0853030F4813059F0833009F0C3C0BE :201140001FC0853009F4A0C0863009F0BCC0AFC080917201823008F0B6C0D4DF8091720129 :20116000882361F480916D0190916E0123E0FC0120935700E89507B600FCFDCF85E008C027 :2011800080917201882311F0823029F4BBDF89E0809301010895813009F095C020E030E08C :2011A00040E050E0F90184918F3F81F0CA01AA27BB2780936C0130936E0120936D018AE0D6 :2011C0008093010185E08093690108952F5F3F4F4F4F5F4F2030F0E13F07F0E04F07F0E0B6 :2011E0005F0701F7089580917201833051F581E0809368018091770190917801892B71F062 :2012000080917301813009F05EC0809176019091750190936B0180936A0108958091730133 :20122000882361F42CE088E190E00FB6F894A895809360000FBE20936000089510920001A8 :201240000895882309F03FC0809173018F3F09F03AC0E0E0F0E093E085E090935700E895A9 :2012600007B600FCFDCF80935700E89507B600FCFDCFE058FF4F20E1E030F20771F781E123 :2012800080935700E8950895E091730180917201882321F4F0E0EB5FFE4F05C0813099F437 :2012A000F0E0EE52FF4F808180937C01089580917201833041F480917301882321F48091E0 :2012C000740180936C0108952F923F924F925F926F927F929F92AF92BF92CF92DF92EF92F0 :2012E000FF920F931F93CF93DF938091850190918601909378018093770180917901882399 :2013000051F08091790181508093790180917901882309F45D9A80917A01882351F08091F0 :201320007A01815080937A0180917A01882309F45C9A80918001833009F4B2C1843030F41C :20134000813071F0823009F0E3C111C1853009F4C5C1853008F4BAC1863009F0D9C1CDC11F :201360005C9883E080937A018091E800877F8093E80080916801882329F0D6DE5D9A5C9AAF :201380001092680120917701309178012115310529F42AC08EB3882309F4BAC18091E8000F :2013A00082FFF8CF8091F10080937101215030403093780120937701E2E7F1E00CC080919F :2013C000F10081932150304081E0E737F80719F43183208308C08091F200882381F7309394 :2013E000780120937701A0DE80910101853009F0BAC08091770190917801892B21F482E042 :2014000080930101B0C08AE163DE80916D018F715FDEC0916F01D091700120916D0130916C :201420006E0121968E01021B130B219780917201882309F093C0180136942794C901A091F0 :201440006C01B0E09C01AD0162E0E62EF12C012D112DE20EF31E041F151F59016A0190E0D8 :2014600099249394B5E0A3E048C08091F200882371F48091E8008B7F8093E80004C08EB352 :20148000882309F445C18091E80082FFF8CF0894210831088091F100682F8091F100782F1D :2014A000F5010B0190925700E89511249F5F903419F021143104A1F4F901B0935700E89524 :2014C00007B600FCFDCF2114310451F0F701A0935700E89507B600FCFDCFA801970190E0A7 :2014E00042E0442E512C612C712CE40CF51C061D171DA40CB51CC61CD71C2114310409F0A0 :20150000B4CFD0936E01C0936D0181E180935700E89527C08091F200882371F48091E80079 :201520008B7F8093E80004C08EB3882309F4F0C08091E80082FFF8CF6091F10080916D01A7 :2015400090916E01A7D380916D0190916E01019690936E0180936D010150104001151105FB :20156000C9F680E1B5DD8091E8008B7FC3C08091E800877F8093E8005D9883E08093790154 :2015800004C08EB3882309F4C3C08091E80080FFF8CF80910101893091F08A3069F4809167 :2015A0007201813049F480916D0190916E018093F1009093F1009BC080917C0196C0609173 :2015C0006F017091700120916D0130916E016F5F7F4F7B01E21AF30A6150704080917201E4 :2015E000882389F5870116950795C901A0916C01B0E09C01AD011FC08091F200803271F4B7 :201600008091E8008E7F8093E80004C08EB3882309F47EC08091E80080FFF8CFF90185918F :2016200094918093F1009093F100015010402E5F3F4F4F4F5F4F01151105F1F670936E01E0 :2016400060936D0129C0823039F523C08091F200803271F48091E8008E7F8093E80004C09E :201660008EB3882309F454C08091E80080FFF8CF00916D0110916E01C80104D38093F1007B :201680000F5F1F4F10936E0100936D010894E108F108E114F104D1F682E08093010127C0CE :2016A0008091E800877F8093E800809169018093F1001092F1001092F1001092F1008091E7 :2016C00001018093F1001092F10011C08091E800877F8093E8001092690119C08091E800C8 :2016E000877F8093E800809101018093F1008091E8008E7F8093E8000AC08091E800877F08 :201700008093E8005D9A5C9A82E08093010187D0DF91CF911F910F91FF90EF90DF90CF9017 :20172000BF90AF909F907F906F905F904F903F902F9008952BD181E085BF15BE089584B799 :20174000877F84BF88E10FB6F89480936000109260000FBE81E085BF82E085BF8AB18063DB :201760008AB98BB180638BB90CC1E9DF789401C080D2809100018823D9F78091680188235D :20178000B9F7D8DFE0916A01F0916B010995FA01923071F0933089F0913029F488E091E06A :2017A00022E130E019C080E090E020E030E014C08AE191E02BE130E00FC0882339F48091D9 :2017C0003501282F30E085E391E006C080913901282F30E089E391E091838083C9010895C0 :2017E0008091EB0081608093EB001092ED006093EC004093ED008091EE00881F8827881FE4 :2018000008951092F4001092F0001092E8001092ED00EBEEF0E080818E7F80830895809182 :201820007F0188238CF403C08EB38823B1F08091E80082FFF9CF8091E8008B7F8093E8006D :2018400008958EB3882349F08091E80080FFF9CF8091E8008E7F8093E80008959C0140917A :201860008501509186014617570718F4F90120E038C06115710511F0AB01F8CF8091E80068 :201880008E7F8093E80040E050E0F0CF8091E80083FF02C081E008958091E80082FD2DC091 :2018A0008EB3882381F18EB3853079F18091E80080FF17C09091F20006C081918093F1002C :2018C000415050409F5F4115510511F09032A8F320E0903209F421E08091E8008E7F809306 :2018E000E8004115510591F6222381F606C08EB3882349F08EB3853041F08091E80082FF85 :20190000F6CF80E0089582E0089583E0089554D056D01EBA10927D0184E089BD89B58260FA :2019200089BD09B400FEFDCF8091D800982F9F779093D80080688093D800809163008E7FC5 :20194000809363008091D8008F7D8093D8008091E0008E7F8093E0008091E1008E7F80932E :20196000E1008091E20081608093E2008091E100877F8093E1008091E20088608093E20001 :201980000895C5DF81E080937E010895C0DFE0EEF0E0808181608083E8EDF0E080818F77A8 :2019A00080830AD00CD019BCE3E6F0E080818160808310927E0108951092E200089510929A :2019C000E10008951F920F920FB60F9211242F933F934F935F936F937F938F939F93AF938A :2019E000BF93EF93FF938091E10080FF1BC08091E20080FF17C08091E1008E7F8093E100F9 :201A00008091E2008E7F8093E2008091E20080618093E2008091D80080628093D80019BC7D :201A20001EBA26D18091E10084FF29C08091E20084FF25C084E089BD89B5826089BD09B451 :201A400000FEFDCF8091D8008F7D8093D8008091E1008F7E8093E1008091E2008F7E8093D6 :201A6000E2008091E20081608093E20080917D01882311F481E001C084E08EBBF9D08091D3 :201A8000E10083FF22C08091E20083FF1EC08091E100877F8093E10082E08EBB10927D01F7 :201AA0008091E1008E7F8093E1008091E2008E7F8093E2008091E20080618093E200A1DEF6 :201AC00080E060E042E28CDED3D08091E10082FF0AC08091E20082FF06C08091E1008B7FC2 :201AE0008093E100C5D0FF91EF91BF91AF919F918F917F916F915F914F913F912F910F905E :201B00000FBE0F901F9018951F93DF93CF9300D0CDB7DEB7EFE7F1E08091F100819381E070 :201B2000E738F807C9F790917F0180918001853011F1863040F48130B9F0813070F08330D5 :201B400009F081C011C0883009F453C0893009F462C0863009F077C02DC0903809F474C00E :201B6000923809F070C070C0992309F46DC0923009F069C069C0992309F065C01091810152 :201B80008091E800877F8093E80049DE04C08EB3882309F459C08091E80080FFF8CF812F6F :201BA0008F7711F492E001C093E09EBB80688093E3004AC09058923008F045C080918101F9 :201BC0009091820160918301AE014F5F5F4FDFDDBC010097C9F18091E800877F8093E8001D :201BE00089819A813BDE8091E8008B7F8093E8002BC0903841F58091E800877F8093E800C6 :201C000080917D018093F1008091E8008E7F8093E80005DE19C09923B1F4909181019230AE :201C200098F48091E800877F8093E80090937D01F6DD80917D01882311F483E001C084E0E3 :201C40008EBB16D001C040DB8091E80083FF0AC08091EB0080628093EB008091E800877F59 :201C60008093E8000F900F90CF91DF911F91089508958EB3882329F08091E80083FF01C030 :201C800043CF0895F999FECF92BD81BDF89A992780B50895262FF999FECF1FBA92BD81BD6B :201CA00020BD0FB6F894FA9AF99A0FBE01960895F894FFCF01021E938220DCFB1201100123 :201CC00000000020EB03F72F00000001000109021B0001010080320904000000FE010200E6 :201CE0000921030000000C0001040309042C03410072006400750069006E006F0020004D28 :1C1D000000650067006100200032003500360030002000440046005500000000AE :00000001FF ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/README.txt ================================================ Arduino Uno and Mega 2560 Firmwares for the ATmega8U2 This directory contains the firmwares used on the ATmega8U2 on the Arduino Uno and Arduino Mega 2560. The arduino-usbdfu directory contains the DFU bootloader on the 8U2; the arduino-usbserial directory contains the actual usb to serial firmware. Both should be compiled against LUFA 100807. The two .hex files in this directory combine the dfu and serial firmwares into a single file to burn onto the 8U2. To burn (Uno): avrdude -p at90usb82 -F -P usb -c avrispmkii -U flash:w:UNO-dfu_and_usbserial_combined.hex -U lfuse:w:0xFF:m -U hfuse:w:0xD9:m -U efuse:w:0xF4:m -U lock:w:0x0F:m To burn (Mega 2560): avrdude -p at90usb82 -F -P usb -c avrispmkii -U flash:w:MEGA-dfu_and_usbserial_combined.hex -U lfuse:w:0xFF:m -U hfuse:w:0xD9:m -U efuse:w:0xF4:m -U lock:w:0x0F:m Note on USB Vendor IDs (VID) and Product IDs (PID): The arduino-usbdfu project uses Atmel's VID and MCU-specific PIDs to maintain compatibility with their FLIP software. The source code to the arduino-usbserial project includes Atmel's VID and a PID donated by them to LUFA. This PID is used in LUFA's USBtoSerial project, which forms the basis for arduino-usbserial. According to the LUFA documentation, this VID/PID combination is: "For use in testing of LUFA powered devices during development only, by non-commercial entities. All devices must accept collisions on this VID/PID range (from other in-development LUFA devices) to be resolved by using a unique release number in the Device Descriptor. No devices using this VID/PID combination may be released to the general public." The production version of the arduino-usbserial firmware uses the Arduino VID. This is only for use with official Arduino hardware and should not be used on other products. ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/UNO-dfu_and_usbserial_combined.hex ================================================ :200000009CC00000B5C00000B3C00000B1C00000AFC00000ADC00000ABC00000A9C000007B :20002000A7C00000A5C00000A3C0000054C4000018C400009DC000009BC0000099C000008C :2000400097C0000095C0000093C0000091C000008FC000008DC000008BC000000EC100009A :2000600087C0000085C0000083C0000081C000007FC000007DC000007BC0000079C0000080 :2000800077C0000075C0000073C0000071C000006FC000006DC00000120110010200000806 :2000A0004123010001000102DC0109023E00020100C032090400000102020100052400017F :2000C00010042402060524060001070582030800FF09040100020A000000070504024000AC :2000E0000107058302400001040309043203410072006400750069006E006F0020002800CA :200100007700770077002E00610072006400750069006E006F002E0063006300290000003D :200120001803410072006400750069006E006F00200055006E006F00000011241FBECFEFB0 :20014000D2E0DEBFCDBF11E0A0E0B1E0E4ECFFE002C005900D92A631B107D9F712E0A6E145 :20016000B1E001C01D92AF32B107E1F7F1D028C747CF9C01DC01AE57BF4FED91FC91119707 :2001800041911196FC93EE9380589F4FE817F90711F42D933C939FB7F894F901EC57FF4F10 :2001A0008081815080839FBF842F0895DF92EF92FF920F931F93FC018489813019F082306F :2001C00021F405C040E3D42E04C0DD2402C030E2D32E8389823011F488E0D82A8589873094 :2001E00031F0883031F0863031F482E003C084E001C086E0D82A1092C9001092C800109201 :20020000CA00E784F0880189128980E0E81681EEF80680E0080780E0180719F420E130E035 :200220000FC0C801B701969587957795679560587B47814E9F4FA8019701A0D62150304050 :200240003093CD002093CC00D092CA0080E0E81681EEF80680E0080780E0180711F082E047 :2002600001C080E08093C80088E98093C9001F910F91FF90EF90DF9008951F920F920FB6B4 :200280000F9211242F938F939F93EF93FF939091CE008EB38430F1F4E0919901F0919A016E :2002A0009083E0919901F0919A01CF01019690939A01809399018959914021F489E191E08F :2002C000928381839FB7F89480919D018F5F80939D019FBFFF91EF919F918F912F910F90B8 :2002E0000FBE0F901F901895FC01858580FF02C05F9808955F9A089580E091E0D5C580E0F9 :2003000091E088C584B7877F84BF28E10FB6F89420936000109260000FBE87E690E090935F :20032000CD008093CC0086E08093CA001092C8002093C900539A5A9A8AB180638AB98BB16A :2003400080638BB983D284E085BD5F9A579A08950F931F93CF93DF93D5DF2FB7F8948EE92F :2003600091E090931F0280931E0290932102809320022FBF2FB7F89489E191E090939A0121 :200380008093990190939C0180939B012FBF7894CEE9D1E003E08FB7F894909122028FBF97 :2003A000903809F180E091E0ABD497FD1CC0E0911E02F0911F028083E0911E02F0911F0252 :2003C000CF01019690931F0280931E028E51924011F4D283C1839FB7F894809122028F5FEB :2003E000809322029FBF8FB7F89410919D018FBFA89902C0113678F1A89A80919D018823BA :2004000061F05D980093160108C089E191E0B1DE682F80E091E0DAD411501123B1F7809156 :200420001601882351F08091160181508093160180911601882309F45D9A809117018823FB :2004400051F08091170181508093170180911701882309F45C9A8FB7F894909122028FBF0A :20046000992369F08EE991E084DE982F8091C80085FFFCCF9093CE005C980093170180E03E :2004800091E095D42AD487CFDA01923049F0933061F09130F9F4E8E9F0E022E130E01EC004 :2004A000EAEAF0E02EE330E019C0813049F0813018F0823079F408C0E8EEF0E0849107C092 :2004C000ECEEF0E0849103C0E0E2F1E08491282F30E004C0E0E0F0E020E030E0ED93FC9318 :2004E000C901089528E030E040E003C04F5F220F331F28173907D0F3842F8295807F0895C1 :200500008093E9008091EB0081608093EB001092ED006093EC004093ED008091EE00881F30 :200520008827881F08951092F40090E09093E9001092F0001092E8001092ED008091EB000F :200540008E7F8093EB009F5F953081F708958091270288238CF403C08EB38823B1F08091F2 :20056000E80082FFF9CF8091E8008B778093E80008958EB3882349F08091E80080FFF9CF52 :200580008091E8008E778093E800089594E68091EC0080FF05C08091E80080FF05C023C0EA :2005A0008091E80082FD1FC08EB3882311F482E008958EB3853011F483E008958091EB00FD :2005C00085FF02C081E008958091E10082FFDFCF8091E1008B7F8093E100992311F484E0A1 :2005E00008959150D4CF80E008959C0140912D0250912E024617570718F4F90120E038C076 :200600006115710511F0AB01F8CF8091E8008E778093E80040E050E0F0CF8091E80083FFF7 :2006200002C081E008958091E80082FD2DC08EB3882381F18EB3853079F18091E80080FF5F :2006400017C09091F20006C081918093F100415050409F5F4115510511F09830A8F320E0A5 :20066000983009F421E08091E8008E778093E8004115510591F6222381F606C08EB388231A :2006800049F08EB3853041F08091E80082FFF6CF80E0089582E0089583E008959C01409151 :2006A0002D0250912E024617570710F490E03BC06115710511F0AB01F9CF8091E8008E7771 :2006C0008093E80040E050E0F1CF8091E80083FF02C081E008958091E80082FD30C08EB32B :2006E000882399F18EB3853091F18091E80080FF1AC08091F20009C0F9012F5F3F4FE491A4 :20070000E093F100415050408F5F4115510511F0883090F390E0883009F491E08091E800EF :200720008E778093E8004115510579F6992369F606C08EB3882349F08EB3853041F0809160 :20074000E80082FFF6CF80E0089582E0089583E008959C016115710529F48091E8008B77CE :200760008093E800F90120C08091E80083FF02C081E008958EB3882339F18EB3853031F13B :200780008091E80082FFF0CF06C08091F10081936150704021F08091F2008823B1F780916B :2007A000E8008B778093E80061157105E9F606C08EB3882349F08EB3853041F08091E8007E :2007C00080FFF6CF80E0089582E0089583E0089542D044D01EBA10922502109224021092A8 :2007E000230284E089BD89B5826089BD09B400FEFDCF8091D800982F9F779093D800806894 :200800008093D800809163008E7F809363008091D8008F7D8093D8008091E0008E7F809305 :20082000E0008091E1008E7F8093E1008091E20081608093E2008091E100877F8093E10030 :200840008091E20088608093E2000895C1DF81E08093260208951092E20008951092E100AE :2008600008951F920F920FB60F9211241F932F933F934F935F936F937F938F939F93AF932A :20088000BF93EF93FF93E9EEF0E0108117701082E0EFF0E08081877F80837894C3D0F894CD :2008A000A9EEB0E01C92E0EFF0E08081886080831C93FF91EF91BF91AF919F918F917F9129 :2008C0006F915F914F913F912F911F910F900FBE0F901F9018951F920F920FB60F921124B4 :2008E0002F933F934F935F936F937F938F939F93AF93BF93EF93FF938091E10080FF1BC034 :200900008091E20080FF17C08091E1008E7F8093E1008091E2008E7F8093E2008091E200B3 :2009200080618093E2008091D80080628093D80019BC1EBAD1D18091E10084FF29C080916D :20094000E20084FF25C084E089BD89B5826089BD09B400FEFDCF8091D8008F7D8093D800D6 :200960008091E1008F7E8093E1008091E2008F7E8093E2008091E20081608093E2008091B5 :200980002502882311F481E001C084E08EBBA4D18091E10083FF27C08091E20083FF23C089 :2009A0008091E100877F8093E10082E08EBB109225028091E1008E7F8093E1008091E200F1 :2009C0008E7F8093E2008091E20080618093E200AADD80E060E042E093DD8091F0008860AA :2009E0008093F00079D18091E10082FF0AC08091E20082FF06C08091E1008B7F8093E10043 :200A00006BD1FF91EF91BF91AF919F918F917F916F915F914F913F912F910F900FBE0F902F :200A20001F9018951F93DF93CF93CDB7DEB7AC970FB6F894DEBF0FBECDBFE7E2F2E0809185 :200A4000F100819322E0EF32F207C9F78091270230912802353009F487C0363040F43130EC :200A6000C9F1313070F0333009F01DC133C0383009F4EFC0393009F4FEC0363009F013C163 :200A800092C0803821F0823809F00DC108C09091230280912402882399F0926011C080916D :200AA0002B0287708093E9008091EB0090E025E0969587952A95E1F7982F91701092E90074 :200AC0008091E800877F8093E8009093F1001092F100CAC0882319F0823009F0E4C090E078 :200AE0008F719070009721F0029709F0DDC00CC080912902813009F0D7C0109224023330AB :200B000069F5809324022AC080912902882331F520912B02277009F4C7C02093E9008091A1 :200B2000EB0080FFC1C0333021F48091EB00806213C08091EB0080618093EB0081E090E0F5 :200B400002C0880F991F2A95E2F78093EA001092EA008091EB0088608093EB001092E900F6 :200B60008091E800877F83C0882309F09CC0109129028091E800877F8093E800E8DC04C0E5 :200B80008EB3882309F490C08091E80080FFF8CF812F8F7711F492E001C093E09EBB80683B :200BA0008093E30081C08058823008F07CC08091290290912A0223E08C3D920799F55FB7AE :200BC000F894DE0115964EE020E030E061E2E42FF0E060935700849120FF03C082958F7044 :200BE0004F5F982F9F70892F805D8A3308F0895F8C9311961C9211972F5F3F4F129624310A :200C0000310529F75FBF8AE28B8383E08C838091E800877F8093E800CE0103966AE270E076 :200C2000E4DC11C060912B02AE014F5F5F4F2CDCBC010097C9F18091E800877F8093E800EA :200C400089819A812BDD8091E8008B778093E8002BC0803841F58091E800877F8093E8009E :200C6000809125028093F1008091E8008E778093E8006DDC19C08823B1F4909129029230BF :200C800098F48091E800877F8093E800909325025EDC80912502882311F483E001C084E0DA :200CA0008EBB2DDB01C028DB8091E80083FF0AC08091EB0080628093EB008091E800877FFF :200CC0008093E800AC960FB6F894DEBF0FBECDBFCF91DF911F91089508951F938EB3882338 :200CE00061F01091E9001092E9008091E80083FF01C098DE17701093E9001F9108950895DF :200D0000FC018EB3843021F587859089A189B2890097A105B105E1F085818093E90080916A :200D2000E80082FF15C08091F200882319F42FEF3FEF04C08091F100282F30E08091F2003E :200D4000882341F48091E8008B778093E80002C02FEF3FEFC9010895FC018EB3843011F550 :200D600087859089A189B2890097A105B105D1F081818093E9008091F2008823A9F09091CF :200D8000E8008091E8008E778093E80095FD0CC0FDDB982F882349F48091E8008E7780937C :200DA000E80003C092E001C090E0892F0895FC018EB3843051F487859089A189B289009738 :200DC000A105B10511F0CF01C7CF08951F93FC01162F8EB38430D9F487859089A189B28973 :200DE0000097A105B10599F081818093E9008091E80085FD08C08091E8008E778093E8003D :200E0000C5DB882329F41093F10080E001C082E01F9108950F931F93CF93DF93EC010D964E :200E2000FC0189E0DF011D928A95E9F72A813B8109818C81882311F410E001C014E0C901A1 :200E400051DB182B1260802F61E8412F59DB882329F12E813F810D818885882311F410E0A6 :200E600001C014E0C9013EDB182B1260802F60E8412F46DB882391F02A853B8509858C8563 :200E8000882311F410E001C014E0C9012BDB182B1260802F61EC412F33DB01C080E0DF916D :200EA000CF911F910F910895CF93DF93EC018091E80083FF60C0888190E020912B02309171 :200EC0002C022817390709F056C080912802813261F0823220F4803209F04DC019C082320A :200EE00069F1833209F047C038C080912702813A09F041C08091E800877F8093E800CE0133 :200F00000F9667E070E071DB8091E8008B7713C080912702813279F58091E800877F80930E :200F2000E800CE010F9667E070E013DCCE013ED98091E8008E778093E8001DC080912702D9 :200F40008132C9F48091E800877F8093E800809129028D87CE01C8D90DC0809127028132AD :200F600051F48091E800877F8093E800CE0160912902C5DEECDADF91CF910895A1E21A2EA6 :200F8000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1FA217B307E407F50720F0A21BB30BE40B49 :200FA000F50B661F771F881F991F1A9469F760957095809590959B01AC01BD01CF01089501 :200FC000F894FFCF00034000000440000002080000000000000000000000FFFFFFFFFFFF2C :200FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :201000004BC0000064C0000062C0000060C000005EC000005CC000005AC0000058C00000F3 :2010200056C0000054C0000052C00000CBC400004EC000004CC000004AC0000048C00000B9 :2010400046C0000044C0000042C0000040C000003EC000003CC000003AC0000038C0000098 :2010600036C0000034C0000032C0000030C000002EC000002CC000002AC0000028C00000F8 :2010800026C0000024C0000022C0000020C000001EC000001CC0000011241FBECFEFD2E088 :2010A000DEBFCDBF11E0A0E0B1E0E4EBFCE102C005900D92AC35B107D9F711E0ACE5B1E0E7 :2010C00001C01D92AB37B107E1F74FD3F1C598CF982F15C08091F200882371F48091E80047 :2010E0008B7F8093E80003C08EB3882351F08091E80082FFF9CF02C08091F1009150992358 :2011000049F7089520916A013091690180916801909167018093610190936201C9018093D0 :20112000630190936401089580916501843009F45AC0853030F4813059F0833009F0C3C0E2 :201140001FC0853009F4A0C0863009F0BCC0AFC080916601823008F0B6C0D4DF8091660141 :20116000882361F4809161019091620123E0FC0120935700E89507B600FCFDCF85E008C03F :2011800080916601882311F0823029F4BBDF89E0809301010895813009F095C020E030E098 :2011A00040E050E0F90184918F3F81F0CA01AA27BB278093600130936201209361018AE0FA :2011C0008093010185E080935D0108952F5F3F4F4F4F5F4F2030F0E13F07F0E04F07F0E0C2 :2011E0005F0701F7089580916601833051F581E080935C0180916B0190916C01892B71F092 :2012000080916701813009F05EC080916A019091690190935F0180935E010895809167017B :20122000882361F42CE088E190E00FB6F894A895809360000FBE20936000089510920001A8 :201240000895882309F03FC0809167018F3F09F03AC0E0E0F0E093E085E090935700E895B5 :2012600007B600FCFDCF80935700E89507B600FCFDCFE058FF4F20E1E030F20771F781E123 :2012800080935700E8950895E091670180916601882321F4F0E0EB5FFE4F05C0813099F44F :2012A000F0E0EE52FF4F808180937001089580916601833041F480916701882321F4809104 :2012C00068018093600108952F923F924F925F926F927F929F92AF92BF92CF92DF92EF9208 :2012E000FF920F931F93CF93DF938091790190917A0190936C0180936B0180916D018823D5 :2013000051F080916D01815080936D0180916D01882309F45D9A80916E01882351F0809120 :201320006E01815080936E0180916E01882309F45C9A80917401833009F4B2C1843030F44C :20134000813071F0823009F0E3C111C1853009F4C5C1853008F4BAC1863009F0D9C1CDC11F :201360005C9883E080936E018091E800877F8093E80080915C01882329F0D6DE5D9A5C9AC7 :2013800010925C0120916B0130916C012115310529F42AC08EB3882309F4BAC18091E80033 :2013A00082FFF8CF8091F100809365012150304030936C0120936B01E6E6F1E00CC08091C0 :2013C000F10081932150304081E0EB36F80719F43183208308C08091F200882381F7309391 :2013E0006C0120936B01A0DE80910101853009F0BAC080916B0190916C01892B21F482E072 :2014000080930101B0C08AE163DE809161018F715FDEC0916301D09164012091610130919C :20142000620121968E01021B130B219780916601882309F093C0180136942794C901A09108 :201440006001B0E09C01AD0162E0E62EF12C012D112DE20EF31E041F151F59016A0190E0E4 :2014600099249394B5E0A3E048C08091F200882371F48091E8008B7F8093E80004C08EB352 :20148000882309F445C18091E80082FFF8CF0894210831088091F100682F8091F100782F1D :2014A000F5010B0190925700E89511249F5F903419F021143104A1F4F901B0935700E89524 :2014C00007B600FCFDCF2114310451F0F701A0935700E89507B600FCFDCFA801970190E0A7 :2014E00042E0442E512C612C712CE40CF51C061D171DA40CB51CC61CD71C2114310409F0A0 :20150000B4CFD0936201C093610181E180935700E89527C08091F200882371F48091E80091 :201520008B7F8093E80004C08EB3882309F4F0C08091E80082FFF8CF6091F10080916101B3 :2015400090916201A7D3809161019091620101969093620180936101015010400115110537 :20156000C9F680E1B5DD8091E8008B7FC3C08091E800877F8093E8005D9883E080936D0160 :2015800004C08EB3882309F4C3C08091E80080FFF8CF80910101893091F08A3069F4809167 :2015A0006601813049F480916101909162018093F1009093F1009BC08091700196C06091A3 :2015C00063017091640120916101309162016F5F7F4F7B01E21AF30A615070408091660120 :2015E000882389F5870116950795C901A0916001B0E09C01AD011FC08091F200803271F4C3 :201600008091E8008E7F8093E80004C08EB3882309F47EC08091E80080FFF8CFF90185918F :2016200094918093F1009093F100015010402E5F3F4F4F4F5F4F01151105F1F670936201EC :201640006093610129C0823039F523C08091F200803271F48091E8008E7F8093E80004C0AA :201660008EB3882309F454C08091E80080FFF8CF0091610110916201C80104D38093F10093 :201680000F5F1F4F10936201009361010894E108F108E114F104D1F682E08093010127C0E6 :2016A0008091E800877F8093E80080915D018093F1001092F1001092F1001092F1008091F3 :2016C00001018093F1001092F10011C08091E800877F8093E80010925D0119C08091E800D4 :2016E000877F8093E800809101018093F1008091E8008E7F8093E8000AC08091E800877F08 :201700008093E8005D9A5C9A82E08093010187D0DF91CF911F910F91FF90EF90DF90CF9017 :20172000BF90AF909F907F906F905F904F903F902F9008952BD181E085BF15BE089584B799 :20174000877F84BF88E10FB6F89480936000109260000FBE81E085BF82E085BF8AB18063DB :201760008AB98BB180638BB90CC1E9DF789401C080D2809100018823D9F780915C01882369 :20178000B9F7D8DFE0915E01F0915F010995FA01923071F0933089F0913029F488E091E082 :2017A00022E130E019C080E090E020E030E014C08AE191E02BE130E00FC0882339F48091D9 :2017C0003501282F30E085E391E006C080913901282F30E089E391E091838083C9010895C0 :2017E0008091EB0081608093EB001092ED006093EC004093ED008091EE00881F8827881FE4 :2018000008951092F4001092F0001092E8001092ED00EBEEF0E080818E7F80830895809182 :20182000730188238CF403C08EB38823B1F08091E80082FFF9CF8091E8008B7F8093E80079 :2018400008958EB3882349F08091E80080FFF9CF8091E8008E7F8093E80008959C0140917A :20186000790150917A014617570718F4F90120E038C06115710511F0AB01F8CF8091E80080 :201880008E7F8093E80040E050E0F0CF8091E80083FF02C081E008958091E80082FD2DC091 :2018A0008EB3882381F18EB3853079F18091E80080FF17C09091F20006C081918093F1002C :2018C000415050409F5F4115510511F09032A8F320E0903209F421E08091E8008E7F809306 :2018E000E8004115510591F6222381F606C08EB3882349F08EB3853041F08091E80082FF85 :20190000F6CF80E0089582E0089583E0089554D056D01EBA1092710184E089BD89B5826006 :2019200089BD09B400FEFDCF8091D800982F9F779093D80080688093D800809163008E7FC5 :20194000809363008091D8008F7D8093D8008091E0008E7F8093E0008091E1008E7F80932E :20196000E1008091E20081608093E2008091E100877F8093E1008091E20088608093E20001 :201980000895C5DF81E0809372010895C0DFE0EEF0E0808181608083E8EDF0E080818F77B4 :2019A00080830AD00CD019BCE3E6F0E08081816080831092720108951092E20008951092A6 :2019C000E10008951F920F920FB60F9211242F933F934F935F936F937F938F939F93AF938A :2019E000BF93EF93FF938091E10080FF1BC08091E20080FF17C08091E1008E7F8093E100F9 :201A00008091E2008E7F8093E2008091E20080618093E2008091D80080628093D80019BC7D :201A20001EBA26D18091E10084FF29C08091E20084FF25C084E089BD89B5826089BD09B451 :201A400000FEFDCF8091D8008F7D8093D8008091E1008F7E8093E1008091E2008F7E8093D6 :201A6000E2008091E20081608093E20080917101882311F481E001C084E08EBBF9D08091DF :201A8000E10083FF22C08091E20083FF1EC08091E100877F8093E10082E08EBB1092710103 :201AA0008091E1008E7F8093E1008091E2008E7F8093E2008091E20080618093E200A1DEF6 :201AC00080E060E042E28CDED3D08091E10082FF0AC08091E20082FF06C08091E1008B7FC2 :201AE0008093E100C5D0FF91EF91BF91AF919F918F917F916F915F914F913F912F910F905E :201B00000FBE0F901F9018951F93DF93CF9300D0CDB7DEB7E3E7F1E08091F100819381E07C :201B2000EB37F807C9F79091730180917401853011F1863040F48130B9F0813070F08330EA :201B400009F081C011C0883009F453C0893009F462C0863009F077C02DC0903809F474C00E :201B6000923809F070C070C0992309F46DC0923009F069C069C0992309F065C0109175015E :201B80008091E800877F8093E80049DE04C08EB3882309F459C08091E80080FFF8CF812F6F :201BA0008F7711F492E001C093E09EBB80688093E3004AC09058923008F045C08091750105 :201BC0009091760160917701AE014F5F5F4FDFDDBC010097C9F18091E800877F8093E80035 :201BE00089819A813BDE8091E8008B7F8093E8002BC0903841F58091E800877F8093E800C6 :201C0000809171018093F1008091E8008E7F8093E80005DE19C09923B1F4909175019230C6 :201C200098F48091E800877F8093E80090937101F6DD80917101882311F483E001C084E0FB :201C40008EBB16D001C040DB8091E80083FF0AC08091EB0080628093EB008091E800877F59 :201C60008093E8000F900F90CF91DF911F91089508958EB3882329F08091E80083FF01C030 :201C800043CF0895F999FECF92BD81BDF89A992780B50895262FF999FECF1FBA92BD81BD6B :201CA00020BD0FB6F894FA9AF99A0FBE01960895F894FFCF01021E938220DCFB1201100123 :201CC00000000020EB03F72F00000001000109021B0001010080320904000000FE010200E6 :201CE0000921030000000C0001040309042003410072006400750069006E006F002000552C :101D0000006E006F002000440046005500000000F7 :00000001FF ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/Arduino-usbdfu.c ================================================ /* LUFA Library Copyright (C) Dean Camera, 2010. dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /** \file * * Main source file for the DFU class bootloader. This file contains the complete bootloader logic. */ #define INCLUDE_FROM_BOOTLOADER_C #include "Arduino-usbdfu.h" /** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run * via a soft reset. When cleared, the bootloader will abort, the USB interface will shut down and the application * jumped to via an indirect jump to location 0x0000 (or other location specified by the host). */ bool RunBootloader = true; /** Flag to indicate if the bootloader is waiting to exit. When the host requests the bootloader to exit and * jump to the application address it specifies, it sends two sequential commands which must be properly * acknowledged. Upon reception of the first the RunBootloader flag is cleared and the WaitForExit flag is set, * causing the bootloader to wait for the final exit command before shutting down. */ bool WaitForExit = false; /** Current DFU state machine state, one of the values in the DFU_State_t enum. */ uint8_t DFU_State = dfuIDLE; /** Status code of the last executed DFU command. This is set to one of the values in the DFU_Status_t enum after * each operation, and returned to the host when a Get Status DFU request is issued. */ uint8_t DFU_Status = OK; /** Data containing the DFU command sent from the host. */ DFU_Command_t SentCommand; /** Response to the last issued Read Data DFU command. Unlike other DFU commands, the read command * requires a single byte response from the bootloader containing the read data when the next DFU_UPLOAD command * is issued by the host. */ uint8_t ResponseByte; /** Pointer to the start of the user application. By default this is 0x0000 (the reset vector), however the host * may specify an alternate address when issuing the application soft-start command. */ AppPtr_t AppStartPtr = (AppPtr_t)0x0000; /** 64-bit flash page number. This is concatenated with the current 16-bit address on USB AVRs containing more than * 64KB of flash memory. */ uint8_t Flash64KBPage = 0; /** Memory start address, indicating the current address in the memory being addressed (either FLASH or EEPROM * depending on the issued command from the host). */ uint16_t StartAddr = 0x0000; /** Memory end address, indicating the end address to read to/write from in the memory being addressed (either FLASH * of EEPROM depending on the issued command from the host). */ uint16_t EndAddr = 0x0000; /** Pulse generation counters to keep track of the number of milliseconds remaining for each pulse type */ volatile struct { uint8_t TxLEDPulse; /**< Milliseconds remaining for data Tx LED pulse */ uint8_t RxLEDPulse; /**< Milliseconds remaining for data Rx LED pulse */ uint8_t PingPongLEDPulse; /**< Milliseconds remaining for enumeration Tx/Rx ping-pong LED pulse */ } PulseMSRemaining; /** Main program entry point. This routine configures the hardware required by the bootloader, then continuously * runs the bootloader processing routine until instructed to soft-exit, or hard-reset via the watchdog to start * the loaded application code. */ int main(void) { /* Configure hardware required by the bootloader */ SetupHardware(); /* Enable global interrupts so that the USB stack can function */ sei(); /* Run the USB management task while the bootloader is supposed to be running */ while (RunBootloader || WaitForExit) USB_USBTask(); /* Reset configured hardware back to their original states for the user application */ ResetHardware(); /* Start the user application */ AppStartPtr(); } /** Configures all hardware required for the bootloader. */ void SetupHardware(void) { /* Disable watchdog if enabled by bootloader/fuses */ MCUSR &= ~(1 << WDRF); wdt_disable(); /* Disable clock division */ // clock_prescale_set(clock_div_1); /* Relocate the interrupt vector table to the bootloader section */ MCUCR = (1 << IVCE); MCUCR = (1 << IVSEL); LEDs_Init(); /* Initialize the USB subsystem */ USB_Init(); } /** Resets all configured hardware required for the bootloader back to their original states. */ void ResetHardware(void) { /* Shut down the USB subsystem */ USB_ShutDown(); /* Relocate the interrupt vector table back to the application section */ MCUCR = (1 << IVCE); MCUCR = 0; } /** Event handler for the USB_UnhandledControlRequest event. This is used to catch standard and class specific * control requests that are not handled internally by the USB library (including the DFU commands, which are * all issued via the control endpoint), so that they can be handled appropriately for the application. */ void EVENT_USB_Device_UnhandledControlRequest(void) { /* Get the size of the command and data from the wLength value */ SentCommand.DataSize = USB_ControlRequest.wLength; /* Turn off TX LED(s) once the TX pulse period has elapsed */ if (PulseMSRemaining.TxLEDPulse && !(--PulseMSRemaining.TxLEDPulse)) LEDs_TurnOffLEDs(LEDMASK_TX); /* Turn off RX LED(s) once the RX pulse period has elapsed */ if (PulseMSRemaining.RxLEDPulse && !(--PulseMSRemaining.RxLEDPulse)) LEDs_TurnOffLEDs(LEDMASK_RX); switch (USB_ControlRequest.bRequest) { case DFU_DNLOAD: LEDs_TurnOnLEDs(LEDMASK_RX); PulseMSRemaining.RxLEDPulse = TX_RX_LED_PULSE_MS; Endpoint_ClearSETUP(); /* Check if bootloader is waiting to terminate */ if (WaitForExit) { /* Bootloader is terminating - process last received command */ ProcessBootloaderCommand(); /* Turn off TX/RX status LEDs so that they're not left on when application starts */ LEDs_TurnOffLEDs(LEDMASK_TX); LEDs_TurnOffLEDs(LEDMASK_RX); /* Indicate that the last command has now been processed - free to exit bootloader */ WaitForExit = false; } /* If the request has a data stage, load it into the command struct */ if (SentCommand.DataSize) { while (!(Endpoint_IsOUTReceived())) { if (USB_DeviceState == DEVICE_STATE_Unattached) return; } /* First byte of the data stage is the DNLOAD request's command */ SentCommand.Command = Endpoint_Read_Byte(); /* One byte of the data stage is the command, so subtract it from the total data bytes */ SentCommand.DataSize--; /* Load in the rest of the data stage as command parameters */ for (uint8_t DataByte = 0; (DataByte < sizeof(SentCommand.Data)) && Endpoint_BytesInEndpoint(); DataByte++) { SentCommand.Data[DataByte] = Endpoint_Read_Byte(); SentCommand.DataSize--; } /* Process the command */ ProcessBootloaderCommand(); } /* Check if currently downloading firmware */ if (DFU_State == dfuDNLOAD_IDLE) { if (!(SentCommand.DataSize)) { DFU_State = dfuIDLE; } else { /* Throw away the filler bytes before the start of the firmware */ DiscardFillerBytes(DFU_FILLER_BYTES_SIZE); /* Throw away the packet alignment filler bytes before the start of the firmware */ DiscardFillerBytes(StartAddr % FIXED_CONTROL_ENDPOINT_SIZE); /* Calculate the number of bytes remaining to be written */ uint16_t BytesRemaining = ((EndAddr - StartAddr) + 1); if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00)) // Write flash { /* Calculate the number of words to be written from the number of bytes to be written */ uint16_t WordsRemaining = (BytesRemaining >> 1); union { uint16_t Words[2]; uint32_t Long; } CurrFlashAddress = {.Words = {StartAddr, Flash64KBPage}}; uint32_t CurrFlashPageStartAddress = CurrFlashAddress.Long; uint8_t WordsInFlashPage = 0; while (WordsRemaining--) { /* Check if endpoint is empty - if so clear it and wait until ready for next packet */ if (!(Endpoint_BytesInEndpoint())) { Endpoint_ClearOUT(); while (!(Endpoint_IsOUTReceived())) { if (USB_DeviceState == DEVICE_STATE_Unattached) return; } } /* Write the next word into the current flash page */ boot_page_fill(CurrFlashAddress.Long, Endpoint_Read_Word_LE()); /* Adjust counters */ WordsInFlashPage += 1; CurrFlashAddress.Long += 2; /* See if an entire page has been written to the flash page buffer */ if ((WordsInFlashPage == (SPM_PAGESIZE >> 1)) || !(WordsRemaining)) { /* Commit the flash page to memory */ boot_page_write(CurrFlashPageStartAddress); boot_spm_busy_wait(); /* Check if programming incomplete */ if (WordsRemaining) { CurrFlashPageStartAddress = CurrFlashAddress.Long; WordsInFlashPage = 0; /* Erase next page's temp buffer */ boot_page_erase(CurrFlashAddress.Long); boot_spm_busy_wait(); } } } /* Once programming complete, start address equals the end address */ StartAddr = EndAddr; /* Re-enable the RWW section of flash */ boot_rww_enable(); } else // Write EEPROM { while (BytesRemaining--) { /* Check if endpoint is empty - if so clear it and wait until ready for next packet */ if (!(Endpoint_BytesInEndpoint())) { Endpoint_ClearOUT(); while (!(Endpoint_IsOUTReceived())) { if (USB_DeviceState == DEVICE_STATE_Unattached) return; } } /* Read the byte from the USB interface and write to to the EEPROM */ eeprom_write_byte((uint8_t*)StartAddr, Endpoint_Read_Byte()); /* Adjust counters */ StartAddr++; } } /* Throw away the currently unused DFU file suffix */ DiscardFillerBytes(DFU_FILE_SUFFIX_SIZE); } } Endpoint_ClearOUT(); Endpoint_ClearStatusStage(); break; case DFU_UPLOAD: Endpoint_ClearSETUP(); LEDs_TurnOnLEDs(LEDMASK_TX); PulseMSRemaining.TxLEDPulse = TX_RX_LED_PULSE_MS; while (!(Endpoint_IsINReady())) { if (USB_DeviceState == DEVICE_STATE_Unattached) return; } if (DFU_State != dfuUPLOAD_IDLE) { if ((DFU_State == dfuERROR) && IS_ONEBYTE_COMMAND(SentCommand.Data, 0x01)) // Blank Check { /* Blank checking is performed in the DFU_DNLOAD request - if we get here we've told the host that the memory isn't blank, and the host is requesting the first non-blank address */ Endpoint_Write_Word_LE(StartAddr); } else { /* Idle state upload - send response to last issued command */ Endpoint_Write_Byte(ResponseByte); } } else { /* Determine the number of bytes remaining in the current block */ uint16_t BytesRemaining = ((EndAddr - StartAddr) + 1); if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00)) // Read FLASH { /* Calculate the number of words to be written from the number of bytes to be written */ uint16_t WordsRemaining = (BytesRemaining >> 1); union { uint16_t Words[2]; uint32_t Long; } CurrFlashAddress = {.Words = {StartAddr, Flash64KBPage}}; while (WordsRemaining--) { /* Check if endpoint is full - if so clear it and wait until ready for next packet */ if (Endpoint_BytesInEndpoint() == FIXED_CONTROL_ENDPOINT_SIZE) { Endpoint_ClearIN(); while (!(Endpoint_IsINReady())) { if (USB_DeviceState == DEVICE_STATE_Unattached) return; } } /* Read the flash word and send it via USB to the host */ #if (FLASHEND > 0xFFFF) Endpoint_Write_Word_LE(pgm_read_word_far(CurrFlashAddress.Long)); #else Endpoint_Write_Word_LE(pgm_read_word(CurrFlashAddress.Long)); #endif /* Adjust counters */ CurrFlashAddress.Long += 2; } /* Once reading is complete, start address equals the end address */ StartAddr = EndAddr; } else if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x02)) // Read EEPROM { while (BytesRemaining--) { /* Check if endpoint is full - if so clear it and wait until ready for next packet */ if (Endpoint_BytesInEndpoint() == FIXED_CONTROL_ENDPOINT_SIZE) { Endpoint_ClearIN(); while (!(Endpoint_IsINReady())) { if (USB_DeviceState == DEVICE_STATE_Unattached) return; } } /* Read the EEPROM byte and send it via USB to the host */ Endpoint_Write_Byte(eeprom_read_byte((uint8_t*)StartAddr)); /* Adjust counters */ StartAddr++; } } /* Return to idle state */ DFU_State = dfuIDLE; } Endpoint_ClearIN(); Endpoint_ClearStatusStage(); break; case DFU_GETSTATUS: Endpoint_ClearSETUP(); /* Write 8-bit status value */ Endpoint_Write_Byte(DFU_Status); /* Write 24-bit poll timeout value */ Endpoint_Write_Byte(0); Endpoint_Write_Word_LE(0); /* Write 8-bit state value */ Endpoint_Write_Byte(DFU_State); /* Write 8-bit state string ID number */ Endpoint_Write_Byte(0); Endpoint_ClearIN(); Endpoint_ClearStatusStage(); break; case DFU_CLRSTATUS: Endpoint_ClearSETUP(); /* Reset the status value variable to the default OK status */ DFU_Status = OK; Endpoint_ClearStatusStage(); break; case DFU_GETSTATE: Endpoint_ClearSETUP(); /* Write the current device state to the endpoint */ Endpoint_Write_Byte(DFU_State); Endpoint_ClearIN(); Endpoint_ClearStatusStage(); break; case DFU_ABORT: Endpoint_ClearSETUP(); /* Turn off TX/RX status LEDs so that they're not left on when application starts */ LEDs_TurnOffLEDs(LEDMASK_TX); LEDs_TurnOffLEDs(LEDMASK_RX); /* Reset the current state variable to the default idle state */ DFU_State = dfuIDLE; Endpoint_ClearStatusStage(); break; } } /** Routine to discard the specified number of bytes from the control endpoint stream. This is used to * discard unused bytes in the stream from the host, including the memory program block suffix. * * \param[in] NumberOfBytes Number of bytes to discard from the host from the control endpoint */ static void DiscardFillerBytes(uint8_t NumberOfBytes) { while (NumberOfBytes--) { if (!(Endpoint_BytesInEndpoint())) { Endpoint_ClearOUT(); /* Wait until next data packet received */ while (!(Endpoint_IsOUTReceived())) { if (USB_DeviceState == DEVICE_STATE_Unattached) return; } } else { Endpoint_Discard_Byte(); } } } /** Routine to process an issued command from the host, via a DFU_DNLOAD request wrapper. This routine ensures * that the command is allowed based on the current secure mode flag value, and passes the command off to the * appropriate handler function. */ static void ProcessBootloaderCommand(void) { /* Check if device is in secure mode */ // if (IsSecure) // { // /* Don't process command unless it is a READ or chip erase command */ // if (!(((SentCommand.Command == COMMAND_WRITE) && // IS_TWOBYTE_COMMAND(SentCommand.Data, 0x00, 0xFF)) || // (SentCommand.Command == COMMAND_READ))) // { // /* Set the state and status variables to indicate the error */ // DFU_State = dfuERROR; // DFU_Status = errWRITE; // // /* Stall command */ // Endpoint_StallTransaction(); // // /* Don't process the command */ // return; // } // } /* Dispatch the required command processing routine based on the command type */ switch (SentCommand.Command) { case COMMAND_PROG_START: ProcessMemProgCommand(); break; case COMMAND_DISP_DATA: ProcessMemReadCommand(); break; case COMMAND_WRITE: ProcessWriteCommand(); break; case COMMAND_READ: ProcessReadCommand(); break; case COMMAND_CHANGE_BASE_ADDR: if (IS_TWOBYTE_COMMAND(SentCommand.Data, 0x03, 0x00)) // Set 64KB flash page command Flash64KBPage = SentCommand.Data[2]; break; } } /** Routine to concatenate the given pair of 16-bit memory start and end addresses from the host, and store them * in the StartAddr and EndAddr global variables. */ static void LoadStartEndAddresses(void) { union { uint8_t Bytes[2]; uint16_t Word; } Address[2] = {{.Bytes = {SentCommand.Data[2], SentCommand.Data[1]}}, {.Bytes = {SentCommand.Data[4], SentCommand.Data[3]}}}; /* Load in the start and ending read addresses from the sent data packet */ StartAddr = Address[0].Word; EndAddr = Address[1].Word; } /** Handler for a Memory Program command issued by the host. This routine handles the preparations needed * to write subsequent data from the host into the specified memory. */ static void ProcessMemProgCommand(void) { if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00) || // Write FLASH command IS_ONEBYTE_COMMAND(SentCommand.Data, 0x01)) // Write EEPROM command { /* Load in the start and ending read addresses */ LoadStartEndAddresses(); /* If FLASH is being written to, we need to pre-erase the first page to write to */ if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00)) { union { uint16_t Words[2]; uint32_t Long; } CurrFlashAddress = {.Words = {StartAddr, Flash64KBPage}}; /* Erase the current page's temp buffer */ boot_page_erase(CurrFlashAddress.Long); boot_spm_busy_wait(); } /* Set the state so that the next DNLOAD requests reads in the firmware */ DFU_State = dfuDNLOAD_IDLE; } } /** Handler for a Memory Read command issued by the host. This routine handles the preparations needed * to read subsequent data from the specified memory out to the host, as well as implementing the memory * blank check command. */ static void ProcessMemReadCommand(void) { if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00) || // Read FLASH command IS_ONEBYTE_COMMAND(SentCommand.Data, 0x02)) // Read EEPROM command { /* Load in the start and ending read addresses */ LoadStartEndAddresses(); /* Set the state so that the next UPLOAD requests read out the firmware */ DFU_State = dfuUPLOAD_IDLE; } else if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x01)) // Blank check FLASH command { uint32_t CurrFlashAddress = 0; while (CurrFlashAddress < BOOT_START_ADDR) { /* Check if the current byte is not blank */ #if (FLASHEND > 0xFFFF) if (pgm_read_byte_far(CurrFlashAddress) != 0xFF) #else if (pgm_read_byte(CurrFlashAddress) != 0xFF) #endif { /* Save the location of the first non-blank byte for response back to the host */ Flash64KBPage = (CurrFlashAddress >> 16); StartAddr = CurrFlashAddress; /* Set state and status variables to the appropriate error values */ DFU_State = dfuERROR; DFU_Status = errCHECK_ERASED; break; } CurrFlashAddress++; } } } /** Handler for a Data Write command issued by the host. This routine handles non-programming commands such as * bootloader exit (both via software jumps and hardware watchdog resets) and flash memory erasure. */ static void ProcessWriteCommand(void) { if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x03)) // Start application { /* Indicate that the bootloader is terminating */ WaitForExit = true; /* Check if data supplied for the Start Program command - no data executes the program */ if (SentCommand.DataSize) { if (SentCommand.Data[1] == 0x01) // Start via jump { union { uint8_t Bytes[2]; AppPtr_t FuncPtr; } Address = {.Bytes = {SentCommand.Data[4], SentCommand.Data[3]}}; /* Load in the jump address into the application start address pointer */ AppStartPtr = Address.FuncPtr; } } else { if (SentCommand.Data[1] == 0x00) // Start via watchdog { /* Start the watchdog to reset the AVR once the communications are finalized */ wdt_enable(WDTO_250MS); } else // Start via jump { /* Set the flag to terminate the bootloader at next opportunity */ RunBootloader = false; } } } else if (IS_TWOBYTE_COMMAND(SentCommand.Data, 0x00, 0xFF)) // Erase flash { uint32_t CurrFlashAddress = 0; /* Clear the application section of flash */ while (CurrFlashAddress < BOOT_START_ADDR) { boot_page_erase(CurrFlashAddress); boot_spm_busy_wait(); boot_page_write(CurrFlashAddress); boot_spm_busy_wait(); CurrFlashAddress += SPM_PAGESIZE; } /* Re-enable the RWW section of flash as writing to the flash locks it out */ boot_rww_enable(); /* Memory has been erased, reset the security bit so that programming/reading is allowed */ // IsSecure = false; } } /** Handler for a Data Read command issued by the host. This routine handles bootloader information retrieval * commands such as device signature and bootloader version retrieval. */ static void ProcessReadCommand(void) { const uint8_t BootloaderInfo[3] = {BOOTLOADER_VERSION, BOOTLOADER_ID_BYTE1, BOOTLOADER_ID_BYTE2}; const uint8_t SignatureInfo[3] = {AVR_SIGNATURE_1, AVR_SIGNATURE_2, AVR_SIGNATURE_3}; uint8_t DataIndexToRead = SentCommand.Data[1]; if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00)) // Read bootloader info ResponseByte = BootloaderInfo[DataIndexToRead]; else if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x01)) // Read signature byte ResponseByte = SignatureInfo[DataIndexToRead - 0x30]; } ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/Arduino-usbdfu.h ================================================ /* LUFA Library Copyright (C) Dean Camera, 2010. dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /** \file * * Header file for Arduino-usbdfu.c. */ #ifndef _ARDUINO_USB_DFU_BOOTLOADER_H_ #define _ARDUINO_USB_DFU_BOOTLOADER_H_ /* Includes: */ #include #include #include #include #include #include #include #include #include "Descriptors.h" #include #include /* Macros: */ /** LED mask for the library LED driver, to indicate TX activity. */ #define LEDMASK_TX LEDS_LED1 /** LED mask for the library LED driver, to indicate RX activity. */ #define LEDMASK_RX LEDS_LED2 /** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ #define LEDMASK_ERROR (LEDS_LED1 | LEDS_LED2) /** LED mask for the library LED driver, to indicate that the USB interface is busy. */ #define LEDMASK_BUSY (LEDS_LED1 | LEDS_LED2) /** Configuration define. Define this token to true to case the bootloader to reject all memory commands * until a memory erase has been performed. When used in conjunction with the lockbits of the AVR, this * can protect the AVR's firmware from being dumped from a secured AVR. When false, memory operations are * allowed at any time. */ // #define SECURE_MODE false /** Major bootloader version number. */ #define BOOTLOADER_VERSION_MINOR 2 /** Minor bootloader version number. */ #define BOOTLOADER_VERSION_REV 0 /** Complete bootloader version number expressed as a packed byte, constructed from the * two individual bootloader version macros. */ #define BOOTLOADER_VERSION ((BOOTLOADER_VERSION_MINOR << 4) | BOOTLOADER_VERSION_REV) /** First byte of the bootloader identification bytes, used to identify a device's bootloader. */ #define BOOTLOADER_ID_BYTE1 0xDC /** Second byte of the bootloader identification bytes, used to identify a device's bootloader. */ #define BOOTLOADER_ID_BYTE2 0xFB /** Convenience macro, used to determine if the issued command is the given one-byte long command. * * \param[in] dataarr Command byte array to check against * \param[in] cb1 First command byte to check */ #define IS_ONEBYTE_COMMAND(dataarr, cb1) (dataarr[0] == (cb1)) /** Convenience macro, used to determine if the issued command is the given two-byte long command. * * \param[in] dataarr Command byte array to check against * \param[in] cb1 First command byte to check * \param[in] cb2 Second command byte to check */ #define IS_TWOBYTE_COMMAND(dataarr, cb1, cb2) ((dataarr[0] == (cb1)) && (dataarr[1] == (cb2))) /** Length of the DFU file suffix block, appended to the end of each complete memory write command. * The DFU file suffix is currently unused (but is designed to give extra file information, such as * a CRC of the complete firmware for error checking) and so is discarded. */ #define DFU_FILE_SUFFIX_SIZE 16 /** Length of the DFU file filler block, appended to the start of each complete memory write command. * Filler bytes are added to the start of each complete memory write command, and must be discarded. */ #define DFU_FILLER_BYTES_SIZE 26 /** DFU class command request to detach from the host. */ #define DFU_DETATCH 0x00 /** DFU class command request to send data from the host to the bootloader. */ #define DFU_DNLOAD 0x01 /** DFU class command request to send data from the bootloader to the host. */ #define DFU_UPLOAD 0x02 /** DFU class command request to get the current DFU status and state from the bootloader. */ #define DFU_GETSTATUS 0x03 /** DFU class command request to reset the current DFU status and state variables to their defaults. */ #define DFU_CLRSTATUS 0x04 /** DFU class command request to get the current DFU state of the bootloader. */ #define DFU_GETSTATE 0x05 /** DFU class command request to abort the current multi-request transfer and return to the dfuIDLE state. */ #define DFU_ABORT 0x06 /** DFU command to begin programming the device's memory. */ #define COMMAND_PROG_START 0x01 /** DFU command to begin reading the device's memory. */ #define COMMAND_DISP_DATA 0x03 /** DFU command to issue a write command. */ #define COMMAND_WRITE 0x04 /** DFU command to issue a read command. */ #define COMMAND_READ 0x05 /** DFU command to issue a memory base address change command, to set the current 64KB flash page * that subsequent flash operations should use. */ #define COMMAND_CHANGE_BASE_ADDR 0x06 /* Type Defines: */ /** Type define for a non-returning function pointer to the loaded application. */ typedef void (*AppPtr_t)(void) ATTR_NO_RETURN; /** Type define for a structure containing a complete DFU command issued by the host. */ typedef struct { uint8_t Command; /**< Single byte command to perform, one of the COMMAND_* macro values */ uint8_t Data[5]; /**< Command parameters */ uint16_t DataSize; /**< Size of the command parameters */ } DFU_Command_t; /* Enums: */ /** DFU bootloader states. Refer to the DFU class specification for information on each state. */ enum DFU_State_t { appIDLE = 0, appDETACH = 1, dfuIDLE = 2, dfuDNLOAD_SYNC = 3, dfuDNBUSY = 4, dfuDNLOAD_IDLE = 5, dfuMANIFEST_SYNC = 6, dfuMANIFEST = 7, dfuMANIFEST_WAIT_RESET = 8, dfuUPLOAD_IDLE = 9, dfuERROR = 10 }; /** DFU command status error codes. Refer to the DFU class specification for information on each error code. */ enum DFU_Status_t { OK = 0, errTARGET = 1, errFILE = 2, errWRITE = 3, errERASE = 4, errCHECK_ERASED = 5, errPROG = 6, errVERIFY = 7, errADDRESS = 8, errNOTDONE = 9, errFIRMWARE = 10, errVENDOR = 11, errUSBR = 12, errPOR = 13, errUNKNOWN = 14, errSTALLEDPKT = 15 }; /* Function Prototypes: */ void SetupHardware(void); void ResetHardware(void); void EVENT_USB_Device_UnhandledControlRequest(void); #if defined(INCLUDE_FROM_BOOTLOADER_C) static void DiscardFillerBytes(uint8_t NumberOfBytes); static void ProcessBootloaderCommand(void); static void LoadStartEndAddresses(void); static void ProcessMemProgCommand(void); static void ProcessMemReadCommand(void); static void ProcessWriteCommand(void); static void ProcessReadCommand(void); #endif #endif /* _ARDUINO_USB_DFU_BOOTLOADER_H_ */ ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/Board/LEDs.h ================================================ /* LUFA Library Copyright (C) Dean Camera, 2010. dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /* Board LEDs driver for the Benito board, from www.dorkbotpdx.org. */ #ifndef __LEDS_ARDUINOUNO_H__ #define __LEDS_ARDUINOUNO_H__ /* Includes: */ #include /* Enable C linkage for C++ Compilers: */ #if defined(__cplusplus) extern "C" { #endif /* Preprocessor Checks: */ #if !defined(INCLUDE_FROM_LEDS_H) #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead. #endif /* Public Interface - May be used in end-application: */ /* Macros: */ /** LED mask for the first LED on the board. */ #define LEDS_LED1 (1 << 5) /** LED mask for the second LED on the board. */ #define LEDS_LED2 (1 << 4) /** LED mask for all the LEDs on the board. */ #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2) /** LED mask for the none of the board LEDs */ #define LEDS_NO_LEDS 0 /* Inline Functions: */ #if !defined(__DOXYGEN__) static inline void LEDs_Init(void) { DDRD |= LEDS_ALL_LEDS; PORTD |= LEDS_ALL_LEDS; } static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) { PORTD &= ~LEDMask; } static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) { PORTD |= LEDMask; } static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) { PORTD = ((PORTD | LEDS_ALL_LEDS) & ~LEDMask); } static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, const uint8_t ActiveMask) { PORTD = ((PORTD | ActiveMask) & ~LEDMask); } static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) { PORTD ^= LEDMask; } static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; static inline uint8_t LEDs_GetLEDs(void) { return (PORTD & LEDS_ALL_LEDS); } #endif /* Disable C linkage for C++ Compilers: */ #if defined(__cplusplus) } #endif #endif ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/Descriptors.c ================================================ /* LUFA Library Copyright (C) Dean Camera, 2010. dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /** \file * * USB Device Descriptors, for library use when in USB device mode. Descriptors are special * computer-readable structures which the host requests upon device enumeration, to determine * the device's capabilities and functions. */ #include "Descriptors.h" /** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall * device characteristics, including the supported USB version, control endpoint size and the * number of device configurations. The descriptor is read out by the USB host when the enumeration * process begins. */ USB_Descriptor_Device_t DeviceDescriptor = { .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, .USBSpecification = VERSION_BCD(01.10), .Class = 0x00, .SubClass = 0x00, .Protocol = 0x00, .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, .VendorID = 0x03EB, // Atmel .ProductID = PRODUCT_ID_CODE, // MCU-dependent .ReleaseNumber = 0x0000, .ManufacturerStrIndex = NO_DESCRIPTOR, .ProductStrIndex = 0x01, .SerialNumStrIndex = NO_DESCRIPTOR, .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS }; /** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage * of the device in one of its supported configurations, including information about any device interfaces * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting * a configuration so that the host may correctly communicate with the USB device. */ USB_Descriptor_Configuration_t ConfigurationDescriptor = { .Config = { .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), .TotalInterfaces = 1, .ConfigurationNumber = 1, .ConfigurationStrIndex = NO_DESCRIPTOR, .ConfigAttributes = USB_CONFIG_ATTR_BUSPOWERED, .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) }, .DFU_Interface = { .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, .InterfaceNumber = 0, .AlternateSetting = 0, .TotalEndpoints = 0, .Class = 0xFE, .SubClass = 0x01, .Protocol = 0x02, .InterfaceStrIndex = NO_DESCRIPTOR }, .DFU_Functional = { .Header = {.Size = sizeof(USB_DFU_Functional_Descriptor_t), .Type = DTYPE_DFUFunctional}, .Attributes = (ATTR_CAN_UPLOAD | ATTR_CAN_DOWNLOAD), .DetachTimeout = 0x0000, .TransferSize = 0x0c00, .DFUSpecification = VERSION_BCD(01.01) } }; /** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate * via the language ID table available at USB.org what languages the device supports for its string descriptors. */ USB_Descriptor_String_t LanguageString = { .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, .UnicodeString = {LANGUAGE_ID_ENG} }; /** Product descriptor string. This is a Unicode string containing the product's details in human readable form, * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device * Descriptor. */ USB_Descriptor_String_t ProductString = { #if (ARDUINO_MODEL_PID == ARDUINO_UNO_PID) .Header = {.Size = USB_STRING_LEN(15), .Type = DTYPE_String}, .UnicodeString = L"Arduino Uno DFU" #elif (ARDUINO_MODEL_PID == ARDUINO_MEGA2560_PID) .Header = {.Size = USB_STRING_LEN(21), .Type = DTYPE_String}, .UnicodeString = L"Arduino Mega 2560 DFU" #endif }; /** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors" * documentation) by the application code so that the address and size of a requested descriptor can be given * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the * USB host. */ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex, void** const DescriptorAddress) { const uint8_t DescriptorType = (wValue >> 8); const uint8_t DescriptorNumber = (wValue & 0xFF); void* Address = NULL; uint16_t Size = NO_DESCRIPTOR; switch (DescriptorType) { case DTYPE_Device: Address = &DeviceDescriptor; Size = sizeof(USB_Descriptor_Device_t); break; case DTYPE_Configuration: Address = &ConfigurationDescriptor; Size = sizeof(USB_Descriptor_Configuration_t); break; case DTYPE_String: if (!(DescriptorNumber)) { Address = &LanguageString; Size = LanguageString.Header.Size; } else { Address = &ProductString; Size = ProductString.Header.Size; } break; } *DescriptorAddress = Address; return Size; } ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/Descriptors.h ================================================ /* LUFA Library Copyright (C) Dean Camera, 2010. dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /** \file * * Header file for Descriptors.c. */ #ifndef _DESCRIPTORS_H_ #define _DESCRIPTORS_H_ /* Includes: */ #include /* Product-specific definitions: */ #define ARDUINO_UNO_PID 0x0001 #define ARDUINO_MEGA2560_PID 0x0010 /* Macros: */ /** Descriptor type value for a DFU class functional descriptor. */ #define DTYPE_DFUFunctional 0x21 /** DFU attribute mask, indicating that the DFU device will detach and re-attach when a DFU_DETACH * command is issued, rather than the host issuing a USB Reset. */ #define ATTR_WILL_DETATCH (1 << 3) /** DFU attribute mask, indicating that the DFU device can communicate during the manifestation phase * (memory programming phase). */ #define ATTR_MANEFESTATION_TOLLERANT (1 << 2) /** DFU attribute mask, indicating that the DFU device can accept DFU_UPLOAD requests to send data from * the device to the host. */ #define ATTR_CAN_UPLOAD (1 << 1) /** DFU attribute mask, indicating that the DFU device can accept DFU_DNLOAD requests to send data from * the host to the device. */ #define ATTR_CAN_DOWNLOAD (1 << 0) #if defined(__AVR_AT90USB1287__) #define PRODUCT_ID_CODE 0x2FFB #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x97 #define AVR_SIGNATURE_3 0x82 #elif defined(__AVR_AT90USB1286__) #define PRODUCT_ID_CODE 0x2FFB #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x97 #define AVR_SIGNATURE_3 0x82 #elif defined(__AVR_AT90USB647__) #define PRODUCT_ID_CODE 0x2FF9 #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x96 #define AVR_SIGNATURE_3 0x82 #elif defined(__AVR_AT90USB646__) #define PRODUCT_ID_CODE 0x2FF9 #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x96 #define AVR_SIGNATURE_3 0x82 #elif defined(__AVR_ATmega32U6__) #define PRODUCT_ID_CODE 0x2FFB #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x95 #define AVR_SIGNATURE_3 0x88 #elif defined(__AVR_ATmega32U4__) #define PRODUCT_ID_CODE 0x2FF4 #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x95 #define AVR_SIGNATURE_3 0x87 #elif defined(__AVR_ATmega32U2__) #define PRODUCT_ID_CODE 0x2FF0 #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x95 #define AVR_SIGNATURE_3 0x8A #elif defined(__AVR_ATmega16U4__) #define PRODUCT_ID_CODE 0x2FF3 #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x94 #define AVR_SIGNATURE_3 0x88 #elif defined(__AVR_ATmega16U2__) #define PRODUCT_ID_CODE 0x2FEF #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x94 #define AVR_SIGNATURE_3 0x89 #elif defined(__AVR_AT90USB162__) #define PRODUCT_ID_CODE 0x2FFA #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x94 #define AVR_SIGNATURE_3 0x82 #elif defined(__AVR_AT90USB82__) #define PRODUCT_ID_CODE 0x2FEE #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x93 #define AVR_SIGNATURE_3 0x89 #elif defined(__AVR_ATmega8U2__) #define PRODUCT_ID_CODE 0x2FF7 #define AVR_SIGNATURE_1 0x1E #define AVR_SIGNATURE_2 0x93 #define AVR_SIGNATURE_3 0x82 #else #error The selected AVR part is not currently supported by this bootloader. #endif #if !defined(PRODUCT_ID_CODE) #error Current AVR model is not supported by this bootloader. #endif /* Type Defines: */ /** Type define for a DFU class function descriptor. This descriptor gives DFU class information * to the host when read, indicating the DFU device's capabilities. */ typedef struct { USB_Descriptor_Header_t Header; /**< Standard descriptor header structure */ uint8_t Attributes; /**< DFU device attributes, a mask comprising of the * ATTR_* macros listed in this source file */ uint16_t DetachTimeout; /**< Timeout in milliseconds between a USB_DETACH * command being issued and the device detaching * from the USB bus */ uint16_t TransferSize; /**< Maximum number of bytes the DFU device can accept * from the host in a transaction */ uint16_t DFUSpecification; /**< BCD packed DFU specification number this DFU * device complies with */ } USB_DFU_Functional_Descriptor_t; /** Type define for the device configuration descriptor structure. This must be defined in the * application code, as the configuration descriptor contains several sub-descriptors which * vary between devices, and which describe the device's usage to the host. */ typedef struct { USB_Descriptor_Configuration_Header_t Config; USB_Descriptor_Interface_t DFU_Interface; USB_DFU_Functional_Descriptor_t DFU_Functional; } USB_Descriptor_Configuration_t; /* Function Prototypes: */ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex, void** const DescriptorAddress) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); #endif ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/makefile ================================================ # Hey Emacs, this is a -*- makefile -*- #---------------------------------------------------------------------------- # WinAVR Makefile Template written by Eric B. Weddington, Jrg Wunsch, et al. # >> Modified for use with the LUFA project. << # # Released to the Public Domain # # Additional material for this makefile was written by: # Peter Fleury # Tim Henigan # Colin O'Flynn # Reiner Patommel # Markus Pfaff # Sander Pool # Frederik Rouleau # Carlos Lamas # Dean Camera # Opendous Inc. # Denver Gingerich # #---------------------------------------------------------------------------- # On command line: # # make all = Make software. # # make clean = Clean out built project files. # # make coff = Convert ELF to AVR COFF. # # make extcoff = Convert ELF to AVR Extended COFF. # # make program = Download the hex file to the device, using avrdude. # Please customize the avrdude settings below first! # # make doxygen = Generate DoxyGen documentation for the project (must have # DoxyGen installed) # # make debug = Start either simulavr or avarice as specified for debugging, # with avr-gdb or avr-insight as the front end for debugging. # # make filename.s = Just compile filename.c into the assembler code only. # # make filename.i = Create a preprocessed source file for use in submitting # bug reports to the GCC project. # # To rebuild project do "make clean" then "make all". #---------------------------------------------------------------------------- # MCU name MCU = atmega8u2 MCU_AVRDUDE = at90usb82 # Specify the Arduino model using the assigned PID. This is used by Descriptors.c # to set the product descriptor string (for DFU we must use the PID for each # chip that dfu-bootloader or Flip expect) # Uno PID: ARDUINO_MODEL_PID = 0x0001 # Mega 2560 PID: #ARDUINO_MODEL_PID = 0x0010 # Target board (see library "Board Types" documentation, NONE for projects not requiring # LUFA board drivers). If USER is selected, put custom board drivers in a directory called # "Board" inside the application directory. BOARD = USER # Processor frequency. # This will define a symbol, F_CPU, in all source code files equal to the # processor frequency in Hz. You can then use this symbol in your source code to # calculate timings. Do NOT tack on a 'UL' at the end, this will be done # automatically to create a 32-bit value in your source code. # # This will be an integer division of F_CLOCK below, as it is sourced by # F_CLOCK after it has run through any CPU prescalers. Note that this value # does not *change* the processor frequency - it should merely be updated to # reflect the processor speed set externally so that the code can use accurate # software delays. F_CPU = 16000000 # Input clock frequency. # This will define a symbol, F_CLOCK, in all source code files equal to the # input clock frequency (before any prescaling is performed) in Hz. This value may # differ from F_CPU if prescaling is used on the latter, and is required as the # raw input clock is fed directly to the PLL sections of the AVR for high speed # clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' # at the end, this will be done automatically to create a 32-bit value in your # source code. # # If no clock division is performed on the input clock inside the AVR (via the # CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. F_CLOCK = $(F_CPU) # Starting byte address of the bootloader, as a byte address - computed via the formula # BOOT_START = ((TOTAL_FLASH_BYTES - BOOTLOADER_SECTION_SIZE_BYTES) * 1024) # # Note that the bootloader size and start address given in AVRStudio is in words and not # bytes, and so will need to be doubled to obtain the byte address needed by AVR-GCC. BOOT_START = 0x1000 # Output format. (can be srec, ihex, binary) FORMAT = ihex # Target file name (without extension). TARGET = Arduino-usbdfu # Object files directory # To put object files in current directory, use a dot (.), do NOT make # this an empty or blank macro! OBJDIR = . # Path to the LUFA library LUFA_PATH = ../.. # LUFA library compile-time options and predefined tokens LUFA_OPTS = -D USB_DEVICE_ONLY LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0 LUFA_OPTS += -D CONTROL_ONLY_DEVICE LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=32 LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 LUFA_OPTS += -D USE_RAM_DESCRIPTORS LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" LUFA_OPTS += -D NO_INTERNAL_SERIAL LUFA_OPTS += -D NO_DEVICE_SELF_POWER LUFA_OPTS += -D NO_DEVICE_REMOTE_WAKEUP LUFA_OPTS += -D NO_STREAM_CALLBACKS # Create the LUFA source path variables by including the LUFA root makefile include $(LUFA_PATH)/LUFA/makefile # List C source files here. (C dependencies are automatically generated.) SRC = $(TARGET).c \ Descriptors.c \ $(LUFA_SRC_USB) \ # List C++ source files here. (C dependencies are automatically generated.) CPPSRC = # List Assembler source files here. # Make them always end in a capital .S. Files ending in a lowercase .s # will not be considered source files but generated files (assembler # output from the compiler), and will be deleted upon "make clean"! # Even though the DOS/Win* filesystem matches both .s and .S the same, # it will preserve the spelling of the filenames, and gcc itself does # care about how the name is spelled on its command-line. ASRC = # Optimization level, can be [0, 1, 2, 3, s]. # 0 = turn off optimization. s = optimize for size. # (Note: 3 is not always the best optimization level. See avr-libc FAQ.) OPT = s # Debugging format. # Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. # AVR Studio 4.10 requires dwarf-2. # AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. DEBUG = dwarf-2 # List any extra directories to look for include files here. # Each directory must be seperated by a space. # Use forward slashes for directory separators. # For a directory that has spaces, enclose it in quotes. EXTRAINCDIRS = $(LUFA_PATH)/ # Compiler flag to set the C Standard level. # c89 = "ANSI" C # gnu89 = c89 plus GCC extensions # c99 = ISO C99 standard (not yet fully implemented) # gnu99 = c99 plus GCC extensions CSTANDARD = -std=c99 # Place -D or -U options here for C sources CDEFS = -DF_CPU=$(F_CPU)UL CDEFS += -DARDUINO_MODEL_PID=$(ARDUINO_MODEL_PID) CDEFS += -DF_CLOCK=$(F_CLOCK)UL CDEFS += -DBOARD=BOARD_$(BOARD) CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL CDEFS += -DTX_RX_LED_PULSE_MS=3 CDEFS += $(LUFA_OPTS) # Place -D or -U options here for ASM sources ADEFS = -DF_CPU=$(F_CPU) ADEFS += -DF_CLOCK=$(F_CLOCK)UL ADEFS += -DBOARD=BOARD_$(BOARD) CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL ADEFS += $(LUFA_OPTS) # Place -D or -U options here for C++ sources CPPDEFS = -DF_CPU=$(F_CPU)UL CPPDEFS += -DF_CLOCK=$(F_CLOCK)UL CPPDEFS += -DBOARD=BOARD_$(BOARD) CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL CPPDEFS += $(LUFA_OPTS) #CPPDEFS += -D__STDC_LIMIT_MACROS #CPPDEFS += -D__STDC_CONSTANT_MACROS #---------------- Compiler Options C ---------------- # -g*: generate debugging information # -O*: optimization level # -f...: tuning, see GCC manual and avr-libc documentation # -Wall...: warning level # -Wa,...: tell GCC to pass this to the assembler. # -adhlns...: create assembler listing CFLAGS = -g$(DEBUG) CFLAGS += $(CDEFS) CFLAGS += -O$(OPT) CFLAGS += -funsigned-char CFLAGS += -funsigned-bitfields CFLAGS += -ffunction-sections CFLAGS += -fno-inline-small-functions CFLAGS += -fpack-struct CFLAGS += -fshort-enums CFLAGS += -fno-strict-aliasing CFLAGS += -Wall CFLAGS += -Wstrict-prototypes #CFLAGS += -mshort-calls #CFLAGS += -fno-unit-at-a-time #CFLAGS += -Wundef #CFLAGS += -Wunreachable-code #CFLAGS += -Wsign-compare CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) CFLAGS += $(CSTANDARD) #---------------- Compiler Options C++ ---------------- # -g*: generate debugging information # -O*: optimization level # -f...: tuning, see GCC manual and avr-libc documentation # -Wall...: warning level # -Wa,...: tell GCC to pass this to the assembler. # -adhlns...: create assembler listing CPPFLAGS = -g$(DEBUG) CPPFLAGS += $(CPPDEFS) CPPFLAGS += -O$(OPT) CPPFLAGS += -funsigned-char CPPFLAGS += -funsigned-bitfields CPPFLAGS += -fpack-struct CPPFLAGS += -fshort-enums CPPFLAGS += -fno-exceptions CPPFLAGS += -Wall CPPFLAGS += -Wundef #CPPFLAGS += -mshort-calls #CPPFLAGS += -fno-unit-at-a-time #CPPFLAGS += -Wstrict-prototypes #CPPFLAGS += -Wunreachable-code #CPPFLAGS += -Wsign-compare CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) #CPPFLAGS += $(CSTANDARD) #---------------- Assembler Options ---------------- # -Wa,...: tell GCC to pass this to the assembler. # -adhlns: create listing # -gstabs: have the assembler create line number information; note that # for use in COFF files, additional information about filenames # and function names needs to be present in the assembler source # files -- see avr-libc docs [FIXME: not yet described there] # -listing-cont-lines: Sets the maximum number of continuation lines of hex # dump that will be displayed for a given single line of source input. ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 #---------------- Library Options ---------------- # Minimalistic printf version PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min # Floating point printf version (requires MATH_LIB = -lm below) PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt # If this is left blank, then it will use the Standard printf version. PRINTF_LIB = #PRINTF_LIB = $(PRINTF_LIB_MIN) #PRINTF_LIB = $(PRINTF_LIB_FLOAT) # Minimalistic scanf version SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min # Floating point + %[ scanf version (requires MATH_LIB = -lm below) SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt # If this is left blank, then it will use the Standard scanf version. SCANF_LIB = #SCANF_LIB = $(SCANF_LIB_MIN) #SCANF_LIB = $(SCANF_LIB_FLOAT) MATH_LIB = -lm # List any extra directories to look for libraries here. # Each directory must be seperated by a space. # Use forward slashes for directory separators. # For a directory that has spaces, enclose it in quotes. EXTRALIBDIRS = #---------------- External Memory Options ---------------- # 64 KB of external RAM, starting after internal RAM (ATmega128!), # used for variables (.data/.bss) and heap (malloc()). #EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff # 64 KB of external RAM, starting after internal RAM (ATmega128!), # only used for heap (malloc()). #EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff EXTMEMOPTS = #---------------- Linker Options ---------------- # -Wl,...: tell GCC to pass this to linker. # -Map: create map file # --cref: add cross reference to map file LDFLAGS = -Wl,-Map=$(TARGET).map,--cref LDFLAGS += -Wl,--section-start=.text=$(BOOT_START) LDFLAGS += -Wl,--relax LDFLAGS += -Wl,--gc-sections LDFLAGS += $(EXTMEMOPTS) LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) #LDFLAGS += -T linker_script.x #---------------- Programming Options (avrdude) ---------------- # Fuse settings for Arduino Uno DFU bootloader project AVRDUDE_FUSES = -U efuse:w:0xF4:m -U hfuse:w:0xD9:m -U lfuse:w:0xFF:m # Lock settings for Arduino Uno DFU bootloader project AVRDUDE_LOCK = -U lock:w:0x0F:m # Programming hardware # Type: avrdude -c ? # to get a full listing. # AVRDUDE_PROGRAMMER = avrispmkii # com1 = serial port. Use lpt1 to connect to parallel port. AVRDUDE_PORT = usb AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex #AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep # Uncomment the following if you want avrdude's erase cycle counter. # Note that this counter needs to be initialized first using -Yn, # see avrdude manual. #AVRDUDE_ERASE_COUNTER = -y # Uncomment the following if you do /not/ wish a verification to be # performed after programming the device. #AVRDUDE_NO_VERIFY = -V # Increase verbosity level. Please use this when submitting bug # reports about avrdude. See # to submit bug reports. #AVRDUDE_VERBOSE = -v -v AVRDUDE_FLAGS = -p $(MCU_AVRDUDE) -F -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) #---------------- Debugging Options ---------------- # For simulavr only - target MCU frequency. DEBUG_MFREQ = $(F_CPU) # Set the DEBUG_UI to either gdb or insight. # DEBUG_UI = gdb DEBUG_UI = insight # Set the debugging back-end to either avarice, simulavr. DEBUG_BACKEND = avarice #DEBUG_BACKEND = simulavr # GDB Init Filename. GDBINIT_FILE = __avr_gdbinit # When using avarice settings for the JTAG JTAG_DEV = /dev/com1 # Debugging port used to communicate between GDB / avarice / simulavr. DEBUG_PORT = 4242 # Debugging host used to communicate between GDB / avarice / simulavr, normally # just set to localhost unless doing some sort of crazy debugging when # avarice is running on a different computer. DEBUG_HOST = localhost #============================================================================ # Define programs and commands. SHELL = sh CC = avr-gcc OBJCOPY = avr-objcopy OBJDUMP = avr-objdump SIZE = avr-size AR = avr-ar rcs NM = avr-nm AVRDUDE = avrdude REMOVE = rm -f REMOVEDIR = rm -rf COPY = cp WINSHELL = cmd # Define Messages # English MSG_ERRORS_NONE = Errors: none MSG_BEGIN = -------- begin -------- MSG_END = -------- end -------- MSG_SIZE_BEFORE = Size before: MSG_SIZE_AFTER = Size after: MSG_COFF = Converting to AVR COFF: MSG_EXTENDED_COFF = Converting to AVR Extended COFF: MSG_FLASH = Creating load file for Flash: MSG_EEPROM = Creating load file for EEPROM: MSG_EXTENDED_LISTING = Creating Extended Listing: MSG_SYMBOL_TABLE = Creating Symbol Table: MSG_LINKING = Linking: MSG_COMPILING = Compiling C: MSG_COMPILING_CPP = Compiling C++: MSG_ASSEMBLING = Assembling: MSG_CLEANING = Cleaning project: MSG_CREATING_LIBRARY = Creating library: # Define all object files. OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) # Define all listing files. LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) # Compiler flags to generate dependency files. GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d # Combine all necessary flags and optional flags. # Add target processor to flags. ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) # Default target. all: begin gccversion sizebefore build sizeafter end # Change the build target to build a HEX file or a library. build: elf hex eep lss sym #build: lib elf: $(TARGET).elf hex: $(TARGET).hex eep: $(TARGET).eep lss: $(TARGET).lss sym: $(TARGET).sym LIBNAME=lib$(TARGET).a lib: $(LIBNAME) # Eye candy. # AVR Studio 3.x does not check make's exit code but relies on # the following magic strings to be generated by the compile job. begin: @echo @echo $(MSG_BEGIN) end: @echo $(MSG_END) @echo # Display size of file. HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) sizebefore: @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ 2>/dev/null; echo; fi sizeafter: @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ 2>/dev/null; echo; fi # Display compiler version information. gccversion : @$(CC) --version # Program the device. program: $(TARGET).hex $(TARGET).eep $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) $(AVRDUDE_FUSES) $(AVRDUDE_LOCK) # Generate avr-gdb config/init file which does the following: # define the reset signal, load the target file, connect to target, and set # a breakpoint at main(). gdb-config: @$(REMOVE) $(GDBINIT_FILE) @echo define reset >> $(GDBINIT_FILE) @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) @echo end >> $(GDBINIT_FILE) @echo file $(TARGET).elf >> $(GDBINIT_FILE) @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) ifeq ($(DEBUG_BACKEND),simulavr) @echo load >> $(GDBINIT_FILE) endif @echo break main >> $(GDBINIT_FILE) debug: gdb-config $(TARGET).elf ifeq ($(DEBUG_BACKEND), avarice) @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) @$(WINSHELL) /c pause else @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ $(DEBUG_MFREQ) --port $(DEBUG_PORT) endif @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) # Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. COFFCONVERT = $(OBJCOPY) --debugging COFFCONVERT += --change-section-address .data-0x800000 COFFCONVERT += --change-section-address .bss-0x800000 COFFCONVERT += --change-section-address .noinit-0x800000 COFFCONVERT += --change-section-address .eeprom-0x810000 coff: $(TARGET).elf @echo @echo $(MSG_COFF) $(TARGET).cof $(COFFCONVERT) -O coff-avr $< $(TARGET).cof extcoff: $(TARGET).elf @echo @echo $(MSG_EXTENDED_COFF) $(TARGET).cof $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof # Create final output files (.hex, .eep) from ELF output file. %.hex: %.elf @echo @echo $(MSG_FLASH) $@ $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@ %.eep: %.elf @echo @echo $(MSG_EEPROM) $@ -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 # Create extended listing file from ELF output file. %.lss: %.elf @echo @echo $(MSG_EXTENDED_LISTING) $@ $(OBJDUMP) -h -S -z $< > $@ # Create a symbol table from ELF output file. %.sym: %.elf @echo @echo $(MSG_SYMBOL_TABLE) $@ $(NM) -n $< > $@ # Create library from object files. .SECONDARY : $(TARGET).a .PRECIOUS : $(OBJ) %.a: $(OBJ) @echo @echo $(MSG_CREATING_LIBRARY) $@ $(AR) $@ $(OBJ) # Link: create ELF output file from object files. .SECONDARY : $(TARGET).elf .PRECIOUS : $(OBJ) %.elf: $(OBJ) @echo @echo $(MSG_LINKING) $@ $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) # Compile: create object files from C source files. $(OBJDIR)/%.o : %.c @echo @echo $(MSG_COMPILING) $< $(CC) -c $(ALL_CFLAGS) $< -o $@ # Compile: create object files from C++ source files. $(OBJDIR)/%.o : %.cpp @echo @echo $(MSG_COMPILING_CPP) $< $(CC) -c $(ALL_CPPFLAGS) $< -o $@ # Compile: create assembler files from C source files. %.s : %.c $(CC) -S $(ALL_CFLAGS) $< -o $@ # Compile: create assembler files from C++ source files. %.s : %.cpp $(CC) -S $(ALL_CPPFLAGS) $< -o $@ # Assemble: create object files from assembler source files. $(OBJDIR)/%.o : %.S @echo @echo $(MSG_ASSEMBLING) $< $(CC) -c $(ALL_ASFLAGS) $< -o $@ # Create preprocessed source for use in sending a bug report. %.i : %.c $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ # Target: clean project. clean: begin clean_list end clean_list : @echo @echo $(MSG_CLEANING) $(REMOVE) $(TARGET).hex $(REMOVE) $(TARGET).eep $(REMOVE) $(TARGET).cof $(REMOVE) $(TARGET).elf $(REMOVE) $(TARGET).map $(REMOVE) $(TARGET).sym $(REMOVE) $(TARGET).lss $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) $(REMOVE) $(SRC:.c=.s) $(REMOVE) $(SRC:.c=.d) $(REMOVE) $(SRC:.c=.i) $(REMOVEDIR) .dep doxygen: @echo Generating Project Documentation... @doxygen Doxygen.conf @echo Documentation Generation Complete. clean_doxygen: rm -rf Documentation # Create object files directory $(shell mkdir $(OBJDIR) 2>/dev/null) # Include the dependency files. -include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) # Listing of phony targets. .PHONY : all begin finish end sizebefore sizeafter gccversion \ build elf hex eep lss sym coff extcoff doxygen clean \ clean_list clean_doxygen program debug gdb-config ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/arduino-usbdfu/readme.txt ================================================ To setup the project and program an ATMEG8U2 with the Arduino USB DFU bootloader: 1. unpack the source into LUFA's Bootloader directory 2. set ARDUINO_MODEL_PID in the makefile as appropriate 3. do "make clean; make; make program" Check that the board enumerates as either "Arduino Uno DFU" or "Arduino Mega 2560 DFU". Test by uploading the Arduino-usbserial application firmware (see instructions in Arduino-usbserial directory) ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial-atmega16u2-Mega2560-Rev3.hex ================================================ :1000000090C00000A9C00000A7C00000A5C000006B :10001000A3C00000A1C000009FC000009DC0000060 :100020009BC0000099C0000097C0000048C40000B9 :100030000CC4000091C000008FC000008DC0000003 :100040008BC0000089C0000087C0000085C0000090 :1000500083C0000081C000007FC0000002C100001A :100060007BC0000079C0000077C0000075C00000B0 :1000700073C0000071C000006FC000006DC00000C0 :100080006BC0000069C0000067C0000065C00000D0 :1000900063C0000061C000001201100102000008EE :1000A0004123420001000102DC0109023E0002017D :1000B00000C0320904000001020201000524000111 :1000C0001004240206052406000107058203080027 :1000D000FF09040100020A000000070504024000B5 :1000E00001070583024000010403090432034100B3 :1000F00072006400750069006E006F002000280027 :100100007700770077002E006100720064007500B0 :1001100069006E006F002E0063006300290000007C :10012000000011241FBECFEFD2E0DEBFCDBF11E033 :10013000A0E0B1E0ECEAFFE002C005900D92A6312C :10014000B107D9F712E0A6E1B1E001C01D92AF32CC :10015000B107E1F7F1D028C753CF9C01DC01AE57BE :10016000BF4FED91FC91119741911196FC93EE9345 :1001700080589F4FE817F90711F42D933C939FB7D0 :10018000F894F901EC57FF4F8081815080839FBF25 :10019000842F0895DF92EF92FF920F931F93FC013B :1001A0008489813019F0823021F405C040E3D42ED7 :1001B00004C0DD2402C030E2D32E8389823011F4E2 :1001C00088E0D82A8589873031F0883031F0863050 :1001D00031F482E003C084E001C086E0D82A1092A6 :1001E000C9001092C8001092CA00E784F088018903 :1001F000128980E0E81681EEF80680E0080780E0CA :10020000180719F420E130E00FC0C801B701969536 :1002100087957795679560587B47814E9F4FA801DA :100220009701A0D6215030403093CD002093CC00D0 :10023000D092CA0080E0E81681EEF80680E0080758 :1002400080E0180711F082E001C080E08093C800D0 :1002500088E98093C9001F910F91FF90EF90DF9084 :1002600008951F920F920FB60F9211242F938F9320 :100270009F93EF93FF939091CE008EB38430F1F46F :10028000E0919901F0919A019083E0919901F091A8 :100290009A01CF01019690939A018093990189590F :1002A000914021F489E191E0928381839FB7F89492 :1002B00080919D018F5F80939D019FBFFF91EF9182 :1002C0009F918F912F910F900FBE0F901F901895B7 :1002D000FC01858580FF02C05F9808955F9A0895AC :1002E00080E091E0D5C580E091E088C584B7877F44 :1002F00084BF28E10FB6F89420936000109260004C :100300000FBE87E690E09093CD008093CC0086E00E :100310008093CA001092C8002093C900539A5A9A39 :100320008AB180638AB98BB180638BB983D284E050 :1003300085BD5F9A579A08950F931F93CF93DF93CC :10034000D5DF2FB7F8948EE991E090931F02809348 :100350001E0290932102809320022FBF2FB7F894A2 :1003600089E191E090939A018093990190939C0187 :1003700080939B012FBF7894CEE9D1E003E08FB743 :10038000F894909122028FBF903809F180E091E0BB :10039000ABD497FD1CC0E0911E02F0911F02808338 :1003A000E0911E02F0911F02CF01019690931F026F :1003B00080931E028E51924011F4D283C1839FB765 :1003C000F894809122028F5F809322029FBF8FB7A3 :1003D000F89410919D018FBFA89902C0113678F151 :1003E000A89A80919D01882361F05D980093160181 :1003F00008C089E191E0B1DE682F80E091E0DAD4B5 :1004000011501123B1F780911601882351F080918A :10041000160181508093160180911601882309F4FA :100420005D9A80911701882351F0809117018150C6 :100430008093170180911701882309F45C9A8FB784 :10044000F894909122028FBF992369F08EE991E090 :1004500084DE982F8091C80085FFFCCF9093CE005A :100460005C980093170180E091E095D42AD487CF5F :10047000DA01923049F0933061F09130F9F4E8E913 :10048000F0E022E130E01EC0EAEAF0E02EE330E0E6 :1004900019C0813049F0813018F0823079F408C0F9 :1004A000E8EEF0E0849107C0ECEEF0E0849103C048 :1004B000E0E2F1E08491282F30E004C0E0E0F0E0D9 :1004C00020E030E0ED93FC93C901089528E030E08E :1004D00040E003C04F5F220F331F28173907D0F3C6 :1004E000842F8295807F08958093E9008091EB00AE :1004F00081608093EB001092ED006093EC004093DC :10050000ED008091EE00881F8827881F08951092C3 :10051000F40090E09093E9001092F0001092E8004F :100520001092ED008091EB008E7F8093EB009F5F37 :10053000953081F708958091270288238CF403C0B9 :100540008EB38823B1F08091E80082FFF9CF8091CB :10055000E8008B778093E80008958EB3882349F0F4 :100560008091E80080FFF9CF8091E8008E7780933A :10057000E800089594E68091EC0080FF05C080912A :10058000E80080FF05C023C08091E80082FD1FC005 :100590008EB3882311F482E008958EB3853011F470 :1005A00083E008958091EB0085FF02C081E008950B :1005B0008091E10082FFDFCF8091E1008B7F80930B :1005C000E100992311F484E008959150D4CF80E0A4 :1005D00008959C0140912D0250912E024617570715 :1005E00018F4F90120E038C06115710511F0AB0174 :1005F000F8CF8091E8008E778093E80040E050E0EB :10060000F0CF8091E80083FF02C081E008958091DF :10061000E80082FD2DC08EB3882381F18EB3853032 :1006200079F18091E80080FF17C09091F20006C038 :1006300081918093F100415050409F5F41155105D9 :1006400011F09830A8F320E0983009F421E080916F :10065000E8008E778093E8004115510591F622233A :1006600081F606C08EB3882349F08EB3853041F001 :100670008091E80082FFF6CF80E0089582E008953F :1006800083E008959C0140912D0250912E0246175F :10069000570710F490E03BC06115710511F0AB01F4 :1006A000F9CF8091E8008E778093E80040E050E039 :1006B000F1CF8091E80083FF02C081E0089580912E :1006C000E80082FD30C08EB3882399F18EB3853067 :1006D00091F18091E80080FF1AC08091F20009C07A :1006E000F9012F5F3F4FE491E093F10041505040FA :1006F0008F5F4115510511F0883090F390E08830FC :1007000009F491E08091E8008E778093E80041152C :10071000510579F6992369F606C08EB3882349F00E :100720008EB3853041F08091E80082FFF6CF80E003 :10073000089582E0089583E008959C016115710594 :1007400029F48091E8008B778093E800F90120C0BC :100750008091E80083FF02C081E008958EB3882372 :1007600039F18EB3853031F18091E80082FFF0CF0E :1007700006C08091F10081936150704021F080911A :10078000F2008823B1F78091E8008B778093E8002E :1007900061157105E9F606C08EB3882349F08EB362 :1007A000853041F08091E80080FFF6CF80E0089529 :1007B00082E0089583E0089542D044D01EBA10929A :1007C0002502109224021092230284E089BD89B58B :1007D000826089BD09B400FEFDCF8091D800982FBA :1007E0009F779093D80080688093D80080916300B1 :1007F0008E7F809363008091D8008F7D8093D80096 :100800008091E0008E7F8093E0008091E1008E7FF8 :100810008093E1008091E20081608093E20080910A :10082000E100877F8093E1008091E20088608093FF :10083000E2000895C1DF81E08093260208951092BE :10084000E20008951092E10008951F920F920FB6F2 :100850000F9211241F932F933F934F935F936F93A6 :100860007F938F939F93AF93BF93EF93FF93E9EEA3 :10087000F0E0108117701082E0EFF0E08081877F58 :1008800080837894C3D0F894A9EEB0E01C92E0EF96 :10089000F0E08081886080831C93FF91EF91BF918D :1008A000AF919F918F917F916F915F914F913F9108 :1008B0002F911F910F900FBE0F901F9018951F92B0 :1008C0000F920FB60F9211242F933F934F935F9384 :1008D0006F937F938F939F93AF93BF93EF93FF9308 :1008E0008091E10080FF1BC08091E20080FF17C073 :1008F0008091E1008E7F8093E1008091E2008E7F05 :100900008093E2008091E20080618093E200809118 :10091000D80080628093D80019BC1EBAD1D18091D2 :10092000E10084FF29C08091E20084FF25C084E0BB :1009300089BD89B5826089BD09B400FEFDCF809173 :10094000D8008F7D8093D8008091E1008F7E8093C6 :10095000E1008091E2008F7E8093E2008091E200CE :1009600081608093E20080912502882311F481E068 :1009700001C084E08EBBA4D18091E10083FF27C039 :100980008091E20083FF23C08091E100877F809304 :10099000E10082E08EBB109225028091E1008E7F03 :1009A0008093E1008091E2008E7F8093E20080914D :1009B000E20080618093E200AADD80E060E042E036 :1009C00093DD8091F00088608093F00079D1809170 :1009D000E10082FF0AC08091E20082FF06C08091A0 :1009E000E1008B7F8093E1006BD1FF91EF91BF918C :1009F000AF919F918F917F916F915F914F913F91B7 :100A00002F910F900FBE0F901F9018951F93DF939B :100A1000CF93CDB7DEB7AC970FB6F894DEBF0FBE5D :100A2000CDBFE7E2F2E08091F100819322E0EF3266 :100A3000F207C9F78091270230912802353009F476 :100A400087C0363040F43130C9F1313070F0333086 :100A500009F01DC133C0383009F4EFC0393009F452 :100A6000FEC0363009F013C192C0803821F08238C0 :100A700009F00DC108C090912302809124028823BF :100A800099F0926011C080912B0287708093E900E9 :100A90008091EB0090E025E0969587952A95E1F707 :100AA000982F91701092E9008091E800877F8093E1 :100AB000E8009093F1001092F100CAC0882319F069 :100AC000823009F0E4C090E08F719070009721F0BF :100AD000029709F0DDC00CC080912902813009F035 :100AE000D7C010922402333069F5809324022AC0C3 :100AF00080912902882331F520912B02277009F477 :100B0000C7C02093E9008091EB0080FFC1C0333063 :100B100021F48091EB00806213C08091EB00806132 :100B20008093EB0081E090E002C0880F991F2A9526 :100B3000E2F78093EA001092EA008091EB0088606F :100B40008093EB001092E9008091E800877F83C0DA :100B5000882309F09CC0109129028091E800877FCA :100B60008093E800E8DC04C08EB3882309F490C0C9 :100B70008091E80080FFF8CF812F8F7711F492E009 :100B800001C093E09EBB80688093E30081C08058E1 :100B9000823008F07CC08091290290912A0223E0E3 :100BA0008C3D920799F55FB7F894DE0115964EE0FB :100BB00020E030E061E2E42FF0E0609357008491A0 :100BC00020FF03C082958F704F5F982F9F70892FF1 :100BD000805D8A3308F0895F8C9311961C9211977F :100BE0002F5F3F4F12962431310529F75FBF8AE20C :100BF0008B8383E08C838091E800877F8093E8007B :100C0000CE0103966AE270E0E4DC11C060912B0231 :100C1000AE014F5F5F4F2CDCBC010097C9F18091A2 :100C2000E800877F8093E80089819A812BDD80919D :100C3000E8008B778093E8002BC0803841F58091E5 :100C4000E800877F8093E800809125028093F1007F :100C50008091E8008E778093E8006DDC19C08823CE :100C6000B1F490912902923098F48091E800877F46 :100C70008093E800909325025EDC80912502882312 :100C800011F483E001C084E08EBB2DDB01C028DBC2 :100C90008091E80083FF0AC08091EB00806280931E :100CA000EB008091E800877F8093E800AC960FB658 :100CB000F894DEBF0FBECDBFCF91DF911F91089595 :100CC00008951F938EB3882361F01091E90010926C :100CD000E9008091E80083FF01C098DE177010934F :100CE000E9001F9108950895FC018EB3843021F529 :100CF00087859089A189B2890097A105B105E1F0A6 :100D000085818093E9008091E80082FF15C0809181 :100D1000F200882319F42FEF3FEF04C08091F10017 :100D2000282F30E08091F200882341F48091E80080 :100D30008B778093E80002C02FEF3FEFC901089541 :100D4000FC018EB3843011F587859089A189B28921 :100D50000097A105B105D1F081818093E9008091D0 :100D6000F2008823A9F09091E8008091E8008E7746 :100D70008093E80095FD0CC0FDDB982F882349F493 :100D80008091E8008E778093E80003C092E001C074 :100D900090E0892F0895FC018EB3843051F487854B :100DA0009089A189B2890097A105B10511F0CF0101 :100DB000C7CF08951F93FC01162F8EB38430D9F44A :100DC00087859089A189B2890097A105B10599F01D :100DD00081818093E9008091E80085FD08C08091C1 :100DE000E8008E778093E800C5DB882329F4109310 :100DF000F10080E001C082E01F9108950F931F93DE :100E0000CF93DF93EC010D96FC0189E0DF011D9289 :100E10008A95E9F72A813B8109818C81882311F425 :100E200010E001C014E0C90151DB182B1260802FC3 :100E300061E8412F59DB882329F12E813F810D8103 :100E40008885882311F410E001C014E0C9013EDB5D :100E5000182B1260802F60E8412F46DB882391F029 :100E60002A853B8509858C85882311F410E001C013 :100E700014E0C9012BDB182B1260802F61EC412F8D :100E800033DB01C080E0DF91CF911F910F91089576 :100E9000CF93DF93EC018091E80083FF60C08881ED :100EA00090E020912B0230912C022817390709F08D :100EB00056C080912802813261F0823220F4803263 :100EC00009F04DC019C0823269F1833209F047C080 :100ED00038C080912702813A09F041C08091E80032 :100EE000877F8093E800CE010F9667E070E071DBAA :100EF0008091E8008B7713C080912702813279F5C9 :100F00008091E800877F8093E800CE010F9667E02C :100F100070E013DCCE013ED98091E8008E7780939B :100F2000E8001DC0809127028132C9F48091E80059 :100F3000877F8093E800809129028D87CE01C8D9F0 :100F40000DC080912702813251F48091E800877FA3 :100F50008093E800CE0160912902C5DEECDADF91D2 :100F6000CF910895A1E21A2EAA1BBB1BFD010DC053 :100F7000AA1FBB1FEE1FFF1FA217B307E407F50749 :100F800020F0A21BB30BE40BF50B661F771F881F25 :100F9000991F1A9469F760957095809590959B01BB :0C0FA000AC01BD01CF010895F894FFCF13 :100FAC0000034000000440000002080000000000A4 :060FBC000000000000002F :00000001FF ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial-atmega16u2-MegaADK-Rev3.hex ================================================ :1000000090C00000A9C00000A7C00000A5C000006B :10001000A3C00000A1C000009FC000009DC0000060 :100020009BC0000099C0000097C0000048C40000B9 :100030000CC4000091C000008FC000008DC0000003 :100040008BC0000089C0000087C0000085C0000090 :1000500083C0000081C000007FC0000002C100001A :100060007BC0000079C0000077C0000075C00000B0 :1000700073C0000071C000006FC000006DC00000C0 :100080006BC0000069C0000067C0000065C00000D0 :1000900063C0000061C000001201100102000008EE :1000A0004123440001000102DC0109023E0002017B :1000B00000C0320904000001020201000524000111 :1000C0001004240206052406000107058203080027 :1000D000FF09040100020A000000070504024000B5 :1000E00001070583024000010403090432034100B3 :1000F00072006400750069006E006F002000280027 :100100007700770077002E006100720064007500B0 :1001100069006E006F002E0063006300290000007C :10012000000011241FBECFEFD2E0DEBFCDBF11E033 :10013000A0E0B1E0ECEAFFE002C005900D92A6312C :10014000B107D9F712E0A6E1B1E001C01D92AF32CC :10015000B107E1F7F1D028C753CF9C01DC01AE57BE :10016000BF4FED91FC91119741911196FC93EE9345 :1001700080589F4FE817F90711F42D933C939FB7D0 :10018000F894F901EC57FF4F8081815080839FBF25 :10019000842F0895DF92EF92FF920F931F93FC013B :1001A0008489813019F0823021F405C040E3D42ED7 :1001B00004C0DD2402C030E2D32E8389823011F4E2 :1001C00088E0D82A8589873031F0883031F0863050 :1001D00031F482E003C084E001C086E0D82A1092A6 :1001E000C9001092C8001092CA00E784F088018903 :1001F000128980E0E81681EEF80680E0080780E0CA :10020000180719F420E130E00FC0C801B701969536 :1002100087957795679560587B47814E9F4FA801DA :100220009701A0D6215030403093CD002093CC00D0 :10023000D092CA0080E0E81681EEF80680E0080758 :1002400080E0180711F082E001C080E08093C800D0 :1002500088E98093C9001F910F91FF90EF90DF9084 :1002600008951F920F920FB60F9211242F938F9320 :100270009F93EF93FF939091CE008EB38430F1F46F :10028000E0919901F0919A019083E0919901F091A8 :100290009A01CF01019690939A018093990189590F :1002A000914021F489E191E0928381839FB7F89492 :1002B00080919D018F5F80939D019FBFFF91EF9182 :1002C0009F918F912F910F900FBE0F901F901895B7 :1002D000FC01858580FF02C05F9808955F9A0895AC :1002E00080E091E0D5C580E091E088C584B7877F44 :1002F00084BF28E10FB6F89420936000109260004C :100300000FBE87E690E09093CD008093CC0086E00E :100310008093CA001092C8002093C900539A5A9A39 :100320008AB180638AB98BB180638BB983D284E050 :1003300085BD5F9A579A08950F931F93CF93DF93CC :10034000D5DF2FB7F8948EE991E090931F02809348 :100350001E0290932102809320022FBF2FB7F894A2 :1003600089E191E090939A018093990190939C0187 :1003700080939B012FBF7894CEE9D1E003E08FB743 :10038000F894909122028FBF903809F180E091E0BB :10039000ABD497FD1CC0E0911E02F0911F02808338 :1003A000E0911E02F0911F02CF01019690931F026F :1003B00080931E028E51924011F4D283C1839FB765 :1003C000F894809122028F5F809322029FBF8FB7A3 :1003D000F89410919D018FBFA89902C0113678F151 :1003E000A89A80919D01882361F05D980093160181 :1003F00008C089E191E0B1DE682F80E091E0DAD4B5 :1004000011501123B1F780911601882351F080918A :10041000160181508093160180911601882309F4FA :100420005D9A80911701882351F0809117018150C6 :100430008093170180911701882309F45C9A8FB784 :10044000F894909122028FBF992369F08EE991E090 :1004500084DE982F8091C80085FFFCCF9093CE005A :100460005C980093170180E091E095D42AD487CF5F :10047000DA01923049F0933061F09130F9F4E8E913 :10048000F0E022E130E01EC0EAEAF0E02EE330E0E6 :1004900019C0813049F0813018F0823079F408C0F9 :1004A000E8EEF0E0849107C0ECEEF0E0849103C048 :1004B000E0E2F1E08491282F30E004C0E0E0F0E0D9 :1004C00020E030E0ED93FC93C901089528E030E08E :1004D00040E003C04F5F220F331F28173907D0F3C6 :1004E000842F8295807F08958093E9008091EB00AE :1004F00081608093EB001092ED006093EC004093DC :10050000ED008091EE00881F8827881F08951092C3 :10051000F40090E09093E9001092F0001092E8004F :100520001092ED008091EB008E7F8093EB009F5F37 :10053000953081F708958091270288238CF403C0B9 :100540008EB38823B1F08091E80082FFF9CF8091CB :10055000E8008B778093E80008958EB3882349F0F4 :100560008091E80080FFF9CF8091E8008E7780933A :10057000E800089594E68091EC0080FF05C080912A :10058000E80080FF05C023C08091E80082FD1FC005 :100590008EB3882311F482E008958EB3853011F470 :1005A00083E008958091EB0085FF02C081E008950B :1005B0008091E10082FFDFCF8091E1008B7F80930B :1005C000E100992311F484E008959150D4CF80E0A4 :1005D00008959C0140912D0250912E024617570715 :1005E00018F4F90120E038C06115710511F0AB0174 :1005F000F8CF8091E8008E778093E80040E050E0EB :10060000F0CF8091E80083FF02C081E008958091DF :10061000E80082FD2DC08EB3882381F18EB3853032 :1006200079F18091E80080FF17C09091F20006C038 :1006300081918093F100415050409F5F41155105D9 :1006400011F09830A8F320E0983009F421E080916F :10065000E8008E778093E8004115510591F622233A :1006600081F606C08EB3882349F08EB3853041F001 :100670008091E80082FFF6CF80E0089582E008953F :1006800083E008959C0140912D0250912E0246175F :10069000570710F490E03BC06115710511F0AB01F4 :1006A000F9CF8091E8008E778093E80040E050E039 :1006B000F1CF8091E80083FF02C081E0089580912E :1006C000E80082FD30C08EB3882399F18EB3853067 :1006D00091F18091E80080FF1AC08091F20009C07A :1006E000F9012F5F3F4FE491E093F10041505040FA :1006F0008F5F4115510511F0883090F390E08830FC :1007000009F491E08091E8008E778093E80041152C :10071000510579F6992369F606C08EB3882349F00E :100720008EB3853041F08091E80082FFF6CF80E003 :10073000089582E0089583E008959C016115710594 :1007400029F48091E8008B778093E800F90120C0BC :100750008091E80083FF02C081E008958EB3882372 :1007600039F18EB3853031F18091E80082FFF0CF0E :1007700006C08091F10081936150704021F080911A :10078000F2008823B1F78091E8008B778093E8002E :1007900061157105E9F606C08EB3882349F08EB362 :1007A000853041F08091E80080FFF6CF80E0089529 :1007B00082E0089583E0089542D044D01EBA10929A :1007C0002502109224021092230284E089BD89B58B :1007D000826089BD09B400FEFDCF8091D800982FBA :1007E0009F779093D80080688093D80080916300B1 :1007F0008E7F809363008091D8008F7D8093D80096 :100800008091E0008E7F8093E0008091E1008E7FF8 :100810008093E1008091E20081608093E20080910A :10082000E100877F8093E1008091E20088608093FF :10083000E2000895C1DF81E08093260208951092BE :10084000E20008951092E10008951F920F920FB6F2 :100850000F9211241F932F933F934F935F936F93A6 :100860007F938F939F93AF93BF93EF93FF93E9EEA3 :10087000F0E0108117701082E0EFF0E08081877F58 :1008800080837894C3D0F894A9EEB0E01C92E0EF96 :10089000F0E08081886080831C93FF91EF91BF918D :1008A000AF919F918F917F916F915F914F913F9108 :1008B0002F911F910F900FBE0F901F9018951F92B0 :1008C0000F920FB60F9211242F933F934F935F9384 :1008D0006F937F938F939F93AF93BF93EF93FF9308 :1008E0008091E10080FF1BC08091E20080FF17C073 :1008F0008091E1008E7F8093E1008091E2008E7F05 :100900008093E2008091E20080618093E200809118 :10091000D80080628093D80019BC1EBAD1D18091D2 :10092000E10084FF29C08091E20084FF25C084E0BB :1009300089BD89B5826089BD09B400FEFDCF809173 :10094000D8008F7D8093D8008091E1008F7E8093C6 :10095000E1008091E2008F7E8093E2008091E200CE :1009600081608093E20080912502882311F481E068 :1009700001C084E08EBBA4D18091E10083FF27C039 :100980008091E20083FF23C08091E100877F809304 :10099000E10082E08EBB109225028091E1008E7F03 :1009A0008093E1008091E2008E7F8093E20080914D :1009B000E20080618093E200AADD80E060E042E036 :1009C00093DD8091F00088608093F00079D1809170 :1009D000E10082FF0AC08091E20082FF06C08091A0 :1009E000E1008B7F8093E1006BD1FF91EF91BF918C :1009F000AF919F918F917F916F915F914F913F91B7 :100A00002F910F900FBE0F901F9018951F93DF939B :100A1000CF93CDB7DEB7AC970FB6F894DEBF0FBE5D :100A2000CDBFE7E2F2E08091F100819322E0EF3266 :100A3000F207C9F78091270230912802353009F476 :100A400087C0363040F43130C9F1313070F0333086 :100A500009F01DC133C0383009F4EFC0393009F452 :100A6000FEC0363009F013C192C0803821F08238C0 :100A700009F00DC108C090912302809124028823BF :100A800099F0926011C080912B0287708093E900E9 :100A90008091EB0090E025E0969587952A95E1F707 :100AA000982F91701092E9008091E800877F8093E1 :100AB000E8009093F1001092F100CAC0882319F069 :100AC000823009F0E4C090E08F719070009721F0BF :100AD000029709F0DDC00CC080912902813009F035 :100AE000D7C010922402333069F5809324022AC0C3 :100AF00080912902882331F520912B02277009F477 :100B0000C7C02093E9008091EB0080FFC1C0333063 :100B100021F48091EB00806213C08091EB00806132 :100B20008093EB0081E090E002C0880F991F2A9526 :100B3000E2F78093EA001092EA008091EB0088606F :100B40008093EB001092E9008091E800877F83C0DA :100B5000882309F09CC0109129028091E800877FCA :100B60008093E800E8DC04C08EB3882309F490C0C9 :100B70008091E80080FFF8CF812F8F7711F492E009 :100B800001C093E09EBB80688093E30081C08058E1 :100B9000823008F07CC08091290290912A0223E0E3 :100BA0008C3D920799F55FB7F894DE0115964EE0FB :100BB00020E030E061E2E42FF0E0609357008491A0 :100BC00020FF03C082958F704F5F982F9F70892FF1 :100BD000805D8A3308F0895F8C9311961C9211977F :100BE0002F5F3F4F12962431310529F75FBF8AE20C :100BF0008B8383E08C838091E800877F8093E8007B :100C0000CE0103966AE270E0E4DC11C060912B0231 :100C1000AE014F5F5F4F2CDCBC010097C9F18091A2 :100C2000E800877F8093E80089819A812BDD80919D :100C3000E8008B778093E8002BC0803841F58091E5 :100C4000E800877F8093E800809125028093F1007F :100C50008091E8008E778093E8006DDC19C08823CE :100C6000B1F490912902923098F48091E800877F46 :100C70008093E800909325025EDC80912502882312 :100C800011F483E001C084E08EBB2DDB01C028DBC2 :100C90008091E80083FF0AC08091EB00806280931E :100CA000EB008091E800877F8093E800AC960FB658 :100CB000F894DEBF0FBECDBFCF91DF911F91089595 :100CC00008951F938EB3882361F01091E90010926C :100CD000E9008091E80083FF01C098DE177010934F :100CE000E9001F9108950895FC018EB3843021F529 :100CF00087859089A189B2890097A105B105E1F0A6 :100D000085818093E9008091E80082FF15C0809181 :100D1000F200882319F42FEF3FEF04C08091F10017 :100D2000282F30E08091F200882341F48091E80080 :100D30008B778093E80002C02FEF3FEFC901089541 :100D4000FC018EB3843011F587859089A189B28921 :100D50000097A105B105D1F081818093E9008091D0 :100D6000F2008823A9F09091E8008091E8008E7746 :100D70008093E80095FD0CC0FDDB982F882349F493 :100D80008091E8008E778093E80003C092E001C074 :100D900090E0892F0895FC018EB3843051F487854B :100DA0009089A189B2890097A105B10511F0CF0101 :100DB000C7CF08951F93FC01162F8EB38430D9F44A :100DC00087859089A189B2890097A105B10599F01D :100DD00081818093E9008091E80085FD08C08091C1 :100DE000E8008E778093E800C5DB882329F4109310 :100DF000F10080E001C082E01F9108950F931F93DE :100E0000CF93DF93EC010D96FC0189E0DF011D9289 :100E10008A95E9F72A813B8109818C81882311F425 :100E200010E001C014E0C90151DB182B1260802FC3 :100E300061E8412F59DB882329F12E813F810D8103 :100E40008885882311F410E001C014E0C9013EDB5D :100E5000182B1260802F60E8412F46DB882391F029 :100E60002A853B8509858C85882311F410E001C013 :100E700014E0C9012BDB182B1260802F61EC412F8D :100E800033DB01C080E0DF91CF911F910F91089576 :100E9000CF93DF93EC018091E80083FF60C08881ED :100EA00090E020912B0230912C022817390709F08D :100EB00056C080912802813261F0823220F4803263 :100EC00009F04DC019C0823269F1833209F047C080 :100ED00038C080912702813A09F041C08091E80032 :100EE000877F8093E800CE010F9667E070E071DBAA :100EF0008091E8008B7713C080912702813279F5C9 :100F00008091E800877F8093E800CE010F9667E02C :100F100070E013DCCE013ED98091E8008E7780939B :100F2000E8001DC0809127028132C9F48091E80059 :100F3000877F8093E800809129028D87CE01C8D9F0 :100F40000DC080912702813251F48091E800877FA3 :100F50008093E800CE0160912902C5DEECDADF91D2 :100F6000CF910895A1E21A2EAA1BBB1BFD010DC053 :100F7000AA1FBB1FEE1FFF1FA217B307E407F50749 :100F800020F0A21BB30BE40BF50B661F771F881F25 :100F9000991F1A9469F760957095809590959B01BB :0C0FA000AC01BD01CF010895F894FFCF13 :100FAC0000034000000440000002080000000000A4 :060FBC000000000000002F :00000001FF ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial-atmega16u2-Uno-Rev3.hex ================================================ :1000000090C00000A9C00000A7C00000A5C000006B :10001000A3C00000A1C000009FC000009DC0000060 :100020009BC0000099C0000097C0000048C40000B9 :100030000CC4000091C000008FC000008DC0000003 :100040008BC0000089C0000087C0000085C0000090 :1000500083C0000081C000007FC0000002C100001A :100060007BC0000079C0000077C0000075C00000B0 :1000700073C0000071C000006FC000006DC00000C0 :100080006BC0000069C0000067C0000065C00000D0 :1000900063C0000061C000001201100102000008EE :1000A0004123430001000102DC0109023E0002017C :1000B00000C0320904000001020201000524000111 :1000C0001004240206052406000107058203080027 :1000D000FF09040100020A000000070504024000B5 :1000E00001070583024000010403090432034100B3 :1000F00072006400750069006E006F002000280027 :100100007700770077002E006100720064007500B0 :1001100069006E006F002E0063006300290000007C :10012000000011241FBECFEFD2E0DEBFCDBF11E033 :10013000A0E0B1E0ECEAFFE002C005900D92A6312C :10014000B107D9F712E0A6E1B1E001C01D92AF32CC :10015000B107E1F7F1D028C753CF9C01DC01AE57BE :10016000BF4FED91FC91119741911196FC93EE9345 :1001700080589F4FE817F90711F42D933C939FB7D0 :10018000F894F901EC57FF4F8081815080839FBF25 :10019000842F0895DF92EF92FF920F931F93FC013B :1001A0008489813019F0823021F405C040E3D42ED7 :1001B00004C0DD2402C030E2D32E8389823011F4E2 :1001C00088E0D82A8589873031F0883031F0863050 :1001D00031F482E003C084E001C086E0D82A1092A6 :1001E000C9001092C8001092CA00E784F088018903 :1001F000128980E0E81681EEF80680E0080780E0CA :10020000180719F420E130E00FC0C801B701969536 :1002100087957795679560587B47814E9F4FA801DA :100220009701A0D6215030403093CD002093CC00D0 :10023000D092CA0080E0E81681EEF80680E0080758 :1002400080E0180711F082E001C080E08093C800D0 :1002500088E98093C9001F910F91FF90EF90DF9084 :1002600008951F920F920FB60F9211242F938F9320 :100270009F93EF93FF939091CE008EB38430F1F46F :10028000E0919901F0919A019083E0919901F091A8 :100290009A01CF01019690939A018093990189590F :1002A000914021F489E191E0928381839FB7F89492 :1002B00080919D018F5F80939D019FBFFF91EF9182 :1002C0009F918F912F910F900FBE0F901F901895B7 :1002D000FC01858580FF02C05F9808955F9A0895AC :1002E00080E091E0D5C580E091E088C584B7877F44 :1002F00084BF28E10FB6F89420936000109260004C :100300000FBE87E690E09093CD008093CC0086E00E :100310008093CA001092C8002093C900539A5A9A39 :100320008AB180638AB98BB180638BB983D284E050 :1003300085BD5F9A579A08950F931F93CF93DF93CC :10034000D5DF2FB7F8948EE991E090931F02809348 :100350001E0290932102809320022FBF2FB7F894A2 :1003600089E191E090939A018093990190939C0187 :1003700080939B012FBF7894CEE9D1E003E08FB743 :10038000F894909122028FBF903809F180E091E0BB :10039000ABD497FD1CC0E0911E02F0911F02808338 :1003A000E0911E02F0911F02CF01019690931F026F :1003B00080931E028E51924011F4D283C1839FB765 :1003C000F894809122028F5F809322029FBF8FB7A3 :1003D000F89410919D018FBFA89902C0113678F151 :1003E000A89A80919D01882361F05D980093160181 :1003F00008C089E191E0B1DE682F80E091E0DAD4B5 :1004000011501123B1F780911601882351F080918A :10041000160181508093160180911601882309F4FA :100420005D9A80911701882351F0809117018150C6 :100430008093170180911701882309F45C9A8FB784 :10044000F894909122028FBF992369F08EE991E090 :1004500084DE982F8091C80085FFFCCF9093CE005A :100460005C980093170180E091E095D42AD487CF5F :10047000DA01923049F0933061F09130F9F4E8E913 :10048000F0E022E130E01EC0EAEAF0E02EE330E0E6 :1004900019C0813049F0813018F0823079F408C0F9 :1004A000E8EEF0E0849107C0ECEEF0E0849103C048 :1004B000E0E2F1E08491282F30E004C0E0E0F0E0D9 :1004C00020E030E0ED93FC93C901089528E030E08E :1004D00040E003C04F5F220F331F28173907D0F3C6 :1004E000842F8295807F08958093E9008091EB00AE :1004F00081608093EB001092ED006093EC004093DC :10050000ED008091EE00881F8827881F08951092C3 :10051000F40090E09093E9001092F0001092E8004F :100520001092ED008091EB008E7F8093EB009F5F37 :10053000953081F708958091270288238CF403C0B9 :100540008EB38823B1F08091E80082FFF9CF8091CB :10055000E8008B778093E80008958EB3882349F0F4 :100560008091E80080FFF9CF8091E8008E7780933A :10057000E800089594E68091EC0080FF05C080912A :10058000E80080FF05C023C08091E80082FD1FC005 :100590008EB3882311F482E008958EB3853011F470 :1005A00083E008958091EB0085FF02C081E008950B :1005B0008091E10082FFDFCF8091E1008B7F80930B :1005C000E100992311F484E008959150D4CF80E0A4 :1005D00008959C0140912D0250912E024617570715 :1005E00018F4F90120E038C06115710511F0AB0174 :1005F000F8CF8091E8008E778093E80040E050E0EB :10060000F0CF8091E80083FF02C081E008958091DF :10061000E80082FD2DC08EB3882381F18EB3853032 :1006200079F18091E80080FF17C09091F20006C038 :1006300081918093F100415050409F5F41155105D9 :1006400011F09830A8F320E0983009F421E080916F :10065000E8008E778093E8004115510591F622233A :1006600081F606C08EB3882349F08EB3853041F001 :100670008091E80082FFF6CF80E0089582E008953F :1006800083E008959C0140912D0250912E0246175F :10069000570710F490E03BC06115710511F0AB01F4 :1006A000F9CF8091E8008E778093E80040E050E039 :1006B000F1CF8091E80083FF02C081E0089580912E :1006C000E80082FD30C08EB3882399F18EB3853067 :1006D00091F18091E80080FF1AC08091F20009C07A :1006E000F9012F5F3F4FE491E093F10041505040FA :1006F0008F5F4115510511F0883090F390E08830FC :1007000009F491E08091E8008E778093E80041152C :10071000510579F6992369F606C08EB3882349F00E :100720008EB3853041F08091E80082FFF6CF80E003 :10073000089582E0089583E008959C016115710594 :1007400029F48091E8008B778093E800F90120C0BC :100750008091E80083FF02C081E008958EB3882372 :1007600039F18EB3853031F18091E80082FFF0CF0E :1007700006C08091F10081936150704021F080911A :10078000F2008823B1F78091E8008B778093E8002E :1007900061157105E9F606C08EB3882349F08EB362 :1007A000853041F08091E80080FFF6CF80E0089529 :1007B00082E0089583E0089542D044D01EBA10929A :1007C0002502109224021092230284E089BD89B58B :1007D000826089BD09B400FEFDCF8091D800982FBA :1007E0009F779093D80080688093D80080916300B1 :1007F0008E7F809363008091D8008F7D8093D80096 :100800008091E0008E7F8093E0008091E1008E7FF8 :100810008093E1008091E20081608093E20080910A :10082000E100877F8093E1008091E20088608093FF :10083000E2000895C1DF81E08093260208951092BE :10084000E20008951092E10008951F920F920FB6F2 :100850000F9211241F932F933F934F935F936F93A6 :100860007F938F939F93AF93BF93EF93FF93E9EEA3 :10087000F0E0108117701082E0EFF0E08081877F58 :1008800080837894C3D0F894A9EEB0E01C92E0EF96 :10089000F0E08081886080831C93FF91EF91BF918D :1008A000AF919F918F917F916F915F914F913F9108 :1008B0002F911F910F900FBE0F901F9018951F92B0 :1008C0000F920FB60F9211242F933F934F935F9384 :1008D0006F937F938F939F93AF93BF93EF93FF9308 :1008E0008091E10080FF1BC08091E20080FF17C073 :1008F0008091E1008E7F8093E1008091E2008E7F05 :100900008093E2008091E20080618093E200809118 :10091000D80080628093D80019BC1EBAD1D18091D2 :10092000E10084FF29C08091E20084FF25C084E0BB :1009300089BD89B5826089BD09B400FEFDCF809173 :10094000D8008F7D8093D8008091E1008F7E8093C6 :10095000E1008091E2008F7E8093E2008091E200CE :1009600081608093E20080912502882311F481E068 :1009700001C084E08EBBA4D18091E10083FF27C039 :100980008091E20083FF23C08091E100877F809304 :10099000E10082E08EBB109225028091E1008E7F03 :1009A0008093E1008091E2008E7F8093E20080914D :1009B000E20080618093E200AADD80E060E042E036 :1009C00093DD8091F00088608093F00079D1809170 :1009D000E10082FF0AC08091E20082FF06C08091A0 :1009E000E1008B7F8093E1006BD1FF91EF91BF918C :1009F000AF919F918F917F916F915F914F913F91B7 :100A00002F910F900FBE0F901F9018951F93DF939B :100A1000CF93CDB7DEB7AC970FB6F894DEBF0FBE5D :100A2000CDBFE7E2F2E08091F100819322E0EF3266 :100A3000F207C9F78091270230912802353009F476 :100A400087C0363040F43130C9F1313070F0333086 :100A500009F01DC133C0383009F4EFC0393009F452 :100A6000FEC0363009F013C192C0803821F08238C0 :100A700009F00DC108C090912302809124028823BF :100A800099F0926011C080912B0287708093E900E9 :100A90008091EB0090E025E0969587952A95E1F707 :100AA000982F91701092E9008091E800877F8093E1 :100AB000E8009093F1001092F100CAC0882319F069 :100AC000823009F0E4C090E08F719070009721F0BF :100AD000029709F0DDC00CC080912902813009F035 :100AE000D7C010922402333069F5809324022AC0C3 :100AF00080912902882331F520912B02277009F477 :100B0000C7C02093E9008091EB0080FFC1C0333063 :100B100021F48091EB00806213C08091EB00806132 :100B20008093EB0081E090E002C0880F991F2A9526 :100B3000E2F78093EA001092EA008091EB0088606F :100B40008093EB001092E9008091E800877F83C0DA :100B5000882309F09CC0109129028091E800877FCA :100B60008093E800E8DC04C08EB3882309F490C0C9 :100B70008091E80080FFF8CF812F8F7711F492E009 :100B800001C093E09EBB80688093E30081C08058E1 :100B9000823008F07CC08091290290912A0223E0E3 :100BA0008C3D920799F55FB7F894DE0115964EE0FB :100BB00020E030E061E2E42FF0E0609357008491A0 :100BC00020FF03C082958F704F5F982F9F70892FF1 :100BD000805D8A3308F0895F8C9311961C9211977F :100BE0002F5F3F4F12962431310529F75FBF8AE20C :100BF0008B8383E08C838091E800877F8093E8007B :100C0000CE0103966AE270E0E4DC11C060912B0231 :100C1000AE014F5F5F4F2CDCBC010097C9F18091A2 :100C2000E800877F8093E80089819A812BDD80919D :100C3000E8008B778093E8002BC0803841F58091E5 :100C4000E800877F8093E800809125028093F1007F :100C50008091E8008E778093E8006DDC19C08823CE :100C6000B1F490912902923098F48091E800877F46 :100C70008093E800909325025EDC80912502882312 :100C800011F483E001C084E08EBB2DDB01C028DBC2 :100C90008091E80083FF0AC08091EB00806280931E :100CA000EB008091E800877F8093E800AC960FB658 :100CB000F894DEBF0FBECDBFCF91DF911F91089595 :100CC00008951F938EB3882361F01091E90010926C :100CD000E9008091E80083FF01C098DE177010934F :100CE000E9001F9108950895FC018EB3843021F529 :100CF00087859089A189B2890097A105B105E1F0A6 :100D000085818093E9008091E80082FF15C0809181 :100D1000F200882319F42FEF3FEF04C08091F10017 :100D2000282F30E08091F200882341F48091E80080 :100D30008B778093E80002C02FEF3FEFC901089541 :100D4000FC018EB3843011F587859089A189B28921 :100D50000097A105B105D1F081818093E9008091D0 :100D6000F2008823A9F09091E8008091E8008E7746 :100D70008093E80095FD0CC0FDDB982F882349F493 :100D80008091E8008E778093E80003C092E001C074 :100D900090E0892F0895FC018EB3843051F487854B :100DA0009089A189B2890097A105B10511F0CF0101 :100DB000C7CF08951F93FC01162F8EB38430D9F44A :100DC00087859089A189B2890097A105B10599F01D :100DD00081818093E9008091E80085FD08C08091C1 :100DE000E8008E778093E800C5DB882329F4109310 :100DF000F10080E001C082E01F9108950F931F93DE :100E0000CF93DF93EC010D96FC0189E0DF011D9289 :100E10008A95E9F72A813B8109818C81882311F425 :100E200010E001C014E0C90151DB182B1260802FC3 :100E300061E8412F59DB882329F12E813F810D8103 :100E40008885882311F410E001C014E0C9013EDB5D :100E5000182B1260802F60E8412F46DB882391F029 :100E60002A853B8509858C85882311F410E001C013 :100E700014E0C9012BDB182B1260802F61EC412F8D :100E800033DB01C080E0DF91CF911F910F91089576 :100E9000CF93DF93EC018091E80083FF60C08881ED :100EA00090E020912B0230912C022817390709F08D :100EB00056C080912802813261F0823220F4803263 :100EC00009F04DC019C0823269F1833209F047C080 :100ED00038C080912702813A09F041C08091E80032 :100EE000877F8093E800CE010F9667E070E071DBAA :100EF0008091E8008B7713C080912702813279F5C9 :100F00008091E800877F8093E800CE010F9667E02C :100F100070E013DCCE013ED98091E8008E7780939B :100F2000E8001DC0809127028132C9F48091E80059 :100F3000877F8093E800809129028D87CE01C8D9F0 :100F40000DC080912702813251F48091E800877FA3 :100F50008093E800CE0160912902C5DEECDADF91D2 :100F6000CF910895A1E21A2EAA1BBB1BFD010DC053 :100F7000AA1FBB1FEE1FFF1FA217B307E407F50749 :100F800020F0A21BB30BE40BF50B661F771F881F25 :100F9000991F1A9469F760957095809590959B01BB :0C0FA000AC01BD01CF010895F894FFCF13 :100FAC0000034000000440000002080000000000A4 :060FBC000000000000002F :00000001FF ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial-mega.hex ================================================ :10000000A2C00000BBC00000B9C00000B7C0000023 :10001000B5C00000B3C00000B1C00000AFC0000018 :10002000ADC00000ABC00000A9C000005AC4000071 :100030001EC40000A3C00000A1C000009FC00000BB :100040009DC000009BC0000099C0000097C0000048 :1000500095C0000093C0000091C0000014C10000D2 :100060008DC000008BC0000089C0000087C0000068 :1000700085C0000083C0000081C000007FC0000078 :100080007DC000007BC0000079C0000077C0000088 :1000900075C0000073C000001201100102000008CA :1000A0004123100001000102DC0109023E000201AF :1000B00000C0320904000001020201000524000111 :1000C0001004240206052406000107058203080027 :1000D000FF09040100020A000000070504024000B5 :1000E00001070583024000010403090432034100B3 :1000F00072006400750069006E006F002000280027 :100100007700770077002E006100720064007500B0 :1001100069006E006F002E0063006300290000007C :100120002403410072006400750069006E006F00D6 :1001300020004D006500670061002000320035009E :1001400036003000000011241FBECFEFD2E0DEBF2A :10015000CDBF11E0A0E0B1E0E0EDFFE002C005900E :100160000D92A631B107D9F712E0A6E1B1E001C0C6 :100170001D92AF32B107E1F7F1D028C741CF9C0102 :10018000DC01AE57BF4FED91FC9111974191119653 :10019000FC93EE9380589F4FE817F90711F42D93C5 :1001A0003C939FB7F894F901EC57FF4F8081815041 :1001B00080839FBF842F0895DF92EF92FF920F9369 :1001C0001F93FC018489813019F0823021F405C02D :1001D00040E3D42E04C0DD2402C030E2D32E838954 :1001E000823011F488E0D82A8589873031F0883050 :1001F00031F0863031F482E003C084E001C086E053 :10020000D82A1092C9001092C8001092CA00E78440 :10021000F0880189128980E0E81681EEF80680E016 :10022000080780E0180719F420E130E00FC0C8018A :10023000B701969587957795679560587B47814E6E :100240009F4FA8019701A0D6215030403093CD0098 :100250002093CC00D092CA0080E0E81681EEF80628 :1002600080E0080780E0180711F082E001C080E01C :100270008093C80088E98093C9001F910F91FF9077 :10028000EF90DF9008951F920F920FB60F921124F6 :100290002F938F939F93EF93FF939091CE008EB304 :1002A0008430F1F4E0919901F0919A019083E0910A :1002B0009901F0919A01CF01019690939A01809350 :1002C00099018959914021F489E191E092838183D8 :1002D0009FB7F89480919D018F5F80939D019FBF90 :1002E000FF91EF919F918F912F910F900FBE0F90E3 :1002F0001F901895FC01858580FF02C05F980895C6 :100300005F9A089580E091E0D5C580E091E088C5CE :1003100084B7877F84BF28E10FB6F89420936000EC :10032000109260000FBE87E690E09093CD0080931E :10033000CC0086E08093CA001092C8002093C900C8 :10034000539A5A9A8AB180638AB98BB180638BB908 :1003500083D284E085BD5F9A579A08950F931F93C7 :10036000CF93DF93D5DF2FB7F8948EE991E0909388 :100370001F0280931E0290932102809320022FBFC0 :100380002FB7F89489E191E090939A0180939901B5 :1003900090939C0180939B012FBF7894CEE9D1E08C :1003A00003E08FB7F894909122028FBF903809F143 :1003B00080E091E0ABD497FD1CC0E0911E02F0916B :1003C0001F028083E0911E02F0911F02CF0101966F :1003D00090931F0280931E028E51924011F4D2839B :1003E000C1839FB7F894809122028F5F809322028D :1003F0009FBF8FB7F89410919D018FBFA89902C03D :10040000113678F1A89A80919D01882361F05D985A :100410000093160108C089E191E0B1DE682F80E009 :1004200091E0DAD411501123B1F78091160188239D :1004300051F0809116018150809316018091160130 :10044000882309F45D9A80911701882351F08091E7 :10045000170181508093170180911701882309F4B7 :100460005C9A8FB7F894909122028FBF992369F01C :100470008EE991E084DE982F8091C80085FFFCCF43 :100480009093CE005C980093170180E091E095D4A2 :100490002AD487CFDA01923049F0933061F091305D :1004A000F9F4E8E9F0E022E130E01EC0EAEAF0E029 :1004B0002EE330E019C0813049F0813018F08230ED :1004C00079F408C0E8EEF0E0849107C0ECEEF0E0CB :1004D000849103C0E0E2F1E08491282F30E004C071 :1004E000E0E0F0E020E030E0ED93FC93C9010895F6 :1004F00028E030E040E003C04F5F220F331F281791 :100500003907D0F3842F8295807F08958093E90086 :100510008091EB0081608093EB001092ED0060937E :10052000EC004093ED008091EE00881F8827881F23 :1005300008951092F40090E09093E9001092F0007A :100540001092E8001092ED008091EB008E7F809376 :10055000EB009F5F953081F70895809127028823F3 :100560008CF403C08EB38823B1F08091E80082FF41 :10057000F9CF8091E8008B778093E80008958EB3DF :10058000882349F08091E80080FFF9CF8091E8004E :100590008E778093E800089594E68091EC0080FFC8 :1005A00005C08091E80080FF05C023C08091E8006D :1005B00082FD1FC08EB3882311F482E008958EB3AC :1005C000853011F483E008958091EB0085FF02C02F :1005D00081E008958091E10082FFDFCF8091E1000A :1005E0008B7F8093E100992311F484E0089591506A :1005F000D4CF80E008959C0140912D0250912E02AD :100600004617570718F4F90120E038C06115710545 :1006100011F0AB01F8CF8091E8008E778093E8006D :1006200040E050E0F0CF8091E80083FF02C081E01D :1006300008958091E80082FD2DC08EB3882381F15A :100640008EB3853079F18091E80080FF17C09091DA :10065000F20006C081918093F100415050409F5FAD :100660004115510511F09830A8F320E0983009F4B5 :1006700021E08091E8008E778093E80041155105D4 :1006800091F6222381F606C08EB3882349F08EB3FB :10069000853041F08091E80082FFF6CF80E0089538 :1006A00082E0089583E008959C0140912D025091CD :1006B0002E024617570710F490E03BC061157105F4 :1006C00011F0AB01F9CF8091E8008E778093E800BC :1006D00040E050E0F1CF8091E80083FF02C081E06C :1006E00008958091E80082FD30C08EB3882399F18F :1006F0008EB3853091F18091E80080FF1AC080911F :10070000F20009C0F9012F5F3F4FE491E093F1003F :10071000415050408F5F4115510511F0883090F3E2 :1007200090E0883009F491E08091E8008E77809322 :10073000E8004115510579F6992369F606C08EB394 :10074000882349F08EB3853041F08091E80082FF24 :10075000F6CF80E0089582E0089583E008959C013B :100760006115710529F48091E8008B778093E8008A :10077000F90120C08091E80083FF02C081E0089564 :100780008EB3882339F18EB3853031F18091E80042 :1007900082FFF0CF06C08091F100819361507040DC :1007A00021F08091F2008823B1F78091E8008B77E7 :1007B0008093E80061157105E9F606C08EB38823C1 :1007C00049F08EB3853041F08091E80080FFF6CF8C :1007D00080E0089582E0089583E0089542D044D0F7 :1007E0001EBA10922502109224021092230284E075 :1007F00089BD89B5826089BD09B400FEFDCF8091B5 :10080000D800982F9F779093D80080688093D80065 :10081000809163008E7F809363008091D8008F7DEC :100820008093D8008091E0008E7F8093E0008091DB :10083000E1008E7F8093E1008091E20081608093EF :10084000E2008091E100877F8093E1008091E200E7 :1008500088608093E2000895C1DF81E080932602E2 :1008600008951092E20008951092E10008951F92F9 :100870000F920FB60F9211241F932F933F934F9314 :100880005F936F937F938F939F93AF93BF93EF93F8 :10089000FF93E9EEF0E0108117701082E0EFF0E0D6 :1008A0008081877F80837894C3D0F894A9EEB0E0EC :1008B0001C92E0EFF0E08081886080831C93FF91C0 :1008C000EF91BF91AF919F918F917F916F915F91C8 :1008D0004F913F912F911F910F900FBE0F901F903E :1008E00018951F920F920FB60F9211242F933F93DA :1008F0004F935F936F937F938F939F93AF93BF9328 :10090000EF93FF938091E10080FF1BC08091E20094 :1009100080FF17C08091E1008E7F8093E10080917D :10092000E2008E7F8093E2008091E20080618093FC :10093000E2008091D80080628093D80019BC1EBA72 :10094000D1D18091E10084FF29C08091E20084FF31 :1009500025C084E089BD89B5826089BD09B400FEE7 :10096000FDCF8091D8008F7D8093D8008091E100E9 :100970008F7E8093E1008091E2008F7E8093E20081 :100980008091E20081608093E200809125028823BB :1009900011F481E001C084E08EBBA4D18091E1001C :1009A00083FF27C08091E20083FF23C08091E10094 :1009B000877F8093E10082E08EBB109225028091B8 :1009C000E1008E7F8093E1008091E2008E7F809332 :1009D000E2008091E20080618093E200AADD80E085 :1009E00060E042E093DD8091F00088608093F00049 :1009F00079D18091E10082FF0AC08091E20082FFFC :100A000006C08091E1008B7F8093E1006BD1FF9164 :100A1000EF91BF91AF919F918F917F916F915F9176 :100A20004F913F912F910F900FBE0F901F901895EF :100A30001F93DF93CF93CDB7DEB7AC970FB6F89483 :100A4000DEBF0FBECDBFE7E2F2E08091F1008193FF :100A500022E0EF32F207C9F7809127023091280295 :100A6000353009F487C0363040F43130C9F13130C7 :100A700070F0333009F01DC133C0383009F4EFC0D5 :100A8000393009F4FEC0363009F013C192C0803805 :100A900021F0823809F00DC108C0909123028091A5 :100AA0002402882399F0926011C080912B028770F4 :100AB0008093E9008091EB0090E025E09695879582 :100AC0002A95E1F7982F91701092E9008091E80043 :100AD000877F8093E8009093F1001092F100CAC0E4 :100AE000882319F0823009F0E4C090E08F71907093 :100AF000009721F0029709F0DDC00CC08091290217 :100B0000813009F0D7C010922402333069F5809308 :100B100024022AC080912902882331F520912B02DA :100B2000277009F4C7C02093E9008091EB0080FF93 :100B3000C1C0333021F48091EB00806213C08091FA :100B4000EB0080618093EB0081E090E002C0880FB1 :100B5000991F2A95E2F78093EA001092EA008091AB :100B6000EB0088608093EB001092E9008091E80030 :100B7000877F83C0882309F09CC01091290280914F :100B8000E800877F8093E800E8DC04C08EB3882308 :100B900009F490C08091E80080FFF8CF812F8F7713 :100BA00011F492E001C093E09EBB80688093E30063 :100BB00081C08058823008F07CC0809129029091D9 :100BC0002A0223E08C3D920799F55FB7F894DE0185 :100BD00015964EE020E030E061E2E42FF0E0609313 :100BE0005700849120FF03C082958F704F5F982F2C :100BF0009F70892F805D8A3308F0895F8C931196EE :100C00001C9211972F5F3F4F12962431310529F71F :100C10005FBF8AE28B8383E08C838091E800877FCB :100C20008093E800CE0103966AE270E0E4DC11C034 :100C300060912B02AE014F5F5F4F2CDCBC0100972F :100C4000C9F18091E800877F8093E80089819A81CB :100C50002BDD8091E8008B778093E8002BC08038F3 :100C600041F58091E800877F8093E800809125021C :100C70008093F1008091E8008E778093E8006DDC2E :100C800019C08823B1F490912902923098F4809190 :100C9000E800877F8093E800909325025EDC8091D6 :100CA0002502882311F483E001C084E08EBB2DDB94 :100CB00001C028DB8091E80083FF0AC08091EB002F :100CC00080628093EB008091E800877F8093E8004A :100CD000AC960FB6F894DEBF0FBECDBFCF91DF91BB :100CE0001F91089508951F938EB3882361F010918A :100CF000E9001092E9008091E80083FF01C098DECE :100D000017701093E9001F9108950895FC018EB3A8 :100D1000843021F587859089A189B2890097A10542 :100D2000B105E1F085818093E9008091E80082FFC0 :100D300015C08091F200882319F42FEF3FEF04C013 :100D40008091F100282F30E08091F200882341F457 :100D50008091E8008B778093E80002C02FEF3FEF8F :100D6000C9010895FC018EB3843011F587859089FF :100D7000A189B2890097A105B105D1F08181809345 :100D8000E9008091F2008823A9F09091E800809119 :100D9000E8008E778093E80095FD0CC0FDDB982F6E :100DA000882349F48091E8008E778093E80003C09F :100DB00092E001C090E0892F0895FC018EB3843049 :100DC00051F487859089A189B2890097A105B10561 :100DD00011F0CF01C7CF08951F93FC01162F8EB3DA :100DE0008430D9F487859089A189B2890097A105BB :100DF000B10599F081818093E9008091E80085FD3B :100E000008C08091E8008E778093E800C5DB8823D6 :100E100029F41093F10080E001C082E01F91089551 :100E20000F931F93CF93DF93EC010D96FC0189E0A4 :100E3000DF011D928A95E9F72A813B8109818C8126 :100E4000882311F410E001C014E0C90151DB182B14 :100E50001260802F61E8412F59DB882329F12E8110 :100E60003F810D818885882311F410E001C014E0D2 :100E7000C9013EDB182B1260802F60E8412F46DB52 :100E8000882391F02A853B8509858C85882311F478 :100E900010E001C014E0C9012BDB182B1260802F79 :100EA00061EC412F33DB01C080E0DF91CF911F91D6 :100EB0000F910895CF93DF93EC018091E80083FFB9 :100EC00060C0888190E020912B0230912C0228177D :100ED000390709F056C080912802813261F08232D0 :100EE00020F4803209F04DC019C0823269F183329A :100EF00009F047C038C080912702813A09F041C00B :100F00008091E800877F8093E800CE010F9667E02C :100F100070E071DB8091E8008B7713C0809127022D :100F2000813279F58091E800877F8093E800CE01D7 :100F30000F9667E070E013DCCE013ED98091E800A7 :100F40008E778093E8001DC0809127028132C9F41A :100F50008091E800877F8093E800809129028D8747 :100F6000CE01C8D90DC080912702813251F4809101 :100F7000E800877F8093E800CE0160912902C5DEFA :100F8000ECDADF91CF910895A1E21A2EAA1BBB1BC8 :100F9000FD010DC0AA1FBB1FEE1FFF1FA217B30745 :100FA000E407F50720F0A21BB30BE40BF50B661F5B :100FB000771F881F991F1A9469F76095709580951F :100FC00090959B01AC01BD01CF010895F894FFCF2E :100FD0000003400000044000000208000000000080 :060FE0000000000000000B :00000001FF ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial-uno.hex ================================================ :100000009CC00000B5C00000B3C00000B1C000003B :10001000AFC00000ADC00000ABC00000A9C0000030 :10002000A7C00000A5C00000A3C0000054C4000089 :1000300018C400009DC000009BC0000099C00000D3 :1000400097C0000095C0000093C0000091C0000060 :100050008FC000008DC000008BC000000EC10000EA :1000600087C0000085C0000083C0000081C0000080 :100070007FC000007DC000007BC0000079C0000090 :1000800077C0000075C0000073C0000071C00000A0 :100090006FC000006DC000001201100102000008D6 :1000A0004123010001000102DC0109023E000201BE :1000B00000C0320904000001020201000524000111 :1000C0001004240206052406000107058203080027 :1000D000FF09040100020A000000070504024000B5 :1000E00001070583024000010403090432034100B3 :1000F00072006400750069006E006F002000280027 :100100007700770077002E006100720064007500B0 :1001100069006E006F002E0063006300290000007C :100120001803410072006400750069006E006F00E2 :10013000200055006E006F00000011241FBECFEF9D :10014000D2E0DEBFCDBF11E0A0E0B1E0E4ECFFE023 :1001500002C005900D92A631B107D9F712E0A6E1D1 :10016000B1E001C01D92AF32B107E1F7F1D028C76D :1001700047CF9C01DC01AE57BF4FED91FC91119729 :1001800041911196FC93EE9380589F4FE817F90721 :1001900011F42D933C939FB7F894F901EC57FF4F5E :1001A0008081815080839FBF842F0895DF92EF92DA :1001B000FF920F931F93FC018489813019F08230E4 :1001C00021F405C040E3D42E04C0DD2402C030E297 :1001D000D32E8389823011F488E0D82A858987302C :1001E00031F0883031F0863031F482E003C084E0B1 :1001F00001C086E0D82A1092C9001092C80010925F :10020000CA00E784F0880189128980E0E81681EE4F :10021000F80680E0080780E0180719F420E130E0D4 :100220000FC0C801B7019695879577956795605877 :100230007B47814E9F4FA8019701A0D621503040A7 :100240003093CD002093CC00D092CA0080E0E81615 :1002500081EEF80680E0080780E0180711F082E0E0 :1002600001C080E08093C80088E98093C9001F9195 :100270000F91FF90EF90DF9008951F920F920FB6AD :100280000F9211242F938F939F93EF93FF9390914D :10029000CE008EB38430F1F4E0919901F0919A018F :1002A0009083E0919901F0919A01CF01019690938A :1002B0009A01809399018959914021F489E191E053 :1002C000928381839FB7F89480919D018F5F809383 :1002D0009D019FBFFF91EF919F918F912F910F9063 :1002E0000FBE0F901F901895FC01858580FF02C0FE :1002F0005F9808955F9A089580E091E0D5C580E009 :1003000091E088C584B7877F84BF28E10FB6F89451 :1003100020936000109260000FBE87E690E09093FB :10032000CD008093CC0086E08093CA001092C80074 :100330002093C900539A5A9A8AB180638AB98BB1C3 :1003400080638BB983D284E085BD5F9A579A089504 :100350000F931F93CF93DF93D5DF2FB7F8948EE9D8 :1003600091E090931F0280931E029093210280934C :1003700020022FBF2FB7F89489E191E090939A0162 :100380008093990190939C0180939B012FBF789457 :10039000CEE9D1E003E08FB7F894909122028FBFAD :1003A000903809F180E091E0ABD497FD1CC0E0915A :1003B0001E02F0911F028083E0911E02F0911F0245 :1003C000CF01019690931F0280931E028E5192409E :1003D00011F4D283C1839FB7F894809122028F5F7A :1003E000809322029FBF8FB7F89410919D018FBF19 :1003F000A89902C0113678F1A89A80919D018823AE :1004000061F05D980093160108C089E191E0B1DECA :10041000682F80E091E0DAD411501123B1F7809178 :100420001601882351F080911601815080931601A6 :1004300080911601882309F45D9A80911701882321 :1004400051F080911701815080931701809117011D :10045000882309F45C9A8FB7F894909122028FBF99 :10046000992369F08EE991E084DE982F8091C8008D :1004700085FFFCCF9093CE005C980093170180E03D :1004800091E095D42AD487CFDA01923049F09330A5 :1004900061F09130F9F4E8E9F0E022E130E01EC0CB :1004A000EAEAF0E02EE330E019C0813049F0813013 :1004B00018F0823079F408C0E8EEF0E0849107C0CB :1004C000ECEEF0E0849103C0E0E2F1E08491282FAB :1004D00030E004C0E0E0F0E020E030E0ED93FC9399 :1004E000C901089528E030E040E003C04F5F220FCB :1004F000331F28173907D0F3842F8295807F089502 :100500008093E9008091EB0081608093EB00109272 :10051000ED006093EC004093ED008091EE00881FA9 :100520008827881F08951092F40090E09093E900C6 :100530001092F0001092E8001092ED008091EB0014 :100540008E7F8093EB009F5F953081F708958091B7 :10055000270288238CF403C08EB38823B1F08091E6 :10056000E80082FFF9CF8091E8008B778093E80064 :1005700008958EB3882349F08091E80080FFF9CF79 :100580008091E8008E778093E800089594E680914A :10059000EC0080FF05C08091E80080FF05C023C00B :1005A0008091E80082FD1FC08EB3882311F482E0A1 :1005B00008958EB3853011F483E008958091EB00A7 :1005C00085FF02C081E008958091E10082FFDFCFC6 :1005D0008091E1008B7F8093E100992311F484E006 :1005E00008959150D4CF80E008959C0140912D0250 :1005F00050912E024617570718F4F90120E038C031 :100600006115710511F0AB01F8CF8091E8008E778C :100610008093E80040E050E0F0CF8091E80083FF55 :1006200002C081E008958091E80082FD2DC08EB364 :10063000882381F18EB3853079F18091E80080FFC5 :1006400017C09091F20006C081918093F100415053 :1006500050409F5F4115510511F09830A8F320E0FC :10066000983009F421E08091E8008E778093E800CB :100670004115510591F6222381F606C08EB38823D9 :1006800049F08EB3853041F08091E80082FFF6CFCB :1006900080E0089582E0089583E008959C014091F0 :1006A0002D0250912E024617570710F490E03BC0E0 :1006B0006115710511F0AB01F9CF8091E8008E77DB :1006C0008093E80040E050E0F1CF8091E80083FFA4 :1006D00002C081E008958091E80082FD30C08EB3B1 :1006E000882399F18EB3853091F18091E80080FFE5 :1006F0001AC08091F20009C0F9012F5F3F4FE491C9 :10070000E093F100415050408F5F4115510511F0C9 :10071000883090F390E0883009F491E08091E8000F :100720008E778093E8004115510579F6992369F693 :1007300006C08EB3882349F08EB3853041F0809196 :10074000E80082FFF6CF80E0089582E0089583E01C :1007500008959C016115710529F48091E8008B775B :100760008093E800F90120C08091E80083FF02C077 :1007700081E008958EB3882339F18EB3853031F14D :100780008091E80082FFF0CF06C08091F100819354 :100790006150704021F08091F2008823B1F7809180 :1007A000E8008B778093E80061157105E9F606C0D3 :1007B0008EB3882349F08EB3853041F08091E800F4 :1007C00080FFF6CF80E0089582E0089583E00895E9 :1007D00042D044D01EBA10922502109224021092E8 :1007E000230284E089BD89B5826089BD09B400FE19 :1007F000FDCF8091D800982F9F779093D800806884 :100800008093D800809163008E7F809363008091F5 :10081000D8008F7D8093D8008091E0008E7F8093F8 :10082000E0008091E1008E7F8093E1008091E20002 :1008300081608093E2008091E100877F8093E100F6 :100840008091E20088608093E2000895C1DF81E03A :100850008093260208951092E20008951092E1001C :1008600008951F920F920FB60F9211241F932F938A :100870003F934F935F936F937F938F939F93AF9328 :10088000BF93EF93FF93E9EEF0E0108117701082B1 :10089000E0EFF0E08081877F80837894C3D0F89484 :1008A000A9EEB0E01C92E0EFF0E0808188608083E8 :1008B0001C93FF91EF91BF91AF919F918F917F9189 :1008C0006F915F914F913F912F911F910F900FBEAC :1008D0000F901F9018951F920F920FB60F92112430 :1008E0002F933F934F935F936F937F938F939F9338 :1008F000AF93BF93EF93FF938091E10080FF1BC004 :100900008091E20080FF17C08091E1008E7F80938C :10091000E1008091E2008E7F8093E2008091E2000E :1009200080618093E2008091D80080628093D8003B :1009300019BC1EBAD1D18091E10084FF29C08091F9 :10094000E20084FF25C084E089BD89B5826089BD4D :1009500009B400FEFDCF8091D8008F7D8093D80030 :100960008091E1008F7E8093E1008091E2008F7E94 :100970008093E2008091E20081608093E2008091A8 :100980002502882311F481E001C084E08EBBA4D14C :100990008091E10083FF27C08091E20083FF23C0A4 :1009A0008091E100877F8093E10082E08EBB10920E :1009B00025028091E1008E7F8093E1008091E2002A :1009C0008E7F8093E2008091E20080618093E2005C :1009D000AADD80E060E042E093DD8091F000886075 :1009E0008093F00079D18091E10082FF0AC080916C :1009F000E20082FF06C08091E1008B7F8093E100DE :100A00006BD1FF91EF91BF91AF919F918F917F91AA :100A10006F915F914F913F912F910F900FBE0F906B :100A20001F9018951F93DF93CF93CDB7DEB7AC9788 :100A30000FB6F894DEBF0FBECDBFE7E2F2E08091C3 :100A4000F100819322E0EF32F207C9F7809127028B :100A500030912802353009F487C0363040F4313007 :100A6000C9F1313070F0333009F01DC133C0383076 :100A700009F4EFC0393009F4FEC0363009F013C173 :100A800092C0803821F0823809F00DC108C09091E1 :100A9000230280912402882399F0926011C08091F2 :100AA0002B0287708093E9008091EB0090E025E0B5 :100AB000969587952A95E1F7982F91701092E90005 :100AC0008091E800877F8093E8009093F100109276 :100AD000F100CAC0882319F0823009F0E4C090E028 :100AE0008F719070009721F0029709F0DDC00CC063 :100AF00080912902813009F0D7C01092240233304E :100B000069F5809324022AC080912902882331F557 :100B100020912B02277009F4C7C02093E90080912F :100B2000EB0080FFC1C0333021F48091EB00806284 :100B300013C08091EB0080618093EB0081E090E036 :100B400002C0880F991F2A95E2F78093EA0010925D :100B5000EA008091EB0088608093EB001092E9003E :100B60008091E800877F83C0882309F09CC01091A2 :100B700029028091E800877F8093E800E8DC04C0C8 :100B80008EB3882309F490C08091E80080FFF8CFED :100B9000812F8F7711F492E001C093E09EBB8068B3 :100BA0008093E30081C08058823008F07CC080913F :100BB000290290912A0223E08C3D920799F55FB7B4 :100BC000F894DE0115964EE020E030E061E2E42F7B :100BD000F0E060935700849120FF03C082958F70EE :100BE0004F5F982F9F70892F805D8A3308F0895F4F :100BF0008C9311961C9211972F5F3F4F12962431C0 :100C0000310529F75FBF8AE28B8383E08C83809173 :100C1000E800877F8093E800CE0103966AE270E0E7 :100C2000E4DC11C060912B02AE014F5F5F4F2CDC02 :100C3000BC010097C9F18091E800877F8093E800AC :100C400089819A812BDD8091E8008B778093E80081 :100C50002BC0803841F58091E800877F8093E800C1 :100C6000809125028093F1008091E8008E77809337 :100C7000E8006DDC19C08823B1F49091290292300C :100C800098F48091E800877F8093E8009093250294 :100C90005EDC80912502882311F483E001C084E0AA :100CA0008EBB2DDB01C028DB8091E80083FF0AC0EA :100CB0008091EB0080628093EB008091E800877F59 :100CC0008093E800AC960FB6F894DEBF0FBECDBFA0 :100CD000CF91DF911F91089508951F938EB38823BC :100CE00061F01091E9001092E9008091E80083FF23 :100CF00001C098DE17701093E9001F9108950895C0 :100D0000FC018EB3843021F587859089A189B28951 :100D10000097A105B105E1F085818093E9008091FC :100D2000E80082FF15C08091F200882319F42FEFAC :100D30003FEF04C08091F100282F30E08091F20055 :100D4000882341F48091E8008B778093E80002C00B :100D50002FEF3FEFC9010895FC018EB3843011F5E8 :100D600087859089A189B2890097A105B105D1F045 :100D700081818093E9008091F2008823A9F090910D :100D8000E8008091E8008E778093E80095FD0CC024 :100D9000FDDB982F882349F48091E8008E778093BB :100DA000E80003C092E001C090E0892F0895FC01A3 :100DB0008EB3843051F487859089A189B2890097D8 :100DC000A105B10511F0CF01C7CF08951F93FC0114 :100DD000162F8EB38430D9F487859089A189B28982 :100DE0000097A105B10599F081818093E900809178 :100DF000E80085FD08C08091E8008E778093E800C8 :100E0000C5DB882329F41093F10080E001C082E063 :100E10001F9108950F931F93CF93DF93EC010D96CD :100E2000FC0189E0DF011D928A95E9F72A813B8167 :100E300009818C81882311F410E001C014E0C901FC :100E400051DB182B1260802F61E8412F59DB88237A :100E500029F12E813F810D818885882311F410E0CE :100E600001C014E0C9013EDB182B1260802F60E83E :100E7000412F46DB882391F02A853B8509858C85A7 :100E8000882311F410E001C014E0C9012BDB182BFA :100E90001260802F61EC412F33DB01C080E0DF91D5 :100EA000CF911F910F910895CF93DF93EC01809123 :100EB000E80083FF60C0888190E020912B02309190 :100EC0002C022817390709F056C080912802813278 :100ED00061F0823220F4803209F04DC019C08232B4 :100EE00069F1833209F047C038C080912702813A06 :100EF00009F041C08091E800877F8093E800CE012F :100F00000F9667E070E071DB8091E8008B7713C08B :100F100080912702813279F58091E800877F809364 :100F2000E800CE010F9667E070E013DCCE013ED9F9 :100F30008091E8008E778093E8001DC080912702A1 :100F40008132C9F48091E800877F8093E800809126 :100F500029028D87CE01C8D90DC080912702813228 :100F600051F48091E800877F8093E800CE01609182 :100F70002902C5DEECDADF91CF910895A1E21A2EA5 :100F8000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1F2D :100F9000A217B307E407F50720F0A21BB30BE40B7D :100FA000F50B661F771F881F991F1A9469F76095C4 :100FB0007095809590959B01AC01BD01CF0108957E :040FC000F894FFCFD3 :100FC400000340000004400000020800000000008C :060FD40000000000000017 :00000001FF ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial.c ================================================ /* LUFA Library Copyright (C) Dean Camera, 2010. dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /** \file * * Main source file for the Arduino-usbserial project. This file contains the main tasks of * the project and is responsible for the initial application hardware configuration. */ #include "Arduino-usbserial.h" /** Circular buffer to hold data from the host before it is sent to the device via the serial port. */ RingBuff_t USBtoUSART_Buffer; /** Circular buffer to hold data from the serial port before it is sent to the host. */ RingBuff_t USARTtoUSB_Buffer; /** Pulse generation counters to keep track of the number of milliseconds remaining for each pulse type */ volatile struct { uint8_t TxLEDPulse; /**< Milliseconds remaining for data Tx LED pulse */ uint8_t RxLEDPulse; /**< Milliseconds remaining for data Rx LED pulse */ uint8_t PingPongLEDPulse; /**< Milliseconds remaining for enumeration Tx/Rx ping-pong LED pulse */ } PulseMSRemaining; /** LUFA CDC Class driver interface configuration and state information. This structure is * passed to all CDC Class driver functions, so that multiple instances of the same class * within a device can be differentiated from one another. */ USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface = { .Config = { .ControlInterfaceNumber = 0, .DataINEndpointNumber = CDC_TX_EPNUM, .DataINEndpointSize = CDC_TXRX_EPSIZE, .DataINEndpointDoubleBank = false, .DataOUTEndpointNumber = CDC_RX_EPNUM, .DataOUTEndpointSize = CDC_TXRX_EPSIZE, .DataOUTEndpointDoubleBank = false, .NotificationEndpointNumber = CDC_NOTIFICATION_EPNUM, .NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE, .NotificationEndpointDoubleBank = false, }, }; /** Main program entry point. This routine contains the overall program flow, including initial * setup of all components and the main program loop. */ int main(void) { SetupHardware(); RingBuffer_InitBuffer(&USBtoUSART_Buffer); RingBuffer_InitBuffer(&USARTtoUSB_Buffer); sei(); for (;;) { /* Only try to read in bytes from the CDC interface if the transmit buffer is not full */ if (!(RingBuffer_IsFull(&USBtoUSART_Buffer))) { int16_t ReceivedByte = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface); /* Read bytes from the USB OUT endpoint into the USART transmit buffer */ if (!(ReceivedByte < 0)) RingBuffer_Insert(&USBtoUSART_Buffer, ReceivedByte); } /* Check if the UART receive buffer flush timer has expired or the buffer is nearly full */ RingBuff_Count_t BufferCount = RingBuffer_GetCount(&USARTtoUSB_Buffer); if ((TIFR0 & (1 << TOV0)) || (BufferCount > BUFFER_NEARLY_FULL)) { TIFR0 |= (1 << TOV0); if (USARTtoUSB_Buffer.Count) { LEDs_TurnOnLEDs(LEDMASK_TX); PulseMSRemaining.TxLEDPulse = TX_RX_LED_PULSE_MS; } /* Read bytes from the USART receive buffer into the USB IN endpoint */ while (BufferCount--) CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_Remove(&USARTtoUSB_Buffer)); /* Turn off TX LED(s) once the TX pulse period has elapsed */ if (PulseMSRemaining.TxLEDPulse && !(--PulseMSRemaining.TxLEDPulse)) LEDs_TurnOffLEDs(LEDMASK_TX); /* Turn off RX LED(s) once the RX pulse period has elapsed */ if (PulseMSRemaining.RxLEDPulse && !(--PulseMSRemaining.RxLEDPulse)) LEDs_TurnOffLEDs(LEDMASK_RX); } /* Load the next byte from the USART transmit buffer into the USART */ if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) { Serial_TxByte(RingBuffer_Remove(&USBtoUSART_Buffer)); LEDs_TurnOnLEDs(LEDMASK_RX); PulseMSRemaining.RxLEDPulse = TX_RX_LED_PULSE_MS; } CDC_Device_USBTask(&VirtualSerial_CDC_Interface); USB_USBTask(); } } /** Configures the board hardware and chip peripherals for the demo's functionality. */ void SetupHardware(void) { /* Disable watchdog if enabled by bootloader/fuses */ MCUSR &= ~(1 << WDRF); wdt_disable(); /* Hardware Initialization */ Serial_Init(9600, false); LEDs_Init(); USB_Init(); /* Start the flush timer so that overflows occur rapidly to push received bytes to the USB interface */ TCCR0B = (1 << CS02); /* Pull target /RESET line high */ AVR_RESET_LINE_PORT |= AVR_RESET_LINE_MASK; AVR_RESET_LINE_DDR |= AVR_RESET_LINE_MASK; } /** Event handler for the library USB Configuration Changed event. */ void EVENT_USB_Device_ConfigurationChanged(void) { CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface); } /** Event handler for the library USB Unhandled Control Request event. */ void EVENT_USB_Device_UnhandledControlRequest(void) { CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface); } /** Event handler for the CDC Class driver Line Encoding Changed event. * * \param[in] CDCInterfaceInfo Pointer to the CDC class interface configuration structure being referenced */ void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { uint8_t ConfigMask = 0; switch (CDCInterfaceInfo->State.LineEncoding.ParityType) { case CDC_PARITY_Odd: ConfigMask = ((1 << UPM11) | (1 << UPM10)); break; case CDC_PARITY_Even: ConfigMask = (1 << UPM11); break; } if (CDCInterfaceInfo->State.LineEncoding.CharFormat == CDC_LINEENCODING_TwoStopBits) ConfigMask |= (1 << USBS1); switch (CDCInterfaceInfo->State.LineEncoding.DataBits) { case 6: ConfigMask |= (1 << UCSZ10); break; case 7: ConfigMask |= (1 << UCSZ11); break; case 8: ConfigMask |= ((1 << UCSZ11) | (1 << UCSZ10)); break; } /* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */ UCSR1B = 0; UCSR1A = 0; UCSR1C = 0; /* Special case 57600 baud for compatibility with the ATmega328 bootloader. */ UBRR1 = (CDCInterfaceInfo->State.LineEncoding.BaudRateBPS == 57600) ? SERIAL_UBBRVAL(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS) : SERIAL_2X_UBBRVAL(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS); UCSR1C = ConfigMask; UCSR1A = (CDCInterfaceInfo->State.LineEncoding.BaudRateBPS == 57600) ? 0 : (1 << U2X1); UCSR1B = ((1 << RXCIE1) | (1 << TXEN1) | (1 << RXEN1)); } /** ISR to manage the reception of data from the serial port, placing received bytes into a circular buffer * for later transmission to the host. */ ISR(USART1_RX_vect, ISR_BLOCK) { uint8_t ReceivedByte = UDR1; if (USB_DeviceState == DEVICE_STATE_Configured) RingBuffer_Insert(&USARTtoUSB_Buffer, ReceivedByte); } /** Event handler for the CDC Class driver Host-to-Device Line Encoding Changed event. * * \param[in] CDCInterfaceInfo Pointer to the CDC class interface configuration structure being referenced */ void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { bool CurrentDTRState = (CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR); if (CurrentDTRState) AVR_RESET_LINE_PORT &= ~AVR_RESET_LINE_MASK; else AVR_RESET_LINE_PORT |= AVR_RESET_LINE_MASK; } ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial.h ================================================ /* LUFA Library Copyright (C) Dean Camera, 2010. dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /** \file * * Header file for Arduino-usbserial.c. */ #ifndef _ARDUINO_USBSERIAL_H_ #define _ARDUINO_USBSERIAL_H_ /* Includes: */ #include #include #include #include #include "Descriptors.h" #include "Lib/LightweightRingBuff.h" #include #include #include #include #include /* Macros: */ /** LED mask for the library LED driver, to indicate TX activity. */ #define LEDMASK_TX LEDS_LED1 /** LED mask for the library LED driver, to indicate RX activity. */ #define LEDMASK_RX LEDS_LED2 /** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ #define LEDMASK_ERROR (LEDS_LED1 | LEDS_LED2) /** LED mask for the library LED driver, to indicate that the USB interface is busy. */ #define LEDMASK_BUSY (LEDS_LED1 | LEDS_LED2) /* Function Prototypes: */ void SetupHardware(void); void EVENT_USB_Device_Connect(void); void EVENT_USB_Device_Disconnect(void); void EVENT_USB_Device_ConfigurationChanged(void); void EVENT_USB_Device_UnhandledControlRequest(void); void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo); void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo); #endif /* _ARDUINO_USBSERIAL_H_ */ ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Board/LEDs.h ================================================ /* LUFA Library Copyright (C) Dean Camera, 2010. dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /* Board LEDs driver for the Benito board, from www.dorkbotpdx.org. */ #ifndef __LEDS_ARDUINOUNO_H__ #define __LEDS_ARDUINOUNO_H__ /* Includes: */ #include /* Enable C linkage for C++ Compilers: */ #if defined(__cplusplus) extern "C" { #endif /* Preprocessor Checks: */ #if !defined(INCLUDE_FROM_LEDS_H) #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead. #endif /* Public Interface - May be used in end-application: */ /* Macros: */ /** LED mask for the first LED on the board. */ #define LEDS_LED1 (1 << 5) /** LED mask for the second LED on the board. */ #define LEDS_LED2 (1 << 4) /** LED mask for all the LEDs on the board. */ #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2) /** LED mask for the none of the board LEDs */ #define LEDS_NO_LEDS 0 /* Inline Functions: */ #if !defined(__DOXYGEN__) static inline void LEDs_Init(void) { DDRD |= LEDS_ALL_LEDS; PORTD |= LEDS_ALL_LEDS; } static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) { PORTD &= ~LEDMask; } static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) { PORTD |= LEDMask; } static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) { PORTD = ((PORTD | LEDS_ALL_LEDS) & ~LEDMask); } static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, const uint8_t ActiveMask) { PORTD = ((PORTD | ActiveMask) & ~LEDMask); } static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) { PORTD ^= LEDMask; } static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; static inline uint8_t LEDs_GetLEDs(void) { return (PORTD & LEDS_ALL_LEDS); } #endif /* Disable C linkage for C++ Compilers: */ #if defined(__cplusplus) } #endif #endif ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Descriptors.c ================================================ /* LUFA Library Copyright (C) Dean Camera, 2010. dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /** \file * * USB Device Descriptors, for library use when in USB device mode. Descriptors are special * computer-readable structures which the host requests upon device enumeration, to determine * the device's capabilities and functions. */ #include "Descriptors.h" /* On some devices, there is a factory set internal serial number which can be automatically sent to the host as * the device's serial number when the Device Descriptor's .SerialNumStrIndex entry is set to USE_INTERNAL_SERIAL. * This allows the host to track a device across insertions on different ports, allowing them to retain allocated * resources like COM port numbers and drivers. On demos using this feature, give a warning on unsupported devices * so that the user can supply their own serial number descriptor instead or remove the USE_INTERNAL_SERIAL value * from the Device Descriptor (forcing the host to generate a serial number for each device from the VID, PID and * port location). */ #if (USE_INTERNAL_SERIAL == NO_DESCRIPTOR) #warning USE_INTERNAL_SERIAL is not available on this AVR - please manually construct a device serial descriptor. #endif /** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall * device characteristics, including the supported USB version, control endpoint size and the * number of device configurations. The descriptor is read out by the USB host when the enumeration * process begins. */ const USB_Descriptor_Device_t PROGMEM DeviceDescriptor = { .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, .USBSpecification = VERSION_BCD(01.10), .Class = 0x02, .SubClass = 0x00, .Protocol = 0x00, .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, .VendorID = 0x03EB, // Atmel .ProductID = 0x204B, // LUFA USB to Serial Demo Application .ReleaseNumber = 0x0001, .ManufacturerStrIndex = 0x01, .ProductStrIndex = 0x02, .SerialNumStrIndex = USE_INTERNAL_SERIAL, .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS }; /** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage * of the device in one of its supported configurations, including information about any device interfaces * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting * a configuration so that the host may correctly communicate with the USB device. */ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = { .Config = { .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), .TotalInterfaces = 2, .ConfigurationNumber = 1, .ConfigurationStrIndex = NO_DESCRIPTOR, .ConfigAttributes = (USB_CONFIG_ATTR_BUSPOWERED | USB_CONFIG_ATTR_SELFPOWERED), .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) }, .CDC_CCI_Interface = { .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, .InterfaceNumber = 0, .AlternateSetting = 0, .TotalEndpoints = 1, .Class = 0x02, .SubClass = 0x02, .Protocol = 0x01, .InterfaceStrIndex = NO_DESCRIPTOR }, .CDC_Functional_IntHeader = { .Header = {.Size = sizeof(CDC_FUNCTIONAL_DESCRIPTOR(2)), .Type = 0x24}, .SubType = 0x00, .Data = {0x01, 0x10} }, .CDC_Functional_AbstractControlManagement = { .Header = {.Size = sizeof(CDC_FUNCTIONAL_DESCRIPTOR(1)), .Type = 0x24}, .SubType = 0x02, .Data = {0x06} }, .CDC_Functional_Union = { .Header = {.Size = sizeof(CDC_FUNCTIONAL_DESCRIPTOR(2)), .Type = 0x24}, .SubType = 0x06, .Data = {0x00, 0x01} }, .CDC_NotificationEndpoint = { .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, .EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_IN | CDC_NOTIFICATION_EPNUM), .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), .EndpointSize = CDC_NOTIFICATION_EPSIZE, .PollingIntervalMS = 0xFF }, .CDC_DCI_Interface = { .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, .InterfaceNumber = 1, .AlternateSetting = 0, .TotalEndpoints = 2, .Class = 0x0A, .SubClass = 0x00, .Protocol = 0x00, .InterfaceStrIndex = NO_DESCRIPTOR }, .CDC_DataOutEndpoint = { .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, .EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_OUT | CDC_RX_EPNUM), .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), .EndpointSize = CDC_TXRX_EPSIZE, .PollingIntervalMS = 0x01 }, .CDC_DataInEndpoint = { .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, .EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_IN | CDC_TX_EPNUM), .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), .EndpointSize = CDC_TXRX_EPSIZE, .PollingIntervalMS = 0x01 } }; /** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate * via the language ID table available at USB.org what languages the device supports for its string descriptors. */ const USB_Descriptor_String_t PROGMEM LanguageString = { .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, .UnicodeString = {LANGUAGE_ID_ENG} }; /** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable * form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device * Descriptor. */ const USB_Descriptor_String_t PROGMEM ManufacturerString = { .Header = {.Size = USB_STRING_LEN(24), .Type = DTYPE_String}, .UnicodeString = L"Arduino (www.arduino.cc)" }; /** Product descriptor string. This is a Unicode string containing the product's details in human readable form, * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device * Descriptor. */ const USB_Descriptor_String_t PROGMEM ProductString = { #if (ARDUINO_MODEL_PID == ARDUINO_UNO_PID) .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, .UnicodeString = L"Arduino Uno" #elif (ARDUINO_MODEL_PID == ARDUINO_MEGA2560_PID) .Header = {.Size = USB_STRING_LEN(17), .Type = DTYPE_String}, .UnicodeString = L"Arduino Mega 2560" #endif }; /** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors" * documentation) by the application code so that the address and size of a requested descriptor can be given * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the * USB host. */ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex, void** const DescriptorAddress) { const uint8_t DescriptorType = (wValue >> 8); const uint8_t DescriptorNumber = (wValue & 0xFF); void* Address = NULL; uint16_t Size = NO_DESCRIPTOR; switch (DescriptorType) { case DTYPE_Device: Address = (void*)&DeviceDescriptor; Size = sizeof(USB_Descriptor_Device_t); break; case DTYPE_Configuration: Address = (void*)&ConfigurationDescriptor; Size = sizeof(USB_Descriptor_Configuration_t); break; case DTYPE_String: switch (DescriptorNumber) { case 0x00: Address = (void*)&LanguageString; Size = pgm_read_byte(&LanguageString.Header.Size); break; case 0x01: Address = (void*)&ManufacturerString; Size = pgm_read_byte(&ManufacturerString.Header.Size); break; case 0x02: Address = (void*)&ProductString; Size = pgm_read_byte(&ProductString.Header.Size); break; } break; } *DescriptorAddress = Address; return Size; } ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Descriptors.h ================================================ /* LUFA Library Copyright (C) Dean Camera, 2010. dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /** \file * * Header file for Descriptors.c. */ #ifndef _DESCRIPTORS_H_ #define _DESCRIPTORS_H_ /* Includes: */ #include #include #include /* Product-specific definitions: */ #define ARDUINO_UNO_PID 0x0001 #define ARDUINO_MEGA2560_PID 0x0010 /* Macros: */ /** Endpoint number of the CDC device-to-host notification IN endpoint. */ #define CDC_NOTIFICATION_EPNUM 2 /** Endpoint number of the CDC device-to-host data IN endpoint. */ #define CDC_TX_EPNUM 3 /** Endpoint number of the CDC host-to-device data OUT endpoint. */ #define CDC_RX_EPNUM 4 /** Size in bytes of the CDC device-to-host notification IN endpoint. */ #define CDC_NOTIFICATION_EPSIZE 8 /** Size in bytes of the CDC data IN and OUT endpoints. */ #define CDC_TXRX_EPSIZE 64 /* Type Defines: */ /** Type define for the device configuration descriptor structure. This must be defined in the * application code, as the configuration descriptor contains several sub-descriptors which * vary between devices, and which describe the device's usage to the host. */ typedef struct { USB_Descriptor_Configuration_Header_t Config; USB_Descriptor_Interface_t CDC_CCI_Interface; CDC_FUNCTIONAL_DESCRIPTOR(2) CDC_Functional_IntHeader; CDC_FUNCTIONAL_DESCRIPTOR(1) CDC_Functional_AbstractControlManagement; CDC_FUNCTIONAL_DESCRIPTOR(2) CDC_Functional_Union; USB_Descriptor_Endpoint_t CDC_NotificationEndpoint; USB_Descriptor_Interface_t CDC_DCI_Interface; USB_Descriptor_Endpoint_t CDC_DataOutEndpoint; USB_Descriptor_Endpoint_t CDC_DataInEndpoint; } USB_Descriptor_Configuration_t; /* Function Prototypes: */ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex, void** const DescriptorAddress) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); #endif ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Genuino-usbserial-atmega16u2-Mega2560-R3.hex ================================================ :100000009EC00000B7C00000B5C00000B3C0000033 :10001000B1C00000AFC00000ADC00000ABC0000028 :10002000A9C00000A7C00000A5C00000FCC30000DC :10003000A1C400009FC000009DC000009BC0000044 :1000400099C0000097C0000095C0000093C0000058 :1000500091C000008FC000008DC00000C6C100002C :1000600089C0000087C0000085C0000083C0000078 :1000700081C00000160538052206380522067A05DB :1000800097052206EA05FC052403470065006E007B :10009000750069006E006F0020004D00650067006C :1000A00061002000320035003600300000003A03C5 :1000B000410072006400750069006E006F0020004E :1000C0004C004C00430020002800770077007700A8 :1000D0002E00610072006400750069006E006F0000 :1000E0002E006300630029000000040309040902D4 :1000F0003E00020100C032090400000102020100BA :100100000524000110042402060524060001070549 :1001100082030800FF09040100020A00000007052D :100120000402400001070583024000011201100192 :10013000020000084123420201000102DC011124F7 :100140001FBECFEFD2E0DEBFCDBF11E0A0E0B1E037 :10015000EEE4FFE002C005900D92A631B107D9F799 :1001600012E0A6E1B1E001C01D92AF32B107E1F7A4 :1001700064D0EBC645CFFC01E058FF4FA081B181B0 :100180006C93A081B1819D012F5F3F4F318320830C :100190002E173F0721F412969C938E9311972FB739 :1001A000F894FC01EC57FF4F80818F5F80832FBF55 :1001B0000895DC01AE57BF4FED91FC91119741912D :1001C0001196FC93EE939C0120583F4FE217F307E2 :1001D00011F48D939C932FB7F894FC01EC57FF4FCB :1001E0009081915090832FBF842F089584B7877F8B :1001F00084BF88E10FB6F89480936000109260008D :100200000FBE87E690E09093CD008093CC0086E00F :100210008093CA001092C80088E18093C900539A65 :100220005A9A8AB180638AB98BB180638BB9F0D254 :1002300084E085BD5F9A579A0895D8DF2FB7F89468 :100240008EE991E090931F0280931E029093210209 :10025000809320022FBF2FB7F89489E191E090930B :100260009A018093990190939C0180939B012FBFE9 :100270007894D3E09FB7F894809122029FBF803892 :1002800049F080E091E00ED697FD04C0682F8EE91A :1002900091E071DF8FB7F894C0919D018FBFA8994D :1002A00002C0C13658F1A89A80919D01882319F0A7 :1002B0005D98D0931601CC2349F089E191E079DF74 :1002C000682F80E091E093D5C150F5CF8091160161 :1002D000882341F08091160181508093160181118D :1002E00001C05D9A80911701882341F08091170128 :1002F000815080931701811101C05C9A9FB7F894D7 :10030000809122029FBF882361F08EE991E051DF46 :100310009091C80095FFFCCF8093CE005C98D0935D :10032000170180E091E0B0D59AD4A4CF80E091E0AD :1003300011C580E091E0A5C41F93CF93DF93EC013A :100340008C89813031F0823011F010E003C010E26E :1003500001C010E38B89823009F418608D898730E1 :1003600031F0883031F0863029F4126003C0146017 :1003700001C016601092C9001092C8001092CA0005 :100380002F85388949895A89211581EE3807410519 :10039000510571F0CA01B9019695879577956795D2 :1003A00060587B47814E9F4FA8D52150310902C02C :1003B00020E130E03093CD002093CC001093CA00B0 :1003C0008F859889A989BA898115914EA105B105B2 :1003D00011F480E001C082E08093C80088E9809336 :1003E000C900DF91CF911F9108951F920F920FB610 :1003F0000F9211242F933F934F935F936F937F93AB :100400008F939F93AF93BF93EF93FF936091CE0031 :100410008EB3843019F489E191E0ADDEFF91EF9164 :10042000BF91AF919F918F917F916F915F914F910C :100430003F912F910F900FBE0F901F901895FC01C8 :10044000858580FF02C05F9808955F9A0895292FDF :1004500033272230310559F02330310569F021303E :100460003105F9F482E190E02CE231E01EC08EE328 :1004700090E02EEE30E019C099278130910541F0CF :100480008230910541F0892B61F4EAEEF0E005C07D :10049000EEEAF0E002C0E8E8F0E0849190E09F012D :1004A00004C080E090E020E030E0FA013183208356 :1004B000089528E030E040E02817390720F44F5F26 :1004C000220F331FF9CF842F8295807F0895809368 :1004D000E900EBEEF0E0808181608083EDEEF0E0FA :1004E00010826093EC0040838091EE00881F882783 :1004F000881F08951092F40080E08093E900109224 :10050000F0001092E8001092ED009091EB009E7FB9 :100510009093EB008F5F853081F7089580912702DB :1005200087FD05C08091E80080FF0DC010C080915C :10053000E80082FD04C08EB38111F9CF0895809147 :10054000E8008B7707C08EB38111ECCF08958091BE :10055000E8008E778093E800089585E69091EC009E :1005600090FF05C09091E80090FF05C01BC09091DE :10057000E80092FD17C09EB39923B1F09EB3953069 :10058000A9F09091EB0095FD13C09091E10092FFCE :10059000E5CF9091E1009B7F9093E1008150F1F6CF :1005A00084E0089580E0089582E0089583E008954E :1005B00081E0089520912D0230912E0226173707F1 :1005C00048F06115710539F42091E8002E772093E9 :1005D000E80001C0B90130E06115710591F1209189 :1005E000E80023FD38C02091E80022FF06C080917A :1005F000E80082FF29C080E008952EB3222369F12C :100600002EB3253061F12091E80020FFE5CF209145 :10061000F200FC01CF016115710549F0283038F472 :1006200081918093F100615071092F5FF3CF31E028 :10063000283009F030E02091E8002E772093E80080 :10064000CBCF3111CCCFD3CF8EB3882331F08EB343 :10065000853069F604C081E0089582E0089583E062 :10066000089520912D0230912E022617370748F069 :100670006115710539F42091E8002E772093E80088 :1006800001C0B90130E06115710599F12091E800D0 :1006900023FD39C02091E80022FF06C08091E800C8 :1006A00082FF2AC080E008952EB3222371F12EB379 :1006B000253069F12091E80020FFE5CF2091F2007C :1006C000FC01CF016115710551F0283040F484918F :1006D0008093F100615071092F5F3196F2CF31E0C4 :1006E000283009F030E02091E8002E772093E800D0 :1006F000CACF3111CBCFD2CF8EB3882331F08EB396 :10070000853061F604C081E0089582E0089583E0B9 :1007100008956115710529F42091E8002B77209345 :10072000E8006115710549F12091E80023FD2AC018 :100730002EB3222359F12EB3253051F12091E80038 :1007400022FFF2CFFC018091F200882371F09F011B :100750002F5F3F4FC9014091F10040836150710903 :1007600061157105C9F2F901EECFCF01D5CF8EB376 :10077000882361F08EB3853059F08091E80080FFC6 :10078000F6CF02C081E0089580E0089582E00895E8 :1007900083E0089542D044D01EBA109225021092F0 :1007A00024021092230284E089BD89B5826089BD4C :1007B00009B400FEFDCF8091D800982F9F779093C9 :1007C000D80080688093D800809163008E7F8093EA :1007D00063008091D8008F7D8093D8008091E000E5 :1007E0008E7F8093E0008091E1008E7F8093E10016 :1007F0008091E20081608093E2008091E100877F38 :100800008093E1008091E20088608093E200089587 :10081000C1DF81E08093260208951092E2000895DE :100820001092E10008951F920F920FB60F921124BB :100830002F933F934F935F936F937F938F939F93E8 :10084000AF93BF93EF93FF938091E10080FF1BC0B4 :100850008091E20080FF17C08091E1008E7F80933D :10086000E1008091E2008E7F8093E2008091E200BF :1008700080618093E2008091D80080628093D800EC :1008800019BC1EBAEBD18091E10084FF29C0809190 :10089000E20084FF25C084E089BD89B5826089BDFE :1008A00009B400FEFDCF8091D8008F7D8093D800E1 :1008B0008091E1008F7E8093E1008091E2008F7E45 :1008C0008093E2008091E20081608093E200809159 :1008D0002502882311F084E001C081E08EBBBED1E7 :1008E0008091E10083FF27C08091E20083FF23C055 :1008F0008091E100877F8093E10082E08EBB1092BF :1009000025028091E1008E7F8093E1008091E200DA :100910008E7F8093E2008091E20080618093E2000C :10092000E9DD42E060E080E0D2DD8091F0008860A7 :100930008093F00093D18091E10082FF0AC0809102 :10094000E20082FF06C08091E1008B7F8093E1008E :1009500085D1FF91EF91BF91AF919F918F917F9141 :100960006F915F914F913F912F910F900FBE0F901C :100970001F9018951F920F920FB60F9211242F936C :100980003F934F935F936F937F938F939F93AF9317 :10099000BF93CF93EF93FF93E9EEF0E0C081C77070 :1009A0001082E0EFF0E08081877F808378941CD014 :1009B000F894E9EEF0E01082A0EFB0E08C9188604E :1009C0008C93C083FF91EF91CF91BF91AF919F9195 :1009D0008F917F916F915F914F913F912F910F90E8 :1009E0000FBE0F901F9018951F93CF93DF93CDB735 :1009F000DEB7AA970FB6F894DEBF0FBECDBFE7E211 :100A0000F2E08091F100819322E0EF32F207C9F722 :100A10002091270230912802832F90E08A3091059F :100A200008F010C1FC01E65CFF4F89C2203881F05C :100A3000223809F007C180912B0287708093E9006A :100A40008091EB0085FB882780F91092E90006C0B1 :100A50008091230290912402911182609091E8008C :100A6000977F9093E8008093F1001092F100BDC051 :100A7000822F8D7F09F0E6C0222319F0223061F029 :100A8000D2C080912902813009F0CDC0333009F005 :100A900080E08093240228C080912902811124C023 :100AA00020912B02277009F4BEC02093E9008091A9 :100AB000EB0080FFB8C08091EB00333011F480620E :100AC00011C080618093EB0081E090E0022E01C0B4 :100AD000880F0A94EAF78093EA001092EA00809166 :100AE000EB0088608093EB001092E9008091E800B1 :100AF000877F7EC02111A6C0109129028091E80055 :100B0000877F8093E8000ADD8091E80080FD04C0C3 :100B10008EB38111F9CF87C0812F8F7711F093E0C9 :100B200001C092E09EBB80688093E3007CC02058A7 :100B3000223008F087C08091290290912A028C3DD2 :100B400023E0920781F583E08A838AE289834FB7A5 :100B5000F894DE01139620E03EE051E2E32FF0E04E :100B600050935700E49120FF03C0E295EF703F5F80 :100B7000EF7090E39E0F9A3310F0E95C01C0E92F0B :100B80008E2F90E08D939D932F5F243139F74FBFC7 :100B90008091E800877F8093E8006AE270E0CE01F0 :100BA000019608DD11C0AE014F5F5F4F60912B02CF :100BB0004EDC0097C1F12091E800277F2093E800E8 :100BC000BC0189819A814DDD8091E8008B7780930B :100BD000E80029C02038B1F58091E800877F809334 :100BE000E800809125028093F1008091E8008E77E3 :100BF0008093E80093DC17C0211124C09091290252 :100C0000923088F48091E800877F8093E800909389 :100C1000250284DC80912502882311F084E001C044 :100C200083E08EBB83DB8091E80083FF0DC0809161 :100C3000EB0080628093EB008091E800877F8093D7 :100C4000E80002C076DBEFCFAA960FB6F894DEBFBD :100C50000FBECDBFDF91CF911F9108950895CF931F :100C60008EB3882359F0C091E900C7701092E90053 :100C70008091E80083FDB8DEC093E900CF9108952C :100C80000895CF93DF93EC018091E80083FF5FC06C :100C9000888190E020912B0230912C02281739078F :100CA00009F055C080912802813249F018F4803251 :100CB000C9F04DC0823261F18332C9F148C08091E0 :100CC0002702813A09F043C08091E800877F809332 :100CD000E80067E070E0CE010F966CDC8091E800E0 :100CE0008B7713C080912702813289F58091E800CB :100CF000877F8093E80067E070E0CE010F9609DD02 :100D0000CE011ADB8091E8008E778093E8001FC047 :100D1000809127028132D9F48091E800877F809307 :100D2000E800809129028D87CE0189DB0DC080917A :100D30002702813261F48091E800877F8093E80088 :100D400060912902CE019CDFDF91CF91E7CBDF914B :100D5000CF9108950F931F93CF93DF93EC01FC0184 :100D60003D9689E0DF011D928A95E9F72A813B8152 :100D70008C81882311F014E001C010E00981C901C1 :100D800098DB412F482B426061E8802FA0DB88234D :100D900041F12E813F818885882311F014E001C044 :100DA00010E00D81C90185DB412F482B426060E8CE :100DB000802F8DDB8823A9F02A853B858C858823AD :100DC00011F014E001C010E0C985C90172DB412FA8 :100DD000482B426061EC8C2FDF91CF911F910F91D6 :100DE00076CB80E0DF91CF911F910F910895CF9343 :100DF000C62F2EB32430E9F4FC0147855089618960 :100E00007289452B462B472BA1F081818093E90005 :100E10008091E80085FF04C0C093F10080E00AC023 :100E20008091E8008E778093E80097DB8823A1F318 :100E300001C082E0CF9108952EB3243019F5FC0152 :100E40004785508961897289452B462B472BD1F004 :100E500081818093E9008091F200882389F090914C :100E6000E8008091E8008E778093E80095FD08C047 :100E700074DB811108C08091E8008E778093E800D0 :100E800080E0089582E008952EB3243051F4FC01EF :100E90004785508961897289452B462B472B09F07C :100EA000CBCF08952EB3243019F08FEF9FEF089524 :100EB000FC014785508961897289452B462B472B58 :100EC000A1F385818093E9008091E80082FFEDCF56 :100ED0008091F200882321F02091F10030E002C0DF :100EE0002FEF3FEF8091F200811105C08091E80063 :100EF0008B778093E800C9010895A1E21A2EAA1BFE :100F0000BB1BFD010DC0AA1FBB1FEE1FFF1FA217B9 :100F1000B307E407F50720F0A21BB30BE40BF50BB6 :100F2000661F771F881F991F1A9469F7609570953F :100F3000809590959B01AC01BD01CF010895EE0F06 :0E0F4000FF1F0590F491E02D0994F894FFCF67 :100F4E000003400000044000000208000000000002 :060F5E000000000000008D :00000001FF ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Genuino-usbserial-atmega16u2-Uno-R3.hex ================================================ :1000000098C00000B1C00000AFC00000ADC000004B :10001000ABC00000A9C00000A7C00000A5C0000040 :10002000A3C00000A1C000009FC00000F6C30000F4 :100030009BC4000099C0000097C0000095C000005C :1000400093C0000091C000008FC000008DC0000070 :100050008BC0000089C0000087C00000C0C1000044 :1000600083C0000081C000007FC000007DC0000090 :100070007BC00000100532051C0632051C06740505 :1000800091051C06E405F6051803470065006E009F :10009000750069006E006F00200055006E006F0053 :1000A00000003A03410072006400750069006E00B0 :1000B0006F0020004C004C00430020002800770017 :1000C000770077002E0061007200640075006900FF :1000D0006E006F002E00630063002900000004031F :1000E000090409023E00020100C0320904000001B7 :1000F0000202010005240001100424020605240662 :100100000001070582030800FF09040100020A003C :1001100000000705040240000107058302400001BA :1001200012011001020000084123430201000102F4 :10013000DC0111241FBECFEFD2E0DEBFCDBF11E046 :10014000A0E0B1E0E2E4FFE002C005900D92A6312C :10015000B107D9F712E0A6E1B1E001C01D92AF32BC :10016000B107E1F764D0EBC64BCFFC01E058FF4F7D :10017000A081B1816C93A081B1819D012F5F3F4F20 :10018000318320832E173F0721F412969C938E9380 :1001900011972FB7F894FC01EC57FF4F80818F5FC8 :1001A00080832FBF0895DC01AE57BF4FED91FC91C6 :1001B000119741911196FC93EE939C0120583F4F6B :1001C000E217F30711F48D939C932FB7F894FC0179 :1001D000EC57FF4F9081915090832FBF842F08954B :1001E00084B7877F84BF88E10FB6F894809360005E :1001F000109260000FBE87E690E09093CD00809350 :10020000CC0086E08093CA001092C80088E18093F9 :10021000C900539A5A9A8AB180638AB98BB18063B4 :100220008BB9F0D284E085BD5F9A579A0895D8DFE4 :100230002FB7F8948EE991E090931F0280931E02ED :1002400090932102809320022FBF2FB7F89489E169 :1002500091E090939A018093990190939C018093EF :100260009B012FBF7894D3E09FB7F894809122022E :100270009FBF803849F080E091E00ED697FD04C022 :10028000682F8EE991E071DF8FB7F894C0919D01DE :100290008FBFA89902C0C13658F1A89A80919D01DC :1002A000882319F05D98D0931601CC2349F089E199 :1002B00091E079DF682F80E091E093D5C150F5CFD0 :1002C00080911601882341F080911601815080931E :1002D0001601811101C05D9A80911701882341F0B8 :1002E00080911701815080931701811101C05C9AA0 :1002F0009FB7F894809122029FBF882361F08EE916 :1003000091E051DF9091C80095FFFCCF8093CE0023 :100310005C98D093170180E091E0B0D59AD4A4CF37 :1003200080E091E011C580E091E0A5C41F93CF93D8 :10033000DF93EC018C89813031F0823011F010E0D4 :1003400003C010E201C010E38B89823009F4186009 :100350008D89873031F0883031F0863029F4126091 :1003600003C0146001C016601092C9001092C8004A :100370001092CA002F85388949895A89211581EE42 :1003800038074105510571F0CA01B9019695879565 :100390007795679560587B47814E9F4FA8D5215030 :1003A000310902C020E130E03093CD002093CC0031 :1003B0001093CA008F859889A989BA898115914EB1 :1003C000A105B10511F480E001C082E08093C8006E :1003D00088E98093C900DF91CF911F9108951F9202 :1003E0000F920FB60F9211242F933F934F935F9369 :1003F0006F937F938F939F93AF93BF93EF93FF93ED :100400006091CE008EB3843019F489E191E0ADDEC5 :10041000FF91EF91BF91AF919F918F917F916F91DC :100420005F914F913F912F910F900FBE0F901F90B2 :100430001895FC01858580FF02C05F9808955F9A3A :100440000895292F33272230310559F02330310503 :1004500069F021303105F9F482E190E020E231E0E9 :100460001EC08EE390E022EE30E019C09927813063 :10047000910541F08230910541F0892B61F4EEED58 :10048000F0E005C0E2EAF0E002C0E8E8F0E08491C4 :1004900090E09F0104C080E090E020E030E0FA01AD :1004A00031832083089528E030E040E028173907A1 :1004B00020F44F5F220F331FF9CF842F8295807F66 :1004C00008958093E900EBEEF0E080818160808305 :1004D000EDEEF0E010826093EC0040838091EE003E :1004E000881F8827881F08951092F40080E0809369 :1004F000E9001092F0001092E8001092ED00909147 :10050000EB009E7F9093EB008F5F853081F708951D :100510008091270287FD05C08091E80080FF0DC013 :1005200010C08091E80082FD04C08EB38111F9CF24 :1005300008958091E8008B7707C08EB38111ECCFCE :1005400008958091E8008E778093E800089585E60D :100550009091EC0090FF05C09091E80090FF05C0DD :100560001BC09091E80092FD17C09EB39923B1F093 :100570009EB39530A9F09091EB0095FD13C090913A :10058000E10092FFE5CF9091E1009B7F9093E10025 :100590008150F1F684E0089580E0089582E00895A6 :1005A00083E0089581E0089520912D0230912E027C :1005B0002617370748F06115710539F42091E800D6 :1005C0002E772093E80001C0B90130E06115710574 :1005D00091F12091E80023FD38C02091E80022FF2E :1005E00006C08091E80082FF29C080E008952EB304 :1005F000222369F12EB3253061F12091E80020FF1C :10060000E5CF2091F200FC01CF016115710549F0A1 :10061000283038F481918093F100615071092F5F87 :10062000F3CF31E0283009F030E02091E8002E7758 :100630002093E800CBCF3111CCCFD3CF8EB388231A :1006400031F08EB3853069F604C081E0089582E010 :10065000089583E0089520912D0230912E022617EF :10066000370748F06115710539F42091E8002E77BD :100670002093E80001C0B90130E06115710599F1DE :100680002091E80023FD39C02091E80022FF06C038 :100690008091E80082FF2AC080E008952EB32223D3 :1006A00071F12EB3253069F12091E80020FFE5CFEC :1006B0002091F200FC01CF016115710551F0283045 :1006C00040F484918093F100615071092F5F31965D :1006D000F2CF31E0283009F030E02091E8002E77A9 :1006E0002093E800CACF3111CBCFD2CF8EB388236D :1006F00031F08EB3853061F604C081E0089582E068 :10070000089583E008956115710529F42091E800AA :100710002B772093E8006115710549F12091E800DD :1007200023FD2AC02EB3222359F12EB3253051F1D7 :100730002091E80022FFF2CFFC018091F200882393 :1007400071F09F012F5F3F4FC9014091F10040833D :100750006150710961157105C9F2F901EECFCF0140 :10076000D5CF8EB3882361F08EB3853059F0809158 :10077000E80080FFF6CF02C081E0089580E0089590 :1007800082E0089583E0089542D044D01EBA1092CA :100790002502109224021092230284E089BD89B5BB :1007A000826089BD09B400FEFDCF8091D800982FEA :1007B0009F779093D80080688093D80080916300E1 :1007C0008E7F809363008091D8008F7D8093D800C6 :1007D0008091E0008E7F8093E0008091E1008E7F29 :1007E0008093E1008091E20081608093E20080913B :1007F000E100877F8093E1008091E2008860809330 :10080000E2000895C1DF81E08093260208951092EE :10081000E20008951092E10008951F920F920FB622 :100820000F9211242F933F934F935F936F937F9376 :100830008F939F93AF93BF93EF93FF938091E100CA :1008400080FF1BC08091E20080FF17C08091E10013 :100850008E7F8093E1008091E2008E7F8093E200A2 :100860008091E20080618093E2008091D8008062F4 :100870008093D80019BC1EBAEBD18091E10084FFAF :1008800029C08091E20084FF25C084E089BD89B53C :10089000826089BD09B400FEFDCF8091D8008F7DB4 :1008A0008093D8008091E1008F7E8093E100809159 :1008B000E2008F7E8093E2008091E200816080936D :1008C000E20080912502882311F084E001C081E0DC :1008D0008EBBBED18091E10083FF27C08091E200F2 :1008E00083FF23C08091E100877F8093E10082E055 :1008F0008EBB109225028091E1008E7F8093E100F3 :100900008091E2008E7F8093E2008091E20080611E :100910008093E200E9DD42E060E080E0D2DD80919A :10092000F00088608093F00093D18091E10082FF15 :100930000AC08091E20082FF06C08091E1008B7FB7 :100940008093E10085D1FF91EF91BF91AF919F918D :100950008F917F916F915F914F913F912F910F9068 :100960000FBE0F901F9018951F920F920FB60F9207 :1009700011242F933F934F935F936F937F938F93A4 :100980009F93AF93BF93CF93EF93FF93E9EEF0E084 :10099000C081C7701082E0EFF0E08081877F8083A4 :1009A00078941CD0F894E9EEF0E01082A0EFB0E06B :1009B0008C9188608C93C083FF91EF91CF91BF9110 :1009C000AF919F918F917F916F915F914F913F91E7 :1009D0002F910F900FBE0F901F9018951F93CF93DC :1009E000DF93CDB7DEB7AA970FB6F894DEBF0FBE80 :1009F000CDBFE7E2F2E08091F100819322E0EF3297 :100A0000F207C9F72091270230912802832F90E046 :100A10008A30910508F010C1FC01E65CFF4F89C2E5 :100A2000203881F0223809F007C180912B028770AD :100A30008093E9008091EB0085FB882780F9109274 :100A4000E90006C0809123029091240291118260F6 :100A50009091E800977F9093E8008093F1001092C6 :100A6000F100BDC0822F8D7F09F0E6C0222319F06E :100A7000223061F0D2C080912902813009F0CDC0CE :100A8000333009F080E08093240228C0809129024D :100A9000811124C020912B02277009F4BEC020933D :100AA000E9008091EB0080FFB8C08091EB0033300B :100AB00011F4806211C080618093EB0081E090E0CE :100AC000022E01C0880F0A94EAF78093EA00109280 :100AD000EA008091EB0088608093EB001092E900BF :100AE0008091E800877F7EC02111A6C01091290265 :100AF0008091E800877F8093E8000ADD8091E8001C :100B000080FD04C08EB38111F9CF87C0812F8F770C :100B100011F093E001C092E09EBB80688093E300F7 :100B20007CC02058223008F087C080912902909123 :100B30002A028C3D23E0920781F583E08A838AE2D2 :100B400089834FB7F894DE01139620E03EE051E22E :100B5000E32FF0E050935700E49120FF03C0E295AB :100B6000EF703F5FEF7090E39E0F9A3310F0E95CF7 :100B700001C0E92F8E2F90E08D939D932F5F24313C :100B800039F74FBF8091E800877F8093E8006AE2E1 :100B900070E0CE01019608DD11C0AE014F5F5F4FDE :100BA00060912B024EDC0097C1F12091E800277F75 :100BB0002093E800BC0189819A814DDD8091E80095 :100BC0008B778093E80029C02038B1F58091E80048 :100BD000877F8093E800809125028093F1008091C7 :100BE000E8008E778093E80093DC17C0211124C0C1 :100BF00090912902923088F48091E800877F809359 :100C0000E8009093250284DC80912502882311F06E :100C100084E001C083E08EBB83DB8091E80083FF2A :100C20000DC08091EB0080628093EB008091E80022 :100C3000877F8093E80002C076DBEFCFAA960FB6DD :100C4000F894DEBF0FBECDBFDF91CF911F91089505 :100C50000895CF938EB3882359F0C091E900C770EF :100C60001092E9008091E80083FDB8DEC093E900AE :100C7000CF9108950895CF93DF93EC018091E80020 :100C800083FF5FC0888190E020912B0230912C027D :100C90002817390709F055C080912802813249F0A0 :100CA00018F48032C9F04DC0823261F18332C9F14B :100CB00048C080912702813A09F043C08091E80042 :100CC000877F8093E80067E070E0CE010F966CDCD0 :100CD0008091E8008B7713C080912702813289F5DB :100CE0008091E800877F8093E80067E070E0CE01A4 :100CF0000F9609DDCE011ADB8091E8008E77809394 :100D0000E8001FC0809127028132D9F48091E80069 :100D1000877F8093E800809129028D87CE0189DB4F :100D20000DC080912702813261F48091E800877FB5 :100D30008093E80060912902CE019CDFDF91CF9182 :100D4000E7CBDF91CF9108950F931F93CF93DF935C :100D5000EC01FC013D9689E0DF011D928A95E9F7DF :100D60002A813B818C81882311F014E001C010E0BE :100D70000981C90198DB412F482B426061E8802F2F :100D8000A0DB882341F12E813F818885882311F0E3 :100D900014E001C010E00D81C90185DB412F482B13 :100DA000426060E8802F8DDB8823A9F02A853B858F :100DB0008C85882311F014E001C010E0C985C901B9 :100DC00072DB412F482B426061EC8C2FDF91CF9179 :100DD0001F910F9176CB80E0DF91CF911F910F9102 :100DE0000895CF93C62F2EB32430E9F4FC01478534 :100DF000508961897289452B462B472BA1F081814F :100E00008093E9008091E80085FF04C0C093F10061 :100E100080E00AC08091E8008E778093E80097DB3D :100E20008823A1F301C082E0CF9108952EB324302E :100E300019F5FC014785508961897289452B462B3C :100E4000472BD1F081818093E9008091F2008823C3 :100E500089F09091E8008091E8008E778093E80017 :100E600095FD08C074DB811108C08091E8008E7781 :100E70008093E80080E0089582E008952EB3243046 :100E800051F4FC014785508961897289452B462BB5 :100E9000472B09F0CBCF08952EB3243019F08FEFF4 :100EA0009FEF0895FC014785508961897289452B20 :100EB000462B472BA1F385818093E9008091E800C0 :100EC00082FFEDCF8091F200882321F02091F10084 :100ED00030E002C02FEF3FEF8091F200811105C09A :100EE0008091E8008B778093E800C9010895A1E222 :100EF0001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F94 :100F0000FF1FA217B307E407F50720F0A21BB30BDE :100F1000E40BF50B661F771F881F991F1A9469F75A :100F200060957095809590959B01AC01BD01CF01B6 :100F30000895EE0FFF1F0590F491E02D0994F894A9 :020F4000FFCFE1 :100F4200000340000004400000020800000000000E :060F520000000000000099 :00000001FF ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/Lib/LightweightRingBuff.h ================================================ /* LUFA Library Copyright (C) Dean Camera, 2010. dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /** \file * * Ultra lightweight ring buffer, for fast insertion/deletion. */ #ifndef _ULW_RING_BUFF_H_ #define _ULW_RING_BUFF_H_ /* Includes: */ #include #include #include /* Defines: */ /** Size of each ring buffer, in data elements - must be between 1 and 255. */ #define BUFFER_SIZE 128 /** Maximum number of data elements to buffer before forcing a flush. * Must be less than BUFFER_SIZE */ #define BUFFER_NEARLY_FULL 96 /** Type of data to store into the buffer. */ #define RingBuff_Data_t uint8_t /** Datatype which may be used to store the count of data stored in a buffer, retrieved * via a call to \ref RingBuffer_GetCount(). */ #if (BUFFER_SIZE <= 0xFF) #define RingBuff_Count_t uint8_t #else #define RingBuff_Count_t uint16_t #endif /* Type Defines: */ /** Type define for a new ring buffer object. Buffers should be initialized via a call to * \ref RingBuffer_InitBuffer() before use. */ typedef struct { RingBuff_Data_t Buffer[BUFFER_SIZE]; /**< Internal ring buffer data, referenced by the buffer pointers. */ RingBuff_Data_t* In; /**< Current storage location in the circular buffer */ RingBuff_Data_t* Out; /**< Current retrieval location in the circular buffer */ RingBuff_Count_t Count; } RingBuff_t; /* Inline Functions: */ /** Initializes a ring buffer ready for use. Buffers must be initialized via this function * before any operations are called upon them. Already initialized buffers may be reset * by re-initializing them using this function. * * \param[out] Buffer Pointer to a ring buffer structure to initialize */ static inline void RingBuffer_InitBuffer(RingBuff_t* const Buffer) { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { Buffer->In = Buffer->Buffer; Buffer->Out = Buffer->Buffer; } } /** Retrieves the minimum number of bytes stored in a particular buffer. This value is computed * by entering an atomic lock on the buffer while the IN and OUT locations are fetched, so that * the buffer cannot be modified while the computation takes place. This value should be cached * when reading out the contents of the buffer, so that as small a time as possible is spent * in an atomic lock. * * \note The value returned by this function is guaranteed to only be the minimum number of bytes * stored in the given buffer; this value may change as other threads write new data and so * the returned number should be used only to determine how many successive reads may safely * be performed on the buffer. * * \param[in] Buffer Pointer to a ring buffer structure whose count is to be computed */ static inline RingBuff_Count_t RingBuffer_GetCount(RingBuff_t* const Buffer) { RingBuff_Count_t Count; ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { Count = Buffer->Count; } return Count; } /** Atomically determines if the specified ring buffer contains any free space. This should * be tested before storing data to the buffer, to ensure that no data is lost due to a * buffer overrun. * * \param[in,out] Buffer Pointer to a ring buffer structure to insert into * * \return Boolean true if the buffer contains no free space, false otherwise */ static inline bool RingBuffer_IsFull(RingBuff_t* const Buffer) { return (RingBuffer_GetCount(Buffer) == BUFFER_SIZE); } /** Atomically determines if the specified ring buffer contains any data. This should * be tested before removing data from the buffer, to ensure that the buffer does not * underflow. * * If the data is to be removed in a loop, store the total number of bytes stored in the * buffer (via a call to the \ref RingBuffer_GetCount() function) in a temporary variable * to reduce the time spent in atomicity locks. * * \param[in,out] Buffer Pointer to a ring buffer structure to insert into * * \return Boolean true if the buffer contains no free space, false otherwise */ static inline bool RingBuffer_IsEmpty(RingBuff_t* const Buffer) { return (RingBuffer_GetCount(Buffer) == 0); } /** Inserts an element into the ring buffer. * * \note Only one execution thread (main program thread or an ISR) may insert into a single buffer * otherwise data corruption may occur. Insertion and removal may occur from different execution * threads. * * \param[in,out] Buffer Pointer to a ring buffer structure to insert into * \param[in] Data Data element to insert into the buffer */ static inline void RingBuffer_Insert(RingBuff_t* const Buffer, const RingBuff_Data_t Data) { *Buffer->In = Data; if (++Buffer->In == &Buffer->Buffer[BUFFER_SIZE]) Buffer->In = Buffer->Buffer; ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { Buffer->Count++; } } /** Removes an element from the ring buffer. * * \note Only one execution thread (main program thread or an ISR) may remove from a single buffer * otherwise data corruption may occur. Insertion and removal may occur from different execution * threads. * * \param[in,out] Buffer Pointer to a ring buffer structure to retrieve from * * \return Next data element stored in the buffer */ static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer) { RingBuff_Data_t Data = *Buffer->Out; if (++Buffer->Out == &Buffer->Buffer[BUFFER_SIZE]) Buffer->Out = Buffer->Buffer; ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { Buffer->Count--; } return Data; } #endif ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/makefile ================================================ # Hey Emacs, this is a -*- makefile -*- #---------------------------------------------------------------------------- # WinAVR Makefile Template written by Eric B. Weddington, Jrg Wunsch, et al. # >> Modified for use with the LUFA project. << # # Released to the Public Domain # # Additional material for this makefile was written by: # Peter Fleury # Tim Henigan # Colin O'Flynn # Reiner Patommel # Markus Pfaff # Sander Pool # Frederik Rouleau # Carlos Lamas # Dean Camera # Opendous Inc. # Denver Gingerich # #---------------------------------------------------------------------------- # On command line: # # make all = Make software. # # make clean = Clean out built project files. # # make coff = Convert ELF to AVR COFF. # # make extcoff = Convert ELF to AVR Extended COFF. # # make program = Download the hex file to the device, using avrdude. # Please customize the avrdude settings below first! # # make dfu = Download the hex file to the device, using dfu-programmer (must # have dfu-programmer installed). # # make flip = Download the hex file to the device, using Atmel FLIP (must # have Atmel FLIP installed). # # make dfu-ee = Download the eeprom file to the device, using dfu-programmer # (must have dfu-programmer installed). # # make flip-ee = Download the eeprom file to the device, using Atmel FLIP # (must have Atmel FLIP installed). # # make doxygen = Generate DoxyGen documentation for the project (must have # DoxyGen installed) # # make debug = Start either simulavr or avarice as specified for debugging, # with avr-gdb or avr-insight as the front end for debugging. # # make filename.s = Just compile filename.c into the assembler code only. # # make filename.i = Create a preprocessed source file for use in submitting # bug reports to the GCC project. # # To rebuild project do "make clean" then "make all". #---------------------------------------------------------------------------- # MCU name(s) # Since the ATMEGA8U2 part is not directly supported by the current # versions of either avrdude or dfu-programmer, we specify a dummy # part; AT90USB82 which is close enough in memory size and organization MCU = atmega8u2 MCU_AVRDUDE = at90usb82 MCU_DFU = at90usb82 # Specify the Arduino model using the assigned PID. This is used by Descriptors.c # to set PID and product descriptor string # Uno PID: ARDUINO_MODEL_PID = 0x0001 # Mega 2560 PID: #ARDUINO_MODEL_PID = 0x0010 # Target board (see library "Board Types" documentation, NONE for projects not requiring # LUFA board drivers). If USER is selected, put custom board drivers in a directory called # "Board" inside the application directory. BOARD = USER # Processor frequency. # This will define a symbol, F_CPU, in all source code files equal to the # processor frequency in Hz. You can then use this symbol in your source code to # calculate timings. Do NOT tack on a 'UL' at the end, this will be done # automatically to create a 32-bit value in your source code. # # This will be an integer division of F_CLOCK below, as it is sourced by # F_CLOCK after it has run through any CPU prescalers. Note that this value # does not *change* the processor frequency - it should merely be updated to # reflect the processor speed set externally so that the code can use accurate # software delays. F_CPU = 16000000 # Input clock frequency. # This will define a symbol, F_CLOCK, in all source code files equal to the # input clock frequency (before any prescaling is performed) in Hz. This value may # differ from F_CPU if prescaling is used on the latter, and is required as the # raw input clock is fed directly to the PLL sections of the AVR for high speed # clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' # at the end, this will be done automatically to create a 32-bit value in your # source code. # # If no clock division is performed on the input clock inside the AVR (via the # CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. F_CLOCK = $(F_CPU) # Output format. (can be srec, ihex, binary) FORMAT = ihex # Target file name (without extension). TARGET = Arduino-usbserial # Object files directory # To put object files in current directory, use a dot (.), do NOT make # this an empty or blank macro! OBJDIR = . # Path to the LUFA library LUFA_PATH = ../.. # LUFA library compile-time options LUFA_OPTS = -D USB_DEVICE_ONLY LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8 LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 LUFA_OPTS += -D USE_FLASH_DESCRIPTORS LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0 LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" # Create the LUFA source path variables by including the LUFA root makefile include $(LUFA_PATH)/LUFA/makefile # List C source files here. (C dependencies are automatically generated.) SRC = $(TARGET).c \ Descriptors.c \ $(LUFA_SRC_USB) \ $(LUFA_SRC_USBCLASS) \ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Device.c \ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Endpoint.c \ $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/HostStandardReq.c \ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Host.c \ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Pipe.c \ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/USBController.c \ $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/Events.c \ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/USBInterrupt.c \ $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/USBTask.c \ $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/DeviceStandardReq.c \ $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/ConfigDescriptor.c \ $(LUFA_PATH)/LUFA/Drivers/USB/Class/Device/CDC.c \ $(LUFA_PATH)/LUFA/Drivers/USB/Class/Host/CDC.c # List C++ source files here. (C dependencies are automatically generated.) CPPSRC = # List Assembler source files here. # Make them always end in a capital .S. Files ending in a lowercase .s # will not be considered source files but generated files (assembler # output from the compiler), and will be deleted upon "make clean"! # Even though the DOS/Win* filesystem matches both .s and .S the same, # it will preserve the spelling of the filenames, and gcc itself does # care about how the name is spelled on its command-line. ASRC = # Optimization level, can be [0, 1, 2, 3, s]. # 0 = turn off optimization. s = optimize for size. # (Note: 3 is not always the best optimization level. See avr-libc FAQ.) OPT = s # Debugging format. # Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. # AVR Studio 4.10 requires dwarf-2. # AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. DEBUG = dwarf-2 # List any extra directories to look for include files here. # Each directory must be seperated by a space. # Use forward slashes for directory separators. # For a directory that has spaces, enclose it in quotes. EXTRAINCDIRS = $(LUFA_PATH)/ # Compiler flag to set the C Standard level. # c89 = "ANSI" C # gnu89 = c89 plus GCC extensions # c99 = ISO C99 standard (not yet fully implemented) # gnu99 = c99 plus GCC extensions CSTANDARD = -std=gnu99 # Place -D or -U options here for C sources CDEFS = -DF_CPU=$(F_CPU)UL CDEFS += -DF_CLOCK=$(F_CLOCK)UL CDEFS += -DARDUINO_MODEL_PID=$(ARDUINO_MODEL_PID) CDEFS += -DBOARD=BOARD_$(BOARD) CDEFS += $(LUFA_OPTS) CDEFS += -DAVR_RESET_LINE_PORT="PORTD" CDEFS += -DAVR_RESET_LINE_DDR="DDRD" CDEFS += -DAVR_RESET_LINE_MASK="(1 << 7)" CDEFS += -DTX_RX_LED_PULSE_MS=3 CDEFS += -DPING_PONG_LED_PULSE_MS=100 # Place -D or -U options here for ASM sources ADEFS = -DF_CPU=$(F_CPU) ADEFS += -DF_CLOCK=$(F_CLOCK)UL ADEFS += -DBOARD=BOARD_$(BOARD) ADEFS += $(LUFA_OPTS) # Place -D or -U options here for C++ sources CPPDEFS = -DF_CPU=$(F_CPU)UL CPPDEFS += -DF_CLOCK=$(F_CLOCK)UL CPPDEFS += -DBOARD=BOARD_$(BOARD) CPPDEFS += $(LUFA_OPTS) #CPPDEFS += -D__STDC_LIMIT_MACROS #CPPDEFS += -D__STDC_CONSTANT_MACROS #---------------- Compiler Options C ---------------- # -g*: generate debugging information # -O*: optimization level # -f...: tuning, see GCC manual and avr-libc documentation # -Wall...: warning level # -Wa,...: tell GCC to pass this to the assembler. # -adhlns...: create assembler listing CFLAGS = -g$(DEBUG) CFLAGS += $(CDEFS) CFLAGS += -O$(OPT) CFLAGS += -funsigned-char CFLAGS += -funsigned-bitfields CFLAGS += -ffunction-sections CFLAGS += -fno-inline-small-functions CFLAGS += -fpack-struct CFLAGS += -fshort-enums CFLAGS += -fno-strict-aliasing CFLAGS += -Wall CFLAGS += -Wstrict-prototypes #CFLAGS += -mshort-calls #CFLAGS += -fno-unit-at-a-time #CFLAGS += -Wundef #CFLAGS += -Wunreachable-code #CFLAGS += -Wsign-compare CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) CFLAGS += $(CSTANDARD) #---------------- Compiler Options C++ ---------------- # -g*: generate debugging information # -O*: optimization level # -f...: tuning, see GCC manual and avr-libc documentation # -Wall...: warning level # -Wa,...: tell GCC to pass this to the assembler. # -adhlns...: create assembler listing CPPFLAGS = -g$(DEBUG) CPPFLAGS += $(CPPDEFS) CPPFLAGS += -O$(OPT) CPPFLAGS += -funsigned-char CPPFLAGS += -funsigned-bitfields CPPFLAGS += -fpack-struct CPPFLAGS += -fshort-enums CPPFLAGS += -fno-exceptions CPPFLAGS += -Wall CPPFLAGS += -Wundef CFLAGS += -Wundef #CPPFLAGS += -mshort-calls #CPPFLAGS += -fno-unit-at-a-time #CPPFLAGS += -Wstrict-prototypes #CPPFLAGS += -Wunreachable-code #CPPFLAGS += -Wsign-compare CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) #CPPFLAGS += $(CSTANDARD) #---------------- Assembler Options ---------------- # -Wa,...: tell GCC to pass this to the assembler. # -adhlns: create listing # -gstabs: have the assembler create line number information; note that # for use in COFF files, additional information about filenames # and function names needs to be present in the assembler source # files -- see avr-libc docs [FIXME: not yet described there] # -listing-cont-lines: Sets the maximum number of continuation lines of hex # dump that will be displayed for a given single line of source input. ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 #---------------- Library Options ---------------- # Minimalistic printf version PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min # Floating point printf version (requires MATH_LIB = -lm below) PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt # If this is left blank, then it will use the Standard printf version. PRINTF_LIB = #PRINTF_LIB = $(PRINTF_LIB_MIN) #PRINTF_LIB = $(PRINTF_LIB_FLOAT) # Minimalistic scanf version SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min # Floating point + %[ scanf version (requires MATH_LIB = -lm below) SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt # If this is left blank, then it will use the Standard scanf version. SCANF_LIB = #SCANF_LIB = $(SCANF_LIB_MIN) #SCANF_LIB = $(SCANF_LIB_FLOAT) MATH_LIB = -lm # List any extra directories to look for libraries here. # Each directory must be seperated by a space. # Use forward slashes for directory separators. # For a directory that has spaces, enclose it in quotes. EXTRALIBDIRS = #---------------- External Memory Options ---------------- # 64 KB of external RAM, starting after internal RAM (ATmega128!), # used for variables (.data/.bss) and heap (malloc()). #EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff # 64 KB of external RAM, starting after internal RAM (ATmega128!), # only used for heap (malloc()). #EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff EXTMEMOPTS = #---------------- Linker Options ---------------- # -Wl,...: tell GCC to pass this to linker. # -Map: create map file # --cref: add cross reference to map file LDFLAGS = -Wl,-Map=$(TARGET).map,--cref LDFLAGS += -Wl,--relax LDFLAGS += -Wl,--gc-sections LDFLAGS += $(EXTMEMOPTS) LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) #LDFLAGS += -T linker_script.x #---------------- Programming Options (avrdude) ---------------- # Programming hardware # Type: avrdude -c ? # to get a full listing. # AVRDUDE_PROGRAMMER = avrispmkii # com1 = serial port. Use lpt1 to connect to parallel port. AVRDUDE_PORT = usb AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex #AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep # Uncomment the following if you want avrdude's erase cycle counter. # Note that this counter needs to be initialized first using -Yn, # see avrdude manual. #AVRDUDE_ERASE_COUNTER = -y # Uncomment the following if you do /not/ wish a verification to be # performed after programming the device. #AVRDUDE_NO_VERIFY = -V # Increase verbosity level. Please use this when submitting bug # reports about avrdude. See # to submit bug reports. #AVRDUDE_VERBOSE = -v -v AVRDUDE_FORCE = -F AVRDUDE_FLAGS = -p $(MCU_AVRDUDE) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) AVRDUDE_FLAGS += $(AVRDUDE_FORCE) #---------------- Debugging Options ---------------- # For simulavr only - target MCU frequency. DEBUG_MFREQ = $(F_CPU) # Set the DEBUG_UI to either gdb or insight. # DEBUG_UI = gdb DEBUG_UI = insight # Set the debugging back-end to either avarice, simulavr. DEBUG_BACKEND = avarice #DEBUG_BACKEND = simulavr # GDB Init Filename. GDBINIT_FILE = __avr_gdbinit # When using avarice settings for the JTAG JTAG_DEV = /dev/com1 # Debugging port used to communicate between GDB / avarice / simulavr. DEBUG_PORT = 4242 # Debugging host used to communicate between GDB / avarice / simulavr, normally # just set to localhost unless doing some sort of crazy debugging when # avarice is running on a different computer. DEBUG_HOST = localhost #============================================================================ # Define programs and commands. SHELL = sh CC = avr-gcc OBJCOPY = avr-objcopy OBJDUMP = avr-objdump SIZE = avr-size AR = avr-ar rcs NM = avr-nm AVRDUDE = avrdude REMOVE = rm -f REMOVEDIR = rm -rf COPY = cp WINSHELL = cmd # Define Messages # English MSG_ERRORS_NONE = Errors: none MSG_BEGIN = -------- begin -------- MSG_END = -------- end -------- MSG_SIZE_BEFORE = Size before: MSG_SIZE_AFTER = Size after: MSG_COFF = Converting to AVR COFF: MSG_EXTENDED_COFF = Converting to AVR Extended COFF: MSG_FLASH = Creating load file for Flash: MSG_EEPROM = Creating load file for EEPROM: MSG_EXTENDED_LISTING = Creating Extended Listing: MSG_SYMBOL_TABLE = Creating Symbol Table: MSG_LINKING = Linking: MSG_COMPILING = Compiling C: MSG_COMPILING_CPP = Compiling C++: MSG_ASSEMBLING = Assembling: MSG_CLEANING = Cleaning project: MSG_CREATING_LIBRARY = Creating library: # Define all object files. OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) # Define all listing files. LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) # Compiler flags to generate dependency files. GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d # Combine all necessary flags and optional flags. # Add target processor to flags. ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) # Default target. #all: begin gccversion sizebefore build checkinvalidevents showliboptions showtarget sizeafter end all: begin gccversion sizebefore build showliboptions showtarget sizeafter end # Change the build target to build a HEX file or a library. build: elf hex eep lss sym asm #build: lib elf: $(TARGET).elf hex: $(TARGET).hex eep: $(TARGET).eep lss: $(TARGET).lss sym: $(TARGET).sym asm: $(TARGET).s LIBNAME=lib$(TARGET).a lib: $(LIBNAME) # Eye candy. # AVR Studio 3.x does not check make's exit code but relies on # the following magic strings to be generated by the compile job. begin: @echo @echo $(MSG_BEGIN) end: @echo $(MSG_END) @echo # Display size of file. HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) sizebefore: @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ 2>/dev/null; echo; fi sizeafter: @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ 2>/dev/null; echo; fi #$(LUFA_PATH)/LUFA/LUFA_Events.lst: # @make -C $(LUFA_PATH)/LUFA/ LUFA_Events.lst #checkinvalidevents: $(LUFA_PATH)/LUFA/LUFA_Events.lst # @echo # @echo Checking for invalid events... # @$(shell) avr-nm $(OBJ) | sed -n -e 's/^.*EVENT_/EVENT_/p' | \ # grep -F -v --file=$(LUFA_PATH)/LUFA/LUFA_Events.lst > InvalidEvents.tmp || true # @sed -n -e 's/^/ WARNING - INVALID EVENT NAME: /p' InvalidEvents.tmp # @if test -s InvalidEvents.tmp; then exit 1; fi showliboptions: @echo @echo ---- Compile Time Library Options ---- @for i in $(LUFA_OPTS:-D%=%); do \ echo $$i; \ done @echo -------------------------------------- showtarget: @echo @echo --------- Target Information --------- @echo AVR Model: $(MCU) @echo Board: $(BOARD) @echo Clock: $(F_CPU)Hz CPU, $(F_CLOCK)Hz Master @echo -------------------------------------- # Display compiler version information. gccversion : @$(CC) --version # Program the device. program: $(TARGET).hex $(TARGET).eep $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) flip: $(TARGET).hex batchisp -hardware usb -device $(MCU_DFU) -operation erase f batchisp -hardware usb -device $(MCU_DFU) -operation loadbuffer $(TARGET).hex program batchisp -hardware usb -device $(MCU_DFU) -operation start reset 0 dfu: $(TARGET).hex dfu-programmer $(MCU_DFU) erase dfu-programmer $(MCU_DFU) flash --debug 1 $(TARGET).hex dfu-programmer $(MCU_DFU) reset flip-ee: $(TARGET).hex $(TARGET).eep $(COPY) $(TARGET).eep $(TARGET)eep.hex batchisp -hardware usb -device $(MCU_DFU) -operation memory EEPROM erase batchisp -hardware usb -device $(MCU_DFU) -operation memory EEPROM loadbuffer $(TARGET)eep.hex program batchisp -hardware usb -device $(MCU_DFU) -operation start reset 0 $(REMOVE) $(TARGET)eep.hex dfu-ee: $(TARGET).hex $(TARGET).eep dfu-programmer $(MCU_DFU) flash-eeprom --debug 1 --suppress-bootloader-mem $(TARGET).eep dfu-programmer $(MCU_DFU) reset # Generate avr-gdb config/init file which does the following: # define the reset signal, load the target file, connect to target, and set # a breakpoint at main(). gdb-config: @$(REMOVE) $(GDBINIT_FILE) @echo define reset >> $(GDBINIT_FILE) @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) @echo end >> $(GDBINIT_FILE) @echo file $(TARGET).elf >> $(GDBINIT_FILE) @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) ifeq ($(DEBUG_BACKEND),simulavr) @echo load >> $(GDBINIT_FILE) endif @echo break main >> $(GDBINIT_FILE) debug: gdb-config $(TARGET).elf ifeq ($(DEBUG_BACKEND), avarice) @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) @$(WINSHELL) /c pause else @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ $(DEBUG_MFREQ) --port $(DEBUG_PORT) endif @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) # Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. COFFCONVERT = $(OBJCOPY) --debugging COFFCONVERT += --change-section-address .data-0x800000 COFFCONVERT += --change-section-address .bss-0x800000 COFFCONVERT += --change-section-address .noinit-0x800000 COFFCONVERT += --change-section-address .eeprom-0x810000 coff: $(TARGET).elf @echo @echo $(MSG_COFF) $(TARGET).cof $(COFFCONVERT) -O coff-avr $< $(TARGET).cof extcoff: $(TARGET).elf @echo @echo $(MSG_EXTENDED_COFF) $(TARGET).cof $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof # Create final output files (.hex, .eep) from ELF output file. %.hex: %.elf @echo @echo $(MSG_FLASH) $@ $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@ %.eep: %.elf @echo @echo $(MSG_EEPROM) $@ -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 # Create extended listing file from ELF output file. %.lss: %.elf @echo @echo $(MSG_EXTENDED_LISTING) $@ $(OBJDUMP) -h -S -z $< > $@ # Create a symbol table from ELF output file. %.sym: %.elf @echo @echo $(MSG_SYMBOL_TABLE) $@ $(NM) -n $< > $@ # Create library from object files. .SECONDARY : $(TARGET).a .PRECIOUS : $(OBJ) %.a: $(OBJ) @echo @echo $(MSG_CREATING_LIBRARY) $@ $(AR) $@ $(OBJ) # Link: create ELF output file from object files. .SECONDARY : $(TARGET).elf .PRECIOUS : $(OBJ) %.elf: $(OBJ) @echo @echo $(MSG_LINKING) $@ $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) # Compile: create object files from C source files. $(OBJDIR)/%.o : %.c @echo @echo $(MSG_COMPILING) $< $(CC) -c $(ALL_CFLAGS) $< -o $@ # Compile: create object files from C++ source files. $(OBJDIR)/%.o : %.cpp @echo @echo $(MSG_COMPILING_CPP) $< $(CC) -c $(ALL_CPPFLAGS) $< -o $@ # Compile: create assembler files from C source files. %.s : %.c $(CC) -S $(ALL_CFLAGS) $< -o $@ # Compile: create assembler files from C++ source files. %.s : %.cpp $(CC) -S $(ALL_CPPFLAGS) $< -o $@ # Assemble: create object files from assembler source files. $(OBJDIR)/%.o : %.S @echo @echo $(MSG_ASSEMBLING) $< $(CC) -c $(ALL_ASFLAGS) $< -o $@ # Create preprocessed source for use in sending a bug report. %.i : %.c $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ # Target: clean project. clean: begin clean_list clean_binary end clean_binary: $(REMOVE) $(TARGET).hex clean_list: @echo $(MSG_CLEANING) $(REMOVE) $(TARGET).hex $(REMOVE) $(TARGET).eep $(REMOVE) $(TARGET).cof $(REMOVE) $(TARGET).elf $(REMOVE) $(TARGET).map $(REMOVE) $(TARGET).sym $(REMOVE) $(TARGET).lss $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) $(REMOVE) $(SRC:.c=.s) $(REMOVE) $(SRC:.c=.d) $(REMOVE) $(SRC:.c=.i) $(REMOVEDIR) .dep doxygen: @echo Generating Project Documentation... @doxygen Doxygen.conf @echo Documentation Generation Complete. clean_doxygen: rm -rf Documentation # Create object files directory $(shell mkdir $(OBJDIR) 2>/dev/null) # Include the dependency files. -include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) # Listing of phony targets. .PHONY : all begin finish end sizebefore sizeafter gccversion \ build elf hex eep lss sym coff extcoff doxygen clean \ clean_list clean_doxygen program dfu flip flip-ee dfu-ee \ debug gdb-config ================================================ FILE: external/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/readme.txt ================================================ To setup the project and upload the Arduino usbserial application firmware to an ATMEGA8U2 using the Arduino USB DFU bootloader: 1. unpack the source into LUFA's Projects directory 2. set ARDUINO_MODEL_PID in the makefile as appropriate 3. do "make clean; make" 4. put the 8U2 into USB DFU mode: 4.a. assert and hold the 8U2's RESET line 4.b. assert and hold the 8U2's HWB line 4.c. release the 8U2's RESET line 4.d. release the 8U2's HWB line 5. confirm that the board enumerates as either "Arduino Uno DFU" or "Arduino Mega 2560 DFU" 6. do "make dfu" (OS X or Linux - dfu-programmer must be installed first) or "make flip" (Windows - Flip must be installed first) Check that the board enumerates as either "Arduino Uno" or "Arduino Mega 2560". Test by uploading a new Arduino sketch from the Arduino IDE. ================================================ FILE: external/arduino/avr/firmwares/wifishield/binary/wifiHD.hex ================================================ :0200000480007A :10000000E08F100000000000000000000000000071 :1000100000000000000000000000000000000000E0 :1000200000000000000000000000000000000000D0 :1000300000000000000000000000000000000000C0 :1000400000000000000000000000000000000000B0 :1000500000000000000000000000000000000000A0 :100060000000000000000000000000000000000090 :100070000000000000000000000000000000000080 :100080000000000000000000000000000000000070 :100090000000000000000000000000000000000060 :1000A0000000000000000000000000000000000050 :1000B0000000000000000000000000000000000040 :1000C0000000000000000000000000000000000030 :1000D0000000000000000000000000000000000020 :1000E0000000000000000000000000000000000010 :1000F0000000000000000000000000000000000000 :1001000000000000000000000000000000000000EF :1001100000000000000000000000000000000000DF :1001200000000000000000000000000000000000CF :1001300000000000000000000000000000000000BF :1001400000000000000000000000000000000000AF :10015000000000000000000000000000000000009F :10016000000000000000000000000000000000008F :10017000000000000000000000000000000000007F :10018000000000000000000000000000000000006F :10019000000000000000000000000000000000005F :1001A000000000000000000000000000000000004F :1001B000000000000000000000000000000000003F :1001C000000000000000000000000000000000002F :1001D000000000000000000000000000000000001F :1001E000000000000000000000000000000000000F :1001F00000000000000000000000000000000000FF :1002000000000000000000000000000000000000EE :1002100000000000000000000000000000000000DE :1002200000000000000000000000000000000000CE :1002300000000000000000000000000000000000BE :1002400000000000000000000000000000000000AE :10025000000000000000000000000000000000009E :10026000000000000000000000000000000000008E :10027000000000000000000000000000000000007E :10028000000000000000000000000000000000006E :10029000000000000000000000000000000000005E :1002A000000000000000000000000000000000004E :1002B000000000000000000000000000000000003E :1002C000000000000000000000000000000000002E :1002D000000000000000000000000000000000001E :1002E000000000000000000000000000000000000E :1002F00000000000000000000000000000000000FE :1003000000000000000000000000000000000000ED :1003100000000000000000000000000000000000DD :1003200000000000000000000000000000000000CD :1003300000000000000000000000000000000000BD :1003400000000000000000000000000000000000AD :10035000000000000000000000000000000000009D :10036000000000000000000000000000000000008D :10037000000000000000000000000000000000007D :10038000000000000000000000000000000000006D :10039000000000000000000000000000000000005D :1003A000000000000000000000000000000000004D :1003B000000000000000000000000000000000003D :1003C000000000000000000000000000000000002D :1003D000000000000000000000000000000000001D :1003E000000000000000000000000000000000000D :1003F00000000000000000000000000000000000FD :1004000000000000000000000000000000000000EC :1004100000000000000000000000000000000000DC :1004200000000000000000000000000000000000CC :1004300000000000000000000000000000000000BC :1004400000000000000000000000000000000000AC :10045000000000000000000000000000000000009C :10046000000000000000000000000000000000008C :10047000000000000000000000000000000000007C :10048000000000000000000000000000000000006C :10049000000000000000000000000000000000005C :1004A000000000000000000000000000000000004C :1004B000000000000000000000000000000000003C :1004C000000000000000000000000000000000002C :1004D000000000000000000000000000000000001C :1004E000000000000000000000000000000000000C :1004F00000000000000000000000000000000000FC :1005000000000000000000000000000000000000EB :1005100000000000000000000000000000000000DB :1005200000000000000000000000000000000000CB :1005300000000000000000000000000000000000BB :1005400000000000000000000000000000000000AB :10055000000000000000000000000000000000009B :10056000000000000000000000000000000000008B :10057000000000000000000000000000000000007B :10058000000000000000000000000000000000006B :10059000000000000000000000000000000000005B :1005A000000000000000000000000000000000004B :1005B000000000000000000000000000000000003B :1005C000000000000000000000000000000000002B :1005D000000000000000000000000000000000001B :1005E000000000000000000000000000000000000B :1005F00000000000000000000000000000000000FB :1006000000000000000000000000000000000000EA :1006100000000000000000000000000000000000DA :1006200000000000000000000000000000000000CA :1006300000000000000000000000000000000000BA :1006400000000000000000000000000000000000AA :10065000000000000000000000000000000000009A :10066000000000000000000000000000000000008A :10067000000000000000000000000000000000007A :10068000000000000000000000000000000000006A :10069000000000000000000000000000000000005A :1006A000000000000000000000000000000000004A :1006B000000000000000000000000000000000003A :1006C000000000000000000000000000000000002A :1006D000000000000000000000000000000000001A :1006E000000000000000000000000000000000000A :1006F00000000000000000000000000000000000FA :1007000000000000000000000000000000000000E9 :1007100000000000000000000000000000000000D9 :1007200000000000000000000000000000000000C9 :1007300000000000000000000000000000000000B9 :1007400000000000000000000000000000000000A9 :100750000000000000000000000000000000000099 :100760000000000000000000000000000000000089 :100770000000000000000000000000000000000079 :100780000000000000000000000000000000000069 :100790000000000000000000000000000000000059 :1007A0000000000000000000000000000000000049 :1007B0000000000000000000000000000000000039 :1007C0000000000000000000000000000000000029 :1007D0000000000000000000000000000000000019 :1007E0000000000000000000000000000000000009 :1007F00000000000000000000000000000000000F9 :1008000000000000000000000000000000000000E8 :1008100000000000000000000000000000000000D8 :1008200000000000000000000000000000000000C8 :1008300000000000000000000000000000000000B8 :1008400000000000000000000000000000000000A8 :100850000000000000000000000000000000000098 :100860000000000000000000000000000000000088 :100870000000000000000000000000000000000078 :100880000000000000000000000000000000000068 :100890000000000000000000000000000000000058 :1008A0000000000000000000000000000000000048 :1008B0000000000000000000000000000000000038 :1008C0000000000000000000000000000000000028 :1008D0000000000000000000000000000000000018 :1008E0000000000000000000000000000000000008 :1008F00000000000000000000000000000000000F8 :1009000000000000000000000000000000000000E7 :1009100000000000000000000000000000000000D7 :1009200000000000000000000000000000000000C7 :1009300000000000000000000000000000000000B7 :1009400000000000000000000000000000000000A7 :100950000000000000000000000000000000000097 :100960000000000000000000000000000000000087 :100970000000000000000000000000000000000077 :100980000000000000000000000000000000000067 :100990000000000000000000000000000000000057 :1009A0000000000000000000000000000000000047 :1009B0000000000000000000000000000000000037 :1009C0000000000000000000000000000000000027 :1009D0000000000000000000000000000000000017 :1009E0000000000000000000000000000000000007 :1009F00000000000000000000000000000000000F7 :100A000000000000000000000000000000000000E6 :100A100000000000000000000000000000000000D6 :100A200000000000000000000000000000000000C6 :100A300000000000000000000000000000000000B6 :100A400000000000000000000000000000000000A6 :100A50000000000000000000000000000000000096 :100A60000000000000000000000000000000000086 :100A70000000000000000000000000000000000076 :100A80000000000000000000000000000000000066 :100A90000000000000000000000000000000000056 :100AA0000000000000000000000000000000000046 :100AB0000000000000000000000000000000000036 :100AC0000000000000000000000000000000000026 :100AD0000000000000000000000000000000000016 :100AE0000000000000000000000000000000000006 :100AF00000000000000000000000000000000000F6 :100B000000000000000000000000000000000000E5 :100B100000000000000000000000000000000000D5 :100B200000000000000000000000000000000000C5 :100B300000000000000000000000000000000000B5 :100B400000000000000000000000000000000000A5 :100B50000000000000000000000000000000000095 :100B60000000000000000000000000000000000085 :100B70000000000000000000000000000000000075 :100B80000000000000000000000000000000000065 :100B90000000000000000000000000000000000055 :100BA0000000000000000000000000000000000045 :100BB0000000000000000000000000000000000035 :100BC0000000000000000000000000000000000025 :100BD0000000000000000000000000000000000015 :100BE0000000000000000000000000000000000005 :100BF00000000000000000000000000000000000F5 :100C000000000000000000000000000000000000E4 :100C100000000000000000000000000000000000D4 :100C200000000000000000000000000000000000C4 :100C300000000000000000000000000000000000B4 :100C400000000000000000000000000000000000A4 :100C50000000000000000000000000000000000094 :100C60000000000000000000000000000000000084 :100C70000000000000000000000000000000000074 :100C80000000000000000000000000000000000064 :100C90000000000000000000000000000000000054 :100CA0000000000000000000000000000000000044 :100CB0000000000000000000000000000000000034 :100CC0000000000000000000000000000000000024 :100CD0000000000000000000000000000000000014 :100CE0000000000000000000000000000000000004 :100CF00000000000000000000000000000000000F4 :100D000000000000000000000000000000000000E3 :100D100000000000000000000000000000000000D3 :100D200000000000000000000000000000000000C3 :100D300000000000000000000000000000000000B3 :100D400000000000000000000000000000000000A3 :100D50000000000000000000000000000000000093 :100D60000000000000000000000000000000000083 :100D70000000000000000000000000000000000073 :100D80000000000000000000000000000000000063 :100D90000000000000000000000000000000000053 :100DA0000000000000000000000000000000000043 :100DB0000000000000000000000000000000000033 :100DC0000000000000000000000000000000000023 :100DD0000000000000000000000000000000000013 :100DE0000000000000000000000000000000000003 :100DF00000000000000000000000000000000000F3 :100E000000000000000000000000000000000000E2 :100E100000000000000000000000000000000000D2 :100E200000000000000000000000000000000000C2 :100E300000000000000000000000000000000000B2 :100E400000000000000000000000000000000000A2 :100E50000000000000000000000000000000000092 :100E60000000000000000000000000000000000082 :100E70000000000000000000000000000000000072 :100E80000000000000000000000000000000000062 :100E90000000000000000000000000000000000052 :100EA0000000000000000000000000000000000042 :100EB0000000000000000000000000000000000032 :100EC0000000000000000000000000000000000022 :100ED0000000000000000000000000000000000012 :100EE0000000000000000000000000000000000002 :100EF00000000000000000000000000000000000F2 :100F000000000000000000000000000000000000E1 :100F100000000000000000000000000000000000D1 :100F200000000000000000000000000000000000C1 :100F300000000000000000000000000000000000B1 :100F400000000000000000000000000000000000A1 :100F50000000000000000000000000000000000091 :100F60000000000000000000000000000000000081 :100F70000000000000000000000000000000000071 :100F80000000000000000000000000000000000061 :100F90000000000000000000000000000000000051 :100FA0000000000000000000000000000000000041 :100FB0000000000000000000000000000000000031 :100FC0000000000000000000000000000000000021 :100FD0000000000000000000000000000000000011 :100FE0000000000000000000000000000000000001 :100FF00000000000000000000000000000000000F1 :1010000000000000000000000000000000000000E0 :1010100000000000000000000000000000000000D0 :1010200000000000000000000000000000000000C0 :1010300000000000000000000000000000000000B0 :1010400000000000000000000000000000000000A0 :101050000000000000000000000000000000000090 :101060000000000000000000000000000000000080 :101070000000000000000000000000000000000070 :101080000000000000000000000000000000000060 :101090000000000000000000000000000000000050 :1010A0000000000000000000000000000000000040 :1010B0000000000000000000000000000000000030 :1010C0000000000000000000000000000000000020 :1010D0000000000000000000000000000000000010 :1010E0000000000000000000000000000000000000 :1010F00000000000000000000000000000000000F0 :1011000000000000000000000000000000000000DF :1011100000000000000000000000000000000000CF :1011200000000000000000000000000000000000BF :1011300000000000000000000000000000000000AF :10114000000000000000000000000000000000009F :10115000000000000000000000000000000000008F :10116000000000000000000000000000000000007F :10117000000000000000000000000000000000006F :10118000000000000000000000000000000000005F :10119000000000000000000000000000000000004F :1011A000000000000000000000000000000000003F :1011B000000000000000000000000000000000002F :1011C000000000000000000000000000000000001F :1011D000000000000000000000000000000000000F :1011E00000000000000000000000000000000000FF :1011F00000000000000000000000000000000000EF :1012000000000000000000000000000000000000DE :1012100000000000000000000000000000000000CE :1012200000000000000000000000000000000000BE :1012300000000000000000000000000000000000AE :10124000000000000000000000000000000000009E :10125000000000000000000000000000000000008E :10126000000000000000000000000000000000007E :10127000000000000000000000000000000000006E :10128000000000000000000000000000000000005E :10129000000000000000000000000000000000004E :1012A000000000000000000000000000000000003E :1012B000000000000000000000000000000000002E :1012C000000000000000000000000000000000001E :1012D000000000000000000000000000000000000E :1012E00000000000000000000000000000000000FE :1012F00000000000000000000000000000000000EE :1013000000000000000000000000000000000000DD :1013100000000000000000000000000000000000CD :1013200000000000000000000000000000000000BD :1013300000000000000000000000000000000000AD :10134000000000000000000000000000000000009D :10135000000000000000000000000000000000008D :10136000000000000000000000000000000000007D :10137000000000000000000000000000000000006D :10138000000000000000000000000000000000005D :10139000000000000000000000000000000000004D :1013A000000000000000000000000000000000003D :1013B000000000000000000000000000000000002D :1013C000000000000000000000000000000000001D :1013D000000000000000000000000000000000000D :1013E00000000000000000000000000000000000FD :1013F00000000000000000000000000000000000ED :1014000000000000000000000000000000000000DC :1014100000000000000000000000000000000000CC :1014200000000000000000000000000000000000BC :1014300000000000000000000000000000000000AC :10144000000000000000000000000000000000009C :10145000000000000000000000000000000000008C :10146000000000000000000000000000000000007C :10147000000000000000000000000000000000006C :10148000000000000000000000000000000000005C :10149000000000000000000000000000000000004C :1014A000000000000000000000000000000000003C :1014B000000000000000000000000000000000002C :1014C000000000000000000000000000000000001C :1014D000000000000000000000000000000000000C :1014E00000000000000000000000000000000000FC :1014F00000000000000000000000000000000000EC :1015000000000000000000000000000000000000DB :1015100000000000000000000000000000000000CB :1015200000000000000000000000000000000000BB :1015300000000000000000000000000000000000AB :10154000000000000000000000000000000000009B :10155000000000000000000000000000000000008B :10156000000000000000000000000000000000007B :10157000000000000000000000000000000000006B :10158000000000000000000000000000000000005B :10159000000000000000000000000000000000004B :1015A000000000000000000000000000000000003B :1015B000000000000000000000000000000000002B :1015C000000000000000000000000000000000001B :1015D000000000000000000000000000000000000B :1015E00000000000000000000000000000000000FB :1015F00000000000000000000000000000000000EB :1016000000000000000000000000000000000000DA :1016100000000000000000000000000000000000CA :1016200000000000000000000000000000000000BA :1016300000000000000000000000000000000000AA :10164000000000000000000000000000000000009A :10165000000000000000000000000000000000008A :10166000000000000000000000000000000000007A :10167000000000000000000000000000000000006A :10168000000000000000000000000000000000005A :10169000000000000000000000000000000000004A :1016A000000000000000000000000000000000003A :1016B000000000000000000000000000000000002A :1016C000000000000000000000000000000000001A :1016D000000000000000000000000000000000000A :1016E00000000000000000000000000000000000FA :1016F00000000000000000000000000000000000EA :1017000000000000000000000000000000000000D9 :1017100000000000000000000000000000000000C9 :1017200000000000000000000000000000000000B9 :1017300000000000000000000000000000000000A9 :101740000000000000000000000000000000000099 :101750000000000000000000000000000000000089 :101760000000000000000000000000000000000079 :101770000000000000000000000000000000000069 :101780000000000000000000000000000000000059 :101790000000000000000000000000000000000049 :1017A0000000000000000000000000000000000039 :1017B0000000000000000000000000000000000029 :1017C0000000000000000000000000000000000019 :1017D0000000000000000000000000000000000009 :1017E00000000000000000000000000000000000F9 :1017F00000000000000000000000000000000000E9 :1018000000000000000000000000000000000000D8 :1018100000000000000000000000000000000000C8 :1018200000000000000000000000000000000000B8 :1018300000000000000000000000000000000000A8 :101840000000000000000000000000000000000098 :101850000000000000000000000000000000000088 :101860000000000000000000000000000000000078 :101870000000000000000000000000000000000068 :101880000000000000000000000000000000000058 :101890000000000000000000000000000000000048 :1018A0000000000000000000000000000000000038 :1018B0000000000000000000000000000000000028 :1018C0000000000000000000000000000000000018 :1018D0000000000000000000000000000000000008 :1018E00000000000000000000000000000000000F8 :1018F00000000000000000000000000000000000E8 :1019000000000000000000000000000000000000D7 :1019100000000000000000000000000000000000C7 :1019200000000000000000000000000000000000B7 :1019300000000000000000000000000000000000A7 :101940000000000000000000000000000000000097 :101950000000000000000000000000000000000087 :101960000000000000000000000000000000000077 :101970000000000000000000000000000000000067 :101980000000000000000000000000000000000057 :101990000000000000000000000000000000000047 :1019A0000000000000000000000000000000000037 :1019B0000000000000000000000000000000000027 :1019C0000000000000000000000000000000000017 :1019D0000000000000000000000000000000000007 :1019E00000000000000000000000000000000000F7 :1019F00000000000000000000000000000000000E7 :101A000000000000000000000000000000000000D6 :101A100000000000000000000000000000000000C6 :101A200000000000000000000000000000000000B6 :101A300000000000000000000000000000000000A6 :101A40000000000000000000000000000000000096 :101A50000000000000000000000000000000000086 :101A60000000000000000000000000000000000076 :101A70000000000000000000000000000000000066 :101A80000000000000000000000000000000000056 :101A90000000000000000000000000000000000046 :101AA0000000000000000000000000000000000036 :101AB0000000000000000000000000000000000026 :101AC0000000000000000000000000000000000016 :101AD0000000000000000000000000000000000006 :101AE00000000000000000000000000000000000F6 :101AF00000000000000000000000000000000000E6 :101B000000000000000000000000000000000000D5 :101B100000000000000000000000000000000000C5 :101B200000000000000000000000000000000000B5 :101B300000000000000000000000000000000000A5 :101B40000000000000000000000000000000000095 :101B50000000000000000000000000000000000085 :101B60000000000000000000000000000000000075 :101B70000000000000000000000000000000000065 :101B80000000000000000000000000000000000055 :101B90000000000000000000000000000000000045 :101BA0000000000000000000000000000000000035 :101BB0000000000000000000000000000000000025 :101BC0000000000000000000000000000000000015 :101BD0000000000000000000000000000000000005 :101BE00000000000000000000000000000000000F5 :101BF00000000000000000000000000000000000E5 :101C000000000000000000000000000000000000D4 :101C100000000000000000000000000000000000C4 :101C200000000000000000000000000000000000B4 :101C300000000000000000000000000000000000A4 :101C40000000000000000000000000000000000094 :101C50000000000000000000000000000000000084 :101C60000000000000000000000000000000000074 :101C70000000000000000000000000000000000064 :101C80000000000000000000000000000000000054 :101C90000000000000000000000000000000000044 :101CA0000000000000000000000000000000000034 :101CB0000000000000000000000000000000000024 :101CC0000000000000000000000000000000000014 :101CD0000000000000000000000000000000000004 :101CE00000000000000000000000000000000000F4 :101CF00000000000000000000000000000000000E4 :101D000000000000000000000000000000000000D3 :101D100000000000000000000000000000000000C3 :101D200000000000000000000000000000000000B3 :101D300000000000000000000000000000000000A3 :101D40000000000000000000000000000000000093 :101D50000000000000000000000000000000000083 :101D60000000000000000000000000000000000073 :101D70000000000000000000000000000000000063 :101D80000000000000000000000000000000000053 :101D90000000000000000000000000000000000043 :101DA0000000000000000000000000000000000033 :101DB0000000000000000000000000000000000023 :101DC0000000000000000000000000000000000013 :101DD0000000000000000000000000000000000003 :101DE00000000000000000000000000000000000F3 :101DF00000000000000000000000000000000000E3 :101E000000000000000000000000000000000000D2 :101E100000000000000000000000000000000000C2 :101E200000000000000000000000000000000000B2 :101E300000000000000000000000000000000000A2 :101E40000000000000000000000000000000000092 :101E50000000000000000000000000000000000082 :101E60000000000000000000000000000000000072 :101E70000000000000000000000000000000000062 :101E80000000000000000000000000000000000052 :101E90000000000000000000000000000000000042 :101EA0000000000000000000000000000000000032 :101EB0000000000000000000000000000000000022 :101EC0000000000000000000000000000000000012 :101ED0000000000000000000000000000000000002 :101EE00000000000000000000000000000000000F2 :101EF00000000000000000000000000000000000E2 :101F000000000000000000000000000000000000D1 :101F100000000000000000000000000000000000C1 :101F200000000000000000000000000000000000B1 :101F300000000000000000000000000000000000A1 :101F40000000000000000000000000000000000091 :101F50000000000000000000000000000000000081 :101F60000000000000000000000000000000000071 :101F70000000000000000000000000000000000061 :101F80000000000000000000000000000000000051 :101F90000000000000000000000000000000000041 :101FA0000000000000000000000000000000000031 :101FB0000000000000000000000000000000000021 :101FC0000000000000000000000000000000000011 :101FD0000000000000000000000000000000000001 :101FE00000000000000000000000000000000000F1 :101FF00000000000000000000000000000000000E1 :08200000481F000080013E04AE :102008003038F00C19005EBC5C7C4848F00C003994 :10201800F00C093BB22A5EFC000011C0F80815015B :102028003039F20C1800E08800035EFDF00B000B5D :102038004828F00B032C5EFC00007B08580CC0D02D :1020480048787829F00900293008720A143CC060E1 :102058002FF82F895848CFA13FF85EF800007B0879 :102068003038F00C18005EBCF60C001C30094838FB :10207800F00C09295EFC000000007B085EFFD70316 :10208800D4011988301EB6881998B6BEEA18FFFF21 :10209800E818FF80B6AEB698580AC0301588C0A8B0 :1020A80048981188F4081800C0303038C03848788B :1020B80011B8B6C83EE8B6D83008B6E8302C306853 :1020C800B208D802000016AB00000008D40130188E :1020D800198EB68E199CB6A8EA1CFFFFE81CFF8073 :1020E800B6B8B69C580AC0A0158CE06A00FFF00C80 :1020F8001800F4081710F9B80001B6C83EE8B6D8B9 :102108003008B6E8302C3068B208D802D421202D27 :102118004AAA189E1698129674075807C071FACAE8 :10212800FFF814F7F01F0026C4681989B6891999B1 :10213800EA19FFFFE819FF80B6993039B0A9740988 :102148007219F20C1618B0F9B0CCF9D9C108F3D944 :10215800C208B0ECB0D9304BB0BB74097229F20C8C :102168001618F169000CF16C0009F9D9C108F3D906 :10217800C208F16C000BF16B0008F169000A7409E0 :10218800300A7239F16A00133EEAF16A0012F20A63 :102198001618F1690011F16A000EF16B000DF5D9FE :1021A800C108F3D9C208F16A0010F169000F302C98 :1021B8003138AC082FEDD8220000152C800020D42F :1021C8003038F00C18005EBCF60C001B48F8F00B19 :1021D800032858085E0C704958195E1C7029581954 :1021E800C09148B8F00C003C9828B42878089508A5 :1021F8005EFC71E85808F0091700F1F91001F1F8D0 :10220800120A9509B4285EFC00007B08000011C082 :10221800D4314BC8300A10941499910A1893301A83 :102228004B984BA7910A3EE14B921296C0280A9907 :10223800E0682710C0485808C5602018664AE21AA6 :102248000201E04A0201CF81C4F8F2C5FFFFE20AA9 :102258001800CEE10F9BF7DBC0C15825E0890005C7 :102268003038300AC2E80FAA3038C148580BC0A02D :10227800EE08070EEE08000CA96E2FE8199C1C0842 :10228800C058F0CCFFFFEE080708201AF80800082D :102298005C5A10395F9CEC0A18005F9EFDEC000C3C :1022A800EC0C1800CE4110395F09F9DAC008EC0CC3 :1022B80018005F0CF9E90009EC091800C020D83AA9 :1022C800840C3009F20C1900CB34201D5C6A1ADB2F :1022D8001AD849081ADA490C1AD51AD8F01F000F6B :1022E8002FADCA6BDA3A662A68085C5A2FF8EE09ED :1022F8000B0A8908E0480063FE9AFFA9305CD832CF :10230800000014B0000011B8000014B8000016A2B4 :102318008003792C80037AB0800094C4D431202DB6 :102328004C68149570081896169712945808C0713E :10233800FACAFFF814F8F01F0042CC38198830198F :10234800B6881998B6A9EA18FFFFE818FF80B6986A :102358004BC89088EDB80002C171189330023EE175 :102368000788201D4B8C1AD8F01F00382FF22FED4C :102378000788E2081800C0502FF3E0420400CF118C :102388004B3CF01F00320DC83099F2081800E08865 :1023980000114B09920A3009F20A1900E0840091F1 :1023A8001AD84AD84ADC1AD8F01F00282FEDC88856 :1023B800E0450032C290A3684A99E0450033C5D091 :1023C800129B7209F2080309EECAFFFCF3360020DB :1023D8003009AEB6C088760CF808030CF809070C6B :1023E8002FF914CCEC091900CF7349A99289EDB9DA :1023F8000004C5F149A97209F2080308499C1AD8D2 :1024080049581AD8C538304BA368495A7409F20894 :10241800030972C9AEBBF20B1618AEC9AEFBF7D9E9 :10242800C108F3D9C208AEDBAEE948A99289EDB973 :102438000004C1903046C3D80000152C800020D479 :10244800000016A080037AF0800094C4800384D42E :10245800000016A28003785880037AF8000015203F :1024680080037B187409F208030870C8496C1AD8ED :10247800304649681AD8C1A8301AAEBA720AF408A8 :10248800030AF53A0038AECA491A948AEDBA00042C :10249800C0303016C0E87209F2080308F138003875 :1024A80048CC1AD8301648981AD8F01F000B2FEDD0 :1024B8003EE80C07AEC83008AED82FB6A806302CB8 :1024C8002FEDD83280037B2880037858000016A2AD :1024D80080037B38800094C4D421204D4A981897F3 :1024E800118A580AC0313FF6C0D84A7811BC118EFB :1024F800119611A8B166EDEE1186EDE81086F9E6A1 :1025080010064A289088EDB80002C0E14A08201D4C :102518004A0C1ADA1AD61AD8505B5049F01F001E16 :102528002FCD4009401B49D870085808C081FACA05 :10253800FFF00E9C14F8F01F001AC2080F88B68826 :102548000F98EA18FFFFE818FF80B6983018B6A869 :102558003048B6B8F1D6C108B6E83EE8EC0A161815 :10256800B6F6F7680008B6CA3008EDD6C208F768AC :102578000009B6D63098302CB2082FCDD8220000EA :102588000000152800007B28000016A28003782090 :1025980080037B48800094C40000152C800020D460 :1025A800D401580BC0313FF8C0C8178A17B917981B :1025B800B168F1EA118817AAF1EA1088F3E810085F :1025C800F00A161848E9B28AF5D8C208B2B8B29A21 :1025D800F5D8C108B2AA48B99289EDB90002C0A1DC :1025E800201D1AD848881ADC488C1AD8F01F000811 :1025F8002FCD30194878B089D802000000007B2818 :10260800000016A28003799C80037B74800094C428 :1026180000001528D431204D4AE8189570081697FF :1026280012965808C071FACAFFF014F8F01F002A71 :10263800C4D84AA89088EDB80002C1711894300334 :102648003EE20988201D4A6C1AD8F01F00262FF395 :102658002FED0988E4081800C0502FF4E043040067 :10266800CF114A1CF01F001F0B880BCCAE880B98AB :10267800EA18FFFFE818FF80AE983004BA445014F7 :102688003025FACAFFFCAEA5301BF01F0018304AEF :10269800EF64000CEF6500084018F0091618AEF852 :1026A800AEC99A49AEBAF5D8C108F1D8C208EF69DF :1026B800000AAED8AEEA3EE8F3D9C108EF68000BCD :1026C800EF69000930C8302CAC082FCDD832000093 :1026D8000000152C800020D4000016A080037AF09A :1026E800800094C4800384D4800021C8D40148A801 :1026F8009088EDB80002C0E148887008201D1AD8FB :10270800487811881AD84878487C1AD8F01F0007EA :102718002FCDDA0A000016A200000008000016AB50 :10272800800379E480037BA8800094C4D42148E620 :10273800189E30076C0C580CC0A02FF72EC6E04727 :102748000024CF91489CF01F000ADC2A4866EE0757 :102758000027EC070027EF680010AECE8F0B8F2AFA :102768008F39D822000011E080037BC4800094C414 :10277800D4214C8618970C9A302830094C6B310CB0 :10278800F01F00460C9A302830094C5B311CF01FB2 :1027980000430C9A302830094C2B312CF01F003F95 :1027A8000E990C9A30284C0B314CF01F003C0E99B6 :1027B8000C9A30284BDB315CF01F00383018300998 :1027C8004BBA4BCB320CF01F003530184BA73009F1 :1027D8000E9B4BAA321CF01F00310E9B301830099B :1027E8004B7A322CF01F002D4B6532390A9A0E9B1A :1027F8003018129CF01F002932490A9A0E9B301893 :10280800129CF01F002632590A9A0E9B3018129C0F :10281800F01F00220A9A32690E9B3018129CF01F92 :10282800001F0C9A302830094A7B336CF01F001BBC :102838000E9B301830094A5A327CF01F00180C9A47 :10284800302830094A2B330CF01F00144A1533394D :102858000A9A0E9B3018129CF01F001033190A9A1E :102868000E9B3018129CF01F000D0A9A33290E9BFC :102878003018129CF01F00090C9A30283009496B57 :10288800334CF01F00060E9B30183009493AC278C5 :10289800800020D48000427C8000273480004118CA :1028A8008000433080003FD080003EA88000208810 :1028B800800026F48000208480002114800035ECFC :1028C80080003514800034A480004B5480003740C9 :1028D8008000232480003678800024E0335CF01FD9 :1028E80000370C9A302830094B5B328CF01F0033CC :1028F8000C9A302830094B3B32DCF01F00300C9A20 :10290800302830094B0B32ECF01F002C0E9B30188E :1029180030094AEA329CF01F00290E9B3018300912 :102928004ABA32CCF01F00250E9B301830094A9A5B :1029380032BCF01F00220C9A304830094A6B344CE4 :10294800F01F001E0E9B301830094A4A32ACF01FA7 :10295800001B0E9B301830094A1A345CF01F001710 :102968000E9B3018300949FA32FCF01F00140E9BF8 :102978003018300949CA337CF01F00100E9B3018FC :10298800300949AA338CF01F000D0C9A30483009E1 :10299800497B346CF01F00090C9A30283009495BD8 :1029A800339CF01F00060E9B30183009492A33ACBF :1029B800F01F0002D82200008000273480003D88E4 :1029C80080003AC8800038B4800033FC800030D4DE :1029D800800032848000375C800032088000300438 :1029E8008000332880002F8C80002EC4800038841B :1029F800800037CC8000261CD4013038580B5F1972 :102A0800F00C18005F88F3E80008C060F40C0019A7 :102A180048D8F009092B48D89088EDB80001C111B1 :102A280048B848C9580AF20A1700F00A171048A807 :102A38001ADA1ADB1ADC489C1AD8F01F00092FCDC5 :102A4800D802000000007B08000016A280037BDC8F :102A580080037BE4800378C080037BF0800094C40B :102A6800D401580BF60A1700F7FA180BF01F0002EA :102A7800D802000080002A00D401320A300B483CFA :102A8800F01F0003D802000000007B088002E8BCA9 :102A9800D421206D3087FAC6FFF00E9A4C6B18953A :102AA8000C9CF01F0046304B0C9CF01F0045300872 :102AB800FB68000DBA88FB680009FB68000BFB681F :102AC800000CEE784240501830480E9BFB67000817 :102AD800FB68000A300AFE7C2400F01F003A1897B1 :102AE800C0F04B989088EDB80002C0814B78201D4B :102AF8004B7C1AD8F01F00372FED301CC5A8E06AB0 :102B0800F980EA1A03371A9BFE7C2400F01F003272 :102B1800582CC0D14AC89008EE081900C0844AB899 :102B2800201D4AEC1AD8F01F002B2FEDD303300AD2 :102B3800E06B01204AACF01F002BD503E1B8000080 :102B4800EE180001F5D8C201C020D303FE78240096 :102B58003019705BF7D9D001915B705BF7D9D0C1A0 :102B6800915B705BF7D9D081915B580AC020D5037F :102B7800FE7C2400F01F001C0A9CF01F001C364A33 :102B8800300B49BCF01F001BE06A0400300B49AC55 :102B9800F01F0018E06A0400300B498CF01F001584 :102BA800F01F0017497830079107F01F00170E9C97 :102BB8002FADD822800382078002E7368000A280EA :102BC8008000A618000016A2800379BC80037C0848 :102BD800800094C48000A73C80037C2880002C10CF :102BE8008000A3A08000A7EC80002778000014B81C :102BF8008002E8BC00000DB8000009B880002A80F7 :102C0800000000088000751CD401E1B80000EE182F :102C18000001F5D8C201C020D303FE782400301982 :102C2800706BF7D9D001916B706BF7D9D0C1916BEC :102C3800706BF7D9D081916B580AC020D503FE7C00 :102C480024007848EDB80000C0F1F01F0016C0C19C :102C5800319CF01F0015495890092FF9B009301917 :102C68004938B089C1B8E1B80000EE180001F5D8BC :102C7800C201C020D303FE7824003019705BF7D955 :102C8800D001915B705BF7D9D0C1915B705BF7D9CC :102C9800D081915B580AC020D503D402D603000026 :102CA800800022188000A2E6000014B40000151C61 :102CB800D4313006189714931694950618983E093F :102CC800C2C81095118A2FF8F20A1800C251580686 :102CD800C21049E890093008F0091900C064089B3F :102CE8000E9C5C7BF01F001A49A890093008F00977 :102CF8001900C1040C070F98201D1AD849681AD466 :102D08001AD690881AD84958495C1AD8F01F001565 :102D18002FAD8706C1882FF60836CD4548D89009CB :102D28003008F0091900C0353005C0D8201D48A862 :102D38001AD690881AD8489848BC1AD83005F01F77 :102D480000092FCD0A9CD832000016A680013DB498 :102D5800000016A2000014B4800378D080037C48D9 :102D6800800094C480037C6CD42118971696F01FB9 :102D780000325F080E3C5F191895F1E91009C03060 :102D88005808C5710B893E08F0091800C5210B9930 :102D98003008F0091800C4D5E2190040C0E1EACAB9 :102DA800FFFD0BAC1298C068158B2FF92FFB160A84 :102DB80016081839CFA5C2384A089088EDB800021D :102DC800C0D149F8201D49FC1AD8F01F001FF7D6BA :102DD800C0100E9CF01F001D2FED3009EACAFFFD40 :102DE8000BAC1298C0A81587159B2FF9F7E7108B25 :102DF8002FEB160AF60800081839CF6510053EE9CA :102E08000BB8F2081800C021DA2A4919920A3009C9 :102E1800F20A1900C0E4201D1AD848E890881AD888 :102E2800487848DC1AD8F01F0008300C2FCDD8227B :102E3800D82A000080002CB8000016A080037974FE :102E480080037C84800094C480013DB4000016A2F5 :102E5800000014B480037C8CD4014918581CC0713C :102E68003039334C9109F01F000FC0683049334C9A :102E78009109F01F000D48D89088EDB80002C0D124 :102E880048787008201D1AD848981AD8489848AC2D :102E98001AD8F01F000A2FCDD80200000000000841 :102EA8008000A2E68000A300000016A280037A3CFE :102EB8008003821080037CB0800094C4D421FACDB2 :102EC80001004AC81697700512965805C071FACACB :102ED800FF0014F5F01F0028C4A81989301AB68914 :102EE8001999B6AAEA19FFFFE819FF80B69919B926 :102EF800F4091800C20119C53FF8F0051800C1B05F :102F0800E06A00FF300B1A9CF01F001C1A9430086E :102F1800C048E8080B082FF80A38CFC51A94AEB590 :102F2800EEC8FFFCFA050009C038093A10CA123485 :102F3800CFD1C15849256A0CF01F00120A98EECA71 :102F4800FFFCEBDCC0083009AEB5C068700BF609B1 :102F5800070B2FF914CBEA091900CF933EE80A07AB :102F6800AEC83008AED82FB5302CAC052C0DD82201 :102F78000000152C800020D48002E8BC0000011459 :102F88008002EDD0D421202D49981697700E129604 :102F9800580EC071FACAFFF814FEF01F0016C25886 :102FA8001989B6891998EA18FFFFE818FF80B698BA :102FB80030184915B6A86A0CF01F0010EEC9FFFCBE :102FC8005C5C3008AEBCC0686A0AF408070A2FF8CF :102FD80012CAF8081900CF933EE818072FBCAEC8EC :102FE8003008AED8AC0C302C2FEDD8220000152CB0 :102FF800800020D4000001148002EDD0D421202DBF :103008004AE818967008169712955808C071FACAB7 :10301800FFF814F8F01F002AC4D84AA811D4303891 :10302800F0041800E08B0046FACAFFFC1A9B089CC3 :10303800F01F00250D88C300AE880D98EA18FFFF21 :10304800E818FF80AE983018AEA81BC8AEB89A280A :10305800AEC83008C0B8F3D8C010400BF1DAB010D1 :10306800EE09000AF6090709B4D9F0CAFFFF9A2940 :10307800F2081900CF13F1D9C010EE0800083EEA93 :10308800B0DA9AA82FA910073008AEE8AA09089C58 :10309800F01F000EC0E8AE880D98EA18FFFFE81888 :1030A800FF80AECCAE98AEAC3EE8AEB83048AA08C9 :1030B800302C2FEDD82200000000152C800020D4E1 :1030C80000000DB880006BF480006FBCD431202D57 :1030D8004C5818967008169712955808C071BAE897 :1030E800FACAFFFAF01F0041C728F8C8FFFDC3C09D :1030F80011842FF4F0040004C37009893018F00912 :103108001800C67109993EE8F0091800C6214B88D5 :1031180090093008F0091900C5C44B681AD44B6CE3 :103128001AD8F01F00362FEDC548099309A9F3E313 :1031380010835C83C54809893018F0091800C1510B :1031480009993EE8F0091800C1014A989009300829 :10315800F0091900C0A44A781AD44A7C1AD8F01F7A :1031680000272FEDC02830030DB43018F0041800E4 :10317800C2D10DCC3038F00C1800E08B0028F5D304 :10318800C008FACBFFF9F01F001E0D88C120AE88D9 :103198000D98EA18FFFFE818FF80AEB4AE98AEA409 :1031A8001BF8AEC83EE8AED83008AEE83068C0D8E4 :1031B800AE880D98EA18FFFFE818FF80AE983EE841 :1031C800AECCAEB8AEAC3048AA08302C2FEDD83211 :1031D80009883029F2081800CA9030032FF8100423 :1031E800CAB1CC3B0000152C800020D4000016A2E8 :1031F8008003780C80037CBC800094C480006FE05E :10320800D421202D49A81697700E1296580EC07119 :10321800FACAFFF814FEF01F0017C2681989301A9D :10322800B6891999B6AAEA19FFFFE819FF80B69975 :1032380019B9F4091800C0D119C83039F2081800B2 :10324800E08B000848C9F208033CF01F000CC028B6 :10325800300C3018AEB83EE8AECCAED83008AEE888 :10326800302C3068AC082FEDD82200000000152C57 :10327800800020D400007B0880004D78D421202DC8 :103288004A181697700E1296580EC071FACAFFF8AF :1032980014FEF01F001EC3481989301AB6891999FF :1032A800B6AAEA19FFFFE819FF80B69919B9F40917 :1032B8001800C0B119CC3038F00C1800E08B0006AB :1032C800F01F00135C8CC028300C3028AEB83EE8E4 :1032D800AECCAEE85C7CF8081608AED83008AEF87C :1032E8003078AC0848B89088EDB80002C08148A88A :1032F8001ADC48AC1AD8F01F000A2FED302C2FED3D :10330800D82200000000152C800020D480006D38E1 :10331800000016A8800378A880037CD8800094C495 :10332800D421202D4AA81697700512965805C07109 :10333800FACAFFF814F5F01F0027C4781989301A63 :10334800B6891999B6AAEA19FFFFE819FF80B69954 :10335800303819B919C5F40918005F09F0051800C3 :103368005F881268C19049C8F00503345804C060EA :10337800089C301BF01F0019C10849989009E809FA :103388001900C0A449781AD5497C1AD8F01F00172B :10339800089C2FEDC028300C3018AEB83EE8AECCF3 :1033A800AED83008AEE83068AC0849189088EDB857 :1033B8000002C0A148B8201D1ADC48EC1AD51AD85A :1033C800F01F000A2FCD302C2FEDD8220000152C2D :1033D800800020D400007B0880004F1C000016A647 :1033E8008003794080037CEC800094C4000016A818 :1033F80080037D10D421202D4A181697700E12963E :10340800580EC071FACAFFF814FEF01F001EC34818 :103418001989301AB6891999B6AAEA19FFFFE81965 :10342800FF80B69919B9F4091800C0F119C83039E4 :10343800F2081800E08B000A4939F2080038300B0E :10344800701CF01F0012C028300C3018AEB83EE8CF :10345800AECCAED83008AEE83068AC0848C8908822 :10346800EDB80002C08148B81ADC48BC1AD8F01F71 :10347800000B2FED302C2FEDD82200000000152C6A :10348800800020D400007B0880004F1C000016A894 :1034980080037A6480037D28800094C4D40149584D :1034A8009088EDB80002C08149381ADC493C1AD826 :1034B800F01F00132FED49383009118AF20A18005D :1034C800C021DC0AB089F01F0010581CC1004898C0 :1034D80090093008F0091900C025DA0A48681ADC92 :1034E80048AC1AD8F01F0006301C2FEDD802000097 :1034F800000016A28003798480037D38800094C47C :10350800000016AA80019EF880037D54D421202D46 :103518004B281496700E16971295580EC071FACA59 :10352800FFF814FEF01F002EC5681989B68919988E :10353800EA18FFFFE818FF803014B698B6A4F01F09 :103548000029C3E0E0460025C260E0460026C3200B :10355800EEC9FFFCE0460024C0F0129AF9380020BA :103568003009AEB8C058F809070B2FF914CBF00989 :103578001900CFA3C28830682DACAEB8306A3008C5 :10358800198B12CB2FF8201C5C88F4081900CF91F6 :103598003068C19878C8F0091618AEF93049AEC835 :1035A800AEB9F3D8C108F1D8C208AED9AEE83048F0 :1035B800C0A8AEB4F9380038AEC83018C048AEB4A8 :1035C800AECC18983EE91007AEC93009AED92FB86D :1035D800302CAA082FEDD8220000152C800020D40A :1035E8008001997CD421202D49F8189670081697E7 :1035F80012955808C041FACAFFF8C1881988B688D8 :103608001998EA18FFFFE818FF803019B698306853 :10361800B6A9B6B81A9CF01F0015581CC0B00A9974 :103628000E9B0C9CFACAFFF8300814F8F01F001023 :10363800C1881BD8AEC81BC8AED81BB8AEE81BA83B :10364800AEF81B98EF6800081B88EF6800093EE891 :10365800EF68000A3008EF68000B302C30B8AA0871 :103668002FEDD8220000152C80019128800020D44D :10367800D421FACD010016961A971A9C173AF01F12 :103688000025FAC9FF000D88F20800083009F16921 :10369800FF004A189088EDB80002C08149F81AD78F :1036A80049FC1AD8F01F001F2FED300849E749FAE6 :1036B800AE88AE98AEA8AEB8B488109949CA0E9B29 :1036C8001A9C1A96F01F001B5C5CC040E06C00FF5F :1036D800C1E849189088EDB80002C1510F8A0FB9A6 :1036E8000F98B168F1EA11880FAAF1EA1088F3E897 :1036F8001008201D1AD848981AD648FC1AD8F01F66 :1037080000092FCD30194898301CB0892C0DD822CB :103718008002E736000016A280037A7C80037D646D :10372800800094C400007B2800001528800025A88C :103738008000C4C080037D84D401F01F0006E068C7 :1037480000FF581CF00C1710F9BC0001D80200004B :10375800800199CCD42118971696335CF01F001677 :103768005827C1F10D980D89F1E910893018F00931 :103778001900C1710DA80DBA0DC9303BF608180023 :10378800E0880004300CC04848CBF608033CA96A1E :10379800ECCBFFFB120A5C7AF01F00091897C028CF :1037A8003FF7335CF01F0007E06C00FF5817F9BCC7 :1037B8000001D8228000A30000007B08800053C0CD :1037C8008000A2E6D421202D581CC4211789F809AD :1037D8001800C3E1F6C8FFFE1796C170118AF20AF5 :1037E8001800C131119A3EE9F20A1800C0E149B93E :1037F800920A3009F20A1900C0841AD84988499CEB :103808001AD8F01F00192FED3008FACAFFF8300B4C :1038180014E80C9CF01F00159A3A18973038F006F7 :103828001800E0880004300CC0484918F006033C32 :103838005C7A0E9BF01F000F18950C9CF01F000E71 :103848000E9CF01F000E5815C0310A9CC038E06C61 :1038580000FF2FEDD8220000000016A28003795C3B :1038680080037CBC800094C4800072DC00007B086C :103878008000514080006E188002E28CD401582CE0 :10388800C13117981789F1E910893018F009190022 :10389800C0B117C817BA17ACA96A2FBBF00A000A3B :1038A8005C7AF01F0002DA0A80007380D421581C69 :1038B800C391580BC0311697C1E81788F80818004B :1038C800C3411797C33817893018F0091800C13158 :1038D80017993EE8F0091800C0E1497890093008C6 :1038E800F0091900C08449581ADB495C1AD8F01F3E :1038F80000152FED49089088EDB80002C08148F8FE :103908001AD7491C1AD8F01F000F2FED3038F007CE :103918001800E08B000848D8F007033CF01F000CA3 :10392800DA2AE06C00FFD82230072FF8100BCCC140 :10393800CE2B0000000016A2800379F880037CBC1F :10394800800094C480037DA800007B088000599CF7 :10395800D421202D4B981896169414971295908878 :10396800EDB80002C1314B694B685805F2081700E1 :10397800201D1AD816985C781ADA1AD84B281ADC3F :103988004B2C1AD8F01F00322FAD3038F007180032 :10399800E0880005E06C00FFC8584AE8F0070338E3 :1039A80050085808C1504A59920A3009F20A1900B9 :1039B800C0841AD84A484A8C1AD8F01F00252FED1F :1039C800400CF01F002630094A28F00709391A9CD4 :1039D800E06A04005016300B1ADC14981AD75C748D :1039E8001ADB16991AD5089C1ADA169A1AD6F01FF5 :1039F800001C49282FAD580CC3819088EDB80002EF :103A0800C1511AD71AD41AD6403850461AD848D8AD :103A180048B95805F2051700F005171048A81AD537 :103A2800490C1AD8F01F000A2FAD0E9C400BF01F4E :103A3800000E301CC3780000000016A280037DC869 :103A480080037DC4800379C480037DCC800094C446 :103A580000007B0880037DF88000599C80005D642D :103A680080037E2480002A689088EDB80002C15146 :103A78001AD71AD41AD6403850461AD848B848C95E :103A88005805F2051700F005171048A81AD548ACD4 :103A98001AD8F01F000A2FAD300948983FFCF007EC :103AA80009392FEDD822000080037DC480037DC82A :103AB800800379C480037E50800094C400007B0892 :103AC800D431584CE081008E580BC2A01785F805F8 :103AD8001800E081008A179817A7B167EFE81187E7 :103AE80017B8EFE8108717C8F1E71007C7E80B8980 :103AF8003018F0091800C7E10B993EE8F0091800E2 :103B0800C7914C2890093008F0091900C7344C08AF :103B18001AD54C0C1AD8F01F00402FEDC6B81697CE :103B28003006C1F80B960BA8F1E610865C86C688AD :103B380007893018F0091800C72107993EE8F009ED :103B48001800C6D14B1890093008F0091900C6743E :103B58004AF81AD34AFC1AD8F01F002F2FEDC5F8DF :103B68003005C1B80795C61809893018F00918003A :103B7800C61109993EE8F0091800C5C14A389009EC :103B88003008F0091900C5644A181AD44A1C1AD812 :103B9800F01F00212FEDC4E83003C1A80993C50820 :103BA80009893018F0091800C13109993EE8F0096F :103BB8001800C0E1495890093008F0091900C0847C :103BC80049381AD4493C1AD8F01F00132FED06992A :103BD8000A9AF7D6C0100E9CF01F0010581CC0306F :103BE800E06C00FFD83230072FF5F6050005C80154 :103BF800C98B0B833028F0031800C95030062FF307 :103C0800EA030003C961CADB000016A280037A98A0 :103C180080037CBC800094C4800039580784301825 :103C2800F0041800CA0030052FF4E6040004C9D1D6 :103C3800CB4B09883019F2081800CB1030032FF845 :103C48001004CAF1CC5B0000D421202D3038169620 :103C58001494F00B1800E08B0072300750074BA843 :103C68001188EE081800C0B04B889008EE081900BB :103C7800C654201D4B684B7C1AD8C0F84B69138971 :103C8800F0091800C0E14B589008EE081900C56407 :103C9800201D4AF84B2C1AD8F01F00322FEDC4E82B :103CA8001A9AE0690400501712981ADAEBDCC0106F :103CB8001ADB0E9A1AD70E9B1AD40A9C1AD93019F5 :103CC8001AD7F01F00294A182FAD580CC1B1908897 :103CD800EDB80002C1114A584A595804F2041700B5 :103CE800F004171049A81AD64A2C1AD51AD41AD88B :103CF800F01F001C2FCD0C9C400BF01F001F301C28 :103D0800C1F89008EE081900C11449884989580477 :103D1800F2041700F004171048D81AD6497C1AD5AF :103D28001AD41AD8F01F000F2FCDA17630092FF61C :103D380049383FFCF0060929C038E06C00FF2FED38 :103D4800D822000000007B07000016A280037A102A :103D580080037E80000016AB000016A680037EA0BC :103D6800800094C480005D6480037DC480037DC8A6 :103D780080037EB880002A6880037EDC00007B0810 :103D8800D421583CC661580BC24017843028F0042F :103D98001800C621179717A8F1E710875C87C5D8C0 :103DA80009893018F0091800C5D109993EE8F009C9 :103DB8001800C5814B6890093008F0091900C5241E :103DC8004B481AD44B4C1AD8F01F00342FEDC4A816 :103DD80016973006C1B80996C4B80B893018F0098F :103DE8001800C4B10B993EE8F0091800C4614A886C :103DF80090093008F0091900C4044A681AD54A6CB9 :103E08001AD8F01F00262FEDC3883004C1A80B94E0 :103E1800C3A80B893018F0091800C1310B993EE886 :103E2800F0091800C0E149A890093008F009190004 :103E3800C08449881AD5498C1AD8F01F00182FED6C :103E48000E9C089A0C9B5C7CF01F0015581CC03017 :103E5800E06C00FFD82230072FF4F6040004CA11E2 :103E6800CB9B09853018F0051800CB6030062FF57C :103E7800E8050005CB31CCAB0B883019F2081800E7 :103E8800CC7030042FF81005CC51CDBB000016A221 :103E98008003791480037CBC800094C480003C506B :103EA800D431204D1495740A501A18961788301971 :103EB800F2081800C771F6C7FFFE1794C1700F8982 :103EC800F0091800C1310F993EE8F0091800C0E167 :103ED8004B7890093008F0091900C0844B581AD75C :103EE8004B5C1AD8F01F00352FED4B189088EDB8B1 :103EF8000002C0A14AF81AD44B1C1AD61AD51AD8EF :103F0800F01F002E2FCD3028F0041800E08B004B56 :103F18003006304030114A624A63C3E80F88E0082F :103F28001800C4010F990FA8B168F1E911880FB9F9 :103F3800F1E910880FC92FB7F3E810085807C170C6 :103F48000F89E2091800C1310F993EEAF4091800F7 :103F5800C0E18409300AF4091900C0941AD7496CE1 :103F68001AD35028F01F00152FED400850388489C7 :103F7800EDB90002C0A11AD84029492C1AD91AD67D :103F88001AD3F01F000E2FCDF9D6C008FACBFFF4D4 :103F98002FF6F01F000D0836CC253008301CAAC8B3 :103FA800C038E06C00FF2FCDD8320000000016A208 :103FB80080037A4C80037CBC800094C480037F0813 :103FC80080037F308000C19CD431203D3019149487 :103FD800189674051788F2081800E0810085F6C75E :103FE800FFFE1792C1700F89F0091800C1310F99AF :103FF8003EE8F0091800C0E14BD890093008F009F4 :104008001900C0844BB81AD74BBC1AD8F01F003B14 :104018002FED4B789088EDB80002C0A14B581AD20A :104028004B7C1AD61AD41AD8F01F00342FCD30384A :10403800F0021800E08B005830064AD04AD1FAC383 :10404800FFF8C4B80F88304AF4081800C4C10F99A3 :104058000FA8B168F1E911880FB9F1E910880FC903 :104068002FB7F3E810085807C1800F89301AF409F0 :104078001800C1310F993EEAF4091800C0E180091F :10408800300AF4091900C0941AD749BC1AD150282B :10409800F01F001A2FED400850288089EDB9000262 :1040A800C0911AD8497C1AD51AD61AD1F01F001314 :1040B8002FCD5816C0805826C0B0069B0A9CF01F0A :1040C8000012C0A8069B0A9CF01F0010C058069B4F :1040D8000A9CF01F000F2FF60436CB553008301C11 :1040E800A8C8C038E06C00FF2FDDD832000016A247 :1040F800800378F080037CBC800094C480037F0830 :1041080080037F308000CBC88000CA748000CA92C8 :10411800D421FACD00884C6816979088EDB8000233 :10412800C0B14C48201D1ADC1AD84C384C3C1AD85F :10413800F01F00432FCD344A300BFAC6FFFC0C9C0D :10414800F01F0040306AE06B00FFFACCFFDBF01F85 :10415800003D0F8A31F8F00A1800E08B008930889A :10416800EECBFFFFFB68003C0C9CF01F00370F896B :10417800FB6900244AE89088EDB80002C0A14AE82B :10418800201D4B2C1AD91AD61AD8F01F002D2FCD66 :104198000F882FF8FAC6FFB810070C9C0E9B173A29 :1041A800F01F002BFAC9FF780F88F20800083009C1 :1041B800F169FFC049E89088EDB80002C0B10F88E6 :1041C800201D1AD849C81AD64A2C1AD8F01F001C24 :1041D8002FCD0F8A3018FAC7FFFC3089FACBFFB809 :1041E8000E9CF01F001D581CC0C0491890093008CB :1041F800F0091900C3C44908498C1AD81AD8C0E86C :10420800497CF01F000F0E9C300BF01F001618970A :10421800581CC080201D1ADC493CF01F00092FEDF6 :10422800C268492CF01F00060E9CC238000016A276 :1042380080037A248003787080037F50800094C4C0 :104248008002E8BC8002E73680037CB08002EE0C76 :1042580080037F648001908480037F7880037FA03F :10426800800099A880037FB880037FC0E06C00FFBE :104278002DEDD822D42120AD4A461697178A31F859 :10428800F00A1800E08B002FFAC5FFF92FFB0A9CF3 :10429800F01F001F0F88FAC9FFD8FB680027100914 :1042A8003008F368FFDF8C88EDB80002C0814998B8 :1042B8001AD5499C1AD8F01F00192FED300BFACCEB :1042C800FFF9F01F00171897581CC1B048F890095B :1042D8003008F0091900C1541ADC48E8491C1AD8FA :1042E800C0D88C093008F0091900C0353FF7C098CC :1042F800201D488848CC1AD83FF7F01F00082FED3A :104308000E9C2F6DD8220000000016A28002E7360E :10431800800378E080037B18800094C4800099A80B :1043280080037D5480037FC4D431216D4D281697B6 :104338009088EDB80002C0B14D08201D1ADC1AD8CB :104348004CF84D0C1AD8F01F00502FCD321AFAC66F :10435800FFFD300B0C9CF01F004D0F8A31F8F00A5E :104368001800E08B0085EECBFFFF0C9CF01F004887 :104378000F88FB6800234C089088EDB80002C081C4 :104388004BF81AD64C3C1AD8F01F003F2FED0F8679 :104398002FF6EE060006FAC7FFAC0C9B0E9C173AE8 :1043A800F01F003D0D88FAC9FFA8F20800080E9C0E :1043B8003003F163FFFCF01F00393038EFDCC00830 :1043C8000D89F00718005FB53018F00918005F185C :1043D80010450A94E6051800C4A1ECCBFFFDFAC30A :1043E800FFDC2FE6069C0D8AF01F002B0D88FAC90A :1043F800FFA8F2080008069BF165FFCCFAC5FFC0CC :104408000A9CF01F002730D81896F00C18005F1986 :104418003058F00C18005F18F3E80008E808180096 :10442800C261FAC4FFB2306AE06B00FF089CF01F5B :1044380000170C9B08990A9A0E9CF01F001A0E9CF4 :10444800F01F0019300BFACCFFFDF01F0018581CA4 :10445800C100489890093008F0091900C0844888BC :104468001ADC493C1AD8F01F00082FEDE06C00FF59 :104478002EADD832000016A280037888800379AC6C :1044880080037F50800094C48002E8BC8002E73635 :1044980080037FE48002EE0C8002DC2C80009868A8 :1044A8008001927080019258800099A880037D5401 :1044B800D401319CF01F0010E06B00EFFE7C280057 :1044C800F01F000E581CC060FE7C2800F01F000C76 :1044D800CFC0319CF01F000B48B890093008F00994 :1044E8001900C0844898201D489C1AD8F01F00095C :1044F8002FEDD8028000A3008000A7FA8000A7F261 :104508008000A2E6000016A28003790880037FF0ED :10451800800094C4D431202D3008FAC7FFF81696CD :10452800189514930EE81694098B0A9C2FF4F01F23 :104538000009581CC0B00E9B0A9CF01F0007089881 :104548000C18E6081900CF13300C2FEDD8320000F4 :104558008000A7FA8000A816D421202D30081496D0 :10456800F80C002C129AFAC9FFF812E84A88F00CE5 :10457800002C169578280C9B0A9C5D184A583049DF :10458800319C9109F01F00249ABA0C9BFE7C2400F0 :10459800F01F00221897319CF01F00214A189088BC :1045A800EDB80002C0414A0CF01F002049D890889D :1045B800EDB80002C0D149E8201D49EC1AD8F01F17 :1045C800001B49D80A9C908BF01F001C2FED4958FE :1045D8009088EDB80002C041499CF01F00144918AA :1045E8009088EDB80002C0C14918201D491C1AD88E :1045F800F01F000E9AFB0C9CF01F00102FED9A394B :1046080049080E9CB0092FEDD8220000000011E0E7 :10461800000011B88000A3008000451C8000A2E6BD :10462800000016A080038008800094C480037800EE :1046380080037C84000011BE80013DB48003800C9F :10464800000011BCD431202D4BC43048E8C3FFF022 :10465800BAF81897199616910C90F8C2FFFD2FC456 :104668003005E21000400988EC081800C4B107883A :104678003029F2081800C1F10A9C4B08EA05002508 :10468800029AF00500240E9BE8C5FFF46839F01F74 :10469800002CC030301CC4E868086A0A049B0FACC0 :1046A8005D18BAFCE216004030181BF9F009180032 :1046B800C3C1C3D85800E00A1700F9BA0100E8F8E6 :1046C800FFFC049B0FAC5D18BAFC30190788F20890 :1046D8001800C0B10A9C4998EA050025029AF0051D :1046E80000250E9B6A39C0A83049F2081800C0A1FD :1046F800029A0E9B0A9CFAC9FFF9F01F0011C170BB :10470800C1882FF52EC42EC3E0450024CAD148D84D :1047180090093008F0091900C08448B81AD648BC76 :104728001AD8F01F000B2FED302CC048304CC02891 :10473800300C2FEDD8320000000011E080004560F9 :10474800000016A28003789880038010800094C42B :10475800D421202D4BD8910C30094BD8118AF20A5C :104768001800E08000DAB08930085018E1B800007D :10477800EE180001F5D8C201C020D303FE7824004A :104788003019706BF7D9D001916B706BF7D9D0C124 :10479800916B706BF7D9D081916B580AC020D50303 :1047A8004AC7FACAFFFC6E0B4ABCF01F002C1896C9 :1047B800C6E04AB8303A6E09910A401B4A98161961 :1047C800B009E06A03FFF4091900E0880005E06910 :1047D8000400B0094A064A37EC0B000B4A2C8E8AB3 :1047E800F01F002230084A2BAC8849FCF01F00213A :1047F800584CC2204A089088EDB80002C0C149F858 :10480800201D49FC1AD8F01F001F8E8B496CF01F21 :10481800001E2FED49889088EDB80002C0D1497874 :10482800201D497C1AD8F01F00174988490C908B25 :10483800F01F00152FED4879300893084899B20801 :1048480048799308C46800000000152C0000151C66 :10485800000014B0000014B880002D70000011B8DA :10486800000011BE00000DB88002E736000009B84C :104878008000464C000016A0800379D880037C8411 :10488800800094C480013DB4000011BCF01F0024D6 :104898004A489008EC081900C0A44A3890881AD8E9 :1048A8004A284A3C1AD8F01F00232FED4A289009BD :1048B8003008F0091900C0644A084A1C909BF01F90 :1048C80000214A19300893084A09B20849C9B28830 :1048D800E06B0120FE7C0D80F01F001DE1B8000098 :1048E800EE180001F5D8C201C020D303FE782400D9 :1048F8003019705BF7D9D001915B705BF7D9D0C1E3 :10490800915B705BF7D9D081915B580AC020D503C1 :10491800319CF01F00102FEDD8220000800044B811 :10492800000016A2000014B4800379D88003802CFC :10493800800094C4000016A6000014B0000014B84B :1049480080013DB4000011B8000011BE8000A20033 :104958008000A300D431207D4B6730054B664B782F :104968001188EA081800EC081710EE0817004B4CDD :104978001AD8F01F00344B481188EA081800EC07D1 :1049880017104B2C50074B2230074B23F01F002DDC :104998000E942FED4B01CBD86A005800E08000B28E :1049A80080286009201D1AD95028F01F002C602A81 :1049B8002FFD580AE60A1700E20A171040185C781B :1049C80060491AD84A681ADC1ADA4A6A5809F40996 :1049D8001700F00917104A4C1AD91AD01AD61AD744 :1049E800F01F001860482F8D5808C431E0C9FFBC7B :1049F800720A580AC0E0744B201D49CC1ADB1ADA37 :104A08001AD850595048F01F000F2FCD40084019B0 :104A18002FF82FC95848CED161585808C610704988 :104A2800493C1AD91AD8F01F00072FEDC598000085 :104A3800800380548003805C000016AB8003806094 :104A4800800094C400007B078003807400007B080A :104A580080037BE480037BDC800096A880037DC410 :104A680080037DC880038088800380B8800380D05D :104A780061E85808C350F11900127008201D1AD8AF :104A8800507850395028F01F002761EA2FFDF53B78 :104A9800001040291AD940281AD81ADC4A2C1ADBE7 :104AA8001ADA50B8F01F0021FACAFFE00C9B5084B4 :104AB800FB5400240E9CF01F001E2FBD40305050A8 :104AC8001AD0FB1800145028F01F00162FFD4018AC :104AD8001AD81AD01ADC497CF01F00142FCD0E9C6E :104AE800F01F001549594968580CF2081710201D85 :104AF800494C1AD8F01F000D493CF01F000C2FED4F :104B08002FF62FC55826FE91FF492FF75847C0505A :104B1800E40700353006C41BF01F000C2FADD83257 :104B2800800096A8800380E8800094C4800021C893 :104B380080038114800070788003812C8003812891 :104B480080038130800381408000D680D431204D9D :104B58004BE812911896169711895809C1A119881E :104B6800B6881998EA18FFFFE818FF80B6C9B69802 :104B7800B6A93EE8B6B83048A2084B589088EDB8B8 :104B88000002E08100E7201D4B284B3C1AD8C228C0 :104B9800FACCFFF4F01F0031403366105800C1E131 :104BA8000D88AE880D98EA18FFFFE818FF80AEA0C0 :104BB800AE9830093EE8AEC9AEB83048A2084A48B7 :104BC8009088EDB80002E08100C5201D4A184A4CC3 :104BD8001AD8F01F00242FEDCBC858B0F9B0020A3C :104BE80030044A12C0786408F004032C2FF4F01F34 :104BF800001F641849C51034CF736A0C3004F01FC5 :104C0800001B8B14661B580BC460A36B301CF01F71 :104C180000188B0CC3A1497CC1486608F002030B3D :104C28006A080408501B5008F01F00134008910C34 :104C3800401B6A082FF4F002030C580CC20148FC10 :104C4800F01F0008C2880000000016AA000016A283 :104C58008003783C8003816080018F048003817C1D :104C6800800094C4000015208002E28C8002DC3CA5 :104C7800800381988002E2A4800381C0344AF01F37 :104C880000376A182FF88B18E8021502344C66189A :104C98001034CC430D88AE880D98EA18FFFFE81849 :104CA800FF803005AE98AEA030364AD20A984AD96D :104CB8000E93640AEA0B1502F40B030AF537002079 :104CC800F4070B08ECCCFFFF2FF7E60C000C5C5741 :104CD800300AE6060B07C0886404E80B0304E80AF8 :104CE80007042FFA18C40E9EEE0A1900CF630E9A15 :104CF8002FFAF4060006928A5C56EDBA0002C1D17A :104D0800640A202DF40B0304503950281A9C306A89 :104D1800E8CBFFDFF01F001168CA1ADAE93A003859 :104D28001ADA491A1AD7491C1AD41AD51ADAF01FEE :104D380000102F8D400840192FF50035CBB53EE8FF :104D4800E6060B08069730080C07AE982FF6A20661 :104D5800302C2FCDD83200008002E7360000152015 :104D6800000016A28003783C800381E4800094C48C :104D780048781188580CC0215EFF5C68100C300818 :104D8800F9390015F00918005F1C5EFC00001530A9 :104D9800D4211897580CC2A04968F129000030089E :104DA800F2CA0004F00900065836F5D8E9062FF8CB :104DB800EE06002C791C163CC17148F89088EDB8B5 :104DC8000001C0A148D81ADB48DC1AD61AD71AD86D :104DD800F01F000C2FCDF9D6C00830082F06EE06BC :104DE80000278F18D8225848CDE1E06C00FFD82260 :104DF80000001530000016A2800382688003830437 :104E0800800094C4D42118971695580CC2B04978DC :104E1800F12900003008F2CB0004F00900065836EA :104E2800F7D8E9062FF8EE06002A751A580AC03096 :104E38000A3AC16148E89088EDB80001C0A148D895 :104E48001AD548DC1AD61AD71AD8F01F000C2FCD5D :104E5800EE060027F9D6C008EF450044D822584886 :104E6800CDD1E06C00FFD82200001530000016A25A :104E780080038CF080038304800094C4D4211897A5 :104E8800580CC2A049E8F12A00003008F4CC00040C :104E9800F00A00065836F9D8E9062FF8EE06002978 :104EA80073195809C170580BC0F049689088EDB85B :104EB8000001C0A149481AD9494C1AD61AD71AD89C :104EC800F01F00132FCDEE06002748D8B0866F1CC0 :104ED800D8225848CDE1580BC10048A8900930089D :104EE800F0091900C0A448881AD748AC1AD8F01F8E :104EF8000008300C2FEDD822D82A00000000153009 :104F0800000016A280038CB880038304800094C438 :104F180080038324D4214CB816951188189730063D :104F2800EC081800E08000B6300BF01F004718941A :104F38005807E0800097580C5F19EC0518005F08C7 :104F4800F3E81008EC081800E080008C4BF8908813 :104F5800EDB80002C3314BE811894BE89088EDB8F1 :104F68000001C2C15C69EE09002871185808C041E7 :104F7800109E1096C098EE09000AF53E0015F2CA78 :104F8800FFF8EE0A03266F5A201D580AF40C170082 :104F9800F5FC10045808F00B1700F1FB10041ADE9A :104FA8001AD61ADC1ADA1ADB1AD84AB81AD74ABC3F :104FB8001AD91AD8F01F002A2F6D5805C3D068488F :104FC80058485F1958085F181268C3304A08118991 :104FD8004A089088EDB80001C2C15C69EE09002852 :104FE80071185808C04110951096C098EE09000A2B :104FF800F5350015F2CAFFF8EE0A03266F5A201D90 :10500800580AF40C1700F5FC10045808F00B1700A8 :10501800F1FB10041AD51AD61ADC1ADA1ADB1AD8D8 :1050280048D81AD748DC1AD91AD8F01F000D2F6DA6 :10503800E93C0013D8226F58F13C0013D822000035 :10504800000016AB80004E84000016A80000153042 :10505800000016A28003828C80038348800094C4D9 :1050680048D890093008F0091900C1345807EE08EB :105078001700EE041700EFF810151AD848781AD45C :10508800487C1AD71AD8F01F0007300C2FCDD82229 :10509800D82A0000000016A88003828C8003838C25 :1050A800800094C4D421580CC25049D8F12900007A :1050B8003008F2CA0004F00900075837F5D8E907A4 :1050C8002FF8F807002E7D1E163EC12149589088FA :1050D800EDB80001C0A149481ADB1AD71ADC493CCF :1050E8001AD8F01F00132FCD0E9C5C5CD8225848AC :1050F800CE31490890093008F0091900C045E06C24 :1051080000FFD8224888201D1ADB1ADC48AC1AD8C0 :10511800F01F0007E06C00FF2FCDD82200001530EB :10512800000016A6800382BC80038304800094C418 :10513800000016A2800383C0D421580C5F18580BB6 :105148005F1918961695F3E800081494C590580A44 :10515800C5704AC89088EDB80001C0C114985C7841 :10516800201D1AD84A881ADB4A8C1AD8F01F002842 :105178002FCD4A889088EDB80001C0D14A28201D5B :105188004A5C1AD8F01F0022089B0A9C5C7BF01F1F :1051980000232FED300A5C74149C089BF01F00203C :1051A8001897C0E149789008F8081900C29449682E :1051B8001AD649CC1AD8F01F00162FEDC1C8089A84 :1051C8000A9B781CF01F00180E9B6DECF01F00174F :1051D8005C5CC12048B890093008F0091900C08407 :1051E80048981AD6492C1AD8F01F00092FED0E9CA2 :1051F800F01F0010DC2A0E9CF01F000EDA2ADC2AB1 :10520800000016A280038CE4800383E8800094C425 :10521800000016A080037C8480013DB48000D31870 :10522800800383FC8002E7368001153880038428D8 :105238008000D13CD421149518971696580CC0417B :10524800E06C00F6D822F01F00163FF8E9DCC00831 :10525800F0041800C041E06C00FFD822491890887B :10526800EDB80001C0E16C48201D1AD848E85C651B :1052780048EC1AD51AD61AD71AD8F01F000D2FAD38 :105288006C4858485F0948B8B0893008EE040004F3 :10529800E9680068F01F00088F7CD82A800050ACAD :1052A800000016A280038D1080038450800094C4EF :1052B80000007B0780009504D43118971695F01FDD :1052C80000353FF8EDDCC008F0061800C5E0EE0632 :1052D80000083009F1690015ECC8FFF8EE0803244E :1052E8005804C5304AC89088EDB80001C0A14AB832 :1052F800201D4ABC1AD41AD41AD8F01F002A2FCD60 :10530800EB1800726EF91238F20817B00838F0047A :1053180017804A589088EDB80001C051F01F00234B :105328004A38910CECC8FFEA3019EE08032B089AAA :105338000A9C5C7AF01F001FE7DCC008C19049A8EE :105348009088EDB80001C0F16A48201DF3D3B00879 :105358001AD91AD41AD849181AD5497C1AD8F01F5C :1053680000112FAD0C073008EF680015C10830197F :10537800ECC8FFF8EE060006ED690015EE080329F3 :105388000819EE080929C038E06300FF069CD832E6 :10539800800050AC000016A680038C7880038474CB :1053A800800094C4000016A2800095040000153403 :1053B800800109C08003848CD43116941493189703 :1053C800580CC1014AB89008F8081900E08400D3C5 :1053D8004A98201D4A9C1AD8F01F00293FFC2FED3F :1053E800D832300BF01F0027189B18960E9CF01F20 :1053F80000263FF8EBDCC008F0051800E08000BB91 :105408004A289088EDB80001C0E1F1D3C010201DF2 :105418001AD849981AD449EC1AD61AD71AD8F01FAC :1054280000182FAD49B89088EDB80001C0D14928BF :10543800201D499C1AD8F01F0012F7D3C010089CF1 :10544800F01F00162FED49189088EDB80001C4B17F :105458004938118948789088EDB80001C4415C69E1 :10546800EE09002871185808C1C11092109EC21880 :10547800000016A280038D20800384C0800094C49D :1054880080004E84800050AC000016A6800384D8AB :10549800000016A080037C8480013DB40000153014 :1054A800EE09000AF5320015F2CAFFF8EE0A032EDB :1054B8006F5A201D580AF40C1700F5FC1004580800 :1054C800F00B1700F1FB10041AD21ADE1ADC1ADAF4 :1054D8001ADB1AD84A881AD74A8C1AD91AD8F01F50 :1054E80000282F6D5806C46058045F183009F2036D :1054F80019005F1AF5E80008F2081800C3B0EAC8F6 :10550800FFEAEE08032C580CC3506C4858785F0B20 :1055180058485F0AF7EA100AF20A1800C0515828DA :10552800C0305838C2715C73089B069AF01F00158A :10553800EAC9FFEA300AEE090328F0030B0A4928F2 :105548009088EDB80001C0A1EE0903281AD848A830 :1055580048EC1AD8F01F000A2FED48DB0C9C2F8569 :10556800EE050923F01F000B0C9B0E9CF01F000A90 :10557800DA3ADC3A80038D2080038348800094C4A3 :105588008002E736000016A6800384FC800055A040 :105598008000D662800052C0D431149518971696B0 :1055A800580CC041E06C00F6D832F01F001D3FF8DF :1055B800E9DCC008F0041800C041E06C00FFD832F4 :1055C8003009EE040008F16900683019F169001526 :1055D80049489088EDB80001C171E8C8FFF8EE08A5 :1055E8000323F01F00114918201D1AD37008F8086A :1055F80001081AD848E85C7548EC1AD51AD61AD8A2 :10560800F01F000D2FAD2F84EE04032C580CC06042 :105618000C9B0E9CF01F0009300CD832800050AC57 :10562800000016A2800095040000153480038D50F8 :1056380080038508800094C4800052C0D421189744 :10564800580CC1C0F01F000E18965BFCC060EF3B01 :10565800000B5C5CF01F000B48B89088EDB80001A7 :10566800C0A148A8201D48AC1AD61AD71AD8F01FCE :1056780000092FCD30094888B089D82280002044FD :1056880080002068000016A280038D3C80038538C6 :10569800800094C400007B07D4314898189711897A :1056A80048889088EDB80001C3015C69F8090028B2 :1056B80071185808C08110951096C0D80000153090 :1056C800000016A2F809000AF5350015F2CAFFF81D :1056D800F80A03266F5A201D580AF40C1700F5FC27 :1056E80010045808F00B1700F1FB10041AD51AD64D :1056F8001ADC1ADA1ADB1AD84C281AD74C2C1AD901 :105708001AD8F01F00422F6D0E9C3005F01F004084 :10571800EEC6FFBC0A924BF34BA45C5CF01F003E44 :105728006C08300B2FF5109C5808C1D0F01F003BB7 :105738006C0C300BF01F003A6C0C300BF01F00396A :105748006C0C300BF01F00388688EDB80001C0B132 :10575800201D1AD26C0870484B4C1AD81AD4F01F66 :10576800002B2FCD2FC65845CDC16F5C580CC1D02A :10577800300BF01F002A300B6F5CF01F002D6F5CA0 :10578800F01F002C4A385C5C9088EDB80001C0D14D :10579800201D5C6C1ADC6F5870481AD849984A6CFE :1057A8001AD8F01F001A2FCD6FEC580CC060F01FEC :1057B80000236FECF01F00224A28F1260000495808 :1057C8009088EDB80001C0E1ECC8FFEAEE080328B4 :1057D800201D1AD848B81AD649BC1AD8F01F000B91 :1057E8002FCD2EA6EE06032C580CC060F01F001714 :1057F8003008EE0609280E9CF01F0014D83200006D :1058080080038CC880038348800094C480002044AF :10581800000016A280006F288000D6588000D6624B :105828008000D65C8000D668800385608000D66ED4 :105838008000E50480038588800111C88001122852 :1058480000001530800385B08002E28CD4211897BF :10585800580CE080007EF01F00413FF8EDDCC008E6 :10586800F0061800C750EE0600287114089CF01FB7 :10587800003CEBDCC008C0D10A9B089CF01F003933 :105888000A9B089CF01F00380A9B089CF01F0037F1 :105898004B789088EDB80001C0D1F1D5B0081AD87E :1058A80068481AD84B381AD44B3C1AD8F01F003322 :1058B8002FCD4AF43FF8F0051800C1718809300867 :1058C800F0091900C0D4EE0600287118201D1AD856 :1058D8004AB81AD64ABC1AD8F01F00282FCD0C0790 :1058E8003018EF68006CC368EE0600083009F169EB :1058F800006CEE0600280E9C711BF01F00238888A0 :10590800EDB80001C0E1ECC8FFEAEE080328201D4D :105918001AD849B81AD649DC1AD8F01F00182FCD62 :105928002EA6EE06032C580CC060F01F0019300894 :10593800EE06092848E89088EDB80001C0B149088A :10594800201D494C1AD8F01F000D2FEDC038E06516 :1059580000FF0A9CD8220000800050AC8000E504BB :105968008000D6588000D6628000D65C000016A25F :1059780080038D2C800385CC800094C480038CD850 :10598800800385F880004D98800385B08002E28C02 :1059980080038624D4211897580CC0E14BE890085E :1059A800F8081900C7744BD8201D4BDC1AD8F01F13 :1059B800003D2FEDD82278264BB85806C121F12595 :1059C8000000F01F003A0E9CEF34000BF01F003867 :1059D800089B5C5CF01F00370A07EF660068D82256 :1059E80011894AD89088EDB80001C2C15C69F809EC :1059F800002871185808C04110951096C098F809E9 :105A0800000AF5350015F2CAFFF8F80A03266F5A9E :105A1800201D580AF40C1700F5FC10045808F00B68 :105A28001700F1FB10041AD51AD61ADC1ADA1ADB99 :105A38001AD849A81AD74A0C1AD91AD8F01F001927 :105A48002F6D4998F1260000ECC5FFF0EE05002502 :105A58006A1C580CC1F078485898C1C05808C1A0B1 :105A6800F01F001648C85C5C9088EDB80001C0C102 :105A7800201D5C6C1ADC6A181AD84888490C1AD898 :105A8800F01F00082FCDEE0600260E9C6D1BF01FA0 :105A9800000DD822000016A2800382988003864455 :105AA800800094C400001530800056A08000204477 :105AB800800020688003834880010CEC8003865CAA :105AC80080005854D4214B0818979009169630082E :105AD800F0091900C0F44AD8F12800001AD8F1DBFF :105AE800B0081AD84AA81ADC4AAC1AD8F01F002AFB :105AF8002FCD4AA811893008F0091800C0414A8CF6 :105B0800F01F00253FB8F0061800C3C15807C110A0 :105B180049E830091188F2081800C0B53039F20890 :105B28001800E08900075C68EE080028711BC0288F :105B3800300B0E9CF01F001B49389088EDB800010F :105B4800C1114928F1280000201DF0C9FFEAEE091B :105B580003291AD91AD848E8493C1AD8F01F000E68 :105B68002FCD48A6ED2800002EA8EE08032C580CCF :105B7800C090F01F000EED28000030092EA8EE0896 :105B88000929D822000016A200001530800382A837 :105B980080038680800094C4000016AB800386B41E :105BA80080004D98800385B08002E28CD42118973C :105BB8001696580CC4E04A8890093008F009190074 :105BC800C0C4F1DBB0081ADC1AD84A481ADC4A4CBF :105BD8001AD8F01F00242FCD4A3811893008F0094F :105BE8001800C0414A1CF01F001F3FB8F0061800FB :105BF800C301499890093008F0091900C084497810 :105C08001AD749BC1AD8F01F00172FED0E9CF01FA9 :105C180000194998F126000048F89088EDB800016D :105C2800C0E1ECC8FFEAEE080328201D1AD848B8DE :105C38001AD6492C1AD8F01F000B2FCD2EA6EE0627 :105C4800032C580CC060F01F000E3008EE0609281F :105C5800D8220000000016A2800382D0800386C8E4 :105C6800800094C4000016AB800386B4800386F8D5 :105C78008000564400001530800385B08002E28C15 :105C8800D4311897149678CC94CAF80A000A8FCAA7 :105C98001093169512946E385808C1504A5CF01F3C :105CA8000026EF18001A3509F0090D083008F00928 :105CB8001900C0414A1CF01F0020EF08001A2FF8F5 :105CC800EF58001A49E89088EDB80001C171202DFD :105CD800304A1A9C089BF01F001BF01F001BEF386E :105CE8000014F3D3C01050091ADC1AD849781AD610 :105CF800497C1AD8F01F00102FAD0A9AEF3B001408 :105D08000C9CF01F001409890998B168F1E9118801 :105D180009A9F1E9108809BBEF3C0014F5D3C010BC :105D2800104BF01F000D0C9CF01F000CD832000027 :105D380080037FB4800094C4800384D4000016A23A :105D48008002E736800096A88003827C800387184B :105D580080007130800020088000D13CD431204D73 :105D6800502C503BFAC4FFCC10916800681268238D :105D780068386846129568545819E088000E4B58E0 :105D880090093008F0091900E08402B0201D4B2862 :105D98004B2C1AD8C2F85801C0C14AE89008E2084A :105DA8001900E08402A3201D4AB84ADC1AD8C22888 :105DB8005802C0C14A789008E4081900E0840296A5 :105DC800201D4A584A7C1AD8C158501A500837CB57 :105DD800301CF01F0025401A18974008C10149D807 :105DE8009008F8081900E0840281201D49A849FCA0 :105DF8001AD8F01F001F2FEDE08F0278402999383C :105E0800B829300840395C729900B831992599DA77 :105E180099E999F29943F9480050F9480044F9483A :105E28000048F948004C5803E080008C3058F95875 :105E38000074F01F0010EF4C00784865580CC1D171 :105E48008A08F8081900E084020C1AD748A8C8582C :105E5800000016A280038CA880038744800387640F :105E6800800387848002DC3C800387A8800094C478 :105E780080011200800382F88A88EDB80001C131E0 :105E88006E08201D8EA51AD8F01F00366FE8500541 :105E98001ADC1AD84B481AD84B484B5C1AD8F01F52 :105EA80000352FAD6E258EAA6FEC5805C1210E9BCB :105EB800F01F00315C5CC2504B089008EA081900DA :105EC800E08401CF1AD74A984ADC1AD8E08F0175C6 :105ED8004ACBF01F002DF5DCC008C0E04A789009D5 :105EE8003008F0091900E08401BC201D5C6A49F8FB :105EF8001ADA1AD7C499EF3C0014149BF01F002338 :105F08006FEC0E9A4A2BF01F002349C8908CE21CB4 :105F18000002E08001A76FE8F11900141AD970197E :105F28001AD9F11900121AD970081AD848E81AD8DB :105F380048E8499C1AD8F01F000F2FADE08F018F59 :105F4800F01F00161892C2F148C89008F808190006 :105F5800E08401871AD749281AD8492CC2D90000E9 :105F6800800096A88003825C800382F88003880CF6 :105F7800800094C480011320000016A280038824A6 :105F88008003B409800112608000200880005C88CA :105F9800800111F8800388848000E34080038C6CC2 :105FA800800387E04B880E9BB083F01F0038EF63B7 :105FB800006FEF63006CEF63006DEF63006E6E2897 :105FC8004B355808E08100BD049B0E9CF01F003142 :105FD800E7DCB0086EFCF01F0030E6C8FFEAEE0808 :105FE800092C8A88EDB80001C0A14AC8201D1ADC16 :105FF8004ABC1AD31AD8F01F002B2FCD2EA34A451E :10600800EE0303285808C0B18A09F0091900E08492 :1060180001281AD74A184A4C1AD8CCE84A3B049C9B :10602800F01F00234A3B049CF01F00234A3B049CBA :10603800F01F0023304A4A3B049CF01F00234A38D3 :106048003009B0898A88EDB80001C0C1EE03032881 :10605800201D1AD849181AD249DC1AD8F01F001185 :106068002FCD4898118948A89088EDB80001C5310E :106078005C69EE09002871185808C2B11093109590 :10608800C3080000000015308000D658000016A292 :1060980080004E0C8002E2A480038C6C800388A8E8 :1060A800800094C4800388C480005BB48000D668F4 :1060B800800069888000D65C800055A08000D66288 :1060C800800067B48000D67200007B07800388F4E4 :1060D800EE09000AF5330015F2CAFFF8EE0A0325A7 :1060E800201D5808F00B1700F1FB10046F5A580ACE :1060F800F40C1700F5FC10041AD31AD51ADC1ADAB6 :106108001ADB1AD84B681AD74B6C1AD91AD8F01F51 :1061180000362F6D049C4B598EAA0E9BF01F00343D :106128005C5CE080009F4B3890093008F00919004A :10613800E08400971AD74AA84AFC1AD8C3D88A8894 :10614800EDB80001C0F1301B0E9CF01F002C6F58F9 :106158001ADC1AD84A281AD74A9C1AD8F01F0022E3 :106168002FCD8EAA4A7B049CF01F00275C5CC120BF :106178004A0890093008F0091900C724201D5C6CF2 :1061880049781ADC1AD71AD84A0CF01F00172FCDF5 :10619800C678049CE06B00FFF01F001DEF4C005414 :1061A8004945580CC0D18A08F8081900C5941AD76F :1061B80048B8498C1AD8F01F000C2FEDC5188A88EA :1061C8004959E21800021389C4505C69EE09002895 :1061D80071185808C2211095109BC27880038C6CE6 :1061E80080038348800094C48000523C8000E350C0 :1061F800000016A28003891080004E84800389382D :106208008003B4098000D7708003884C8000DC04C8 :106218008003896400001530EE09000AF535001581 :10622800F2CAFFF8EE0A032B7843201D5808F00A3B :106238001700F1FA10041AD51ADB1AD31ADC1ADA85 :106248001AD84AC81AD74ACC1AD91AD8F01F002B1C :106258002F6D4ABB6F5CF01F002B300CC0283FFC31 :106268004A95580CC0E08A093008F0091900C3A4FF :106278004A68201D4A6C1AD8F01F00202FEDC32849 :106288008A88EDB80001C2914A284A396E204A31FD :106298005800F2001700F00017108E226E484A09C5 :1062A8006EF35808F20117108E355818C0316FEC8C :1062B800C058301B0E9CF01F001B49481AD05C7256 :1062C8001AD15C751AD21AD31AD51ADC496C1AD7A6 :1062D8001AD8F01F000A2F8D8907EF660014300CBA :1062E800C0580E9CF01F00113FFC2FCDD832000083 :1062F80080038C6C80038348800094C480006434DD :106308008000D66E000016A280038CA880038988BE :1063180080037BDC80037BE480037DC880037DC42D :1063280080004E84800389A8800056A0D431203D87 :10633800300730194B38E06504001892169191091E :10634800E06007D00A9350070E964AF4C22826CC7C :1063580058ACE08B001F4ADEFC0C032F3016C198A6 :106368003006C178680CF01F002AE7DCB010C118AD :1063780030185008C0E8680CF01F0025EBDCB0109E :10638800C0883017C068680CF01F0021E1DCB0102D :106398004A0A029B049CF01F00205BFCCD91580622 :1063A800C161498870080438C0A4E208032BFACCFC :1063B800FFF8F01F001A402B580BC0A14988201D78 :1063C800498C1AD8F01F00182FEDC198300B502BAC :1063D800F1D5C0100C99FAC5FFFC300650161AD535 :1063E8001AD6402E5C731ADEF9D0C0101AD70C9A50 :1063F8001AD31ADB0C9BF01F000D2FAD2FDDD83AF6 :1064080000007AB800007AC0800382208002DC2C69 :10641800800389E08002E278800098FC0000000C8C :10642800800389EC800094C480005D64D4211897AF :106438001696580CC041E06C00F6D8224C1890888B :10644800EDB80001C0A14C08201D1ADB1ADC4BFC7A :106458001AD8F01F003F2FCD4BA89088EDB8000147 :10646800C0F16C481AD8ED1800241AD8ED18001C91 :106478001AD84B584B7C1AD8F01F00352FCD0C9BDF :106488000E9CF01F0035EDDCB008ECC8FFEAEE0802 :1064980003285808C0804B18201D4B1C1AD8F01F21 :1064A800002C2FED6EFCF01F002FECC8FFEAEE0861 :1064B800092C4A489088EDB80001C0A14A28201D3F :1064C8001ADC4A9C1AD61AD8F01F00212FCDECC826 :1064D800FFEAEE0803285808C10149A99209F00902 :1064E8001900C08449881AD74A0C1AD8F01F001816 :1064F8002FEDE06C00FFD8220E9B2F06EE0600263B :106508006C1CF01F001B49BB6C1CF01F001B49BB17 :106518006C1CF01F001B6C1C304A49ABF01F001AA2 :106528000E9CF01F001A583CE08B00075C5C300A98 :106538000E9BF01F0017F01F00178F7CD82A000051 :10654800000016A2800382E8800389F0800094C4CA :1065580080038A1480004E0C80038A3880039DC013 :106568008002E2A4800388A8800388C48000D658EB :10657800800069888000D65C80005ACC8000D6688C :106588008000659C8000D6728000204480002A002C :1065980080009504D43118971695580CC041E06CCA :1065A80000F6D832F01F00473FF8EDDCC008F006CF :1065B8001800C041E06C00FFD832ECC8FFF8EE08C4 :1065C80003285808EFD6E108F1F91868F7B901FF70 :1065D800F1F91E68EE0600083049F1380068F20843 :1065E8001800E088001E4B89920A3009F20A190047 :1065F800C0A41AD84B581AD74B5C1AD51AD8F01F12 :1066080000352FCD0C070A9C3006301BEF6600685A :10661800F01F0031E06C00FBEF66006CD8325805C3 :10662800C1504AE89088EDB80001C101EAF800A815 :106638001AD8EAF8009C1AD8EB3800AD1AD84A38AC :106648004A7C1AD8F01F00232FCDECC8FFF8EE08BB :1066580003245804C1D049C89088EDB80001C1810D :10666800EE060008301BF1330068F132006C0E9C16 :10667800F01F001C4958201D1AD41AD21AD31AD751 :106688001AD51ADC498C1AD8F01F00122F8D0A9BD4 :106698000E9CF01F0016EE0600033002E738006C6F :1066A800E4081800C7100A9CF01F00113FF8E9DC45 :1066B800C008F0041800C1D13018E768006CC4A8FD :1066C800800050AC000016A280038C8C80038A4C9A :1066D800800094C48000E124000016A880038A7C0E :1066E80080004E8480038AB0800052C08000E50498 :1066F800EE060028E762006C711B0E9CF01F002359 :106708004A389088EDB80001C0E1ECC8FFEAEE080D :106718000328201D1AD849F81AD649FC1AD8F01FA0 :10672800001F2FCDECC3FFEAEE03032C580CC0600A :10673800F01F001B3008EE03092849589088EDB86F :106748000001C0814938201D496C1AD8F01F001378 :106758002FED48F89088EDB80001C1610E9C301B00 :106768000C07EF37006CF01F001048A81AD65C64BD :106778001AD41AD71ADC48DC1AD51AD8F01F000721 :10678800300C2FADD832D83A80004D98000016A2B0 :1067980080038C8C800385B0800094C48002E28CD6 :1067A8008003862480004E8480038AF0D4311897B1 :1067B8001695580CC041E06C00F6D832F01F003E28 :1067C8003FF8EDDCC008F0061800C041E06C00FF9F :1067D800D8324BA89088EDB80001C1A1EE06000898 :1067E800F1340068F133006C4B58301B11820E9C59 :1067F800F01F00344B48201D1AD21AD31AD41AD7C6 :106808001AD51ADC4B1C1AD8F01F00312F8DEE0652 :1068180000083009F13A006CF20A1800C060F1393A :1068280000682FF9F1690068EE060008F134006885 :106838003088F0041800E08800224A68900930087F :10684800F0091900C104301B0E9CF01F001E49E816 :10685800201D1AD41AD71ADC49FC1AD51AD8F01FE9 :10686800001C2FAD30080C070A9CEF680068301B2D :10687800F01F001AE06C00FBD83249181189300863 :10688800F0091800C0500A9B0E9CF01F0015EE0678 :1068980000043008E939006CF0091800C6100A9C99 :1068A800F01F00103FF8F00C1800C1D13018E9684B :1068B800006CC3E8800050AC000016A800007B07FD :1068C80080004E848003824C80038B2C800094C40B :1068D800000016A280038B6C8000E124800052C067 :1068E8008000E5040E9CF01F001F49F89088EDB861 :1068F8000001C0E1ECC8FFEAEE080328201D1AD801 :1069080049A81AD649AC1AD8F01F001A2FCDECC4E2 :10691800FFEAEE04032C580CC060F01F0017300883 :10692800EE040928EE0600083009F169006C48E811 :106938009088EDB80001C1410E9C301BEE060006A0 :10694800ED37006CF01F000D48881AD71ADC48CCC8 :106958001AD51AD8F01F0007300C2FCDD832D83AE4 :1069680080005644000016A28003824C800385B044 :10697800800094C48002E28C80004E8480038B984F :10698800D4311294580A5F1830091497F204180089 :106998005F0318961695E7E80008F2081800C55036 :1069A800335CF01F00406CC98EC8F20800088DC81F :1069B8006C385808C0614BC89088EDB80001C231E6 :1069C8004BA89088EDB80001C0918EC81AD84B88A2 :1069D8004B8C1AD8F01F00382FED4B889088EDB8F3 :1069E8000001C0C14B28201D4B5C1AD8F01F003293 :1069F8008ECB6E1CF01F00332FEDED08001A2FF818 :106A0800ED58001A0A9AED3B00140E9CF01F002E58 :106A18004A689088EDB80001C1218EC8201D1AD897 :106A28001ADCED38001430091AD91AD71AD51AD831 :106A380049F84A6C1AD8F01F00202F8D0E9CF01FC1 :106A48000024335CF01F002358075F081063C160FF :106A580049689088EDB80001C0C1201D1AD5ED38ED :106A680000141AD8492849CC1AD8F01F00132FCD82 :106A78000A9B0C9CF01F0019C1385804C11048B873 :106A880090093008F0091900C0B44898201D5C64CA :106A98001AD7493C1AD41AD8F01F00072FCDD83A74 :106AA8008000A300000016A6000016A280038C98A0 :106AB80080038BC8800094C4000016A080037C84E7 :106AC80080013DB48000713080038BD88000D13CB8 :106AD8008000A2E680038C108000585480038C3C10 :106AE800D42148C8189716969088EDB80001C0A11F :106AF8004898201D1ADB1ADC488C1AD8F01F0008A9 :106B08002FCDF7D6C0100E9CF01F0006D82200002B :106B1800000016A280038D0480038C50800094C46A :106B28008000D984D4213007C1B80C9C0E9B2FF665 :106B3800F01F000D1895C0F078485808C0C1F01F24 :106B4800000B0A9CEB35000BF01F00090A9B5C5CEC :106B5800F01F00085846CEA12FF75827C03030063E :106B6800CE5BD82280002024800056A080002044DC :106B780080002068D4214978F00C07085808C071B3 :106B88004959F20C070AF00A1800C1F04929F20C19 :106B9800070AF4081800C1904909F80C001CF0080D :106BA8000017A567EE0C0027120748D99289EDB99E :106BB8000004C0C11AD848B81ADA48BC1AD71AD87B :106BC800F01F000A2FCDC02830070E9CD8220000E5 :106BD8000000153C0000153800007B2C000016A6AC :106BE8008003901080038DE0800094C4D421169710 :106BF8001496F01F0005C0609828AC087808301C6F :106C08008F08D82280006B7CD43149B849B91092DA :106C1800F00C0708F20C070718961AD7498C1AD8EF :106C2800EC060014F01F001749732FEDA36431E53B :106C3800EE070018A568E8080008E60800087009CB :106C48005809C0C090BA90AB1ADB1AD9702848FC12 :106C58001AD81ADAF01F000B2FCD2FF7E406070811 :106C68005C57EE051800F9B70000EE081800CE11C1 :106C7800D8320000000015380000153C80038DF460 :106C8800800094C400007B2C80038E0CD431201D1E :106C98004A181896F00C07073005F80C001849F048 :106CA800A36849F149F231E349F4EE070019A569EF :106CB800F0090009E0090009720A580AC1D0923B9C :106CC800922A8289F40B010CE2190010F8050005DC :106CD8005C855809C1105C7B5C7AF3D5C010201D17 :106CE800492C1AD91ADB1ADA1AD61AD25068F01FA8 :106CF80000102FAD40082FF7E80607095C57EE0390 :106D08001800F9B70000EE091800CD010A9C2FFD04 :106D1800D83200000000153C00007B2C000016A6AD :106D280080038DA00000153880038E28800094C44D :106D3800D421F01F000B48B8EFDCB0109088EDB8F4 :106D48000004C0A10E985C781AD84878487C1AD8F4 :106D5800F01F00072FED0E9CD822000080006C94D5 :106D6800000016A680038D7080038E4C800094C4AA :106D7800D4214A181897169631D9F20C1800E088D1 :106D8800000F90093008F0091900C33449B81ADC1B :106D980049BC1AD8F01F001B2FEDD822F60B001A99 :106DA8009088F80C0019E2180010A569F20A002969 :106DB800495AF40903055808C0A04908201D1ADCDF :106DC800492C1AD51AD8F01F000F2FCD0A9CF01F96 :106DD80000103008EC060016EE07001748A9A56752 :106DE800EE060026F20600068D288D08AC28AC3881 :106DF800D8220000000016A280038DD080038E6880 :106E0800800094C400007B2C80038E888002E28C72 :106E1800D4314948F80C00121896F00C0707A36201 :106E2800491331E44915EE070018A568E40800087D :106E3800E60803085808C0500E9C0C9BF01F000C75 :106E48002FF7EA0607085C57EE041800F9B70000A8 :106E5800EE081800CE914839300CF2060B08D832EB :106E68000000153C00007B2C0000153880006D7870 :106E7800D4211897580CC0E14A189008F80819004E :106E8800C3C44A08201D4A0C1AD8F01F00202FED51 :106E9800D82249FAF40B070CF8CEFFFFF80C001CB7 :106EA800A56CF40B0B0E3008F60B0019F809002935 :106EB800498CF809000993289308B228B23831E9B7 :106EC800F20E1800C031F40B0B0848D89088EDB8C2 :106ED8000004C10148E8F00B07081AD848E8F00B8D :106EE80007081AD848781AD748CC1AD8F01F0007CC :106EF8002FCD0E9CF01F000AD8220000000016A219 :106F080080038D8480038E98800094C40000153C13 :106F180000007B2C0000153880038DE08002E28C95 :106F2800D42118970E9CF01F0005C060780C0E9BAA :106F3800F01F0003CF8BD82280006B7C80006E7816 :106F4800D421496818971696149512949088EDB82C :106F58000001C0C14928201D1AD91ADA1ADB1ADC27 :106F6800490C1AD8F01F00102FAD301B0A9CF01FD7 :106F7800000FC080301B0A9CF01F000C784858088E :106F8800C0510C9B0E9CF01F000A5804C0500A9B6D :106F9800089CF01F0008D822000016A280038D600C :106FA80080038EAC800094C48000202480006AE8AE :106FB80080006E78D4211897F01F00061898C02119 :106FC800D8220E9A782C700990ABF01F0003DA2AA9 :106FD80080006B7C80006F48D42116961494189515 :106FE800F01F001E1897C021D8229838982B7809CE :106FF800F6081900C2B2F5D8C0105804C050F20AF9 :107008000708AC88C068F20A0709AC892FF8B838B5 :1070180049389088EDB80004C0D10D881AD86E0898 :107028001AD88EB81AD848F848FC1AD8F01F000F9A :107038002FCD8E3B8E28F6081900C0710A9A5C7B0A :107048006E2C6E09F01F000ADA2A0A9A5C7B782CEB :10705800F01F0007D82A000080006B7C000016A6ED :1070680080038D9080038ED4800094C480006F4884 :10707800D4211897F01F00231896C021D8224A2837 :107088009088EDB80004C0D178081AD898A81AD802 :107098008CB81AD849D849EC1AD8F01F001E2FCD41 :1070A8008C398C28F0091900C020DA2A49A8908860 :1070B800EDB80004C1614998201DF0070709498807 :1070C8001AD9F00707081AD8F20818005F191AD950 :1070D8006C081AD848D8493C1AD8F01F000E2FADB2 :1070E8006C2C6C090E9A8CABF01F000F48C8F00787 :1070F800070948A8F0070708F00918005F1CD822FC :1071080080006B7C000016A680038DBC80038EE88F :10711800800094C4000016A2000015380000153C39 :1071280080038F0080006F48D43118951697149308 :10713800580CC0311894CBD8F60B001A4A58F00BEB :107148000708F0080019A569F20A00294A2AF40973 :1071580003095809C1604A1A940B300AF40B190044 :10716800C0A4201D1AD849E81AD949EC1AD8F01F2A :10717800001E2FCD49780E9BF007070CF01F001B4F :10718800301B8ACCF01F001A18961894E0800092E1 :10719800189B30098ACA0A9CF01F00168A485C8C22 :1071A800F00C1900C2C048D9920A3009F20A190035 :1071B800C0B45C781AD848A81AD648FC1AD51AD888 :1071C800F01F00092FCD0C9C3004F01F000CC718CD :1071D8000000153800007B2C000016A280039004E4 :1071E80080038F2C800094C480006D788002DC3C82 :1071F8008000CEC480038F548002E28C4AE9F207F3 :10720800070AF4CBFFFFF40A001AA56AEE07001874 :10721800F2070B0BF40800284A8AF4080008300A21 :107228009123B02C9106B03A31E8F00B1800C03128 :10723800F2070B0A4A084A29F0070708F207070964 :10724800F0091800C1C149F9920A3009F20A190077 :10725800C0A4201D1AD81AD849B849CC1AD8F01F8A :10726800001C2FCD4948F00707095809F9BA01FF52 :10727800F3DAE109F9B9001DF0070B0949189088FC :10728800EDB80004C1618AC848DAF407070A201D6E :107298000D891ADA488AF407070A1ADA1AD91AD8A5 :1072A80048981AD648BC1AD71AD8F01F00092F8D4B :1072B800089CD8320000153800007B2C0000153CD3 :1072C800000016A28003900480038F90800094C46D :1072D80080038FBCD431203D1690502A1895F01F9A :1072E8000021301BE5DCB010F9D2C010F01F001EE1 :1072F8001896C2C049D8EA050019F0050707A3691E :10730800189431E849A1189349ABEE070016A56611 :10731800F2060006F60600066C0B580BC0B0089C77 :107328008CAA50095018F01F00148CAA4018140495 :1073380040092FF7E205070A5C57EE081800F9B76D :107348000000EE0A1800CE110696402A5800E1F611 :107358001A00580AF5F21C000C9C2FDDD8320000E8 :1073680080006C948002DC3C0000153C000015385D :1073780000007B2C8002E736D431303818971693FA :107388001494F00C1800E088001B48989009300805 :10739800F0091900C0353005CA2848681ADC3005DC :1073A8001AD8485CF01F00052FEDC998000016A2F6 :1073B80080038DB080038FE0800094C4F80C001A1D :1073C8004C88F00C0708F0080019A569F20A002992 :1073D8004C5AF40903095809C1604C4A940B300A05 :1073E800F40B1900C0A4201D1AD84C181AD94C1C2B :1073F8001AD8F01F00412FCD4BA80E9BF007070CA1 :10740800F01F003E0892301B5C72049CF01F003C89 :1074180018961895C640049A069BF01F003AEE0786 :1074280000184B03E6070702E4020012A562E4080D :1074380000224AD83001F0020002300B8506A4244D :10744800A4310E9CF01F0030852CE60707082FF8A2 :10745800E6070B0831E9F2081800C031E6070B010E :107468004A084AA9F0070708F2070709F0091800AF :10747800C1C149E9920A3009F20A1900C0A4201DC5 :107488001AD81AD849A84A2C1AD8F01F001B2FCD91 :107498004948F00707095809F9BA01FFF3DAE10981 :1074A800F9B9001DF0070B0949089088EDB80004E8 :1074B800C1610D884959F2070709201D1AD9489951 :1074C800F20707091AD91AD848985C74491C1AD4C3 :1074D8001AD61AD71AD8F01F00082F8D0A9CD8324E :1074E8000000153800007B2C000016A280038DB028 :1074F80080038F2C800094C480006D788002DC3C6F :107508008002E736800020240000153C80038F901D :1075180080038FBCD401E06A05A0300B482CF01F13 :107528000003D80200007B2C8002E8BCD421202D67 :10753800FE782800501C500B3FF7109E301CC308E3 :10754800300B7049EDB90001CFD17049EDB9000990 :10755800CFD140195809C0B01396F2C5FFFE138960 :107568005015EDE91089F7D9D010C038F7D7D010E9 :10757800913B7049EDB90000CFD17C2B40095C8B61 :107588005809C080B29BF7DBC108B28B40092FE9CC :107598005009F80A1900E0880006202A5C8A580A6F :1075A800CD01FE78280070482FEDD822580CC06015 :1075B800FE782800300A7019C058FE78280030FA82 :1075C8007019F3DAD20491195EFC202D3008E069B5 :1075D80013885018F8090249C058401A2FF82FFA92 :1075E800501A1238CFB12FED5EFCD703D401303CCE :1075F800F01F0005C060303CF01F0004F01F0004BD :10760800D402D6038000A3708000A38880014014B0 :10761800D401580CC060300B303CF01F0004D80275 :10762800303CF01F0003D8028000A31A8000A35C3E :10763800D401202D3008B888303CF01F0022303C9F :10764800F01F0021309CF01F001F307CF01F001D30 :107658003008501840192FF950192FF8E04861A840 :10766800CFA1309CF01F00193008501840192FF98D :1076780050192FF8E05886A0CFA1307CF01F0013D6 :10768800340B300A492CF01F0013FE782800302AEA :1076980070C9F3DAD108308A91C970C9F3DAD08495 :1076A800301A91C970C9F3DAD06191C970C9F3DA97 :1076B800D001303C91C9F01F00082FEDD80A000016 :1076C8008000A2A88000A2BE8000A2E6800075F417 :1076D8008000A3A08000A388D42120AD4C68E3B823 :1076E8000001D5533017FE6810007109F3D7D20294 :1076F800303AF1490040E06B1B00EA1B00B7FE7C02 :107708000C00F01F003E310A201D30081ADA0E99CD :10771800109B308AFE7C0C00F01F003930080E994F :107728000E9A109BFE7C0C00F01F0036300BFE7C7E :107738000C00F01F0035FE7C0C00F01F0034300CEC :107748001ADC18981899189A1ADC189BFE7C0C00F9 :10775800F01F002F0E9CF01F002F302BFE7C0C001A :10776800F01F002DF01F002DD503304AFAC7FFD0B7 :107778004ABB0E9CF01F002B302B0E9CF01F002ADA :10778800FAC8FFDC4A99722C109B912CE06AF980A8 :10779800EA1A0337F2E40000FE7C1800F0E5000066 :1077A800F01F0023308A4A3B0E9CF01F001E310A4E :1077B800FAC6FFEC300B0C9CF01F001F3018304B42 :1077C800FB68002149DCF01F00180C9BFE7C280098 :1077D800F01F001B3009FE7C2800129B129AF01F34 :1077E80000190E9C0E96304BF01F000F2FCDFAC7D4 :1077F800FFD8C2D8800376008000A5088000A4B016 :107808008000A4CE8000A4E68000A4F48000A470C8 :107818008000A2228000A4FE8000A3D080039038BC :107828008002E7368000A2808003901C8000AA1C9A :10783800800390308002E8BC800390288000A66214 :107848008000A69C0D8C2FE6F01F000F0E36CFB1DE :10785800FACBFFFCFE7C2800F01F000C3009FE7CF0 :107868002800129A129BF01F000AFE7C2800F01FC5 :107878000009302CF01F0008FE7C2800F01F0005CE :107888002F6DD8228000A2BE8000A6628000A69C30 :107898008000A7EC8000A2E6D42130A81896F00C4E :1078A8001800C0C1E067271020175BF7C13030DB34 :1078B800FE7C1800F01F0008CF81E0672710201712 :1078C8005BF7C0800C9BFE7C1800F01F0003CF8183 :1078D800D822DC2A8000A9AED401178A17B91798D4 :1078E800B168F1EA118817AAF1EA1088F3E81008DC :1078F8001AD81ADC483CF01F00042FEDD80200000B :1079080080039064800094C4D421202D4AB811D9F2 :10791800BAD97009500911C8BAC81A961895169498 :10792800581CE08900064A6CF01F0026C448761CE3 :10793800F01F0025201DEFDCC0084A4C1AD7F01FA5 :1079480000212FED5825C2A0682CF01F001F201D14 :10795800EDDCC00849EC1AD6F01F001A30182FEDDC :10796800F0061800C111305A49AB0E9CF01F001ADE :1079780030AA49AB0E9CF01F00180E9C308A498B28 :10798800F01F0015C1883028F0061800C141300AE0 :107998000E9C149BF01F0013C0E83038F007180045 :1079A800E08B000A300B0E9CF01F000F1A9B306A08 :1079B800F01F000E2FEDD82A800396B88003909808 :1079C800800094C48002DC2C800390C4800390D093 :1079D800800390E480007380800390EC800390F82B :1079E800800072DC8000202480005140D421189649 :1079F8001695582CC45176174B3B0E9CF01F00333C :107A08001896C1014B2CF01F00334B38FE798000CB :107A1800B0094B28B0064B28B0064B28B006E08FBB :107A280001C44B1B0E9CF01F0029C1D14AA89088A5 :107A3800201D4AEC1AD8F01F00274A8890884ACCA3 :107A48005008F01F00244A6890884AAC5008F01F7C :107A580000214A4890884A8C5008F01F001E2FEDDC :107A6800E08F01A30E9C4A5BF01F0018C0C14A4C6E :107A7800F01F0018E06900FF4978E08F0195582C45 :107A8800E089000749FCF01F0013E08F018E762C77 :107A9800F01F001D18975836E08101876A1649BB08 :107AA8000C9CF01F000AC53148B85807E08A000846 :107AB8009009A1A9B0095817C2A1C3089009A1C982 :107AC800B009C2C8800391048002ECC88003910801 :107AD800800094C4000016A2000016A6000016A09C :107AE800000016A8800391148003911C8003913430 :107AF8008003914C800391648003E18C8003917C26 :107B0800800391888002DC2C800392144B799208C0 :107B1800A1A8B2085827C071C0D84B499208A1C87B :107B2800B208C0884B299208A1A8B2085837C0717A :107B3800C0A84AF99208A1C8B208C0584AD9920800 :107B4800A1A8CAC84AB99208A1C8CA884AAB0C9C5D :107B5800F01F002AC2F14AA85807E08A00089009D5 :107B6800A3A9B0095817C061C0C89009A3C9B00932 :107B7800C08849E99208A3A8B2085827C071C0D89C :107B880049A99208A3C8B208C08849999208A3A82D :107B9800B2085837C071C0A849599208A3C8B2089A :107BA800C05849499208A3A8C79849299208A3C868 :107BB800C758494B0C9CF01F0011C3E149085807EE :107BC800E08A00089009A1B9B0095817C061C1B886 :107BD8009009A1D9B009C17848499208A1B8B2085A :107BE8005827C161C1C80000000016A6000016A0F1 :107BF800000016A88003921C8002ECC8000016A2A0 :107C0800800392204B699208A1D8B208C0884B59CA :107C18009208A1B8B2085837C071C0A84B19920889 :107C2800A1D8B208C0584B099208A1B8C3784AE94C :107C38009208A1D8C3384ADB0C9CF01F002DC30161 :107C48004AC85807E08A00089009A3B9B00958172C :107C5800C061C0C89009A3D9B009C0884A09920870 :107C6800A3B8B2085827C071C0D849D99208A3D878 :107C7800B208C08849B99208A3B8B2085837C07189 :107C8800C0A849899208A3D8B208C058496992087F :107C9800A3B8C04849499208A3D8B208C858496B44 :107CA8000C9CF01F0013C3D149285807E08A00082C :107CB8009009A5A9B0095817C061C0C89009A5C9FD :107CC800B009C08848699208A5A8B2085827C151C8 :107CD800C1B848399208A5C8B208C168000016A6FC :107CE800000016A0000016A8800392248002ECC8A9 :107CF800000016A2800392284AC99208A5A8B208D3 :107D08005837C071C0A84A999208A5C8B208C05887 :107D18004A799208A5A8CC2B4A599208A5C8CBEB5A :107D28000C9C4A4BF01F0024C3F14A485807E08ACC :107D3800000B9009EA19FFFFE8198000B0095817ED :107D4800C071C1089009F3D9C00FB009C0B849C9BA :107D58009208EA18FFFFE8188000B2085827C08187 :107D6800C11849789009F3D9C00FB009C0B848F9CB :107D78009208EA18FFFFE8188000B2085837C08157 :107D8800C0E848A89009F3D9C00FB009C08848894D :107D98009208EA18FFFFE8188000C80B48489009C5 :107DA800F3D9C00FB009D82A000016A0000016A801 :107DB800800392308002ECC8000016A2000016A6CC :107DC800D421582CC2717617495B0E9CF01F001500 :107DD800C1211897494CF01F0015201D494C1AD78E :107DE800F01F00120E9C2FF7F01F00122FED5847BE :107DF800CF51C1380E9CF01F0010201DEFDCC008C9 :107E080048BC1AD7F01F00090E9CF01F000A2FED7E :107E1800C04848ACF01F0005D82A000080039238FB :107E28008002ECC88003923C800094C4800390C414 :107E380080006C108002DC2C80039250D421207DBD :107E4800306A18951696FAC7FFEAE06B00FF0E9C99 :107E5800F01F00385825C1B16C1C4B7BF01F003750 :107E68001896C4B14B6CF01F00370E9B0C9CF01F8A :107E780000360E9B301CF01F00340E9B0A9CF01F2E :107E880000320E9B303CF01F0030C5085825E08AB0 :107E980000356C1CF01F002D6C2B1897500B169C8E :107EA800F01F002B58DC5F04585C5F08E9E81008F5 :107EB800ECC5FFFC109418963008FACCFFF8400B7C :107EC800F0041800C0500C9AF01F0022C238F01FAE :107ED800002258375F98580C5F091896F3E8100885 :107EE800E8081800C0A15807C085C0916A08118920 :107EF8003308F0091800C030498CC098585C5F18E6 :107F080058DC5F19F3E80008C050495CF01F000D09 :107F1800C0D85C570C9BFAC9FFEAFACAFFF80E9C56 :107F2800F01F00100E9CF01F00102F9DD82A000093 :107F38008002E8BC800392808002ECC880039288AB :107F4800800094C48001921C8002DC2C8002EDD059 :107F58008002EE0C800098688003929C800392DC7B :107F68008001927080019258D421204D4ABC149609 :107F7800F01F002B1A9CF01F002B581CC0504AAC55 :107F8800F01F0027C0A81A9CF01F0028201D1ADC2B :107F98004A7CF01F00232FEDF01F002618974A6C2B :107FA800F01F001F5807C0514A4CF01F001DC04861 :107FB8000E9CF01F00234A376E0CF01F0023C1F0FF :107FC8006E087018201D1AD8F01F0020500C4A0C9B :107FD800F01F00136E0870285008F01F001C500C8A :107FE80049CCF01F000F6E0870385008F01F0017BA :107FF800500C499CF01F000A2FEDC048497CF01F27 :108008000008497CF01F00060DC93018F009180057 :10801800C2A1494CC298000080039314800094C404 :10802800800191288003932C8000967080039348E8 :108038008001997C80039358800393A880009784DB :10804800000080D08000CAE4800096A8800393686E :10805800800393788003938880039398800393B078 :10806800800393B8493CF01F0014FACCFFF4300B9E :10807800F01F0012301B4037FACCFFF8F01F000F3A :10808800201D1AD750574047F01F000D500C48DCF0 :10809800F01F000950075047F01F0009500C48AC6A :1080A800F01F0005F01F0009300C2FED2FCDD8224E :1080B800800393C4800094C48000C1EC800096A81B :1080C800800393D080039DC08000495CD421202D7B :1080D8001695584CE089000649ECF01F001FC3684C :1080E800FACCFFFC761BF01F001D6A2C4014F01F11 :1080F800001C18976A3CF01F001A18966A4CF01F6B :108108000018501418951ADC496C1AD61AD71AD4C4 :10811800F01F0011089CF3D5C008F5D6C0080E9BC7 :108128005C7BF01F00112FCD5BFCC10148F8900962 :108138003008F0091900C0A448D81AD548DC1AD666 :108148001AD71AD8F01F00042FCD2FEDD82A000017 :10815800800393DC800094C4800098FC8002DC2CAF :108168008003941480003958000016A280039054AC :1081780080039448D4211695583CE089000649CCE0 :10818800F01F001CC338761CF01F001B18976A2CC0 :10819800F01F001918966A3CF01F00174978201D37 :1081A80018941AD649651AD7580CF0051710495C67 :1081B8001AD5F01F0010089AF7D6C0085C5A0E9C12 :1081C8005C7CF01F00112FCD5BFCC10148F89009C1 :1081D8003008F0091900C0A448D81AD648DC1AD7C4 :1081E8001AD51AD8F01F00032FCDD82A80039488F7 :1081F800800094C48002DC2C80037DC480037DC889 :10820800800394B880003C50000016A28003969C1E :10821800800394DCD421206D1697582CE089000641 :108228004A4CF01F0025C438761CF01F00246E2B22 :10823800F8C700011A9CF01F0022304A1A9BFAC6A0 :10824800FFEC0C9CF01F001F201D40681AD8F01F7F :10825800001E1ADC49DC1AD7F01F00170C9B0E9C75 :108268005C5CF01F001BFACCFFE0300BF01F00191C :10827800301B4087FACCFFE4F01F00162FDD505763 :108288001AD74056F01F00101AD71ADC492C50870D :10829800F01F00092FDD50461AD6F01F000B1AD622 :1082A8001ADC48EC5076F01F00042FCD2FADD82AE9 :1082B80080039510800094C48002DC2C800098FC18 :1082C8008002E736800096A8800395388000C19C1C :1082D8008000C1EC8003955480039564D421FACDC5 :1082E8000108581CE0890006491CF01F0012C1D87B :1082F800F6C9FFFCF8CA0001FAC7FFFCE06B0100F1 :108308000E9CF01F000DC110300948CAFACBFEFCC4 :108318000E9CF01F000B5C5CC0814418489C1AD866 :108328001AD7F01F00042FED2BEDD82A800395747F :10833800800094C480009710800078E08000C4C05A :1083480080039064D43121AD18961695582CE08995 :1083580000064A1CF01F0021C3B8FAC7FFFC344AC4 :10836800300B0E9CF01F001E306AE06B00FFFACC49 :10837800FFDBF01F001BFAC4FFB8EAC9FFFCECCA18 :108388000002320B089CF01F00171893C210189AAD :10839800089B0E9CF01F00143088FB6300242016F5 :1083A800EA060326FB68003C0C9CF01F00100C9B9F :1083B800189A30180E9C3089F01F000D581CC08088 :1083C80048C8201D48CC1AD8F01F00042FED2E6D88 :1083D800D83A000080039590800094C48002E8BCDD :1083E800800097108002E7368002EDD080019084EB :1083F80080039048800395B4D42121AD1696582C5B :10840800C05049BCF01F001BC308FAC7FFFC344A20 :10841800300B0E9CF01F0018306AE06B00FFFACC9E :10842800FFDBF01F0015ECC9FFFC301AFAC6FFB8D5 :10843800320B0C9CF01F00111895C170189A0C9BF8 :108448000E9CF01F000F3088FB6500240E9CFB6813 :10845800003CF01F000C581CC08048B8201D48BCC8 :108468001AD8F01F00042FED2E6DD82A800395D45A :10847800800094C48002E8BC800097108002E73630 :1084880080018FF8800396AC800395ECD431204DA1 :108498001493189516947406582CC091761C304A7B :1084A8004A7BF01F0028C0513018C458584CC0806F :1084B8004A5CF01F00264A6CF01F0024C3D8761BC4 :1084C8001A9CF01F00240A9A1A9BFACCFFF4F01F9A :1084D80000224A289088EDB80002C0B1201D40480B :1084E8001AD849F81AD649FC1AD8F01F00182FCD07 :1084F800FAC7FFF40C9C0E9BF01F001B682B1A9CFC :10850800F01F0014304A1A9B0E9CF01F00130E9B9C :108518000C9CF01F0016683B1A9CF01F000E304A96 :108528001A9B0E9CF01F000C0E9B0C9CF01F001059 :108538001A953008A6C82FCDD83A0000800392803B :108548008002EDE680039610800094C48003964074 :10855800800098FC8002E736000016A28003903C59 :10856800800396688000CBC88000CA928000CA74D5 :10857800D421212D581CE0890006491CF01F001148 :10858800C1C8F6C9FFFCF8CA0001FAC7FFD8320B08 :108598000E9CF01F000D1896C1000E9B189AFAC782 :1085A800FFF90E9CF01F0009300BFB6600270E9C9C :1085B800F01F0007F01F00072EEDD82A80039684CD :1085C800800094C4800097108002E736800099A844 :1085D8008000998CD401F01F0003F01F0003D80A13 :1085E80080019EF880009820D40148BE1898300970 :1085F8007C0C580CC0A1F2090019487EFC0900291E :10860800932A9318930BD8022FF92F4E58F9CF11AC :10861800DC0A000000001544D401484CF01F000497 :1086280030194848B089D802800396C0800094C4A5 :10863800000015F8D4314B68169570065806C050DE :108648005816E08100BAC938580CE08000B5F01F10 :1086580000314B18910C1897580CE08000AD19891F :10866800EC091800C0415805C460C4284AB44AC37C :108678008906C188EC060018E60800287012049CD8 :108688005802C0E0F01F002718910E9CF01F00252B :108698000E9BE20C0D4A049CF01F0023C3102FF61A :1086A8008906680649D258E6FE98FFE658F6C28160 :1086B8005805C210049749DCF01F001D3008498690 :1086C8008508C128F0080018EC0800287009580926 :1086D800C0807018201D497C1AD8F01F00152FED96 :1086E8006E082FF88F086E0858E8FE98FFED492CA1 :1086F800F01F000F4888700CF01F0010C5C80E9CB2 :1087080048FB49074906F01F0011C2C8000016407F :108718008002ED8400001644000015400000154456 :108728008002EDD08002EDE6800396C8800094C4F4 :10873800800396E0800396C48002E28C80039364F1 :10874800000015FC000016008002EEB86E08EC0868 :10875800092C2FF88F085908C070498B300CF01F6E :108768000018580CCF41301949689109496949786E :108778007008F0080018F20800284959702A720C8D :108788007008494B5D18581CC1705805C040492CE9 :10879800F01F001248E83007340A0E9B910748DCA6 :1087A800F01F000F48F8700CF01F000F4858301CDD :1087B8009107D832D83ADA3A800393648002EEB847 :1087C800000016400000154400001540000015FC8C :1087D80000001600800396C4800094C48002E8BCA0 :1087E800000016448002E28CD421202D1897FACB81 :1087F800FFFCFE7C1800F01F0012583CC080584C4B :10880800C081E0690100FE7818009109301CC15848 :10881800401C58DCC03130ACC0B8588CC081F01F47 :108828000009320CF01F00071BFCC0285C5CF01F1D :1088380000054018300CAE882FEDD8228000A9C260 :10884800800078A0D431202D30A1FAC0FFF930D2B1 :10885800308349B749B630043005009CF01F001A30 :10886800C2A11BF8E20818005F0AE40818005F09B3 :10887800124AF80A1800C0904929491A1298740B2C :10888800950CF20B0B0CC188E6081800C0916E0815 :108898002018F00C17708F0CEC0C0B04C0686E09D4 :1088A800EC090B082FF98F096E08E0480050CD61DC :1088B8008F05CD4B3008109C2FEDD832000016489C :1088C8000000164C800087F0D401F01F0004301B14 :1088D800F01F0003D80200008000884C8000863C0E :1088E800D4314974169714951293580BC0B1680C7B :1088F800580CC0311896C2181696F01F0012890736 :10890800C1C868085808C0C1E06C0200F01F000E1A :10891800890CC061189648DCF01F000DC0E80A9C5D :10892800E066020048650C33E60617806A0B0C9A6D :10893800F01F00086A088F080C9CD8320000169CAB :108948008002E28C8002E2A4800396E8800094C44E :10895800800090B4D401F01F0002D80A800091086A :10896800D4213008FAC4FFEC19C9F0091800F9B885 :108978000100E9F81A01E9F81A02E9F81A004A1898 :108988001AD84A1818971AD8089B3008E8C9FFF867 :10899800E8CAFFFC780CF01F001D8F0C2FED580C57 :1089A800C021DC2AF01F001A300949AA301BE06CEC :1089B8001388F01F00193009498A301BE06C00FA4F :1089C800F01F00153009496A301BE06C01F4F01FF4 :1089D80000123009493A301BE06CEA60F01F000EC3 :1089E8003009491A301BE06C03E8F01F000B30090E :1089F80048EA301BE06C03E8F01F0007DA2A0000A1 :108A08008001365C80013C948000CCA88000CAB00C :108A180080008A708000956C80008A6480008A5883 :108A280080008A4C80008A4080008A34D401F01F7C :108A38000002D8028000C664D401F01F0002D802E8 :108A480080012984D401F01F0002D8028000B8B048 :108A5800D401F01F0002D8028000C074D401F01FB6 :108A68000002D8028000E68CD401F01F0002D80270 :108A78008001326430194828B0895EFC000016AACB :108A8800D401319CF01F0003319CF01F0003D80271 :108A98008000A2D28000A2E6D421204D3FF819C957 :108AA8001897F0091800F9B80001EFF80E0430081B :108AB800201D1AD850581AD81AD850685058F01F84 :108AC800001C49CB6E0CF01F001C0E9949BA49CB0B :108AD80049CCF01F001D2FCD581CC08049B8201D5F :108AE80049BC1AD8F01F001B2FEDF01F001BF01F08 :108AF800001B0E9CF01F001AC0F049A8900930080E :108B0800F0091900C0F44988201D498C1AD8F01FB3 :108B180000112FEDC07830194958319CB089F01FE9 :108B280000153018EF6800082FCDD822800089681A :108B380080008C5C8000CAEE80008B7C80008BDC1F :108B480080008A7C80009A188003973C80039DC02F :108B5800800094C48000998C80019EF880002A9837 :108B6800000016A28003972880039758000016A4D7 :108B78008000A300D4211897333CF01F000F300663 :108B88000FD8EC081800C0C048CCF01F000D6E0CC0 :108B9800F01F000C6E0CF01F000CAED6C07848BC5D :108BA800F01F00076E0CF01F000A3FFCF01F0009C1 :108BB800D82200008000A2E680039774800094C445 :108BC8008000B1D88000AE50800397908000CABC66 :108BD80080002E60D42116971896333CF01F00149D :108BE8000C9CF01F0014201D1ADC493CF01F0013D8 :108BF80030182FED0FC6F0061800C121490CF01FE0 :108C0800000F6E0CF01F000F48F849095C5CF20C6D :108C18001700F00C1710F01F0009AED6C0486E0CF4 :108C2800F01F000BF01F000BD82200008000A300EB :108C3800800096E48003979C800094C4800397B8D2 :108C48008000B950800397D080037FC08000CB8814 :108C58008000C690D42149471896F01F0014189533 :108C6800C110301CF01F00126C18201D1AD8F01FFC :108C78000011500C490CF01F001130182FEDAE8870 :108C8800D822AE8CF01F000E48E89008EA081900B8 :108C9800C08448D8201D48DC1AD8F01F00082FEDE2 :108CA800D8220000000016AB8000CAE480002E60C5 :108CB800800096A8800397D8800094C480006B2C0D :108CC800000016A28003995C800397E8D4211897C6 :108CD800F01F0027300A4A7B4A7CF01F0028300A20 :108CE8004A7B4A8CF01F00254A7B300A4A7CF01FD9 :108CF80000230E9A4A6B4A7CF01F0020300A4A6B08 :108D08004A6CF01F001E4A6B300A4A6CF01F001BA9 :108D18000E9A4A5B4A5CF01F0019300A4A4B4A5CBB :108D2800F01F0016300A4A4B4A4CF01F0014300A54 :108D38004A3B4A4CF01F0011300A4A3B4A3CF01F9C :108D4800000F300A4A2B4A3CF01F000C300A4A2B0D :108D58004A2CF01F000A300A4A1B4A2CF01F000751 :108D6800300A4A1B4A1CF01F0005D82280008620C2 :108D7800800085DC80039804800085F08000857879 :108D88008003980C80007E448003981480007F70D4 :108D98008003981C800079F48003982480007DC8A3 :108DA8008003982C80008494800398348000633476 :108DB800800398408000834C80039848800084009A :108DC80080039850800082E4800398588000821CB9 :108DD800800398608000817C80039868800080D43C :108DE800800398748000791080039880D4211897A4 :108DF800F01F000BF01F000BF01F000BF01F000B03 :108E08006E0CF01F000B48B811893008F0091800E3 :108E1800C0406E0CF01F0008D82200008000951496 :108E2800800088D080009504800193A080013BBC1D :108E3800000016A480004758D421202D3029EE7850 :108E48000000F1D9D1A23019F1D9D0033007501858 :108E58000E9B5007337CF01F000F1A9BFE7C3800D6 :108E6800F01F000D0E9BE06A01A4FE7C3800F01F85 :108E7800000B0E9BE06A0348FE7C3800F01F0008D8 :108E88000E9BFE7C3800F01F00072FEDD822000053 :108E98008000A2308000A8388000A8F08000A926B1 :108EA8008000A8D4D401333CF01F0009334CF01FD4 :108EB8000008335CF01F0006333CF01F0006334CFB :108EC800F01F0004335CF01F0003D8028000A2A842 :108ED8008000A2E6D421202DF01F0034F01F0034BA :108EE800F01F0034F01F0034E06C1B00EA1C00B7D0 :108EF800F01F00324B28201D4B2C1AD8F01F0032CF :108F080030CB301CF01F00312FED1897580CC08162 :108F18004AF8201D4AFC1AD8F01F002B2FED344BBD :108F2800301CF01F002A8F0CC0814A98201D4A9CD3 :108F38001AD8F01F00252FED3FF80E9CAEC8F01F81 :108F48000026300B169CF01F0025F01F0025F01F8F :108F58000025C0804A48201D49EC1AD8F01F001A85 :108F68002FEDFACAFFFC0E9B4A0CF01F0021581C7B :108F7800C0C1401A49FB0E9CF01F001F581CC0516D :108F88000E9CF01F001ECFDB58CCC04058DCC061DF :108F9800C03849BCC04849BCC02849BCF01F000AB9 :108FA800F01F001ACFEB000080008A88800076E06E :108FB80080008EAC80008E408000AAE88003970C69 :108FC80080039888800094C48002DC3C800398A8C1 :108FD80080039DC080008CD4800095C88000C8E4C0 :108FE8008000895C800398B8800088E880013E880A :108FF80080008AA0800193BC80008DF4800398E4EF :109008008003990C8003993080009514D4314A1458 :1090180058095F081296189716951493A888E06067 :109028000100E06100FFC2E88920A868E203190096 :10903800E069FFFFE7D9E828E9F88A02E06901005A :1090480088E8F2080108682989151039E9F8BA0290 :10905800EE021608049CF01F0010301CF01F000FD1 :10906800F01F000F5806C090049CF01F000E301C23 :10907800F01F000DF01F000D6828101310071005D1 :109088005C83F1D7C0085803CD01069CD832000094 :10909800000016AC8000A0408000A19880009ED4FB :1090A80080009F5C8000A17080009E94D4013009EC :1090B8005C7AF01F0002D80280009014D40148584E :1090C80090E9701B120C702AF01F0003D8020000F0 :1090D800000016AC8002E736D4014888189B118A34 :1090E8003009F20A1800C07090E9701C120B702A3F :1090F800F01F0003D8020000000016AC8002E7361B :10910800D421208D48D8F0E60008FAE70008F0EAF4 :109118000000FAC8FFF0FAEB0000F0E70008F0EBF7 :109128000000E06CF980EA1C0337F01F0005300CE2 :109138002FCD2FCDD82200008003996C8000A1C0CC :10914800D401FAC9FFFCF01F0002D80280031C1CDE :10915800D401F01F0002D8028002EE88D401F01F6B :109168000002D8028002ECACD401F01F0002D80241 :109178008002F0ECD401F01F0002D8028002E71050 :10918800D401F01F0002D8028002EE2CD401F01F97 :109198000002D8028002ED84D401F01F0002D80238 :1091A8008002ECC8D401F01F0002D8028002EE0C45 :1091B800D401F01F0002D8028002EDD0D401F01FC4 :1091C8000002D8028002E87ED401F01F0002D80213 :1091D8008002E8BCD401F01F0002D8028002E73602 :1091E800D401F01F0002D8028002E28CD401F01FE3 :1091F8000002D8028002E8D0D401F01F0002D80291 :109208008002E2A4D401580CC0707808B08B7808AA :109218002FF89908D802F9DBC008F01F0002D8021D :10922800800078A0D431189616971495580AE08AC9 :1092380000153008109AC0282FF8EE08070BF40B19 :109248001800CFB10A38F9B50400EBD8E515EDB927 :109258000001C0313303C0283203E9D9C001C090EE :109268003004C1082FF42015069B0C9CF01F000D3C :109278005805FE99FFF9C0682FF42FF70C9CF01FD2 :1092880000090F8B580BCF91C0782FF42015069B3F :109298000C9CF01F00045805FE99FFF9089CD83271 :1092A8008000920CD431204DFAC4FFCC109368177B :1092B800189568041698580BC0B13308BADB08999A :1092C800069ABAC8FACBFFFCF01F001FC3985809CA :1092D8005F1B58AA5F09F7E90009C0605808C04435 :1092E8005C383016C0283006EECB003A3009FAC791 :1092F800FFF00EF9C0B8F00A0D00029912985898BC :10930800F1DBE9082D080EF800985808CF515806E7 :10931800C1005803C0B0EDB40001C08132DB0A9C23 :109328002013F01F000A3016C04832D830060EF855 :109338000899069A0E9B0A9CF01F00030C0C2FCD6F :10934800D83200008000922C8000920CD431203D4D :109358003007500A18951696325432D3330230919A :109368003730C978E8081800E081008E2FF60D889C :109378005808E0800093E8081800E0800085E608B7 :109388001800F9B90100F7B600FFF9B90001C038B3 :109398002FF6A1B90D88E4081800CFB03008C048EE :1093A800F80E00182FF60D8AF008002EF4CC0030C5 :1093B800F4CB0030E20B1800FE98FFF4E00A180026 :1093C800C0A1109A4008110B50084B98580BF00B8D :1093D8001700C548364BF60A1800C0A1361B400ACC :1093E8001ADB1AD93019740B2FCA502AC358370BF5 :1093F800F60A1800C121361A40091ADAF2CAFFFC27 :10940800501A308A1ADA720B3009310A0A9CF01F96 :1094180000292FED1807C3C8378BF60A1800C0417A :10942800400A361BC078358BF60A1800C091400AEE :10943800341B1ADB1AD9740B2FCA502ACE6B375B30 :10944800F60A1800C0B1361B400A1ADB1AD93009CF :10945800740B2FCA502A30AACDAB363BF60A180037 :10946800C171109A4008700B2FC8FB6B0008500898 :10947800FACBFFF83008FB6800090A9CF01F000EC1 :109488001807C0682FF70D8B0A9CF01F000C2FF6E9 :109498000D885808FE91FF685805EBF81000F9B9D7 :1094A8000100F1F91E000E9C2FDDD8328003997C53 :1094B800800092AC8000922C8000920CD401189B02 :1094C800FACAFFFC300CF01F0002D8028000935447 :1094D800D40148A972082FF89308F2F800CC58086C :1094E800C040F2FC00D45D18FE780D003019918957 :1094F8007078D402D6030000000001184838F0F94B :1095080000D0700CB33C5EFC00000118D431495601 :1095180030020C9730152F46EEC1FF2C0E930E9497 :109528000D88E4081800C18166086E291039E08B9F :1095380000146C185808C0306C2C5D180D98EA0897 :109548001800E9F80000EFF90001F3D8E008EFF897 :109558000A02EDF51E002EC62EC70236CE21D832DD :1095680000000118D431300E189830A5494C1C96CB :109578002FCCFCC3FFFF1897F9340008EC0418003F :10958800C071FDD3C0082ECCEA0E1800CF311C9C48 :1095980048B530030A96FC0E002EEAF500D0F00517 :1095A8000D048F040D08EF630008EC0E0026080870 :1095B800EF6B00098F188D498D3AD83200000118D9 :1095C800D421300A16971896328B495CF01F001583 :1095D800300AFE7C0D00149BF01F00134935FE7CF9 :1095E8000D00EAFB00D0F60B1073A19BF01F0010D2 :1095F800FE7C0D00F01F000FFE7C0D00F01F000E1A :10960800EAC9FF2CEB4600CCEB4700D430182F45B5 :10961800AA882EC51235CFD1D8220000800094D850 :109628008000A3A08000A594000001188000A580F8 :109638008000A57A8000A562D401306AF01F00027C :109648005F0CD8028002E710D401F93A0020F738FD :109658000020F4081800C020D80AF01F00035F0C8F :10966800D80200008002E710D42119D919881AD924 :1096780019C91AD919B91AD919A91AD91999486732 :109688001AD9486A1AD8312B0E9CF01F00050E9C77 :109698002FADD822000016E0800399848002EC40A8 :1096A800D4214058F5D8C008F00916181ADAF5D8A8 :1096B800C108F1D8C2081ADA48671AD8486A1AD90C :1096C800310B0E9CF01F00050E9C2FCDD8220000F8 :1096D800000016F4800399A48002EC40D421488746 :1096E8001896321A300B0E9CF01F00060C9BED3AB0 :1096F80000200E9CF01F00040E9CD822000016BC0F :109708008002E8BC8002E736D431300318971696F9 :109718001491129218950694C1D805002FF4009C54 :10972800F01F0012F80300030C33E0880009201D25 :1097380048FC1AD6F01F000F2FEDC108201DEE05BA :10974800010B1AD00A9C0C0B48BAF01F000C2FED25 :1097580018050234CE350E35C021D83A30080AF83B :10976800EA07010CD83200008002EDD0800399B4DA :10977800800094C4800399CC8002EC40D4211897CF :109788002DFCF01F001B201D1ADC49ACF01F001A2D :109798000E9CF01F001A500C499CF01F00176EC851 :1097A800498C5008F01F00146EF82FED5818C0416E :1097B800495CF01F0011EF3800383049F2081800F2 :1097C800C0E03059F2081800C0603029F2081800CB :1097D800C091C03848DCC04848DCC02848DCF01FCD :1097E800000648DCF01F0004D822000080009670B4 :1097F800800399CC800094C4800096E4800399D0BB :10980800800399D8800399E8800399F480039A0823 :1098180080039A1C800384D4D421202DFACCFFFC29 :10982800F01F000C401870185808C04148ACF01FD1 :10983800000B3007C0887008F007032CF01F0008E1 :109848002FF75C57401870191237CF632FEDD822C5 :1098580080018F0480039A40800094C4800097841C :10986800D431202D300818921696BAE8169CF01FAD :10987800001DEDBC0000C04149BCF01F001C3007B2 :109888002FF649B30E94FAC5FFFCC208660BF6081A :109898000709E2190044C210E04700405F9C0D8AA6 :1098A800F60A0709E21900445F09F9E91009E8090D :1098B8001800C131BADABAC8310A300B0A9C2FE64F :1098C800F01F000CE4070B0C2FF7ED38FFFF5808CA :1098D800CDE10E9C5C5CC028300C2FEDD832000026 :1098E8008002EDD080039A50800094C40000049C4C :1098F8008002F0ECD421204D1A981AD8FAC8FFF843 :109908001AD8FAC8FFF01AD8FAC8FFE818971AD870 :10991800169C49BBF01F001B2FCD584CC221403864 :10992800E04800FFE08B001E402B580BC1A5E04B20 :1099380000FFE089001740195809C135E04900FFC8 :10994800E0890010400A580AC0C5E04A00FFE089D3 :109958000009B16BF7E811881448F1E91088C028AC :109968003008F0091618AEB8AE890E9CF3D8C208B4 :10997800F1D8C108AE99AEA82FCDD82280039A603D :109988008002EBF4486870085808F9BC00FFF9B980 :109998000101F1F91E10F9BC01015EFC0000170479 :1099A800D4214988169770085808C021DC2A580C19 :1099B800C080189B321AF0CCFFEFF01F0013C0389C :1099C800F16C003148F85807C080700C0E9B306A63 :1099D8002CECF01F000DC088700C306A2CECE06B8A :1099E80000FFF01F000A48787008F139003130088C :1099F800F0091800C021DA2AF01F0005DA2A000051 :109A0800000017048002E7368002E8BC80019EF857 :109A1800D4314A241896169714951292680358035D :109A2800C3B1338B301CF01F001E890C189BC0B1CA :109A380049C89088EDB80003C2F1201D49A849BC67 :109A48001AD8C10849ACF01F001B49691891581C65 :109A5800C0E09288EDB80003C1F1201D4928496C87 :109A68001AD8F01F00163FFC2FEDD8326808913243 :109A7800F16300109106911791259288EDB80003C3 :109A8800C020D8324888201D48DC1AD8F01F000BA7 :109A9800029C2FEDD832DC3A000017048002DC3C2F :109AA800000016A280039A8080039AE080009AC87A :109AB80080018F2480039AF8800094C480039B203F :109AC800D431202D1697581CC290C083582CC670CC :109AD8004A78583CE08101A8C998F01F00264A48F6 :109AE80018969088EDB80003C0A1F01F00234A38EB :109AF8001ADC4A3C1AD8F01F00232FED333CF01F24 :109B08000022334CF01F00216E185808E08001979E :109B18006E3B0C9C5D18E08F019249589088EDB817 :109B28000003C08149A8201D49AC1AD8F01F0015B0 :109B38002FED334CF01F0014333CF01F0014EF39A5 :109B480000103008F0091800E0800179F01F0012B9 :109B5800581CE080017448689088EDB80003E081E3 :109B6800016E201D48A848DC1AD8C659000016A264 :109B78008001997C800096E480039AC880039B3812 :109B8800800094C48000A3008000A2E680039CE8C3 :109B980080039B5480019EF880039B784B589088E3 :109BA800EDB80003C0814B48201D4B4C1AD8F01F5C :109BB80000342FED4AF89088EDB80003C0814B18A7 :109BC800201D4B1C1AD8F01F002E2FED333CF01F20 :109BD800002F6E285808C0306E3C5D18EF39001011 :109BE8003008F0091800E080012AF01F0029581CED :109BF800E080012549F89088EDB80003E081011F55 :109C0800201D4A084A3C1AD8C1699088EDB800035B :109C1800C0814A18201D4A1C1AD8F01F00192FEDC0 :109C28006E085808C0306E3C5D18EF3900103008D7 :109C3800F0091800E0800103EF390031F00918003D :109C4800E08000FDF01F00161894FACCFFFCF01F0E :109C58000015581CC591401870185808C550300593 :109C6800EEC1FFEFEEC3FFCE0A960A92C488000049 :109C7800000016A280039ABC80039BAC800094C4A9 :109C880080039A9880039BC48000A2E680019EF816 :109C980080039BE880039AA880039C1C8001997C20 :109CA80080018F04EF390031E4091800C080700882 :109CB800029CF005032BF01F0041C1F0306A4C0BE9 :109CC800069CF01F0040C0A040187008069CF005D4 :109CD800032B2DFBF01F003CC1005806C0A0401804 :109CE8006CC97008F005032870C81039E0890006AF :109CF80040187008F00503262FF55C5540187019B8 :109D08001235CD13C02830060C34C0415804E08108 :109D1800009658065F1858045F19F1E90009C20057 :109D2800089B0C9CF01F0025C1D068C8FE58FFC0D6 :109D3800E08400856CCAF0C9FFF71439E084007F1D :109D48004A299289EDB90003C0D1201D1ADA1AD820 :109D580049F84A0C1AD8F01F00202FCDC0385808EF :109D6800C0C0202DECCBFFDF306A1A9CF01F001B0F :109D7800F01F001B2FEDC17849489088EDB800030B :109D8800C0C1EECCFFEFF01F001749181ADC496C70 :109D98001AD8F01F00112FEDEECCFFEFEF3B00318A :109DA800F01F0012588CC060589CC2F0581CC21199 :109DB800C458F01F000FC4288000965080039C38B8 :109DC8008002EDE680009640000016A280039A8C7F :109DD80080039C40800094C48002E73680019DDCAB :109DE800800096E480039C6880019EA0800199CC45 :109DF80049489088EDB80003C0814938201D493C86 :109E08001AD8F01F00132FEDF01F0012581CC16064 :109E180048C89088EDB80003C111201D48A848EC37 :109E28001AD8C0989088EDB80003C081201D48B8A2 :109E380048BC1AD8F01F00062FED2FEDD8320000CD :109E4800000016A280039A8C80039C94800094C41E :109E580080019EF880039CB080039ABC80039CCC50 :109E6800D4012FEC580BC080F7DCC008FE7C28001A :109E7800F01F0005D802F7DCC008FE7C2800F01FA0 :109E88000003D8028000A6C68000A716D42148C7C0 :109E9800C098300BFE7C2800F01F000A6E082FF8CF :109EA8008F086E0CF7DCC008CF51F9DCC288F01FB0 :109EB800000630194858B089D82200000000170859 :109EC8008000A7FA80009E680000170CD40148683B :109ED800300B700CF9DCC288F01F000430094848C8 :109EE800B089D8020000170880009E680000170C8F :109EF800D421202D4948301B700CF9DCC288F01F92 :109F08000013E06B00D7FE7C2800F01F0011FAC791 :109F1800FFFAE06B00FFFE7C2800F01F000D0E9B8F :109F2800FE7C2800F01F000B9AB8EDB80007CF217F :109F38004858300B700CF9DCC288F01F00042FED74 :109F4800D82200000000170880009E688000A7FA49 :109F58008000A816D421202D49B8A96C910C49B8C5 :109F680011893008F0091800C030F01F00193009B5 :109F780049684957B0896E0C301BF9DCC288F01F5C :109F88000015E06B0082FE7C2800F01F00136E08AD :109F9800F3D8C008FAC7FFF8F7D8C10CFE7C280030 :109FA800F3EB109B0EDBB18BF01F000B0FABFE7CAD :109FB8002800F01F00090FBBFE7C2800F01F0006D8 :109FC8002FEDDA2A000017080000170C80009EF811 :109FD80080009E688000A7FAD42149381897118913 :109FE8003008F0091800C0604908700CA98CF01FEF :109FF8000010EEC6FF000F3BFE7C2800F01F000D8E :10A008000C37CFA14898300B700CF8CCFF00910C9E :10A01800F9DCC288F01F000830194838301CB089B4 :10A02800D82200000000170C0000170880009F5C71 :10A038008000A7FA80009E68D421202D4A78A96C58 :10A04800910C4A7811893008F0091800C030F01FC7 :10A05800002530094A284A17B0896E0C301BF9DCF4 :10A06800C288F01F0021E06B00D2FE7C2800F01FA0 :10A07800001F6E08F3D8C008FAC7FFF8F7D8C10C5C :10A08800FE7C2800F3EB109B0EDBB18BF01F001752 :10A098000FABFE7C2800F01F00150FBBFE7C2800CC :10A0A800F01F0012E06B00FFFE7C2800F01F000F7D :10A0B800E06B00FFFE7C2800F01F000CE06B00FF47 :10A0C800FE7C2800F01F0009E06B00FFFE7C2800E2 :10A0D800F01F00062FEDDA2A000017080000170C01 :10A0E80080009EF880009E688000A7FAD421202D69 :10A0F800498818973009118AF20A1800C070B08987 :10A108004958700CA98CF01F0015FAC5FFFAEEC665 :10A11800FF00E06B00FFFE7C2800F01F00110A9B87 :10A12800FE7C2800F01F000F9A380EC80C37CF218C :10A138004898300B700CF8CCFF00910CF9DCC28801 :10A14800F01F000930194838301CB0892FEDD8228B :10A158000000170C000017088000A0408000A7FA34 :10A168008000A81680009E68D4211897C088F01F28 :10A178000006486CF01F000620175C87483C58070B :10A18800CF71DA2A800090C40000171080009FE089 :10A19800D4211897C088F01F0006486CF01F0006ED :10A1A80020175C87483C5807CF71DA2A8000A0F452 :10A1B80000001710800090E0D4213027FAC4FFEC8B :10A1C8001896A887C0C80C9A089BFE7C2800F01F28 :10A1D8000009C020D82A09882FF8A8880988EE081D :10A1E8001800FE98FFF230094838301CB089D82290 :10A1F8008000A73C0000170CE1B80000EE18000131 :10A20800F1D8C201C020D3033019F20B094B994B86 :10A21800783958085E0CD5035EFCFE681400700996 :10A22800F3DCD0C191095EFCF8081605A968E0289E :10A23800F000581BC0D0C063582BC0F0583BC12059 :10A248005EFF3019F20C0949916991A9C108F60C11 :10A25800094B915B91ABC0B83019F20C094991696F :10A26800C0583019F20C0949915991993019F20CDA :10A27800094C912C5EFDD703D4213007189616940B :10A288000E95C0880D9B0D8C2FF72FE6F01F00044C :10A2980018450837CF830A9CD82200008000A230D6 :10A2A8003018F00C0948A59CA96CE02CF000F9487E :10A2B800004899185EFC3018F00C0948A59CA96C58 :10A2C800E02CF000F94800745EFC3018F00C0948E6 :10A2D800A59CA96CE02CF000F94800785EFC3018C9 :10A2E800F00C0948A59CA96CE02CF000F948005432 :10A2F800F948004499185EFC3018F00C0948A59CF0 :10A30800A96CE02CF000F9480058F9480044991865 :10A318005EFC301AF8081605F40C0949A968E0280B :10A32800F000F14900C4143BC080C043582BC0F171 :10A33800C098F14900A8C038F14900A4F14900B813 :10A34800C078F14900A8F14900B4C0285EFAF14983 :10A3580000945EFD3018F00C0948A59CA96CE02C0F :10A36800F000F94800985EFCF8081605A968E0288E :10A37800F000F0F800D0F00C0A4CF9DCC0015EFCEB :10A388003018F00C0948A59CA96CE02CF000F9489D :10A3980000D85EFCC008D703F3DBC0054898A59B2E :10A3A800F00B00387018F009092C4878F5DAC0026B :10A3B800F00A0329FE780800F00B09295EFC00006A :10A3C80080039CFC8003773CD42148F8E3B8000163 :10A3D80048E848F9700E48FC3008FE7B0800C0E8E1 :10A3E8007216EC0A00262FFA8D0C0E3ACFA3F60847 :10A3F800092E2F892FF85948C0407207300ACF6BB1 :10A40800D8220000800376008003773C80039CFC00 :10A418008000A39CE0680083FE790800F00C010C22 :10A42800F20C0328F0CAFFC0F20A032C580C5E0C89 :10A438004869F80C1200F2080038F80C111F70185F :10A44800F00C032C5EFC000080039CFC78C83019DB :10A45800F1D9D10399C85EFC78C83019F1D9D00177 :10A46800F1DBD20399C85EFCD421FAC4FFEC68176B :10A47800680EEFD7C003FDDEC0013004E9D7D00372 :10A48800E9DED0E1E9D7D103E9DED1E1E9DAD203A7 :10A49800E9DBD2E1E9D8D303E9D9D3E199147958B2 :10A4A800EDB80005CFD1D822D4213007405E2F8BDC :10A4B800EFD8D021EFD9D104EFDAD204EFDED306FA :10A4C800F80B0927D822F5E910192F8BF3E8102883 :10A4D800F80B0329F3D8D043F80B09295EFC2F8B1E :10A4E800F80B0328A1A8F80B09285EFC7958EDB8E9 :10A4F8000000CFD15EFC7808F1DBD00299085EFC41 :10A50800EC5BBB9FE08B0004304BC138E068C6BFF2 :10A51800EA18002D103BE08B0004305BC0A8E0680F :10A528001200EA18007A103BF9BB0306F9BB0207D0 :10A5380078A8F1DBD00399A878A8F1DAD10399A813 :10A548007808A3A899087958EDB80007CFD17808FA :10A558003019F1D9D00299085EFC7808EDB80004EA :10A56800CFD07808A1A899087808EDB80004CFD012 :10A578005EFC301899485EFC7808EDB80004CFD02E :10A58800992B7808EDB80004CFD05EFCD42130F8C0 :10A5980014951697F00A18005FBA30181896F00B41 :10A5A80018005FB9F5E91009C020D82AF00B180087 :10A5B800C0A1FE7C0C00F01F0015300BFE7C0C00C7 :10A5C800F01F00136C08EDB80004CFD0A377B1A733 :10A5D800EFE510878D076C08EDB80004CFD06C0844 :10A5E800E2180010CFD18D186C08EDB80004CFD058 :10A5F8006C08EDB80004CFD03FF88D286C08EDB892 :10A608000004CFD0DA2A00008000A4548000A4609F :10A618003038F00A18005FB93078F00B18005F88FE :10A62800F3E81008C1913108F00B1800E08B001511 :10A63800E06800809908208BF4081601F5DAC0015B :10A64800F1EB104B580AF9BA0100F9BA0002F7EA1F :10A65800100A99CA5EFD302C5EFCD4013019189896 :10A66800F73B000DF20B1800E0880004302CD802EC :10A67800300AE06900809909301E7019149CF3DED5 :10A68800D001F3DBD081F3DAD0E130FAF3DAD20487 :10A698009119D802D4013018F00B18005FBEF00AE7 :10A6A80018005FB81C48C030302CD8027818F1DB8D :10A6B800D021F1DAD041F1D9D3089918D80A7819FC :10A6C8001898EA19000F9919781CE21C0004C100B7 :10A6D80030E9F20B1800E08B001A7019B16B300CDE :10A6E800EA1BFFF0E81BFFFF126B911B5EFC303981 :10A6F800F20B1800E08B000B70192F0B301AF40BBB :10A70800094B5CDB126B911B5EFC302C5EFCE06835 :10A718002710C0585808C0215EFF20187849EDB9A5 :10A728000009CF917818EA18000F9918FC18010051 :10A7380099085EFDD4313036F737000CEC07180065 :10A74800E08B0050F733000B301EFC031800E08B41 :10A758000049F73800083079F2081800E08800420C :10A768003109F2081800E08B003D7619F205160150 :10A77800F4050005EA090D04E8C90001E04900FEF6 :10A78800E08B0030F0CA00080E923008EC1200018D :10A79800A197F1D7D001F1D2D021F1D3D061F1DA6C :10A7A800D084F73A0009F1D4D1081789F1DAD20830 :10A7B800F73A000AF1DAD308FC091800C0C0C093C0 :10A7C800302AF4091800C090EC091800C0A1C0781C :10A7D80099C8C06899D8C04899E8C02899F8D83A63 :10A7E800302CD832301899085EFC784CF9DCC0213E :10A7F8005EFCE0682710C0585808C0215EFF20188A :10A808007849EDB90001CF915C7B993B5EFDE0682A :10A818002710C0585808C0215EFF20187849E2194F :10A828000201E0490201CF717828300CB6085EFCBD :10A8380076095829E08800035EFE7618A769109B00 :10A84800E61BC000120CF3D8C003AFB91649109B21 :10A85800E61B30001649109BE61B0C001649109B9E :10A86800E61B03001649109BE61B00C01649109B07 :10A87800E61B00301649109BE61B000C1649109B7E :10A88800E61B00031649109BE21B60001649109B4B :10A89800E21B10001649109BE21B0C001649109B86 :10A8A800E21B03002FCC1649109BE21B0080109A74 :10A8B8001649E21A0008109BE2180030E21B00401B :10A8C8001649F3E81008144899085EFDF6081506BD :10A8D800582BF9BC0BFFF9D8E80CF9B80805F9F8BA :10A8E8008A00F9BC08005EFC582BE08800035EFE75 :10A8F800F6081506F80800082FC87008EDB8000F0C :10A90800C0C1A76BF3DAC010160C2ECC7808E0187B :10A918000000F3E810089908F9DAC0105EFC582B1B :10A92800E08800035EFEA76B160C7818EDB8000FE0 :10A93800C0A12E4CF3DAC0107808E0180000F3E844 :10A9480010089908F9DAC0105EFCD401F60E150457 :10A958001C3AF9BE0210F9BE0308FC0B024BF608BC :10A968001601F00A003AF40B0D0AF4091603F2C8AE :10A978000001E048FFFEE0880003DA0A7818E86B77 :10A988000000E418FFF7E018FECF590EF60E171076 :10A99800F9BE0000FDE810089918F5DAC003F3EADB :10A9A80011099989D80A7858EDB80001C030302CBF :10A9B8005EFCF7DBC009997B5EFD7858E21800E081 :10A9C800C030304C5EFC7859EDB90000F9BC010389 :10A9D800F9F90006F00C1700E06A01FFF3DAE02845 :10A9E800F7F80A005EFCE1B80000EE180001F1D8A3 :10A9F800C201C020D3033FF9993978595808C020BB :10AA0800D50330089918999899A8EA68610C9908AB :10AA18005EFCD703D421201D500A16961897F01F04 :10AA2800002F400A5806C5500DC83049F2081800D2 :10AA3800E08800503095EA081800E08B004B0DD9EB :10AA48003078F0091800E08B00458C39E068010186 :10AA5800F0091900E08B003EED3900083038F009A4 :10AA68001800E08B00376C0B0E9CF01F001D581C63 :10AA7800C3000DC8EA081800C0416E18B1B8C05824 :10AA880020586E19F3E810688F186E19ED3A00080F :10AA98000DD8A978F1EA10E812488F18302A8C38B6 :10AAA800F3D8C010F4081900E08800086E18ADB893 :10AAB8008F1820298FA9C0586E18F1E910C98F196D :10AAC8006E18E018FFF08F18300C35088F08C02872 :10AAD800301C2FFDD82200008000A9EE8000A9526A :10AAE8004828910C5EFC0000000018E8D431189842 :10AAF800783E580EC620F90600105806C5E0300901 :10AB08003FF3129A3344C1780E91E8071800C0A1A8 :10AB1800F2CAFFFEF4C9FFFF5C7A5C89FC0A070AE7 :10AB2800C0A8F6071800C4A05C75FC050709E4096D :10AB380000095C89EC091900C0F2F2C5FFFFF9D9D8 :10AB4800C0105C85FC0C000CEAC2FFFF19870E914F :10AB5800E6071800CDA1580AC3003019F20A1800F8 :10AB6800C0617028E06900802948C0C87028302971 :10AB7800F20A1800C0412D483409C0482D48E06940 :10AB880000C0300C3FF7C0D8F60A1800C1705C7ED0 :10AB9800F00E070CEC0C000C5C8CF20C1900C0D207 :10ABA800F8CEFFFF5C7C5C8EF00C000CFCC6FFFF4F :10ABB800198AEE0A1800CE91300CD832D401F9085F :10ABC800001CF3D8C010F2CEFFFE140EE04E004475 :10ABD800E088000F48F8201D1AD8E06804E31AD866 :10ABE80048D848EC1AD8F01F000E2FCDC008786E50 :10ABF800FC090009F36B00F02FF8786BF3D8C0104C :10AC0800F6090009F36A00F02FF8F958001CD80279 :10AC180080039DC480039E0880039D9C800094C48B :10AC2800D4013439F908001CF2081900E088000F33 :10AC380048C8201D1AD8E06804EE1AD848A848BCAD :10AC48001AD8F01F000B2FCDC008786AF3D8C010AF :10AC5800F4090009F36B00F02FF8F958001CD8022A :10AC680080039DC480039E5080039D9C800094C4F3 :10AC7800D401580CC0E14B18201D1AD8E068062BE7 :10AC88001AD84AF84AFC1AD8F01F002F2FCDC0084E :10AC9800786A580AC0E14A98201D1AD8E068062C3C :10ACA8001AD84AA84A7C1AD8F01F00272FCDC00806 :10ACB800F908001C3439F2081900E088000F49F837 :10ACC800201D1AD8E068062D1AD84A1849DC1AD867 :10ACD800F01F001D2FCDC008F7D8C010160A3FFB83 :10ACE800F56B00F02FF8129B5C88300AF958001CAD :10ACF800C1584928201D1AD8E06806321AD8494890 :10AD0800490C1AD8F01F00102FCDC008F1DEB01082 :10AD1800786EFC090009F36A00F0F0CEFFFFF3D863 :10AD2800C010F6081900FE98FFF3F958001CF3D973 :10AD3800C002CE01D802000080039DC480039E8C0F :10AD480080039D9C800094C480039EB080039EDC99 :10AD5800D401F908001CF3D8C010F2CAFFFEE04A7B :10AD68000044E088000F4918201D1AD8E06804F54F :10AD78001AD848F848FC1AD8F01F000F2FCDC00881 :10AD8800786AF4090009F5DBC108F36A00F02FF8C6 :10AD9800786AF3D8C010F4090009F36B00F02FF8B3 :10ADA800F958001CD802000080039DC480039F1C32 :10ADB80080039D9C800094C4D401F908001CF3D83A :10ADC800C010F2CAFFFCE04A0044E088000F49B80E :10ADD800201D1AD8E06804FD1AD84998499C1AD849 :10ADE800F01F00192FCDC008786AF4090009F60A87 :10ADF8001618F36A00F0786A2FF8F3D8C010F4092F :10AE08000009F5DBC208F36A00F0786A2FF8F3D876 :10AE1800C010F4090009F5DBC108F36A00F02FF847 :10AE2800786AF3D8C010F4090009F36B00F02FF822 :10AE3800F958001CD802000080039DC480039F605D :10AE480080039D9C800094C4D421F9380035A3D890 :10AE5800F9680035189678A75807C2406E1C580C38 :10AE6800C050F01F001130088F186E285808C09184 :10AE78006E355805C061EF090010EA091900C0E0F5 :10AE880048A8201D1AD8E06804C51AD84888489CE4 :10AE98001AD8F01F00092FCDC0080E9CF01F00071C :10AEA8008DA5D8228001122880039DC480039FA00D :10AEB80080039D9C800094C48002E28CD421189762 :10AEC800782C580CC050F01F000830088F286E3CB2 :10AED800580CC070F01F00043008EF5800108F386D :10AEE800D82200008002E28CD4211896580CC0E1C8 :10AEF8004AE8201D1AD8E06805D11AD84AC84ADCA1 :10AF08001AD8F01F002D2FCDC00878A75807C0E128 :10AF18004A68201D1AD8E06805D31AD84A784A5CCE :10AF28001AD8F01F00252FCDC0086E585808C0E069 :10AF380049E8201D1AD8E06805D41AD84A0849DC1F :10AF48001AD8F01F001D2FCDC0086E655805C0E047 :10AF58004968201D1AD8E06805D51AD84998495C6F :10AF68001AD8F01F00152FCDC0080A9AE06B0134DB :10AF78000A9CF01F00158F5CC041E06C00FFD822CE :10AF88009859E0680133F0091900E08B00214878EE :10AF9800201D1AD8E06805DD1AD848C8485C1AD8B8 :10AFA800F01F00052FCDC00880039DC480039FB407 :10AFB80080039D9C800094C480039FD880039FFCDD :10AFC8008003A0288000D3188003A054EF38001312 :10AFD800EA081800C0514D3870092FF991097818FE :10AFE800301B8F684CF9720A8F0AB09BB08B306B9C :10AFF800B0ABF40B1618B0CBF7DAC2083009B0FAC8 :10B00800B0DBF5DAC108305BB0B9F1690008F16965 :10B018000009F169000AF169000BF169000CF16996 :10B02800000DF169000EF169000FB0EAEF3A001265 :10B03800F60A18005F0C30ABF60A18005F0BF9EB44 :10B04800100BF20B1800C0513049F20A1800C0D199 :10B058000DC9F169000C0DD9F169000D0DE9F1690F :10B06800000E0DF9F169000F3009ECCAFFD1F16942 :10B078000010F1690011F1690012F1690013F1691A :10B088000014F1690015F1690016F1690017F169FA :10B098000018F1690019F169001AF169001BF0CB79 :10B0A800FFE4ED35002E3106EA091900F9BC02006B :10B0B800F5FC380016CC2FF92FFA5C89EC09190039 :10B0C800CF413009F0CAFFD4129C340B14CC2FF9AD :10B0D8005C89F6091900CFB13009F0CAFF94129CB7 :10B0E800E06B008014CC2FF95C89F6091900CFB108 :10B0F8003639F16900EFF16900EC3829F16900EDA2 :10B108003539F16900EE344A3009F0C8FF10EF59BB :10B11800001C10C92FF95C89F4091900CFB1D82A8D :10B12800000001F0D421580CC0E14A28201D1AD88B :10B13800E06806141AD84A084A0C1AD8F01F0020EA :10B148002FCDC00878A75807C0E149A8201D1AD8F4 :10B15800E06806161AD849B8498C1AD8F01F0018A2 :10B168002FCDC0086E5C580CC0E14928201D1AD8A4 :10B17800E06806171AD84948490C1AD8F01F001079 :10B188002FCDC0086E685808C0E148A8201D1AD8FD :10B19800E06806181AD848D8488C1AD8F01F000852 :10B1A8002FCDC008F01F000A30088F688F58D822AA :10B1B80080039DC48003A09880039D9C800094C454 :10B1C8008003A0BC8003A0E08003A10C8000D13CD8 :10B1D800D42130D878A7EF390012F0091800EFF819 :10B1E8001E12F9B80100EFF81E13300818968FE800 :10B1F8008F988FB88FA88FD88FC8EF48004CEF482A :10B208000048EF480044F01F0029EBDCC008C201E9 :10B21800301A335B0E9CF01F0026307B0E9CF01F0B :10B2280000250E9CF01F00246E5CEF0B001CF6CB73 :10B23800FF105C7BF01F00210C983439EECAFFDC4C :10B248006E5B6E1CF01F001E0C9CF01F001EEF387A :10B2580000132FF85C58EF6800133099F2081800B3 :10B26800E0880005E0692710C058E06903E8F009A4 :10B2780002495C79E06801F4F2C9FE0DF2080C0895 :10B288000C9CEF58001EF01F00100C9C48FBF01F90 :10B2980000100C9C48DBF01F000F0C9C48BBF01FF3 :10B2A800000E0A9CD82200008000AEF08000ABC4DB :10B2B8008000AC288000AC788000D2108001139008 :10B2C8008000B12C8000CABC8003B4098000CBC8C0 :10B2D8008000CA748000CA92D421305878A7EF3908 :10B2E8000012F0091800EFF81E12F9B80100EFF883 :10B2F8001E131896F01F0026EBDCC008C2A1301AF6 :10B30800335B0E9CF01F0023303B0E9CF01F002285 :10B31800302A339B0E9CF01F001FED1B002C0E9C47 :10B32800F01F001E0E9CF01F001E6E5CEF0B001C31 :10B33800F6CBFF105C7BF01F001B0C983439EECA6B :10B34800FFDC6E5B6E1CF01F00180C9CF01F0017D2 :10B35800EF3800132FF85C58EF6800133099F208A3 :10B368001800E0880005E0694E20C058E06907D061 :10B37800F00902495C790A9CF2C9FE0DE06801F403 :10B38800F2080C08EF58001ED82200008000AEF02A :10B398008000ABC48000AC288000AD588000AC7839 :10B3A8008000D210800113908000B12CD42118960F :10B3B800580CC0E14AF8201D1AD8E06802F51AD8DE :10B3C8004AD84AEC1AD8F01F002E2FCDC00878A70B :10B3D8005807C4E0EF3900123088F0091800C4811A :10B3E80017B8178A1799B169F3EA118917AAF3EA06 :10B3F8001089F1E910096EA81039C3A130C8EF68A7 :10B4080000123008EF680013F01F001E5C5CC28158 :10B41800301A335B0E9CF01F001C304B0E9CF01F43 :10B42800001B304A332B0E9CF01F00176EAB0E9C8E :10B43800F01F00170E9CF01F00176E5CEF0B001C2E :10B44800F6CBFF105C7BF01F00140C983439493A96 :10B458006E5B6E1CF01F00120C9CF01F0012EF3880 :10B4680000132FF8EF6800133148EF58001ED82258 :10B4780080039DC48003A13880039D9C800094C4F0 :10B488008000AEF08000ABC48000AC288000ADC066 :10B498008000AC788000D2108003B405800113903E :10B4A8008000B12CD421303878A7EF390012F00988 :10B4B8001800EFF81E12F9B80100EFF81E131896DD :10B4C800F01F002AEBDCC008C321301A335B0E9C46 :10B4D800F01F0027303B0E9CF01F0026302A339BBC :10B4E8000E9CF01F0023E06B02400E9CF01F002210 :10B4F800304A332B0E9CF01F001E6EAB0E9CF01FC3 :10B50800001F0E9CF01F001E6E5CEF0B001CF6CB9C :10B51800FF105C7BF01F001B0C98343949AA6E5B46 :10B528006E1CF01F001A0C9CF01F0019EF38001356 :10B538002FF85C58EF6800133099F2081800E0887B :10B548000005E0692710C058E06903E8F0090249DE :10B558005C790A9CF2C9FE0DE06801F4F2080C0857 :10B56800EF58001ED82200008000AEF08000ABC467 :10B578008000AC288000AD588000ADC08000AC7859 :10B588008000D2108003B405800113908000B12C94 :10B59800D4214BD811B9118B119A11A8B16AF5EBC6 :10B5A800118AF5E81088F3E8100878A78FA8EF3912 :10B5B80000123068F0091800EFF81E12F9B80100FF :10B5C800EFF81E131896F01F0031EBDCC008C3E13A :10B5D800301A335B0E9CF01F002E301B0E9CF01FA0 :10B5E800002D302A339B0E9CF01F0029ED1B002CE8 :10B5F8000E9CF01F0029304A337B0E9CF01F00245C :10B60800301B0E9CF01F0023303B0E9CF01F0021C6 :10B6180031CB0E9CF01F001F306B0E9CF01F001DDD :10B628000E9CF01F001E6E5CEF0B001CF6CBFF108B :10B638005C7BF01F001B0C98343949AA6E5B6E1CAA :10B64800F01F00190C9CF01F0019EF3800132FF899 :10B658005C58EF6800133059F2081800E0880005BC :10B66800FE79EA60C058E06903E8F20809495C79A4 :10B678000A9CF2C9FE0DE06801F4F2080C08EF58C4 :10B68800001ED8228003B4098000AEF08000ABC44D :10B698008000AC288000AD588000AC788000D210C3 :10B6A8008003B405800113908000B12CD421301898 :10B6B80078A7EF390012F0091800EFF81E12F9B850 :10B6C8000100EFF81E131896F01F0039EBDCC008D4 :10B6D800C501301A335B0E9CF01F0036303B0E9CC0 :10B6E800F01F0035302A339B0E9CF01F0032ED1BF3 :10B6F800002C0E9CF01F0031304A332B0E9CF01F9B :10B70800002D6EAB0E9CF01F002E304A336B0E9C42 :10B71800F01F00286E9B0E9CF01F0029304A337BD7 :10B728000E9CF01F0024301B0E9CF01F0023303BA2 :10B738000E9CF01F002131CB0E9CF01F001F306BB8 :10B748000E9CF01F001D0E9CF01F001E6E5CEF0B80 :10B75800001CF6CBFF105C7BF01F001B0C983439E3 :10B7680049AA6E5B6E1CF01F001A0C9CF01F001992 :10B77800EF3800132FF85C58EF6800133059F208BF :10B788001800E0880005FE79EA60C058E06903E81F :10B79800F20809495C790A9CF2C9FE0DE06801F4D7 :10B7A800F2080C08EF58001ED82200008000AEF006 :10B7B8008000ABC48000AC288000AD588000ADC0CC :10B7C8008000AC788000D2108003B405800113900B :10B7D8008000B12CD421304878A7EF390012F00945 :10B7E8001800EFF81E12F9B80100EFF81E131896AA :10B7F800F01F0025EBDCC008C291301A335B0E9CA9 :10B80800F01F0022303B0E9CF01F0021302A339B92 :10B818000E9CF01F001EED1B002C0E9CF01F001D3F :10B828000E9CF01F001D6E5CEF0B001CF6CBFF108A :10B838005C7BF01F001A0C983439499A6E5B6E1CB9 :10B84800F01F00180C9CF01F0018EF3800132FF899 :10B858005C58EF6800133099F2081800E08800057A :10B86800E0692710C058E06903E8F00902495C79EB :10B878000A9CF2C9FE0DE06801F4F2080C08EF58C2 :10B88800001ED8228000AEF08000ABC48000AC2837 :10B898008000AD588000AC788000D2108003B405D9 :10B8A800800113908000B12CD4314A5830167007AB :10B8B80030A20C9330043055C3E86EA85808C3A0D2 :10B8C800F1090022F2CA0001F15A0022EC0919001C :10B8D800C151F1380012E40818005F0AE6081800A0 :10B8E8005F09F5E91009E8091800C041EA081800DD :10B8F800C2110E9CF01F0013C1D8F1090020F2CA32 :10B908000001F15A0020EC091900C141F138001278 :10B91800E40818005F0AE60818005F09F5E910094D :10B92800E8091800C041EA081800C0410E9CF01F41 :10B9380000066E075807CC21D8320000000080CCE2 :10B948008000B7DC8000B2E0D4211896580CC0E122 :10B958004C08201D1AD8E068024E1AD84BE84BFC58 :10B968001AD8F01F003F2FCDC008F9380035A3D8EA :10B97800F968003578A7F909002CE068023FF0095A :10B988001900E088008B5807C091350CF01F00356E :10B998001897E08000838DACC2E86E1C580CC0304C :10B9A800F01F00316E585808C0E04AA8201D1AD868 :10B9B800E068026C1AD84AD84A8C1AD8F01F0028B6 :10B9C8002FCDC0086E285808C0916E385808C0613D :10B9D800EF090010F0091900C0E049E8201D1AD845 :10B9E800E068026E1AD84A2849CC1AD8F01F001C01 :10B9F8002FCDC008350A300B0E9CF01F001EF01F1B :10BA0800001E8F1C1895C0610E9CF01F001C8DA590 :10BA1800C178344A49ABF01F001B499B343A6E1C6D :10BA2800F01F00190C9A499B6E1CF01F00190C9C02 :10BA3800F01F00185C5CC0700C9CF01F0017E06CD5 :10BA480000FFD822ED380035A3B8ED680035D822BC :10BA580080039DC48003A13880039D9C800094C40A :10BA68008002E2A4800112288003A14880039FA0DD :10BA78008002E8BC800112008002E28C8003B409D5 :10BA880080011260800113208000BBBC800111F886 :10BA98008000B5988000AE50E06C00FFD82200000E :10BAA800D421202D1896580CC0E14BA8201D1AD877 :10BAB800E06803781AD84B884B8C1AD8F01F0038E6 :10BAC8002FCDC00878A75807C0E14B28201D1AD8E9 :10BAD800E068037A1AD84B384B0C1AD8F01F00309C :10BAE8002FCDC0086F295BF9C1102E2933C8E06A31 :10BAF800FFFFF2080D081438F40817B0EF580020BB :10BB08005808F9B80001EFF80C106F395BF9C1104B :10BB18002E2933C8E06AFFFFF2080D081438F4082C :10BB280017B0EF5800225808F9B80001EFF80C11C7 :10BB38006EB850185808C041FC18FF0050186EC85D :10BB480050085808C0716EA84019F3E80008A1A869 :10BB58005008EECBFFD80C9CF01F0013FACBFFFC6B :10BB68000C9CF01F00121A9B0C9CF01F00110C9CDF :10BB7800F01F0010EF39001230A8F0091800EFF894 :10BB88001E12F9B80100EFF81E132FEDD82200009D :10BB980080039DC48003A16080039D9C800094C4A1 :10BBA8008003A17C8000CBC88000CA928000CA7440 :10BBB8008000CB88D43178A71896149574186E290C :10BBC8005809C0916E395809C061EF0B0010F20B8B :10BBD8001900C0E04BE8201D1AD8E06805651AD89E :10BBE8004BC84BDC1AD8F01F003D2FCDC0088A5B2C :10BBF80032BAF40B1900E088020F118B302AF40BCB :10BC08001800E0810209F93C002EECCBFFD1F0CA04 :10BC1800FFE4C0982FF917345C59153EFC0418004E :10BC2800E08101FAF8091800CF6311FA11CB11D994 :10BC380011E8B169F3EB1189F3E810896E08F5E9A9 :10BC480010091039E08101E80E9CF01F00258A4C8C :10BC5800E06800F0F00C1900E088000FF8CC00F064 :10BC6800EF5C00105C7CF01F001F8F3CC051EF5C44 :10BC78000010E08F01D1E06C00F0F01F001A8F2C4B :10BC88001894C0C16E3C580CE08001C6F01F001625 :10BC9800EF5400108F34E08F01BF189B3009E06A21 :10BCA80000F00A9CF01F0011E06800F0F00C190089 :10BCB800C2004878201D1AD8E068052E1AD848C84E :10BCC800485C1AD8F01F00052FCDC00880039DC41A :10BCD80080039FA080039D9C800094C48000AEC414 :10BCE8008002E2A48002E28C8000CEC48003A1948A :10BCF8006E3B580BE08001B2E06900F0EF1A0010CB :10BD08000A9CF01F0036EF080010F8081900E080C0 :10BD180001A54B38201D1AD8E06805351AD84B18EC :10BD28004B1C1AD8F01F00312FCDC00819A8305A63 :10BD3800F4081800E0810100EF3800123019F20809 :10BD48001800E08100EC30086CA4333B89D889B82E :10BD580089C8089CF01F0026C0F0F8C8FFFC19AB82 :10BD6800119919BA1188B16AF5EB118AF5E81088AA :10BD78001248E948004433AB089CF01F001DC0E09E :10BD8800F8C8FFFC19AB119919BA1188B16AF5EB1B :10BD9800118AF5E810881248C0386918A198E9484E :10BDA800004833BB089CF01F0012C0E0F8C8FFFC35 :10BDB80019AB119919BA1188B16AF5EB118AF5E82E :10BDC80010881248C0286918E948004C6828F0C94A :10BDD800FFF0C0F11298C1C88000CEC480039DC492 :10BDE8008003A1C880039D9C800094C48000AAF4AD :10BDF800F1390013F13B0010F13A0011F13800124B :10BE0800B16AF5EB118AF5E81088F3E8100889A8FB :10BE1800301B089CF01F0084C0E0F8C8FFFC19AB79 :10BE2800119919BA1188B16AF5EB118AF5E81088E9 :10BE3800124889B8303B089CF01F007BC0E0F8C866 :10BE4800FFFC19AB119919BA1188B16AF5EB118A7F :10BE5800F5E81088124889C831CB089CF01F007299 :10BE6800C0E0F8C8FFFC19AB119919BA1188B16A7A :10BE7800F5EB118AF5E81088124889D8306B089CD0 :10BE8800F01F00691892C2E01998A38889E8582819 :10BE9800F9B80B02E9F8BA0E3003C1D8E608150262 :10BEA800E6C9FFF22FE8E8090029E4080008113E76 :10BEB800113AB16AF5EE118A118EF5EE108A1191D8 :10BEC800069CF5E11001F2CBFFFC93112FF3F01F54 :10BED80000575C5368E81033CE23069C4D4BF01F87 :10BEE80000536CA43008E93A00123089EF58001E5C :10BEF800F20A1800E9F91E12E9F81E130C9C300A20 :10BF0800E8CBFFD8F01F004BE93800132FF8E96899 :10BF180000133018E958001EC7E820383029F20805 :10BF28001800E08B007930080C9CEF58001EF01FB9 :10BF38000042C7183069F2081800C3513019EF38A9 :10BF48000012F20818005F0B3039F20818005F0978 :10BF5800F7E91009C0813049F2081800C040F40818 :10BF68001800C5916CA40C9C3003EF53001EF01F01 :10BF780000330C9C4AEBF01F00320C9C4ACBF01F9C :10BF880000310C9C4AABF01F0030E939001230C870 :10BF98000C9CF0091800E9F31E13E9F81E12F01FB3 :10BFA800002BC398302AF4081800C351EF38001248 :10BFB800F2081800C30130086CA4EF58001E336B58 :10BFC800089CF01F0019C270F8C8FFFC19AB119942 :10BFD80019BA1188B16AF5EB118AF5E81088124888 :10BFE80089986828F0C9FFF0C0311298C108F13962 :10BFF8000013F13B0010F13A0011F1380012B16A58 :10C00800F5EB118AF5E81088F3E8100889A80C9C6C :10C01800F01F000F0E9CF01F000F0A9CF01F000E6F :10C02800D83200008000AAF48000C19C8003B409C3 :10C038008001384C8000BAA88000CABC8000CBC8F8 :10C048008000CA748000CA928000B5988000B6B497 :10C058008000AEC48000D13C335B0E9CF01F00030F :10C06800FE91FE66CD8B00008000AAF4D4314C18F6 :10C07800301370073002069430813050C7686EA6BE :10C088005806C720ED05001EE6051900E0880006E1 :10C098002015ED55001EC688E6051900C651ED3875 :10C0A8000012306AED52001EF40818005F0A30C909 :10C0B800F20818005F09F5E91009300AF4091800B8 :10C0C800C501E8081800C0B1ED380013E0081800F1 :10C0D800E08B00360E9CF01F0028C468E2081800A8 :10C0E800C191ED380013E8081800E08B0010300A01 :10C0F800ECCBFFD80E9CF01F0021ED380013ED5556 :10C10800001E2FF8ED680013C2F80E9CF01F001CEB :10C11800C2B8E0081800C0510E9CF01F001AC248AF :10C128003049F2081800C0F1ED380013E208180091 :10C13800E08B00060E9CF01F0014C1680E9CF01FD7 :10C148000013C0F83039F2081800C0E1ED380013C8 :10C15800E8081800E08B00060E9CF01F000DC04890 :10C168000E9CF01F000C6E075807C8A1D8320000BB :10C17800000080CC8000B6B48001384C8000BAA89A :10C188008000B2E08000B7DC8000B1D88000B4AC99 :10C198008000B598D4013019F20C1800E08B001D0E :10C1A800580B5F1A48D9720958095F19F5E900094F :10C1B800C13017B9178E179A17A8B16AF5EE118A08 :10C1C800F5E81088F3E81008C0704858304AF00CB9 :10C1D800002CF01F0004D80200001D5800001D505C :10C1E8008002E736D42130181897F00B1800E08B3E :10C1F80000074868304AF00B002BC038304A484BDB :10C20800F01F00040E9CD82200001D508003B409C2 :10C218008002E736D4313013189516911492E60C43 :10C228001800E088000F4BB8201D1AD8E0680246B5 :10C238001AD84B984B9C1AD8F01F00392FCDC0083C :10C248004B89F20C0028F20C072B11BA119911A88E :10C25800B169F3EB1189F3E81088F5E81008C0E13B :10C268004AC8201D1AD8E06802471AD84AE84ABCCA :10C278001AD8F01F002B2FCDC008300AE06B011030 :10C28800149CF01F002A1897C041E06600FFC758A9 :10C2980078045804C0E049F8201D1AD8E068024D17 :10C2A8001AD84A3849DC1AD8F01F001D2FCDC0080B :10C2B800781630CA089B0C9CF01F001EECC9FFF4CE :10C2C800AC92ACD3E5D2C110ACA3ACC42011AC8203 :10C2D80032EC2FF1F2C8FFFF300AC05810CBF5D26C :10C2E800C0082FF1038BF4C2FFFFE80B18005F139F :10C2F800F80B18005F16E7E60006E8061800CEF10E :10C30800B28A0389E8091800C1601099CE3B000081 :10C318008003A1E48003A22880039D9C800094C42C :10C3280000001D508003A2408000D3188003A2643F :10C338008002E8BCF0CBFFFB10C9B089B0A9301966 :10C34800B099B0B96E180E9C101B5C7BF01F000CE6 :10C3580048C848D6F0050025335A6C0C0A9BF01FD4 :10C36800000B6C0C0A9A33590E9BF01F0009EDDC88 :10C37800C0080E9CF01F00070C9CD8328000D21019 :10C3880000001D5000001D5880011320800114F08A :10C398008000D13CD421189A303CF80A1800E08873 :10C3A800000F4BE8201D1AD8E068028A1AD84BC83B :10C3B8004BCC1AD8F01F003C2FCDC0084BB8E06713 :10C3C8000118F4070247F007000730180F8B169979 :10C3D800F00B1800C0A0C603302BF6091800C0F0F7 :10C3E800F8091800C4C1C4383008AEABAEB8AE986E :10C3F800EECBFFF43028300CAE88C3680FA92019A3 :10C408005C59AEA9C4910FBB2FFB5C5BAEBB0F9C04 :10C41800304EFC0B1800C251F20C1800C1214A4AD8 :10C4280015FB15CE15DC15EAB16CF9EE118CF9EA9D :10C43800108AF7EA100AC050AEB9AEA8AE98D82252 :10C44800EEF801105808C070EEFA0114300BEECC6B :10C45800FFF45D183008AE883008EF480110D82284 :10C46800AEABEECBFFF4F01F0013D8226E282018D5 :10C478008F28C121EF480110AE88D8224878201DA6 :10C488001AD8E06802C61AD848B8486C1AD8F01FFB :10C4980000062FCDC008D8228003A1E48003A28023 :10C4A80080039D9C800094C4000018F000001D507B :10C4B8008000C21C8003A29CD431580B5F081292E2 :10C4C80016974BB914967209189558095F04F1E448 :10C4D8001004E08100B6580CE08000B31989E8091F :10C4E8001800E08000AEF01F0033E04C00FFE08B46 :10C4F80000A84B1B0A9CF01F0031C08137F8AEA47E :10C50800AE88AE9C3018AEB8D8320A9CF01F002C0A :10C51800F8081618AE88F1DCC208AEBCAE98F1DC9B :10C52800C108AEA85BFCE081008F4A63300430305C :10C5380006910788E0081800C171E80400280A9CE1 :10C54800F00B1503101B2FFBE20B003B2FCBF01F4A :10C55800001BC0A1E0680118B13449A8F004000428 :10C56800E8F8010CC0782FF4E6C3FEE85844CE2161 :10C578003FF8F0091618AE89F3D8C208AEB8AE99DC :10C58800F3D8C108AEA95BF8C5E1300748E848DB35 :10C59800118A0E9C0E9930313043F2C0FFFF178488 :10C5A80016985804C1211297C358000000001D585E :10C5B8008002EDD08003A2BC8002ECC880011E106E :10C5C800000018F0000018ECE2041800C0C117C8F9 :10C5D800F4080104F40801081838E08A0005F9D4C1 :10C5E800C0081297F3D0C008F6CBFEE8E609180099 :10C5F800CD513039F2071800E08B0027494BE0682D :10C608000118EE080248F6080008118BF20B180012 :10C61800C1B1F4C9FFFFB0CAF1460110301AF142A6 :10C628000114B08AF0CCFFF448A80A9BB089F01F27 :10C63800000A0E9CF01F0009E06C00F2D832E06C92 :10C6480000F7D832D83AE06C00FFD832000018F072 :10C65800000018EC8002ED708000C39CD40148985B :10C6680070085808C0D0300CF01F0007301CF01FAD :10C678000006302CF01F0004303CF01F0003D802E5 :10C6880000001D588000C39CD421494C4946F01F26 :10C6980000156C0518975805C1E1F01F00138D0CA3 :10C6A800C1A0492B0A9AF01F00120A9A491B6C0C68 :10C6B800F01F00116C085808C0E05807C0C0EE0908 :10C6C800161848E8B0B7B089F3D7C208EFD7C10841 :10C6D800B099B0A7D82200008003A2C800001D5856 :10C6E80080011E10800112008003B40980011260CD :10C6F8008000C704800111F800001D50D431E068A3 :10C7080002001496944AF00A1900E08B00E331986D :10C71800F00A1900E08800DE4DF75C7A30090E9BBC :10C728000C9CF01F005E8C48F8081900E08100D2CC :10C738000F993038F0091800E08B00CCE06501183B :10C74800AB394D75120530290B8AF20A1800E081C1 :10C7580000C1AA880FBAF5DAC004AADA0FD80FCB3D :10C76800F1EB108B0FF80FEC5C8BF1EC108C3009AF :10C778005C8C0FA8F2081800E084009DF20A1800EB :10C788005F18301AF40B18005F1AF5E81008F20861 :10C798001800E0810090EAC4FFF42F4708980F8939 :10C7A800129AE21A00C0E04A00C0C1502FF7C098A0 :10C7B800F3DBC0082FF7118BF40B1800C7B12FF863 :10C7C800F2CB00010F8A5809CF41F20A1800C03095 :10C7D8002FF8CE6B4B0B30082F4B1739129AE21AF1 :10C7E80000C0E04A00C0C060120B1789F0091800A9 :10C7F800CF51F1DCC0082FBB300E301A3047C58846 :10C808001739129CE21C00C0E04C00C0C060120B3B :10C818001789FC091800CF512FFB17CC17D9B1691C :10C82800F3EC118917ECF7330008F3EC108917A221 :10C8380017FC1781F9E91009F73C0009F9E3108C96 :10C8480017B35C8CE7E2108317925C83E5E11082F2 :10C85800F4021900C281F4031900C251EE0C190048 :10C86800C2218B29E8593A80E0880005E8783A80A7 :10C878008B28EAC7FEF42F6B304A0E9CF01F000984 :10C88800EAF801105808C250EAFA01140E9B089CF5 :10C898005D18C1F800001D5C8000CEC4000018F0CF :10C8A8008002E7365C7C20182F6C5C58180B5808FF :10C8B800CA81EAF801105808C070EAFA0114300B6E :10C8C800EACCFFF45D183008AA883008EB4801105C :10C8D8000C9CF01F0002D8328000D13CD401F01F1C :10C8E8000003F01F0003D8028000C8F88000C6903B :10C8F800D42149A949ABF2CCFEC4F2C8FF54300A8E :10C90800F2C9FF50910A930AB22A172EF14EFFFC82 :10C918002F092F081838CF71492949382FD9149C65 :10C92800E019FFFCF0C6FFDC48D7490E910CEE0A6F :10C938000405189BC098700493042FFB9109FC0A06 :10C9480005045C8B0809EA0B1900CF632FC82FEA8E :10C958000C38CED1D8220000000080D48003A2D8A1 :10C9680000001F5C000072E88003A394D401580BF8 :10C97800C200F1DBC002C0E048F8201D1AD8E06808 :10C98800016B1AD848D848EC1AD8F01F000E2FCDE2 :10C99800C00848D8F00C03299709F00C092B48B8AF :10C9A800A56CF00C000CF8CCFF54780820189908F6 :10C9B800D80200008003A2EC8003A33080039D9C72 :10C9C800800094C4000072E8000080D4D421189834 :10C9D800588CE088000F49F8201D1AD8E068013DFE :10C9E8001AD849D849DC1AD8F01F001D2FCDC00825 :10C9F80049CE49D9FC0C032CF0CAFFF5580CC230BB :10CA0800A56AF00B15047807F20B000BFC08092740 :10CA1800F6CBFF5414097608720A2FF8103AF3F887 :10CA28003A009708F1DCC002C13048A8201D1AD886 :10CA3800E068014F1AD848D8488C1AD8F01F000867 :10CA48002FCDC008A56A140992282FF8B228D82239 :10CA58008003A2EC8003A35080039D9C800094C4B3 :10CA6800000072E8000080D48003A370580BC0C097 :10CA780017B8178A179917ABB169F3EA1189F3EB5D :10CA8800108BF1EB100B993B5EFC580BC0C017B82C :10CA9800178A179917ABB169F3EA1189F3EB108B71 :10CAA800F1EB100B992B5EFC4828910C5EFC000002 :10CAB800000080D0D4211897F9380035EDB800006F :10CAC800C0D1A1C8F968003578885808C0205D1819 :10CAD8006E785808C0300E9C5D18D822F93C003595 :10CAE800F9DCC0015EFC580CF9FB1A075EFCD703A1 :10CAF800D421300A18971696302C96CBF01F001ABE :10CB08001895C041E06600FFC2B80C9BF01F0017E3 :10CB1800EDDCC008C0500A9CF01F0015C2180A9826 :10CB280070095809C0301298CFCB6EF95809C15016 :10CB38006F095809C0E148F8201D1AD8E068025367 :10CB48001AD848D848DC1AD8F01F000D2FCDC008D5 :10CB58009305EF480040C048EF4800408FF50C9C13 :10CB6800D82200008000D3188000CF988000D13CE4 :10CB78008003A3A88003A44480039D9C800094C4E0 :10CB8800D4211897F9380035EDB80000C170A1A874 :10CB9800F968003578885808C0205D186E785808FC :10CBA800C0300E9C5D18EF380035EDB80005C06147 :10CBB8000E9CEECBFFFCF01F0002D8228001370C40 :10CBC800D42117881799B169F3E8118917A8F3E8F0 :10CBD800108917B81697F1E91009189678181039BE :10CBE800C27049A8700CC0A8780978356C1810393B :10CBF800C041301BF01F00160A9C580CCF614958E1 :10CC08007008C14870095809C1006C1A1439C0D19C :10CC18000F8A0F99B169F3EA11890FAAF3EA10890B :10CC28000FBAF5E91009910970385808CEC10F8A72 :10CC38000FB90F98B168F1EA11880FAAF1EA1088C4 :10CC4800F3E810088D18D8220000820C8000E12437 :10CC580000008214D421149712961895F01F001022 :10CC68005807C0C00FB80F8A0F990FA7B169F3EA28 :10CC78001189F3E71087F1E710078B275806C0C022 :10CC88000DB80D8A0D990DA6B169F3EA1189F3E67D :10CC98001086F1E610068B36D82200008000CBC83B :10CCA800D4213006999899169926993699A6997695 :10CCB800998699F6F94600404908FAC4FFEC681EBF :10CCC8006804F96600351185F96500382FF5B085D7 :10CCD8001897994EF01F000A0E9C5D145C5C4898EA :10CCE800580CEC071710F1F90000EFF90A00F1F7FA :10CCF8000A000E9CD82200000000730C8000CC5C57 :10CD0800000080CC1898300CC0482FFC70085C5C80 :10CD18005808CFC15EFC580CF9F81207F9B901019F :10CD2800F1D9E108F9F81C075EFCD703D401580CC7 :10CD38005F08580B5F09F3E81008C1304978201DD7 :10CD48001AD8E068028F1AD84958496C1AD8F01FC7 :10CD580000162FCDC008964AF4080008B848129C5F :10CD6800984878095809CF819859F0091900C0E006 :10CD780048A8201D1AD8E06802971AD848B8489CD5 :10CD88001AD8F01F00092FCDC0089649990BF20850 :10CD98000008B848D80200008003A4708003A4B437 :10CDA80080039D9C800094C48003A4ECD421169732 :10CDB800F01F00065807EFF81207F9B90101F1D979 :10CDC800E108EFF81C07D8228000CD34D421580C94 :10CDD800C0E14B58201D1AD8E06801B01AD84B386A :10CDE8004B3C1AD8F01F00332FCDC008580BC03168 :10CDF800169CD8223008F00B1900C154F60911000E :10CE080098585C89F2081900C0F24A78201D1AD88F :10CE1800E06801B71AD84A884A5C1AD8F01F00257A :10CE28002FCDC0081699F93E000C300A3037F40EA1 :10CE380019005F08EE0E19005F061497104678185F :10CE4800F4061800C0A0F00B01099919F8CAFFF000 :10CE58001439C2029918DA2A201E3017EE0E19006A :10CE6800E08B000CF40B1900C1D4985AF20A19008F :10CE7800C19316189918C0E848B8201D1AD8E06858 :10CE880001E61AD848D848AC1AD8F01F000A2FCDA6 :10CE9800C00898581608B8589848F00B000BB84BBB :10CEA800D82ADA2A8003A47080039EA480039D9C5C :10CEB800800094C48003A51C8003A53CD43116913E :10CEC8001497580CC0E14AD8201D1AD8E068033ED0 :10CED8001AD84AB84ABC1AD8F01F002B2FCDC00860 :10CEE800580BC070300518960A920A930A90C388A6 :10CEF8004A28201D1AD8E068033F1AD84A384A1C25 :10CF08001AD8F01F00212FCDC0085809C0A08C588E :10CF1800F208010AF0091900C043F3DAB010C1F8A9 :10CF2800F1D9C0108C54E8090109EE091900EE097D :10CF380017B06C1BE9D9B010F9D5C010100BE20C72 :10CF4800000C089A5C7AF01F0012E8030003081727 :10CF5800E80500055C835C855C8730096C0658062B :10CF68005F1AE40719005F18F5E80008E0081800E0 :10CF7800CCD1069CD83200008003A4708003A5B0F1 :10CF880080039D9C800094C48003A5D08002E7366E :10CF9800D431580C5F08580B5F0918961697F3E8B8 :10CFA8001008C06198499648F0091900C0E24C7809 :10CFB800201D1AD8E06802FE1AD84C584C5C1AD8C2 :10CFC800F01F00452FCDC00830050A945806C0E16F :10CFD8004BE8201D1AD8E06803031AD84BF84BDC3D :10CFE8001AD8F01F003D2FCDC0088C5808995C79DD :10CFF8008E53F5D8C010F7D3C010121AF3D5C0104D :10D00800F6090109123AE7D5E413E8091750F1D9EE :10D01800E51308985C786C1C100CF1D5C0105C8383 :10D028006E1BF5D3C010100BF01F002DE604000492 :10D038008C585C84F0041900E088000F4A38201DE1 :10D048001AD8E068030F1AD84A684A2C1AD8F01F71 :10D0580000222FCDC008F0041900EDF60000F9B445 :10D068000000E60500058E585C85F0051900E0888B :10D07800000F4968201D1AD8E06803151AD849A876 :10D08800494C1AD8F01F00142FCDC008F00519001C :10D09800EFF72000F9B502005807C2908E598E4864 :10D0A800F0091900C2416E085808C2104878201DBE :10D0B8001AD8E068031F1AD848C8486C1AD8F01F55 :10D0C80000062FCDC00800008003A4708003A5F4DB :10D0D80080039D9C800094C48003A6248002E736C8 :10D0E8008003A6348003A64C8003A6685806C16056 :10D0F8008C598C48F0091900C1116C085808C0E017 :10D108004898201D1AD8E06803241AD84878488C13 :10D118001AD8F01F00082FCDC0085807FE91FF58F5 :10D128000E9CD8328003A4708003A66880039D9C5F :10D13800800094C4D421189B580CC0E14AB8201D23 :10D148001AD8E068021C1AD84A984AAC1AD8F01FB4 :10D15800002A2FCDC008F939000C3038F009180022 :10D16800E088000F4A18201D1AD8E06802281AD84B :10D178004A284A0C1AD8F01F00202FCDC0083007C3 :10D18800303530169679F2C800015C885809C0E13C :10D198004968201D1AD8E06802351AD84988495CC0 :10D1A8001AD8F01F00152FCDC008B6785808C1B19D :10D1B800F738000C169CF0C900017604EA0819003B :10D1C800C031308CC068EC091900E08B0006307C57 :10D1D800F01F000CC038F01F000C2FF7089B5C579D :10D1E8005804CD110E9CD8228003A47080039EA4FD :10D1F80080039D9C800094C48003A6948003A6AC01 :10D208008000C9748002E28CD421580CC0E14B988C :10D21800201D1AD8E068015F1AD84B784B7C1AD8C1 :10D22800F01F00372FCDC0083019F938000CF2086C :10D2380018005F1A3039F20818005F19F5E900097B :10D24800C1405808C1203029F2081800C0E04A98A7 :10D25800201D1AD8E06801631AD84AA84A7C1AD84F :10D26800F01F00272FCDC0089848F00B1900C3F213 :10D27800F3D8C0101897F1DBB0105C7B121BC27892 :10D28800E04BFFFEE08A000F49A8201D1AD8E0688D :10D2980001771AD849C8499C1AD8F01F00192FCD10 :10D2A800C0088E481608AE486E075807C0E14918EE :10D2B800201D1AD8E068017B1AD8494848FC1AD8BA :10D2C800F01F000F2FCDC008F1DAB0108E59F00909 :10D2D800010AF2081900FE9BFFD5AE48AE586E0C45 :10D2E800580CC030F01F000A30088F08D822000000 :10D2F8008003A4708003A70080039D9C800094C4D1 :10D308008003A7188003A7348003A7488000D13C76 :10D31800D431202D16971495581CC0B0C083582CB2 :10D32800C040583CC0B1C1783004C0583144C0280E :10D3380030042EC42E445C84C0F84C08201D1AD832 :10D34800E06800D11AD84BE84BEC1AD8F01F003E21 :10D358002FCDC00830045825E08B00065815E08210 :10D3680000DDCBF85835E08100E6308CF01F00373F :10D378001896E08000F25C740E99E8C8FFFD5C79AD :10D38800E018FFFCB847E06A02443000F4080108DE :10D39800F8040004F0090D472ED4E014FFFCAC5744 :10D3A8009914F965000C99005C77F8C3FDAC0E047C :10D3B8000833C0E24A18201D1AD8E06800EB1AD8D2 :10D3C8004A384A0C1AD8F01F00202FCDC008580838 :10D3D800E089000F4998201D1AD8E06800ED1AD896 :10D3E80049C8498C1AD8F01F00182FCDC008F20779 :10D3F800010700980A9918943015E0610243B8753E :10D40800E0620244C6A850195008308CF01F000F83 :10D418000E9B189A5C8BF4CEFFF0F6011900F60CFF :10D428001720E40C173040194008580AC1610C9CB9 :10D438001496F01F0009C9088003A4708003A76030 :10D4480080039D9C800094C48000C9D48003A77C7D :10D458008003A7B08000D13C9508890AF569000CC3 :10D46800F560000DE047FFFFC0E14BD8201D1AD83A :10D47800E06801071AD84BB84BBC1AD8F01F003B1C :10D488002FCDC008951EB45CB44BFDDEC002C0E0D1 :10D498004B38201D1AD8E068010D1AD84B484B2C80 :10D4A8001AD8F01F00322FCDC0085C7C8CDB18170F :10D4B80014946C1CF80B000B1633C0E24A88201D2C :10D4C8001AD8E06801101AD84AA84A7C1AD8F01F5E :10D4D80000272FCDC008B4755807FE99FF96C3786A :10D4E8000E985C782FD8E018FFFC5C74E8CCFFED50 :10D4F800E01CFFFC100CF01F00201896C2D030086A :10D50800F8040004AC572ED4B847E014FFFCF968BF :10D51800000C99149908C1B8307CF01F00181896AF :10D52800C1B03008AC57F965000CB847990899188C :10D53800C0E848B8201D1AD8E068013D1AD8490843 :10D54800489C1AD8F01F00092FCDC0083018AC78B5 :10D558003008ED68000D0C9C2FEDD8328003A470C4 :10D568008003A7E480039D9C800094C48003A7F8EF :10D578008003A77C8002E2A48000C9D48003A82885 :10D58800D43149B8781918951094300CF2C2FFF4C8 :10D59800F3310009700718961893C1E8EF380010A6 :10D5A8000238C1716E585808C1400A9A0E9B6E6CB9 :10D5B80004995D18C0E05806C0410C95301CC0A8FD :10D5C8006E388D3868088F388907301C3005C028B8 :10D5D800300C0E966E37E60C18005F0858075F1976 :10D5E800F3E80008E6081800CDA1D832000073104F :10D5F800E06C00FB5EFCD421E067040078A8F90B1E :10D60800002C78C9F5DBC010F90E003C100AEE0EAC :10D618001900E0880005E06E0400C0285C7EF4096B :10D628000107EE0E010EC076F95B002E78CCF40CE3 :10D63800010CD822F009010A580AE08A00063008CD :10D64800F958002ED82AF2080108F958002ED82ACD :10D65800996B5EFCF94B008C5EFCF94B00885EFC14 :10D66800F94B00985EFC998B5EFCF96A0039F94B1E :10D6780000945EFC5EFC5EFC48A87008C028703808 :10D688005808CFE148887008C02870385808CFE19A :10D6980048687008C02870385808CFE15EFC000060 :10D6A8000000820C0000821400008220D4014A6825 :10D6B8007008C30870495809C0E14A48201D1AD8A3 :10D6C800E06805AC1AD84A284A2C1AD8F01F00225C :10D6D8002FCDC0085819C0E149C8201D1AD8E068E4 :10D6E80005AD1AD849D849BC1AD8F01F001B2FCD50 :10D6F800C00858A9C0E14958201D1AD8E06805AEED :10D708001AD84978493C1AD8F01F00132FCDC00801 :10D7180070385808CD0149387008C128704958A98F :10D72800C0E048A8201D1AD8E06805B11AD848E812 :10D73800488C1AD8F01F00082FCDC0087038580838 :10D74800CEE1DA0A0000820C8003A8688003A8AC46 :10D7580080039D9C800094C48003A8D88003A904FA :10D76800000082208003A934D43118961497784891 :10D778005808C0E04C48201D1AD8E068011A1AD889 :10D788004C284C3C1AD8F01F00432FCDC008580A2B :10D79800C3514C19720C4C19720A4C19109E9207FD :10D7A8004C08E069100070052FF70A985C87EE0EA8 :10D7B8001900F2071790C088F104001C0E93EE04BC :10D7C8001900CF3070385808CF811898C088F104F4 :10D7D800001C0E93EE041900CE8070385808CF81D3 :10D7E8001498C088F104001C0E93EE041900CDD0E3 :10D7F80070385808CF814AA8B0074A887008C1F81D :10D80800F109001C0E93EE091900C181700A580A2B :10D81800E0800099580BE0800096178C1799B16941 :10D82800F3EC118917ACF3EC108917BCF9E910096E :10D83800E0800089123AE080008670385808CE11DE :10D8480049887008C1A8F109001CEE091900C141F6 :10D85800700A580AC770580BC750178C1799B169C6 :10D86800F3EC118917ACF3EC108917BCF9E910092E :10D87800C690123AC67070385808CE6148A870052C :10D888000A98C2D88003A8688003A96080039D9C79 :10D89800800094C40000822000008214000001F877 :10D8A8000000820C0000821CF109001C0E93EE0996 :10D8B8001900C141700A580AC450580BC430178C5B :10D8C8001799B169F3EC118917ACF3EC108917BCFF :10D8D800F9E91009C370123AC35070385808CE518C :10D8E80049A87008C158F109001CEE091900C0F1D7 :10D8F800178A1799B169F3EA118917AAF3EA108907 :10D9080017BAF5E91009700A123AC1C070385808F8 :10D91800CEB1580BC11017891798B168F1E9118871 :10D9280017A9F1E9108817B9F3E81008C050304A70 :10D938000C9CF01F00078D354868ED57001C9106B8 :10D94800D83AE06C00F5D832000082208002E73631 :10D958000000821CD4211897169CF01F0008C0B044 :10D96800F908002C5808C0702288EE081900F00742 :10D9780017305C870E9CD82280012228D421F90810 :10D98800002C1897F3D8C010E06CFFFFF5DBC0102F :10D99800F8090109123AE08A000F4948201D1AD8EF :10D9A800E06801BD1AD84928492C1AD8F01F00127E :10D9B8002FCDC008100BE0680800EF5B002CF00BBF :10D9C8001900EFF8BC160E9CF01F000CE04C01FF8C :10D9D800E08A000AEF380026A1B80E9CEF680026FE :10D9E800F01F0007D82200008003A8688003A988D8 :10D9F80080039D9C800094C48000D5FE80010CECBF :10DA0800D4211896304CF01F000A1897C0E0ECE8B3 :10DA18000000F8E90000ECE80008F8E900086C48A4 :10DA28009948781CF01F00030E9CD8228000C9D4A6 :10DA38008000CD1ED4211896580CC0311897C0B854 :10DA4800781C580CC030F01F000518970C9B304C00 :10DA5800F01F00030E9CD8228000D13C8000C974BE :10DA6800D42130071896C0880C9C6C06F01F00055E :10DA7800F80700075C575806CF810E9CD822000093 :10DA88008000DA3CD4217848189758A85F1A5808BB :10DA98005F19F5E90009C2005818C1E0F8FC0084D4 :10DAA800580CC060F01F000D3008EF4800843FF8A4 :10DAB800EEFC0080EF58003AF01F000930066FECCA :10DAC800EF460080F01F00066FFCF01F0005EF46D0 :10DAD800007CEF460078D8228000D13C8000DA68CC :10DAE800D421169778081638C04176389908C11895 :10DAF8004B899308C0A870390E39C0614B599308F7 :10DB08006E399139C06812985808CF614B1993083B :10DB180030060E9C8F36F01F00306E4858A85F19EB :10DB280058185F181268EC081800C0C0EF380026B3 :10DB3800EDB80000C071A1B80E9CEF680026F01F78 :10DB480000276E485818C3206FE85808C0E04A48B4 :10DB5800201D1AD8E06804F91AD84A284A2C1AD87D :10DB6800F01F00222FCDC0086FF85808C0E049C840 :10DB7800201D1AD8E06804FA1AD849D849AC1AD82E :10DB8800F01F001A2FCDC008EEF800805808C0E03A :10DB98004938201D1AD8E06804FC1AD84958492C7D :10DBA8001AD8F01F00122FCDC00830088F48F01F78 :10DBB8000012C0E148A8201D1AD8E06805021AD84A :10DBC80048E8489C1AD8F01F00092FCDC008D82271 :10DBD800000082188000DA8C80010CEC8003A868B1 :10DBE8008003A9AC80039D9C800094C48003A9C4D1 :10DBF8008003A9E08000D6B48003A9F8D42118973F :10DC080078485808C0E04A68201D1AD8E0680175AD :10DC18001AD84A484A4C1AD8F01F00242FCDC008F9 :10DC2800303CF01F00231896C380EF08001CF958F9 :10DC3800001C6E6899688E48A1B8B8483018994891 :10DC4800EF38000BF968000BEF38000AF968000A92 :10DC58006E089908497972080E38C0316E38C108C3 :10DC680049599308C0A870390E39C06149299308E9 :10DC78006E399139C06812985808CF6148E99308FD :10DC880030080E9B8F38302CF01F000C48C948D83C :10DC98008D8970098D3991060C9CD8228003A8685B :10DCA8008003AA1880039D9C800094C48000C9D476 :10DCB8000000821C000082188000C9748000D5F81A :10DCC80000008214D431204D4B583005700910964D :10DCD8002FF90A9491090A934B2830627007E08F54 :10DCE800019E6E485808C0E14AF8201D1AD8E0681D :10DCF80002571AD84AD84AEC1AD8F01F002E2FCD4E :10DD0800C0085818C0E14A88201D1AD8E06802588F :10DD18001AD84A984A6C1AD8F01F00262FCDC00886 :10DD280058A8C0E14A08201D1AD8E06802591AD834 :10DD38004A2849FC1AD8F01F001F2FCDC0085828C0 :10DD4800C071EF38004EE4081800E0800081EF3819 :10DD5800004E30CAF4081800C7A0EF3800AC10997C :10DD6800E8081800C300EEF900A82FF9EF4900A849 :10DD7800493A100AF53AFFFF1439C6B33009EF499A :10DD880000A8E4081800F9B90801F1D9E808EFF883 :10DD98008EAC0E9CF01F000BC5C80000000082105E :10DDA8000000820C8003A8688003AA3C80039D9C25 :10DDB800800094C48003AA688003AA948003AC38C6 :10DDC80080010A20EF08003AE6081900F9B90401B1 :10DDD800F1D9E408EFF84C1D6FF85808C3A0EF0913 :10DDE800003AEF08004CF0091900C3356E4858286E :10DDF800C100EF09004AEF0800484CD1A3581208A7 :10DE0800EF39004EE2090709F0090948EF58004CBC :10DE1800EF080060EF090056F0091900F00917B083 :10DE2800EF08003CF3D9C02FEF590058F00A15014C :10DE3800F0091900EFFA3C2CEF08003CEF53003AC8 :10DE4800EF5800560E9CF01F003BC0383018C02811 :10DE580030086E495869C0B16C0B6EDAF60A010ACF :10DE6800E04A0028E08800042FF85C588ECAEDBA12 :10DE78000003C39158495F0A58795F091449E809B2 :10DE88001800C3106C0AEEFC00A0EEF100A4F80123 :10DE980002416ED9EEFB009CF4090109E20B000E69 :10DEA800E06A01F4FC0A0D00FAE100080039E08894 :10DEB80000062FF830115C58C178EF3100ADE20C44 :10DEC800034BF60A0D0A1439E088000E50180E9C10 :10DED800F01F0019EF3900AD30012FF9EF6900ADDF :10DEE8004018C0283001EEFC0080580CC1106ED9D3 :10DEF8006C0A121AEF09004CF2091006123AC08394 :10DF08005018F01F000E30004018EF4000806E4996 :10DF18005839C1516C0A6ED9F4090109E049002841 :10DF2800E08800182FF85C58C14800008003A85802 :10DF3800800110608001109C8000DA685899C091B7 :10DF48006C0A6ED9F4090109E04900F0E08B00047D :10DF58005808C4900E9CF01F00434C385805C14027 :10DF680070081037C0E14C18201D1AD8E06802E488 :10DF78001AD84BF84BFC1AD8F01F003F2FCDC00819 :10DF88006E388B38C13870090E39C0E04B78201DC7 :10DF98001AD8E06802E81AD84B884B6C1AD8F01FD8 :10DFA80000362FCDC0086E399109EEF80098580850 :10DFB800C0403FBB6E6C5D185801C0F0EF180024DC :10DFC800201DEEC9FFFC1AD80E9AEF18001C6EAB84 :10DFD8006F7CF01F002B2FED0E9B302C6E37F01F3F :10DFE8000029C1C8EF3900382FF9EF690038EF3A36 :10DFF8000039F20A1800E08B0010EF680038EEF8DC :10E0080000945808C0600E9B6E6C5D185C5CC04143 :10E018000E9CF01F001D0E956E375807FE91FE638B :10E0280049A849B410957006C6086C4858A8C0E0BD :10E0380048E8201D1AD8E068030C1AD8495848DC6B :10E048001AD8F01F000D2FCDC00868096CD8F20847 :10E058000108E04800F0E08B004C0C976C36C4587F :10E068008000DA8C0000820C8003A8688003AAC4B0 :10E0780080039D9C800094C48003AAF08001023430 :10E088008000C97480010CEC00008220000082101E :10E098008003AB1C6A081036C0E149A8201D1AD8B5 :10E0A800E068031B1AD84988498C1AD8F01F001851 :10E0B8002FCDC0086C388F38C1386A080C38C0E0DA :10E0C8004908201D1AD8E068031F1AD8491848FCC7 :10E0D8001AD8F01F000F2FCDC0086C388B080C9B86 :10E0E800302C6C36F01F000C5806CA01C0780C9C06 :10E0F800F01F000A5807CCF1CE1B2FCDD8320000F4 :10E108008003A8688003AB4C80039D9C800094C466 :10E118008003AB748000C9748000DA8CD431202D60 :10E1280018951691784858A8C0A1189B4A2CF01F3A :10E1380000230A9B302CF01F0022C3B8780850082F :10E148007818F903001C5018F9020024797778A68A :10E15800F8F400987860189B49ACF01F00186BFC25 :10E16800580CC030F01F00186BEC580CC030F01F72 :10E178000016EAFC0080580CC030F01F00130A9B00 :10E18800302CF01F000F5804C040009C3FBB5D14AA :10E198005801C0F0201D5C72F1D3C0101AD20C9B3C :10E1A800FAC9FFF4FACAFFF80E9CF01F00082FED19 :10E1B8002FEDD832000082208000DAE88000C97490 :10E1C8000000820C8000DA6880010234D42118969D :10E1D800302CF01F00511897C5114D084D0A189999 :10E1E8007008740BC0A870DAF60A010A123AF4092A :10E1F8001720F00C172070385808CF61580CC04011 :10E20800301BF01F0048302CF01F00431897C30143 :10E218004C584C3A18997008740E37FBC178F13A8B :10E228000014EC0A1800E08B000DF60A1800E08BC9 :10E23800000970D7FC0701071237C033109CC0389B :10E24800169A12977038149B0E995808CE91580C4C :10E25800C040301BF01F0033302CF01F002F1897E0 :10E26800C5704B28F10900D42019F15900D44AF897 :10E27800F10900D42019F15900D4E06A00B0300B3C :10E288000E9CF01F002B3408EF6800143FF8EF686D :10E29800000B4A384A7A70097408F2080008950891 :10E2A800EF48006CEF480068EF48005CEF4800500A :10E2B8003008EF6800ADEF680038E0680800EF58F4 :10E2C800002EEF58002C3068EF58004AEF58004CE9 :10E2D800E0681000EF580072E0680200EF58003C58 :10E2E8003FF8EF58003A3018EF5800564928EF48E1 :10E2F800008CE068DD00EA18006DEF48009CE078CB :10E3080024F88FD9EF4800A03098EF4800A40E9C5D :10E31800D82200008000C9D40000822000008210AA :10E328008000E1240000820C000080D48002E8BC58 :10E33800000001F48000E5ECD401340CF01F000269 :10E34800D80200008000E1D4D431189714961293B3 :10E35800169578445804C0E04C98201D1AD8E068F7 :10E36800020A1AD84C784C8C1AD8F01F00482FCDC6 :10E37800C008580BC041E06600F7CB78304A140C4F :10E38800F01F0043EF560024EF08001CE8081900AE :10E39800C34110944BF84C0970064C08720B700C72 :10E3A8004BF9E06A100092082FF80C995C88F00489 :10E3B8001900F4081790C078F30E001CF00E19002D :10E3C800CF4072395809CF911899C078F30E001CC4 :10E3D800F00E1900CEA072395809CF911699C0785D :10E3E800F30E001CF00E1900CE0072395809CF91B7 :10E3F8004AB9B208EF58001C4AA84AB9700A72080C :10E40800F40800089308EF48005CF0C90001E068D0 :10E418000800EF580060EF58002CEF58002E300825 :10E428008FC88FA8E0680200EF49006CEF490050E0 :10E43800EF58003C0A9BE06C0200F01F001C5C8C4B :10E44800F808100AEF5800583018EF430090EF58BA :10E458000056EF5C003C30288F48495972080E3846 :10E46800C0316E38C2C849399308C26870390E394C :10E47800C221490993086E399139C2288003A868D6 :10E488008003AB9C80039D9C800094C48002E73687 :10E498000000820C0000821400008220000001F8B5 :10E4A80000008210000001F48000D95C0000821C8A :10E4B8000000821812985808CDA148D9930848D866 :10E4C80070098F3991073019201D30081AD9109A10 :10E4D8003029109B0E9CF01F00082FEDEDDCC008C2 :10E4E800C0410E9CF01F00050C9CD8320000821819 :10E4F8000000820C8001035080010CECD421189795 :10E5080078465826C390E08B00075806C0C05816B6 :10E51800C071C2785846C370C3635876C3C030060A :10E528000C97C4184A8972081838C0317838C1085D :10E538004A699308C0A870390E39C0614A399308EE :10E548006E399139C06812985808CF6149F9930813 :10E5580030080E9B8F38302C1097F01F001DC0A874 :10E56800189B49CCF01F001C0E9B303CF01F001874 :10E5780030070E96C188189B498CF01F00170E9B18 :10E588000C9CCF5B301BF01F0016EDDCC008C0B13F :10E598003058C088301BF01F0012EDDCC008C031B5 :10E5A80030988F4858075F193008F00618005F0A3E :10E5B800F5E90009F0091800C0400E9CF01F000999 :10E5C8000C9CD8220000821C000082188000C974AC :10E5D800000082148000DAE80000820C80010A0042 :10E5E80080010CECD421169C1497580AC08094CB57 :10E5F800F01F00070E9CF01F0007D82A5809C030EA :10E60800149CD822F01F00045C5CD8228000D984B6 :10E618008000D13C8000E504D42149887007C2A855 :10E62800EEFB0084580BC140169AEEF8008C58088F :10E63800C06030090E9B6E6C5D18C078169A1099F0 :10E648000E9B109CF01F000E5C5CEFFC0A21EF385B :10E658000026EDB80000C0D1A1B80E9CEF680026D6 :10E66800F01F0008EF380026E018FFFCEF680026CE :10E678006E375807CD61D8220000820C8000E5EC87 :10E6880080010CECD401F01F0007487913882FF89B :10E698005C58B288EDB80000C031F01F0004D80201 :10E6A8008000E620000073148000DCCCD4314A6876 :10E6B80070063058ED3E000C2EC6A58EF00E1900DF :10E6C800E0880040205E3008A36E30175C8E302151 :10E6D8003042E7DEC010E06401FFE0650200C2E8F6 :10E6E800F5D8C010EC0A070BEE0B1800C080C293D7 :10E6F800EC0A0009E20B1800C1B1C0382FF8C1D8E4 :10E70800139BE40B1800C1D12FDA063AC1A413BA3F :10E718002FC813A95C88F5E910895C89F2CA000141 :10E72800E80A1900EA0917B0F959003CC0781399AA :10E738005809C070F20800085C88FC081900CD135D :10E74800D832000000007318D4217848189616971C :10E75800F138000DEDB80000C1C1169C3007F01F5C :10E768000020C368F138000DEDB80000C0E16C4826 :10E77800F13A000CF139000DF3EA1089A1A9F16909 :10E78800000DA989F169000C6E07F01F0016C0285A :10E7980049555807C1D06E4811C411DBB16BF7E475 :10E7A800118B11E48EEEF7E4108B6A0A8CE911F4F0 :10E7B8000E9CE9EB100B16191409F20E010ECD3759 :10E7C800C098141B6C1CAC6B5C7BF01F00088D0799 :10E7D800D8225809FE99FFF7CFBB00008000DA68FD :10E7E8008000DA3C0000731C8000D210D4314C58F1 :10E7F80018971188EDB80004E081020C79994C282B :10E80800F90C006070086FAAF208010BC186103974 :10E81800C0614BE87008F4080108C1164BB87008CD :10E82800103AC2914BA87008F139000FF138000E68 :10E83800F3E81088F8081900E088001E4B487009B2 :10E84800F338000FF339000EF1E910884AE972092C :10E858005C88EF490064EF5800604AC97209EF49C3 :10E8680000685808C080EF3900AC3008F00918007B :10E87800EFF81EAC4A586F497008F009010B580BA5 :10E88800E089004C3006EF5600704A2B960BEC0BD3 :10E898001900C3215C7CEF160060F80A000A6FAC0F :10E8A800EC0C000C143CC281EF0A003AF60A19007D :10E8B800C2351039C211EF3800542FF85C58EF6890 :10E8C80000543039F2081800E088000FEF090056AC :10E8D800EF08003C12085C88F2081900E088014A39 :10E8E800EF580056C469F2081800E08101430E9CF5 :10E8F800F01F0009C3E93008EF680054C3A90000FD :10E90800000073280000731C0000732400007318B3 :10E91800000073208001016A5CD91009E08600D1EB :10E928006F7912185808E08900CCEF380026EDB846 :10E938000002C081A3C8EF680026EF080058EF580E :10E948000056300A4D39EF6A004E720BEF6A0054D8 :10E9580072096F48EF490050F6080108EF09007284 :10E96800EF580070F2080008EF09004AEF580072EB :10E97800EF080048A358F2080008EF58004C6E480A :10E988005838E0880066EF080056EF090058F0098B :10E998001900E0880006EF09003C1009C0A8EF192B :10E9A800003CB339F7D8C010F20B0C0AF408000980 :10E9B8005C89F0091900E088004CEF590056C488BA :10E9C8006C08EF030074EF48007C6C1CF01F0032E9 :10E9D800F8031900C0E24B18201D1AD8E06803B3E9 :10E9E8001AD84AF84AFC1AD8F01F002F2FCDC008B1 :10E9F800EF0800705808C09020186C49F339000DD2 :10EA0800EDB90000EFF80C38EF0300746C1CF01F30 :10EA1800002218130C9CEF530074F01F0024EF0819 :10EA28000074EA081900C1606FF85808C1316FE82E :10EA38005808C1014998201D1AD8E06803BF1AD8A0 :10EA480049B8498C1AD8F01F00182FCDC0084914AE :10EA580030056FF65806C2D06C4811CBF139000D5D :10EA6800F3D9C0025F1A11D9B169F3EB118911EB1F :10EA7800F3EB108911F81248680912188CE9F409A7 :10EA8800000912085808FE9AFF9DE08F045F0000F5 :10EA9800000073248000CD0C8003AC608003ACA818 :10EAA80080039D9C800094C48000DA3C8003ACD035 :10EAB8003FF8EF58003A3008EF680038C5A830082A :10EAC800EF580070C5686C08EF030074EF480078D1 :10EAD8006C1CF01F0021F8031900C0E249F8201D42 :10EAE8001AD8E06803E01AD849D849EC1AD8F01FB8 :10EAF800001E2FCDC008EF0800705808C0902018DD :10EB08006C49F339000DEDB90000EFF80C38EF034C :10EB180000746C1CF01F001018130C9CEF53007449 :10EB2800F01F0012EF080074EA081900C2406FF8DD :10EB38005808C2116FE85808C1E14888201D1AD842 :10EB4800E06803EA1AD848A8486C1AD8F01F0006EB :10EB58002FCDC0088000CD0C8003AC608003ACA82A :10EB680080039D9C800094C48000DA3C8003ACD074 :10EB78004C5430056FE65806C2106C4811CCF13978 :10EB8800000D11DAF3D9C002B16AF5EC118A11EC63 :10EB980011F858095F1B6809F5EC108AF1EA100AA8 :10EBA8008CE8F20A010AF6080008F4080108C066B1 :10EBB8006F7810195809FE9AFF886F085808C29094 :10EBC8004B196F1A7209F4090109C2374AFB760B0F :10EBD800EF0A0048F6080108F40B140316185C88BD :10EBE800F00A000A5C8AEF09004AF40B14035C4837 :10EBF800EF5A0048F20A14021419F2080008F6083D :10EC08000009EF58004AEF59004C3008EF4800401F :10EC180049F84A09900A6EA8580AE0800381720BE5 :10EC2800F60911FF1009E08600B15C7AF0C9FFFF10 :10EC38001619F20A010A580AE08900A849697216E9 :10EC48005806C0E14958201D1AD8E06804461AD869 :10EC58004938494C1AD8F01F00142FCDC008F00BC2 :10EC6800010BE04B7FFEE08A002348C8201D1AD81C :10EC7800E06804471AD848D848AC1AD8F01F000AE8 :10EC88002FCDC008000073240000821000007320FC :10EC98000000731C000073348003AC608003ACF088 :10ECA80080039D9C800094C48003AD008CD81638E6 :10ECB800C3148C48F3D8C0101639C0E44AB8201DD4 :10ECC8001AD8E06804491AD84A984AAC1AD8F01FEA :10ECD800002A2FCDC0081618300A5C88C058AC48E6 :10ECE800AC5A121B6C068CD91639CFA55C3B0C9C10 :10ECF8005C8BF01F0022C21049C8201D1AD8E0689A :10ED080004561AD849E849BC1AD8F01F001B2FCD61 :10ED1800C0085C3B0C9C5C8BF01F0018C0E04938B5 :10ED2800201D1AD8E068045B1AD84958491C1AD81B :10ED3800F01F00112FCDC0086C1A4929932A492ABF :10ED48006EA8740B926C9508F80B000A101AB26A38 :10ED5800F00A16187249B2F8B2CAF5D8C208F1D842 :10ED6800C108B2DAB2E8C1B88003AC608003AD1064 :10ED780080039D9C800094C48000CDD48003AD2086 :10ED8800000073340000731C101BC097EF38002676 :10ED9800A1B80E9CEF680026F01F00424C256EA912 :10EDA8006A08F009010AE08602B7F0CAFFFFEF1B04 :10EDB800002C121A161A580AE08902AE1039E0819E :10EDC80001F54BA8906A7048F139000DF3D9C002DB :10EDD8005F19F40900094B6AB409EF0A002CF20A1A :10EDE8001900C462F13A000CF139000DF3EA1089F8 :10EDF8005C89EDB90000C081E219FFFEF169000DE0 :10EE0800A989F169000C4A98EF0A002CB06A704988 :10EE1800F339000DEDB90001C031201AB06A4A3645 :10EE28008CEB6C1CF01F00238C696C48F138000DCA :10EE3800F1D8C0025F18F208000849D9B20849A9F8 :10EE480072095C78EF1A002C12086EA9F4090009FF :10EE58001238C0E04988201D1AD8E068048B1AD8F7 :10EE68004968497C1AD8F01F00172FCDC008EEF664 :10EE780000805806E08000BE48C46848F138000D9C :10EE8800EDB80000C080C4B8109C7008EF4800803E :10EE9800F01F000DEEF800805808CF71CAA80000D6 :10EEA80080010CEC0000731C000073340000732018 :10EEB8008000D2108003AC608003AD3480039D9C39 :10EEC800800094C48000DA3CF138000DEDB80000F1 :10EED800C1F16848F139000DF13A000CF3EA108AE3 :10EEE8005C8A1499A1A95C79F20B1608EDBA0001A5 :10EEF800C0F0F169000DF16B000C68488869F138C1 :10EF0800000DF1D8C0025F18F2080008A6086C05C9 :10EF18000A96F01F00455805C041C6984C324C432C :10EF28006C4811C5868A11D9B169F3E5118911E5D3 :10EF38008CEBF3E510890C9C11F5EBE91009F40949 :10EF48000109640A1409F20B010BCBF7E08F0201E7 :10EF58004B89EEF80080704811FB11C511DC11E8EF :10EF6800B16CF9E5118CF9E81088F7E81008F00A97 :10EF7800010A5C8AB26A7248F138000DEDB80001E6 :10EF8800C031201AB26A4AB58AEB6A1CF01F002AFF :10EF98008A696A48F138000DF1D8C0025F18F20892 :10EFA80000084A39B2085C784A097209F009000A6F :10EFB800EEF80080704811FB11CC11D911E8B16945 :10EFC800F3EC1189F3E81089F7E91009123AC0E067 :10EFD80049A8201D1AD8E06804C31AD84988499C52 :10EFE8001AD8F01F00192FCDC0080C95EF450080E6 :10EFF80048F848E9908A7209F40900098FA990082D :10F00800EF09002CF0091900C22248C8201D1AD89F :10F01800E06804CD1AD848D848AC1AD8F01F000ABE :10F028002FCDC0088000DA3C0000731C000073205C :10F03800000073348000D2108003AC608003AD6C94 :10F0480080039D9C800094C48003ADA810190E9C79 :10F05800EF59002CF01F004A4CA8300A7019924B47 :10F06800F40B1900C0504C8A9509300991194C5875 :10F078007048F138000DEDB80000C5B14C3913885F :10F08800A5B8B288C56881098CEAF13B000DF7DBA9 :10F09800C0025F1BF60A000A14098FA9EF0A002CA8 :10F0A800F138000D8C69F1D8C002F7D9C0105808A2 :10F0B8005F1EF9DAC010FC0B000B163CC0E44B488D :10F0C800201D1AD8E06804F21AD84B284B2C1AD8FD :10F0D800F01F00322FCDC008F409010958085F1845 :10F0E800F20801080E9CEF58002CF01F00256C1B3D :10F0F8009648E2081900C090680C580CC040F01FF0 :10F108000028C028890B8D126C48F138000DEDB825 :10F118000000C0810B88A5B8AA886E485848EFF34C :10F128000A046C080C9CEF480080F01F001EC07891 :10F1380049D030014944300249453073EEF6008029 :10F148005806C1006C4811CB11D9B169F3EB11898C :10F1580011EB6EAAF3EB108911FBF7E910091439CA :10F16800C930EF380026EDB80000C041A1C80E9C98 :10F17800CE68A1A8EF680026D83200008000D5FE2E :10F18800000073340000732C000073298003AC6006 :10F198008003ADC880039D9C800094C48000CD345A :10F1A8008000DA3C0000731C0E9CF01F0040EEF655 :10F1B80000805806C0714BECF01F003EEF4C0080F9 :10F1C800D8326A093005F2CCFFFF6C4811CB11DA4E :10F1D800B16AF5EB118A11EBF5EB108A11FBF7EA2E :10F1E800100A1439C1214B2C8C689869F009190050 :10F1F800E08800B4F01F002FE08000B05805EBFC59 :10F208001A00EFFC0A20C0D85805C0D1F20A010B39 :10F21800C4574A7CF01F0027E08000A0EF4C008014 :10F228000C9BC3986A4B17F417C217D317EBB1633B :10F23800E7E21183E7EB108BE9EB100B5CDB120BB9 :10F24800C2D6F80A010B580BE0890029498CF01F37 :10F2580000191897E08000826A4811F911CA11DB79 :10F2680011E8B16BF7EA118BF7E8108B4928F3EB3B :10F27800100B70088AE9101916095809E08A000964 :10F28800F00B010B6A1CAA6B5C7BF01F000C8B0750 :10F298000C9B0E9CF01F000AD8326C0B0C95580B77 :10F2A800C1001696C93B000080010BF000007334C2 :10F2B8008000DA080000731C8000D2108000E7503C :10F2C80014195809E08A004AF138000DEDB8000019 :10F2D800C4404A3CF01F00238D0CC3F06C4811F960 :10F2E80011CA11DB11E8B16BF7EA118BF7E8108B43 :10F2F80049D8F3EB100B70088CE910191609580956 :10F30800E08A002CF00B010B6C1CAC6B5C7BF01FD3 :10F318000017D8320E9CF01F0016D832720BF60870 :10F328000109C0A62FFBEF19002CF60801081218D6 :10F338005808E08A00130E9CEF380026A1B8EF6841 :10F348000026F01F000CD8323008FE9FFBB4580985 :10F35800FE99FE00FE9FFE4BD83200000000733479 :10F368008000DA080000731C8000D21080010BF0C6 :10F3780080010CECD4314B86ED0800922FF87819F7 :10F388004B65ED5800928B091388F1D8C004F20838 :10F39800002818971693109C4B148908F01F003109 :10F3A8006A080E9C118BF7DBC004A36B5C3BF01F53 :10F3B800002EC0718E493138F0091900E08B000B1E :10F3C8004A580E9CF109009A2FF9F159009AE08FDA :10F3D80003026A0C069B2F0CF01F0024C0B16A0AB6 :10F3E800FC19E000F5380010B968E618F00012388A :10F3F800C0A149980E9CF10900A02FF9F15900A06D :10F40800E08F02E9F4CBFFF48EC830692F0A0E9C16 :10F41800F01F00175C8CC080ED0800980E9C2FF838 :10F42800ED580098C11868080E9CF13B000CA58B9C :10F43800F60B10FCF01F000CC1C0ED08009A0E9CE2 :10F448002FF8ED58009AED0800962FF8ED58009621 :10F45800E08F02C6000080D40000733000007318EB :10F468008000D67C8000CDD48001255880011E2CD8 :10F47800680811CA11D9B169F3EA118911EAF3EAE6 :10F48800108911FAF5E91009F20A1618B0CAF5D967 :10F49800C208B0F9B0DAF5D9C108B0EA4B28910929 :10F4A8006808F1390008F13A0009B16AF5E9118AEA :10F4B800F139000AF5E9108AF139000BF3EA100A6C :10F4C800F4091618F1690008F3DAC208F16A000BAA :10F4D800F1690009F3DAC108F169000A4A386804D9 :10F4E800910AE938000DF5D8C002F1D8C0064A0BD8 :10F4F800B6884A086A09580A5F1A8E4514055C8559 :10F50800B00549D87006CA586C485808C0E149B8CF :10F51800201D1AD8E06800B71AD84998499C1AD80B :10F52800F01F00192FCDC00858A8C0E14938201D88 :10F538001AD8E06800B81AD84948492C1AD8F01FD8 :10F5480000122FCDC0085818C24148C8201D1AD82B :10F55800E06800B91AD848E848AC1AD8F01F000A81 :10F568002FCDC0080000731C00007324000073280E :10F57800000073200000820C8003AC608003ADF0B3 :10F5880080039D9C800094C48003AE188003AE4421 :10F59800098A0998F1EA1088ED0A0024F00A19008E :10F5A800C56109AA09B8F1EA1088ED0A001CF00A39 :10F5B8001900C4D1F33A000CF338000DB168F1EA30 :10F5C8001188F33A000EF1EA1088F33A000FF5E8D3 :10F5D80010086C1A103AC3B1F33A0010F33800114E :10F5E800B168F1EA1188F33A0012F1EA1088F33AA7 :10F5F8000013F5E810086C0A103AC2916C380C3800 :10F60800C0E14CA8201D1AD8E06800C21AD84C885E :10F618004C8C1AD8F01F00482FCDC008580CC06079 :10F6280099384C6870098D3991066C380C38E0812E :10F6380001A14BE8201D1AD8E06800C81AD84C0868 :10F648004BCC1AD8F01F003C2FCDC0080C9C6C3650 :10F658005806FE91FF5BE08F05296C4858A8C0E06A :10F668004B28201D1AD8E06800D21AD84B584B1CDA :10F678001AD8F01F00312FCDC008098B0998ED0A60 :10F688000024F1EB1088F00A1900C77109AC09BB16 :10F69800ED08001CF7EC108BF6081900C6E1F33CE6 :10F6A800000CF33B000DB16BF7EC118BF33C000E33 :10F6B800F7EC108BF33C000FF9EB100B6C1C163CAD :10F6C800C5C1F33C0010F33B0011B16BF7EC118B93 :10F6D800F33C0012F7EC108BF33C0013F9EB100B22 :10F6E8006C0C163CC4A1498B178CEDBC0002E08061 :10F6F800013AEDBC0001C2D1494B6CAC760BF60C5B :10F70800010CC2D6ED14002C081C580CE089002806 :10F718005C7A201D5C751ADA48DCEA0B000B5C7811 :10F72800F2CAFFF0780CC7688003AC608003AE6C47 :10F7380080039D9C800094C40000820C8003AE98D6 :10F748008003AEC4000073280000731C00007324FB :10F75800EDBC0000C0414CC870088DD84CB8900969 :10F768003008F0091900E08000FEED3800260C9CF6 :10F77800A1B8ED680026CF486C365806FE91FF6F99 :10F788004C3870050C98CF286A0A580AC130F33CE7 :10F798000010F33B0011B16BF7EC118BF33C001236 :10F7A800F7EC108BF33C0013F9EB100B163AE081E1 :10F7B80000DC09AB09BAF5EB108AEB0B001CF40B63 :10F7C8001900E08100D25808C0706A3991394B0895 :10F7D80070098B3991054AF81188EDB80004C1F118 :10F7E8004AD8700913AB139A13B8201D1389F1EB8B :10F7F8001088F5E910894A5B1AD9968C4A794A8BA0 :10F808007209760BF2CAFFF0F80B000B4A5C780C11 :10F818002FFC2F49F01F00242FEDCA48EDB8000136 :10F82800E08100A1EB3C0014F01F00201896C08175 :10F8380049F8F109009C2FF9F159009CC938497819 :10F848007008F0C9FFF0C0311298C108F1390013EF :10F85800F13B0010F13A0011F1380012B16AF5EBF2 :10F86800118AF5E81088F3E810088D08EB08001CE9 :10F87800ED58001C48987008F0C9FFF4C1A112980F :10F88800C27800000000821000007320000082147B :10F898000000732800007318000073300000731C08 :10F8A80000007324800102348000E1D4000080D479 :10F8B800F139000FF13B000CF13A000DF138000E60 :10F8C800B16AF5EB118AF5E81088F3E810088D188D :10F8D8004C587008118B1199F3EB1089ED590024DD :10F8E80030398D494C197209F2CBFFFF8DCB8DABA6 :10F8F800F13B000FF138000EF7E81088ED5800587A :10F90800ED5800608A48E2180199AC486A684B8A49 :10F918002019740C8D688D3C6A889506ED49006441 :10F928008D880C9CF01F0033ECCBFFFCED1C003CD9 :10F93800F01F00313019ED5C003C201D30081AD949 :10F94800109A3129109B0C9CF01F002C2FED5C5C49 :10F95800C0600C9C300BF01F002AC0480C9CF01FA4 :10F9680000290E9CC3C80A986A355805FE91FF0EF7 :10F9780049D56A08F13C000DF9DCC006F01F0022E9 :10F988005806E08003504A188E4A6A09911791492F :10F99800B06A30096E1A9109912A49D8910949D853 :10F9A800B089ECFA0084580AC3C0ECF8008C5808F7 :10F9B800C0500C9B6C6C5D18C06810990C9B109C17 :10F9C800F01F00155C5CC041ED4C0084C2A80E9C81 :10F9D8004928F10900962FF9F1590096F01F0010F7 :10F9E800D8320000000073180000731C0000820C5D :10F9F8008000E6B48000D95C800103508000E124D7 :10FA080080010CEC8000D67E000073340000732C5B :10FA1800000073298000E5EC000080D48000D13C10 :10FA28004A9891064A981188EDB80002C3216C489B :10FA38005828C0814A6870096D781039E081026BD6 :10FA4800C1D84A49720A6CA9F4090109E08602631F :10FA5800ED1A002C14195809E089025DE08F032182 :10FA680049D8201D1AD8E06802271AD849B849CCC5 :10FA78001AD8F01F001C2FCDC00849B91388A3B8A5 :10FA8800B288ED380026A1C8ED680026E08F024351 :10FA9800EDB80001C0616C4820285818E08B00A21E :10FAA800492870088DD830080C9CED6800ADF01F0F :10FAB80000106C4820285878E08B022D48D9F208AD :10FAC800032F000000008224000073280000732424 :10FAD8000000731C8003AC608003AEF480039D9C1F :10FAE800800094C400007329000082108000E6B4EE :10FAF8008003AC404CF811891298E218001259287A :10FB0800C7A14CD8700A6DF8704811FB11C711DCF9 :10FB180011E8B16CF9E7118CF9E81088F7E81008DA :10FB28002FF8103AC681ED0800722FF8ED580072D0 :10FB38004C287008ED4A0050F0CA00012FF88DC813 :10FB48008DA84BF87008F139000FF138000EF3E872 :10FB58001088ED5800603048ED4A00648D48EC0884 :10FB6800000BED1C003CF01F00375C8CF808100AF5 :10FB7800ED5C003CED580058ED0900563018F009CE :10FB88001900C021A17CED5C0056ED0800745808EE :10FB9800C0E14AD8201D1AD8E06802591AD84AB8D4 :10FBA8004ABC1AD8F01F002B2FCDC00820186DFCB6 :10FBB800ED5800747808ED48007C5808F9B800FF43 :10FBC800F9B80100EDF81E4EED58003AF01F00227A :10FBD800ECF800905808C050300A0C9B6C6C5D180B :10FBE800ED380026A1B80C9CED680026F01F001B1C :10FBF800E08F0191EDB90004E081018D4908700999 :10FC080013AB139A13B8201D1389F1EB1088F5E98B :10FC18001089493B1AD9968C4929488B7209760B69 :10FC2800F2CAFFF0F80B000B483C780CC7980000AC :10FC380000007328000073240000731C0000731870 :10FC48008000D95C8003AC608003AF1480039D9C66 :10FC5800800094C48000DA3C80010CEC0000732022 :10FC6800000073304C281188EDB80004C5E14C1829 :10FC7800700C6D485CD81808C3D66D78F808010870 :10FC88005808E089003830488D486C885808C0E129 :10FC98004B98201D1AD8E068027E1AD84B784B8CF6 :10FCA8001AD8F01F00382FCDC008300A0C9B6C6C96 :10FCB8005D185C5CC0700C9C301BF01F0033E08F3B :10FCC80001A7ED0700560C9CF01F0030ED080070EE :10FCD8005808F9B901FFF1D9E108EDF81C383019D5 :10FCE800ED08003CF2071900C021A178ED58005634 :10FCF800C2E84A78700913AB139A13B81389F1EB69 :10FD08001088F5E910894A3B201D1AD94A29968797 :10FD180072094A2BF2CAFFF0760BEE0B000B2F4943 :10FD2800F01F001F2FEDCF68EDB80001E08100F350 :10FD380049A870096CA820181039E08100EC0C9CC7 :10FD4800F01F0018CE780C9CF01F0010496811882D :10FD5800EDB80005E08100DFED380026A1B80C9C65 :10FD6800ED680026F01F00113078CC1800007328C9 :10FD7800000073248003AC608003AF2C80039D9C3B :10FD8800800094C48000E1248000E7F40000731828 :10FD980000007320000073300000731C80010234DF :10FDA800800101000000732980010CEC0C9CF01FFD :10FDB800003E4BE84BE91188E2180020C2D01388B6 :10FDC800EDB80004C1F14BB870096D781039C1A1C4 :10FDD800ED380026A1B80C9CED680026F01F00360F :10FDE8000C9CF01F00364B6972080C38C5604B59E3 :10FDF8009308C05870390C39C69012985808CFB17A :10FE0800C6D8ED380026A1B80C9CED680026F01F76 :10FE1800002A3088C6C81388EDB80004E081007B4A :10FE28004A4870096D781039C7513068C6080C9C6B :10FE3800F01F001D49D81188EDB80005C6B1ED388E :10FE48000026A1B80C9CED680026F01F001B0C9C36 :10FE5800F01F001A49A972080C38C1F04999930893 :10FE6800C05870390C39C32012985808CFB1C368EC :10FE78000C9CF01F000D48E81188EDB80004C4A1DF :10FE880048C870096D781039C4510C9CF01F000BDC :10FE980048B972080C38C0316C38C21848999308B0 :10FEA800C1B800008000E7F400007329000073283F :10FEB8000000732480010CEC8000DA8C0000820CB6 :10FEC8000000821870390C39C0614C0993086C39EC :10FED8009139C06812985808CF614BC99308300807 :10FEE8008D384BB870098D39910630A88D48C128D6 :10FEF8000C9CF01F00384B881188EDB80004C0A195 :10FF08004B6870096D781039C0514B591388A5A8F2 :10FF1800B2884B381188EDB80003C091ECF800980E :10FF28005808C0803FAB6C6C5D18C048EDB8000441 :10FF3800C0A10C9B4ABCF01F002C0C9B302CF01F5E :10FF4800002BC658ED0A0070580AC090ECF80088DB :10FF58005808C0505C7A0C9B6C6C5D184A48700855 :10FF68005808C24049C91389EDB90003F1F9080DD1 :10FF7800F9BA0001F3DAE039F1F90E0D49CAECF8E3 :10FF8800008C5808C070740A30090C9B6C6C5D18A2 :10FF9800C0781099740A0C9B109CF01F00165C5CCA :10FFA800C05049387008ED48008448D81188EDB829 :10FFB8000005C271ECF8008C5808C1D030090C9BC0 :10FFC800129A6C6C5D18C1D800008218000082205B :10FFD8008000E7F4000073280000732400007329F0 :10FFE8000000820C8000DAE88000C9740000732CDD :08FFF8008000E5EC10990C9B60 :02000004800179 :10000000109A109CF01F002E30094AE80C9C9109B0 :10001000F01F002D30064AB891064AC76E1C580CD6 :10002000C330F01F002B8F16C2F86A0BF738000D93 :10003000EDB80002C2604A78F10C00A02FFCF15C20 :1000400000A0F10C00962FFCF15C0096179C17A6FF :1000500017B8178BF9EB108B201D49F972091ADBC1 :1000600049EB968CF2CAFFF0F1E6108849CB2F4994 :10007000760BF80B000B49BC780CF01F001B2FED22 :100080000E9CF01F0013F01F0019C1714988201D3C :100090001AD8E06801771AD84968497C1AD8F01F45 :1000A00000172FCDC0085808FE90FCE0FE9FFCEB27 :1000B00049387006FE9FFB67D83200008000E5ECEF :1000C0000000822480010CEC000073348000D13CDD :1000D000000080D400007330000073200000731C07 :1000E00000007324800102348000D6B48003AC6029 :1000F0008003AF4080039D9C800094C40000822058 :10010000D42179F95809C3107208F8CEFF88F9484C :10011000007C79E8C038109E70085808C1C0704B48 :1001200017F617C417D5B165EBE41185724A17EBC2 :1001300015F7EBEB108B15C5EDEB100B15D615EA8B :10014000B166EDE51186EDEA108AEFEA100AF60ACB :10015000010ACE2693089D093008F9480040F93875 :10016000004E2FF8F968004ED822D42179F95809A9 :10017000C600F9380026EDB80002C5B07208F8CE06 :10018000FF88F948007C79E8C038109E700858084C :10019000C1C0704B17F617C417D5B165EBE41185D4 :1001A000724A17EB15F7EBEB108B15C5EDEB100B47 :1001B00015D615EAB166EDE51186EDEA108AEFEA8B :1001C000100AF60A010ACE26930830089D09F9485C :1001D0000040F938004E2FF8F9090056F968004E32 :1001E000F5D9C02FF9080060F7D8C02FF009190021 :1001F000F60817B0F4081780F9580058F908003CC1 :10020000F00915015C78A178F91A0058103AF9F94B :100210005C2CF9380026A3A8F909003CF9680026EF :10022000F20815011009F90800581009F95900568B :10023000D822D703D43118941693149112921096A1 :100240004097300A314B301CF01F00391895C6D04A :1002500098593138F0091900E08B000F4B58201DD8 :100260001AD8E068031F1AD84B384B4C1AD8F01F25 :1002700000342FCDC0080E9878175C78AEB8A988E6 :10028000AEA8E0685014EF68000DA988EF68000C74 :10029000E8081618AEC8F1D4C208AED8E608161899 :1002A000EF680008F1D3C208F3D6C010EF68000968 :1002B000AE993088A9893006AEF4EF63000BAE89A1 :1002C000EF66000FEF660012EF660013EF66001096 :1002D000EF660011EF68000E3069049A029BE9D4C2 :1002E000C108E7D3C108AEE4EF63000A98C8F01F65 :1002F00000155C7CEF6C0011A98CEF6C0010201DC8 :10030000491C30671AD70C98F9070090049A2FF708 :10031000029BE06900FFF95700900A9CF01F000B58 :100320000A9CF01F000B2FEDD83200008000D3187C :100330008003AF5C8003AFA480039D9C800094C4C5 :1003400080011E2C000080D4800122948000D13CCA :10035000D43120BD14915098414A505A12961897A2 :100360003009F20119005F08F20A18005F0AF1EA89 :10037000000AF20A1800C110F3D6C002C0E14C789E :10038000201D1AD8E06800AD1AD84C584C5C1AD819 :10039000F01F00452FCDC008580B5F195089126817 :1003A000C0E04BE8201D1AD8E06800AF1AD84BF81F :1003B0004BCC1AD8F01F003C2FCDC008EF080072BC :1003C000E2081900C0B2EF380026EA18FFFFE8186B :1003D000FF80EF680026E08F02E34058F3D8C001A9 :1003E000E2180002F9B8010CF009002950296FB099 :1003F000EF02007431F8F0021900E08800144AC8D6 :10040000F109009C2FF9F159009CE06C00FFEF38D6 :100410000026EA18FFFFE818FF80EF680026E08F4B :1004200002C36FF85802C2605808C1404028A38830 :100430002FB8AD685C883003503B50A8F7D1B0109E :10044000409A504BF5DAC001069406980695506A1A :10045000C3796FE85808CEB14908201D1AD8E06862 :1004600000D01AD8493848FC1AD8F01F000F2FCDF9 :10047000C0085808C0416FE85808CD904878201D42 :100480001AD8E06800D31AD848B8486C1AD8F01FB8 :1004900000062FCDC00800008003AF5C8003AFD4FE :1004A00080039D9C800094C48003B028000080D409 :1004B0008003B0688003B0A450195008EF03003CDB :1004C000304CF01F0042401918954008E080023C73 :1004D000300B990B991B5809C0301894C118580853 :1004E000C0E14BB8201D1AD8E06800EF1AD84B982D :1004F0004B9C1AD8F01F00392FCDC008910C5C73AB :10050000402A4069E60A010840435C73E6080D434F :100510005C835809C3904028300AE608000B149CFD :100520005C7BF01F002F8B1CE080020EF5D3C01007 :10053000402B98D9F40B00081039C0E44A48201D1C :100540001AD8E06800FF1AD84A684A3C1AD8F01F47 :1005500000232FCDC008501AF01F0023401A18980E :1005600040895809C0A0402B6A195008721C160C0B :10057000403BF01F001E4008F00200026A185C8237 :1005800070188B28C3D8406A402B149CF01F0014AD :100590008B1CE08001D9F01F0014407AF8020002A1 :1005A0005C82580AC2D0F7D3C010301A303CF01F1A :1005B000000C189B6A1C580BC1C1F01F000D40694C :1005C0008B19E08F01C100008000C9D48003AF5CAB :1005D0008003B0D880039D9C800094C48000D31811 :1005E0008003B0E88000CD0C8002E7368000D13C6B :1005F000403897182FF28B285C82F01F003F320B97 :10060000F6021900E08B01A0AA63314B6A1CF01FAF :10061000003BC0904BA8F10900A42FF9F15900A4A8 :10062000E08F0192EF39001C6A1870188B48B0896E :10063000EF39001DB099EF3900246A48B0A9EF39AD :100640000025B0B9E00916186A48B0C9F3D0C2084D :10065000B0F0B0D9F3D0C108B0E96A48F16C00132A :10066000F16C00126A48F13A000CF139000DF3EA1E :100670001089E019FFC0EDE910095C79F169000DFE :10068000A989F169000C405AEB6A000E404806182F :100690005C88F3D3C0105048403B6A48120B503B73 :1006A00040AA1200F139000DF3D9C006F5E910098E :1006B0005C79F169000DA989F169000C0A98300A8A :1006C000404BF40B19005F1B507B169A58045F09CE :1006D000300B124AF60A1800FE91FEF0F5D2B01067 :1006E000503A6FE05800E08000C260085808C0909F :1006F0001090CFCB8000CD348000CDD4000080D4CA :1007000080EA6048F139000DF3D9C0025F1B140B79 :10071000E08000C45809E08100C1F7D6C0025F0C38 :10072000301BF60618005F0BF9EB100BF20B1800EC :10073000E08000B488EBEF19003C140B123BE08919 :1007400000ADE13B000EE939000EF20B1800E0812C :1007500000A5684911FE13FB504B11CC11DBB16BA6 :10076000F7EC118B11ECF7EC108BFDEB100B160A6C :1007700013CB13D8B168F1EB118813EB4049F1EBBF :100780001088F3E81008103AE08100884028681CBF :10079000F00B11EC5C8BF01F0037C0E04B68201DA4 :1007A0001AD8E06801691AD84B484B5C1AD8F01F78 :1007B00000352FCDC0086818905AF80A1900C0A15A :1007C00070098919910C4032109C20125C82F01F34 :1007D000002EF1D6C001681BC220580BC05188689A :1007E000F6081900C0E04A48201D1AD8E0680177D1 :1007F0001AD84A684A2C1AD8F01F00222FCDC008F8 :100800006048F13A000CF139000DF3EA1089A1A912 :10081000F169000DA989F169000CC1E8580BC050BD :100820009659F0091900C0E14938201D1AD8E0682E :10083000017A1AD84968492C1AD8F01F00122FCD16 :10084000C008601CF01F001380698868F208000867 :10085000A068680881080835E0051700E1F3020682 :10086000089B304CF01F000CC198EF440078C16821 :100870008000CDD48003AF5C8003B11C80039D9CBD :10088000800094C48000D13C8003B1308003B1501B :100890008000CD348000C97481040C98EDB600014D :1008A000C040EDB60000C0312FF15C81EDD6C00133 :1008B000EFF81826F9B90120F1D9E138EFF81E2632 :1008C0006FB9F1D1C010F2080008EF520074EF4880 :1008D000006CEF0800720218EF5800725802C14015 :1008E0006FF85808C1116FE85808C0E14AF8201D98 :1008F0001AD8E06801A11AD84AD84AEC1AD8F01FD1 :10090000002E2FCDC00858055F193008F0031900DC :100910005F1AF5E90009F0091800C4406A48580850 :10092000C410409CE21C0002C3D1F13A000CF13922 :10093000000DF3EA1089A3B9F169000DA989F169E5 :10094000000CC318EF380026EA18FFFFE818FF80F4 :10095000EF6800264998F109009C2FF9F159009C95 :100960005804C040089CF01F0016EF0900743008BE :10097000F0091900C1406FF85808C1116FE8580814 :10098000C0E148A8201D1AD8E06801B41AD84888E8 :10099000488C1AD8F01F00082FCDC008E06C00FF6B :1009A000C028300C2F5DD8328003AF5C8003B16467 :1009B00080039D9C800094C4000080D48000DA688D :1009C000D421784E1298587E5F07584E5F09EFE9A0 :1009D0001009C081582EC060583EC040E06C00F83D :1009E000D822580AC031149CD822201D30095C7AC4 :1009F0001AD9F01F00032FED5C5CD8228001035050 :100A0000D4013008201D109A16991AD8149B30185A :100A1000F01F00032FED5C5CD80200008001035042 :100A2000D431189679F45804C05179E45804E08020 :100A300000CE6848F133000DE7D3C001C06088697B :100A40003008F00919005F03300A5C53301C14337E :100A5000F9BB0114F9BB0015F01F005D1895E0808B :100A600000B698593138F0091900E08B000F4D9805 :100A7000201D1AD8E068040F1AD84D784D7C1AD87A :100A8000F01F00572FCDC008684811FA11CB11D9BB :100A900011E8B169F3EB1189F3E81089ED38001C16 :100AA0007817F5E91009AE88EF3A000CED38001D13 :100AB000AE98EF38000DF1EA1088ED3A0024AEAAA6 :100AC000ED3B0025AEBBF20B1618AEF9AECBF7D955 :100AD000C208F3D9C108AEDBAEE9ED390028EF69F1 :100AE0000008ED390029EF690009ED39002AEF69A6 :100AF000000AED39002BE018FFC0EF69000BA5A834 :100B00005C88F5D8C010EF6A000DF40B1608EF6B87 :100B1000000CED39002EEF69000EF1D8C006300947 :100B2000E8185000ED3A002F5C78EF6A000FEF688C :100B3000000DEF690011EF690012EF690013EF6912 :100B40000010A988EF68000CED19002E6CA8F208BF :100B500000088DC85803C110EF39000CEF38000DA4 :100B6000F1E91088E018FFC0E8180011EF68000DE7 :100B7000A988EF68000CC068682811897818F169A5 :100B80000014ECC4FFFC8AC83069089A0C9B0A9CCC :100B9000F01F00145C7CEF6C0011A98C4929EF6CEC :100BA0000010F30C00902FFCF35C0090306C201DC3 :100BB000ED39000B089A1ADC0C9B30080A9CF01FD8 :100BC000000B0A9CF01F000A2FEDD8328000D318CA :100BD0008003AF5C8003AFA480039D9C800094C41D :100BE00080011E2C000080D4800122948000D13C22 :100BF000D431300A1895314B301CF01F003918934E :100C0000C041E06C00FED832EB380026EB39001C06 :100C1000E018FFFCEB6800266B787817AE89EB399B :100C2000001DAE99EB390024F00B1618AEA9F3D8CD :100C3000C208EB3A0025AEF8F1D8C108AECBAEBA87 :100C4000AED9AEE86AA8F0091618EF690008F3D823 :100C5000C208E06A5010EF690009F3D8C1083004F7 :100C6000EF68000BEF69000AF40B1608EB19002E71 :100C7000EF6B000CEF6A000DEF69000FEF640012DC :100C8000EF640013EF640010EF640011F20A16081D :100C9000F2080008EF6A000E8BC8EAC6FFFC0A9B48 :100CA0000C9A98C83069F01F000F5C7CEF6C001143 :100CB000A98CEF6C0010306CEB38000AEB39000B9C :100CC000201D0C9A1ADC0A9B069CF01F0007069C4C :100CD000F01F0006089C2FEDD83200008000D318CA :100CE00080011E2C800122948000D13CD431202D23 :100CF0004AE8189770081838E08001A3F9080056F0 :100D0000F9090060F0091900F20817805C785008B2 :100D100079E6F9380026E2180002C1E05806C170F1 :100D20008CEB6C48794911CCF609010911DBB16BE8 :100D3000F7EC118B11FA11E8F7E81088400BF5E891 :100D40001008F20800081638E08800070E9CF01F13 :100D500000185C5CC7696FF55805C0B1EEC9FF8427 :100D6000EEC2FFFC5019300349214930C2B9109539 :100D70006A085808CFD1CF3BF13C000CF139000D87 :100D8000F3EC108C5C8CEDBC0002C1F148B8201D66 :100D90001AD8E06802471AD8489848AC1AD8F01F09 :100DA000000A2FCDC00800000000822480010BF053 :100DB000000080D4000082108003AF5C8003B18407 :100DC00080039D9C800094C46FF95809C150EF3B8B :100DD00000261699E2190044C0F16FE95809E08035 :100DE0000133720E580EC081926EEF09003CF20E74 :100DF0001900E08301296C09EF4900786E495829F0 :100E0000C0E0A5AC5C7CF16C000DA98CF16C000C11 :100E1000EF390026E019FFFCEF6900266EA9F20AFF :100E20001618F16A0008F5D9C208F16A0009F5D967 :100E3000C108F169000BF16A000AEF1A002EF16A8D :100E4000000FF40B1608F16B000EF40900098FC9AE :100E5000ED39000EEDB90000C061E06B0200EA1B45 :100E60000204915BEF08003A3FF9F2081900F9B863 :100E70000000EFF80C1D6E085808C071049CF01FAC :100E80000075C45078188F086F085808C121600990 :100E90006C48EF49004011F911CB11DA11E8B16A41 :100EA000F5EB118AF5E81088F3E81008EF480044E4 :100EB0006C1C6C4478199848985A9914E8090109EF :100EC000121A1218B85AB84830695C78049A0E9B06 :100ED000E9630010E9630011F01F005F30695C7C7A :100EE000E96C0011A98CE96C0010E30800902FF860 :100EF000201DE35800901AD9049AEF38000AEF3900 :100F0000000B0E9B6C1CF01F00552FED6C4811FA66 :100F1000F139000DF3D9C0025F1B11CC8CE9F60941 :100F2000000911DB11E8B16BF7EC118BF7E81088C1 :100F3000F5E810086F7AF2080008101AC037EF4879 :100F4000005C5809C3B08D036FF85808C041EF46E4 :100F5000007CC3286C4A15FE15C46A4915DBB16BC9 :100F6000F7E4118B15E4F7E4108BFDEB100B13CEB7 :100F700013FC13DAB16AF5EE118A13EEF5EE108A5E :100F8000144CF60C010CC177401AC058109A700826 :100F90005808C0E0704913C413FC13DEB16EFDE4C1 :100FA000118E13E4FDE4108E1C4C161CCF068D0828 :100FB0009506C0788B060C95C0480C9CF01F002845 :100FC0006FE65806C3706C4811CC6F4A8CEB11D990 :100FD000141BB169F3EC118911ECF3EC108911FCCD :100FE000F9E91009F6090009400B1639FE98FEC60A :100FF000EF3900AC3008F0091800C1C18CEB6C4827 :10100000F60A010A11F911CC11DB11E8B16BF7EC0A :10101000118BF7E81088F3E81008100AEF18006049 :10102000103AF9B80B00EFF8BA2AF9B80B01EFF84B :10103000BEACEF380026F1D8C007EF680026300CB0 :101040002FEDD832E21B00A0FE91FED7CD2B000081 :101050008001222880011E2C800122948000DA3C2D :10106000D401189879FA580AC170149B7609580966 :10107000C030129BCFCB71EC970CF1490040F14985 :10108000007CF139004E2FF9F14A0078109CF1698B :10109000004EF01F0002D80280010CECD431300A5F :1010A0001896314B301CF01F00401895C7B0985966 :1010B0003138F0091900E08B000F4BC8201D1AD8F9 :1010C000E06803C91AD84BA84BAC1AD8F01F003AF5 :1010D0002FCDC008ED39001C78176D78AE89ED3939 :1010E000001DAE99ED3900242018AEA9F00B16189A :1010F000ED3A0025F3D8C208AEF8F1D8C108AECB5E :10110000AEBAAED9AEE86CA8F0091618EF690008BF :10111000F3D8C208E06A5010EF690009F3D8C1089B :101120003004EF68000BEF69000AF40B1608ED19A4 :10113000002EEF6B000CEF6A000DEF69000FEF64FB :101140000012EF640013EF640010EF640011F20A64 :101150001608F2080008EF6A000E8DC8ECC3FFFC09 :1011600098C83069069A0C9BF01F00145C7CEF6CE9 :101170000011A98C4929EF6C0010F30C00902FFC92 :10118000F35C0090306C201DED39000B08981ADCE0 :10119000069A0C9B0A9CF01F000B0A9CF01F000A89 :1011A0002FEDD8328000D3188003AF5C8003AFA44A :1011B00080039D9C800094C480011E2C000080D47C :1011C000800122948000D13CF9390010A3C948A8BD :1011D000F969001011BA118B119911A8B169F3EBDB :1011E0001189F3E81088F5E8100899183008F958C3 :1011F00000145EFC8003B409997A996B5EFCD703F6 :10120000D421301CF01F00071897C080320A300B21 :10121000F01F00053FF8EF68000B0E9CD82200007D :101220008000C9D48002E8BCD40148C9189B720868 :101230001838C0D178389308C0C870395809C060D0 :101240001639F7F90003F1F90A0370385808CF612D :10125000301CF01F0003D802000082288000C974EF :10126000D4214AB83009700E1C98C148103CC111F5 :101270005809C0E04A78201D1AD8E06802541AD8EC :101280004A584A6C1AD8F01F00262FCDC0083019D2 :1012900070385808CEC1580BC0C017B817861797BA :1012A00017ABB167EFE61187EFEB108BF1EB100B8B :1012B000990B580AC2211C98E06A1000E0667FFF73 :1012C0003007C0C8F10B0012F40B1900C061F6CA58 :1012D000FFFF1C985C8AC0287038EC0A19005F1563 :1012E00058085F1BEBEB000BEE0B1800CEC1580843 :1012F000C040E06C00F5D822F95A00125809C0200D :10130000D82A993E4828910C129CD82200008228A5 :101310008003B19C8003B1E080039D9C800094C455 :10132000D4213008169614951897F9090012F0097F :101330001900C071300A189BF01F00145C5CC231A8 :101340005806C0C00DB80D8A0D990DA6B169F3EA13 :101350001189F3E61086F1E61006EF380010A3A815 :101360008F16EF680010EF55001448987008109C15 :10137000C0581837C021D82A783C580CCFB18F38C4 :1013800048389107D82200008001126000008228AE :10139000D43112971093169414911895F9090012EC :1013A0003008F0091900C091300A189BF01F004561 :1013B000E5DCC008E0810084308B089CF01F00420F :1013C000C0310896C0E8300A308B301CF01F003F57 :1013D0001896C041E06200FFC728089BF01F003C40 :1013E0008C593078F0091900E08B000F4B98201DC4 :1013F0001AD8E06801C51AD84B784B8C1AD8F01F60 :1014000000382FCDC008EB3900120E986C175C78AD :10141000AE893009EB3A0013AEB8AE9AA988AEF99E :10142000AEE9AEA86A085808C041E6C2FFFCC10890 :1014300066191238C0C00836C041E06200F7C3F830 :101440000C9CE06200F7F01F0027C3980A928CC83A :10145000F0091608AED8AEC9EB390010EDB900009E :10146000C1403119029A049B0C9CF01F001F5C8C38 :10147000F1DCC010AEF8A988AEE8580CF9B800FF4E :10148000EFF80E07EFF80E0631181AD3049BEB396C :10149000000B029A1AD80C9CEB38000AF01F0013BC :1014A0002FEDE5DCC0080836C0400C9CF01F000D95 :1014B00048F8F10900782FF9F1590078049CD832E6 :1014C000800112608000CDD48000D3188000CDB49C :1014D0008003B19C8003B1EC80039D9C800094C488 :1014E0008000D13C80011E2C80012064000080D44B :1014F000D421202D1897501B149C500A1296F01FCF :10150000000C401B1898400AC0A148A8E06C00FCE1 :10151000F10900862FF9F1590086C078F3D6C01082 :101520000E9CF01F00055C5C2FEDD8228001222864 :10153000000080D480011390D401F8CAFFFCF9198F :101540000014F01F00035C5CD8020000800114F05E :10155000D431203D4D98F109007A2FF9F159007AE4 :10156000781716910F8818955C8898CAF3D8C0042C :101570002FE9A369123AC0A5F1D8C004F00B1502F7 :101580005C3BF01F004F1894C0904CC80A9CF109B6 :1015900000822FF9F1590082C1D96A12EECCFFF016 :1015A000029B502CF01F004705980583F1E3108340 :1015B00005B805AE1896F1EE108E5C835C8E34484B :1015C000F00E1900C2413438F0031900E081008B9D :1015D00062A85808E080008770145804E0800083F7 :1015E00068185808E0800092EF3A000CEF39000DBF :1015F000B169F3EA1189EF3A000EF3EA1089EF3A84 :10160000000FF5E910091238C6D1C7F84AE8089961 :10161000700A089B1498500AC618F10C0012FC0CB2 :101620001900C5A15806C041700C580CC1B0EF306C :101630000010EF3C0011B16CF9E0118CEF3000129A :10164000F9E0108CEF300013F60618005F1AE1EC99 :10165000100C700018305F0CF5EC100CF60C180034 :10166000C3B05804E08100D6F13C0010E21C000435 :10167000F0041700CCE8701C580CC150EF3A000C75 :10168000EF30000DB160E1EA11805010401AEF30E8 :10169000000EF5E010805010EF30000F401A14409B :1016A000003CC1A1400A10945809C0F0703893382A :1016B000893A48589104C148000080D48000CDD4B4 :1016C00080012558000082284C88F109008E2FF9EE :1016D000F159008EC058109970385808C9F1580453 :1016E000C141EF3A0010EF380011B168F1EA1188FA :1016F000EF3A00126219F1EA1088EF3A0013F5E8A8 :1017000010081039C6D1300405F805E9F1E9108850 :10171000C130402A8AC83119EECBFFF40A9CF01F71 :1017200000345C8CC0904B180A9CF10900802FF9A2 :10173000F1590080C4F83F8B0A9CF01F002EC0E0D6 :101740004AD8201D1AD8E06801141AD84AB84ACCE1 :101750001AD8F01F002C2FCDC0085804C0D06866DE :101760005806C3E0089BF1D3C010EEC9FFF40A9AF3 :10177000687C5D16C5585806C261EF380010FC1928 :10178000E000B968E618F0001238C1D00F8B0A9C4F :10179000F7DBC0042FEBA36BF01F00166A180E389E :1017A000C0E04958201D1AD8E068012F1AD84968AE :1017B000493C1AD8F01F00132FCDC008303B0A9CBB :1017C000F01F001248980A9CF10900882FF9F1597E :1017D0000088F109007E2FF9F159007EC0280A9C8B :1017E000F01F000BC1D80000000080D480011E2C27 :1017F0008000CDD48003B19C8003B11C80039D9CEC :10180000800094C48003B21C800118FC8000D13C8D :10181000F10C0014E60C1900FE91FF5FC2DB2FDD16 :10182000D8320000D431189316921494324B300AF7 :10183000301CF01F00241897C43098593238F00932 :101840001900E08B000F4A08201D1AD8E068012E0D :101850001AD849E849EC1AD8F01F001E2FCDC0084D :101860007816661531CAAC94AC823004ACC4ACD4E2 :10187000ACE4ACF4661B781C2F8CF01F00170C9C9A :10188000ACA4ACB48EDBF01F00155C7CACBCA98CA6 :10189000ACAC201D492C30161AD60898F906006009 :1018A000EACAFFF4E06900FF089B2FF6F9560060D2 :1018B0000E9CF01F000C0E9CF01F000B2FEDD83279 :1018C0008000D3188003B2308003B27880039D9CDF :1018D000800094C48002E73680011F4A000080D453 :1018E000800122948000D13CD401F5DBC00830BBDC :1018F000F01F0002D802000080011824D401F5DB9B :10190000C008303BF01F0002D802000080011824FC :10191000D4314C62E50800622FF81694E558006255 :10192000781618970D85EBD5C004A365EA0311005E :101930005C83069BF01F003EE08101788E493038C1 :10194000F0091900E08801726E1811893088F009D9 :101950001800E081015DED380010ED310011B1613A :10196000E3E81181ED380012E3E81081ED3800134F :10197000089BF1E11001ECCCFFF0F01F002EC071CC :10198000E611F000FC18E0001031C0914A780E9C7E :10199000F10900742FF9F1590074C4498E49307867 :1019A000F0091900E08801420E9CF01F00235C8CB6 :1019B000C0A00E9CF01F0021E50800682FF8E55834 :1019C0000068D832330B0E9CF01F0019C6E00A9B4A :1019D0000E9CF01F0017189AC0E04998201D1AD8D5 :1019E000E06800981AD84978497C1AD8F01F001787 :1019F0002FCDC0088ECB302CF01F00151892E08040 :101A0000011F98D9EAC8FFF81039C25248C8201DF2 :101A10001AD8E06800A21AD848E848BC1AD8F01FC3 :101A2000000B2FCDC0080000000080D48000CDD472 :101A30008001255880011FAC8000D13C8003B2306A :101A40008003B2A480039D9C800094C48000D318BE :101A50008003B2D80E9BF01F00445C5CC0E04C38A1 :101A6000201D1AD8E06800A51AD84C184C1C1AD8AA :101A7000F01F00412FCDC008069B6416049CF01F88 :101A8000003FC0E04B98201D1AD8E06800AB1AD880 :101A90004BB84B8C1AD8F01F00382FCDC0080E9CC5 :101AA0000497F01F0038C1383D0B0E9CF01F003327 :101AB000C0E04AE8201D1AD8E06800B51AD84B08E3 :101AC0004ACC1AD8F01F002C2FCDC008ED3A000CDC :101AD000ED39000DB169F3EA1189ED3A000EED3BE5 :101AE0000010F3EA1089ED3A000FF5E91009ED3A1C :101AF0000011B16AF5EB118AED3B0012F5EB108A8B :101B0000ED3B0013F7EA100AF40B16186E18ED6A95 :101B1000000FED6B000CF7DAC208F5DAC108ED6AC8 :101B2000000EF20A1618ED690013ED6A0010ED6B55 :101B3000000DF5D9C208F3D9C108ED6A0011ED69AD :101B40000012300911AAB08911B9F3EA1089FE7A9E :101B5000F7FE5C89F4091900E0880016F2C9F7FF66 :101B6000C14800008000CF988003B2308003B310DA :101B700080039D9C800094C48000CDD48003B33842 :101B80008000D13CF2C9F8005C79B0B9A989B0A94C :101B9000ED380009E818FF00ED680009A988ED6834 :101BA00000083008314BED68000BED68000A0C9C12 :101BB000F01F00284A885C7CED6C000BA98CED6C52 :101BC000000AF10900602FF90A9BF15900600E9C90 :101BD000F01F00221898C0E04A18201D1AD8E068AB :101BE00000D71AD849F84A0C1AD8F01F00202FCD78 :101BF000C00830191AD4189A1AD9ECCBFFF4E0694E :101C000000FF0E9CF01F001A2FEDC0B8E508007011 :101C10002FF8E5580070E50800662FF8E5580066D3 :101C20000E9CF01F0014D8320E9CF01F001248A822 :101C3000F109006A2FF9F159006AD8320E9CF01FA1 :101C4000000D4858F10900742FF9F1590074D83289 :101C500080011F4A000080D48000CDD48003B230C0 :101C60008003B36C80039D9C800094C48001206439 :101C70008000D13CD431205D30951988FAC9FFF03D :101C8000FACEFFFC5009330231033056F0C9003060 :101C9000EA091800E08B00BAE4081800C03030A749 :101CA000C1582FFC35891988F20818005F0A378956 :101CB000F20818005F09F5E91009F9B70008F7BC48 :101CC00001FFF9B70110F9F81800F8CAFFFF300951 :101CD0003191F2070244F0C000301004F4CC00014E :101CE000EA001800E08B0005E8C90030C1E80E9456 :101CF000E6071800C1D1F0C400615C54EC04180080 :101D0000E088000EF0C00041EC001800E08B0011EC :101D1000E2041800E0880004341CC028361C2F6838 :101D2000F00C010CF9E9104915882FFACD3B32EA85 :101D3000F4081800C0814008103EC6701CA92FFC92 :101D40001988CA5B5808C28030CAF40818005F1CA2 :101D5000320AF40818005F1A146C300AF40C1800E8 :101D6000C1B030DCF80818005F1730ACF808180074 :101D70005F1CEFEC000CF40C1800C0E030BC309796 :101D8000F80818005F1CEE0818005F18F9E8000852 :101D9000F4081800C3A1FAC8FFFC101EA34E2FFEC2 :101DA000582EC0B0E0890005580EC2F0C298583EC7 :101DB000C0F0584EC251C168E064FFFFEA1400FF52 :101DC0000839E08B00234018F3E81189C198E049F5 :101DD000FFFFE08B001B4018402AB968F1EA1108A8 :101DE000C0D8E04900FFE08B0011402A4018B968D4 :101DF000F1EA1108403AF1EA1088F1E91009580BAC :101E0000F7F91A00301CC028300C2FBDD832D70388 :101E1000D401202DFACBFFFCF01F0004F9BC00FF19 :101E2000FBFC10012FEDD80280011C74D431202D51 :101E3000300630110C9EC4A898557812E7D5B01022 :101E4000049430075008C0B8E92800000990202306 :101E5000E1E810805C835C702FE40007E203190066 :101E6000FE9BFFF40A944008E214FFFEE7D5C00190 :101E700008023000E0031900C0400584A964080787 :101E8000E9D7C010B187E80700070E94E0140000FE :101E9000C060E9D7C010B187E80700075C77EBD5D1 :101EA000C001EE0E000EEFDEC010B18EEE0E000E81 :101EB0005805C0B0EFDEC108EC061101A96E5C56F2 :101EC000FDDEC010EFEE100E780C580CCB615806FA :101ED000C080F9DEC108A96EFDDEC010F9EE100E5B :101EE00017B715BC17851796B166EDE5118617ABC8 :101EF0001585EDEB108B5C781596EFEB100B15AAA2 :101F0000EFDBC010B166B18BEDE511860E0BEDEA8B :101F1000108AF9EA100AF40C1610F5DAC010F60A65 :101F2000000A180AF4090009F2080008F00E000E71 :101F3000F1DEC010B18EF00E000EF9DEC010B18ED1 :101F40001C0C5CDC5C8C2FEDD832D4213008189945 :101F5000F5DBB010301EC0B8F32600001397202A1E :101F6000EFE610875C8A5C772FE90E08FC0A1900FF :101F7000FE9BFFF41699E219FFFE120CEDBB000068 :101F8000C0411989A9691208F3D8C010B188F208B4 :101F900000081099E0190000C060F3D8C010B188A3 :101FA000F20800085CD8F9D8B010D822D431300A31 :101FB000301414981495C488985B7816EFDBB01031 :101FC0000C9E3009C0B8FD2200001D932027E7E2D7 :101FD00010835C875C732FEE06090E93E8071900E7 :101FE000FE9BFFF3169EE21EFFFE1C06FDDBC001FA :101FF000EA0E1900C0400D8EA96E1C09FDD9C01053 :10200000B189FC090009129EE01E0000C060FDD9E4 :10201000C010B189FC0900095C79F7DBC001F20846 :102020000008F3D8C010B188F2080008580BC0B0FF :10203000F3D8C108F40A1101A9685C5AF1D8C0109C :10204000F3E81008780C580CCB81580AC080F3D8FC :10205000C108A968F1D8C010F3E810085CD8F9D815 :10206000B010D832D431201DFAC4FFD8169712937D :102070001092681518966801580AE0800091500A7D :10208000314BF01F0055400AC0A04D48E06C00FEE7 :10209000F109005C2FF9F159005CCC286C148C59C3 :1020A0003138F0091900E08B000F4CD8201D1AD8E8 :1020B000E068022C1AD84CB84CBC1AD8F01F004B60 :1020C0002FCDC0085C53E3E310815C71E961000926 :1020D000A981E9610008158B1598B168F1EB1188A9 :1020E00015ABF1EB108815BBF7E81008F00B1618CC :1020F000E9680013E96B0010F7D8C208F1D8C108ED :10210000E96B0011E9680012E81245005C72A892C0 :10211000E4031608A883ED380008A8A8ED380009E4 :102120004B39A8FCA8B8A8EC9208F7D8C010A8DBD7 :10213000A98BA8CB2FF8B2085807C0D00F8B0FB9C6 :102140000F98B168F1EB11880FABF1EB1088F3E851 :102150001008C051EAC8FFFCEBF81001F00916188E :10216000E968000FE969000CF3D8C208F1D8C1088A :10217000E969000DE968000E3008E968000BE968BC :10218000000A500A314B089CF01F001A5C7CE96C75 :10219000000BA98CE96C000A400AC038781A2F0A93 :1021A00048E8F10900482FF9F1590048158B1599B5 :1021B000B169F3EB118915AB6A18F3EB108915BB04 :1021C000F7E910091039C1910C9B0A9CF01F000A15 :1021D000C26800008000CDD4000080D48003B3909A :1021E0008003B3D880039D9C800094C40000734892 :1021F00080011F4A8000CAF8EB08002C5808C0B0C4 :102200008C49F0091900E08800070A9B0C9CF01F1C :102210000006C0580C9B0A9C6A585D185C5C2FFD38 :10222000D8320000800125A0D42149781896700783 :10223000C1680E9CF01F0015C1100D8B0D98B16880 :10224000F1EB11880DAB6E1AF1EB10886E290DBB06 :10225000F7E8100814581268C1306E075807CEA16D :1022600048B66C0C580CC040F01F0008C08148985C :10227000F10900562FF9F1590056C0286C070E9C41 :10228000D8220000000080CC8000CAE4000080D08A :10229000000080D4D421204D1897503B149C502A24 :1022A000501950084096F01F000D403B402A40193D :1022B0004008C0A148A8E06C00FCF10900562FF9C5 :1022C000F1590056C0881ADC0E9C1AD6F01F000582 :1022D0002FED5C5C2FCDD82280012228000080D415 :1022E00080012064D4314C05EB08004A2FF87817A0 :1022F000EB58004A0F980F831694F1E31083189659 :10230000E609160C3048F0091900C090F01F00379C :10231000EB08005C2FF8EB58005CC2980FB8E7D3CD :10232000C1040FA2A363F1E2108298585C82E60810 :102330001900C0539848E4081900C0B20C9CF01F63 :10234000002B4A98F10900522FF9F1590052C86840 :10235000069B0E9CF01F00265C8CC0F00C9CF01FAE :102360000023EB0800502FF8EB580050EB08004E0C :102370002FF8EB58004ECD48F7D2C0100C9CEEC0A1 :10238000FFF0F01F001C0895301249B10A9CF01FA5 :10239000001BC1D0EAC8FFFCC1A06A185808C17070 :1023A000EF3A0010EF390011B169F3EA1189EF3A01 :1023B0000012F3EA1089EF3A0013F5E91009103919 :1023C000C2A00A9B009CF01F000EC2515802E3F508 :1023D0001000EBF5000030020835EBF50000580561 :1023E000CD61C9F8000080D48000D13C80011F4A33 :1023F0008000D210000080CC8000CAE48001255803 :10240000EE03000307B807A9F1E910893448F00981 :102410001900C2A0EF39000CEF38000DB168F1E9E6 :102420001188EF39000EF1E91088EF39000FF3E859 :102430001008C1B0089BEECCFFF4F01F003DC0A116 :10244000EF38000CFC19E000B968E618F00012380B :10245000C0C10C9CF01F00374B78F109004E2FF9DA :10246000F159004EC5D808955805C0510C9CF01F75 :102470000031C5680FE90FF8F1E91088F1D8C00EF6 :10248000C0700C9CF01F002D1896C4A078174AC885 :1024900091044AC8089B91070C9CF01F002BC3B104 :1024A000EF3800095868C0B05918C0405818C11119 :1024B000C0B8089B0C9CF01F0025C2D8089B0C9C40 :1024C000F01F0023C288089B0C9CF01F0022C2381A :1024D000089BEECCFFF0F01F0016C0F1EF380010A3 :1024E000FC19E000B968E618F0001238C0608D17DA :1024F000302B0C9CF01F00180C9CF01F000E48E8BD :10250000F10900582FF9F1590058F109004E2FF93F :10251000F159004E48A93008930848A99308D83AC1 :10252000EF3800095918FE91FF77C6BB8001255886 :102530008000D13C000080D4800129BC0000822CA6 :10254000000082308000D588800115508000F37C27 :1025500080011910800118FC19B9198A1998B168FD :10256000F1EA118819AAF1EA1088F3E81008F0C915 :1025700000015BD9E08800035EFFF7390035EDB953 :102580000001C0E1761A1438C0B07629105A126AD8 :10259000C0715CD9F3E8000812385F0C5EFC5EFD88 :1025A000D431209D503B506A781B403AF519002CDD :1025B000F2C80013502B5078214917EA17F8F1EAB6 :1025C00010885C88109BF1D8C00DE21B2000984356 :1025D000505B2143308B5018F20B0C0A1897F3DA3A :1025E000B0105C8312985049A37830025C88314067 :1025F0005088C938401B405AF1DBC00D14485008C0 :10260000E3D3B010F1D3C01040791039E08900064F :10261000400B4081ADBB500B300A314B302CF01FCA :1026200000421894C3708E58313AF4081900E08BB8 :10263000000F4BE8201D1AD8E06802C31AD84BC817 :102640004BCC1AD8F01F003C2FCDC008314A402B8C :10265000781CF01F003A6E19F1D0C010F208000883 :102660006816EBD1B0108F188E58F0000100AE50F4 :10267000C2188E52EA021900EA0217205C82C19049 :10268000302A300B303CF01F0028C071089CF01F2E :10269000002CE06C00FFC4586E18B842B852189B6A :1026A00099180415089C5C85F01F00265805C02069 :1026B0006E075805CDF1ED65000B40085C78ACF86D :1026C000A988ACE8E2C8FFEC5C78ACB8A988314BCB :1026D000ACA8ED65000A0C9CF01F001B5C7CED6C47 :1026E000000BA98CED6C000A4039406A7258089BB7 :1026F000129C5D18495BF70800302FF8089CF758CA :102700000030F01F000F40180213404AE1D2B01011 :1027100014085C835C8850185803FE91FF6D069C7A :102720002F7DD8328000D3188003B4108003B45CAE :1027300080039D9C800094C48002E7368000D13CD9 :102740008000CD3480011F4A000080D4D40148F8B5 :1027500070091839C04178099109C128580BC0E1A6 :1027600048B8201D1AD8E06801341AD8489848ACF7 :102770001AD8F01F000A2FCDC00878089708189BB8 :10278000305CF01F0007D8020000734C8003B410C7 :102790008003B47C80039D9C800094C48000C97435 :1027A000D43118971696183BC0E14BC8201D1AD893 :1027B000E06800A41AD84BA84BAC1AD8F01F003A16 :1027C0002FCDC008580BC11076081838C0E04B3820 :1027D000201D1AD8E06800A61AD84B484B1C1AD8FE :1027E000F01F00312FCDC0086E156A1811CA11D91B :1027F000F3EA1089C0303004C1D8118A1199109CB5 :10280000B169F3EA118911AA11B8F3EA10891248E3 :10281000314A8F18EECBFFF8F01F0025301B0A9CC1 :10282000F01F00240A9CF01F002418940A9CF01F3B :1028300000236E15C1486A1811B9118A119311A8A5 :10284000B163E7EA1183E7E81083F3E31003F01FB5 :10285000001A18040A9C0695F01F00180A9C5805D7 :10286000CEB10C9B0E9CF01F001649689009F5D95B :10287000C010083AC0E44898201D1AD8E06800C784 :102880001AD84918487C1AD8F01F00072FCDC00865 :102890000819089CB009D8328003B4108003B4989A :1028A00080039D9C800094C48003B4A48002E7361A :1028B000800118E88000CD0C8000D13C8001274CBD :1028C000000073508003B4B8D431300618971692C4 :1028D0004AB30C94300566080A9B0A9CC3E8EF3A99 :1028E000000CEF39000DB169F3EA1189EF3A000EDF :1028F000F3EA1089EF3A000FF5E91009705A123A1D :10290000C1B1EF3A0010EF390011B169F3EA118952 :10291000EF3A0012F3EA1089EF3A0013F5E91009D3 :10292000706A123AC0910FCA0FD9F3EA1089906AFF :10293000F20A1900C0D02FF5580CC090F13A001FD0 :10294000F939001FF20A1800E08B0003109C70098F :102950005809F00B171012985808CC21580CC04099 :10296000F01F0008180658155F9804365F59F3E801 :102970000008E8081800CAF10C9CD8320000734C1B :10298000800127A0D42148C83007700CC108F9384D :10299000001F7806F0C900015808C050F969001FEF :1029A0001897C0480E9BF01F00050C9C580CCF01D7 :1029B000D82200000000734C800127A0D431201DD4 :1029C0004CD8F10900322FF9F159003278161895D8 :1029D0000D835C83F3D3C004A3695949C080F10916 :1029E00000442FF9F1590044E08F02570DF80DE132 :1029F000F1E110810DB80DA24C07F1E21082F01F39 :102A000000408E885C815C821894F808000858A801 :102A1000E08A000D189B0C9CF01F003AC5708E8850 :102A2000E808000858A8E08900524B783009700780 :102A30005009C3D8ED39000CED38000DB168F1E94B :102A40001188ED39000EF1E91088ED39000FF3E837 :102A500010086E591039C291ED390010ED3800118F :102A6000B168F1E91188ED390012F1E91088ED390A :102A70000013F3E810086E691039C1710DC90DD843 :102A8000F1E910888E69F0091900C0F149A8F1092F :102A900000462FF9F15900460DE90DF8F1E91088CB :102AA000F1D8C00DC360C3F850076E075807CC318A :102AB000E08F021E089B0C9CF01F0012083CC065B2 :102AC000305CF01F00121897C09148B8F109003C23 :102AD0002FF9F159003CE08F01E0320A300B0E9CD7 :102AE000F01F000B30394888EF69001F70098F090B :102AF0009107C138000080D4000073508000CD0CD5 :102B0000800128C80000734C8000C9D48002E8BC52 :102B10008EF8F1D8C00DC070314A0C9BEECCFFF896 :102B2000F01F004F4CF89009F20400045C84B004DC :102B30000DE8A598EDB80000C120EF38001EE3D1E4 :102B4000C00DE7D3C004A371E60310FCE20200024B :102B5000A1A80602EF68001EEF52001C6A1811BB04 :102B6000300A11AEF7EE108E118BB09AB0AAB0BA3F :102B7000B08A1499F5DBC00411FBF40A10FC11ECC7 :102B8000F7EC108CF9DCB00DA37CF7DCC010B0DBE7 :102B9000A98B180EB0CB140E10935C8E3016F5DE98 :102BA000C010B0FAA98AB0EA6E11029BC548761A25 :102BB00015C015D2E5E010825C82E40C1900C292C7 :102BC000F6021618B0BBB082E5DBC208F7DBC1081D :102BD000B092B0AB5809E080008213E213FBF7E239 :102BE000108BF60C1900E08300FF15DB15CAF7EA1D :102BF000108AF40E1900E08B00F7EA0A1618B2B535 :102C0000B28AF5D5C208EBD5C108B29AB2A5C6788A :102C1000E40C1900E08000E815E015FBF7E0108BEC :102C2000F60C1900E08300E05809C09013FB13E98B :102C3000F7E91089E4091900F9B601001582159B1E :102C40001499B16BF7E2118B15A215BAF7E2108B4C :102C5000F5EB100B580BCAC1C52900008002E736FE :102C60000000735013EB13FA11CCF5EB108A11DB53 :102C7000F7EC108BF60A1900E088000F4BC8201DF6 :102C80001AD8E068018E1AD84BA84BBC1AD8F01F8E :102C9000003B2FCDC008EA0B1618B28BF7D5C2083F :102CA000B2B5B29BEBD5C108B2A511CB11D9F3EBEC :102CB0001089F20A1900F9B60100C1185801C0E0E4 :102CC0004AB8201D1AD8E06801971AD84AC84AACF9 :102CD0001AD8F01F002A2FCDC0088F15EF39001E1B :102CE000EDB90000E08100E45806E08000E16E19D3 :102CF000721A15CB15D9F3EB1089E08100D9118B2D :102D000011951099B165EBEB118511AB11B8EBEB97 :102D10001085F1E51005C1A807F86A1907EB13CC77 :102D2000F1EB108B13D8F1EC1088F00B1900E08157 :102D300000BF13881395B165EBE8118513A81293B2 :102D4000EBE8108513B8F1E510055805CE61123A8D :102D5000C1A14878201D1AD8E06801B91AD848984E :102D6000485C1AD8F01F00052FCDC0088003B410AE :102D70008003B4D480039D9C800094C48003B4F489 :102D80008003B52C138A1398B168F1EA118813AA4D :102D9000F1EA108813BAF5E81008C0E04C68201D6D :102DA0001AD8E06801BB1AD84C484C5C1AD8F01FFE :102DB00000452FCDC00813F813E9F1E91088EF0999 :102DC000001C5C88F0091900C1704BB8201D1AD88E :102DD000E06801BD1AD84BC84B9C1AD8F01F0039C7 :102DE0002FCDC0080A9CF01F00394B9818143006EC :102DF000B0040A9CC5982EC8EF58001C6E187016B7 :102E00000D880D94B164E9E811840DA8E9E81084F7 :102E10000DB8314AF1E41004EECBFFF80C9CF01F22 :102E2000002DEF38001CACA8EF38001D0C9CED65A0 :102E3000000BACB8ACE5ACF5ED65000A314BF01F0A :102E400000265C7CED6C000BA98CED6C000A6E1604 :102E5000C1586815089C3ECBF01F0020089B0C9CB5 :102E6000F01F001F0B890BB80B94B164E9E91184C2 :102E70000BA9E9E91084F1E410045804CEB10E9CCA :102E8000400BF01F00180C9C49178E05F01F000F17 :102E90001815AE05C0D849480A9CF109003630061D :102EA0002FF9F1590036F01F0011C02830060C9C94 :102EB0002FFDD8328003B4108003B53C80039D9C65 :102EC000800094C48003B5608000CD0C0000735076 :102ED0008002E73680011F4A8000CDD48000CD34C7 :102EE0008001274C000080D48000D13C305CF01F72 :102EF00000061897FE91FDF3FE9FFDDE5809FE9136 :102F0000FEB3CDDA8000C9D4D4211898F937002E49 :102F1000761E306CF8071800C0E04948201D1AD80A :102F2000E06801B41AD84928492C1AD8F01F0012B9 :102F30002FCDC008306C201C5C5CF20C0706FC0C2A :102F40000007EF66000EF40C0706EF660014580C3D :102F5000CF313089FD6C001BFD69001A109C706830 :102F60005D185C5CD82200008003B5948003B5DC5A :102F700080039D9C800094C4D4211897580CC0E114 :102F800049D8201D1AD8E06800941AD849B849CC0D :102F90001AD8F01F001C2FCDC00878185808C0E1BF :102FA0004958201D1AD8E06800951AD84968494C3C :102FB0001AD8F01F00142FCDC0086E186E06109C92 :102FC0005808C0E148C8201D1AD8E06800991AD8EE :102FD00048E848BC1AD8F01F000B2FCDC008F01FDE :102FE000000C0E9B306C0C97F01F000A5806CE6147 :102FF000D82200008003B5948003B62080039D9CF6 :10300000800094C48003B62C8003B63C8000D13C81 :103010008000C974D431201D500B1897580CC0C0C3 :103020004D084D19118CF80815031818F2080028DE :1030300070495829C0D030AA30094CBE129C1C924D :10304000129B2ECE1298149314911490C1980F8A4B :103050000F99B169F3EA11890FAA7018F3EA108980 :103060000FBAF5E910091039CE714C08F109002E9C :103070002FF9F159002ECE480C990A9C089B30A6D6 :10308000EC031800C0A1FCF6FFFC5806C0611296C4 :10309000189516941093C498FCF6FFFC5816C2417C :1030A0005807C0F00F860F95B165EBE611850FA6A6 :1030B000EBE610850FB6EDE5100564160C35C26021 :1030C00064051D865805C080F2061800C2B3189525 :1030D0001694109AC2A80C94F6061800C2331296E1 :1030E00018951090C2285826C1D15807C1300F86B4 :1030F0000F95B165EBE611850FA6EBE610850FB6CF :10310000EDE5100564160C35C0514969109CB28874 :10311000C9781D85F8051800C053129616941091B1 :10312000C0481296189516942FF82E4E5C582E42D1 :1031300030A9F2081800CA11F2031800C061400655 :10314000EDB60000E081007B4005E2150002E08161 :1031500000763098F0031800E089000A5C53C498A8 :103160000000735200007354000080D430A8F001B6 :103170001800C180E7D1C0084B38E60915030619CD :10318000F00903285808C2304B08201D1AD8E068FF :1031900001761AD84AE84AFC1AD8F01F002F2FCD22 :1031A000C008F0001800C040E7D0C008C108E20A1B :1031B0001800C4404A48E7DAC008E60615030616B8 :1031C000F00600266C0CF01F00258D053098F003EA :1031D0001800E088000F49D8201D1AD8E068018C3B :1031E0001AD849F849BC1AD8F01F001B2FCDC008C7 :1031F0004959E6081503300A0618F2080028F0C9F4 :10320000FFF0930A5807C0D00F8B0FBA0F99B1691E :10321000F3EB11890FABF3EB1089F5E91009911964 :103220004899E60815030618F20800282F08300907 :10323000069CB0C948B8B083C038E06C00FF2FFDD1 :10324000D8320000000073548003B5948003B64C5C :1032500080039D9C800094C480012F788003B66415 :1032600000007352D431494730050E963EF42EC704 :10327000ECC3FED40F882FF85C58AE88EEF9FFFC43 :103280005829C061E8081800E08B0009C0F85819F7 :10329000C0D1F2081800E088000A6C0C580CC0403D :1032A000F01F00068D05EF45FFFC2E472E46063722 :1032B000CE21D8320000735480012F78D431306889 :1032C0001293189616951497F939002EF0091800E4 :1032D000C0E04B78201D1AD8E06801DA1AD84B58A4 :1032E0004B5C1AD8F01F00352FCDC008580BC5C055 :1032F00017891798B168F1E9118817A9F1E91088C1 :1033000017B9F3E81008C500189B0A9CF01F002CA1 :103310001894C4A10B88FC19E000B968E618F00005 :103320001238C420069B0A9CF01F00265C5CE80C47 :103330001800C3C55C6C4A49F8081503302AF00C24 :10334000010CF20C00289166F0C9FFF0930A0FDA25 :10335000F16A000D0FCAF16A000C0FBAF16A000B96 :103360000FAAF16A000A0F9A1095F16A0009ECC3DE :10337000FFD10F8AB2C4F16A0008C0F87009701456 :103380008B09F01F00120E99069A089B0C9CF01FE7 :103390000010089CF01F000F6A08306C109B580842 :1033A000CEE1109CD832E06C00F6D8328003B594A0 :1033B0008003B67880039D9C800094C480012558CA :1033C00080013014000073548000C97480012F08FC :1033D0008000D13CD421189E580CC0E14958201DD2 :1033E0001AD8E068024A1AD84938494C1AD8F01F4E :1033F00000142FCDC008761AF4C8FFE4F137000F8F :10340000F136000CF139000DF138000E782BB1695E :10341000F3E61189F3E810897818EFE910091059DB :103420001669C061F4CBFFD82ECAF01F0006D8225F :103430008003B5948003A13880039D9C800094C4D0 :10344000800132BCD431202D189616911495580C59 :10345000C0E14CA8201D1AD8E068027F1AD84C8819 :103460004C8C1AD8F01F00482FCDC00894593378DF :10347000F0091900E08B000A4C48149CF109002265 :103480002FF9F1590022C3087414E8C7FFE40F981C :103490000F89F1E910893018F0091900C1E10FD83E :1034A0000FC9F1E91089E0680604F0091900C1515B :1034B0000FB80FA9F1E91089E0680800F0091900B8 :1034C000C0C1E938001BE939001AF1E91089E06848 :1034D0000806F0091900C0E04AC80A9CF109002852 :1034E0002FF9F1590028F109001E2FF9F159001E9A :1034F000CA184A68F109001A2FF9E8C3FFD6F15932 :10350000001AFAC2FFFC304A069B049CF01F002000 :10351000EF380018EF390019B169F3E81189EF3875 :10352000001AF3E81089EF38001BF1E910096C1854 :103530005808C0C01039C0A1049B3019E8CAFFDC8C :103540000C9CF01F00143018C0A83009EECAFFF818 :10355000FACBFFFC0C9CF01F000F30080FEA0FF9AC :10356000F3EA1089301AF4091900C1503028F00923 :103570001900C591C52800008003B5948003A138C7 :1035800080039D9C800094C4000080D48002E736B4 :10359000800132BC5808C4D03008AEE83028304A28 :1035A000AEF8EECBFFF2EECCFFE8F01F0025304A7C :1035B000069CEC0A000BF01F0022ED39002E30684B :1035C000F0091800C0E049F8201D1AD8E06802D9B7 :1035D0001AD849D849DC1AD8F01F001D2FCDC008D1 :1035E000306820185C58EE080009F33B0008F36BC4 :1035F0000012E808000AF56B000EE208070BF36BF7 :103600000008E2080709F56900145808CEB10C9CBF :103610006C680A9B5D18C0D80C9CFACBFFFCF01FAD :10362000000DC07848C8F109002C2FF9F159002C81 :103630000A9CF01F000A2FEDD83200008002E73606 :103640008003B5948003B5DC80039D9C800094C406 :103650008000B3B4000080D48000D13CD42178191C :10366000F338001BF339001A1697F1E91088189601 :10367000E0690800F2081900C070E0690806F20865 :103680001900C231C1C8189B0E9CF01F00173E4B99 :103690000C9CF01F0016C0E04958201D1AD8E068A5 :1036A00004A41AD84938494C1AD8F01F00142FCD59 :1036B000C0080E9B0C9CF01F0012C148189A169C63 :1036C0002D1BF01F0010C0E848F8F10900282FF961 :1036D000F1590028F109001E2FF9F159001EF01FC1 :1036E000000BD82A800133D48000CDD48003B59458 :1036F0008003B36C80039D9C800094C4800122E40D :1037000080013444000080D48000D13CD431300AA0 :1037100018941691303C338BF01F0042E8C8FFD15B :103720001895580CC0A14C08E06700FFF10900246F :103730002FF9F1590024C738985A3379F20A190041 :10374000E08B000F4B98201D1AD8E06804311AD87E :103750004B784B8C1AD8F01F00382FCDC008300999 :103760007813E6C7FFE4AEE93019AEF93069E93AFB :10377000002EF20A1800C0E04AC8201D1AD8E068DE :1037800004391AD84AD84ABC1AD8F01F002B2FCDBA :10379000C00830664AAB4ABA20165C56F006070CE1 :1037A000EE060009F36C0008F606070CF36C001235 :1037B000F406070CE6060009F36C000EF006070C91 :1037C000F36C00145806CE913042EECCFFF2E802C2 :1037D000000B049AF01F001C049A029BEECCFFE839 :1037E000F01F00193069AED2AEC9AEB6AE863088D1 :1037F000301AAEA8AE9AE769001BE768001A089C69 :1038000068680A9B5D184888F10900182FF9EFDCF9 :10381000C008F15900180A9CF01F000C0E9CD83209 :103820008000D318000080D48003B5948003B6A034 :1038300080039D9C800094C48003B5DC8003B71690 :103840008003B58D8002E7368000D13CD4211694E8 :103850001896189B1497089CF01F00541895E08147 :1038600000DF09890998B168F1E9118809A9F1E92E :10387000108809B9FC1AE000F3E810081099E6195D :10388000F0001439E08000CC5808E08000C9301BFB :10389000089CF01F00475C5CEA0C1800C0545807F5 :1038A000E08100CBCC184C39EBDCB008EA081503FA :1038B0000A18F20800282F0870095809F9B9000100 :1038C000F1F90A004BB9EA0815030A18F2080028B2 :1038D0007048F0C900015819E088000F4B68201D9E :1038E0001AD8E06803A51AD84B484B5C1AD8F01FC9 :1038F00000352FCDC00858185F0858075F09F3E856 :103900001008C041E06400FFC078089B0C9CF01FC9 :10391000002EE9DCC0085807E08000854A5AEA0911 :1039200015030A19A369F409000870485828C0B1A2 :103930002F890E9BF40900090C9CECCAFFD1F01FE3 :103940000023C6B85818C6E110990E98905B904AAB :10395000F40B1900C111700A580AC0E04968201D13 :103960001AD8E06803C41AD84998495C1AD8F01FDD :1039700000152FCDC008F13A000CF20A1800C05112 :1039800070085808CE41C51890CB300A303CF01F63 :1039900000111896C4F00E9BF01F000F5C5CC1F084 :1039A0000C9CF01F000EC468800125588001301463 :1039B000000073548003B5948003B6D480039D9CAB :1039C000800094C48001370C80012F088003B6FC6E :1039D0008000D3188000CF988000D13C306CF01F5D :1039E000001AC170300899169908EA081503F00505 :1039F00001054968F00500256A045804C07008985C :103A000068045804CFD1910CC0288B0C089CD82294 :103A10000C9CF01F000F089C5C5CD822E06C00F648 :103A2000D822089C5C5CD8220E960E9CF01F0009E0 :103A3000CD6B089C5C5C4888F10900242FF9F15992 :103A40000024D8228000C9D4000073548000D13CE7 :103A50008000CD1E000080D4D421202D169618970A :103A6000149531CB0C9CF01F0027C0804A68E06C95 :103A700000FE90592FF9B059C4180E9B0A9CF01FF4 :103A80000023C3410B890B98B168F1E911880BA998 :103A9000F1E910880BB9FC1AE000F3E8100810995E :103AA000E619F0001439C0F13019BAA935E9BAC9DC :103AB000F3D8C207BAF8BAD9A988BABCBAE8FAC921 :103AC000FFFEC1586E1912586E291268C0906E38E8 :103AD0005808C041E06C00FCC118EEC5FFF40C9A18 :103AE0000A9B0E9CF01F000AC08848A90C9B0E9CE4 :103AF000EECAFFD1F01F00085C5C2FEDD822000059 :103B00008000CDD4000080D4800125588001384C3D :103B10008003B58D80012F0878983019B0895EFC3C :103B2000D4217897EF380024EF390025F0091800E8 :103B3000C021D82AEE080028201D701630086C1904 :103B40008CCA8CDB20EA1AD620EBF2CCFFF2F01FF5 :103B500000182FED587CC0F0581CC0310C95C138AE :103B6000EF3800242FF8F1D8C0030C9CEF68002434 :103B7000F01F0010E06C00F4D8228ADB6A1CF01FF2 :103B8000000E6A055805CFA1EF3800242FF8F1D8B0 :103B9000C0030C9CEF680024F01F00064878E06C1E :103BA00000F290092FF9B009D82200008001933467 :103BB0008000D13C80013F7C000080D4D421204D86 :103BC0001896F01F002D5806C5306C955805C50095 :103BD0000B885808C4D0E0680600300ABA68E06B69 :103BE0000600303CF01F00251897C3F03008FACBD0 :103BF000FFF4AA88781CF01F00229A6B580BC35060 :103C00005C7BFAC8FFF2FAC9FFFCFACAFFF86E1C27 :103C1000F01F001C586CC2606E18402B101B40181F :103C20005C5B0E9C100B5C7BF01F001749789019B1 :103C30002FF9B0196E19F338001BF339001AF1E9A6 :103C40001088E0690800F2081900C060E069080601 :103C5000F2081900C0716C480C9B0E9C5D185C5CEE :103C6000C0400E9CF01F000A0C9CF01F000A2FCDD4 :103C7000D822000080013FA08000D31880013F5867 :103C8000800192DC8000D210000080D48000D13C02 :103C900080013B20D4211897580CC0E149B8201D61 :103CA0001AD8E06801491AD8499849AC1AD8F01FC7 :103CB000001A2FCDC008499899983778F9680036CE :103CC00036C8F9680037496899584968189B996857 :103CD000495CF01F0016496CF01F00163628EF688B :103CE00000353068EECCFFD1EF68002EF01F0012D7 :103CF000581CC040E06C00F4D822E06805DC300CB1 :103D0000EF58002CD82200008003B71C8003A13894 :103D100080039D9C800094C40000746C80013A581C :103D200080013D5880013B1880013E6880013D388C :103D300080018F4480019128D40116985C7A189BE9 :103D40002F29109C5C79F01F00045C7CF9BC00FFFB :103D5000D80200008000CEC4D42131B918977898D9 :103D6000965AF20A1900E08B0005E06C00F4D822A4 :103D7000F1390025F13C0024F2CAFFFFF5DAC00357 :103D8000183AC041E06C00F2D822F16A0025F0092F :103D90000028169C911B3F26F01F00050E9CF01F6B :103DA0000005EC0C1800CFB0D82A00008000CD1E12 :103DB00080013B20D42130061897E9DBC01030A5E4 :103DC000C138EE060708201D48BC1AD8F01F000BAA :103DD0002FED5806C080EC050C085809C041488CEE :103DE000F01F00062FF60836CED5486CF01F0003F2 :103DF000D822000080037AF0800094C48003B76862 :103E0000800384D448CD48D0E3B00001D55348C0E6 :103E100048C10230C06248C2A505A1240230CFD3F8 :103E200048A048B10230C06230023003A122023003 :103E3000CFE3488F000100008003760000000008F7 :103E4000000009B88003F480000009B800008CC8A5 :103E500080008EDCD4013018F96800087808580812 :103E6000C030781C5D18D802D4014869930C931BAC :103E7000F33800085808C040129CF01F0003DA0A0B :103E80000000749880013E54D421201D1895169688 :103E90001494300B30CA49DCF01F001D300B49DC94 :103EA000F01F001D300B49DCF01F001D497B49DC71 :103EB000F01F001D1897581CC0400E9C2FFDD822E3 :103EC000F01F001A1897581CCF910C9B0A9C49862A :103ED0008D07F01F00181897581CC04030088D0837 :103EE000CEDB30088D08F01F00141897581CCE61E7 :103EF000FACBFFFD302CF01F0011F9B701FFFBF8E2 :103F00000803E9F80A00CDAB00007498800091D056 :103F100080013F8C80018F3080013F3C80019F6099 :103F200080013E54800144588001440C0000749488 :103F300080018F488001443080014110D401169CDB :103F4000580BC041F01F0004D802300B301CF01F8A :103F50000002D80280014110D4014879F3380008EA :103F60005808C021DC0A3008F3680008F01F00037D :103F7000DA0A00000000749880014284D4015C7B5E :103F8000F01F0002DA0A00008001433CD401169CB5 :103F9000F7DAC010F01F0002D80200008001433C95 :103FA000EBCD40C0203DF01F00164969F3380008F2 :103FB0005808C04072085808C0402FDDE3CD80C0CB :103FC000E0680100FAC6FFF4E06C01000CE8F01FA5 :103FD000000E0C9B1897F01F000D9A5B580BC0A0A9 :103FE0005C7BFAC8FFF81A99FACAFFFC0E9CF01F16 :103FF00000080E9CF01F0007CE1B0000800140A4AB :10400000000074988000920080013F58800192DC8B :10401000800091E8D40148583019701CF1690009FA :10402000700A5D1AD8020000000074A8EBCD40CCE5 :10403000206D49A6FAC7FFF46C2E8F2EECE200002B :10404000EEE3000016961093FACEFFF0580CC22053 :104050007C08FC1C8000F1EC100BF4081509BBB8BF :10406000F1E611C812481648301C9D08F01F000CDC :104070000E9C30CA1A9BF01F000BFB38000AA68862 :10408000FB39000B300CA699F01F00052FADE3CDD6 :1040900080CC7C0BCE3B00008003B774800075B4ED :1040A00080007534EBCD4080201D4987EF38000833 :1040B000EDB80000C071EF3900093008F0091800B0 :1040C000C0402FFDE3CD808030091A98129B129CCE :1040D000305AF01F000F3FF91B88F2081800CF205C :1040E0001B98EDB80001CEE13008301C109B302940 :1040F000E06A00F0F01F000630186E1CEF6800093F :104100006E095D19CDFB0000000074A88001402CF1 :10411000EBCD40C0201D301AF40C1800C1B0C08394 :104120003028F00C1800C2602FFDE3CFC0C01A97F2 :10413000300630091A98E06A00F1129B301CF01F1B :1041400000161B98EC081800CF51300C2FFDE3CD62 :1041500080C018961A9730191A98E06A00F1300B4F :10416000129CF01F000D1B98EC081800CF51300C6A :10417000CEEB48A8F1390008F9D9C001F7FA1E00C2 :10418000F9BC0100F9B8005AF7F80E002FFDE3CD95 :1041900080C000008001402C000074A8EBCD406876 :1041A00048F516961893AA4B301CF01F000E0A9C77 :1041B000310A300BF01F000C069BF5D6C010300CF6 :1041C000F01F0009304A300B488CF01F0007300CFC :1041D000F01F00040C9CE3CD80680000000002107A :1041E000800075B4800075348003B780EBCD40400B :1041F00020ED30083009FAE90018FAE90000FAE980 :104200000008FAE9001049BBFAC6FFD4762A8D2AC5 :10421000F6E80000301CECE90000F01F0017320A3D :10422000300B1A9CF01F00150C9C30CAFACBFFE033 :10423000F01F0012300CF01F00103019FB38002A5C :10424000F2081800C0503FFC2F2DE3CD804048C835 :10425000F1390008F9D9C001CF8030083039304A2F :10426000109B301CF01F00072F2DE3CF8040000073 :104270008003B784800075B480007534000074A892 :104280008001402CD42130094A881695F169000933 :104290001896320BF01F00268C085CC82FE8F7D860 :1042A000B010AA0BEFDCB010F6C90007E06805F902 :1042B000F0091900E08B00300D890D98F208180004 :1042C000C220F6071900C182E0640200F9D7C010CD :1042D0005C7B181BEC0C000CE04B0200E80B17B0E9 :1042E0005C7BF01F00138A0B0E0CEFDCB010EE0BA2 :1042F0001900FE9BFFED48F83009118AF20A1800F8 :10430000C0D1D8220DA8F2081800CDC10DB8F2080E :104310001800CD813008AA08D822F5DBC010486CFF :104320000C9BF01F0006D822000074A88001419C5D :10433000000074A48003B76C8001447CD4314A38F7 :1043400018921695118A3009F20A1800C3615805AF :10435000C33049F83004F0C0FFF4E0610200C22825 :10436000E06602000C970C93301CA006F01F0019A9 :10437000300B497C314AF01F0018E404000C0E9AFF :10438000300BF01F0015304A300B494CF01F001263 :10439000300CF01F0010EA0601080604EBD8B0103C :1043A000C0B0E2051900FE9BFFDDEDD5B010EFD6E1 :1043B000C0100E93CDABD832F5DBC010189B488CE3 :1043C000F01F0008CC5B0000000074A4000001FC9A :1043D000800075B4800075348003B7808003B770A7 :1043E0008001447CD401201D3009301C1A98E06AF9 :1043F00000F5129BF01F0004314CF01F00042FFD4C :10440000D80200008001402C800075D2D401F01F3A :104410000007F01F0007C03030CCD802F01F0003A7 :10442000F01F0003CFA1DA0A800143E4800141ECD0 :10443000D401314CF01F0006F01F0006C03030CC14 :10444000D802301CF01F0004DA0A0000800075D288 :10445000800141EC80007618D4014878910C911BC2 :10446000F0CCFFF8F01F0005F9BC010CF9BC00010D :10447000D8020000000074A8800076385EFCD703E4 :10448000EBCD40F849C56A096A181039C2F08B0CA7 :10449000EAC7FFF0EAC6FFF4EEC30010EAC4FF70FB :1044A0000F89EDB90000C091EDB90001C0616C0940 :1044B0006A081039E08800082F072F060837CF1147 :1044C000E3CD80F86E19300B169C5D190F883FDA2A :1044D000F1EA0009EDB80002C0716609EEF8FFF8D4 :1044E00012088D08CEABAE89CE8B5809CD118B1C2E :1044F0008B0CCCFB000074B8EBCD408048CE1897F5 :10450000300AFCCBFFF0F408150417892F88FC084B :10451000000CEDB90000C0512FFA2F0B588ACF4183 :104520003018F96800088F0AE3CF9080000074B853 :104530002FFC4849A56C18091388A1D8B2885EFCE5 :10454000000074B82FFC4848A56C30091808B089E1 :104550005EFC0000000074B8EBCD40E0189E14979C :104560001295587BE08B002C496AF6C8FFFFA568BE :10457000F408000C1989EDB90001C1F0F608150422 :104580001296F4080008A1B6F60915012FF9F409EE :10459000093E740AB8869157FC0A000A913A5805F8 :1045A000F9BC0001F9B90104EDD9E138F9F81E00B0 :1045B000F9BC0101E3CD80E0E3CF80E0E3CFC0E0D0 :1045C000000074B848387019700C121C5EFC0000B2 :1045D000000074B85EFC300899085EFC1899780CED :1045E000580CF9B80001F3F80A005EFC300899088D :1045F0005EFC300899085EFC5EFC5EFC5EFC5EFCC6 :10460000D401580BC110F80B000B300A487E7C090E :10461000F40900092FDAF208141FB98810091019DB :1046200018C9163CCF51D802000074B85EFD5EFF79 :104630005EFF5EFF5EFF3FDC5EFC78082FF89908A6 :104640005EFCD401780820189908C020D80A5D1BA8 :10465000DA0A301899085EFCD401F01F0002D80273 :1046600080016D6CEBCD406048784889F5DBC01067 :104670001895189B7006720C5D160A9CF01F0004BA :10468000E3CF906000007540000074B4800091E8B2 :10469000D401E06A0088300B485CF01F0006F01F70 :1046A00000064868300C9118910CD802000074B8CC :1046B000800091D0800146C000008B545EFCD7037F :1046C000D401F01F0011F01F0011301B4909169C86 :1046D000490AF01F00114919491A301B303CF01FDC :1046E000000EF01F0010300A301BE06C00F0F01FCD :1046F000000EF01F000E300A302C149BF01F000C2F :10470000D80A0000800148C0800147888003B79024 :10471000800146BC800148548003B794800157A4AF :104720008001499C800147E0800149F480014730C5 :104730004828F00C092B5EFC00007548EBCD40E0EA :104740004905189716966A085808C0205D1848E869 :10475000F007032C580CC061C088F0061800C09008 :104760002F8C19885808CFA16A085808C080C00843 :1047700078193028F0091800FE9BFFF8E3CD80E09F :1047800000007544000075485EFCD703EBCD40FC8B :104790004935189630120A94EAC3FFF46A0858089B :1047A000C0D068385808C19030185806CF805816C5 :1047B000C0305808CF40E3CD80FC48976E28701970 :1047C000703C700B5D196E2870296E188F29103996 :1047D000EFF20A003008CEAB0697CF1B000084B47E :1047E000EBCD40C018961497580BC24049789009F9 :1047F000F6091900E088001BF60B00184949F20879 :10480000002C781A74085808C171741E7428103E60 :10481000C1507C283009951895099D369D07FD6B80 :10482000001078089D18E3CD80C0307B305CF01F0D :104830000009E3CD80C0741ECEDB306B305CF01F0E :104840000005E3CD80C00000000002200000755C80 :104850008001473CEBCD408049281497129E581B9D :104860005F8A9009F80919005FB81468C130F80C24 :10487000001AF60B0019F4CCFFFF48BB48B8F60A43 :10488000002AF0090029952EF60C09299507E3CD99 :104890008080302B305CF01F0006E3CD808000006C :1048A000000002200000755C000084B48001473CD9 :1048B000D401307B305CF01F0002D8028001473CFD :1048C000EBCD404030084AB9B2884ABA940858083B :1048D000C4D04AA95C784AABF00800184A9EA36885 :1048E000300C2F88F6CAFFF4F20800082F89930CC9 :1048F000F34AFFFCF34EFFF82F491039CF91F6CE63 :10490000FFE84A1A49EB301C970C972A971A14981B :10491000F4C9FED42EC8F148FFF41238CFC1F54ACD :1049200001342F4BF4CAFEC01C3BCEF1E06A00807C :10493000300B496CF01F00164948F0C9FF902F0852 :10494000F148FFFC491A1238CFB130064918F54634 :10495000007C910A9116310A0C9B48FCF01F000C58 :1049600048E80C9C9106E3CD8040485BCC9B00005E :1049700000007598000002200000755C000084B4FF :10498000800148B0000082340000759C800091D006 :1049900000007630000076200000761C4848485918 :1049A000485A91099119913A912A5EFC000002241B :1049B000800149D4800149EC48484859485A911926 :1049C0009109913A912A5EFC00000224800149D4A9 :1049D000800149EC48494858311AEA1A4000143C11 :1049E0005E085E19800149D480014A0C481C5EFCB7 :1049F000800149ECD4013019300A303BFC1C4000E6 :104A0000F01F0002D8020000800186C8EBCD408074 :104A10004B373099EA194000123CC310E088001F60 :104A200030B9EA194000123CC2A0C4233139EA1956 :104A30004000123CC500E069078AEA198000123C78 :104A4000C241761CF01F0027300A4A77149B314C74 :104A5000F01F00260E9CE3CD80803019EA1940003B :104A6000123CC320E08800153079EA194000123C5E :104A7000C0603089EA194000123CC0713019300A18 :104A8000303BF01F001B49B70E9CE3CD8080FC1922 :104A90004000123CCFA130194978300AF149004456 :104AA000304C149BF01F00110E9CE3CD8080301918 :104AB000300A303B30ACEA1C4000F01F000D48D7F4 :104AC0000E9CE3CD8080302B300CF01F000C0E9C30 :104AD000E3CD808048470E9CE3CD808080014A0C66 :104AE0008001DA2C800149D480014658800186C8B3 :104AF000800152F0000087F480018390D401201DD2 :104B00001A9CF01F0008C07040085818E088000682 :104B1000F01F00052FFDD802F01F00042FFDD80262 :104B200080015F4480015EDC80015EB4EBCD40F823 :104B3000201DFEF805EA189716951496103AC3A0A2 :104B4000FEF805E0103AC610FEF805DC103AC06029 :104B50000C970E9C2FFDE3CD80F8E068018CEA18DD :104B60008000103CE08000F7E068078AEA188000C7 :104B7000103CE08000ADE0680186EA188000103C3F :104B8000CE8176170E9CF01F0169F01F0169C0915C :104B9000FEF805A0EEEA0000F0EB00006E29912976 :104BA0000C97FEFA0592300BFEFC0590F01F016495 :104BB000CD1BF01F015F1894C4D1E0680184EA188E :104BC00080001037E0800185E08B00D2E0680107AB :104BD000EA1880001037E08001A0E0680183EA183D :104BE00080001037CB616A170E9CF01F0156E080E1 :104BF0000230FEF905523048F34800440E9B334C16 :104C00000C97F01F0152CA6BFEF4053CE0680112DC :104C1000EA188000E8F300F8103CC540E08B006320 :104C2000E0680107EA188000103CE08000F7E068C7 :104C3000010DEA188000103CE080010DE0680105DC :104C4000EA188000103CC851761C1497F01F0140F0 :104C5000C81BFEF304F2E0680188EA188000E6F45D :104C600000F81037E08001B0E08B00ABE068018312 :104C7000EA1880001037E080018BE0680184EA18B0 :104C800080001037E080016EE0680107EA188000BC :104C90001037FE91FF5F6A18303CF13B000BF01FAC :104CA000012D3019300A303B30CCEA1C4000F01F97 :104CB000012A300AFEF70470149B301CF01F0127F4 :104CC000C49B761C1497F01F0126C44B6A1CF01F6E :104CD0000125300AFEF70490149B314CF01F011F90 :104CE000C39BE068018AEA188000103CE08000CB9A :104CF000E068078AEA188000103CCE90E068011551 :104D0000EA188000103CFE91FF2576150A9CF01FE2 :104D100001170BC93048F0091800E08001BBE08B97 :104D2000019B3008F0091800E08001BF6738301996 :104D300011EAF20A1800E08001DD0A9CF01F010C64 :104D4000FE90FF08300A0C97305C149BF01F0103A3 :104D5000C01B76170E9CF01F0107F01F00F5C4F171 :104D60000E9B33DC0C97F01F00F9CF4AE068018AF4 :104D7000EA1880001037E08000BDE068078AEA1872 :104D800080001037E0800099E0680188EA18800010 :104D90001037FE91FEDF6A170E9CF01F00F7C0A0CF :104DA000F01F00F63069FEF8039EFEF60376F14927 :104DB00000440E9B336C0C97F01F00E4CCBAE06803 :104DC000018EEA1880001037E08000B7E068078A9B :104DD000EA1880001037FE90FF7BE068018AEA182D :104DE00080001037FE91FEB66A160C9CF01F00E49E :104DF0001897E0800114FEF7032ACACA3099FEF81A :104E000003460C97F1490044FEFA032C300BFEFCDC :104E10000372F01F00CBC9EA76150A9CF01F00DA76 :104E2000302B169CF01F00D9FEF702FCF01F00C0CB :104E30001896E08100DD0A9B337CF01F00C40C9AB9 :104E40003019303B30ECEA1C4000F01F00C3FE9FDD :104E5000FE8276160C9CF01F00CE302B304CFEF7F5 :104E600002C6F01F00CAF01F00B2E08000EC30194B :104E7000300A303B310CEA1C4000F01F00B7FE9FA7 :104E8000FE6A76150A9CF01F00BE1897E08000BAF3 :104E9000300A302C149BF01F00B13078E9480044F0 :104EA000F01F00A3FE91FE560A9B0C9733BCF01F27 :104EB00000A7FE9FFE506A1CF01F00AA089AFEF78A :104EC00002A6089B314CF01F00A5FE9FFE446A1706 :104ED0000E9CF01F00B0C060FEF9026C3058F34821 :104EE00000440E9B335C0C97F01F0098FE9FFE332E :104EF0006A170E9CF01F00A2C0803069FEF80248BD :104F0000FEF60220F14900440E9B33BC0C97F01FC3 :104F1000008FFE9FFE206A1B337CF01F008C089AD6 :104F2000FEF702043019303B30ECEA1C4000F01F61 :104F3000008AFE9FFE106938301911EAF20A180043 :104F4000FE90FE086A1CF01F0094FE91FE03189A62 :104F5000189BFEF70246301CF01F0080FE9FFDFBF1 :104F60006A150A9CF01F008B1897E08000874F2A73 :104F7000300BFEFC022AF01F00721897E08000AE92 :104F800030580C97E7480044FE9FFDE56A150A9CDF :104F9000F01F006C1897E08000956938301911EA0D :104FA000F20A1800FE91FDD64E3A300B4FDCF01F8E :104FB00000641897E08000A930480C97E748004447 :104FC000FE9FFDC96A160C9CF01F006B1897C2600B :104FD000F01F006A30684D37E7480044FE9FFDBB74 :104FE000EACBFFFC301A30DCF01F005C3019300ACD :104FF000303B30CCEA1C4000F01F0057FE9FFDAB59 :10500000F01F004BFE90FF4E0E9A3019303B30CC13 :10501000EA1C4000F01F0050C44B303B30CCEA1C6F :10502000400030190E9AF01F004C0DEB304CF01F71 :1050300000490E9A0E9B301C4BB7F01F0048FE9F94 :10504000FD8A0C9B33ACF01F0041FE9FFD844D3662 :10505000FE9FFDD63068F0091800FE98FE693828DA :10506000F0091800FE91FD76300A0C97325C149B13 :10507000F01F003AFE9FFD6F189A303B30CCEA1CBF :1050800040003019F01F0034EB3B000D303CCD0BDD :105090003008FACBFFFC0C9716F8301A30ECF01FF2 :1050A000002FFE9FFD580A9CF01F003FFE90FD520E :1050B000300A0C97306C149BF01F0028FE9FFD4BAC :1050C0000BCB302CF01F00230E9A0E9B301C4B375D :1050D000F01F0022FE9FFD3F189A303B30CCEA1CA7 :1050E00040003019F01F001CEB3B000D301CCA0BB8 :1050F00048D7F01F000FFE91FF750A9B338CF01FFD :105100000013FE9FFD28189A303B30CCEA1C40006B :105110003019F01F00110BCB301CC8AB800152F0CE :10512000800151A8800156388001D9AC800185E406 :105130000000763880018E9C8001E03C8001EF20E9 :105140008001E88C000087F480016D6C8001E2D45E :1051500080018390800186C8800146588001E00864 :105160008001DA2C800149D48001E2FC80016D4A83 :105170008001D9C88001E4D080014AFC8001E4307C :105180008001E0D48001D9FC800183A08001D9E8AE :105190008001E81C8001E3DC80014A0C8001E7B853 :1051A0008001E58880016D48EBCD40C04C96189792 :1051B0003138EA184000103CE0800087E088002485 :1051C000E068010DEA188000103CC150E088004002 :1051D000E0680115EA188000103CC0D0E068018A40 :1051E000EA188000103CC070E0680112EA188000E4 :1051F000103CC3910E9C4B7AF01F003718960C9C04 :10520000E3CD80C03018EA184000103CC510E0889B :10521000002E30D8EA184000103CC1003108EA18CE :105220004000103CC3F030C8EA184000103CC1B147 :10523000301C302BF01F00290E9C3019300A303BF7 :10524000F01F00274A760C9CE3CD80C0E068010582 :10525000EA188000103CCCF0E0680107EA188000F2 :10526000103CCC900C9CE3CD80C0E04C008ACC304C :10527000FC184000103CCF71307949B8300AF14930 :105280000044149B302CF01F0019300A30FC149B92 :10529000F01F0016302B300CF01F00100C9CE3CDDB :1052A00080C0303C302BF01F000D0E9CCC7B48E9B9 :1052B0007298ABC8300A9398149B303CF01F000BD7 :1052C0000C9CE3CD80C048A60C9CE3CD80C00000C0 :1052D000800151A880014B2C800183A0800186C8E9 :1052E00080015638000087F480014658800149D477 :1052F000D421FACD00E4FEF602E21898FEF502E0B1 :10530000ECF700F83109EA194000123CE08000D5C2 :10531000E08B003630A9EA194000123CE08000C260 :10532000E088005330C9EA194000123CE08000A830 :10533000C6A330D9EA194000123CE080011930F9C7 :10534000EA194000123CC3D1FEFA0298300BFEFC71 :105350000296F01F00A61896C341189BFEFA02841D :10536000FEFC028CF01F00A1304C301BF01F00A18E :105370000C9A0C9B301CF01F00A0C238E06901841D :10538000EA198000123CE0880011E0690188EA19FE :105390008000123CC100E08B00A5E0690186EA199B :1053A0008000123CC0E1C078E0690183EA19800006 :1053B000123CC363109CFEFA0226F01F0090189561 :1053C0000A9C2C7DD8223079EA194000123CC7C0D3 :1053D000E08800973089EA194000123CE08000CF55 :1053E0003099EA194000123CCEC14FEA300BFEFC66 :1053F000020EF01F007E1894E08000CF3048ED4888 :105400000044CDFB4F7A300B4FECF01F0078CD916C :10541000189A189B4FC5301CF01F0077CD2BE06900 :105420000107EA198000123CCC60E0690115EA1915 :105430008000123CC1203139EA194000123CCC11E5 :10544000300A301C149BF01F006C300A304C149B47 :105450004EE5F01F0069CB5B6F38301911EAF20A94 :105460001800C72076160C9CF01F00690C9CF01FDA :1054700000694E98580CF0051710CA3B303B3019A4 :10548000300AF01F0066302B303CF01F005A300A03 :10549000301C149BF01F00584E150A9C2C7DD822FE :1054A0004D0A300B4DFCF01F00511897C3B0305817 :1054B000ED480044C86B303B3019300AF01F0057EC :1054C000302B304CCE3B6C9BE21B0040C2414C5A0F :1054D0004D5CF01F0046C9D03028ED480044C71B82 :1054E000E069018AEA198000123CFE90FF65E069DC :1054F000018EEA198000123CFE91FF64C5CBFC19B5 :105500004000123CFE91FF5E300A149B149CF01F79 :10551000003AC57B300A4BC5149B301CF01F003687 :10552000C50B30481A9BBAE8336CF01F00400E9A46 :105530003019303B30ECEA1C4000F01F00384B893A :105540004BB89119C3EB76170E9CF01F00310FC9B1 :105550003068F0091800FE9BFF354B15F01F003531 :10556000C2A10E9B338CF01F0031C2BB4AC530195B :10557000300A303BF01F0029C24B49AA300B4AAC1D :10558000F01F001ACAA1304849F5BAC81A9B334C1B :10559000F01F0026C16B306AEECBFFE2FACCFFFCB5 :1055A000F01F002530481A9BBA68335CF01F001FBB :1055B000089ACBFB3019300A303B30CCEA1C400053 :1055C000F01F00160FCB305CF01F000A300A301CB1 :1055D000149BF01F0009CF5A000087F4800152F09D :1055E00080018E9C8001E7548001EF208001E03C27 :1055F000800183908001465880014B2C8001E58812 :105600008001DA5480014A0C800149D48001E2FC17 :1056100080016D48800151A8800186C880015638FC :105620008001E7B88001EA8C80016D6C00000224E3 :10563000800185E48002E736EBCD40804C9731084D :10564000EA184000103CC6F0E088001DE068018CBC :10565000EA188000103CC3B0E088002EE068019397 :10566000EA188000103CC440E0680194EA18800009 :10567000103CC2714BC7761CF01F003C0E9CE3CD62 :10568000808030C8EA184000103CC400E088001D4B :1056900030D8EA184000103CC21030E8EA18400048 :1056A000103CC0F14B2A300B4B2CF01F00330E9CEA :1056B000E3CD8080E0680186EA188000103CC0706D :1056C0000E9CE3CD8080E04C008ACFB14A5AF01F97 :1056D000002B18970E9CE3CD8080F01F00294A4ACA :1056E000300B4A8CF01F00240E9CE3CD8080761C8A :1056F000F01F0025F01F0025C0514A5B33CCF01F7E :10570000002549970E9CE3CD80804A39731858983C :10571000CD803098496AF3480044300B49FCF01FB3 :105720000016CCFB49C973185888CCB03088F348B0 :105730000044F2F900F87338301911EAF20A18003F :10574000C0A03019300A303B30DCEA1C4000F01FAA :105750000014CB7B486A300B492CF01F0007CB1B91 :105760008001563880014A0C8001DA4680018E9C07 :105770008001E03C8001EF2080014B2C80015E34F1 :105780008001DA448001DA48800185E4000076383F :1057900080016D6C000087F48001E0D4800186C830 :1057A0008001E094EBCD40F84A37189416956E18B6 :1057B0006E090E930E96C118300B301CEA1C400087 :1057C0005D19300B6C39FC1C40005D196C388D285C :1057D0006E186E091238C2001039C190300B301C9F :1057E000EA1C40005D19300B6E19FC1C40005D196D :1057F0006E188F086E296E381039CDF10A9B089CFF :105800005D19873C6629123CCF71CE3B0A9B089CF0 :105810005D198F1CCF0B5805C0706A085818C060FE :105820000A9CF01F0006E3CD80F8EACCFFFCF01FD5 :105830000004CF7B00000224800091E88001D3A8FF :105840004878F14C00F8580CF9F81004F9B9010146 :10585000F1D9E108F9F81A045EFC0000000087F4B1 :10586000EBCD40C04948FAC6FFF4F0F700F4580702 :10587000C051C1E8F8C70008C1B0EECAFFDC740827 :10588000204D502815C9FB69000C15D8FB68000D88 :105890006C0850080DC9BAC90DD8BAD8F01F000756 :1058A0002FCD580CC0516E2C580CCE5118970E9C11 :1058B000E3CD80C0000087F480018898D40149D9E5 :1058C000F2F800F41838C0B078285808C2B0784808 :1058D000201899482F8CF01F0018D802580CF9F89E :1058E0001004F9BA01FFF1DAE108F9F81A043008F6 :1058F000F34800F448FA78285808C180F0C9000835 :10590000F54900F4CE8072482FF89348F4F900F47A :105910005809CE10724820182F8C9348F01F0006AB :10592000D80278385808CD41D802F54800F4CD3B6C :10593000000087F48001F2A0D4014989F2F800F058 :105940001838C0A078085808C240784820189948EC :10595000F01F0013D802580CF9F81004F9BA01FF2F :10596000F1DAE108F9F81A043008F34800F0780A8F :10597000F34A00F0580ACED074482FF89548487979 :10598000F2F900F05809CE50724820189348CE1B07 :1059900078185808CDB1CDFB000087F48001F2A043 :1059A000EBCD40801897580AC2C07858F608010815 :1059B0001438E08800274948F0FB00F8580BC190E4 :1059C000F8CAFFDC15D8204DFB68000D740950297A :1059D00015C8F6CAFFDCFB68000C7408500815C92E :1059E000BAC915D8BAD8F01F00092FCD580CC091EC :1059F0000E9CF01F00070E9CF01F0006E3CF908066 :105A0000E3CF8080000087F48001889880015938B6 :105A1000800158BCD4214A141895E8F700F05807C3 :105A2000C27079383006704AC02810976F387049B4 :105A30001439E08A00086E080E965808CF710E9649 :105A400010970A37C0D06A085808C0B00A9CF01FE7 :105A500000145806C1300A9B0C9CF01F0012D8227B :105A60006A185808CF416A482FF88B48CF3BE94C59 :105A700000F078482FF89948D8220A9B0E9CF01F16 :105A800000090E9CE94500F0F01F00050E9B0A9CE2 :105A9000F01F0004D8220000000087F48001F2A06B :105AA0008001F28CEBCD40C04A48FAC7FFF4F0F613 :105AB00000F05806C051C3D86C065806C3A06D3814 :105AC000707C2F4CF8E80000212DFAE90024F8EA58 :105AD0000008FAEB002CF8E80010FAE90034F8EAC4 :105AE0000018FAEB003CF9380020FB680044F93953 :105AF0000021FB690045EEE80000FAE90000EEEA4B :105B00000008FAEB0008EEE80010FAE90010EEEAEF :105B10000018FAEB0018EF380020FB680020EF397E :105B20000021FB690021F01F00062EED580CCC501F :105B30000C9CE3CD80C00000000087F48001891038 :105B4000EBCD40E0205D7608502817C9FB69000CBA :105B500017D81697FB68000DF8CBFFE2306A18964D :105B60001A9CF01F0034F01F00342FCD580CC05188 :105B7000300C2FFDE3CD80E06E7C2F4CF8E8000068 :105B8000212DFAE90024F8EA0008FAEB002CF8E8E5 :105B90000010FAE90034F8EA0018FAEB003CF93892 :105BA0000020FB680044F9390021FB6900456D388D :105BB000707C2F4CF8E80000FAE90000F8EA0008D1 :105BC000FAEB0008F8E80010FAE90010F8EA00180B :105BD000FAEB0018F9380020FB680020F9390021A1 :105BE000FB690021F01F00152EED580CCC20320B64 :105BF000300CF01F00131895CBC0189A0E99491B52 :105C0000F01F00110BF93008F0091800EDF800132F :105C1000F1F90807EBF90E07FACCFFFC6D3818D83C :105C20001A9CED45004CF01F0009301CCA3B0000D7 :105C30008002E73680018898800189108001D8DCD5 :105C40008001D3EC8001AD408001D3A8EBCD40C0F2 :105C500049C649D86C09700A1439C05530070E9CE2 :105C6000E3CD80C0350CF01F00191897CF906C0859 :105C70002FF8350A8D08300BF01F0015320B300C51 :105C8000F01F0014EF4C004C1898C16030084929EF :105C90008F680E9CF30A017C8F28EF5A001CEF6876 :105CA000002A8FF88F488F58EF4800408F188F08D0 :105CB0008F38E3CD80C00E9C1097F01F0008CD0BED :105CC000000076440000025880009200800091D0CD :105CD0008001D8DC00000260800091E8EBCD4080BC :105CE000189778485808E08A0004E3CD8080793816 :105CF0005808C0402B4CF01F000648697208201855 :105D00000E9C9308F01F0004E3CD80808001D3A88F :105D100000007644800091E8D4014899F2FC00F834 :105D2000580CC0A07848201899483008F34800F86B :105D3000F01F0004D802F34C00F8D802000087F4EA :105D400080015CDCEBCD40F84B131894E6F700F8CB :105D50005807C060189B0E9CF01F002EC1D1E6F7BB :105D600000F05807C4203006C1285806C0706F38AC :105D70006D39704A7248103AC064E6F800F80E387F :105D8000EE0617106E070E955807C0900E9C089BE4 :105D9000F01F0020CEB00E9CE3CD80F8F01F001E57 :105DA00058065F18580C5F0918971069EA0918001F :105DB000C201089B306AEECCFFDCF01F0018089B84 :105DC000306AEECCFFE2F01F00156F3A0899149C80 :105DD000493BF01F001430080E9C8F088F18F01FED :105DE00000120E9CE3CD80F8F01F000B1897CE2B0D :105DF0000C9CF01F000E0C9CF01F000D0C9CF01F63 :105E0000000DF01F00051897CD51CC6B000087F4F2 :105E100080015B4080015C4C800091DC8001D3EC10 :105E20008001AD4080015A1480015938800158BC6E :105E300080015CDCEBCD40E04905EAF700F458074F :105E4000C0D1C158F0C600080E9CF01F000D0E9C7A :105E5000F01F000C5806C0B00C976E285808CF31C0 :105E60000E9CF01F00070E9CF01F00063008EB4848 :105E700000F4E3CD80E00000000087F4800158BC0E :105E800080015CDC580CC04078185B98C110489ABF :105E900074991298EDB90001F9BC0101F9BB001029 :105EA000F3DBE038F5F80A09F9BC00015EFC5EFDA1 :105EB000000087F4489A7498109CF0091604E21CBC :105EC0000002F9BB0110F1DBE138F5F81A09F9B865 :105ED0000101F3D8E12C5EFC000087F4489A749825 :105EE000109CF0091604E21C0002F9BB01EFF1DB83 :105EF000E128F5F81A09F9B80101F3D8E12C5EFCA4 :105F0000000087F448887099129CA589E21C000261 :105F1000F9BA0101F3DAE148F9B90101F1D9E12C4B :105F20005EFC0000000087F418994868709CE21C31 :105F30000002F1F8103FF3F81A00F9BC01015EFC11 :105F4000000087F418994868709CE21C0002F1F880 :105F50001041F3F81A00F9BC01015EFC000087F45F :105F600018984859729CE21C0002F3F81A41F9BCD7 :105F700001015EFC000087F44839300C7298A7C814 :105F800093985EFC000087F44839300C7298A5D8CD :105F900093985EFC000087F4D401E06A0100300BA6 :105FA000482CF01F0003DA0A00007648800091D0E8 :105FB000EBCD40C04A0A18967498109CE21C00026F :105FC000C1D0F4F700F85807C1801099E2190020F9 :105FD000C270A5C8A7A8F4FB00BC95983009497AFF :105FE000E06CEA60F01F00163008F0061800C100EF :105FF0003018F0061800C040301CE3CD80C0311CC2 :10600000EECBFFE2306AF01F000FE3CF90C0312CDF :10601000EECBFFE2306AF01F000BE3CF90C0A5B8D3 :10602000F4FB00B89598E06CEA60487AF01F000431 :10603000CDCB0000000087F480015F7880014558D7 :106040008001465880015F88D401F01F0002D80209 :1060500080018040D40148687098E2180002C03185 :10606000109CD802F01F0003D8020000000087F443 :10607000800183FCD40148687098E2180002C031A6 :10608000109CD802F01F0003D8020000000087F423 :10609000800183D8D431FACD0188E06A0168300BE1 :1060A0001A9CF01F002CFAC6FE541A901A9CF01F7E :1060B000002A581CC03029EDD832FAC5FFF8401824 :1060C000F0081016EA0800081035C4120A97FAC43E :1060D000FE98ECC1FFF8C09840182EA7F0081016E3 :1060E000EA0800081037C3326C08204D50280DC94B :1060F000FB69000C0DD80E9BFB68000D306A1A9CE2 :10610000F01F0016F01F00162FCD580CCE60EECBFE :10611000FFFA310AFACCFE88F01F0010E2E8000016 :10612000310AE8E90000089BE2E20008FACCFE88A8 :10613000E8E30008F01F000BCD01189B316A0E9CAC :10614000F01F0004009CF01F0008CB6B29EDD83A2B :10615000800091D0800160748002E73680018898C9 :106160008000917C80016054D431FACD018CE06ACA :106170000168300BFACCFFFCF01F0050FAC5FE504E :10618000FACCFFFCF01F004E581CC03029DDD8327D :10619000402858F8E088007FF0081016FAC1FFF494 :1061A000E20800081031E0820087E06801685018BA :1061B000EACBFFF8FAC6FFF002973004FAC0FE946B :1061C000500BC0C85804C36040282EA7F008101612 :1061D0002EA6E20800081037C4926A08204D502805 :1061E0000BC9FB69000C0BD80E9BFB68000D306AD5 :1061F0001A9CF01F0034F01F00342FCD580CCE3005 :10620000ECCBFFFE310AFACCFE84F01F002E400BCF :10621000F6E80000310AE0E90000FACCFE84F6E27C :106220000008009BE0E30008F01F0028CB005804A2 :10623000CCC10F89E8091800CC810F98F20818002A :10624000CC410FA9F0091800CC010FB8F2081800D2 :10625000CBC10D89F0091800CB810FD8F2081800C6 :10626000F9B40100EE041700CB0B5804C2400A9B9E :10627000306A089CF01F0013EACBFFF8310AE8CC23 :10628000FFFAF01F0010FACCFFFCF01F001129DD0F :10629000D832F00A1110FAC1FFF4F40A1016E2081D :1062A000000C300BF01F00053108E0690168502830 :1062B0005019C7FB3FDCC6BB800091D080016074E1 :1062C0008002E736800188988000917C80016054CC :1062D000EBCD40C0208DBACBBA8A189B4968709C20 :1062E000E21C0002C06118970E9C2F8DE3CD80C088 :1062F0003008FAC6FFF8504850281A99FACAFFFC2D :106300000C9CF01F000EC111189740285808C0407F :106310000C9CF01F000B404C580CCE70F01F000975 :106320000E9C2F8DE3CD80C00C9CF01F0007581CE5 :106330005F07CECB000087F48001E1308001D3A855 :10634000800091E880018E9CEBCD40C0201D491754 :1063500018966E9CE21C0002C0412FFDE3CD80C068 :106360001A9CF01F000DEF4600FCEEF801105808D3 :10637000C051301C2FFDE3CD80C0EECCFEECEF3AD7 :10638000011BEF3B011AF01F0005301CCF4B000032 :10639000000087F4800177A4800162D0EBCD4080BB :1063A000201DBA8C48C76E98EDB80001C0402FFD83 :1063B000E3CF808030181A99300A308B487CF01F68 :1063C0000008581CCF511B88EF4801202FFDE3CD5A :1063D00080800000000087F48003B7A08001776C04 :1063E000D401201D48B91898729CE21C0002C0E03C :1063F000300AF368004C308BFAC9FFFC486C12F885 :106400003018F01F0006581C5F0C2FFDD80200004A :10641000000087F48003B7A88001776CD401203D89 :10642000BA8C496A749CE21C0002C0312FDDD8028C :106430001B8B3038F00B1800E089001DE06832003B :10644000EA18312EE069352EEA19312EFAE90004F6 :10645000F4F800F8F3DBB008300A5808F1F91A0F25 :10646000308B30181A99FACCFFFCF01F0005581C2D :10647000CDE03FECCDCB0000000087F48001776CCD :10648000D421206D4A0618976C98EDB80001C040E1 :10649000300C2FADD822584C5FB8E04C00FF5F198C :1064A0001268C0303FECCF6B300814995028169A10 :1064B0005008189B1A951A9CF01F0014CEA01A9C25 :1064C000F01F0013400818945808C0401A9CF01F91 :1064D0000011402C580CC030F01F000F5814CD9103 :1064E0006C98EDB80007C0C15837E08B000AEE0881 :1064F000150648A9300A1009089C930ACCBB301C29 :10650000CC9B0000000087F48001E1A480018E9CF8 :106510008001D3A8800091E800007648EBCD40C010 :10652000202D496718966E98E2180002C2103FF8B5 :10653000FACAFFFEBAF8BAA8BAB8BAC8BAD8BAE85E :10654000300BF01F000F6E98EDB80007C0E1583611 :10655000E08B000CEC081506300A48A9301C100925 :10656000930A2FEDE3CD80C02FEDE3CF90C0109CB8 :106570002FEDE3CD80C00000000087F4800164802F :1065800000007648EBCD40C0202D49F66C9CE21C03 :106590000002C2703FF8BAF8BAA8BAB8BAC8BAD8F6 :1065A000BAE8ECFB00F8580BC260F6CCFFE2303AD8 :1065B000300BF01F0016FAC7FFFE301CF01F00144E :1065C000303B0E9A300CF01F00136C99300B129870 :1065D000ED4B0110A3D88D98EDB90007C050301CC9 :1065E0002FEDE3CD80C0E06A010048BCF01F000B36 :1065F000301CCF7BFAC7FFFE303A0E9CF01F000321 :10660000CDDB0000000087F4800162D08001651CB2 :106610008001648000007648800091D0D43120DD74 :10662000FB690010FB68000CFAC9FFA8FEF7023CEA :1066300018956E981696149272307201E218000244 :1066400072147223C041300C2F3DD832E04B002031 :10665000E08800043FFCCF9B584CE08B002158DBC6 :106660005FBA301BFB380010F60818005F09126A89 :10667000C030580CC1413078FACCFFD4FB680033ED :10668000F01F007B3008303C50785058F01F0079E4 :1066900058D6C070E08B00315856C0303FECCD5B0F :1066A00030683019FB680033EF49011CFACCFFCD8C :1066B000F01F0071501C1AD31AD41AD1FB38001CD9 :1066C00004991AD80C9AFB380043FACCFFDC0A9BD9 :1066D000F01F006A2FCD580CC1B140585808C05067 :1066E000FACCFFECF01F0066407C580CCAD0F01FBB :1066F0000065300CCAAB5906C6C0E0460020CCF19C :1067000030283029FB680033EF49011CCD0BFACC4F :10671000FFECF01F005D500C40585808C050FACCF8 :10672000FFECF01F0057407C580CC030F01F0055A4 :1067300040085818C8915800EFF81009F9B9010835 :10674000F1D9E138EFF81A093009FB380010F208E6 :106750001800C051F9D5B008F01F004C6E98EDB884 :106760000001C0514C18F0F800FC501840185808AF :10677000C080FB3A0010FB3B000C089CF01F00445B :10678000306A089BEECCFEECF01F0042301AFACBC8 :10679000FFF4EECCFEE6F01F003FEECCFEE5301A33 :1067A000FACBFFF0F01F003B3018EF480110FB68F8 :1067B00000326E9C4AD7EDBC0001C120EDBC000741 :1067C000C061FB38000C50285845C1E1301CC3DBC8 :1067D00030483039FB680033EF49011CC68B300864 :1067E0004ADB1099109A109CF01F002CC3401ADC51 :1067F0003018FAC9FFCA300A308B4A9CF01F0029B2 :106800006E9C2FFDCDCBEA0915064A780C9AF0094B :106810000007049BEF650026EF560024EECCFFFC3A :10682000F01F001C089BEF610036306AEECCFFD8E9 :10683000F01F00185803C110069B308AEECCFFD21F :10684000F01F001440288FF0EF68003830188F08D0 :10685000109CCFBA6E9CCB3B069B308AEECCFFD20D :10686000F01F0012CF0B0000000087F4800177A416 :106870008001EF6C80017BD88001E2148001D3A8F5 :10688000800091E880018E9C8001641C800162D0B0 :10689000800091DC80015E8480016AF48003B798F7 :1068A0008001773000007648800091D0EBCD40C069 :1068B000300749A60E98A7682FF7EC08000B76085A :1068C0005808C0F10E985847CF714957EF3C004C1B :1068D000F01F0014EEFC0100F01F0013E3CF90C086 :1068E00076F8F6C9FFD2F73C00261AD8F6C8FFD8CA :1068F0001AD91AD8F7390036F6CAFFFC1AD9F73870 :106900000038F7390027F71B0024F01F00082FCDAF :10691000581CCD90E3CF80C000007648000087F47B :10692000800163E0800163488001661C7808301CA8 :10693000F80A094C201C106C5EFCD70348787008DC :106940005808C0901838C041C078103CC05070B88A :106950005808CFC15EFD5EFF0000778C189A48F89A :10696000709CE21C00025E0C70A8EDB80000C03004 :10697000305C5EFC48AC780B583BE089000D300978 :106980004888F00B003891189109950BF6C8FFFF65 :1069900099085EFF3FDC5EFC000087F4000077880A :1069A0000000776848D972A8EDB80000C1313008FE :1069B000780A99D848ABF60A003A741999E974181C :1069C000F8C9FFCC910C7808301CF60800389119F2 :1069D0005EFC305C5EFC0000000087F4000077681D :1069E000EBCD40C0189778B95809C18078C893C8D2 :1069F0006EC891096E3C580CC050F01F000B300857 :106A00008F3833CA6EA635AB0E9CF01F00080C9B66 :106A10000E9CF01F0007E3CF80C078C94858911939 :106A200078B9CE7B800091E8800091D0800183B05E :106A30000000778CEBCD40801897580CC180789877 :106A40005D1848F972095809C051C11872B958093E :106A5000C0E01237CFC16E785808C0B06E3C580CF9 :106A6000C060F01F000830088F588F38E3CF908047 :106A70000E9C301BF01F0004E3CF90800000778C49 :106A8000800091E8800169E0EBCD4080496972A8FF :106A9000EDB80000C040305CE3CD8080493870091B :106AA0001839E08A001E4928F00C00376E09580991 :106AB000C15072DA580AF3F8000EEFF80A01F3FA3F :106AC000000DF3F8100EF5F81A0E72E8129C910AF8 :106AD000F01F00086E095809CED1E3CF90803FCC5B :106AE000E3CD8080000087F400007788000077689D :106AF00080016A34EBCD40F81897169614951294DD :106B0000109333CCF01F000CC1403008990799B89E :106B10009938995899889996994599649973487ABA :106B2000301899A8741999C9930CF8C8FFD495180E :106B3000E3CD80F8800092000000778CD401202DF6 :106B4000500A48C972A8EDB80000C040305C2FED73 :106B5000D80248981A99F00B032A3048FA08000B1B :106B6000F01F0006581CF9BC0001F9BC01FECF0B58 :106B7000000087F4000077488001F1D8EBCD40C0D9 :106B8000201D4AC618976CA8EDB80000C441580CE7 :106B9000C3F0789B580BC3C0780A580AC3954A695A :106BA000F20A033850085808C061C1A870D85008CC :106BB0005808C1601037CFB1F40815036EDA580ACF :106BC000F3D8E009EFF8000EF3F80A01EFF8100E21 :106BD000F5F81A0E400870DA70E9930A6E9B3F9838 :106BE0008F18580BC0300E9C5D1B6E8B581BC0500D :106BF000582BC150580BC0516E2A1A9CF01F000F21 :106C00000E9C301BF01F000E2FFDE3CF90C02FFD18 :106C1000E3CF90C0305C2FFDE3CD80C0ECF801B82D :106C20000E38CEF130094838F14901B8CEAB00003A :106C3000000087F40000776880016B3C800169E008 :106C4000D40148C9169E72A8F1D8C001C031305C89 :106C5000D8024898304A76A9F00C032C1ADAF6C804 :106C6000FFF833CAF01F00052FFD581C5F0CD80237 :106C7000000087F4000077488001F164D431204D92 :106C800030084931189650285018FAC5FFF4FAC256 :106C9000FFF802901A93FAC4FFFCC098E006032A9A :106CA000F01F000C0E9B401CF01F000B3049049B92 :106CB0000A9AE206032CF01F0009304818970A9937 :106CC0001A9B089C5817CEB02FCDD83200007748B9 :106CD0008001F1D880016B7C8001F0B4EBCD40E005 :106CE000201D49356AA8A1A8300A49298BA8149704 :106CF000930A14984906EC08002C2FF748FA303B09 :106D0000F01F000F581CC0F10E985887CF5148D87B :106D1000300991189109301B1A9CF01F000B2FFDB0 :106D2000E3CD80E06AA8A1C88BA8CF2B000087F430 :106D300000007788000077488001692C8001F05CB2 :106D40000000778C8001695C5EFD5EFFEBCD4080CA :106D5000189778785808C030788C5D180E9CF01F12 :106D60000003E3CD80800000800091E8D4314B1017 :106D70001895169260095809C58030047258721926 :106D80000A38F7B400FF5809CFA10891E80C1502A2 :106D9000F01F00291893C46060075807C2303006FE :106DA000C0486E175807C1E06E580A38CFB10E9C24 :106DB000F01F0022E60609276E485808C0F06E1939 :106DC0005809EFF80002E1F80A01EFF90001EFF8C5 :106DD0001002F3F81A026E2891092FF66E17580761 :106DE000CE415804C1A006953006C0380836C154BB :106DF0006A07049C6E686E8B5D18491B0E9CF01F21 :106E000000112FF62FC56E485808CF100E9C48CBA6 :106E1000F01F000C0836CED5069CF01F000B029C1C :106E2000D8321891029CD83212941291CB0B0000E8 :106E300000007794800092008001463A80016D4CFA :106E400080014642800091E8EBCD4080324CF01F3B :106E500000081897C080324A300BF01F00060E9CC5 :106E6000F01F00050E9CE3CD8080000080009200A2 :106E7000800091D080014652EBCD40FC18961695CB :106E80001494129310924077F01F000AC100995693 :106E900099359964998799739942487A3008991875 :106EA00074199929930CF8C8FFFC9518E3CD80FC60 :106EB00080016E4800007794D431FACEFFDC189739 :106EC00016901491129310927C157C04580CC26099 :106ED00078095809C26049A66C085808C051C09882 :106EE00070185808C0601039CFC13018109CD832C3 :106EF000F01F0014C13099509931996399859972A6 :106F00009944300899186C199929930CF8C8FFFC1A :106F10008D188F0C3018109CD8323008109CD83245 :106F200008981AD50499069A029B009CF01F000647 :106F30002FFD580C5F188F0CCDAB0000000077942C :106F400080016E4880016E78EBCD40404856ECCC15 :106F5000FFF8F01F000530088D168D08E3CD804046 :106F600000007794800145D6EBCD40807847785A71 :106F70006E18103AE0880004E3CF8080783B6E0CF6 :106F8000F01F000B6E285808C0406E1B6E0C5D1879 :106F90006E3CE04C002BC050300A149BF01F0005E3 :106FA0000E9CF01F0005E3CF90800000800091DC74 :106FB00080014658800091E8EBCD40C0203D30086C :106FC00018979928990814961A9C308AF01F001176 :106FD000FACBFFF80E9CF01F00102FED580CC101EA :106FE0006E085808C0400E9CF01F000C6E2C580C08 :106FF000C040F01F000B300C2FFDE3CD80C05806C1 :10700000FBF81000EDF81A002FFDE3CF90C0000050 :107010008002E7368001DE6C8001D3A8800091E811 :10702000EBCD40C0189778185B98C0C0783B580BE0 :10703000C17078465806C04078685908C050E3CF00 :1070400090C0E3CF80C0785A590AE08800153FF815 :107050008D28ECCCFFF4F01F000CE3CF90C0784CEF :10706000580CCEE06E685908CEB12F4CF01F0006C8 :10707000E3CF90C06C0CF01F00056E5830198D18CE :107080008D29CE8B8001A25C800091DCEBCD40E0AD :10709000201D1697E04C0081E0800088E08A0027E0 :1070A000E04C0083C2F0C2B4760A1A9C300BF01F89 :1070B0000064E08A004F585CC490314CF01F0061BE :1070C0004008913C4009723A580AC7A06E0830093E :1070D000990899399919EF380008992840083149D9 :1070E000301A91594008911AC1D8584CC4A0E04CAC :1070F0000080C330300C2FFDE3CD80E0E04C0085F4 :10710000CFA16E0A300B1A9CF01F004DE08A0022BE :10711000585CC1C0EF3900084008300A9119400896 :10712000915A301B400CF01F0048581CCE41400CB7 :10713000F01F0046C0B0400B76785808C070300C85 :10714000F01F0043581C5F0CCD7B2FFDE3CF90E078 :107150003FEC2FFDE3CD80E07645760A1A9C300B9C :10716000F01F0037FE9AFFF6585CCF005805C49117 :1071700040089135400993550FCA4008911ACD2B0C :107180007626760A1A9C300BF01F002DFE9AFFE23D :10719000585CCDC05806C1914008301A913640095C :1071A00093564008911ACBEB760A1A9C300BF01FCD :1071B0000024FE9AFFCF585CCC900FC9CAEB3FD891 :1071C00093184009935ACAEBECC5FFED0A9CF01FD7 :1071D000001D4008913C1899400A743B580BC2406E :1071E0006E080C9A93089336EECBFFF430162F0CF2 :1071F0009316F01F00184008915540099316C92BAB :1072000040060A9CF01F000F8D3C4009723C580C50 :10721000C1000A9A6E5BF01F000F400891550FC91C :1072200040089119C7FB3FD895184009935BC7AB3D :107230003FD893184009935CC75B000080016B3C0A :1072400080009200800169A48001693C80016C404B :10725000800091DCEBCD40FC4C151696189476021C :107260006A095909E088001B4BE7C15878BA580AE7 :10727000F9F8000CEFF80A01F9F8100CF5F81A0CFF :10728000201978C8910A8B09F01F00376A0959093B :10729000E08800056E0C580CCEA16C2338086C36C3 :1072A000ECCCFFCCF0041800C260F01F003018973F :1072B000C2F0B8C464080C9A990899A6069B2CCC15 :1072C0008F9CF01F002B3808F0041800C2303818CB :1072D000F0041800C2B04A3B30088FB8761A8FCA43 :1072E0009507EEC9FFD46A0897192FF8301C8B0850 :1072F000E3CD80FC64495809CD90ECC8FFC9E01883 :10730000FFFCF009000CF01F00191897CD31E3CDF8 :1073100080FC318A049BEECCFFF4F01F00156E7ADE :107320008F2A580AC1018F8ACD7BEEC6FFF4318ABD :10733000300B0C9CF01F000F049B0C9C308AF01F3C :10734000000CCCAB6EA82FD8E018FFFC6E9C100C84 :107350008F8C645BF01F0006CBFB0000000077A061 :1073600000000234800091E880009200800091DCEF :10737000800091D0D421207D1297FACEFFD04B29E6 :1073800018947298EDB80001C040300C2F9DD8229F :10739000FCE800003006BB295C7A50265046FAC54E :1073A000FFF8FAC9FFE00A9CF01F00282FED580CE7 :1073B000C2D05807C0B08F368F5640680E9B0C9CC9 :1073C0008F28F01F0023581CC2E11A9CF01F0021D7 :1073D0005BBCC29040076E4C580CC070F01F001E82 :1073E00030088F388F4840075807C0401A9CF01F5C :1073F000001B402C580CC030F01F00175804FBF83D :107400001006E9F81A002F9DDA2A40085808C040F3 :107410001A9CF01F0012402C580CCB80F01F000E5D :107420002F9DD82A40085808C0401A9CF01F000B16 :10743000402C580CC0313FDCCAABF01F00073FDCCA :10744000CA6B0000000087F48001DF7480016C408B :1074500080018E9C800091E88001D3A8EBCD40E0B4 :10746000208D149616951897308A300BF01F001354 :1074700059F6E08800052F8DE3CF80E00A9B0C9A37 :107480001A9CF01F000FFAC9FFE030080C09FACC73 :107490000001F368FFE0F8C6FFFF300B30AA0C9C38 :1074A000F01F000832EB0ECC0C9CF01F0007CF4100 :1074B0002F8DE3CF90E00000800091D0800091DC20 :1074C0008000917080009164D43120AD189E109599 :1074D00014974C781292709CE21C0002C0511896CE :1074E0000C9C2F6DD832169AFAC6FFE41C9B0C9C9C :1074F000F01F00400C9BFAC3FFFCFACAFFDC069C9D :10750000F01F003D1896581CCEC15807C2F10E91CD :107510000E90069CF01F0039401818945808C0407F :10752000069CF01F0037403C580CC030F01F00355F :107530005BB4C4D05807C170E06B0BB8E0CCFFF46B :10754000F01F00315BDCC3A0582CC07060285BF8D2 :10755000C04060188508CC5B029C301B3006F01FD1 :10756000002BCBFB40988B08CBCB3FF8310C8B0822 :10757000F01F002718941890C280F8C8FFF4500834 :10758000109CF01F00248907640930088919089AA3 :1075900031094A1B109CF01F00211891C20040982D :1075A000189B9928300CF01F001E581CCB300C9BE8 :1075B000029C3FD6F01F001BC94B029C301BF01FE2 :1075C000001340988B08C8DB3FD6C8BB5807CFD004 :1075D000029C301B3FD6F01F000DC83B400CF01F33 :1075E0000012089C3FD6F01F0007C7BB000087F4BD :1075F0008001745C80016FB880018E9C8001D3A8EB :10760000800091E88001A22880016B7C80009200BC :107610008001A28C8001702080016AF480016C409E :10762000800169E08001A27CEBCD40E0209D49F81B :1076300018991495709CE21C0002C06118960C9C6D :107640002F7DE3CD80E0169AFAC6FFE8129B0C9CD2 :10765000F01F00170C9B1A97FACAFFE01A9CF01F44 :1076600000151896581CCEC11A9CF01F0013400834 :1076700018965808C0401A9CF01F0010402C580C57 :10768000C030F01F000F5BB6C0313FD6CD9B300C31 :107690008B3C8B5C40880A9B8B28F01F000A581C8F :1076A000CCF03FD6CCDB0000000087F48001745C96 :1076B00080016FB880018E9C8001D3A8800091E882 :1076C00080016C40EBCD40FC1895169414921293F7 :1076D00010974076310CF01F0012C1D099369905F1 :1076E00099149927189A3008310948EB109CF01F1B :1076F000000E1896C100069B049C0C9AF01F000B0C :107700001897581CC0500C9C301BF01F00090E9C91 :10771000E3CD80FC30070E9CE3CD80FC800092001E :1077200080016F6880016AF480017628800169E039 :10773000EBCD406E202D4086129310951491169A31 :10774000189B1A9CF01F0008069B0C99FAE2000097 :107750000A9ABB23029CF01F00052FED2FEDE3CD0D :10776000806E00008001745C80017374EBCD406812 :10777000202D129310961495169A189B1A9CF01FA0 :107780000008FAE800000C9ABB29069B0A9C300905 :10779000F01F00042FED2FEDE3CD80688001745CB5 :1077A00080017374EBCD40401896303CF01F00040C :1077B0007848301C8D08E3CD804000008001EF6CDC :1077C000EBCD406048A618952F060C9CF01F0009D1 :1077D000303CF01F0009310AF8CBFF8C0A9CF01FE7 :1077E00000070C9CF01F0006E3CF9060000087F4B8 :1077F000800145F88001EF6C800091DC800145FA42 :10780000D42149461894ECC5FFF00A9CF01F0012E1 :10781000ECF700F85807C0C06F38707B2F4B322A46 :10782000089CF01F000E0A9CF01F000DDA2A303C65 :10783000F01F000CC060F9380088EE081800C06026 :10784000ECCCFFF0F01F0006D82AF8CBFF78CE8BE7 :10785000000087F4800145F88002E736800145FA90 :107860008001EF6CEBCD40E049061895ECC7FFF0C6 :107870000E9CF01F000F303CF01F000EECF600F8DD :107880005806C0C0ECCBFFE2306A0A9CF01F000A29 :107890000E9CF01F000AE3CF90E00E9CF01F000743 :1078A0000C9CE3CD80E00000000087F4800145F8E7 :1078B0008001EF6C8002E736800145FAEBCD404055 :1078C000209DE04B0020E08B001CBABB580BC1B1DF :1078D0003FF8BAA849162F060C9CF01F0011303C47 :1078E000F01F0010322AFACBFFFEF8CCFF78F01F11 :1078F000000E0C9CF01F000D2F7DE3CF90402F7DDC :10790000E3CFC0403008169ABAA8189BFACCFFFC07 :10791000F01F0007CE0B0000000087F4800145FC3B :107920008001EF6C8002E736800145FE800091DC2B :10793000EBCD40E01895303CF01F000B1897C110BC :1079400048A62F060C9CF01F000A0A9B306AEECC5A :10795000FF56F01F00080C9CF01F0007E3CF90E0DB :10796000E3CD80E08001EF6C000087F4800145FCEE :10797000800091DC800145FED401F01F0002D80296 :1079800080017930EBCD40EC202D18961697586B7E :10799000C0503FFC2FEDE3CD80ECFACCFFF8E06364 :1079A000312EEA13322EE0623100EA12312EB92371 :1079B00016980C99300A308B1A9CF01F0010301C5E :1079C000F01F000F48F81893F0C5FFF00A9CF01F55 :1079D000000E5803C0C00E9A0C9B069CF01F000BB3 :1079E0000A9CF01F000B2FEDE3CF90EC0A9CF01FD8 :1079F0000008069CCD0B00008001776C8001EF6CC5 :107A0000000087F4800145FC800091DC800145FE88 :107A1000EBCD40E01897303CF01F0018EEC8000195 :107A200018955818E0880004E3CF80E058175F09E4 :107A300049366D1858385F0AF5E90009C0E1582742 :107A40005F08F5E80008C030E3CF90E0F01F000DBC :107A5000C0A18B47E3CF90E0F01F000B6D185838A2 :107A60005F0ACEEB303CF01F000578485818CF2055 :107A7000F01F0005CEFB00008001EF6C000087F4D2 :107A800080017BC88001F340EBCD40F81696189337 :107A900076085858E08A002A49A83064F0C5FFF0FB :107AA00097040A9CF01F0018301CF01F001818974C :107AB000C160202D189B089A1A9CF01F0015F01F1A :107AC00000152FED580CC1616C0A0E9B069CF01F2F :107AD00000120A9CF01F0011E3CF90F80A9CF01FDF :107AE000000F0E9CE3CD80F830683FFC9708E3CD93 :107AF00080F80A9CF01F00093FBCE3CD80F800002D :107B0000000087F4800145F88001EF6C8002E736C1 :107B1000800188B0800091DC800145FA0050F200BD :107B2000000FAC003008F9480320F94803245EFC3C :107B3000EBCD40C016971496F8FE0320FCCBFFFF58 :107B4000F60A141FE069851FEA1951EBF60904488B :107B5000A5591419F8FA0324F2091064121B143BF6 :107B6000C0B0F94B0320F80E0927FCC8FF9CF808A9 :107B70000926E3CF90C0E3CF80C0D401189EF8FC63 :107B80000324FCF803201838C1F0F8C8FF9CFC0C53 :107B9000032CFC08032930089709E069851FEA19BE :107BA00051EBFCFB0324FC0B09282FFBF6090448CE :107BB000F60A141FA5591419F2091064F6090109EF :107BC000FD490324D802D80A4838F0F900F85809CA :107BD0005F1C5EFC000087F43018198CF00C180054 :107BE0005F0A3058F00C18005F09124AC0F1306883 :107BF000F00C1800C0B03028F00C1800C080584CB1 :107C0000F9BC0003F9BC01005EFC5EFF302C5EFC99 :107C100048C8F0F800FC5818C0D0C0635828C0D03D :107C20005838C0505EFF580C5F0C5EFC583C5F8CAF :107C30005EFC581C5F8C5EFC582C5F8C5EFC000068 :107C4000000087F4EBCD40C01897169E740A580ABE :107C5000C0D0753A580AC0A0747A580AC0704FF85C :107C6000F0F901045889E0880004E3CF80C04FC8D0 :107C7000F009032F94D8EDB80004CF813008301CF0 :107C80009D08E3CD80C0F53900C83FF8F009180021 :107C9000CED0F51B00D2580BCE90F51C00D030266C :107CA000F4FA00D8F40C002811B9EC091800E080AF :107CB00000BFF8C8FFFF3009F40800280C9CF0CA88 :107CC000FFFDC07815882FCAF8081800E08000B0C2 :107CD0002FF91639CF85CCABF53900C83FF8F0093C :107CE0001800CC40F51B00D2580BCC00F51C00D07E :107CF0003016F4FA00D8F40C002811B9EC09180079 :107D0000E08000A4F8C8FFFF3009F40800280C9CAC :107D1000F0CAFFFDC07815882FCAF8081800E08067 :107D200000952FF91639CF85CA1BF53900A43FF805 :107D3000F0091800C9B0F51B00B2580BC970F51C4A :107D400000B03026F4FA00B8F40C002811B9EC09A0 :107D50001800C660F8C8FFFF3009F40800280C9C22 :107D6000F0CAFFFDC06815882FCAF8081800C58042 :107D70002FF91639CF95C7ABF53900A43FF8F009B4 :107D80001800FE90FF74F51B00B2580BFE90FF6FB9 :107D9000F51C00B03026F4FA00B8F40C002811B934 :107DA000EC091800C3D0F8C8FFFF3009F408002818 :107DB0000C9CF0CAFFFDC06815882FCAF80818008F :107DC000C2F02FF91639CF95C51BF53900A43FF83D :107DD000F0091800FE90FF4BF51B00B2580BFE9007 :107DE000FF46F51C00B03016F4FA00B8F40C002879 :107DF00011B9EC091800C220F8C8FFFF3009F408D7 :107E000000280C9CF0CAFFFDC06815882FCAF8082E :107E10001800C1402FF9123BFE99FFF9C27B3028B0 :107E2000AE8830199D09129CE3CD80C03028AE8801 :107E30003029301C9D09E3CD80C03018AE88301940 :107E40009D09129CE3CD80C03018AE883029301CCB :107E50009D09E3CD80C00000000087F48003B7B027 :107E60003028F00C1800C390E088001B3048F00C5C :107E70001800C3503058F00C1800C21030093028D8 :107E8000F00B1800C160F00B1800E08B001B3018DD :107E9000F00B1800C100300812385F5C5EFC30182F :107EA000F00C1800CEC130193028F00B1800CEC1EC :107EB0003038C02830181039CF045EFE3029CE0B80 :107EC0003048F00B1800C0703058F00B1800CE414D :107ED0003028CF2B3048CF0B3039CD2B3049CD0B4C :107EE000D431307977387075B8891894581AC0D061 :107EF000C043582AC4C0D83A7738707A94D9EDB9BB :107F00000004E0800087DA3AEB3900A43FF8F0097A :107F10001800CF20EB0800B03009F2081900CF405C :107F2000149112923006307B30533060C1A8E007C4 :107F30001800C2B03028F0071800C7A03048EE087B :107F40001800F9BC0003F9BC0100F01F003CE9F780 :107F50001E002FF6EB1800B00C38FE9AFFD6098BE6 :107F6000EAF800B8F006002811B70E9CF01F0034A4 :107F7000FE9AFFF1E20718005F08E60718005F09A4 :107F80001248E4081800CD40301CCE0BEB3900C875 :107F90003FF8F0091800CB00EB0800D03009F208D8 :107FA0001900CB2012913006307B301230533060F4 :107FB000C1A8E0071800C2B03028F0071800C3A01D :107FC0003048EE081800F9BC0003F9BC0100F01FAE :107FD000001BE9F71E002FF6EB1800D00C38FE9AB4 :107FE000FF94098BEAF800D8F006002811B70E9C20 :107FF000F01F0013FE9AFFF1E40718005F08E60780 :1080000018005F091248E2081800CD40301CCE0B62 :10801000307B305CF01F000AFE9AFF77301CF01FA7 :108020000007FE90FF723058301CA888D832302CE0 :10803000C8DB302CCCDB000080017C1080017E602E :108040003008484A48499508951893085EFC000096 :10805000000089EC00008C5CEBCD4080189E198BF1 :10806000580BC130300A3017149CFC0A00092FFA53 :1080700013982018EE080948F9E81008F9D8B0104C :10808000163ACF45E3CD8080169CE3CD80807938C9 :10809000707A3308F53900C8F0091800C0205EFD79 :1080A000F51800D4E218000C5848C0E0E08A000837 :1080B0005888C08058C8CF41310C5EFC5808CF01A9 :1080C0005EFF304C5EFC302C5EFCD703EBCD40E015 :1080D00030081896109A169C8D084927760E301590 :1080E000109BC0A8F80A00082FFA11C9EE0B070868 :1080F000A7D91039C0A01C3ACF652FFB58DBE08B05 :10810000000E300A780ECF8B6C08EA0B0949124832 :108110008D082FFB58DBFE98FFF6E3CF90E00000C0 :108120008003B7F4EBCD40C030069906149EF8C723 :10813000FFFC1799EC091800C0E00C9AF60A000839 :1081400011A90EC978082FF899082FFA1798143832 :10815000FE99FFF61D993008F0091800C0F0300BA9 :10816000FC0B000811A9EE0B0B0978082FF89908F1 :108170002FFB1D981638FE99FFF5E3CF90C0EBCD8D :1081800040F816941897780B68065806E08A002C79 :10819000F6C8FFFCE8C5FFFCF8080003300E2FCC42 :1081A000EA0E070A580BE08A00130FC81458F1D8DA :1081B000C007C1503009C078F80907081458F1D831 :1081C000C007C0D02FF9123BFE99FFF8597BE08B16 :1081D000000706CA6E0B2FFB8F0B68062FFE1C369E :1081E000FE99FFE0E3CF90F8EBCD40FE1894169295 :1081F0001497780676055805E08A0025ECC8FFFC40 :10820000F6C3FFFCF8080001300EF4CCFFFCE60ECC :10821000070A6E0B580BE08A00120FC81458F1D8E9 :10822000C007C1203009C078F80907081458F1D8F0 :10823000C007C0A02FF91639CF852FFE1C35FE9937 :10824000FFE8E3CF90FE5976FE9BFFF902CA68066D :108250002FF689062FFE64051C35FE99FFDACF2B19 :10826000D42178045804E08A0027F8C7FFFC493875 :108270000F8B700C11C6580CE08A0017F0C5FFFC7C :10828000300EEDEB2008F1D8C007C0F00A9A300993 :10829000C0782FFA15881658F1D8C007C0602FF99A :1082A000123CFE99FFF8D82A2FFE2FF7083EC03463 :1082B0000F8BCE8BDA2A00000000023CD4211897E5 :1082C00076055805E08A0026F6C6FFFCF8CEFFFCCE :1082D000300B1694C0482FFB0A3BC1B4EC0B070AC5 :1082E000E80A1800CF946E0C580CE08A00120FC8F0 :1082F0001458F1D8C007CF003009C078FC0907082E :108300001458F1D8C007CE802FF91839CF85D82A54 :10831000DA2A3248F00C1800C110E08800113488C5 :10832000F00C1800C0B0E08800183608F00C1800F7 :10833000C05036C8F00C1800C0E15EFF3128F00CC8 :108340001800CFC03188F00C1800CF8030C8F00C76 :108350001800CF405EFD3308F00C1800CFC1CEEB03 :10836000EBCD40E078055805E08A0010F8C6FFFC28 :108370003007C0380A37C0940D8C2FF72FF6F01F46 :108380000004CF90E3CF90E0E3CF80E08001831240 :108390004838F14B01DCF14C01D85EFC000087F459 :1083A0004838F14B01ECF14C01E85EFC000087F429 :1083B000EBCD40801697581BC050582BC080E3CFA0 :1083C0008080F01F00050E9CE3CD8080F01F00022E :1083D000E3CF9080800091E8D401580CC070486BC6 :1083E000760AE04A0168E0880003D80AF01F00031B :1083F000DA0A0000000089EC800091DCD401580CFE :10840000C0A078185908E08B0007780AE04A016894 :10841000E0880003D80A189B482CF01F0003DA0AF2 :10842000000089EC800091DCEBCD4040350A1896C5 :10843000F01F000330088D48E3CD8040800091DCC0 :10844000D401306AF01F0002D8020000800091DCE5 :10845000D401300CF01F0002DA0A000080016C7CAD :10846000D421201D189414971296169A1095189BD3 :108470001A9CF01F001CE08A0032585CC27058063B :108480005F1858075F191268C241300840099338D5 :10849000400A95584008301B9115400CF01F0012FF :1084A000581CC100400C78785808C090189B089C54 :1084B000F01F000E581CC0A03FDCC098301BF01FFE :1084C000000C400C78785808CF21301C2FFDD822A2 :1084D0004008913740099356CDEB3FEC2FFDD82251 :1084E00080016B3C800169A480016C40800169E0DF :1084F000EBCD40C018971696303CF01F00283DD8B1 :108500003079AE88AE9935083F29300BAEB8AEC988 :1085100030283019AED8EF6B0008AEABAEEBAEF939 :1085200058065F1AF8F900BC58095F181468F60875 :108530001800C310F8F800D05818F9B80008EFF880 :108540000E08F8F800CC5818EFF80808F9B900043C :10855000F1D9E038EFF80E08F8F800C85818EFF82D :108560000808F9B90002F1D9E038EFF80E08F8F878 :1085700000C45818EFF80808F9B90001F1D9E0383B :10858000EFF80E08F8F900D4EF380008F1E91048C8 :10859000EF680008E3CD80C08001EF6CEBCD404078 :1085A0001896303C5C76F01F000E5876E088000488 :1085B000E3CF804048B8F006032FF90C00C6E3CDA6 :1085C0008040F90C00CAE3CD8040F90C00CEE3CD29 :1085D0008040F90C00D2E3CD804000008001EF6CB8 :1085E0008003B7D4D40130DCF01F0002784CD802ED :1085F0008001EF6CEBCD40FC207D31CA1893300B2D :108600001A9C1A92F01F001266045804E08A00189F :10861000E6C6FFFC30070D852FF72FF60A9CF01FEA :10862000000DC0A14008FACAFFE4F0C9FFFF100A1C :108630005009F565FFE80E34FE99FFEF1A9B069C82 :1086400031CAF01F00052F9DE3CD80FC800091D042 :1086500080018312800091DCEBCD40E0207D300B67 :10866000189731CA1A9CF01F00171A956E0B580BF9 :10867000E08A0024300AFAC6FFFCEEC9FFFC0C9C1D :10868000149EC0582FF9143BE08A000D2FFA13886E :10869000FC081800CF8418C82FF96E0B143BFE9904 :1086A000FFF7F80601061A9B50060E9C31CAF01F10 :1086B00000062F9DE3CD80E0FAC6FFFC0C9CCF2B7B :1086C000800091D0800091DCD421129618971695E5 :1086D0001494580CC1205809C111314CF01F0009E5 :1086E000C0C09907B8C599249936487A7419994930 :1086F000930CF8C8FFF49518D822F01F0004D82274 :1087000080009200000077A4800147E0EBCD40C0DC :108710001896580CC110308CF01F000C1897C090A0 :108720000C9CF01F000B8F1C1898C0A030188F08ED :108730000E9CE3CD80C018970E9CE3CD80C00E9CAC :108740001097F01F0004CF5B800092008001D920B9 :10875000800091E8EBCD40C049566C075807C180B6 :108760006E395809EFF80004EDF80A01EFF810042B :10877000F3F81A046E4891096E2A0FCB6E0CF01FA5 :10878000000D0E9CF01F000C6C075807CEA148B8D6 :10879000F0C7FFEC0E9CF01F000AC071302CF01FD8 :1087A00000090E9CF01F0008E3CD80C0000077A4F4 :1087B000800147E0800091E8000087F4800145DCFB :1087C0008001478C800145ECD4014848300991185C :1087D0009109F01F0003D802000077A4800187549C :1087E000EBCD40FE4A0618976C0816951494201895 :1087F000E0480167E0880004E3CFC0FE580A5F1933 :108800006C1A300B580A5F181268F6081800CF501F :10881000183A5FB858FC5F891268F6081800CED085 :1088200016910C92C0B82FF7641958F75F8A0E3969 :108830005FB81468E2081800CE00EE031016306A24 :10884000E6CCFFF80A9BEC0C000CF01F0008CEC130 :10885000485B089C060B310A2F2BF01F00050E9C6D :10886000E3CD80FE000089EC8000917C800091DCEB :10887000EBCD40E018951697300C18960E9A0A9B8F :108880002F07F01F0005C0452FF62FFCCF8B0C9C47 :10889000E3CD80E0800187E0D401306AFACCFFFCB0 :1088A000FACBFFF4F01F00025F0CD8028000917C2D :1088B000EBCD4068205D3FF8FACAFFDC15D9FB68B4 :1088C0000013FB68000EFB68000FFB680010FB68DC :1088D0000011FB680012FAC6FFF8ACD974088D08C5 :1088E00015C9FAC3FFFEACC93065FACBFFF20A9A8C :1088F000069CF01F00060A9A069B0C9CF01F0004C1 :108900005F0C2FBDE3CD80688002E7368000917C4C :10891000D401FACBFFFCF73900241788F0091800BE :10892000C020D80AF73A00251798F4081800CFA1FC :10893000F6CCFFFE2DABF01F00035F0CD802000049 :108940008000917CEBCD4040211D303CF01F001E8B :10895000322A1896FACBFFB4FA0A000CF01F001B5B :10896000ECC6FF78ECE80000FAE90000ECEA000849 :10897000FAEB0008ECE80010FAE90010ECEA001845 :10898000FAEB0018ED380020FB680020ED390021DB :10899000FB690021FB3A00221B88F4081800C05034 :1089A000300C2EFDE3CD80401B9AFB380023F408E9 :1089B0001800CF71FACBFFFEFACCFFDCF01F0004E9 :1089C0005F0CCF0B8001EF6C8002E7368000917C5A :1089D000EBCD40E0203D4B571896EF3900943FF81F :1089E000F0091800C3507938707C2F4CF8E800006B :1089F000209DFAE90000F8EA0008FAEB0008F8E820 :108A00000010FAE90010F8EA0018FAEB0018F9383B :108A10000020FB680020F9390021FB690021F01FCC :108A200000242F7D580CC0412FDDE3CD80E0202DA8 :108A3000EEC7FF4A306A0E9B1A9CF01F001EF01F03 :108A4000001E2FED580CC1C02FDDE3CF90E0F8CB16 :108A5000FFE2306A1A9CF01F0017EECBFF4AFAC6FD :108A6000FFFA306A0C9CF01F00130C9B1A9C306AB2 :108A70001A95F01F00125F0C2FDDE3CD80E0ECCBE8 :108A8000FFE2FAC5FFFA306A0A9CF01F000A0E9B4B :108A9000306A1A9CF01F00071A9B0A9C306A1A96CB :108AA000F01F00065F0CCC1B0000026080018944AF :108AB0008002E736800188B08000917CD401201DBF :108AC000500C580CC0401A9CF01F00022FFDD80219 :108AD0008001D3A8D401201D500C580CC0401A9C12 :108AE000F01F00022FFDD8028001D3A8EBCD40C0BB :108AF000E06B00E41896300CF01F000A1897C0E0F5 :108B0000E06A00E40C9BF01F0008ECC9FFF8EECA15 :108B1000FFF8486B0E9CF01F00060E9CE3CD80C052 :108B20008001D8DC800091DC8001D3EC8001ACA80E :108B3000EBCD40C0E06B00EC1896300CF01F000A43 :108B40001897C0E0E06A00EC0C9BF01F0008ECC92D :108B5000FFF0EECAFFF0486B0E9CF01F00060E9C63 :108B6000E3CD80C08001D8DC800091DC8001D3ECB3 :108B70008001ACA8EBCD40FE129210914A88F0F92A :108B800000F818933DD8733C316916977874AE8815 :108B9000AE9930083509AEA8AEB93F283019301665 :108BA00014954A0B303AAEC8AED9AE36EECCFFF8CB :108BB000F01F001D069CEF65000BAE76AE66308B95 :108BC000F01F001A8F5CC290303A496BF01F0016FC :108BD0006E58B0B28EE86E5C303AF808002C491B33 :108BE000F01F00116E598EE8F2080028B0B1E919A3 :108BF00000B0E91800B21208E93900A5A3682F08EF :108C00001039C030E3CF90FE0F9830092FE8EF59AC :108C10000010AE98E3CF90FEE3CD80FE000087F415 :108C200080017B1C800091DC8001D3ECD431201DBD :108C3000314E1697330BAE9EAE8B1090FACBFFD809 :108C40007618500818921493129176055805E08A08 :108C50000006EA0815042EA8AE983016303AAE1673 :108C600049E4EECCFFFCE8CBFFFCF01F001D049CA8 :108C7000AEF3AE56AE46AE75EA0B15042F8BF01F61 :108C800000198F4CC280303AE8CBFFFCF01F001473 :108C90006E48B0B18EC86E4CE8CBFFFCF808002CD3 :108CA000303AF01F000F6E498EC8F2080028B0B0AD :108CB0003289AE695805E08A000D6E488EC98EDC97 :108CC000EA0A1504120C400BF00C002CF01F0004F3 :108CD0002FFDDA3A2FFDD83280017B1C800091DC19 :108CE0008001D3ECEBCD40E0201D500B1897580CC1 :108CF000C070169A4C4C0E9BF01F0044C6404C4668 :108D000030080DA9F0091800C050301C2FFDE3CD2C :108D100080E0ECCCFFE4F01F003FCF815807C2F0A9 :108D2000301CF01F003DC3304B751A9B4B6CF01F7D :108D3000003B1897C320F01F003A3018ED4C00CCD0 :108D4000ACA80E9C3005400BED5500D04B07F01F32 :108D500000351896581CC3F1EECCFFE4F01F00322A :108D60004B28F1090142EA091900CD006E98EDB8CF :108D7000000ECCC0F01F002E0C9CCC9B4A25EAF9BB :108D80000320EAF803241039CCC1CD0BECCCFFE46E :108D9000F01F0025301CCBBBECF801245818C04054 :108DA000301CF01F0024ECCCFFE4F01F001FEAF998 :108DB0000324EAF803201238CA90301CF01F001672 :108DC000301CCA5B492AF50B00D2F80B1900C0A071 :108DD0003FBCC9DBEECCFFE4AEA5F01F00133FBCE7 :108DE000C96B3018F55800D24909F3080142F6085A :108DF0001900CEF07498EDB8000ECEB0F01F000C44 :108E00003FBCC85B000084CC80017B30000087F44D :108E1000800145DC80019F3080017B7A800145C460 :108E200080014664800145EC000002608001FBFC8B :108E30008001A128EBCD40C01897F01F0015C1B0EC :108E40006E4849468D186E598D2930096E2C8F2930 :108E50006E486E3BE2180080F9B80001EDF80E0292 :108E6000F01F000D1897581CC0803008300CACA8BB :108E7000E3CD80C0E3CF90C0F01F00083008ED4C78 :108E800000CCED5800D00E9CE3CD80C08001C6A080 :108E9000000087F480014664800145C4EBCD40802A :108EA000491A18977498EDB80001C111F4F801241B :108EB0005818C0A07848951878599529F01F000BCC :108EC000C091E3CD8080109CE3CD80803FBCE3CD9A :108ED000808030086E2C6E3B8F28F01F0005E3CD9C :108EE00080800000000087F48001C6A080018CE42F :108EF000106104000000000040200700FFFFFFFF9A :108F0000000000004869F2F802045828C0205EFE04 :108F1000580CCFE0F2C8FFF099085EFF000077AC74 :108F20005EFDD7034828912C913B5EFF000077AC93 :108F300048384849910C930B5EFC000000007540D6 :108F4000000074B45EFCD703D431202D500C3008DF :108F5000FAC1FFF81690109402D84A424A43E269D7 :108F60005A4C089A0819029B009C40085D181895F5 :108F70005804C0B1584CF80A1780F9BA0B0449DB01 :108F8000401CF01F001DC2E140165805C1000A97A1 :108F90005907EE0A1780F9BA0B100C9B1417140628 :108FA00064085C7A660C5D185807CF310A04E24405 :108FB0005A4BFE98FFD65875E088000D4018EACC51 :108FC000000848CBF00C000C2F8B308AF01F000AF1 :108FD000C0913009009C129A129B40085D182FED39 :108FE000DA3A30DC2FEDD83200007540000074B45E :108FF00080018EF08000917CEBCD40FC49F8189404 :10900000F0C3FDDCF0C7FFBC3072C0B8321A089B59 :109010000A9CF01F001B1896C1D02C470637C16070 :10902000EEC5002C5804CF316E08109C5808CF6054 :10903000F01F00148F04EF44FFF86E185808CEE1BB :109040008F248F322C470637CEC15804C0D0E3CFCF :10905000C0FC6ABC580CC080F01F000A8B968BB60F :109060006AC85808C030E3CF90FC8BD8301C3078E9 :109070008BE8E3CD80FC0000000077AC8000917CA1 :10908000800091E8EBCD40FE109114961895169251 :109090001293F4C80008E0480037E08B00185859D4 :1090A000C18049D8F0C4FE08F0C7FFE86EB8580880 :1090B000C1300E9C321A0A9BF01F0018C1D02C47F9 :1090C0000837CF51307CE3CD80FE30ACE3CD80FE5D :1090D000129CE3CD80FEECCBFFFF049CF01F001040 :1090E0000A9B8FBC8F968FD18FE30E9C321AF01F94 :1090F000000DE3CF90FE6EBCF01F000B049CECCB88 :10910000FFFFF01F00078FE38FBC8F968FD1E3CF57 :1091100090FE0000000077AC8000917C8000918878 :10912000800091DC800091E8D401487BF6F80204CD :109130005828C020DC0AF6CBFE04306AF01F00037A :10914000DA0A0000000077AC800091DCEBCD40FE35 :10915000209D580B5F09580A5F08169314941069F4 :10916000C341580BC4514A9264585808C2E03005B4 :10917000FAC1FFFD0A970A9CC0D8ED3A0020FB38DF :109180000023F4081800C2E00E9C64580E38E088F2 :10919000001E64482FF7F00C03265803CEF1306A06 :1091A000089B5804C0A0202D1A9CF01F0019F01F26 :1091B00000192FED580CC0E05805C0506AC96CC8A2 :1091C0001238CE350C95CE1B30050A9C2F7DE3CD91 :1091D00080FE306A089BECCCFFDFF01F000FCD5102 :1091E000CECB029B0C9CF01F000CCCF1CD9B189BAE :1091F000069AFACCFFFDF01F0009FB6300234832FA :1092000064585808CB51CE1B000077AC8002E7367B :10921000800188B08000917C800091DCEBCD4060C3 :10922000306A202D169618951A9CF01F0009F01F21 :1092300000090C9A5F0B0A9CF01F00072FED581CC9 :10924000F9BC0001F9BC01FFE3CD80608002E73684 :10925000800188B080016480D4015C6CF01F000440 :10926000581CF9BC0001F9BC01FFD8028001641C44 :10927000EBCD406E202D1293189116921495300B61 :10928000308A1A9CF01F0012306A069B1A96202D15 :109290001A9CF01F0010F01F001030085F091AD848 :1092A0000A9A1AD6049B1AD3029C1AD83038F01F97 :1092B000000B2FAD5BFCC070581CF9BC01FF2FEDFB :1092C000E3CD806E304C2FEDE3CD806E800091D0E9 :1092D0008002E736800188B08001661CEBCD406ECD :1092E00010911892169314951296F01F00113008E1 :1092F0000C991AD80A9A1AD1069B049CF01F000DEB :109300002FED583CE0890007582CC085306CE3CD28 :10931000806E584CC070E3CFC06E5BECC050581CE0 :10932000CFB1E3CF906E30BCE3CD806E8001A1DC85 :109330008001F7D8EBCD4040201D10964978F0FE13 :109340000204582EC0503FFC2FFDE3CD804030EE8C :10935000FAC8FFFC10DE300E1A985C761ADE1AD6B8 :10936000F01F000F2FEDFE5CFC17E0890010FE5C83 :10937000FC16C114FE5CFB4FC070FE5CFBB4C0B0B9 :10938000FE5CFAECCE11307CCE0B5BECC040581C7E :10939000CDB1CDBB30BCCD9B000077AC8001F54496 :1093A000D4014858F0F902045809C030F01F0003F6 :1093B000D8020000000077AC80014480EBCD40E88B :1093C0004D56189514971693E06A0218300B0C9CB2 :1093D000F01F00524D288D05700C8D133005A36CC5 :1093E000ED450204F01F004F8D4CC031E3CFC0E8C3 :1093F0000A9CF01F004D581CCFA11AD5F1D7C00808 :109400000A990A9A310B320CF01F00482FFD581CA4 :10941000CEE1F01F0047581CCEA11AD50A980A9930 :109420004C4A0A9B302CF01F00442FFD580CCDF005 :1094300030670A981AD70A994BEA0A9B322CF01F18 :10944000003E2FFD580CCD3030780A991AD84B9A2F :109450000A980A9B323CF01F00382FFD580CCC7044 :109460001AD50E9C0A980A994B2A0A9BF01F0032C3 :109470002FFD580CCBC030270A981AD70A994ADA20 :109480000A9B304CF01F002C2FFD580CCB001AD734 :109490000A984A8A0A990A9B305CF01F00272FFD20 :1094A000580CCA50301C0A981ADC0A994A1A0A9BAE :1094B000F01F00212FFD580CC9A030390A981AD985 :1094C00049CA0A990A9B31CCF01F001B2FFD580C8A :1094D000C8E0F01F001A581CC8A1F01F0019581C42 :1094E000FE91FF860A980C9730490C9A495B0A9CBA :1094F000F01F0015FE90FF7C189A308B493CF01F3E :109500000014581CFE91FF74ED4C0204EF45020C50 :10951000E3CD80E8000077AC800091D000000258D5 :1095200080009200800200AC8002067C8001FFB4C3 :109530008001984C80016E788001FD8C8001A00034 :109540008001955080016AF48003B8048001762878 :10955000EBCD40E078185B98C031E3CFC0E078569F :109560005866CFC1783B0C9A4985EAC7FE040E9C29 :10957000F01F0017303A497B0E9CF01F0017C131D5 :10958000F01F00163026EB460204F01F00150C9C5D :10959000F01F00146A195809C14048C8700C5D19C1 :1095A000E3CF80E037A83C49EB6801FC30E80C9B36 :1095B0000E9CEB6901FDEB6801FEF01F000BCE1B5A :1095C000129CE3CD80E00000000077AC800091DCCD :1095D0008003B80C8000917C8001FD8080020290A5 :1095E0008002023480017984EBCD40FC7875580B01 :1095F000F9B80100F7F81A001693EB3900C83FF8E4 :10960000F0091800C250EB0900D03008F009190029 :10961000C4D0307430073022EE061502EAF800D8C4 :109620000C082FF711BC089BF01F0027E08A0009E7 :10963000EAF800D80C0811B45803E7F21A00EB1846 :1096400000D00E38FE99FFEA089CE3CD80FCEB3891 :1096500000A4F2081800C250EB0900B03008F0096D :109660001900C240307430073012EE061502EAF8D5 :1096700000B80C082FF711BC089BF01F0013E08AFC :109680000009EAF800B80C0811B45803E7F21A0010 :10969000EB1800B00E38FE99FFEA089CE3CD80FC81 :1096A000787992D8EDB80004C040307CE3CD80FCDE :1096B000307B305CF01F0004FE9AFFF9305CE3CD94 :1096C00080FC000080017E60D431201D4D876E58E3 :1096D0005808C0E030060C996E48F009032CF01FC2 :1096E00000552FF66E580C990C38FE9BFFF730068C :1096F0001A9B8F560C9CF01F00501A94400C580C6B :10970000C0312FFDD832A36CF01F004C1890CFA0B1 :10971000400A0C9BA36AF01F004A40085808E08AE0 :1097200000260C950096C0782FF52FC640080A3801 :10973000E08A001D350CF01F00418D0CCF614009FF :109740005809E08A000F009530062FF66A0C580C75 :10975000C040F01F003840092FC50C39FE99FFF7B3 :10976000009CF01F00342FFDD8321A9B009CF01F84 :1097700000324B4972084009F0090D488F585808CB :10978000CE00300408930891A363E003000264084C :109790006E467135344CF01F0029F9410040060631 :1097A0008D0C6A796E48F2CBFFF2F0030306F33AB0 :1097B000000D0C9CF01F00246A78F139000D306A0E :1097C000ED690020ECCCFFDF640B2E2BF01F001E98 :1097D000029B0A9CF01F001DED6C00386A498DC980 :1097E0006A585808F9B805008DD86A79F338005ED0 :1097F000ED6800276A7992C88DA80BF9ED59002C05 :1098000030290BEAF20A1800E2081710F9B8000133 :109810008DF830286E49F20309062FF4F00A18007B :1098200008936E580838FE9BFFB1C8AB000077ACB8 :10983000800091E88002105880009200800091D052 :1098400000000258800091DC800195E8EBCD40C01B :10985000201D1696582BC680E0880013586BC590C3 :10986000587BC2D0583BC4804C076E295809C05061 :109870004BE80C9C703B5D192FFDE3CD80C0580B6D :10988000C0F14BA7EEF902085819C6C0EEF8020C59 :109890003019A1D8EF690210EF48020CCE7B581B9B :1098A000CE414B273008EEF9020C4B1AA3A9EF6802 :1098B0000210A1D9B488EF49020CCD8B4ACA3008F6 :1098C0001589F0091800C4C14A87EEF8020CEDB8FA :1098D0000001CD31EF380210F2081800CCE1F01F82 :1098E0000025F01F0025EEF8020C3016E018FFF9F5 :1098F000EF48020CCBBBF01F002049C7EEF9020C69 :10990000EDB90004CBA11298A5C8EF48020CCAEB30 :1099100049673019EEF8020CEF690210A1D8300641 :10992000EF48020CCA3B4917EEF8020CA3C81A9C78 :10993000EF48020CF01F001140085828C050F01FDB :10994000000DF01F000D300A4898B08AEF39021060 :10995000F4091800C9204858F16A0210C87BB4887D :10996000C8CB4838B089C89B000077AC000079C4E8 :1099700080021298800196C8800177A4D401201D2E :1099800048F9F2F802045828C0302FFDD80AF339FC :1099900002103008F0091800C0711A9CF01F00096D :1099A00040085828CF31F01F0008CF00F8CAFFE266 :1099B000300B169CF01F00052FFDD802000077AC7D :1099C000800177A4800210FC8001914CEBCD408097 :1099D000201D4967EEF802045828C0503FFC2FFDB7 :1099E000E3CD8080F01F0012C051302C2FFDE3CD5D :1099F0008080EEF9020CEDB90002CF10EDB9000144 :109A0000C031309CCEDB1A9CF01F000A4008580879 :109A1000CED0F01F0009581CCE21EEF8020CA3A8EE :109A2000EF48020CCDDB0000000077AC800210FC98 :109A3000800211088001F370EBCD40C020AD189872 :109A40001697580BC07076DC581CC0402F6DE3CDC4 :109A500080C0109BF13A0020FAC6FFFE0C9CF01F5C :109A6000001B0C9B209D322A1A9CF01F0019F01F2E :109A700000192F7D580CCEB0793CFACBFFDCF01FDB :109A8000001640985818C150C0923058F808180075 :109A9000F9BC0003F9BC0102CDAB5828C030301C22 :109AA000CD6B5807C0D06EC85808C0A0305CCCFB46 :109AB0005807C0806EC85808C050304CCC8B307CE2 :109AC000CC6B306CCC4B00008002113C8002E7363E :109AD0008001F2BC800195E8D43120EDFEF3029CB8 :109AE000FAC1FFA4E6F8020C18971694E2180006D3 :109AF000C040309C2F2DD832F01F00A1C040308CC8 :109B00002F2DD832E74C02085807C130BA8CF5D453 :109B1000C008FAC6FFFEBA9A0E9B0C9CF01F009973 :109B20000C9C1B9BF01F0098581CC0802F2DDC3A0A :109B3000BA97BA87FAC6FFFECF4B029CF01F00937C :109B40001892581CCF41029A089B0E9CF01F00905F :109B50001890C580E6C7FFE8E6C6FE08EF3A002089 :109B6000E1380020F4081800E08000A02C470C37F2 :109B7000CF6130070E950E9B009CF01F0086E136EA :109B800000381897CD40585CE08000C2E08B00B9E7 :109B9000583CE08000B4584CC020300CF01F007ED0 :109BA0003048F0061800E08000A83054E80618009D :109BB000E08000983028F0061800E080009A300C11 :109BC000F01F0076E8061800E080008F300CF01FD0 :109BD00000745837E08B007960F85818C710301CB3 :109BE000F01F0070300B4F0CF01F0070CA00F01F08 :109BF0000070581CC9C1E6F8020CA1B8E748020C75 :109C0000C7ABFAC5FFCE306A029B0A9CF01F005D0D :109C1000FAC6FFDE0C9CF01F00673FF81AD00C9BC1 :109C20001AD2310A1AD8204D1A9CF01F00630A9BE1 :109C3000202D306A1A9CF01F00600499209DE6CC0C :109C4000FDECFB380069FAEA0048FAE20050FB68D4 :109C50000021FAEB0000FB380068FAEA0058FAE34A :109C60000008FAE20060FAEB0010FAE30018FB6863 :109C70000020303A0098129B4C03F01F00502EED4C :109C80001895581CFE91FF54009BE6FC0214F01F2F :109C9000004C5BBCC620580CC3E1189BE6FC0214C8 :109CA000F01F00483FFCC27B0E9C009BF01F00464B :109CB000FE91FF5E6EB55805EA071700C5DB302C34 :109CC000F01F0038C90B5805FE90FF320A9AE13B9D :109CD0000020009CF01F003D3018E7480208C7DB59 :109CE000301CF01F002E301CF01F002DC73B302C05 :109CF000F01F002AC6CB303CCFCB301CC50B586CB4 :109D0000C080587CFE91FF4B308CC49B307CC47B60 :109D1000305CC45B344CF01F002E089A18960E9BE2 :109D2000F01F0018029B306AED640020ECCCFFDFCE :109D3000F01F001400991AD60A984A6A009B31CC89 :109D4000F01F00252FFD580CC0E0E6F8020C0A9C1D :109D5000A1B8E748020CCCFA009BE6FC0214F01F05 :109D60000019CC8A189BE6FC0214F01F00160C9C0C :109D7000F01F001A3FFCCBFA000077AC800210FC09 :109D8000800091DC800178BC800179788001914C61 :109D900080019A3880015F60800163488001639C84 :109DA00080017A1080018F208001FD408001F3A0A6 :109DB000800177C08002E73680020BFC80020A70C7 :109DC00080020B408000917C800214708000920021 :109DD00080019E0080016E78800091E8D401202DE2 :109DE000FACAFFF415D8BAD87409500915C8300B4F :109DF000BAC8169CF01F00022FEDD80280019AD835 :109E0000EBCD40E049F51697EAFC0214300BF01F49 :109E1000001EF01F001EEEC6FFDFEF3B00200C9A75 :109E20000E9CF01F001BC150EAF8020CA1D8202D97 :109E30000C9BEB48020C306A1A9CEF360020F01F96 :109E400000150C9B0E9CF01F00142FED581CC060D9 :109E5000EAF8020CEDB80001C0600E9CF01F000F84 :109E6000E3CD80E0301B300CF01F000D302B300CA8 :109E7000F01F000B0E9CF01F0009E3CD80E00000F6 :109E8000000077AC80020B40800196C88001914CA5 :109E90008002E73680019AD8800091E88001984CD2 :109EA000EBCD40E0202D18951697580CC0513FFC83 :109EB0002FEDE3CD80E0580BCFB0E04B0020FE9BB0 :109EC000FFF8FAC6FFFE306AE06B00FF0C9CF01F43 :109ED0000008306A202D0C9B1A9CF01F00060E9B78 :109EE0000A9CF01F00052FEDCE4B0000800091D0A2 :109EF0008002E73680019AD8EBCD408048B7EEF873 :109F000002045828C030E3CFC080F01F0009581C5D :109F1000F9BC0109EFF80083F9B90010F1D9E03874 :109F2000EFF80A83E3CD8080000077AC80020A84DA :109F3000D40148B9F338000A104CF36C000A7218C7 :109F40005808C0B05828C0803028726C9318301B55 :109F500072595D19D80AD80ADA0A0000000079C8D7 :109F60004828916B915C5EFC000079C8EBCD40C045 :109F7000203D5CBBBA89502B109714965CC85C8856 :109F80005807C0513FFC2FDDE3CD80C05C784959B4 :109F90005018B28C3048FAC9FFF8300A306B492C9F :109FA000F01F0012581CCEF11B89491A1898B48969 :109FB000306B1A99300A48FCF01F000C581CCE3147 :109FC00048D8300AB007306B304848CCFA0800094E :109FD000F01F0006581CCD7148989146CD5B0000DB :109FE00000007A288003B8108001776C0000025CC2 :109FF0008003B8180000025E8003B820000079C812 :10A00000EBCD40C030074A161AD78D078D17ED6784 :10A010000008ED670009ED67000A8D378D470E983F :10A020000E9949BA0E9B302CF01F001A2FFD580CC8 :10A03000C0413FFCE3CD80C01AD70E980E99496A03 :10A040000E9B304CF01F00132FFD580CCF301AD749 :10A050000E980E99491A0E9B32ECF01F000E2FFD40 :10A06000580CCE8031483019E06A138830AB0E9C12 :10A07000F01F000B581CCDE10E9BECCCFFF4F01F41 :10A080000009581CCD71CD7B000079C88001A0F07B :10A0900080016E788001A1A08001A0A480019F6C46 :10A0A000800144F8D401F01F000E48EA74085838C3 :10A0B000C12030289508F539000A3008F009180049 :10A0C000C020D8023018300B9518487C487AF01F11 :10A0D0000008D80230089508D80200008001DA365E :10A0E000000079C88001DA5880018E348001EF20A9 :10A0F000EBCD408048973018EF6800086E4958094A :10A10000C0A0308CF01F00066E4C3009485A6E3BE0 :10A11000F01F0005E3CD8080000079C880019F30EA :10A120008001A1CC80014558D4014989F80C11FF68 :10A13000F338000A106CF36C000AC1E1F33800092F :10A14000F8081800C19072185808C161F338000867 :10A15000F8081800C06072085808C0F05818C0C04D :10A160003018300B931848AA48ACF01F000B300B86 :10A17000331CF01F000AD802301B485A930B488C3E :10A18000F01F0005D8020000000079C880018E345D :10A190008001DA588001EF2080016D6C8001DA8443 :10A1A000EBCD404048766C3CF01F0007308CF01F30 :10A1B000000730083009ED6800088D09E3CD8040C4 :10A1C000000079C8800145308001A128D401308C7D :10A1D000F01F0002D80A00008001A128EBCD4080CA :10A1E00048E76E185828C030E3CD80806E58300B99 :10A1F0006E6C5D18300B8F1B4899F2FA0324F2F84D :10A2000003201438C040169CF01F0006300B332C7E :10A21000F01F0005E3CD8080000079C8000084CCE9 :10A2200080018CE480016D6CEBCD40C018971696D0 :10A23000F01F0009C0C06E0C581CC0700C9B0E9C17 :10A24000F01F0006CF91302CE3CD80C03FDCE3CD82 :10A2500080C000008001462C80014636EBCD404096 :10A26000301818969908F01F00040C9CF01F00038A :10A27000E3CD80408001463280014634D401580C41 :10A28000C030F01F0002D80280014630D4013008EF :10A290009908F01F0002D8028001462ED401189EB2 :10A2A000580AC0C196199688F9D9C010103CC165EA :10A2B000F2C8FFFF973AB618D802581AC06096192C :10A2C000F2C8FFFFB618D802969996881039C0F4E4 :10A2D0007648F0090709B889CF3B1D897648F00C0C :10A2E0000B099619F2C8FFFFB618D8023008973844 :10A2F000B8889619F2C8FFFFB618D802EBCD408097 :10A300001897580AC1D1961C9689FDDCC010FCC86C :10A31000FFFF1238F7FA4A03F7F85004F1DEE508B8 :10A32000EFF95801F1F95E00EFFA5800F1FA5E0119 :10A33000F7FC5201F8C8FFFEB618E3CD8080581A2A :10A34000C070961CF8C8FFFEB618E3CD8080969AC0 :10A350009689F4C8FFFF1238C09476481408119902 :10A36000B889118AB89A961CCEEB30089738B8088D :10A37000961CF8C8FFFEB618E3CD8080EBCD408078 :10A38000189E169C580AC0F1961B9889EFDBC010E6 :10A39000EEC8FFFD1238C205F6C8FFFC993AB8189E :10A3A000E3CD8080581AC070981BF6C8FFFCB8181F :10A3B000E3CD8080969B9889F6C8FFFD1238C1C412 :10A3C000784A160A15B8BC8815A9BC991598BCA876 :10A3D0001589BCB9CEAB1DB8784A0E0AB4881DA940 :10A3E000B4991D98B4A81D89B4B9981BF6C8FFFC90 :10A3F000B818E3CD8080300899389D08981BF6C8BE :10A40000FFFCB818E3CD8080EBCD4068189316951B :10A410001496F01F000C0C9A0A9BE6CCFFFFF01F6D :10A4200000090C9A0A9BE6CCFFFEF01F00060C9A6E :10A430000A9BE6CCFFFDF01F0003E3CD806800001F :10A440008001A29CD4211697189596141496F01F9B :10A4500000080C9A0E9BEACCFFFEF01F00060BC80A :10A460005808F1D4E108EFF81C01D8228001A2FCC1 :10A470008001A408EBCD4068189316951496F01F40 :10A4800000060C9A0A9BE6CCFFFCF01F0003E3CD0C :10A49000806800008001A37CEBCD4068189316957E :10A4A0001496F01F00090C9A0A9BE6CCFFFCF01FE3 :10A4B00000070C9A0A9BE6CCFFFAF01F0004E3CDDC :10A4C000806800008001A37C8001A2FCEBCD406885 :10A4D000189316951496F01F000F0C9A0A9BE6CC61 :10A4E000FFFCF01F000D0C9A0A9BE6CCFFFBF01F4F :10A4F000000A0C9A0A9BE6CCFFFAF01F00070C9AA0 :10A500000A9BE6CCFFF9F01F0004E3CD8068000051 :10A510008001A37C8001A29CEBCD40681893169526 :10A520001496F01F000C0C9A0A9BE6CCFFFCF01F5F :10A53000000A0C9A0A9BE6CCFFFAF01F00080C9A5E :10A540000A9BE6CCFFF9F01F0005E3CD8068000010 :10A550008001A37C8001A2FC8001A29CEBCD40681D :10A56000189316951496F01F00150C9A0A9BE6CCCA :10A57000FFFCF01F00120C9A0A9BE6CCFFF8F01FBC :10A5800000100C9A0A9BE6CCFFF6F01F000D0C9A07 :10A590000A9BE6CCFFF4F01F00090C9A0A9BE6CC5C :10A5A000FFF0F01F00070C9A0A9BE6CCFFEEF01FAD :10A5B0000004E3CD806800008001A37C8001A2FC40 :10A5C000EBCD4068189316951496F01F00090C9A6D :10A5D0000A9BE6CCFFFCF01F00060C9A0A9BE6CC17 :10A5E000FFF8F01F0003E3CD806800008001A37C2A :10A5F000EBCD4068189316951496F01F00060C9A40 :10A600000A9BE6CCFFFCF01F0003E3CD806800004E :10A610008001A37CEBCD4068189316951496F01F2B :10A62000000C0C9A0A9BE6CCFFFCF01F00090C9A68 :10A630000A9BE6CCFFF8F01F00060C9A0A9BE6CCBA :10A64000FFF4F01F0003E3CD806800008001A37CCD :10A65000EBCD4068189316951496F01F00330C9AB2 :10A660000A9BE6CCFFFCF01F00300C9A0A9BE6CC5C :10A67000FFF8F01F002D0C9A0A9BE6CCFFF4F01FA8 :10A68000002B0C9A0A9BE6CCFFF2F01F00280C9AD4 :10A690000A9BE6CCFFF0F01F00250C9A0A9BE6CC43 :10A6A000FFEEF01F00220C9A0A9BE6CCFFECF01F95 :10A6B000001F0C9A0A9BE6CCFFEAF01F001C0C9AC4 :10A6C0000A9BE6CCFFE8F01F00190C9A0A9BE6CC27 :10A6D000FFE6F01F00160C9A0A9BE6CCFFE4F01F81 :10A6E00000130C9A0A9BE6CCFFE2F01F00110C9AB3 :10A6F0000A9BE6CCFFE1F01F000E0C9A0A9BE6CC09 :10A70000FFE0F01F00090C9A0A9BE6CCFFDCF01F6B :10A7100000060C9A0A9BE6CCFFD8F01F0005E3CD9B :10A72000806800008001A37C8001A2FC8001A29CC3 :10A73000EBCD4068189316951496F01F00120C9AF2 :10A740000A9BE6CCFFFCF01F00100C9A0A9BE6CC9B :10A75000FFFBF01F000D0C9A0A9BE6CCFFFAF01FDE :10A76000000A0C9A0A9BE6CCFFF9F01F00070C9A2E :10A770000A9BE6CCFFF8F01F0004E3CD80680000E0 :10A780008001A37C8001A29CEBCD406818931695B4 :10A790001496F01F00060C9A0A9BE6CCFFFCF01FF3 :10A7A0000003E3CD806800008001A37CEBCD40680E :10A7B000189316951496F01F00060C9A0A9BE6CC87 :10A7C000FFFCF01F0003E3CD806800008001A37C44 :10A7D000EBCD4068189316951496F01F00060C9A5E :10A7E0000A9BE6CCFFFCF01F0003E3CD806800006D :10A7F0008001A37CEBCD4068189316951496F01F4A :10A8000000060C9A0A9BE6CCFFFCF01F0003E3CD88 :10A81000806800008001A37CEBCD406818931695FA :10A820001496F01F00060C9A0A9BE6CCFFFCF01F62 :10A830000003E3CD806800008001A37CEBCD40687D :10A84000189316951496F01F00060C9A0A9BE6CCF6 :10A85000FFFCF01F0003E3CD806800008001A37CB3 :10A86000EBCD4068189316951496F01F00060C9ACD :10A870000A9BE6CCFFFCF01F0003E3CD80680000DC :10A880008001A37CEBCD4068189316951496F01FB9 :10A8900000060C9A0A9BE6CCFFFCF01F0003E3CDF8 :10A8A000806800008001A37CEBCD4068189316956A :10A8B0001496F01F00060C9A0A9BE6CCFFFCF01FD2 :10A8C0000004E3CD806800008001A37C8001A650D5 :10A8D000EBCD4068189316951496F01F00060C9A5D :10A8E0000A9BE6CCFFFCF01F0003E3CD806800006C :10A8F0008001A37CEBCD4068189316951496F01F49 :10A9000000090C9A0A9BE6CCFFFCF01F00060C9A8B :10A910000A9BE6CCFFF8F01F0003E3CD806800003F :10A920008001A37CEBCD4068189316951496F01F18 :10A9300000060C9A0A9BE6CCFFFCF01F0003E3CD57 :10A94000806800008001A37CEBCD406818931695C9 :10A950001496F01F00090C9A0A9BE6CCFFFCF01F2E :10A9600000060C9A0A9BE6CCFFF8F01F0003E3CD2B :10A97000806800008001A37CEBCD40681893169599 :10A980001496F01F00090C9A0A9BE6CCFFFCF01FFE :10A9900000060C9A0A9BE6CCFFF8F01F0003E3CDFB :10A9A000806800008001A37CEBCD40681893169569 :10A9B0001496F01F00060C9A0A9BE6CCFFFCF01FD1 :10A9C0000003E3CD806800008001A37CEBCD4068EC :10A9D000189316951496F01F00090C9A0A9BE6CC62 :10A9E000FFFCF01F00060C9A0A9BE6CCFFF8F01F54 :10A9F0000003E3CD806800008001A37CEBCD4068BC :10AA0000189316951496F01F00060C9A0A9BE6CC34 :10AA1000FFFCF01F0003E3CD806800008001A37CF1 :10AA2000EBCD4068189316951496F01F00090C9A08 :10AA30000A9BE6CCFFFCF01F00060C9A0A9BE6CCB2 :10AA4000FFF8F01F0003E3CD806800008001A37CC5 :10AA5000EBCD4068189316951496F01F00090C9AD8 :10AA60000A9BE6CCFFFCF01F00060C9A0A9BE6CC82 :10AA7000FFF8F01F0003E3CD806800008001A37C95 :10AA8000EBCD4068189316951496F01F00060C9AAB :10AA90000A9BE6CCFFFCF01F0003E3CD80680000BA :10AAA0008001A37CEBCD4068189316951496F01F97 :10AAB00000060C9A0A9BE6CCFFFCF01F0003E3CDD6 :10AAC000806800008001A37CEBCD40681893169548 :10AAD0001496F01F00060C9A0A9BE6CCFFFCF01FB0 :10AAE0000003E3CD806800008001A37CEBCD4068CB :10AAF000189316951496F01F00060C9A0A9BE6CC44 :10AB0000FFFCF01F0004E3CD806800008001A37CFF :10AB10008001A29CEBCD4068189316951496F01F07 :10AB200000060C9A0A9BE6CCFFFCF01F0004E3CD64 :10AB3000806800008001A37C8001D434EBCD4068A4 :10AB4000189316951496F01F00330C9A0A9BE6CCC6 :10AB5000FFDEF01F00310C9A0A9BE6CCFFD4F01FF9 :10AB6000002F0C9A0A9BE6CCFFC2F01F002D0C9A16 :10AB70000A9BE6CCFFBFF01F002B0C9A0A9BE6CC89 :10AB8000FFBCF01F00290C9A0A9BE6CCFFB0F01F17 :10AB900000270C9A0A9BE6CCFFACF01F00250C9A0C :10ABA0000A9BE6CCFFA4F01F00230C9A0A9BE6CC7C :10ABB000FF9CF01F00210C9A0A9BE6CCFF98F01F27 :10ABC000001F0C9A0A9BE6CCFF8CF01F001D0C9A0C :10ABD0000A9BE6CCFF72F01F001B0C9A0A9BE6CC86 :10ABE000FF68F01F00190C9A0A9BE6CCFF44F01F87 :10ABF00000170C9A0A9BE6CCFF50F01F00150C9A28 :10AC00000A9BE6CCFF30F01F0013E3CD8068000004 :10AC10008001D3448001D2DC8001D2748001CAF863 :10AC20008001C9D88001D8608001CA688001CA9CAF :10AC30008001CA0C8001C9A48001D4348001CDB444 :10AC40008001CE848001D5588001D6B08001D4E443 :10AC50008001CFFCEBCD4068189316951496F01F39 :10AC6000000F0C9A0A9BE6CCFFFCF01F000D0C9A1B :10AC70000A9BE6CCFFFAF01F000B0C9A0A9BE6CC6D :10AC8000FFF9F01F00080C9A0A9BE6CCFFF8F01FB2 :10AC90000006E3CD806800008001A37C8001A2FC57 :10ACA0008001A29C8001AB3CEBCD406C14951296C8 :10ACB00018921693E06A00DC129B0A9CF01F001A9F :10ACC000ECC9FF98EACAFF98069B049CF01F001786 :10ACD000ECC9FFBCEACAFFBC069B049CF01F001431 :10ACE000ECC9FF68EACAFF68069B049CF01F0011CC :10ACF000ECC9FF50EACAFF50069B049CF01F000EEF :10AD0000ECC9FF44EACAFF44069B049CF01F000BF9 :10AD1000ECC9FF30EACAFF30069B049CF01F000814 :10AD2000E3CD806C8002E7368001D1588001D24C9F :10AD30008001D1E88001D1C08001D21C8001CF9C6C :10AD4000EBCD40EC1296F2E80000F4E90000ECE8EC :10AD50000008F4E90008ECE20010F4E30010ECE86D :10AD6000001814971695F4E90018E06B00E85D15DB :10AD70008F7CC0D030CA6C7BF01F00066E7A6C7975 :10AD8000149C0A9B2F492F4AF01F0003E3CD80EC4F :10AD9000800091DC8001ACA8EBCD40C014971696E2 :10ADA00074385808C160949E948AF60E00081438CE :10ADB000F5DEE916F9B80900EFF89A03580CC090CF :10ADC0005809C0C1189B0C9A6E4C1C0CF01F000A4D :10ADD0008E180C08AE18E3CD80C05819CFA16E4B69 :10ADE0000C9A1C0BF01F00048E180C08AE18E3CD53 :10ADF00080C00000800091DCEBCD40E016971496F7 :10AE00001895581AC0B0F01F000C0C99189B0E9A98 :10AE10000A9CF01F000AE3CD80E09698968614996C :10AE20001016169A0C9BF01F00053008EA060B0856 :10AE3000E3CD80E0800091B88001AD98EBCD406813 :10AE4000189316951496F01F00060C9A0A9BE6CCF0 :10AE5000FFFCF01F0004E3CD806800008001A37CAC :10AE60008001ADF8EBCD4068189316951496F01F4D :10AE700000060C9A0A9BE6CCFFFCF01F0004E3CD11 :10AE8000806800008001A37C8001ADF8EBCD4068B4 :10AE9000189316951496F01F000F0C9A0A9BE6CC97 :10AEA000FFFCF01F000C0C9A0A9BE6CCFFF8F01F89 :10AEB00000090C9A0A9BE6CCFFF4F01F00060C99DF :10AEC0000A9AE6CCFFF0320BF01F0003E3CD806856 :10AED0008001A37C8001AD98EBCD40681893169556 :10AEE0001496F01F000C0C9A0A9BE6CCFFFCF01F96 :10AEF00000090C9A0A9BE6CCFFF8F01F00060C999B :10AF00000A9AE6CCFFF4320BF01F0003E3CD806811 :10AF10008001A37C8001AD98EBCD40681893169515 :10AF20001496F01F000C0C9A0A9BE6CCFFFCF01F55 :10AF300000090C9A0A9BE6CCFFF8F01F00070C9959 :10AF40000A9AE6CCFFF7303BF01F0004E3CD80689F :10AF50008001A37C8001A29C8001AD98EBCD40686C :10AF6000189316951496F01F00180C9A0A9BE6CCBD :10AF7000FFFCF01F00150C9A0A9BE6CCFFF8F01FAF :10AF800000120C9A0A9BE6CCFFF4F01F000F0C9AFB :10AF90000A9BE6CCFFF0F01F000C0C9A0A9BE6CC53 :10AFA000FFECF01F000A0C9A0A9BE6CCFFEAF01FA8 :10AFB00000080C990A9AE6CCFFE9303BF01F000527 :10AFC000E3CD80688001A37C8001A2FC8001A29C6B :10AFD0008001AD98EBCD4068189316951496F01F3C :10AFE00000280C9A0A9BE6CCFFFCF01F00250C9A67 :10AFF0000A9BE6CCFFF8F01F00220C9A0A9BE6CCD5 :10B00000FFF4F01F00200C9A0A9BE6CCFFF2F01F21 :10B01000001E0C9A0A9BE6CCFFF1F01F001B0C9A55 :10B020000A9BE6CCFFF0F01F00180C9A0A9BE6CCB6 :10B03000FFEFF01F00150C9A0A9BE6CCFFEEF01F05 :10B0400000120C990A9AE6CCFFED306BF01F000F4E :10B050000C9A0A9BE6CCFFE7F01F000B0C9A0A9BA8 :10B06000E6CCFFE6F01F00080C990A9AE6CCFFE553 :10B07000320BF01F0006E3CD806800008001A37C46 :10B080008001A2FC8001A29C8001AD98EBCD4068BC :10B09000189316951496F01F00150C9A0A9BE6CC8F :10B0A000FFFCF01F00120C9A0A9BE6CCFFF8F01F81 :10B0B000000F0C9A0A9BE6CCFFF4F01F000C0C9AD0 :10B0C0000A9BE6CCFFF0F01F000A0C9A0A9BE6CC24 :10B0D000FFEEF01F00080C990A9AE6CCFFED303B1A :10B0E000F01F0005E3CD80688001A37C8001A2FCF5 :10B0F0008001A29C8001AD98EBCD40681893169515 :10B100001496F01F00120C9A0A9BE6CCFFFCF01F6D :10B1100000100C9A0A9BE6CCFFFBF01F000D0C9967 :10B120000A9AE6CCFFFA302BF01F000A0C9A0A9B11 :10B13000E6CCFFF8F01F00050C9A0A9BE6CCFFF462 :10B14000F01F0002E3CD80688001A37C8001A29CF7 :10B150008001AD98EBCD4068189316951496F01FBA :10B1600000120C9A0A9BE6CCFFFCF01F00100C9A10 :10B170000A9BE6CCFFFBF01F000D0C990A9AE6CC67 :10B18000FFFA302BF01F000A0C9A0A9BE6CCFFF85E :10B19000F01F00050C9A0A9BE6CCFFF4F01F00029A :10B1A000E3CD80688001A37C8001A29C8001AD98E2 :10B1B000EBCD4068189316951496F01F000C0C9A6E :10B1C0000A9BE6CCFFFCF01F000A0C9A0A9BE6CC17 :10B1D000FFFBF01F00070C990A9AE6CCFFFA302B10 :10B1E000F01F0004E3CD80688001A37C8001A29C55 :10B1F0008001AD98EBCD4068189316951496F01F1A :10B2000000090C9A0A9BE6CCFFFCF01F00070C9982 :10B210000A9AE6CCFFFB303BF01F0004E3CD8068C8 :10B220008001A37C8001A29C8001AD98EBCD406899 :10B23000189316951496F01F00090C9A0A9BE6CCF9 :10B24000FFFCF01F00070C990A9AE6CCFFFB303B8D :10B25000F01F0004E3CD80688001A37C8001A29CE4 :10B260008001AD98EBCD4068189316951496F01FA9 :10B2700000090C9A0A9BE6CCFFFCF01F00070C9912 :10B280000A9AE6CCFFFB303BF01F0004E3CD806858 :10B290008001A37C8001A29C8001AD98EBCD406829 :10B2A000189316951496F01F000C0C9A0A9BE6CC86 :10B2B000FFFCF01F00090C9A0A9BE6CCFFF8F01F78 :10B2C00000070C990A9AE6CCFFF7303BF01F000408 :10B2D000E3CD80688001A37C8001A29C8001AD98B1 :10B2E000EBCD4068189316951496F01F000C0C9A3D :10B2F0000A9BE6CCFFFCF01F00090C9A0A9BE6CCE7 :10B30000FFF8F01F00070C990A9AE6CCFFF7303BD4 :10B31000F01F0004E3CD80688001A37C8001A29C23 :10B320008001AD98EBCD4068189316951496F01FE8 :10B33000000C0C9A0A9BE6CCFFFCF01F00090C9A4B :10B340000A9BE6CCFFF8F01F00070C990A9AE6CC9E :10B35000FFF7303BF01F0004E3CD80688001A37C41 :10B360008001A29C8001AD98EBCD406818931695A2 :10B370001496F01F000C0C9A0A9BE6CCFFFCF01F01 :10B3800000090C9A0A9BE6CCFFF8F01F00070C9905 :10B390000A9AE6CCFFF7303BF01F0004E3CD80684B :10B3A0008001A37C8001A29C8001AD98EBCD406818 :10B3B000189316951496F01F00090C9A0A9BE6CC78 :10B3C000FFFCF01F00070C990A9AE6CCFFFB303B0C :10B3D000F01F0004E3CD80688001A37C8001A29C63 :10B3E0008001AD98EBCD4068169514961893F01F28 :10B3F00000220C990A9AE6CCFFFC308BF01F001F4C :10B400000C9A0A9BE6CCFFF4F01F001B0C9A0A9BD7 :10B41000E6CCFFF0F01F00180C9A0A9BE6CCFFEC7C :10B42000F01F00150C9A0A9BE6CCFFE8F01F0012F3 :10B430000C9A0A9BE6CCFFE4F01F000F0C9A0A9BC3 :10B44000E6CCFFE0F01F000E0C9A0A9BE6CCFFDE74 :10B45000F01F000B0C9A0A9BE6CCFFDCF01F0008E3 :10B460000C990A9AE6CCFFDA302BF01F0004E3CDEA :10B47000806800008001A37C8001AD988001A2FC5F :10B48000EBCD4068189316951496F01F00090C9A9E :10B490000A9BE6CCFFFCF01F00070C990A9AE6CC49 :10B4A000FFFB303BF01F0004E3CD80688001A37CEC :10B4B0008001A29C8001AD98EBCD40681695149652 :10B4C0001893F01F00060C990A9AE6CCFFFC308B0B :10B4D000F01F0003E3CD80688001A37C8001AD985C :10B4E000EBCD4068189316951496F01F00090C9A3E :10B4F0000A9BE6CCFFFCF01F00070C990A9AE6CCE9 :10B50000FFFB303BF01F0004E3CD80688001A37C8B :10B510008001A29C8001AD98EBCD406818931695F0 :10B520001496F01F00100C9A0A9BE6CCFFFCF01F4B :10B53000000E0C990A9AE6CCFFFB306BF01F000B53 :10B540000A9AE6CCFFF50C99306BF01F00080C9AB4 :10B550000A9BE6CCFFEFF01F0004E3CD80680000FB :10B560008001A37C8001A29C8001AD98EBCD406856 :10B57000169514961893F01F000C0C990A9AE6CCB5 :10B58000FFFC306BF01F00090C9A0A9BE6CCFFF61B :10B59000F01F00070C9A0A9BE6CCFFF5F01F000491 :10B5A000E3CD80688001A37C8001AD988001A29CDE :10B5B000EBCD4068169514961893F01F000D0C996A :10B5C0000A9AE6CCFFFC306BF01F000A0A9AE6CC20 :10B5D000FFF60C99302BF01F00070C9A0A9BE6CC63 :10B5E000FFF4F01F0005E3CD806800008001A37C1C :10B5F0008001AD988001AB3CEBCD40681695149668 :10B600001893F01F000D0C990A9AE6CCFFFC306BE2 :10B61000F01F000A0A9AE6CCFFF60C99302BF01FB7 :10B6200000070C9A0A9BE6CCFFF4F01F0005E3CD5F :10B63000806800008001A37C8001AD988001AB3C54 :10B64000EBCD4068169514961893F01F00100C99D6 :10B650000A9AE6CCFFFC306BF01F000D0C9A0A9B97 :10B66000E6CCFFF6F01F000B0C9A0A9BE6CCFFF429 :10B67000F01F00080C990A9AE6CCFFF2302BF01F5D :10B680000004E3CD806800008001A37C8001AD98B8 :10B690008001A2FCEBCD4068169514961893F01F1C :10B6A000000A0C990A9AE6CCFFFC306BF01F0007E9 :10B6B0000C990A9AE6CCFFF6302BF01F0004E3CD7C :10B6C000806800008001A37C8001AD98EBCD4068CC :10B6D000169514961893F01F000A0C990A9AE6CC56 :10B6E000FFFC306BF01F00070C990A9AE6CCFFF6BE :10B6F000302BF01F0004E3CD806800008001A37CA4 :10B700008001AD98EBCD4068189316951496F01F04 :10B7100000220C9A0A9BE6CCFFFCF01F00200C9A3A :10B720000A9BE6CCFFFAF01F001D0C9A0A9BE6CCA0 :10B73000FFF8F01F001A0C990A9AE6CCFFF6306B5E :10B74000F01F00170C9A0A9BE6CCFFF0F01F0015C3 :10B750000C9A0A9BE6CCFFEFF01F00120C990A9A94 :10B76000E6CCFFEE302BF01F000E0C9A0A9BE6CCC5 :10B77000FFECF01F00090C9A0A9BE6CCFFE8F01FD3 :10B7800000060C9A0A9BE6CCFFE4F01F0007E3CD0D :10B79000806800008001A37C8001A2FC8001AD983C :10B7A0008001A29C8001AB3CEBCD406816951496BD :10B7B0001893F01F000C0C990A9AE6CCFFFC306B32 :10B7C000F01F00090C9A0A9BE6CCFFF6F01F000759 :10B7D0000C9A0A9BE6CCFFF5F01F0004E3CD8068CD :10B7E0008001A37C8001AD988001A29CEBCD4068D4 :10B7F000169514961893F01F000C0C990A9AE6CC33 :10B80000FFFC306BF01F00090C9A0A9BE6CCFFF698 :10B81000F01F00070C9A0A9BE6CCFFF5F01F00040E :10B82000E3CD80688001A37C8001AD988001A29C5B :10B83000EBCD4068189316951496F01F00120C9AE1 :10B840000A9BE6CCFFFCF01F00100C9A0A9BE6CC8A :10B85000FFFAF01F000D0C9A0A9BE6CCFFF8F01FD0 :10B86000000A0A9AE6CCFFF60C99306BF01F00072D :10B870000C9A0A9BE6CCFFF0F01F0005E3CD806830 :10B880008001A37C8001A2FC8001AD988001AB3CCB :10B89000EBCD4068189316951496F01F00100C9A83 :10B8A0000A9BE6CCFFFCF01F000E0C9A0A9BE6CC2C :10B8B000FFFAF01F000B0C990A9AE6CCFFF8306BE8 :10B8C000F01F00080C990A9AE6CCFFF2302BF01F0B :10B8D0000005E3CD806800008001A37C8001A2FC0C :10B8E0008001AD98EBCD4068189316951496F01F23 :10B8F00000090C9A0A9BE6CCFFFFF01F00060C998A :10B900000A9AE6CCFFFE302BF01F0003E3CD8068DF :10B910008001A29C8001AD98EBCD406816951496ED :10B920001893F01F00130C990A9AE6CCFFFF306BB6 :10B93000F01F00100C9A0A9BE6CCFFF9F01F000CD8 :10B940000C9A0A9BE6CCFFF8F01F00090A9AE6CC95 :10B95000FFF70C99306BF01F00070C9A0A9BE6CC9E :10B96000FFF1F01F0003E3CD806800008001A29C7E :10B970008001AD98EBCD4068189316951496F01F92 :10B9800000060C9A0A9BE6CCFFFCF01F0004E3CDF6 :10B99000806800008001A37C8001B918EBCD40686D :10B9A0001696149518931499169A306BF01F000888 :10B9B0000A9A0C9BE6CCFFFAF01F00060A9A0C9B31 :10B9C000E6CCFFF9F01F0003E3CD80688001AD985D :10B9D0008001A29CEBCD4068189316951496F01F39 :10B9E00000060C9A0A9BE6CCFFFCF01F0004E3CD96 :10B9F000806800008001A37C8001B99CEBCD406889 :10BA0000189316951496F01F00090C9A0A9BE6CC21 :10BA1000FFFFF01F00060C990A9AE6CCFFFE306B80 :10BA2000F01F0003E3CD80688001A29C8001AD98E7 :10BA3000EBCD4068189316951496F01F00060C9AEB :10BA40000A9BE6CCFFFCF01F0004E3CD80680000F9 :10BA50008001A37C8001B9FCD4011499169A308B23 :10BA6000F01F0002D80200008001AD98EBCD4068C5 :10BA7000169514961893F01F00090A9AE6CCFFFC5D :10BA80000C99306BF01F00060C9A0A9BE6CCFFF66F :10BA9000F01F0004E3CD80688001A37C8001AD9895 :10BAA0008001A2FCEBCD4068189316951496F01F08 :10BAB00000090C9A0A9BE6CCFFFCF01F00070C99CA :10BAC0000A9AE6CCFFFB303BF01F0004E3CD806810 :10BAD0008001A37C8001A29C8001AD98D4011499BF :10BAE000169A320BF01F0002D80200008001AD98B8 :10BAF000EBCD4068189316951496F01F00180C9A19 :10BB00000A9BE6CCFFE0F01F00160C9A0A9BE6CCDD :10BB1000FFDEF01F00140C9A0A9BE6CCFFDDF01F3D :10BB200000110C990A9AE6CCFFDC306BF01F000E76 :10BB30000C9A0A9BE6CCFFD6F01F000C0C9A0A9BCD :10BB4000E6CCFFCEF01F00070C9A0A9BE6CCFFCD97 :10BB5000F01F0004E3CD80688001BADC8001A2FC04 :10BB60008001A29C8001AD988001BA58EBCD40685D :10BB7000189316951496F01F00060C9A0A9BE6CCB3 :10BB8000FFFCF01F0004E3CD806800008001A37C6F :10BB90008001BAF0D4011499169A303BF01F0002CC :10BBA000D80200008001AD98EBCD40E018971695C3 :10BBB0001496F01F000D6E1C580CC0800C990A9A48 :10BBC0006E0BF01F000AE3CD80E05816C0918A99F1 :10BBD0006A4812088F186E098A181208AA18E3CD4D :10BBE00080E000008001A37C8001AD98EBCD40682F :10BBF000189316951496F01F00060C9A0A9BE6CC33 :10BC0000FFFCF01F0004E3CD806800008001A37CEE :10BC10008001BBA8EBCD4068189316951496F01FD1 :10BC200000100C9A0A9BE6CCFFFCF01F000E0C994A :10BC30000A9AE6CCFFFB303BF01F000B0A9AE6CCD9 :10BC4000FFF80C99308BF01F00080C9A0A9BE6CC89 :10BC5000FFF0F01F0006E3CD806800008001A37CA8 :10BC60008001A29C8001AD988001BBA8EBCD40680B :10BC7000169514961893F01F00090A9AE6CCFFFC5B :10BC80000C99308BF01F00060C9A0A9BE6CCFFF44F :10BC9000F01F0004E3CD80688001A37C8001AD9893 :10BCA0008001BBA8EBCD40801697189B580AC0F1C5 :10BCB0008E1C8E89FDDCC010FCC8FFF91238C285CD :10BCC000F8C8FFF88F3AAE18E3CD8080581AC070DC :10BCD0008E1CF8C8FFF8AE18E3CD80808E9A8E894E :10BCE000F4C8FFF91238C2C46E48140811F9B889B3 :10BCF00011EAB89A11D9B8A911CAB8BA11B9B8C914 :10BD000011AAB8DA1199B8E9118AB8FACE2B17F846 :10BD10006E4A1C0AB48817E9B49917D8B4A817C991 :10BD2000B4B917B8B4C817A9B4D91798B4E8178923 :10BD3000B4F98E1CF8C8FFF8AE18E3CD8080300B44 :10BD4000308A8F3BF01F00028E1CCC4B800091D0BC :10BD5000EBCD4068189316951496F01F000C0C9AC2 :10BD60000A9BE6CCFFF8F01F000A0C9A0A9BE6CC6F :10BD7000FFF6F01F00070C9A0A9BE6CCFFF4F01FB9 :10BD80000005E3CD806800008001BCA48001A2FC16 :10BD90008001AB3CEBCD40F8206D169714961499BA :10BDA0001895169A306BF01F002D0C9A0E9BEACC5A :10BDB000FFFAF01F002B0C9A0E9BEACCFFF9F01F44 :10BDC00000280C9A0E9BEACCFFF8F01F00260C9A74 :10BDD0000E9BEACCFFF0F01F00240C9A0E9BEACCDD :10BDE000FFECF01F0021318A0E9B1A9CF01F001FF0 :10BDF000EAC3FFE81A940C9A1A9B069CF01F001ADB :10BE00005816C1801A9B0C9A6A7CF01F00199A98E8 :10BE10008E992048F00901098B690C9A069C0E9BAB :10BE2000F01F00116A698E181208AE182FADE3CD0D :10BE300080F86A698E182FC81208E06B00E8BA080B :10BE40006E5CF01F000C8B7CCF20505C1A9B0C9A10 :10BE5000F01F0007CE3B00008001AD988001A29C3E :10BE60008001BCA48001A37C800091DC8001BD50D6 :10BE70008001D3ECEBCD4068189316951496F01F13 :10BE800000120C9A0A9BE6CCFFFCF01F00100C9AE3 :10BE90000A9BE6CCFFFAF01F000D0C9A0A9BE6CC39 :10BEA000FFF8F01F00090C9A0A9BE6CCFFF4F01F84 :10BEB00000060C9A0A9BE6CCFFF0F01F0005E3CDCC :10BEC000806800008001A37C8001A2FC8001BD94F9 :10BED000EBCD40E0189716951496F01F000B0C9AC6 :10BEE0000A9BEECCFFFCF01F00090FD93008F009C7 :10BEF0001800C0700C9A0A9BEECCFFF8F01F0004EB :10BF0000E3CD80E08001A37C8001B8E48001BD9492 :10BF1000EBCD4060202D301A18951696FACCFFFE16 :10BF2000F01F00089A181BF92FE8F0090109AC0965 :10BF30001BCA8B5A1BD88B482FEDE3CD80600000C5 :10BF40008001A444EBCD40E07808975818971696E6 :10BF50007859E049003FE0880004E3CF80E0FEF834 :10BF6000029AF009032F78455815E0800127E04533 :10BF70000080CF41780C301AF01F00A1E3CF90E091 :10BF800078485808C391780C301AF01F009EE3CF10 :10BF900090E07848F0C90005E049008FFE9BFFDF84 :10BFA000FEF80264F009032F7848E0480081E08041 :10BFB000010CE08A002BE0480083E0800118E08556 :10BFC0000110E0480085CCA1780C301AF01F008FDA :10BFD000E3CF90E0780C301AF01F008DE3CF90E0B3 :10BFE0007848F0C90001E049009BFE9BFFB8FEF8CD :10BFF0000222F009032FE0480081CB01780C301AAF :10C00000F01F0085E3CF90E05848E08000E4E0486E :10C010000080CA41781A300B780CF01F00806E0C3B :10C020000C9B301AF01F007EE3CF90E0780C301AA2 :10C03000F01F007CE3CF90E0780C301AF01F007AFC :10C04000E3CF90E0780C301AF01F0078E3CF90E057 :10C05000780C301AF01F0076E3CF90E0780C301A9D :10C06000F01F0074E3CF90E0780C301AF01F0072DC :10C07000E3CF90E0780C301AF01F0070E3CF90E02F :10C08000780C301AF01F006EE3CF90E0780C301A75 :10C09000F01F006CE3CF90E0780C301AF01F006ABC :10C0A000E3CF90E0780C301AF01F0068E3CF90E007 :10C0B000780C301AF01F0066E3CF90E0780C301A4D :10C0C000F01F0064E3CF90E0780C301AF01F00629C :10C0D000E3CF90E0780C301AF01F0060E3CF90E0DF :10C0E000780C301AF01F005EE3CF90E0780C301A25 :10C0F000F01F005CE3CF90E0780C301AF01F005A7C :10C10000E3CF90E0780C301AF01F0058E3CF90E0B6 :10C11000780C301AF01F0056E3CF90E0780C301AFC :10C12000F01F0054E3CF90E0780C301AF01F00525B :10C13000E3CF90E0780C301AF01F0050E3CF90E08E :10C14000780C301AF01F004EE3CF90E0780C301AD4 :10C15000F01F004CE3CF90E0780C301AF01F004A3B :10C16000E3CF90E0780C301AF01F0048E3CF90E066 :10C17000780C301AF01F0046E3CF90E0780C301AAC :10C18000F01F0044E3CF90E0780C301AF01F00421B :10C19000E3CF90E0780C301AF01F0040E3CF90E03E :10C1A000780C301AF01F003EE3CF90E0780C301A84 :10C1B000F01F003CE3CF90E0780C0A9AF01F003AA1 :10C1C0000A9CE3CD80E0780C301AF01F0038E3CFF2 :10C1D00090E0780C301AF01F0036E3CF90E0780C36 :10C1E000301AF01F0034E3CF90E0780C301AF01FC3 :10C1F0000032E3CF90E000008003B8288001AAEC71 :10C200008001A4988003B9288001B3248001A37C15 :10C210008003BB688001A4CC800091D08001BC1455 :10C220008001BAA48001A4748001BA6C8001AC546E :10C230008001AA808001AE8C8001AAC88001AAA4D6 :10C240008001AA208001AF5C8001A9CC8001A9787F :10C250008001A9488001A8F48001A8D08001A884A9 :10C260008001A8608001B1548001B1B08001B1F4B7 :10C270008001A8188001AA508001B0F88001A83C74 :10C280008001A7F48001B4E08001B56C8001B5B0F5 :10C290008001B5F88001B6408001BED08001B5189C :10C2A0008001B9748001AE3C8001B3AC8001A6145A :10C2B0008001B3688001B2E0EBCD40C012971499C1 :10C2C0008E96109A582CC280E08A0008584CC360A1 :10C2D000587CC190E3CF80C0580CC0A0581CCFB18F :10C2E00058EBFE9BFFF9FEF80312F00B032F580BDF :10C2F000CF21129C0E9BF01F00C28E98F006010CFD :10C30000E3CD80C0202BE04B007FFE9BFFE5FEF8D5 :10C3100002F2F00B032F582BE080015DE089001A38 :10C32000580BC260581BCD71129C0E9BF01F00B6BB :10C330008E98F006010CE3CD80C0580BCCC1129C46 :10C340000E9BF01F00B28E98F006010CE3CD80C06A :10C35000584BC170E0850148585BCBD1129C0E9BB5 :10C36000F01F00AB8E98F006010CE3CD80C0129C4C :10C370000E9BF01F00A88E98F006010CE3CD80C044 :10C38000129C0E9BF01F00A48E98F006010CE3CDCA :10C3900080C0129C0E9BF01F00A18E98F006010C2D :10C3A000E3CD80C0129C0E9BF01F009D8E98F0067E :10C3B000010CE3CD80C0129C0E9BF01F009A8E985A :10C3C000F006010CE3CD80C0129C0E9BF01F00967E :10C3D0008E98F006010CE3CD80C0129C0E9BF01FDE :10C3E00000938E98F006010CE3CD80C0129C0E9B4A :10C3F000F01F008F8E98F006010CE3CD80C0129CD8 :10C400000E9BF01F008C8E98F006010CE3CD80C0CF :10C41000129C0E9BF01F00888E98F006010CE3CD55 :10C4200080C0129C0E9BF01F00858E98F006010CB8 :10C43000E3CD80C0129C0E9BF01F00818E98F00609 :10C44000010CE3CD80C0129C0E9BF01F007E8E98E5 :10C45000F006010CE3CD80C0129C0E9BF01F007A09 :10C460008E98F006010CE3CD80C0129C0E9BF01F4D :10C4700000778E98F006010CE3CD80C0129C0E9BD5 :10C48000F01F00738E98F006010CE3CD80C0129C63 :10C490000E9BF01F00708E98F006010CE3CD80C05B :10C4A000129C0E9BF01F006C8E98F006010CE3CDE1 :10C4B00080C0129C0E9BF01F00698E98F006010C44 :10C4C000E3CD80C0129C0E9BF01F00658E98F00695 :10C4D000010CE3CD80C0129C0E9BF01F00628E9871 :10C4E000F006010CE3CD80C0129C0E9BF01F005E95 :10C4F0008E98F006010CE3CD80C0129C0E9BF01FBD :10C50000005B8E98F006010CE3CD80C0129C0E9B60 :10C51000F01F00578E98F006010CE3CD80C0129CEE :10C520000E9BF01F00548E98F006010CE3CD80C0E6 :10C53000129C0E9BF01F00508E98F006010CE3CD6C :10C5400080C0129C0E9BF01F004D8E98F006010CCF :10C55000E3CD80C0129C0E9BF01F00498E98F00620 :10C56000010CE3CD80C0129C0E9BF01F00468E98FC :10C57000F006010CE3CD80C0129C0E9BF01F004220 :10C580008E98F006010CE3CD80C0129C0E9BF01F2C :10C59000003F8E98F006010CE3CD80C0129C0E9BEC :10C5A000F01F003B8E98F006010CE3CD80C0129C7A :10C5B0000E9BF01F00388E98F006010CE3CD80C072 :10C5C000129C0E9BF01F00348E98F006010CE3CDF8 :10C5D00080C0129C0E9BF01F00318E98F006010C5B :10C5E000E3CD80C0129C0E9BF01F002D8E98F006AC :10C5F000010CE3CD80C000008003BDD88001A49869 :10C600008003BE148001BC6C8001AE648001A5C0B3 :10C610008001B4B88001A5F08001B8308001B29CDF :10C620008001B6948001B6CC8001B9D48001BA30C3 :10C630008001BB6C8001B7048001B7EC8001BA6C4B :10C640008001B8908001BE748001A5188001A55CAE :10C650008001B7A88001A7308001A7888001AE8C37 :10C660008001AED88001A7D08001AB148001AF1843 :10C670008001A9FC8001A9A88001AFD48001A92470 :10C680008001B08C8001A8A88001B22C8001A7ACE9 :10C690008001B2648001BBEC8001B4808001B3E40E :10C6A000EBCD40FE208D306A18977853784578019D :10C6B000FAC2FFE6300B049CF01F00384B88F139BA :10C6C000010BE06AFFFFFB69001E300B1A9CF01F94 :10C6D0000035302A1A9B049CF01F0033029A302840 :10C6E0001A990A9B069CF01F00319A194B08F9D938 :10C6F000C0101188103CF9B60200F1DCE318E06AC2 :10C7000000FFF1DAE326EDD9E309FBF93C01F9D6A4 :10C71000E30C1A944A78118A580AC060F4C80001E0 :10C72000F9E80008C2918F3CF01F00238F2CC31042 :10C730006E3A300BF01F0019FB66001F6E2BFB6377 :10C74000001CFB65001D8E78F5D8C01020281A9CAF :10C75000FB58001AF01F0013049C1A9B300AF01FAC :10C7600000121A99029A0A9B069C3008F01F000FCB :10C770002F8DE3CF90FE9A18F4C90001F9E9000962 :10C78000F40901095C591208120CBA181206CCCB34 :10C790002F8DE3CD80FE0000800091D0000087F453 :10C7A0008001C7B88001A4448001C2B8000079E5C7 :10C7B000000079E48000920030083019B838B818C9 :10C7C000B828B80A3008994B993999285EFCD703E4 :10C7D000EBCD4068189316951496F01F00090C9A3B :10C7E0000A9BE6CCFFFFF01F00060C9A0A9BE6CCE2 :10C7F000FFFEF01F0004E3CD806800008001A29CD2 :10C800008001A2FCEBCD40681696149518931499FC :10C81000169A303BF01F00050A9A0C9BE6CCFFFDF0 :10C82000F01F0003E3CD80688001AD988001A29CD9 :10C83000EBCD40681696149518931499169A303BD0 :10C84000F01F00050A9A0C9BE6CCFFFDF01F0003C9 :10C85000E3CD80688001AD988001A29CD431FACEEE :10C86000FFDC189616971494129210907C157C0198 :10C87000581AC2D0C153582AC1300D893FF8F00967 :10C880001800C2100D98E2081900E08B0005E008BE :10C890001900C6E23FF83009AC88AC99D83A8E1836 :10C8A000AE383FF80D89F0091800C0D00C9C089AEA :10C8B0000E9BF01F0034089A0E9BECCCFFFFF01F7C :10C8C0000031CDCB3008300CAC98D83296285808BF :10C8D000C4C0B618AE3830088B08AC983FFAAC8AA2 :10C8E0008E198E08F2081900FE98FFEE1494ECC31E :10C8F000FFFFC1D8E8081800EDF41E000D9A8E184D :10C900008E89F408000B5C781019123AE089002631 :10C91000AE1B6A082FF88B080D89E8091800CB3187 :10C920008E198E08F2081900FE98FFCEAE39301A23 :10C930000E9B0C9CF01F0013301A0E9B069CF01FE0 :10C9400000110D88E4081800CD618E888E990D9A2B :10C950001218103AE08A000E3FF83009AC88AC9902 :10C960008E182028AE08C8AB9618B628CB4BDA3AFA :10C970006A0A6E293018F00A094810498F29C7EB56 :10C980008001A29CEBCD4040201D1A9E9AF65C7857 :10C990001ADE1AD6F01F00032FED2FFDE3CD8040E5 :10C9A0008001C85CEBCD40E0302818951AD8169667 :10C9B00014973069F01F00072FFD580CC0700E9AB5 :10C9C0000C9BEACCFFFEF01F0004E3CD80E00000EA :10C9D0008001C9848001A2FCEBCD40E0301818959D :10C9E0001AD81696149732A9F01F00072FFD580C7D :10C9F000C0700E9A0C9BEACCFFFEF01F0004E3CD42 :10CA000080E000008001C9848001A29CEBCD40E061 :10CA1000305818951AD8169614973029F01F001020 :10CA20002FFD580CC190EACCFFFE0E9A0C9BF01F14 :10CA3000000D0E9A0C9BEACCFFFCF01F000B0E9A27 :10CA40000C9BEACCFFFBF01F00080E9A0C9BEACC73 :10CA5000FFFAF01F0005E3CD80E000008001C984EB :10CA60008001A2FC8001A29CEBCD40E0301818951B :10CA70001AD8169614973039F01F00072FFD580C5E :10CA8000C0700E9A0C9BEACCFFFEF01F0004E3CDB1 :10CA900080E000008001C9848001A29CEBCD40E0D1 :10CAA000306818951AD8169614973049F01F001060 :10CAB0002FFD580CC190EACCFFFE0E9A0C9BF01F84 :10CAC000000D0E9A0C9BEACCFFFDF01F000A0E9A97 :10CAD0000C9BEACCFFFCF01F00080E9A0C9BEACCE2 :10CAE000FFFAF01F0005E3CD80E000008001C9845B :10CAF0008001A29C8001A2FCEBCD40E0301818958B :10CB00001AD81696149730A9F01F00072FFD580C5D :10CB1000C0700E9A0C9BEACCFFFEF01F0004E3CD20 :10CB200080E000008001C9848001A29CD43120BD36 :10CB30005019500818961697581AC390C272E06898 :10CB400000FDE06900DD1AD8300A3018F01F005CE3 :10CB50002FFD580CC1E0300A0E9BECCCFFFEF01FFD :10CB60000059300A0E9BECCCFFFDF01F0056300A36 :10CB70000E9BECCCFFFCF01F0053ECCCFFFB0E9B9C :10CB8000300AF01F0050301CC048582AC040301CEA :10CB90002F5DD83219893FF8F0091800E080008B2A :10CBA0009618301C2FA8B6182F5DD832761850581A :10CBB000B1485038760A504AF6E80008F8C2FFFE3D :10CBC000FAE90018F8C3FFFDF6EA0010F8C9FFFB08 :10CBD000FAEB0020F8C4FFFC50293FF5FAC0FFD85B :10CBE000E06100FDC0680D998E382FE81208AE286C :10CBF0001AD030181AD1E06900DD109A0E9B0C9CF7 :10CC0000F01F00312FED580CC4105805FBF5500AE9 :10CC1000FBF8400AF9B90401F1D9E408EBD8E405BE :10CC2000301A0E9B049CF01F0027301A0E9B069CA6 :10CC3000F01F0024301A0E9B089CF01F00220DA844 :10CC40003009F2081800CD010DB83509F2081800B6 :10CC5000CCB10DC83F29F2081800CC61301A0E9BE8 :10CC6000402CF01F00180DD84019F2081800CBC155 :10CC70004038301CAE28F80509496E2812488F2824 :10CC800040095809C8509305C84B4038FB58001458 :10CC9000FAE80020EEE90010FAEA0010EEEB0000DE :10CCA000FAE80018EEE90008AC9C3FF8AC882F5D6C :10CCB000D8323008B898300CC6CB00008001C98447 :10CCC0008001A29C8001C85CD431207D1895169704 :10CCD00014961293581AC110C0B2300830290C9A19 :10CCE0000E9B0A9CF01F0032C5712F9DD832582A26 :10CCF000CF50301C2F9DD83276185018760AF0008D :10CD00001410500A1A91F6E80008F8C4FFFAFAE97C :10CD100000083FF6F6EA0010FAC2FFE8FAEB00104E :10CD2000C1A85806FBF65006FBF84006F9B9040105 :10CD3000F1D9E408EDD8E406301A0E9B089CF01FE8 :10CD4000001D0BE8E6081800C1D00B998E382FE8BB :10CD50001208AE2804983029301A0E9B0A9CF01F46 :10CD60000014CE01BA20E2E80010EEE90010E2E87B :10CD70000000EEE90000E2EA0008EEEB00082F9D5B :10CD8000D83230186E29F006094AAE201449109C9A :10CD90008F292F9DD8320B982FF8EACCFFFA0C9AE6 :10CDA0000E9BAA98F01F0003301CCA5B8001CB2C9D :10CDB0008001A29CEBCD40EC206D301918971693A2 :10CDC0001495F01F002DC0412FADE3CD80ECEECCCB :10CDD000FFF90A9A069BF01F00290A9A069BEECCDF :10CDE000FFF8F01F00260A9A069BEECCFFF7F01F13 :10CDF00000230A9A069BEECCFFF6F01F00210A9A48 :10CE0000069BEECCFFF2F01F001E0A9A069BEECCAA :10CE1000FFEEF01F001B0A9A069BEECCFFEAF01F04 :10CE2000001858055F0858255F091248CCE06608CD :10CE30005008661886160A9A5018EBD8B010BA1522 :10CE4000E6E80008FAE900082026E6E20010E068BB :10CE500000FD0A16AE961A9BFAE300100E9C1AD833 :10CE6000E06900DD3018F01F00072FFD2FADE3CD86 :10CE700080EC00008001CCC88001A29C8001C7D05A :10CE80008001C984EBCD40EC206D18971693149562 :10CE9000582AC18119893FF8F0091800F9F91801D9 :10CEA000F7F81201F9BA0102F1DAE108F1D9E10863 :10CEB000F7F81C01F9B80000F9F80E012FADE3CD29 :10CEC00080EC3009F01F0019CFA0EECCFFF90A9AD0 :10CED000069BF01F00170A9A069BEECCFFF8F01F86 :10CEE00000145805CEC166085008661886160A9ABE :10CEF0005018EBD8B010BA15E6E80008FAE90008B7 :10CF00002026E6E20010E06800FD0A16AE961A9BA5 :10CF1000FAE300100E9C1AD8E06900DD3018F01F0B :10CF200000052FFDCCCB00008001CCC88001A29C65 :10CF30008001C984D42112951497580A5F095805B5 :10CF40005F08169A1248C2510B986E29F0C4FFFE72 :10CF5000F2C800015BD8E08B0015129C089B5D1A9B :10CF600018965806C0C06E086E192FF80809089A5E :10CF70000A9B8F088F190C9CF01F00080C9CD8226C :10CF8000089B5D1A300818968F2C8F188F08CEAB2F :10CF900030060C9CD8220000800091DCEBCD40FCD8 :10CFA00012951494580A5F0958055F0818921248A0 :10CFB0001693C191300995296A085808E08A00162D :10CFC00012966A270E99089A069B049CF01F000B84 :10CFD0002FF6EEF7FFF86A085807F7B701F80C3894 :10CFE000FE99FFF2E3CD80FCEAE80000F4E90000DE :10CFF0006A2A892AE3CD80FC8001CF34EBCD40FC46 :10D0000018931695581AC2C0C053582AC5E0E3CDEC :10D0100080FC782778085808FE9AFFFB7819580991 :10D02000FE9AFFF79698300612087649F208000437 :10D030000F9A0E9B2FEA1414089CF01F00332FF652 :10D04000EEF7FFF866085807F7B701F80C38FE99B5 :10D05000FFF166198A181208AA18E3CD80FC9628F9 :10D060005808C3C0B618F9D8B010AA3C300830121E :10D0700087088718872810948A1C8A0E189AFC0C37 :10D080001900C212F7DAC0106A46EC0B00081199B9 :10D09000F2C7FFFE5827C250F1DEC0101618103735 :10D0A000E0890020E40409496A2B2FF4F3EB00081F :10D0B000C1C0F4070008AA18F9D8B010189AFC0CDF :10D0C0001900CE13E3CD80FC781C580CFE9AFFA10A :10D0D00096181808B618E3CD80FC961CB62CCC6BBD :10D0E000AA0CFDDCB010CCBBF3EB1008069A8A99B1 :10D0F0008B28EC090009485B6A5CF01F00058A1A5E :10D100008A0ECD8B800091DC8001D3EC8001CF347E :10D11000EBCD40F83FF510941697149340661388B2 :10D12000EA081800C05130070E9CE3CD80F858047F :10D130005F1858065F991268CF700C9B5D1718979F :10D14000C0600C9A089BF01F0004CEFBA685A69C2D :10D15000CECB0000800091DCEBCD40C0129EF2E807 :10D160000000F4E9000014977C2A8F2A18961D8984 :10D17000169C3FF8F0091800C1401D993058F0097D :10D180001800E088000F2039E06A5556EA1A555514 :10D19000F20B141FF20A04481619F2090019C028EC :10D1A00030091AD9189B1C990C9C7C280E9AF01FE8 :10D1B00000042FFD8F2CE3CD80C000008001D11032 :10D1C000EBCD406CF2E20000F4E3000072289528F9 :10D1D0001495722813961AD6F01F00032FFD8B2C7E :10D1E000E3CD806C8001D110EBCD406FF2E2000006 :10D1F000F4E30000F2E00008F4E10008F2E20010BD :10D20000F4E300101495725813961AD6F01F000319 :10D210002FFD8B5CE3CD806F8001D110EBCD406F93 :10D22000F2E20000F4E30000F2E00008F4E100089C :10D23000724895481495724813961AD6F01F000349 :10D240002FFD8B4CE3CD806F8001D110EBCD406C76 :10D25000F2E20000F4E30000722895281495722889 :10D2600013961AD6F01F00032FFD8B2CE3CD806C94 :10D270008001D110D421310418971AD41696149530 :10D2800030183329F01F00142FFD580CC0B058057A :10D29000C0E18C986C4C0F9A100CEECBFFFEF01F87 :10D2A000000F0F998C181208AC18D8225815CFA16E :10D2B0000F9AE80A1800E08800073FF83009AE88A6 :10D2C000AE99CF0B8C986C4BEECCFFFE100BF01F81 :10D2D0000003CE8B8001C984800091DCD4213018FA :10D2E000189716961495308410991AD4F01F0014CC :10D2F0002FFD580CC0B05805C0E18C986C4C0F9AAB :10D30000100CEECBFFFEF01F000F0F998C181208C7 :10D31000AC18D8225815CFA10F9AE80A1800E08857 :10D3200000073FF83009AE88AE99CF0B8C986C4B54 :10D33000EECCFFFE100BF01F0003CE8B8001C984E2 :10D34000800091DCEBCD40E0320930081AD9189505 :10D35000169714961099F01F00132FFD580CC0F06B :10D360005806C0F18E986E4C0B9A100CEACBFFFE5B :10D37000F01F000D0B998E181208AE18E3CD80E057 :10D380005816CF918E986E4B0B9A100BEACCFFFE7D :10D39000F01F00050B998E181208AE18CF0B000075 :10D3A0008001C984800091ACD421201D7809189691 :10D3B000F2C800015BD8E08B0014F2C80008C0E09E :10D3C0001A943005C0280E98500870079105680C13 :10D3D000F01F00068D055807CF712FFDD8223008A9 :10D3E00099082FFDD8220000800091E8EBCD40C0C5 :10D3F00018971696F6CCFFF8F01F000DC130EEF826 :10D40000FFF8EEC900089908F8C7FFF8930C9916C1 :10D410000C9AE06B00FF0E9CF01F00060E9CE3CD03 :10D4200080C018970E9CE3CD80C000008000920061 :10D43000800091D0EBCD40FC32E818931AD81692B8 :10D44000149430683079F01F00232FFD580CC03140 :10D45000E3CD80FC089A049BE6CCFFFEF01F001E83 :10D4600007993058F0091800E088001F2039E06A59 :10D470005556EA1A5555F20B141FF20A0448F20BDE :10D4800001055814C18030060C972FF6662C0899B8 :10D490000E0C049A2FD7303BF01F00100C35FE996C :10D4A000FFF6E3CD80FC5814F9B80000E7F80A0253 :10D4B000E3CD80FCEA050017645C0E9BF01F0008BA :10D4C000872CCC700E9A300BF01F0006CDDB0000CD :10D4D0008001C9848001BB948001AD988001D3ECA8 :10D4E000800091D0D421189616951497582AC161BE :10D4F00019893FF8F0091800F9F91801F7F8120135 :10D50000F9BA0102F1DAE108F1D9E108F7F81C01F2 :10D51000F9B80000F9F80E01D82230083049F01FA0 :10D52000000CC0C00D98F0C400045817C0800E99BC :10D530000A9A089B6C2CF01F0007D822089B6A5C93 :10D54000F01F00058D2CCF41CF9B00008001CB2C1C :10D550008001AD988001D3ECEBCD40FC206D189498 :10D5600016951493582AC18119893FF8F0091800BB :10D57000F9F91801F7F81201F9BA0102F1DAE10834 :10D58000F1D9E108F7F81C01F9B80000F9F80E012B :10D590002FADE3CD80FC30083019F01F0040CF9054 :10D5A0006A1E501E6A0A500AEAE80008FAE90008F2 :10D5B000EAEA0010FAEB0010EDDEB0105813C600D6 :10D5C000E8C7FFFA0999ECC8FFFE12080E9CE5D8DF :10D5D000B010069A0A9BF01F00328A18E40819005E :10D5E000CD82069A0A9BE8CCFFF8F01F002E8A181D :10D5F000E4081900CCE2E8CCFFF4069A0A9BF01F7D :10D600000028685C88693008F0091900C0E01896A5 :10D6100030070C9C2FF7069A0A9BF01F00222FC69A :10D6200088E80E38FE99FFF78A18E4081900CB1233 :10D63000069AE8CCFFF20A9BF01F0019685888E9A7 :10D64000887AF009002C3008F00A1900C0E018961A :10D6500030070C9C2FF7069A0A9BF01F00132FC669 :10D6600088F80E38FE99FFF78A18E4081900C912E5 :10D67000069A0A9BE8CCFFF0F01F0009C8ABE8C788 :10D68000FFFA30EA300B0E9CF01F0008099B6A5C21 :10D69000F01F0007895CC97B8001CB2C8001A2FCB4 :10D6A0008001C8308001C804800091D08001D3EC93 :10D6B000EBCD40FC206D189416951493582AC18127 :10D6C00019893FF8F0091800F9F91801F7F8120163 :10D6D000F9BA0102F1DAE108F1D9E108F7F81C0121 :10D6E000F9B80000F9F80E012FADE3CD80FCE06839 :10D6F00000FF33091AD83008F01F00532FFD580CD3 :10D70000CF406A1E501E6A0A500AEAE80008FAE989 :10D710000008EAEA0010FAEB0010EDDEB010581332 :10D72000E0800085E8C7FFFE0999ECC8FFFE1208FB :10D730000E9CE5D8B010069A0A9BF01F00448A1888 :10D74000E4081900CD22069A0A9BE8CCFFFCF01FE2 :10D7500000408A18E4081900CC82E8CCFFF8069A49 :10D760000A9BF01F003A684C88493008F0091900FC :10D77000C0E0189630070C9C2FF7069A0A9BF01F02 :10D7800000342FC688C80E38FE99FFF78A18E408BF :10D790001900CAB2069AE8CCFFF60A9BF01F002BCC :10D7A000684888C9885AF009002C3008F00A190026 :10D7B000C0E0189630070C9C2FF7069A0A9BF01FC2 :10D7C00000252FC688D80E38FE99FFF78A18E4087E :10D7D0001900C8B2069A0A9BE8CCFFF4F01F001BA0 :10D7E0008A18E4081900C812069AE8CCFFF20A9BCE :10D7F000F01F001688C988D81208684A8879F4088A :10D80000002C3008F0091900FE90FF7018963007C0 :10D810000C9C2FF706990A9A310BF01F000F2F0668 :10D8200088F80E38FE99FFF6C60BE8C7FFFE30EA0F :10D83000300B0E9CF01F0009099B6A5CF01F00086A :10D84000894CC73B8001C9848001A2FC8001C8309B :10D850008001C8048001AD98800091D08001D3EC94 :10D86000EBCD40E0E06800FE18971AD816951496A4 :10D8700030483059F01F00162FFD580CC031E3CD51 :10D8800080E0EECCFFFE0C9A0A9BF01F00120C9A6F :10D890000A9BEECCFFFDF01F000F0C9A0A9BEECC0A :10D8A000FFFCF01F000C5816C0A00F9B0C990A9AA1 :10D8B0006E2C203BF01F0008E3CD80E00F9B6A5CDC :10D8C000203BF01F00068F2CCF11CDAB8001C98407 :10D8D0008001A29C8001AD988001D3ECEBCD40E0AB :10D8E00018951696F6CCFFF8F01F000CC12099167B :10D8F00030089908F8C7FFF80C9A5805EBF71A0595 :10D90000E06B00FF0E9CF01F00060E9CE3CD80E054 :10D9100018970E9CE3CD80E080009200800091D0AB :10D92000EBCD40C0201DF8C60008300C6C1BF01F6A :10D930000014C1A0500C3007C1286C1B400CF01F14 :10D9400000111897C1406C1AECCBFFF8EF4AFFFCAE :10D950000E9CF01F000D6C065806C0505807CEE113 :10D960004007CF2B400C2FFDE3CD80C01A9CF01F49 :10D9700000070E9C2FFDE3CD80C000008001D8DCA5 :10D980008001D3EC800091DC8001D3A8D401E06851 :10D990000081301999489959189A7408129C11CE2F :10D9A000F20E18005F089708D802D703486830398C :10D9B000F0FA00F830089569985BF00B19005F0CDD :10D9C0005EFC0000000087F419C8300A4869F2F9CB :10D9D00000F8F4081800F9BC0001F9BC0100F3FCE0 :10D9E0001A065EFC000087F448483009F0FA00F897 :10D9F000301C95695EFC0000000087F448B8985A16 :10DA0000F0FB00F83178F00A1900E08B000B3018B9 :10DA1000F00A0948E4180080E01803FEC0205EFF09 :10DA20003008301C97685EFC000087F478185808AE :10DA30005F0C5EFC5EFF19C830192018F208180050 :10DA40005FBC5EFC5EFD5EFD19C93008F009180080 :10DA50005F0C5EFC5EFD5EFFEBCD4080308B189767 :10DA6000991B300CF01F00078F0CC0803078E069E4 :10DA700000818F588F49E3CF9080E3CD80800000F4 :10DA80008001D8DCEBCD40C018971696308B991BDF :10DA9000300CF01F00108F0CC160301830298F58E7 :10DAA0008F4948D8B826118948C8B8E948C71189AC :10DAB000B8F96EB899086EBC580CC0752FFC8FBCB5 :10DAC000E3CF90C0E3CD80C0F01F0006CF9B0000E5 :10DAD0008001D8DC00007A280000025C000087F496 :10DAE00080018450EBCD40FE1897FACCFFE01694ED :10DAF000781330CB14928F1B129178061095300C4E :10DB0000F01F00118F0CC1A0307830498F588F4919 :10DB10009905B8E6B8F1F9630008B8C4B8D248B8B6 :10DB200048B9B084B28248B76EB899086EBC580C38 :10DB3000C0752FFC8FBCE3CF90FEE3CD80FEF01FBD :10DB40000006CF9B8001D8DC000079E5000079E475 :10DB5000000087F480018450EBCD40FC1897FACC8C :10DB6000FFE4314B781414938F1B129278061095B2 :10DB7000300CF01F00158F0CC2003018F3D4C01009 :10DB80008F488F589913B8429935F9560010F954B7 :10DB9000001248E7F1D6C0100A481248F9B800FF51 :10DBA000F9B80100B8586EB999096EBC580CC07527 :10DBB0002FFC8FBCE3CF90FCE3CD80FCF01F000472 :10DBC000CF9B00008001D8DC000087F480018450E6 :10DBD000D401780A3009740B15F8129C129AF01FC0 :10DBE0000002DA0A80018460D401780A3009740BDB :10DBF000F538000B129C129AF01F0002DA0A00009E :10DC000080018460D401780A3009740BF538000B68 :10DC1000129C129AF01F0002DA0A00008001846050 :10DC2000D401780A3009740BF538000B129C129A53 :10DC3000F01F0002DA0A000080018460D401780A33 :10DC40003009740BF538000B129C129AF01F000279 :10DC5000DA0A000080018460D401780A3009740B6C :10DC6000F538000B129C129AF01F0002DA0A00002D :10DC700080018460D401780A3009740B15F8129C75 :10DC8000129AF01F0002DA0A80018460EBCD40F89E :10DC900030C618979916169414930C9B300CF01FED :10DCA00000108F0C1895C160307831690C9A8F582C :10DCB000089B8F49F01F000B48B66CB88B086CBCF2 :10DCC000580CC0A52FFC8DBC301C6A088708E3CD1A :10DCD00080F8E3CD80F8F01F0005CF6B8001D8DC21 :10DCE000800091DC000087F480018450EBCD40F887 :10DCF000308618979916169414930C9B300CF01FCD :10DD000000108F0C1895C160307831490C9A8F58EB :10DD1000089B8F49F01F000B48B66CB88B086CBC91 :10DD2000580CC0A52FFC8DBC301C6A088708E3CDB9 :10DD300080F8E3CD80F8F01F0005CF6B8001D8DCC0 :10DD4000800091DC000087F480018450EBCD40F826 :10DD500033C618979916169414930C9B300CF01F29 :10DD600000108F0C1895C160307831390C9A8F589B :10DD7000089B8F49F01F000B48B66CB88B086CBC31 :10DD8000580CC0A52FFC8DBC301C6A088708E3CD59 :10DD900080F8E3CD80F8F01F0005CF6B8001D8DC60 :10DDA000800091DC000087F480018450EBCD40F8C6 :10DDB000318618979916169414930C9B300CF01F0B :10DDC00000108F0C1895C160307831190C9A8F585B :10DDD000089B8F49F01F000B48B66CB88B086CBCD1 :10DDE000580CC0A52FFC8DBC301C6A088708E3CDF9 :10DDF00080F8E3CD80F8F01F0005CF6B8001D8DC00 :10DE0000800091DC000087F480018450EBCD40F865 :10DE1000330618979916169414930C9B300CF01F28 :10DE200000108F0C1895C160307831090C9A8F580A :10DE3000089B8F49F01F000B48B66CB88B086CBC70 :10DE4000580CC0A52FFC8DBC301C6A088708E3CD98 :10DE500080F8E3CD80F8F01F0005CF6B8001D8DC9F :10DE6000800091DC000087F480018450D421189751 :10DE7000169530CB991B300CF01F00128F0C1896A2 :10DE8000FAC4FFEC580CC190302830098F588F49E4 :10DE900048D76EB899086EBC580CC1052FFC8FBCD2 :10DEA0005805EDF81000EBF81A00089BECCCFFFCCD :10DEB000308AF01F0006DA2AD822F01F0005CF0BA7 :10DEC0008001D8DC000087F4800091DC8001845060 :10DED000EBCD40E018961695310B991B300CF01FD6 :10DEE00000108D0C1897C1503078317A0A998D58EE :10DEF0008D4A48CBF8CAFFFCF01F000B48B56AB842 :10DF00008F086ABC580CC0752FFC8BBCE3CF90E027 :10DF1000E3CD80E0F01F0006CF9B00008001D8DC3D :10DF20008001D3EC8001D158000087F48001845037 :10DF3000EBCD408078076E285808C0B0300C189A96 :10DF40005C586E0B3109300CF01F0009E3CF908054 :10DF5000310CF01F00086E189908EF390016991956 :10DF60006E3899286E4999396E28CEAB800184604D :10DF700080009200EBCD40FC189716931495314B1E :10DF80001294991B300CF01F001C8F0C1896FAC2CB :10DF9000FFE4580CC200302830198F588F495805BB :10DFA000C1C18D455C7549576EB88D086EBC580C63 :10DFB000C1F52FFC8FBC5804EDF81000E9F81A00E9 :10DFC000049B308AECCCFFFCF01F000D301C8D351B :10DFD000E3CD80FCE3CF80FC5C750A9CF01F000958 :10DFE0008D4CCF90069B0A9AF01F0005CDDBF01FE9 :10DFF0000006CE1B8001D8DC000087F4800091DC95 :10E000008000920080018450EBCD40801897F93C4D :10E01000000BF01F00084888F0F900F85809C0709C :10E02000EECBFFFC310A313CF01F0004E3CF9080BF :10E0300080015FB0000087F480014658D42130C8C9 :10E040001896109B4904300CE8F500F88D18F01F65 :10E05000000F8D0C1897C120301830D98D582FCC57 :10E06000EACBFFE28D49F01F000A68B88F0868BC50 :10E07000580CC0552FFC89BCDA2AD822F01F0005A5 :10E08000CFBB0000000087F48001D8DC8001844011 :10E0900080018450D42130CB1897991B300CF01F8D :10E0A000000B8F0C1894C1004898301530868F559E :10E0B0008F462FCCF0FB00F82E2BF01F00060A9C99 :10E0C000E966000AD822D8228001D8DC000087F453 :10E0D00080018440EBCD40E030CB1896991B300C8A :10E0E000F01F00108D0C1897C1703018305948E59A :10E0F0008D588D492FCCEAFB00F82E2BF01F000B1A :10E100003028AE586AB98F096ABC580CC0752FFC0C :10E110008BBCE3CF90E0E3CD80E0F01F0005CF9B08 :10E120008001D8DC000087F48001844080018450A5 :10E13000EBCD40FC30C518969915169414931292A5 :10E140000A9B300CF01F00138D0C1897C1D03018AB :10E150008D458D580A9A300BF01F000FEECCFFFC56 :10E16000089BF01F000E078848D6EF68000A058953 :10E17000EF69000B6CB88F086CBC580CC0752FFC95 :10E180008DBCE3CF90FCE3CD80FCF01F0006CF9B5D :10E190008001D8DC800091D080018440000087F4A9 :10E1A00080018450EBCD40FC30C51896991516942B :10E1B000149312920A9B300CF01F00128D0C1897CA :10E1C000C1B0301830B98D588D490A9A300BF01F04 :10E1D000000E306AAEC4AED3049BEE0A000CF01FF2 :10E1E000000B48B66CB88F086CBC580CC0752FFC7F :10E1F0008DBCE3CF90FCE3CD80FCF01F0006CF9BED :10E200008001D8DC800091D0800091DC000087F490 :10E2100080018450D431203D502B5018FACEFFD0CD :10E2200033857C3499157C181896149312917C00D0 :10E2300050087C220A9B300CF01F00228D0C18978E :10E24000C370301830A98D580A9A8D49300BF01FD1 :10E25000001E069A029BEECCFFFCF01F001CEF5341 :10E2600000244028049BEF680026EF600027306AF6 :10E27000EECCFFD8F01F00155804C1C0089B308AAF :10E28000EECCFFD2F01F00114008EF6800364018B6 :10E2900048F6EF6800376CB88F086CBC580CC05556 :10E2A0002FFC8DBC2FDDDA3AF01F000ACFBB2FDD2B :10E2B000D832089B308AEECCFFD2F01F0003CE5B31 :10E2C0008001D8DC800091D0800091DC000087F4D0 :10E2D00080018450D4012FCC7808202D500819C912 :10E2E000BAC919D8BAD8F01F00052FED580CF9B8E3 :10E2F000010DF9F81A06DA0A80015860D40148D8ED :10E30000F8CBFFF5F0F900F8733C7808204D502861 :10E3100019C9FB69000C19D8306AFB68000D1A9CFA :10E32000F01F0005F01F00052FCD580C5F1CD80210 :10E33000000087F48002E73680018898EBCD40FE2C :10E340003007FAC5FFE0189116924A134A1466087E :10E350000E38E08A00216A08204D50280BC9FB695D :10E36000000C0BD8EE061504FB68000DE806000A49 :10E3700015D8BAD87409500915C8BAC8F01F0016C4 :10E380002FCD580CC0A12FF75907CE2118970E9CFE :10E39000E3CD80FEEE061504E80600060A9B0C9C01 :10E3A000F01F000EF3D2C001EE081501AC692FF882 :10E3B000E808093166090E39FE99FFEBEEC9FFFF47 :10E3C00048380E9C9109E3CD80FE000000008C5C73 :10E3D00000008B5C8001889880018440EBCD4080F8 :10E3E000300819C9F0091800C10048E8F0F700F832 :10E3F0005807C130F01F000C0E9CF01F000C0E9C43 :10E40000F01F000BE3CF8080486830A9F0FA00F8D5 :10E41000301C9569E3CD80800E9CE3CD80800000A8 :10E42000000087F480015D188001593880015CDCB0 :10E43000EBCD40E01896F01F00224A2A0DE9F4F7D0 :10E4400000F85809C1103018F0091800C32030280E :10E45000F0091800C31030488F687498300CABC8AE :10E460009598E3CD80E06F3930D8322A8F68496CB7 :10E47000727B2F4BF01F00156F3C3FF8787BF7390C :10E4800000C8F0091800C130202DF71600D47845D7 :10E49000306AEECBFFE21A9CF01F000C0C9B0A9C2A :10E4A000F01F000B301C2FEDE3CD80E0E3CF90E0B8 :10E4B00030088F68CD3B30588F68CD0B8001F00459 :10E4C000000087F400008C608002E7368001E33CA6 :10E4D000EBCD40E01896F01F00284A8A0DE9F4F7CA :10E4E00000F85809C1503018F0091800C3603028EE :10E4F000F0091800C3906F0830492FF88F69EF4872 :10E5000000407498300CABC89598E3CD80E06F392B :10E5100030D8322A8F6849AC727B2F4BF01F00191C :10E520006F3C3FF8787BF73900C8F0091800C1301C :10E53000202DF71600D47845306AEECBFFE21A9C06 :10E54000F01F00100C9B0A9CF01F000F301C2FEDD9 :10E55000E3CD80E0E3CF90E06F0830092FF88F69BA :10E56000EF480040CCFB6F0830592FF88F69EF4817 :10E570000040CC8B8001F004000087F400008C6028 :10E580008002E7368001E33CD421310B1896991BB9 :10E59000300CF01F00198D0C1897C28030183049CC :10E5A0008D588D494955302CEAF400F8F01F0014BD :10E5B000E8CBFFE21896EECCFFF8F01F00126C38A3 :10E5C000AE38EAF901045819C0D03008AE2830B886 :10E5D00089686AB98F096ABC580CC0952FFC8BBC3E :10E5E000DA2AEAF8011C5818CF20D82AF01F0006B2 :10E5F000CF7B00008001D8DC000087F48001EF6C45 :10E600008001844080018450EBCD40F81897169427 :10E6100030CCF01F0046303CF01F00441895302CE1 :10E62000F01F0042E06A00EC1896E06B00FF0E9CC1 :10E63000F01F003FE8CBFFE2EECCFFF6F01F003DFD :10E640006C384BD9AE289208AE483DD86939727BF8 :10E65000F73A009AF00A1800C480F73900803DD8D4 :10E66000F0091800C52030050A93F01F00349838CF :10E67000AE381896F93900A83FF8F0091800C09094 :10E68000F8C9FF58EECAFF584ADB0E9CF01F002D58 :10E69000ED3900CC3FF8F0091800C1900E9CECC990 :10E6A000FF34EECAFF344A6BF01F0027089CF01FAE :10E6B0000027583CE089000C4A587099ABC99199E1 :10E6C0003FFA301CEF6A009EE3CD80F85805CF502A :10E6D000EECCFF62069BF01F001F49D9301C7298D8 :10E6E000ABA89398E3CD80F8F73900A03008F00983 :10E6F0001800CB41EAF900B85819CB01F72800A25D :10E700001295F003161FCB2BF73900863018F0094D :10E710001800CAA1EAFC00B8581CCA61F728008892 :10E720001895F003161FCA2B8001EF6C800091D062 :10E73000800184400000025E8001EFF88001D3EC8C :10E740008001D1E88001D21C8001808E000087F416 :10E75000800184F0D421E06800EC1897109B4924D4 :10E76000300CE8F500F88F18F01F00108F0C189689 :10E77000C090301830798F588F490A9BF01F000CD9 :10E78000C021D82A0C9CF01F000B30C88B6868B9D8 :10E790008D0968BC580CC0452FFC89BCDA2AF01FD3 :10E7A0000006CFCB000087F48001D8DC8001E608AA :10E7B0008001F03080018450D421E06800EC18978B :10E7C000109B4924300CE8F500F88F18F01F00105A :10E7D0008F0C1896C090301830698F588F490A9B5B :10E7E000F01F000CC021D82A0C9CF01F000B30C871 :10E7F0008B6868B98D0968BC580CC0452FFC89BC72 :10E80000DA2AF01F0006CFCB000087F48001D8DCA5 :10E810008001E6088001F03080018450EBCD40405B :10E82000201D18961A9CF01F001849888C69F0FB6F :10E8300000F85809C1203018F0091900C0B030287C :10E84000F0091900C170770830492FF89769F74827 :10E8500000402FFDE3CF80407738301911EA301C9B :10E86000F20A1800F9B8000CF7F80A062FFDE3CDFC :10E870008040770830592FF89769F74800402FFDFE :10E88000E3CF8040800177A4000087F4D401496879 :10E8900019C9F0FA00F85809C1803028F0091800A9 :10E8A000C1803048F0091800C0503018F009180035 :10E8B000C180750830492FF89569F548004019CB9B :10E8C000302CF01F000AD80A3088301C9568D80216 :10E8D000750830592FF89569F548004019CBCF1BC2 :10E8E000301BCEFB000087F480018390D431215D82 :10E8F000303C169614911290F01F00584D83F8C4C6 :10E90000FFB0189531CA089B069CF01F0056C0A1A5 :10E910006D3830AA707BE6CCFFE42D2BF01F005140 :10E92000C7B06D38FAC7FFC8707B0E9CF6CAFFC827 :10E930002D2BF01F004D089B0E9CF01F004CC0417A :10E94000300C2EBDD83231CA0E9BFA0A0002049C4C :10E95000F01F0047049CF01F004730080E9A500833 :10E960001A97089B1A9CF01F00446D38707930E8A4 :10E97000F33A005EF00A1800C670EB3A0074580AC9 :10E98000CE006D387079EB380075F33B005EF60809 :10E990001800C0F0EACCFF8A3009C0581938F608D0 :10E9A0001800C0502FF9123AFE99FFFA123ACC9093 :10E9B000049CF01F0032CC50049B1A9CF01F0030C6 :10E9C0001A9B029CF01F002F049B009CF01F002D3F :10E9D000089B31CA4A2CF01F00266D3830AA707B84 :10E9E000E6CCFFE42D2BF01F00226D38312A707B1E :10E9F000E6CCFFDA2C8BF01F001E029B304AE6CCDF :10EA0000FFC8F01F001B009BE6CCFFC4304AF01F7C :10EA10000018301CC97B6D38312A707BE6CCFFDAD8 :10EA20002C8BF01F0010FE91FF7E304AE6CBFFC812 :10EA3000029CF01F000FE6CBFFC4009C304AF01F81 :10EA4000000C301CC7FB049CF01F000FFE90FF7AE7 :10EA50001A9CF01F000EC92B8001EF6C000079E8B2 :10EA60008000917C80018124800182BC800091DC47 :10EA700080018658800181E8800182608001817E6A :10EA8000800180CC80018360800185F4EBCD40FC67 :10EA9000FACD0110300733095407FEF3022EE6F8D1 :10EAA00000F854281896129B0E9C8D19F01F0088B0 :10EAB0008D0C1895E080008A3018303C8D588D4CB4 :10EAC000F01F0084FACBFEFC1894FACAFEF8FACCC8 :10EAD000FEF2F01F0081442871390E9CE06B00ECBF :10EAE0007277F01F007BC710540CE0680420B83820 :10EAF000442B7738707992D9EDB90000C6B0EDB9E2 :10EB00000001C06144099238A1B8B238442BE8F83A :10EB100000B85808C0C07738707A94D9EDB90009A8 :10EB2000C06144099238A9B8B238442BFAC2FEF148 :10EB3000441A049CF01F006944185818E08000A58E :10EB4000C6823079FB38010FF2081800C050440922 :10EB50009238A5A8B238440CF01F0061049CF01F45 :10EB600000614428E74C0100EACAFFF071390A9CB1 :10EB70004DDBF01F005E6858AA286869AA394D3C31 :10EB800069B85808C440442B773870793078F33A24 :10EB90000074F00A1800C240EAC9FFF4EACAFFF89C :10EBA000300CF01F0053581CC53030063018E748B1 :10EBB000004444095809C0A0FACCFF00F01F004DE2 :10EBC0000C9C2BCDE3CD80FC30060C9C2BCDE3CDF3 :10EBD00080FC44099238A1A8B238442BC99BF8F8AC :10EBE00001AC5808C050F8CCFE54F01F004230CBA6 :10EBF000300CF01F0037E74C01AC189AC080442855 :10EC0000713B76794B8B28C9F01F003B442BCC5BC2 :10EC10005828CA51442C1A9B2E2CF01F00381A96E3 :10EC20001AD61ADC442BFB380116FB390117EF3AD0 :10EC300000CF169CF6CBFF34F01F003144283289F8 :10EC4000F15900D8442CF01F00262FEDC88BE8F8AE :10EC500000B85808C2916AB93FF8F368009A3028A2 :10EC60003039E7480044442891694426F01F0025C4 :10EC7000ED4C004466B88B0866BC580CC2352FFCBE :10EC800087BC3016C94B440BEF3A00AF169CFB38DB :10EC9000010EFB39010FF6CBFF58F01F001B440C8F :10ECA000F01F000FC5CB44287139727A94D8EDB8A3 :10ECB0000001CD21189B6ABCF8CCFF66F01F001341 :10ECC000CCFBF01F0013CDDB000087F48001D8DC03 :10ECD0008001EF6C80017C4480017EE08001F03097 :10ECE00080017BD88001D3EC8001AD408001E8EC4D :10ECF0008001D3A88001D1588001887080018C2CBC :10ED0000800145C480018B74800184F080018450AF :10ED1000D431203D189616971493303CF01F0070A4 :10ED2000301831798D588D4930086C068F0858039A :10ED3000EDF81805E7F81A0018950DC40898A7D83B :10ED4000C0505898C0302FDDD83A0DD93018F0098E :10ED50001800C1003008F0041800F9B80500EFF8F9 :10ED60005A00F9BC0501F9BC0401EFFC4A002FDD93 :10ED7000D832303CF01F005A6C98F93A0074F13BDD :10ED8000005E580ACE80F9380075F6081800C0A059 :10ED900028AC30092FF91439CDE41938F00B1800DC :10EDA000CFA1ECC0FFF8009CF01F004E1891CD30B1 :10EDB0006BB85808C090793870793078F33A00749D :10EDC000F00A1800C6E0FACCFFF8F01F0047581C04 :10EDD000C0A0F01F0046029B835C350A31DCF01FA7 :10EDE0000044CB9B40285818CF51FACCFFFCF01FB1 :10EDF0000041581CCEF1401820785818FE9BFFEBBC :10EE00004BD8F0F900F85809CE501A9CF01F003B7F :10EE1000581CCE01400820285818FE9BFFDC6C9E31 :10EE20002F4EFCE80000212DFAE90024FCE8000840 :10EE3000FAE9002CFCE20010FAE30034FCE80018C8 :10EE4000FAE9003CFD3C0020FB6C0044FD38002149 :10EE5000322AFB6800454AAB1A9CF01F002AF01FBB :10EE6000002A2EED580CCB606C9A3FF8F53900C89B :10EE7000F0091800CAF06008F51B00D4202D6C6C56 :10EE8000500801C9BAC901D8BAD8F01F0020A56C32 :10EE900049FB310A180B315CF01F00152FEDC9AB8F :10EEA0004955EAF801AC5808C050EACCFE54F01FAE :10EEB000001930CB300CF01F0018EB4C01AC189A45 :10EEC00048D5580CFE90FF816338494B707928C9AA :10EED000F01F00136A98ABB88B98C76B8001EF6C7A :10EEE00080015D44800177A4800145C480014658BB :10EEF00080015F44000087F480015F2800008C607F :10EF00008002E736800189108001E33C00008B5CC1 :10EF10008001D3A88001D8DC8001D3EC8001D158D6 :10EF2000EBCD40E0206D300818991495502850081A :10EF30001A9C1A965D191897C10140085808C040DC :10EF40001A9CF01F0009402C580CC030F01F00071D :10EF50000E9C2FADE3CD80E01A9C5D15581C5F0719 :10EF6000CEDB00008001D3A8800091E858DCE08867 :10EF700000035EFD49B8F00C032F49B8F0CCFFF454 :10EF80005EFC4998F0CCFFE45EFC4978F0CCFFD4FD :10EF90005EFC4958F0CCFFCC5EFC4938F0CCFFC495 :10EFA0005EFC4918F0CCFF305EFC48F8F0CCFF1C4A :10EFB0005EFC48D8F0CCFEF45EFC48B8F0CCFEBC59 :10EFC0005EFC4898F0CCFE945EFC487C5EFC486891 :10EFD000F0CCFFFC5EFC4848F0CCFE785EFC000004 :10EFE0008003C01400000260483930089318930869 :10EFF0005EFC000000008C844828700C5EFC000061 :10F0000000008C84EBCD40C0487618976C1C580CDF :10F01000C030F01F00060E9CF01F00058D1CE3CDD4 :10F0200080C0000000008C8480018AD480018AECBA :10F03000EBCD40C0487618976C0C580CC030F01FD0 :10F0400000060E9CF01F00058D0CE3CD80C0000073 :10F0500000008C8480018ABC80018B30D4211894FC :10F060001696149530CCF01F00121897C1D03018A6 :10F0700099069915F0060946EC0C1502F01F000CD4 :10F080008F2CC0F05806E08A000B3009129A6E28C7 :10F09000F009092A2FF91236FE99FFFB8907DA2AAF :10F0A0000E9CF01F00043FDCD8220000800092007C :10F0B000800091E8D4311893169214901291580C54 :10F0C000C36078093018760CF0090945580CC390D4 :10F0D000189468160A36C1A468075807C0606E48BD :10F0E0000238C1B03FCCD832662CF8060327580747 :10F0F000CF71ECC8FFFFF808002CC0582FF8190793 :10F100005807CEE110960A38CFA5089CF01F0013CF :10F1100030083FEC8508D832029A009C6E3BF01F05 :10F120000010301C89166E088908D832760C580CED :10F13000C040F01F000ADA3A66093018F0090945A4 :10F14000308CF01F00081894C060850C30089918A6 :10F150009908CC0BD8320000800091E8800091DC47 :10F1600080009200D431109412907818409618952F :10F17000169214910C9B780A089C5D181893318C98 :10F18000F01F00131897C1F00C9CF01F00118F3C6A :10F19000C170089B0C9AF01F000F30088F468F1229 :10F1A0008F218F508F086A29F203002C78085808A5 :10F1B000C0C0109970085808CFD19307DA3A0E9C56 :10F1C000F01F00053FDCD8329907DA3A8000920040 :10F1D000800091DC800091E8D431203D501C500B20 :10F1E000149112921090580AC4307418009B740A3B :10F1F000129C5D18A36C502C6228F00C0307580772 :10F20000C3706E450A990035C3610E940E93C09881 :10F210006E075807C2D008936E490A39C2C10E94CE :10F220006E3B0A9A049CF01F00181896CF214019D3 :10F230006E18930840086E2991098F1C8F2C6E3C24 :10F24000F01F00128F468F3640296228F009000C0B :10F2500078090E39EFF80000F9F80A00EFF810000D :10F26000E7F81A000E9CF01F00092FDDDA3A3FEC98 :10F270002FDDD8326E385808CFB00039CF903FCC50 :10F280002FDDD8328000917C800091E8163C5E0C26 :10F290007808971C990B97085808F1FB1A015EFC37 :10F2A00078195809F9F81000F3F81A007808580886 :10F2B000F1F91A013008990899185EFCD40149380F :10F2C000FACEFFFC709CE21C0002C1D0209DFD3AEA :10F2D0000021FB6A0021FCE80000FAE90000FCEADA :10F2E0000008FAEB0008FCE80010FAE90010FCEA5C :10F2F0000018FAEB0018FD380020FB680020F01F12 :10F3000000042F7DD8020000000087F480015AA479 :10F31000D4014898709CE21C0002C0C0300930CC77 :10F32000EA1C4000303B129AF01F0004F01F00045A :10F33000301CD802000087F4800186C88001875401 :10F34000D4014898709CE21C0002C0C0300930DC37 :10F35000EA1C4000303B129AF01F0004F01F00042A :10F36000301CD802000087F4800186C880018754D1 :10F37000D4014898709CE21C0002C0C03009310CD6 :10F38000EA1C4000303B129AF01F0004F01F0004FA :10F39000301CD802000087F4800186C880018754A1 :10F3A000EBCD4080495818977098E2180002C04190 :10F3B000109CE3CD8080F01F00126F38302911EAD5 :10F3C000F20A1800C0D03009303B129A307CEA1C97 :10F3D0004000F01F000CF01F000CE3CF90806E681F :10F3E0005898CF213009303B129A30BCEA1C4000BB :10F3F000F01F0004CF1B0000000087F4800158407C :10F40000800186C88001875458DBE08A0012F939F0 :10F41000000C3078F0091800E08B000C595BE08A92 :10F420000008F939000E3AA8F0091800C0D05EFDB6 :10F430003888F0091800CFC1F939000D38E8F00913 :10F4400018005F0C5EFCF938000FF2081800CF01BD :10F45000F93900103038F0091800CEA1F93900113F :10F460003008F0091800CE41F93A0012F20A1800EB :10F47000CDF1F9380013F4081800CDA1F9390014C2 :10F480003888F0091800CD41F939001538E8F0093D :10F4900018005F0C5EFCD7033019482891095EFC08 :10F4A00000007A38EBCD40C0208D48D730088E0957 :10F4B000F0091900C101E06AFFFF300B1A9CF01F30 :10F4C00000091A9B302AFACCFFE8F01F00079A18AF :10F4D0001A96AE088E0C2F8DE3CD80C000007A2ADC :10F4E0008001C7B88001A498D401F01F00054858D6 :10F4F000F139010B120C5C8CD80200008001F4A4DD :10F50000000087F4EBCD4060208D306AFAC5FFE63D :10F51000300B0A9CF01F00091A9CE06AFFFF300BB9 :10F52000F01F00070A9C1A9B302AF01F00061A964B :10F530009A1C2F8DE3CD8060800091D08001C7B8E8 :10F540008001A444D43120DDFEF60234FACEFFA8B7 :10F55000189516916C9C1494129310907C177C0251 :10F56000E21C0002C0312F3DD832FEF802167009AD :10F570005809C041FE7CFBB4CF7BECF8012458183D :10F58000C041FE7CFC17CF0BECC9FFE85019129C60 :10F59000F01F007D581CE08000E30D890D98F009F4 :10F5A0001800E08200E6302CF01F0078E08000D2E6 :10F5B0006CB850282FF88DB85807FBF91002EFF9F6 :10F5C0001A00F01F0073C0E0029B0A9CF01F00713C :10F5D000E08000C96C98EDB80006C0414E88402913 :10F5E00091D9F01F006D6008EFDCB010F3D7C010A8 :10F5F00050091039E08B006C0D882FF8AC880D99FC :10F60000F0091800C061300A320C149BF01F00632F :10F61000E8C800020E08FB58002EED38010B30043C :10F62000FB680032400A300BFB640030FB640031A1 :10F63000FB640033069CF01F005A069BFAC7FFF4D8 :10F64000400A0E9CF01F0057300A0E9BFACCFFD2E6 :10F65000F01F0055ED38010BF9D2C003BA78F01F46 :10F660000053300CFB520028FB5C002AE041003EB6 :10F67000E0880008EB39000C3888F0091800C2D087 :10F680004028300A50980E9BFACCFFDCF01F00484F :10F690004009ECCCFFE88109F01F0046F01F00464E :10F6A0003008ED4C00CCED5800D04C49F30A014233 :10F6B000F00A1900C0604B297298EDB8000EC031F5 :10F6C000301CC52BF01F003E301CC4EBECCCFFE817 :10F6D000F01F00383FFCC48BEB39000D38E8F0090F :10F6E0001800CCF1EB39000E3018F0091800CC915D :10F6F000EB39000F3038F0091800CC313028EB3BE3 :10F700000012F00B18005F1A3FE8F00B18005F19A9 :10F71000126AE80A1800CB51EB380013E218001DFA :10F720005818CAF1EB380014E21800C85888CA917A :10F73000189A31F9EA090708F4081800CA212FF9C4 :10F74000E049003FCF81E0680400FB58002AC99BD4 :10F75000401CF01F0018FE7CFAECC06BFE7CFC160F :10F76000C03BECCCFFE8F01F00133FECCFDA401CAD :10F77000F01F0010FE7CFB4FCF7A0000000087F4E2 :10F7800000007A38800145DC80019F3080015F04F1 :10F790008001F4088001F4E880014658800091D08F :10F7A0008001C7B88001A4448001859C8001A49891 :10F7B000800145EC800145C4000002608001FBFC33 :10F7C000D401302CF01F0003300948389109D802C9 :10F7D0008001A12800007A38D431FACD01385009CF :10F7E000FACEFEA416971896FEFB031C14947C1305 :10F7F0007C00F6F801245818C460FEFA030A749CD1 :10F80000E21C0002C05118970E9C2B2DD832E068E4 :10F8100000F8FAC5FEFCF5D7C0100C9B0A9C548872 :10F82000549654A730025472F01F00B8FAC1FEE497 :10F830000A9B029CF01F00B644C95879E08B00284F :10F840003018F0090948E2180085C2104488FAC946 :10F85000FFF45012502854D944D80A9B5478029C83 :10F86000F01F00ACC1C1302744D95809CCE0FAC818 :10F87000FFF41039CCA0FACCFECCF01F00A70E9CF0 :10F880002B2DD83230270E9C2B2DD832448B300CA8 :10F89000F01F00A2E08000B354DCCDFB44C9E04976 :10F8A000003FE088000B300744B8EDB80007E08067 :10F8B000009EF01F009BCD9BFEF80268F009032F0D :10F8C000ECCAFFFC1588EC08000889080DD81589DA :10F8D000400BEE0901093067F208010A970A44B8A3 :10F8E000CE5B44B8F0C90001E0490097E088008988 :10F8F000447CF01F008D44C8189A300944BC303B4A :10F90000BFBCF9E8108CF01F0089F01F0085301B88 :10F91000300CF01F008744B83027CC8B44B8E04847 :10F920000082C090E08900A9E0480080C040E04823 :10F930000081CEE10E9B0C9CF01F007ECE9B44B854 :10F94000E0480082E08000C4E08900915978E080BE :10F9500000C4E0480081CCD1029CF01F0077CD8B21 :10F9600044B85808C7E144D65803EDF81000E7F84A :10F970001A008C28A008FB1A0106445814088908AC :10F98000FB190104F20A0105400A30EB95056807EE :10F990000E9CF01F006AE08000AE4DB9F2F801D075 :10F9A0005808E080009E0A9B0E9C5D18E08000993C :10F9B00030270DE84D4BF768007B44B8C77B44B84F :10F9C0005818CB90E0480080CA31CB5B447B44BCE4 :10F9D000F01F005B44BCF8C800805818FE9BFF99DC :10F9E000029B5C5CF01F0057C93B30084C69300B30 :10F9F000B2A8169CF01F0054C5DB3FD7C06B4D3832 :10FA0000F009032F029CF01F0052C82B029CF01F2C :10FA10000051C7EB029CF01F0050C7AB029CF01FC7 :10FA2000004FC76B029CF01F004EC72B029CF01FBB :10FA3000004DC6EBF01F004C4B3AF54C00D4C68B82 :10FA4000029CF01F004AC64B029CF01F0049C60BE7 :10FA5000029CF01F0048C5CB447CF01F0047C58BBB :10FA6000E0480081C1403027C21BF0C8008F5828F1 :10FA7000FE9BFF40C4DBE0480084FE90FF5DFE95E6 :10FA8000FF5BE0480085FE91FF44C55B49E91388B0 :10FA900020185C58B28844D7C29049BB7698E218C7 :10FAA0000040C20076D96E081039E088002944B8B9 :10FAB000A7D854B85803F9B70003EFF81000E7F8D7 :10FAC0001A00F9B70103FBF8104BCF0A447B32EC64 :10FAD000F01F002AC1DB029CF01F0029C19B3047A8 :10FAE000C69B0FD8F768007ACE3B302CF01F00255C :10FAF000CD5BF01F0025CF403FE7C5CBF01F0023B3 :10FB0000CD7B0000000087F48001C7B88001BF10E2 :10FB10008001BF448001D3A88001D8DC80018754D4 :10FB20008003C04C8001870C800186C880016A88F0 :10FB3000800237E8800208948001F4088001708C0C :10FB40008001725480018CE48003C14C8002084023 :10FB50008002085880020864800208708002087CD5 :10FB600080020888800145C48002084C8002083465 :10FB7000800209B48001DA3480016D6C8002094092 :10FB80008001A12880015F048001F310EBCD406863 :10FB90003006493C1AD61AD649250C9899064929A7 :10FBA000492A302B0A9CF01F001249231AD60C98C0 :10FBB0001AD60699490A303BEACCFFFCF01F000C2C :10FBC0000C981AD606991AD6EACCFFF848BA305BD8 :10FBD000F01F0007301C2FADE3CD806800007A389D :10FBE00000007A2C8001F4988003C3AC80016EB8C9 :10FBF0008001F7C08003C3C48003C3E05EFCD70369 :10FC0000EBCD40E0203D1897580CC1F07938707A60 :10FC100094D9EDB90001C1D04C166C785828C15068 :10FC20000E9CF01F0040C110ED3900943FF8F00920 :10FC30001800C1405017FACAFFFC1A9BFACCFFF615 :10FC4000F01F0039581CC180301C2FDDE3CD80E04F :10FC50004B366C785818CE51CF8B202D306A1A9CB9 :10FC60004AFBF6CBFF4AF01F0031F01F00312FEDA9 :10FC7000580CCEB1CE0BFAC5FFF5400A401B0A9CCA :10FC8000F01F002C581CCE113079FB38000BF20805 :10FC90001800C35140187139727A94D8EDB8000435 :10FCA000CD404A5AF4F801045818C3206DE85808AA :10FCB000C1D1ED3B008049AA580BC2806F387079E2 :10FCC000F5380081F33C005EF8081800C1F0F4CA72 :10FCD000FF7E3009C0581538F8081800C0402FF9C9 :10FCE0001639CFA516395F0CCB1B48D973F85808C5 :10FCF000CE10F4F801AC5808CDD1CA7B0A9CF01F95 :10FD0000000FF01F000FCA10CCDB3009CECB3059EA :10FD1000FB38000BF2081800C981CC9B0000026080 :10FD2000800189D080017C448002E736800188B060 :10FD300080017EE0000087F480017BD880017C1088 :10FD4000EBCD40E048D818961695F0F700F058072C :10FD5000C0E00E9CF01F000AC0715806C0A00E9CA7 :10FD60000A9B5D16C0606E075807CF41E3CF80E065 :10FD70000E9CE3CD80E00000000087F48001FC00D1 :10FD8000D401F01F0002D80280021500EBCD40F82C :10FD9000204DE0683100EA18312EE069312EEA1971 :10FDA000322E306CFAE90000F01F00631894E080F6 :10FDB00000B9303CF01F00611896301CF01F005F46 :10FDC000306A202D189B18951A9CF01F005DF01FBB :10FDD000005D2FED580CE080008732B80A9C1AD8DD :10FDE000308930084D8A306BF01F00582FFD1A9370 :10FDF000ECFC00D8F01F0056ECFC00DCF01F0055B6 :10FE0000ECFC00E4F01F0054ECFC00E8F01F005391 :10FE1000ECFC00ECF01F0052ECFC00F0F01F005175 :10FE2000ED3C00B7F01F00506DC85808F9B801014B :10FE3000EDF81A1BED3C006FF01F004CECFC012CA0 :10FE4000F01F004BF01F004BF01F004BF01F004B4A :10FE5000F01F004BECF800F85808C6616D084C978D :10FE6000EF4800D8ECFC0130F01F0047300830A903 :10FE700032B54C6A1AD5E06B0080EECCFED8F01F8C :10FE80000033EEC6FE58304A300B0C9CF01F004089 :10FE900030081AD530594BFA0C9C304BF01F002B10 :10FEA0004BD82FEDF10A01423009F20A1900C26065 :10FEB0006E99EDB9000EC201A7B930688F9950381C :10FEC0001A9CFAC8FFF8FAC9FFF4089A308BF01FA1 :10FED00000331897581CC140089CF01F00312FCDEB :10FEE000E3CF80F8189A0A991A933068308B1A9CDD :10FEF000F01F002CC7EBF01F002C6E99CDEB089C77 :10FF0000F01F00273009303B129A311CEA1C4000D8 :10FF1000F01F0026F01F00260E9C2FCDE3CD80F8A9 :10FF20002FCDE3CD80F8300A301B149CF01F002148 :10FF3000C96B0000800092008001EF6C8002E73600 :10FF4000800188B08003B804800176C480020594E3 :10FF500080020538800204DC8002048080020424D0 :10FF6000800203C8800202F880020374800202D477 :10FF70008002078C800168AC8002017080020EFC58 :10FF8000000087F48002031C8003C400800091D02D :10FF90008003C40C00000260800174C8800091E8F6 :10FFA0008001776C8001FBFC800186C8800187544A :10FFB00080020B34EBCD406830094AF63068ACA9BA :10FFC000AC893129314AAC988D99300530130A9BA0 :10FFD000ED4500ECED4500E88DA58DC5ED550040E3 :10FFE000ED550042ED55004EED4500D88DB3ECCCFB :10FFF000FEF0F01F0022ED450124F01F0021ED5519 :02000004800278 :1000000000D0ED4C00CCED5500D249ECF01F001EA5 :10001000F01F001EED4501B8F01F001DF01F001D70 :10002000F01F001D0A9BECCCFF48F01F001C0A9B30 :10003000ECCCFF44F01F0019069BECCCFF40F01FF6 :100040000017069BECCCFF3CF01F0014ED4300446E :10005000F01F0013F01F001330DCF01F0013F93CF9 :10006000000FF01F0012F01F0006ED4C01CC069CA3 :10007000E3CD8068000087F4800091D0800145C402 :10008000000084CC80017B24800237D080016CDCAE :100090008001FB8C8001EFE8800144F8800187C873 :1000A000800205EC8001EF6C800202B8EBCD40606D :1000B000E06A01F8300B49D518960A9CF01F001C25 :1000C000F01F001C0C9CF01F001CEACCFFF4F01F7A :1000D000001BEACCFFE0F01F0019EACCFFF0F01F94 :1000E0000017EACCFFECF01F0016EACCFFE8F01F87 :1000F0000014EACCFFE4F01F0012300930DC1AD9FA :100100001298129A129BF01F000FF01F000FF01FA1 :10011000000FF01F000FF01F000FF01F000F301C2A :100120002FFDE3CD80600000000087F4800091D0B7 :1001300080016F4880021124800145D6800145F27C :100140008002067C80014690800149B88001804091 :1001500080015F98800201584848300A4849911848 :10016000910A930A5EFC000000007A3C00007A4489 :10017000D421219D4A846808F3D8C001FB6900633B :10018000E2180002C14030183005FB6800634A3CA9 :10019000F01F00233018189BFAC9FF9D300A49FC54 :1001A000F01F0020581CC2802E7DD8225809C1C0E3 :1001B000109549D870065806CEB0EA050019FA091C :1001C00000170C9B0E9C306A2FA72FF5F01F00170D :1001D0006C265806CDD05905CF516808F1D8C0011A :1001E000F0051700CD5B306AE06B00FF1A9C3015FC :1001F000F01F000FCDFB48FCF01F0009EA050018B6 :10020000189BA1781A99300A48ACF01F00062E7D81 :10021000D822000000007A448003C414800091B802 :100220008001776C00007A3C800091DC800091D0E6 :100230008003C41CD40148697208104C930CEDBCB7 :100240000002C021DA0AF01F0003D80200007A443D :1002500080020170EBCD408048C76E095809C1305B :10026000722A580AF3F80003EFF80A01F3F81003B2 :10027000F5F81A037238129C910AF01F00056E09F6 :100280005809CEF1E3CF908000007A3C800091E8DD :10029000D401F01F0007581CC020D802485972082A :1002A000EDB80002CFB0F01F0004D8028002025463 :1002B00000007A4480020170F8C900013058F0094A :1002C0001800E08B00054838B09C5EFF3FCC5EFC18 :1002D000000087F4D401201DFAC9FFFC12DC1A9932 :1002E0003048300A307B483CF01F00032FFDD80215 :1002F0008003C43C8001776CD401201D3018BA8C77 :100300001A99300A306B484CF01F0004581C5F0CDF :100310002FFDD8028003C45C8001776CEBCD406870 :10032000201D48F61893FAC5FFFC2F060AFC0C9C0A :10033000F01F000C303CF01F000CF94301300C9C06 :10034000F01F000A0A993018300A307B488CF01FE1 :100350000009581C5F0C2FFDE3CD8068000087F476 :10036000800145FC8001EF6C800145FE8003C46C78 :100370008001776CEBCD4040201D48E6BA8C2F06FB :100380000C9CF01F000D303CF01F000C1B88F9483E :10039000006C0C9CF01F000A30181A99300A309B30 :1003A000488CF01F0009581C5F0C2FFDE3CD8040E6 :1003B000000087F4800145FC8001EF6C800145FE60 :1003C0008003C4748001776CEBCD4068201D1898C1 :1003D0005CB81895FAC3FFFC48D606D82F060C9CCB :1003E000F01F000C303CF01F000CF94500F00C9C95 :1003F000F01F000A1A993048300A309B488CF01FD1 :100400000009581C5F0C2FFDE3CD8068000087F4C5 :10041000800145FC8001EF6C800145FE8003C480B3 :100420008001776CEBCD4068201D18985CB818955A :10043000FAC3FFFC48D606D82F060C9CF01F000C10 :10044000303CF01F000CF94500EC0C9CF01F000A3A :100450001A993048300A309B488CF01F0009581C0C :100460005F0C2FFDE3CD8068000087F4800145FC20 :100470008001EF6C800145FE8003C48C8001776CA5 :10048000EBCD4068201D18985CB81895FAC3FFFCA6 :1004900048D606D82F060C9CF01F000C303CF01FED :1004A000000CF94500E80C9CF01F000A1A9930482E :1004B000300A309B488CF01F0009581C5F0C2FFD40 :1004C000E3CD8068000087F4800145FC8001EF6C7B :1004D000800145FE8003C4988001776CEBCD4068B5 :1004E000201D18985CB81895FAC3FFFC48D606D8AA :1004F0002F060C9CF01F000C303CF01F000CF9453F :1005000000E40C9CF01F000A1A993048300A309B16 :10051000488CF01F0009581C5F0C2FFDE3CD80684C :10052000000087F4800145FC8001EF6C800145FEEE :100530008003C4A48001776CEBCD4068201D18981F :100540005CB81895FAC3FFFC48D606D82F060C9C59 :10055000F01F000C303CF01F000CF94500DC0C9C37 :10056000F01F000A1A993048300A309B488CF01F5F :100570000009581C5F0C2FFDE3CD8068000087F454 :10058000800145FC8001EF6C800145FE8003C4B012 :100590008001776CEBCD4060201D48F5BABC2F057B :1005A0000A9CF01F000E303CF01F000DFAC6FFFC45 :1005B0000D78F94800D80A9CF01F000A0C993018F1 :1005C000300A306B488CF01F0009581C5F0C2FFD5F :1005D000E3CD8060000087F4800145FC8001EF6C72 :1005E000800145FE8003C4BC8001776CEBCD40C028 :1005F000206D49EC3008F939010DF93B010850082C :1006000050281AD9F93A010C1ADAFAC7FFF8F93961 :10061000010AF93A01090E9CF01F00152FED580C44 :10062000C10140085808C0401A9CF01F0012402C1D :10063000580CC040F01F0010300C2FADE3CD80C02F :100640001A9CF01F000E400818965808C0401A9CCB :10065000F01F0008402C580CC030F01F000758163F :100660005F0C2FADE3CD80C0000087F48001DAE499 :100670008001D3A8800091E880018E9CD4214C0792 :10068000405EEF6C0108EF6B0109EF6E010D1495F0 :100690001294109A3019F2081800C120EEF801B037 :1006A0005808C3D05828C4C04B5CEF3B01B5338811 :1006B000F00B1800C5403398F00B1800C440EF6AE7 :1006C000010CF01F0030EDDCB010F01F002F0C0CFF :1006D0005C5C5805C1E11895F01F002A1815EF65FC :1006E000010AF01F0029EDDCB010F01F00260C0CF1 :1006F0005C5C5804C3F11894F01F00221814EF64D6 :10070000010B6E98EDB80001C031F01F0020DA2A0D :10071000EA0C1800FE98FFE23FCCD822EF3901B571 :100720003348F0091800CC11EF3901B63418F0093C :100730001800FE98FFC630E8EF68010CCC3BEF696B :10074000010CCC0BEF3901B63408F0091800FE9803 :10075000FFB8301948A8F169010CCB4BF93901B643 :100760003408F0091800FE98FFA835A8F968010CB4 :10077000CA9BE80C1800FE9BFFD1CBFB000087F45E :100780008001F4A48001F504800205ECEBCD40E08B :10079000303CF01F002330CB18954A26300CF01F58 :1007A0000022ED4C01AC1897C360303BF01F001FD6 :1007B0008F2CECF901AC72275807C2903078300BBF :1007C000B2883068ECFA01ACB498ECF901ACB2AB89 :1007D000ECF801ACB0BBECF901ACB2CBECF801AC7D :1007E000EB390075702AB489ECF801ACEB39007470 :1007F000702AB499ECF801ACEAFB00847029B2AB22 :10080000ECFC01ACF01F000AE3CF90E0ECCCFE540E :10081000F01F00080E9CE3CD80E000008001EF6C2B :10082000000087F48001D8DC8001D3EC800208D47A :100830008001D3A8D401F01F0002DA0A8001DA5641 :10084000D401F01F0002DA0A8001DF30D401F01F6A :100850000002DA0A8001DBE8D401F01F0002DA0AA4 :100860008001DC04D401F01F0002DA0A8001DC20E0 :10087000D401F01F0002DA0A8001DC3CD401F01F31 :100880000002DA0A8001DC58D401F01F0002DA0A03 :100890008001DC74D401201D1A9BF01F000CC09055 :1008A00040085808C06048AA7499EDB90000C030EB :1008B0002FFDDA0A1298A1C831CC9598300A149B02 :1008C000F01F00042FFDDA0A8001D98C000087F4A4 :1008D00080014658EBCD40C0206D4958189B709C54 :1008E000E21C0002C06118970E9C2FADE3CD80C0C2 :1008F00030081A96502850081A9CF01F000EC1119B :10090000189740085808C0401A9CF01F000B402C54 :10091000580CCEB0F01F00090E9C2FADE3CD80C067 :100920001A9C3017F01F0006CEDB0000000087F491 :100930008001DED08001D3A8800091E880018E9CE8 :10094000EBCD4080201D300A1A9BF01F0017C0F02D :1009500040085808C0F149576E99EDB9000BC071B5 :10096000EEF801A84917F1D8C001C1212FFDE3CF4E :10097000908048E76E99EDB90000CF01A1C9300A17 :100980008F9931CC149BF01F000A6E99CE7BEEFC40 :1009900001ACF01F00086E98301CABD88F982FFD6B :1009A000E3CD80808001ED10000087F4800146587F :1009B000800208D4D401F01F0002DA0A8001DBD0E3 :1009C000EBCD40FC206D4A5318951097169266980F :1009D0001496109C1294E21C0002C2D05BF5C30175 :1009E000303CF01F001F300BF3D7C010F5D4C010FF :1009F0001AD90C981ADAF3D2C010504B502BFAC601 :100A0000FFF8F93B00F70A9A0C9CF01F00162FED37 :100A1000580CC1B1189740085808C0401A9CF01FE4 :100A20000012402C580CC030F01F00100E9C2FAD4F :100A3000E3CD80FC18970E9C2FADE3CD80FCEDB884 :100A40000000CCF13FB7CF3B6698A1A81A9C8798CD :100A50003017F01F0007CE0B000087F48001EF6C09 :100A60008001DB588001D3A8800091E880018E9C32 :100A7000D40130085C7B1099109AF01F0002D80254 :100A8000800209C0D4013008364B1099109A109C8E :100A9000F01F0002D8020000800209C0EBCD40E048 :100AA00020AD3006507CFB6B00201497500650267A :100AB0001A95FACAFFDCFACBFFE81A9CF01F00195E :100AC000C111189640085808C0401A9CF01F001623 :100AD000402C580CC030F01F00150C9C2F6DE3CD3E :100AE00080E05807C09040980E9B0C9C8F28F01F08 :100AF0000010581CC0611A9C3016F01F000ECE3B2F :100B000040085808C0401A9CF01F0007402C580CA1 :100B1000C0313FD6CE3BF01F00053FD6CDFB0000D5 :100B20008001DC8C8001D3A8800091E880016C40BA :100B300080018E9CD401F01F0002D80280020A9C22 :100B4000EBCD40E0209D3018189A1697F00C09481C :100B50004A5B7609F1E9000CC06118970E9C2F7D65 :100B6000E3CD80E0F00811FF12683006507A970854 :100B7000500650261A95FACAFFE0FACBFFE81A9CF5 :100B8000F01F001AC1E05807C09040880E9B0C9CD3 :100B90008F28F01F0017581CC1611A9C3017F01FD6 :100BA000001540085808C0401A9CF01F0013402C44 :100BB000580CCD50F01F00110E9C2F7DE3CD80E02E :100BC0001897CF0B40085808C0401A9CF01F000A25 :100BD000402C580CC0313FD7CC2BF01F00083FD71A :100BE000CBEB000000007A4C8001DCEC80016C4013 :100BF00080018E9C8001D3A8800091E8EBCD40F865 :100C0000216DFAC6FF901897FB69000EFB68000F74 :100C1000FB6B0010FB6A00116CF46D036D15ECCCDE :100C2000FFD4F01F0038306ABA6CECCBFFDCFACC92 :100C3000FFEDF01F00350D88FB6800190D99ECCB16 :100C4000FFFEFB69001A320AFACCFFE5F01F002E06 :100C50004AEE30097C0B301CF809094AF5EB000814 :100C6000C0902FF95899CF9130060C9C2EADE3CD52 :100C700080F8F7EA10089D085BF9CF705024FB63F9 :100C8000001250195807EFF91A003006FAC7FFC4CE :100C900050F65116FACAFFAC1A9B0E9CF01F001CAE :100CA000C111189640F85808C0400E9CF01F00195A :100CB000411C580CCDB0F01F00180C9C2EADE3CD9C :100CC00080F85805C09041580A9B0C9C8B28F01F57 :100CD0000013581CC0610E9C3016F01F0011CE3B53 :100CE00040F85808C0400E9CF01F000A411C580CE8 :100CF000C0313FD6CBBBF01F00083FD6CB7B0000F6 :100D000080018058800091DC00007A4C8001DD4C2D :100D10008001D3A8800091E880016C4080018E9C06 :100D2000D42120DD4B0510946A0E4126F1DEC0016E :100D3000C0B0EDBE0001C411EDBE0002C411300709 :100D40000E9C2F3DD82210973018FB6B002A508A3A :100D50005077FDE8100850998B08FB540028580C78 :100D6000F9F71A001A953007FACAFFD05007502732 :100D7000FACBFFE81A9CF01F001DC101189740082C :100D80005808C0401A9CF01F001A402C580CCD90F7 :100D9000F01F00180E9C2F3DD8225806C09040C866 :100DA0000C9B0E9C8D28F01F0014581CC0C11A9C6F :100DB0003017F01F0012CE4B30173028CC7B302775 :100DC0003048CC4B40085808C0401A9CF01F00081F :100DD000402C580CC0313FD7CB4BF01F00063FD7FB :100DE000CB0B000000007A488001DDAC8001D3A865 :100DF000800091E880016C4080018E9CEBCD40E04A :100E0000207D300616975006189B50261A95FACA70 :100E1000FFE81A9CF01F001AC111189640085808E4 :100E2000C0401A9CF01F0017402C580CC030F01F17 :100E300000160C9C2F9DE3CD80E05807C1904068C0 :100E40000E9B0C9C8F28F01F0011581CC1104008ED :100E50005808C0401A9CF01F000B402C580CC0D002 :100E6000F01F000930060C9C2F9DE3CD80E01A9CFA :100E70003016F01F0007CD3B1896CDCB8001DE0C5D :100E80008001D3A8800091E880016C4080018E9C95 :100E9000D40120CDFB5A0012FB590014FACAFFCC32 :100EA000502874197408FB590016501874397428A6 :100EB000FB59001AFB580018745974485039FB58F4 :100EC000001C74797468FB590020FB58001E74994B :100ED000748850A95098300974A8FB6C0022FB5B01 :100EE0000010FB68002C74BBFB6900231A9CF01FE8 :100EF00000032F4DD802000080020DFCEBCD40EE28 :100F000020CD3FF94CC850A950B94CC93005303CF0 :100F100091059305F01F004A322A18961A971A9CD9 :100F20000A9BF01F0048FAC3FFDE306AE06B00FF47 :100F3000069CF01F00441AD5ED38004F1AD86D28D2 :100F40001AD86D191AD9ED1800361AD8ED190032D1 :100F50001AD96CE81AD8ED19002E1AD9ED18002A02 :100F60001AD8ED1900261AD9ED1800221AD86C6982 :100F700030BB1AD9301C6D08ED1900FEED3A001F88 :100F8000F01F0031ECFB01282F4DF6C80001581866 :100F9000E0880045ED3100F7ECCAFF8C30153006D3 :100FA0001AD61AD540D81AD8F4E80000206D069B4E :100FB000FAE900081A9CF4E20008306AFAE300102B :100FC000F01F0022EF380021209DFB680021EEE891 :100FD0000000FAE90000EEE20008FAE30008EEE89B :100FE0000010FAE90010EEE20018FAE30018EF38FA :100FF0000020029BFB6800200A990C98FACCFF9015 :10100000303AF01F00130C9A2EED0C9B40ACF01FF1 :1010100000110A9C2F4DE3CD80EE1AD50A98FACC28 :10102000FFD05C5B0A99FE7AFF6AF01F000B2FFD70 :10103000CB2B000000007A4C00007A488001EF6C56 :10104000800091D080020E908002E73680020BFC77 :1010500080020A9C80020D20D431202D500B189163 :101060004A1776026E9CE21C0002C350304C5011AD :101070005801E2021700F01F001DEEF700F0189073 :101080005807C2D030043013C0A82FF45802C1B1A1 :101090005801F9B301FF5805C1100A9760B66E05F3 :1010A000F01F00130C9A189B0E9CF01F0012CEE04C :1010B0000E9CF01F00115805CF114008069C9104AA :1010C0002FEDD83240182012110C0E9B5018F01F33 :1010D000000BCE2B1893069C2FEDD8320E943013B4 :1010E000CEDB0000000087F48001EF6C800145C476 :1010F000800159A080015CDC800184284828F0FC34 :1011000000F85EFC000087F4486871195879F9B856 :101110000001F9F80A00F9B80100F9F81A005EFFB9 :10112000000087F44828F14C007C5EFC000087F446 :101130004828F14C01D05EFF000087F4EBCD40C0A1 :1011400018971496E04A0020E088000830083FF91C :10115000B898B889E3CF80C02FECF01F00043008A6 :10116000AE96AE88E3CF90C0800091DCEBCD40FC22 :10117000206D18941695F01F00431897C1A0F939F7 :1011800000CC3FF8F0091800C3910896EF3900A889 :101190003FF8F0091800C5414BB8F0F700F85807C0 :1011A000C0A1EC040104301C8B042FADE3CD80FC06 :1011B0000896CF3BE06AFFFF300B1A9CF01F00330C :1011C0006F38302A707C1A9B2F4CF01F00311A9216 :1011D0006A0A9A93063AC0442FADE3CFC0FC0C9B39 :1011E0001A9C5C7AF01F00296F380606707C1A9BE7 :1011F0002F4C300AF01F0026CD5BE06AFFFF300B5A :101200001A9CF01F0022302AEEC2FF341A9B049C65 :10121000F01F00201A966A0A9A93063ACDE55C7A86 :10122000089B1A9CF01F00191A9B049C300AF01F9F :1012300000196A08E803000606188B08CA8BE06AE2 :10124000FFFF300B1A9CF01F0011302AEEC7FF5829 :101250001A9B0E9CF01F00101A926A0A9A93063A83 :10126000CBC50C9B5C7A1A9CF01F00081A9B0E9C45 :10127000300AF01F00096A08060606188B08C8DB4A :101280008001EFF8000087F48001C7B88001D344E3 :101290008001D6B08001D558D401F01F0002D802D9 :1012A00080015D18EBCD40F8FACD00803225149313 :1012B00018941297BA85FAC6FFFF0C9CF01F001B0A :1012C000300806063019AC85AC981A951A9A498BE5 :1012D000089CF01F0018C0503FFC2E0DE3CD80F895 :1012E0000E9CF01F0015E04C0040C1701AD7493A1F :1012F000E06B00800A9CF01F00120A9A3019491B0B :10130000089CF01F000C2FFD1897580CCE61089C0C :10131000F01F000D0E9CCE2B0E9A089C3019489B96 :10132000F01F0004CDB0CD9B800091DC8003C4FC95 :1013300080023BB8800091B8800399D0800091482A :101340008003C50480024328D421210D300B4B6655 :10135000169CF01F00368D0CC2B078075807C2A04B :101360006F985808C2704B283014EF4400641A95E7 :10137000340B1AD84AFA0A9CF01F002F08990A9ACF :101380004AEB0E9CF01F002E2FFD580CC2506C082B :10139000700CF01F002C6C09300893086C08700961 :1013A0004A98722A910A6C09300893486C0C2F0DE8 :1013B000D822F01F00261897CF70F01F00254A583A :1013C0004A59118A4A5B0E9CF01F0025C2056E29FE :1013D00049D89109CE9B08994A2A4A3B0E9CF01F96 :1013E0000018C1C14A18340B1AD8492A0A9CF01FA8 :1013F000001208990A9A49EB0E9CF01F00112FFD6C :10140000580CC0C13088EF480054CC9B0E9CF01F94 :10141000000D6C0930089308CC7B0E9CF01F00096E :10142000CB7B000000008C8C80023B4C8003C50805 :10143000800399D0800091488003C4FC80023BB8AF :1014400080024190000003FC80024F4080023B225A :10145000000004000000042800000404800212A41C :101460008003C5108003C5148003C5188003C538E8 :10147000D421169849871495189B109A49740E9C8C :10148000A888F01F00170A9B30064965EF66002008 :10149000341A0A9CF01F001449484959EB66004071 :1014A000700B720CF01F00131896C0C0F01F0012D2 :1014B0000A99098A0E9B0C9CF01F00106D185808A1 :1014C000C021D822ECCAFFDC0A9C3209341BF01F71 :1014D000000CD8220000040400000400800091DC0D :1014E00000000428800091AC000003FC00008C8CFC :1014F00080023B0680023B22800212A480023A68EE :10150000D421210D328A300B1A9CF01F00301A9C16 :1015100030073014504750544AD5F01F002E8B0C22 :101520001A96C4A0FAC6FFD8318A0E9B0C9CF01FF5 :1015300000274A984A990C9B50E850A96A0CF01F62 :1015400000281896C3B04A7CF01F00274A761AD7A5 :10155000304B1AD70E984A694A6AEC0B000CF01F00 :1015600000260E981AD74A591AD74A5A302B0C9C83 :10157000F01F00210E981AD74A291AD74A2A311B80 :10158000ECCCFFF8F01F001C0E981AD749F91AD7B7 :1015900049FA312BECCCFFF4F01F00170E982F8D79 :1015A000ECCCFFF01AD749B91AD749BA315BF01F12 :1015B0000012089C2FED2F0DD8226A0CF01F001787 :1015C0000C9C8B06CF9B0000800091D000007A50CD :1015D00080022B4C8003C5448003C54C80022C0440 :1015E000800216FC8002113000007A5480021670CE :1015F0008003C55480016EB8800217408003C3ACDD :10160000800216C48003C5708002168C8003C58CCE :101610008002161C8003C5A480022AF8EBCD40C0CE :1016200021AD189798E8EDB80000C181368A300BDB :101630001A9CF01F000C306A0E9B1A9CF01F000AC7 :101640006E2830195C3850395028488870091A962D :101650001A9A720C306BF01F00062E6DE3CD80C01D :10166000800091D0800091DC00007A508002792CBB :10167000D40148587009300A720C301BF01F000367 :10168000D802000000007A508002792CEBCD404057 :1016900021AD368A300B1A9CF01F000830084889AB :1016A000500872081A961A9A700C302BF01F000519 :1016B0002E6DE3CD80400000800091D000007A5074 :1016C0008002792CEBCD404021AD368A300B1A9C3C :1016D000F01F000830184889500872081A961A9AA4 :1016E000700C302BF01F00052E6DE3CD8040000004 :1016F000800091D000007A508002792CD401487883 :10170000700EF6C9000E189AF8CBFFFA2F2A7C0C3F :10171000F01F0003DA0A000000007A50800224E083 :10172000D401580CC051304CF01F0004D802304C8A :10173000F01F0003D80200008001A12880019F3023 :10174000EBCD40E0FACD0170FACCFE98F01F001905 :10175000581CC22145A85818E088001FE068010005 :10176000FACBFE901A9C16D8F01F00131A95189603 :10177000FAC7FF00368A300B0E9CF01F0010581677 :10178000C11048F870090E9A720C300BF01F000D52 :101790002A4DE3CD80E0300CF01F000B2A4DE3CD45 :1017A00080E045B85808FE9AFFEE540D5418CEABB1 :1017B00080015F448002116C800091D000007A505B :1017C0008002792C80021720000000000000000039 :1017D000EBCD40C0F8F800D418971696F0F80088C2 :1017E000F8FA00E85808C040F8FC00C45D185876C4 :1017F000C1A058065F0858365F091248C11030185A :10180000EF4800ECEEF900D473985808C050300B44 :10181000EEFC00C45D18EF4600E8E3CD80C05846FA :10182000CEF0CFABEEF800EC5808CF603008301B9C :10183000EF4800ECEF4B00F0EEF800D47198580838 :10184000CE81CEABD401F01F0002D802800217D0A7 :10185000F8FC00E85EFCD401F8F800D471A8580840 :10186000C050F8FC00C45D18D802109CD802D40106 :10187000F8F800D471185808C050F8FC00C45D187E :10188000D802DC0AD401F8F800D471285808C050F6 :10189000F8FC00C45D18D802DC0AD703EBCD408009 :1018A0003008F8F90108F94801085809C031C08822 :1018B0000E997207129CF01F00045807CFA1E3CDC8 :1018C00080800000800091E8D401F8FC00DCF01F6B :1018D0000002D8028002B4A4D401F8FC0090F01FEA :1018E0000002D80280023B8CD401F8FC0090F01F6B :1018F0000002D80280023C84EBCD40C01696F8F777 :1019000001085807C051C0B86E075807C080EECC18 :10191000FFFC306A0C9BF01F0004CF710E9CE3CDDE :1019200080C000008000917CD4011699F8F801185D :101930005808C0A1F8F800D470285808C0C0F8FCB6 :1019400000C45D18D802F8CBFF64306A129CF01F07 :101950000003D80ADC0A0000800091DCEBCD40F8DF :1019600020AD1897F8F801185808C06030070E9C91 :101970002F6DE3CD80F8F8F800D470385808CF7098 :10198000F8FC00C41A9B1A935D181895CF05EEF861 :1019900001185808C431EEF800D470285808CE70E9 :1019A000FAC4FFE0EEFC00C4089B5D18CE05EEFC17 :1019B000009078465806C301EEF800D45808C2C01B :1019C000700C49BBF01F001BEFFC0024F9B60001AE :1019D000EFFC102478075807C111CCAB5806C0B0F3 :1019E0006E885808CC50EECBFFE8306A089CF01F98 :1019F0000012CBE06E075807CBB0EEF80194580800 :101A0000CFA16E581035CEB16E4B0A9A1A9CF01FBA :101A1000000ACE70CE4B3006CDEBFAC4FFE0306A40 :101A2000EECBFF64089CF01F0005CC2B8003C65C46 :101A3000800091A08000917C800091DCD401F01F97 :101A40000002D8028002195CD42120AD3008FB5876 :101A50000024508816961897F6F801845818C0404C :101A60003FFC2F6DD82277185808CFB0F8F500B892 :101A70005885C2205905CF512DCB0A9A1A9CF01FC8 :101A800000171A940A9A303BEEFE00D47C5858088E :101A9000CE801ADA1AD43009EF490104EEFC00C4F2 :101AA00030681AD8FACAFFD430181ADA48CA7C56F5 :101AB0005D162FCDCD7B2DCB318A1A9CF01F0007F0 :101AC0000A9AECCBFFCCFACCFFE8F01F00041A9482 :101AD000320A302BCDAB0000800091DC80039C38B3 :101AE000D42118951696F01F000F1897C05078381B :101AF0002FF89938D82A310CF01F000B1894C0F039 :101B00000C9B306A2FCCF01F000930188938EAF995 :101B100001088909EB4401080E9CD822DC2A000048 :101B2000800218F880028F24800091DCEBCD40FC0D :101B3000EDD9C010407218941693ECCCFFFC1495AC :101B4000910CF01F00161897C190E8F800907039BA :101B5000EC081608B893B889B8B6B8A85805C100FB :101B60000C9A0A9BF8C6FFFC0C9CF01F000D0E9C03 :101B70005802E5F61A00E3CD80FCE3CD80FC0C9A18 :101B80000A9BF8C6FFFC0C9CF01F00060E9C580236 :101B9000E5F61A00E3CD80FC80009200800091DC25 :101BA000800091D0D401401E5C791ADEF01F000243 :101BB0002FFDD80280021B2CEBCD40F8203DF8F819 :101BC00000BC1493129458485F0A58285F0918976C :101BD00016961449C0603FF70E9C2FDDE3CD80F8C8 :101BE000F8FC00DCF01F002BC0305816CF50EEC5BB :101BF000FF64306A4A8B0A9CF01F0028C0D1EEF8BF :101C000000D470285808C060EEFC00C41A9B5D1810 :101C1000C370EEC5FF043008F7D6C0081AD8F3D455 :101C2000C010FAC8FFF4069A0E9CF01F001D2FFD8D :101C30001896580CCD1040296E2C580CC1001298E3 :101C40000A9B0C99E06A888EF01F001618970C9C6E :101C5000F01F00150E9C2FDDE3CD80F8EEF800D4C8 :101C600071845804C0B01298EEFC00C40A9B0C9911 :101C7000E06A888E5D141897CEBB3FF7CE9B306A22 :101C8000485B1A9CF01F0005CC501A95CC5B0000F5 :101C900080028F78800217C88000917C80021B2C04 :101CA00080028154800091E8EBCD40C0189EEFDAAD :101CB000C010782C580CC0600E9AF01F0009E3CDBC :101CC00080C0FCFA00D475865806C0700E9AFCFCE1 :101CD00000C45D16E3CD80C0E3CFC0C08002815454 :101CE000D421497A1894301BF01F0016300A089B43 :101CF000495CE8C5FF64F01F0015E8F701085807C4 :101D0000C1C03006C0680E966E0C580CC1601897A2 :101D1000306A0A9BEECCFFFCF01F000DCF51580635 :101D2000EFF80000E9F80A42EFF81000EDF81A00A9 :101D30000E9CF01F0008D822D82200008003C66441 :101D400080023A1A80023058800274008000917C30 :101D5000800091E8D401F01F0002D80280021CE04C :101D6000EBCD408048FA1897301BF01F000FEEF8BB :101D700000BC5818C0F00E9B300A48CCF01F000C75 :101D80000E9CF01F000C0E9C307BF01F000BE3CD6F :101D900080800E9C305BF01F0008E3CD8080000047 :101DA0008003C68880023A1A8002360080027400DE :101DB00080021CE0800217D0EBCD4040486A1896A4 :101DC000301BF01F00060C9B300A485CF01F00051A :101DD000E3CD80408003C6A880023A1A8002360014 :101DE00080027400EBCD40F81894F8FC00CC580C3D :101DF000C360E8F800D05808E08A00321897E8C3BA :101E0000FF643005C0A8580AC200EEC7FF64E8F8B6 :101E100000D00A38E08A00242FF5E8F600B0306AD6 :101E2000069B0E9CF01F0015CF115806C0E06C5A9F :101E30006EA81438CE91EECCFFFA6C4BF01F000F59 :101E4000C0406C5A580ACE215807C0906F5AEECB4A :101E5000FFD4E8FC00DCF01F000AC0403FFCE3CDEB :101E600080F8EECBFFA8E8FC00DCEEFA0080F01F63 :101E70000005CF60CF4B00008000917C8002B58CC4 :101E80008002B52CD4211895E06C009CF01F001B3B :101E90001897C310EAF401185804C2A1EAF800D454 :101EA00070C85808C250189B301AEAFC00C45D186C :101EB0001898C1E50E9C3016E06B009CF0060D46AC :101EC000EC0B024BF01F000E58065F09580C5F1810 :101ED0001248E8081800F8071710EAFC00CCF01FB9 :101EE0000009089CEB4600D0EB4700CCD8220E9CA2 :101EF000F01F0004DC2A000080009200800091F4B2 :101F0000800091E8EBCD40801897F01F0008C031A9 :101F1000E3CD80800E9CF01F0006C0550E9CF01F84 :101F20000003CF7BE3CFC08080021DE480021E84CB :101F3000EBCD40FE208D18961697149512921091B5 :101F4000580BC580F6FB0080580BC0E16F5B580B47 :101F5000C3210C9CFEFA02E4303BF01F00B93FFCA9 :101F60002F8DE3CD80FE7568EDB80001CF011A9A80 :101F7000EECCFFA8F01F00B3CEA16B484029126839 :101F8000CE606B3840191268CE206B584039126809 :101F9000CDE0FEFA02B2301B0C9CF01F00A9EEC48B :101FA000FFD4302A303BECFC00DCF01F00A8089C7A :101FB0006F5AC4386B68EDB80000CCC1EEC4FFD4D2 :101FC0001A9A089CF01F009FCC516B484029126858 :101FD000CC106B3840191268CBD06B58403912685E :101FE000CB90FEFA026A301B0C9CF01F0095301A51 :101FF000CDAB7568E21800021A93F9B40102F9B486 :102000000001F8FC00DC1A9BF01F0092C1F05BECB1 :10201000C4001A9C320A300BF01F008F6B48502806 :102020006B3950196B585038089A303BECFC00DC87 :10203000F01F0086300C189A189BECFC00DCF01F97 :102040000087C3602F8DE3CFC0FE402A6B49F3EABF :102050000008C0D0401A6B39F3EA0008C110403ABA :102060006B59F3EA0008C1B04004CDFB1AD9302BFC :102070001ADA0C9C4FAAF01F00722FEDCCBB1AD9B4 :10208000302B1ADA0C9C4F7AF01F006D2FEDCC2B01 :102090004F5A302B0C9CF01F006ACBCB1AD9302B37 :1020A0001ADA0C9C4F1AF01F00662FEDCB3B580735 :1020B000EE0B1700F60A1700F9B80158EFD8E10B3C :1020C000EFFA1020ECFC00DCF01F0069CBC16B487C :1020D0004029F1E90009EDB90004C5D0EDB90003CC :1020E000C750EDB90002E081009430484E1AED4827 :1020F00000B8301B0C9CF01F00526B384019F1E9FE :102100000009EDB90004C500EDB90003C7513088DE :102110004D9AED4800B4301B0C9CF01F00496B58E1 :102120004039F1E90009EDB90000E080007FEDB928 :102130000001C55130284D1AED4800BC301B0C9CE5 :10214000F01F003FECFA00BC306BECFC00DCF01F31 :10215000003FECFA00B4304BECFC00DCF01F003B1D :10216000ECFA00B8305BECFC00DCF01F0038029A9F :10217000049BECFC00DCF01F00421894FE91FF640D :102180006B57E2170002C191ECFC00DCF01F003D30 :102190000E9CCE7A31084BCAED4800B8301B0C9C1F :1021A000F01F0027CABB31084B8AED4800B4301B32 :1021B0000C9CF01F0023CB4BECFC00DCEACBFFDCDB :1021C000320AF01F0033089CCCCA30884B1AED4805 :1021D00000B8301B0C9CF01F001AC90BEDB90004AD :1021E000FE91FF3231084ACAED4800BC301B0C9CFE :1021F000F01F0013CA8BEDB90000FE91FF25301BC4 :102200004A6AED4B00B40C9CF01F000DC89BEDB961 :102210000001FE91FF1930284A1AED4800B8301B22 :102220000C9CF01F0007C6AB301B49EAED4B00BC0D :102230000C9CF01F0003C87B8003C8EC80023A1A94 :102240008002BD688003C6C08002B4D48003C6E0AB :102250008002C04C800091D08002B58C8003C734CE :102260008003C7788003C7008003C7BC8002B52CF9 :102270008003C8288003C86C8003C8B08002B64CB5 :102280008002B9EC8003C8008003C8588002B91CE2 :102290008003C8148003C8CC8003C8808003C84072 :1022A0008003C894EBCD40C07758EDB80003F9B86F :1022B0000008F9F80A2FF9B80104F9F81A2F18974D :1022C000300A1696F8FC00DC149BF01F0025300A3B :1022D000EEFC00DC149BF01F0023300AEEFC00DC57 :1022E000149BF01F002130183009ECCBFECCEF48D6 :1022F00000B8EF4800B4EF4900C02FF976085858ED :10230000E08B00225808C2512FCB5849CF71EEFA0A :1023100000BC306BEEFC00DCF01F0014EEFA00B4E1 :10232000304BEEFC00DCF01F0011EEFA00B8305B21 :10233000EEFC00DCF01F000DEEFC00DCF01F000CDA :10234000E3CD80C03048EF4800B8EF4800B4CE0B72 :102350003028EF4800B8EF4800B4CDAB8002B58C10 :102360008002B52C8002B5EC8002B4D480028F804C :10237000EBCD40E0205D1897F8F600B0F8F800BC0F :102380005828C57059085F0958485F081248C2901C :10239000302BEEFC00E0F01F002F314A300B1A9C6E :1023A000F01F002D1A95EEFA00BC588AC200EEF814 :1023B00000905808C03070785028149958895F18D8 :1023C00058195F191069ECF8017CEEFC00E01A9ACC :1023D0000C9B50495038F01F00212FBDE3CD80E009 :1023E000300BEEFC00E0F01F001BCD8B30085018C6 :1023F000301B500BECF900F0F3EB0008FBFB1A016B :10240000EDB90001C120EEF800905808C1F0EEFCD3 :1024100000D4580CCD10780C491BF01F0012FBFCA7 :102420000A01EEFA00BCCC4B4018A1B85018CECB34 :10243000300BF8FC00E0F01F000C300BEEFC00E06D :10244000F01F000AEEF800BCC9EB3089CB8B00000E :1024500080026178800091D08002581C8003C65CA5 :10246000800091A0800261A48002618CEBCD40E0ED :10247000189716951496F8F800905808C0D0704830 :102480005808C0A1F8FC00D4580CC060780C48EB88 :10249000F01F000EC1501AD648DA1AD5301B0E9C18 :1024A000F01F000C300A0E9B48BCF01F000C0E9968 :1024B0000C9B0A9C3008488AF01F00092FEDE3CDE1 :1024C00080E000008003C65C800091A08003C960AA :1024D00080023A1A800230588002740080027474BC :1024E000D4211295169614941897F8F900BC5849FF :1024F000C1C0F8FA00F4580AC10158895F08581998 :102500005F0B104BF40B1800F9BB000AF9BB014636 :10251000F01F0019EEFA00F4F4C8FFFFEF4800F4D2 :10252000EEF900945809C020D822306A0C9BEECCFA :10253000FF04F01F0012EEF800BC5828C111EEF89D :1025400000D471585808C040EEFC00C45D180A99C8 :10255000089A0C9BEEFC00DCF01F0009D8220A99B7 :10256000089A0C9BEEFC00E0F01F0006FE99FFDECF :10257000CE7B00008002246C800091DC8002C3CC02 :10258000800261FCEBCD406C1ADA18951ADB1692CA :102590001493301B48AAF01F000B48B6300A0A9B60 :1025A0000C9CF01F000A0A990C9A069B049C3008A8 :1025B000F01F00072FEDE3CD806C00008003C99071 :1025C00080023A1A8002360080027400800274741D :1025D000D401F01F0002D80280022584EBCD40C058 :1025E000189E1497109CFCF800BC5888C240580BE9 :1025F000C1A0FCCAFF64FCF600D46C585808C19016 :102600001ADC16981AD9300BFCFC00C41ADBFD4BFF :102610000104490E0E991ADE301B6C565D162FCD43 :10262000E3CD80C0FCF600D448BA6C585808CE916F :10263000E3CFC0C0585CF9B80002F9B80104580BE8 :10264000C040FD4800B4CD6BFD4800B8482ACD4BD2 :1026500080037E2080039C38EBCD40F8FACEFFE863 :1026600018967C35F8F400D47C037C17685C7C2ECB :10267000580CC0F01AD51ADE300E1AD71AD3ED4E08 :102680000104ECFC00C468565D162FCDE3CD80F844 :10269000E3CFC0F8D42118951694F8F70104580731 :1026A000C020D822F8F900D472585808C4C01AD7EC :1026B000F94701041AD70E981AD74B6A1AD70E9BFE :1026C0007256F8FC00C40E995D16EAF900D42FCDBD :1026D00072585808C3801AD7EB4701041AD70E98CE :1026E0001AD74ACA1AD70E9B7256EAFC00C4301990 :1026F0005D16EAF900D42FCD72585808C2401AD797 :10270000EB4701041AD70E981AD74A2A1AD70E9BFC :102710007256EAFC00C430295D16EAF900D42FCDC8 :1027200072585808C1001AD7EB4701041AD70E98FF :102730001AD7498A1AD70E9B7256EAFC00C4303960 :102740005D162FCD5804C200EAFA00D47458580818 :10275000C12030091AD91AD9EB4901041AD91298A3 :102760001AD9129B7456EAFC00C4089A5D16EAFA5C :1027700000D42FCD75A85808C070089B3019300AB6 :10278000EAFC00C45D183018EB480104D8220000B0 :1027900080039C38D421204DF8F900D41897169561 :1027A00073885808C2C11094F8C6FFEAC1C8EEFC8D :1027B00000C45D1B1AD4189B0E984C19E06A888ED1 :1027C0000C9CF01F00408F2C2FFD580CC111580598 :1027D000C140189B305CF01F003CEEF900D47388B8 :1027E0005808C0D1737B580BCE31169CCE4BEECB24 :1027F000FFF0F01F0036C1302FCDDC2A7378580867 :10280000C0B0EEFC00C45D18C070189B306AEECCFE :10281000FFF0F01F002F6E2C580CCEA1EF39007A7C :102820003008F0091800C3A1EEF800D47048580829 :10283000C100301BEEFC00C45D18C0B4EEF800D43B :1028400071485808C0601A9BEEFC00C45D18C214A1 :10285000300B0E9CF01F001FEEF800D47099580941 :10286000C070300BEEFC00C45D19EEF800D470A807 :102870005808C050301BEEFC00C45D183018EF48FB :1028800000C84959300C72082FF893082FCDD82270 :102890004038F1D8C002CDD0CB0B300848891AD8C7 :1028A000E06A888E0E98EECBFFF0EECCFF86F01F2C :1028B00000058F3C2FFD580CCB81C9FB800224E022 :1028C0008002819C80028F1C800281E4800091DC68 :1028D0008002269400007A6CEBCD40E018971695A4 :1028E000300BF01F001DEEC6FF64306A49BB0C9C24 :1028F000F01F001BC2E0EEF801185808C1F00C9B55 :102900000E9CF01F00183006EEFC00DC0C9BEF461E :1029100000B0F01F00150C9A0C9BEEFC00E0F01FBD :1029200000130C9BEEFC00E0F01F00110C9BEEFC72 :1029300000E0F01F0010E3CD80E0EEF800D470D886 :102940005808CDE00A9A0C9BEEFC00C45D18CD8BB4 :102950001896CD6B800217D0800217C88000917C3A :10296000800226948002B9D48002581C800261E85B :10297000800261D4D401F01F0002D802800228D85E :10298000EBCD40C01897F8F800C45808C230303B6F :10299000F01F003DEEF800D470495809C070300BAC :1029A000EEFC00C45D19EEF800D470A95809C0709F :1029B000300BEEFC00C45D19EEF800D47098580896 :1029C000C050300BEEFC00C45D18300B0E9CF01FA5 :1029D000002F6E2C3006F01F002E8F266E3C580CF8 :1029E000C040F01F002B8F36EEF800E45808F9B80D :1029F0000100EFF81A39EEFC0090580CC060F01F8F :102A000000253008EF480090EEFC008CF01F0022FB :102A10003006EEFC00DC0C9BEF46008CF01F001F24 :102A2000EEFC00E0F01F001EEEFC00DCEF4600E0D4 :102A3000F01F001CEEFC00DCF01F001BEEFC00DCB5 :102A4000F01F001A0E9CEF4600DCF01F0019EEFC90 :102A500000CCF01F00110E9CEF4600D0EF4600CCDA :102A6000F01F00140E9CF01F0014EEFC00C4580C64 :102A7000C070EEF800D470785808C0205D18E3CD1F :102A800080C00000800228D88002269480028174D1 :102A9000800242B4800091E88002B4CC800256ECFF :102AA00080029438800294088002C0788002189CCA :102AB00080021DB880021CE0EBCD4080169778099B :102AC0001639C0F1761899080E9CF01F000A0E9C6A :102AD000F01F0009E3CF808072180E38C060109993 :102AE0005809CFB1E3CFC0806E189318CEEB000029 :102AF00080022980800091E8EBCD40801897580C27 :102B0000C051C1980E9CF01F000D6E0B580BCFB139 :102B1000F01F000BF01F000B6E4C580CC060F01F34 :102B2000000A6E4CF01F00096E8CF01F00080E9C0E :102B3000F01F0006E3CD808080022AB88002724C2C :102B40008002728480028F20800091E8EBCD40C02B :102B50001897580CC05130060C9CE3CD80C0F01F74 :102B60000021CFA1334CF01F00201896CF606E08D3 :102B70006E19991899296E286E89993899996E3C21 :102B8000580CC040F01F00198D4C6E7C580CC04092 :102B9000F01F00168D8C6E498D59495891096E5A57 :102BA0008D6A4948910A49486E698D7991090C9C52 :102BB000F01F0012C11130196C988DB95808EDF949 :102BC0001A0C6C285808CC906C185808CC606C4CC7 :102BD000F01F000BCC200C9C3006F01F000ACBDB52 :102BE0008002720880028F24800091940000046C9F :102BF00000007AA400007AA0800275F880028F1E7F :102C000080022AF8D431204D580C5F08580B5F0918 :102C1000189316971248C05030050A9C2FCDD83211 :102C2000E06C011CF01F00C01895CF803018F948E7 :102C3000010CFEF102F66E22620B580BC100580225 :102C4000E0800144E2C4FFFC3006760B049CF01FD8 :102C500000B8C0C02FF6090B580BCF810A9CF01F9B :102C600000B50A9CF01F00B4CD8BE2060328EB48A8 :102C700000D46E0C580CE0800122F01F00B0EB4C29 :102C8000008CF01F00AFEB4C0090CE906E185808EF :102C9000C0A0785CF01F00A86E1CEAF60090F01F40 :102CA00000A78D5C6E385808C0C0EAF8009070BC70 :102CB000F01F00A16E3CEAF60090F01F00A08DBC52 :102CC000EAF800905808CCB06E4C580CCC80F01F3D :102CD000009DE04C0063FE9BFFC3EAC1FFEA364A59 :102CE0006E4B029CF01F00986E5C580CE08100F95E :102CF0006620340CF01F008C1897CB10FEF8024CA5 :102D00008F78FEF8024AFEF9024A8F98FEF80248D0 :102D10008F058F458F658F898FC83006FEF4023C82 :102D20008F168FA4FEF202388FB2EAF900907288F3 :102D30008FD8EAF9009072988FE8EAF9009072A8AB :102D40008FF8F01F0088EB4C00E0E08000C20C9B85 :102D5000F01F00850C9BEAFC00E0F01F0084EAF8FD :102D600000D470685808E08000A7029B0A9C5D1898 :102D7000EB4C00C4FE90FF74EAF8009070BBEAF8D8 :102D800000D470895809C0605D19FE95FF69EAF8A2 :102D900000D471685808C0F0EAFC00C45D181897A8 :102DA000C0A0029BF01F0062C0600E9B364A029CCE :102DB000F01F006534CCF01F005CFE90FF514EC840 :102DC0004EC9991899294EC84EC9993899494EC883 :102DD0004EC9995899694EC84EC9997899894EC873 :102DE0004EC9999899A94EC84EC999B899D94EC853 :102DF0004EC999C899E94EC84EC9F9440040F942F4 :102E00000044990599F8F9490048F01F0069EB4C16 :102E100000DCFE90FF25EB39007A3008F00918003D :102E2000C5C1300A029BF01F0063EAF80090EAFC7B :102E300000DC707BF01F0060EAFB00E0EAFC00DCD5 :102E4000F01F005EEAFA009074C85808C60174D8F2 :102E50005808C52174EA580AC080302BEAFC00DC0F :102E6000F01F0057FE91FEFC009B0A9CF01F0055CE :102E7000FE95FEF6EACBFFF0EAFC00DCF01F005204 :102E80003FF8EB4800E4EAF900D473485808C0D092 :102E90001A9BEAFC00C45D18C0814038EDB80002FE :102EA000C0413018EB4801188B0366088B18870562 :102EB000FE9FFEB5EB4800C4CD2A6E3B6E1CF01F92 :102EC0000043EB4C0090CFDAF94B00D4CD3A0E9C86 :102ED000F01F0019FE9FFEC4EACAFF86CA4BF01F0E :102EE000001958FCFE9BFEBC6E5B310AEACCFF86E3 :102EF000F01F0015CFEA109A301BEAFC00DCF01F2F :102F00000030FE91FEADEAFA0090CA5B109A300BD9 :102F1000EAFC00DCF01F002AFE91FEA2EAFA009013 :102F2000C97B000080028F2400000470800091A003 :102F300080022980800091E88000919480021348EB :102F4000800091B8800091AC80021D60800225DC79 :102F500080021BB8800218C8800218E8800218D8C6 :102F60008002609C800261E8800261D48002184483 :102F700080021850800225D0800229748002304CD3 :102F8000800226588002360080021A3C80021928EE :102F900080021CA880021F0480021BA480021D5412 :102FA0008002186E80021884800218568002C0DCED :102FB0008002B4C08002B4B88002B4CC8002B4D421 :102FC000800227948002B90480023B4CEBCD40E0A4 :102FD000306A18971695F8C6FF64497B0C9CF01F61 :102FE0000017C270EEF801185808C1800C9B0E9CA7 :102FF000F01F00130E9CF01F00133006EEFC00DCE7 :103000000C9BEF4600B0F01F00100C9A0C9BEEFCDE :1030100000E0F01F000EE3CD80E0EEF800D470E891 :103020005808CE500A9A0C9BEEFC00C45D18CDFBEC :103030001896CDDB800217C88000917C8002269410 :10304000800276648002B9D48002581CD401F01F3B :103050000002D80280022FCCEBCD40C0499BF8C7BC :10306000FF641896306A0E9CF01F0017EDFB189C49 :10307000E06800A2EDD8E007EDFB08A20FD81AD84F :103080000FC91AD90FB81AD80FA91AD90F9848FA28 :103090001AD80C9C1ADB302BF01F000D0E9B0C9CD9 :1030A000F01F000CECFC00DCF01F000B303B0C9C14 :1030B000F01F000A30182FADED4800A8E3CD80C006 :1030C000800217C88000917C8003C9B880023A1A38 :1030D00080021AE08002BA1C80022FCCD431FACDD3 :1030E00000D03007F94700A8189516941491580B92 :1030F000E0800217F6F60084E8CCFFFA76ABF01F0A :10310000012A1AD61ADC09D81AD809C91AD909B855 :103110001AD809A91AD909981AD809890A9C1AD95A :10312000FEFA0488302BF01F01220E9B306A2F8D8F :10313000EACCFF64F01F011F306A089BEACCFF5EF7 :10314000F01F011D0A9CF01F011D300AEAFC00DC83 :10315000149BF01F011B635AEDBA0003C061E2F833 :1031600001745808E08100B1301063795809C0E05B :10317000E1D9C0011298EDB90001E08000A4EDB9D9 :103180000002F9B80004E1D8E030EAF800D4710890 :103190005808C060009BEAFC00C45D18635A5804DC :1031A000C07069585808C5A0F1DAC002C6E114978A :1031B000E2170013C5B1029B0A9CF01F0102FAC876 :1031C000FF9453375028089B0A9CF01F00FFEAF831 :1031D00000B45828E08001BAE089007F5818E080E8 :1031E000017130285038EAF800B85828C7F058283C :1031F000E08900805818E080016230285048EAF9E0 :1032000000BC58495F0B58895F08F7E81008C78071 :10321000E2C9FECCE2C8FF0C16963007EC1600019E :103220005019500812931092505766095809E081BE :1032300001122FF72FC32F025847CF81EAF900BCA4 :103240005889C671E2F800F04059F1D8C002F3E89D :103250001008E08101311096C5F8E8F800805808A0 :10326000CA70F1DAC002CA40C1083509FAC8FF3095 :1032700010D9029AFAC9FF94300B50290A9CF01F0A :1032800000D3CA202CCDD832E2F801485808E0819A :10329000010FEAF900B0089A300BEAFC00DCF01FDD :1032A00000CCE080017A3509FAC8FF3010D9029AC3 :1032B000FAC9FF94089B50290A9CF01F00C4C8401B :1032C000CE2BA1B0C5DBE2F801785808F9B00004B4 :1032D000F9B00105C4BB5848C8605908C831303935 :1032E0005039EAF800B85828C83130195049C88B0D :1032F0005848C8505908C82130395049C81B3008AF :103300005058E2C8FECC30165018E2C8FF0C5008E6 :103310005909E080011FEAF800D470A85808C0508D :103320000C9BEAFC00C45D18303B0A9CF01F00A90E :10333000354AFAC7FFE8300B0E9CF01F009E580478 :10334000E0800126E8F8008450645098E8C8FFFA4D :10335000507868A95089E2FA0184581AE080009EEA :103360004029403850A950C84049433850D950B836 :10337000EAF800BC5848E08000E7E0890088581867 :10338000E08000A43018510A4014400350E850F087 :10339000FACAFFAC0899069BFACCFF9C7208580841 :1033A000C040F54BFFF0720814A82FC92F0B183A34 :1033B000CF61E2F801445198EAF601185806E0801E :1033C0000089FEFA0212302B0A9CF01F0079301996 :1033D000EAF800BC5908E080008F5809E0800098A6 :1033E000305B300A0A9CF01F007D40585808C1C06D :1033F000EAF800D471485808C170FACBFF44EAFCDF :1034000000C45D18C1114328EDB80001C0D1189760 :103410004F30189268095809E08100A12FF72FC496 :103420002F035847CF81EAF800B05808C070103118 :10343000C050EAFC00E0F01F006BEAFC00DC029BDD :10344000EB4100B0F01F00680A9CF01F00682CCD13 :10345000D832EAFB00D4E2FA014476585808C13069 :103460001AD91AD23009EB4901041AD94DC90E3ABA :103470005F081AD94DEA76560E99301BEAFC00C453 :103480005D162FCD30165056CD5A5888C2005908B7 :10349000FE91FF7A3048C78BE2F901A45809FE9AE1 :1034A000FF6140985808FBF90A09C5BB6368F1D869 :1034B000C021CF0A50375047C2FB30085048CA0AD3 :1034C00030085038FE9FFE913008C5EB3038C5CB30 :1034D000EAF800D470F85808FE90FF750E9BEAFCDD :1034E00000C45D18FE95FF6F0C99EAF800BC5908FE :1034F000FE91FF75029B0A9CF01F003E0A9CF01F84 :10350000003E307B0A9CF01F0033C70BEAF80090A6 :1035100070495819F9BB000AF9BB013CC63B745B02 :10352000744CF01F00214B5A1ADC302B0A9CF01F00 :103530000020306A089BEACCFF5EF01F001E2FFDC2 :10354000FE9FFE023028C20B30195039FE9FFE4DFF :10355000029B0A9CF01F0027CDFAEAFB00D4E2FA96 :10356000014476585808FE90FF5B1AD91AD3EB42F3 :1035700001041AD20E3A5F081AD00E99765649CA3B :10358000301BEAFC00C45D162FCDC49B6248507806 :1035900062595089CE1A301BEAFC00E0F01F001877 :1035A000FE9FFE8380023A1C8003C9F880023A1A0B :1035B000800091D0800091DC80021DB88002B5ECC3 :1035C000800222A48002269480021F308002938011 :1035D000800217D08003CA6C8002246C80037E2096 :1035E000800257488002B9D48002237080039C383F :1035F00080021A4880021CE08003CA488002559667 :10360000EBCD40C021AD1897F8F800AC5808C68142 :10361000F8F6010CEEFB009076095809C061C8F875 :1036200072095809E080008CF2F801945808CF9193 :103630003008EF48010C76495809C670EEFC00D4FA :10364000580CC0E04DAB780CF01F005AEFF8002486 :10365000F1FC0A04EEFB009076485808C560EEF8CD :1036600000E85818E088008D760AEEF800C858186F :10367000C3F0580AC090103AC041C3981438C370C0 :10368000740A580ACFC15826C04076485828C690B8 :10369000580AEFFA1A32F9B80001EFF80A32EEF9D7 :1036A00001105809C04176485818C710EEF80118A3 :1036B0005808C4F1580AF40B1700F60A1700F5FB76 :1036C0001004F5FA1005EEF800D470B85808C410CC :1036D000EEFC00C45D18C3D12E6DE3CD80C0F8F6BA :1036E000010C5806C9812E6DE3CD80C0740A580ABA :1036F000CCB0F4F801945808CFA175885808CC4193 :1037000076485828CF41CC0B0E9CF01F002BCE5092 :10371000EEF800B05808EFFC0A2C0E9CF01F0027B2 :10372000300B1A9C368AF01F00261A961A9A0E9CA5 :10373000300BF01F00242E6DE3CD80C05806FE91A3 :10374000FF790E9C301BF01F00202E6DE3CD80C052 :103750000E9C300A30ABF01F001D2E6DE3CD80C0F3 :10376000580AC1D074085808EFFA1A32F9B80001A3 :10377000EFF80A320E9C300BF01F0015CAEB302B0D :103780000E9CF01F0011EEFB0090C6FBEF480110ED :10379000129A0E9C303BF01F000BC9FB30180E9C98 :1037A000EF4800C8149BF01F0009C97B8003C65C6A :1037B000800091A08002195C80022370800091D06B :1037C0008002792C800217D080022584800230DCB0 :1037D0004848300A48499118910A930A5EFF000050 :1037E00000007A7000007A78EBCD40681695189347 :1037F000F6CCFFEDF01F0022314A1896300BF01F77 :1038000000210A9A8D15ECCCFFF0069BF01F001EDC :1038100049EAF5090042AC09F50800422FF8F558CD :10382000004249B530088D286A198D3993062F86D4 :103830008B1649866C08F0C9FFFF8D095909E0888D :1038400000180A936A0C782A580AF9F80003E7F876 :103850000A01F9F81003F5F81A0320197838910ACB :103860008D09F01F000D6C095909FE9BFFED300A10 :10387000326C149BF01F0009E3CF90688000920027 :10388000800091D0800091DC000087F400007A7005 :1038900000007A78800091E880014658EBCD40E046 :1038A00030961697305E300B33A51989F2C8003078 :1038B000EC081800E08B0019F2CA0030580AC2C5A3 :1038C0001999F2C80030EC081800E08B0017F2C814 :1038D00000305808C215F1EA1048EE0B0B08585B8F :1038E000C291E3CF80E0F2C80061FC081800E08BD1 :1038F000000EF2CA0057CE3BF2C80061FC08180067 :10390000E08B000DF2C80057CE5BF2C80041FC0806 :103910001800E088000DE3CFC0E0F2C80041FC08C9 :103920001800FE9BFFFAF2C80037CD4BF2CA0037F1 :10393000CC6B19A8EA081800CEF12FFB586BCD20EC :103940002FDCCB4BEBCD40E016961497580AC4C041 :10395000300B3095305EC1B8F2CA0030580AC365EA :103960001999F2C80030EA081800E08B0021F2C86B :1039700000305808C2B5F1EA10485808C275EC0B7F :103980000B082FFB1637E08800302FEC1989F2C89E :103990000030EA081800FE98FFE1F2C80061FC0858 :1039A0001800E08B000EF2CA0057CD9BF2C80061F0 :1039B000FC081800E08B000DF2C80057CDBBF2C820 :1039C0000041FC081800E088000DE3CFC0E0F2C819 :1039D0000041FC081800FE9BFFFAF2C80037CCAB90 :1039E000F2CA0037CBCBE3CF80E0F6CA00015E6CB1 :1039F000F80A000913882FF85C58B2885E1CF6C8D4 :103A00000002100CC08819882FF85C58B888201C58 :103A100058085E1C201ACF875EFC5EFCEBCD40C0D0 :103A200049071696189BE0460020F9B60B200E9C1D :103A30000C9AF01F000D3008EE060B080F8858088E :103A4000C0D00E9C35E935FA2208F2081800F9FAC0 :103A5000BE002FFC19885808CF81482CE3CD80C0C8 :103A600000007A7C800091DCEBCD40FE189114922E :103A7000169C1293580BC2A0E20B00045809C20016 :103A800002973006C0881835E08A001418070C33F6 :103A9000E0880018E4060708E80701051AD80E9C1C :103AA00048CA0A9B2FF6F01F000C2FFD580CCEC4FD :103AB0003008EE01010CE968FFFFE3CD80FE0297BC :103AC0003008EE01010CE968FFFFE3CD80FE000045 :103AD0008003DA3080009148580CC140F8FC00D0D7 :103AE000580CC1002FCCF8F8FFFC5808C0417809E9 :103AF0005809C0901638C0302F8CCF6B7808143816 :103B0000CFC15EFF5EF9780C580C5E0C7828163831 :103B1000C0515EFC782816385E0C780C580CCFB17A :103B20005EFC30383189F94800F0F9480058F9480E :103B3000005431E8F949004CF94800503FF9E06879 :103B40000576F949017CF948019C5EFCEBCD40E02B :103B500018961695344CF01F000C1897C1103018A9 :103B60009978993899485806C0500C9CF01F000766 :103B70008F5C5805C0500A9CF01F00048FBC0E9C3F :103B8000E3CD80E080028F2480009194EBCD40C093 :103B9000169679075807C051C0C86E375807C090AD :103BA0006E0C0C9BF01F0004CF910E9CE3CD80C0E7 :103BB000E3CF80C0800091A0EBCD40FC1695189417 :103BC000580C5F0B58055F081493104B1292C040BD :103BD0003FFCE3CD80FC580ACFC048E73006C06800 :103BE0002FF62E07E0460038CF406E0B0A9CF01FE0 :103BF000000ACF710699049A089B0E9C6E185D18F6 :103C0000F9BC01FFF9BC0000E0460038CE31CE1B04 :103C10008003CC00800091A0EBCD40801897580C19 :103C2000C0A0780CF01F00056E1CF01F00040E9C55 :103C3000F01F0002E3CD8080800091E8D421189429 :103C4000169579075807C1A03006C0680E966E3CDD :103C5000580CC14018970A9B6E0CF01F0009CF71D9 :103C60005806EFF81003EDF81A03EFF80003E9F82F :103C70000A100E9CF01F0003D82ADC2A800091A0B5 :103C800080023C18EBCD406016961895760BF01F1D :103C900000056B088D38EB460040E3CD80600000E6 :103CA00080023C3CD431202D500B129CF01F003C74 :103CB0001890C730198A580AC670300118965011EA :103CC000320230930294C0382FF60D8AE40A1800AD :103CD0005F08E60A18005F091248E8081800CF518B :103CE000580AC2C00D87E40718005F18E6071800DD :103CF0005F191268E8081800C4505807C4300C95C2 :103D0000C0385807C0D02FF50B87E40718005F189C :103D1000E60718005F191268E8081800CF31AA8476 :103D20004A0B0C9CF01F0020C171A1A15807C06074 :103D3000EAC6FFFF0D8A580ACCA1009CF01F001BA9 :103D40005801C2404008F141005C40195809C25175 :103D5000129C2FEDD832496B0C9CF01F0013C03120 :103D6000A1B1CE5B0C9C493BF01F000FF9B80004D9 :103D7000E3D8E031FBF91001F7B901FFFBF91A01B3 :103D8000CD6B0C95CCDBF01F0009300840093FFCDF :103D9000F348005C2FEDD8322FEDDC3A800091948F :103DA0008003D304800091A0800091E88003D30CAD :103DB0008003D314EBCD40FE169CF01F00451891F4 :103DC000C6B0198A580AC7A0189630023203309438 :103DD000E80A18005F08E60A18005F091049300871 :103DE000F0091800C0E0109B2FF60D8AE60A1800B3 :103DF0005F08E80A18005F091248F6081800CF515A :103E0000580AC4500D87E80718005F18E607180025 :103E10005F1910693008F0091800C3705807C350C3 :103E2000109A0C95C0385807C0D02FF50B87E607BD :103E300018005F18E80718005F191268F4081800E6 :103E4000CF3130084A3BAA880C9CF01F0023C0F1F8 :103E5000A5A25807C060EAC6FFFF0D8A580ACB9199 :103E6000029CF01F001E049CE3CD80FE49CB0C9CFD :103E7000F01F0019C031A3B2CEDB49AB0C9CF01F80 :103E80000016C0E1A3A2CE6B0C95CDCB029CF01F17 :103E900000135802CE913FF2049CE3CD80FE492BE3 :103EA0000C9CF01F000DC031A1B2CD4B0C9C48FB07 :103EB000F01F0009C071A1A2CCDBF01F00083FF287 :103EC000CD3B029C3FF2F01F0005CCEB80009194AB :103ED00080039A74800091A0800091E880039A6C1E :103EE0008003D31C8003D3248003C8E4EBCD40803F :103EF0001697149C129BF01F00085BFCC031E3CFA7 :103F0000C0801898E018FFE1CFB1EF4C0050109C32 :103F1000E3CD808080023DB4EBCD40801697149CA9 :103F2000129BF01F00085BFCC031E3CFC0801898E3 :103F3000E018FFE6CFB1EF4C004C109CE3CD808041 :103F400080023DB4D431201D500B129CF01F00485C :103F50001891E080007F198A580AC6B0300218967E :103F6000049032033094E80A18005F08E60A18004B :103F70005F0910493008F0091800C0E0109B2FF6C7 :103F80000D8AE60A18005F08E80A18005F0912485F :103F9000F6081800CF51580AC2F00D87E80718003C :103FA0005F18E60718005F1910693008F00918005B :103FB000C3E05807C3C0109A0C95C0385807C0D04A :103FC0002FF50B87E60718005F18E80718005F1940 :103FD0001268F4081800CF3130084A6BAA880C9C8C :103FE000F01F0025C161A1B25807C060EAC6FFFFFB :103FF0000D8A580ACB91029CF01F00205802C1B0D4 :104000004009F34200545800C241009C2FFDD832B1 :1040100049BB0C9CF01F0018C031A1A2CE6B499B7C :104020000C9CF01F0015C0E1A3B2CDFB0C95CD5B3D :10403000F01F0012300840093FFCF34800542FFDE8 :10404000D832491B0C9CF01F000CC051A3A2CCDB42 :104050002FFDDC3A0C9C48DBF01F0007F9B800107C :10406000E5D8E032F7B001FFCC0B0000800091945E :104070008003C8C4800091A0800091E88003D32C05 :104080008003D3348003C8E48003C8E0D431202DFA :10409000500B129CF01F00391890C6D0198A580A8C :1040A000C610300118955011320230930294C03876 :1040B0002FF50B8AE40A18005F08E60A18005F096A :1040C0001248E8081800CF51580AC2C00B87E4070D :1040D00018005F18E60718005F191268E808180052 :1040E000C3F05807C3D00A96C0385807C0D02FF67F :1040F0000D87E40718005F18E60718005F191268BB :10410000E8081800CF31AC8449DB0A9CF01F001D81 :10411000C171A1A15807C060ECC5FFFF0B8A580A06 :10412000CCA1009CF01F00185801C1E04008F141EB :10413000005840195809C1F1129C2FEDD832493B63 :104140000A9CF01F0010C031A1B1CE5B0A9C490B44 :10415000F01F000CCFA040192FF95019CDCB0A96B3 :10416000CD3BF01F0009300840093FFCF3480058E0 :104170002FEDD8322FEDDC3A800091948003D340AC :10418000800091A0800091E88003D3448003D3484D :10419000EBCD40401896784CF01F00466D2CF01F78 :1041A0000045ECFC00D0F01F00436DACF01F004157 :1041B0006DCCF01F00406DECF01F003EECFC008069 :1041C000F01F003CECFC0088F01F003AECFC009073 :1041D000F01F0038ECFC0094F01F0036ECFC009857 :1041E000F01F0034ECFC009CF01F0032ECFC00A03F :1041F000F01F0030ECFC00A4F01F002EECFC00A827 :10420000F01F002CECFC00ACF01F002AECFC00B00E :10421000F01F0028ECFC00B4F01F0026ECFC00B8F6 :10422000F01F0024ECFC00BCF01F0022ECFC00C0DE :10423000F01F0020ECFC00C4F01F001EECFC00C8C6 :10424000F01F001CECFC00CCF01F001AECFC00D4AA :10425000F01F0018ECFC00D8F01F0016ECFC00DC8E :10426000F01F0014ECFC00E0F01F0012ECFC00E872 :10427000F01F0010ECFC00ECF01F000EECFC0150F5 :10428000F01F000CECFC016CF01F000AECFC01803C :10429000F01F0008ECFC018CF01F0006ECFC01A0F4 :1042A000F01F00040C9CF01F0003E3CD80400000D1 :1042B000800091E8EBCD40C0189678085808C031CE :1042C000C0880E987007109CF01F00155807CFA1EA :1042D0006D085808C031C0880E987037109CF01FC8 :1042E00000115807CFA16C5CF01F000F6C6CF01F21 :1042F000000E6C8CF01F000C6C9CF01F000B6CAC63 :10430000F01F00096CBCF01F00086C1CF01F0006B9 :104310000C9CF01F0005E3CD80C00000800241909E :1043200080023C18800091E8EBCD4040320818969E :104330001AD8E0691000F8C8FFDC785A784B792C5D :10434000F01F000430182FFDED480044E3CD8040FD :104350008002B254D421F60815011695F0C6FFFF6D :1043600018940C9CF01F00061897C0600A99089AD0 :104370000C9BF01F00040E9CD822000080028F24AA :1043800080023A68EBCD40E016951896F6CCFFFD1A :10439000F01F00091897C0C00C9B0A9A322618C655 :1043A000F01F0006EE0500093008B296B2A80E9C78 :1043B000E3CD80E080009200800091DCD401580CB5 :1043C000C1D0580BC160198835E92208F2081800DD :1043D000E08B0013129A3009C088F80907082208F8 :1043E000F4081800E08B00092FF9123BFE9BFFF741 :1043F000F01F0003D802F01F0003D802800243849C :1044000080024354D4011698F6FC0140580CC06059 :10441000189BF0CCFEDCF01F0002D802800243BCE7 :10442000D4011698F6FC013C580CC060189BF0CCE7 :10443000FEECF01F0002D802800243BCD4011698A3 :10444000F6FC0138580CC060189BF0CCFEFCF01F45 :104450000002D802800243BCD4011698F6FC013455 :10446000580CC060189BF0CCFF0CF01F0002D80263 :10447000800243BCEBCD40F831EC1694F01F0028CD :104480001896C3906979F8C3FFE2EDB90000C360E4 :104490001897EDB90001C1614A294A380C37F20872 :1044A0001710E60701051AD84A0A0A9B0E9CF01F4E :1044B00000202FFD580CC1C51835E08A001A1807D6 :1044C0006979EDB90002C171496949780C37F20880 :1044D00017100E9C1AD8E6070107496A0E9BF01FB9 :1044E00000142FFD580CC0451837E089000530082E :1044F000E768FFFF0C9CE3CD80F848B848EA1AD87B :1045000031EBF01F000B2FFD580CCF2559DCFE9925 :10451000FFF0EC0C00076979CBDB000080028F24F0 :104520008003936480037E208003D35880009148E9 :104530008003D3648003D350EBCD40F81894332C20 :10454000F01F003E1896C650F8C3FFCEEDB400042D :10455000C6301897EDB40003C1514B994B980C37F6 :10456000F2081710E60701051AD84B7A0A9B0E9C31 :10457000F01F00362FFD580CC4951835E08A00470F :104580001807EDB40002C1514AD94AE80C37F208C5 :104590001710E60701051AD84ADA0A9B0E9CF01F8D :1045A000002B2FFD580CC3251835E08A0030180762 :1045B000EDB40001C1514A294A280C37F2081710FE :1045C000E60701051AD84A3A0A9B0E9CF01F001F05 :1045D0002FFD580CC1B51835E08A00191807EDB445 :1045E0000000C171496949780C37F20817100E9C18 :1045F0001AD8E6070107498A0E9BF01F00142FFD09 :10460000580CC0451837E08900053008E768FFFFFF :104610000C9CE3CD80F848B8490A1AD8332BF01F18 :10462000000B2FFD580CCF25E04C0031FE99FFEF19 :10463000EC0C0007C90B000080028F2480039364F8 :1046400080037E208003D374800091488003D37C54 :104650008003D3888003D3908003D36CD401774C3C :10466000F01F0002D802000080024538D401773CD8 :10467000F01F0002D802000080024538EBCD40F860 :10468000332C1693F01F00401896C6906759F8C453 :10469000FFCEEDB90001C6601897EDB90000C16109 :1046A0004BA94BB80C37F2081710E80701051AD8C8 :1046B0004B8A0A9B0E9CF01F00382FFD580CC4C576 :1046C0001835E08A004A18076759EDB90003C1613F :1046D0004AE94AF80C37F2081710E80701051AD81A :1046E0004AEA0A9B0E9CF01F002C2FFD580CC34574 :1046F0001835E08A003218076759EDB90002C16128 :104700004A294A380C37F2081710E80701051AD869 :104710004A3A0A9B0E9CF01F00202FFD580CC1C581 :104720001835E08A001A18076759EDB90004C171FD :10473000496949780C37F20817100E9C1AD8E80717 :104740000107498A0E9BF01F00142FFD580CC0452D :104750001837E08900053008E968FFFF0C9CE3CDBD :1047600080F848B8490A1AD8332BF01F000B2FFDE8 :10477000580CCF25E04C0031FE99FFEFEC0C000700 :104780006759C8CB80028F248003936480037E2006 :104790008003D3A4800091488003D3B08003D390DA :1047A0008003D3BC8003D398EBCD40C030AC1696C9 :1047B000F01F00181897C1806D69EDB90000C17035 :1047C000189A301BEDB90001C0F149384939580B2E :1047D000F0091700149C1AD9EECBFFF6141B490AF6 :1047E000F01F00102FFD0E9CE3CD80C048B848EAB2 :1047F0001AD830ABF01F000B2FFD580CCF55589C2A :10480000FE99FFF3EE0C000A6D69300BCDCB000072 :1048100080028F248003936480037E208003D3D0A2 :10482000800091488003D3C8EBCD40C01697768CAA :10483000580CC05118960C9CE3CD80C0314CF01F31 :1048400000101896CF90EF38001DEF3A00181AD8D4 :10485000EF39001C1AD9EF38001B1AD8EF39001AAB :104860001AD9EF380019314B1AD81ADA485AF01F02 :10487000000630082FADED680013CDEB80009200EC :104880008003DA4880009148EBCD40E078351696F9 :10489000314CF01F000A1897C0C0EC050308488A85 :1048A0001AD8314BF01F000730082FFDEF680013B6 :1048B0000E9CE3CD80E00000800092008003DD6864 :1048C00080009148EBCD40801697772C580CC09013 :1048D000F01F0009189B6F2CF01F0008E3CD8080AB :1048E000771C580CC060F6CCFFDC320BF01F0004C4 :1048F000E3CD8080800091B88002438480024354DD :10490000EBCD40807838F60800076E085808C0C024 :10491000784C580CC0C0F60C030C189B109CF01F70 :104920000007E3CD8080109CE3CD8080109CF01FB9 :1049300000046E08CF3B0000800243BC800091B8A9 :10494000EBCD40F83228169418961989F009180012 :10495000C0A0F01F001BEBDCC001C19030070E9C13 :10496000E3CD80F8F8C7FFFF322B0E9CF01F001537 :10497000CF6019985808CF31B8880E9CF01F0010EE :10498000890C0E9CF01F00101897CEABF80316018F :10499000E6CCFFFFF01F000D1897CE200C9C069A66 :1049A0000E9BF01F000BC051EE030B0C8903CD8B47 :1049B0000E9C0A97F01F0007CD3B0000800091B8C5 :1049C00080009158800091948000920080023944C8 :1049D000800091E8D421205D18951094129C1696C1 :1049E000F01F000F1897C1906C0A590AE08B001451 :1049F000189B0A9CF01F000B0E9CF01F000B48BA7E :104A00001AD4314BFACCFFFCF01F0009300C2FFDFB :104A10002FBDD822F01F00042FBDDC2A80024940A0 :104A2000800091DC800091E88003D3D88000914819 :104A3000D4013038F6CCFEDCF6CBFEC0F01F00020D :104A4000D8020000800249D4D4013028F6CCFEEC14 :104A5000F6CBFEC4F01F0002D8020000800249D449 :104A6000D4013018F6CCFEFCF6CBFEC8F01F0002D5 :104A7000D8020000800249D4D4013008F6CCFF0CE3 :104A8000F6CBFECCF01F0002D8020000800249D411 :104A9000EBCD40F8201D18971693129C1A9BF01F1F :104AA00000171895C2306E595809C0504008103987 :104AB000E08B00206E695809C04040081039C133AE :104AC0006E366E44E60600066C0CF01F000D8D0578 :104AD0006E4C580CC0504008300CE60409082FFDFD :104AE000E3CD80F80A9CF01F00062FFDE3CFC0F84D :104AF000F01F00033FFCCF4B80024940800091E84B :104B0000EBCD40FEF6F700D05807C0510E94089C3C :104B1000E3CD80FE364CF01F00191894CF90EEC6FE :104B2000FFFCF8C3FF9C189749514962ECFCFFFC5D :104B3000580CC2116C0B580BC1A02F86F01F00122D :104B4000CF600837E2081700E40817101ADCE60700 :104B500001051AD80E9C48DA0A9BF01F000D2FEDB4 :104B60001807580CC0451835FE99FFE23008E76871 :104B7000FFFFCCEB6C0BCE2B80028F2480037E20BA :104B800080039364800271BC8003D3E48000914869 :104B9000D431205D500B129CF01F0056502CE08049 :104BA000008E198A580AE080009B3009402650196F :104BB000503912905049320230931294C0382FF677 :104BC0000D8AE40A18005F08E60A18005F09124817 :104BD000E8081800CF51580AC4E00D87E407180010 :104BE0005F18E60718005F191268E8081800C64049 :104BF0005807C6200C95C0385807C0D02FF50B8732 :104C0000E40718005F18E60718005F191268E80843 :104C10001800CF31AA842FF0403CE00B1503F01FA1 :104C200000361891C4E040490C9CE20900060C9B38 :104C3000F01F00328D1C6C085808C141580CC1018E :104C400040182FF850185807C15040482F88504836 :104C5000EAC6FFFF0D8A580AC3C05031CB3B591C2E :104C6000C2404009F2F801782FF8F348017858075C :104C7000CED15031E0C8FFFFF0071503402CF01FE4 :104C800000200E9B403CF01F001CC2E0F8000039E1 :104C90003008931893084008F14C00D04019580987 :104CA000C0D1129C2FBDD8324009F2F801742FF800 :104CB000F3480174CC9B0C95CAEB3FFC2FBDD83256 :104CC000403CF01F000F402CF01F000D2FBDDC3AC0 :104CD000E0C8FFFF5031F0071503CD1B501A308795 :104CE000503A1490CCCB403CF01F00053FFCCE7BEB :104CF00080009194800091F48002720C800091E811 :104D0000D4213228129716951389F0091800C0A0F3 :104D1000320A2DCB0E9CF01F00271896C2F03FFCE4 :104D2000D822EEC6FFFF322B0C9CF01F0023C3C01D :104D3000F8060107EEC80008E0480037FE9BFFF1C7 :104D40006B2C580CC060F01F001D0E3CC2606B2C19 :104D50003004EB440044F01F001AEECCFFFFF01FBC :104D60000019EB4C0048CDC00C9B0E9AF01F0016AA :104D70006B28089CF0070B04D822EF390040F80993 :104D80001800CCE16B2CF01F000E3018EB460048E9 :104D90000C9CEB480044D8220E9A0C9B6B2CF01F05 :104DA000000BCD61CBEB0C9CF01F00041897CC3BA3 :104DB0008002394480009158800091B8800091E8C9 :104DC00080009200800091DC8000917CEBCD4080DF :104DD0001697129C2E8BF01F0006F9BC01FFF9B844 :104DE0000001EFF80A08E3CD808000008002389CC3 :104DF000EBCD40C018976E38129CF00B000630AA1D :104E0000300BF01F000C8D0C18996E585808C030EC :104E1000103CC0956E6C580CC0401839E0890007F2 :104E2000E3CF80C08D08E3CFC0C08D0CE3CFC0C0FE :104E300080009170D42116941895782B580BE08A35 :104E400000557817683E6E0C78381C38C410EECACE :104E5000FFFC3009C058150C78381C38C3902FF966 :104E60001639CFA52FFB0E9CA36BF01F00241896BC :104E7000C3506A2C580CE08A003B6C08683E7039BD :104E80001C39C355ECC8FFFC300AC0A81097700845 :104E9000F40B15027039EEC8FFFC1C39C2052FFA5D :104EA000143CFE99FFF5F4C8FFFFEC0A002BA36841 :104EB0001697F80A010AEC08000CA36AF01F00100C :104EC0008F048B166A28300C2FF88B28D82218985C :104ED000781C580CCFD19114D822DC2AF4C8FFFFDB :104EE000EC0B000BA368CE6B7817CBDB0C97300A6A :104EF00030480C9BCDFB0000800091F4800091C4F1 :104F0000D4211895781CF01F000D300C8B1C8B2CB5 :104F10006A075807C0F0189618948F140E9B0A9CC5 :104F2000F01F00076E07F9B605FF5807CF710C9CFC :104F3000D8220E96CFDB0000800091E880024E342C :104F4000D421189578095809C1E03FFAC028109972 :104F50007228F4080C4A72085808CFA1F4C4FFFF65 :104F60001296E06C01A8F01F000A1897C0A09924BF :104F70005806EDFC1A00EBFC0A000A9CF01F000525 :104F80000E9CD82212961294CEDB000080028F2451 :104F900080024F005EFD5EFD5EFD5EFD5EFD5EFD1E :104FA000D401584BC0E0E0880007586BC0A0587B84 :104FB000C040D802580BC091300CF01F0005D80239 :104FC000301CF01F0003D802D80200008002172016 :104FD000D401581BC070300A323C149BF01F0005EE :104FE000D80A300A322C149BF01F0002D80A0000A5 :104FF00080014658EBCD40FE201D1094129216956C :10500000F01F0057E8C8FFF25C7C4D69F00C000609 :10501000F33A0109580AC060EC0A0D085809E0810A :10502000008F3003500CE6060001029CF01F004E7A :105030000A9B1897306A400CEE0C000CF01F004BD6 :10504000400C306A4CAB140CEE0C000CF01F004707 :10505000400C302A4C7B2F4CEE0C000CF01F004310 :10506000400C089A049B2F2CEE0C000CF01F003F04 :10507000FAC8FFFC3005114A0E991AD5EE0A000C49 :105080001AD5EC0A010A30EBF01F003B2FED581C3B :10509000C5914009EC090108E048003EE08B001092 :1050A0008E085CC806085CC8AED3029B0E9CAE0896 :1050B000F01F0032300C2FFDE3CD80FEEE09000E14 :1050C0003888FD39000CF0091800CEB1FD39000D0B :1050D00038E8F0091800CE51FD38000EF808180025 :1050E000CE01FD39000F3038F0091800CDA130286D :1050F000FD3A0012F00A18005F1B3FE8F00A1800A2 :105100005F19126BEA0B1800CCC1FD380013E218CE :10511000001D5818CC61FD380014E21800C85888EA :10512000CC01FCCAFFC1FCC9FFE1C0482FF914390A :10513000C0E01388F6081800CFA0CB3BF4090103A8 :10514000C72B0E9CF01F000E3FFCCB6B0FC92FA985 :10515000EE0900091388A3A8B288CA3B8001F4E8CD :10516000000087F480009200800091DC00007AA8A3 :105170008003D6548001F54480014664800091E8A4 :10518000D401201D3068FACBFFFC16D81A9B486C5E :10519000F01F00064848581CF00C1700F9BC01002D :1051A0002FFDD80200007AA880017A88EBCD40401C :1051B000310A1696300B0C9CF01F000630F930783F :1051C0008D198D09300C30398D288D39E3CD804013 :1051D000800091D0D401F01F0002D80A80016048FD :1051E000EBCD4068206DFAC3FFEE1496069C306A42 :1051F000F01F0010FAC5FFFE0C9B310A0A9CF01F3D :10520000000D0A9B204D310A1A9CF01F000B069BD3 :10521000202D306A1A9CF01F0008F01F00082FADE7 :10522000581CF9BC01FFF9BC00002FADE3CD80682C :10523000800091DC8002E73680016094EBCD40680D :10524000206DFAC3FFEE1496069C306AF01F001022 :10525000FAC5FFFE0C9B310A0A9CF01F000D0A9B49 :10526000204D310A1A9CF01F000B069B202D306A3E :105270001A9CF01F0008F01F00082FAD581CF9BC45 :1052800001FFF9BC00002FADE3CD8068800091DC08 :105290008002E73680016168D401F01F0005581CC8 :1052A000F9BC01FFF9BC0000D80200008001F370D6 :1052B000D401F01F0005581CF9BC01FFF9BC000027 :1052C000D80200008001F310D401169CF01F0004E6 :1052D000581CF9BC01FFF9BC0000D802800163E052 :1052E000D431207DFACEFFC050287C027C387C1758 :1052F00050087C2E501E16901894149B1293580A36 :10530000C5C0FAC5FFEA306A0A9CF01F0031202DA3 :10531000306A0A9B1A9CF01F002FF01F002F5802C2 :105320005F1858075F1918912FED1268C181300678 :105330005800C26168193018F0030948F00811FFDD :10534000F1E9000C891C580CC365BFBC891CF01F17 :10535000002318975817C2F02F9DDC3A5887FE9B00 :10536000FFFDFAC6FFF2308A300B0C9CF01F001CC8 :105370000E9A049B0C9CF01F00165800CDC04028CC :1053800058015F091AD8069C1AD630381AD530163B :10539000404A403B1AD6F01F00136819EC03094835 :1053A0001248F1D8C01F189789180C9CF01F000EE6 :1053B0002FCDCD1B2F9DD83AFAC5FFEA306AE06B9E :1053C00000FF0A9CF01F0006CA3B0000800091DC31 :1053D0008002E736800188B080016584800091D02A :1053E0008001661C8001639CEBCD40C01896308C18 :1053F000F01F00091897C0C0300899069918F01FCF :105400000007301CF01F00060E9CE3CD80C0E3CDEA :1054100080C0000080028F248001604880017A10E3 :10542000EBCD4080209D1697FACCFFFEF01F0009BF :10543000581CC0402F7DE3CFC0800E9C1BBAFACB16 :10544000FFFCF01F00051BBC2F7DE3CD808000001A :1054500080017800800091DCEBCD4080202D580B3E :10546000C120FAC7FFFE306A0E9CF01F000C0E9C94 :10547000F01F000B581CF9BC01FFF9BC00002FED18 :10548000E3CD8080FAC7FFFE306AE06B00FF0E9C20 :10549000F01F0004CEDB0000800091DC8001793039 :1054A000800091D0EBCD4040485B1896F01F00057E :1054B0000C9CF01F0005E3CD8040000080039C3869 :1054C00080025458800091E8EBCD40C0202DFAC7EF :1054D000FFFE16960E9CF01F0008581CC0402FEDD2 :1054E000E3CFC0C00E9B0C9C306AF01F00042FED70 :1054F000E3CF80C080017864800091DCEBCD40C0B8 :1055000018977939580BC0305839C0E03018EF4837 :1055100000BC3038EF48004C1039C0808F2830086C :105520008F58E3CD80C0F949004C6F682FF8EEFA30 :10553000010CEF4800586FA830098F288F59301B95 :10554000746C7486487A5D16EEF80094EEF900905B :105550002FF82FF9EF480094EF490090E3CD80C079 :1055600080037E20580C5E0C580BF9FB4A19580A30 :10557000F9FA4A225809F9F94A1A5808F9F84A1B5F :105580005EFC580CF9F81024F9B90101F1D9E108D1 :10559000F9F81A245EFC580C5E0C580BF9B801019E :1055A000F9F81A45F9FB0A455EFCD703EBCD40C07C :1055B0001897580CC04079385858C030E3CD80C097 :1055C000F8F8010C3009706C7086488A301B5D1643 :1055D000EEF80094EEF900902FF82FF9EF480094C0 :1055E000EF490090E3CD80C080037E20580CF9FC89 :1055F00010315EFC580CC0B0F8F800D45808C070E8 :10560000F8F800D89708F8FC00D45EFC300897083A :105610005EF8D703580CC040588BE08800035EFD4D :1056200048D8F00B032FF8FC00E05EFCF8FC00DC2F :105630005EFC78BC5EFCF8FC00805EFC79FC5EFCE5 :10564000F8FC00845EFC784C5EFC797C5EFC786C37 :105650005EFC00008003D6FC580C5E0C588B5EBCD0 :1056600048E8F00B032FF94A00E05EFCF94A00DC41 :105670005EFC99BA5EFCF94A00805EFCF94A007C47 :105680005EFCF94A00845EFC994A5EFCF94A005CC3 :105690005EFC996A5EFC00008003D720580CC05065 :1056A000580BC031783C5EFC5EFD580C5E0C580B0C :1056B000F9FA0A035EFCD401580CC0A0F8FC010CF6 :1056C000580CC06078A85808C030780C5D18D80213 :1056D000D401580CC021D80AF8FC010C580CCFC0DA :1056E00078B85808CF90780C5D18D802EBCD408080 :1056F0001897580CC1E0189A300B48FCF01F000FA7 :105700000E9A300B48ECF01F000DEEFC00C0F01FAD :10571000000DEEFC00CCF01F000CEEFC00D4F01FDE :10572000000AEEFC010CF01F00080E9CF01F0006A2 :10573000E3CD80808002608C800274008002602053 :10574000800270E0800091E8D401580CC050F8FC51 :1057500000C0F01F0002D80280026410D401580C6F :10576000C050F8FC00C0F01F0002D802800264287C :10577000D401189A580CC0A030583019F8FC00C059 :10578000F548004C95C9F01F0002D802800263BAA8 :10579000EBCD40801897580BC04079E85888C0403E :1057A0003018EF4800BC30193088EF490044EF480A :1057B00000788F99EEFC00C0F01F0004F9B80100DA :1057C000EFF81A39E3CD8080800263B2EBCD40E080 :1057D000201D189716951496580CC0513FFC2FFDAC :1057E000E3CD80E0F8FC00C0F01F000ACF801A9BD8 :1057F000EEFC00C0F01F0008189BCF10400C0C3CC2 :10580000CEF30C9A0A9CF01F0005300CCE9B0000D2 :10581000800263B2800263CE800091DCEBCD40C099 :1058200018971496580CC1F0F94B00C4580AC1B02F :1058300074087419F94800F8F94900FC7428F9480B :105840000100F8FC00C0580CC0E0742BF01F0007EA :105850006C3BEEFC00C0F01F00066C4BEEFC00C081 :10586000F01F0004E3CD80C0800263A6800263AC19 :1058700080026408D431FACD00A81897F8F600CC5D :105880005806C0F0F8F800F85808C0B00DA80DB9D7 :10589000F3E81089F8F800D02FC91039E088000427 :1058A0002D6DD832ECC4FFFC0999500909A0F01FF6 :1058B000006FFAC1FFF8340A029B0E9CF01F006CC7 :1058C0001895CEF5590CE0800090580CCEA132020C :1058D0005012EEF800E45808C7D1E8C5FFE4FAC357 :1058E000FF68310A0A9B069CF01F0062310A300BE8 :1058F0000A9CF01F00610DAA0DB9049BF3EA108900 :10590000FACCFFD8EEFA00CC0A982FC9F01F005B42 :10591000310A0A9B069CF01F005AC7614009E1E961 :1059200010880DB9EBD8B0100DA8F3E81089320833 :10593000F2CE002CF00519005FB9E04E00205F9A0E :10594000124AF80A1800CAD15C751C35C630580EC8 :10595000CA81FAC3FF88029B0A9A069CF01F004581 :105960003018308AEF4800E4E8CBFFFDEECCFF189A :10597000F01F0040EEFC010C78965806C0D0E93AC2 :10598000001B0A98149B0699780CE21B0080F5DA3C :10599000C0025D16C865E939001B3008F00918001F :1059A000C5753018EF48011CEEF901185809C0718F :1059B000EEF800FCEDB80000FE90FF7430188FD8B0 :1059C000EEFC010C78785808FE90FF6C780C5D189E :1059D000C68B308AE8CBFFFDEECCFF18F01F002805 :1059E000FE94FF60C7BB189A029B0E9CF01F00201C :1059F000FE91FF580A9A029BFACCFFD80A92F01F38 :105A0000001D5015C67B069B0A9C310AF01F001929 :105A1000C48BFAC6FFB8E8CBFFF50C9C310AF01F27 :105A20000015049A029BFACCFFA8F01F0012FAC3DB :105A3000FF880A9AE8CBFFD4069CF01F000E40199D :105A40000C9A2F090A9B069CF01F000EC8AB301859 :105A5000EF480118EEF9011C5809CB11EEF800FCD3 :105A6000EDB80001CAC1C1DB8002575C800257CC8F :105A7000800091DC800091D080028EF88000917CC3 :105A800080029C38D431201D3003189730140695BD :105A900030213040EF4500BC6F4A580AE08000C911 :105AA0006F585808E08100C56E7C580CE08100C238 :105AB0006EB85808E08000BE6F385828EFF41A2FEF :105AC000EEF8010CEF41004C3009706C7086FEFA64 :105AD000051E029B5D16EF4400548FC5EEF800983A :105AE000EEF900902FF82FF9EF480098EF49009059 :105AF0006E7C580CC0516EB85808E08100EC6FC83D :105B0000EF4400705818EFF41A2F6FD85808E0814E :105B100000F8580CE08100A76EE85808E08100A367 :105B20006FE8F0C900015879E08B000EFEF804C45C :105B3000F009032FEF4400BCEF410078EF4500402F :105B4000EF4400C8EEFC00C0F01F012BE08000B560 :105B5000EF4400BC2FF3E0430064C9D10E9A300B30 :105B6000FEFC0498F01F012630090E98FEFA048C02 :105B7000129B129CF01F0123EEF9010C72285808A9 :105B8000C0E0EEF801105808C0A058185F0B3008AC :105B90000E9CEF480110723A72285D182FFDD83222 :105BA000EEF80088EF4400BCEF4000788F55EF45D9 :105BB000007CEF4500C88F08CC6B6E585808E08118 :105BC00000DF6E4B580BE08100D06E085808C161B1 :105BD0003078EF4400BCEF480078EF440048CB3BFE :105BE000EEF900845809E08101846FF85808E081DB :105BF000015C6E4B580BE08100B86E685808CA30E3 :105C00000E9CF01F0101C9FB6E485808E08100A9F5 :105C10006E585808E08100B06E685808C9406F0897 :105C20005808C910300B0E9CF01F00F7C8CB6E7CD3 :105C30006EA95809C2F16F885808C2C06F38EF4585 :105C400000605818EFF41A2FEF44004CEF4500584D :105C5000EF4500548FC58FE4EF450118EF45011C57 :105C6000C49B6FE8EEFC00CC5818EFF41A2FEF44F9 :105C70000078F01F00E6EEFC00D4EF4500CCF01FEA :105C800000E3EEFC00C0EF4500D4F01F00E18FE51B :105C9000C5AB580CCD416EB85808CD105829C3B0CB :105CA0005819C4706F3820185878FE9BFF26FEF9EB :105CB0000362F208032FEEF800BC5808FE91FF4C77 :105CC000C5CB6E585808E08100FE6ED85808E080B9 :105CD00000FE6FC95819FE90FF1A5829FE91FF1E49 :105CE0006FD85808FE90FF1A0E9CEF490070EF44E1 :105CF00000BCF01F00C96E7CEF450074C0BB0E9C59 :105D0000EF4400BCEF410070F01F00C36E7CEF4514 :105D10000074C00B6F885828CC606F388FC45898B7 :105D2000EFF41A2FEF4100603098EF48004CCE4A54 :105D30006F885818CB806F3858A8EFF91A2FEEF9F2 :105D4000010C30A88FC5EF440060EF48004CFEFA0C :105D5000029E7286726C302B0A995D16CC0A6F080F :105D60005808FE90FF573068EF4400BC8FF4EF48AE :105D70000078CE9A6F085808FE90FF503038EF44F4 :105D800000BC8F05EF440080EF480078CDCA6E69F3 :105D90005809C0A06ED85808E0810117EEF800F845 :105DA0005808E08100FC6E485808E08100EB6E88DE :105DB0005808C0506ED85808E08000E46F28580892 :105DC000C050300B0E9CF01F00956E7CC93A6F7866 :105DD0005808C8018F88EF4400BCEF40004CEF48E2 :105DE0000058EF4800448FF8EF4800488F98EF4480 :105DF0000040C82A6E1B580BCE606E585808FE90A3 :105E0000FF6A3089EF4400BCEF49004CEF44005C6E :105E1000C73A6E2B580BC2716F696FB81039CD330A :105E20006ED85808C2003058EF4400BCEF48004C10 :105E30008FC4EF440110FE9FFE60580AFE91FF4B95 :105E4000EF4A011CEF4400BCEF44004CEF4A0060F5 :105E5000EF4A0058EF4A00548FCA8FE4EF4A011806 :105E6000FE9FFE4B6E685808C7B16E485808C78140 :105E70006E585808CC71580BFE91FF2D6F696FB8A2 :105E80001039FE93FF286ED85808FE91FF24307811 :105E90008FCBEF48004CEF4400BC6F98EF410110EE :105EA0008F18FE9FFE2AEEF80088EF4900C8EF44E5 :105EB00000BCEF4000788F59EF49007C8F08FE9FAF :105EC000FE436ED85808E081008AEF4400BCEF44DE :105ED000004CEF450060EF450058EF4500548FC57A :105EE0008FE4EF450118EF45011CFE9FFE06305977 :105EF000EF4400BCEF4900781A9BEEFC00C0F01F95 :105F000000481892C290EEF8010C4009189A708669 :105F1000706C300B5D16049CF01F003CEEF800C85E :105F20005808EFF81028F9B90101F1D9E108EFF8A4 :105F30001A28EFF80029F9B90001F1D9E008EFF8C3 :105F40000A29EEF90090EEF8009C2FF92FF8EF499E :105F50000090EF48009CEF450084FE9FFDF5EF4464 :105F600000BCEF40004CEF450058EF4500448FF572 :105F7000EF4500488F958F85EF440040FE9FFDBDA3 :105F80003078EF4400BCEF48004C8FC56F98EF416C :105F900001108F186E7CFE9FFDAEEEF800FC5808D5 :105FA000FE91FF038FD4EEFC010C78785808C040B6 :105FB000780C5D186E695809FE90FEF76ED8580887 :105FC000FE90FEF36E7C3059EF4400BCEF49004C6C :105FD0008FC4EF440110FE9FFD8E3088EF4400BC5B :105FE000EF48004CEF44005CFE9FFD8780037E205D :105FF0008003D744800268308002608C8002740085 :106000008002747480025790800091E88002653CA1 :106010008003D76480025874800254FC800263E6D7 :10602000EBCD408076085808F9B901FFF1D9E108B5 :10603000F7F81A0076185808F9B901FFF1D9E10804 :10604000F7F81A0176285808F9B901FFF1D9E108E3 :10605000F7F81A0276385808F9B901FFF1D9E108C2 :10606000F7F81A03169718991698486A300B301CDF :10607000F01F00050E9CF01F0005E3CD808000009E :10608000800260208002747480025A84D401169CBD :10609000F01F0002D802000080025A84D421203D63 :1060A0001895E06C0120F01F00221897C38031E89A :1060B0003039F9480088F948006833C8F949006C5C :1060C000F9480064F945010C300430CA99A4089BD2 :1060D0001A9CF01F00186AF850286ADA500A6AE819 :1060E0005018EEF8010C1A99704A493B0E9CF01FAB :1060F0000013EF4C00C01A961898C14030160E9C41 :106100008F76F01F000F0E9C8F74F01F000D0E98FD :1061100008990C9C48BA089BF01F000B0E9C2FDDC1 :10612000D8220E9C1097F01F0009CF9B80028F246D :10613000800091D0000004788002711C80025A8493 :106140008002602080027474800091E8D401580CB1 :10615000C090F8F800D45808C050F8F800805808EB :10616000C020D8023018F94800809958F01F00026A :10617000D802000080025A84D401580CC04099AB68 :10618000F01F0002D802000080025A84D401580C8B :10619000C060F94B00E0994BF01F0002D8020000EC :1061A00080025A84EBCD40801897580CC090996BB0 :1061B000F94B00DC580BC0610E9CF01F0005E3CDCD :1061C0008080F8FC00C0F01F0003CF7B80025A845F :1061D000800263BAD401580CC04099DBF01F000262 :1061E000D802000080025A84D401580CC04099BBE8 :1061F000F01F0002D802000080025A84EBCD40E07C :10620000189714951296580CC3A0F8F8008C2FF824 :10621000F948008C5839E08B0009F8F800A82FF8ED :10622000F94800A8E3CF80E01588306AF94800B04B :10623000F8CCFF4CF01F0042ECCA00040BA90BB8CD :10624000F1E910861436E08B00130B99300CF80935 :106250001800C4603038F0091800C130EEF800A80A :10626000301C2FF8EF4800A8E3CD80E0EEF800AC3A :10627000300C2FF8EF4800ACE3CD80E0E3CF80E0B6 :10628000E046002BE088004C3FE80BCBF00B1800F9 :106290005F0A3028F00B18005F09124AF80A18004C :1062A000CEE13018F00B1800C3A1EEFC00CCF01FBB :1062B00000252FC60C9CF01F0024EF4C00CCC2F030 :1062C0000C9A0A9BF01F001E0E9CEF4600D0301661 :1062D000EF460074F01F001D0C9CE3CD80E0EEF84B :1062E00001145808C100300830398FC8EF48011434 :1062F0008F29EF49004CEEFC010C78C85808C030DB :10630000780C5D18EEFC00D4F01F000E0C9CEF46DC :1063100000D8F01F000DEF4C00D4C031E3CF90E067 :10632000EACBFFFCEEFA00D8F01F00050E9C3016F9 :106330008F56F01F00060C9CE3CD80E0800091DCBE :10634000800091E88000920080025A84EBCD40806A :10635000189779685808C0B079BB580BC08070494D :106360005D193008EF480058EF48006CE3CD80809D :10637000EBCD40C01897580BC04078085878C04003 :106380003018EF48006030786FA68F086F9C6C293A :10639000300A305B5D196FA86F9C7029301A304B42 :1063A0005D19E3CD80C0F94B00745EFCF94B00B081 :1063B0005EFC580CF9FC10135EFC580CF9B8010196 :1063C000F9F81A06F9B9010BF9F91A005EFC580C34 :1063D000C08079485808C05079589708794C5EFCBD :1063E000300897085EF8580CC0C0791A580AC09057 :1063F000792897083009F9490048F94900445EFABC :106400003008109A97085EFAF94B00C45EFCD70377 :10641000D401580CC040483BF01F0003D8020000D4 :106420008003D7B08002634CEBCD40801897580CA6 :10643000C0F079A8300B7019799C5D19C0916E6815 :106440005808C0606E2820385818E0880004E3CD52 :1064500080806F485808F9B80101EFF81A136FA847 :106460006F9C7029301A300B5D19EEFC00A4483A7D :10647000302BF01F0003CECB8003D7BC80023A1A2A :10648000EBCD40801897580BC040780858B8C040F2 :106490003018EF4800606F4930B88F085809F9B8D4 :1064A0000101EFF81A136FA86F9C7029301A300B96 :1064B0005D196FA86F9C7029300A305B5D196FA859 :1064C0006F9C301A7029304B5D19EEFC00A4484ACD :1064D000302BF01F0004E3CD808000008003D81C27 :1064E00080023A1AEBCD40C01897580BC04078088C :1064F00058C8C0403018EF48006030C86FA68F08F9 :106500006F9C6C29301A302B5D196FA86F9C702915 :10651000300A305B5D196FA86F9C301A7029304BC0 :106520005D19EEFC00A4484A302BF01F0004E3CDB7 :1065300080C000008003D86080023A1AEBCD406032 :106540001896784CF01F000B30056D1C8D45F01F20 :1065500000096D4CED450044F01F00066DA8ED45A7 :1065600000500A9A6D9C70290A9B5D19E3CD8060EA :10657000800091E8EBCD40E01897580BC4F0780804 :106580005808C4C130088F086FD95809C0B06F6867 :106590005808C08070985808C0506FBB0E9C5D189A :1065A000C4114A4B0E9CF01F00246FA83006301512 :1065B0008F16EF4500408F268F666EFA70490C9B50 :1065C0006F9C5D196FA80C9A70290C9B6F9C5D19CC :1065D0006FA80C9A7029302B6F9C5D196F4CF01FBF :1065E00000176FA80A9BEF460050EF46004C0C9A2C :1065F00070296F9C5D193FF80C9A8F386FA5303B5E :106600006F9C6A295D196FA80C9A7029304B6F9C9A :106610005D19EF4600C0E3CD80E03018EF48006020 :10662000CB2B6F686FBB70A90E9C5D19CBFB000074 :106630008003D8948002634C800091E8EBCD40E069 :10664000205D1897580BC04078085858C040301843 :10665000EF48006030588F086F695809C4406FA830 :10666000FACBFFF070596F9C5D19310A300B189509 :106670001A9CF01F00256F1C6EE850086E295019F7 :106680006E6850286F095039F01F002030086F6B7A :10669000EF48005CEF480044EEC8FFB81A9A0A9928 :1066A0001AD80E9C405876566FBB5D16EF4C0044CE :1066B00040188FE82FFD5808C1616F785808C13124 :1066C00040188F2840298F694038EF4800406F6894 :1066D00070695809C08070785808C0506FBB0E9C14 :1066E0005D19C0412FBDE3CD80E06F4CF01F000766 :1066F0006F68EECAFFAC70796FBB0E9C5D19EF4CF2 :106700000050CF1B800091D0800091E8EBCD4080FD :106710001897580BC04078085868C0403018EF48A8 :10672000006030686E4C8F08F01F001A6F18580810 :10673000C2E0EEF800B05808C2216EA86F2C8F3866 :10674000F01F00158F4CC0706F2A6F1BF01F0013D5 :106750006F288F586FA8301A7029303B6F9C5D19D5 :106760006FA86F9C7029300A305B5D196FA86F9C11 :1067700070496EFA300B5D19E3CD8080310AEECBA3 :10678000FF7CEECCFF6CF01F0005CD8B8F48CE9BBD :10679000800091E880009200800091DCEBCD40FC0D :1067A000201D79A81897169214931294799C700959 :1067B0005D191896C2F06F685808C23070C8580842 :1067C000C2000E9C1A9A6FBB5D181895C1A0400CB0 :1067D0002FBC870CF01F0015C1D03028B892B888A4 :1067E00030188699B8B9A9891897B8A9B8C80A9B6A :1067F000400A2FBCF01F000E0E9C2FFDE3CD80FC45 :106800005804C0416DCC580CC0A16DB86DA5580599 :10681000C0A130070E9C2FFDE3CD80FC6DD81895EC :106820005008CD6B5008CD4B80009200800091DC69 :10683000D431209D3004F8C9FF7CF8C8FF6C18974C :1068400050195008F8C0FFB808956FA8EF450060D0 :10685000301B70196F9C5D19C0706FA8306B701978 :106860006F9C5D19C2F16FA8306B70196F9C5D1938 :10687000C140EEF800C45808C101EEF800C0E0487D :106880000032E08A0025E0480033E080011C6F8878 :106890005808C1003014CDAB6E085818F9B8010182 :1068A000EFF81A18EF4500C030188F086F885808A5 :1068B000CF216F7C580CE80C1700F9BC01012F7D2B :1068C000D832301B0E9CF01F01EECE2B6E0958A95A :1068D000FE9BFFDFFEF807ACF009032F30183029CC :1068E000EF4800608F09CD4B300B0E9CF01F01E686 :1068F000CCFB6E196EB81039C760300B0E9CF01FC0 :1069000001E2CC6B6EA96E381039E0800137300B94 :106910006E8E580EC1B06E685808C1806EAA6E396E :10692000123AE08000BBEEF800B05808C0F0F2C8A0 :10693000FFFFF1D8C008103AE08000B0F2C8FFFEB7 :10694000F1D8C008103AE08000A96E2C582CC20083 :106950006E985808E08001236E685828E080011F77 :106960006EAA6E39123AE0800146EEF800B058087F :10697000C0F0F2C8FFFFF1D8C008103AE080013B38 :10698000F2C8FFFEF1D8C008103AE08001346E78FA :1069900058085F1A3008F5EB0009F0091800E0818B :1069A000010FEC1B0001F5EB0008F2081800E08075 :1069B00001056EBB1699582BE080012A6E16580609 :1069C000C071581BE080021B582BE08101630C3B17 :1069D000E080014F0C995919C0F1580EC0416FE881 :1069E0005808C0A0300B0E9CF01F01A8C51B6EEB11 :1069F000580BFE90FF7C300B0E9CF01F01A5C48B42 :106A00006FA8305B70196F9C5D19C7016FA8307B50 :106A100070196F9C5D19C0506E685808FE91FF395F :106A20006FA8300B70396F9C5D19C0516E68582883 :106A3000FE90FF2F6FA8308B70196F9C5D19FE912F :106A4000FF286FA8189B70396F9C5D19C0516E6844 :106A50005828FE91FF1E6FA8307B70196F9C5D193E :106A6000C0806E285828C0506E685808FE90FF11EC :106A70006E185918E080025C5998FE91FF0AEEF8F2 :106A800000805808FE90FF056E685808FE90FF01D0 :106A90006E285848FE91FEFD300B0E9CF01F017DC4 :106AA000CF7A6FA8306B70196F9C5D19FE90FEF164 :106AB000EEFB00C4580BFE91FEEC0E9CF01F017023 :106AC000CE7A3328EEFC00A4FEFA05CC1AD8302B7F :106AD000F01F0172EEF800C0301B16080E9CEF4844 :106AE00000C0F01F016F2FFDCD3A6FAA3038FACBEE :106AF000FFE08F0830136F9CEF43006074595D19FD :106B00008F95507C8F85EF4500788F758FA58FB559 :106B10008FC58FD55F0A408B1896583B5F88104A07 :106B2000EA0A1800C23119A919B8F1E910885068A9 :106B3000103BC1C319988FA8EEF900B05809C09056 :106B4000069C4019FACAFFE8FACBFFE4F01F015592 :106B50000D893028F0091800E080011CE08B008DC1 :106B60003018F0091800E0800123EEF800C02FF87B :106B7000EF4800C0FE9FFE8D6E785808FE90FEC95B :106B8000EEF800B05808C080310A400B401CF01FDE :106B90000146FE91FEBE301BCBCA580EFE90FEF998 :106BA0006E685808FE91FEF56E185918FE91FEDACF :106BB000583CFE91FED7CECA6E19C0EB301830A9F2 :106BC000EF4800608F096F1CF01F01386E485808AD :106BD000C1A06E5CF01F0136EF4C0044FE90FE59E0 :106BE0006E5A6E4BF01F01336E58EF480048FE9FFF :106BF000FE50300B0E9CF01F012AFE9FFE4A30090A :106C000050494048EF480044FE9FFE436F08580833 :106C1000FE90FED6301830996FAA8F09EF480060B9 :106C20007458FACBFFE86F9C5D1819A919B818962B :106C3000F1E910885848E08B01476F1CF01F011BD9 :106C4000305CEF450044EF4C00486EA6F01F011881 :106C5000E08001853029B896B889EF18004AB8C994 :106C6000B8B8A988B8A8EF4C0044FE9FFE12584C53 :106C7000FE90FEB3CB8A3038F0091800E08000DCCB :106C80003048F0091800FE91FF7230188F98C6EB5B :106C900030181693EF48006030496FA8E04B00FEB3 :106CA000EFF3000D8F096EC670096F9C5D19069A8F :106CB0000C9BF01F0101E08100C36F1CF01F00FB63 :106CC0006FA8EF4500446EA270096F9C5D19503C9F :106CD000FACCFFE8F01F00F91893C9206EB8E0481D :106CE00000FEE08101516FA8406670096F9C5D193C :106CF00030C8505CA376EF480048ECCCFFECF01FA6 :106D000000EC1891E080012E3FE9B892B8C9302913 :106D1000B889F8C8FFFBB0A5B085B095F8C9FFF8F1 :106D20003038B285B295B2A5B2B8504CF8C2FFF473 :106D30000A96C298661A6ED81438C210405CF01FCA :106D400000DE049AE4CBFFFC580CC1903FE814C865 :106D50008689B4896608A988B4986609B4A907C861 :106D6000B68886A9B6996618A988B6A86619B6B96C :106D7000F6C2FFFC60082FF62F88810866F35803DF :106D8000E0800099660B6EC81638CD50661ACD7B30 :106D90006E185918FE91FEEB40685848FE98FEE7C1 :106DA0003018EF4800780DC98FB9CE0A406A584AAA :106DB000FE98FEDD30188F780DC98FB9E04900FECE :106DC000FE91FED558BAFE98FED2ECC9FFFB139C8B :106DD000138A13A8F1EA1108F1EC1088ECCBFFF844 :106DE0008FC817AC17B81789179AF1E91188F1EA1B :106DF0001108F1EC10888FD8CB9A6FA83089EF4B2F :106E000000608F09FACBFFE0705A6F9C5D1AFEFAA2 :106E100002AE302BEEFC00A4F01F00A06F1CF01F90 :106E200000A30C99EF460044009A6EAB0E9CF01F35 :106E300000A5C1AB30188F88FE9FFE990C9C069B65 :106E4000F01F00A1FE90FF3B6FD85808C0906F6AFA :106E5000580AC06074096EC81039E0800086FEFBD5 :106E6000026A0E9C3006F01F009A6EB88F186F6C85 :106E7000580CE08000CD5806C54078B86FBB0E9C1A :106E80005D18EF4C006C6FB65806E08000CA6F6A60 :106E90006ECB30188F287429FEFA02381AD91AD30B :106EA0001ADB302BEEFC00A4F01F007C2FDDFE9FD0 :106EB000FCF05806C4206F285C78A2B8A988A2A864 :106EC000FE9FFEA1F0CC0004F0C20005F01F007888 :106ED0001893FE90FEB45802C120ECCCFFFB300AA0 :106EE00035DB1938F0C90021F6091800F9B80B5F35 :106EF000E60A0B082FFA1432FE9BFFF53008E60273 :106F00000B084F581AD34F5A1AD8302BEEFC00A456 :106F1000F01F0062069CF01F00652FEDFE9FFE8FA4 :106F200078380E9C5D18EF4C006CCAEB6FF858086F :106F3000FE90FCAFFE9FFDAA04983FE910C9B0A6E1 :106F4000B086B096E4C9FFFCB2B6B286B296B2A6DD :106F50006F282F88EF480048CB0B0A9CFE9FFE85C8 :106F60005045FE9FFE5074181033FE91FF7A7499BD :106F70005809FE90FF766FBB0E9C5D19FE90FF7165 :106F80003016C74B3058406CEF4800482FACF01F0C :106F900000481896FE90FE35B89230283039B888EF :106FA000B8C9504CF8C2FFFB50250A91C1A8661A17 :106FB0006EB8103AC130403CF01F003FC0F0660888 :106FC0005808C5A040285808C0913FE904C93018A6 :106FD000502860082FF12FF8810866F35803C0602D :106FE000660B580BCE50661ACE7B5801EFF8101284 :106FF000E5F10E00EFF80012F7B800FFEFF80A1203 :107000005C78ACB8A988ACA8FE9FFDFD069B6ECC51 :10701000F01F002DEF4C0058FE90FE51C2DB6FA810 :107020006F9C70095D196F6870291AD91AD36EC8E0 :1070300018921AD8302B4AAAEEFC00A4F01F0017B1 :10704000EF4600588F268F1658025F1B6EB92FDD52 :1070500058D95F081668EC081800FE90FE30E4F876 :1070600001605808FE91FC15E4F801685808FE908C :10707000FE26FE9FFC0E661804C8CACB800265740B :107080008003D7848002670C8002663C80026370B4 :10709000800264808003D8A080023A1A800264E4EF :1070A00080028D9C8000917C800091E8800092009D :1070B000800091DC80023AD8800271E48003D8F02D :1070C0008002679C800271908003D9248002634C07 :1070D0008003D9708003D8D08003D3E48003D930F3 :1070E000EBCD40801897580CC0E0488BF01F00088B :1070F0000E9CF01F0008EEFC00ACF01F00070E9C79 :10710000F01F0006E3CD80808003D9AC8002634C81 :107110008002653C8002D298800091E8EBCD40F877 :10712000203D1896169414931295E06C00C8F01F39 :1071300000151897C1C033C8F946006499F8F9449E :107140000068F94300A430CA300B1A9CF01F000EEF :107150006A2850286A0950096A181A9C5018F01FAA :10716000000BEF4C00AC1A961898C0500E9C2FDD07 :10717000E3CD80F80E9C1097F01F0005CF8B000028 :1071800080028F24800091D08002D2C4800091E8D8 :10719000189948A8700C580CC051C0D878FC580CED :1071A000C0A078081238CFB1781816385E0C78FC79 :1071B000580CCF815EFD000000007AB01899489805 :1071C000700C580CC051C0C878FC580CC09078089E :1071D0001238CFB178181638CF81782C5EFC5EFD5E :1071E00000007AB0189B4888700C580CC0A0189901 :1071F000300A2FFA72F95809CFD1149897085EFC1B :107200001898CFDB00007AB05EFDD703EBCD40E0ED :1072100048D81896169570075807C051C0E86EF701 :107220005807C0B06E2C0C9BF01F0008CF916E0861 :107230008B086E1CE3CD80E030088B08109CE3CDFA :1072400080E0000000007AB0800091A0EBCD40C04B :1072500048B70E966E095809C0B072F88D08129C96 :1072600072D85808C0705D186E095809CF71E3CD07 :1072700080C0129CF01F0003CEEB000000007AB02B :10728000800091E8EBCD40C048D66C485808C0312A :10729000C0880E987057109CF01F000A5807CFA1A5 :1072A0006C6CF01F000930086C3C8D68F01F000505 :1072B0006C8CF01F0004E3CD80C0000000008C90B7 :1072C000800091E880014544EBCD40F8495718967D :1072D000169314946E2B12952FFB6E3CA56BF01F2A :1072E0000012C1D06E28A568F80809066E29A569A4 :1072F000F8090009932593146E2AF4081504F80878 :10730000000891336E188F3C2FFA1036EFF69A0171 :107310008F2A3018300C8FC8E3CD80F8E3CFC0F847 :1073200000008C90800091F4EBCD404CE0634DD395 :10733000EA1310621896F01F000DF8030648A7899B :10734000E06A03E8F20A0248F8080109121CF20A8E :10735000024AF80304428D1ABF5CA743E60C010CF5 :107360008D0CE3CD804C0000800145C4EBCD408006 :10737000202D4A076E495809C2C06E581039C29074 :107380001A9CF01F001D6E484009700A1439C2444F :107390007018401BF40901091618C276F00B141F6F :1073A000E06A03E8F20A024AE0694DD3EA19106282 :1073B000F0090448A7491619F20A000C580CE08A93 :1073C000000E300948DA6E6BF01F000D6E488F58C2 :1073D0002FEDE3CD80801439C030301CCF3B7018C6 :1073E000401B103BCFB4CD7B2019F028BDC0CD7B16 :1073F00000008C9080027328800275188001455827 :10740000D43149A0189516931492604C580CC2B010 :1074100030060C940C91785778480A38C09018962A :107420000E9C5807CF91F01F0012089CD8325BF3D6 :107430005F0A782906395F081448E2081800CF006F :107440005BF25F0A783904395F081448E2081800D3 :10745000CE705806E1F70A04EDF71A052FF4F01F75 :107460000005CDFB1894CE0B00008C908002736C4D :10747000800091E8EBCD40FC18961695149212947A :107480001093318CF01F00211897C3A0F01F00202B :107490006E0A6E1B0C0AEA0B000B8F0A8F1BEE5B49 :1074A000423FE08A000B2FFAEE3B42408F0A8F1BCF :1074B000EE5B423FFE99FFF98F248F338F423008F5 :1074C0008F58494C78495809C1D072081438E0895E :1074D000001A2F0CC0A8F2CCFFEC72595809C0A0BA :1074E00072081438E0890007103ACF617218103B17 :1074F000CF348F599907F01F0008E3CF80FCE3CF0A :10750000C0FC2F0CCF7B000080009200800273280B :1075100000008C908002736CEBCD40E0202D49661A :107520001A9CF01F00166C475807C1F040096E08FE :107530001238E089001B3005C05840096E08103928 :10754000C1451039C0516E1940181238C0E56E5847 :107550008D558D486E3B6E486E2C5D180E9CF01F4D :1075600000086C475807CEA1F01F00062FEDE3CFAF :1075700080E0000000008C9080027328800091E879 :107580008002736CEBCD408049A76E3E580EC2B0AE :107590006E2A580AC280E08A002B7C081838C27014 :1075A000FCC9FFF0300BC05872082F091838C050C2 :1075B0002FFB163AFE99FFFA143BC170201A163AB7 :1075C000C0F0161AF60C1504A56AFC0C000C2FFB73 :1075D000A56BFC0B000BF01F00086E2A201A301858 :1075E0008F2A8FC8E3CD8080E3CD8080300BCE7BA7 :1075F00000008C90800091C4EBCD406048861895C7 :10760000334A300B0C9CF01F0007ECCCFFE88D05D3 :10761000301BF01F0005E3CF8060000000008C905D :10762000800091D0800144F80050F2010100000078 :107630000000000000000000F6F800DC5808C05010 :10764000F8F800F85808C0205EFDF6FB00D0580B93 :10765000CFC076085808C04176185808CF602F8BE5 :10766000CF9BD703EBCD4080300B1897F01F001352 :10767000306A300BEECCFF64F01F0011306A300B23 :10768000EECCFF5EF01F000E300BEEFC00E0F01FB2 :10769000000D300BEEFC00E0F01F000BEEF800BC1C :1076A0005828C030E3CD8080EEFC00E0300BF01FA6 :1076B0000007E3CD80800000800217D0800091D0C9 :1076C000800261E8800261D4800261A4EBCD408039 :1076D0001897F8F800945808C160300BF94B0094E3 :1076E000F8F800D470985808C040F8FC00C45D1841 :1076F000486A302B0E9CF01F0006300A0E9C149B2B :10770000F01F0004E3CD80808003D9D480023A1AB0 :1077100080022584D431209D500C761558155F9831 :107720007607169058075F1910693008F00918009D :10773000E08000B8EEC4FFFF0989F2C6FFFE0C35F9 :10774000E08500B010923DD33301C168E208180013 :10775000C2800C0758155F9958075F181268E40833 :107760001800E080009EEEC4FFFF0989F2C6FFFE0C :107770000A36E08900960C150F88E6081800CE71CD :10778000305AF4091800FE98FFE6EECCFFFE306A8E :107790004DFBF01F0060C0B00F88E2081800CDA1BB :1077A00009883019F2081800FE98FFD540080E9B92 :1077B0000C9AF0FC00DCF01F00581897C711400A23 :1077C000FACBFFFCF4FC00DCF01F0054C21540793A :1077D0005809C1E040685808E0890007C19840682E :1077E0001037C1644079EE0B1504F20B000B400911 :1077F0003008F2FC00DC2FF71099109AF01F0048B7 :10780000CEF14008301BF0FC00E0F01F004660465F :10781000605558065F1958155F981069C760ECC429 :10782000FFFF0989F2C7FFFE0E35C6F53003069249 :107830000691C1A85802C0610D88330AF4081800E7 :10784000C3A00E060E1558065F1858155F991268EA :10785000E2081800C3F0ECC4FFFF0989F2C7FFFE7D :107860000A37E08900385803CE610D883DDAF40804 :107870001800CE113058F0091800FE98FFDD306A6C :107880004A3BECCCFFFEF01F0023CD5140090E9A7D :107890000C9BF2FC00DC3013F01F0023CCCB600704 :1078A0005807CB604009300AF2FC00DC149BF01F43 :1078B000001ACAEB09883019F2081800FE98FFC3B5 :1078C00040080E9A0C9BF0FC00DC3012F01F0017F1 :1078D000CB9B5803C0F05802C0B160485808C08024 :1078E0004008049AF0FC00DC049BF01F00102F7D80 :1078F000D83260465806CF004009300AF2FC00DC5E :10790000149BF01F0009CE8B3002CF5B80027628DB :107910008000917C8002B5EC8002C04C8002938094 :10792000800255968002B58C8002B52CD431FACDF8 :10793000009018911497586BE08B00C4FEF807482C :10794000F00B032F580AC0A0F8F800907009739A42 :10795000580AC0410E9BF01F01CD304B029CF01F16 :1079600001CCE2F801185808E0810312FAC7FF942D :10797000E2F800D470285808C4C00E9BE2FC00C492 :107980005D18C475E2C6FF64306A0C9B0E9CF01F44 :1079900001C1C3F0FB3800711AD8FB3900741AD941 :1079A000FB3800771AD8FB39007A1AD9FB38007DEA :1079B0001AD8FB390080FEFA06DE1AD9301B029C69 :1079C000F01F01B6306A0E9B0C9CF01F01B5306AA7 :1079D000300BE2CCFF5EF01F01B3E2FA00BC2FAD2A :1079E000584A5F08590A5F091248C081588AE080E6 :1079F000030C0E9B029CF01F01ACE2F80090704952 :107A00005819E08102D5E2F800B05808E08002D0B1 :107A1000FB3800711AD8FB3900741AD9FB3800778B :107A20001AD8FB39007A1AD9FB38007D1AD8FB39ED :107A30000080302B1AD9FEFA0672029CF01F0197C3 :107A4000E2FB00B02FAD580BC040029CF01F019824 :107A50000E9BE2FC00DCF01F0197622CF01F0196E8 :107A6000300BE2FC00E0F01F0195300BE2FC00E07F :107A7000F01F0193E2F800BC5828C061300BE2FC13 :107A800000E0F01F0190301BE2FC00E0F01F018BD2 :107A9000300BE34B00F4E2F900BC59095F0A584986 :107AA0005F081448F6081800E0800216029CF01FD8 :107AB0000186307B029CF01F0176029CF01F01833F :107AC0002DCDD832580ACFD0149B7439F8FC00DC85 :107AD000742AF01F017F2DCDD832F8FB00BC590B62 :107AE000CF00F8F800E85858E08002355838E08BAD :107AF0000234E2C7FF64306AFEFB05D80E9C2F8B70 :107B0000F01F0164EE0B1710E06800A2E3D8E00B51 :107B1000029CF01F0171E2FC00DCF01F0170FEFA14 :107B200005BE302B029CF01F015DE2FA00BC584AF2 :107B30005F08590A5F091248C0B1588AE08002976D :107B400030080E9BE3480104029CF01F0157029C81 :107B5000F01F01642DCDD832FEFA058C303BF01FAA :107B6000014F5807E08002806E0858085F1B169A84 :107B7000E2FC00DC301BF01F015DFACCFF94F01F2B :107B8000015CE2F800985808E08001D541B9F2089C :107B90000108E048003CE08A01A6E34900982DCDA9 :107BA000D832F01F0154E08501EBE2F900907248F1 :107BB0005828C870E2F800AC5808C831E2FA00CC86 :107BC0001094500AE2F000D072285808E08A00A908 :107BD000300850187218401AF00A032850585800FC :107BE000E08A0097400530020A96C11808973003D2 :107BF00030142FF2ECC6FF6404305F983009E9E8D6 :107C00000008F2081800E08000970E940C9B029C7C :107C10000C93F01F0139C05078385818FE99FFE8CE :107C20006D585808C051ECF800805808CE004059F3 :107C30005809CDD0ECC8FFFAECCAFFA8ECC9FFD4B4 :107C40005048502A50394057C0486E175807CCF05A :107C5000EEF801945808CFA16CAA6E58103ACF6183 :107C60006E4B404CF01F010BCF116E885808E0811D :107C700000E16F6AEDBA0001C061ECFB0080580BB7 :107C8000E08100E3F1DAC001300AF4081800CDE029 :107C90006D5B580BCDB0FACAFF94403CF01F011742 :107CA000CD516F6841B91268CD106F3841C9126863 :107CB000CCD06F4841D91268CC906F5841E9126816 :107CC000CC5058065F04C96B149BF01F00F02DCDFB :107CD000D832149B2EACF01F010A1896FE91FEF2CA :107CE0006F9B580BE080012A581BFE91FEEBE34B83 :107CF00000D8029CF01F00FB622CF01F01028326BB :107D0000CE0A5803E08100BF0E94E2F900904018BB :107D10002FF850187228401A103AFE95FF5DE2F8CD :107D200001085808E0800121029CF01F00F7E2F9E9 :107D30000090C4BB5804CE600E923006C108049770 :107D4000089930032FF6EAC5FF640C305F98F3E81A :107D500000083009F2081800CD500E920A9B029CD0 :107D60000A93F01F00E5C05078385818FE99FFE9D3 :107D700040585808CE50EACAFFFA4057506AC078B7 :107D80006AA8103AC5006E175807CDA0EEF8019406 :107D90005808CFA16E5A580ACF416E885808C1E1E1 :107DA0006F5BEDBB0002C040EDBB0003CED1F1DB49 :107DB000C002C0806B585808CE71EAF8008058089D :107DC000CE31EEF8014C5808C110EB190088EDB91E :107DD0000001CDA058055F09CB6B306AEECBFFE800 :107DE0000A9CF01F00ACCD01CDCB1099EEC8FECCA3 :107DF0002FF9700A580AC2612FC85849CFA1EDBBAC :107E00000003C071EEF800F0F1D8C002F9BA010128 :107E1000EB190088EDB90004C030580A5F0A580A0F :107E2000CB30CD6B6E4B406CF01F009ACAD1CB6B40 :107E3000306AEECBFFE80C9CF01F0096FE91FF0726 :107E4000C19B301ACDDBFACAFF94402CF01F00AB67 :107E5000C0306F6AC18B6F6A41B8F5E80008FE90C8 :107E6000FF136F3841C91268FE90FF0E6F4841D969 :107E70001268FE90FF096F5841E91268FE90FF04F6 :107E8000C21BE2F800A85808C131306AE2CBFF6497 :107E9000069CF01F0080C170E2F800E85838C081ED :107EA000306AE2CBFF5E069CF01F007AC0C00E9BDA :107EB000029CF01F007FE08100B50E9A069B029C99 :107EC000F01F0092009A400BE2FC00DCF01F0090D3 :107ED000FE9FFDF8169A029C30ABF01F008EFE9FAD :107EE000FDEE3017FEFA0230303B029CE34700946F :107EF000F01F006AE06B2710300CF01F0088E2F8DA :107F000000D470985808C0500E9BE2FC00C45D1865 :107F100030EB029CF01F0082300A029BFEFC020440 :107F2000F01F0081300802994FEA109B33CCF01FFC :107F3000007F41B9FE9FFE33E2F800D85808FE905A :107F4000FDC1E34B00D8029C301BF01F0079FE9F5F :107F5000FDB9582BC780E07A86A0300B029CF01F39 :107F60000075FE9FFDC8305BE2F801105818C7206D :107F7000029C300AF01F006FFE9FFDA4E2F9009002 :107F800072485828FE90FD9E301BCEFBFAC7FF9426 :107F9000E2C6FF64306A0C9B0E9CF01F0041E2F8C1 :107FA00001185808FE91FCF8FE9FFCE4029CF01FAB :107FB00000621896C230F8FB0194580BC1F1795851 :107FC000E2180013C351189B029CF01F005CE2F8FA :107FD00000B05808C0701036C050E2FC00E0F01F3E :107FE0000058E2FC00DC0C9BE34600B0F01F00559B :107FF000029CF01F0055FE9FFD0D029C303BF01FC0 :108000000053FE9FFD5FE2F800B05808FE90FCF3BD :10801000F0F800F0F1D8C002FE91FCEDFE9FFCEFFD :10802000029C300A30ABF01F0043FE9FFD4B350928 :10803000FAC8FF70189A10D9029CFAC9FFE4F01F21 :108040000044CC6B4C3AF01F0015E2F800E8FE9FAC :10805000FD4F72485818F9B80002E3F80A44F9BB1A :108060000000C87B0E9BFE9FFD84E2F800B058081C :10807000FE90FD68F0F800F0F1D8C002FE91FD62BC :10808000FE9FFD678003D9B880027714800217D065 :108090008000917C8003D9F880023A1A800091DC3C :1080A000800091D0800226948003DA3880027638EE :1080B0008002BA4C80028172800261E8800261D441 :1080C000800261A480021CE080021DB88002979C9F :1080D0008002762880021AE08002BA1C8003DAA8A7 :1080E000800276648003DAE48002D19C80028F549F :1080F00080021E84800218F88002BD68800091A072 :10810000800281748002189C800230DC800298A476 :108110008002246C8003DB0480028F1C800228D83C :10812000800276CC800274008002747480022794EE :10813000800225848002195C800222A480025748B4 :108140008002B9D48002237080022FCC80021F30BD :108150008003DA68580C5E0E5E1DD401201D3008C5 :10816000767C3009BA881A9A7668129B5D182FFDC2 :10817000D8025EFCEBCD40801897580CC090789CDC :10818000580CC035F01F00040E9CF01F0004E3CD16 :108190008080000080027584800091E8EBCD40F87B :1081A0001896129510944063328CF01F000B1897AC :1081B000C0F00C9B311AF01F00093FFC8F658F74D3 :1081C0008F838F9C30090E9A485BF01F00060E9C2F :1081D000E3CD80F880028F24800091AC8002815A28 :1081E000800272C8D4011698306AF8CBFFEF109C59 :1081F000F01F0002D80A0000800091DCD431213D3C :1082000076FE511E760A503A761950497628505813 :10821000763E506E764A507A7669508976785098D4 :10822000768E50AE769A50BA76B950D976C850E864 :1082300076DE189850FEF8C9FFF876EA510A7654AF :1082400076AB500C5019E02BA44F50CB110EF8CB4D :10825000FFF45008512E403A700340487205502BED :10826000E069A478EA19D76AFC0900091409760ABA :10827000E06BB756EA1BE8C7F40B000B100BF5E5F3 :108280002008066814581009E06870DBEA182420FA :10829000EBE3200AF20E1507FDE9139E060EFDEA38 :1082A000000A0A5A1005140BFDE32008F606150C07 :1082B000EDEB13461C06EDE800080658405AE0694D :1082C000CEEEEA19C1BD14051005EDEE2008EA0B4B :1082D0001511F7E512FB0C0BF7E800081C58120308 :1082E0004069120310034078E6051516E0690FAFE8 :1082F000EA19F57CEBE312A5F00900091605F7E68B :108300002008EBE800080C581C091009EBEB2008CA :10831000F2031507E7E913930A03E7E80008165884 :10832000E06AC62AEA1A4787E80A000A0C0A100A15 :10833000E7E52008F402150CE5EA13420602E5E839 :1083400000080A58408EE0694613EA19A830FC0973 :10835000000916091009E5E32008F2061511EDE9F8 :1083600012F60406EDE800080658409AE06B950105 :10837000EA1BFD46F40B000B0A0B100B40A840C98A :10838000F60E1516FE395BB1FDEB12AEE06A98D819 :10839000EA1A69800C0E40BBF00A000AEDE22008E0 :1083A000FDE80008045840C1060A50C9100AE069F7 :1083B000F7AFEA198B44FDE62008F6090009F40B33 :1083C0001507F7EA139B1C0BF7E800080C58F7EEAB :1083D000200A0C0104091009F206150CEDE91346F8 :1083E0001606EDEB2008EDEA000A1C5A1401E2051E :1083F0001511EBE112F50C05EBE80008165840DA10 :10840000E069D7BEEA19895CF40900091C09100962 :1084100040E8F20E1516E06A1122EA1A6B90FDE9A7 :1084200012AEF00A000A0A0EEBE62008160AFDE872 :10843000000840FB0C58E0697193EA19FD98100A96 :10844000F6090009FDE52008F40B1507F7EA139B70 :108450001C0BF7E800080A580C0910094108F2063D :10846000150CE06A438EEA1AA679EDE91346F00A84 :10847000000A1606F7EE2008EDE800081C580A0A64 :10848000100A4118F4051511E0690821EA1949B4E8 :10849000EBEA12F5F00900090C05EDEB2008EBE81A :1084A000000816581C091009F2031516E7E912A373 :1084B0000A03E7E520080C680A58404EE06A256286 :1084C000EA1AF61EFC0A000A160A408B100A40D867 :1084D000F40E1505E069B340EA19C040FDEA13BE89 :1084E000F6090009060E403B0C09E0665A51EA16EF :1084F000265EF0060006FDE320080A68065810090B :10850000E062C7AAEA12E9B6F6020002F20B150908 :10851000F7E9137B41191C0BF7EE200806681C587D :108520000A0606021006E063E681EA13D8A1F20308 :108530000003EC09150EF3E613291609F3EB2008E6 :108540001C68165840CA10024078E065105DEA15B4 :10855000D62FE0611453EA110244E8050005F40146 :1085600000011C051601E40A1514E06EFBC8EA1EA2 :10857000E7D3F5E212CAF00E000E120AF5E9200860 :10858000166840BB125812031005E066CDE6EA16E5 :1085900021E1F6060006EA0B1505F7E513BB140BFF :1085A000F7EA2008126841091458E06507D6EA1571 :1085B000C3371001F2050005E2091509F3E113794B :1085C0001609F3EB20081468165810034068140EBF :1085D0001606E60A150EE0620D87EA12F4D5F5E3F9 :1085E000132AF0020002120AF5E92008166840ABCF :1085F00012581205100EE06314EDEA13455AF60303 :108600000003FC0B1514F7EE12CB140BF7EA20084D :10861000126840F91458E061E905EA11A9E310066F :10862000F2010001EC091505F3E613B91609F3EBA5 :10863000200814681658100540581402E066A3F884 :10864000EA16FCEFEA0A1509F0060006F5E5137ACA :10865000120AF5E9200816681258409E1002160307 :10866000E40B150EF7E2132B140BF7EA200812683F :108670001458E06502D9EA15676F1003FC05000580 :10868000E60E1514FDE312CE160EFDEB200814685D :1086900016581201100140A840E91406E060F68166 :1086A000EA108771E20A1505F0000000F5E113BA3F :1086B0001C0AF5EE200816681C58E0624C8AEA1283 :1086C0008D2A1006F2020002EC091509F3E613796F :1086D0001409F3EA20081C681458160540DB10053D :1086E0004108E434C6BEE0616122EA116D9DE80AEA :1086F0000007F6010001E066380CEA16FDE5F00619 :108700000006EA08150EF1E513281208F1E9200B1E :10871000F7EA000A125A1C021402407A404E120074 :108720001001E063CFA9EA134BDEF4030003E40A6F :108730001514F5E212CA100AF5EB200BF5E8200833 :10874000EE0B000BF6091504F3EB13C914091258CC :1087500014061000F3EA200AE065EA44EA15A4BE14 :10876000E008150BFC050005F1E01358120512088E :10877000105A10031401F1E92009E20B1510F7E17A :10878000130B100B1659F7E820081206EC0E1517FC :10879000FDE6129E160E1C5810054098FDEB200AAF :1087A000EA061504E0694B60EA19F6BBEDE513C66D :1087B000F00900091C0616090C5AEDEE20081403F6 :1087C00040CBE605150BEBE313550C050A58E06AA0 :1087D000BC70EA1ABEBF1009F60A000AEBE62008D0 :1087E000F20B1510F7E9130B0A0B16581C0A100AA6 :1087F00040F8F40E1517E0697EC6EA19289BFDEAD9 :10880000129EF0090009160EF7E520081C580C0905 :1088100010094038F2061504E06A27FAEA1AEAA1BC :10882000EDE913C6F00A000A1C06FDEB20080C58FF :108830000A0A100A4068F405150BE0693085EA1948 :10884000D4EFEBEA1355F00900090C05EDEE200812 :1088500016090A58408B1009E06A1D05EA1A0488B7 :10886000EBE62008F60A000AF20B1510F7E9130BE5 :108870000A0B16581C0A100A40B8F40E1517E069C6 :10888000D039EA19D9D4FDEA129EF0090009160E72 :10889000F7E520081C580C09100940E8F2061504F9 :1088A000E06A99E5EA1AE6DBEDE913C6F00A000A88 :1088B0001C06FDEB20080C580A0A100A4118F405A2 :1088C000150BE0697CF8EA191FA2EBEA1355F009D1 :1088D00000090C05EDEE200816090A58405B100946 :1088E000E06A5665EA1AC4ACEBE62008F60A000A0C :1088F000F20B15101C0AF7E9130BE0692244EA1980 :10890000F4290A0B1658100A4032F40E15171202F9 :10891000FDEA129EEA0811FF160E409AFDE81008C3 :10892000E069FF97EA19432A1658F40900090A0971 :108930000C0241061002F60811FFE40A1506F5E2E2 :1089400013AA1C0AF5E810081C58F2080005E06993 :1089500023A7EA19AB941206FC0811FFEC0B000BDD :10896000EA06150AEDE513661406EDE8100814583A :10897000F6080008E069A039EA19FC93F00B150F1E :10898000FA243942F7E8131BE80900050C0BEA0E3C :10899000000EF40811FFF7E810080C58E06959C3FD :1089A000EA19655BFC08000540E2EA0E15151202A3 :1089B000FDE512BEEC0811FF160EFDE81008165872 :1089C000E40A000AE069CC92EA198F0CF40800026C :1089D0004068F00900090C09E40A1506F60811FFC1 :1089E000F5E213AA1C0AF5E810081C58F208000268 :1089F000E069F47DEA19FFEF40C1FC0811FF1201A4 :108A0000E406150AE20B000BE0695DD1EA198584E2 :108A1000EDE213661406EDE8100814584045F60818 :108A200000011205E20B150FEA0E000EF7E1131B11 :108A3000F40811FF0C0BE0697E4FEA196FA8F7E804 :108A4000100840A30C581203E60A000AFC080005AF :108A5000EC0811FFEA0E1515FDE512BE160EFDE835 :108A600010081658F4080003411AF60811FFE069CF :108A7000E6E0EA19FE2CF4090009E60A15060C09DD :108A8000F5E313AA1C0AF5E810081C58F2080003C5 :108A90004088E0694314EA19A301F00900091609A6 :108AA000FC0811FF40FBE605150AEBE3136514050E :108AB000EBE810081458F2080008E06911A1EA195F :108AC0004E08F6090009F20E000EF006150FE069D7 :108AD0007E82EA19F753EDE81316F40811FF0A062F :108AE000EDE810080A58FC080001407E120EEA0862 :108AF00011FFFC0A000AE20E1515FDE112BE0C0E74 :108B0000FDE810080C58F40800094128F20A15067F :108B1000F5E913AA1C0AF4080009E068F235EA181E :108B2000BD3A990940D91009EC0811FFF205000B74 :108B3000F5E8100840091C58720CF6080001E069BD :108B4000D2BBEA192AD740581208E20B150AF006E0 :108B50000009F7E1136BFC0811FF140BF7E810088C :108B60001458F208000640B8E069D391EA19EB8680 :108B7000F0090009F20E0008F40A11FF400EEC099A :108B8000150FF3E613191609F20C000CF3EA100A9C :108B9000165AF00A0006EC081515F1E612B8100C8A :108BA0009D0C401A7408120895084028700916098F :108BB00091092EDDD832D703EBCD40E03809764855 :108BC000F1D8C066F608000AF56900181895F00A91 :108BD000113F1697F6080008F0CCFFE7587AE08BB3 :108BE0000056300BF01F002DEEC6FFE8EECCFFA8BC :108BF0000C9B1798178917BAF3E8108917A8F1EAA0 :108C00001088F3E8110916A9183BCF410C9B0E9C64 :108C1000F01F0023338A300B0C9CF01F00200C9BAC :108C2000ECCCFFC81798178917BAF3E8108917A872 :108C3000F1EA1088F3E8110916A9183BCF416E48F4 :108C40006E590C9B0E9CEF480050EF490054F01FEA :108C500000140E9BEECCFFF01798178917BAF3E8B3 :108C6000108917A8F1EA1088F3E8110916A9183B32 :108C7000CF410E9B0A9C310AF01F000A0E9C304A1D :108C8000300BF01F0006E3CD80E0208A300BEEC6EB :108C9000FFE8F01F0002CC4B800091D0800281FCE5 :108CA000800091DCEBCD40FC1493784AF40300384B :108CB000103AF9F98005F9F9B005F7B90BFFF9F9A0 :108CC000BA059948E608161DF20800089958189444 :108CD0001692F1DAC066C381F8C5FFE8E043003FB1 :108CE000E088002C3006EAC7FFC0E406000B340A17 :108CF0000A9CF01F00290A9B1798178917BAF3E8F6 :108D0000108917A8F1EA1088F3E8110916A90E3B9B :108D1000CF410A9B089CF01F00212C06E6060108A3 :108D2000E048003FFE9BFFE3E6C80040E7D8C006EE :108D3000E018FFC02C081002069A049B0A9CF01F42 :108D40000016E3CD80FCF00711402E88100C0E3386 :108D5000C1D30E9AF01F0010E8C5FFE8E8CCFFA8C9 :108D60000A9B1798178917BAF3E8108917A8F1EA30 :108D70001088F3E8110916A9183BCF410E130E0213 :108D80000A9B089CF01F0005CAAB069AF01F000260 :108D9000E3CD80FC800091DC800281FCEBCD40FCC7 :108DA000216DE0682301EA186745E06EAB89EA1E91 :108DB000EFCD30075008501EE068DCFEEA1898BA84 :108DC000E06E5476EA1E1032504750575028503EFD :108DD00018931292580CC140149416951A962FF7B6 :108DE000090A0B0B1A9CF01F00080E33FE9BFFF9BB :108DF0001A9B049CF01F00052EADE3CD80FC1A9653 :108E0000CF8B000080028CA480028BB8D431FACDC5 :108E10000088501C500B14931292109142B0585A73 :108E2000E08B0056E04B0040E08B0054FAC4FFF8A2 :108E3000340A300B089CF01F002E400A401B089C8F :108E40000896F01F002CFAC5FFB808970D88EC189B :108E500000360CC80A36CFB1340851845128580363 :108E6000C110FACCFF9CFACBFFB4300AE60E150213 :108E7000E40A030818A8E20A030916A92FCA1C3A33 :108E8000CF81E6CCFFFF00990A9AFAC3FFA0069BA8 :108E9000F01F0019340A300B089CF01F0015400A1F :108EA000401B089CF01F00130F88EC18005C0EC8D4 :108EB0000C37CFB1310C3408513C5184519000999A :108EC0000A9A069B5128302CF01F000B2DEDD8324A :108ED000FAC6FF881A9A0C99FACBFFFC301CF01FD7 :108EE0000006310850165008CA2B0000800091D0AF :108EF000800091DC80028D9CD401202D501A5009F5 :108F0000301A1AD8FAC9FFF8FAC8FFFCF01F00039C :108F10002FFD2FEDD802000080028E0C5EFC5EFE5D :108F20005EFCD703EBCD40C01896F01F00061897E3 :108F3000C0500C9A300BF01F00040E9CE3CD80C093 :108F400080009200800091D0D401F01F0002D80A66 :108F500080014600D401F8CBFFFCF01F0002D80AC4 :108F6000800145D4780C580C5E0C3008F948004C50 :108F7000780C580CCFC15EFC580CF9FC10435EFC19 :108F8000580CF9B80100F9F81A435EFCEBCD40E04B :108F9000189716961495314CF01F0005F9F71A032F :108FA000F9F61A04F9F51A02E3CD80E080028F2465 :108FB000EBCD40E01696149578075807C160580627 :108FC000C080306A0C9BEECCFFC0F01F000AC0A12D :108FD0005805C0B0EECCFFFC310A0A9BF01F00051B :108FE000C0406E075807CEC10E9CE3CD80E0000064 :108FF0008000917CEBCD4040781820181696991887 :10900000784B78390C9C5D190C9CF01F0003E3CD64 :1090100080400000800091E8EBCD4080202D300A98 :109020001897189B49BCF01F001C300A0E9B49BCC6 :10903000F01F00196E085808C2201A9CF01F001873 :109040006E08400A70EC0E993008141C109BF8084A :109050000C4C490A2FFCF01F00136E2BF6FA010C82 :10906000580AC1006E08400A712C0E99141C300871 :1090700048AAF8080C4C109BF01F000A2FEDE3CD16 :109080008080F6CBFEB80E9CF01F0007CF80CEBBD1 :10909000800290E4800274008002913080028F543C :1090A0008002747480028FB0EBCD40C01896580CCB :1090B000C1407809300899085809C031C0880E9914 :1090C0007207129CF01F00065807CFA10C9CF01FDE :1090D00000050C9CF01F0002E3CD80C0800091E8E9 :1090E00080029018EBCD4080202D18971A9CF01F1D :1090F000000E6E0A580AC0C1C1087408149B8F087C :10910000300A0E9CF01F00096E0A580AC06074E90C :1091100040081039FE9AFFF30E9CF01F00052FED5A :10912000E3CD808080028F5480028FF480029018FB :10913000D4013008782AF548010C7829F2FC0104A2 :10914000F01F0002D8020000800255ACD43120CDBF :109150001096782814941293E04A00205FBAF0F930 :109160000160189758295F18169241511448C05051 :1091700030060C9C2F4DD832354CF01F00621890F1 :10918000CF80089A049B2ECCF01F005F81D4FAC9CF :10919000FFE450965083FAC5FFF84DC81AD5303A0F :1091A000089B049C4DA65086F01F005AE0C8FFFCA7 :1091B0000A9B5018310A109CF01F0053FACCFFD4C0 :1091C000F01F0055E0C8FFC0502840BC6E29F2F8DF :1091D0000150F808000881E86E2AF4FB0150F4F908 :1091E0000154E06A851FEA1A51EBB739F20A0648C2 :1091F000301AA599180981FAE1490048306A402CD3 :10920000069BF01F0041E141004C2FFD6E06580601 :10921000C2903005C0680C956C0C580CC58018962F :10922000ECCBFFC0306A069CF01F003CCF516CD8DD :109230000838C5505805EDF80000EFF80A00EDF8C1 :109240001000EBF81A006E29F2F8010C0C38F9B88E :109250000000F3F80A430C9B301A0E9CF01F0030FC :109260006E066E1859F8E08A00155806C3200C9A4D :1092700015088F086E28F0F90128ECCBFFC0720C9E :1092800072F85D180C9B300A0E9CF01F00256E06CC :109290005806C1F060EA6CE8103AC074C1A872E8E0 :1092A0001438E089000612966C095809CF9181099B :1092B0008D006E2C6E18400A401B2FF88F18F8F99D :1092C00001280096720C72E85D18C54B6E06CCAB97 :1092D00081068F000E9CF01F0013CECB089A049BD2 :1092E000ECCCFFECF01F000DCA61310A400BECCC56 :1092F000FFFCF01F000AC9F1009CF01F000BC3AB7C :1093000080028F24800091DC8003DB248003DB9CBF :109310008002B14480028F548000917C80028FF4DF :1093200080029018800091E8EBCD4080189E78076D :10933000580BC06116970E9CE3CD80806E075807CE :10934000CFB06F381638CFB11AD814997C286EDA9E :10935000F0C8FEC8EECBFFEC1C9CF01F00092FFDEF :10936000580CF8071700EFF8100EF9F81A0EF80766 :109370001710F9B80101F9F81A14CDEB8002914CDD :10938000EBCD40FC1897300CEF4C010C1496129268 :109390001094EEF50108580BC080169A189B0A9C91 :1093A000F01F0016EF4C010C58065F13EEFC010C89 :1093B000580C5F09F3E30008C16158045F18F3E833 :1093C0000008C0A05803C0800C9A049B0A9CF01FA0 :1093D000000CEF4C010C580CF9BC00FFF9BC01006B :1093E000E3CD80FC300A0C9B0A9CF01F00045F094F :1093F000EF4C010CCE3B000080028FB0800293281E :109400000000000000000000EBCD4080580CC100BF :10941000F8F901103008F94801105809C031C08826 :109420000E997207129CF01F00045807CFA1E3CDDC :1094300080800000800091E8EBCD40C01897580C68 :10944000C250F8F801245808C210189B300A491C71 :10945000F01F0011EEFC0124F01F00103006306AEE :109460000C9BEF460124EECCFEE4F01F000DEEFC59 :109470000114F01F000CEF460114EEFC0118580C0B :10948000C050F01F0008EF460118E3CD80C0000077 :109490008002996880027400800256EC800091D0AE :1094A00080028174EBCD40F8205D189716951494D6 :1094B000F8F601245806C0503FFC2FBDE3CD80F8DC :1094C000F8FA012817D81AD817C91AD917B81AD80C :1094D00017A91AD917981AD81789301B1AD9740CDA :1094E0004C6AF01F0047EEC3FEC81AD60E984C59BE :1094F000E06A88C7069BEEFC0140F01F0043EF4C7A :1095000001142F9D580CC6F0EEFC0144580CC0E02D :109510001AD6069B0E984BB9E06A88C7F01F003A2E :10952000EF4C01182FFD580CC5E0340CF01F00372C :109530001896C5B0EEF8012870099909EEF80128CF :109540003019700A4B2899199928994A99374B185C :10955000EEF9012C998899599967EEF8012871095B :1095600099A9EEF80128711999B9F01F002BEF4C59 :109570000124C3D0314A300B1A9CF01F0028EEF9A9 :1095800001305804E9F8105FFBF81A03300650293F :109590001A9A089B50165006EEFC0124F01F00207A :1095A000306830593FFAEEFC0124149BF01F001D77 :1095B000306A0A9BEECCFEE4F01F001B301BEEFC71 :1095C0000124F01F001A301BEEFC0124F01F0018CC :1095D0000C980E99497A0C9BEEFC0158F01F00166E :1095E0000C9CC6CB3FECC6AB3FCCC68B0C9CF01F93 :1095F00000133FDCC63B00008003DBA880023A1A60 :1096000080029AF08002819C80028F2480029A243A :10961000800299C48002609C800091D08002581C16 :1096200080025564800091DC800261D4800261E890 :109630008002996880027474800091E8EBCD40FC50 :109640001897F8F801105808C6F0F8F801284CAA45 :10965000700C301BF01F0049EEF801245808C0A020 :10966000EEF801284C6A700C301BF01F0044E3CD6B :1096700080FCEEF801605828CF41EEF80128700C0C :1096800070295D19587CCED1EEF8016C5818CE9136 :10969000EEF501105805C410EEC2FEB8EAC3FFFC97 :1096A000300A069BEEFC0108F01F0036306A189461 :1096B000069B049CF01F0034C0605804C3706948C6 :1096C0005808C341EB3800091AD8EB3800081AD8FB :1096D0000BF81AD80BE8EEF601281AD80BD91AD9CC :1096E0000BC84AAA1AD8301B6C0CF01F00242FADEF :1096F0005804C090EEF90128E8CAFFFC069B720CE2 :1097000072E85D186A080A9CEF480110F01F0020FB :10971000EEF501105805CC31EEF8012849DA700C4D :10972000301BF01F0016E3CD80FCEB3800091AD87F :10973000EB380008EEF601281AD80BF81AD80BE817 :109740001AD80BD91AD90BC8493A1AD8301B6C0C45 :10975000F01F000A6A08069BEEFA0134EF48011078 :109760000E9CF01F000E0A9CF01F00092FADE3CDE8 :1097700080FC00008003DBEC80023A1A8003DC14DA :1097800080028FB08000917C8003DCA0800091E893 :109790008003DCFC8003DC4C800294A4EBCD40F819 :1097A0001695189414931297F8FB0134580BC05077 :1097B000F6F801485808C5D15807C4C0E8F60110AA :1097C0005806C4A03007C0680C976C0C580CC440F5 :1097D0001896306A0A9BECCCFFFCF01F002CCF518E :1097E0005807EDF81000EFF81A00EDF80000E9F85E :1097F0000A44E04303E7E08A003BE8FA0110580A14 :10980000C4006C3B74381638C065C3B8723816385B :10981000C054129A74095809CFA18D0995061AD31C :109820000BD80B8CE8F601281AD80BC91AD90BB83B :109830001AD80BA91AD90B98495A1AD8301B1ADC16 :109840006C0CF01F0014089CF01F00132F9DE3CD3B :1098500080F8E3CD80F8310CF01F00101896C0F0AE :10986000306A0A9BECCCFFFCF01F000D8D33CC6BF3 :109870000A9AF8FC0108F01F000BC9FBE3CD80F841 :109880008D0AE9460110CCCB8000917C8003DD2459 :1098900080023A1A8002963C80028F24800091DC7C :1098A00080029328EBCD40F8208D169414971895DC :1098B000F8F801345808C470F01F0027EEC6000104 :1098C000C426E068009C1A93EC080248E8080007E8 :1098D000EAC4FEB8C0682016EEC7009C5806C3351F :1098E000EAF901346EAA7258103ACF61724BEECC8D :1098F000FFFAF01F001ACF01306A089B0E9CF01F80 :109900000017CEA0EEFB0080580BCE601A9AEECC6A :10991000FFA8F01F0013CE01189A0E9BEAFC010865 :10992000F01F0010C13079485808CD604048EDB8AC :109930000000CD213019E06A03E80E9B0A9CF01F5D :10994000000ACCAB2F8DE3CD80F84048F3D8C0019E :10995000CF3B0000800294088000917C8002BD68AB :1099600080028FB08002979CEBCD4060F9380121D6 :10997000F8F501281AD8F93901201AD9F938011F48 :109980001AD8F939011E1AD9F938011D1AD8F9392E :10999000011C489A1AD9302B18966A0CF01F000740 :1099A0000C9CF01F00070C9CF01F00062FADE3CDB0 :1099B000806000008003DD6C80023A1A80029438D7 :1099C0008002963CEBCD40E0201D1897F8F801147A :1099D0005808C0613FF60C9C2FFDE3CD80E0F8F8FD :1099E0000128300C5C791ADC5C5B700C70D6FAC80C :1099F000FFFC5D162FFD1895580CCED01899400825 :109A0000E06A88C7EECBFEE4EEFC0114F01F000410 :109A100018960A9CF01F0003CDFB000080028154C1 :109A2000800091E8EBCD40E0208D14971896580BFC :109A3000C2614A781AD8EEF60128EF3801211AD807 :109A4000EF3901201AD9EF38011F1AD8EF39011E5A :109A50001AD9EF38011D1AD8EF39011C49DA1AD981 :109A6000302B6C0CF01F001C0E9CF01F001C0E9C79 :109A7000F01F001B2F9D2F8DE3CD80E01A95320A39 :109A80001A9BF01F0018C1211A9B320AEEF801340C :109A90008F8A1AD8EEC9FEE4EEC8FEC8EEFC0108B3 :109AA000F01F001149182FFDCC6B0C9C310A1A9B3A :109AB000F01F000CC090EEF8012848DA700C302B33 :109AC000F01F0005CB7B1A9B310ACE1B8003AD2C07 :109AD0008003DE1880023A1A800294388002963C95 :109AE000800257CC8002914C8003DDB48003DDCC32 :109AF000EBCD40F81897169514931294F8F80124BA :109B00005808C090F8C6FEE4306A48BB0C9CF01FB1 :109B1000000BC031E3CD80F80C9C306A0A9BF01F2B :109B20000007CF910899069A0A9BEEFC0124F01FCA :109B30000004CF1B800294008000917C800261FCB5 :109B4000EBCD40F8FACD01001293109418961697B9 :109B5000149530081A99F2080B082FF8E048010014 :109B6000CFB1300E1A9C1C9BEC0B0709198AFC0A1A :109B700000081208FAC9FF00FDD8C0081C09F33814 :109B8000FF0018C8F36AFF002FFBFAC8FF000E3B66 :109B9000F9BB0200103CCE915805C4C0300E1C9792 :109BA0001C9CF8C8FFFFFACAFF00F9D8C008180AC1 :109BB000F53BFF00F60E0008FAC9FF00FDD8C0080B :109BC0001C09F338FF00F568FF00F36BFF002FF767 :109BD0000E35FE9BFFE85804C2A006963007F8C871 :109BE000FFFFFACAFF00F9D8C008180AF539FF00CC :109BF000F20E0008FACBFF00FDD8C0081C0BF738A6 :109C0000FF00F568FF00F769FF00F538FF00100955 :109C1000F3D9C008FACAFF00120A0D89F538FF000F :109C200012580CC82FF70E34FE9BFFDB2C0DE3CD32 :109C300080F80A9E0A9CCD0BD401129E16981899A2 :109C40001C9B149C300AF01F0002D80280029B402B :109C500000000000D431FACD0180340AFAC4FEC0FD :109C6000510C089CF01F04BF688A516A689950A97A :109C700068A8509868B65086684568216830416683 :109C800050E5685250D2686A50CA687950B968087D :109C90005158E3E8200868D50C580A586812F00AB1 :109CA000150150F2F5E813FA517A68E868F640E5D4 :109CB00040A9105940980C580A5802580059F00A07 :109CC00015010459F5E813FAF20215014178E5E9A6 :109CD00013F2519A518240C54089105968C80458FE :109CE00040E20A58045840D6F00A15010C59F5E82C :109CF00013FA005951AA419840B640D5416240CA72 :109D0000F2071501EFE913F768D9105968E80E5802 :109D1000045814580C590A59F0051501F20615019A :109D2000EBE813F5EDE913F640B851C551B641A281 :109D300068F940AA416504591459105941780C58E2 :109D400040960C580A58F2021501F00A1501E5E98F :109D500013F2F5E813FA41C851EA51D2408640A502 :109D6000409A418910594198045868C204581458BF :109D70000C590A59F0051501F2061501EBE813F527 :109D8000EDE913F6408851F6520541E268DA68C5FC :109D9000EFE220091459105941A80C5868E60C58F4 :109DA0000A58F2021501F00A1501E5E913F2F5E887 :109DB00013FA52124208522A41B968F668D568EA85 :109DC000105941C804584172045814580C590A5982 :109DD000F0051501F2061501EBE813F5EDE913F6B0 :109DE0005245523668F84222418A417541D9045998 :109DF0001459105941E80C5841960C580A58F2026F :109E00001501F00A1501E5E913F2F5E813FA4248E5 :109E1000418641A5525241F9105942080E59045841 :109E20000C5941920A580458526AF20A1501F5E990 :109E300013FAF0091501F3E813F9426841B641C578 :109E400041A2527A52894219105942280C59145889 :109E50000E590A580458F20A1501F5E913FAF009E7 :109E60001501529AF3E813F9428852A941D641B537 :109E700041E2423910594248145841CA0458145812 :109E80000C5941FA0A59F0051501F2061501EBE8E3 :109E900013F5EDE913F641D852C542A241E552B699 :109EA00042590459145942CA105942680C58420682 :109EB0000C580A5841F6F20E1501F0021501FDE9A1 :109EC00013FEE5E813F2421942781458420A42257B :109ED000125842890C581C59F00615010A59EDE830 :109EE00013F61459F20A1501F5E913FA0C951493B7 :109EF000423952E652FA4216424A52D24298045825 :109F0000125842A90C580A5942261459F00A150150 :109F1000F5E813FA0C59530A1496F2081501425A3F :109F2000F1E913F84239109C531842B806581458F6 :109F3000426A125842C90C591459424A1459F00A3B :109F40001501F5E813FAF2081501F1E913F8109B71 :109F500053384278FDEC20091059425810595019D5 :109F60004289E5EA200812584269125840195008FF :109F70004018A178F1E913F8400953484008A17846 :109F8000F1E913F853584298EBEB20091059427845 :109F9000105942A850194349E7E92009105942884D :109FA000105940185009532A4019A179F3E813F9C0 :109FB000400853694009A179F3E813F953794358EC :109FC000EDE8200942B810594298105942C850197A :109FD0004369F9E92009105942A81059401850095D :109FE0004019A179F3E813F9400853894009A17990 :109FF000F3E813F943785399F5E8200942B81C595E :10A00000105950194389F7E92009129842C9045898 :10A010001258401950084018A178F1E913F8400986 :10A0200053A84008A178F1E913F8434953B843987D :10A0300010590A591C59501943A94358125840192C :10A04000065804584012A172E5E913F253C2F00217 :10A050001501E5E813F243B84369105943780C59E8 :10A060000A5943C50A581858065853D2F202150126 :10A07000E5E913F2F0091501F3E813F943D853F9B0 :10A08000438910594398145904580C5916581858B4 :10A0900053E243F54342F20C1501F0061501F9E9CC :10A0A00013FCEDE813F643A943B80A5918580459AC :10A0B0001459435A145816585406436A4402F20677 :10A0C0001501F0051501EDE913F6EBE813F543482A :10A0D00054255416435543C904591459105943D8AB :10A0E000F20215010C58E5E913F2437654320C588C :10A0F0000A58F00A1501F5E813FA544A890A442966 :10A1000043864365437A43E8125843F90C5804598F :10A110000A584392F0061501EDE813F654568916D5 :10A1200004591459F2051501EBE913F55465892515 :10A13000444243AA4389F9E2200814581258F00215 :10A140001501E5E813F25472439544090C5943B6DE :10A1500089320C590A59F20A1501F5E913FA548AA1 :10A16000894A43C6446943A5441812580C580A58F2 :10A17000F0061501EDE813F6549643BA4429045944 :10A1800043D2895604591459F2051501EBE913F528 :10A1900054A58965448243EA43C944380458145895 :10A1A0001258F0021501E5E813F254B243D54449C0 :10A1B0000C5943F689720C5944080A59446A045AE6 :10A1C000105A0C5AF2061501EDE913F654C6447BF9 :10A1D00089860C5BF4061501EDEA13F654E6441586 :10A1E00044A243E9445889A60A5B045818581258F7 :10A1F000F0051501EBE813F554D58995185BF602C7 :10A200001501E5EB13F254F289B2444A4489449BA8 :10A210000A590C5B4405442644A804581458F3E634 :10A22000200A0C580A5A5028E0657999EA155A8292 :10A23000504A410644325116441AEE050009F7E22D :10A2400020081458E062EBA1EA126ED95038507918 :10A25000040E0C99506EE068BCDCEA188F1B0C9A57 :10A26000100C2F8A505C512A1306511941087403AF :10A27000720C2F485138410A2F0A514A700A41483E :10A28000700941580A08F0090009EC081505F1E6C3 :10A2900013B8F2080008F5E3200918691459F00909 :10A2A000000740F80A08F00A0009F80B151EF7EC41 :10A2B000122BF7E320080C680658F2080008EE0994 :10A2C0001505F3E713B9EC0A151EF009000EF5E6C3 :10A2D000122AFC091505F7EA2008F3EE13B9EFE896 :10A2E000000816580A01EE0C151E0601F9E7122C9B :10A2F0001001F9EA200812011C68E209150514583A :10A30000F3E113B90A001600100040E812000A0831 :10A31000F00A0009FC0B151EF7EE122BF7EC2008D3 :10A3200002681858F2080008E0091505F3E013B9AF :10A33000F009000640D80A08F00C0009E20A151ED0 :10A34000F5E1122AF5EB200800681658F20800081B :10A35000EC091505F3E613B9F009000E40C80A0828 :10A36000F00B0009E00C151EF9E0122CF9EA2008A8 :10A370000C681458F2080008FC091505F3EE13B92F :10A38000F009000340B80A08F00A0009EC0B151E9A :10A39000F7E6122BF7EC20081C681858F2080008A2 :10A3A000E6091505F3E313B9F009000641680A0848 :10A3B000F00C0009FC0A151EF5EE122AF5EB200838 :10A3C00006681658F2080008EC091505F3E613B9FB :10A3D000F009000E40A90A091609E60C151EF9E35A :10A3E000122CF9EA20080C681458F2080008FC093D :10A3F0001505F3EE13B9F009000340980A08F00AB6 :10A400000009EC0B151EF7E6122BF7EC20081C6870 :10A410001858F2080008E6091505F3E313B9F00926 :10A42000000640890A091809FC0A151EF5EE122AD1 :10A43000F5EB200806681658F2080008EC09150527 :10A44000F3E613B9F009000E68C80A08F00B00091A :10A45000E60C151EF9E3122CF9EA20080C681458D2 :10A46000F2080008FC091505F3EE13B9F009000124 :10A4700068D90A091409EC0B151EF7E6122BF7EC44 :10A4800020081C681858F2080006E2091505F3E1D7 :10A4900013B968E8EC0900030A08F00C0009FC0A8B :10A4A000151EF5EE122AF5EB200802681658F20880 :10A4B0000008E6091505F3E313B9F009000E68F981 :10A4C0000A091609E20C151EF9E1122CF9EA200816 :10A4D00006681458F208000BFC091505F3EE13B9D1 :10A4E0004178F60900000A08F00A0009E606151E80 :10A4F000EDE31226EDEC20081C681858F208000A5B :10A50000E0091505F3E013B9F409000341890A09CC :10A510001809FC0A151EF5EE122AF5E62008006857 :10A520000C58F208000CE6091505F3E313B941983D :10A53000F80900010A08F0060009E00B151EF7E013 :10A54000122BF7EA200806681458F2080008E209FE :10A550001505F3E113B94077F009000E1407FC0963 :10A560001505E60A151EF3EE13B9F5E3122AF5EB0D :10A57000200802681658EE080008F009000341A8F8 :10A580000408F00B0009E20C151EF9E1122CF9EA9F :10A5900020081C58F2080008E6091505F3E313B972 :10A5A000F009000541B904091409FC0B151EF7EE6A :10A5B000122BF7EC20080658F2080008EA091505E6 :10A5C000F3E513B9F009000641C80408F00C0009CE :10A5D000E60A151EF5E3122AF5EB20080A58F208E0 :10A5E0000008EC091505F3E613B9F009000E41D98E :10A5F00004091609EA0C151EF9E5122CF9EA2008DF :10A600000C58F2080008FC091505F3EE13B9F0091F :10A61000000541E80408F00A0009EC0B151EF7E6F6 :10A62000122BF7EC20081C58F2080008EA0915055F :10A63000F3E513B9F009000641F904091809FC0A09 :10A64000151EF5EE122AF5EB20080A58F20800084C :10A65000EC091505F3E613B9F009000E42080408E9 :10A66000F00B0009EA0C151EF9E5122CF9EA200896 :10A670000C58F2080008FC091505F3EE13B9F009AF :10A680000005421904091409EC0B151EF7E6122BFC :10A69000F7EC20081C58F2080008EA091505F3E554 :10A6A00013B9F009000642280408F00C0009FC0A5E :10A6B000151EF5EE122AF5EB20080A58F2080008DC :10A6C000EC091505F3E613B9F009000E4239040947 :10A6D0001609EA0C151EF9E5122CF9EA20080C58A7 :10A6E000F2080008FC091505F3EE13B9F00900059E :10A6F00042480408F00A0009EC0B151EF7E6122B7D :10A70000F7EC20081C58F2080008EA091505F3E5E3 :10A7100013B9F0090006425904091809FC0A151E6C :10A72000F5EE122AF5EB20080A58F2080008EC09A9 :10A730001505F3E613B9F009000E42680408F00BA2 :10A740000009EA0C151EF9E5122CF9EA20080C584C :10A75000F2080008FC091505F3EE13B9F00900032F :10A76000427904091409EC0B151EF7E6122BF7ECDD :10A7700020081C58F2080008E6091505F3E313B990 :10A78000F0090005428904091809FC0A151EF5EEB6 :10A79000122AF5EB20080658F2080008EA09150508 :10A7A000F3E513B9F009000E429904091609E60C05 :10A7B000151EF9E3122CF9EA20080A58F208000BDA :10A7C000FC091505F3EE13B9F609000042A90409C6 :10A7D0001409EA06151EEDE51226EDEC20081C58BA :10A7E000F208000AE0091505F3E013B9F4090003C3 :10A7F00042B9FC0A151E0409F5EE122A1809F5E6FD :10A80000200800584065F208000C1405E6091505FB :10A81000E00B151EF3E313B9F7E0122BF809000162 :10A82000F7EA200AE2081505065AF1E113B842C911 :10A8300004090C091409E60A151EF208000EF5E3D6 :10A84000122AF5EB20080258EA080008E066BCDC92 :10A85000EA168F1BFC091505F3EE13B9F009000089 :10A8600042D80C08E20C151EF00B0002F9E1122C84 :10A87000FDEC0008FDEC100914691049E00815050D :10A88000F1E013B8E4090009F208000242E80C08FC :10A89000FC0B151EF00A0005F7EE122BE1EB000889 :10A8A000E1EB100918691049E4081505EA090009E7 :10A8B000F1E213B8E00A151EF2080005F5E0122ACD :10A8C00042F9E5EA00080C09F20C0003E5EA100978 :10A8D00016691049EA081505F1E513B8E6090009FB :10A8E000F208000343080C08E40C151EF00B0006E8 :10A8F000F9E2122CEBEC0008EBEC1009146910499A :10A90000E6081505EC090009F1E313B8EA0B151E7A :10A91000F2080006F7E5122B4319E065BCDCEA15E6 :10A920008F1BE7EB00080A09F20A000AE7EB10099F :10A9300018691049EC081505F1E613B8F409000987 :10A94000F208000243280A08E60A151EF00C000C63 :10A95000F5E3122AEDEA0008EDEA1009166910493C :10A96000E4081505F8090009F1E213B8EC0C151E0E :10A97000F208000EF9E6122C4339E5EC00080A094A :10A98000F20B000BE5EC100914691049FC081505E1 :10A99000120BF1EE13B84349F6080005E40B151E3F :10A9A000F7E2122BE062BCDCEA128F1BFDEB000821 :10A9B0000409F20A000AFDEB100918691049EA08B7 :10A9C0001505F1E513B8F4090009F208000643582B :10A9D0000408FC0A151EF00C000CF5EE122AEBEA36 :10A9E0000008EBEA100916691049EC081505F8098A :10A9F0000009F1E613B8EA0C151EF208000EF9E59D :10AA0000122C4369EDEC00080409F20B000BEDEC8D :10AA1000100914691049FC081505F1EE13B8F60980 :10AA20000009F208000543780408EC0B151EF00A33 :10AA3000000AF7E6122BFDEB0008FDEB1009186980 :10AA40001049EA081505F4090009F1E513B8FC0AF4 :10AA5000151EF2080006F5EE122A4389EBEA0008FB :10AA60000409F20C000CEBEA100916691049EC0815 :10AA70001505F1E613B8F8090009F208000E43982D :10AA80000408EA0C151EF00B000BF9E5122CEDEC96 :10AA90000008EDEC100914691049FC081505F609C9 :10AAA0000009F1EE13B8EC0B151EF2080005F7E6ED :10AAB000122B43A9FDEB00080409F20A000AFDEB82 :10AAC000100918691049EA081505F1E513B8F409E9 :10AAD0000009F208000643B80408FC0A151EF00C31 :10AAE000000CF5EE122AEBEA0008EBEA10091669F1 :10AAF0001049EC081505F8090009F1E613B8EA0C4D :10AB0000151EF208000EF9E5122C43C9EDEC000801 :10AB10000409F20B000BEDEC100914691049FC0854 :10AB20001505F1EE13B8F6090009F208000343D841 :10AB30000408EC0B151EF00A000AF7E6122BFDEBD9 :10AB40000008FDEB100918691049F4090009E6082E :10AB50001505F1E313B8F208000543E90409FC0AFE :10AB6000151EF20C000CF5EE122AE7EA0008E7EADF :10AB7000100916691049F8090009EA081505F1E5F8 :10AB800013B8F208000E43F90409E60C151EF20B87 :10AB9000000BF9E3122CEBEC0008EBEC1009146944 :10ABA00010494057FC0815051407F1EE13B8F609D3 :10ABB000000AEA0B151EF7E5122BFDEB0009F4085D :10ABC0000003FDEB1008E60A15051868F5E313BA53 :10ABD0001248EE080009F20A00054409E06AC1D6ED :10ABE000EA1ACA6214091809FC06151EEDEE1226AF :10ABF000EDEB20080658F2080008EA091505F3E510 :10AC000013B9F009000A4419E068C1D6EA18CA620B :10AC100010091609E60C151EF9E3122CF9E62008B6 :10AC20000A58F2080008F4091505F3EA13B9EA0B0B :10AC3000151EF0090003F7E5122B4429E065C1D683 :10AC4000EA15CA620A090C09F7EC20081458F20840 :10AC50000008E6091505F3E313B9F009000EFC0935 :10AC60001505F3EE13B9F406151EEDEA1226443A63 :10AC7000EDEB20080A0A0658180A100A120A44497D :10AC80000A091609E60C151EF9E3122CF9E620084C :10AC90001C58F2080008F4091505F3EA13B9FC057D :10ACA000151EF0090003EBEE1225E6091505EBEC85 :10ACB0002008F3E313B91458E062C1D6EA12CA625D :10ACC000445B040B0C0BF406151E100BEDEA122668 :10ACD000120BEDE52008F60915050658F3EB13B93C :10ACE000446A040A180A100A4478F409000E040899 :10ACF000F0050009E60A151EF5E3122AF5E620081C :10AD00001658F2080008FC091505F3EE13B9F0090E :10AD10000005448904090C09F60C151EF9EB122CE8 :10AD2000F9EA20081C58F2080008EA091505F3E5BD :10AD300013B9F009000344980408F00A0009FC0B59 :10AD4000151EF7EE122BF7EC20080A58F20800083F :10AD5000E6091505F3E313B9F009000E44A9040947 :10AD60001809EA06151EEDE51226EDEB2008065837 :10AD7000F2080008FC091505F3EE13B9F009000507 :10AD8000EA091505F3E513B944BAE60C151E040AE1 :10AD9000F9E3122C160AF9E620081C58100A120AC8 :10ADA00044C904090C09FC0B151EF7EE122BF7EC35 :10ADB00020080A58F2080002F4091505F3EA13B94D :10ADC00044D8E409000EE069C1D6EA19CA62120843 :10ADD000EA06151EF00C0009EDE51226EDEB200841 :10ADE0001458F2080008FC091505F3EE13B9F00930 :10ADF000000CE068C1D6EA18CA62F405151EF8090D :10AE00001505EBEA1225F3EC13B944EA100AEBE658 :10AE10002008160A1C58100AFC02151EF40900012D :10AE2000E5EE1222E06AC1D6EA1ACA62E5E5200818 :10AE3000E20915051858F3E113B944FB140B404A15 :10AE40000C0BA17A100B44B8F609000E4049F5E945 :10AE500013FA14584459F1E9200B4438E069C1D67B :10AE6000EA19CA6289CAF7E820074108F806151EE0 :10AE7000120AEDEC1226700CEDE22008120C0258BA :10AE8000FC091505F3EE13B90A0AE203151E100AB0 :10AE9000E7E11223120AE7E62008E069C1D6EA19C1 :10AEA000CA621C5840354030A170E1E513F0E0095A :10AEB000000BF4091505040BF3EA13B9100B402835 :10AEC0004021120BE065C1D6EA15CA62A171E3E820 :10AED00013F1E2050008F0060009FC02151EE5EE7C :10AEE0001222E5E320081458F2080008F6091505B7 :10AEF000F3EB13B9F406151EF009000EEDEA122665 :10AF0000EE051501410AEBE713F5EDE220080A0C06 :10AF10001658060CFC091505100CF3EE13B9120CAB :10AF2000950C411972081C089308F609151E412A50 :10AF3000F3EB1229740812089508413870090C09BE :10AF4000910989D089E189F541466C080408089C7B :10AF50008D08340A300BF01F00042A0DD83200008F :10AF6000800091DC800091D0EBCD40F878581494AB :10AF7000A37AF40800099959123AF9F98006F9F907 :10AF8000B006F7B90BFFF9F9BA06FDD8C066E808B4 :10AF9000161DF2080008996818951693E80E000926 :10AFA000E049003FE08B000F3006FCCCFFE4E606F2 :10AFB000000BEA0C000CE806010AF01F0014E3CDB8 :10AFC00080F8FC061140FCCCFFE40C9AEA0C000C63 :10AFD000F01F000EEACBFFE40A9CF01F000DECC846 :10AFE000FFC11034E088000FE60600070E9B0A9CA4 :10AFF0002C07F01F00072C06ECC8FFC11034FE9B85 :10B00000FFF7300ECD3B0000800091DC80029C54A5 :10B01000D421202D16961895300B1A94583BF9B868 :10B020000B14F9B80818F60911FFEC08030AF3D954 :10B03000C002A379F4090A4AE80B0B0A2FFB588BCC :10B04000CEE1301A49EBC038301A49EB0C9CF01FA6 :10B05000001E6C58E21801F8E04801C0CF61308A48 :10B060001A9B0C9CF01F00183007EE081602EE0920 :10B0700011FFEC08032AF3D9C002A379F4090A4AA4 :10B08000EA070B0A2FF75947CF11300B340AECCCE3 :10B09000FFE4F01F000E0E9A300B0C9CF01F000B0B :10B0A000ECCCFFEC308A300BF01F00081A9C308A81 :10B0B000300BF01F00062FEDD82200008003DE5871 :10B0C00080029C508002AF68800091D0EBCD40FCA4 :10B0D000217DE0682301EA186745E06EAB89EA1E2E :10B0E000EFCD5008E068DCFEEA1898BA3007501E31 :10B0F0005028E06E5476EA1E1032E068E1F0EA185B :10B10000C3D250675057503E504818931292580C73 :10B11000C140149416951A962FF7090A0B0B1A9C26 :10B12000F01F00070E33FE9BFFF91A9B049CF01FD3 :10B1300000052E9DE3CD80FC1A96CF8B8002AF6870 :10B140008002B010D431FACD008C501C500B1493F7 :10B150001292109142C0585AE08B0056E04B0040CA :10B16000E08B0054FAC4FFF8340A300B089CF01F3F :10B17000002E400A401B089C0896F01F002CFAC5C0 :10B18000FFB808970D88EC1800360CC80A36CFB106 :10B190003408518451285803C110FACCFF9CFACBD3 :10B1A000FFB4300AE60E1502E40A030818A8E20A02 :10B1B000030916A92FCA1C3ACF81E6CCFFFF0099DC :10B1C0000A9AFAC3FFA0069BF01F0019340A300B3D :10B1D000089CF01F0015400A401B089CF01F00133C :10B1E0000F88EC18005C0EC80C37CFB1314C340816 :10B1F000513C5184519000990A9A069B5128302C59 :10B20000F01F000B2DDDD832FAC6FF881A9A0C9970 :10B21000FACBFFFC301CF01F0006314850165008D6 :10B22000CA2B0000800091D0800091DC8002B0CC5D :10B23000D401202D501A5009301A1AD8FAC9FFF833 :10B24000FAC8FFFCF01F00032FFD2FEDD80200000D :10B250008002B144D43121AD5009502B501A1892BC :10B2600042395809C6D0504850593008FAC7FFAC87 :10B270005038FAC3FFD4FAC0FFC0FAC4FFE8049CF8 :10B28000F01F003140382FF850381AD34038518819 :10B2900040285168FAC8FF98519830484046517884 :10B2A000B986FB380013FAC9FFA0FB68006B189B36 :10B2B0000E98FB66006840454046302A1891B185DB :10B2C000049CFB650069A986FB66006AF01F001FED :10B2D000314A069B009CF01F001E2FFD40085818A5 :10B2E000E08A001C301608983149069A029B049C9B :10B2F000F01F0018314A089B069CF01F0015009AA9 :10B30000089B17381589125814C80E3ACFB12FF67A :10B3100040080C38FE99FFE940560C985946F9B69A :10B320000B140C180C9A5058009B404CF01F00084E :10B3300040585808C05040480C085048CA1B2E6D51 :10B34000D8320000800091B88002B144800091DCC6 :10B350008002B230D43120EDFACEFFA4109530082F :10B3600018927C14149716911296FB680036FB68AD :10B3700000377C00149CF01F00275804C3003018CD :10B38000FAC9FFC9508850685097FAC8FFCA505C84 :10B3900050B6507550A950C85934E0880023300782 :10B3A000FAC3FFECFAC6FFDCC088FB680036E8078A :10B3B00001055935E088001CE00700080C991AD8EF :10B3C0002EC70698304A029B049CF01F00132FFDE5 :10B3D000FB3800362FF80E34FE9BFFE92F2DD832B4 :10B3E00008953007FAC3FFECFAC6FFDC0C99069803 :10B3F0001A96049C1AD6029B304AF01F00070A9A3C :10B400000C9BE007000CF01F00052FFD2F2DD832FC :10B41000800091B88002B144800091DC00000000FF :10B4200000000000EBCD4080129E1097584CC26087 :10B43000E08A0013588CC140590CC101590B5F18A8 :10B4400058FA5FA91248C0A130689D083039300C05 :10B450008F09E3CD8080582CC1E0E3CFC080E04B62 :10B4600000205F1859FA5FA91248CF8130689D0803 :10B470003029300C8F09E3CD808058DB5F1858CA23 :10B480005FA91248CEB130099D093018129C8F086F :10B49000E3CD8080585B5F18584A5FA91248CF40BF :10B4A000E3CFC080580C5E0CF8F8010C5808F9B8CE :10B4B0000100F9F81A435EFC580CF9FB1A4C5EFCCB :10B4C000580CF9FA1A51F9FB1A505EFC580CF9FBAA :10B4D0001A415EFC580CC080586BE08800035EFD8A :10B4E0004928F00B032F5EFEF94A016C5EFDF94A14 :10B4F00001685EFDF94A01645EFDF94A01605EFD86 :10B50000580ACF20F94A01585EFDF4C80001E0480E :10B510000063FE9BFFEAF94A01545EFD580ACE40E3 :10B52000F94A01505EFD00008003DE5CEBCD40E097 :10B53000189716951496580CC130F8FC0180F01F2E :10B54000001158055F0858065F091248C0B030085E :10B55000EF480188EF480180109CE3CD80E0E3CF05 :10B56000C0E00C9CF01F0008EF4C0180CF900A9BBC :10B570000C9AF01F0006300CEF460188E3CD80E006 :10B58000800091E880009200800091DCEBCD40E0EB :10B59000189716951496580CC130F8FC017CF01FD2 :10B5A000001158055F0858065F091248C0B03008FE :10B5B000EF480184EF48017C109CE3CD80E0E3CFAD :10B5C000C0E00C9CF01F0008EF4C017CCF900A9B60 :10B5D0000C9AF01F0006300CEF460184E3CD80E0AA :10B5E000800091E880009200800091DCEBCD40E08B :10B5F000189716951496580CC130F8FC0174F01F7A :10B60000001158055F0858065F091248C0B030089D :10B61000EF480178EF480174109CE3CD80E0E3CF60 :10B62000C0E00C9CF01F0008EF4C0174CF900A9B07 :10B630000C9AF01F0006300CEF460178E3CD80E055 :10B64000800091E880009200800091DCEBCD40FE0C :10B65000189716961493580CC031E3CFC0FE7409A6 :10B66000F8F801605828C5E0F8F1016CF8F50168B8 :10B67000F8F201645979FE98FFF23DD8304AB68855 :10B68000ECCCFFFEFEFB0238F01F008E30083019B4 :10B69000ACF8ACE9ECC4FFF85905E08000A158858E :10B6A000E08000AA5845E08100BC0A9AFEFB02181F :10B6B000089CF01F00843018A8C8E8C9FFFB3008B8 :10B6C000B288E8C5FFFA5902E08000905882E08114 :10B6D000009F304A4FDB0A9CF01F007A3018AAC83E :10B6E000EAC9FFFB3008B2882FA55811E080008A14 :10B6F0005821E08100A5304A4F5B0A9CF01F007181 :10B70000EAC9FFFCEC0811FE1208AC98F206010C25 :10B71000CA56870CEEF501745805E08000C1E3CFEE :10B7200080FEF8F8010CF8F2016C5808F9B801280D :10B73000F9B80016F8FA0168F8F401641039C8E3A2 :10B7400033083009B688B6B93018B6A8F6C5FFFC7C :10B75000590AC6F0588AE0800082584AE081009772 :10B760004DCB0A9CF01F00573018AAC8EAC9FFFB4E :10B770003008B2882FA55904C6B05884E081007EF5 :10B78000304A4D5B0A9CF01F004F3018AAC8EAC926 :10B79000FFFB3008B2882FA55812C661304A4CFB17 :10B7A0000A9CF01F0048EAC8FFFC300AB08AB09A31 :10B7B000EAC9FFFAEEF8010C5808CA503018B288EE :10B7C000EAC9FFF9EACCFFF8B28A310AEEFB010CB4 :10B7D0002FCBF01F003CEAC9FFE8C95B304A4C0B95 :10B7E000089CF01F0038C68B304A4BDB0A9CF01FC8 :10B7F0000035C75B304A4B5B089CF01F0032C5CB5D :10B80000304A4B8B0A9CF01F002FC7BB5812FE9189 :10B81000FF26304A4B4B0A9CF01F002AC60B5825C6 :10B82000FE91FF1D304A4B1B089CF01F0026C44BA5 :10B83000304A4AFB0A9CF01F0023C97B5901FE9144 :10B84000FF0E304A4ABB0A9CF01F001EC5AB304AAF :10B850004A7B0A9CF01F001BC99B304A49EB0A9C9B :10B86000F01F0018C82B5822FE91FEF9304A4A2BCF :10B870000A9CF01F0014C98B5814FE91FEF0304A48 :10B8800049EB0A9CF01F000FC81B582AFE91FEE7E7 :10B89000304A49BB0A9CF01F000BC67BF01F001901 :10B8A000EF4C0174FE90FEDB0C9B660AF01F000556 :10B8B00066080A9CEF480178E3CD80FE8003DE989D :10B8C000800091DC8003DEA08003DE8C8003DE7CC0 :10B8D0008003DE888003DE808003E1EC8003E1E406 :10B8E0008003DE9C8003DEA48003DE948003DEB44C :10B8F0008003DEB08003E1E88003DEA88003DE84FD :10B9000080009200D401580CC060F8CCFEC8306AA8 :10B91000F01F0002D8020000800091DCD4011898CA :10B92000580CC040918AF01F0002D802800091DCC0 :10B93000EBCD40F8208D189416971493F6C6FFF0BF :10B94000F8F501685885C2E0E8F801645818C1604C :10B950006EC8E8F901286E0B1AD81AD66E2849CAA3 :10B960001AD81AD3720C72666E186E395D162FCD06 :10B97000580CC1552F8DE3CF80F86EC9E8FA012825 :10B980006E0B1AD91AD66E291AD91AD3740C74668A :10B990006E3948FA5D162FCD580CCED42F8DE3CFDB :10B9A000C0F80C9B310A1A9CF01F000A0A9AEECBD1 :10B9B000FFD8FACCFFF0F01F00070A9AEECBFFE0A9 :10B9C000FACCFFE81A96F01F0003CBFB80039C38EB :10B9D000800091DCD401580CC070F94B0134F8FCA4 :10B9E0000108F01F0002D80280028F64D401580CB5 :10B9F000C110F8F8010C5808C08070DAF0CBFFECE9 :10BA0000998AF01F0005D802320A109B998AF01F0C :10BA10000003D802800091DC800091D0EBCD408003 :10BA20001897F01F000AEEF801287029700C5D19B4 :10BA3000585CEFF80057F9B90001F1D9E008EFF8C8 :10BA40000A57E3CD8080000080029438EBCD40C0DF :10BA500018971696580CC190306AF8CCFEB8F01FB3 :10BA6000000F308A300BEECCFF10F01F000D3008B5 :10BA700030190C9BEF4800F8EF4900EC306AEECC2F :10BA8000FEE4F01F0008C030E3CD80C00E9CF01F24 :10BA90000006E3CD80C00000800091DC800091D0E2 :10BAA0008000917C80029438EBCD40C016971496AC :10BAB000F6F8010C1838C0D0768A78D8103AC03021 :10BAC000E3CD80C0F8CBFFEC0E9CF01F000ECF91B1 :10BAD0003008EF48010C5806CF41320A0C9B0E9CEF :10BAE000F01F0009EEF90128301B720C72485D1836 :10BAF000EEF801280C9A700C70390C9B5D19CE1B66 :10BB00008000917C800091D0D431189716941493C2 :10BB1000300B324A069CEE040005F01F0052EEC6C0 :10BB2000FFFF0C35E0880034E8C800013DD2EE0884 :10BB30000004C0D8E4091800C2B01499F2C8FFFE8E :10BB40001007EEC6FFFF0C35E08800220F89E409DC :10BB50001800C4B10837C1B00D8A580AC180F4C8B2 :10BB6000FFFEEE0800081035C4733308F009180012 :10BB7000CE2187270D882FE887380D89F2C8FFFE70 :10BB80001007EEC6FFFF0C35FE9BFFE2D83A580ABD :10BB9000CFE03058F00A1800E08B003FEEC8FFFB02 :10BBA0001035E08B002B14993061E2091800FE98E3 :10BBB000FFC7EEC0FFFE304A4ABB009CF01F002BBF :10BBC000C3900D89E2091800FE98FFBA009C304A24 :10BBD0004A7BF01F0026C071EEC9FFFA87790D88F5 :10BBE000204887880D89CABB0D8AF4C8FFFEEE087D :10BBF00000081035CBB2DC3A14993138F00A18003D :10BC0000FE98FFD4304A49BBEECCFFFEF01F001770 :10BC1000C1900D89CCAB304A497BEECCFFFEF01FC2 :10BC20000013C0610FE93018F0091800C1000D8A37 :10BC3000CB6BEEC9FFFA87590D88204887680D89BC :10BC4000C7EBEEC8FFFA87480D89C79B0FF8F808C5 :10BC50001800CEE187070D882FE887180D89C6FBED :10BC6000800091D08003DE788000917C8003DEAC80 :10BC70008003DE908003DE98EBCD4080304A189739 :10BC8000496BF01F0017C031E3CF9080304A495B09 :10BC90000E9CF01F0013C041302CE3CD8080304A51 :10BCA000491B0E9CF01F000EC041308CE3CD8080FC :10BCB000304A48EB0E9CF01F000AC041310CE3CD26 :10BCC00080800E9C304A48ABF01F0005F9BC000490 :10BCD000F9BC0100E3CD80808003DEA88000917C68 :10BCE0008003DE848003DE808003DEB48003DE8890 :10BCF000EBCD4080304A1897496BF01F0017C031D8 :10BD0000E3CF9080304A495B0E9CF01F0013C04186 :10BD1000302CE3CD8080304A491B0E9CF01F000E72 :10BD2000C041308CE3CD8080304A48EB0E9CF01F40 :10BD3000000AC041310CE3CD80800E9C304A48ABF4 :10BD4000F01F0005F9BC0004F9BC0100E3CD8080C0 :10BD50008003DEA48000917C8003DE948003DE8C6F :10BD60008003E1E48003DEA0EBCD40FC189416963E :10BD70001497580BC160198B3308F00B1800C1D011 :10BD80003008301595789548956895589505308810 :10BD90009535952895185876E08B009BE3CFC0FC2D :10BDA000301830898F7B8F4B8F6B8F5B9538950860 :10BDB00095299519E3CFC0FC300531099545956566 :10BDC000955595759529951930289508301A8F3A0B :10BDD0005836FE98FFE51988F6081800CE01199923 :10BDE000ECC800021039CDB119B919A8F1E91088D1 :10BDF000F4081900CD4120465836E08A01112FC4BD :10BE0000089CF01F008A8F2C20465816E08A010BF0 :10BE10008F15E8CCFFFC19991988F1E91082CBF055 :10BE2000ECC30002E40815021033CB95F8C4FFFE02 :10BE300030056E16089CF01F007D0C4C8F1C2FC423 :10BE400020432FF50A32FE99FFF65813E08A00E5E9 :10BE5000300A8F3A09990988F1E91082CA00202333 :10BE6000E40815021033C9B5E8C6FFFE14956E3418 :10BE7000304A4EFB0C9CF01F006FE08100C430186C :10BE800008488F382FC620432FF50A32FE99FFF15C :10BE90005813E08A00940D990D88F1E910888F48B5 :10BEA000E6CB0002581BE08A008AECCCFFFE199812 :10BEB0001989F3E810898F59F6C80002A56912386C :10BEC000C7F5F8C8FFFE300C8F68E3CD80FC1989F8 :10BED0003DD8F0091800FE91FF631999ECC80002E3 :10BEE0001039FE91FF5D304A4D3B2FECF01F0051A1 :10BEF0001893FE91FF5509F909E8F1E91088EA085D :10BF00001900FE91FF4DECCA0008583AE08A005E25 :10BF1000E8CCFFF8F01F00498F2CECCA000C0A3A5D :10BF2000E08A00578F13E8CCFFF419991988F1E9DA :10BF30001082FE90FF35F4C30002E40815021033AE :10BF4000FE95FF2EF8C4FFFE30056E16089CF01F0C :10BF5000003B0C4C8F1C2FC420432FF50A32FE9956 :10BF6000FFF65813E08A0042300A8F3A099909888F :10BF7000F1E91082FE90FF142023E408150210332B :10BF8000FE95FF0EE8C6FFFE14956E340C9C304AF9 :10BF90004ABBF01F0028C211301808488F382FC63E :10BFA00020432FF50A32FE99FFF25813E08A00145D :10BFB0000D880D99F1E910888F48E3CF80FC300897 :10BFC0008F58109CE3CD80FC580AFE99FEE9581A60 :10BFD000FE90FEE6E3CF80FC304A49AB0C9CF01F9C :10BFE0000015C0613028CDAB5813CF51CD8A0C9CC1 :10BFF000304A495BF01F000FF9B80010F9B8010092 :10C00000CCDB0C9C304A491BF01F000AF9B8000237 :10C01000F9B80100C36B5813CD11CC1A5806FE991C :10C02000FEBF5816CCB1CBBA8002BC788003E1ECDD :10C030008000917C8003DE988002BCF08003DE9C4F :10C040008003DE7C8003DEB08003E1E8D401580C7D :10C05000C021DC0AF8F801745808CFC0169AF8FB22 :10C060000178109CF01F0004F9BC01FEF9BC00002F :10C07000D80200008002BD68EBCD40801897580CB4 :10C08000C1D0F8FC0108F01F000F300A0E9B48ECED :10C09000F01F000EEEFC0174F01F000DEEFC017CA1 :10C0A000F01F000BEEFC0180F01F0009EEFC0128E0 :10C0B000F01F00070E9CF01F0006E3CD80800000FB :10C0C000800290A88002C0D080027400800091E8B5 :10C0D000D401F01F0002D8028002963CEBCD40C094 :10C0E0001896E06C018CF01F00131897C19030185F :10C0F000E069A8C0F94800ECF9490150346833C937 :10C10000F9480154F9460128F9490158189A189B31 :10C11000489CF01F000AEF4C01081898C0400E9C84 :10C12000E3CD80C00E9C1097F01F0005CF9B000050 :10C1300080028F248002BAA880028F8C800091E850 :10C14000EBCD4060149E1DD81896158CECF5012897 :10C150001AD81DC91AD91DB81AD81DA91AD91D98DF :10C1600048CA1AD81ADC1ADB303B6A0CF01F000AE6 :10C17000ECF90128311B720C72585D18ECF901289A :10C18000300A720C7238149B5D182F9DE3CD8060CD :10C190008003DF4880023A1AEBCD40C0205D109743 :10C1A000581BC130582BC0402FBDE3CD80C0310B90 :10C1B0001A98F01F00091A961A9B0E9C310AF01F5C :10C1C00000072FBDE3CD80C0310BF01F00052FBD50 :10C1D000E3CD80C08002B230800091DC80028EF816 :10C1E000D431201DFACEFFD81894500B149012961B :10C1F00010917C237C077C12306A49AB129CF01FA3 :10C20000001AC1D05803C0800698009B400C0499C6 :10C210000E9AF01F00160C9BE8F501280498F5D142 :10C22000C0100E996A0C6AA65D16E8FC0104F01FA6 :10C2300000100E9CF01F000F2FFDD832E8C5FEB88D :10C24000306A488B0A9CF01F0008CDD1E8F801281D :10C250000A9B700C70995D19EA061740CD4B0000DF :10C260008002B41C8000917C8002C19880025582BB :10C27000800091E8EBCD40E0189716961495F8F8F9 :10C2800001685848E0800081E08A00495888C780EA :10C290005908C4F04C19EEF801645848C480584855 :10C2A000E089004A5818C6605828C6604BB81AD9A9 :10C2B0001AD8EEFA01280DD81AD80DC91AD90DB816 :10C2C0001AD80DA91AD90D981AD80D89302B1AD958 :10C2D000740C4B3AF01F0033EEF801282F8D700BD1 :10C2E000707C300AF01F0030EEF90128720C72C821 :10C2F0005D18EEF90128307B720C72185D18580534 :10C30000C201EEFC010C580CC07079485808F9B80D :10C310000100F9F81A14E3CD80E05818C33058280A :10C32000CBA14A29EEF801645848CBA14A08CC0BAE :10C330004A09CB2B5888C2205908CB9149D8CB8BBE :10C34000EEF801280C9B700C71263019303A5D16FE :10C35000301BEEFC0104F01F0018EEF8016C5828A9 :10C36000C15030080E99495A109B301CF01F001420 :10C37000CC9B4948C9DB48D8C9BB4938C99B492926 :10C38000C8BB4909C89B48A9C87B301BEEFC010407 :10C39000F01F000ECE7B00008003C6288003DF74F0 :10C3A00080023A1A800274008003DF088003DF10E5 :10C3B00080039A74800261D48002C0D080027474B9 :10C3C0008003C8E480039A6C800261A4D431FACD62 :10C3D00000DC1897169314951296E0490062E08BE2 :10C3E000000630060C9C2C9DD832129CF01F034492 :10C3F0001892E08000D60C9A0A9BF01F034205A910 :10C4000005B8F1E910880599F5D8B0103038F00971 :10C410001800C0603006049CF01F033BCE4BECC8F4 :10C420000004EBDAC01030090A385F3AE045005EDC :10C430005F88F5E8100CF20C1800CED13FE8E4C19B :10C44000FFFC038AF00A18005F1B3028F00A18006E :10C450005F19F7E90004F8041800CDD1EEFC0104DF :10C46000F01F032A039903A8F1E91088EDD8B01052 :10C47000FDD6C003506E1C9930182019F009190020 :10C48000E08800043FF6CC8BEEF8016459085F0A9F :10C490003028F00E19005F19126AE80A1800C080EF :10C4A000EEF801685908CEF0EDB60003CEC0EEF804 :10C4B00000F85808E08100ABE1D6C0100098E218FF :10C4C0002080CE10009AE21A0800502ACDC12FC554 :10C4D00000995055E21901005039C641405AE339DC :10C4E000005DE338005E263AF1E91088F7D8B01015 :10C4F000E9DBC010083AE0830598EEF9016058299D :10C50000E0800550EDB00003E0810333E21000301D :10C51000CBA140395809E08001CAEEF90128305B0F :10C52000720C72185D18039903A8F1E91088E339B9 :10C53000005DEBD8B010E33B005EFACAFF50F7E9AC :10C54000108BE2CCFFA1F01F02F243185808C04044 :10C55000EDB5000CC231EEC3FEB8EEF60134EEF8D4 :10C56000017C5808E08004E742C95809E08004C80B :10C57000EEFB017C580BC79042DAEEF80184103ACA :10C58000C70042FE42EC1ADE14981ADC069A0E9C92 :10C59000FEFB0B80F01F02E02FED3016C3DB3FF6F1 :10C5A000C22BE2C6FFB3FAC4FF84310A0C9B089C7D :10C5B000F01F02D440685C785048EEF800A8580894 :10C5C000C301EEF800A45808FE90FF5E310A300B5C :10C5D0000C9CF01F02D2049A404BEECCFFDC0C986E :10C5E0004059F01F02CF0C9B089C310AF01F02CD6E :10C5F000FE91FF4A308AE2CBFFFBEECCFF10F01F2A :10C6000002C13018EF4800F8C6AB308AEECBFF10FD :10C61000E2CCFFFBF01F02C3FE99FF503FF6CFCAEA :10C62000402B310A0C9CF01F02BD049A404B0C9821 :10C630004059EEC5FF9C0A9CF01F02B9310A0C9BC1 :10C64000089CF01F02B8CBE13018EF4C00A80A9B01 :10C65000EF4800A4340AEECCFFDCF01F02AACCBBEA :10C66000129CF01F02B0C10142EC580CC160EEFBFD :10C670000180580BC12042FEEEF80188103EC090A8 :10C6800042C942DAC81B42FE42C942EC42DAC7CB79 :10C690001C9AF01F02A4CF81EEF801605818E080C8 :10C6A00000E6320AE2CBFFF3EECCFF34F01F029D2E :10C6B000FE91FF7503B903C8F1E91088F3D8B010F3 :10C6C000EEF801645888E08000CC5908E08000CA88 :10C6D000EEF80128FAC9FF2C1AD970D6700C35F97A :10C6E000FAC8FF24300A303B5D162FFD1896580C0F :10C6F000FE90FF55EEF80160E06900FE5828F20850 :10C700001710435AB48840680A99E2190200F1E907 :10C7100010094358E8190108F20B1608B09B435A58 :10C72000B4A9EEF801605828E0810093300843591D :10C73000B2B8435AB4C8435C308AE2CBFFFB2FBC8B :10C74000F01F02704358300AF16A005D4359F36AE2 :10C75000005E4358406A2B381AD84379E068888EC7 :10C760001AD9EECBFFDC1AD606990E9CF01F026E8A :10C770003018EF4800EC5C752FDDEDB50006C0F118 :10C78000FEFA09A8F4E80000FAE9007CEEF801647A :10C790005888E08003F65908E08003D90A90E21037 :10C7A0000200C0E0EEFA01283019740C069B7528CF :10C7B000129A5D18301BEEFC0104F01F025DEEF8CA :10C7C0000128306B700C70195D1943165806FE90E5 :10C7D000FEE64328FAC4FF84F0C50002334A300B5A :10C7E000089CF01F024EE0450020FE9BFED80D88FD :10C7F000F1D8C00252280D89F3D9C041C050EEF8DB :10C80000016458185F095209ECCBFFFE0A9AFACC72 :10C81000FF74F01F023C0A9A52B50898FAC9FF7CCF :10C820000A9BEEFC0168F01F0243FE91FEB8E2CACB :10C83000FFC3089B0E9CF01F0240FE91FEB0009AC1 :10C84000069B0E9C3016F01F023DFE9FFDE6435CEA :10C85000302AE2CBFFFD2FDCF01F022AC6DB3208B4 :10C86000F0091900FE91FE9BC34B42EB580BFE9062 :10C87000FF1A58065F1AEEF9018058095F0814681C :10C88000FE90FF116D68EDB80001FE91FF0C42F8BB :10C89000069A1AD80E9C1ADBFEFB08A442F842E95D :10C8A000F01F021D2FEDFE9FFE7AEEF90128720C9B :10C8B00072885D18FE90FE73EEF80128305B700CF4 :10C8C00070195D19403BFAC6FF50324A0C9CF01FAC :10C8D0000213EEF801605828C0C1E338005DE33B65 :10C8E000005E0C9AF7E8108BE2CCFFA1F01F020863 :10C8F00043065806C0E0EEFC010C580CE08003D162 :10C90000F8CBFFFC310A0C9CF01F0206E08003C04C :10C910003005EEF8016C5818E08000D45805C0606E :10C92000EEFB016C581BE080029BEEF800EC58080F :10C93000E08102B5EEC8FF545008EECAFEB8EEC959 :10C94000FF9CE2C8FFF3508AEEC6FEC850A950987B :10C95000306A6E85408B0C9CF01F01F2E08500FB75 :10C96000306A408BFAC0FFD0009CF01F01E60C9BA0 :10C97000306AFACCFFCAF01F01E3320A409B400C38 :10C98000F01F01E8E08500D0320A409BFACCFFC4DA :10C99000F01F01DC320A400BFACCFFA4F01F01D9D2 :10C9A000340E1ADE40BE00991ADE34C80A9BFEFA25 :10C9B00007920E9CF01F01E4EEC5FF6CFAC3FF7CEA :10C9C0000A9B308A069CF01F01CF0A9CEEC6FF64CA :10C9D000308A0C9BF01F01CB069B0C9C308AF01F09 :10C9E00001C93018EF4800A82FEDEEF50178EEF000 :10C9F00001745800FE90FDD3EEFA0128FAC8FF2812 :10CA0000E9D5B0101AD8E8C9FFA1740C74D6FAC8D9 :10CA1000FF285C79300A303B5D162FFD1893580CC7 :10CA2000FE90FDBDEEF80160E06900FE5828F208B6 :10CA30001710436AB48843683019B0994066436858 :10CA40005C760C9AA3BAB0AAEEF901605829C631F7 :10CA500030084369B2B8436AB4C8436CE2CBFFFB09 :10CA6000308A2FBCF01F01A74368F3D4C108F169D5 :10CA7000005D43680A9AF165005E009B436C2A1CC6 :10CA8000F01F01A0400B436C320A2F3CF01F019DA8 :10CA9000408940AB43682B381AD8436C0C9A1ADC97 :10CAA000E068888E1AD30E9CF01F019F40CBEECC1D :10CAB000FF34320A3016F01F01932FDDFE9FFCADCC :10CAC000EEFC0104580CFE90FF2B320A0E9BF01F67 :10CAD000019FC361320A8F8AEEF8013406991AD891 :10CAE0000E9BEEC8FEC8EEFC0108F01F0199580627 :10CAF0005F1AEEF9010C2FFD58095F081468FE90CB :10CB0000FF0F0C9A069BEEFC0108F01F0192FE91AC :10CB1000FF0EC05B436C302AE2CBFFFD2FDCF01F21 :10CB20000179C9CB400B320AFACCFFC4F01F017562 :10CB3000320A409BFACCFFA4F01F0172C32B310ACA :10CB40000E9BEEFC0104F01F0181E08101B4310A6B :10CB5000CC3B0C9BFAC0FFD0306A009CF01F0169EF :10CB6000306A408BFACCFFCAF01F0166C07B009B85 :10CB7000E21B2000FE91FD13403A580AFE90FD0F83 :10CB8000334AFAC0FFD0009CF01F0164EEF901287F :10CB90007228720C5D1850BC039903A8F1E9108843 :10CBA000E339005DE7D8B010E338005EF1E91088A2 :10CBB000EEF90160F7D8B0105829E080011303B9ED :10CBC00003C8F1E910895189EBDBC0100A34E08316 :10CBD00000CB3028406EF00E1900E08001D80A9694 :10CBE000129B0098FAC9FFC80C9AEEFC0168F01F6E :10CBF0000151E08100B9F5D3C010F1DAC082501ABA :10CC000050F830194068F2081900E08000C7302859 :10CC1000406EF00E1900E08000A4401AF1DAC0C1A5 :10CC2000C050EEF8016458185F0850D8EEF801289B :10CC3000306B700C70195D19009BE2CAFFC30E9C2B :10CC4000F01F013D1895FE91FCAAEEF80128FAC9E3 :10CC5000FF2C0A9A1AD9303B700C70D635F9FAC8F5 :10CC6000FF245D162FFD1894580CFE90FC98EEF8EA :10CC70000160E06900FE5828F20817104066435A28 :10CC80005C76B488E21300304358E8130300E7E60B :10CC9000100CF80B1608B09B4359B2ACEEF80160CB :10CCA0005828E08102234358B0B54359B2C5435CCC :10CCB000E2CBFFFB308A2FBCF01F01124358300A31 :10CCC000F16A005D4359F36A005E43582B381AD865 :10CCD00043790C9A1AD9EEC6FEB81AD40C99E068BA :10CCE000888EEECBFFDC0E9CF01F010F2FDD40B9CC :10CCF0005879E08101F1EEF801685848E08001E6DA :10CD0000E08901DC5818E080014B5828E08001469A :10CD1000FEF804441AD8EEFA0128EF38014D1AD86B :10CD2000EF39014C1AD9EF38014B1AD8EF39014AC3 :10CD30001AD9EF3801491AD8EF390148302B1AD9DE :10CD4000740CFEFA0416F01F0106EEF80128307B81 :10CD5000700C701930165D192F9DFE9FFB5EF1D58A :10CD6000C003C0A0EEF80128306B700C70193016AB :10CD70005D19FE9FFB52E0460020FE9BFFF5EC0B89 :10CD80001603FAC9FFC0E2CAFFA1EECCFFCCF01F28 :10CD900000F5FE90FF44CE7B310AE2CBFFD3FAC40C :10CDA000FF84089CF01F00D7310AEECBFFCCFACCF1 :10CDB000FF74F01F00D4E0450020FE9BFFD5FAC6AB :10CDC000FFC00A9AE2CBFFA10C9CF01F00CE0A988C :10CDD0000C99089CE06A0100320BF01F00E3C1EBE4 :10CDE0005C7BFACAFF50E2CCFFA1F01F00C94318D8 :10CDF0005808CB90F3D3C0105019EDB9000CCB31CB :10CE000043282028FAC9FFC8109A5188149B00981B :10CE1000EEFC0168F01F00C7CA61431B1788F1D8F8 :10CE2000C00250F81789F3D9C041C050EEF8016430 :10CE300058185F0950D94328F0CA0002E04A002080 :10CE4000FE9BFF922FEBFACCFFC0F01F00AEEEF975 :10CE50000128306B720C72185D18CEFAEEF80128BA :10CE600030091AD9129A700C70D6FAC8FF285D16CC :10CE70002FFD1893580CFE90FB92EEF5012818999F :10CE8000EECBFEB84358E06A888E6A0C6AA65D163F :10CE9000069CF01F009DFE9FFB82EECEFF54320BDE :10CEA000500E1C9CF01F00B1C1F1EF4C00ECFE9F36 :10CEB000FD46EEF80128FEFA02B6700C303BF01F7A :10CEC00000A8EEF80128FEFA02AA700C303BF01F11 :10CED00000A4EEF8010C5808FE90FB613008EF4802 :10CEE000010CFE9FFD1FEEF80128FEFA028A700C6D :10CEF000303B3016F01F009AFE9FFA8F42EC580C20 :10CF0000FE91FBB7EEF8017C5808C061EEF8018095 :10CF10005808FE90FBC342F830091AD8069A1AD96D :10CF20000E9C42F8FEFB0254F01F007B2FEDFE9F8B :10CF3000FB36EEF801805808FE91FB18EEF9012847 :10CF4000720C72B85D18FE9FFB111099303BEEF821 :10CF500001605828C180E2CCFFC31AD9EEC8FFBCDB :10CF6000EEFA012830691AD830181AD930091ADCBB :10CF7000740C7466069A5D162FCDFE9FFC11302B43 :10CF80003209CE6BFACCFF84CE9B5875FE98FEEC2E :10CF9000EAC60008FE9FFE264F98CBDA4F98CBBA20 :10CFA000EDB0000CFE91FAB0EEF800A45808FE9027 :10CFB000FA6B3018406EF00E1900C490406AF20A05 :10CFC0001900FE91FAA1F1D4C003FE91FA5DF6C8F2 :10CFD00000085C88109550785C750A9CF01F00482A :10CFE0001896FE90FA51E2C4FFA11899089AEA0B2C :10CFF0001603EECCFFCCF01F005BC2310A9A0C9BEB :10D00000089CF01F00400C9CF01F003F4078EA098C :10D0100016085C58E369005DE368005E5C59F1E95D :10D020001084FE9FFA711ADA1AD4EEF801284D6ABC :10D03000700C302B3FF6F01F004A2FEDFE9FF9EDEC :10D040000C9C3FF6F01F0030FE9FF9E7FAC6FF8404 :10D05000310AE2CBFFD30C9CF01F002A310AEECB41 :10D06000FFCCFACCFF74F01F00270898E2C9FFA19B :10D070000C9CE06A0100320BF01F003BE339005DBD :10D08000E338005EF1E91084FE9FFA3E0E9CF01F2B :10D09000003FEEFC0104F01F003EFE9FFC480C9A8E :10D0A000069BEEFC0108F01F002BEF4C010CFE91DB :10D0B000FC293015FE9FFC2F5888C0A05908FE910E :10D0C000FE294B48FE9FFE284B38FE9FFE254B381D :10D0D000FE9FFE22401A0C9BE21A02000E9C3016A4 :10D0E000F01F0016FE9FF999435C302AE2CBFFFD4A :10D0F0002FDCF01F0004FE9FFDDC0000800092008A :10D10000800091DC800091E88002575C8002BB08BF :10D110008003E0488002C140800091D08002C19825 :10D120008000917C8002C1E08003E1DC800261D458 :10D130008002B4248002B9308002C2748003E0848B :10D140008003E1788002B354800257CC8002914C76 :10D1500080028FB08003C6288003E19080023A1AD3 :10D160008002D8A080029B4080028F488003E0F0BC :10D170008003E1308003E14C8003E0048003DF089A :10D180008003C8E48003DFC88002B9EC80025770D6 :10D1900080039A748003DF1080039A6CD431204D91 :10D1A0001894F8F80128E8F9016416955909F9B3BB :10D1B0000002F9B301011492700C1A9070991A9B35 :10D1C0005D19C635E8F80128FAC9FFF8300A1AD9FE :10D1D000303B700C70D635F9FAC8FFF05D162FFDA4 :10D1E0001891580CC520E8F80160E06900FE402A5B :10D1F0005828F2081710B4880697E8F800A4ABB7CF :10D200005808C050E0680900E7E810075805E068D2 :10D210000400EFD8E1375802F9B80108EFD8E13738 :10D220004028F3D7C108B09940283006B0A740295C :10D23000B2B64028308AB0C6E8C5FF04402C0A9B2D :10D240002FBCF01F00130A9C308BF01F00124028E7 :10D25000F166005D4029F366005E0E99E219010057 :10D26000FBF81002F9BA014DF1DAE1091AD9404888 :10D2700000991AD8069A1AD1089CE068888EE8CBE3 :10D28000FFDCF01F00052FDD2FCDD832800091DCB0 :10D29000800239EA8002C1E0EBCD40804879720813 :10D2A000201893081897C031F01F00050E9CF01F3E :10D2B0000005E3CD8080000000007AB48002D2F83F :10D2C000800091E8EBCD40C048976E065806C041FB :10D2D000F01F0008C0916E082FF8304C8F08F01F27 :10D2E0000006E3CD80C00C9CE3CD80C000007AB482 :10D2F0008002D30480028F24D401F01F0002D802E0 :10D300008002D996D401F01F0002D8028002D9947D :10D31000D4211789179A17B8F1E9118817A9F1EAEA :10D320001108F1E91088990817CA17D8B168F1EA0D :10D33000118817EA17F91258F1EA10889918F73A84 :10D340000008F739000BF7380009B168F1EA1188D5 :10D35000F73A000A1258F1EA10889928189EF73A0D :10D36000000CF738000DF739000FF8C5FFE4B1687D :10D37000F73C000EF1EA11883007125849B4F1EC7D :10D38000108C49B69D3CC038149C2F05E80707084F :10D390002F0EFCF9FFF0F3E82189EC0C0F88E2185E :10D3A000FF001059EC0C0F98E61800FF1059EC0C18 :10D3B0000FB8F1D8C1081059FCF8FFF4EC0C0FAB12 :10D3C000A96BE61BFF0016599D091059FCF8FFF8E0 :10D3D0009D1910599D29FCF8FFFCF3E8200A8B0ADF :10D3E0002FF758A7CD21D8228003E2F08003E6FC76 :10D3F000EBCD40FE1892F01F002F0493E4CBFF60AA :10D40000E4C4FFFCE4C5FF5CE4C6FFF8E4C7FF58D2 :10D41000E4CEFFF4E4CCFF54E4C1FFB06609760823 :10D4200087089709680A6A0889088B0A6E086C09D8 :10D430008D088F097C0A78089D08990A2F03210B13 :10D440002F0421052F0621072F0E210C023BCE7140 :10D45000E4C4FFF030134985498608972F046E0A0B :10D46000EC0A0F98EA080F9EEC0A0F88EA080F9C56 :10D47000EC0A0FB8EA080F9BEC0A0FA8F809150888 :10D48000FC0A1510F3EC1389F5EE130A1659EA0895 :10D490000F9BF6081518F1EB1288105914590EA9B4 :10D4A0000E34CDE12FF358A3CD91E3CD80FE0000E3 :10D4B0008002D3108003E2FC8003E6FCD431209D7F :10D4C000F736000E505A178A780917B8F1EA118812 :10D4D000179A1258F1EA210817AEF1EE208E506E1D :10D4E000781817CA17F9105917D8F3EA2189F3E801 :10D4F000210917EEF3EE208E507E7828F7390008C8 :10D50000F73A000B105AF7380009F5E9218AF73984 :10D51000000AF5E8210AF5E920827839F73A000C8B :10D52000F738000FFEF7034412581894F1EA2188E7 :10D53000F739000DF8CAFF60F1E92108500AF1E659 :10D5400020800E91E0081618406AEE080326F3DAF0 :10D55000C008F1D2C208EE090329EE080328504999 :10D560005038407AEE0A0F9950296878684B105667 :10D570004068EE000FACEE080FBA4079165AEE097B :10D580000F8BF6081508F1EB1388F8091518105AD7 :10D59000F3EC1289EE020F9C125AF8081510F1EC08 :10D5A0001308F5E82008685E68654079EE090FBB4E :10D5B00050884068EE020F8C1C5BEE080FAEF80836 :10D5C0001508F1EC1388EE000F9A105BFC09151892 :10D5D000F4081510F3EE1289F1EA1308125B407992 :10D5E000F7E82003EE000F8BF6081508F1EB13881F :10D5F000EE020FBCEE090FAE0A5CFC091518105CB8 :10D60000F3EE12894068125CEE080F9B404A4048D6 :10D61000F6091510A968F3EB1309F1EA1388F9E983 :10D620002000105640394038B968F1E912882E04BC :10D63000105640294028B169400AF3E81309EDE982 :10D6400020021434C770E4081618408AF3DAC008C0 :10D65000E208032EE2090326F1D0C208E2030F9983 :10D66000E20803255019E2020FACE2030F8B6809B0 :10D67000F6081508F1EB1388E20A0FBA125AF809F6 :10D680001518105AF3EC1289E2000F9C125AF80890 :10D690001510F1EC1308F5E82008E2030FBB506801 :10D6A00040886819E2000F8AE2080FAC125BF408A8 :10D6B0001508F8091518F1EA1388F3EC1289E2004D :10D6C0000FBAE2020F9C105BF8081510125BF1EC28 :10D6D0001308F7E8200850786829E2030FAC125AC3 :10D6E000F8091518F3EC1289E2020F8BF6081508F9 :10D6F000F1EB1388105A125A4089E2090F9B6839DE :10D70000F6081510F1EB1308125EF5E82002EC099B :10D710001508EA081518F3E61389F1E51288125E78 :10D720004019105EB1694018F3E81309FDE92000C3 :10D73000C0AB4089F1D3C1084CDBFDD9C008F60865 :10D740000706E40A1618EBD0C208F60A0709F60520 :10D750000708F60E070CF9E9118CF3D3C008F9E8B5 :10D76000110C4088B988F608070AF6090708F3D2B1 :10D77000C208F1EA1188F609070AF3D0C108680E59 :10D78000F1EA1108F609070AF1EA10881C58F009B5 :10D790001618405AB4B8B4894059F00A1610A9882E :10D7A000B29AB2A8E6091618F609070AF3D0C0081B :10D7B000F6090708F1EA1188408AF3DAC208F60987 :10D7C000070AF3D2C108F1EA1108F609070A40591D :10D7D000681EF1EA10881C58B2F8F0091618405A71 :10D7E000B4C94059F00A1610A988B2DAB2E8E009C3 :10D7F0001618F609070AF3D2C008F6090708F3D38A :10D80000C208F1EA1188F609070AF1EA1108408A0C :10D81000F3DAC108F609070A4059682EF1EA1088C0 :10D820001C58F368000BF0091618405AF5690008F7 :10D830004059F00A1610A988F36A0009F368000A33 :10D840006839405AF9E6108C125CF8081618F80985 :10D850001610F56C000FF568000CA98CF569000D29 :10D86000F56C000E2F7DD8328003E2FC8003E1F0DE :10D87000EBCD40C01897590BC030E3CF80C0E06CAF :10D8800000B0F01F00061896CF900E9BF01F00040A :10D890000C9CE3CD80C00000800092008002D3F099 :10D8A000D431209D129714961895500B308A0C9BFA :10D8B000FAC2FFE4049CF01F0034ECCBFFF8400AEE :10D8C0000E9CA37AF01F00300A9C310BF01F002F32 :10D8D0001893C57040082018EE08003840095028F9 :10D8E0005C39400A5C59F40A00285019E9D8C0088C :10D8F0003050FAC7FFF4FAC1FFEC40095809E08A3A :10D90000002940251296308A049B0E9CF01F001EB1 :10D91000FB390013E806000812580A9BFB68001345 :10D92000308A029CF01F00180E9A0E9B069CF01F76 :10D930000018308A0E9B049CF01F001320160A9CCE :10D94000308A2085029BF01F00105806FE99FFDDEB :10D95000401A2010E80A0008E9D8C0085BF0CCE1C2 :10D96000069CF01F000C049C3A691988F208180004 :10D97000C0812FFCFAC8FFDC103CCF812F7DD83A44 :10D980002F7DDC3A800091DC8002D8708002D4BC0C :10D99000800091E85EFD5EFCD4311A97202D109E28 :10D9A000129514965809C4911638E0880057F0086B :10D9B0001200C0D0F608094BF0091120FC08094EEE :10D9C000F4090A49F4080946F3EB100BFC0516109C :10D9D000F9DEC010F6050D0AEC0816101499F1EBEB :10D9E0001108B93A103AE088000C20191C08103EC2 :10D9F000E08B0007103AF7B90B01F1DEEB08F00AF3 :10DA0000010BEDD6C010F6050D0AEDEB11061498CA :10DA1000F40C024C0C3CE088000A20181C060C3E5A :10DA2000E08B00050C3CF7B80B01F1E9110B300C51 :10DA3000169A189B2FEDD8321639E08B0051F20C54 :10DA40001200C53114385F8916355F381049F8095E :10DA50001800C450301BC4585808C0513019F2087F :10DA60000D08109EFC081200E08100911C1BFC05B3 :10DA70001610F3DEC010301CF6050D0AEC08161067 :10DA8000F4090243F1EB1108149B1033E088000CF9 :10DA9000201B1C08103EE08B00071033F7BB0B0166 :10DAA000F1DEEB08F0030103EDD6C010E6050D0230 :10DAB000EDE311060498E40902490C39E088000AF4 :10DAC00020181C060C3EE08B00050C39F7B80B0142 :10DAD000F1EB110B169A189B2FEDD832300B169CD8 :10DAE000169A189B2FEDD832F20C0945F80E11202A :10DAF000F00C0943F40E0A46F00E0A48F60E0A4EE0 :10DB00000A48F0011610FC010D04EEE5FFF8F60CD2 :10DB10000949EBD8C010EDE910090896F20E16106D :10DB2000EEF4FFF8EC05024BFDE4110E1C3BE0881F :10DB300000072016100E1C38E088006D161EF3D961 :10DB4000C010FC010D00F3E11109009BE005024E3D :10DB5000123EE0880007201B10091238E0880055AB :10DB6000F7E6110B1C19F60306420639C0935F094C :10DB7000F40C094C043C5F38F3E80008C020201B7B :10DB8000300C169A189B2FEDD832F6080949FC087C :10DB9000094EF0011120FC051610F4010A42F601AD :10DBA0000A411242E2050D00F3DEC010E406161031 :10DBB0000093EDE11106E009024C0C3CE0880007FF :10DBC00020131C060C3EE088002CEC0C0101F7D25F :10DBD000C010E2050D00F7E1110B009CE0090241C5 :10DBE0001631E088000C201C1C0B163EE08B000751 :10DBF0001631F7BC0B01F7DEEB0BF4080946021BEC :10DC0000F9E3110CC3AB123EF3D8EB09F7BB0B01E0 :10DC1000CA8B1C3BF7B60B01FDD8EB0EC90B0C3CB5 :10DC2000F7B30B01EDDEEB06CD1BD703D40130AA11 :10DC3000300BF01F0002D8028002F0ECD4014848FB :10DC4000169A189B700CF01F0003D802000005986C :10DC50008002DC54D421F40B024BF01F00151897FE :10DC6000C230F8FAFFFCE01AFFFC204AE04A002428 :10DC7000E08B00181898593AE088000F300910A975 :10DC800010A959BAE088000910A910A9E04A002497 :10DC9000C03110A910A9300910A991199109C048E3 :10DCA000300BF01F00040E9CD82200008002E2BC62 :10DCB0008002E8BCD421300EF6C80001F60614013B :10DCC000F808002818991897C07870046E050EA4FB :10DCD00091052FFE20480C3ECF95F40B000B1897B2 :10DCE000F6C80001300EF8080028A15BC078700566 :10DCF0006E060EA591062FFE2048163ECF95F4C85D :10DD00000001A15AF808002C3008C078780E720B78 :10DD100012AE990B2FF8204C1438CF95D822D70388 :10DD2000D431205D502C503816971496580C5F0B48 :10DD300058075F0C1295F9EB100B40E33008F00B1D :10DD40001800E081028058095F09580A5F08F3E86B :10DD50000008F6081800E08102764BE4402B6808C2 :10DD60001638E0840270EE08032C580CE080026B39 :10DD70004B9BF01F003AC06168082FF88908E08FBC :10DD8000026268085808C05130184B598908930836 :10DD90005806C14032D90D88F20818005F0232B926 :10DDA000F20818005F08E5E81008C0805802F9B2D0 :10DDB0000101F9B200022FF6C0884AACF01F002A18 :10DDC000F9B20102F9B200004A5870085818C61199 :10DDD0005812C2B049F95822C4A0129872043001F6 :10DDE00032DB32BA7009F2C0FFFFEE09032C580C87 :10DDF000E080023B1989F6091800C0805803E080D2 :10DE00000225F4091800E081022150015014492B29 :10DE1000F01F0012C411EE04002C029B301A2FF4E4 :10DE2000F01F0012E08F022148A87009EE090328B4 :10DE30005808C2F0118A32DBF60A1800C2A0580353 :10DE4000E080020832BBF60A1800E0810203C21823 :10DE500000007AB88003EC008002ECC800007ABCB5 :10DE60008003EC04800326948002DCB47208EE0880 :10DE700003285808C0E0118832D9F2081800C09071 :10DE80005803E08001E032B9F2081800E08101DBBC :10DE90003009500950195805E08000A44BE4680887 :10DEA000302AEE08032C4BDBF01F003DC0D0580396 :10DEB000E08000986808EE080328118932B8F0095C :10DEC0001800E081008F4B7468085818E081008AC0 :10DED0004B187008302AEE08032C4B0BF01F003053 :10DEE000F9B80002E9F80A004AB468084AD1EE0815 :10DEF000032C620833DB100CF01F002B1893C0E1D9 :10DF00006808EE08032CF01F002968096208EE0972 :10DF10000323F80801081803C08868086209EE089E :10DF20000328F8080108121850430A910C933FF493 :10DF300030001096C4784989720849A9EE08032C6C :10DF400072080C9A100CF01F0016C3A1620CF01F8F :10DF500000171836C051069600944043C3C85BF4BE :10DF6000C2E0493870085808C7C062081AD848A8E3 :10DF700070096E08EE090329A564EA04030A1ADA97 :10DF80001AD91AD848B8700848BB702CF01F000B7B :10DF90002FCDC67800007AB88003EC008002E7102D :10DFA00000007ABC8002ECAC8002EDD0000004A43A :10DFB000000005988003EC1480031FE800942FF004 :10DFC0002F01620B580BCB81069640435BF4C031A6 :10DFD0000898C0A8E8081504EA0800087018C048A6 :10DFE0003FF83003109458065F19F3E403F9C03189 :10DFF0003006C5484BE162084BE3EE08032966088A :10E000000C9CF208070BF01F003C1896C2D14BB8CD :10E0100070085808C11062096608EE090329F20861 :10E0200007081AD86E081AD84B5870084B5B702C2A :10E03000F01F00352FED4AF8700B2FFB910B4AC9EA :10E04000720AEE0A032CF80B070C300BF60C1800C2 :10E05000F7BA00FFF3FA0A00F9B90001F1F90A0072 :10E0600033F8109CC818199833A9F2081800C0306A :10E070003008C08819A9F0091800F9B80002F9B8E9 :10E08000010149CA49A97209EE09032974030D8ADD :10E090002FF3F203000349D9930A5818C1505828A6 :10E0A000C0405808C6C0C208078933D8F009180014 :10E0B000F7B300FF4968078A3009F20A1800C10166 :10E0C00030069106C718078933D8F0091800F7B34E :10E0D00000FF30080789F0091800C1B048C8910353 :10E0E0003019484891093006C5F8000000007AB898 :10E0F00000007ABC8002ECAC000004A4000005988B :10E100008003EC5080031FE8000004A000007AC0E8 :10E110004C08402B70082FF81638C2954BE8700851 :10E120005808C1C06E084BD71AD86E084BCB702C5C :10E13000F01F003C2FFD5BF4C0906E08A5644BAB54 :10E14000EA0403091AD9702CC0686E080D894B7B4C :10E150001AD9702CF01F00332FFD4AE933A8720A38 :10E16000109C2FFA930A4B299308C6D84B19EE0836 :10E17000032A3018930A10964AF9C1584AE95BF409 :10E18000C0D1720A2FFA930A4A2B760BEE0B032B9F :10E19000F60A070AF00A1800C03130189308300850 :10E1A0004A49109693085802C1B140094A285809B3 :10E1B0005F19700858185F08F3E80008E4081800B1 :10E1C000C0F04018ECCAFFFFEE08002C400BF01F17 :10E1D000001B40182FF8F006000648E8C0A8496860 :10E1E00070085818C07148B870092FF9F206000677 :10E1F00091065BF4C240403B580BF7F41A00A5644B :10E2000008056A3C6A285808C1E0910C300CC1B876 :10E2100000007AB8000004A4000005988003EC70A8 :10E2200080031FE88003EC948003EC9C000004A0B2 :10E2300000007AC000007ABC8002DCB448C8700CD0 :10E24000C0283FFC2FBDD83291002FF1FE9FFDCC9E :10E25000488B97084888F2CAFFFF3019910A129C30 :10E2600048389109CF0B48489104CECB000004A058 :10E2700000007AC000007AB8D40130091AD9129887 :10E28000F01F00022FFDD8028002DD20D401484893 :10E29000189B700CF01F0003D802000000000598C6 :10E2A0008003217CD4014848189B700CF01F0003A8 :10E2B000D8020000000005988002E2BCD431F6C705 :10E2C000FFF518955967F9B70810F9B80BF8EFD8AA :10E2D000EB2716375F38F1E713F8C05030C899388C :10E2E000E08F01F4F01F0050E04701F7E08B001CC5 :10E2F000EE0316034CD8F003003870361036C061B8 :10E30000ECC8FFF870361036C0C06C18E018FFFC7F :10E310006C3AEC0800090A9C6C289528913AC4785C :10E320002FE3C4D8EE081609C041EE031603C278E5 :10E330005848E08B0006EE0316062C83C2085948A5 :10E34000E08B0005F0C3FFA5C1A8E0480054E08BB6 :10E350000006EE03160C2923C128E0480154E08B87 :10E360000006EE03160F2893C0A8EE031612E0482D :10E370000554E088000437E3C02828434ABAF40370 :10E38000003A7436C1986C19E019FFFCF207010BD2 :10E3900058FBE08A00042013C1186C38580BC0B534 :10E3A0006C2AEC0900090A9C912A95387218A1A8D8 :10E3B0009318CBD810961436CE712FF349BAF4CCFB :10E3C000FFF878261836C6F06C19E019FFFCF20742 :10E3D000010858F8E0890091993C992C5808C055DB :10E3E000EC0900090A9CCE3BE04901FFE08B0013D9 :10E3F000A399F4090038702B8D388D2B9736912610 :10E40000A3497418301BF6090949F1E91009951957 :10E41000C4A8F20816095848E08B000AF20A16064A :10E420002C8AC2488002E8CA0000059C5948E08B4B :10E430000005F0CAFFA5C1A8E0480054E08B000623 :10E44000F20A160C292AC128E0480154E08B000684 :10E45000F20A160F289AC0A8F20A1612E0480554CC :10E46000E088000437EAC028284A4C8BF60A0034BA :10E4700068280838C0E17619A34A301EFC0A094A08 :10E48000F3EA100A1099971AC0A870280838C060DB :10E49000701AE01AFFFC1439CF9370398D398D282A :10E4A00091369326E6081402301B4B84F608094B7C :10E4B0006818103BE08B006EF7E80009C0B1E0136C :10E4C000FFFCA17B2FC3C0382FC3A17BF7E8000955 :10E4D000CFC0E803003E06921C916236C2E86C1A77 :10E4E000E01AFFFCF407010858F8E08A00156C3ABE :10E4F0006C299529933A0E99EC070007A1A9993741 :10E5000099278D19EE0809088F2C8F3CA1A80A9C29 :10E510008F18C0D86C395808C0F5EC0A000A741876 :10E52000A1A80A9C95186C2893289139F01F00180F :10E53000ECCCFFF8D83212960236CD212FF2F1D270 :10E54000C002C0302F81CCAB1C98F3D3C002C08175 :10E550006819F60811FFF3E800088918C078F0C9B7 :10E560000008201370081238CF10A17B6818103BE8 :10E57000E08B0010580BC0D00493C0382FC3A17B90 :10E58000F7E80009CA71CFBB0000059C8002E8CC07 :10E5900068236612E012FFFC0E325F39E4070108BF :10E5A00058F85FAAF5E91009E08000A24C887001D4 :10E5B0004C882F0170080E015BF8C0402811E01153 :10E5C000FF80029B0A9CF01F004418965BFCC6E08B :10E5D000E6020008103CC0320833C6814BFA7409C9 :10E5E000E209000995091036C0A1F5D6C007C0712F :10E5F000E20200026828A1A29112C4C84B5A740B0F :10E600005BFBC0319506C068EC0900094B3A101954 :10E610009509F1D6C003F00911085808F20817103F :10E62000EDD8E1062808EC0100010A9CE3D1C007FF :10E63000F0010101029BF01F00284A885BFCEC0CF2 :10E640001700F9B1000070090C1C8926020C120198 :10E65000A1AC91018D1C0833C1D058F2E08B0005AC :10E6600030188D18C238305920C2E012FFF8E60287 :10E670000008912991196618F1D8C001E5E8100841 :10E68000871858F2E0880007E6CBFFF80A9CF01FD5 :10E6900000144949720A491870081438F3F8BA008E :10E6A0004919720A1438F3F8BA0068287018E0188B :10E6B000FFFC0E385F390E1858F85FAAF5E910090B :10E6C000C1600A9CF01F0009D83A000000007ACC13 :10E6D000000009A88002EBC800007AD08003217CEA :10E6E00000007AC800007AC48002E8CC6826A1A89D :10E6F0000E99A1A98D19EC0700070A9C89278F188C :10E70000F01F0003ECCCFFF8D83200008002E8CC08 :10E71000D4013008C0D8F808070EF6080709201AF7 :10E720002FF8F20E1800C040FC09010CD802580A5C :10E73000CF31149CD802588AC2F5F9EB1009E219BE :10E740000003E0810097E04A0020C3B4F4081402FB :10E75000F0091108FE09002F7669996976599959CF :10E7600076499949763999397629992976199919E5 :10E7700076099909F608002BF8080028E01A00032A :10E78000F40A1104FE0A002F17A9B0A91799B0992D :10E790001789B0895EFCF40A1109FE0A002F17F9E7 :10E7A000B8F917E9B8E917D9B8D917C9B8C917B965 :10E7B000B8B917A9B8A91799B8991789B8895EFC8B :10E7C000EBCD40C01899220AB707B326B707B32686 :10E7D000B707B326B707B326220ACF742F0AC0653E :10E7E000B707B326B707B326210A5C3AFE0A003FF3 :10E7F000D703D703F736000EF366000EF736000D89 :10E80000F366000DF736000CF366000CF736000BCC :10E81000F366000BF736000AF366000AF7360009C4 :10E82000F3660009F7360008F3660008F7360007BC :10E83000F3660007F7360006F3660006F7360005B4 :10E84000F3660005F7360004F3660004F7360003AC :10E85000F3660003F7360002F3660002F7360001A4 :10E86000F3660001F7360000F3660000E3CD80C0D8 :10E87000201AF60A0709F80A0B09CFB15EFCD40189 :10E88000183BC192F60A0009123CC152F80A000B6B :10E890003008C068F208070E201AF6080B0E201880 :10E8A000580ACF91D802F6080709201AF8080B0970 :10E8B0002FF8C0283008580ACF71D8021898C038ED :10E8C00010CB201A580ACFD15EFC5EFC5EFCD70349 :10E8D000D4014848169A189B700CF01F0003D80208 :10E8E000000005988002E8E8D431201D16941892A3 :10E8F000149B5804C051F01F005B1895C5B9500A0D :10E90000F01F0059400BE8C10008F6C6FFF5621C75 :10E910005966F9B60810F9B80BF8EDD8EB2616369B :10E920005F38F1E613F8C05030C830058538C42987 :10E930001890E010FFFC0C30E08401124CB8E200AB :10E94000000970250A39C090721AA1CAF20A000A99 :10E95000741AEDBA0000C220721AE01AFFFCF4002B :10E9600000030A39C131ECC7FFF00E33C195E2064E :10E9700000090C13A1A393139129049C6218089514 :10E98000F1D8C00110468316C1390C33C0957228E6 :10E990000297723993289139CE48300A1499EDBC08 :10E9A0000000E080009D6207E20701076E1CE01C8A :10E9B000FFFC5809C5E0F80000030A39C4811403BC :10E9C000ECC9FFF01233C5556E3A6E299529933A7A :10E9D000EEC5FFF8E0CA0004E04A0024E08B002501 :10E9E0000A99593AE088001A09098B0909098F39EF :10E9F000EEC9FFF059BAE0880011090B930B090921 :10EA00008F59EEC9FFE8E04A0024C071090A930A51 :10EA1000EEC9FFE0090A8F7A090A12AA680A930A66 :10EA2000681A931AC0785008089B0A9CF01F0010BF :10EA30004008EE0600090C13A1A393139129049C2E :10EA40006E18F1D8C00110468F16CB2814030C3372 :10EA5000C10572287239932891396E286E39C0F831 :10EA60008002E2BC8002E8CA0000059C8002E87EC9 :10EA7000F80000030C33C3356E396E2893289139A2 :10EA8000E0CA0004EECCFFF8E04A0024E08B00244A :10EA9000593AE088001A0908990809088F38EECC1D :10EAA000FFF059BAE08800110908990809088F5841 :10EAB000EECCFFE8E04A0024C07109089908EECCCA :10EAC000FFE009088F78090818A8680899086818ED :10EAD0009918C478089BF01F0039C438049CF01FB3 :10EAE00000381895C3A06218F8C90008A1C8E20848 :10EAF00000081039C07172130297E013FFFC000385 :10EB0000C308E0CA0004E04A0024E08B0020089912 :10EB10001898593AE0880014130B10AB130B10AB84 :10EB200059BAE088000D130B10AB130B10ABE04A81 :10EB30000024C051130A10AA130A10AA130A10AA1B :10EB4000720A910A72199119C048089BF01F001BA4 :10EB5000089B049CF01F001B049CC2A80093029712 :10EB6000E60601096E1858F9E0880016F1D8C001D0 :10EB7000EDE810088F181298A1A8EE06000BF60910 :10EB8000000997187218A1A82F8B9318049CF01FE6 :10EB9000000DC0B8F1D8C001E7E810088F18EE03E7 :10EBA00000036618A1A88718049CEEC5FFF8F01FA3 :10EBB00000060A9C2FFDD8328002E87E8002E2BC6B :10EBC0008003217C8002E8CCD42130081897487655 :10EBD000169C8D08F01F00065BFCC0516C0858089D :10EBE000EFF81A03D822000000008CC48002F1E87C :10EBF0005EFDD703D421217DE06802041697BA6830 :10EC0000504C500CF01F000B3008512850D848A829 :10EC100050983FF8BA784898505C501CFAC9FF9059 :10EC20000E9A700C1A9BF01F00062E9DD822000031 :10EC30008002EDD08002EBF00000059880030C4CC0 :10EC4000D421217D4988FAC9FF9016977006580B88 :10EC5000C064E068008B3FFC8D38C228580BF60872 :10EC600017005807F9BB01FFEFDBE10850585028A7 :10EC7000E0680208BA683FF8504C500CBA781A9B0A :10EC80000C9CF01F000A5BFCC044E068008B8D38D0 :10EC90005807F9B90100FBF81000F1F91E002E9D8C :10ECA000D8220000000005988002F5685C5BC0284F :10ECB0002FFC19885808C050F6081800CFA15EFC38 :10ECC000580B5E0C5E1DD703F9EB100AE21A000325 :10ECD000C341780A76095CEAC170123AC151781AC8 :10ECE00076195CEAC110123AC0F1782A76295CEAFA :10ECF000C0B0123AC091783A76395CEAC0502F0C15 :10ED00002F0B123ACE70F9DAC308F7D9C3085E0C9C :10ED1000161C5E1CF9DAC208F7D9C2085E0C161C74 :10ED20005E1CF9DAC108F7D9C1085E0C161C5E1C1E :10ED30005C5A5C59121A5EFA178A1989580A5E09D8 :10ED400014195E19179A1999580A5E0914195E194F :10ED500017AA19A9580A5E0914195E1917BA19B920 :10ED6000580A5E0914195E192FCB2FCCCE6B000008 :10ED70003008F6080709F8080B092FF85809CFA141 :10ED80005EFCD703D4014848189B700CF01F0003A9 :10ED9000D8020000000005988002ED9CD42118974D :10EDA0001696169CF01F0008F8C5FFFF0E9C0A9BE4 :10EDB000F01F00061897C0500A9A0C9BF01F000421 :10EDC0000E9CD8228002EDD08002E2BC8002E736A1 :10EDD00030091898C0282FF8118AF20A1800CFC1FC :10EDE000F00C010C5EFC580AC0815EFA580AC0B0F3 :10EDF0005808C0902FFC2FFB201A19881789F0099A :10EE00001800CF50198C1788101C5EFC3008103A7F :10EE10005E0CF6080709F8080B092FF85809CF818E :10EE2000103A5E0CF8080B092FF8CFBBD401484804 :10EE3000169A189B700CF01F0003D802000005986A :10EE40008002EE44D421300816951696C0282FF67D :10EE5000580AC060201A0D89F0091800CF910A16CF :10EE6000ECCBFFFFF01F00071897C0800A9B0C9A9D :10EE7000F01F00053008EE060B080E9CD82200009B :10EE80008002E2BC8002E736D42118981696580B0F :10EE9000C0C03007C0481897F8C8FFFF109C0C9BF3 :10EEA000F01F0005CF91C048F01F000318970E9C7B :10EEB000D82200008002ECACD421201D4A351897DE :10EEC0006A04E8F600E85806C351500B350CF01FF1 :10EED00000206A08E94C00E8F0F900E89326930660 :10EEE0009316F0F900E893469336F0F900E893663C :10EEF0009356F0F900E893B693A6F0F900E893D69C :10EF000093C6F0F900E893F693E6F0F900E8F346CB :10EF10000044F3460040F0F900E8F346004CF346A5 :10EF20000048F0F900E8F366001CF0F800E8400B38 :10EF30009196486870080E9CF0FA00E83019F01FAE :10EF400000052FFDD8220000000005988002E2A4F1 :10EF50008002EF54D421580CC041740C580CC2905C :10EF600018981697113EC0A80C3EC0815809C030B1 :10EF7000109CCF7B9508B889D8220F365806CF5100 :10EF8000580EC051950E1C9CD822129810991697B5 :10EF9000133E0F361C36C0A1580EFC091700F9BBF2 :10EFA0000100F1FB1E009509D8225806CF31CEEBA7 :10EFB000D822D703D431203D4CC8502C700116986C :10EFC000113EE20E0706E2160008CFB1E04E002D1A :10EFD000C041113E3016C058E04E002BC021113EFA :10EFE00058095F0C59095F053007F9E51005EE0572 :10EFF0001800C1E0E04E0030C131118535843783FF :10F00000E80518005F04E60518005F05E9E510054E :10F01000EE051800C050119E31092FE8C098580C19 :10F02000C070E04E0030F9B90008F9B9010AE06C8F :10F03000FFFFEA1C7FFF3007FC1580000E930E36A1 :10F04000F80517000E9CEA090D0408925005E20E1F :10F050000704E1D4C001F9B00137F9B000575010EE :10F06000FCC500300890E2100004C0814010E9D4D3 :10F07000C002FC0001055804C1C01235C1A4043C03 :10F080005FBEFDE713FEE60E1800C101043C5F0EF3 :10F0900040070E355F97EFEE000EE60E1800C061D8 :10F0A000B33C3017EA0C000CC0283FF7113ECD0BE3 :10F0B0005BF7C0E1E069FFFFEA197FFFFC1C8000FD :10F0C00040205806F20C170032298139C0485806F2 :10F0D000FBBC0100580AC0705807F9B901FFF1D90B :10F0E000E10B950B2FDDD8320000049CD401485869 :10F0F0001499169A189B700CF01F0003D802000098 :10F10000000005988002EFB43028D6733FFC358BA1 :10F11000580C5E4C482A950B5EFC000000008CC425 :10F120003058D6733FFC358B580C5E4C482A950BF3 :10F130005EFC000000008CC43038D6733FFC358B79 :10F14000580C5E4C482A950B5EFC000000008CC4F5 :10F150003048D6733FFC358B580C5E4C482A950BD3 :10F160005EFC000000008CC430B8D6733FFC358BC9 :10F17000580C5E4C482A950B5EFC000000008CC4C5 :10F180003098D6733FFC358B580C5E4C482A950B53 :10F190005EFC000000008CC4D421210D16971A9B40 :10F1A000F01F0011C0343FFCC1C84008AE08401831 :10F1B000AE1840288F184038AE484048AE584058E6 :10F1C000AE684068AE7840888F4840A88FB840C885 :10F1D0008FC840D88F5840E8300C8F7840F88F980F :10F1E0002F0DD8228002F180D40148C87009580937 :10F1F000C03148B99109489948AA7208F00C000C2E :10F20000143CE08B0004930CC068F01F000730C86A :10F2100099083FF8109CD80200007AF800008CC8CA :10F220000000F00080031D20D431208DFAC4FFBC03 :10F23000504B682E505812967C0B7005506E580B30 :10F24000F40B17006803681140493008C2C92FFB4E :10F25000325C178AF80A18005F1EF00A18005F1C5B :10F26000FDEC000CF00C1800CF31580AE0800129A9 :10F27000300C3FFA1890503A18941892F80C003C51 :10F280001697507C4CDC0F3AF80A070E407C1C0C99 :10F290004CBEFC0C070E201E500E4CAEFC0C070C96 :10F2A000507C400C587CE08B00F84C7EFC0C032F0B :10F2B000368BF60A1800E08000F0371BF60A1800BB :10F2C000C07034CBF60A1800C051A3B4CE58A5B410 :10F2D000CE380F8B36CAF40B1800C051A5B4EECB54 :10F2E000FFFFCDB8A5A4CD88EBD5C005367CF80AC4 :10F2F0001800E08B0027365BF60A1800C48234FB46 :10F30000F60A1800C480E08B000C345BF60A180083 :10F31000C3E0347BF60A1800C3A0344BC088358B99 :10F32000F60A1800C2C0E08B0007355BF60A180029 :10F33000C351C318363BF60A1800C2F0364BC0E87A :10F34000370BF60A1800C250E08B000D36EBF60AB8 :10F350001800C1F0E08B0014369BF60A1800C1E1DA :10F36000C0E8375BF60A1800C0A0378BF60A180011 :10F37000C060373BF60A1800C111C0B8EDB40004F4 :10F38000C0A0EDB40005C0913020C0883040C068F6 :10F390003030C0483010C0283000403B5BFBC040DC :10F3A000E20B0920C7985860E08B00776C0AEACC22 :10F3B000FFFF486EFC00032F8003EE088003ED641E :10F3C0008003ECF88003ECAC8003ECCCF4CBFFF8CA :10F3D0008D0BF4EA0000E605083AC0F8F4CBFFFC18 :10F3E0008D0B740AE605093AC088F4CBFFF88D0B43 :10F3F000F4EA0000E605083A0E9B1895C4E8620A94 :10F400005BFAC0B150195028E06A0080300B029CB2 :10F41000F01F004D40284019E4CC00010E9B503CE9 :10F42000F20C0C49C3A8620A5BFAC0B1501950280B :10F43000E06A0080300B029CF01F00434028401916 :10F440002012300A0E9BE202092AF2020C49C2582D :10F4500016976C0AF4CBFFFC8D0B740A0E9BE60525 :10F46000093A2FF5C1A8F4C20030C068E4020022B6 :10F470002FF7F40200120F8A580AC0E0230A589AA4 :10F48000FE98FFF6C0982FF70F8A580AC050230A3B :10F49000589AFE98FFFA0E9B407C30BAF40C180084 :10F4A000FE91FEEE4042178C0A325F4AF00C1800C3 :10F4B0005F1CF9EA000AF00A1800FE91FECB300842 :10F4C000404E178AE2050021F00A1800FC091710C7 :10F4D000E6050038069EC2A8620A583AC1E0E089F3 :10F4E0000007581AC1A0582AC181C058585AC0C034 :10F4F000C0B5C1386C0AF4CCFFF88D0CF4E2000002 :10F50000F0E30000C1086C0AF4CCFFF88D0CF4E2C3 :10F510000000F0E30000C0786C0AF4CCFFFC8D0C16 :10F52000740A910A2FF52F882FC11235FE9AFFD643 :10F530001C934052406E85059D0B404BE60B003CF2 :10F540002F8DD8328002E8BCD42114977428580833 :10F55000C0419518109CD822F01F000330088F1866 :10F560008F28D82280032320D431FACD068850A9D1 :10F57000169014971893580CC06078685808C031DA :10F58000F01F004E4CE81030C0316600C0A84CD8C7 :10F590001030C0316610C0584CB81030E7F000028F :10F5A0008068EDB80003C04160485808C071009BF6 :10F5B000069CF01F0046E0810B4080681099E2191C :10F5C000001A58A9C3D18079300AF4091900C385FB :10F5D000A1D8FB5805B86088FB4805CC60A8FB485B :10F5E00005D4FAC8FFD4FB4805BCFB4805ACE0686D :10F5F0000400FB4805C0FB4805B43008FB5905BAB8 :10F600000E9A40A9FAC7FA54FB4805C4069C0E9B03 :10F61000F01F002F506CC0950E9B069CF01F002D14 :10F62000406EF9BE01FF506EFB0805B8EDB800064C :10F63000E0810B058068A7A8A068E08F0B00300868 :10F64000FAC4F9F85098FB480678409CFB480674C9 :10F65000FB48067CFB48068050573FF8FB44067089 :10F66000FB48052C506C1896069150204055C02838 :10F670002FF50B88300B325AF60818005F19F40882 :10F6800018005F181268F6081800CF314059EA09CF :10F690000107C2E0FAF806780E088909FB480678E7 :10F6A0008917FAF806742FF8FB4806745878E08931 :10F6B00000132F84C1A8000080031F388003EF2CA3 :10F6C0008003EF4C8003EF6C80031C388002F568E8 :10F6D00080031D2CFACAF990402B029CF01F00A158 :10F6E000E0810AA6FAC4F9F840680E0850680B8851 :10F6F0003007EE081800E0800A8AEAC2FFFF3003F4 :10F700005052FB6706873FFE50745043503E0690B0 :10F71000508506920C944057C0683FFC0A97503CB5 :10F72000C02830000F38C0281292E0480063E08003 :10F7300001CCE0890045E0480039E0890026E04836 :10F740000031E0840198E048002BE0800101E0896D :10F75000000FE0480023E080008EE048002AE080AF :10F76000008CE0480020E0810897C7B8E048002EF0 :10F77000E08000F1E0480030E080017BE048002DAF :10F78000E081088ACE28505750420897408540743F :10F790001092E048004FE0800439E0890008E0481A :10F7A0000044E081087DE08F01DEE0480055E08004 :10F7B00005DFE0480058E0810873C428E048006F86 :10F7C000C430E089001FE0480069C450E089000AA5 :10F7D000E0480064C400E0480068E081085DC63984 :10F7E000E048006CE0800163505750420897408524 :10F7F00040741092E048006EE0810852E08F02ED04 :10F80000E0480073E0800553E089000BE048007099 :10F81000E08004F9E0480071E081083EC5295057B6 :10F8200050420897408540741092E0480075E0808F :10F8300005A0E0480078E0810833E08F06964CABE5 :10F84000509BE08F06945057408508975042407473 :10F85000E08F03DD50574085089750424074C83907 :10F86000FB380687300AF4081800FE91FF5D320865 :10F87000C6E8A1A3C58B0F89F2C800305898E08B69 :10F88000001EEEC8FFFF300B2309F60B002BF20B16 :10F89000001B1139F2CA0030589AFE98FFF7E04970 :10F8A0000024FE91FF40E04B0020E08909C1201BAD :10F8B000FAF90680123BC095C108FAF90680ECCA35 :10F8C000FFFF1236C1F5C268FAC9F9781097F20B3A :10F8D000003BF6F2FDA4C358FAC7F9841AD7109773 :10F8E000FAC2FAD01AD2FAC8FBCC029C1AD8FAC8CB :10F8F000F974FAC9FFCC40BAF01F001C2FDD780262 :10F90000C208FACEF9781496FC040038F0F2FDA48F :10F91000C18840A859F9E0890011F0CBFFFC50AB39 :10F920007002FACCF978F8090038F142FDA42FF9F9 :10F930001496FB490680C058700214962FC850A830 :10F940005802FE94FEF15C32A3A3CEDAFB68068770 :10F95000CEAA0F38E048002AC0A03009C7D800005E :10F960008002F5488003EDD08002F2280F88F0C9AC :10F9700000305899E08B001EEEC5FFFF300B2308C6 :10F98000F60B002BF00B001B0B38F0C90030589918 :10F99000FE98FFF7E0480024FE91FEC5E04B0020F2 :10F9A000E0890946201BFAF80680103BC095C10883 :10F9B000FAF90680ECCAFFFF1236C1F5C288FACA0E :10F9C000F978F40B003BF6FBFDA4503BC3C8FAC921 :10F9D000F9841AD9FAC8FAD01AD8FAC8FBCC029C12 :10F9E0001AD8FAC8F974FAC9FFCC40BAF01F027AE3 :10F9F0002FDD780C503CC278FACEF9780E95FC04D5 :10FA000000381496F0F8FDA45038C1D840A859F930 :10FA1000E0890014F0CBFFFC700850AB5038FACCF2 :10FA2000F978403BF8090038F14BFDA42FF90E9509 :10FA3000FB4906801496C07870090E952FC850397E :10FA4000149650A840385808FE95FE690A97C6BA21 :10FA5000F40B00190F38F209002BF0CA0030589A45 :10FA6000FE98FFF83FFEF20E0C495039C5FAA7B3D5 :10FA7000C5AA30092308F2090029F00900190F3836 :10FA8000F0CA0030589AFE98FFF7E0480024FE9133 :10FA9000FE4DE0490020E08908CBF2C4000130109F :10FAA000FE9FFE42A7A3FE9FFE3F0F89F0091800AC :10FAB000C0512FF7A5B3FE9FFE37A5A3FE9FFE34CE :10FAC000A5B3FE9FFE3150575042089740854074C1 :10FAD0000C99FAF806805800C1D01037C064FACCEF :10FAE000F978F8070037C1D8FAC8F9841AD8FAC8E3 :10FAF000FAD01AD8FAC8FBCC1AD8FAC8F974FAC9DD :10FB0000FFCC0A9A0E9B029CF01F02332FDD19B81E :10FB1000C2282FF61039C084FACBF978F6070037DF :10FB2000EF38FDA7C18840A959F8E0890012F2CA50 :10FB3000FFFC50AA7209FAC2F978E408003A2FF8DB :10FB4000F549FDA4FB480680F1D9C008C04813B8A8 :10FB50002FC950A9300EFB680648FB6E0687E08F60 :10FB600006A7A5A30C92EDB30005C4D1FAF8068050 :10FB70005800C1E01037C064FACCF978F8070037B4 :10FB8000C1F8FAC8F9841AD8FAC8FAD00A9A1AD869 :10FB9000FAC8FBCC1AD8FAC9FFCCFAC8F9740E9B84 :10FBA000029CF01F020D2FDD781A7809C288ECC282 :10FBB000FFFF1036C0A4FACBF978F6070037EEFA4B :10FBC000FDA8EEF9FDA4C1B840A959F8E0890013D9 :10FBD000F2CAFFF850AAFAC6F978721AEC08003B8C :10FBE0007209F74AFDA8F749FDA42FF8FB480680E3 :10FBF000C068F2C8FFF8721A50A87209049650093A :10FC0000501ACD58EDB30004C441FAF806805800EC :10FC1000C1D01037C064FACEF978FC070037C1E8CC :10FC2000FAC8F9841AD8FAC8FAD00A9A1AD8FAC8BF :10FC3000FBCC0E9B1AD8029CFAC8F974FAC9FFCC07 :10FC4000F01F01E52FDD780AC218ECC2FFFF103665 :10FC5000C084FACCF978F8070037EEFAFDA4C16841 :10FC600040A959F8E0890010F2CAFFFC50AAFACB6B :10FC7000F978720AF6080039F34AFDA42FF8FB4818 :10FC80000680C048720A2FC950A90496501AC8D8D5 :10FC9000EDB30006C481FAF806805800C1D01037D1 :10FCA000C064FAC8F978F0070037C1E8FAC8F984E7 :10FCB0001AD8FAC8FAD01AD8FAC8FBCC1AD8FAC897 :10FCC000F974FAC9FFCC0A9A0E9B029CF01F01C27C :10FCD0002FDD9818C238ECC2FFFF1036C084FAC678 :10FCE000F978EC070037EF08FDA6C18840A959F85C :10FCF000E0890012F2CAFFFC50AA7209FACEF97824 :10FD0000FC08003A2FF8F549FDA4FB480680F1D91C :10FD1000B010C04892182FC950A950180496BF5867 :10FD20005008C458FAF806805800C1D01037C06493 :10FD3000FACBF978F6070037C1E8FAC8F9841AD87F :10FD4000FAC8FAD00A9A1AD8FAC8FBCC0E9B1AD86D :10FD5000029CFAC8F974FAC9FFCCF01F019F2FDD8D :10FD6000780AC218ECC2FFFF1036C084FACAF978CC :10FD7000F4070037EEFAFDA4C16840A959F8E089FC :10FD80000010F2CAFFFC50AAFAC6F978720AEC0811 :10FD90000039F34AFDA42FF8FB480680C048720AD8 :10FDA0002FC950A90496501ABF5A500AFAEA000007 :10FDB000580A5C2BC0E43008FAEA00003009F00A67 :10FDC000010AF20B014B32D8FAEB0000FB68068700 :10FDD0003010E08F04E30C99EDB30005C471FAF81C :10FDE00006805800C1D01037C064FACAF978F40709 :10FDF0000037C1D8FAC8F9841AD8FAC8FAD00A9AD2 :10FE00001AD8FAC8FBCC0E9B1AD8029CFAC8F9740F :10FE1000FAC9FFCCF01F01702FDD780AC2082FF657 :10FE20001039C084FAC9F978F2070037EEFAFDA458 :10FE3000C16840A959F8E0890010F2CAFFFC50AA35 :10FE4000FAC3F978720AE6080039F34AFDA42FF8DC :10FE5000FB480680C048720A2FC950A94062049826 :10FE60009512BF589508FE9FFC03EDB30004C441F2 :10FE7000FAF806805800C1D01037C064FACEF9787D :10FE8000FC070037C1D8FAC8F9841AD8FAC8FAD0E2 :10FE90000A9A1AD8FAC8FBCC0E9B1AD8029CFAC848 :10FEA000F974FAC9FFCCF01F014C2FDD780AC208A3 :10FEB0002FF61039C084FACCF978F8070037EEFA3B :10FEC000FDA4C16840A959F8E0890010F2CAFFFCFE :10FED00050AAFACBF978720AF6080039F34AFDA461 :10FEE0002FF8FB480680C048720A2FC950A9406904 :10FEF0009509FE9FFBBDE2130040C440FAF806805E :10FF00005800C1D01037C064FAC8F978F00700373C :10FF1000C1D8FAC8F9841AD8FAC8FAD00A9A1AD8F5 :10FF2000FAC8FBCC0E9B1AD8029CFAC8F974FAC91D :10FF3000FFCCF01F01292FDD780AC2082FF61039F7 :10FF4000C084FAC3F978E6070037EEFAFDA4C16869 :10FF500040A959F8E0890010F2CAFFFC50AAFAC281 :10FF6000F978720AE4080039F34AFDA42FF8FB4837 :10FF70000680C048720A2FC950A9406EB40EFE9F79 :10FF8000FB77FAF806805800C1D01037C064FACC6D :10FF9000F978F8070037C1D8FAC8F9841AD8FAC82E :10FFA000FAD00A9A1AD8FAC8FBCC0E9B1AD8029C2F :10FFB000FAC8F974FAC9FFCCF01F01072FDD780ADF :10FFC000C2082FF61039C084FACBF978F60700374B :10FFD000EEFAFDA4C16840A959F8E0890010F2CA00 :10FFE000FFFC50AAFAC3F978720AE6080039F34A0E :10FFF000FDA42FF8FB480680C048720A2FC950A9FB :02000004800377 :1000000040629502FE9FFB34A5A30C99EDB3000559 :10001000C571FAF806805800C2601037C0A4FACE45 :10002000F978FC070037EEEAFDA4FAEB0000C1887E :10003000FAC8F9841AD8FAC8FAD01AD8FAC8FBCC88 :100040001AD8FAC8F974FAC9FFCC0A9A0E9B029C16 :10005000F01F00E12FDDF8E80000FAE900003000B1 :10006000E08F03992FF61039C0B4FAC8F978F00779 :100070000037EEEAFDA4FAEB0000E08F038C40A904 :1000800059F8E0890016F2CAFFF850AAF2EA000017 :10009000FAEB0000FACAF978F4080039FAEA00002D :1000A000F2EBFDA42FF8FB480680E08F0374F2EA20 :1000B00000002F89FAEB000050A9E08F036CEDB32C :1000C0000004C141FAF806805800C0801037C60409 :1000D000FACAF978F4070037C7782FF61039C774D1 :1000E000FAC9F978F2070037C6F8EDB30006C45133 :1000F000FAF806805800C1D01037C064FACCF978FD :10010000F8070037C1D8FAC8F9841AD8FAC8FAD063 :100110001AD8FAC8FBCC1AD8FAC8F974FAC9FFCCB5 :100120000A9A0E9B029CF01F00AC2FDD9818C22883 :100130002FF61039C084FACBF978F6070037EF08AC :10014000FDA6C18840A959F8E0890012F2CAFFFC57 :1001500050AA7209FAC2F978E408003A2FF8F54972 :10016000FDA4FB480680F1D9B010C04892182FC9F1 :1001700050A95C785018C418FAF806805800C1D00D :100180001037C064FACCF978F8070037C1D8FAC83C :10019000F9841AD8FAC8FAD00A9A1AD8FAC8FBCC45 :1001A0000E9B1AD8029CFAC8F974FAC9FFCCF01F4A :1001B000008A2FDD780AC2082FF61039C084FACBE6 :1001C000F978F6070037EEFAFDA4C16840A959F89E :1001D000E0890010F2CAFFFC50AAFAC2F978720A4C :1001E000E4080039F34AFDA42FF8FB480680C04814 :1001F000720A2FC950A9501A300E500E1C90E08F71 :1002000002CA505750420897408540740C99FAF83A :1002100006805800C1D01037C064FACCF978F807CE :100220000037C1D8FAC8F9841AD8FAC8FAD01AD84F :10023000FAC8FBCC1AD8FAC9FFCCFAC8F9740A9AE2 :100240000E9B029CF01F00642FDD7809C2182FF668 :100250001039C084FACBF978F6070037EEF9FDA41F :10026000C17840A959F8E0890010F2CAFFFC50AAF1 :10027000FAC2F9787209E408003AF549FDA42FF8AA :10028000FB480680C058F2C8FFFC50A8720933082A :10029000300EFB6806844D1C37885019A1B3FB68EB :1002A0000685500E509CE08F02755057300B50421F :1002B000FB6B06870897408540740C99FAF8068016 :1002C0005800C1D01037C064FACAF978F407003773 :1002D000C1D8FAC8F9841AD8FAC8FAD01AD8FAC814 :1002E000FBCC0E9B1AD80A9AFAC8F974FAC9FFCC4B :1002F000029CF01F00392FDD7807C2082FF6103955 :10030000C084FAC9F978F2070037EEF7FDA4C16896 :1003100040A959F8E0890010F2CAFFFC50AA720700 :10032000FAC2F978E4080039F347FDA42FF8FB4836 :100330000680C04872072FC950A9403E580EC1051B :100340001C9A300B0E9CF01F0026E08002B6F807C6 :100350000105403C1835E08902B0E08F02AF0E9CE9 :100360003000F01F00201895E08F02A9A5A30C997A :10037000EDB30005C581FAF806805800C2001037B9 :10038000C064FACBF978F6070037C208FAC8F984D6 :100390001AD8FAC8FAD00A9A1AD80E9BFAC8FBCC17 :1003A000029C1AD8FAC8F974FAC9FFCCF01F000AE7 :1003B0002FDDF8EA0000FAEB0000C3282FF6103911 :1003C000C124FACAF978F4070037EEE8FDA4FAE987 :1003D0000000C2688002F2288003EDE4800328A4B4 :1003E0008002EDD040A959F8E0890015F2CAFFF863 :1003F00050AAF2EA0000FAEB0000FACAF978F40811 :100400000039FAEA0000F2EBFDA42FF8FB48068061 :10041000C078F2EA00002F89FAEB000050A93010F2 :10042000E08F01B9EDB30004C141FAF8068058002D :10043000C0801037C604FACAF978F4070037C778C5 :100440002FF61039C774FAC9F978F2070037C6F8E1 :10045000EDB30006C451FAF806805800C1D0103739 :10046000C064FACCF978F8070037C1D8FAC8F98423 :100470001AD8FAC8FAD01AD8FAC8FBCC1AD8FAC8CF :10048000F974FAC9FFCC0A9A0E9B029CF01F0086F1 :100490002FDD9818C2282FF61039C084FACBF978CE :1004A000F6070037EF08FDA6C18840A959F8E08992 :1004B0000012F2CAFFFC50AA7209FAC2F978E408E5 :1004C000003A2FF8F549FDA4FB480680F1D9B01099 :1004D000C04892182FC950A95C785018C418FAF86F :1004E00006805800C1D01037C064FACCF978F807FC :1004F0000037C1D8FAC8F9841AD8FAC8FAD00A9ACB :100500001AD8FAC8FBCC0E9B1AD8029CFAC8F97408 :10051000FAC9FFCCF01F00642FDD780AC2082FF65D :100520001039C084FACBF978F6070037EEFAFDA44B :10053000C16840A959F8E0890010F2CAFFFC50AA2E :10054000FAC2F978720AE4080039F34AFDA42FF8D8 :10055000FB480680C048720A2FC950A9501A300EB5 :100560003010500EC1794D1C509CEDB30005C541B3 :10057000FAF806805800C2201037C0A4FACBF978E8 :10058000F6070037EEE8FDA4FAE90000CF28FAC824 :10059000F9841AD8FAC8FAD00A9A1AD80E9BFAC85F :1005A000FBCC029C1AD8FAC8F974FAC9FFCCF01F28 :1005B000003E2FDDF8EA0000C0C8ECCAFFFF10368D :1005C000C0B4FAC9F9781496F2070037EEEAFDA430 :1005D000FAEB0000CCE840A959F8E0890016F2E6F1 :1005E0000000F2CBFFF8FAE7000050ABFAC6F9784A :1005F000EC080039FAE60000F2E7FDA42FF81496A3 :10060000FB480680CB68F2E600002F89FAE700007D :1006100050A91496CAE8EDB30004C161FAF8068047 :100620005800C0801037C6A4FACEF978FC0700370E :10063000C838ECCAFFFF1036E0840082FACCF978A3 :10064000F8070037C788EDB30006C4D1FAF8068072 :100650005800C1D01037C064FACCF978F8070037D9 :10066000C1F8FAC8F9841AD8FAC8FAD01AD8FAC860 :10067000FBCC1AD8FAC8F974FAC9FFCC0A9A0E9BB7 :10068000029CF01F00092FDD9818C2A8ECCAFFFFDA :100690001036C0D4FACBF9781496F6070037EF0875 :1006A000FDA6C1E88002F2288003EDE440A959F8D4 :1006B000E0890013F2CBFFFC50AB7209FAC6F9785F :1006C000EC08003B2FF8F749FDA4FB480680149680 :1006D000F1D9B010C058921814962FC950A95C785F :1006E0005018C458FAF806805800C1D01037C064BA :1006F000FACCF978F8070037C1F8FAC8F9841AD8A3 :10070000FAC8FAD00E9B1AD8FAC8FBCC0A9A1AD8A3 :10071000029CFAC8F974FAC9FFCCF01F00C42FDD9F :10072000780BC248ECCAFFFF1036C094FACBF978B8 :10073000F60700371496EEFBFDA4C18840A959F8CE :10074000E0890011F2CBFFFC50ABFAC6F978720BCE :10075000EC080039F34BFDA42FF81496FB480680F3 :10076000C058720B14962FC950A9501B300E500E52 :100770004008401C300B18485F18E7E80008F608EE :100780001800C0703308FB620685A1B3FB680684BD :100790003020300AFB6A068740395809C025A7D3A4 :1007A0004038401758085F194008FAC5F9900E48BC :1007B00030025F18F3E81008E4081800C5E03018AC :1007C000F0001800C0603028F0001800C051C3E8E5 :1007D0000A970690C2C80A97FAE80000F5D8C00345 :1007E0002D0A0EFAF00B1603F20C1603F7E911DBD3 :1007F0001899169858085C29CF21FAE90000EDB342 :100800000000C4613309F20A1800C4200EF9C408BC :10081000F01F008730A82D0A3009AE8AFAEA0000DE :10082000F01F008416991498FAE90000EECC00013C :1008300030A83009FAEA00001897589A5C2BFE9B02 :10084000FFE91BF800932D08C2080A97FAE8000098 :10085000F5D8C004409EFC0A070A0EFAF20B1604F3 :10086000F00A1604F5E911CA1699149858085C297B :10087000CF01FAE90000C0C85800C091EDB30000F4 :10088000C061FAC7F9913308AE88C0280A970E15DF :100890004030C14850425057407410925802E08096 :1008A00001B6300CFB620648FB6C06873015300041 :1008B000FAC7F9B8C03840353000069A0699E21AEE :1008C0000002E2190084508A5079EA000C42FB3899 :1008D0000687300BF6081800F7B201FF580AF7B286 :1008E00001FE5809C4514048041850385808E0899E :1008F000001DC3E8FB4C06784CFE310C890E891CA8 :10090000FB4B0674587BE08900042F84C0B8FACAF8 :10091000F990402B029CF01F0049E0810189FAC444 :10092000F9F8403B210B503BFAF90678FAF80674C7 :10093000F2CCFFF0F0CBFFFF4BFA403E590EFE9990 :10094000FFDB1C09890AFB490678891EFB4B0674EC :10095000587BE08900042F84C0B8FACAF990402B74 :10096000029CF01F0036E0810163FAC4F9F8FB38FD :100970000687300CF8081800C1F0FAF80678FAC9B2 :10098000F9792FF88909FB4806783019FAF80674C6 :1009900089192FF8FB4806745878E08900042F84E1 :1009A000C0B8FACAF990402B029CF01F0024E081E5 :1009B000013FFAC4F9F8408B580BC1F0FAF80678F9 :1009C000FAC9F97C2FE88909FB4806783029FAF83A :1009D000067489192FF8FB4806745878E0890004DA :1009E0002F84C0B8FACAF990402B029CF01F001364 :1009F000E081011EFAC4F9F8407AE04A0080C5118E :100A00004049041950395809E0890029C4A848C848 :100A1000310EFB4C06788908891EFB4B0674587B07 :100A2000E08900102F84C1788002F228800373408F :100A30008002D9988003EDF88002F5488003ECE845 :100A4000FACAF990402B029CF01F0052E08100F09E :100A5000FAC4F9F8403C210C503CFAF90678FAF84F :100A60000674F2CCFFF0F0CBFFFF4CBA403E590EBB :100A7000FE99FFCF1C09890AFB490678891EFB4BAA :100A80000674587BE08900042F84C0B8FACAF99034 :100A9000402B029CF01F003FE08100CAFAC4F9F825 :100AA0000A105800E089001BC3B8FB4C0678310AD5 :100AB0004B9C891A890CFB4B0674587BE089000417 :100AC0002F84C0B8FACAF990402B029CF01F003165 :100AD000E08100AEFAC4F9F82100FAF90678FAF8D4 :100AE0000674F2CCFFF0F0CBFFFF4ABA5900FE9932 :100AF000FFDE0009890AFB4906788910FB4B067462 :100B0000587BE08900042F84C0B8FACAF990402BC2 :100B1000029CF01F0020E081008BFAC4F9F8FAF87B :100B2000067889158907F0050005FAF80674FB4573 :100B300006782FF8FB4806745878E08900042F8463 :100B4000C0A8FACAF990402B029CF01F0012C6F10F :100B5000FAC4F9F8E2130004C41040470417580718 :100B6000E089001CC3B8FB4C067889058913FB4B50 :100B70000674587BE08900042F84C098009A402BAB :100B8000029CF01F0004C531FAC4F9F82107C0988F :100B90008002F5488003ECE84AB53103FAC0F990C9 :100BA000FAF90678FAF80674F2CCFFF0F0CBFFFF02 :100BB0004A5A5907FE99FFD90E09890A8917FB4934 :100BC0000678FB4B0674587BE08A0009FACAF99054 :100BD000402B029CF01F001DC2A140684049E4095F :100BE0000C4204085068FAF806785808C080FACA1F :100BF000F990402B029CF01F0015C1913003FAC4FC :100C0000F9F8FB430674FE9FF53302934020FAF88F :100C100006785808C080029CFACAF990009BF01F21 :100C2000000BC0613008FB480674C0284020806873 :100C3000EDB80006C0313FF25062406CFE3DF978DD :100C4000D83200008003EDF88002F548D431FACDA7 :100C500001E03007503C16961295507A5087505755 :100C60000E930E905047407E1D8957795809E080B9 :100C700007A22FFE4D5C507E780C502CF809070817 :100C8000E2180008C1B06C185808E08900070C9BF6 :100C9000403CF01F004FCE816C084CCBF0C9FFFFE9 :100CA000760A1188F4080708EDB80003CDD16C1856 :100CB0008D0920182FF08D18CE7BE0490025E081AA :100CC000008906941091109236CA344C358E407BC0 :100CD0001739507B364BF6091800E08000BBE08BDB :100CE0000042F8091800E08000B4E08B0021339B3B :100CF000F6091800E08B01D2330BF6091800E082E8 :100D00000094325BF6091800C640E08B000B5809CE :100D1000E080074F324BF6091800E08101BFC8A8F8 :100D200032ABF6091800E08101B9C6D8FC091800F9 :100D3000E08000A4E08B000C34CBF6091800C7005B :100D400034FAF4091800E08101A9C8C835BAF409D9 :100D50001800E0800098363AF4091800E081019EFE :100D6000C9E836FBF6091800C7E0E08B0017369B90 :100D7000F6091800C720E08B0008368BF60918002A :100D8000E081018CC4F8F4091800C3F036EAF409D4 :100D90001800E0810183C8D8373AF4091800C1303F :100DA000E08B0008370AF4091800E0810177C7A832 :100DB000375AF4091800C5C0378AF4091800E081D1 :100DC000016DC5B83029C7590000049C800328BCB8 :100DD0006C185808E08900080C9B403CF01F006428 :100DE000E08106E0407A6C08F539FFFF118AF20ACB :100DF0001800E08106E02FF82FF08D086C182018FD :100E00008D18C32BA5A1C64B407B1789F409180088 :100E1000C0512FFBA1B1507BC5BBA1A1C59BA1B106 :100E2000C57BA3A1C55BE4020022A17223021202CA :100E3000C4FBE0420020E08B0007E4C4000130184E :100E40003002C46B3168403A9538E08F06ABA1A1FF :100E50004C8930AE5089C2B84C6C300B508C505B12 :100E6000C279A1A14C4A3089508A5059C2194C2EDE :100E700030AC508E505CC1C94BFBA9B1508B310ACC :100E8000C169301950085019407BFACCFFD4F01FCB :100E9000003BA7A1507C40194008C0B9A7A1300968 :100EA000C0894B59E81102205089310E505EC009AB :100EB000EDB10004FE90FED9EDB10002C441580826 :100EC000C2500E34C064FACCFE20F8040024C2786C :100ED000FACAFED40A99F407002A0E98130B14AB31 :100EE0002FF81034CFC4EEC9FFFFEE0811FFF0C792 :100EF000FFFF2FE808080807EA080025F2070007A7 :100F0000FAC8FED4F0040324C1C8E6C8FFFF0E33BC :100F1000C094FACBFE201093F6040024E8F4FF4CB2 :100F2000C1086A042FC559F7E089000B1093FACA6B :100F3000FE20F40700282FF7F144FF4CC02810933F :100F4000A800C92AEDB10000C1A15808E0800088BE :100F50000E34C635FACAFED40A99F407002A0E9850 :100F6000130B14AB2FF81034CFC4C678800328BC01 :100F70008002EFB480032E6C800329ECE2110002A2 :100F8000C4805808C2500E34C064FACCFE20F80465 :100F90000024C278FACAFED40A99F407002A0E98EF :100FA000130B14AB2FF81034CFC4EEC9FFFFEE08BB :100FB00011FFF0C7FFFF2FE808080807EA0800251F :100FC000F2070007FAC8FED4F0040324C1C8E6C83B :100FD000FFFF0E33C094FACBFE201093F6040024DA :100FE000E8F4FF4CC1086A042FC559F7E089000BEB :100FF0001093FACAFE20F40700282FF7F144FF4CA3 :10100000C0281093E008141F89108908FE9FFE2D48 :101010005808C2500E34C064FAC9FE20F2040024FD :10102000C278FACAFED40A99F407002A0E98130B64 :1010300014AB2FF81034CFC4EEC9FFFFEE0811FF38 :10104000F0C7FFFF2FE808080807EA080025F207A5 :101050000007FAC8FED4F0040324C1C8E6C8FFFFA5 :101060000E33C094FAC2FE201093E4040024E8F486 :10107000FF4CC1086A042FC559F7E089000B109393 :10108000FACEFE20FC0700282FF7F144FF4CC028C1 :1010900010938900FE9FFDE9402CF8090709EDB97E :1010A0000000C021A1A14C7B30AA508B505A30398E :1010B0006C1A580AE089000C501950080C9B403CEF :1010C000F01F004140194008E081056CEDB10006B9 :1010D000C151C1F86C1A201A8D1A580AE08A00040E :1010E0008D0CC0B8501950080C9B403CF01F0036C6 :1010F00040194008E08105562FF06C0A4B3EF4CCB5 :10110000FFFF7C0B158AF60A070AEDBA0003CE3002 :101110005829E08001C05839E080031D5819E0804B :10112000011B029CE21C0010502C5802F9B2000175 :10113000E3D1C001E080009B580CC0303001C4985E :101140005808C2500E34C064FACBFE20F6040024C6 :10115000C278FACAFED40A99F407002A0E98130B33 :1011600014AB2FF81034CFC4EEC9FFFFEE0811FF07 :10117000F0C7FFFF2FE808080807EA080025F20774 :101180000007FAC8FED4F0040324C228E6C8FFFF13 :101190000E33C094FACAFE201093F4040024E8F43D :1011A000FF4CC1686A042FC559F7E08900111093FC :1011B000FAC9FE20F20700282FF7F144FF4CC0883F :1011C0008002EFB4800328BC0000049C10930891B7 :1011D00030044D5E7C081034E08004E46C08118912 :1011E000FAC8FE200808F169FFCC6C1820188D1889 :1011F0006C082FF8308A8D08300BFACCFE2CF01FCB :10120000004B2FF4FAC8FE2C0899FACAFE54029B30 :10121000403CF01F00475BFCE08004C4580CC061F8 :10122000402C580CC051830CC0385BECC0B0080097 :10123000402B2012580BF9B40100F7B100FCFBF46D :1012400000026C185808E089000B0C9B403CF01F12 :101250000039C0505804C050E08F04A45802CBA1FC :10126000402A580AFE91FD01C718402E580EC1A011 :101270006C186C090438C0F4100910128D091001A3 :101280000C9B403CF01F002BCF405801E08101E651 :10129000E08F0488040904188D098D180401E08F7B :1012A00001DD5808C2500E34C064FACCFE20F804A8 :1012B0000024C278FACAFED40A99F407002A0E98CC :1012C000130B14AB2FF81034CFC4EEC9FFFFEE0898 :1012D00011FFF0C7FFFF2FE808080807EA080025FC :1012E000F2070007FAC8FED4F0040324C258E6C887 :1012F000FFFF0E33C094FACBFE201093F6040024B7 :10130000E8F4FF4CC1986A042FC559F7E08900142E :101310001093FACAFE20F40700282FF7F144FF4C7F :10132000C0B80000000009AC8002E8BC800328407F :10133000800328BC1093049A089C0C99301BF01F62 :1013400000C9E080042FF800000040492FF95049FF :10135000FE9FFC8B5802F9B200FFEDB10004C261A0 :1013600030040891C1286C188D0920188D182FF4AD :101370000832E080008D5808E08900080C9B403C52 :10138000F01F00B9E08100846C08FACEFE20F0C99D :10139000FFFF1188FC080008F138FE4CE208180035 :1013A000CE315804C741E08F04065808C2500E34AD :1013B000C064FACCFE20F8040024C278FACAFED435 :1013C0000A99F407002A0E98130B14AB2FF8103467 :1013D000CFC4EEC9FFFFEE0811FFF0C7FFFF2FE8F3 :1013E00008080807EA080025F2070007FAC8FED433 :1013F000F0040324C1C8E6C8FFFF0E33C094FACB43 :10140000FE201093F6040024E8F4FF4CC1086A049F :101410002FC559F7E089000B1093FACAFE20F40794 :1014200000282FF7F144FF4CC02810930891300892 :10143000C1886C1A201A8D1A133A02CA8D095802F3 :10144000C1D06C195809E089000D50080C9B403C34 :10145000F01F00854008C0500831C101E08F03A291 :101460006C0AFACEFE2014992012158AFC0A000A92 :10147000F53AFE4CF00A1800CDD1E2040104E080F8 :10148000039A404C2FFC504C3008A2880800FE9F65 :10149000FBEC029BE21B0010502B5802F9B200FF3C :1014A000E3D1C001E08000BC580BC050FACAFE2452 :1014B000506AC4385808C2500E34C064FAC9FE20BD :1014C000F2040024C278FACAFED40A99F407002A6A :1014D0000E98130B14AB2FF81034CFC4EEC9FFFFD6 :1014E000EE0811FFF0C7FFFF2FE808080807EA0819 :1014F0000025F2070007FAC8FED4F0040324C1C88F :10150000E6C8FFFF0E33C094FACEFE201093FC0411 :101510000024E8F4FF4CC1086A042FC559F7E0899C :10152000000B1093FACCFE20F80700282FF7F144A7 :10153000FF4CC0281093506430014CC4C598680813 :101540001031E080032FFAC8FE200208F169FFCCB9 :101550006C1820188D186C082FF8308A8D08300B05 :10156000FACCFE2CF01F00422FF1FAC8FE2C029993 :10157000FACAFE54406B403CF01F003E5BFCE0802A :101580000311580CC041406B970CC0385BECC23063 :10159000406A740CF01F0038C100FAC4FE20020437 :1015A0002354C088098B201120140C9A403CF01F52 :1015B00000335801CF81C2C80200402920125809C7 :1015C000F8011710FBF80006F7B800FCFBF80A0654 :1015D000FBF100026C185808E089000B0C9B403CA2 :1015E000F01F0021C0505801E08102DCC1186C08D6 :1015F00058025F1A11894A2E300C7C08F00907083E :10160000EC180008F5E80238F8081800C991402BDA :10161000580BFE91FB2A406A950BC98A402E580E42 :10162000C300C1086C188D0A20188D182FF10232E2 :10163000C1405808E08900070C9B403CF01F000A9D :10164000C0C16C0848ECF0CAFFFF78091188F208A5 :101650000708EDB80003CE710200FE9FFB060000F4 :10166000800320B8800328BC000009AC8002E8BCDD :10167000800328408003274880032FF40000049C47 :101680005808C2500E34C064FACBFE20F604002481 :10169000C278FACAFED40A99F407002A0E98130BEE :1016A00014AB2FF81034CFC4EEC9FFFFEE0811FFC2 :1016B000F0C7FFFF2FE808080807EA080025F2072F :1016C0000007FAC8FED4F0040324C1C8E6C8FFFF2F :1016D0000E33C094FACAFE201093F4040024E8F4F8 :1016E000FF4CC1086A042FC559F7E089000B10931D :1016F000FAC9FE20F20700282FF7F144FF4CC0285A :1017000010930891C1286C1920198D19113902C93B :101710008D085802C1506C185808E08900070C9BCE :10172000403CF01F0059C0C16C094D8E12987C0AD4 :1017300013892012F4090709EDB90003CE51404C7A :101740002FFC504C08103008E2000000A288FE9FD9 :10175000FA8CE4C90001E0490026E08B0005300B5B :10176000506BC058E4CA00273272506A3009FACE72 :10177000FE54509950A7E8110D80502E35894057DE :101780006C0A339C158AF80A1800E08B0015338B1D :10179000F60A1800C4E2330BF60A1800C270E08B98 :1017A000004532BBF60A1800C51032DBF60A1800F5 :1017B000C7C1C4C8F20A1800C4E0E08B000AF4CB29 :1017C0000041305EFC0B1800E08B0070C398361CA3 :1017D000F80A1800C6A3366BF60A1800E088003134 :1017E000378EFC0A1800C611C368029BEDB1000BCE :1017F000C3C15807E06B0200E3DBE031F9B7000832 :10180000EDB1000AC041E011FA7FC2F8409B406C84 :101810002FFB580CF7BC0101FBFC1A06F7B201FFC5 :10182000E011FC7F509BC248499EFC070417C0B8DA :10183000497CF80704175887E0890006C36858A751 :10184000E08A0034E011F47FC108EDB10007C2D195 :10185000A7D1C0B8029BE21B0600E04B0200C251B8 :10186000A9D13107E8110500402B16CA502B6C1A7C :10187000201A8D1A580AE08A000D6C0A2FFA8D0A78 :10188000C1180000800328BC0000049C8003EF08FE :10189000501950080C9B403CF01F00BD40194008F7 :1018A000C0412012FE91FF6E505740A7EDB10008D5 :1018B000C161FAC9FE54402A123AE088000B40295F :1018C0000C9A137B403C50085029F01F00B240088E :1018D000FAC9FE5440221232E080016D029AE21AE7 :1018E0000010E081014B402EBC8A50084059FACBD1 :1018F000FE54403C40825D1202994008E2190020EB :10190000C2A05808C1400E34C064FACEFE20FC04C8 :101910000024C1D9FACAFED40A99F407002A0E9805 :10192000130B14AB2FF81034CFC4CF68E6C8FFFFF9 :101930000E33C064FACBFE20F6040024C0796A049A :101940002FC559F7E08901151093FACAFE20F40754 :101950000028C0A9EDB10002C4415808C2500E349D :10196000C064FAC9FE20F2040024C278FACAFED488 :101970000A99F407002A0E98130B14AB2FF81034B1 :10198000CFC4EEC9FFFFEE0811FFF0C7FFFF2FE83D :1019900008080807EA080025F2070007FAC8FED47D :1019A000F0040324C1C8E6C8FFFF0E33C094FAC296 :1019B000FE201093E4040024E8F4FF4CC1086A04FC :1019C0002FC559F7E089000B1093FACEFE20FC07D3 :1019D00000282FF7F144FF4CC0281093A80CCCA886 :1019E000F5D1C001C2A05808C1400E34C064FACB82 :1019F000FE20F6040024CAB8FACAFED40A99F407F5 :101A0000002A0E98130B14AB2FF81034CFC4C8481B :101A1000E6C8FFFF0E33C064FACAFE20F4040024B7 :101A2000C9586A042FC559F7E08900A31093FAC971 :101A3000FE20F2070028C988E2110002C5904D6916 :101A400040821232C091FACBFE544059403C5008BB :101A5000F01F0052C088FACBFE544059403C500859 :101A6000F01F004F40085808C2500E34C064FACE30 :101A7000FE20FC040024C278FACCFED40A99F807B0 :101A8000002C0E98130E18AE2FF81034CFC4EEC9E8 :101A9000FFFFEE0811FFF0C7FFFF2FE80808080757 :101AA000EA080025F2070007FAC8FED4F004032470 :101AB000C1C8E6C8FFFF0E33C094FACCFE201093D5 :101AC000F8040024E8F4FF4CC1086A042FC559F754 :101AD000E089000B1093FAC9FE20F20700282FF7C7 :101AE000F144FF4CC0281093891A890BC438580858 :101AF000C2500E34C064FAC8FE20F0040024C2783C :101B0000FACAFED40A99F407002A0E98130B14ABF4 :101B10002FF81034CFC4EEC9FFFFEE0811FFF0C755 :101B2000FFFF2FE808080807EA080025F20700076A :101B3000FAC8FED4F0040324C1C8E6C8FFFF0E3380 :101B4000C094FAC2FE20E40400241093E8F4FF4C91 :101B5000C1086A042FC559F7E089000B1093FACE2B :101B6000FE20FC070028F144FF4C2FF7C0281093FB :101B7000890C404C2FFC504CFAC8FE54409B10106E :101B8000402A1600F4000000FE9FF86F800328BC76 :101B900080032FF480032E6C80032CE480032B340D :101BA00040495809C0508C68EDB80006C0313FF874 :101BB0005048404C288DD832D421217D1497189656 :101BC000129A5807C064E068008B99383FFCC2281D :101BD0005807EE0C1700F9B901FFEFD9E10C109985 :101BE000E0680208BA683FF8504B505C500B502C2C :101BF000BA781A9B0C9CF01F00095BFCC044E0689B :101C0000008B8D385807F9B90100FBF81000F1F985 :101C10001E002E9DD82200008002F568D401129883 :101C20001499169A189B483C780CF01F0003D802B0 :101C30000000059880031BB8D4214B3818961697DE :101C4000700C580CC06078685808C031F01F002F25 :101C50004AF81037C0514AC870087007C0E84AD81F :101C60001037C0514A8870087017C0784AA81037DA :101C7000C0414A58700870278E68EDB80003C1E073 :101C8000EDB80004C3E1EDB80002C1516EDB580BA2 :101C9000C0A0EEC8FFBC103BC0400C9CF01F001F52 :101CA00030088FD88E68E018FFDBAE6830088F18D8 :101CB0006E488F088E68A3B8AE686E485808C0B1E9 :101CC0008E68E2180280E0480200C0500C9C0E9B17 :101CD000F01F00138E69F1D9C001C07030088F2841 :101CE0006E585C388F68C068EDB90001EFF81005D8 :101CF0008F286E485808C0618E68EDB80007C02173 :101D0000DC2AD82A0000059880031F388003EF2CB6 :101D10008003EF4C8003EF6C8003217C8003276CF1 :101D20004828700C2F4C5EFC00000598D4211697B3 :101D3000189676485808C7D0580CC060786858087C :101D4000C031F01F003D4BD81037C0316C07C0A820 :101D50004BB81037C0316C17C0584BA81037EDF78F :101D600000028E6A1498EDBA0003C420ABBAAE6AC2 :101D70006E185808E08900066F085808E08A005A73 :101D80006EB85808C560E21A1000C0306F55C0F830 :101D900030196E8B0C9C5D1818955BFCC0816C38FB :101DA00059D8C4708E68A7A8AE68D8228E68EDB8DE :101DB0000002C0916E1810156ED85808EFF8101078 :101DC000EBD8E1156EB80C9C30090A9A6E8B5D1841 :101DD0008E680A3CC261ABD8300C6E49AE688F1C6D :101DE0008F09EDB8000CC251EF450054D8226E4562 :101DF0005805C1F06E04F5DAC0028F05F9B801008C :101E0000EFF800050A148F28C11808990A9A6EA8DD :101E10006E8B0C9C5D181814580CE08900078E68B6 :101E2000A7A83FFCAE68D82218055804FE99FFEF1A :101E3000D82A000080031F388003EF2C8003EF4C6A :101E40008003EF6CD401189B580CC0714868487B24 :101E5000700CF01F0007D8024868700CF01F0003D8 :101E6000D80200008003ECA880031D2C800325E825 :101E7000000005985EFC5EFCD401483BF01F0003A7 :101E8000D80200008003629080032640D42116957A :101E9000F606105CECCBFFF4F01F00071897C0901B :101EA0009915300B2F4C0C9A8F2C8F0BF01F0003C1 :101EB0000E9CD8228002E2BC8002E8BCD42149C832 :101EC000189670076E685808C0410E9CF01F0019E4 :101ED000EEC7FF2830056E2C6E18C0689869EA09B5 :101EE0001900C1202A4C2018CFA76E085808C071CD :101EF000304B0C9CF01F00108F0CC0306E07CECB07 :101F000030C88D38D8223008F948004C99089928F3 :101F1000991899489958996899D899E8F9480048C2 :101F20003FF8B8783018B868D82200008003ECA8D1 :101F300080031F3880031E8CD421189678675807B9 :101F4000C4714A48301599A8F94700D8F94700DC10 :101F5000F94700E09965F01F00208D0C0C9CF01FE4 :101F6000001E8D1C0C9CF01F001C6C093048930750 :101F7000B268931793276C18B27793479357936778 :101F80009389910791179127494E495B939E93AB93 :101F9000494A495493BA93C43099B069B07591C411 :101FA0009147915791679188919E91AB91BA8D2CF1 :101FB00031289907B868991799273028B87899C4B3 :101FC0009967999E99AB99BA99479957998CD82254 :101FD00080031E7880031EBC80032B1080032AD848 :101FE00080032AAC80032A9CD4014858169AFAC967 :101FF000FFFC189B700CF01F0003D802000005982E :1020000080033424D43114901291169310971895AC :10201000F20A02425802C0310491C418580CC06040 :1020200078685808C031F01F001F49F81037C031D8 :102030006A07C0A849D81037C0316A17C05849C8C4 :102040001037EBF700026E185808C03430088F18AC :102050000496C148F01F00176E08080308160E9B6F :10206000F00400040A9C8F04F01F0013C070E40603 :102070000109F2000D081091C1286E146E08069C2B :10208000089A109B0836FE9BFFE70C9AF01F000988 :102090006E080C088F086E180C188F18029CD83226 :1020A00080031F388003EF2C8003EF4C8003EF6C1C :1020B0008002E736800328BCD40112981499169A3E :1020C000189B483C780CF01F0003D80200000598CC :1020D00080032004D42116951897F01F00234A345A :1020E00068287016E016FFFCECC8FF91F0050105AA :1020F000E015FF80EAC50080E045007FE08A00230C :10210000300B0E9CF01F001A68280C08103CC1A16F :10211000EA0B11000E9CF01F00165BFCC171300B26 :102120000E9CF01F00136828F808010958F9E08A8E :10213000000AA1A9911948F8700948F8F80901099D :1021400091090E9CF01F000DD82A68280A16A1A636 :102150009116489870090A190E9C9109F01F000702 :10216000DA2A00008002E8CA0000059C8002EBC861 :10217000000009A800007AD08002E8CCD42116968D :102180001897580BE08000CAF01F004E20864CEADA :102190006C18742EF9D8C001A1C8EC080009721B94 :1021A000E01BFFFC1C39C1D1F6080008580CC081A7 :1021B0006C09121612086C3B6C299729933B1099F5 :1021C0009526A1A98D194C1972091238C0634C08C3 :1021D0000E9C700BF01F003F0E9CF01F003FD8229A :1021E000931B580CC030300CC1086C0EF4C5FFF8BE :1021F0001C161C086C2E0A3EF9BC0001EDF51003FC :10220000EBFE1A02FDF51A03F20B000E7C1EEDBE6A :102210000000C1301608580CC0C14ABE722B2F8E68 :102220001C3BC071973697268D2B8D3B301CC058B8 :10223000722B7239932B97391099EC080908A1A9D0 :102240008D19580CC671E04801FFE08B0013A3986C :10225000F4080039722B8D398D2B97369326A348BD :102260007419301BF6080948F3E810089518C528BA :10227000F00916095849E08B0006F00B16062C8B66 :10228000C2D85949E08B0005F2CBFFA5C278E049DE :102290000054E08B0006F00B160C292BC1F8E04926 :1022A0000154E08B0006F00B160F289BC178F00B51 :1022B0001612E0490554E088001137EBC0F8000021 :1022C0008002E8CA0000059C000009A400007ACC46 :1022D000800320D48002E8CC284BF40B003C782902 :1022E0001839C0E17418A34B301CF80B094BF1EB03 :1022F000100B1298951BC0A872291839C060721A69 :10230000E01AFFFC1438CF9372388D388D2993363C :1023100091260E9CF01F0002D82200008002E8CC1B :10232000D431203D14941895169774285808E080ED :10233000014A9668EDB80003C04176485808C0C10C :102340000E9B0A9CF01F00A1C0708E68A7A8AE6803 :1023500030988B38C3598E6368000696E2160002E7 :10236000C2103003E06204000696C04860036016A5 :102370002F805806CFC0E0460400EC091780E4091E :1023800017B0069A6EA86E8B0A9C5D181816580C2A :10239000E08A0114682818188928E08001141803BD :1023A000CE9BE7D3C001C07050060C930C91501522 :1023B0000892CA0806960891C048600360162F80EC :1023C0005806CFC08E686E241099E2190200C570BD :1023D0000836C4531099E2190480C4106E4B6E097C :1023E000161950096E59109CF209001A3028F40889 :1023F0000C08FAE9000410944009E21C04002FF9CB :102400000C091238F2041730580CC110089B0A9CB2 :10241000F01F006F1892C150400A6E4BF01F006D04 :102420008E68E018FB7FA7B8AE68C0E8089A0A9CDF :10243000F01F00691892C0816E4B0A9CF01F006764 :1024400030C88B38CBA8400A4009E80A010AE409E1 :1024500000088F548F2A8F088F420C940836EC04A2 :102460001730069B089A6E0CF01F005D6E08080876 :102470008F086E2808180C948F28C30808365FBA96 :102480006E0C6E48103C5FB8F5E80008F2081800C2 :10249000C0E0069B089AF01F00526E0808080E9BC9 :1024A0008F080A9CF01F004FC190C8786E591236F1 :1024B000C0A36EA8069A6E8B0A9C5D181894E089DA :1024C000000EC7B80C9A069BF01F00456E080C085A :1024D0000C948F086E280C188F28622808188328FF :1024E000C71008160803C6DB6003601130082F8090 :1024F00050085801CFA0400A580AC181029A30AB57 :10250000069CF01F0039F9B80101F9D8E106EDD3B6 :10251000E116F9B90101FBF91A00F9B80001E3D895 :10252000E006F9B80001FBF80A000236EC04178057 :10253000E20417B06E596E25F20500050A345F9A61 :102540006E0C6E48103C5FB8F5E80008300AF408DD :102550001800C0E0069B0A9AF01F00216E080A08C6 :102560000E9B8F08401CF01F001FC180C2681234F0 :10257000C0A56EA8069A6E8B401C5D181895E08960 :10258000000EC1B8089A069BF01F00156E080808D7 :1025900008958F086E2808188F280A16C0710E9BA0 :1025A000401CF01F0010C091500664280A188528AE :1025B000C0900A110A03C9EB8E68A7A8AE683FFC59 :1025C000C028300C2FDDD83280031C388002E2BCDA :1025D0008002E7368002E8E88003217C8002E87E02 :1025E00080031D2C800328A4D43130051893169045 :1025F0000A91F01F00123FF2E6C7FF28C1786E264D :102600006E142F46C0D88C08E2081900C0808C18C0 :10261000E4081900C040069C5D1018452A462014A5 :10262000ECCB000C5804CF046E075807CE91F01F76 :1026300000040A9CD832000080031E7480031E76BA :10264000D43130051691F8C7FF280A92F01F001008 :102650003FF3C1686E266E142F46C0C88C08E4088C :102660001900C0708C18E6081900C0305D111845BB :102670002A462014ECCC000C5804CF146E075807DF :10268000CEA1F01F00040A9CD832000080031E7403 :1026900080031E76D401201D4848189B1A9A700C9E :1026A000F01F00032FFDD80200000598800326B01C :1026B000D431169414921895F01F00204A08700720 :1026C0005807C050300633DA0C98C0780A9CF01FC7 :1026D000001D0E9CD8322FF6E8060709F0091800F5 :1026E0005F1BF40918005F191669F0091800CF4143 :1026F000C1A8029C0C9A089BF01F0013C1216E0117 :102700000C010388E6081800C0C148D870080A9C6C :102710001017A3478507F01F000BE2CCFFFFD8324C :102720002FC7C02833D36E015801CE410A9CF01F39 :102730000005029CD8320000800361BC000009B093 :10274000800361BE8002EDE6E04C00FFE0880003FC :102750005EFD48487008F00C070CE21C00085EFCA7 :102760000000049C481C5EFC8003EF8CD42120FDFB :10277000966816971896E2180002C3C1967BF00B74 :102780001900C0551A9AF01F002AC0F48E650A98E5 :10279000ABB8E2150080AE683004E0680400F9B51B :1027A0000140F0051700C1B84018E218F000E048F9 :1027B00020005F04E0488000C0D16EB949D81039CC :1027C000C0918E68E0650400ABA8EF450050AE688C :1027D000C0688E68E0650400ABB8AE680A9B0C9CCC :1027E000F01F00158E68C0D1EDB80009C1E0A1B896 :1027F000AE68EEC8FFB98F488F0830188F58C1589F :10280000A7B88F4CAE688F5548C88F0C8DA8580458 :10281000C0C08E7CF01F000AEFF81206F9B9010162 :10282000F1D9E138EFF81C062F1DD822800362A8E9 :1028300080032AAC8002E2BC80031E788002F1682B :10284000D42118971096580AC041149B3019486A31 :10285000F01F00065BFCC06130088D08E068008A4C :102860008F38D82280037E208003286C201D5809D1 :102870005F09580BFA0B1700580A5F18F3E80008B5 :102880003009F2081800C0303FECC0B8580AC03117 :10289000149CC078158997091589F00918005F1CE8 :1028A0002FFD5EFCF7DBC008C068201A19881638B7 :1028B0005E0C2FFC580ACFA15EFAD703D4211697DD :1028C0001896580CC06078685808C031F01F00385E :1028D0004B881037C0316C07C0A84B781037C03117 :1028E0006C17C0584B581037EDF7000230088F189E :1028F0008E68EDB80005C590EDB80002C1A0EDB836 :102900000004C060A7A8AE6830988D38C4D8EDB870 :102910000003C0B10E9B0C9CF01F0029C4618E689F :102920008F6CA3D88F2CAE688E68A3A8AE68C14800 :102930006EDB580BC110EEC8FFBC103BC0400C9CB6 :10294000F01F0020300C6F088FDC8F185808C04033 :102950006EF88F08D8226E485808C0510E9B0C9C08 :10296000F01F00198E68F1D8C002C0604978498B09 :10297000700CF01F00186E4A6E980C9C8F0A6E59EE :102980006E8B5D188E688F1CADD8AE68580CE08ACF :102990000003D82A580CC041A5B8AE68C058A7A8F3 :1029A000AE6830088F18DC2ADC2A000080031F384C :1029B0008003EF2C8003EF4C8003EF6C80031D2C11 :1029C0008003217C8003276C8003ECA8800329D43A :1029D00080032640D4019868E21800095898C02066 :1029E000D80AF01F0002D80280031E44D431189E7A :1029F0001738E048005EC030300AC0381738301A47 :102A00003009FC090B0A2FF9E0490100CFB1580841 :102A1000C041F6CC0001D832149632D4EC16000135 :102A2000300735D5C0381498129BFC080B06F6C940 :102A3000FFFF178A129CE80A1800C090EA0A1800E3 :102A4000C1E0EE0A1800CF01169CD832138C103C5E :102A50005F53E04C005D5F0AE7EA100AEE0A1800D7 :102A6000C03032D8CE2BF0CAFFFFFC0A000A14C6D1 :102A70002FF81838CFD52FEB2FE9CDCBD8321498BB :102A8000F5DBC01FF00C1100104CFC187FF0F5ECCA :102A900013FCF00C010CBF9C5EFCD703D401967BA9 :102AA000F01F0002D8020000800353E0D4211697E3 :102AB000967BF01F00098E681099ADC95BFCEFF999 :102AC0000C06EFFC1A15E0691000F1D9E138EFF8B7 :102AD0001C06D822800362D4D421966816971495D8 :102AE0001294E21801001896C0603029300A967BD3 :102AF000F01F00068E68ADC808990A9A8E7B0C9C60 :102B0000AE68F01F0003D822800362D4800353B460 :102B1000D4211697967BF01F0007C0656F581808E0 :102B2000EF480054D8228E68ADC8AE68D8220000A5 :102B30008003694CD431208D4DB8500B7008507C07 :102B4000502A1295501816970F36401AF4060704AB :102B5000E2140008CFA1E046002DC0410F3630142A :102B6000C058E046002BC0210F3658055F085905B4 :102B70005F0A3009F1EA100AF20A1800C1D0E046F3 :102B80000030C1210F8A358B378CF60A18005F0B95 :102B9000F80A18005F0A144BF20B1800C0500F9689 :102BA00031052FE7C0985808C070E0460030F9B5ED :102BB0000008F9B5010A5804C0713FF0E061FFFF59 :102BC000EA117FFFC0483000FC118000EA03141FA7 :102BD0000A980699009A029BF01F00340699505AF1 :102BE0000A98009A029BF01F0032069C14981699CE :102BF000300A30003001149E109212934019F206F0 :102C0000070BF3DBC001F9B90137F9B90057506977 :102C1000ECC80030EDBB0002C0804069F7DBC002A9 :102C2000EC090108580BC2D00A38C2B40430E601DE :102C300013005FB9F3EA13FAFC0A1800C1F104307B :102C4000E60113005F09405A14385F9AF5E900095C :102C5000FC091800C131E005064AEA010249504862 :102C6000F8000349BF58F20B000B5038FAE0000C93 :102C70001400E20B0041301AC0283FFA0F36CBFB9C :102C80005BFAC1715804C0713FF0E061FFFFEA11C7 :102C90007FFFC0483000FC11800032284079933813 :102CA000C10800000000049C800373408002D99892 :102CB0005804C07030083009F0000100F2010141F1 :102CC00040285808C0B0580AF9B801FFEFD8E10A07 :102CD000FBFA1A00402940089308009A029B2F8DA6 :102CE000D8320000D431209D4DE816927008508CE7 :102CF000505A1295504816970F36404EFC0607035F :102D0000E2130008CFA1E046002DC0410F3630137A :102D1000C058E046002BC0210F3658055F08590502 :102D20005F0A3009F1EA100AF20A1800C1D0E04641 :102D30000030C1210F8A358B378CF60A18005F0BE3 :102D4000F80A18005F0A144BF20B1800C0500F96D7 :102D500031052FE7C0985808C070E0460030F9B53B :102D60000008F9B5010AEA04141F0A9808993FFA05 :102D70003FFBF01F003D0899502B503A0A983FFA4C :102D80003FFBF01F003A300B300830094041E206AB :102D9000070EE1DEC001ECCC00305800F9B101377C :102DA000F9B100571C90E2100004C061EC01010C65 :102DB000FDDEC002C3700A3CC354FAE000080038CC :102DC000E20913005FBE3000FDEB13FBE00B1800BF :102DD000C261FAE00008143C5F9E0038E20913006B :102DE0005F0B3000FDEB000BE00B1800C181F0051C :102DF0000640EA09024BFAE10000E808034BF6013D :102E00000001507C5001BF5CFAE00000506C301BA8 :102E1000FAE800180008F2010049C0283FFB0F360D :102E2000CB6B5BFBC071322840803FF981383FF8A3 :102E3000C0985803C07030043005E8080108EA095A :102E40000149405E580EC080580BF9BA01FFEFDA15 :102E5000E102405A9502109A129B2F7DD832000051 :102E60000000049C8002D99880037340D431203D37 :102E70004C48502C70011698113EE20E0705E215E1 :102E80000008CFB1E04E002DC041113E3015C058B2 :102E9000E04E002BC021113E58095F0C59095F0616 :102EA0003007F9E61006EE061800C1E0E04E0030EB :102EB000C131118635843783E80618005F04E606C1 :102EC00018005F06E9E61006EE061800C050119ED5 :102ED00031092FE8C098580CC070E04E0030F9B9A5 :102EE0000008F9B9010A3FF3E6090D023007500363 :102EF0000E9C0E93E20E0704E1D4C001F9B0013735 :102F0000F9B000575010FCC600300890E2100004E1 :102F1000C0814010E9D4C002FC0001065804C1C0C1 :102F20001236C1A4043C5FBEFDE713FEE60E180096 :102F3000C101043C5F0E40070E365F97EFEE000EB6 :102F4000E60E1800C061B33C3017EC0C000CC02832 :102F50003FF7113ECD0B5BF7C061322940200E9C3C :102F60008139C0485805FBBC0100580AC070580799 :102F7000F9B901FFF1D9E10B950B2FDDD832000033 :102F80000000049CD421169776DBEEC8FFBC103BF2 :102F9000C171E06B0400F01F0015C250E06804002E :102FA0008FDC8FE8EF380046F8CCFC03B8A8EF3888 :102FB0000045B898EF380044B8888F0CC1386EE5EA :102FC000EA041501089AF01F000A1896C0C00A9A70 :102FD000189BF80500050A9CF01F00068FE48F057A :102FE0008FD6D82ADC2A00008002E2BC8002E8E802 :102FF0008002E736D4211697149618955BFBC650CD :10300000580CC06078685808C031F01F00314B1868 :103010001036C0316A06C0A84AF81036C0316A16A8 :10302000C0584AE81036EBF600028C68A5D8AC68A8 :10303000EDB80002C140EDB80004C461EDB8000372 :10304000C0B10C9B0A9CF01F0026C3E18C688D6CFC :10305000A3D88D2CAC688C68A3A8AC680E946CD8EF :103060005C545808C1006C196CE81039C0650A9CA2 :103070000C9BF01F001CC2816C0820188D08B084C6 :103080000897C0C86C495809C0C06C081238E0885D :10309000000911770837C0518D086C182FF8C12826 :1030A0006C18ED4800406C088DF8ECC8FFBC8DD85A :1030B00030388DE8ECC8FFBAED6400468D080897FB :1030C00030188D18C0283FF70E9CD82280031F3877 :1030D0008003EF2C8003EF4C8003EF6C80031D2CEA :1030E00080032F84D431208DFAC4FFBC504B682E4E :1030F000505812967C0B7005506E580BF40B17004D :103100006803681140493008C2C92FFB325C178A36 :10311000F80A18005F1EF00A18005F1CFDEC000C96 :10312000F00C1800CF31580AE0800129300C3FFA2A :103130001890503A18941892F80C003C1697507C4E :103140004CDC0F3AF80A070E407C1C0C4CBEFC0C01 :10315000070E201E500E4CAEFC0C070C507C400C91 :10316000587CE08B00F84C7EFC0C032F368BF60A63 :103170001800E08000F0371BF60A1800C07034CB4E :10318000F60A1800C051A3B4CE58A5B4CE380F8BA0 :1031900036CAF40B1800C051A5B4EECBFFFFCDB872 :1031A000A5A4CD88EBD5C005367CF80A1800E08BC5 :1031B0000027365BF60A1800C48234FBF60A1800B2 :1031C000C480E08B000C345BF60A1800C3E0347B4B :1031D000F60A1800C3A0344BC088358BF60A1800D5 :1031E000C2C0E08B0007355BF60A1800C351C31854 :1031F000363BF60A1800C2F0364BC0E8370BF60A29 :103200001800C250E08B000D36EBF60A1800C1F032 :10321000E08B0014369BF60A1800C1E1C0E8375B6A :10322000F60A1800C0A0378BF60A1800C060373BBA :10323000F60A1800C111C0B8EDB40004C0A0EDB486 :103240000005C0913020C0883040C0683030C04890 :103250003010C0283000403B5BFBC040E20B09202F :10326000C7985860E08B00776C0AEACCFFFF486E85 :10327000FC00032F8003F2708003F1D48003F16817 :103280008003EFC88003EFE8F4CBFFF88D0BF4EA7E :103290000000E605083AC0F8F4CBFFFC8D0B740A79 :1032A000E605093AC088F4CBFFF88D0BF4EA00007C :1032B000E605083A0E9B1895C4E8620A5BFAC0B1AD :1032C00050195028E06A0080300B029CF01F004D1E :1032D00040284019E4CC00010E9B503CF20C0C49F4 :1032E000C3A8620A5BFAC0B150195028E06A008096 :1032F000300B029CF01F0043402840192012300A76 :103300000E9BE202092AF2020C49C25816976C0A77 :10331000F4CBFFFC8D0B740A0E9BE605093A2FF5E2 :10332000C1A8F4C20030C068E40200222FF7F40202 :1033300000120F8A580AC0E0230A589AFE98FFF636 :10334000C0982FF70F8A580AC050230A589AFE983F :10335000FFFA0E9B407C30BAF40C1800FE91FEEE92 :103360004042178C0A325F4AF00C18005F1CF9EAE1 :10337000000AF00A1800FE91FECB3008404E178A72 :10338000E2050021F00A1800FC091710E6050038D4 :10339000069EC2A8620A583AC1E0E0890007581A9E :1033A000C1A0582AC181C058585AC0C0C0B5C13840 :1033B0006C0AF4CCFFF88D0CF4E20000F0E300009E :1033C000C1086C0AF4CCFFF88D0CF4E20000F0E3C5 :1033D0000000C0786C0AF4CCFFFC8D0C740A910AD2 :1033E0002FF52F882FC11235FE9AFFD61C9340521D :1033F000406E85059D0B404BE60B003C2F8DD8326F :103400008002E8BCD421149774285808C04195184C :10341000109CD822F01F000330088F188F28D82264 :1034200080032320D431FACD06BC5109169114979C :103430001895F01F0056780C50CC5805C0706A687B :103440005808C0410A9CF01F00524D281031C0316D :103450006A01C0A84D081031C0316A11C0584CF83B :103460001031EBF100028268EDB80003C041624800 :103470005808C071029B0A9CF01F0049E0810F941C :1034800082681099E219001A58A9C3D18279300ACA :10349000F4091900C385A1D8FB5805D06288FB4800 :1034A00005E462A8FB4805ECFAC8FFBCFB4805D45C :1034B000FB4805C4E0680400FB4805D8FB4805CC80 :1034C0003008FB5905D20E9A4109FAC7FA3CFB486D :1034D00005DC0A9C0E9BF01F003350BCC0950E9B70 :1034E0000A9CF01F003140BEF9BE01FF50BEFB0830 :1034F00005D0EDB80006E0810F598268A7A8A26840 :10350000E08F0F543008FB4806B4FB480690FB4898 :10351000068CFB4806B03008300950A75078FAC432 :10352000F9E03FF85059FB440688FB480544129CDB :10353000506950D950E950B9129740A2325A300818 :10354000C0282FF20589F00918005F1BF409180044 :103550005F19F3EB000BF00B1800CF4140ABE40B0D :103560000106C300FAF806900C08890BFB48069088 :103570008916FAF8068C2FF8FB48068C5878E089F3 :1035800000152F84C1C800008003276480031F3802 :103590008003EF2C8003EF4C8003EF6C80031C381A :1035A0008003342480031D2CFACAF978029B0A9CFC :1035B000F01F0071E0810EF4FAC4F9E040BA0C0A81 :1035C00050BA05893008F0091800E0800ED930099A :1035D000FB6806BB0E96E4C8FFFF3FFE50945041C7 :1035E0000E940491508950A8502E50391293129085 :1035F00010970A92C0783FFC0A97502CC038300BC5 :10360000503B0F38C0281290F0C90020E049005804 :10361000E08B0A4A4D9AF409032F50A750800C976B :103620000495089602924D6940941090404150D9FB :10363000E08F08AA3008FB3906BBF0091800CE213C :103640003208C6E8A1A3CDEB0F89F2C80030589824 :10365000E08B001DEEC8FFFF300B2309F60B002B9B :10366000F20B001B1139F2CA0030589AFE98FFF78E :10367000E0490024CC51E04B0020E0890E90201B53 :10368000FAF906B4123BC095C108FAF906B4ECCABF :10369000FFFF1236C1F5C268FACEF9441097FC0B51 :1036A000003BF6F0FD88C3581097FAC8F9501AD8B5 :1036B000FAC8FAB81AD8FAC8FBB4029A1AD8049C05 :1036C000FAC8F940FAC9FFB4F01F002E2FDD7800C8 :1036D000C208FACCF9441496F8040038F0F0FD88DA :1036E000C188410859F9E0890011F0CBFFFC510B6A :1036F0007000FACBF944F6090038F140FD882FF943 :103700001496FB4906B4C058700014962FC851088F :103710005800FE94FF785C30A3A3C74B32B8FB6817 :1037200006BBC70B0F38E048002AC0303009C80874 :103730000F88F0C900305899E08B0026EEC5FFFFD6 :10374000300B2308F60B002BF00B001B0B38F0C9D5 :1037500000305899FE98FFF7E0480024FE91FF5191 :10376000E04B0020E0890E1B201BFAF806B4103B4A :10377000C115C188800334048003F0048003EDD0B8 :10378000800330E4FAFA06B4ECC9FFFF1436C1F541 :10379000C288FACAF944F40B003BF6FBFD88502BB3 :1037A000C3C8FAC8F9501AD8FAC8FAB81AD8FAC869 :1037B000FBB4029A1AD8049CFAC8F940FAC9FFB4BB :1037C000F01F017B2FDD780C502CC27812960E95DD :1037D000FAC9F944F2040038F0F8FD885028C1D83D :1037E000410859FAE0890014F0CBFFFC7008510B36 :1037F0005028FAC6F944402EEC0A0038F14EFD88F4 :103800002FFA0E95FB4A06B41296C078700C0E95EE :103810002FC8502C12965108402B580BFE95FEEDE8 :103820000A97CF0AF20900290F38F4090019F0CAE3 :103830000030589AFE98FFF83FFAF20A0C495029D6 :10384000CE4AA7B3CDFA30092308F2090029F009BE :1038500000190F38F0CA0030589AFE98FFF7E04878 :103860000024FE91FED2E0490020E0890D98F2C4C8 :10387000000130195039CC6AA3B3CC4AA7A3CC2A93 :103880000F8836CEFC081800C0412FF7A5B3CBAA8D :10389000A5A3CB8AA5B3CB6A50A750800C971090F4 :1038A00008960495409402920E994041FAF806B4A5 :1038B000403C580CC1D01036C064FACBF944F6062F :1038C0000036C1D8FAC8F9501AD8FAC8FAB81AD8C6 :1038D000FAC8FBB41AD8FAC8F940FAC9FFB4049A76 :1038E0000C9B0A9CF01F01322FDD19B8C2282FF75C :1038F0001039C084FACAF944F4060036ED38FD8B5D :10390000C188410959F8E0890012F2CAFFFC510A46 :103910007209FAC6F944EC08003A2FF8F549FD8817 :10392000FB4806B4F1D9C008C04813B82FC95109E3 :10393000FB680660300E30083012FB6806BB502E64 :10394000E08F08C450A750800C9704950896029207 :10395000409410904041A5A3C0A850A750800C9758 :10396000049508960292409410904041EDB30005F2 :10397000C511FAF806B4403C580CC1E01036C064DA :10398000FACBF944F6060036C208FAC8F9501AD83C :10399000FAC8FAB80C9B1AD8FAC8FBB41AD8FAC9F4 :1039A000FFB4FAC8F940049A0A9CF01F01012FDD08 :1039B000781B7809C2B8EECAFFFF1037C0B4FAC945 :1039C000F9441497F2060036ECFBFD8CECF9FD8807 :1039D000C1D8410959F8E0890014F2CBFFF8510B26 :1039E000FAC6F944721BEC08003C7209F94BFD8CD5 :1039F000F949FD882FF81497FB4806B4C078F2C83F :103A0000FFF8721B1497510872091698FAE9000022 :103A1000CAE8EDB30004C171FAF806B4403E580E8E :103A2000C0801036C694FACCF944F8060036C8288F :103A3000EECAFFFF1037E0840081FACBF944F606A6 :103A40000036C778EDB30006C4B1FAF806B4403CBE :103A5000580CC1D01036C064FACBF944F6060036D3 :103A6000C1F8FAC8F9501AD8FAC8FAB81AD8FAC878 :103A7000FBB41AD8FAC8F940FAC9FFB4049A0C9BEF :103A80000A9CF01F00CB2FDD9818C268EECAFFFF1A :103A90001037C094FAC9F9441497F2060036ED08BD :103AA000FD8AC1A8410959F8E0890013F2CBFFFC57 :103AB000510B7209FAC6F944EC08003B2FF8F7499C :103AC000FD88FB4806B41497F1D9B010C05892187D :103AD00014972FC951095018BF585008C488FAF8D4 :103AE00006B4403C580CC1D01036C064FACBF9443F :103AF000F6060036C1F8FAC8F9501AD8FAC8FAB86A :103B00000C9B1AD8FAC8FBB4049A1AD80A9CFAC8B3 :103B1000F940FAC9FFB4F01F00A62FDD780BC248A8 :103B2000EECAFFFF1037C094FAC9F944F206003616 :103B30001497ECFBFD88C188410959F8E089001110 :103B4000F2CBFFFC510BFAC6F944720BEC080039BA :103B5000F34BFD882FF81497FB4806B4C058720B3E :103B600014972FC95109501BBF5B500BFAEA000094 :103B7000580A5C2BC0E43008FAEA00003009F00A69 :103B8000010AF20B014B32D8FAEB0000FB6806BBCE :103B90003018E08F071150A750800C9704950896B5 :103BA00002924094109040410E99EDB30003C4116D :103BB000FAF806B4403A580AC1901036C645FAC819 :103BC000F9501AD8FAC8FAB81AD8FAC8FBB40C9B3C :103BD0001AD8049AFAC8F940FAC9FFB40A9CF01F2F :103BE00000742FDD78165076C4882FF71039C0C4C2 :103BF000FACEF944FC060036ECFCFD8C507CECF669 :103C0000FD885056C668410959F8E0890010F2CA8B :103C1000FFF8721B510A7209FACAF944507B5059D5 :103C2000F4080039405B407AC47872185078C4C8F0 :103C3000FAF806B4403E580EC2301036C094FACCA2 :103C4000F944F8060036ECFBFD8C507BCD9BFAC89E :103C5000F9501AD8FAC8FAB8049A1AD8FAC8FBB4B4 :103C60000C9B1AD80A9CFAC8F940FAC9FFB4F01F95 :103C700000502FDD781A507A780C505CC2A82FF7CC :103C80001039C094FAC9F944F2060036ECF8FD8CFC :103C90005078CB6B410959F8E0890015F2CAFFF85A :103CA00072167209510A5059FACEF9445076FC083E :103CB0000039405B0C9AF2EBFD882FF8FB4806B404 :103CC000C088721C507CF2C8FFF851087209505924 :103CD000405B407AF01F00371896C1503008300919 :103CE000405B407AF01F0034C04032D8FB6806BB0E :103CF0004B284B36A7D3E0400047F00617A03032E0 :103D0000E08F06E7405B407AF01F002EC0C05026CF :103D10004AD84AE6A7D3E0400047F00617A0303261 :103D2000E08F06DD402A5BFAC04130695029C11896 :103D3000E04000475F09E04000675F08F3E81008D3 :103D4000F8081800C06040285808F9B80001502849 :103D500040784059FAE90694A9A3FAF8069458085D :103D6000C065405E300C506E509CC078405B32DACB :103D7000EE1B8000509A506BE04000465F09E04027 :103D800000665F08F3E810085048C0404022303910 :103D9000C228E04000455F09E04000655F084046FA :103DA0001049EC091800C1314022C148800330E4B9 :103DB0008003697880036FC08003F2408003F2447F :103DC00080032A7E8003F2488003F24C402EFCC21E :103DD000FFFF3029FAC8F95C1AD8FAC8F9541AD882 :103DE000FAC8F94C0A9C1AD80498409B40AAF01FC4 :103DF00001E0E04000475F19E04000675F18189657 :103E00002FDDF3E80008C041EDB30000C301EC0270 :103E1000000C503C404B580BC1500D893308F00941 :103E20001800C0B130083009406B407AF01F01D152 :103E3000FBB20001FBF20BAB403AFAF806AC100AF9 :103E4000503A406B30083009407AF01F01CAC090E8 :103E50004039FB4906A4C05810C9FB4806A4C02835 :103E60003309FAF806A4403E1C38CF73E0400047FF :103E70005F09E04000675F08F3E81008FAF906A45C :103E80000C1950695808C0B0FAF806AC5BD8C05598 :103E9000402C1838E08A006A2020C058E0400065B5 :103EA000E0890046FAFB06ACFB60069C201BFB4B3E :103EB00006ACC0475C3B32D8C02832B8FB68069DD0 :103EC000589BE08A001DFAC9FA3530AA12980E9C58 :103ED0000C92F60A0C060E9B2D0B10FB0C9B5896B1 :103EE000FE99FFF92D0B1897049610FBFACAF96298 :103EF000C038113B14CB1238CFD3C0982D0B3308E8 :103F0000FB6B069FFB68069EFACAF960FAC8F96463 :103F1000F408010850E81092406B1602581BE08923 :103F20000005EDB30000C3512FF2C338E040006636 :103F3000C1C1FAF206AC5802E08A000C402A580AC5 :103F4000C041EDB30000C2512FF240291202C0B8A7 :103F500040285808C061EDB30000C0303012C1984D :103F600040222FE23660C158FAF206AC406E1C3295 :103F7000C065EDB30000F7B200FFC0A8E40811026D :103F8000406C5802F00217A0F9B20901180236700D :103F9000409B580BE080059D32D8FB6806BBE08F44 :103FA000059C50A704950C970292089640414094B6 :103FB0000E99EDB30005C481FAF806B4403E580EE0 :103FC000C1D01036C064FACCF944F8060036C1D826 :103FD000FAC8F9501AD8FAC8FAB8049A1AD8FAC81E :103FE000FBB40C9B1AD80A9CFAC8F940FAC9FFB472 :103FF000F01F01612FDD780AC2082FF71039C08445 :10400000FACBF944F6060036ECFAFD88C16841099E :1040100059F8E0890010F2CAFFFC510AFAC6F944C7 :10402000720AEC080039F34AFD882FF8FB4806B401 :10403000C048720A2FC9510940BE1C98951EBF582E :104040009508FE9FFA7CEDB30004C480E2130040A3 :10405000C450FAF806B4403C580CC1D01036C064C5 :10406000FACBF944F6060036C1D8FAC8F9501AD886 :10407000FAC8FAB8049A1AD8FAC8FBB40C9B1AD832 :104080000A9CFAC8F940FAC9FFB4F01F013B2FDDC2 :10409000780AC2082FF71039C084FACAF944F40626 :1040A0000036ECFAFD88C168410959F8E089001032 :1040B000F2CAFFFC510AFAC6F944720AEC08003948 :1040C000F34AFD882FF8FB4806B4C048720A2FC98E :1040D000510940BEB40EFE9FFA32FAF806B4403CD5 :1040E000580CC1D01036C064FACBF944F60600363D :1040F000C1D8FAC8F9501AD8FAC8FAB8049A1AD826 :10410000FAC8FBB40C9B1AD80A9CFAC8F940FAC941 :10411000FFB4F01F01192FDD780AC2082FF71039FC :10412000C084FACAF944F4060036ECFAFD88C16886 :10413000410959F8E0890010F2CAFFFC510AFAC699 :10414000F944720AEC080039F34AFD882FF8FB485D :1041500006B4C048720A2FC9510940BE950EFE9F91 :10416000F9EE50A750800C9704950896029240945F :1041700010904041A5A3C0A850A750800C9704956B :1041800008960292409410904041EDB30005C5D1CD :10419000FAF806B4403C580CC2601036C0A4FACB02 :1041A000F944F6060036ECE8FD88FAE90000C1881B :1041B000FAC8F9501AD8FAC8FAB8049A1AD80C9B57 :1041C000FAC8FBB40A9C1AD8FAC8F940FAC9FFB475 :1041D000F01F00E92FDDF8EA0000FAEB00003008DC :1041E000E08F03E7EECAFFFF1037C0B4FAC9F94405 :1041F0001497F2060036ECEAFD88FAEB0000C1885D :10420000410959F8E0890018F2E60000F2CBFFF806 :10421000FAE70000510BFAC6F944EC080039FAE657 :104220000000F2E7FD882FF81497FB4806B44038E9 :10423000E08F03BFF2E600004038FAE700002F8964 :1042400014975109E08F03B5EDB30004C161FAF88A :1042500006B4403E580EC0801036C674FACCF944FD :10426000F8060036C808EECAFFFF1037C7F4FACBCD :10427000F944F6060036C768EDB30006C4A1FAF8A3 :1042800006B4403C580CC1D01036C064FACBF94497 :10429000F6060036C1F8FAC8F9501AD8FAC8FAB8C2 :1042A0001AD8FAC8FBB41AD8FAC8F940FAC9FFB448 :1042B000049A0C9B0A9CF01F00B02FDD9818C2686E :1042C000EECAFFFF1037C094FAC9F9441497F206FA :1042D0000036ED08FD8AC1A8410959F8E0890013AC :1042E000F2CBFFFC510B7209FAC6F944EC08003B13 :1042F0002FF8F749FD88FB4806B41497F1D9B010A0 :10430000C058921814972FC951095C785018C46886 :10431000FAF806B4403C580CC1D01036C064FACB51 :10432000F944F6060036C1F8FAC8F9501AD8FAC8A6 :10433000FAB80C9B1AD8FAC8FBB4049A1AD80A9C8B :10434000FAC8F940FAC9FFB4F01F008B2FDD780BD3 :10435000C248EECAFFFF1037C094FAC9F944F2060A :1043600000361497ECFBFD88C188410959F8E089B3 :104370000011F2CBFFFC510BFAC6F944720BEC08AA :104380000039F34BFD882FF81497FB4806B4C0584A :10439000720B14972FC95109501B300E500E1C98E8 :1043A000E08F030750A750800C970495089602925F :1043B000409440410E99FAF806B4403C580CC1D0E4 :1043C0001036C064FACBF944F6060036C1D8FAC8F4 :1043D000F9501AD8FAC8FAB81AD8FAC8FBB41AD8D9 :1043E000FAC9FFB4FAC8F940049A0C9B0A9CF01F62 :1043F00000622FDD7809C2182FF71039C084FACA7D :10440000F944F4060036ECF9FD88C178410959F801 :10441000E0890010F2CAFFFC510AFAC6F944720999 :10442000EC08003AF549FD882FF8FB4806B4C0585F :10443000F2C8FFFC510872093308FB6806B83788D8 :10444000300EFB6806B94CDC5019A1B3500E50DC9D :1044500030283780E08F02AD50A750801090300890 :10446000FB6806BB0C970495089602924094404165 :104470000E99FAF806B4403B580BC1D01036C06410 :10448000FACAF944F4060036C1D8FAC8F9501AD865 :10449000FAC8FAB81AD8FAC8FBB40C9B1AD8049A0E :1044A000FAC8F940FAC9FFB40A9CF01F00332FDDA7 :1044B0007806C2082FF71039C084FAC9F944F20609 :1044C0000036ECF6FD88C168410959F8E089001012 :1044D000F2CAFFFC510A7206FACEF944FC08003910 :1044E000F346FD882FF8FB4806B4C04872062FC972 :1044F0005109402C580CC105189A300B0C9CF01F28 :104500000020E08002E9F8060102402B1632E08923 :1045100002E3E08F02DE300A0C9C502AF01F0019E3 :104520001892E08F02DC50A750800C9704950896F3 :104530000292409410904041A5A3C0A850A750807B :104540000C97049508960292409410904041EDB368 :104550000005C611FAF806B440395809C2C0103631 :10456000C124FAC8F944F0060036C2E88003552C8D :1045700080036F32800330E48003EDE4800328A4DD :104580008002EDD0FAC8F9501AD8FAC8FAB81AD889 :10459000FAC8FBB41AD8FAC8F940FAC9FFB4049AA9 :1045A0000C9B0A9CF01F00C82FDDF8E80000FAE918 :1045B0000000C2E8EECAFFFF1037C0B4FAC8F944E1 :1045C0001497F0060036ECEAFD88FAEB0000C2080A :1045D000410959F8E0890016F2E60000F2CBFFF835 :1045E000FAE70000510BFAC6F944EC080039FAE684 :1045F0000000F2E7FD882FF81497FB4806B4C08846 :10460000F2E600002F89FAE70000510914973018EC :10461000E08F01CFEDB30004C161FAF806B4403E6B :10462000580EC0801036C674FACCF944F80600362D :10463000C808EECAFFFF1037C7F4FACBF944F606F4 :104640000036C768EDB30006C4A1FAF806B4403CD2 :10465000580CC1D01036C064FACBF944F6060036C7 :10466000C1F8FAC8F9501AD8FAC8FAB81AD8FAC86C :10467000FBB41AD8FAC8F940FAC9FFB4049A0C9BE3 :104680000A9CF01F00912FDD9818C268EECAFFFF48 :104690001037C094FAC9F9441497F2060036ED08B1 :1046A000FD8AC1A8410959F8E0890013F2CBFFFC4B :1046B000510B7209FAC6F944EC08003B2FF8F74990 :1046C000FD88FB4806B41497F1D9B010C058921871 :1046D00014972FC951095C785018C468FAF806B4C9 :1046E000403C580CC1D01036C064FACBF944F606F1 :1046F0000036C1F8FAC8F9501AD8FAC8FAB80C9BB3 :104700001AD8FAC8FBB4049A1AD80A9CFAC8F94015 :10471000FAC9FFB4F01F006C2FDD780BC248EECA57 :10472000FFFF1037C094FAC9F944F2060036149717 :10473000ECFBFD88C188410959F8E0890011F2CBF2 :10474000FFFC510BFAC6F944720BEC080039F34B2D :10475000FD882FF81497FB4806B4C058720B1497C5 :104760002FC95109501B300E3018500EC21950A7D6 :1047700050800C970495089602924D4C40941090EE :10478000404150DCEDB30005C551FAF806B4403B9A :10479000580BC2201036C0A4FACAF944F4060036F9 :1047A000ECE8FD88FAE90000CF58FAC8F9501AD8A9 :1047B000FAC8FAB8049A1AD80C9BFAC8FBB40A9C37 :1047C0001AD8FAC8F940FAC9FFB4F01F003F2FDD2C :1047D000F8EA0000C0C8EECAFFFF1037C0B4FAC93B :1047E000F9441497F2060036ECEAFD88FAEB000073 :1047F000CD18410959F8E0890016F2E60000F2CB25 :10480000FFF8FAE70000510BFAC6F944EC0800394A :10481000FAE60000F2E7FD882FF81497FB4806B48B :10482000CB98F2E600002F89FAE7000051091497AF :10483000CB18EDB30004C171FAF806B4403E580E2F :10484000C0801036C6C4FACCF944F8060036C85801 :10485000EECAFFFF1037E0840084FACBF944F60675 :104860000036C7A8EDB30006C4E1FAF806B4403C30 :10487000580CC1D01036C064FACBF944F6060036A5 :10488000C1F8FAC8F9501AD8FAC8FAB81AD8FAC84A :10489000FBB41AD8FAC8F940FAC9FFB4049A0C9BC1 :1048A0000A9CF01F00092FDD9818C2A8EECAFFFF6E :1048B0001037C0D4FAC9F9441497F2060036ED084F :1048C000FD8AC1E8800330E48003EDE4410959F832 :1048D000E0890013F2CBFFFC510B7209FAC6F944D0 :1048E000EC08003B2FF8F749FD88FB4806B4149705 :1048F000F1D9B010C058921814972FC951095C789B :104900005018C468FAF806B4403C580CC1D01036B0 :10491000C064FACBF944F6060036C1F8FAC8F9507B :104920001AD8FAC8FAB80C9B1AD8FAC8FBB4049A79 :104930001AD80A9CFAC8F940FAC9FFB4F01F00C996 :104940002FDD780BC248EECAFFFF1037C094FAC9BA :10495000F944F20600361497ECFBFD88C188410942 :1049600059F8E0890011F2CBFFFC510BFAC6F9446B :10497000720BEC080039F34BFD882FF81497FB48B5 :1049800006B4C058720B14972FC95109501B300E32 :10499000500E4008401C18485F18E7E80008C07037 :1049A0003308FB6006B9A1B3FB6806B830283009AC :1049B000FB6906BB402B580BC025A7D3402A4009F2 :1049C000580A5F1A4016FAC2F9780C495F19F5E9DE :1049D0001009C5C03019F2081800C0603029F2086B :1049E0001800C041C3C80496C3080496FAE8000042 :1049F000F5D8C0032D0A0CFAF00B1603F20C1603BF :104A0000F7E911DB1899169858085C29CF21FAE9C3 :104A10000000EDB30000C4513309F20A1800C410BD :104A20000CF9C3F8FAEA000030A83009F01F008E34 :104A300030A82D0A3009AC8AFAEA0000F01F008B7A :104A400016991498FAE900002016FAEA0000589A1C :104A50005C2BFE9BFFE91BF82D08C2080496FAE8C0 :104A60000000F5D8C00440DEFC0A070A0CFAF20B7D :104A70001604F00A1604F5E911CA16991498580894 :104A80005C29CF01FAE90000C0C85808C091EDB315 :104A90000000C061FAC6F9793308AC88C0280496D2 :104AA0000C12C1C850A7508040940C9710900495E8 :104AB00040415808E0800464FB680660300C300810 :104AC0003012FB6806BB502CFAC6F9A0C078300B38 :104AD000502BC0484022300A502A4029E4090C4992 :104AE000FB3806BB5039069E3009E21E0002F20870 :104AF0001800FBF81003F7B801FFFBF81A03069B38 :104B0000580EFBFC1003F7BC01FEFBFC1A03E21B72 :104B1000008450FE509BC451408A4039121A504ABA :104B2000580AE089001FC3D82F092FF84D0E310C09 :104B3000FB490690890E891CFB48068C5878E08951 :104B400000042F84C0B8FACAF978029B0A9CF01FAF :104B50000049E0810425FAC4F9E0404B210B504B99 :104B6000FAF90690FAF8068C4C1A404E590EFE9946 :104B7000FFDD1C092FF8890AFB490690891EFB48B6 :104B8000068C5878E08900042F84C0B8FACAF978F6 :104B9000029B0A9CF01F0037E0810402FAC4F9E08E :104BA0003009FB3806BBF2081800C1F0FAF806908D :104BB000FAC9F9452FF88909FB4806903019FAF827 :104BC000068C89192FF8FB48068C5878E089000478 :104BD0002F84C0B8FACAF978029B0A9CF01F0025FE :104BE000E08103DEFAC4F9E040FC580CC1F0FAF8A9 :104BF0000690FAC9F9482FE88909FB480690302940 :104C0000FAF8068C89192FF8FB48068C5878E08949 :104C100000042F84C0B8FACAF978029B0A9CF01FDE :104C20000015E08103BDFAC4F9E0409BE04B008031 :104C3000C511408A4039121A504A580AE089002B9F :104C4000C4982F092FF848CE310CFB490690890EE5 :104C5000891CFB48068C5878E08900102F84C178A5 :104C6000800330E4800373408002D9988003F250BF :104C7000800334048003F260FACAF978029B0A9C2C :104C8000F01F004CE081038CFAC4F9E0404B210B8B :104C9000504BFAF90690FAF8068C4C7A404E590EB1 :104CA000FE99FFD11C092FF8890AFB490690891E3D :104CB000FB48068C5878E08900042F84C0B8FACAF3 :104CC000F978029B0A9CF01F003BE0810369FAC45B :104CD000F9E0402C041C502C580CE089001FC3D86C :104CE0002F092FF84B4B310AFB490690890B891A83 :104CF000FB48068C5878E08900042F84C0B8FACAB3 :104D0000F978029B0A9CF01F002BE0810349FAC44A :104D1000F9E0402921095029FAF90690FAF8068CA1 :104D20004A5A402E590EFE99FFDD1C092FF8890AB8 :104D3000FB490690891EFB48068C5878E0890004E0 :104D40002F84C0B8FACAF978029B0A9CF01F001998 :104D5000E0810326FAC4F9E0EDB30008C0B0FAF828 :104D6000069089128906F0020002FB420690E08F4D :104D700001DBE0400065E08A01DD30083009405B7E :104D8000407AF01F000EC7E0FAF8069048C92FF8E5 :104D90008909FB4806903019FAF8068C89192FF812 :104DA000FB48068C5878E089000D2F84C14800002C :104DB000800334048003F26080036F328003A6C056 :104DC000FACAF978029B0A9CF01F0078E08102E899 :104DD000FAC4F9E0FAF806AC406C1838C055EDB3E7 :104DE0000000E081026DFAF806902FF840CBFB48F6 :104DF00006903019FAF8068C890B2FF88919FB48B0 :104E0000068C5878E08900042F84C0B8FACAF97873 :104E1000029B0A9CF01F0065E08102C2FAC4F9E01F :104E2000406620165806E089001DE08F02492F09D0 :104E30002FF8FB49069089028910FB48068C5878A8 :104E4000E08900042F84C0B8FACAF978029B0A9C52 :104E5000F01F0056E08102A4FAC4F9E02106C03830 :104E60004D323100FAF90690FAF8068C4D0A5906CF :104E7000FE99FFDF0C09890AFB4906902FF8891675 :104E8000C559FAFA06AC580AE0890096FAF8069075 :104E90004C892FF88909FB4806903019FAF8068CDE :104EA00089192FF8FB48068C5878E08900042F8474 :104EB000C0B8FACAF978029B0A9CF01F003CE08156 :104EC000026FFAC4F9E0FAF806AC5808C081406AEB :104ED000580AC051EDB30000E08101F240C9FAF870 :104EE00006902FF88909FB4806903019FAF8068CCD :104EF00089192FF8FB48068C5878E08900042F8424 :104F0000C0B8FACAF978029B0A9CF01F0028E08119 :104F10000247FAC4F9E0FAF206AC5C325802E089C2 :104F2000001DC3B82F092FF8310EFB4906908900E8 :104F3000891EFB48068C5878E08900042F84C0B88D :104F4000FACAF978029B0A9CF01F0018E081022837 :104F5000FAC4F9E02102C0284950FAF90690FAF89B :104F6000068C493A5902FE99FFDF04092FF8890A95 :104F7000FB4906908912FB48068C5878E0890004AA :104F80002F84C0B8FACAF978029B0A9CF01F000768 :104F9000E0810206FAC4F9E0406CFAF8069089064E :104FA000891C1808CBE80000800334048003F260F9 :104FB0008003A6C0FAF90690FAF8068C406B163A00 :104FC000C6D516092FF88906FB490690891BFB48B0 :104FD000068C5878E08900042F84C0B8FACAF978A2 :104FE000029B0A9CF01F006FE08101DAFAC4F9E02D :104FF000FAF606AC406A14165806E089001CC3B8DD :105000002F092FF8FB49069089028910FB48068C6E :105010005878E08900042F84C0B8FACAF978029B56 :105020000A9CF01F0060E08101BBFAC4F9E0210690 :10503000C0384DD23100FAF90690FAF8068C4DAA24 :105040005906FE99FFDF0C092FF8890AFB490690E3 :105050008916FB48068C5878E08900042F84C0B874 :10506000FACAF978029B0A9CF01F004EE081019871 :10507000FAC4F9E0EDB30000E081012240C9FAF87A :1050800006902FF88909FB4806903019FAF8068C2B :1050900089192FF8FB48068CC04914092FF8FB49E1 :1050A00006908906891AFB48068C5878E089000426 :1050B0002F84C0B8FACAF978029B0A9CF01F003905 :1050C000E081016EFAC4F9E040C88908FAF8069058 :1050D0002FF83019FB4806908919FAF8068C2FF83A :1050E000FB48068CFAF206AC5878E08900042F845D :1050F000C0B8FACAF978029B0A9CF01F002AE08126 :10510000014FFAC4F9E00406FAF806AC8906FAF988 :1051100006904066406E1016F208010889161C08B9 :10512000FB480690FAF8068C2FF8FB48068CCB98C3 :10513000406C581CE0890006EDB30000E081008758 :10514000FAF806902FF83019FB4806908906FAF80D :10515000068C89192FF8FB48068C5878E0890004E2 :105160002F84C0B8FACAF978029B0A9CF01F000D80 :10517000E0810116FAC4F9E0FAF806902FF840CB66 :10518000FB4806903019FAF8068C890B2FF889191C :10519000FB48068C5878E08900092F84C10800007C :1051A000800334048003F260FACAF978029B0A9CF7 :1051B000F01F006FE08100F4FAC4F9E03008300914 :1051C000405B407AF01F006B40682018580CC0D13B :1051D0002FF689188906FAF606901006FAF8068C5A :1051E000FB4606902FF8C2F810965808E089001C7C :1051F000C4982F092FF8FB49069089028910FB48B3 :10520000068C5878E08900042F84C0B8FACAF9786F :10521000029B0A9CF01F0056E08100C2FAC4F9E02C :105220002106C0384D423100FAF90690FAF8068C92 :105230004D1A5906FE99FFDF0C09890AFB490690B1 :105240002FF88916FB48068CC0E8FAF806902FF86C :105250003019FB4806908906FAF8068C89192FF850 :10526000FB48068C5878E08900042F84C0B8FACA3D :10527000F978029B0A9CF01F003EE0810091FAC47D :10528000F9E040EAFAF806901408FAC9F964FB4814 :105290000690891AFAF8068C89092FF8FB48068CC3 :1052A0005878E08900042F84C0A8FACAF978029BD4 :1052B0000A9CF01F002FC731FAC4F9E0E213000482 :1052C000C3D04086403912165806E089001AC368D8 :1052D0002F092FF8FB49069089038912FB48068C99 :1052E0005878E08900042F84C098009A029B0A9C99 :1052F000F01F001FC541FAC4F9E02106C05849F368 :105300003102FAC0F978FAF90690FAF8068C49BA2F :105310005906FE99FFDF0C092FF8890A8916FB4907 :105320000690FB48068C5878E08A0009FACAF9789A :10533000029B0A9CF01F000EC32140BC4036408EE9 :10534000EC0E0C48100C50BCFAF806905808C080BF :10535000FACAF978029B0A9CF01F0005C201300BC3 :10536000FAC4F9E0FB4B068CFE9FF0E9800334049D :1053700080036F328003F2608003F250FAF80690E7 :105380005808C0800A9CFACAF978029BF01F0009ED :10539000C0613008FB48068CC02840418268EDB8E7 :1053A0000006C0313FFA50BA40BCFE3DF944D83245 :1053B00080033404D42116981897109C3008149B4D :1053C0004866129A8D08F01F00065BFCC0516C08FD :1053D0005808EFF81A03D82200008CC48002F1505C :1053E000D421300818974876169C8D08F01F0006C7 :1053F0005BFCC0516C085808EFF81A03D822000073 :1054000000008CC48002F108D431202D1897784810 :1054100076460C38C034300CC858ECC2FFFCF6C3DA :10542000FFECF6020329F802032C2FF92016F809E5 :105430000D08F6020022EEC4FFEC10955808C410C7 :105440003009069A08981291500B700EB18E501EBA :10545000150EFC001610FDDEC010EA0E0341FDD152 :10546000C010B181401BEA000240E2000000E3D01E :10547000C010021B501B700BE3DBC0100209F20EC0 :10548000010EB01EFC091410401EFC090009B009F1 :10549000E00116102FC8B149043AFE98FFD8400B1E :1054A000580CC0F1ECC8FFFBEE080028C0282016FD :1054B00020480838E088000570095809CF908F46C9 :1054C0000E9CF01F001AC2D52FF508983009070B63 :1054D000F60A1610700CF7DBC010F80E1610141E2A :1054E000F5DCC010161A120AB01AB14AFC0A0009FB :1054F000B0092FC8B1490433FE98FFEBECC8FFFB9D :10550000EE0803295809C0D1EE080028C02820164B :1055100020480838E088000570095809CF908F4668 :105520000A9C2FEDD8320000800363EED43121AD08 :10553000FAC4FF7418971695682C50C96816680944 :1055400050E81494512CFAE5000851596E9558050D :10555000C091310CF01F004799358F9C9915992502 :1055600099056E9972085808C0F0721A911A301A8B :105570007219F4090949109B91290E9CF01F003EF5 :105580006E9830099109402810945808C064F1D8E9 :10559000C01F50283018C02830088D08FC1C7FF030 :1055A00040260C98E6187FF01838C1C1E068270F34 :1055B000415B9708403A580AC061EDD6C014C0312B :1055C0004AECC0284AEC41295809E08005DEF8C8B9 :1055D000FFFD3009118AF20A1800C190F8C8FFF8DF :1055E000C168FAEA00083008FAEB003C3009F01F05 :1055F0000025C1103018415A950841294A285809F8 :10560000C041109CE08F05C1109C2FF841258B08EC :10561000E08F05BBFAC8FF9CFAC9FFA0FAEA003C7C :105620000E9CEBD6C28BF01F001918935805C0D002 :10563000FAEA003C3004F1DBC014EAC503FF109B1A :105640005174EA1B3FF0C3284188419C100CF8C5F7 :10565000FBCEE0450020E08A001BF8CCFBEE403B8F :10566000EA081140F60C0A4CEC0809460C4CC148FB :105670008002E2A4800364208003F3708003F37C43 :1056800080036F328003A6C0800364D0EA0C11202F :10569000403AF40C094CF01F006BFC18FE10301956 :1056A000EAC50433F00B000B51793008FC193FF8C0 :1056B000F01F0065E0684361EA18636FE06987A73F :1056C000EA193FD2F01F0061E068C8B3EA188B60A6 :1056D000E0698A28EA193FC6F01F005D0A9C149011 :1056E0001691F01F005CE06879FBEA18509FE069B2 :1056F0004413EA193FD3F01F005514981699009AE5 :10570000029BF01F005314901691F01F00533008B5 :1057100018963009009A029BF01F0050C0C00C9CE4 :10572000F01F004C14981699009A029BF01F004C31 :10573000F7B600015966E088000530185148C128C5 :105740004C88FAEA003CF0060238F01F0044F9B435 :105750000000FBF40A14F7B60101F9BC0100FBFCE0 :105760001A14419020100A10C04650403000C04822 :10577000300B5C30504BEC0211005806FBFA400431 :10578000F5D6E40AFBFA4A04FBF64A11F9B2040022 :10579000E1D6E510F9B90500FBF95A1140C858984F :1057A000E08B00205858F9B40A01FBF5900CF7B5CE :1057B0000904FBF59A0CF9B4090040CC583CC2D05E :1057C000E0890005582CC101C18840CB584BC0600E :1057D000585BC0A1301A50DAC228301950D9C0F82D :1057E0003008301450C83FF5301C300B509550DC59 :1057F0000A91312850EBC208300A50DA40E95809C2 :10580000E089000730185098109150E8C15840E5E1 :1058100050950A910A98C108300C50DC40EBEC0B13 :10582000000B509B16982FF85808E089000510913E :105830003018C028109130096E9A95193049C178F6 :1058400080036E4A80036B7C800369A480036D181B :1058500080036E5280036E2480036FC080036F321A :105860008003F38C6A1AA1792FFA8B1A6E95F2CA0B :10587000FFEC103AFE98FFF86A1B0E9CF01F0053D5 :1058800058E15F888B0CF1E400046E987008508832 :10589000E08001985806E08A0040F3D6C0044CC866 :1058A000F0090234FAE50018EC041404EDB4000425 :1058B000C0303025C0F84C78F0E80020FAEA003C0F :1058C000E9D4C004F01F0044303514981699FAE961 :1058D00000084C0C50A30C931896C0F8FAEA001874 :1058E000EDB40000C081ECE800002FF5F01F003B94 :1058F000FAEB0018A1542F865804CF11FAE80018CB :10590000FAEA00080696F01F003440A3149816998E :10591000FAE90008C2D8EC081100C0313025C2886D :105920004ACCF0041404501CF1D8C0044A89FAEAA5 :10593000003CF2080238F01F0029401C506330255B :105940000C93FAEB00081896C0F8FAEA0008EDB4D8 :105950000000C081ECE800002FF5F01F0020FAEBFA :105960000008A1542F865804CF1106964063414A7F :10597000580AC370FAE8000858015F94FAE9001861 :105980003008FC193FF0FAEA0018F01F0015F9BCC6 :105990000000F9BC0101E9EC000CC2304098580845 :1059A000E08A010C3008FC194024ECC40001FAEA3A :1059B00000182FF55064F01F0009409414981699B0 :1059C000FAE90008C1080000800364588003F38CE2 :1059D0008003F45480037028800369A480036FC09F :1059E000506602940A9CF01F0069FAE80008F01F54 :1059F00000683008FC19401CF01F006614981699C6 :105A0000FAE90028FC18FCC040A5100550A5580470 :105A1000C211FAEA00083008FC194014F01F005EB9 :105A200040BCFAEB000814981699189A0A9BF01FCC :105A3000005BE08102740A9840B9EE188000FAEA2F :105A40000008109512980A99F01F0054E081025E38 :105A5000CB484D39E8C8000140D55805C4F0300C9A :105A6000F2080238513C300AFC1B3FE0F01F004DA9 :105A7000FAE800284085F01F0048FAEB0028FAEA0F :105A80000008F01F0049516CF01F0040149816994F :105A9000FAEA0008F01F0040FAEB000841682D0800 :105AA0000AC841392FF95139FAE80028F01F003BA4 :105AB000E081035AFAE80008300AFC1B3FF0F01FAF :105AC0000036FAE80028F01F0035FAEA002830080E :105AD000FC194024E08100E8413C083CC6E4F01F8A :105AE000002C3008FAEB0028FC194024FAEA0008E0 :105AF000F01F0027FAEB0008CC3B40850805F208B0 :105B0000023A5135FAE800284085F01F0021FAEBEF :105B10000028FAEA0008F01F0024516CF01F001B57 :105B200014981699FAEA0008F01F001BFAEB000817 :105B300041682D080AC8413C1835C3713008FC196A :105B40003FE0FAEA0028F01F00134085FAE8000859 :105B50000805F01F0012E08100A7FAE80028300ACB :105B6000FC1B3FE0F01F000C14981699FAEA00089D :105B7000F01F000AC22033090A98117AF20A1800AD :105B8000E08102F21095CF9B80036E52800369A4DE :105B900080036D1880036B7C80036FC08003F38CDF :105BA0008003702880036E243008FC194024F01F05 :105BB0000056FAEB0008CAEBFAEA003CFAEB0008E0 :105BC00058E65FAB418A3008F40911FFF7E903F9A1 :105BD000F0091800E080008140EA58015FA9F3EA6B :105BE00003F94CAAF4060234FAE50010F009180093 :105BF000C1405801E081018A3008FC194014089A1C :105C00000A9BF01F0041FAE80008F01F0041E08104 :105C1000017D0292E08F018540853014FAE8001082 :105C2000FAEA0008F01F003BF01F003B1892F01F3B :105C3000003BFAE80010F01F003414981699FAEAB5 :105C40000008F01F0037FAEB0008E4C8FFD00AC8CC :105C5000FC19402430080234C331FAE80008F01F70 :105C600000311691149014980299FAEA0010F01F6E :105C7000002EC1A1FAE80010009A029BF01F002B31 :105C8000E0800271E5D2C001C0F1E08F026C408A71 :105C90001438C0301095C098330840892FF6B28868 :105CA0004088C088406633990A98117AF20A180031 :105CB000CEF0506611892FF9B089E08F0255F01FA0 :105CC00000122FF4FAEB000830083009F01F00171B :105CD000CA60E08F024840D85808C0510498009527 :105CE00040D4C4A840C55815E08900224174580426 :105CF000C040F4C9FBCDC0484199F209113604985F :105D00000095C2F8800369A48003F38C80036F5868 :105D10008003702880036E2480036E5280036B7CA6 :105D200080036D1880036FC080036F32E2C80001EA :105D30005801E0051740E2091740E1D1E515F9B92E :105D400005001032E5D8E418F1D2E518E5D8E502EF :105D5000FBFC5011F9D8E50CFBFC5A11F9B8050011 :105D6000404B120B5008504B1200301B0E9CF01F82 :105D7000010840081894404A58055F99580A5F9AEC :105D8000F5E90009C080404CF8050D49121C1210BD :105D9000504C12155802E08A002740DB580BC1D046 :105DA0005808E08A0017109A5008089B0E9CF01FB4 :105DB00000F9069A189B18940E9CF01F00F718998A :105DC000069B50190E9CF01F00F5401940081293D5 :105DD000E408010AC080C028049A069B0E9CF01FAC :105DE00000ED1893301B0E9CF01F00E9411A189229 :105DF000580AE08A0007189B0E9CF01F00E61892D4 :105E000040C95819E089001440385808C101402998 :105E1000F1D9C014C0C11298E6187FF0C080404C80 :105E2000301B2FFC2FF0504C506BC038300A506A9A :105E300041195809C031301CC09864482FC8E40883 :105E4000032CF01F00D7F80C1120404BF80B000872 :105E5000F1D8C005C0C0F00811205848E08A0006FB :105E60002048100B504BC0785848C070404A2E480C :105E7000100A504A100010055800E08A0008069BDE :105E8000009A0E9CF01F00C7189340495809E08AF9 :105E90000008049B129A0E9CF01F00C21892414801 :105EA0005808C1B0049B069CF01F00BFC164069B4C :105EB000300930AA0E9CF01F00BD2016189340DC5C :105EC000580CC0314091C098089B4091300930AACD :105ED0000E9CF01F00B6189458015FA940CB582BB8 :105EE0005F98F3E80008C2505801C111049B029961 :105EF000305A0E9CF01F00AD1892189B069CF01FA4 :105F000000AAE089000FC0383002049440EA30094A :105F10005CDA4085506A5049C0F9089240660494A2 :105F20002FF65066331840850AC830085048C049DB :105F300040DC580CE08000B55805E08A0008089B5A :105F40000A9A0E9CF01F00971894406B580BC031B2 :105F5000089CC138681B0E9CF01F0095684A189574 :105F6000E8CBFFF42FEA2F4CA36AF01F00920A9BA4 :105F7000301A0E9CF01F008B5044403A3019F5DA6D :105F8000C001189450DA40855099502650E1049B86 :105F9000069CF01F0089404BF8C0FFD0069CF01F04 :105FA0000082089A506C049B0E9CF01F008418918C :105FB00078385808C0303016C068189B069CF01F0F :105FC000007A18960E9C029BF01F007440CCEDECFA :105FD0001008C0D140DB580BC0A14026E04000397A :105FE000C300406A580AE0890024C2F84069580991 :105FF000C085129840CC1848C1D140DB580BC1A1D4 :106000000C9940265809E08A0021069B301A0E9C04 :10601000F01F0064049B1893F01F0063E0890006E2 :10602000C141EDB00000C111E0400039C0A02FF027 :10603000C0C85806E08A000C4026E0400039C04144 :1060400033980AC8C6782FF00AC0C7580AC0409AC9 :1060500040E9123AC430069B300930AA0E9CF01F6A :106060000053404818930838C091109B300930AA5B :106070000E9CF01F004E504CC0E8404B300930AA37 :106080000E9CF01F004A089B504C300930AA0E9C11 :10609000F01F00461894409C2FFC509CC79B301862 :1060A0000690408508930C941096049B009CF01F6A :1060B00000422D0C0ACC0236C0A4009B300930AA45 :1060C0000E9C2FF6F01F00391890CF0B0896300B5E :1060D0000694504B00931890C0284026069B301A17 :1060E0000E9CF01F0030049B1893F01F002FE089D6 :1060F0000012C1B1E1D0C001C0D1C17840891238CD :10610000C0301095C0882FF650663318408CB88880 :10611000C138339A0A981179F4091800CF002FF981 :10612000B089C0981095C02833090A98117AF20AEC :106130001800CF905066049B0E9CF01F0018580466 :10614000C120404B083B5F19580B5F18F3E800086B :10615000C0400E9CF01F0011089B0E9CF01F000F0A :10616000C02850660E9C069BF01F000C3008AA88C1 :106170004068415A2FF841299508408C5809FBF88E :106180001012F1F51A002E6DD8320000800368005D :10619000800368A0800366F88003642080036300A6 :1061A00080036664800363EE80036818800364588C :1061B0008002E736800354088003658C5EFC5EFC39 :1061C000D42118961697580BC0311695C508F01FA4 :1061D00000295806C0706C685808C0410C9CF01F1C :1061E00000264A681037C0316C07C0A84A481037EB :1061F000C0316C17C0584A381037EDF700028E696D :106200003008F0091900C051F01F001F3005C2F816 :106210000E9B0C9CF01F001D6EC818955808C0609E :106220006E8B0C9C5D18F9B505FF8E68EDB8000704 :10623000C0516E4B0C9CF01F00166EDB580BC0A0BB :10624000EEC8FFBC103BC0400C9CF01F0011300892 :106250008FD86F2B580BC0700C9CF01F000D3008AE :10626000EF4800483008AE68F01F00070A9CD822AB :1062700080031E7480031F388003EF2C8003EF4CD3 :106280008003EF6C80031E7680031D2C8003217C2D :10629000D4014848189B700CF01F0003D80200007E :1062A00000000598800361C0D42116981897109CAF :1062B00030084876149B8D08F01F00065BFCC05127 :1062C0006C085808EFF81A03D822000000008CC4AC :1062D0008002F198D42116981897109C3008149BCE :1062E0004866129A8D08F01F00065BFCC0516C08CE :1062F0005808EFF81A03D82200008CC48002F1205D :106300001898E01C0000F0091510580CF20817004E :10631000F9BC0010F9BC0100109AF0091508E61A42 :10632000FF00F7BC00F8F2081700109AF0091504F6 :10633000E61AF000F7BC00FCF2081700109AF0090A :106340001502E61AC000F7BC00FEF2081700580854 :106350005E5CEDB8001EF9BC0120F7BC00FF5EFCDE :1063600018997808F9D8C003C150EDB80000C021D1 :106370005EFD109BF00A1601E21B0002A388580B79 :10638000F3FA1A00F9BC0101F3F80A00F9BC0002A3 :106390005EFCF5D8C010F00B1610580AF60817006E :1063A000F9BC0010F7D8C008F00A1608580BF7BC63 :1063B00000F8F4081700F7D8C004F00A1604580BC8 :1063C000F7BC00FCF4081700F7D8C002F00A160268 :1063D000580BF7BC00FEF4081700EDB80000C060D1 :1063E000A198C031320C5EFC2FFC93085EFCD401F6 :1063F00018987649784C121CC1312FB9A369120B39 :10640000F00900092EC8134E174A143EC060F9BCAB :1064100003FFF9BC0201D8021039FE9BFFF6D80237 :10642000D4211897169578965806C091310CF01F14 :10643000000A99368F9C9916992699065805C0909E :106440006A196E987038F009032A8B0AF009092539 :10645000D82200008002E2A4D421189716967895DD :106460005805C091310CF01F001999358F9C991572 :10647000992599056E956A385808C0B1310A304B94 :106480000E9CF01F00138B3C6E98703C580CC1B0F2 :106490006E987038F0060028700C580CC0407809CF :1064A0009109C0E80E9C30170E9BEE060947EECA14 :1064B000FFFBA36AF01F0006C060991699273008F9 :1064C00099389948D82200008002E2A48002DC5466 :1064D000D431202D1693129610951492301BF01F74 :1064E0000029F3D3C0145009F1D3C01FF0011614D2 :1064F000FC1A0010F3DAE139FBF91A00189458027B :10650000C1E0FACCFFF818D2F01F001F4018C0D02D :106510004009F80A1120F20A094AF5E810088958DA :10652000F20C0A495009C028895840085808F9B3A4 :106530000102F9B3000189688943C0981A9CF01FD1 :106540000012301340082E0C894389585801C0901E :10655000E2C1043318018D01F80C11358B0CC0D841 :10656000E6C8FFFCF8CC0432A5738D0CE808032CB8 :10657000F01F000618138B03089C2FEDD832000083 :10658000800364588003636080036300D4317448DF :106590007645169714961015C1312FB8EECEFFEC44 :1065A000A368F408000BEE080008114A1749123AD4 :1065B000C030C0E2C0781C38FE9BFFF9C4A8580563 :1065C000C0640E9830150C971096C02830056E1BCD :1065D000F01F00246E496C4499352FB4F2C5FFFBBF :1065E000EC040024EE0500252EC62EC7F8C8FFECEB :1065F000300A0F0E0D0BFC021610F6031610FDDE0E :10660000C010E4030103F7DBC010FC0B010BF60A1A :10661000000AB01AB14AE60A000AB00A2FC8B14A05 :106620000836CE83C0D80F0BF60E1610F7DBC0105D :10663000160AB01AB14A1C0AB00A2FC8B14A0A3762 :10664000CF33C0282019114A580ACFD09949D832DF :10665000300BF01F00043018994830089958D83290 :1066600080036458D43116977646F40214052FF649 :10667000149318940406761B6E28C0382FFBA1785B :106680001036FE99FFFD089CF01F001A300918957E :10669000F8C8FFEC129AC03810AA2FF90439CFD5E8 :1066A0006E4BE7D3C0052FBBEEC9FFECEE0B002B02 :1066B0005803C130E60C1120300A7202E40309428B :1066C000044A10AA130AF40C0A4A1639CF73910A25 :1066D000580AC0702FF6C058130A10AA1639CFD323 :1066E000089C20160E9B8B46F01F00030A9CD83294 :1066F0008003645880036420D431202D7649744887 :10670000169614951039EC081750EA061750F00544 :1067100017506C2876437442761BE4030007103749 :10672000F7BB09FFF01F0036EEC4FFFBF8C9FFEC12 :10673000F8040024300A1298C02810AA0838CFE3C1 :106740002FB32FB2EC030023EA020022ECCBFFECC4 :106750005012EACAFFECC44894955805C20012983A :106760001696300E50090D02E400161070017009E3 :10677000B181E5D2C010E0050341AB32E1D9C010D0 :106780000002E40E000EB01EB18E1C01B001E20E3C :1067900016102FC80636CE834009910E94865806EF :1067A000C1D072021298169E3005B0121D0190825F :1067B000E1D1C010AD30E0020002E4050005B005F3 :1067C000B185B1812FC8AD319092E20200020A0278 :1067D000E4051610063ECEA391022FCA2FC9401819 :1067E000103ACBB3C02820175807E08A00050948A3 :1067F0005808CFA099472FEDD83200008003645885 :10680000D4211697301BF01F00043019995799496D :10681000D822000080036458D431300812951697AE :1068200018967644F6C9FFEC720BF60C1610F7DBDF :10683000C010F40C024CF40B0345F7D5C010B18521 :106840001805EA0C1510F80B000B12AB2FF8B185E8 :106850000838CEB55805C1D06E281034C1456E1B1E :106860000C9C2FFBF01F000C6E4AEECBFFF418932C :106870002FEA2F4CA36AF01F00090E9B0C9CF01FFF :1068800000080697E8C8FFFF2FB48F48EE040925DB :106890000E9CD832800364588002E736800364205F :1068A000D431149618971694F1DAC002C0902018CB :1068B0004A19F208032A3009F01F00201894A34651 :1068C000C3706E955805C091310CF01F001D9935AD :1068D0008F9C9915992599056E9366255805C0D109 :1068E000E06B02710E9CF01F0017872C3008189582 :1068F0009908C038069C1895EDB60000C0C1089BE9 :106900000A9A0E9CF01F0010089B18930E9C069488 :10691000F01F000EA156C0C06A035803CEC10A9AE8 :106920000A9B0E9CF01F00088B0C9903CE5B089C01 :10693000D83200008003F380800368188002E2A44C :1069400080036800800366F880036420D4211698D1 :106950001897109C3008149B4866129A8D08F01FF7 :1069600000065BFCC0516C085808EFF81A03D822E7 :1069700000008CC48002F1381498FC197FF0F5DB1C :10698000C01FF00B1100F7E81008F5E813F8F20843 :106990000108F00C1100F9E81008F00C141F2FFC8E :1069A0005EFCD703F5EB101CE08000DCD421F7E996 :1069B000200EEFDBC28B3015C430AB6BF7EA136BE4 :1069C000AB6AF7D5D3C2EDD9C28BC5C0A1785CF94B :1069D000F3D5D2ABE04707FFC770E04607FFC740DB :1069E000EE06000CE02C03FEF6080644F40907440A :1069F000F4080646F609064A0807F405004A5C0B47 :106A0000EDBB0014C050A1775CFA5CFB201C580C55 :106A1000E08A006FE04C07FFE084009CF7DCD28B3B :106A2000EDEA11F6EFE61217EE178000F1B7042039 :106A30000E0A5C0BEDBE001FEFBB001FD822E41B4B :106A4000000FF40C1200F6061200F7BC03E1F80682 :106A50001730F7B60201E0460020C0D4EC0C11203C :106A6000F606094BF40C0A4C184BF406094A20B6FA :106A70000C17CAABF406094BC640300A20B60C17F7 :106A8000CA3BE419000FF00C1200F2051200F7BC2B :106A900003EAF8051730F7B5020AE0450020C0D434 :106AA000EA0C1120F2050949F00C0A4C1849F005CE :106AB000094820250A16C8FBF0050949C4203008FA :106AC00020250A16C88BE419000FE41B000F144B95 :106AD0001049E04707FFC091580BC381E04607FF0C :106AE000C3815809C360C3285809C330C2F85C3C4D :106AF0002FFCF1BC04C0E04C0020C114F8081120A8 :106B00000E46EE0C0A47F40809491247F40C0A4AEB :106B1000F6080949124AF60C0A4BC83BF80811203E :106B2000F9B90000C030F60809490E46EDEA101622 :106B3000F40C0A4AF3EA1007F60C0A4A300BC71B9A :106B40001C9BE61B8000300AD8223FFB3FFAD8226C :106B5000F06B0000EDBE001FEFBB001F300AD82213 :106B6000F7E9200BE61B8000F9D9C28BE04C07FF48 :106B70005E1C3FFA3FFB5EFCEE198000F7E9200C3B :106B8000E08600CAEBCD40E0169CE61C8000BFDB2F :106B9000BFD9103AF20B1300C0921697129B0E99B0 :106BA0001497109A0E98EE1C8000F6071614AB7B13 :106BB000F7EA135BAB7ABFBBF2061614C440AB799D :106BC000F3E81359AB78BFB9E04707FFC4F00E26CE :106BD000C120EC051120E0460020C7C2F005094E97 :106BE000F2050945F0060A48F2060A490A48580E15 :106BF0005F1E1C48101AF609014BF6061200C0E091 :106C0000C783EC0E1120F606094BF40E0A4E1C4BFE :106C1000F406094A0C17E08A0039F4091515AB9AF5 :106C2000F5EB115AAB9BF7D7D28B184BFC178000B2 :106C3000EDBA0000F7B701FF0E395F29120A5C0BAD :106C4000E3CD80E0AB79F3E81359AB78F3E8100EAD :106C5000F9B60101EE0E1100F9B70001EFBB001FFC :106C6000F7EA100EF9B70000CB0BBFDBF7EA100E06 :106C7000C081E04607FFC050F9E7114BE3CD80E04B :106C80003FFA3FFBE3CD80E05C372FF7F1B704C05C :106C9000E0470020C114EE081120F40809495F16EE :106CA000F4070A4A0C4AF6080949F5E9100AF407FC :106CB0000A4B3007CB3BEE081140F608094914494E :106CC0005F16F6070A4A0C4A300B3007CA7BE3CD41 :106CD00080E0F1B604C0F00E1700C040F205094E86 :106CE000104EF2060A483009580E5F1E1C48C83B79 :106CF000F4061200F9B70300F9B60300F9BC03006B :106D0000F7B602E0F406094B300A0C17FE9AFFBEF4 :106D1000C85B0000EE198000F7E9200CFE96FF2EFC :106D2000EBCD40E0169CE61C8000BFDBBFD9123BD8 :106D3000C0721697129B0E991497109A0E98300EE7 :106D4000EFDBC28BF7DBC014B5ABEDD9C28BC5F05E :106D5000F3D9C014B5A9E04707FFC2500E26C0F012 :106D6000EC051120E0460020C352F005094EF20563 :106D70000945F0060A48F2060A490A48100AF609C7 :106D8000004BEDBB0015C340F7D7D28B184BF9DA97 :106D9000C001184EEE1E8000F1BE04201C0A5C0BE0 :106DA000E3CD80E0B5CBF7EA100EC101E04607FF66 :106DB000C030E3CD80E0B5C9F3E8100EC071300AF1 :106DC000FC1B7FF0184BE3CD80E03FFA3FFBE3CDA7 :106DD00080E0F1B604C0F00E1700C060F205094E65 :106DE00058085F18104EF2060A483009CC8BFDEEA9 :106DF000101EA19B5D0A5D0E2FF7E04707FFF9BA51 :106E00000000F9BB0000F9BE0000CBFB30165807AC :106E1000CA31B5CB100AF609004B184BE3CD80E020 :106E2000580B5E6DF60C1501B59CE02C03FF5E3D22 :106E3000F80C111F1699AB7BBFBBF7EA135BF60C7E :106E40000A4BA1795E2B5C3B5EFBF8CB0000300C5B :106E5000C038189B5C4B300A5E0BD401E069041EFD :106E6000F6081200C170C0C3F00E1120F608094BDD :106E7000F40E0A4E1C4BF408094A1019C0B8F40865 :106E80001200F9B80300F7B802E0F408094B300A21 :106E900010195809E08900305C392FF9E0490036B3 :106EA000C043300B300AC2682F69F2081120E04954 :106EB0000020C0B2F408094EF6080948F4090A4A4D :106EC000F6090A4B104BC088F608094E144E169A64 :106ED000300BF4090A4AEDBA0000C0921C7EC04192 :106EE000EDBA0001C0422FFAF7BB02FF5CFC5D0B5C :106EF0005D0AD802E06803FFEDBA000BF7B800FFA7 :106F0000100A5C0BF7B903FEE04907FFC055300AD1 :106F1000FC1BFFE0C0C8EDBB001FF7B90101AB9A35 :106F2000F5EB115AA17BAB9BF7E9115BA17C5D0BE3 :106F3000D802103AF20B1300C080A17BA179144B48 :106F4000124B104B5E0F5EFDA17BFC1CFFE0580A4C :106F5000F80B13005E8F5EFD1ADE1AD7A17B5F3C33 :106F6000A1795F375CFCFC1EFFE0580AFC0B1300A4 :106F7000E08B001D5808FC091300E08B0018580B2B :106F8000F5BA0000C1501B071B0E583CC0A0581C8E :106F9000C0335E0F5E1D103AF20B13005E2F5E3D94 :106FA0001438F60913005E2F5E3D1B07D80A5817E8 :106FB0005F0C5809F5B800001B071B0E5E0F5EFC46 :106FC0001ADE1AD7A17B5F3CA1795F375CFCFC1EFF :106FD000FFE0580AFC0B1300E08B001D5808FC0969 :106FE0001300E08B0018580BF5BA0000C1501B07C6 :106FF0001B0E583CC0A0581CC0335E0D5E1F103ADB :10700000F20B13005E2D5E3F1438F60913005E2D5F :107010005E3F1B07D80A58175F1C5809F5B80000D7 :107020001B071B0E5E0D5EFCEBCD40FFF7E9200E4B :10703000F6071614A97BF7EA137BA97ABDBBE41BFC :107040003FFFABD7E08000CCE04707FFE08400B50E :10705000F2061614A979F3E81379A978BDB9E419F1 :107060003FFFABD6E08000E2E04607FFE08400B2DD :107070000C17FE37FC01FC1C8000F8031601E9D94F :10708000C3625CD4E7D4D382E6090644F80501253F :10709000E6050644EA031502E6090644F80501255B :1070A000E6050644EA031502E6090644F80501254B :1070B000E6050644EA031502E6080640E40907402F :1070C000E609064402045C05A365EBE413E5A3644A :1070D0005C34F8050145E6040640E4050740E60592 :1070E000064402045C05EA031502E7E413E3E80240 :1070F0001502E6080640E4090740E60906440204D2 :107100005C05A365EBE413E5A3645C34F805014575 :10711000E6040640E4050740E605064402045C0573 :10712000EA031502E7E413E3E8021502E60A064063 :10713000E40B0740E60B064202025C03EDB3001CC1 :10714000C090A1725CF32017A39AF5EB11DAA39B10 :10715000C058A58AF5EB11CAA58B5807E08A008BA9 :10716000E012FF00E8120080E6080640E40907404C :10717000E4080644E60906480005F00100485C09F9 :10718000F9D2C10158045C25F4081300F609130074 :107190005F36F8061700E40A1608F5E3118AE60BD5 :1071A0001608F7D7D28BEDBE001FEFBB001F0C0AED :1071B0005C0BE3CD80FFE41B000F144BE08100A7C4 :1071C000F2061614ABD6E04607FFE08100A4C9E83A :1071D000E419000F1049E081009AC928A37BF7EA5F :1071E00013DBA37AF5EB1004E08000A0F604120094 :1071F000C170C0C3E8051120F604094BF4050A4527 :107200000A4BF404094A0817C0B8F4041200F9B490 :107210000300F7B402E0F404094B300A0817A38A0C :10722000F5EB11EAA38BC11BA379F3E813D9A3787B :10723000F3E81004C6F0F2041200C170C0C3E80500 :107240001120F2040949F0050A450A49F0040948E9 :107250000816C0B8F0041200F9B40300F7B402E055 :10726000F004094930080816A388F1E911E8A38958 :10727000CFCA5C372FF7F1B704C0E0470020C154F4 :10728000EE061120E4070A42E606094C1842E6071A :107290000A43F4060941F4070A4AF606094C184A5B :1072A000F6070A4B3000C158EE061120F9B0000075 :1072B000F9BC0000C050F4060940F606094CE60788 :1072C0000A423003F4070A411841F6070A4A300B14 :1072D000E012FF00E8120080E6080646E4090746CF :1072E000E4080644E60906480C05F00700485C0976 :1072F0003007F9D2C1010034E2051300C46B1C9BB6 :10730000E61B8000300AE3CD80FF3FFB300AE3CD6F :1073100080FFF5EB1004C0901C9BE61B8000EA1B6D :107320007FF0300AE3CD80FFF1E91015CEF0E9D906 :10733000C28BE04407FFCE41F1E910C5CE10CE6B01 :10734000D4311A97202D109C1295149E16931696E0 :107350005809C4411638E088005AF0081200C0D01D :10736000F6080946F808094CF00B1120F408094EFC :10737000F40B0A4BF7E61006F80A1610EBDCC01007 :10738000EC0A0D02FC091610EA02024BF3E31109A4 :10739000123BE08800091809123CE08B0005123B03 :1073A000F3DCEB09F20B010BFDDEC010F60A0D0A4F :1073B000FDEB110EEA0A024A1C3AE0880009180E99 :1073C0001C3CE08B00051C3AFDDCEB0EFC0A010ABC :1073D000300BF4080A4A2FEDD8321639FE9BFFFD18 :1073E000F2091200C46114385F8B06355F3AF7EA80 :1073F000100AF20A1800C060FC08010AE6050146FE :10740000149E0C9B1C9A2FEDD8325808C05130198D :10741000F2080D08109CF8081200E0810084EC0CC2 :10742000010BF8031610EBDCC010F6030D0AFC0983 :107430001610EA0A024AF3EB1109123AE088000931 :107440001809123CE08B0005123AF3DCEB09141921 :10745000FDDEC010F2030D02FDE3110EEA02024A46 :107460001C3AFE98FFB5180E1C3CFE9BFFB1CACB20 :10747000F20E1120EA090945F609094BE60E0A4306 :10748000F0090941F4090942F00E0A48F40E0A4ACB :107490000A48164AF0061610F9D8C010E6060D0480 :1074A000F4031610089BE7E51103E80C02450635C6 :1074B000E0880007201B10030638E0880072F5DA28 :1074C000C0100A13E6060D04F5E51106E80C024C9F :1074D000089A0C3CE0880007201A10060C38E08857 :1074E000005AF5EB110B1816F601064A149C1636D5 :1074F000C0735F0514325F3AEBEA000AC060F8011E :107500000104F608014B089CE40C010AEC0B01464F :10751000EC090A4BF4090A4AEC0E09460C4A2FED15 :10752000D832F0011120F4010A4BF808094CEC089C :107530000949EC010A41F7E91009F8031610EBDCE0 :10754000C010E2030D00F20B1610EA00024EF7E144 :10755000110B163EE0880006180B163CE088002749 :10756000F60E0101F3D9C010E2030D00F3E1110999 :10757000EA00024B123BE08800091809123CE08B3C :107580000005123BF3DCEB09F20B010BF408094E8A :10759000C4DB0C3CF7BA0B01EDD8EB06CA3B063551 :1075A000F7BB0B01E7D8EB03C8BB163EF7DCEB0BD0 :0275B000CD8B81 :10760000C0080000C0080000C0080000C00800005A :10761000C0080000C0080000C0080000C00800004A :10762000C0080000C0080000C0080000C00800003A :10763000C0080000C0080000C0080000C00800002A :10764000C0080000C00800000000000000000000AA :10765000C008000000000000000000000000000062 :10766000C008000000000000000000000000000052 :10767000C008000000000000000000000000000042 :1076800000000000000000000000000000000000FA :1076900000000000000000000000000000000000EA :1076A00000000000000000000000000000000000DA :1076B00000000000000000000000000000000000CA :1076C00000000000000000000000000000000000BA :1076D00000000000000000000000000000000000AA :1076E000000000000000000000000000000000009A :1076F000000000000000000000000000000000008A :10770000C0080000300CF01F0012580CF80F1710C2 :10771000D603301CF01F000E580CF80F1710D603BC :10772000302CF01F000B580CF80F1710D603303C0C :10773000F01F0007580CF80F1710D60300000104C3 :107740004000011280000120C000012E8000A41C16 :107750000000000000000000000000000000000029 :107760000000000000000000000000000000000019 :107770000000000000000000000000000000000009 :1077800000000000000000000000000000000000F9 :1077900000000000000000000000000000000000E9 :1077A00000000000000000000000000000000000D9 :1077B00000000000000000000000000000000000C9 :1077C00000000000000000000000000000000000B9 :1077D00000000000000000000000000000000000A9 :1077E0000000000000000000000000000000000099 :1077F0000000000000000000000000000000000089 :1078000073656E645265706C790000006765745F23 :10781000646174615F7463705F636D645F63620071 :107820006765745F7265706C795F686F73745F62AF :10783000795F6E616D655F63620000006765745F0C :107840007265706C795F7363616E5F6E6574776F7C :10785000726B735F636200006765745F7265706C62 :10786000795F6964785F6E65745F63620000000031 :107870007365745F706173737068726173655F6361 :107880006D645F63620000007365745F6B65795FB0 :10789000636D645F6362000063616C6C5F7265704E :1078A0006C795F6362000000617661696C5F64619E :1078B00074615F7463705F636D645F636200000096 :1078C0007365744D6170536F636B4D6F6465000039 :1078D0006765745374617274436D6453657100001D :1078E0007365745F6E65745F636D645F63620000EF :1078F0007365745F69705F636F6E6669675F636D00 :10790000645F63620000000073656E644572726FAD :107910007200000073746172745F736572766572D1 :107920005F7463705F636D645F6362007370695F4F :10793000736C61766552656365697665496E74003E :107940006765745F636C69656E745F737461746599 :107950005F7463705F636D645F63620073656E6420 :107960005F646174615F7564705F636D645F6362BF :1079700000000000636865636B4D7367466F726D4E :107980006174000073746172745F7363616E5F6E23 :1079900065745F636D645F6362000000666F756E9F :1079A00064486F737442794E616D65007365745FEE :1079B0006B65795F636D645F63620000696E697413 :1079C0005370690073746172745F636C69656E747F :1079D0005F746370000000007370695F706F6C6C9F :1079E000000000006765745F726573756C745F6397 :1079F0006D645F636200000073746F705F636C6935 :107A0000656E745F7463705F636D645F63620000D2 :107A100073746172745F7365727665725F7463709C :107A2000000000007365745F706173737068726149 :107A300073655F636D645F63620000007365745F0C :107A4000726573756C745F636D6400007365745F59 :107A5000646E735F636F6E6669675F636D645F63B7 :107A6000620000006765745F73746174655F7463BE :107A7000705F636D645F6362000000007265715F38 :107A80007265706C795F686F73745F62795F6E6145 :107A90006D655F636200000073746172745F636C94 :107AA00069656E745F7463705F636D645F636200C9 :107AB000572D5B25735D2057726F6E67207465725A :107AC0006D696E6174696F6E20696E6465783A25C0 :107AD00064206E506172616D3A2564206964783A61 :107AE00025642031366269743A25640A000000007A :107AF0003078257820000000572D5B25735D2049E4 :107B00006E646578206F7574206F662072616E6791 :107B1000653A2025640A00005B25735D20535349B4 :107B2000443A25730A0000005B25735D20525353CD :107B3000493A25640A0000005B25735D20454E43E9 :107B4000543A25640A0000005B25735D205365618B :107B5000726368696E6720666F7220486F73743A4B :107B60002069703D3078257820666F756E643D25FC :107B7000640A00005B25735D20666F756E64486F54 :107B8000737442794E616D653A20466F756E64205C :107B9000486F73743A206E616D653D25732069707E :107BA0003D307825780A00005B25735D20696653B7 :107BB00074617475733A256420726573756C743AD8 :107BC00025640A004C69737420436F6D6D616E64A7 :107BD000732066756C6C210A000000005245434515 :107BE000495645005452414E534D4954000000003F :107BF0005B25735D204D6170205B25642C20257012 :107C00002C2025735D0A00005B25735D20535049CD :107C100020696E697469616C697A6174696F6E203C :107C20006661696C65642100572D5B25735D204595 :107C300072726F7220636F6E6669677572696E67C4 :107C4000205350490A000000572D5B25735D202505 :107C5000645D20446973616C6C2E2025642F25645B :107C600020636D643A25640A00000000572D5B25EF :107C7000735D2025645D20446973616C6C2E202542 :107C8000640A00005B25735D3A200000572D5B25D8 :107C9000735D2025645D204E6F7420666F756E6481 :107CA00020656E6420636D643A20307825780A0080 :107CB0005B25735D2025732025640A00572D5B2505 :107CC000735D20456E64206F6620636D6420706173 :107CD00072616D73000000005B25735D2064617448 :107CE00061417661696C3A25640A0000572D5B2575 :107CF000735D2054544350206E6F7420666F756E10 :107D00006420666F7220736F636B3A25640A00000B :107D10005B25735D20736F636B3A25642073746118 :107D200074653A25640A00005B25735D20737461F5 :107D300074653A25640A00005B25735D2053746105 :107D40007274204E6574776F726B205363616E207E :107D500025640A00572D5B25735D206572723D25F1 :107D6000640A00005B25735D204C6F6F6B696E6762 :107D700020666F7220486F73743A206E616D653DA6 :107D800025730A005B25735D20466F756E6420487D :107D90006F73743A206E616D653D25732069703D87 :107DA000307825780A0000005B25735D2053746FDE :107DB0007020636C69656E7420736F636B3A256421 :107DC0000A00000055445000544350005B25735D89 :107DD00020416464723A307825782C20706F727478 :107DE0003A25642C20736F636B3A25642C207072E3 :107DF0006F743A25730A0000572D5B25735D205080 :107E0000726576696F757320636C69656E74202581 :107E100070206E6F742073746F7070656420210A17 :107E2000000000005B25735D205374617274204371 :107E30006C69656E74202573202570205B30782571 :107E4000782C2025642C2025645D204F4B210A00CE :107E50005B25735D20537461727420436C69656E99 :107E600074202573202570205B307825782C202500 :107E7000642C2025645D204641494C4544210A007C :107E8000572D5B25735D205374696C6C20636F6E96 :107E90006E65637465642E2E2E776169740A000026 :107EA000572D5B25735D20494620646F776E2E2E1B :107EB0002E776169740A00005B25735D205374613D :107EC000727420536572766572202573205B256479 :107ED0002C2025645D204F4B210A0000572D5B2587 :107EE000735D2053746172742053657276657220DD :107EF0002573205B25642C2025645D204641494C78 :107F00004544210A000000005B25735D2025702098 :107F10006E756D506172616D3D2564207061726D8A :107F200073546F4368616E67653D25640A00000005 :107F30005B25735D2025645D206E69663A2570209F :107F40006C7769705F616464723D307825780A00EF :107F50005B25735D20257320706172616D733D2513 :107F6000640A00005B25735D20506173733A20251D :107F7000732025640A000000572D5B25735D2025C2 :107F800073203A204661696C656420746F206164D7 :107F90006420706173737068726173650A00000019 :107FA000436F6E6E65637420746F206E6574776FB7 :107FB000726B2E2E2E0000006572723D25640A0041 :107FC0004F4B0A00572D5B25735D205353494420C6 :107FD0006C656E206F7574206F662072616E6765C8 :107FE000000000005B25735D2025730A000000007F :107FF000572D5B25735D2053656E642053504920D7 :108000006572726F72210A003D3D3E003C3D3D00AD :10801000572D5B25735D20556E6B6E6F776E2063F9 :108020006D6420307825780A00000000572D5B250C :10803000735D2025645D20436865636B20666F7205 :108040006D6174206D7367206661696C6564210AD7 :1080500000000000444F574E000000005550000043 :1080600049462020207374617475733A2025730A81 :1080700000000000434F4E4E207374617475733AD4 :108080002025730A00000000536F636B6574206E37 :108090002E3A256428256429205B307825785D20D8 :1080A000257320257320616464723A257320706FF4 :1080B00072743A25640A00005B2564207470637052 :1080C0002D25705D2D5374617475733A25640A0013 :1080D0005B746C63702D25705D2D537461747573C2 :1080E0003A25640A000000005B757063702D2570EE :1080F0005D20666C6167733A3078257820206C6F5C :1081000063616C3A25735B307825785D2D25640AB0 :108110000000000072656D6F74653A257328307831 :108120002578292D25640A004E4F0000594553003B :108130004461746120617661696C3A25730A0000BC :108140002D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D5F :108150002D2D2D2D2D2D2D2D2D2D2D2D2D2D0A009F :108160005B25735D205363616E206E6F7420636FB7 :108170006D706C65746564210A0000005B25735D99 :10818000204E6574776F726B73206E6F7420666F0C :10819000756E64210A000000636F756C64206E6F59 :1081A0007420616C6C6F6361746520616C6C206716 :1081B0007569206E65742061727261790A00000031 :1081C000636F756C64206E6F7420616C6C6F63619B :1081D000746520616C6C20677569206E6574730A24 :1081E000000000005B25735D202564202D20257391 :1081F000205B25645D2D202564202D202564202D05 :1082000020307825780A000D000B000C000A0000D1 :108210007365745F726573756C745F636D64000081 :108220008000636C800063988000637E80006398A8 :108230008000638E80006398800063648000639890 :10824000800063688000638A800063786174637073 :108250005F706F6C6C5F636F6E6E00007564705F53 :10826000737461727400000072656D6F76654E659F :1082700077436C69656E74436F6E6E0061756470F0 :108280005F726563765F6362000000006765745328 :1082900074617465546370006172645F7463705FCD :1082A00073746F7000000000617463705F636F6EC1 :1082B0006E5F6572725F6362000000006765744EF6 :1082C0006577436C69656E74436F6E6E4964000038 :1082D000617463705F636F6E6E5F636C695F65721C :1082E000725F636200000000617463705F616363CA :1082F0006570745F636200007564705F73746172AF :10830000740000005B25735D20747463703A2570FF :108310002069643D25642C20747063623D25700AD9 :1083200000000000572D5B25735D204E6F205661C5 :108330006C696420636C69656E7420666F7220746A :108340007463703A25700A005B25735D2025645DB7 :1083500020747463703A257020747063623A2570DB :108360002073746174653A2564206C7063623A25E9 :10837000702073746174653A2564206C6566743A84 :1083800025642073656E743A25640A00572D5B25B9 :10839000735D20544350206E6F7420696E69746958 :1083A000616C697A656420747463703A2570207416 :1083B0007063623A2570206C7063623A25700A001F :1083C000572D5B25735D204E6F2056616C696420CC :1083D000496420666F7220747463703A257020704F :1083E00063623A25700A00005B25735D2062756642 :1083F0003A2570206C656E3A25640A00572D5B257E :10840000735D2054544350205B25705D3A20636FA8 :10841000756C64206E6F7420616C6C6F6361746541 :1084200020706275660A0000572D5B25735D20542D :10843000544350205B25705D3A207564705F73650E :108440006E642829206661696C65640A000000007A :108450005B25735D2054544350205B25702D25709F :108460005D3A20636F6E6E65637420256420256419 :108470000A0000005B25735D206C6566743D256411 :10848000206C656E3A25640A000000005B25735D70 :10849000207463705F7772697465206661696C65CA :1084A000642025702073746174653A2564206C65BE :1084B0006E3A2564206572723A25640A0000000055 :1084C000572D5B25735D2074746370203D3D204EF5 :1084D000554C4C210A0000005B25735D20747463C9 :1084E000703A2570207063623A2570206275663A92 :1084F0002570206C656E3A25640A00005B25735D6B :1085000020272573270A00005B25735D20506163D7 :108510006B65742073656E74207063623A257020F9 :108520006C656E3A2564206475723A2564206C652A :1085300066743A25640A00005B25735D2054544339 :1085400050205B25705D3A20636C65616E536F63EC :108550006B53746174655F63622025640A000000D8 :108560005B25735D20436C6F73696E672074706365 :10857000623A2073746174653A30782578206572A8 :10858000723A25640A0000005B25735D20436C6F1E :1085900073696E67206C7063623A207374617465EE :1085A0003A30782578206572723A25640A00000016 :1085B0005B25735D2046726565696E672070617921 :1085C0006C6F61642025642D25700A005B25735D46 :1085D00020436C6F73696E6720747063625B2570F3 :1085E0005D3A2073746174653A307825782065723D :1085F000723A25640A000000572D5B25735D204305 :10860000616E6E6F7420636C6F73652069643A25C8 :10861000642D2570207075742070656E64696E67B6 :108620000A0000005B25735D202D2D2D2D2D2D2D95 :108630002D2D2D2D2D2D2D2D2D2D2D2D2D2D2D0A8D :1086400000000000572D5B25735D2074746370205B :108650003D204E554C4C210A000000005B25735D07 :1086600020666C75736820646174613A207470636D :10867000623A2570206572723A25640A0000000093 :10868000572D5B25735D2054544350205B25705D4E :108690003A20636F6E6E656374696F6E20657272E7 :1086A0006F723A202564206375727249643A2564BA :1086B0000A00000041626F727420636F6E6E656322 :1086C00074696F6E0A000000572D5B25735D20549E :1086D000544350205B25705D3A20636F6E6E656376 :1086E00074696F6E206572726F723A202564206122 :1086F00072673A25700A0000572D5B25735D205480 :10870000544350205B25705D3A2066726565206D8C :10871000656D6F72790A00005B25735D20554450CA :1087200020496E7365727420257020736F636B3AF5 :10873000256420616464723A257320706F72743A04 :1087400025640A00572D5B25735D20545443502047 :108750005B2D5D3A20696E76616C6964206D6F6493 :10876000650A0000572D5B25735D2054544350204B :108770005B2D5D3A20696E76616C6964206E62756E :10878000660A0000572D5B25735D2054544350202A :108790005B2D5D3A20696E76616C69642062756656 :1087A0006C656E0A00000000572D5B25735D205438 :1087B000544350205B2D5D3A20636F756C64206ECE :1087C0006F7420616C6C6F63617465206D656D6F93 :1087D000727920666F7220747463700A0000000062 :1087E000572D5B25735D2054544350205B25705DED :1087F0003A20636F756C64206E6F7420616C6C6FCF :1088000063617465207063620A0000005B25735D1C :108810002025732C20757063623A25702025733AE9 :1088200025640A00572D5B25735D20545443502066 :108830005B25705D3A2075647020636F6E6E6563B2 :1088400074206661696C65640A000000572D5B2521 :10885000735D2054544350205B25705D3A2062695B :108860006E64206661696C6564206572723D256482 :1088700020506F727420616C726561647920757329 :1088800065640A005B25735D2025732C206C6F6383 :108890003A307825782D25642072656D3A30782538 :1088A000782D25640A0000005B25735D20416C6C07 :1088B0006F63207061796C6F61642025642D257071 :1088C0000A000000572D5B25735D2054544350204F :1088D0005B25705D3A20636F756C64206E6F742049 :1088E000616C6C6F63617465207061796C6F616439 :1088F0000A0000005B25735D205B747063625D2D70 :108900002570207061796C6F61643A25700A0000EF :10891000572D5B25735D2054544350205B25705DBB :108920003A2074637020636F6E6E656374206661B5 :10893000696C65640A0000005B25735D2042454652 :108940004F52452042494E4420747463703A25705A :10895000206C7063623A2570207063623A25700A59 :1089600000000000572D5B25735D205454435020B8 :108970005B25705D3A206C697374656E2066616971 :108980006C65640A00000000572D5B25735D205361 :108990007461727420736572766572204641494C29 :1089A0004544210A000000005B25735D20545443B8 :1089B00050205B25702D25705D3A206E6275663DF6 :1089C00025642C206275666C656E3D25642C2070D4 :1089D0006F72743D2564202825732F2573290A00A2 :1089E0007574726C3A6E3A703A7600002573000026 :1089F0005B25735D2041524420544350205B257019 :108A00005D3A20616363657074206E6577205B2535 :108A1000705D0A005B25735D206C6F63616C3A25A5 :108A2000642072656D6F74653A2564207374617497 :108A3000653A25640A0000007061796C6F616420FA :108A40006E6F74206672656564210000572D5B258A :108A5000735D2041524420544350205B25705D20BB :108A60006172673D257020726574726965733D257A :108A7000642061626F72740A000000005B25735D00 :108A8000206B656570416C697665436E743A256448 :108A9000206B6565705F69646C653A25642070655C :108AA00072736973745F636E743A25640A00000020 :108AB0005B25735D2041524420544350205B257058 :108AC0002D25705D206172673D257020726574727E :108AD0006965733D25642070656E642E636C6F73E9 :108AE000653A2564206C656E3A25640A0000000032 :108AF0005B25735D2041524420544350205B257018 :108B00002D25705D2074727920746F20636C6F73F3 :108B1000652070656E64696E673A256420657272BF :108B20003A25642069643A25640A00005B25735D78 :108B30002041524420544350205B25702D25705D08 :108B4000206172673D257020726574726965733D9E :108B500025642070656E642E636C6F73653A2564BE :108B600020636F6E6E3A25640A000000572D5B2566 :108B7000735D2041524420544350205B25702D25C5 :108B8000705D206172673D25702072657472696541 :108B9000733D25640A0000005B25735D204152444B :108BA00020544350205B25702D25705D2074727910 :108BB00020746F20636C6F73652070656E64696EDE :108BC000673A25640A0000005B25735D206C656EC2 :108BD0003A25640A000000005B25735D20736F6313 :108BE0006B3A2564207063623A2570207062756666 :108BF0003A2570206572723A256420627566537456 :108C00006F72653A2570206C656E3A25640A000023 :108C10005B25735D20617463705F726563765F636B :108C20006220703D4E554C4C206F6E20736F636B0D :108C30003A2564207063623A25700A00572D5B253F :108C4000735D206572723D256420703D25700A00B9 :108C50005B25735D205265636569766564202570C8 :108C6000206C656E3A25640A000000006174637030 :108C70005F737461727400007463705F73656E6417 :108C80005F646174615F70636200000061746370AF :108C90005F706F6C6C000000617463705F7265637D :108CA000765F6362000000006172645F7463705FEE :108CB000737461727400000067657446697273743E :108CC000436C69656E7400006172645F7463705F09 :108CD00064657374726F7900636C6F73655F636F43 :108CE0006E6E000073656E6455647044617461005B :108CF000696E736572744E6577436C69656E744313 :108D00006F6E6E0061636B5F726563766564000011 :108D10007463705F636F6E6E6563745F636200009F :108D200073656E645463704461746100636C6F7347 :108D3000655F636F6E6E5F7063620000636C656198 :108D40006E536F636B53746174655F636200000000 :108D50007463705F646174615F73656E74000000BA :108D600061636B416E6446726565446174610000C5 :108D7000676574417661696C5463704461746142E3 :108D80007974650066726565744461746100000001 :108D9000676574546370446174614279746500005E :108DA00063616C634D657267654C656E0000000021 :108DB000696E73657274427566000000697341766E :108DC00061696C5463704461746142797465000038 :108DD00066726565744461746149647800000000DE :108DE0005B25735D202570205B25642C25645D0A5E :108DF00000000000686561644275663D256420746A :108E000061696C4275663D25640A000025645D2039 :108E10007063623A2570204275663A202570204CB6 :108E2000656E3A25640A00005B25735D20205B2592 :108E3000645D3A206C656E3A2564206964783A2551 :108E40006420746F743A25640A0000005B25735D2A :108E500020417661696C61626C6564206461746153 :108E60003A2025640A000000572D5B25735D2069B8 :108E70006478427566206F7574206F662072616E2B :108E800067653A2025640A005B25735D2025702004 :108E90006964783A25640A00572D5B25735D20428A :108EA0007566203D3D204E554C4C21005B25735D81 :108EB0002041636B207063623A2570206C656E3AC6 :108EC000256420736F636B3A256420646174613A92 :108ED00025700A005B25735D206765743A25642060 :108EE00025702025640A00005B25735D206368659A :108EF000636B3A25642025642025700A0000000079 :108F00005B25735D2046726565202570206F74684F :108F1000657220627566202564207461696C3A254B :108F20006420686561643A25640A0000572D5B255A :108F3000735D204F76657277726974696E6720621F :108F40007566666572202570206964783A2564210B :108F50000A000000572D5B25735D20706275665F07 :108F6000636F70795F7061727469616C20666169AA :108F70006C65643A207372633A25702C20647374B4 :108F80003A25702C206C656E3A25640A00000000BA :108F9000572D5B25735D2041766F696420746F20C7 :108FA0004F76657277726974652064617461205BC5 :108FB00025642D25645D210A000000005B25735D9A :108FC00020496E736572745B25645D3A2025703AA2 :108FD00025642D2564205B25642C25645D0A000032 :108FE000572D5B25735D20536F636B206F75742065 :108FF0006F662072616E67653A20736F636B3D2503 :1090000064000000696E736572745F70427566007B :109010006765745F70427566000000000000E10043 :1090200008040000000000000F01110110011301ED :109030000E01110110010F0106000500636D645F50 :109040007365745F69700000636D645F736574704D :1090500061737300636D645F7374617274436C69F0 :1090600000000000466F756E6420486F73743A20EC :109070006E616D653D25732069703D307825780AF5 :109080000000000075736167653A206474203C310C :109090007C303E0A0000000075736167653A2073FA :1090A000656E64556470205B736F636B5D0A097352 :1090B0006F636B3A20736F636B6574204E756D62DE :1090C00065720A00536F636B65743A2025640A0069 :1090D0005061747465726E547970653A2025640A23 :1090E0000000000050726F766100000031323334AE :1090F000353637383930000046696E65546573740B :10910000000000006F6666004465627567204F4688 :10911000460A00007072696E740000004465627552 :10912000672009656E61626C65643A203078257845 :109130000A000000566572626F736520656E616299 :109140006C65643A20307825780A000044756D70AB :109150002009656E61626C65643A20307825780A72 :1091600000000000504F6F6C6C2009656E61626CEE :1091700065643A20307825780A00000044656275FD :1091800067204F4E0A00000075736167653A2064DE :1091900065627567203C73656374696F6E3E203C41 :1091A0006C6576656C3E0A0973656374696F6E3A27 :1091B00020696E69742C20636D2C207370692C20DB :1091C000746370202C207574696C2C207761726E2A :1091D0000A096C6576656C20203A203020286F667D :1091E00066292C203120286F6E292C2032202876E9 :1091F0006572626F7365290A096F723A206465624D :109200007567207072696E742F6F6E2F6F66660AB5 :1092100000000000696E697400000000737069004E :1092200074637000636D00007574696C0000000069 :109230007761726E00000000616C6C0044756D70A7 :1092400020416C6C20427566666572730A000000EE :1092500075736167653A2064756D7050627566203C :109260005B736F636B5D0A09736F636B3A20736F97 :10927000636B6574204E756D6265720A00000000B4 :109280006E6F6E650000000044656C6574696E6702 :1092900020574550206B6579730A0000757361672C :1092A000653A207365746B6579203C6B65795F69FD :1092B00064782028302D33293E203C6B6579206965 :1092C0006E206865783E0A09206F723A20736574D3 :1092D0006B6579206E6F6E650A000000205745505F :1092E000206B6579206D75737420626520313020A4 :1092F000285745502D343029206F722032362028CF :109300005745502D31303429206469676974730AD8 :1093100000000000776C5F61706920766572736988 :109320006F6E2076322E372E300A00006661696C2F :10933000656420746F20676574206D6163206164CB :1093400064726573730A0000687720616464723A1E :109350002025730A000000006C696E6B2073746135 :109360007475733A20000000697020616464723A79 :10937000202573202D2000006E65746D61736B3A9B :10938000202573202D200000676174657761793A8C :109390002025730A00000000697020696E746572F0 :1093A0006661636520697320646F776E0A00000050 :1093B00064686370203A2000656E61626C65640ABF :1093C0000000000064697361626C65640A0000005B :1093D000444E533A202573202D2000007573616799 :1093E000653A207374617274436C69203C697061E2 :1093F0006464723E203C706F72743E203C736F63F5 :109400006B3E203C7463702830292F7564702831BE :10941000293E0A00537461727420636C69656E742E :10942000206F6E206164647220307825782C207063 :109430006F727420256420736F636B202564206D28 :109440006F64652025640A00572D5B25735D2053EA :109450007461727420636C69656E74206F6E207025 :109460006F727420256420736F636B2025642070F5 :10947000726F74202564206D6F646520256420461A :1094800041494C45440A000075736167653A207391 :1094900074617274537276203C706F72743E203C1B :1094A000736F636B3E203C7463702830292F7564A2 :1094B000702831293E0A00005374617274202573AC :1094C00020736572766572206F6E20706F727420E3 :1094D000256420736F636B2025640A00572D5B257C :1094E000735D2053746172742025732073657276E6 :1094F0006572206F6E20706F727420256420736F08 :10950000636B202564204641494C45440A00000015 :1095100075736167653A20736574646E73205B319F :109520002D325D206161612E6262622E6363632E63 :109530006464640A0000000053657420444E5320A4 :1095400073657276657220256420746F2025730A16 :10955000000000003D3D3E20444E53313A2025732B :109560000A0000003D3D3E20444E53323A20257310 :109570000A00000075736167653A20676574486F7B :109580007374203C686F73746E616D653E0A0000F1 :1095900075736167653A207770617373203C7373EC :1095A00069643E203C706173737068726173653EDC :1095B0000A0000002573203A204661696C6564202A :1095C000746F20616464207061737370687261737A :1095D000650A000075736167653A20647061737392 :1095E000203C737369643E0A000000002573203A32 :1095F000204661696C656420746F2064656C6574D5 :109600006520706173737068726173650A00000091 :1096100075736167653A206970636F6E666967206C :109620003C69703E203C6E65746D61736B3E203CFE :10963000676174657761792D69703E0A00000000EA :1096400020206F72203A206970636F6E6669672010 :109650006E6F6E652028746F20656E61626C652088 :1096600044484350290A00005B25735D206E6966FB :109670003A2570206C7769705F616464723D307860 :1096800025780A0075736167653A20636F6E6E65B1 :109690006374203C737369643E0A0000636D645F09 :1096A000737461727453727600000000636D645FBE :1096B00064656C70617373004D494D4C4644000005 :1096C0000A24200024200000617661696C61626CCC :1096D0006520636F6D6D616E64733A0A000000006F :1096E000202025730A000000636F756C64206E6F84 :1096F0007420616C6C6F63617465206669726D774C :10970000617265206275666665720A00547565202F :109710004D61722032362032323A30393A353420B7 :109720003230313300000000776C5F696E69745F1E :10973000636F6D706C6574655F6362006661696C10 :10974000656420746F20696E697420776C20636F84 :109750006E6E206D67720000572D5B25735D205380 :109760007069206E6F7420696E697469616C697AC2 :1097700065640A006C696E6B20646F776E2C2072D2 :10978000656C6561736520646863700A00000000A1 :109790006C696E6B20646F776E0A00006C696E6B8B :1097A0002075702C20636F6E6E6563746564207421 :1097B0006F20222573220A007265717565737469C2 :1097C0006E672064686370202E2E2E20000000003B :1097D0004641494C45440A00626F756E6420746FBF :1097E0002025730A00000000572D5B25735D20497A :1097F0006E74657266616365206E6F74207570218A :109800000A0000007363616E00000000636F6E6EFB :10981000656374007365746B6579000073746174BB :1098200075730000646562756700000064756D7093 :10983000427566006970636F6E66696700000000BC :10984000747463700000000077706173730000002F :109850006470617373000000676574486F7374000F :10986000736574444E53000073746172745372765E :10987000000000007374617274436C6900000000A2 :1098800073656E645564700041726475696E6F2013 :109890005769666920537461727475702E2E2E207C :1098A0005B25735D0A0000006F7574206F66206D84 :1098B000656D6F72790000006661696C6564207483 :1098C0006F207072657061726520666F72206669C4 :1098D000726D7761726520646F776E6C6F61640A78 :1098E00000000000436F756C64206E6F7420646527 :1098F0007465637420776C206465766963652C20D9 :1099000061626F7274696E670A000000496E766169 :109910006C6964206669726D776172652064617438 :10992000612C2061626F7274696E670A000000002A :109930004661696C656420746F2073746172742071 :10994000776C20696E697469616C697A6174696F9A :109950006E0A0000312E312E3000000069705F73F6 :1099600074617475735F63620000000002000000A0 :1099700000B71B000800000100010000286E756C94 :109980006C290000253032782D253032782D253095 :1099900032782D253032782D253032782D25303211 :1099A00078000000256C752E256C752E256C752EA3 :1099B000256C75007373696420746F6F206C6F6E13 :1099C0006720286D6178202564290A00257320000E :1099D00022257322000000002052535349202564A1 :1099E0002064426D200000002041642D486F6320F8 :1099F00000000000202857455020656E6372797082 :109A000074696F6E290000002028544B495020656E :109A10006E6372797074696F6E2900002028434369 :109A20004D5020656E6372797074696F6E29000005 :109A3000202020002530325820000000256300003F :109A40006E6F206E65747320666F756E640A000019 :109A5000496E76616C6964206C656E6774680A0093 :109A600025642E25642E25642E256400544B495010 :109A70000000000043434D500000000057455000D7 :109A8000776C5F636D5F696E6974000073656C6508 :109A900063745F6E65740000776C5F636F6E6E5FFA :109AA0006C6F73745F636200776C5F7363616E5F8A :109AB000636F6D706C6574655F636200776C5F6582 :109AC00076656E745F636200776C5F6D6564696173 :109AD0005F636F6E6E65637465645F636200000050 :109AE0005B25735D20434D3A206F7574206F6620AF :109AF0006D656D6F72790A005B25735D20434D3A89 :109B000020636F756C64206E6F7420726567697373 :109B1000746572206576656E742063620A000000C9 :109B20005B25735D20434D3A20696E697469616CF1 :109B3000697A65640A0000005B25735D20434D3A35 :109B400020636F6E6E656374656420746F20257387 :109B50000A0000005B25735D20434D3A20636F6E61 :109B60006E656374206661696C65642C2073636143 :109B70006E6E696E670A00005B25735D20434D3A87 :109B800020636F756C64206E6F74207374617274DF :109B9000207363616E20616674657220636F6E6E00 :109BA000656374206661696C210A00005B25735D42 :109BB00020434D3A20646973636F6E6E656374650C :109BC000640A00005B25735D20434D3A20636F6E8D :109BD0006E656374696F6E206C6F73742C20736391 :109BE000616E6E696E670A005B25735D20434D3AB6 :109BF00020636F756C64206E6F742073746172746F :109C0000207363616E20616674657220636F6E6E8F :109C1000656374206C6F7374210A00005B25735DAB :109C200020434D3A207363616E20636F6D706C65E5 :109C30007465640A00000000FFFFFFFFFFFF0000E3 :109C40005B25735D20434D3A20526F616D696E67ED :109C50002066726F6D207273736920256420746FA3 :109C60002025640A000000005B25735D20434D3A07 :109C7000204E6F2063616E64696461746520666F55 :109C8000756E6420666F7220737369642022257379 :109C9000220A00005B25735D20434D3A206661690E :109CA0006C656420746F20636F6E6E6563740A0068 :109CB0005B25735D20434D3A206661696C656420C5 :109CC000746F207363616E0A000000005B25735D92 :109CD00020434D3A20756E68616E646C6564206542 :109CE00076656E740A000000776C5F636F6E6E5F5E :109CF0006661696C7572655F636200000000000157 :109D0000000018500000000B00001854000000096B :109D1000000018800000000F000018A400000001DF :109D2000000018E000000001000018E4000000013D :109D300000001810000000010000181400000001CD :109D400000001818000000010000181C00000001AD :109D5000000018200000000100001824000000018D :109D600000001828000000010000182C000000036B :109D700000001830000000010000183C0000000145 :109D8000000018400000000100001844000000011D :109D900000001848000000010000184C4173736572 :109DA0007274696F6E2022257322206661696C656A :109DB00064206174206C696E6520256420696E20C2 :109DC00025730A002E2E2F7372632F534F4654575C :109DD0004152455F4652414D45574F524B2F5345D7 :109DE0005256494345532F4C5749502F6C77697051 :109DF0002D312E332E322F7372632F636F72652FC6 :109E0000646863702E630000646863705F6F7074D1 :109E1000696F6E3A20646863702D3E6F7074696F6D :109E20006E735F6F75745F6C656E202B2032202B14 :109E3000206F7074696F6E5F6C656E203C3D2044CE :109E40004843505F4F5054494F4E535F4C454E006E :109E5000646863705F6F7074696F6E5F6279746558 :109E60003A20646863702D3E6F7074696F6E735F23 :109E70006F75745F6C656E203C20444843505F4FA3 :109E80005054494F4E535F4C454E00006468637018 :109E90005F6F7074696F6E5F747261696C65723A3E :109EA000206468637020213D204E554C4C0000001A :109EB000646863705F6F7074696F6E5F74726169FC :109EC0006C65723A20646863702D3E6D73675F6FD6 :109ED000757420213D204E554C4C0A006468637017 :109EE0005F6F7074696F6E5F747261696C65723AEE :109EF00020646863702D3E6F7074696F6E735F6F5E :109F000075745F6C656E203C20444843505F4F5031 :109F100054494F4E535F4C454E0A000064686370CD :109F20005F6F7074696F6E5F73686F72743A2064EC :109F30006863702D3E6F7074696F6E735F6F7574B8 :109F40005F6C656E202B2032203C3D2044484350FE :109F50005F4F5054494F4E535F4C454E0000000038 :109F6000646863705F6F7074696F6E5F6C6F6E674B :109F70003A20646863702D3E6F7074696F6E735F12 :109F80006F75745F6C656E202B2034203C3D20443F :109F90004843505F4F5054494F4E535F4C454E001D :109FA0007265706C79207761736E277420667265B4 :109FB00065640000646863705F6372656174655F07 :109FC000726571756573743A206E657469662021D7 :109FD0003D204E554C4C0000646863705F637265B1 :109FE0006174655F726571756573743A2064686346 :109FF0007020213D204E554C4C0000006468637079 :10A000005F6372656174655F726571756573743ADB :10A0100020646863702D3E705F6F7574203D3D2035 :10A020004E554C4C00000000646863705F637265BD :10A030006174655F726571756573743A20646863F5 :10A04000702D3E6D73675F6F7574203D3D204E55DA :10A050004C4C0000646863705F6372656174655F97 :10A06000726571756573743A20636865636B2074FB :10A07000686174206669727374207062756620630B :10A08000616E20686F6C64207374727563742064F1 :10A090006863705F6D736700646863705F64656CAC :10A0A0006574655F726571756573743A206E657469 :10A0B000696620213D204E554C4C00006468637059 :10A0C0005F64656C6574655F726571756573743A1C :10A0D000206468637020213D204E554C4C000000E8 :10A0E000646863705F64656C6574655F72657175E3 :10A0F0006573743A20646863702D3E705F6F757489 :10A1000020213D204E554C4C0000000064686370D7 :10A110005F64656C6574655F726571756573743ACB :10A1200020646863702D3E6D73675F6F75742021C6 :10A130003D204E554C4C00006E6574696620213DF3 :10A14000204E554C4C0000007062756620705F6FA9 :10A150007574207761736E2774206672656564007C :10A16000646863705F62696E643A206E65746966E4 :10A1700020213D204E554C4C000000006468637067 :10A180005F62696E643A206468637020213D204EEE :10A19000554C4C00726574203D3D2073697A656FA3 :10A1A000662873747275637420646863705F6D737E :10A1B0006729202D20444843505F4F5054494F4E4B :10A1C000535F4C454E000000726574203D3D206495 :10A1D0006863702D3E6F7074696F6E735F696E5F38 :10A1E0006C656E002E2E2F7372632F534F4654579B :10A1F0004152455F4652414D45574F524B2F5345B3 :10A200005256494345532F4C5749502F6C7769702C :10A210002D312E332E322F7372632F636F72652FA1 :10A22000646E732E63000000646E73207365727633 :10A230006572206F7574206F66206172726179009B :10A24000646E732073657276657220686173206E28 :10A250006F20495020616464726573732073657464 :10A260000000000070627566206D75737420626571 :10A2700020696E206F6E652070696563650000005F :10A28000617272617920696E646578206F757420DF :10A290006F6620626F756E6473000000756E6B6E82 :10A2A0006F776E20646E735F7461626C6520656E9B :10A2B0007472792073746174653A00006C6F636125 :10A2C0006C686F73740000003230382E36372E32CF :10A2D00032322E3232320000000400040004000248 :10A2E000002000050002001E002000002E2E2F730B :10A2F00072632F534F4654574152455F4652414D6A :10A3000045574F524B2F53455256494345532F4CB7 :10A310005749502F6C7769702D312E332E322F73A1 :10A3200072632F636F72652F6D656D702E63000011 :10A330006D656D705F667265653A206D656D207044 :10A34000726F7065726C7920616C69676E6564000C :10A350006D656D705F6D616C6C6F633A20747970C0 :10A3600065203C204D454D505F4D41580000000098 :10A370006D656D705F6D616C6C6F633A206D656DBE :10A38000702070726F7065726C7920616C69676E95 :10A3900065640000001C002000B0002400140020B0 :10A3A00000080010025400002E2E2F7372632F53EA :10A3B0004F4654574152455F4652414D45574F52C3 :10A3C0004B2F53455256494345532F4C5749502F15 :10A3D0006C7769702D312E332E322F7372632F6399 :10A3E0006F72652F6E657469662E6300626F6775A4 :10A3F0007320706275663A206C656E20213D207472 :10A400006F745F6C656E20627574206E6578742061 :10A410003D3D204E554C4C210000000073686F7587 :10A420006C64206E6F74206265206E756C6C207396 :10A43000696E636520666972737420213D206C61CA :10A4400073742100696620666972737420213D204F :10A450004E554C4C2C206C617374206D75737420B8 :10A46000616C736F20626520213D204E554C4C007D :10A470002E2E2F7372632F534F4654574152455F10 :10A480004652414D45574F524B2F53455256494323 :10A4900045532F4C5749502F6C7769702D312E330F :10A4A0002E322F7372632F636F72652F7062756621 :10A4B0002E630000286820213D204E554C4C292059 :10A4C000262620287420213D204E554C4C2920283A :10A4D00070726F6772616D6D65722076696F6C6105 :10A4E000746573204150492900000000702D3E74AE :10A4F0006F745F6C656E203D3D20702D3E6C656E07 :10A5000020286F66206C6173742070627566206904 :10A510006E20636861696E2900000000696E6372D5 :10A52000656D656E745F6D61676E697475646520D5 :10A530003C3D20702D3E6C656E0000006261642021 :10A5400070627566207479706500000070627566CF :10A550005F74616B653A20696E76616C6964206234 :10A5600075660000706275665F74616B653A20699C :10A570006E76616C6964206461746170747200004D :10A58000706275665F74616B653A20696E76616CA6 :10A590006964207062756600646964206E6F74205F :10A5A000636F707920616C6C2064617461000000DD :10A5B000706275665F636F70795F706172746961F4 :10A5C0006C3A20696E76616C696420627566000081 :10A5D000706275665F636F70795F706172746961D4 :10A5E0006C3A20696E76616C696420646174617094 :10A5F00074720000706275665F636F70793A2074E0 :10A600006172676574206E6F742062696720656E81 :10A610006F75676820746F20686F6C6420736F7546 :10A6200072636500705F746F20213D204E554C4C65 :10A63000000000006F66667365745F746F203C3DB8 :10A6400020705F746F2D3E6C656E00006F666673E0 :10A6500065745F66726F6D203C3D20705F66726F3F :10A660006D2D3E6C656E0000706275665F636F7085 :10A6700079282920646F6573206E6F7420616C6C7B :10A680006F77207061636B65742071756575657394 :10A69000210A0000706275665F667265653A207314 :10A6A000616E6520747970650000000070627566E7 :10A6B0005F667265653A20702D3E726566203E20A9 :10A6C00030000000702D3E746F745F6C656E203D2D :10A6D0003D20702D3E6C656E202B20712D3E746FD9 :10A6E000745F6C656E000000702D3E746F745F6C5B :10A6F000656E203D3D20702D3E6C656E00000000B3 :10A70000706275665F7265616C6C6F633A20702071 :10A71000213D204E554C4C00706275665F7265613C :10A720006C6C6F633A2073616E6520702D3E747996 :10A730007065000067726F77203C206D61785F75EF :10A7400031365F7400000000706275665F7265618B :10A750006C6C6F633A207120213D204E554C4C00AB :10A76000706275665F616C6C6F633A206261642031 :10A7700070627566206C617965720000636865635C :10A780006B20702D3E7061796C6F6164202B20709E :10A790002D3E6C656E20646F6573206E6F74206F44 :10A7A000766572666C6F77207062756600000000D7 :10A7B000504255465F504F4F4C5F42554653495AA1 :10A7C00045206D75737420626520626967676572E4 :10A7D000207468616E204D454D5F414C49474E4D98 :10A7E000454E540072656D5F6C656E203C206D6156 :10A7F000785F7531365F7400706275665F616C6C8E :10A800006F633A207062756620712D3E7061796CBD :10A810006F61642070726F7065726C7920616C6911 :10A82000676E656400000000706275665F616C6C45 :10A830006F633A206572726F6E656F7573207479FD :10A8400070650000706275665F636F707920666185 :10A85000696C656400000000010203040506070737 :10A8600007070707070000002E2E2F7372632F5370 :10A870004F4654574152455F4652414D45574F52FE :10A880004B2F53455256494345532F4C5749502F50 :10A890006C7769702D312E332E322F7372632F63D4 :10A8A0006F72652F7463702E630000007463705FB5 :10A8B000706362735F73616E653A20616374697679 :10A8C00065207063622D3E737461746520213D20A4 :10A8D000434C4F53454400007463705F7063627370 :10A8E0005F73616E653A2061637469766520706399 :10A8F000622D3E737461746520213D204C49535490 :10A90000454E00007463705F706362735F73616EC5 :10A91000653A20616374697665207063622D3E73C9 :10A920007461746520213D2054494D452D5741499E :10A93000540000007463705F706362735F73616ED4 :10A94000653A207477207063622D3E73746174657C :10A95000203D3D2054494D452D57414954000000AC :10A960007463705F62696E643A2063616E206F6E1B :10A970006C792062696E6420696E207374617465FD :10A9800020434C4F534544007463705F7265637697 :10A9900065643A206C656E20776F756C6420777201 :10A9A0006170207263765F776E640A00756E7365FE :10A9B0006E74207365676D656E7473206C65616B72 :10A9C000696E6700756E61636B6564207365676DA2 :10A9D000656E7473206C65616B696E6700000000C2 :10A9E0006F6F736571207365676D656E7473206C2E :10A9F00065616B696E6700007463705F7063625FAE :10AA000072656D6F76653A207463705F7063627310 :10AA10005F73616E652829007463705F6C6973747D :10AA2000656E3A2070636220616C726561647920A2 :10AA3000636F6E6E65637465640000007463705FBD :10AA4000736C6F77746D723A2061637469766520F8 :10AA50007063622D3E737461746520213D20434C08 :10AA60004F5345440A0000007463705F736C6F7746 :10AA7000746D723A20616374697665207063622D2B :10AA80003E737461746520213D204C495354454EFA :10AA90000A0000007463705F736C6F77746D723AB4 :10AAA00020616374697665207063622D3E73746102 :10AAB000746520213D2054494D452D574149540A84 :10AAC000000000007463705F736C6F77746D723A8E :10AAD000206D6964646C652074637020213D20746E :10AAE00063705F6163746976655F706362730000B1 :10AAF0007463705F736C6F77746D723A20666972FD :10AB0000737420706362203D3D207463705F6163E5 :10AB1000746976655F706362730000007463705FD0 :10AB2000736C6F77746D723A2054494D452D5741BF :10AB30004954207063622D3E7374617465203D3DFD :10AB40002054494D452D5741495400007463705FAE :10AB5000736C6F77746D723A206D6964646C6520F4 :10AB600074637020213D207463705F74775F70633D :10AB7000627300007463705F736C6F77746D723A08 :10AB800020666972737420706362203D3D20746397 :10AB9000705F74775F706362730000007463705F4E :10ABA000636F6E6E6563743A2063616E206F6E6CC6 :10ABB0007920636F6E6E65637465642066726F6D75 :10ABC00020737461746520434C4F5345440000006A :10ABD00053594E5F53454E540000000053594E5F89 :10ABE000524356440000000045535441424C4953DF :10ABF0004845440046494E5F574149545F31000083 :10AC000046494E5F574149545F320000434C4F5311 :10AC1000455F574149540000434C4F53494E47004C :10AC20004C4153545F41434B0000000054494D4593 :10AC30005F5741495400000003060C18306078004B :10AC40008000FAFC8000FC6C8000FD4E8000FDB4AA :10AC50008000FE368000FD4E8000FE788000FEF809 :10AC60002E2E2F7372632F534F4654574152455F18 :10AC70004652414D45574F524B2F5345525649432B :10AC800045532F4C5749502F6C7769702D312E3317 :10AC90002E322F7372632F636F72652F7463705F30 :10ACA000696E2E63000000007063622D3E736E6457 :10ACB0005F71756575656C656E203E3D20706275CF :10ACC000665F636C656E286E6578742D3E70290032 :10ACD0007463705F726563656976653A2076616C4E :10ACE0006964207175657565206C656E67746800B0 :10ACF000696E7365672E7020213D204E554C4C00C7 :10AD0000696E73616E65206F6666736574210000FD :10AD10007062756620746F6F2073686F72742100A3 :10AD2000706275665F686561646572206661696CF2 :10AD3000656400007463705F726563656976653A87 :10AD4000207365676D656E74206E6F742074726910 :10AD50006D6D656420636F72726563746C792074C5 :10AD60006F207263765F776E640A00007463705FB1 :10AD7000726563656976653A207365676D656E74A3 :10AD8000206E6F74207472696D6D656420636F72DC :10AD9000726563746C7920746F206F6F73657120B6 :10ADA00071756575650A00007463705F726563652F :10ADB0006976653A207463706C656E203E2072631C :10ADC000765F776E640A00007463705F7265636516 :10ADD0006976653A206F6F736571207463706C6576 :10ADE0006E203E207263765F776E640A000000007A :10ADF0007463705F696E7075743A2061637469760C :10AE000065207063622D3E737461746520213D205E :10AE1000434C4F53454400007463705F696E707516 :10AE2000743A20616374697665207063622D3E73A5 :10AE30007461746520213D2054494D452D57414989 :10AE4000540000007463705F696E7075743A20611D :10AE50006374697665207063622D3E7374617465F6 :10AE600020213D204C495354454E00007463705FCF :10AE7000696E7075743A207063622D3E6E657874E9 :10AE800020213D2070636220286265666F72652014 :10AE900063616368652900007463705F696E707533 :10AEA000743A207063622D3E6E65787420213D20D7 :10AEB00070636220286166746572206361636865EF :10AEC000290000007463705F696E7075743A2054D5 :10AED000494D452D57414954207063622D3E73748E :10AEE000617465203D3D2054494D452D57414954DD :10AEF000000000007463705F696E7075743A2070B2 :10AF000063622D3E737461746520213D20434C4F74 :10AF1000534544007063622D3E736E645F717565C6 :10AF200075656C656E203E20300000007063622DF8 :10AF30003E61636365707420213D204E554C4C008A :10AF40007463705F696E7075743A207463705F70BB :10AF50006362735F73616E65282900002E2E2F7364 :10AF600072632F534F4654574152455F4652414DED :10AF700045574F524B2F53455256494345532F4C3B :10AF80005749502F6C7769702D312E332E322F7325 :10AF900072632F636F72652F7463705F6F75742EA9 :10AFA00063000000636865636B20746861742066E9 :10AFB0006972737420706275662063616E20686FB9 :10AFC0006C6420737472756374207463705F68645A :10AFD000720000007463705F656E71756575653A27 :10AFE000207061636B6574206E65656473207061A9 :10AFF000796C6F61642C206F7074696F6E732C2094 :10B000006F722053594E2F46494E202870726F6739 :10B0100072616D6D65722076696F6C617465732005 :10B0200041504929000000007463705F656E7175BE :10B030006575653A206C656E20213D2030207C7C52 :10B0400020617267203D3D204E554C4C2028707287 :10B050006F6772616D6D65722076696F6C61746582 :10B0600073204150492900007463705F656E7175EB :10B070006575653A207062756673206F6E20717514 :10B08000657565203D3E206174206C656173742098 :10B090006F6E65207175657565206E6F6E2D656DBF :10B0A000707479007463705F656E71756575653A6B :10B0B000206E6F207062756673206F6E20717565EB :10B0C0007565203D3E20626F7468207175657565F9 :10B0D0007320656D707479007573656720213D205C :10B0E0004E554C4C00000000636865636B2074682B :10B0F0006174206669727374207062756620636182 :10B100006E20686F6C642074686520636F6D706C6E :10B11000657465207365676C656E000070627566A6 :10B120005F686561646572206661696C65640A00C8 :10B1300046494E20656E71756575656420746F674C :10B140006574686572207769746820646174610051 :10B150007A65726F2D6C656E6774682070627566B3 :10B16000000000007463705F656E71756575653A07 :10B170002076616C6964207175657565206C656EFB :10B1800067746800525354206E6F74206578706540 :10B190006374656420686572652100002E2E2F732C :10B1A00072632F534F4654574152455F4652414DAB :10B1B00045574F524B2F53455256494345532F4CF9 :10B1C0005749502F6C7769702D312E332E322F73E3 :10B1D00072632F636F72652F7564702E63000000B9 :10B1E000726562696E64203D3D203000636865636E :10B1F0006B20746861742066697273742070627564 :10B20000662063616E20686F6C642073747275636E :10B2100074207564705F686472000000702D3E7069 :10B2200061796C6F6164203D3D20697068647200D3 :10B230002E2E2F7372632F534F4654574152455F42 :10B240004652414D45574F524B2F53455256494355 :10B2500045532F4C5749502F6C7769702D312E3341 :10B260002E322F7372632F636F72652F697076347D :10B270002F69636D702E6300636865636B2074686B :10B2800061742066697273742070627566206361F0 :10B290006E20686F6C642069636D70206D657373D8 :10B2A0006167650069636D705F696E7075743A20DF :10B2B0006D6F76696E6720702D3E7061796C6F617D :10B2C0006420746F2069702068656164657220660F :10B2D00061696C65640A0000636865636B2074686B :10B2E0006174206669727374207062756620636190 :10B2F0006E20686F6C642073747275637420746858 :10B30000652049434D502068656164657200000006 :10B3100069636D705F696E7075743A20636F7079E0 :10B32000696E6720746F206E657720706275662085 :10B330006661696C65640A0069636D705F696E704F :10B3400075743A20726573746F72696E67206F72DC :10B350006967696E616C20702D3E7061796C6F61F8 :10B3600064206661696C65640A00000043616E27B1 :10B3700074206D6F7665206F7665722068656164F4 :10B38000657220696E207061636B65740000000057 :10B390002E2E2F7372632F534F4654574152455FE1 :10B3A0004652414D45574F524B2F534552564943F4 :10B3B00045532F4C5749502F6C7769702D312E33E0 :10B3C0002E322F7372632F636F72652F697076341C :10B3D0002F69702E63000000636865636B207468DA :10B3E000617420666972737420706275662063618F :10B3F0006E20686F6C64207374727563742069705A :10B400005F68647200FFFFFFFF00000000000000A3 :10B410002E2E2F7372632F534F4654574152455F60 :10B420004652414D45574F524B2F53455256494373 :10B4300045532F4C5749502F6C7769702D312E335F :10B440002E322F7372632F636F72652F697076349B :10B450002F69705F667261672E630000746869739C :10B46000206E656564732061207062756620696E68 :10B47000206F6E65207069656365210073616E6978 :10B48000747920636865636B206C696E6B656420FA :10B490006C697374000000007072657620213D2095 :10B4A00069707200707265762D3E6E657874203D0D :10B4B0003D2069707200000069705F72656173738E :10B4C0005F70627566636F756E74203E3D20636CBD :10B4D000656E0000636865636B20667261676D6509 :10B4E0006E747320646F6E2774206F7665726C6162 :10B4F000700000006E6F2070726576696F75732042 :10B50000667261676D656E742C2074686973206D56 :10B51000757374206265207468652066697273743F :10B5200020667261676D656E7421000073616E69DB :10B53000747920636865636B0000000076616C6954 :10B54000646174655F646174616772616D3A6E65B0 :10B5500078745F70627566213D4E554C4C0000005A :10B5600076616C69646174655F646174616772615E :10B570006D3A646174616772616D20656E64213D2E :10B58000646174616772616D206C656E00FFFFFF1E :10B59000FFFFFF002E2E2F7372632F534F46545719 :10B5A0004152455F4652414D45574F524B2F5345EF :10B5B0005256494345532F4C5749502F6C77697069 :10B5C0002D312E332E322F7372632F6E65746966A0 :10B5D0002F6574686172702E630000006E65746977 :10B5E000662D3E6877616464725F6C656E206D7570 :10B5F0007374206265207468652073616D652061D5 :10B6000073204554484152505F4857414444525F6B :10B610004C454E20666F722065746861727021001F :10B620007120213D204E554C4C000000712D3E7084 :10B6300020213D204E554C4C00000000722D3E70E4 :10B6400020213D204E554C4C000000006172705F7F :10B650007461626C655B695D2E71203D3D204E55C5 :10B660004C4C000069203C204152505F5441424CF8 :10B67000455F53495A4500006E657469662D3E6802 :10B6800077616464725F6C656E203D3D204554486F :10B690004152505F4857414444525F4C454E000070 :10B6A000636865636B207468617420666972737483 :10B6B00020706275662063616E20686F6C64207311 :10B6C0007472756374206574686172705F68647207 :10B6D000000000006172705F7461626C655B695D9F :10B6E0002E7374617465203D3D2050454E44494E93 :10B6F00047206F7220535441424C45006E6F2070BA :10B7000061636B65742071756575657320616C6C20 :10B710006F77656421000000000000002E2E2F735B :10B7200072632F534F4654574152455F4652414D25 :10B7300045574F524B2F53455256494345532F4C73 :10B740005749502F6C7769702D706F72742D312EA0 :10B75000332E322F48442F69662F6E657469662F29 :10B76000776C69662E6300000A09000052580000D9 :10B7700054580000FFFFFF740000000001FFFFFFAE :10B780000000FFFFFFFFFF400000000001FFFFFF80 :10B7900041505000484D4700312E352E312E370094 :10B7A000312E352E312E3100312E352E312E3400F2 :10B7B00080017C7C80017C7480017C7C80017C6ABF :10B7C00080017DCA80017D7880017D2A80017CD83E :10B7D00080017C86800185D2800185CA800185CA6E :10B7E000800185D2800185C2800185C2800185BA31 :10B7F000800185BA02040B0C121618242C30424822 :10B80000606C0000322E312E312E310078C40E00D3 :10B81000352E332E31000000352E332E350000003A :10B82000352E332E340000008001BF808001BF928E :10B830008001BFA88001BF5A8001BF668001BFD4CC :10B840008001BF5A8001BFE08001BF5A8001BF5A0A :10B850008001BF5A8001BF5A8001BF5A8001BF5A80 :10B860008001BF5A8001BF5A8001BF5A8001BF5A70 :10B870008001BF5A8001BF5A8001BF5A8001BF5A60 :10B880008001BF5A8001BF5A8001BF5A8001BF5A50 :10B890008001BF5A8001BF5A8001BF5A8001BF5A40 :10B8A0008001BF5A8001BF5A8001BF5A8001BF5A30 :10B8B0008001BF5A8001BF5A8001BF5A8001BF5A20 :10B8C0008001BF5A8001BF5A8001BF5A8001BF5A10 :10B8D0008001BF5A8001BF5A8001BF5A8001BF5A00 :10B8E0008001BF5A8001BF5A8001BF5A8001BF5AF0 :10B8F0008001BF5A8001BF5A8001BF5A8001BF5AE0 :10B900008001BF5A8001BF5A8001BF5A8001BF5ACF :10B910008001BF5A8001BF5A8001BF5A8001BF5ABF :10B920008001BF5A8001BF7C8001C0448001BF5AA2 :10B930008001C0448001BF5A8001C17C8001BF5A90 :10B940008001C1708001BF5A8001C1648001BF5A6B :10B950008001BF5A8001BF5A8001BF5A8001C1AC2B :10B960008001BF5A8001BF5A8001C1A08001BF5A27 :10B970008001C1948001BF5A8001BF5A8001BF5A23 :10B980008001BF5A8001BF5A8001BF5A8001BF5A4F :10B990008001BF5A8001BF5A8001BF5A8001BF5A3F :10B9A0008001BF5A8001BF5A8001BF5A8001BF5A2F :10B9B0008001BF5A8001BF5A8001BF5A8001BF5A1F :10B9C0008001BF5A8001BF5A8001BF5A8001BF5A0F :10B9D0008001BF5A8001BF5A8001BF5A8001BF5AFF :10B9E0008001BF5A8001BF5A8001BF5A8001BF5AEF :10B9F0008001BF5A8001BF5A8001BF5A8001BF5ADF :10BA00008001BF5A8001BF5A8001BF5A8001BF5ACE :10BA10008001BF5A8001BF5A8001BF5A8001BF5ABE :10BA20008001BF5A8001BF5A8001BF5A8001BF5AAE :10BA30008001BF5A8001BF5A8001BF5A8001BF5A9E :10BA40008001BF5A8001BF5A8001BF5A8001BF5A8E :10BA50008001BF5A8001BF5A8001BF5A8001BF5A7E :10BA60008001BF5A8001BF5A8001BF5A8001BF5A6E :10BA70008001BF5A8001BF5A8001BF5A8001BF5A5E :10BA80008001BF5A8001BF5A8001BF5A8001BF5A4E :10BA90008001BF5A8001BF5A8001BF5A8001BF5A3E :10BAA0008001BF5A8001BF5A8001BF5A8001BF5A2E :10BAB0008001BF5A8001BF5A8001BF5A8001BF5A1E :10BAC0008001BF5A8001BF5A8001BF5A8001BF5A0E :10BAD0008001BF5A8001BF5A8001BF5A8001BF5AFE :10BAE0008001BF5A8001BF5A8001BF5A8001BF5AEE :10BAF0008001BF5A8001BF5A8001BF5A8001BF5ADE :10BB00008001BF5A8001BF5A8001BF5A8001BF5ACD :10BB10008001BF5A8001C02C8001C1588001C02C17 :10BB20008001C02C8001C1888001BF5A8001C044BF :10BB30008001BF5A8001C0508001BF5A8001C050AF :10BB40008001BF5A8001C02C8001BF5A8001C02CE7 :10BB50008001C0388001C0388001C0388001BF5AE0 :10BB60008001C02C8001C02C8001C14C8001BF5AD3 :10BB70008001BF5A8001C1408001BF5A8001BF5A75 :10BB80008001BF5A8001BF5A8001BF5A8001BF5A4D :10BB90008001BF5A8001BF5A8001BF5A8001BF5A3D :10BBA0008001C1348001BF5A8001BF5A8001BF5A51 :10BBB0008001BF5A8001BF5A8001BF5A8001BF5A1D :10BBC0008001C1288001BF5A8001BF5A8001BF5A3D :10BBD0008001BF5A8001BF5A8001BF5A8001BF5AFD :10BBE0008001BF5A8001BF5A8001BF5A8001BF5AED :10BBF0008001BF5A8001BF5A8001BF5A8001BF5ADD :10BC00008001BF5A8001BF5A8001BF5A8001BF5ACC :10BC10008001BF5A8001BF5A8001BF5A8001BF5ABC :10BC20008001BF5A8001BF5A8001BF5A8001BF5AAC :10BC30008001BF5A8001BF5A8001BF5A8001BF5A9C :10BC40008001BF5A8001BF5A8001BF5A8001BF5A8C :10BC50008001BF5A8001BF5A8001BF5A8001BF5A7C :10BC60008001BF5A8001BF5A8001BF5A8001BF5A6C :10BC70008001BF5A8001BF5A8001BF5A8001BF5A5C :10BC80008001BF5A8001BF5A8001BF5A8001BF5A4C :10BC90008001BF5A8001BF5A8001BF5A8001BF5A3C :10BCA0008001BF5A8001BF5A8001BF5A8001BF5A2C :10BCB0008001BF5A8001BF5A8001BF5A8001BF5A1C :10BCC0008001BF5A8001BF5A8001BF5A8001BF5A0C :10BCD0008001BF5A8001BF5A8001BF5A8001BF5AFC :10BCE0008001BF5A8001BF5A8001BF5A8001BF5AEC :10BCF0008001BF5A8001BF5A8001BF5A8001BF5ADC :10BD00008001BF5A8001BF5A8001BF5A8001BF5ACB :10BD10008001BF5A8001BF5A8001BF5A8001BF5ABB :10BD20008001BF5A8001BF5A8001BF5A8001BF5AAB :10BD30008001BF5A8001BF5A8001BF5A8001BF5A9B :10BD40008001BF5A8001BF5A8001BF5A8001BF5A8B :10BD50008001BF5A8001BF5A8001BF5A8001BF5A7B :10BD60008001BF5A8001BF5A8001BF5A8001C11CA7 :10BD70008001C1108001BF5A8001C1048001BF5AF7 :10BD80008001BF5A8001BF5A8001C0F88001C0EC19 :10BD90008001BF5A8001BF5A8001C0E08001BF5AB4 :10BDA0008001BF5A8001C0D48001C0C88001C0BCDE :10BDB0008001C0B08001C0A48001C0988001C08C07 :10BDC0008001BF5A8001C0808001C0748001BF5AC9 :10BDD0008001C0688001C05C8001C48E8001C47C89 :10BDE0008001C46A8001C4588001C4468001C43403 :10BDF0008001C3928001C3928001C4228001C410DB :10BE00008001C3FE8001C3EC8001C3DA8001C3C896 :10BE10008001C3B68001C3A48001C3A48001C4A073 :10BE20008001C2D48001C2D48001C2D48001C5C0C7 :10BE30008001C5AE8001C59C8001C2D48001C2D4FE :10BE40008001C58A8001C2D48001C2D48001C57836 :10BE50008001C5668001C5548001C5428001C5309E :10BE60008001C51E8001C50C8001C4FA8001C4E8B0 :10BE70008001C2D48001C4D68001C4C48001C2D470 :10BE80008001C2D48001C2D48001C2D48001C2D456 :10BE90008001C2D48001C2D48001C2D48001C2D446 :10BEA0008001C2D48001C2D48001C2D48001C2D436 :10BEB0008001C2D48001C2D48001C2D48001C2D426 :10BEC0008001C2D48001C2D48001C2D48001C2D416 :10BED0008001C2D48001C2D48001C2D48001C2D406 :10BEE0008001C2D48001C2D48001C2D48001C2D4F6 :10BEF0008001C2D48001C2D48001C2D48001C2D4E6 :10BF00008001C2D48001C2D48001C2D48001C2D4D5 :10BF10008001C2D48001C2D48001C2D48001C2D4C5 :10BF20008001C2D48001C2D48001C2D48001C2D4B5 :10BF30008001C2D48001C2D48001C2D48001C2D4A5 :10BF40008001C2D48001C2D48001C2D48001C2D495 :10BF50008001C2D48001C2D48001C2D48001C2D485 :10BF60008001C2D48001C2D48001C2D48001C2D475 :10BF70008001C2D48001C2D48001C2D48001C2D465 :10BF80008001C2D48001C2D48001C2D48001C2D455 :10BF90008001C2D48001C2D48001C2D48001C2D445 :10BFA0008001C2D48001C2D48001C2D48001C2D435 :10BFB0008001C2D48001C2D48001C2D48001C2D425 :10BFC0008001C2D48001C2D48001C2D48001C2D415 :10BFD0008001C2D48001C2D48001C2D48001C2D405 :10BFE0008001C2D48001C2D48001C2D48001C2D4F5 :10BFF0008001C2D48001C2D48001C2D48001C2D4E5 :10C000008001C2D48001C2D48001C2D48001C2D4D4 :10C010008001C4B28001EFCA8001EFCE8001EF7AC7 :10C020008001EF7A8001EF828001EF8A8001EF9238 :10C030008001EF9A8001EFA28001EFAA8001EFB2A8 :10C040008001EFBA8001EFC28001EFD68001F96074 :10C050008001F93E8001F9CC8001F8A68001F9BE8B :10C060008001F91C8001F8A68001F8E28001F8A6A1 :10C070008001F8A68001F8A68001F8A68001F8A644 :10C080008001F8A68001F8A68001F8A68001F8A634 :10C090008001F8A68001F8A68001F8A68001F8A624 :10C0A0008001F8A68001F8A68001F8A68001F8A614 :10C0B0008001F8A68001F8A68001F8A68001F8A604 :10C0C0008001F8A68001F8A68001F8A68001F8A6F4 :10C0D0008001F8A68001F8A68001F8A68001F8A6E4 :10C0E0008001F8A68001F8A68001F8A68001F8A6D4 :10C0F0008001F8A68001F8A68001F8A68001F8A6C4 :10C100008001F8A68001F8A68001F8A68001F8A6B3 :10C110008001F8A68001F8A68001F8A68001F8A6A3 :10C120008001F8A68001F8A68001F8A68001F8A693 :10C130008001F8A68001F8A68001F8A68001F8A683 :10C140008001F8A68001F8A68001F8C08001FA58A5 :10C150008001F8F08001F8F08001F90E8001F8F01C :10C160008001F8F08001F8F08001F8F08001F8F02B :10C170008001F8F08001F8F08001F8F08001F8F01B :10C180008001F8F08001F90E8001F8F08001F8F0EC :10C190008001F8F08001F8F08001F8F08001F8F0FB :10C1A0008001F8F08001FA488001F8F08001F8F091 :10C1B0008001F8F08001F8F08001F8F08001F8F0DB :10C1C0008001F8F08001F8F08001F8F08001F8F0CB :10C1D0008001F8F08001F8F08001F8F08001F8F0BB :10C1E0008001F8F08001F8F08001F8F08001F8F0AB :10C1F0008001F8F08001F8F08001F8F08001F8F09B :10C200008001F8F08001F8F08001F8F08001F8F08A :10C210008001F8F08001F8F08001F8F08001F8F07A :10C220008001F8F08001F8F08001F8F08001F8F06A :10C230008001F8F08001F8F08001F8F08001F8F05A :10C240008001F8F08001F8F08001F8F08001F8F04A :10C250008001F8F08001F8F08001F8F08001F8F03A :10C260008001F8F08001F8F08001F8F08001F8F02A :10C270008001F8F08001F8F08001F8F08001F8F01A :10C280008001F8F08001F8F08001F8F08001F8F00A :10C290008001F8F08001F8F08001F8F08001F8F0FA :10C2A0008001F8F08001F8F08001F8F08001F8F0EA :10C2B0008001F8F08001F8F08001F8F08001F8F0DA :10C2C0008001F8F08001F8F08001F8F08001F8F0CA :10C2D0008001F8F08001F8F08001F8F08001F8F0BA :10C2E0008001F8F08001F8F08001F8F08001F8F0AA :10C2F0008001F8F08001F8F08001F8F08001F8F09A :10C300008001F8F08001F8F08001F8F08001F8F089 :10C310008001F8F08001F8F08001F8F08001F8F079 :10C320008001F8F08001F8F08001F8F08001F8F069 :10C330008001F8F08001F8F08001F8F08001F8F059 :10C340008001F8F08001F8F08001F8F08001F8F049 :10C350008001F90E8001FA348001F8F08001F90EB5 :10C360008001F8F08001F8F08001F8F08001F8F029 :10C370008001F8F08001F8F08001F8F08001F90EFA :10C380008001F8F08001F8F08001FA2C8001FA2495 :10C390008001FA1C8001FA148001FA0C8001FA0471 :10C3A0008001FA408001F8F08001FA5057455F495A :10C3B0004E445F38303231315F434F4E4E45435427 :10C3C0004544000057455F494E445F3830323131B3 :10C3D0005F444953434F4E4E454354494E47000036 :10C3E00057455F494E445F38303231315F494253DF :10C3F000535F444953434F4E4E4543544544000018 :10C40000332E312E322E312E34000000352E3233B1 :10C4100000000000352E32322E320000352E32322E :10C420002E310000352E322E39000000352E3138E5 :10C430002E310000352E31382E320000352E3232AA :10C440002E340000352E32342E320000352E323498 :10C450002E310000352E31312E310000352E322E96 :10C4600032000000352E31362E320000352E3136A6 :10C470002E310000312E312E312E323200000000DC :10C48000352E322E31392E3500000000352E322E59 :10C4900031392E3400000000352E322E31392E3342 :10C4A00000000000352E322E31392E3200000000FF :10C4B000352E322E31392E3100000000352E322E2D :10C4C00031000000352E31312E320000352E313151 :10C4D0002E330000352E31312E340000352E31310F :10C4E0002E350000352E31312E360000352E3131FB :10C4F0002E380000352E31312E37000073736964F9 :10C500000000000070736B004A756E6B41500000B4 :10C5100057534300656170005746412D53696D7054 :10C520006C65436F6E6669672D456E726F6C6C65E6 :10C53000652D312D300000006964656E7469747971 :10C54000000000006E7277696669000064656661CC :10C55000756C740057455F494E445F383032313155 :10C560005F444953434F4E4E4543544544000000F9 :10C5700057455F494E445F50414952574953455FC3 :10C580004D49435F4552524F5200000057455F49A5 :10C590004E445F47524F55505F4D49435F4552529D :10C5A0004F52000057455F494E445F43414E444956 :10C5B000444154455F4C495354000000494E4143A7 :10C5C0005449564500000000444953434F4E4E45E0 :10C5D00043544544000000005343414E4E494E47EA :10C5E000000000004153534F43494154494E470016 :10C5F0004153534F43494154454400003457415936 :10C600005F48414E445348414B45000047524F5507 :10C61000505F48414E445348414B4500434F4D50B5 :10C620004C45544544000000554E4B4E4F574E006C :10C630004354524C2D4556454E542D5445524D4968 :10C640004E4154494E47202D207369676E616C201E :10C650002564207265636569766564007769726533 :10C660006400000043616E63656C6C696E672061F5 :10C67000757468656E7469636174696F6E2074693E :10C680006D656F75740000005750413A2045415068 :10C690004F4C2070726F63657373696E6720636FB0 :10C6A0006D706C657465000043616E63656C6C69E8 :10C6B0006E67207363616E207265717565737400B7 :10C6C00052534E3A207573696E672049454545209F :10C6D0003830322E3131692F44392E3000000000BD :10C6E0005750413A207573696E672049454545208A :10C6F0003830322E3131692F44332E3000000000A3 :10C700005750413A204661696C656420746F20700F :10C7100061727365205750412049452066726F6DE4 :10C72000206173736F63696174696F6E20696E66EF :10C730006F0000005750413A2044726976657220BC :10C74000757365642064697361626C6564206772E7 :10C750006F75702063697068657220307825782065 :10C76000286D61736B203078257829202D20726523 :10C770006A656374000000005750413A20447269B2 :10C7800076657220757365642064697361626C6597 :10C790006420706169727769736520636970686588 :10C7A00072203078257820286D61736B20307825D1 :10C7B0007829202D2072656A656374005750413ACC :10C7C00020447269766572207573656420646973AC :10C7D00061626C6564206B6579206D616E6167656F :10C7E0006D656E74203078257820286D61736B201C :10C7F0003078257829202D2072656A6563740000E1 :10C800005750413A207573696E672047544B204357 :10C81000434D50005750413A207573696E67204769 :10C82000544B20544B4950005750413A207573697E :10C830006E672047544B205745503130340000007C :10C840005750413A207573696E672047544B205703 :10C8500045503430000000005750413A207573694C :10C860006E672050544B2043434D50005750413A7F :10C87000207573696E672050544B20544B4950000B :10C880005750413A207573696E672050544B204EC3 :10C890004F4E45005750413A207573696E67204BE3 :10C8A00045595F4D474D54203830322E31580000E5 :10C8B0005750413A207573696E67204B45595F4D5B :10C8C000474D54205750412D50534B005750413A3B :10C8D000207573696E67204B45595F4D474D542055 :10C8E0005750412D4E4F4E45000000005750413AE1 :10C8F000204661696C656420746F2073656C6563A4 :10C9000074205750412F52534E0000004661696C0D :10C91000656420746F20706172736520746865208F :10C92000636F6E66696775726174696F6E206669A0 :10C930006C652027257327202D2065786974696E22 :10C94000670000005265636F6E6669677572617497 :10C95000696F6E20636F6D706C65746564000000B4 :10C9600053657474696E672061757468656E746967 :10C97000636174696F6E2074696D656F75743A20B8 :10C98000256420736563202564207573656300004A :10C9900053657474696E67207363616E207265718C :10C9A000756573743A2025642073656320256420BF :10C9B000757365630000000041757468656E746985 :10C9C000636174696F6E20776974682025303278EE :10C9D0003A253032783A253032783A253032783A72 :10C9E000253032783A253032782074696D656420BC :10C9F0006F75742E00000000547279696E672074A0 :10CA00006F206173736F63696174652077697468FF :10CA100020253032783A253032783A253032783A4B :10CA2000253032783A253032783A2530327820284D :10CA3000535349443D2725732720667265713D2570 :10CA400064204D487A290000547279696E67207419 :10CA50006F206173736F63696174652077697468AF :10CA60002053534944202725732700004173736FD7 :10CA700063696174696F6E20726571756573742086 :10CA8000746F2074686520647269766572206661CF :10CA9000696C6564000000007770615F7375707089 :10CAA0006C6963616E742076302E352E31300A4306 :10CAB0006F7079726967687420286329203230307A :10CAC000332D323030382C204A6F756E69204D611D :10CAD0006C696E656E203C6A4077312E66693E2037 :10CAE000616E6420636F6E7472696275746F7273C5 :10CAF00000000000546869732070726F6772616D86 :10CB0000206973206672656520736F667477617241 :10CB1000652E20596F752063616E2064697374728D :10CB2000696275746520697420616E642F6F72206C :10CB30006D6F646966792069740A756E6465722028 :10CB4000746865207465726D73206F662074686503 :10CB500020474E552047656E6572616C20507562A6 :10CB60006C6963204C6963656E73652076657273CA :10CB7000696F6E20322E0A0A416C7465726E6174A0 :10CB80006976656C792C207468697320736F66749C :10CB900077617265206D61792062652064697374C4 :10CBA0007269627574656420756E6465722074685C :10CBB00065207465726D73206F66207468650A4223 :10CBC0005344206C6963656E73652E205365652040 :10CBD000524541444D4520616E6420434F505949B0 :10CBE0004E4720666F72206D6F72652064657461B8 :10CBF000696C732E0A0000002530325800000000D6 :10CC00008003C4FC80024A908002490000000010AA :10CC100000000014000000000000002000000000E0 :10CC20008003D3EC80024DF0800248880000006051 :10CC300000000000000000000000000100000000F3 :10CC40008003D3F880024DCC800248280000000009 :10CC500000000000000000000000000000000000D4 :10CC60008003C50480024D00800248C4000000001B :10CC700000000000000000000000000000000001B3 :10CC80008003D4008002408C800247A8000000008E :10CC90000000000000000000000000000000000094 :10CCA0008003D40880023F448002467C00000000DC :10CCB0000000000000000000000000000000000074 :10CCC0008003D41480023F188002466C00000000EC :10CCD0000000000000000000000000000000000054 :10CCE0008003D42080023EEC8002465C00000000FD :10CCF0000000000000000000000000000000000034 :10CD00008003D42880023CA4800244740000000008 :10CD10000000000000000000000000000000000013 :10CD20008003C51480024B9080024B00000000007D :10CD300000000000000000000000000000000000F3 :10CD40008003C53880024A908002490000000068D4 :10CD50000000006C00000000000000000000000067 :10CD60008003D43480024A908002490000000070A1 :10CD7000000000740000000000000000000000003F :10CD80008003D44880024A90800249000000007865 :10CD90000000007C000000100000002000000001E6 :10CDA0008003D45080024A90800249000000008035 :10CDB00000000084000000000000000000000000EF :10CDC0008003D45480024A90800249000000008809 :10CDD0000000008C000000000000000000000001C6 :10CDE0008003D46080024A908002490000000090D5 :10CDF0000000000000000000000000000000000033 :10CE00008003D46880024A908002490000000094A8 :10CE10000000000000000000000000000000000012 :10CE20008003D47080024A9080024900000000987C :10CE300000000000000000000000000000000000F2 :10CE40008003D47C80024A90800249000000009C4C :10CE500000000000000000000000000000000000D2 :10CE60008003D48880024A9080024900000000A01C :10CE700000000000000000000000000000000001B1 :10CE80008003D49C80024A9080024900000000A4E4 :10CE90000000000000000000000000000000000092 :10CEA0008003D4A480024A9080024900000000A8B8 :10CEB0000000000000000000000000000000000072 :10CEC0008003D4B480024A9080024900000000AC84 :10CED0000000000000000000000000000000000052 :10CEE0008003D4C880024A9080024900000000B04C :10CEF0000000000000000000000000000000000032 :10CF00008003D4D480024A9080024900000000B41B :10CF10000000000000000000000000000000000011 :10CF20008003D4E080024A9080024900000000B8EB :10CF300000000000000000000000000000000000F1 :10CF40008003D4F080024A9080024900000000BCB7 :10CF500000000000000000000000000000000000D1 :10CF60008003D50080024A9080024900000000C082 :10CF700000000000000000000000000000000001B0 :10CF80008003D51480024A9080024900000000C44A :10CF90000000000000000000000000000000000091 :10CFA0008003D52080024A9080024900000000C81A :10CFB0000000000000000000000000000000000071 :10CFC0008003D53080024A9080024900000000CCE6 :10CFD0000000000000000000000000000000000051 :10CFE0008003D54480024A9080024900000000D4AA :10CFF0000000000000000000000000000000000031 :10D000008003D54C80024A9080024900000000D87D :10D010000000000000000000000000000000000010 :10D020008003D55480024A9080024900000000DC51 :10D0300000000000000000000000000000000000F0 :10D040008003D55C80024A9080024900000000E025 :10D0500000000000000000000000000000000001CF :10D060008003D56080024A9080024900000000E8F9 :10D0700000000000000000000000000000000000B0 :10D080008003D56C80024A9080024900000000ECC9 :10D090000000000000000000000000000000000090 :10D0A0008003D65C80024DF080024888000000E4D6 :10D0B0000000000000000000000000000000000070 :10D0C0008003D57480024DF080024888000000F093 :10D0D0000000000000000000000000000000000050 :10D0E0008003D58080024A78800244580000000006 :10D0F000000000000000000000000000000000012F :10D100008003D58C80024A608002443C000000000D :10D11000000000000000000000000000000000010E :10D120008003D59880024A48800244200000000015 :10D1300000000000000000000000000000000001EE :10D140008003D5A480024A3080024404000000001D :10D1500000000000000000000000000000000001CE :10D160008003D5B080024DF0800248880000014461 :10D1700000000000000000000000000000000000AF :10D180008003D5C080024DF0800248880000000C6A :10D19000000000000000000000000000000000008F :10D1A0008003D5CC80024DF0800248880000017CCD :10D1B000000000000000000000000000000000006F :10D1C0008003D5DC80024A90800249000000018083 :10D1D000000000000000000000000000000000004F :10D1E0008003D5E880024DF0800248880000019C51 :10D1F000000000000000000000000000000000002F :10D200008003D5F880024DF0800248880000018438 :10D21000000000000000000000000001000000000D :10D220008003D60080024DF0800248880000006430 :10D2300000000000000000000000000200000000EC :10D240008003D60880024DF0800248880000014823 :10D2500000000000000000000000000100000000CD :10D260008003D62080024DF080024888000001949F :10D2700000000000000000000000000100000000AD :10D280008003D62C80024A9080024900000001A051 :10D29000000000000000000000000000000000008E :10D2A0008003D63480024DF0800248880000019847 :10D2B000000000000000000000000001000000006D :10D2C0008003D63C80024DF0800248880000014C6B :10D2D000000000000000000000000001000000004D :10D2E0008003D64880024DF080024888000001A4E7 :10D2F00000000000000000000000271000000000F7 :10D300002A0000004F50454E000000005348415293 :10D31000454400004C454150000000005745503145 :10D320003034000057455034300000005750412D34 :10D3300045415000494545453830323158000000DC :10D340005750410052534E005750413200000000E8 :10D3500025734F50454E00002573534841524544B4 :10D360000000000025734C454150000025734343E5 :10D370004D5000002573544B49500000257357450C :10D3800050313034000000002573574550343000D0 :10D3900025734E4F4E45000025735750412D505375 :10D3A0004B00000025735750412D454150000000AF :10D3B000257349454545383032315800257357505B :10D3C000412D4E4F4E45000025735750410000003F :10D3D000257352534E0000007765705F6B657925A9 :10D3E0006400000025732573000000007363616E04 :10D3F0005F73736964000000627373696400000006 :10D4000070726F746F0000006B65795F6D676D748B :10D4100000000000706169727769736500000000A8 :10D4200067726F7570000000617574685F616C678A :10D4300000000000616E6F6E796D6F75735F6964D7 :10D44000656E74697479000065617070736B0000BB :10D450006E61690070617373776F72640000000021 :10D4600063615F636572740063615F70617468001B :10D47000636C69656E745F6365727400707269765F :10D480006174655F6B657900707269766174655F60 :10D490006B65795F706173737764000064685F66C1 :10D4A000696C65007375626A6563745F6D6174634E :10D4B00068000000616C747375626A6563745F6D07 :10D4C000617463680000000063615F6365727432B9 :10D4D0000000000063615F7061746832000000004A :10D4E000636C69656E745F6365727432000000007E :10D4F000707269766174655F6B6579320000000057 :10D50000707269766174655F6B6579325F706173A3 :10D510007377640064685F66696C653200000000C0 :10D520007375626A6563745F6D617463683200006D :10D53000616C747375626A6563745F6D617463684E :10D5400032000000706861736531000070686173BB :10D5500065320000706373630000000070696E0044 :10D56000656E67696E655F69640000006B65795F71 :10D57000696400006561706F6C5F666C6167730061 :10D580007765705F6B657930000000007765705FCC :10D590006B657931000000007765705F6B657932EB :10D5A000000000007765705F6B6579330000000054 :10D5B0007765705F74785F6B6579696478000000E7 :10D5C0007072696F72697479000000006561705F44 :10D5D000776F726B61726F756E6400007061635F6C :10D5E00066696C6500000000667261676D656E7447 :10D5F0005F73697A650000006D6F6465000000006C :10D600007573655F7770730070726F6163746976AC :10D61000655F6B65795F63616368696E67000000D1 :10D6200064697361626C65640000000069645F7323 :10D6300074720000706565726B6579006D6978655C :10D64000645F63656C6C00006672657175656E631E :10D6500079000000888E000077696669656E6769E9 :10D660006E65000057694669456E67696E65000022 :10D670008003D6588003D664800254C880025420A8 :10D6800080024F98800252E0800253E8800254A446 :10D690000000000080024F9A800252C880024F941E :10D6A00080024F96800252B08002529880024F9CB6 :10D6B00080024F9E8002523C800251E0800251D491 :10D6C000800251AC00000000000000008002518088 :10D6D00080024FF480024FD00000000000000000E4 :10D6E000000000000000000000000000000000003A :10D6F000000000000000000080024FA08002564E93 :10D700008002564A80025646800256408002563CAD :10D7100080025636800256328002562C80025626EF :10D72000800256928002568C800256888002568271 :10D730008002567C80025676800256728002566CB9 :10D740008002566680025B3480025C0880025BE0E7 :10D7500080025BBA80025BA080025B3480025B3493 :10D7600080025B3480025DC280025E3A80025E12FB :10D7700080025D8E80025CC280025AF680025DF4F7 :10D7800080025DCE800268DC80026AA280026A00AC :10D7900080026904800268F2800269EE800268DC1F :10D7A000800268DC800268E8800268E8800268E83D :10D7B000696E76616C696461746500004354524C13 :10D7C0002D4556454E542D4541502D535543434507 :10D7D0005353204541502061757468656E746963C8 :10D7E0006174696F6E20636F6D706C657465642021 :10D7F0007375636365737366756C6C7920286261F9 :10D80000736564206F6E206C6F776572206C617930 :10D810006572207375636365737329004354524CBA :10D820002D4556454E542D4541502D5355434345A6 :10D830005353204541502061757468656E74696367 :10D840006174696F6E20636F6D706C6574656420C0 :10D850007375636365737366756C6C7900000000A3 :10D860004354524C2D4556454E542D4541502D465E :10D8700041494C55524520454150206175746865B9 :10D880006E7469636174696F6E206661696C65644A :10D8900000000000494E495449414C495A45000096 :10D8A0004541503A206D6F7265207468616E202585 :10D8B000642061757468656E7469636174696F6E04 :10D8C00020726F756E6473202D2061626F72740018 :10D8D0004354524C2D4556454E542D4541502D4EE6 :10D8E0004F54494649434154494F4E2000000000DF :10D8F0004354524C2D4556454E542D4541502D53C1 :10D900005441525445442045415020617574686526 :10D910006E7469636174696F6E207374617274658B :10D92000640000004745545F4D4554484F44000093 :10D930004541503A204661696C656420746F2069E6 :10D940006E697469616C697A6520454150206D6526 :10D9500074686F643A2076656E646F722025752056 :10D960006D6574686F642025752028257329000073 :10D970004354524C2D4556454E542D4541502D4D46 :10D980004554484F44204541502076656E646F727F :10D99000202575206D6574686F6420257520282505 :10D9A00073292073656C656374656400454150207C :10D9B0006465696E697400008002794480027ADAD5 :10D9C00080027B5880027BA280027CC880027CD2CD :10D9D00080027AC45750413A20544B495020636F1B :10D9E000756E7465726D656173757265732073749D :10D9F0006F707065640000004173736F63696174D8 :10DA0000656420746F2061206E6577204253533A1D :10DA10002042535349443D253032783A25303278FC :10DA20003A253032783A253032783A253032783A11 :10DA300025303278000000004173736F63696174B0 :10DA40006564207769746820253032783A25303251 :10DA5000783A253032783A253032783A25303278A3 :10DA60003A253032780000005750413A20342D5783 :10DA700061792048616E647368616B6520666169D5 :10DA80006C6564202D207072652D73686172656409 :10DA9000206B6579206D617920626520696E636F06 :10DAA00072726563740000004354524C2D45564514 :10DAB0004E542D444953434F4E4E45435445442004 :10DAC0002D20446973636F6E6E656374206576659F :10DAD0006E74202D2072656D6F7665206B6579738D :10DAE000000000004D69636861656C204D4943206A :10DAF0006661696C757265206465746563746564DC :10DB000000000000544B495020636F756E746572BD :10DB10006D65617375726573207374617274656489 :10DB200000000000000000080000000600000006E1 :10DB3000496E646578202F204141202F20504D4BA5 :10DB40004944202F2065787069726174696F6E2076 :10DB500028696E207365636F6E647329202F206FB0 :10DB600070706F7274756E69737469630A00000077 :10DB7000256420253032783A253032783A25303203 :10DB8000783A253032783A253032783A2530327872 :10DB9000200000002025642025640A00504D4B2001 :10DBA0004E616D650000000052534E3A207374615F :10DBB0007274696E67207072652D61757468656E28 :10DBC0007469636174696F6E2077697468202530A9 :10DBD00032783A253032783A253032783A25303268 :10DBE000783A253032783A253032780052534E3A1E :10DBF0002070726F63657373696E6720504D4B536D :10DC0000412063616E646964617465206C6973743A :10DC10000000000052534E3A206E6F7420696E204F :10DC20007375697461626C652073746174652066D4 :10DC30006F72206E6577207072652D6175746865EE :10DC40006E7469636174696F6E00000052534E3ADE :10DC500020504D4B53412063616E6469646174656B :10DC600020253032783A253032783A253032783AE9 :10DC7000253032783A253032783A253032782073A0 :10DC8000656C656374656420666F72207072652DC3 :10DC900061757468656E7469636174696F6E0000A4 :10DCA00052534E3A20504D4B53412063616E64698C :10DCB0006461746520253032783A253032783A250F :10DCC0003032783A253032783A253032783A253079 :10DCD000327820646F6573206E6F74206E656564A2 :10DCE000207072652D61757468656E746963617406 :10DCF000696F6E20616E796D6F72650052534E3A96 :10DD0000206E6F206D6F72652070656E64696E673E :10DD100020504D4B53412063616E646964617465AA :10DD20007300000052534E3A2061646465642050D1 :10DD30004D4B53412063616368652063616E646984 :10DD40006461746520253032783A253032783A257E :10DD50003032783A253032783A253032783A2530E8 :10DD60003278207072696F202564000052534E3A59 :10DD7000207072652D61757468656E746963617475 :10DD8000696F6E207769746820253032783A2530C3 :10DD900032783A253032783A253032783A253032A6 :10DDA000783A253032782074696D6564206F757417 :10DDB00000000000636F6D706C657465642073759E :10DDC000636365737366756C6C79000052534E3AE9 :10DDD000206661696C656420746F20676574206DCE :10DDE00061737465722073657373696F6E206B6500 :10DDF000792066726F6D207072652D617574682070 :10DE00004541504F4C207374617465206D616368A7 :10DE1000696E65730000000052534E3A20707265BF :10DE20002D61757468656E7469636174696F6E20C5 :10DE30007769746820253032783A253032783A256F :10DE40003032783A253032783A253032783A2530F7 :10DE50003278202573000000800000008002B51C8D :10DE60008002B50A8002B5008002B4FA8002B4F4E0 :10DE70008002B4EE8002B4E8000FAC010050F20260 :10DE8000000FAC02000FAC01000FAC050050F20215 :10DE9000000FAC040050F2010050F2010050F201FA :10DEA0000050F2050050F200000FAC00000FAC0370 :10DEB0000050F200000FAC0449454545203830328F :10DEC0002E315820286E6F20575041290000000045 :10DED0005750412F49454545203830322E31582F73 :10DEE00045415000575041322F4945454520383073 :10DEF000322E31582F45415000000000575041321A :10DF00002D50534B000000005745502D3430000079 :10DF10005745502D313034007061697277697365EF :10DF20005F6369706865723D25730A67726F75700B :10DF30005F6369706865723D25730A6B65795F6D13 :10DF4000676D743D25730A005750413A20257320B0 :10DF5000287372633D253032783A253032783A257D :10DF60003032783A253032783A253032783A2530D6 :10DF7000327829005750413A204B6579206E656709 :10DF80006F74696174696F6E20636F6D706C657416 :10DF90006564207769746820253032783A253032FC :10DFA000783A253032783A253032783A253032784E :10DFB0003A25303278205B50544B3D25732047542E :10DFC0004B3D25735D0000005750413A20496E7665 :10DFD000616C6964204541504F4C2D4B657920663A :10DFE00072616D65202D206B65795F6461746120BD :10DFF0006F766572666C6F7720282564203E202539 :10E000006C752900494520696E20332F34206D73CB :10E010006720646F6573206E6F74206D6174636830 :10E02000207769746820494520696E2042656163E4 :10E030006F6E2F50726F62655265737020286E6F1D :10E040002049453F29000000494520696E20332FB3 :10E0500034206D736720646F6573206E6F74206D5C :10E0600061746368207769746820494520696E206F :10E07000426561636F6E2F50726F62655265737097 :10E0800000000000506F737369626C6520646F77E5 :10E090006E67726164652061747461636B2064658E :10E0A000746563746564202D2052534E207761732C :10E0B00020656E61626C656420616E642052534E0F :10E0C0002049452077617320696E206D7367203386 :10E0D0002F342C20627574206E6F7420696E20427C :10E0E0006561636F6E2F50726F6265526573700069 :10E0F0005750413A204661696C656420746F20670F :10E100006574206D61737465722073657373696FD4 :10E110006E206B65792066726F6D204541504F4CC3 :10E12000207374617465206D616368696E65730046 :10E130005750413A204B65792068616E647368617D :10E140006B652061626F7274656400005750413ADC :10E15000204661696C656420746F20676574207265 :10E16000616E646F6D206461746120666F7220530C :10E170004E6F6E6365000000506169727769736568 :10E18000206B657920657870616E73696F6E000031 :10E190005750413A2047726F75702072656B6579F0 :10E1A000696E6720636F6D706C6574656420776954 :10E1B000746820253032783A253032783A2530326A :10E1C000783A253032783A253032783A253032782C :10E1D000205B47544B3D25735D00000000000000AC :10E1E000000000000050F204000FAC02000FAC0170 :10E1F00052096AD53036A538BF40A39E81F3D7FBBC :10E200007CE339829B2FFF87348E4344C4DEE9CB05 :10E21000547B9432A6C2233DEE4C950B42FAC34E7A :10E22000082EA16628D924B2765BA2496D8BD12530 :10E2300072F8F66486689816D4A45CCC5D65B692D4 :10E240006C704850FDEDB9DA5E154657A78D9D8478 :10E2500090D8AB008CBCD30AF7E45805B8B3450698 :10E26000D02C1E8FCA3F0F02C1AFBD0301138A6BB2 :10E270003A9111414F67DCEA97F2CFCEF0B4E673E2 :10E2800096AC7422E7AD3585E2F937E81C75DF6E90 :10E2900047F11A711D29C5896FB7620EAA18BE1BF6 :10E2A000FC563E4BC6D279209ADBC0FE78CD5AF49C :10E2B0001FDDA8338807C731B11210592780EC5FE2 :10E2C00060517FA919B54A0D2DE57A9F93C99CEF3E :10E2D000A0E03B4DAE2AF5B0C8EBBB3C835399613F :10E2E000172B047EBA77D626E169146355210C7D7D :10E2F00001020408102040801B36000051F4A75092 :10E300007E4165531A17A4C33A275E963BAB6BCB8D :10E310001F9D45F1ACFA58AB4BE303932030FA55FF :10E32000AD766DF688CC7691F5024C254FE5D7FC9D :10E33000C52ACBD726354480B562A38FDEB15A49B2 :10E3400025BA1B6745EA0E985DFEC0E1C32F750232 :10E35000814CF0128D4697A36BD3F9C6038F5FE70C :10E3600015929C95BF6D7AEB955259DAD4BE832DE8 :10E37000587421D349E069298EC9C84475C2896A95 :10E38000F48E797899583E6B27B971DDBEE14FB6AE :10E39000F088AD17C920AC667DCE3AB463DF4A1869 :10E3A000E51A31829751336062537F45B16477E05B :10E3B000BB6BAE84FE81A01CF9082B947048685892 :10E3C0008F45FD1994DE6C87527BF8B7AB73D3236E :10E3D000724B02E2E31F8F576655AB2AB2EB280758 :10E3E0002FB5C20386C57B9AD33708A5302887F29C :10E3F00023BFA5B202036ABAED16825C8ACF1C2B3A :10E40000A779B492F307F2F04E69E2A165DAF4CD90 :10E410000605BED5D134621FC4A6FE8A342E539D94 :10E42000A2F355A0058AE132A4F6EB750B83EC3913 :10E430004060EFAA5E719F06BD6E10513E218AF9C1 :10E4400096DD063DDD3E05AE4DE6BD4691548DB5EB :10E4500071C45D050406D46F605015FF1998FB2444 :10E46000D6BDE997894043CC67D99E77B0E842BDD5 :10E4700007898B88E7195B3879C8EEDBA17C0A47EE :10E480007C420FE9F8841EC90000000009808683E1 :10E49000322BED481E1170AC6C5A724EFD0EFFFB14 :10E4A0000F8538563DAED51E362D39270A0FD96453 :10E4B000685CA6219B5B54D124362E3A0C0A67B1C6 :10E4C0009357E70FB4EE96D21B9B919E80C0C54F29 :10E4D00061DC20A25A774B691C121A16E293BA0A21 :10E4E000C0A02AE53C22E043121B171D0E090D0BAC :10E4F000F28BC7AD2DB6A8B9141EA9C857F119855E :10E50000AF75074CEE99DDBBA37F60FDF701269F39 :10E510005C72F5BC44663BC55BFB7E348B4329765D :10E52000CB23C6DCB6EDFC68B8E4F163D731DCCAB6 :10E53000426385101397224084C61120854A247DAA :10E54000D2BB3DF8AEF93211C729A16D1D9E2F4BEC :10E55000DCB230F30D8652EC77C1E3D02BB3166CEE :10E56000A970B999119448FA47E96422A8FC8CC4AF :10E57000A0F03F1A567D2CD8223390EF87494EC722 :10E58000D938D1C18CCAA2FE98D40B36A6F581CF5A :10E59000A57ADE28DAB78E263FADBFA42C3A9DE4DB :10E5A0005078920D6A5FCC9B547E4662F68D13C202 :10E5B00090D8B8E82E39F75E82C3AFF59F5D80BE74 :10E5C00069D0937C6FD52DA9CF2512B3C8AC993BE8 :10E5D00010187DA7E89C636EDB3BBB7BCD267809DA :10E5E0006E5918F4EC9AB701834F9AA8E6956E65B8 :10E5F000AAFFE67E21BCCF08EF15E8E6BAE79BD973 :10E600004A6F36CEEA9F09D429B07CD631A4B2AF86 :10E610002A3F2331C6A5943035A266C0744EBC375C :10E62000FC82CAA6E090D0B033A7D815F104984A6E :10E6300041ECDAF77FCD500E1791F62F764DD68D3F :10E6400043EFB04DCCAA4D54E49604DF9ED1B5E320 :10E650004C6A881BC12C1FB84665517F9D5EEA0439 :10E66000018C355DFA877473FB0B412EB3671D5A1D :10E6700092DBD252E91056336DD647139AD7618C8C :10E6800037A10C7A59F8148EEB133C89CEA927EEEA :10E69000B761C935E11CE5ED7A47B13C9CD2DF5941 :10E6A00055F2733F1814CE7973C737BF53F7CDEACD :10E6B0005FFDAA5BDF3D6F147844DB86CAAFF38150 :10E6C000B968C43E3824342CC2A3405F161DC372FF :10E6D000BCE2250C283C498BFF0D954139A80171FE :10E6E000080CB3DED8B4E49C6456C1907BCB846143 :10E6F000D532B670486C5C74D0B85742C66363A517 :10E70000F87C7C84EE777799F67B7B8DFFF2F20DB7 :10E71000D66B6BBDDE6F6FB191C5C55460303050A4 :10E7200002010103CE6767A9562B2B7DE7FEFE1978 :10E73000B5D7D7624DABABE6EC76769A8FCACA45B1 :10E740001F82829D89C9C940FA7D7D87EFFAFA153B :10E75000B25959EB8E4747C9FBF0F00B41ADADEC18 :10E76000B3D4D4675FA2A2FD45AFAFEA239C9CBFA0 :10E7700053A4A4F7E47272969BC0C05B75B7B7C28E :10E78000E1FDFD1C3D9393AE4C26266A6C36365A4D :10E790007E3F3F41F5F7F70283CCCC4F6834345CC1 :10E7A00051A5A5F4D1E5E534F9F1F108E2717193D1 :10E7B000ABD8D873623131532A15153F0804040CC5 :10E7C00095C7C752462323659DC3C35E30181828DA :10E7D000379696A10A05050F2F9A9AB50E070709D5 :10E7E000241212361B80809BDFE2E23DCDEBEB264C :10E7F0004E2727697FB2B2CDEA75759F1209091BB2 :10E800001D83839E582C2C74341A1A2E361B1B2DF4 :10E81000DC6E6EB2B45A5AEE5BA0A0FBA45252F664 :10E82000763B3B4DB7D6D6617DB3B3CE5229297B1B :10E83000DDE3E33E5E2F2F7113848497A65353F5D7 :10E84000B9D1D16800000000C1EDED2C402020605E :10E85000E3FCFC1F79B1B1C8B65B5BEDD46A6ABE5C :10E860008DCBCB4667BEBED97239394B944A4ADE4E :10E87000984C4CD4B05858E885CFCF4ABBD0D06B19 :10E88000C5EFEF2A4FAAAAE5EDFBFB16864343C569 :10E890009A4D4DD766333355118585948A4545CFBA :10E8A000E9F9F91004020206FE7F7F81A05050F0C2 :10E8B000783C3C44259F9FBA4BA8A8E3A25151F352 :10E8C0005DA3A3FE804040C0058F8F8A3F9292AD2A :10E8D000219D9DBC70383848F1F5F50463BCBCDF60 :10E8E00077B6B6C1AFDADA75422121632010103055 :10E8F000E5FFFF1AFDF3F30EBFD2D26D81CDCD4CF3 :10E90000180C0C1426131335C3ECEC2FBE5F5FE11B :10E91000359797A2884444CC2E17173993C4C4570F :10E9200055A7A7F2FC7E7E827A3D3D47C86464AC61 :10E93000BA5D5DE73219192BE6737395C06060A06C :10E94000198181989E4F4FD1A3DCDC7F442222663F :10E95000542A2A7E3B9090AB0B8888838C4646CA0B :10E96000C7EEEE296BB8B8D32814143CA7DEDE79C5 :10E97000BC5E5EE2160B0B1DADDBDB76DBE0E03B45 :10E9800064323256743A3A4E140A0A1E924949DBEE :10E990000C06060A4824246CB85C5CE49FC2C25D85 :10E9A000BDD3D36E43ACACEFC46262A6399191A8DB :10E9B000319595A4D3E4E437F279798BD5E7E73242 :10E9C0008BC8C8436E373759DA6D6DB7018D8D8CA2 :10E9D000B1D5D5649C4E4ED249A9A9E0D86C6CB48F :10E9E000AC5656FAF3F4F407CFEAEA25CA6565AFE8 :10E9F000F47A7A8E47AEAEE9100808186FBABAD525 :10EA0000F07878884A25256F5C2E2E72381C1C24DD :10EA100057A6A6F173B4B4C797C6C651CBE8E8238E :10EA2000A1DDDD7CE874749C3E1F1F21964B4BDDFD :10EA300061BDBDDC0D8B8B860F8A8A85E07070907E :10EA40007C3E3E4271B5B5C4CC6666AA904848D8B3 :10EA500006030305F7F6F6011C0E0E12C26161A350 :10EA60006A35355FAE5757F969B9B9D017868691BF :10EA700099C1C1583A1D1D27279E9EB9D9E1E13899 :10EA8000EBF8F8132B9898B322111133D26969BBB4 :10EA9000A9D9D970078E8E89339494A72D9B9BB6E4 :10EAA0003C1E1E2215878792C9E9E92087CECE49F0 :10EAB000AA5555FF50282878A5DFDF7A038C8C8F64 :10EAC00059A1A1F8098989801A0D0D1765BFBFDA10 :10EAD000D7E6E631844242C6D06868B8824141C375 :10EAE000299999B05A2D2D771E0F0F117BB0B0CBFD :10EAF000A85454FC6DBBBBD62C16163A002020201F :10EB000020202020202028282828282020202020DD :10EB100020202020202020202020202020881010AD :10EB20001010101010101010101010101004040409 :10EB300004040404040404101010101010104141C7 :10EB400041414141010101010101010101010101B5 :10EB500001010101010101011010101010104242C9 :10EB60004242424202020202020202020202020285 :10EB70000202020202020202101010102000000025 :10EB80000000000000000000000000000000000085 :10EB90000000000000000000000000000000000075 :10EBA0000000000000000000000000000000000065 :10EBB0000000000000000000000000000000000055 :10EBC0000000000000000000000000000000000045 :10EBD0000000000000000000000000000000000035 :10EBE0000000000000000000000000000000000025 :10EBF0000000000000000000000000000000000015 :10EC00002D2D0000504F5349584C595F434F5252DD :10EC10004543540025733A206F7074696F6E20600D :10EC200025732720697320616D626967756F75733D :10EC30002028636F756C6420626520602D2D25731C :10EC400027206F7220602D2D257327290A000000D0 :10EC500025733A20696E76616C6964206F707469FF :10EC60006F6E202D2D20602D2563270A00000000E7 :10EC700025733A20617267756D656E7420726571D7 :10EC8000756972656420666F72206F7074696F6E4B :10EC9000206000002D2D2573270A00002D256327F5 :10ECA0000A00000043000000000004A88002F4668F :10ECB0008002F4888002F2B08002F2E88002F4520E :10ECC0008002F4508002F3FE8002F4268002F3DC1E :10ECD0008002F3DC8002F3CC8002F3DC8002F3EAF2 :10ECE0008002F3EA8002F3DC3030303030303030F4 :10ECF000303030303030303001020B040B0506016B :10ED00000B01020B040B0506010B0B0B03040B0597 :10ED10000B0B0B0B0B0B040B050B0B0B0B0B0B0B50 :10ED20000B0B0B0B0B05080B040B0B070B0B0B0949 :10ED30000B040B050B0B0B0B0A0B040B0B0B0B0B38 :10ED40000B0B0B040B0B0B0B0B0B0B030B0B0B0B22 :10ED50000B0B0B0B080B0B0B0B0B0B00000000003D :10ED6000000000000001000304000000000001009A :10ED7000030400000000000007030400000000007E :10ED80000000030400000000000000000400000078 :10ED90000000020003040000000000010005060559 :10EDA0000000000001000506000000000000000354 :10EDB0000400000000000008000000000000000047 :10EDC000080000000000000000000000000000003B :10EDD0003031323334353637383941424344454691 :10EDE0000000000030313233343536373839616253 :10EDF0006364656600000000202020202020202081 :10EE000020202020202020200808080808080808C2 :10EE10000808080808080808080808080808080872 :10EE2000080808080808080807080807020808076B :10EE30000808060708070508000101010101010192 :10EE40000101080808080808080408040404040468 :10EE50000808080803080804080808040804080843 :10EE6000040808080808080808040804040404043E :10EE70000304030803080404040308040304080843 :10EE8000040803080808080808080808080808080B :10EE900008080808080808080808080808080808F2 :10EEA00008080808080808080808080808080808E2 :10EEB00008080808080808080808080808080808D2 :10EEC00008080808080808080808080808080808C2 :10EED00008080808080808080808080808080808B2 :10EEE00008080808080808080808080808080808A2 :10EEF0000808080808080808080808080808080892 :10EF00000808080808080808000A000100020003B1 :10EF1000000400050006000700080009000A000BB5 :10EF2000000C000D000E000F00100000000000009B :10EF300000000000000000000000000000000000D1 :10EF400000000000000000000000000000000000C1 :10EF500000000000000000000000000000000000B1 :10EF600000000000000000000000000000000000A1 :10EF70000000000000000000000000000000000091 :10EF800000000000000000000000000080037FB4CB :10EF900080037E2080037E2080037E2080037E20ED :10EFA00080037E2080037E2080037E2080037E20DD :10EFB00080037E20FFFFFFFFFFFFFFFF49534F2D20 :10EFC000383835392D310000800333228003334433 :10EFD0008003316C800331A48003330E8003330C33 :10EFE000800332BA800332E2800332988003329881 :10EFF0008003328880033298800332A6800332A6D1 :10F00000800332988003363480034AA480034AA4E4 :10F010008003364480034AA480034AA480034AA4A0 :10F0200080034AA480034AA480034AA4800336488C :10F030008003371C80034AA48003371880033724D9 :10F0400080034AA480033842800338468003384650 :10F0500080033846800338468003384680033846AC :10F0600080033846800338468003384680034AA42C :10F0700080034AA480034AA480034AA480034AA4CC :10F0800080034AA480034AA480034AA480034AA4BC :10F0900080034AA48003394480033B9680034AA43A :10F0A00080033B9680034AA480034AA480034AA4B9 :10F0B00080034AA48003387880034AA480034AA4CA :10F0C0008003416280034AA480034AA480034AA4C7 :10F0D00080034AA480034AA48003452680034AA4EF :10F0E00080034AA48003361A80034AA480034AA4FA :10F0F00080034AA480034AA480034AA480034AA44C :10F1000080034AA480034AA480034AA480034AA43B :10F11000800338988003395A80033B9680033B96DE :10F1200080033B968003387C8003395A80034AA4CD :10F1300080034AA48003388080034AA480033FA24E :10F1400080034178800343A48003389480034AA459 :10F150008003445880034AA48003453C80034AA4AA :10F1600080034AA48003476E01020B040B050601CD :10F170000B01020B040B0506010B0B0B03040B0523 :10F180000B0B0B0B0B0B040B050B0B0B0B0B0B0BDC :10F190000B0B0B0B0B05080B040B0B070B0B0B09D5 :10F1A0000B040B050B0B0B0B0A0B040B0B0B0B0BC4 :10F1B0000B0B0B040B0B0B0B0B0B0B030B0B0B0BAE :10F1C0000B0B0B0B080B0B0B0B0B0B0000000000C9 :10F1D0000000000000010003040000000000010026 :10F1E000030400000000000007030400000000000A :10F1F0000000030400000000000000000400000004 :10F2000000000200030400000000000100050605E4 :10F2100000000000010005060000000000000003DF :10F2200004000000000000080000000000000000D2 :10F2300008000000000000000000000000000000C6 :10F24000494E4600696E66004E414E006E616E008A :10F2500020202020202020202020202020202020AE :10F26000303030303030303030303030303030309E :10F27000080808080808080808080808080808080E :10F2800008080808080808080808080808080808FE :10F2900007080807020808070808060708070508FE :10F2A0000001010101010101010108080808080825 :10F2B00008040804040404040808080803080804EF :10F2C00008080804080408080408080808080808CA :10F2D00008040804040404040304030803080404E1 :10F2E00004030804030408080408030808080808BD :10F2F000080808080808080808080808080808088E :10F30000080808080808080808080808080808087D :10F31000080808080808080808080808080808086D :10F32000080808080808080808080808080808085D :10F33000080808080808080808080808080808084D :10F34000080808080808080808080808080808083D :10F35000080808080808080808080808080808082D :10F36000080808080808080808080808080808081D :10F37000496E66696E697479000000004E614E0046 :10F3800000000005000000190000007D3FF00000B3 :10F390000000000040240000000000004059000070 :10F3A00000000000408F40000000000040C38800C3 :10F3B0000000000040F86A0000000000412E848038 :10F3C00000000000416312D0000000004197D78484 :10F3D0000000000041CDCD65000000004202A05FAA :10F3E0002000000042374876E8000000426D1A9481 :10F3F000A200000042A2309CE540000042D6BCC4FE :10F400001E900000430C6BF5263400004341C37985 :10F4100037E080004376345785D8A00043ABC16DF8 :10F42000674EC80043E158E460913D004415AF1DAC :10F4300078B58C40444B1AE4D6E2EF504480F0CFCC :10F44000064DD59244B52D02C7E14AF644EA784309 :10F4500079D99DB44341C37937E080004693B8B56C :10F46000B5056E174D384F03E93FF9F55A827748D5 :0CF47000F9301D3275154FDD7F73BF3C75 :10F480000000000455736167653A2074746370204E :10F490002D742F2D72205B2D6F7074696F6E735DEC :10F4A00020686F73740A20202020202020202D6CDB :10F4B0002020202020206C656E677468206F6620F5 :10F4C00062756673207772697474656E20746F203C :10F4D0006E6574776F726B202864656661756C74F5 :10F4E0002031303234290A20202020202020202DD5 :10F4F0006E2020202020206E756D626572206F6660 :10F500002062756673207772697474656E20746FFB :10F51000206E6574776F726B202864656661756C08 :10F52000742031303234290A20202020202020204D :10F530002D70202020202020706F7274206E756D39 :10F5400062657220746F2073656E6420746F20286A :10F5500064656661756C742032303030290A202071 :10F560002020202020202D752020202020207564A0 :10F57000700A20202020202020202D7620202020EE :10F580002020766572626F73650A000080039954CB :10F59000000000000000000000000000000000006B :10F5A000000000000000000000000000000000005B :10F5B000000000000000000000000000000000004B :10F5C000000000000000000000000000000000003B :10F5D000000000000000000000000000000000002B :10F5E000000000000000000000000000000000001B :10F5F000000000000000000000000000000000000B :10F6000000000000000000000000000000000000FA :10F6100000000000000000000000000000000000EA :10F6200000000000000000000000000000000000DA :10F6300000000000000000000000000000000000CA :10F6400000000000000000000000000000000000BA :10F6500000000000000000000000000000000000AA :10F660000000000400000000ABCD00000000196E97 :10F6700010000000FFFFFFFFFFFFFFFFFF7590007E :10F68000000001FFFFFFFFFEFFFFFFFFFF751000FF :10F69000000001FFFFFFFFFE00050000800149ECB4 :10F6A000800149EC800149EC800149EC0000000038 :10F6B000000002340000000C02040B0C1216182487 :10F6C0003048606C000000000000000000000000F6 :10F6D00000000010010000146D3E86B0FFFFFFFF28 :10F6E000FFFF0000000003E800000001000000012F :10F6F00000000320000000010000000000000008DE :10F70000000000020000006400000000000000058E :10F710000000000F000000050000000F000013882B :10F7200000001388000007D00000138800003E800E :10F73000000000020000000C02040B0C121618243A :10F740003048606C00000000000000000000000075 :10F7500000000000000000000D0102030405060780 :10F7600008090A0B0C0D000000000011FF0000004A :10F770000000000000000000000000000000000089 :10F780000000000000000000000000000000FFFF7B :10F79000FFFFFFFF00000001000000030000000168 :10F7A0000000000100000000000000010000000156 :10F7B0000000000100000001000000000000000146 :10F7C0000000000A00000005000000000000000525 :10F7D00000000000FFFFFFFF00000001000000002C :10F7E00000000002FF000000000000000000000018 :10F7F0000000000000000000000000000000000009 :10F80000000000000000FFFFFFFFFFFF00000001FD :10F810000000000300000000000007D000000064AA :10F8200003010100060200000000000C82848B8CA2 :10F83000129618243048606C0000000000000000A0 :10F8400000000000000000000000000100000001B6 :10F85000000000010014000000000014000007D0A8 :10F860000000000000000001000000000000000691 :10F8700000000001FFFFFFFF0A00000064756D6DCE :10F88000795F7373696400000000000000000000ED :10F890000000000000000000000000000000000068 :10F8A000303030313032303330343035303630373C :10F8B0003038303930613062306330643065306602 :10F8C0003130313131323133313431353136313714 :10F8D00031383139316131623163316431653166DA :10F8E00000000000000000028003D670000000004D :10F8F000800255EC80025614800256588002569CB5 :10F90000800256AA800255F4800256B6800256D074 :10F910008002614C8003EAFD0000003F000000010E :10F920008003EF2C8003EF4C8003EF6C000000009D :10F9300000000000000000000000000000000000C7 :10F940008003ECA4000000000000000000000000A4 :10F9500000000000000000000000000000000000A7 :10F960000000000000000000000000000000000097 :10F970000000000000000000000000000000000087 :10F980000000000000000000000000000000000077 :10F990000000000000000000000000000000000067 :10F9A0000000000000000000000000000000000057 :10F9B0000000000000000000000000000000000047 :10F9C0000000000000000000000000000000000037 :10F9D0000000000000000000000000000000000027 :10F9E0000000000000000000000000000000000017 :10F9F0000000000000000000000000000000000007 :10FA000000000000000000000000000000000000F6 :10FA1000000004A800000000000000000000059C99 :10FA20000000059C000005A4000005A4000005AC32 :10FA3000000005AC000005B4000005B4000005BCE2 :10FA4000000005BC000005C4000005C4000005CC92 :10FA5000000005CC000005D4000005D4000005DC42 :10FA6000000005DC000005E4000005E4000005ECF2 :10FA7000000005EC000005F4000005F4000005FCA2 :10FA8000000005FC00000604000006040000060C4F :10FA90000000060C00000614000006140000061CFE :10FAA0000000061C00000624000006240000062CAE :10FAB0000000062C00000634000006340000063C5E :10FAC0000000063C00000644000006440000064C0E :10FAD0000000064C00000654000006540000065CBE :10FAE0000000065C00000664000006640000066C6E :10FAF0000000066C00000674000006740000067C1E :10FB00000000067C00000684000006840000068CCD :10FB10000000068C00000694000006940000069C7D :10FB20000000069C000006A4000006A4000006AC2D :10FB3000000006AC000006B4000006B4000006BCDD :10FB4000000006BC000006C4000006C4000006CC8D :10FB5000000006CC000006D4000006D4000006DC3D :10FB6000000006DC000006E4000006E4000006ECED :10FB7000000006EC000006F4000006F4000006FC9D :10FB8000000006FC00000704000007040000070C4A :10FB90000000070C00000714000007140000071CF9 :10FBA0000000071C00000724000007240000072CA9 :10FBB0000000072C00000734000007340000073C59 :10FBC0000000073C00000744000007440000074C09 :10FBD0000000074C00000754000007540000075CB9 :10FBE0000000075C00000764000007640000076C69 :10FBF0000000076C00000774000007740000077C19 :10FC00000000077C00000784000007840000078CC8 :10FC10000000078C00000794000007940000079C78 :10FC20000000079C000007A4000007A4000007AC28 :10FC3000000007AC000007B4000007B4000007BCD8 :10FC4000000007BC000007C4000007C4000007CC88 :10FC5000000007CC000007D4000007D4000007DC38 :10FC6000000007DC000007E4000007E4000007ECE8 :10FC7000000007EC000007F4000007F4000007FC98 :10FC8000000007FC00000804000008040000080C45 :10FC90000000080C00000814000008140000081CF4 :10FCA0000000081C00000824000008240000082CA4 :10FCB0000000082C00000834000008340000083C54 :10FCC0000000083C00000844000008440000084C04 :10FCD0000000084C00000854000008540000085CB4 :10FCE0000000085C00000864000008640000086C64 :10FCF0000000086C00000874000008740000087C14 :10FD00000000087C00000884000008840000088CC3 :10FD10000000088C00000894000008940000089C73 :10FD20000000089C000008A4000008A4000008AC23 :10FD3000000008AC000008B4000008B4000008BCD3 :10FD4000000008BC000008C4000008C4000008CC83 :10FD5000000008CC000008D4000008D4000008DC33 :10FD6000000008DC000008E4000008E4000008ECE3 :10FD7000000008EC000008F4000008F4000008FC93 :10FD8000000008FC00000904000009040000090C40 :10FD90000000090C00000914000009140000091CEF :10FDA0000000091C00000924000009240000092C9F :10FDB0000000092C00000934000009340000093C4F :10FDC0000000093C00000944000009440000094CFF :10FDD0000000094C00000954000009540000095CAF :10FDE0000000095C00000964000009640000096C5F :10FDF0000000096C00000974000009740000097C0F :10FE00000000097C00000984000009840000098CBE :10FE10000000098C00000994000009940002000011 :0CFE2000FFFFFFFF0000000100007AFC63 :040000058000000077 :00000001FF ================================================ FILE: external/arduino/avr/firmwares/wifishield/binary/wifi_dnld.hex ================================================ :0200000480007A :10000000E08F100000000000000000000000000071 :1000100000000000000000000000000000000000E0 :1000200000000000000000000000000000000000D0 :1000300000000000000000000000000000000000C0 :1000400000000000000000000000000000000000B0 :1000500000000000000000000000000000000000A0 :100060000000000000000000000000000000000090 :100070000000000000000000000000000000000080 :100080000000000000000000000000000000000070 :100090000000000000000000000000000000000060 :1000A0000000000000000000000000000000000050 :1000B0000000000000000000000000000000000040 :1000C0000000000000000000000000000000000030 :1000D0000000000000000000000000000000000020 :1000E0000000000000000000000000000000000010 :1000F0000000000000000000000000000000000000 :1001000000000000000000000000000000000000EF :1001100000000000000000000000000000000000DF :1001200000000000000000000000000000000000CF :1001300000000000000000000000000000000000BF :1001400000000000000000000000000000000000AF :10015000000000000000000000000000000000009F :10016000000000000000000000000000000000008F :10017000000000000000000000000000000000007F :10018000000000000000000000000000000000006F :10019000000000000000000000000000000000005F :1001A000000000000000000000000000000000004F :1001B000000000000000000000000000000000003F :1001C000000000000000000000000000000000002F :1001D000000000000000000000000000000000001F :1001E000000000000000000000000000000000000F :1001F00000000000000000000000000000000000FF :1002000000000000000000000000000000000000EE :1002100000000000000000000000000000000000DE :1002200000000000000000000000000000000000CE :1002300000000000000000000000000000000000BE :1002400000000000000000000000000000000000AE :10025000000000000000000000000000000000009E :10026000000000000000000000000000000000008E :10027000000000000000000000000000000000007E :10028000000000000000000000000000000000006E :10029000000000000000000000000000000000005E :1002A000000000000000000000000000000000004E :1002B000000000000000000000000000000000003E :1002C000000000000000000000000000000000002E :1002D000000000000000000000000000000000001E :1002E000000000000000000000000000000000000E :1002F00000000000000000000000000000000000FE :1003000000000000000000000000000000000000ED :1003100000000000000000000000000000000000DD :1003200000000000000000000000000000000000CD :1003300000000000000000000000000000000000BD :1003400000000000000000000000000000000000AD :10035000000000000000000000000000000000009D :10036000000000000000000000000000000000008D :10037000000000000000000000000000000000007D :10038000000000000000000000000000000000006D :10039000000000000000000000000000000000005D :1003A000000000000000000000000000000000004D :1003B000000000000000000000000000000000003D :1003C000000000000000000000000000000000002D :1003D000000000000000000000000000000000001D :1003E000000000000000000000000000000000000D :1003F00000000000000000000000000000000000FD :1004000000000000000000000000000000000000EC :1004100000000000000000000000000000000000DC :1004200000000000000000000000000000000000CC :1004300000000000000000000000000000000000BC :1004400000000000000000000000000000000000AC :10045000000000000000000000000000000000009C :10046000000000000000000000000000000000008C :10047000000000000000000000000000000000007C :10048000000000000000000000000000000000006C :10049000000000000000000000000000000000005C :1004A000000000000000000000000000000000004C :1004B000000000000000000000000000000000003C :1004C000000000000000000000000000000000002C :1004D000000000000000000000000000000000001C :1004E000000000000000000000000000000000000C :1004F00000000000000000000000000000000000FC :1005000000000000000000000000000000000000EB :1005100000000000000000000000000000000000DB :1005200000000000000000000000000000000000CB :1005300000000000000000000000000000000000BB :1005400000000000000000000000000000000000AB :10055000000000000000000000000000000000009B :10056000000000000000000000000000000000008B :10057000000000000000000000000000000000007B :10058000000000000000000000000000000000006B :10059000000000000000000000000000000000005B :1005A000000000000000000000000000000000004B :1005B000000000000000000000000000000000003B :1005C000000000000000000000000000000000002B :1005D000000000000000000000000000000000001B :1005E000000000000000000000000000000000000B :1005F00000000000000000000000000000000000FB :1006000000000000000000000000000000000000EA :1006100000000000000000000000000000000000DA :1006200000000000000000000000000000000000CA :1006300000000000000000000000000000000000BA :1006400000000000000000000000000000000000AA :10065000000000000000000000000000000000009A :10066000000000000000000000000000000000008A :10067000000000000000000000000000000000007A :10068000000000000000000000000000000000006A :10069000000000000000000000000000000000005A :1006A000000000000000000000000000000000004A :1006B000000000000000000000000000000000003A :1006C000000000000000000000000000000000002A :1006D000000000000000000000000000000000001A :1006E000000000000000000000000000000000000A :1006F00000000000000000000000000000000000FA :1007000000000000000000000000000000000000E9 :1007100000000000000000000000000000000000D9 :1007200000000000000000000000000000000000C9 :1007300000000000000000000000000000000000B9 :1007400000000000000000000000000000000000A9 :100750000000000000000000000000000000000099 :100760000000000000000000000000000000000089 :100770000000000000000000000000000000000079 :100780000000000000000000000000000000000069 :100790000000000000000000000000000000000059 :1007A0000000000000000000000000000000000049 :1007B0000000000000000000000000000000000039 :1007C0000000000000000000000000000000000029 :1007D0000000000000000000000000000000000019 :1007E0000000000000000000000000000000000009 :1007F00000000000000000000000000000000000F9 :1008000000000000000000000000000000000000E8 :1008100000000000000000000000000000000000D8 :1008200000000000000000000000000000000000C8 :1008300000000000000000000000000000000000B8 :1008400000000000000000000000000000000000A8 :100850000000000000000000000000000000000098 :100860000000000000000000000000000000000088 :100870000000000000000000000000000000000078 :100880000000000000000000000000000000000068 :100890000000000000000000000000000000000058 :1008A0000000000000000000000000000000000048 :1008B0000000000000000000000000000000000038 :1008C0000000000000000000000000000000000028 :1008D0000000000000000000000000000000000018 :1008E0000000000000000000000000000000000008 :1008F00000000000000000000000000000000000F8 :1009000000000000000000000000000000000000E7 :1009100000000000000000000000000000000000D7 :1009200000000000000000000000000000000000C7 :1009300000000000000000000000000000000000B7 :1009400000000000000000000000000000000000A7 :100950000000000000000000000000000000000097 :100960000000000000000000000000000000000087 :100970000000000000000000000000000000000077 :100980000000000000000000000000000000000067 :100990000000000000000000000000000000000057 :1009A0000000000000000000000000000000000047 :1009B0000000000000000000000000000000000037 :1009C0000000000000000000000000000000000027 :1009D0000000000000000000000000000000000017 :1009E0000000000000000000000000000000000007 :1009F00000000000000000000000000000000000F7 :100A000000000000000000000000000000000000E6 :100A100000000000000000000000000000000000D6 :100A200000000000000000000000000000000000C6 :100A300000000000000000000000000000000000B6 :100A400000000000000000000000000000000000A6 :100A50000000000000000000000000000000000096 :100A60000000000000000000000000000000000086 :100A70000000000000000000000000000000000076 :100A80000000000000000000000000000000000066 :100A90000000000000000000000000000000000056 :100AA0000000000000000000000000000000000046 :100AB0000000000000000000000000000000000036 :100AC0000000000000000000000000000000000026 :100AD0000000000000000000000000000000000016 :100AE0000000000000000000000000000000000006 :100AF00000000000000000000000000000000000F6 :100B000000000000000000000000000000000000E5 :100B100000000000000000000000000000000000D5 :100B200000000000000000000000000000000000C5 :100B300000000000000000000000000000000000B5 :100B400000000000000000000000000000000000A5 :100B50000000000000000000000000000000000095 :100B60000000000000000000000000000000000085 :100B70000000000000000000000000000000000075 :100B80000000000000000000000000000000000065 :100B90000000000000000000000000000000000055 :100BA0000000000000000000000000000000000045 :100BB0000000000000000000000000000000000035 :100BC0000000000000000000000000000000000025 :100BD0000000000000000000000000000000000015 :100BE0000000000000000000000000000000000005 :100BF00000000000000000000000000000000000F5 :100C000000000000000000000000000000000000E4 :100C100000000000000000000000000000000000D4 :100C200000000000000000000000000000000000C4 :100C300000000000000000000000000000000000B4 :100C400000000000000000000000000000000000A4 :100C50000000000000000000000000000000000094 :100C60000000000000000000000000000000000084 :100C70000000000000000000000000000000000074 :100C80000000000000000000000000000000000064 :100C90000000000000000000000000000000000054 :100CA0000000000000000000000000000000000044 :100CB0000000000000000000000000000000000034 :100CC0000000000000000000000000000000000024 :100CD0000000000000000000000000000000000014 :100CE0000000000000000000000000000000000004 :100CF00000000000000000000000000000000000F4 :100D000000000000000000000000000000000000E3 :100D100000000000000000000000000000000000D3 :100D200000000000000000000000000000000000C3 :100D300000000000000000000000000000000000B3 :100D400000000000000000000000000000000000A3 :100D50000000000000000000000000000000000093 :100D60000000000000000000000000000000000083 :100D70000000000000000000000000000000000073 :100D80000000000000000000000000000000000063 :100D90000000000000000000000000000000000053 :100DA0000000000000000000000000000000000043 :100DB0000000000000000000000000000000000033 :100DC0000000000000000000000000000000000023 :100DD0000000000000000000000000000000000013 :100DE0000000000000000000000000000000000003 :100DF00000000000000000000000000000000000F3 :100E000000000000000000000000000000000000E2 :100E100000000000000000000000000000000000D2 :100E200000000000000000000000000000000000C2 :100E300000000000000000000000000000000000B2 :100E400000000000000000000000000000000000A2 :100E50000000000000000000000000000000000092 :100E60000000000000000000000000000000000082 :100E70000000000000000000000000000000000072 :100E80000000000000000000000000000000000062 :100E90000000000000000000000000000000000052 :100EA0000000000000000000000000000000000042 :100EB0000000000000000000000000000000000032 :100EC0000000000000000000000000000000000022 :100ED0000000000000000000000000000000000012 :100EE0000000000000000000000000000000000002 :100EF00000000000000000000000000000000000F2 :100F000000000000000000000000000000000000E1 :100F100000000000000000000000000000000000D1 :100F200000000000000000000000000000000000C1 :100F300000000000000000000000000000000000B1 :100F400000000000000000000000000000000000A1 :100F50000000000000000000000000000000000091 :100F60000000000000000000000000000000000081 :100F70000000000000000000000000000000000071 :100F80000000000000000000000000000000000061 :100F90000000000000000000000000000000000051 :100FA0000000000000000000000000000000000041 :100FB0000000000000000000000000000000000031 :100FC0000000000000000000000000000000000021 :100FD0000000000000000000000000000000000011 :100FE0000000000000000000000000000000000001 :100FF00000000000000000000000000000000000F1 :1010000000000000000000000000000000000000E0 :1010100000000000000000000000000000000000D0 :1010200000000000000000000000000000000000C0 :1010300000000000000000000000000000000000B0 :1010400000000000000000000000000000000000A0 :101050000000000000000000000000000000000090 :101060000000000000000000000000000000000080 :101070000000000000000000000000000000000070 :101080000000000000000000000000000000000060 :101090000000000000000000000000000000000050 :1010A0000000000000000000000000000000000040 :1010B0000000000000000000000000000000000030 :1010C0000000000000000000000000000000000020 :1010D0000000000000000000000000000000000010 :1010E0000000000000000000000000000000000000 :1010F00000000000000000000000000000000000F0 :1011000000000000000000000000000000000000DF :1011100000000000000000000000000000000000CF :1011200000000000000000000000000000000000BF :1011300000000000000000000000000000000000AF :10114000000000000000000000000000000000009F :10115000000000000000000000000000000000008F :10116000000000000000000000000000000000007F :10117000000000000000000000000000000000006F :10118000000000000000000000000000000000005F :10119000000000000000000000000000000000004F :1011A000000000000000000000000000000000003F :1011B000000000000000000000000000000000002F :1011C000000000000000000000000000000000001F :1011D000000000000000000000000000000000000F :1011E00000000000000000000000000000000000FF :1011F00000000000000000000000000000000000EF :1012000000000000000000000000000000000000DE :1012100000000000000000000000000000000000CE :1012200000000000000000000000000000000000BE :1012300000000000000000000000000000000000AE :10124000000000000000000000000000000000009E :10125000000000000000000000000000000000008E :10126000000000000000000000000000000000007E :10127000000000000000000000000000000000006E :10128000000000000000000000000000000000005E :10129000000000000000000000000000000000004E :1012A000000000000000000000000000000000003E :1012B000000000000000000000000000000000002E :1012C000000000000000000000000000000000001E :1012D000000000000000000000000000000000000E :1012E00000000000000000000000000000000000FE :1012F00000000000000000000000000000000000EE :1013000000000000000000000000000000000000DD :1013100000000000000000000000000000000000CD :1013200000000000000000000000000000000000BD :1013300000000000000000000000000000000000AD :10134000000000000000000000000000000000009D :10135000000000000000000000000000000000008D :10136000000000000000000000000000000000007D :10137000000000000000000000000000000000006D :10138000000000000000000000000000000000005D :10139000000000000000000000000000000000004D :1013A000000000000000000000000000000000003D :1013B000000000000000000000000000000000002D :1013C000000000000000000000000000000000001D :1013D000000000000000000000000000000000000D :1013E00000000000000000000000000000000000FD :1013F00000000000000000000000000000000000ED :1014000000000000000000000000000000000000DC :1014100000000000000000000000000000000000CC :1014200000000000000000000000000000000000BC :1014300000000000000000000000000000000000AC :10144000000000000000000000000000000000009C :10145000000000000000000000000000000000008C :10146000000000000000000000000000000000007C :10147000000000000000000000000000000000006C :10148000000000000000000000000000000000005C :10149000000000000000000000000000000000004C :1014A000000000000000000000000000000000003C :1014B000000000000000000000000000000000002C :1014C000000000000000000000000000000000001C :1014D000000000000000000000000000000000000C :1014E00000000000000000000000000000000000FC :1014F00000000000000000000000000000000000EC :1015000000000000000000000000000000000000DB :1015100000000000000000000000000000000000CB :1015200000000000000000000000000000000000BB :1015300000000000000000000000000000000000AB :10154000000000000000000000000000000000009B :10155000000000000000000000000000000000008B :10156000000000000000000000000000000000007B :10157000000000000000000000000000000000006B :10158000000000000000000000000000000000005B :10159000000000000000000000000000000000004B :1015A000000000000000000000000000000000003B :1015B000000000000000000000000000000000002B :1015C000000000000000000000000000000000001B :1015D000000000000000000000000000000000000B :1015E00000000000000000000000000000000000FB :1015F00000000000000000000000000000000000EB :1016000000000000000000000000000000000000DA :1016100000000000000000000000000000000000CA :1016200000000000000000000000000000000000BA :1016300000000000000000000000000000000000AA :10164000000000000000000000000000000000009A :10165000000000000000000000000000000000008A :10166000000000000000000000000000000000007A :10167000000000000000000000000000000000006A :10168000000000000000000000000000000000005A :10169000000000000000000000000000000000004A :1016A000000000000000000000000000000000003A :1016B000000000000000000000000000000000002A :1016C000000000000000000000000000000000001A :1016D000000000000000000000000000000000000A :1016E00000000000000000000000000000000000FA :1016F00000000000000000000000000000000000EA :1017000000000000000000000000000000000000D9 :1017100000000000000000000000000000000000C9 :1017200000000000000000000000000000000000B9 :1017300000000000000000000000000000000000A9 :101740000000000000000000000000000000000099 :101750000000000000000000000000000000000089 :101760000000000000000000000000000000000079 :101770000000000000000000000000000000000069 :101780000000000000000000000000000000000059 :101790000000000000000000000000000000000049 :1017A0000000000000000000000000000000000039 :1017B0000000000000000000000000000000000029 :1017C0000000000000000000000000000000000019 :1017D0000000000000000000000000000000000009 :1017E00000000000000000000000000000000000F9 :1017F00000000000000000000000000000000000E9 :1018000000000000000000000000000000000000D8 :1018100000000000000000000000000000000000C8 :1018200000000000000000000000000000000000B8 :1018300000000000000000000000000000000000A8 :101840000000000000000000000000000000000098 :101850000000000000000000000000000000000088 :101860000000000000000000000000000000000078 :101870000000000000000000000000000000000068 :101880000000000000000000000000000000000058 :101890000000000000000000000000000000000048 :1018A0000000000000000000000000000000000038 :1018B0000000000000000000000000000000000028 :1018C0000000000000000000000000000000000018 :1018D0000000000000000000000000000000000008 :1018E00000000000000000000000000000000000F8 :1018F00000000000000000000000000000000000E8 :1019000000000000000000000000000000000000D7 :1019100000000000000000000000000000000000C7 :1019200000000000000000000000000000000000B7 :1019300000000000000000000000000000000000A7 :101940000000000000000000000000000000000097 :101950000000000000000000000000000000000087 :101960000000000000000000000000000000000077 :101970000000000000000000000000000000000067 :101980000000000000000000000000000000000057 :101990000000000000000000000000000000000047 :1019A0000000000000000000000000000000000037 :1019B0000000000000000000000000000000000027 :1019C0000000000000000000000000000000000017 :1019D0000000000000000000000000000000000007 :1019E00000000000000000000000000000000000F7 :1019F00000000000000000000000000000000000E7 :101A000000000000000000000000000000000000D6 :101A100000000000000000000000000000000000C6 :101A200000000000000000000000000000000000B6 :101A300000000000000000000000000000000000A6 :101A40000000000000000000000000000000000096 :101A50000000000000000000000000000000000086 :101A60000000000000000000000000000000000076 :101A70000000000000000000000000000000000066 :101A80000000000000000000000000000000000056 :101A90000000000000000000000000000000000046 :101AA0000000000000000000000000000000000036 :101AB0000000000000000000000000000000000026 :101AC0000000000000000000000000000000000016 :101AD0000000000000000000000000000000000006 :101AE00000000000000000000000000000000000F6 :101AF00000000000000000000000000000000000E6 :101B000000000000000000000000000000000000D5 :101B100000000000000000000000000000000000C5 :101B200000000000000000000000000000000000B5 :101B300000000000000000000000000000000000A5 :101B40000000000000000000000000000000000095 :101B50000000000000000000000000000000000085 :101B60000000000000000000000000000000000075 :101B70000000000000000000000000000000000065 :101B80000000000000000000000000000000000055 :101B90000000000000000000000000000000000045 :101BA0000000000000000000000000000000000035 :101BB0000000000000000000000000000000000025 :101BC0000000000000000000000000000000000015 :101BD0000000000000000000000000000000000005 :101BE00000000000000000000000000000000000F5 :101BF00000000000000000000000000000000000E5 :101C000000000000000000000000000000000000D4 :101C100000000000000000000000000000000000C4 :101C200000000000000000000000000000000000B4 :101C300000000000000000000000000000000000A4 :101C40000000000000000000000000000000000094 :101C50000000000000000000000000000000000084 :101C60000000000000000000000000000000000074 :101C70000000000000000000000000000000000064 :101C80000000000000000000000000000000000054 :101C90000000000000000000000000000000000044 :101CA0000000000000000000000000000000000034 :101CB0000000000000000000000000000000000024 :101CC0000000000000000000000000000000000014 :101CD0000000000000000000000000000000000004 :101CE00000000000000000000000000000000000F4 :101CF00000000000000000000000000000000000E4 :101D000000000000000000000000000000000000D3 :101D100000000000000000000000000000000000C3 :101D200000000000000000000000000000000000B3 :101D300000000000000000000000000000000000A3 :101D40000000000000000000000000000000000093 :101D50000000000000000000000000000000000083 :101D60000000000000000000000000000000000073 :101D70000000000000000000000000000000000063 :101D80000000000000000000000000000000000053 :101D90000000000000000000000000000000000043 :101DA0000000000000000000000000000000000033 :101DB0000000000000000000000000000000000023 :101DC0000000000000000000000000000000000013 :101DD0000000000000000000000000000000000003 :101DE00000000000000000000000000000000000F3 :101DF00000000000000000000000000000000000E3 :101E000000000000000000000000000000000000D2 :101E100000000000000000000000000000000000C2 :101E200000000000000000000000000000000000B2 :101E300000000000000000000000000000000000A2 :101E40000000000000000000000000000000000092 :101E50000000000000000000000000000000000082 :101E60000000000000000000000000000000000072 :101E70000000000000000000000000000000000062 :101E80000000000000000000000000000000000052 :101E90000000000000000000000000000000000042 :101EA0000000000000000000000000000000000032 :101EB0000000000000000000000000000000000022 :101EC0000000000000000000000000000000000012 :101ED0000000000000000000000000000000000002 :101EE00000000000000000000000000000000000F2 :101EF00000000000000000000000000000000000E2 :101F000000000000000000000000000000000000D1 :101F100000000000000000000000000000000000C1 :101F200000000000000000000000000000000000B1 :101F300000000000000000000000000000000000A1 :101F40000000000000000000000000000000000091 :101F50000000000000000000000000000000000081 :101F60000000000000000000000000000000000071 :101F70000000000000000000000000000000000061 :101F80000000000000000000000000000000000051 :101F90000000000000000000000000000000000041 :101FA0000000000000000000000000000000000031 :101FB0000000000000000000000000000000000021 :101FC0000000000000000000000000000000000011 :101FD0000000000000000000000000000000000001 :101FE00000000000000000000000000000000000F1 :101FF00000000000000000000000000000000000E1 :08200000481F0000800026309B :10200800D40148D8E3B80001D553FE6A100030194E :102018007508F1D9D202F5480040F01F0008F01FFA :102028000008D503E06CF980EA1C0337F01F0005AF :10203800D8020000800032008000259880002B68BC :10204800800026D4EBCD40FC169518961492129B6E :10205800580AE08A003B0B893008F0091800C520AF :102068003009129A2FF9EA090708F4081800CFB1C5 :102078001232E08900493002EDBB0001C26133032E :10208800EDBB0000C2613004C0A85806C3806C09CB :10209800B28C6C082FF88D082FF52FF40B8C580C88 :1020A800CF515802E08A000F04975806C2406C09C5 :1020B800B2836C082FF88D0820175807FE99FFF790 :1020C8000404089CE3CD80FC3203EDBB0000CDC0C6 :1020D8005802FE9AFFDA04975806C1706C09B28359 :1020E8006C082FF88D0820175807FE99FFF70494FD :1020F8003002CD5B069CF01F0007CDFBF01F0005EA :10210800CCCB30091212CB9B069CF01F0002CECB21 :1021180080002680EBCD40FC203DFACEFFD81497F6 :102128007C037C1A10941892169E580BC4405809C8 :102138005F1858A75F091268C34130063008FB686A :10214800000B580EC430F4CC003AFAC9FFF5FC076E :102158000D0A16985898F1DCE9082D0812F8149E13 :10216800580ACF6112955806C0C10C970699089A6B :102178000A9B049CF01F001A0E0C2FDDE3CD80FC97 :102188005804C140EDB30001C1115802C230640ABD :1021980032D9B48964082FF8850820143017CE7B0B :1021A800580BCCC45C3E3016CCAB129532D83007F5 :1021B8000AF8CDDB109A3308BA9B0699BA881A9B9D :1021C800F01F00072FDDE3CD80FCFAC9FFF512955B :1021D800CCBB32DCF01F0003CE1B00008000204C7B :1021E80080002680D431201D189516971496178CD8 :1021F800580CE08000B43004325132D033033092AE :10220800E20C1800C1705805C6E06A09B28C6A0869 :102218002FF88B082FF42FF70F8C580CCF21580567 :10222800EBF91000F9B80100F3F81E00089C2FFD27 :10223800D8322FF70F8A580ACF30E20A1800C500A3 :10224800E00A1800F9BC0100F7B700FFF9BC00016B :10225800EFFA0800C0482FF7A1BC0F8AE60A180059 :10226800CFB0F4C80030E4081800E08B0063300BEE :10227800F60B0028F40800182FF7F0CB00300F8A6F :10228800F4C80030E4081800FE98FFF43738F00A64 :102298001800C2C03648F00A1800C3403708F00AD0 :1022A8001800C3E03788F00A1800C4503588F00ACF :1022B8001800C4903758F00A1800C4803638F00A5D :1022C8001800CAA16C08BA8830081899169ABA98E2 :1022D8001A9B0A9C2FC6F01F00231804C9DB325C26 :1022E8005805C941F01F0020C96B0D081899169AA6 :1022F8000A9C49EB5808F00B1710F01F001A180435 :10230800C8BB361916981AD930AA1ADC30196C0BC2 :102318000A9C2FC6F01F00162FED1804C7DB3619CC :10232800308A1AD916981ADA30096C0B310ACF1B81 :10233800300BCADB169836191AD9310A1ADC30095B :102348006C0BCE7B16983419CF8B361916981AD980 :1023580030AA1ADC30096C0BCDCB1894C61B0000D0 :102368008000204C80002680800034008000211CE2 :10237800D401189BFACAFFFC300CF01F0002D802E7 :10238800800021ECEBCD40E014951696A98CF01F47 :1023980000095805C0A03007F01F0007EC070B0C18 :1023A8002FF70E35FE9BFFFAF01F0004E3CD80E007 :1023B80080002E7C80002F3080002D14EBCD40E073 :1023C80014951696A98CF01F00095805C0A030076F :1023D800EC07070C2FF7F01F00060E35FE9BFFFADF :1023E800F01F0004E3CD80E080002D9C80002E20AB :1023F80080002CC8EBCD4040204D49BCF8E80008CF :10240800FAE90008F8EA0000498CFAEB0000304BC2 :10241800F01F00171A9BFE7C2800F01F00163009D9 :10242800FE7C2800129A129BF01F0013FE7C2800E5 :10243800F01F0012302CF01F00121A96204DECE805 :102448000008FAE90008ECEA0000E06CF980EA1CF0 :102458000337FAEB0000F01F000B2FCD2FCDE3CD93 :1024680080400000800034088000341880002C4030 :1024780080002874800028B480002A2480002C70F2 :1024880080002FF8EBCD40F8F01F0033F01F003329 :102498004B3CF01F0034F01F00343018F00C1800CB :1024A800C5204B2CF01F002FE06701004B0C3006B5 :1024B800F01F002C4AF40E95C088E2675A4C0C179E :1024C800E0470100EA0717B0E806000B0C9C0E9ADB :1024D8000E06F01F0029E2465A4BFE98FFF0E0670F :1024E80001004A6C3006F01F001F4A550E930E9AE1 :1024F8004A3B0C9CF01F0023E80600093008EA0854 :10250800070B138AF40B1800C1312FF82FF9103775 :10251800FE9BFFF70E06E2465A4BE08B0019E26776 :102528005A4C0C17E0470100E60717B0CE1BEC0821 :1025380000081ADA494C1ADB1AD8F01F000A2FDDF6 :10254800E3CF80F8491CF01F0007CAFB490CF01FB5 :102558000005CF7B80002008800023FC80028E6C61 :102568008000237880002FA480028E8480028E8CC5 :1025780080003420800023C480028EAC0000000854 :102588008000238C80028EC880028E7C80028EF4AC :10259800EBCD4040303AE06B1B00EA1B00B7FE7CF5 :1025A8000C00F01F001A30083019109B308AFE7C8E :1025B8000C0031061AD6F01F001630083019109B8F :1025C800129AFE7C0C00F01F0013300BFE7C0C00EE :1025D800F01F0011FE7C0C00F01F00103009FE7C7B :1025E8000C001AD9129B1AD91298129AF01F000CD3 :1025F800301CF01F000C302BFE7C0C00F01F000A72 :102608002FDDE3CD8040000080002B0C80002AB035 :1026180080002AD280002AEA80002AF880002A6AEC :1026280080002C8A80002B0248CD48D0E3B00001FE :10263800D55348C048C10230C06248C2A505A1248C :102648000230CFD348A048B10230C0623002300314 :10265800A1220230CFE3488F000100008000320041 :10266800000000080000000880028FC00000000879 :10267800000001E88000248CD401189BFE7C18001F :10268800F01F0002D802000080002742EBCD404036 :10269800203D30083049FB680008BA383088500CB3 :1026A8001696BAC8302BBAD9486CF01F00070C9A96 :1026B8001A9BFE7C1800F01F00052FDDE3CD80403B :1026C80080028F1C80002C40800027ACD401189B0E :1026D800E06CE100F01F0002D802000080002694A0 :1026E800D401F6081503A56B143BF9BE0810F00BCE :1026F80017B0F9BE0B08F6091601F20A0039F20BF9 :102708000D08109AF00B1603F6C80001E048FFFE0A :10271800E08B00147818E8690000E418FFF7E01867 :10272800FECF590EF9B9000010499919F1DAC00322 :10273800F7E811089988D80ADA0A58ABC0F0E069B6 :10274800270F7858EDB80001C051F1DBC00999781E :102758005EFD5809C1002019CF5BE069270F785842 :10276800EDB80001C04130D89978CEAB5809C030D7 :102778002019CF6B5EFEE1B80000EDB80010C0E094 :10278800D3033FF899387858D503300899189998A1 :1027980099A8EA69610C99095EFC3FF8993878585C :1027A800CF5BD703D421169714951896F01F002EE7 :1027B8005807C2000FC93048F0091800E088001B0C :1027C8003094E8091800E08B00160FD93078F0092A :1027D8001800E08B00108E39E0680101F00919003B :1027E800E08B0009EF3900083038F0091800E0885C :1027F8000003DA2A0A9A6E0B0C9CF01F001C581C66 :10280800CF900FC9E8091800C2906C182059F1E957 :1028180010688D18EF3900086C1A0FD8A978F1E9FB :1028280010E814488D1830288E39F0091900E0880E :1028380000106C18ADB88D188EB920298DA96C18A8 :10284800E018FFF08D183509300C8D09D8226C1866 :102858005C79F1E910C88D18CF3B6C18B1B88D18A8 :10286800CDAB00008000277E800026E8D401301818 :10287800F739000DF0091800E0880005302E1C9C7F :10288800D802E068008030199908300A7818F73BB8 :10289800000D149EF1D9D00130F9F1DBD081F1DAC5 :1028A800D0E1F1D9D20499181C9CD802EBCD408014 :1028B8003018149E1297F00A18005FBAF00B18002F :1028C8005FB91449C0B17818F1DBD021F1DED041ED :1028D800F1D7D3089918E3CF8080302CE3CD8080DE :1028E800D4017818189EEA18000F9918781CE21C71 :1028F8000004C08030E8F00B1800E0880013302C8A :10290800D8023038F00B1800FE9BFFFB7C1AF6C883 :10291800FFF03019F20809495CD914699D19D802E9 :102928007C19F6081510300CEA18FFF0E818FFFFBC :1029380012689D18D802E0692710C0485809C0E0FD :1029480020197848EDB80009CFA17818EA18000FC7 :102958009918FC19010099095EFD5EFFEBCD40FC5A :1029680030321893F73C000CE40C1800E08B000997 :10297800F735000B3014E8051800E0880005302C06 :10298800E3CD80FCF73E00083078F00E1800FE9882 :10299800FFF83108F00E1800FE9BFFF37618F009D7 :1029A8001601F4090009F2080D06ECCA0001E04A14 :1029B80000FEFE9BFFE65806CE35FCC90008F80865 :1029C8001601300AEC1C0001F5D8D001178EF5DC91 :1029D800D021F7380009F5D5D061F5D9D084F73979 :1029E800000AF5D6D108F5D8D208F5D9D308E80EEB :1029F8001800C0F0C0B33028F00E1800C0D0E40EA4 :102A08001800CBE187FAE3CF80FC87CAE3CF80FCCC :102A180087DAE3CF80FC87EAE3CF80FC3018990897 :102A28005EFCE0692710C0485809C0A02019784802 :102A3800EDB80001CFA1F1DBC01099385EFD5EFF53 :102A4800E0692710C0485809C0C020197848E21822 :102A58000201E0480201CF817828300CB6085EFCFC :102A68005EFFEBCD40E0FAC5FFF018976A166A0ED4 :102A7800EDD6C003FDDEC001300CF9D6D003F9DE77 :102A8800D0E1F9D6D103F9DED1E1F9DAD203F9DBE5 :102A9800D2E1F9D8D303F9D9D3E18F1C6F58EDB837 :102AA8000005CFD1E3CD80E0EBCD4040300E40268D :102AB8002F8BFDD8D021FDD9D104FDDAD204FDD663 :102AC800D306F80B092EE3CD80402F8BF5E91019BA :102AD800F3E81029F80B0328F1D9D043F80B09289B :102AE8005EFC2F8BF80B0328A1A8F80B09285EFCC5 :102AF8007958EDB80000CFD15EFC7808F1DBD00240 :102B080099085EFCEC5BBB9FE08B0018304B78A803 :102B1800F1DBD00399A878A9F3DAD10399A9780849 :102B2800A3A899087958EDB80007CFD178083019CB :102B3800F1D9D00299085EFCE068C6BFEA18002DFA :102B4800103BE088000CE0681200EA18007A103B9D :102B5800F9BB0306F9BB0207CDBB305BCD9BC008B0 :102B6800EBCD40C048E8E3B8000148E9300C7206F4 :102B780048DE48E9FE770800720B580BC070721ADD :102B8800300814AE2FF81638CFD3EE0C09262F894B :102B98002FFC594CCF21E3CD80C0000080003200CB :102BA8008000333C80002B6680028F20E068008321 :102BB800FE790800F00C010CF20C032AF4C8FFC0DF :102BC800F208032C580C5E0CF80812004859F0085B :102BD800111FF20A0039721AF408032C5EFC000077 :102BE80080028F20F8081605F0091508E029F00082 :102BF800581BC150C0823018F00C094C936C93AC30 :102C0800932C5EFD582BC110583BC0205EFF301836 :102C1800F00C094C935C939C932C5EFDF60C094CCC :102C2800935C93AC932C5EFD3018F00C094C936CBC :102C3800939C932C5EFDD703D42118961694580BB9 :102C4800C0F030050A970D9B0D8C2FF72FE6F01F6B :102C5800000618450E34FE9BFFF80A9CD8221695EC :102C6800CFDB000080002BEC3018F00C0948A59C45 :102C7800A96CE02CF000F9480054F9480044991870 :102C88005EFCFE6914007208F1DCD0C193085EFC9A :102C9800D401580BC091F8CBFFFEFE7C28005C5B8A :102CA800F01F0006D802F8CBFFFEFE7C28005C5B14 :102CB800F01F0003D80200008000293E800028E8A9 :102CC800EBCD408048E76E0CF1DCC008C0D0300B7B :102CD800FE7C2800F01F000B6E08F0CCFFFF8F0C65 :102CE800F1DCC008CF51F9DCC288300BF01F0006B8 :102CF80030194868B089E3CD80800000000001E009 :102D080080002A2A80002C98000001E4D401486839 :102D1800300B700CF9DCC288F01F000430094848F9 :102D2800B089D802000001E080002C98000001E47E :102D3800EBCD40C0201D301B49366C0CF9DCC28835 :102D4800F01F0012E06B00D7FE7C2800F01F001077 :102D5800FAC7FFFEE06B00FFFE7C2800F01F000CA6 :102D68000E9BFE7C2800F01F000B9A98EDB8000718 :102D7800CF216C0C300BF9DCC288F01F00042FFD4A :102D8800E3CD80C0000001E080002C9880002A2A52 :102D980080002A48EBCD40C0201D49B6A96C8D0C97 :102DA80049A730080F89F0091800C030F01F001833 :102DB80030086C0CAE88F9DCC288301BF01F001597 :102DC800E06B0082FE7C2800F01F00136C08F7D827 :102DD800C008F1D8C10CFAC6FFFCF7E8109BFE7CCE :102DE80028000CDBB18BF01F000C0DABFE7C28001B :102DF800F01F00090DBBFE7C2800F01F00072FFD07 :102E0800E3CF90C0000001E0000001E480002D380D :102E180080002C9880002A2AEBCD40E049151896AE :102E28000B893008F0091800C16148F70C9BFE7C3B :102E38002800F01F000E6E08F0CCFFFF8F0CF7DCA7 :102E4800C008C071F9DCC288F01F00093018AA88D0 :102E5800E3CF90E048476E0CA98CF01F0006CE7BAC :102E6800000001E4000001E080002A2A80002C987C :102E780080002D9CEBCD40C0201D4A76A96C8D0C9E :102E88004A6730080F89F0091800C030F01F002485 :102E980030086C0CAE88F9DCC288301BF01F0021AA :102EA800E06B00D2FE7C2800F01F001F6C08F7D8EA :102EB800C008F1D8C10CFAC6FFFCF7E8109BFE7CED :102EC80028000CDBB18BF01F00180DABFE7C28002E :102ED800F01F00150DBBFE7C2800F01F0013E06BEF :102EE80000FFFE7C2800F01F0010E06B00FFFE7C56 :102EF8002800F01F000DE06B00FFFE7C2800F01F8B :102F0800000AE06B00FFFE7C2800F01F00072FFD81 :102F1800E3CF90C0000001E0000001E480002D38FC :102F280080002C9880002A2AEBCD40C0201D4966DD :102F380030090D88F2081800C1F14947E06B00FF1D :102F4800FE7C2800F01F0012FACBFFFEFE7C280052 :102F5800F01F00106E08F0CCFFFF8F0CF7DCC008E4 :102F6800C071F9DCC288F01F000C3018AC881BBC9B :102F78002FFDE3CD80C04857AC896E0CA98CF01F9B :102F88000007CDDB000001E4000001E080002A2AF0 :102F980080002A4880002C9880002E7CEBCD404091 :102FA800201D3008FAC6FFFC301B0CE8300CF01F5F :102FB800000EE06B00D7FE7C2800F01F000CE06BD1 :102FC80000FFFE7C2800F01F00090C9BFE7C2800F7 :102FD800F01F0007300B169CF01F00032FFDE3CFF6 :102FE8009040000080002C9880002A2A80002A48FF :102FF800EBCD40E03028FAC7FFF01896AE88109560 :10300800C028AE880C9A0E9BFE7C2800F01F000892 :10301800C0C10F882FF85C58EA081800FE98FFF323 :103028004848B08CE3CF90E0E3CF80E0800029648B :04303800000001E4AF :10320000C0080000C0080000C0080000C00800009E :10321000C0080000C0080000C0080000C00800008E :10322000C0080000C0080000C0080000C00800007E :10323000C0080000C0080000C0080000C00800006E :10324000C0080000C00800000000000000000000EE :10325000C0080000000000000000000000000000A6 :10326000C008000000000000000000000000000096 :10327000C008000000000000000000000000000086 :10328000000000000000000000000000000000003E :10329000000000000000000000000000000000002E :1032A000000000000000000000000000000000001E :1032B000000000000000000000000000000000000E :1032C00000000000000000000000000000000000FE :1032D00000000000000000000000000000000000EE :1032E00000000000000000000000000000000000DE :1032F00000000000000000000000000000000000CE :10330000C0080000300CF01F0012580CF80F171006 :10331000D603301CF01F000E580CF80F1710D60300 :10332000302CF01F000B580CF80F1710D603303C50 :10333000F01F0007580CF80F1710D6030000010407 :103340004000011280000120C000012E80002BB43B :10335000000000000000000000000000000000006D :10336000000000000000000000000000000000005D :10337000000000000000000000000000000000004D :10338000000000000000000000000000000000003D :10339000000000000000000000000000000000002D :1033A000000000000000000000000000000000001D :1033B000000000000000000000000000000000000D :1033C00000000000000000000000000000000000FD :1033D00000000000000000000000000000000000ED :1033E00000000000000000000000000000000000DD :1033F00000000000000000000000000000000000CD :10340000286E756C6C2900000200000000B71B00DC :1034100008000001000100000F011101100113015B :103420001061040000000000300000001061040082 :103430003861040000000000020000002061040068 :10344000306104000000000004000000306104004E :1034500000000000000000000000000010610400F7 :103460003C0000000000EEEEEEEE18F09FE518F0D4 :103470009FE518F09FE518F09FE50000A0E118F027 :103480009FE518F09FE544000000B4080000B40870 :103490000000B4080000B408000000000000E408C8 :1034A00000003C003C00000000090000000000009B :1034B00000000FE11F00C0E3130080E3C00080E3C1 :1034C00000F02FE11CF09FE53D0200EB5A0200EBFB :1034D0008D0200EB01008FE210FF2FE141F0DEFBD7 :1034E00001F0DCFD3C0078000000FEE700005C001D :1034F00000007847C046010000EA7847C046170040 :1035000000EA8C119FE5002091E500300FE1841165 :103510009FE5FD20A1E880019FE580219FE5012036 :1035200042E00D0040E03C00B4000000020050E129 :10353000280000AA68019FE50D0050E1020000BAD2 :10354000042010E4042081E4FAFFFFEA58119FE50B :1035500058019FE5000081E53C119FE550019FE582 :10356000000081E51EFF2FE13C00F0000000481143 :103570009FE5000091E524119FE5000081E52C11F5 :103580009FE538019FE5000081E51EFF2FE17402F1 :1035900000EB10019FE528119FE5042091E4042031 :1035A00000E404219FE5020051E13C002C010000F1 :1035B000FAFFFF1AF0109FE5FD20B1E803F02FE1BC :1035C000E0109FE5002081E5E8109FE5F4209FE5ED :1035D000002081E5021080E2000020E0010040E2CE :1035E00011FF2FE101008FE210FF2FE13C00680185 :1035F000000001F09CF87847000001008FE210FF06 :103600002FE101F094F87847000003002DE9001045 :103610000FE1001080E5B8109FE5041080E5001070 :10362000A0E1100080E2FC1FA0E80020A0E13C0027 :10363000A40100000130A0E10300BDE8080083E51B :103640000C1083E5D300A0E300F021E10060A2E8C4 :1036500000104FE1041082E4D200A0E300F021E169 :103660000060A2E800104FE1041082E4D100A0E362 :103670003C00E001000000F021E1007FA2E8001022 :103680004FE1041082E4D700A0E300F021E10060E4 :10369000A2E800104FE1041082E4DB00A0E300F098 :1036A00021E10060A2E800104FE1001082E5000077 :1036B00093E53C001C02000000F02FE11EFF2FE10B :1036C000200000000403000020EE0100D8030000E9 :1036D0000000000018F09FE5100100000803000042 :1036E000EEEEEEEE2403000020020000B0B5041C54 :1036F000631C0B4D3C005802000001D16C6910E0C6 :1037000000F06CFB0948FFF70CFFEC60084A5168B9 :1037100050688842FCD00220287001218A2001F0E4 :1037200012F8201CB0BD3000070051020000000359 :103730000700B0B5051C3C0094020000002400F016 :1037400050FB1448FFF7F0FE13491448C1600121F3 :10375000134A490391601349CA7808239A43CA70EF :10376000CA7804231A43CA706B1C0DD00E4B5A68DA :1037700059689142FCD0BE213C00D0020000197370 :10378000197A112291431972197AC907FCD40221BE :103790000170FFF7D0FE201CB0BD91020000FFFFBA :1037A000FF003000070000100700000007000003C2 :1037B000070000000000000000003C000C030000B7 :1037C00000000000000000000000000000000000F9 :1037D00000000000000000000000000000000000E9 :1037E00000000000000000000000000000000000D9 :1037F0000000000000000000000000003C00480342 :1038000000000000000000000000000000000000B8 :1038100000000000000000000000000000000000A8 :103820000000000000000000000000000000000098 :1038300000000000000000000000000000003C004C :1038400084030000000000000000000000000000F1 :103850000000000000000000000000000000000068 :103860000000000000000000000000000000000058 :103870000000000000000000000000000000000048 :103880003C00C00300000000000000000000000039 :1038900000000000000000000000000000000047E1 :1038A000084710471847204728473047384710B582 :1038B000041C101C00F023F903C410BC08BC1847FA :1038C00000003C00FC03000010B4042A0ED3031CCB :1038D0000B439B070AD108C810C9A34202D1043A7E :1038E000042AF8D2A34201D004380439002A02D1B4 :1038F000002010BC7047D30701D5013205E00378E2 :103900000C7801313C00380400000130A34207D19B :1039100003780C7801310130A34201D1023AF1D190 :10392000181BE9E70000784700000020A0E304002E :1039300051E30800003A03C010E20D00000A04C081 :103940006CE202005CE33C00740400000120C0E46F :103950000120C0A40120C0C40C1041E0060000EA10 :1039600081CFB0E10120C0240120C0240120C04447 :103970001EFF2FE1784700000020A0E300402DE962 :103980000230A0E102C0A0E13C00B004000002E06F :10399000A0E1201051E20C50A0280C50A0282010CB :1039A0005122FBFFFF2A011EB0E10C50A0280C00A1 :1039B000A0480040BDE80111B0E1042080241EFFB2 :1039C0002F010120C0440120C0443C00EC04000051 :1039D000400411E30120C0141EFF2FE178470000CE :1039E000030052E33E00009A03C010E20800000A00 :1039F0000130D1E402005CE30C2082E001C0D194EC :103A00000130C0E40130D134042042E23C002805FA :103A1000000001C0C0940130C034033011E21E0028 :103A2000000A042052E22F00003A03C031E70200EE :103A300053E30800000A0F00008A2C34A0E104C000 :103A4000B1E5042052E20C3C83E1043080E43C0008 :103A500064050000F9FFFF2A011081E2230000EA5B :103A60002C38A0E104C0B1E5042052E20C3883E117 :103A7000043080E4F9FFFF2A021081E21B0000EA13 :103A80002C3CA0E104C0B1E5042052E20C3483E1F7 :103A90003C00A0050000043080E4F9FFFF2A031079 :103AA00081E2130000EA7847000010402DE9202051 :103AB00052E20500003A1850B1281850A0281850BA :103AC000B1281850A02820205222F9FFFF2A02CE48 :103AD000B0E13C00DC0500001850B1281850A028C7 :103AE0001800B1481800A0481040BDE802CFB0E16E :103AF00004309124043080241EFF2F01822FB0E176 :103B00000120D1440130D12401C0D1240120C0447E :103B10000130C0243C001806000001C0C0241EFF74 :103B20002FE178470000FF3001E20210A0E10324FA :103B300083E1022882E188FFFFEA784700008024C1 :103B400010E200006042413032E000106122A1C169 :103B500070E02000003A3C005406000021C470E0F0 :103B60000F00003A0004A0E1FF2482E321C270E0CC :103B70001700003A21C470E00900003A0004A0E1F7 :103B8000FF2882E321C470E00004A021FF2C8223DF :103B900021C270E00E00003A3C009006000000C018 :103BA00070E28300002A2004A021A1C370E08013EA :103BB00041200220A2E021C370E000134120022036 :103BC000A2E0A1C270E0801241200220A2E021C246 :103BD00070E0001241200220A2E03C00CC06000070 :103BE000A1C170E0801141200220A2E021C170E05B :103BF000001141200220A2E0A1C070E0801041200D :103C00000220A2E001C070E0001041200220B2E0DA :103C1000E5FFFF2AC30F32E0A30F80E03C00080756 :103C20000000001061221EFF2FE1784700000020F5 :103C3000A0E3A1C170E02000003A21C470E00F00B1 :103C4000003A0004A0E1FF2482E321C270E01700E3 :103C5000003A21C470E00900003A0004A0E13C00F1 :103C600044070000FF2882E321C470E00004A02183 :103C7000FF2C822321C270E00E00003A00C070E2E7 :103C80005000002A2004A021A1C370E0801341202D :103C90000220A2E021C370E0001341200220A2E034 :103CA0003C0080070000A1C270E080124120022089 :103CB000A2E021C270E0001241200220A2E0A1C1D6 :103CC00070E0801141200220A2E021C170E00011CB :103CD00041200220A2E0A1C070E08010412002201B :103CE000A2E03C00BC07000001C070E000104120D1 :103CF0000220B2E0E5FFFF2A0200A0E11EFF2FE153 :103D0000784700000A1040E2200140E0200280E0F5 :103D1000200480E0200880E0A001A0E1002180E0F4 :103D2000821051E03C00F8070000010080520A10A8 :103D300081421EFF2FE130B4441C810708D0017876 :103D40000130002902D1001B30BC70478107F6D139 :103D50000B4AD50102C88B1A8B432B40FAD0001BAB :103D60000A0601D103383C0034080000EFE70A04DA :103D7000120E01D10238EAE70902090EE7D1013833 :103D8000E5E7000001010101F0B4031C041C0C4331 :103D9000A4070CD1104DEF0102E00431043A10C326 :103DA000042A04D30C68661B3C0070080000A6437C :103DB0003E40F5D0002A07D00C7801311C70013349 :103DC000002C03D0013AF7D1F0BC7047012AFBD98F :103DD000511E00221A7001330139FBD1F4E70101B1 :103DE0000101784700000200A0E33C00AC0800009D :103DF0000210A0E32EFEFFEA1F402DE900000FE1B4 :103E0000C00080E300F02FE18100A0E30210A0E3F6 :103E100001208FE212FF2FE100F0E6FC784700005E :103E20001F40BDE8FEFFFFEA1F502DE93C00E808F7 :103E3000000001008FE210FF2FE100F040FB784707 :103E400000001F50BDE804F05EE21F502DE90100A4 :103E50008FE210FF2FE100F018FB784700001F50A1 :103E6000BDE804F05EE200BD01B500A000473C00E3 :103E70002409000000300FE1C030C3E303F021E16A :103E800001008FE210FF2FE101BD01B500A0004746 :103E900000300FE1C03083E303F021E101008FE245 :103EA00010FF2FE101BD000018009FE5041090E411 :103EB0003C0060090000000051E30200000A0420F9 :103EC00090E4002081E5F9FFFFEA0EF0A0E17C0913 :103ED0000000000000004400000044000000D8037F :103EE0000000D8030000D80300000000000000001C :103EF00000003C009C090000440000004400000059 :103F0000440000000080010000800100108E0100CC :103F1000108E010088F8010001000000001004006C :103F2000C433040000000400000000000E50A0E1B3 :103F300058409FE53C00D8090000040094E40100CB :103F400050E305F0A001041094E4042094E403007D :103F500000EB040094E4041094E4070000EBF5FF88 :103F6000FFEA010050E10EF0A001020051E104302F :103F70009014043081143C00140A0000FBFFFF1A67 :103F80000EF0A0E114209FE5002092E5010050E131 :103F900004208014FCFFFF1A0EF0A0E1800900004D :103FA000CC0900000008000020E60100130000001A :103FB0005356435F000400003C00500A000020EE0E :103FC0000100120000004952515F0002000020F27F :103FD0000100110000004649515F8000000020F4FC :103FE0000100170000004142545F00000000A0F4EF :103FF00001001B000000554E445F3C008C0A00008D :1040000000000000A0F401001F0000005553525FA3 :10401000010000000E50A0E100600FE18C409FE520 :10402000041094E4010051E30900000A040094E440 :10403000011080E00310C1E3042094E43C00C80AAE :104040000000C02082E302F02FE104D041E204200E :1040500094E4130000EBF2FFFFEA06F02FE105F015 :10406000A0E10E50A0E100600FE144409FE5041084 :1040700094E4010051E30800000A040094E43C00C9 :10408000040B0000011080E00310C1E3042094E45D :10409000C02082E302F02FE104D041E2042094E446 :1040A000F3FFFFEA06F02FE105F0A0E1010050E187 :1040B00004208014FCFFFF1A0EF0A0E13C0A00006F :1040C0003C00400B00000160C046C046C04670473F :1040D0000000101E10EE020011E3FCFFFF1A100E8C :1040E00001EE101E10EE020011E3FCFFFF1A1EFF8E :1040F0002FE1101E10EE010011E30300000A101E54 :1041000011EE3C007C0B0000001080E50100A0E3F4 :104110001EFF2FE1000020E01EFF2FE18D46974695 :104120007847C04678FDFFEA10B5041C032801D982 :1041300000F0ACFB0C484068002800D003240B487A :10414000016809483C00B80B00001230002905D076 :1041500006216143405CC300181804E00621614356 :10416000405C142358430A300006000E10BDD47A78 :104170000100A869010080B5094A0949032000F03F :10418000F2F9084908203C00F40B00000860486080 :1041900007491D2001F0B2FC06491E2001F0AEFCCB :1041A00080BD0000006C01003127000000100700F6 :1041B0002925000031250000054980B508208860C8 :1041C0001D2001F0BFFC1E203C00300C000001F05F :1041D000BCFC80BD000000100700021C081CD12A96 :1041E00080B501D105F019FC80BD034980B50020E0 :1041F0000880052005F0D5FB80BDB074010080B5B6 :10420000542801D106F0CDF880BD3C006C0C0000B4 :10421000B0B5104D021C0124012A0D48296806D0B2 :10422000C42A03D16A68002A05D0AC60B0BD0EF084 :1042300089FB6C6008E00022AA606C600EF082FBD3 :104240000021042012F0C8FC06F0D8F83C00A80CAD :104250000000B0BD0000C4600100BC740100054A4C :104260005169081A116909681031814201D85061F9 :104270007047002070478C6E010001494968401A60 :1042800070478C6E010001484069704700003C0097 :10429000E40C00008C6E0100024A5169081850615C :1042A000704700008C6E01000E490F4810B51922AE :1042B000920141608918C1600B4900220C310160F4 :1042C0000A49826009680123DB03C918084C41616F :1042D0003C00200D00002168002902D0074901613F :1042E00001E000F00CF8226010BD44DC01008C6E8F :1042F0000100C809000034580100C4090000014849 :10430000024908617047C80900008C6E0100082846 :1043100005D23C005C0D0000034B8000195002499F :1043200020310A5070470000646D010070B5061C12 :104330000D480D1C0068141C002803D1201C00F03F :1043400009FC70BD280601D500F022FE221C291CA4 :10435000301C08F03C00980D0000DDFD011C0348F6 :1043600054304369321CFFF71BFB70BD0000506DD9 :104370000100F8B5061C0D481F1C0068151C0C1C1C :10438000002802D1281C00F0E8FB200601D500F02F :1043900002FE2A1C211C3C00D40D0000301C08F039 :1043A000BDFD011C0348543043693A1CFFF7FBFA7A :1043B000F8BD0000506D0100F8B5F1284ED12A4833 :1043C00069468269FFF7EEFA274900265439C86822 :1043D0008B68C2000130D5183C00100E0000072881 :1043E000C86000D1CE6022486C680068002803D005 :1043F0000021201C08F03BFB6E6025682089A9780D :104400000239401AE978401A2081A8782818023821 :1044100020606E782878082817D23C004C0E0000E7 :10442000300607D5271C201C00F07AFC041C381C21 :1044300000F09CFB28780F49403980000A58002A78 :1044400004D0311C201CFFF7B3FA08E0052100E07E :104450000421062000F010FA201C00F03C00880E19 :10446000000087FB300601D500F0A1FDF8BD012159 :10447000062000F004FAF9E70000A46D0100CC5C0E :104480000100F8B51A4D194F01245435291C032099 :104490007C60174B184A05F0F4FB002802D03C0062 :1044A000C40E0000002038601FE03C600721281C7B :1044B000EA69FFF783FA382000F080FC0024B86036 :1044C000B868E60035186846022100F075FB2860E0 :1044D000281C00F0A5FDB868815906485430026ACE :1044E0003C00000F0000FFF76CFA0134072CEADBF8 :1044F0000020F8603861F8BD0000506D0100819A1D :104500000000619A0000054880B50068002805D0C9 :1045100003485430426A0021FFF753FA80BD506DC2 :1045200001003C003C0F00007047000070B50A4ECF :10453000094D084C083EA169002907D03068416048 :10454000007B81006958FFF73EFAF4E70349022037 :10455000087070BD00100700E07E01000002070037 :1045600070B50A4E3C00780F0000094D084C083E1B :10457000E169002907D070684160007B81006958BB :10458000FFF724FAF4E703490220087070BD001019 :104590000700E07E010000020700B0B5094D041CD1 :1045A000281C202240303C00B40F00000549FFF7D2 :1045B0009FFAE068E86020692861A06AA8626068E4 :1045C0006860B0BD7052010000100700F8B500240B :1045D0000023202801DB012407E0084E8000355825 :1045E000074FBD4200D02B1C3C00F00F00003150A3 :1045F0001360002C03D0211C822000F052F9201CF3 :10460000F8BDE07E010075750000B0B50B4D041CCF :10461000286800280FD0201C12F0B7FD00280AD00F :10462000217A287A0A070007000F3C002C100000AE :10463000120F9042297201D00120B0BD0020B0BD00 :1046400070780100F0B5424E051C306885B0002836 :1046500063D000240020002D06D06978182903D1EA :10466000E979012900D10120002845D03C006810DB :1046700000000020B07281004A19937A5906890F10 :10468000DB0604D5B37A01278F403B43B372D27A5D :1046900013091207120F934205D301228A401443D3 :1046A00001AA8900505001300428E4DBB07A3C00B4 :1046B000A4100000204001070DD5410709D5C1070E :1046C00005D5810701D5002405E0029902E0019992 :1046D00000E003990491410709D5C10705D5810779 :1046E00001D5002403E0029900E001990391C1077C :1046F0003C00E010000005D5810701D5002401E051 :1047000002990191800701D5002422E00F2C20D1CD :10471000706800280BD0049A02AB00920ACB019A71 :10472000281C0BF08AFB0020706010E017E0307A44 :10473000297A3C001C11000000070907090F000F2F :10474000884207D0049A02AB00920ACB019A281C37 :104750000BF076FB287A307201200F2C00D000205D :1047600005B0F0BD0120FBE7707801000D4A70B57F :10477000116800203C005811000000290ED0117A69 :1047800009060BD5537A947A032101252A1C8A4005 :104790001E1C164003D0224001D1012070BDFF3104 :1047A00009060916F2D570BD00007078010010B539 :1047B000084C206800283C009411000004D0606878 :1047C000002801D10BF0C0FB00200021002207C40B :1047D0000C3C0120606010BD70780100014901208F :1047E0000860704770780100F8B50E4D041C002079 :1047F0006872201C12F0DEFC3C00D0110000002882 :1048000012D00020032101220F1A161C237ABE4069 :10481000334004D06B7A161C864033436B720130F0 :104820000006000E0328EFD9F8BD70780100920051 :1048300051188A7A1207120F02703C000C12000005 :10484000CA7A1207120F4270CA7A12098270097B63 :1048500081807047034A0F21527A0120914300D092 :10486000002070477078010040070549400F054A55 :104870000956527A01200A4000D100203C0048121B :104880000000704700005E46010070780100124A87 :1048900070B5537A947AFF20032101252A1C8A409F :1048A0001E1C164014D0224012D10806000E07D05C :1048B000012807D0022807D0032807D107203C0091 :1048C0008412000070BD032070BD012070BD052062 :1048D00070BDFF2070BDFF3109060916E1D570BD1E :1048E00070780100F8B5041C13480D1C816800297C :1048F00005D0017B002901D104734573F8BD0F4E2B :104900003C00C0120000311C20318A7900AB1A70C3 :10491000C97959704268002A07D020022843011C37 :104920000020FFF77EF8002804D12A1C211C00205B :1049300011F00FF800AB1888F084E2E70000885A05 :1049400001003C00FC1200000010070080B50121AE :104950008120FFF7CDFF80BD0149012088607047AD :10496000885A0100054980B500208860087B00282E :1049700002D0497BFFF7BCFF80BD0000885A0100D0 :10498000024A011C3C003813000050685160704717 :104990000000885A010010B50C1C07F064FA04618D :1049A000002010BD0000FFB50E1C1F1C382081B078 :1049B00000F03DFA1D49041C4869002801D14C61F2 :1049C00000E0046030013C0074130000009000041B :1049D000000C00F015FA051C0099FFF78BF8002079 :1049E000731E04E001014A1910326A5001309842E6 :1049F000F8D300012D503821201CFFF77BF8A5606B :104A00006560E6850C2060863C00B0130000AF2096 :104A10008001E0610E20E086002020600198E060C7 :104A2000386860610399044808600448386005B03C :104A30000020F0BD0000FC5A0100DD150100FD164C :104A40000100021C081CF02A80B53C00EC13000099 :104A500004D0F12A07D106F009FB80BD07F00CFA5B :104A60000DF0A8FA80BD01210220FFF74DFF80BDA7 :104A70000149002048617047FC5A0100002802D01B :104A8000002900D0C1607047F8B5171C3C002814FD :104A900000000E1C051C1C1C1C3007F0C8F8016926 :104AA000426980688919891A814206D2231C3A1CFE :104AB000311C281C00F005F8F8BD0020386020608B :104AC000FAE7FFB585B0059801270E1C1C303C00A5 :104AD0006414000007F0AEF8041C808804300390D2 :104AE0002C48049080790290A069B04217D2351A00 :104AF00011E00398FFF716FC002806D101218E2053 :104B0000FFF708FF0025002705E02168016020600D :104B10003C00A0140000A0690130A061013DEBD26F :104B2000002F35D0A069801BA06120698019206109 :104B30006169401AE168884203D907218E20FFF796 :104B4000ECFE25682F1C701E019500E03F680138BF :104B5000FCD23C00DC140000386820600298049904 :104B600088712E682C60321D0092291C2031012290 :104B7000281D059B08F07AFCBD4201D0351CF0E7EA :104B800000203861019807990430086008980437BC :104B9000076009B03C0018150000F0BD02980499A8 :104BA0008871F9E700002010070038B5041C151CB7 :104BB00000200C6009E0E268201C0092A38A2168B2 :104BC000A26908F056FC201CE468002CF3D1286090 :104BD00038BD80B50CE03C0054150000C2688A4224 :104BE00008D10021C160002803D106218E20FFF7E3 :104BF0009DFE80BD101C0028F7D0EFE710B5041C07 :104C00000CD0A069002806D12069002803D006F046 :104C1000F7FD00202061201C3C009015000006F0EC :104C2000F2FD10BD000010B5002809D0C46803E0F3 :104C3000FFF7E7FF201CF9E7002CF9D1FFF7E1FFB0 :104C400010BD011C002004E00A89C9681018000486 :104C5000000C0029F8D1704700003C00CC15000082 :104C600000E0081CC1680029FBD17047F8B5061C9C :104C70000C1C1C2000F068FA051C002E01D1002C31 :104C800002D1301C012103E0201C00F05DFA00215C :104C9000002200920A1C011C231C281C3C00081640 :104CA000000008F0F2FB281CF8BDB0B503329208F2 :104CB00092001404240C09191D1CC9180904090CBC :104CC000FFF7D7FF018902681219091B491B02600F :104CD0000181B0BD0000F8B50A4CA021201C3C00A9 :104CE00044160000FEF72AFF0020261CA036074DC0 :104CF00007E00C21414349190EC9271D0EC7203476 :104D00000130A642F5D1F8BDD05C0100C83F0100DA :104D1000F7B5C468061C0025002C82B023D020897A :104D20003C0080160000904220D3E168871A019170 :104D30000021E16003990020FFF7A1FF051C2089F5 :104D4000C01B20812A680399301C00F016F82089C6 :104D5000C01920810199201CFFF7B1FE211C281CDD :104D6000FFF73C00BC160000ADFE291C301CFFF70D :104D7000A9FE0120002D00D1002005B0F0BD0000EB :104D8000F7B5041C0E1C002001E0201C0C1CE1687F :104D90000029FAD12789B7420AD3B81B0004000CB6 :104DA000208121683C00F816000009180298321C86 :104DB000FEF7FBFEFEBDF11B0D042D0C002819D0E3 :104DC0000189A94216D3491B0904090C0181006815 :104DD000411802982A1CFEF7E8FE21680298721B0F :104DE0004019FEF7E2FE3C00341700002089C01B8A :104DF00020812068C0192060DFE703218E20FFF7A3 :104E0000ADFDDAE7F8B5041C002613E02189002087 :104E1000FFF73EFF051C228921680068FEF7C8FEE7 :104E2000002E01D12E1C03E03C0070170000291C4D :104E3000381CFFF750FEE4682F1C002CE9D1301C11 :104E4000F8BDB0B5041C0089401A050420682D0C7B :104E50004018291CFFF71FFF2189491B2181E168A8 :104E6000C160E060B0BD10B503303C00AC1700007D :104E7000094A810810683D24084B6401890009181B :104E80001B19994201D8116010BD0F218020FFF736 :104E90006BFD002010BD0000B4CF010014C801005C :104EA00010B511F061FF041C03D10D213C00E8177F :104EB00000008020FFF75BFD201C10BD0000B0B596 :104EC000011F0B680D480022834204D001321030CC :104ED000032AF9D301E0032A06D30924211C8020E8 :104EE000FFF745FD201CB0BD054B00249A793C001E :104EF0002418000085680D6081609A71F5E7000054 :104F00002057010020100700B0B50021104A0023EF :104F1000D468844204D201331032032BF8D301E069 :104F2000032B01D304210EE00A4CA37990680028DA :104F30003C006018000002D1A371032106E005685F :104F40009560A371002901D104C0B0BD8020FFF796 :104F500014FD0020B0BD2057010020100700A03034 :104F6000008A4007400F08280FD201A31B5C5B009A :104F70009F443C009C18000005030305070709092E :104F800001207047002070470220704703207047BF :104F900004207047B0B5104D6869002807D00E494D :104FA00000222C3103C90143032006F0CFFF0B4C34 :104FB000002203CC3C00D8180000083C0143032029 :104FC00006F0AFFF03CC084307494A6802434A6032 :104FD0008A681043886001206861B0BD0000647376 :104FE0000100B058010010000700B0B50C1C0FF014 :104FF000A8FA054DE86A3C0014190000002806D103 :10500000002C04D0201C0FF0B7FD01202870B0BD8B :10501000F46E0100054980B5886A002804DA002092 :10502000886201210DF042FD80BD0000AC7E0100D0 :10503000F8B51E4D041C00203C00501900006862A9 :10504000A8701C480078C00722D5B82003591A4818 :1050500000780E2809D10A1C803206D0184E0D2087 :10506000325C8A4201DD0138FAD1591E0B061B0E53 :10507000AB70AB620E280BD208E03C008C1900002C :105080006218B032127B824202D8581AA86202E03B :1050900001390029F4DA0EF035F9009000AB1878E8 :1050A0005978814200D95878ED30E8700121201CF0 :1050B0000DF002FDF8BD0000AC7E01003C00C819F7 :1050C00000001D75010011670100C75201000E4963 :1050D00010B508698B68C200D4186268002A0FD125 :1050E00001300861072801D100200861201C00F070 :1050F00024F8054821685430026AFEF7ECFC3C00B5 :10510000041A000010BD06210620FFF74BFC10BD5D :10511000506D010008490979C907084A08D400E020 :10512000081CC1680029FBD101890431018100E01C :105130000020D0627047000060800700046C01000E :105140003C00401A000010B5041C19218901002000 :10515000FFF7C5FD011C60602068FFF7E0FC606898 :1051600021680830086010BD00000A2801DA042018 :1051700004E0502801DA052000E00720044A1178F5 :1051800038233C007C1A0000C000184099430843B3 :105190001070704788000700B0B5051C07484068CC :1051A00008E00169A94204D1446805F0C7FD201C4C :1051B00000E040680028F4D1B0BD0000587501003F :1051C000F8B500253C00B81A000006F084FD114F28 :1051D000041CBE792068002807D1A0880430FFF79E :1051E000F2F8002806D101210FE001682160A169D1 :1051F0000139A16110C0051C20690130206161697D :10520000401AE16888423C00F41A000003D90721E3 :105210008E20FFF7D3FBBE71281CF8BD20100700BD :10522000B0B509F0BBFF2F4C0028207403D001213A :1052300001200AF071FC2B4D1435286800284DD050 :1052400001210F2011F082FD3C00301B0000288955 :1052500008F0FBFF011C01220F2011F040FDE07857 :105260000125022836D10AF0C6F800280AD00BF032 :1052700092FB1E490968401811F05FF8002801D11F :1052800002202FE0E078022824D13C006C1B0000B3 :1052900060702570606801281CD015481038817B2B :1052A000002904D185730F20134910F001FC08F088 :1052B0004FFE002807D00E4801219838006901F000 :1052C000B7FD002805D001200EF00CFD3C00A81B06 :1052D000000001200EF01DFCB0BD05F0DCFEB0BDED :1052E000E078002801D12570F7E7032000E00420D2 :1052F0000DF08DFAB0BD846601006C570100E90322 :10530000010070B5041C002100200A4D00E03C00A3 :10531000E41B00000131CB005A191679012E02D08E :105320005279A24202D00B29F4D370BD0B29FCD2D2 :10533000C80001215A192858117170BD3858010050 :10534000054880B5007F2423044958434018006A6B :105350003C00201C0000FEF7DAFB80BD0000D47981 :1053600001009446010080B504F037FF002011F0E1 :1053700084FC002080BDB0B5054C051C206BE16AA3 :1053800002F0E3FD291CA06A02F011FBB0BDA46C81 :1053900001003C005C1C0000B0B5031C081C141C80 :1053A000002B0C4D09D06969890001310A04120CE7 :1053B0002280291CFEF73EFC0AE0011C281C2288E2 :1053C000FEF738FC2088012802D98008013868617E :1053D0000120B0BD3C00981C0000206E0100F1B51A :1053E00000980026C168086809891C2934D3C1883F :1053F000FF23013399422FD10188C91A2CD141884A :10540000082929D10179062926D14179042923D1F6 :1054100000250024071C3C00D41C000018370BE0BA :10542000A000411804310422381CFEF78BFB002831 :1054300001D1012504E001340A494869A042EFD8AE :105440000849087800280AD0012801D0022806D18E :10545000002D04D10098C0683C00101D0000FFF72B :1054600042FC0126301CF8BD0000206E01000148FE :10547000406870470000206E01000249486001202A :10548000486170470000206E010070B5041C0126C1 :1054900003F0EFFA251C103500283C004C1D0000DD :1054A00004D00020207703F0F1FB07E003F038FD83 :1054B000002809D00120207703F0CEFC011C062231 :1054C000281CFEF7C3FB02E0022020770026301CD8 :1054D00070BD00000348807AC00703493C00881D66 :1054E0000000C00F88627047000040900700A46C65 :1054F00001000149012088627047A46C0100064840 :10550000807AC107064AC90F91622021800700D422 :105510000021A032117070470000409007003C004D :10552000C41D0000A46C0100074A1268074B9B6968 :105530001A4001D0012200E000220A600121002A65 :1055400000D000210160704710000700A46C01002A :10555000012202600A607047B0B50D1C011C583171 :105560003C00001E0000041C0622281DFEF777FBED :10557000211C5E310622281C0A30FEF770FB211C1C :1055800064310622281C1030FEF769FBB0BDFEB561 :1055900000251D72171C0E1CB26D0021921950328D :1055A000D27A3C003C1E00001C1C5A720078321C4F :1055B0008032C007C017013001900898029200287D :1055C00001D1307F2BE037480068002800DD011C46 :1055D0000198002802D00898012810D1029A906BF7 :1055E000002806D03C00781E0000884201D9451AE8 :1055F000013D7019B03003E0B56D013D70195030B8 :10560000007B0FE0029A106A002807D0884201D977 :10561000451A013D7019A030007903E0BD69013DD4 :105620007819007FA0723C00B41E00000EF00CF848 :105630000E2811D1A07A08F067FF00280CD07868F6 :10564000002805D11B480025007808F04BFF02E038 :10565000451E7819007AA072029A5069002817D066 :105660000898012814D0A07A3C00F01E000008F031 :105670004EFF00280FD00198002807D0022020728A :10568000706C80194030C079607204E07D68013D23 :105690007819007AA072029AA07A916908F051FFF5 :1056A0002060029A607A916908F03C002C1F00008B :1056B0004BFF6060A07AE0722573FEBDD47E0100CE :1056C000905701000006000E002A8CB501D08A22F6 :1056D00000E0882200AB1A800CF0C2F80190684606 :1056E0000BF0BCFA8CBD0000011C08483C00681F90 :1056F000000080B50068002809D049680220002910 :1057000000D101200106090E002006F0D8FF80BD5F :105710000000206701001CB50190041C443001AA60 :10572000694611F0B8FD00280BD0A06900213C00AB :10573000A41F0000C207D20F0220FFF7C9FF0021FB :10574000201C0FF0D9FE1CBD04219820FFF772F930 :10575000F9E700008CB500AB84211980054B021CD1 :10576000181C998A0CF08EF8019068460BF07CFAB0 :105770003C00E01F00008CBD0000707C0100704701 :105780000000064980B5C96814234031897A044A6B :105790005943891880000858FEF7E9F980BD707CEC :1057A00001005447010080B50020FFF7D6FF80BDFF :1057B00000003C001C20000080B512481149808A7E :1057C0000A8B00210028C2B00CD1012A05D0022A80 :1057D00015D000AB5A800E2207E0022200AB5A809F :1057E000998004E000AB5A800D2200AB9A8000AB98 :1057F0001880FF203C00582000009871D97168463D :1058000000F0D1F942B080BD0000707C010010B5FD :1058100009F05FFC002005F02AF9034CE08A05F04E :1058200036F9201C0FF0B3FE10BD707C01001CB5D2 :1058300009F04FFC07203C009420000000AB074C0F :105840001880E18A201C0CF00BF8019068460BF0E0 :1058500017FA201C0FF09EFE1CBD0000707C01009A :1058600080B502219820FFF7F1F880BD10B5154CE6 :10587000C2B0A08A002803D03C00D020000001283C :105880001ED1022000E00120E168403188722069C9 :1058900008F023FD021C0C4818388088E1680FF0DE :1058A000A4FEA08A00AB18800120588000209880B8 :1058B000FF219971D871684600F03C000C2100006E :1058C0007BF942B010BD03219820FFF7C5F8F8E737 :1058D000707C01007047000080B503480FF060FE47 :1058E000002005F0CDF880BD707C010080B5024835 :1058F0000FF056FE80BD0000707C01003C00482186 :10590000000080B502219820FFF7A9F880BD80B57E :105910000320FFF734FF80BD0000F0B5214E0027C3 :10592000B18A301C002504240029008BC3B01ED18D :10593000012807D0311C498B022812D100293C00D4 :105940008421000007D1002405E000240125022065 :1059500000ABD8801F810FF07FFF002C10D1F168C1 :105960000520403188720EE000291AD100ABD880A2 :105970000E2002E000ABD8800D2000AB188107E0BC :105980003C00C0210000301C0FF013FE201CFFF76C :10599000FCFE002D08D0B08A00AB9880FF209872E2 :1059A000DF7201A800F011F943B0F0BD0000707C77 :1059B000010010B5002005F06CF8044CE08A05F0F9 :1059C00078F83C00FC2100000FF04CFF201C0FF089 :1059D000F3FD10BD707C010080B50420FFF7D8FEF8 :1059E00001480FF0E9FD80BD707C010080B5022008 :1059F000FFF7CEFE012005F05FF802480FF0DCFD56 :105A000080BD00003C0038220000707C010080B5A1 :105A10000320FFF7C0FE80BD0000B0B51D4DC2B031 :105A2000288B00ABFF21588099710021D971AA8A77 :105A30000024012A18D12A1C528B02280FD1002AD7 :105A400016D1032058803C007422000099802C1C41 :105A5000FF22981DE969FEF73BF9E1680420403117 :105A6000887210E0002A06D101240E2001E00124F2 :105A70000D2000AB9880281C0FF0A4FD0420FFF738 :105A80008DFE002C05D0A88A3C00B022000000AB9F :105A90001880684600F0A5F842B0B0BD0000707CE8 :105AA000010010B5002005F000F8034CE08A05F075 :105AB0000CF8201C0FF089FD10BD707C010080B532 :105AC0000420FFF76EFE01480FF03C00EC220000BE :105AD0007FFD80BD707C010080B50220FFF764FE71 :105AE000012004F0F5FF02480FF072FD80BD0000B8 :105AF000707C010080B50320FFF756FE80BD0000DA :105B0000B0B5194D0424A98A281C028B3C00282317 :105B10000000C2B0012914D1408B042A0BD1002807 :105B200000D100240FF0ADFE002C19D1E96805204A :105B30004031887217E0002810D100AB5A800E2047 :105B400002E000AB5A800D2000AB988019803C0029 :105B500064230000FF2098710020D871684600F08F :105B600049F842B0B0BD281C0FF038FD201CFFF7EB :105B700021FEF6E7707C010010B5002004F09EFFC6 :105B8000034CE08A04F0AAFF201C0FF027FD10BD93 :105B90003C00A0230000707C010080B50420FFF7CA :105BA0000CFE01480FF01DFD80BD707C010080B52A :105BB0000220FFF702FE012004F093FF02480FF0DD :105BC00010FD80BD0000707C0100B0B50A4D011CC5 :105BD00044313C00DC230000041C0622281CFEF794 :105BE00089F8EC60206903F097F8011C0622A818D8 :105BF000FEF780F80420FFF7F7FDB0BD707C0100D0 :105C000090B5041C808893B0002806D01549062260 :105C1000488018313C0018240000881FFEF76DF8FA :105C200068460CF014F82088012808D16088032801 :105C300005D1A088002802D106200CA90870A079FF :105C40000621FF2804D0E079002801D0011C08318A :105C50000B2008AA50723C0054240000201C08F0BD :105C60003BFF039068460BF031F813B090BD000085 :105C7000587C0100074B1A78824201D0002907D0D6 :105C8000FF201870044801880122520391430180CB :105C9000704700004C7B01003C00902400003280E3 :105CA000070010B5041C0C2307495843401800791D :105CB0000AF04FF901200349A04008390A7810433F :105CC000087010BD0000747A0100034A00211154CD :105CD000800030321058017070473C00CC24000026 :105CE000E07A010010B5041C052801D3FEF712FF6D :105CF000201CFFF7EDFF0021201C0EF089FB10BDDA :105D0000054980B58860087F242304495843085812 :105D1000FDF76CFF80BD0000D47901003C00082530 :105D200000009446010080B501219120FEF7C7FED6 :105D300080BD024A11688143116070470000786E8F :105D4000010080B5FEF7E9FE80BD80B5FEF7E5FEF7 :105D500080BD80B500F031FA80BD034980B53C00BC :105D6000442500000420886000F0D0F980BD0000C8 :105D70000030070080B500F099FA80BD80B500F0D2 :105D800099FB80BD38B5202815D20D4C221C20323D :105D9000957900AB1D70D2795A700A4B82009950E8 :105DA0003C008025000001218140084801604268D4 :105DB0001143416000AB1888E08438BD0121FF2009 :105DC000FEF783FEF9E70010070030740100004081 :105DD0000700202809D20549064B82009950054A40 :105DE00051683C00BC250000012383409943516069 :105DF00070470000A97500003074010000400700E2 :105E0000024A11680843106070470000786E010074 :105E10000B48016803221204114301600168072244 :105E2000120691433C00F825000001225206891811 :105E300001600168120C11430160016852081143AE :105E400001607047000080000700FEB51C4E051C75 :105E5000B08AF26812D00124002909D1116D02AA7A :105E600001ABFEF7F8FE3C00342600000298002843 :105E700001D000240BE001AA02A9281CFEF770FF44 :105E800005E0116D02AA002401ABFEF701FF0E49E7 :105E9000081C2030827900AB1A70C07958703068C5 :105EA000002802D1029830603C007026000002E019 :105EB00002987268D060019800AB70601888C8843E :105EC000F068C06CF060201CFEBD247E0100001054 :105ED0000700F8B5041C54271D4E00203060706088 :105EE00067433804151C000CB1823C00AC2600004E :105EF000FFF796F8082130610026174A14E0031CCA :105F0000243342610361C661018308330360B12316 :105F10004360031C6433C3600C230381031C5433AC :105F20004C3028C0013C181C002CE8D13C00E8266D :105F30000000094E07223069D243C1195050021C9B :105F4000103280398A63F060B06000210020FFF7D2 :105F500088FF3069F060B060F8BD247E01009100D8 :105F600005000148406A70470000E87D01003C00E0 :105F7000242700000148008870470000FC6B0100E6 :105F8000064980B508880130088005490820086066 :105F900004498869886100F021F880BDFC6B01002C :105FA0000010070000300700034A0120121D06CA36 :105FB0003C0060270000914200D100207047E87D3E :105FC0000100064800B5C07C002803D1FFF7EFFFB1 :105FD000002801D0012000BD002000BD0000A080ED :105FE000070010B5041C800702D506F03EFD03E053 :105FF000E0073C009C27000001D506F0E3FD6007A8 :1060000001D5FEF7ABFD10BD024A011C10681160FE :1060100070470000E87D010038B5204D2C1C20346D :10602000A07900AB1870E0795870FEF727FA00AB42 :106030001888E8843C00D82700001A488178082294 :1060400091438170817811438170174841688022A3 :1060500091434160016811430160002001306428D0 :10606000FCD3A0790F4D00AB1870E079104C58703C :10607000201C103000F03C0014280000DFFB002042 :10608000C043A061FFF79CFF002809D00A490869B6 :106090000130086100203C318968486306F0EEFC5D :1060A00000AB1888E88438BD001007000000070026 :1060B000F4000700003007003C0050280000E87D95 :1060C00001000A4880B5006A002801D0FEF7C1F936 :1060D000074807493C30806810304861012008615A :1060E0000549086880229043086080BD0000E87D73 :1060F000010000300700F40007003C008C2800007D :1061000080B50CF0CBFE06F0BFFC80BD0149C86233 :1061100070470000E87D0100024A916A08439062DE :1061200070470000E87D01001823064958434018D5 :106130000021027903681A70013108303C00C82838 :1061400000000329F8D370470000285201000349DA :10615000002800D0011C024881627047000085754C :106160000000046C0100F8B5FFF733FF284F00284A :1061700004D0FFF7C8FF386A01303862F86A3C0083 :1061800004290000002802D0018904390181386BFC :106190000025002808D00B203D6310F0E5FA1E49C9 :1061A000086821229043086038783C211B4A41430B :1061B0008C18FF22796A3A7000290CD0B969013134 :1061C0003C0040290000B9617D62BD68002D04D00B :1061D000636B7A6B0021FDF747FDF8BD042803D3FC :1061E00001218420FEF7A1FC3869261C01303861AA :1061F00020363078022803D00C218420FEF795FC4D :1062000035703C007C290000A1690029E8D0636B4F :10621000303420780C1C00217A6BFDF727FDDFE776 :10622000046C0100F400070018DB010010B50B4CF2 :10623000606A00280ED00A4800F012FB002060625D :10624000A468002C3C00B829000005D07E23DB4365 :1062500000220121FDF70DFD10BDE0690130E06174 :1062600010BD046C010000300700094841683F225E :10627000120491430D2212048918416041680122E1 :106280005202914341603C00F429000003488178A8 :1062900081708178817070478000070000000700DE :1062A000F0B50125082400200E4A0F4900263C23A2 :1062B0004343D1529B185D719B605E611C82C02775 :1062C000DF602027FE549E613C00302A000030270A :1062D000FE54074F3F182037013005289F63E9D34C :1062E0000548FF3201329062F0BD18DB0100BEBAF2 :1062F000000030800700066C0100014948607047CB :106300000000046C01000549085C3C006C2A000098 :10631000054949684018C006C00E0449203048723B :1063200070470000A0570100046C010000800700C6 :1063300080B515218420FEF707FC80BDF8B54348E1 :1063400084680334424D04E0201C10F03C00A82A6D :106350000000B9F8002871D12869C007F7D53E4878 :1063600028603E4A141C2034207900903C233C498C :10637000584345182879FFF7CCFF281C3A490830C4 :1063800048600126081C0660686A00280DD03C00A1 :10639000E42A0000A96A926A354B9F68D71B1A68E5 :1063A000511879188A425A6800D800E0013206C0B4 :1063B000E86AFEF787FF2D49E86A4860301C0E60E6 :1063C00066791FE02B484661047F2949201C50391B :1063D0003C00202B0000896AFDF75AFC009884429B :1063E00010D03C202249604340188769002F09D013 :1063F0000021203001707E23DB4302210022201C7B :10640000FDF74CFC0120A0408643002EDDD1E96958 :1064100000293C005C2B000003D03020405DFDF7DC :106420003AFC164C503C606A002803D00A218420B4 :10643000FEF796FB20352878012803D00B21842015 :10644000FEF78EFB02202870E068013000E007E0D4 :10645000E06000983C00982B00002070009860706D :106460000A4800686063F8BD0000000107000040B2 :106470000700010000013080070018DB0100003038 :106480000700546C010000A00700786E01003C2258 :106490003C234A4309493C00D42B0000B0B55418B2 :1064A00058434518211C3822281CFDF7E5FCA06B39 :1064B0000078A96B0870002020342070B0BD000067 :1064C00018DB01003C230749584310B54418203419 :1064D0002078022803D10D213C00102C00008420DC :1064E000FEF747FB0020207010BD18DB0100FFB550 :1064F0003C2048431A4981B04418261C2036307885 :10650000151C0F9F022803D104218420FEF731FBC4 :106510000120307025710B9930223C004C2C00007A :1065200061800A99E1620D99A1610C99E1610E996E :106530006162A762019911557E21C9436163049983 :10654000002900D10020061C281C08F08BF8002828 :1065500001D0022000E00020A16B30433C00882CD9 :106560000000087005B0F0BD000018DB010080B528 :1065700014218420FEF703FB80BD0148407870475A :106580000000046C010002480069C007C00F70479A :10659000000000400700011C3C23044A59433C0012 :1065A000C42C00008918203109780120002900D06E :1065B0000020704718DB01000848406A00280AD113 :1065C000074A002120239B5C022B04D001313C327E :1065D0000529F7D37047012070470000046C0100C3 :1065E0003C00002D000018DB0100F8B50E1C041C57 :1065F000171CFEF782FE201C114C606001202060F9 :10660000104D686901306861686A002803D007216D :106610008420FEF7BAFAA068400703D5062184203B :10662000FEF73C003C2D0000B3FA08480069002842 :1066300003DAAA218420FEF7ABFA02206862AE607A :106640002F70F8BD00300700046C01000040070007 :10665000044A518010710348034908304860012002 :10666000086070473C00782D00003C6C0100003051 :1066700007000021002305E002894360C06851182B :106680000904090C0028F7D104310804000C7047F4 :106690000000024A516B0843506370470000046CCD :1066A000010038B50A4C3C00B42D0000221C2032F9 :1066B000957900AB1D70D2795A7003684068064A1C :1066C0005065054813655030816000AB1888E08440 :1066D00038BD000000100700046C010098B50D4C97 :1066E000201C2030817900AB3C00F02D0000197097 :1066F000C07958700A4800F0ECF809490020486257 :10670000FFF769FF002803D012218420FEF749FA21 :1067100000AB1888E08498BD00000010070000302E :106720000700046C01000348017A3C002C2E000095 :10673000FE2291430A310172704700000080070079 :1067400090B50E4C85B0A078022814D10320A0701B :106750000B4900200022049202900391E18801225B :1067600001920091617820782269E3683C00682EEC :10677000000008F094FD044809F07FF905B090BDD1 :106780000000B4790100ADB6000071B60000B0B5EC :106790000C4DAC790C490978002903D001290ED0A1 :1067A000022908D1C288002A09D0012381683C004F :1067B000A42E000002200FF0C1F803E00221862081 :1067C000FEF7F8F9AC71B0BD20100700A079010008 :1067D00080B5026807494A600379CA78CB700079AE :1067E000904206D003481430008907F027FE06F0D7 :1067F0003C00E02E0000ABFA80BD8466010070B55D :10680000164C154DA0780026983D012803D1286923 :1068100008F0FBFCA6706068012803D000212869FD :1068200000F0FFFB0E4829690CF031FA01200CF052 :10683000E4F83C001C2F0000E078012802D0012081 :10684000607000E06670064814304168012906D186 :106850000660416F002902D00020FDF74CFA70BDA0 :10686000846601003463010030B500220023012555 :106870002C1C94403C00582F0000044001D0CA5406 :10688000013301320E2AF6DB181C30BD0000FFB5C3 :1068900001270026051C022081B00090002D18D091 :1068A0002878FF2815D0002410E0281980780A994C :1068B000002901D001063C00942F000008D507F004 :1068C000E9FE0E2803D0012181400E4300E000279D :1068D00001346878A042EBDC0098029D01380090FA :1068E000DFD10398311C814302D003980640002772 :1068F0000498066005B0381C3C00D02F0000F0BDA5 :10690000000002210160642101E0013902D0026827 :106910009207FAD40120002900D10020704710B559 :106920000020C443054B022201015A50C9188C6053 :1069300001300828F8DB10BD00003C000C300000DE :1069400000300700F0B5051C6035C76A041C287BC1 :10695000002F8BB015D0082815D202A31B5C5B005A :106960009F4400000704040709090C0C01260021BC :1069700009E0002606E00226022104E03C0048303F :1069800000000326032101E0042601218C22125974 :1069900007912649069004910020039005970892DC :1069A000E0692269211C7031019121490090700039 :1069B0004018603002920388591C01801E483C0038 :1069C000843000000288A1680AA809F0E1FF606035 :1069D000E87AA16AC9070007000EC90D0843616A79 :1069E0002269C907890D01430120002A00D1002036 :1069F00080030843216AC9030843082108430A9910 :106A00003C00C03000000880201CFEF798FE206982 :106A1000002804D1201C0AF082F90BB0F0BD807967 :106A2000062801D9FEF70FF9206906498079800010 :106A30000958201CFDF774F9EFE7792F0100C469AC :106A400001003C00FC3000000861010074570100A7 :106A500010B5041C58308AB00EF07CFE221C803227 :106A60005168002901D0117A07E0002804D080691C :106A7000800701D5032100E00121D2680791224956 :106A8000002008923C003831000004910022059259 :106A900006900390E06922690090211C70311C4827 :106AA000019102920389591C01811A480288A16848 :106AB00009A809F076FF60606B20005DA16A226979 :106AC000C9070007000E3C0074310000C90D0143E6 :106AD0000120002A00D10020800308430999088082 :106AE000201CFEF735FE2069002804D1201C0AF086 :106AF0001FF90AB010BD8079062801D9FEF7ACF85D :106B000020690749807980003C00B03100000958B5 :106B1000201CFDF711F9EFE70000BD2F0100246AEA :106B2000010008610100745701003EB5051C0069B1 :106B3000042107F0D2FA002809D042780232011C61 :106B40006846FDF788F9E86A6C463C00EC310000C5 :106B5000029000E00024281C143002F003FB0028FF :106B600004D0211C281C05F0A5FE3EBD002CFCD045 :106B70000249201C4969FDF7E2F8F6E7447D01006F :106B800070B51E1C18235843064B049D3C00283248 :106B900000001950C418002060616260A660E560C2 :106BA0000FF0B9FD206170BD0000B87D0100024A00 :106BB000011C9069916170470000447D010001480B :106BC000406B70470000447D01000449044B3C00C9 :106BD00064320000CA6809695C3B5B68C91A4143BA :106BE00050187047A07D01000148007870470000F0 :106BF0007869010080B506220149FDF735F980BDAD :106C0000FE670100F0B589B00093164F131C0E1CEF :106C10003C00A0320000041C3A1C01F062FF01A9F4 :106C200006A8A26802F00BF901AA06A9381C636A3B :106C300002F081FC051C012814D10C48FC21C8512C :106C4000381C02F00CF80321301C07F052FA00281F :106C500007D03C00DC320000807800F033FC201CC0 :106C600010300EF047FD00E00025281C09B0F0BDF3 :106C7000F4670100C138000010B5074C0648062231 :106C8000211D0838FDF7F6F801F0FCFF00F042FC8A :106C9000201C02F03C001833000027FC10BDF467F4 :106CA00001000849C96800290AD0064A0132517812 :106CB00012784843002A01D108187047101870470D :106CC000013070470000447D0100044B0549002855 :106CD0005A6900D0011C3C0054330000101C59615B :106CE00070470000447D0100B9750000074900208D :106CF0000A78022A09D10A7C002A05D1CA68002A2A :106D000003D04969002900D001207047786901004B :106D10000C4A80B5012151603C009033000009F01D :106D20006AF809481C308169002907D00023836173 :106D300000220021002000F0D2F880BD00220021B6 :106D4000034800F05CF980BD00005C69010051352A :106D50000000B0B50C1C012816D13C00CC3300005B :106D60000E4D022C09D100F02BFA00280ED06869D4 :106D700000280BD1211C13200CE0032CFAD100F0C9 :106D8000F9F9002802D0287C0028F3D0B0BD211CDE :106D90000006000E04F062FCB0BD00003C000834A8 :106DA000000078690100B0B50C4C002525746561C0 :106DB000E56000F03CFA00F034FA07481C38056141 :106DC00009F033FF2078002802D104F06EFAB0BD3C :106DD0000228FCD104F0A5FBB0BD786901003C009D :106DE000443400000C4880B50178002912D0C068F6 :106DF00000280FD108481C38406900280AD10748EC :106E00000068002806D000220721102010F0A0F909 :106E100002F02CFC80BD000078690100D4670100FD :106E20003C0080340000F8B51D4E1C4D041CF06879 :106E300002271C3D002807D0E868002804D0FDF791 :106E4000C2FE002800D0BC43002C14D03770F0687C :106E5000144F002810D0E00717D4FDF7B4FE002827 :106E600013D03C00BC3400007069002806D1E868EB :106E7000002801D0FDF71AFF0DF00AFAF8BD686985 :106E8000002805D109480068002801D0012C04D150 :106E9000391C201C0EF052FDF0E704F01DFB02F03F :106EA000EBFBEBE73C00F83400007869010050C3CD :106EB0000000D467010005484169002904D0406AF8 :106EC000002801D001207047002070470000786939 :106ED000010010B5041C0649002048600860886065 :106EE00008F09BFF07213C00343500001220227976 :106EF00010F03AF910BD00005C6901000149012061 :106F000008607047E8670100F8B5071C0E1C08F020 :106F1000A3FA134D041C6868002817D0002F02D074 :106F2000A868032813D300203C0070350000A86037 :106F30006860211C0F200EF0F0FE2868002803D0A6 :106F4000002C06D1012002E0012C02D10020FFF725 :106F5000FAFEF8BD721C0021044800F068F8A86829 :106F60000130A860F5E75C6901003C00AC35000029 :106F7000513500000A4980B5CA68002A0BD0426822 :106F8000002A09D000224A6202680A6202680721C8 :106F9000172010F0EFF880BD0120486280BD00008E :106FA0007869010070B5144D846CE9683C00E835DF :106FB0000000002917D04030EC614078002801D152 :106FC00001206862286A0E4E001BB0420CD208F005 :106FD0003AFE296A401AB04203D202220721132046 :106FE00009E004F0B6FA70BD0748A9680BF03C0050 :106FF00024360000BDFE221C0721162010F0C0F828 :1070000070BD000078690100A086010034630100B2 :107010000A4980B500208861086900280CD007481B :107020001C300078002807D001F0D2FF022803D1DD :107030003C006036000000F012F900F0BCF880BDA2 :1070400000005C690100F0B5061C0C1C151C91B019 :1070500001A84021FCF70DFF00216846FDF7A7FFBE :10706000049001A806220849FCF731FF062202A875 :1070700002303C009C3600000649FCF72BFF00ABB9 :10708000DC760C95311C01A807F04EF811B0F0BD6C :1070900012610100F8670100031C081C191C114B48 :1070A00080B506D0042111800422191CFCF712FFC0 :1070B00016E004223C00D8360000011C181CFCF726 :1070C0000CFF09481038006900280CD007480C3024 :1070D0000078002807D001F084FF022803D100F0D7 :1070E000C4F800F06EF8012080BD6C690100F8B5AD :1070F000041C0F1C00253C0014370000002601F082 :1071000073FF02282FD11949012F086807D1021CEB :1071100022400AD120430860A04206D104E00028A2 :1071200003D0A043086000D10125486800281AD187 :10713000002D17D0012048603C0050370000381C5B :1071400008F089FE0B481C308169002907D0002314 :107150008361002200210020FFF7F1FE06E00022FB :1071600000210448FFF77BFF00E00126301CF8BD3A :1071700000005C690100513500003C008C370000C4 :10718000031C081C191C124B80B506D00421118069 :107190000422191CFCF7AAFE18E00422011C181C8A :1071A000FCF7A4FE0A481030C16800290ED0007810 :1071B00000280BD001F01EFF022807D13C00C83781 :1071C000000000F064F800F02EF8002801D109F06A :1071D0007AFD012080BD6869010010B50A4C206964 :1071E000002809D0A169002906D17D21C9004143A9 :1071F000032207200FF0E1FE2169012000293C0055 :107200000438000000D1002010BD00005C690100BE :1072100010B5054C002803D0FDF79AFCE06010BDC6 :1072200001200021E16010BD786901000A480A4987 :1072300010B5C0681C39C968002803D0002901D0E6 :107240003C0040380000012400E00024002C03D062 :10725000022207200FF0B7FE201C10BD0000786945 :10726000010010B5094C0020216900290CD0064905 :107270001C310978002907D000F009F80120A0612D :1072800020693C007C3800007D23DB00584310BDA2 :107290005C69010080B5032107200FF0D1FE80BD9D :1072A00080B5022107200FF0CBFE80BD064880B5D7 :1072B0000078002801D0FDF729FD002207211120C8 :1072C0000FF07CFF3C00B838000080BD00007869FA :1072D000010010B5041C101C064A516100F0A3F80F :1072E0001020002C00D11120002207210FF069FF8F :1072F00010BD5C6901000149486270470000447D8F :10730000010010B5094C3C00F4380000E069002889 :107310000CD1E0620120E0610BF008FD0BF074FE7F :10732000012000F0B5F80FF04DFA606310BD0000C9 :10733000447D0100054980B50020C861886300F0E4 :1073400089F800F001F902F03C003039000091FBAF :1073500080BD447D010010B5012838D10806000E1B :10736000052832D11D4C2078012809D002281BD0D5 :1073700003282AD102F07DFB00F06FF8012010E015 :107380001748216B0BF01BFD0BF03C006C39000023 :1073900041FE15480069032801D3C00703D5012128 :1073A000206B07F019FF022000F078F810BD0F489D :1073B000006820640A485C30C16802698918C160AD :1073C00003F0CCFC032000F069F801203C00A83950 :1073D0000000E06210BD092100E008210920FDF74E :1073E00076FC10BD0000447D010034630100F468A8 :1073F0000100786E0100B0B50F4C2078651E0128A1 :107400000FD10020FFF7A1FC0C49098849083C0076 :10741000E4390000401A0FF019F9002804D0287848 :10742000012807D0022805D02078002804D1287828 :10743000032801D10120B0BD0020B0BD457D010071 :10744000F46701000149C86470470000447D0100F1 :107450003C00203A00000449054A8968126D012069 :10746000914200D3002070470000F4680100447D81 :10747000010010B5064C206B07F0F9FEA06B002848 :1074800003D10348216B0BF092FC10BD0000447D3A :1074900001003C005C3A00003463010004480078BD :1074A000022801D0032801D1012070470020704735 :1074B000447D0100F8B5071CFFF7D0FF061C012F23 :1074C000264D1FD0022F45D0032F12D12448254B23 :1074D00000696A693C00983A000041085A43234B0E :1074E000D4188C4200D90C1C002E05D01E495B39E3 :1074F0000978002900D1041C0522211C09200FF065 :1075000080FD184A5C3A1770F8BDFFF7D6FB0028DB :1075100002D0286900283C00D43A00000ED004F0C4 :10752000CFFB134B6969114A59435C3AD26B8918F6 :10753000884201D9441A04E0002402E004F0AEFDC0 :10754000041C002EDBD009485B3800780128D6D116 :10755000084B9C4202D958423C00103B00002418C2 :10756000D0E70024CEE704F0AEFBCAE70000F468E1 :107570000100A07D0100983A00008813000080B54A :10758000052109200FF07DFD02490020087080BD13 :107590000000447D010070B5061C3C004C3B00001F :1075A0000DF0BCFAFFF7CEFE094C0A48216B0BF038 :1075B00021FC012501213006000EA56307F03AFEEB :1075C000054829020958002900D1056170BD000055 :1075D000447D010034630100F46701003C00883BF6 :1075E0000000024A116C0843106470470000447D9B :1075F000010080B5FFF7BFFE0BF0A1FB80BD024A82 :10760000011C1069116170470000447D0100F3B551 :10761000061C002089B0F84C0890E26908253C005F :10762000C43B0000002A03D006A907A8FCF706FC0B :10763000301CF34E0027203682286FD015DC01283D :1076400018D080286BD1EE4D803DA868012867D105 :1076500068680FF01BF8002863D1012101200DF0AC :107660003C00003C00009DF808F0DBFD0BB0F0BDD5 :1076700083286DD0842855D1E7E00A980A2804D2DF :1076800003A31B181B5A5B009F44F6E00000EE00AA :107690000B00F700F700F700F7002F0088008B00C1 :1076A000AD003C003C3C000000F056FE002817D026 :1076B000D64A803AD16A0698814216D0062100281F :1076C00000D107210D062D0E00280ED0CF4A012033 :1076D000803A50650FF0A0F8CC4A803A506604E03A :1076E000002116203C00783C00000FF0DCFC012556 :1076F000022005902EE2C6488038406D00282ED02A :10770000C6492069C44D40180EF0C1FF002812D0B0 :107710000FF085F8C14949424018BD4920618039C0 :10772000486E40190EF03C00B43C0000BBFF00283E :1077300011D00AE0F7E017E2B2E0B0E0B649206904 :107740008039496E401AA84205DBB349B54D8039EE :107750004F6503F027FB0622291C16200FF072FC50 :1077600047E095E000F0FEFD3C00F03C0000002802 :1077700042D1AA4DC43DEF6008F019FD03F015FB9E :10778000A86A002802D0FFF74CFFAF62A4488038F7 :1077900000680021FFF7F9FC08F03FF909211620E5 :1077A0000FF087FC0022162183203C002C3D0000B6 :1077B0000FF040FDFFF786FC21E000F01BFE1EE00D :1077C00006F054FA974D803DA96F401A0490069830 :1077D000002801D0AF6502E0A86D002808D19148CB :1077E000C4380078800703D5924847603C00683D64 :1077F000000000F002FE0498FF382338142802D25B :107800000120E86353E0EF6351E0874AB57A803A9C :10781000002D4CD00DF071FF00F0ADFD071C82482B :107820008038406FFF305F300EF03DFF021C3C009F :10783000A43D00007E488038406D00281AD100F039 :10784000F1FD002816D1042D02D1002F12D11BE02A :10785000002F06D0022D14D079484068002809D0A6 :1078600012E0002A10D14B21C90001230922162061 :107870003C00E03D00000FF0D6FC6E4A7348803AB1 :1078800011680BF0D8FA18E00121002001E0012175 :10789000012000F02AFE10E0674A6C49803A906EA1 :1078A00040189066012508958BE104216CE1614A3E :1078B00066483C001C3E0000803A11680BF0AAFAB2 :1078C00088E1AF60A86FE8676348016DA967079A10 :1078D0001420002A00D1002008181230A866707801 :1078E000B0703078707002203070A069FCF7C2FA76 :1078F000EF64A86F3C00583E0000E96F594B401AF6 :10790000984212D2686D069988420ED030780228CB :107910000BD80EF09CFFA96F0822401A5249091A91 :107920003B1C16200FF085FC00E0AF6501200590A0 :107930000890434802253C00943E0000C438C168CA :10794000002972D10121C1604948006B00286CD028 :1079500008F066FC69E03C480022019280388068AB :10796000012804D1384880388760012048E13A482E :10797000012343603448C4383C00D03E0000007806 :1079800000280AD100F025FE002806D0FF21913101 :107990000123092216200FF052FC2C498039486F30 :1079A000896F421A039206F076F928498039896F67 :1079B000039A401A0290372000013C000C3F00005F :1079C000101A50280DD223488038406D002804D169 :1079D0000298FF385538142801D2012200E0002215 :1079E0000192039A0120FF3A0B3A502A00D300205B :1079F000049000280AD017488038C06F3C00483FE8 :107A00000000081A9B21C900401A142801D2012243 :107A100000E000220092002A11D00F4D0120803D8D :107A200068650EF020FF68660125012116200FF021 :107A30005EFB002116200FF05AFB00E0BAE03C008C :107A4000843F0000F07902283CD8054A803A516C06 :107A5000002937D1136C111C002B33D116E0000024 :107A6000246D010050C30000C05C15007099140023 :107A7000B057010034630100E204000000900700E9 :107A80003C00C03F0000530700001E020000C85722 :107A900001004A6D002A02D0B27A022A15D1009A5A :107AA000002A03D0CA6D0132CA6500E0CF65019A91 :107AB000002A0BD08A6FCB6FD21A5A4B9A4202D24D :107AC0008A6D3C00FC3F0000013200E001228A6523 :107AD00000E08F650499002901D102280BD9544A8E :107AE00002281ED9D06F616888421AD1916F081A96 :107AF0005049884215DD4E4B986FE168401A7D2150 :107B0000C90088423C00384000000BDD6169401A22 :107B1000002804DD021140111018401801E0801007 :107B200008186061586FE0600398FF382338142804 :107B300009D20298FF382338142804D23E4A906FA5 :107B40005064906A90643C00744000000EF09AFE0D :107B50003A49496C401A3B49884201D937494F6438 :107B6000394903984018142807D23449C86B0028B3 :107B700003D0886F0864886A88640EF083FE2F49FA :107B8000096C401A314988423C00B040000001D9DC :107B90002C48076404200590082116200FF0B9FA3C :107BA0002848406D002802D00499002908D02949AE :107BB000002800D129493B1C062216200FF057FB54 :107BC000022D09D0062D0AD0072D3C00EC40000004 :107BD00013D107E001211620FDF7D6F81EE01A4A5E :107BE00057639763184A0698D06207991163536BDD :107BF00018435063906B084390630598002805D0A4 :107C000005980CF05FFA05980CF0D2F93C00284179 :107C10000000082D05D00D4844388570281C03F05D :107C2000DCFD1149E069884200D161E5089800282F :107C3000FBD0B07A0228F8D1012116200FF06FFA9C :107C400002200DF0E8FE53E50000530700003C0061 :107C500064410000A46C010020A10700204E000038 :107C60003FFBFFFFA086010050C30000C05C150071 :107C7000F11D00007047000070470000F8B5214872 :107C80000068214D6969084001D1012700E0002703 :107C90003C00A04100001D4D0126696A002900D06A :107CA00000261B4D1A482C1CA030027A281C40309C :107CB00080341023B74210D10125C580002900D09F :107CC00000231A43111C017301200EF088FE0820C6 :107CD00020703C00DC41000000221621802013E0CF :107CE0001127C7802E1C0B4D002900D100231A43F9 :107CF000111C017301200EF075FE08202070306DFC :107D000000221621686782200FF0D0FAF8BD00002B :107D1000100007003C0018420000A46C0100009015 :107D20000700B0B50F4D041CAA7A0121081C002AD7 :107D300000D00020002C00D0002188420AD0002C66 :107D400004D100F042FB00F0D6FA03E000F0D9FACB :107D500000F009F8A87A3C00544200000249E439D6 :107D60004871AC72B0BD0000446D010080B53EF0BA :107D700055F802490120087080BD0000687E0100AE :107D8000F3B501208DB00F1C012408900EF092FD78 :107D9000061C00F0B5FA09903C009042000000F08B :107DA00080FB0790FEF73FFA051C00210C9108F0BC :107DB000F0FB002801D1012000E000200A90FEF72E :107DC00012FD05F0E0FE0B90002D23D0288841071E :107DD00020D4291D04910A3500063C00CC42000045 :107DE000800E01212028039500D000210D1C04984D :107DF00006F038FD0C90049806F010FD002808D01D :107E0000039801F087FA002803D0002D01D101204A :107E100000E000200C9901430C91FCF73C00084362 :107E2000000023FF00282FD007F099FF051C07F062 :107E3000B2FF0490FFF7F3F80C990143002D06D030 :107E40000498F04A301A904201D2012000E000204C :107E500008430C900B980A9B1843011C0B913C00A3 :107E60004443000005F0CEFE00281AD1002D06D0B4 :107E70000498E749301A884201D2012000E000202E :107E80000C990843051C00F01FFB284303E000F099 :107E90001BFB0C9908430C9000F0D4FB0B99014399 :107EA0003C00804300000B91DC49C868002801D0E9 :107EB0000138C86008F0E7FB069008F090FD311A21 :107EC00005910699D648814208D8002F08D1059916 :107ED0004008814204D90699814201D900248BE0EF :107EE000D0483C00BC4300000599D04D814226D2C9 :107EF000E879102806D2002F21D1CC48A038806A1A :107F000000281CD109F062FF0490002802D1002053 :107F1000C34913E009F010FE002803D0C448C0692B :107F20000028F4D03C00F84300000498052803D052 :107F3000C148006A002865D1BB49486A002823D09F :107F40000138486200F087FF002811D0BB4805992E :107F500081420DD201F09BF804300DF0EEFC403070 :107F6000C17A01294ED03C0034440000807A0028B8 :107F700001D0052849D301F0DFF8022810D0002FE6 :107F800002D10698002840D10020089082E1AA483A :107F9000A038C068002838D0A8488069486234E01A :107FA0000AA903C9084345D03C0070440000A34817 :107FB0002978A038022940D8406D00280AD09F486F :107FC000A2492038C06840180EF0C7FB002801D035 :107FD000012100E00021964A906A002802DA640834 :107FE00064002AE0002909D1954B3C00AC44000014 :107FF000A03B5B6D002B02D005280DDB01E00728BC :108000000ADB0120C043906264088E4964000020AE :10801000A039886514E0D1E0394311D18949A039EC :10802000CB6D002B02D1896D012909D93C00E844B0 :108030000000079B002B01D1072801DB64086400C6 :1080400001309062BDE07D4988690490002088611C :108050000C9800282CD007F066FC002802D00220E3 :10806000044325E07A48C06A002804D177483C00E0 :1080700024450000A038C06800281CD104980028BE :108080000DD12878102802D3E878022802D928795F :10809000102804D304246B4901228A6194E06C48BF :1080A000A038406D002871D005F0A2FD00286DD0E9 :1080B0003C00604500006408640088E0FFF75BFA5C :1080C00000281AD068480078022801D1002F14D166 :1080D0000020FEF770FE301A0490FFF76CFA0028BB :1080E00007D0FFF71EFA002803D05D4904988842A4 :1080F0004FD33C009C45000005F06CFD00284BD19F :1081000053490878032808D188680122D207301A19 :10811000904241D201220A7057E054480078022868 :1081200001D1002F51D14A4988685149801B8842AA :1081300007D901203C00D8450000FEF742FE7D2112 :1081400009014018444988604A480078022804D14F :10815000079B002B01D1012000E00020474B47493D :10816000584340183C498968891B884230D9079B8D :108170000020039300F03C001446000079FF0290B9 :10818000FFF7D8F9049001F057F80499029A514387 :108190004843019000F0DCFF411C01980122484354 :1081A000111C00E01BE0314B5B6A834200D30021CD :1081B000039B0122002B00D03C005046000000220F :1081C0002C4B51439B6A0122834200D30022500072 :1081D000081803D023490320087003E00998C068F9 :1081E000062808D90224089800286ED01D490020CE :1081F000C8614861A5E01A4948693C008C46000006 :1082000000280AD1002F05D001224A61C8698018D0 :10821000C8610AE00020C86103E0002F05D10020FA :1082200048610D98002800D1C8680020089008789F :1082300001282FD002284BD1002F08D13C00C8467E :108240000000E878002802D12878102843D2287945 :10825000102840D248680A69301A904267D3012238 :108260000A7038E00000E204000010270000687E79 :108270000100A086010088130000446D01003C004D :1082800004470000C857010050C30000983A00009E :10829000C0570100400D0300C4090000B20C0000EB :1082A00000200B9A0A9BC0431A4337D0002F35D1C8 :1082B000079B002B08D06A78022A2FD92A78102A27 :1082C0003C00404700002CD22A79102A29D2254BA5 :1082D0001A6C002A06D09A6A9F6CBA4202D11F20FB :1082E0001FE02EE0204B5A6C002A03D01F4FB31A18 :1082F000BB4216D31C4B002A05D09A6A9F6CBA4227 :1083000001D13C007C4700000F200DE0079A002AB5 :1083100004D0EA79202A01D1002005E0EA79102A68 :1083200001D3032000E09A6A124A126802400BD17E :1083300001200890022008700F4808614E6064E731 :10834000FFE701203C00B8470000089060E70C49B7 :10835000886A002801DA013002E0002801DD0020EF :108360008862002008620899200408430FB0F0BD1D :108370000000A46C010071020000082007005307F0 :108380000000687E01003C00F447000070470000D8 :1083900000487047507E010080B53DF07FFD0249E6 :1083A0000120087080BD00003C7E0100F8B50D1C66 :1083B0000EF0C8FA2649041C886A264E002801D00F :1083C000042003E0706A00283C003048000001D01F :1083D000013870620027002D02D0B761F7610AE012 :1083E000B0691C490130B061496D002903D00328F0 :1083F00001D90120F061B460F168009108F0F7FC48 :10840000F0600099884202D030623C006C48000065 :1084100034610BE000F090F8002801D0114800E032 :1084200011483169611A814200D937620B4A0C4800 :10843000D16C2030002901D00A2103E0017A002903 :1084400001D0FF310172002D03D1017A3C00A84810 :108450000000002900D0916A007A002800D1176539 :10846000F8BDA46C01003C7E0100A60E0000A861CE :10847000000070470000064980B58968002907D0D0 :108480000521002800D104210806000E03F03C005D :10849000E448000005FA80BD606C010007480068F0 :1084A00007494A69104001D0012000E00020496AD4 :1084B000884201D10120704700207047100007005A :1084C000A46C010070B50EF049FA021C00F03AF8F5 :1084D0003C0020490000104900280ED0081CA031A3 :1084E0000E780E4B102E01D3806F03E049781029CF :1084F0000ED3C06FC018841A0AE0081C803045698A :1085000008498D4201D90C1C05E0C068101A2C1ACC :10851000002C3C005C49000000DA6419201C70BD8E :10852000A46C0100A60E000050C3000080B505F049 :10853000B7FB002802D007F01FFF80BD034800787A :108540000028FAD007F070FB80BD0000606C0100CD :10855000034901203C00984900004969032900D8DB :10856000002070470000606C0100B0B50A4D002487 :108570002878012803D005F06AFB0406240EFEF7D4 :10858000D2FC0002204302D1686A002801D10120F8 :10859000B0BD0020B0BD3C00D4490000606C0100BB :1085A0000121012800D000210148416270470000EC :1085B000606C0100154810B504681548006A002871 :1085C00014D0FFF7CBFF00280ED111481149C43059 :1085D0004069884208D2CC083C00104A0000A04202 :1085E00005D3FFF77EFFA04201DA0C4C01E0FF2427 :1085F00091347D200001844204D900221621832079 :108600000EF0BDFE01230922211C16200EF0A7FE4C :1086100010BDB0570100606C01003C004C4A0000E6 :10862000C05D00001027000070B5051C0E1C00F096 :1086300043F800280FD0084C2078C00703D405F079 :10864000ABF909F031FE002D05D02078800702D467 :10865000301C02F0FDFE70BD606C01003C00884AD9 :108660000000B0B5002818D01148814215D210483A :108670000C1C0D1807F0DFFA81000918A14201D285 :10868000400003E041000918A14201D2241A06E08B :108690004100A14203D24008F8E7064D074C3C00D8 :1086A000C44A00000EF072F90019291C07F0DCFA28 :1086B000B0BD000080B92A00530700004C1D000027 :1086C00088130000B0B505F0FDFA002813D1FEF7BD :1086D000B5FE0A4C0A4D0028606300D028600EF0F9 :1086E0003C00004B000055F9216A002904D1E169E2 :1086F000401A2968884201D90120B0BD0020B0BDD0 :108700000000606C0100B057010080B5FFF7DDFF8D :10871000002805D005F0B7FA002801D1012080BD5E :1087200000203C003C4B000080BD000010B50A4C0E :108730000021A268002A03D0A16002F083F910BDD5 :108740006160011C002204200EF036FD0348216800 :108750000AF008FC10BD0000BC740100C4600100F8 :1087600070B5051C3C00784B000001D1FCF7C1FB43 :10877000204CE06A002815D01F4BA0695843C60B57 :1087800020884643F0008019E660FBF71CFEA842F3 :1087900005D8301CFBF717FE8019A84202D2002032 :1087A000E06020E0E5603C00B44B0000002D1DD0EF :1087B0002688A0697043C103281CFBF7A5FD6061F2 :1087C0000D48321C291C3030FBF70AFC0C4B606949 :1087D0005843C00B606201F0B7FDA062E06800285A :1087E00004D02069A168FBF73C00F04B0000F4FBCB :1087F00070BD0548A168FBF7EFFB70BD0000C874B1 :10880000010040420F00C0C62D0088130000F1B5E2 :108810003E4800AB8178C0783E4F0A07040758787D :108820003B49120F085C1439240F3C002C4C00000B :10883000801878600130B8601878354D085C0019F0 :10884000B8610130F861EB7833481E09334B1838B2 :1088500081785E43AB781D09C8236B43002908D19A :108860002B4D2D783D60C5607D25ED003C00684CAA :1088700000005D1B2C4B07E0274D6D783D60C56007 :108880004B252D015D1B284BF618022000F057F8F0 :10889000281AF8602248221C18388178032000F03A :1088A0004EF8301A3862396800AB79615A783C006A :1088B000A44C00005623F9685A43891AF960C8315C :1088C00039611849183989780029B96911D100AB83 :1088D0001A78134B143B9A5C531C59430A2359438F :1088E000144B591A51430A235943401A386212490A :1088F0003C00E04C000010E000AB1A780A4B143B3F :108900009A5C531C59430A2359430D4B591A51433E :108910000A235943401A0B49386240187862F8BD5F :1089200000000C5A0100665A010094780100A086EC :1089300001003C001C4D000000487100B0D68C00C6 :1089400088100000803801005812000070110100EA :1089500030B5194B0228DD6806D1002904D12B1C43 :108960000C339C1A64235C43022809D1012907D1E6 :1089700064237D243C00584D0000E4006B431C1927 :10898000A0235343E41A0A235A43032809D1002998 :1089900007D11323FF24E4006B431B199B1A1C1CF3 :1089A0005C43032808D1012906D10E2005496843FC :1089B0004018801A041C3C00944D00004443201CC5 :1089C00030BD00007C7801008408000010B5074C21 :1089D0000C2360780549143158434018406801F071 :1089E0004FFC0021607802F04BFF10BD4C7B010072 :1089F0000C48F8B540780C233C00D04D00000A49E3 :108A0000584314314418261D60CE301C0BF00BFD6A :108A10000027412047550548291C02F0F0FE281C7C :108A200001F031FC0434C0C4F8BD4C7B010055801A :108A30000000B0B50A4D4C2128783C000C4E0000D7 :108A4000094A41438C1822680121FBF7E1FA287892 :108A500001F0FAFB3C23E056411E012007F034FBF5 :108A6000B0BD00003C7C010058E301000C23074925 :108A70005843401880B54068416B00293C00484E7F :108A8000000002D00BF0FBFD80BD0BF02CFD80BD83 :108A90000000607B010038220A4B4243D2180029B3 :108AA00080B504D0022907D10BF0FBFC80BDD26A4F :108AB0000121FBF7B0FA80BD03218620FCF73C00C2 :108AC000844E00000FFA80BDD4E40100B0B5040666 :108AD000240E0C200E49604340184568A86B0028FE :108AE00003D10021201CFDF7E1FA201C07F0F2FF62 :108AF000002808D0281C6030C179012903D9FF3132 :108B00003C00C04E0000C171FF3181710121201C69 :108B100002F0C5FEB0BD607B010070B50006000E1E :108B2000051C4C230A49584344183C20005DFF3083 :108B300006063616281C01F090FB0021281C22682E :108B4000FBF73C00FC4E00006FFA311C002007F0E0 :108B5000C7FA70BD58E301000C220F4B4243D218F4 :108B600010B5546800290DD002290FD12C20005DCA :108B7000002803D007210C20FCF7BAF9201C0BF0C9 :108B8000BBFC10BD3C00384F0000002102F08DFE00 :108B900010BD04210C20FCF7AEF910BD0000607B75 :108BA000010080B5002907D00C230549584340181F :108BB00040680BF04AFC80BD012102F076FE80BDCA :108BC0000000607B01003C00744F000010B5041CE5 :108BD000002905D002291AD1201C0BF0EBFC10BD96 :108BE0000D4804700D4807F007F90D48018801226F :108BF0001203114301804C200A4960434018403061 :108C00000078FDF75DFD201C3C00B04F00000AF02D :108C1000D4F810BD03218620FCF773F910BD3C7C0D :108C20000100054E00003280070058E30100FFB547 :108C3000051C012083B001900C205D4A6843861812 :108C40000127002974680ED002293C00EC4F000077 :108C50006AD12C20005D002803D006210C20FCF7EF :108C600053F9201C0BF020FD07B0F0BD524814381A :108C70004570A06B002807D0504807F07FF801210D :108C8000281CFDF725FA1CE04D4807F03C00285051 :108C9000000077F84A48143805704B4801880122D3 :108CA0005203114301804020005DFDF712FDB068C2 :108CB000002809D1281C07F064FFB060002803D108 :108CC00009210C20FCF723F90598002803D03C006B :108CD00064500000E06C0130E0640EE06720005D4D :108CE000002807D1E06C002804D139480238C06A56 :108CF000A06409E0206D002801D0002704E0281CB2 :108D000007F000FF0028E5D105982065201C2030E1 :108D10003C00A0500000626A0290817B281C07F092 :108D200078FF002F19D0201C6030C1794A1CC27115 :108D30008079814202D2012001E040E000200190D0 :108D400000280AD025480078800706D500F00DFBE2 :108D5000011C3C00DC500000201C0BF015FD0190B4 :108D6000019800280FD00298007B022803D1201C14 :108D700004F0D0FE84E7012800D07EE7211C301CDF :108D800004F0E2FE7CE7251C6035E879FF30A8712D :108D9000687A06F03C00185100009DFC0DF047FE7B :108DA000071C05F012FF3F180298817B20690430F0 :108DB00000F035FA616A05F0EAFE39186B7A3088FE :108DC0008031094A0DF091FE5DE703210C20FCF78C :108DD000AAF858E700003C0054510000607B0100F5 :108DE000A54D0000C94D0000328007001D7501002F :108DF0008D4E0000FFB581B01F1C051C141C101CFB :108E00000A9E00F0F5FC291C1031201D0622FBF7FC :108E1000B7F9A88E2080E88E3C0090510000608059 :108E20000299201C00F007F9FF34013466602760C6 :108E300005B0F0BD0000F8B50F1C1E1C051C141C6D :108E4000101C00F0D8FCA888391C2080288960807C :108E5000201C00F0F0F8FF3401343C00CC5100003D :108E60006660F8BD70B5041CC0680568201C14302D :108E7000061C00F00FFB002816D0012202212069F9 :108E800005F0F8FA002801D0FBF724FF00220221A8 :108E9000206905F0EFFA002806D0FBF73C000852E5 :108EA000000001FF002802D0301C0BF07CFB688919 :108EB0008007C00F03F0A7F818230449584340184F :108EC000C168002902D0201CFBF7D4F870BD94675C :108ED0000100F8B5041C101C0D1C191CFF223C00DD :108EE000445200000027FF2D25D0002905D04B88D3 :108EF000002B02D000F050FC15E00021104E4B007A :108F00009E190223F65E864201DD0A1C04E001314F :108F10000906090E2629F1D3094E500080194E2367 :108F20003C0080520000C05E272A07D20649203943 :108F300049574731401A2060012702E07E20C04394 :108F40002060381CF8BDFA470100B0B50C1C7E212A :108F5000051C0020C943002C0FD0101C05F06BFD30 :108F600000283C00BC52000002D0211CC93901E09D :108F7000211C86390220C043FBF7B4F9011C0120F3 :108F80002960B0BD98B5141C00220092221CFDF788 :108F900043FE98BD054980B5086005490120C861B8 :108FA000012100203C00F852000003F01CFE80BDAF :108FB000000020670100AC7C010080B5002100208A :108FC00003F011FE06F00DFB02490020086080BD91 :108FD000000020670100034901200969002900D130 :108FE0000020704700003C0034530000106701006F :108FF00003480069002801D040697047002070478D :109000001067010070B5161C0D1C041C002801D04F :10901000012C07D100F036FA002805D013F0CAF968 :10902000002801D1012070BD3C00705300000120D8 :10903000002C00D000200A4C043461C4103C00F025 :1090400024FA002802D000F0C6F901E000F0E5F8AB :10905000C030C36B221D07CAFBF720F8002070BD8B :109060000000D4670100F8B50D1C3C00AC530000B3 :109070000021041C281C05F0E3F9231CFF332133D5 :10908000FF27002805D02222011C181CFBF796F8A8 :1090900000E01F700321281C05F0D2F9261CFF36C2 :1090A0004136002805D00322011CB01C3C00E853C7 :1090B0000000FBF786F800E0B7700121281C05F0DE :1090C000C2F9002807D0011C201CFF300A224630BC :1090D000FBF777F800E077713221281C05F0B3F92F :1090E000002807D0011C201CFF30122250303C0009 :1090F00024540000FBF768F800E0F7730621281CF1 :1091000005F0A4F9002807D0011C201CFF30042220 :109110006330FBF759F8F8BDFF346134A770FAE704 :10912000084980B50968002801D107480168081C72 :109130003C006054000005D103219020FBF71DFF87 :10914000002080BD01F0D7FB80BD1C6701002067B7 :10915000010080B5FFF7E7FF80BDF0B5002484462D :1091600000200BE08740174007D014230B4D4343EA :109170005B193C009C5400001B7C65462B55013458 :10918000013001273B1C0E2800D300230E883D1C14 :10919000A64200DC00252B40E7D10C80F0BD00008A :1091A0007440010078B5041C01202070082000AB39 :1091B0000D1C18803C00D8540000161CA01C6946E9 :1091C000FFF7D1FF00AB0022D243198882406170C3 :1091D00032202870102018803240A81C6946FFF702 :1091E000C2FF00AB1888687078BD80B502F035FF0B :1091F0000021002800D03C00145500000169081C23 :1092000080BD00000549002801D0C86800E0086959 :10921000002801D00430704700207047106701001B :1092200003480069002801D00430704700207047CF :1092300010670100024800693C00505500000028FA :10924000FFD1704700001067010010B5054C206980 :10925000002803D104219020FBF79BFE206910BD5C :1092600000001067010010B5041C00F040F9002850 :1092700001D0002010BD201C00F03C008C550000E7 :1092800057F9002801D0012010BD022010BD0000B8 :1092900070B50F4E041C30680D1C002807D0211C2F :1092A000043005F0C1FB002801D030680BE0094A0A :1092B0001068002809D0211C141C04303C00C8553B :1092C000000005F0B4FB002802D020689C3000E0CC :1092D0000348405D70BD206701001C670100CC475A :1092E0000100044900200969002902D0FF31013141 :1092F000886970470000106701000148007A3C004F :109300000456000070470000AC7C0100FEB5061C4E :1093100000201F1C141C0029029019D0012926D0FE :10932000022947D12648007805F0A0FBA0720AF078 :109330004FFC0E2809D1A07A05F0AAFB002804D022 :109340003C00405600002048007805F092FBA072D7 :10935000002020722FE01D4D2868002801D1FBF766 :1093600052FE00972A68231C1832111C301CFCF78F :10937000DEFB26E0301C0CF0CAFB051C02D0A868FE :1093800000283C007C56000008D1134800680028E3 :1093900001D1FBF73BFE104800681830021C0E4854 :1093A00000970168231C1831301CFCF7C3FB002D0B :1093B0000AD040352888800606D40020206003E0CB :1093C000012190203C00B8560000FBF7F4FD029804 :1093D000FEBDB069010090570100206701001C67C5 :1093E000010080B5002002F04AFE1823054A5843C8 :1093F000801840690121002800D04178081C80BDF8 :109400000000946701003C00F4560000024908691E :10941000002800D1C8687047106701000348C06881 :10942000002801D004307047002070471067010009 :1094300010B5054CE068002803D105219020FBF70A :10944000BDFDE06810BD00003C0030570000106713 :109450000100F8B50D1C002A03D01149124F0E78F7 :1094600001E0114F0C26082E01D2341C00E0082424 :10947000012101704470391C221C0230FAF7CBFE26 :10948000321B002A07DD322028703C006C57000098 :109490003919A81C6A70FAF7C1FEF8BDFF202870C0 :1094A00000206870F9E70000A4690100B0690100BC :1094B000905701000149486270470000946701001D :1094C000034980B508600121012003F03C00A85742 :1094D0000000C5FB80BD1C67010080B50021012094 :1094E00003F0BDFB06F0B9F802490020086080BD1A :1094F00000001C67010003490120C968002900D150 :10950000002070470000106701000348C0683C005D :10951000E4570000002801D04069704700207047E0 :109520001067010080B50221012003F09BFB80BD84 :10953000054A80B512690021002A03D0111D05F0EB :1095400091FA011C081C80BD10670100064A80B515 :109550003C002058000012690021002A05D0111C8F :10956000FF31213105F08BFA011C081C80BD10670A :109570000100054A80B5D2680021002A03D0111DE0 :1095800005F073FA011C081C80BD10670100064A33 :1095900080B53C005C580000D2680021002A05D04C :1095A000111CFF31213105F06DFA011C081C80BD32 :1095B00010670100FFB50D1C1F1C87B0109E002412 :1095C00002F072FD1823134958430858002819D097 :1095D000041C331C3C00985800003A1C281C0999B4 :1095E000FAF79FFD041C14D0182000AB1880AA685D :1095F00001A86946FFF7E7FD6A4601A9002007F0C8 :1096000044FE002805D10A2100E00F219020FBF73D :10961000EAFC201C0BB03C00D4580000F0BD000058 :109620009467010010B5002402F044FD1823054999 :10963000584340188068002802D0FAF771FD0124D1 :10964000201C10BD9467010080B5024B00F04EF85D :1096500080BD0000106701003C001059000080B57B :10966000024B00F046F880BD000011670100F8B51C :109670000E1C151C00281C4910D048681C4A288064 :10968000002007E00B181C7A142363439B181B7CF3 :10969000335401302B888342F4DC3C004C590000E9 :1096A00024E000200F1C002408600FE0305D05F06E :1096B00007FA0E2801D10020F8BD391908720122DD :1096C000396882401143081C386001342888A04260 :1096D000ECDC28887860FFF7B7FE00283C0088594A :1096E000000006D00169002903D07F21C9430BF097 :1096F00052FB0120E3E72C7D01007440010010B50E :109700001C1C00280BD020780E2805D214230C4AEC :1097100058438018007C00E0002008700EE03C00F8 :10972000C4590000087805F0D1F92070FFF792FEC7 :10973000002806D00169002903D07F21C9430BF01E :109740002DFB012010BD00007440010080B52720D2 :10975000C04309F031FC80BD80B52720C04309F02B :109760003C00005A000039FC80BD80B5282009F07B :1097700042FC80BD000080B5282009F04AFC80BD75 :109780000000B0B5012828D1012901D0FBF76BFCFE :10979000FFF7E9FD02281AD107F013FC124C2169EA :1097A00088423C003C5A000015D007F00DFC2061B7 :1097B00020687D24E40044430DF0AEF9051C07F059 :1097C0000BFC281A844200D9241A0122211C0A20E9 :1097D0000DF0B2FDB0BD002109200CF075FCB0BD4C :1097E00007210A203C00785A0000FBF714FCB0BDAA :1097F0000000D46701007D20024900010860704725 :109800000000D467010010B5816D041CFF304630A4 :109810000CF0D1FC201CFF305030A16D0CF0CBFCC3 :1098200010BDB0B5041C3C00B45A00000D1C02F081 :1098300059FC201C02F056FC1823044958434018D8 :109840001822291CFAF770FDB0BD000094670100D2 :1098500010B5041C09F0BCFB201C09F0C7FB10BDAF :1098600010B5041C09F0D0FB3C00F05A0000201C8D :1098700009F0DBFB10BD70B50C78061C48884D78EC :10988000E200801AE900401A011C414312312420F1 :10989000FAF791FD211C6143C9004018291C694356 :1098A000C90042180C4988790C4B3C002C5B000025 :1098B00053430C4A1360537B34021460527B88710B :1098C00001335810084B801A0121490258430028DF :1098D00000DA494208188012213870BD20100700B4 :1098E000EC04000000A00700030300003C00685BDC :1098F000000010B5041C06210430FAF770FCFF20AC :109900002130FF210155201CFF3041308170417111 :10991000C173FF2063300155002020616061FF3476 :109920000134A060E06010BD000070B5061C3C0072 :10993000A45B0000081C58609A601C1C1E60151C6B :109940009B8AE28A311C02F0A1FC281AE06070BDFB :1099500070B5041C081C111C1E1C0025EB43221CA6 :1099600018320BF0F7FB221CFF325032111C0A395F :109970003C00E05B00000123201C00F0C6F80C282E :1099800010D00125201C0BF0ACFA201C00F019F8B7 :10999000201C00F00AF8201C00F029F8311C201CC3 :1099A0000BF017FA281C70BD0000FF211D3109586B :1099B00080303C001C5C00008907002901DA01218D :1099C00000E00021C1627047011C803100220A635F :1099D000074A1268002A09D04288920606D5FF304D :1099E0000130C069400701D40120086370470000BE :1099F000AC6901003C00585C000080B5011C4A883D :109A00000020520505D5FF310131C969490700D44D :109A1000012006F0ECFB80BD0000F8B5051C98683D :109A2000171C0E1C1C1C002802D1201C0CF031F845 :109A3000AB69391C301C3C00945C0000A2680BF040 :109A400095FBF8BDF8B5161C0D1C1F1C002402F078 :109A500061FB18230649584340184368002B05D082 :109A60003A1C311C281CFAF78EFB0124201CF8BD7F :109A70009467010080B507F03C00D05C0000C5FA97 :109A8000094908610868002802D17D2000010860AA :109A900008687D21C9004143002301220A200DF0FE :109AA0004EFD80BD0000D467010080B501210A2071 :109AB0000DF097FC80BDF8B50E1C3C000C5D00005D :109AC0005168141C1268A5680B1C751B5719974226 :109AD00000D20131426800258A4202DD0125626020 :109AE00005E09A4203D10168B94200D90125002D51 :109AF00009D001682160A660A38AE28A3C00485D23 :109B00000000606802F0D7FB301AE060281CF8BD46 :109B1000000080B502F007FB1823034958434018A2 :109B20001821FAF798FB80BD000094670100FEB58C :109B3000041C081C111C1E1C0C25012200923C0058 :109B4000845D0000A26902ABFDF7F0F8002845D063 :109B500002982721021C0A4001D1084302902149A2 :109B6000A069084006D00298014003D14921C900EC :109B700008430290A06D0299884230D0002E2DD06B :109B80003C00C05D00004021201C5830FAF769FB02 :109B9000029800250026371CA06519E0C00711D5E2 :109BA000F019001970300571281C04F0D4FF00284A :109BB00004D0A01980300572013603E0E01960304E :109BC00005703C00FC5D0000013701352D06029850 :109BD0002D0E4008029002980028E2D18420065100 :109BE000F0192067E765002500E00B25281CFEBD65 :109BF000D83A000038B5051C081C111C0024E243AB :109C00006B46FFF73C00385E00004FFA002805D095 :109C1000A86900990140814200D10124201C38BD6F :109C200000007CB5056A8669041CC068FBF7B7FBB9 :109C3000E169FBF7DAFA201CE2694030C18B128936 :109C40008918C18306493C00745E000001940091AC :109C50002869331C82880168E068C06800F0F2F966 :109C60007CBD0000915E0000B0B5D1685569C86840 :109C7000141C144B0CE002689A4207D1C268CA60F7 :109C80000021C1600160FBF73C00B05E000073FB87 :109C900003E0011CC0680028F0D1E068C068E860FB :109CA000E068C560201C4030C18B2A898918C183B7 :109CB0002068002802D0FFF7BAFFB0BD044804F0C6 :109CC0004EF9006A07F077FAB0BD3C00EC5E000088 :109CD000A07E0100A06A0100F1B582B00298066979 :109CE000011C083660314568019182E01021002096 :109CF0002F69FBF763FB6861018908390904090CC6 :109D000001816869006840180821FBF73C00285F62 :109D1000000057FBE86168697188006820220180B3 :109D2000716841600199497B89011143C17000212B :109D300081702820FBF775FC3988041CC181A86B51 :109D4000002803D1012080020843E08106223C0064 :109D5000645F0000391D201C1030FAF7C5FA391C69 :109D60000A310622201C16300090FAF7BDFA391C81 :109D700010310622201C1C30FAF7B6FAE189254A78 :109D80005C201140012292031143405BE1810F21CD :109D90003C00A05F000008406084201C2030162199 :109DA000817100212170E96B002907D02969098B95 :109DB0000907090F2170A184182181710622601CF6 :109DC0000099FAF794FA7068000EE071706800026A :109DD000000E3C00DC5F0000207270680004000E82 :109DE00060727068A0727088000AE07270882073D8 :109DF000708801300004000C708002D1706801305E :109E00007060AC61029828622D68002D00D079E75F :109E1000029804493C00186000004268044804F0BD :109E200074F8FEBD00008FC7FFFF3DDA0000A06A96 :109E30000100B0B5074D2878032808D000242C7005 :109E40006968002903D00120FAF7C8F96C60B0BD39 :109E500000009C7301003C0054600000F8B52B4BDF :109E6000D86A002850D02A48011CFF310131CA6845 :109E70000132CA601A6C002A02D14A6901324A6171 :109E80000A6901320A61DA68002A04D01F4A0132E5 :109E90001278002A02D18A693C00906000000132E9 :109EA0008A610025071D18261A4A6E43743290599C :109EB000002829D0B4186069002825D160680028DE :109EC00002D00168002905D1A16800291CD00968C9 :109ED000002919D0002805D0E1683C00CC600000C2 :109EE0000131E1600068814211D3A068002806D0EA :109EF0002169006808180CF0A3FD002807D0064A65 :109F00000120606174329159381CFAF770F90135FB :109F1000022DCBDBF8BD0000447D01003C00086150 :109F20000000F4670100F8B50F1C0025041C002890 :109F300025D0201C04F003FE002806D0FFF7FFF810 :109F4000041CFFF750FB061C07E0201CFFF791FBE9 :109F5000061C201CFFF76FFB041C002E06D03C00E3 :109F600044610000FFF74CFB002802D001250120CE :109F700007E0002C06D0FFF7EFF8002802D00125FB :109F800000203860281CF8BDB0B5C568041C0DF071 :109F90008FFC207EC10708D5E168A94205D9226956 :109FA0003C0080610000914202D3E18A0131E182EC :109FB000810708D5E168A94205D22269914202D8F9 :109FC000E18A0131E182400706D5E06821698842D3 :109FD00002D1E08A0130E082E08AA18A88420DD372 :109FE000607E3C00BC61000002280BD02068E16864 :109FF000042207F065FB607E002803D1206808F08A :10A00000ABFFB0BD0020E082B0BD000070B5061C03 :10A010000C232049584345180020A860301C06F046 :10A0200091FE041C3C00F8610000686033D0012000 :10A03000A8702C20005D022803D1201C03F045FEEF :10A0400010E0616B00290AD0012804D1211C281CD2 :10A0500003F055FE06E0201C0AF00DFC02E0201C77 :10A060000AF03DFB0D483C003462000014384168A2 :10A07000002910D0201C4030028B1207920F012AB9 :10A0800009D0808B32020009000410438122024370 :10A090000C200DF0B7F90CF0A5FD606470BD000058 :10A0A000607B0100FFB5081C3C0070620000111CC1 :10A0B0000C32202414430C4A83B00CAE526860CE9C :10A0C00094700024D47093630D234027BB52946195 :10A0D000148401220292321C00900191231C291C3D :10A0E000039800F066F907B0F0BD3C00AC620000D8 :10A0F000A07E0100F8B5041C0027114E1DE0E068A9 :10A10000002870680CD1808800070DD101210C480F :10A11000FBF784F9C460E86070688188013102E06F :10A120008188228989188180E068391C3C00E862B6 :10A130000000002801D17168C96D251C6160041CF4 :10A14000002CDFD1F8BDA07E0100064910B549689A :10A15000002305E08A88048912198A804360C06858 :10A160000028F7D110BDA07E010010B509493C00C0 :10A1700024630000002449680AE08A880389D21811 :10A180008A80C368221C002B00D1CA6D4260181C53 :10A190000028F2D110BD0000A07E0100011C134870 :10A1A00010B54068002309E082880C89121982806A :10A1B0003C00606300004B60CA68002A00D1416621 :10A1C000C9680029F3D1011C68318164C364436507 :10A1D00082880823111C08318907890F591A5023D6 :10A1E000195251188180011C406E4831C16010BD68 :10A1F00000003C009C630000A07E010010B50749F0 :10A2000000244B6806E0C268211C002A00D1D96DE9 :10A210004160101C0028F6D110BD0000A07E010096 :10A2200070470000FEB5061C0C480C1C40688021DD :10A23000817000213C00D8630000C170151C4022D1 :10A2400081631152816101840020042202920090F6 :10A250000191291C201C1A1C331C00F0BCF8FEBD07 :10A260000000A07E010070B5061C1748807802210E :10A27000164A884390703C0014640000101C8078DB :10A280000843111C887013480024C4707020FBF729 :10A29000D9F9114D70216860FAF734F83007000FD2 :10A2A00069689030C8650D4868220880081C28300D :10A2B00089604861082008823C0050640000081C46 :10A2C00038304863203848645A20505406480831D2 :10A2D0004164446570BD0000070058000700A07E7F :10A2E0000100DEC00000003007000A4B10B5586DB9 :10A2F0000A490022496800244A623C008C6400003C :10A300005C654B6E002B01D0DA604A668B6D002BCA :10A3100003D00A6E0021F9F79CFF10BD0030070042 :10A32000A07E0100094910B508880130088001208D :10A33000074980020860074CA26D002A3C00C864EF :10A34000000005D00521D1200DF06FF90120A06596 :10A3500010BDB07401000010070000300700FFB509 :10A3600083B00CAE86468C460E4A43CE0FAD0F1C12 :10A3700052680C3730CD9770D37096630D263C0031 :10A38000046500004027BE52059E9661138400229A :10A3900002922A1C00900191211C6046734600F035 :10A3A00029F807B0F0BD0000A07E0100FFB5101C29 :10A3B0001A1C0C1C191C6023FF3213430C4A83B077 :10A3C0003C00406500000CAE526860CE93700023E4 :10A3D000D37093634027BB5293611384032202928C :10A3E0000191291C321C0090201C039B00F005F8F1 :10A3F00007B0F0BD0000A07E0100F8B5051C1148B3 :10A400001C1C3C007C650000089B079F4068DE0028 :10A4100081650266002181800D488159201CF9F771 :10A4200022FF0B4830184168281CF9F71CFF074928 :10A4300006984968002C88620F8600D12C1C0548BC :10A440004C6245653C00B86500000121016501646E :10A45000F8BDA07E01009052010000300700FFB55A :10A4600083B00DAE60CE0C9F081C111CD219FF32B8 :10A47000402414430B4A526894700024D4709363B0 :10A4800040239F5294613C00F46500001484022232 :10A490000292321C00900191231C291C0398FFF7A3 :10A4A000B5FF07B0F0BD0000A07E01004C210D4AB1 :10A4B000414310B58C180C490978884207D105F042 :10A4C000C7FD0A48018801223C00306600001203E3 :10A4D00091430180201C30300C23C156407B8142C7 :10A4E00002DD208D0CF0E5FB10BD58E301003C7C43 :10A4F000010032800700011C603180B5CA798B7978 :10A500009A4207D9487A0C2307493C006C66000040 :10A510005843085A0CF0D0FB80BD2030007B012846 :10A52000FAD1487A05F040FD80BD0000607B010053 :10A5300010B5041C1C21F9F703FF0348A080E0803C :10A5400020816081A08110BDFFFF00003C00A86653 :10A550000000FFB5041C002083B00D1C062C0290E7 :10A5600038D21F4AFF26C10089188978A14203D139 :10A57000C0008018467804E0013000060016062866 :10A58000F1DBFF2E24D00193201C0DF0E8F93C00F4 :10A59000E4660000002805D02421281C01AB02AA93 :10A5A000FAF730FE1049F00030390F58310609161D :10A5B000281C059A019BF9F76EFE061C10D1201C81 :10A5C0000DF0D0F900280BD0281C6969FAF712FEAB :10A5D0003C00206700000298686104E0062C01D36B :10A5E000072600E00826301C07B0F0BD0000CC5A5A :10A5F000010010B50C1C09F086F8002802D0201CC0 :10A6000009F0B5F810BDFEB5134D041CAE69002E5F :10A610001CD03C005C670000104F30377868604306 :10A62000011C2888F9F7D2FF39686143411801A855 :10A63000321CF9F737FE0298296A401828620BD4B9 :10A64000E969884208D9A969401A2862019801304D :10A6500001E000203C009867000002900190019802 :10A66000FEBDC8740100F8B5002828D00024144DA0 :10A6700000E0013461000919491949780029F8D12D :10A6800063001B1903330722694603F0D4FB002C37 :10A690000FD0002000993C00D46700000AE042007F :10A6A0001218AE5C531852195E71567801309E71C3 :10A6B0009278DA71A042F2DB00980322023003495B :10A6C000F9F77EFEF8BD0000EB620100E8620100D0 :10A6D000B0B5051C081CFAF73C00106800009DFF8F :10A6E000041C281CFAF7D9FE211CFAF7FCFD201CDB :10A6F000B0BDF3B544480C1C007881B0012872D17C :10A70000FAF782F8414DE86A41490860E86B486011 :10A710004048FAF7A6F9E86A00283C004C680000B7 :10A72000FCDA221C0F2001990AF0A4F8384D022708 :10A730002F63384A64260020AA21083213180130FA :10A740000004000C64281974F8D3168100205060AE :10A75000101C103010600025171CD2603C00886867 :10A76000000008E0281CF9F7A2FF413178190135F3 :10A770002D042D0C0174B542F4D3264D6F630120D6 :10A780002863244DE86A0028FBDA0B223B1C244E88 :10A7900003E00132642A00D10022101C0C213C008D :10A7A000C46800000139755C1F183F7CBD42F3D1BD :10A7B000013800D563200029F4D1184E501CF16BEC :10A7C0001A4A101C0138FDD1F06B884201D0011CDF :10A7D000F7E702273763164D9021281CF9F7CEFDC5 :10A7E0003C0000690000281C28302860281C10301C :10A7F0002F81E860281C20302861042100E00CE053 :10A800002983E861ED62756301203063221C892091 :10A8100001990AF038F800202863FEBD00000857AF :10A8200001003C003C69000000300700108E010070 :10A8300074FF010009570100204E0000E4FE0100F2 :10A8400080B513281ED0F02816D109F0B5F90028DC :10A8500013D10DF0BFFA11F00DFC00220421C42029 :10A860000CF01CFF3C0078690000094800210078CA :10A8700005F03FFD05F093F807490120086080BD11 :10A88000011C0120FAF787FC80BD00F032F880BD82 :10A8900000006A5701003CD90100B0B50CF0FFF987 :10A8A0000B49022448603C00B46900000A48046176 :10A8B0000120772109030861084D6868800702D4E8 :10A8C00068682043686009F0C7F96868A043686059 :10A8D0000020B0BDE060010000300700000107006B :10A8E00080B50123032200213C00F0690000022012 :10A8F0003CF0F1FA002801D0FAF781FC80BD1CB5CC :10A90000FCF7F5FAFAF719FE01F003F90024211C0F :10A91000684601F0E2FB00AB1878012803D002285A :10A9200001D0032801D10CF0B2FC3C002C6A0000DD :10A93000013424062416062CECDBFAF709F9FAF7A1 :10A94000E7FCFAF733FAFAF76DFAFBF7DFFF05F0E9 :10A950004DFB06F081FC0BF07DF907F029FC114856 :10A960001021016009010160C90201603C00686AB0 :10A97000000089000160202101600421016008219C :10A98000016040210160802101608900016049006F :10A9900001604900016049000160C9030160890B41 :10A9A0000160F9F741FF1CBD0000001007003C00EA :10A9B000A46A000080B53BF04FF83BF07DF9FAF750 :10A9C0004BF980BDF8B5002500240022002871D085 :10A9D000434FB9680B1ABB60F868391C0130F86046 :10A9E000896A002B1EDC0224002906DAFB699842E2 :10A9F0003C00E06A000006DD3B69984209DD07E0A3 :10AA0000BB69984201DC012403E07B69984200DDC8 :10AA10000324786A002808D000207862032C01D132 :10AA2000022402E0022C00D101242E48012C0079DE :10AA300018D13C001C6B0000BB78994215DA3B78BA :10AA40007B7039700131B96201D50131B962B96ADF :10AA50000125994203D1042804D2013000E00020EE :10AA600038710122002933DA27E0032C35D1002682 :10AA7000002807D03C00586B00001E498140386A0E :10AA800008180CF05CF800282CD01B480078400710 :10AA900005D5F8683969884201DB0323FE56B86A98 :10AAA000B04212DD01217962397801257970387060 :10AAB0000138B86288423C00946B000001D000214C :10AAC000397100280CDA0720387100E012E007E045 :10AAD0003879002809D0FF30387106E0002A02D00A :10AAE0000CF0F8F83862002C04D0FEF797FD291C12 :10AAF00008F0FCFBF8BD00003C00D06B0000AC7E11 :10AB0000010050C300001D75010080B510680028C9 :10AB100002D000F00AF880BD0348C069806808F0E0 :10AB2000B2F980BD0000846A010010B5041CC06841 :10AB3000C068002801D1FAF77AFB3C000C6C0000D9 :10AB4000E068E169C068231C014AFFF7D7FB10BD2C :10AB5000DD6B0000B0B5051C0C210020FAF7D6FC17 :10AB6000041C006800214160016029880181698816 :10AB70004181291CFF312131201C03F03C00486C2D :10AB8000000077F9291CFF314631201C03F071F9D0 :10AB9000291CFF315031201C03F06BF9291CFF31B7 :10ABA0004331201C03F065F9291CFF316331201C5F :10ABB00003F05FF904480068002802D0201C3C0024 :10ABC000846C0000FFF78EFD201CB0BDE462010024 :10ABD000F8B5051C0C1C04D105211820FAF702FB5E :10ABE0004DE0291C12310622601CF9F725FC221CBD :10ABF00030320026002100201670344B1B5C2F8A57 :10AC00003C00C06C0000DF40FF0707D51778013318 :10AC100001371770671830377B70013101300E280B :10AC2000EEDBA87B6072107800282BD02A481E210A :10AC3000095C271C1037217201686181C189217765 :10AC400081893C00FC6C00007973C18AA181018B71 :10AC5000E181428A211C60314A80828A8A801F49B0 :10AC60002C31097A002909D002290AD10122626215 :10AC70006272428BA281808BE08103E001216662D7 :10AC800000E000213C00386D0000E87B084001D165 :10AC90000020F8BDA868431C09D0221C1232009283 :10ACA000931D0232211C01F09CFAA06200E0A66212 :10ACB000687B291C1D3120740B4820222062201C37 :10ACC0004230BE73F9F73C00746D0000C1FB4034A4 :10ACD0002670687E0449607068682C3148600120E5 :10ACE000DAE7000090580100C86E010091020100EF :10ACF00070B5161C0D1C041C002806D00C20FAF799 :10AD000047FD30C0083806723C00B06D000070BDD1 :10AD1000002070BD0000011C054880B5006801D00E :10AD2000012100E00021FCF7A0FC80BD00000C79AF :10AD3000010070B50E1C041C002801D1FAF78FFA2F :10AD4000064D2868002801D0FAF73C00EC6D0000A1 :10AD500089FA04482E60C4600121017070BD0000B2 :10AD6000A87E01003000070010B5074C20680028BD :10AD700001D1FAF777FA054800692168F9F7DFFA97 :10AD80000020206010BD0000A87E01003C00286E5D :10AD900000003000070001200549C00680B50860AA :10ADA0000022032154200CF0B8FC80BD00000010EC :10ADB000070080B500220421C4200CF0AEFC80BD49 :10ADC0000000044880B500880249FFF7B8FF3C0046 :10ADD000646E000080BD0000754B0000C874010067 :10ADE000F8B5061C31480025C0680C1C002830D07E :10ADF0002E482F4F0430007838762C4804304078A5 :10AE00003881002A0BD0F9F7A5FA1F20B876201C4C :10AE10003C00A06E0000F9F7F6F925480430807870 :10AE2000B87643E02548224984424D6902D26C43FA :10AE3000E40B0FE01F48211C806A0090F9F723FC07 :10AE40000099021C4A43A11A1A4A6943526AC90B63 :10AE500050433C00DC6E00004418022C01D8002056 :10AE6000F8BDF9F77DFA1F20B876201CF9F7AEF986 :10AE7000041C114804308078B8760F4F7D6AAC42CC :10AE800004D2201CFFF722FC051C12E0211C281C08 :10AE9000F9F7FCFB3C00186F0000061C6843201A01 :10AEA000FFF717FC051C002404E0786AFFF711FC8B :10AEB00045190134B442F8D3281CD4E70000C87403 :10AEC000010030000700C0C62D00011C7D2080B5A8 :10AED000C000F9F772FB3C00546F00000249886122 :10AEE0004008C86180BD0000C874010010B5064C60 :10AEF000211C00200BF042FA211C00200BF00AFA62 :10AF000000F068FE10BD0000856F000030B50F4DE9 :10AF10002A78042A19D8002A3C00906F000017D024 :10AF2000002107E04B005B185C190123E4568442C2 :10AF300002DA01318A42F5DC8A4200D10139480047 :10AF4000401840198178024A343A1170C078507024 :10AF500030BD0075010030B5111C3C00CC6F000005 :10AF6000383185B09162082111860023141C011C20 :10AF70005363C068154D0BE00268AA4206D1C2684F :10AF8000CA60C3600360FAF7D1FA03E0011CC0682D :10AF90000028F1D1221C4032082120683C000870B2 :10AFA0000000FAF764FB0B49201C4830029004941F :10AFB0000391E069828801686E2001920091221C51 :10AFC0005632035D211C28312068FFF758FA05B07E :10AFD00030BDA07E0100D57000001CB507493C00C3 :10AFE00044700000021C01900091C069131C848809 :10AFF000016810684833221CFFF708F91CBD0000E7 :10B00000C96F000010B5141C184803F089F8A0425D :10B0100001D0FAF745F90422201C4030A16AF9F763 :10B020003C0080700000BDF9002802D101202062A0 :10B0300005E0002020628420005D002803D1201C50 :10B0400009F023FB05E02068FAF779FA201CFAF7EB :10B05000A4FBE0698079062806D1206A0649002809 :10B0600003D03C00BC70000008690130086110BDCD :10B0700048690130486110BDA06A010028610100E3 :10B080001CB5141C154803F051F8A04201D0FAF782 :10B090000DF9201C4F300279417900AB12021143A7 :10B0A000C27812043C00F870000011438278120646 :10B0B0001143009101784078090208439880201CD0 :10B0C000694606F03CF9002803D1201C09F0E3FA98 :10B0D0001CBD2068FAF739FA201CFAF764FBF7E781 :10B0E0000000A06A01003C0034710000BCB51F4D97 :10B0F000141C281CDC3003F01FF8A04201D0FAF722 :10B10000DBF8A06C00AB027881781202114302795F :10B110001204114342791206114300918179C079DA :10B12000000208439880201C3C00707100006946B2 :10B1300006F00BF9002817D001280ED1ED6C002D78 :10B140000BD08020025DE06C0121002800D100219D :10B1500060686B460A30F9F723F92068FAF7FBF9C3 :10B16000201CFAF726FBBCBD201C3C00AC71000083 :10B1700000F08EFEFAE70000C4690100BCB5041CB3 :10B18000406A0025002803D06068008B05072D0F5A :10B19000221C403208212068FAF77EFAA168019546 :10B1A0000091211C221C6032206850313C00E87163 :10B1B00000000D1CE36809F0E2FFE069806B0028E5 :10B1C00003D1FEF7E8FA002801D0182000E0102093 :10B1D000064901940091E169082309680A18211CB5 :10B1E0002831281CFFF787F9BCBD357100003C00F1 :10B1F0002472000010B5101C3830906204201086B4 :10B20000002050631068141C40320421FAF74AFAF7 :10B21000231C211C2831024A2068FFF7BDF810BD0D :10B22000657000000EB5C369021C9888054902923A :10B230003C0060720000019100901B6810689169E9 :10B240000322FFF7AEF90EBD0000257200000EB517 :10B25000021C0649102000900292131C01911068F4 :10B26000002270330021FFF79CF90EBD000025720B :10B2700000003C009C72000010B5031C002100205F :10B28000084C00E00131CA00A2589A4202D00B29B2 :10B29000F8D310BD0B29FCD2C90009190020087190 :10B2A000012010BD385801008CB500AB86211980F3 :10B2B000011C04483C00D872000006F0EEFE01902C :10B2C000684606F0FAF88CBD0000707C010010B5ED :10B2D000041C0D480D4994B00480062218310C302E :10B2E000F9F7FBF801A807F0A2F80C2009A94872A9 :10B2F00000AB1C8002213C0014730000684603F080 :10B30000DBFF049001A806F0D1F814B010BD0000D6 :10B31000587C010080B504F045FE05F053FA80BD6D :10B3200010B5194CE068002806D0611C0878002888 :10B3300003D14878FF3008703C005073000010BD06 :10B34000FF300006000E0870A1680029F7D0002821 :10B35000F5D10E4854308178002903D1C178FF31EE :10B36000817010BDFF310906090E8170F9D1A16904 :10B370000029F6D0808803F0D0FB3C008C730000DD :10B38000044A011C5C320C3205CA801AA269F9F722 :10B390001FF810BD447D0100F0B5041C4068002575 :10B3A0000179002285B0C907CB1769490133896A41 :10B3B000102905D36649C039086B01303C00C873B9 :10B3C000000008638EE021680E68F678B706FF0F6C :10B3D000B609002B049706D063691F1C1B6A5037FF :10B3E0009F4200D10125002D02D063691B6A04E051 :10B3F0003C23594F7343DB190433E3619F883C00BE :10B4000004740000002F70D09B79022B6ED0042BA7 :10B4100017D0062B69D10868A06108890438088113 :10B4200020680168043101604E4900295DD0049F05 :10B43000BA425AD14948221C1C3002F065FE05B0C0 :10B440003C0040740000F0BD0968251CCA794035F5 :10B45000261CEA738B79221C503213704B796036AC :10B4600053700B7993704B78D37009781171002168 :10B4700029721621B173616A002906D0018B090770 :10B48000090F3C007C7400002972B1811821B1734E :10B49000011C0A31201C06224930F9F733F8606894 :10B4A00014220188E982011D201C5830F9F72AF87E :10B4B000E88A30490840012189030843E8827089FD :10B4C0000F2108403C00B874000070812068018999 :10B4D00008390181206801680831016008210020D5 :10B4E000FAF783F8051C026820680821FAF7FBF8D0 :10B4F0002068FAF774F82149C5602FE030E0FFE7D3 :10B50000216860680A683C00F47400008023A2642B :10B510001E55E564557913792D025B1995792D0433 :10B520005B19D5792D065B19957812781202AA1845 :10B5300015040A892D0C083A0A8121680A68083224 :10B540000A60E169021C0A323C003075000001A863 :10B5500009680BF03EF9E0692B1C0168201C703073 :10B5600001AA0BF086F9094901226DE72068FAF774 :10B5700022F8201CFAF74DF970E7846A010068612F :10B580000100557200008FC7FFFF3C006C75000082 :10B59000417000007972000080B502218220F9F725 :10B5A00093FE80BD704700007047000070470000A8 :10B5B00070470000704700007047000070470000AF :10B5C00080B5C068F9F7FAFF012080BD3C00A8757E :10B5D000000080B50021FF20F9F779FE80BD70479B :10B5E000000070470000012070477047000070475E :10B5F0000000704700007047000080B506219920C8 :10B60000F9F765FE80BDB0B500250129124C3C005C :10B61000E47500000FD10AF00FFC00281DD06178FE :10B620003C235943091904310162611C416284625F :10B63000041C503406E000290FD13C2050432570F3 :10B6400004190434002C08D02068002802D02021DE :10B650003C0020760000F8F718FFA5800720A071B5 :10B66000B0BD6861010070B5041C002101F041FC0F :10B670006068002801D0216801602068002801D09E :10B6800061684160124E7068A04201D160687060CC :10B69000E0683C005C76000000280BD0002506E046 :10B6A000E068E900411814200BF0E2FF0135308812 :10B6B0008542F5DB0621201C4430F8F7E9FE206BBB :10B6C000002801D0F9F786FFE069002801D0FAF7D9 :10B6D000AFF870BD3C009876000058750100F0B5D9 :10B6E0001D4F059D3F6801261C1C331C002F00D0F8 :10B6F0002B1C1D062D0E002906D011780E23164F87 :10B700000918097A6B4310E02178002913D0FF3122 :10B710000DE0012901D93C00D476000001311170FF :10B7200011780E230F4F490811700918097A6B43DD :10B73000DB19595C21702178002902D11178002988 :10B74000EAD10948C068002805D02178301C0029BA :10B7500000D10020F0BD01203C0010770000F0BDBA :10B76000000018670100246701005C670100AC7CE1 :10B77000010084460020F0B5002909D011781A4E46 :10B78000B170194EB178717031700121316127E0CB :10B79000164E0123F15663465F683C004C7700006B :10B7A0000023F6560125CC0FB74200D90025002C06 :10B7B00001D0002DE8D10E4F3B69002B03D0002DA6 :10B7C00001D1167002E01C4301D111700120012447 :10B7D000002B00D000243C61002C02D03C00887774 :10B7E0000000711C397001E0FF3179700028D5D05C :10B7F0000120F0BD0000AC7C010090B50A4C002097 :10B8000093B0206103906846002108F084FD207AFF :10B81000022801D1E06B00E0206CE06101203C00D7 :10B82000C477000008F08AFD13B090BDF46E0100EB :10B83000F7B5051C88880C1C82B01F4F002800D16A :10B8400000270498002801D1F9F78AFD1B483B1C0A :10B850000068211C0268281C0092049AFEF73CF83C :10B860003C0000780000061C22D00321049802F05E :10B87000B8FF00281BD08078012103F0E4FFA088E6 :10B88000A18E484300040F49000C088003F081F9A1 :10B890000122002D00D10022011C0E200BF0C9FE58 :10B8A000002F3C003C78000008D10021281C02F049 :10B8B000BDFC03E00026281C00F00AF8301C05B08F :10B8C000F0BD0000C1A10000E4650100A87C0100FA :10B8D00010B5041CFEF738F80121002C00D100211E :10B8E0000E200BF03C0078780000DDFE10BDF8B5AE :10B8F000071C0BF094FAFDF7BCFE002602281E4D33 :10B9000001D02E70F8BDFDF73EF8041CF9F759FC84 :10B91000002814D0FDF777F8002810D002F0F9FBCA :10B92000002801D000243C00B478000000E0154C51 :10B93000331C211C072216200BF066FF687880213B :10B940000843687002F00AFC0028DED128788007DE :10B95000DBD4FDF723F9002805D12878C00702D5EC :10B96000FDF742F8D1E702F03C00F0780000CDFB93 :10B970000028CDD02878022108432870211C381CCB :10B98000FDF7C1F8C4E7606C01007102000010B55A :10B99000124C01202070FEF7F0F90121A068FBF79E :10B9A000F4FEA06803F087FF0D483C002C790000EE :10B9B000A16807F023FDFBF755FFE06800280DD0D4 :10B9C000094906200AF024FD084905200AF020FD57 :10B9D000FBF76EFF002801D005F0F8FC10BD000059 :10B9E0007869010034630100E13500003C006879AA :10B9F0000000B1350000F0B5244D234C687C203C9C :10BA00009BB0002808D0022803D820890138208163 :10BA100037E000276F7434E01C4E68221436311C66 :10BA20000C3101A8F8F709FE1848338901213C00C0 :10BA3000A479000044300A1C002B007B00D1021CBA :10BA40001206120E0DAF3A709446AA7B931930334A :10BA50005B7B7B70EA7301321206120E0027824272 :10BA6000AA7301D3AF7304E06246012A01D1776063 :10BA70003C00E079000000E071600648074A803829 :10BA800081674267682201A9F8F7DDFD278108F088 :10BA900012FD1BB0F0BD84660100E92E0000F1B577 :10BAA00086B006990020886106988468808D656854 :10BAB00001283C001C7A00004CD9354949680591A1 :10BAC000002947D00022002100230390281C96461D :10BAD000944606680496F2788026B2433F2A2ED810 :10BAE000D706FF0E0126BE40371C049E5209B678C9 :10BAF0007600B2183C00587A0000264E92001C36A0 :10BB0000B2583A401ED003E002900289C068511832 :10BB10000028F9D10598814214D870460130864634 :10BB2000002B04D06046D86001986246D06003982C :10BB30000138039006D03C00947A0000231C24684E :10BB40006068029A01909446C9E77046012807D9B7 :10BB50002A1C00213F2001F051FF051C0698856139 :10BB6000281C01F0B3FF0E480068002807D02868A1 :10BB7000018840790231091A3C00D07A0000281C63 :10BB800001F0E5FCA2680698C06806990B69291CBB :10BB9000F8F77CFC034908690130086107B0F0BD83 :10BBA0000000FC5A0100CC5C010010B5094A80007D :10BBB0001258D006C00E0130074B3C000C7B000031 :10BBC0001C68002CFCDB5A602022121A914019607C :10BBD00019680029FCDB10BDE86001003020070077 :10BBE000B0B5124C00252570A168114807F032FC51 :10BBF0006561FBF7A3FEE06800280DD03C00487BA0 :10BC00000000FBF7A4FE012107200BF070FD0A499C :10BC100006200AF04CFC094905200AF048FCA068FF :10BC200003F067FE0021A068FBF7CDFD05F0ABFB3C :10BC3000B0BD7869010034630100E13500003C00CB :10BC4000847B0000B135000010B50F4C207C00282B :10BC500019D16069002816D1E068002806D00A488A :10BC60001C38C068002801D005F0CEFB0121072058 :10BC70000BF040FDA06803F03FFE0448A16807F008 :10BC80003C00C07B0000DBFB0120207010BD786908 :10BC900001003463010070B50E4C0122A368E56811 :10BCA000268A5D1BB54201D1002206E025680133DA :10BCB0002E68A3602660043503C5002A04D1012143 :10BCC0009D203C00FC7B0000F9F752FB70BD03494E :10BCD0000220086070BD000044E30100402007001E :10BCE00080B502F0B9F880BD80B502212D20F9F7AA :10BCF0003FFB002080BD000080B502212A20F9F71B :10BD000037FB00203C00387C000080BD000080B57F :10BD100001212B20F9F72FFB022080BD00000149F3 :10BD20000120086170477C780100F8B5061C0C23DF :10BD30000F1C1749584345186C68301C0BF03FFE28 :10BD4000002F09D1301C3C00747C000003F0EEFE93 :10BD5000412007551148211CFFF7A6FFF8BD4120DF :10BD60000755A06B002803D0201C00F0DFF9F5E791 :10BD7000201C00F0DBF9AC68002C02D00020A86089 :10BD8000EDE7301C05F034F93C00B07C0000041CE9 :10BD9000E8D108210C20F9F7F4FAE3E70000607B12 :10BDA000010055800000074A80B55070516012783C :10BDB000064B80005201D218101840380268081C47 :10BDC000F8F77BFB80BD786901003C00EC7C00004B :10BDD000FC420100B0B50A49041CC870084DE435A6 :10BDE000A87A0871082C01D3F9F7FCFAA87A05495A :10BDF00040014018A1004058F8F760FBB0BD0000BA :10BE0000606C01008043010080B500283C00287D63 :10BE1000000001D009F01DF980BDB0B5051C0C1C57 :10BE200000200860686809F036FB6C60B0BD10B592 :10BE3000041C09F034FB2168002900D1646010BDA6 :10BE400000000021016040607047F8B546683C0082 :10BE5000647D0000041C406A351C0A35002804D0AB :10BE6000201CF9F789FD071C00E00427291C6069E4 :10BE700000F0F6FC79000F18BA88F18A051C8A4296 :10BE800005D13088000502D504F0BEFB3CE02868EF :10BE90003C00A07D000000280FD001328A4204D16E :10BEA000F9F70FFC2168C1600BE0F9F7F0FBF08AAD :10BEB000000704D00021296029E0080727D1206865 :10BEC0002860F08AB8801348016801310160318828 :10BED00049053C00DC7D000018D429682160002160 :10BEE0002960E16900290DD0897902290AD1082148 :10BEF0002186211C3831A162221CDC30084902F065 :10BF000081F9F8BD201C00F05FF8FAE7201CF9F772 :10BF1000EFFCF6E73C00187E00002068F9F7BDFB57 :10BF2000F7E7C4690100B9710000F8B50F1C097882 :10BF30000124C90721D502F08CFF002801D000247C :10BF40001BE00E4E756E002D17D0346E0622311C8C :10BF5000381CF8F7D4FA3C00547E0000002805D1C4 :10BF60000120002C00D00020041C03E0013D063617 :10BF7000002DEED1002C03D1024EB06E0130B06620 :10BF8000201CF8BD1079010030B5051C00200649C1 :10BF900000221C23CC56AC423C00907E000001D114 :10BFA000081C30BD01324831012AF5D330BDCC6DBB :10BFB000010010B5084C00221C235343E358834270 :10BFC00004D11C20504300190A6010BD01320E2A12 :10BFD000F2D3002010BDDC7101003C00CC7E0000DB :10BFE000F0B5416895B0071C90371391041CF878A0 :10BFF000251C8035C6072879F60F4A4902284DD1FD :10C000000A6D002A4AD04868013048600AF058FF9B :10C0100044490861486113990979C9073C00087FC0 :10C02000000001D441498861206806220690A16879 :10C0300003A8F8F7EEFA062204A80230E168F8F740 :10C04000E8FA07A806222169F8F7E3FAB87808ABFE :10C05000002198700C96636A201CA0300A1C3C00DA :10C06000447F0000002B02D0028A5207520F08AB17 :10C07000DA7000AB998413990988C90BD984696B6C :10C0800010AB1091A96B1191808B29491881096D12 :10C0900003A8F8F732FA2979686B0BF04DFD29797E :10C0A0003C00807F0000A86B0BF067FD3DE000289E :10C0B00038D1486D1490002834D0206806220390AF :10C0C000A1686846F8F7ABFA062268468018E1686E :10C0D000F8F7A5FA05A806222169F8F7A0FA0021C9 :10C0E00004913C00BC7F0000B97808A810AB017235 :10C0F0000896E9680B9169794172686B0E90A86B9C :10C100001090288DD880688D1881E1690CA80029CD :10C1100004D089790170206A0D9001E00721017037 :10C12000684614993C00F87F0000F8F7EFF902E048 :10C130002068F9F7CAFA201CF9F7F5FB15B0F0BD35 :10C140000000C4690100B0B5041CC0680622018962 :10C150000C3101810568211C0C3D0560A818F8F719 :10C1600064FA0622A1183C0034800000281CF8F76D :10C170005FFAA08F0009E062206303480169201C78 :10C18000F8F7C7F9B0BD00007C790100F8B5061CCE :10C190006036051C707A0C23254958434418A86B57 :10C1A0000027002806D0A0783C00708000000128FD :10C1B00003D1A770707A0AF0B6FD2A1C0C218020EA :10C1C0000BF095FBA86B002833D0A07802280BD089 :10C1D000042822D1A7702F1C4037787802280CD170 :10C1E000707A0AF0A0FD18E003203C00AC8000004B :10C1F000A0701249002014390969F8F790F90FE08E :10C200002C1C07E078784121221C08550C21802045 :10C210000BF070FB6034607A04F020FF041CF1D155 :10C22000707A4035A98B0002090909043C00E880B6 :10C2300000000843812101430C200BF0A0FAF8BD57 :10C240000000607B0100F8B51C49051C886A0130BC :10C250008862281C0BF07DFD041C11D02B1C2033A0 :10C260001E1C5A79201CB4301979144FFDF73C007C :10C270002481000089F8AA7A201CB830B179FDF732 :10C28000B9F8002F04D101212868FAF76DFAF8BD3A :10C290006068BC21C08A085328680021FAF764FA54 :10C2A000002809D00649C86A0130C862002CEED0C7 :10C2B0003C0060810000201CF9F747FBEAE7201CE6 :10C2C000F8F73CF9E6E7C4690100A1FF0000F8B502 :10C2D000164C051F0022211CA03103E02868A04253 :10C2E00009D02034A142F9D1002A04D102218E20A4 :10C2F000F9F73C009C81000083F8F8BD0D4FBE7932 :10C30000606901306061F8F797FDA84207D1A08805 :10C310000430F8F797FDE0690130E06105E020683E :10C3200028602560A0690130A061BE71E5E70000CA :10C33000D05C01003C00D8810000201007000029DB :10C3400001DB062901DB02207047064BC9005A5C5D :10C35000C91802704A7842708A78827049684160D0 :10C36000002070470000CC5A0100B0B50D1C041C21 :10C37000052801D3F9F73C001482000075F8104835 :10C380004068002800D00324102D00D30F2506207C :10C390000B496043123140184178807849190906E9 :10C3A000090E884200D2011C01208840054901384D :10C3B000096808400004000C3C005082000002F0B4 :10C3C00044FEB0BD0000D47A010008200700B0B5DB :10C3D000041C0D1C09F0CFFD002803D1201C09F01E :10C3E00082FD0561B0BD80B50AF097FD034A0C32AD :10C3F00006CA8918081A80BD00003C008C82000023 :10C40000A07D010070B50B4C049E64680DE065686A :10C41000854209D1207A0870E068106020691860B0 :10C42000207D3080012070BD2468002CEFD10020D9 :10C4300070BD0000A46E010010B5041C3C00C88251 :10C4400000002030817B20690430FDF764F9011C75 :10C450006220025B636A4034207802F0CEFD10BD9A :10C4600000000B4910B508888A690A2350435843D5 :10C470000ED0084A53899488D2881B1952043C0074 :10C4800004830000520C9A18C96806324A430A21F4 :10C490005143F8F7FDF910BDC874010030000700E2 :10C4A00010B5431C01D1104810BD0F4A0E4B943AF1 :10C4B0001268443B1B7A10E0546884420CD1002976 :10C4C0003C00408300000FD1022B03D1D47B022C0F :10C4D0000AD204E0002B05D1D47BE40704D412680F :10C4E000002AECD1002010BD101C10BD0000386FD8 :10C4F0000100011C0120012900D00020704700B577 :10C50000021C3C007C830000FDF7CEF8002808D018 :10C51000101CFFF7F1FF1823034958434018006926 :10C5200000BD002000BD00009467010080B5002818 :10C5300000D10848074900685031097A002902D023 :10C54000022904D13C00B883000000E0012100F082 :10C5500006F880BD002080BD0000A46E0100124AD4 :10C56000124B127A2C3B002A03D15A68002A18D1A8 :10C5700004E0022A02D19A68002A12D100207047F2 :10C58000C27B8A4201D03C00F4830000032A0AD116 :10C59000827E012A07D1027F01321206120E027733 :10C5A000C37E9A42EED200680028ECD170470000AA :10C5B000F46E0100F7B58446002001270024002511 :10C5C00088B007E06246525D3C0030840000002ADB :10C5D00005D0AB006E46F25001358D42F5D3002DEB :10C5E00000D00120002828D00027164C6E4622E0FB :10C5F000201C00F030F8012801D0072806D10021C6 :10C60000201C00F034F8316888423C006C84000043 :10C6100001D2022714E02068C9000C18083C201C35 :10C6200000F01CF8072807D10120012D00D00020C0 :10C630002468002800D10834013D0436002DDAD1E9 :10C640000A9804600BB0381CF0BD00003C00A884C0 :10C650000000205201000068002901D08002800AF9 :10C66000704710B540688000440F082C03D30221A6 :10C670008720F8F7ECFE201C10BD002902D00068CE :10C68000800D704740688005800D704700003C00B9 :10C69000E484000010B540684001440F052C03D32A :10C6A00005218720F8F7D6FE201C10BDF8B5051C23 :10C6B000880A00901C488E05C069B60D171C1C1C0A :10C6C000002805D1184881698D421DD0856111E08F :10C6D0003C0020850000FDF7E8F8154909780E298F :10C6E00007D1002805D0114950310623C956F9F762 :10C6F00006FA0E490020C8618D61291C201CF8F73C :10C70000E2F87943201CF8F7DEF808484161201C64 :10C7100000993C005C850000F8F7D8F805484069AE :10C720000A18A24201D2401801E04018001B800202 :10C730008019F8BDAC7C010011670100F8B50F1C31 :10C74000061C141C1D1C07F0A1FC0E2809D1201C7E :10C7500002F0FCFB3C0098850000002804D008484B :10C76000007802F0E4FB041C0121002EAC7200D022 :10C77000391C201C02F007FC2860002028726C7213 :10C78000F8BD90570100031C0A4810B50024021C94 :10C79000A03203E081883C00D4850000994209D290 :10C7A00020308242F9D1002C04D102218E20F8F7EA :10C7B0005DFE002010BD0000D05C0100FFB5061C2E :10C7C000002081B010601F1C0125141C301CFFF7D5 :10C7D0006DFF052812D202A33C00108600001B5CEE :10C7E0005B009F440000030303030800391C301C56 :10C7F000FFF755FF03E00298F8F7EBF801302060EF :10C8000004E005218720F8F734FE00252068802801 :10C8100004D906218720F8F72CFE3C004C86000046 :10C820000025281C05B0F0BD70B5174C606C0028C1 :10C8300001D001201DE0164E144D3188A06C002857 :10C8400008D02878814205D9F8F74CF80138FAF772 :10C8500051FE0EE0E06C00280AD000203C008886E3 :10C860000000FAF74AFE29783288914204D99042B2 :10C8700002D9101C00E0081CFAF7DFFDE16B441A36 :10C880000AF081FB201A00D5002070BD0000447D15 :10C890000100F8600100FC600100FFB5274E3C007C :10C8A000C4860000041CB0790F1C151C81B00090D8 :10C8B0000AF06CFBC11923480768002F05D10A2133 :10C8C0008020F8F7DFFD05B0F0BD1E4840688446C3 :10C8D000002801D100220EE082680368AB4207D134 :10C8E0003C00008700000379A34204D10B21802083 :10C8F000F8F7CBFD23E0C0680028F1D1134BF868AE :10C9000018603D603C71B96004988D1A38616046CA :10C91000002305E08468A41AAC4203DA031CC06853 :10C9200000283C003C870000F7D1F860002B08D1BC :10C9300007483B1C47600848064A00880AF08AFB03 :10C9400000E0DF600098B071C3E70000201007002E :10C950007C5D0100213801002C740100F3B583B027 :10C96000041C09D03C0078870000201C049909F0C1 :10C970008EFB002803D0201C303005B0F0BD0AF03B :10C980000EFB1E4A0026049F019600900292029C14 :10C990000025391C201C143002F0C5FA002801D0F3 :10C9A000261C03E001353C00B48700001C34042D34 :10C9B000F2D3002E22D10198134F013001900228AA :10C9C000E8D30121C906029A00201369009CE31AEA :10C9D0008B4201DD191C161C01301C320428F4D3D3 :10C9E0003068002801D0F8F73C00F0870000D3FE43 :10C9F000301CFDF74AFF301C143006220499F7F76B :10CA00007AFE009C301C3461BDE7306A010034427C :10CA10000100094910B54C6903E0E168814203D087 :10CA20002468002CF9D101E0002C3C002C88000087 :10CA300003D102210220F8F737FD201C10BD0000B1 :10CA4000FC5A010010B5C30706D5084B5C690C43BE :10CA50005C611C7E14431C76800706D5044843693C :10CA600019434161017E1143017610BD3C00688885 :10CA70000000FC5701001858010070B50D1C041C83 :10CA8000161C00F008F8A007C0170130321C291C42 :10CA900000F021F870BD10B5C30706D5084B5C69DE :10CAA0008C435C611C7E94431C76800706D53C0059 :10CAB000A4880000044843698B434361017E91438D :10CAC000017610BDFC570100185801000322111F08 :10CAD00080B5012000F002F880BD000030B5151CC3 :10CAE0000C1C002887B002D01C22224901E02249F8 :10CAF0003C00E08800001C226846F7F764FE0599B8 :10CB000000AB1A7E8C43201C9543029A291C0240DC :10CB10000292019A02400192009A02400092039A06 :10CB200002400392987C08409874587C08405874DE :10CB3000187C3C001C89000008401874D87C084010 :10CB4000D87402991048416101AA06CA91438161D3 :10CB50008168019A114381608168009A91438160E4 :10CB600000AA06CA11434268114341604168039A12 :10CB7000914341603C005889000004A80BF001F883 :10CB800007B030BD0000FC5701001858010010002C :10CB9000070010B5041C011C012008F0E0F9002C6E :10CBA00002D003F01CFF10BDFEF7D1FC10BDF0B5A4 :10CBB0000C1C010E01233C00948900001B06090691 :10CBC00099429FB028D11749084000211A2800D364 :10CBD0000221002919D1C500134F10A8EE19B288FF :10CBE0002168F7F79DFD201CF8F7EAFD7A5901A9A5 :10CBF00010A8F7F707FD00283C00D089000005D0F9 :10CC0000109801A90190B07900F09DF81FB0F0BD17 :10CC10002A20F8F75EFC201CF8F7D5FDF6E7032183 :10CC20002A20F8F756FCF1E700007FFFFF002445BB :10CC3000010010B50C1C802802D03C000C8A0000BA :10CC4000812808D103E0201C00F006F910BD201C4B :10CC5000F8F7BCFD10BD03212C20F8F73DFCF6E7EA :10CC6000F0B50C1C00218BB00A91010E01231B06AC :10CC7000090699422AD118490840061C3C00488AF6 :10CC80000000062E01D3072124E02089F8F7F1FEE9 :10CC900022892168051CF7F74CFD201CF8F799FD47 :10CCA000F4000F4E281C0AAA69463359F7F7B4FC62 :10CCB000002801D0012807D12868694600903C006F :10CCC000848A0000A01900790A9A00F009F9281C4A :10CCD000F8F7B0FE0BB0F0BD01212B20F8F702FCF5 :10CCE000F8E700007FFFFF00284601000A1C010E44 :10CCF00001231B060906994280B508D05B009942C2 :10CD00003C00C08A00000BD10006000E111C00F090 :10CD10000EF980BD05490140101C05F0A2F980BD47 :10CD200001212D20F8F7E1FB80BD7FFFFF0080B5DA :10CD3000011C0F2000F013F880BD80B5011C0420F9 :10CD400000F03C00FC8A00000DF880BD80B5011C9D :10CD5000172000F007F880BD80B5011C012000F00D :10CD600001F880BDF8B5041C061C802084430F1C0C :10CD7000192C01D3F8F7EAFB0848045D211C0020B8 :10CD8000F8F750FD3C00388B0000051C221C391CB4 :10CD90000068F7F7DAFC2A1C311C0720F8F711F9B4 :10CDA000F8BDF4450100F8B50D1C161C041C1F1C31 :10CDB00008210020F8F739FD142201680E4B724358 :10CDC000D2180C71127C3C00748B00004A710D600B :10CDD0000B4A8F7112687F2A03D95205520E8023A5 :10CDE0001A43CA71074A0023516801315160021C7D :10CDF00081210020F8F708F9F8BD00007440010017 :10CE0000FC5A0100806E01003C00B08B0000B0B500 :10CE1000041C08210020F8F70EFD218BE27D051C83 :10CE200009055207520F490C006811438180A17D0A :10CE300014230E4A59438918097CC171E16A0160C3 :10CE4000E168281CF8F717FC0A483C00EC8B00004E :10CE50000068002801D0F7F7F1FB07490431886822 :10CE60000130886000212A1C0020236BF8F7D2F8DB :10CE70000120B0BD744001007C6E01000148806853 :10CE800070470000806E010010B5041C3C00288C27 :10CE9000000092B0016868460822F7F762FC00AB18 :10CEA00098884007400FD87798884004000D188470 :10CEB000D888588400980D900594208908382081DE :10CEC000059801680831016000200A900C903C0030 :10CED000648C00000021112009F078FB0549064A06 :10CEE000086801300860022102A801F0CDFC12B0F0 :10CEF00010BD0000806E0100558B0000021C012057 :10CF00000006084380B52B210AF08AFD80BD000091 :10CF10003C00A08C0000F7B5041C061C8020844354 :10CF2000171C062C01D3F8F726FB0B48055D291CBE :10CF30000020F8F78CFC041C006801992A1CF7F704 :10CF400016FC391C201CF8F7A2FB221C311C002304 :10CF500002203C00DC8C0000F8F768F8FEBD000001 :10CF6000204601000A1C011C80B500230120F8F7AF :10CF70005DF880BDFFB59FB01F1C051C0A301E90D8 :10CF80001CAA1DA90AF000FF002871D0002F09D0AB :10CF90000A2100203C00188D0000F8F75EFC0668AE :10CFA000041C301DFAF7AFFA05E004210020F8F761 :10CFB00054FC0668041C28893649012208807080C8 :10CFC000E88814A9308019A8FCF7F5FCFCF7FFFBF2 :10CFD000011CFF3121313C00548D0000201C01F068 :10CFE000EFF819A9201C01F0EBF814A9201C01F09E :10CFF000E7F8201C2099FDF74BFD0022022101F0EB :10D0000033FD061C1C9900208861301CF8F71CFABF :10D01000002E0BD0307A00283C00908D000002D00A :10D020004021084330721C980222816911438161BA :10D0300004E01C9902228869904388611DAA06CAEF :10D0400001A805F058FB09A8002F02D00222427265 :10D0500001E000214172049401A83C00CC8D000045 :10D0600004F07AFB01211C9808F0C8FF002F04D0BF :10D070001C980122816911438161A8881C9C01F0E0 :10D080009FFE021C211C00E004E00748408809F0D4 :10D090001FF804E03A1C00210520F9F73C00088E37 :10D0A00000009BF8002023B0F0BDFC600100987CDC :10D0B0000100F8B5041CC0680568A01D01F095FFCB :10D0C000002845D0211C1431201C6A460AF055FE68 :10D0D00000283DD0FCF77DFA002839D100983C00AB :10D0E000448E00004B21095C012934D1042609F04B :10D0F00019F9688800281BD1A8880321890388436F :10D1000015490026088001220221206901F0B8FC9F :10D11000041C14D000988069800710D5F8F79AF99C :10D120003C00808E0000201CF8F7DDF8002809D1B3 :10D13000F8F77FF901260098022281699143816105 :10D14000002101E00098022108F061FF0098806949 :10D15000A988C207D20F301CF9F745F8F8BDFA606C :10D1600001003C00BC8E00001CB5046900230022B5 :10D17000002C13D14B24245C022C03D1022905D0AE :10D18000012203E0022901D101220123002A05D056 :10D19000009004200193694609F036FA1CBD000096 :10D1A000B0B5041C3C00F88E0000F2210F200C4D9D :10D1B0000AF099FB287808280BD201A31B5C5B00BE :10D1C0009F440703030808080808002C01D105F054 :10D1D000BCFBB0BD012CFCD1FF2007F038FAB0BD7C :10D1E0000000746601003C00348F00008CB5054AD5 :10D1F00000AB1172009019716946082009F00AFA13 :10D200008CBD0000AC7C0100F3B5041CC06806278F :10D2100085B0066809F026FF984948632069032114 :10D2200001F008FC964D00283C00708F00004DD0A6 :10D230009549403109798078814247D1012120699F :10D2400001F0FBFB02902069322101F0F6FB019016 :10D25000021C8D480299FCF746FF002836D00023B7 :10D260008A480299019AFCF7E4FE3C00AC8F00006A :10D270000B282ED1864A51887089414003910B1C9E :10D2800084490B4025D150800399171C00290BD0ED :10D290000399480502D5381CFCF740FE039988061F :10D2A00002D5381CFCF724FE2A2120693C00E88FB7 :10D2B000000001F0C8FB00280DD08078E9698142A8 :10D2C00009D0E861381CFCF716FE381CFCF707FE95 :10D2D000381CFCF726FE0027201C20300490407AE2 :10D2E000082871D10AF0D1FC0020686100233C00BD :10D2F000249000002B61A86866490130A86030893D :10D300005C31888201F07AFD62495C310861226AF1 :10D3100004981821007A01F033FEE16A4018039066 :10D320005C48006A00280DD0002F0BD1594801231A :10D330003C00609000005C3001681B0700223068F0 :10D3400009F049FF002800D105270021A06B0AF051 :10D35000CEFC0021206C0AF0E8FC4F4B03CE039A70 :10D360005C33FCF788FD00204C4E0521B06320693A :10D3700001F03C009C9000006FFB011C01D1F060AB :10D380001CE00120F0608878454A01321070C878AE :10D390005070474A1070306900280AD04A780879DE :10D3A000053109F0DDFA3169F7F785F9F0680028F1 :10D3B00004D03B4A3C00D89000000132107800288D :10D3C00008D10020A861716A002903D0201C143004 :10D3D000F7F774F9344A5C321069316A411800E099 :10D3E00020E00A23D0680A2209F0FBFE002807D0BB :10D3F0002D4A316A5C323C0014910000D068401A1A :10D400001169401A7060294A5C32D0683062F06954 :10D41000002804D0FAF700FD0120FAF7A1FCFAF782 :10D4200081FC2748006803F007F90698002803D11B :10D430001E4E0023B36016E03C00509100001C4ECD :10D440000120B060069801684068B06519487165B0 :10D450005430C088002809D0B169002906D001F0F5 :10D46000DCFC011CE06AB269F7F72FF9002F15D137 :10D4700012480169002908D101213C008C9100006B :10D4800001612A68002A03D000210020F7F720F963 :10D4900009490023CB622B616B6106F0B5F807B038 :10D4A000F0BD6B680648002BF9D0021D111C381C1A :10D4B000F7F70FF9F3E70000447D01003C00C89145 :10D4C0000000F4680100F467010003080000F86040 :10D4D0000100C467010008B5F8F72FFD009000AB0C :10D4E000188800280CD005F050FF00AB5988188828 :10D4F00005F06DF9FEF797F80320FBF70EF83C00F6 :10D500000492000008BD0120FFF7B2FB002008F0E4 :10D510008DFEF7E7F8B54F498C68206A00680578FA :10D52000FCF768FA002812D02A07920F0121012A7D :10D5300000D00021002903D02906090F0B2906D1AC :10D540003C00409200002A21095D08189030007BC1 :10D55000F9F70DFC414F3C3FB86B796BF7F7C0F81A :10D56000A06C0026C660606B800804D0B8690130EA :10D57000B86106F0DCF9394D28698005800F08D1C3 :10D5800078693C007C920000042101307861606B76 :10D590004008400008436063B86A002803D0606B0D :10D5A000082108436063201C203000903968F7F799 :10D5B0009AF80320000228602B498868A063C86895 :10D5C000E06308793C00B8920000C006C00E251C3C :10D5D000403528714879687123483C384662009884 :10D5E000807A01F05EFD00210028214A01D01178E7 :10D5F00003E09378DB0700D55178A971002804D0A7 :10D600001B49143108683C00F4920000206400E0DB :10D610006E80B86AC00702D5FF202871AE71E6613E :10D62000B8680130B8607968884203D00B21852042 :10D63000F7F7C4FF0D498868C06C8860FB6A002B4F :10D640000CD00E4AD47B002B3C003093000002DD4E :10D650007F2C05D201E0002C02D0D47BE318D373D9 :10D66000FE62C968884203D105218520F7F7A9FF2A :10D67000F8BD247E010000400700A0800700E8807C :10D68000070040000700FEB5304C3C006C930000E2 :10D69000A06B216BF7F733F82D493C318E68708B06 :10D6A000062804D2E0690130E0610E203085284967 :10D6B0003C310D68002D03D103218520F7F784FF4D :10D6C000244845613562318DEF6804393C00A893E8 :10D6D00000000C0401210291240C002101911D483D :10D6E0003C30808AA04203D32C81EE6000240BE002 :10D6F000002F04D103218520F7F769FF04E03D1CCA :10D70000201A0404FF68240C0298002804D03C006E :10D71000E493000012490120086100200290019862 :10D7200001300190002CDDD10C480C4C3C300760DE :10D7300001983065B564306A0068606260680130E5 :10D740006060A1680131884203D00A218520F7F783 :10D750003C002094000041FF04480068A062FEBD28 :10D760000000E87D010000300700786E0100B0B5D0 :10D77000051C01210F200AF0F8F8F2210F200AF011 :10D78000F4F80C480C4C0068143C00280CD0E078ED :10D7900001283C005C94000009D00122291C0F20C4 :10D7A0000AF0ACF86078022806D0012003E0607827 :10D7B000022801D000206070B0BD00009866010012 :10D7C0000222002880B500D1032203490E200AF06E :10D7D0009BF800203C009894000080BD000050C3DE :10D7E0000000F8B50023002200282ED00689046826 :10D7F000751E2D04B61AF6072D0CF60FB4460EE072 :10D80000A75CA618023300977778A7540232120457 :10D81000009F120C00293C00D4940000777001DDB9 :10D820008B4215DAAA42EED3C068002810D00289D4 :10D83000002AF9D06246002A0BD00268665D17788C :10D8400002336755167001220029D2DD8B42D0DBEE :10D85000F8BD0022CDE700003C0010950000B0B5F7 :10D86000041C0D1C0120F8F75EFB0D490028C8615F :10D8700014D062684260A27C0272A268C260E26850 :10D880000261228A02750A1D0A621268002AFFD10B :10D89000026048600020A86001203C004C95000018 :10D8A000B0BD0120FAE70000A46E0100B0B5041C71 :10D8B00040680D1C431C02D1211C094808E00020CF :10D8C000F8F734FB064994390861002803D0211C7D :10D8D00000F048FE00E00120A86001203C0088958F :10D8E0000000B0BD0000386F010080B50121972015 :10D8F000F7F785FE002080BD000038B50A1C143201 :10D900000092131F051C083A0C1C16314068FEF7E4 :10D910006CFE002801D0002000E0012069683C0076 :10D92000C4950000A0606160012038BD10B50C1CDA :10D93000017A00290FD0012909D0022903D1002141 :10D9400000200AF073FC00202071012010BD416806 :10D9500001200AF06BFC00F00DF9F4E780B50449F2 :10D960003C000096000048680138486001D107F08B :10D970006EFB002080BDAC790100B0B5051C0C1C0D :10D9800000F04FFEA060686860600120B0BDB0B5D7 :10D99000051C0C1C00F06FFEA06068686060012030 :10D9A000B0BD3C003C960000081C00210022002372 :10D9B0000EC008C001207047F8B50F1C041C207968 :10D9C000202801D2202020716679002E02D12579ED :10D9D00000220DE02579291C301CF7F74FF80029AB :10D9E00001D1321C3C007896000004E0704380199D :10D9F00005062D0E321CE079291C00F0F2F9207A80 :10DA00002F49C007C00F08602E480078C00743D5D3 :10DA1000A1792C4AC80748D42C4E16608B072B4896 :10DA200008D5CC0801233C00B4960000A340036055 :10DA3000490704D52849116001E0402101601368BD :10DA4000264AB34210D1546801680C4354601468EC :10DA50000C4001D0516100E0916154680C43546066 :10DA600094682143916013E03C00F0960000547CE0 :10DA700001680C435474147C0C4003D0147C0C4398 :10DA8000147402E0147C8C431474547C0C4354745E :10DA9000947C21439174B34205D100220168032094 :10DAA000FFF78DF809E0006800213C002C9700008A :10DAB0000206120E0320FFF785F801E00B48106004 :10DAC000002038717D71F7F7E9FD0120F8BD0000F5 :10DAD000CC5C0100040007005C5B0100B99B000006 :10DAE000585B0100959B0000100007003C00689700 :10DAF0000000559B0000B0B50D1C04300024FEF75B :10DB0000D6FA01206C60B0BD0000F0B5077A43681A :10DB1000041C0E480E1C00680125011C9BB006E089 :10DB20004A689A4202D18F76002502E009683C00DB :10DB3000A49700000029F6D1002D05D1217A0129F2 :10DB400002D101A9F8F7A8F86068043621C61BB015 :10DB50000120F0BDA46E010010B50C1C08F0AEFC55 :10DB60006060012010BD000010B50C1C07F084FAA5 :10DB70003C00E097000004F054FF002060600120AA :10DB800010BD0020C043486001207047000010B560 :10DB90000C1C0079FAF707F8002801D0002000E0FB :10DBA00002206060012010BD00001CB5064C2068FA :10DBB00000283C001C98000007D009F0C5FA01902D :10DBC000206841686846F6F7D6FD1CBDAC790100B7 :10DBD0000149086070470000AC7901000EB5064BA2 :10DBE0001B68002B06D00290009101926846D9680C :10DBF000F6F7C1FD3C00589800000EBD0000AC795E :10DC000001001CB5041C07F04CFA064841680131BC :10DC10004160009400210191006801686846F6F7B0 :10DC2000ADFD1CBD0000AC79010080B5F8F7A3F88C :10DC300080BD80B5021C3C00949800008021032028 :10DC400000F05CF8011C034800224369F6F79BFDD5 :10DC500080BD0000A46D0100F8B50C1C1349051C23 :10DC60000868161C0130086000202061221C103258 :10DC7000281D0021071C00923C00D098000003F0F2 :10DC8000DEFE20712069002810D00104090C00205C :10DC9000F7F779FE3060291D03C9A060E1603068A4 :10DCA0000168009A381C03F0CAFE20710120F8BDFB :10DCB00000001075010080B5021C3C000C990000AA :10DCC0000821042009F04EFF032080BD10B5074A4B :10DCD0000C1C516801315160011C1031C2680430C4 :10DCE00003F0F0FE2071002010BD0000107501004F :10DCF000044980B581610821021C03203C00489939 :10DD0000000009F032FF032080BD95D80000F7B570 :10DD1000071C161C0621002082B0F7F73AFE051CEE :10DD200020480078062800D928812C680020A77098 :10DD30000399E170311C03E00A8910180F1C3C00A4 :10DD400084990000C9680029F9D16B4601AA211DF8 :10DD500000F034F800AB187860711878002817D0FC :10DD600011484068002808D019780020F7F714FE01 :10DD7000011C381CF7F730FD0AE03868002802D192 :10DD80003C00C09900003F600120B86100AB1978E9 :10DD900038894018388100AB9888311C02382080BF :10DDA000281CF7F71CFD281C05B0F0BD0000C85C5E :10DDB000010001794279008889180239401A7047B8 :10DDC00000003C00FC99000070B5084D2C78AD783F :10DDD0002018061C002D03D070190138013DA843FE :10DDE0001080801B18700C7070BD0000C85C0100B2 :10DDF000B0B504680C4A218852780231914211D2A0 :10DE0000551AF7F73C00389A0000C9FD016800294F :10DE100002D10060012181610189491901812088B5 :10DE200040192080607940196071B0BD0000C85C65 :10DE3000010080B500220621F12009F0A2FE80BD7C :10DE40000000031C02483C00749A000003704170FB :10DE500082707047C85C0100B0B5081C0968151CC9 :10DE60008C78F7F785FD0449A0000958002902D0F5 :10DE7000281CF6F79EFCB0BD846D0100FEB5041CA5 :10DE8000C07AA17AC607F60F3C00B09A0000321C97 :10DE9000201D01F03CF86069254FC10737D5B869EE :10DEA000002801D0F6F787FC2068056828888007DD :10DEB00034D101AA02A9281C01F00BFC281C01F096 :10DEC00012FC0078C0070AD460693C00EC9A00009C :10DED000800726D4331C291CA27A20697D69F6F7B5 :10DEE00072FC1EE000AB187A002803D0012806D08F :10DEF000022816D1281C796AF6F761FC11E000AB04 :10DF000018790E2801D00F280BD1281C3C00289B23 :10DF10000000396AF6F756FC06E00007800F03D1CF :10DF20002069F969F6F74EFC786B2121013078639E :10DF3000221C802009F031FEFEBD287A01000B4929 :10DF400018B50878C00711D50A4A101C20303C00CB :10DF5000649B0000847900AB1C70C079587008780D :10DF600040231843087005480078087000AB1888F3 :10DF7000D08418BD0400070000100700E060010015 :10DF800070470000054910B58879054B1A7C054C8F :10DF90003C00A09B0000246862401A74887110BD88 :10DFA00000002010070010000700585B0100044922 :10DFB0000A6804480068024001D0886170474861DF :10DFC000704710000700585B0100021C012000068A :10DFD00008433C00DC9B000080B52A2109F0E6FDE7 :10DFE00080BD000010B5041C002903D0812907D191 :10DFF000812000E08020221C2C2109F0D7FD10BDDB :10E0000002212C20F7F74CFB201CF7F7C3FC10BDB6 :10E0100080B5B4B03C00189C0000012806D08228CE :10E020001CD11AA807F035FC34B080BD812913D16A :10E030000D480C4A816900685032814202D0D16A91 :10E04000012902D01178022902D107F00AF9EBE781 :10E050006946F7F75AFE3C00549C0000E7E70121AF :10E0600000E002211820F7F721FBE0E7A46E010091 :10E07000B0B5041C0068174D9AB0686308F03EFA0A :10E0800020791449134A50392C3A02280AD1906851 :10E090008002A861C868E8613C00909C00000220F2 :10E0A000287207F0E4F81AB0B0BD031C0020002B62 :10E0B0000BD152689202AA610A1C8968E961287230 :10E0C00010686946F7F727FEEDE7A861012028727E :10E0D0002870002006F07DFAE5E73C00CC9C0000AB :10E0E000F46E0100704700007047000080B5012108 :10E0F0000720F7F7E1FA80BD70470000F8B500246B :10E10000194A0026D56811680435081C916002E0A0 :10E11000011C4019086053688342F9D83C00089DEF :10E12000000001341032032C0E60EED3F6F7F1FF3D :10E1300010481049124C0860104900200122192390 :10E140005B010C2543431B1945434A511F1C6D18A5 :10E15000AB606B6000251E1C14369E60331C3C00B7 :10E16000449D00000135272DF8DB013003289F6016 :10E17000E8DBF8BD2057010014C80100B4CF01004E :10E1800018D90100B8CF0100B0B5074C251CC03527 :10E19000286B1E2100F0F2F9A26B201CDC30296BE9 :10E1A0003C00809D000000F0B6F9B0BD0000C469DD :10E1B00001000020102210B50A4905E00C2343435A :10E1C0005C180C34CC5001300F28F7D30C23584383 :10E1D0000950044841600160028200218160C160F1 :10E1E00010BD3C00BC9D000084E2010044E301003E :10E1F00010B5084CA06A002803D10748F9F7E8FEDB :10E20000A0620448443000680121F9F795FC60627F :10E2100010BD0000606C0100CD260100FFB50D1C93 :10E22000041C1E1C3C00F89D000081B00A9F1C21AC :10E23000F6F74DFB0398A061256025612681A68233 :10E24000E76005B0F0BD70B50D1CA421041C0830BA :10E25000F6F73DFB201C44300622291CF6F765FB2F :10E2600018483C23411C3C00349E00006162417808 :10E2700059430918897A062901D1A06202E0211CBC :10E280004D31A16241783C235943081804300F49AD :10E2900020620B88002B15D0AC20005D0B4A183291 :10E2A00000028018B030E0603C00709E00008D6875 :10E2B000002008E0E268C1005450E668820052196C :10E2C00071184A6001309842F4DB70BD000068614B :10E2D0000100587501001FB5041C6034617A031CED :10E2E000806A084A0291019003923C00AC9E0000B3 :10E2F000E279181C20300092447B827B5E20C15A58 :10E3000018690430231C02F07FFE1FBD394E000047 :10E31000B0B50B1C01886920C05C86B00E4A049120 :10E32000039005920D4D596A9A6A2D683C00E89E4B :10E3300000000124002D00D0041C0A48005D01915A :10E3400002920090181C2030447B827B5E20C15AD0 :10E3500018690430231C02F0A4FE06B0B0BD514F72 :10E360000000186701000A61010001898A1C3C0055 :10E37000249F000002810268023A0260080A090232 :10E38000084310807047000070B5051C08780E1C0B :10E39000FF2814D0717802310020F7F745FB041CE8 :10E3A00002890068311CF6F7CFFA002D06D0281C30 :10E3B0003C00609F0000F7F734FB211CF7F757FA89 :10E3C00000E0251C281C70BD0000FFB50F1C1E1CA2 :10E3D000041C981C0104090C002081B0F7F727FBEE :10E3E000051C0068002C386003990170386846707D :10E3F00006D03C009C9F0000201CF7F715FB291C51 :10E40000F7F738FA00E02C1C201C05B0F0BD000026 :10E4100070B51048046804600F4920200860A0050A :10E420000E4E02D5706AF6F705FAE00102D5306E9D :10E43000F6F700FA3C00D89F00000A480440002587 :10E4400007E0E00703D5A8003058F6F7F6F90135E4 :10E450006408002CF5D170BD0000004007000010DA :10E46000070030740100FFFDFFFE80B5072180200A :10E47000F7F749F980BD3C0014A00000F8B5144B33 :10E4800082009C58CA060127391CD20E9140114ABD :10E490001160114E4000851915E06060207BC100BD :10E4A000891910310A780D239A430A70391C81406A :10E4B00031730749000108313C0050A000004018AA :10E4C000084A416842608068F6F7BEF9287B002858 :10E4D000E6D1F8BD0000A473010000100700006041 :10E4E0000700D175000003490120097A002900D1F5 :10E4F000002070470000047A01003C008CA000005E :10E5000003490120897A002900D1002070470000CA :10E51000147A0100B0B50024FAF776FC002814D074 :10E52000012408F07DFE0A4D0A4B00215A18A03242 :10E530001278102A06D38A00D218926F3C00C8A025 :10E540000000821AAA4200D2002401310329F0D32C :10E55000201CB0BD00008B080000A46C0100014825 :10E56000C068704700007869010070B50D1C041C7C :10E57000161CFDF72EFE0020E0602661A5603C0021 :10E5800004A1000070BD0000F8B5171C0E1C041C8F :10E59000002801D0002E01D1F7F7F2F8A06807F0AB :10E5A00049F9051C01D1F7F7EBF8291C6E60AF6043 :10E5B000201CFDF7FDFDE068411CE160002803D14F :10E5C0003C0040A100000548216905F02CF92068B5 :10E5D000A84202D1381CF6F748F9F8BD0000C46023 :10E5E00001000022013910B505E00C2353431C182B :10E5F0000C34C45001328A42F7D300210C235A4311 :10E6000081503C007CA1000010BD0000B0B5041C8E :10E6100001D1F7F7BBF8201CFDF7DAFD011C856876 :10E62000A06807F009F9E0680138E06003D1064806 :10E63000216905F0E7F82168002903D08868496856 :10E64000F6F711F93C00B8A10000281CB0BDC46069 :10E650000100012100288CB500D100210E2009F015 :10E6600032FA832000AB1880002004F00CF80190EF :10E67000684603F07AF98CBD000080B508F0DFFD34 :10E6800006490A8906493C00F4A10000096E411AB6 :10E690000B0C5918891A0904090C401A80BD000096 :10E6A00000900700A46C010070B5041C887E0D1C4E :10E6B000202803D903211820F7F740F800262676F2 :10E6C000A87E291C1B3160763C0030A20000201C73 :10E6D0001D30AA7EF6F75FF96868291C6060A8689B :10E6E0001331A060A87B06222073E87B6073287C2E :10E6F000A073687CE073A8892082A87CE0762677E6 :10E70000201C1230A676F6F746F93C006CA20000F9 :10E710006068431C1DD0114D6D61286800281AD017 :10E72000227B011C0B7B9A4201D3206014E00B1C5E :10E73000096800290BD00E7BB24208D20B68002B6F :10E74000F0D01E7BB242EDD323600C603C00A8A247 :10E75000000001E021601C60002070BD26602C607C :10E76000FAE7A46E0100134AB0B5516801240029EC :10E770001ED0131DD1611362436804E0106200686B :10E78000D061002814D0D06945689D42F6D13C0084 :10E79000E4A20000106A814204D15160D06900688F :10E7A000086002E0D16909680160D069FCF7CEFF1A :10E7B000002800D00024201CB0BD0000A46E010081 :10E7C000B0B5174D01242968002927D06D61296152 :10E7D0003C0020A30000436804E0686100682861F1 :10E7E00000281DD0286942689A42F6D1AA692B698F :10E7F0009A4200D1A9616A69914203D129600068F7 :10E80000086006E0006810602868002801D107F061 :10E81000CCFE3C005CA300002869FCF79DFF0028AB :10E8200002D0002400E00124201CB0BDA46E010031 :10E83000B0B5051C0748446807E0211C4431281C7A :10E8400000F0D6FC002802D16468002CF5D1201C11 :10E85000B0BD00003C0098A300005875010070B5E1 :10E860000D1C141C00280B4E08D0706E0623584354 :10E870000204120C311C281C228007E0218806208B :10E88000F6F7A7F970662288291C301CF6F795F870 :10E89000012070BD00003C00D4A3000010790100ED :10E8A00080B5032803D8044AC000115080BD01215F :10E8B0002620F6F75BFF80BD7C790100B0B5051C12 :10E8C000C0680189392939D30468A079882835D1ED :10E8D000E0798E2832D1207A3C0010A40000012873 :10E8E0002FD1607A03282CD1207B022801D0FE286A :10E8F00027D1607B1D210840012822D1A07BC8219F :10E90000084008281DD1A81DFBF7E1F9002818D000 :10E910001920215C002914D101303C004CA40000D6 :10E920003928F9DB688B04210843688303F0D6FE9D :10E93000002809D1002300222620044909F092F979 :10E940000348006801F084F9B0BD000050C3000026 :10E950000C790100B0B5084CA36801333C0088A4D1 :10E960000000A3600C1C09D02568002D03D0237A79 :10E970006168F5F7A3FF201CF7F7A9F9B0BD9479FA :10E98000010070B5041CC06801890568082953D3CB :10E990000622281C5549F5F79EFF002837D13C0078 :10E9A000C4A40000E988524E043E812924D1E568C0 :10E9B0002968087A4A7A000280180004000C420B89 :10E9C0000005000DE27520834B8900204200B25AF9 :10E9D0009A4206D128890C38020A00021043488165 :10E9E0003C0000A5000002E001300228F1D3E068FD :10E9F00001890A390181E06801680A311CE00022BE :10EA000000204300F35A8B4201D1012202E0013081 :10EA10000228F6D3002A11D107E036490622063132 :10EA2000281C3C003CA50000F5F75EFF002808D13B :10EA3000E068018906390181E068016806310160FA :10EA400010E0E068FFF7E2FC0CE002310181E068D1 :10EA5000016802390160E06800890238020A000298 :10EA6000104308803C0078A50000E0680325028977 :10EA70000168244E022A10D90988082905D0C1232B :10EA8000DB00994203D1012502E0002500E00225C8 :10EA9000E9007158002900D10225F7F704F8E900D0 :10EAA0008919898888423C00B4A5000000D9032553 :10EAB000A11D201CFDF734FC002800D10325022DE8 :10EAC00005D0032D07D1E068F6F7E2FF70BD201CEA :10EAD000FDF71CFD70BDE068018902390181E06825 :10EAE000016802310160E8003C00F0A500003158E7 :10EAF000201CF5F7F1FE0028EFD1E0680189023112 :10EB00000181E068016802390160E3E700006A46BC :10EB100001007C79010070B50E1C041C151CF7F770 :10EB20008CFB00282AD01B4908683C002CA600005A :10EB300001300860002E0AD0012E0BD0022E0FD11A :10EB4000201C04F0CDF8201CFFF7D6FE0CE00821B5 :10EB5000E06802E0C121E068C90004F035F903E093 :10EB600002212620F6F720FEE27DE16A3C0068A63D :10EB70000000281CFCF795FB206300202062A062A7 :10EB8000201C00F06CFE70BDE068F6F78AFF002DD7 :10EB9000F9D0E37D00220120E16AF5F7A7FE70BD00 :10EBA00000009479010080B5012804D105483C009B :10EBB000A4A60000006801F009F980BD0321262009 :10EBC000F6F7F8FD80BD00000C790100F8B5061CD1 :10EBD00080790024C0072DD5F0680068417A11299A :10EBE00028D1C1880A0A09021143C90422D1017837 :10EBF0003C00E0A60000114F0907890E0818418863 :10EC00000A0A090211430D042D0C432D396801D164 :10EC1000CA070ED4442D06D1C90704D5243000F00C :10EC200022FB002805D00648854206D138688007B7 :10EC300003D53C001CA700000124F068F6F73AFF5A :10EC4000201CF8BD7C5A01006C07000080B500282C :10EC500007D00021262008F07BFF0248006801F061 :10EC6000BBF880BD0C79010010B5041C094A081CD2 :10EC7000516801313C0058A7000051600021216219 :10EC8000A162E27DE16AFCF718FB2063201CF7F724 :10EC9000E6FA201C00F0EFFD10BD947901000CB5E0 :10ECA000021C081C0021019100926A4601A900F093 :10ECB00002F80CBD00003C0094A7000070B513687A :10ECC000002B1ED000260B68002B02D113681B6896 :10ECD0000B6013681C681B89E51808E05C781C1938 :10ECE00002340C601C78844201D1181C70BD0B6882 :10ECF000AB42F3D31368DB683C00D0A7000013607D :10ED00000E601368002BE1D1002070BD000070B5CB :10ED1000031C20D018681E89051C16E00478DD2C21 :10ED200010D18478002C0DD1C478502C0AD10479EC :10ED3000F22C07D144798C4204D13C000CA800008D :10ED400002290CD18479944209D0447820180230E9 :10ED5000441BB442E5DBDB68002BDED1002070BD34 :10ED6000044980B50A780A20002A00D0486A00F0D9 :10ED7000D1F880BD1C750100B0B5174C3C0048A807 :10ED800000002068002829D0164DE869002825D108 :10ED900001F03FFA002821D1FFF741FC00281DD1E6 :10EDA0002068A969401808F0D6F9002816D002F0AA :10EDB00006FD2168401808F0CEF900280ED03C006E :10EDC00084A800000120E86100222521802008F0AD :10EDD0008FFF0648296A04F083FD0121286A00F0AC :10EDE00089FFB0BDE85901001C75010034630100C2 :10EDF00070B5051C0024FAF70BFF184E716A401815 :10EE00003C00C0A8000000F08EF800280BD104F0F0 :10EE1000FEFB0021252008F0B0FE0322291C281C3F :10EE200000F0AFF818E0706A441E00F07CF800288B :10EE300012D10C48316A04F056FD0121306A00F00D :10EE40005CFF3C00FCA800000020FAF70DFE06F075 :10EE500003F8002300222520054908F03FFF201C6D :10EE600007F0FCFA70BD00001C750100346301005E :10EE70001027000080B5012807D080280DD100227E :10EE8000002108483C0038A90000F8F79AFE80BD30 :10EE9000012902D106490020C86104F0BEFB80BDF3 :10EEA00005212520F6F7A7FC80BD61A900001C758F :10EEB00001000021002880B501D1034841680122EA :10EEC000252008F02CFE3C0074A9000080BD000045 :10EED000E85901000249C8680138486270470000DB :10EEE0001C75010038B5031C081C191C114B06D0F9 :10EEF000012111800A1C191CF5F7AAFD17E00D4D20 :10EF0000011C2C781288181C3C00B0A90000F5F7F1 :10EF1000A2FD287884420DD000236B61002803D025 :10EF2000002007F0A4FA05E0002200210020009252 :10EF3000F8F723FC012038BD00001C75010070B5F6 :10EF4000041C012608F0E1F9051C3C00ECA90000B6 :10EF50000020FAF78BFD444302F040FC02F03EFC37 :10EF6000011C231C0022281C08F07CFA002813D165 :10EF70000A48231C00228169281C08F073FA002823 :10EF80000AD1F8F719FC011C231C00223C0028AA16 :10EF90000000281C08F069FA002800D10026301C67 :10EFA00070BD1C75010070B50D1C041C161C07F00B :10EFB00076F900280DD0FAF752FE002809D0FF306C :10EFC00001304368002B04D0221C291C301C3C005B :10EFD00064AA0000F5F7BBFC70BD000080B50121FC :10EFE0001D2008F0DFFD074A0748116901605169DB :10EFF00041600649496881600021C16003F074FCEA :10F0000080BD00002861010048750100905C01008E :10F010003C00A0AA000070B5041C406B002835D04D :10F020001D4D00262878002824D04120005D0028AE :10F0300003D108F076F9A8611BE0696901316961C3 :10F04000A868002808D0814206D12069011C10312F :10F0500004303C00DCAA00008222FFF7ADFF6868A4 :10F0600000280AD06969814207D12069011C10314A :10F0700004300222FFF7A0FF6E6168780521084086 :10F0800008D0074800780E2803D36034E079FBF7F6 :10F09000CFFF70BD3C0018AB00000348066070BD98 :10F0A00000001C75010010670100D47E0100800281 :10F0B0007047142330B5094D4B435B195B68082436 :10F0C000002B00D1022438235A43054B8900D21863 :10F0D000515A026809193C0054AB0000511A0160F2 :10F0E00030BD0000744001008C410100F8B5071CE0 :10F0F0002C48141C2C4A484386468018800D8446B0 :10F100002B482A4A06261D1C48434A430E2F40D24C :10F1100001A3DB5D5B009F443C0090AB0000060850 :10F120000A0F14181D202724272B2F31C8001FE099 :10F1300088001DE0214970464018000D18E01F4A64 :10F140008018800D401821E01E481018000D1DE0A9 :10F150001D4970464018400D0AE03C00CCAB000051 :10F160001B49401801E01B481018400D11E01A49D6 :10F17000401805E060462080002016E0174810186F :10F18000800D06E0164902E016484843164940182B :10F19000C00D03308008800020802E803C0008AC29 :10F1A0000000F8BDFF21FF20F6F749FB002020807A :10F1B0002880F6E70000D1451700FFFF3F00E33845 :10F1C0000E0055551500FFFF0F00A9AA2A01701C5B :10F1D0003700FFFF1F00CBCC4C00701C47003C00E9 :10F1E00044AC0000A9AA7A00701C6700A9AABA0062 :10F1F00084F61200EC25B4000449002801D009224D :10F2000000E014224A80486070470000A4690100B1 :10F2100080B50622F5F740FC80BD0000BCB5151C8A :10F220003C0080AC0000041C04310904090C01AA54 :10F230006B46FFF76AFF3820064968434018A10073 :10F24000405A00AB99884018198840180004000CF7 :10F25000BCBD8C410100BCB5041C151C01AA6B4649 :10F26000FFF73C00BCAC000053FF38200549684361 :10F270004018A100405A00AB998840180004000CC7 :10F28000BCBD00008C41010080B500280FD00029D2 :10F290000DD002780B789A4209D1FF2A05D0427826 :10F2A0000232F5F73C00F8AC000081FB002801D1E8 :10F2B000012080BD002080BD000080B506220449E9 :10F2C000F5F775FB002801D1012080BD002080BD2D :10F2D00000005E400100011C49780120002900D097 :10F2E0000020704700003C0034AD000080B50622CD :10F2F000F5F760FB002801D1012080BD002080BD12 :10F3000080B5FFF7C7FF80BD80B506220449F5F739 :10F3100051FB002801D1012080BD002080BD0000EC :10F3200012610100011C80203C0070AD000081438F :10F330008A080E201C2A10B506D2034C5200A35C8A :10F340008B4201D11019407810BDFC4101001423FB :10F350000249584340184068704774400100202219 :10F36000011C80B50248F5F752FD3C00ACAD000031 :10F3700080BD0000486101000806000E022801D18E :10F38000002070470120704700290CD00749096808 :10F39000002908D01423064958434018C0680028A3 :10F3A00001D0012070470020704700003C00E8AD0C :10F3B0000000AC6901007440010010B5041C062275 :10F3C000011C0448F5F77DFB0622211C0348F5F7D4 :10F3D00078FB10BD00001261010040800700002989 :10F3E00001D10020704738235A43074BD2183C0004 :10F3F00024AE00008300D25A14235843054BC01892 :10F4000040881018081A0A380004000C70470000E1 :10F410008C41010074400100F8B5071C081C161C43 :10F420001C1C191C00F05AF8051C1435221C311C38 :10F430003C0060AE0000381CFFF70BFF28180004EA :10F44000000CF8BD000000B500F04BF80A300004D5 :10F45000000C00BD0000F8B5071C081C161C1C1C85 :10F46000191C00F03EF845001E35221C311C381CCA :10F47000FFF73C009CAE0000EFFE28180004000CD3 :10F48000F8BD0000FFB50F1C81B00AA9141C1E1C9A :10F4900003C900F029F8051C1E35211C301C00F0A2 :10F4A00023F82D18221C391C0198FFF7D5FE2818C7 :10F4B0000004000C3C00D8AE000005B0F0BD0A49C5 :10F4C00080B50988092904D0142907D101018000D9 :10F4D00000E0C10008180004000C80BDFF21FF20DF :10F4E000F6F7D1F9002080BD0000A669010038239D :10F4F0005943064A14233C0014AF000089188200C7 :10F50000895A054A58438018408808180004000C9E :10F51000704700008C41010074400100024803491B :10F5200000684000085A7047A86901005440010073 :10F530000A20704710B5041C3C0050AF0000FDF7D6 :10F5400062FF201C10BDB0B5041CC0680568A01D7A :10F55000FFF7F5FE002818D0211C1431201C08F0FC :10F56000E2FD002811D0298809482022818269887B :10F570000183A98806354183C5613C008CAF00003A :10F580003021095D1154616B41620120F7F728F8C1 :10F59000201CB0BD707C010070B5041CC068211C2B :10F5A00014310568201C08F0C1FD002808D0054E64 :10F5B000F06802F0CFFD2888F08203203C00C8AF3D :10F5C0000000F7F710F8201C70BD707C01003EB5FC :10F5D000041CC0680568A01DFFF7B7FE002821D0F5 :10F5E000211C1431201C02AA08F077FD002819D034 :10F5F00002984B21095C002910D0012914D03C004D :10F6000004B0000002290CD129880D2000AB18801D :10F61000201C03F051F80190684602F05DFAF6F7FD :10F62000B5F80021029806F09FFE201C3EBD07F0B1 :10F6300029F8029800218069C207D20F0420F6F74A :10F640003C0040B000007FFFEEE710B5041CFDF762 :10F65000E6FE201C10BD3EB5051C00F040FE002853 :10F6600015D1281C1430FAF7CEFB00280FD0052145 :10F670002869FFF786FB041C09D00522211C684677 :10F68000F5F73C007CB000003DFA05340294684672 :10F6900003F01AFB2A1C0D218F2008F08FFB00209D :10F6A0003EBD000010B5041CFAF798F8201C05F0C8 :10F6B000E5F8201C10BD0000B0B5041C0069002155 :10F6C00094B0FFF73C00B8B0000061FB6946FBF75F :10F6D00026F800281ED00098FAF729FA011C01A884 :10F6E00002F0D7F90098FAF7D2F90490052009AD95 :10F6F000687202A8211C06220230F5F706FA0120E2 :10F700000890216A0A903C00F4B00000282009917A :10F71000005D287201A800F069F8201C14B0B0BD8B :10F72000FFB5161C1F1C81B00A9D4C20F6F790FBFC :10F73000041C143006220299F5F7EAF9201C06226F :10F740000199F5F7E5F928203C0030B100000021CF :10F750000655E1602762002D01D08E2000E08D204B :10F76000221C0D2108F033FB05B0F0BD0000B0B540 :10F77000051C4C20F6F76FFB041C4C22291CF5F7E6 :10F7800026FA2920405D0D282CD23C006CB10000E7 :10F7900001A31B5C5B009F44281A281E060A282828 :10F7A0000E2822121600221C0D218C201AE0221C89 :10F7B0000D21832016E0221C0D21842012E0221C42 :10F7C0000D2185200EE0221C0D2186203C00A8B1D1 :10F7D00000000AE0221C0D21872006E0221C0D21DA :10F7E000892002E0221C0D218B2008F0F6FAB0BD22 :10F7F000E868F6F7E6F9201CF6F711FBB0BDFEB598 :10F80000051C9020F6F72DFB041C9021F5F73C0019 :10F81000E4B100005BF9374E0127F069042803D9F1 :10F82000706B013070634DE03348B16B04F0D0F879 :10F8300001202062A87E211C803102910870221CC8 :10F840006032019200202F1C20379072787A2B1C96 :10F850003C0020B200001433D072E868AA1DA060FA :10F86000E86B48604420405D0872291C201C05F0AC :10F87000AAFC686A00280AD1019A201C937A02998E :10F88000221C703258300978FAF7DBF906E03A7A30 :10F89000231C3C005CB20000E869296A7033FDF764 :10F8A0008DF93020405D184907280BD15820005DA4 :10F8B000C007C0170130E06100202061201CF7F76D :10F8C0003FFF18E00122201C05F0ACFF071C12D0FE :10F8D00003F006FF3C0098B20000F36D002B06D049 :10F8E00060682030827B616B381CF5F799F8E86816 :10F8F000F6F773F9201CF6F79EFAFEBDF0690130A9 :10F90000F061FAE70000C4690100346301000531C9 :10F91000000070B5061C3C00D4B200000D1C0904A8 :10F92000090C0020F6F77CF9041C2A1C311C006825 :10F93000F5F706F9201C70BD4088704703781B0757 :10F940009B0F0B70007800091070704704307047EF :10F9500004307047D42101703C0010B30000002136 :10F96000417070470000C421017000214170704750 :10F970000000B4210170002141707047000001496E :10F98000486570470000C469010001490865704777 :10F990000000C4690100014988653C004CB30000C7 :10F9A00070470000C4690100F8B55F4F051CB868D6 :10F9B0000130B86007F024FD38619020F6F766FA50 :10F9C000041C9021F5F794F8286B271C6063688B62 :10F9D0008037261CC007C00F2062688B3C0088B3AC :10F9E0000000603602214007C00F2063688B80074B :10F9F000C00FF860287F3870B172002808D1F9F77D :10FA0000C8FF002802D00120606201E00120A0624E :10FA1000F868002803D00021022006F0CCFF3C004B :10FA2000C4B300002B1C1033AA1D291C201C05F098 :10FA3000DFFBA86A00280CD13978022907D0221CE4 :10FA40007032201C5830B37AFAF710F908E001261A :10FA50005EE0AA7D231C286A696A7033FDF7C0F84E :10FA60003C0000B40000E96800200989002900D1A9 :10FA70000420F0723878012814D10027009000206B :10FA800006E02969012903D1A969012789071AD547 :10FA900006F079FC0028F4D1012F14D10098012838 :10FAA00011D13C003CB4000008E0201C583006F0A6 :10FAB000E1FC00280AD08069800707D5F07A082188 :10FAC0000843F0720120E062E87D3073E868A060CE :10FAD000E06A002812D01A4FF86B00280ED0307B55 :10FAE000F5F7DEFE3C0078B40000002809D0211CA8 :10FAF000381C4030FCF755FC1448B96B03F089FF03 :10FB0000F8BD104F1248B96B03F083FF0022201C90 :10FB1000104905F0A2FE061C03D1386A0130386294 :10FB2000EEE7201CF6F73C00B4B400009FF9E8684B :10FB3000F6F76EF803F0F2FD0448836D002BE2D077 :10FB40000022301C296BF4F786FFDCE7C469010052 :10FB5000C4600100346301001130000010B50A20B8 :10FB600007F0FEFC07F05EFC3C00F0B400000B491F :10FB700044180CE0201C07F090FB002807D0F7F792 :10FB800034F9002803D012218620F5F7CAFEF7F7D2 :10FB90002CF90028EED101F080FD10BD0000409C42 :10FBA000000010B50C1C011C174A3C002CB50000CD :10FBB0000129506904D080291DD0812921D11CE060 :10FBC0009178012915D102219170141C011C104853 :10FBD00003F028FF0121606900F02EF9606901F04F :10FBE0005FFC2070A088A16900230A4A3C0068B528 :10FBF000000007F07EFC10BD222106E001F01DFC94 :10FC0000201C00F04AF810BD1C212020F5F78FFEC3 :10FC100010BDB4790100346301003D2E000070B5C1 :10FC20001C4CA078002832D0052830D060693C00F8 :10FC3000A4B5000000F0EAF8184EB579A0780128C4 :10FC40000BD002280ED0032810D0042817D1421F51 :10FC50008021202008F008F80EE00021202008F084 :10FC600031F80CE0A08807F01DFC05E0207800F0DA :10FC70003C00E0B5000039FA002000F0C4FD6069E6 :10FC800001F0E1FB0520A070B571606900F061F939 :10FC900000222021812008F0D6F870BD0000B47940 :10FCA000010020100700B0B50D4D041CA8780028F5 :10FCB00014D03C001CB60000686900F00BF90A483B :10FCC000696903F0A7FEA88807F09EFB002C02D00C :10FCD000687800F079FF0020A870A968201CF4F76C :10FCE000CAFEB0BDB479010034630100064B80B593 :10FCF000997803293C0058B6000006D10421997078 :10FD00002021021C802008F0A4F880BD0000B479F6 :10FD1000010010B50C4CA17803290FD11030FAF76F :10FD2000DEF8002809D0207800F0E5F9002000F086 :10FD300070FD002105483C0094B60000FCF79CFAD9 :10FD400010BD1B212020F5F701FE10BDB479010084 :10FD500051B60000094980B58978032909D100F01E :10FD6000CDF9002000F058FD01210548FCF784FA88 :10FD700080BD17212020F5F73C00D0B60000E9FD3A :10FD800080BDB479010051B6000070B5104C1D1C47 :10FD9000A378061C0498002B18D10123A3702261BC :10FDA000E6606170A060A561002007F0ACFAA08059 :10FDB000301CF7F73CFBE08007F03C000CB700007C :10FDC0004FFBC721C900281A411A0022202007F042 :10FDD00057FF70BDB4790100B0B5041C0D1C00F0D4 :10FDE00009F8201C00F024F8002D01D0FFF7D4FE04 :10FDF000B0BD0000B0B50C4C051CA0683C0048B775 :10FE0000000000280FD10A48017E022211406160E3 :10FE1000017E11430176072003F049FC206003F0C6 :10FE200098FF03F0EEFFA0682843A060B0BD407CBF :10FE300001000C8007000A4938B50A1C20323C003A :10FE400084B70000947900AB1C70D279074C5A70CB :10FE5000E268002A02D1064D01236B701043E06076 :10FE600000AB1888C88438BD00100700407C010032 :10FE700000500700B0B5051C002901D000F028F89B :10FE80003C00C0B70000064C60782169084303D1EC :10FE900001210E2006F0C5FD206928432061B0BD78 :10FEA000000018630100B0B50A4C051C226900204F :10FEB000002A0CD1002900D004E06078002802D18B :10FEC00004F03C00FCB7000069FB6070281C06F0E1 :10FED000EFFC0120B0BD00001863010010B5084C14 :10FEE000607800280AD006F0E3FC002060702069EA :10FEF000002803D001210E2006F096FD10BD000061 :10FF0000186301003C0038B80000094980B50B694E :10FF1000834204D14A78002A01D1012200E0002264 :10FF200083430B61002A03D000210E2006F07FFDE1 :10FF300080BD1863010080B50120F6F756FE80BD34 :10FF4000000010B5041C3C0074B8000000F004F878 :10FF5000201C00F01FF810BDB0B50C4D041CA868A3 :10FF6000A0420FD10720296808F08CFB68680222A4 :10FF700007490028087E01D0104300E0904308762E :10FF800004F0C4F8A868A0433C00B0B80000A86022 :10FF9000B0BD407C01000C8007000A4938B50A1C3E :10FFA0002032947900AB1C70D279074C5A70E26809 :10FFB000824202D1064D00236B708243E26000ABA7 :10FFC0001888C88438BD001007003C00ECB8000059 :10FFD000407C010000500700B0B5051C0A4C002110 :10FFE0006069FFF711FF042001F046F901F088FB7A :10FFF00000220421042001F08BF8281C01F04AFAA9 :02000004800179 :100000006069FFF7A7FFB0BD407C01003C0028B944 :10001000000080B501F077FA80BDB0B50D4D01212B :100020002869FFF7F4FEFFF72AFE00F02CFB00F032 :1000300084FA002400220421201C01F06CF8013411 :100040002406240E042CF5D32869FFF786FF3C0014 :1000500064B90000B0BD0000407C0100F8B5051C8B :100060000E1C074C171C01212069FFF7D3FE3A1C18 :10007000311C281C01F052F82069FFF771FFF8BD10 :10008000407C0100FFB589B0061C16981D1C002895 :100090003C00A0B9000001D02948149028680088CD :1000A0000006800E202801D0142817D10AAA18248F :1000B000182105CAFFF777F9071C281C0189A142FE :1000C00002DD006801190BE0C068641A0028F5D150 :1000D0000F213C00DCB900008620F5F761FC00210F :1000E00001E00021002718480890807907900C2033 :1000F000164A704380180479049112991598149A3D :1001000001910390059700950AAB0292211C301CC7 :100110000CCBF7F73C0018BA000003F90125B540F5 :100120000C4E083E3078284006D0201C00F0C9FD57 :100130003078A843307003E0201C139900F043FF8F :1001400007A903C988710DB0F0BD952400002010E7 :100150000700747A01003C0054BA0000B0B5041CDA :100160000C230949584340180079051C00F092FE01 :10017000281CF7F7C7F80120034AA040083A117875 :1001800081431170B0BD0000747A010010B5054CB8 :100190002078002803D11A213C0090BA0000862064 :1001A000F5F707FC207810BD000018630100014836 :1001B0004078704700002C63010080B5F6F7D1FE4F :1001C00000F01BF980BDFEB50168051C0C680E1C13 :1001D0002178880771D16869C2073C00CCBA000059 :1001E0006ED580076DD5E87AC20708070909029124 :1001F0004549800FD20F00284F6805D0012809D04B :10020000022821D003285BD1FF23201CA97AF4F710 :1002100074FC55E002980B280AD00C283C0008BB5F :1002200000000FD00D284ED1394FF868F4F761FC6B :100230000020C0435AE0354FA97ABB68201CF4F770 :100240005BFC40E0324F3869F4F753FC3BE000219F :10025000019102990020FF23090701D401203C00ED :1002600044BB000013E03189192901D3267E07E041 :10027000152904D31826711A49190E7B00E00026AF :10028000B10602D4012073075B0F01210191002800 :1002900003D0A97A201CF4F736FC0199012915D165 :1002A0003C0080BB0000F006C60F20881B4FE48A8C :1002B000F96B0005C00F00291AD04B1C18D0002E76 :1002C0000AD0002808D03888844213D002980C281D :1002D00001E01DE012E00DD0081C01F076F90028C5 :1002E00003D13C00BCBB000000F0A6FAF4F70AFC06 :1002F0000020C043F863002E0DD03C800020F8633E :1003000009E020880006800E202804D1044F201C1C :10031000B96AF4F7F8FB291C0248FBF7EFFFFEBDB2 :10032000287A01003C00F8BB0000A59A00000348B1 :1003300080B50078002100F0FCFB80BD0000186350 :100340000100044B054900281A6800D0011C101C4C :10035000196070470000D4790100957500000548C8 :1003600080B5007F24233C0034BC0000044958437E :100370004018C069F4F7CCFB80BD0000D4790100BF :1003800094460100021C064880B581628260007FAD :1003900024230449584340188069F4F7B9FB80BD11 :1003A000D4790100944601003C0070BC000080B587 :1003B000002000F03CFB002000F06DFA00F065FA30 :1003C0000449C86A0130C862081F008807F0C1F8F4 :1003D00080BDD4790100064880B500210177C16A4B :1003E0000131C1620438008807F03C00ACBC000059 :1003F000B3F803F0D1F980BDD479010080B505F0E0 :10040000E9FA80BD80B5002803D1012004F022FA6A :1004100080BD012003F0E6FB80BD00000349012000 :100420004978002900D00020704700003C00E8BC5B :1004300000002C63010070B5134D2878002820D1EE :1004400001212E1C7068FFF712FD0021072006F025 :100450002AFB0D480024047104F0EDF806F0D5F9EC :10046000012028700A4804604460F6F74CFD3C0007 :1004700024BD0000F7F75EF8FFF7A2FF00F0A8FD2B :100480000548716803F020FB012070BD2C6301005A :100490005000070080000700C4600100B0B51E4C8A :1004A0002078012835D1251C69681C4803F020FB01 :1004B0003C0060BD000004F0F0F81A4801684908EB :1004C00049000160016801221143016000F02BFE28 :1004D00000F01BFC06F099F8F6F729FEF6F72DFC64 :1004E00000202070FFF783FF00F08BFD0F4881781C :1004F00008223C009CBD000091438170817811432B :1005000081700C49102008716868FFF75FFDF7F7EC :1005100039F8F6F74DFD0121072006F0CDFA01204C :10052000B0BD00002C630100C4600100F0000700B2 :10053000000007003C00D8BD000050000700034940 :100540000120897A012900D0002070470000147A28 :100550000100B0B5154D041C287A002820D1F9F708 :1005600000FC02281CD101202872E868002810D065 :100570002068296808603C0014BE000069680D48C6 :1005800003F0C2FA01216868FFF7C8FC00222420AA :10059000616807F0CFFBB0BD002028722168012000 :1005A000F4F7CFFAB0BD00202168F4F7CAFAB0BD65 :1005B000047A0100346301003C0050BE000004488E :1005C00080B5007A012802D1002002F0F0FE80BD43 :1005D0000000047A010080B5012807D0802809D1E5 :1005E0000748007A002804D0012000E0002002F033 :1005F000DEFE80BD0E212420F5F73C008CBE0000FD :100600000BFA80BD047A0100F8B53A4E051CB07AA9 :10061000002869D1F9F7AEFB022865D13648006899 :10062000002861D03548716803F074FA01217068C0 :10063000FFF77AFC6C20F5F7B9FC041C3C00C8BE3F :1006400000006C21F4F7E7FA30682C220460296876 :1006500081606968C160002111548162A968002924 :1006600002D0E968016105E006F05DFF69684018A5 :10067000316808617068FFF714FD692108553C0076 :1006800004BF00000020F9F709FB01273B1C061CF2 :10069000221C24320021F9F779FB1C480321008831 :1006A00089030843211C40310091488318481021D8 :1006B00060601848A060A76367630020F5F74CFBF3 :1006C0003C0040BF0000E06002890099CA830768CF :1006D000311C381D2761FEF78EFE381C0A300F4989 :1006E000FEF789FEA4203880002004F0DEFB002203 :1006F0001F20696807F02DFBF8BDFFE7002029687F :10070000F4F73C007CBF00002EFAF8E7147A0100F1 :10071000805A010034630100FA60010099EC000086 :1007200015ED000012610100064880B5817A0029AC :1007300007D0006804222030017B1143017302F0CE :100740006BFD80BD3C00B8BF0000147A010010B5FD :10075000044CA07A012803D106F0F1FE21688861DB :1007600010BD147A0100031C081C1F4970B50A68EB :10077000012B1CD0802B05D0832B30D1887A002808 :1007800014D029E053693C00F4BF0000002B0ED0C8 :100790009469D5692E1B0C695D1B361BB610A41914 :1007A0000C61CC682D1BAD106419CC60936102F014 :1007B00081FD70BD022812D1906A0C1C0028F8D06F :1007C00007F00EFAA07A01283C0030C00000F3D1F7 :1007D0002068816A0029EFD12030017B0822114373 :1007E000017370BD02F021FD70BD0E211F20F5F7D1 :1007F00028F970BD0000147A010002490C3103C9C8 :10080000401870470000147A01003C006CC00000E2 :10081000054880B5006804222030017B1143017334 :1008200007F0E4F980BD0000147A010070B5164CA1 :100830000E1CA17A00291CD02168086107F032FA49 :10084000002817D020680025056200223C00A8C0BF :10085000000083211F2007F094FA6068FFF703FC73 :10086000216804222031087B2B1C90430873311C23 :1008700000221F2007F061FB70BD20680822203095 :10088000017B1143017302F0D6FC70BD00003C00F7 :10089000E4C00000147A010080B500F077FC00F09D :1008A0006FFC00F029FF00F05DFA00F0C5F800F0E1 :1008B00085FF80BD80B5FAF785FA80BD0148C06824 :1008C00070470000287A01000349002800D0011C6D :1008D0003C0020C100000248C160704700008175E3 :1008E0000000287A010001480249C86070478175FC :1008F0000000287A01000149886170470000287AC9 :1009000001000149002088617047287A01000349ED :1009100000283C005CC1000000D0011C0248C161FD :100920007047000089750000287A010003490028FB :1009300000D0011C02488162704700008D750000E4 :10094000287A01000349002800D0011C02480162F6 :10095000704700003C0098C1000091750000287AA3 :1009600001000349002800D0011C024801617047C2 :10097000000099750000287A0100014802490861C9 :10098000704781750000287A0100021C081C802A2B :1009900080B502D100F03C00D4C1000007F880BD52 :1009A0001E212120F5F762F880BD0000B0B5104D82 :1009B000041CA86B0130A863696B091A281C006B22 :1009C0000C2903D90021FFF791FA03E0082901D18E :1009D000FFF732FB201C00F03C0010C200004DF974 :1009E0006069400701D503F00CFC201CE96AF4F7AC :1009F000DBF8B0BD0000287A01000349002800D0D0 :100A0000011C0248416270470000B5750000287A59 :100A1000010003490120096C00293C004CC2000080 :100A200000D1002070470000287A010010B5074C63 :100A3000E16B002901D1E06304E0814202D0002093 :100A4000C043F8E706F09CFD206410BD287A010041 :100A50000148006C70470000287A01003C0088C201 :100A60000000054980B5002048638863FF210931F3 :100A700015221020F6F7FBF980BD287A0100034902 :100A8000002800D0011C0248816070470000C17539 :100A90000000287A01000349002800D0011C3C0016 :100AA000C4C200000248C16270470000C575000062 :100AB000287A0100044B054900285A6800D0011C1F :100AC000101C596070470000287A0100C9750000A9 :100AD0000349002800D0011C024841617047000012 :100AE0003C0000C30000CD750000287A01000F4BC8 :100AF00010B5D968002919D00E4C0021CA0012196E :100B0000403AD26B824202DA01310329F6D3481C03 :100B10001A780006000E904208D018700806000EE1 :100B2000041C3C003CC30000F6F7BAFA201C03F09A :100B30001BFD10BD186301003C42010010B5144CB0 :100B4000E168002922D02178124BCA00D218403A1D :100B5000D36B834202DA481C20700BE0926B824216 :100B600014DDFF313C0078C300000806000E207041 :100B700003D119218620F4F78EFF2078FF3000067C :100B8000000EF6F790FA2078FF300006000E03F012 :100B9000EEFC10BD0000186301003C420100094852 :100BA0000021018141813C00B4C300008181C181E9 :100BB000074A02800123DB0243808280C2804176A3 :100BC00031218176012101767047000030800700D5 :100BD000FFFF000080B50120F6F7F8F80120F6F7D6 :100BE000DBFC0120F6F75AFA3C00F0C300000120BC :100BF00000F0F1FD0120F7F7C6FB80BD000010B545 :100C0000114C002907D1002802D10120E06006E044 :100C10000021E16003E0012907D1002801D0207004 :100C200003E018218620F4F73CFF3C002CC40000B0 :100C30002078FF300006000EF6F73EFA2078FF30ED :100C40000006000E03F09CFC10BD000018630100BC :100C5000054980B50968884205D0FEF7FFFB00F022 :100C600087FAFFF72BFC80BDA86901003C0068C42F :100C7000000001494870704700002C6301000149E1 :100C8000C860704700004C7B0100034901200978CF :100C9000002900D00020704700002C630100044AA6 :100CA000002802D0906901309061D06940183C0062 :100CB000A4C40000D0617047905C0100FEB5041C24 :100CC00000680568281CFEF727FF071C6069154EA1 :100CD000C007C00F21D001AA02A9281CFEF712FFED :100CE0003878C0070CD46069800708D500AB187A43 :100CF0003C00E0C40000002801D0022802D1706A44 :100D000001307062FEBD00AB187A002801D00228C5 :100D1000F8D1706A01307062B06A0130B062F1E7F8 :100D2000F06A0130F062EDE70000905C01000249DA :100D300048693C001CC50000013048617047000054 :100D4000905C01007047000070470000011C4031BA :100D500010B50A8B1207920F012A33D04A781A492C :100D6000041C6034002A0B6A22D1E279012A02D9DC :100D7000CC6801343C0058C50000CC60022A02D97E :100D80000C6901340C610C6801340C60446B002C5C :100D900003D00469247CE40702D54C6801344C601C :100DA000806B002802D0086B01300863002A0CD049 :100DB0009818013808E03C0094C50000012A01D0D1 :100DC000022A02D1886801308860E0791818086228 :100DD00010BD0000905C01007047000001490A202E :100DE00008817047C47A0100F0B5324F041C78784E :100DF00085B0C007C00F03903C00D0C50000B87894 :100E000002900120A0400490391C88702C48008872 :100E100006F00BFC0190FEF7AEFC0430294EA50055 :100E200071590979884206D0FEF7A5FC7159043042 :100E3000087101207870002078703C000CC600001A :100E400021480121204E3038015571590320087086 :100E500006F0C6FB061CFEF791FC36180E3609E0BC :100E6000301C06F0F5FA002804D023218620F4F780 :100E700033FE03E0F6F734FB0028F1D03C0048C60F :100E80000000124813493C3800780872201CF4F71F :100E9000A2FA0E4E715908710398002801D0012161 :100EA000797009480088019906F0BDFB0298B87076 :100EB000094949790498884203D0242186203C00BE :100EC00084C60000F4F70EFE05B0F0BD0050070028 :100ED000D0790100107B010080800700508007005E :100EE000B0B50D1C041C052801D3F4F729FE052D0F :100EF00001D3F4F725FE0B4AA8001158A0001058A2 :100F00003C00C0C600000EC90EC0062106220648DD :100F100069432A380918624310180622F3F70FFFB5 :100F200002483038415D0155B0BD107B0100B0B5BD :100F3000041C0E480D1C80780121A140084003D0FC :100F400001213C00FCC600008620F4F7D1FD0621FB :100F50000622094869430918624310180622F3F76C :100F6000F1FE201CF4F740FA034AA1002A3251583E :100F70000871B0BD00500700E67A0100034980B552 :100F8000002048603C0038C7000007F032F980BDFF :100F90000000D47A010010B5041C052801D3F4F731 :100FA000D8FD0749087A074A107001200872FEF739 :100FB000F4FB044A0430A1003C325158087110BDC2 :100FC0000000808007003C0074C70000D47A010054 :100FD000034980B50120486007F00EF980BD00008C :100FE000D47A010010B5041C052801D3F4F7B4FD30 :100FF000201CF5F78FFE0021201CFBF731FD01219D :10100000002800D0011C09043C00B0C70000090CF6 :10101000201C04F022FA10BD000006490120054BF7 :10102000886000203C33002182009A581170013002 :101030000528F9DB7047D47A01000F4938B5002044 :1010400088600E48011C20318A793C00ECC7000002 :1010500000AB1A70C9790A4C094D59700C343C35F3 :1010600000210322635C002B02D08B00EB581A7026 :1010700001310529F6DB00AB1988C18438BD0000B9 :10108000D47A010000100700FFB5144F3C0028C8B7 :101090000000041CBE790D1C81B00F2000F0B9F8CF :1010A0002A1C104D0090211C281CF4F7DEFC211C8A :1010B000A81D039AF4F7D9FC211C281C0C30049AB3 :1010C000F4F7D3FC211C281C12300A9AF4F73C00D8 :1010D00064C80000CDFC07F09BF8009800F076F89B :1010E000BE7105B0F0BD000020100700E67A0100D7 :1010F00010B50020F6F726F80749887800090001A6 :1011000088700024201CF5F711FE01342406240EFB :101110003C00A0C80000042CF7D310BD0000005014 :10112000070080B502F0E3FB034881780F221143EA :10113000817080BD000000500700F8B50D1C041C34 :10114000052801D3F4F717FDA600002D114F07D194 :10115000B8593C00DCC80000816800290ED14078F5 :1011600000280BD002E0FF352D062D0E291C201C77 :10117000FBF788FC011C201C04F07EF906490120C5 :101180003039085504483C388068002802D1B959E4 :10119000032008703C0018C90000F8BD0000107B57 :1011A000010080B504F0CDF980BD10B5041C052800 :1011B00001D3F4F7E6FC201CF5F7C1FD0020054A39 :1011C000A10051588860044988780122A240104348 :1011D000887010BD00003C0054C90000107B010065 :1011E00000500700024A9178084390707047000051 :1011F00000500700F8B50C4FBE790F2000F018F82A :10120000051C0024201CF4F70DF9084AA1005158D0 :10121000087101342406240E3C0090C90000042CFF :10122000F3D3281CFFF7E1FFBE71F8BD00002010CA :101230000700107B0100B0B508498D788A78054019 :1012400082438A7006F0F9F9041C0A34201C06F067 :1012500034F90028FAD0281CB0BD3C00CCC90000ED :101260000050070001490A2008817047387B0100BF :10127000F8B510480426041CE034051C383D00274E :10128000201C1C30E460A06127610B48A682E0614D :101290002762A7620620A084201CFEF73C0008CA33 :1012A000000087FC201C0C30F6F7B7F90549383CE4 :1012B000AC420880E7D1F8BD0000D4E4010012611F :1012C0000100487B0100F7B5051C0C230F1C1249D7 :1012D00058434418208806F0EAF9A07801283C0019 :1012E00044CA00001AD16668022F05D15C20805BD9 :1012F00002990009884211D1281CFEF7FBFF301C1F :10130000F9F7FAFD0420A070391C281CFBF7F4F84B :10131000034AE8003C32115801311150FEBD000073 :101320003C0080CA0000607B01000120064A0021C9 :101330000C234B439B189B78002B00D000200131DD :101340000429F5DB7047607B010070B5041CFFF7D2 :10135000EAFC002803D120210C20F4F7F6FB261C20 :1013600060363C00BCCA00000021F171E164606B92 :10137000251C4035002831D0FFF704F90122120363 :1013800000282069018801D0914300E011430180C9 :10139000206901220088D2022883201C583001884D :1013A000914301803C00F8CA0000A36B5208002B57 :1013B00010D091430180288B0007800F012815D0A1 :1013C0002E20015D20690430F8F741FD616AFEF7C7 :1013D000A8F904E011430180201CFBF7CCFB6883D3 :1013E00004E0206941803C0034CB0000A88B2169D7 :1013F000C882E068F6F720F93080606D002804D0DC :1014000000220321707AFEF70DFF201C00F0B6F9D0 :10141000707A06F045F870BDB0B5002406F022F9E8 :10142000094A00210C234B433C0070CB00009D185F :101430006B685B6CAD78C31A012D02D1A34200DD4D :101440001C1C01310529F0D3201CB0BD0000607BBD :101450000100B0B5041C06F0A8FE0C20084960434A :101460004518288806F035F968683C00ACCB0000C8 :10147000002806D02030007B012802D1201CFFF775 :10148000A3FAB0BD607B0100FFB585B00FAE60CEA2 :1014900038201E497043171C4418FFF77FF80122BB :1014A0001203002803D02088904320803C00E8CB22 :1014B000000002E02188114321801198391CE0626C :1014C0000598F8F7D0FC011C2B1C381C069AFEF777 :1014D00020F960800622201D0F49F3F772FC231CBF :1014E0000898303318700E980C49587065633C00AA :1014F00024CC0000002002900122049209480391AC :101500005A780188019200911978243B301C626B53 :10151000FEF7A8FE09B0F0BDD4E40100126101009D :101520005D4E0000487B0100FFB587B0109812AFF8 :101530003C0060CC00008C46A2CF4C23304C6B4367 :101540001C19161C159A2785271C303706970597F6 :1015500000233B73059F78731198271C60646160BA :10156000226040373E70614661870798311CF8F76A :1015700080FC3C009CCC00000599C8730A987870E8 :10158000301CFEF773F8002801D0012000E0002095 :10159000410002200140119A0120002A00D10020C0 :1015A00008433872201C2E300799FDF7CFFF281C06 :1015B00004F0AEF83C00D8CC0000FEF7FEFF4C2251 :1015C000124B6A43D218012109032A32002804D0A1 :1015D000101C12888A43028002E0108808431080A1 :1015E0000B490020039106990290002204920848BA :1015F0000A7B4188231C3C0014CD0000019200911D :1016000079780833281C6268FEF738FE0BB0F0BD0D :1016100058E30100754F00003C7C0100B0B50C1C84 :10162000012827D0802830D1E06C002808D069201C :10163000005D1849C00040183C0050CD0000043047 :10164000016801310160201CFFF7E9FB134D503D9B :10165000E868002805D02E20005DFEF710F802F0A3 :1016600042FE201C6168F3F72FFB403460780028AD :1016700002D106F012F8A860B0BD3C008CCD00008D :101680002006000E8128FAD1220C2004000E02212F :10169000FEF7E6FDB0BD0A210C20F4F77DFAB0BDDF :1016A0009C7B0100F8B5184E184F051C3479B879A9 :1016B0000090201CF5F77CFF002806D03C00C8CD28 :1016C0000000124838384068854201D1002D03D10E :1016D00010218620F4F763FA0D490020383948605C :1016E0000421201CFFF759FC0421201CF5F7EBFE18 :1016F0000C21064A6143303A89180C7104203C00E1 :1017000004CE000030710098B8710F20FFF7A6FDDD :10171000F8BD0000A47A010020100700F8B5041CF1 :101720000F20FFF7C1FDF5F73BFF0125002800D092 :101730000025164EB079164F00903879042801D153 :101740003C0040CE0000002C03D111218620F4F78C :101750002CFA1048290638384460090E0C1C042065 :10176000FFF721FC0321201CFFF741FC211C042072 :10177000F5F7AFFE0C21074A69430420303A891877 :1017800008713C007CCE00003C710098B071201CB8 :10179000FFF750FD0420F8BD20100700A47A0100D7 :1017A0000C2302495843401880687047747A01003E :1017B0006030C1798079814201D9012070470020D1 :1017C000704700003C00B8CE0000014880687047B8 :1017D00000004C7B010038B56921095C1823104AD0 :1017E000594389188A6801328A604B69D21ACB68DA :1017F000934200D2CA6000220B4C0260221C2032AD :10180000957900AB1D703C00F4CE0000D2795A707F :101810000A68002A01D1486000E0106000AB08604F :101820001888E08438BD0000C47B01000010070068 :1018300018230A495843411808690130086148686B :10184000002809D0486901303C0030CF00004861D1 :10185000486802684A60002A00D10A607047002088 :101860007047C47B0100F8B5124E104D0F4C0A278B :10187000211C0020E0602A31221C1832A160626124 :1018800027820C4AE061A26160623C006CCF0000DC :1018900006202084081CFEF7D7F9201C0830F5F735 :1018A00001FF4C3CAC427080E5D1FF203070F8BDA8 :1018B00088E401000CE301003C7C0100126101009E :1018C000F8B5041C0B480E1C171C44703C00A8CF34 :1018D000000005F000FF051C391C301CFDF7ABFFB4 :1018E0000C21054A28180A30614308325050034839 :1018F000891800688860F8BD00006C7A0100786E75 :10190000010070B50B4E051C7078FF280FD03C000D :10191000E4CF00000C23084C58430834205805F04D :101920001DFE002806D170780C23584300198168E9 :101930002943816070BD00006C7A010080B53021C0 :101940000148F3F743FA80BDECE5010010B505F05E :101950003C0020D00000C5FE0A4944180CE0201CC1 :1019600005F0F7FD002807D0F5F751FE002803D059 :1019700013218620F4F731F9F5F749FE0028EED15E :1019800010BDB0360000FFB58BB0199B0D1C041CB8 :101990001A203C005CD00000002B169900D11820C2 :1019A00001901498002827D0FF20199B0130002BAC :1019B00001D1182300E01A230433824204D3D01A41 :1019C000400840000004000C0D906A480088C21ACC :1019D0001204120C3C0098D000000492002908D098 :1019E0008979664A4900515A049A511A0A04120C1C :1019F0000492049A824205D90020049002E06048D3 :101A000004900D9001980104090C0A910020F4F74C :101A100084FA009000683C00D4D0000000260690B4 :101A20002060002005900E9800240005000C09900D :101A30001A980D9F4007400F089007940395002DBA :101A40000DD02889B84204D836183F1A07D0ED685F :101A5000F5E73904090C281C3C0010D10000F4F70C :101A600038FBEFE7002E02D10799002971D1271C1E :101A70006C20F4F788FB0799041C002920D10794F7 :101A80000020A0611898271C606017982437A06078 :101A90000698206115980FC80FC73C004CD1000074 :101AA00014985C2160630998085319986921E063D0 :101AB0001B9808551C9860651998002823D0089831 :101AC000069908831FE06C22201C0799F3F71AFA85 :101AD0003C60019862213018C85315983C0088D1A9 :101AE00000004021807AC8550020B86306980A9902 :101AF000F4F71FFAF8600299F4F73BF9201C403024 :101B0000818B059A1207120F1143818303985E217E :101B100002900198224A30180853126801213C00B3 :101B2000C4D10000081C002A00D01B980006049AAB :101B3000000E964203D92C2211551B4904E0159939 :101B40002C22097A11551949085C662108551C9800 :101B5000002801D01F200855002D03D0E86803900D :101B60003C0000D20000002000E009E0E860059899 :101B7000002601300004000C0D9F0590039D6DE7C9 :101B80000098E0600299F4F7FAF800202060012143 :101B9000A1636034608007980FB0F0BD000006615B :101BA00001003C003CD200005C4301003809000009 :101BB000186701000E6101000A6101000148006818 :101BC00070470000C46A01000249091D03C940189A :101BD00070470000C46901000148006970470000B7 :101BE000C46901003C0078D2000001484069704798 :101BF0000000C46901000148806970470000C469A1 :101C0000010070B50D4E0020351C4035F0630DE02D :101C1000A068F4F77AF9B36D002B04D000220120FC :101C2000616BF3F795F83C00B4D20000201CF4F788 :101C30009DFA281CFAF742FD041CECD170BD00008F :101C4000C4690100F8B51A4F0026F86B00282CD0A3 :101C5000381C403000901DE01648B96B02F05CF86B :101C60000022201C144903F03C00F0D200007BFF4E :101C7000051C04D1386A0130386201360DE0A068D5 :101C8000F4F749F9BB6D002B04D00022281C616BCE :101C9000F3F764F8201CF4F76CFA0098FAF711FDDA :101CA000041CDCD10748B96B02F03C002CD30000C7 :101CB00025F80020F863301CF8BD0000C46901005D :101CC0003463010011300000C460010001490120AB :101CD000C8637047C469010080B50020054A00212F :101CE0001C2343439B1801300428D9663C0068D369 :101CF0000000F8DBFCF7FDFC80BDC4690100014970 :101D0000C86470470000C4690100014988647047D5 :101D10000000C4690100B0B5041C0D1C211C028E1A :101D2000806A4031F3F72FF8002816D102213C00D9 :101D3000A4D30000201CF4F76FFAE269C000101869 :101D4000828BAB889A4204D182692B689A4208D26E :101D500001E09A4205D2002118300CCD0CC000E001 :101D60000121081CB0BD0000F8B5061C002744681E :101D70003C00E0D300000FE00949486A01304862A6 :101D8000A069002802D0F4F700FAA761266225684E :101D9000201CFFF752FB2C1C002CEDD1F8BDC469B0 :101DA00001000330074A8108136850681B688900E6 :101DB00009183C001CD400008B4201D3516000E0A4 :101DC00000209060704700008C6E010070B5124ECC :101DD0008038C50070590C1C002804D101210D2049 :101DE000F3F72EFF0DE02069002805D1A81981889E :101DF000E06801F03C0058D4000047FA20617159B6 :101E0000201CF2F7BBFF041C002C07D0E068002860 :101E100001D0F4F792F8201CF4F7BDF970BD5442DC :101E2000010070B5041C0D1C0E490622F3F735F8AD :101E30000026E66166623C0094D400000720302151 :101E40000855E663281CF8F76BF8A076201C1430C0 :101E50000622291CF3F724F80622291CA018F3F700 :101E60001FF8266170BD00001261010080B5FDF70A :101E700085FE80BD014948603C00D0D40000704719 :101E80000000E4650100024980B54968F2F77CFF73 :101E900080BDE465010080B5F4F7E5F9074907481E :101EA0000EC90EC018380068002802D002F0B7FA38 :101EB00080BD02F09EFA80BD00003C000CD5000001 :101EC000B058010090730100054980B58968002071 :101ED000002900D103200006000EFAF7E3FB80BDC5 :101EE000606C010080B5034806220349F2F7DEFF6B :101EF00080BD000040800700126101003C0048D511 :101F00000000B0B5041C0C4D0B1C211C00200C3D26 :101F10000029094C05D02878211C1080021C181CAF :101F200007E011880E2907D80A06120E191C201C7A :101F30002A70F2F7BEFF0120B0BDB06901003C007D :101F400084D5000010B500200A4A012111600A4C16 :101F50000AE0021C016A5032914205D061783C23AC :101F6000594309190431016204F0BAFB0028F0D189 :101F700010BD0000DC62010068610100044880B50A :101F80003C00C0D500000068002803D0011C1020D0 :101F900004F0C7FE80BD286101000322111F80B537 :101FA0000020FBF776F980BD000080B50BF0B9FA90 :101FB00080BDFFB583B0161C002101911F1C0821B4 :101FC00002AA3C00FCD50000FAF70EFF041C2AD13F :101FD00002984168490001D4092424E0FAF752FF2D :101FE0003860029841684902CD0F291CFAF744FF76 :101FF000011C306038680006000E00F01BF8002855 :1020000001D10A243C0038D600000FE03168029864 :102010002B1C01AAFAF7D7FF002806D00198002848 :1020200004D004990968814200D2032401980499DC :10203000086007B0201CF0BD000070B5051C0E1C28 :10204000012400F084FF3C0074D60000002808D072 :10205000032D01D0042D04D10320C003864200D3F8 :102060000024201C70BD00007CB5151C061C0C1C37 :10207000291C6A4601ABFFF7A5FF002802D1002CFE :1020800001D103207CBD17483C00B0D6000000AB56 :1020900006601879072821D202A31B5C5B009F44CD :1020A00000001D040406101713000420EDE72A1C8D :1020B000211C0120009BF2F781FE002812D106208E :1020C000E3E72A68009905E000983C00ECD60000A0 :1020D0004278811C01E02A686946201CF2F7FEFE66 :1020E00003E004218720F3F7CFFD0020D0E70000B4 :1020F000F86B0100F7B586B00E1C082105AA0698FA :10210000FAF77EFE041C45D1059841683C0028D7AB :10211000000002904902C90F002504950391089F11 :10212000FAF7D5FE019002A903C9FAF7C6FE019994 :10213000052914D202A35B5C5B009F4400000E03E0 :10214000060C030087420ED807E087420BD83C00FC :1021500064D700000125C01B049007E0874205D129 :10216000012503E005218720F3F794FD002D01D11F :10217000032415E005984168002969DA3A4A06996E :102180001160FAF791FE071C05980399FAF786FE8D :102190003C00A0D70000051C011C381CFFF75FFFA6 :1021A000002801D10A245EE0072F57D202A3DB5D8D :1021B0005B009F440000530404062E504800042492 :1021C00051E00498002801D1002714E0089908186C :1021D00000043C00DCD70000000CF4F72BF8071CCF :1021E000311C089AF2F786FE089804993818F2F71D :1021F0002FFE089804993E1C40180890311C0020BE :1022000008AAF2F7ECFD002800D10524002F2DD0FC :10221000381CF3F73C0018D80000EDFF29E00399C3 :10222000002904D0059840688702BF0A00E0002713 :10223000311C281C089AF2F760FE0499002903D08B :1022400008982818F2F707FE002F12D0F2F7CCFDFD :102250000FE0311CA81C3C0054D80000089AF2F78B :102260004FFE0898687007E0FFE7072404E00824A1 :1022700003218720F3F71AFD201C09B0F0BD0000F0 :10228000F86B01009EB51C1C00AB19720092002275 :1022900001946946FBF708FA3C0090D800009EBD07 :1022A00000008FB5029200220090019003916946D0 :1022B0000420FBF7FCF98FBD0000B0B50C1C012811 :1022C0000AD0032819D004282CD1606801F035FC0D :1022D000011C83200CCC22E01C203C00CCD8000048 :1022E00014496043401814494518281CF8F746FC67 :1022F000A968002903D0221C082005F071FEB0BD9A :10230000208CC82801D3042004E0652801D30220D2 :1023100000E001202084201C03F0DCFA3C0008D9F6 :1023200000002268E368011C8220FFF7B4FFB0BD03 :10233000A0210820F3F7C3FCB0BDDC71010064EEFE :10234000FFFF0348044A81685161C068906170478B :102350000000F4680100C07101000349044A3C0018 :1023600044D90000086B90608868D0607047000016 :10237000905C0100C071010000B5FFF7F1FFFFF7AD :10238000E3FF00BDB0B50D1C002814D00B490C4C68 :1023900088686269C968801AA269891A401804D0DD :1023A0003C0080D9000064235943F2F7C4FE206149 :1023B000FFF7CDFF206928600120B0BD0020B0BD2F :1023C0000000F4680100C0710100B0B50D1C0028C8 :1023D00017D00C490D4C086BA2688968801AE26816 :1023E000891A3C00BCD90000401807D022889042CE :1023F00004D964235943F2F7A1FE6060FFF7B6FFEA :10240000606828600120B0BD0020B0BD905C010074 :10241000C07101007CB51068002802D000F024F8DB :102420007CBD0F483C00F8D90000C0698468E068B2 :10243000256AA669F3F7E3FDE169F3F706FD201CC1 :10244000E2694030C18B12898918C1830749019420 :1024500000912869331C82880168E068C068F8F739 :102460001EFCE0E700003C0034DA0000846A010052 :10247000915E0000F0B58569066A041CC06885B0ED :10248000C068002801D1F3F757FC0A49029504946B :102490000391306982880168262001920091435D92 :1024A000E068E1692A1C0E323C0070DA0000C06866 :1024B000F8F737FD05B0F0BD0000E9D9000010B510 :1024C000141C0548FCF77BFBA068F3F79EFDE16850 :1024D000C160201CF5F7BBFA10BDA06A01007CB5F5 :1024E000041C6030027BA16900913C00ACDA000062 :1024F0000192221C211C3831A06848320D1C6369EE :1025000003F07AFB08210020F3F788FDE0602669DC :10251000B16B002901D0102300E018230549019474 :1025200000913168CA180823011C281C3C00E8DA15 :102530000000F8F720FD7CBD000081DA0000F0B556 :102540004668171C041C0121301C9BB0FAF70DFCD7 :102550000025002803D013490A7A012A01D1012558 :102560001CE088624E612089C861608900283C00B7 :1025700024DB000003D000200884488404E0E068E5 :102580000884208A4884608A8884086B002803D1E4 :1025900001A803F077FC04E001200861002002F0AC :1025A00039FB3D711BB00120F0BD0000F46E01004D :1025B0003C0060DB000010B5041CF7F7E8FB0028C6 :1025C00011D14B20005D01280DD1201C04F085FAAB :1025D0000021201C04F0F3F8A0690021C207D20FEB :1025E0000420F4F7D8F910BD000038B5041C04F03D :1025F00036F93C009CDB0000002803D04030807A94 :10260000002825D10C2029210855211C0622A018BC :10261000F2F7A0FC201C06220E49F2F79BFC0120D9 :10262000E06160620720302108550025E56306203F :1026300000AB18803C00D8DB0000E068002801D027 :10264000F3F7DBFC02216846FDF773FBE060201C1A :10265000FFF769FCE560201C38BD12610100FEB582 :10266000051C0E1C152000AB98801421171C00209F :10267000F3F7E3FC02903C0014DC0000046806223F :10268000311C601D2571F2F76BFC0622391C201CE1 :102690000B30F2F765FC01A8FFF752FCFEBD00000D :1026A00080B50023FBF75CF880BD000070B5051C09 :1026B00008350F4E291C041C3C0050DC000006228B :1026C000301CF2F750FCA088B082281C05F0A1FF56 :1026D00000280BD0E0883061281C04F0CCF8A188D9 :1026E000403041800020F4F7B8F902E00420F4F70C :1026F000A0F9002070BD707C01003C008CDC000063 :1027000080B50020FBF7F8FB80BD000070B5041C0D :102710000430051CFDF732F8002809D00020F7F737 :1027200037FC002804D00622011C281CF2F71EFCEE :102730000A4E0622291C301CF2F718FC3C00C8DCAB :1027400000006089F082281C05F069FF002803D092 :102750000220F4F788F902E00520F9F7F4FA0020E6 :1027600070BD707C010010B5041C007904281CD2D7 :102770006079012801D0032804D1002201213C0006 :1027800004DD0000A01DF9F769FC6079002804D180 :1027900022790021F9F762FC0AE0032808D100241D :1027A000221C00210020F9F759FC0134042CF7DB2E :1027B000012010BDF0B597B0171C051C0430041C97 :1027C0003C0040DD000015AA16A905F0E2FE002835 :1027D0002ED015984B21095C002923D0012902D065 :1027E00002291FD101E004F090F9AD7A1348169E3A :1027F00005800622211C0830F2F7C1FB221C311C87 :1028000002A83C007CDD000000F074FB0A200AA94D :10281000487200AB9D80022101A8FDF79FFA059048 :1028200002A8FFF795FBF3F7F7F90021159803F0DD :10283000E1FF002000E00120387117B00120F0BD59 :10284000987C01003C00B8DD000080B50120FBF75A :1028500062FB80BD0000B0B5041C807D151C0A1C05 :10286000C007C0170130211CF9F7FBFC002803D179 :10287000042028710120B0BD206AF7F776FE606A57 :10288000F7F77BFE206A3C00F4DD0000FEF788FAD3 :102890000020B0BD10B5141CC27981798088F7F78B :1028A000A1FA2071012010BD80B50123FAF770FF55 :1028B00080BD0000F0B5041C081C00210F2891B059 :1028C00000D30221002941D13C0030DE0000C000CD :1028D000244F1090C619B288216802A8F2F75BFB5A :1028E0002189B088091A002907DD09042268090C2A :1028F0001018F3F7C0FB051C00E00025B07980211B :10290000884317497831095C00203C006CDE0000E8 :10291000F3F7B4FB071C00681349019010980B589B :10292000019A291C02A8F2F7ACFA0090281CF3F7D0 :1029300073FB201CF3F782FB0098002808D0029854 :1029400001990860B079391CFAF720FF3C00A8DE35 :10295000000011B0F0BD381CF3F761FBF9E72D2042 :10296000F3F7F5F9201CF3F76CFBF2E700002444C1 :10297000010070B5051C2035061CA879042848D232 :10298000E979012913D1301C283003F092FF3C0073 :10299000E4DE000000283FD0011C8C310165A979DC :1029A0004C22041C11548118416250340462E11E0F :1029B00081620BE000292FD13C2218494243541870 :1029C000174A04341268002A00D14870002C23D022 :1029D0003C0020DF0000351C3035E879012801D0AB :1029E000052801D10620E8712022311D2068F2F768 :1029F000DEFAB08CA080E879A071A8790025A063E8 :102A0000012060810020E0602E36E80000191830B7 :102A100008223C005CDF0000311CF2F7CBFA0135E4 :102A2000042DF5D3012070BD68610100DC62010056 :102A300010B5041CC07A012801D0032807D1201D3D :102A400003F040FF002802D0A17A40304173E07AC1 :102A5000002801D03C0098DF0000032802D1A07AB2 :102A600002490870012010BD00006861010070B5C6 :102A70000E1C0321041C301CFCF7E1FB002801D0D4 :102A8000857800E000250B48321C00680368207C34 :102A90008007C00F211C3C00D4DF0000F7F762FE66 :102AA000002805D00121281CFDF7FEFB002000E0D6 :102AB000082003F0C5FF002070BD0000E4650100A0 :102AC00080B5426800880121490608432D2105F0A0 :102AD000D3FB80BD034901203C0010E00000497891 :102AE000022900D0002070470000846601008CB5E8 :102AF00001281FD100290DD001290BD0022901D0B6 :102B0000032916D10020F9F714FC932000AB18809C :102B1000002008E0012900D000203C004CE000002B :102B2000F9F70AFC832000AB1880022000F0CCF8F3 :102B300001906846FFF73AFA8CBD01210E20F3F7A9 :102B40001BF9F9E7FFB5171C1E1C1421002083B0E8 :102B5000F3F7ACFA051C0468122000AB3C0088E0D7 :102B6000000098800622601D0399F2F732FA0020D7 :102B7000207127730499201CE172311C06220D304C :102B8000F2F727FA029501A8FFF713FA07B0F0BD94 :102B90000000F8B5061C0F1C0C210020F3F73C00C8 :102BA000C4E0000089FA0568041C281D0622311CB7 :102BB000F2F712FA6F81201CF8BD0000B0B5041CBA :102BC0000D1C08210020F3F777FA01688C718D80C5 :102BD000B0BD0000F7B50E1C1021171C0020F3F744 :102BE0003C0000E100006BFA0468051C201D062271 :102BF0000099F2F7F4F96681A781281CFEBDF3B5B0 :102C00000C1C0821002085B0F3F759FA061C076850 :102C1000E068002802D00599012904D1059838718F :102C200000203C003CE10000787156E0036801217F :102C3000039320690290FCF717FB051C02983221D0 :102C4000FCF712FB0022D243011C281C04ABF7F74F :102C5000B9F8002804D1301CF3F702FA00263CE052 :102C6000002D05D03C0078E100006878093807287D :102C700001D8322028701C210020F3F726FA019099 :102C80000568011C301CF3F740F9E068F3F70BFA14 :102C9000A861E1680198F3F738F90020E060059831 :102CA0008021084338713C00B4E100000120211C60 :102CB00014317871281C0622F2F79AF9029A292019 :102CC0000092005D0121E26A082800D00021281C42 :102CD000039B02F09DFFA06B2861206C68617F3030 :102CE00001D10F206861301C3C00F0E1000007B00A :102CF000F0BD10B5041C08210020F3F7ECF90168C1 :102D00000C7110BD00000148006870470000286188 :102D100001000149086070470000E4650100021CE1 :102D200001200006084380B52D213C002CE2000064 :102D300005F0C0FA80BD000080B5012807D0F12859 :102D400025D0F32827D1022002F0BCF980BD00294C :102D50001AD0012903D0F229F8D188211CE01048AB :102D60000178002905D140780128EFD13C0068E2C4 :102D7000000000F016FA80BD0B4814300089FCF703 :102D80005AFC011C01220F2005F09FF980BD04F0C0 :102D900052FA80BD0020FAF732FE80BD02210F20DA :102DA000F3F705F880BD84660100014800783C0017 :102DB000A4E2000070470000746601000149002091 :102DC00048607047EC650100F8B50E1C134D011CFE :102DD000141C6822281C1F1C0C30F2F771F90F49D3 :102DE0000020AC394860012129601921192C6E6737 :102DF0003C00E0E2000000D3211C2981094914397C :102E000088738F74C878012808D001210F2005F03D :102E10009CF91920FCF715FCFBF799F80120F8BD87 :102E200000009866010080B5012802D100F02FF85B :102E300080BD3C001CE3000001211D20F2F7C0FF13 :102E400080BD00007047000001200749000580B5E3 :102E5000886000228021162005F04CF904F034FD32 :102E60000249086180BD000000100700246D0100C8 :102E7000064A80B53C0058E30000D16A814207D180 :102E8000107F2423044958434018C068F2F735F8EE :102E900080BDD4790100944601001D481CB500781E :102EA00000282DD01C480068002829D01A4A1A4B47 :102EB000043211681C693C0094E30000A14222D155 :102EC00051685B6999421FD1164949689368C91ACC :102ED000814219D2D06814490130D0600968884213 :102EE0000CD90622FF216846F2F72EF9F3F7ACFC65 :102EF000011C0023002268463C00D0E3000002F0E1 :102F0000CEF901221D200A4905F0F7F81CBDF7F79C :102F100088F904228118081CFCF727FBF6E71C75CA :102F200001004475010028610100905C0100F05926 :102F30000100A086010080B501683C000CE400009F :102F4000002915D10079022812D1081CF7F780F862 :102F500000280DD003F0F2FC0830418F002907D182 :102F60008069002804D08079062801D1FCF718FB7D :102F700080BD000001490020886270473C0048E4A1 :102F8000000078690100B0B5054D041CA91DFFF7CC :102F900014F80622291CA018F2F74BF8B0BD707C7B :102FA0000100B0B5041C151CFFF707F80622291C08 :102FB000A018F2F73EF8B0BD000080B50A303C0022 :102FC00084E40000F7F7BCF90123002803D005488A :102FD0000078012804D100220021002003F0C6FD62 :102FE00080BD0000A079010080B5002300220021EF :102FF000002003F0BBFD80BDB0B5054DAC790A1CC7 :103000003C00C0E40000011C0123012003F0B1FDDD :10301000AC71B0BD000020100700F8B5061C0C1CF8 :10302000880702D5F6F747FA10E060070ED5174F6C :10303000A320C05D154D102800D3154D04F059FC98 :10304000B96F3C00FCE40000401A291A0120F6F791 :10305000C1FAE0071149C00F48600CD00D4C443C48 :10306000207803280FD1002E06D0F6F7F9F9011CBD :103070000120F6F7AFFAF8BD09490120F6F7AAFAE0 :10308000012020703C0038E50000F7E70121301CEA :10309000F6F789FAF2E7A60E0000A46C0100C40955 :1030A0000000B057010040420F0080B5062804DB45 :1030B0000521FF20F2F79FFE80BD034AC00011509A :1030C0000121801801713C0074E5000080BD000002 :1030D0009C5A01000148806870470000D0600100E0 :1030E000B0B5084C251D281C216800F0F1FE002811 :1030F00003D101210448F2F7CFFA281C216800F01F :10310000FBFEB0BDC06001003C00B0E500002C102B :103110000700B0B5104D0C1CA868002802D104F0BF :10312000F4FB2860201C04F038FB0121032003F08D :10313000C4FE04F0F0FBA86800280BD104F0E5FB06 :103140002968001B401A696840183C00ECE5000043 :103150004108401828600120A860B0BDD06001007F :10316000F8B51F4E0024B068002802D104F0D0FB4F :10317000706005F061F804F08FFB051CF9F766FE3E :103180003168184A41181268E80B002A3C0028E60A :10319000000000D1A80A401885421FD9144F2D1AEB :1031A000381C2030817900AB1970C079587005F057 :1031B0006EF8002803D102218F20F2F728FE291C87 :1031C0000C48F268F8F709FC002804D0011C3C0008 :1031D00064E60000281CFFF7A5FF012400AB188857 :1031E000F88405F047F8201CF8BD0000D06001000D :1031F000F474010000100700891301000149012047 :10320000C8607047D0600100064880B5006801289A :103210003C00A0E6000007D10448AC38016903482F :1032200000F079FEF3F72BFA80BD98660100346355 :10323000010080B542788168007903F0DEFF002844 :1032400001D1F5F7B6F980BD00001FB504F069FBA8 :10325000F6F73C00DCE6000091FF164C022803D193 :10326000FFF7DCFD042802D3002020701FBDFBF710 :10327000F7FC0028FAD1606A0028F7D02078800790 :10328000F4D40921162004F093FF012020700B4C88 :10329000094902903C0018E700000194009104F0F5 :1032A00046FB001903906846FDF7B5FB0022162186 :1032B000842005F03EF8DCE70000606C010061ED61 :1032C000000040420F00234870B580789CB0012870 :1032D0003ED1204C09A83C0054E70000803C611C12 :1032E000FEF792FE042011AD6872A06F19A9189024 :1032F0007C20005D012608711D20005D002806D09D :1033000010961296FCF7F6FA2872207A1190F3F7CD :10331000CDFF6A21085340343C0090E700000022B2 :1033200001A906A8F6F7CDFF211C0020FBF7CBFB77 :1033300006A9FBF7C8FB01A9FBF7C5FB0A49096809 :10334000002907D0331C0A226946FBF7DAFB009AF2 :10335000072191700C9009A8FEF73C00CCE7000013 :103360007BFE1CB070BD000084660100E4620100B9 :10337000F8B5041CC068FF22016812020E1C087B0D :10338000497B090211400843051C311C0622A01884 :10339000F1F77CFE0622B118201CF1F73C0008E88A :1033A000000077FE280A290208430004032149028D :1033B000000C884208D2E06801890E390181E0687A :1033C00001680E310160F8BD0026201C103003F0AA :1033D000E8FA218B002905D1E17D00290BD03C00C2 :1033E00044E800008069800708D4E068012601896C :1033F00002390181E0680168023106E0E068018974 :1034000006390181E0680168063101601449002035 :103410000B1F42009A5AAA4202D11149063102E01A :103420003C0080E8000001300228F5D3E068062265 :103430000068F1F734FE012ECBD1812000AB18805B :10344000E17D208B49030843310308430004000C4D :10345000010A000208435880E06819880068C180AA :1034600059883C00BCE800000181B5E76A460100CC :10347000B0B50D1C01890622083101810468044998 :10348000083C0460201CF1F70DFEE580B0BD000093 :103490006A460100F8B5002901D0002801D10020BA :1034A000F8BD09043C00F8E80000090CF2F743FFFE :1034B000061C051C002720E02C892968022C01D25B :1034C000022001E048780230844202DD241A091803 :1034D000F4E7844210D0011B0A040104090C120C09 :1034E000281CF2F79EFE3C0034E90000002806D1BB :1034F000E868F2F72DFEEF602889001B2881ED684F :10350000002DDCD1301CD1E7F8B58568041C80693A :103510002E1C00280DD07168F2F7F6FDA069F2F7B5 :1035200017FE06E00021C1603C0070E90000F16078 :10353000A08D36680138A085F0680028F5D1306884 :10354000A060A08D01380004000CA08502D0201CD2 :10355000F9F739F82A4F2A480068002803D00621D5 :103560006868FAF77CFD686800683C00ACE9000018 :10357000817800292BD1C178002930D1218E0139E1 :103580002186FBF715F8A16A081AA062E169884252 :1035900003D904210220F2F767FCB86800281ED086 :1035A0001A49208E49680C22521A90423C00E8E9E0 :1035B000000008D319239B01AF2292015943A06A4E :1035C000511A88420ED200210C2003F0ACFC0020DE :1035D000B86007E0012905D1C078172802D1A08E74 :1035E0000138A0862A1D06CAE0686369F1F73C002D :1035F00024EA0000DCFCB54201D02D68B4E7A08DC0 :10360000002803D10548B96900F09EFCF8BD000010 :10361000FC5A0100CC5C010018570100C460010095 :103620008907074BCA0F80B5197C002906D0814352 :103630003C0060EA0000197403D10721152004F052 :10364000A2FE80BD00007869010080B5011C012048 :10365000FFF7E9FF80BD80B5011C0220FFF7E3FF03 :1036600080BDB0B51B4C6068FCF72FFF20680025BB :1036700040683C009CEA0000002803D0FDF718FCDD :10368000206845606068FCF7C5FE1448616800F07A :1036900061FCA07A012805D0022803D020680068C8 :1036A00000F0DEF801211F2004F0B2FD00211F20F0 :1036B00004F0AEFD3C00D8EA000002211F2004F017 :1036C000AAFDA57221682C20405C8968F1F776FC80 :1036D0006068FCF7E4FE20680562B0BD0000147A63 :1036E00001003463010004490A68C868926A002A2C :1036F00001D0096908183C0014EB00007047000075 :10370000147A0100B0B5134C051CA07A01380228C8 :1037100019D801211F2004F081FD2068FC23011C21 :103720002030027B1A400273002D0FD001231A4370 :103730000273A07A032807D13C0050EB000001205F :1037400001F0E7FD002801D1FFF797FFB0BD4B6204 :10375000B0BD022111430173F6E7147A010010B5E0 :10376000041C0A30F6F743FE00280CD022880A49D0 :103770000B7A9004C00F002B06D13C008CEB0000AC :103780001206920E202A00D10120C86010BD002828 :10379000FCD100222421802004F004FE10BD000092 :1037A000047A010080B5021C1F21802004F0FAFD7C :1037B00080BD0000F8B51D4E041C30683C00C8EB0D :1037C00000001D1C4768201CF1F70AFCFBF787FA74 :1037D000002804D0281CF2F72AFB002828D12088D2 :1037E000400525D430680068FEF759F9002803D158 :1037F000FDF789FAF1F7EDFB3068002540683C00E1 :1038000004EC0000002803D0FDF764FB306845603D :1038100020880009000703D104F0C8F86188451822 :1038200030684561816A0131816220888004C10F5E :103830000248F8F7CDFFF8BD147A0100B1EB0000A3 :103840003C0040EC0000B0B50E4C051C6068FCF775 :10385000F6FD0C48616800F092FB0021242004F082 :10386000ECFC0022D2438021242004F0B8FC00208C :10387000E0602072206801682806000EF1F7B0FBB6 :10388000B0BD3C007CEC0000047A01003463010010 :1038900010B5041CC068F2F785FC201CF2F7B0FDDF :1038A00010BD000070B51C4E051CB07A2C1C4034B5 :1038B000022826D1A08B3189884222D13068416A02 :1038C000002908D03C00B8EC00002030007BC00785 :1038D00004D5012001F02FFD002818D160780028C0 :1038E00009D1306802232030027B0D495208520072 :1038F0001A43027301E0FF21F53101221F2004F079 :103900006EFC0320B0723C00F4EC000002E0281CC6 :10391000FFF7C4FF6078002803D1291C012003F0C1 :1039200029FB70BD147A010050C30000B0B5041C1F :103930006034E0790E4D00280AD10220A872286870 :103940004068002804D10B483C0030ED0000FDF732 :10395000D0FA2968486004F038F82968C861FFF790 :10396000E0FE29680969081A03F06FFF002801D0FA :10397000E079A071B0BD147A0100C1EB0000F8B588 :10398000041C002604F021F8051C3C006CED00002E :10399000224800270770A10704D0E107C90F016280 :1039A000C5610126416B002934D1002E32D0061C9E :1039B000F9F744FF316B1A4B411AA20712D5DA68A6 :1039C000002A08DD91421A6802DA14093C00A8EDC9 :1039D0000000A21806E01409121B03E00A4302D1FA :1039E0001A6852001A60B7630AE0B26B0132B26320 :1039F000022A1A6801DD940800E01409121B1A60FB :103A0000D9603063F56218680849884201D93C00E2 :103A1000E4ED0000196003E0642801D2642018601E :103A2000F5F7FCFDF8BD0000606C0100B057010027 :103A300020A10700FEB5041C0020504D0021686144 :103A40002069FBF7B3FC071C20690321FBF7AEFCE0 :103A50003C0020EE0000002803D0807829788842BE :103A600063D1474D201C1430391C061C2A7802F003 :103A70005AFA002859D1E068056841480195583044 :103A80000290FBF76AFF3E4D193500280BD0281C29 :103A9000FBF73C005CEE000055FF00281ED1311CF6 :103AA000281CFBF765FF002842D017E0281CFBF715 :103AB00049FF002806D0391C0298FBF763FF002855 :103AC00036D00BE0391C0298FBF75CFF00282FD0A2 :103AD000311C281C3C0098EE0000FBF74CFF00282E :103AE00029D0301CF6F7ADFC294A1832117C002988 :103AF00004D0516A002901D000281CD1906A002806 :103B00003BD01378019D01216D8901202B409B073B :103B100011D0A36B1E4E3C00D4EE00001D1C7F355F :103B20009836002D14D0558A002D08D15569AB4226 :103B30000FDA0020174D01236B610AE029E0F578C8 :103B4000022D06D1144F55693F68ED19AB4200DADA :103B50000020236C1D1C7F353C0010EF000010D0AE :103B6000558A002D03D19569AB420AD208E0F57859 :103B7000022D06D10B4E95693668AD19AB4200D2C5 :103B80000021084308D0106A002801D0F1F74BFA51 :103B90000021201C01F0B9F9FEBD3C004CEF0000F3 :103BA000EC650100C4670100CC6701003EB5056A01 :103BB000041CC068F2F734FBE169F2F757FA201CE5 :103BC0004030C18B0431C1832B6910499879062894 :103BD0000AD1988801910294009060693C0088EFB6 :103BE00000001B680168E0680322C0680AE0022840 :103BF0000BD11020009001910294E068A369C06885 :103C000000220021F7F70FFB3EBDF2F7A6F9FBE714 :103C10000000BDEF000080B5D1685069C9683C0064 :103C2000C4EF0000C160D168C860111C4031CB8B6B :103C300000891818C8831068002802D0FFF7BCFF5D :103C400080BD0348FBF7CCF8006AFEF7F5F980BDAC :103C5000A06A0100F8B5061C0A2430070109A00774 :103C60003C0000F0000001430F1C0A4D2F6004F0DF :103C7000FAFEAD682801000FB04205D0013CF4D235 :103C800001219B20F2F741F92802000A082E01D1F8 :103C900031050843F8BD600007000122D20580B558 :103CA00000213C003CF00000042004F0DDFC0F206B :103CB000FFF7D6FF0F2109040840000C80BD00006B :103CC00080B50548FDF74AF90448FDF77BF804483C :103CD000FDF76CF880BD000089340100ED24000080 :103CE000111C00003C0078F0000080B50248F3F79A :103CF0002AFC80BD0000D124000080B5F2F753F902 :103D000080BD80B50021002001F051FE032002F0AB :103D100046FF80BD0000064880B5C169002906D174 :103D2000016A002903D13C00B4F00000816B034814 :103D300000F05EF980BD0000C46901003463010039 :103D400010B5044C206AFCF7B3FB0348216A00F06D :103D50004FF910BD1C75010034630100B0B50D4C66 :103D6000207C002802D001213C00F0F00000FDF78B :103D700086F900252570A068012803D10020A560E0 :103D800001F08FF8A078012805D103489838006920 :103D9000FCF7EFFBA570B0BD00008466010080B5A4 :103DA0000021012001F009FE80BD3C002CF1000043 :103DB00038B569460025F8F7B7FE041C01D101208B :103DC00038BDA068002804D00099A131082004F073 :103DD00073FA1C21201CF1F7A3F9281CF0E700005E :103DE000FEB5071C4C233949584344183C0068F180 :103DF0000000251C4035287A37494876211C30318F :103E000002910C23C856421C0A73497B884246DA49 :103E10003248007880073ED500200190F6F7AFFACF :103E200000282ED0AC210958002901D0E4303C00F4 :103E3000A4F1000000E0CC30061C4068002825D02A :103E40000299087B012811D1201C2E302978F6F721 :103E5000EDF9716803E07218127A824203D9FF31DA :103E60000906090EF7D1A97001200190231C3E33E9 :103E70003C00E0F100001A1D301C00970199F8F792 :103E800058FA002811D0A8788019007A00E00020A4 :103E9000687068780121FBF7E0FD6060381C01F074 :103EA00014FE381C01F0A5FBFEBD0299087BFF3013 :103EB00048733C001CF20000381CFCF719FC03F0AE :103EC000C3FD061CFBF78EFE41007618687861681A :103ED000FBF76AFE3118208D3B1C054A03F012FEE9 :103EE000E5E7000058E30100308007001D75010080 :103EF000D54E00003C0058F20000031C044880B579 :103F000002792030034900F030F880BD0000AC7C1D :103F10000100C4670100031C044880B5C278383032 :103F2000034900F022F880BD0000AC7C0100C867A6 :103F30000100031C04483C0094F2000080B5827923 :103F40005030034900F014F880BD0000AC7C010043 :103F5000CC670100031C044880B5427968300349EE :103F600000F006F880BD0000AC7C0100D0670100C5 :103F700010B5002484800B603C00D0F20000191CB6 :103F8000514301601906091610220630F1F79FF916 :103F900010BDB0B5064D0024AC60EC60EC612C6245 :103FA00002F0F1FC00F00DF8EC622C70B0BD447D25 :103FB000010080B580210148F1F73C000CF30000BE :103FC000C7F880BD04660100F8B5074F002400263D :103FD00018206043C519EE6003F042FD103501342E :103FE000022C41C5F4DBF8BDB87D0100002303605D :103FF000044B002900D1191C4160002A3C0048F301 :10400000000000D11A1C82607047BD75000010B519 :10401000074C206801302060202803D958215820FF :10402000F1F79DFF216801200139884010BD605BD8 :104030000100B0B50D1C041C2168002000293C00C3 :1040400084F300000AD0A943216007D1A068F1F7EA :1040500023F8002802D1216829432160B0BD000067 :10406000B0B50D1C041C2168002029432160A94221 :1040700007D16068F1F710F8002802D12168A94340 :104080003C00C0F300002160B0BD1A4BB0B59A6A85 :1040900000280BD0002A07DBB8242458013CA41ABE :1040A0000019B030007B02E00E2000E00D205D6AB8 :1040B000124C002D01D0207800E0205CFF24A834B1 :1040C000C4403C00FCF300009C60F524C4409C61AB :1040D000FD24C440DC61FF242934C4405C61FF241A :1040E0005334C44000200C3311C3002905D0002AEA :1040F00003DC0221504200F065FBB0BDAC7E010044 :10410000B85201003C0038F4000010B5134C1348BD :10411000211CFF3169310EC90EC0211CFF31242240 :1041200075310F48F1F751F8211CFF313C229931CC :104130000D48F1F7A6F8FCF7A2FF211CFF31102271 :10414000D5310948F1F73C0074F4000041F8211C16 :10415000FF312822E5310748F1F796F810BD00003D :1041600040630100008007000C80070030800700DA :1041700080800700A0800700F8B5002859D004F01F :104180004BF9F8F7B3FB00223C00B0F4000001212A :10419000132004F07CF92A492948496C0160002168 :1041A0002948C9434160264C1434616C8160A16C7C :1041B000C1600020254D022601016E500A194F19D9 :1041C000503204370ECA013008283C00ECF40000DD :1041D0000EC7F4DB1422211CCC311E48F1F75AF82B :1041E0001D4881780909090181700021C170417061 :1041F000211CE0310A78027049784170211CE831B5 :1042000030220830F1F746F8211CFF313C0028F538 :104210000000502219311248F1F73FF88320800046 :10422000142221181048F1F738F811204001842297 :1042300021180D48F1F731F8FFF773FF201CF1F753 :1042400028FDF8BDFFF76DFFFBE7082007003C00E5 :1042500064F500002C6301004020070000300700D7 :104260000040070000500700006007001000070032 :1042700000900700F8B5051C1848C068002825D034 :10428000164E013674783078271A7919201CF1F708 :104290003C00A0F500004BF80090291C201CF1F711 :1042A000B2F8C119201CF1F742F8601A3070701E84 :1042B000806800280DD05336F4780099201CF1F75F :1042C000A2F8B178611A4118201CF1F79CF8601A25 :1042D000B0703C00DCF5000003485C300169C26846 :1042E00069435118C160F8BD447D0100B0B50C4D63 :1042F000E868296940187D2109014418201C03F051 :104300000BFB00280AD003F0CFFB011B2869F1F753 :104310007DF801303C0018F600000004000CFFF7A7 :10432000B2FFB0BD0000A07D010070B5104C606808 :104330008025A84360602068284320600D4E301C13 :104340001030F3F7C8FC002803D107218520F1F7CE :104350002AFE084800213C0054F6000080684163B2 :10436000C06C10307061012030612068A84320606B :1043700070BD0000F400070000300700247E01003B :10438000011C0020052980B509D202A35B5C5B00FB :104390009F440000030303033C0090F60000030069 :1043A000FFF7CFFC80BD0122920280B500210720DB :1043B00004F0ABF980BD80B540220021002004F05C :1043C000A4F903220021002004F09FF980BD70B5FC :1043D0000E1C051C141C08280ED13C00CCF6000055 :1043E00000F000FC0E2801D1142000E01020E103B1 :1043F00000D50138C0060A49C00E887108E0092DB1 :1044000006D1A00401D5002000E00120F3F7B0F9A7 :104410003440211C321C281C04F07AF93C0008F7B7 :10442000000070BD00000080070070B50024132953 :1044300011D8002801D1084E0825012801D1074EC6 :10444000092500F078FA002805D0021C311C281C30 :10445000FFF7C3FF0124201C70BDF8FF07003C00DC :1044600044F70000FFFF00000122D20280B50021C6 :10447000072004F053F980BD0F22120407214904DC :1044800080B5092004F04AF980BD000080B5002104 :10449000042004F01BFC4021002004F017FC044918 :1044A0003C0080F700000020886002480969203045 :1044B000FFF709FE80BD64730100B0B560210020E4 :1044C00004F007FC114D002400220420295D04F0B3 :1044D00028F90C2003F09BFB01342406240E052C44 :1044E000F2D33C00BCF700000F2200210A2004F0A8 :1044F0001BF96121002004F0EFFB064901208860D0 :10450000044809692030FFF7CDFDFF202D30B0BDF4 :10451000A858010064730100F8B5061C1248C67063 :104520000120FFF73C00F8F70000FDFB0127BF0268 :10453000041CB843011C012004F0D1FB0320FFF749 :10454000F2FB051CB843011C032004F0C8FB301C1F :1045500000F09FF900F057F8211C012004F0BFFB88 :10456000291C032004F03C0034F80000BBFB0020B1 :10457000F8BD00006473010080B5002240210020D6 :1045800004F0D8F880BD000070B5051C0124092096 :10459000FFF7CCFB0F210904884303218904E204BF :1045A000052D124E20D202A33C0070F800005B5D86 :1045B0005B009F44000006090C100300032109045E :1045C0000CE00121090409E00121490406E0F36837 :1045D000042B05D902E0F368042B01D8014301E064 :1045E0001043011C092004F080FB3C00ACF80000E3 :1045F000201C70BD0024FBE7647301000121C90584 :10460000002880B502D00A1C002100E0002204200E :1046100004F096F880BD0000F0B591B0002640216E :1046200001A8F0F7DDFD2A4FB87901223C00E8F837 :104630000000520300900021062004F084F860215D :10464000002004F058FB6121002004F054FB0820F6 :1046500003F0EFFA00240F20FFF771FB4005050F70 :10466000A80001A9095801AA013101340C2C3C0011 :1046700024F900001150F1D30020810001AA515803 :10468000B14201D90E1C051C01301028F5D30620BB :10469000FFF758FB0F2149028843690208430121B3 :1046A00049030143062004F029FB0D488468643463 :1046B0003C0060F9000008E0201C03F05AF90028D3 :1046C00003D001219520F1F798FC0F20FFF73DFB67 :1046D0000004F1D5872003F0B2FA0098B87111B048 :1046E000F0BD201007000001070010B5174C6169EC :1046F00000293C009CF9000004D00A21132003F09B :1047000047FE10BD011C1248012900780CD0112968 :10471000F7D1052803D101211320F1F771FC20788E :104720000728EED102210AE0052807D006280AD082 :104730000728F7D03C00D8F900000828E4D1002071 :1047400005E001211320F1F75EFC10BD012002F00D :104750006CFD10BD00007C7801000D4980B5097822 :10476000032901D100280BD0072901D1002807D047 :10477000022901D100283C0014FA000003D10529C8 :1047800009D1002807D00020FCF728FD00221321C2 :10479000112003F0C1FE80BD7C78010080B50622A7 :1047A0000821002003F0DEFF80BD0000074880B52F :1047B0004069002801D1F1F73C0050FA000033FFB6 :1047C0000549054A0868506148689061012080BD2C :1047D000000064730100B058010010000700074892 :1047E00080B54069002801D1F1F71DFF0549054A50 :1047F000086890614868506101203C008CFA000014 :1048000080BD000064730100B05801001000070073 :1048100011B500AB597814480123C056002209187D :104820000B061B161321132B02DD00AB597007E09A :10483000002B02DA00AB5A7002E01C1C3C00C8FAE4 :10484000000000AB5C7000AB1B7818180006001667 :10485000132802DD00AB197006E0002802DA00AB75 :104860001A7001E000AB1870009818BD0000647366 :10487000010038B50C1C154900AB496813253C00F4 :1048800004FB00000091597809185970197808182C :10489000187019881048022CC18001D0002C0BD14F :1048A00000AB1878132800D91D7000AB19780020D0 :1048B000FFF7EEFD022C01D0012C09D100AB587896 :1048C0003C0040FB0000132800D95D7000AB597814 :1048D0000120FFF7E0FD38BD000064730100A0581F :1048E000010070470000B0B5041C0E28134D04D021 :1048F0001249A00000194D3945180620FFF73DFA6E :104900000F493C007CFB0000E02209191039C97BEB :104910009043490111400143062004F00DFA291C7F :104920000520094A03F030FF08481F2200191038FB :10493000C07BC104D204082003F026FFB0BD0000F4 :10494000B40900003C00B8FB000014450100FF0F53 :104950000000C05801007047000080B506490028DB :1049600001D1086880BD012801D1486880BDF1F7F8 :1049700090FB002080BD7C730100014840687047B7 :104980000000A05801003C00F4FB00000448012393 :104990000449C056C95640180004000C7047000076 :1049A000A0580100A258010001484068704700006B :1049B00064730100F8B5051C0E1C00F055F9041CC9 :1049C00000F058F900282CD03C0030FC0000B30067 :1049D000601E002D1C4E19491A4A06D10B250E2CBB :1049E00000D1194AD258085608E0012D1CD19A1856 :1049F0000436081808250E23126DC056071C4743BD :104A0000FB00DF19124B3F2158433C006CFC0000B7 :104A1000114BA9400C1C3818C0181440EC40C011B0 :104A200060431B0AC018801203D1012004E000205B :104A3000F8BD3F2800DD3F203060A84008408A4391 :104A40001043F5E7CC590100DC5801003C00A8FCFC :104A500000007C7301007C5901000606000026005E :104A60000200034808B5C08800AB1880009808BD54 :104A70000000A0580100B0B50B4D094C0E206C6031 :104A8000FFF78DF90949021CC8600106090E3C00B8 :104A9000E4FC0000133A022A02D91738042800D88F :104AA0000021081C6C60B0BD041802006000070003 :104AB000647301000A4898B502781321142A00D3C0 :104AC00001704278142A00D34170064C6068FFF7E9 :104AD0003C0020FD0000BDFE009000AB1888E08087 :104AE00000F075FF98BDA4580100A05801000348CC :104AF00080B541780120FFF7E6FC80BD0000A65894 :104B00000100034880B501780020FFF7DCFC80BD80 :104B100000003C005CFD0000A6580100B0B5054D4A :104B20000024201CFFF744F90134102C01C5F8D3F0 :104B3000B0BD0000D4440100044980B58870044928 :104B400080000958072004F00FF980BD647301004C :104B5000D05801003C0098FD0000B0B53F24021C75 :104B6000002A01D108200B23012A01D109200823A2 :104B7000251C9D40002900D101213F2900D9211C7D :104B800099400A1C291CFFF77CFCB0BD000091B5C0 :104B9000124900AB1A783C00D4FD00000878114C93 :104BA00080180006000E207049785A788918090686 :104BB000090E13221328617000D92270132900D91D :104BC0006270084908480639C98881802178002028 :104BD000FFF782FC617801203C0010FE0000FFF727 :104BE0007EFC98BD0000A4580100A6580100647323 :104BF000010070B51D4D041C28780E1C032803D13C :104C000002211120F1F735FA201C00F04EF800289F :104C100025D0287801280AD168683C004CFE0000A5 :104C2000002807D00121112003F0EEFB0120696864 :104C3000F0F7BDFA6C706E60201CFFF7C1FC041C1D :104C400000F0D4FE002C02D06868002802D1F6F7EC :104C5000D9F870BD012028700122211C3C0088FE7B :104C60000000112003F09FFB70BD02211120F1F71D :104C700006FA70BD00009C73010080B5012805D1C3 :104C8000002904D0012901D1F6F7BFF880BD0549FC :104C90000878032802D00020087080BD03213C0062 :104CA000C4FE00001120F1F7EDF980BD9C730100F6 :104CB00001484078704700009C730100011C0139D5 :104CC00001200E2900D300207047000010B5134CBE :104CD000207801280ED1606800280DD00121112014 :104CE0003C0000FF000003F098FB01206168F0F732 :104CF00067FA00206060207001E003280ED00021D8 :104D0000112003F08AFBFFF724FCFFF7C0FB0549E5 :104D1000087B40084000087303202070012010BD6C :104D200000003C003CFF00009C730100880007006D :104D300010B50D4C2078032813D1002020700B48AB :104D4000017B012211430173FFF770FCFFF718FC90 :104D5000002806D002212170011C0022112003F03E :104D60002BFB01203C0078FF000010BD00009C736D :104D700001008800070080B50549002804D0002004 :104D8000086003F05AFA80BD0120086080BD805A97 :104D90000100FEB5051C8035041CA8682979066849 :104DA000201CA03002293C00B4FF00001CD169790E :104DB000082901D00C2917D101216162A96809686D :104DC000098B0182A9690191008AC00605D5606836 :104DD0000088400501D4012000E000200290052059 :104DE00001A902F0B7F902E03C00F0FF0000002149 :104DF00061620182A9681A230A89676A181C002F58 :104E000000D11820101A0881A8680168626A002A77 :104E100000D11823C9180160A86841C43088083C33 :104E2000400403D5201CF7F7BCF93C002C0001001E :104E3000FEBD0021E1613079C00703D4201CF7F7E3 :104E400091FEF5E7201CF7F743FFF1E7F7B5051CE6 :104E50000A30061CF5F7A4FA144F041C3988F2F73F :104E600083FE328878680280728802303C006800D5 :104E700001000280B18841806988029A201CFAF7FB :104E8000CEFE0B4D08356880FBF72BFE0121090390 :104E90000028288801D0884300E00843288004487F :104EA000002200211430F2F732FE201CFCF73C00F7 :104EB000A400010085FAFEBD247B010010B5134C4F :104EC0001149201CFF3069300EC90EC0201CFF3074 :104ED000242275300E49F0F717FA201CFF303C22CF :104EE00099300C49F0F76CFA201CFF301022D530B5 :104EF0003C00E00001000949F0F709FA201CFF30EE :104F00002822E5300749F0F75EFA10BD0000008066 :104F10000700406301000C8007003080070080809C :104F20000700A0800700B0B500283FD021484168A5 :104F3000214C3C001C0101006160C168E160016915 :104F40002161806AA0621E491C48096814384164C6 :104F50001C48251C3C350FC80FC5201C80224C3036 :104F60001949F0F733FA1422201CCC301749F0F716 :104F70002DFA38223C0058010100201CE030154970 :104F8000F0F727FA201CFF30502219301349F0F7B0 :104F900020FA83208000142220181049F0F719FA13 :104FA00011204001842220180E49F0F712FAFFF771 :104FB0008EFFF8F794FB3C0094010100B0BDFFF7B1 :104FC00089FFB0BD00100700406301000820070002 :104FD0004020070000300700004007000050070095 :104FE0000060070010000700009007000C4980B522 :104FF000012048600A4814383C00D00101000078C4 :10500000012804D008489438406F002803D00020BD :1050100000F01FF880BD08680028FBD00348F2F7B5 :105020007AFE80BD000098660100FFFF000080B599 :10503000002809D1F2210F2003F03C000C020100EE :1050400013FA00220F21F12003F0CCFA80BD0120D9 :10505000F8F76AFE80BD000010B5041C032000F0C4 :10506000C9F900210F2003F0FFF9FFF765F80B499C :1050700000204874FBF7E6FA094800683C00480243 :105080000100002803DC02214042FFF752FC0448E3 :1050900014300068002802D0201CF2F742FE10BD38 :1050A000000084660100D47E0100064980B50978BD :1050B000042905D0052903D0062901D007293C0081 :1050C0008402010001D1FEF7BDFD80BD74660100C0 :1050D00010B5094CE06800280BD107482C38008A2D :1050E000C00704D5002101206268F9F7C9FA012040 :1050F000E060012010BD0000F46E01008CB5021CC0 :105100003C00C0020100081C111CFDF728FF0190A3 :10511000002805D0172000AB18806846FDF7FFF87F :105120008CBDF1B52E4CAEB0002525632069012859 :1051300003D101A801F0A1F84EE00126284F267006 :10514000503F3C00FC020100B869F8F74FF82549D0 :105150002C3900281DD0E06A01281AD1088A0F1CBA :10516000800704D5002102206268F9F78FFA388A97 :10517000000707D5E068012804D1002108206268F3 :10518000F9F784FA3C00380301000022182182203C :10519000266303F036FA25E0088A0E1C800704D542 :1051A000002102206268F9F774FA308A000707D5F7 :1051B000E068012804D1002108206268F9F769FA43 :1051C000308A400704D53C0074030100002200210E :1051D0000420F9F761FA2E98012804D01E950921C0 :1051E0001BA8FFF797FFE562BD61E5602FB0F0BD3A :1051F000F46E010080B50720FEF7A0FE00210F200D :1052000003F044F90C4801783C00B0030100002988 :105210000FD00221017088380078002804D0074997 :105220001031487C01304874F2220F20054903F008 :10523000FCF800220F21F32003F0E9F980BD746629 :10524000010080841E0010B5041C3C00EC0301002A :10525000F2210F2003F020F9012C0AD10848084957 :1052600000681439002805D0C878022802D1F7F761 :10527000AFFA10BD002048700520FEF765FE10BD96 :1052800098660100F8B5284E3021351C3C002804F2 :10529000010060352889895D884203D10020FFF72D :1052A000F6FEF8BD341C70340121217041188019BC :1052B0003030298140781D4F183F3870002808D0C1 :1052C0000021FBF7C2F9002807D12078FFF73C0046 :1052D000640401009BFFE7E701210F20F0F71AFFAC :1052E00014480121803081703869FBF755FA20732A :1052F00000210F2003F0D6F8707A01280ED10E4855 :105300000068002804D0387802F0DAFA002805D0C6 :105310003C00A0040100307F60730320207071897D :1053200005E005202070A888FAF73BFB011C00224D :105330000F2003F086F8BAE7000004660100E4627B :10534000010070B5041C02F06CFC364B191CA03136 :105350000A783C00DC040100102A02D20A79102AE3 :1053600001D3012500E00025304ECA798036012C9A :1053700012D00025022C2ED0042C3CD15C6B002CCA :1053800039D19C6F001B2A4CA04234D9B268986A6C :10539000824231D03C00180501004D7234E0B06803 :1053A0009C6A0222A04221D1586B00281ED1002DF8 :1053B0001CD1487A192820D03468986F6400001BEB :1053C00074680019FF301C4C3930A04216D248795D :1053D0008C79001930283C005405010011D31022AB :1053E0000FE05C6B012C06D1B0689A6A904200D144 :1053F0004D72002205E09C6F001B124CA04200D3AE :10540000202206E04A7A192A01D201324A72202269 :10541000B06030689B6F98423C009005010004D159 :10542000002A00D148794A7106E0102A04D370603E :10543000336048798871F6E7CA7170BD0000A46CCA :105440000100A304000071020000350C00000548B3 :1054500080B5817B002905D000213C00CC050100EE :10546000817303490F2001F00FFF80BD74660100B6 :10547000E9030100F8B5041C02F0E2FB051C384EFC :10548000201C3749341CA0341022443901282CD068 :1054900004284ED1371C743609CE26783C00080605 :1054A0000100C01A202E04D1304EB04201D900268E :1054B0004E613E1C3F6C002F48D1776C002F45D1C8 :1054C000B76A002F3DD0776B002F3AD0274FB842F4 :1054D00037D26078102806D3F06F181A244B3C009E :1054E00044060100984201D2E270F5664869062838 :1054F0002FD201302CE02078202801D106234B61E7 :1055000002232371B36A002B19D04969032916D9E4 :10551000716B736D594012D0E178102910D3617806 :105520003C0080060100331C10290CD3D96F691A86 :10553000134DA94207D2586C002802D0986C00285D :1055400000D12271F8BD0228FCD12270FAE7486927 :10555000002801D0013848610A49F06E401802F075 :10556000B0FA3C00BC0601000028EED00120E0703B :1055700006482818F066E8E7A46C0100E204000081 :105580001A06000053070000002D3101005A620284 :1055900080B541680979C90713D5C16900290DD0C3 :1055A000897902293C00F80601000AD10821018608 :1055B000011C38318162021C06480449F9F7FDFCE0 :1055C00080BDF7F7DCFB80BDF7F723FB80BDB97129 :1055D0000000A06A010010B50024002803D002F0EA :1055E000E8FE002817D03C00340701000C4C0120D5 :1055F000A0722068002141620A490268C9786032BD :105600009171218901312181006840308183FBF74C :1056100031FC20680068FCF7A1F90124201C10BDB2 :10562000147A01000E6101003C00700701007FB593 :10563000061C1E481D1C438802881C21002090B0B7 :10564000F0F745FF03900468FF2101312180082015 :1056500060800620207104206071C001002D00D1FF :10566000081CE08001A80230311C3C00AC0701009E :10567000051CFAF75FFA10496846FAF75BFA201C36 :1056800008306946FAF756FA291C201C1230FAF73E :1056900051FA10AB9888002201212083D8886083BA :1056A0001889E081588920826846F9F73C00E807AC :1056B000010017FF14B070BD0000146E01001261EC :1056C0000100B0B5041C1848251C0078603580071F :1056D000002808DAE879002805D0F4F770FF011CEB :1056E000201C00F078F929882E20005DF2F73C009C :1056F000240801009FFAE87900280BD1201C4030D3 :10570000018B22691180418B22695180808B216934 :10571000C88207E0012805D1206901220188D20250 :10572000114301806A7AE0680249F2F753FAB0BD8A :105730003C00600801001D750100D14F000090B5CC :10574000041C38230C495843431885B000200A49EB :105750000290181C012203910949049230304278CA :1057600009880192009101785A6B0C33201CFBF7D9 :105770007CF83C009C08010005B090BDD4E4010019 :105780005D4E0000487B010090B585B0031C0020F1 :1057900002900A49181C0022049260300391C279D9 :1057A0000188019200915A6ADC682033997B407A23 :1057B000231CFBF73C00D80801005DF805B090BD44 :1057C00000000D4F0000074980B5886A002808D105 :1057D00001208862F0F7AFFC011C03480022F2F7B9 :1057E000B8FE80BD00007869010041E40000F0B51A :1057F0009BB0002820D03C0014090100011C08A81F :10580000FCF7B2FD01201190032010AD2872042096 :10581000687205A800226946F4F700FF00240026FC :1058200005A90020F9F7FCFA6946F9F7F9FA0B9097 :1058300008A8FCF7BBFD01343C0050090100022C14 :105840002E72F0DB1BB0F0BD000090B5041C4C23A1 :105850000C495843431885B000200A4902900022A1 :1058600004923C200391C25C084841880192412087 :105870000091C15C5A680833201C3C008C0901006F :10588000FBF702F805B090BD58E30100754F00002A :105890003C7C0100F8B50E1C224C3821171C051C5D :1058A000201CEFF775FD231C2533211C243110200B :1058B0006A46F9F71DF800AB188807213C00C809B3 :1058C00001001A4A02382084201C20308170C570E3 :1058D000111C0673477334312163303262630179DE :1058E000251C103521812060E5601888401A20832E :1058F000201C28302061201CF9F711F80D483C00CD :10590000040A01000068002807D00621201CF8F7CF :1059100047FD1021281CF8F743FD084802210162C9 :1059200044620121016206480068EFF7D5FCF8BD2A :105930008C8E0100E4FE0100CC5C01000030070009 :105940003C00400A01005C5B0100F0B5061C4036DB :10595000318B041C251C0807800F6035012885B099 :105960003BD0E879002805D120690180B08B2169FE :10597000C88207E0012805D1206901220188D202EE :1059800011433C007C0A0100018020480078800718 :1059900026D5E879002823D0A06B00281CD0F4F786 :1059A0002FFE002809D0B8210958002905D0302140 :1059B000095DB4300818077A00E000270121381C7F :1059C000FAF786F93C00B80A010004902069043017 :1059D000391CF4F76CFD0499FAF7D3F902E0201CA6 :1059E000F7F7F9FB7083708B216900224880094921 :1059F0000A48049203910290EA7929880192009161 :105A0000626AE36820343C00F40A0100A17B687AF2 :105A1000FAF74CFF05B0F0BD1D750100D14F000035 :105A2000DD2F0100FEB5041C261C012020360029B4 :105A300002902ED05820005B0007800F012801D172 :105A4000CC3100E0B43148683C00300B01000D1C43 :105A5000002824D0201C6030C2790121012A00D006 :105A60000021271C626D3037002A04D03A1C281C04 :105A7000F6F7E7FD07E0427A231C683300923A1CF0 :105A8000281CF6F79AFD029038783C006C0B010058 :105A90004019007A0121B073FAF726F901E00020DD :105AA000B0736062B07B0D2801D9F0F7BBFB0298A0 :105AB000FEBD0000FFB5041C8030251C5E3500785B :105AC000AE1DAF1F002883B012D1F4F73C00A80B25 :105AD0000100C7FB002807D006980599029004989A :105AE0000190A66167610DE00498069902900598FF :105AF0000190666105E004A903C90290069801902F :105B00006761A5610622381CEFF78BFC06223C007A :105B1000E40B0100281C0299EFF786FC0622301CDA :105B20000199EFF781FC07B0F0BD0000B0B50D1C86 :105B3000041C052801D3F0F77BFB0249A00008589C :105B40008560B0BD107B0100F8B5FFF759F9051C61 :105B50003C00200C0100FEF7E8FF041C281CFFF7A6 :105B600058F9002842D0691E214D4A00204B1C3DA7 :105B7000AE5C985C3040D6180123F6565219D256C6 :105B8000964201DD151C00E0351C184B2A3B595686 :105B900051183C005C0C0100B14200DB311C0E1CB2 :105BA000002826D0FEF7BEFF009000AB18781249FF :105BB0000023C95600AB1522101A5B78001B401851 :105BC000D21A121B51180022854202DB00AB1A7058 :105BD00002E0401B3C00980C010000AB18708E42A4 :105BE00002DB00AB5A7002E0881B00AB58700098D3 :105BF000FFF78DF801F0FFF8F8BDE6780100657356 :105C0000010070B5084E064D00240620604380193F :105C10000622291CEFF73C00D40C010011FC0134D2 :105C2000052CF5DB70BD00004E470100E67A01004F :105C3000034880B501680348FEF742FB80BD0000C1 :105C4000A8790100C4600100034880B501680348D9 :105C5000FEF74AFB80BD00003C00100D0100A87952 :105C60000100C460010010B500280AD0064CA169EB :105C7000002901D1002000E00968F7F738FBA06196 :105C800010BD002010BDA46E0100F3B5374883B0ED :105C9000029080790E1C002701903C004C0D010001 :105CA0003448354A016A039C031C1B69A14201D098 :105CB000936100E0536131498A6896423FD02D4894 :105CC0008E60C1680024251C00292D4809D0002EB3 :105CD0000BD028480124C06A240300283C00880D0A :105CE000010006D0012704E0002E01D0051CF9E7D1 :105CF000041C002F06D0FBF71EFB1F48016822483A :105D0000FEF7FBFA201C28430ED02A1C211C012080 :105D100002F021FE2A1C211C022002F01CFE3C0085 :105D2000C40D01002A1C211C032002F017FE002FC5 :105D300006D1134801681648FEF7CEFAFAF742FD7D :105D4000039C002C01D101F0E1FF01A903C9887176 :105D500001F0DCFF0A4C0A4B443CA1692269083B74 :105D60003C00000E0100411A002A03D01A685118A5 :105D7000196002E05A6851185960A061266105B0A7 :105D8000F0BD20100700A46C010010000700B05700 :105D9000010000106000847301001CB54C23084909 :105DA00058433C003C0E01004418201C4030417810 :105DB0006268009101923F210B5D618F0078626CF7 :105DC000FAF728F8A0851CBD58E30100B0B5164DC0 :105DD000A969002925D02C1C3034207A002820D035 :105DE000002381223C00780E0100182002F089FC7B :105DF000207AFF300006000E207212D10C482821B4 :105E00002C38095C2172297A002901D1006A00E04E :105E1000406AA9698002814203D24900814201D2CD :105E2000A961B0BDA8613C00B40E0100B0BD01F095 :105E30001DF9B0BDF46E01007FB5051C04206B4652 :105E40001B180290002628186A4602A9FCF78AFB54 :105E5000002806D100AB1879042808D01879032847 :105E600005D000AB187910213C00F00E010008436A :105E700004B070BD03A9E868F6F7D3FF002805D089 :105E80000398202108430006000EF1E703A9002033 :105E9000F6F7C7FF041C01D10220E9E7E86800AB70 :105EA0002060009860601879A0763C002C0F0100FB :105EB000A88C6076E8692061688CA082288C2076A6 :105EC00069690948814200D9081CA060201C02F0C1 :105ED000A1FDA168002904D0039AA132082002F094 :105EE00037FB301CC7E70000A08601003C00680FAC :105EF0000100FEB5061C40780124062850D3C11EBF :105F00000320EFF75EFB00900E2849D800200AE03E :105F10004100091889194A798979511801390E29DE :105F200000D90024013000998842F1DB002C3C00AC :105F3000A40F010037D00322B11C1B48EFF7A4FACD :105F40001A4C1C21201CEFF74DFA002528E06900AF :105F5000491902918A1953791548435493790F18B6 :105F60007B70D379BB700723D2560192445C0FE05B :105F70003C00E00F0100201CFEF77BFF002807D04B :105F80000C4A600080180121103881730199C17397 :105F900001342406240E07480299405C79784018A1 :105FA000A042E8D8013500988542D3DBFEBDE86207 :105FB00001003C001C100100E6780100EB620100CA :105FC00001680F2901DD0F2101600168002901DA54 :105FD0000021016070470000F8B5041C1E48221D16 :105FE00005680092161C231C0F1CCC332A1C201C95 :105FF0007030A16D3C005810010000F03EF9009691 :10600000A16D27200140231CE433201C2A1C5C3096 :1060100000F033F9134800780E2801D2012585409D :106020001148A1690078294000070BD4480703D51F :10603000080701D504203C00941001008143880624 :1060400003D5480601D520208143231CB4332A1CE4 :10605000201C3030009600F013F9391C201CF0F79A :1060600047FCF8BD2C7D0100106701001D75010083 :10607000B0B5F2F727FCFEF73C00D010010009F99B :106080000F48002545700E480D4C00885B34A082F7 :10609000F9F723FD2061A08A002804D00121890599 :1060A000EFF70DFBE18205480138456001F055FE30 :1060B000021C231C00210020F4F73C000C110100FD :1060C00049FDB0BD457D0100F467010070B5161CA7 :1060D0005A89041C04989207920F00250029A27186 :1060E00009D00521F9F724FB002801D0C07800E091 :1060F0000120E07100E0E571E560A6603C00481118 :10610000010070BD0000FEB5051C0E229C30164932 :10611000EFF7CFF9291C281C8030883100242F1C70 :106120006037029101902006000E061CF9F70DFE63 :10613000002803D001984268029901E0EA6D3C0012 :1061400084110100391C002A0DD0002003E00B5CF3 :10615000B34202D801309042F9DB08181038C07BF6 :1061600029199031087301340E2CDFD3FEBD0000D5 :10617000CC470100FFB581B0141C101C06220D1C79 :106180003C00C0110100191C0B9E0A9FEFF797F904 :106190000622391CA018EFF792F9E6602C60102057 :1061A00028816E600198E86005B0F0BD000070B510 :1061B000041C002020615820005D0E1C151CC00727 :1061C000C0173C00FC1101000130E061216B002987 :1061D00036D11E490968294332D0A168898A00292D :1061E0002ED000280BD0201C583000F0F3FD0028E2 :1061F0001BD0816A026A406A0978007806E0144A76 :106200003C2311783C0038120100507843439A181F :106210000432002D03D1022901D0032902D16D21BE :1062200022610855206900280DD08188002901D1FC :10623000012070BD8079022805D1221C074907483A :10624000F8F74BFF02E03C0074120100201CEFF74E :10625000B5F8002070BD00002861010068610100F0 :10626000A1DA0000A06A010010B500210020F9F7B2 :1062700039FEC400F9F754FE2418F9F747FE08491F :1062800020180988084C40183C00B012010006494B :10629000098840186061F9F746FE054909884018E9 :1062A0004000A06110BD0261010004610100D479C9 :1062B0000100A66901001140081C10B51C1C191C26 :1062C00008311860F1F731FE60603C00EC1201000B :1062D00010BD0000F8B5061C22480F1C4168914211 :1062E00003D000218160C1604260C46815E02820AD :1062F0001D4960434018051C0622311CEFF770F859 :10630000002807D1A81D391CF9F710FD3C002813FF :106310000100002801D00120F8BD01342407240F1A :10632000124880688442E5D1104C2823A0680F4DA4 :10633000584340190622311CEFF7D3F8A0682823F0 :106340005843401906302222391CEFF7CAF83C00A6 :1063500064130100A06801300007000FA060E1682D :10636000814203D101310807000FE0600020D6E729 :10637000EC650100A0F4010010B50021032000F03D :10638000E5FF054CA068002804D101F007FD616815 :106390003C00A0130100401A606010BD0000D060F6 :1063A000010002680A6001607047011C0068002853 :1063B00001D002680A6070470000FEB5141C1D1C65 :1063C0000022D24301ABF3F782FF01980026284058 :1063D00001903C00DC1301000025002720601EE036 :1063E0000121B9400A1C024018D0884301903906A7 :1063F000090E7019001902910177081CF9F7C6FC03 :10640000002806D0301C0019013602993030017086 :1064100004E0281C3C001814010001350299001901 :106420000172013701980028DDD17019A061656003 :10643000E662FEBD0000B0B5144D041C287A0128A8 :1064400002D10420F6F7ADF9211CA86AF5F721FC6A :10645000002803D104203C0054140100F6F7A4F9ED :10646000B0BD02202870288C002800D06081688C84 :10647000002800D0A081A88C002800D0E081E86925 :1064800001230204120C201C0249FCF719FFB0BDC5 :10649000F46E0100A17700003C0090140100F8B5F3 :1064A000194E051CB069002800D13068FFF73BFC8D :1064B000154F041C503700280BD06068291C7860E9 :1064C00001203863201CF5F7EAFB002804D10020E6 :1064D000F8BD0023FB62FAE700233C00CC14010066 :1064E0002377F86A002801D10120F862387A012860 :1064F00007D0F86906490204120C281CFCF7E6FED6 :1065000001E0FB62B3610120E5E70000A46E010039 :10651000DD02010070B50D1C041C161C3C000815A2 :106520000100042C1BD21048834207D258000F49A7 :10653000EFF7FBF8FF30000A013800E000201F35BC :10654000EA066107090ED20E11437207520D11437C :106550000006000A0843064AA100505070BD3C00E6 :106560004415010001218D20EFF7ACFE70BD000045 :10657000409C000000803801E8600100094A80006A :106580001058400940010722024307480368002BC6 :10659000FCDB42600906016001680029FCDB082081 :1065A0003C008015010070470000E86001003020C9 :1065B0000700B0B5041C0D1C0749A00008580028AE :1065C00003D102218D20EFF780FE291C201CF6F755 :1065D000A8FAB0BD0000E8600100B0B5041C0D1CB5 :1065E00007493C00BC150100A0000858002803D151 :1065F00002218D20EFF76CFE291C201CFFF7C4FF41 :10660000B0BD0000E8600100F8B50D1C161CF7F7DE :1066100017F9041C2868404F817800293BD1C178C4 :10662000002958D13C00F8150100F8F7F8F9228E3E :10663000618E8A4204D0A16A0918E069814210D9AA :106640003849321C486B01304863206A01302062AF :10665000386801303860E0686369291CEEF7D8FEBD :10666000F8BD013212043C0034160100120C2286DF :10667000A162B868002834D12C480C2300681B1A8A :106680009A4207D219239B01AF2292015843101A54 :10669000814226D30120B86001210C2000F07AFE4F :1066A0001FE001291DD1C0783C0070160100172899 :1066B0001AD1A08EE18E884214D3E968096809795D :1066C00009060FD5606A321C01306062E0686369B8 :1066D000291CEEF7A3FEE868016808310B2000F0E2 :1066E0005CFEC3E70130A086A08D3C00AC16010023 :1066F000E18D884204D103210220EFF7F5FDB8E7D0 :1067000060684560866000686060F8680130F86025 :10671000A08D411CA1850028ABD10848B969FDF7BF :1067200061FE221C0221F12002F064F83C00E81610 :106730000100A1E70000FC5A0100905C010018571D :106740000100C460010080B5021C0221F02002F0AB :1067500054F880BD0000002803D102484178C907E1 :10676000FCD5704700000400070080B500063C001F :106770002417010001D1F1F771FE80BD80B5F4F757 :10678000E5FA80BD80B5F6F7EBF880BD0149002041 :10679000087470477869010080B5C00703D50249C5 :1067A000012000F01DFC80BD50C300000006000E5B :1067B0003C0060170100012880B502D1F6F7E1F92D :1067C00080BD0028FCD1F1F74CFE80BD000080B5F3 :1067D000F6F7D7F980BD034980B500200874F6F7B5 :1067E000FEF980BD00007869010080B50006000E4A :1067F000F1F73C009C17010071FE80BD10B5012827 :1068000008D0022803D0032801D0EFF7A7FDF6F740 :10681000E9F910BD01F0F8FA041CFAF75DFD241A3D :10682000FAF73EFD084900280BD0486A002808D036 :10683000064884423C00D817010005D2011B012202 :10684000072001F0F4FEE5E700204861E2E77869FF :10685000010050C30000094980B5486900280CD0E8 :10686000086ACA69801A002807DD002048610121F2 :10687000072001F010FF3C0014180100F6F7B8F9EA :1068800080BD00007869010080B500F0E7FB80BDA5 :1068900080B500F03FFC0020F7F7D4FC80BD00007D :1068A00080B500F037FCFDF76FFCF5F773FD30F0B5 :1068B00047FB80BD044880B53C0050180100C16A08 :1068C000006BF2F7DEFF0120F7F789F880BDA46CBA :1068D000010010B5F3F741F80D4C002804D0012059 :1068E000E064F7F7B2FC10BD01210120F3F7E9F8ED :1068F000FDF74DFC606D002803D03C008C180100B2 :10690000F3F782F8002801D0F5F74AFD0120F2F7ED :10691000C1FC10BDA46C0100044880B5C16A006BC5 :10692000F2F7B2FF0120F7F75DF880BDA46C01001B :1069300080B500F0F5FBF5F733FDFCF73C00C81817 :10694000010031FDF9F7CBFF0420F2F7A6FC80BD72 :106950000000034880B5C16A006BF2F798FF80BD64 :106960000000A46C010080B500F0DDFB0020F7F70B :106970003CF830F0EEFA80BD000080B500213C000C :10698000041901000120FFF719FA0120F2F788FC31 :1069900080BD000080B500F0C9FBFCF707FD0121B8 :1069A0000120FFF70BFA0420F2F77AFC80BD00000B :1069B00080B500220021002000F08AFB80BD00008D :1069C0003C0040190100034880B5826A012104207F :1069D00000F081FB80BDD479010080B50022002148 :1069E000032000F078FB80BD0000034880B5826A78 :1069F0000121042000F06FFB80BDD479010080B537 :106A000000223C007C1901000021032000F066FBFD :106A100080BD0000064880B5816842690069511850 :106A2000814203D90121012000F058FB80BD000004 :106A3000D4790100064880B58288816800695118C0 :106A4000814203D93C00B81901000121022000F065 :106A500048FB80BD0000D479010010B5084C207BB4 :106A6000216AF9F79CFAA1694218A0682169801887 :106A7000884203D90121022000F033FB10BDD479F4 :106A8000010080B500223C00F41901000021002023 :106A900000F02AFB80BD00000006000E012880B532 :106AA00002D1F6F78FF880BD0028FCD1F1F7FAFC8F :106AB00080BD000080B5F6F785F880BD80B5000682 :106AC000000EF1F729FD80BD3C00301A0100B0B581 :106AD00002250228104C0BD1FBF747FC002801D1FE :106AE000FEF74FFF2570A1680C48FDF7A8FCB0BD6C :106AF00003280DD108487D231C380069DB0058436A :106B0000191C40184108022000F03C006C1A0100DA :106B100091FA2570B0BDF8F731F9B0BD7869010080 :106B20003463010010B5054CE068002801D1EFF78F :106B300039FC0220207000F0AFFA10BD7869010026 :106B4000034880B5826A0121042000F03C00A81AA5 :106B50000100D3FA80BDD479010080B50022002164 :106B6000032000F0CAFA80BD000080B50022002199 :106B7000002000F0C2FA80BD0000034880B54269E1 :106B80000121012000F0B9FA80BDD47901003C0058 :106B9000E41A0100064880B58288002A02D001214B :106BA000022002E000220021002000F0A9FA80BDAE :106BB000D479010010B5064C207B216AF9F7FEF963 :106BC000A16942180121022000F09AFA10BD0000CC :106BD0003C00201B0100D479010080B50022002177 :106BE000002000F090FA80BD000038B5FAF741FEB1 :106BF0000020F0F780F8009000AB1C885D88F8F763 :106C00003CF9002C02D0FDF79EFA02E00120F6F7D5 :106C10000AFF3C005C1B0100291C201CFCF7B8FC8F :106C2000002C02D0F5F7E0FB02E0002000F0DCF9D8 :106C30000320002C00D102200006000EF2F74EFBCC :106C400038BD0000034880B5826A0121042000F0AD :106C50005DFA80BD3C00981B0100D479010080B52D :106C600030F09BF980BD80B500220021032000F0A8 :106C700050FA80BD0000034880B54269012101201F :106C800000F047FA80BDD4790100044880B58288BD :106C9000002A03D001213C00D41B0100022000F097 :106CA0003BFA80BDD479010010B5064C207B216AE7 :106CB000F9F790F9A16942180121022000F02CFA9D :106CC00010BD0000D479010080B5FCF793FB0121D1 :106CD0000120FFF797F804203C00101C0100F2F798 :106CE00006FB80BD000080B52FF06BFB00280AD0AA :106CF0000120F2F7FCFAFAF72AFC002802D104205E :106D0000F6F75DF880BD03211620EFF732FB80BD5A :106D10000000024880B50068EEF73C004C1C010002 :106D2000C5FB80BDD4790100034880B542690121CB :106D3000012000F0F7F980BDD479010080B530F072 :106D400035F980BDB0B5184CAA20005D042819D1D2 :106D50000125E562256301F093F8A0663C00881CDC :106D6000010001F0FCFDF2F72EFE00280ED00220FB :106D7000F2F7C3FAA56001F086F864306060FAF7B4 :106D80008AFD01210120FFF746F8B0BD0120F2F78E :106D9000B4FA0020A06000210120FFF73CF83C007D :106DA000C41C0100F2F766FE0028F1D0FAF776FD68 :106DB000B0BD0000A46C010080B50020EFF7D6FE46 :106DC00080BD000080B50120EFF7D0FE80BD00003F :106DD000AC21095C024A09028918C0318160704700 :106DE0003C00001D01007075010080B5012804D130 :106DF00003C90968EEF764FB80BD01211420EFF799 :106E0000C4FA80BD0000002802D1024840687047E3 :106E10004068704700005875010010B50024F8F76D :106E20001CFB3C003C1D0100002804D04030807A4F :106E3000052800D10124201C10BD000004480021B9 :106E4000406801E0016340680028FBD17047000002 :106E500058750100B0B5041C0D1CF7F7A5F84034B7 :106E6000E572B0BD3C00781D0100F8B5071CF8F7CD :106E7000FAFA041C04D005211420EFF78CFA28E05C :106E80000025144928024618301C443006221249B5 :106E9000EEF72DFB002802D1AC208555341C0135BE :106EA000032DEED3002C3C00B41D010014D0391C7E :106EB000201CF8F72BF80949002020601839486891 :106EC0006060002800D004604C60CA68002A03D0CB :106ED0000121201CEEF7FEFA201CF8BD70750100A0 :106EE0005846010080B5F8F73C00F01D0100C1FADA :106EF000002804D106211420EFF753FA80BDF5F7DE :106F000016FC80BD000080B5F8F7B3FA80BD10B55F :106F1000094C2188022903D11420EFF742FA04E03A :106F2000A3688A009850481C20803C002C1E010059 :106F3000208801380004000C10BD000058750100C5 :106F40000B1C111C084A80B51288904206D2DA68E0 :106F5000C0001218142001F0BBFB80BD03211420D7 :106F6000EFF722FA80BD0000587501003C00681E52 :106F70000100084A80B51288904206D2C968C00054 :106F80000918142001F0DBFB80BD04211420EFF769 :106F90000EFA80BD0000587501000149C8607047B5 :106FA00000005875010080B506224430EEF73C0021 :106FB000A41E0100ABFA002801D1012080BD0020F1 :106FC00080BD00001CB5144C2069002823D0207817 :106FD0000A2801D000F0FCF8002060610F484079D9 :106FE000A070002801D0012815D1FDF7EDFE019019 :106FF0003C00E01E0100FDF782FE009000AB187916 :107000001978401A187158795978401A58710198AE :10701000F2F789FE0520207000F0BFF91CBD7C78D6 :1070200001000C5A010008B5044A009014320020F7 :10703000024B3C001C1F01000249F1F77DF908BD1D :107040002C750100B1A80000B0B5002806D00128B9 :1070500006D0022807D10C4C012507E00B4C04E0B8 :107060000A4C2A3C01E0084CB634002500F02CFF05 :107070000749896E3C00581F01000919091AA142ED :1070800000D900212A1C162001F031FBB0BD71028D :1070900000000C050000A46C01008CB500AB8E2133 :1070A0001980FCF738F901906846FBF7A6FA8CBD09 :1070B0000000BFB5134A3C00941F010001910D1C54 :1070C000117C8843041C2143081C1074A0070BD5B5 :1070D0000E4800900120029000F0FCFE0C49401880 :1070E00003906846F9F76AFFE0070CD5F1F72CFD2D :1070F000002803D0074885423C00D01F010000D281 :107100000190064800906846F9F709FFBFBD78690D :10711000010081EA000010270000A086010075EA46 :10712000000010B50A4C606900280ED10120606192 :10713000A1680748FDF7CBF900213C000C200100B5 :10714000A068F9F7D1FB01220720044901F0D8FA21 :1071500010BD00007869010034630100983A000016 :1071600010B50C1C111C064A002B107003D000280F :1071700002D1F9F7F5FD10BD201CF9F73C004820BD :10718000010001FE10BDA0790100B0B50A4C051C3C :10719000E36A201F0133E3620088002906D0A1685A :1071A00089182161054A00F0FCFE01E000F0CFFEE5 :1071B0002577B0BD0000D479010055E300003C0004 :1071C00084200100011C034880B54088FFF7ECFED5 :1071D00080BD0000987C0100034880B5C168183864 :1071E0008088FFF7E1FE80BD707C010080B5002142 :1071F000162001F0BFFA0121162001F0BBFA80BD74 :107200003C00C020010010B50B4C20780A2810D09B :10721000012060610A21132001F0AFFA0A2060709A :107220002070FDF73CFB0120FDF7E9FB0020FAF799 :10723000C4F910BD00007C78010010B50C4C002092 :107240000B493C00FC2001002063E062503988615A :107250002070084838210C38007A08558121182000 :1072600001F08EFA2069012802D10020F5F73EFBDB :1072700010BD0000F46E0100B0B51C4C00252C229E :10728000011D201C3C00382101009AB0EEF739FAAC :1072900018492C31081C007A8A69002A13D1022867 :1072A00003D1A068002820D004E000281DD1606828 :1072B00000281AD0800288610E4869462438006888 :1072C000EFF7CBFB11E03C00742101000022022803 :1072D00003D1A068002809D104E0002808D1606823 :1072E000002803D18A61FFF7B1FF01E080028861C5 :1072F000281C1AB0B0BD0000C86E0100F8B50C49DA :10730000022048600B4900053C00B02101000860E4 :107310000B4FB868F9687C68451A2E1C04E0A06819 :107320006168EEF709F92468013DF8D27C60F868DD :107330008019F860F8BD402007000010070044E302 :107340000100F8B51F4E041C30693C00EC2101001F :107350000121F9F799FA1D49600040181038817B26 :107360001B4A5172C07B10741A4F1B4D0E2C0AD150 :1073700001220221082001F0F3FB0320FF2141310B :107380003986142108E00222012108203C0028222D :10739000010001F0E8FB1249022039861021A97191 :1073A000E8711048114A00191038C07B002803D03A :1073B00001215173107301E0002050730021201C43 :1073C000FDF7E5FD3069F9F708FBF8BD00003C006A :1073D00064220100407C0100764601000C80070019 :1073E0003080070000800700FF0100005C570100AB :1073F000D080070010B5154C144A217800201832AF :1074000005291DD006291BD0072901D0082906D13E :107410003C00A022010091680520102900DB062015 :1074200020700120A178002861700BD00020FAF7AD :10743000DCF800216078F4F73CFA0A221E211320C0 :1074400001F07FF910BDD16907201029E8DB082081 :10745000E6E73C00DC2201007C780100B0B50D1CA1 :10746000011C041C44310020F6F740FA3034002D92 :1074700007D00EC80EC408C8103808C4F4F7C4F901 :10748000B0BD1ECC1EC0B0BDF8B5081C111CF4F771 :1074900087FA084C3C00182301000025084E084FCD :1074A00006E0306B002803D035632068EEF755F80E :1074B00038680028F5D0F8BD00005C5B0100E4FEF0 :1074C0000100845A010080B50006000E00F007F8A4 :1074D00080BD80B50A1C3C0054230100232101F02B :1074E0002BFA80BDB0B50D1C041C122803D301215A :1074F0002320EEF79BFF0649A000085804E012C8BD :10750000281CEEF72EF8201C0028F8D1B0BD000092 :10751000685B0100F8B50E1C3C00902301000025BB :10752000041C122803D301212320EEF782FF134805 :10753000A700C45908E02068B04203D103212320EA :10754000EEF777FF251C6468002CF4D10C4A043A4E :107550001068002801D0416811603C00CC23010074 :10756000002804D102212320EEF766FFF8BD002198 :1075700041600660002D01D06860F7E70149C851FD :10758000F4E70000685B010070B50E1C051C0024C8 :10759000122803D301212320EEF74EFF3C000824DC :1075A00001000D4BAA00985804E00168B14204D0D4 :1075B000041C40680028F8D170BD0028FCD0002CC5 :1075C000416801D1995000E061600021034A0160E7 :1075D000043A11684160106070BD685B01003C00B6 :1075E00044240100F3B581B0002817D00178FF29A9 :1075F00014D04578441902348027013C2678013D97 :10760000BE43301CF8F782FC012181400298014002 :1076100002D03E43301C2070002DEED1FEBD000094 :107620003C0080240100104B10B55968411A0F2905 :107630000DDC0E22D243914209DB1A1C926800290C :1076400001DD002A03DA00290DDA002A0BDC0433FD :1076500003C3FDF710FD041CFDF713FD002802D045 :10766000201C3C00BC240100FFF792FE10BD00006E :1076700018630100F8B5644C071C6078A178884253 :107680000FD1081CFDF7CEF8E060042060700A22DC :107690001E21132001F070F800216078F4F724F91E :1076A000F8BD04283C00F82401006ED1584EFDF7C7 :1076B000BCF800907178041C0020052921D201A398 :1076C0005B5C5B009F440B0F141A02005148514948 :1076D000604341187D20C000EEF787F811E0872055 :1076E00060434D4902E03C003425010045204D49EE :1076F0006043401808E04C48CD2109016043401A1E :1077000002E0462060438238060648480721007997 :107710003616081A001900906846FEF75FFD381CFF :10772000FDF72EFB0099424A3C00702501004900FC :10773000515A48433949041C8878002801D001284F :107740001ED13549002803D13A480578042002E0CB :10775000384845780C203049C968491B0818009002 :107760006846FEF73EFD009833493C00AC25010019 :1077700040002031085A2A494443C868A84201D928 :10778000012500E000252E4821184000EEF7A2F860 :10779000041C002D03D0FDF7C3FA02E03DE0FDF725 :1077A000F3FA002F02D125480E3801E03C00E8250D :1077B000010023480A380168611ACB1C01DB032948 :1077C00000DD04600168A14201D2013104E0A14260 :1077D00003D9002901D0013901600168381CFDF787 :1077E000C0FB104C0A2060700A221320A1683C00E4 :1077F0002426010000F0D2FF606800F0F7FA0028AC :1078000000D15FE700F0BAFB1149002340180E4990 :1078100060601E39C856B042F3D00E70311C002093 :10782000FFF784FE4EE7FFF715FE4BE77C7801007B :107830003C006026010060D7FFFF608F0100540B01 :107840000000C90900008EFEFFFF0C5A0100125A09 :10785000010020A1070040420F0030B50C4BFE2470 :107860001B880440C0075D076D0FDB08C00F9C42FA :107870000BD83C009C260100A218043A9A4207D378 :107880001A1B895C0122AA40114001D00221084341 :1078900030BD0000FA60010080B5002803D0011C53 :1078A0001420F5F7FFFA80BDB0B5041CF7F708FD0A :1078B000134D00283C00D82601001DD1A00716D585 :1078C00002208443114801222A624068002813D014 :1078D000F2F751F900280FD10B48E430807A0128E3 :1078E00000D00022111C0120F2F7A5F904E000F0FD :1078F0004EFBE861F2F73C00142701006BF9A96A1E :10790000002902D0201CEDF75CFEB0BD606C0100C8 :10791000B05701002048B0B58168012904D1007832 :10792000002801D1FDF772FD1B4D803D2C1C7034E9 :1079300020780338052818D23C005027010001A305 :107940001B5C5B009F44041527272700FBF7F1FF12 :10795000607B011CFF3161730028F7D10420207087 :10796000A889F8F7DAF9011C00220F2000F025FFA2 :10797000B0BDEFF7CEFF6A21495B3C008C270100C8 :1079800088420BD0E889F8F7CBF9011C00230022CC :107990000F2000F0F7FF07202070B0BDFDF73AFE82 :1079A000B0BD000084660100F0B585B0041C038002 :1079B000180C60800D1C5178107809023C00C82713 :1079C00001004840A080D178907809024840E080CA :1079D0005179107909024840208168461A491422D9 :1079E000EDF7E3FE00230020D907C90F8C464200C3 :1079F0005607760F6146891949006E5C49193C00AB :107A00000428010049786F4609024E4081007958E8 :107A10000F4F4900615A01304E403106360A760058 :107A2000C90D795AF61901277F02F6193688714077 :107A3000A65A8919A1520528DCDB2089C018013318 :107A40003C0040280100082B2081D2DB05B0F0BDAE :107A50000000D8560100D8520100F0B5051C0C1CDE :107A60001E1C002089B04100535A013006AF7B52E2 :107A70000528F8DB108900AB3A498019588468461C :107A800018223C007C280100EDF798FE0020410000 :107A90000A195278635C6F46120253408200BA584A :107AA00006AF5200BA5A314F013053401A061B0A32 :107AB0005B00D20DBA5ADB1901277F02DB191B8844 :107AC0005A4006AB3C00B82801005B5AD21806ABFE :107AD0005A520628DEDB617B207B00AB090248405E :107AE000598C48404108C0034840198B40181883FE :107AF000E17BA07B09024840198B48404108C00344 :107B00004840598B40183C00F4280100588302205B :107B1000410006AA8A18203AD28B01305308D203BA :107B20005A4006AB5B5AD21806AB5A520628EFDB16 :107B3000300A28707004400E202108436870AE702F :107B40006178207800AB09023C00302901004840F0 :107B5000598C4840C005000EE8700020410006AA7C :107B6000535A4A190130137106AB595A090A517117 :107B70000628F3DB09B0F0BD0000EC560100D85236 :107B80000100F0B54668051C60303C006C2901001E :107B900085B0049060E068680C2107690020EEF76A :107BA0002DFE7061018904390904090C0181706995 :107BB000006840180421EEF721FEF0617069202171 :107BC000046804980422407B800108433C00A829F3 :107BD0000100E07028694089A07028694089000A86 :107BE000207029690C31A018EDF79BFD2078202129 :107BF0004006400E0843607028690A300188013150 :107C00000904090C018004D128690C3001683C008A :107C1000E4290100013101603562617920790902AE :107C20004018A17909044018E17909064318009326 :107C3000A0782178090240180404240C1020EEF7E3 :107C400013FFB06128693A1C0168009B01A80A3241 :107C50003C00202A0100FFF7C8FE2869231C0168A8 :107C6000B06901AAFFF711FF3668002E9CD10349C5 :107C700004486A68F7F763FB05B0F0BD0000FD6BD0 :107C80000000A06A0100013807494000095C002992 :107C900006D03C005C2A010004491C39085C00281D :107CA00001D001207047002070470000E6780100F5 :107CB000FEB5051C002002901348171C00680C1C20 :107CC0008678301CFDF728FA002801D10298FEBD05 :107CD000002D08D13C00982A0100206800AB1871E3 :107CE00060685871A068987103203880291C301C86 :107CF00001AA00F00EF8002DECD000AB197921603C :107D0000597961609979A1600C213980E2E7F86BBB :107D10000100F8B5151C3C00D42A0100421E0138B0 :107D200047003F181F483E18002906D001240322AF :107D3000311C281CEDF704FD32E06878012400288E :107D400005D02978081801380E2800D90024002C05 :107D500026D0002A07D12A213C00102B010012480E :107D6000EDF79FFC1C211148EDF79BFC0F48032207 :107D7000291C301CEDF7E7FC0C487178C05DB27827 :107D800000290ED0002A0CD001224318084D06E02D :107D90004100491910398A73B7783C004C2B010017 :107DA0000130CF738342F6D8FEF760F8201CF8BD8F :107DB000EB620100CA78010070B5051C1C48002365 :107DC000C056431C32D1A87AF8F70CF900260028D7 :107DD000184C08D0E869E16B00290BD13C00882BD6 :107DE000010066630121E163A66306E0A869E16B17 :107DF000002902D06663A663E663A16B0131A1632B :107E0000820301D50E4A1043E26B002A00D04042A3 :107E1000626B1018606308290BD1002801DD3C005B :107E2000C42B0100012003E0002803DA0020C04336 :107E3000EFF762FE6663A66370BD0000F46B01009D :107E4000846A01000000FEFF0C21054A41438918A5 :107E500080B58978002901D1F3F7F2FA80BD0000DE :107E60003C00002C0100607B010080B5011C00205B :107E7000F7F703FA80BD80B5011C0120F7F7FDF983 :107E800080BD02498968401AC00F70470000000198 :107E9000070002498968081AC017013070470001BD :107EA00007003C003C2C010005494A6801231A43A5 :107EB0004A608A681018886048689843486070472C :107EC0000001070010B5154B00210A019A58002A3D :107ED00017D101240A019C50D21810730023537348 :107EE000022301283C00782C01000E4A05D1C8006D :107EF0008018103002789A4304E0C80080181030CF :107F000002781A43027002E001310829E0DB0829F7 :107F100004D101219920EEF7FEFA03490804000C70 :107F200010BDAC7301003C00B42C010000600700E0 :107F3000FFFF0000F7B5194F194E0C1CC100C919FD :107F4000B268103181B0013A4A600B781D1C0D22D5 :107F500093430B70012282403A73124B0001039A43 :107F6000C0188260104A101C3C00F02C0100203028 :107F7000877900AB1F70C0795870B0680330002358 :107F8000261A01D5041C01234C600D70002B04D06F :107F9000201CFFF78AFF0028FAD000AB1888D08495 :107FA000FFBD00600700000107003C002C2D010010 :107FB000AC7301000010070030B50020C0430B4C2B :107FC000094B0022D10009190D7CED0707D549693D :107FD0009D68491B00D50021814200D2081C013256 :107FE000082AEFDB30BD0000000107003C00682DCF :107FF000010000600700B0B508280BD2084D04014D :108000002959002904D000F04AF800202851B0BDB9 :10801000022100E003219920EEF789FAB0BDAC738C :108020000100034900014018417B082211433C0034 :10803000A42D010041737047AC73010001488068B2 :10804000704700000001070070B50B4E094D00227B :10805000D0008419207CC00707D56069FFF726FF90 :10806000002802D0A868323060610132082AEFDBB4 :108070003C00E02D010070BD000000010700006021 :108080000700024AC00080180174704700000060B9 :1080900007000449C0004118087C0823021C9A43C9 :1080A0000A74704700000060070070B5082817D2F6 :1080B0000E493C001C2E01008A680E4D013AC10099 :1080C00049194A610C4B9A7910310C780D26B4434A :1080D0000C700121814029739A71094A07490001F6 :1080E0008018416070BD05219920EEF729FA70BD16 :1080F000000107003C00582E01000060070020101E :108100000700D1750000AC730100F8B59E461A4B0C :1081100094469B681A4CC2001219013B5361151C0E :10812000184CA6792A1C103213780D27BB43137004 :108130000127124B87403C00942E01001F73A6714B :10814000124E0001801963464360734683601378C2 :10815000407BA679012718433843143500AB1E70C5 :10816000E4795C70064B9B680333CC1A00D5191C6C :108170002960107000AB18883C00D02E0100034C21 :10818000203CE084F8BD00010700006007002010DB :108190000700AC73010000B5011CFFF75EFF421839 :1081A000101CFFF792FE0028FAD000BD0000891ACB :1081B000401A9918884201D801203C000C2F010078 :1081C0007047002070470000F8B50F1C041C002801 :1081D00001D1EEF7EFF9211C0120FFF719FA412038 :1081E000005D002801D1002504E0022801D1052509 :1081F00000E00125E068EEF729FBA66B3C00482F64 :108200000100002E10D0002F06D02F20025D206A22 :10821000416B281CEDF744FAA069002801D0EEF765 :1082200046FC206AEEF743FC201CEEF740FC301CB5 :10823000F8BDB0B5041CC06B002809D020693C0013 :10824000842F0100008BEEF755F9002803D0211C84 :108250000620FFF7E3F9084D201CA96DFFF7BAFFD0 :10826000002807D0E8680130E860286A01382862F1 :10827000FCF778F8B0BD0000C469010010B5064CE9 :108280003C00C02F0100E16DFFF7A7FF002804D0DC :10829000E0690138E061FCF768F810BD0000C469CE :1082A00001000C230C495843401810B54468A168DC :1082B000002902D0201CEDF7F3F9E06B002808D06C :1082C00020693C00FC2F0100008BEEF719F9002813 :1082D00002D0201CF9F726F910BD0000607B0100D8 :1082E000F8B522494868800006D40120400708609C :1082F0004A69920000D448601D4F787EC306012071 :10830000021CDB0E3C00383001009A400A6079699B :108310008C688C602107890F09D0210704D50B21B7 :108320009E20EEF728F900E078640C208443124880 :108330003D68065D6C682C3406E0A0680068A060AB :10834000E968281CEDF73C0074300100B2F9013EE9 :10835000F6D2A068806800280DD0408900280AD095 :10836000786C002807D178698068800703D10C21D8 :108370009E20EEF703F9F8BD00100700CC6D010058 :10838000B4440100094980B53C00B0300100087ECA :10839000C206D20E01209040074A106000200A69F0 :1083A000C04390600868243106C90369EDF786F977 :1083B00080BDCC6D010000100700F8B54468061CB4 :1083C0002C3420680D1C806800903C00EC300100CB :1083D000002800D0C5602068006820604068002840 :1083E00003D00A219E20EEF7CFF820684560281CB4 :1083F00002E000224260081CC1680029F9D17168BE :1084000060270B1C40339C469B78CA7E3C00283179 :1084100001005B011207120F3B401A438B8FFF27AD :108420003F041B043B401A4390231A4342606346B7 :108430009A780132D207D20F9A70896BC160216895 :1084400088600098002801D00098C5600A4F3C0061 :1084500064310100BD79A06900280CD00022A2611E :1084600074686069EFF72EFFE06A616940684860F0 :10847000616901200860BD71F8BD0000201007008F :10848000FEB544680F1C01942C34201C123002905D :108490003C00A03101002CE00C20EEF700FB051C95 :1084A000606800281DD10298002100900020EEF79E :1084B0000EFA061C00980421EEF709FA011C019837 :1084C000C07E0007000FD03070600198C07E0007AA :1084D000000F3C00DC310100F0304860301CEEF74A :1084E00019F96560E66001E0206805606068286051 :1084F000256000206860A860381CFF300006000E70 :10850000391C071C0029CAD16068A060FEBD0000AC :10851000FFB5051C3C0018320100081C002681B084 :10852000F4F72FFE041C02D06068FF2801D1062654 :1085300028E0211C20310A78012A01D1032621E0FC :10854000012725600F7011C51D48083D686103981B :108550006A46E86004983C005432010028611A48D9 :10856000A8611A48E8611A4828621A486862207EA1 :10857000A168EDF7B3FE002806D1607EE1686A4687 :10858000EDF7ACFE002807D00426311C9E20EEF744 :108590000DF8301C05B0F0BD3C00903201006A4679 :1085A0000F491D20EDF79DFE01210D48490701608F :1085B000227E3B1CD206D20E93404360627ED206DE :1085C000D20E974047604160E6E731330100D9326F :1085D000010091310100DD3001003C00CC3201008E :1085E000FD320100713301000010070042682C3297 :1085F000506843680B6081684B890B818368002158 :10860000D9604160816000685060002070470000C0 :1086100070B54268FF269187106B0C043C0008334C :108620000100051C3604344043685968B1432143B6 :1086300059600068A842F7D1106B516940684860E2 :1086400051690120086070BD0000B0B54368081C86 :1086500059629A6200250AE04581C4682A1C3C00E0 :1086600044330100002C03D19A7E1207120F1032FE :108670004260201C0028F2D118694160196901206C :10868000086002480068EDF737F8B0BD5C5B010098 :1086900001200549400780B58860044801680D2025 :1086A0003C0080330100FEF7E6FF80BD00000010B3 :1086B0000700C4600100F8B50E4F0C4E002448209E :1086C0006043C5194821281CEDF77BF81C20604346 :1086D0008119281D1C22EDF7FEF81C23E8560549D8 :1086E000FBF73C00BC330100CDF80134012CE9D389 :1086F000F8BD0000B8440100CC6D01001532010046 :10870000FFB5051C0A30061C81B0F2F7DDF8184FE2 :10871000041C3988EFF7BCFC3288786802807288C4 :10872000023002803C00F8330100B188124E4180D3 :10873000288808364005002805DA6988039A201C35 :10874000F7F701FD00E000207080F8F75EFC0121E2 :1087500009030028308801D0884300E008433080B6 :108760000548002200213C00343401001430EFF7AA :1087700065FC201CF9F774F805B0F0BDB07A010073 :1087800010B50E4C6068F8F795F92068006A00286B :1087900013D1F8F7BFFC002808D021680120086237 :1087A0001F210022832000F03C00703401009FF95B :1087B00002E06068F8F721FAFFF797FC216808618A :1087C00010BD147A0100FEB51B4E0F1C1D1C141C9D :1087D000B060081CF7F72BFFB08034733562381C8B :1087E00001AA02A9F7F725FF00AB3C00AC34010059 :1087F000187A012818D118790B2808D1307F242342 :108800000F49584340188068ECF788FFFEBD00AB65 :1088100018790A2808D1F7F739FD071C291C201CF4 :10882000F7F716FD3818B080307F24233C00E83479 :1088300001000449584340184068ECF772FFE8E72C :108840000000D479010094460100B0B5FFF753FC55 :10885000041CFBF7FCFA0C4D29680969091B0C1A6A :1088600002211F2000F08BF8142C06DD02223C00B0 :1088700024350100211C1F2000F050F80120B0BD5C :1088800029680120896A0029F9D00020B0BD0000C4 :10889000147A0100F8B51A4D071CAE790121194C64 :1088A00000202268002A14D1AE71A268D06806CADE :1088B0003C0060350100ECF73CFFAE790021134A23 :1088C000506901305061A0688068A0606268904281 :1088D00006D10120206003E001300C340328E3DBE3 :1088E000002F08D100290AD00A484068002806D085 :1088F000FAF73C009C350100F5FF03E0012F03D09F :10890000002901D1AE71CEE7AE71F8BD201007008D :1089100018D90100A8600100705D010080B5012335 :10892000F5F77CF880BD000080B50023F5F776F8F8 :1089300080BD00003C00D8350100F8B5134B002481 :108940001B8898421BD2114BC000C01845680668AE :108950002868002817D10E4FA8684368B34209D190 :10896000C3688B4206D10368934201D0531C01D1E6 :108970000124476080683C00143601006B68834224 :10898000EED103E001218020EDF740FE201CF8BD70 :1089900056570100845D010029E30000F8B5174F28 :1089A0000A1CBE79164D00236C6807E021689142CD :1089B00002D12179814204D03C0050360100231CB1 :1089C000E468002CF5D117E0002C15D0002B0DD158 :1089D000E3680D486B600088002B02D1FFF7D1FBE4 :1089E00006E00A4A9968FFF7F6FB01E0E068D86004 :1089F0002868E0602C6002E001213C008C36010018 :108A0000FFF7A4FFBE71F8BD201007007C5D0100D8 :108A10002C7401002138010070B5094EB579F9F7C1 :108A2000AFFE041C09D0201CEDF70CFB05498A6839 :108A300080188860086801300860B5713C00C8364D :108A40000100201C70BD20100700A860010009482B :108A500080B54068021C0BE00169002907D0824202 :108A600004D0816805480088FFF7E5FA80BDC0683A :108A70000028F1D180BD7C5D01002C7401003C0018 :108A800004370100054880B54268002A04D0044834 :108A900000889168FFF7D2FA80BD00007C5D01007C :108AA0002C74010005480168002904D0C068002822 :108AB00001D00120704700207047000018D9010044 :108AC0003C004037010080B5F6F7D1FA80BD131C99 :108AD0000D4AB0B5128890420FD203290DD20A4A2E :108AE000C00014580A4DAC4207D113500C2359430F :108AF000084BC91880184160B0BD02218020EDF7F5 :108B000094FD3C007C370100B0BD000056570100C9 :108B1000845D010009A0000018D90100F8B50F1C00 :108B20001E1C151C041C111CFFF74AFF331C2A1CB9 :108B3000391C201CF4F78AFFF8BD0000F7B59446F5 :108B4000FF2921D03C00B837010015480088814238 :108B500021D2144A154EC8008518B4796868026895 :108B6000002A03D1031D0CCB9A4211D043689A68A6 :108B700042600E4A176901371761B4710022026022 :108B80000098D86060463C00F43701001860197402 :108B900028685860FEBDB471062100E007218020DE :108BA000EDF74CFDF6E7000056570100845D01002B :108BB00020100700A8600100B0B5144D6C68002CAF :108BC00001D0844204D00C213C00303801008020C8 :108BD000EDF737FDB0BDFFF7B8FAA168401A0D49AF :108BE000884203DA10218020EDF72BFD21792268DD :108BF0000120FFF7ACFFE3686B60002B05D007484E :108C0000064A00889968FFF7FEFA3C006C380100BC :108C10002868E0602C60B0BD7C5D010018FCFFFF9F :108C2000213801002C740100B0B5154C0820211C1E :108C300080310870134A4104116013480068134DD5 :108C40006B69184001D1102000E000203C00A838DA :108C50000100A8235B5D1843231C40331873516047 :108C600020788008800020700020FFF712FBFFF7BB :108C700072FA643028660138A06120780321084325 :108C80002070B0BD000000900700001007003C00FD :108C9000E438010010000700A46C010038B50A4C4C :108CA000211C20318A7900AB1A70C979074D59709F :108CB0006978884203D1F8F713FCFF20687000AB95 :108CC0001888E08438BD0000001007004C7B0100CC :108CD0003C0020390100F8B50B1C061C041D7F3335 :108CE00014D033685D18356023881F180623FF569B :108CF000EB1B336023881818817120880130000431 :108D0000000C2080904201D300202080101C31688C :108D1000ECF73C005C3901006DFEF8BD0E490A7CA1 :108D200083781A430A74427883789A430B7C93437E :108D30000B748A7C43781A438A748A7C03789A433A :108D40008A74027843781A434B7C1A434A744A7CEB :108D5000C07882433C00983901004A747047100083 :108D60000700B0B5064D00242006000EEDF7F7F819 :108D7000A100695808710134042CF5DBB0BD107BEB :108D800001000B480C497D234269DB00002AC86BB7 :108D900007D0C0181A013C00D43901009042C863C2 :108DA00001D90748C8637047FF38F538C86398424F :108DB000F9D2CB6370470000F4680100447D0100E4 :108DC0007017000070B50D1C041C161CFBF7F6FA9A :108DD000B0432843011C201C3C00103A010000F065 :108DE000CCFA70BD000080B50B4A002909D00229D9 :108DF0000FD1011C0848D2783830FFF778FF0649B8 :108E000006E0011C044812792030FFF770FF034987 :108E1000086080BD0000AC7C01003C004C3A0100C1 :108E2000C8670100C467010080B50B4A002909D05A :108E300002290FD1011C084852796830FFF75AFF08 :108E4000064906E0011C044892795030FFF752FFB2 :108E50000349086080BD0000AC7C01003C00883AFA :108E60000100D0670100CC67010008B50421009122 :108E7000817E4368032906D1011C0C3101206A461A :108E8000ECF79AFC08BD1968C160FBE7000010B55B :108E9000031C0020084C0021CA00121992783C00E3 :108EA000C43A01009A4203D1C8000019406810BDBD :108EB0000131090609160629F1DB10BDCC5A010063 :108EC000F8B50F1C161C0025FEF78EF9041C0AD0FD :108ED0004A20005D052806D1381CF1F781FE0028E4 :108EE0003C00003B010001D001253460281CF8BD86 :108EF000000070B50D1C161C0024FEF778F9002840 :108F00000BD04A21095C052907D10169002904D148 :108F10003060F1F704FD01242860201C70BDF8B515 :108F2000061C3C003C3B010000250C1C081CF1F712 :108F30005DFE002801D0002105E0201CF1F774FE41 :108F4000002814D00121301CF4F780FB0090002889 :108F50000DD0084F01250622311C381CECF7C2FC4D :108F60000622211C3C00783B0100B818ECF7BDFC40 :108F70000098F860281CF8BD0000707C01000021FA :108F8000002806D04278072A03D1C079012800D1F1 :108F90000121081C7047F8B5051C0027164EF1F793 :108FA00028FE002807D03C00B43B0100F1F7C0FBCD :108FB000002810D10024F1F7BBFC06E0F1F702FE17 :108FC000002808D00124F1F799FD011C0622301C6D :108FD000ECF78EFC0127002F0DD0211C281CF4F784 :108FE0003BFB011C054806223C00F03B0100063813 :108FF000C160291CECF77FFC0120F8BD0020FCE7D4 :109000000000767C0100F0B5071C006802210468AE :10901000786987B00140002500290591744E12D06F :1090200022880121130502D4C0073C002C3C01001A :10903000C11701316F480029006801D0013004E0F8 :109040001106890E2D2901D1033030602088800758 :1090500067D17869C00764D503AA04A9201CF7F773 :109060004BFB00AB187C002807D0187C3C00683C08 :109070000100022858D1187B4007400F042853D81C :1090800020790599C007C01701300290002902D14C :109090000298002848D10599002904D020880005AD :1090A00001D400203060C020EDF7CBFD051C3C0052 :1090B000A43C0100201C0A300690FEF7ADF8061C07 :1090C000281C08302388021D111DDB0506D5069BD0 :1090D0000360201C10301060201D0EE0231D136063 :1090E0002288920505D5221C10320260069B0B6077 :1090F0003C00E03C010004E0069B0360201C1030B3 :1091000008602869F1F743FC002808D0012812D034 :10911000022858D100AB187C002854D112E000ABD3 :10912000187C02280BD1002E4DD04B20805D0228E8 :1091300049D13C001C3D010007E063E000AB187C16 :10914000002802D1381CFEF71BFF2088410430485C :1091500011D5002E52D000AB197C002926D00299DF :10916000002902D0B06A007800E0007801281DD004 :10917000032843D13C00583D01001AE000AB197CA4 :10918000022916D1197B042913D0197B0C2910D080 :109190002249096800290CD0002E0AD00299002922 :1091A00002D0B06A007800E00078012829D00328B6 :1091B00027D02822391C3C00943D0100281C88300F :1091C000ECF70AFC00AB197C281C80300171197B7C :1091D00041716C606E611BE00599002914D0114843 :1091E000846C002C10D00022002E04D04036B07ABF :1091F000052800D1012200923C00D03D0100F87A00 :10920000BA7A2969C307DB0F0698ECF700FB281C24 :10921000EDF707FD0025281C07B0F0BD0000C46A6B :1092200001006861010028610100C469010080B586 :109230000220FFF770F880BD00003C000C3E0100EA :10924000B0B51D4D012817D0A22806D0A32803D100 :1092500001211520FFF708FCB0BD002901D11748F6 :1092600002E07D20C000484300230122011C286049 :109270001520FFF7A7FCB0BD012904D03C00483EF3 :1092800001000229FAD100F02AF8B0BD6C68F5F7A8 :10929000DEFCFEF7A8FF6860002C09D029680A23CD :1092A0005943001B884203D901211520EDF717FA15 :1092B000012215202968FFF7A6FBB0BD00003C0085 :1092C000843E0100047901000087930301200449D2 :1092D000400380B5086003211520EDF703FA80BD37 :1092E00000100700074880B5BE210173017A1022E3 :1092F000114301720023022215200349FFF768FC85 :109300003C00C03E010080BD000000030700809FBC :10931000D50080B5002803D00A1C1521A22002E048 :1093200000221521A320FFF766FC80BD000010B5C8 :1093300000F019F80A48BE210173037A1022934302 :1093400001243C00FC3E0100234303720173017AB7 :109350009143202211430172022215200249FFF796 :109360005BFB10BD00030700809FD50080B5022184 :109370001520FFF785FB0448BE210173017A1122F5 :10938000914301723C00383F010080BD00000003A2 :109390000700F8B5061C051C60360027446822E06B :1093A00008210020EDF741FB6061018904390904BF :1093B000090C01816069006840180421EDF735FB54 :1093C000E0616069717B3C00743F010000688901C5 :1093D000C17029690C310322ECF7BAFA28690C3004 :1093E0000168013101602562A7612468002CDAD18F :1093F000024903486A68F6F7B3F8F8BDFD6B000050 :10940000A06A010080B500073C00B03F01000009E0 :109410000902090A084302490860FFF720FF80BDDE :1094200000006000070008001400C8000000E80306 :10943000000010001400C8000000E80300001C0039 :109440001400C8000000E80300003C00EC3F0100ED :109450002401070032000000E8030000400601007C :109460000600000007000000416E62697E64616FC3 :109470006F00000052656C6561736520365F375F71 :109480003135204275696C6420323A353C00284001 :1094900001003239382053657020303420323030AA :1094A000392031373A31333A3230202848573D3469 :1094B0003A332C4254434F455829000000003200F3 :1094C0001C00102030405060FFFFFFFFFFFF3C00FA :1094D00064400100000000000100000001000000E5 :1094E00000000000E8037000000000000100000020 :1094F0000000000002000000D0073800000000005B :109500000100000001000000040000007C151500AF :109510003C00A0400100000000000100000001002C :1095200000000B00000070171E0001000000010089 :109530000000000000000C000000282316000100BD :109540000000010000000000000012000000F82AE6 :109550000B003C00DC4001000000000001000000A6 :109560000100000016000000E02E120001000000C3 :1095700001000000000000001800000050460E002E :1095800001000000010000000000000024000000B5 :10959000F05508003C0018410100010000000000E7 :1095A0000000010000002C000000C05D0E00010062 :1095B0000000010000000000000030000000E88012 :1095C0000400010000000000000001000000420053 :1095D0000000A08C0A003C00544101000100000082 :1095E00001000000000000004800000080BB0A00ED :1095F0000100000001000000000000006000000009 :10960000F0D20A000100000001000000000000008C :109610006C000000C00090003C0090410100C000C0 :109620009000C00090001400100014001000C00052 :1096300090001400100014001000C00090001400EE :109640001000C0009000140010001400100014005E :109650001000C0009000600048003C00CC410100B8 :109660006000480014001000140010006000480062 :1096700014001000140010006000480014001000D6 :1096800060004800140010001400100014001000C6 :10969000020004010B020C03120416053C000842F0 :1096A00001001806000E000E2407000E2C083009D9 :1096B000000E000E000E420A000E480B000E000EB7 :1096C000000E000E000E600C000E000E6C0D00006F :1096D00000000000000000000080C0FFFFFF3C0011 :1096E00044420100B6FFFFFFD3FFFFFFC9FFFFFFAA :1096F000FFFFFF7F000000000000000000000000EE :1097000000000000000000000000000051B0000058 :109710000C00000051B000000C00000059AF000028 :109720003C008042010000000000A5AF00000000E6 :1097300000004DAF00000600000000000000000027 :10974000000045B00000060000000000000000001E :109750000000D5AF000000000000ADB00000000028 :1097600000003C00BC42010095DB0000000000004E :1097700095DB00000000000099B000000C00000024 :1097800000000000000000000000000000000000D9 :1097900000000000000000000000000000000000C9 :1097A000000000003C00F8420100000000002D17FE :1097B00001003517010021170100D99C000049174D :1097C00001003D170100D19C0000D19C00001D1A32 :1097D0000100D19C0000011A0100311A0100251A74 :1097E00001003D1701003C0034430100811A0100D3 :1097F000D19C000079170100D99C00005D17010081 :10980000A11701009517010081170100211801001F :10981000F5170100000008000C000000100008000F :1098200008000000010000003C007043010002003D :109830000000040000000800000010000000191CD7 :1098400001008941000089410000854100008541F7 :1098500000008541000085410000894100008541EC :10986000000085410000351B01003C00AC430100B5 :109870009D1B0100011C010089410000894100007D :109880008941000085410000651801002918010088 :1098900039180100BD180100894100004D18010070 :1098A000A518010085410000011901003C00E843B2 :1098B0000100D9180100ED180100151901008941B6 :1098C0000000894100008941000085410000894174 :1098D000000089410000691C010089410000711CE1 :1098E00001008941000089410000FDDB00003C00CF :1098F000244401001D7C000000008000F5DA000017 :1099000014008100FDDD000008008200C5DD0000BC :109910003800830045DC00001000840099DC000062 :109920000C00860039DC00001000880011DE000009 :109930003C006044010010008A0035DD00000C008E :109940008C00ADDF00001C008E00C9DE0000380076 :109950008F00EDDC00003800900075DF00000C0087 :1099600091008DDC00000C009300B9DD00000C00BC :1099700094003C009C44010000080808100C0C0CEA :10998000080C080C080C0808080814080814003013 :109990000001010200000000AD300100153001009F :1099A00020300700303007000607020300000000E7 :1099B000000000003C00D8440100FFFFFF00FFFF53 :1099C000FF00FFFFFF000000000080C90200943F7D :1099D0000300E08B5A00053A8500C8F20600F84CF7 :1099E000560020A73D00B74A0000B74A000000001B :1099F0000000000000003C001445010001010102CC :109A00000202030303040404050600002D7C000089 :109A10000000FF00FD9500000800FF00ED9700002A :109A200008008200CD9500000C0083004D960000D8 :109A30000C0085002D7C00003C005045010000001A :109A4000FF002D7C00000000FF002D7C00000000C6 :109A5000FF003D9600000C008900D9970000080027 :109A60008A00919500000800FF002D7C0000000096 :109A7000FF002D7C00000000FF003C008C45010031 :109A8000F997000008008D002D7C00000000FF0009 :109A90002D7C00000000FF00C997000030009000FE :109AA0001195000018009100159600000800920022 :109AB000599500003C009300299600003C00C845E1 :109AC000010008009400A19500000800950081970E :109AD00000000C0096006D97000010009800000038 :109AE00000000000FF00000000000000FF00000870 :109AF00008080808000000100800000800103C00DA :109B000004460100080C0C0C0C1C0C0C0800000096 :109B10000D8B0000F58A0000E98A0000018B00002F :109B200014080C0C100C0000B1980000800000001C :109B300019990000810000003D7C000080000000B9 :109B40003C00404601003D99000082000000099958 :109B50000000830000003D7C000085000000000044 :109B6000000000000102020104040808813780F3AC :109B7000AAAA03000000AAAA030000F86DA96DA913 :109B80006EA93C007C4601006EA86EA86EA86FA767 :109B90006FA76FA76FA66FA670A670A570A4000030 :109BA000B51B0100C91B0100E11B0100E59C000081 :109BB000A51B0100E59C0000891B0100D59C00004D :109BC000D59C00003C00B8460100D11A0100E51AFE :109BD0000100051B0100251B0100B11A0100E59CD5 :109BE00000009D1A0100D59C0000C11A01008919CE :109BF0000100A9190100C9190100F1190100791921 :109C00000100E59C00003C00F446010065190100DC :109C1000D59C0000D59C0000D59C0000D59C000080 :109C2000D59C0000D59C0000D59C0000551C01006F :109C3000451C0100451C0100D59C0000D59C00007E :109C4000D59C0000D59C00003C0030470100D59C0D :109C5000000055190100E59C00004119010031196F :109C60000100D59C000002050A00000002040A0061 :109C70000000C5200000212100002521000039211D :109C8000000049210000552100003C006C47010004 :109C900061210000ED2100000D22000021220000C2 :109CA0003D22000049220000C5220000E122000000 :109CB000F5220000E91F0000E91F0000E91F000075 :109CC000E91F0000E91F0000112300003C00A84725 :109CD00001001D23000089230000A5230000B923F3 :109CE0000000112000001D2000006D2000008D20CC :109CF0000000B92000000001020303050606080960 :109D000008090909C480CA8080808080D0803C0016 :109D1000E4470100D6D9DCDFE2808080E5E880807E :109D20008080EBEEF1F4F7FAFD0001000200030081 :109D30000400050006000700080009000A000B00E7 :109D40000C000E00100011001300160018001B007C :109D50003C00204801001E00220026002B0030009D :109D600036003C0044004C0055005F006B0078005A :109D700086009700A900BE00D500EF00FF7F0C0011 :109D8000060002000000FEFFFCFFFBFFFAFFF9FFE8 :109D9000F8FF3C005C480100F7FFF6FFF5FFF4FF19 :109DA000F3FFF2FFF1FFF0FFEFFFEEFFEDFFECFF3F :109DB000EBFFEAFFE9FFE8FFE7FFE6FFE5FFE4FF6F :109DC000E3FFE2FFE1FFE0FFDFFFDEFFDDFFDCFF9F :109DD000DCFF00003C00984801000000000000008B :109DE0000000B17C4100115A40E2B27C4100055AAA :109DF00040E2AF7C4100F95940E2B07C4100ED59AE :109E000040E2246701000E0000E35C6701000E00E1 :109E100000E30A6101003C00D4480100010000E3B6 :109E20000E610100010000E3326701000E0000E353 :109E30006A6701000E0000E30B610100010000E30E :109E40000F610100010000E3406701000E0000E324 :109E5000786701000E0000E33C00104901000C612E :109E60000100010000E310610100010000E34E6702 :109E700001000E0000E3866701000E0000E30D61A3 :109E80000100010000E311610100010000E3C0488E :109E900001000400000AE04801003C004C490100B8 :109EA0000400000A004901000400000A20490100E2 :109EB0000400000A18670100040000E2287501018F :109EC0007DA940E22C750100040000E2207501002C :109ED000040000E244750100040000E23C008849EF :109EE0000100F0590100040000E200000000000041 :109EF00000000000000000000000247501000400C4 :109F000000E2B87C0100040000E28DA9000001001D :109F100000DA1D750100010000E2C46701003C0089 :109F2000C4490100040000E200000000000000003D :109F3000215900000E0000D9C8670100040000E2AA :109F4000CC670100040000E2D0670100040000E2D9 :109F500065D90000040000DAA5D90000040000DA89 :109F60003C00004A010001590000010000DA32679C :109F700001000E0000E36A6701000E0000E31159C2 :109F80000000010000DA0000000000000000B048FE :109F900001000200000AA04801000200000A404936 :109FA00001003C003C4A01000500000A684901002C :109FB0000900000A6C570100040000E2386101004A :109FC000040000E20000000000000000AC6E010090 :109FD000040000E2B06E0100040000E270570100CE :109FE000040000E23C00784A0100E8590100080042 :109FF00000E3DC5801144DFD40E32C59011439FDF8 :10A0000040E3C05801000E0000E300000000000023 :10A0100000000000000000000000647341003D2EBD :10A0200044E27C5901143C00B44A01009D2F44E3F2 :10A030005C5701000E0000E2792E0400010000DBF5 :10A04000A0580100020000E3A2580100020000E352 :10A05000A05701000E0000E3D1880100010000DAE2 :10A060001D890100040000DA3C00F04A01009588D7 :10A070000100040000DB312F04000E0000D9C52EC2 :10A0800004000E0000D9686C010115D540E2C057EC :10A090000100080000E3C8570100340000E39C6C95 :10A0A0000100080000E3B05801033C002C4B010004 :10A0B000E9D440E2BC580100040000E29DA3000086 :10A0C000600000D970790100040000E27879010095 :10A0D000040000E27C5A0100040000E25D1C000064 :10A0E000110000D9246E0100040000E23C00684B1E :10A0F000010018580105D5D540E3FC5701001400B4 :10A1000000E3048E0103E5D540E3005B0100040099 :10A1100000E2185B0100400000E2D4670100040087 :10A1200000E28D370000040000DBBD3600003C007B :10A13000A44B0100040000DBFC600100020000E20F :10A14000907D0100040000E270690100040000E25B :10A150000000000000000000B04901001A00000AE1 :10A16000904B01000600000AA458810005FD40E361 :10A170003C00E04B0100804A01000C00000A0C5A30 :10A180008101252D44E3E04A01000300000A186321 :10A190004100FDBB40E208570100010000E29C487D :10A1A0000100040000E20000000000000000F84A86 :10A1B00001003C001C4C01000200000ACC740100AC :10A1C000030000E365734100A92E44E2F659010142 :10A1D000D12C44E3084B01000400000A07000000F2 :10A1E0000100006A284B01000200000A887D01007E :10A1F000040000E23C00584C010000750104656F4A :10A2000040E3BC7801000E0000E3384B010004007D :10A21000000A0457010004000062584B01000200CC :10A22000000A804B01000200000A684B0100030095 :10A23000000A8C7D01003C00944C0100040000E207 :10A24000392D0400040000DB947D0100040000E2CD :10A2500000000000000000000000000000000000FE :10A260000000000000000000104001000000006439 :10A27000A84C01000400000A3C00D04C0100000082 :10A28000000000000000C84C01000100000AD04C92 :10A2900001000200000A0000000000000000E77A50 :10A2A0000100010000E2E87A0100010000E2000084 :10A2B000000000000000ED7A01003C000C4D0100A0 :10A2C000010000E2EE7A0100010000E2000000005F :10A2D00000000000F37A0100010000E2F47A0100BE :10A2E000010000E20000000000000000F97A010017 :10A2F000010000E2FA7A0100010000E23C00484D52 :10A300000100E84C01000300000A004D01000300B9 :10A31000000A184D01000300000A304D010003003F :10A32000000A905C0100040000E2945C010004005B :10A3300000E2985C0100040000E29C5C01003C002B :10A34000844D0100040000E2A05C0100040000E272 :10A35000A45C0100040000E2A85C0100040000E22B :10A36000AC5C0100040000E2B05C0100040000E20B :10A37000B45C0100040000E2B85C0100040000E2EB :10A380003C00C04D0100BC5C0100040000E2C05C68 :10A390000100040000E2C45C0100040000E2905CE3 :10A3A0000100380000E3684D01000E00000AD84D9E :10A3B0000100020000FA1261810131D540E306611B :10A3C00001003C00FC4D0100020000E20B610100B5 :10A3D000010000E30F610100010000E308610100DA :10A3E000020000E2507B0100040000E200000000D7 :10A3F00000000000384E01000E0000649C5701016F :10A40000918841E33C00384E01006E41676FE26580 :10A4100060696F20414200000000F04D010009001A :10A42000000A484E01000100000AE84D0100010049 :10A43000000A0000000000000000484D0100040078 :10A44000000A286101013C00744E0100BDD540E2C4 :10A450006961410085D540E230610100040000E2FD :10A4600034610100040000E23C610100040000E2EC :10A4700034610100040000E244610100040000E2D4 :10A48000000000000400006A3C00B04E0100704E65 :10A4900001000800000A18610100020000E21C61CE :10A4A0000100040000E220610100020000E22461DA :10A4B0000100040000E2B84E01000200000AC84E8C :10A4C00001000200000AD84E01003C00EC4E0100E1 :10A4D0000200000A96480100060000E3E062010065 :10A4E000040000E2000000000400006A9B7D0100FF :10A4F000010000629C7D010002000062607C01009E :10A50000040000E2010000000400006A3C00284F43 :10A5100001002D6301000100006200000000000046 :10A520000000000000000000000049D500000E00FF :10A5300000D9F467010002000062467D01000100BD :10A5400000629C7C0100040000E2987C01003C0059 :10A55000644F010002000062A07C0100060000625E :10A56000587C010002000062647C01000600006269 :10A570005A7C0100020000626A7C01000600006251 :10A58000010000000400006AE4620100040000E22F :10A590003C00A04F0100E8620100030000E200005F :10A5A00000000400006A000000000400006A0100CE :10A5B00000000400006A000000000400006A0000BF :10A5C00000000400006A000000000400006A0000AF :10A5D00000003C00DC4F01000400006A00000000A5 :10A5E0000400006A000000000400006A000000008F :10A5F0000400006A000000000400006A000000007F :10A600000400006A000000000400006A000000006E :10A610000400006A3C001850010000000000040023 :10A62000006A000000000400006A0000000004004E :10A63000006A000000000400006A0000000004003E :10A64000006AF04E01002A00000A01000000040028 :10A65000006A752A01003C00545001000C0000DB28 :10A66000020000000400006A752A01000C0000DBF3 :10A67000030000000400006A752A01000C0000DBE2 :10A68000040000000400006A752A01000C0000DBD1 :10A69000050000000400006A3C0090500100752A8B :10A6A00001000C0000DB060000000400006A752AAF :10A6B00001000C0000DB070000000400006A752A9E :10A6C00001000C0000DB080000000400006A752A8D :10A6D00001000C0000DB090000003C00CC50010030 :10A6E0000400006A752A01000C0000DB0A0000006B :10A6F0000400006A752A01000C0000DB0B0000005A :10A700000400006A752A01000C0000DB0C00000048 :10A710000400006A752A01000C0000DB3C000851AF :10A7200001000D0000000400006A752A01000C0001 :10A7300000DB0E0000000400006A752A01000C0016 :10A7400000DB485001000200000A585001000200DE :10A75000000A685001000200000A785001003C0025 :10A76000445101000200000A885001000200000A62 :10A77000985001000200000AA85001000200000ADF :10A78000B85001000200000AC85001000200000A8F :10A79000D85001000200000AE85001000200000A3F :10A7A0003C0080510100F85001000200000A0851ED :10A7B00001000200000A185101000200000A405086 :10A7C00001000100000AE84E01000100000A00003B :10A7D0000000000000000000000000000000B04E7B :10A7E00001003C00BC5101000100000A0000000013 :10A7F00000000000285101000E00000A00000000C7 :10A800000000000000000000000000000000000048 :10A810000000000000000000000000000000000038 :10A82000000000003C00F8510100985101000C00AC :10A83000000A504E01000400000AE04C0100010033 :10A84000000A0000000000000000C04B01001D00D5 :10A85000000AF85101000500000A248007000000EA :10A8600000001D8007003C00345201000800000079 :10A870002A8007005C00000024800700020000001E :10A880001D800700200000002A8007006A000000E9 :10A8900024800700020000001D8007002000000047 :10A8A0002A8007006A0000003C007052010000018D :10A8B00002030405060708090A0B0C0D0E0F101100 :10A8C00012131415161718191A1B1C1D1E1F0163CD :10A8D0000000A1630000C5630000B1620000C56311 :10A8E0000000216300004D6300003C00AC520100F9 :10A8F000A163000001630000A163000006050505D7 :10A9000005050505050505050505030506070809EF :10A910000A0A0C0D0E0F0F1011000000A5C684F8D6 :10A9200099EE8DF60DFFBDD6B1DE54913C00E85294 :10A93000010050600302A9CE7D5619E762B5E64DCD :10A940009AEC458F9D1F408987FA15EFEBB2C98EAF :10A950000BFBEC4167B3FD5FEA45BF23F75396E479 :10A960005B9BC2751CE1AE3D6A4C5A6C417E3C005B :10A970002453010002F54F835C68F45134D108F987 :10A9800093E273AB53623F2A0C08529565465E9D75 :10A990002830A1370F0AB52F090E36249B1B3DDF47 :10A9A00026CD694ECD7F9FEA1B129E1D74582E3412 :10A9B0003C00605301002D36B2DCEEB4FB5BF6A424 :10A9C0004D7661B7CE7D7B523EDD715E9713F5A665 :10A9D00068B900002CC160401FE3C879EDB6BED451 :10A9E000468DD9674B72DE94D498E8B04A856BBB2C :10A9F0002AC53C009C530100E54F16EDC586D79A49 :10AA000055669411CF8A10E9060481FEF0A04478BF :10AA1000BA25E34BF3A2FE5DC0808A05AD3FBC21A1 :10AA2000487004F1DF63C17775AF634230201AE5E7 :10AA30000EFD6DBF3C00D85301004C811418352623 :10AA40002FC3E1BEA235CC88392E5793F25582FC34 :10AA5000477AACC8E7BA2B3295E6A0C09819D19EC8 :10AA60007FA366447E54AB3B830BCA8C29C7D36B50 :10AA70003C2879A7E2BC3C00145401001D1676ADB9 :10AA80003BDB56644E741E14DB920A0C6C48E4B82F :10AA90005D9F6EBDEF43A6C4A839A43137D38BF2B6 :10AAA00032D5438B596EB7DA8C0164B1D29CE04940 :10AAB000B4D8FAAC07F325CF3C0050540100AFCA1C :10AAC0008EF4E9471810D56F88F06F4A725C24380D :10AAD000F157C773519723CB7CA19CE8213EDD96AB :10AAE000DC61860D850F90E0427CC471AACCD890C1 :10AAF000050601F7121CA3C25F6A3C008C540100DA :10AB0000F9AED06991175899273AB92738D913EB7C :10AB1000B32B3322BBD270A98907A733B62D223CB1 :10AB2000921520C94987FFAA78507AA58F03F85952 :10AB30008009171ADA6531D7C684B8D03C00C854EA :10AB40000100C382B029775A111ECB7BFCA8D66DB9 :10AB50003A2CC6A5F884EE99F68DFF0DD6BDDEB170 :10AB6000915460500203CEA9567DE719B5624DE6B7 :10AB7000EC9A8F451F9D8940FA87EF15B2EB3C0098 :10AB8000045501008EC9FB0B41ECB3675FFD45EA3C :10AB900023BF53F7E4969B5B75C2E11C3DAE4C6A44 :10ABA0006C5A7E41F502834F685C51F4D134F90848 :10ABB000E293AB7362532A3F080C955246659D5E43 :10ABC0003C0040550100302837A10A0F2FB50E096F :10ABD00024361B9BDF3DCD264E697FCDEA9F121B9D :10ABE0001D9E5874342E362DDCB2B4EE5BFBA4F6F9 :10ABF000764DB7617DCE527BDD3E5E711397A6F533 :10AC0000B9683C007C5501000000C12C4060E31F86 :10AC100079C8B6EDD4BE8D4667D9724B94DE98D410 :10AC2000B0E8854ABB6BC52A4FE5ED1686C59AD7B5 :10AC3000665511948ACFE9100406FE81A0F078448D :10AC400025BA4BE33C00B8550100A2F35DFE80C07D :10AC5000058A3FAD21BC7048F10463DF77C1AF7551 :10AC600042632030E51AFD0EBF6D814C1814263565 :10AC7000C32FBEE135A288CC2E39935755F2FC8202 :10AC80007A47C8ACBAE73C00F4550100322BE69590 :10AC9000C0A019989ED1A37F4466547E3BAB0B8322 :10ACA0008CCAC7296BD3283CA779BCE2161DAD76A8 :10ACB000DB3B6456744E141E92DB0C0A486CB8E4FD :10ACC0009F5DBD6E43EFC4A63C003056010039A81D :10ACD00031A4D337F28BD5328B436E59DAB7018C5E :10ACE000B1649CD249E0D8B4ACFAF307CF25CAAF1F :10ACF000F48E47E910186FD5F0884A6F5C723824DB :10AD000057F173C79751CB23A17C3C006C560100CF :10AD1000E89C3E2196DD61DC0D860F85E0907C424B :10AD200071C4CCAA90D80605F7011C12C2A36A5FB1 :10AD3000AEF969D0179199583A2727B9D938EB134A :10AD40002BB32233D2BBA970078933A73C00A85686 :10AD500001002DB63C221592C9208749AAFF5078E0 :10AD6000A57A038F59F809801A1765DAD73184C696 :10AD7000D0B882C329B05A771E117BCBA8FC6DD600 :10AD80002C3A0400000000000000010000003C001C :10AD9000E45601000200000003000000050000006E :10ADA000000000000100000002000000030000009D :10ADB00004000000010000000172657145727252CA :10ADC0006561736F6E000000010000000500000067 :10ADD0003C0020570100C48E0100249A01000000AD :10ADE000000030000000249A0100A4B2010000001D :10ADF00000006C000000A4B2010014C801000000B3 :10AE00000000C00000001020304050BB30000100A6 :10AE100000003C005C5701001416181A1C1E20226A :10AE20002426282A2B2C01007017000001000000A6 :10AE30000D250000413F0100652901000D2500009E :10AE4000F55E0000413F0100413F010002040B0C90 :10AE5000121618243C00985701003048606C01001D :10AE60000000101010101010101010101010101002 :10AE700000006400000001000000FFFFFFFF010070 :10AE80000000000210121100000118000000020072 :10AE90000000010000003C00D45701000000000049 :10AEA000000000000200000004000000000000009C :10AEB00000000000E093040040420F00000000008A :10AEC0000100000000800000DF40CFFD0040830053 :10AED00000000000010200003C00105801000000CA :10AEE0000000000000000000000040008081000021 :10AEF0008000BFFF7F7E0102000000000000000014 :10AF0000000001000000786F010000000000B86F31 :10AF1000010000000000F86F01003C004C580100E7 :10AF2000000000003870010000000000787001008F :10AF300000000000B870010000000000F87001007F :10AF4000000000003871010000000000787101006D :10AF50000001000090710100000100003C008858D1 :10AF60000100A87101000001000000050A01060BA4 :10AF700002070C03080D040900000303010100048B :10AF800000040406161E1F0000000000000100005F :10AF900080000000000000FFFFFF181818183C0098 :10AFA000C458010018181818181818181818000094 :10AFB000618B4A00618F4A00618B4A0005E3C00043 :10AFC00005CBC00005BBC00085BAC00085A2C0008B :10AFD0008592C000858AC000857AC0004589C0007E :10AFE0003C00005901004571C0004569C000456141 :10AFF000C0004559C0004551C0004549C000454109 :10B00000C0004539C0004531C0004529C000452178 :10B01000C000602D0600602D0600602D0600602D2A :10B0200006003C003C590100602D06006028060027 :10B030005026060050210600501F0600501C060036 :10B04000501A06005018060050160600501406004C :10B050005012060050100600500E0600500C06005C :10B06000500A06003C00785901002B0B06001D75A4 :10B07000C0001D75C0001D75C0001D75C0001D7588 :10B08000C0001D75C0001D6DC000DD5BC000DD4B44 :10B09000C000DD43C000DD3BC000DD33C000DD2B60 :10B0A000C000DD23C0003C00B4590100DD1BC0001E :10B0B000DD13C000DD13C000DD13C000DD13C000D0 :10B0C000DD13C000050505040403030202010100AD :10B0D000000005050504040303020201010000004D :10B0E00000000000881300003C00F0590100070038 :10B0F000000080005B004002E0FDF200B8FCA4010B :10B1000000000F0000000F000000030B9F5F07010D :10B110002A04210417040E040404FB03F103E803CA :10B12000C903AA038A036B034C033C002C5A010099 :10B130002D030E03EE02EC02010316032B03400362 :10B1400055036A037F039403A903BE03D303E803F3 :10B15000BE0394036A030002040607090A0B0C0DE0 :10B160001010101010101010101000033C00685A3E :10B17000010005080B0E1010101010101010101008 :10B18000101010100000010000000100000000007D :10B1900000000000000000000000000000000000AF :10B1A00000000000000000000000000000003C0063 :10B1B000A45A010000000000000000000000000090 :10B1C000000000000000000000000000000000007F :10B1D000000000000000000000000000000000006F :10B1E000000000000000000000000000000000005F :10B1F0003C00E05A010000000000000000000000D8 :10B20000000000000000000000000000000000003E :10B21000000000000000000000000000000000002E :10B22000000000000000000000000000000000001E :10B2300000003C001C5B010000000000000000005A :10B2400000000000000000000000000000000000FE :10B2500000000000000000000000000000000000EE :10B2600000000000000000000000000000000000DE :10B27000000000003C00585B0100000000000000DE :10B2800000000000000000000000000000000000BE :10B2900000000000000000000000000000000000AE :10B2A000000000000000000000000000000000009E :10B2B0000000000000003C00945B01000000000062 :10B2C000000000000000000000000000000000007E :10B2D000000000000000000000000000000000006E :10B2E000000000000000000000000000000000005E :10B2F00000000000000000003C00D05B01000000E6 :10B30000000000000000000000000000000000003D :10B31000000000000000000000000000000000002D :10B32000000000000000000000000000000000001D :10B33000000000000000000000003C000C5C010068 :10B3400000000000000000000000000000000000FD :10B3500000000000000000000000000000000000ED :10B3600000000000000000000000000000000000DD :10B370000000000000000000000000003C00485CED :10B3800001000000000000000000000000000000BC :10B3900000000000000000000000000000000000AD :10B3A000000000000000000000000000000000009D :10B3B00000000000000000000000000000003C0051 :10B3C000845C01000000000000000000000000009C :10B3D000000000000000000000000000000000006D :10B3E000000000000000000000000000000000005D :10B3F000000000000000000000000000000000004D :10B400003C00C05C010000000000000000000000E3 :10B41000000000000000000000000000000000002C :10B42000000000000000000000000000000000001C :10B43000000000000000000000000000000000000C :10B4400000003C00FC5C0100000000000000000067 :10B4500000000000000000000000000000000000EC :10B4600000000000000000000000000000000000DC :10B4700000000000000000000000000000000000CC :10B48000000000003C00385D0100000000000000EA :10B4900000000000000000000000000000000000AC :10B4A000000000000000000000000000000000009C :10B4B000000000000000000000000000000000008C :10B4C0000000000000003C00745D0100000000006E :10B4D000000000000000000000000000000000006C :10B4E000000000000000000000000000000000005C :10B4F000000000000000000000000000000000004C :10B5000000000000000000003C00B05D01000000F1 :10B51000000000000000000000000000000000002B :10B52000000000000000000000000000000000001B :10B53000000000000000000000000000000000000B :10B54000000000000000000000003C00EC5D010075 :10B5500000000000000000000000000000000000EB :10B5600000000000000000000000000000000000DB :10B5700000000000000000000000000000000000CB :10B580000000000000000000000000003C00285EF9 :10B5900001000000000000000000000000000000AA :10B5A000000000000000000000000000000000009B :10B5B000000000000000000000000000000000008B :10B5C00000000000000000000000000000003C003F :10B5D000645E0100000000000000000000000000A8 :10B5E000000000000000000000000000000000005B :10B5F000000000000000000000000000000000004B :10B60000000000000000000000000000000000003A :10B610003C00A05E010000000000000000000000EF :10B62000000000000000000000000000000000001A :10B63000000000000000000000000000000000000A :10B6400000000000000000000000000000000000FA :10B6500000003C00DC5E0100000000000000000073 :10B6600000000000000000000000000000000000DA :10B6700000000000000000000000000000000000CA :10B6800000000000000000000000000000000000BA :10B69000000000003C00185F0100000000000000F6 :10B6A000000000000000000000000000000000009A :10B6B000000000000000000000000000000000008A :10B6C000000000000000000000000000000000007A :10B6D0000000000000003C00545F0100000000007A :10B6E000000000000000000000000000000000005A :10B6F000000000000000000000000000000000004A :10B700000000000000000000000000000000000039 :10B7100000000000000000003C00905F01000000FD :10B720000000000000000000000000000000000019 :10B730000000000000000000000000000000000009 :10B7400000000000000000000000000000000000F9 :10B75000000000000000000000003C00CC5F010081 :10B7600000000000000000000000000000000000D9 :10B7700000000000000000000000000000000000C9 :10B7800000000000000000000000000000000000B9 :10B790000000000000000000000000003C00086005 :10B7A0000100000000000000000000000000000098 :10B7B0000000000000000000000000000000000089 :10B7C0000000000000000000000000000000000079 :10B7D00000000000000000000000000000003C002D :10B7E00044600100000000000000000000000000B4 :10B7F0000000000000000000000000000000000049 :10B800000000000000000000000000000000000038 :10B810000000000000000000000000000000000028 :10B820003C008060010000000000000000000000FB :10B830000000000000000000000000000000000008 :10B8400000000000000000000000000000000000F8 :10B8500000000000000000000000000000000000E8 :10B8600000003C00BC60010000000000000000007F :10B8700000000000000000000000000000000000C8 :10B8800000000000000000000000000000000000B8 :10B8900000000000000000000000000000000000A8 :10B8A000000000003C00F860010000000000000003 :10B8B0000000000000000000000000000000000088 :10B8C0000000000000000000000000000000000078 :10B8D0000000000000000000000000000000000068 :10B8E0000000000000003C00346101000000000086 :10B8F0000000000000000000000000000000000048 :10B900000000000000000000000000000000000037 :10B910000000000000000000000000000000000027 :10B9200000000000000000003C0070610100000009 :10B930000000000000000000000000000000000007 :10B9400000000000000000000000000000000000F7 :10B9500000000000000000000000000000000000E7 :10B96000000000000000000000003C00AC6101008D :10B9700000000000000000000000000000000000C7 :10B9800000000000000000000000000000000000B7 :10B9900000000000000000000000000000000000A7 :10B9A0000000000000000000000000003C00E86112 :10B9B0000100000000000000000000000000000086 :10B9C0000000000000000000000000000000000077 :10B9D0000000000000000000000000000000000067 :10B9E00000000000000000000000000000003C001B :10B9F00024620100000000000000000000000000C0 :10BA00000000000000000000000000000000000036 :10BA10000000000000000000000000000000000026 :10BA20000000000000000000000000000000000016 :10BA30003C00606201000000000000000000000007 :10BA400000000000000000000000000000000000F6 :10BA500000000000000000000000000000000000E6 :10BA600000000000000000000000000000000000D6 :10BA700000003C009C62010000000000000000008B :10BA800000000000000000000000000000000000B6 :10BA900000000000000000000000000000000000A6 :10BAA0000000000000000000000000000000000096 :10BAB000000000003C00D86201000000000000000F :10BAC0000000000000000000000000000000000076 :10BAD0000000000000000000000000000000000066 :10BAE0000000000000000000000000000000000056 :10BAF0000000000000003C00146301000000000092 :10BB00000000000000000000000000000000000035 :10BB10000000000000000000000000000000000025 :10BB20000000000000000000000000000000000015 :10BB300000000000000000003C0050630100000015 :10BB400000000000000000000000000000000000F5 :10BB500000000000000000000000000000000000E5 :10BB600000000000000000000000000000000000D5 :10BB7000000000000000000000003C008C63010099 :10BB800000000000000000000000000000000000B5 :10BB900000000000000000000000000000000000A5 :10BBA0000000000000000000000000000000000095 :10BBB0000000000000000000000000003C00C8631E :10BBC0000100000000000000000000000000000074 :10BBD0000000000000000000000000000000000065 :10BBE0000000000000000000000000000000000055 :10BBF00000000000000000000000000000003C0009 :10BC000004640100000000000000000000000000CB :10BC10000000000000000000000000000000000024 :10BC20000000000000000000000000000000000014 :10BC30000000000000000000000000000000000004 :10BC40003C00406401000000000000000000000013 :10BC500000000000000000000000000000000000E4 :10BC600000000000000000000000000000000000D4 :10BC700000000000000000000000000000000000C4 :10BC800000003C007C640100000000000000000097 :10BC900000000000000000000000000000000000A4 :10BCA0000000000000000000000000000000000094 :10BCB0000000000000000000000000000000000084 :10BCC000000000003C00B86401000000000000001B :10BCD0000000000000000000000000000000000064 :10BCE0000000000000000000000000000000000054 :10BCF0000000000000000000000000000000000044 :10BD00000000000000003C00F4640100000000009E :10BD10000000000000000000000000000000000023 :10BD20000000000000000000000000000000000013 :10BD30000000000000000000000000000000000003 :10BD400000000000000000003C0030650100000021 :10BD500000000000000000000000000000000000E3 :10BD600000000000000000000000000000000000D3 :10BD700000000000000000000000000000000000C3 :10BD8000000000000000000000003C006C650100A5 :10BD900000000000000000000000000000000000A3 :10BDA0000000000000000000000000000000000093 :10BDB0000000000000000000000000000000000083 :10BDC0000000000000000000000000003C00A8652A :10BDD0000100000000000000000000000000000062 :10BDE0000000000000000000000000000000000053 :10BDF0000000000000000000000000000000000043 :10BE000000000000000000000000000000003C00F6 :10BE1000E4650100000000000000000000000000D8 :10BE20000000000000000000000000000000000012 :10BE30000000000000000000000000000000000002 :10BE400000000000000000000000000000000000F2 :10BE50003C0020660100000000000000000000001F :10BE600000000000000000000000000000000000D2 :10BE700000000000000000000000000000000000C2 :10BE800000000000000000000000000000000000B2 :10BE900000003C005C6601000000000000000000A3 :10BEA0000000000000000000000000000000000092 :10BEB0000000000000000000000000000000000082 :10BEC0000000000000000000000000000000000072 :10BED000000000003C009866010000000000000027 :10BEE0000000000000000000000000000000000052 :10BEF0000000000000000000000000000000000042 :10BF00000000000000000000000000000000000031 :10BF10000000000000003C00D466010000000000AA :10BF20000000000000000000000000000000000011 :10BF30000000000000000000000000000000000001 :10BF400000000000000000000000000000000000F1 :10BF500000000000000000003C001067010000002D :10BF600000000000000000000000000000000000D1 :10BF700000000000000000000000000000000000C1 :10BF800000000000000000000000000000000000B1 :10BF9000000000000000000000003C004C670100B1 :10BFA0000000000000000000000000000000000091 :10BFB0000000000000000000000000000000000081 :10BFC0000000000000000000000000000000000071 :10BFD0000000000000000000000000003C00886736 :10BFE0000100000000000000000000000000000050 :10BFF0000000000000000000000000000000000041 :10C000000000000000000000000000000000000030 :10C0100000000000000000000000000000003C00E4 :10C02000C4670100000000000000000000000000E4 :10C030000000000000000000000000000000000000 :10C0400000000000000000000000000000000000F0 :10C0500000000000000000000000000000000000E0 :10C060003C0000680100000000000000000000002B :10C0700000000000000000000000000000000000C0 :10C0800000000000000000000000000000000000B0 :10C0900000000000000000000000000000000000A0 :10C0A00000003C003C6801000000000000000000AF :10C0B0000000000000000000000000000000000080 :10C0C0000000000000000000000000000000000070 :10C0D0000000000000000000000000000000000060 :10C0E000000000003C007868010000000000000033 :10C0F0000000000000000000000000000000000040 :10C10000000000000000000000000000000000002F :10C11000000000000000000000000000000000001F :10C120000000000000003C00B468010000000000B6 :10C1300000000000000000000000000000000000FF :10C1400000000000000000000000000000000000EF :10C1500000000000000000000000000000000000DF :10C1600000000000000000003C00F068010000003A :10C1700000000000000000000000000000000000BF :10C1800000000000000000000000000000000000AF :10C19000000000000000000000000000000000009F :10C1A000000000000000000000003C002C690100BD :10C1B000000000000000000000000000000000007F :10C1C000000000000000000000000000000000006F :10C1D000000000000000000000000000000000005F :10C1E0000000000000000000000000003C00686942 :10C1F000010000000000000000000000000000003E :10C20000000000000000000000000000000000002E :10C21000000000000000000000000000000000001E :10C2200000000000000000000000000000003C00D2 :10C23000A4690100000000000000000000000000F0 :10C2400000000000000000000000000000000000EE :10C2500000000000000000000000000000000000DE :10C2600000000000000000000000000000000000CE :10C270003C00E06901000000000000000000000038 :10C2800000000000000000000000000000000000AE :10C29000000000000000000000000000000000009E :10C2A000000000000000000000000000000000008E :10C2B00000003C001C6A01000000000000000000BB :10C2C000000000000000000000000000000000006E :10C2D000000000000000000000000000000000005E :10C2E000000000000000000000000000000000004E :10C2F000000000003C00586A01000000000000003F :10C30000000000000000000000000000000000002D :10C31000000000000000000000000000000000001D :10C32000000000000000000000000000000000000D :10C330000000000000003C00946A010000000000C2 :10C3400000000000000000000000000000000000ED :10C3500000000000000000000000000000000000DD :10C3600000000000000000000000000000000000CD :10C3700000000000000000003C00D06A0100000046 :10C3800000000000000000000000000000000000AD :10C39000000000000000000000000000000000009D :10C3A000000000000000000000000000000000008D :10C3B000000000000000000000003C000C6B0100C9 :10C3C000000000000000000000000000000000006D :10C3D000000000000000000000000000000000005D :10C3E000000000000000000000000000000000004D :10C3F0000000000000000000000000003C00486B4E :10C40000010000000000000000000000000000002B :10C41000000000000000000000000000000000001C :10C42000000000000000000000000000000000000C :10C4300000000000000000000000000000003C00C0 :10C44000846B0100000000000000000000000000FC :10C4500000000000000000000000000000000000DC :10C4600000000000000000000000000000000000CC :10C4700000000000000000000000000000000000BC :10C480003C00C06B01000000000000000000000044 :10C49000000000000000000000000000000000009C :10C4A000000000000000000000000000000000008C :10C4B000000000000000000000000000000000007C :10C4C00000003C00FC6B01000000000000000000C8 :10C4D000000000000000000000000000000000005C :10C4E000000000000000000000000000000000004C :10C4F000000000000000000000000000000000003C :10C50000000000003C00386C01000000000000004A :10C51000000000000000000000000000000000001B :10C52000000000000000000000000000000000000B :10C5300000000000000000000000000000000000FB :10C540000000000000003C00746C010000000000CE :10C5500000000000000000000000000000000000DB :10C5600000000000000000000000000000000000CB :10C5700000000000000000000000000000000000BB :10C5800000000000000000003C00B06C0100000052 :10C59000000000000000000000000000000000009B :10C5A000000000000000000000000000000000008B :10C5B000000000000000000000000000000000007B :10C5C000000000000000000000003C00EC6C0100D6 :10C5D000000000000000000000000000000000005B :10C5E000000000000000000000000000000000004B :10C5F000000000000000000000000000000000003B :10C600000000000000000000000000003C00286D59 :10C610000100000000000000000000000000000019 :10C62000000000000000000000000000000000000A :10C6300000000000000000000000000000000000FA :10C6400000000000000000000000000000003C00AE :10C65000646D010000000000000000000000000008 :10C6600000000000000000000000000000000000CA :10C6700000000000000000000000000000000000BA :10C6800000000000000000000000000000000000AA :10C690003C00A06D01000000000000000000000050 :10C6A000000000000000000000000000000000008A :10C6B000000000000000000000000000000000007A :10C6C000000000000000000000000000000000006A :10C6D00000003C00DC6D01000000000000000000D4 :10C6E000000000000000000000000000000000004A :10C6F000000000000000000000000000000000003A :10C700000000000000000000000000000000000029 :10C71000000000003C00186E010000000000000056 :10C720000000000000000000000000000000000009 :10C7300000000000000000000000000000000000F9 :10C7400000000000000000000000000000000000E9 :10C750000000000000003C00546E010000000000DA :10C7600000000000000000000000000000000000C9 :10C7700000000000000000000000000000000000B9 :10C7800000000000000000000000000000000000A9 :10C7900000000000000000003C00906E010000005E :10C7A0000000000000000000000000000000000089 :10C7B0000000000000000000000000000000000079 :10C7C0000000000000000000000000000000000069 :10C7D000000000000000000000003C00CC6E0100E2 :10C7E0000000000000000000000000000000000049 :10C7F0000000000000000000000000000000000039 :10C800000000000000000000000000000000000028 :10C810000000000000000000000000003C00086F65 :10C820000100000000000000000000000000000007 :10C8300000000000000000000000000000000000F8 :10C8400000000000000000000000000000000000E8 :10C8500000000000000000000000000000003C009C :10C86000446F010000000000000000000000000014 :10C8700000000000000000000000000000000000B8 :10C8800000000000000000000000000000000000A8 :10C890000000000000000000000000000000000098 :10C8A0003C00806F0100000000000000000000005C :10C8B0000000000000000000000000000000000078 :10C8C0000000000000000000000000000000000068 :10C8D0000000000000000000000000000000000058 :10C8E00000003C00BC6F01000000000000000000E0 :10C8F0000000000000000000000000000000000038 :10C900000000000000000000000000000000000027 :10C910000000000000000000000000000000000017 :10C92000000000003C00F86F010000000000000063 :10C9300000000000000000000000000000000000F7 :10C9400000000000000000000000000000000000E7 :10C9500000000000000000000000000000000000D7 :10C960000000000000003C003470010000000000E6 :10C9700000000000000000000000000000000000B7 :10C9800000000000000000000000000000000000A7 :10C990000000000000000000000000000000000097 :10C9A00000000000000000003C007070010000006A :10C9B0000000000000000000000000000000000077 :10C9C0000000000000000000000000000000000067 :10C9D0000000000000000000000000000000000057 :10C9E000000000000000000000003C00AC700100EE :10C9F0000000000000000000000000000000000037 :10CA00000000000000000000000000000000000026 :10CA10000000000000000000000000000000000016 :10CA20000000000000000000000000003C00E87072 :10CA300001000000000000000000000000000000F5 :10CA400000000000000000000000000000000000E6 :10CA500000000000000000000000000000000000D6 :10CA600000000000000000000000000000003C008A :10CA70002471010000000000000000000000000020 :10CA800000000000000000000000000000000000A6 :10CA90000000000000000000000000000000000096 :10CAA0000000000000000000000000000000000086 :10CAB0003C00607101000000000000000000000068 :10CAC0000000000000000000000000000000000066 :10CAD0000000000000000000000000000000000056 :10CAE0000000000000000000000000000000000046 :10CAF00000003C009C7101000000000000000000EC :10CB00000000000000000000000000000000000025 :10CB10000000000000000000000000000000000015 :10CB20000000000000000000000000000000000005 :10CB3000000000003C00D87101000000000000006F :10CB400000000000000000000000000000000000E5 :10CB500000000000000000000000000000000000D5 :10CB600000000000000000000000000000000000C5 :10CB70000000000000003C001472010000000000F2 :10CB800000000000000000000000000000000000A5 :10CB90000000000000000000000000000000000095 :10CBA0000000000000000000000000000000000085 :10CBB00000000000000000003C0050720100000076 :10CBC0000000000000000000000000000000000065 :10CBD0000000000000000000000000000000000055 :10CBE0000000000000000000000000000000000045 :10CBF000000000000000000000003C008C720100FA :10CC00000000000000000000000000000000000024 :10CC10000000000000000000000000000000000014 :10CC20000000000000000000000000000000000004 :10CC30000000000000000000000000003C00C8727E :10CC400001000000000000000000000000000000E3 :10CC500000000000000000000000000000000000D4 :10CC600000000000000000000000000000000000C4 :10CC700000000000000000000000000000003C0078 :10CC8000047301000000000000000000000000002C :10CC90000000000000000000000000000000000094 :10CCA0000000000000000000000000000000000084 :10CCB0000000000000000000000000000000000074 :10CCC0003C00407301000000000000000000000074 :10CCD0000000000000000000000000000000000054 :10CCE0000000000000000000000000000000000044 :10CCF0000000000000000000000000000000000034 :10CD000000003C007C7301000000000000000000F7 :10CD10000000000000000000000000000000000013 :10CD20000000000000000000000000000000000003 :10CD300000000000000000000000000000000000F3 :10CD4000000000003C00B87301000000000000007B :10CD500000000000000000000000000000000000D3 :10CD600000000000000000000000000000000000C3 :10CD700000000000000000000000000000000000B3 :10CD80000000000000003C00F473010000000000FF :10CD90000000000000000000000000000000000093 :10CDA0000000000000000000000000000000000083 :10CDB0000000000000000000000000000000000073 :10CDC00000000000000000003C0030740100000082 :10CDD0000000000000000000000000000000000053 :10CDE0000000000000000000000000000000000043 :10CDF0000000000000000000000000000000000033 :10CE0000000000000000000000003C006C74010005 :10CE10000000000000000000000000000000000012 :10CE20000000000000000000000000000000000002 :10CE300000000000000000000000000000000000F2 :10CE40000000000000000000000000003C00A8748A :10CE500001000000000000000000000000000000D1 :10CE600000000000000000000000000000000000C2 :10CE700000000000000000000000000000000000B2 :10CE800000000000000000000000000000003C0066 :10CE9000E474010000000000000000000000000039 :10CEA0000000000000000000000000000000000082 :10CEB0000000000000000000000000000000000072 :10CEC0000000000000000000000000000000000062 :10CED0003C00207501000000000000000000000080 :10CEE0000000000000000000000000000000000042 :10CEF0000000000000000000000000000000000032 :10CF00000000000000000000000000000000000021 :10CF100000003C005C750100000000000000000003 :10CF20000000000000000000000000000000000001 :10CF300000000000000000000000000000000000F1 :10CF400000000000000000000000000000000000E1 :10CF5000000000003C009875010000000000000087 :10CF600000000000000000000000000000000000C1 :10CF700000000000000000000000000000000000B1 :10CF800000000000000000000000000000000000A1 :10CF90000000000000003C00D4750100000000000B :10CFA0000000000000000000000000000000000081 :10CFB0000000000000000000000000000000000071 :10CFC0000000000000000000000000000000000061 :10CFD00000000000000000003C001076010000008E :10CFE0000000000000000000000000000000000041 :10CFF0000000000000000000000000000000000031 :10D000000000000000000000000000000000000020 :10D01000000000000000000000003C004C76010011 :10D020000000000000000000000000000000000000 :10D0300000000000000000000000000000000000F0 :10D0400000000000000000000000000000000000E0 :10D050000000000000000000000000003C00887696 :10D0600001000000000000000000000000000000BF :10D0700000000000000000000000000000000000B0 :10D0800000000000000000000000000000000000A0 :10D0900000000000000000000000000000003C0054 :10D0A000C476010000000000000000000000000045 :10D0B0000000000000000000000000000000000070 :10D0C0000000000000000000000000000000000060 :10D0D0000000000000000000000000000000000050 :10D0E0003C0000770100000000000000000000008C :10D0F0000000000000000000000000000000000030 :10D10000000000000000000000000000000000001F :10D11000000000000000000000000000000000000F :10D1200000003C003C77010000000000000000000F :10D1300000000000000000000000000000000000EF :10D1400000000000000000000000000000000000DF :10D1500000000000000000000000000000000000CF :10D16000000000003C007877010000000000000093 :10D1700000000000000000000000000000000000AF :10D18000000000000000000000000000000000009F :10D19000000000000000000000000000000000008F :10D1A0000000000000003C00B47701000000000017 :10D1B000000000000000000000000000000000006F :10D1C000000000000000000000000000000000005F :10D1D000000000000000000000000000000000004F :10D1E00000000000000000003C00F077010000009B :10D1F000000000000000000000000000000000002F :10D20000000000000000000000000000000000001E :10D21000000000000000000000000000000000000E :10D22000000000000000000000003C002C7801001D :10D2300000000000000000000000000000000000EE :10D2400000000000000000000000000000000000DE :10D2500000000000000000000000000000000000CE :10D260000000000000000000000000003C006878A2 :10D2700001000000000000000000000000000000AD :10D28000000000000000000000000000000000009E :10D29000000000000000000000000000000000008E :10D2A00000000000000000000000000000003C0042 :10D2B000A478010000000000000000000000000051 :10D2C000000000000000000000000000000000005E :10D2D000000000000000000000000000000000004E :10D2E000000000000000000000000000000000003E :10D2F0003C00E07801000000000000000000000099 :10D30000000000000000000000000000000000001D :10D31000000000000000000000000000000000000D :10D3200000000000000000000000000000000000FD :10D3300000003C001C79010000000000000000001B :10D3400000000000000000000000000000000000DD :10D3500000000000000000000000000000000000CD :10D3600000000000000000000000000000000000BD :10D37000000000003C00587901000000000000009F :10D38000000000000000000000000000000000009D :10D39000000000000000000000000000000000008D :10D3A000000000000000000000000000000000007D :10D3B0000000000000003C00947901000000000023 :10D3C000000000000000000000000000000000005D :10D3D000000000000000000000000000000000004D :10D3E000000000000000000000000000000000003D :10D3F00000000000000000003C00D07901000000A7 :10D40000000000000000000000000000000000001C :10D41000000000000000000000000000000000000C :10D4200000000000000000000000000000000000FC :10D43000000000000000000000003C000C7A010029 :10D4400000000000000000000000000000000000DC :10D4500000000000000000000000000000000000CC :10D4600000000000000000000000000000000000BC :10D470000000000000000000000000003C00487AAE :10D48000010000000000000000000000000000009B :10D49000000000000000000000000000000000008C :10D4A000000000000000000000000000000000007C :10D4B00000000000000000000000000000003C0030 :10D4C000847A01000000000000000000000000005D :10D4D000000000000000000000000000000000004C :10D4E000000000000000000000000000000000003C :10D4F000000000000000000000000000000000002C :10D500003C00C07A010000000000000000000000A4 :10D51000000000000000000000000000000000000B :10D5200000000000000000000000000000000000FB :10D5300000000000000000000000000000000000EB :10D5400000003C00FC7A0100000000000000000028 :10D5500000000000000000000000000000000000CB :10D5600000000000000000000000000000000000BB :10D5700000000000000000000000000000000000AB :10D58000000000003C00387B0100000000000000AB :10D59000000000000000000000000000000000008B :10D5A000000000000000000000000000000000007B :10D5B000000000000000000000000000000000006B :10D5C0000000000000003C00747B0100000000002F :10D5D000000000000000000000000000000000004B :10D5E000000000000000000000000000000000003B :10D5F000000000000000000000000000000000002B :10D6000000000000000000003C00B07B01000000B2 :10D61000000000000000000000000000000000000A :10D6200000000000000000000000000000000000FA :10D6300000000000000000000000000000000000EA :10D64000000000000000000000003C00EC7B010036 :10D6500000000000000000000000000000000000CA :10D6600000000000000000000000000000000000BA :10D6700000000000000000000000000000000000AA :10D680000000000000000000000000003C00287CBA :10D690000100000000000000000000000000000089 :10D6A000000000000000000000000000000000007A :10D6B000000000000000000000000000000000006A :10D6C00000000000000000000000000000003C001E :10D6D000647C010000000000000000000000000069 :10D6E000000000000000000000000000000000003A :10D6F000000000000000000000000000000000002A :10D700000000000000000000000000000000000019 :10D710003C00A07C010000000000000000000000B0 :10D7200000000000000000000000000000000000F9 :10D7300000000000000000000000000000000000E9 :10D7400000000000000000000000000000000000D9 :10D7500000003C00DC7C0100000000000000000034 :10D7600000000000000000000000000000000000B9 :10D7700000000000000000000000000000000000A9 :10D780000000000000000000000000000000000099 :10D79000000000003C00187D0100000000000000B7 :10D7A0000000000000000000000000000000000079 :10D7B0000000000000000000000000000000000069 :10D7C0000000000000000000000000000000000059 :10D7D0000000000000003C00547D0100000000003B :10D7E0000000000000000000000000000000000039 :10D7F0000000000000000000000000000000000029 :10D800000000000000000000000000000000000018 :10D8100000000000000000003C00907D01000000BE :10D8200000000000000000000000000000000000F8 :10D8300000000000000000000000000000000000E8 :10D8400000000000000000000000000000000000D8 :10D85000000000000000000000003C00CC7D010042 :10D8600000000000000000000000000000000000B8 :10D8700000000000000000000000000000000000A8 :10D880000000000000000000000000000000000098 :10D890000000000000000000000000003C00087EC6 :10D8A0000100000000000000000000000000000077 :10D8B0000000000000000000000000000000000068 :10D8C0000000000000000000000000000000000058 :10D8D00000000000000000000000000000003C000C :10D8E000447E010000000000000000000000000075 :10D8F0000000000000000000000000000000000028 :10D900000000000000000000000000000000000017 :10D910000000000000000000000000000000000007 :10D920003C00807E010000000000000000000000BC :10D9300000000000000000000000000000000000E7 :10D9400000000000000000000000000000000000D7 :10D9500000000000000000000000000000000000C7 :10D9600000003C00BC7E0100000000000000000040 :10D9700000000000000000000000000000000000A7 :10D980000000000000000000000000000000000097 :10D990000000000000000000000000000000000087 :10D9A000000000003C00F87E0100000000000000C4 :10D9B0000000000000000000000000000000000067 :10D9C0000000000000000000000000000000000057 :10D9D0000000000000000000000000000000000047 :10D9E0000000000000003C00347F01000000000047 :10D9F0000000000000000000000000000000000027 :10DA00000000000000000000000000000000000016 :10DA10000000000000000000000000000000000006 :10DA200000000000000000003C00707F01000000CA :10DA300000000000000000000000000000000000E6 :10DA400000000000000000000000000000000000D6 :10DA500000000000000000000000000000000000C6 :10DA6000000000000000000000003C00AC7F01004E :10DA700000000000000000000000000000000000A6 :10DA80000000000000000000000000000000000096 :10DA90000000000000000000000000000000000086 :10DAA0000000000000000000000000003C00E87FD3 :10DAB0000100000000000000000000000000000065 :10DAC0000000000000000000000070B50125074EB6 :10DAD000AD0375610A20FAF76CFF30688003C40F4C :10DAE000B5610A20FAF765FF201C70BD00003C00FC :10DAF000248001001000070070B501256D04002886 :10DB0000104C01D0656100E0A56160682843606049 :10DB1000A0682843A0600A20FAF74EFF0126B6034A :10DB200066610A20FAF748FFA6610120FAF744FF70 :10DB30003C0060800100A068A843A06060682843A2 :10DB400060600A20FAF73BFF70BD1000070070B557 :10DB50000125104C6D046561606828436060A06811 :10DB60002843A060EE08A6610A20FAF728FF666144 :10DB70000A203C009C800100FAF724FFA5610A20DE :10DB8000FAF720FFA6610A20FAF71CFFA068A84355 :10DB9000A06060682843606070BD0000100007004E :10DBA00070B501250E4C6D04A56160682843606066 :10DBB000A06828433C00D8800100A060EE086661A0 :10DBC0000A20FAF702FF65610A20FAF7FEFEA66155 :10DBD0000A20FAF7FAFEA068A843A060606828430C :10DBE000606070BD00001000070070B5051C0024C7 :10DBF0008026281C30403C0014810100FFF788FF7C :10DC00006806050E0134082CF6DBFFF76DFF70BDCA :10DC100080B5021C0B218020FBF73EFB80BD00007D :10DC2000F8B512480025071CFF37061D0137281CD0 :10DC3000F9F7EAFD041C17D03C005081010020696F :10DC4000002804D0E06A002803D00020E062251CF0 :10DC5000F0E77B68002B05D0321C211C44310120E9 :10DC6000E8F734F9201C4430F9F737FEE2E7F8BD55 :10DC7000000020F70100114870B53C008C810100C4 :10DC80000068FF281DD1FF203230FAF7A7FE0E4DA5 :10DC90006C680E48FAF7A2FE6868241A012000F0AA :10DCA00095FD6E680948FAF799FE6868211C0A39E3 :10DCB000301A884202D30A34A04202D93C00C881FB :10DCC0000100002000F085FD70BDF4740100000328 :10DCD00007009303000070B500F04DF80120EDF748 :10DCE00034F9114D182168600020E9F7F2F9286035 :10DCF00004688020208000260622FF21201D3C0091 :10DD0000048201006680E8F70BFA201C0A300949FA :10DD1000F2F72EFD201C10300749F2F729FDE682AC :10DD200003CDE9F7F9F8024901201439886070BD84 :10DD300090D901001261010024F701007047000032 :10DD40003C004082010010B5064C00220220E16830 :10DD5000F0F711FB6078022801D100F01AF910BD2C :10DD6000000040D9010080B5A120FFF750FF80BD21 :10DD7000000040000E21084080B5A030FFF747FFAB :10DD800080BD3C007C82010010B5054C2068002855 :10DD900004D0E9F787F900202060606010BD000022 :10DDA00090D9010010B5074C0121074A21610220DA :10DDB0001070616100F0D6FC00F0C8FB201CEDF78C :10DDC0009FFA10BD3C00B882010020F701007CD909 :10DDD000010070B5021C081C0225002A134E14D045 :10DDE00000F011FC3078012108433070307828436E :10DDF000307000207D214901B279920700D50134AD :10DE000001308842F8DB3C00F4820100201C70BD28 :10DE10003078A843307030784008400030700549B1 :10DE200048680122120490434860012070BD000040 :10DE3000880007006C000700FFB509AE002060CE27 :10DE4000286000239C4630603C0030830100694616 :10DE500001AA17E0DB070ED5124B1C56631C0AD033 :10DE600001272B68A7403B432B601368DB0702D5D3 :10DE700033683B4333600B685B080B6013685B08D7 :10DE8000136001300B68002B01D03C006C83010053 :10DE90002228E2D3634601332020022B9C4602A9AC :10DEA00003AAF2DBFFBD0000B48D0100B0B5041C75 :10DEB0000D1C1E2100220320054BF9F7B3F8211C8D :10DEC0000320F9F7F5F8291C0320F9F73C00A88393 :10DED0000100F1F8B0BD80380100B0B51C4C1C4DFC :10DEE0002178022909D0032919D004291FD0052936 :10DEF00023D1002000F017FB23E0686114481C3098 :10DF0000C16802698918C16000F02FFBE0683C001D :10DF1000E48301000138E06016D13220E060FFF7B1 :10DF2000A3FE11E0002000F001FB00F02DFC012019 :10DF3000207009E0002000F0F9FAFFF745FF03E048 :10DF400005210B20E8F746FF68696168E7F7DDFF08 :10DF50003C0020840100B0BD00007CD9010020F706 :10DF60000100F7B5041C171CFFF721FE200AFFF77C :10DF700018FF2006000EFFF762FEFFF718FEA12033 :10DF8000FFF75DFE002516E0002000244006060E87 :10DF9000FFF73C005C840100D1FD0006000E304319 :10DFA0000134082CF5DB291C019A0135BD4250547F :10DFB00001DA002000E00120FFF7D4FDBD42E6DBDE :10DFC000FFF71EFEFEBD000080B5FFF719FE092118 :10DFD000890300223C00988401000220F0F7E9F94F :10DFE00080BD0921890380B500220220F0F7C9F91C :10DFF000012109488903816142680A4342608268BD :10E000001143816001214904816182688A438260F1 :10E010004268114341603C00D484010080BD00008F :10E0200010000700F0B5041CC0687B4E056830780E :10E0300085B0012801D0022872D100212069F2F7B1 :10E0400041F97649F2F724FC002869D0201C2030E1 :10E05000417A082902D1724A3C0010850100002152 :10E060005161007A226A1821F2F7C9FBE16A371C74 :10E0700040186C49029030780E1CFF360A1D01369C :10E080000128049207D0654A02991C32281CEDF73A :10E09000E2FB00286BD0322120693C004C85010056 :10E0A000F2F716F9019020690121F2F711F9011C2C :10E0B0005E480123019AEDF707FC002804D15B4874 :10E0C000EDF792FA0021B96056481C308168EAF7F2 :10E0D00019FC201C143003900499F2F73C00888549 :10E0E0000100D5FB002805D10022BA6004980399ED :10E0F000F2F76BFB4F4928890988884203D0002238 :10E100004C49BA60088003212069F2F7E4F800283E :10E1100010D04649827820310B7994469A423C00CF :10E12000C485010009D00022BA6062460A71807875 :10E130000121F3F705F900E077E006212069F2F705 :10E14000CDF8002808D081783A4840308288914242 :10E1500002D00022BA6081802A212069F2F7BEF83D :10E160003C000086010000280DD08078F169334A18 :10E17000814208D00021B960F061101CEDF709FB65 :10E180002F48EDF7FAFA38783B1C012817D1022006 :10E1900018702A4F01233B61274B03CD1C33083DE8 :10E1A000029A3C003C860100EDF7B0FA381CEDF70E :10E1B000D7F83268002A03D000210120E7F7C4FE17 :10E1C00000F0F4F9201CF9F7D5FB071C11D1201C35 :10E1D000F9F788FB071C2ED001233B616889402199 :10E1E000C85373683C0078860100002B04D0211CC2 :10E1F0000020049AE7F7ACFE0123FB62206932217C :10E20000F2F775F8051C20690121F2F770F80E4E3F :10E21000011C2A1C301CEDF7C0FB00280ED1322156 :10E220002069F2F764F83C00B4860100051C2069FF :10E230000121F2F75FF8011C3B1C2A1C301CEDF792 :10E24000D7FA05B0F0BD00007CD9010040F801000C :10E2500020F70100021C081C802A80B506D0812A04 :10E2600003D004210B20E8F73C00F0860100D9FD23 :10E2700080BDFFF75CFE80BD000003488178FF2968 :10E2800001D0007970470020704780F8010030B558 :10E2900089B000930E4D131C041C2A1CECF725FDBD :10E2A00001A906A8A268ECF7CEFE3C002C8701006D :10E2B00001AA06A9281C636AEDF744FA041C012888 :10E2C00004D1281CEDF72CF800F04AF8201C09B006 :10E2D00030BD000020F7010080B5EDF72BF800F00D :10E2E0007DF80248EDF702FA80BD00003C00688727 :10E2F000010020F7010080B500280BD10648EDF79A :10E30000F8F900F06EF80120EDF7EBFA034903206D :10E31000F9F735FE80BD20F701006D870100B0B52B :10E32000104D041C131C2A1C88B0ECF702FD3C00A5 :10E33000A4870100211C0A310622281DE7F7A4FE4C :10E34000694605A86269ECF787FE281CECF7EEFF2A :10E350007F23DB43281C6A4605A9EDF7F9F900F095 :10E360001DF808B0B0BD000020F701000A4880B5D4 :10E370003C00E08701000178002906D0022901D085 :10E38000052907D10321017080BD0121017000F032 :10E390002EFA80BD03210B20E8F74FFD80BD7CD90C :10E3A0000100094980B50878002806D0022801D06C :10E3B00005283C001C88010005D10420087080BDA0 :10E3C000FFF738FD80BD02210B20E8F739FD80BD45 :10E3D0007CD9010080B502210B20044AFAF782FFA4 :10E3E000F6F786FD0249086180BD0000DD86010068 :10E3F0007CD901003C00588801000C4880B50178A8 :10E4000006290ED202A35B5C5B009F44000006035A :10E4100007070706002000F0C2F880BD0521017043 :10E4200080BD04210B20E8F70EFD80BD00007CD9E3 :10E430000100704700003C009488010010B50D4BAE :10E44000041C181C1030002C08D0DB885B045B0C0B :10E450000B80807B48800420108008E0DA8801244B :10E46000E40322400C882243DA804988817301202A :10E4700010BD0000300007003C00D088010070B5DE :10E48000104E021C0023F056002A02D0087001240E :10E4900015E00023CD56854201D1012070BD281C16 :10E4A00000F05FF9041C0AD00748357000680028A6 :10E4B00003D000210A20F9F728FD3C000C89010057 :10E4C00000F016FA201C70BDF46B01003CD901006D :10E4D000031C081C002B80B506D0042111800422E7 :10E4E0000449E7F7E3FD02E0006800F0CFF90120FE :10E4F00080BD0000F474010010B5FFF73C004889AE :10E50000010097FBFFF789FC041CFFF7B8FBFFF73E :10E5100084FC002C02D1012800D110BD002010BDC8 :10E520000000F8B5204F041C78780E1C02282ED06D :10E530001E4AF968916114231D49584340183C0054 :10E5400084890100417BB878F8F714FE00F08AF95D :10E55000002504E00021B878F8F70CFE0135787842 :10E560001423144958434018807AA842F2DC00254D :10E5700008E00021B878F8F7FDFD0F48006820702A :10E580003C00C089010001340135B542F4DB094A81 :10E59000F86850617878022806D1B868321C211CCE :10E5A0000004000CFFF725FDB8688019B860F8BDBD :10E5B000000040D9010010000700648D01003020E8 :10E5C00007003C00FC89010070B5061C0C4D0024BE :10E5D0002C70FFF739FC0A4818211C30AC60E7F7B3 :10E5E00043FD08484461F9F763F9002E06D1064857 :10E5F0002969F6F7A7FC0020ECF7B0FE70BD00001B :10E600007CD901003C00388A010020F70100346306 :10E61000010030B5124C85B0206800281CD00F488E :10E6200014388068002801D1FFF7C1FB206800235F :10E63000006801AA04300121ECF7D1FD0849084A1D :10E6400008310C3100923C00748A010003C900AB10 :10E650004518997B019A20682B1CF2F72BFE05B018 :10E6600030BD000090D901002981010010B5134C84 :10E67000142360705843124BC1188A88E2801858DE :10E68000E060087AA070FF283C00B08A010012D038 :10E69000002208210D4BF8F722FD00220220E1683C :10E6A000EFF7BDFE0A49E06848614A6802434A60E4 :10E6B0008A68104388606078022801D1FFF7DFFC88 :10E6C00010BD40D90100648D01003C00EC8A0100BE :10E6D000B80B000010000700FE300006000E0621F7 :10E6E000154B4143585C82061448920E4271C9187A :10E6F0004A78D206D20E027142780C231A43427035 :10E7000042788B78920892009B079B0F3C00288BE5 :10E7100001001A4342700278C0239A4340320270CB :10E72000027838231A4302700278C97804239A4386 :10E730008900194011430170012070470000D88DF5 :10E740000100880007008FB50020029003903C0074 :10E75000648B0100074802AA03A900910192438932 :10E76000028903C8FFF7D4FB03980299FFF704FC62 :10E770008FBD0000048E010008494A78002A03D1A9 :10E78000888000208860704714235A43044BD218B5 :10E790003C00A08B0100D2884243C88842438A6073 :10E7A000704740D90100648D0100F8B5254E041C66 :10E7B000307A400840003072B07A0020B0720127F1 :10E7C000012C204D01D0FC4213D1307B38433073F3 :10E7D00000223C00DC8B0100211C0020FFF76EFBB7 :10E7E000631C01D13F21E973B17AA0221143B172B8 :10E7F000317A39433172F8BD307B400840003073C4 :10E800000122211C0120FFF759FB01200021E9739F :10E81000B17A02223C00188C01001143B172B17A26 :10E8200004221143B172B17A30221143B172317AAC :10E830003943317208494A6880239A434A600A681A :10E840001A430A60317B39433173D7E700008800EF :10E850000700400007003C00548C01006C000700DA :10E86000B0B50E4D0E482969F6F79EFB0D48ECF742 :10E8700093FD0D48094C00881C34A082F1F75AFF23 :10E880002061FAF797F8021C231C00210020ECF706 :10E890008BFF3220E860FFF73C00908C0100A5FA66 :10E8A000B0BD7CD9010034630100DD84010020F794 :10E8B0000100B0B50A4D687800280ED0142308492D :10E8C00058434018447A06E0A868E0400106090E63 :10E8D000A878F8F776FC083CF6D53C00CC8C010013 :10E8E000B0BD000040D90100648D0100011C144836 :10E8F000B0B501601348027F02239A430277027F7A :10E90000012422430277104D00290CD0012200215E :10E910000320EFF79FFD0D49487CA0433C00088D84 :10E9200001004874687A20436872B0BD017F2143BA :10E930000177687A400840006872012200210320B4 :10E94000EFF7B1FDB0BDF47401003000070088009E :10E9500007001000070010B5074C211C00203C00E8 :10E96000448D0100F9F756FB05480023C0560128E5 :10E9700003DD211C0020F9F719FB10BD651A00000A :10E98000F46B01000000020008010100021804FFFE :10E9900082E8D78000000000008000000001000134 :10E9A0003C00808D010000180006020305010100F3 :10E9B00000000000000080000100FF1000FFFFFFCA :10E9C000FFFFFF0000000000020020000100021015 :10E9D0000006020305010100000004050607080CFB :10E9E0000D0E3C00BC8D0100FF1415161718191BE5 :10E9F0001C1DFF1A1113120F10FF0200FF01030963 :10EA00000A0B0000300D02000000280E0300000079 :10EA10001E0C00000000300D020100001E0C000161 :10EA20000000230D3C00F88D0100020100001D0DC7 :10EA3000020100000000FFFEFB6D000080000200EC :10EA400000000000000000000000000000000000C6 :10EA500000000000000000000000000000000000B6 :10EA60000000000000003C00348E010000000000A7 :10EA70000000000000000000000000000000000096 :10EA80000000000000000000000000000000000086 :10EA90000000000000000000000000000000000076 :10EAA00000000000000000003C00708E010000002B :10EAB0000000000000000000000000000000000056 :10EAC0000000000000000000000000000000000046 :10EAD0000000000000000000000000000000000036 :10EAE000000000000000000000003C00AC8E0100AF :10EAF0000000000000000000000000000000000016 :10EB00000000000000000000000000000000000005 :10EB100000000000000000000000000000000000F5 :10EB20000000000000000000000000003C00E88E33 :10EB300001000000000000000000000000000000D4 :10EB400000000000000000000000000000000000C5 :10EB500000000000000000000000000000000000B5 :10EB600000000000000000000000000000003C0069 :10EB7000248F0100000000000000000000000000E1 :10EB80000000000000000000000000000000000085 :10EB90000000000000000000000000000000000075 :10EBA0000000000000000000000000000000000065 :10EBB0003C00608F01000000000000000000000029 :10EBC0000000000000000000000000000000000045 :10EBD0000000000000000000000000000000000035 :10EBE0000000000000000000000000000000000025 :10EBF00000003C009C8F01000000000000000000AD :10EC00000000000000000000000000000000000004 :10EC100000000000000000000000000000000000F4 :10EC200000000000000000000000000000000000E4 :10EC3000000000003C00D88F010000000000000030 :10EC400000000000000000000000000000000000C4 :10EC500000000000000000000000000000000000B4 :10EC600000000000000000000000000000000000A4 :10EC70000000000000003C001490010000000000B3 :10EC80000000000000000000000000000000000084 :10EC90000000000000000000000000000000000074 :10ECA0000000000000000000000000000000000064 :10ECB00000000000000000003C0050900100000037 :10ECC0000000000000000000000000000000000044 :10ECD0000000000000000000000000000000000034 :10ECE0000000000000000000000000000000000024 :10ECF000000000000000000000003C008C900100BB :10ED00000000000000000000000000000000000003 :10ED100000000000000000000000000000000000F3 :10ED200000000000000000000000000000000000E3 :10ED30000000000000000000000000003C00C8903F :10ED400001000000000000000000000000000000C2 :10ED500000000000000000000000000000000000B3 :10ED600000000000000000000000000000000000A3 :10ED700000000000000000000000000000003C0057 :10ED800004910100000000000000000000000000ED :10ED90000000000000000000000000000000000073 :10EDA0000000000000000000000000000000000063 :10EDB0000000000000000000000000000000000053 :10EDC0003C00409101000000000000000000000035 :10EDD0000000000000000000000000000000000033 :10EDE0000000000000000000000000000000000023 :10EDF0000000000000000000000000000000000013 :10EE000000003C007C9101000000000000000000B8 :10EE100000000000000000000000000000000000F2 :10EE200000000000000000000000000000000000E2 :10EE300000000000000000000000000000000000D2 :10EE4000000000003C00B89101000000000000003C :10EE500000000000000000000000000000000000B2 :10EE600000000000000000000000000000000000A2 :10EE70000000000000000000000000000000000092 :10EE80000000000000003C00F491010000000000C0 :10EE90000000000000000000000000000000000072 :10EEA0000000000000000000000000000000000062 :10EEB0000000000000000000000000000000000052 :10EEC00000000000000000003C0030920100000043 :10EED0000000000000000000000000000000000032 :10EEE0000000000000000000000000000000000022 :10EEF0000000000000000000000000000000000012 :10EF0000000000000000000000003C006C920100C6 :10EF100000000000000000000000000000000000F1 :10EF200000000000000000000000000000000000E1 :10EF300000000000000000000000000000000000D1 :10EF40000000000000000000000000003C00A8924B :10EF500001000000000000000000000000000000B0 :10EF600000000000000000000000000000000000A1 :10EF70000000000000000000000000000000000091 :10EF800000000000000000000000000000003C0045 :10EF9000E4920100000000000000000000000000FA :10EFA0000000000000000000000000000000000061 :10EFB0000000000000000000000000000000000051 :10EFC0000000000000000000000000000000000041 :10EFD0003C00209301000000000000000000000041 :10EFE0000000000000000000000000000000000021 :10EFF0000000000000000000000000000000000011 :10F000000000000000000000000000000000000000 :10F0100000003C005C9301000000000000000000C4 :10F0200000000000000000000000000000000000E0 :10F0300000000000000000000000000000000000D0 :10F0400000000000000000000000000000000000C0 :10F05000000000003C009893010000000000000048 :10F0600000000000000000000000000000000000A0 :10F070000000000000000000000000000000000090 :10F080000000000000000000000000000000000080 :10F090000000000000003C00D493010000000000CC :10F0A0000000000000000000000000000000000060 :10F0B0000000000000000000000000000000000050 :10F0C0000000000000000000000000000000000040 :10F0D00000000000000000003C001094010000004F :10F0E0000000000000000000000000000000000020 :10F0F0000000000000000000000000000000000010 :10F1000000000000000000000000000000000000FF :10F11000000000000000000000003C004C940100D2 :10F1200000000000000000000000000000000000DF :10F1300000000000000000000000000000000000CF :10F1400000000000000000000000000000000000BF :10F150000000000000000000000000003C00889457 :10F16000010000000000000000000000000000009E :10F17000000000000000000000000000000000008F :10F18000000000000000000000000000000000007F :10F1900000000000000000000000000000003C0033 :10F1A000C494010000000000000000000000000006 :10F1B000000000000000000000000000000000004F :10F1C000000000000000000000000000000000003F :10F1D000000000000000000000000000000000002F :10F1E0003C0000950100000000000000000000004D :10F1F000000000000000000000000000000000000F :10F2000000000000000000000000000000000000FE :10F2100000000000000000000000000000000000EE :10F2200000003C003C9501000000000000000000D0 :10F2300000000000000000000000000000000000CE :10F2400000000000000000000000000000000000BE :10F2500000000000000000000000000000000000AE :10F26000000000003C007895010000000000000054 :10F27000000000000000000000000000000000008E :10F28000000000000000000000000000000000007E :10F29000000000000000000000000000000000006E :10F2A0000000000000003C00B495010000000000D8 :10F2B000000000000000000000000000000000004E :10F2C000000000000000000000000000000000003E :10F2D000000000000000000000000000000000002E :10F2E00000000000000000003C00F095010000005C :10F2F000000000000000000000000000000000000E :10F3000000000000000000000000000000000000FD :10F3100000000000000000000000000000000000ED :10F32000000000000000000000003C002C960100DE :10F3300000000000000000000000000000000000CD :10F3400000000000000000000000000000000000BD :10F3500000000000000000000000000000000000AD :10F360000000000000000000000000003C00689663 :10F37000010000000000000000000000000000008C :10F38000000000000000000000000000000000007D :10F39000000000000000000000000000000000006D :10F3A00000000000000000000000000000003C0021 :10F3B000A496010000000000000000000000000012 :10F3C000000000000000000000000000000000003D :10F3D000000000000000000000000000000000002D :10F3E000000000000000000000000000000000001D :10F3F0003C00E0960100000000000000000000005A :10F4000000000000000000000000000000000000FC :10F4100000000000000000000000000000000000EC :10F4200000000000000000000000000000000000DC :10F4300000003C001C9701000000000000000000DC :10F4400000000000000000000000000000000000BC :10F4500000000000000000000000000000000000AC :10F46000000000000000000000000000000000009C :10F47000000000003C005897010000000000000060 :10F48000000000000000000000000000000000007C :10F49000000000000000000000000000000000006C :10F4A000000000000000000000000000000000005C :10F4B0000000000000003C009497010000000000E4 :10F4C000000000000000000000000000000000003C :10F4D000000000000000000000000000000000002C :10F4E000000000000000000000000000000000001C :10F4F00000000000000000003C00D0970100000068 :10F5000000000000000000000000000000000000FB :10F5100000000000000000000000000000000000EB :10F5200000000000000000000000000000000000DB :10F53000000000000000000000003C000C980100EA :10F5400000000000000000000000000000000000BB :10F5500000000000000000000000000000000000AB :10F56000000000000000000000000000000000009B :10F570000000000000000000000000003C0048986F :10F58000010000000000000000000000000000007A :10F59000000000000000000000000000000000006B :10F5A000000000000000000000000000000000005B :10F5B00000000000000000000000000000003C000F :10F5C000849801000000000000000000000000001E :10F5D000000000000000000000000000000000002B :10F5E000000000000000000000000000000000001B :10F5F000000000000000000000000000000000000B :10F600003C00C09801000000000000000000000065 :10F6100000000000000000000000000000000000EA :10F6200000000000000000000000000000000000DA :10F6300000000000000000000000000000000000CA :10F6400000003C00FC9801000000000000000000E9 :10F6500000000000000000000000000000000000AA :10F66000000000000000000000000000000000009A :10F67000000000000000000000000000000000008A :10F68000000000003C00389901000000000000006C :10F69000000000000000000000000000000000006A :10F6A000000000000000000000000000000000005A :10F6B000000000000000000000000000000000004A :10F6C0000000000000003C007499010000000000F0 :10F6D000000000000000000000000000000000002A :10F6E000000000000000000000000000000000001A :10F6F000000000000000000000000000000000000A :10F7000000000000000000003C00B0990100000073 :10F7100000000000000000000000000000000000E9 :10F7200000000000000000000000000000000000D9 :10F7300000000000000000000000000000000000C9 :10F74000000000000000000000003C00EC990100F7 :10F7500000000000000000000000000000000000A9 :10F760000000000000000000000000000000000099 :10F770000000000000000000000000000000000089 :10F780000000000000000000000000003C00289A7B :10F790000100000000000000000000000000000068 :10F7A0000000000000000000000000000000000059 :10F7B0000000000000000000000000000000000049 :10F7C00000000000000000000000000000003C00FD :10F7D000649A01000000000000000000000000002A :10F7E0000000000000000000000000000000000019 :10F7F0000000000000000000000000000000000009 :10F8000000000000000000000000000000000000F8 :10F810003C00A09A01000000000000000000000071 :10F8200000000000000000000000000000000000D8 :10F8300000000000000000000000000000000000C8 :10F8400000000000000000000000000000000000B8 :10F8500000003C00DC9A01000000000000000000F5 :10F860000000000000000000000000000000000098 :10F870000000000000000000000000000000000088 :10F880000000000000000000000000000000000078 :10F89000000000003C00189B010000000000000078 :10F8A0000000000000000000000000000000000058 :10F8B0000000000000000000000000000000000048 :10F8C0000000000000000000000000000000000038 :10F8D0000000000000003C00549B010000000000FC :10F8E0000000000000000000000000000000000018 :10F8F0000000000000000000000000000000000008 :10F9000000000000000000000000000000000000F7 :10F9100000000000000000003C00909B010000007F :10F9200000000000000000000000000000000000D7 :10F9300000000000000000000000000000000000C7 :10F9400000000000000000000000000000000000B7 :10F95000000000000000000000003C00CC9B010003 :10F960000000000000000000000000000000000097 :10F970000000000000000000000000000000000087 :10F980000000000000000000000000000000000077 :10F990000000000000000000000000003C00089C87 :10F9A0000100000000000000000000000000000056 :10F9B0000000000000000000000000000000000047 :10F9C0000000000000000000000000000000000037 :10F9D00000000000000000000000000000003C00EB :10F9E000449C010000000000000000000000000036 :10F9F0000000000000000000000000000000000007 :10FA000000000000000000000000000000000000F6 :10FA100000000000000000000000000000000000E6 :10FA20003C00809C0100000000000000000000007D :10FA300000000000000000000000000000000000C6 :10FA400000000000000000000000000000000000B6 :10FA500000000000000000000000000000000000A6 :10FA600000003C00BC9C0100000000000000000001 :10FA70000000000000000000000000000000000086 :10FA80000000000000000000000000000000000076 :10FA90000000000000000000000000000000000066 :10FAA000000000003C00F89C010000000000000085 :10FAB0000000000000000000000000000000000046 :10FAC0000000000000000000000000000000000036 :10FAD0000000000000000000000000000000000026 :10FAE0000000000000003C00349D01000000000008 :10FAF0000000000000000000000000000000000006 :10FB000000000000000000000000000000000000F5 :10FB100000000000000000000000000000000000E5 :10FB200000000000000000003C00709D010000008B :10FB300000000000000000000000000000000000C5 :10FB400000000000000000000000000000000000B5 :10FB500000000000000000000000000000000000A5 :10FB6000000000000000000000003C00AC9D01000F :10FB70000000000000000000000000000000000085 :10FB80000000000000000000000000000000000075 :10FB90000000000000000000000000000000000065 :10FBA0000000000000000000000000003C00E89D94 :10FBB0000100000000000000000000000000000044 :10FBC0000000000000000000000000000000000035 :10FBD0000000000000000000000000000000000025 :10FBE00000000000000000000000000000003C00D9 :10FBF000249E010000000000000000000000000042 :10FC000000000000000000000000000000000000F4 :10FC100000000000000000000000000000000000E4 :10FC200000000000000000000000000000000000D4 :10FC30003C00609E01000000000000000000000089 :10FC400000000000000000000000000000000000B4 :10FC500000000000000000000000000000000000A4 :10FC60000000000000000000000000000000000094 :10FC700000003C009C9E010000000000000000000D :10FC80000000000000000000000000000000000074 :10FC90000000000000000000000000000000000064 :10FCA0000000000000000000000000000000000054 :10FCB000000000003C00D89E010000000000000091 :10FCC0000000000000000000000000000000000034 :10FCD0000000000000000000000000000000000024 :10FCE0000000000000000000000000000000000014 :10FCF0000000000000003C00149F01000000000014 :10FD000000000000000000000000000000000000F3 :10FD100000000000000000000000000000000000E3 :10FD200000000000000000000000000000000000D3 :10FD300000000000000000003C00509F0100000097 :10FD400000000000000000000000000000000000B3 :10FD500000000000000000000000000000000000A3 :10FD60000000000000000000000000000000000093 :10FD7000000000000000000000003C008C9F01001B :10FD80000000000000000000000000000000000073 :10FD90000000000000000000000000000000000063 :10FDA0000000000000000000000000000000000053 :10FDB0000000000000000000000000003C00C89FA0 :10FDC0000100000000000000000000000000000032 :10FDD0000000000000000000000000000000000023 :10FDE0000000000000000000000000000000000013 :10FDF00000000000000000000000000000003C00C7 :10FE000004A001000000000000000000000000004D :10FE100000000000000000000000000000000000E2 :10FE200000000000000000000000000000000000D2 :10FE300000000000000000000000000000000000C2 :10FE40003C0040A001000000000000000000000095 :10FE500000000000000000000000000000000000A2 :10FE60000000000000000000000000000000000092 :10FE70000000000000000000000000000000000082 :10FE800000003C007CA00100000000000000000019 :10FE90000000000000000000000000000000000062 :10FEA0000000000000000000000000000000000052 :10FEB0000000000000000000000000000000000042 :10FEC000000000003C00B8A001000000000000009D :10FED0000000000000000000000000000000000022 :10FEE0000000000000000000000000000000000012 :10FEF0000000000000000000000000000000000002 :10FF00000000000000003C00F4A001000000000020 :10FF100000000000000000000000000000000000E1 :10FF200000000000000000000000000000000000D1 :10FF300000000000000000000000000000000000C1 :10FF400000000000000000003C0030A101000000A3 :10FF500000000000000000000000000000000000A1 :10FF60000000000000000000000000000000000091 :10FF70000000000000000000000000000000000081 :10FF8000000000000000000000003C006CA1010027 :10FF90000000000000000000000000000000000061 :10FFA0000000000000000000000000000000000051 :10FFB0000000000000000000000000000000000041 :10FFC0000000000000000000000000003C00A8A1AC :10FFD0000100000000000000000000000000000020 :10FFE0000000000000000000000000000000000011 :10FFF0000000000000000000000000000000000001 :02000004800278 :1000000000000000000000000000000000003C00B4 :10001000E4A101000000000000000000000000005A :1000200000000000000000000000000000000000D0 :1000300000000000000000000000000000000000C0 :1000400000000000000000000000000000000000B0 :100050003C0020A2010000000000000000000000A1 :100060000000000000000000000000000000000090 :100070000000000000000000000000000000000080 :100080000000000000000000000000000000000070 :1000900000003C005CA20100000000000000000025 :1000A0000000000000000000000000000000000050 :1000B0000000000000000000000000000000000040 :1000C0000000000000000000000000000000000030 :1000D000000000003C0098A20100000000000000A9 :1000E0000000000000000000000000000000000010 :1000F0000000000000000000000000000000000000 :1001000000000000000000000000000000000000EF :100110000000000000003C00D4A20100000000002C :1001200000000000000000000000000000000000CF :1001300000000000000000000000000000000000BF :1001400000000000000000000000000000000000AF :1001500000000000000000003C0010A301000000AF :10016000000000000000000000000000000000008F :10017000000000000000000000000000000000007F :10018000000000000000000000000000000000006F :10019000000000000000000000003C004CA3010033 :1001A000000000000000000000000000000000004F :1001B000000000000000000000000000000000003F :1001C000000000000000000000000000000000002F :1001D0000000000000000000000000003C0088A3B8 :1001E000010000000000000000000000000000000E :1001F00000000000000000000000000000000000FF :1002000000000000000000000000000000000000EE :1002100000000000000000000000000000003C00A2 :10022000C4A3010000000000000000000000000066 :1002300000000000000000000000000000000000BE :1002400000000000000000000000000000000000AE :10025000000000000000000000000000000000009E :100260003C0000A4010000000000000000000000AD :10027000000000000000000000000000000000007E :10028000000000000000000000000000000000006E :10029000000000000000000000000000000000005E :1002A00000003C003CA40100000000000000000031 :1002B000000000000000000000000000000000003E :1002C000000000000000000000000000000000002E :1002D000000000000000000000000000000000001E :1002E000000000003C0078A40100000000000000B5 :1002F00000000000000000000000000000000000FE :1003000000000000000000000000000000000000ED :1003100000000000000000000000000000000000DD :100320000000000000003C00B4A401000000000038 :1003300000000000000000000000000000000000BD :1003400000000000000000000000000000000000AD :10035000000000000000000000000000000000009D :1003600000000000000000003C00F0A401000000BC :10037000000000000000000000000000000000007D :10038000000000000000000000000000000000006D :10039000000000000000000000000000000000005D :1003A000000000000000000000003C002CA501003F :1003B000000000000000000000000000000000003D :1003C000000000000000000000000000000000002D :1003D000000000000000000000000000000000001D :1003E0000000000000000000000000003C0068A5C4 :1003F00001000000000000000000000000000000FC :1004000000000000000000000000000000000000EC :1004100000000000000000000000000000000000DC :1004200000000000000000000000000000003C0090 :10043000A4A5010000000000000000000000000072 :1004400000000000000000000000000000000000AC :10045000000000000000000000000000000000009C :10046000000000000000000000000000000000008C :100470003C00E0A5010000000000000000000000BA :10048000000000000000000000000000000000006C :10049000000000000000000000000000000000005C :1004A000000000000000000000000000000000004C :1004B00000003C001CA6010000000000000000003D :1004C000000000000000000000000000000000002C :1004D000000000000000000000000000000000001C :1004E000000000000000000000000000000000000C :1004F000000000003C0058A60100000000000000C1 :1005000000000000000000000000000000000000EB :1005100000000000000000000000000000000000DB :1005200000000000000000000000000000000000CB :100530000000000000003C0094A601000000000044 :1005400000000000000000000000000000000000AB :10055000000000000000000000000000000000009B :10056000000000000000000000000000000000008B :1005700000000000000000003C00D0A601000000C8 :10058000000000000000000000000000000000006B :10059000000000000000000000000000000000005B :1005A000000000000000000000000000000000004B :1005B000000000000000000000003C000CA701004B :1005C000000000000000000000000000000000002B :1005D000000000000000000000000000000000001B :1005E000000000000000000000000000000000000B :1005F0000000000000000000000000003C0048A7D0 :1006000001000000000000000000000000000000E9 :1006100000000000000000000000000000000000DA :1006200000000000000000000000000000000000CA :1006300000000000000000000000000000003C007E :1006400084A701000000000000000000000000007E :10065000000000000000000000000000000000009A :10066000000000000000000000000000000000008A :10067000000000000000000000000000000000007A :100680003C00C0A7010000000000000000000000C6 :10069000000000000000000000000000000000005A :1006A000000000000000000000000000000000004A :1006B000000000000000000000000000000000003A :1006C00000003C00FCA7010000000000000000004A :1006D000000000000000000000000000000000001A :1006E000000000000000000000000000000000000A :1006F00000000000000000000000000000000000FA :10070000000000003C0038A80100000000000000CC :1007100000000000000000000000000000000000D9 :1007200000000000000000000000000000000000C9 :1007300000000000000000000000000000000000B9 :100740000000000000003C0074A801000000000050 :100750000000000000000000000000000000000099 :100760000000000000000000000000000000000089 :100770000000000000000000000000000000000079 :1007800000000000000000003C00B0A801000000D4 :100790000000000000000000000000000000000059 :1007A0000000000000000000000000000000000049 :1007B0000000000000000000000000000000000039 :1007C000000000000000000000003C00ECA8010058 :1007D0000000000000000000000000000000000019 :1007E0000000000000000000000000000000000009 :1007F00000000000000000000000000000000000F9 :100800000000000000000000000000003C0028A9DB :1008100001000000000000000000000000000000D7 :1008200000000000000000000000000000000000C8 :1008300000000000000000000000000000000000B8 :1008400000000000000000000000000000003C006C :1008500064A901000000000000000000000000008A :100860000000000000000000000000000000000088 :100870000000000000000000000000000000000078 :100880000000000000000000000000000000000068 :100890003C00A0A9010000000000000000000000D2 :1008A0000000000000000000000000000000000048 :1008B0000000000000000000000000000000000038 :1008C0000000000000000000000000000000000028 :1008D00000003C00DCA90100000000000000000056 :1008E0000000000000000000000000000000000008 :1008F00000000000000000000000000000000000F8 :1009000000000000000000000000000000000000E7 :10091000000000003C0018AA0100000000000000D8 :1009200000000000000000000000000000000000C7 :1009300000000000000000000000000000000000B7 :1009400000000000000000000000000000000000A7 :100950000000000000003C0054AA0100000000005C :100960000000000000000000000000000000000087 :100970000000000000000000000000000000000077 :100980000000000000000000000000000000000067 :1009900000000000000000003C0090AA01000000E0 :1009A0000000000000000000000000000000000047 :1009B0000000000000000000000000000000000037 :1009C0000000000000000000000000000000000027 :1009D000000000000000000000003C00CCAA010064 :1009E0000000000000000000000000000000000007 :1009F00000000000000000000000000000000000F7 :100A000000000000000000000000000000000000E6 :100A10000000000000000000000000003C0008ABE7 :100A200001000000000000000000000000000000C5 :100A300000000000000000000000000000000000B6 :100A400000000000000000000000000000000000A6 :100A500000000000000000000000000000003C005A :100A600044AB010000000000000000000000000096 :100A70000000000000000000000000000000000076 :100A80000000000000000000000000000000000066 :100A90000000000000000000000000000000000056 :100AA0003C0080AB010000000000000000000000DE :100AB0000000000000000000000000000000000036 :100AC0000000000000000000000000000000000026 :100AD0000000000000000000000000000000000016 :100AE00000003C00BCAB0100000000000000000062 :100AF00000000000000000000000000000000000F6 :100B000000000000000000000000000000000000E5 :100B100000000000000000000000000000000000D5 :100B2000000000003C00F8AB0100000000000000E5 :100B300000000000000000000000000000000000B5 :100B400000000000000000000000000000000000A5 :100B50000000000000000000000000000000000095 :100B60000000000000003C0034AC01000000000068 :100B70000000000000000000000000000000000075 :100B80000000000000000000000000000000000065 :100B90000000000000000000000000000000000055 :100BA00000000000000000003C0070AC01000000EC :100BB0000000000000000000000000000000000035 :100BC0000000000000000000000000000000000025 :100BD0000000000000000000000000000000000015 :100BE000000000000000000000003C00ACAC010070 :100BF00000000000000000000000000000000000F5 :100C000000000000000000000000000000000000E4 :100C100000000000000000000000000000000000D4 :100C20000000000000000000000000003C00E8ACF4 :100C300001000000000000000000000000000000B3 :100C400000000000000000000000000000000000A4 :100C50000000000000000000000000000000000094 :100C600000000000000000000000000000003C0048 :100C700024AD0100000000000000000000000000A2 :100C80000000000000000000000000000000000064 :100C90000000000000000000000000000000000054 :100CA0000000000000000000000000000000000044 :100CB0003C0060AD010000000000000000000000EA :100CC0000000000000000000000000000000000024 :100CD0000000000000000000000000000000000014 :100CE0000000000000000000000000000000000004 :100CF00000003C009CAD010000000000000000006E :100D000000000000000000000000000000000000E3 :100D100000000000000000000000000000000000D3 :100D200000000000000000000000000000000000C3 :100D3000000000003C00D8AD0100000000000000F1 :100D400000000000000000000000000000000000A3 :100D50000000000000000000000000000000000093 :100D60000000000000000000000000000000000083 :100D70000000000000003C0014AE01000000000074 :100D80000000000000000000000000000000000063 :100D90000000000000000000000000000000000053 :100DA0000000000000000000000000000000000043 :100DB00000000000000000003C0050AE01000000F8 :100DC0000000000000000000000000000000000023 :100DD0000000000000000000000000000000000013 :100DE0000000000000000000000000000000000003 :100DF000000000000000000000003C008CAE01007C :100E000000000000000000000000000000000000E2 :100E100000000000000000000000000000000000D2 :100E200000000000000000000000000000000000C2 :100E30000000000000000000000000003C00C8AE00 :100E400001000000000000000000000000000000A1 :100E50000000000000000000000000000000000092 :100E60000000000000000000000000000000000082 :100E700000000000000000000000000000003C0036 :100E800004AF0100000000000000000000000000AE :100E90000000000000000000000000000000000052 :100EA0000000000000000000000000000000000042 :100EB0000000000000000000000000000000000032 :100EC0003C0040AF010000000000000000000000F6 :100ED0000000000000000000000000000000000012 :100EE0000000000000000000000000000000000002 :100EF00000000000000000000000000000000000F2 :100F000000003C007CAF0100000000000000000079 :100F100000000000000000000000000000000000D1 :100F200000000000000000000000000000000000C1 :100F300000000000000000000000000000000000B1 :100F4000000000003C00B8AF0100000000000000FD :100F50000000000000000000000000000000000091 :100F60000000000000000000000000000000000081 :100F70000000000000000000000000000000000071 :100F80000000000000003C00F4AF01000000000081 :100F90000000000000000000000000000000000051 :100FA0000000000000000000000000000000000041 :100FB0000000000000000000000000000000000031 :100FC00000000000000000003C0030B00100000004 :100FD0000000000000000000000000000000000011 :100FE0000000000000000000000000000000000001 :100FF00000000000000000000000000000000000F1 :10100000000000000000000000003C006CB0010087 :1010100000000000000000000000000000000000D0 :1010200000000000000000000000000000000000C0 :1010300000000000000000000000000000000000B0 :101040000000000000000000000000003C00A8B00C :10105000010000000000000000000000000000008F :101060000000000000000000000000000000000080 :101070000000000000000000000000000000000070 :1010800000000000000000000000000000003C0024 :10109000E4B00100000000000000000000000000BB :1010A0000000000000000000000000000000000040 :1010B0000000000000000000000000000000000030 :1010C0000000000000000000000000000000000020 :1010D0003C0020B101000000000000000000000002 :1010E0000000000000000000000000000000000000 :1010F00000000000000000000000000000000000F0 :1011000000000000000000000000000000000000DF :1011100000003C005CB10100000000000000000085 :1011200000000000000000000000000000000000BF :1011300000000000000000000000000000000000AF :10114000000000000000000000000000000000009F :10115000000000003C0098B1010000000000000009 :10116000000000000000000000000000000000007F :10117000000000000000000000000000000000006F :10118000000000000000000000000000000000005F :101190000000000000003C00D4B10100000000008D :1011A000000000000000000000000000000000003F :1011B000000000000000000000000000000000002F :1011C000000000000000000000000000000000001F :1011D00000000000000000003C0010B20100000010 :1011E00000000000000000000000000000000000FF :1011F00000000000000000000000000000000000EF :1012000000000000000000000000000000000000DE :10121000000000000000000000003C004CB2010093 :1012200000000000000000000000000000000000BE :1012300000000000000000000000000000000000AE :10124000000000000000000000000000000000009E :101250000000000000000000000000003C0088B218 :10126000010000000000000000000000000000007D :10127000000000000000000000000000000000006E :10128000000000000000000000000000000000005E :1012900000000000000000000000000000003C0012 :1012A000C4B20100000000000000000000000000C7 :1012B000000000000000000000000000000000002E :1012C000000000000000000000000000000000001E :1012D000000000000000000000000000000000000E :1012E0003C0000B30100000000000000000000000E :1012F00000000000000000000000000000000000EE :1013000000000000000000000000000000000000DD :1013100000000000000000000000000000000000CD :1013200000003C003CB30100000000000000000091 :1013300000000000000000000000000000000000AD :10134000000000000000000000000000000000009D :10135000000000000000000000000000000000008D :10136000000000003C0078B3010000000000000015 :10137000000000000000000000000000000000006D :10138000000000000000000000000000000000005D :10139000000000000000000000000000000000004D :1013A0000000000000003C00B4B301000000000099 :1013B000000000000000000000000000000000002D :1013C000000000000000000000000000000000001D :1013D000000000000000000000000000000000000D :1013E00000000000000000003C00F0B3010000001D :1013F00000000000000000000000000000000000ED :1014000000000000000000000000000000000000DC :1014100000000000000000000000000000000000CC :10142000000000000000000000003C002CB401009F :1014300000000000000000000000000000000000AC :10144000000000000000000000000000000000009C :10145000000000000000000000000000000000008C :101460000000000000000000000000003C0068B424 :10147000010000000000000000000000000000006B :10148000000000000000000000000000000000005C :10149000000000000000000000000000000000004C :1014A00000000000000000000000000000003C0000 :1014B000A4B40100000000000000000000000000D3 :1014C000000000000000000000000000000000001C :1014D000000000000000000000000000000000000C :1014E00000000000000000000000000000000000FC :1014F0003C00E0B40100000000000000000000001B :1015000000000000000000000000000000000000DB :1015100000000000000000000000000000000000CB :1015200000000000000000000000000000000000BB :1015300000003C001CB5010000000000000000009D :10154000000000000000000000000000000000009B :10155000000000000000000000000000000000008B :10156000000000000000000000000000000000007B :10157000000000003C0058B5010000000000000021 :10158000000000000000000000000000000000005B :10159000000000000000000000000000000000004B :1015A000000000000000000000000000000000003B :1015B0000000000000003C0094B5010000000000A5 :1015C000000000000000000000000000000000001B :1015D000000000000000000000000000000000000B :1015E00000000000000000000000000000000000FB :1015F00000000000000000003C00D0B50100000029 :1016000000000000000000000000000000000000DA :1016100000000000000000000000000000000000CA :1016200000000000000000000000000000000000BA :10163000000000000000000000003C000CB60100AB :10164000000000000000000000000000000000009A :10165000000000000000000000000000000000008A :10166000000000000000000000000000000000007A :101670000000000000000000000000003C0048B630 :101680000100000000000000000000000000000059 :10169000000000000000000000000000000000004A :1016A000000000000000000000000000000000003A :1016B00000000000000000000000000000003C00EE :1016C00084B60100000000000000000000000000DF :1016D000000000000000000000000000000000000A :1016E00000000000000000000000000000000000FA :1016F00000000000000000000000000000000000EA :101700003C00C0B601000000000000000000000026 :1017100000000000000000000000000000000000C9 :1017200000000000000000000000000000000000B9 :1017300000000000000000000000000000000000A9 :1017400000003C00FCB601000000000000000000AA :101750000000000000000000000000000000000089 :101760000000000000000000000000000000000079 :101770000000000000000000000000000000000069 :10178000000000003C0038B701000000000000002D :101790000000000000000000000000000000000049 :1017A0000000000000000000000000000000000039 :1017B0000000000000000000000000000000000029 :1017C0000000000000003C0074B7010000000000B1 :1017D0000000000000000000000000000000000009 :1017E00000000000000000000000000000000000F9 :1017F00000000000000000000000000000000000E9 :1018000000000000000000003C00B0B70100000034 :1018100000000000000000000000000000000000C8 :1018200000000000000000000000000000000000B8 :1018300000000000000000000000000000000000A8 :10184000000000000000000000003C00ECB70100B8 :101850000000000000000000000000000000000088 :101860000000000000000000000000000000000078 :101870000000000000000000000000000000000068 :101880000000000000000000000000003C0028B83C :101890000100000000000000000000000000000047 :1018A0000000000000000000000000000000000038 :1018B0000000000000000000000000000000000028 :1018C00000000000000000000000000000003C00DC :1018D00064B80100000000000000000000000000EB :1018E00000000000000000000000000000000000F8 :1018F00000000000000000000000000000000000E8 :1019000000000000000000000000000000000000D7 :101910003C00A0B801000000000000000000000032 :1019200000000000000000000000000000000000B7 :1019300000000000000000000000000000000000A7 :101940000000000000000000000000000000000097 :1019500000003C00DCB801000000000000000000B6 :101960000000000000000000000000000000000077 :101970000000000000000000000000000000000067 :101980000000000000000000000000000000000057 :10199000000000003C0018B9010000000000000039 :1019A0000000000000000000000000000000000037 :1019B0000000000000000000000000000000000027 :1019C0000000000000000000000000000000000017 :1019D0000000000000003C0054B9010000000000BD :1019E00000000000000000000000000000000000F7 :1019F00000000000000000000000000000000000E7 :101A000000000000000000000000000000000000D6 :101A100000000000000000003C0090B90100000040 :101A200000000000000000000000000000000000B6 :101A300000000000000000000000000000000000A6 :101A40000000000000000000000000000000000096 :101A5000000000000000000000003C00CCB90100C4 :101A60000000000000000000000000000000000076 :101A70000000000000000000000000000000000066 :101A80000000000000000000000000000000000056 :101A90000000000000000000000000003C0008BA48 :101AA0000100000000000000000000000000000035 :101AB0000000000000000000000000000000000026 :101AC0000000000000000000000000000000000016 :101AD00000000000000000000000000000003C00CA :101AE00044BA0100000000000000000000000000F7 :101AF00000000000000000000000000000000000E6 :101B000000000000000000000000000000000000D5 :101B100000000000000000000000000000000000C5 :101B20003C0080BA0100000000000000000000003E :101B300000000000000000000000000000000000A5 :101B40000000000000000000000000000000000095 :101B50000000000000000000000000000000000085 :101B600000003C00BCBA01000000000000000000C2 :101B70000000000000000000000000000000000065 :101B80000000000000000000000000000000000055 :101B90000000000000000000000000000000000045 :101BA000000000003C00F8BA010000000000000046 :101BB0000000000000000000000000000000000025 :101BC0000000000000000000000000000000000015 :101BD0000000000000000000000000000000000005 :101BE0000000000000003C0034BB010000000000C9 :101BF00000000000000000000000000000000000E5 :101C000000000000000000000000000000000000D4 :101C100000000000000000000000000000000000C4 :101C200000000000000000003C0070BB010000004C :101C300000000000000000000000000000000000A4 :101C40000000000000000000000000000000000094 :101C50000000000000000000000000000000000084 :101C6000000000000000000000003C00ACBB0100D0 :101C70000000000000000000000000000000000064 :101C80000000000000000000000000000000000054 :101C90000000000000000000000000000000000044 :101CA0000000000000000000000000003C00E8BB55 :101CB0000100000000000000000000000000000023 :101CC0000000000000000000000000000000000014 :101CD0000000000000000000000000000000000004 :101CE00000000000000000000000000000003C00B8 :101CF00024BC010000000000000000000000000003 :101D000000000000000000000000000000000000D3 :101D100000000000000000000000000000000000C3 :101D200000000000000000000000000000000000B3 :101D30003C0060BC0100000000000000000000004A :101D40000000000000000000000000000000000093 :101D50000000000000000000000000000000000083 :101D60000000000000000000000000000000000073 :101D700000003C009CBC01000000000000000000CE :101D80000000000000000000000000000000000053 :101D90000000000000000000000000000000000043 :101DA0000000000000000000000000000000000033 :101DB000000000003C00D8BC010000000000000052 :101DC0000000000000000000000000000000000013 :101DD0000000000000000000000000000000000003 :101DE00000000000000000000000000000000000F3 :101DF0000000000000003C0014BD010000000000D5 :101E000000000000000000000000000000000000D2 :101E100000000000000000000000000000000000C2 :101E200000000000000000000000000000000000B2 :101E300000000000000000003C0050BD0100000058 :101E40000000000000000000000000000000000092 :101E50000000000000000000000000000000000082 :101E60000000000000000000000000000000000072 :101E7000000000000000000000003C008CBD0100DC :101E80000000000000000000000000000000000052 :101E90000000000000000000000000000000000042 :101EA0000000000000000000000000000000000032 :101EB0000000000000000000000000003C00C8BD61 :101EC0000100000000000000000000000000000011 :101ED0000000000000000000000000000000000002 :101EE00000000000000000000000000000000000F2 :101EF00000000000000000000000000000003C00A6 :101F000004BE01000000000000000000000000000E :101F100000000000000000000000000000000000C1 :101F200000000000000000000000000000000000B1 :101F300000000000000000000000000000000000A1 :101F40003C0040BE01000000000000000000000056 :101F50000000000000000000000000000000000081 :101F60000000000000000000000000000000000071 :101F70000000000000000000000000000000000061 :101F800000003C007CBE01000000000000000000DA :101F90000000000000000000000000000000000041 :101FA0000000000000000000000000000000000031 :101FB0000000000000000000000000000000000021 :101FC000000000003C00B8BE01000000000000005E :101FD0000000000000000000000000000000000001 :101FE00000000000000000000000000000000000F1 :101FF00000000000000000000000000000000000E1 :102000000000000000003C00F4BE010000000000E1 :1020100000000000000000000000000000000000C0 :1020200000000000000000000000000000000000B0 :1020300000000000000000000000000000000000A0 :1020400000000000000000003C0030BF0100000064 :102050000000000000000000000000000000000080 :102060000000000000000000000000000000000070 :102070000000000000000000000000000000000060 :10208000000000000000000000003C006CBF0100E8 :102090000000000000000000000000000000000040 :1020A0000000000000000000000000000000000030 :1020B0000000000000000000000000000000000020 :1020C0000000000000000000000000003C00A8BF6D :1020D00001000000000000000000000000000000FF :1020E00000000000000000000000000000000000F0 :1020F00000000000000000000000000000000000E0 :1021000000000000000000000000000000003C0093 :10211000E4BF01000000000000000000000000001B :1021200000000000000000000000000000000000AF :10213000000000000000000000000000000000009F :10214000000000000000000000000000000000008F :102150003C0020C001000000000000000000000062 :10216000000000000000000000000000000000006F :10217000000000000000000000000000000000005F :10218000000000000000000000000000000000004F :1021900000003C005CC001000000000000000000E6 :1021A000000000000000000000000000000000002F :1021B000000000000000000000000000000000001F :1021C000000000000000000000000000000000000F :1021D000000000003C0098C001000000000000006A :1021E00000000000000000000000000000000000EF :1021F00000000000000000000000000000000000DF :1022000000000000000000000000000000000000CE :102210000000000000003C00D4C0010000000000ED :1022200000000000000000000000000000000000AE :10223000000000000000000000000000000000009E :10224000000000000000000000000000000000008E :1022500000000000000000003C0010C10100000070 :10226000000000000000000000000000000000006E :10227000000000000000000000000000000000005E :10228000000000000000000000000000000000004E :10229000000000000000000000003C004CC10100F4 :1022A000000000000000000000000000000000002E :1022B000000000000000000000000000000000001E :1022C000000000000000000000000000000000000E :1022D0000000000000000000000000003C0088C179 :1022E00001000000000000000000000000000000ED :1022F00000000000000000000000000000000000DE :1023000000000000000000000000000000000000CD :1023100000000000000000000000000000003C0081 :10232000C4C1010000000000000000000000000027 :10233000000000000000000000000000000000009D :10234000000000000000000000000000000000008D :10235000000000000000000000000000000000007D :102360003C0000C20100000000000000000000006E :10237000000000000000000000000000000000005D :10238000000000000000000000000000000000004D :10239000000000000000000000000000000000003D :1023A00000003C003CC201000000000000000000F2 :1023B000000000000000000000000000000000001D :1023C000000000000000000000000000000000000D :1023D00000000000000000000000000000000000FD :1023E000000000003C0078C2010000000000000076 :1023F00000000000000000000000000000000000DD :1024000000000000000000000000000000000000CC :1024100000000000000000000000000000000000BC :102420000000000000003C00B4C2010000000000F9 :10243000000000000000000000000000000000009C :10244000000000000000000000000000000000008C :10245000000000000000000000000000000000007C :1024600000000000000000003C00F0C2010000007D :10247000000000000000000000000000000000005C :10248000000000000000000000000000000000004C :10249000000000000000000000000000000000003C :1024A000000000000000000000003C002CC3010000 :1024B000000000000000000000000000000000001C :1024C000000000000000000000000000000000000C :1024D00000000000000000000000000000000000FC :1024E0000000000000000000000000003C0068C385 :1024F00001000000000000000000000000000000DB :1025000000000000000000000000000000000000CB :1025100000000000000000000000000000000000BB :1025200000000000000000000000000000003C006F :10253000A4C3010000000000000000000000000033 :10254000000000000000000000000000000000008B :10255000000000000000000000000000000000007B :10256000000000000000000000000000000000006B :102570003C00E0C30100000000000000000000007B :10258000000000000000000000000000000000004B :10259000000000000000000000000000000000003B :1025A000000000000000000000000000000000002B :1025B00000003C001CC401000000000000000000FE :1025C000000000000000000000000000000000000B :1025D00000000000000000000000000000000000FB :1025E00000000000000000000000000000000000EB :1025F000000000003C0058C4010000000000000082 :1026000000000000000000000000000000000000CA :1026100000000000000000000000000000000000BA :1026200000000000000000000000000000000000AA :102630000000000000003C0094C401000000000005 :10264000000000000000000000000000000000008A :10265000000000000000000000000000000000007A :10266000000000000000000000000000000000006A :1026700000000000000000003C00D0C40100000089 :10268000000000000000000000000000000000004A :10269000000000000000000000000000000000003A :1026A000000000000000000000000000000000002A :1026B000000000000000000000003C000CC501000C :1026C000000000000000000000000000000000000A :1026D00000000000000000000000000000000000FA :1026E00000000000000000000000000000000000EA :1026F0000000000000000000000000003C0048C591 :1027000001000000000000000000000000000000C8 :1027100000000000000000000000000000000000B9 :1027200000000000000000000000000000000000A9 :1027300000000000000000000000000000003C005D :1027400084C501000000000000000000000000003F :102750000000000000000000000000000000000079 :102760000000000000000000000000000000000069 :102770000000000000000000000000000000000059 :102780003C00C0C501000000000000000000000087 :102790000000000000000000000000000000000039 :1027A0000000000000000000000000000000000029 :1027B0000000000000000000000000000000000019 :1027C00000003C00FCC5010000000000000000000B :1027D00000000000000000000000000000000000F9 :1027E00000000000000000000000000000000000E9 :1027F00000000000000000000000000000000000D9 :10280000000000003C0038C601000000000000008D :1028100000000000000000000000000000000000B8 :1028200000000000000000000000000000000000A8 :102830000000000000000000000000000000000098 :102840000000000000003C0074C601000000000011 :102850000000000000000000000000000000000078 :102860000000000000000000000000000000000068 :102870000000000000000000000000000000000058 :1028800000000000000000003C00B0C60100000095 :102890000000000000000000000000000000000038 :1028A0000000000000000000000000000000000028 :1028B0000000000000000000000000000000000018 :1028C000000000000000000000003C00ECC6010019 :1028D00000000000000000000000000000000000F8 :1028E00000000000000000000000000000000000E8 :1028F00000000000000000000000000000000000D8 :102900000000000000000000000000003C0028C79C :1029100001000000000000000000000000000000B6 :1029200000000000000000000000000000000000A7 :102930000000000000000000000000000000000097 :1029400000000000000000000000000000003C004B :1029500064C701000000000000000000000000004B :102960000000000000000000000000000000000067 :102970000000000000000000000000000000000057 :102980000000000000000000000000000000000047 :102990003C00A0C701000000000000000000000093 :1029A0000000000000000000000000000000000027 :1029B0000000000000000000000000000000000017 :1029C0000000000000000000000000000000000007 :1029D00000003C00DCC70100000000000000000017 :1029E00000000000000000000000000000000000E7 :1029F00000000000000000000000000000000000D7 :102A000000000000000000000000000000000000C6 :102A1000000000003C0018C8010000000000000099 :102A200000000000000000000000000000000000A6 :102A30000000000000000000000000000000000096 :102A40000000000000000000000000000000000086 :102A50000000000000003C0054C80100000000001D :102A60000000000000000000000000000000000066 :102A70000000000000000000000000000000000056 :102A80000000000000000000000000000000000046 :102A900000000000000000003C0090C801000000A1 :102AA0000000000000000000000000000000000026 :102AB0000000000000000000000000000000000016 :102AC0000000000000000000000000000000000006 :102AD000000000000000000000003C00CCC8010025 :102AE00000000000000000000000000000000000E6 :102AF00000000000000000000000000000000000D6 :102B000000000000000000000000000000000000C5 :102B10000000000000000000000000003C0008C9A8 :102B200001000000000000000000000000000000A4 :102B30000000000000000000000000000000000095 :102B40000000000000000000000000000000000085 :102B500000000000000000000000000000003C0039 :102B600044C9010000000000000000000000000057 :102B70000000000000000000000000000000000055 :102B80000000000000000000000000000000000045 :102B90000000000000000000000000000000000035 :102BA0003C0080C90100000000000000000000009F :102BB0000000000000000000000000000000000015 :102BC0000000000000000000000000000000000005 :102BD00000000000000000000000000000000000F5 :102BE00000003C00BCC90100000000000000000023 :102BF00000000000000000000000000000000000D5 :102C000000000000000000000000000000000000C4 :102C100000000000000000000000000000000000B4 :102C2000000000003C00F8C90100000000000000A6 :102C30000000000000000000000000000000000094 :102C40000000000000000000000000000000000084 :102C50000000000000000000000000000000000074 :102C60000000000000003C0034CA01000000000029 :102C70000000000000000000000000000000000054 :102C80000000000000000000000000000000000044 :102C90000000000000000000000000000000000034 :102CA00000000000000000003C0070CA01000000AD :102CB0000000000000000000000000000000000014 :102CC0000000000000000000000000000000000004 :102CD00000000000000000000000000000000000F4 :102CE000000000000000000000003C00ACCA010031 :102CF00000000000000000000000000000000000D4 :102D000000000000000000000000000000000000C3 :102D100000000000000000000000000000000000B3 :102D20000000000000000000000000003C00E8CAB5 :102D30000100000000000000000000000000000092 :102D40000000000000000000000000000000000083 :102D50000000000000000000000000000000000073 :102D600000000000000000000000000000003C0027 :102D700024CB010000000000000000000000000063 :102D80000000000000000000000000000000000043 :102D90000000000000000000000000000000000033 :102DA0000000000000000000000000000000000023 :102DB0003C0060CB010000000000000000000000AB :102DC0000000000000000000000000000000000003 :102DD00000000000000000000000000000000000F3 :102DE00000000000000000000000000000000000E3 :102DF00000003C009CCB010000000000000000002F :102E000000000000000000000000000000000000C2 :102E100000000000000000000000000000000000B2 :102E200000000000000000000000000000000000A2 :102E3000000000003C00D8CB0100000000000000B2 :102E40000000000000000000000000000000000082 :102E50000000000000000000000000000000000072 :102E60000000000000000000000000000000000062 :102E70000000000000003C0014CC01000000000035 :102E80000000000000000000000000000000000042 :102E90000000000000000000000000000000000032 :102EA0000000000000000000000000000000000022 :102EB00000000000000000003C0050CC01000000B9 :102EC0000000000000000000000000000000000002 :102ED00000000000000000000000000000000000F2 :102EE00000000000000000000000000000000000E2 :102EF000000000000000000000003C008CCC01003D :102F000000000000000000000000000000000000C1 :102F100000000000000000000000000000000000B1 :102F200000000000000000000000000000000000A1 :102F30000000000000000000000000003C00C8CCC1 :102F40000100000000000000000000000000000080 :102F50000000000000000000000000000000000071 :102F60000000000000000000000000000000000061 :102F700000000000000000000000000000003C0015 :102F800004CD01000000000000000000000000006F :102F90000000000000000000000000000000000031 :102FA0000000000000000000000000000000000021 :102FB0000000000000000000000000000000000011 :102FC0003C0040CD010000000000000000000000B7 :102FD00000000000000000000000000000000000F1 :102FE00000000000000000000000000000000000E1 :102FF00000000000000000000000000000000000D1 :1030000000003C007CCD010000000000000000003A :1030100000000000000000000000000000000000B0 :1030200000000000000000000000000000000000A0 :103030000000000000000000000000000000000090 :10304000000000003C00B8CD0100000000000000BE :103050000000000000000000000000000000000070 :103060000000000000000000000000000000000060 :103070000000000000000000000000000000000050 :103080000000000000003C00F4CD01000000000042 :103090000000000000000000000000000000000030 :1030A0000000000000000000000000000000000020 :1030B0000000000000000000000000000000000010 :1030C00000000000000000003C0030CE01000000C5 :1030D00000000000000000000000000000000000F0 :1030E00000000000000000000000000000000000E0 :1030F00000000000000000000000000000000000D0 :10310000000000000000000000003C006CCE010048 :1031100000000000000000000000000000000000AF :10312000000000000000000000000000000000009F :10313000000000000000000000000000000000008F :103140000000000000000000000000003C00A8CECD :10315000010000000000000000000000000000006E :10316000000000000000000000000000000000005F :10317000000000000000000000000000000000004F :1031800000000000000000000000000000003C0003 :10319000E4CE01000000000000000000000000007C :1031A000000000000000000000000000000000001F :1031B000000000000000000000000000000000000F :1031C00000000000000000000000000000000000FF :1031D0003C0020CF010000000000000000000000C3 :1031E00000000000000000000000000000000000DF :1031F00000000000000000000000000000000000CF :1032000000000000000000000000000000000000BE :1032100000003C005CCF0100000000000000000046 :10322000000000000000000000000000000000009E :10323000000000000000000000000000000000008E :10324000000000000000000000000000000000007E :10325000000000003C0098CF0100000000000000CA :10326000000000000000000000000000000000005E :10327000000000000000000000000000000000004E :10328000000000000000000000000000000000003E :103290000000000000003C00D4CF0100000000004E :1032A000000000000000000000000000000000001E :1032B000000000000000000000000000000000000E :1032C00000000000000000000000000000000000FE :1032D00000000000000000003C0010D001000000D1 :1032E00000000000000000000000000000000000DE :1032F00000000000000000000000000000000000CE :1033000000000000000000000000000000000000BD :10331000000000000000000000003C004CD0010054 :10332000000000000000000000000000000000009D :10333000000000000000000000000000000000008D :10334000000000000000000000000000000000007D :103350000000000000000000000000003C0088D0D9 :10336000010000000000000000000000000000005C :10337000000000000000000000000000000000004D :10338000000000000000000000000000000000003D :1033900000000000000000000000000000003C00F1 :1033A000C4D0010000000000000000000000000088 :1033B000000000000000000000000000000000000D :1033C00000000000000000000000000000000000FD :1033D00000000000000000000000000000000000ED :1033E0003C0000D1010000000000000000000000CF :1033F00000000000000000000000000000000000CD :1034000000000000000000000000000000000000BC :1034100000000000000000000000000000000000AC :1034200000003C003CD10100000000000000000052 :10343000000000000000000000000000000000008C :10344000000000000000000000000000000000007C :10345000000000000000000000000000000000006C :10346000000000003C0078D10100000000000000D6 :10347000000000000000000000000000000000004C :10348000000000000000000000000000000000003C :10349000000000000000000000000000000000002C :1034A0000000000000003C00B4D10100000000005A :1034B000000000000000000000000000000000000C :1034C00000000000000000000000000000000000FC :1034D00000000000000000000000000000000000EC :1034E00000000000000000003C00F0D101000000DE :1034F00000000000000000000000000000000000CC :1035000000000000000000000000000000000000BB :1035100000000000000000000000000000000000AB :10352000000000000000000000003C002CD2010060 :10353000000000000000000000000000000000008B :10354000000000000000000000000000000000007B :10355000000000000000000000000000000000006B :103560000000000000000000000000003C0068D2E5 :10357000010000000000000000000000000000004A :10358000000000000000000000000000000000003B :10359000000000000000000000000000000000002B :1035A00000000000000000000000000000003C00DF :1035B000A4D2010000000000000000000000000094 :1035C00000000000000000000000000000000000FB :1035D00000000000000000000000000000000000EB :1035E00000000000000000000000000000000000DB :1035F0003C00E0D2010000000000000000000000DC :1036000000000000000000000000000000000000BA :1036100000000000000000000000000000000000AA :10362000000000000000000000000000000000009A :1036300000003C001CD3010000000000000000005E :10364000000000000000000000000000000000007A :10365000000000000000000000000000000000006A :10366000000000000000000000000000000000005A :10367000000000003C0058D30100000000000000E2 :10368000000000000000000000000000000000003A :10369000000000000000000000000000000000002A :1036A000000000000000000000000000000000001A :1036B0000000000000003C0094D301000000000066 :1036C00000000000000000000000000000000000FA :1036D00000000000000000000000000000000000EA :1036E00000000000000000000000000000000000DA :1036F00000000000000000003C00D0D301000000EA :1037000000000000000000000000000000000000B9 :1037100000000000000000000000000000000000A9 :103720000000000000000000000000000000000099 :10373000000000000000000000003C000CD401006C :103740000000000000000000000000000000000079 :103750000000000000000000000000000000000069 :103760000000000000000000000000000000000059 :103770000000000000000000000000003C0048D4F1 :103780000100000000000000000000000000000038 :103790000000000000000000000000000000000029 :1037A0000000000000000000000000000000000019 :1037B00000000000000000000000000000003C00CD :1037C00084D40100000000000000000000000000A0 :1037D00000000000000000000000000000000000E9 :1037E00000000000000000000000000000000000D9 :1037F00000000000000000000000000000000000C9 :103800003C00C0D4010000000000000000000000E7 :1038100000000000000000000000000000000000A8 :103820000000000000000000000000000000000098 :103830000000000000000000000000000000000088 :1038400000003C00FCD4010000000000000000006B :103850000000000000000000000000000000000068 :103860000000000000000000000000000000000058 :103870000000000000000000000000000000000048 :10388000000000003C0038D50100000000000000EE :103890000000000000000000000000000000000028 :1038A0000000000000000000000000000000000018 :1038B0000000000000000000000000000000000008 :1038C0000000000000003C0074D501000000000072 :1038D00000000000000000000000000000000000E8 :1038E00000000000000000000000000000000000D8 :1038F00000000000000000000000000000000000C8 :1039000000000000000000003C00B0D501000000F5 :1039100000000000000000000000000000000000A7 :103920000000000000000000000000000000000097 :103930000000000000000000000000000000000087 :10394000000000000000000000003C00ECD5010079 :103950000000000000000000000000000000000067 :103960000000000000000000000000000000000057 :103970000000000000000000000000000000000047 :103980000000000000000000000000003C0028D6FD :103990000100000000000000000000000000000026 :1039A0000000000000000000000000000000000017 :1039B0000000000000000000000000000000000007 :1039C00000000000000000000000000000003C00BB :1039D00064D60100000000000000000000000000AC :1039E00000000000000000000000000000000000D7 :1039F00000000000000000000000000000000000C7 :103A000000000000000000000000000000000000B6 :103A10003C00A0D6010000000000000000000000F3 :103A20000000000000000000000000000000000096 :103A30000000000000000000000000000000000086 :103A40000000000000000000000000000000000076 :103A500000003C00DCD60100000000000000000077 :103A60000000000000000000000000000000000056 :103A70000000000000000000000000000000000046 :103A80000000000000000000000000000000000036 :103A9000000000003C0018D70100000000000000FA :103AA0000000000000000000000000000000000016 :103AB0000000000000000000000000000000000006 :103AC00000000000000000000000000000000000F6 :103AD0000000000000003C0054D70100000000007E :103AE00000000000000000000000000000000000D6 :103AF00000000000000000000000000000000000C6 :103B000000000000000000000000000000000000B5 :103B100000000000000000003C0090D70100000001 :103B20000000000000000000000000000000000095 :103B30000000000000000000000000000000000085 :103B40000000000000000000000000000000000075 :103B5000000000000000000000003C00CCD7010085 :103B60000000000000000000000000000000000055 :103B70000000000000000000000000000000000045 :103B80000000000000000000000000000000000035 :103B90000000000000000000000000003C0008D809 :103BA0000100000000000000000000000000000014 :103BB0000000000000000000000000000000000005 :103BC00000000000000000000000000000000000F5 :103BD00000000000000000000000000000003C00A9 :103BE00044D80100000000000000000000000000B8 :103BF00000000000000000000000000000000000C5 :103C000000000000000000000000000000000000B4 :103C100000000000000000000000000000000000A4 :103C20003C0080D8010000000000000000000000FF :103C30000000000000000000000000000000000084 :103C40000000000000000000000000000000000074 :103C50000000000000000000000000000000000064 :103C600000003C00BCD80100000000000000000083 :103C70000000000000000000000000000000000044 :103C80000000000000000000000000000000000034 :103C90000000000000000000000000000000000024 :103CA000000000003C00F8D8010000000000000007 :103CB0000000000000000000000000000000000004 :103CC00000000000000000000000000000000000F4 :103CD00000000000000000000000000000000000E4 :103CE0000000000000003C0034D90100000000008A :103CF00000000000000000000000000000000000C4 :103D000000000000000000000000000000000000B3 :103D100000000000000000000000000000000000A3 :103D200000000000000000003C0070D9010000000D :103D30000000000000000000000000000000000083 :103D40000000000000000000000000000000000073 :103D50000000000000000000000000000000000063 :103D6000000000000000000000003C00ACD9010091 :103D70000000000000000000000000000000000043 :103D80000000000000000000000000000000000033 :103D90000000000000000000000000000000000023 :103DA0000000000000000000000000003C00E8D916 :103DB0000100000000000000000000000000000002 :103DC00000000000000000000000000000000000F3 :103DD00000000000000000000000000000000000E3 :103DE00000000000000000000000000000003C0097 :103DF00024DA0100000000000000000000000000C4 :103E000000000000000000000000000000000000B2 :103E100000000000000000000000000000000000A2 :103E20000000000000000000000000000000000092 :103E30003C0060DA0100000000000000000000000B :103E40000000000000000000000000000000000072 :103E50000000000000000000000000000000000062 :103E60000000000000000000000000000000000052 :103E700000003C009CDA010000000000000000008F :103E80000000000000000000000000000000000032 :103E90000000000000000000000000000000000022 :103EA0000000000000000000000000000000000012 :103EB000000000003C00D8DA010000000000000013 :103EC00000000000000000000000000000000000F2 :103ED00000000000000000000000000000000000E2 :103EE00000000000000000000000000000000000D2 :103EF0000000000000003C0014DB01000000000096 :103F000000000000000000000000000000000000B1 :103F100000000000000000000000000000000000A1 :103F20000000000000000000000000000000000091 :103F300000000000000000003C0050DB0100000019 :103F40000000000000000000000000000000000071 :103F50000000000000000000000000000000000061 :103F60000000000000000000000000000000000051 :103F7000000000000000000000003C008CDB01009D :103F80000000000000000000000000000000000031 :103F90000000000000000000000000000000000021 :103FA0000000000000000000000000000000000011 :103FB0000000000000000000000000003C00C8DB22 :103FC00001000000000000000000000000000000F0 :103FD00000000000000000000000000000000000E1 :103FE00000000000000000000000000000000000D1 :103FF00000000000000000000000000000003C0085 :1040000004DC0100000000000000000000000000CF :1040100000000000000000000000000000000000A0 :104020000000000000000000000000000000000090 :104030000000000000000000000000000000000080 :104040003C0040DC01000000000000000000000017 :104050000000000000000000000000000000000060 :104060000000000000000000000000000000000050 :104070000000000000000000000000000000000040 :1040800000003C007CDC010000000000000000009B :104090000000000000000000000000000000000020 :1040A0000000000000000000000000000000000010 :1040B0000000000000000000000000000000000000 :1040C000000000003C00B8DC01000000000000001F :1040D00000000000000000000000000000000000E0 :1040E00000000000000000000000000000000000D0 :1040F00000000000000000000000000000000000C0 :104100000000000000003C00F4DC010000000000A2 :10411000000000000000000000000000000000009F :10412000000000000000000000000000000000008F :10413000000000000000000000000000000000007F :1041400000000000000000003C0030DD0100000025 :10415000000000000000000000000000000000005F :10416000000000000000000000000000000000004F :10417000000000000000000000000000000000003F :10418000000000000000000000003C006CDD0100A9 :10419000000000000000000000000000000000001F :1041A000000000000000000000000000000000000F :1041B00000000000000000000000000000000000FF :1041C0000000000000000000000000003C00A8DD2E :1041D00001000000000000000000000000000000DE :1041E00000000000000000000000000000000000CF :1041F00000000000000000000000000000000000BF :1042000000000000000000000000000000003C0072 :10421000E4DD0100000000000000000000000000DC :10422000000000000000000000000000000000008E :10423000000000000000000000000000000000007E :10424000000000000000000000000000000000006E :104250003C0020DE01000000000000000000000023 :10426000000000000000000000000000000000004E :10427000000000000000000000000000000000003E :10428000000000000000000000000000000000002E :1042900000003C005CDE01000000000000000000A7 :1042A000000000000000000000000000000000000E :1042B00000000000000000000000000000000000FE :1042C00000000000000000000000000000000000EE :1042D000000000003C0098DE01000000000000002B :1042E00000000000000000000000000000000000CE :1042F00000000000000000000000000000000000BE :1043000000000000000000000000000000000000AD :104310000000000000003C00D4DE010000000000AE :10432000000000000000000000000000000000008D :10433000000000000000000000000000000000007D :10434000000000000000000000000000000000006D :1043500000000000000000003C0010DF0100000031 :10436000000000000000000000000000000000004D :10437000000000000000000000000000000000003D :10438000000000000000000000000000000000002D :10439000000000000000000000003C004CDF0100B5 :1043A000000000000000000000000000000000000D :1043B00000000000000000000000000000000000FD :1043C00000000000000000000000000000000000ED :1043D0000000000000000000000000003C0088DF3A :1043E00001000000000000000000000000000000CC :1043F00000000000000000000000000000000000BD :1044000000000000000000000000000000000000AC :1044100000000000000000000000000000003C0060 :10442000C4DF0100000000000000000000000000E8 :10443000000000000000000000000000000000007C :10444000000000000000000000000000000000006C :10445000000000000000000000000000000000005C :104460003C0000E00100000000000000000000002F :10447000000000000000000000000000000000003C :10448000000000000000000000000000000000002C :10449000000000000000000000000000000000001C :1044A00000003C003CE001000000000000000000B3 :1044B00000000000000000000000000000000000FC :1044C00000000000000000000000000000000000EC :1044D00000000000000000000000000000000000DC :1044E000000000003C0078E0010000000000000037 :1044F00000000000000000000000000000000000BC :1045000000000000000000000000000000000000AB :10451000000000000000000000000000000000009B :104520000000000000003C00B4E0010000000000BA :10453000000000000000000000000000000000007B :10454000000000000000000000000000000000006B :10455000000000000000000000000000000000005B :1045600000000000000000003C00F0E0010000003E :10457000000000000000000000000000000000003B :10458000000000000000000000000000000000002B :10459000000000000000000000000000000000001B :1045A000000000000000000000003C002CE10100C1 :1045B00000000000000000000000000000000000FB :1045C00000000000000000000000000000000000EB :1045D00000000000000000000000000000000000DB :1045E0000000000000000000000000003C0068E146 :1045F00001000000000000000000000000000000BA :1046000000000000000000000000000000000000AA :10461000000000000000000000000000000000009A :1046200000000000000000000000000000003C004E :10463000A4E10100000000000000000000000000F4 :10464000000000000000000000000000000000006A :10465000000000000000000000000000000000005A :10466000000000000000000000000000000000004A :104670003C00E0E10100000000000000000000003C :10468000000000000000000000000000000000002A :10469000000000000000000000000000000000001A :1046A000000000000000000000000000000000000A :1046B00000003C001CE201000000000000000000BF :1046C00000000000000000000000000000000000EA :1046D00000000000000000000000000000000000DA :1046E00000000000000000000000000000000000CA :1046F000000000003C0058E2010000000000000043 :1047000000000000000000000000000000000000A9 :104710000000000000000000000000000000000099 :104720000000000000000000000000000000000089 :104730000000000000003C0094E2010000000000C6 :104740000000000000000000000000000000000069 :104750000000000000000000000000000000000059 :104760000000000000000000000000000000000049 :1047700000000000000000003C00D0E2010000004A :104780000000000000000000000000000000000029 :104790000000000000000000000000000000000019 :1047A0000000000000000000000000000000000009 :1047B000000000000000000000003C000CE30100CD :1047C00000000000000000000000000000000000E9 :1047D00000000000000000000000000000000000D9 :1047E00000000000000000000000000000000000C9 :1047F0000000000000000000000000003C0048E352 :1048000001000000000000000000000000000000A7 :104810000000000000000000000000000000000098 :104820000000000000000000000000000000000088 :1048300000000000000000000000000000003C003C :1048400084E3010000000000000000000000000000 :104850000000000000000000000000000000000058 :104860000000000000000000000000000000000048 :104870000000000000000000000000000000000038 :104880003C00C0E301000000000000000000000048 :104890000000000000000000000000000000000018 :1048A0000000000000000000000000000000000008 :1048B00000000000000000000000000000000000F8 :1048C00000003C00FCE301000000000000000000CC :1048D00000000000000000000000000000000000D8 :1048E00000000000000000000000000000000000C8 :1048F00000000000000000000000000000000000B8 :10490000000000003C0038E401000000000000004E :104910000000000000000000000000000000000097 :104920000000000000000000000000000000000087 :104930000000000000000000000000000000000077 :104940000000000000003C0074E4010000000000D2 :104950000000000000000000000000000000000057 :104960000000000000000000000000000000000047 :104970000000000000000000000000000000000037 :1049800000000000000000003C00B0E40100000056 :104990000000000000000000000000000000000017 :1049A0000000000000000000000000000000000007 :1049B00000000000000000000000000000000000F7 :1049C000000000000000000000003C00ECE40100DA :1049D00000000000000000000000000000000000D7 :1049E00000000000000000000000000000000000C7 :1049F00000000000000000000000000000000000B7 :104A00000000000000000000000000003C0028E55D :104A10000100000000000000000000000000000095 :104A20000000000000000000000000000000000086 :104A30000000000000000000000000000000000076 :104A400000000000000000000000000000003C002A :104A500064E501000000000000000000000000000C :104A60000000000000000000000000000000000046 :104A70000000000000000000000000000000000036 :104A80000000000000000000000000000000000026 :104A90003C00A0E501000000000000000000000054 :104AA0000000000000000000000000000000000006 :104AB00000000000000000000000000000000000F6 :104AC00000000000000000000000000000000000E6 :104AD00000003C00DCE501000000000000000000D8 :104AE00000000000000000000000000000000000C6 :104AF00000000000000000000000000000000000B6 :104B000000000000000000000000000000000000A5 :104B1000000000003C0018E601000000000000005A :104B20000000000000000000000000000000000085 :104B30000000000000000000000000000000000075 :104B40000000000000000000000000000000000065 :104B50000000000000003C0054E6010000000000DE :104B60000000000000000000000000000000000045 :104B70000000000000000000000000000000000035 :104B80000000000000000000000000000000000025 :104B900000000000000000003C0090E60100000062 :104BA0000000000000000000000000000000000005 :104BB00000000000000000000000000000000000F5 :104BC00000000000000000000000000000000000E5 :104BD000000000000000000000003C00CCE60100E6 :104BE00000000000000000000000000000000000C5 :104BF00000000000000000000000000000000000B5 :104C000000000000000000000000000000000000A4 :104C10000000000000000000000000003C0008E769 :104C20000100000000000000000000000000000083 :104C30000000000000000000000000000000000074 :104C40000000000000000000000000000000000064 :104C500000000000000000000000000000003C0018 :104C600044E7010000000000000000000000000018 :104C70000000000000000000000000000000000034 :104C80000000000000000000000000000000000024 :104C90000000000000000000000000000000000014 :104CA0003C0080E701000000000000000000000060 :104CB00000000000000000000000000000000000F4 :104CC00000000000000000000000000000000000E4 :104CD00000000000000000000000000000000000D4 :104CE00000003C00BCE701000000000000000000E4 :104CF00000000000000000000000000000000000B4 :104D000000000000000000000000000000000000A3 :104D10000000000000000000000000000000000093 :104D2000000000003C00F8E7010000000000000067 :104D30000000000000000000000000000000000073 :104D40000000000000000000000000000000000063 :104D50000000000000000000000000000000000053 :104D60000000000000003C0034E8010000000000EA :104D70000000000000000000000000000000000033 :104D80000000000000000000000000000000000023 :104D90000000000000000000000000000000000013 :104DA00000000000000000003C0070E8010000006E :104DB00000000000000000000000000000000000F3 :104DC00000000000000000000000000000000000E3 :104DD00000000000000000000000000000000000D3 :104DE000000000000000000000003C00ACE80100F2 :104DF00000000000000000000000000000000000B3 :104E000000000000000000000000000000000000A2 :104E10000000000000000000000000000000000092 :104E20000000000000000000000000003C00E8E876 :104E30000100000000000000000000000000000071 :104E40000000000000000000000000000000000062 :104E50000000000000000000000000000000000052 :104E600000000000000000000000000000003C0006 :104E700024E9010000000000000000000000000024 :104E80000000000000000000000000000000000022 :104E90000000000000000000000000000000000012 :104EA0000000000000000000000000000000000002 :104EB0003C0060E90100000000000000000000006C :104EC00000000000000000000000000000000000E2 :104ED00000000000000000000000000000000000D2 :104EE00000000000000000000000000000000000C2 :104EF00000003C009CE901000000000000000000F0 :104F000000000000000000000000000000000000A1 :104F10000000000000000000000000000000000091 :104F20000000000000000000000000000000000081 :104F3000000000003C00D8E9010000000000000073 :104F40000000000000000000000000000000000061 :104F50000000000000000000000000000000000051 :104F60000000000000000000000000000000000041 :104F70000000000000003C0014EA010000000000F6 :104F80000000000000000000000000000000000021 :104F90000000000000000000000000000000000011 :104FA0000000000000000000000000000000000001 :104FB00000000000000000003C0050EA010000007A :104FC00000000000000000000000000000000000E1 :104FD00000000000000000000000000000000000D1 :104FE00000000000000000000000000000000000C1 :104FF000000000000000000000003C008CEA0100FE :1050000000000000000000000000000000000000A0 :105010000000000000000000000000000000000090 :105020000000000000000000000000000000000080 :105030000000000000000000000000003C00C8EA82 :10504000010000000000000000000000000000005F :105050000000000000000000000000000000000050 :105060000000000000000000000000000000000040 :1050700000000000000000000000000000003C00F4 :1050800004EB010000000000000000000000000030 :105090000000000000000000000000000000000010 :1050A0000000000000000000000000000000000000 :1050B00000000000000000000000000000000000F0 :1050C0003C0040EB01000000000000000000000078 :1050D00000000000000000000000000000000000D0 :1050E00000000000000000000000000000000000C0 :1050F00000000000000000000000000000000000B0 :1051000000003C007CEB01000000000000000000FB :10511000000000000000000000000000000000008F :10512000000000000000000000000000000000007F :10513000000000000000000000000000000000006F :10514000000000003C00B8EB01000000000000007F :10515000000000000000000000000000000000004F :10516000000000000000000000000000000000003F :10517000000000000000000000000000000000002F :105180000000000000003C00F4EB01000000000003 :10519000000000000000000000000000000000000F :1051A00000000000000000000000000000000000FF :1051B00000000000000000000000000000000000EF :1051C00000000000000000003C0030EC0100000086 :1051D00000000000000000000000000000000000CF :1051E00000000000000000000000000000000000BF :1051F00000000000000000000000000000000000AF :10520000000000000000000000003C006CEC010009 :10521000000000000000000000000000000000008E :10522000000000000000000000000000000000007E :10523000000000000000000000000000000000006E :105240000000000000000000000000003C00A8EC8E :10525000010000000000000000000000000000004D :10526000000000000000000000000000000000003E :10527000000000000000000000000000000000002E :1052800000000000000000000000000000003C00E2 :10529000E4EC01000000000000000000000000003D :1052A00000000000000000000000000000000000FE :1052B00000000000000000000000000000000000EE :1052C00000000000000000000000000000000000DE :1052D0003C0020ED01000000000000000000000084 :1052E00000000000000000000000000000000000BE :1052F00000000000000000000000000000000000AE :10530000000000000000000000000000000000009D :1053100000003C005CED0100000000000000000007 :10532000000000000000000000000000000000007D :10533000000000000000000000000000000000006D :10534000000000000000000000000000000000005D :10535000000000003C0098ED01000000000000008B :10536000000000000000000000000000000000003D :10537000000000000000000000000000000000002D :10538000000000000000000000000000000000001D :105390000000000000003C00D4ED0100000000000F :1053A00000000000000000000000000000000000FD :1053B00000000000000000000000000000000000ED :1053C00000000000000000000000000000000000DD :1053D00000000000000000003C0010EE0100000092 :1053E00000000000000000000000000000000000BD :1053F00000000000000000000000000000000000AD :10540000000000000000000000000000000000009C :10541000000000000000000000003C004CEE010015 :10542000000000000000000000000000000000007C :10543000000000000000000000000000000000006C :10544000000000000000000000000000000000005C :105450000000000000000000000000003C0088EE9A :10546000010000000000000000000000000000003B :10547000000000000000000000000000000000002C :10548000000000000000000000000000000000001C :1054900000000000000000000000000000003C00D0 :1054A000C4EE010000000000000000000000000049 :1054B00000000000000000000000000000000000EC :1054C00000000000000000000000000000000000DC :1054D00000000000000000000000000000000000CC :1054E0003C0000EF01000000000000000000000090 :1054F00000000000000000000000000000000000AC :10550000000000000000000000000000000000009B :10551000000000000000000000000000000000008B :1055200000003C003CEF0100000000000000000013 :10553000000000000000000000000000000000006B :10554000000000000000000000000000000000005B :10555000000000000000000000000000000000004B :10556000000000003C0078EF010000000000000097 :10557000000000000000000000000000000000002B :10558000000000000000000000000000000000001B :10559000000000000000000000000000000000000B :1055A0000000000000003C00B4EF0100000000001B :1055B00000000000000000000000000000000000EB :1055C00000000000000000000000000000000000DB :1055D00000000000000000000000000000000000CB :1055E00000000000000000003C00F0EF010000009F :1055F00000000000000000000000000000000000AB :10560000000000000000000000000000000000009A :10561000000000000000000000000000000000008A :10562000000000000000000000003C002CF0010021 :10563000000000000000000000000000000000006A :10564000000000000000000000000000000000005A :10565000000000000000000000000000000000004A :105660000000000000000000000000003C0068F0A6 :105670000100000000000000000000000000000029 :10568000000000000000000000000000000000001A :10569000000000000000000000000000000000000A :1056A00000000000000000000000000000003C00BE :1056B000A4F0010000000000000000000000000055 :1056C00000000000000000000000000000000000DA :1056D00000000000000000000000000000000000CA :1056E00000000000000000000000000000000000BA :1056F0003C00E0F00100000000000000000000009D :105700000000000000000000000000000000000099 :105710000000000000000000000000000000000089 :105720000000000000000000000000000000000079 :1057300000003C001CF1010000000000000000001F :105740000000000000000000000000000000000059 :105750000000000000000000000000000000000049 :105760000000000000000000000000000000000039 :10577000000000003C0058F10100000000000000A3 :105780000000000000000000000000000000000019 :105790000000000000000000000000000000000009 :1057A00000000000000000000000000000000000F9 :1057B0000000000000003C0094F101000000000027 :1057C00000000000000000000000000000000000D9 :1057D00000000000000000000000000000000000C9 :1057E00000000000000000000000000000000000B9 :1057F00000000000000000003C00D0F101000000AB :105800000000000000000000000000000000000098 :105810000000000000000000000000000000000088 :105820000000000000000000000000000000000078 :10583000000000000000000000003C000CF201002D :105840000000000000000000000000000000000058 :105850000000000000000000000000000000000048 :105860000000000000000000000000000000000038 :105870000000000000000000000000003C0048F2B2 :105880000100000000000000000000000000000017 :105890000000000000000000000000000000000008 :1058A00000000000000000000000000000000000F8 :1058B00000000000000000000000000000003C00AC :1058C00084F2010000000000000000000000000061 :1058D00000000000000000000000000000000000C8 :1058E00000000000000000000000000000000000B8 :1058F00000000000000000000000000000000000A8 :105900003C00C0F2010000000000000000000000A8 :105910000000000000000000000000000000000087 :105920000000000000000000000000000000000077 :105930000000000000000000000000000000000067 :1059400000003C00FCF2010000000000000000002C :105950000000000000000000000000000000000047 :105960000000000000000000000000000000000037 :105970000000000000000000000000000000000027 :10598000000000003C0038F30100000000000000AF :105990000000000000000000000000000000000007 :1059A00000000000000000000000000000000000F7 :1059B00000000000000000000000000000000000E7 :1059C0000000000000003C0074F301000000000033 :1059D00000000000000000000000000000000000C7 :1059E00000000000000000000000000000000000B7 :1059F00000000000000000000000000000000000A7 :105A000000000000000000003C00B0F301000000B6 :105A10000000000000000000000000000000000086 :105A20000000000000000000000000000000000076 :105A30000000000000000000000000000000000066 :105A4000000000000000000000003C00ECF301003A :105A50000000000000000000000000000000000046 :105A60000000000000000000000000000000000036 :105A70000000000000000000000000000000000026 :105A80000000000000000000000000003C0028F4BE :105A90000100000000000000000000000000000005 :105AA00000000000000000000000000000000000F6 :105AB00000000000000000000000000000000000E6 :105AC00000000000000000000000000000003C009A :105AD00064F401000000000000000000000000006D :105AE00000000000000000000000000000000000B6 :105AF00000000000000000000000000000000000A6 :105B00000000000000000000000000000000000095 :105B10003C00A0F4010000000000000000000000B4 :105B20000000000000000000000000000000000075 :105B30000000000000000000000000000000000065 :105B40000000000000000000000000000000000055 :105B500000003C00DCF40100000000000000000038 :105B60000000000000000000000000000000000035 :105B70000000000000000000000000000000000025 :105B80000000000000000000000000000000000015 :105B9000000000003C0018F50100000000000000BB :105BA00000000000000000000000000000000000F5 :105BB00000000000000000000000000000000000E5 :105BC00000000000000000000000000000000000D5 :105BD0000000000000003C0054F50100000000003F :105BE00000000000000000000000000000000000B5 :105BF00000000000000000000000000000000000A5 :105C00000000000000000000000000000000000094 :105C100000000000000000003C0090F501000000C2 :105C20000000000000000000000000000000000074 :105C30000000000000000000000000000000000064 :105C40000000000000000000000000000000000054 :105C5000000000000000000000003C00CCF5010046 :105C60000000000000000000000000000000000034 :105C70000000000000000000000000000000000024 :105C80000000000000000000000000000000000014 :105C90000000000000000000000000003C0008F6CA :105CA00001000000000000000000000000000000F3 :105CB00000000000000000000000000000000000E4 :105CC00000000000000000000000000000000000D4 :105CD00000000000000000000000000000003C0088 :105CE00044F6010000000000000000000000000079 :105CF00000000000000000000000000000000000A4 :105D00000000000000000000000000000000000093 :105D10000000000000000000000000000000000083 :105D20003C0080F6010000000000000000000000C0 :105D30000000000000000000000000000000000063 :105D40000000000000000000000000000000000053 :105D50000000000000000000000000000000000043 :105D600000003C00BCF60100000000000000000044 :105D70000000000000000000000000000000000023 :105D80000000000000000000000000000000000013 :105D90000000000000000000000000000000000003 :105DA000000000003C00F8F60100000000000000C8 :105DB00000000000000000000000000000000000E3 :105DC00000000000000000000000000000000000D3 :105DD00000000000000000000000000000000000C3 :105DE0000000000000003C0034F70100000000004B :105DF00000000000000000000000000000000000A3 :105E00000000000000000000000000000000000092 :105E10000000000000000000000000000000000082 :105E200000000000000000003C0070F701000000CE :105E30000000000000000000000000000000000062 :105E40000000000000000000000000000000000052 :105E50000000000000000000000000000000000042 :105E6000000000000000000000003C00ACF7010052 :105E70000000000000000000000000000000000022 :105E80000000000000000000000000000000000012 :105E90000000000000000000000000000000000002 :105EA0000000000000000000000000003C00E8F7D7 :105EB00001000000000000000000000000000000E1 :105EC00000000000000000000000000000000000D2 :105ED00000000000000000000000000000000000C2 :105EE00000000000000000000000000000003C0076 :105EF00024F8010000000000000000000000000085 :105F00000000000000000000000000000000000091 :105F10000000000000000000000000000000000081 :105F20000000000000000000000000000000000071 :105F30003C0060F8010000000000000000000000CC :105F40000000000000000000000000000000000051 :105F50000000000000000000000000000000000041 :105F60000000000000000000000000000000000031 :105F700000003C009CF80100000000000000000050 :105F80000000000000000000000000000000000011 :105F90000000000000000000000000000000000001 :105FA00000000000000000000000000000000000F1 :105FB000000000003C00D8F80100000000000000D4 :105FC00000000000000000000000000000000000D1 :105FD00000000000000000000000000000000000C1 :105FE00000000000000000000000000000000000B1 :105FF0000000000000003C0014F901000000000057 :106000000000000000000000000000000000000090 :106010000000000000000000000000000000000080 :106020000000000000000000000000000000000070 :1060300000000000000000003C0050F901000000DA :106040000000000000000000000000000000000050 :106050000000000000000000000000000000000040 :106060000000000000000000000000000000000030 :10607000000000000000000000003C008CF901005E :106080000000000000000000000000000000000010 :106090000000000000000000000000000000000000 :1060A00000000000000000000000000000000000F0 :1060B0000000000000000000000000003C00C8F9E3 :1060C00001000000000000000000000000000000CF :1060D00000000000000000000000000000000000C0 :1060E00000000000000000000000000000000000B0 :1060F00000000000000000000000000000003C0064 :1061000004FA010000000000000000000000000090 :10611000000000000000000000000000000000007F :10612000000000000000000000000000000000006F :10613000000000000000000000000000000000005F :106140003C0040FA010000000000000000000000D8 :10615000000000000000000000000000000000003F :10616000000000000000000000000000000000002F :10617000000000000000000000000000000000001F :1061800000003C007CFA010000000000000000005C :1061900000000000000000000000000000000000FF :1061A00000000000000000000000000000000000EF :1061B00000000000000000000000000000000000DF :1061C000000000003C00B8FA0100000000000000E0 :1061D00000000000000000000000000000000000BF :1061E00000000000000000000000000000000000AF :1061F000000000000000000000000000000000009F :106200000000000000003C00F4FA01000000000063 :10621000000000000000000000000000000000007E :10622000000000000000000000000000000000006E :10623000000000000000000000000000000000005E :1062400000000000000000003C0030FB01000000E6 :10625000000000000000000000000000000000003E :10626000000000000000000000000000000000002E :10627000000000000000000000000000000000001E :10628000000000000000000000003C006CFB01006A :1062900000000000000000000000000000000000FE :1062A00000000000000000000000000000000000EE :1062B00000000000000000000000000000000000DE :1062C0000000000000000000000000003C00A8FBEF :1062D00001000000000000000000000000000000BD :1062E00000000000000000000000000000000000AE :1062F000000000000000000000000000000000009E :1063000000000000000000000000000000003C0051 :10631000E4FB01000000000000000000000000009D :10632000000000000000000000000000000000006D :10633000000000000000000000000000000000005D :10634000000000000000000000000000000000004D :106350003C0020FC010000000000000000000000E4 :10636000000000000000000000000000000000002D :10637000000000000000000000000000000000001D :10638000000000000000000000000000000000000D :1063900000003C005CFC0100000000000000000068 :1063A00000000000000000000000000000000000ED :1063B00000000000000000000000000000000000DD :1063C00000000000000000000000000000000000CD :1063D000000000003C0098FC0100000000000000EC :1063E00000000000000000000000000000000000AD :1063F000000000000000000000000000000000009D :10640000000000000000000000000000000000008C :106410000000000000003C00D4FC0100000000006F :10642000000000000000000000000000000000006C :10643000000000000000000000000000000000005C :10644000000000000000000000000000000000004C :1064500000000000000000003C0010FD01000000F2 :10646000000000000000000000000000000000002C :10647000000000000000000000000000000000001C :10648000000000000000000000000000000000000C :10649000000000000000000000003C004CFD010076 :1064A00000000000000000000000000000000000EC :1064B00000000000000000000000000000000000DC :1064C00000000000000000000000000000000000CC :1064D0000000000000000000000000003C0088FDFB :1064E00001000000000000000000000000000000AB :1064F000000000000000000000000000000000009C :10650000000000000000000000000000000000008B :1065100000000000000000000000000000003C003F :10652000C4FD0100000000000000000000000000A9 :10653000000000000000000000000000000000005B :10654000000000000000000000000000000000004B :10655000000000000000000000000000000000003B :106560003C0000FE010000000000000000000000F0 :10657000000000000000000000000000000000001B :10658000000000000000000000000000000000000B :1065900000000000000000000000000000000000FB :1065A00000003C003CFE0100000000000000000074 :1065B00000000000000000000000000000000000DB :1065C00000000000000000000000000000000000CB :1065D00000000000000000000000000000000000BB :1065E000000000003C0078FE0100000000000000F8 :1065F000000000000000000000000000000000009B :10660000000000000000000000000000000000008A :10661000000000000000000000000000000000007A :106620000000000000003C00B4FE0100000000007B :10663000000000000000000000000000000000005A :10664000000000000000000000000000000000004A :10665000000000000000000000000000000000003A :1066600000000000000000003C00F0FE01000000FF :10667000000000000000000000000000000000001A :10668000000000000000000000000000000000000A :1066900000000000000000000000000000000000FA :1066A000000000000000000000003C002CFF010082 :1066B00000000000000000000000000000000000DA :1066C00000000000000000000000000000000000CA :1066D00000000000000000000000000000000000BA :1066E0000000000000000000000000000C0068FF37 :1066F00001000000000000000000000000003C005D :106700000010040070B52B4806218175C175017E0B :10671000490849000176017E02229143017626490B :106720000B785B085B000B7004238B700C234376A3 :10673000202303751A244475242484761024C476F7 :106740003C003C1004002A254D70057A3026B543E4 :1067500020350572857A6D086D008572857A9543BE :106760008572857A042635438572857A08263543F5 :106770008572857AA5438572057B2C430473047B5F :106780001C433C00781004000473047B40252C4318 :106790000473847A23438372837AAB438372037BCB :1067A00080242343037308789043087008780122FB :1067B00010430870087804229043087070BD0000F0 :1067C0000C8007003C00B4100400808007000149E1 :1067D00004204873704740800700034980B50020BB :1067E000088000F00AFB80BD0000FC6B01007047D0 :1067F000000080B500F067FB80BD80B50A49182015 :10680000C1F73BFA09493C00F01004000220C1F72F :1068100037FA08491F20C1F733FA07491C20C1F78E :106820002FFA06490320C1F72BFA80BD992A0000F0 :1068300041250000552500005D2500003925000098 :1068400080B5BFF791FD80BD3C002C11040080B5E0 :10685000054A05490A20BFF74EFF0120044980027E :106860000860486080BDB4740100B164000000108D :10687000070080B500F091FE80BD80B5054A05494E :106880001B20BFF738FF012004493C0068110400B9 :10689000C0060860486080BDB87401002D6E00001D :1068A0000010070080B5044800F080FE0349002076 :1068B0004860886080BD0000414B0000BC7401004E :1068C00080B5C5F7D5FECEF7D9F803493C00A41131 :1068D0000400086003490A20D1F7EFF880BDBC74BA :1068E0000100496E000080B5012220210620C8F772 :1068F00056FCBFF770FE03490020086020210248C3 :10690000BFF763F980BDCC5C0100646D01003C0001 :10691000E0110400084880B50068002805D006484A :106920005430426A0021BFF7F3F8044A04490320B7 :10693000BFF7ACFD80BD0000506D010089980000DC :106940009198000080B500F003F800F019F880BDC0 :106950003C001C12040010B5094C6021201CBFF73C :106960003AF90020C043A0602060FF200230E0849C :106970002022201C40300249BFF75BF910BD0010F7 :1069800007007052010000200A49C0438860094B8B :106990000A493C0058120400002082000130000621 :1069A000000E20289950F8D30649044A081C1030DC :1069B000083A03C27047000000100700E07E0100A3 :1069C0007575000000A00700044800210022002384 :1069D0000EC00C383C009412040001214160704745 :1069E0000000707801007047000003480021002279 :1069F00000230EC008C070470000885A01000449F7 :106A000080B500204861024840211C30BFF7E9F8FA :106A100080BDFC5A01003C00D012040080B5CEF7C6 :106A20003FF80349886103490320D1F755F880BD39 :106A3000FC5A01000D17010080B5C0F7A5F980BD13 :106A4000FEB56C4900200090C8786B4C6B4F430733 :106A5000C006C017DB0EE3583C000C1304000130E5 :106A600038623B61081C8078664E03224107A036DD :106A70000296490F3172890061583C1C6161019195 :106A8000C006C00F7862201C002787610020211CEF :106A9000C86159485949007809793C0048130400F5 :106AA0005A4C4E07760F711C8C46B1008E465649E3 :106AB0008031002824D0524F01287F781AD0022834 :106AC00071D14F48002F0CD0012F6CD140794D4D22 :106AD0004007400F8200AA584B4D01303C00841300 :106AE0000400EA61A07304224B48484DC8614A483B :106AF000002F00D04A482F1C11E04248002F55D1EA :106B00000770022747703F484078002810D00128BE :106B100001D002284AD13F483D4FC8613F483C0060 :106B2000C013040088613A4970460858351CB861A2 :106B30006046607304E03C48022288613B48C861BB :106B40000020324906E00E18B6787607760F042E3C :106B50002FD801309042F6D3C8792E4FC007C00F0E :106B60003C00FC130400F86033484168194341605D :106B7000816819438160019AB9698C461143FA69A9 :106B8000866811438E4386604668314341600199AF :106B90000B43181C614608431043011C00220220CD :106BA000C7F73C003814040003FA1E4E403E7078CC :106BB000C008C00028437070701C017800E029E014 :106BC0000825A94301700120C043B08000210120A5 :106BD000CFF76CFC301C8030817809090901817085 :106BE0000F2101703C0074140400164A69041160FE :106BF0005160029E1021327A7B6A002B00D1002165 :106C000011432173817829438170E0780121084381 :106C1000E070D2F7F2F9012000900098FEBDC05755 :106C200001006C4301003C00B0140400A46C01009E :106C300040900700C91D0000811D0000A51D000037 :106C4000991D0000F11D0000100007000010070052 :106C50000349002088620870487008710862704714 :106C6000AC7E010080B501213C00EC140400002042 :106C7000CDF769FF80BDB0B50F48C0F718FC0E4DC9 :106C8000032028700D490D480C3948600D480A4C06 :106C9000886040211834201CBEF7C1FFFF216868BE :106CA000090608432060FF2106223C002815040045 :106CB000201DBFF779F80120E060B0BDC0A8130A1D :106CC000206E0100C0A81301FFFFFF0080B502493C :106CD0000120C8F745FF80BD9D1C000098B50C4CF5 :106CE00000206060E0600B4B0B4982003C006415A3 :106CF0000400013020289950FADB6A460949052032 :106D0000BFF72FFD0020C043206006492020086007 :106D1000486098BD00000040070030740100A9756C :106D20000000B59F000000100700054900203C004E :106D3000A0150400086005488178282291438170DD :106D40008178114381707047786E01000000070060 :106D500070470000414810B50068022188433F4950 :106D60000860081C0068022108433C4908603C4850 :106D70003C00DC1504004068802188433A494860A3 :106D8000081C006880210843374908603748017AA9 :106D9000012421430172017A022211430172017A16 :106DA000042291430172017A082211430172017B8E :106DB00021433C00181604000173017B0222114399 :106DC0000173017B042211430173017B08221143EB :106DD00001732E214173817B3822914328318173C5 :106DE00020214174817BC908C900033181732221AC :106DF000C17320493C0054160400097A41721E49AF :106E0000497A01743C220277011C10314A735023E5 :106E10008B735A23CB730D23011C20310B70174B3E :106E200043840E234B7000214182302101700521E3 :106E30004170042141713C00901604008471C471BA :106E40000C210171F82141800F49CA728A72032214 :106E50000A7209224A7208220A73027A40231A43EC :106E600002724C73FFF7A2FC0848017821430170BD :106E700010BD0000F00007003C00CC160400F40038 :106E800007000C800700764601002409000080807E :106E90000700A080070080B518210948BEF7D7FE7B :106EA000084800213C3841608160C1600161416156 :106EB000816101210162FFF75CFF3C0008170400BB :106EC000C0F76CFF80BD0000247E0100B0B52148F2 :106ED000006840081F4940000860081C0068012144 :106EE00008431C4908601C4A1079012108431071AD :106EF000107902218843107100F06CF83C004417AF :106F00000400107A012108431072107AFE21884390 :106F10000A301072282090725A20D072114D14201D :106F200028772C1C1034A0731620A8751820E8753B :106F3000FFF7A1FC0C486886E07B4006400E3C0051 :106F4000801704000E210843E073E07B8021084392 :106F5000E07307484179042211434171B0BD00003C :106F6000F00007000080070030800700FF010000EC :106F70005000070080B5FFF7AFFF00201449C04361 :106F80003C00BC1704008860C1F70BF913490020CE :106F90004862C860486108618861C8610F4B086237 :106FA0000F4A086338331A8001225A710B4A403263 :106FB000D0601360082313815060094A8A62FF225F :106FC0000A703C00F81704004870054800210022B0 :106FD000503000230EC0C1F7FFF880BD003007001D :106FE000046C0100BEBA0000857500000348102142 :106FF00081710221C1713021417270470080070008 :10700000704700003C003418040000B5C1F7DBFBFA :1070100000BD7047000080B5CDF787FD014988604D :1070200080BD50D9010080B506210548BEF7FDFDA1 :10703000044900200439086000F067F800F003F804 :1070400080BDEC6701003C007018040010B5074CCF :107050002C21201CBEF710FE0120207003490020C7 :107060001C39C8600861886110BD000078690100A2 :1070700080B5CDF75DFD0949886009490820D0F742 :1070800073FD08490920D0F73C00AC1804006FFDDF :1070900007491120D0F76BFD0648C2F774F980BD8F :1070A00000007869010021350000A1380000453456 :1070B0000000BD26010080B586B00F48C4F745F931 :1070C00000F045F8FFF7D7FFFFF73C00E818040091 :1070D000ABFF0C490320D0F74DFD0B4869460090EB :1070E0000020019009480490094802900948039043 :1070F000094805900020C4F7CFF806B080BD000015 :10710000F467010045350000953200003C00241969 :107110000400A07D0100FD320000CD310000457D5E :10712000010010B5CDF7D5FC0948094C302160614C :1071300008487430BEF7A9FD0020A062064920610E :10714000E1636064A06414212165606210BD3C00AD :1071500060190400B9750000447D0100701700003B :1071600080B502210920044AD1F7E8FECDF7ECFCF6 :107170000249086380BD000039390000447D0100E8 :1071800080B5AC210348BEF783FD00F051F800F054 :107190003C009C19040049F880BDA46C010008B5AE :1071A00000F04DF800F045F800211620184AD1F7FC :1071B000C8FE174A0421101C403001700021817064 :1071C0001121C18014490181101C8030C17808222E :1071D00091433C00D8190400C170C1781143C170BB :1071E0006A460F491420BFF7F5FA0E490720D0F779 :1071F000CDFC0D490F20D0F7C9FCCDF7ABFC0B49F6 :1072000008600A4844388068002802D00020C6F789 :107210006FF908BD3C00141A0400B53B0000009053 :107220000700E7FD00008D410000CD480000D9496E :107230000000A46C010080B500F06FFC80BD7047B9 :10724000000080B500F061FC80BD70470000B0B563 :1072500030210C48BEF73C00501A040025FD0B4CB1 :1072600000250A48843C3822032170386560BEF747 :10727000DDFD0648382201213838BEF7D7FD0E2043 :10728000A5606070207000F01DF8B0BD946701002B :10729000044900B5012048603C008C1A0400886055 :1072A000C860C3F7F8FF00BD0000D467010080B5D7 :1072B00002210A20024AD1F750FE80BD00001D5A6B :1072C000000080B500F005F880BD80B500F0FDFB42 :1072D00080BD80B502490420D0F73C00C81A0400E4 :1072E00061FC80BD651F000000211748C94380B5BF :1072F000164B0170181C102220300271002210332E :107300009A73427904231A434271427918239A43AB :1073100008324271081CD7F759F800283C00041BBA :10732000040003D101219A20BFF7CBFB502009496B :1073300050220A60C8608860486008610120486186 :107340000020D7F7D8F80449FF20086080BDF46B0F :1073500001003000070004020700F47401003C0043 :10736000401B040080B5D7F7FBF880BD10B5FFF7D0 :10737000ABFBBFF7DDFB8148CDF798FA0024231C57 :1073800004220421002001F039FA002801D0BFF7BF :10739000C9FB231C0022FF21002001F02FFA002846 :1073A0003C007C1B040001D0BFF7BFFB231C002264 :1073B000FF21002001F025FA002801D0BFF7B5FB1E :1073C000C4F727FF704884706F497F2088706E492A :1073D0000C60032008606B4844706C480480694866 :1073E000C0783C00B81B0400082108436749C870F6 :1073F000081CC078042108436449C87001F07EFA73 :10740000FFF77EFFFFF72CFE01F046FBFFF718FBAE :1074100001F052FAFFF782FB5F48C16810229143E6 :10742000C16001693C00F41B04005D4A1143016125 :107430000169D20A91430161C1685A4A1143C1608E :10744000816A594A1143816200F077F901F01FF80F :1074500000F093FA01F099FB00F0F1FF00F099FCC5 :1074600000F0DDFC00F03C00301C040083FCFFF762 :10747000B3FC01F031FA01F071FAFFF787FAFFF778 :107480009BFA012101204B4AD1F77CFD012102200A :10749000494AD1F777FD02210320484AD1F772FD0E :1074A00002210420464AD1F73C006C1C04006DFD0B :1074B00002210520454AD1F768FD02210620434AF2 :1074C000D1F763FD01210720424AD1F75EFD022179 :1074D0001720404AD1F759FD022108203F4AD1F731 :1074E00054FDFFF7C8FD3D4804603C00A81C0400A3 :1074F0004460FFF717FAFFF709FAFFF74FFC00F0B7 :1075000043F9FFF733FAFFF7FBFA01F085F801F0D2 :10751000EBF901F023FA01F071F900F0E3FFFFF756 :107520006FFA00F0AFF900F0BDF900F03C00E41C88 :107530000400ADFC00F09BFEFFF7CDFAFFF7ABFEB9 :1075400000F0C3F9FFF7ABFD00F08DFF00F021FF65 :1075500000F065F900F097F900F0FDFE00F0E5FE9F :1075600000F03FF900F073F9FFF737FE00F03C0040 :10757000201D040021F900F073FBFFF7E5FB00F08C :10758000D3FBFFF7A9FE00F0BBFB00F009FF00F002 :10759000DBF91848C9F756F81748C9F72BF8002245 :1075A0000121F020D1F72EFD002010BDA9690000B7 :1075B0003C005C1D040000000700F00007002C00E8 :1075C0000700001007003C000800C03F7438FCDFD3 :1075D0007F3855690000E5130000610C00006D0C58 :1075E00000003D0C0000F10D0000C53300003D0F10 :1075F00000003C00981D0400ADD80000800007008A :10760000505701000440010080B501F0A9F900F0D5 :10761000C9F8FFF7C5FE01F003FB01F093FAFFF78D :10762000CBF92C48FFF7E8F900F0AAF800F058FF72 :10763000FFF734FD3C00D41D0400FFF7F2FBFFF719 :107640007AFAFFF700FA00F034F900F03CF901F0A3 :10765000E2F8FFF77AF9FFF772F9FFF79AF901F00C :1076600066F901F08EF901F0E0F800F006FF00F095 :10767000F0FB00F046FB3C00101E040000F0BCFFD5 :1076800000F0E4FC00F020FEFFF740FAFFF746FEB2 :10769000FFF756FD00F02CF900F0FAFE00F08AFE2C :1076A00000F0D4F800F0B4F800F078FE00F04EFEE0 :1076B00000F0DEF8FFF7ACFD3C004C1E040000F0CB :1076C0008CF800F0F8FAFFF776FBFFF720FE01F0E8 :1076D000A6FA00F048FB00F07CFE00F05CF9BEF773 :1076E00057FD002080BD803801000149002008605E :1076F0007047A87E010010B5041C3C00881E0400E1 :1077000001D1BFF739FA0F487D21C900846001809B :107710000D490161802141800021C16001620B4857 :1077200041801421818007214181064A4623043289 :107730000524137054700A21917081763C00C41E98 :1077400004000376048110BD0000C87401000087A6 :10775000930330000700094880B50169426911436D :107760008269C0691143014300220320C6F7BFFCB0 :10777000CCF71BFA0020C2F792F980BD00003C0054 :10778000001F0400A46C0100054880B50021816041 :107790000221C16003394160C7F73AFF80BD000094 :1077A0004020070008B56A4604491520BFF754F881 :1077B0000120034940050860486008BDA52101007B :1077C0003C003C1F04000010070070470000064802 :1077D00080B58068C001800F05D10322C143C6F780 :1077E000BAFCD6F700FE80BD00001000070070470D :1077F000000080B502212A20064AD1F7EAFB0022C8 :1078000007203C00781F04000449BEF7EDFE044841 :10781000C7F758FC80BD00008D890000D59B000093 :107820001046010002480021002200230EC07047CC :10783000806E010080B502212C20064AD1F7CCFBD6 :10784000002200203C00B41F04000449BEF7CFFE14 :1078500004490220C8F70BFA80BD058A0000E99BA5 :107860000000B18B000002480021002200230EC05E :1078700070471075010080B502212B20044AD1F712 :10788000AEFB002202203C00F01F04000249BEF7BC :10789000B1FE80BD2D8A00008D8C00007047000075 :1078A00080B502212D20074AD1F79CFB0022012040 :1078B0000549BEF79FFE0548CBF756FA0448CCF7BA :1078C000F7F880BDAD8A00003C002C20040021E2C6 :1078D0000000F9DF00002044010070470000024969 :1078E00000200860012048607047AC79010080B535 :1078F00002490D20D0F79BF980BD619800007047C8 :10790000000080B5CDF777F903493C0068200400FA :107910000860011C0248CDF797F980BDA8790100E5 :10792000C460010080B500F029F880BD80B586B044 :107930000C48C3F76DFDD6F7D3FB0B480D490090FB :107940000A48049101900A48694602903C00A4202C :1079500004000020039005900120C3F700FD0749B3 :107960000320D0F76AF906B080BD20F70100118727 :107970000100958701005587010098D901006D87A6 :10798000010080B50120D6F790FC034900203C009F :10799000E02004000860486002481439486080BD57 :1079A00090D901003D82010070B50026094C094DB7 :1079B0002660666044215035281CA661BEF7C8F9D0 :1079C0001420E060E8632820E861A06028642E703D :1079D0003C001C21040070BD0000A46E010080B5B5 :1079E00002211820044AD1F70CFB03490820D0F7E4 :1079F0002AF980BD0000159C0000699C0000FEB5BE :107A0000264D2878C0070CD425490020087028701E :107A100024483C00582104008178490849008170BD :107A200081780122114381700024FF261F4F013607 :107A3000211C01A8C6F732F800AB187901281FD025 :107A4000022819D003281ED1B8680021B043B860BD :107A5000786830433C009421040078603A683240F2 :107A6000A02005E03B683340934201D0012101E0B2 :107A70000138F7D27868B0437860002903D001A8B4 :107A800000F027FF02E001A800F045FF01342406C2 :107A90002416062CCFDB3C00D0210400044902222E :107AA0000878104308702870FEBD0000040007002D :107AB000E06001000000070010000700B0B50020E2 :107AC00015231449012542008D54521801300E2807 :107AD0005370F8D30F481C223C000C2204001C38C1 :107AE000BEF773F90D480E212A38BEF71CF90B4971 :107AF000002008600B4C2A21201CBEF714F92570C9 :107B00000E2060701720A070074853210170452196 :107B1000417020218170B0BD00003C00482204006B :107B2000E6780100E4620100EB620100E862010016 :107B30000C490D48002241600C4981600C49C1602C :107B40000C4901610C4941610C498261C1610C49D8 :107B500001620C4941620C4981620C493C0084225B :107B60000400C162C26370470000C9750000287A32 :107B70000100C17500008175000099750000CD7588 :107B800000008975000091750000B57500008D75C5 :107B90000000C5750000B0B50E480E4908603C00F5 :107BA000C02204000831C0F743FE0C49002548609C :107BB0000B480A4C05600B48803C05601020207182 :107BC000E070A07160712720C043C3F7F7FB282045 :107BD000C3F7FCFB2572B0BDFF3F00002C7D010008 :107BE0003C00FC2204001C6701002067010080B5F6 :107BF0002C210148BEF7C7F880BD3C7E010080B54E :107C000038210148BEF7BFF880BD687E010080B50D :107C100002210E20024AD1F70CFA80BD000021E0BB :107C200000003C003823040070470000F0B585B028 :107C3000002700AB2F4E1F8100250024281CD6F7FB :107C4000A1FB022D03D1D6F7F5FA00280CD00124B0 :107C5000012D03D1072000AB187101E000AB1F71AB :107C600000AB18793C0074230400D6F708FC002C04 :107C700039D0082103A8D6F7F2FA00AB187BFE280A :107C800031D1587B01282AD1022102A8D6F7E7FA80 :107C900000AB1889002826D018891849884222D0BC :107CA00019890020BFF73C00B023040013F9041C1D :107CB000006900AB1989D6F7D5FA206800AB1A899C :107CC000011C0831083ACBF7A1F9002806D0022898 :107CD00004D0022194203760BEF762FF201CBFF75A :107CE000C7F8D4E7012194203C00EC230400BEF740 :107CF0005AFFD5F726FF01352D062D0E042DA5D3ED :107D000005B0F0BD000058570100FFFF00000A4811 :107D10000021021C183280B5094B02E0016083800B :107D200008308242FAD104486C213C002824040027 :107D30006C38BEF737F804490220C7F7D1FF80BD81 :107D40007C790100FC0500009D75000080B50221D2 :107D500026200D4AD1F77CF90C48C8F773FF0C4870 :107D6000C8F776FF0B491020CFF794FF3C0064243E :107D700004000A490C20CFF790FF09490020C7F7FB :107D8000B2FFCCF76EFF0749086080BD00009DA6DA :107D90000000A9A4000081A4000031A70000B96D73 :107DA0000000BDA600000C790100024908783C00E3 :107DB000A0240400400840000870704758000700E5 :107DC0000021084880B541618161017041704160C6 :107DD00081601422C26001614262C161FFF704F850 :107DE00080BD00001C75010080B502211D20044AE1 :107DF0003C00DC240400D1F734F903490820CFF714 :107E000052FF80BD000011E3000009E4000080B5CE :107E1000012125200A4AD1F724F9CCF728FF084987 :107E2000086208490120CFF73EFF07490220CFF73B :107E30003AFF3C0018250400FEF7E6FF0548C1F7AD :107E4000E1F980BD29A900001C750100A1AA00006C :107E50002D19000045A8000010B5064C0C22227018 :107E6000A0180549BDF7D8FF0020C8F785FB012001 :107E7000A06010BD3C0054250400A4690100905787 :107E80000100B0B51F4C00256580012020700A203C :107E9000A0809020E08030202081902060813020E0 :107EA000A0811748042207211230BEF74CF814486D :107EB0000422052116303C0090250400BEF746F848 :107EC0001248114AE08120827032157055700020EE :107ED0003C23410143438918F4319B1801300428A5 :107EE0005960F5DB084806221A300949BDF79AFFA8 :107EF0000748054C0C300FC83C00CC25040020344A :107F00000FC42021201CBDF762FFB0BD0000F86047 :107F100001002C090000584001007047000007488C :107F200010B50068002808D00648BEF79CFE041C67 :107F3000FFF79DFE201CBEF796FE3C0008260400BD :107F400010BD000058570100B5AD0000044980B5D0 :107F50000020887002212020024AD1F791F880BDCC :107F6000B479010025B5000080B5CCF78FFE01493A :107F7000486180BDB479010080B518213C004426D9 :107F800004001448BDF729FF1448012101700021A5 :107F9000C1604170016100F002F900F0AAF800F040 :107FA0001EF800F0BAF900F0CCF900F020F900F06A :107FB00064F900F0CEF900F0FCF800F082F93C0022 :107FC0008026040000F028F800F06EF800F04AF86F :107FD000FFF7C2FF00F072F980BD0000407C010095 :107FE00018630100B0B5084C0025084825772060CB :107FF000CEF7F0FD0020E562D0F7D0FA211F08800F :108000003C00BC260400D0F76CFBB0BD0000D47966 :1080100001009575000080B5CCF7C1FC80BD054915 :1080200080B500200870487003480449034A0830AE :10803000CCF727FE80BD2C630100EDBC00004DBDD8 :1080400000003C00F826040080B5CCF72BFE054963 :108050004860011C0448CCF74BFE04490320CFF7CD :108060003DFE80BD2C630100C4600100C1BC000066 :1080700004480021002200230EC008C00249103825 :10808000016070473C0034270400047A01001CE6BC :10809000010080B5CCF709FE0549054A4860022178 :1080A0002420D0F7FCFF0348C9F76BFD80BD047A9C :1080B000010069BE000071EB000010B5044C1421F2 :1080C000201CBDF796FE3C0070270400024820608B :1080D00010BD0000147A0100ECE5010080B5CCF77A :1080E000E7FD0749074A486002211F20D0F7DAFF61 :1080F00005490120086005490C20CFF7F5FD80BD3A :10810000147A0100D5BF00003C00AC270400805A5F :10811000010085FF000080B5FFF74FFD0121212000 :10812000024AD0F7C2FF80BD0000C9C1000080B57F :10813000CCF7C1FD02490863C9F757FD80BD287A15 :10814000010010B5CCF7B7FD164C3C00E827040041 :108150002061CCF7B3FD60611448154908601649E9 :1081600014480860CCF7AAFD1449086000F034F800 :10817000FFF7E0FFFFF75EFF00F004F900F08EF874 :10818000FFF76EFFFFF7B0FFFFF78CFF3C002428DE :108190000400FFF704FF00F0AAF80A48BFF7BDFF8C :1081A000C9F7BBFD09490020CFF7A7FD10BD407CF2 :1081B00001007DB70000187E0100BDB800001C7EE4 :1081C0000100207E0100B9BA0000812401003C00BA :1081D0006028040080B538210148BDF719FE80BD34 :1081E000905C010070470000B0B50C4C0B4D0020B6 :1081F0000C3460602560E0600A202081281CC8F7EC :108200003FFD281CC8F73AFD083D68600448C9F7DF :108210003C009C2804001BFD201CC0F76EFA28803F :10822000B0BDB87A0100D5330100F8B51F4E1D4C22 :1082300000200C2141438200013009190831000659 :10824000000E0428B150F4D318480C383061CEF732 :10825000F4F93C00D8280400144CA078000900016F :10826000A0700027E77067700024A50070590770A0 :10827000201CBEF753F9715908710021201CCEF75C :108280007DF901342406240E042CEED3074C20780B :10829000000900013C00142904000A3020702078F5 :1082A000F021884330302070A0780F210843A0705F :1082B000F8BD00500700107B010080B5CCF79FFB94 :1082C00080BDB0B50C4C0B4D00200C3460602560B7 :1082D000E0600A2020813C0050290400281CC8F7D7 :1082E000E1FC281CC8F7D4FC083D6860201CC0F7DE :1082F0000DFA28800248C9F79BFCB0BD2C7B010019 :108300004900010080B5CAF72FF880BD7047000012 :10831000B0B5124D3C21281C3C008C290400BDF74F :1083200086FD0F4828213C30BDF781FD0D48002116 :1083300014380161C160FF21017041700A490A4A85 :10834000416001210C20D0F7C8FE2C1C30340C3DBC :108350000020D0F74AF920800C3C3C00C8290400DA :10836000AC42F8D1B0BD0000607B010020A1070045 :1083700035CD0000084900200C22424352181071EC :1083800001300528F8DB04480021083801704160FD :10839000FF21417070470000747A01003C00042AFC :1083A000040080B578210148BDF747FD80BDC47B3E :1083B000010080B5CAF797FA80BD7047000010B57C :1083C0000B4CFF210531201CBDF737FD0948F0217A :1083D0000851201C4030C5F78EF96C2106483C003E :1083E000402A0400BDF72CFD0448C0216C30BDF7C5 :1083F00027FD10BDC4690100B0D90100C86A0100A1 :10840000B0B50B4D00241C20604340196C30C3F7FD :108410000FFE0134042CF6DBCCF76EFCA863C7F723 :108420003C007C2A040075F90448C9F71CFC034889 :10843000CFF703FAB0BDC4690100FD800000E1225E :10844000010010B5054C00202080034806210830AB :10845000BDF7D5FC1420606010BD987C010010B5FC :10846000084C3C00B82A04000020208060800648A8 :1084700006210C30BDF7C6FC034806211230BDF7BB :10848000C1FC1420A06010BD587C010070470000A2 :1084900080B502210D20054AD0F72EFE0448C8F70A :1084A0001FFC04483C00F42A0400CAF744FC80BDC9 :1084B000000031D4000051B1000009B100000849AA :1084C00080B500200860FFF7D0FFFFF7C0FFFFF77F :1084D00004FC00F04AF8FFF70AFC00F03CF880BD0D :1084E0000000E46501003C00302B040080B500F082 :1084F00029F800F01BF800F051F800F031F880BDC9 :10850000704700007047000080B5FF2189310248A4 :10851000BDF7A2FC80BD0000DC71010080B50249FE :108520000820CFF711FC80BD3C006C2B040059D90A :10853000000080B50348CFF74CF90249488080BD60 :1085400000008D1F0000987C010080B50348CFF724 :1085500040F90249888080BD0000D5230000587C86 :1085600001007047000080B502483C00A82B0400C1 :10857000CAF7E4FB80BD000071E0000080B5CCF7D5 :10858000A5FB02210F20064AD0F7C2FD14210548A1 :10859000BDF768FC034878211430BDF763FC80BD4B :1085A00035E200008466010080B5CCF73C00E42B86 :1085B0000400B7FB0549086105490E20CFF7CDFB44 :1085C00004490820CFF7C9FB80BDEC65010001021A :1085D0000100C12E0000014900200870704740D9F9 :1085E00001007047000001490020087070473C00FE :1085F000202C0400A079010080B50748C8F7F2FFDD :10860000064948600648C0F707FB0648C0F786FBE6 :108610000548C9F7A3FA80BDA9E40000A0790100CC :10862000B9E40000852E000081E40000074880B511 :108630003C005C2C04000021002200230EC008C076 :108640001038C821016000210C38024ACCF761FBC8 :1086500080BDD0600100FDE5000080B5CCF767FB70 :1086600004490860011C02480430CCF786FB80BD39 :1086700000003C00982C0400C0600100094880B54F :108680000A21017041700849084A81600021C160D7 :10869000527982700161416128211830BDF7EEFBEB :1086A00080BD00007C780100A08601000C5A01000A :1086B000F8B50F493C00D42C04000F480D884F88B2 :1086C00006790024301B684368230C49584341183D :1086D0007D20C000BDF70FFD6100094AA64250523F :1086E00000D13D1C01342406240E102CEAD3054988 :1086F00001200861F8BD3C00102D0400F65901006E :108700000C5A010034440F00125A01007C78010019 :1087100080B500F0E7FA02490120086180BD000041 :108720007C78010010B5041C081C0F494979002908 :1087300001D10E4B00E00E4B3C004C2D0400002CF0 :1087400007D0042111800A1C0124191CBDF7CDFBA0 :108750000AE00124011C181C1288BDF7C6FB00F0BA :10876000C4FA054901200861201C10BD00000C5A04 :108770000100FE590100FA5901003C00882D040057 :108780007C7801000D488CB5C18800AB0C4A9980FB :1087900001890420D980188002211320D0F7D0FC51 :1087A00000F0A6FA074901200861FFF78DFF6A462D :1087B00001A90020FFF7BCFF8CBD00003C00C42DC8 :1087C0000400F459010095F900007C780100F8B527 :1087D000134E0125B5700520F070114910480EC9DF :1087E0002C300EC0002070610F480F49104F00243C :1087F0004860A0003958201CD1F7D7F801343C005C :10880000002E0400102CF7D3064C0B4A2034201CF9 :108810000A49B560CCF792FACCF79EFA3061206035 :10882000F8BD000064730100B05801000418020094 :1088300060000700D444010045FA000071FA00000E :108840003C003C2E04000C4930B50023CC560B4BA9 :108850000020F0251A5C1107090F09190F2901DD05 :108860000F2102E0002900DA00212A405118195492 :1088700001300E28EEDB30BD000064730100C058EB :1088800001003C00782E0400B0B50D1C002808D073 :10889000012414800520CCF7B5F88003C00F2870A0 :1088A00007E028780122410452040520D0F7AEFDEC :1088B0000124201CB0BD000098B5054C6068CCF7C1 :1088C000F5FD00903C00B42E040000AB1888E08059 :1088D000CEF7FBFF98BDA058010038B5031C081C5B :1088E0000024002B174D07D00E2111800A1C0124F3 :1088F000291CBDF70CFB22E01188042917D1011CAB :1089000068461288BDF73C00F02E040003FB009877 :10891000002801DB323000E032380090011C642076 :10892000BDF798FB0106091600900E22281CBDF722 :1089300085FB06E00E2905D10A1C011C281CBDF789 :10894000E9FA0124201C38BD3C002C2F0400DA5920 :10895000010038B5031C081C0024002B174D07D05C :108960000E2111800A1C0124291CBDF7D6FA22E031 :108970001188042917D1011C68461288BDF7CDFA69 :108980000098002801DB323000E03C00682F040032 :1089900032380090011C6420BDF762FB0106091605 :1089A00000900E22281CBDF74FFB06E00E2905D1D2 :1089B0000A1C011C281CBDF7B3FA0124201C38BD79 :1089C000CC590100034880B5017800203C00A42F59 :1089D0000400CCF7B4FB80BD0000A658010070472E :1089E00000000249032008700020487070479C7303 :1089F000010080B502211120024AD0F7BCFB80BDE6 :108A00000000A1FE0000F0B50B4F1C1C00233C0031 :108A1000E02F0400FD562B1C062D01D10120F0BDD6 :108A2000064E051CD80034363554801941708270CA :108A30004460581C38700020F0BD0000985A0100B6 :108A400010B5041C0C4800F021F96078FF2804D010 :108A50003C001C3004000123E056062100F0CDF854 :108A6000084A012110780843074908702023184359 :108A70000870802318431070087010BD0000919B8F :108A80000000E06001000400070010B50A49041C62 :108A900008783C005830040040084000087008493D :108AA0000870084800F0F8F86078FF2804D0012327 :108AB000E056052100F0A4F810BD0000E0600100C0 :108AC00004000700919B00000348002100220023BE :108AD0000EC008C03C009430040070470000E860FD :108AE00001007047000010B5074C00206060208036 :108AF000E06002211420044AD0F749FB02481030FC :108B0000A06010BD000058750100051D01007047F0 :108B1000000010B548213C00D03004000A48BDF7E1 :108B2000E3F9094CE0214834201CBDF7DDF90020B1 :108B3000C10009190A1C083201301B284A60F7D30A :108B400001480438046010BD685B010080B5022153 :108B50002320024AD0F71EFB3C000C31040080BDEC :108B600000004523010080B5FFF76BF880BD70471A :108B70000000F8B501201D49C00748601D49FF20CD :108B800008731C4E10203060050135601B4C80219D :108B9000201CBDF7ACF90021194A3C004831040003 :108BA000154F00200B011B195A60CB00DB191874FC :108BB00001310829F6DB0F4CFA212180124961802E :108BC000A0606A4611490420BDF730FF6A4610498B :108BD0000820BDF72BFF1020706075603C008431C9 :108BE000040060680221084360600B49064A081CC3 :108BF0001030083A03C2F8BD000000010700006011 :108C0000070000100700AC730100D1750000204E72 :108C10000000052C0100112C010000A007003C0001 :108C2000C031040070B50E1C0024C4F75BFE0028A0 :108C30003BD04568FF2D38D00C2E28D201A39B5D78 :108C40005B009F440507090B0D101316181B1E210E :108C5000182420E030241EE060241CE0C0241AE028 :108C60003C00FC310400FF24813417E00924A401F6 :108C700014E00924E40111E00F4C0FE00924240260 :108C80000CE00924640209E00324E40206E009245C :108C9000A40203E009219E20BEF739F86000001904 :108CA00040083C0038320400054980044018054A59 :108CB000A900891848606420604370BDDC0700008B :108CC0008038010004000700024980B50860D0F731 :108CD00097F880BD5C5B0100F8B50026174C174B78 :108CE000194926703C0074320400002014330D88AA :108CF000154E154A04E0C100CF187A605E5001306D :108D0000A842F8DBC6F72BFDFF21114DA531281C29 :108D1000BDF7FFF80021281C021C1432C260101C91 :108D200001311429F8DB3C00B03204000026C66093 :108D300005480C3060C009481821BDF7EDF8012046 :108D4000043441C40020F8BD705D010009A000009A :108D500030D9010056570100045F0100A8600100EE :108D600080B50020CFF7B6FC3C00EC32040001498E :108D7000088080BD00002C7401001148F8B54179CD :108D8000002902D105780F4E01E045780F4E0223ED :108D9000F75E0024601B784364230C495843411854 :108DA0007D20C000BDF7F5F961003C0028330400C8 :108DB000094AAC42505201D10023F75E0134240627 :108DC000240E102CE9D3F8BD0C5A0100FE59010005 :108DD000FA59010034440F00325A010038B5104CE2 :108DE000BE252573207A1821884320723C00643305 :108DF00004006A460D490D20BDF733FE01200B49E2 :108E000040030860486025732D20C003206025734F :108E1000207A102108432072064806490860002085 :108E2000486038BD0000000307008D3E01002400AB :108E3000A0330400001007000087930304790100A9 :108E400080B502211520024AD0F7C8F980BD000084 :108E50000D3E010070470000040000600400440063 :108E60000000040040200700FFFFFFFF4D656D6F0D :108E7000727920636865636B2E2E2E00204F4B0A9B :108E800000000000204641494C0A000057726974F6 :108E9000696E67206669726D7761726520646174BE :108EA0006120746F20666C6173680A005665726990 :108EB0006679696E67206669726D77617265206494 :108EC0006174610A00000000566572696679206667 :108ED00061696C6564206174206279746520256421 :108EE0002C2030782530327820213D2030782530F4 :108EF00032780A004669726D776172652073756316 :108F00006365737366756C6C792073746F726564D6 :108F100020696E20666C617368210A0005000600F6 :108F200000000001000001480000000B0000014C9F :108F300000000009000001780000000F0000019C03 :108F400000000001000001D800000001000001DC69 :108F50000000000100000108000000010000010CF9 :108F600000000001000001100000000100000114D9 :108F70000000000100000118000000010000011CB9 :108F80000000000100000120000000010000012499 :108F9000000000030000012800000001000001346F :108FA0000000000100000138000000010000013C49 :108FB0000000000100000140000000010000014429 :040000058000000077 :00000001FF ================================================ FILE: external/arduino/avr/firmwares/wifishield/scripts/ArduinoWifiShield_upgrade.sh ================================================ #!/bin/sh WIFI_FW_PATH="/hardware/arduino/avr/firmwares/wifishield/binary" AVR_TOOLS_PATH="/hardware/tools/avr/bin" TARGET_MICRO="at32uc3a1256" progname=$0 usage () { cat <&2 usage exit 1 ;; :) echo "Option -$OPTARG requires an argument." >&2 exit 1 ;; esac done else echo "Please retry running the script as root.\n" fi shift $(($OPTIND - 1)) ================================================ FILE: external/arduino/avr/firmwares/wifishield/scripts/ArduinoWifiShield_upgrade_mac.sh ================================================ #!/bin/sh WIFI_FW_PATH="/hardware/arduino/avr/firmwares/wifishield/binary" AVR_TOOLS_PATH="/hardware/tools/avr/bin" progname=$0 usage () { cat <&2 usage exit 1 ;; :) echo "Option -$OPTARG requires an argument." >&2 exit 1 ;; esac done else echo "You are not root!\n" fi shift $(($OPTIND - 1)) ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/.cproject ================================================ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/.project ================================================ wifiHD org.eclipse.cdt.managedbuilder.core.genmakebuilder clean,full,incremental, ?name? org.eclipse.cdt.make.core.append_environment true org.eclipse.cdt.make.core.buildArguments org.eclipse.cdt.make.core.buildCommand make org.eclipse.cdt.make.core.buildLocation ${workspace_loc:/wifiHD/Debug} org.eclipse.cdt.make.core.contents org.eclipse.cdt.make.core.activeConfigSettings org.eclipse.cdt.make.core.enableAutoBuild false org.eclipse.cdt.make.core.enableCleanBuild true org.eclipse.cdt.make.core.enableFullBuild true org.eclipse.cdt.make.core.stopOnError true org.eclipse.cdt.make.core.useDefaultBuildCmd true org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder com.atmel.avr32.core.nature org.eclipse.cdt.core.cnature org.eclipse.cdt.managedbuilder.core.managedBuildNature org.eclipse.cdt.managedbuilder.core.ScannerConfigNature UC3 Software Framework 2 framework:/com.atmel.avr32.sf.uc3 ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/Release/wifiHD.hex ================================================ :0200000480007A :10000000E08F100000000000000000000000000071 :1000100000000000000000000000000000000000E0 :1000200000000000000000000000000000000000D0 :1000300000000000000000000000000000000000C0 :1000400000000000000000000000000000000000B0 :1000500000000000000000000000000000000000A0 :100060000000000000000000000000000000000090 :100070000000000000000000000000000000000080 :100080000000000000000000000000000000000070 :100090000000000000000000000000000000000060 :1000A0000000000000000000000000000000000050 :1000B0000000000000000000000000000000000040 :1000C0000000000000000000000000000000000030 :1000D0000000000000000000000000000000000020 :1000E0000000000000000000000000000000000010 :1000F0000000000000000000000000000000000000 :1001000000000000000000000000000000000000EF :1001100000000000000000000000000000000000DF :1001200000000000000000000000000000000000CF :1001300000000000000000000000000000000000BF :1001400000000000000000000000000000000000AF :10015000000000000000000000000000000000009F :10016000000000000000000000000000000000008F :10017000000000000000000000000000000000007F :10018000000000000000000000000000000000006F :10019000000000000000000000000000000000005F :1001A000000000000000000000000000000000004F :1001B000000000000000000000000000000000003F :1001C000000000000000000000000000000000002F :1001D000000000000000000000000000000000001F :1001E000000000000000000000000000000000000F :1001F00000000000000000000000000000000000FF :1002000000000000000000000000000000000000EE :1002100000000000000000000000000000000000DE :1002200000000000000000000000000000000000CE :1002300000000000000000000000000000000000BE :1002400000000000000000000000000000000000AE :10025000000000000000000000000000000000009E :10026000000000000000000000000000000000008E :10027000000000000000000000000000000000007E :10028000000000000000000000000000000000006E :10029000000000000000000000000000000000005E :1002A000000000000000000000000000000000004E :1002B000000000000000000000000000000000003E :1002C000000000000000000000000000000000002E :1002D000000000000000000000000000000000001E :1002E000000000000000000000000000000000000E :1002F00000000000000000000000000000000000FE :1003000000000000000000000000000000000000ED :1003100000000000000000000000000000000000DD :1003200000000000000000000000000000000000CD :1003300000000000000000000000000000000000BD :1003400000000000000000000000000000000000AD :10035000000000000000000000000000000000009D :10036000000000000000000000000000000000008D :10037000000000000000000000000000000000007D :10038000000000000000000000000000000000006D :10039000000000000000000000000000000000005D :1003A000000000000000000000000000000000004D :1003B000000000000000000000000000000000003D :1003C000000000000000000000000000000000002D :1003D000000000000000000000000000000000001D :1003E000000000000000000000000000000000000D :1003F00000000000000000000000000000000000FD :1004000000000000000000000000000000000000EC :1004100000000000000000000000000000000000DC :1004200000000000000000000000000000000000CC :1004300000000000000000000000000000000000BC :1004400000000000000000000000000000000000AC :10045000000000000000000000000000000000009C :10046000000000000000000000000000000000008C :10047000000000000000000000000000000000007C :10048000000000000000000000000000000000006C :10049000000000000000000000000000000000005C :1004A000000000000000000000000000000000004C :1004B000000000000000000000000000000000003C :1004C000000000000000000000000000000000002C :1004D000000000000000000000000000000000001C :1004E000000000000000000000000000000000000C :1004F00000000000000000000000000000000000FC :1005000000000000000000000000000000000000EB :1005100000000000000000000000000000000000DB :1005200000000000000000000000000000000000CB :1005300000000000000000000000000000000000BB :1005400000000000000000000000000000000000AB :10055000000000000000000000000000000000009B :10056000000000000000000000000000000000008B :10057000000000000000000000000000000000007B :10058000000000000000000000000000000000006B :10059000000000000000000000000000000000005B :1005A000000000000000000000000000000000004B :1005B000000000000000000000000000000000003B :1005C000000000000000000000000000000000002B :1005D000000000000000000000000000000000001B :1005E000000000000000000000000000000000000B :1005F00000000000000000000000000000000000FB :1006000000000000000000000000000000000000EA :1006100000000000000000000000000000000000DA :1006200000000000000000000000000000000000CA :1006300000000000000000000000000000000000BA :1006400000000000000000000000000000000000AA :10065000000000000000000000000000000000009A :10066000000000000000000000000000000000008A :10067000000000000000000000000000000000007A :10068000000000000000000000000000000000006A :10069000000000000000000000000000000000005A :1006A000000000000000000000000000000000004A :1006B000000000000000000000000000000000003A :1006C000000000000000000000000000000000002A :1006D000000000000000000000000000000000001A :1006E000000000000000000000000000000000000A :1006F00000000000000000000000000000000000FA :1007000000000000000000000000000000000000E9 :1007100000000000000000000000000000000000D9 :1007200000000000000000000000000000000000C9 :1007300000000000000000000000000000000000B9 :1007400000000000000000000000000000000000A9 :100750000000000000000000000000000000000099 :100760000000000000000000000000000000000089 :100770000000000000000000000000000000000079 :100780000000000000000000000000000000000069 :100790000000000000000000000000000000000059 :1007A0000000000000000000000000000000000049 :1007B0000000000000000000000000000000000039 :1007C0000000000000000000000000000000000029 :1007D0000000000000000000000000000000000019 :1007E0000000000000000000000000000000000009 :1007F00000000000000000000000000000000000F9 :1008000000000000000000000000000000000000E8 :1008100000000000000000000000000000000000D8 :1008200000000000000000000000000000000000C8 :1008300000000000000000000000000000000000B8 :1008400000000000000000000000000000000000A8 :100850000000000000000000000000000000000098 :100860000000000000000000000000000000000088 :100870000000000000000000000000000000000078 :100880000000000000000000000000000000000068 :100890000000000000000000000000000000000058 :1008A0000000000000000000000000000000000048 :1008B0000000000000000000000000000000000038 :1008C0000000000000000000000000000000000028 :1008D0000000000000000000000000000000000018 :1008E0000000000000000000000000000000000008 :1008F00000000000000000000000000000000000F8 :1009000000000000000000000000000000000000E7 :1009100000000000000000000000000000000000D7 :1009200000000000000000000000000000000000C7 :1009300000000000000000000000000000000000B7 :1009400000000000000000000000000000000000A7 :100950000000000000000000000000000000000097 :100960000000000000000000000000000000000087 :100970000000000000000000000000000000000077 :100980000000000000000000000000000000000067 :100990000000000000000000000000000000000057 :1009A0000000000000000000000000000000000047 :1009B0000000000000000000000000000000000037 :1009C0000000000000000000000000000000000027 :1009D0000000000000000000000000000000000017 :1009E0000000000000000000000000000000000007 :1009F00000000000000000000000000000000000F7 :100A000000000000000000000000000000000000E6 :100A100000000000000000000000000000000000D6 :100A200000000000000000000000000000000000C6 :100A300000000000000000000000000000000000B6 :100A400000000000000000000000000000000000A6 :100A50000000000000000000000000000000000096 :100A60000000000000000000000000000000000086 :100A70000000000000000000000000000000000076 :100A80000000000000000000000000000000000066 :100A90000000000000000000000000000000000056 :100AA0000000000000000000000000000000000046 :100AB0000000000000000000000000000000000036 :100AC0000000000000000000000000000000000026 :100AD0000000000000000000000000000000000016 :100AE0000000000000000000000000000000000006 :100AF00000000000000000000000000000000000F6 :100B000000000000000000000000000000000000E5 :100B100000000000000000000000000000000000D5 :100B200000000000000000000000000000000000C5 :100B300000000000000000000000000000000000B5 :100B400000000000000000000000000000000000A5 :100B50000000000000000000000000000000000095 :100B60000000000000000000000000000000000085 :100B70000000000000000000000000000000000075 :100B80000000000000000000000000000000000065 :100B90000000000000000000000000000000000055 :100BA0000000000000000000000000000000000045 :100BB0000000000000000000000000000000000035 :100BC0000000000000000000000000000000000025 :100BD0000000000000000000000000000000000015 :100BE0000000000000000000000000000000000005 :100BF00000000000000000000000000000000000F5 :100C000000000000000000000000000000000000E4 :100C100000000000000000000000000000000000D4 :100C200000000000000000000000000000000000C4 :100C300000000000000000000000000000000000B4 :100C400000000000000000000000000000000000A4 :100C50000000000000000000000000000000000094 :100C60000000000000000000000000000000000084 :100C70000000000000000000000000000000000074 :100C80000000000000000000000000000000000064 :100C90000000000000000000000000000000000054 :100CA0000000000000000000000000000000000044 :100CB0000000000000000000000000000000000034 :100CC0000000000000000000000000000000000024 :100CD0000000000000000000000000000000000014 :100CE0000000000000000000000000000000000004 :100CF00000000000000000000000000000000000F4 :100D000000000000000000000000000000000000E3 :100D100000000000000000000000000000000000D3 :100D200000000000000000000000000000000000C3 :100D300000000000000000000000000000000000B3 :100D400000000000000000000000000000000000A3 :100D50000000000000000000000000000000000093 :100D60000000000000000000000000000000000083 :100D70000000000000000000000000000000000073 :100D80000000000000000000000000000000000063 :100D90000000000000000000000000000000000053 :100DA0000000000000000000000000000000000043 :100DB0000000000000000000000000000000000033 :100DC0000000000000000000000000000000000023 :100DD0000000000000000000000000000000000013 :100DE0000000000000000000000000000000000003 :100DF00000000000000000000000000000000000F3 :100E000000000000000000000000000000000000E2 :100E100000000000000000000000000000000000D2 :100E200000000000000000000000000000000000C2 :100E300000000000000000000000000000000000B2 :100E400000000000000000000000000000000000A2 :100E50000000000000000000000000000000000092 :100E60000000000000000000000000000000000082 :100E70000000000000000000000000000000000072 :100E80000000000000000000000000000000000062 :100E90000000000000000000000000000000000052 :100EA0000000000000000000000000000000000042 :100EB0000000000000000000000000000000000032 :100EC0000000000000000000000000000000000022 :100ED0000000000000000000000000000000000012 :100EE0000000000000000000000000000000000002 :100EF00000000000000000000000000000000000F2 :100F000000000000000000000000000000000000E1 :100F100000000000000000000000000000000000D1 :100F200000000000000000000000000000000000C1 :100F300000000000000000000000000000000000B1 :100F400000000000000000000000000000000000A1 :100F50000000000000000000000000000000000091 :100F60000000000000000000000000000000000081 :100F70000000000000000000000000000000000071 :100F80000000000000000000000000000000000061 :100F90000000000000000000000000000000000051 :100FA0000000000000000000000000000000000041 :100FB0000000000000000000000000000000000031 :100FC0000000000000000000000000000000000021 :100FD0000000000000000000000000000000000011 :100FE0000000000000000000000000000000000001 :100FF00000000000000000000000000000000000F1 :1010000000000000000000000000000000000000E0 :1010100000000000000000000000000000000000D0 :1010200000000000000000000000000000000000C0 :1010300000000000000000000000000000000000B0 :1010400000000000000000000000000000000000A0 :101050000000000000000000000000000000000090 :101060000000000000000000000000000000000080 :101070000000000000000000000000000000000070 :101080000000000000000000000000000000000060 :101090000000000000000000000000000000000050 :1010A0000000000000000000000000000000000040 :1010B0000000000000000000000000000000000030 :1010C0000000000000000000000000000000000020 :1010D0000000000000000000000000000000000010 :1010E0000000000000000000000000000000000000 :1010F00000000000000000000000000000000000F0 :1011000000000000000000000000000000000000DF :1011100000000000000000000000000000000000CF :1011200000000000000000000000000000000000BF :1011300000000000000000000000000000000000AF :10114000000000000000000000000000000000009F :10115000000000000000000000000000000000008F :10116000000000000000000000000000000000007F :10117000000000000000000000000000000000006F :10118000000000000000000000000000000000005F :10119000000000000000000000000000000000004F :1011A000000000000000000000000000000000003F :1011B000000000000000000000000000000000002F :1011C000000000000000000000000000000000001F :1011D000000000000000000000000000000000000F :1011E00000000000000000000000000000000000FF :1011F00000000000000000000000000000000000EF :1012000000000000000000000000000000000000DE :1012100000000000000000000000000000000000CE :1012200000000000000000000000000000000000BE :1012300000000000000000000000000000000000AE :10124000000000000000000000000000000000009E :10125000000000000000000000000000000000008E :10126000000000000000000000000000000000007E :10127000000000000000000000000000000000006E :10128000000000000000000000000000000000005E :10129000000000000000000000000000000000004E :1012A000000000000000000000000000000000003E :1012B000000000000000000000000000000000002E :1012C000000000000000000000000000000000001E :1012D000000000000000000000000000000000000E :1012E00000000000000000000000000000000000FE :1012F00000000000000000000000000000000000EE :1013000000000000000000000000000000000000DD :1013100000000000000000000000000000000000CD :1013200000000000000000000000000000000000BD :1013300000000000000000000000000000000000AD :10134000000000000000000000000000000000009D :10135000000000000000000000000000000000008D :10136000000000000000000000000000000000007D :10137000000000000000000000000000000000006D :10138000000000000000000000000000000000005D :10139000000000000000000000000000000000004D :1013A000000000000000000000000000000000003D :1013B000000000000000000000000000000000002D :1013C000000000000000000000000000000000001D :1013D000000000000000000000000000000000000D :1013E00000000000000000000000000000000000FD :1013F00000000000000000000000000000000000ED :1014000000000000000000000000000000000000DC :1014100000000000000000000000000000000000CC :1014200000000000000000000000000000000000BC :1014300000000000000000000000000000000000AC :10144000000000000000000000000000000000009C :10145000000000000000000000000000000000008C :10146000000000000000000000000000000000007C :10147000000000000000000000000000000000006C :10148000000000000000000000000000000000005C :10149000000000000000000000000000000000004C :1014A000000000000000000000000000000000003C :1014B000000000000000000000000000000000002C :1014C000000000000000000000000000000000001C :1014D000000000000000000000000000000000000C :1014E00000000000000000000000000000000000FC :1014F00000000000000000000000000000000000EC :1015000000000000000000000000000000000000DB :1015100000000000000000000000000000000000CB :1015200000000000000000000000000000000000BB :1015300000000000000000000000000000000000AB :10154000000000000000000000000000000000009B :10155000000000000000000000000000000000008B :10156000000000000000000000000000000000007B :10157000000000000000000000000000000000006B :10158000000000000000000000000000000000005B :10159000000000000000000000000000000000004B :1015A000000000000000000000000000000000003B :1015B000000000000000000000000000000000002B :1015C000000000000000000000000000000000001B :1015D000000000000000000000000000000000000B :1015E00000000000000000000000000000000000FB :1015F00000000000000000000000000000000000EB :1016000000000000000000000000000000000000DA :1016100000000000000000000000000000000000CA :1016200000000000000000000000000000000000BA :1016300000000000000000000000000000000000AA :10164000000000000000000000000000000000009A :10165000000000000000000000000000000000008A :10166000000000000000000000000000000000007A :10167000000000000000000000000000000000006A :10168000000000000000000000000000000000005A :10169000000000000000000000000000000000004A :1016A000000000000000000000000000000000003A :1016B000000000000000000000000000000000002A :1016C000000000000000000000000000000000001A :1016D000000000000000000000000000000000000A :1016E00000000000000000000000000000000000FA :1016F00000000000000000000000000000000000EA :1017000000000000000000000000000000000000D9 :1017100000000000000000000000000000000000C9 :1017200000000000000000000000000000000000B9 :1017300000000000000000000000000000000000A9 :101740000000000000000000000000000000000099 :101750000000000000000000000000000000000089 :101760000000000000000000000000000000000079 :101770000000000000000000000000000000000069 :101780000000000000000000000000000000000059 :101790000000000000000000000000000000000049 :1017A0000000000000000000000000000000000039 :1017B0000000000000000000000000000000000029 :1017C0000000000000000000000000000000000019 :1017D0000000000000000000000000000000000009 :1017E00000000000000000000000000000000000F9 :1017F00000000000000000000000000000000000E9 :1018000000000000000000000000000000000000D8 :1018100000000000000000000000000000000000C8 :1018200000000000000000000000000000000000B8 :1018300000000000000000000000000000000000A8 :101840000000000000000000000000000000000098 :101850000000000000000000000000000000000088 :101860000000000000000000000000000000000078 :101870000000000000000000000000000000000068 :101880000000000000000000000000000000000058 :101890000000000000000000000000000000000048 :1018A0000000000000000000000000000000000038 :1018B0000000000000000000000000000000000028 :1018C0000000000000000000000000000000000018 :1018D0000000000000000000000000000000000008 :1018E00000000000000000000000000000000000F8 :1018F00000000000000000000000000000000000E8 :1019000000000000000000000000000000000000D7 :1019100000000000000000000000000000000000C7 :1019200000000000000000000000000000000000B7 :1019300000000000000000000000000000000000A7 :101940000000000000000000000000000000000097 :101950000000000000000000000000000000000087 :101960000000000000000000000000000000000077 :101970000000000000000000000000000000000067 :101980000000000000000000000000000000000057 :101990000000000000000000000000000000000047 :1019A0000000000000000000000000000000000037 :1019B0000000000000000000000000000000000027 :1019C0000000000000000000000000000000000017 :1019D0000000000000000000000000000000000007 :1019E00000000000000000000000000000000000F7 :1019F00000000000000000000000000000000000E7 :101A000000000000000000000000000000000000D6 :101A100000000000000000000000000000000000C6 :101A200000000000000000000000000000000000B6 :101A300000000000000000000000000000000000A6 :101A40000000000000000000000000000000000096 :101A50000000000000000000000000000000000086 :101A60000000000000000000000000000000000076 :101A70000000000000000000000000000000000066 :101A80000000000000000000000000000000000056 :101A90000000000000000000000000000000000046 :101AA0000000000000000000000000000000000036 :101AB0000000000000000000000000000000000026 :101AC0000000000000000000000000000000000016 :101AD0000000000000000000000000000000000006 :101AE00000000000000000000000000000000000F6 :101AF00000000000000000000000000000000000E6 :101B000000000000000000000000000000000000D5 :101B100000000000000000000000000000000000C5 :101B200000000000000000000000000000000000B5 :101B300000000000000000000000000000000000A5 :101B40000000000000000000000000000000000095 :101B50000000000000000000000000000000000085 :101B60000000000000000000000000000000000075 :101B70000000000000000000000000000000000065 :101B80000000000000000000000000000000000055 :101B90000000000000000000000000000000000045 :101BA0000000000000000000000000000000000035 :101BB0000000000000000000000000000000000025 :101BC0000000000000000000000000000000000015 :101BD0000000000000000000000000000000000005 :101BE00000000000000000000000000000000000F5 :101BF00000000000000000000000000000000000E5 :101C000000000000000000000000000000000000D4 :101C100000000000000000000000000000000000C4 :101C200000000000000000000000000000000000B4 :101C300000000000000000000000000000000000A4 :101C40000000000000000000000000000000000094 :101C50000000000000000000000000000000000084 :101C60000000000000000000000000000000000074 :101C70000000000000000000000000000000000064 :101C80000000000000000000000000000000000054 :101C90000000000000000000000000000000000044 :101CA0000000000000000000000000000000000034 :101CB0000000000000000000000000000000000024 :101CC0000000000000000000000000000000000014 :101CD0000000000000000000000000000000000004 :101CE00000000000000000000000000000000000F4 :101CF00000000000000000000000000000000000E4 :101D000000000000000000000000000000000000D3 :101D100000000000000000000000000000000000C3 :101D200000000000000000000000000000000000B3 :101D300000000000000000000000000000000000A3 :101D40000000000000000000000000000000000093 :101D50000000000000000000000000000000000083 :101D60000000000000000000000000000000000073 :101D70000000000000000000000000000000000063 :101D80000000000000000000000000000000000053 :101D90000000000000000000000000000000000043 :101DA0000000000000000000000000000000000033 :101DB0000000000000000000000000000000000023 :101DC0000000000000000000000000000000000013 :101DD0000000000000000000000000000000000003 :101DE00000000000000000000000000000000000F3 :101DF00000000000000000000000000000000000E3 :101E000000000000000000000000000000000000D2 :101E100000000000000000000000000000000000C2 :101E200000000000000000000000000000000000B2 :101E300000000000000000000000000000000000A2 :101E40000000000000000000000000000000000092 :101E50000000000000000000000000000000000082 :101E60000000000000000000000000000000000072 :101E70000000000000000000000000000000000062 :101E80000000000000000000000000000000000052 :101E90000000000000000000000000000000000042 :101EA0000000000000000000000000000000000032 :101EB0000000000000000000000000000000000022 :101EC0000000000000000000000000000000000012 :101ED0000000000000000000000000000000000002 :101EE00000000000000000000000000000000000F2 :101EF00000000000000000000000000000000000E2 :101F000000000000000000000000000000000000D1 :101F100000000000000000000000000000000000C1 :101F200000000000000000000000000000000000B1 :101F300000000000000000000000000000000000A1 :101F40000000000000000000000000000000000091 :101F50000000000000000000000000000000000081 :101F60000000000000000000000000000000000071 :101F70000000000000000000000000000000000061 :101F80000000000000000000000000000000000051 :101F90000000000000000000000000000000000041 :101FA0000000000000000000000000000000000031 :101FB0000000000000000000000000000000000021 :101FC0000000000000000000000000000000000011 :101FD0000000000000000000000000000000000001 :101FE00000000000000000000000000000000000F1 :101FF00000000000000000000000000000000000E1 :08200000481F000080013E04AE :102008003038F00C19005EBC5C7C4848F00C003994 :10201800F00C093BB22A5EFC000011C0F80815015B :102028003039F20C1800E08800035EFDF00B000B5D :102038004828F00B032C5EFC00007B08580CC0D02D :1020480048787829F00900293008720A143CC060E1 :102058002FF82F895848CFA13FF85EF800007B0879 :102068003038F00C18005EBCF60C001C30094838FB :10207800F00C09295EFC000000007B085EFFD70316 :10208800D4011988301EB6881998B6BEEA18FFFF21 :10209800E818FF80B6AEB698580AC0301588C0A8B0 :1020A80048981188F4081800C0303038C03848788B :1020B80011B8B6C83EE8B6D83008B6E8302C306853 :1020C800B208D802000016AB00000008D40130188E :1020D800198EB68E199CB6A8EA1CFFFFE81CFF8073 :1020E800B6B8B69C580AC0A0158CE06A00FFF00C80 :1020F8001800F4081710F9B80001B6C83EE8B6D8B9 :102108003008B6E8302C3068B208D802D421202D27 :102118004AAA189E1698129674075807C071FACAE8 :10212800FFF814F7F01F0026C4681989B6891999B1 :10213800EA19FFFFE819FF80B6993039B0A9740988 :102148007219F20C1618B0F9B0CCF9D9C108F3D944 :10215800C208B0ECB0D9304BB0BB74097229F20C8C :102168001618F169000CF16C0009F9D9C108F3D906 :10217800C208F16C000BF16B0008F169000A7409E0 :10218800300A7239F16A00133EEAF16A0012F20A63 :102198001618F1690011F16A000EF16B000DF5D9FE :1021A800C108F3D9C208F16A0010F169000F302C98 :1021B8003138AC082FEDD8220000152C800020D42F :1021C8003038F00C18005EBCF60C001B48F8F00B19 :1021D800032858085E0C704958195E1C7029581954 :1021E800C09148B8F00C003C9828B42878089508A5 :1021F8005EFC71E85808F0091700F1F91001F1F8D0 :10220800120A9509B4285EFC00007B08000011C082 :10221800D4314BC8300A10941499910A1893301A83 :102228004B984BA7910A3EE14B921296C0280A9907 :10223800E0682710C0485808C5602018664AE21AA6 :102248000201E04A0201CF81C4F8F2C5FFFFE20AA9 :102258001800CEE10F9BF7DBC0C15825E0890005C7 :102268003038300AC2E80FAA3038C148580BC0A02D :10227800EE08070EEE08000CA96E2FE8199C1C0842 :10228800C058F0CCFFFFEE080708201AF80800082D :102298005C5A10395F9CEC0A18005F9EFDEC000C3C :1022A800EC0C1800CE4110395F09F9DAC008EC0CC3 :1022B80018005F0CF9E90009EC091800C020D83AA9 :1022C800840C3009F20C1900CB34201D5C6A1ADB2F :1022D8001AD849081ADA490C1AD51AD8F01F000F6B :1022E8002FADCA6BDA3A662A68085C5A2FF8EE09ED :1022F8000B0A8908E0480063FE9AFFA9305CD832CF :10230800000014B0000011B8000014B8000016A2B4 :102318008003792C80037AB0800094C4D431202DB6 :102328004C68149570081896169712945808C0713E :10233800FACAFFF814F8F01F0042CC38198830198F :10234800B6881998B6A9EA18FFFFE818FF80B6986A :102358004BC89088EDB80002C171189330023EE175 :102368000788201D4B8C1AD8F01F00382FF22FED4C :102378000788E2081800C0502FF3E0420400CF118C :102388004B3CF01F00320DC83099F2081800E08865 :1023980000114B09920A3009F20A1900E0840091F1 :1023A8001AD84AD84ADC1AD8F01F00282FEDC88856 :1023B800E0450032C290A3684A99E0450033C5D091 :1023C800129B7209F2080309EECAFFFCF3360020DB :1023D8003009AEB6C088760CF808030CF809070C6B :1023E8002FF914CCEC091900CF7349A99289EDB9DA :1023F8000004C5F149A97209F2080308499C1AD8D2 :1024080049581AD8C538304BA368495A7409F20894 :10241800030972C9AEBBF20B1618AEC9AEFBF7D9E9 :10242800C108F3D9C208AEDBAEE948A99289EDB973 :102438000004C1903046C3D80000152C800020D479 :10244800000016A080037AF0800094C4800384D42E :10245800000016A28003785880037AF8000015203F :1024680080037B187409F208030870C8496C1AD8ED :10247800304649681AD8C1A8301AAEBA720AF408A8 :10248800030AF53A0038AECA491A948AEDBA00042C :10249800C0303016C0E87209F2080308F138003875 :1024A80048CC1AD8301648981AD8F01F000B2FEDD0 :1024B8003EE80C07AEC83008AED82FB6A806302CB8 :1024C8002FEDD83280037B2880037858000016A2AD :1024D80080037B38800094C4D421204D4A981897F3 :1024E800118A580AC0313FF6C0D84A7811BC118EFB :1024F800119611A8B166EDEE1186EDE81086F9E6A1 :1025080010064A289088EDB80002C0E14A08201D4C :102518004A0C1ADA1AD61AD8505B5049F01F001E16 :102528002FCD4009401B49D870085808C081FACA05 :10253800FFF00E9C14F8F01F001AC2080F88B68826 :102548000F98EA18FFFFE818FF80B6983018B6A869 :102558003048B6B8F1D6C108B6E83EE8EC0A161815 :10256800B6F6F7680008B6CA3008EDD6C208F768AC :102578000009B6D63098302CB2082FCDD8220000EA :102588000000152800007B28000016A28003782090 :1025980080037B48800094C40000152C800020D460 :1025A800D401580BC0313FF8C0C8178A17B917981B :1025B800B168F1EA118817AAF1EA1088F3E810085F :1025C800F00A161848E9B28AF5D8C208B2B8B29A21 :1025D800F5D8C108B2AA48B99289EDB90002C0A1DC :1025E800201D1AD848881ADC488C1AD8F01F000811 :1025F8002FCD30194878B089D802000000007B2818 :10260800000016A28003799C80037B74800094C428 :1026180000001528D431204D4AE8189570081697FF :1026280012965808C071FACAFFF014F8F01F002A71 :10263800C4D84AA89088EDB80002C1711894300334 :102648003EE20988201D4A6C1AD8F01F00262FF395 :102658002FED0988E4081800C0502FF4E043040067 :10266800CF114A1CF01F001F0B880BCCAE880B98AB :10267800EA18FFFFE818FF80AE983004BA445014F7 :102688003025FACAFFFCAEA5301BF01F0018304AEF :10269800EF64000CEF6500084018F0091618AEF852 :1026A800AEC99A49AEBAF5D8C108F1D8C208EF69DF :1026B800000AAED8AEEA3EE8F3D9C108EF68000BCD :1026C800EF69000930C8302CAC082FCDD832000093 :1026D8000000152C800020D4000016A080037AF09A :1026E800800094C4800384D4800021C8D40148A801 :1026F8009088EDB80002C0E148887008201D1AD8FB :10270800487811881AD84878487C1AD8F01F0007EA :102718002FCDDA0A000016A200000008000016AB50 :10272800800379E480037BA8800094C4D42148E620 :10273800189E30076C0C580CC0A02FF72EC6E04727 :102748000024CF91489CF01F000ADC2A4866EE0757 :102758000027EC070027EF680010AECE8F0B8F2AFA :102768008F39D822000011E080037BC4800094C414 :10277800D4214C8618970C9A302830094C6B310CB0 :10278800F01F00460C9A302830094C5B311CF01FB2 :1027980000430C9A302830094C2B312CF01F003F95 :1027A8000E990C9A30284C0B314CF01F003C0E99B6 :1027B8000C9A30284BDB315CF01F00383018300998 :1027C8004BBA4BCB320CF01F003530184BA73009F1 :1027D8000E9B4BAA321CF01F00310E9B301830099B :1027E8004B7A322CF01F002D4B6532390A9A0E9B1A :1027F8003018129CF01F002932490A9A0E9B301893 :10280800129CF01F002632590A9A0E9B3018129C0F :10281800F01F00220A9A32690E9B3018129CF01F92 :10282800001F0C9A302830094A7B336CF01F001BBC :102838000E9B301830094A5A327CF01F00180C9A47 :10284800302830094A2B330CF01F00144A1533394D :102858000A9A0E9B3018129CF01F001033190A9A1E :102868000E9B3018129CF01F000D0A9A33290E9BFC :102878003018129CF01F00090C9A30283009496B57 :10288800334CF01F00060E9B30183009493AC278C5 :10289800800020D48000427C8000273480004118CA :1028A8008000433080003FD080003EA88000208810 :1028B800800026F48000208480002114800035ECFC :1028C80080003514800034A480004B5480003740C9 :1028D8008000232480003678800024E0335CF01FD9 :1028E80000370C9A302830094B5B328CF01F0033CC :1028F8000C9A302830094B3B32DCF01F00300C9A20 :10290800302830094B0B32ECF01F002C0E9B30188E :1029180030094AEA329CF01F00290E9B3018300912 :102928004ABA32CCF01F00250E9B301830094A9A5B :1029380032BCF01F00220C9A304830094A6B344CE4 :10294800F01F001E0E9B301830094A4A32ACF01FA7 :10295800001B0E9B301830094A1A345CF01F001710 :102968000E9B3018300949FA32FCF01F00140E9BF8 :102978003018300949CA337CF01F00100E9B3018FC :10298800300949AA338CF01F000D0C9A30483009E1 :10299800497B346CF01F00090C9A30283009495BD8 :1029A800339CF01F00060E9B30183009492A33ACBF :1029B800F01F0002D82200008000273480003D88E4 :1029C80080003AC8800038B4800033FC800030D4DE :1029D800800032848000375C800032088000300438 :1029E8008000332880002F8C80002EC4800038841B :1029F800800037CC8000261CD4013038580B5F1972 :102A0800F00C18005F88F3E80008C060F40C0019A7 :102A180048D8F009092B48D89088EDB80001C111B1 :102A280048B848C9580AF20A1700F00A171048A807 :102A38001ADA1ADB1ADC489C1AD8F01F00092FCDC5 :102A4800D802000000007B08000016A280037BDC8F :102A580080037BE4800378C080037BF0800094C40B :102A6800D401580BF60A1700F7FA180BF01F0002EA :102A7800D802000080002A00D401320A300B483CFA :102A8800F01F0003D802000000007B088002E8BCA9 :102A9800D421206D3087FAC6FFF00E9A4C6B18953A :102AA8000C9CF01F0046304B0C9CF01F0045300872 :102AB800FB68000DBA88FB680009FB68000BFB681F :102AC800000CEE784240501830480E9BFB67000817 :102AD800FB68000A300AFE7C2400F01F003A1897B1 :102AE800C0F04B989088EDB80002C0814B78201D4B :102AF8004B7C1AD8F01F00372FED301CC5A8E06AB0 :102B0800F980EA1A03371A9BFE7C2400F01F003272 :102B1800582CC0D14AC89008EE081900C0844AB899 :102B2800201D4AEC1AD8F01F002B2FEDD303300AD2 :102B3800E06B01204AACF01F002BD503E1B8000080 :102B4800EE180001F5D8C201C020D303FE78240096 :102B58003019705BF7D9D001915B705BF7D9D0C1A0 :102B6800915B705BF7D9D081915B580AC020D5037F :102B7800FE7C2400F01F001C0A9CF01F001C364A33 :102B8800300B49BCF01F001BE06A0400300B49AC55 :102B9800F01F0018E06A0400300B498CF01F001584 :102BA800F01F0017497830079107F01F00170E9C97 :102BB8002FADD822800382078002E7368000A280EA :102BC8008000A618000016A2800379BC80037C0848 :102BD800800094C48000A73C80037C2880002C10CF :102BE8008000A3A08000A7EC80002778000014B81C :102BF8008002E8BC00000DB8000009B880002A80F7 :102C0800000000088000751CD401E1B80000EE182F :102C18000001F5D8C201C020D303FE782400301982 :102C2800706BF7D9D001916B706BF7D9D0C1916BEC :102C3800706BF7D9D081916B580AC020D503FE7C00 :102C480024007848EDB80000C0F1F01F0016C0C19C :102C5800319CF01F0015495890092FF9B009301917 :102C68004938B089C1B8E1B80000EE180001F5D8BC :102C7800C201C020D303FE7824003019705BF7D955 :102C8800D001915B705BF7D9D0C1915B705BF7D9CC :102C9800D081915B580AC020D503D402D603000026 :102CA800800022188000A2E6000014B40000151C61 :102CB800D4313006189714931694950618983E093F :102CC800C2C81095118A2FF8F20A1800C251580686 :102CD800C21049E890093008F0091900C064089B3F :102CE8000E9C5C7BF01F001A49A890093008F00977 :102CF8001900C1040C070F98201D1AD849681AD466 :102D08001AD690881AD84958495C1AD8F01F001565 :102D18002FAD8706C1882FF60836CD4548D89009CB :102D28003008F0091900C0353005C0D8201D48A862 :102D38001AD690881AD8489848BC1AD83005F01F77 :102D480000092FCD0A9CD832000016A680013DB498 :102D5800000016A2000014B4800378D080037C48D9 :102D6800800094C480037C6CD42118971696F01FB9 :102D780000325F080E3C5F191895F1E91009C03060 :102D88005808C5710B893E08F0091800C5210B9930 :102D98003008F0091800C4D5E2190040C0E1EACAB9 :102DA800FFFD0BAC1298C068158B2FF92FFB160A84 :102DB80016081839CFA5C2384A089088EDB800021D :102DC800C0D149F8201D49FC1AD8F01F001FF7D6BA :102DD800C0100E9CF01F001D2FED3009EACAFFFD40 :102DE8000BAC1298C0A81587159B2FF9F7E7108B25 :102DF8002FEB160AF60800081839CF6510053EE9CA :102E08000BB8F2081800C021DA2A4919920A3009C9 :102E1800F20A1900C0E4201D1AD848E890881AD888 :102E2800487848DC1AD8F01F0008300C2FCDD8227B :102E3800D82A000080002CB8000016A080037974FE :102E480080037C84800094C480013DB4000016A2F5 :102E5800000014B480037C8CD4014918581CC0713C :102E68003039334C9109F01F000FC0683049334C9A :102E78009109F01F000D48D89088EDB80002C0D124 :102E880048787008201D1AD848981AD8489848AC2D :102E98001AD8F01F000A2FCDD80200000000000841 :102EA8008000A2E68000A300000016A280037A3CFE :102EB8008003821080037CB0800094C4D421FACDB2 :102EC80001004AC81697700512965805C071FACACB :102ED800FF0014F5F01F0028C4A81989301AB68914 :102EE8001999B6AAEA19FFFFE819FF80B69919B926 :102EF800F4091800C20119C53FF8F0051800C1B05F :102F0800E06A00FF300B1A9CF01F001C1A9430086E :102F1800C048E8080B082FF80A38CFC51A94AEB590 :102F2800EEC8FFFCFA050009C038093A10CA123485 :102F3800CFD1C15849256A0CF01F00120A98EECA71 :102F4800FFFCEBDCC0083009AEB5C068700BF609B1 :102F5800070B2FF914CBEA091900CF933EE80A07AB :102F6800AEC83008AED82FB5302CAC052C0DD82201 :102F78000000152C800020D48002E8BC0000011459 :102F88008002EDD0D421202D49981697700E129604 :102F9800580EC071FACAFFF814FEF01F0016C25886 :102FA8001989B6891998EA18FFFFE818FF80B698BA :102FB80030184915B6A86A0CF01F0010EEC9FFFCBE :102FC8005C5C3008AEBCC0686A0AF408070A2FF8CF :102FD80012CAF8081900CF933EE818072FBCAEC8EC :102FE8003008AED8AC0C302C2FEDD8220000152CB0 :102FF800800020D4000001148002EDD0D421202DBF :103008004AE818967008169712955808C071FACAB7 :10301800FFF814F8F01F002AC4D84AA811D4303891 :10302800F0041800E08B0046FACAFFFC1A9B089CC3 :10303800F01F00250D88C300AE880D98EA18FFFF21 :10304800E818FF80AE983018AEA81BC8AEB89A280A :10305800AEC83008C0B8F3D8C010400BF1DAB010D1 :10306800EE09000AF6090709B4D9F0CAFFFF9A2940 :10307800F2081900CF13F1D9C010EE0800083EEA93 :10308800B0DA9AA82FA910073008AEE8AA09089C58 :10309800F01F000EC0E8AE880D98EA18FFFFE81888 :1030A800FF80AECCAE98AEAC3EE8AEB83048AA08C9 :1030B800302C2FEDD82200000000152C800020D4E1 :1030C80000000DB880006BF480006FBCD431202D57 :1030D8004C5818967008169712955808C071BAE897 :1030E800FACAFFFAF01F0041C728F8C8FFFDC3C09D :1030F80011842FF4F0040004C37009893018F00912 :103108001800C67109993EE8F0091800C6214B88D5 :1031180090093008F0091900C5C44B681AD44B6CE3 :103128001AD8F01F00362FEDC548099309A9F3E313 :1031380010835C83C54809893018F0091800C1510B :1031480009993EE8F0091800C1014A989009300829 :10315800F0091900C0A44A781AD44A7C1AD8F01F7A :1031680000272FEDC02830030DB43018F0041800E4 :10317800C2D10DCC3038F00C1800E08B0028F5D304 :10318800C008FACBFFF9F01F001E0D88C120AE88D9 :103198000D98EA18FFFFE818FF80AEB4AE98AEA409 :1031A8001BF8AEC83EE8AED83008AEE83068C0D8E4 :1031B800AE880D98EA18FFFFE818FF80AE983EE841 :1031C800AECCAEB8AEAC3048AA08302C2FEDD83211 :1031D80009883029F2081800CA9030032FF8100423 :1031E800CAB1CC3B0000152C800020D4000016A2E8 :1031F8008003780C80037CBC800094C480006FE05E :10320800D421202D49A81697700E1296580EC07119 :10321800FACAFFF814FEF01F0017C2681989301A9D :10322800B6891999B6AAEA19FFFFE819FF80B69975 :1032380019B9F4091800C0D119C83039F2081800B2 :10324800E08B000848C9F208033CF01F000CC028B6 :10325800300C3018AEB83EE8AECCAED83008AEE888 :10326800302C3068AC082FEDD82200000000152C57 :10327800800020D400007B0880004D78D421202DC8 :103288004A181697700E1296580EC071FACAFFF8AF :1032980014FEF01F001EC3481989301AB6891999FF :1032A800B6AAEA19FFFFE819FF80B69919B9F40917 :1032B8001800C0B119CC3038F00C1800E08B0006AB :1032C800F01F00135C8CC028300C3028AEB83EE8E4 :1032D800AECCAEE85C7CF8081608AED83008AEF87C :1032E8003078AC0848B89088EDB80002C08148A88A :1032F8001ADC48AC1AD8F01F000A2FED302C2FED3D :10330800D82200000000152C800020D480006D38E1 :10331800000016A8800378A880037CD8800094C495 :10332800D421202D4AA81697700512965805C07109 :10333800FACAFFF814F5F01F0027C4781989301A63 :10334800B6891999B6AAEA19FFFFE819FF80B69954 :10335800303819B919C5F40918005F09F0051800C3 :103368005F881268C19049C8F00503345804C060EA :10337800089C301BF01F0019C10849989009E809FA :103388001900C0A449781AD5497C1AD8F01F00172B :10339800089C2FEDC028300C3018AEB83EE8AECCF3 :1033A800AED83008AEE83068AC0849189088EDB857 :1033B8000002C0A148B8201D1ADC48EC1AD51AD85A :1033C800F01F000A2FCD302C2FEDD8220000152C2D :1033D800800020D400007B0880004F1C000016A647 :1033E8008003794080037CEC800094C4000016A818 :1033F80080037D10D421202D4A181697700E12963E :10340800580EC071FACAFFF814FEF01F001EC34818 :103418001989301AB6891999B6AAEA19FFFFE81965 :10342800FF80B69919B9F4091800C0F119C83039E4 :10343800F2081800E08B000A4939F2080038300B0E :10344800701CF01F0012C028300C3018AEB83EE8CF :10345800AECCAED83008AEE83068AC0848C8908822 :10346800EDB80002C08148B81ADC48BC1AD8F01F71 :10347800000B2FED302C2FEDD82200000000152C6A :10348800800020D400007B0880004F1C000016A894 :1034980080037A6480037D28800094C4D40149584D :1034A8009088EDB80002C08149381ADC493C1AD826 :1034B800F01F00132FED49383009118AF20A18005D :1034C800C021DC0AB089F01F0010581CC1004898C0 :1034D80090093008F0091900C025DA0A48681ADC92 :1034E80048AC1AD8F01F0006301C2FEDD802000097 :1034F800000016A28003798480037D38800094C47C :10350800000016AA80019EF880037D54D421202D46 :103518004B281496700E16971295580EC071FACA59 :10352800FFF814FEF01F002EC5681989B68919988E :10353800EA18FFFFE818FF803014B698B6A4F01F09 :103548000029C3E0E0460025C260E0460026C3200B :10355800EEC9FFFCE0460024C0F0129AF9380020BA :103568003009AEB8C058F809070B2FF914CBF00989 :103578001900CFA3C28830682DACAEB8306A3008C5 :10358800198B12CB2FF8201C5C88F4081900CF91F6 :103598003068C19878C8F0091618AEF93049AEC835 :1035A800AEB9F3D8C108F1D8C208AED9AEE83048F0 :1035B800C0A8AEB4F9380038AEC83018C048AEB4A8 :1035C800AECC18983EE91007AEC93009AED92FB86D :1035D800302CAA082FEDD8220000152C800020D40A :1035E8008001997CD421202D49F8189670081697E7 :1035F80012955808C041FACAFFF8C1881988B688D8 :103608001998EA18FFFFE818FF803019B698306853 :10361800B6A9B6B81A9CF01F0015581CC0B00A9974 :103628000E9B0C9CFACAFFF8300814F8F01F001023 :10363800C1881BD8AEC81BC8AED81BB8AEE81BA83B :10364800AEF81B98EF6800081B88EF6800093EE891 :10365800EF68000A3008EF68000B302C30B8AA0871 :103668002FEDD8220000152C80019128800020D44D :10367800D421FACD010016961A971A9C173AF01F12 :103688000025FAC9FF000D88F20800083009F16921 :10369800FF004A189088EDB80002C08149F81AD78F :1036A80049FC1AD8F01F001F2FED300849E749FAE6 :1036B800AE88AE98AEA8AEB8B488109949CA0E9B29 :1036C8001A9C1A96F01F001B5C5CC040E06C00FF5F :1036D800C1E849189088EDB80002C1510F8A0FB9A6 :1036E8000F98B168F1EA11880FAAF1EA1088F3E897 :1036F8001008201D1AD848981AD648FC1AD8F01F66 :1037080000092FCD30194898301CB0892C0DD822CB :103718008002E736000016A280037A7C80037D646D :10372800800094C400007B2800001528800025A88C :103738008000C4C080037D84D401F01F0006E068C7 :1037480000FF581CF00C1710F9BC0001D80200004B :10375800800199CCD42118971696335CF01F001677 :103768005827C1F10D980D89F1E910893018F00931 :103778001900C1710DA80DBA0DC9303BF608180023 :10378800E0880004300CC04848CBF608033CA96A1E :10379800ECCBFFFB120A5C7AF01F00091897C028CF :1037A8003FF7335CF01F0007E06C00FF5817F9BCC7 :1037B8000001D8228000A30000007B08800053C0CD :1037C8008000A2E6D421202D581CC4211789F809AD :1037D8001800C3E1F6C8FFFE1796C170118AF20AF5 :1037E8001800C131119A3EE9F20A1800C0E149B93E :1037F800920A3009F20A1900C0841AD84988499CEB :103808001AD8F01F00192FED3008FACAFFF8300B4C :1038180014E80C9CF01F00159A3A18973038F006F7 :103828001800E0880004300CC0484918F006033C32 :103838005C7A0E9BF01F000F18950C9CF01F000E71 :103848000E9CF01F000E5815C0310A9CC038E06C61 :1038580000FF2FEDD8220000000016A28003795C3B :1038680080037CBC800094C4800072DC00007B086C :103878008000514080006E188002E28CD401582CE0 :10388800C13117981789F1E910893018F009190022 :10389800C0B117C817BA17ACA96A2FBBF00A000A3B :1038A8005C7AF01F0002DA0A80007380D421581C69 :1038B800C391580BC0311697C1E81788F80818004B :1038C800C3411797C33817893018F0091800C13158 :1038D80017993EE8F0091800C0E1497890093008C6 :1038E800F0091900C08449581ADB495C1AD8F01F3E :1038F80000152FED49089088EDB80002C08148F8FE :103908001AD7491C1AD8F01F000F2FED3038F007CE :103918001800E08B000848D8F007033CF01F000CA3 :10392800DA2AE06C00FFD82230072FF8100BCCC140 :10393800CE2B0000000016A2800379F880037CBC1F :10394800800094C480037DA800007B088000599CF7 :10395800D421202D4B981896169414971295908878 :10396800EDB80002C1314B694B685805F2081700E1 :10397800201D1AD816985C781ADA1AD84B281ADC3F :103988004B2C1AD8F01F00322FAD3038F007180032 :10399800E0880005E06C00FFC8584AE8F0070338E3 :1039A80050085808C1504A59920A3009F20A1900B9 :1039B800C0841AD84A484A8C1AD8F01F00252FED1F :1039C800400CF01F002630094A28F00709391A9CD4 :1039D800E06A04005016300B1ADC14981AD75C748D :1039E8001ADB16991AD5089C1ADA169A1AD6F01FF5 :1039F800001C49282FAD580CC3819088EDB80002EF :103A0800C1511AD71AD41AD6403850461AD848D8AD :103A180048B95805F2051700F005171048A81AD537 :103A2800490C1AD8F01F000A2FAD0E9C400BF01F4E :103A3800000E301CC3780000000016A280037DC869 :103A480080037DC4800379C480037DCC800094C446 :103A580000007B0880037DF88000599C80005D642D :103A680080037E2480002A689088EDB80002C15146 :103A78001AD71AD41AD6403850461AD848B848C95E :103A88005805F2051700F005171048A81AD548ACD4 :103A98001AD8F01F000A2FAD300948983FFCF007EC :103AA80009392FEDD822000080037DC480037DC82A :103AB800800379C480037E50800094C400007B0892 :103AC800D431584CE081008E580BC2A01785F805F8 :103AD8001800E081008A179817A7B167EFE81187E7 :103AE80017B8EFE8108717C8F1E71007C7E80B8980 :103AF8003018F0091800C7E10B993EE8F0091800E2 :103B0800C7914C2890093008F0091900C7344C08AF :103B18001AD54C0C1AD8F01F00402FEDC6B81697CE :103B28003006C1F80B960BA8F1E610865C86C688AD :103B380007893018F0091800C72107993EE8F009ED :103B48001800C6D14B1890093008F0091900C6743E :103B58004AF81AD34AFC1AD8F01F002F2FEDC5F8DF :103B68003005C1B80795C61809893018F00918003A :103B7800C61109993EE8F0091800C5C14A389009EC :103B88003008F0091900C5644A181AD44A1C1AD812 :103B9800F01F00212FEDC4E83003C1A80993C50820 :103BA80009893018F0091800C13109993EE8F0096F :103BB8001800C0E1495890093008F0091900C0847C :103BC80049381AD4493C1AD8F01F00132FED06992A :103BD8000A9AF7D6C0100E9CF01F0010581CC0306F :103BE800E06C00FFD83230072FF5F6050005C80154 :103BF800C98B0B833028F0031800C95030062FF307 :103C0800EA030003C961CADB000016A280037A98A0 :103C180080037CBC800094C4800039580784301825 :103C2800F0041800CA0030052FF4E6040004C9D1D6 :103C3800CB4B09883019F2081800CB1030032FF845 :103C48001004CAF1CC5B0000D421202D3038169620 :103C58001494F00B1800E08B0072300750074BA843 :103C68001188EE081800C0B04B889008EE081900BB :103C7800C654201D4B684B7C1AD8C0F84B69138971 :103C8800F0091800C0E14B589008EE081900C56407 :103C9800201D4AF84B2C1AD8F01F00322FEDC4E82B :103CA8001A9AE0690400501712981ADAEBDCC0106F :103CB8001ADB0E9A1AD70E9B1AD40A9C1AD93019F5 :103CC8001AD7F01F00294A182FAD580CC1B1908897 :103CD800EDB80002C1114A584A595804F2041700B5 :103CE800F004171049A81AD64A2C1AD51AD41AD88B :103CF800F01F001C2FCD0C9C400BF01F001F301C28 :103D0800C1F89008EE081900C11449884989580477 :103D1800F2041700F004171048D81AD6497C1AD5AF :103D28001AD41AD8F01F000F2FCDA17630092FF61C :103D380049383FFCF0060929C038E06C00FF2FED38 :103D4800D822000000007B07000016A280037A102A :103D580080037E80000016AB000016A680037EA0BC :103D6800800094C480005D6480037DC480037DC8A6 :103D780080037EB880002A6880037EDC00007B0810 :103D8800D421583CC661580BC24017843028F0042F :103D98001800C621179717A8F1E710875C87C5D8C0 :103DA80009893018F0091800C5D109993EE8F009C9 :103DB8001800C5814B6890093008F0091900C5241E :103DC8004B481AD44B4C1AD8F01F00342FEDC4A816 :103DD80016973006C1B80996C4B80B893018F0098F :103DE8001800C4B10B993EE8F0091800C4614A886C :103DF80090093008F0091900C4044A681AD54A6CB9 :103E08001AD8F01F00262FEDC3883004C1A80B94E0 :103E1800C3A80B893018F0091800C1310B993EE886 :103E2800F0091800C0E149A890093008F009190004 :103E3800C08449881AD5498C1AD8F01F00182FED6C :103E48000E9C089A0C9B5C7CF01F0015581CC03017 :103E5800E06C00FFD82230072FF4F6040004CA11E2 :103E6800CB9B09853018F0051800CB6030062FF57C :103E7800E8050005CB31CCAB0B883019F2081800E7 :103E8800CC7030042FF81005CC51CDBB000016A221 :103E98008003791480037CBC800094C480003C506B :103EA800D431204D1495740A501A18961788301971 :103EB800F2081800C771F6C7FFFE1794C1700F8982 :103EC800F0091800C1310F993EE8F0091800C0E167 :103ED8004B7890093008F0091900C0844B581AD75C :103EE8004B5C1AD8F01F00352FED4B189088EDB8B1 :103EF8000002C0A14AF81AD44B1C1AD61AD51AD8EF :103F0800F01F002E2FCD3028F0041800E08B004B56 :103F18003006304030114A624A63C3E80F88E0082F :103F28001800C4010F990FA8B168F1E911880FB9F9 :103F3800F1E910880FC92FB7F3E810085807C170C6 :103F48000F89E2091800C1310F993EEAF4091800F7 :103F5800C0E18409300AF4091900C0941AD7496CE1 :103F68001AD35028F01F00152FED400850388489C7 :103F7800EDB90002C0A11AD84029492C1AD91AD67D :103F88001AD3F01F000E2FCDF9D6C008FACBFFF4D4 :103F98002FF6F01F000D0836CC253008301CAAC8B3 :103FA800C038E06C00FF2FCDD8320000000016A208 :103FB80080037A4C80037CBC800094C480037F0813 :103FC80080037F308000C19CD431203D3019149487 :103FD800189674051788F2081800E0810085F6C75E :103FE800FFFE1792C1700F89F0091800C1310F99AF :103FF8003EE8F0091800C0E14BD890093008F009F4 :104008001900C0844BB81AD74BBC1AD8F01F003B14 :104018002FED4B789088EDB80002C0A14B581AD20A :104028004B7C1AD61AD41AD8F01F00342FCD30384A :10403800F0021800E08B005830064AD04AD1FAC383 :10404800FFF8C4B80F88304AF4081800C4C10F99A3 :104058000FA8B168F1E911880FB9F1E910880FC903 :104068002FB7F3E810085807C1800F89301AF409F0 :104078001800C1310F993EEAF4091800C0E180091F :10408800300AF4091900C0941AD749BC1AD150282B :10409800F01F001A2FED400850288089EDB9000262 :1040A800C0911AD8497C1AD51AD61AD1F01F001314 :1040B8002FCD5816C0805826C0B0069B0A9CF01F0A :1040C8000012C0A8069B0A9CF01F0010C058069B4F :1040D8000A9CF01F000F2FF60436CB553008301C11 :1040E800A8C8C038E06C00FF2FDDD832000016A247 :1040F800800378F080037CBC800094C480037F0830 :1041080080037F308000CBC88000CA748000CA92C8 :10411800D421FACD00884C6816979088EDB8000233 :10412800C0B14C48201D1ADC1AD84C384C3C1AD85F :10413800F01F00432FCD344A300BFAC6FFFC0C9C0D :10414800F01F0040306AE06B00FFFACCFFDBF01F85 :10415800003D0F8A31F8F00A1800E08B008930889A :10416800EECBFFFFFB68003C0C9CF01F00370F896B :10417800FB6900244AE89088EDB80002C0A14AE82B :10418800201D4B2C1AD91AD61AD8F01F002D2FCD66 :104198000F882FF8FAC6FFB810070C9C0E9B173A29 :1041A800F01F002BFAC9FF780F88F20800083009C1 :1041B800F169FFC049E89088EDB80002C0B10F88E6 :1041C800201D1AD849C81AD64A2C1AD8F01F001C24 :1041D8002FCD0F8A3018FAC7FFFC3089FACBFFB809 :1041E8000E9CF01F001D581CC0C0491890093008CB :1041F800F0091900C3C44908498C1AD81AD8C0E86C :10420800497CF01F000F0E9C300BF01F001618970A :10421800581CC080201D1ADC493CF01F00092FEDF6 :10422800C268492CF01F00060E9CC238000016A276 :1042380080037A248003787080037F50800094C4C0 :104248008002E8BC8002E73680037CB08002EE0C76 :1042580080037F648001908480037F7880037FA03F :10426800800099A880037FB880037FC0E06C00FFBE :104278002DEDD822D42120AD4A461697178A31F859 :10428800F00A1800E08B002FFAC5FFF92FFB0A9CF3 :10429800F01F001F0F88FAC9FFD8FB680027100914 :1042A8003008F368FFDF8C88EDB80002C0814998B8 :1042B8001AD5499C1AD8F01F00192FED300BFACCEB :1042C800FFF9F01F00171897581CC1B048F890095B :1042D8003008F0091900C1541ADC48E8491C1AD8FA :1042E800C0D88C093008F0091900C0353FF7C098CC :1042F800201D488848CC1AD83FF7F01F00082FED3A :104308000E9C2F6DD8220000000016A28002E7360E :10431800800378E080037B18800094C4800099A80B :1043280080037D5480037FC4D431216D4D281697B6 :104338009088EDB80002C0B14D08201D1ADC1AD8CB :104348004CF84D0C1AD8F01F00502FCD321AFAC66F :10435800FFFD300B0C9CF01F004D0F8A31F8F00A5E :104368001800E08B0085EECBFFFF0C9CF01F004887 :104378000F88FB6800234C089088EDB80002C081C4 :104388004BF81AD64C3C1AD8F01F003F2FED0F8679 :104398002FF6EE060006FAC7FFAC0C9B0E9C173AE8 :1043A800F01F003D0D88FAC9FFA8F20800080E9C0E :1043B8003003F163FFFCF01F00393038EFDCC00830 :1043C8000D89F00718005FB53018F00918005F185C :1043D80010450A94E6051800C4A1ECCBFFFDFAC30A :1043E800FFDC2FE6069C0D8AF01F002B0D88FAC90A :1043F800FFA8F2080008069BF165FFCCFAC5FFC0CC :104408000A9CF01F002730D81896F00C18005F1986 :104418003058F00C18005F18F3E80008E808180096 :10442800C261FAC4FFB2306AE06B00FF089CF01F5B :1044380000170C9B08990A9A0E9CF01F001A0E9CF4 :10444800F01F0019300BFACCFFFDF01F0018581CA4 :10445800C100489890093008F0091900C0844888BC :104468001ADC493C1AD8F01F00082FEDE06C00FF59 :104478002EADD832000016A280037888800379AC6C :1044880080037F50800094C48002E8BC8002E73635 :1044980080037FE48002EE0C8002DC2C80009868A8 :1044A8008001927080019258800099A880037D5401 :1044B800D401319CF01F0010E06B00EFFE7C280057 :1044C800F01F000E581CC060FE7C2800F01F000C76 :1044D800CFC0319CF01F000B48B890093008F00994 :1044E8001900C0844898201D489C1AD8F01F00095C :1044F8002FEDD8028000A3008000A7FA8000A7F261 :104508008000A2E6000016A28003790880037FF0ED :10451800800094C4D431202D3008FAC7FFF81696CD :10452800189514930EE81694098B0A9C2FF4F01F23 :104538000009581CC0B00E9B0A9CF01F0007089881 :104548000C18E6081900CF13300C2FEDD8320000F4 :104558008000A7FA8000A816D421202D30081496D0 :10456800F80C002C129AFAC9FFF812E84A88F00CE5 :10457800002C169578280C9B0A9C5D184A583049DF :10458800319C9109F01F00249ABA0C9BFE7C2400F0 :10459800F01F00221897319CF01F00214A189088BC :1045A800EDB80002C0414A0CF01F002049D890889D :1045B800EDB80002C0D149E8201D49EC1AD8F01F17 :1045C800001B49D80A9C908BF01F001C2FED4958FE :1045D8009088EDB80002C041499CF01F00144918AA :1045E8009088EDB80002C0C14918201D491C1AD88E :1045F800F01F000E9AFB0C9CF01F00102FED9A394B :1046080049080E9CB0092FEDD8220000000011E0E7 :10461800000011B88000A3008000451C8000A2E6BD :10462800000016A080038008800094C480037800EE :1046380080037C84000011BE80013DB48003800C9F :10464800000011BCD431202D4BC43048E8C3FFF022 :10465800BAF81897199616910C90F8C2FFFD2FC456 :104668003005E21000400988EC081800C4B107883A :104678003029F2081800C1F10A9C4B08EA05002508 :10468800029AF00500240E9BE8C5FFF46839F01F74 :10469800002CC030301CC4E868086A0A049B0FACC0 :1046A8005D18BAFCE216004030181BF9F009180032 :1046B800C3C1C3D85800E00A1700F9BA0100E8F8E6 :1046C800FFFC049B0FAC5D18BAFC30190788F20890 :1046D8001800C0B10A9C4998EA050025029AF0051D :1046E80000250E9B6A39C0A83049F2081800C0A1FD :1046F800029A0E9B0A9CFAC9FFF9F01F0011C170BB :10470800C1882FF52EC42EC3E0450024CAD148D84D :1047180090093008F0091900C08448B81AD648BC76 :104728001AD8F01F000B2FED302CC048304CC02891 :10473800300C2FEDD8320000000011E080004560F9 :10474800000016A28003789880038010800094C42B :10475800D421202D4BD8910C30094BD8118AF20A5C :104768001800E08000DAB08930085018E1B800007D :10477800EE180001F5D8C201C020D303FE7824004A :104788003019706BF7D9D001916B706BF7D9D0C124 :10479800916B706BF7D9D081916B580AC020D50303 :1047A8004AC7FACAFFFC6E0B4ABCF01F002C1896C9 :1047B800C6E04AB8303A6E09910A401B4A98161961 :1047C800B009E06A03FFF4091900E0880005E06910 :1047D8000400B0094A064A37EC0B000B4A2C8E8AB3 :1047E800F01F002230084A2BAC8849FCF01F00213A :1047F800584CC2204A089088EDB80002C0C149F858 :10480800201D49FC1AD8F01F001F8E8B496CF01F21 :10481800001E2FED49889088EDB80002C0D1497874 :10482800201D497C1AD8F01F00174988490C908B25 :10483800F01F00152FED4879300893084899B20801 :1048480048799308C46800000000152C0000151C66 :10485800000014B0000014B880002D70000011B8DA :10486800000011BE00000DB88002E736000009B84C :104878008000464C000016A0800379D880037C8411 :10488800800094C480013DB4000011BCF01F0024D6 :104898004A489008EC081900C0A44A3890881AD8E9 :1048A8004A284A3C1AD8F01F00232FED4A289009BD :1048B8003008F0091900C0644A084A1C909BF01F90 :1048C80000214A19300893084A09B20849C9B28830 :1048D800E06B0120FE7C0D80F01F001DE1B8000098 :1048E800EE180001F5D8C201C020D303FE782400D9 :1048F8003019705BF7D9D001915B705BF7D9D0C1E3 :10490800915B705BF7D9D081915B580AC020D503C1 :10491800319CF01F00102FEDD8220000800044B811 :10492800000016A2000014B4800379D88003802CFC :10493800800094C4000016A6000014B0000014B84B :1049480080013DB4000011B8000011BE8000A20033 :104958008000A300D431207D4B6730054B664B782F :104968001188EA081800EC081710EE0817004B4CDD :104978001AD8F01F00344B481188EA081800EC07D1 :1049880017104B2C50074B2230074B23F01F002DDC :104998000E942FED4B01CBD86A005800E08000B28E :1049A80080286009201D1AD95028F01F002C602A81 :1049B8002FFD580AE60A1700E20A171040185C781B :1049C80060491AD84A681ADC1ADA4A6A5809F40996 :1049D8001700F00917104A4C1AD91AD01AD61AD744 :1049E800F01F001860482F8D5808C431E0C9FFBC7B :1049F800720A580AC0E0744B201D49CC1ADB1ADA37 :104A08001AD850595048F01F000F2FCD40084019B0 :104A18002FF82FC95848CED161585808C610704988 :104A2800493C1AD91AD8F01F00072FEDC598000085 :104A3800800380548003805C000016AB8003806094 :104A4800800094C400007B078003807400007B080A :104A580080037BE480037BDC800096A880037DC410 :104A680080037DC880038088800380B8800380D05D :104A780061E85808C350F11900127008201D1AD8AF :104A8800507850395028F01F002761EA2FFDF53B78 :104A9800001040291AD940281AD81ADC4A2C1ADBE7 :104AA8001ADA50B8F01F0021FACAFFE00C9B5084B4 :104AB800FB5400240E9CF01F001E2FBD40305050A8 :104AC8001AD0FB1800145028F01F00162FFD4018AC :104AD8001AD81AD01ADC497CF01F00142FCD0E9C6E :104AE800F01F001549594968580CF2081710201D85 :104AF800494C1AD8F01F000D493CF01F000C2FED4F :104B08002FF62FC55826FE91FF492FF75847C0505A :104B1800E40700353006C41BF01F000C2FADD83257 :104B2800800096A8800380E8800094C4800021C893 :104B380080038114800070788003812C8003812891 :104B480080038130800381408000D680D431204D9D :104B58004BE812911896169711895809C1A119881E :104B6800B6881998EA18FFFFE818FF80B6C9B69802 :104B7800B6A93EE8B6B83048A2084B589088EDB8B8 :104B88000002E08100E7201D4B284B3C1AD8C228C0 :104B9800FACCFFF4F01F0031403366105800C1E131 :104BA8000D88AE880D98EA18FFFFE818FF80AEA0C0 :104BB800AE9830093EE8AEC9AEB83048A2084A48B7 :104BC8009088EDB80002E08100C5201D4A184A4CC3 :104BD8001AD8F01F00242FEDCBC858B0F9B0020A3C :104BE80030044A12C0786408F004032C2FF4F01F34 :104BF800001F641849C51034CF736A0C3004F01FC5 :104C0800001B8B14661B580BC460A36B301CF01F71 :104C180000188B0CC3A1497CC1486608F002030B3D :104C28006A080408501B5008F01F00134008910C34 :104C3800401B6A082FF4F002030C580CC20148FC10 :104C4800F01F0008C2880000000016AA000016A283 :104C58008003783C8003816080018F048003817C1D :104C6800800094C4000015208002E28C8002DC3CA5 :104C7800800381988002E2A4800381C0344AF01F37 :104C880000376A182FF88B18E8021502344C66189A :104C98001034CC430D88AE880D98EA18FFFFE81849 :104CA800FF803005AE98AEA030364AD20A984AD96D :104CB8000E93640AEA0B1502F40B030AF537002079 :104CC800F4070B08ECCCFFFF2FF7E60C000C5C5741 :104CD800300AE6060B07C0886404E80B0304E80AF8 :104CE80007042FFA18C40E9EEE0A1900CF630E9A15 :104CF8002FFAF4060006928A5C56EDBA0002C1D17A :104D0800640A202DF40B0304503950281A9C306A89 :104D1800E8CBFFDFF01F001168CA1ADAE93A003859 :104D28001ADA491A1AD7491C1AD41AD51ADAF01FEE :104D380000102F8D400840192FF50035CBB53EE8FF :104D4800E6060B08069730080C07AE982FF6A20661 :104D5800302C2FCDD83200008002E7360000152015 :104D6800000016A28003783C800381E4800094C48C :104D780048781188580CC0215EFF5C68100C300818 :104D8800F9390015F00918005F1C5EFC00001530A9 :104D9800D4211897580CC2A04968F129000030089E :104DA800F2CA0004F00900065836F5D8E9062FF8CB :104DB800EE06002C791C163CC17148F89088EDB8B5 :104DC8000001C0A148D81ADB48DC1AD61AD71AD86D :104DD800F01F000C2FCDF9D6C00830082F06EE06BC :104DE80000278F18D8225848CDE1E06C00FFD82260 :104DF80000001530000016A2800382688003830437 :104E0800800094C4D42118971695580CC2B04978DC :104E1800F12900003008F2CB0004F00900065836EA :104E2800F7D8E9062FF8EE06002A751A580AC03096 :104E38000A3AC16148E89088EDB80001C0A148D895 :104E48001AD548DC1AD61AD71AD8F01F000C2FCD5D :104E5800EE060027F9D6C008EF450044D822584886 :104E6800CDD1E06C00FFD82200001530000016A25A :104E780080038CF080038304800094C4D4211897A5 :104E8800580CC2A049E8F12A00003008F4CC00040C :104E9800F00A00065836F9D8E9062FF8EE06002978 :104EA80073195809C170580BC0F049689088EDB85B :104EB8000001C0A149481AD9494C1AD61AD71AD89C :104EC800F01F00132FCDEE06002748D8B0866F1CC0 :104ED800D8225848CDE1580BC10048A8900930089D :104EE800F0091900C0A448881AD748AC1AD8F01F8E :104EF8000008300C2FEDD822D82A00000000153009 :104F0800000016A280038CB880038304800094C438 :104F180080038324D4214CB816951188189730063D :104F2800EC081800E08000B6300BF01F004718941A :104F38005807E0800097580C5F19EC0518005F08C7 :104F4800F3E81008EC081800E080008C4BF8908813 :104F5800EDB80002C3314BE811894BE89088EDB8F1 :104F68000001C2C15C69EE09002871185808C041E7 :104F7800109E1096C098EE09000AF53E0015F2CA78 :104F8800FFF8EE0A03266F5A201D580AF40C170082 :104F9800F5FC10045808F00B1700F1FB10041ADE9A :104FA8001AD61ADC1ADA1ADB1AD84AB81AD74ABC3F :104FB8001AD91AD8F01F002A2F6D5805C3D068488F :104FC80058485F1958085F181268C3304A08118991 :104FD8004A089088EDB80001C2C15C69EE09002852 :104FE80071185808C04110951096C098EE09000A2B :104FF800F5350015F2CAFFF8EE0A03266F5A201D90 :10500800580AF40C1700F5FC10045808F00B1700A8 :10501800F1FB10041AD51AD61ADC1ADA1ADB1AD8D8 :1050280048D81AD748DC1AD91AD8F01F000D2F6DA6 :10503800E93C0013D8226F58F13C0013D822000035 :10504800000016AB80004E84000016A80000153042 :10505800000016A28003828C80038348800094C4D9 :1050680048D890093008F0091900C1345807EE08EB :105078001700EE041700EFF810151AD848781AD45C :10508800487C1AD71AD8F01F0007300C2FCDD82229 :10509800D82A0000000016A88003828C8003838C25 :1050A800800094C4D421580CC25049D8F12900007A :1050B8003008F2CA0004F00900075837F5D8E907A4 :1050C8002FF8F807002E7D1E163EC12149589088FA :1050D800EDB80001C0A149481ADB1AD71ADC493CCF :1050E8001AD8F01F00132FCD0E9C5C5CD8225848AC :1050F800CE31490890093008F0091900C045E06C24 :1051080000FFD8224888201D1ADB1ADC48AC1AD8C0 :10511800F01F0007E06C00FF2FCDD82200001530EB :10512800000016A6800382BC80038304800094C418 :10513800000016A2800383C0D421580C5F18580BB6 :105148005F1918961695F3E800081494C590580A44 :10515800C5704AC89088EDB80001C0C114985C7841 :10516800201D1AD84A881ADB4A8C1AD8F01F002842 :105178002FCD4A889088EDB80001C0D14A28201D5B :105188004A5C1AD8F01F0022089B0A9C5C7BF01F1F :1051980000232FED300A5C74149C089BF01F00203C :1051A8001897C0E149789008F8081900C29449682E :1051B8001AD649CC1AD8F01F00162FEDC1C8089A84 :1051C8000A9B781CF01F00180E9B6DECF01F00174F :1051D8005C5CC12048B890093008F0091900C08407 :1051E80048981AD6492C1AD8F01F00092FED0E9CA2 :1051F800F01F0010DC2A0E9CF01F000EDA2ADC2AB1 :10520800000016A280038CE4800383E8800094C425 :10521800000016A080037C8480013DB48000D31870 :10522800800383FC8002E7368001153880038428D8 :105238008000D13CD421149518971696580CC0417B :10524800E06C00F6D822F01F00163FF8E9DCC00831 :10525800F0041800C041E06C00FFD822491890887B :10526800EDB80001C0E16C48201D1AD848E85C651B :1052780048EC1AD51AD61AD71AD8F01F000D2FAD38 :105288006C4858485F0948B8B0893008EE040004F3 :10529800E9680068F01F00088F7CD82A800050ACAD :1052A800000016A280038D1080038450800094C4EF :1052B80000007B0780009504D43118971695F01FDD :1052C80000353FF8EDDCC008F0061800C5E0EE0632 :1052D80000083009F1690015ECC8FFF8EE0803244E :1052E8005804C5304AC89088EDB80001C0A14AB832 :1052F800201D4ABC1AD41AD41AD8F01F002A2FCD60 :10530800EB1800726EF91238F20817B00838F0047A :1053180017804A589088EDB80001C051F01F00234B :105328004A38910CECC8FFEA3019EE08032B089AAA :105338000A9C5C7AF01F001FE7DCC008C19049A8EE :105348009088EDB80001C0F16A48201DF3D3B00879 :105358001AD91AD41AD849181AD5497C1AD8F01F5C :1053680000112FAD0C073008EF680015C10830197F :10537800ECC8FFF8EE060006ED690015EE080329F3 :105388000819EE080929C038E06300FF069CD832E6 :10539800800050AC000016A680038C7880038474CB :1053A800800094C4000016A2800095040000153403 :1053B800800109C08003848CD43116941493189703 :1053C800580CC1014AB89008F8081900E08400D3C5 :1053D8004A98201D4A9C1AD8F01F00293FFC2FED3F :1053E800D832300BF01F0027189B18960E9CF01F20 :1053F80000263FF8EBDCC008F0051800E08000BB91 :105408004A289088EDB80001C0E1F1D3C010201DF2 :105418001AD849981AD449EC1AD61AD71AD8F01FAC :1054280000182FAD49B89088EDB80001C0D14928BF :10543800201D499C1AD8F01F0012F7D3C010089CF1 :10544800F01F00162FED49189088EDB80001C4B17F :105458004938118948789088EDB80001C4415C69E1 :10546800EE09002871185808C1C11092109EC21880 :10547800000016A280038D20800384C0800094C49D :1054880080004E84800050AC000016A6800384D8AB :10549800000016A080037C8480013DB40000153014 :1054A800EE09000AF5320015F2CAFFF8EE0A032EDB :1054B8006F5A201D580AF40C1700F5FC1004580800 :1054C800F00B1700F1FB10041AD21ADE1ADC1ADAF4 :1054D8001ADB1AD84A881AD74A8C1AD91AD8F01F50 :1054E80000282F6D5806C46058045F183009F2036D :1054F80019005F1AF5E80008F2081800C3B0EAC8F6 :10550800FFEAEE08032C580CC3506C4858785F0B20 :1055180058485F0AF7EA100AF20A1800C0515828DA :10552800C0305838C2715C73089B069AF01F00158A :10553800EAC9FFEA300AEE090328F0030B0A4928F2 :105548009088EDB80001C0A1EE0903281AD848A830 :1055580048EC1AD8F01F000A2FED48DB0C9C2F8569 :10556800EE050923F01F000B0C9B0E9CF01F000A90 :10557800DA3ADC3A80038D2080038348800094C4A3 :105588008002E736000016A6800384FC800055A040 :105598008000D662800052C0D431149518971696B0 :1055A800580CC041E06C00F6D832F01F001D3FF8DF :1055B800E9DCC008F0041800C041E06C00FFD832F4 :1055C8003009EE040008F16900683019F169001526 :1055D80049489088EDB80001C171E8C8FFF8EE08A5 :1055E8000323F01F00114918201D1AD37008F8086A :1055F80001081AD848E85C7548EC1AD51AD61AD8A2 :10560800F01F000D2FAD2F84EE04032C580CC06042 :105618000C9B0E9CF01F0009300CD832800050AC57 :10562800000016A2800095040000153480038D50F8 :1056380080038508800094C4800052C0D421189744 :10564800580CC1C0F01F000E18965BFCC060EF3B01 :10565800000B5C5CF01F000B48B89088EDB80001A7 :10566800C0A148A8201D48AC1AD61AD71AD8F01FCE :1056780000092FCD30094888B089D82280002044FD :1056880080002068000016A280038D3C80038538C6 :10569800800094C400007B07D4314898189711897A :1056A80048889088EDB80001C3015C69F8090028B2 :1056B80071185808C08110951096C0D80000153090 :1056C800000016A2F809000AF5350015F2CAFFF81D :1056D800F80A03266F5A201D580AF40C1700F5FC27 :1056E80010045808F00B1700F1FB10041AD51AD64D :1056F8001ADC1ADA1ADB1AD84C281AD74C2C1AD901 :105708001AD8F01F00422F6D0E9C3005F01F004084 :10571800EEC6FFBC0A924BF34BA45C5CF01F003E44 :105728006C08300B2FF5109C5808C1D0F01F003BB7 :105738006C0C300BF01F003A6C0C300BF01F00396A :105748006C0C300BF01F00388688EDB80001C0B132 :10575800201D1AD26C0870484B4C1AD81AD4F01F66 :10576800002B2FCD2FC65845CDC16F5C580CC1D02A :10577800300BF01F002A300B6F5CF01F002D6F5CA0 :10578800F01F002C4A385C5C9088EDB80001C0D14D :10579800201D5C6C1ADC6F5870481AD849984A6CFE :1057A8001AD8F01F001A2FCD6FEC580CC060F01FEC :1057B80000236FECF01F00224A28F1260000495808 :1057C8009088EDB80001C0E1ECC8FFEAEE080328B4 :1057D800201D1AD848B81AD649BC1AD8F01F000B91 :1057E8002FCD2EA6EE06032C580CC060F01F001714 :1057F8003008EE0609280E9CF01F0014D83200006D :1058080080038CC880038348800094C480002044AF :10581800000016A280006F288000D6588000D6624B :105828008000D65C8000D668800385608000D66ED4 :105838008000E50480038588800111C88001122852 :1058480000001530800385B08002E28CD4211897BF :10585800580CE080007EF01F00413FF8EDDCC008E6 :10586800F0061800C750EE0600287114089CF01FB7 :10587800003CEBDCC008C0D10A9B089CF01F003933 :105888000A9B089CF01F00380A9B089CF01F0037F1 :105898004B789088EDB80001C0D1F1D5B0081AD87E :1058A80068481AD84B381AD44B3C1AD8F01F003322 :1058B8002FCD4AF43FF8F0051800C1718809300867 :1058C800F0091900C0D4EE0600287118201D1AD856 :1058D8004AB81AD64ABC1AD8F01F00282FCD0C0790 :1058E8003018EF68006CC368EE0600083009F169EB :1058F800006CEE0600280E9C711BF01F00238888A0 :10590800EDB80001C0E1ECC8FFEAEE080328201D4D :105918001AD849B81AD649DC1AD8F01F00182FCD62 :105928002EA6EE06032C580CC060F01F0019300894 :10593800EE06092848E89088EDB80001C0B149088A :10594800201D494C1AD8F01F000D2FEDC038E06516 :1059580000FF0A9CD8220000800050AC8000E504BB :105968008000D6588000D6628000D65C000016A25F :1059780080038D2C800385CC800094C480038CD850 :10598800800385F880004D98800385B08002E28C02 :1059980080038624D4211897580CC0E14BE890085E :1059A800F8081900C7744BD8201D4BDC1AD8F01F13 :1059B800003D2FEDD82278264BB85806C121F12595 :1059C8000000F01F003A0E9CEF34000BF01F003867 :1059D800089B5C5CF01F00370A07EF660068D82256 :1059E80011894AD89088EDB80001C2C15C69F809EC :1059F800002871185808C04110951096C098F809E9 :105A0800000AF5350015F2CAFFF8F80A03266F5A9E :105A1800201D580AF40C1700F5FC10045808F00B68 :105A28001700F1FB10041AD51AD61ADC1ADA1ADB99 :105A38001AD849A81AD74A0C1AD91AD8F01F001927 :105A48002F6D4998F1260000ECC5FFF0EE05002502 :105A58006A1C580CC1F078485898C1C05808C1A0B1 :105A6800F01F001648C85C5C9088EDB80001C0C102 :105A7800201D5C6C1ADC6A181AD84888490C1AD898 :105A8800F01F00082FCDEE0600260E9C6D1BF01FA0 :105A9800000DD822000016A2800382988003864455 :105AA800800094C400001530800056A08000204477 :105AB800800020688003834880010CEC8003865CAA :105AC80080005854D4214B0818979009169630082E :105AD800F0091900C0F44AD8F12800001AD8F1DBFF :105AE800B0081AD84AA81ADC4AAC1AD8F01F002AFB :105AF8002FCD4AA811893008F0091800C0414A8CF6 :105B0800F01F00253FB8F0061800C3C15807C110A0 :105B180049E830091188F2081800C0B53039F20890 :105B28001800E08900075C68EE080028711BC0288F :105B3800300B0E9CF01F001B49389088EDB800010F :105B4800C1114928F1280000201DF0C9FFEAEE091B :105B580003291AD91AD848E8493C1AD8F01F000E68 :105B68002FCD48A6ED2800002EA8EE08032C580CCF :105B7800C090F01F000EED28000030092EA8EE0896 :105B88000929D822000016A200001530800382A837 :105B980080038680800094C4000016AB800386B41E :105BA80080004D98800385B08002E28CD42118973C :105BB8001696580CC4E04A8890093008F009190074 :105BC800C0C4F1DBB0081ADC1AD84A481ADC4A4CBF :105BD8001AD8F01F00242FCD4A3811893008F0094F :105BE8001800C0414A1CF01F001F3FB8F0061800FB :105BF800C301499890093008F0091900C084497810 :105C08001AD749BC1AD8F01F00172FED0E9CF01FA9 :105C180000194998F126000048F89088EDB800016D :105C2800C0E1ECC8FFEAEE080328201D1AD848B8DE :105C38001AD6492C1AD8F01F000B2FCD2EA6EE0627 :105C4800032C580CC060F01F000E3008EE0609281F :105C5800D8220000000016A2800382D0800386C8E4 :105C6800800094C4000016AB800386B4800386F8D5 :105C78008000564400001530800385B08002E28C15 :105C8800D4311897149678CC94CAF80A000A8FCAA7 :105C98001093169512946E385808C1504A5CF01F3C :105CA8000026EF18001A3509F0090D083008F00928 :105CB8001900C0414A1CF01F0020EF08001A2FF8F5 :105CC800EF58001A49E89088EDB80001C171202DFD :105CD800304A1A9C089BF01F001BF01F001BEF386E :105CE8000014F3D3C01050091ADC1AD849781AD610 :105CF800497C1AD8F01F00102FAD0A9AEF3B001408 :105D08000C9CF01F001409890998B168F1E9118801 :105D180009A9F1E9108809BBEF3C0014F5D3C010BC :105D2800104BF01F000D0C9CF01F000CD832000027 :105D380080037FB4800094C4800384D4000016A23A :105D48008002E736800096A88003827C800387184B :105D580080007130800020088000D13CD431204D73 :105D6800502C503BFAC4FFCC10916800681268238D :105D780068386846129568545819E088000E4B58E0 :105D880090093008F0091900E08402B0201D4B2862 :105D98004B2C1AD8C2F85801C0C14AE89008E2084A :105DA8001900E08402A3201D4AB84ADC1AD8C22888 :105DB8005802C0C14A789008E4081900E0840296A5 :105DC800201D4A584A7C1AD8C158501A500837CB57 :105DD800301CF01F0025401A18974008C10149D807 :105DE8009008F8081900E0840281201D49A849FCA0 :105DF8001AD8F01F001F2FEDE08F0278402999383C :105E0800B829300840395C729900B831992599DA77 :105E180099E999F29943F9480050F9480044F9483A :105E28000048F948004C5803E080008C3058F95875 :105E38000074F01F0010EF4C00784865580CC1D171 :105E48008A08F8081900E084020C1AD748A8C8582C :105E5800000016A280038CA880038744800387640F :105E6800800387848002DC3C800387A8800094C478 :105E780080011200800382F88A88EDB80001C131E0 :105E88006E08201D8EA51AD8F01F00366FE8500541 :105E98001ADC1AD84B481AD84B484B5C1AD8F01F52 :105EA80000352FAD6E258EAA6FEC5805C1210E9BCB :105EB800F01F00315C5CC2504B089008EA081900DA :105EC800E08401CF1AD74A984ADC1AD8E08F0175C6 :105ED8004ACBF01F002DF5DCC008C0E04A789009D5 :105EE8003008F0091900E08401BC201D5C6A49F8FB :105EF8001ADA1AD7C499EF3C0014149BF01F002338 :105F08006FEC0E9A4A2BF01F002349C8908CE21CB4 :105F18000002E08001A76FE8F11900141AD970197E :105F28001AD9F11900121AD970081AD848E81AD8DB :105F380048E8499C1AD8F01F000F2FADE08F018F59 :105F4800F01F00161892C2F148C89008F808190006 :105F5800E08401871AD749281AD8492CC2D90000E9 :105F6800800096A88003825C800382F88003880CF6 :105F7800800094C480011320000016A280038824A6 :105F88008003B409800112608000200880005C88CA :105F9800800111F8800388848000E34080038C6CC2 :105FA800800387E04B880E9BB083F01F0038EF63B7 :105FB800006FEF63006CEF63006DEF63006E6E2897 :105FC8004B355808E08100BD049B0E9CF01F003142 :105FD800E7DCB0086EFCF01F0030E6C8FFEAEE0808 :105FE800092C8A88EDB80001C0A14AC8201D1ADC16 :105FF8004ABC1AD31AD8F01F002B2FCD2EA34A451E :10600800EE0303285808C0B18A09F0091900E08492 :1060180001281AD74A184A4C1AD8CCE84A3B049C9B :10602800F01F00234A3B049CF01F00234A3B049CBA :10603800F01F0023304A4A3B049CF01F00234A38D3 :106048003009B0898A88EDB80001C0C1EE03032881 :10605800201D1AD849181AD249DC1AD8F01F001185 :106068002FCD4898118948A89088EDB80001C5310E :106078005C69EE09002871185808C2B11093109590 :10608800C3080000000015308000D658000016A292 :1060980080004E0C8002E2A480038C6C800388A8E8 :1060A800800094C4800388C480005BB48000D668F4 :1060B800800069888000D65C800055A08000D66288 :1060C800800067B48000D67200007B07800388F4E4 :1060D800EE09000AF5330015F2CAFFF8EE0A0325A7 :1060E800201D5808F00B1700F1FB10046F5A580ACE :1060F800F40C1700F5FC10041AD31AD51ADC1ADAB6 :106108001ADB1AD84B681AD74B6C1AD91AD8F01F51 :1061180000362F6D049C4B598EAA0E9BF01F00343D :106128005C5CE080009F4B3890093008F00919004A :10613800E08400971AD74AA84AFC1AD8C3D88A8894 :10614800EDB80001C0F1301B0E9CF01F002C6F58F9 :106158001ADC1AD84A281AD74A9C1AD8F01F0022E3 :106168002FCD8EAA4A7B049CF01F00275C5CC120BF :106178004A0890093008F0091900C724201D5C6CF2 :1061880049781ADC1AD71AD84A0CF01F00172FCDF5 :10619800C678049CE06B00FFF01F001DEF4C005414 :1061A8004945580CC0D18A08F8081900C5941AD76F :1061B80048B8498C1AD8F01F000C2FEDC5188A88EA :1061C8004959E21800021389C4505C69EE09002895 :1061D80071185808C2211095109BC27880038C6CE6 :1061E80080038348800094C48000523C8000E350C0 :1061F800000016A28003891080004E84800389382D :106208008003B4098000D7708003884C8000DC04C8 :106218008003896400001530EE09000AF535001581 :10622800F2CAFFF8EE0A032B7843201D5808F00A3B :106238001700F1FA10041AD51ADB1AD31ADC1ADA85 :106248001AD84AC81AD74ACC1AD91AD8F01F002B1C :106258002F6D4ABB6F5CF01F002B300CC0283FFC31 :106268004A95580CC0E08A093008F0091900C3A4FF :106278004A68201D4A6C1AD8F01F00202FEDC32849 :106288008A88EDB80001C2914A284A396E204A31FD :106298005800F2001700F00017108E226E484A09C5 :1062A8006EF35808F20117108E355818C0316FEC8C :1062B800C058301B0E9CF01F001B49481AD05C7256 :1062C8001AD15C751AD21AD31AD51ADC496C1AD7A6 :1062D8001AD8F01F000A2F8D8907EF660014300CBA :1062E800C0580E9CF01F00113FFC2FCDD832000083 :1062F80080038C6C80038348800094C480006434DD :106308008000D66E000016A280038CA880038988BE :1063180080037BDC80037BE480037DC880037DC42D :1063280080004E84800389A8800056A0D431203D87 :10633800300730194B38E06504001892169191091E :10634800E06007D00A9350070E964AF4C22826CC7C :1063580058ACE08B001F4ADEFC0C032F3016C198A6 :106368003006C178680CF01F002AE7DCB010C118AD :1063780030185008C0E8680CF01F0025EBDCB0109E :10638800C0883017C068680CF01F0021E1DCB0102D :106398004A0A029B049CF01F00205BFCCD91580622 :1063A800C161498870080438C0A4E208032BFACCFC :1063B800FFF8F01F001A402B580BC0A14988201D78 :1063C800498C1AD8F01F00182FEDC198300B502BAC :1063D800F1D5C0100C99FAC5FFFC300650161AD535 :1063E8001AD6402E5C731ADEF9D0C0101AD70C9A50 :1063F8001AD31ADB0C9BF01F000D2FAD2FDDD83AF6 :1064080000007AB800007AC0800382208002DC2C69 :10641800800389E08002E278800098FC0000000C8C :10642800800389EC800094C480005D64D4211897AF :106438001696580CC041E06C00F6D8224C1890888B :10644800EDB80001C0A14C08201D1ADB1ADC4BFC7A :106458001AD8F01F003F2FCD4BA89088EDB8000147 :10646800C0F16C481AD8ED1800241AD8ED18001C91 :106478001AD84B584B7C1AD8F01F00352FCD0C9BDF :106488000E9CF01F0035EDDCB008ECC8FFEAEE0802 :1064980003285808C0804B18201D4B1C1AD8F01F21 :1064A800002C2FED6EFCF01F002FECC8FFEAEE0861 :1064B800092C4A489088EDB80001C0A14A28201D3F :1064C8001ADC4A9C1AD61AD8F01F00212FCDECC826 :1064D800FFEAEE0803285808C10149A99209F00902 :1064E8001900C08449881AD74A0C1AD8F01F001816 :1064F8002FEDE06C00FFD8220E9B2F06EE0600263B :106508006C1CF01F001B49BB6C1CF01F001B49BB17 :106518006C1CF01F001B6C1C304A49ABF01F001AA2 :106528000E9CF01F001A583CE08B00075C5C300A98 :106538000E9BF01F0017F01F00178F7CD82A000051 :10654800000016A2800382E8800389F0800094C4CA :1065580080038A1480004E0C80038A3880039DC013 :106568008002E2A4800388A8800388C48000D658EB :10657800800069888000D65C80005ACC8000D6688C :106588008000659C8000D6728000204480002A002C :1065980080009504D43118971695580CC041E06CCA :1065A80000F6D832F01F00473FF8EDDCC008F006CF :1065B8001800C041E06C00FFD832ECC8FFF8EE08C4 :1065C80003285808EFD6E108F1F91868F7B901FF70 :1065D800F1F91E68EE0600083049F1380068F20843 :1065E8001800E088001E4B89920A3009F20A190047 :1065F800C0A41AD84B581AD74B5C1AD51AD8F01F12 :1066080000352FCD0C070A9C3006301BEF6600685A :10661800F01F0031E06C00FBEF66006CD8325805C3 :10662800C1504AE89088EDB80001C101EAF800A815 :106638001AD8EAF8009C1AD8EB3800AD1AD84A38AC :106648004A7C1AD8F01F00232FCDECC8FFF8EE08BB :1066580003245804C1D049C89088EDB80001C1810D :10666800EE060008301BF1330068F132006C0E9C16 :10667800F01F001C4958201D1AD41AD21AD31AD751 :106688001AD51ADC498C1AD8F01F00122F8D0A9BD4 :106698000E9CF01F0016EE0600033002E738006C6F :1066A800E4081800C7100A9CF01F00113FF8E9DC45 :1066B800C008F0041800C1D13018E768006CC4A8FD :1066C800800050AC000016A280038C8C80038A4C9A :1066D800800094C48000E124000016A880038A7C0E :1066E80080004E8480038AB0800052C08000E50498 :1066F800EE060028E762006C711B0E9CF01F002359 :106708004A389088EDB80001C0E1ECC8FFEAEE080D :106718000328201D1AD849F81AD649FC1AD8F01FA0 :10672800001F2FCDECC3FFEAEE03032C580CC0600A :10673800F01F001B3008EE03092849589088EDB86F :106748000001C0814938201D496C1AD8F01F001378 :106758002FED48F89088EDB80001C1610E9C301B00 :106768000C07EF37006CF01F001048A81AD65C64BD :106778001AD41AD71ADC48DC1AD51AD8F01F000721 :10678800300C2FADD832D83A80004D98000016A2B0 :1067980080038C8C800385B0800094C48002E28CD6 :1067A8008003862480004E8480038AF0D4311897B1 :1067B8001695580CC041E06C00F6D832F01F003E28 :1067C8003FF8EDDCC008F0061800C041E06C00FF9F :1067D800D8324BA89088EDB80001C1A1EE06000898 :1067E800F1340068F133006C4B58301B11820E9C59 :1067F800F01F00344B48201D1AD21AD31AD41AD7C6 :106808001AD51ADC4B1C1AD8F01F00312F8DEE0652 :1068180000083009F13A006CF20A1800C060F1393A :1068280000682FF9F1690068EE060008F134006885 :106838003088F0041800E08800224A68900930087F :10684800F0091900C104301B0E9CF01F001E49E816 :10685800201D1AD41AD71ADC49FC1AD51AD8F01FE9 :10686800001C2FAD30080C070A9CEF680068301B2D :10687800F01F001AE06C00FBD83249181189300863 :10688800F0091800C0500A9B0E9CF01F0015EE0678 :1068980000043008E939006CF0091800C6100A9C99 :1068A800F01F00103FF8F00C1800C1D13018E9684B :1068B800006CC3E8800050AC000016A800007B07FD :1068C80080004E848003824C80038B2C800094C40B :1068D800000016A280038B6C8000E124800052C067 :1068E8008000E5040E9CF01F001F49F89088EDB861 :1068F8000001C0E1ECC8FFEAEE080328201D1AD801 :1069080049A81AD649AC1AD8F01F001A2FCDECC4E2 :10691800FFEAEE04032C580CC060F01F0017300883 :10692800EE040928EE0600083009F169006C48E811 :106938009088EDB80001C1410E9C301BEE060006A0 :10694800ED37006CF01F000D48881AD71ADC48CCC8 :106958001AD51AD8F01F0007300C2FCDD832D83AE4 :1069680080005644000016A28003824C800385B044 :10697800800094C48002E28C80004E8480038B984F :10698800D4311294580A5F1830091497F204180089 :106998005F0318961695E7E80008F2081800C55036 :1069A800335CF01F00406CC98EC8F20800088DC81F :1069B8006C385808C0614BC89088EDB80001C231E6 :1069C8004BA89088EDB80001C0918EC81AD84B88A2 :1069D8004B8C1AD8F01F00382FED4B889088EDB8F3 :1069E8000001C0C14B28201D4B5C1AD8F01F003293 :1069F8008ECB6E1CF01F00332FEDED08001A2FF818 :106A0800ED58001A0A9AED3B00140E9CF01F002E58 :106A18004A689088EDB80001C1218EC8201D1AD897 :106A28001ADCED38001430091AD91AD71AD51AD831 :106A380049F84A6C1AD8F01F00202F8D0E9CF01FC1 :106A48000024335CF01F002358075F081063C160FF :106A580049689088EDB80001C0C1201D1AD5ED38ED :106A680000141AD8492849CC1AD8F01F00132FCD82 :106A78000A9B0C9CF01F0019C1385804C11048B873 :106A880090093008F0091900C0B44898201D5C64CA :106A98001AD7493C1AD41AD8F01F00072FCDD83A74 :106AA8008000A300000016A6000016A280038C98A0 :106AB80080038BC8800094C4000016A080037C84E7 :106AC80080013DB48000713080038BD88000D13CB8 :106AD8008000A2E680038C108000585480038C3C10 :106AE800D42148C8189716969088EDB80001C0A11F :106AF8004898201D1ADB1ADC488C1AD8F01F0008A9 :106B08002FCDF7D6C0100E9CF01F0006D82200002B :106B1800000016A280038D0480038C50800094C46A :106B28008000D984D4213007C1B80C9C0E9B2FF665 :106B3800F01F000D1895C0F078485808C0C1F01F24 :106B4800000B0A9CEB35000BF01F00090A9B5C5CEC :106B5800F01F00085846CEA12FF75827C03030063E :106B6800CE5BD82280002024800056A080002044DC :106B780080002068D4214978F00C07085808C071B3 :106B88004959F20C070AF00A1800C1F04929F20C19 :106B9800070AF4081800C1904909F80C001CF0080D :106BA8000017A567EE0C0027120748D99289EDB99E :106BB8000004C0C11AD848B81ADA48BC1AD71AD87B :106BC800F01F000A2FCDC02830070E9CD8220000E5 :106BD8000000153C0000153800007B2C000016A6AC :106BE8008003901080038DE0800094C4D421169710 :106BF8001496F01F0005C0609828AC087808301C6F :106C08008F08D82280006B7CD43149B849B91092DA :106C1800F00C0708F20C070718961AD7498C1AD8EF :106C2800EC060014F01F001749732FEDA36431E53B :106C3800EE070018A568E8080008E60800087009CB :106C48005809C0C090BA90AB1ADB1AD9702848FC12 :106C58001AD81ADAF01F000B2FCD2FF7E406070811 :106C68005C57EE051800F9B70000EE081800CE11C1 :106C7800D8320000000015380000153C80038DF460 :106C8800800094C400007B2C80038E0CD431201D1E :106C98004A181896F00C07073005F80C001849F048 :106CA800A36849F149F231E349F4EE070019A569EF :106CB800F0090009E0090009720A580AC1D0923B9C :106CC800922A8289F40B010CE2190010F8050005DC :106CD8005C855809C1105C7B5C7AF3D5C010201D17 :106CE800492C1AD91ADB1ADA1AD61AD25068F01FA8 :106CF80000102FAD40082FF7E80607095C57EE0390 :106D08001800F9B70000EE091800CD010A9C2FFD04 :106D1800D83200000000153C00007B2C000016A6AD :106D280080038DA00000153880038E28800094C44D :106D3800D421F01F000B48B8EFDCB0109088EDB8F4 :106D48000004C0A10E985C781AD84878487C1AD8F4 :106D5800F01F00072FED0E9CD822000080006C94D5 :106D6800000016A680038D7080038E4C800094C4AA :106D7800D4214A181897169631D9F20C1800E088D1 :106D8800000F90093008F0091900C33449B81ADC1B :106D980049BC1AD8F01F001B2FEDD822F60B001A99 :106DA8009088F80C0019E2180010A569F20A002969 :106DB800495AF40903055808C0A04908201D1ADCDF :106DC800492C1AD51AD8F01F000F2FCD0A9CF01F96 :106DD80000103008EC060016EE07001748A9A56752 :106DE800EE060026F20600068D288D08AC28AC3881 :106DF800D8220000000016A280038DD080038E6880 :106E0800800094C400007B2C80038E888002E28C72 :106E1800D4314948F80C00121896F00C0707A36201 :106E2800491331E44915EE070018A568E40800087D :106E3800E60803085808C0500E9C0C9BF01F000C75 :106E48002FF7EA0607085C57EE041800F9B70000A8 :106E5800EE081800CE914839300CF2060B08D832EB :106E68000000153C00007B2C0000153880006D7870 :106E7800D4211897580CC0E14A189008F80819004E :106E8800C3C44A08201D4A0C1AD8F01F00202FED51 :106E9800D82249FAF40B070CF8CEFFFFF80C001CB7 :106EA800A56CF40B0B0E3008F60B0019F809002935 :106EB800498CF809000993289308B228B23831E9B7 :106EC800F20E1800C031F40B0B0848D89088EDB8C2 :106ED8000004C10148E8F00B07081AD848E8F00B8D :106EE80007081AD848781AD748CC1AD8F01F0007CC :106EF8002FCD0E9CF01F000AD8220000000016A219 :106F080080038D8480038E98800094C40000153C13 :106F180000007B2C0000153880038DE08002E28C95 :106F2800D42118970E9CF01F0005C060780C0E9BAA :106F3800F01F0003CF8BD82280006B7C80006E7816 :106F4800D421496818971696149512949088EDB82C :106F58000001C0C14928201D1AD91ADA1ADB1ADC27 :106F6800490C1AD8F01F00102FAD301B0A9CF01FD7 :106F7800000FC080301B0A9CF01F000C784858088E :106F8800C0510C9B0E9CF01F000A5804C0500A9B6D :106F9800089CF01F0008D822000016A280038D600C :106FA80080038EAC800094C48000202480006AE8AE :106FB80080006E78D4211897F01F00061898C02119 :106FC800D8220E9A782C700990ABF01F0003DA2AA9 :106FD80080006B7C80006F48D42116961494189515 :106FE800F01F001E1897C021D8229838982B7809CE :106FF800F6081900C2B2F5D8C0105804C050F20AF9 :107008000708AC88C068F20A0709AC892FF8B838B5 :1070180049389088EDB80004C0D10D881AD86E0898 :107028001AD88EB81AD848F848FC1AD8F01F000F9A :107038002FCD8E3B8E28F6081900C0710A9A5C7B0A :107048006E2C6E09F01F000ADA2A0A9A5C7B782CEB :10705800F01F0007D82A000080006B7C000016A6ED :1070680080038D9080038ED4800094C480006F4884 :10707800D4211897F01F00231896C021D8224A2837 :107088009088EDB80004C0D178081AD898A81AD802 :107098008CB81AD849D849EC1AD8F01F001E2FCD41 :1070A8008C398C28F0091900C020DA2A49A8908860 :1070B800EDB80004C1614998201DF0070709498807 :1070C8001AD9F00707081AD8F20818005F191AD950 :1070D8006C081AD848D8493C1AD8F01F000E2FADB2 :1070E8006C2C6C090E9A8CABF01F000F48C8F00787 :1070F800070948A8F0070708F00918005F1CD822FC :1071080080006B7C000016A680038DBC80038EE88F :10711800800094C4000016A2000015380000153C39 :1071280080038F0080006F48D43118951697149308 :10713800580CC0311894CBD8F60B001A4A58F00BEB :107148000708F0080019A569F20A00294A2AF40973 :1071580003095809C1604A1A940B300AF40B190044 :10716800C0A4201D1AD849E81AD949EC1AD8F01F2A :10717800001E2FCD49780E9BF007070CF01F001B4F :10718800301B8ACCF01F001A18961894E0800092E1 :10719800189B30098ACA0A9CF01F00168A485C8C22 :1071A800F00C1900C2C048D9920A3009F20A190035 :1071B800C0B45C781AD848A81AD648FC1AD51AD888 :1071C800F01F00092FCD0C9C3004F01F000CC718CD :1071D8000000153800007B2C000016A280039004E4 :1071E80080038F2C800094C480006D788002DC3C82 :1071F8008000CEC480038F548002E28C4AE9F207F3 :10720800070AF4CBFFFFF40A001AA56AEE07001874 :10721800F2070B0BF40800284A8AF4080008300A21 :107228009123B02C9106B03A31E8F00B1800C03128 :10723800F2070B0A4A084A29F0070708F207070964 :10724800F0091800C1C149F9920A3009F20A190077 :10725800C0A4201D1AD81AD849B849CC1AD8F01F8A :10726800001C2FCD4948F00707095809F9BA01FF52 :10727800F3DAE109F9B9001DF0070B0949189088FC :10728800EDB80004C1618AC848DAF407070A201D6E :107298000D891ADA488AF407070A1ADA1AD91AD8A5 :1072A80048981AD648BC1AD71AD8F01F00092F8D4B :1072B800089CD8320000153800007B2C0000153CD3 :1072C800000016A28003900480038F90800094C46D :1072D80080038FBCD431203D1690502A1895F01F9A :1072E8000021301BE5DCB010F9D2C010F01F001EE1 :1072F8001896C2C049D8EA050019F0050707A3691E :10730800189431E849A1189349ABEE070016A56611 :10731800F2060006F60600066C0B580BC0B0089C77 :107328008CAA50095018F01F00148CAA4018140495 :1073380040092FF7E205070A5C57EE081800F9B76D :107348000000EE0A1800CE110696402A5800E1F611 :107358001A00580AF5F21C000C9C2FDDD8320000E8 :1073680080006C948002DC3C0000153C000015385D :1073780000007B2C8002E736D431303818971693FA :107388001494F00C1800E088001B48989009300805 :10739800F0091900C0353005CA2848681ADC3005DC :1073A8001AD8485CF01F00052FEDC998000016A2F6 :1073B80080038DB080038FE0800094C4F80C001A1D :1073C8004C88F00C0708F0080019A569F20A002992 :1073D8004C5AF40903095809C1604C4A940B300A05 :1073E800F40B1900C0A4201D1AD84C181AD94C1C2B :1073F8001AD8F01F00412FCD4BA80E9BF007070CA1 :10740800F01F003E0892301B5C72049CF01F003C89 :1074180018961895C640049A069BF01F003AEE0786 :1074280000184B03E6070702E4020012A562E4080D :1074380000224AD83001F0020002300B8506A4244D :10744800A4310E9CF01F0030852CE60707082FF8A2 :10745800E6070B0831E9F2081800C031E6070B010E :107468004A084AA9F0070708F2070709F0091800AF :10747800C1C149E9920A3009F20A1900C0A4201DC5 :107488001AD81AD849A84A2C1AD8F01F001B2FCD91 :107498004948F00707095809F9BA01FFF3DAE10981 :1074A800F9B9001DF0070B0949089088EDB80004E8 :1074B800C1610D884959F2070709201D1AD9489951 :1074C800F20707091AD91AD848985C74491C1AD4C3 :1074D8001AD61AD71AD8F01F00082F8D0A9CD8324E :1074E8000000153800007B2C000016A280038DB028 :1074F80080038F2C800094C480006D788002DC3C6F :107508008002E736800020240000153C80038F901D :1075180080038FBCD401E06A05A0300B482CF01F13 :107528000003D80200007B2C8002E8BCD421202D67 :10753800FE782800501C500B3FF7109E301CC308E3 :10754800300B7049EDB90001CFD17049EDB9000990 :10755800CFD140195809C0B01396F2C5FFFE138960 :107568005015EDE91089F7D9D010C038F7D7D010E9 :10757800913B7049EDB90000CFD17C2B40095C8B61 :107588005809C080B29BF7DBC108B28B40092FE9CC :107598005009F80A1900E0880006202A5C8A580A6F :1075A800CD01FE78280070482FEDD822580CC06015 :1075B800FE782800300A7019C058FE78280030FA82 :1075C8007019F3DAD20491195EFC202D3008E069B5 :1075D80013885018F8090249C058401A2FF82FFA92 :1075E800501A1238CFB12FED5EFCD703D401303CCE :1075F800F01F0005C060303CF01F0004F01F0004BD :10760800D402D6038000A3708000A38880014014B0 :10761800D401580CC060300B303CF01F0004D80275 :10762800303CF01F0003D8028000A31A8000A35C3E :10763800D401202D3008B888303CF01F0022303C9F :10764800F01F0021309CF01F001F307CF01F001D30 :107658003008501840192FF950192FF8E04861A840 :10766800CFA1309CF01F00193008501840192FF98D :1076780050192FF8E05886A0CFA1307CF01F0013D6 :10768800340B300A492CF01F0013FE782800302AEA :1076980070C9F3DAD108308A91C970C9F3DAD08495 :1076A800301A91C970C9F3DAD06191C970C9F3DA97 :1076B800D001303C91C9F01F00082FEDD80A000016 :1076C8008000A2A88000A2BE8000A2E6800075F417 :1076D8008000A3A08000A388D42120AD4C68E3B823 :1076E8000001D5533017FE6810007109F3D7D20294 :1076F800303AF1490040E06B1B00EA1B00B7FE7C02 :107708000C00F01F003E310A201D30081ADA0E99CD :10771800109B308AFE7C0C00F01F003930080E994F :107728000E9A109BFE7C0C00F01F0036300BFE7C7E :107738000C00F01F0035FE7C0C00F01F0034300CEC :107748001ADC18981899189A1ADC189BFE7C0C00F9 :10775800F01F002F0E9CF01F002F302BFE7C0C001A :10776800F01F002DF01F002DD503304AFAC7FFD0B7 :107778004ABB0E9CF01F002B302B0E9CF01F002ADA :10778800FAC8FFDC4A99722C109B912CE06AF980A8 :10779800EA1A0337F2E40000FE7C1800F0E5000066 :1077A800F01F0023308A4A3B0E9CF01F001E310A4E :1077B800FAC6FFEC300B0C9CF01F001F3018304B42 :1077C800FB68002149DCF01F00180C9BFE7C280098 :1077D800F01F001B3009FE7C2800129B129AF01F34 :1077E80000190E9C0E96304BF01F000F2FCDFAC7D4 :1077F800FFD8C2D8800376008000A5088000A4B016 :107808008000A4CE8000A4E68000A4F48000A470C8 :107818008000A2228000A4FE8000A3D080039038BC :107828008002E7368000A2808003901C8000AA1C9A :10783800800390308002E8BC800390288000A66214 :107848008000A69C0D8C2FE6F01F000F0E36CFB1DE :10785800FACBFFFCFE7C2800F01F000C3009FE7CF0 :107868002800129A129BF01F000AFE7C2800F01FC5 :107878000009302CF01F0008FE7C2800F01F0005CE :107888002F6DD8228000A2BE8000A6628000A69C30 :107898008000A7EC8000A2E6D42130A81896F00C4E :1078A8001800C0C1E067271020175BF7C13030DB34 :1078B800FE7C1800F01F0008CF81E0672710201712 :1078C8005BF7C0800C9BFE7C1800F01F0003CF8183 :1078D800D822DC2A8000A9AED401178A17B91798D4 :1078E800B168F1EA118817AAF1EA1088F3E81008DC :1078F8001AD81ADC483CF01F00042FEDD80200000B :1079080080039064800094C4D421202D4AB811D9F2 :10791800BAD97009500911C8BAC81A961895169498 :10792800581CE08900064A6CF01F0026C448761CE3 :10793800F01F0025201DEFDCC0084A4C1AD7F01FA5 :1079480000212FED5825C2A0682CF01F001F201D14 :10795800EDDCC00849EC1AD6F01F001A30182FEDDC :10796800F0061800C111305A49AB0E9CF01F001ADE :1079780030AA49AB0E9CF01F00180E9C308A498B28 :10798800F01F0015C1883028F0061800C141300AE0 :107998000E9C149BF01F0013C0E83038F007180045 :1079A800E08B000A300B0E9CF01F000F1A9B306A08 :1079B800F01F000E2FEDD82A800396B88003909808 :1079C800800094C48002DC2C800390C4800390D093 :1079D800800390E480007380800390EC800390F82B :1079E800800072DC8000202480005140D421189649 :1079F8001695582CC45176174B3B0E9CF01F00333C :107A08001896C1014B2CF01F00334B38FE798000CB :107A1800B0094B28B0064B28B0064B28B006E08FBB :107A280001C44B1B0E9CF01F0029C1D14AA89088A5 :107A3800201D4AEC1AD8F01F00274A8890884ACCA3 :107A48005008F01F00244A6890884AAC5008F01F7C :107A580000214A4890884A8C5008F01F001E2FEDDC :107A6800E08F01A30E9C4A5BF01F0018C0C14A4C6E :107A7800F01F0018E06900FF4978E08F0195582C45 :107A8800E089000749FCF01F0013E08F018E762C77 :107A9800F01F001D18975836E08101876A1649BB08 :107AA8000C9CF01F000AC53148B85807E08A000846 :107AB8009009A1A9B0095817C2A1C3089009A1C982 :107AC800B009C2C8800391048002ECC88003910801 :107AD800800094C4000016A2000016A6000016A09C :107AE800000016A8800391148003911C8003913430 :107AF8008003914C800391648003E18C8003917C26 :107B0800800391888002DC2C800392144B799208C0 :107B1800A1A8B2085827C071C0D84B499208A1C87B :107B2800B208C0884B299208A1A8B2085837C0717A :107B3800C0A84AF99208A1C8B208C0584AD9920800 :107B4800A1A8CAC84AB99208A1C8CA884AAB0C9C5D :107B5800F01F002AC2F14AA85807E08A00089009D5 :107B6800A3A9B0095817C061C0C89009A3C9B00932 :107B7800C08849E99208A3A8B2085827C071C0D89C :107B880049A99208A3C8B208C08849999208A3A82D :107B9800B2085837C071C0A849599208A3C8B2089A :107BA800C05849499208A3A8C79849299208A3C868 :107BB800C758494B0C9CF01F0011C3E149085807EE :107BC800E08A00089009A1B9B0095817C061C1B886 :107BD8009009A1D9B009C17848499208A1B8B2085A :107BE8005827C161C1C80000000016A6000016A0F1 :107BF800000016A88003921C8002ECC8000016A2A0 :107C0800800392204B699208A1D8B208C0884B59CA :107C18009208A1B8B2085837C071C0A84B19920889 :107C2800A1D8B208C0584B099208A1B8C3784AE94C :107C38009208A1D8C3384ADB0C9CF01F002DC30161 :107C48004AC85807E08A00089009A3B9B00958172C :107C5800C061C0C89009A3D9B009C0884A09920870 :107C6800A3B8B2085827C071C0D849D99208A3D878 :107C7800B208C08849B99208A3B8B2085837C07189 :107C8800C0A849899208A3D8B208C058496992087F :107C9800A3B8C04849499208A3D8B208C858496B44 :107CA8000C9CF01F0013C3D149285807E08A00082C :107CB8009009A5A9B0095817C061C0C89009A5C9FD :107CC800B009C08848699208A5A8B2085827C151C8 :107CD800C1B848399208A5C8B208C168000016A6FC :107CE800000016A0000016A8800392248002ECC8A9 :107CF800000016A2800392284AC99208A5A8B208D3 :107D08005837C071C0A84A999208A5C8B208C05887 :107D18004A799208A5A8CC2B4A599208A5C8CBEB5A :107D28000C9C4A4BF01F0024C3F14A485807E08ACC :107D3800000B9009EA19FFFFE8198000B0095817ED :107D4800C071C1089009F3D9C00FB009C0B849C9BA :107D58009208EA18FFFFE8188000B2085827C08187 :107D6800C11849789009F3D9C00FB009C0B848F9CB :107D78009208EA18FFFFE8188000B2085837C08157 :107D8800C0E848A89009F3D9C00FB009C08848894D :107D98009208EA18FFFFE8188000C80B48489009C5 :107DA800F3D9C00FB009D82A000016A0000016A801 :107DB800800392308002ECC8000016A2000016A6CC :107DC800D421582CC2717617495B0E9CF01F001500 :107DD800C1211897494CF01F0015201D494C1AD78E :107DE800F01F00120E9C2FF7F01F00122FED5847BE :107DF800CF51C1380E9CF01F0010201DEFDCC008C9 :107E080048BC1AD7F01F00090E9CF01F000A2FED7E :107E1800C04848ACF01F0005D82A000080039238FB :107E28008002ECC88003923C800094C4800390C414 :107E380080006C108002DC2C80039250D421207DBD :107E4800306A18951696FAC7FFEAE06B00FF0E9C99 :107E5800F01F00385825C1B16C1C4B7BF01F003750 :107E68001896C4B14B6CF01F00370E9B0C9CF01F8A :107E780000360E9B301CF01F00340E9B0A9CF01F2E :107E880000320E9B303CF01F0030C5085825E08AB0 :107E980000356C1CF01F002D6C2B1897500B169C8E :107EA800F01F002B58DC5F04585C5F08E9E81008F5 :107EB800ECC5FFFC109418963008FACCFFF8400B7C :107EC800F0041800C0500C9AF01F0022C238F01FAE :107ED800002258375F98580C5F091896F3E8100885 :107EE800E8081800C0A15807C085C0916A08118920 :107EF8003308F0091800C030498CC098585C5F18E6 :107F080058DC5F19F3E80008C050495CF01F000D09 :107F1800C0D85C570C9BFAC9FFEAFACAFFF80E9C56 :107F2800F01F00100E9CF01F00102F9DD82A000093 :107F38008002E8BC800392808002ECC880039288AB :107F4800800094C48001921C8002DC2C8002EDD059 :107F58008002EE0C800098688003929C800392DC7B :107F68008001927080019258D421204D4ABC149609 :107F7800F01F002B1A9CF01F002B581CC0504AAC55 :107F8800F01F0027C0A81A9CF01F0028201D1ADC2B :107F98004A7CF01F00232FEDF01F002618974A6C2B :107FA800F01F001F5807C0514A4CF01F001DC04861 :107FB8000E9CF01F00234A376E0CF01F0023C1F0FF :107FC8006E087018201D1AD8F01F0020500C4A0C9B :107FD800F01F00136E0870285008F01F001C500C8A :107FE80049CCF01F000F6E0870385008F01F0017BA :107FF800500C499CF01F000A2FEDC048497CF01F27 :108008000008497CF01F00060DC93018F009180057 :10801800C2A1494CC298000080039314800094C404 :10802800800191288003932C8000967080039348E8 :108038008001997C80039358800393A880009784DB :10804800000080D08000CAE4800096A8800393686E :10805800800393788003938880039398800393B078 :10806800800393B8493CF01F0014FACCFFF4300B9E :10807800F01F0012301B4037FACCFFF8F01F000F3A :10808800201D1AD750574047F01F000D500C48DCF0 :10809800F01F000950075047F01F0009500C48AC6A :1080A800F01F0005F01F0009300C2FED2FCDD8224E :1080B800800393C4800094C48000C1EC800096A81B :1080C800800393D080039DC08000495CD421202D7B :1080D8001695584CE089000649ECF01F001FC3684C :1080E800FACCFFFC761BF01F001D6A2C4014F01F11 :1080F800001C18976A3CF01F001A18966A4CF01F6B :108108000018501418951ADC496C1AD61AD71AD4C4 :10811800F01F0011089CF3D5C008F5D6C0080E9BC7 :108128005C7BF01F00112FCD5BFCC10148F8900962 :108138003008F0091900C0A448D81AD548DC1AD666 :108148001AD71AD8F01F00042FCD2FEDD82A000017 :10815800800393DC800094C4800098FC8002DC2CAF :108168008003941480003958000016A280039054AC :1081780080039448D4211695583CE089000649CCE0 :10818800F01F001CC338761CF01F001B18976A2CC0 :10819800F01F001918966A3CF01F00174978201D37 :1081A80018941AD649651AD7580CF0051710495C67 :1081B8001AD5F01F0010089AF7D6C0085C5A0E9C12 :1081C8005C7CF01F00112FCD5BFCC10148F89009C1 :1081D8003008F0091900C0A448D81AD648DC1AD7C4 :1081E8001AD51AD8F01F00032FCDD82A80039488F7 :1081F800800094C48002DC2C80037DC480037DC889 :10820800800394B880003C50000016A28003969C1E :10821800800394DCD421206D1697582CE089000641 :108228004A4CF01F0025C438761CF01F00246E2B22 :10823800F8C700011A9CF01F0022304A1A9BFAC6A0 :10824800FFEC0C9CF01F001F201D40681AD8F01F7F :10825800001E1ADC49DC1AD7F01F00170C9B0E9C75 :108268005C5CF01F001BFACCFFE0300BF01F00191C :10827800301B4087FACCFFE4F01F00162FDD505763 :108288001AD74056F01F00101AD71ADC492C50870D :10829800F01F00092FDD50461AD6F01F000B1AD622 :1082A8001ADC48EC5076F01F00042FCD2FADD82AE9 :1082B80080039510800094C48002DC2C800098FC18 :1082C8008002E736800096A8800395388000C19C1C :1082D8008000C1EC8003955480039564D421FACDC5 :1082E8000108581CE0890006491CF01F0012C1D87B :1082F800F6C9FFFCF8CA0001FAC7FFFCE06B0100F1 :108308000E9CF01F000DC110300948CAFACBFEFCC4 :108318000E9CF01F000B5C5CC0814418489C1AD866 :108328001AD7F01F00042FED2BEDD82A800395747F :10833800800094C480009710800078E08000C4C05A :1083480080039064D43121AD18961695582CE08995 :1083580000064A1CF01F0021C3B8FAC7FFFC344AC4 :10836800300B0E9CF01F001E306AE06B00FFFACC49 :10837800FFDBF01F001BFAC4FFB8EAC9FFFCECCA18 :108388000002320B089CF01F00171893C210189AAD :10839800089B0E9CF01F00143088FB6300242016F5 :1083A800EA060326FB68003C0C9CF01F00100C9B9F :1083B800189A30180E9C3089F01F000D581CC08088 :1083C80048C8201D48CC1AD8F01F00042FED2E6D88 :1083D800D83A000080039590800094C48002E8BCDD :1083E800800097108002E7368002EDD080019084EB :1083F80080039048800395B4D42121AD1696582C5B :10840800C05049BCF01F001BC308FAC7FFFC344A20 :10841800300B0E9CF01F0018306AE06B00FFFACC9E :10842800FFDBF01F0015ECC9FFFC301AFAC6FFB8D5 :10843800320B0C9CF01F00111895C170189A0C9BF8 :108448000E9CF01F000F3088FB6500240E9CFB6813 :10845800003CF01F000C581CC08048B8201D48BCC8 :108468001AD8F01F00042FED2E6DD82A800395D45A :10847800800094C48002E8BC800097108002E73630 :1084880080018FF8800396AC800395ECD431204DA1 :108498001493189516947406582CC091761C304A7B :1084A8004A7BF01F0028C0513018C458584CC0806F :1084B8004A5CF01F00264A6CF01F0024C3D8761BC4 :1084C8001A9CF01F00240A9A1A9BFACCFFF4F01F9A :1084D80000224A289088EDB80002C0B1201D40480B :1084E8001AD849F81AD649FC1AD8F01F00182FCD07 :1084F800FAC7FFF40C9C0E9BF01F001B682B1A9CFC :10850800F01F0014304A1A9B0E9CF01F00130E9B9C :108518000C9CF01F0016683B1A9CF01F000E304A96 :108528001A9B0E9CF01F000C0E9B0C9CF01F001059 :108538001A953008A6C82FCDD83A0000800392803B :108548008002EDE680039610800094C48003964074 :10855800800098FC8002E736000016A28003903C59 :10856800800396688000CBC88000CA928000CA74D5 :10857800D421212D581CE0890006491CF01F001148 :10858800C1C8F6C9FFFCF8CA0001FAC7FFD8320B08 :108598000E9CF01F000D1896C1000E9B189AFAC782 :1085A800FFF90E9CF01F0009300BFB6600270E9C9C :1085B800F01F0007F01F00072EEDD82A80039684CD :1085C800800094C4800097108002E736800099A844 :1085D8008000998CD401F01F0003F01F0003D80A13 :1085E80080019EF880009820D40148BE1898300970 :1085F8007C0C580CC0A1F2090019487EFC0900291E :10860800932A9318930BD8022FF92F4E58F9CF11AC :10861800DC0A000000001544D401484CF01F000497 :1086280030194848B089D802800396C0800094C4A5 :10863800000015F8D4314B68169570065806C050DE :108648005816E08100BAC938580CE08000B5F01F10 :1086580000314B18910C1897580CE08000AD19891F :10866800EC091800C0415805C460C4284AB44AC37C :108678008906C188EC060018E60800287012049CD8 :108688005802C0E0F01F002718910E9CF01F00252B :108698000E9BE20C0D4A049CF01F0023C3102FF61A :1086A8008906680649D258E6FE98FFE658F6C28160 :1086B8005805C210049749DCF01F001D3008498690 :1086C8008508C128F0080018EC0800287009580926 :1086D800C0807018201D497C1AD8F01F00152FED96 :1086E8006E082FF88F086E0858E8FE98FFED492CA1 :1086F800F01F000F4888700CF01F0010C5C80E9CB2 :1087080048FB49074906F01F0011C2C8000016407F :108718008002ED8400001644000015400000154456 :108728008002EDD08002EDE6800396C8800094C4F4 :10873800800396E0800396C48002E28C80039364F1 :10874800000015FC000016008002EEB86E08EC0868 :10875800092C2FF88F085908C070498B300CF01F6E :108768000018580CCF41301949689109496949786E :108778007008F0080018F20800284959702A720C8D :108788007008494B5D18581CC1705805C040492CE9 :10879800F01F001248E83007340A0E9B910748DCA6 :1087A800F01F000F48F8700CF01F000F4858301CDD :1087B8009107D832D83ADA3A800393648002EEB847 :1087C800000016400000154400001540000015FC8C :1087D80000001600800396C4800094C48002E8BCA0 :1087E800000016448002E28CD421202D1897FACB81 :1087F800FFFCFE7C1800F01F0012583CC080584C4B :10880800C081E0690100FE7818009109301CC15848 :10881800401C58DCC03130ACC0B8588CC081F01F47 :108828000009320CF01F00071BFCC0285C5CF01F1D :1088380000054018300CAE882FEDD8228000A9C260 :10884800800078A0D431202D30A1FAC0FFF930D2B1 :10885800308349B749B630043005009CF01F001A30 :10886800C2A11BF8E20818005F0AE40818005F09B3 :10887800124AF80A1800C0904929491A1298740B2C :10888800950CF20B0B0CC188E6081800C0916E0815 :108898002018F00C17708F0CEC0C0B04C0686E09D4 :1088A800EC090B082FF98F096E08E0480050CD61DC :1088B8008F05CD4B3008109C2FEDD832000016489C :1088C8000000164C800087F0D401F01F0004301B14 :1088D800F01F0003D80200008000884C8000863C0E :1088E800D4314974169714951293580BC0B1680C7B :1088F800580CC0311896C2181696F01F0012890736 :10890800C1C868085808C0C1E06C0200F01F000E1A :10891800890CC061189648DCF01F000DC0E80A9C5D :10892800E066020048650C33E60617806A0B0C9A6D :10893800F01F00086A088F080C9CD8320000169CAB :108948008002E28C8002E2A4800396E8800094C44E :10895800800090B4D401F01F0002D80A800091086A :10896800D4213008FAC4FFEC19C9F0091800F9B885 :108978000100E9F81A01E9F81A02E9F81A004A1898 :108988001AD84A1818971AD8089B3008E8C9FFF867 :10899800E8CAFFFC780CF01F001D8F0C2FED580C57 :1089A800C021DC2AF01F001A300949AA301BE06CEC :1089B8001388F01F00193009498A301BE06C00FA4F :1089C800F01F00153009496A301BE06C01F4F01FF4 :1089D80000123009493A301BE06CEA60F01F000EC3 :1089E8003009491A301BE06C03E8F01F000B30090E :1089F80048EA301BE06C03E8F01F0007DA2A0000A1 :108A08008001365C80013C948000CCA88000CAB00C :108A180080008A708000956C80008A6480008A5883 :108A280080008A4C80008A4080008A34D401F01F7C :108A38000002D8028000C664D401F01F0002D802E8 :108A480080012984D401F01F0002D8028000B8B048 :108A5800D401F01F0002D8028000C074D401F01FB6 :108A68000002D8028000E68CD401F01F0002D80270 :108A78008001326430194828B0895EFC000016AACB :108A8800D401319CF01F0003319CF01F0003D80271 :108A98008000A2D28000A2E6D421204D3FF819C957 :108AA8001897F0091800F9B80001EFF80E0430081B :108AB800201D1AD850581AD81AD850685058F01F84 :108AC800001C49CB6E0CF01F001C0E9949BA49CB0B :108AD80049CCF01F001D2FCD581CC08049B8201D5F :108AE80049BC1AD8F01F001B2FEDF01F001BF01F08 :108AF800001B0E9CF01F001AC0F049A8900930080E :108B0800F0091900C0F44988201D498C1AD8F01FB3 :108B180000112FEDC07830194958319CB089F01FE9 :108B280000153018EF6800082FCDD822800089681A :108B380080008C5C8000CAEE80008B7C80008BDC1F :108B480080008A7C80009A188003973C80039DC02F :108B5800800094C48000998C80019EF880002A9837 :108B6800000016A28003972880039758000016A4D7 :108B78008000A300D4211897333CF01F000F300663 :108B88000FD8EC081800C0C048CCF01F000D6E0CC0 :108B9800F01F000C6E0CF01F000CAED6C07848BC5D :108BA800F01F00076E0CF01F000A3FFCF01F0009C1 :108BB800D82200008000A2E680039774800094C445 :108BC8008000B1D88000AE50800397908000CABC66 :108BD80080002E60D42116971896333CF01F00149D :108BE8000C9CF01F0014201D1ADC493CF01F0013D8 :108BF80030182FED0FC6F0061800C121490CF01FE0 :108C0800000F6E0CF01F000F48F849095C5CF20C6D :108C18001700F00C1710F01F0009AED6C0486E0CF4 :108C2800F01F000BF01F000BD82200008000A300EB :108C3800800096E48003979C800094C4800397B8D2 :108C48008000B950800397D080037FC08000CB8814 :108C58008000C690D42149471896F01F0014189533 :108C6800C110301CF01F00126C18201D1AD8F01FFC :108C78000011500C490CF01F001130182FEDAE8870 :108C8800D822AE8CF01F000E48E89008EA081900B8 :108C9800C08448D8201D48DC1AD8F01F00082FEDE2 :108CA800D8220000000016AB8000CAE480002E60C5 :108CB800800096A8800397D8800094C480006B2C0D :108CC800000016A28003995C800397E8D4211897C6 :108CD800F01F0027300A4A7B4A7CF01F0028300A20 :108CE8004A7B4A8CF01F00254A7B300A4A7CF01FD9 :108CF80000230E9A4A6B4A7CF01F0020300A4A6B08 :108D08004A6CF01F001E4A6B300A4A6CF01F001BA9 :108D18000E9A4A5B4A5CF01F0019300A4A4B4A5CBB :108D2800F01F0016300A4A4B4A4CF01F0014300A54 :108D38004A3B4A4CF01F0011300A4A3B4A3CF01F9C :108D4800000F300A4A2B4A3CF01F000C300A4A2B0D :108D58004A2CF01F000A300A4A1B4A2CF01F000751 :108D6800300A4A1B4A1CF01F0005D82280008620C2 :108D7800800085DC80039804800085F08000857879 :108D88008003980C80007E448003981480007F70D4 :108D98008003981C800079F48003982480007DC8A3 :108DA8008003982C80008494800398348000633476 :108DB800800398408000834C80039848800084009A :108DC80080039850800082E4800398588000821CB9 :108DD800800398608000817C80039868800080D43C :108DE800800398748000791080039880D4211897A4 :108DF800F01F000BF01F000BF01F000BF01F000B03 :108E08006E0CF01F000B48B811893008F0091800E3 :108E1800C0406E0CF01F0008D82200008000951496 :108E2800800088D080009504800193A080013BBC1D :108E3800000016A480004758D421202D3029EE7850 :108E48000000F1D9D1A23019F1D9D0033007501858 :108E58000E9B5007337CF01F000F1A9BFE7C3800D6 :108E6800F01F000D0E9BE06A01A4FE7C3800F01F85 :108E7800000B0E9BE06A0348FE7C3800F01F0008D8 :108E88000E9BFE7C3800F01F00072FEDD822000053 :108E98008000A2308000A8388000A8F08000A926B1 :108EA8008000A8D4D401333CF01F0009334CF01FD4 :108EB8000008335CF01F0006333CF01F0006334CFB :108EC800F01F0004335CF01F0003D8028000A2A842 :108ED8008000A2E6D421202DF01F0034F01F0034BA :108EE800F01F0034F01F0034E06C1B00EA1C00B7D0 :108EF800F01F00324B28201D4B2C1AD8F01F0032CF :108F080030CB301CF01F00312FED1897580CC08162 :108F18004AF8201D4AFC1AD8F01F002B2FED344BBD :108F2800301CF01F002A8F0CC0814A98201D4A9CD3 :108F38001AD8F01F00252FED3FF80E9CAEC8F01F81 :108F48000026300B169CF01F0025F01F0025F01F8F :108F58000025C0804A48201D49EC1AD8F01F001A85 :108F68002FEDFACAFFFC0E9B4A0CF01F0021581C7B :108F7800C0C1401A49FB0E9CF01F001F581CC0516D :108F88000E9CF01F001ECFDB58CCC04058DCC061DF :108F9800C03849BCC04849BCC02849BCF01F000AB9 :108FA800F01F001ACFEB000080008A88800076E06E :108FB80080008EAC80008E408000AAE88003970C69 :108FC80080039888800094C48002DC3C800398A8C1 :108FD80080039DC080008CD4800095C88000C8E4C0 :108FE8008000895C800398B8800088E880013E880A :108FF80080008AA0800193BC80008DF4800398E4EF :109008008003990C8003993080009514D4314A1458 :1090180058095F081296189716951493A888E06067 :109028000100E06100FFC2E88920A868E203190096 :10903800E069FFFFE7D9E828E9F88A02E06901005A :1090480088E8F2080108682989151039E9F8BA0290 :10905800EE021608049CF01F0010301CF01F000FD1 :10906800F01F000F5806C090049CF01F000E301C23 :10907800F01F000DF01F000D6828101310071005D1 :109088005C83F1D7C0085803CD01069CD832000094 :10909800000016AC8000A0408000A19880009ED4FB :1090A80080009F5C8000A17080009E94D4013009EC :1090B8005C7AF01F0002D80280009014D40148584E :1090C80090E9701B120C702AF01F0003D8020000F0 :1090D800000016AC8002E736D4014888189B118A34 :1090E8003009F20A1800C07090E9701C120B702A3F :1090F800F01F0003D8020000000016AC8002E7361B :10910800D421208D48D8F0E60008FAE70008F0EAF4 :109118000000FAC8FFF0FAEB0000F0E70008F0EBF7 :109128000000E06CF980EA1C0337F01F0005300CE2 :109138002FCD2FCDD82200008003996C8000A1C0CC :10914800D401FAC9FFFCF01F0002D80280031C1CDE :10915800D401F01F0002D8028002EE88D401F01F6B :109168000002D8028002ECACD401F01F0002D80241 :109178008002F0ECD401F01F0002D8028002E71050 :10918800D401F01F0002D8028002EE2CD401F01F97 :109198000002D8028002ED84D401F01F0002D80238 :1091A8008002ECC8D401F01F0002D8028002EE0C45 :1091B800D401F01F0002D8028002EDD0D401F01FC4 :1091C8000002D8028002E87ED401F01F0002D80213 :1091D8008002E8BCD401F01F0002D8028002E73602 :1091E800D401F01F0002D8028002E28CD401F01FE3 :1091F8000002D8028002E8D0D401F01F0002D80291 :109208008002E2A4D401580CC0707808B08B7808AA :109218002FF89908D802F9DBC008F01F0002D8021D :10922800800078A0D431189616971495580AE08AC9 :1092380000153008109AC0282FF8EE08070BF40B19 :109248001800CFB10A38F9B50400EBD8E515EDB927 :109258000001C0313303C0283203E9D9C001C090EE :109268003004C1082FF42015069B0C9CF01F000D3C :109278005805FE99FFF9C0682FF42FF70C9CF01FD2 :1092880000090F8B580BCF91C0782FF42015069B3F :109298000C9CF01F00045805FE99FFF9089CD83271 :1092A8008000920CD431204DFAC4FFCC109368177B :1092B800189568041698580BC0B13308BADB08999A :1092C800069ABAC8FACBFFFCF01F001FC3985809CA :1092D8005F1B58AA5F09F7E90009C0605808C04435 :1092E8005C383016C0283006EECB003A3009FAC791 :1092F800FFF00EF9C0B8F00A0D00029912985898BC :10930800F1DBE9082D080EF800985808CF515806E7 :10931800C1005803C0B0EDB40001C08132DB0A9C23 :109328002013F01F000A3016C04832D830060EF855 :109338000899069A0E9B0A9CF01F00030C0C2FCD6F :10934800D83200008000922C8000920CD431203D4D :109358003007500A18951696325432D3330230919A :109368003730C978E8081800E081008E2FF60D889C :109378005808E0800093E8081800E0800085E608B7 :109388001800F9B90100F7B600FFF9B90001C038B3 :109398002FF6A1B90D88E4081800CFB03008C048EE :1093A800F80E00182FF60D8AF008002EF4CC0030C5 :1093B800F4CB0030E20B1800FE98FFF4E00A180026 :1093C800C0A1109A4008110B50084B98580BF00B8D :1093D8001700C548364BF60A1800C0A1361B400ACC :1093E8001ADB1AD93019740B2FCA502AC358370BF5 :1093F800F60A1800C121361A40091ADAF2CAFFFC27 :10940800501A308A1ADA720B3009310A0A9CF01F96 :1094180000292FED1807C3C8378BF60A1800C0417A :10942800400A361BC078358BF60A1800C091400AEE :10943800341B1ADB1AD9740B2FCA502ACE6B375B30 :10944800F60A1800C0B1361B400A1ADB1AD93009CF :10945800740B2FCA502A30AACDAB363BF60A180037 :10946800C171109A4008700B2FC8FB6B0008500898 :10947800FACBFFF83008FB6800090A9CF01F000EC1 :109488001807C0682FF70D8B0A9CF01F000C2FF6E9 :109498000D885808FE91FF685805EBF81000F9B9D7 :1094A8000100F1F91E000E9C2FDDD8328003997C53 :1094B800800092AC8000922C8000920CD401189B02 :1094C800FACAFFFC300CF01F0002D8028000935447 :1094D800D40148A972082FF89308F2F800CC58086C :1094E800C040F2FC00D45D18FE780D003019918957 :1094F8007078D402D6030000000001184838F0F94B :1095080000D0700CB33C5EFC00000118D431495601 :1095180030020C9730152F46EEC1FF2C0E930E9497 :109528000D88E4081800C18166086E291039E08B9F :1095380000146C185808C0306C2C5D180D98EA0897 :109548001800E9F80000EFF90001F3D8E008EFF897 :109558000A02EDF51E002EC62EC70236CE21D832DD :1095680000000118D431300E189830A5494C1C96CB :109578002FCCFCC3FFFF1897F9340008EC0418003F :10958800C071FDD3C0082ECCEA0E1800CF311C9C48 :1095980048B530030A96FC0E002EEAF500D0F00517 :1095A8000D048F040D08EF630008EC0E0026080870 :1095B800EF6B00098F188D498D3AD83200000118D9 :1095C800D421300A16971896328B495CF01F001583 :1095D800300AFE7C0D00149BF01F00134935FE7CF9 :1095E8000D00EAFB00D0F60B1073A19BF01F0010D2 :1095F800FE7C0D00F01F000FFE7C0D00F01F000E1A :10960800EAC9FF2CEB4600CCEB4700D430182F45B5 :10961800AA882EC51235CFD1D8220000800094D850 :109628008000A3A08000A594000001188000A580F8 :109638008000A57A8000A562D401306AF01F00027C :109648005F0CD8028002E710D401F93A0020F738FD :109658000020F4081800C020D80AF01F00035F0C8F :10966800D80200008002E710D42119D919881AD924 :1096780019C91AD919B91AD919A91AD91999486732 :109688001AD9486A1AD8312B0E9CF01F00050E9C77 :109698002FADD822000016E0800399848002EC40A8 :1096A800D4214058F5D8C008F00916181ADAF5D8A8 :1096B800C108F1D8C2081ADA48671AD8486A1AD90C :1096C800310B0E9CF01F00050E9C2FCDD8220000F8 :1096D800000016F4800399A48002EC40D421488746 :1096E8001896321A300B0E9CF01F00060C9BED3AB0 :1096F80000200E9CF01F00040E9CD822000016BC0F :109708008002E8BC8002E736D431300318971696F9 :109718001491129218950694C1D805002FF4009C54 :10972800F01F0012F80300030C33E0880009201D25 :1097380048FC1AD6F01F000F2FEDC108201DEE05BA :10974800010B1AD00A9C0C0B48BAF01F000C2FED25 :1097580018050234CE350E35C021D83A30080AF83B :10976800EA07010CD83200008002EDD0800399B4DA :10977800800094C4800399CC8002EC40D4211897CF :109788002DFCF01F001B201D1ADC49ACF01F001A2D :109798000E9CF01F001A500C499CF01F00176EC851 :1097A800498C5008F01F00146EF82FED5818C0416E :1097B800495CF01F0011EF3800383049F2081800F2 :1097C800C0E03059F2081800C0603029F2081800CB :1097D800C091C03848DCC04848DCC02848DCF01FCD :1097E800000648DCF01F0004D822000080009670B4 :1097F800800399CC800094C4800096E4800399D0BB :10980800800399D8800399E8800399F480039A0823 :1098180080039A1C800384D4D421202DFACCFFFC29 :10982800F01F000C401870185808C04148ACF01FD1 :10983800000B3007C0887008F007032CF01F0008E1 :109848002FF75C57401870191237CF632FEDD822C5 :1098580080018F0480039A40800094C4800097841C :10986800D431202D300818921696BAE8169CF01FAD :10987800001DEDBC0000C04149BCF01F001C3007B2 :109888002FF649B30E94FAC5FFFCC208660BF6081A :109898000709E2190044C210E04700405F9C0D8AA6 :1098A800F60A0709E21900445F09F9E91009E8090D :1098B8001800C131BADABAC8310A300B0A9C2FE64F :1098C800F01F000CE4070B0C2FF7ED38FFFF5808CA :1098D800CDE10E9C5C5CC028300C2FEDD832000026 :1098E8008002EDD080039A50800094C40000049C4C :1098F8008002F0ECD421204D1A981AD8FAC8FFF843 :109908001AD8FAC8FFF01AD8FAC8FFE818971AD870 :10991800169C49BBF01F001B2FCD584CC221403864 :10992800E04800FFE08B001E402B580BC1A5E04B20 :1099380000FFE089001740195809C135E04900FFC8 :10994800E0890010400A580AC0C5E04A00FFE089D3 :109958000009B16BF7E811881448F1E91088C028AC :109968003008F0091618AEB8AE890E9CF3D8C208B4 :10997800F1D8C108AE99AEA82FCDD82280039A603D :109988008002EBF4486870085808F9BC00FFF9B980 :109998000101F1F91E10F9BC01015EFC0000170479 :1099A800D4214988169770085808C021DC2A580C19 :1099B800C080189B321AF0CCFFEFF01F0013C0389C :1099C800F16C003148F85807C080700C0E9B306A63 :1099D8002CECF01F000DC088700C306A2CECE06B8A :1099E80000FFF01F000A48787008F139003130088C :1099F800F0091800C021DA2AF01F0005DA2A000051 :109A0800000017048002E7368002E8BC80019EF857 :109A1800D4314A241896169714951292680358035D :109A2800C3B1338B301CF01F001E890C189BC0B1CA :109A380049C89088EDB80003C2F1201D49A849BC67 :109A48001AD8C10849ACF01F001B49691891581C65 :109A5800C0E09288EDB80003C1F1201D4928496C87 :109A68001AD8F01F00163FFC2FEDD8326808913243 :109A7800F16300109106911791259288EDB80003C3 :109A8800C020D8324888201D48DC1AD8F01F000BA7 :109A9800029C2FEDD832DC3A000017048002DC3C2F :109AA800000016A280039A8080039AE080009AC87A :109AB80080018F2480039AF8800094C480039B203F :109AC800D431202D1697581CC290C083582CC670CC :109AD8004A78583CE08101A8C998F01F00264A48F6 :109AE80018969088EDB80003C0A1F01F00234A38EB :109AF8001ADC4A3C1AD8F01F00232FED333CF01F24 :109B08000022334CF01F00216E185808E08001979E :109B18006E3B0C9C5D18E08F019249589088EDB817 :109B28000003C08149A8201D49AC1AD8F01F0015B0 :109B38002FED334CF01F0014333CF01F0014EF39A5 :109B480000103008F0091800E0800179F01F0012B9 :109B5800581CE080017448689088EDB80003E081E3 :109B6800016E201D48A848DC1AD8C659000016A264 :109B78008001997C800096E480039AC880039B3812 :109B8800800094C48000A3008000A2E680039CE8C3 :109B980080039B5480019EF880039B784B589088E3 :109BA800EDB80003C0814B48201D4B4C1AD8F01F5C :109BB80000342FED4AF89088EDB80003C0814B18A7 :109BC800201D4B1C1AD8F01F002E2FED333CF01F20 :109BD800002F6E285808C0306E3C5D18EF39001011 :109BE8003008F0091800E080012AF01F0029581CED :109BF800E080012549F89088EDB80003E081011F55 :109C0800201D4A084A3C1AD8C1699088EDB800035B :109C1800C0814A18201D4A1C1AD8F01F00192FEDC0 :109C28006E085808C0306E3C5D18EF3900103008D7 :109C3800F0091800E0800103EF390031F00918003D :109C4800E08000FDF01F00161894FACCFFFCF01F0E :109C58000015581CC591401870185808C550300593 :109C6800EEC1FFEFEEC3FFCE0A960A92C488000049 :109C7800000016A280039ABC80039BAC800094C4A9 :109C880080039A9880039BC48000A2E680019EF816 :109C980080039BE880039AA880039C1C8001997C20 :109CA80080018F04EF390031E4091800C080700882 :109CB800029CF005032BF01F0041C1F0306A4C0BE9 :109CC800069CF01F0040C0A040187008069CF005D4 :109CD800032B2DFBF01F003CC1005806C0A0401804 :109CE8006CC97008F005032870C81039E0890006AF :109CF80040187008F00503262FF55C5540187019B8 :109D08001235CD13C02830060C34C0415804E08108 :109D1800009658065F1858045F19F1E90009C20057 :109D2800089B0C9CF01F0025C1D068C8FE58FFC0D6 :109D3800E08400856CCAF0C9FFF71439E084007F1D :109D48004A299289EDB90003C0D1201D1ADA1AD820 :109D580049F84A0C1AD8F01F00202FCDC0385808EF :109D6800C0C0202DECCBFFDF306A1A9CF01F001B0F :109D7800F01F001B2FEDC17849489088EDB800030B :109D8800C0C1EECCFFEFF01F001749181ADC496C70 :109D98001AD8F01F00112FEDEECCFFEFEF3B00318A :109DA800F01F0012588CC060589CC2F0581CC21199 :109DB800C458F01F000FC4288000965080039C38B8 :109DC8008002EDE680009640000016A280039A8C7F :109DD80080039C40800094C48002E73680019DDCAB :109DE800800096E480039C6880019EA0800199CC45 :109DF80049489088EDB80003C0814938201D493C86 :109E08001AD8F01F00132FEDF01F0012581CC16064 :109E180048C89088EDB80003C111201D48A848EC37 :109E28001AD8C0989088EDB80003C081201D48B8A2 :109E380048BC1AD8F01F00062FED2FEDD8320000CD :109E4800000016A280039A8C80039C94800094C41E :109E580080019EF880039CB080039ABC80039CCC50 :109E6800D4012FEC580BC080F7DCC008FE7C28001A :109E7800F01F0005D802F7DCC008FE7C2800F01FA0 :109E88000003D8028000A6C68000A716D42148C7C0 :109E9800C098300BFE7C2800F01F000A6E082FF8CF :109EA8008F086E0CF7DCC008CF51F9DCC288F01FB0 :109EB800000630194858B089D82200000000170859 :109EC8008000A7FA80009E680000170CD40148683B :109ED800300B700CF9DCC288F01F000430094848C8 :109EE800B089D8020000170880009E680000170C8F :109EF800D421202D4948301B700CF9DCC288F01F92 :109F08000013E06B00D7FE7C2800F01F0011FAC791 :109F1800FFFAE06B00FFFE7C2800F01F000D0E9B8F :109F2800FE7C2800F01F000B9AB8EDB80007CF217F :109F38004858300B700CF9DCC288F01F00042FED74 :109F4800D82200000000170880009E688000A7FA49 :109F58008000A816D421202D49B8A96C910C49B8C5 :109F680011893008F0091800C030F01F00193009B5 :109F780049684957B0896E0C301BF9DCC288F01F5C :109F88000015E06B0082FE7C2800F01F00136E08AD :109F9800F3D8C008FAC7FFF8F7D8C10CFE7C280030 :109FA800F3EB109B0EDBB18BF01F000B0FABFE7CAD :109FB8002800F01F00090FBBFE7C2800F01F0006D8 :109FC8002FEDDA2A000017080000170C80009EF811 :109FD80080009E688000A7FAD42149381897118913 :109FE8003008F0091800C0604908700CA98CF01FEF :109FF8000010EEC6FF000F3BFE7C2800F01F000D8E :10A008000C37CFA14898300B700CF8CCFF00910C9E :10A01800F9DCC288F01F000830194838301CB089B4 :10A02800D82200000000170C0000170880009F5C71 :10A038008000A7FA80009E68D421202D4A78A96C58 :10A04800910C4A7811893008F0091800C030F01FC7 :10A05800002530094A284A17B0896E0C301BF9DCF4 :10A06800C288F01F0021E06B00D2FE7C2800F01FA0 :10A07800001F6E08F3D8C008FAC7FFF8F7D8C10C5C :10A08800FE7C2800F3EB109B0EDBB18BF01F001752 :10A098000FABFE7C2800F01F00150FBBFE7C2800CC :10A0A800F01F0012E06B00FFFE7C2800F01F000F7D :10A0B800E06B00FFFE7C2800F01F000CE06B00FF47 :10A0C800FE7C2800F01F0009E06B00FFFE7C2800E2 :10A0D800F01F00062FEDDA2A000017080000170C01 :10A0E80080009EF880009E688000A7FAD421202D69 :10A0F800498818973009118AF20A1800C070B08987 :10A108004958700CA98CF01F0015FAC5FFFAEEC665 :10A11800FF00E06B00FFFE7C2800F01F00110A9B87 :10A12800FE7C2800F01F000F9A380EC80C37CF218C :10A138004898300B700CF8CCFF00910CF9DCC28801 :10A14800F01F000930194838301CB0892FEDD8228B :10A158000000170C000017088000A0408000A7FA34 :10A168008000A81680009E68D4211897C088F01F28 :10A178000006486CF01F000620175C87483C58070B :10A18800CF71DA2A800090C40000171080009FE089 :10A19800D4211897C088F01F0006486CF01F0006ED :10A1A80020175C87483C5807CF71DA2A8000A0F452 :10A1B80000001710800090E0D4213027FAC4FFEC8B :10A1C8001896A887C0C80C9A089BFE7C2800F01F28 :10A1D8000009C020D82A09882FF8A8880988EE081D :10A1E8001800FE98FFF230094838301CB089D82290 :10A1F8008000A73C0000170CE1B80000EE18000131 :10A20800F1D8C201C020D3033019F20B094B994B86 :10A21800783958085E0CD5035EFCFE681400700996 :10A22800F3DCD0C191095EFCF8081605A968E0289E :10A23800F000581BC0D0C063582BC0F0583BC12059 :10A248005EFF3019F20C0949916991A9C108F60C11 :10A25800094B915B91ABC0B83019F20C094991696F :10A26800C0583019F20C0949915991993019F20CDA :10A27800094C912C5EFDD703D4213007189616940B :10A288000E95C0880D9B0D8C2FF72FE6F01F00044C :10A2980018450837CF830A9CD82200008000A230D6 :10A2A8003018F00C0948A59CA96CE02CF000F9487E :10A2B800004899185EFC3018F00C0948A59CA96C58 :10A2C800E02CF000F94800745EFC3018F00C0948E6 :10A2D800A59CA96CE02CF000F94800785EFC3018C9 :10A2E800F00C0948A59CA96CE02CF000F948005432 :10A2F800F948004499185EFC3018F00C0948A59CF0 :10A30800A96CE02CF000F9480058F9480044991865 :10A318005EFC301AF8081605F40C0949A968E0280B :10A32800F000F14900C4143BC080C043582BC0F171 :10A33800C098F14900A8C038F14900A4F14900B813 :10A34800C078F14900A8F14900B4C0285EFAF14983 :10A3580000945EFD3018F00C0948A59CA96CE02C0F :10A36800F000F94800985EFCF8081605A968E0288E :10A37800F000F0F800D0F00C0A4CF9DCC0015EFCEB :10A388003018F00C0948A59CA96CE02CF000F9489D :10A3980000D85EFCC008D703F3DBC0054898A59B2E :10A3A800F00B00387018F009092C4878F5DAC0026B :10A3B800F00A0329FE780800F00B09295EFC00006A :10A3C80080039CFC8003773CD42148F8E3B8000163 :10A3D80048E848F9700E48FC3008FE7B0800C0E8E1 :10A3E8007216EC0A00262FFA8D0C0E3ACFA3F60847 :10A3F800092E2F892FF85948C0407207300ACF6BB1 :10A40800D8220000800376008003773C80039CFC00 :10A418008000A39CE0680083FE790800F00C010C22 :10A42800F20C0328F0CAFFC0F20A032C580C5E0C89 :10A438004869F80C1200F2080038F80C111F70185F :10A44800F00C032C5EFC000080039CFC78C83019DB :10A45800F1D9D10399C85EFC78C83019F1D9D00177 :10A46800F1DBD20399C85EFCD421FAC4FFEC68176B :10A47800680EEFD7C003FDDEC0013004E9D7D00372 :10A48800E9DED0E1E9D7D103E9DED1E1E9DAD203A7 :10A49800E9DBD2E1E9D8D303E9D9D3E199147958B2 :10A4A800EDB80005CFD1D822D4213007405E2F8BDC :10A4B800EFD8D021EFD9D104EFDAD204EFDED306FA :10A4C800F80B0927D822F5E910192F8BF3E8102883 :10A4D800F80B0329F3D8D043F80B09295EFC2F8B1E :10A4E800F80B0328A1A8F80B09285EFC7958EDB8E9 :10A4F8000000CFD15EFC7808F1DBD00299085EFC41 :10A50800EC5BBB9FE08B0004304BC138E068C6BFF2 :10A51800EA18002D103BE08B0004305BC0A8E0680F :10A528001200EA18007A103BF9BB0306F9BB0207D0 :10A5380078A8F1DBD00399A878A8F1DAD10399A813 :10A548007808A3A899087958EDB80007CFD17808FA :10A558003019F1D9D00299085EFC7808EDB80004EA :10A56800CFD07808A1A899087808EDB80004CFD012 :10A578005EFC301899485EFC7808EDB80004CFD02E :10A58800992B7808EDB80004CFD05EFCD42130F8C0 :10A5980014951697F00A18005FBA30181896F00B41 :10A5A80018005FB9F5E91009C020D82AF00B180087 :10A5B800C0A1FE7C0C00F01F0015300BFE7C0C00C7 :10A5C800F01F00136C08EDB80004CFD0A377B1A733 :10A5D800EFE510878D076C08EDB80004CFD06C0844 :10A5E800E2180010CFD18D186C08EDB80004CFD058 :10A5F8006C08EDB80004CFD03FF88D286C08EDB892 :10A608000004CFD0DA2A00008000A4548000A4609F :10A618003038F00A18005FB93078F00B18005F88FE :10A62800F3E81008C1913108F00B1800E08B001511 :10A63800E06800809908208BF4081601F5DAC0015B :10A64800F1EB104B580AF9BA0100F9BA0002F7EA1F :10A65800100A99CA5EFD302C5EFCD4013019189896 :10A66800F73B000DF20B1800E0880004302CD802EC :10A67800300AE06900809909301E7019149CF3DED5 :10A68800D001F3DBD081F3DAD0E130FAF3DAD20487 :10A698009119D802D4013018F00B18005FBEF00AE7 :10A6A80018005FB81C48C030302CD8027818F1DB8D :10A6B800D021F1DAD041F1D9D3089918D80A7819FC :10A6C8001898EA19000F9919781CE21C0004C100B7 :10A6D80030E9F20B1800E08B001A7019B16B300CDE :10A6E800EA1BFFF0E81BFFFF126B911B5EFC303981 :10A6F800F20B1800E08B000B70192F0B301AF40BBB :10A70800094B5CDB126B911B5EFC302C5EFCE06835 :10A718002710C0585808C0215EFF20187849EDB9A5 :10A728000009CF917818EA18000F9918FC18010051 :10A7380099085EFDD4313036F737000CEC07180065 :10A74800E08B0050F733000B301EFC031800E08B41 :10A758000049F73800083079F2081800E08800420C :10A768003109F2081800E08B003D7619F205160150 :10A77800F4050005EA090D04E8C90001E04900FEF6 :10A78800E08B0030F0CA00080E923008EC1200018D :10A79800A197F1D7D001F1D2D021F1D3D061F1DA6C :10A7A800D084F73A0009F1D4D1081789F1DAD20830 :10A7B800F73A000AF1DAD308FC091800C0C0C093C0 :10A7C800302AF4091800C090EC091800C0A1C0781C :10A7D80099C8C06899D8C04899E8C02899F8D83A63 :10A7E800302CD832301899085EFC784CF9DCC0213E :10A7F8005EFCE0682710C0585808C0215EFF20188A :10A808007849EDB90001CF915C7B993B5EFDE0682A :10A818002710C0585808C0215EFF20187849E2194F :10A828000201E0490201CF717828300CB6085EFCBD :10A8380076095829E08800035EFE7618A769109B00 :10A84800E61BC000120CF3D8C003AFB91649109B21 :10A85800E61B30001649109BE61B0C001649109B9E :10A86800E61B03001649109BE61B00C01649109B07 :10A87800E61B00301649109BE61B000C1649109B7E :10A88800E61B00031649109BE21B60001649109B4B :10A89800E21B10001649109BE21B0C001649109B86 :10A8A800E21B03002FCC1649109BE21B0080109A74 :10A8B8001649E21A0008109BE2180030E21B00401B :10A8C8001649F3E81008144899085EFDF6081506BD :10A8D800582BF9BC0BFFF9D8E80CF9B80805F9F8BA :10A8E8008A00F9BC08005EFC582BE08800035EFE75 :10A8F800F6081506F80800082FC87008EDB8000F0C :10A90800C0C1A76BF3DAC010160C2ECC7808E0187B :10A918000000F3E810089908F9DAC0105EFC582B1B :10A92800E08800035EFEA76B160C7818EDB8000FE0 :10A93800C0A12E4CF3DAC0107808E0180000F3E844 :10A9480010089908F9DAC0105EFCD401F60E150457 :10A958001C3AF9BE0210F9BE0308FC0B024BF608BC :10A968001601F00A003AF40B0D0AF4091603F2C8AE :10A978000001E048FFFEE0880003DA0A7818E86B77 :10A988000000E418FFF7E018FECF590EF60E171076 :10A99800F9BE0000FDE810089918F5DAC003F3EADB :10A9A80011099989D80A7858EDB80001C030302CBF :10A9B8005EFCF7DBC009997B5EFD7858E21800E081 :10A9C800C030304C5EFC7859EDB90000F9BC010389 :10A9D800F9F90006F00C1700E06A01FFF3DAE02845 :10A9E800F7F80A005EFCE1B80000EE180001F1D8A3 :10A9F800C201C020D3033FF9993978595808C020BB :10AA0800D50330089918999899A8EA68610C9908AB :10AA18005EFCD703D421201D500A16961897F01F04 :10AA2800002F400A5806C5500DC83049F2081800D2 :10AA3800E08800503095EA081800E08B004B0DD9EB :10AA48003078F0091800E08B00458C39E068010186 :10AA5800F0091900E08B003EED3900083038F009A4 :10AA68001800E08B00376C0B0E9CF01F001D581C63 :10AA7800C3000DC8EA081800C0416E18B1B8C05824 :10AA880020586E19F3E810688F186E19ED3A00080F :10AA98000DD8A978F1EA10E812488F18302A8C38B6 :10AAA800F3D8C010F4081900E08800086E18ADB893 :10AAB8008F1820298FA9C0586E18F1E910C98F196D :10AAC8006E18E018FFF08F18300C35088F08C02872 :10AAD800301C2FFDD82200008000A9EE8000A9526A :10AAE8004828910C5EFC0000000018E8D431189842 :10AAF800783E580EC620F90600105806C5E0300901 :10AB08003FF3129A3344C1780E91E8071800C0A1A8 :10AB1800F2CAFFFEF4C9FFFF5C7A5C89FC0A070AE7 :10AB2800C0A8F6071800C4A05C75FC050709E4096D :10AB380000095C89EC091900C0F2F2C5FFFFF9D9D8 :10AB4800C0105C85FC0C000CEAC2FFFF19870E914F :10AB5800E6071800CDA1580AC3003019F20A1800F8 :10AB6800C0617028E06900802948C0C87028302971 :10AB7800F20A1800C0412D483409C0482D48E06940 :10AB880000C0300C3FF7C0D8F60A1800C1705C7ED0 :10AB9800F00E070CEC0C000C5C8CF20C1900C0D207 :10ABA800F8CEFFFF5C7C5C8EF00C000CFCC6FFFF4F :10ABB800198AEE0A1800CE91300CD832D401F9085F :10ABC800001CF3D8C010F2CEFFFE140EE04E004475 :10ABD800E088000F48F8201D1AD8E06804E31AD866 :10ABE80048D848EC1AD8F01F000E2FCDC008786E50 :10ABF800FC090009F36B00F02FF8786BF3D8C0104C :10AC0800F6090009F36A00F02FF8F958001CD80279 :10AC180080039DC480039E0880039D9C800094C48B :10AC2800D4013439F908001CF2081900E088000F33 :10AC380048C8201D1AD8E06804EE1AD848A848BCAD :10AC48001AD8F01F000B2FCDC008786AF3D8C010AF :10AC5800F4090009F36B00F02FF8F958001CD8022A :10AC680080039DC480039E5080039D9C800094C4F3 :10AC7800D401580CC0E14B18201D1AD8E068062BE7 :10AC88001AD84AF84AFC1AD8F01F002F2FCDC0084E :10AC9800786A580AC0E14A98201D1AD8E068062C3C :10ACA8001AD84AA84A7C1AD8F01F00272FCDC00806 :10ACB800F908001C3439F2081900E088000F49F837 :10ACC800201D1AD8E068062D1AD84A1849DC1AD867 :10ACD800F01F001D2FCDC008F7D8C010160A3FFB83 :10ACE800F56B00F02FF8129B5C88300AF958001CAD :10ACF800C1584928201D1AD8E06806321AD8494890 :10AD0800490C1AD8F01F00102FCDC008F1DEB01082 :10AD1800786EFC090009F36A00F0F0CEFFFFF3D863 :10AD2800C010F6081900FE98FFF3F958001CF3D973 :10AD3800C002CE01D802000080039DC480039E8C0F :10AD480080039D9C800094C480039EB080039EDC99 :10AD5800D401F908001CF3D8C010F2CAFFFEE04A7B :10AD68000044E088000F4918201D1AD8E06804F54F :10AD78001AD848F848FC1AD8F01F000F2FCDC00881 :10AD8800786AF4090009F5DBC108F36A00F02FF8C6 :10AD9800786AF3D8C010F4090009F36B00F02FF8B3 :10ADA800F958001CD802000080039DC480039F1C32 :10ADB80080039D9C800094C4D401F908001CF3D83A :10ADC800C010F2CAFFFCE04A0044E088000F49B80E :10ADD800201D1AD8E06804FD1AD84998499C1AD849 :10ADE800F01F00192FCDC008786AF4090009F60A87 :10ADF8001618F36A00F0786A2FF8F3D8C010F4092F :10AE08000009F5DBC208F36A00F0786A2FF8F3D876 :10AE1800C010F4090009F5DBC108F36A00F02FF847 :10AE2800786AF3D8C010F4090009F36B00F02FF822 :10AE3800F958001CD802000080039DC480039F605D :10AE480080039D9C800094C4D421F9380035A3D890 :10AE5800F9680035189678A75807C2406E1C580C38 :10AE6800C050F01F001130088F186E285808C09184 :10AE78006E355805C061EF090010EA091900C0E0F5 :10AE880048A8201D1AD8E06804C51AD84888489CE4 :10AE98001AD8F01F00092FCDC0080E9CF01F00071C :10AEA8008DA5D8228001122880039DC480039FA00D :10AEB80080039D9C800094C48002E28CD421189762 :10AEC800782C580CC050F01F000830088F286E3CB2 :10AED800580CC070F01F00043008EF5800108F386D :10AEE800D82200008002E28CD4211896580CC0E1C8 :10AEF8004AE8201D1AD8E06805D11AD84AC84ADCA1 :10AF08001AD8F01F002D2FCDC00878A75807C0E128 :10AF18004A68201D1AD8E06805D31AD84A784A5CCE :10AF28001AD8F01F00252FCDC0086E585808C0E069 :10AF380049E8201D1AD8E06805D41AD84A0849DC1F :10AF48001AD8F01F001D2FCDC0086E655805C0E047 :10AF58004968201D1AD8E06805D51AD84998495C6F :10AF68001AD8F01F00152FCDC0080A9AE06B0134DB :10AF78000A9CF01F00158F5CC041E06C00FFD822CE :10AF88009859E0680133F0091900E08B00214878EE :10AF9800201D1AD8E06805DD1AD848C8485C1AD8B8 :10AFA800F01F00052FCDC00880039DC480039FB407 :10AFB80080039D9C800094C480039FD880039FFCDD :10AFC8008003A0288000D3188003A054EF38001312 :10AFD800EA081800C0514D3870092FF991097818FE :10AFE800301B8F684CF9720A8F0AB09BB08B306B9C :10AFF800B0ABF40B1618B0CBF7DAC2083009B0FAC8 :10B00800B0DBF5DAC108305BB0B9F1690008F16965 :10B018000009F169000AF169000BF169000CF16996 :10B02800000DF169000EF169000FB0EAEF3A001265 :10B03800F60A18005F0C30ABF60A18005F0BF9EB44 :10B04800100BF20B1800C0513049F20A1800C0D199 :10B058000DC9F169000C0DD9F169000D0DE9F1690F :10B06800000E0DF9F169000F3009ECCAFFD1F16942 :10B078000010F1690011F1690012F1690013F1691A :10B088000014F1690015F1690016F1690017F169FA :10B098000018F1690019F169001AF169001BF0CB79 :10B0A800FFE4ED35002E3106EA091900F9BC02006B :10B0B800F5FC380016CC2FF92FFA5C89EC09190039 :10B0C800CF413009F0CAFFD4129C340B14CC2FF9AD :10B0D8005C89F6091900CFB13009F0CAFF94129CB7 :10B0E800E06B008014CC2FF95C89F6091900CFB108 :10B0F8003639F16900EFF16900EC3829F16900EDA2 :10B108003539F16900EE344A3009F0C8FF10EF59BB :10B11800001C10C92FF95C89F4091900CFB1D82A8D :10B12800000001F0D421580CC0E14A28201D1AD88B :10B13800E06806141AD84A084A0C1AD8F01F0020EA :10B148002FCDC00878A75807C0E149A8201D1AD8F4 :10B15800E06806161AD849B8498C1AD8F01F0018A2 :10B168002FCDC0086E5C580CC0E14928201D1AD8A4 :10B17800E06806171AD84948490C1AD8F01F001079 :10B188002FCDC0086E685808C0E148A8201D1AD8FD :10B19800E06806181AD848D8488C1AD8F01F000852 :10B1A8002FCDC008F01F000A30088F688F58D822AA :10B1B80080039DC48003A09880039D9C800094C454 :10B1C8008003A0BC8003A0E08003A10C8000D13CD8 :10B1D800D42130D878A7EF390012F0091800EFF819 :10B1E8001E12F9B80100EFF81E13300818968FE800 :10B1F8008F988FB88FA88FD88FC8EF48004CEF482A :10B208000048EF480044F01F0029EBDCC008C201E9 :10B21800301A335B0E9CF01F0026307B0E9CF01F0B :10B2280000250E9CF01F00246E5CEF0B001CF6CB73 :10B23800FF105C7BF01F00210C983439EECAFFDC4C :10B248006E5B6E1CF01F001E0C9CF01F001EEF387A :10B2580000132FF85C58EF6800133099F2081800B3 :10B26800E0880005E0692710C058E06903E8F009A4 :10B2780002495C79E06801F4F2C9FE0DF2080C0895 :10B288000C9CEF58001EF01F00100C9C48FBF01F90 :10B2980000100C9C48DBF01F000F0C9C48BBF01FF3 :10B2A800000E0A9CD82200008000AEF08000ABC4DB :10B2B8008000AC288000AC788000D2108001139008 :10B2C8008000B12C8000CABC8003B4098000CBC8C0 :10B2D8008000CA748000CA92D421305878A7EF3908 :10B2E8000012F0091800EFF81E12F9B80100EFF883 :10B2F8001E131896F01F0026EBDCC008C2A1301AF6 :10B30800335B0E9CF01F0023303B0E9CF01F002285 :10B31800302A339B0E9CF01F001FED1B002C0E9C47 :10B32800F01F001E0E9CF01F001E6E5CEF0B001C31 :10B33800F6CBFF105C7BF01F001B0C983439EECA6B :10B34800FFDC6E5B6E1CF01F00180C9CF01F0017D2 :10B35800EF3800132FF85C58EF6800133099F208A3 :10B368001800E0880005E0694E20C058E06907D061 :10B37800F00902495C790A9CF2C9FE0DE06801F403 :10B38800F2080C08EF58001ED82200008000AEF02A :10B398008000ABC48000AC288000AD588000AC7839 :10B3A8008000D210800113908000B12CD42118960F :10B3B800580CC0E14AF8201D1AD8E06802F51AD8DE :10B3C8004AD84AEC1AD8F01F002E2FCDC00878A70B :10B3D8005807C4E0EF3900123088F0091800C4811A :10B3E80017B8178A1799B169F3EA118917AAF3EA06 :10B3F8001089F1E910096EA81039C3A130C8EF68A7 :10B4080000123008EF680013F01F001E5C5CC28158 :10B41800301A335B0E9CF01F001C304B0E9CF01F43 :10B42800001B304A332B0E9CF01F00176EAB0E9C8E :10B43800F01F00170E9CF01F00176E5CEF0B001C2E :10B44800F6CBFF105C7BF01F00140C983439493A96 :10B458006E5B6E1CF01F00120C9CF01F0012EF3880 :10B4680000132FF8EF6800133148EF58001ED82258 :10B4780080039DC48003A13880039D9C800094C4F0 :10B488008000AEF08000ABC48000AC288000ADC066 :10B498008000AC788000D2108003B405800113903E :10B4A8008000B12CD421303878A7EF390012F00988 :10B4B8001800EFF81E12F9B80100EFF81E131896DD :10B4C800F01F002AEBDCC008C321301A335B0E9C46 :10B4D800F01F0027303B0E9CF01F0026302A339BBC :10B4E8000E9CF01F0023E06B02400E9CF01F002210 :10B4F800304A332B0E9CF01F001E6EAB0E9CF01FC3 :10B50800001F0E9CF01F001E6E5CEF0B001CF6CB9C :10B51800FF105C7BF01F001B0C98343949AA6E5B46 :10B528006E1CF01F001A0C9CF01F0019EF38001356 :10B538002FF85C58EF6800133099F2081800E0887B :10B548000005E0692710C058E06903E8F0090249DE :10B558005C790A9CF2C9FE0DE06801F4F2080C0857 :10B56800EF58001ED82200008000AEF08000ABC467 :10B578008000AC288000AD588000ADC08000AC7859 :10B588008000D2108003B405800113908000B12C94 :10B59800D4214BD811B9118B119A11A8B16AF5EBC6 :10B5A800118AF5E81088F3E8100878A78FA8EF3912 :10B5B80000123068F0091800EFF81E12F9B80100FF :10B5C800EFF81E131896F01F0031EBDCC008C3E13A :10B5D800301A335B0E9CF01F002E301B0E9CF01FA0 :10B5E800002D302A339B0E9CF01F0029ED1B002CE8 :10B5F8000E9CF01F0029304A337B0E9CF01F00245C :10B60800301B0E9CF01F0023303B0E9CF01F0021C6 :10B6180031CB0E9CF01F001F306B0E9CF01F001DDD :10B628000E9CF01F001E6E5CEF0B001CF6CBFF108B :10B638005C7BF01F001B0C98343949AA6E5B6E1CAA :10B64800F01F00190C9CF01F0019EF3800132FF899 :10B658005C58EF6800133059F2081800E0880005BC :10B66800FE79EA60C058E06903E8F20809495C79A4 :10B678000A9CF2C9FE0DE06801F4F2080C08EF58C4 :10B68800001ED8228003B4098000AEF08000ABC44D :10B698008000AC288000AD588000AC788000D210C3 :10B6A8008003B405800113908000B12CD421301898 :10B6B80078A7EF390012F0091800EFF81E12F9B850 :10B6C8000100EFF81E131896F01F0039EBDCC008D4 :10B6D800C501301A335B0E9CF01F0036303B0E9CC0 :10B6E800F01F0035302A339B0E9CF01F0032ED1BF3 :10B6F800002C0E9CF01F0031304A332B0E9CF01F9B :10B70800002D6EAB0E9CF01F002E304A336B0E9C42 :10B71800F01F00286E9B0E9CF01F0029304A337BD7 :10B728000E9CF01F0024301B0E9CF01F0023303BA2 :10B738000E9CF01F002131CB0E9CF01F001F306BB8 :10B748000E9CF01F001D0E9CF01F001E6E5CEF0B80 :10B75800001CF6CBFF105C7BF01F001B0C983439E3 :10B7680049AA6E5B6E1CF01F001A0C9CF01F001992 :10B77800EF3800132FF85C58EF6800133059F208BF :10B788001800E0880005FE79EA60C058E06903E81F :10B79800F20809495C790A9CF2C9FE0DE06801F4D7 :10B7A800F2080C08EF58001ED82200008000AEF006 :10B7B8008000ABC48000AC288000AD588000ADC0CC :10B7C8008000AC788000D2108003B405800113900B :10B7D8008000B12CD421304878A7EF390012F00945 :10B7E8001800EFF81E12F9B80100EFF81E131896AA :10B7F800F01F0025EBDCC008C291301A335B0E9CA9 :10B80800F01F0022303B0E9CF01F0021302A339B92 :10B818000E9CF01F001EED1B002C0E9CF01F001D3F :10B828000E9CF01F001D6E5CEF0B001CF6CBFF108A :10B838005C7BF01F001A0C983439499A6E5B6E1CB9 :10B84800F01F00180C9CF01F0018EF3800132FF899 :10B858005C58EF6800133099F2081800E08800057A :10B86800E0692710C058E06903E8F00902495C79EB :10B878000A9CF2C9FE0DE06801F4F2080C08EF58C2 :10B88800001ED8228000AEF08000ABC48000AC2837 :10B898008000AD588000AC788000D2108003B405D9 :10B8A800800113908000B12CD4314A5830167007AB :10B8B80030A20C9330043055C3E86EA85808C3A0D2 :10B8C800F1090022F2CA0001F15A0022EC0919001C :10B8D800C151F1380012E40818005F0AE6081800A0 :10B8E8005F09F5E91009E8091800C041EA081800DD :10B8F800C2110E9CF01F0013C1D8F1090020F2CA32 :10B908000001F15A0020EC091900C141F138001278 :10B91800E40818005F0AE60818005F09F5E910094D :10B92800E8091800C041EA081800C0410E9CF01F41 :10B9380000066E075807CC21D8320000000080CCE2 :10B948008000B7DC8000B2E0D4211896580CC0E122 :10B958004C08201D1AD8E068024E1AD84BE84BFC58 :10B968001AD8F01F003F2FCDC008F9380035A3D8EA :10B97800F968003578A7F909002CE068023FF0095A :10B988001900E088008B5807C091350CF01F00356E :10B998001897E08000838DACC2E86E1C580CC0304C :10B9A800F01F00316E585808C0E04AA8201D1AD868 :10B9B800E068026C1AD84AD84A8C1AD8F01F0028B6 :10B9C8002FCDC0086E285808C0916E385808C0613D :10B9D800EF090010F0091900C0E049E8201D1AD845 :10B9E800E068026E1AD84A2849CC1AD8F01F001C01 :10B9F8002FCDC008350A300B0E9CF01F001EF01F1B :10BA0800001E8F1C1895C0610E9CF01F001C8DA590 :10BA1800C178344A49ABF01F001B499B343A6E1C6D :10BA2800F01F00190C9A499B6E1CF01F00190C9C02 :10BA3800F01F00185C5CC0700C9CF01F0017E06CD5 :10BA480000FFD822ED380035A3B8ED680035D822BC :10BA580080039DC48003A13880039D9C800094C40A :10BA68008002E2A4800112288003A14880039FA0DD :10BA78008002E8BC800112008002E28C8003B409D5 :10BA880080011260800113208000BBBC800111F886 :10BA98008000B5988000AE50E06C00FFD82200000E :10BAA800D421202D1896580CC0E14BA8201D1AD877 :10BAB800E06803781AD84B884B8C1AD8F01F0038E6 :10BAC8002FCDC00878A75807C0E14B28201D1AD8E9 :10BAD800E068037A1AD84B384B0C1AD8F01F00309C :10BAE8002FCDC0086F295BF9C1102E2933C8E06A31 :10BAF800FFFFF2080D081438F40817B0EF580020BB :10BB08005808F9B80001EFF80C106F395BF9C1104B :10BB18002E2933C8E06AFFFFF2080D081438F4082C :10BB280017B0EF5800225808F9B80001EFF80C11C7 :10BB38006EB850185808C041FC18FF0050186EC85D :10BB480050085808C0716EA84019F3E80008A1A869 :10BB58005008EECBFFD80C9CF01F0013FACBFFFC6B :10BB68000C9CF01F00121A9B0C9CF01F00110C9CDF :10BB7800F01F0010EF39001230A8F0091800EFF894 :10BB88001E12F9B80100EFF81E132FEDD82200009D :10BB980080039DC48003A16080039D9C800094C4A1 :10BBA8008003A17C8000CBC88000CA928000CA7440 :10BBB8008000CB88D43178A71896149574186E290C :10BBC8005809C0916E395809C061EF0B0010F20B8B :10BBD8001900C0E04BE8201D1AD8E06805651AD89E :10BBE8004BC84BDC1AD8F01F003D2FCDC0088A5B2C :10BBF80032BAF40B1900E088020F118B302AF40BCB :10BC08001800E0810209F93C002EECCBFFD1F0CA04 :10BC1800FFE4C0982FF917345C59153EFC0418004E :10BC2800E08101FAF8091800CF6311FA11CB11D994 :10BC380011E8B169F3EB1189F3E810896E08F5E9A9 :10BC480010091039E08101E80E9CF01F00258A4C8C :10BC5800E06800F0F00C1900E088000FF8CC00F064 :10BC6800EF5C00105C7CF01F001F8F3CC051EF5C44 :10BC78000010E08F01D1E06C00F0F01F001A8F2C4B :10BC88001894C0C16E3C580CE08001C6F01F001625 :10BC9800EF5400108F34E08F01BF189B3009E06A21 :10BCA80000F00A9CF01F0011E06800F0F00C190089 :10BCB800C2004878201D1AD8E068052E1AD848C84E :10BCC800485C1AD8F01F00052FCDC00880039DC41A :10BCD80080039FA080039D9C800094C48000AEC414 :10BCE8008002E2A48002E28C8000CEC48003A1948A :10BCF8006E3B580BE08001B2E06900F0EF1A0010CB :10BD08000A9CF01F0036EF080010F8081900E080C0 :10BD180001A54B38201D1AD8E06805351AD84B18EC :10BD28004B1C1AD8F01F00312FCDC00819A8305A63 :10BD3800F4081800E0810100EF3800123019F20809 :10BD48001800E08100EC30086CA4333B89D889B82E :10BD580089C8089CF01F0026C0F0F8C8FFFC19AB82 :10BD6800119919BA1188B16AF5EB118AF5E81088AA :10BD78001248E948004433AB089CF01F001DC0E09E :10BD8800F8C8FFFC19AB119919BA1188B16AF5EB1B :10BD9800118AF5E810881248C0386918A198E9484E :10BDA800004833BB089CF01F0012C0E0F8C8FFFC35 :10BDB80019AB119919BA1188B16AF5EB118AF5E82E :10BDC80010881248C0286918E948004C6828F0C94A :10BDD800FFF0C0F11298C1C88000CEC480039DC492 :10BDE8008003A1C880039D9C800094C48000AAF4AD :10BDF800F1390013F13B0010F13A0011F13800124B :10BE0800B16AF5EB118AF5E81088F3E8100889A8FB :10BE1800301B089CF01F0084C0E0F8C8FFFC19AB79 :10BE2800119919BA1188B16AF5EB118AF5E81088E9 :10BE3800124889B8303B089CF01F007BC0E0F8C866 :10BE4800FFFC19AB119919BA1188B16AF5EB118A7F :10BE5800F5E81088124889C831CB089CF01F007299 :10BE6800C0E0F8C8FFFC19AB119919BA1188B16A7A :10BE7800F5EB118AF5E81088124889D8306B089CD0 :10BE8800F01F00691892C2E01998A38889E8582819 :10BE9800F9B80B02E9F8BA0E3003C1D8E608150262 :10BEA800E6C9FFF22FE8E8090029E4080008113E76 :10BEB800113AB16AF5EE118A118EF5EE108A1191D8 :10BEC800069CF5E11001F2CBFFFC93112FF3F01F54 :10BED80000575C5368E81033CE23069C4D4BF01F87 :10BEE80000536CA43008E93A00123089EF58001E5C :10BEF800F20A1800E9F91E12E9F81E130C9C300A20 :10BF0800E8CBFFD8F01F004BE93800132FF8E96899 :10BF180000133018E958001EC7E820383029F20805 :10BF28001800E08B007930080C9CEF58001EF01FB9 :10BF38000042C7183069F2081800C3513019EF38A9 :10BF48000012F20818005F0B3039F20818005F0978 :10BF5800F7E91009C0813049F2081800C040F40818 :10BF68001800C5916CA40C9C3003EF53001EF01F01 :10BF780000330C9C4AEBF01F00320C9C4ACBF01F9C :10BF880000310C9C4AABF01F0030E939001230C870 :10BF98000C9CF0091800E9F31E13E9F81E12F01FB3 :10BFA800002BC398302AF4081800C351EF38001248 :10BFB800F2081800C30130086CA4EF58001E336B58 :10BFC800089CF01F0019C270F8C8FFFC19AB119942 :10BFD80019BA1188B16AF5EB118AF5E81088124888 :10BFE80089986828F0C9FFF0C0311298C108F13962 :10BFF8000013F13B0010F13A0011F1380012B16A58 :10C00800F5EB118AF5E81088F3E8100889A80C9C6C :10C01800F01F000F0E9CF01F000F0A9CF01F000E6F :10C02800D83200008000AAF48000C19C8003B409C3 :10C038008001384C8000BAA88000CABC8000CBC8F8 :10C048008000CA748000CA928000B5988000B6B497 :10C058008000AEC48000D13C335B0E9CF01F00030F :10C06800FE91FE66CD8B00008000AAF4D4314C18F6 :10C07800301370073002069430813050C7686EA6BE :10C088005806C720ED05001EE6051900E0880006E1 :10C098002015ED55001EC688E6051900C651ED3875 :10C0A8000012306AED52001EF40818005F0A30C909 :10C0B800F20818005F09F5E91009300AF4091800B8 :10C0C800C501E8081800C0B1ED380013E0081800F1 :10C0D800E08B00360E9CF01F0028C468E2081800A8 :10C0E800C191ED380013E8081800E08B0010300A01 :10C0F800ECCBFFD80E9CF01F0021ED380013ED5556 :10C10800001E2FF8ED680013C2F80E9CF01F001CEB :10C11800C2B8E0081800C0510E9CF01F001AC248AF :10C128003049F2081800C0F1ED380013E208180091 :10C13800E08B00060E9CF01F0014C1680E9CF01FD7 :10C148000013C0F83039F2081800C0E1ED380013C8 :10C15800E8081800E08B00060E9CF01F000DC04890 :10C168000E9CF01F000C6E075807C8A1D8320000BB :10C17800000080CC8000B6B48001384C8000BAA89A :10C188008000B2E08000B7DC8000B1D88000B4AC99 :10C198008000B598D4013019F20C1800E08B001D0E :10C1A800580B5F1A48D9720958095F19F5E900094F :10C1B800C13017B9178E179A17A8B16AF5EE118A08 :10C1C800F5E81088F3E81008C0704858304AF00CB9 :10C1D800002CF01F0004D80200001D5800001D505C :10C1E8008002E736D42130181897F00B1800E08B3E :10C1F80000074868304AF00B002BC038304A484BDB :10C20800F01F00040E9CD82200001D508003B409C2 :10C218008002E736D4313013189516911492E60C43 :10C228001800E088000F4BB8201D1AD8E0680246B5 :10C238001AD84B984B9C1AD8F01F00392FCDC0083C :10C248004B89F20C0028F20C072B11BA119911A88E :10C25800B169F3EB1189F3E81088F5E81008C0E13B :10C268004AC8201D1AD8E06802471AD84AE84ABCCA :10C278001AD8F01F002B2FCDC008300AE06B011030 :10C28800149CF01F002A1897C041E06600FFC758A9 :10C2980078045804C0E049F8201D1AD8E068024D17 :10C2A8001AD84A3849DC1AD8F01F001D2FCDC0080B :10C2B800781630CA089B0C9CF01F001EECC9FFF4CE :10C2C800AC92ACD3E5D2C110ACA3ACC42011AC8203 :10C2D80032EC2FF1F2C8FFFF300AC05810CBF5D26C :10C2E800C0082FF1038BF4C2FFFFE80B18005F139F :10C2F800F80B18005F16E7E60006E8061800CEF10E :10C30800B28A0389E8091800C1601099CE3B000081 :10C318008003A1E48003A22880039D9C800094C42C :10C3280000001D508003A2408000D3188003A2643F :10C338008002E8BCF0CBFFFB10C9B089B0A9301966 :10C34800B099B0B96E180E9C101B5C7BF01F000CE6 :10C3580048C848D6F0050025335A6C0C0A9BF01FD4 :10C36800000B6C0C0A9A33590E9BF01F0009EDDC88 :10C37800C0080E9CF01F00070C9CD8328000D21019 :10C3880000001D5000001D5880011320800114F08A :10C398008000D13CD421189A303CF80A1800E08873 :10C3A800000F4BE8201D1AD8E068028A1AD84BC83B :10C3B8004BCC1AD8F01F003C2FCDC0084BB8E06713 :10C3C8000118F4070247F007000730180F8B169979 :10C3D800F00B1800C0A0C603302BF6091800C0F0F7 :10C3E800F8091800C4C1C4383008AEABAEB8AE986E :10C3F800EECBFFF43028300CAE88C3680FA92019A3 :10C408005C59AEA9C4910FBB2FFB5C5BAEBB0F9C04 :10C41800304EFC0B1800C251F20C1800C1214A4AD8 :10C4280015FB15CE15DC15EAB16CF9EE118CF9EA9D :10C43800108AF7EA100AC050AEB9AEA8AE98D82252 :10C44800EEF801105808C070EEFA0114300BEECC6B :10C45800FFF45D183008AE883008EF480110D82284 :10C46800AEABEECBFFF4F01F0013D8226E282018D5 :10C478008F28C121EF480110AE88D8224878201DA6 :10C488001AD8E06802C61AD848B8486C1AD8F01FFB :10C4980000062FCDC008D8228003A1E48003A28023 :10C4A80080039D9C800094C4000018F000001D507B :10C4B8008000C21C8003A29CD431580B5F081292E2 :10C4C80016974BB914967209189558095F04F1E448 :10C4D8001004E08100B6580CE08000B31989E8091F :10C4E8001800E08000AEF01F0033E04C00FFE08B46 :10C4F80000A84B1B0A9CF01F0031C08137F8AEA47E :10C50800AE88AE9C3018AEB8D8320A9CF01F002C0A :10C51800F8081618AE88F1DCC208AEBCAE98F1DC9B :10C52800C108AEA85BFCE081008F4A63300430305C :10C5380006910788E0081800C171E80400280A9CE1 :10C54800F00B1503101B2FFBE20B003B2FCBF01F4A :10C55800001BC0A1E0680118B13449A8F004000428 :10C56800E8F8010CC0782FF4E6C3FEE85844CE2161 :10C578003FF8F0091618AE89F3D8C208AEB8AE99DC :10C58800F3D8C108AEA95BF8C5E1300748E848DB35 :10C59800118A0E9C0E9930313043F2C0FFFF178488 :10C5A80016985804C1211297C358000000001D585E :10C5B8008002EDD08003A2BC8002ECC880011E106E :10C5C800000018F0000018ECE2041800C0C117C8F9 :10C5D800F4080104F40801081838E08A0005F9D4C1 :10C5E800C0081297F3D0C008F6CBFEE8E609180099 :10C5F800CD513039F2071800E08B0027494BE0682D :10C608000118EE080248F6080008118BF20B180012 :10C61800C1B1F4C9FFFFB0CAF1460110301AF142A6 :10C628000114B08AF0CCFFF448A80A9BB089F01F27 :10C63800000A0E9CF01F0009E06C00F2D832E06C92 :10C6480000F7D832D83AE06C00FFD832000018F072 :10C65800000018EC8002ED708000C39CD40148985B :10C6680070085808C0D0300CF01F0007301CF01FAD :10C678000006302CF01F0004303CF01F0003D802E5 :10C6880000001D588000C39CD421494C4946F01F26 :10C6980000156C0518975805C1E1F01F00138D0CA3 :10C6A800C1A0492B0A9AF01F00120A9A491B6C0C68 :10C6B800F01F00116C085808C0E05807C0C0EE0908 :10C6C800161848E8B0B7B089F3D7C208EFD7C10841 :10C6D800B099B0A7D82200008003A2C800001D5856 :10C6E80080011E10800112008003B40980011260CD :10C6F8008000C704800111F800001D50D431E068A3 :10C7080002001496944AF00A1900E08B00E331986D :10C71800F00A1900E08800DE4DF75C7A30090E9BBC :10C728000C9CF01F005E8C48F8081900E08100D2CC :10C738000F993038F0091800E08B00CCE06501183B :10C74800AB394D75120530290B8AF20A1800E081C1 :10C7580000C1AA880FBAF5DAC004AADA0FD80FCB3D :10C76800F1EB108B0FF80FEC5C8BF1EC108C3009AF :10C778005C8C0FA8F2081800E084009DF20A1800EB :10C788005F18301AF40B18005F1AF5E81008F20861 :10C798001800E0810090EAC4FFF42F4708980F8939 :10C7A800129AE21A00C0E04A00C0C1502FF7C098A0 :10C7B800F3DBC0082FF7118BF40B1800C7B12FF863 :10C7C800F2CB00010F8A5809CF41F20A1800C03095 :10C7D8002FF8CE6B4B0B30082F4B1739129AE21AF1 :10C7E80000C0E04A00C0C060120B1789F0091800A9 :10C7F800CF51F1DCC0082FBB300E301A3047C58846 :10C808001739129CE21C00C0E04C00C0C060120B3B :10C818001789FC091800CF512FFB17CC17D9B1691C :10C82800F3EC118917ECF7330008F3EC108917A221 :10C8380017FC1781F9E91009F73C0009F9E3108C96 :10C8480017B35C8CE7E2108317925C83E5E11082F2 :10C85800F4021900C281F4031900C251EE0C190048 :10C86800C2218B29E8593A80E0880005E8783A80A7 :10C878008B28EAC7FEF42F6B304A0E9CF01F000984 :10C88800EAF801105808C250EAFA01140E9B089CF5 :10C898005D18C1F800001D5C8000CEC4000018F0CF :10C8A8008002E7365C7C20182F6C5C58180B5808FF :10C8B800CA81EAF801105808C070EAFA0114300B6E :10C8C800EACCFFF45D183008AA883008EB4801105C :10C8D8000C9CF01F0002D8328000D13CD401F01F1C :10C8E8000003F01F0003D8028000C8F88000C6903B :10C8F800D42149A949ABF2CCFEC4F2C8FF54300A8E :10C90800F2C9FF50910A930AB22A172EF14EFFFC82 :10C918002F092F081838CF71492949382FD9149C65 :10C92800E019FFFCF0C6FFDC48D7490E910CEE0A6F :10C938000405189BC098700493042FFB9109FC0A06 :10C9480005045C8B0809EA0B1900CF632FC82FEA8E :10C958000C38CED1D8220000000080D48003A2D8A1 :10C9680000001F5C000072E88003A394D401580BF8 :10C97800C200F1DBC002C0E048F8201D1AD8E06808 :10C98800016B1AD848D848EC1AD8F01F000E2FCDE2 :10C99800C00848D8F00C03299709F00C092B48B8AF :10C9A800A56CF00C000CF8CCFF54780820189908F6 :10C9B800D80200008003A2EC8003A33080039D9C72 :10C9C800800094C4000072E8000080D4D421189834 :10C9D800588CE088000F49F8201D1AD8E068013DFE :10C9E8001AD849D849DC1AD8F01F001D2FCDC00825 :10C9F80049CE49D9FC0C032CF0CAFFF5580CC230BB :10CA0800A56AF00B15047807F20B000BFC08092740 :10CA1800F6CBFF5414097608720A2FF8103AF3F887 :10CA28003A009708F1DCC002C13048A8201D1AD886 :10CA3800E068014F1AD848D8488C1AD8F01F000867 :10CA48002FCDC008A56A140992282FF8B228D82239 :10CA58008003A2EC8003A35080039D9C800094C4B3 :10CA6800000072E8000080D48003A370580BC0C097 :10CA780017B8178A179917ABB169F3EA1189F3EB5D :10CA8800108BF1EB100B993B5EFC580BC0C017B82C :10CA9800178A179917ABB169F3EA1189F3EB108B71 :10CAA800F1EB100B992B5EFC4828910C5EFC000002 :10CAB800000080D0D4211897F9380035EDB800006F :10CAC800C0D1A1C8F968003578885808C0205D1819 :10CAD8006E785808C0300E9C5D18D822F93C003595 :10CAE800F9DCC0015EFC580CF9FB1A075EFCD703A1 :10CAF800D421300A18971696302C96CBF01F001ABE :10CB08001895C041E06600FFC2B80C9BF01F0017E3 :10CB1800EDDCC008C0500A9CF01F0015C2180A9826 :10CB280070095809C0301298CFCB6EF95809C15016 :10CB38006F095809C0E148F8201D1AD8E068025367 :10CB48001AD848D848DC1AD8F01F000D2FCDC008D5 :10CB58009305EF480040C048EF4800408FF50C9C13 :10CB6800D82200008000D3188000CF988000D13CE4 :10CB78008003A3A88003A44480039D9C800094C4E0 :10CB8800D4211897F9380035EDB80000C170A1A874 :10CB9800F968003578885808C0205D186E785808FC :10CBA800C0300E9C5D18EF380035EDB80005C06147 :10CBB8000E9CEECBFFFCF01F0002D8228001370C40 :10CBC800D42117881799B169F3E8118917A8F3E8F0 :10CBD800108917B81697F1E91009189678181039BE :10CBE800C27049A8700CC0A8780978356C1810393B :10CBF800C041301BF01F00160A9C580CCF614958E1 :10CC08007008C14870095809C1006C1A1439C0D19C :10CC18000F8A0F99B169F3EA11890FAAF3EA10890B :10CC28000FBAF5E91009910970385808CEC10F8A72 :10CC38000FB90F98B168F1EA11880FAAF1EA1088C4 :10CC4800F3E810088D18D8220000820C8000E12437 :10CC580000008214D421149712961895F01F001022 :10CC68005807C0C00FB80F8A0F990FA7B169F3EA28 :10CC78001189F3E71087F1E710078B275806C0C022 :10CC88000DB80D8A0D990DA6B169F3EA1189F3E67D :10CC98001086F1E610068B36D82200008000CBC83B :10CCA800D4213006999899169926993699A6997695 :10CCB800998699F6F94600404908FAC4FFEC681EBF :10CCC8006804F96600351185F96500382FF5B085D7 :10CCD8001897994EF01F000A0E9C5D145C5C4898EA :10CCE800580CEC071710F1F90000EFF90A00F1F7FA :10CCF8000A000E9CD82200000000730C8000CC5C57 :10CD0800000080CC1898300CC0482FFC70085C5C80 :10CD18005808CFC15EFC580CF9F81207F9B901019F :10CD2800F1D9E108F9F81C075EFCD703D401580CC7 :10CD38005F08580B5F09F3E81008C1304978201DD7 :10CD48001AD8E068028F1AD84958496C1AD8F01FC7 :10CD580000162FCDC008964AF4080008B848129C5F :10CD6800984878095809CF819859F0091900C0E006 :10CD780048A8201D1AD8E06802971AD848B8489CD5 :10CD88001AD8F01F00092FCDC0089649990BF20850 :10CD98000008B848D80200008003A4708003A4B437 :10CDA80080039D9C800094C48003A4ECD421169732 :10CDB800F01F00065807EFF81207F9B90101F1D979 :10CDC800E108EFF81C07D8228000CD34D421580C94 :10CDD800C0E14B58201D1AD8E06801B01AD84B386A :10CDE8004B3C1AD8F01F00332FCDC008580BC03168 :10CDF800169CD8223008F00B1900C154F60911000E :10CE080098585C89F2081900C0F24A78201D1AD88F :10CE1800E06801B71AD84A884A5C1AD8F01F00257A :10CE28002FCDC0081699F93E000C300A3037F40EA1 :10CE380019005F08EE0E19005F061497104678185F :10CE4800F4061800C0A0F00B01099919F8CAFFF000 :10CE58001439C2029918DA2A201E3017EE0E19006A :10CE6800E08B000CF40B1900C1D4985AF20A19008F :10CE7800C19316189918C0E848B8201D1AD8E06858 :10CE880001E61AD848D848AC1AD8F01F000A2FCDA6 :10CE9800C00898581608B8589848F00B000BB84BBB :10CEA800D82ADA2A8003A47080039EA480039D9C5C :10CEB800800094C48003A51C8003A53CD43116913E :10CEC8001497580CC0E14AD8201D1AD8E068033ED0 :10CED8001AD84AB84ABC1AD8F01F002B2FCDC00860 :10CEE800580BC070300518960A920A930A90C388A6 :10CEF8004A28201D1AD8E068033F1AD84A384A1C25 :10CF08001AD8F01F00212FCDC0085809C0A08C588E :10CF1800F208010AF0091900C043F3DAB010C1F8A9 :10CF2800F1D9C0108C54E8090109EE091900EE097D :10CF380017B06C1BE9D9B010F9D5C010100BE20C72 :10CF4800000C089A5C7AF01F0012E8030003081727 :10CF5800E80500055C835C855C8730096C0658062B :10CF68005F1AE40719005F18F5E80008E0081800E0 :10CF7800CCD1069CD83200008003A4708003A5B0F1 :10CF880080039D9C800094C48003A5D08002E7366E :10CF9800D431580C5F08580B5F0918961697F3E8B8 :10CFA8001008C06198499648F0091900C0E24C7809 :10CFB800201D1AD8E06802FE1AD84C584C5C1AD8C2 :10CFC800F01F00452FCDC00830050A945806C0E16F :10CFD8004BE8201D1AD8E06803031AD84BF84BDC3D :10CFE8001AD8F01F003D2FCDC0088C5808995C79DD :10CFF8008E53F5D8C010F7D3C010121AF3D5C0104D :10D00800F6090109123AE7D5E413E8091750F1D9EE :10D01800E51308985C786C1C100CF1D5C0105C8383 :10D028006E1BF5D3C010100BF01F002DE604000492 :10D038008C585C84F0041900E088000F4A38201DE1 :10D048001AD8E068030F1AD84A684A2C1AD8F01F71 :10D0580000222FCDC008F0041900EDF60000F9B445 :10D068000000E60500058E585C85F0051900E0888B :10D07800000F4968201D1AD8E06803151AD849A876 :10D08800494C1AD8F01F00142FCDC008F00519001C :10D09800EFF72000F9B502005807C2908E598E4864 :10D0A800F0091900C2416E085808C2104878201DBE :10D0B8001AD8E068031F1AD848C8486C1AD8F01F55 :10D0C80000062FCDC00800008003A4708003A5F4DB :10D0D80080039D9C800094C48003A6248002E736C8 :10D0E8008003A6348003A64C8003A6685806C16056 :10D0F8008C598C48F0091900C1116C085808C0E017 :10D108004898201D1AD8E06803241AD84878488C13 :10D118001AD8F01F00082FCDC0085807FE91FF58F5 :10D128000E9CD8328003A4708003A66880039D9C5F :10D13800800094C4D421189B580CC0E14AB8201D23 :10D148001AD8E068021C1AD84A984AAC1AD8F01FB4 :10D15800002A2FCDC008F939000C3038F009180022 :10D16800E088000F4A18201D1AD8E06802281AD84B :10D178004A284A0C1AD8F01F00202FCDC0083007C3 :10D18800303530169679F2C800015C885809C0E13C :10D198004968201D1AD8E06802351AD84988495CC0 :10D1A8001AD8F01F00152FCDC008B6785808C1B19D :10D1B800F738000C169CF0C900017604EA0819003B :10D1C800C031308CC068EC091900E08B0006307C57 :10D1D800F01F000CC038F01F000C2FF7089B5C579D :10D1E8005804CD110E9CD8228003A47080039EA4FD :10D1F80080039D9C800094C48003A6948003A6AC01 :10D208008000C9748002E28CD421580CC0E14B988C :10D21800201D1AD8E068015F1AD84B784B7C1AD8C1 :10D22800F01F00372FCDC0083019F938000CF2086C :10D2380018005F1A3039F20818005F19F5E900097B :10D24800C1405808C1203029F2081800C0E04A98A7 :10D25800201D1AD8E06801631AD84AA84A7C1AD84F :10D26800F01F00272FCDC0089848F00B1900C3F213 :10D27800F3D8C0101897F1DBB0105C7B121BC27892 :10D28800E04BFFFEE08A000F49A8201D1AD8E0688D :10D2980001771AD849C8499C1AD8F01F00192FCD10 :10D2A800C0088E481608AE486E075807C0E14918EE :10D2B800201D1AD8E068017B1AD8494848FC1AD8BA :10D2C800F01F000F2FCDC008F1DAB0108E59F00909 :10D2D800010AF2081900FE9BFFD5AE48AE586E0C45 :10D2E800580CC030F01F000A30088F08D822000000 :10D2F8008003A4708003A70080039D9C800094C4D1 :10D308008003A7188003A7348003A7488000D13C76 :10D31800D431202D16971495581CC0B0C083582CB2 :10D32800C040583CC0B1C1783004C0583144C0280E :10D3380030042EC42E445C84C0F84C08201D1AD832 :10D34800E06800D11AD84BE84BEC1AD8F01F003E21 :10D358002FCDC00830045825E08B00065815E08210 :10D3680000DDCBF85835E08100E6308CF01F00373F :10D378001896E08000F25C740E99E8C8FFFD5C79AD :10D38800E018FFFCB847E06A02443000F4080108DE :10D39800F8040004F0090D472ED4E014FFFCAC5744 :10D3A8009914F965000C99005C77F8C3FDAC0E047C :10D3B8000833C0E24A18201D1AD8E06800EB1AD8D2 :10D3C8004A384A0C1AD8F01F00202FCDC008580838 :10D3D800E089000F4998201D1AD8E06800ED1AD896 :10D3E80049C8498C1AD8F01F00182FCDC008F20779 :10D3F800010700980A9918943015E0610243B8753E :10D40800E0620244C6A850195008308CF01F000F83 :10D418000E9B189A5C8BF4CEFFF0F6011900F60CFF :10D428001720E40C173040194008580AC1610C9CB9 :10D438001496F01F0009C9088003A4708003A76030 :10D4480080039D9C800094C48000C9D48003A77C7D :10D458008003A7B08000D13C9508890AF569000CC3 :10D46800F560000DE047FFFFC0E14BD8201D1AD83A :10D47800E06801071AD84BB84BBC1AD8F01F003B1C :10D488002FCDC008951EB45CB44BFDDEC002C0E0D1 :10D498004B38201D1AD8E068010D1AD84B484B2C80 :10D4A8001AD8F01F00322FCDC0085C7C8CDB18170F :10D4B80014946C1CF80B000B1633C0E24A88201D2C :10D4C8001AD8E06801101AD84AA84A7C1AD8F01F5E :10D4D80000272FCDC008B4755807FE99FF96C3786A :10D4E8000E985C782FD8E018FFFC5C74E8CCFFED50 :10D4F800E01CFFFC100CF01F00201896C2D030086A :10D50800F8040004AC572ED4B847E014FFFCF968BF :10D51800000C99149908C1B8307CF01F00181896AF :10D52800C1B03008AC57F965000CB847990899188C :10D53800C0E848B8201D1AD8E068013D1AD8490843 :10D54800489C1AD8F01F00092FCDC0083018AC78B5 :10D558003008ED68000D0C9C2FEDD8328003A470C4 :10D568008003A7E480039D9C800094C48003A7F8EF :10D578008003A77C8002E2A48000C9D48003A82885 :10D58800D43149B8781918951094300CF2C2FFF4C8 :10D59800F3310009700718961893C1E8EF380010A6 :10D5A8000238C1716E585808C1400A9A0E9B6E6CB9 :10D5B80004995D18C0E05806C0410C95301CC0A8FD :10D5C8006E388D3868088F388907301C3005C028B8 :10D5D800300C0E966E37E60C18005F0858075F1976 :10D5E800F3E80008E6081800CDA1D832000073104F :10D5F800E06C00FB5EFCD421E067040078A8F90B1E :10D60800002C78C9F5DBC010F90E003C100AEE0EAC :10D618001900E0880005E06E0400C0285C7EF4096B :10D628000107EE0E010EC076F95B002E78CCF40CE3 :10D63800010CD822F009010A580AE08A00063008CD :10D64800F958002ED82AF2080108F958002ED82ACD :10D65800996B5EFCF94B008C5EFCF94B00885EFC14 :10D66800F94B00985EFC998B5EFCF96A0039F94B1E :10D6780000945EFC5EFC5EFC48A87008C028703808 :10D688005808CFE148887008C02870385808CFE19A :10D6980048687008C02870385808CFE15EFC000060 :10D6A8000000820C0000821400008220D4014A6825 :10D6B8007008C30870495809C0E14A48201D1AD8A3 :10D6C800E06805AC1AD84A284A2C1AD8F01F00225C :10D6D8002FCDC0085819C0E149C8201D1AD8E068E4 :10D6E80005AD1AD849D849BC1AD8F01F001B2FCD50 :10D6F800C00858A9C0E14958201D1AD8E06805AEED :10D708001AD84978493C1AD8F01F00132FCDC00801 :10D7180070385808CD0149387008C128704958A98F :10D72800C0E048A8201D1AD8E06805B11AD848E812 :10D73800488C1AD8F01F00082FCDC0087038580838 :10D74800CEE1DA0A0000820C8003A8688003A8AC46 :10D7580080039D9C800094C48003A8D88003A904FA :10D76800000082208003A934D43118961497784891 :10D778005808C0E04C48201D1AD8E068011A1AD889 :10D788004C284C3C1AD8F01F00432FCDC008580A2B :10D79800C3514C19720C4C19720A4C19109E9207FD :10D7A8004C08E069100070052FF70A985C87EE0EA8 :10D7B8001900F2071790C088F104001C0E93EE04BC :10D7C8001900CF3070385808CF811898C088F104F4 :10D7D800001C0E93EE041900CE8070385808CF81D3 :10D7E8001498C088F104001C0E93EE041900CDD0E3 :10D7F80070385808CF814AA8B0074A887008C1F81D :10D80800F109001C0E93EE091900C181700A580A2B :10D81800E0800099580BE0800096178C1799B16941 :10D82800F3EC118917ACF3EC108917BCF9E910096E :10D83800E0800089123AE080008670385808CE11DE :10D8480049887008C1A8F109001CEE091900C141F6 :10D85800700A580AC770580BC750178C1799B169C6 :10D86800F3EC118917ACF3EC108917BCF9E910092E :10D87800C690123AC67070385808CE6148A870052C :10D888000A98C2D88003A8688003A96080039D9C79 :10D89800800094C40000822000008214000001F877 :10D8A8000000820C0000821CF109001C0E93EE0996 :10D8B8001900C141700A580AC450580BC430178C5B :10D8C8001799B169F3EC118917ACF3EC108917BCFF :10D8D800F9E91009C370123AC35070385808CE518C :10D8E80049A87008C158F109001CEE091900C0F1D7 :10D8F800178A1799B169F3EA118917AAF3EA108907 :10D9080017BAF5E91009700A123AC1C070385808F8 :10D91800CEB1580BC11017891798B168F1E9118871 :10D9280017A9F1E9108817B9F3E81008C050304A70 :10D938000C9CF01F00078D354868ED57001C9106B8 :10D94800D83AE06C00F5D832000082208002E73631 :10D958000000821CD4211897169CF01F0008C0B044 :10D96800F908002C5808C0702288EE081900F00742 :10D9780017305C870E9CD82280012228D421F90810 :10D98800002C1897F3D8C010E06CFFFFF5DBC0102F :10D99800F8090109123AE08A000F4948201D1AD8EF :10D9A800E06801BD1AD84928492C1AD8F01F00127E :10D9B8002FCDC008100BE0680800EF5B002CF00BBF :10D9C8001900EFF8BC160E9CF01F000CE04C01FF8C :10D9D800E08A000AEF380026A1B80E9CEF680026FE :10D9E800F01F0007D82200008003A8688003A988D8 :10D9F80080039D9C800094C48000D5FE80010CECBF :10DA0800D4211896304CF01F000A1897C0E0ECE8B3 :10DA18000000F8E90000ECE80008F8E900086C48A4 :10DA28009948781CF01F00030E9CD8228000C9D4A6 :10DA38008000CD1ED4211896580CC0311897C0B854 :10DA4800781C580CC030F01F000518970C9B304C00 :10DA5800F01F00030E9CD8228000D13C8000C974BE :10DA6800D42130071896C0880C9C6C06F01F00055E :10DA7800F80700075C575806CF810E9CD822000093 :10DA88008000DA3CD4217848189758A85F1A5808BB :10DA98005F19F5E90009C2005818C1E0F8FC0084D4 :10DAA800580CC060F01F000D3008EF4800843FF8A4 :10DAB800EEFC0080EF58003AF01F000930066FECCA :10DAC800EF460080F01F00066FFCF01F0005EF46D0 :10DAD800007CEF460078D8228000D13C8000DA68CC :10DAE800D421169778081638C04176389908C11895 :10DAF8004B899308C0A870390E39C0614B599308F7 :10DB08006E399139C06812985808CF614B1993083B :10DB180030060E9C8F36F01F00306E4858A85F19EB :10DB280058185F181268EC081800C0C0EF380026B3 :10DB3800EDB80000C071A1B80E9CEF680026F01F78 :10DB480000276E485818C3206FE85808C0E04A48B4 :10DB5800201D1AD8E06804F91AD84A284A2C1AD87D :10DB6800F01F00222FCDC0086FF85808C0E049C840 :10DB7800201D1AD8E06804FA1AD849D849AC1AD82E :10DB8800F01F001A2FCDC008EEF800805808C0E03A :10DB98004938201D1AD8E06804FC1AD84958492C7D :10DBA8001AD8F01F00122FCDC00830088F48F01F78 :10DBB8000012C0E148A8201D1AD8E06805021AD84A :10DBC80048E8489C1AD8F01F00092FCDC008D82271 :10DBD800000082188000DA8C80010CEC8003A868B1 :10DBE8008003A9AC80039D9C800094C48003A9C4D1 :10DBF8008003A9E08000D6B48003A9F8D42118973F :10DC080078485808C0E04A68201D1AD8E0680175AD :10DC18001AD84A484A4C1AD8F01F00242FCDC008F9 :10DC2800303CF01F00231896C380EF08001CF958F9 :10DC3800001C6E6899688E48A1B8B8483018994891 :10DC4800EF38000BF968000BEF38000AF968000A92 :10DC58006E089908497972080E38C0316E38C108C3 :10DC680049599308C0A870390E39C06149299308E9 :10DC78006E399139C06812985808CF6148E99308FD :10DC880030080E9B8F38302CF01F000C48C948D83C :10DC98008D8970098D3991060C9CD8228003A8685B :10DCA8008003AA1880039D9C800094C48000C9D476 :10DCB8000000821C000082188000C9748000D5F81A :10DCC80000008214D431204D4B583005700910964D :10DCD8002FF90A9491090A934B2830627007E08F54 :10DCE800019E6E485808C0E14AF8201D1AD8E0681D :10DCF80002571AD84AD84AEC1AD8F01F002E2FCD4E :10DD0800C0085818C0E14A88201D1AD8E06802588F :10DD18001AD84A984A6C1AD8F01F00262FCDC00886 :10DD280058A8C0E14A08201D1AD8E06802591AD834 :10DD38004A2849FC1AD8F01F001F2FCDC0085828C0 :10DD4800C071EF38004EE4081800E0800081EF3819 :10DD5800004E30CAF4081800C7A0EF3800AC10997C :10DD6800E8081800C300EEF900A82FF9EF4900A849 :10DD7800493A100AF53AFFFF1439C6B33009EF499A :10DD880000A8E4081800F9B90801F1D9E808EFF883 :10DD98008EAC0E9CF01F000BC5C80000000082105E :10DDA8000000820C8003A8688003AA3C80039D9C25 :10DDB800800094C48003AA688003AA948003AC38C6 :10DDC80080010A20EF08003AE6081900F9B90401B1 :10DDD800F1D9E408EFF84C1D6FF85808C3A0EF0913 :10DDE800003AEF08004CF0091900C3356E4858286E :10DDF800C100EF09004AEF0800484CD1A3581208A7 :10DE0800EF39004EE2090709F0090948EF58004CBC :10DE1800EF080060EF090056F0091900F00917B083 :10DE2800EF08003CF3D9C02FEF590058F00A15014C :10DE3800F0091900EFFA3C2CEF08003CEF53003AC8 :10DE4800EF5800560E9CF01F003BC0383018C02811 :10DE580030086E495869C0B16C0B6EDAF60A010ACF :10DE6800E04A0028E08800042FF85C588ECAEDBA12 :10DE78000003C39158495F0A58795F091449E809B2 :10DE88001800C3106C0AEEFC00A0EEF100A4F80123 :10DE980002416ED9EEFB009CF4090109E20B000E69 :10DEA800E06A01F4FC0A0D00FAE100080039E08894 :10DEB80000062FF830115C58C178EF3100ADE20C44 :10DEC800034BF60A0D0A1439E088000E50180E9C10 :10DED800F01F0019EF3900AD30012FF9EF6900ADDF :10DEE8004018C0283001EEFC0080580CC1106ED9D3 :10DEF8006C0A121AEF09004CF2091006123AC08394 :10DF08005018F01F000E30004018EF4000806E4996 :10DF18005839C1516C0A6ED9F4090109E049002841 :10DF2800E08800182FF85C58C14800008003A85802 :10DF3800800110608001109C8000DA685899C091B7 :10DF48006C0A6ED9F4090109E04900F0E08B00047D :10DF58005808C4900E9CF01F00434C385805C14027 :10DF680070081037C0E14C18201D1AD8E06802E488 :10DF78001AD84BF84BFC1AD8F01F003F2FCDC00819 :10DF88006E388B38C13870090E39C0E04B78201DC7 :10DF98001AD8E06802E81AD84B884B6C1AD8F01FD8 :10DFA80000362FCDC0086E399109EEF80098580850 :10DFB800C0403FBB6E6C5D185801C0F0EF180024DC :10DFC800201DEEC9FFFC1AD80E9AEF18001C6EAB84 :10DFD8006F7CF01F002B2FED0E9B302C6E37F01F3F :10DFE8000029C1C8EF3900382FF9EF690038EF3A36 :10DFF8000039F20A1800E08B0010EF680038EEF8DC :10E0080000945808C0600E9B6E6C5D185C5CC04143 :10E018000E9CF01F001D0E956E375807FE91FE638B :10E0280049A849B410957006C6086C4858A8C0E0BD :10E0380048E8201D1AD8E068030C1AD8495848DC6B :10E048001AD8F01F000D2FCDC00868096CD8F20847 :10E058000108E04800F0E08B004C0C976C36C4587F :10E068008000DA8C0000820C8003A8688003AAC4B0 :10E0780080039D9C800094C48003AAF08001023430 :10E088008000C97480010CEC00008220000082101E :10E098008003AB1C6A081036C0E149A8201D1AD8B5 :10E0A800E068031B1AD84988498C1AD8F01F001851 :10E0B8002FCDC0086C388F38C1386A080C38C0E0DA :10E0C8004908201D1AD8E068031F1AD8491848FCC7 :10E0D8001AD8F01F000F2FCDC0086C388B080C9B86 :10E0E800302C6C36F01F000C5806CA01C0780C9C06 :10E0F800F01F000A5807CCF1CE1B2FCDD8320000F4 :10E108008003A8688003AB4C80039D9C800094C466 :10E118008003AB748000C9748000DA8CD431202D60 :10E1280018951691784858A8C0A1189B4A2CF01F3A :10E1380000230A9B302CF01F0022C3B8780850082F :10E148007818F903001C5018F9020024797778A68A :10E15800F8F400987860189B49ACF01F00186BFC25 :10E16800580CC030F01F00186BEC580CC030F01F72 :10E178000016EAFC0080580CC030F01F00130A9B00 :10E18800302CF01F000F5804C040009C3FBB5D14AA :10E198005801C0F0201D5C72F1D3C0101AD20C9B3C :10E1A800FAC9FFF4FACAFFF80E9CF01F00082FED19 :10E1B8002FEDD832000082208000DAE88000C97490 :10E1C8000000820C8000DA6880010234D42118969D :10E1D800302CF01F00511897C5114D084D0A189999 :10E1E8007008740BC0A870DAF60A010A123AF4092A :10E1F8001720F00C172070385808CF61580CC04011 :10E20800301BF01F0048302CF01F00431897C30143 :10E218004C584C3A18997008740E37FBC178F13A8B :10E228000014EC0A1800E08B000DF60A1800E08BC9 :10E23800000970D7FC0701071237C033109CC0389B :10E24800169A12977038149B0E995808CE91580C4C :10E25800C040301BF01F0033302CF01F002F1897E0 :10E26800C5704B28F10900D42019F15900D44AF897 :10E27800F10900D42019F15900D4E06A00B0300B3C :10E288000E9CF01F002B3408EF6800143FF8EF686D :10E29800000B4A384A7A70097408F2080008950891 :10E2A800EF48006CEF480068EF48005CEF4800500A :10E2B8003008EF6800ADEF680038E0680800EF58F4 :10E2C800002EEF58002C3068EF58004AEF58004CE9 :10E2D800E0681000EF580072E0680200EF58003C58 :10E2E8003FF8EF58003A3018EF5800564928EF48E1 :10E2F800008CE068DD00EA18006DEF48009CE078CB :10E3080024F88FD9EF4800A03098EF4800A40E9C5D :10E31800D82200008000C9D40000822000008210AA :10E328008000E1240000820C000080D48002E8BC58 :10E33800000001F48000E5ECD401340CF01F000269 :10E34800D80200008000E1D4D431189714961293B3 :10E35800169578445804C0E04C98201D1AD8E068F7 :10E36800020A1AD84C784C8C1AD8F01F00482FCDC6 :10E37800C008580BC041E06600F7CB78304A140C4F :10E38800F01F0043EF560024EF08001CE8081900AE :10E39800C34110944BF84C0970064C08720B700C72 :10E3A8004BF9E06A100092082FF80C995C88F00489 :10E3B8001900F4081790C078F30E001CF00E19002D :10E3C800CF4072395809CF911899C078F30E001CC4 :10E3D800F00E1900CEA072395809CF911699C0785D :10E3E800F30E001CF00E1900CE0072395809CF91B7 :10E3F8004AB9B208EF58001C4AA84AB9700A72080C :10E40800F40800089308EF48005CF0C90001E068D0 :10E418000800EF580060EF58002CEF58002E300825 :10E428008FC88FA8E0680200EF49006CEF490050E0 :10E43800EF58003C0A9BE06C0200F01F001C5C8C4B :10E44800F808100AEF5800583018EF430090EF58BA :10E458000056EF5C003C30288F48495972080E3846 :10E46800C0316E38C2C849399308C26870390E394C :10E47800C221490993086E399139C2288003A868D6 :10E488008003AB9C80039D9C800094C48002E73687 :10E498000000820C0000821400008220000001F8B5 :10E4A80000008210000001F48000D95C0000821C8A :10E4B8000000821812985808CDA148D9930848D866 :10E4C80070098F3991073019201D30081AD9109A10 :10E4D8003029109B0E9CF01F00082FEDEDDCC008C2 :10E4E800C0410E9CF01F00050C9CD8320000821819 :10E4F8000000820C8001035080010CECD421189795 :10E5080078465826C390E08B00075806C0C05816B6 :10E51800C071C2785846C370C3635876C3C030060A :10E528000C97C4184A8972081838C0317838C1085D :10E538004A699308C0A870390E39C0614A399308EE :10E548006E399139C06812985808CF6149F9930813 :10E5580030080E9B8F38302C1097F01F001DC0A874 :10E56800189B49CCF01F001C0E9B303CF01F001874 :10E5780030070E96C188189B498CF01F00170E9B18 :10E588000C9CCF5B301BF01F0016EDDCC008C0B13F :10E598003058C088301BF01F0012EDDCC008C031B5 :10E5A80030988F4858075F193008F00618005F0A3E :10E5B800F5E90009F0091800C0400E9CF01F000999 :10E5C8000C9CD8220000821C000082188000C974AC :10E5D800000082148000DAE80000820C80010A0042 :10E5E80080010CECD421169C1497580AC08094CB57 :10E5F800F01F00070E9CF01F0007D82A5809C030EA :10E60800149CD822F01F00045C5CD8228000D984B6 :10E618008000D13C8000E504D42149887007C2A855 :10E62800EEFB0084580BC140169AEEF8008C58088F :10E63800C06030090E9B6E6C5D18C078169A1099F0 :10E648000E9B109CF01F000E5C5CEFFC0A21EF385B :10E658000026EDB80000C0D1A1B80E9CEF680026D6 :10E66800F01F0008EF380026E018FFFCEF680026CE :10E678006E375807CD61D8220000820C8000E5EC87 :10E6880080010CECD401F01F0007487913882FF89B :10E698005C58B288EDB80000C031F01F0004D80201 :10E6A8008000E620000073148000DCCCD4314A6876 :10E6B80070063058ED3E000C2EC6A58EF00E1900DF :10E6C800E0880040205E3008A36E30175C8E302151 :10E6D8003042E7DEC010E06401FFE0650200C2E8F6 :10E6E800F5D8C010EC0A070BEE0B1800C080C293D7 :10E6F800EC0A0009E20B1800C1B1C0382FF8C1D8E4 :10E70800139BE40B1800C1D12FDA063AC1A413BA3F :10E718002FC813A95C88F5E910895C89F2CA000141 :10E72800E80A1900EA0917B0F959003CC0781399AA :10E738005809C070F20800085C88FC081900CD135D :10E74800D832000000007318D4217848189616971C :10E75800F138000DEDB80000C1C1169C3007F01F5C :10E768000020C368F138000DEDB80000C0E16C4826 :10E77800F13A000CF139000DF3EA1089A1A9F16909 :10E78800000DA989F169000C6E07F01F0016C0285A :10E7980049555807C1D06E4811C411DBB16BF7E475 :10E7A800118B11E48EEEF7E4108B6A0A8CE911F4F0 :10E7B8000E9CE9EB100B16191409F20E010ECD3759 :10E7C800C098141B6C1CAC6B5C7BF01F00088D0799 :10E7D800D8225809FE99FFF7CFBB00008000DA68FD :10E7E8008000DA3C0000731C8000D210D4314C58F1 :10E7F80018971188EDB80004E081020C79994C282B :10E80800F90C006070086FAAF208010BC186103974 :10E81800C0614BE87008F4080108C1164BB87008CD :10E82800103AC2914BA87008F139000FF138000E68 :10E83800F3E81088F8081900E088001E4B487009B2 :10E84800F338000FF339000EF1E910884AE972092C :10E858005C88EF490064EF5800604AC97209EF49C3 :10E8680000685808C080EF3900AC3008F00918007B :10E87800EFF81EAC4A586F497008F009010B580BA5 :10E88800E089004C3006EF5600704A2B960BEC0BD3 :10E898001900C3215C7CEF160060F80A000A6FAC0F :10E8A800EC0C000C143CC281EF0A003AF60A19007D :10E8B800C2351039C211EF3800542FF85C58EF6890 :10E8C80000543039F2081800E088000FEF090056AC :10E8D800EF08003C12085C88F2081900E088014A39 :10E8E800EF580056C469F2081800E08101430E9CF5 :10E8F800F01F0009C3E93008EF680054C3A90000FD :10E90800000073280000731C0000732400007318B3 :10E91800000073208001016A5CD91009E08600D1EB :10E928006F7912185808E08900CCEF380026EDB846 :10E938000002C081A3C8EF680026EF080058EF580E :10E948000056300A4D39EF6A004E720BEF6A0054D8 :10E9580072096F48EF490050F6080108EF09007284 :10E96800EF580070F2080008EF09004AEF580072EB :10E97800EF080048A358F2080008EF58004C6E480A :10E988005838E0880066EF080056EF090058F0098B :10E998001900E0880006EF09003C1009C0A8EF192B :10E9A800003CB339F7D8C010F20B0C0AF408000980 :10E9B8005C89F0091900E088004CEF590056C488BA :10E9C8006C08EF030074EF48007C6C1CF01F0032E9 :10E9D800F8031900C0E24B18201D1AD8E06803B3E9 :10E9E8001AD84AF84AFC1AD8F01F002F2FCDC008B1 :10E9F800EF0800705808C09020186C49F339000DD2 :10EA0800EDB90000EFF80C38EF0300746C1CF01F30 :10EA1800002218130C9CEF530074F01F0024EF0819 :10EA28000074EA081900C1606FF85808C1316FE82E :10EA38005808C1014998201D1AD8E06803BF1AD8A0 :10EA480049B8498C1AD8F01F00182FCDC0084914AE :10EA580030056FF65806C2D06C4811CBF139000D5D :10EA6800F3D9C0025F1A11D9B169F3EB118911EB1F :10EA7800F3EB108911F81248680912188CE9F409A7 :10EA8800000912085808FE9AFF9DE08F045F0000F5 :10EA9800000073248000CD0C8003AC608003ACA818 :10EAA80080039D9C800094C48000DA3C8003ACD035 :10EAB8003FF8EF58003A3008EF680038C5A830082A :10EAC800EF580070C5686C08EF030074EF480078D1 :10EAD8006C1CF01F0021F8031900C0E249F8201D42 :10EAE8001AD8E06803E01AD849D849EC1AD8F01FB8 :10EAF800001E2FCDC008EF0800705808C0902018DD :10EB08006C49F339000DEDB90000EFF80C38EF034C :10EB180000746C1CF01F001018130C9CEF53007449 :10EB2800F01F0012EF080074EA081900C2406FF8DD :10EB38005808C2116FE85808C1E14888201D1AD842 :10EB4800E06803EA1AD848A8486C1AD8F01F0006EB :10EB58002FCDC0088000CD0C8003AC608003ACA82A :10EB680080039D9C800094C48000DA3C8003ACD074 :10EB78004C5430056FE65806C2106C4811CCF13978 :10EB8800000D11DAF3D9C002B16AF5EC118A11EC63 :10EB980011F858095F1B6809F5EC108AF1EA100AA8 :10EBA8008CE8F20A010AF6080008F4080108C066B1 :10EBB8006F7810195809FE9AFF886F085808C29094 :10EBC8004B196F1A7209F4090109C2374AFB760B0F :10EBD800EF0A0048F6080108F40B140316185C88BD :10EBE800F00A000A5C8AEF09004AF40B14035C4837 :10EBF800EF5A0048F20A14021419F2080008F6083D :10EC08000009EF58004AEF59004C3008EF4800401F :10EC180049F84A09900A6EA8580AE0800381720BE5 :10EC2800F60911FF1009E08600B15C7AF0C9FFFF10 :10EC38001619F20A010A580AE08900A849697216E9 :10EC48005806C0E14958201D1AD8E06804461AD869 :10EC58004938494C1AD8F01F00142FCDC008F00BC2 :10EC6800010BE04B7FFEE08A002348C8201D1AD81C :10EC7800E06804471AD848D848AC1AD8F01F000AE8 :10EC88002FCDC008000073240000821000007320FC :10EC98000000731C000073348003AC608003ACF088 :10ECA80080039D9C800094C48003AD008CD81638E6 :10ECB800C3148C48F3D8C0101639C0E44AB8201DD4 :10ECC8001AD8E06804491AD84A984AAC1AD8F01FEA :10ECD800002A2FCDC0081618300A5C88C058AC48E6 :10ECE800AC5A121B6C068CD91639CFA55C3B0C9C10 :10ECF8005C8BF01F0022C21049C8201D1AD8E0689A :10ED080004561AD849E849BC1AD8F01F001B2FCD61 :10ED1800C0085C3B0C9C5C8BF01F0018C0E04938B5 :10ED2800201D1AD8E068045B1AD84958491C1AD81B :10ED3800F01F00112FCDC0086C1A4929932A492ABF :10ED48006EA8740B926C9508F80B000A101AB26A38 :10ED5800F00A16187249B2F8B2CAF5D8C208F1D842 :10ED6800C108B2DAB2E8C1B88003AC608003AD1064 :10ED780080039D9C800094C48000CDD48003AD2086 :10ED8800000073340000731C101BC097EF38002676 :10ED9800A1B80E9CEF680026F01F00424C256EA912 :10EDA8006A08F009010AE08602B7F0CAFFFFEF1B04 :10EDB800002C121A161A580AE08902AE1039E0819E :10EDC80001F54BA8906A7048F139000DF3D9C002DB :10EDD8005F19F40900094B6AB409EF0A002CF20A1A :10EDE8001900C462F13A000CF139000DF3EA1089F8 :10EDF8005C89EDB90000C081E219FFFEF169000DE0 :10EE0800A989F169000C4A98EF0A002CB06A704988 :10EE1800F339000DEDB90001C031201AB06A4A3645 :10EE28008CEB6C1CF01F00238C696C48F138000DCA :10EE3800F1D8C0025F18F208000849D9B20849A9F8 :10EE480072095C78EF1A002C12086EA9F4090009FF :10EE58001238C0E04988201D1AD8E068048B1AD8F7 :10EE68004968497C1AD8F01F00172FCDC008EEF664 :10EE780000805806E08000BE48C46848F138000D9C :10EE8800EDB80000C080C4B8109C7008EF4800803E :10EE9800F01F000DEEF800805808CF71CAA80000D6 :10EEA80080010CEC0000731C000073340000732018 :10EEB8008000D2108003AC608003AD3480039D9C39 :10EEC800800094C48000DA3CF138000DEDB80000F1 :10EED800C1F16848F139000DF13A000CF3EA108AE3 :10EEE8005C8A1499A1A95C79F20B1608EDBA0001A5 :10EEF800C0F0F169000DF16B000C68488869F138C1 :10EF0800000DF1D8C0025F18F2080008A6086C05C9 :10EF18000A96F01F00455805C041C6984C324C432C :10EF28006C4811C5868A11D9B169F3E5118911E5D3 :10EF38008CEBF3E510890C9C11F5EBE91009F40949 :10EF48000109640A1409F20B010BCBF7E08F0201E7 :10EF58004B89EEF80080704811FB11C511DC11E8EF :10EF6800B16CF9E5118CF9E81088F7E81008F00A97 :10EF7800010A5C8AB26A7248F138000DEDB80001E6 :10EF8800C031201AB26A4AB58AEB6A1CF01F002AFF :10EF98008A696A48F138000DF1D8C0025F18F20892 :10EFA80000084A39B2085C784A097209F009000A6F :10EFB800EEF80080704811FB11CC11D911E8B16945 :10EFC800F3EC1189F3E81089F7E91009123AC0E067 :10EFD80049A8201D1AD8E06804C31AD84988499C52 :10EFE8001AD8F01F00192FCDC0080C95EF450080E6 :10EFF80048F848E9908A7209F40900098FA990082D :10F00800EF09002CF0091900C22248C8201D1AD89F :10F01800E06804CD1AD848D848AC1AD8F01F000ABE :10F028002FCDC0088000DA3C0000731C000073205C :10F03800000073348000D2108003AC608003AD6C94 :10F0480080039D9C800094C48003ADA810190E9C79 :10F05800EF59002CF01F004A4CA8300A7019924B47 :10F06800F40B1900C0504C8A9509300991194C5875 :10F078007048F138000DEDB80000C5B14C3913885F :10F08800A5B8B288C56881098CEAF13B000DF7DBA9 :10F09800C0025F1BF60A000A14098FA9EF0A002CA8 :10F0A800F138000D8C69F1D8C002F7D9C0105808A2 :10F0B8005F1EF9DAC010FC0B000B163CC0E44B488D :10F0C800201D1AD8E06804F21AD84B284B2C1AD8FD :10F0D800F01F00322FCDC008F409010958085F1845 :10F0E800F20801080E9CEF58002CF01F00256C1B3D :10F0F8009648E2081900C090680C580CC040F01FF0 :10F108000028C028890B8D126C48F138000DEDB825 :10F118000000C0810B88A5B8AA886E485848EFF34C :10F128000A046C080C9CEF480080F01F001EC07891 :10F1380049D030014944300249453073EEF6008029 :10F148005806C1006C4811CB11D9B169F3EB11898C :10F1580011EB6EAAF3EB108911FBF7E910091439CA :10F16800C930EF380026EDB80000C041A1C80E9C98 :10F17800CE68A1A8EF680026D83200008000D5FE2E :10F18800000073340000732C000073298003AC6006 :10F198008003ADC880039D9C800094C48000CD345A :10F1A8008000DA3C0000731C0E9CF01F0040EEF655 :10F1B80000805806C0714BECF01F003EEF4C0080F9 :10F1C800D8326A093005F2CCFFFF6C4811CB11DA4E :10F1D800B16AF5EB118A11EBF5EB108A11FBF7EA2E :10F1E800100A1439C1214B2C8C689869F009190050 :10F1F800E08800B4F01F002FE08000B05805EBFC59 :10F208001A00EFFC0A20C0D85805C0D1F20A010B39 :10F21800C4574A7CF01F0027E08000A0EF4C008014 :10F228000C9BC3986A4B17F417C217D317EBB1633B :10F23800E7E21183E7EB108BE9EB100B5CDB120BB9 :10F24800C2D6F80A010B580BE0890029498CF01F37 :10F2580000191897E08000826A4811F911CA11DB79 :10F2680011E8B16BF7EA118BF7E8108B4928F3EB3B :10F27800100B70088AE9101916095809E08A000964 :10F28800F00B010B6A1CAA6B5C7BF01F000C8B0750 :10F298000C9B0E9CF01F000AD8326C0B0C95580B77 :10F2A800C1001696C93B000080010BF000007334C2 :10F2B8008000DA080000731C8000D2108000E7503C :10F2C80014195809E08A004AF138000DEDB8000019 :10F2D800C4404A3CF01F00238D0CC3F06C4811F960 :10F2E80011CA11DB11E8B16BF7EA118BF7E8108B43 :10F2F80049D8F3EB100B70088CE910191609580956 :10F30800E08A002CF00B010B6C1CAC6B5C7BF01FD3 :10F318000017D8320E9CF01F0016D832720BF60870 :10F328000109C0A62FFBEF19002CF60801081218D6 :10F338005808E08A00130E9CEF380026A1B8EF6841 :10F348000026F01F000CD8323008FE9FFBB4580985 :10F35800FE99FE00FE9FFE4BD83200000000733479 :10F368008000DA080000731C8000D21080010BF0C6 :10F3780080010CECD4314B86ED0800922FF87819F7 :10F388004B65ED5800928B091388F1D8C004F20838 :10F39800002818971693109C4B148908F01F003109 :10F3A8006A080E9C118BF7DBC004A36B5C3BF01F53 :10F3B800002EC0718E493138F0091900E08B000B1E :10F3C8004A580E9CF109009A2FF9F159009AE08FDA :10F3D80003026A0C069B2F0CF01F0024C0B16A0AB6 :10F3E800FC19E000F5380010B968E618F00012388A :10F3F800C0A149980E9CF10900A02FF9F15900A06D :10F40800E08F02E9F4CBFFF48EC830692F0A0E9C16 :10F41800F01F00175C8CC080ED0800980E9C2FF838 :10F42800ED580098C11868080E9CF13B000CA58B9C :10F43800F60B10FCF01F000CC1C0ED08009A0E9CE2 :10F448002FF8ED58009AED0800962FF8ED58009621 :10F45800E08F02C6000080D40000733000007318EB :10F468008000D67C8000CDD48001255880011E2CD8 :10F47800680811CA11D9B169F3EA118911EAF3EAE6 :10F48800108911FAF5E91009F20A1618B0CAF5D967 :10F49800C208B0F9B0DAF5D9C108B0EA4B28910929 :10F4A8006808F1390008F13A0009B16AF5E9118AEA :10F4B800F139000AF5E9108AF139000BF3EA100A6C :10F4C800F4091618F1690008F3DAC208F16A000BAA :10F4D800F1690009F3DAC108F169000A4A386804D9 :10F4E800910AE938000DF5D8C002F1D8C0064A0BD8 :10F4F800B6884A086A09580A5F1A8E4514055C8559 :10F50800B00549D87006CA586C485808C0E149B8CF :10F51800201D1AD8E06800B71AD84998499C1AD80B :10F52800F01F00192FCDC00858A8C0E14938201D88 :10F538001AD8E06800B81AD84948492C1AD8F01FD8 :10F5480000122FCDC0085818C24148C8201D1AD82B :10F55800E06800B91AD848E848AC1AD8F01F000A81 :10F568002FCDC0080000731C00007324000073280E :10F57800000073200000820C8003AC608003ADF0B3 :10F5880080039D9C800094C48003AE188003AE4421 :10F59800098A0998F1EA1088ED0A0024F00A19008E :10F5A800C56109AA09B8F1EA1088ED0A001CF00A39 :10F5B8001900C4D1F33A000CF338000DB168F1EA30 :10F5C8001188F33A000EF1EA1088F33A000FF5E8D3 :10F5D80010086C1A103AC3B1F33A0010F33800114E :10F5E800B168F1EA1188F33A0012F1EA1088F33AA7 :10F5F8000013F5E810086C0A103AC2916C380C3800 :10F60800C0E14CA8201D1AD8E06800C21AD84C885E :10F618004C8C1AD8F01F00482FCDC008580CC06079 :10F6280099384C6870098D3991066C380C38E0812E :10F6380001A14BE8201D1AD8E06800C81AD84C0868 :10F648004BCC1AD8F01F003C2FCDC0080C9C6C3650 :10F658005806FE91FF5BE08F05296C4858A8C0E06A :10F668004B28201D1AD8E06800D21AD84B584B1CDA :10F678001AD8F01F00312FCDC008098B0998ED0A60 :10F688000024F1EB1088F00A1900C77109AC09BB16 :10F69800ED08001CF7EC108BF6081900C6E1F33CE6 :10F6A800000CF33B000DB16BF7EC118BF33C000E33 :10F6B800F7EC108BF33C000FF9EB100B6C1C163CAD :10F6C800C5C1F33C0010F33B0011B16BF7EC118B93 :10F6D800F33C0012F7EC108BF33C0013F9EB100B22 :10F6E8006C0C163CC4A1498B178CEDBC0002E08061 :10F6F800013AEDBC0001C2D1494B6CAC760BF60C5B :10F70800010CC2D6ED14002C081C580CE089002806 :10F718005C7A201D5C751ADA48DCEA0B000B5C7811 :10F72800F2CAFFF0780CC7688003AC608003AE6C47 :10F7380080039D9C800094C40000820C8003AE98D6 :10F748008003AEC4000073280000731C00007324FB :10F75800EDBC0000C0414CC870088DD84CB8900969 :10F768003008F0091900E08000FEED3800260C9CF6 :10F77800A1B8ED680026CF486C365806FE91FF6F99 :10F788004C3870050C98CF286A0A580AC130F33CE7 :10F798000010F33B0011B16BF7EC118BF33C001236 :10F7A800F7EC108BF33C0013F9EB100B163AE081E1 :10F7B80000DC09AB09BAF5EB108AEB0B001CF40B63 :10F7C8001900E08100D25808C0706A3991394B0895 :10F7D80070098B3991054AF81188EDB80004C1F118 :10F7E8004AD8700913AB139A13B8201D1389F1EB8B :10F7F8001088F5E910894A5B1AD9968C4A794A8BA0 :10F808007209760BF2CAFFF0F80B000B4A5C780C11 :10F818002FFC2F49F01F00242FEDCA48EDB8000136 :10F82800E08100A1EB3C0014F01F00201896C08175 :10F8380049F8F109009C2FF9F159009CC938497819 :10F848007008F0C9FFF0C0311298C108F1390013EF :10F85800F13B0010F13A0011F1380012B16AF5EBF2 :10F86800118AF5E81088F3E810088D08EB08001CE9 :10F87800ED58001C48987008F0C9FFF4C1A112980F :10F88800C27800000000821000007320000082147B :10F898000000732800007318000073300000731C08 :10F8A80000007324800102348000E1D4000080D479 :10F8B800F139000FF13B000CF13A000DF138000E60 :10F8C800B16AF5EB118AF5E81088F3E810088D188D :10F8D8004C587008118B1199F3EB1089ED590024DD :10F8E80030398D494C197209F2CBFFFF8DCB8DABA6 :10F8F800F13B000FF138000EF7E81088ED5800587A :10F90800ED5800608A48E2180199AC486A684B8A49 :10F918002019740C8D688D3C6A889506ED49006441 :10F928008D880C9CF01F0033ECCBFFFCED1C003CD9 :10F93800F01F00313019ED5C003C201D30081AD949 :10F94800109A3129109B0C9CF01F002C2FED5C5C49 :10F95800C0600C9C300BF01F002AC0480C9CF01FA4 :10F9680000290E9CC3C80A986A355805FE91FF0EF7 :10F9780049D56A08F13C000DF9DCC006F01F0022E9 :10F988005806E08003504A188E4A6A09911791492F :10F99800B06A30096E1A9109912A49D8910949D853 :10F9A800B089ECFA0084580AC3C0ECF8008C5808F7 :10F9B800C0500C9B6C6C5D18C06810990C9B109C17 :10F9C800F01F00155C5CC041ED4C0084C2A80E9C81 :10F9D8004928F10900962FF9F1590096F01F0010F7 :10F9E800D8320000000073180000731C0000820C5D :10F9F8008000E6B48000D95C800103508000E124D7 :10FA080080010CEC8000D67E000073340000732C5B :10FA1800000073298000E5EC000080D48000D13C10 :10FA28004A9891064A981188EDB80002C3216C489B :10FA38005828C0814A6870096D781039E081026BD6 :10FA4800C1D84A49720A6CA9F4090109E08602631F :10FA5800ED1A002C14195809E089025DE08F032182 :10FA680049D8201D1AD8E06802271AD849B849CCC5 :10FA78001AD8F01F001C2FCDC00849B91388A3B8A5 :10FA8800B288ED380026A1C8ED680026E08F024351 :10FA9800EDB80001C0616C4820285818E08B00A21E :10FAA800492870088DD830080C9CED6800ADF01F0F :10FAB80000106C4820285878E08B022D48D9F208AD :10FAC800032F000000008224000073280000732424 :10FAD8000000731C8003AC608003AEF480039D9C1F :10FAE800800094C400007329000082108000E6B4EE :10FAF8008003AC404CF811891298E218001259287A :10FB0800C7A14CD8700A6DF8704811FB11C711DCF9 :10FB180011E8B16CF9E7118CF9E81088F7E81008DA :10FB28002FF8103AC681ED0800722FF8ED580072D0 :10FB38004C287008ED4A0050F0CA00012FF88DC813 :10FB48008DA84BF87008F139000FF138000EF3E872 :10FB58001088ED5800603048ED4A00648D48EC0884 :10FB6800000BED1C003CF01F00375C8CF808100AF5 :10FB7800ED5C003CED580058ED0900563018F009CE :10FB88001900C021A17CED5C0056ED0800745808EE :10FB9800C0E14AD8201D1AD8E06802591AD84AB8D4 :10FBA8004ABC1AD8F01F002B2FCDC00820186DFCB6 :10FBB800ED5800747808ED48007C5808F9B800FF43 :10FBC800F9B80100EDF81E4EED58003AF01F00227A :10FBD800ECF800905808C050300A0C9B6C6C5D180B :10FBE800ED380026A1B80C9CED680026F01F001B1C :10FBF800E08F0191EDB90004E081018D4908700999 :10FC080013AB139A13B8201D1389F1EB1088F5E98B :10FC18001089493B1AD9968C4929488B7209760B69 :10FC2800F2CAFFF0F80B000B483C780CC7980000AC :10FC380000007328000073240000731C0000731870 :10FC48008000D95C8003AC608003AF1480039D9C66 :10FC5800800094C48000DA3C80010CEC0000732022 :10FC6800000073304C281188EDB80004C5E14C1829 :10FC7800700C6D485CD81808C3D66D78F808010870 :10FC88005808E089003830488D486C885808C0E129 :10FC98004B98201D1AD8E068027E1AD84B784B8CF6 :10FCA8001AD8F01F00382FCDC008300A0C9B6C6C96 :10FCB8005D185C5CC0700C9C301BF01F0033E08F3B :10FCC80001A7ED0700560C9CF01F0030ED080070EE :10FCD8005808F9B901FFF1D9E108EDF81C383019D5 :10FCE800ED08003CF2071900C021A178ED58005634 :10FCF800C2E84A78700913AB139A13B81389F1EB69 :10FD08001088F5E910894A3B201D1AD94A29968797 :10FD180072094A2BF2CAFFF0760BEE0B000B2F4943 :10FD2800F01F001F2FEDCF68EDB80001E08100F350 :10FD380049A870096CA820181039E08100EC0C9CC7 :10FD4800F01F0018CE780C9CF01F0010496811882D :10FD5800EDB80005E08100DFED380026A1B80C9C65 :10FD6800ED680026F01F00113078CC1800007328C9 :10FD7800000073248003AC608003AF2C80039D9C3B :10FD8800800094C48000E1248000E7F40000731828 :10FD980000007320000073300000731C80010234DF :10FDA800800101000000732980010CEC0C9CF01FFD :10FDB800003E4BE84BE91188E2180020C2D01388B6 :10FDC800EDB80004C1F14BB870096D781039C1A1C4 :10FDD800ED380026A1B80C9CED680026F01F00360F :10FDE8000C9CF01F00364B6972080C38C5604B59E3 :10FDF8009308C05870390C39C69012985808CFB17A :10FE0800C6D8ED380026A1B80C9CED680026F01F76 :10FE1800002A3088C6C81388EDB80004E081007B4A :10FE28004A4870096D781039C7513068C6080C9C6B :10FE3800F01F001D49D81188EDB80005C6B1ED388E :10FE48000026A1B80C9CED680026F01F001B0C9C36 :10FE5800F01F001A49A972080C38C1F04999930893 :10FE6800C05870390C39C32012985808CFB1C368EC :10FE78000C9CF01F000D48E81188EDB80004C4A1DF :10FE880048C870096D781039C4510C9CF01F000BDC :10FE980048B972080C38C0316C38C21848999308B0 :10FEA800C1B800008000E7F400007329000073283F :10FEB8000000732480010CEC8000DA8C0000820CB6 :10FEC8000000821870390C39C0614C0993086C39EC :10FED8009139C06812985808CF614BC99308300807 :10FEE8008D384BB870098D39910630A88D48C128D6 :10FEF8000C9CF01F00384B881188EDB80004C0A195 :10FF08004B6870096D781039C0514B591388A5A8F2 :10FF1800B2884B381188EDB80003C091ECF800980E :10FF28005808C0803FAB6C6C5D18C048EDB8000441 :10FF3800C0A10C9B4ABCF01F002C0C9B302CF01F5E :10FF4800002BC658ED0A0070580AC090ECF80088DB :10FF58005808C0505C7A0C9B6C6C5D184A48700855 :10FF68005808C24049C91389EDB90003F1F9080DD1 :10FF7800F9BA0001F3DAE039F1F90E0D49CAECF8E3 :10FF8800008C5808C070740A30090C9B6C6C5D18A2 :10FF9800C0781099740A0C9B109CF01F00165C5CCA :10FFA800C05049387008ED48008448D81188EDB829 :10FFB8000005C271ECF8008C5808C1D030090C9BC0 :10FFC800129A6C6C5D18C1D800008218000082205B :10FFD8008000E7F4000073280000732400007329F0 :10FFE8000000820C8000DAE88000C9740000732CDD :08FFF8008000E5EC10990C9B60 :02000004800179 :10000000109A109CF01F002E30094AE80C9C9109B0 :10001000F01F002D30064AB891064AC76E1C580CD6 :10002000C330F01F002B8F16C2F86A0BF738000D93 :10003000EDB80002C2604A78F10C00A02FFCF15C20 :1000400000A0F10C00962FFCF15C0096179C17A6FF :1000500017B8178BF9EB108B201D49F972091ADBC1 :1000600049EB968CF2CAFFF0F1E6108849CB2F4994 :10007000760BF80B000B49BC780CF01F001B2FED22 :100080000E9CF01F0013F01F0019C1714988201D3C :100090001AD8E06801771AD84968497C1AD8F01F45 :1000A00000172FCDC0085808FE90FCE0FE9FFCEB27 :1000B00049387006FE9FFB67D83200008000E5ECEF :1000C0000000822480010CEC000073348000D13CDD :1000D000000080D400007330000073200000731C07 :1000E00000007324800102348000D6B48003AC6029 :1000F0008003AF4080039D9C800094C40000822058 :10010000D42179F95809C3107208F8CEFF88F9484C :10011000007C79E8C038109E70085808C1C0704B48 :1001200017F617C417D5B165EBE41185724A17EBC2 :1001300015F7EBEB108B15C5EDEB100B15D615EA8B :10014000B166EDE51186EDEA108AEFEA100AF60ACB :10015000010ACE2693089D093008F9480040F93875 :10016000004E2FF8F968004ED822D42179F95809A9 :10017000C600F9380026EDB80002C5B07208F8CE06 :10018000FF88F948007C79E8C038109E700858084C :10019000C1C0704B17F617C417D5B165EBE41185D4 :1001A000724A17EB15F7EBEB108B15C5EDEB100B47 :1001B00015D615EAB166EDE51186EDEA108AEFEA8B :1001C000100AF60A010ACE26930830089D09F9485C :1001D0000040F938004E2FF8F9090056F968004E32 :1001E000F5D9C02FF9080060F7D8C02FF009190021 :1001F000F60817B0F4081780F9580058F908003CC1 :10020000F00915015C78A178F91A0058103AF9F94B :100210005C2CF9380026A3A8F909003CF9680026EF :10022000F20815011009F90800581009F95900568B :10023000D822D703D43118941693149112921096A1 :100240004097300A314B301CF01F00391895C6D04A :1002500098593138F0091900E08B000F4B58201DD8 :100260001AD8E068031F1AD84B384B4C1AD8F01F25 :1002700000342FCDC0080E9878175C78AEB8A988E6 :10028000AEA8E0685014EF68000DA988EF68000C74 :10029000E8081618AEC8F1D4C208AED8E608161899 :1002A000EF680008F1D3C208F3D6C010EF68000968 :1002B000AE993088A9893006AEF4EF63000BAE89A1 :1002C000EF66000FEF660012EF660013EF66001096 :1002D000EF660011EF68000E3069049A029BE9D4C2 :1002E000C108E7D3C108AEE4EF63000A98C8F01F65 :1002F00000155C7CEF6C0011A98CEF6C0010201DC8 :10030000491C30671AD70C98F9070090049A2FF708 :10031000029BE06900FFF95700900A9CF01F000B58 :100320000A9CF01F000B2FEDD83200008000D3187C :100330008003AF5C8003AFA480039D9C800094C4C5 :1003400080011E2C000080D4800122948000D13CCA :10035000D43120BD14915098414A505A12961897A2 :100360003009F20119005F08F20A18005F0AF1EA89 :10037000000AF20A1800C110F3D6C002C0E14C789E :10038000201D1AD8E06800AD1AD84C584C5C1AD819 :10039000F01F00452FCDC008580B5F195089126817 :1003A000C0E04BE8201D1AD8E06800AF1AD84BF81F :1003B0004BCC1AD8F01F003C2FCDC008EF080072BC :1003C000E2081900C0B2EF380026EA18FFFFE8186B :1003D000FF80EF680026E08F02E34058F3D8C001A9 :1003E000E2180002F9B8010CF009002950296FB099 :1003F000EF02007431F8F0021900E08800144AC8D6 :10040000F109009C2FF9F159009CE06C00FFEF38D6 :100410000026EA18FFFFE818FF80EF680026E08F4B :1004200002C36FF85802C2605808C1404028A38830 :100430002FB8AD685C883003503B50A8F7D1B0109E :10044000409A504BF5DAC001069406980695506A1A :10045000C3796FE85808CEB14908201D1AD8E06862 :1004600000D01AD8493848FC1AD8F01F000F2FCDF9 :10047000C0085808C0416FE85808CD904878201D42 :100480001AD8E06800D31AD848B8486C1AD8F01FB8 :1004900000062FCDC00800008003AF5C8003AFD4FE :1004A00080039D9C800094C48003B028000080D409 :1004B0008003B0688003B0A450195008EF03003CDB :1004C000304CF01F0042401918954008E080023C73 :1004D000300B990B991B5809C0301894C118580853 :1004E000C0E14BB8201D1AD8E06800EF1AD84B982D :1004F0004B9C1AD8F01F00392FCDC008910C5C73AB :10050000402A4069E60A010840435C73E6080D434F :100510005C835809C3904028300AE608000B149CFD :100520005C7BF01F002F8B1CE080020EF5D3C01007 :10053000402B98D9F40B00081039C0E44A48201D1C :100540001AD8E06800FF1AD84A684A3C1AD8F01F47 :1005500000232FCDC008501AF01F0023401A18980E :1005600040895809C0A0402B6A195008721C160C0B :10057000403BF01F001E4008F00200026A185C8237 :1005800070188B28C3D8406A402B149CF01F0014AD :100590008B1CE08001D9F01F0014407AF8020002A1 :1005A0005C82580AC2D0F7D3C010301A303CF01F1A :1005B000000C189B6A1C580BC1C1F01F000D40694C :1005C0008B19E08F01C100008000C9D48003AF5CAB :1005D0008003B0D880039D9C800094C48000D31811 :1005E0008003B0E88000CD0C8002E7368000D13C6B :1005F000403897182FF28B285C82F01F003F320B97 :10060000F6021900E08B01A0AA63314B6A1CF01FAF :10061000003BC0904BA8F10900A42FF9F15900A4A8 :10062000E08F0192EF39001C6A1870188B48B0896E :10063000EF39001DB099EF3900246A48B0A9EF39AD :100640000025B0B9E00916186A48B0C9F3D0C2084D :10065000B0F0B0D9F3D0C108B0E96A48F16C00132A :10066000F16C00126A48F13A000CF139000DF3EA1E :100670001089E019FFC0EDE910095C79F169000DFE :10068000A989F169000C405AEB6A000E404806182F :100690005C88F3D3C0105048403B6A48120B503B73 :1006A00040AA1200F139000DF3D9C006F5E910098E :1006B0005C79F169000DA989F169000C0A98300A8A :1006C000404BF40B19005F1B507B169A58045F09CE :1006D000300B124AF60A1800FE91FEF0F5D2B01067 :1006E000503A6FE05800E08000C260085808C0909F :1006F0001090CFCB8000CD348000CDD4000080D4CA :1007000080EA6048F139000DF3D9C0025F1B140B79 :10071000E08000C45809E08100C1F7D6C0025F0C38 :10072000301BF60618005F0BF9EB100BF20B1800EC :10073000E08000B488EBEF19003C140B123BE08919 :1007400000ADE13B000EE939000EF20B1800E0812C :1007500000A5684911FE13FB504B11CC11DBB16BA6 :10076000F7EC118B11ECF7EC108BFDEB100B160A6C :1007700013CB13D8B168F1EB118813EB4049F1EBBF :100780001088F3E81008103AE08100884028681CBF :10079000F00B11EC5C8BF01F0037C0E04B68201DA4 :1007A0001AD8E06801691AD84B484B5C1AD8F01F78 :1007B00000352FCDC0086818905AF80A1900C0A15A :1007C00070098919910C4032109C20125C82F01F34 :1007D000002EF1D6C001681BC220580BC05188689A :1007E000F6081900C0E04A48201D1AD8E0680177D1 :1007F0001AD84A684A2C1AD8F01F00222FCDC008F8 :100800006048F13A000CF139000DF3EA1089A1A912 :10081000F169000DA989F169000CC1E8580BC050BD :100820009659F0091900C0E14938201D1AD8E0682E :10083000017A1AD84968492C1AD8F01F00122FCD16 :10084000C008601CF01F001380698868F208000867 :10085000A068680881080835E0051700E1F3020682 :10086000089B304CF01F000CC198EF440078C16821 :100870008000CDD48003AF5C8003B11C80039D9CBD :10088000800094C48000D13C8003B1308003B1501B :100890008000CD348000C97481040C98EDB600014D :1008A000C040EDB60000C0312FF15C81EDD6C00133 :1008B000EFF81826F9B90120F1D9E138EFF81E2632 :1008C0006FB9F1D1C010F2080008EF520074EF4880 :1008D000006CEF0800720218EF5800725802C14015 :1008E0006FF85808C1116FE85808C0E14AF8201D98 :1008F0001AD8E06801A11AD84AD84AEC1AD8F01FD1 :10090000002E2FCDC00858055F193008F0031900DC :100910005F1AF5E90009F0091800C4406A48580850 :10092000C410409CE21C0002C3D1F13A000CF13922 :10093000000DF3EA1089A3B9F169000DA989F169E5 :10094000000CC318EF380026EA18FFFFE818FF80F4 :10095000EF6800264998F109009C2FF9F159009C95 :100960005804C040089CF01F0016EF0900743008BE :10097000F0091900C1406FF85808C1116FE8580814 :10098000C0E148A8201D1AD8E06801B41AD84888E8 :10099000488C1AD8F01F00082FCDC008E06C00FF6B :1009A000C028300C2F5DD8328003AF5C8003B16467 :1009B00080039D9C800094C4000080D48000DA688D :1009C000D421784E1298587E5F07584E5F09EFE9A0 :1009D0001009C081582EC060583EC040E06C00F83D :1009E000D822580AC031149CD822201D30095C7AC4 :1009F0001AD9F01F00032FED5C5CD8228001035050 :100A0000D4013008201D109A16991AD8149B30185A :100A1000F01F00032FED5C5CD80200008001035042 :100A2000D431189679F45804C05179E45804E08020 :100A300000CE6848F133000DE7D3C001C06088697B :100A40003008F00919005F03300A5C53301C14337E :100A5000F9BB0114F9BB0015F01F005D1895E0808B :100A600000B698593138F0091900E08B000F4D9805 :100A7000201D1AD8E068040F1AD84D784D7C1AD87A :100A8000F01F00572FCDC008684811FA11CB11D9BB :100A900011E8B169F3EB1189F3E81089ED38001C16 :100AA0007817F5E91009AE88EF3A000CED38001D13 :100AB000AE98EF38000DF1EA1088ED3A0024AEAAA6 :100AC000ED3B0025AEBBF20B1618AEF9AECBF7D955 :100AD000C208F3D9C108AEDBAEE9ED390028EF69F1 :100AE0000008ED390029EF690009ED39002AEF69A6 :100AF000000AED39002BE018FFC0EF69000BA5A834 :100B00005C88F5D8C010EF6A000DF40B1608EF6B87 :100B1000000CED39002EEF69000EF1D8C006300947 :100B2000E8185000ED3A002F5C78EF6A000FEF688C :100B3000000DEF690011EF690012EF690013EF6912 :100B40000010A988EF68000CED19002E6CA8F208BF :100B500000088DC85803C110EF39000CEF38000DA4 :100B6000F1E91088E018FFC0E8180011EF68000DE7 :100B7000A988EF68000CC068682811897818F169A5 :100B80000014ECC4FFFC8AC83069089A0C9B0A9CCC :100B9000F01F00145C7CEF6C0011A98C4929EF6CEC :100BA0000010F30C00902FFCF35C0090306C201DC3 :100BB000ED39000B089A1ADC0C9B30080A9CF01FD8 :100BC000000B0A9CF01F000A2FEDD8328000D318CA :100BD0008003AF5C8003AFA480039D9C800094C41D :100BE00080011E2C000080D4800122948000D13C22 :100BF000D431300A1895314B301CF01F003918934E :100C0000C041E06C00FED832EB380026EB39001C06 :100C1000E018FFFCEB6800266B787817AE89EB399B :100C2000001DAE99EB390024F00B1618AEA9F3D8CD :100C3000C208EB3A0025AEF8F1D8C108AECBAEBA87 :100C4000AED9AEE86AA8F0091618EF690008F3D823 :100C5000C208E06A5010EF690009F3D8C1083004F7 :100C6000EF68000BEF69000AF40B1608EB19002E71 :100C7000EF6B000CEF6A000DEF69000FEF640012DC :100C8000EF640013EF640010EF640011F20A16081D :100C9000F2080008EF6A000E8BC8EAC6FFFC0A9B48 :100CA0000C9A98C83069F01F000F5C7CEF6C001143 :100CB000A98CEF6C0010306CEB38000AEB39000B9C :100CC000201D0C9A1ADC0A9B069CF01F0007069C4C :100CD000F01F0006089C2FEDD83200008000D318CA :100CE00080011E2C800122948000D13CD431202D23 :100CF0004AE8189770081838E08001A3F9080056F0 :100D0000F9090060F0091900F20817805C785008B2 :100D100079E6F9380026E2180002C1E05806C170F1 :100D20008CEB6C48794911CCF609010911DBB16BE8 :100D3000F7EC118B11FA11E8F7E81088400BF5E891 :100D40001008F20800081638E08800070E9CF01F13 :100D500000185C5CC7696FF55805C0B1EEC9FF8427 :100D6000EEC2FFFC5019300349214930C2B9109539 :100D70006A085808CFD1CF3BF13C000CF139000D87 :100D8000F3EC108C5C8CEDBC0002C1F148B8201D66 :100D90001AD8E06802471AD8489848AC1AD8F01F09 :100DA000000A2FCDC00800000000822480010BF053 :100DB000000080D4000082108003AF5C8003B18407 :100DC00080039D9C800094C46FF95809C150EF3B8B :100DD00000261699E2190044C0F16FE95809E08035 :100DE0000133720E580EC081926EEF09003CF20E74 :100DF0001900E08301296C09EF4900786E495829F0 :100E0000C0E0A5AC5C7CF16C000DA98CF16C000C11 :100E1000EF390026E019FFFCEF6900266EA9F20AFF :100E20001618F16A0008F5D9C208F16A0009F5D967 :100E3000C108F169000BF16A000AEF1A002EF16A8D :100E4000000FF40B1608F16B000EF40900098FC9AE :100E5000ED39000EEDB90000C061E06B0200EA1B45 :100E60000204915BEF08003A3FF9F2081900F9B863 :100E70000000EFF80C1D6E085808C071049CF01FAC :100E80000075C45078188F086F085808C121600990 :100E90006C48EF49004011F911CB11DA11E8B16A41 :100EA000F5EB118AF5E81088F3E81008EF480044E4 :100EB0006C1C6C4478199848985A9914E8090109EF :100EC000121A1218B85AB84830695C78049A0E9B06 :100ED000E9630010E9630011F01F005F30695C7C7A :100EE000E96C0011A98CE96C0010E30800902FF860 :100EF000201DE35800901AD9049AEF38000AEF3900 :100F0000000B0E9B6C1CF01F00552FED6C4811FA66 :100F1000F139000DF3D9C0025F1B11CC8CE9F60941 :100F2000000911DB11E8B16BF7EC118BF7E81088C1 :100F3000F5E810086F7AF2080008101AC037EF4879 :100F4000005C5809C3B08D036FF85808C041EF46E4 :100F5000007CC3286C4A15FE15C46A4915DBB16BC9 :100F6000F7E4118B15E4F7E4108BFDEB100B13CEB7 :100F700013FC13DAB16AF5EE118A13EEF5EE108A5E :100F8000144CF60C010CC177401AC058109A700826 :100F90005808C0E0704913C413FC13DEB16EFDE4C1 :100FA000118E13E4FDE4108E1C4C161CCF068D0828 :100FB0009506C0788B060C95C0480C9CF01F002845 :100FC0006FE65806C3706C4811CC6F4A8CEB11D990 :100FD000141BB169F3EC118911ECF3EC108911FCCD :100FE000F9E91009F6090009400B1639FE98FEC60A :100FF000EF3900AC3008F0091800C1C18CEB6C4827 :10100000F60A010A11F911CC11DB11E8B16BF7EC0A :10101000118BF7E81088F3E81008100AEF18006049 :10102000103AF9B80B00EFF8BA2AF9B80B01EFF84B :10103000BEACEF380026F1D8C007EF680026300CB0 :101040002FEDD832E21B00A0FE91FED7CD2B000081 :101050008001222880011E2C800122948000DA3C2D :10106000D401189879FA580AC170149B7609580966 :10107000C030129BCFCB71EC970CF1490040F14985 :10108000007CF139004E2FF9F14A0078109CF1698B :10109000004EF01F0002D80280010CECD431300A5F :1010A0001896314B301CF01F00401895C7B0985966 :1010B0003138F0091900E08B000F4BC8201D1AD8F9 :1010C000E06803C91AD84BA84BAC1AD8F01F003AF5 :1010D0002FCDC008ED39001C78176D78AE89ED3939 :1010E000001DAE99ED3900242018AEA9F00B16189A :1010F000ED3A0025F3D8C208AEF8F1D8C108AECB5E :10110000AEBAAED9AEE86CA8F0091618EF690008BF :10111000F3D8C208E06A5010EF690009F3D8C1089B :101120003004EF68000BEF69000AF40B1608ED19A4 :10113000002EEF6B000CEF6A000DEF69000FEF64FB :101140000012EF640013EF640010EF640011F20A64 :101150001608F2080008EF6A000E8DC8ECC3FFFC09 :1011600098C83069069A0C9BF01F00145C7CEF6CE9 :101170000011A98C4929EF6C0010F30C00902FFC92 :10118000F35C0090306C201DED39000B08981ADCE0 :10119000069A0C9B0A9CF01F000B0A9CF01F000A89 :1011A0002FEDD8328000D3188003AF5C8003AFA44A :1011B00080039D9C800094C480011E2C000080D47C :1011C000800122948000D13CF9390010A3C948A8BD :1011D000F969001011BA118B119911A8B169F3EBDB :1011E0001189F3E81088F5E8100899183008F958C3 :1011F00000145EFC8003B409997A996B5EFCD703F6 :10120000D421301CF01F00071897C080320A300B21 :10121000F01F00053FF8EF68000B0E9CD82200007D :101220008000C9D48002E8BCD40148C9189B720868 :101230001838C0D178389308C0C870395809C060D0 :101240001639F7F90003F1F90A0370385808CF612D :10125000301CF01F0003D802000082288000C974EF :10126000D4214AB83009700E1C98C148103CC111F5 :101270005809C0E04A78201D1AD8E06802541AD8EC :101280004A584A6C1AD8F01F00262FCDC0083019D2 :1012900070385808CEC1580BC0C017B817861797BA :1012A00017ABB167EFE61187EFEB108BF1EB100B8B :1012B000990B580AC2211C98E06A1000E0667FFF73 :1012C0003007C0C8F10B0012F40B1900C061F6CA58 :1012D000FFFF1C985C8AC0287038EC0A19005F1563 :1012E00058085F1BEBEB000BEE0B1800CEC1580843 :1012F000C040E06C00F5D822F95A00125809C0200D :10130000D82A993E4828910C129CD82200008228A5 :101310008003B19C8003B1E080039D9C800094C455 :10132000D4213008169614951897F9090012F0097F :101330001900C071300A189BF01F00145C5CC231A8 :101340005806C0C00DB80D8A0D990DA6B169F3EA13 :101350001189F3E61086F1E61006EF380010A3A815 :101360008F16EF680010EF55001448987008109C15 :10137000C0581837C021D82A783C580CCFB18F38C4 :1013800048389107D82200008001126000008228AE :10139000D43112971093169414911895F9090012EC :1013A0003008F0091900C091300A189BF01F004561 :1013B000E5DCC008E0810084308B089CF01F00420F :1013C000C0310896C0E8300A308B301CF01F003F57 :1013D0001896C041E06200FFC728089BF01F003C40 :1013E0008C593078F0091900E08B000F4B98201DC4 :1013F0001AD8E06801C51AD84B784B8C1AD8F01F60 :1014000000382FCDC008EB3900120E986C175C78AD :10141000AE893009EB3A0013AEB8AE9AA988AEF99E :10142000AEE9AEA86A085808C041E6C2FFFCC10890 :1014300066191238C0C00836C041E06200F7C3F830 :101440000C9CE06200F7F01F0027C3980A928CC83A :10145000F0091608AED8AEC9EB390010EDB900009E :10146000C1403119029A049B0C9CF01F001F5C8C38 :10147000F1DCC010AEF8A988AEE8580CF9B800FF4E :10148000EFF80E07EFF80E0631181AD3049BEB396C :10149000000B029A1AD80C9CEB38000AF01F0013BC :1014A0002FEDE5DCC0080836C0400C9CF01F000D95 :1014B00048F8F10900782FF9F1590078049CD832E6 :1014C000800112608000CDD48000D3188000CDB49C :1014D0008003B19C8003B1EC80039D9C800094C488 :1014E0008000D13C80011E2C80012064000080D44B :1014F000D421202D1897501B149C500A1296F01FCF :10150000000C401B1898400AC0A148A8E06C00FCE1 :10151000F10900862FF9F1590086C078F3D6C01082 :101520000E9CF01F00055C5C2FEDD8228001222864 :10153000000080D480011390D401F8CAFFFCF9198F :101540000014F01F00035C5CD8020000800114F05E :10155000D431203D4D98F109007A2FF9F159007AE4 :10156000781716910F8818955C8898CAF3D8C0042C :101570002FE9A369123AC0A5F1D8C004F00B1502F7 :101580005C3BF01F004F1894C0904CC80A9CF109B6 :1015900000822FF9F1590082C1D96A12EECCFFF016 :1015A000029B502CF01F004705980583F1E3108340 :1015B00005B805AE1896F1EE108E5C835C8E34484B :1015C000F00E1900C2413438F0031900E081008B9D :1015D00062A85808E080008770145804E0800083F7 :1015E00068185808E0800092EF3A000CEF39000DBF :1015F000B169F3EA1189EF3A000EF3EA1089EF3A84 :10160000000FF5E910091238C6D1C7F84AE8089961 :10161000700A089B1498500AC618F10C0012FC0CB2 :101620001900C5A15806C041700C580CC1B0EF306C :101630000010EF3C0011B16CF9E0118CEF3000129A :10164000F9E0108CEF300013F60618005F1AE1EC99 :10165000100C700018305F0CF5EC100CF60C180034 :10166000C3B05804E08100D6F13C0010E21C000435 :10167000F0041700CCE8701C580CC150EF3A000C75 :10168000EF30000DB160E1EA11805010401AEF30E8 :10169000000EF5E010805010EF30000F401A14409B :1016A000003CC1A1400A10945809C0F0703893382A :1016B000893A48589104C148000080D48000CDD4B4 :1016C00080012558000082284C88F109008E2FF9EE :1016D000F159008EC058109970385808C9F1580453 :1016E000C141EF3A0010EF380011B168F1EA1188FA :1016F000EF3A00126219F1EA1088EF3A0013F5E8A8 :1017000010081039C6D1300405F805E9F1E9108850 :10171000C130402A8AC83119EECBFFF40A9CF01F71 :1017200000345C8CC0904B180A9CF10900802FF9A2 :10173000F1590080C4F83F8B0A9CF01F002EC0E0D6 :101740004AD8201D1AD8E06801141AD84AB84ACCE1 :101750001AD8F01F002C2FCDC0085804C0D06866DE :101760005806C3E0089BF1D3C010EEC9FFF40A9AF3 :10177000687C5D16C5585806C261EF380010FC1928 :10178000E000B968E618F0001238C1D00F8B0A9C4F :10179000F7DBC0042FEBA36BF01F00166A180E389E :1017A000C0E04958201D1AD8E068012F1AD84968AE :1017B000493C1AD8F01F00132FCDC008303B0A9CBB :1017C000F01F001248980A9CF10900882FF9F1597E :1017D0000088F109007E2FF9F159007EC0280A9C8B :1017E000F01F000BC1D80000000080D480011E2C27 :1017F0008000CDD48003B19C8003B11C80039D9CEC :10180000800094C48003B21C800118FC8000D13C8D :10181000F10C0014E60C1900FE91FF5FC2DB2FDD16 :10182000D8320000D431189316921494324B300AF7 :10183000301CF01F00241897C43098593238F00932 :101840001900E08B000F4A08201D1AD8E068012E0D :101850001AD849E849EC1AD8F01F001E2FCDC0084D :101860007816661531CAAC94AC823004ACC4ACD4E2 :10187000ACE4ACF4661B781C2F8CF01F00170C9C9A :10188000ACA4ACB48EDBF01F00155C7CACBCA98CA6 :10189000ACAC201D492C30161AD60898F906006009 :1018A000EACAFFF4E06900FF089B2FF6F9560060D2 :1018B0000E9CF01F000C0E9CF01F000B2FEDD83279 :1018C0008000D3188003B2308003B27880039D9CDF :1018D000800094C48002E73680011F4A000080D453 :1018E000800122948000D13CD401F5DBC00830BBDC :1018F000F01F0002D802000080011824D401F5DB9B :10190000C008303BF01F0002D802000080011824FC :10191000D4314C62E50800622FF81694E558006255 :10192000781618970D85EBD5C004A365EA0311005E :101930005C83069BF01F003EE08101788E493038C1 :10194000F0091900E08801726E1811893088F009D9 :101950001800E081015DED380010ED310011B1613A :10196000E3E81181ED380012E3E81081ED3800134F :10197000089BF1E11001ECCCFFF0F01F002EC071CC :10198000E611F000FC18E0001031C0914A780E9C7E :10199000F10900742FF9F1590074C4498E49307867 :1019A000F0091900E08801420E9CF01F00235C8CB6 :1019B000C0A00E9CF01F0021E50800682FF8E55834 :1019C0000068D832330B0E9CF01F0019C6E00A9B4A :1019D0000E9CF01F0017189AC0E04998201D1AD8D5 :1019E000E06800981AD84978497C1AD8F01F001787 :1019F0002FCDC0088ECB302CF01F00151892E08040 :101A0000011F98D9EAC8FFF81039C25248C8201DF2 :101A10001AD8E06800A21AD848E848BC1AD8F01FC3 :101A2000000B2FCDC0080000000080D48000CDD472 :101A30008001255880011FAC8000D13C8003B2306A :101A40008003B2A480039D9C800094C48000D318BE :101A50008003B2D80E9BF01F00445C5CC0E04C38A1 :101A6000201D1AD8E06800A51AD84C184C1C1AD8AA :101A7000F01F00412FCDC008069B6416049CF01F88 :101A8000003FC0E04B98201D1AD8E06800AB1AD880 :101A90004BB84B8C1AD8F01F00382FCDC0080E9CC5 :101AA0000497F01F0038C1383D0B0E9CF01F003327 :101AB000C0E04AE8201D1AD8E06800B51AD84B08E3 :101AC0004ACC1AD8F01F002C2FCDC008ED3A000CDC :101AD000ED39000DB169F3EA1189ED3A000EED3BE5 :101AE0000010F3EA1089ED3A000FF5E91009ED3A1C :101AF0000011B16AF5EB118AED3B0012F5EB108A8B :101B0000ED3B0013F7EA100AF40B16186E18ED6A95 :101B1000000FED6B000CF7DAC208F5DAC108ED6AC8 :101B2000000EF20A1618ED690013ED6A0010ED6B55 :101B3000000DF5D9C208F3D9C108ED6A0011ED69AD :101B40000012300911AAB08911B9F3EA1089FE7A9E :101B5000F7FE5C89F4091900E0880016F2C9F7FF66 :101B6000C14800008000CF988003B2308003B310DA :101B700080039D9C800094C48000CDD48003B33842 :101B80008000D13CF2C9F8005C79B0B9A989B0A94C :101B9000ED380009E818FF00ED680009A988ED6834 :101BA00000083008314BED68000BED68000A0C9C12 :101BB000F01F00284A885C7CED6C000BA98CED6C52 :101BC000000AF10900602FF90A9BF15900600E9C90 :101BD000F01F00221898C0E04A18201D1AD8E068AB :101BE00000D71AD849F84A0C1AD8F01F00202FCD78 :101BF000C00830191AD4189A1AD9ECCBFFF4E0694E :101C000000FF0E9CF01F001A2FEDC0B8E508007011 :101C10002FF8E5580070E50800662FF8E5580066D3 :101C20000E9CF01F0014D8320E9CF01F001248A822 :101C3000F109006A2FF9F159006AD8320E9CF01FA1 :101C4000000D4858F10900742FF9F1590074D83289 :101C500080011F4A000080D48000CDD48003B230C0 :101C60008003B36C80039D9C800094C48001206439 :101C70008000D13CD431205D30951988FAC9FFF03D :101C8000FACEFFFC5009330231033056F0C9003060 :101C9000EA091800E08B00BAE4081800C03030A749 :101CA000C1582FFC35891988F20818005F0A378956 :101CB000F20818005F09F5E91009F9B70008F7BC48 :101CC00001FFF9B70110F9F81800F8CAFFFF300951 :101CD0003191F2070244F0C000301004F4CC00014E :101CE000EA001800E08B0005E8C90030C1E80E9456 :101CF000E6071800C1D1F0C400615C54EC04180080 :101D0000E088000EF0C00041EC001800E08B0011EC :101D1000E2041800E0880004341CC028361C2F6838 :101D2000F00C010CF9E9104915882FFACD3B32EA85 :101D3000F4081800C0814008103EC6701CA92FFC92 :101D40001988CA5B5808C28030CAF40818005F1CA2 :101D5000320AF40818005F1A146C300AF40C1800E8 :101D6000C1B030DCF80818005F1730ACF808180074 :101D70005F1CEFEC000CF40C1800C0E030BC309796 :101D8000F80818005F1CEE0818005F18F9E8000852 :101D9000F4081800C3A1FAC8FFFC101EA34E2FFEC2 :101DA000582EC0B0E0890005580EC2F0C298583EC7 :101DB000C0F0584EC251C168E064FFFFEA1400FF52 :101DC0000839E08B00234018F3E81189C198E049F5 :101DD000FFFFE08B001B4018402AB968F1EA1108A8 :101DE000C0D8E04900FFE08B0011402A4018B968D4 :101DF000F1EA1108403AF1EA1088F1E91009580BAC :101E0000F7F91A00301CC028300C2FBDD832D70388 :101E1000D401202DFACBFFFCF01F0004F9BC00FF19 :101E2000FBFC10012FEDD80280011C74D431202D51 :101E3000300630110C9EC4A898557812E7D5B01022 :101E4000049430075008C0B8E92800000990202306 :101E5000E1E810805C835C702FE40007E203190066 :101E6000FE9BFFF40A944008E214FFFEE7D5C00190 :101E700008023000E0031900C0400584A964080787 :101E8000E9D7C010B187E80700070E94E0140000FE :101E9000C060E9D7C010B187E80700075C77EBD5D1 :101EA000C001EE0E000EEFDEC010B18EEE0E000E81 :101EB0005805C0B0EFDEC108EC061101A96E5C56F2 :101EC000FDDEC010EFEE100E780C580CCB615806FA :101ED000C080F9DEC108A96EFDDEC010F9EE100E5B :101EE00017B715BC17851796B166EDE5118617ABC8 :101EF0001585EDEB108B5C781596EFEB100B15AAA2 :101F0000EFDBC010B166B18BEDE511860E0BEDEA8B :101F1000108AF9EA100AF40C1610F5DAC010F60A65 :101F2000000A180AF4090009F2080008F00E000E71 :101F3000F1DEC010B18EF00E000EF9DEC010B18ED1 :101F40001C0C5CDC5C8C2FEDD832D4213008189945 :101F5000F5DBB010301EC0B8F32600001397202A1E :101F6000EFE610875C8A5C772FE90E08FC0A1900FF :101F7000FE9BFFF41699E219FFFE120CEDBB000068 :101F8000C0411989A9691208F3D8C010B188F208B4 :101F900000081099E0190000C060F3D8C010B188A3 :101FA000F20800085CD8F9D8B010D822D431300A31 :101FB000301414981495C488985B7816EFDBB01031 :101FC0000C9E3009C0B8FD2200001D932027E7E2D7 :101FD00010835C875C732FEE06090E93E8071900E7 :101FE000FE9BFFF3169EE21EFFFE1C06FDDBC001FA :101FF000EA0E1900C0400D8EA96E1C09FDD9C01053 :10200000B189FC090009129EE01E0000C060FDD9E4 :10201000C010B189FC0900095C79F7DBC001F20846 :102020000008F3D8C010B188F2080008580BC0B0FF :10203000F3D8C108F40A1101A9685C5AF1D8C0109C :10204000F3E81008780C580CCB81580AC080F3D8FC :10205000C108A968F1D8C010F3E810085CD8F9D815 :10206000B010D832D431201DFAC4FFD8169712937D :102070001092681518966801580AE0800091500A7D :10208000314BF01F0055400AC0A04D48E06C00FEE7 :10209000F109005C2FF9F159005CCC286C148C59C3 :1020A0003138F0091900E08B000F4CD8201D1AD8E8 :1020B000E068022C1AD84CB84CBC1AD8F01F004B60 :1020C0002FCDC0085C53E3E310815C71E961000926 :1020D000A981E9610008158B1598B168F1EB1188A9 :1020E00015ABF1EB108815BBF7E81008F00B1618CC :1020F000E9680013E96B0010F7D8C208F1D8C108ED :10210000E96B0011E9680012E81245005C72A892C0 :10211000E4031608A883ED380008A8A8ED380009E4 :102120004B39A8FCA8B8A8EC9208F7D8C010A8DBD7 :10213000A98BA8CB2FF8B2085807C0D00F8B0FB9C6 :102140000F98B168F1EB11880FABF1EB1088F3E851 :102150001008C051EAC8FFFCEBF81001F00916188E :10216000E968000FE969000CF3D8C208F1D8C1088A :10217000E969000DE968000E3008E968000BE968BC :10218000000A500A314B089CF01F001A5C7CE96C75 :10219000000BA98CE96C000A400AC038781A2F0A93 :1021A00048E8F10900482FF9F1590048158B1599B5 :1021B000B169F3EB118915AB6A18F3EB108915BB04 :1021C000F7E910091039C1910C9B0A9CF01F000A15 :1021D000C26800008000CDD4000080D48003B3909A :1021E0008003B3D880039D9C800094C40000734892 :1021F00080011F4A8000CAF8EB08002C5808C0B0C4 :102200008C49F0091900E08800070A9B0C9CF01F1C :102210000006C0580C9B0A9C6A585D185C5C2FFD38 :10222000D8320000800125A0D42149781896700783 :10223000C1680E9CF01F0015C1100D8B0D98B16880 :10224000F1EB11880DAB6E1AF1EB10886E290DBB06 :10225000F7E8100814581268C1306E075807CEA16D :1022600048B66C0C580CC040F01F0008C08148985C :10227000F10900562FF9F1590056C0286C070E9C41 :10228000D8220000000080CC8000CAE4000080D08A :10229000000080D4D421204D1897503B149C502A24 :1022A000501950084096F01F000D403B402A40193D :1022B0004008C0A148A8E06C00FCF10900562FF9C5 :1022C000F1590056C0881ADC0E9C1AD6F01F000582 :1022D0002FED5C5C2FCDD82280012228000080D415 :1022E00080012064D4314C05EB08004A2FF87817A0 :1022F000EB58004A0F980F831694F1E31083189659 :10230000E609160C3048F0091900C090F01F00379C :10231000EB08005C2FF8EB58005CC2980FB8E7D3CD :10232000C1040FA2A363F1E2108298585C82E60810 :102330001900C0539848E4081900C0B20C9CF01F63 :10234000002B4A98F10900522FF9F1590052C86840 :10235000069B0E9CF01F00265C8CC0F00C9CF01FAE :102360000023EB0800502FF8EB580050EB08004E0C :102370002FF8EB58004ECD48F7D2C0100C9CEEC0A1 :10238000FFF0F01F001C0895301249B10A9CF01FA5 :10239000001BC1D0EAC8FFFCC1A06A185808C17070 :1023A000EF3A0010EF390011B169F3EA1189EF3A01 :1023B0000012F3EA1089EF3A0013F5E91009103919 :1023C000C2A00A9B009CF01F000EC2515802E3F508 :1023D0001000EBF5000030020835EBF50000580561 :1023E000CD61C9F8000080D48000D13C80011F4A33 :1023F0008000D210000080CC8000CAE48001255803 :10240000EE03000307B807A9F1E910893448F00981 :102410001900C2A0EF39000CEF38000DB168F1E9E6 :102420001188EF39000EF1E91088EF39000FF3E859 :102430001008C1B0089BEECCFFF4F01F003DC0A116 :10244000EF38000CFC19E000B968E618F00012380B :10245000C0C10C9CF01F00374B78F109004E2FF9DA :10246000F159004EC5D808955805C0510C9CF01F75 :102470000031C5680FE90FF8F1E91088F1D8C00EF6 :10248000C0700C9CF01F002D1896C4A078174AC885 :1024900091044AC8089B91070C9CF01F002BC3B104 :1024A000EF3800095868C0B05918C0405818C11119 :1024B000C0B8089B0C9CF01F0025C2D8089B0C9C40 :1024C000F01F0023C288089B0C9CF01F0022C2381A :1024D000089BEECCFFF0F01F0016C0F1EF380010A3 :1024E000FC19E000B968E618F0001238C0608D17DA :1024F000302B0C9CF01F00180C9CF01F000E48E8BD :10250000F10900582FF9F1590058F109004E2FF93F :10251000F159004E48A93008930848A99308D83AC1 :10252000EF3800095918FE91FF77C6BB8001255886 :102530008000D13C000080D4800129BC0000822CA6 :10254000000082308000D588800115508000F37C27 :1025500080011910800118FC19B9198A1998B168FD :10256000F1EA118819AAF1EA1088F3E81008F0C915 :1025700000015BD9E08800035EFFF7390035EDB953 :102580000001C0E1761A1438C0B07629105A126AD8 :10259000C0715CD9F3E8000812385F0C5EFC5EFD88 :1025A000D431209D503B506A781B403AF519002CDD :1025B000F2C80013502B5078214917EA17F8F1EAB6 :1025C00010885C88109BF1D8C00DE21B2000984356 :1025D000505B2143308B5018F20B0C0A1897F3DA3A :1025E000B0105C8312985049A37830025C88314067 :1025F0005088C938401B405AF1DBC00D14485008C0 :10260000E3D3B010F1D3C01040791039E08900064F :10261000400B4081ADBB500B300A314B302CF01FCA :1026200000421894C3708E58313AF4081900E08BB8 :10263000000F4BE8201D1AD8E06802C31AD84BC817 :102640004BCC1AD8F01F003C2FCDC008314A402B8C :10265000781CF01F003A6E19F1D0C010F208000883 :102660006816EBD1B0108F188E58F0000100AE50F4 :10267000C2188E52EA021900EA0217205C82C19049 :10268000302A300B303CF01F0028C071089CF01F2E :10269000002CE06C00FFC4586E18B842B852189B6A :1026A00099180415089C5C85F01F00265805C02069 :1026B0006E075805CDF1ED65000B40085C78ACF86D :1026C000A988ACE8E2C8FFEC5C78ACB8A988314BCB :1026D000ACA8ED65000A0C9CF01F001B5C7CED6C47 :1026E000000BA98CED6C000A4039406A7258089BB7 :1026F000129C5D18495BF70800302FF8089CF758CA :102700000030F01F000F40180213404AE1D2B01011 :1027100014085C835C8850185803FE91FF6D069C7A :102720002F7DD8328000D3188003B4108003B45CAE :1027300080039D9C800094C48002E7368000D13CD9 :102740008000CD3480011F4A000080D4D40148F8B5 :1027500070091839C04178099109C128580BC0E1A6 :1027600048B8201D1AD8E06801341AD8489848ACF7 :102770001AD8F01F000A2FCDC00878089708189BB8 :10278000305CF01F0007D8020000734C8003B410C7 :102790008003B47C80039D9C800094C48000C97435 :1027A000D43118971696183BC0E14BC8201D1AD893 :1027B000E06800A41AD84BA84BAC1AD8F01F003A16 :1027C0002FCDC008580BC11076081838C0E04B3820 :1027D000201D1AD8E06800A61AD84B484B1C1AD8FE :1027E000F01F00312FCDC0086E156A1811CA11D91B :1027F000F3EA1089C0303004C1D8118A1199109CB5 :10280000B169F3EA118911AA11B8F3EA10891248E3 :10281000314A8F18EECBFFF8F01F0025301B0A9CC1 :10282000F01F00240A9CF01F002418940A9CF01F3B :1028300000236E15C1486A1811B9118A119311A8A5 :10284000B163E7EA1183E7E81083F3E31003F01FB5 :10285000001A18040A9C0695F01F00180A9C5805D7 :10286000CEB10C9B0E9CF01F001649689009F5D95B :10287000C010083AC0E44898201D1AD8E06800C784 :102880001AD84918487C1AD8F01F00072FCDC00865 :102890000819089CB009D8328003B4108003B4989A :1028A00080039D9C800094C48003B4A48002E7361A :1028B000800118E88000CD0C8000D13C8001274CBD :1028C000000073508003B4B8D431300618971692C4 :1028D0004AB30C94300566080A9B0A9CC3E8EF3A99 :1028E000000CEF39000DB169F3EA1189EF3A000EDF :1028F000F3EA1089EF3A000FF5E91009705A123A1D :10290000C1B1EF3A0010EF390011B169F3EA118952 :10291000EF3A0012F3EA1089EF3A0013F5E91009D3 :10292000706A123AC0910FCA0FD9F3EA1089906AFF :10293000F20A1900C0D02FF5580CC090F13A001FD0 :10294000F939001FF20A1800E08B0003109C70098F :102950005809F00B171012985808CC21580CC04099 :10296000F01F0008180658155F9804365F59F3E801 :102970000008E8081800CAF10C9CD8320000734C1B :10298000800127A0D42148C83007700CC108F9384D :10299000001F7806F0C900015808C050F969001FEF :1029A0001897C0480E9BF01F00050C9C580CCF01D7 :1029B000D82200000000734C800127A0D431201DD4 :1029C0004CD8F10900322FF9F159003278161895D8 :1029D0000D835C83F3D3C004A3695949C080F10916 :1029E00000442FF9F1590044E08F02570DF80DE132 :1029F000F1E110810DB80DA24C07F1E21082F01F39 :102A000000408E885C815C821894F808000858A801 :102A1000E08A000D189B0C9CF01F003AC5708E8850 :102A2000E808000858A8E08900524B783009700780 :102A30005009C3D8ED39000CED38000DB168F1E94B :102A40001188ED39000EF1E91088ED39000FF3E837 :102A500010086E591039C291ED390010ED3800118F :102A6000B168F1E91188ED390012F1E91088ED390A :102A70000013F3E810086E691039C1710DC90DD843 :102A8000F1E910888E69F0091900C0F149A8F1092F :102A900000462FF9F15900460DE90DF8F1E91088CB :102AA000F1D8C00DC360C3F850076E075807CC318A :102AB000E08F021E089B0C9CF01F0012083CC065B2 :102AC000305CF01F00121897C09148B8F109003C23 :102AD0002FF9F159003CE08F01E0320A300B0E9CD7 :102AE000F01F000B30394888EF69001F70098F090B :102AF0009107C138000080D4000073508000CD0CD5 :102B0000800128C80000734C8000C9D48002E8BC52 :102B10008EF8F1D8C00DC070314A0C9BEECCFFF896 :102B2000F01F004F4CF89009F20400045C84B004DC :102B30000DE8A598EDB80000C120EF38001EE3D1E4 :102B4000C00DE7D3C004A371E60310FCE20200024B :102B5000A1A80602EF68001EEF52001C6A1811BB04 :102B6000300A11AEF7EE108E118BB09AB0AAB0BA3F :102B7000B08A1499F5DBC00411FBF40A10FC11ECC7 :102B8000F7EC108CF9DCB00DA37CF7DCC010B0DBE7 :102B9000A98B180EB0CB140E10935C8E3016F5DE98 :102BA000C010B0FAA98AB0EA6E11029BC548761A25 :102BB00015C015D2E5E010825C82E40C1900C292C7 :102BC000F6021618B0BBB082E5DBC208F7DBC1081D :102BD000B092B0AB5809E080008213E213FBF7E239 :102BE000108BF60C1900E08300FF15DB15CAF7EA1D :102BF000108AF40E1900E08B00F7EA0A1618B2B535 :102C0000B28AF5D5C208EBD5C108B29AB2A5C6788A :102C1000E40C1900E08000E815E015FBF7E0108BEC :102C2000F60C1900E08300E05809C09013FB13E98B :102C3000F7E91089E4091900F9B601001582159B1E :102C40001499B16BF7E2118B15A215BAF7E2108B4C :102C5000F5EB100B580BCAC1C52900008002E736FE :102C60000000735013EB13FA11CCF5EB108A11DB53 :102C7000F7EC108BF60A1900E088000F4BC8201DF6 :102C80001AD8E068018E1AD84BA84BBC1AD8F01F8E :102C9000003B2FCDC008EA0B1618B28BF7D5C2083F :102CA000B2B5B29BEBD5C108B2A511CB11D9F3EBEC :102CB0001089F20A1900F9B60100C1185801C0E0E4 :102CC0004AB8201D1AD8E06801971AD84AC84AACF9 :102CD0001AD8F01F002A2FCDC0088F15EF39001E1B :102CE000EDB90000E08100E45806E08000E16E19D3 :102CF000721A15CB15D9F3EB1089E08100D9118B2D :102D000011951099B165EBEB118511AB11B8EBEB97 :102D10001085F1E51005C1A807F86A1907EB13CC77 :102D2000F1EB108B13D8F1EC1088F00B1900E08157 :102D300000BF13881395B165EBE8118513A81293B2 :102D4000EBE8108513B8F1E510055805CE61123A8D :102D5000C1A14878201D1AD8E06801B91AD848984E :102D6000485C1AD8F01F00052FCDC0088003B410AE :102D70008003B4D480039D9C800094C48003B4F489 :102D80008003B52C138A1398B168F1EA118813AA4D :102D9000F1EA108813BAF5E81008C0E04C68201D6D :102DA0001AD8E06801BB1AD84C484C5C1AD8F01FFE :102DB00000452FCDC00813F813E9F1E91088EF0999 :102DC000001C5C88F0091900C1704BB8201D1AD88E :102DD000E06801BD1AD84BC84B9C1AD8F01F0039C7 :102DE0002FCDC0080A9CF01F00394B9818143006EC :102DF000B0040A9CC5982EC8EF58001C6E187016B7 :102E00000D880D94B164E9E811840DA8E9E81084F7 :102E10000DB8314AF1E41004EECBFFF80C9CF01F22 :102E2000002DEF38001CACA8EF38001D0C9CED65A0 :102E3000000BACB8ACE5ACF5ED65000A314BF01F0A :102E400000265C7CED6C000BA98CED6C000A6E1604 :102E5000C1586815089C3ECBF01F0020089B0C9CB5 :102E6000F01F001F0B890BB80B94B164E9E91184C2 :102E70000BA9E9E91084F1E410045804CEB10E9CCA :102E8000400BF01F00180C9C49178E05F01F000F17 :102E90001815AE05C0D849480A9CF109003630061D :102EA0002FF9F1590036F01F0011C02830060C9C94 :102EB0002FFDD8328003B4108003B53C80039D9C65 :102EC000800094C48003B5608000CD0C0000735076 :102ED0008002E73680011F4A8000CDD48000CD34C7 :102EE0008001274C000080D48000D13C305CF01F72 :102EF00000061897FE91FDF3FE9FFDDE5809FE9136 :102F0000FEB3CDDA8000C9D4D4211898F937002E49 :102F1000761E306CF8071800C0E04948201D1AD80A :102F2000E06801B41AD84928492C1AD8F01F0012B9 :102F30002FCDC008306C201C5C5CF20C0706FC0C2A :102F40000007EF66000EF40C0706EF660014580C3D :102F5000CF313089FD6C001BFD69001A109C706830 :102F60005D185C5CD82200008003B5948003B5DC5A :102F700080039D9C800094C4D4211897580CC0E114 :102F800049D8201D1AD8E06800941AD849B849CC0D :102F90001AD8F01F001C2FCDC00878185808C0E1BF :102FA0004958201D1AD8E06800951AD84968494C3C :102FB0001AD8F01F00142FCDC0086E186E06109C92 :102FC0005808C0E148C8201D1AD8E06800991AD8EE :102FD00048E848BC1AD8F01F000B2FCDC008F01FDE :102FE000000C0E9B306C0C97F01F000A5806CE6147 :102FF000D82200008003B5948003B62080039D9CF6 :10300000800094C48003B62C8003B63C8000D13C81 :103010008000C974D431201D500B1897580CC0C0C3 :103020004D084D19118CF80815031818F2080028DE :1030300070495829C0D030AA30094CBE129C1C924D :10304000129B2ECE1298149314911490C1980F8A4B :103050000F99B169F3EA11890FAA7018F3EA108980 :103060000FBAF5E910091039CE714C08F109002E9C :103070002FF9F159002ECE480C990A9C089B30A6D6 :10308000EC031800C0A1FCF6FFFC5806C0611296C4 :10309000189516941093C498FCF6FFFC5816C2417C :1030A0005807C0F00F860F95B165EBE611850FA6A6 :1030B000EBE610850FB6EDE5100564160C35C26021 :1030C00064051D865805C080F2061800C2B3189525 :1030D0001694109AC2A80C94F6061800C2331296E1 :1030E00018951090C2285826C1D15807C1300F86B4 :1030F0000F95B165EBE611850FA6EBE610850FB6CF :10310000EDE5100564160C35C0514969109CB28874 :10311000C9781D85F8051800C053129616941091B1 :10312000C0481296189516942FF82E4E5C582E42D1 :1031300030A9F2081800CA11F2031800C061400655 :10314000EDB60000E081007B4005E2150002E08161 :1031500000763098F0031800E089000A5C53C498A8 :103160000000735200007354000080D430A8F001B6 :103170001800C180E7D1C0084B38E60915030619CD :10318000F00903285808C2304B08201D1AD8E068FF :1031900001761AD84AE84AFC1AD8F01F002F2FCD22 :1031A000C008F0001800C040E7D0C008C108E20A1B :1031B0001800C4404A48E7DAC008E60615030616B8 :1031C000F00600266C0CF01F00258D053098F003EA :1031D0001800E088000F49D8201D1AD8E068018C3B :1031E0001AD849F849BC1AD8F01F001B2FCDC008C7 :1031F0004959E6081503300A0618F2080028F0C9F4 :10320000FFF0930A5807C0D00F8B0FBA0F99B1691E :10321000F3EB11890FABF3EB1089F5E91009911964 :103220004899E60815030618F20800282F08300907 :10323000069CB0C948B8B083C038E06C00FF2FFDD1 :10324000D8320000000073548003B5948003B64C5C :1032500080039D9C800094C480012F788003B66415 :1032600000007352D431494730050E963EF42EC704 :10327000ECC3FED40F882FF85C58AE88EEF9FFFC43 :103280005829C061E8081800E08B0009C0F85819F7 :10329000C0D1F2081800E088000A6C0C580CC0403D :1032A000F01F00068D05EF45FFFC2E472E46063722 :1032B000CE21D8320000735480012F78D431306889 :1032C0001293189616951497F939002EF0091800E4 :1032D000C0E04B78201D1AD8E06801DA1AD84B58A4 :1032E0004B5C1AD8F01F00352FCDC008580BC5C055 :1032F00017891798B168F1E9118817A9F1E91088C1 :1033000017B9F3E81008C500189B0A9CF01F002CA1 :103310001894C4A10B88FC19E000B968E618F00005 :103320001238C420069B0A9CF01F00265C5CE80C47 :103330001800C3C55C6C4A49F8081503302AF00C24 :10334000010CF20C00289166F0C9FFF0930A0FDA25 :10335000F16A000D0FCAF16A000C0FBAF16A000B96 :103360000FAAF16A000A0F9A1095F16A0009ECC3DE :10337000FFD10F8AB2C4F16A0008C0F87009701456 :103380008B09F01F00120E99069A089B0C9CF01FE7 :103390000010089CF01F000F6A08306C109B580842 :1033A000CEE1109CD832E06C00F6D8328003B594A0 :1033B0008003B67880039D9C800094C480012558CA :1033C00080013014000073548000C97480012F08FC :1033D0008000D13CD421189E580CC0E14958201DD2 :1033E0001AD8E068024A1AD84938494C1AD8F01F4E :1033F00000142FCDC008761AF4C8FFE4F137000F8F :10340000F136000CF139000DF138000E782BB1695E :10341000F3E61189F3E810897818EFE910091059DB :103420001669C061F4CBFFD82ECAF01F0006D8225F :103430008003B5948003A13880039D9C800094C4D0 :10344000800132BCD431202D189616911495580C59 :10345000C0E14CA8201D1AD8E068027F1AD84C8819 :103460004C8C1AD8F01F00482FCDC00894593378DF :10347000F0091900E08B000A4C48149CF109002265 :103480002FF9F1590022C3087414E8C7FFE40F981C :103490000F89F1E910893018F0091900C1E10FD83E :1034A0000FC9F1E91089E0680604F0091900C1515B :1034B0000FB80FA9F1E91089E0680800F0091900B8 :1034C000C0C1E938001BE939001AF1E91089E06848 :1034D0000806F0091900C0E04AC80A9CF109002852 :1034E0002FF9F1590028F109001E2FF9F159001E9A :1034F000CA184A68F109001A2FF9E8C3FFD6F15932 :10350000001AFAC2FFFC304A069B049CF01F002000 :10351000EF380018EF390019B169F3E81189EF3875 :10352000001AF3E81089EF38001BF1E910096C1854 :103530005808C0C01039C0A1049B3019E8CAFFDC8C :103540000C9CF01F00143018C0A83009EECAFFF818 :10355000FACBFFFC0C9CF01F000F30080FEA0FF9AC :10356000F3EA1089301AF4091900C1503028F00923 :103570001900C591C52800008003B5948003A138C7 :1035800080039D9C800094C4000080D48002E736B4 :10359000800132BC5808C4D03008AEE83028304A28 :1035A000AEF8EECBFFF2EECCFFE8F01F0025304A7C :1035B000069CEC0A000BF01F0022ED39002E30684B :1035C000F0091800C0E049F8201D1AD8E06802D9B7 :1035D0001AD849D849DC1AD8F01F001D2FCDC008D1 :1035E000306820185C58EE080009F33B0008F36BC4 :1035F0000012E808000AF56B000EE208070BF36BF7 :103600000008E2080709F56900145808CEB10C9CBF :103610006C680A9B5D18C0D80C9CFACBFFFCF01FAD :10362000000DC07848C8F109002C2FF9F159002C81 :103630000A9CF01F000A2FEDD83200008002E73606 :103640008003B5948003B5DC80039D9C800094C406 :103650008000B3B4000080D48000D13CD42178191C :10366000F338001BF339001A1697F1E91088189601 :10367000E0690800F2081900C070E0690806F20865 :103680001900C231C1C8189B0E9CF01F00173E4B99 :103690000C9CF01F0016C0E04958201D1AD8E068A5 :1036A00004A41AD84938494C1AD8F01F00142FCD59 :1036B000C0080E9B0C9CF01F0012C148189A169C63 :1036C0002D1BF01F0010C0E848F8F10900282FF961 :1036D000F1590028F109001E2FF9F159001EF01FC1 :1036E000000BD82A800133D48000CDD48003B59458 :1036F0008003B36C80039D9C800094C4800122E40D :1037000080013444000080D48000D13CD431300AA0 :1037100018941691303C338BF01F0042E8C8FFD15B :103720001895580CC0A14C08E06700FFF10900246F :103730002FF9F1590024C738985A3379F20A190041 :10374000E08B000F4B98201D1AD8E06804311AD87E :103750004B784B8C1AD8F01F00382FCDC008300999 :103760007813E6C7FFE4AEE93019AEF93069E93AFB :10377000002EF20A1800C0E04AC8201D1AD8E068DE :1037800004391AD84AD84ABC1AD8F01F002B2FCDBA :10379000C00830664AAB4ABA20165C56F006070CE1 :1037A000EE060009F36C0008F606070CF36C001235 :1037B000F406070CE6060009F36C000EF006070C91 :1037C000F36C00145806CE913042EECCFFF2E802C2 :1037D000000B049AF01F001C049A029BEECCFFE839 :1037E000F01F00193069AED2AEC9AEB6AE863088D1 :1037F000301AAEA8AE9AE769001BE768001A089C69 :1038000068680A9B5D184888F10900182FF9EFDCF9 :10381000C008F15900180A9CF01F000C0E9CD83209 :103820008000D318000080D48003B5948003B6A034 :1038300080039D9C800094C48003B5DC8003B71690 :103840008003B58D8002E7368000D13CD4211694E8 :103850001896189B1497089CF01F00541895E08147 :1038600000DF09890998B168F1E9118809A9F1E92E :10387000108809B9FC1AE000F3E810081099E6195D :10388000F0001439E08000CC5808E08000C9301BFB :10389000089CF01F00475C5CEA0C1800C0545807F5 :1038A000E08100CBCC184C39EBDCB008EA081503FA :1038B0000A18F20800282F0870095809F9B9000100 :1038C000F1F90A004BB9EA0815030A18F2080028B2 :1038D0007048F0C900015819E088000F4B68201D9E :1038E0001AD8E06803A51AD84B484B5C1AD8F01FC9 :1038F00000352FCDC00858185F0858075F09F3E856 :103900001008C041E06400FFC078089B0C9CF01FC9 :10391000002EE9DCC0085807E08000854A5AEA0911 :1039200015030A19A369F409000870485828C0B1A2 :103930002F890E9BF40900090C9CECCAFFD1F01FE3 :103940000023C6B85818C6E110990E98905B904AAB :10395000F40B1900C111700A580AC0E04968201D13 :103960001AD8E06803C41AD84998495C1AD8F01FDD :1039700000152FCDC008F13A000CF20A1800C05112 :1039800070085808CE41C51890CB300A303CF01F63 :1039900000111896C4F00E9BF01F000F5C5CC1F084 :1039A0000C9CF01F000EC468800125588001301463 :1039B000000073548003B5948003B6D480039D9CAB :1039C000800094C48001370C80012F088003B6FC6E :1039D0008000D3188000CF988000D13C306CF01F5D :1039E000001AC170300899169908EA081503F00505 :1039F00001054968F00500256A045804C07008985C :103A000068045804CFD1910CC0288B0C089CD82294 :103A10000C9CF01F000F089C5C5CD822E06C00F648 :103A2000D822089C5C5CD8220E960E9CF01F0009E0 :103A3000CD6B089C5C5C4888F10900242FF9F15992 :103A40000024D8228000C9D4000073548000D13CE7 :103A50008000CD1E000080D4D421202D169618970A :103A6000149531CB0C9CF01F0027C0804A68E06C95 :103A700000FE90592FF9B059C4180E9B0A9CF01FF4 :103A80000023C3410B890B98B168F1E911880BA998 :103A9000F1E910880BB9FC1AE000F3E8100810995E :103AA000E619F0001439C0F13019BAA935E9BAC9DC :103AB000F3D8C207BAF8BAD9A988BABCBAE8FAC921 :103AC000FFFEC1586E1912586E291268C0906E38E8 :103AD0005808C041E06C00FCC118EEC5FFF40C9A18 :103AE0000A9B0E9CF01F000AC08848A90C9B0E9CE4 :103AF000EECAFFD1F01F00085C5C2FEDD822000059 :103B00008000CDD4000080D4800125588001384C3D :103B10008003B58D80012F0878983019B0895EFC3C :103B2000D4217897EF380024EF390025F0091800E8 :103B3000C021D82AEE080028201D701630086C1904 :103B40008CCA8CDB20EA1AD620EBF2CCFFF2F01FF5 :103B500000182FED587CC0F0581CC0310C95C138AE :103B6000EF3800242FF8F1D8C0030C9CEF68002434 :103B7000F01F0010E06C00F4D8228ADB6A1CF01FF2 :103B8000000E6A055805CFA1EF3800242FF8F1D8B0 :103B9000C0030C9CEF680024F01F00064878E06C1E :103BA00000F290092FF9B009D82200008001933467 :103BB0008000D13C80013F7C000080D4D421204D86 :103BC0001896F01F002D5806C5306C955805C50095 :103BD0000B885808C4D0E0680600300ABA68E06B69 :103BE0000600303CF01F00251897C3F03008FACBD0 :103BF000FFF4AA88781CF01F00229A6B580BC35060 :103C00005C7BFAC8FFF2FAC9FFFCFACAFFF86E1C27 :103C1000F01F001C586CC2606E18402B101B40181F :103C20005C5B0E9C100B5C7BF01F001749789019B1 :103C30002FF9B0196E19F338001BF339001AF1E9A6 :103C40001088E0690800F2081900C060E069080601 :103C5000F2081900C0716C480C9B0E9C5D185C5CEE :103C6000C0400E9CF01F000A0C9CF01F000A2FCDD4 :103C7000D822000080013FA08000D31880013F5867 :103C8000800192DC8000D210000080D48000D13C02 :103C900080013B20D4211897580CC0E149B8201D61 :103CA0001AD8E06801491AD8499849AC1AD8F01FC7 :103CB000001A2FCDC008499899983778F9680036CE :103CC00036C8F9680037496899584968189B996857 :103CD000495CF01F0016496CF01F00163628EF688B :103CE00000353068EECCFFD1EF68002EF01F0012D7 :103CF000581CC040E06C00F4D822E06805DC300CB1 :103D0000EF58002CD82200008003B71C8003A13894 :103D100080039D9C800094C40000746C80013A581C :103D200080013D5880013B1880013E6880013D388C :103D300080018F4480019128D40116985C7A189BE9 :103D40002F29109C5C79F01F00045C7CF9BC00FFFB :103D5000D80200008000CEC4D42131B918977898D9 :103D6000965AF20A1900E08B0005E06C00F4D822A4 :103D7000F1390025F13C0024F2CAFFFFF5DAC00357 :103D8000183AC041E06C00F2D822F16A0025F0092F :103D90000028169C911B3F26F01F00050E9CF01F6B :103DA0000005EC0C1800CFB0D82A00008000CD1E12 :103DB00080013B20D42130061897E9DBC01030A5E4 :103DC000C138EE060708201D48BC1AD8F01F000BAA :103DD0002FED5806C080EC050C085809C041488CEE :103DE000F01F00062FF60836CED5486CF01F0003F2 :103DF000D822000080037AF0800094C48003B76862 :103E0000800384D448CD48D0E3B00001D55348C0E6 :103E100048C10230C06248C2A505A1240230CFD3F8 :103E200048A048B10230C06230023003A122023003 :103E3000CFE3488F000100008003760000000008F7 :103E4000000009B88003F480000009B800008CC8A5 :103E500080008EDCD4013018F96800087808580812 :103E6000C030781C5D18D802D4014869930C931BAC :103E7000F33800085808C040129CF01F0003DA0A0B :103E80000000749880013E54D421201D1895169688 :103E90001494300B30CA49DCF01F001D300B49DC94 :103EA000F01F001D300B49DCF01F001D497B49DC71 :103EB000F01F001D1897581CC0400E9C2FFDD822E3 :103EC000F01F001A1897581CCF910C9B0A9C49862A :103ED0008D07F01F00181897581CC04030088D0837 :103EE000CEDB30088D08F01F00141897581CCE61E7 :103EF000FACBFFFD302CF01F0011F9B701FFFBF8E2 :103F00000803E9F80A00CDAB00007498800091D056 :103F100080013F8C80018F3080013F3C80019F6099 :103F200080013E54800144588001440C0000749488 :103F300080018F488001443080014110D401169CDB :103F4000580BC041F01F0004D802300B301CF01F8A :103F50000002D80280014110D4014879F3380008EA :103F60005808C021DC0A3008F3680008F01F00037D :103F7000DA0A00000000749880014284D4015C7B5E :103F8000F01F0002DA0A00008001433CD401169CB5 :103F9000F7DAC010F01F0002D80200008001433C95 :103FA000EBCD40C0203DF01F00164969F3380008F2 :103FB0005808C04072085808C0402FDDE3CD80C0CB :103FC000E0680100FAC6FFF4E06C01000CE8F01FA5 :103FD000000E0C9B1897F01F000D9A5B580BC0A0A9 :103FE0005C7BFAC8FFF81A99FACAFFFC0E9CF01F16 :103FF00000080E9CF01F0007CE1B0000800140A4AB :10400000000074988000920080013F58800192DC8B :10401000800091E8D40148583019701CF1690009FA :10402000700A5D1AD8020000000074A8EBCD40CCE5 :10403000206D49A6FAC7FFF46C2E8F2EECE200002B :10404000EEE3000016961093FACEFFF0580CC22053 :104050007C08FC1C8000F1EC100BF4081509BBB8BF :10406000F1E611C812481648301C9D08F01F000CDC :104070000E9C30CA1A9BF01F000BFB38000AA68862 :10408000FB39000B300CA699F01F00052FADE3CDD6 :1040900080CC7C0BCE3B00008003B774800075B4ED :1040A00080007534EBCD4080201D4987EF38000833 :1040B000EDB80000C071EF3900093008F0091800B0 :1040C000C0402FFDE3CD808030091A98129B129CCE :1040D000305AF01F000F3FF91B88F2081800CF205C :1040E0001B98EDB80001CEE13008301C109B302940 :1040F000E06A00F0F01F000630186E1CEF6800093F :104100006E095D19CDFB0000000074A88001402CF1 :10411000EBCD40C0201D301AF40C1800C1B0C08394 :104120003028F00C1800C2602FFDE3CFC0C01A97F2 :10413000300630091A98E06A00F1129B301CF01F1B :1041400000161B98EC081800CF51300C2FFDE3CD62 :1041500080C018961A9730191A98E06A00F1300B4F :10416000129CF01F000D1B98EC081800CF51300C6A :10417000CEEB48A8F1390008F9D9C001F7FA1E00C2 :10418000F9BC0100F9B8005AF7F80E002FFDE3CD95 :1041900080C000008001402C000074A8EBCD406876 :1041A00048F516961893AA4B301CF01F000E0A9C77 :1041B000310A300BF01F000C069BF5D6C010300CF6 :1041C000F01F0009304A300B488CF01F0007300CFC :1041D000F01F00040C9CE3CD80680000000002107A :1041E000800075B4800075348003B780EBCD40400B :1041F00020ED30083009FAE90018FAE90000FAE980 :104200000008FAE9001049BBFAC6FFD4762A8D2AC5 :10421000F6E80000301CECE90000F01F0017320A3D :10422000300B1A9CF01F00150C9C30CAFACBFFE033 :10423000F01F0012300CF01F00103019FB38002A5C :10424000F2081800C0503FFC2F2DE3CD804048C835 :10425000F1390008F9D9C001CF8030083039304A2F :10426000109B301CF01F00072F2DE3CF8040000073 :104270008003B784800075B480007534000074A892 :104280008001402CD42130094A881695F169000933 :104290001896320BF01F00268C085CC82FE8F7D860 :1042A000B010AA0BEFDCB010F6C90007E06805F902 :1042B000F0091900E08B00300D890D98F208180004 :1042C000C220F6071900C182E0640200F9D7C010CD :1042D0005C7B181BEC0C000CE04B0200E80B17B0E9 :1042E0005C7BF01F00138A0B0E0CEFDCB010EE0BA2 :1042F0001900FE9BFFED48F83009118AF20A1800F8 :10430000C0D1D8220DA8F2081800CDC10DB8F2080E :104310001800CD813008AA08D822F5DBC010486CFF :104320000C9BF01F0006D822000074A88001419C5D :10433000000074A48003B76C8001447CD4314A38F7 :1043400018921695118A3009F20A1800C3615805AF :10435000C33049F83004F0C0FFF4E0610200C22825 :10436000E06602000C970C93301CA006F01F0019A9 :10437000300B497C314AF01F0018E404000C0E9AFF :10438000300BF01F0015304A300B494CF01F001263 :10439000300CF01F0010EA0601080604EBD8B0103C :1043A000C0B0E2051900FE9BFFDDEDD5B010EFD6E1 :1043B000C0100E93CDABD832F5DBC010189B488CE3 :1043C000F01F0008CC5B0000000074A4000001FC9A :1043D000800075B4800075348003B7808003B770A7 :1043E0008001447CD401201D3009301C1A98E06AF9 :1043F00000F5129BF01F0004314CF01F00042FFD4C :10440000D80200008001402C800075D2D401F01F3A :104410000007F01F0007C03030CCD802F01F0003A7 :10442000F01F0003CFA1DA0A800143E4800141ECD0 :10443000D401314CF01F0006F01F0006C03030CC14 :10444000D802301CF01F0004DA0A0000800075D288 :10445000800141EC80007618D4014878910C911BC2 :10446000F0CCFFF8F01F0005F9BC010CF9BC00010D :10447000D8020000000074A8800076385EFCD703E4 :10448000EBCD40F849C56A096A181039C2F08B0CA7 :10449000EAC7FFF0EAC6FFF4EEC30010EAC4FF70FB :1044A0000F89EDB90000C091EDB90001C0616C0940 :1044B0006A081039E08800082F072F060837CF1147 :1044C000E3CD80F86E19300B169C5D190F883FDA2A :1044D000F1EA0009EDB80002C0716609EEF8FFF8D4 :1044E00012088D08CEABAE89CE8B5809CD118B1C2E :1044F0008B0CCCFB000074B8EBCD408048CE1897F5 :10450000300AFCCBFFF0F408150417892F88FC084B :10451000000CEDB90000C0512FFA2F0B588ACF4183 :104520003018F96800088F0AE3CF9080000074B853 :104530002FFC4849A56C18091388A1D8B2885EFCE5 :10454000000074B82FFC4848A56C30091808B089E1 :104550005EFC0000000074B8EBCD40E0189E14979C :104560001295587BE08B002C496AF6C8FFFFA568BE :10457000F408000C1989EDB90001C1F0F608150422 :104580001296F4080008A1B6F60915012FF9F409EE :10459000093E740AB8869157FC0A000A913A5805F8 :1045A000F9BC0001F9B90104EDD9E138F9F81E00B0 :1045B000F9BC0101E3CD80E0E3CF80E0E3CFC0E0D0 :1045C000000074B848387019700C121C5EFC0000B2 :1045D000000074B85EFC300899085EFC1899780CED :1045E000580CF9B80001F3F80A005EFC300899088D :1045F0005EFC300899085EFC5EFC5EFC5EFC5EFCC6 :10460000D401580BC110F80B000B300A487E7C090E :10461000F40900092FDAF208141FB98810091019DB :1046200018C9163CCF51D802000074B85EFD5EFF79 :104630005EFF5EFF5EFF3FDC5EFC78082FF89908A6 :104640005EFCD401780820189908C020D80A5D1BA8 :10465000DA0A301899085EFCD401F01F0002D80273 :1046600080016D6CEBCD406048784889F5DBC01067 :104670001895189B7006720C5D160A9CF01F0004BA :10468000E3CF906000007540000074B4800091E8B2 :10469000D401E06A0088300B485CF01F0006F01F70 :1046A00000064868300C9118910CD802000074B8CC :1046B000800091D0800146C000008B545EFCD7037F :1046C000D401F01F0011F01F0011301B4909169C86 :1046D000490AF01F00114919491A301B303CF01FDC :1046E000000EF01F0010300A301BE06C00F0F01FCD :1046F000000EF01F000E300A302C149BF01F000C2F :10470000D80A0000800148C0800147888003B79024 :10471000800146BC800148548003B794800157A4AF :104720008001499C800147E0800149F480014730C5 :104730004828F00C092B5EFC00007548EBCD40E0EA :104740004905189716966A085808C0205D1848E869 :10475000F007032C580CC061C088F0061800C09008 :104760002F8C19885808CFA16A085808C080C00843 :1047700078193028F0091800FE9BFFF8E3CD80E09F :1047800000007544000075485EFCD703EBCD40FC8B :104790004935189630120A94EAC3FFF46A0858089B :1047A000C0D068385808C19030185806CF805816C5 :1047B000C0305808CF40E3CD80FC48976E28701970 :1047C000703C700B5D196E2870296E188F29103996 :1047D000EFF20A003008CEAB0697CF1B000084B47E :1047E000EBCD40C018961497580BC24049789009F9 :1047F000F6091900E088001BF60B00184949F20879 :10480000002C781A74085808C171741E7428103E60 :10481000C1507C283009951895099D369D07FD6B80 :10482000001078089D18E3CD80C0307B305CF01F0D :104830000009E3CD80C0741ECEDB306B305CF01F0E :104840000005E3CD80C00000000002200000755C80 :104850008001473CEBCD408049281497129E581B9D :104860005F8A9009F80919005FB81468C130F80C24 :10487000001AF60B0019F4CCFFFF48BB48B8F60A43 :10488000002AF0090029952EF60C09299507E3CD99 :104890008080302B305CF01F0006E3CD808000006C :1048A000000002200000755C000084B48001473CD9 :1048B000D401307B305CF01F0002D8028001473CFD :1048C000EBCD404030084AB9B2884ABA940858083B :1048D000C4D04AA95C784AABF00800184A9EA36885 :1048E000300C2F88F6CAFFF4F20800082F89930CC9 :1048F000F34AFFFCF34EFFF82F491039CF91F6CE63 :10490000FFE84A1A49EB301C970C972A971A14981B :10491000F4C9FED42EC8F148FFF41238CFC1F54ACD :1049200001342F4BF4CAFEC01C3BCEF1E06A00807C :10493000300B496CF01F00164948F0C9FF902F0852 :10494000F148FFFC491A1238CFB130064918F54634 :10495000007C910A9116310A0C9B48FCF01F000C58 :1049600048E80C9C9106E3CD8040485BCC9B00005E :1049700000007598000002200000755C000084B4FF :10498000800148B0000082340000759C800091D006 :1049900000007630000076200000761C4848485918 :1049A000485A91099119913A912A5EFC000002241B :1049B000800149D4800149EC48484859485A911926 :1049C0009109913A912A5EFC00000224800149D4A9 :1049D000800149EC48494858311AEA1A4000143C11 :1049E0005E085E19800149D480014A0C481C5EFCB7 :1049F000800149ECD4013019300A303BFC1C4000E6 :104A0000F01F0002D8020000800186C8EBCD408074 :104A10004B373099EA194000123CC310E088001F60 :104A200030B9EA194000123CC2A0C4233139EA1956 :104A30004000123CC500E069078AEA198000123C78 :104A4000C241761CF01F0027300A4A77149B314C74 :104A5000F01F00260E9CE3CD80803019EA1940003B :104A6000123CC320E08800153079EA194000123C5E :104A7000C0603089EA194000123CC0713019300A18 :104A8000303BF01F001B49B70E9CE3CD8080FC1922 :104A90004000123CCFA130194978300AF149004456 :104AA000304C149BF01F00110E9CE3CD8080301918 :104AB000300A303B30ACEA1C4000F01F000D48D7F4 :104AC0000E9CE3CD8080302B300CF01F000C0E9C30 :104AD000E3CD808048470E9CE3CD808080014A0C66 :104AE0008001DA2C800149D480014658800186C8B3 :104AF000800152F0000087F480018390D401201DD2 :104B00001A9CF01F0008C07040085818E088000682 :104B1000F01F00052FFDD802F01F00042FFDD80262 :104B200080015F4480015EDC80015EB4EBCD40F823 :104B3000201DFEF805EA189716951496103AC3A0A2 :104B4000FEF805E0103AC610FEF805DC103AC06029 :104B50000C970E9C2FFDE3CD80F8E068018CEA18DD :104B60008000103CE08000F7E068078AEA188000C7 :104B7000103CE08000ADE0680186EA188000103C3F :104B8000CE8176170E9CF01F0169F01F0169C0915C :104B9000FEF805A0EEEA0000F0EB00006E29912976 :104BA0000C97FEFA0592300BFEFC0590F01F016495 :104BB000CD1BF01F015F1894C4D1E0680184EA188E :104BC00080001037E0800185E08B00D2E0680107AB :104BD000EA1880001037E08001A0E0680183EA183D :104BE00080001037CB616A170E9CF01F0156E080E1 :104BF0000230FEF905523048F34800440E9B334C16 :104C00000C97F01F0152CA6BFEF4053CE0680112DC :104C1000EA188000E8F300F8103CC540E08B006320 :104C2000E0680107EA188000103CE08000F7E068C7 :104C3000010DEA188000103CE080010DE0680105DC :104C4000EA188000103CC851761C1497F01F0140F0 :104C5000C81BFEF304F2E0680188EA188000E6F45D :104C600000F81037E08001B0E08B00ABE068018312 :104C7000EA1880001037E080018BE0680184EA18B0 :104C800080001037E080016EE0680107EA188000BC :104C90001037FE91FF5F6A18303CF13B000BF01FAC :104CA000012D3019300A303B30CCEA1C4000F01F97 :104CB000012A300AFEF70470149B301CF01F0127F4 :104CC000C49B761C1497F01F0126C44B6A1CF01F6E :104CD0000125300AFEF70490149B314CF01F011F90 :104CE000C39BE068018AEA188000103CE08000CB9A :104CF000E068078AEA188000103CCE90E068011551 :104D0000EA188000103CFE91FF2576150A9CF01FE2 :104D100001170BC93048F0091800E08001BBE08B97 :104D2000019B3008F0091800E08001BF6738301996 :104D300011EAF20A1800E08001DD0A9CF01F010C64 :104D4000FE90FF08300A0C97305C149BF01F0103A3 :104D5000C01B76170E9CF01F0107F01F00F5C4F171 :104D60000E9B33DC0C97F01F00F9CF4AE068018AF4 :104D7000EA1880001037E08000BDE068078AEA1872 :104D800080001037E0800099E0680188EA18800010 :104D90001037FE91FEDF6A170E9CF01F00F7C0A0CF :104DA000F01F00F63069FEF8039EFEF60376F14927 :104DB00000440E9B336C0C97F01F00E4CCBAE06803 :104DC000018EEA1880001037E08000B7E068078A9B :104DD000EA1880001037FE90FF7BE068018AEA182D :104DE00080001037FE91FEB66A160C9CF01F00E49E :104DF0001897E0800114FEF7032ACACA3099FEF81A :104E000003460C97F1490044FEFA032C300BFEFCDC :104E10000372F01F00CBC9EA76150A9CF01F00DA76 :104E2000302B169CF01F00D9FEF702FCF01F00C0CB :104E30001896E08100DD0A9B337CF01F00C40C9AB9 :104E40003019303B30ECEA1C4000F01F00C3FE9FDD :104E5000FE8276160C9CF01F00CE302B304CFEF7F5 :104E600002C6F01F00CAF01F00B2E08000EC30194B :104E7000300A303B310CEA1C4000F01F00B7FE9FA7 :104E8000FE6A76150A9CF01F00BE1897E08000BAF3 :104E9000300A302C149BF01F00B13078E9480044F0 :104EA000F01F00A3FE91FE560A9B0C9733BCF01F27 :104EB00000A7FE9FFE506A1CF01F00AA089AFEF78A :104EC00002A6089B314CF01F00A5FE9FFE446A1706 :104ED0000E9CF01F00B0C060FEF9026C3058F34821 :104EE00000440E9B335C0C97F01F0098FE9FFE332E :104EF0006A170E9CF01F00A2C0803069FEF80248BD :104F0000FEF60220F14900440E9B33BC0C97F01FC3 :104F1000008FFE9FFE206A1B337CF01F008C089AD6 :104F2000FEF702043019303B30ECEA1C4000F01F61 :104F3000008AFE9FFE106938301911EAF20A180043 :104F4000FE90FE086A1CF01F0094FE91FE03189A62 :104F5000189BFEF70246301CF01F0080FE9FFDFBF1 :104F60006A150A9CF01F008B1897E08000874F2A73 :104F7000300BFEFC022AF01F00721897E08000AE92 :104F800030580C97E7480044FE9FFDE56A150A9CDF :104F9000F01F006C1897E08000956938301911EA0D :104FA000F20A1800FE91FDD64E3A300B4FDCF01F8E :104FB00000641897E08000A930480C97E748004447 :104FC000FE9FFDC96A160C9CF01F006B1897C2600B :104FD000F01F006A30684D37E7480044FE9FFDBB74 :104FE000EACBFFFC301A30DCF01F005C3019300ACD :104FF000303B30CCEA1C4000F01F0057FE9FFDAB59 :10500000F01F004BFE90FF4E0E9A3019303B30CC13 :10501000EA1C4000F01F0050C44B303B30CCEA1C6F :10502000400030190E9AF01F004C0DEB304CF01F71 :1050300000490E9A0E9B301C4BB7F01F0048FE9F94 :10504000FD8A0C9B33ACF01F0041FE9FFD844D3662 :10505000FE9FFDD63068F0091800FE98FE693828DA :10506000F0091800FE91FD76300A0C97325C149B13 :10507000F01F003AFE9FFD6F189A303B30CCEA1CBF :1050800040003019F01F0034EB3B000D303CCD0BDD :105090003008FACBFFFC0C9716F8301A30ECF01FF2 :1050A000002FFE9FFD580A9CF01F003FFE90FD520E :1050B000300A0C97306C149BF01F0028FE9FFD4BAC :1050C0000BCB302CF01F00230E9A0E9B301C4B375D :1050D000F01F0022FE9FFD3F189A303B30CCEA1CA7 :1050E00040003019F01F001CEB3B000D301CCA0BB8 :1050F00048D7F01F000FFE91FF750A9B338CF01FFD :105100000013FE9FFD28189A303B30CCEA1C40006B :105110003019F01F00110BCB301CC8AB800152F0CE :10512000800151A8800156388001D9AC800185E406 :105130000000763880018E9C8001E03C8001EF20E9 :105140008001E88C000087F480016D6C8001E2D45E :1051500080018390800186C8800146588001E00864 :105160008001DA2C800149D48001E2FC80016D4A83 :105170008001D9C88001E4D080014AFC8001E4307C :105180008001E0D48001D9FC800183A08001D9E8AE :105190008001E81C8001E3DC80014A0C8001E7B853 :1051A0008001E58880016D48EBCD40C04C96189792 :1051B0003138EA184000103CE0800087E088002485 :1051C000E068010DEA188000103CC150E088004002 :1051D000E0680115EA188000103CC0D0E068018A40 :1051E000EA188000103CC070E0680112EA188000E4 :1051F000103CC3910E9C4B7AF01F003718960C9C04 :10520000E3CD80C03018EA184000103CC510E0889B :10521000002E30D8EA184000103CC1003108EA18CE :105220004000103CC3F030C8EA184000103CC1B147 :10523000301C302BF01F00290E9C3019300A303BF7 :10524000F01F00274A760C9CE3CD80C0E068010582 :10525000EA188000103CCCF0E0680107EA188000F2 :10526000103CCC900C9CE3CD80C0E04C008ACC304C :10527000FC184000103CCF71307949B8300AF14930 :105280000044149B302CF01F0019300A30FC149B92 :10529000F01F0016302B300CF01F00100C9CE3CDDB :1052A00080C0303C302BF01F000D0E9CCC7B48E9B9 :1052B0007298ABC8300A9398149B303CF01F000BD7 :1052C0000C9CE3CD80C048A60C9CE3CD80C00000C0 :1052D000800151A880014B2C800183A0800186C8E9 :1052E00080015638000087F480014658800149D477 :1052F000D421FACD00E4FEF602E21898FEF502E0B1 :10530000ECF700F83109EA194000123CE08000D5C2 :10531000E08B003630A9EA194000123CE08000C260 :10532000E088005330C9EA194000123CE08000A830 :10533000C6A330D9EA194000123CE080011930F9C7 :10534000EA194000123CC3D1FEFA0298300BFEFC71 :105350000296F01F00A61896C341189BFEFA02841D :10536000FEFC028CF01F00A1304C301BF01F00A18E :105370000C9A0C9B301CF01F00A0C238E06901841D :10538000EA198000123CE0880011E0690188EA19FE :105390008000123CC100E08B00A5E0690186EA199B :1053A0008000123CC0E1C078E0690183EA19800006 :1053B000123CC363109CFEFA0226F01F0090189561 :1053C0000A9C2C7DD8223079EA194000123CC7C0D3 :1053D000E08800973089EA194000123CE08000CF55 :1053E0003099EA194000123CCEC14FEA300BFEFC66 :1053F000020EF01F007E1894E08000CF3048ED4888 :105400000044CDFB4F7A300B4FECF01F0078CD916C :10541000189A189B4FC5301CF01F0077CD2BE06900 :105420000107EA198000123CCC60E0690115EA1915 :105430008000123CC1203139EA194000123CCC11E5 :10544000300A301C149BF01F006C300A304C149B47 :105450004EE5F01F0069CB5B6F38301911EAF20A94 :105460001800C72076160C9CF01F00690C9CF01FDA :1054700000694E98580CF0051710CA3B303B3019A4 :10548000300AF01F0066302B303CF01F005A300A03 :10549000301C149BF01F00584E150A9C2C7DD822FE :1054A0004D0A300B4DFCF01F00511897C3B0305817 :1054B000ED480044C86B303B3019300AF01F0057EC :1054C000302B304CCE3B6C9BE21B0040C2414C5A0F :1054D0004D5CF01F0046C9D03028ED480044C71B82 :1054E000E069018AEA198000123CFE90FF65E069DC :1054F000018EEA198000123CFE91FF64C5CBFC19B5 :105500004000123CFE91FF5E300A149B149CF01F79 :10551000003AC57B300A4BC5149B301CF01F003687 :10552000C50B30481A9BBAE8336CF01F00400E9A46 :105530003019303B30ECEA1C4000F01F00384B893A :105540004BB89119C3EB76170E9CF01F00310FC9B1 :105550003068F0091800FE9BFF354B15F01F003531 :10556000C2A10E9B338CF01F0031C2BB4AC530195B :10557000300A303BF01F0029C24B49AA300B4AAC1D :10558000F01F001ACAA1304849F5BAC81A9B334C1B :10559000F01F0026C16B306AEECBFFE2FACCFFFCB5 :1055A000F01F002530481A9BBA68335CF01F001FBB :1055B000089ACBFB3019300A303B30CCEA1C400053 :1055C000F01F00160FCB305CF01F000A300A301CB1 :1055D000149BF01F0009CF5A000087F4800152F09D :1055E00080018E9C8001E7548001EF208001E03C27 :1055F000800183908001465880014B2C8001E58812 :105600008001DA5480014A0C800149D48001E2FC17 :1056100080016D48800151A8800186C880015638FC :105620008001E7B88001EA8C80016D6C00000224E3 :10563000800185E48002E736EBCD40804C9731084D :10564000EA184000103CC6F0E088001DE068018CBC :10565000EA188000103CC3B0E088002EE068019397 :10566000EA188000103CC440E0680194EA18800009 :10567000103CC2714BC7761CF01F003C0E9CE3CD62 :10568000808030C8EA184000103CC400E088001D4B :1056900030D8EA184000103CC21030E8EA18400048 :1056A000103CC0F14B2A300B4B2CF01F00330E9CEA :1056B000E3CD8080E0680186EA188000103CC0706D :1056C0000E9CE3CD8080E04C008ACFB14A5AF01F97 :1056D000002B18970E9CE3CD8080F01F00294A4ACA :1056E000300B4A8CF01F00240E9CE3CD8080761C8A :1056F000F01F0025F01F0025C0514A5B33CCF01F7E :10570000002549970E9CE3CD80804A39731858983C :10571000CD803098496AF3480044300B49FCF01FB3 :105720000016CCFB49C973185888CCB03088F348B0 :105730000044F2F900F87338301911EAF20A18003F :10574000C0A03019300A303B30DCEA1C4000F01FAA :105750000014CB7B486A300B492CF01F0007CB1B91 :105760008001563880014A0C8001DA4680018E9C07 :105770008001E03C8001EF2080014B2C80015E34F1 :105780008001DA448001DA48800185E4000076383F :1057900080016D6C000087F48001E0D4800186C830 :1057A0008001E094EBCD40F84A37189416956E18B6 :1057B0006E090E930E96C118300B301CEA1C400087 :1057C0005D19300B6C39FC1C40005D196C388D285C :1057D0006E186E091238C2001039C190300B301C9F :1057E000EA1C40005D19300B6E19FC1C40005D196D :1057F0006E188F086E296E381039CDF10A9B089CFF :105800005D19873C6629123CCF71CE3B0A9B089CF0 :105810005D198F1CCF0B5805C0706A085818C060FE :105820000A9CF01F0006E3CD80F8EACCFFFCF01FD5 :105830000004CF7B00000224800091E88001D3A8FF :105840004878F14C00F8580CF9F81004F9B9010146 :10585000F1D9E108F9F81A045EFC0000000087F4B1 :10586000EBCD40C04948FAC6FFF4F0F700F4580702 :10587000C051C1E8F8C70008C1B0EECAFFDC740827 :10588000204D502815C9FB69000C15D8FB68000D88 :105890006C0850080DC9BAC90DD8BAD8F01F000756 :1058A0002FCD580CC0516E2C580CCE5118970E9C11 :1058B000E3CD80C0000087F480018898D40149D9E5 :1058C000F2F800F41838C0B078285808C2B0784808 :1058D000201899482F8CF01F0018D802580CF9F89E :1058E0001004F9BA01FFF1DAE108F9F81A043008F6 :1058F000F34800F448FA78285808C180F0C9000835 :10590000F54900F4CE8072482FF89348F4F900F47A :105910005809CE10724820182F8C9348F01F0006AB :10592000D80278385808CD41D802F54800F4CD3B6C :10593000000087F48001F2A0D4014989F2F800F058 :105940001838C0A078085808C240784820189948EC :10595000F01F0013D802580CF9F81004F9BA01FF2F :10596000F1DAE108F9F81A043008F34800F0780A8F :10597000F34A00F0580ACED074482FF89548487979 :10598000F2F900F05809CE50724820189348CE1B07 :1059900078185808CDB1CDFB000087F48001F2A043 :1059A000EBCD40801897580AC2C07858F608010815 :1059B0001438E08800274948F0FB00F8580BC190E4 :1059C000F8CAFFDC15D8204DFB68000D740950297A :1059D00015C8F6CAFFDCFB68000C7408500815C92E :1059E000BAC915D8BAD8F01F00092FCD580CC091EC :1059F0000E9CF01F00070E9CF01F0006E3CF908066 :105A0000E3CF8080000087F48001889880015938B6 :105A1000800158BCD4214A141895E8F700F05807C3 :105A2000C27079383006704AC02810976F387049B4 :105A30001439E08A00086E080E965808CF710E9649 :105A400010970A37C0D06A085808C0B00A9CF01FE7 :105A500000145806C1300A9B0C9CF01F0012D8227B :105A60006A185808CF416A482FF88B48CF3BE94C59 :105A700000F078482FF89948D8220A9B0E9CF01F16 :105A800000090E9CE94500F0F01F00050E9B0A9CE2 :105A9000F01F0004D8220000000087F48001F2A06B :105AA0008001F28CEBCD40C04A48FAC7FFF4F0F613 :105AB00000F05806C051C3D86C065806C3A06D3814 :105AC000707C2F4CF8E80000212DFAE90024F8EA58 :105AD0000008FAEB002CF8E80010FAE90034F8EAC4 :105AE0000018FAEB003CF9380020FB680044F93953 :105AF0000021FB690045EEE80000FAE90000EEEA4B :105B00000008FAEB0008EEE80010FAE90010EEEAEF :105B10000018FAEB0018EF380020FB680020EF397E :105B20000021FB690021F01F00062EED580CCC501F :105B30000C9CE3CD80C00000000087F48001891038 :105B4000EBCD40E0205D7608502817C9FB69000CBA :105B500017D81697FB68000DF8CBFFE2306A18964D :105B60001A9CF01F0034F01F00342FCD580CC05188 :105B7000300C2FFDE3CD80E06E7C2F4CF8E8000068 :105B8000212DFAE90024F8EA0008FAEB002CF8E8E5 :105B90000010FAE90034F8EA0018FAEB003CF93892 :105BA0000020FB680044F9390021FB6900456D388D :105BB000707C2F4CF8E80000FAE90000F8EA0008D1 :105BC000FAEB0008F8E80010FAE90010F8EA00180B :105BD000FAEB0018F9380020FB680020F9390021A1 :105BE000FB690021F01F00152EED580CCC20320B64 :105BF000300CF01F00131895CBC0189A0E99491B52 :105C0000F01F00110BF93008F0091800EDF800132F :105C1000F1F90807EBF90E07FACCFFFC6D3818D83C :105C20001A9CED45004CF01F0009301CCA3B0000D7 :105C30008002E73680018898800189108001D8DCD5 :105C40008001D3EC8001AD408001D3A8EBCD40C0F2 :105C500049C649D86C09700A1439C05530070E9CE2 :105C6000E3CD80C0350CF01F00191897CF906C0859 :105C70002FF8350A8D08300BF01F0015320B300C51 :105C8000F01F0014EF4C004C1898C16030084929EF :105C90008F680E9CF30A017C8F28EF5A001CEF6876 :105CA000002A8FF88F488F58EF4800408F188F08D0 :105CB0008F38E3CD80C00E9C1097F01F0008CD0BED :105CC000000076440000025880009200800091D0CD :105CD0008001D8DC00000260800091E8EBCD4080BC :105CE000189778485808E08A0004E3CD8080793816 :105CF0005808C0402B4CF01F000648697208201855 :105D00000E9C9308F01F0004E3CD80808001D3A88F :105D100000007644800091E8D4014899F2FC00F834 :105D2000580CC0A07848201899483008F34800F86B :105D3000F01F0004D802F34C00F8D802000087F4EA :105D400080015CDCEBCD40F84B131894E6F700F8CB :105D50005807C060189B0E9CF01F002EC1D1E6F7BB :105D600000F05807C4203006C1285806C0706F38AC :105D70006D39704A7248103AC064E6F800F80E387F :105D8000EE0617106E070E955807C0900E9C089BE4 :105D9000F01F0020CEB00E9CE3CD80F8F01F001E57 :105DA00058065F18580C5F0918971069EA0918001F :105DB000C201089B306AEECCFFDCF01F0018089B84 :105DC000306AEECCFFE2F01F00156F3A0899149C80 :105DD000493BF01F001430080E9C8F088F18F01FED :105DE00000120E9CE3CD80F8F01F000B1897CE2B0D :105DF0000C9CF01F000E0C9CF01F000D0C9CF01F63 :105E0000000DF01F00051897CD51CC6B000087F4F2 :105E100080015B4080015C4C800091DC8001D3EC10 :105E20008001AD4080015A1480015938800158BC6E :105E300080015CDCEBCD40E04905EAF700F458074F :105E4000C0D1C158F0C600080E9CF01F000D0E9C7A :105E5000F01F000C5806C0B00C976E285808CF31C0 :105E60000E9CF01F00070E9CF01F00063008EB4848 :105E700000F4E3CD80E00000000087F4800158BC0E :105E800080015CDC580CC04078185B98C110489ABF :105E900074991298EDB90001F9BC0101F9BB001029 :105EA000F3DBE038F5F80A09F9BC00015EFC5EFDA1 :105EB000000087F4489A7498109CF0091604E21CBC :105EC0000002F9BB0110F1DBE138F5F81A09F9B865 :105ED0000101F3D8E12C5EFC000087F4489A749825 :105EE000109CF0091604E21C0002F9BB01EFF1DB83 :105EF000E128F5F81A09F9B80101F3D8E12C5EFCA4 :105F0000000087F448887099129CA589E21C000261 :105F1000F9BA0101F3DAE148F9B90101F1D9E12C4B :105F20005EFC0000000087F418994868709CE21C31 :105F30000002F1F8103FF3F81A00F9BC01015EFC11 :105F4000000087F418994868709CE21C0002F1F880 :105F50001041F3F81A00F9BC01015EFC000087F45F :105F600018984859729CE21C0002F3F81A41F9BCD7 :105F700001015EFC000087F44839300C7298A7C814 :105F800093985EFC000087F44839300C7298A5D8CD :105F900093985EFC000087F4D401E06A0100300BA6 :105FA000482CF01F0003DA0A00007648800091D0E8 :105FB000EBCD40C04A0A18967498109CE21C00026F :105FC000C1D0F4F700F85807C1801099E2190020F9 :105FD000C270A5C8A7A8F4FB00BC95983009497AFF :105FE000E06CEA60F01F00163008F0061800C100EF :105FF0003018F0061800C040301CE3CD80C0311CC2 :10600000EECBFFE2306AF01F000FE3CF90C0312CDF :10601000EECBFFE2306AF01F000BE3CF90C0A5B8D3 :10602000F4FB00B89598E06CEA60487AF01F000431 :10603000CDCB0000000087F480015F7880014558D7 :106040008001465880015F88D401F01F0002D80209 :1060500080018040D40148687098E2180002C03185 :10606000109CD802F01F0003D8020000000087F443 :10607000800183FCD40148687098E2180002C031A6 :10608000109CD802F01F0003D8020000000087F423 :10609000800183D8D431FACD0188E06A0168300BE1 :1060A0001A9CF01F002CFAC6FE541A901A9CF01F7E :1060B000002A581CC03029EDD832FAC5FFF8401824 :1060C000F0081016EA0800081035C4120A97FAC43E :1060D000FE98ECC1FFF8C09840182EA7F0081016E3 :1060E000EA0800081037C3326C08204D50280DC94B :1060F000FB69000C0DD80E9BFB68000D306A1A9CE2 :10610000F01F0016F01F00162FCD580CCE60EECBFE :10611000FFFA310AFACCFE88F01F0010E2E8000016 :10612000310AE8E90000089BE2E20008FACCFE88A8 :10613000E8E30008F01F000BCD01189B316A0E9CAC :10614000F01F0004009CF01F0008CB6B29EDD83A2B :10615000800091D0800160748002E73680018898C9 :106160008000917C80016054D431FACD018CE06ACA :106170000168300BFACCFFFCF01F0050FAC5FE504E :10618000FACCFFFCF01F004E581CC03029DDD8327D :10619000402858F8E088007FF0081016FAC1FFF494 :1061A000E20800081031E0820087E06801685018BA :1061B000EACBFFF8FAC6FFF002973004FAC0FE946B :1061C000500BC0C85804C36040282EA7F008101612 :1061D0002EA6E20800081037C4926A08204D502805 :1061E0000BC9FB69000C0BD80E9BFB68000D306AD5 :1061F0001A9CF01F0034F01F00342FCD580CCE3005 :10620000ECCBFFFE310AFACCFE84F01F002E400BCF :10621000F6E80000310AE0E90000FACCFE84F6E27C :106220000008009BE0E30008F01F0028CB005804A2 :10623000CCC10F89E8091800CC810F98F20818002A :10624000CC410FA9F0091800CC010FB8F2081800D2 :10625000CBC10D89F0091800CB810FD8F2081800C6 :10626000F9B40100EE041700CB0B5804C2400A9B9E :10627000306A089CF01F0013EACBFFF8310AE8CC23 :10628000FFFAF01F0010FACCFFFCF01F001129DD0F :10629000D832F00A1110FAC1FFF4F40A1016E2081D :1062A000000C300BF01F00053108E0690168502830 :1062B0005019C7FB3FDCC6BB800091D080016074E1 :1062C0008002E736800188988000917C80016054CC :1062D000EBCD40C0208DBACBBA8A189B4968709C20 :1062E000E21C0002C06118970E9C2F8DE3CD80C088 :1062F0003008FAC6FFF8504850281A99FACAFFFC2D :106300000C9CF01F000EC111189740285808C0407F :106310000C9CF01F000B404C580CCE70F01F000975 :106320000E9C2F8DE3CD80C00C9CF01F0007581CE5 :106330005F07CECB000087F48001E1308001D3A855 :10634000800091E880018E9CEBCD40C0201D491754 :1063500018966E9CE21C0002C0412FFDE3CD80C068 :106360001A9CF01F000DEF4600FCEEF801105808D3 :10637000C051301C2FFDE3CD80C0EECCFEECEF3AD7 :10638000011BEF3B011AF01F0005301CCF4B000032 :10639000000087F4800177A4800162D0EBCD4080BB :1063A000201DBA8C48C76E98EDB80001C0402FFD83 :1063B000E3CF808030181A99300A308B487CF01F68 :1063C0000008581CCF511B88EF4801202FFDE3CD5A :1063D00080800000000087F48003B7A08001776C04 :1063E000D401201D48B91898729CE21C0002C0E03C :1063F000300AF368004C308BFAC9FFFC486C12F885 :106400003018F01F0006581C5F0C2FFDD80200004A :10641000000087F48003B7A88001776CD401203D89 :10642000BA8C496A749CE21C0002C0312FDDD8028C :106430001B8B3038F00B1800E089001DE06832003B :10644000EA18312EE069352EEA19312EFAE90004F6 :10645000F4F800F8F3DBB008300A5808F1F91A0F25 :10646000308B30181A99FACCFFFCF01F0005581C2D :10647000CDE03FECCDCB0000000087F48001776CCD :10648000D421206D4A0618976C98EDB80001C040E1 :10649000300C2FADD822584C5FB8E04C00FF5F198C :1064A0001268C0303FECCF6B300814995028169A10 :1064B0005008189B1A951A9CF01F0014CEA01A9C25 :1064C000F01F0013400818945808C0401A9CF01F91 :1064D0000011402C580CC030F01F000F5814CD9103 :1064E0006C98EDB80007C0C15837E08B000AEE0881 :1064F000150648A9300A1009089C930ACCBB301C29 :10650000CC9B0000000087F48001E1A480018E9CF8 :106510008001D3A8800091E800007648EBCD40C010 :10652000202D496718966E98E2180002C2103FF8B5 :10653000FACAFFFEBAF8BAA8BAB8BAC8BAD8BAE85E :10654000300BF01F000F6E98EDB80007C0E1583611 :10655000E08B000CEC081506300A48A9301C100925 :10656000930A2FEDE3CD80C02FEDE3CF90C0109CB8 :106570002FEDE3CD80C00000000087F4800164802F :1065800000007648EBCD40C0202D49F66C9CE21C03 :106590000002C2703FF8BAF8BAA8BAB8BAC8BAD8F6 :1065A000BAE8ECFB00F8580BC260F6CCFFE2303AD8 :1065B000300BF01F0016FAC7FFFE301CF01F00144E :1065C000303B0E9A300CF01F00136C99300B129870 :1065D000ED4B0110A3D88D98EDB90007C050301CC9 :1065E0002FEDE3CD80C0E06A010048BCF01F000B36 :1065F000301CCF7BFAC7FFFE303A0E9CF01F000321 :10660000CDDB0000000087F4800162D08001651CB2 :106610008001648000007648800091D0D43120DD74 :10662000FB690010FB68000CFAC9FFA8FEF7023CEA :1066300018956E981696149272307201E218000244 :1066400072147223C041300C2F3DD832E04B002031 :10665000E08800043FFCCF9B584CE08B002158DBC6 :106660005FBA301BFB380010F60818005F09126A89 :10667000C030580CC1413078FACCFFD4FB680033ED :10668000F01F007B3008303C50785058F01F0079E4 :1066900058D6C070E08B00315856C0303FECCD5B0F :1066A00030683019FB680033EF49011CFACCFFCD8C :1066B000F01F0071501C1AD31AD41AD1FB38001CD9 :1066C00004991AD80C9AFB380043FACCFFDC0A9BD9 :1066D000F01F006A2FCD580CC1B140585808C05067 :1066E000FACCFFECF01F0066407C580CCAD0F01FBB :1066F0000065300CCAAB5906C6C0E0460020CCF19C :1067000030283029FB680033EF49011CCD0BFACC4F :10671000FFECF01F005D500C40585808C050FACCF8 :10672000FFECF01F0057407C580CC030F01F0055A4 :1067300040085818C8915800EFF81009F9B9010835 :10674000F1D9E138EFF81A093009FB380010F208E6 :106750001800C051F9D5B008F01F004C6E98EDB884 :106760000001C0514C18F0F800FC501840185808AF :10677000C080FB3A0010FB3B000C089CF01F00445B :10678000306A089BEECCFEECF01F0042301AFACBC8 :10679000FFF4EECCFEE6F01F003FEECCFEE5301A33 :1067A000FACBFFF0F01F003B3018EF480110FB68F8 :1067B00000326E9C4AD7EDBC0001C120EDBC000741 :1067C000C061FB38000C50285845C1E1301CC3DBC8 :1067D00030483039FB680033EF49011CC68B300864 :1067E0004ADB1099109A109CF01F002CC3401ADC51 :1067F0003018FAC9FFCA300A308B4A9CF01F0029B2 :106800006E9C2FFDCDCBEA0915064A780C9AF0094B :106810000007049BEF650026EF560024EECCFFFC3A :10682000F01F001C089BEF610036306AEECCFFD8E9 :10683000F01F00185803C110069B308AEECCFFD21F :10684000F01F001440288FF0EF68003830188F08D0 :10685000109CCFBA6E9CCB3B069B308AEECCFFD20D :10686000F01F0012CF0B0000000087F4800177A416 :106870008001EF6C80017BD88001E2148001D3A8F5 :10688000800091E880018E9C8001641C800162D0B0 :10689000800091DC80015E8480016AF48003B798F7 :1068A0008001773000007648800091D0EBCD40C069 :1068B000300749A60E98A7682FF7EC08000B76085A :1068C0005808C0F10E985847CF714957EF3C004C1B :1068D000F01F0014EEFC0100F01F0013E3CF90C086 :1068E00076F8F6C9FFD2F73C00261AD8F6C8FFD8CA :1068F0001AD91AD8F7390036F6CAFFFC1AD9F73870 :106900000038F7390027F71B0024F01F00082FCDAF :10691000581CCD90E3CF80C000007648000087F47B :10692000800163E0800163488001661C7808301CA8 :10693000F80A094C201C106C5EFCD70348787008DC :106940005808C0901838C041C078103CC05070B88A :106950005808CFC15EFD5EFF0000778C189A48F89A :10696000709CE21C00025E0C70A8EDB80000C03004 :10697000305C5EFC48AC780B583BE089000D300978 :106980004888F00B003891189109950BF6C8FFFF65 :1069900099085EFF3FDC5EFC000087F4000077880A :1069A0000000776848D972A8EDB80000C1313008FE :1069B000780A99D848ABF60A003A741999E974181C :1069C000F8C9FFCC910C7808301CF60800389119F2 :1069D0005EFC305C5EFC0000000087F4000077681D :1069E000EBCD40C0189778B95809C18078C893C8D2 :1069F0006EC891096E3C580CC050F01F000B300857 :106A00008F3833CA6EA635AB0E9CF01F00080C9B66 :106A10000E9CF01F0007E3CF80C078C94858911939 :106A200078B9CE7B800091E8800091D0800183B05E :106A30000000778CEBCD40801897580CC180789877 :106A40005D1848F972095809C051C11872B958093E :106A5000C0E01237CFC16E785808C0B06E3C580CF9 :106A6000C060F01F000830088F588F38E3CF908047 :106A70000E9C301BF01F0004E3CF90800000778C49 :106A8000800091E8800169E0EBCD4080496972A8FF :106A9000EDB80000C040305CE3CD8080493870091B :106AA0001839E08A001E4928F00C00376E09580991 :106AB000C15072DA580AF3F8000EEFF80A01F3FA3F :106AC000000DF3F8100EF5F81A0E72E8129C910AF8 :106AD000F01F00086E095809CED1E3CF90803FCC5B :106AE000E3CD8080000087F400007788000077689D :106AF00080016A34EBCD40F81897169614951294DD :106B0000109333CCF01F000CC1403008990799B89E :106B10009938995899889996994599649973487ABA :106B2000301899A8741999C9930CF8C8FFD495180E :106B3000E3CD80F8800092000000778CD401202DF6 :106B4000500A48C972A8EDB80000C040305C2FED73 :106B5000D80248981A99F00B032A3048FA08000B1B :106B6000F01F0006581CF9BC0001F9BC01FECF0B58 :106B7000000087F4000077488001F1D8EBCD40C0D9 :106B8000201D4AC618976CA8EDB80000C441580CE7 :106B9000C3F0789B580BC3C0780A580AC3954A695A :106BA000F20A033850085808C061C1A870D85008CC :106BB0005808C1601037CFB1F40815036EDA580ACF :106BC000F3D8E009EFF8000EF3F80A01EFF8100E21 :106BD000F5F81A0E400870DA70E9930A6E9B3F9838 :106BE0008F18580BC0300E9C5D1B6E8B581BC0500D :106BF000582BC150580BC0516E2A1A9CF01F000F21 :106C00000E9C301BF01F000E2FFDE3CF90C02FFD18 :106C1000E3CF90C0305C2FFDE3CD80C0ECF801B82D :106C20000E38CEF130094838F14901B8CEAB00003A :106C3000000087F40000776880016B3C800169E008 :106C4000D40148C9169E72A8F1D8C001C031305C89 :106C5000D8024898304A76A9F00C032C1ADAF6C804 :106C6000FFF833CAF01F00052FFD581C5F0CD80237 :106C7000000087F4000077488001F164D431204D92 :106C800030084931189650285018FAC5FFF4FAC256 :106C9000FFF802901A93FAC4FFFCC098E006032A9A :106CA000F01F000C0E9B401CF01F000B3049049B92 :106CB0000A9AE206032CF01F0009304818970A9937 :106CC0001A9B089C5817CEB02FCDD83200007748B9 :106CD0008001F1D880016B7C8001F0B4EBCD40E005 :106CE000201D49356AA8A1A8300A49298BA8149704 :106CF000930A14984906EC08002C2FF748FA303B09 :106D0000F01F000F581CC0F10E985887CF5148D87B :106D1000300991189109301B1A9CF01F000B2FFDB0 :106D2000E3CD80E06AA8A1C88BA8CF2B000087F430 :106D300000007788000077488001692C8001F05CB2 :106D40000000778C8001695C5EFD5EFFEBCD4080CA :106D5000189778785808C030788C5D180E9CF01F12 :106D60000003E3CD80800000800091E8D4314B1017 :106D70001895169260095809C58030047258721926 :106D80000A38F7B400FF5809CFA10891E80C1502A2 :106D9000F01F00291893C46060075807C2303006FE :106DA000C0486E175807C1E06E580A38CFB10E9C24 :106DB000F01F0022E60609276E485808C0F06E1939 :106DC0005809EFF80002E1F80A01EFF90001EFF8C5 :106DD0001002F3F81A026E2891092FF66E17580761 :106DE000CE415804C1A006953006C0380836C154BB :106DF0006A07049C6E686E8B5D18491B0E9CF01F21 :106E000000112FF62FC56E485808CF100E9C48CBA6 :106E1000F01F000C0836CED5069CF01F000B029C1C :106E2000D8321891029CD83212941291CB0B0000E8 :106E300000007794800092008001463A80016D4CFA :106E400080014642800091E8EBCD4080324CF01F3B :106E500000081897C080324A300BF01F00060E9CC5 :106E6000F01F00050E9CE3CD8080000080009200A2 :106E7000800091D080014652EBCD40FC18961695CB :106E80001494129310924077F01F000AC100995693 :106E900099359964998799739942487A3008991875 :106EA00074199929930CF8C8FFFC9518E3CD80FC60 :106EB00080016E4800007794D431FACEFFDC189739 :106EC00016901491129310927C157C04580CC26099 :106ED00078095809C26049A66C085808C051C09882 :106EE00070185808C0601039CFC13018109CD832C3 :106EF000F01F0014C13099509931996399859972A6 :106F00009944300899186C199929930CF8C8FFFC1A :106F10008D188F0C3018109CD8323008109CD83245 :106F200008981AD50499069A029B009CF01F000647 :106F30002FFD580C5F188F0CCDAB0000000077942C :106F400080016E4880016E78EBCD40404856ECCC15 :106F5000FFF8F01F000530088D168D08E3CD804046 :106F600000007794800145D6EBCD40807847785A71 :106F70006E18103AE0880004E3CF8080783B6E0CF6 :106F8000F01F000B6E285808C0406E1B6E0C5D1879 :106F90006E3CE04C002BC050300A149BF01F0005E3 :106FA0000E9CF01F0005E3CF90800000800091DC74 :106FB00080014658800091E8EBCD40C0203D30086C :106FC00018979928990814961A9C308AF01F001176 :106FD000FACBFFF80E9CF01F00102FED580CC101EA :106FE0006E085808C0400E9CF01F000C6E2C580C08 :106FF000C040F01F000B300C2FFDE3CD80C05806C1 :10700000FBF81000EDF81A002FFDE3CF90C0000050 :107010008002E7368001DE6C8001D3A8800091E811 :10702000EBCD40C0189778185B98C0C0783B580BE0 :10703000C17078465806C04078685908C050E3CF00 :1070400090C0E3CF80C0785A590AE08800153FF815 :107050008D28ECCCFFF4F01F000CE3CF90C0784CEF :10706000580CCEE06E685908CEB12F4CF01F0006C8 :10707000E3CF90C06C0CF01F00056E5830198D18CE :107080008D29CE8B8001A25C800091DCEBCD40E0AD :10709000201D1697E04C0081E0800088E08A0027E0 :1070A000E04C0083C2F0C2B4760A1A9C300BF01F89 :1070B0000064E08A004F585CC490314CF01F0061BE :1070C0004008913C4009723A580AC7A06E0830093E :1070D000990899399919EF380008992840083149D9 :1070E000301A91594008911AC1D8584CC4A0E04CAC :1070F0000080C330300C2FFDE3CD80E0E04C0085F4 :10710000CFA16E0A300B1A9CF01F004DE08A0022BE :10711000585CC1C0EF3900084008300A9119400896 :10712000915A301B400CF01F0048581CCE41400CB7 :10713000F01F0046C0B0400B76785808C070300C85 :10714000F01F0043581C5F0CCD7B2FFDE3CF90E078 :107150003FEC2FFDE3CD80E07645760A1A9C300B9C :10716000F01F0037FE9AFFF6585CCF005805C49117 :1071700040089135400993550FCA4008911ACD2B0C :107180007626760A1A9C300BF01F002DFE9AFFE23D :10719000585CCDC05806C1914008301A913640095C :1071A00093564008911ACBEB760A1A9C300BF01FCD :1071B0000024FE9AFFCF585CCC900FC9CAEB3FD891 :1071C00093184009935ACAEBECC5FFED0A9CF01FD7 :1071D000001D4008913C1899400A743B580BC2406E :1071E0006E080C9A93089336EECBFFF430162F0CF2 :1071F0009316F01F00184008915540099316C92BAB :1072000040060A9CF01F000F8D3C4009723C580C50 :10721000C1000A9A6E5BF01F000F400891550FC91C :1072200040089119C7FB3FD895184009935BC7AB3D :107230003FD893184009935CC75B000080016B3C0A :1072400080009200800169A48001693C80016C404B :10725000800091DCEBCD40FC4C151696189476021C :107260006A095909E088001B4BE7C15878BA580AE7 :10727000F9F8000CEFF80A01F9F8100CF5F81A0CFF :10728000201978C8910A8B09F01F00376A0959093B :10729000E08800056E0C580CCEA16C2338086C36C3 :1072A000ECCCFFCCF0041800C260F01F003018973F :1072B000C2F0B8C464080C9A990899A6069B2CCC15 :1072C0008F9CF01F002B3808F0041800C2303818CB :1072D000F0041800C2B04A3B30088FB8761A8FCA43 :1072E0009507EEC9FFD46A0897192FF8301C8B0850 :1072F000E3CD80FC64495809CD90ECC8FFC9E01883 :10730000FFFCF009000CF01F00191897CD31E3CDF8 :1073100080FC318A049BEECCFFF4F01F00156E7ADE :107320008F2A580AC1018F8ACD7BEEC6FFF4318ABD :10733000300B0C9CF01F000F049B0C9C308AF01F3C :10734000000CCCAB6EA82FD8E018FFFC6E9C100C84 :107350008F8C645BF01F0006CBFB0000000077A061 :1073600000000234800091E880009200800091DCEF :10737000800091D0D421207D1297FACEFFD04B29E6 :1073800018947298EDB80001C040300C2F9DD8229F :10739000FCE800003006BB295C7A50265046FAC54E :1073A000FFF8FAC9FFE00A9CF01F00282FED580CE7 :1073B000C2D05807C0B08F368F5640680E9B0C9CC9 :1073C0008F28F01F0023581CC2E11A9CF01F0021D7 :1073D0005BBCC29040076E4C580CC070F01F001E82 :1073E00030088F388F4840075807C0401A9CF01F5C :1073F000001B402C580CC030F01F00175804FBF83D :107400001006E9F81A002F9DDA2A40085808C040F3 :107410001A9CF01F0012402C580CCB80F01F000E5D :107420002F9DD82A40085808C0401A9CF01F000B16 :10743000402C580CC0313FDCCAABF01F00073FDCCA :10744000CA6B0000000087F48001DF7480016C408B :1074500080018E9C800091E88001D3A8EBCD40E0B4 :10746000208D149616951897308A300BF01F001354 :1074700059F6E08800052F8DE3CF80E00A9B0C9A37 :107480001A9CF01F000FFAC9FFE030080C09FACC73 :107490000001F368FFE0F8C6FFFF300B30AA0C9C38 :1074A000F01F000832EB0ECC0C9CF01F0007CF4100 :1074B0002F8DE3CF90E00000800091D0800091DC20 :1074C0008000917080009164D43120AD189E109599 :1074D00014974C781292709CE21C0002C0511896CE :1074E0000C9C2F6DD832169AFAC6FFE41C9B0C9C9C :1074F000F01F00400C9BFAC3FFFCFACAFFDC069C9D :10750000F01F003D1896581CCEC15807C2F10E91CD :107510000E90069CF01F0039401818945808C0407F :10752000069CF01F0037403C580CC030F01F00355F :107530005BB4C4D05807C170E06B0BB8E0CCFFF46B :10754000F01F00315BDCC3A0582CC07060285BF8D2 :10755000C04060188508CC5B029C301B3006F01FD1 :10756000002BCBFB40988B08CBCB3FF8310C8B0822 :10757000F01F002718941890C280F8C8FFF4500834 :10758000109CF01F00248907640930088919089AA3 :1075900031094A1B109CF01F00211891C20040982D :1075A000189B9928300CF01F001E581CCB300C9BE8 :1075B000029C3FD6F01F001BC94B029C301BF01FE2 :1075C000001340988B08C8DB3FD6C8BB5807CFD004 :1075D000029C301B3FD6F01F000DC83B400CF01F33 :1075E0000012089C3FD6F01F0007C7BB000087F4BD :1075F0008001745C80016FB880018E9C8001D3A8EB :10760000800091E88001A22880016B7C80009200BC :107610008001A28C8001702080016AF480016C409E :10762000800169E08001A27CEBCD40E0209D49F81B :1076300018991495709CE21C0002C06118960C9C6D :107640002F7DE3CD80E0169AFAC6FFE8129B0C9CD2 :10765000F01F00170C9B1A97FACAFFE01A9CF01F44 :1076600000151896581CCEC11A9CF01F0013400834 :1076700018965808C0401A9CF01F0010402C580C57 :10768000C030F01F000F5BB6C0313FD6CD9B300C31 :107690008B3C8B5C40880A9B8B28F01F000A581C8F :1076A000CCF03FD6CCDB0000000087F48001745C96 :1076B00080016FB880018E9C8001D3A8800091E882 :1076C00080016C40EBCD40FC1895169414921293F7 :1076D00010974076310CF01F0012C1D099369905F1 :1076E00099149927189A3008310948EB109CF01F1B :1076F000000E1896C100069B049C0C9AF01F000B0C :107700001897581CC0500C9C301BF01F00090E9C91 :10771000E3CD80FC30070E9CE3CD80FC800092001E :1077200080016F6880016AF480017628800169E039 :10773000EBCD406E202D4086129310951491169A31 :10774000189B1A9CF01F0008069B0C99FAE2000097 :107750000A9ABB23029CF01F00052FED2FEDE3CD0D :10776000806E00008001745C80017374EBCD406812 :10777000202D129310961495169A189B1A9CF01FA0 :107780000008FAE800000C9ABB29069B0A9C300905 :10779000F01F00042FED2FEDE3CD80688001745CB5 :1077A00080017374EBCD40401896303CF01F00040C :1077B0007848301C8D08E3CD804000008001EF6CDC :1077C000EBCD406048A618952F060C9CF01F0009D1 :1077D000303CF01F0009310AF8CBFF8C0A9CF01FE7 :1077E00000070C9CF01F0006E3CF9060000087F4B8 :1077F000800145F88001EF6C800091DC800145FA42 :10780000D42149461894ECC5FFF00A9CF01F0012E1 :10781000ECF700F85807C0C06F38707B2F4B322A46 :10782000089CF01F000E0A9CF01F000DDA2A303C65 :10783000F01F000CC060F9380088EE081800C06026 :10784000ECCCFFF0F01F0006D82AF8CBFF78CE8BE7 :10785000000087F4800145F88002E736800145FA90 :107860008001EF6CEBCD40E049061895ECC7FFF0C6 :107870000E9CF01F000F303CF01F000EECF600F8DD :107880005806C0C0ECCBFFE2306A0A9CF01F000A29 :107890000E9CF01F000AE3CF90E00E9CF01F000743 :1078A0000C9CE3CD80E00000000087F4800145F8E7 :1078B0008001EF6C8002E736800145FAEBCD404055 :1078C000209DE04B0020E08B001CBABB580BC1B1DF :1078D0003FF8BAA849162F060C9CF01F0011303C47 :1078E000F01F0010322AFACBFFFEF8CCFF78F01F11 :1078F000000E0C9CF01F000D2F7DE3CF90402F7DDC :10790000E3CFC0403008169ABAA8189BFACCFFFC07 :10791000F01F0007CE0B0000000087F4800145FC3B :107920008001EF6C8002E736800145FE800091DC2B :10793000EBCD40E01895303CF01F000B1897C110BC :1079400048A62F060C9CF01F000A0A9B306AEECC5A :10795000FF56F01F00080C9CF01F0007E3CF90E0DB :10796000E3CD80E08001EF6C000087F4800145FCEE :10797000800091DC800145FED401F01F0002D80296 :1079800080017930EBCD40EC202D18961697586B7E :10799000C0503FFC2FEDE3CD80ECFACCFFF8E06364 :1079A000312EEA13322EE0623100EA12312EB92371 :1079B00016980C99300A308B1A9CF01F0010301C5E :1079C000F01F000F48F81893F0C5FFF00A9CF01F55 :1079D000000E5803C0C00E9A0C9B069CF01F000BB3 :1079E0000A9CF01F000B2FEDE3CF90EC0A9CF01FD8 :1079F0000008069CCD0B00008001776C8001EF6CC5 :107A0000000087F4800145FC800091DC800145FE88 :107A1000EBCD40E01897303CF01F0018EEC8000195 :107A200018955818E0880004E3CF80E058175F09E4 :107A300049366D1858385F0AF5E90009C0E1582742 :107A40005F08F5E80008C030E3CF90E0F01F000DBC :107A5000C0A18B47E3CF90E0F01F000B6D185838A2 :107A60005F0ACEEB303CF01F000578485818CF2055 :107A7000F01F0005CEFB00008001EF6C000087F4D2 :107A800080017BC88001F340EBCD40F81696189337 :107A900076085858E08A002A49A83064F0C5FFF0FB :107AA00097040A9CF01F0018301CF01F001818974C :107AB000C160202D189B089A1A9CF01F0015F01F1A :107AC00000152FED580CC1616C0A0E9B069CF01F2F :107AD00000120A9CF01F0011E3CF90F80A9CF01FDF :107AE000000F0E9CE3CD80F830683FFC9708E3CD93 :107AF00080F80A9CF01F00093FBCE3CD80F800002D :107B0000000087F4800145F88001EF6C8002E736C1 :107B1000800188B0800091DC800145FA0050F200BD :107B2000000FAC003008F9480320F94803245EFC3C :107B3000EBCD40C016971496F8FE0320FCCBFFFF58 :107B4000F60A141FE069851FEA1951EBF60904488B :107B5000A5591419F8FA0324F2091064121B143BF6 :107B6000C0B0F94B0320F80E0927FCC8FF9CF808A9 :107B70000926E3CF90C0E3CF80C0D401189EF8FC63 :107B80000324FCF803201838C1F0F8C8FF9CFC0C53 :107B9000032CFC08032930089709E069851FEA19BE :107BA00051EBFCFB0324FC0B09282FFBF6090448CE :107BB000F60A141FA5591419F2091064F6090109EF :107BC000FD490324D802D80A4838F0F900F85809CA :107BD0005F1C5EFC000087F43018198CF00C180054 :107BE0005F0A3058F00C18005F09124AC0F1306883 :107BF000F00C1800C0B03028F00C1800C080584CB1 :107C0000F9BC0003F9BC01005EFC5EFF302C5EFC99 :107C100048C8F0F800FC5818C0D0C0635828C0D03D :107C20005838C0505EFF580C5F0C5EFC583C5F8CAF :107C30005EFC581C5F8C5EFC582C5F8C5EFC000068 :107C4000000087F4EBCD40C01897169E740A580ABE :107C5000C0D0753A580AC0A0747A580AC0704FF85C :107C6000F0F901045889E0880004E3CF80C04FC8D0 :107C7000F009032F94D8EDB80004CF813008301CF0 :107C80009D08E3CD80C0F53900C83FF8F009180021 :107C9000CED0F51B00D2580BCE90F51C00D030266C :107CA000F4FA00D8F40C002811B9EC091800E080AF :107CB00000BFF8C8FFFF3009F40800280C9CF0CA88 :107CC000FFFDC07815882FCAF8081800E08000B0C2 :107CD0002FF91639CF85CCABF53900C83FF8F0093C :107CE0001800CC40F51B00D2580BCC00F51C00D07E :107CF0003016F4FA00D8F40C002811B9EC09180079 :107D0000E08000A4F8C8FFFF3009F40800280C9CAC :107D1000F0CAFFFDC07815882FCAF8081800E08067 :107D200000952FF91639CF85CA1BF53900A43FF805 :107D3000F0091800C9B0F51B00B2580BC970F51C4A :107D400000B03026F4FA00B8F40C002811B9EC09A0 :107D50001800C660F8C8FFFF3009F40800280C9C22 :107D6000F0CAFFFDC06815882FCAF8081800C58042 :107D70002FF91639CF95C7ABF53900A43FF8F009B4 :107D80001800FE90FF74F51B00B2580BFE90FF6FB9 :107D9000F51C00B03026F4FA00B8F40C002811B934 :107DA000EC091800C3D0F8C8FFFF3009F408002818 :107DB0000C9CF0CAFFFDC06815882FCAF80818008F :107DC000C2F02FF91639CF95C51BF53900A43FF83D :107DD000F0091800FE90FF4BF51B00B2580BFE9007 :107DE000FF46F51C00B03016F4FA00B8F40C002879 :107DF00011B9EC091800C220F8C8FFFF3009F408D7 :107E000000280C9CF0CAFFFDC06815882FCAF8082E :107E10001800C1402FF9123BFE99FFF9C27B3028B0 :107E2000AE8830199D09129CE3CD80C03028AE8801 :107E30003029301C9D09E3CD80C03018AE88301940 :107E40009D09129CE3CD80C03018AE883029301CCB :107E50009D09E3CD80C00000000087F48003B7B027 :107E60003028F00C1800C390E088001B3048F00C5C :107E70001800C3503058F00C1800C21030093028D8 :107E8000F00B1800C160F00B1800E08B001B3018DD :107E9000F00B1800C100300812385F5C5EFC30182F :107EA000F00C1800CEC130193028F00B1800CEC1EC :107EB0003038C02830181039CF045EFE3029CE0B80 :107EC0003048F00B1800C0703058F00B1800CE414D :107ED0003028CF2B3048CF0B3039CD2B3049CD0B4C :107EE000D431307977387075B8891894581AC0D061 :107EF000C043582AC4C0D83A7738707A94D9EDB9BB :107F00000004E0800087DA3AEB3900A43FF8F0097A :107F10001800CF20EB0800B03009F2081900CF405C :107F2000149112923006307B30533060C1A8E007C4 :107F30001800C2B03028F0071800C7A03048EE087B :107F40001800F9BC0003F9BC0100F01F003CE9F780 :107F50001E002FF6EB1800B00C38FE9AFFD6098BE6 :107F6000EAF800B8F006002811B70E9CF01F0034A4 :107F7000FE9AFFF1E20718005F08E60718005F09A4 :107F80001248E4081800CD40301CCE0BEB3900C875 :107F90003FF8F0091800CB00EB0800D03009F208D8 :107FA0001900CB2012913006307B301230533060F4 :107FB000C1A8E0071800C2B03028F0071800C3A01D :107FC0003048EE081800F9BC0003F9BC0100F01FAE :107FD000001BE9F71E002FF6EB1800D00C38FE9AB4 :107FE000FF94098BEAF800D8F006002811B70E9C20 :107FF000F01F0013FE9AFFF1E40718005F08E60780 :1080000018005F091248E2081800CD40301CCE0B62 :10801000307B305CF01F000AFE9AFF77301CF01FA7 :108020000007FE90FF723058301CA888D832302CE0 :10803000C8DB302CCCDB000080017C1080017E602E :108040003008484A48499508951893085EFC000096 :10805000000089EC00008C5CEBCD4080189E198BF1 :10806000580BC130300A3017149CFC0A00092FFA53 :1080700013982018EE080948F9E81008F9D8B0104C :10808000163ACF45E3CD8080169CE3CD80807938C9 :10809000707A3308F53900C8F0091800C0205EFD79 :1080A000F51800D4E218000C5848C0E0E08A000837 :1080B0005888C08058C8CF41310C5EFC5808CF01A9 :1080C0005EFF304C5EFC302C5EFCD703EBCD40E015 :1080D00030081896109A169C8D084927760E301590 :1080E000109BC0A8F80A00082FFA11C9EE0B070868 :1080F000A7D91039C0A01C3ACF652FFB58DBE08B05 :10810000000E300A780ECF8B6C08EA0B0949124832 :108110008D082FFB58DBFE98FFF6E3CF90E00000C0 :108120008003B7F4EBCD40C030069906149EF8C723 :10813000FFFC1799EC091800C0E00C9AF60A000839 :1081400011A90EC978082FF899082FFA1798143832 :10815000FE99FFF61D993008F0091800C0F0300BA9 :10816000FC0B000811A9EE0B0B0978082FF89908F1 :108170002FFB1D981638FE99FFF5E3CF90C0EBCD8D :1081800040F816941897780B68065806E08A002C79 :10819000F6C8FFFCE8C5FFFCF8080003300E2FCC42 :1081A000EA0E070A580BE08A00130FC81458F1D8DA :1081B000C007C1503009C078F80907081458F1D831 :1081C000C007C0D02FF9123BFE99FFF8597BE08B16 :1081D000000706CA6E0B2FFB8F0B68062FFE1C369E :1081E000FE99FFE0E3CF90F8EBCD40FE1894169295 :1081F0001497780676055805E08A0025ECC8FFFC40 :10820000F6C3FFFCF8080001300EF4CCFFFCE60ECC :10821000070A6E0B580BE08A00120FC81458F1D8E9 :10822000C007C1203009C078F80907081458F1D8F0 :10823000C007C0A02FF91639CF852FFE1C35FE9937 :10824000FFE8E3CF90FE5976FE9BFFF902CA68066D :108250002FF689062FFE64051C35FE99FFDACF2B19 :10826000D42178045804E08A0027F8C7FFFC493875 :108270000F8B700C11C6580CE08A0017F0C5FFFC7C :10828000300EEDEB2008F1D8C007C0F00A9A300993 :10829000C0782FFA15881658F1D8C007C0602FF99A :1082A000123CFE99FFF8D82A2FFE2FF7083EC03463 :1082B0000F8BCE8BDA2A00000000023CD4211897E5 :1082C00076055805E08A0026F6C6FFFCF8CEFFFCCE :1082D000300B1694C0482FFB0A3BC1B4EC0B070AC5 :1082E000E80A1800CF946E0C580CE08A00120FC8F0 :1082F0001458F1D8C007CF003009C078FC0907082E :108300001458F1D8C007CE802FF91839CF85D82A54 :10831000DA2A3248F00C1800C110E08800113488C5 :10832000F00C1800C0B0E08800183608F00C1800F7 :10833000C05036C8F00C1800C0E15EFF3128F00CC8 :108340001800CFC03188F00C1800CF8030C8F00C76 :108350001800CF405EFD3308F00C1800CFC1CEEB03 :10836000EBCD40E078055805E08A0010F8C6FFFC28 :108370003007C0380A37C0940D8C2FF72FF6F01F46 :108380000004CF90E3CF90E0E3CF80E08001831240 :108390004838F14B01DCF14C01D85EFC000087F459 :1083A0004838F14B01ECF14C01E85EFC000087F429 :1083B000EBCD40801697581BC050582BC080E3CFA0 :1083C0008080F01F00050E9CE3CD8080F01F00022E :1083D000E3CF9080800091E8D401580CC070486BC6 :1083E000760AE04A0168E0880003D80AF01F00031B :1083F000DA0A0000000089EC800091DCD401580CFE :10840000C0A078185908E08B0007780AE04A016894 :10841000E0880003D80A189B482CF01F0003DA0AF2 :10842000000089EC800091DCEBCD4040350A1896C5 :10843000F01F000330088D48E3CD8040800091DCC0 :10844000D401306AF01F0002D8020000800091DCE5 :10845000D401300CF01F0002DA0A000080016C7CAD :10846000D421201D189414971296169A1095189BD3 :108470001A9CF01F001CE08A0032585CC27058063B :108480005F1858075F191268C241300840099338D5 :10849000400A95584008301B9115400CF01F0012FF :1084A000581CC100400C78785808C090189B089C54 :1084B000F01F000E581CC0A03FDCC098301BF01FFE :1084C000000C400C78785808CF21301C2FFDD822A2 :1084D0004008913740099356CDEB3FEC2FFDD82251 :1084E00080016B3C800169A480016C40800169E0DF :1084F000EBCD40C018971696303CF01F00283DD8B1 :108500003079AE88AE9935083F29300BAEB8AEC988 :1085100030283019AED8EF6B0008AEABAEEBAEF939 :1085200058065F1AF8F900BC58095F181468F60875 :108530001800C310F8F800D05818F9B80008EFF880 :108540000E08F8F800CC5818EFF80808F9B900043C :10855000F1D9E038EFF80E08F8F800C85818EFF82D :108560000808F9B90002F1D9E038EFF80E08F8F878 :1085700000C45818EFF80808F9B90001F1D9E0383B :10858000EFF80E08F8F900D4EF380008F1E91048C8 :10859000EF680008E3CD80C08001EF6CEBCD404078 :1085A0001896303C5C76F01F000E5876E088000488 :1085B000E3CF804048B8F006032FF90C00C6E3CDA6 :1085C0008040F90C00CAE3CD8040F90C00CEE3CD29 :1085D0008040F90C00D2E3CD804000008001EF6CB8 :1085E0008003B7D4D40130DCF01F0002784CD802ED :1085F0008001EF6CEBCD40FC207D31CA1893300B2D :108600001A9C1A92F01F001266045804E08A00189F :10861000E6C6FFFC30070D852FF72FF60A9CF01FEA :10862000000DC0A14008FACAFFE4F0C9FFFF100A1C :108630005009F565FFE80E34FE99FFEF1A9B069C82 :1086400031CAF01F00052F9DE3CD80FC800091D042 :1086500080018312800091DCEBCD40E0207D300B67 :10866000189731CA1A9CF01F00171A956E0B580BF9 :10867000E08A0024300AFAC6FFFCEEC9FFFC0C9C1D :10868000149EC0582FF9143BE08A000D2FFA13886E :10869000FC081800CF8418C82FF96E0B143BFE9904 :1086A000FFF7F80601061A9B50060E9C31CAF01F10 :1086B00000062F9DE3CD80E0FAC6FFFC0C9CCF2B7B :1086C000800091D0800091DCD421129618971695E5 :1086D0001494580CC1205809C111314CF01F0009E5 :1086E000C0C09907B8C599249936487A7419994930 :1086F000930CF8C8FFF49518D822F01F0004D82274 :1087000080009200000077A4800147E0EBCD40C0DC :108710001896580CC110308CF01F000C1897C090A0 :108720000C9CF01F000B8F1C1898C0A030188F08ED :108730000E9CE3CD80C018970E9CE3CD80C00E9CAC :108740001097F01F0004CF5B800092008001D920B9 :10875000800091E8EBCD40C049566C075807C180B6 :108760006E395809EFF80004EDF80A01EFF810042B :10877000F3F81A046E4891096E2A0FCB6E0CF01FA5 :10878000000D0E9CF01F000C6C075807CEA148B8D6 :10879000F0C7FFEC0E9CF01F000AC071302CF01FD8 :1087A00000090E9CF01F0008E3CD80C0000077A4F4 :1087B000800147E0800091E8000087F4800145DCFB :1087C0008001478C800145ECD4014848300991185C :1087D0009109F01F0003D802000077A4800187549C :1087E000EBCD40FE4A0618976C0816951494201895 :1087F000E0480167E0880004E3CFC0FE580A5F1933 :108800006C1A300B580A5F181268F6081800CF501F :10881000183A5FB858FC5F891268F6081800CED085 :1088200016910C92C0B82FF7641958F75F8A0E3969 :108830005FB81468E2081800CE00EE031016306A24 :10884000E6CCFFF80A9BEC0C000CF01F0008CEC130 :10885000485B089C060B310A2F2BF01F00050E9C6D :10886000E3CD80FE000089EC8000917C800091DCEB :10887000EBCD40E018951697300C18960E9A0A9B8F :108880002F07F01F0005C0452FF62FFCCF8B0C9C47 :10889000E3CD80E0800187E0D401306AFACCFFFCB0 :1088A000FACBFFF4F01F00025F0CD8028000917C2D :1088B000EBCD4068205D3FF8FACAFFDC15D9FB68B4 :1088C0000013FB68000EFB68000FFB680010FB68DC :1088D0000011FB680012FAC6FFF8ACD974088D08C5 :1088E00015C9FAC3FFFEACC93065FACBFFF20A9A8C :1088F000069CF01F00060A9A069B0C9CF01F0004C1 :108900005F0C2FBDE3CD80688002E7368000917C4C :10891000D401FACBFFFCF73900241788F0091800BE :10892000C020D80AF73A00251798F4081800CFA1FC :10893000F6CCFFFE2DABF01F00035F0CD802000049 :108940008000917CEBCD4040211D303CF01F001E8B :10895000322A1896FACBFFB4FA0A000CF01F001B5B :10896000ECC6FF78ECE80000FAE90000ECEA000849 :10897000FAEB0008ECE80010FAE90010ECEA001845 :10898000FAEB0018ED380020FB680020ED390021DB :10899000FB690021FB3A00221B88F4081800C05034 :1089A000300C2EFDE3CD80401B9AFB380023F408E9 :1089B0001800CF71FACBFFFEFACCFFDCF01F0004E9 :1089C0005F0CCF0B8001EF6C8002E7368000917C5A :1089D000EBCD40E0203D4B571896EF3900943FF81F :1089E000F0091800C3507938707C2F4CF8E800006B :1089F000209DFAE90000F8EA0008FAEB0008F8E820 :108A00000010FAE90010F8EA0018FAEB0018F9383B :108A10000020FB680020F9390021FB690021F01FCC :108A200000242F7D580CC0412FDDE3CD80E0202DA8 :108A3000EEC7FF4A306A0E9B1A9CF01F001EF01F03 :108A4000001E2FED580CC1C02FDDE3CF90E0F8CB16 :108A5000FFE2306A1A9CF01F0017EECBFF4AFAC6FD :108A6000FFFA306A0C9CF01F00130C9B1A9C306AB2 :108A70001A95F01F00125F0C2FDDE3CD80E0ECCBE8 :108A8000FFE2FAC5FFFA306A0A9CF01F000A0E9B4B :108A9000306A1A9CF01F00071A9B0A9C306A1A96CB :108AA000F01F00065F0CCC1B0000026080018944AF :108AB0008002E736800188B08000917CD401201DBF :108AC000500C580CC0401A9CF01F00022FFDD80219 :108AD0008001D3A8D401201D500C580CC0401A9C12 :108AE000F01F00022FFDD8028001D3A8EBCD40C0BB :108AF000E06B00E41896300CF01F000A1897C0E0F5 :108B0000E06A00E40C9BF01F0008ECC9FFF8EECA15 :108B1000FFF8486B0E9CF01F00060E9CE3CD80C052 :108B20008001D8DC800091DC8001D3EC8001ACA80E :108B3000EBCD40C0E06B00EC1896300CF01F000A43 :108B40001897C0E0E06A00EC0C9BF01F0008ECC92D :108B5000FFF0EECAFFF0486B0E9CF01F00060E9C63 :108B6000E3CD80C08001D8DC800091DC8001D3ECB3 :108B70008001ACA8EBCD40FE129210914A88F0F92A :108B800000F818933DD8733C316916977874AE8815 :108B9000AE9930083509AEA8AEB93F283019301665 :108BA00014954A0B303AAEC8AED9AE36EECCFFF8CB :108BB000F01F001D069CEF65000BAE76AE66308B95 :108BC000F01F001A8F5CC290303A496BF01F0016FC :108BD0006E58B0B28EE86E5C303AF808002C491B33 :108BE000F01F00116E598EE8F2080028B0B1E919A3 :108BF00000B0E91800B21208E93900A5A3682F08EF :108C00001039C030E3CF90FE0F9830092FE8EF59AC :108C10000010AE98E3CF90FEE3CD80FE000087F415 :108C200080017B1C800091DC8001D3ECD431201DBD :108C3000314E1697330BAE9EAE8B1090FACBFFD809 :108C40007618500818921493129176055805E08A08 :108C50000006EA0815042EA8AE983016303AAE1673 :108C600049E4EECCFFFCE8CBFFFCF01F001D049CA8 :108C7000AEF3AE56AE46AE75EA0B15042F8BF01F61 :108C800000198F4CC280303AE8CBFFFCF01F001473 :108C90006E48B0B18EC86E4CE8CBFFFCF808002CD3 :108CA000303AF01F000F6E498EC8F2080028B0B0AD :108CB0003289AE695805E08A000D6E488EC98EDC97 :108CC000EA0A1504120C400BF00C002CF01F0004F3 :108CD0002FFDDA3A2FFDD83280017B1C800091DC19 :108CE0008001D3ECEBCD40E0201D500B1897580CC1 :108CF000C070169A4C4C0E9BF01F0044C6404C4668 :108D000030080DA9F0091800C050301C2FFDE3CD2C :108D100080E0ECCCFFE4F01F003FCF815807C2F0A9 :108D2000301CF01F003DC3304B751A9B4B6CF01F7D :108D3000003B1897C320F01F003A3018ED4C00CCD0 :108D4000ACA80E9C3005400BED5500D04B07F01F32 :108D500000351896581CC3F1EECCFFE4F01F00322A :108D60004B28F1090142EA091900CD006E98EDB8CF :108D7000000ECCC0F01F002E0C9CCC9B4A25EAF9BB :108D80000320EAF803241039CCC1CD0BECCCFFE46E :108D9000F01F0025301CCBBBECF801245818C04054 :108DA000301CF01F0024ECCCFFE4F01F001FEAF998 :108DB0000324EAF803201238CA90301CF01F001672 :108DC000301CCA5B492AF50B00D2F80B1900C0A071 :108DD0003FBCC9DBEECCFFE4AEA5F01F00133FBCE7 :108DE000C96B3018F55800D24909F3080142F6085A :108DF0001900CEF07498EDB8000ECEB0F01F000C44 :108E00003FBCC85B000084CC80017B30000087F44D :108E1000800145DC80019F3080017B7A800145C460 :108E200080014664800145EC000002608001FBFC8B :108E30008001A128EBCD40C01897F01F0015C1B0EC :108E40006E4849468D186E598D2930096E2C8F2930 :108E50006E486E3BE2180080F9B80001EDF80E0292 :108E6000F01F000D1897581CC0803008300CACA8BB :108E7000E3CD80C0E3CF90C0F01F00083008ED4C78 :108E800000CCED5800D00E9CE3CD80C08001C6A080 :108E9000000087F480014664800145C4EBCD40802A :108EA000491A18977498EDB80001C111F4F801241B :108EB0005818C0A07848951878599529F01F000BCC :108EC000C091E3CD8080109CE3CD80803FBCE3CD9A :108ED000808030086E2C6E3B8F28F01F0005E3CD9C :108EE00080800000000087F48001C6A080018CE42F :108EF000106104000000000040200700FFFFFFFF9A :108F0000000000004869F2F802045828C0205EFE04 :108F1000580CCFE0F2C8FFF099085EFF000077AC74 :108F20005EFDD7034828912C913B5EFF000077AC93 :108F300048384849910C930B5EFC000000007540D6 :108F4000000074B45EFCD703D431202D500C3008DF :108F5000FAC1FFF81690109402D84A424A43E269D7 :108F60005A4C089A0819029B009C40085D181895F5 :108F70005804C0B1584CF80A1780F9BA0B0449DB01 :108F8000401CF01F001DC2E140165805C1000A97A1 :108F90005907EE0A1780F9BA0B100C9B1417140628 :108FA00064085C7A660C5D185807CF310A04E24405 :108FB0005A4BFE98FFD65875E088000D4018EACC51 :108FC000000848CBF00C000C2F8B308AF01F000AF1 :108FD000C0913009009C129A129B40085D182FED39 :108FE000DA3A30DC2FEDD83200007540000074B45E :108FF00080018EF08000917CEBCD40FC49F8189404 :10900000F0C3FDDCF0C7FFBC3072C0B8321A089B59 :109010000A9CF01F001B1896C1D02C470637C16070 :10902000EEC5002C5804CF316E08109C5808CF6054 :10903000F01F00148F04EF44FFF86E185808CEE1BB :109040008F248F322C470637CEC15804C0D0E3CFCF :10905000C0FC6ABC580CC080F01F000A8B968BB60F :109060006AC85808C030E3CF90FC8BD8301C3078E9 :109070008BE8E3CD80FC0000000077AC8000917CA1 :10908000800091E8EBCD40FE109114961895169251 :109090001293F4C80008E0480037E08B00185859D4 :1090A000C18049D8F0C4FE08F0C7FFE86EB8580880 :1090B000C1300E9C321A0A9BF01F0018C1D02C47F9 :1090C0000837CF51307CE3CD80FE30ACE3CD80FE5D :1090D000129CE3CD80FEECCBFFFF049CF01F001040 :1090E0000A9B8FBC8F968FD18FE30E9C321AF01F94 :1090F000000DE3CF90FE6EBCF01F000B049CECCB88 :10910000FFFFF01F00078FE38FBC8F968FD1E3CF57 :1091100090FE0000000077AC8000917C8000918878 :10912000800091DC800091E8D401487BF6F80204CD :109130005828C020DC0AF6CBFE04306AF01F00037A :10914000DA0A0000000077AC800091DCEBCD40FE35 :10915000209D580B5F09580A5F08169314941069F4 :10916000C341580BC4514A9264585808C2E03005B4 :10917000FAC1FFFD0A970A9CC0D8ED3A0020FB38DF :109180000023F4081800C2E00E9C64580E38E088F2 :10919000001E64482FF7F00C03265803CEF1306A06 :1091A000089B5804C0A0202D1A9CF01F0019F01F26 :1091B00000192FED580CC0E05805C0506AC96CC8A2 :1091C0001238CE350C95CE1B30050A9C2F7DE3CD91 :1091D00080FE306A089BECCCFFDFF01F000FCD5102 :1091E000CECB029B0C9CF01F000CCCF1CD9B189BAE :1091F000069AFACCFFFDF01F0009FB6300234832FA :1092000064585808CB51CE1B000077AC8002E7367B :10921000800188B08000917C800091DCEBCD4060C3 :10922000306A202D169618951A9CF01F0009F01F21 :1092300000090C9A5F0B0A9CF01F00072FED581CC9 :10924000F9BC0001F9BC01FFE3CD80608002E73684 :10925000800188B080016480D4015C6CF01F000440 :10926000581CF9BC0001F9BC01FFD8028001641C44 :10927000EBCD406E202D1293189116921495300B61 :10928000308A1A9CF01F0012306A069B1A96202D15 :109290001A9CF01F0010F01F001030085F091AD848 :1092A0000A9A1AD6049B1AD3029C1AD83038F01F97 :1092B000000B2FAD5BFCC070581CF9BC01FF2FEDFB :1092C000E3CD806E304C2FEDE3CD806E800091D0E9 :1092D0008002E736800188B08001661CEBCD406ECD :1092E00010911892169314951296F01F00113008E1 :1092F0000C991AD80A9A1AD1069B049CF01F000DEB :109300002FED583CE0890007582CC085306CE3CD28 :10931000806E584CC070E3CFC06E5BECC050581CE0 :10932000CFB1E3CF906E30BCE3CD806E8001A1DC85 :109330008001F7D8EBCD4040201D10964978F0FE13 :109340000204582EC0503FFC2FFDE3CD804030EE8C :10935000FAC8FFFC10DE300E1A985C761ADE1AD6B8 :10936000F01F000F2FEDFE5CFC17E0890010FE5C83 :10937000FC16C114FE5CFB4FC070FE5CFBB4C0B0B9 :10938000FE5CFAECCE11307CCE0B5BECC040581C7E :10939000CDB1CDBB30BCCD9B000077AC8001F54496 :1093A000D4014858F0F902045809C030F01F0003F6 :1093B000D8020000000077AC80014480EBCD40E88B :1093C0004D56189514971693E06A0218300B0C9CB2 :1093D000F01F00524D288D05700C8D133005A36CC5 :1093E000ED450204F01F004F8D4CC031E3CFC0E8C3 :1093F0000A9CF01F004D581CCFA11AD5F1D7C00808 :109400000A990A9A310B320CF01F00482FFD581CA4 :10941000CEE1F01F0047581CCEA11AD50A980A9930 :109420004C4A0A9B302CF01F00442FFD580CCDF005 :1094300030670A981AD70A994BEA0A9B322CF01F18 :10944000003E2FFD580CCD3030780A991AD84B9A2F :109450000A980A9B323CF01F00382FFD580CCC7044 :109460001AD50E9C0A980A994B2A0A9BF01F0032C3 :109470002FFD580CCBC030270A981AD70A994ADA20 :109480000A9B304CF01F002C2FFD580CCB001AD734 :109490000A984A8A0A990A9B305CF01F00272FFD20 :1094A000580CCA50301C0A981ADC0A994A1A0A9BAE :1094B000F01F00212FFD580CC9A030390A981AD985 :1094C00049CA0A990A9B31CCF01F001B2FFD580C8A :1094D000C8E0F01F001A581CC8A1F01F0019581C42 :1094E000FE91FF860A980C9730490C9A495B0A9CBA :1094F000F01F0015FE90FF7C189A308B493CF01F3E :109500000014581CFE91FF74ED4C0204EF45020C50 :10951000E3CD80E8000077AC800091D000000258D5 :1095200080009200800200AC8002067C8001FFB4C3 :109530008001984C80016E788001FD8C8001A00034 :109540008001955080016AF48003B8048001762878 :10955000EBCD40E078185B98C031E3CFC0E078569F :109560005866CFC1783B0C9A4985EAC7FE040E9C29 :10957000F01F0017303A497B0E9CF01F0017C131D5 :10958000F01F00163026EB460204F01F00150C9C5D :10959000F01F00146A195809C14048C8700C5D19C1 :1095A000E3CF80E037A83C49EB6801FC30E80C9B36 :1095B0000E9CEB6901FDEB6801FEF01F000BCE1B5A :1095C000129CE3CD80E00000000077AC800091DCCD :1095D0008003B80C8000917C8001FD8080020290A5 :1095E0008002023480017984EBCD40FC7875580B01 :1095F000F9B80100F7F81A001693EB3900C83FF8E4 :10960000F0091800C250EB0900D03008F009190029 :10961000C4D0307430073022EE061502EAF800D8C4 :109620000C082FF711BC089BF01F0027E08A0009E7 :10963000EAF800D80C0811B45803E7F21A00EB1846 :1096400000D00E38FE99FFEA089CE3CD80FCEB3891 :1096500000A4F2081800C250EB0900B03008F0096D :109660001900C240307430073012EE061502EAF8D5 :1096700000B80C082FF711BC089BF01F0013E08AFC :109680000009EAF800B80C0811B45803E7F21A0010 :10969000EB1800B00E38FE99FFEA089CE3CD80FC81 :1096A000787992D8EDB80004C040307CE3CD80FCDE :1096B000307B305CF01F0004FE9AFFF9305CE3CD94 :1096C00080FC000080017E60D431201D4D876E58E3 :1096D0005808C0E030060C996E48F009032CF01FC2 :1096E00000552FF66E580C990C38FE9BFFF730068C :1096F0001A9B8F560C9CF01F00501A94400C580C6B :10970000C0312FFDD832A36CF01F004C1890CFA0B1 :10971000400A0C9BA36AF01F004A40085808E08AE0 :1097200000260C950096C0782FF52FC640080A3801 :10973000E08A001D350CF01F00418D0CCF614009FF :109740005809E08A000F009530062FF66A0C580C75 :10975000C040F01F003840092FC50C39FE99FFF7B3 :10976000009CF01F00342FFDD8321A9B009CF01F84 :1097700000324B4972084009F0090D488F585808CB :10978000CE00300408930891A363E003000264084C :109790006E467135344CF01F0029F9410040060631 :1097A0008D0C6A796E48F2CBFFF2F0030306F33AB0 :1097B000000D0C9CF01F00246A78F139000D306A0E :1097C000ED690020ECCCFFDF640B2E2BF01F001E98 :1097D000029B0A9CF01F001DED6C00386A498DC980 :1097E0006A585808F9B805008DD86A79F338005ED0 :1097F000ED6800276A7992C88DA80BF9ED59002C05 :1098000030290BEAF20A1800E2081710F9B8000133 :109810008DF830286E49F20309062FF4F00A18007B :1098200008936E580838FE9BFFB1C8AB000077ACB8 :10983000800091E88002105880009200800091D052 :1098400000000258800091DC800195E8EBCD40C01B :10985000201D1696582BC680E0880013586BC590C3 :10986000587BC2D0583BC4804C076E295809C05061 :109870004BE80C9C703B5D192FFDE3CD80C0580B6D :10988000C0F14BA7EEF902085819C6C0EEF8020C59 :109890003019A1D8EF690210EF48020CCE7B581B9B :1098A000CE414B273008EEF9020C4B1AA3A9EF6802 :1098B0000210A1D9B488EF49020CCD8B4ACA3008F6 :1098C0001589F0091800C4C14A87EEF8020CEDB8FA :1098D0000001CD31EF380210F2081800CCE1F01F82 :1098E0000025F01F0025EEF8020C3016E018FFF9F5 :1098F000EF48020CCBBBF01F002049C7EEF9020C69 :10990000EDB90004CBA11298A5C8EF48020CCAEB30 :1099100049673019EEF8020CEF690210A1D8300641 :10992000EF48020CCA3B4917EEF8020CA3C81A9C78 :10993000EF48020CF01F001140085828C050F01FDB :10994000000DF01F000D300A4898B08AEF39021060 :10995000F4091800C9204858F16A0210C87BB4887D :10996000C8CB4838B089C89B000077AC000079C4E8 :1099700080021298800196C8800177A4D401201D2E :1099800048F9F2F802045828C0302FFDD80AF339FC :1099900002103008F0091800C0711A9CF01F00096D :1099A00040085828CF31F01F0008CF00F8CAFFE266 :1099B000300B169CF01F00052FFDD802000077AC7D :1099C000800177A4800210FC8001914CEBCD408097 :1099D000201D4967EEF802045828C0503FFC2FFDB7 :1099E000E3CD8080F01F0012C051302C2FFDE3CD5D :1099F0008080EEF9020CEDB90002CF10EDB9000144 :109A0000C031309CCEDB1A9CF01F000A4008580879 :109A1000CED0F01F0009581CCE21EEF8020CA3A8EE :109A2000EF48020CCDDB0000000077AC800210FC98 :109A3000800211088001F370EBCD40C020AD189872 :109A40001697580BC07076DC581CC0402F6DE3CDC4 :109A500080C0109BF13A0020FAC6FFFE0C9CF01F5C :109A6000001B0C9B209D322A1A9CF01F0019F01F2E :109A700000192F7D580CCEB0793CFACBFFDCF01FDB :109A8000001640985818C150C0923058F808180075 :109A9000F9BC0003F9BC0102CDAB5828C030301C22 :109AA000CD6B5807C0D06EC85808C0A0305CCCFB46 :109AB0005807C0806EC85808C050304CCC8B307CE2 :109AC000CC6B306CCC4B00008002113C8002E7363E :109AD0008001F2BC800195E8D43120EDFEF3029CB8 :109AE000FAC1FFA4E6F8020C18971694E2180006D3 :109AF000C040309C2F2DD832F01F00A1C040308CC8 :109B00002F2DD832E74C02085807C130BA8CF5D453 :109B1000C008FAC6FFFEBA9A0E9B0C9CF01F009973 :109B20000C9C1B9BF01F0098581CC0802F2DDC3A0A :109B3000BA97BA87FAC6FFFECF4B029CF01F00937C :109B40001892581CCF41029A089B0E9CF01F00905F :109B50001890C580E6C7FFE8E6C6FE08EF3A002089 :109B6000E1380020F4081800E08000A02C470C37F2 :109B7000CF6130070E950E9B009CF01F0086E136EA :109B800000381897CD40585CE08000C2E08B00B9E7 :109B9000583CE08000B4584CC020300CF01F007ED0 :109BA0003048F0061800E08000A83054E80618009D :109BB000E08000983028F0061800E080009A300C11 :109BC000F01F0076E8061800E080008F300CF01FD0 :109BD00000745837E08B007960F85818C710301CB3 :109BE000F01F0070300B4F0CF01F0070CA00F01F08 :109BF0000070581CC9C1E6F8020CA1B8E748020C75 :109C0000C7ABFAC5FFCE306A029B0A9CF01F005D0D :109C1000FAC6FFDE0C9CF01F00673FF81AD00C9BC1 :109C20001AD2310A1AD8204D1A9CF01F00630A9BE1 :109C3000202D306A1A9CF01F00600499209DE6CC0C :109C4000FDECFB380069FAEA0048FAE20050FB68D4 :109C50000021FAEB0000FB380068FAEA0058FAE34A :109C60000008FAE20060FAEB0010FAE30018FB6863 :109C70000020303A0098129B4C03F01F00502EED4C :109C80001895581CFE91FF54009BE6FC0214F01F2F :109C9000004C5BBCC620580CC3E1189BE6FC0214C8 :109CA000F01F00483FFCC27B0E9C009BF01F00464B :109CB000FE91FF5E6EB55805EA071700C5DB302C34 :109CC000F01F0038C90B5805FE90FF320A9AE13B9D :109CD0000020009CF01F003D3018E7480208C7DB59 :109CE000301CF01F002E301CF01F002DC73B302C05 :109CF000F01F002AC6CB303CCFCB301CC50B586CB4 :109D0000C080587CFE91FF4B308CC49B307CC47B60 :109D1000305CC45B344CF01F002E089A18960E9BE2 :109D2000F01F0018029B306AED640020ECCCFFDFCE :109D3000F01F001400991AD60A984A6A009B31CC89 :109D4000F01F00252FFD580CC0E0E6F8020C0A9C1D :109D5000A1B8E748020CCCFA009BE6FC0214F01F05 :109D60000019CC8A189BE6FC0214F01F00160C9C0C :109D7000F01F001A3FFCCBFA000077AC800210FC09 :109D8000800091DC800178BC800179788001914C61 :109D900080019A3880015F60800163488001639C84 :109DA00080017A1080018F208001FD408001F3A0A6 :109DB000800177C08002E73680020BFC80020A70C7 :109DC00080020B408000917C800214708000920021 :109DD00080019E0080016E78800091E8D401202DE2 :109DE000FACAFFF415D8BAD87409500915C8300B4F :109DF000BAC8169CF01F00022FEDD80280019AD835 :109E0000EBCD40E049F51697EAFC0214300BF01F49 :109E1000001EF01F001EEEC6FFDFEF3B00200C9A75 :109E20000E9CF01F001BC150EAF8020CA1D8202D97 :109E30000C9BEB48020C306A1A9CEF360020F01F96 :109E400000150C9B0E9CF01F00142FED581CC060D9 :109E5000EAF8020CEDB80001C0600E9CF01F000F84 :109E6000E3CD80E0301B300CF01F000D302B300CA8 :109E7000F01F000B0E9CF01F0009E3CD80E00000F6 :109E8000000077AC80020B40800196C88001914CA5 :109E90008002E73680019AD8800091E88001984CD2 :109EA000EBCD40E0202D18951697580CC0513FFC83 :109EB0002FEDE3CD80E0580BCFB0E04B0020FE9BB0 :109EC000FFF8FAC6FFFE306AE06B00FF0C9CF01F43 :109ED0000008306A202D0C9B1A9CF01F00060E9B78 :109EE0000A9CF01F00052FEDCE4B0000800091D0A2 :109EF0008002E73680019AD8EBCD408048B7EEF873 :109F000002045828C030E3CFC080F01F0009581C5D :109F1000F9BC0109EFF80083F9B90010F1D9E03874 :109F2000EFF80A83E3CD8080000077AC80020A84DA :109F3000D40148B9F338000A104CF36C000A7218C7 :109F40005808C0B05828C0803028726C9318301B55 :109F500072595D19D80AD80ADA0A0000000079C8D7 :109F60004828916B915C5EFC000079C8EBCD40C045 :109F7000203D5CBBBA89502B109714965CC85C8856 :109F80005807C0513FFC2FDDE3CD80C05C784959B4 :109F90005018B28C3048FAC9FFF8300A306B492C9F :109FA000F01F0012581CCEF11B89491A1898B48969 :109FB000306B1A99300A48FCF01F000C581CCE3147 :109FC00048D8300AB007306B304848CCFA0800094E :109FD000F01F0006581CCD7148989146CD5B0000DB :109FE00000007A288003B8108001776C0000025CC2 :109FF0008003B8180000025E8003B820000079C812 :10A00000EBCD40C030074A161AD78D078D17ED6784 :10A010000008ED670009ED67000A8D378D470E983F :10A020000E9949BA0E9B302CF01F001A2FFD580CC8 :10A03000C0413FFCE3CD80C01AD70E980E99496A03 :10A040000E9B304CF01F00132FFD580CCF301AD749 :10A050000E980E99491A0E9B32ECF01F000E2FFD40 :10A06000580CCE8031483019E06A138830AB0E9C12 :10A07000F01F000B581CCDE10E9BECCCFFF4F01F41 :10A080000009581CCD71CD7B000079C88001A0F07B :10A0900080016E788001A1A08001A0A480019F6C46 :10A0A000800144F8D401F01F000E48EA74085838C3 :10A0B000C12030289508F539000A3008F009180049 :10A0C000C020D8023018300B9518487C487AF01F11 :10A0D0000008D80230089508D80200008001DA365E :10A0E000000079C88001DA5880018E348001EF20A9 :10A0F000EBCD408048973018EF6800086E4958094A :10A10000C0A0308CF01F00066E4C3009485A6E3BE0 :10A11000F01F0005E3CD8080000079C880019F30EA :10A120008001A1CC80014558D4014989F80C11FF68 :10A13000F338000A106CF36C000AC1E1F33800092F :10A14000F8081800C19072185808C161F338000867 :10A15000F8081800C06072085808C0F05818C0C04D :10A160003018300B931848AA48ACF01F000B300B86 :10A17000331CF01F000AD802301B485A930B488C3E :10A18000F01F0005D8020000000079C880018E345D :10A190008001DA588001EF2080016D6C8001DA8443 :10A1A000EBCD404048766C3CF01F0007308CF01F30 :10A1B000000730083009ED6800088D09E3CD8040C4 :10A1C000000079C8800145308001A128D401308C7D :10A1D000F01F0002D80A00008001A128EBCD4080CA :10A1E00048E76E185828C030E3CD80806E58300B99 :10A1F0006E6C5D18300B8F1B4899F2FA0324F2F84D :10A2000003201438C040169CF01F0006300B332C7E :10A21000F01F0005E3CD8080000079C8000084CCE9 :10A2200080018CE480016D6CEBCD40C018971696D0 :10A23000F01F0009C0C06E0C581CC0700C9B0E9C17 :10A24000F01F0006CF91302CE3CD80C03FDCE3CD82 :10A2500080C000008001462C80014636EBCD404096 :10A26000301818969908F01F00040C9CF01F00038A :10A27000E3CD80408001463280014634D401580C41 :10A28000C030F01F0002D80280014630D4013008EF :10A290009908F01F0002D8028001462ED401189EB2 :10A2A000580AC0C196199688F9D9C010103CC165EA :10A2B000F2C8FFFF973AB618D802581AC06096192C :10A2C000F2C8FFFFB618D802969996881039C0F4E4 :10A2D0007648F0090709B889CF3B1D897648F00C0C :10A2E0000B099619F2C8FFFFB618D8023008973844 :10A2F000B8889619F2C8FFFFB618D802EBCD408097 :10A300001897580AC1D1961C9689FDDCC010FCC86C :10A31000FFFF1238F7FA4A03F7F85004F1DEE508B8 :10A32000EFF95801F1F95E00EFFA5800F1FA5E0119 :10A33000F7FC5201F8C8FFFEB618E3CD8080581A2A :10A34000C070961CF8C8FFFEB618E3CD8080969AC0 :10A350009689F4C8FFFF1238C09476481408119902 :10A36000B889118AB89A961CCEEB30089738B8088D :10A37000961CF8C8FFFEB618E3CD8080EBCD408078 :10A38000189E169C580AC0F1961B9889EFDBC010E6 :10A39000EEC8FFFD1238C205F6C8FFFC993AB8189E :10A3A000E3CD8080581AC070981BF6C8FFFCB8181F :10A3B000E3CD8080969B9889F6C8FFFD1238C1C412 :10A3C000784A160A15B8BC8815A9BC991598BCA876 :10A3D0001589BCB9CEAB1DB8784A0E0AB4881DA940 :10A3E000B4991D98B4A81D89B4B9981BF6C8FFFC90 :10A3F000B818E3CD8080300899389D08981BF6C8BE :10A40000FFFCB818E3CD8080EBCD4068189316951B :10A410001496F01F000C0C9A0A9BE6CCFFFFF01F6D :10A4200000090C9A0A9BE6CCFFFEF01F00060C9A6E :10A430000A9BE6CCFFFDF01F0003E3CD806800001F :10A440008001A29CD4211697189596141496F01F9B :10A4500000080C9A0E9BEACCFFFEF01F00060BC80A :10A460005808F1D4E108EFF81C01D8228001A2FCC1 :10A470008001A408EBCD4068189316951496F01F40 :10A4800000060C9A0A9BE6CCFFFCF01F0003E3CD0C :10A49000806800008001A37CEBCD4068189316957E :10A4A0001496F01F00090C9A0A9BE6CCFFFCF01FE3 :10A4B00000070C9A0A9BE6CCFFFAF01F0004E3CDDC :10A4C000806800008001A37C8001A2FCEBCD406885 :10A4D000189316951496F01F000F0C9A0A9BE6CC61 :10A4E000FFFCF01F000D0C9A0A9BE6CCFFFBF01F4F :10A4F000000A0C9A0A9BE6CCFFFAF01F00070C9AA0 :10A500000A9BE6CCFFF9F01F0004E3CD8068000051 :10A510008001A37C8001A29CEBCD40681893169526 :10A520001496F01F000C0C9A0A9BE6CCFFFCF01F5F :10A53000000A0C9A0A9BE6CCFFFAF01F00080C9A5E :10A540000A9BE6CCFFF9F01F0005E3CD8068000010 :10A550008001A37C8001A2FC8001A29CEBCD40681D :10A56000189316951496F01F00150C9A0A9BE6CCCA :10A57000FFFCF01F00120C9A0A9BE6CCFFF8F01FBC :10A5800000100C9A0A9BE6CCFFF6F01F000D0C9A07 :10A590000A9BE6CCFFF4F01F00090C9A0A9BE6CC5C :10A5A000FFF0F01F00070C9A0A9BE6CCFFEEF01FAD :10A5B0000004E3CD806800008001A37C8001A2FC40 :10A5C000EBCD4068189316951496F01F00090C9A6D :10A5D0000A9BE6CCFFFCF01F00060C9A0A9BE6CC17 :10A5E000FFF8F01F0003E3CD806800008001A37C2A :10A5F000EBCD4068189316951496F01F00060C9A40 :10A600000A9BE6CCFFFCF01F0003E3CD806800004E :10A610008001A37CEBCD4068189316951496F01F2B :10A62000000C0C9A0A9BE6CCFFFCF01F00090C9A68 :10A630000A9BE6CCFFF8F01F00060C9A0A9BE6CCBA :10A64000FFF4F01F0003E3CD806800008001A37CCD :10A65000EBCD4068189316951496F01F00330C9AB2 :10A660000A9BE6CCFFFCF01F00300C9A0A9BE6CC5C :10A67000FFF8F01F002D0C9A0A9BE6CCFFF4F01FA8 :10A68000002B0C9A0A9BE6CCFFF2F01F00280C9AD4 :10A690000A9BE6CCFFF0F01F00250C9A0A9BE6CC43 :10A6A000FFEEF01F00220C9A0A9BE6CCFFECF01F95 :10A6B000001F0C9A0A9BE6CCFFEAF01F001C0C9AC4 :10A6C0000A9BE6CCFFE8F01F00190C9A0A9BE6CC27 :10A6D000FFE6F01F00160C9A0A9BE6CCFFE4F01F81 :10A6E00000130C9A0A9BE6CCFFE2F01F00110C9AB3 :10A6F0000A9BE6CCFFE1F01F000E0C9A0A9BE6CC09 :10A70000FFE0F01F00090C9A0A9BE6CCFFDCF01F6B :10A7100000060C9A0A9BE6CCFFD8F01F0005E3CD9B :10A72000806800008001A37C8001A2FC8001A29CC3 :10A73000EBCD4068189316951496F01F00120C9AF2 :10A740000A9BE6CCFFFCF01F00100C9A0A9BE6CC9B :10A75000FFFBF01F000D0C9A0A9BE6CCFFFAF01FDE :10A76000000A0C9A0A9BE6CCFFF9F01F00070C9A2E :10A770000A9BE6CCFFF8F01F0004E3CD80680000E0 :10A780008001A37C8001A29CEBCD406818931695B4 :10A790001496F01F00060C9A0A9BE6CCFFFCF01FF3 :10A7A0000003E3CD806800008001A37CEBCD40680E :10A7B000189316951496F01F00060C9A0A9BE6CC87 :10A7C000FFFCF01F0003E3CD806800008001A37C44 :10A7D000EBCD4068189316951496F01F00060C9A5E :10A7E0000A9BE6CCFFFCF01F0003E3CD806800006D :10A7F0008001A37CEBCD4068189316951496F01F4A :10A8000000060C9A0A9BE6CCFFFCF01F0003E3CD88 :10A81000806800008001A37CEBCD406818931695FA :10A820001496F01F00060C9A0A9BE6CCFFFCF01F62 :10A830000003E3CD806800008001A37CEBCD40687D :10A84000189316951496F01F00060C9A0A9BE6CCF6 :10A85000FFFCF01F0003E3CD806800008001A37CB3 :10A86000EBCD4068189316951496F01F00060C9ACD :10A870000A9BE6CCFFFCF01F0003E3CD80680000DC :10A880008001A37CEBCD4068189316951496F01FB9 :10A8900000060C9A0A9BE6CCFFFCF01F0003E3CDF8 :10A8A000806800008001A37CEBCD4068189316956A :10A8B0001496F01F00060C9A0A9BE6CCFFFCF01FD2 :10A8C0000004E3CD806800008001A37C8001A650D5 :10A8D000EBCD4068189316951496F01F00060C9A5D :10A8E0000A9BE6CCFFFCF01F0003E3CD806800006C :10A8F0008001A37CEBCD4068189316951496F01F49 :10A9000000090C9A0A9BE6CCFFFCF01F00060C9A8B :10A910000A9BE6CCFFF8F01F0003E3CD806800003F :10A920008001A37CEBCD4068189316951496F01F18 :10A9300000060C9A0A9BE6CCFFFCF01F0003E3CD57 :10A94000806800008001A37CEBCD406818931695C9 :10A950001496F01F00090C9A0A9BE6CCFFFCF01F2E :10A9600000060C9A0A9BE6CCFFF8F01F0003E3CD2B :10A97000806800008001A37CEBCD40681893169599 :10A980001496F01F00090C9A0A9BE6CCFFFCF01FFE :10A9900000060C9A0A9BE6CCFFF8F01F0003E3CDFB :10A9A000806800008001A37CEBCD40681893169569 :10A9B0001496F01F00060C9A0A9BE6CCFFFCF01FD1 :10A9C0000003E3CD806800008001A37CEBCD4068EC :10A9D000189316951496F01F00090C9A0A9BE6CC62 :10A9E000FFFCF01F00060C9A0A9BE6CCFFF8F01F54 :10A9F0000003E3CD806800008001A37CEBCD4068BC :10AA0000189316951496F01F00060C9A0A9BE6CC34 :10AA1000FFFCF01F0003E3CD806800008001A37CF1 :10AA2000EBCD4068189316951496F01F00090C9A08 :10AA30000A9BE6CCFFFCF01F00060C9A0A9BE6CCB2 :10AA4000FFF8F01F0003E3CD806800008001A37CC5 :10AA5000EBCD4068189316951496F01F00090C9AD8 :10AA60000A9BE6CCFFFCF01F00060C9A0A9BE6CC82 :10AA7000FFF8F01F0003E3CD806800008001A37C95 :10AA8000EBCD4068189316951496F01F00060C9AAB :10AA90000A9BE6CCFFFCF01F0003E3CD80680000BA :10AAA0008001A37CEBCD4068189316951496F01F97 :10AAB00000060C9A0A9BE6CCFFFCF01F0003E3CDD6 :10AAC000806800008001A37CEBCD40681893169548 :10AAD0001496F01F00060C9A0A9BE6CCFFFCF01FB0 :10AAE0000003E3CD806800008001A37CEBCD4068CB :10AAF000189316951496F01F00060C9A0A9BE6CC44 :10AB0000FFFCF01F0004E3CD806800008001A37CFF :10AB10008001A29CEBCD4068189316951496F01F07 :10AB200000060C9A0A9BE6CCFFFCF01F0004E3CD64 :10AB3000806800008001A37C8001D434EBCD4068A4 :10AB4000189316951496F01F00330C9A0A9BE6CCC6 :10AB5000FFDEF01F00310C9A0A9BE6CCFFD4F01FF9 :10AB6000002F0C9A0A9BE6CCFFC2F01F002D0C9A16 :10AB70000A9BE6CCFFBFF01F002B0C9A0A9BE6CC89 :10AB8000FFBCF01F00290C9A0A9BE6CCFFB0F01F17 :10AB900000270C9A0A9BE6CCFFACF01F00250C9A0C :10ABA0000A9BE6CCFFA4F01F00230C9A0A9BE6CC7C :10ABB000FF9CF01F00210C9A0A9BE6CCFF98F01F27 :10ABC000001F0C9A0A9BE6CCFF8CF01F001D0C9A0C :10ABD0000A9BE6CCFF72F01F001B0C9A0A9BE6CC86 :10ABE000FF68F01F00190C9A0A9BE6CCFF44F01F87 :10ABF00000170C9A0A9BE6CCFF50F01F00150C9A28 :10AC00000A9BE6CCFF30F01F0013E3CD8068000004 :10AC10008001D3448001D2DC8001D2748001CAF863 :10AC20008001C9D88001D8608001CA688001CA9CAF :10AC30008001CA0C8001C9A48001D4348001CDB444 :10AC40008001CE848001D5588001D6B08001D4E443 :10AC50008001CFFCEBCD4068189316951496F01F39 :10AC6000000F0C9A0A9BE6CCFFFCF01F000D0C9A1B :10AC70000A9BE6CCFFFAF01F000B0C9A0A9BE6CC6D :10AC8000FFF9F01F00080C9A0A9BE6CCFFF8F01FB2 :10AC90000006E3CD806800008001A37C8001A2FC57 :10ACA0008001A29C8001AB3CEBCD406C14951296C8 :10ACB00018921693E06A00DC129B0A9CF01F001A9F :10ACC000ECC9FF98EACAFF98069B049CF01F001786 :10ACD000ECC9FFBCEACAFFBC069B049CF01F001431 :10ACE000ECC9FF68EACAFF68069B049CF01F0011CC :10ACF000ECC9FF50EACAFF50069B049CF01F000EEF :10AD0000ECC9FF44EACAFF44069B049CF01F000BF9 :10AD1000ECC9FF30EACAFF30069B049CF01F000814 :10AD2000E3CD806C8002E7368001D1588001D24C9F :10AD30008001D1E88001D1C08001D21C8001CF9C6C :10AD4000EBCD40EC1296F2E80000F4E90000ECE8EC :10AD50000008F4E90008ECE20010F4E30010ECE86D :10AD6000001814971695F4E90018E06B00E85D15DB :10AD70008F7CC0D030CA6C7BF01F00066E7A6C7975 :10AD8000149C0A9B2F492F4AF01F0003E3CD80EC4F :10AD9000800091DC8001ACA8EBCD40C014971696E2 :10ADA00074385808C160949E948AF60E00081438CE :10ADB000F5DEE916F9B80900EFF89A03580CC090CF :10ADC0005809C0C1189B0C9A6E4C1C0CF01F000A4D :10ADD0008E180C08AE18E3CD80C05819CFA16E4B69 :10ADE0000C9A1C0BF01F00048E180C08AE18E3CD53 :10ADF00080C00000800091DCEBCD40E016971496F7 :10AE00001895581AC0B0F01F000C0C99189B0E9A98 :10AE10000A9CF01F000AE3CD80E09698968614996C :10AE20001016169A0C9BF01F00053008EA060B0856 :10AE3000E3CD80E0800091B88001AD98EBCD406813 :10AE4000189316951496F01F00060C9A0A9BE6CCF0 :10AE5000FFFCF01F0004E3CD806800008001A37CAC :10AE60008001ADF8EBCD4068189316951496F01F4D :10AE700000060C9A0A9BE6CCFFFCF01F0004E3CD11 :10AE8000806800008001A37C8001ADF8EBCD4068B4 :10AE9000189316951496F01F000F0C9A0A9BE6CC97 :10AEA000FFFCF01F000C0C9A0A9BE6CCFFF8F01F89 :10AEB00000090C9A0A9BE6CCFFF4F01F00060C99DF :10AEC0000A9AE6CCFFF0320BF01F0003E3CD806856 :10AED0008001A37C8001AD98EBCD40681893169556 :10AEE0001496F01F000C0C9A0A9BE6CCFFFCF01F96 :10AEF00000090C9A0A9BE6CCFFF8F01F00060C999B :10AF00000A9AE6CCFFF4320BF01F0003E3CD806811 :10AF10008001A37C8001AD98EBCD40681893169515 :10AF20001496F01F000C0C9A0A9BE6CCFFFCF01F55 :10AF300000090C9A0A9BE6CCFFF8F01F00070C9959 :10AF40000A9AE6CCFFF7303BF01F0004E3CD80689F :10AF50008001A37C8001A29C8001AD98EBCD40686C :10AF6000189316951496F01F00180C9A0A9BE6CCBD :10AF7000FFFCF01F00150C9A0A9BE6CCFFF8F01FAF :10AF800000120C9A0A9BE6CCFFF4F01F000F0C9AFB :10AF90000A9BE6CCFFF0F01F000C0C9A0A9BE6CC53 :10AFA000FFECF01F000A0C9A0A9BE6CCFFEAF01FA8 :10AFB00000080C990A9AE6CCFFE9303BF01F000527 :10AFC000E3CD80688001A37C8001A2FC8001A29C6B :10AFD0008001AD98EBCD4068189316951496F01F3C :10AFE00000280C9A0A9BE6CCFFFCF01F00250C9A67 :10AFF0000A9BE6CCFFF8F01F00220C9A0A9BE6CCD5 :10B00000FFF4F01F00200C9A0A9BE6CCFFF2F01F21 :10B01000001E0C9A0A9BE6CCFFF1F01F001B0C9A55 :10B020000A9BE6CCFFF0F01F00180C9A0A9BE6CCB6 :10B03000FFEFF01F00150C9A0A9BE6CCFFEEF01F05 :10B0400000120C990A9AE6CCFFED306BF01F000F4E :10B050000C9A0A9BE6CCFFE7F01F000B0C9A0A9BA8 :10B06000E6CCFFE6F01F00080C990A9AE6CCFFE553 :10B07000320BF01F0006E3CD806800008001A37C46 :10B080008001A2FC8001A29C8001AD98EBCD4068BC :10B09000189316951496F01F00150C9A0A9BE6CC8F :10B0A000FFFCF01F00120C9A0A9BE6CCFFF8F01F81 :10B0B000000F0C9A0A9BE6CCFFF4F01F000C0C9AD0 :10B0C0000A9BE6CCFFF0F01F000A0C9A0A9BE6CC24 :10B0D000FFEEF01F00080C990A9AE6CCFFED303B1A :10B0E000F01F0005E3CD80688001A37C8001A2FCF5 :10B0F0008001A29C8001AD98EBCD40681893169515 :10B100001496F01F00120C9A0A9BE6CCFFFCF01F6D :10B1100000100C9A0A9BE6CCFFFBF01F000D0C9967 :10B120000A9AE6CCFFFA302BF01F000A0C9A0A9B11 :10B13000E6CCFFF8F01F00050C9A0A9BE6CCFFF462 :10B14000F01F0002E3CD80688001A37C8001A29CF7 :10B150008001AD98EBCD4068189316951496F01FBA :10B1600000120C9A0A9BE6CCFFFCF01F00100C9A10 :10B170000A9BE6CCFFFBF01F000D0C990A9AE6CC67 :10B18000FFFA302BF01F000A0C9A0A9BE6CCFFF85E :10B19000F01F00050C9A0A9BE6CCFFF4F01F00029A :10B1A000E3CD80688001A37C8001A29C8001AD98E2 :10B1B000EBCD4068189316951496F01F000C0C9A6E :10B1C0000A9BE6CCFFFCF01F000A0C9A0A9BE6CC17 :10B1D000FFFBF01F00070C990A9AE6CCFFFA302B10 :10B1E000F01F0004E3CD80688001A37C8001A29C55 :10B1F0008001AD98EBCD4068189316951496F01F1A :10B2000000090C9A0A9BE6CCFFFCF01F00070C9982 :10B210000A9AE6CCFFFB303BF01F0004E3CD8068C8 :10B220008001A37C8001A29C8001AD98EBCD406899 :10B23000189316951496F01F00090C9A0A9BE6CCF9 :10B24000FFFCF01F00070C990A9AE6CCFFFB303B8D :10B25000F01F0004E3CD80688001A37C8001A29CE4 :10B260008001AD98EBCD4068189316951496F01FA9 :10B2700000090C9A0A9BE6CCFFFCF01F00070C9912 :10B280000A9AE6CCFFFB303BF01F0004E3CD806858 :10B290008001A37C8001A29C8001AD98EBCD406829 :10B2A000189316951496F01F000C0C9A0A9BE6CC86 :10B2B000FFFCF01F00090C9A0A9BE6CCFFF8F01F78 :10B2C00000070C990A9AE6CCFFF7303BF01F000408 :10B2D000E3CD80688001A37C8001A29C8001AD98B1 :10B2E000EBCD4068189316951496F01F000C0C9A3D :10B2F0000A9BE6CCFFFCF01F00090C9A0A9BE6CCE7 :10B30000FFF8F01F00070C990A9AE6CCFFF7303BD4 :10B31000F01F0004E3CD80688001A37C8001A29C23 :10B320008001AD98EBCD4068189316951496F01FE8 :10B33000000C0C9A0A9BE6CCFFFCF01F00090C9A4B :10B340000A9BE6CCFFF8F01F00070C990A9AE6CC9E :10B35000FFF7303BF01F0004E3CD80688001A37C41 :10B360008001A29C8001AD98EBCD406818931695A2 :10B370001496F01F000C0C9A0A9BE6CCFFFCF01F01 :10B3800000090C9A0A9BE6CCFFF8F01F00070C9905 :10B390000A9AE6CCFFF7303BF01F0004E3CD80684B :10B3A0008001A37C8001A29C8001AD98EBCD406818 :10B3B000189316951496F01F00090C9A0A9BE6CC78 :10B3C000FFFCF01F00070C990A9AE6CCFFFB303B0C :10B3D000F01F0004E3CD80688001A37C8001A29C63 :10B3E0008001AD98EBCD4068169514961893F01F28 :10B3F00000220C990A9AE6CCFFFC308BF01F001F4C :10B400000C9A0A9BE6CCFFF4F01F001B0C9A0A9BD7 :10B41000E6CCFFF0F01F00180C9A0A9BE6CCFFEC7C :10B42000F01F00150C9A0A9BE6CCFFE8F01F0012F3 :10B430000C9A0A9BE6CCFFE4F01F000F0C9A0A9BC3 :10B44000E6CCFFE0F01F000E0C9A0A9BE6CCFFDE74 :10B45000F01F000B0C9A0A9BE6CCFFDCF01F0008E3 :10B460000C990A9AE6CCFFDA302BF01F0004E3CDEA :10B47000806800008001A37C8001AD988001A2FC5F :10B48000EBCD4068189316951496F01F00090C9A9E :10B490000A9BE6CCFFFCF01F00070C990A9AE6CC49 :10B4A000FFFB303BF01F0004E3CD80688001A37CEC :10B4B0008001A29C8001AD98EBCD40681695149652 :10B4C0001893F01F00060C990A9AE6CCFFFC308B0B :10B4D000F01F0003E3CD80688001A37C8001AD985C :10B4E000EBCD4068189316951496F01F00090C9A3E :10B4F0000A9BE6CCFFFCF01F00070C990A9AE6CCE9 :10B50000FFFB303BF01F0004E3CD80688001A37C8B :10B510008001A29C8001AD98EBCD406818931695F0 :10B520001496F01F00100C9A0A9BE6CCFFFCF01F4B :10B53000000E0C990A9AE6CCFFFB306BF01F000B53 :10B540000A9AE6CCFFF50C99306BF01F00080C9AB4 :10B550000A9BE6CCFFEFF01F0004E3CD80680000FB :10B560008001A37C8001A29C8001AD98EBCD406856 :10B57000169514961893F01F000C0C990A9AE6CCB5 :10B58000FFFC306BF01F00090C9A0A9BE6CCFFF61B :10B59000F01F00070C9A0A9BE6CCFFF5F01F000491 :10B5A000E3CD80688001A37C8001AD988001A29CDE :10B5B000EBCD4068169514961893F01F000D0C996A :10B5C0000A9AE6CCFFFC306BF01F000A0A9AE6CC20 :10B5D000FFF60C99302BF01F00070C9A0A9BE6CC63 :10B5E000FFF4F01F0005E3CD806800008001A37C1C :10B5F0008001AD988001AB3CEBCD40681695149668 :10B600001893F01F000D0C990A9AE6CCFFFC306BE2 :10B61000F01F000A0A9AE6CCFFF60C99302BF01FB7 :10B6200000070C9A0A9BE6CCFFF4F01F0005E3CD5F :10B63000806800008001A37C8001AD988001AB3C54 :10B64000EBCD4068169514961893F01F00100C99D6 :10B650000A9AE6CCFFFC306BF01F000D0C9A0A9B97 :10B66000E6CCFFF6F01F000B0C9A0A9BE6CCFFF429 :10B67000F01F00080C990A9AE6CCFFF2302BF01F5D :10B680000004E3CD806800008001A37C8001AD98B8 :10B690008001A2FCEBCD4068169514961893F01F1C :10B6A000000A0C990A9AE6CCFFFC306BF01F0007E9 :10B6B0000C990A9AE6CCFFF6302BF01F0004E3CD7C :10B6C000806800008001A37C8001AD98EBCD4068CC :10B6D000169514961893F01F000A0C990A9AE6CC56 :10B6E000FFFC306BF01F00070C990A9AE6CCFFF6BE :10B6F000302BF01F0004E3CD806800008001A37CA4 :10B700008001AD98EBCD4068189316951496F01F04 :10B7100000220C9A0A9BE6CCFFFCF01F00200C9A3A :10B720000A9BE6CCFFFAF01F001D0C9A0A9BE6CCA0 :10B73000FFF8F01F001A0C990A9AE6CCFFF6306B5E :10B74000F01F00170C9A0A9BE6CCFFF0F01F0015C3 :10B750000C9A0A9BE6CCFFEFF01F00120C990A9A94 :10B76000E6CCFFEE302BF01F000E0C9A0A9BE6CCC5 :10B77000FFECF01F00090C9A0A9BE6CCFFE8F01FD3 :10B7800000060C9A0A9BE6CCFFE4F01F0007E3CD0D :10B79000806800008001A37C8001A2FC8001AD983C :10B7A0008001A29C8001AB3CEBCD406816951496BD :10B7B0001893F01F000C0C990A9AE6CCFFFC306B32 :10B7C000F01F00090C9A0A9BE6CCFFF6F01F000759 :10B7D0000C9A0A9BE6CCFFF5F01F0004E3CD8068CD :10B7E0008001A37C8001AD988001A29CEBCD4068D4 :10B7F000169514961893F01F000C0C990A9AE6CC33 :10B80000FFFC306BF01F00090C9A0A9BE6CCFFF698 :10B81000F01F00070C9A0A9BE6CCFFF5F01F00040E :10B82000E3CD80688001A37C8001AD988001A29C5B :10B83000EBCD4068189316951496F01F00120C9AE1 :10B840000A9BE6CCFFFCF01F00100C9A0A9BE6CC8A :10B85000FFFAF01F000D0C9A0A9BE6CCFFF8F01FD0 :10B86000000A0A9AE6CCFFF60C99306BF01F00072D :10B870000C9A0A9BE6CCFFF0F01F0005E3CD806830 :10B880008001A37C8001A2FC8001AD988001AB3CCB :10B89000EBCD4068189316951496F01F00100C9A83 :10B8A0000A9BE6CCFFFCF01F000E0C9A0A9BE6CC2C :10B8B000FFFAF01F000B0C990A9AE6CCFFF8306BE8 :10B8C000F01F00080C990A9AE6CCFFF2302BF01F0B :10B8D0000005E3CD806800008001A37C8001A2FC0C :10B8E0008001AD98EBCD4068189316951496F01F23 :10B8F00000090C9A0A9BE6CCFFFFF01F00060C998A :10B900000A9AE6CCFFFE302BF01F0003E3CD8068DF :10B910008001A29C8001AD98EBCD406816951496ED :10B920001893F01F00130C990A9AE6CCFFFF306BB6 :10B93000F01F00100C9A0A9BE6CCFFF9F01F000CD8 :10B940000C9A0A9BE6CCFFF8F01F00090A9AE6CC95 :10B95000FFF70C99306BF01F00070C9A0A9BE6CC9E :10B96000FFF1F01F0003E3CD806800008001A29C7E :10B970008001AD98EBCD4068189316951496F01F92 :10B9800000060C9A0A9BE6CCFFFCF01F0004E3CDF6 :10B99000806800008001A37C8001B918EBCD40686D :10B9A0001696149518931499169A306BF01F000888 :10B9B0000A9A0C9BE6CCFFFAF01F00060A9A0C9B31 :10B9C000E6CCFFF9F01F0003E3CD80688001AD985D :10B9D0008001A29CEBCD4068189316951496F01F39 :10B9E00000060C9A0A9BE6CCFFFCF01F0004E3CD96 :10B9F000806800008001A37C8001B99CEBCD406889 :10BA0000189316951496F01F00090C9A0A9BE6CC21 :10BA1000FFFFF01F00060C990A9AE6CCFFFE306B80 :10BA2000F01F0003E3CD80688001A29C8001AD98E7 :10BA3000EBCD4068189316951496F01F00060C9AEB :10BA40000A9BE6CCFFFCF01F0004E3CD80680000F9 :10BA50008001A37C8001B9FCD4011499169A308B23 :10BA6000F01F0002D80200008001AD98EBCD4068C5 :10BA7000169514961893F01F00090A9AE6CCFFFC5D :10BA80000C99306BF01F00060C9A0A9BE6CCFFF66F :10BA9000F01F0004E3CD80688001A37C8001AD9895 :10BAA0008001A2FCEBCD4068189316951496F01F08 :10BAB00000090C9A0A9BE6CCFFFCF01F00070C99CA :10BAC0000A9AE6CCFFFB303BF01F0004E3CD806810 :10BAD0008001A37C8001A29C8001AD98D4011499BF :10BAE000169A320BF01F0002D80200008001AD98B8 :10BAF000EBCD4068189316951496F01F00180C9A19 :10BB00000A9BE6CCFFE0F01F00160C9A0A9BE6CCDD :10BB1000FFDEF01F00140C9A0A9BE6CCFFDDF01F3D :10BB200000110C990A9AE6CCFFDC306BF01F000E76 :10BB30000C9A0A9BE6CCFFD6F01F000C0C9A0A9BCD :10BB4000E6CCFFCEF01F00070C9A0A9BE6CCFFCD97 :10BB5000F01F0004E3CD80688001BADC8001A2FC04 :10BB60008001A29C8001AD988001BA58EBCD40685D :10BB7000189316951496F01F00060C9A0A9BE6CCB3 :10BB8000FFFCF01F0004E3CD806800008001A37C6F :10BB90008001BAF0D4011499169A303BF01F0002CC :10BBA000D80200008001AD98EBCD40E018971695C3 :10BBB0001496F01F000D6E1C580CC0800C990A9A48 :10BBC0006E0BF01F000AE3CD80E05816C0918A99F1 :10BBD0006A4812088F186E098A181208AA18E3CD4D :10BBE00080E000008001A37C8001AD98EBCD40682F :10BBF000189316951496F01F00060C9A0A9BE6CC33 :10BC0000FFFCF01F0004E3CD806800008001A37CEE :10BC10008001BBA8EBCD4068189316951496F01FD1 :10BC200000100C9A0A9BE6CCFFFCF01F000E0C994A :10BC30000A9AE6CCFFFB303BF01F000B0A9AE6CCD9 :10BC4000FFF80C99308BF01F00080C9A0A9BE6CC89 :10BC5000FFF0F01F0006E3CD806800008001A37CA8 :10BC60008001A29C8001AD988001BBA8EBCD40680B :10BC7000169514961893F01F00090A9AE6CCFFFC5B :10BC80000C99308BF01F00060C9A0A9BE6CCFFF44F :10BC9000F01F0004E3CD80688001A37C8001AD9893 :10BCA0008001BBA8EBCD40801697189B580AC0F1C5 :10BCB0008E1C8E89FDDCC010FCC8FFF91238C285CD :10BCC000F8C8FFF88F3AAE18E3CD8080581AC070DC :10BCD0008E1CF8C8FFF8AE18E3CD80808E9A8E894E :10BCE000F4C8FFF91238C2C46E48140811F9B889B3 :10BCF00011EAB89A11D9B8A911CAB8BA11B9B8C914 :10BD000011AAB8DA1199B8E9118AB8FACE2B17F846 :10BD10006E4A1C0AB48817E9B49917D8B4A817C991 :10BD2000B4B917B8B4C817A9B4D91798B4E8178923 :10BD3000B4F98E1CF8C8FFF8AE18E3CD8080300B44 :10BD4000308A8F3BF01F00028E1CCC4B800091D0BC :10BD5000EBCD4068189316951496F01F000C0C9AC2 :10BD60000A9BE6CCFFF8F01F000A0C9A0A9BE6CC6F :10BD7000FFF6F01F00070C9A0A9BE6CCFFF4F01FB9 :10BD80000005E3CD806800008001BCA48001A2FC16 :10BD90008001AB3CEBCD40F8206D169714961499BA :10BDA0001895169A306BF01F002D0C9A0E9BEACC5A :10BDB000FFFAF01F002B0C9A0E9BEACCFFF9F01F44 :10BDC00000280C9A0E9BEACCFFF8F01F00260C9A74 :10BDD0000E9BEACCFFF0F01F00240C9A0E9BEACCDD :10BDE000FFECF01F0021318A0E9B1A9CF01F001FF0 :10BDF000EAC3FFE81A940C9A1A9B069CF01F001ADB :10BE00005816C1801A9B0C9A6A7CF01F00199A98E8 :10BE10008E992048F00901098B690C9A069C0E9BAB :10BE2000F01F00116A698E181208AE182FADE3CD0D :10BE300080F86A698E182FC81208E06B00E8BA080B :10BE40006E5CF01F000C8B7CCF20505C1A9B0C9A10 :10BE5000F01F0007CE3B00008001AD988001A29C3E :10BE60008001BCA48001A37C800091DC8001BD50D6 :10BE70008001D3ECEBCD4068189316951496F01F13 :10BE800000120C9A0A9BE6CCFFFCF01F00100C9AE3 :10BE90000A9BE6CCFFFAF01F000D0C9A0A9BE6CC39 :10BEA000FFF8F01F00090C9A0A9BE6CCFFF4F01F84 :10BEB00000060C9A0A9BE6CCFFF0F01F0005E3CDCC :10BEC000806800008001A37C8001A2FC8001BD94F9 :10BED000EBCD40E0189716951496F01F000B0C9AC6 :10BEE0000A9BEECCFFFCF01F00090FD93008F009C7 :10BEF0001800C0700C9A0A9BEECCFFF8F01F0004EB :10BF0000E3CD80E08001A37C8001B8E48001BD9492 :10BF1000EBCD4060202D301A18951696FACCFFFE16 :10BF2000F01F00089A181BF92FE8F0090109AC0965 :10BF30001BCA8B5A1BD88B482FEDE3CD80600000C5 :10BF40008001A444EBCD40E07808975818971696E6 :10BF50007859E049003FE0880004E3CF80E0FEF834 :10BF6000029AF009032F78455815E0800127E04533 :10BF70000080CF41780C301AF01F00A1E3CF90E091 :10BF800078485808C391780C301AF01F009EE3CF10 :10BF900090E07848F0C90005E049008FFE9BFFDF84 :10BFA000FEF80264F009032F7848E0480081E08041 :10BFB000010CE08A002BE0480083E0800118E08556 :10BFC0000110E0480085CCA1780C301AF01F008FDA :10BFD000E3CF90E0780C301AF01F008DE3CF90E0B3 :10BFE0007848F0C90001E049009BFE9BFFB8FEF8CD :10BFF0000222F009032FE0480081CB01780C301AAF :10C00000F01F0085E3CF90E05848E08000E4E0486E :10C010000080CA41781A300B780CF01F00806E0C3B :10C020000C9B301AF01F007EE3CF90E0780C301AA2 :10C03000F01F007CE3CF90E0780C301AF01F007AFC :10C04000E3CF90E0780C301AF01F0078E3CF90E057 :10C05000780C301AF01F0076E3CF90E0780C301A9D :10C06000F01F0074E3CF90E0780C301AF01F0072DC :10C07000E3CF90E0780C301AF01F0070E3CF90E02F :10C08000780C301AF01F006EE3CF90E0780C301A75 :10C09000F01F006CE3CF90E0780C301AF01F006ABC :10C0A000E3CF90E0780C301AF01F0068E3CF90E007 :10C0B000780C301AF01F0066E3CF90E0780C301A4D :10C0C000F01F0064E3CF90E0780C301AF01F00629C :10C0D000E3CF90E0780C301AF01F0060E3CF90E0DF :10C0E000780C301AF01F005EE3CF90E0780C301A25 :10C0F000F01F005CE3CF90E0780C301AF01F005A7C :10C10000E3CF90E0780C301AF01F0058E3CF90E0B6 :10C11000780C301AF01F0056E3CF90E0780C301AFC :10C12000F01F0054E3CF90E0780C301AF01F00525B :10C13000E3CF90E0780C301AF01F0050E3CF90E08E :10C14000780C301AF01F004EE3CF90E0780C301AD4 :10C15000F01F004CE3CF90E0780C301AF01F004A3B :10C16000E3CF90E0780C301AF01F0048E3CF90E066 :10C17000780C301AF01F0046E3CF90E0780C301AAC :10C18000F01F0044E3CF90E0780C301AF01F00421B :10C19000E3CF90E0780C301AF01F0040E3CF90E03E :10C1A000780C301AF01F003EE3CF90E0780C301A84 :10C1B000F01F003CE3CF90E0780C0A9AF01F003AA1 :10C1C0000A9CE3CD80E0780C301AF01F0038E3CFF2 :10C1D00090E0780C301AF01F0036E3CF90E0780C36 :10C1E000301AF01F0034E3CF90E0780C301AF01FC3 :10C1F0000032E3CF90E000008003B8288001AAEC71 :10C200008001A4988003B9288001B3248001A37C15 :10C210008003BB688001A4CC800091D08001BC1455 :10C220008001BAA48001A4748001BA6C8001AC546E :10C230008001AA808001AE8C8001AAC88001AAA4D6 :10C240008001AA208001AF5C8001A9CC8001A9787F :10C250008001A9488001A8F48001A8D08001A884A9 :10C260008001A8608001B1548001B1B08001B1F4B7 :10C270008001A8188001AA508001B0F88001A83C74 :10C280008001A7F48001B4E08001B56C8001B5B0F5 :10C290008001B5F88001B6408001BED08001B5189C :10C2A0008001B9748001AE3C8001B3AC8001A6145A :10C2B0008001B3688001B2E0EBCD40C012971499C1 :10C2C0008E96109A582CC280E08A0008584CC360A1 :10C2D000587CC190E3CF80C0580CC0A0581CCFB18F :10C2E00058EBFE9BFFF9FEF80312F00B032F580BDF :10C2F000CF21129C0E9BF01F00C28E98F006010CFD :10C30000E3CD80C0202BE04B007FFE9BFFE5FEF8D5 :10C3100002F2F00B032F582BE080015DE089001A38 :10C32000580BC260581BCD71129C0E9BF01F00B6BB :10C330008E98F006010CE3CD80C0580BCCC1129C46 :10C340000E9BF01F00B28E98F006010CE3CD80C06A :10C35000584BC170E0850148585BCBD1129C0E9BB5 :10C36000F01F00AB8E98F006010CE3CD80C0129C4C :10C370000E9BF01F00A88E98F006010CE3CD80C044 :10C38000129C0E9BF01F00A48E98F006010CE3CDCA :10C3900080C0129C0E9BF01F00A18E98F006010C2D :10C3A000E3CD80C0129C0E9BF01F009D8E98F0067E :10C3B000010CE3CD80C0129C0E9BF01F009A8E985A :10C3C000F006010CE3CD80C0129C0E9BF01F00967E :10C3D0008E98F006010CE3CD80C0129C0E9BF01FDE :10C3E00000938E98F006010CE3CD80C0129C0E9B4A :10C3F000F01F008F8E98F006010CE3CD80C0129CD8 :10C400000E9BF01F008C8E98F006010CE3CD80C0CF :10C41000129C0E9BF01F00888E98F006010CE3CD55 :10C4200080C0129C0E9BF01F00858E98F006010CB8 :10C43000E3CD80C0129C0E9BF01F00818E98F00609 :10C44000010CE3CD80C0129C0E9BF01F007E8E98E5 :10C45000F006010CE3CD80C0129C0E9BF01F007A09 :10C460008E98F006010CE3CD80C0129C0E9BF01F4D :10C4700000778E98F006010CE3CD80C0129C0E9BD5 :10C48000F01F00738E98F006010CE3CD80C0129C63 :10C490000E9BF01F00708E98F006010CE3CD80C05B :10C4A000129C0E9BF01F006C8E98F006010CE3CDE1 :10C4B00080C0129C0E9BF01F00698E98F006010C44 :10C4C000E3CD80C0129C0E9BF01F00658E98F00695 :10C4D000010CE3CD80C0129C0E9BF01F00628E9871 :10C4E000F006010CE3CD80C0129C0E9BF01F005E95 :10C4F0008E98F006010CE3CD80C0129C0E9BF01FBD :10C50000005B8E98F006010CE3CD80C0129C0E9B60 :10C51000F01F00578E98F006010CE3CD80C0129CEE :10C520000E9BF01F00548E98F006010CE3CD80C0E6 :10C53000129C0E9BF01F00508E98F006010CE3CD6C :10C5400080C0129C0E9BF01F004D8E98F006010CCF :10C55000E3CD80C0129C0E9BF01F00498E98F00620 :10C56000010CE3CD80C0129C0E9BF01F00468E98FC :10C57000F006010CE3CD80C0129C0E9BF01F004220 :10C580008E98F006010CE3CD80C0129C0E9BF01F2C :10C59000003F8E98F006010CE3CD80C0129C0E9BEC :10C5A000F01F003B8E98F006010CE3CD80C0129C7A :10C5B0000E9BF01F00388E98F006010CE3CD80C072 :10C5C000129C0E9BF01F00348E98F006010CE3CDF8 :10C5D00080C0129C0E9BF01F00318E98F006010C5B :10C5E000E3CD80C0129C0E9BF01F002D8E98F006AC :10C5F000010CE3CD80C000008003BDD88001A49869 :10C600008003BE148001BC6C8001AE648001A5C0B3 :10C610008001B4B88001A5F08001B8308001B29CDF :10C620008001B6948001B6CC8001B9D48001BA30C3 :10C630008001BB6C8001B7048001B7EC8001BA6C4B :10C640008001B8908001BE748001A5188001A55CAE :10C650008001B7A88001A7308001A7888001AE8C37 :10C660008001AED88001A7D08001AB148001AF1843 :10C670008001A9FC8001A9A88001AFD48001A92470 :10C680008001B08C8001A8A88001B22C8001A7ACE9 :10C690008001B2648001BBEC8001B4808001B3E40E :10C6A000EBCD40FE208D306A18977853784578019D :10C6B000FAC2FFE6300B049CF01F00384B88F139BA :10C6C000010BE06AFFFFFB69001E300B1A9CF01F94 :10C6D0000035302A1A9B049CF01F0033029A302840 :10C6E0001A990A9B069CF01F00319A194B08F9D938 :10C6F000C0101188103CF9B60200F1DCE318E06AC2 :10C7000000FFF1DAE326EDD9E309FBF93C01F9D6A4 :10C71000E30C1A944A78118A580AC060F4C80001E0 :10C72000F9E80008C2918F3CF01F00238F2CC31042 :10C730006E3A300BF01F0019FB66001F6E2BFB6377 :10C74000001CFB65001D8E78F5D8C01020281A9CAF :10C75000FB58001AF01F0013049C1A9B300AF01FAC :10C7600000121A99029A0A9B069C3008F01F000FCB :10C770002F8DE3CF90FE9A18F4C90001F9E9000962 :10C78000F40901095C591208120CBA181206CCCB34 :10C790002F8DE3CD80FE0000800091D0000087F453 :10C7A0008001C7B88001A4448001C2B8000079E5C7 :10C7B000000079E48000920030083019B838B818C9 :10C7C000B828B80A3008994B993999285EFCD703E4 :10C7D000EBCD4068189316951496F01F00090C9A3B :10C7E0000A9BE6CCFFFFF01F00060C9A0A9BE6CCE2 :10C7F000FFFEF01F0004E3CD806800008001A29CD2 :10C800008001A2FCEBCD40681696149518931499FC :10C81000169A303BF01F00050A9A0C9BE6CCFFFDF0 :10C82000F01F0003E3CD80688001AD988001A29CD9 :10C83000EBCD40681696149518931499169A303BD0 :10C84000F01F00050A9A0C9BE6CCFFFDF01F0003C9 :10C85000E3CD80688001AD988001A29CD431FACEEE :10C86000FFDC189616971494129210907C157C0198 :10C87000581AC2D0C153582AC1300D893FF8F00967 :10C880001800C2100D98E2081900E08B0005E008BE :10C890001900C6E23FF83009AC88AC99D83A8E1836 :10C8A000AE383FF80D89F0091800C0D00C9C089AEA :10C8B0000E9BF01F0034089A0E9BECCCFFFFF01F7C :10C8C0000031CDCB3008300CAC98D83296285808BF :10C8D000C4C0B618AE3830088B08AC983FFAAC8AA2 :10C8E0008E198E08F2081900FE98FFEE1494ECC31E :10C8F000FFFFC1D8E8081800EDF41E000D9A8E184D :10C900008E89F408000B5C781019123AE089002631 :10C91000AE1B6A082FF88B080D89E8091800CB3187 :10C920008E198E08F2081900FE98FFCEAE39301A23 :10C930000E9B0C9CF01F0013301A0E9B069CF01FE0 :10C9400000110D88E4081800CD618E888E990D9A2B :10C950001218103AE08A000E3FF83009AC88AC9902 :10C960008E182028AE08C8AB9618B628CB4BDA3AFA :10C970006A0A6E293018F00A094810498F29C7EB56 :10C980008001A29CEBCD4040201D1A9E9AF65C7857 :10C990001ADE1AD6F01F00032FED2FFDE3CD8040E5 :10C9A0008001C85CEBCD40E0302818951AD8169667 :10C9B00014973069F01F00072FFD580CC0700E9AB5 :10C9C0000C9BEACCFFFEF01F0004E3CD80E00000EA :10C9D0008001C9848001A2FCEBCD40E0301818959D :10C9E0001AD81696149732A9F01F00072FFD580C7D :10C9F000C0700E9A0C9BEACCFFFEF01F0004E3CD42 :10CA000080E000008001C9848001A29CEBCD40E061 :10CA1000305818951AD8169614973029F01F001020 :10CA20002FFD580CC190EACCFFFE0E9A0C9BF01F14 :10CA3000000D0E9A0C9BEACCFFFCF01F000B0E9A27 :10CA40000C9BEACCFFFBF01F00080E9A0C9BEACC73 :10CA5000FFFAF01F0005E3CD80E000008001C984EB :10CA60008001A2FC8001A29CEBCD40E0301818951B :10CA70001AD8169614973039F01F00072FFD580C5E :10CA8000C0700E9A0C9BEACCFFFEF01F0004E3CDB1 :10CA900080E000008001C9848001A29CEBCD40E0D1 :10CAA000306818951AD8169614973049F01F001060 :10CAB0002FFD580CC190EACCFFFE0E9A0C9BF01F84 :10CAC000000D0E9A0C9BEACCFFFDF01F000A0E9A97 :10CAD0000C9BEACCFFFCF01F00080E9A0C9BEACCE2 :10CAE000FFFAF01F0005E3CD80E000008001C9845B :10CAF0008001A29C8001A2FCEBCD40E0301818958B :10CB00001AD81696149730A9F01F00072FFD580C5D :10CB1000C0700E9A0C9BEACCFFFEF01F0004E3CD20 :10CB200080E000008001C9848001A29CD43120BD36 :10CB30005019500818961697581AC390C272E06898 :10CB400000FDE06900DD1AD8300A3018F01F005CE3 :10CB50002FFD580CC1E0300A0E9BECCCFFFEF01FFD :10CB60000059300A0E9BECCCFFFDF01F0056300A36 :10CB70000E9BECCCFFFCF01F0053ECCCFFFB0E9B9C :10CB8000300AF01F0050301CC048582AC040301CEA :10CB90002F5DD83219893FF8F0091800E080008B2A :10CBA0009618301C2FA8B6182F5DD832761850581A :10CBB000B1485038760A504AF6E80008F8C2FFFE3D :10CBC000FAE90018F8C3FFFDF6EA0010F8C9FFFB08 :10CBD000FAEB0020F8C4FFFC50293FF5FAC0FFD85B :10CBE000E06100FDC0680D998E382FE81208AE286C :10CBF0001AD030181AD1E06900DD109A0E9B0C9CF7 :10CC0000F01F00312FED580CC4105805FBF5500AE9 :10CC1000FBF8400AF9B90401F1D9E408EBD8E405BE :10CC2000301A0E9B049CF01F0027301A0E9B069CA6 :10CC3000F01F0024301A0E9B089CF01F00220DA844 :10CC40003009F2081800CD010DB83509F2081800B6 :10CC5000CCB10DC83F29F2081800CC61301A0E9BE8 :10CC6000402CF01F00180DD84019F2081800CBC155 :10CC70004038301CAE28F80509496E2812488F2824 :10CC800040095809C8509305C84B4038FB58001458 :10CC9000FAE80020EEE90010FAEA0010EEEB0000DE :10CCA000FAE80018EEE90008AC9C3FF8AC882F5D6C :10CCB000D8323008B898300CC6CB00008001C98447 :10CCC0008001A29C8001C85CD431207D1895169704 :10CCD00014961293581AC110C0B2300830290C9A19 :10CCE0000E9B0A9CF01F0032C5712F9DD832582A26 :10CCF000CF50301C2F9DD83276185018760AF0008D :10CD00001410500A1A91F6E80008F8C4FFFAFAE97C :10CD100000083FF6F6EA0010FAC2FFE8FAEB00104E :10CD2000C1A85806FBF65006FBF84006F9B9040105 :10CD3000F1D9E408EDD8E406301A0E9B089CF01FE8 :10CD4000001D0BE8E6081800C1D00B998E382FE8BB :10CD50001208AE2804983029301A0E9B0A9CF01F46 :10CD60000014CE01BA20E2E80010EEE90010E2E87B :10CD70000000EEE90000E2EA0008EEEB00082F9D5B :10CD8000D83230186E29F006094AAE201449109C9A :10CD90008F292F9DD8320B982FF8EACCFFFA0C9AE6 :10CDA0000E9BAA98F01F0003301CCA5B8001CB2C9D :10CDB0008001A29CEBCD40EC206D301918971693A2 :10CDC0001495F01F002DC0412FADE3CD80ECEECCCB :10CDD000FFF90A9A069BF01F00290A9A069BEECCDF :10CDE000FFF8F01F00260A9A069BEECCFFF7F01F13 :10CDF00000230A9A069BEECCFFF6F01F00210A9A48 :10CE0000069BEECCFFF2F01F001E0A9A069BEECCAA :10CE1000FFEEF01F001B0A9A069BEECCFFEAF01F04 :10CE2000001858055F0858255F091248CCE06608CD :10CE30005008661886160A9A5018EBD8B010BA1522 :10CE4000E6E80008FAE900082026E6E20010E068BB :10CE500000FD0A16AE961A9BFAE300100E9C1AD833 :10CE6000E06900DD3018F01F00072FFD2FADE3CD86 :10CE700080EC00008001CCC88001A29C8001C7D05A :10CE80008001C984EBCD40EC206D18971693149562 :10CE9000582AC18119893FF8F0091800F9F91801D9 :10CEA000F7F81201F9BA0102F1DAE108F1D9E10863 :10CEB000F7F81C01F9B80000F9F80E012FADE3CD29 :10CEC00080EC3009F01F0019CFA0EECCFFF90A9AD0 :10CED000069BF01F00170A9A069BEECCFFF8F01F86 :10CEE00000145805CEC166085008661886160A9ABE :10CEF0005018EBD8B010BA15E6E80008FAE90008B7 :10CF00002026E6E20010E06800FD0A16AE961A9BA5 :10CF1000FAE300100E9C1AD8E06900DD3018F01F0B :10CF200000052FFDCCCB00008001CCC88001A29C65 :10CF30008001C984D42112951497580A5F095805B5 :10CF40005F08169A1248C2510B986E29F0C4FFFE72 :10CF5000F2C800015BD8E08B0015129C089B5D1A9B :10CF600018965806C0C06E086E192FF80809089A5E :10CF70000A9B8F088F190C9CF01F00080C9CD8226C :10CF8000089B5D1A300818968F2C8F188F08CEAB2F :10CF900030060C9CD8220000800091DCEBCD40FCD8 :10CFA00012951494580A5F0958055F0818921248A0 :10CFB0001693C191300995296A085808E08A00162D :10CFC00012966A270E99089A069B049CF01F000B84 :10CFD0002FF6EEF7FFF86A085807F7B701F80C3894 :10CFE000FE99FFF2E3CD80FCEAE80000F4E90000DE :10CFF0006A2A892AE3CD80FC8001CF34EBCD40FC46 :10D0000018931695581AC2C0C053582AC5E0E3CDEC :10D0100080FC782778085808FE9AFFFB7819580991 :10D02000FE9AFFF79698300612087649F208000437 :10D030000F9A0E9B2FEA1414089CF01F00332FF652 :10D04000EEF7FFF866085807F7B701F80C38FE99B5 :10D05000FFF166198A181208AA18E3CD80FC9628F9 :10D060005808C3C0B618F9D8B010AA3C300830121E :10D0700087088718872810948A1C8A0E189AFC0C37 :10D080001900C212F7DAC0106A46EC0B00081199B9 :10D09000F2C7FFFE5827C250F1DEC0101618103735 :10D0A000E0890020E40409496A2B2FF4F3EB00081F :10D0B000C1C0F4070008AA18F9D8B010189AFC0CDF :10D0C0001900CE13E3CD80FC781C580CFE9AFFA10A :10D0D00096181808B618E3CD80FC961CB62CCC6BBD :10D0E000AA0CFDDCB010CCBBF3EB1008069A8A99B1 :10D0F0008B28EC090009485B6A5CF01F00058A1A5E :10D100008A0ECD8B800091DC8001D3EC8001CF347E :10D11000EBCD40F83FF510941697149340661388B2 :10D12000EA081800C05130070E9CE3CD80F858047F :10D130005F1858065F991268CF700C9B5D1718979F :10D14000C0600C9A089BF01F0004CEFBA685A69C2D :10D15000CECB0000800091DCEBCD40C0129EF2E807 :10D160000000F4E9000014977C2A8F2A18961D8984 :10D17000169C3FF8F0091800C1401D993058F0097D :10D180001800E088000F2039E06A5556EA1A555514 :10D19000F20B141FF20A04481619F2090019C028EC :10D1A00030091AD9189B1C990C9C7C280E9AF01FE8 :10D1B00000042FFD8F2CE3CD80C000008001D11032 :10D1C000EBCD406CF2E20000F4E3000072289528F9 :10D1D0001495722813961AD6F01F00032FFD8B2C7E :10D1E000E3CD806C8001D110EBCD406FF2E2000006 :10D1F000F4E30000F2E00008F4E10008F2E20010BD :10D20000F4E300101495725813961AD6F01F000319 :10D210002FFD8B5CE3CD806F8001D110EBCD406F93 :10D22000F2E20000F4E30000F2E00008F4E100089C :10D23000724895481495724813961AD6F01F000349 :10D240002FFD8B4CE3CD806F8001D110EBCD406C76 :10D25000F2E20000F4E30000722895281495722889 :10D2600013961AD6F01F00032FFD8B2CE3CD806C94 :10D270008001D110D421310418971AD41696149530 :10D2800030183329F01F00142FFD580CC0B058057A :10D29000C0E18C986C4C0F9A100CEECBFFFEF01F87 :10D2A000000F0F998C181208AC18D8225815CFA16E :10D2B0000F9AE80A1800E08800073FF83009AE88A6 :10D2C000AE99CF0B8C986C4BEECCFFFE100BF01F81 :10D2D0000003CE8B8001C984800091DCD4213018FA :10D2E000189716961495308410991AD4F01F0014CC :10D2F0002FFD580CC0B05805C0E18C986C4C0F9AAB :10D30000100CEECBFFFEF01F000F0F998C181208C7 :10D31000AC18D8225815CFA10F9AE80A1800E08857 :10D3200000073FF83009AE88AE99CF0B8C986C4B54 :10D33000EECCFFFE100BF01F0003CE8B8001C984E2 :10D34000800091DCEBCD40E0320930081AD9189505 :10D35000169714961099F01F00132FFD580CC0F06B :10D360005806C0F18E986E4C0B9A100CEACBFFFE5B :10D37000F01F000D0B998E181208AE18E3CD80E057 :10D380005816CF918E986E4B0B9A100BEACCFFFE7D :10D39000F01F00050B998E181208AE18CF0B000075 :10D3A0008001C984800091ACD421201D7809189691 :10D3B000F2C800015BD8E08B0014F2C80008C0E09E :10D3C0001A943005C0280E98500870079105680C13 :10D3D000F01F00068D055807CF712FFDD8223008A9 :10D3E00099082FFDD8220000800091E8EBCD40C0C5 :10D3F00018971696F6CCFFF8F01F000DC130EEF826 :10D40000FFF8EEC900089908F8C7FFF8930C9916C1 :10D410000C9AE06B00FF0E9CF01F00060E9CE3CD03 :10D4200080C018970E9CE3CD80C000008000920061 :10D43000800091D0EBCD40FC32E818931AD81692B8 :10D44000149430683079F01F00232FFD580CC03140 :10D45000E3CD80FC089A049BE6CCFFFEF01F001E83 :10D4600007993058F0091800E088001F2039E06A59 :10D470005556EA1A5555F20B141FF20A0448F20BDE :10D4800001055814C18030060C972FF6662C0899B8 :10D490000E0C049A2FD7303BF01F00100C35FE996C :10D4A000FFF6E3CD80FC5814F9B80000E7F80A0253 :10D4B000E3CD80FCEA050017645C0E9BF01F0008BA :10D4C000872CCC700E9A300BF01F0006CDDB0000CD :10D4D0008001C9848001BB948001AD988001D3ECA8 :10D4E000800091D0D421189616951497582AC161BE :10D4F00019893FF8F0091800F9F91801F7F8120135 :10D50000F9BA0102F1DAE108F1D9E108F7F81C01F2 :10D51000F9B80000F9F80E01D82230083049F01FA0 :10D52000000CC0C00D98F0C400045817C0800E99BC :10D530000A9A089B6C2CF01F0007D822089B6A5C93 :10D54000F01F00058D2CCF41CF9B00008001CB2C1C :10D550008001AD988001D3ECEBCD40FC206D189498 :10D5600016951493582AC18119893FF8F0091800BB :10D57000F9F91801F7F81201F9BA0102F1DAE10834 :10D58000F1D9E108F7F81C01F9B80000F9F80E012B :10D590002FADE3CD80FC30083019F01F0040CF9054 :10D5A0006A1E501E6A0A500AEAE80008FAE90008F2 :10D5B000EAEA0010FAEB0010EDDEB0105813C600D6 :10D5C000E8C7FFFA0999ECC8FFFE12080E9CE5D8DF :10D5D000B010069A0A9BF01F00328A18E40819005E :10D5E000CD82069A0A9BE8CCFFF8F01F002E8A181D :10D5F000E4081900CCE2E8CCFFF4069A0A9BF01F7D :10D600000028685C88693008F0091900C0E01896A5 :10D6100030070C9C2FF7069A0A9BF01F00222FC69A :10D6200088E80E38FE99FFF78A18E4081900CB1233 :10D63000069AE8CCFFF20A9BF01F0019685888E9A7 :10D64000887AF009002C3008F00A1900C0E018961A :10D6500030070C9C2FF7069A0A9BF01F00132FC669 :10D6600088F80E38FE99FFF78A18E4081900C912E5 :10D67000069A0A9BE8CCFFF0F01F0009C8ABE8C788 :10D68000FFFA30EA300B0E9CF01F0008099B6A5C21 :10D69000F01F0007895CC97B8001CB2C8001A2FCB4 :10D6A0008001C8308001C804800091D08001D3EC93 :10D6B000EBCD40FC206D189416951493582AC18127 :10D6C00019893FF8F0091800F9F91801F7F8120163 :10D6D000F9BA0102F1DAE108F1D9E108F7F81C0121 :10D6E000F9B80000F9F80E012FADE3CD80FCE06839 :10D6F00000FF33091AD83008F01F00532FFD580CD3 :10D70000CF406A1E501E6A0A500AEAE80008FAE989 :10D710000008EAEA0010FAEB0010EDDEB010581332 :10D72000E0800085E8C7FFFE0999ECC8FFFE1208FB :10D730000E9CE5D8B010069A0A9BF01F00448A1888 :10D74000E4081900CD22069A0A9BE8CCFFFCF01FE2 :10D7500000408A18E4081900CC82E8CCFFF8069A49 :10D760000A9BF01F003A684C88493008F0091900FC :10D77000C0E0189630070C9C2FF7069A0A9BF01F02 :10D7800000342FC688C80E38FE99FFF78A18E408BF :10D790001900CAB2069AE8CCFFF60A9BF01F002BCC :10D7A000684888C9885AF009002C3008F00A190026 :10D7B000C0E0189630070C9C2FF7069A0A9BF01FC2 :10D7C00000252FC688D80E38FE99FFF78A18E4087E :10D7D0001900C8B2069A0A9BE8CCFFF4F01F001BA0 :10D7E0008A18E4081900C812069AE8CCFFF20A9BCE :10D7F000F01F001688C988D81208684A8879F4088A :10D80000002C3008F0091900FE90FF7018963007C0 :10D810000C9C2FF706990A9A310BF01F000F2F0668 :10D8200088F80E38FE99FFF6C60BE8C7FFFE30EA0F :10D83000300B0E9CF01F0009099B6A5CF01F00086A :10D84000894CC73B8001C9848001A2FC8001C8309B :10D850008001C8048001AD98800091D08001D3EC94 :10D86000EBCD40E0E06800FE18971AD816951496A4 :10D8700030483059F01F00162FFD580CC031E3CD51 :10D8800080E0EECCFFFE0C9A0A9BF01F00120C9A6F :10D890000A9BEECCFFFDF01F000F0C9A0A9BEECC0A :10D8A000FFFCF01F000C5816C0A00F9B0C990A9AA1 :10D8B0006E2C203BF01F0008E3CD80E00F9B6A5CDC :10D8C000203BF01F00068F2CCF11CDAB8001C98407 :10D8D0008001A29C8001AD988001D3ECEBCD40E0AB :10D8E00018951696F6CCFFF8F01F000CC12099167B :10D8F00030089908F8C7FFF80C9A5805EBF71A0595 :10D90000E06B00FF0E9CF01F00060E9CE3CD80E054 :10D9100018970E9CE3CD80E080009200800091D0AB :10D92000EBCD40C0201DF8C60008300C6C1BF01F6A :10D930000014C1A0500C3007C1286C1B400CF01F14 :10D9400000111897C1406C1AECCBFFF8EF4AFFFCAE :10D950000E9CF01F000D6C065806C0505807CEE113 :10D960004007CF2B400C2FFDE3CD80C01A9CF01F49 :10D9700000070E9C2FFDE3CD80C000008001D8DCA5 :10D980008001D3EC800091DC8001D3A8D401E06851 :10D990000081301999489959189A7408129C11CE2F :10D9A000F20E18005F089708D802D703486830398C :10D9B000F0FA00F830089569985BF00B19005F0CDD :10D9C0005EFC0000000087F419C8300A4869F2F9CB :10D9D00000F8F4081800F9BC0001F9BC0100F3FCE0 :10D9E0001A065EFC000087F448483009F0FA00F897 :10D9F000301C95695EFC0000000087F448B8985A16 :10DA0000F0FB00F83178F00A1900E08B000B3018B9 :10DA1000F00A0948E4180080E01803FEC0205EFF09 :10DA20003008301C97685EFC000087F478185808AE :10DA30005F0C5EFC5EFF19C830192018F208180050 :10DA40005FBC5EFC5EFD5EFD19C93008F009180080 :10DA50005F0C5EFC5EFD5EFFEBCD4080308B189767 :10DA6000991B300CF01F00078F0CC0803078E069E4 :10DA700000818F588F49E3CF9080E3CD80800000F4 :10DA80008001D8DCEBCD40C018971696308B991BDF :10DA9000300CF01F00108F0CC160301830298F58E7 :10DAA0008F4948D8B826118948C8B8E948C71189AC :10DAB000B8F96EB899086EBC580CC0752FFC8FBCB5 :10DAC000E3CF90C0E3CD80C0F01F0006CF9B0000E5 :10DAD0008001D8DC00007A280000025C000087F496 :10DAE00080018450EBCD40FE1897FACCFFE01694ED :10DAF000781330CB14928F1B129178061095300C4E :10DB0000F01F00118F0CC1A0307830498F588F4919 :10DB10009905B8E6B8F1F9630008B8C4B8D248B8B6 :10DB200048B9B084B28248B76EB899086EBC580C38 :10DB3000C0752FFC8FBCE3CF90FEE3CD80FEF01FBD :10DB40000006CF9B8001D8DC000079E5000079E475 :10DB5000000087F480018450EBCD40FC1897FACC8C :10DB6000FFE4314B781414938F1B129278061095B2 :10DB7000300CF01F00158F0CC2003018F3D4C01009 :10DB80008F488F589913B8429935F9560010F954B7 :10DB9000001248E7F1D6C0100A481248F9B800FF51 :10DBA000F9B80100B8586EB999096EBC580CC07527 :10DBB0002FFC8FBCE3CF90FCE3CD80FCF01F000472 :10DBC000CF9B00008001D8DC000087F480018450E6 :10DBD000D401780A3009740B15F8129C129AF01FC0 :10DBE0000002DA0A80018460D401780A3009740BDB :10DBF000F538000B129C129AF01F0002DA0A00009E :10DC000080018460D401780A3009740BF538000B68 :10DC1000129C129AF01F0002DA0A00008001846050 :10DC2000D401780A3009740BF538000B129C129A53 :10DC3000F01F0002DA0A000080018460D401780A33 :10DC40003009740BF538000B129C129AF01F000279 :10DC5000DA0A000080018460D401780A3009740B6C :10DC6000F538000B129C129AF01F0002DA0A00002D :10DC700080018460D401780A3009740B15F8129C75 :10DC8000129AF01F0002DA0A80018460EBCD40F89E :10DC900030C618979916169414930C9B300CF01FED :10DCA00000108F0C1895C160307831690C9A8F582C :10DCB000089B8F49F01F000B48B66CB88B086CBCF2 :10DCC000580CC0A52FFC8DBC301C6A088708E3CD1A :10DCD00080F8E3CD80F8F01F0005CF6B8001D8DC21 :10DCE000800091DC000087F480018450EBCD40F887 :10DCF000308618979916169414930C9B300CF01FCD :10DD000000108F0C1895C160307831490C9A8F58EB :10DD1000089B8F49F01F000B48B66CB88B086CBC91 :10DD2000580CC0A52FFC8DBC301C6A088708E3CDB9 :10DD300080F8E3CD80F8F01F0005CF6B8001D8DCC0 :10DD4000800091DC000087F480018450EBCD40F826 :10DD500033C618979916169414930C9B300CF01F29 :10DD600000108F0C1895C160307831390C9A8F589B :10DD7000089B8F49F01F000B48B66CB88B086CBC31 :10DD8000580CC0A52FFC8DBC301C6A088708E3CD59 :10DD900080F8E3CD80F8F01F0005CF6B8001D8DC60 :10DDA000800091DC000087F480018450EBCD40F8C6 :10DDB000318618979916169414930C9B300CF01F0B :10DDC00000108F0C1895C160307831190C9A8F585B :10DDD000089B8F49F01F000B48B66CB88B086CBCD1 :10DDE000580CC0A52FFC8DBC301C6A088708E3CDF9 :10DDF00080F8E3CD80F8F01F0005CF6B8001D8DC00 :10DE0000800091DC000087F480018450EBCD40F865 :10DE1000330618979916169414930C9B300CF01F28 :10DE200000108F0C1895C160307831090C9A8F580A :10DE3000089B8F49F01F000B48B66CB88B086CBC70 :10DE4000580CC0A52FFC8DBC301C6A088708E3CD98 :10DE500080F8E3CD80F8F01F0005CF6B8001D8DC9F :10DE6000800091DC000087F480018450D421189751 :10DE7000169530CB991B300CF01F00128F0C1896A2 :10DE8000FAC4FFEC580CC190302830098F588F49E4 :10DE900048D76EB899086EBC580CC1052FFC8FBCD2 :10DEA0005805EDF81000EBF81A00089BECCCFFFCCD :10DEB000308AF01F0006DA2AD822F01F0005CF0BA7 :10DEC0008001D8DC000087F4800091DC8001845060 :10DED000EBCD40E018961695310B991B300CF01FD6 :10DEE00000108D0C1897C1503078317A0A998D58EE :10DEF0008D4A48CBF8CAFFFCF01F000B48B56AB842 :10DF00008F086ABC580CC0752FFC8BBCE3CF90E027 :10DF1000E3CD80E0F01F0006CF9B00008001D8DC3D :10DF20008001D3EC8001D158000087F48001845037 :10DF3000EBCD408078076E285808C0B0300C189A96 :10DF40005C586E0B3109300CF01F0009E3CF908054 :10DF5000310CF01F00086E189908EF390016991956 :10DF60006E3899286E4999396E28CEAB800184604D :10DF700080009200EBCD40FC189716931495314B1E :10DF80001294991B300CF01F001C8F0C1896FAC2CB :10DF9000FFE4580CC200302830198F588F495805BB :10DFA000C1C18D455C7549576EB88D086EBC580C63 :10DFB000C1F52FFC8FBC5804EDF81000E9F81A00E9 :10DFC000049B308AECCCFFFCF01F000D301C8D351B :10DFD000E3CD80FCE3CF80FC5C750A9CF01F000958 :10DFE0008D4CCF90069B0A9AF01F0005CDDBF01FE9 :10DFF0000006CE1B8001D8DC000087F4800091DC95 :10E000008000920080018450EBCD40801897F93C4D :10E01000000BF01F00084888F0F900F85809C0709C :10E02000EECBFFFC310A313CF01F0004E3CF9080BF :10E0300080015FB0000087F480014658D42130C8C9 :10E040001896109B4904300CE8F500F88D18F01F65 :10E05000000F8D0C1897C120301830D98D582FCC57 :10E06000EACBFFE28D49F01F000A68B88F0868BC50 :10E07000580CC0552FFC89BCDA2AD822F01F0005A5 :10E08000CFBB0000000087F48001D8DC8001844011 :10E0900080018450D42130CB1897991B300CF01F8D :10E0A000000B8F0C1894C1004898301530868F559E :10E0B0008F462FCCF0FB00F82E2BF01F00060A9C99 :10E0C000E966000AD822D8228001D8DC000087F453 :10E0D00080018440EBCD40E030CB1896991B300C8A :10E0E000F01F00108D0C1897C1703018305948E59A :10E0F0008D588D492FCCEAFB00F82E2BF01F000B1A :10E100003028AE586AB98F096ABC580CC0752FFC0C :10E110008BBCE3CF90E0E3CD80E0F01F0005CF9B08 :10E120008001D8DC000087F48001844080018450A5 :10E13000EBCD40FC30C518969915169414931292A5 :10E140000A9B300CF01F00138D0C1897C1D03018AB :10E150008D458D580A9A300BF01F000FEECCFFFC56 :10E16000089BF01F000E078848D6EF68000A058953 :10E17000EF69000B6CB88F086CBC580CC0752FFC95 :10E180008DBCE3CF90FCE3CD80FCF01F0006CF9B5D :10E190008001D8DC800091D080018440000087F4A9 :10E1A00080018450EBCD40FC30C51896991516942B :10E1B000149312920A9B300CF01F00128D0C1897CA :10E1C000C1B0301830B98D588D490A9A300BF01F04 :10E1D000000E306AAEC4AED3049BEE0A000CF01FF2 :10E1E000000B48B66CB88F086CBC580CC0752FFC7F :10E1F0008DBCE3CF90FCE3CD80FCF01F0006CF9BED :10E200008001D8DC800091D0800091DC000087F490 :10E2100080018450D431203D502B5018FACEFFD0CD :10E2200033857C3499157C181896149312917C00D0 :10E2300050087C220A9B300CF01F00228D0C18978E :10E24000C370301830A98D580A9A8D49300BF01FD1 :10E25000001E069A029BEECCFFFCF01F001CEF5341 :10E2600000244028049BEF680026EF600027306AF6 :10E27000EECCFFD8F01F00155804C1C0089B308AAF :10E28000EECCFFD2F01F00114008EF6800364018B6 :10E2900048F6EF6800376CB88F086CBC580CC05556 :10E2A0002FFC8DBC2FDDDA3AF01F000ACFBB2FDD2B :10E2B000D832089B308AEECCFFD2F01F0003CE5B31 :10E2C0008001D8DC800091D0800091DC000087F4D0 :10E2D00080018450D4012FCC7808202D500819C912 :10E2E000BAC919D8BAD8F01F00052FED580CF9B8E3 :10E2F000010DF9F81A06DA0A80015860D40148D8ED :10E30000F8CBFFF5F0F900F8733C7808204D502861 :10E3100019C9FB69000C19D8306AFB68000D1A9CFA :10E32000F01F0005F01F00052FCD580C5F1CD80210 :10E33000000087F48002E73680018898EBCD40FE2C :10E340003007FAC5FFE0189116924A134A1466087E :10E350000E38E08A00216A08204D50280BC9FB695D :10E36000000C0BD8EE061504FB68000DE806000A49 :10E3700015D8BAD87409500915C8BAC8F01F0016C4 :10E380002FCD580CC0A12FF75907CE2118970E9CFE :10E39000E3CD80FEEE061504E80600060A9B0C9C01 :10E3A000F01F000EF3D2C001EE081501AC692FF882 :10E3B000E808093166090E39FE99FFEBEEC9FFFF47 :10E3C00048380E9C9109E3CD80FE000000008C5C73 :10E3D00000008B5C8001889880018440EBCD4080F8 :10E3E000300819C9F0091800C10048E8F0F700F832 :10E3F0005807C130F01F000C0E9CF01F000C0E9C43 :10E40000F01F000BE3CF8080486830A9F0FA00F8D5 :10E41000301C9569E3CD80800E9CE3CD80800000A8 :10E42000000087F480015D188001593880015CDCB0 :10E43000EBCD40E01896F01F00224A2A0DE9F4F7D0 :10E4400000F85809C1103018F0091800C32030280E :10E45000F0091800C31030488F687498300CABC8AE :10E460009598E3CD80E06F3930D8322A8F68496CB7 :10E47000727B2F4BF01F00156F3C3FF8787BF7390C :10E4800000C8F0091800C130202DF71600D47845D7 :10E49000306AEECBFFE21A9CF01F000C0C9B0A9C2A :10E4A000F01F000B301C2FEDE3CD80E0E3CF90E0B8 :10E4B00030088F68CD3B30588F68CD0B8001F00459 :10E4C000000087F400008C608002E7368001E33CA6 :10E4D000EBCD40E01896F01F00284A8A0DE9F4F7CA :10E4E00000F85809C1503018F0091800C3603028EE :10E4F000F0091800C3906F0830492FF88F69EF4872 :10E5000000407498300CABC89598E3CD80E06F392B :10E5100030D8322A8F6849AC727B2F4BF01F00191C :10E520006F3C3FF8787BF73900C8F0091800C1301C :10E53000202DF71600D47845306AEECBFFE21A9C06 :10E54000F01F00100C9B0A9CF01F000F301C2FEDD9 :10E55000E3CD80E0E3CF90E06F0830092FF88F69BA :10E56000EF480040CCFB6F0830592FF88F69EF4817 :10E570000040CC8B8001F004000087F400008C6028 :10E580008002E7368001E33CD421310B1896991BB9 :10E59000300CF01F00198D0C1897C28030183049CC :10E5A0008D588D494955302CEAF400F8F01F0014BD :10E5B000E8CBFFE21896EECCFFF8F01F00126C38A3 :10E5C000AE38EAF901045819C0D03008AE2830B886 :10E5D00089686AB98F096ABC580CC0952FFC8BBC3E :10E5E000DA2AEAF8011C5818CF20D82AF01F0006B2 :10E5F000CF7B00008001D8DC000087F48001EF6C45 :10E600008001844080018450EBCD40F81897169427 :10E6100030CCF01F0046303CF01F00441895302CE1 :10E62000F01F0042E06A00EC1896E06B00FF0E9CC1 :10E63000F01F003FE8CBFFE2EECCFFF6F01F003DFD :10E640006C384BD9AE289208AE483DD86939727BF8 :10E65000F73A009AF00A1800C480F73900803DD8D4 :10E66000F0091800C52030050A93F01F00349838CF :10E67000AE381896F93900A83FF8F0091800C09094 :10E68000F8C9FF58EECAFF584ADB0E9CF01F002D58 :10E69000ED3900CC3FF8F0091800C1900E9CECC990 :10E6A000FF34EECAFF344A6BF01F0027089CF01FAE :10E6B0000027583CE089000C4A587099ABC99199E1 :10E6C0003FFA301CEF6A009EE3CD80F85805CF502A :10E6D000EECCFF62069BF01F001F49D9301C7298D8 :10E6E000ABA89398E3CD80F8F73900A03008F00983 :10E6F0001800CB41EAF900B85819CB01F72800A25D :10E700001295F003161FCB2BF73900863018F0094D :10E710001800CAA1EAFC00B8581CCA61F728008892 :10E720001895F003161FCA2B8001EF6C800091D062 :10E73000800184400000025E8001EFF88001D3EC8C :10E740008001D1E88001D21C8001808E000087F416 :10E75000800184F0D421E06800EC1897109B4924D4 :10E76000300CE8F500F88F18F01F00108F0C189689 :10E77000C090301830798F588F490A9BF01F000CD9 :10E78000C021D82A0C9CF01F000B30C88B6868B9D8 :10E790008D0968BC580CC0452FFC89BCDA2AF01FD3 :10E7A0000006CFCB000087F48001D8DC8001E608AA :10E7B0008001F03080018450D421E06800EC18978B :10E7C000109B4924300CE8F500F88F18F01F00105A :10E7D0008F0C1896C090301830698F588F490A9B5B :10E7E000F01F000CC021D82A0C9CF01F000B30C871 :10E7F0008B6868B98D0968BC580CC0452FFC89BC72 :10E80000DA2AF01F0006CFCB000087F48001D8DCA5 :10E810008001E6088001F03080018450EBCD40405B :10E82000201D18961A9CF01F001849888C69F0FB6F :10E8300000F85809C1203018F0091900C0B030287C :10E84000F0091900C170770830492FF89769F74827 :10E8500000402FFDE3CF80407738301911EA301C9B :10E86000F20A1800F9B8000CF7F80A062FFDE3CDFC :10E870008040770830592FF89769F74800402FFDFE :10E88000E3CF8040800177A4000087F4D401496879 :10E8900019C9F0FA00F85809C1803028F0091800A9 :10E8A000C1803048F0091800C0503018F009180035 :10E8B000C180750830492FF89569F548004019CB9B :10E8C000302CF01F000AD80A3088301C9568D80216 :10E8D000750830592FF89569F548004019CBCF1BC2 :10E8E000301BCEFB000087F480018390D431215D82 :10E8F000303C169614911290F01F00584D83F8C4C6 :10E90000FFB0189531CA089B069CF01F0056C0A1A5 :10E910006D3830AA707BE6CCFFE42D2BF01F005140 :10E92000C7B06D38FAC7FFC8707B0E9CF6CAFFC827 :10E930002D2BF01F004D089B0E9CF01F004CC0417A :10E94000300C2EBDD83231CA0E9BFA0A0002049C4C :10E95000F01F0047049CF01F004730080E9A500833 :10E960001A97089B1A9CF01F00446D38707930E8A4 :10E97000F33A005EF00A1800C670EB3A0074580AC9 :10E98000CE006D387079EB380075F33B005EF60809 :10E990001800C0F0EACCFF8A3009C0581938F608D0 :10E9A0001800C0502FF9123AFE99FFFA123ACC9093 :10E9B000049CF01F0032CC50049B1A9CF01F0030C6 :10E9C0001A9B029CF01F002F049B009CF01F002D3F :10E9D000089B31CA4A2CF01F00266D3830AA707B84 :10E9E000E6CCFFE42D2BF01F00226D38312A707B1E :10E9F000E6CCFFDA2C8BF01F001E029B304AE6CCDF :10EA0000FFC8F01F001B009BE6CCFFC4304AF01F7C :10EA10000018301CC97B6D38312A707BE6CCFFDAD8 :10EA20002C8BF01F0010FE91FF7E304AE6CBFFC812 :10EA3000029CF01F000FE6CBFFC4009C304AF01F81 :10EA4000000C301CC7FB049CF01F000FFE90FF7AE7 :10EA50001A9CF01F000EC92B8001EF6C000079E8B2 :10EA60008000917C80018124800182BC800091DC47 :10EA700080018658800181E8800182608001817E6A :10EA8000800180CC80018360800185F4EBCD40FC67 :10EA9000FACD0110300733095407FEF3022EE6F8D1 :10EAA00000F854281896129B0E9C8D19F01F0088B0 :10EAB0008D0C1895E080008A3018303C8D588D4CB4 :10EAC000F01F0084FACBFEFC1894FACAFEF8FACCC8 :10EAD000FEF2F01F0081442871390E9CE06B00ECBF :10EAE0007277F01F007BC710540CE0680420B83820 :10EAF000442B7738707992D9EDB90000C6B0EDB9E2 :10EB00000001C06144099238A1B8B238442BE8F83A :10EB100000B85808C0C07738707A94D9EDB90009A8 :10EB2000C06144099238A9B8B238442BFAC2FEF148 :10EB3000441A049CF01F006944185818E08000A58E :10EB4000C6823079FB38010FF2081800C050440922 :10EB50009238A5A8B238440CF01F0061049CF01F45 :10EB600000614428E74C0100EACAFFF071390A9CB1 :10EB70004DDBF01F005E6858AA286869AA394D3C31 :10EB800069B85808C440442B773870793078F33A24 :10EB90000074F00A1800C240EAC9FFF4EACAFFF89C :10EBA000300CF01F0053581CC53030063018E748B1 :10EBB000004444095809C0A0FACCFF00F01F004DE2 :10EBC0000C9C2BCDE3CD80FC30060C9C2BCDE3CDF3 :10EBD00080FC44099238A1A8B238442BC99BF8F8AC :10EBE00001AC5808C050F8CCFE54F01F004230CBA6 :10EBF000300CF01F0037E74C01AC189AC080442855 :10EC0000713B76794B8B28C9F01F003B442BCC5BC2 :10EC10005828CA51442C1A9B2E2CF01F00381A96E3 :10EC20001AD61ADC442BFB380116FB390117EF3AD0 :10EC300000CF169CF6CBFF34F01F003144283289F8 :10EC4000F15900D8442CF01F00262FEDC88BE8F8AE :10EC500000B85808C2916AB93FF8F368009A3028A2 :10EC60003039E7480044442891694426F01F0025C4 :10EC7000ED4C004466B88B0866BC580CC2352FFCBE :10EC800087BC3016C94B440BEF3A00AF169CFB38DB :10EC9000010EFB39010FF6CBFF58F01F001B440C8F :10ECA000F01F000FC5CB44287139727A94D8EDB8A3 :10ECB0000001CD21189B6ABCF8CCFF66F01F001341 :10ECC000CCFBF01F0013CDDB000087F48001D8DC03 :10ECD0008001EF6C80017C4480017EE08001F03097 :10ECE00080017BD88001D3EC8001AD408001E8EC4D :10ECF0008001D3A88001D1588001887080018C2CBC :10ED0000800145C480018B74800184F080018450AF :10ED1000D431203D189616971493303CF01F0070A4 :10ED2000301831798D588D4930086C068F0858039A :10ED3000EDF81805E7F81A0018950DC40898A7D83B :10ED4000C0505898C0302FDDD83A0DD93018F0098E :10ED50001800C1003008F0041800F9B80500EFF8F9 :10ED60005A00F9BC0501F9BC0401EFFC4A002FDD93 :10ED7000D832303CF01F005A6C98F93A0074F13BDD :10ED8000005E580ACE80F9380075F6081800C0A059 :10ED900028AC30092FF91439CDE41938F00B1800DC :10EDA000CFA1ECC0FFF8009CF01F004E1891CD30B1 :10EDB0006BB85808C090793870793078F33A00749D :10EDC000F00A1800C6E0FACCFFF8F01F0047581C04 :10EDD000C0A0F01F0046029B835C350A31DCF01FA7 :10EDE0000044CB9B40285818CF51FACCFFFCF01FB1 :10EDF0000041581CCEF1401820785818FE9BFFEBBC :10EE00004BD8F0F900F85809CE501A9CF01F003B7F :10EE1000581CCE01400820285818FE9BFFDC6C9E31 :10EE20002F4EFCE80000212DFAE90024FCE8000840 :10EE3000FAE9002CFCE20010FAE30034FCE80018C8 :10EE4000FAE9003CFD3C0020FB6C0044FD38002149 :10EE5000322AFB6800454AAB1A9CF01F002AF01FBB :10EE6000002A2EED580CCB606C9A3FF8F53900C89B :10EE7000F0091800CAF06008F51B00D4202D6C6C56 :10EE8000500801C9BAC901D8BAD8F01F0020A56C32 :10EE900049FB310A180B315CF01F00152FEDC9AB8F :10EEA0004955EAF801AC5808C050EACCFE54F01FAE :10EEB000001930CB300CF01F0018EB4C01AC189A45 :10EEC00048D5580CFE90FF816338494B707928C9AA :10EED000F01F00136A98ABB88B98C76B8001EF6C7A :10EEE00080015D44800177A4800145C480014658BB :10EEF00080015F44000087F480015F2800008C607F :10EF00008002E736800189108001E33C00008B5CC1 :10EF10008001D3A88001D8DC8001D3EC8001D158D6 :10EF2000EBCD40E0206D300818991495502850081A :10EF30001A9C1A965D191897C10140085808C040DC :10EF40001A9CF01F0009402C580CC030F01F00071D :10EF50000E9C2FADE3CD80E01A9C5D15581C5F0719 :10EF6000CEDB00008001D3A8800091E858DCE08867 :10EF700000035EFD49B8F00C032F49B8F0CCFFF454 :10EF80005EFC4998F0CCFFE45EFC4978F0CCFFD4FD :10EF90005EFC4958F0CCFFCC5EFC4938F0CCFFC495 :10EFA0005EFC4918F0CCFF305EFC48F8F0CCFF1C4A :10EFB0005EFC48D8F0CCFEF45EFC48B8F0CCFEBC59 :10EFC0005EFC4898F0CCFE945EFC487C5EFC486891 :10EFD000F0CCFFFC5EFC4848F0CCFE785EFC000004 :10EFE0008003C01400000260483930089318930869 :10EFF0005EFC000000008C844828700C5EFC000061 :10F0000000008C84EBCD40C0487618976C1C580CDF :10F01000C030F01F00060E9CF01F00058D1CE3CDD4 :10F0200080C0000000008C8480018AD480018AECBA :10F03000EBCD40C0487618976C0C580CC030F01FD0 :10F0400000060E9CF01F00058D0CE3CD80C0000073 :10F0500000008C8480018ABC80018B30D4211894FC :10F060001696149530CCF01F00121897C1D03018A6 :10F0700099069915F0060946EC0C1502F01F000CD4 :10F080008F2CC0F05806E08A000B3009129A6E28C7 :10F09000F009092A2FF91236FE99FFFB8907DA2AAF :10F0A0000E9CF01F00043FDCD8220000800092007C :10F0B000800091E8D4311893169214901291580C54 :10F0C000C36078093018760CF0090945580CC390D4 :10F0D000189468160A36C1A468075807C0606E48BD :10F0E0000238C1B03FCCD832662CF8060327580747 :10F0F000CF71ECC8FFFFF808002CC0582FF8190793 :10F100005807CEE110960A38CFA5089CF01F0013CF :10F1100030083FEC8508D832029A009C6E3BF01F05 :10F120000010301C89166E088908D832760C580CED :10F13000C040F01F000ADA3A66093018F0090945A4 :10F14000308CF01F00081894C060850C30089918A6 :10F150009908CC0BD8320000800091E8800091DC47 :10F1600080009200D431109412907818409618952F :10F17000169214910C9B780A089C5D181893318C98 :10F18000F01F00131897C1F00C9CF01F00118F3C6A :10F19000C170089B0C9AF01F000F30088F468F1229 :10F1A0008F218F508F086A29F203002C78085808A5 :10F1B000C0C0109970085808CFD19307DA3A0E9C56 :10F1C000F01F00053FDCD8329907DA3A8000920040 :10F1D000800091DC800091E8D431203D501C500B20 :10F1E000149112921090580AC4307418009B740A3B :10F1F000129C5D18A36C502C6228F00C0307580772 :10F20000C3706E450A990035C3610E940E93C09881 :10F210006E075807C2D008936E490A39C2C10E94CE :10F220006E3B0A9A049CF01F00181896CF214019D3 :10F230006E18930840086E2991098F1C8F2C6E3C24 :10F24000F01F00128F468F3640296228F009000C0B :10F2500078090E39EFF80000F9F80A00EFF810000D :10F26000E7F81A000E9CF01F00092FDDDA3A3FEC98 :10F270002FDDD8326E385808CFB00039CF903FCC50 :10F280002FDDD8328000917C800091E8163C5E0C26 :10F290007808971C990B97085808F1FB1A015EFC37 :10F2A00078195809F9F81000F3F81A007808580886 :10F2B000F1F91A013008990899185EFCD40149380F :10F2C000FACEFFFC709CE21C0002C1D0209DFD3AEA :10F2D0000021FB6A0021FCE80000FAE90000FCEADA :10F2E0000008FAEB0008FCE80010FAE90010FCEA5C :10F2F0000018FAEB0018FD380020FB680020F01F12 :10F3000000042F7DD8020000000087F480015AA479 :10F31000D4014898709CE21C0002C0C0300930CC77 :10F32000EA1C4000303B129AF01F0004F01F00045A :10F33000301CD802000087F4800186C88001875401 :10F34000D4014898709CE21C0002C0C0300930DC37 :10F35000EA1C4000303B129AF01F0004F01F00042A :10F36000301CD802000087F4800186C880018754D1 :10F37000D4014898709CE21C0002C0C03009310CD6 :10F38000EA1C4000303B129AF01F0004F01F0004FA :10F39000301CD802000087F4800186C880018754A1 :10F3A000EBCD4080495818977098E2180002C04190 :10F3B000109CE3CD8080F01F00126F38302911EAD5 :10F3C000F20A1800C0D03009303B129A307CEA1C97 :10F3D0004000F01F000CF01F000CE3CF90806E681F :10F3E0005898CF213009303B129A30BCEA1C4000BB :10F3F000F01F0004CF1B0000000087F4800158407C :10F40000800186C88001875458DBE08A0012F939F0 :10F41000000C3078F0091800E08B000C595BE08A92 :10F420000008F939000E3AA8F0091800C0D05EFDB6 :10F430003888F0091800CFC1F939000D38E8F00913 :10F4400018005F0C5EFCF938000FF2081800CF01BD :10F45000F93900103038F0091800CEA1F93900113F :10F460003008F0091800CE41F93A0012F20A1800EB :10F47000CDF1F9380013F4081800CDA1F9390014C2 :10F480003888F0091800CD41F939001538E8F0093D :10F4900018005F0C5EFCD7033019482891095EFC08 :10F4A00000007A38EBCD40C0208D48D730088E0957 :10F4B000F0091900C101E06AFFFF300B1A9CF01F30 :10F4C00000091A9B302AFACCFFE8F01F00079A18AF :10F4D0001A96AE088E0C2F8DE3CD80C000007A2ADC :10F4E0008001C7B88001A498D401F01F00054858D6 :10F4F000F139010B120C5C8CD80200008001F4A4DD :10F50000000087F4EBCD4060208D306AFAC5FFE63D :10F51000300B0A9CF01F00091A9CE06AFFFF300BB9 :10F52000F01F00070A9C1A9B302AF01F00061A964B :10F530009A1C2F8DE3CD8060800091D08001C7B8E8 :10F540008001A444D43120DDFEF60234FACEFFA8B7 :10F55000189516916C9C1494129310907C177C0251 :10F56000E21C0002C0312F3DD832FEF802167009AD :10F570005809C041FE7CFBB4CF7BECF8012458183D :10F58000C041FE7CFC17CF0BECC9FFE85019129C60 :10F59000F01F007D581CE08000E30D890D98F009F4 :10F5A0001800E08200E6302CF01F0078E08000D2E6 :10F5B0006CB850282FF88DB85807FBF91002EFF9F6 :10F5C0001A00F01F0073C0E0029B0A9CF01F00713C :10F5D000E08000C96C98EDB80006C0414E88402913 :10F5E00091D9F01F006D6008EFDCB010F3D7C010A8 :10F5F00050091039E08B006C0D882FF8AC880D99FC :10F60000F0091800C061300A320C149BF01F00632F :10F61000E8C800020E08FB58002EED38010B30043C :10F62000FB680032400A300BFB640030FB640031A1 :10F63000FB640033069CF01F005A069BFAC7FFF4D8 :10F64000400A0E9CF01F0057300A0E9BFACCFFD2E6 :10F65000F01F0055ED38010BF9D2C003BA78F01F46 :10F660000053300CFB520028FB5C002AE041003EB6 :10F67000E0880008EB39000C3888F0091800C2D087 :10F680004028300A50980E9BFACCFFDCF01F00484F :10F690004009ECCCFFE88109F01F0046F01F00464E :10F6A0003008ED4C00CCED5800D04C49F30A014233 :10F6B000F00A1900C0604B297298EDB8000EC031F5 :10F6C000301CC52BF01F003E301CC4EBECCCFFE817 :10F6D000F01F00383FFCC48BEB39000D38E8F0090F :10F6E0001800CCF1EB39000E3018F0091800CC915D :10F6F000EB39000F3038F0091800CC313028EB3BE3 :10F700000012F00B18005F1A3FE8F00B18005F19A9 :10F71000126AE80A1800CB51EB380013E218001DFA :10F720005818CAF1EB380014E21800C85888CA917A :10F73000189A31F9EA090708F4081800CA212FF9C4 :10F74000E049003FCF81E0680400FB58002AC99BD4 :10F75000401CF01F0018FE7CFAECC06BFE7CFC160F :10F76000C03BECCCFFE8F01F00133FECCFDA401CAD :10F77000F01F0010FE7CFB4FCF7A0000000087F4E2 :10F7800000007A38800145DC80019F3080015F04F1 :10F790008001F4088001F4E880014658800091D08F :10F7A0008001C7B88001A4448001859C8001A49891 :10F7B000800145EC800145C4000002608001FBFC33 :10F7C000D401302CF01F0003300948389109D802C9 :10F7D0008001A12800007A38D431FACD01385009CF :10F7E000FACEFEA416971896FEFB031C14947C1305 :10F7F0007C00F6F801245818C460FEFA030A749CD1 :10F80000E21C0002C05118970E9C2B2DD832E068E4 :10F8100000F8FAC5FEFCF5D7C0100C9B0A9C548872 :10F82000549654A730025472F01F00B8FAC1FEE497 :10F830000A9B029CF01F00B644C95879E08B00284F :10F840003018F0090948E2180085C2104488FAC946 :10F85000FFF45012502854D944D80A9B5478029C83 :10F86000F01F00ACC1C1302744D95809CCE0FAC818 :10F87000FFF41039CCA0FACCFECCF01F00A70E9CF0 :10F880002B2DD83230270E9C2B2DD832448B300CA8 :10F89000F01F00A2E08000B354DCCDFB44C9E04976 :10F8A000003FE088000B300744B8EDB80007E08067 :10F8B000009EF01F009BCD9BFEF80268F009032F0D :10F8C000ECCAFFFC1588EC08000889080DD81589DA :10F8D000400BEE0901093067F208010A970A44B8A3 :10F8E000CE5B44B8F0C90001E0490097E088008988 :10F8F000447CF01F008D44C8189A300944BC303B4A :10F90000BFBCF9E8108CF01F0089F01F0085301B88 :10F91000300CF01F008744B83027CC8B44B8E04847 :10F920000082C090E08900A9E0480080C040E04823 :10F930000081CEE10E9B0C9CF01F007ECE9B44B854 :10F94000E0480082E08000C4E08900915978E080BE :10F9500000C4E0480081CCD1029CF01F0077CD8B21 :10F9600044B85808C7E144D65803EDF81000E7F84A :10F970001A008C28A008FB1A0106445814088908AC :10F98000FB190104F20A0105400A30EB95056807EE :10F990000E9CF01F006AE08000AE4DB9F2F801D075 :10F9A0005808E080009E0A9B0E9C5D18E08000993C :10F9B00030270DE84D4BF768007B44B8C77B44B84F :10F9C0005818CB90E0480080CA31CB5B447B44BCE4 :10F9D000F01F005B44BCF8C800805818FE9BFF99DC :10F9E000029B5C5CF01F0057C93B30084C69300B30 :10F9F000B2A8169CF01F0054C5DB3FD7C06B4D3832 :10FA0000F009032F029CF01F0052C82B029CF01F2C :10FA10000051C7EB029CF01F0050C7AB029CF01FC7 :10FA2000004FC76B029CF01F004EC72B029CF01FBB :10FA3000004DC6EBF01F004C4B3AF54C00D4C68B82 :10FA4000029CF01F004AC64B029CF01F0049C60BE7 :10FA5000029CF01F0048C5CB447CF01F0047C58BBB :10FA6000E0480081C1403027C21BF0C8008F5828F1 :10FA7000FE9BFF40C4DBE0480084FE90FF5DFE95E6 :10FA8000FF5BE0480085FE91FF44C55B49E91388B0 :10FA900020185C58B28844D7C29049BB7698E218C7 :10FAA0000040C20076D96E081039E088002944B8B9 :10FAB000A7D854B85803F9B70003EFF81000E7F8D7 :10FAC0001A00F9B70103FBF8104BCF0A447B32EC64 :10FAD000F01F002AC1DB029CF01F0029C19B3047A8 :10FAE000C69B0FD8F768007ACE3B302CF01F00255C :10FAF000CD5BF01F0025CF403FE7C5CBF01F0023B3 :10FB0000CD7B0000000087F48001C7B88001BF10E2 :10FB10008001BF448001D3A88001D8DC80018754D4 :10FB20008003C04C8001870C800186C880016A88F0 :10FB3000800237E8800208948001F4088001708C0C :10FB40008001725480018CE48003C14C8002084023 :10FB50008002085880020864800208708002087CD5 :10FB600080020888800145C48002084C8002083465 :10FB7000800209B48001DA3480016D6C8002094092 :10FB80008001A12880015F048001F310EBCD406863 :10FB90003006493C1AD61AD649250C9899064929A7 :10FBA000492A302B0A9CF01F001249231AD60C98C0 :10FBB0001AD60699490A303BEACCFFFCF01F000C2C :10FBC0000C981AD606991AD6EACCFFF848BA305BD8 :10FBD000F01F0007301C2FADE3CD806800007A389D :10FBE00000007A2C8001F4988003C3AC80016EB8C9 :10FBF0008001F7C08003C3C48003C3E05EFCD70369 :10FC0000EBCD40E0203D1897580CC1F07938707A60 :10FC100094D9EDB90001C1D04C166C785828C15068 :10FC20000E9CF01F0040C110ED3900943FF8F00920 :10FC30001800C1405017FACAFFFC1A9BFACCFFF615 :10FC4000F01F0039581CC180301C2FDDE3CD80E04F :10FC50004B366C785818CE51CF8B202D306A1A9CB9 :10FC60004AFBF6CBFF4AF01F0031F01F00312FEDA9 :10FC7000580CCEB1CE0BFAC5FFF5400A401B0A9CCA :10FC8000F01F002C581CCE113079FB38000BF20805 :10FC90001800C35140187139727A94D8EDB8000435 :10FCA000CD404A5AF4F801045818C3206DE85808AA :10FCB000C1D1ED3B008049AA580BC2806F387079E2 :10FCC000F5380081F33C005EF8081800C1F0F4CA72 :10FCD000FF7E3009C0581538F8081800C0402FF9C9 :10FCE0001639CFA516395F0CCB1B48D973F85808C5 :10FCF000CE10F4F801AC5808CDD1CA7B0A9CF01F95 :10FD0000000FF01F000FCA10CCDB3009CECB3059EA :10FD1000FB38000BF2081800C981CC9B0000026080 :10FD2000800189D080017C448002E736800188B060 :10FD300080017EE0000087F480017BD880017C1088 :10FD4000EBCD40E048D818961695F0F700F058072C :10FD5000C0E00E9CF01F000AC0715806C0A00E9CA7 :10FD60000A9B5D16C0606E075807CF41E3CF80E065 :10FD70000E9CE3CD80E00000000087F48001FC00D1 :10FD8000D401F01F0002D80280021500EBCD40F82C :10FD9000204DE0683100EA18312EE069312EEA1971 :10FDA000322E306CFAE90000F01F00631894E080F6 :10FDB00000B9303CF01F00611896301CF01F005F46 :10FDC000306A202D189B18951A9CF01F005DF01FBB :10FDD000005D2FED580CE080008732B80A9C1AD8DD :10FDE000308930084D8A306BF01F00582FFD1A9370 :10FDF000ECFC00D8F01F0056ECFC00DCF01F0055B6 :10FE0000ECFC00E4F01F0054ECFC00E8F01F005391 :10FE1000ECFC00ECF01F0052ECFC00F0F01F005175 :10FE2000ED3C00B7F01F00506DC85808F9B801014B :10FE3000EDF81A1BED3C006FF01F004CECFC012CA0 :10FE4000F01F004BF01F004BF01F004BF01F004B4A :10FE5000F01F004BECF800F85808C6616D084C978D :10FE6000EF4800D8ECFC0130F01F0047300830A903 :10FE700032B54C6A1AD5E06B0080EECCFED8F01F8C :10FE80000033EEC6FE58304A300B0C9CF01F004089 :10FE900030081AD530594BFA0C9C304BF01F002B10 :10FEA0004BD82FEDF10A01423009F20A1900C26065 :10FEB0006E99EDB9000EC201A7B930688F9950381C :10FEC0001A9CFAC8FFF8FAC9FFF4089A308BF01FA1 :10FED00000331897581CC140089CF01F00312FCDEB :10FEE000E3CF80F8189A0A991A933068308B1A9CDD :10FEF000F01F002CC7EBF01F002C6E99CDEB089C77 :10FF0000F01F00273009303B129A311CEA1C4000D8 :10FF1000F01F0026F01F00260E9C2FCDE3CD80F8A9 :10FF20002FCDE3CD80F8300A301B149CF01F002148 :10FF3000C96B0000800092008001EF6C8002E73600 :10FF4000800188B08003B804800176C480020594E3 :10FF500080020538800204DC8002048080020424D0 :10FF6000800203C8800202F880020374800202D477 :10FF70008002078C800168AC8002017080020EFC58 :10FF8000000087F48002031C8003C400800091D02D :10FF90008003C40C00000260800174C8800091E8F6 :10FFA0008001776C8001FBFC800186C8800187544A :10FFB00080020B34EBCD406830094AF63068ACA9BA :10FFC000AC893129314AAC988D99300530130A9BA0 :10FFD000ED4500ECED4500E88DA58DC5ED550040E3 :10FFE000ED550042ED55004EED4500D88DB3ECCCFB :10FFF000FEF0F01F0022ED450124F01F0021ED5519 :02000004800278 :1000000000D0ED4C00CCED5500D249ECF01F001EA5 :10001000F01F001EED4501B8F01F001DF01F001D70 :10002000F01F001D0A9BECCCFF48F01F001C0A9B30 :10003000ECCCFF44F01F0019069BECCCFF40F01FF6 :100040000017069BECCCFF3CF01F0014ED4300446E :10005000F01F0013F01F001330DCF01F0013F93CF9 :10006000000FF01F0012F01F0006ED4C01CC069CA3 :10007000E3CD8068000087F4800091D0800145C402 :10008000000084CC80017B24800237D080016CDCAE :100090008001FB8C8001EFE8800144F8800187C873 :1000A000800205EC8001EF6C800202B8EBCD40606D :1000B000E06A01F8300B49D518960A9CF01F001C25 :1000C000F01F001C0C9CF01F001CEACCFFF4F01F7A :1000D000001BEACCFFE0F01F0019EACCFFF0F01F94 :1000E0000017EACCFFECF01F0016EACCFFE8F01F87 :1000F0000014EACCFFE4F01F0012300930DC1AD9FA :100100001298129A129BF01F000FF01F000FF01FA1 :10011000000FF01F000FF01F000FF01F000F301C2A :100120002FFDE3CD80600000000087F4800091D0B7 :1001300080016F4880021124800145D6800145F27C :100140008002067C80014690800149B88001804091 :1001500080015F98800201584848300A4849911848 :10016000910A930A5EFC000000007A3C00007A4489 :10017000D421219D4A846808F3D8C001FB6900633B :10018000E2180002C14030183005FB6800634A3CA9 :10019000F01F00233018189BFAC9FF9D300A49FC54 :1001A000F01F0020581CC2802E7DD8225809C1C0E3 :1001B000109549D870065806CEB0EA050019FA091C :1001C00000170C9B0E9C306A2FA72FF5F01F00170D :1001D0006C265806CDD05905CF516808F1D8C0011A :1001E000F0051700CD5B306AE06B00FF1A9C3015FC :1001F000F01F000FCDFB48FCF01F0009EA050018B6 :10020000189BA1781A99300A48ACF01F00062E7D81 :10021000D822000000007A448003C414800091B802 :100220008001776C00007A3C800091DC800091D0E6 :100230008003C41CD40148697208104C930CEDBCB7 :100240000002C021DA0AF01F0003D80200007A443D :1002500080020170EBCD408048C76E095809C1305B :10026000722A580AF3F80003EFF80A01F3F81003B2 :10027000F5F81A037238129C910AF01F00056E09F6 :100280005809CEF1E3CF908000007A3C800091E8DD :10029000D401F01F0007581CC020D802485972082A :1002A000EDB80002CFB0F01F0004D8028002025463 :1002B00000007A4480020170F8C900013058F0094A :1002C0001800E08B00054838B09C5EFF3FCC5EFC18 :1002D000000087F4D401201DFAC9FFFC12DC1A9932 :1002E0003048300A307B483CF01F00032FFDD80215 :1002F0008003C43C8001776CD401201D3018BA8C77 :100300001A99300A306B484CF01F0004581C5F0CDF :100310002FFDD8028003C45C8001776CEBCD406870 :10032000201D48F61893FAC5FFFC2F060AFC0C9C0A :10033000F01F000C303CF01F000CF94301300C9C06 :10034000F01F000A0A993018300A307B488CF01FE1 :100350000009581C5F0C2FFDE3CD8068000087F476 :10036000800145FC8001EF6C800145FE8003C46C78 :100370008001776CEBCD4040201D48E6BA8C2F06FB :100380000C9CF01F000D303CF01F000C1B88F9483E :10039000006C0C9CF01F000A30181A99300A309B30 :1003A000488CF01F0009581C5F0C2FFDE3CD8040E6 :1003B000000087F4800145FC8001EF6C800145FE60 :1003C0008003C4748001776CEBCD4068201D1898C1 :1003D0005CB81895FAC3FFFC48D606D82F060C9CCB :1003E000F01F000C303CF01F000CF94500F00C9C95 :1003F000F01F000A1A993048300A309B488CF01FD1 :100400000009581C5F0C2FFDE3CD8068000087F4C5 :10041000800145FC8001EF6C800145FE8003C480B3 :100420008001776CEBCD4068201D18985CB818955A :10043000FAC3FFFC48D606D82F060C9CF01F000C10 :10044000303CF01F000CF94500EC0C9CF01F000A3A :100450001A993048300A309B488CF01F0009581C0C :100460005F0C2FFDE3CD8068000087F4800145FC20 :100470008001EF6C800145FE8003C48C8001776CA5 :10048000EBCD4068201D18985CB81895FAC3FFFCA6 :1004900048D606D82F060C9CF01F000C303CF01FED :1004A000000CF94500E80C9CF01F000A1A9930482E :1004B000300A309B488CF01F0009581C5F0C2FFD40 :1004C000E3CD8068000087F4800145FC8001EF6C7B :1004D000800145FE8003C4988001776CEBCD4068B5 :1004E000201D18985CB81895FAC3FFFC48D606D8AA :1004F0002F060C9CF01F000C303CF01F000CF9453F :1005000000E40C9CF01F000A1A993048300A309B16 :10051000488CF01F0009581C5F0C2FFDE3CD80684C :10052000000087F4800145FC8001EF6C800145FEEE :100530008003C4A48001776CEBCD4068201D18981F :100540005CB81895FAC3FFFC48D606D82F060C9C59 :10055000F01F000C303CF01F000CF94500DC0C9C37 :10056000F01F000A1A993048300A309B488CF01F5F :100570000009581C5F0C2FFDE3CD8068000087F454 :10058000800145FC8001EF6C800145FE8003C4B012 :100590008001776CEBCD4060201D48F5BABC2F057B :1005A0000A9CF01F000E303CF01F000DFAC6FFFC45 :1005B0000D78F94800D80A9CF01F000A0C993018F1 :1005C000300A306B488CF01F0009581C5F0C2FFD5F :1005D000E3CD8060000087F4800145FC8001EF6C72 :1005E000800145FE8003C4BC8001776CEBCD40C028 :1005F000206D49EC3008F939010DF93B010850082C :1006000050281AD9F93A010C1ADAFAC7FFF8F93961 :10061000010AF93A01090E9CF01F00152FED580C44 :10062000C10140085808C0401A9CF01F0012402C1D :10063000580CC040F01F0010300C2FADE3CD80C02F :100640001A9CF01F000E400818965808C0401A9CCB :10065000F01F0008402C580CC030F01F000758163F :100660005F0C2FADE3CD80C0000087F48001DAE499 :100670008001D3A8800091E880018E9CD4214C0792 :10068000405EEF6C0108EF6B0109EF6E010D1495F0 :100690001294109A3019F2081800C120EEF801B037 :1006A0005808C3D05828C4C04B5CEF3B01B5338811 :1006B000F00B1800C5403398F00B1800C440EF6AE7 :1006C000010CF01F0030EDDCB010F01F002F0C0CFF :1006D0005C5C5805C1E11895F01F002A1815EF65FC :1006E000010AF01F0029EDDCB010F01F00260C0CF1 :1006F0005C5C5804C3F11894F01F00221814EF64D6 :10070000010B6E98EDB80001C031F01F0020DA2A0D :10071000EA0C1800FE98FFE23FCCD822EF3901B571 :100720003348F0091800CC11EF3901B63418F0093C :100730001800FE98FFC630E8EF68010CCC3BEF696B :10074000010CCC0BEF3901B63408F0091800FE9803 :10075000FFB8301948A8F169010CCB4BF93901B643 :100760003408F0091800FE98FFA835A8F968010CB4 :10077000CA9BE80C1800FE9BFFD1CBFB000087F45E :100780008001F4A48001F504800205ECEBCD40E08B :10079000303CF01F002330CB18954A26300CF01F58 :1007A0000022ED4C01AC1897C360303BF01F001FD6 :1007B0008F2CECF901AC72275807C2903078300BBF :1007C000B2883068ECFA01ACB498ECF901ACB2AB89 :1007D000ECF801ACB0BBECF901ACB2CBECF801AC7D :1007E000EB390075702AB489ECF801ACEB39007470 :1007F000702AB499ECF801ACEAFB00847029B2AB22 :10080000ECFC01ACF01F000AE3CF90E0ECCCFE540E :10081000F01F00080E9CE3CD80E000008001EF6C2B :10082000000087F48001D8DC8001D3EC800208D47A :100830008001D3A8D401F01F0002DA0A8001DA5641 :10084000D401F01F0002DA0A8001DF30D401F01F6A :100850000002DA0A8001DBE8D401F01F0002DA0AA4 :100860008001DC04D401F01F0002DA0A8001DC20E0 :10087000D401F01F0002DA0A8001DC3CD401F01F31 :100880000002DA0A8001DC58D401F01F0002DA0A03 :100890008001DC74D401201D1A9BF01F000CC09055 :1008A00040085808C06048AA7499EDB90000C030EB :1008B0002FFDDA0A1298A1C831CC9598300A149B02 :1008C000F01F00042FFDDA0A8001D98C000087F4A4 :1008D00080014658EBCD40C0206D4958189B709C54 :1008E000E21C0002C06118970E9C2FADE3CD80C0C2 :1008F00030081A96502850081A9CF01F000EC1119B :10090000189740085808C0401A9CF01F000B402C54 :10091000580CCEB0F01F00090E9C2FADE3CD80C067 :100920001A9C3017F01F0006CEDB0000000087F491 :100930008001DED08001D3A8800091E880018E9CE8 :10094000EBCD4080201D300A1A9BF01F0017C0F02D :1009500040085808C0F149576E99EDB9000BC071B5 :10096000EEF801A84917F1D8C001C1212FFDE3CF4E :10097000908048E76E99EDB90000CF01A1C9300A17 :100980008F9931CC149BF01F000A6E99CE7BEEFC40 :1009900001ACF01F00086E98301CABD88F982FFD6B :1009A000E3CD80808001ED10000087F4800146587F :1009B000800208D4D401F01F0002DA0A8001DBD0E3 :1009C000EBCD40FC206D4A5318951097169266980F :1009D0001496109C1294E21C0002C2D05BF5C30175 :1009E000303CF01F001F300BF3D7C010F5D4C010FF :1009F0001AD90C981ADAF3D2C010504B502BFAC601 :100A0000FFF8F93B00F70A9A0C9CF01F00162FED37 :100A1000580CC1B1189740085808C0401A9CF01FE4 :100A20000012402C580CC030F01F00100E9C2FAD4F :100A3000E3CD80FC18970E9C2FADE3CD80FCEDB884 :100A40000000CCF13FB7CF3B6698A1A81A9C8798CD :100A50003017F01F0007CE0B000087F48001EF6C09 :100A60008001DB588001D3A8800091E880018E9C32 :100A7000D40130085C7B1099109AF01F0002D80254 :100A8000800209C0D4013008364B1099109A109C8E :100A9000F01F0002D8020000800209C0EBCD40E048 :100AA00020AD3006507CFB6B00201497500650267A :100AB0001A95FACAFFDCFACBFFE81A9CF01F00195E :100AC000C111189640085808C0401A9CF01F001623 :100AD000402C580CC030F01F00150C9C2F6DE3CD3E :100AE00080E05807C09040980E9B0C9C8F28F01F08 :100AF0000010581CC0611A9C3016F01F000ECE3B2F :100B000040085808C0401A9CF01F0007402C580CA1 :100B1000C0313FD6CE3BF01F00053FD6CDFB0000D5 :100B20008001DC8C8001D3A8800091E880016C40BA :100B300080018E9CD401F01F0002D80280020A9C22 :100B4000EBCD40E0209D3018189A1697F00C09481C :100B50004A5B7609F1E9000CC06118970E9C2F7D65 :100B6000E3CD80E0F00811FF12683006507A970854 :100B7000500650261A95FACAFFE0FACBFFE81A9CF5 :100B8000F01F001AC1E05807C09040880E9B0C9CD3 :100B90008F28F01F0017581CC1611A9C3017F01FD6 :100BA000001540085808C0401A9CF01F0013402C44 :100BB000580CCD50F01F00110E9C2F7DE3CD80E02E :100BC0001897CF0B40085808C0401A9CF01F000A25 :100BD000402C580CC0313FD7CC2BF01F00083FD71A :100BE000CBEB000000007A4C8001DCEC80016C4013 :100BF00080018E9C8001D3A8800091E8EBCD40F865 :100C0000216DFAC6FF901897FB69000EFB68000F74 :100C1000FB6B0010FB6A00116CF46D036D15ECCCDE :100C2000FFD4F01F0038306ABA6CECCBFFDCFACC92 :100C3000FFEDF01F00350D88FB6800190D99ECCB16 :100C4000FFFEFB69001A320AFACCFFE5F01F002E06 :100C50004AEE30097C0B301CF809094AF5EB000814 :100C6000C0902FF95899CF9130060C9C2EADE3CD52 :100C700080F8F7EA10089D085BF9CF705024FB63F9 :100C8000001250195807EFF91A003006FAC7FFC4CE :100C900050F65116FACAFFAC1A9B0E9CF01F001CAE :100CA000C111189640F85808C0400E9CF01F00195A :100CB000411C580CCDB0F01F00180C9C2EADE3CD9C :100CC00080F85805C09041580A9B0C9C8B28F01F57 :100CD0000013581CC0610E9C3016F01F0011CE3B53 :100CE00040F85808C0400E9CF01F000A411C580CE8 :100CF000C0313FD6CBBBF01F00083FD6CB7B0000F6 :100D000080018058800091DC00007A4C8001DD4C2D :100D10008001D3A8800091E880016C4080018E9C06 :100D2000D42120DD4B0510946A0E4126F1DEC0016E :100D3000C0B0EDBE0001C411EDBE0002C411300709 :100D40000E9C2F3DD82210973018FB6B002A508A3A :100D50005077FDE8100850998B08FB540028580C78 :100D6000F9F71A001A953007FACAFFD05007502732 :100D7000FACBFFE81A9CF01F001DC101189740082C :100D80005808C0401A9CF01F001A402C580CCD90F7 :100D9000F01F00180E9C2F3DD8225806C09040C866 :100DA0000C9B0E9C8D28F01F0014581CC0C11A9C6F :100DB0003017F01F0012CE4B30173028CC7B302775 :100DC0003048CC4B40085808C0401A9CF01F00081F :100DD000402C580CC0313FD7CB4BF01F00063FD7FB :100DE000CB0B000000007A488001DDAC8001D3A865 :100DF000800091E880016C4080018E9CEBCD40E04A :100E0000207D300616975006189B50261A95FACA70 :100E1000FFE81A9CF01F001AC111189640085808E4 :100E2000C0401A9CF01F0017402C580CC030F01F17 :100E300000160C9C2F9DE3CD80E05807C1904068C0 :100E40000E9B0C9C8F28F01F0011581CC1104008ED :100E50005808C0401A9CF01F000B402C580CC0D002 :100E6000F01F000930060C9C2F9DE3CD80E01A9CFA :100E70003016F01F0007CD3B1896CDCB8001DE0C5D :100E80008001D3A8800091E880016C4080018E9C95 :100E9000D40120CDFB5A0012FB590014FACAFFCC32 :100EA000502874197408FB590016501874397428A6 :100EB000FB59001AFB580018745974485039FB58F4 :100EC000001C74797468FB590020FB58001E74994B :100ED000748850A95098300974A8FB6C0022FB5B01 :100EE0000010FB68002C74BBFB6900231A9CF01FE8 :100EF00000032F4DD802000080020DFCEBCD40EE28 :100F000020CD3FF94CC850A950B94CC93005303CF0 :100F100091059305F01F004A322A18961A971A9CD9 :100F20000A9BF01F0048FAC3FFDE306AE06B00FF47 :100F3000069CF01F00441AD5ED38004F1AD86D28D2 :100F40001AD86D191AD9ED1800361AD8ED190032D1 :100F50001AD96CE81AD8ED19002E1AD9ED18002A02 :100F60001AD8ED1900261AD9ED1800221AD86C6982 :100F700030BB1AD9301C6D08ED1900FEED3A001F88 :100F8000F01F0031ECFB01282F4DF6C80001581866 :100F9000E0880045ED3100F7ECCAFF8C30153006D3 :100FA0001AD61AD540D81AD8F4E80000206D069B4E :100FB000FAE900081A9CF4E20008306AFAE300102B :100FC000F01F0022EF380021209DFB680021EEE891 :100FD0000000FAE90000EEE20008FAE30008EEE89B :100FE0000010FAE90010EEE20018FAE30018EF38FA :100FF0000020029BFB6800200A990C98FACCFF9015 :10100000303AF01F00130C9A2EED0C9B40ACF01FF1 :1010100000110A9C2F4DE3CD80EE1AD50A98FACC28 :10102000FFD05C5B0A99FE7AFF6AF01F000B2FFD70 :10103000CB2B000000007A4C00007A488001EF6C56 :10104000800091D080020E908002E73680020BFC77 :1010500080020A9C80020D20D431202D500B189163 :101060004A1776026E9CE21C0002C350304C5011AD :101070005801E2021700F01F001DEEF700F0189073 :101080005807C2D030043013C0A82FF45802C1B1A1 :101090005801F9B301FF5805C1100A9760B66E05F3 :1010A000F01F00130C9A189B0E9CF01F0012CEE04C :1010B0000E9CF01F00115805CF114008069C9104AA :1010C0002FEDD83240182012110C0E9B5018F01F33 :1010D000000BCE2B1893069C2FEDD8320E943013B4 :1010E000CEDB0000000087F48001EF6C800145C476 :1010F000800159A080015CDC800184284828F0FC34 :1011000000F85EFC000087F4486871195879F9B856 :101110000001F9F80A00F9B80100F9F81A005EFFB9 :10112000000087F44828F14C007C5EFC000087F446 :101130004828F14C01D05EFF000087F4EBCD40C0A1 :1011400018971496E04A0020E088000830083FF91C :10115000B898B889E3CF80C02FECF01F00043008A6 :10116000AE96AE88E3CF90C0800091DCEBCD40FC22 :10117000206D18941695F01F00431897C1A0F939F7 :1011800000CC3FF8F0091800C3910896EF3900A889 :101190003FF8F0091800C5414BB8F0F700F85807C0 :1011A000C0A1EC040104301C8B042FADE3CD80FC06 :1011B0000896CF3BE06AFFFF300B1A9CF01F00330C :1011C0006F38302A707C1A9B2F4CF01F00311A9216 :1011D0006A0A9A93063AC0442FADE3CFC0FC0C9B39 :1011E0001A9C5C7AF01F00296F380606707C1A9BE7 :1011F0002F4C300AF01F0026CD5BE06AFFFF300B5A :101200001A9CF01F0022302AEEC2FF341A9B049C65 :10121000F01F00201A966A0A9A93063ACDE55C7A86 :10122000089B1A9CF01F00191A9B049C300AF01F9F :1012300000196A08E803000606188B08CA8BE06AE2 :10124000FFFF300B1A9CF01F0011302AEEC7FF5829 :101250001A9B0E9CF01F00101A926A0A9A93063A83 :10126000CBC50C9B5C7A1A9CF01F00081A9B0E9C45 :10127000300AF01F00096A08060606188B08C8DB4A :101280008001EFF8000087F48001C7B88001D344E3 :101290008001D6B08001D558D401F01F0002D802D9 :1012A00080015D18EBCD40F8FACD00803225149313 :1012B00018941297BA85FAC6FFFF0C9CF01F001B0A :1012C000300806063019AC85AC981A951A9A498BE5 :1012D000089CF01F0018C0503FFC2E0DE3CD80F895 :1012E0000E9CF01F0015E04C0040C1701AD7493A1F :1012F000E06B00800A9CF01F00120A9A3019491B0B :10130000089CF01F000C2FFD1897580CCE61089C0C :10131000F01F000D0E9CCE2B0E9A089C3019489B96 :10132000F01F0004CDB0CD9B800091DC8003C4FC95 :1013300080023BB8800091B8800399D0800091482A :101340008003C50480024328D421210D300B4B6655 :10135000169CF01F00368D0CC2B078075807C2A04B :101360006F985808C2704B283014EF4400641A95E7 :10137000340B1AD84AFA0A9CF01F002F08990A9ACF :101380004AEB0E9CF01F002E2FFD580CC2506C082B :10139000700CF01F002C6C09300893086C08700961 :1013A0004A98722A910A6C09300893486C0C2F0DE8 :1013B000D822F01F00261897CF70F01F00254A583A :1013C0004A59118A4A5B0E9CF01F0025C2056E29FE :1013D00049D89109CE9B08994A2A4A3B0E9CF01F96 :1013E0000018C1C14A18340B1AD8492A0A9CF01FA8 :1013F000001208990A9A49EB0E9CF01F00112FFD6C :10140000580CC0C13088EF480054CC9B0E9CF01F94 :10141000000D6C0930089308CC7B0E9CF01F00096E :10142000CB7B000000008C8C80023B4C8003C50805 :10143000800399D0800091488003C4FC80023BB8AF :1014400080024190000003FC80024F4080023B225A :10145000000004000000042800000404800212A41C :101460008003C5108003C5148003C5188003C538E8 :10147000D421169849871495189B109A49740E9C8C :10148000A888F01F00170A9B30064965EF66002008 :10149000341A0A9CF01F001449484959EB66004071 :1014A000700B720CF01F00131896C0C0F01F0012D2 :1014B0000A99098A0E9B0C9CF01F00106D185808A1 :1014C000C021D822ECCAFFDC0A9C3209341BF01F71 :1014D000000CD8220000040400000400800091DC0D :1014E00000000428800091AC000003FC00008C8CFC :1014F00080023B0680023B22800212A480023A68EE :10150000D421210D328A300B1A9CF01F00301A9C16 :1015100030073014504750544AD5F01F002E8B0C22 :101520001A96C4A0FAC6FFD8318A0E9B0C9CF01FF5 :1015300000274A984A990C9B50E850A96A0CF01F62 :1015400000281896C3B04A7CF01F00274A761AD7A5 :10155000304B1AD70E984A694A6AEC0B000CF01F00 :1015600000260E981AD74A591AD74A5A302B0C9C83 :10157000F01F00210E981AD74A291AD74A2A311B80 :10158000ECCCFFF8F01F001C0E981AD749F91AD7B7 :1015900049FA312BECCCFFF4F01F00170E982F8D79 :1015A000ECCCFFF01AD749B91AD749BA315BF01F12 :1015B0000012089C2FED2F0DD8226A0CF01F001787 :1015C0000C9C8B06CF9B0000800091D000007A50CD :1015D00080022B4C8003C5448003C54C80022C0440 :1015E000800216FC8002113000007A5480021670CE :1015F0008003C55480016EB8800217408003C3ACDD :10160000800216C48003C5708002168C8003C58CCE :101610008002161C8003C5A480022AF8EBCD40C0CE :1016200021AD189798E8EDB80000C181368A300BDB :101630001A9CF01F000C306A0E9B1A9CF01F000AC7 :101640006E2830195C3850395028488870091A962D :101650001A9A720C306BF01F00062E6DE3CD80C01D :10166000800091D0800091DC00007A508002792CBB :10167000D40148587009300A720C301BF01F000367 :10168000D802000000007A508002792CEBCD404057 :1016900021AD368A300B1A9CF01F000830084889AB :1016A000500872081A961A9A700C302BF01F000519 :1016B0002E6DE3CD80400000800091D000007A5074 :1016C0008002792CEBCD404021AD368A300B1A9C3C :1016D000F01F000830184889500872081A961A9AA4 :1016E000700C302BF01F00052E6DE3CD8040000004 :1016F000800091D000007A508002792CD401487883 :10170000700EF6C9000E189AF8CBFFFA2F2A7C0C3F :10171000F01F0003DA0A000000007A50800224E083 :10172000D401580CC051304CF01F0004D802304C8A :10173000F01F0003D80200008001A12880019F3023 :10174000EBCD40E0FACD0170FACCFE98F01F001905 :10175000581CC22145A85818E088001FE068010005 :10176000FACBFE901A9C16D8F01F00131A95189603 :10177000FAC7FF00368A300B0E9CF01F0010581677 :10178000C11048F870090E9A720C300BF01F000D52 :101790002A4DE3CD80E0300CF01F000B2A4DE3CD45 :1017A00080E045B85808FE9AFFEE540D5418CEABB1 :1017B00080015F448002116C800091D000007A505B :1017C0008002792C80021720000000000000000039 :1017D000EBCD40C0F8F800D418971696F0F80088C2 :1017E000F8FA00E85808C040F8FC00C45D185876C4 :1017F000C1A058065F0858365F091248C11030185A :10180000EF4800ECEEF900D473985808C050300B44 :10181000EEFC00C45D18EF4600E8E3CD80C05846FA :10182000CEF0CFABEEF800EC5808CF603008301B9C :10183000EF4800ECEF4B00F0EEF800D47198580838 :10184000CE81CEABD401F01F0002D802800217D0A7 :10185000F8FC00E85EFCD401F8F800D471A8580840 :10186000C050F8FC00C45D18D802109CD802D40106 :10187000F8F800D471185808C050F8FC00C45D187E :10188000D802DC0AD401F8F800D471285808C050F6 :10189000F8FC00C45D18D802DC0AD703EBCD408009 :1018A0003008F8F90108F94801085809C031C08822 :1018B0000E997207129CF01F00045807CFA1E3CDC8 :1018C00080800000800091E8D401F8FC00DCF01F6B :1018D0000002D8028002B4A4D401F8FC0090F01FEA :1018E0000002D80280023B8CD401F8FC0090F01F6B :1018F0000002D80280023C84EBCD40C01696F8F777 :1019000001085807C051C0B86E075807C080EECC18 :10191000FFFC306A0C9BF01F0004CF710E9CE3CDDE :1019200080C000008000917CD4011699F8F801185D :101930005808C0A1F8F800D470285808C0C0F8FCB6 :1019400000C45D18D802F8CBFF64306A129CF01F07 :101950000003D80ADC0A0000800091DCEBCD40F8DF :1019600020AD1897F8F801185808C06030070E9C91 :101970002F6DE3CD80F8F8F800D470385808CF7098 :10198000F8FC00C41A9B1A935D181895CF05EEF861 :1019900001185808C431EEF800D470285808CE70E9 :1019A000FAC4FFE0EEFC00C4089B5D18CE05EEFC17 :1019B000009078465806C301EEF800D45808C2C01B :1019C000700C49BBF01F001BEFFC0024F9B60001AE :1019D000EFFC102478075807C111CCAB5806C0B0F3 :1019E0006E885808CC50EECBFFE8306A089CF01F98 :1019F0000012CBE06E075807CBB0EEF80194580800 :101A0000CFA16E581035CEB16E4B0A9A1A9CF01FBA :101A1000000ACE70CE4B3006CDEBFAC4FFE0306A40 :101A2000EECBFF64089CF01F0005CC2B8003C65C46 :101A3000800091A08000917C800091DCD401F01F97 :101A40000002D8028002195CD42120AD3008FB5876 :101A50000024508816961897F6F801845818C0404C :101A60003FFC2F6DD82277185808CFB0F8F500B892 :101A70005885C2205905CF512DCB0A9A1A9CF01FC8 :101A800000171A940A9A303BEEFE00D47C5858088E :101A9000CE801ADA1AD43009EF490104EEFC00C4F2 :101AA00030681AD8FACAFFD430181ADA48CA7C56F5 :101AB0005D162FCDCD7B2DCB318A1A9CF01F0007F0 :101AC0000A9AECCBFFCCFACCFFE8F01F00041A9482 :101AD000320A302BCDAB0000800091DC80039C38B3 :101AE000D42118951696F01F000F1897C05078381B :101AF0002FF89938D82A310CF01F000B1894C0F039 :101B00000C9B306A2FCCF01F000930188938EAF995 :101B100001088909EB4401080E9CD822DC2A000048 :101B2000800218F880028F24800091DCEBCD40FC0D :101B3000EDD9C010407218941693ECCCFFFC1495AC :101B4000910CF01F00161897C190E8F800907039BA :101B5000EC081608B893B889B8B6B8A85805C100FB :101B60000C9A0A9BF8C6FFFC0C9CF01F000D0E9C03 :101B70005802E5F61A00E3CD80FCE3CD80FC0C9A18 :101B80000A9BF8C6FFFC0C9CF01F00060E9C580236 :101B9000E5F61A00E3CD80FC80009200800091DC25 :101BA000800091D0D401401E5C791ADEF01F000243 :101BB0002FFDD80280021B2CEBCD40F8203DF8F819 :101BC00000BC1493129458485F0A58285F0918976C :101BD00016961449C0603FF70E9C2FDDE3CD80F8C8 :101BE000F8FC00DCF01F002BC0305816CF50EEC5BB :101BF000FF64306A4A8B0A9CF01F0028C0D1EEF8BF :101C000000D470285808C060EEFC00C41A9B5D1810 :101C1000C370EEC5FF043008F7D6C0081AD8F3D455 :101C2000C010FAC8FFF4069A0E9CF01F001D2FFD8D :101C30001896580CCD1040296E2C580CC1001298E3 :101C40000A9B0C99E06A888EF01F001618970C9C6E :101C5000F01F00150E9C2FDDE3CD80F8EEF800D4C8 :101C600071845804C0B01298EEFC00C40A9B0C9911 :101C7000E06A888E5D141897CEBB3FF7CE9B306A22 :101C8000485B1A9CF01F0005CC501A95CC5B0000F5 :101C900080028F78800217C88000917C80021B2C04 :101CA00080028154800091E8EBCD40C0189EEFDAAD :101CB000C010782C580CC0600E9AF01F0009E3CDBC :101CC00080C0FCFA00D475865806C0700E9AFCFCE1 :101CD00000C45D16E3CD80C0E3CFC0C08002815454 :101CE000D421497A1894301BF01F0016300A089B43 :101CF000495CE8C5FF64F01F0015E8F701085807C4 :101D0000C1C03006C0680E966E0C580CC1601897A2 :101D1000306A0A9BEECCFFFCF01F000DCF51580635 :101D2000EFF80000E9F80A42EFF81000EDF81A00A9 :101D30000E9CF01F0008D822D82200008003C66441 :101D400080023A1A80023058800274008000917C30 :101D5000800091E8D401F01F0002D80280021CE04C :101D6000EBCD408048FA1897301BF01F000FEEF8BB :101D700000BC5818C0F00E9B300A48CCF01F000C75 :101D80000E9CF01F000C0E9C307BF01F000BE3CD6F :101D900080800E9C305BF01F0008E3CD8080000047 :101DA0008003C68880023A1A8002360080027400DE :101DB00080021CE0800217D0EBCD4040486A1896A4 :101DC000301BF01F00060C9B300A485CF01F00051A :101DD000E3CD80408003C6A880023A1A8002360014 :101DE00080027400EBCD40F81894F8FC00CC580C3D :101DF000C360E8F800D05808E08A00321897E8C3BA :101E0000FF643005C0A8580AC200EEC7FF64E8F8B6 :101E100000D00A38E08A00242FF5E8F600B0306AD6 :101E2000069B0E9CF01F0015CF115806C0E06C5A9F :101E30006EA81438CE91EECCFFFA6C4BF01F000F59 :101E4000C0406C5A580ACE215807C0906F5AEECB4A :101E5000FFD4E8FC00DCF01F000AC0403FFCE3CDEB :101E600080F8EECBFFA8E8FC00DCEEFA0080F01F63 :101E70000005CF60CF4B00008000917C8002B58CC4 :101E80008002B52CD4211895E06C009CF01F001B3B :101E90001897C310EAF401185804C2A1EAF800D454 :101EA00070C85808C250189B301AEAFC00C45D186C :101EB0001898C1E50E9C3016E06B009CF0060D46AC :101EC000EC0B024BF01F000E58065F09580C5F1810 :101ED0001248E8081800F8071710EAFC00CCF01FB9 :101EE0000009089CEB4600D0EB4700CCD8220E9CA2 :101EF000F01F0004DC2A000080009200800091F4B2 :101F0000800091E8EBCD40801897F01F0008C031A9 :101F1000E3CD80800E9CF01F0006C0550E9CF01F84 :101F20000003CF7BE3CFC08080021DE480021E84CB :101F3000EBCD40FE208D18961697149512921091B5 :101F4000580BC580F6FB0080580BC0E16F5B580B47 :101F5000C3210C9CFEFA02E4303BF01F00B93FFCA9 :101F60002F8DE3CD80FE7568EDB80001CF011A9A80 :101F7000EECCFFA8F01F00B3CEA16B484029126839 :101F8000CE606B3840191268CE206B584039126809 :101F9000CDE0FEFA02B2301B0C9CF01F00A9EEC48B :101FA000FFD4302A303BECFC00DCF01F00A8089C7A :101FB0006F5AC4386B68EDB80000CCC1EEC4FFD4D2 :101FC0001A9A089CF01F009FCC516B484029126858 :101FD000CC106B3840191268CBD06B58403912685E :101FE000CB90FEFA026A301B0C9CF01F0095301A51 :101FF000CDAB7568E21800021A93F9B40102F9B486 :102000000001F8FC00DC1A9BF01F0092C1F05BECB1 :10201000C4001A9C320A300BF01F008F6B48502806 :102020006B3950196B585038089A303BECFC00DC87 :10203000F01F0086300C189A189BECFC00DCF01F97 :102040000087C3602F8DE3CFC0FE402A6B49F3EABF :102050000008C0D0401A6B39F3EA0008C110403ABA :102060006B59F3EA0008C1B04004CDFB1AD9302BFC :102070001ADA0C9C4FAAF01F00722FEDCCBB1AD9B4 :10208000302B1ADA0C9C4F7AF01F006D2FEDCC2B01 :102090004F5A302B0C9CF01F006ACBCB1AD9302B37 :1020A0001ADA0C9C4F1AF01F00662FEDCB3B580735 :1020B000EE0B1700F60A1700F9B80158EFD8E10B3C :1020C000EFFA1020ECFC00DCF01F0069CBC16B487C :1020D0004029F1E90009EDB90004C5D0EDB90003CC :1020E000C750EDB90002E081009430484E1AED4827 :1020F00000B8301B0C9CF01F00526B384019F1E9FE :102100000009EDB90004C500EDB90003C7513088DE :102110004D9AED4800B4301B0C9CF01F00496B58E1 :102120004039F1E90009EDB90000E080007FEDB928 :102130000001C55130284D1AED4800BC301B0C9CE5 :10214000F01F003FECFA00BC306BECFC00DCF01F31 :10215000003FECFA00B4304BECFC00DCF01F003B1D :10216000ECFA00B8305BECFC00DCF01F0038029A9F :10217000049BECFC00DCF01F00421894FE91FF640D :102180006B57E2170002C191ECFC00DCF01F003D30 :102190000E9CCE7A31084BCAED4800B8301B0C9C1F :1021A000F01F0027CABB31084B8AED4800B4301B32 :1021B0000C9CF01F0023CB4BECFC00DCEACBFFDCDB :1021C000320AF01F0033089CCCCA30884B1AED4805 :1021D00000B8301B0C9CF01F001AC90BEDB90004AD :1021E000FE91FF3231084ACAED4800BC301B0C9CFE :1021F000F01F0013CA8BEDB90000FE91FF25301BC4 :102200004A6AED4B00B40C9CF01F000DC89BEDB961 :102210000001FE91FF1930284A1AED4800B8301B22 :102220000C9CF01F0007C6AB301B49EAED4B00BC0D :102230000C9CF01F0003C87B8003C8EC80023A1A94 :102240008002BD688003C6C08002B4D48003C6E0AB :102250008002C04C800091D08002B58C8003C734CE :102260008003C7788003C7008003C7BC8002B52CF9 :102270008003C8288003C86C8003C8B08002B64CB5 :102280008002B9EC8003C8008003C8588002B91CE2 :102290008003C8148003C8CC8003C8808003C84072 :1022A0008003C894EBCD40C07758EDB80003F9B86F :1022B0000008F9F80A2FF9B80104F9F81A2F18974D :1022C000300A1696F8FC00DC149BF01F0025300A3B :1022D000EEFC00DC149BF01F0023300AEEFC00DC57 :1022E000149BF01F002130183009ECCBFECCEF48D6 :1022F00000B8EF4800B4EF4900C02FF976085858ED :10230000E08B00225808C2512FCB5849CF71EEFA0A :1023100000BC306BEEFC00DCF01F0014EEFA00B4E1 :10232000304BEEFC00DCF01F0011EEFA00B8305B21 :10233000EEFC00DCF01F000DEEFC00DCF01F000CDA :10234000E3CD80C03048EF4800B8EF4800B4CE0B72 :102350003028EF4800B8EF4800B4CDAB8002B58C10 :102360008002B52C8002B5EC8002B4D480028F804C :10237000EBCD40E0205D1897F8F600B0F8F800BC0F :102380005828C57059085F0958485F081248C2901C :10239000302BEEFC00E0F01F002F314A300B1A9C6E :1023A000F01F002D1A95EEFA00BC588AC200EEF814 :1023B00000905808C03070785028149958895F18D8 :1023C00058195F191069ECF8017CEEFC00E01A9ACC :1023D0000C9B50495038F01F00212FBDE3CD80E009 :1023E000300BEEFC00E0F01F001BCD8B30085018C6 :1023F000301B500BECF900F0F3EB0008FBFB1A016B :10240000EDB90001C120EEF800905808C1F0EEFCD3 :1024100000D4580CCD10780C491BF01F0012FBFCA7 :102420000A01EEFA00BCCC4B4018A1B85018CECB34 :10243000300BF8FC00E0F01F000C300BEEFC00E06D :10244000F01F000AEEF800BCC9EB3089CB8B00000E :1024500080026178800091D08002581C8003C65CA5 :10246000800091A0800261A48002618CEBCD40E0ED :10247000189716951496F8F800905808C0D0704830 :102480005808C0A1F8FC00D4580CC060780C48EB88 :10249000F01F000EC1501AD648DA1AD5301B0E9C18 :1024A000F01F000C300A0E9B48BCF01F000C0E9968 :1024B0000C9B0A9C3008488AF01F00092FEDE3CDE1 :1024C00080E000008003C65C800091A08003C960AA :1024D00080023A1A800230588002740080027474BC :1024E000D4211295169614941897F8F900BC5849FF :1024F000C1C0F8FA00F4580AC10158895F08581998 :102500005F0B104BF40B1800F9BB000AF9BB014636 :10251000F01F0019EEFA00F4F4C8FFFFEF4800F4D2 :10252000EEF900945809C020D822306A0C9BEECCFA :10253000FF04F01F0012EEF800BC5828C111EEF89D :1025400000D471585808C040EEFC00C45D180A99C8 :10255000089A0C9BEEFC00DCF01F0009D8220A99B7 :10256000089A0C9BEEFC00E0F01F0006FE99FFDECF :10257000CE7B00008002246C800091DC8002C3CC02 :10258000800261FCEBCD406C1ADA18951ADB1692CA :102590001493301B48AAF01F000B48B6300A0A9B60 :1025A0000C9CF01F000A0A990C9A069B049C3008A8 :1025B000F01F00072FEDE3CD806C00008003C99071 :1025C00080023A1A8002360080027400800274741D :1025D000D401F01F0002D80280022584EBCD40C058 :1025E000189E1497109CFCF800BC5888C240580BE9 :1025F000C1A0FCCAFF64FCF600D46C585808C19016 :102600001ADC16981AD9300BFCFC00C41ADBFD4BFF :102610000104490E0E991ADE301B6C565D162FCD43 :10262000E3CD80C0FCF600D448BA6C585808CE916F :10263000E3CFC0C0585CF9B80002F9B80104580BE8 :10264000C040FD4800B4CD6BFD4800B8482ACD4BD2 :1026500080037E2080039C38EBCD40F8FACEFFE863 :1026600018967C35F8F400D47C037C17685C7C2ECB :10267000580CC0F01AD51ADE300E1AD71AD3ED4E08 :102680000104ECFC00C468565D162FCDE3CD80F844 :10269000E3CFC0F8D42118951694F8F70104580731 :1026A000C020D822F8F900D472585808C4C01AD7EC :1026B000F94701041AD70E981AD74B6A1AD70E9BFE :1026C0007256F8FC00C40E995D16EAF900D42FCDBD :1026D00072585808C3801AD7EB4701041AD70E98CE :1026E0001AD74ACA1AD70E9B7256EAFC00C4301990 :1026F0005D16EAF900D42FCD72585808C2401AD797 :10270000EB4701041AD70E981AD74A2A1AD70E9BFC :102710007256EAFC00C430295D16EAF900D42FCDC8 :1027200072585808C1001AD7EB4701041AD70E98FF :102730001AD7498A1AD70E9B7256EAFC00C4303960 :102740005D162FCD5804C200EAFA00D47458580818 :10275000C12030091AD91AD9EB4901041AD91298A3 :102760001AD9129B7456EAFC00C4089A5D16EAFA5C :1027700000D42FCD75A85808C070089B3019300AB6 :10278000EAFC00C45D183018EB480104D8220000B0 :1027900080039C38D421204DF8F900D41897169561 :1027A00073885808C2C11094F8C6FFEAC1C8EEFC8D :1027B00000C45D1B1AD4189B0E984C19E06A888ED1 :1027C0000C9CF01F00408F2C2FFD580CC111580598 :1027D000C140189B305CF01F003CEEF900D47388B8 :1027E0005808C0D1737B580BCE31169CCE4BEECB24 :1027F000FFF0F01F0036C1302FCDDC2A7378580867 :10280000C0B0EEFC00C45D18C070189B306AEECCFE :10281000FFF0F01F002F6E2C580CCEA1EF39007A7C :102820003008F0091800C3A1EEF800D47048580829 :10283000C100301BEEFC00C45D18C0B4EEF800D43B :1028400071485808C0601A9BEEFC00C45D18C214A1 :10285000300B0E9CF01F001FEEF800D47099580941 :10286000C070300BEEFC00C45D19EEF800D470A807 :102870005808C050301BEEFC00C45D183018EF48FB :1028800000C84959300C72082FF893082FCDD82270 :102890004038F1D8C002CDD0CB0B300848891AD8C7 :1028A000E06A888E0E98EECBFFF0EECCFF86F01F2C :1028B00000058F3C2FFD580CCB81C9FB800224E022 :1028C0008002819C80028F1C800281E4800091DC68 :1028D0008002269400007A6CEBCD40E018971695A4 :1028E000300BF01F001DEEC6FF64306A49BB0C9C24 :1028F000F01F001BC2E0EEF801185808C1F00C9B55 :102900000E9CF01F00183006EEFC00DC0C9BEF461E :1029100000B0F01F00150C9A0C9BEEFC00E0F01FBD :1029200000130C9BEEFC00E0F01F00110C9BEEFC72 :1029300000E0F01F0010E3CD80E0EEF800D470D886 :102940005808CDE00A9A0C9BEEFC00C45D18CD8BB4 :102950001896CD6B800217D0800217C88000917C3A :10296000800226948002B9D48002581C800261E85B :10297000800261D4D401F01F0002D802800228D85E :10298000EBCD40C01897F8F800C45808C230303B6F :10299000F01F003DEEF800D470495809C070300BAC :1029A000EEFC00C45D19EEF800D470A95809C0709F :1029B000300BEEFC00C45D19EEF800D47098580896 :1029C000C050300BEEFC00C45D18300B0E9CF01FA5 :1029D000002F6E2C3006F01F002E8F266E3C580CF8 :1029E000C040F01F002B8F36EEF800E45808F9B80D :1029F0000100EFF81A39EEFC0090580CC060F01F8F :102A000000253008EF480090EEFC008CF01F0022FB :102A10003006EEFC00DC0C9BEF46008CF01F001F24 :102A2000EEFC00E0F01F001EEEFC00DCEF4600E0D4 :102A3000F01F001CEEFC00DCF01F001BEEFC00DCB5 :102A4000F01F001A0E9CEF4600DCF01F0019EEFC90 :102A500000CCF01F00110E9CEF4600D0EF4600CCDA :102A6000F01F00140E9CF01F0014EEFC00C4580C64 :102A7000C070EEF800D470785808C0205D18E3CD1F :102A800080C00000800228D88002269480028174D1 :102A9000800242B4800091E88002B4CC800256ECFF :102AA00080029438800294088002C0788002189CCA :102AB00080021DB880021CE0EBCD4080169778099B :102AC0001639C0F1761899080E9CF01F000A0E9C6A :102AD000F01F0009E3CF808072180E38C060109993 :102AE0005809CFB1E3CFC0806E189318CEEB000029 :102AF00080022980800091E8EBCD40801897580C27 :102B0000C051C1980E9CF01F000D6E0B580BCFB139 :102B1000F01F000BF01F000B6E4C580CC060F01F34 :102B2000000A6E4CF01F00096E8CF01F00080E9C0E :102B3000F01F0006E3CD808080022AB88002724C2C :102B40008002728480028F20800091E8EBCD40C02B :102B50001897580CC05130060C9CE3CD80C0F01F74 :102B60000021CFA1334CF01F00201896CF606E08D3 :102B70006E19991899296E286E89993899996E3C21 :102B8000580CC040F01F00198D4C6E7C580CC04092 :102B9000F01F00168D8C6E498D59495891096E5A57 :102BA0008D6A4948910A49486E698D7991090C9C52 :102BB000F01F0012C11130196C988DB95808EDF949 :102BC0001A0C6C285808CC906C185808CC606C4CC7 :102BD000F01F000BCC200C9C3006F01F000ACBDB52 :102BE0008002720880028F24800091940000046C9F :102BF00000007AA400007AA0800275F880028F1E7F :102C000080022AF8D431204D580C5F08580B5F0918 :102C1000189316971248C05030050A9C2FCDD83211 :102C2000E06C011CF01F00C01895CF803018F948E7 :102C3000010CFEF102F66E22620B580BC100580225 :102C4000E0800144E2C4FFFC3006760B049CF01FD8 :102C500000B8C0C02FF6090B580BCF810A9CF01F9B :102C600000B50A9CF01F00B4CD8BE2060328EB48A8 :102C700000D46E0C580CE0800122F01F00B0EB4C29 :102C8000008CF01F00AFEB4C0090CE906E185808EF :102C9000C0A0785CF01F00A86E1CEAF60090F01F40 :102CA00000A78D5C6E385808C0C0EAF8009070BC70 :102CB000F01F00A16E3CEAF60090F01F00A08DBC52 :102CC000EAF800905808CCB06E4C580CCC80F01F3D :102CD000009DE04C0063FE9BFFC3EAC1FFEA364A59 :102CE0006E4B029CF01F00986E5C580CE08100F95E :102CF0006620340CF01F008C1897CB10FEF8024CA5 :102D00008F78FEF8024AFEF9024A8F98FEF80248D0 :102D10008F058F458F658F898FC83006FEF4023C82 :102D20008F168FA4FEF202388FB2EAF900907288F3 :102D30008FD8EAF9009072988FE8EAF9009072A8AB :102D40008FF8F01F0088EB4C00E0E08000C20C9B85 :102D5000F01F00850C9BEAFC00E0F01F0084EAF8FD :102D600000D470685808E08000A7029B0A9C5D1898 :102D7000EB4C00C4FE90FF74EAF8009070BBEAF8D8 :102D800000D470895809C0605D19FE95FF69EAF8A2 :102D900000D471685808C0F0EAFC00C45D181897A8 :102DA000C0A0029BF01F0062C0600E9B364A029CCE :102DB000F01F006534CCF01F005CFE90FF514EC840 :102DC0004EC9991899294EC84EC9993899494EC883 :102DD0004EC9995899694EC84EC9997899894EC873 :102DE0004EC9999899A94EC84EC999B899D94EC853 :102DF0004EC999C899E94EC84EC9F9440040F942F4 :102E00000044990599F8F9490048F01F0069EB4C16 :102E100000DCFE90FF25EB39007A3008F00918003D :102E2000C5C1300A029BF01F0063EAF80090EAFC7B :102E300000DC707BF01F0060EAFB00E0EAFC00DCD5 :102E4000F01F005EEAFA009074C85808C60174D8F2 :102E50005808C52174EA580AC080302BEAFC00DC0F :102E6000F01F0057FE91FEFC009B0A9CF01F0055CE :102E7000FE95FEF6EACBFFF0EAFC00DCF01F005204 :102E80003FF8EB4800E4EAF900D473485808C0D092 :102E90001A9BEAFC00C45D18C0814038EDB80002FE :102EA000C0413018EB4801188B0366088B18870562 :102EB000FE9FFEB5EB4800C4CD2A6E3B6E1CF01F92 :102EC0000043EB4C0090CFDAF94B00D4CD3A0E9C86 :102ED000F01F0019FE9FFEC4EACAFF86CA4BF01F0E :102EE000001958FCFE9BFEBC6E5B310AEACCFF86E3 :102EF000F01F0015CFEA109A301BEAFC00DCF01F2F :102F00000030FE91FEADEAFA0090CA5B109A300BD9 :102F1000EAFC00DCF01F002AFE91FEA2EAFA009013 :102F2000C97B000080028F2400000470800091A003 :102F300080022980800091E88000919480021348EB :102F4000800091B8800091AC80021D60800225DC79 :102F500080021BB8800218C8800218E8800218D8C6 :102F60008002609C800261E8800261D48002184483 :102F700080021850800225D0800229748002304CD3 :102F8000800226588002360080021A3C80021928EE :102F900080021CA880021F0480021BA480021D5412 :102FA0008002186E80021884800218568002C0DCED :102FB0008002B4C08002B4B88002B4CC8002B4D421 :102FC000800227948002B90480023B4CEBCD40E0A4 :102FD000306A18971695F8C6FF64497B0C9CF01F61 :102FE0000017C270EEF801185808C1800C9B0E9CA7 :102FF000F01F00130E9CF01F00133006EEFC00DCE7 :103000000C9BEF4600B0F01F00100C9A0C9BEEFCDE :1030100000E0F01F000EE3CD80E0EEF800D470E891 :103020005808CE500A9A0C9BEEFC00C45D18CDFBEC :103030001896CDDB800217C88000917C8002269410 :10304000800276648002B9D48002581CD401F01F3B :103050000002D80280022FCCEBCD40C0499BF8C7BC :10306000FF641896306A0E9CF01F0017EDFB189C49 :10307000E06800A2EDD8E007EDFB08A20FD81AD84F :103080000FC91AD90FB81AD80FA91AD90F9848FA28 :103090001AD80C9C1ADB302BF01F000D0E9B0C9CD9 :1030A000F01F000CECFC00DCF01F000B303B0C9C14 :1030B000F01F000A30182FADED4800A8E3CD80C006 :1030C000800217C88000917C8003C9B880023A1A38 :1030D00080021AE08002BA1C80022FCCD431FACDD3 :1030E00000D03007F94700A8189516941491580B92 :1030F000E0800217F6F60084E8CCFFFA76ABF01F0A :10310000012A1AD61ADC09D81AD809C91AD909B855 :103110001AD809A91AD909981AD809890A9C1AD95A :10312000FEFA0488302BF01F01220E9B306A2F8D8F :10313000EACCFF64F01F011F306A089BEACCFF5EF7 :10314000F01F011D0A9CF01F011D300AEAFC00DC83 :10315000149BF01F011B635AEDBA0003C061E2F833 :1031600001745808E08100B1301063795809C0E05B :10317000E1D9C0011298EDB90001E08000A4EDB9D9 :103180000002F9B80004E1D8E030EAF800D4710890 :103190005808C060009BEAFC00C45D18635A5804DC :1031A000C07069585808C5A0F1DAC002C6E114978A :1031B000E2170013C5B1029B0A9CF01F0102FAC876 :1031C000FF9453375028089B0A9CF01F00FFEAF831 :1031D00000B45828E08001BAE089007F5818E080E8 :1031E000017130285038EAF800B85828C7F058283C :1031F000E08900805818E080016230285048EAF9E0 :1032000000BC58495F0B58895F08F7E81008C78071 :10321000E2C9FECCE2C8FF0C16963007EC1600019E :103220005019500812931092505766095809E081BE :1032300001122FF72FC32F025847CF81EAF900BCA4 :103240005889C671E2F800F04059F1D8C002F3E89D :103250001008E08101311096C5F8E8F800805808A0 :10326000CA70F1DAC002CA40C1083509FAC8FF3095 :1032700010D9029AFAC9FF94300B50290A9CF01F0A :1032800000D3CA202CCDD832E2F801485808E0819A :10329000010FEAF900B0089A300BEAFC00DCF01FDD :1032A00000CCE080017A3509FAC8FF3010D9029AC3 :1032B000FAC9FF94089B50290A9CF01F00C4C8401B :1032C000CE2BA1B0C5DBE2F801785808F9B00004B4 :1032D000F9B00105C4BB5848C8605908C831303935 :1032E0005039EAF800B85828C83130195049C88B0D :1032F0005848C8505908C82130395049C81B3008AF :103300005058E2C8FECC30165018E2C8FF0C5008E6 :103310005909E080011FEAF800D470A85808C0508D :103320000C9BEAFC00C45D18303B0A9CF01F00A90E :10333000354AFAC7FFE8300B0E9CF01F009E580478 :10334000E0800126E8F8008450645098E8C8FFFA4D :10335000507868A95089E2FA0184581AE080009EEA :103360004029403850A950C84049433850D950B836 :10337000EAF800BC5848E08000E7E0890088581867 :10338000E08000A43018510A4014400350E850F087 :10339000FACAFFAC0899069BFACCFF9C7208580841 :1033A000C040F54BFFF0720814A82FC92F0B183A34 :1033B000CF61E2F801445198EAF601185806E0801E :1033C0000089FEFA0212302B0A9CF01F0079301996 :1033D000EAF800BC5908E080008F5809E0800098A6 :1033E000305B300A0A9CF01F007D40585808C1C06D :1033F000EAF800D471485808C170FACBFF44EAFCDF :1034000000C45D18C1114328EDB80001C0D1189760 :103410004F30189268095809E08100A12FF72FC496 :103420002F035847CF81EAF800B05808C070103118 :10343000C050EAFC00E0F01F006BEAFC00DC029BDD :10344000EB4100B0F01F00680A9CF01F00682CCD13 :10345000D832EAFB00D4E2FA014476585808C13069 :103460001AD91AD23009EB4901041AD94DC90E3ABA :103470005F081AD94DEA76560E99301BEAFC00C453 :103480005D162FCD30165056CD5A5888C2005908B7 :10349000FE91FF7A3048C78BE2F901A45809FE9AE1 :1034A000FF6140985808FBF90A09C5BB6368F1D869 :1034B000C021CF0A50375047C2FB30085048CA0AD3 :1034C00030085038FE9FFE913008C5EB3038C5CB30 :1034D000EAF800D470F85808FE90FF750E9BEAFCDD :1034E00000C45D18FE95FF6F0C99EAF800BC5908FE :1034F000FE91FF75029B0A9CF01F003E0A9CF01F84 :10350000003E307B0A9CF01F0033C70BEAF80090A6 :1035100070495819F9BB000AF9BB013CC63B745B02 :10352000744CF01F00214B5A1ADC302B0A9CF01F00 :103530000020306A089BEACCFF5EF01F001E2FFDC2 :10354000FE9FFE023028C20B30195039FE9FFE4DFF :10355000029B0A9CF01F0027CDFAEAFB00D4E2FA96 :10356000014476585808FE90FF5B1AD91AD3EB42F3 :1035700001041AD20E3A5F081AD00E99765649CA3B :10358000301BEAFC00C45D162FCDC49B6248507806 :1035900062595089CE1A301BEAFC00E0F01F001877 :1035A000FE9FFE8380023A1C8003C9F880023A1A0B :1035B000800091D0800091DC80021DB88002B5ECC3 :1035C000800222A48002269480021F308002938011 :1035D000800217D08003CA6C8002246C80037E2096 :1035E000800257488002B9D48002237080039C383F :1035F00080021A4880021CE08003CA488002559667 :10360000EBCD40C021AD1897F8F800AC5808C68142 :10361000F8F6010CEEFB009076095809C061C8F875 :1036200072095809E080008CF2F801945808CF9193 :103630003008EF48010C76495809C670EEFC00D4FA :10364000580CC0E04DAB780CF01F005AEFF8002486 :10365000F1FC0A04EEFB009076485808C560EEF8CD :1036600000E85818E088008D760AEEF800C858186F :10367000C3F0580AC090103AC041C3981438C370C0 :10368000740A580ACFC15826C04076485828C690B8 :10369000580AEFFA1A32F9B80001EFF80A32EEF9D7 :1036A00001105809C04176485818C710EEF80118A3 :1036B0005808C4F1580AF40B1700F60A1700F5FB76 :1036C0001004F5FA1005EEF800D470B85808C410CC :1036D000EEFC00C45D18C3D12E6DE3CD80C0F8F6BA :1036E000010C5806C9812E6DE3CD80C0740A580ABA :1036F000CCB0F4F801945808CFA175885808CC4193 :1037000076485828CF41CC0B0E9CF01F002BCE5092 :10371000EEF800B05808EFFC0A2C0E9CF01F0027B2 :10372000300B1A9C368AF01F00261A961A9A0E9CA5 :10373000300BF01F00242E6DE3CD80C05806FE91A3 :10374000FF790E9C301BF01F00202E6DE3CD80C052 :103750000E9C300A30ABF01F001D2E6DE3CD80C0F3 :10376000580AC1D074085808EFFA1A32F9B80001A3 :10377000EFF80A320E9C300BF01F0015CAEB302B0D :103780000E9CF01F0011EEFB0090C6FBEF480110ED :10379000129A0E9C303BF01F000BC9FB30180E9C98 :1037A000EF4800C8149BF01F0009C97B8003C65C6A :1037B000800091A08002195C80022370800091D06B :1037C0008002792C800217D080022584800230DCB0 :1037D0004848300A48499118910A930A5EFF000050 :1037E00000007A7000007A78EBCD40681695189347 :1037F000F6CCFFEDF01F0022314A1896300BF01F77 :1038000000210A9A8D15ECCCFFF0069BF01F001EDC :1038100049EAF5090042AC09F50800422FF8F558CD :10382000004249B530088D286A198D3993062F86D4 :103830008B1649866C08F0C9FFFF8D095909E0888D :1038400000180A936A0C782A580AF9F80003E7F876 :103850000A01F9F81003F5F81A0320197838910ACB :103860008D09F01F000D6C095909FE9BFFED300A10 :10387000326C149BF01F0009E3CF90688000920027 :10388000800091D0800091DC000087F400007A7005 :1038900000007A78800091E880014658EBCD40E046 :1038A00030961697305E300B33A51989F2C8003078 :1038B000EC081800E08B0019F2CA0030580AC2C5A3 :1038C0001999F2C80030EC081800E08B0017F2C814 :1038D00000305808C215F1EA1048EE0B0B08585B8F :1038E000C291E3CF80E0F2C80061FC081800E08BD1 :1038F000000EF2CA0057CE3BF2C80061FC08180067 :10390000E08B000DF2C80057CE5BF2C80041FC0806 :103910001800E088000DE3CFC0E0F2C80041FC08C9 :103920001800FE9BFFFAF2C80037CD4BF2CA0037F1 :10393000CC6B19A8EA081800CEF12FFB586BCD20EC :103940002FDCCB4BEBCD40E016961497580AC4C041 :10395000300B3095305EC1B8F2CA0030580AC365EA :103960001999F2C80030EA081800E08B0021F2C86B :1039700000305808C2B5F1EA10485808C275EC0B7F :103980000B082FFB1637E08800302FEC1989F2C89E :103990000030EA081800FE98FFE1F2C80061FC0858 :1039A0001800E08B000EF2CA0057CD9BF2C80061F0 :1039B000FC081800E08B000DF2C80057CDBBF2C820 :1039C0000041FC081800E088000DE3CFC0E0F2C819 :1039D0000041FC081800FE9BFFFAF2C80037CCAB90 :1039E000F2CA0037CBCBE3CF80E0F6CA00015E6CB1 :1039F000F80A000913882FF85C58B2885E1CF6C8D4 :103A00000002100CC08819882FF85C58B888201C58 :103A100058085E1C201ACF875EFC5EFCEBCD40C0D0 :103A200049071696189BE0460020F9B60B200E9C1D :103A30000C9AF01F000D3008EE060B080F8858088E :103A4000C0D00E9C35E935FA2208F2081800F9FAC0 :103A5000BE002FFC19885808CF81482CE3CD80C0C8 :103A600000007A7C800091DCEBCD40FE189114922E :103A7000169C1293580BC2A0E20B00045809C20016 :103A800002973006C0881835E08A001418070C33F6 :103A9000E0880018E4060708E80701051AD80E9C1C :103AA00048CA0A9B2FF6F01F000C2FFD580CCEC4FD :103AB0003008EE01010CE968FFFFE3CD80FE0297BC :103AC0003008EE01010CE968FFFFE3CD80FE000045 :103AD0008003DA3080009148580CC140F8FC00D0D7 :103AE000580CC1002FCCF8F8FFFC5808C0417809E9 :103AF0005809C0901638C0302F8CCF6B7808143816 :103B0000CFC15EFF5EF9780C580C5E0C7828163831 :103B1000C0515EFC782816385E0C780C580CCFB17A :103B20005EFC30383189F94800F0F9480058F9480E :103B3000005431E8F949004CF94800503FF9E06879 :103B40000576F949017CF948019C5EFCEBCD40E02B :103B500018961695344CF01F000C1897C1103018A9 :103B60009978993899485806C0500C9CF01F000766 :103B70008F5C5805C0500A9CF01F00048FBC0E9C3F :103B8000E3CD80E080028F2480009194EBCD40C093 :103B9000169679075807C051C0C86E375807C090AD :103BA0006E0C0C9BF01F0004CF910E9CE3CD80C0E7 :103BB000E3CF80C0800091A0EBCD40FC1695189417 :103BC000580C5F0B58055F081493104B1292C040BD :103BD0003FFCE3CD80FC580ACFC048E73006C06800 :103BE0002FF62E07E0460038CF406E0B0A9CF01FE0 :103BF000000ACF710699049A089B0E9C6E185D18F6 :103C0000F9BC01FFF9BC0000E0460038CE31CE1B04 :103C10008003CC00800091A0EBCD40801897580C19 :103C2000C0A0780CF01F00056E1CF01F00040E9C55 :103C3000F01F0002E3CD8080800091E8D421189429 :103C4000169579075807C1A03006C0680E966E3CDD :103C5000580CC14018970A9B6E0CF01F0009CF71D9 :103C60005806EFF81003EDF81A03EFF80003E9F82F :103C70000A100E9CF01F0003D82ADC2A800091A0B5 :103C800080023C18EBCD406016961895760BF01F1D :103C900000056B088D38EB460040E3CD80600000E6 :103CA00080023C3CD431202D500B129CF01F003C74 :103CB0001890C730198A580AC670300118965011EA :103CC000320230930294C0382FF60D8AE40A1800AD :103CD0005F08E60A18005F091248E8081800CF518B :103CE000580AC2C00D87E40718005F18E6071800DD :103CF0005F191268E8081800C4505807C4300C95C2 :103D0000C0385807C0D02FF50B87E40718005F189C :103D1000E60718005F191268E8081800CF31AA8476 :103D20004A0B0C9CF01F0020C171A1A15807C06074 :103D3000EAC6FFFF0D8A580ACCA1009CF01F001BA9 :103D40005801C2404008F141005C40195809C25175 :103D5000129C2FEDD832496B0C9CF01F0013C03120 :103D6000A1B1CE5B0C9C493BF01F000FF9B80004D9 :103D7000E3D8E031FBF91001F7B901FFFBF91A01B3 :103D8000CD6B0C95CCDBF01F0009300840093FFCDF :103D9000F348005C2FEDD8322FEDDC3A800091948F :103DA0008003D304800091A0800091E88003D30CAD :103DB0008003D314EBCD40FE169CF01F00451891F4 :103DC000C6B0198A580AC7A0189630023203309438 :103DD000E80A18005F08E60A18005F091049300871 :103DE000F0091800C0E0109B2FF60D8AE60A1800B3 :103DF0005F08E80A18005F091248F6081800CF515A :103E0000580AC4500D87E80718005F18E607180025 :103E10005F1910693008F0091800C3705807C350C3 :103E2000109A0C95C0385807C0D02FF50B87E607BD :103E300018005F18E80718005F191268F4081800E6 :103E4000CF3130084A3BAA880C9CF01F0023C0F1F8 :103E5000A5A25807C060EAC6FFFF0D8A580ACB9199 :103E6000029CF01F001E049CE3CD80FE49CB0C9CFD :103E7000F01F0019C031A3B2CEDB49AB0C9CF01F80 :103E80000016C0E1A3A2CE6B0C95CDCB029CF01F17 :103E900000135802CE913FF2049CE3CD80FE492BE3 :103EA0000C9CF01F000DC031A1B2CD4B0C9C48FB07 :103EB000F01F0009C071A1A2CCDBF01F00083FF287 :103EC000CD3B029C3FF2F01F0005CCEB80009194AB :103ED00080039A74800091A0800091E880039A6C1E :103EE0008003D31C8003D3248003C8E4EBCD40803F :103EF0001697149C129BF01F00085BFCC031E3CFA7 :103F0000C0801898E018FFE1CFB1EF4C0050109C32 :103F1000E3CD808080023DB4EBCD40801697149CA9 :103F2000129BF01F00085BFCC031E3CFC0801898E3 :103F3000E018FFE6CFB1EF4C004C109CE3CD808041 :103F400080023DB4D431201D500B129CF01F00485C :103F50001891E080007F198A580AC6B0300218967E :103F6000049032033094E80A18005F08E60A18004B :103F70005F0910493008F0091800C0E0109B2FF6C7 :103F80000D8AE60A18005F08E80A18005F0912485F :103F9000F6081800CF51580AC2F00D87E80718003C :103FA0005F18E60718005F1910693008F00918005B :103FB000C3E05807C3C0109A0C95C0385807C0D04A :103FC0002FF50B87E60718005F18E80718005F1940 :103FD0001268F4081800CF3130084A6BAA880C9C8C :103FE000F01F0025C161A1B25807C060EAC6FFFFFB :103FF0000D8A580ACB91029CF01F00205802C1B0D4 :104000004009F34200545800C241009C2FFDD832B1 :1040100049BB0C9CF01F0018C031A1A2CE6B499B7C :104020000C9CF01F0015C0E1A3B2CDFB0C95CD5B3D :10403000F01F0012300840093FFCF34800542FFDE8 :10404000D832491B0C9CF01F000CC051A3A2CCDB42 :104050002FFDDC3A0C9C48DBF01F0007F9B800107C :10406000E5D8E032F7B001FFCC0B0000800091945E :104070008003C8C4800091A0800091E88003D32C05 :104080008003D3348003C8E48003C8E0D431202DFA :10409000500B129CF01F00391890C6D0198A580A8C :1040A000C610300118955011320230930294C03876 :1040B0002FF50B8AE40A18005F08E60A18005F096A :1040C0001248E8081800CF51580AC2C00B87E4070D :1040D00018005F18E60718005F191268E808180052 :1040E000C3F05807C3D00A96C0385807C0D02FF67F :1040F0000D87E40718005F18E60718005F191268BB :10410000E8081800CF31AC8449DB0A9CF01F001D81 :10411000C171A1A15807C060ECC5FFFF0B8A580A06 :10412000CCA1009CF01F00185801C1E04008F141EB :10413000005840195809C1F1129C2FEDD832493B63 :104140000A9CF01F0010C031A1B1CE5B0A9C490B44 :10415000F01F000CCFA040192FF95019CDCB0A96B3 :10416000CD3BF01F0009300840093FFCF3480058E0 :104170002FEDD8322FEDDC3A800091948003D340AC :10418000800091A0800091E88003D3448003D3484D :10419000EBCD40401896784CF01F00466D2CF01F78 :1041A0000045ECFC00D0F01F00436DACF01F004157 :1041B0006DCCF01F00406DECF01F003EECFC008069 :1041C000F01F003CECFC0088F01F003AECFC009073 :1041D000F01F0038ECFC0094F01F0036ECFC009857 :1041E000F01F0034ECFC009CF01F0032ECFC00A03F :1041F000F01F0030ECFC00A4F01F002EECFC00A827 :10420000F01F002CECFC00ACF01F002AECFC00B00E :10421000F01F0028ECFC00B4F01F0026ECFC00B8F6 :10422000F01F0024ECFC00BCF01F0022ECFC00C0DE :10423000F01F0020ECFC00C4F01F001EECFC00C8C6 :10424000F01F001CECFC00CCF01F001AECFC00D4AA :10425000F01F0018ECFC00D8F01F0016ECFC00DC8E :10426000F01F0014ECFC00E0F01F0012ECFC00E872 :10427000F01F0010ECFC00ECF01F000EECFC0150F5 :10428000F01F000CECFC016CF01F000AECFC01803C :10429000F01F0008ECFC018CF01F0006ECFC01A0F4 :1042A000F01F00040C9CF01F0003E3CD80400000D1 :1042B000800091E8EBCD40C0189678085808C031CE :1042C000C0880E987007109CF01F00155807CFA1EA :1042D0006D085808C031C0880E987037109CF01FC8 :1042E00000115807CFA16C5CF01F000F6C6CF01F21 :1042F000000E6C8CF01F000C6C9CF01F000B6CAC63 :10430000F01F00096CBCF01F00086C1CF01F0006B9 :104310000C9CF01F0005E3CD80C00000800241909E :1043200080023C18800091E8EBCD4040320818969E :104330001AD8E0691000F8C8FFDC785A784B792C5D :10434000F01F000430182FFDED480044E3CD8040FD :104350008002B254D421F60815011695F0C6FFFF6D :1043600018940C9CF01F00061897C0600A99089AD0 :104370000C9BF01F00040E9CD822000080028F24AA :1043800080023A68EBCD40E016951896F6CCFFFD1A :10439000F01F00091897C0C00C9B0A9A322618C655 :1043A000F01F0006EE0500093008B296B2A80E9C78 :1043B000E3CD80E080009200800091DCD401580CB5 :1043C000C1D0580BC160198835E92208F2081800DD :1043D000E08B0013129A3009C088F80907082208F8 :1043E000F4081800E08B00092FF9123BFE9BFFF741 :1043F000F01F0003D802F01F0003D802800243849C :1044000080024354D4011698F6FC0140580CC06059 :10441000189BF0CCFEDCF01F0002D802800243BCE7 :10442000D4011698F6FC013C580CC060189BF0CCE7 :10443000FEECF01F0002D802800243BCD4011698A3 :10444000F6FC0138580CC060189BF0CCFEFCF01F45 :104450000002D802800243BCD4011698F6FC013455 :10446000580CC060189BF0CCFF0CF01F0002D80263 :10447000800243BCEBCD40F831EC1694F01F0028CD :104480001896C3906979F8C3FFE2EDB90000C360E4 :104490001897EDB90001C1614A294A380C37F20872 :1044A0001710E60701051AD84A0A0A9B0E9CF01F4E :1044B00000202FFD580CC1C51835E08A001A1807D6 :1044C0006979EDB90002C171496949780C37F20880 :1044D00017100E9C1AD8E6070107496A0E9BF01FB9 :1044E00000142FFD580CC0451837E089000530082E :1044F000E768FFFF0C9CE3CD80F848B848EA1AD87B :1045000031EBF01F000B2FFD580CCF2559DCFE9925 :10451000FFF0EC0C00076979CBDB000080028F24F0 :104520008003936480037E208003D35880009148E9 :104530008003D3648003D350EBCD40F81894332C20 :10454000F01F003E1896C650F8C3FFCEEDB400042D :10455000C6301897EDB40003C1514B994B980C37F6 :10456000F2081710E60701051AD84B7A0A9B0E9C31 :10457000F01F00362FFD580CC4951835E08A00470F :104580001807EDB40002C1514AD94AE80C37F208C5 :104590001710E60701051AD84ADA0A9B0E9CF01F8D :1045A000002B2FFD580CC3251835E08A0030180762 :1045B000EDB40001C1514A294A280C37F2081710FE :1045C000E60701051AD84A3A0A9B0E9CF01F001F05 :1045D0002FFD580CC1B51835E08A00191807EDB445 :1045E0000000C171496949780C37F20817100E9C18 :1045F0001AD8E6070107498A0E9BF01F00142FFD09 :10460000580CC0451837E08900053008E768FFFFFF :104610000C9CE3CD80F848B8490A1AD8332BF01F18 :10462000000B2FFD580CCF25E04C0031FE99FFEF19 :10463000EC0C0007C90B000080028F2480039364F8 :1046400080037E208003D374800091488003D37C54 :104650008003D3888003D3908003D36CD401774C3C :10466000F01F0002D802000080024538D401773CD8 :10467000F01F0002D802000080024538EBCD40F860 :10468000332C1693F01F00401896C6906759F8C453 :10469000FFCEEDB90001C6601897EDB90000C16109 :1046A0004BA94BB80C37F2081710E80701051AD8C8 :1046B0004B8A0A9B0E9CF01F00382FFD580CC4C576 :1046C0001835E08A004A18076759EDB90003C1613F :1046D0004AE94AF80C37F2081710E80701051AD81A :1046E0004AEA0A9B0E9CF01F002C2FFD580CC34574 :1046F0001835E08A003218076759EDB90002C16128 :104700004A294A380C37F2081710E80701051AD869 :104710004A3A0A9B0E9CF01F00202FFD580CC1C581 :104720001835E08A001A18076759EDB90004C171FD :10473000496949780C37F20817100E9C1AD8E80717 :104740000107498A0E9BF01F00142FFD580CC0452D :104750001837E08900053008E968FFFF0C9CE3CDBD :1047600080F848B8490A1AD8332BF01F000B2FFDE8 :10477000580CCF25E04C0031FE99FFEFEC0C000700 :104780006759C8CB80028F248003936480037E2006 :104790008003D3A4800091488003D3B08003D390DA :1047A0008003D3BC8003D398EBCD40C030AC1696C9 :1047B000F01F00181897C1806D69EDB90000C17035 :1047C000189A301BEDB90001C0F149384939580B2E :1047D000F0091700149C1AD9EECBFFF6141B490AF6 :1047E000F01F00102FFD0E9CE3CD80C048B848EAB2 :1047F0001AD830ABF01F000B2FFD580CCF55589C2A :10480000FE99FFF3EE0C000A6D69300BCDCB000072 :1048100080028F248003936480037E208003D3D0A2 :10482000800091488003D3C8EBCD40C01697768CAA :10483000580CC05118960C9CE3CD80C0314CF01F31 :1048400000101896CF90EF38001DEF3A00181AD8D4 :10485000EF39001C1AD9EF38001B1AD8EF39001AAB :104860001AD9EF380019314B1AD81ADA485AF01F02 :10487000000630082FADED680013CDEB80009200EC :104880008003DA4880009148EBCD40E078351696F9 :10489000314CF01F000A1897C0C0EC050308488A85 :1048A0001AD8314BF01F000730082FFDEF680013B6 :1048B0000E9CE3CD80E00000800092008003DD6864 :1048C00080009148EBCD40801697772C580CC09013 :1048D000F01F0009189B6F2CF01F0008E3CD8080AB :1048E000771C580CC060F6CCFFDC320BF01F0004C4 :1048F000E3CD8080800091B88002438480024354DD :10490000EBCD40807838F60800076E085808C0C024 :10491000784C580CC0C0F60C030C189B109CF01F70 :104920000007E3CD8080109CE3CD8080109CF01FB9 :1049300000046E08CF3B0000800243BC800091B8A9 :10494000EBCD40F83228169418961989F009180012 :10495000C0A0F01F001BEBDCC001C19030070E9C13 :10496000E3CD80F8F8C7FFFF322B0E9CF01F001537 :10497000CF6019985808CF31B8880E9CF01F0010EE :10498000890C0E9CF01F00101897CEABF80316018F :10499000E6CCFFFFF01F000D1897CE200C9C069A66 :1049A0000E9BF01F000BC051EE030B0C8903CD8B47 :1049B0000E9C0A97F01F0007CD3B0000800091B8C5 :1049C00080009158800091948000920080023944C8 :1049D000800091E8D421205D18951094129C1696C1 :1049E000F01F000F1897C1906C0A590AE08B001451 :1049F000189B0A9CF01F000B0E9CF01F000B48BA7E :104A00001AD4314BFACCFFFCF01F0009300C2FFDFB :104A10002FBDD822F01F00042FBDDC2A80024940A0 :104A2000800091DC800091E88003D3D88000914819 :104A3000D4013038F6CCFEDCF6CBFEC0F01F00020D :104A4000D8020000800249D4D4013028F6CCFEEC14 :104A5000F6CBFEC4F01F0002D8020000800249D449 :104A6000D4013018F6CCFEFCF6CBFEC8F01F0002D5 :104A7000D8020000800249D4D4013008F6CCFF0CE3 :104A8000F6CBFECCF01F0002D8020000800249D411 :104A9000EBCD40F8201D18971693129C1A9BF01F1F :104AA00000171895C2306E595809C0504008103987 :104AB000E08B00206E695809C04040081039C133AE :104AC0006E366E44E60600066C0CF01F000D8D0578 :104AD0006E4C580CC0504008300CE60409082FFDFD :104AE000E3CD80F80A9CF01F00062FFDE3CFC0F84D :104AF000F01F00033FFCCF4B80024940800091E84B :104B0000EBCD40FEF6F700D05807C0510E94089C3C :104B1000E3CD80FE364CF01F00191894CF90EEC6FE :104B2000FFFCF8C3FF9C189749514962ECFCFFFC5D :104B3000580CC2116C0B580BC1A02F86F01F00122D :104B4000CF600837E2081700E40817101ADCE60700 :104B500001051AD80E9C48DA0A9BF01F000D2FEDB4 :104B60001807580CC0451835FE99FFE23008E76871 :104B7000FFFFCCEB6C0BCE2B80028F2480037E20BA :104B800080039364800271BC8003D3E48000914869 :104B9000D431205D500B129CF01F0056502CE08049 :104BA000008E198A580AE080009B3009402650196F :104BB000503912905049320230931294C0382FF677 :104BC0000D8AE40A18005F08E60A18005F09124817 :104BD000E8081800CF51580AC4E00D87E407180010 :104BE0005F18E60718005F191268E8081800C64049 :104BF0005807C6200C95C0385807C0D02FF50B8732 :104C0000E40718005F18E60718005F191268E80843 :104C10001800CF31AA842FF0403CE00B1503F01FA1 :104C200000361891C4E040490C9CE20900060C9B38 :104C3000F01F00328D1C6C085808C141580CC1018E :104C400040182FF850185807C15040482F88504836 :104C5000EAC6FFFF0D8A580AC3C05031CB3B591C2E :104C6000C2404009F2F801782FF8F348017858075C :104C7000CED15031E0C8FFFFF0071503402CF01FE4 :104C800000200E9B403CF01F001CC2E0F8000039E1 :104C90003008931893084008F14C00D04019580987 :104CA000C0D1129C2FBDD8324009F2F801742FF800 :104CB000F3480174CC9B0C95CAEB3FFC2FBDD83256 :104CC000403CF01F000F402CF01F000D2FBDDC3AC0 :104CD000E0C8FFFF5031F0071503CD1B501A308795 :104CE000503A1490CCCB403CF01F00053FFCCE7BEB :104CF00080009194800091F48002720C800091E811 :104D0000D4213228129716951389F0091800C0A0F3 :104D1000320A2DCB0E9CF01F00271896C2F03FFCE4 :104D2000D822EEC6FFFF322B0C9CF01F0023C3C01D :104D3000F8060107EEC80008E0480037FE9BFFF1C7 :104D40006B2C580CC060F01F001D0E3CC2606B2C19 :104D50003004EB440044F01F001AEECCFFFFF01FBC :104D60000019EB4C0048CDC00C9B0E9AF01F0016AA :104D70006B28089CF0070B04D822EF390040F80993 :104D80001800CCE16B2CF01F000E3018EB460048E9 :104D90000C9CEB480044D8220E9A0C9B6B2CF01F05 :104DA000000BCD61CBEB0C9CF01F00041897CC3BA3 :104DB0008002394480009158800091B8800091E8C9 :104DC00080009200800091DC8000917CEBCD4080DF :104DD0001697129C2E8BF01F0006F9BC01FFF9B844 :104DE0000001EFF80A08E3CD808000008002389CC3 :104DF000EBCD40C018976E38129CF00B000630AA1D :104E0000300BF01F000C8D0C18996E585808C030EC :104E1000103CC0956E6C580CC0401839E0890007F2 :104E2000E3CF80C08D08E3CFC0C08D0CE3CFC0C0FE :104E300080009170D42116941895782B580BE08A35 :104E400000557817683E6E0C78381C38C410EECACE :104E5000FFFC3009C058150C78381C38C3902FF966 :104E60001639CFA52FFB0E9CA36BF01F00241896BC :104E7000C3506A2C580CE08A003B6C08683E7039BD :104E80001C39C355ECC8FFFC300AC0A81097700845 :104E9000F40B15027039EEC8FFFC1C39C2052FFA5D :104EA000143CFE99FFF5F4C8FFFFEC0A002BA36841 :104EB0001697F80A010AEC08000CA36AF01F00100C :104EC0008F048B166A28300C2FF88B28D82218985C :104ED000781C580CCFD19114D822DC2AF4C8FFFFDB :104EE000EC0B000BA368CE6B7817CBDB0C97300A6A :104EF00030480C9BCDFB0000800091F4800091C4F1 :104F0000D4211895781CF01F000D300C8B1C8B2CB5 :104F10006A075807C0F0189618948F140E9B0A9CC5 :104F2000F01F00076E07F9B605FF5807CF710C9CFC :104F3000D8220E96CFDB0000800091E880024E342C :104F4000D421189578095809C1E03FFAC028109972 :104F50007228F4080C4A72085808CFA1F4C4FFFF65 :104F60001296E06C01A8F01F000A1897C0A09924BF :104F70005806EDFC1A00EBFC0A000A9CF01F000525 :104F80000E9CD82212961294CEDB000080028F2451 :104F900080024F005EFD5EFD5EFD5EFD5EFD5EFD1E :104FA000D401584BC0E0E0880007586BC0A0587B84 :104FB000C040D802580BC091300CF01F0005D80239 :104FC000301CF01F0003D802D80200008002172016 :104FD000D401581BC070300A323C149BF01F0005EE :104FE000D80A300A322C149BF01F0002D80A0000A5 :104FF00080014658EBCD40FE201D1094129216956C :10500000F01F0057E8C8FFF25C7C4D69F00C000609 :10501000F33A0109580AC060EC0A0D085809E0810A :10502000008F3003500CE6060001029CF01F004E7A :105030000A9B1897306A400CEE0C000CF01F004BD6 :10504000400C306A4CAB140CEE0C000CF01F004707 :10505000400C302A4C7B2F4CEE0C000CF01F004310 :10506000400C089A049B2F2CEE0C000CF01F003F04 :10507000FAC8FFFC3005114A0E991AD5EE0A000C49 :105080001AD5EC0A010A30EBF01F003B2FED581C3B :10509000C5914009EC090108E048003EE08B001092 :1050A0008E085CC806085CC8AED3029B0E9CAE0896 :1050B000F01F0032300C2FFDE3CD80FEEE09000E14 :1050C0003888FD39000CF0091800CEB1FD39000D0B :1050D00038E8F0091800CE51FD38000EF808180025 :1050E000CE01FD39000F3038F0091800CDA130286D :1050F000FD3A0012F00A18005F1B3FE8F00A1800A2 :105100005F19126BEA0B1800CCC1FD380013E218CE :10511000001D5818CC61FD380014E21800C85888EA :10512000CC01FCCAFFC1FCC9FFE1C0482FF914390A :10513000C0E01388F6081800CFA0CB3BF4090103A8 :10514000C72B0E9CF01F000E3FFCCB6B0FC92FA985 :10515000EE0900091388A3A8B288CA3B8001F4E8CD :10516000000087F480009200800091DC00007AA8A3 :105170008003D6548001F54480014664800091E8A4 :10518000D401201D3068FACBFFFC16D81A9B486C5E :10519000F01F00064848581CF00C1700F9BC01002D :1051A0002FFDD80200007AA880017A88EBCD40401C :1051B000310A1696300B0C9CF01F000630F930783F :1051C0008D198D09300C30398D288D39E3CD804013 :1051D000800091D0D401F01F0002D80A80016048FD :1051E000EBCD4068206DFAC3FFEE1496069C306A42 :1051F000F01F0010FAC5FFFE0C9B310A0A9CF01F3D :10520000000D0A9B204D310A1A9CF01F000B069BD3 :10521000202D306A1A9CF01F0008F01F00082FADE7 :10522000581CF9BC01FFF9BC00002FADE3CD80682C :10523000800091DC8002E73680016094EBCD40680D :10524000206DFAC3FFEE1496069C306AF01F001022 :10525000FAC5FFFE0C9B310A0A9CF01F000D0A9B49 :10526000204D310A1A9CF01F000B069B202D306A3E :105270001A9CF01F0008F01F00082FAD581CF9BC45 :1052800001FFF9BC00002FADE3CD8068800091DC08 :105290008002E73680016168D401F01F0005581CC8 :1052A000F9BC01FFF9BC0000D80200008001F370D6 :1052B000D401F01F0005581CF9BC01FFF9BC000027 :1052C000D80200008001F310D401169CF01F0004E6 :1052D000581CF9BC01FFF9BC0000D802800163E052 :1052E000D431207DFACEFFC050287C027C387C1758 :1052F00050087C2E501E16901894149B1293580A36 :10530000C5C0FAC5FFEA306A0A9CF01F0031202DA3 :10531000306A0A9B1A9CF01F002FF01F002F5802C2 :105320005F1858075F1918912FED1268C181300678 :105330005800C26168193018F0030948F00811FFDD :10534000F1E9000C891C580CC365BFBC891CF01F17 :10535000002318975817C2F02F9DDC3A5887FE9B00 :10536000FFFDFAC6FFF2308A300B0C9CF01F001CC8 :105370000E9A049B0C9CF01F00165800CDC04028CC :1053800058015F091AD8069C1AD630381AD530163B :10539000404A403B1AD6F01F00136819EC03094835 :1053A0001248F1D8C01F189789180C9CF01F000EE6 :1053B0002FCDCD1B2F9DD83AFAC5FFEA306AE06B9E :1053C00000FF0A9CF01F0006CA3B0000800091DC31 :1053D0008002E736800188B080016584800091D02A :1053E0008001661C8001639CEBCD40C01896308C18 :1053F000F01F00091897C0C0300899069918F01FCF :105400000007301CF01F00060E9CE3CD80C0E3CDEA :1054100080C0000080028F248001604880017A10E3 :10542000EBCD4080209D1697FACCFFFEF01F0009BF :10543000581CC0402F7DE3CFC0800E9C1BBAFACB16 :10544000FFFCF01F00051BBC2F7DE3CD808000001A :1054500080017800800091DCEBCD4080202D580B3E :10546000C120FAC7FFFE306A0E9CF01F000C0E9C94 :10547000F01F000B581CF9BC01FFF9BC00002FED18 :10548000E3CD8080FAC7FFFE306AE06B00FF0E9C20 :10549000F01F0004CEDB0000800091DC8001793039 :1054A000800091D0EBCD4040485B1896F01F00057E :1054B0000C9CF01F0005E3CD8040000080039C3869 :1054C00080025458800091E8EBCD40C0202DFAC7EF :1054D000FFFE16960E9CF01F0008581CC0402FEDD2 :1054E000E3CFC0C00E9B0C9C306AF01F00042FED70 :1054F000E3CF80C080017864800091DCEBCD40C0B8 :1055000018977939580BC0305839C0E03018EF4837 :1055100000BC3038EF48004C1039C0808F2830086C :105520008F58E3CD80C0F949004C6F682FF8EEFA30 :10553000010CEF4800586FA830098F288F59301B95 :10554000746C7486487A5D16EEF80094EEF900905B :105550002FF82FF9EF480094EF490090E3CD80C079 :1055600080037E20580C5E0C580BF9FB4A19580A30 :10557000F9FA4A225809F9F94A1A5808F9F84A1B5F :105580005EFC580CF9F81024F9B90101F1D9E108D1 :10559000F9F81A245EFC580C5E0C580BF9B801019E :1055A000F9F81A45F9FB0A455EFCD703EBCD40C07C :1055B0001897580CC04079385858C030E3CD80C097 :1055C000F8F8010C3009706C7086488A301B5D1643 :1055D000EEF80094EEF900902FF82FF9EF480094C0 :1055E000EF490090E3CD80C080037E20580CF9FC89 :1055F00010315EFC580CC0B0F8F800D45808C070E8 :10560000F8F800D89708F8FC00D45EFC300897083A :105610005EF8D703580CC040588BE08800035EFD4D :1056200048D8F00B032FF8FC00E05EFCF8FC00DC2F :105630005EFC78BC5EFCF8FC00805EFC79FC5EFCE5 :10564000F8FC00845EFC784C5EFC797C5EFC786C37 :105650005EFC00008003D6FC580C5E0C588B5EBCD0 :1056600048E8F00B032FF94A00E05EFCF94A00DC41 :105670005EFC99BA5EFCF94A00805EFCF94A007C47 :105680005EFCF94A00845EFC994A5EFCF94A005CC3 :105690005EFC996A5EFC00008003D720580CC05065 :1056A000580BC031783C5EFC5EFD580C5E0C580B0C :1056B000F9FA0A035EFCD401580CC0A0F8FC010CF6 :1056C000580CC06078A85808C030780C5D18D80213 :1056D000D401580CC021D80AF8FC010C580CCFC0DA :1056E00078B85808CF90780C5D18D802EBCD408080 :1056F0001897580CC1E0189A300B48FCF01F000FA7 :105700000E9A300B48ECF01F000DEEFC00C0F01FAD :10571000000DEEFC00CCF01F000CEEFC00D4F01FDE :10572000000AEEFC010CF01F00080E9CF01F0006A2 :10573000E3CD80808002608C800274008002602053 :10574000800270E0800091E8D401580CC050F8FC51 :1057500000C0F01F0002D80280026410D401580C6F :10576000C050F8FC00C0F01F0002D802800264287C :10577000D401189A580CC0A030583019F8FC00C059 :10578000F548004C95C9F01F0002D802800263BAA8 :10579000EBCD40801897580BC04079E85888C0403E :1057A0003018EF4800BC30193088EF490044EF480A :1057B00000788F99EEFC00C0F01F0004F9B80100DA :1057C000EFF81A39E3CD8080800263B2EBCD40E080 :1057D000201D189716951496580CC0513FFC2FFDAC :1057E000E3CD80E0F8FC00C0F01F000ACF801A9BD8 :1057F000EEFC00C0F01F0008189BCF10400C0C3CC2 :10580000CEF30C9A0A9CF01F0005300CCE9B0000D2 :10581000800263B2800263CE800091DCEBCD40C099 :1058200018971496580CC1F0F94B00C4580AC1B02F :1058300074087419F94800F8F94900FC7428F9480B :105840000100F8FC00C0580CC0E0742BF01F0007EA :105850006C3BEEFC00C0F01F00066C4BEEFC00C081 :10586000F01F0004E3CD80C0800263A6800263AC19 :1058700080026408D431FACD00A81897F8F600CC5D :105880005806C0F0F8F800F85808C0B00DA80DB9D7 :10589000F3E81089F8F800D02FC91039E088000427 :1058A0002D6DD832ECC4FFFC0999500909A0F01FF6 :1058B000006FFAC1FFF8340A029B0E9CF01F006CC7 :1058C0001895CEF5590CE0800090580CCEA132020C :1058D0005012EEF800E45808C7D1E8C5FFE4FAC357 :1058E000FF68310A0A9B069CF01F0062310A300BE8 :1058F0000A9CF01F00610DAA0DB9049BF3EA108900 :10590000FACCFFD8EEFA00CC0A982FC9F01F005B42 :10591000310A0A9B069CF01F005AC7614009E1E961 :1059200010880DB9EBD8B0100DA8F3E81089320833 :10593000F2CE002CF00519005FB9E04E00205F9A0E :10594000124AF80A1800CAD15C751C35C630580EC8 :10595000CA81FAC3FF88029B0A9A069CF01F004581 :105960003018308AEF4800E4E8CBFFFDEECCFF189A :10597000F01F0040EEFC010C78965806C0D0E93AC2 :10598000001B0A98149B0699780CE21B0080F5DA3C :10599000C0025D16C865E939001B3008F00918001F :1059A000C5753018EF48011CEEF901185809C0718F :1059B000EEF800FCEDB80000FE90FF7430188FD8B0 :1059C000EEFC010C78785808FE90FF6C780C5D189E :1059D000C68B308AE8CBFFFDEECCFF18F01F002805 :1059E000FE94FF60C7BB189A029B0E9CF01F00201C :1059F000FE91FF580A9A029BFACCFFD80A92F01F38 :105A0000001D5015C67B069B0A9C310AF01F001929 :105A1000C48BFAC6FFB8E8CBFFF50C9C310AF01F27 :105A20000015049A029BFACCFFA8F01F0012FAC3DB :105A3000FF880A9AE8CBFFD4069CF01F000E40199D :105A40000C9A2F090A9B069CF01F000EC8AB301859 :105A5000EF480118EEF9011C5809CB11EEF800FCD3 :105A6000EDB80001CAC1C1DB8002575C800257CC8F :105A7000800091DC800091D080028EF88000917CC3 :105A800080029C38D431201D3003189730140695BD :105A900030213040EF4500BC6F4A580AE08000C911 :105AA0006F585808E08100C56E7C580CE08100C238 :105AB0006EB85808E08000BE6F385828EFF41A2FEF :105AC000EEF8010CEF41004C3009706C7086FEFA64 :105AD000051E029B5D16EF4400548FC5EEF800983A :105AE000EEF900902FF82FF9EF480098EF49009059 :105AF0006E7C580CC0516EB85808E08100EC6FC83D :105B0000EF4400705818EFF41A2F6FD85808E0814E :105B100000F8580CE08100A76EE85808E08100A367 :105B20006FE8F0C900015879E08B000EFEF804C45C :105B3000F009032FEF4400BCEF410078EF4500402F :105B4000EF4400C8EEFC00C0F01F012BE08000B560 :105B5000EF4400BC2FF3E0430064C9D10E9A300B30 :105B6000FEFC0498F01F012630090E98FEFA048C02 :105B7000129B129CF01F0123EEF9010C72285808A9 :105B8000C0E0EEF801105808C0A058185F0B3008AC :105B90000E9CEF480110723A72285D182FFDD83222 :105BA000EEF80088EF4400BCEF4000788F55EF45D9 :105BB000007CEF4500C88F08CC6B6E585808E08118 :105BC00000DF6E4B580BE08100D06E085808C161B1 :105BD0003078EF4400BCEF480078EF440048CB3BFE :105BE000EEF900845809E08101846FF85808E081DB :105BF000015C6E4B580BE08100B86E685808CA30E3 :105C00000E9CF01F0101C9FB6E485808E08100A9F5 :105C10006E585808E08100B06E685808C9406F0897 :105C20005808C910300B0E9CF01F00F7C8CB6E7CD3 :105C30006EA95809C2F16F885808C2C06F38EF4585 :105C400000605818EFF41A2FEF44004CEF4500584D :105C5000EF4500548FC58FE4EF450118EF45011C57 :105C6000C49B6FE8EEFC00CC5818EFF41A2FEF44F9 :105C70000078F01F00E6EEFC00D4EF4500CCF01FEA :105C800000E3EEFC00C0EF4500D4F01F00E18FE51B :105C9000C5AB580CCD416EB85808CD105829C3B0CB :105CA0005819C4706F3820185878FE9BFF26FEF9EB :105CB0000362F208032FEEF800BC5808FE91FF4C77 :105CC000C5CB6E585808E08100FE6ED85808E080B9 :105CD00000FE6FC95819FE90FF1A5829FE91FF1E49 :105CE0006FD85808FE90FF1A0E9CEF490070EF44E1 :105CF00000BCF01F00C96E7CEF450074C0BB0E9C59 :105D0000EF4400BCEF410070F01F00C36E7CEF4514 :105D10000074C00B6F885828CC606F388FC45898B7 :105D2000EFF41A2FEF4100603098EF48004CCE4A54 :105D30006F885818CB806F3858A8EFF91A2FEEF9F2 :105D4000010C30A88FC5EF440060EF48004CFEFA0C :105D5000029E7286726C302B0A995D16CC0A6F080F :105D60005808FE90FF573068EF4400BC8FF4EF48AE :105D70000078CE9A6F085808FE90FF503038EF44F4 :105D800000BC8F05EF440080EF480078CDCA6E69F3 :105D90005809C0A06ED85808E0810117EEF800F845 :105DA0005808E08100FC6E485808E08100EB6E88DE :105DB0005808C0506ED85808E08000E46F28580892 :105DC000C050300B0E9CF01F00956E7CC93A6F7866 :105DD0005808C8018F88EF4400BCEF40004CEF48E2 :105DE0000058EF4800448FF8EF4800488F98EF4480 :105DF0000040C82A6E1B580BCE606E585808FE90A3 :105E0000FF6A3089EF4400BCEF49004CEF44005C6E :105E1000C73A6E2B580BC2716F696FB81039CD330A :105E20006ED85808C2003058EF4400BCEF48004C10 :105E30008FC4EF440110FE9FFE60580AFE91FF4B95 :105E4000EF4A011CEF4400BCEF44004CEF4A0060F5 :105E5000EF4A0058EF4A00548FCA8FE4EF4A011806 :105E6000FE9FFE4B6E685808C7B16E485808C78140 :105E70006E585808CC71580BFE91FF2D6F696FB8A2 :105E80001039FE93FF286ED85808FE91FF24307811 :105E90008FCBEF48004CEF4400BC6F98EF410110EE :105EA0008F18FE9FFE2AEEF80088EF4900C8EF44E5 :105EB00000BCEF4000788F59EF49007C8F08FE9FAF :105EC000FE436ED85808E081008AEF4400BCEF44DE :105ED000004CEF450060EF450058EF4500548FC57A :105EE0008FE4EF450118EF45011CFE9FFE06305977 :105EF000EF4400BCEF4900781A9BEEFC00C0F01F95 :105F000000481892C290EEF8010C4009189A708669 :105F1000706C300B5D16049CF01F003CEEF800C85E :105F20005808EFF81028F9B90101F1D9E108EFF8A4 :105F30001A28EFF80029F9B90001F1D9E008EFF8C3 :105F40000A29EEF90090EEF8009C2FF92FF8EF499E :105F50000090EF48009CEF450084FE9FFDF5EF4464 :105F600000BCEF40004CEF450058EF4500448FF572 :105F7000EF4500488F958F85EF440040FE9FFDBDA3 :105F80003078EF4400BCEF48004C8FC56F98EF416C :105F900001108F186E7CFE9FFDAEEEF800FC5808D5 :105FA000FE91FF038FD4EEFC010C78785808C040B6 :105FB000780C5D186E695809FE90FEF76ED8580887 :105FC000FE90FEF36E7C3059EF4400BCEF49004C6C :105FD0008FC4EF440110FE9FFD8E3088EF4400BC5B :105FE000EF48004CEF44005CFE9FFD8780037E205D :105FF0008003D744800268308002608C8002740085 :106000008002747480025790800091E88002653CA1 :106010008003D76480025874800254FC800263E6D7 :10602000EBCD408076085808F9B901FFF1D9E108B5 :10603000F7F81A0076185808F9B901FFF1D9E10804 :10604000F7F81A0176285808F9B901FFF1D9E108E3 :10605000F7F81A0276385808F9B901FFF1D9E108C2 :10606000F7F81A03169718991698486A300B301CDF :10607000F01F00050E9CF01F0005E3CD808000009E :10608000800260208002747480025A84D401169CBD :10609000F01F0002D802000080025A84D421203D63 :1060A0001895E06C0120F01F00221897C38031E89A :1060B0003039F9480088F948006833C8F949006C5C :1060C000F9480064F945010C300430CA99A4089BD2 :1060D0001A9CF01F00186AF850286ADA500A6AE819 :1060E0005018EEF8010C1A99704A493B0E9CF01FAB :1060F0000013EF4C00C01A961898C14030160E9C41 :106100008F76F01F000F0E9C8F74F01F000D0E98FD :1061100008990C9C48BA089BF01F000B0E9C2FDDC1 :10612000D8220E9C1097F01F0009CF9B80028F246D :10613000800091D0000004788002711C80025A8493 :106140008002602080027474800091E8D401580CB1 :10615000C090F8F800D45808C050F8F800805808EB :10616000C020D8023018F94800809958F01F00026A :10617000D802000080025A84D401580CC04099AB68 :10618000F01F0002D802000080025A84D401580C8B :10619000C060F94B00E0994BF01F0002D8020000EC :1061A00080025A84EBCD40801897580CC090996BB0 :1061B000F94B00DC580BC0610E9CF01F0005E3CDCD :1061C0008080F8FC00C0F01F0003CF7B80025A845F :1061D000800263BAD401580CC04099DBF01F000262 :1061E000D802000080025A84D401580CC04099BBE8 :1061F000F01F0002D802000080025A84EBCD40E07C :10620000189714951296580CC3A0F8F8008C2FF824 :10621000F948008C5839E08B0009F8F800A82FF8ED :10622000F94800A8E3CF80E01588306AF94800B04B :10623000F8CCFF4CF01F0042ECCA00040BA90BB8CD :10624000F1E910861436E08B00130B99300CF80935 :106250001800C4603038F0091800C130EEF800A80A :10626000301C2FF8EF4800A8E3CD80E0EEF800AC3A :10627000300C2FF8EF4800ACE3CD80E0E3CF80E0B6 :10628000E046002BE088004C3FE80BCBF00B1800F9 :106290005F0A3028F00B18005F09124AF80A18004C :1062A000CEE13018F00B1800C3A1EEFC00CCF01FBB :1062B00000252FC60C9CF01F0024EF4C00CCC2F030 :1062C0000C9A0A9BF01F001E0E9CEF4600D0301661 :1062D000EF460074F01F001D0C9CE3CD80E0EEF84B :1062E00001145808C100300830398FC8EF48011434 :1062F0008F29EF49004CEEFC010C78C85808C030DB :10630000780C5D18EEFC00D4F01F000E0C9CEF46DC :1063100000D8F01F000DEF4C00D4C031E3CF90E067 :10632000EACBFFFCEEFA00D8F01F00050E9C3016F9 :106330008F56F01F00060C9CE3CD80E0800091DCBE :10634000800091E88000920080025A84EBCD40806A :10635000189779685808C0B079BB580BC08070494D :106360005D193008EF480058EF48006CE3CD80809D :10637000EBCD40C01897580BC04078085878C04003 :106380003018EF48006030786FA68F086F9C6C293A :10639000300A305B5D196FA86F9C7029301A304B42 :1063A0005D19E3CD80C0F94B00745EFCF94B00B081 :1063B0005EFC580CF9FC10135EFC580CF9B8010196 :1063C000F9F81A06F9B9010BF9F91A005EFC580C34 :1063D000C08079485808C05079589708794C5EFCBD :1063E000300897085EF8580CC0C0791A580AC09057 :1063F000792897083009F9490048F94900445EFABC :106400003008109A97085EFAF94B00C45EFCD70377 :10641000D401580CC040483BF01F0003D8020000D4 :106420008003D7B08002634CEBCD40801897580CA6 :10643000C0F079A8300B7019799C5D19C0916E6815 :106440005808C0606E2820385818E0880004E3CD52 :1064500080806F485808F9B80101EFF81A136FA847 :106460006F9C7029301A300B5D19EEFC00A4483A7D :10647000302BF01F0003CECB8003D7BC80023A1A2A :10648000EBCD40801897580BC040780858B8C040F2 :106490003018EF4800606F4930B88F085809F9B8D4 :1064A0000101EFF81A136FA86F9C7029301A300B96 :1064B0005D196FA86F9C7029300A305B5D196FA859 :1064C0006F9C301A7029304B5D19EEFC00A4484ACD :1064D000302BF01F0004E3CD808000008003D81C27 :1064E00080023A1AEBCD40C01897580BC04078088C :1064F00058C8C0403018EF48006030C86FA68F08F9 :106500006F9C6C29301A302B5D196FA86F9C702915 :10651000300A305B5D196FA86F9C301A7029304BC0 :106520005D19EEFC00A4484A302BF01F0004E3CDB7 :1065300080C000008003D86080023A1AEBCD406032 :106540001896784CF01F000B30056D1C8D45F01F20 :1065500000096D4CED450044F01F00066DA8ED45A7 :1065600000500A9A6D9C70290A9B5D19E3CD8060EA :10657000800091E8EBCD40E01897580BC4F0780804 :106580005808C4C130088F086FD95809C0B06F6867 :106590005808C08070985808C0506FBB0E9C5D189A :1065A000C4114A4B0E9CF01F00246FA83006301512 :1065B0008F16EF4500408F268F666EFA70490C9B50 :1065C0006F9C5D196FA80C9A70290C9B6F9C5D19CC :1065D0006FA80C9A7029302B6F9C5D196F4CF01FBF :1065E00000176FA80A9BEF460050EF46004C0C9A2C :1065F00070296F9C5D193FF80C9A8F386FA5303B5E :106600006F9C6A295D196FA80C9A7029304B6F9C9A :106610005D19EF4600C0E3CD80E03018EF48006020 :10662000CB2B6F686FBB70A90E9C5D19CBFB000074 :106630008003D8948002634C800091E8EBCD40E069 :10664000205D1897580BC04078085858C040301843 :10665000EF48006030588F086F695809C4406FA830 :10666000FACBFFF070596F9C5D19310A300B189509 :106670001A9CF01F00256F1C6EE850086E295019F7 :106680006E6850286F095039F01F002030086F6B7A :10669000EF48005CEF480044EEC8FFB81A9A0A9928 :1066A0001AD80E9C405876566FBB5D16EF4C0044CE :1066B00040188FE82FFD5808C1616F785808C13124 :1066C00040188F2840298F694038EF4800406F6894 :1066D00070695809C08070785808C0506FBB0E9C14 :1066E0005D19C0412FBDE3CD80E06F4CF01F000766 :1066F0006F68EECAFFAC70796FBB0E9C5D19EF4CF2 :106700000050CF1B800091D0800091E8EBCD4080FD :106710001897580BC04078085868C0403018EF48A8 :10672000006030686E4C8F08F01F001A6F18580810 :10673000C2E0EEF800B05808C2216EA86F2C8F3866 :10674000F01F00158F4CC0706F2A6F1BF01F0013D5 :106750006F288F586FA8301A7029303B6F9C5D19D5 :106760006FA86F9C7029300A305B5D196FA86F9C11 :1067700070496EFA300B5D19E3CD8080310AEECBA3 :10678000FF7CEECCFF6CF01F0005CD8B8F48CE9BBD :10679000800091E880009200800091DCEBCD40FC0D :1067A000201D79A81897169214931294799C700959 :1067B0005D191896C2F06F685808C23070C8580842 :1067C000C2000E9C1A9A6FBB5D181895C1A0400CB0 :1067D0002FBC870CF01F0015C1D03028B892B888A4 :1067E00030188699B8B9A9891897B8A9B8C80A9B6A :1067F000400A2FBCF01F000E0E9C2FFDE3CD80FC45 :106800005804C0416DCC580CC0A16DB86DA5580599 :10681000C0A130070E9C2FFDE3CD80FC6DD81895EC :106820005008CD6B5008CD4B80009200800091DC69 :10683000D431209D3004F8C9FF7CF8C8FF6C18974C :1068400050195008F8C0FFB808956FA8EF450060D0 :10685000301B70196F9C5D19C0706FA8306B701978 :106860006F9C5D19C2F16FA8306B70196F9C5D1938 :10687000C140EEF800C45808C101EEF800C0E0487D :106880000032E08A0025E0480033E080011C6F8878 :106890005808C1003014CDAB6E085818F9B8010182 :1068A000EFF81A18EF4500C030188F086F885808A5 :1068B000CF216F7C580CE80C1700F9BC01012F7D2B :1068C000D832301B0E9CF01F01EECE2B6E0958A95A :1068D000FE9BFFDFFEF807ACF009032F30183029CC :1068E000EF4800608F09CD4B300B0E9CF01F01E686 :1068F000CCFB6E196EB81039C760300B0E9CF01FC0 :1069000001E2CC6B6EA96E381039E0800137300B94 :106910006E8E580EC1B06E685808C1806EAA6E396E :10692000123AE08000BBEEF800B05808C0F0F2C8A0 :10693000FFFFF1D8C008103AE08000B0F2C8FFFEB7 :10694000F1D8C008103AE08000A96E2C582CC20083 :106950006E985808E08001236E685828E080011F77 :106960006EAA6E39123AE0800146EEF800B058087F :10697000C0F0F2C8FFFFF1D8C008103AE080013B38 :10698000F2C8FFFEF1D8C008103AE08001346E78FA :1069900058085F1A3008F5EB0009F0091800E0818B :1069A000010FEC1B0001F5EB0008F2081800E08075 :1069B00001056EBB1699582BE080012A6E16580609 :1069C000C071581BE080021B582BE08101630C3B17 :1069D000E080014F0C995919C0F1580EC0416FE881 :1069E0005808C0A0300B0E9CF01F01A8C51B6EEB11 :1069F000580BFE90FF7C300B0E9CF01F01A5C48B42 :106A00006FA8305B70196F9C5D19C7016FA8307B50 :106A100070196F9C5D19C0506E685808FE91FF395F :106A20006FA8300B70396F9C5D19C0516E68582883 :106A3000FE90FF2F6FA8308B70196F9C5D19FE912F :106A4000FF286FA8189B70396F9C5D19C0516E6844 :106A50005828FE91FF1E6FA8307B70196F9C5D193E :106A6000C0806E285828C0506E685808FE90FF11EC :106A70006E185918E080025C5998FE91FF0AEEF8F2 :106A800000805808FE90FF056E685808FE90FF01D0 :106A90006E285848FE91FEFD300B0E9CF01F017DC4 :106AA000CF7A6FA8306B70196F9C5D19FE90FEF164 :106AB000EEFB00C4580BFE91FEEC0E9CF01F017023 :106AC000CE7A3328EEFC00A4FEFA05CC1AD8302B7F :106AD000F01F0172EEF800C0301B16080E9CEF4844 :106AE00000C0F01F016F2FFDCD3A6FAA3038FACBEE :106AF000FFE08F0830136F9CEF43006074595D19FD :106B00008F95507C8F85EF4500788F758FA58FB559 :106B10008FC58FD55F0A408B1896583B5F88104A07 :106B2000EA0A1800C23119A919B8F1E910885068A9 :106B3000103BC1C319988FA8EEF900B05809C09056 :106B4000069C4019FACAFFE8FACBFFE4F01F015592 :106B50000D893028F0091800E080011CE08B008DC1 :106B60003018F0091800E0800123EEF800C02FF87B :106B7000EF4800C0FE9FFE8D6E785808FE90FEC95B :106B8000EEF800B05808C080310A400B401CF01FDE :106B90000146FE91FEBE301BCBCA580EFE90FEF998 :106BA0006E685808FE91FEF56E185918FE91FEDACF :106BB000583CFE91FED7CECA6E19C0EB301830A9F2 :106BC000EF4800608F096F1CF01F01386E485808AD :106BD000C1A06E5CF01F0136EF4C0044FE90FE59E0 :106BE0006E5A6E4BF01F01336E58EF480048FE9FFF :106BF000FE50300B0E9CF01F012AFE9FFE4A30090A :106C000050494048EF480044FE9FFE436F08580833 :106C1000FE90FED6301830996FAA8F09EF480060B9 :106C20007458FACBFFE86F9C5D1819A919B818962B :106C3000F1E910885848E08B01476F1CF01F011BD9 :106C4000305CEF450044EF4C00486EA6F01F011881 :106C5000E08001853029B896B889EF18004AB8C994 :106C6000B8B8A988B8A8EF4C0044FE9FFE12584C53 :106C7000FE90FEB3CB8A3038F0091800E08000DCCB :106C80003048F0091800FE91FF7230188F98C6EB5B :106C900030181693EF48006030496FA8E04B00FEB3 :106CA000EFF3000D8F096EC670096F9C5D19069A8F :106CB0000C9BF01F0101E08100C36F1CF01F00FB63 :106CC0006FA8EF4500446EA270096F9C5D19503C9F :106CD000FACCFFE8F01F00F91893C9206EB8E0481D :106CE00000FEE08101516FA8406670096F9C5D193C :106CF00030C8505CA376EF480048ECCCFFECF01FA6 :106D000000EC1891E080012E3FE9B892B8C9302913 :106D1000B889F8C8FFFBB0A5B085B095F8C9FFF8F1 :106D20003038B285B295B2A5B2B8504CF8C2FFF473 :106D30000A96C298661A6ED81438C210405CF01FCA :106D400000DE049AE4CBFFFC580CC1903FE814C865 :106D50008689B4896608A988B4986609B4A907C861 :106D6000B68886A9B6996618A988B6A86619B6B96C :106D7000F6C2FFFC60082FF62F88810866F35803DF :106D8000E0800099660B6EC81638CD50661ACD7B30 :106D90006E185918FE91FEEB40685848FE98FEE7C1 :106DA0003018EF4800780DC98FB9CE0A406A584AAA :106DB000FE98FEDD30188F780DC98FB9E04900FECE :106DC000FE91FED558BAFE98FED2ECC9FFFB139C8B :106DD000138A13A8F1EA1108F1EC1088ECCBFFF844 :106DE0008FC817AC17B81789179AF1E91188F1EA1B :106DF0001108F1EC10888FD8CB9A6FA83089EF4B2F :106E000000608F09FACBFFE0705A6F9C5D1AFEFAA2 :106E100002AE302BEEFC00A4F01F00A06F1CF01F90 :106E200000A30C99EF460044009A6EAB0E9CF01F35 :106E300000A5C1AB30188F88FE9FFE990C9C069B65 :106E4000F01F00A1FE90FF3B6FD85808C0906F6AFA :106E5000580AC06074096EC81039E0800086FEFBD5 :106E6000026A0E9C3006F01F009A6EB88F186F6C85 :106E7000580CE08000CD5806C54078B86FBB0E9C1A :106E80005D18EF4C006C6FB65806E08000CA6F6A60 :106E90006ECB30188F287429FEFA02381AD91AD30B :106EA0001ADB302BEEFC00A4F01F007C2FDDFE9FD0 :106EB000FCF05806C4206F285C78A2B8A988A2A864 :106EC000FE9FFEA1F0CC0004F0C20005F01F007888 :106ED0001893FE90FEB45802C120ECCCFFFB300AA0 :106EE00035DB1938F0C90021F6091800F9B80B5F35 :106EF000E60A0B082FFA1432FE9BFFF53008E60273 :106F00000B084F581AD34F5A1AD8302BEEFC00A456 :106F1000F01F0062069CF01F00652FEDFE9FFE8FA4 :106F200078380E9C5D18EF4C006CCAEB6FF858086F :106F3000FE90FCAFFE9FFDAA04983FE910C9B0A6E1 :106F4000B086B096E4C9FFFCB2B6B286B296B2A6DD :106F50006F282F88EF480048CB0B0A9CFE9FFE85C8 :106F60005045FE9FFE5074181033FE91FF7A7499BD :106F70005809FE90FF766FBB0E9C5D19FE90FF7165 :106F80003016C74B3058406CEF4800482FACF01F0C :106F900000481896FE90FE35B89230283039B888EF :106FA000B8C9504CF8C2FFFB50250A91C1A8661A17 :106FB0006EB8103AC130403CF01F003FC0F0660888 :106FC0005808C5A040285808C0913FE904C93018A6 :106FD000502860082FF12FF8810866F35803C0602D :106FE000660B580BCE50661ACE7B5801EFF8101284 :106FF000E5F10E00EFF80012F7B800FFEFF80A1203 :107000005C78ACB8A988ACA8FE9FFDFD069B6ECC51 :10701000F01F002DEF4C0058FE90FE51C2DB6FA810 :107020006F9C70095D196F6870291AD91AD36EC8E0 :1070300018921AD8302B4AAAEEFC00A4F01F0017B1 :10704000EF4600588F268F1658025F1B6EB92FDD52 :1070500058D95F081668EC081800FE90FE30E4F876 :1070600001605808FE91FC15E4F801685808FE908C :10707000FE26FE9FFC0E661804C8CACB800265740B :107080008003D7848002670C8002663C80026370B4 :10709000800264808003D8A080023A1A800264E4EF :1070A00080028D9C8000917C800091E8800092009D :1070B000800091DC80023AD8800271E48003D8F02D :1070C0008002679C800271908003D9248002634C07 :1070D0008003D9708003D8D08003D3E48003D930F3 :1070E000EBCD40801897580CC0E0488BF01F00088B :1070F0000E9CF01F0008EEFC00ACF01F00070E9C79 :10710000F01F0006E3CD80808003D9AC8002634C81 :107110008002653C8002D298800091E8EBCD40F877 :10712000203D1896169414931295E06C00C8F01F39 :1071300000151897C1C033C8F946006499F8F9449E :107140000068F94300A430CA300B1A9CF01F000EEF :107150006A2850286A0950096A181A9C5018F01FAA :10716000000BEF4C00AC1A961898C0500E9C2FDD07 :10717000E3CD80F80E9C1097F01F0005CF8B000028 :1071800080028F24800091D08002D2C4800091E8D8 :10719000189948A8700C580CC051C0D878FC580CED :1071A000C0A078081238CFB1781816385E0C78FC79 :1071B000580CCF815EFD000000007AB01899489805 :1071C000700C580CC051C0C878FC580CC09078089E :1071D0001238CFB178181638CF81782C5EFC5EFD5E :1071E00000007AB0189B4888700C580CC0A0189901 :1071F000300A2FFA72F95809CFD1149897085EFC1B :107200001898CFDB00007AB05EFDD703EBCD40E0ED :1072100048D81896169570075807C051C0E86EF701 :107220005807C0B06E2C0C9BF01F0008CF916E0861 :107230008B086E1CE3CD80E030088B08109CE3CDFA :1072400080E0000000007AB0800091A0EBCD40C04B :1072500048B70E966E095809C0B072F88D08129C96 :1072600072D85808C0705D186E095809CF71E3CD07 :1072700080C0129CF01F0003CEEB000000007AB02B :10728000800091E8EBCD40C048D66C485808C0312A :10729000C0880E987057109CF01F000A5807CFA1A5 :1072A0006C6CF01F000930086C3C8D68F01F000505 :1072B0006C8CF01F0004E3CD80C0000000008C90B7 :1072C000800091E880014544EBCD40F8495718967D :1072D000169314946E2B12952FFB6E3CA56BF01F2A :1072E0000012C1D06E28A568F80809066E29A569A4 :1072F000F8090009932593146E2AF4081504F80878 :10730000000891336E188F3C2FFA1036EFF69A0171 :107310008F2A3018300C8FC8E3CD80F8E3CFC0F847 :1073200000008C90800091F4EBCD404CE0634DD395 :10733000EA1310621896F01F000DF8030648A7899B :10734000E06A03E8F20A0248F8080109121CF20A8E :10735000024AF80304428D1ABF5CA743E60C010CF5 :107360008D0CE3CD804C0000800145C4EBCD408006 :10737000202D4A076E495809C2C06E581039C29074 :107380001A9CF01F001D6E484009700A1439C2444F :107390007018401BF40901091618C276F00B141F6F :1073A000E06A03E8F20A024AE0694DD3EA19106282 :1073B000F0090448A7491619F20A000C580CE08A93 :1073C000000E300948DA6E6BF01F000D6E488F58C2 :1073D0002FEDE3CD80801439C030301CCF3B7018C6 :1073E000401B103BCFB4CD7B2019F028BDC0CD7B16 :1073F00000008C9080027328800275188001455827 :10740000D43149A0189516931492604C580CC2B010 :1074100030060C940C91785778480A38C09018962A :107420000E9C5807CF91F01F0012089CD8325BF3D6 :107430005F0A782906395F081448E2081800CF006F :107440005BF25F0A783904395F081448E2081800D3 :10745000CE705806E1F70A04EDF71A052FF4F01F75 :107460000005CDFB1894CE0B00008C908002736C4D :10747000800091E8EBCD40FC18961695149212947A :107480001093318CF01F00211897C3A0F01F00202B :107490006E0A6E1B0C0AEA0B000B8F0A8F1BEE5B49 :1074A000423FE08A000B2FFAEE3B42408F0A8F1BCF :1074B000EE5B423FFE99FFF98F248F338F423008F5 :1074C0008F58494C78495809C1D072081438E0895E :1074D000001A2F0CC0A8F2CCFFEC72595809C0A0BA :1074E00072081438E0890007103ACF617218103B17 :1074F000CF348F599907F01F0008E3CF80FCE3CF0A :10750000C0FC2F0CCF7B000080009200800273280B :1075100000008C908002736CEBCD40E0202D49661A :107520001A9CF01F00166C475807C1F040096E08FE :107530001238E089001B3005C05840096E08103928 :10754000C1451039C0516E1940181238C0E56E5847 :107550008D558D486E3B6E486E2C5D180E9CF01F4D :1075600000086C475807CEA1F01F00062FEDE3CFAF :1075700080E0000000008C9080027328800091E879 :107580008002736CEBCD408049A76E3E580EC2B0AE :107590006E2A580AC280E08A002B7C081838C27014 :1075A000FCC9FFF0300BC05872082F091838C050C2 :1075B0002FFB163AFE99FFFA143BC170201A163AB7 :1075C000C0F0161AF60C1504A56AFC0C000C2FFB73 :1075D000A56BFC0B000BF01F00086E2A201A301858 :1075E0008F2A8FC8E3CD8080E3CD8080300BCE7BA7 :1075F00000008C90800091C4EBCD406048861895C7 :10760000334A300B0C9CF01F0007ECCCFFE88D05D3 :10761000301BF01F0005E3CF8060000000008C905D :10762000800091D0800144F80050F2010100000078 :107630000000000000000000F6F800DC5808C05010 :10764000F8F800F85808C0205EFDF6FB00D0580B93 :10765000CFC076085808C04176185808CF602F8BE5 :10766000CF9BD703EBCD4080300B1897F01F001352 :10767000306A300BEECCFF64F01F0011306A300B23 :10768000EECCFF5EF01F000E300BEEFC00E0F01FB2 :10769000000D300BEEFC00E0F01F000BEEF800BC1C :1076A0005828C030E3CD8080EEFC00E0300BF01FA6 :1076B0000007E3CD80800000800217D0800091D0C9 :1076C000800261E8800261D4800261A4EBCD408039 :1076D0001897F8F800945808C160300BF94B0094E3 :1076E000F8F800D470985808C040F8FC00C45D1841 :1076F000486A302B0E9CF01F0006300A0E9C149B2B :10770000F01F0004E3CD80808003D9D480023A1AB0 :1077100080022584D431209D500C761558155F9831 :107720007607169058075F1910693008F00918009D :10773000E08000B8EEC4FFFF0989F2C6FFFE0C35F9 :10774000E08500B010923DD33301C168E208180013 :10775000C2800C0758155F9958075F181268E40833 :107760001800E080009EEEC4FFFF0989F2C6FFFE0C :107770000A36E08900960C150F88E6081800CE71CD :10778000305AF4091800FE98FFE6EECCFFFE306A8E :107790004DFBF01F0060C0B00F88E2081800CDA1BB :1077A00009883019F2081800FE98FFD540080E9B92 :1077B0000C9AF0FC00DCF01F00581897C711400A23 :1077C000FACBFFFCF4FC00DCF01F0054C21540793A :1077D0005809C1E040685808E0890007C19840682E :1077E0001037C1644079EE0B1504F20B000B400911 :1077F0003008F2FC00DC2FF71099109AF01F0048B7 :10780000CEF14008301BF0FC00E0F01F004660465F :10781000605558065F1958155F981069C760ECC429 :10782000FFFF0989F2C7FFFE0E35C6F53003069249 :107830000691C1A85802C0610D88330AF4081800E7 :10784000C3A00E060E1558065F1858155F991268EA :10785000E2081800C3F0ECC4FFFF0989F2C7FFFE7D :107860000A37E08900385803CE610D883DDAF40804 :107870001800CE113058F0091800FE98FFDD306A6C :107880004A3BECCCFFFEF01F0023CD5140090E9A7D :107890000C9BF2FC00DC3013F01F0023CCCB600704 :1078A0005807CB604009300AF2FC00DC149BF01F43 :1078B000001ACAEB09883019F2081800FE98FFC3B5 :1078C00040080E9A0C9BF0FC00DC3012F01F0017F1 :1078D000CB9B5803C0F05802C0B160485808C08024 :1078E0004008049AF0FC00DC049BF01F00102F7D80 :1078F000D83260465806CF004009300AF2FC00DC5E :10790000149BF01F0009CE8B3002CF5B80027628DB :107910008000917C8002B5EC8002C04C8002938094 :10792000800255968002B58C8002B52CD431FACDF8 :10793000009018911497586BE08B00C4FEF807482C :10794000F00B032F580AC0A0F8F800907009739A42 :10795000580AC0410E9BF01F01CD304B029CF01F16 :1079600001CCE2F801185808E0810312FAC7FF942D :10797000E2F800D470285808C4C00E9BE2FC00C492 :107980005D18C475E2C6FF64306A0C9B0E9CF01F44 :1079900001C1C3F0FB3800711AD8FB3900741AD941 :1079A000FB3800771AD8FB39007A1AD9FB38007DEA :1079B0001AD8FB390080FEFA06DE1AD9301B029C69 :1079C000F01F01B6306A0E9B0C9CF01F01B5306AA7 :1079D000300BE2CCFF5EF01F01B3E2FA00BC2FAD2A :1079E000584A5F08590A5F091248C081588AE080E6 :1079F000030C0E9B029CF01F01ACE2F80090704952 :107A00005819E08102D5E2F800B05808E08002D0B1 :107A1000FB3800711AD8FB3900741AD9FB3800778B :107A20001AD8FB39007A1AD9FB38007D1AD8FB39ED :107A30000080302B1AD9FEFA0672029CF01F0197C3 :107A4000E2FB00B02FAD580BC040029CF01F019824 :107A50000E9BE2FC00DCF01F0197622CF01F0196E8 :107A6000300BE2FC00E0F01F0195300BE2FC00E07F :107A7000F01F0193E2F800BC5828C061300BE2FC13 :107A800000E0F01F0190301BE2FC00E0F01F018BD2 :107A9000300BE34B00F4E2F900BC59095F0A584986 :107AA0005F081448F6081800E0800216029CF01FD8 :107AB0000186307B029CF01F0176029CF01F01833F :107AC0002DCDD832580ACFD0149B7439F8FC00DC85 :107AD000742AF01F017F2DCDD832F8FB00BC590B62 :107AE000CF00F8F800E85858E08002355838E08BAD :107AF0000234E2C7FF64306AFEFB05D80E9C2F8B70 :107B0000F01F0164EE0B1710E06800A2E3D8E00B51 :107B1000029CF01F0171E2FC00DCF01F0170FEFA14 :107B200005BE302B029CF01F015DE2FA00BC584AF2 :107B30005F08590A5F091248C0B1588AE08002976D :107B400030080E9BE3480104029CF01F0157029C81 :107B5000F01F01642DCDD832FEFA058C303BF01FAA :107B6000014F5807E08002806E0858085F1B169A84 :107B7000E2FC00DC301BF01F015DFACCFF94F01F2B :107B8000015CE2F800985808E08001D541B9F2089C :107B90000108E048003CE08A01A6E34900982DCDA9 :107BA000D832F01F0154E08501EBE2F900907248F1 :107BB0005828C870E2F800AC5808C831E2FA00CC86 :107BC0001094500AE2F000D072285808E08A00A908 :107BD000300850187218401AF00A032850585800FC :107BE000E08A0097400530020A96C11808973003D2 :107BF00030142FF2ECC6FF6404305F983009E9E8D6 :107C00000008F2081800E08000970E940C9B029C7C :107C10000C93F01F0139C05078385818FE99FFE8CE :107C20006D585808C051ECF800805808CE004059F3 :107C30005809CDD0ECC8FFFAECCAFFA8ECC9FFD4B4 :107C40005048502A50394057C0486E175807CCF05A :107C5000EEF801945808CFA16CAA6E58103ACF6183 :107C60006E4B404CF01F010BCF116E885808E0811D :107C700000E16F6AEDBA0001C061ECFB0080580BB7 :107C8000E08100E3F1DAC001300AF4081800CDE029 :107C90006D5B580BCDB0FACAFF94403CF01F011742 :107CA000CD516F6841B91268CD106F3841C9126863 :107CB000CCD06F4841D91268CC906F5841E9126816 :107CC000CC5058065F04C96B149BF01F00F02DCDFB :107CD000D832149B2EACF01F010A1896FE91FEF2CA :107CE0006F9B580BE080012A581BFE91FEEBE34B83 :107CF00000D8029CF01F00FB622CF01F01028326BB :107D0000CE0A5803E08100BF0E94E2F900904018BB :107D10002FF850187228401A103AFE95FF5DE2F8CD :107D200001085808E0800121029CF01F00F7E2F9E9 :107D30000090C4BB5804CE600E923006C108049770 :107D4000089930032FF6EAC5FF640C305F98F3E81A :107D500000083009F2081800CD500E920A9B029CD0 :107D60000A93F01F00E5C05078385818FE99FFE9D3 :107D700040585808CE50EACAFFFA4057506AC078B7 :107D80006AA8103AC5006E175807CDA0EEF8019406 :107D90005808CFA16E5A580ACF416E885808C1E1E1 :107DA0006F5BEDBB0002C040EDBB0003CED1F1DB49 :107DB000C002C0806B585808CE71EAF8008058089D :107DC000CE31EEF8014C5808C110EB190088EDB91E :107DD0000001CDA058055F09CB6B306AEECBFFE800 :107DE0000A9CF01F00ACCD01CDCB1099EEC8FECCA3 :107DF0002FF9700A580AC2612FC85849CFA1EDBBAC :107E00000003C071EEF800F0F1D8C002F9BA010128 :107E1000EB190088EDB90004C030580A5F0A580A0F :107E2000CB30CD6B6E4B406CF01F009ACAD1CB6B40 :107E3000306AEECBFFE80C9CF01F0096FE91FF0726 :107E4000C19B301ACDDBFACAFF94402CF01F00AB67 :107E5000C0306F6AC18B6F6A41B8F5E80008FE90C8 :107E6000FF136F3841C91268FE90FF0E6F4841D969 :107E70001268FE90FF096F5841E91268FE90FF04F6 :107E8000C21BE2F800A85808C131306AE2CBFF6497 :107E9000069CF01F0080C170E2F800E85838C081ED :107EA000306AE2CBFF5E069CF01F007AC0C00E9BDA :107EB000029CF01F007FE08100B50E9A069B029C99 :107EC000F01F0092009A400BE2FC00DCF01F0090D3 :107ED000FE9FFDF8169A029C30ABF01F008EFE9FAD :107EE000FDEE3017FEFA0230303B029CE34700946F :107EF000F01F006AE06B2710300CF01F0088E2F8DA :107F000000D470985808C0500E9BE2FC00C45D1865 :107F100030EB029CF01F0082300A029BFEFC020440 :107F2000F01F0081300802994FEA109B33CCF01FFC :107F3000007F41B9FE9FFE33E2F800D85808FE905A :107F4000FDC1E34B00D8029C301BF01F0079FE9F5F :107F5000FDB9582BC780E07A86A0300B029CF01F39 :107F60000075FE9FFDC8305BE2F801105818C7206D :107F7000029C300AF01F006FFE9FFDA4E2F9009002 :107F800072485828FE90FD9E301BCEFBFAC7FF9426 :107F9000E2C6FF64306A0C9B0E9CF01F0041E2F8C1 :107FA00001185808FE91FCF8FE9FFCE4029CF01FAB :107FB00000621896C230F8FB0194580BC1F1795851 :107FC000E2180013C351189B029CF01F005CE2F8FA :107FD00000B05808C0701036C050E2FC00E0F01F3E :107FE0000058E2FC00DC0C9BE34600B0F01F00559B :107FF000029CF01F0055FE9FFD0D029C303BF01FC0 :108000000053FE9FFD5FE2F800B05808FE90FCF3BD :10801000F0F800F0F1D8C002FE91FCEDFE9FFCEFFD :10802000029C300A30ABF01F0043FE9FFD4B350928 :10803000FAC8FF70189A10D9029CFAC9FFE4F01F21 :108040000044CC6B4C3AF01F0015E2F800E8FE9FAC :10805000FD4F72485818F9B80002E3F80A44F9BB1A :108060000000C87B0E9BFE9FFD84E2F800B058081C :10807000FE90FD68F0F800F0F1D8C002FE91FD62BC :10808000FE9FFD678003D9B880027714800217D065 :108090008000917C8003D9F880023A1A800091DC3C :1080A000800091D0800226948003DA3880027638EE :1080B0008002BA4C80028172800261E8800261D441 :1080C000800261A480021CE080021DB88002979C9F :1080D0008002762880021AE08002BA1C8003DAA8A7 :1080E000800276648003DAE48002D19C80028F549F :1080F00080021E84800218F88002BD68800091A072 :10810000800281748002189C800230DC800298A476 :108110008002246C8003DB0480028F1C800228D83C :10812000800276CC800274008002747480022794EE :10813000800225848002195C800222A480025748B4 :108140008002B9D48002237080022FCC80021F30BD :108150008003DA68580C5E0E5E1DD401201D3008C5 :10816000767C3009BA881A9A7668129B5D182FFDC2 :10817000D8025EFCEBCD40801897580CC090789CDC :10818000580CC035F01F00040E9CF01F0004E3CD16 :108190008080000080027584800091E8EBCD40F87B :1081A0001896129510944063328CF01F000B1897AC :1081B000C0F00C9B311AF01F00093FFC8F658F74D3 :1081C0008F838F9C30090E9A485BF01F00060E9C2F :1081D000E3CD80F880028F24800091AC8002815A28 :1081E000800272C8D4011698306AF8CBFFEF109C59 :1081F000F01F0002D80A0000800091DCD431213D3C :1082000076FE511E760A503A761950497628505813 :10821000763E506E764A507A7669508976785098D4 :10822000768E50AE769A50BA76B950D976C850E864 :1082300076DE189850FEF8C9FFF876EA510A7654AF :1082400076AB500C5019E02BA44F50CB110EF8CB4D :10825000FFF45008512E403A700340487205502BED :10826000E069A478EA19D76AFC0900091409760ABA :10827000E06BB756EA1BE8C7F40B000B100BF5E5F3 :108280002008066814581009E06870DBEA182420FA :10829000EBE3200AF20E1507FDE9139E060EFDEA38 :1082A000000A0A5A1005140BFDE32008F606150C07 :1082B000EDEB13461C06EDE800080658405AE0694D :1082C000CEEEEA19C1BD14051005EDEE2008EA0B4B :1082D0001511F7E512FB0C0BF7E800081C58120308 :1082E0004069120310034078E6051516E0690FAFE8 :1082F000EA19F57CEBE312A5F00900091605F7E68B :108300002008EBE800080C581C091009EBEB2008CA :10831000F2031507E7E913930A03E7E80008165884 :10832000E06AC62AEA1A4787E80A000A0C0A100A15 :10833000E7E52008F402150CE5EA13420602E5E839 :1083400000080A58408EE0694613EA19A830FC0973 :10835000000916091009E5E32008F2061511EDE9F8 :1083600012F60406EDE800080658409AE06B950105 :10837000EA1BFD46F40B000B0A0B100B40A840C98A :10838000F60E1516FE395BB1FDEB12AEE06A98D819 :10839000EA1A69800C0E40BBF00A000AEDE22008E0 :1083A000FDE80008045840C1060A50C9100AE069F7 :1083B000F7AFEA198B44FDE62008F6090009F40B33 :1083C0001507F7EA139B1C0BF7E800080C58F7EEAB :1083D000200A0C0104091009F206150CEDE91346F8 :1083E0001606EDEB2008EDEA000A1C5A1401E2051E :1083F0001511EBE112F50C05EBE80008165840DA10 :10840000E069D7BEEA19895CF40900091C09100962 :1084100040E8F20E1516E06A1122EA1A6B90FDE9A7 :1084200012AEF00A000A0A0EEBE62008160AFDE872 :10843000000840FB0C58E0697193EA19FD98100A96 :10844000F6090009FDE52008F40B1507F7EA139B70 :108450001C0BF7E800080A580C0910094108F2063D :10846000150CE06A438EEA1AA679EDE91346F00A84 :10847000000A1606F7EE2008EDE800081C580A0A64 :10848000100A4118F4051511E0690821EA1949B4E8 :10849000EBEA12F5F00900090C05EDEB2008EBE81A :1084A000000816581C091009F2031516E7E912A373 :1084B0000A03E7E520080C680A58404EE06A256286 :1084C000EA1AF61EFC0A000A160A408B100A40D867 :1084D000F40E1505E069B340EA19C040FDEA13BE89 :1084E000F6090009060E403B0C09E0665A51EA16EF :1084F000265EF0060006FDE320080A68065810090B :10850000E062C7AAEA12E9B6F6020002F20B150908 :10851000F7E9137B41191C0BF7EE200806681C587D :108520000A0606021006E063E681EA13D8A1F20308 :108530000003EC09150EF3E613291609F3EB2008E6 :108540001C68165840CA10024078E065105DEA15B4 :10855000D62FE0611453EA110244E8050005F40146 :1085600000011C051601E40A1514E06EFBC8EA1EA2 :10857000E7D3F5E212CAF00E000E120AF5E9200860 :10858000166840BB125812031005E066CDE6EA16E5 :1085900021E1F6060006EA0B1505F7E513BB140BFF :1085A000F7EA2008126841091458E06507D6EA1571 :1085B000C3371001F2050005E2091509F3E113794B :1085C0001609F3EB20081468165810034068140EBF :1085D0001606E60A150EE0620D87EA12F4D5F5E3F9 :1085E000132AF0020002120AF5E92008166840ABCF :1085F00012581205100EE06314EDEA13455AF60303 :108600000003FC0B1514F7EE12CB140BF7EA20084D :10861000126840F91458E061E905EA11A9E310066F :10862000F2010001EC091505F3E613B91609F3EBA5 :10863000200814681658100540581402E066A3F884 :10864000EA16FCEFEA0A1509F0060006F5E5137ACA :10865000120AF5E9200816681258409E1002160307 :10866000E40B150EF7E2132B140BF7EA200812683F :108670001458E06502D9EA15676F1003FC05000580 :10868000E60E1514FDE312CE160EFDEB200814685D :1086900016581201100140A840E91406E060F68166 :1086A000EA108771E20A1505F0000000F5E113BA3F :1086B0001C0AF5EE200816681C58E0624C8AEA1283 :1086C0008D2A1006F2020002EC091509F3E613796F :1086D0001409F3EA20081C681458160540DB10053D :1086E0004108E434C6BEE0616122EA116D9DE80AEA :1086F0000007F6010001E066380CEA16FDE5F00619 :108700000006EA08150EF1E513281208F1E9200B1E :10871000F7EA000A125A1C021402407A404E120074 :108720001001E063CFA9EA134BDEF4030003E40A6F :108730001514F5E212CA100AF5EB200BF5E8200833 :10874000EE0B000BF6091504F3EB13C914091258CC :1087500014061000F3EA200AE065EA44EA15A4BE14 :10876000E008150BFC050005F1E01358120512088E :10877000105A10031401F1E92009E20B1510F7E17A :10878000130B100B1659F7E820081206EC0E1517FC :10879000FDE6129E160E1C5810054098FDEB200AAF :1087A000EA061504E0694B60EA19F6BBEDE513C66D :1087B000F00900091C0616090C5AEDEE20081403F6 :1087C00040CBE605150BEBE313550C050A58E06AA0 :1087D000BC70EA1ABEBF1009F60A000AEBE62008D0 :1087E000F20B1510F7E9130B0A0B16581C0A100AA6 :1087F00040F8F40E1517E0697EC6EA19289BFDEAD9 :10880000129EF0090009160EF7E520081C580C0905 :1088100010094038F2061504E06A27FAEA1AEAA1BC :10882000EDE913C6F00A000A1C06FDEB20080C58FF :108830000A0A100A4068F405150BE0693085EA1948 :10884000D4EFEBEA1355F00900090C05EDEE200812 :1088500016090A58408B1009E06A1D05EA1A0488B7 :10886000EBE62008F60A000AF20B1510F7E9130BE5 :108870000A0B16581C0A100A40B8F40E1517E069C6 :10888000D039EA19D9D4FDEA129EF0090009160E72 :10889000F7E520081C580C09100940E8F2061504F9 :1088A000E06A99E5EA1AE6DBEDE913C6F00A000A88 :1088B0001C06FDEB20080C580A0A100A4118F405A2 :1088C000150BE0697CF8EA191FA2EBEA1355F009D1 :1088D00000090C05EDEE200816090A58405B100946 :1088E000E06A5665EA1AC4ACEBE62008F60A000A0C :1088F000F20B15101C0AF7E9130BE0692244EA1980 :10890000F4290A0B1658100A4032F40E15171202F9 :10891000FDEA129EEA0811FF160E409AFDE81008C3 :10892000E069FF97EA19432A1658F40900090A0971 :108930000C0241061002F60811FFE40A1506F5E2E2 :1089400013AA1C0AF5E810081C58F2080005E06993 :1089500023A7EA19AB941206FC0811FFEC0B000BDD :10896000EA06150AEDE513661406EDE8100814583A :10897000F6080008E069A039EA19FC93F00B150F1E :10898000FA243942F7E8131BE80900050C0BEA0E3C :10899000000EF40811FFF7E810080C58E06959C3FD :1089A000EA19655BFC08000540E2EA0E15151202A3 :1089B000FDE512BEEC0811FF160EFDE81008165872 :1089C000E40A000AE069CC92EA198F0CF40800026C :1089D0004068F00900090C09E40A1506F60811FFC1 :1089E000F5E213AA1C0AF5E810081C58F208000268 :1089F000E069F47DEA19FFEF40C1FC0811FF1201A4 :108A0000E406150AE20B000BE0695DD1EA198584E2 :108A1000EDE213661406EDE8100814584045F60818 :108A200000011205E20B150FEA0E000EF7E1131B11 :108A3000F40811FF0C0BE0697E4FEA196FA8F7E804 :108A4000100840A30C581203E60A000AFC080005AF :108A5000EC0811FFEA0E1515FDE512BE160EFDE835 :108A600010081658F4080003411AF60811FFE069CF :108A7000E6E0EA19FE2CF4090009E60A15060C09DD :108A8000F5E313AA1C0AF5E810081C58F2080003C5 :108A90004088E0694314EA19A301F00900091609A6 :108AA000FC0811FF40FBE605150AEBE3136514050E :108AB000EBE810081458F2080008E06911A1EA195F :108AC0004E08F6090009F20E000EF006150FE069D7 :108AD0007E82EA19F753EDE81316F40811FF0A062F :108AE000EDE810080A58FC080001407E120EEA0862 :108AF00011FFFC0A000AE20E1515FDE112BE0C0E74 :108B0000FDE810080C58F40800094128F20A15067F :108B1000F5E913AA1C0AF4080009E068F235EA181E :108B2000BD3A990940D91009EC0811FFF205000B74 :108B3000F5E8100840091C58720CF6080001E069BD :108B4000D2BBEA192AD740581208E20B150AF006E0 :108B50000009F7E1136BFC0811FF140BF7E810088C :108B60001458F208000640B8E069D391EA19EB8680 :108B7000F0090009F20E0008F40A11FF400EEC099A :108B8000150FF3E613191609F20C000CF3EA100A9C :108B9000165AF00A0006EC081515F1E612B8100C8A :108BA0009D0C401A7408120895084028700916098F :108BB00091092EDDD832D703EBCD40E03809764855 :108BC000F1D8C066F608000AF56900181895F00A91 :108BD000113F1697F6080008F0CCFFE7587AE08BB3 :108BE0000056300BF01F002DEEC6FFE8EECCFFA8BC :108BF0000C9B1798178917BAF3E8108917A8F1EAA0 :108C00001088F3E8110916A9183BCF410C9B0E9C64 :108C1000F01F0023338A300B0C9CF01F00200C9BAC :108C2000ECCCFFC81798178917BAF3E8108917A872 :108C3000F1EA1088F3E8110916A9183BCF416E48F4 :108C40006E590C9B0E9CEF480050EF490054F01FEA :108C500000140E9BEECCFFF01798178917BAF3E8B3 :108C6000108917A8F1EA1088F3E8110916A9183B32 :108C7000CF410E9B0A9C310AF01F000A0E9C304A1D :108C8000300BF01F0006E3CD80E0208A300BEEC6EB :108C9000FFE8F01F0002CC4B800091D0800281FCE5 :108CA000800091DCEBCD40FC1493784AF40300384B :108CB000103AF9F98005F9F9B005F7B90BFFF9F9A0 :108CC000BA059948E608161DF20800089958189444 :108CD0001692F1DAC066C381F8C5FFE8E043003FB1 :108CE000E088002C3006EAC7FFC0E406000B340A17 :108CF0000A9CF01F00290A9B1798178917BAF3E8F6 :108D0000108917A8F1EA1088F3E8110916A90E3B9B :108D1000CF410A9B089CF01F00212C06E6060108A3 :108D2000E048003FFE9BFFE3E6C80040E7D8C006EE :108D3000E018FFC02C081002069A049B0A9CF01F42 :108D40000016E3CD80FCF00711402E88100C0E3386 :108D5000C1D30E9AF01F0010E8C5FFE8E8CCFFA8C9 :108D60000A9B1798178917BAF3E8108917A8F1EA30 :108D70001088F3E8110916A9183BCF410E130E0213 :108D80000A9B089CF01F0005CAAB069AF01F000260 :108D9000E3CD80FC800091DC800281FCEBCD40FCC7 :108DA000216DE0682301EA186745E06EAB89EA1E91 :108DB000EFCD30075008501EE068DCFEEA1898BA84 :108DC000E06E5476EA1E1032504750575028503EFD :108DD00018931292580CC140149416951A962FF7B6 :108DE000090A0B0B1A9CF01F00080E33FE9BFFF9BB :108DF0001A9B049CF01F00052EADE3CD80FC1A9653 :108E0000CF8B000080028CA480028BB8D431FACDC5 :108E10000088501C500B14931292109142B0585A73 :108E2000E08B0056E04B0040E08B0054FAC4FFF8A2 :108E3000340A300B089CF01F002E400A401B089C8F :108E40000896F01F002CFAC5FFB808970D88EC189B :108E500000360CC80A36CFB1340851845128580363 :108E6000C110FACCFF9CFACBFFB4300AE60E150213 :108E7000E40A030818A8E20A030916A92FCA1C3A33 :108E8000CF81E6CCFFFF00990A9AFAC3FFA0069BA8 :108E9000F01F0019340A300B089CF01F0015400A1F :108EA000401B089CF01F00130F88EC18005C0EC8D4 :108EB0000C37CFB1310C3408513C5184519000999A :108EC0000A9A069B5128302CF01F000B2DEDD8324A :108ED000FAC6FF881A9A0C99FACBFFFC301CF01FD7 :108EE0000006310850165008CA2B0000800091D0AF :108EF000800091DC80028D9CD401202D501A5009F5 :108F0000301A1AD8FAC9FFF8FAC8FFFCF01F00039C :108F10002FFD2FEDD802000080028E0C5EFC5EFE5D :108F20005EFCD703EBCD40C01896F01F00061897E3 :108F3000C0500C9A300BF01F00040E9CE3CD80C093 :108F400080009200800091D0D401F01F0002D80A66 :108F500080014600D401F8CBFFFCF01F0002D80AC4 :108F6000800145D4780C580C5E0C3008F948004C50 :108F7000780C580CCFC15EFC580CF9FC10435EFC19 :108F8000580CF9B80100F9F81A435EFCEBCD40E04B :108F9000189716961495314CF01F0005F9F71A032F :108FA000F9F61A04F9F51A02E3CD80E080028F2465 :108FB000EBCD40E01696149578075807C160580627 :108FC000C080306A0C9BEECCFFC0F01F000AC0A12D :108FD0005805C0B0EECCFFFC310A0A9BF01F00051B :108FE000C0406E075807CEC10E9CE3CD80E0000064 :108FF0008000917CEBCD4040781820181696991887 :10900000784B78390C9C5D190C9CF01F0003E3CD64 :1090100080400000800091E8EBCD4080202D300A98 :109020001897189B49BCF01F001C300A0E9B49BCC6 :10903000F01F00196E085808C2201A9CF01F001873 :109040006E08400A70EC0E993008141C109BF8084A :109050000C4C490A2FFCF01F00136E2BF6FA010C82 :10906000580AC1006E08400A712C0E99141C300871 :1090700048AAF8080C4C109BF01F000A2FEDE3CD16 :109080008080F6CBFEB80E9CF01F0007CF80CEBBD1 :10909000800290E4800274008002913080028F543C :1090A0008002747480028FB0EBCD40C01896580CCB :1090B000C1407809300899085809C031C0880E9914 :1090C0007207129CF01F00065807CFA10C9CF01FDE :1090D00000050C9CF01F0002E3CD80C0800091E8E9 :1090E00080029018EBCD4080202D18971A9CF01F1D :1090F000000E6E0A580AC0C1C1087408149B8F087C :10910000300A0E9CF01F00096E0A580AC06074E90C :1091100040081039FE9AFFF30E9CF01F00052FED5A :10912000E3CD808080028F5480028FF480029018FB :10913000D4013008782AF548010C7829F2FC0104A2 :10914000F01F0002D8020000800255ACD43120CDBF :109150001096782814941293E04A00205FBAF0F930 :109160000160189758295F18169241511448C05051 :1091700030060C9C2F4DD832354CF01F00621890F1 :10918000CF80089A049B2ECCF01F005F81D4FAC9CF :10919000FFE450965083FAC5FFF84DC81AD5303A0F :1091A000089B049C4DA65086F01F005AE0C8FFFCA7 :1091B0000A9B5018310A109CF01F0053FACCFFD4C0 :1091C000F01F0055E0C8FFC0502840BC6E29F2F8DF :1091D0000150F808000881E86E2AF4FB0150F4F908 :1091E0000154E06A851FEA1A51EBB739F20A0648C2 :1091F000301AA599180981FAE1490048306A402CD3 :10920000069BF01F0041E141004C2FFD6E06580601 :10921000C2903005C0680C956C0C580CC58018962F :10922000ECCBFFC0306A069CF01F003CCF516CD8DD :109230000838C5505805EDF80000EFF80A00EDF8C1 :109240001000EBF81A006E29F2F8010C0C38F9B88E :109250000000F3F80A430C9B301A0E9CF01F0030FC :109260006E066E1859F8E08A00155806C3200C9A4D :1092700015088F086E28F0F90128ECCBFFC0720C9E :1092800072F85D180C9B300A0E9CF01F00256E06CC :109290005806C1F060EA6CE8103AC074C1A872E8E0 :1092A0001438E089000612966C095809CF9181099B :1092B0008D006E2C6E18400A401B2FF88F18F8F99D :1092C00001280096720C72E85D18C54B6E06CCAB97 :1092D00081068F000E9CF01F0013CECB089A049BD2 :1092E000ECCCFFECF01F000DCA61310A400BECCC56 :1092F000FFFCF01F000AC9F1009CF01F000BC3AB7C :1093000080028F24800091DC8003DB248003DB9CBF :109310008002B14480028F548000917C80028FF4DF :1093200080029018800091E8EBCD4080189E78076D :10933000580BC06116970E9CE3CD80806E075807CE :10934000CFB06F381638CFB11AD814997C286EDA9E :10935000F0C8FEC8EECBFFEC1C9CF01F00092FFDEF :10936000580CF8071700EFF8100EF9F81A0EF80766 :109370001710F9B80101F9F81A14CDEB8002914CDD :10938000EBCD40FC1897300CEF4C010C1496129268 :109390001094EEF50108580BC080169A189B0A9C91 :1093A000F01F0016EF4C010C58065F13EEFC010C89 :1093B000580C5F09F3E30008C16158045F18F3E833 :1093C0000008C0A05803C0800C9A049B0A9CF01FA0 :1093D000000CEF4C010C580CF9BC00FFF9BC01006B :1093E000E3CD80FC300A0C9B0A9CF01F00045F094F :1093F000EF4C010CCE3B000080028FB0800293281E :109400000000000000000000EBCD4080580CC100BF :10941000F8F901103008F94801105809C031C08826 :109420000E997207129CF01F00045807CFA1E3CDDC :1094300080800000800091E8EBCD40C01897580C68 :10944000C250F8F801245808C210189B300A491C71 :10945000F01F0011EEFC0124F01F00103006306AEE :109460000C9BEF460124EECCFEE4F01F000DEEFC59 :109470000114F01F000CEF460114EEFC0118580C0B :10948000C050F01F0008EF460118E3CD80C0000077 :109490008002996880027400800256EC800091D0AE :1094A00080028174EBCD40F8205D189716951494D6 :1094B000F8F601245806C0503FFC2FBDE3CD80F8DC :1094C000F8FA012817D81AD817C91AD917B81AD80C :1094D00017A91AD917981AD81789301B1AD9740CDA :1094E0004C6AF01F0047EEC3FEC81AD60E984C59BE :1094F000E06A88C7069BEEFC0140F01F0043EF4C7A :1095000001142F9D580CC6F0EEFC0144580CC0E02D :109510001AD6069B0E984BB9E06A88C7F01F003A2E :10952000EF4C01182FFD580CC5E0340CF01F00372C :109530001896C5B0EEF8012870099909EEF80128CF :109540003019700A4B2899199928994A99374B185C :10955000EEF9012C998899599967EEF8012871095B :1095600099A9EEF80128711999B9F01F002BEF4C59 :109570000124C3D0314A300B1A9CF01F0028EEF9A9 :1095800001305804E9F8105FFBF81A03300650293F :109590001A9A089B50165006EEFC0124F01F00207A :1095A000306830593FFAEEFC0124149BF01F001D77 :1095B000306A0A9BEECCFEE4F01F001B301BEEFC71 :1095C0000124F01F001A301BEEFC0124F01F0018CC :1095D0000C980E99497A0C9BEEFC0158F01F00166E :1095E0000C9CC6CB3FECC6AB3FCCC68B0C9CF01F93 :1095F00000133FDCC63B00008003DBA880023A1A60 :1096000080029AF08002819C80028F2480029A243A :10961000800299C48002609C800091D08002581C16 :1096200080025564800091DC800261D4800261E890 :109630008002996880027474800091E8EBCD40FC50 :109640001897F8F801105808C6F0F8F801284CAA45 :10965000700C301BF01F0049EEF801245808C0A020 :10966000EEF801284C6A700C301BF01F0044E3CD6B :1096700080FCEEF801605828CF41EEF80128700C0C :1096800070295D19587CCED1EEF8016C5818CE9136 :10969000EEF501105805C410EEC2FEB8EAC3FFFC97 :1096A000300A069BEEFC0108F01F0036306A189461 :1096B000069B049CF01F0034C0605804C3706948C6 :1096C0005808C341EB3800091AD8EB3800081AD8FB :1096D0000BF81AD80BE8EEF601281AD80BD91AD9CC :1096E0000BC84AAA1AD8301B6C0CF01F00242FADEF :1096F0005804C090EEF90128E8CAFFFC069B720CE2 :1097000072E85D186A080A9CEF480110F01F0020FB :10971000EEF501105805CC31EEF8012849DA700C4D :10972000301BF01F0016E3CD80FCEB3800091AD87F :10973000EB380008EEF601281AD80BF81AD80BE817 :109740001AD80BD91AD90BC8493A1AD8301B6C0C45 :10975000F01F000A6A08069BEEFA0134EF48011078 :109760000E9CF01F000E0A9CF01F00092FADE3CDE8 :1097700080FC00008003DBEC80023A1A8003DC14DA :1097800080028FB08000917C8003DCA0800091E893 :109790008003DCFC8003DC4C800294A4EBCD40F819 :1097A0001695189414931297F8FB0134580BC05077 :1097B000F6F801485808C5D15807C4C0E8F60110AA :1097C0005806C4A03007C0680C976C0C580CC440F5 :1097D0001896306A0A9BECCCFFFCF01F002CCF518E :1097E0005807EDF81000EFF81A00EDF80000E9F85E :1097F0000A44E04303E7E08A003BE8FA0110580A14 :10980000C4006C3B74381638C065C3B8723816385B :10981000C054129A74095809CFA18D0995061AD31C :109820000BD80B8CE8F601281AD80BC91AD90BB83B :109830001AD80BA91AD90B98495A1AD8301B1ADC16 :109840006C0CF01F0014089CF01F00132F9DE3CD3B :1098500080F8E3CD80F8310CF01F00101896C0F0AE :10986000306A0A9BECCCFFFCF01F000D8D33CC6BF3 :109870000A9AF8FC0108F01F000BC9FBE3CD80F841 :109880008D0AE9460110CCCB8000917C8003DD2459 :1098900080023A1A8002963C80028F24800091DC7C :1098A00080029328EBCD40F8208D169414971895DC :1098B000F8F801345808C470F01F0027EEC6000104 :1098C000C426E068009C1A93EC080248E8080007E8 :1098D000EAC4FEB8C0682016EEC7009C5806C3351F :1098E000EAF901346EAA7258103ACF61724BEECC8D :1098F000FFFAF01F001ACF01306A089B0E9CF01F80 :109900000017CEA0EEFB0080580BCE601A9AEECC6A :10991000FFA8F01F0013CE01189A0E9BEAFC010865 :10992000F01F0010C13079485808CD604048EDB8AC :109930000000CD213019E06A03E80E9B0A9CF01F5D :10994000000ACCAB2F8DE3CD80F84048F3D8C0019E :10995000CF3B0000800294088000917C8002BD68AB :1099600080028FB08002979CEBCD4060F9380121D6 :10997000F8F501281AD8F93901201AD9F938011F48 :109980001AD8F939011E1AD9F938011D1AD8F9392E :10999000011C489A1AD9302B18966A0CF01F000740 :1099A0000C9CF01F00070C9CF01F00062FADE3CDB0 :1099B000806000008003DD6C80023A1A80029438D7 :1099C0008002963CEBCD40E0201D1897F8F801147A :1099D0005808C0613FF60C9C2FFDE3CD80E0F8F8FD :1099E0000128300C5C791ADC5C5B700C70D6FAC80C :1099F000FFFC5D162FFD1895580CCED01899400825 :109A0000E06A88C7EECBFEE4EEFC0114F01F000410 :109A100018960A9CF01F0003CDFB000080028154C1 :109A2000800091E8EBCD40E0208D14971896580BFC :109A3000C2614A781AD8EEF60128EF3801211AD807 :109A4000EF3901201AD9EF38011F1AD8EF39011E5A :109A50001AD9EF38011D1AD8EF39011C49DA1AD981 :109A6000302B6C0CF01F001C0E9CF01F001C0E9C79 :109A7000F01F001B2F9D2F8DE3CD80E01A95320A39 :109A80001A9BF01F0018C1211A9B320AEEF801340C :109A90008F8A1AD8EEC9FEE4EEC8FEC8EEFC0108B3 :109AA000F01F001149182FFDCC6B0C9C310A1A9B3A :109AB000F01F000CC090EEF8012848DA700C302B33 :109AC000F01F0005CB7B1A9B310ACE1B8003AD2C07 :109AD0008003DE1880023A1A800294388002963C95 :109AE000800257CC8002914C8003DDB48003DDCC32 :109AF000EBCD40F81897169514931294F8F80124BA :109B00005808C090F8C6FEE4306A48BB0C9CF01FB1 :109B1000000BC031E3CD80F80C9C306A0A9BF01F2B :109B20000007CF910899069A0A9BEEFC0124F01FCA :109B30000004CF1B800294008000917C800261FCB5 :109B4000EBCD40F8FACD01001293109418961697B9 :109B5000149530081A99F2080B082FF8E048010014 :109B6000CFB1300E1A9C1C9BEC0B0709198AFC0A1A :109B700000081208FAC9FF00FDD8C0081C09F33814 :109B8000FF0018C8F36AFF002FFBFAC8FF000E3B66 :109B9000F9BB0200103CCE915805C4C0300E1C9792 :109BA0001C9CF8C8FFFFFACAFF00F9D8C008180AC1 :109BB000F53BFF00F60E0008FAC9FF00FDD8C0080B :109BC0001C09F338FF00F568FF00F36BFF002FF767 :109BD0000E35FE9BFFE85804C2A006963007F8C871 :109BE000FFFFFACAFF00F9D8C008180AF539FF00CC :109BF000F20E0008FACBFF00FDD8C0081C0BF738A6 :109C0000FF00F568FF00F769FF00F538FF00100955 :109C1000F3D9C008FACAFF00120A0D89F538FF000F :109C200012580CC82FF70E34FE9BFFDB2C0DE3CD32 :109C300080F80A9E0A9CCD0BD401129E16981899A2 :109C40001C9B149C300AF01F0002D80280029B402B :109C500000000000D431FACD0180340AFAC4FEC0FD :109C6000510C089CF01F04BF688A516A689950A97A :109C700068A8509868B65086684568216830416683 :109C800050E5685250D2686A50CA687950B968087D :109C90005158E3E8200868D50C580A586812F00AB1 :109CA000150150F2F5E813FA517A68E868F640E5D4 :109CB00040A9105940980C580A5802580059F00A07 :109CC00015010459F5E813FAF20215014178E5E9A6 :109CD00013F2519A518240C54089105968C80458FE :109CE00040E20A58045840D6F00A15010C59F5E82C :109CF00013FA005951AA419840B640D5416240CA72 :109D0000F2071501EFE913F768D9105968E80E5802 :109D1000045814580C590A59F0051501F20615019A :109D2000EBE813F5EDE913F640B851C551B641A281 :109D300068F940AA416504591459105941780C58E2 :109D400040960C580A58F2021501F00A1501E5E98F :109D500013F2F5E813FA41C851EA51D2408640A502 :109D6000409A418910594198045868C204581458BF :109D70000C590A59F0051501F2061501EBE813F527 :109D8000EDE913F6408851F6520541E268DA68C5FC :109D9000EFE220091459105941A80C5868E60C58F4 :109DA0000A58F2021501F00A1501E5E913F2F5E887 :109DB00013FA52124208522A41B968F668D568EA85 :109DC000105941C804584172045814580C590A5982 :109DD000F0051501F2061501EBE813F5EDE913F6B0 :109DE0005245523668F84222418A417541D9045998 :109DF0001459105941E80C5841960C580A58F2026F :109E00001501F00A1501E5E913F2F5E813FA4248E5 :109E1000418641A5525241F9105942080E59045841 :109E20000C5941920A580458526AF20A1501F5E990 :109E300013FAF0091501F3E813F9426841B641C578 :109E400041A2527A52894219105942280C59145889 :109E50000E590A580458F20A1501F5E913FAF009E7 :109E60001501529AF3E813F9428852A941D641B537 :109E700041E2423910594248145841CA0458145812 :109E80000C5941FA0A59F0051501F2061501EBE8E3 :109E900013F5EDE913F641D852C542A241E552B699 :109EA00042590459145942CA105942680C58420682 :109EB0000C580A5841F6F20E1501F0021501FDE9A1 :109EC00013FEE5E813F2421942781458420A42257B :109ED000125842890C581C59F00615010A59EDE830 :109EE00013F61459F20A1501F5E913FA0C951493B7 :109EF000423952E652FA4216424A52D24298045825 :109F0000125842A90C580A5942261459F00A150150 :109F1000F5E813FA0C59530A1496F2081501425A3F :109F2000F1E913F84239109C531842B806581458F6 :109F3000426A125842C90C591459424A1459F00A3B :109F40001501F5E813FAF2081501F1E913F8109B71 :109F500053384278FDEC20091059425810595019D5 :109F60004289E5EA200812584269125840195008FF :109F70004018A178F1E913F8400953484008A17846 :109F8000F1E913F853584298EBEB20091059427845 :109F9000105942A850194349E7E92009105942884D :109FA000105940185009532A4019A179F3E813F9C0 :109FB000400853694009A179F3E813F953794358EC :109FC000EDE8200942B810594298105942C850197A :109FD0004369F9E92009105942A81059401850095D :109FE0004019A179F3E813F9400853894009A17990 :109FF000F3E813F943785399F5E8200942B81C595E :10A00000105950194389F7E92009129842C9045898 :10A010001258401950084018A178F1E913F8400986 :10A0200053A84008A178F1E913F8434953B843987D :10A0300010590A591C59501943A94358125840192C :10A04000065804584012A172E5E913F253C2F00217 :10A050001501E5E813F243B84369105943780C59E8 :10A060000A5943C50A581858065853D2F202150126 :10A07000E5E913F2F0091501F3E813F943D853F9B0 :10A08000438910594398145904580C5916581858B4 :10A0900053E243F54342F20C1501F0061501F9E9CC :10A0A00013FCEDE813F643A943B80A5918580459AC :10A0B0001459435A145816585406436A4402F20677 :10A0C0001501F0051501EDE913F6EBE813F543482A :10A0D00054255416435543C904591459105943D8AB :10A0E000F20215010C58E5E913F2437654320C588C :10A0F0000A58F00A1501F5E813FA544A890A442966 :10A1000043864365437A43E8125843F90C5804598F :10A110000A584392F0061501EDE813F654568916D5 :10A1200004591459F2051501EBE913F55465892515 :10A13000444243AA4389F9E2200814581258F00215 :10A140001501E5E813F25472439544090C5943B6DE :10A1500089320C590A59F20A1501F5E913FA548AA1 :10A16000894A43C6446943A5441812580C580A58F2 :10A17000F0061501EDE813F6549643BA4429045944 :10A1800043D2895604591459F2051501EBE913F528 :10A1900054A58965448243EA43C944380458145895 :10A1A0001258F0021501E5E813F254B243D54449C0 :10A1B0000C5943F689720C5944080A59446A045AE6 :10A1C000105A0C5AF2061501EDE913F654C6447BF9 :10A1D00089860C5BF4061501EDEA13F654E6441586 :10A1E00044A243E9445889A60A5B045818581258F7 :10A1F000F0051501EBE813F554D58995185BF602C7 :10A200001501E5EB13F254F289B2444A4489449BA8 :10A210000A590C5B4405442644A804581458F3E634 :10A22000200A0C580A5A5028E0657999EA155A8292 :10A23000504A410644325116441AEE050009F7E22D :10A2400020081458E062EBA1EA126ED95038507918 :10A25000040E0C99506EE068BCDCEA188F1B0C9A57 :10A26000100C2F8A505C512A1306511941087403AF :10A27000720C2F485138410A2F0A514A700A41483E :10A28000700941580A08F0090009EC081505F1E6C3 :10A2900013B8F2080008F5E3200918691459F00909 :10A2A000000740F80A08F00A0009F80B151EF7EC41 :10A2B000122BF7E320080C680658F2080008EE0994 :10A2C0001505F3E713B9EC0A151EF009000EF5E6C3 :10A2D000122AFC091505F7EA2008F3EE13B9EFE896 :10A2E000000816580A01EE0C151E0601F9E7122C9B :10A2F0001001F9EA200812011C68E209150514583A :10A30000F3E113B90A001600100040E812000A0831 :10A31000F00A0009FC0B151EF7EE122BF7EC2008D3 :10A3200002681858F2080008E0091505F3E013B9AF :10A33000F009000640D80A08F00C0009E20A151ED0 :10A34000F5E1122AF5EB200800681658F20800081B :10A35000EC091505F3E613B9F009000E40C80A0828 :10A36000F00B0009E00C151EF9E0122CF9EA2008A8 :10A370000C681458F2080008FC091505F3EE13B92F :10A38000F009000340B80A08F00A0009EC0B151E9A :10A39000F7E6122BF7EC20081C681858F2080008A2 :10A3A000E6091505F3E313B9F009000641680A0848 :10A3B000F00C0009FC0A151EF5EE122AF5EB200838 :10A3C00006681658F2080008EC091505F3E613B9FB :10A3D000F009000E40A90A091609E60C151EF9E35A :10A3E000122CF9EA20080C681458F2080008FC093D :10A3F0001505F3EE13B9F009000340980A08F00AB6 :10A400000009EC0B151EF7E6122BF7EC20081C6870 :10A410001858F2080008E6091505F3E313B9F00926 :10A42000000640890A091809FC0A151EF5EE122AD1 :10A43000F5EB200806681658F2080008EC09150527 :10A44000F3E613B9F009000E68C80A08F00B00091A :10A45000E60C151EF9E3122CF9EA20080C681458D2 :10A46000F2080008FC091505F3EE13B9F009000124 :10A4700068D90A091409EC0B151EF7E6122BF7EC44 :10A4800020081C681858F2080006E2091505F3E1D7 :10A4900013B968E8EC0900030A08F00C0009FC0A8B :10A4A000151EF5EE122AF5EB200802681658F20880 :10A4B0000008E6091505F3E313B9F009000E68F981 :10A4C0000A091609E20C151EF9E1122CF9EA200816 :10A4D00006681458F208000BFC091505F3EE13B9D1 :10A4E0004178F60900000A08F00A0009E606151E80 :10A4F000EDE31226EDEC20081C681858F208000A5B :10A50000E0091505F3E013B9F409000341890A09CC :10A510001809FC0A151EF5EE122AF5E62008006857 :10A520000C58F208000CE6091505F3E313B941983D :10A53000F80900010A08F0060009E00B151EF7E013 :10A54000122BF7EA200806681458F2080008E209FE :10A550001505F3E113B94077F009000E1407FC0963 :10A560001505E60A151EF3EE13B9F5E3122AF5EB0D :10A57000200802681658EE080008F009000341A8F8 :10A580000408F00B0009E20C151EF9E1122CF9EA9F :10A5900020081C58F2080008E6091505F3E313B972 :10A5A000F009000541B904091409FC0B151EF7EE6A :10A5B000122BF7EC20080658F2080008EA091505E6 :10A5C000F3E513B9F009000641C80408F00C0009CE :10A5D000E60A151EF5E3122AF5EB20080A58F208E0 :10A5E0000008EC091505F3E613B9F009000E41D98E :10A5F00004091609EA0C151EF9E5122CF9EA2008DF :10A600000C58F2080008FC091505F3EE13B9F0091F :10A61000000541E80408F00A0009EC0B151EF7E6F6 :10A62000122BF7EC20081C58F2080008EA0915055F :10A63000F3E513B9F009000641F904091809FC0A09 :10A64000151EF5EE122AF5EB20080A58F20800084C :10A65000EC091505F3E613B9F009000E42080408E9 :10A66000F00B0009EA0C151EF9E5122CF9EA200896 :10A670000C58F2080008FC091505F3EE13B9F009AF :10A680000005421904091409EC0B151EF7E6122BFC :10A69000F7EC20081C58F2080008EA091505F3E554 :10A6A00013B9F009000642280408F00C0009FC0A5E :10A6B000151EF5EE122AF5EB20080A58F2080008DC :10A6C000EC091505F3E613B9F009000E4239040947 :10A6D0001609EA0C151EF9E5122CF9EA20080C58A7 :10A6E000F2080008FC091505F3EE13B9F00900059E :10A6F00042480408F00A0009EC0B151EF7E6122B7D :10A70000F7EC20081C58F2080008EA091505F3E5E3 :10A7100013B9F0090006425904091809FC0A151E6C :10A72000F5EE122AF5EB20080A58F2080008EC09A9 :10A730001505F3E613B9F009000E42680408F00BA2 :10A740000009EA0C151EF9E5122CF9EA20080C584C :10A75000F2080008FC091505F3EE13B9F00900032F :10A76000427904091409EC0B151EF7E6122BF7ECDD :10A7700020081C58F2080008E6091505F3E313B990 :10A78000F0090005428904091809FC0A151EF5EEB6 :10A79000122AF5EB20080658F2080008EA09150508 :10A7A000F3E513B9F009000E429904091609E60C05 :10A7B000151EF9E3122CF9EA20080A58F208000BDA :10A7C000FC091505F3EE13B9F609000042A90409C6 :10A7D0001409EA06151EEDE51226EDEC20081C58BA :10A7E000F208000AE0091505F3E013B9F4090003C3 :10A7F00042B9FC0A151E0409F5EE122A1809F5E6FD :10A80000200800584065F208000C1405E6091505FB :10A81000E00B151EF3E313B9F7E0122BF809000162 :10A82000F7EA200AE2081505065AF1E113B842C911 :10A8300004090C091409E60A151EF208000EF5E3D6 :10A84000122AF5EB20080258EA080008E066BCDC92 :10A85000EA168F1BFC091505F3EE13B9F009000089 :10A8600042D80C08E20C151EF00B0002F9E1122C84 :10A87000FDEC0008FDEC100914691049E00815050D :10A88000F1E013B8E4090009F208000242E80C08FC :10A89000FC0B151EF00A0005F7EE122BE1EB000889 :10A8A000E1EB100918691049E4081505EA090009E7 :10A8B000F1E213B8E00A151EF2080005F5E0122ACD :10A8C00042F9E5EA00080C09F20C0003E5EA100978 :10A8D00016691049EA081505F1E513B8E6090009FB :10A8E000F208000343080C08E40C151EF00B0006E8 :10A8F000F9E2122CEBEC0008EBEC1009146910499A :10A90000E6081505EC090009F1E313B8EA0B151E7A :10A91000F2080006F7E5122B4319E065BCDCEA15E6 :10A920008F1BE7EB00080A09F20A000AE7EB10099F :10A9300018691049EC081505F1E613B8F409000987 :10A94000F208000243280A08E60A151EF00C000C63 :10A95000F5E3122AEDEA0008EDEA1009166910493C :10A96000E4081505F8090009F1E213B8EC0C151E0E :10A97000F208000EF9E6122C4339E5EC00080A094A :10A98000F20B000BE5EC100914691049FC081505E1 :10A99000120BF1EE13B84349F6080005E40B151E3F :10A9A000F7E2122BE062BCDCEA128F1BFDEB000821 :10A9B0000409F20A000AFDEB100918691049EA08B7 :10A9C0001505F1E513B8F4090009F208000643582B :10A9D0000408FC0A151EF00C000CF5EE122AEBEA36 :10A9E0000008EBEA100916691049EC081505F8098A :10A9F0000009F1E613B8EA0C151EF208000EF9E59D :10AA0000122C4369EDEC00080409F20B000BEDEC8D :10AA1000100914691049FC081505F1EE13B8F60980 :10AA20000009F208000543780408EC0B151EF00A33 :10AA3000000AF7E6122BFDEB0008FDEB1009186980 :10AA40001049EA081505F4090009F1E513B8FC0AF4 :10AA5000151EF2080006F5EE122A4389EBEA0008FB :10AA60000409F20C000CEBEA100916691049EC0815 :10AA70001505F1E613B8F8090009F208000E43982D :10AA80000408EA0C151EF00B000BF9E5122CEDEC96 :10AA90000008EDEC100914691049FC081505F609C9 :10AAA0000009F1EE13B8EC0B151EF2080005F7E6ED :10AAB000122B43A9FDEB00080409F20A000AFDEB82 :10AAC000100918691049EA081505F1E513B8F409E9 :10AAD0000009F208000643B80408FC0A151EF00C31 :10AAE000000CF5EE122AEBEA0008EBEA10091669F1 :10AAF0001049EC081505F8090009F1E613B8EA0C4D :10AB0000151EF208000EF9E5122C43C9EDEC000801 :10AB10000409F20B000BEDEC100914691049FC0854 :10AB20001505F1EE13B8F6090009F208000343D841 :10AB30000408EC0B151EF00A000AF7E6122BFDEBD9 :10AB40000008FDEB100918691049F4090009E6082E :10AB50001505F1E313B8F208000543E90409FC0AFE :10AB6000151EF20C000CF5EE122AE7EA0008E7EADF :10AB7000100916691049F8090009EA081505F1E5F8 :10AB800013B8F208000E43F90409E60C151EF20B87 :10AB9000000BF9E3122CEBEC0008EBEC1009146944 :10ABA00010494057FC0815051407F1EE13B8F609D3 :10ABB000000AEA0B151EF7E5122BFDEB0009F4085D :10ABC0000003FDEB1008E60A15051868F5E313BA53 :10ABD0001248EE080009F20A00054409E06AC1D6ED :10ABE000EA1ACA6214091809FC06151EEDEE1226AF :10ABF000EDEB20080658F2080008EA091505F3E510 :10AC000013B9F009000A4419E068C1D6EA18CA620B :10AC100010091609E60C151EF9E3122CF9E62008B6 :10AC20000A58F2080008F4091505F3EA13B9EA0B0B :10AC3000151EF0090003F7E5122B4429E065C1D683 :10AC4000EA15CA620A090C09F7EC20081458F20840 :10AC50000008E6091505F3E313B9F009000EFC0935 :10AC60001505F3EE13B9F406151EEDEA1226443A63 :10AC7000EDEB20080A0A0658180A100A120A44497D :10AC80000A091609E60C151EF9E3122CF9E620084C :10AC90001C58F2080008F4091505F3EA13B9FC057D :10ACA000151EF0090003EBEE1225E6091505EBEC85 :10ACB0002008F3E313B91458E062C1D6EA12CA625D :10ACC000445B040B0C0BF406151E100BEDEA122668 :10ACD000120BEDE52008F60915050658F3EB13B93C :10ACE000446A040A180A100A4478F409000E040899 :10ACF000F0050009E60A151EF5E3122AF5E620081C :10AD00001658F2080008FC091505F3EE13B9F0090E :10AD10000005448904090C09F60C151EF9EB122CE8 :10AD2000F9EA20081C58F2080008EA091505F3E5BD :10AD300013B9F009000344980408F00A0009FC0B59 :10AD4000151EF7EE122BF7EC20080A58F20800083F :10AD5000E6091505F3E313B9F009000E44A9040947 :10AD60001809EA06151EEDE51226EDEB2008065837 :10AD7000F2080008FC091505F3EE13B9F009000507 :10AD8000EA091505F3E513B944BAE60C151E040AE1 :10AD9000F9E3122C160AF9E620081C58100A120AC8 :10ADA00044C904090C09FC0B151EF7EE122BF7EC35 :10ADB00020080A58F2080002F4091505F3EA13B94D :10ADC00044D8E409000EE069C1D6EA19CA62120843 :10ADD000EA06151EF00C0009EDE51226EDEB200841 :10ADE0001458F2080008FC091505F3EE13B9F00930 :10ADF000000CE068C1D6EA18CA62F405151EF8090D :10AE00001505EBEA1225F3EC13B944EA100AEBE658 :10AE10002008160A1C58100AFC02151EF40900012D :10AE2000E5EE1222E06AC1D6EA1ACA62E5E5200818 :10AE3000E20915051858F3E113B944FB140B404A15 :10AE40000C0BA17A100B44B8F609000E4049F5E945 :10AE500013FA14584459F1E9200B4438E069C1D67B :10AE6000EA19CA6289CAF7E820074108F806151EE0 :10AE7000120AEDEC1226700CEDE22008120C0258BA :10AE8000FC091505F3EE13B90A0AE203151E100AB0 :10AE9000E7E11223120AE7E62008E069C1D6EA19C1 :10AEA000CA621C5840354030A170E1E513F0E0095A :10AEB000000BF4091505040BF3EA13B9100B402835 :10AEC0004021120BE065C1D6EA15CA62A171E3E820 :10AED00013F1E2050008F0060009FC02151EE5EE7C :10AEE0001222E5E320081458F2080008F6091505B7 :10AEF000F3EB13B9F406151EF009000EEDEA122665 :10AF0000EE051501410AEBE713F5EDE220080A0C06 :10AF10001658060CFC091505100CF3EE13B9120CAB :10AF2000950C411972081C089308F609151E412A50 :10AF3000F3EB1229740812089508413870090C09BE :10AF4000910989D089E189F541466C080408089C7B :10AF50008D08340A300BF01F00042A0DD83200008F :10AF6000800091DC800091D0EBCD40F878581494AB :10AF7000A37AF40800099959123AF9F98006F9F907 :10AF8000B006F7B90BFFF9F9BA06FDD8C066E808B4 :10AF9000161DF2080008996818951693E80E000926 :10AFA000E049003FE08B000F3006FCCCFFE4E606F2 :10AFB000000BEA0C000CE806010AF01F0014E3CDB8 :10AFC00080F8FC061140FCCCFFE40C9AEA0C000C63 :10AFD000F01F000EEACBFFE40A9CF01F000DECC846 :10AFE000FFC11034E088000FE60600070E9B0A9CA4 :10AFF0002C07F01F00072C06ECC8FFC11034FE9B85 :10B00000FFF7300ECD3B0000800091DC80029C54A5 :10B01000D421202D16961895300B1A94583BF9B868 :10B020000B14F9B80818F60911FFEC08030AF3D954 :10B03000C002A379F4090A4AE80B0B0A2FFB588BCC :10B04000CEE1301A49EBC038301A49EB0C9CF01FA6 :10B05000001E6C58E21801F8E04801C0CF61308A48 :10B060001A9B0C9CF01F00183007EE081602EE0920 :10B0700011FFEC08032AF3D9C002A379F4090A4AA4 :10B08000EA070B0A2FF75947CF11300B340AECCCE3 :10B09000FFE4F01F000E0E9A300B0C9CF01F000B0B :10B0A000ECCCFFEC308A300BF01F00081A9C308A81 :10B0B000300BF01F00062FEDD82200008003DE5871 :10B0C00080029C508002AF68800091D0EBCD40FCA4 :10B0D000217DE0682301EA186745E06EAB89EA1E2E :10B0E000EFCD5008E068DCFEEA1898BA3007501E31 :10B0F0005028E06E5476EA1E1032E068E1F0EA185B :10B10000C3D250675057503E504818931292580C73 :10B11000C140149416951A962FF7090A0B0B1A9C26 :10B12000F01F00070E33FE9BFFF91A9B049CF01FD3 :10B1300000052E9DE3CD80FC1A96CF8B8002AF6870 :10B140008002B010D431FACD008C501C500B1493F7 :10B150001292109142C0585AE08B0056E04B0040CA :10B16000E08B0054FAC4FFF8340A300B089CF01F3F :10B17000002E400A401B089C0896F01F002CFAC5C0 :10B18000FFB808970D88EC1800360CC80A36CFB106 :10B190003408518451285803C110FACCFF9CFACBD3 :10B1A000FFB4300AE60E1502E40A030818A8E20A02 :10B1B000030916A92FCA1C3ACF81E6CCFFFF0099DC :10B1C0000A9AFAC3FFA0069BF01F0019340A300B3D :10B1D000089CF01F0015400A401B089CF01F00133C :10B1E0000F88EC18005C0EC80C37CFB1314C340816 :10B1F000513C5184519000990A9A069B5128302C59 :10B20000F01F000B2DDDD832FAC6FF881A9A0C9970 :10B21000FACBFFFC301CF01F0006314850165008D6 :10B22000CA2B0000800091D0800091DC8002B0CC5D :10B23000D401202D501A5009301A1AD8FAC9FFF833 :10B24000FAC8FFFCF01F00032FFD2FEDD80200000D :10B250008002B144D43121AD5009502B501A1892BC :10B2600042395809C6D0504850593008FAC7FFAC87 :10B270005038FAC3FFD4FAC0FFC0FAC4FFE8049CF8 :10B28000F01F003140382FF850381AD34038518819 :10B2900040285168FAC8FF98519830484046517884 :10B2A000B986FB380013FAC9FFA0FB68006B189B36 :10B2B0000E98FB66006840454046302A1891B185DB :10B2C000049CFB650069A986FB66006AF01F001FED :10B2D000314A069B009CF01F001E2FFD40085818A5 :10B2E000E08A001C301608983149069A029B049C9B :10B2F000F01F0018314A089B069CF01F0015009AA9 :10B30000089B17381589125814C80E3ACFB12FF67A :10B3100040080C38FE99FFE940560C985946F9B69A :10B320000B140C180C9A5058009B404CF01F00084E :10B3300040585808C05040480C085048CA1B2E6D51 :10B34000D8320000800091B88002B144800091DCC6 :10B350008002B230D43120EDFACEFFA4109530082F :10B3600018927C14149716911296FB680036FB68AD :10B3700000377C00149CF01F00275804C3003018CD :10B38000FAC9FFC9508850685097FAC8FFCA505C84 :10B3900050B6507550A950C85934E0880023300782 :10B3A000FAC3FFECFAC6FFDCC088FB680036E8078A :10B3B00001055935E088001CE00700080C991AD8EF :10B3C0002EC70698304A029B049CF01F00132FFDE5 :10B3D000FB3800362FF80E34FE9BFFE92F2DD832B4 :10B3E00008953007FAC3FFECFAC6FFDC0C99069803 :10B3F0001A96049C1AD6029B304AF01F00070A9A3C :10B400000C9BE007000CF01F00052FFD2F2DD832FC :10B41000800091B88002B144800091DC00000000FF :10B4200000000000EBCD4080129E1097584CC26087 :10B43000E08A0013588CC140590CC101590B5F18A8 :10B4400058FA5FA91248C0A130689D083039300C05 :10B450008F09E3CD8080582CC1E0E3CFC080E04B62 :10B4600000205F1859FA5FA91248CF8130689D0803 :10B470003029300C8F09E3CD808058DB5F1858CA23 :10B480005FA91248CEB130099D093018129C8F086F :10B49000E3CD8080585B5F18584A5FA91248CF40BF :10B4A000E3CFC080580C5E0CF8F8010C5808F9B8CE :10B4B0000100F9F81A435EFC580CF9FB1A4C5EFCCB :10B4C000580CF9FA1A51F9FB1A505EFC580CF9FBAA :10B4D0001A415EFC580CC080586BE08800035EFD8A :10B4E0004928F00B032F5EFEF94A016C5EFDF94A14 :10B4F00001685EFDF94A01645EFDF94A01605EFD86 :10B50000580ACF20F94A01585EFDF4C80001E0480E :10B510000063FE9BFFEAF94A01545EFD580ACE40E3 :10B52000F94A01505EFD00008003DE5CEBCD40E097 :10B53000189716951496580CC130F8FC0180F01F2E :10B54000001158055F0858065F091248C0B030085E :10B55000EF480188EF480180109CE3CD80E0E3CF05 :10B56000C0E00C9CF01F0008EF4C0180CF900A9BBC :10B570000C9AF01F0006300CEF460188E3CD80E006 :10B58000800091E880009200800091DCEBCD40E0EB :10B59000189716951496580CC130F8FC017CF01FD2 :10B5A000001158055F0858065F091248C0B03008FE :10B5B000EF480184EF48017C109CE3CD80E0E3CFAD :10B5C000C0E00C9CF01F0008EF4C017CCF900A9B60 :10B5D0000C9AF01F0006300CEF460184E3CD80E0AA :10B5E000800091E880009200800091DCEBCD40E08B :10B5F000189716951496580CC130F8FC0174F01F7A :10B60000001158055F0858065F091248C0B030089D :10B61000EF480178EF480174109CE3CD80E0E3CF60 :10B62000C0E00C9CF01F0008EF4C0174CF900A9B07 :10B630000C9AF01F0006300CEF460178E3CD80E055 :10B64000800091E880009200800091DCEBCD40FE0C :10B65000189716961493580CC031E3CFC0FE7409A6 :10B66000F8F801605828C5E0F8F1016CF8F50168B8 :10B67000F8F201645979FE98FFF23DD8304AB68855 :10B68000ECCCFFFEFEFB0238F01F008E30083019B4 :10B69000ACF8ACE9ECC4FFF85905E08000A158858E :10B6A000E08000AA5845E08100BC0A9AFEFB02181F :10B6B000089CF01F00843018A8C8E8C9FFFB3008B8 :10B6C000B288E8C5FFFA5902E08000905882E08114 :10B6D000009F304A4FDB0A9CF01F007A3018AAC83E :10B6E000EAC9FFFB3008B2882FA55811E080008A14 :10B6F0005821E08100A5304A4F5B0A9CF01F007181 :10B70000EAC9FFFCEC0811FE1208AC98F206010C25 :10B71000CA56870CEEF501745805E08000C1E3CFEE :10B7200080FEF8F8010CF8F2016C5808F9B801280D :10B73000F9B80016F8FA0168F8F401641039C8E3A2 :10B7400033083009B688B6B93018B6A8F6C5FFFC7C :10B75000590AC6F0588AE0800082584AE081009772 :10B760004DCB0A9CF01F00573018AAC8EAC9FFFB4E :10B770003008B2882FA55904C6B05884E081007EF5 :10B78000304A4D5B0A9CF01F004F3018AAC8EAC926 :10B79000FFFB3008B2882FA55812C661304A4CFB17 :10B7A0000A9CF01F0048EAC8FFFC300AB08AB09A31 :10B7B000EAC9FFFAEEF8010C5808CA503018B288EE :10B7C000EAC9FFF9EACCFFF8B28A310AEEFB010CB4 :10B7D0002FCBF01F003CEAC9FFE8C95B304A4C0B95 :10B7E000089CF01F0038C68B304A4BDB0A9CF01FC8 :10B7F0000035C75B304A4B5B089CF01F0032C5CB5D :10B80000304A4B8B0A9CF01F002FC7BB5812FE9189 :10B81000FF26304A4B4B0A9CF01F002AC60B5825C6 :10B82000FE91FF1D304A4B1B089CF01F0026C44BA5 :10B83000304A4AFB0A9CF01F0023C97B5901FE9144 :10B84000FF0E304A4ABB0A9CF01F001EC5AB304AAF :10B850004A7B0A9CF01F001BC99B304A49EB0A9C9B :10B86000F01F0018C82B5822FE91FEF9304A4A2BCF :10B870000A9CF01F0014C98B5814FE91FEF0304A48 :10B8800049EB0A9CF01F000FC81B582AFE91FEE7E7 :10B89000304A49BB0A9CF01F000BC67BF01F001901 :10B8A000EF4C0174FE90FEDB0C9B660AF01F000556 :10B8B00066080A9CEF480178E3CD80FE8003DE989D :10B8C000800091DC8003DEA08003DE8C8003DE7CC0 :10B8D0008003DE888003DE808003E1EC8003E1E406 :10B8E0008003DE9C8003DEA48003DE948003DEB44C :10B8F0008003DEB08003E1E88003DEA88003DE84FD :10B9000080009200D401580CC060F8CCFEC8306AA8 :10B91000F01F0002D8020000800091DCD4011898CA :10B92000580CC040918AF01F0002D802800091DCC0 :10B93000EBCD40F8208D189416971493F6C6FFF0BF :10B94000F8F501685885C2E0E8F801645818C1604C :10B950006EC8E8F901286E0B1AD81AD66E2849CAA3 :10B960001AD81AD3720C72666E186E395D162FCD06 :10B97000580CC1552F8DE3CF80F86EC9E8FA012825 :10B980006E0B1AD91AD66E291AD91AD3740C74668A :10B990006E3948FA5D162FCD580CCED42F8DE3CFDB :10B9A000C0F80C9B310A1A9CF01F000A0A9AEECBD1 :10B9B000FFD8FACCFFF0F01F00070A9AEECBFFE0A9 :10B9C000FACCFFE81A96F01F0003CBFB80039C38EB :10B9D000800091DCD401580CC070F94B0134F8FCA4 :10B9E0000108F01F0002D80280028F64D401580CB5 :10B9F000C110F8F8010C5808C08070DAF0CBFFECE9 :10BA0000998AF01F0005D802320A109B998AF01F0C :10BA10000003D802800091DC800091D0EBCD408003 :10BA20001897F01F000AEEF801287029700C5D19B4 :10BA3000585CEFF80057F9B90001F1D9E008EFF8C8 :10BA40000A57E3CD8080000080029438EBCD40C0DF :10BA500018971696580CC190306AF8CCFEB8F01FB3 :10BA6000000F308A300BEECCFF10F01F000D3008B5 :10BA700030190C9BEF4800F8EF4900EC306AEECC2F :10BA8000FEE4F01F0008C030E3CD80C00E9CF01F24 :10BA90000006E3CD80C00000800091DC800091D0E2 :10BAA0008000917C80029438EBCD40C016971496AC :10BAB000F6F8010C1838C0D0768A78D8103AC03021 :10BAC000E3CD80C0F8CBFFEC0E9CF01F000ECF91B1 :10BAD0003008EF48010C5806CF41320A0C9B0E9CEF :10BAE000F01F0009EEF90128301B720C72485D1836 :10BAF000EEF801280C9A700C70390C9B5D19CE1B66 :10BB00008000917C800091D0D431189716941493C2 :10BB1000300B324A069CEE040005F01F0052EEC6C0 :10BB2000FFFF0C35E0880034E8C800013DD2EE0884 :10BB30000004C0D8E4091800C2B01499F2C8FFFE8E :10BB40001007EEC6FFFF0C35E08800220F89E409DC :10BB50001800C4B10837C1B00D8A580AC180F4C8B2 :10BB6000FFFEEE0800081035C4733308F009180012 :10BB7000CE2187270D882FE887380D89F2C8FFFE70 :10BB80001007EEC6FFFF0C35FE9BFFE2D83A580ABD :10BB9000CFE03058F00A1800E08B003FEEC8FFFB02 :10BBA0001035E08B002B14993061E2091800FE98E3 :10BBB000FFC7EEC0FFFE304A4ABB009CF01F002BBF :10BBC000C3900D89E2091800FE98FFBA009C304A24 :10BBD0004A7BF01F0026C071EEC9FFFA87790D88F5 :10BBE000204887880D89CABB0D8AF4C8FFFEEE087D :10BBF00000081035CBB2DC3A14993138F00A18003D :10BC0000FE98FFD4304A49BBEECCFFFEF01F001770 :10BC1000C1900D89CCAB304A497BEECCFFFEF01FC2 :10BC20000013C0610FE93018F0091800C1000D8A37 :10BC3000CB6BEEC9FFFA87590D88204887680D89BC :10BC4000C7EBEEC8FFFA87480D89C79B0FF8F808C5 :10BC50001800CEE187070D882FE887180D89C6FBED :10BC6000800091D08003DE788000917C8003DEAC80 :10BC70008003DE908003DE98EBCD4080304A189739 :10BC8000496BF01F0017C031E3CF9080304A495B09 :10BC90000E9CF01F0013C041302CE3CD8080304A51 :10BCA000491B0E9CF01F000EC041308CE3CD8080FC :10BCB000304A48EB0E9CF01F000AC041310CE3CD26 :10BCC00080800E9C304A48ABF01F0005F9BC000490 :10BCD000F9BC0100E3CD80808003DEA88000917C68 :10BCE0008003DE848003DE808003DEB48003DE8890 :10BCF000EBCD4080304A1897496BF01F0017C031D8 :10BD0000E3CF9080304A495B0E9CF01F0013C04186 :10BD1000302CE3CD8080304A491B0E9CF01F000E72 :10BD2000C041308CE3CD8080304A48EB0E9CF01F40 :10BD3000000AC041310CE3CD80800E9C304A48ABF4 :10BD4000F01F0005F9BC0004F9BC0100E3CD8080C0 :10BD50008003DEA48000917C8003DE948003DE8C6F :10BD60008003E1E48003DEA0EBCD40FC189416963E :10BD70001497580BC160198B3308F00B1800C1D011 :10BD80003008301595789548956895589505308810 :10BD90009535952895185876E08B009BE3CFC0FC2D :10BDA000301830898F7B8F4B8F6B8F5B9538950860 :10BDB00095299519E3CFC0FC300531099545956566 :10BDC000955595759529951930289508301A8F3A0B :10BDD0005836FE98FFE51988F6081800CE01199923 :10BDE000ECC800021039CDB119B919A8F1E91088D1 :10BDF000F4081900CD4120465836E08A01112FC4BD :10BE0000089CF01F008A8F2C20465816E08A010BF0 :10BE10008F15E8CCFFFC19991988F1E91082CBF055 :10BE2000ECC30002E40815021033CB95F8C4FFFE02 :10BE300030056E16089CF01F007D0C4C8F1C2FC423 :10BE400020432FF50A32FE99FFF65813E08A00E5E9 :10BE5000300A8F3A09990988F1E91082CA00202333 :10BE6000E40815021033C9B5E8C6FFFE14956E3418 :10BE7000304A4EFB0C9CF01F006FE08100C430186C :10BE800008488F382FC620432FF50A32FE99FFF15C :10BE90005813E08A00940D990D88F1E910888F48B5 :10BEA000E6CB0002581BE08A008AECCCFFFE199812 :10BEB0001989F3E810898F59F6C80002A56912386C :10BEC000C7F5F8C8FFFE300C8F68E3CD80FC1989F8 :10BED0003DD8F0091800FE91FF631999ECC80002E3 :10BEE0001039FE91FF5D304A4D3B2FECF01F0051A1 :10BEF0001893FE91FF5509F909E8F1E91088EA085D :10BF00001900FE91FF4DECCA0008583AE08A005E25 :10BF1000E8CCFFF8F01F00498F2CECCA000C0A3A5D :10BF2000E08A00578F13E8CCFFF419991988F1E9DA :10BF30001082FE90FF35F4C30002E40815021033AE :10BF4000FE95FF2EF8C4FFFE30056E16089CF01F0C :10BF5000003B0C4C8F1C2FC420432FF50A32FE9956 :10BF6000FFF65813E08A0042300A8F3A099909888F :10BF7000F1E91082FE90FF142023E408150210332B :10BF8000FE95FF0EE8C6FFFE14956E340C9C304AF9 :10BF90004ABBF01F0028C211301808488F382FC63E :10BFA00020432FF50A32FE99FFF25813E08A00145D :10BFB0000D880D99F1E910888F48E3CF80FC300897 :10BFC0008F58109CE3CD80FC580AFE99FEE9581A60 :10BFD000FE90FEE6E3CF80FC304A49AB0C9CF01F9C :10BFE0000015C0613028CDAB5813CF51CD8A0C9CC1 :10BFF000304A495BF01F000FF9B80010F9B8010092 :10C00000CCDB0C9C304A491BF01F000AF9B8000237 :10C01000F9B80100C36B5813CD11CC1A5806FE991C :10C02000FEBF5816CCB1CBBA8002BC788003E1ECDD :10C030008000917C8003DE988002BCF08003DE9C4F :10C040008003DE7C8003DEB08003E1E8D401580C7D :10C05000C021DC0AF8F801745808CFC0169AF8FB22 :10C060000178109CF01F0004F9BC01FEF9BC00002F :10C07000D80200008002BD68EBCD40801897580CB4 :10C08000C1D0F8FC0108F01F000F300A0E9B48ECED :10C09000F01F000EEEFC0174F01F000DEEFC017CA1 :10C0A000F01F000BEEFC0180F01F0009EEFC0128E0 :10C0B000F01F00070E9CF01F0006E3CD80800000FB :10C0C000800290A88002C0D080027400800091E8B5 :10C0D000D401F01F0002D8028002963CEBCD40C094 :10C0E0001896E06C018CF01F00131897C19030185F :10C0F000E069A8C0F94800ECF9490150346833C937 :10C10000F9480154F9460128F9490158189A189B31 :10C11000489CF01F000AEF4C01081898C0400E9C84 :10C12000E3CD80C00E9C1097F01F0005CF9B000050 :10C1300080028F248002BAA880028F8C800091E850 :10C14000EBCD4060149E1DD81896158CECF5012897 :10C150001AD81DC91AD91DB81AD81DA91AD91D98DF :10C1600048CA1AD81ADC1ADB303B6A0CF01F000AE6 :10C17000ECF90128311B720C72585D18ECF901289A :10C18000300A720C7238149B5D182F9DE3CD8060CD :10C190008003DF4880023A1AEBCD40C0205D109743 :10C1A000581BC130582BC0402FBDE3CD80C0310B90 :10C1B0001A98F01F00091A961A9B0E9C310AF01F5C :10C1C00000072FBDE3CD80C0310BF01F00052FBD50 :10C1D000E3CD80C08002B230800091DC80028EF816 :10C1E000D431201DFACEFFD81894500B149012961B :10C1F00010917C237C077C12306A49AB129CF01FA3 :10C20000001AC1D05803C0800698009B400C0499C6 :10C210000E9AF01F00160C9BE8F501280498F5D142 :10C22000C0100E996A0C6AA65D16E8FC0104F01FA6 :10C2300000100E9CF01F000F2FFDD832E8C5FEB88D :10C24000306A488B0A9CF01F0008CDD1E8F801281D :10C250000A9B700C70995D19EA061740CD4B0000DF :10C260008002B41C8000917C8002C19880025582BB :10C27000800091E8EBCD40E0189716961495F8F8F9 :10C2800001685848E0800081E08A00495888C780EA :10C290005908C4F04C19EEF801645848C480584855 :10C2A000E089004A5818C6605828C6604BB81AD9A9 :10C2B0001AD8EEFA01280DD81AD80DC91AD90DB816 :10C2C0001AD80DA91AD90D981AD80D89302B1AD958 :10C2D000740C4B3AF01F0033EEF801282F8D700BD1 :10C2E000707C300AF01F0030EEF90128720C72C821 :10C2F0005D18EEF90128307B720C72185D18580534 :10C30000C201EEFC010C580CC07079485808F9B80D :10C310000100F9F81A14E3CD80E05818C33058280A :10C32000CBA14A29EEF801645848CBA14A08CC0BAE :10C330004A09CB2B5888C2205908CB9149D8CB8BBE :10C34000EEF801280C9B700C71263019303A5D16FE :10C35000301BEEFC0104F01F0018EEF8016C5828A9 :10C36000C15030080E99495A109B301CF01F001420 :10C37000CC9B4948C9DB48D8C9BB4938C99B492926 :10C38000C8BB4909C89B48A9C87B301BEEFC010407 :10C39000F01F000ECE7B00008003C6288003DF74F0 :10C3A00080023A1A800274008003DF088003DF10E5 :10C3B00080039A74800261D48002C0D080027474B9 :10C3C0008003C8E480039A6C800261A4D431FACD62 :10C3D00000DC1897169314951296E0490062E08BE2 :10C3E000000630060C9C2C9DD832129CF01F034492 :10C3F0001892E08000D60C9A0A9BF01F034205A910 :10C4000005B8F1E910880599F5D8B0103038F00971 :10C410001800C0603006049CF01F033BCE4BECC8F4 :10C420000004EBDAC01030090A385F3AE045005EDC :10C430005F88F5E8100CF20C1800CED13FE8E4C19B :10C44000FFFC038AF00A18005F1B3028F00A18006E :10C450005F19F7E90004F8041800CDD1EEFC0104DF :10C46000F01F032A039903A8F1E91088EDD8B01052 :10C47000FDD6C003506E1C9930182019F009190020 :10C48000E08800043FF6CC8BEEF8016459085F0A9F :10C490003028F00E19005F19126AE80A1800C080EF :10C4A000EEF801685908CEF0EDB60003CEC0EEF804 :10C4B00000F85808E08100ABE1D6C0100098E218FF :10C4C0002080CE10009AE21A0800502ACDC12FC554 :10C4D00000995055E21901005039C641405AE339DC :10C4E000005DE338005E263AF1E91088F7D8B01015 :10C4F000E9DBC010083AE0830598EEF9016058299D :10C50000E0800550EDB00003E0810333E21000301D :10C51000CBA140395809E08001CAEEF90128305B0F :10C52000720C72185D18039903A8F1E91088E339B9 :10C53000005DEBD8B010E33B005EFACAFF50F7E9AC :10C54000108BE2CCFFA1F01F02F243185808C04044 :10C55000EDB5000CC231EEC3FEB8EEF60134EEF8D4 :10C56000017C5808E08004E742C95809E08004C80B :10C57000EEFB017C580BC79042DAEEF80184103ACA :10C58000C70042FE42EC1ADE14981ADC069A0E9C92 :10C59000FEFB0B80F01F02E02FED3016C3DB3FF6F1 :10C5A000C22BE2C6FFB3FAC4FF84310A0C9B089C7D :10C5B000F01F02D440685C785048EEF800A8580894 :10C5C000C301EEF800A45808FE90FF5E310A300B5C :10C5D0000C9CF01F02D2049A404BEECCFFDC0C986E :10C5E0004059F01F02CF0C9B089C310AF01F02CD6E :10C5F000FE91FF4A308AE2CBFFFBEECCFF10F01F2A :10C6000002C13018EF4800F8C6AB308AEECBFF10FD :10C61000E2CCFFFBF01F02C3FE99FF503FF6CFCAEA :10C62000402B310A0C9CF01F02BD049A404B0C9821 :10C630004059EEC5FF9C0A9CF01F02B9310A0C9BC1 :10C64000089CF01F02B8CBE13018EF4C00A80A9B01 :10C65000EF4800A4340AEECCFFDCF01F02AACCBBEA :10C66000129CF01F02B0C10142EC580CC160EEFBFD :10C670000180580BC12042FEEEF80188103EC090A8 :10C6800042C942DAC81B42FE42C942EC42DAC7CB79 :10C690001C9AF01F02A4CF81EEF801605818E080C8 :10C6A00000E6320AE2CBFFF3EECCFF34F01F029D2E :10C6B000FE91FF7503B903C8F1E91088F3D8B010F3 :10C6C000EEF801645888E08000CC5908E08000CA88 :10C6D000EEF80128FAC9FF2C1AD970D6700C35F97A :10C6E000FAC8FF24300A303B5D162FFD1896580C0F :10C6F000FE90FF55EEF80160E06900FE5828F20850 :10C700001710435AB48840680A99E2190200F1E907 :10C7100010094358E8190108F20B1608B09B435A58 :10C72000B4A9EEF801605828E0810093300843591D :10C73000B2B8435AB4C8435C308AE2CBFFFB2FBC8B :10C74000F01F02704358300AF16A005D4359F36AE2 :10C75000005E4358406A2B381AD84379E068888EC7 :10C760001AD9EECBFFDC1AD606990E9CF01F026E8A :10C770003018EF4800EC5C752FDDEDB50006C0F118 :10C78000FEFA09A8F4E80000FAE9007CEEF801647A :10C790005888E08003F65908E08003D90A90E21037 :10C7A0000200C0E0EEFA01283019740C069B7528CF :10C7B000129A5D18301BEEFC0104F01F025DEEF8CA :10C7C0000128306B700C70195D1943165806FE90E5 :10C7D000FEE64328FAC4FF84F0C50002334A300B5A :10C7E000089CF01F024EE0450020FE9BFED80D88FD :10C7F000F1D8C00252280D89F3D9C041C050EEF8DB :10C80000016458185F095209ECCBFFFE0A9AFACC72 :10C81000FF74F01F023C0A9A52B50898FAC9FF7CCF :10C820000A9BEEFC0168F01F0243FE91FEB8E2CACB :10C83000FFC3089B0E9CF01F0240FE91FEB0009AC1 :10C84000069B0E9C3016F01F023DFE9FFDE6435CEA :10C85000302AE2CBFFFD2FDCF01F022AC6DB3208B4 :10C86000F0091900FE91FE9BC34B42EB580BFE9062 :10C87000FF1A58065F1AEEF9018058095F0814681C :10C88000FE90FF116D68EDB80001FE91FF0C42F8BB :10C89000069A1AD80E9C1ADBFEFB08A442F842E95D :10C8A000F01F021D2FEDFE9FFE7AEEF90128720C9B :10C8B00072885D18FE90FE73EEF80128305B700CF4 :10C8C00070195D19403BFAC6FF50324A0C9CF01FAC :10C8D0000213EEF801605828C0C1E338005DE33B65 :10C8E000005E0C9AF7E8108BE2CCFFA1F01F020863 :10C8F00043065806C0E0EEFC010C580CE08003D162 :10C90000F8CBFFFC310A0C9CF01F0206E08003C04C :10C910003005EEF8016C5818E08000D45805C0606E :10C92000EEFB016C581BE080029BEEF800EC58080F :10C93000E08102B5EEC8FF545008EECAFEB8EEC959 :10C94000FF9CE2C8FFF3508AEEC6FEC850A950987B :10C95000306A6E85408B0C9CF01F01F2E08500FB75 :10C96000306A408BFAC0FFD0009CF01F01E60C9BA0 :10C97000306AFACCFFCAF01F01E3320A409B400C38 :10C98000F01F01E8E08500D0320A409BFACCFFC4DA :10C99000F01F01DC320A400BFACCFFA4F01F01D9D2 :10C9A000340E1ADE40BE00991ADE34C80A9BFEFA25 :10C9B00007920E9CF01F01E4EEC5FF6CFAC3FF7CEA :10C9C0000A9B308A069CF01F01CF0A9CEEC6FF64CA :10C9D000308A0C9BF01F01CB069B0C9C308AF01F09 :10C9E00001C93018EF4800A82FEDEEF50178EEF000 :10C9F00001745800FE90FDD3EEFA0128FAC8FF2812 :10CA0000E9D5B0101AD8E8C9FFA1740C74D6FAC8D9 :10CA1000FF285C79300A303B5D162FFD1893580CC7 :10CA2000FE90FDBDEEF80160E06900FE5828F208B6 :10CA30001710436AB48843683019B0994066436858 :10CA40005C760C9AA3BAB0AAEEF901605829C631F7 :10CA500030084369B2B8436AB4C8436CE2CBFFFB09 :10CA6000308A2FBCF01F01A74368F3D4C108F169D5 :10CA7000005D43680A9AF165005E009B436C2A1CC6 :10CA8000F01F01A0400B436C320A2F3CF01F019DA8 :10CA9000408940AB43682B381AD8436C0C9A1ADC97 :10CAA000E068888E1AD30E9CF01F019F40CBEECC1D :10CAB000FF34320A3016F01F01932FDDFE9FFCADCC :10CAC000EEFC0104580CFE90FF2B320A0E9BF01F67 :10CAD000019FC361320A8F8AEEF8013406991AD891 :10CAE0000E9BEEC8FEC8EEFC0108F01F0199580627 :10CAF0005F1AEEF9010C2FFD58095F081468FE90CB :10CB0000FF0F0C9A069BEEFC0108F01F0192FE91AC :10CB1000FF0EC05B436C302AE2CBFFFD2FDCF01F21 :10CB20000179C9CB400B320AFACCFFC4F01F017562 :10CB3000320A409BFACCFFA4F01F0172C32B310ACA :10CB40000E9BEEFC0104F01F0181E08101B4310A6B :10CB5000CC3B0C9BFAC0FFD0306A009CF01F0169EF :10CB6000306A408BFACCFFCAF01F0166C07B009B85 :10CB7000E21B2000FE91FD13403A580AFE90FD0F83 :10CB8000334AFAC0FFD0009CF01F0164EEF901287F :10CB90007228720C5D1850BC039903A8F1E9108843 :10CBA000E339005DE7D8B010E338005EF1E91088A2 :10CBB000EEF90160F7D8B0105829E080011303B9ED :10CBC00003C8F1E910895189EBDBC0100A34E08316 :10CBD00000CB3028406EF00E1900E08001D80A9694 :10CBE000129B0098FAC9FFC80C9AEEFC0168F01F6E :10CBF0000151E08100B9F5D3C010F1DAC082501ABA :10CC000050F830194068F2081900E08000C7302859 :10CC1000406EF00E1900E08000A4401AF1DAC0C1A5 :10CC2000C050EEF8016458185F0850D8EEF801289B :10CC3000306B700C70195D19009BE2CAFFC30E9C2B :10CC4000F01F013D1895FE91FCAAEEF80128FAC9E3 :10CC5000FF2C0A9A1AD9303B700C70D635F9FAC8F5 :10CC6000FF245D162FFD1894580CFE90FC98EEF8EA :10CC70000160E06900FE5828F20817104066435A28 :10CC80005C76B488E21300304358E8130300E7E60B :10CC9000100CF80B1608B09B4359B2ACEEF80160CB :10CCA0005828E08102234358B0B54359B2C5435CCC :10CCB000E2CBFFFB308A2FBCF01F01124358300A31 :10CCC000F16A005D4359F36A005E43582B381AD865 :10CCD00043790C9A1AD9EEC6FEB81AD40C99E068BA :10CCE000888EEECBFFDC0E9CF01F010F2FDD40B9CC :10CCF0005879E08101F1EEF801685848E08001E6DA :10CD0000E08901DC5818E080014B5828E08001469A :10CD1000FEF804441AD8EEFA0128EF38014D1AD86B :10CD2000EF39014C1AD9EF38014B1AD8EF39014AC3 :10CD30001AD9EF3801491AD8EF390148302B1AD9DE :10CD4000740CFEFA0416F01F0106EEF80128307B81 :10CD5000700C701930165D192F9DFE9FFB5EF1D58A :10CD6000C003C0A0EEF80128306B700C70193016AB :10CD70005D19FE9FFB52E0460020FE9BFFF5EC0B89 :10CD80001603FAC9FFC0E2CAFFA1EECCFFCCF01F28 :10CD900000F5FE90FF44CE7B310AE2CBFFD3FAC40C :10CDA000FF84089CF01F00D7310AEECBFFCCFACCF1 :10CDB000FF74F01F00D4E0450020FE9BFFD5FAC6AB :10CDC000FFC00A9AE2CBFFA10C9CF01F00CE0A988C :10CDD0000C99089CE06A0100320BF01F00E3C1EBE4 :10CDE0005C7BFACAFF50E2CCFFA1F01F00C94318D8 :10CDF0005808CB90F3D3C0105019EDB9000CCB31CB :10CE000043282028FAC9FFC8109A5188149B00981B :10CE1000EEFC0168F01F00C7CA61431B1788F1D8F8 :10CE2000C00250F81789F3D9C041C050EEF8016430 :10CE300058185F0950D94328F0CA0002E04A002080 :10CE4000FE9BFF922FEBFACCFFC0F01F00AEEEF975 :10CE50000128306B720C72185D18CEFAEEF80128BA :10CE600030091AD9129A700C70D6FAC8FF285D16CC :10CE70002FFD1893580CFE90FB92EEF5012818999F :10CE8000EECBFEB84358E06A888E6A0C6AA65D163F :10CE9000069CF01F009DFE9FFB82EECEFF54320BDE :10CEA000500E1C9CF01F00B1C1F1EF4C00ECFE9F36 :10CEB000FD46EEF80128FEFA02B6700C303BF01F7A :10CEC00000A8EEF80128FEFA02AA700C303BF01F11 :10CED00000A4EEF8010C5808FE90FB613008EF4802 :10CEE000010CFE9FFD1FEEF80128FEFA028A700C6D :10CEF000303B3016F01F009AFE9FFA8F42EC580C20 :10CF0000FE91FBB7EEF8017C5808C061EEF8018095 :10CF10005808FE90FBC342F830091AD8069A1AD96D :10CF20000E9C42F8FEFB0254F01F007B2FEDFE9F8B :10CF3000FB36EEF801805808FE91FB18EEF9012847 :10CF4000720C72B85D18FE9FFB111099303BEEF821 :10CF500001605828C180E2CCFFC31AD9EEC8FFBCDB :10CF6000EEFA012830691AD830181AD930091ADCBB :10CF7000740C7466069A5D162FCDFE9FFC11302B43 :10CF80003209CE6BFACCFF84CE9B5875FE98FEEC2E :10CF9000EAC60008FE9FFE264F98CBDA4F98CBBA20 :10CFA000EDB0000CFE91FAB0EEF800A45808FE9027 :10CFB000FA6B3018406EF00E1900C490406AF20A05 :10CFC0001900FE91FAA1F1D4C003FE91FA5DF6C8F2 :10CFD00000085C88109550785C750A9CF01F00482A :10CFE0001896FE90FA51E2C4FFA11899089AEA0B2C :10CFF0001603EECCFFCCF01F005BC2310A9A0C9BEB :10D00000089CF01F00400C9CF01F003F4078EA098C :10D0100016085C58E369005DE368005E5C59F1E95D :10D020001084FE9FFA711ADA1AD4EEF801284D6ABC :10D03000700C302B3FF6F01F004A2FEDFE9FF9EDEC :10D040000C9C3FF6F01F0030FE9FF9E7FAC6FF8404 :10D05000310AE2CBFFD30C9CF01F002A310AEECB41 :10D06000FFCCFACCFF74F01F00270898E2C9FFA19B :10D070000C9CE06A0100320BF01F003BE339005DBD :10D08000E338005EF1E91084FE9FFA3E0E9CF01F2B :10D09000003FEEFC0104F01F003EFE9FFC480C9A8E :10D0A000069BEEFC0108F01F002BEF4C010CFE91DB :10D0B000FC293015FE9FFC2F5888C0A05908FE910E :10D0C000FE294B48FE9FFE284B38FE9FFE254B381D :10D0D000FE9FFE22401A0C9BE21A02000E9C3016A4 :10D0E000F01F0016FE9FF999435C302AE2CBFFFD4A :10D0F0002FDCF01F0004FE9FFDDC0000800092008A :10D10000800091DC800091E88002575C8002BB08BF :10D110008003E0488002C140800091D08002C19825 :10D120008000917C8002C1E08003E1DC800261D458 :10D130008002B4248002B9308002C2748003E0848B :10D140008003E1788002B354800257CC8002914C76 :10D1500080028FB08003C6288003E19080023A1AD3 :10D160008002D8A080029B4080028F488003E0F0BC :10D170008003E1308003E14C8003E0048003DF089A :10D180008003C8E48003DFC88002B9EC80025770D6 :10D1900080039A748003DF1080039A6CD431204D91 :10D1A0001894F8F80128E8F9016416955909F9B3BB :10D1B0000002F9B301011492700C1A9070991A9B35 :10D1C0005D19C635E8F80128FAC9FFF8300A1AD9FE :10D1D000303B700C70D635F9FAC8FFF05D162FFDA4 :10D1E0001891580CC520E8F80160E06900FE402A5B :10D1F0005828F2081710B4880697E8F800A4ABB7CF :10D200005808C050E0680900E7E810075805E068D2 :10D210000400EFD8E1375802F9B80108EFD8E13738 :10D220004028F3D7C108B09940283006B0A740295C :10D23000B2B64028308AB0C6E8C5FF04402C0A9B2D :10D240002FBCF01F00130A9C308BF01F00124028E7 :10D25000F166005D4029F366005E0E99E219010057 :10D26000FBF81002F9BA014DF1DAE1091AD9404888 :10D2700000991AD8069A1AD1089CE068888EE8CBE3 :10D28000FFDCF01F00052FDD2FCDD832800091DCB0 :10D29000800239EA8002C1E0EBCD40804879720813 :10D2A000201893081897C031F01F00050E9CF01F3E :10D2B0000005E3CD8080000000007AB48002D2F83F :10D2C000800091E8EBCD40C048976E065806C041FB :10D2D000F01F0008C0916E082FF8304C8F08F01F27 :10D2E0000006E3CD80C00C9CE3CD80C000007AB482 :10D2F0008002D30480028F24D401F01F0002D802E0 :10D300008002D996D401F01F0002D8028002D9947D :10D31000D4211789179A17B8F1E9118817A9F1EAEA :10D320001108F1E91088990817CA17D8B168F1EA0D :10D33000118817EA17F91258F1EA10889918F73A84 :10D340000008F739000BF7380009B168F1EA1188D5 :10D35000F73A000A1258F1EA10889928189EF73A0D :10D36000000CF738000DF739000FF8C5FFE4B1687D :10D37000F73C000EF1EA11883007125849B4F1EC7D :10D38000108C49B69D3CC038149C2F05E80707084F :10D390002F0EFCF9FFF0F3E82189EC0C0F88E2185E :10D3A000FF001059EC0C0F98E61800FF1059EC0C18 :10D3B0000FB8F1D8C1081059FCF8FFF4EC0C0FAB12 :10D3C000A96BE61BFF0016599D091059FCF8FFF8E0 :10D3D0009D1910599D29FCF8FFFCF3E8200A8B0ADF :10D3E0002FF758A7CD21D8228003E2F08003E6FC76 :10D3F000EBCD40FE1892F01F002F0493E4CBFF60AA :10D40000E4C4FFFCE4C5FF5CE4C6FFF8E4C7FF58D2 :10D41000E4CEFFF4E4CCFF54E4C1FFB06609760823 :10D4200087089709680A6A0889088B0A6E086C09D8 :10D430008D088F097C0A78089D08990A2F03210B13 :10D440002F0421052F0621072F0E210C023BCE7140 :10D45000E4C4FFF030134985498608972F046E0A0B :10D46000EC0A0F98EA080F9EEC0A0F88EA080F9C56 :10D47000EC0A0FB8EA080F9BEC0A0FA8F809150888 :10D48000FC0A1510F3EC1389F5EE130A1659EA0895 :10D490000F9BF6081518F1EB1288105914590EA9B4 :10D4A0000E34CDE12FF358A3CD91E3CD80FE0000E3 :10D4B0008002D3108003E2FC8003E6FCD431209D7F :10D4C000F736000E505A178A780917B8F1EA118812 :10D4D000179A1258F1EA210817AEF1EE208E506E1D :10D4E000781817CA17F9105917D8F3EA2189F3E801 :10D4F000210917EEF3EE208E507E7828F7390008C8 :10D50000F73A000B105AF7380009F5E9218AF73984 :10D51000000AF5E8210AF5E920827839F73A000C8B :10D52000F738000FFEF7034412581894F1EA2188E7 :10D53000F739000DF8CAFF60F1E92108500AF1E659 :10D5400020800E91E0081618406AEE080326F3DAF0 :10D55000C008F1D2C208EE090329EE080328504999 :10D560005038407AEE0A0F9950296878684B105667 :10D570004068EE000FACEE080FBA4079165AEE097B :10D580000F8BF6081508F1EB1388F8091518105AD7 :10D59000F3EC1289EE020F9C125AF8081510F1EC08 :10D5A0001308F5E82008685E68654079EE090FBB4E :10D5B00050884068EE020F8C1C5BEE080FAEF80836 :10D5C0001508F1EC1388EE000F9A105BFC09151892 :10D5D000F4081510F3EE1289F1EA1308125B407992 :10D5E000F7E82003EE000F8BF6081508F1EB13881F :10D5F000EE020FBCEE090FAE0A5CFC091518105CB8 :10D60000F3EE12894068125CEE080F9B404A4048D6 :10D61000F6091510A968F3EB1309F1EA1388F9E983 :10D620002000105640394038B968F1E912882E04BC :10D63000105640294028B169400AF3E81309EDE982 :10D6400020021434C770E4081618408AF3DAC008C0 :10D65000E208032EE2090326F1D0C208E2030F9983 :10D66000E20803255019E2020FACE2030F8B6809B0 :10D67000F6081508F1EB1388E20A0FBA125AF809F6 :10D680001518105AF3EC1289E2000F9C125AF80890 :10D690001510F1EC1308F5E82008E2030FBB506801 :10D6A00040886819E2000F8AE2080FAC125BF408A8 :10D6B0001508F8091518F1EA1388F3EC1289E2004D :10D6C0000FBAE2020F9C105BF8081510125BF1EC28 :10D6D0001308F7E8200850786829E2030FAC125AC3 :10D6E000F8091518F3EC1289E2020F8BF6081508F9 :10D6F000F1EB1388105A125A4089E2090F9B6839DE :10D70000F6081510F1EB1308125EF5E82002EC099B :10D710001508EA081518F3E61389F1E51288125E78 :10D720004019105EB1694018F3E81309FDE92000C3 :10D73000C0AB4089F1D3C1084CDBFDD9C008F60865 :10D740000706E40A1618EBD0C208F60A0709F60520 :10D750000708F60E070CF9E9118CF3D3C008F9E8B5 :10D76000110C4088B988F608070AF6090708F3D2B1 :10D77000C208F1EA1188F609070AF3D0C108680E59 :10D78000F1EA1108F609070AF1EA10881C58F009B5 :10D790001618405AB4B8B4894059F00A1610A9882E :10D7A000B29AB2A8E6091618F609070AF3D0C0081B :10D7B000F6090708F1EA1188408AF3DAC208F60987 :10D7C000070AF3D2C108F1EA1108F609070A40591D :10D7D000681EF1EA10881C58B2F8F0091618405A71 :10D7E000B4C94059F00A1610A988B2DAB2E8E009C3 :10D7F0001618F609070AF3D2C008F6090708F3D38A :10D80000C208F1EA1188F609070AF1EA1108408A0C :10D81000F3DAC108F609070A4059682EF1EA1088C0 :10D820001C58F368000BF0091618405AF5690008F7 :10D830004059F00A1610A988F36A0009F368000A33 :10D840006839405AF9E6108C125CF8081618F80985 :10D850001610F56C000FF568000CA98CF569000D29 :10D86000F56C000E2F7DD8328003E2FC8003E1F0DE :10D87000EBCD40C01897590BC030E3CF80C0E06CAF :10D8800000B0F01F00061896CF900E9BF01F00040A :10D890000C9CE3CD80C00000800092008002D3F099 :10D8A000D431209D129714961895500B308A0C9BFA :10D8B000FAC2FFE4049CF01F0034ECCBFFF8400AEE :10D8C0000E9CA37AF01F00300A9C310BF01F002F32 :10D8D0001893C57040082018EE08003840095028F9 :10D8E0005C39400A5C59F40A00285019E9D8C0088C :10D8F0003050FAC7FFF4FAC1FFEC40095809E08A3A :10D90000002940251296308A049B0E9CF01F001EB1 :10D91000FB390013E806000812580A9BFB68001345 :10D92000308A029CF01F00180E9A0E9B069CF01F76 :10D930000018308A0E9B049CF01F001320160A9CCE :10D94000308A2085029BF01F00105806FE99FFDDEB :10D95000401A2010E80A0008E9D8C0085BF0CCE1C2 :10D96000069CF01F000C049C3A691988F208180004 :10D97000C0812FFCFAC8FFDC103CCF812F7DD83A44 :10D980002F7DDC3A800091DC8002D8708002D4BC0C :10D99000800091E85EFD5EFCD4311A97202D109E28 :10D9A000129514965809C4911638E0880057F0086B :10D9B0001200C0D0F608094BF0091120FC08094EEE :10D9C000F4090A49F4080946F3EB100BFC0516109C :10D9D000F9DEC010F6050D0AEC0816101499F1EBEB :10D9E0001108B93A103AE088000C20191C08103EC2 :10D9F000E08B0007103AF7B90B01F1DEEB08F00AF3 :10DA0000010BEDD6C010F6050D0AEDEB11061498CA :10DA1000F40C024C0C3CE088000A20181C060C3E5A :10DA2000E08B00050C3CF7B80B01F1E9110B300C51 :10DA3000169A189B2FEDD8321639E08B0051F20C54 :10DA40001200C53114385F8916355F381049F8095E :10DA50001800C450301BC4585808C0513019F2087F :10DA60000D08109EFC081200E08100911C1BFC05B3 :10DA70001610F3DEC010301CF6050D0AEC08161067 :10DA8000F4090243F1EB1108149B1033E088000CF9 :10DA9000201B1C08103EE08B00071033F7BB0B0166 :10DAA000F1DEEB08F0030103EDD6C010E6050D0230 :10DAB000EDE311060498E40902490C39E088000AF4 :10DAC00020181C060C3EE08B00050C39F7B80B0142 :10DAD000F1EB110B169A189B2FEDD832300B169CD8 :10DAE000169A189B2FEDD832F20C0945F80E11202A :10DAF000F00C0943F40E0A46F00E0A48F60E0A4EE0 :10DB00000A48F0011610FC010D04EEE5FFF8F60CD2 :10DB10000949EBD8C010EDE910090896F20E16106D :10DB2000EEF4FFF8EC05024BFDE4110E1C3BE0881F :10DB300000072016100E1C38E088006D161EF3D961 :10DB4000C010FC010D00F3E11109009BE005024E3D :10DB5000123EE0880007201B10091238E0880055AB :10DB6000F7E6110B1C19F60306420639C0935F094C :10DB7000F40C094C043C5F38F3E80008C020201B7B :10DB8000300C169A189B2FEDD832F6080949FC087C :10DB9000094EF0011120FC051610F4010A42F601AD :10DBA0000A411242E2050D00F3DEC010E406161031 :10DBB0000093EDE11106E009024C0C3CE0880007FF :10DBC00020131C060C3EE088002CEC0C0101F7D25F :10DBD000C010E2050D00F7E1110B009CE0090241C5 :10DBE0001631E088000C201C1C0B163EE08B000751 :10DBF0001631F7BC0B01F7DEEB0BF4080946021BEC :10DC0000F9E3110CC3AB123EF3D8EB09F7BB0B01E0 :10DC1000CA8B1C3BF7B60B01FDD8EB0EC90B0C3CB5 :10DC2000F7B30B01EDDEEB06CD1BD703D40130AA11 :10DC3000300BF01F0002D8028002F0ECD4014848FB :10DC4000169A189B700CF01F0003D802000005986C :10DC50008002DC54D421F40B024BF01F00151897FE :10DC6000C230F8FAFFFCE01AFFFC204AE04A002428 :10DC7000E08B00181898593AE088000F300910A975 :10DC800010A959BAE088000910A910A9E04A002497 :10DC9000C03110A910A9300910A991199109C048E3 :10DCA000300BF01F00040E9CD82200008002E2BC62 :10DCB0008002E8BCD421300EF6C80001F60614013B :10DCC000F808002818991897C07870046E050EA4FB :10DCD00091052FFE20480C3ECF95F40B000B1897B2 :10DCE000F6C80001300EF8080028A15BC078700566 :10DCF0006E060EA591062FFE2048163ECF95F4C85D :10DD00000001A15AF808002C3008C078780E720B78 :10DD100012AE990B2FF8204C1438CF95D822D70388 :10DD2000D431205D502C503816971496580C5F0B48 :10DD300058075F0C1295F9EB100B40E33008F00B1D :10DD40001800E081028058095F09580A5F08F3E86B :10DD50000008F6081800E08102764BE4402B6808C2 :10DD60001638E0840270EE08032C580CE080026B39 :10DD70004B9BF01F003AC06168082FF88908E08FBC :10DD8000026268085808C05130184B598908930836 :10DD90005806C14032D90D88F20818005F0232B926 :10DDA000F20818005F08E5E81008C0805802F9B2D0 :10DDB0000101F9B200022FF6C0884AACF01F002A18 :10DDC000F9B20102F9B200004A5870085818C61199 :10DDD0005812C2B049F95822C4A0129872043001F6 :10DDE00032DB32BA7009F2C0FFFFEE09032C580C87 :10DDF000E080023B1989F6091800C0805803E080D2 :10DE00000225F4091800E081022150015014492B29 :10DE1000F01F0012C411EE04002C029B301A2FF4E4 :10DE2000F01F0012E08F022148A87009EE090328B4 :10DE30005808C2F0118A32DBF60A1800C2A0580353 :10DE4000E080020832BBF60A1800E0810203C21823 :10DE500000007AB88003EC008002ECC800007ABCB5 :10DE60008003EC04800326948002DCB47208EE0880 :10DE700003285808C0E0118832D9F2081800C09071 :10DE80005803E08001E032B9F2081800E08101DBBC :10DE90003009500950195805E08000A44BE4680887 :10DEA000302AEE08032C4BDBF01F003DC0D0580396 :10DEB000E08000986808EE080328118932B8F0095C :10DEC0001800E081008F4B7468085818E081008AC0 :10DED0004B187008302AEE08032C4B0BF01F003053 :10DEE000F9B80002E9F80A004AB468084AD1EE0815 :10DEF000032C620833DB100CF01F002B1893C0E1D9 :10DF00006808EE08032CF01F002968096208EE0972 :10DF10000323F80801081803C08868086209EE089E :10DF20000328F8080108121850430A910C933FF493 :10DF300030001096C4784989720849A9EE08032C6C :10DF400072080C9A100CF01F0016C3A1620CF01F8F :10DF500000171836C051069600944043C3C85BF4BE :10DF6000C2E0493870085808C7C062081AD848A8E3 :10DF700070096E08EE090329A564EA04030A1ADA97 :10DF80001AD91AD848B8700848BB702CF01F000B7B :10DF90002FCDC67800007AB88003EC008002E7102D :10DFA00000007ABC8002ECAC8002EDD0000004A43A :10DFB000000005988003EC1480031FE800942FF004 :10DFC0002F01620B580BCB81069640435BF4C031A6 :10DFD0000898C0A8E8081504EA0800087018C048A6 :10DFE0003FF83003109458065F19F3E403F9C03189 :10DFF0003006C5484BE162084BE3EE08032966088A :10E000000C9CF208070BF01F003C1896C2D14BB8CD :10E0100070085808C11062096608EE090329F20861 :10E0200007081AD86E081AD84B5870084B5B702C2A :10E03000F01F00352FED4AF8700B2FFB910B4AC9EA :10E04000720AEE0A032CF80B070C300BF60C1800C2 :10E05000F7BA00FFF3FA0A00F9B90001F1F90A0072 :10E0600033F8109CC818199833A9F2081800C0306A :10E070003008C08819A9F0091800F9B80002F9B8E9 :10E08000010149CA49A97209EE09032974030D8ADD :10E090002FF3F203000349D9930A5818C1505828A6 :10E0A000C0405808C6C0C208078933D8F009180014 :10E0B000F7B300FF4968078A3009F20A1800C10166 :10E0C00030069106C718078933D8F0091800F7B34E :10E0D00000FF30080789F0091800C1B048C8910353 :10E0E0003019484891093006C5F8000000007AB898 :10E0F00000007ABC8002ECAC000004A4000005988B :10E100008003EC5080031FE8000004A000007AC0E8 :10E110004C08402B70082FF81638C2954BE8700851 :10E120005808C1C06E084BD71AD86E084BCB702C5C :10E13000F01F003C2FFD5BF4C0906E08A5644BAB54 :10E14000EA0403091AD9702CC0686E080D894B7B4C :10E150001AD9702CF01F00332FFD4AE933A8720A38 :10E16000109C2FFA930A4B299308C6D84B19EE0836 :10E17000032A3018930A10964AF9C1584AE95BF409 :10E18000C0D1720A2FFA930A4A2B760BEE0B032B9F :10E19000F60A070AF00A1800C03130189308300850 :10E1A0004A49109693085802C1B140094A285809B3 :10E1B0005F19700858185F08F3E80008E4081800B1 :10E1C000C0F04018ECCAFFFFEE08002C400BF01F17 :10E1D000001B40182FF8F006000648E8C0A8496860 :10E1E00070085818C07148B870092FF9F206000677 :10E1F00091065BF4C240403B580BF7F41A00A5644B :10E2000008056A3C6A285808C1E0910C300CC1B876 :10E2100000007AB8000004A4000005988003EC70A8 :10E2200080031FE88003EC948003EC9C000004A0B2 :10E2300000007AC000007ABC8002DCB448C8700CD0 :10E24000C0283FFC2FBDD83291002FF1FE9FFDCC9E :10E25000488B97084888F2CAFFFF3019910A129C30 :10E2600048389109CF0B48489104CECB000004A058 :10E2700000007AC000007AB8D40130091AD9129887 :10E28000F01F00022FFDD8028002DD20D401484893 :10E29000189B700CF01F0003D802000000000598C6 :10E2A0008003217CD4014848189B700CF01F0003A8 :10E2B000D8020000000005988002E2BCD431F6C705 :10E2C000FFF518955967F9B70810F9B80BF8EFD8AA :10E2D000EB2716375F38F1E713F8C05030C899388C :10E2E000E08F01F4F01F0050E04701F7E08B001CC5 :10E2F000EE0316034CD8F003003870361036C061B8 :10E30000ECC8FFF870361036C0C06C18E018FFFC7F :10E310006C3AEC0800090A9C6C289528913AC4785C :10E320002FE3C4D8EE081609C041EE031603C278E5 :10E330005848E08B0006EE0316062C83C2085948A5 :10E34000E08B0005F0C3FFA5C1A8E0480054E08BB6 :10E350000006EE03160C2923C128E0480154E08B87 :10E360000006EE03160F2893C0A8EE031612E0482D :10E370000554E088000437E3C02828434ABAF40370 :10E38000003A7436C1986C19E019FFFCF207010BD2 :10E3900058FBE08A00042013C1186C38580BC0B534 :10E3A0006C2AEC0900090A9C912A95387218A1A8D8 :10E3B0009318CBD810961436CE712FF349BAF4CCFB :10E3C000FFF878261836C6F06C19E019FFFCF20742 :10E3D000010858F8E0890091993C992C5808C055DB :10E3E000EC0900090A9CCE3BE04901FFE08B0013D9 :10E3F000A399F4090038702B8D388D2B9736912610 :10E40000A3497418301BF6090949F1E91009951957 :10E41000C4A8F20816095848E08B000AF20A16064A :10E420002C8AC2488002E8CA0000059C5948E08B4B :10E430000005F0CAFFA5C1A8E0480054E08B000623 :10E44000F20A160C292AC128E0480154E08B000684 :10E45000F20A160F289AC0A8F20A1612E0480554CC :10E46000E088000437EAC028284A4C8BF60A0034BA :10E4700068280838C0E17619A34A301EFC0A094A08 :10E48000F3EA100A1099971AC0A870280838C060DB :10E49000701AE01AFFFC1439CF9370398D398D282A :10E4A00091369326E6081402301B4B84F608094B7C :10E4B0006818103BE08B006EF7E80009C0B1E0136C :10E4C000FFFCA17B2FC3C0382FC3A17BF7E8000955 :10E4D000CFC0E803003E06921C916236C2E86C1A77 :10E4E000E01AFFFCF407010858F8E08A00156C3ABE :10E4F0006C299529933A0E99EC070007A1A9993741 :10E5000099278D19EE0809088F2C8F3CA1A80A9C29 :10E510008F18C0D86C395808C0F5EC0A000A741876 :10E52000A1A80A9C95186C2893289139F01F00180F :10E53000ECCCFFF8D83212960236CD212FF2F1D270 :10E54000C002C0302F81CCAB1C98F3D3C002C08175 :10E550006819F60811FFF3E800088918C078F0C9B7 :10E560000008201370081238CF10A17B6818103BE8 :10E57000E08B0010580BC0D00493C0382FC3A17B90 :10E58000F7E80009CA71CFBB0000059C8002E8CC07 :10E5900068236612E012FFFC0E325F39E4070108BF :10E5A00058F85FAAF5E91009E08000A24C887001D4 :10E5B0004C882F0170080E015BF8C0402811E01153 :10E5C000FF80029B0A9CF01F004418965BFCC6E08B :10E5D000E6020008103CC0320833C6814BFA7409C9 :10E5E000E209000995091036C0A1F5D6C007C0712F :10E5F000E20200026828A1A29112C4C84B5A740B0F :10E600005BFBC0319506C068EC0900094B3A101954 :10E610009509F1D6C003F00911085808F20817103F :10E62000EDD8E1062808EC0100010A9CE3D1C007FF :10E63000F0010101029BF01F00284A885BFCEC0CF2 :10E640001700F9B1000070090C1C8926020C120198 :10E65000A1AC91018D1C0833C1D058F2E08B0005AC :10E6600030188D18C238305920C2E012FFF8E60287 :10E670000008912991196618F1D8C001E5E8100841 :10E68000871858F2E0880007E6CBFFF80A9CF01FD5 :10E6900000144949720A491870081438F3F8BA008E :10E6A0004919720A1438F3F8BA0068287018E0188B :10E6B000FFFC0E385F390E1858F85FAAF5E910090B :10E6C000C1600A9CF01F0009D83A000000007ACC13 :10E6D000000009A88002EBC800007AD08003217CEA :10E6E00000007AC800007AC48002E8CC6826A1A89D :10E6F0000E99A1A98D19EC0700070A9C89278F188C :10E70000F01F0003ECCCFFF8D83200008002E8CC08 :10E71000D4013008C0D8F808070EF6080709201AF7 :10E720002FF8F20E1800C040FC09010CD802580A5C :10E73000CF31149CD802588AC2F5F9EB1009E219BE :10E740000003E0810097E04A0020C3B4F4081402FB :10E75000F0091108FE09002F7669996976599959CF :10E7600076499949763999397629992976199919E5 :10E7700076099909F608002BF8080028E01A00032A :10E78000F40A1104FE0A002F17A9B0A91799B0992D :10E790001789B0895EFCF40A1109FE0A002F17F9E7 :10E7A000B8F917E9B8E917D9B8D917C9B8C917B965 :10E7B000B8B917A9B8A91799B8991789B8895EFC8B :10E7C000EBCD40C01899220AB707B326B707B32686 :10E7D000B707B326B707B326220ACF742F0AC0653E :10E7E000B707B326B707B326210A5C3AFE0A003FF3 :10E7F000D703D703F736000EF366000EF736000D89 :10E80000F366000DF736000CF366000CF736000BCC :10E81000F366000BF736000AF366000AF7360009C4 :10E82000F3660009F7360008F3660008F7360007BC :10E83000F3660007F7360006F3660006F7360005B4 :10E84000F3660005F7360004F3660004F7360003AC :10E85000F3660003F7360002F3660002F7360001A4 :10E86000F3660001F7360000F3660000E3CD80C0D8 :10E87000201AF60A0709F80A0B09CFB15EFCD40189 :10E88000183BC192F60A0009123CC152F80A000B6B :10E890003008C068F208070E201AF6080B0E201880 :10E8A000580ACF91D802F6080709201AF8080B0970 :10E8B0002FF8C0283008580ACF71D8021898C038ED :10E8C00010CB201A580ACFD15EFC5EFC5EFCD70349 :10E8D000D4014848169A189B700CF01F0003D80208 :10E8E000000005988002E8E8D431201D16941892A3 :10E8F000149B5804C051F01F005B1895C5B9500A0D :10E90000F01F0059400BE8C10008F6C6FFF5621C75 :10E910005966F9B60810F9B80BF8EDD8EB2616369B :10E920005F38F1E613F8C05030C830058538C42987 :10E930001890E010FFFC0C30E08401124CB8E200AB :10E94000000970250A39C090721AA1CAF20A000A99 :10E95000741AEDBA0000C220721AE01AFFFCF4002B :10E9600000030A39C131ECC7FFF00E33C195E2064E :10E9700000090C13A1A393139129049C6218089514 :10E98000F1D8C00110468316C1390C33C0957228E6 :10E990000297723993289139CE48300A1499EDBC08 :10E9A0000000E080009D6207E20701076E1CE01C8A :10E9B000FFFC5809C5E0F80000030A39C4811403BC :10E9C000ECC9FFF01233C5556E3A6E299529933A7A :10E9D000EEC5FFF8E0CA0004E04A0024E08B002501 :10E9E0000A99593AE088001A09098B0909098F39EF :10E9F000EEC9FFF059BAE0880011090B930B090921 :10EA00008F59EEC9FFE8E04A0024C071090A930A51 :10EA1000EEC9FFE0090A8F7A090A12AA680A930A66 :10EA2000681A931AC0785008089B0A9CF01F0010BF :10EA30004008EE0600090C13A1A393139129049C2E :10EA40006E18F1D8C00110468F16CB2814030C3372 :10EA5000C10572287239932891396E286E39C0F831 :10EA60008002E2BC8002E8CA0000059C8002E87EC9 :10EA7000F80000030C33C3356E396E2893289139A2 :10EA8000E0CA0004EECCFFF8E04A0024E08B00244A :10EA9000593AE088001A0908990809088F38EECC1D :10EAA000FFF059BAE08800110908990809088F5841 :10EAB000EECCFFE8E04A0024C07109089908EECCCA :10EAC000FFE009088F78090818A8680899086818ED :10EAD0009918C478089BF01F0039C438049CF01FB3 :10EAE00000381895C3A06218F8C90008A1C8E20848 :10EAF00000081039C07172130297E013FFFC000385 :10EB0000C308E0CA0004E04A0024E08B0020089912 :10EB10001898593AE0880014130B10AB130B10AB84 :10EB200059BAE088000D130B10AB130B10ABE04A81 :10EB30000024C051130A10AA130A10AA130A10AA1B :10EB4000720A910A72199119C048089BF01F001BA4 :10EB5000089B049CF01F001B049CC2A80093029712 :10EB6000E60601096E1858F9E0880016F1D8C001D0 :10EB7000EDE810088F181298A1A8EE06000BF60910 :10EB8000000997187218A1A82F8B9318049CF01FE6 :10EB9000000DC0B8F1D8C001E7E810088F18EE03E7 :10EBA00000036618A1A88718049CEEC5FFF8F01FA3 :10EBB00000060A9C2FFDD8328002E87E8002E2BC6B :10EBC0008003217C8002E8CCD42130081897487655 :10EBD000169C8D08F01F00065BFCC0516C0858089D :10EBE000EFF81A03D822000000008CC48002F1E87C :10EBF0005EFDD703D421217DE06802041697BA6830 :10EC0000504C500CF01F000B3008512850D848A829 :10EC100050983FF8BA784898505C501CFAC9FF9059 :10EC20000E9A700C1A9BF01F00062E9DD822000031 :10EC30008002EDD08002EBF00000059880030C4CC0 :10EC4000D421217D4988FAC9FF9016977006580B88 :10EC5000C064E068008B3FFC8D38C228580BF60872 :10EC600017005807F9BB01FFEFDBE10850585028A7 :10EC7000E0680208BA683FF8504C500CBA781A9B0A :10EC80000C9CF01F000A5BFCC044E068008B8D38D0 :10EC90005807F9B90100FBF81000F1F91E002E9D8C :10ECA000D8220000000005988002F5685C5BC0284F :10ECB0002FFC19885808C050F6081800CFA15EFC38 :10ECC000580B5E0C5E1DD703F9EB100AE21A000325 :10ECD000C341780A76095CEAC170123AC151781AC8 :10ECE00076195CEAC110123AC0F1782A76295CEAFA :10ECF000C0B0123AC091783A76395CEAC0502F0C15 :10ED00002F0B123ACE70F9DAC308F7D9C3085E0C9C :10ED1000161C5E1CF9DAC208F7D9C2085E0C161C74 :10ED20005E1CF9DAC108F7D9C1085E0C161C5E1C1E :10ED30005C5A5C59121A5EFA178A1989580A5E09D8 :10ED400014195E19179A1999580A5E0914195E194F :10ED500017AA19A9580A5E0914195E1917BA19B920 :10ED6000580A5E0914195E192FCB2FCCCE6B000008 :10ED70003008F6080709F8080B092FF85809CFA141 :10ED80005EFCD703D4014848189B700CF01F0003A9 :10ED9000D8020000000005988002ED9CD42118974D :10EDA0001696169CF01F0008F8C5FFFF0E9C0A9BE4 :10EDB000F01F00061897C0500A9A0C9BF01F000421 :10EDC0000E9CD8228002EDD08002E2BC8002E736A1 :10EDD00030091898C0282FF8118AF20A1800CFC1FC :10EDE000F00C010C5EFC580AC0815EFA580AC0B0F3 :10EDF0005808C0902FFC2FFB201A19881789F0099A :10EE00001800CF50198C1788101C5EFC3008103A7F :10EE10005E0CF6080709F8080B092FF85809CF818E :10EE2000103A5E0CF8080B092FF8CFBBD401484804 :10EE3000169A189B700CF01F0003D802000005986A :10EE40008002EE44D421300816951696C0282FF67D :10EE5000580AC060201A0D89F0091800CF910A16CF :10EE6000ECCBFFFFF01F00071897C0800A9B0C9A9D :10EE7000F01F00053008EE060B080E9CD82200009B :10EE80008002E2BC8002E736D42118981696580B0F :10EE9000C0C03007C0481897F8C8FFFF109C0C9BF3 :10EEA000F01F0005CF91C048F01F000318970E9C7B :10EEB000D82200008002ECACD421201D4A351897DE :10EEC0006A04E8F600E85806C351500B350CF01FF1 :10EED00000206A08E94C00E8F0F900E89326930660 :10EEE0009316F0F900E893469336F0F900E893663C :10EEF0009356F0F900E893B693A6F0F900E893D69C :10EF000093C6F0F900E893F693E6F0F900E8F346CB :10EF10000044F3460040F0F900E8F346004CF346A5 :10EF20000048F0F900E8F366001CF0F800E8400B38 :10EF30009196486870080E9CF0FA00E83019F01FAE :10EF400000052FFDD8220000000005988002E2A4F1 :10EF50008002EF54D421580CC041740C580CC2905C :10EF600018981697113EC0A80C3EC0815809C030B1 :10EF7000109CCF7B9508B889D8220F365806CF5100 :10EF8000580EC051950E1C9CD822129810991697B5 :10EF9000133E0F361C36C0A1580EFC091700F9BBF2 :10EFA0000100F1FB1E009509D8225806CF31CEEBA7 :10EFB000D822D703D431203D4CC8502C700116986C :10EFC000113EE20E0706E2160008CFB1E04E002D1A :10EFD000C041113E3016C058E04E002BC021113EFA :10EFE00058095F0C59095F053007F9E51005EE0572 :10EFF0001800C1E0E04E0030C131118535843783FF :10F00000E80518005F04E60518005F05E9E510054E :10F01000EE051800C050119E31092FE8C098580C19 :10F02000C070E04E0030F9B90008F9B9010AE06C8F :10F03000FFFFEA1C7FFF3007FC1580000E930E36A1 :10F04000F80517000E9CEA090D0408925005E20E1F :10F050000704E1D4C001F9B00137F9B000575010EE :10F06000FCC500300890E2100004C0814010E9D4D3 :10F07000C002FC0001055804C1C01235C1A4043C03 :10F080005FBEFDE713FEE60E1800C101043C5F0EF3 :10F0900040070E355F97EFEE000EE60E1800C061D8 :10F0A000B33C3017EA0C000CC0283FF7113ECD0BE3 :10F0B0005BF7C0E1E069FFFFEA197FFFFC1C8000FD :10F0C00040205806F20C170032298139C0485806F2 :10F0D000FBBC0100580AC0705807F9B901FFF1D90B :10F0E000E10B950B2FDDD8320000049CD401485869 :10F0F0001499169A189B700CF01F0003D802000098 :10F10000000005988002EFB43028D6733FFC358BA1 :10F11000580C5E4C482A950B5EFC000000008CC425 :10F120003058D6733FFC358B580C5E4C482A950BF3 :10F130005EFC000000008CC43038D6733FFC358B79 :10F14000580C5E4C482A950B5EFC000000008CC4F5 :10F150003048D6733FFC358B580C5E4C482A950BD3 :10F160005EFC000000008CC430B8D6733FFC358BC9 :10F17000580C5E4C482A950B5EFC000000008CC4C5 :10F180003098D6733FFC358B580C5E4C482A950B53 :10F190005EFC000000008CC4D421210D16971A9B40 :10F1A000F01F0011C0343FFCC1C84008AE08401831 :10F1B000AE1840288F184038AE484048AE584058E6 :10F1C000AE684068AE7840888F4840A88FB840C885 :10F1D0008FC840D88F5840E8300C8F7840F88F980F :10F1E0002F0DD8228002F180D40148C87009580937 :10F1F000C03148B99109489948AA7208F00C000C2E :10F20000143CE08B0004930CC068F01F000730C86A :10F2100099083FF8109CD80200007AF800008CC8CA :10F220000000F00080031D20D431208DFAC4FFBC03 :10F23000504B682E505812967C0B7005506E580B30 :10F24000F40B17006803681140493008C2C92FFB4E :10F25000325C178AF80A18005F1EF00A18005F1C5B :10F26000FDEC000CF00C1800CF31580AE0800129A9 :10F27000300C3FFA1890503A18941892F80C003C51 :10F280001697507C4CDC0F3AF80A070E407C1C0C99 :10F290004CBEFC0C070E201E500E4CAEFC0C070C96 :10F2A000507C400C587CE08B00F84C7EFC0C032F0B :10F2B000368BF60A1800E08000F0371BF60A1800BB :10F2C000C07034CBF60A1800C051A3B4CE58A5B410 :10F2D000CE380F8B36CAF40B1800C051A5B4EECB54 :10F2E000FFFFCDB8A5A4CD88EBD5C005367CF80AC4 :10F2F0001800E08B0027365BF60A1800C48234FB46 :10F30000F60A1800C480E08B000C345BF60A180083 :10F31000C3E0347BF60A1800C3A0344BC088358B99 :10F32000F60A1800C2C0E08B0007355BF60A180029 :10F33000C351C318363BF60A1800C2F0364BC0E87A :10F34000370BF60A1800C250E08B000D36EBF60AB8 :10F350001800C1F0E08B0014369BF60A1800C1E1DA :10F36000C0E8375BF60A1800C0A0378BF60A180011 :10F37000C060373BF60A1800C111C0B8EDB40004F4 :10F38000C0A0EDB40005C0913020C0883040C068F6 :10F390003030C0483010C0283000403B5BFBC040DC :10F3A000E20B0920C7985860E08B00776C0AEACC22 :10F3B000FFFF486EFC00032F8003EE088003ED641E :10F3C0008003ECF88003ECAC8003ECCCF4CBFFF8CA :10F3D0008D0BF4EA0000E605083AC0F8F4CBFFFC18 :10F3E0008D0B740AE605093AC088F4CBFFF88D0B43 :10F3F000F4EA0000E605083A0E9B1895C4E8620A94 :10F400005BFAC0B150195028E06A0080300B029CB2 :10F41000F01F004D40284019E4CC00010E9B503CE9 :10F42000F20C0C49C3A8620A5BFAC0B1501950280B :10F43000E06A0080300B029CF01F00434028401916 :10F440002012300A0E9BE202092AF2020C49C2582D :10F4500016976C0AF4CBFFFC8D0B740A0E9BE60525 :10F46000093A2FF5C1A8F4C20030C068E4020022B6 :10F470002FF7F40200120F8A580AC0E0230A589AA4 :10F48000FE98FFF6C0982FF70F8A580AC050230A3B :10F49000589AFE98FFFA0E9B407C30BAF40C180084 :10F4A000FE91FEEE4042178C0A325F4AF00C1800C3 :10F4B0005F1CF9EA000AF00A1800FE91FECB300842 :10F4C000404E178AE2050021F00A1800FC091710C7 :10F4D000E6050038069EC2A8620A583AC1E0E089F3 :10F4E0000007581AC1A0582AC181C058585AC0C034 :10F4F000C0B5C1386C0AF4CCFFF88D0CF4E2000002 :10F50000F0E30000C1086C0AF4CCFFF88D0CF4E2C3 :10F510000000F0E30000C0786C0AF4CCFFFC8D0C16 :10F52000740A910A2FF52F882FC11235FE9AFFD643 :10F530001C934052406E85059D0B404BE60B003CF2 :10F540002F8DD8328002E8BCD42114977428580833 :10F55000C0419518109CD822F01F000330088F1866 :10F560008F28D82280032320D431FACD068850A9D1 :10F57000169014971893580CC06078685808C031DA :10F58000F01F004E4CE81030C0316600C0A84CD8C7 :10F590001030C0316610C0584CB81030E7F000028F :10F5A0008068EDB80003C04160485808C071009BF6 :10F5B000069CF01F0046E0810B4080681099E2191C :10F5C000001A58A9C3D18079300AF4091900C385FB :10F5D000A1D8FB5805B86088FB4805CC60A8FB485B :10F5E00005D4FAC8FFD4FB4805BCFB4805ACE0686D :10F5F0000400FB4805C0FB4805B43008FB5905BAB8 :10F600000E9A40A9FAC7FA54FB4805C4069C0E9B03 :10F61000F01F002F506CC0950E9B069CF01F002D14 :10F62000406EF9BE01FF506EFB0805B8EDB800064C :10F63000E0810B058068A7A8A068E08F0B00300868 :10F64000FAC4F9F85098FB480678409CFB480674C9 :10F65000FB48067CFB48068050573FF8FB44067089 :10F66000FB48052C506C1896069150204055C02838 :10F670002FF50B88300B325AF60818005F19F40882 :10F6800018005F181268F6081800CF314059EA09CF :10F690000107C2E0FAF806780E088909FB480678E7 :10F6A0008917FAF806742FF8FB4806745878E08931 :10F6B00000132F84C1A8000080031F388003EF2CA3 :10F6C0008003EF4C8003EF6C80031C388002F568E8 :10F6D00080031D2CFACAF990402B029CF01F00A158 :10F6E000E0810AA6FAC4F9F840680E0850680B8851 :10F6F0003007EE081800E0800A8AEAC2FFFF3003F4 :10F700005052FB6706873FFE50745043503E0690B0 :10F71000508506920C944057C0683FFC0A97503CB5 :10F72000C02830000F38C0281292E0480063E08003 :10F7300001CCE0890045E0480039E0890026E04836 :10F740000031E0840198E048002BE0800101E0896D :10F75000000FE0480023E080008EE048002AE080AF :10F76000008CE0480020E0810897C7B8E048002EF0 :10F77000E08000F1E0480030E080017BE048002DAF :10F78000E081088ACE28505750420897408540743F :10F790001092E048004FE0800439E0890008E0481A :10F7A0000044E081087DE08F01DEE0480055E08004 :10F7B00005DFE0480058E0810873C428E048006F86 :10F7C000C430E089001FE0480069C450E089000AA5 :10F7D000E0480064C400E0480068E081085DC63984 :10F7E000E048006CE0800163505750420897408524 :10F7F00040741092E048006EE0810852E08F02ED04 :10F80000E0480073E0800553E089000BE048007099 :10F81000E08004F9E0480071E081083EC5295057B6 :10F8200050420897408540741092E0480075E0808F :10F8300005A0E0480078E0810833E08F06964CABE5 :10F84000509BE08F06945057408508975042407473 :10F85000E08F03DD50574085089750424074C83907 :10F86000FB380687300AF4081800FE91FF5D320865 :10F87000C6E8A1A3C58B0F89F2C800305898E08B69 :10F88000001EEEC8FFFF300B2309F60B002BF20B16 :10F89000001B1139F2CA0030589AFE98FFF7E04970 :10F8A0000024FE91FF40E04B0020E08909C1201BAD :10F8B000FAF90680123BC095C108FAF90680ECCA35 :10F8C000FFFF1236C1F5C268FAC9F9781097F20B3A :10F8D000003BF6F2FDA4C358FAC7F9841AD7109773 :10F8E000FAC2FAD01AD2FAC8FBCC029C1AD8FAC8CB :10F8F000F974FAC9FFCC40BAF01F001C2FDD780262 :10F90000C208FACEF9781496FC040038F0F2FDA48F :10F91000C18840A859F9E0890011F0CBFFFC50AB39 :10F920007002FACCF978F8090038F142FDA42FF9F9 :10F930001496FB490680C058700214962FC850A830 :10F940005802FE94FEF15C32A3A3CEDAFB68068770 :10F95000CEAA0F38E048002AC0A03009C7D800005E :10F960008002F5488003EDD08002F2280F88F0C9AC :10F9700000305899E08B001EEEC5FFFF300B2308C6 :10F98000F60B002BF00B001B0B38F0C90030589918 :10F99000FE98FFF7E0480024FE91FEC5E04B0020F2 :10F9A000E0890946201BFAF80680103BC095C10883 :10F9B000FAF90680ECCAFFFF1236C1F5C288FACA0E :10F9C000F978F40B003BF6FBFDA4503BC3C8FAC921 :10F9D000F9841AD9FAC8FAD01AD8FAC8FBCC029C12 :10F9E0001AD8FAC8F974FAC9FFCC40BAF01F027AE3 :10F9F0002FDD780C503CC278FACEF9780E95FC04D5 :10FA000000381496F0F8FDA45038C1D840A859F930 :10FA1000E0890014F0CBFFFC700850AB5038FACCF2 :10FA2000F978403BF8090038F14BFDA42FF90E9509 :10FA3000FB4906801496C07870090E952FC850397E :10FA4000149650A840385808FE95FE690A97C6BA21 :10FA5000F40B00190F38F209002BF0CA0030589A45 :10FA6000FE98FFF83FFEF20E0C495039C5FAA7B3D5 :10FA7000C5AA30092308F2090029F00900190F3836 :10FA8000F0CA0030589AFE98FFF7E0480024FE9133 :10FA9000FE4DE0490020E08908CBF2C4000130109F :10FAA000FE9FFE42A7A3FE9FFE3F0F89F0091800AC :10FAB000C0512FF7A5B3FE9FFE37A5A3FE9FFE34CE :10FAC000A5B3FE9FFE3150575042089740854074C1 :10FAD0000C99FAF806805800C1D01037C064FACCEF :10FAE000F978F8070037C1D8FAC8F9841AD8FAC8E3 :10FAF000FAD01AD8FAC8FBCC1AD8FAC8F974FAC9DD :10FB0000FFCC0A9A0E9B029CF01F02332FDD19B81E :10FB1000C2282FF61039C084FACBF978F6070037DF :10FB2000EF38FDA7C18840A959F8E0890012F2CA50 :10FB3000FFFC50AA7209FAC2F978E408003A2FF8DB :10FB4000F549FDA4FB480680F1D9C008C04813B8A8 :10FB50002FC950A9300EFB680648FB6E0687E08F60 :10FB600006A7A5A30C92EDB30005C4D1FAF8068050 :10FB70005800C1E01037C064FACCF978F8070037B4 :10FB8000C1F8FAC8F9841AD8FAC8FAD00A9A1AD869 :10FB9000FAC8FBCC1AD8FAC9FFCCFAC8F9740E9B84 :10FBA000029CF01F020D2FDD781A7809C288ECC282 :10FBB000FFFF1036C0A4FACBF978F6070037EEFA4B :10FBC000FDA8EEF9FDA4C1B840A959F8E0890013D9 :10FBD000F2CAFFF850AAFAC6F978721AEC08003B8C :10FBE0007209F74AFDA8F749FDA42FF8FB480680E3 :10FBF000C068F2C8FFF8721A50A87209049650093A :10FC0000501ACD58EDB30004C441FAF806805800EC :10FC1000C1D01037C064FACEF978FC070037C1E8CC :10FC2000FAC8F9841AD8FAC8FAD00A9A1AD8FAC8BF :10FC3000FBCC0E9B1AD8029CFAC8F974FAC9FFCC07 :10FC4000F01F01E52FDD780AC218ECC2FFFF103665 :10FC5000C084FACCF978F8070037EEFAFDA4C16841 :10FC600040A959F8E0890010F2CAFFFC50AAFACB6B :10FC7000F978720AF6080039F34AFDA42FF8FB4818 :10FC80000680C048720A2FC950A90496501AC8D8D5 :10FC9000EDB30006C481FAF806805800C1D01037D1 :10FCA000C064FAC8F978F0070037C1E8FAC8F984E7 :10FCB0001AD8FAC8FAD01AD8FAC8FBCC1AD8FAC897 :10FCC000F974FAC9FFCC0A9A0E9B029CF01F01C27C :10FCD0002FDD9818C238ECC2FFFF1036C084FAC678 :10FCE000F978EC070037EF08FDA6C18840A959F85C :10FCF000E0890012F2CAFFFC50AA7209FACEF97824 :10FD0000FC08003A2FF8F549FDA4FB480680F1D91C :10FD1000B010C04892182FC950A950180496BF5867 :10FD20005008C458FAF806805800C1D01037C06493 :10FD3000FACBF978F6070037C1E8FAC8F9841AD87F :10FD4000FAC8FAD00A9A1AD8FAC8FBCC0E9B1AD86D :10FD5000029CFAC8F974FAC9FFCCF01F019F2FDD8D :10FD6000780AC218ECC2FFFF1036C084FACAF978CC :10FD7000F4070037EEFAFDA4C16840A959F8E089FC :10FD80000010F2CAFFFC50AAFAC6F978720AEC0811 :10FD90000039F34AFDA42FF8FB480680C048720AD8 :10FDA0002FC950A90496501ABF5A500AFAEA000007 :10FDB000580A5C2BC0E43008FAEA00003009F00A67 :10FDC000010AF20B014B32D8FAEB0000FB68068700 :10FDD0003010E08F04E30C99EDB30005C471FAF81C :10FDE00006805800C1D01037C064FACAF978F40709 :10FDF0000037C1D8FAC8F9841AD8FAC8FAD00A9AD2 :10FE00001AD8FAC8FBCC0E9B1AD8029CFAC8F9740F :10FE1000FAC9FFCCF01F01702FDD780AC2082FF657 :10FE20001039C084FAC9F978F2070037EEFAFDA458 :10FE3000C16840A959F8E0890010F2CAFFFC50AA35 :10FE4000FAC3F978720AE6080039F34AFDA42FF8DC :10FE5000FB480680C048720A2FC950A94062049826 :10FE60009512BF589508FE9FFC03EDB30004C441F2 :10FE7000FAF806805800C1D01037C064FACEF9787D :10FE8000FC070037C1D8FAC8F9841AD8FAC8FAD0E2 :10FE90000A9A1AD8FAC8FBCC0E9B1AD8029CFAC848 :10FEA000F974FAC9FFCCF01F014C2FDD780AC208A3 :10FEB0002FF61039C084FACCF978F8070037EEFA3B :10FEC000FDA4C16840A959F8E0890010F2CAFFFCFE :10FED00050AAFACBF978720AF6080039F34AFDA461 :10FEE0002FF8FB480680C048720A2FC950A9406904 :10FEF0009509FE9FFBBDE2130040C440FAF806805E :10FF00005800C1D01037C064FAC8F978F00700373C :10FF1000C1D8FAC8F9841AD8FAC8FAD00A9A1AD8F5 :10FF2000FAC8FBCC0E9B1AD8029CFAC8F974FAC91D :10FF3000FFCCF01F01292FDD780AC2082FF61039F7 :10FF4000C084FAC3F978E6070037EEFAFDA4C16869 :10FF500040A959F8E0890010F2CAFFFC50AAFAC281 :10FF6000F978720AE4080039F34AFDA42FF8FB4837 :10FF70000680C048720A2FC950A9406EB40EFE9F79 :10FF8000FB77FAF806805800C1D01037C064FACC6D :10FF9000F978F8070037C1D8FAC8F9841AD8FAC82E :10FFA000FAD00A9A1AD8FAC8FBCC0E9B1AD8029C2F :10FFB000FAC8F974FAC9FFCCF01F01072FDD780ADF :10FFC000C2082FF61039C084FACBF978F60700374B :10FFD000EEFAFDA4C16840A959F8E0890010F2CA00 :10FFE000FFFC50AAFAC3F978720AE6080039F34A0E :10FFF000FDA42FF8FB480680C048720A2FC950A9FB :02000004800377 :1000000040629502FE9FFB34A5A30C99EDB3000559 :10001000C571FAF806805800C2601037C0A4FACE45 :10002000F978FC070037EEEAFDA4FAEB0000C1887E :10003000FAC8F9841AD8FAC8FAD01AD8FAC8FBCC88 :100040001AD8FAC8F974FAC9FFCC0A9A0E9B029C16 :10005000F01F00E12FDDF8E80000FAE900003000B1 :10006000E08F03992FF61039C0B4FAC8F978F00779 :100070000037EEEAFDA4FAEB0000E08F038C40A904 :1000800059F8E0890016F2CAFFF850AAF2EA000017 :10009000FAEB0000FACAF978F4080039FAEA00002D :1000A000F2EBFDA42FF8FB480680E08F0374F2EA20 :1000B00000002F89FAEB000050A9E08F036CEDB32C :1000C0000004C141FAF806805800C0801037C60409 :1000D000FACAF978F4070037C7782FF61039C774D1 :1000E000FAC9F978F2070037C6F8EDB30006C45133 :1000F000FAF806805800C1D01037C064FACCF978FD :10010000F8070037C1D8FAC8F9841AD8FAC8FAD063 :100110001AD8FAC8FBCC1AD8FAC8F974FAC9FFCCB5 :100120000A9A0E9B029CF01F00AC2FDD9818C22883 :100130002FF61039C084FACBF978F6070037EF08AC :10014000FDA6C18840A959F8E0890012F2CAFFFC57 :1001500050AA7209FAC2F978E408003A2FF8F54972 :10016000FDA4FB480680F1D9B010C04892182FC9F1 :1001700050A95C785018C418FAF806805800C1D00D :100180001037C064FACCF978F8070037C1D8FAC83C :10019000F9841AD8FAC8FAD00A9A1AD8FAC8FBCC45 :1001A0000E9B1AD8029CFAC8F974FAC9FFCCF01F4A :1001B000008A2FDD780AC2082FF61039C084FACBE6 :1001C000F978F6070037EEFAFDA4C16840A959F89E :1001D000E0890010F2CAFFFC50AAFAC2F978720A4C :1001E000E4080039F34AFDA42FF8FB480680C04814 :1001F000720A2FC950A9501A300E500E1C90E08F71 :1002000002CA505750420897408540740C99FAF83A :1002100006805800C1D01037C064FACCF978F807CE :100220000037C1D8FAC8F9841AD8FAC8FAD01AD84F :10023000FAC8FBCC1AD8FAC9FFCCFAC8F9740A9AE2 :100240000E9B029CF01F00642FDD7809C2182FF668 :100250001039C084FACBF978F6070037EEF9FDA41F :10026000C17840A959F8E0890010F2CAFFFC50AAF1 :10027000FAC2F9787209E408003AF549FDA42FF8AA :10028000FB480680C058F2C8FFFC50A8720933082A :10029000300EFB6806844D1C37885019A1B3FB68EB :1002A0000685500E509CE08F02755057300B50421F :1002B000FB6B06870897408540740C99FAF8068016 :1002C0005800C1D01037C064FACAF978F407003773 :1002D000C1D8FAC8F9841AD8FAC8FAD01AD8FAC814 :1002E000FBCC0E9B1AD80A9AFAC8F974FAC9FFCC4B :1002F000029CF01F00392FDD7807C2082FF6103955 :10030000C084FAC9F978F2070037EEF7FDA4C16896 :1003100040A959F8E0890010F2CAFFFC50AA720700 :10032000FAC2F978E4080039F347FDA42FF8FB4836 :100330000680C04872072FC950A9403E580EC1051B :100340001C9A300B0E9CF01F0026E08002B6F807C6 :100350000105403C1835E08902B0E08F02AF0E9CE9 :100360003000F01F00201895E08F02A9A5A30C997A :10037000EDB30005C581FAF806805800C2001037B9 :10038000C064FACBF978F6070037C208FAC8F984D6 :100390001AD8FAC8FAD00A9A1AD80E9BFAC8FBCC17 :1003A000029C1AD8FAC8F974FAC9FFCCF01F000AE7 :1003B0002FDDF8EA0000FAEB0000C3282FF6103911 :1003C000C124FACAF978F4070037EEE8FDA4FAE987 :1003D0000000C2688002F2288003EDE4800328A4B4 :1003E0008002EDD040A959F8E0890015F2CAFFF863 :1003F00050AAF2EA0000FAEB0000FACAF978F40811 :100400000039FAEA0000F2EBFDA42FF8FB48068061 :10041000C078F2EA00002F89FAEB000050A93010F2 :10042000E08F01B9EDB30004C141FAF8068058002D :10043000C0801037C604FACAF978F4070037C778C5 :100440002FF61039C774FAC9F978F2070037C6F8E1 :10045000EDB30006C451FAF806805800C1D0103739 :10046000C064FACCF978F8070037C1D8FAC8F98423 :100470001AD8FAC8FAD01AD8FAC8FBCC1AD8FAC8CF :10048000F974FAC9FFCC0A9A0E9B029CF01F0086F1 :100490002FDD9818C2282FF61039C084FACBF978CE :1004A000F6070037EF08FDA6C18840A959F8E08992 :1004B0000012F2CAFFFC50AA7209FAC2F978E408E5 :1004C000003A2FF8F549FDA4FB480680F1D9B01099 :1004D000C04892182FC950A95C785018C418FAF86F :1004E00006805800C1D01037C064FACCF978F807FC :1004F0000037C1D8FAC8F9841AD8FAC8FAD00A9ACB :100500001AD8FAC8FBCC0E9B1AD8029CFAC8F97408 :10051000FAC9FFCCF01F00642FDD780AC2082FF65D :100520001039C084FACBF978F6070037EEFAFDA44B :10053000C16840A959F8E0890010F2CAFFFC50AA2E :10054000FAC2F978720AE4080039F34AFDA42FF8D8 :10055000FB480680C048720A2FC950A9501A300EB5 :100560003010500EC1794D1C509CEDB30005C541B3 :10057000FAF806805800C2201037C0A4FACBF978E8 :10058000F6070037EEE8FDA4FAE90000CF28FAC824 :10059000F9841AD8FAC8FAD00A9A1AD80E9BFAC85F :1005A000FBCC029C1AD8FAC8F974FAC9FFCCF01F28 :1005B000003E2FDDF8EA0000C0C8ECCAFFFF10368D :1005C000C0B4FAC9F9781496F2070037EEEAFDA430 :1005D000FAEB0000CCE840A959F8E0890016F2E6F1 :1005E0000000F2CBFFF8FAE7000050ABFAC6F9784A :1005F000EC080039FAE60000F2E7FDA42FF81496A3 :10060000FB480680CB68F2E600002F89FAE700007D :1006100050A91496CAE8EDB30004C161FAF8068047 :100620005800C0801037C6A4FACEF978FC0700370E :10063000C838ECCAFFFF1036E0840082FACCF978A3 :10064000F8070037C788EDB30006C4D1FAF8068072 :100650005800C1D01037C064FACCF978F8070037D9 :10066000C1F8FAC8F9841AD8FAC8FAD01AD8FAC860 :10067000FBCC1AD8FAC8F974FAC9FFCC0A9A0E9BB7 :10068000029CF01F00092FDD9818C2A8ECCAFFFFDA :100690001036C0D4FACBF9781496F6070037EF0875 :1006A000FDA6C1E88002F2288003EDE440A959F8D4 :1006B000E0890013F2CBFFFC50AB7209FAC6F9785F :1006C000EC08003B2FF8F749FDA4FB480680149680 :1006D000F1D9B010C058921814962FC950A95C785F :1006E0005018C458FAF806805800C1D01037C064BA :1006F000FACCF978F8070037C1F8FAC8F9841AD8A3 :10070000FAC8FAD00E9B1AD8FAC8FBCC0A9A1AD8A3 :10071000029CFAC8F974FAC9FFCCF01F00C42FDD9F :10072000780BC248ECCAFFFF1036C094FACBF978B8 :10073000F60700371496EEFBFDA4C18840A959F8CE :10074000E0890011F2CBFFFC50ABFAC6F978720BCE :10075000EC080039F34BFDA42FF81496FB480680F3 :10076000C058720B14962FC950A9501B300E500E52 :100770004008401C300B18485F18E7E80008F608EE :100780001800C0703308FB620685A1B3FB680684BD :100790003020300AFB6A068740395809C025A7D3A4 :1007A0004038401758085F194008FAC5F9900E48BC :1007B00030025F18F3E81008E4081800C5E03018AC :1007C000F0001800C0603028F0001800C051C3E8E5 :1007D0000A970690C2C80A97FAE80000F5D8C00345 :1007E0002D0A0EFAF00B1603F20C1603F7E911DBD3 :1007F0001899169858085C29CF21FAE90000EDB342 :100800000000C4613309F20A1800C4200EF9C408BC :10081000F01F008730A82D0A3009AE8AFAEA0000DE :10082000F01F008416991498FAE90000EECC00013C :1008300030A83009FAEA00001897589A5C2BFE9B02 :10084000FFE91BF800932D08C2080A97FAE8000098 :10085000F5D8C004409EFC0A070A0EFAF20B1604F3 :10086000F00A1604F5E911CA1699149858085C297B :10087000CF01FAE90000C0C85800C091EDB30000F4 :10088000C061FAC7F9913308AE88C0280A970E15DF :100890004030C14850425057407410925802E08096 :1008A00001B6300CFB620648FB6C06873015300041 :1008B000FAC7F9B8C03840353000069A0699E21AEE :1008C0000002E2190084508A5079EA000C42FB3899 :1008D0000687300BF6081800F7B201FF580AF7B286 :1008E00001FE5809C4514048041850385808E0899E :1008F000001DC3E8FB4C06784CFE310C890E891CA8 :10090000FB4B0674587BE08900042F84C0B8FACAF8 :10091000F990402B029CF01F0049E0810189FAC444 :10092000F9F8403B210B503BFAF90678FAF80674C7 :10093000F2CCFFF0F0CBFFFF4BFA403E590EFE9990 :10094000FFDB1C09890AFB490678891EFB4B0674EC :10095000587BE08900042F84C0B8FACAF990402B74 :10096000029CF01F0036E0810163FAC4F9F8FB38FD :100970000687300CF8081800C1F0FAF80678FAC9B2 :10098000F9792FF88909FB4806783019FAF80674C6 :1009900089192FF8FB4806745878E08900042F84E1 :1009A000C0B8FACAF990402B029CF01F0024E081E5 :1009B000013FFAC4F9F8408B580BC1F0FAF80678F9 :1009C000FAC9F97C2FE88909FB4806783029FAF83A :1009D000067489192FF8FB4806745878E0890004DA :1009E0002F84C0B8FACAF990402B029CF01F001364 :1009F000E081011EFAC4F9F8407AE04A0080C5118E :100A00004049041950395809E0890029C4A848C848 :100A1000310EFB4C06788908891EFB4B0674587B07 :100A2000E08900102F84C1788002F228800373408F :100A30008002D9988003EDF88002F5488003ECE845 :100A4000FACAF990402B029CF01F0052E08100F09E :100A5000FAC4F9F8403C210C503CFAF90678FAF84F :100A60000674F2CCFFF0F0CBFFFF4CBA403E590EBB :100A7000FE99FFCF1C09890AFB490678891EFB4BAA :100A80000674587BE08900042F84C0B8FACAF99034 :100A9000402B029CF01F003FE08100CAFAC4F9F825 :100AA0000A105800E089001BC3B8FB4C0678310AD5 :100AB0004B9C891A890CFB4B0674587BE089000417 :100AC0002F84C0B8FACAF990402B029CF01F003165 :100AD000E08100AEFAC4F9F82100FAF90678FAF8D4 :100AE0000674F2CCFFF0F0CBFFFF4ABA5900FE9932 :100AF000FFDE0009890AFB4906788910FB4B067462 :100B0000587BE08900042F84C0B8FACAF990402BC2 :100B1000029CF01F0020E081008BFAC4F9F8FAF87B :100B2000067889158907F0050005FAF80674FB4573 :100B300006782FF8FB4806745878E08900042F8463 :100B4000C0A8FACAF990402B029CF01F0012C6F10F :100B5000FAC4F9F8E2130004C41040470417580718 :100B6000E089001CC3B8FB4C067889058913FB4B50 :100B70000674587BE08900042F84C098009A402BAB :100B8000029CF01F0004C531FAC4F9F82107C0988F :100B90008002F5488003ECE84AB53103FAC0F990C9 :100BA000FAF90678FAF80674F2CCFFF0F0CBFFFF02 :100BB0004A5A5907FE99FFD90E09890A8917FB4934 :100BC0000678FB4B0674587BE08A0009FACAF99054 :100BD000402B029CF01F001DC2A140684049E4095F :100BE0000C4204085068FAF806785808C080FACA1F :100BF000F990402B029CF01F0015C1913003FAC4FC :100C0000F9F8FB430674FE9FF53302934020FAF88F :100C100006785808C080029CFACAF990009BF01F21 :100C2000000BC0613008FB480674C0284020806873 :100C3000EDB80006C0313FF25062406CFE3DF978DD :100C4000D83200008003EDF88002F548D431FACDA7 :100C500001E03007503C16961295507A5087505755 :100C60000E930E905047407E1D8957795809E080B9 :100C700007A22FFE4D5C507E780C502CF809070817 :100C8000E2180008C1B06C185808E08900070C9BF6 :100C9000403CF01F004FCE816C084CCBF0C9FFFFE9 :100CA000760A1188F4080708EDB80003CDD16C1856 :100CB0008D0920182FF08D18CE7BE0490025E081AA :100CC000008906941091109236CA344C358E407BC0 :100CD0001739507B364BF6091800E08000BBE08BDB :100CE0000042F8091800E08000B4E08B0021339B3B :100CF000F6091800E08B01D2330BF6091800E082E8 :100D00000094325BF6091800C640E08B000B5809CE :100D1000E080074F324BF6091800E08101BFC8A8F8 :100D200032ABF6091800E08101B9C6D8FC091800F9 :100D3000E08000A4E08B000C34CBF6091800C7005B :100D400034FAF4091800E08101A9C8C835BAF409D9 :100D50001800E0800098363AF4091800E081019EFE :100D6000C9E836FBF6091800C7E0E08B0017369B90 :100D7000F6091800C720E08B0008368BF60918002A :100D8000E081018CC4F8F4091800C3F036EAF409D4 :100D90001800E0810183C8D8373AF4091800C1303F :100DA000E08B0008370AF4091800E0810177C7A832 :100DB000375AF4091800C5C0378AF4091800E081D1 :100DC000016DC5B83029C7590000049C800328BCB8 :100DD0006C185808E08900080C9B403CF01F006428 :100DE000E08106E0407A6C08F539FFFF118AF20ACB :100DF0001800E08106E02FF82FF08D086C182018FD :100E00008D18C32BA5A1C64B407B1789F409180088 :100E1000C0512FFBA1B1507BC5BBA1A1C59BA1B106 :100E2000C57BA3A1C55BE4020022A17223021202CA :100E3000C4FBE0420020E08B0007E4C4000130184E :100E40003002C46B3168403A9538E08F06ABA1A1FF :100E50004C8930AE5089C2B84C6C300B508C505B12 :100E6000C279A1A14C4A3089508A5059C2194C2EDE :100E700030AC508E505CC1C94BFBA9B1508B310ACC :100E8000C169301950085019407BFACCFFD4F01FCB :100E9000003BA7A1507C40194008C0B9A7A1300968 :100EA000C0894B59E81102205089310E505EC009AB :100EB000EDB10004FE90FED9EDB10002C441580826 :100EC000C2500E34C064FACCFE20F8040024C2786C :100ED000FACAFED40A99F407002A0E98130B14AB31 :100EE0002FF81034CFC4EEC9FFFFEE0811FFF0C792 :100EF000FFFF2FE808080807EA080025F2070007A7 :100F0000FAC8FED4F0040324C1C8E6C8FFFF0E33BC :100F1000C094FACBFE201093F6040024E8F4FF4CB2 :100F2000C1086A042FC559F7E089000B1093FACA6B :100F3000FE20F40700282FF7F144FF4CC02810933F :100F4000A800C92AEDB10000C1A15808E0800088BE :100F50000E34C635FACAFED40A99F407002A0E9850 :100F6000130B14AB2FF81034CFC4C678800328BC01 :100F70008002EFB480032E6C800329ECE2110002A2 :100F8000C4805808C2500E34C064FACCFE20F80465 :100F90000024C278FACAFED40A99F407002A0E98EF :100FA000130B14AB2FF81034CFC4EEC9FFFFEE08BB :100FB00011FFF0C7FFFF2FE808080807EA0800251F :100FC000F2070007FAC8FED4F0040324C1C8E6C83B :100FD000FFFF0E33C094FACBFE201093F6040024DA :100FE000E8F4FF4CC1086A042FC559F7E089000BEB :100FF0001093FACAFE20F40700282FF7F144FF4CA3 :10100000C0281093E008141F89108908FE9FFE2D48 :101010005808C2500E34C064FAC9FE20F2040024FD :10102000C278FACAFED40A99F407002A0E98130B64 :1010300014AB2FF81034CFC4EEC9FFFFEE0811FF38 :10104000F0C7FFFF2FE808080807EA080025F207A5 :101050000007FAC8FED4F0040324C1C8E6C8FFFFA5 :101060000E33C094FAC2FE201093E4040024E8F486 :10107000FF4CC1086A042FC559F7E089000B109393 :10108000FACEFE20FC0700282FF7F144FF4CC028C1 :1010900010938900FE9FFDE9402CF8090709EDB97E :1010A0000000C021A1A14C7B30AA508B505A30398E :1010B0006C1A580AE089000C501950080C9B403CEF :1010C000F01F004140194008E081056CEDB10006B9 :1010D000C151C1F86C1A201A8D1A580AE08A00040E :1010E0008D0CC0B8501950080C9B403CF01F0036C6 :1010F00040194008E08105562FF06C0A4B3EF4CCB5 :10110000FFFF7C0B158AF60A070AEDBA0003CE3002 :101110005829E08001C05839E080031D5819E0804B :10112000011B029CE21C0010502C5802F9B2000175 :10113000E3D1C001E080009B580CC0303001C4985E :101140005808C2500E34C064FACBFE20F6040024C6 :10115000C278FACAFED40A99F407002A0E98130B33 :1011600014AB2FF81034CFC4EEC9FFFFEE0811FF07 :10117000F0C7FFFF2FE808080807EA080025F20774 :101180000007FAC8FED4F0040324C228E6C8FFFF13 :101190000E33C094FACAFE201093F4040024E8F43D :1011A000FF4CC1686A042FC559F7E08900111093FC :1011B000FAC9FE20F20700282FF7F144FF4CC0883F :1011C0008002EFB4800328BC0000049C10930891B7 :1011D00030044D5E7C081034E08004E46C08118912 :1011E000FAC8FE200808F169FFCC6C1820188D1889 :1011F0006C082FF8308A8D08300BFACCFE2CF01FCB :10120000004B2FF4FAC8FE2C0899FACAFE54029B30 :10121000403CF01F00475BFCE08004C4580CC061F8 :10122000402C580CC051830CC0385BECC0B0080097 :10123000402B2012580BF9B40100F7B100FCFBF46D :1012400000026C185808E089000B0C9B403CF01F12 :101250000039C0505804C050E08F04A45802CBA1FC :10126000402A580AFE91FD01C718402E580EC1A011 :101270006C186C090438C0F4100910128D091001A3 :101280000C9B403CF01F002BCF405801E08101E651 :10129000E08F0488040904188D098D180401E08F7B :1012A00001DD5808C2500E34C064FACCFE20F804A8 :1012B0000024C278FACAFED40A99F407002A0E98CC :1012C000130B14AB2FF81034CFC4EEC9FFFFEE0898 :1012D00011FFF0C7FFFF2FE808080807EA080025FC :1012E000F2070007FAC8FED4F0040324C258E6C887 :1012F000FFFF0E33C094FACBFE201093F6040024B7 :10130000E8F4FF4CC1986A042FC559F7E08900142E :101310001093FACAFE20F40700282FF7F144FF4C7F :10132000C0B80000000009AC8002E8BC800328407F :10133000800328BC1093049A089C0C99301BF01F62 :1013400000C9E080042FF800000040492FF95049FF :10135000FE9FFC8B5802F9B200FFEDB10004C261A0 :1013600030040891C1286C188D0920188D182FF4AD :101370000832E080008D5808E08900080C9B403C52 :10138000F01F00B9E08100846C08FACEFE20F0C99D :10139000FFFF1188FC080008F138FE4CE208180035 :1013A000CE315804C741E08F04065808C2500E34AD :1013B000C064FACCFE20F8040024C278FACAFED435 :1013C0000A99F407002A0E98130B14AB2FF8103467 :1013D000CFC4EEC9FFFFEE0811FFF0C7FFFF2FE8F3 :1013E00008080807EA080025F2070007FAC8FED433 :1013F000F0040324C1C8E6C8FFFF0E33C094FACB43 :10140000FE201093F6040024E8F4FF4CC1086A049F :101410002FC559F7E089000B1093FACAFE20F40794 :1014200000282FF7F144FF4CC02810930891300892 :10143000C1886C1A201A8D1A133A02CA8D095802F3 :10144000C1D06C195809E089000D50080C9B403C34 :10145000F01F00854008C0500831C101E08F03A291 :101460006C0AFACEFE2014992012158AFC0A000A92 :10147000F53AFE4CF00A1800CDD1E2040104E080F8 :10148000039A404C2FFC504C3008A2880800FE9F65 :10149000FBEC029BE21B0010502B5802F9B200FF3C :1014A000E3D1C001E08000BC580BC050FACAFE2452 :1014B000506AC4385808C2500E34C064FAC9FE20BD :1014C000F2040024C278FACAFED40A99F407002A6A :1014D0000E98130B14AB2FF81034CFC4EEC9FFFFD6 :1014E000EE0811FFF0C7FFFF2FE808080807EA0819 :1014F0000025F2070007FAC8FED4F0040324C1C88F :10150000E6C8FFFF0E33C094FACEFE201093FC0411 :101510000024E8F4FF4CC1086A042FC559F7E0899C :10152000000B1093FACCFE20F80700282FF7F144A7 :10153000FF4CC0281093506430014CC4C598680813 :101540001031E080032FFAC8FE200208F169FFCCB9 :101550006C1820188D186C082FF8308A8D08300B05 :10156000FACCFE2CF01F00422FF1FAC8FE2C029993 :10157000FACAFE54406B403CF01F003E5BFCE0802A :101580000311580CC041406B970CC0385BECC23063 :10159000406A740CF01F0038C100FAC4FE20020437 :1015A0002354C088098B201120140C9A403CF01F52 :1015B00000335801CF81C2C80200402920125809C7 :1015C000F8011710FBF80006F7B800FCFBF80A0654 :1015D000FBF100026C185808E089000B0C9B403CA2 :1015E000F01F0021C0505801E08102DCC1186C08D6 :1015F00058025F1A11894A2E300C7C08F00907083E :10160000EC180008F5E80238F8081800C991402BDA :10161000580BFE91FB2A406A950BC98A402E580E42 :10162000C300C1086C188D0A20188D182FF10232E2 :10163000C1405808E08900070C9B403CF01F000A9D :10164000C0C16C0848ECF0CAFFFF78091188F208A5 :101650000708EDB80003CE710200FE9FFB060000F4 :10166000800320B8800328BC000009AC8002E8BCDD :10167000800328408003274880032FF40000049C47 :101680005808C2500E34C064FACBFE20F604002481 :10169000C278FACAFED40A99F407002A0E98130BEE :1016A00014AB2FF81034CFC4EEC9FFFFEE0811FFC2 :1016B000F0C7FFFF2FE808080807EA080025F2072F :1016C0000007FAC8FED4F0040324C1C8E6C8FFFF2F :1016D0000E33C094FACAFE201093F4040024E8F4F8 :1016E000FF4CC1086A042FC559F7E089000B10931D :1016F000FAC9FE20F20700282FF7F144FF4CC0285A :1017000010930891C1286C1920198D19113902C93B :101710008D085802C1506C185808E08900070C9BCE :10172000403CF01F0059C0C16C094D8E12987C0AD4 :1017300013892012F4090709EDB90003CE51404C7A :101740002FFC504C08103008E2000000A288FE9FD9 :10175000FA8CE4C90001E0490026E08B0005300B5B :10176000506BC058E4CA00273272506A3009FACE72 :10177000FE54509950A7E8110D80502E35894057DE :101780006C0A339C158AF80A1800E08B0015338B1D :10179000F60A1800C4E2330BF60A1800C270E08B98 :1017A000004532BBF60A1800C51032DBF60A1800F5 :1017B000C7C1C4C8F20A1800C4E0E08B000AF4CB29 :1017C0000041305EFC0B1800E08B0070C398361CA3 :1017D000F80A1800C6A3366BF60A1800E088003134 :1017E000378EFC0A1800C611C368029BEDB1000BCE :1017F000C3C15807E06B0200E3DBE031F9B7000832 :10180000EDB1000AC041E011FA7FC2F8409B406C84 :101810002FFB580CF7BC0101FBFC1A06F7B201FFC5 :10182000E011FC7F509BC248499EFC070417C0B8DA :10183000497CF80704175887E0890006C36858A751 :10184000E08A0034E011F47FC108EDB10007C2D195 :10185000A7D1C0B8029BE21B0600E04B0200C251B8 :10186000A9D13107E8110500402B16CA502B6C1A7C :10187000201A8D1A580AE08A000D6C0A2FFA8D0A78 :10188000C1180000800328BC0000049C8003EF08FE :10189000501950080C9B403CF01F00BD40194008F7 :1018A000C0412012FE91FF6E505740A7EDB10008D5 :1018B000C161FAC9FE54402A123AE088000B40295F :1018C0000C9A137B403C50085029F01F00B240088E :1018D000FAC9FE5440221232E080016D029AE21AE7 :1018E0000010E081014B402EBC8A50084059FACBD1 :1018F000FE54403C40825D1202994008E2190020EB :10190000C2A05808C1400E34C064FACEFE20FC04C8 :101910000024C1D9FACAFED40A99F407002A0E9805 :10192000130B14AB2FF81034CFC4CF68E6C8FFFFF9 :101930000E33C064FACBFE20F6040024C0796A049A :101940002FC559F7E08901151093FACAFE20F40754 :101950000028C0A9EDB10002C4415808C2500E349D :10196000C064FAC9FE20F2040024C278FACAFED488 :101970000A99F407002A0E98130B14AB2FF81034B1 :10198000CFC4EEC9FFFFEE0811FFF0C7FFFF2FE83D :1019900008080807EA080025F2070007FAC8FED47D :1019A000F0040324C1C8E6C8FFFF0E33C094FAC296 :1019B000FE201093E4040024E8F4FF4CC1086A04FC :1019C0002FC559F7E089000B1093FACEFE20FC07D3 :1019D00000282FF7F144FF4CC0281093A80CCCA886 :1019E000F5D1C001C2A05808C1400E34C064FACB82 :1019F000FE20F6040024CAB8FACAFED40A99F407F5 :101A0000002A0E98130B14AB2FF81034CFC4C8481B :101A1000E6C8FFFF0E33C064FACAFE20F4040024B7 :101A2000C9586A042FC559F7E08900A31093FAC971 :101A3000FE20F2070028C988E2110002C5904D6916 :101A400040821232C091FACBFE544059403C5008BB :101A5000F01F0052C088FACBFE544059403C500859 :101A6000F01F004F40085808C2500E34C064FACE30 :101A7000FE20FC040024C278FACCFED40A99F807B0 :101A8000002C0E98130E18AE2FF81034CFC4EEC9E8 :101A9000FFFFEE0811FFF0C7FFFF2FE80808080757 :101AA000EA080025F2070007FAC8FED4F004032470 :101AB000C1C8E6C8FFFF0E33C094FACCFE201093D5 :101AC000F8040024E8F4FF4CC1086A042FC559F754 :101AD000E089000B1093FAC9FE20F20700282FF7C7 :101AE000F144FF4CC0281093891A890BC438580858 :101AF000C2500E34C064FAC8FE20F0040024C2783C :101B0000FACAFED40A99F407002A0E98130B14ABF4 :101B10002FF81034CFC4EEC9FFFFEE0811FFF0C755 :101B2000FFFF2FE808080807EA080025F20700076A :101B3000FAC8FED4F0040324C1C8E6C8FFFF0E3380 :101B4000C094FAC2FE20E40400241093E8F4FF4C91 :101B5000C1086A042FC559F7E089000B1093FACE2B :101B6000FE20FC070028F144FF4C2FF7C0281093FB :101B7000890C404C2FFC504CFAC8FE54409B10106E :101B8000402A1600F4000000FE9FF86F800328BC76 :101B900080032FF480032E6C80032CE480032B340D :101BA00040495809C0508C68EDB80006C0313FF874 :101BB0005048404C288DD832D421217D1497189656 :101BC000129A5807C064E068008B99383FFCC2281D :101BD0005807EE0C1700F9B901FFEFD9E10C109985 :101BE000E0680208BA683FF8504B505C500B502C2C :101BF000BA781A9B0C9CF01F00095BFCC044E0689B :101C0000008B8D385807F9B90100FBF81000F1F985 :101C10001E002E9DD82200008002F568D401129883 :101C20001499169A189B483C780CF01F0003D802B0 :101C30000000059880031BB8D4214B3818961697DE :101C4000700C580CC06078685808C031F01F002F25 :101C50004AF81037C0514AC870087007C0E84AD81F :101C60001037C0514A8870087017C0784AA81037DA :101C7000C0414A58700870278E68EDB80003C1E073 :101C8000EDB80004C3E1EDB80002C1516EDB580BA2 :101C9000C0A0EEC8FFBC103BC0400C9CF01F001F52 :101CA00030088FD88E68E018FFDBAE6830088F18D8 :101CB0006E488F088E68A3B8AE686E485808C0B1E9 :101CC0008E68E2180280E0480200C0500C9C0E9B17 :101CD000F01F00138E69F1D9C001C07030088F2841 :101CE0006E585C388F68C068EDB90001EFF81005D8 :101CF0008F286E485808C0618E68EDB80007C02173 :101D0000DC2AD82A0000059880031F388003EF2CB6 :101D10008003EF4C8003EF6C8003217C8003276CF1 :101D20004828700C2F4C5EFC00000598D4211697B3 :101D3000189676485808C7D0580CC060786858087C :101D4000C031F01F003D4BD81037C0316C07C0A820 :101D50004BB81037C0316C17C0584BA81037EDF78F :101D600000028E6A1498EDBA0003C420ABBAAE6AC2 :101D70006E185808E08900066F085808E08A005A73 :101D80006EB85808C560E21A1000C0306F55C0F830 :101D900030196E8B0C9C5D1818955BFCC0816C38FB :101DA00059D8C4708E68A7A8AE68D8228E68EDB8DE :101DB0000002C0916E1810156ED85808EFF8101078 :101DC000EBD8E1156EB80C9C30090A9A6E8B5D1841 :101DD0008E680A3CC261ABD8300C6E49AE688F1C6D :101DE0008F09EDB8000CC251EF450054D8226E4562 :101DF0005805C1F06E04F5DAC0028F05F9B801008C :101E0000EFF800050A148F28C11808990A9A6EA8DD :101E10006E8B0C9C5D181814580CE08900078E68B6 :101E2000A7A83FFCAE68D82218055804FE99FFEF1A :101E3000D82A000080031F388003EF2C8003EF4C6A :101E40008003EF6CD401189B580CC0714868487B24 :101E5000700CF01F0007D8024868700CF01F0003D8 :101E6000D80200008003ECA880031D2C800325E825 :101E7000000005985EFC5EFCD401483BF01F0003A7 :101E8000D80200008003629080032640D42116957A :101E9000F606105CECCBFFF4F01F00071897C0901B :101EA0009915300B2F4C0C9A8F2C8F0BF01F0003C1 :101EB0000E9CD8228002E2BC8002E8BCD42149C832 :101EC000189670076E685808C0410E9CF01F0019E4 :101ED000EEC7FF2830056E2C6E18C0689869EA09B5 :101EE0001900C1202A4C2018CFA76E085808C071CD :101EF000304B0C9CF01F00108F0CC0306E07CECB07 :101F000030C88D38D8223008F948004C99089928F3 :101F1000991899489958996899D899E8F9480048C2 :101F20003FF8B8783018B868D82200008003ECA8D1 :101F300080031F3880031E8CD421189678675807B9 :101F4000C4714A48301599A8F94700D8F94700DC10 :101F5000F94700E09965F01F00208D0C0C9CF01FE4 :101F6000001E8D1C0C9CF01F001C6C093048930750 :101F7000B268931793276C18B27793479357936778 :101F80009389910791179127494E495B939E93AB93 :101F9000494A495493BA93C43099B069B07591C411 :101FA0009147915791679188919E91AB91BA8D2CF1 :101FB00031289907B868991799273028B87899C4B3 :101FC0009967999E99AB99BA99479957998CD82254 :101FD00080031E7880031EBC80032B1080032AD848 :101FE00080032AAC80032A9CD4014858169AFAC967 :101FF000FFFC189B700CF01F0003D802000005982E :1020000080033424D43114901291169310971895AC :10201000F20A02425802C0310491C418580CC06040 :1020200078685808C031F01F001F49F81037C031D8 :102030006A07C0A849D81037C0316A17C05849C8C4 :102040001037EBF700026E185808C03430088F18AC :102050000496C148F01F00176E08080308160E9B6F :10206000F00400040A9C8F04F01F0013C070E40603 :102070000109F2000D081091C1286E146E08069C2B :10208000089A109B0836FE9BFFE70C9AF01F000988 :102090006E080C088F086E180C188F18029CD83226 :1020A00080031F388003EF2C8003EF4C8003EF6C1C :1020B0008002E736800328BCD40112981499169A3E :1020C000189B483C780CF01F0003D80200000598CC :1020D00080032004D42116951897F01F00234A345A :1020E00068287016E016FFFCECC8FF91F0050105AA :1020F000E015FF80EAC50080E045007FE08A00230C :10210000300B0E9CF01F001A68280C08103CC1A16F :10211000EA0B11000E9CF01F00165BFCC171300B26 :102120000E9CF01F00136828F808010958F9E08A8E :10213000000AA1A9911948F8700948F8F80901099D :1021400091090E9CF01F000DD82A68280A16A1A636 :102150009116489870090A190E9C9109F01F000702 :10216000DA2A00008002E8CA0000059C8002EBC861 :10217000000009A800007AD08002E8CCD42116968D :102180001897580BE08000CAF01F004E20864CEADA :102190006C18742EF9D8C001A1C8EC080009721B94 :1021A000E01BFFFC1C39C1D1F6080008580CC081A7 :1021B0006C09121612086C3B6C299729933B1099F5 :1021C0009526A1A98D194C1972091238C0634C08C3 :1021D0000E9C700BF01F003F0E9CF01F003FD8229A :1021E000931B580CC030300CC1086C0EF4C5FFF8BE :1021F0001C161C086C2E0A3EF9BC0001EDF51003FC :10220000EBFE1A02FDF51A03F20B000E7C1EEDBE6A :102210000000C1301608580CC0C14ABE722B2F8E68 :102220001C3BC071973697268D2B8D3B301CC058B8 :10223000722B7239932B97391099EC080908A1A9D0 :102240008D19580CC671E04801FFE08B0013A3986C :10225000F4080039722B8D398D2B97369326A348BD :102260007419301BF6080948F3E810089518C528BA :10227000F00916095849E08B0006F00B16062C8B66 :10228000C2D85949E08B0005F2CBFFA5C278E049DE :102290000054E08B0006F00B160C292BC1F8E04926 :1022A0000154E08B0006F00B160F289BC178F00B51 :1022B0001612E0490554E088001137EBC0F8000021 :1022C0008002E8CA0000059C000009A400007ACC46 :1022D000800320D48002E8CC284BF40B003C782902 :1022E0001839C0E17418A34B301CF80B094BF1EB03 :1022F000100B1298951BC0A872291839C060721A69 :10230000E01AFFFC1438CF9372388D388D2993363C :1023100091260E9CF01F0002D82200008002E8CC1B :10232000D431203D14941895169774285808E080ED :10233000014A9668EDB80003C04176485808C0C10C :102340000E9B0A9CF01F00A1C0708E68A7A8AE6803 :1023500030988B38C3598E6368000696E2160002E7 :10236000C2103003E06204000696C04860036016A5 :102370002F805806CFC0E0460400EC091780E4091E :1023800017B0069A6EA86E8B0A9C5D181816580C2A :10239000E08A0114682818188928E08001141803BD :1023A000CE9BE7D3C001C07050060C930C91501522 :1023B0000892CA0806960891C048600360162F80EC :1023C0005806CFC08E686E241099E2190200C570BD :1023D0000836C4531099E2190480C4106E4B6E097C :1023E000161950096E59109CF209001A3028F40889 :1023F0000C08FAE9000410944009E21C04002FF9CB :102400000C091238F2041730580CC110089B0A9CB2 :10241000F01F006F1892C150400A6E4BF01F006D04 :102420008E68E018FB7FA7B8AE68C0E8089A0A9CDF :10243000F01F00691892C0816E4B0A9CF01F006764 :1024400030C88B38CBA8400A4009E80A010AE409E1 :1024500000088F548F2A8F088F420C940836EC04A2 :102460001730069B089A6E0CF01F005D6E08080876 :102470008F086E2808180C948F28C30808365FBA96 :102480006E0C6E48103C5FB8F5E80008F2081800C2 :10249000C0E0069B089AF01F00526E0808080E9BC9 :1024A0008F080A9CF01F004FC190C8786E591236F1 :1024B000C0A36EA8069A6E8B0A9C5D181894E089DA :1024C000000EC7B80C9A069BF01F00456E080C085A :1024D0000C948F086E280C188F28622808188328FF :1024E000C71008160803C6DB6003601130082F8090 :1024F00050085801CFA0400A580AC181029A30AB57 :10250000069CF01F0039F9B80101F9D8E106EDD3B6 :10251000E116F9B90101FBF91A00F9B80001E3D895 :10252000E006F9B80001FBF80A000236EC04178057 :10253000E20417B06E596E25F20500050A345F9A61 :102540006E0C6E48103C5FB8F5E80008300AF408DD :102550001800C0E0069B0A9AF01F00216E080A08C6 :102560000E9B8F08401CF01F001FC180C2681234F0 :10257000C0A56EA8069A6E8B401C5D181895E08960 :10258000000EC1B8089A069BF01F00156E080808D7 :1025900008958F086E2808188F280A16C0710E9BA0 :1025A000401CF01F0010C091500664280A188528AE :1025B000C0900A110A03C9EB8E68A7A8AE683FFC59 :1025C000C028300C2FDDD83280031C388002E2BCDA :1025D0008002E7368002E8E88003217C8002E87E02 :1025E00080031D2C800328A4D43130051893169045 :1025F0000A91F01F00123FF2E6C7FF28C1786E264D :102600006E142F46C0D88C08E2081900C0808C18C0 :10261000E4081900C040069C5D1018452A462014A5 :10262000ECCB000C5804CF046E075807CE91F01F76 :1026300000040A9CD832000080031E7480031E76BA :10264000D43130051691F8C7FF280A92F01F001008 :102650003FF3C1686E266E142F46C0C88C08E4088C :102660001900C0708C18E6081900C0305D111845BB :102670002A462014ECCC000C5804CF146E075807DF :10268000CEA1F01F00040A9CD832000080031E7403 :1026900080031E76D401201D4848189B1A9A700C9E :1026A000F01F00032FFDD80200000598800326B01C :1026B000D431169414921895F01F00204A08700720 :1026C0005807C050300633DA0C98C0780A9CF01FC7 :1026D000001D0E9CD8322FF6E8060709F0091800F5 :1026E0005F1BF40918005F191669F0091800CF4143 :1026F000C1A8029C0C9A089BF01F0013C1216E0117 :102700000C010388E6081800C0C148D870080A9C6C :102710001017A3478507F01F000BE2CCFFFFD8324C :102720002FC7C02833D36E015801CE410A9CF01F39 :102730000005029CD8320000800361BC000009B093 :10274000800361BE8002EDE6E04C00FFE0880003FC :102750005EFD48487008F00C070CE21C00085EFCA7 :102760000000049C481C5EFC8003EF8CD42120FDFB :10277000966816971896E2180002C3C1967BF00B74 :102780001900C0551A9AF01F002AC0F48E650A98E5 :10279000ABB8E2150080AE683004E0680400F9B51B :1027A0000140F0051700C1B84018E218F000E048F9 :1027B00020005F04E0488000C0D16EB949D81039CC :1027C000C0918E68E0650400ABA8EF450050AE688C :1027D000C0688E68E0650400ABB8AE680A9B0C9CCC :1027E000F01F00158E68C0D1EDB80009C1E0A1B896 :1027F000AE68EEC8FFB98F488F0830188F58C1589F :10280000A7B88F4CAE688F5548C88F0C8DA8580458 :10281000C0C08E7CF01F000AEFF81206F9B9010162 :10282000F1D9E138EFF81C062F1DD822800362A8E9 :1028300080032AAC8002E2BC80031E788002F1682B :10284000D42118971096580AC041149B3019486A31 :10285000F01F00065BFCC06130088D08E068008A4C :102860008F38D82280037E208003286C201D5809D1 :102870005F09580BFA0B1700580A5F18F3E80008B5 :102880003009F2081800C0303FECC0B8580AC03117 :10289000149CC078158997091589F00918005F1CE8 :1028A0002FFD5EFCF7DBC008C068201A19881638B7 :1028B0005E0C2FFC580ACFA15EFAD703D4211697DD :1028C0001896580CC06078685808C031F01F00385E :1028D0004B881037C0316C07C0A84B781037C03117 :1028E0006C17C0584B581037EDF7000230088F189E :1028F0008E68EDB80005C590EDB80002C1A0EDB836 :102900000004C060A7A8AE6830988D38C4D8EDB870 :102910000003C0B10E9B0C9CF01F0029C4618E689F :102920008F6CA3D88F2CAE688E68A3A8AE68C14800 :102930006EDB580BC110EEC8FFBC103BC0400C9CB6 :10294000F01F0020300C6F088FDC8F185808C04033 :102950006EF88F08D8226E485808C0510E9B0C9C08 :10296000F01F00198E68F1D8C002C0604978498B09 :10297000700CF01F00186E4A6E980C9C8F0A6E59EE :102980006E8B5D188E688F1CADD8AE68580CE08ACF :102990000003D82A580CC041A5B8AE68C058A7A8F3 :1029A000AE6830088F18DC2ADC2A000080031F384C :1029B0008003EF2C8003EF4C8003EF6C80031D2C11 :1029C0008003217C8003276C8003ECA8800329D43A :1029D00080032640D4019868E21800095898C02066 :1029E000D80AF01F0002D80280031E44D431189E7A :1029F0001738E048005EC030300AC0381738301A47 :102A00003009FC090B0A2FF9E0490100CFB1580841 :102A1000C041F6CC0001D832149632D4EC16000135 :102A2000300735D5C0381498129BFC080B06F6C940 :102A3000FFFF178A129CE80A1800C090EA0A1800E3 :102A4000C1E0EE0A1800CF01169CD832138C103C5E :102A50005F53E04C005D5F0AE7EA100AEE0A1800D7 :102A6000C03032D8CE2BF0CAFFFFFC0A000A14C6D1 :102A70002FF81838CFD52FEB2FE9CDCBD8321498BB :102A8000F5DBC01FF00C1100104CFC187FF0F5ECCA :102A900013FCF00C010CBF9C5EFCD703D401967BA9 :102AA000F01F0002D8020000800353E0D4211697E3 :102AB000967BF01F00098E681099ADC95BFCEFF999 :102AC0000C06EFFC1A15E0691000F1D9E138EFF8B7 :102AD0001C06D822800362D4D421966816971495D8 :102AE0001294E21801001896C0603029300A967BD3 :102AF000F01F00068E68ADC808990A9A8E7B0C9C60 :102B0000AE68F01F0003D822800362D4800353B460 :102B1000D4211697967BF01F0007C0656F581808E0 :102B2000EF480054D8228E68ADC8AE68D8220000A5 :102B30008003694CD431208D4DB8500B7008507C07 :102B4000502A1295501816970F36401AF4060704AB :102B5000E2140008CFA1E046002DC0410F3630142A :102B6000C058E046002BC0210F3658055F085905B4 :102B70005F0A3009F1EA100AF20A1800C1D0E046F3 :102B80000030C1210F8A358B378CF60A18005F0B95 :102B9000F80A18005F0A144BF20B1800C0500F9689 :102BA00031052FE7C0985808C070E0460030F9B5ED :102BB0000008F9B5010A5804C0713FF0E061FFFF59 :102BC000EA117FFFC0483000FC118000EA03141FA7 :102BD0000A980699009A029BF01F00340699505AF1 :102BE0000A98009A029BF01F0032069C14981699CE :102BF000300A30003001149E109212934019F206F0 :102C0000070BF3DBC001F9B90137F9B90057506977 :102C1000ECC80030EDBB0002C0804069F7DBC002A9 :102C2000EC090108580BC2D00A38C2B40430E601DE :102C300013005FB9F3EA13FAFC0A1800C1F104307B :102C4000E60113005F09405A14385F9AF5E900095C :102C5000FC091800C131E005064AEA010249504862 :102C6000F8000349BF58F20B000B5038FAE0000C93 :102C70001400E20B0041301AC0283FFA0F36CBFB9C :102C80005BFAC1715804C0713FF0E061FFFFEA11C7 :102C90007FFFC0483000FC11800032284079933813 :102CA000C10800000000049C800373408002D99892 :102CB0005804C07030083009F0000100F2010141F1 :102CC00040285808C0B0580AF9B801FFEFD8E10A07 :102CD000FBFA1A00402940089308009A029B2F8DA6 :102CE000D8320000D431209D4DE816927008508CE7 :102CF000505A1295504816970F36404EFC0607035F :102D0000E2130008CFA1E046002DC0410F3630137A :102D1000C058E046002BC0210F3658055F08590502 :102D20005F0A3009F1EA100AF20A1800C1D0E04641 :102D30000030C1210F8A358B378CF60A18005F0BE3 :102D4000F80A18005F0A144BF20B1800C0500F96D7 :102D500031052FE7C0985808C070E0460030F9B53B :102D60000008F9B5010AEA04141F0A9808993FFA05 :102D70003FFBF01F003D0899502B503A0A983FFA4C :102D80003FFBF01F003A300B300830094041E206AB :102D9000070EE1DEC001ECCC00305800F9B101377C :102DA000F9B100571C90E2100004C061EC01010C65 :102DB000FDDEC002C3700A3CC354FAE000080038CC :102DC000E20913005FBE3000FDEB13FBE00B1800BF :102DD000C261FAE00008143C5F9E0038E20913006B :102DE0005F0B3000FDEB000BE00B1800C181F0051C :102DF0000640EA09024BFAE10000E808034BF6013D :102E00000001507C5001BF5CFAE00000506C301BA8 :102E1000FAE800180008F2010049C0283FFB0F360D :102E2000CB6B5BFBC071322840803FF981383FF8A3 :102E3000C0985803C07030043005E8080108EA095A :102E40000149405E580EC080580BF9BA01FFEFDA15 :102E5000E102405A9502109A129B2F7DD832000051 :102E60000000049C8002D99880037340D431203D37 :102E70004C48502C70011698113EE20E0705E215E1 :102E80000008CFB1E04E002DC041113E3015C058B2 :102E9000E04E002BC021113E58095F0C59095F0616 :102EA0003007F9E61006EE061800C1E0E04E0030EB :102EB000C131118635843783E80618005F04E606C1 :102EC00018005F06E9E61006EE061800C050119ED5 :102ED00031092FE8C098580CC070E04E0030F9B9A5 :102EE0000008F9B9010A3FF3E6090D023007500363 :102EF0000E9C0E93E20E0704E1D4C001F9B0013735 :102F0000F9B000575010FCC600300890E2100004E1 :102F1000C0814010E9D4C002FC0001065804C1C0C1 :102F20001236C1A4043C5FBEFDE713FEE60E180096 :102F3000C101043C5F0E40070E365F97EFEE000EB6 :102F4000E60E1800C061B33C3017EC0C000CC02832 :102F50003FF7113ECD0B5BF7C061322940200E9C3C :102F60008139C0485805FBBC0100580AC070580799 :102F7000F9B901FFF1D9E10B950B2FDDD832000033 :102F80000000049CD421169776DBEEC8FFBC103BF2 :102F9000C171E06B0400F01F0015C250E06804002E :102FA0008FDC8FE8EF380046F8CCFC03B8A8EF3888 :102FB0000045B898EF380044B8888F0CC1386EE5EA :102FC000EA041501089AF01F000A1896C0C00A9A70 :102FD000189BF80500050A9CF01F00068FE48F057A :102FE0008FD6D82ADC2A00008002E2BC8002E8E802 :102FF0008002E736D4211697149618955BFBC650CD :10300000580CC06078685808C031F01F00314B1868 :103010001036C0316A06C0A84AF81036C0316A16A8 :10302000C0584AE81036EBF600028C68A5D8AC68A8 :10303000EDB80002C140EDB80004C461EDB8000372 :10304000C0B10C9B0A9CF01F0026C3E18C688D6CFC :10305000A3D88D2CAC688C68A3A8AC680E946CD8EF :103060005C545808C1006C196CE81039C0650A9CA2 :103070000C9BF01F001CC2816C0820188D08B084C6 :103080000897C0C86C495809C0C06C081238E0885D :10309000000911770837C0518D086C182FF8C12826 :1030A0006C18ED4800406C088DF8ECC8FFBC8DD85A :1030B00030388DE8ECC8FFBAED6400468D080897FB :1030C00030188D18C0283FF70E9CD82280031F3877 :1030D0008003EF2C8003EF4C8003EF6C80031D2CEA :1030E00080032F84D431208DFAC4FFBC504B682E4E :1030F000505812967C0B7005506E580BF40B17004D :103100006803681140493008C2C92FFB325C178A36 :10311000F80A18005F1EF00A18005F1CFDEC000C96 :10312000F00C1800CF31580AE0800129300C3FFA2A :103130001890503A18941892F80C003C1697507C4E :103140004CDC0F3AF80A070E407C1C0C4CBEFC0C01 :10315000070E201E500E4CAEFC0C070C507C400C91 :10316000587CE08B00F84C7EFC0C032F368BF60A63 :103170001800E08000F0371BF60A1800C07034CB4E :10318000F60A1800C051A3B4CE58A5B4CE380F8BA0 :1031900036CAF40B1800C051A5B4EECBFFFFCDB872 :1031A000A5A4CD88EBD5C005367CF80A1800E08BC5 :1031B0000027365BF60A1800C48234FBF60A1800B2 :1031C000C480E08B000C345BF60A1800C3E0347B4B :1031D000F60A1800C3A0344BC088358BF60A1800D5 :1031E000C2C0E08B0007355BF60A1800C351C31854 :1031F000363BF60A1800C2F0364BC0E8370BF60A29 :103200001800C250E08B000D36EBF60A1800C1F032 :10321000E08B0014369BF60A1800C1E1C0E8375B6A :10322000F60A1800C0A0378BF60A1800C060373BBA :10323000F60A1800C111C0B8EDB40004C0A0EDB486 :103240000005C0913020C0883040C0683030C04890 :103250003010C0283000403B5BFBC040E20B09202F :10326000C7985860E08B00776C0AEACCFFFF486E85 :10327000FC00032F8003F2708003F1D48003F16817 :103280008003EFC88003EFE8F4CBFFF88D0BF4EA7E :103290000000E605083AC0F8F4CBFFFC8D0B740A79 :1032A000E605093AC088F4CBFFF88D0BF4EA00007C :1032B000E605083A0E9B1895C4E8620A5BFAC0B1AD :1032C00050195028E06A0080300B029CF01F004D1E :1032D00040284019E4CC00010E9B503CF20C0C49F4 :1032E000C3A8620A5BFAC0B150195028E06A008096 :1032F000300B029CF01F0043402840192012300A76 :103300000E9BE202092AF2020C49C25816976C0A77 :10331000F4CBFFFC8D0B740A0E9BE605093A2FF5E2 :10332000C1A8F4C20030C068E40200222FF7F40202 :1033300000120F8A580AC0E0230A589AFE98FFF636 :10334000C0982FF70F8A580AC050230A589AFE983F :10335000FFFA0E9B407C30BAF40C1800FE91FEEE92 :103360004042178C0A325F4AF00C18005F1CF9EAE1 :10337000000AF00A1800FE91FECB3008404E178A72 :10338000E2050021F00A1800FC091710E6050038D4 :10339000069EC2A8620A583AC1E0E0890007581A9E :1033A000C1A0582AC181C058585AC0C0C0B5C13840 :1033B0006C0AF4CCFFF88D0CF4E20000F0E300009E :1033C000C1086C0AF4CCFFF88D0CF4E20000F0E3C5 :1033D0000000C0786C0AF4CCFFFC8D0C740A910AD2 :1033E0002FF52F882FC11235FE9AFFD61C9340521D :1033F000406E85059D0B404BE60B003C2F8DD8326F :103400008002E8BCD421149774285808C04195184C :10341000109CD822F01F000330088F188F28D82264 :1034200080032320D431FACD06BC5109169114979C :103430001895F01F0056780C50CC5805C0706A687B :103440005808C0410A9CF01F00524D281031C0316D :103450006A01C0A84D081031C0316A11C0584CF83B :103460001031EBF100028268EDB80003C041624800 :103470005808C071029B0A9CF01F0049E0810F941C :1034800082681099E219001A58A9C3D18279300ACA :10349000F4091900C385A1D8FB5805D06288FB4800 :1034A00005E462A8FB4805ECFAC8FFBCFB4805D45C :1034B000FB4805C4E0680400FB4805D8FB4805CC80 :1034C0003008FB5905D20E9A4109FAC7FA3CFB486D :1034D00005DC0A9C0E9BF01F003350BCC0950E9B70 :1034E0000A9CF01F003140BEF9BE01FF50BEFB0830 :1034F00005D0EDB80006E0810F598268A7A8A26840 :10350000E08F0F543008FB4806B4FB480690FB4898 :10351000068CFB4806B03008300950A75078FAC432 :10352000F9E03FF85059FB440688FB480544129CDB :10353000506950D950E950B9129740A2325A300818 :10354000C0282FF20589F00918005F1BF409180044 :103550005F19F3EB000BF00B1800CF4140ABE40B0D :103560000106C300FAF806900C08890BFB48069088 :103570008916FAF8068C2FF8FB48068C5878E089F3 :1035800000152F84C1C800008003276480031F3802 :103590008003EF2C8003EF4C8003EF6C80031C381A :1035A0008003342480031D2CFACAF978029B0A9CFC :1035B000F01F0071E0810EF4FAC4F9E040BA0C0A81 :1035C00050BA05893008F0091800E0800ED930099A :1035D000FB6806BB0E96E4C8FFFF3FFE50945041C7 :1035E0000E940491508950A8502E50391293129085 :1035F00010970A92C0783FFC0A97502CC038300BC5 :10360000503B0F38C0281290F0C90020E049005804 :10361000E08B0A4A4D9AF409032F50A750800C976B :103620000495089602924D6940941090404150D9FB :10363000E08F08AA3008FB3906BBF0091800CE213C :103640003208C6E8A1A3CDEB0F89F2C80030589824 :10365000E08B001DEEC8FFFF300B2309F60B002B9B :10366000F20B001B1139F2CA0030589AFE98FFF78E :10367000E0490024CC51E04B0020E0890E90201B53 :10368000FAF906B4123BC095C108FAF906B4ECCABF :10369000FFFF1236C1F5C268FACEF9441097FC0B51 :1036A000003BF6F0FD88C3581097FAC8F9501AD8B5 :1036B000FAC8FAB81AD8FAC8FBB4029A1AD8049C05 :1036C000FAC8F940FAC9FFB4F01F002E2FDD7800C8 :1036D000C208FACCF9441496F8040038F0F0FD88DA :1036E000C188410859F9E0890011F0CBFFFC510B6A :1036F0007000FACBF944F6090038F140FD882FF943 :103700001496FB4906B4C058700014962FC851088F :103710005800FE94FF785C30A3A3C74B32B8FB6817 :1037200006BBC70B0F38E048002AC0303009C80874 :103730000F88F0C900305899E08B0026EEC5FFFFD6 :10374000300B2308F60B002BF00B001B0B38F0C9D5 :1037500000305899FE98FFF7E0480024FE91FF5191 :10376000E04B0020E0890E1B201BFAF806B4103B4A :10377000C115C188800334048003F0048003EDD0B8 :10378000800330E4FAFA06B4ECC9FFFF1436C1F541 :10379000C288FACAF944F40B003BF6FBFD88502BB3 :1037A000C3C8FAC8F9501AD8FAC8FAB81AD8FAC869 :1037B000FBB4029A1AD8049CFAC8F940FAC9FFB4BB :1037C000F01F017B2FDD780C502CC27812960E95DD :1037D000FAC9F944F2040038F0F8FD885028C1D83D :1037E000410859FAE0890014F0CBFFFC7008510B36 :1037F0005028FAC6F944402EEC0A0038F14EFD88F4 :103800002FFA0E95FB4A06B41296C078700C0E95EE :103810002FC8502C12965108402B580BFE95FEEDE8 :103820000A97CF0AF20900290F38F4090019F0CAE3 :103830000030589AFE98FFF83FFAF20A0C495029D6 :10384000CE4AA7B3CDFA30092308F2090029F009BE :1038500000190F38F0CA0030589AFE98FFF7E04878 :103860000024FE91FED2E0490020E0890D98F2C4C8 :10387000000130195039CC6AA3B3CC4AA7A3CC2A93 :103880000F8836CEFC081800C0412FF7A5B3CBAA8D :10389000A5A3CB8AA5B3CB6A50A750800C971090F4 :1038A00008960495409402920E994041FAF806B4A5 :1038B000403C580CC1D01036C064FACBF944F6062F :1038C0000036C1D8FAC8F9501AD8FAC8FAB81AD8C6 :1038D000FAC8FBB41AD8FAC8F940FAC9FFB4049A76 :1038E0000C9B0A9CF01F01322FDD19B8C2282FF75C :1038F0001039C084FACAF944F4060036ED38FD8B5D :10390000C188410959F8E0890012F2CAFFFC510A46 :103910007209FAC6F944EC08003A2FF8F549FD8817 :10392000FB4806B4F1D9C008C04813B82FC95109E3 :10393000FB680660300E30083012FB6806BB502E64 :10394000E08F08C450A750800C9704950896029207 :10395000409410904041A5A3C0A850A750800C9758 :10396000049508960292409410904041EDB30005F2 :10397000C511FAF806B4403C580CC1E01036C064DA :10398000FACBF944F6060036C208FAC8F9501AD83C :10399000FAC8FAB80C9B1AD8FAC8FBB41AD8FAC9F4 :1039A000FFB4FAC8F940049A0A9CF01F01012FDD08 :1039B000781B7809C2B8EECAFFFF1037C0B4FAC945 :1039C000F9441497F2060036ECFBFD8CECF9FD8807 :1039D000C1D8410959F8E0890014F2CBFFF8510B26 :1039E000FAC6F944721BEC08003C7209F94BFD8CD5 :1039F000F949FD882FF81497FB4806B4C078F2C83F :103A0000FFF8721B1497510872091698FAE9000022 :103A1000CAE8EDB30004C171FAF806B4403E580E8E :103A2000C0801036C694FACCF944F8060036C8288F :103A3000EECAFFFF1037E0840081FACBF944F606A6 :103A40000036C778EDB30006C4B1FAF806B4403CBE :103A5000580CC1D01036C064FACBF944F6060036D3 :103A6000C1F8FAC8F9501AD8FAC8FAB81AD8FAC878 :103A7000FBB41AD8FAC8F940FAC9FFB4049A0C9BEF :103A80000A9CF01F00CB2FDD9818C268EECAFFFF1A :103A90001037C094FAC9F9441497F2060036ED08BD :103AA000FD8AC1A8410959F8E0890013F2CBFFFC57 :103AB000510B7209FAC6F944EC08003B2FF8F7499C :103AC000FD88FB4806B41497F1D9B010C05892187D :103AD00014972FC951095018BF585008C488FAF8D4 :103AE00006B4403C580CC1D01036C064FACBF9443F :103AF000F6060036C1F8FAC8F9501AD8FAC8FAB86A :103B00000C9B1AD8FAC8FBB4049A1AD80A9CFAC8B3 :103B1000F940FAC9FFB4F01F00A62FDD780BC248A8 :103B2000EECAFFFF1037C094FAC9F944F206003616 :103B30001497ECFBFD88C188410959F8E089001110 :103B4000F2CBFFFC510BFAC6F944720BEC080039BA :103B5000F34BFD882FF81497FB4806B4C058720B3E :103B600014972FC95109501BBF5B500BFAEA000094 :103B7000580A5C2BC0E43008FAEA00003009F00A69 :103B8000010AF20B014B32D8FAEB0000FB6806BBCE :103B90003018E08F071150A750800C9704950896B5 :103BA00002924094109040410E99EDB30003C4116D :103BB000FAF806B4403A580AC1901036C645FAC819 :103BC000F9501AD8FAC8FAB81AD8FAC8FBB40C9B3C :103BD0001AD8049AFAC8F940FAC9FFB40A9CF01F2F :103BE00000742FDD78165076C4882FF71039C0C4C2 :103BF000FACEF944FC060036ECFCFD8C507CECF669 :103C0000FD885056C668410959F8E0890010F2CA8B :103C1000FFF8721B510A7209FACAF944507B5059D5 :103C2000F4080039405B407AC47872185078C4C8F0 :103C3000FAF806B4403E580EC2301036C094FACCA2 :103C4000F944F8060036ECFBFD8C507BCD9BFAC89E :103C5000F9501AD8FAC8FAB8049A1AD8FAC8FBB4B4 :103C60000C9B1AD80A9CFAC8F940FAC9FFB4F01F95 :103C700000502FDD781A507A780C505CC2A82FF7CC :103C80001039C094FAC9F944F2060036ECF8FD8CFC :103C90005078CB6B410959F8E0890015F2CAFFF85A :103CA00072167209510A5059FACEF9445076FC083E :103CB0000039405B0C9AF2EBFD882FF8FB4806B404 :103CC000C088721C507CF2C8FFF851087209505924 :103CD000405B407AF01F00371896C1503008300919 :103CE000405B407AF01F0034C04032D8FB6806BB0E :103CF0004B284B36A7D3E0400047F00617A03032E0 :103D0000E08F06E7405B407AF01F002EC0C05026CF :103D10004AD84AE6A7D3E0400047F00617A0303261 :103D2000E08F06DD402A5BFAC04130695029C11896 :103D3000E04000475F09E04000675F08F3E81008D3 :103D4000F8081800C06040285808F9B80001502849 :103D500040784059FAE90694A9A3FAF8069458085D :103D6000C065405E300C506E509CC078405B32DACB :103D7000EE1B8000509A506BE04000465F09E04027 :103D800000665F08F3E810085048C0404022303910 :103D9000C228E04000455F09E04000655F084046FA :103DA0001049EC091800C1314022C148800330E4B9 :103DB0008003697880036FC08003F2408003F2447F :103DC00080032A7E8003F2488003F24C402EFCC21E :103DD000FFFF3029FAC8F95C1AD8FAC8F9541AD882 :103DE000FAC8F94C0A9C1AD80498409B40AAF01FC4 :103DF00001E0E04000475F19E04000675F18189657 :103E00002FDDF3E80008C041EDB30000C301EC0270 :103E1000000C503C404B580BC1500D893308F00941 :103E20001800C0B130083009406B407AF01F01D152 :103E3000FBB20001FBF20BAB403AFAF806AC100AF9 :103E4000503A406B30083009407AF01F01CAC090E8 :103E50004039FB4906A4C05810C9FB4806A4C02835 :103E60003309FAF806A4403E1C38CF73E0400047FF :103E70005F09E04000675F08F3E81008FAF906A45C :103E80000C1950695808C0B0FAF806AC5BD8C05598 :103E9000402C1838E08A006A2020C058E0400065B5 :103EA000E0890046FAFB06ACFB60069C201BFB4B3E :103EB00006ACC0475C3B32D8C02832B8FB68069DD0 :103EC000589BE08A001DFAC9FA3530AA12980E9C58 :103ED0000C92F60A0C060E9B2D0B10FB0C9B5896B1 :103EE000FE99FFF92D0B1897049610FBFACAF96298 :103EF000C038113B14CB1238CFD3C0982D0B3308E8 :103F0000FB6B069FFB68069EFACAF960FAC8F96463 :103F1000F408010850E81092406B1602581BE08923 :103F20000005EDB30000C3512FF2C338E040006636 :103F3000C1C1FAF206AC5802E08A000C402A580AC5 :103F4000C041EDB30000C2512FF240291202C0B8A7 :103F500040285808C061EDB30000C0303012C1984D :103F600040222FE23660C158FAF206AC406E1C3295 :103F7000C065EDB30000F7B200FFC0A8E40811026D :103F8000406C5802F00217A0F9B20901180236700D :103F9000409B580BE080059D32D8FB6806BBE08F44 :103FA000059C50A704950C970292089640414094B6 :103FB0000E99EDB30005C481FAF806B4403E580EE0 :103FC000C1D01036C064FACCF944F8060036C1D826 :103FD000FAC8F9501AD8FAC8FAB8049A1AD8FAC81E :103FE000FBB40C9B1AD80A9CFAC8F940FAC9FFB472 :103FF000F01F01612FDD780AC2082FF71039C08445 :10400000FACBF944F6060036ECFAFD88C16841099E :1040100059F8E0890010F2CAFFFC510AFAC6F944C7 :10402000720AEC080039F34AFD882FF8FB4806B401 :10403000C048720A2FC9510940BE1C98951EBF582E :104040009508FE9FFA7CEDB30004C480E2130040A3 :10405000C450FAF806B4403C580CC1D01036C064C5 :10406000FACBF944F6060036C1D8FAC8F9501AD886 :10407000FAC8FAB8049A1AD8FAC8FBB40C9B1AD832 :104080000A9CFAC8F940FAC9FFB4F01F013B2FDDC2 :10409000780AC2082FF71039C084FACAF944F40626 :1040A0000036ECFAFD88C168410959F8E089001032 :1040B000F2CAFFFC510AFAC6F944720AEC08003948 :1040C000F34AFD882FF8FB4806B4C048720A2FC98E :1040D000510940BEB40EFE9FFA32FAF806B4403CD5 :1040E000580CC1D01036C064FACBF944F60600363D :1040F000C1D8FAC8F9501AD8FAC8FAB8049A1AD826 :10410000FAC8FBB40C9B1AD80A9CFAC8F940FAC941 :10411000FFB4F01F01192FDD780AC2082FF71039FC :10412000C084FACAF944F4060036ECFAFD88C16886 :10413000410959F8E0890010F2CAFFFC510AFAC699 :10414000F944720AEC080039F34AFD882FF8FB485D :1041500006B4C048720A2FC9510940BE950EFE9F91 :10416000F9EE50A750800C9704950896029240945F :1041700010904041A5A3C0A850A750800C9704956B :1041800008960292409410904041EDB30005C5D1CD :10419000FAF806B4403C580CC2601036C0A4FACB02 :1041A000F944F6060036ECE8FD88FAE90000C1881B :1041B000FAC8F9501AD8FAC8FAB8049A1AD80C9B57 :1041C000FAC8FBB40A9C1AD8FAC8F940FAC9FFB475 :1041D000F01F00E92FDDF8EA0000FAEB00003008DC :1041E000E08F03E7EECAFFFF1037C0B4FAC9F94405 :1041F0001497F2060036ECEAFD88FAEB0000C1885D :10420000410959F8E0890018F2E60000F2CBFFF806 :10421000FAE70000510BFAC6F944EC080039FAE657 :104220000000F2E7FD882FF81497FB4806B44038E9 :10423000E08F03BFF2E600004038FAE700002F8964 :1042400014975109E08F03B5EDB30004C161FAF88A :1042500006B4403E580EC0801036C674FACCF944FD :10426000F8060036C808EECAFFFF1037C7F4FACBCD :10427000F944F6060036C768EDB30006C4A1FAF8A3 :1042800006B4403C580CC1D01036C064FACBF94497 :10429000F6060036C1F8FAC8F9501AD8FAC8FAB8C2 :1042A0001AD8FAC8FBB41AD8FAC8F940FAC9FFB448 :1042B000049A0C9B0A9CF01F00B02FDD9818C2686E :1042C000EECAFFFF1037C094FAC9F9441497F206FA :1042D0000036ED08FD8AC1A8410959F8E0890013AC :1042E000F2CBFFFC510B7209FAC6F944EC08003B13 :1042F0002FF8F749FD88FB4806B41497F1D9B010A0 :10430000C058921814972FC951095C785018C46886 :10431000FAF806B4403C580CC1D01036C064FACB51 :10432000F944F6060036C1F8FAC8F9501AD8FAC8A6 :10433000FAB80C9B1AD8FAC8FBB4049A1AD80A9C8B :10434000FAC8F940FAC9FFB4F01F008B2FDD780BD3 :10435000C248EECAFFFF1037C094FAC9F944F2060A :1043600000361497ECFBFD88C188410959F8E089B3 :104370000011F2CBFFFC510BFAC6F944720BEC08AA :104380000039F34BFD882FF81497FB4806B4C0584A :10439000720B14972FC95109501B300E500E1C98E8 :1043A000E08F030750A750800C970495089602925F :1043B000409440410E99FAF806B4403C580CC1D0E4 :1043C0001036C064FACBF944F6060036C1D8FAC8F4 :1043D000F9501AD8FAC8FAB81AD8FAC8FBB41AD8D9 :1043E000FAC9FFB4FAC8F940049A0C9B0A9CF01F62 :1043F00000622FDD7809C2182FF71039C084FACA7D :10440000F944F4060036ECF9FD88C178410959F801 :10441000E0890010F2CAFFFC510AFAC6F944720999 :10442000EC08003AF549FD882FF8FB4806B4C0585F :10443000F2C8FFFC510872093308FB6806B83788D8 :10444000300EFB6806B94CDC5019A1B3500E50DC9D :1044500030283780E08F02AD50A750801090300890 :10446000FB6806BB0C970495089602924094404165 :104470000E99FAF806B4403B580BC1D01036C06410 :10448000FACAF944F4060036C1D8FAC8F9501AD865 :10449000FAC8FAB81AD8FAC8FBB40C9B1AD8049A0E :1044A000FAC8F940FAC9FFB40A9CF01F00332FDDA7 :1044B0007806C2082FF71039C084FAC9F944F20609 :1044C0000036ECF6FD88C168410959F8E089001012 :1044D000F2CAFFFC510A7206FACEF944FC08003910 :1044E000F346FD882FF8FB4806B4C04872062FC972 :1044F0005109402C580CC105189A300B0C9CF01F28 :104500000020E08002E9F8060102402B1632E08923 :1045100002E3E08F02DE300A0C9C502AF01F0019E3 :104520001892E08F02DC50A750800C9704950896F3 :104530000292409410904041A5A3C0A850A750807B :104540000C97049508960292409410904041EDB368 :104550000005C611FAF806B440395809C2C0103631 :10456000C124FAC8F944F0060036C2E88003552C8D :1045700080036F32800330E48003EDE4800328A4DD :104580008002EDD0FAC8F9501AD8FAC8FAB81AD889 :10459000FAC8FBB41AD8FAC8F940FAC9FFB4049AA9 :1045A0000C9B0A9CF01F00C82FDDF8E80000FAE918 :1045B0000000C2E8EECAFFFF1037C0B4FAC8F944E1 :1045C0001497F0060036ECEAFD88FAEB0000C2080A :1045D000410959F8E0890016F2E60000F2CBFFF835 :1045E000FAE70000510BFAC6F944EC080039FAE684 :1045F0000000F2E7FD882FF81497FB4806B4C08846 :10460000F2E600002F89FAE70000510914973018EC :10461000E08F01CFEDB30004C161FAF806B4403E6B :10462000580EC0801036C674FACCF944F80600362D :10463000C808EECAFFFF1037C7F4FACBF944F606F4 :104640000036C768EDB30006C4A1FAF806B4403CD2 :10465000580CC1D01036C064FACBF944F6060036C7 :10466000C1F8FAC8F9501AD8FAC8FAB81AD8FAC86C :10467000FBB41AD8FAC8F940FAC9FFB4049A0C9BE3 :104680000A9CF01F00912FDD9818C268EECAFFFF48 :104690001037C094FAC9F9441497F2060036ED08B1 :1046A000FD8AC1A8410959F8E0890013F2CBFFFC4B :1046B000510B7209FAC6F944EC08003B2FF8F74990 :1046C000FD88FB4806B41497F1D9B010C058921871 :1046D00014972FC951095C785018C468FAF806B4C9 :1046E000403C580CC1D01036C064FACBF944F606F1 :1046F0000036C1F8FAC8F9501AD8FAC8FAB80C9BB3 :104700001AD8FAC8FBB4049A1AD80A9CFAC8F94015 :10471000FAC9FFB4F01F006C2FDD780BC248EECA57 :10472000FFFF1037C094FAC9F944F2060036149717 :10473000ECFBFD88C188410959F8E0890011F2CBF2 :10474000FFFC510BFAC6F944720BEC080039F34B2D :10475000FD882FF81497FB4806B4C058720B1497C5 :104760002FC95109501B300E3018500EC21950A7D6 :1047700050800C970495089602924D4C40941090EE :10478000404150DCEDB30005C551FAF806B4403B9A :10479000580BC2201036C0A4FACAF944F4060036F9 :1047A000ECE8FD88FAE90000CF58FAC8F9501AD8A9 :1047B000FAC8FAB8049A1AD80C9BFAC8FBB40A9C37 :1047C0001AD8FAC8F940FAC9FFB4F01F003F2FDD2C :1047D000F8EA0000C0C8EECAFFFF1037C0B4FAC93B :1047E000F9441497F2060036ECEAFD88FAEB000073 :1047F000CD18410959F8E0890016F2E60000F2CB25 :10480000FFF8FAE70000510BFAC6F944EC0800394A :10481000FAE60000F2E7FD882FF81497FB4806B48B :10482000CB98F2E600002F89FAE7000051091497AF :10483000CB18EDB30004C171FAF806B4403E580E2F :10484000C0801036C6C4FACCF944F8060036C85801 :10485000EECAFFFF1037E0840084FACBF944F60675 :104860000036C7A8EDB30006C4E1FAF806B4403C30 :10487000580CC1D01036C064FACBF944F6060036A5 :10488000C1F8FAC8F9501AD8FAC8FAB81AD8FAC84A :10489000FBB41AD8FAC8F940FAC9FFB4049A0C9BC1 :1048A0000A9CF01F00092FDD9818C2A8EECAFFFF6E :1048B0001037C0D4FAC9F9441497F2060036ED084F :1048C000FD8AC1E8800330E48003EDE4410959F832 :1048D000E0890013F2CBFFFC510B7209FAC6F944D0 :1048E000EC08003B2FF8F749FD88FB4806B4149705 :1048F000F1D9B010C058921814972FC951095C789B :104900005018C468FAF806B4403C580CC1D01036B0 :10491000C064FACBF944F6060036C1F8FAC8F9507B :104920001AD8FAC8FAB80C9B1AD8FAC8FBB4049A79 :104930001AD80A9CFAC8F940FAC9FFB4F01F00C996 :104940002FDD780BC248EECAFFFF1037C094FAC9BA :10495000F944F20600361497ECFBFD88C188410942 :1049600059F8E0890011F2CBFFFC510BFAC6F9446B :10497000720BEC080039F34BFD882FF81497FB48B5 :1049800006B4C058720B14972FC95109501B300E32 :10499000500E4008401C18485F18E7E80008C07037 :1049A0003308FB6006B9A1B3FB6806B830283009AC :1049B000FB6906BB402B580BC025A7D3402A4009F2 :1049C000580A5F1A4016FAC2F9780C495F19F5E9DE :1049D0001009C5C03019F2081800C0603029F2086B :1049E0001800C041C3C80496C3080496FAE8000042 :1049F000F5D8C0032D0A0CFAF00B1603F20C1603BF :104A0000F7E911DB1899169858085C29CF21FAE9C3 :104A10000000EDB30000C4513309F20A1800C410BD :104A20000CF9C3F8FAEA000030A83009F01F008E34 :104A300030A82D0A3009AC8AFAEA0000F01F008B7A :104A400016991498FAE900002016FAEA0000589A1C :104A50005C2BFE9BFFE91BF82D08C2080496FAE8C0 :104A60000000F5D8C00440DEFC0A070A0CFAF20B7D :104A70001604F00A1604F5E911CA16991498580894 :104A80005C29CF01FAE90000C0C85808C091EDB315 :104A90000000C061FAC6F9793308AC88C0280496D2 :104AA0000C12C1C850A7508040940C9710900495E8 :104AB00040415808E0800464FB680660300C300810 :104AC0003012FB6806BB502CFAC6F9A0C078300B38 :104AD000502BC0484022300A502A4029E4090C4992 :104AE000FB3806BB5039069E3009E21E0002F20870 :104AF0001800FBF81003F7B801FFFBF81A03069B38 :104B0000580EFBFC1003F7BC01FEFBFC1A03E21B72 :104B1000008450FE509BC451408A4039121A504ABA :104B2000580AE089001FC3D82F092FF84D0E310C09 :104B3000FB490690890E891CFB48068C5878E08951 :104B400000042F84C0B8FACAF978029B0A9CF01FAF :104B50000049E0810425FAC4F9E0404B210B504B99 :104B6000FAF90690FAF8068C4C1A404E590EFE9946 :104B7000FFDD1C092FF8890AFB490690891EFB48B6 :104B8000068C5878E08900042F84C0B8FACAF978F6 :104B9000029B0A9CF01F0037E0810402FAC4F9E08E :104BA0003009FB3806BBF2081800C1F0FAF806908D :104BB000FAC9F9452FF88909FB4806903019FAF827 :104BC000068C89192FF8FB48068C5878E089000478 :104BD0002F84C0B8FACAF978029B0A9CF01F0025FE :104BE000E08103DEFAC4F9E040FC580CC1F0FAF8A9 :104BF0000690FAC9F9482FE88909FB480690302940 :104C0000FAF8068C89192FF8FB48068C5878E08949 :104C100000042F84C0B8FACAF978029B0A9CF01FDE :104C20000015E08103BDFAC4F9E0409BE04B008031 :104C3000C511408A4039121A504A580AE089002B9F :104C4000C4982F092FF848CE310CFB490690890EE5 :104C5000891CFB48068C5878E08900102F84C178A5 :104C6000800330E4800373408002D9988003F250BF :104C7000800334048003F260FACAF978029B0A9C2C :104C8000F01F004CE081038CFAC4F9E0404B210B8B :104C9000504BFAF90690FAF8068C4C7A404E590EB1 :104CA000FE99FFD11C092FF8890AFB490690891E3D :104CB000FB48068C5878E08900042F84C0B8FACAF3 :104CC000F978029B0A9CF01F003BE0810369FAC45B :104CD000F9E0402C041C502C580CE089001FC3D86C :104CE0002F092FF84B4B310AFB490690890B891A83 :104CF000FB48068C5878E08900042F84C0B8FACAB3 :104D0000F978029B0A9CF01F002BE0810349FAC44A :104D1000F9E0402921095029FAF90690FAF8068CA1 :104D20004A5A402E590EFE99FFDD1C092FF8890AB8 :104D3000FB490690891EFB48068C5878E0890004E0 :104D40002F84C0B8FACAF978029B0A9CF01F001998 :104D5000E0810326FAC4F9E0EDB30008C0B0FAF828 :104D6000069089128906F0020002FB420690E08F4D :104D700001DBE0400065E08A01DD30083009405B7E :104D8000407AF01F000EC7E0FAF8069048C92FF8E5 :104D90008909FB4806903019FAF8068C89192FF812 :104DA000FB48068C5878E089000D2F84C14800002C :104DB000800334048003F26080036F328003A6C056 :104DC000FACAF978029B0A9CF01F0078E08102E899 :104DD000FAC4F9E0FAF806AC406C1838C055EDB3E7 :104DE0000000E081026DFAF806902FF840CBFB48F6 :104DF00006903019FAF8068C890B2FF88919FB48B0 :104E0000068C5878E08900042F84C0B8FACAF97873 :104E1000029B0A9CF01F0065E08102C2FAC4F9E01F :104E2000406620165806E089001DE08F02492F09D0 :104E30002FF8FB49069089028910FB48068C5878A8 :104E4000E08900042F84C0B8FACAF978029B0A9C52 :104E5000F01F0056E08102A4FAC4F9E02106C03830 :104E60004D323100FAF90690FAF8068C4D0A5906CF :104E7000FE99FFDF0C09890AFB4906902FF8891675 :104E8000C559FAFA06AC580AE0890096FAF8069075 :104E90004C892FF88909FB4806903019FAF8068CDE :104EA00089192FF8FB48068C5878E08900042F8474 :104EB000C0B8FACAF978029B0A9CF01F003CE08156 :104EC000026FFAC4F9E0FAF806AC5808C081406AEB :104ED000580AC051EDB30000E08101F240C9FAF870 :104EE00006902FF88909FB4806903019FAF8068CCD :104EF00089192FF8FB48068C5878E08900042F8424 :104F0000C0B8FACAF978029B0A9CF01F0028E08119 :104F10000247FAC4F9E0FAF206AC5C325802E089C2 :104F2000001DC3B82F092FF8310EFB4906908900E8 :104F3000891EFB48068C5878E08900042F84C0B88D :104F4000FACAF978029B0A9CF01F0018E081022837 :104F5000FAC4F9E02102C0284950FAF90690FAF89B :104F6000068C493A5902FE99FFDF04092FF8890A95 :104F7000FB4906908912FB48068C5878E0890004AA :104F80002F84C0B8FACAF978029B0A9CF01F000768 :104F9000E0810206FAC4F9E0406CFAF8069089064E :104FA000891C1808CBE80000800334048003F260F9 :104FB0008003A6C0FAF90690FAF8068C406B163A00 :104FC000C6D516092FF88906FB490690891BFB48B0 :104FD000068C5878E08900042F84C0B8FACAF978A2 :104FE000029B0A9CF01F006FE08101DAFAC4F9E02D :104FF000FAF606AC406A14165806E089001CC3B8DD :105000002F092FF8FB49069089028910FB48068C6E :105010005878E08900042F84C0B8FACAF978029B56 :105020000A9CF01F0060E08101BBFAC4F9E0210690 :10503000C0384DD23100FAF90690FAF8068C4DAA24 :105040005906FE99FFDF0C092FF8890AFB490690E3 :105050008916FB48068C5878E08900042F84C0B874 :10506000FACAF978029B0A9CF01F004EE081019871 :10507000FAC4F9E0EDB30000E081012240C9FAF87A :1050800006902FF88909FB4806903019FAF8068C2B :1050900089192FF8FB48068CC04914092FF8FB49E1 :1050A00006908906891AFB48068C5878E089000426 :1050B0002F84C0B8FACAF978029B0A9CF01F003905 :1050C000E081016EFAC4F9E040C88908FAF8069058 :1050D0002FF83019FB4806908919FAF8068C2FF83A :1050E000FB48068CFAF206AC5878E08900042F845D :1050F000C0B8FACAF978029B0A9CF01F002AE08126 :10510000014FFAC4F9E00406FAF806AC8906FAF988 :1051100006904066406E1016F208010889161C08B9 :10512000FB480690FAF8068C2FF8FB48068CCB98C3 :10513000406C581CE0890006EDB30000E081008758 :10514000FAF806902FF83019FB4806908906FAF80D :10515000068C89192FF8FB48068C5878E0890004E2 :105160002F84C0B8FACAF978029B0A9CF01F000D80 :10517000E0810116FAC4F9E0FAF806902FF840CB66 :10518000FB4806903019FAF8068C890B2FF889191C :10519000FB48068C5878E08900092F84C10800007C :1051A000800334048003F260FACAF978029B0A9CF7 :1051B000F01F006FE08100F4FAC4F9E03008300914 :1051C000405B407AF01F006B40682018580CC0D13B :1051D0002FF689188906FAF606901006FAF8068C5A :1051E000FB4606902FF8C2F810965808E089001C7C :1051F000C4982F092FF8FB49069089028910FB48B3 :10520000068C5878E08900042F84C0B8FACAF9786F :10521000029B0A9CF01F0056E08100C2FAC4F9E02C :105220002106C0384D423100FAF90690FAF8068C92 :105230004D1A5906FE99FFDF0C09890AFB490690B1 :105240002FF88916FB48068CC0E8FAF806902FF86C :105250003019FB4806908906FAF8068C89192FF850 :10526000FB48068C5878E08900042F84C0B8FACA3D :10527000F978029B0A9CF01F003EE0810091FAC47D :10528000F9E040EAFAF806901408FAC9F964FB4814 :105290000690891AFAF8068C89092FF8FB48068CC3 :1052A0005878E08900042F84C0A8FACAF978029BD4 :1052B0000A9CF01F002FC731FAC4F9E0E213000482 :1052C000C3D04086403912165806E089001AC368D8 :1052D0002F092FF8FB49069089038912FB48068C99 :1052E0005878E08900042F84C098009A029B0A9C99 :1052F000F01F001FC541FAC4F9E02106C05849F368 :105300003102FAC0F978FAF90690FAF8068C49BA2F :105310005906FE99FFDF0C092FF8890A8916FB4907 :105320000690FB48068C5878E08A0009FACAF9789A :10533000029B0A9CF01F000EC32140BC4036408EE9 :10534000EC0E0C48100C50BCFAF806905808C080BF :10535000FACAF978029B0A9CF01F0005C201300BC3 :10536000FAC4F9E0FB4B068CFE9FF0E9800334049D :1053700080036F328003F2608003F250FAF80690E7 :105380005808C0800A9CFACAF978029BF01F0009ED :10539000C0613008FB48068CC02840418268EDB8E7 :1053A0000006C0313FFA50BA40BCFE3DF944D83245 :1053B00080033404D42116981897109C3008149B4D :1053C0004866129A8D08F01F00065BFCC0516C08FD :1053D0005808EFF81A03D82200008CC48002F1505C :1053E000D421300818974876169C8D08F01F0006C7 :1053F0005BFCC0516C085808EFF81A03D822000073 :1054000000008CC48002F108D431202D1897784810 :1054100076460C38C034300CC858ECC2FFFCF6C3DA :10542000FFECF6020329F802032C2FF92016F809E5 :105430000D08F6020022EEC4FFEC10955808C410C7 :105440003009069A08981291500B700EB18E501EBA :10545000150EFC001610FDDEC010EA0E0341FDD152 :10546000C010B181401BEA000240E2000000E3D01E :10547000C010021B501B700BE3DBC0100209F20EC0 :10548000010EB01EFC091410401EFC090009B009F1 :10549000E00116102FC8B149043AFE98FFD8400B1E :1054A000580CC0F1ECC8FFFBEE080028C0282016FD :1054B00020480838E088000570095809CF908F46C9 :1054C0000E9CF01F001AC2D52FF508983009070B63 :1054D000F60A1610700CF7DBC010F80E1610141E2A :1054E000F5DCC010161A120AB01AB14AFC0A0009FB :1054F000B0092FC8B1490433FE98FFEBECC8FFFB9D :10550000EE0803295809C0D1EE080028C02820164B :1055100020480838E088000570095809CF908F4668 :105520000A9C2FEDD8320000800363EED43121AD08 :10553000FAC4FF7418971695682C50C96816680944 :1055400050E81494512CFAE5000851596E9558050D :10555000C091310CF01F004799358F9C9915992502 :1055600099056E9972085808C0F0721A911A301A8B :105570007219F4090949109B91290E9CF01F003EF5 :105580006E9830099109402810945808C064F1D8E9 :10559000C01F50283018C02830088D08FC1C7FF030 :1055A00040260C98E6187FF01838C1C1E068270F34 :1055B000415B9708403A580AC061EDD6C014C0312B :1055C0004AECC0284AEC41295809E08005DEF8C8B9 :1055D000FFFD3009118AF20A1800C190F8C8FFF8DF :1055E000C168FAEA00083008FAEB003C3009F01F05 :1055F0000025C1103018415A950841294A285809F8 :10560000C041109CE08F05C1109C2FF841258B08EC :10561000E08F05BBFAC8FF9CFAC9FFA0FAEA003C7C :105620000E9CEBD6C28BF01F001918935805C0D002 :10563000FAEA003C3004F1DBC014EAC503FF109B1A :105640005174EA1B3FF0C3284188419C100CF8C5F7 :10565000FBCEE0450020E08A001BF8CCFBEE403B8F :10566000EA081140F60C0A4CEC0809460C4CC148FB :105670008002E2A4800364208003F3708003F37C43 :1056800080036F328003A6C0800364D0EA0C11202F :10569000403AF40C094CF01F006BFC18FE10301956 :1056A000EAC50433F00B000B51793008FC193FF8C0 :1056B000F01F0065E0684361EA18636FE06987A73F :1056C000EA193FD2F01F0061E068C8B3EA188B60A6 :1056D000E0698A28EA193FC6F01F005D0A9C149011 :1056E0001691F01F005CE06879FBEA18509FE069B2 :1056F0004413EA193FD3F01F005514981699009AE5 :10570000029BF01F005314901691F01F00533008B5 :1057100018963009009A029BF01F0050C0C00C9CE4 :10572000F01F004C14981699009A029BF01F004C31 :10573000F7B600015966E088000530185148C128C5 :105740004C88FAEA003CF0060238F01F0044F9B435 :105750000000FBF40A14F7B60101F9BC0100FBFCE0 :105760001A14419020100A10C04650403000C04822 :10577000300B5C30504BEC0211005806FBFA400431 :10578000F5D6E40AFBFA4A04FBF64A11F9B2040022 :10579000E1D6E510F9B90500FBF95A1140C858984F :1057A000E08B00205858F9B40A01FBF5900CF7B5CE :1057B0000904FBF59A0CF9B4090040CC583CC2D05E :1057C000E0890005582CC101C18840CB584BC0600E :1057D000585BC0A1301A50DAC228301950D9C0F82D :1057E0003008301450C83FF5301C300B509550DC59 :1057F0000A91312850EBC208300A50DA40E95809C2 :10580000E089000730185098109150E8C15840E5E1 :1058100050950A910A98C108300C50DC40EBEC0B13 :10582000000B509B16982FF85808E089000510913E :105830003018C028109130096E9A95193049C178F6 :1058400080036E4A80036B7C800369A480036D181B :1058500080036E5280036E2480036FC080036F321A :105860008003F38C6A1AA1792FFA8B1A6E95F2CA0B :10587000FFEC103AFE98FFF86A1B0E9CF01F0053D5 :1058800058E15F888B0CF1E400046E987008508832 :10589000E08001985806E08A0040F3D6C0044CC866 :1058A000F0090234FAE50018EC041404EDB4000425 :1058B000C0303025C0F84C78F0E80020FAEA003C0F :1058C000E9D4C004F01F0044303514981699FAE961 :1058D00000084C0C50A30C931896C0F8FAEA001874 :1058E000EDB40000C081ECE800002FF5F01F003B94 :1058F000FAEB0018A1542F865804CF11FAE80018CB :10590000FAEA00080696F01F003440A3149816998E :10591000FAE90008C2D8EC081100C0313025C2886D :105920004ACCF0041404501CF1D8C0044A89FAEAA5 :10593000003CF2080238F01F0029401C506330255B :105940000C93FAEB00081896C0F8FAEA0008EDB4D8 :105950000000C081ECE800002FF5F01F0020FAEBFA :105960000008A1542F865804CF1106964063414A7F :10597000580AC370FAE8000858015F94FAE9001861 :105980003008FC193FF0FAEA0018F01F0015F9BCC6 :105990000000F9BC0101E9EC000CC2304098580845 :1059A000E08A010C3008FC194024ECC40001FAEA3A :1059B00000182FF55064F01F0009409414981699B0 :1059C000FAE90008C1080000800364588003F38CE2 :1059D0008003F45480037028800369A480036FC09F :1059E000506602940A9CF01F0069FAE80008F01F54 :1059F00000683008FC19401CF01F006614981699C6 :105A0000FAE90028FC18FCC040A5100550A5580470 :105A1000C211FAEA00083008FC194014F01F005EB9 :105A200040BCFAEB000814981699189A0A9BF01FCC :105A3000005BE08102740A9840B9EE188000FAEA2F :105A40000008109512980A99F01F0054E081025E38 :105A5000CB484D39E8C8000140D55805C4F0300C9A :105A6000F2080238513C300AFC1B3FE0F01F004DA9 :105A7000FAE800284085F01F0048FAEB0028FAEA0F :105A80000008F01F0049516CF01F0040149816994F :105A9000FAEA0008F01F0040FAEB000841682D0800 :105AA0000AC841392FF95139FAE80028F01F003BA4 :105AB000E081035AFAE80008300AFC1B3FF0F01FAF :105AC0000036FAE80028F01F0035FAEA002830080E :105AD000FC194024E08100E8413C083CC6E4F01F8A :105AE000002C3008FAEB0028FC194024FAEA0008E0 :105AF000F01F0027FAEB0008CC3B40850805F208B0 :105B0000023A5135FAE800284085F01F0021FAEBEF :105B10000028FAEA0008F01F0024516CF01F001B57 :105B200014981699FAEA0008F01F001BFAEB000817 :105B300041682D080AC8413C1835C3713008FC196A :105B40003FE0FAEA0028F01F00134085FAE8000859 :105B50000805F01F0012E08100A7FAE80028300ACB :105B6000FC1B3FE0F01F000C14981699FAEA00089D :105B7000F01F000AC22033090A98117AF20A1800AD :105B8000E08102F21095CF9B80036E52800369A4DE :105B900080036D1880036B7C80036FC08003F38CDF :105BA0008003702880036E243008FC194024F01F05 :105BB0000056FAEB0008CAEBFAEA003CFAEB0008E0 :105BC00058E65FAB418A3008F40911FFF7E903F9A1 :105BD000F0091800E080008140EA58015FA9F3EA6B :105BE00003F94CAAF4060234FAE50010F009180093 :105BF000C1405801E081018A3008FC194014089A1C :105C00000A9BF01F0041FAE80008F01F0041E08104 :105C1000017D0292E08F018540853014FAE8001082 :105C2000FAEA0008F01F003BF01F003B1892F01F3B :105C3000003BFAE80010F01F003414981699FAEAB5 :105C40000008F01F0037FAEB0008E4C8FFD00AC8CC :105C5000FC19402430080234C331FAE80008F01F70 :105C600000311691149014980299FAEA0010F01F6E :105C7000002EC1A1FAE80010009A029BF01F002B31 :105C8000E0800271E5D2C001C0F1E08F026C408A71 :105C90001438C0301095C098330840892FF6B28868 :105CA0004088C088406633990A98117AF20A180031 :105CB000CEF0506611892FF9B089E08F0255F01FA0 :105CC00000122FF4FAEB000830083009F01F00171B :105CD000CA60E08F024840D85808C0510498009527 :105CE00040D4C4A840C55815E08900224174580426 :105CF000C040F4C9FBCDC0484199F209113604985F :105D00000095C2F8800369A48003F38C80036F5868 :105D10008003702880036E2480036E5280036B7CA6 :105D200080036D1880036FC080036F32E2C80001EA :105D30005801E0051740E2091740E1D1E515F9B92E :105D400005001032E5D8E418F1D2E518E5D8E502EF :105D5000FBFC5011F9D8E50CFBFC5A11F9B8050011 :105D6000404B120B5008504B1200301B0E9CF01F82 :105D7000010840081894404A58055F99580A5F9AEC :105D8000F5E90009C080404CF8050D49121C1210BD :105D9000504C12155802E08A002740DB580BC1D046 :105DA0005808E08A0017109A5008089B0E9CF01FB4 :105DB00000F9069A189B18940E9CF01F00F718998A :105DC000069B50190E9CF01F00F5401940081293D5 :105DD000E408010AC080C028049A069B0E9CF01FAC :105DE00000ED1893301B0E9CF01F00E9411A189229 :105DF000580AE08A0007189B0E9CF01F00E61892D4 :105E000040C95819E089001440385808C101402998 :105E1000F1D9C014C0C11298E6187FF0C080404C80 :105E2000301B2FFC2FF0504C506BC038300A506A9A :105E300041195809C031301CC09864482FC8E40883 :105E4000032CF01F00D7F80C1120404BF80B000872 :105E5000F1D8C005C0C0F00811205848E08A0006FB :105E60002048100B504BC0785848C070404A2E480C :105E7000100A504A100010055800E08A0008069BDE :105E8000009A0E9CF01F00C7189340495809E08AF9 :105E90000008049B129A0E9CF01F00C21892414801 :105EA0005808C1B0049B069CF01F00BFC164069B4C :105EB000300930AA0E9CF01F00BD2016189340DC5C :105EC000580CC0314091C098089B4091300930AACD :105ED0000E9CF01F00B6189458015FA940CB582BB8 :105EE0005F98F3E80008C2505801C111049B029961 :105EF000305A0E9CF01F00AD1892189B069CF01FA4 :105F000000AAE089000FC0383002049440EA30094A :105F10005CDA4085506A5049C0F9089240660494A2 :105F20002FF65066331840850AC830085048C049DB :105F300040DC580CE08000B55805E08A0008089B5A :105F40000A9A0E9CF01F00971894406B580BC031B2 :105F5000089CC138681B0E9CF01F0095684A189574 :105F6000E8CBFFF42FEA2F4CA36AF01F00920A9BA4 :105F7000301A0E9CF01F008B5044403A3019F5DA6D :105F8000C001189450DA40855099502650E1049B86 :105F9000069CF01F0089404BF8C0FFD0069CF01F04 :105FA0000082089A506C049B0E9CF01F008418918C :105FB00078385808C0303016C068189B069CF01F0F :105FC000007A18960E9C029BF01F007440CCEDECFA :105FD0001008C0D140DB580BC0A14026E04000397A :105FE000C300406A580AE0890024C2F84069580991 :105FF000C085129840CC1848C1D140DB580BC1A1D4 :106000000C9940265809E08A0021069B301A0E9C04 :10601000F01F0064049B1893F01F0063E0890006E2 :10602000C141EDB00000C111E0400039C0A02FF027 :10603000C0C85806E08A000C4026E0400039C04144 :1060400033980AC8C6782FF00AC0C7580AC0409AC9 :1060500040E9123AC430069B300930AA0E9CF01F6A :106060000053404818930838C091109B300930AA5B :106070000E9CF01F004E504CC0E8404B300930AA37 :106080000E9CF01F004A089B504C300930AA0E9C11 :10609000F01F00461894409C2FFC509CC79B301862 :1060A0000690408508930C941096049B009CF01F6A :1060B00000422D0C0ACC0236C0A4009B300930AA45 :1060C0000E9C2FF6F01F00391890CF0B0896300B5E :1060D0000694504B00931890C0284026069B301A17 :1060E0000E9CF01F0030049B1893F01F002FE089D6 :1060F0000012C1B1E1D0C001C0D1C17840891238CD :10610000C0301095C0882FF650663318408CB88880 :10611000C138339A0A981179F4091800CF002FF981 :10612000B089C0981095C02833090A98117AF20AEC :106130001800CF905066049B0E9CF01F0018580466 :10614000C120404B083B5F19580B5F18F3E800086B :10615000C0400E9CF01F0011089B0E9CF01F000F0A :10616000C02850660E9C069BF01F000C3008AA88C1 :106170004068415A2FF841299508408C5809FBF88E :106180001012F1F51A002E6DD8320000800368005D :10619000800368A0800366F88003642080036300A6 :1061A00080036664800363EE80036818800364588C :1061B0008002E736800354088003658C5EFC5EFC39 :1061C000D42118961697580BC0311695C508F01FA4 :1061D00000295806C0706C685808C0410C9CF01F1C :1061E00000264A681037C0316C07C0A84A481037EB :1061F000C0316C17C0584A381037EDF700028E696D :106200003008F0091900C051F01F001F3005C2F816 :106210000E9B0C9CF01F001D6EC818955808C0609E :106220006E8B0C9C5D18F9B505FF8E68EDB8000704 :10623000C0516E4B0C9CF01F00166EDB580BC0A0BB :10624000EEC8FFBC103BC0400C9CF01F0011300892 :106250008FD86F2B580BC0700C9CF01F000D3008AE :10626000EF4800483008AE68F01F00070A9CD822AB :1062700080031E7480031F388003EF2C8003EF4CD3 :106280008003EF6C80031E7680031D2C8003217C2D :10629000D4014848189B700CF01F0003D80200007E :1062A00000000598800361C0D42116981897109CAF :1062B00030084876149B8D08F01F00065BFCC05127 :1062C0006C085808EFF81A03D822000000008CC4AC :1062D0008002F198D42116981897109C3008149BCE :1062E0004866129A8D08F01F00065BFCC0516C08CE :1062F0005808EFF81A03D82200008CC48002F1205D :106300001898E01C0000F0091510580CF20817004E :10631000F9BC0010F9BC0100109AF0091508E61A42 :10632000FF00F7BC00F8F2081700109AF0091504F6 :10633000E61AF000F7BC00FCF2081700109AF0090A :106340001502E61AC000F7BC00FEF2081700580854 :106350005E5CEDB8001EF9BC0120F7BC00FF5EFCDE :1063600018997808F9D8C003C150EDB80000C021D1 :106370005EFD109BF00A1601E21B0002A388580B79 :10638000F3FA1A00F9BC0101F3F80A00F9BC0002A3 :106390005EFCF5D8C010F00B1610580AF60817006E :1063A000F9BC0010F7D8C008F00A1608580BF7BC63 :1063B00000F8F4081700F7D8C004F00A1604580BC8 :1063C000F7BC00FCF4081700F7D8C002F00A160268 :1063D000580BF7BC00FEF4081700EDB80000C060D1 :1063E000A198C031320C5EFC2FFC93085EFCD401F6 :1063F00018987649784C121CC1312FB9A369120B39 :10640000F00900092EC8134E174A143EC060F9BCAB :1064100003FFF9BC0201D8021039FE9BFFF6D80237 :10642000D4211897169578965806C091310CF01F14 :10643000000A99368F9C9916992699065805C0909E :106440006A196E987038F009032A8B0AF009092539 :10645000D82200008002E2A4D421189716967895DD :106460005805C091310CF01F001999358F9C991572 :10647000992599056E956A385808C0B1310A304B94 :106480000E9CF01F00138B3C6E98703C580CC1B0F2 :106490006E987038F0060028700C580CC0407809CF :1064A0009109C0E80E9C30170E9BEE060947EECA14 :1064B000FFFBA36AF01F0006C060991699273008F9 :1064C00099389948D82200008002E2A48002DC5466 :1064D000D431202D1693129610951492301BF01F74 :1064E0000029F3D3C0145009F1D3C01FF0011614D2 :1064F000FC1A0010F3DAE139FBF91A00189458027B :10650000C1E0FACCFFF818D2F01F001F4018C0D02D :106510004009F80A1120F20A094AF5E810088958DA :10652000F20C0A495009C028895840085808F9B3A4 :106530000102F9B3000189688943C0981A9CF01FD1 :106540000012301340082E0C894389585801C0901E :10655000E2C1043318018D01F80C11358B0CC0D841 :10656000E6C8FFFCF8CC0432A5738D0CE808032CB8 :10657000F01F000618138B03089C2FEDD832000083 :10658000800364588003636080036300D4317448DF :106590007645169714961015C1312FB8EECEFFEC44 :1065A000A368F408000BEE080008114A1749123AD4 :1065B000C030C0E2C0781C38FE9BFFF9C4A8580563 :1065C000C0640E9830150C971096C02830056E1BCD :1065D000F01F00246E496C4499352FB4F2C5FFFBBF :1065E000EC040024EE0500252EC62EC7F8C8FFECEB :1065F000300A0F0E0D0BFC021610F6031610FDDE0E :10660000C010E4030103F7DBC010FC0B010BF60A1A :10661000000AB01AB14AE60A000AB00A2FC8B14A05 :106620000836CE83C0D80F0BF60E1610F7DBC0105D :10663000160AB01AB14A1C0AB00A2FC8B14A0A3762 :10664000CF33C0282019114A580ACFD09949D832DF :10665000300BF01F00043018994830089958D83290 :1066600080036458D43116977646F40214052FF649 :10667000149318940406761B6E28C0382FFBA1785B :106680001036FE99FFFD089CF01F001A300918957E :10669000F8C8FFEC129AC03810AA2FF90439CFD5E8 :1066A0006E4BE7D3C0052FBBEEC9FFECEE0B002B02 :1066B0005803C130E60C1120300A7202E40309428B :1066C000044A10AA130AF40C0A4A1639CF73910A25 :1066D000580AC0702FF6C058130A10AA1639CFD323 :1066E000089C20160E9B8B46F01F00030A9CD83294 :1066F0008003645880036420D431202D7649744887 :10670000169614951039EC081750EA061750F00544 :1067100017506C2876437442761BE4030007103749 :10672000F7BB09FFF01F0036EEC4FFFBF8C9FFEC12 :10673000F8040024300A1298C02810AA0838CFE3C1 :106740002FB32FB2EC030023EA020022ECCBFFECC4 :106750005012EACAFFECC44894955805C20012983A :106760001696300E50090D02E400161070017009E3 :10677000B181E5D2C010E0050341AB32E1D9C010D0 :106780000002E40E000EB01EB18E1C01B001E20E3C :1067900016102FC80636CE834009910E94865806EF :1067A000C1D072021298169E3005B0121D0190825F :1067B000E1D1C010AD30E0020002E4050005B005F3 :1067C000B185B1812FC8AD319092E20200020A0278 :1067D000E4051610063ECEA391022FCA2FC9401819 :1067E000103ACBB3C02820175807E08A00050948A3 :1067F0005808CFA099472FEDD83200008003645885 :10680000D4211697301BF01F00043019995799496D :10681000D822000080036458D431300812951697AE :1068200018967644F6C9FFEC720BF60C1610F7DBDF :10683000C010F40C024CF40B0345F7D5C010B18521 :106840001805EA0C1510F80B000B12AB2FF8B185E8 :106850000838CEB55805C1D06E281034C1456E1B1E :106860000C9C2FFBF01F000C6E4AEECBFFF418932C :106870002FEA2F4CA36AF01F00090E9B0C9CF01FFF :1068800000080697E8C8FFFF2FB48F48EE040925DB :106890000E9CD832800364588002E736800364205F :1068A000D431149618971694F1DAC002C0902018CB :1068B0004A19F208032A3009F01F00201894A34651 :1068C000C3706E955805C091310CF01F001D9935AD :1068D0008F9C9915992599056E9366255805C0D109 :1068E000E06B02710E9CF01F0017872C3008189582 :1068F0009908C038069C1895EDB60000C0C1089BE9 :106900000A9A0E9CF01F0010089B18930E9C069488 :10691000F01F000EA156C0C06A035803CEC10A9AE8 :106920000A9B0E9CF01F00088B0C9903CE5B089C01 :10693000D83200008003F380800368188002E2A44C :1069400080036800800366F880036420D4211698D1 :106950001897109C3008149B4866129A8D08F01FF7 :1069600000065BFCC0516C085808EFF81A03D822E7 :1069700000008CC48002F1381498FC197FF0F5DB1C :10698000C01FF00B1100F7E81008F5E813F8F20843 :106990000108F00C1100F9E81008F00C141F2FFC8E :1069A0005EFCD703F5EB101CE08000DCD421F7E996 :1069B000200EEFDBC28B3015C430AB6BF7EA136BE4 :1069C000AB6AF7D5D3C2EDD9C28BC5C0A1785CF94B :1069D000F3D5D2ABE04707FFC770E04607FFC740DB :1069E000EE06000CE02C03FEF6080644F40907440A :1069F000F4080646F609064A0807F405004A5C0B47 :106A0000EDBB0014C050A1775CFA5CFB201C580C55 :106A1000E08A006FE04C07FFE084009CF7DCD28B3B :106A2000EDEA11F6EFE61217EE178000F1B7042039 :106A30000E0A5C0BEDBE001FEFBB001FD822E41B4B :106A4000000FF40C1200F6061200F7BC03E1F80682 :106A50001730F7B60201E0460020C0D4EC0C11203C :106A6000F606094BF40C0A4C184BF406094A20B6FA :106A70000C17CAABF406094BC640300A20B60C17F7 :106A8000CA3BE419000FF00C1200F2051200F7BC2B :106A900003EAF8051730F7B5020AE0450020C0D434 :106AA000EA0C1120F2050949F00C0A4C1849F005CE :106AB000094820250A16C8FBF0050949C4203008FA :106AC00020250A16C88BE419000FE41B000F144B95 :106AD0001049E04707FFC091580BC381E04607FF0C :106AE000C3815809C360C3285809C330C2F85C3C4D :106AF0002FFCF1BC04C0E04C0020C114F8081120A8 :106B00000E46EE0C0A47F40809491247F40C0A4AEB :106B1000F6080949124AF60C0A4BC83BF80811203E :106B2000F9B90000C030F60809490E46EDEA101622 :106B3000F40C0A4AF3EA1007F60C0A4A300BC71B9A :106B40001C9BE61B8000300AD8223FFB3FFAD8226C :106B5000F06B0000EDBE001FEFBB001F300AD82213 :106B6000F7E9200BE61B8000F9D9C28BE04C07FF48 :106B70005E1C3FFA3FFB5EFCEE198000F7E9200C3B :106B8000E08600CAEBCD40E0169CE61C8000BFDB2F :106B9000BFD9103AF20B1300C0921697129B0E99B0 :106BA0001497109A0E98EE1C8000F6071614AB7B13 :106BB000F7EA135BAB7ABFBBF2061614C440AB799D :106BC000F3E81359AB78BFB9E04707FFC4F00E26CE :106BD000C120EC051120E0460020C7C2F005094E97 :106BE000F2050945F0060A48F2060A490A48580E15 :106BF0005F1E1C48101AF609014BF6061200C0E091 :106C0000C783EC0E1120F606094BF40E0A4E1C4BFE :106C1000F406094A0C17E08A0039F4091515AB9AF5 :106C2000F5EB115AAB9BF7D7D28B184BFC178000B2 :106C3000EDBA0000F7B701FF0E395F29120A5C0BAD :106C4000E3CD80E0AB79F3E81359AB78F3E8100EAD :106C5000F9B60101EE0E1100F9B70001EFBB001FFC :106C6000F7EA100EF9B70000CB0BBFDBF7EA100E06 :106C7000C081E04607FFC050F9E7114BE3CD80E04B :106C80003FFA3FFBE3CD80E05C372FF7F1B704C05C :106C9000E0470020C114EE081120F40809495F16EE :106CA000F4070A4A0C4AF6080949F5E9100AF407FC :106CB0000A4B3007CB3BEE081140F608094914494E :106CC0005F16F6070A4A0C4A300B3007CA7BE3CD41 :106CD00080E0F1B604C0F00E1700C040F205094E86 :106CE000104EF2060A483009580E5F1E1C48C83B79 :106CF000F4061200F9B70300F9B60300F9BC03006B :106D0000F7B602E0F406094B300A0C17FE9AFFBEF4 :106D1000C85B0000EE198000F7E9200CFE96FF2EFC :106D2000EBCD40E0169CE61C8000BFDBBFD9123BD8 :106D3000C0721697129B0E991497109A0E98300EE7 :106D4000EFDBC28BF7DBC014B5ABEDD9C28BC5F05E :106D5000F3D9C014B5A9E04707FFC2500E26C0F012 :106D6000EC051120E0460020C352F005094EF20563 :106D70000945F0060A48F2060A490A48100AF609C7 :106D8000004BEDBB0015C340F7D7D28B184BF9DA97 :106D9000C001184EEE1E8000F1BE04201C0A5C0BE0 :106DA000E3CD80E0B5CBF7EA100EC101E04607FF66 :106DB000C030E3CD80E0B5C9F3E8100EC071300AF1 :106DC000FC1B7FF0184BE3CD80E03FFA3FFBE3CDA7 :106DD00080E0F1B604C0F00E1700C060F205094E65 :106DE00058085F18104EF2060A483009CC8BFDEEA9 :106DF000101EA19B5D0A5D0E2FF7E04707FFF9BA51 :106E00000000F9BB0000F9BE0000CBFB30165807AC :106E1000CA31B5CB100AF609004B184BE3CD80E020 :106E2000580B5E6DF60C1501B59CE02C03FF5E3D22 :106E3000F80C111F1699AB7BBFBBF7EA135BF60C7E :106E40000A4BA1795E2B5C3B5EFBF8CB0000300C5B :106E5000C038189B5C4B300A5E0BD401E069041EFD :106E6000F6081200C170C0C3F00E1120F608094BDD :106E7000F40E0A4E1C4BF408094A1019C0B8F40865 :106E80001200F9B80300F7B802E0F408094B300A21 :106E900010195809E08900305C392FF9E0490036B3 :106EA000C043300B300AC2682F69F2081120E04954 :106EB0000020C0B2F408094EF6080948F4090A4A4D :106EC000F6090A4B104BC088F608094E144E169A64 :106ED000300BF4090A4AEDBA0000C0921C7EC04192 :106EE000EDBA0001C0422FFAF7BB02FF5CFC5D0B5C :106EF0005D0AD802E06803FFEDBA000BF7B800FFA7 :106F0000100A5C0BF7B903FEE04907FFC055300AD1 :106F1000FC1BFFE0C0C8EDBB001FF7B90101AB9A35 :106F2000F5EB115AA17BAB9BF7E9115BA17C5D0BE3 :106F3000D802103AF20B1300C080A17BA179144B48 :106F4000124B104B5E0F5EFDA17BFC1CFFE0580A4C :106F5000F80B13005E8F5EFD1ADE1AD7A17B5F3C33 :106F6000A1795F375CFCFC1EFFE0580AFC0B1300A4 :106F7000E08B001D5808FC091300E08B0018580B2B :106F8000F5BA0000C1501B071B0E583CC0A0581C8E :106F9000C0335E0F5E1D103AF20B13005E2F5E3D94 :106FA0001438F60913005E2F5E3D1B07D80A5817E8 :106FB0005F0C5809F5B800001B071B0E5E0F5EFC46 :106FC0001ADE1AD7A17B5F3CA1795F375CFCFC1EFF :106FD000FFE0580AFC0B1300E08B001D5808FC0969 :106FE0001300E08B0018580BF5BA0000C1501B07C6 :106FF0001B0E583CC0A0581CC0335E0D5E1F103ADB :10700000F20B13005E2D5E3F1438F60913005E2D5F :107010005E3F1B07D80A58175F1C5809F5B80000D7 :107020001B071B0E5E0D5EFCEBCD40FFF7E9200E4B :10703000F6071614A97BF7EA137BA97ABDBBE41BFC :107040003FFFABD7E08000CCE04707FFE08400B50E :10705000F2061614A979F3E81379A978BDB9E419F1 :107060003FFFABD6E08000E2E04607FFE08400B2DD :107070000C17FE37FC01FC1C8000F8031601E9D94F :10708000C3625CD4E7D4D382E6090644F80501253F :10709000E6050644EA031502E6090644F80501255B :1070A000E6050644EA031502E6090644F80501254B :1070B000E6050644EA031502E6080640E40907402F :1070C000E609064402045C05A365EBE413E5A3644A :1070D0005C34F8050145E6040640E4050740E60592 :1070E000064402045C05EA031502E7E413E3E80240 :1070F0001502E6080640E4090740E60906440204D2 :107100005C05A365EBE413E5A3645C34F805014575 :10711000E6040640E4050740E605064402045C0573 :10712000EA031502E7E413E3E8021502E60A064063 :10713000E40B0740E60B064202025C03EDB3001CC1 :10714000C090A1725CF32017A39AF5EB11DAA39B10 :10715000C058A58AF5EB11CAA58B5807E08A008BA9 :10716000E012FF00E8120080E6080640E40907404C :10717000E4080644E60906480005F00100485C09F9 :10718000F9D2C10158045C25F4081300F609130074 :107190005F36F8061700E40A1608F5E3118AE60BD5 :1071A0001608F7D7D28BEDBE001FEFBB001F0C0AED :1071B0005C0BE3CD80FFE41B000F144BE08100A7C4 :1071C000F2061614ABD6E04607FFE08100A4C9E83A :1071D000E419000F1049E081009AC928A37BF7EA5F :1071E00013DBA37AF5EB1004E08000A0F604120094 :1071F000C170C0C3E8051120F604094BF4050A4527 :107200000A4BF404094A0817C0B8F4041200F9B490 :107210000300F7B402E0F404094B300A0817A38A0C :10722000F5EB11EAA38BC11BA379F3E813D9A3787B :10723000F3E81004C6F0F2041200C170C0C3E80500 :107240001120F2040949F0050A450A49F0040948E9 :107250000816C0B8F0041200F9B40300F7B402E055 :10726000F004094930080816A388F1E911E8A38958 :10727000CFCA5C372FF7F1B704C0E0470020C154F4 :10728000EE061120E4070A42E606094C1842E6071A :107290000A43F4060941F4070A4AF606094C184A5B :1072A000F6070A4B3000C158EE061120F9B0000075 :1072B000F9BC0000C050F4060940F606094CE60788 :1072C0000A423003F4070A411841F6070A4A300B14 :1072D000E012FF00E8120080E6080646E4090746CF :1072E000E4080644E60906480C05F00700485C0976 :1072F0003007F9D2C1010034E2051300C46B1C9BB6 :10730000E61B8000300AE3CD80FF3FFB300AE3CD6F :1073100080FFF5EB1004C0901C9BE61B8000EA1B6D :107320007FF0300AE3CD80FFF1E91015CEF0E9D906 :10733000C28BE04407FFCE41F1E910C5CE10CE6B01 :10734000D4311A97202D109C1295149E16931696E0 :107350005809C4411638E088005AF0081200C0D01D :10736000F6080946F808094CF00B1120F408094EFC :10737000F40B0A4BF7E61006F80A1610EBDCC01007 :10738000EC0A0D02FC091610EA02024BF3E31109A4 :10739000123BE08800091809123CE08B0005123B03 :1073A000F3DCEB09F20B010BFDDEC010F60A0D0A4F :1073B000FDEB110EEA0A024A1C3AE0880009180E99 :1073C0001C3CE08B00051C3AFDDCEB0EFC0A010ABC :1073D000300BF4080A4A2FEDD8321639FE9BFFFD18 :1073E000F2091200C46114385F8B06355F3AF7EA80 :1073F000100AF20A1800C060FC08010AE6050146FE :10740000149E0C9B1C9A2FEDD8325808C05130198D :10741000F2080D08109CF8081200E0810084EC0CC2 :10742000010BF8031610EBDCC010F6030D0AFC0983 :107430001610EA0A024AF3EB1109123AE088000931 :107440001809123CE08B0005123AF3DCEB09141921 :10745000FDDEC010F2030D02FDE3110EEA02024A46 :107460001C3AFE98FFB5180E1C3CFE9BFFB1CACB20 :10747000F20E1120EA090945F609094BE60E0A4306 :10748000F0090941F4090942F00E0A48F40E0A4ACB :107490000A48164AF0061610F9D8C010E6060D0480 :1074A000F4031610089BE7E51103E80C02450635C6 :1074B000E0880007201B10030638E0880072F5DA28 :1074C000C0100A13E6060D04F5E51106E80C024C9F :1074D000089A0C3CE0880007201A10060C38E08857 :1074E000005AF5EB110B1816F601064A149C1636D5 :1074F000C0735F0514325F3AEBEA000AC060F8011E :107500000104F608014B089CE40C010AEC0B01464F :10751000EC090A4BF4090A4AEC0E09460C4A2FED15 :10752000D832F0011120F4010A4BF808094CEC089C :107530000949EC010A41F7E91009F8031610EBDCE0 :10754000C010E2030D00F20B1610EA00024EF7E144 :10755000110B163EE0880006180B163CE088002749 :10756000F60E0101F3D9C010E2030D00F3E1110999 :10757000EA00024B123BE08800091809123CE08B3C :107580000005123BF3DCEB09F20B010BF408094E8A :10759000C4DB0C3CF7BA0B01EDD8EB06CA3B063551 :1075A000F7BB0B01E7D8EB03C8BB163EF7DCEB0BD0 :0275B000CD8B81 :10760000C0080000C0080000C0080000C00800005A :10761000C0080000C0080000C0080000C00800004A :10762000C0080000C0080000C0080000C00800003A :10763000C0080000C0080000C0080000C00800002A :10764000C0080000C00800000000000000000000AA :10765000C008000000000000000000000000000062 :10766000C008000000000000000000000000000052 :10767000C008000000000000000000000000000042 :1076800000000000000000000000000000000000FA :1076900000000000000000000000000000000000EA :1076A00000000000000000000000000000000000DA :1076B00000000000000000000000000000000000CA :1076C00000000000000000000000000000000000BA :1076D00000000000000000000000000000000000AA :1076E000000000000000000000000000000000009A :1076F000000000000000000000000000000000008A :10770000C0080000300CF01F0012580CF80F1710C2 :10771000D603301CF01F000E580CF80F1710D603BC :10772000302CF01F000B580CF80F1710D603303C0C :10773000F01F0007580CF80F1710D60300000104C3 :107740004000011280000120C000012E8000A41C16 :107750000000000000000000000000000000000029 :107760000000000000000000000000000000000019 :107770000000000000000000000000000000000009 :1077800000000000000000000000000000000000F9 :1077900000000000000000000000000000000000E9 :1077A00000000000000000000000000000000000D9 :1077B00000000000000000000000000000000000C9 :1077C00000000000000000000000000000000000B9 :1077D00000000000000000000000000000000000A9 :1077E0000000000000000000000000000000000099 :1077F0000000000000000000000000000000000089 :1078000073656E645265706C790000006765745F23 :10781000646174615F7463705F636D645F63620071 :107820006765745F7265706C795F686F73745F62AF :10783000795F6E616D655F63620000006765745F0C :107840007265706C795F7363616E5F6E6574776F7C :10785000726B735F636200006765745F7265706C62 :10786000795F6964785F6E65745F63620000000031 :107870007365745F706173737068726173655F6361 :107880006D645F63620000007365745F6B65795FB0 :10789000636D645F6362000063616C6C5F7265704E :1078A0006C795F6362000000617661696C5F64619E :1078B00074615F7463705F636D645F636200000096 :1078C0007365744D6170536F636B4D6F6465000039 :1078D0006765745374617274436D6453657100001D :1078E0007365745F6E65745F636D645F63620000EF :1078F0007365745F69705F636F6E6669675F636D00 :10790000645F63620000000073656E644572726FAD :107910007200000073746172745F736572766572D1 :107920005F7463705F636D645F6362007370695F4F :10793000736C61766552656365697665496E74003E :107940006765745F636C69656E745F737461746599 :107950005F7463705F636D645F63620073656E6420 :107960005F646174615F7564705F636D645F6362BF :1079700000000000636865636B4D7367466F726D4E :107980006174000073746172745F7363616E5F6E23 :1079900065745F636D645F6362000000666F756E9F :1079A00064486F737442794E616D65007365745FEE :1079B0006B65795F636D645F63620000696E697413 :1079C0005370690073746172745F636C69656E747F :1079D0005F746370000000007370695F706F6C6C9F :1079E000000000006765745F726573756C745F6397 :1079F0006D645F636200000073746F705F636C6935 :107A0000656E745F7463705F636D645F63620000D2 :107A100073746172745F7365727665725F7463709C :107A2000000000007365745F706173737068726149 :107A300073655F636D645F63620000007365745F0C :107A4000726573756C745F636D6400007365745F59 :107A5000646E735F636F6E6669675F636D645F63B7 :107A6000620000006765745F73746174655F7463BE :107A7000705F636D645F6362000000007265715F38 :107A80007265706C795F686F73745F62795F6E6145 :107A90006D655F636200000073746172745F636C94 :107AA00069656E745F7463705F636D645F636200C9 :107AB000572D5B25735D2057726F6E67207465725A :107AC0006D696E6174696F6E20696E6465783A25C0 :107AD00064206E506172616D3A2564206964783A61 :107AE00025642031366269743A25640A000000007A :107AF0003078257820000000572D5B25735D2049E4 :107B00006E646578206F7574206F662072616E6791 :107B1000653A2025640A00005B25735D20535349B4 :107B2000443A25730A0000005B25735D20525353CD :107B3000493A25640A0000005B25735D20454E43E9 :107B4000543A25640A0000005B25735D205365618B :107B5000726368696E6720666F7220486F73743A4B :107B60002069703D3078257820666F756E643D25FC :107B7000640A00005B25735D20666F756E64486F54 :107B8000737442794E616D653A20466F756E64205C :107B9000486F73743A206E616D653D25732069707E :107BA0003D307825780A00005B25735D20696653B7 :107BB00074617475733A256420726573756C743AD8 :107BC00025640A004C69737420436F6D6D616E64A7 :107BD000732066756C6C210A000000005245434515 :107BE000495645005452414E534D4954000000003F :107BF0005B25735D204D6170205B25642C20257012 :107C00002C2025735D0A00005B25735D20535049CD :107C100020696E697469616C697A6174696F6E203C :107C20006661696C65642100572D5B25735D204595 :107C300072726F7220636F6E6669677572696E67C4 :107C4000205350490A000000572D5B25735D202505 :107C5000645D20446973616C6C2E2025642F25645B :107C600020636D643A25640A00000000572D5B25EF :107C7000735D2025645D20446973616C6C2E202542 :107C8000640A00005B25735D3A200000572D5B25D8 :107C9000735D2025645D204E6F7420666F756E6481 :107CA00020656E6420636D643A20307825780A0080 :107CB0005B25735D2025732025640A00572D5B2505 :107CC000735D20456E64206F6620636D6420706173 :107CD00072616D73000000005B25735D2064617448 :107CE00061417661696C3A25640A0000572D5B2575 :107CF000735D2054544350206E6F7420666F756E10 :107D00006420666F7220736F636B3A25640A00000B :107D10005B25735D20736F636B3A25642073746118 :107D200074653A25640A00005B25735D20737461F5 :107D300074653A25640A00005B25735D2053746105 :107D40007274204E6574776F726B205363616E207E :107D500025640A00572D5B25735D206572723D25F1 :107D6000640A00005B25735D204C6F6F6B696E6762 :107D700020666F7220486F73743A206E616D653DA6 :107D800025730A005B25735D20466F756E6420487D :107D90006F73743A206E616D653D25732069703D87 :107DA000307825780A0000005B25735D2053746FDE :107DB0007020636C69656E7420736F636B3A256421 :107DC0000A00000055445000544350005B25735D89 :107DD00020416464723A307825782C20706F727478 :107DE0003A25642C20736F636B3A25642C207072E3 :107DF0006F743A25730A0000572D5B25735D205080 :107E0000726576696F757320636C69656E74202581 :107E100070206E6F742073746F7070656420210A17 :107E2000000000005B25735D205374617274204371 :107E30006C69656E74202573202570205B30782571 :107E4000782C2025642C2025645D204F4B210A00CE :107E50005B25735D20537461727420436C69656E99 :107E600074202573202570205B307825782C202500 :107E7000642C2025645D204641494C4544210A007C :107E8000572D5B25735D205374696C6C20636F6E96 :107E90006E65637465642E2E2E776169740A000026 :107EA000572D5B25735D20494620646F776E2E2E1B :107EB0002E776169740A00005B25735D205374613D :107EC000727420536572766572202573205B256479 :107ED0002C2025645D204F4B210A0000572D5B2587 :107EE000735D2053746172742053657276657220DD :107EF0002573205B25642C2025645D204641494C78 :107F00004544210A000000005B25735D2025702098 :107F10006E756D506172616D3D2564207061726D8A :107F200073546F4368616E67653D25640A00000005 :107F30005B25735D2025645D206E69663A2570209F :107F40006C7769705F616464723D307825780A00EF :107F50005B25735D20257320706172616D733D2513 :107F6000640A00005B25735D20506173733A20251D :107F7000732025640A000000572D5B25735D2025C2 :107F800073203A204661696C656420746F206164D7 :107F90006420706173737068726173650A00000019 :107FA000436F6E6E65637420746F206E6574776FB7 :107FB000726B2E2E2E0000006572723D25640A0041 :107FC0004F4B0A00572D5B25735D205353494420C6 :107FD0006C656E206F7574206F662072616E6765C8 :107FE000000000005B25735D2025730A000000007F :107FF000572D5B25735D2053656E642053504920D7 :108000006572726F72210A003D3D3E003C3D3D00AD :10801000572D5B25735D20556E6B6E6F776E2063F9 :108020006D6420307825780A00000000572D5B250C :10803000735D2025645D20436865636B20666F7205 :108040006D6174206D7367206661696C6564210AD7 :1080500000000000444F574E000000005550000043 :1080600049462020207374617475733A2025730A81 :1080700000000000434F4E4E207374617475733AD4 :108080002025730A00000000536F636B6574206E37 :108090002E3A256428256429205B307825785D20D8 :1080A000257320257320616464723A257320706FF4 :1080B00072743A25640A00005B2564207470637052 :1080C0002D25705D2D5374617475733A25640A0013 :1080D0005B746C63702D25705D2D537461747573C2 :1080E0003A25640A000000005B757063702D2570EE :1080F0005D20666C6167733A3078257820206C6F5C :1081000063616C3A25735B307825785D2D25640AB0 :108110000000000072656D6F74653A257328307831 :108120002578292D25640A004E4F0000594553003B :108130004461746120617661696C3A25730A0000BC :108140002D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D5F :108150002D2D2D2D2D2D2D2D2D2D2D2D2D2D0A009F :108160005B25735D205363616E206E6F7420636FB7 :108170006D706C65746564210A0000005B25735D99 :10818000204E6574776F726B73206E6F7420666F0C :10819000756E64210A000000636F756C64206E6F59 :1081A0007420616C6C6F6361746520616C6C206716 :1081B0007569206E65742061727261790A00000031 :1081C000636F756C64206E6F7420616C6C6F63619B :1081D000746520616C6C20677569206E6574730A24 :1081E000000000005B25735D202564202D20257391 :1081F000205B25645D2D202564202D202564202D05 :1082000020307825780A000D000B000C000A0000D1 :108210007365745F726573756C745F636D64000081 :108220008000636C800063988000637E80006398A8 :108230008000638E80006398800063648000639890 :10824000800063688000638A800063786174637073 :108250005F706F6C6C5F636F6E6E00007564705F53 :10826000737461727400000072656D6F76654E659F :1082700077436C69656E74436F6E6E0061756470F0 :108280005F726563765F6362000000006765745328 :1082900074617465546370006172645F7463705FCD :1082A00073746F7000000000617463705F636F6EC1 :1082B0006E5F6572725F6362000000006765744EF6 :1082C0006577436C69656E74436F6E6E4964000038 :1082D000617463705F636F6E6E5F636C695F65721C :1082E000725F636200000000617463705F616363CA :1082F0006570745F636200007564705F73746172AF :10830000740000005B25735D20747463703A2570FF :108310002069643D25642C20747063623D25700AD9 :1083200000000000572D5B25735D204E6F205661C5 :108330006C696420636C69656E7420666F7220746A :108340007463703A25700A005B25735D2025645DB7 :1083500020747463703A257020747063623A2570DB :108360002073746174653A2564206C7063623A25E9 :10837000702073746174653A2564206C6566743A84 :1083800025642073656E743A25640A00572D5B25B9 :10839000735D20544350206E6F7420696E69746958 :1083A000616C697A656420747463703A2570207416 :1083B0007063623A2570206C7063623A25700A001F :1083C000572D5B25735D204E6F2056616C696420CC :1083D000496420666F7220747463703A257020704F :1083E00063623A25700A00005B25735D2062756642 :1083F0003A2570206C656E3A25640A00572D5B257E :10840000735D2054544350205B25705D3A20636FA8 :10841000756C64206E6F7420616C6C6F6361746541 :1084200020706275660A0000572D5B25735D20542D :10843000544350205B25705D3A207564705F73650E :108440006E642829206661696C65640A000000007A :108450005B25735D2054544350205B25702D25709F :108460005D3A20636F6E6E65637420256420256419 :108470000A0000005B25735D206C6566743D256411 :10848000206C656E3A25640A000000005B25735D70 :10849000207463705F7772697465206661696C65CA :1084A000642025702073746174653A2564206C65BE :1084B0006E3A2564206572723A25640A0000000055 :1084C000572D5B25735D2074746370203D3D204EF5 :1084D000554C4C210A0000005B25735D20747463C9 :1084E000703A2570207063623A2570206275663A92 :1084F0002570206C656E3A25640A00005B25735D6B :1085000020272573270A00005B25735D20506163D7 :108510006B65742073656E74207063623A257020F9 :108520006C656E3A2564206475723A2564206C652A :1085300066743A25640A00005B25735D2054544339 :1085400050205B25705D3A20636C65616E536F63EC :108550006B53746174655F63622025640A000000D8 :108560005B25735D20436C6F73696E672074706365 :10857000623A2073746174653A30782578206572A8 :10858000723A25640A0000005B25735D20436C6F1E :1085900073696E67206C7063623A207374617465EE :1085A0003A30782578206572723A25640A00000016 :1085B0005B25735D2046726565696E672070617921 :1085C0006C6F61642025642D25700A005B25735D46 :1085D00020436C6F73696E6720747063625B2570F3 :1085E0005D3A2073746174653A307825782065723D :1085F000723A25640A000000572D5B25735D204305 :10860000616E6E6F7420636C6F73652069643A25C8 :10861000642D2570207075742070656E64696E67B6 :108620000A0000005B25735D202D2D2D2D2D2D2D95 :108630002D2D2D2D2D2D2D2D2D2D2D2D2D2D2D0A8D :1086400000000000572D5B25735D2074746370205B :108650003D204E554C4C210A000000005B25735D07 :1086600020666C75736820646174613A207470636D :10867000623A2570206572723A25640A0000000093 :10868000572D5B25735D2054544350205B25705D4E :108690003A20636F6E6E656374696F6E20657272E7 :1086A0006F723A202564206375727249643A2564BA :1086B0000A00000041626F727420636F6E6E656322 :1086C00074696F6E0A000000572D5B25735D20549E :1086D000544350205B25705D3A20636F6E6E656376 :1086E00074696F6E206572726F723A202564206122 :1086F00072673A25700A0000572D5B25735D205480 :10870000544350205B25705D3A2066726565206D8C :10871000656D6F72790A00005B25735D20554450CA :1087200020496E7365727420257020736F636B3AF5 :10873000256420616464723A257320706F72743A04 :1087400025640A00572D5B25735D20545443502047 :108750005B2D5D3A20696E76616C6964206D6F6493 :10876000650A0000572D5B25735D2054544350204B :108770005B2D5D3A20696E76616C6964206E62756E :10878000660A0000572D5B25735D2054544350202A :108790005B2D5D3A20696E76616C69642062756656 :1087A0006C656E0A00000000572D5B25735D205438 :1087B000544350205B2D5D3A20636F756C64206ECE :1087C0006F7420616C6C6F63617465206D656D6F93 :1087D000727920666F7220747463700A0000000062 :1087E000572D5B25735D2054544350205B25705DED :1087F0003A20636F756C64206E6F7420616C6C6FCF :1088000063617465207063620A0000005B25735D1C :108810002025732C20757063623A25702025733AE9 :1088200025640A00572D5B25735D20545443502066 :108830005B25705D3A2075647020636F6E6E6563B2 :1088400074206661696C65640A000000572D5B2521 :10885000735D2054544350205B25705D3A2062695B :108860006E64206661696C6564206572723D256482 :1088700020506F727420616C726561647920757329 :1088800065640A005B25735D2025732C206C6F6383 :108890003A307825782D25642072656D3A30782538 :1088A000782D25640A0000005B25735D20416C6C07 :1088B0006F63207061796C6F61642025642D257071 :1088C0000A000000572D5B25735D2054544350204F :1088D0005B25705D3A20636F756C64206E6F742049 :1088E000616C6C6F63617465207061796C6F616439 :1088F0000A0000005B25735D205B747063625D2D70 :108900002570207061796C6F61643A25700A0000EF :10891000572D5B25735D2054544350205B25705DBB :108920003A2074637020636F6E6E656374206661B5 :10893000696C65640A0000005B25735D2042454652 :108940004F52452042494E4420747463703A25705A :10895000206C7063623A2570207063623A25700A59 :1089600000000000572D5B25735D205454435020B8 :108970005B25705D3A206C697374656E2066616971 :108980006C65640A00000000572D5B25735D205361 :108990007461727420736572766572204641494C29 :1089A0004544210A000000005B25735D20545443B8 :1089B00050205B25702D25705D3A206E6275663DF6 :1089C00025642C206275666C656E3D25642C2070D4 :1089D0006F72743D2564202825732F2573290A00A2 :1089E0007574726C3A6E3A703A7600002573000026 :1089F0005B25735D2041524420544350205B257019 :108A00005D3A20616363657074206E6577205B2535 :108A1000705D0A005B25735D206C6F63616C3A25A5 :108A2000642072656D6F74653A2564207374617497 :108A3000653A25640A0000007061796C6F616420FA :108A40006E6F74206672656564210000572D5B258A :108A5000735D2041524420544350205B25705D20BB :108A60006172673D257020726574726965733D257A :108A7000642061626F72740A000000005B25735D00 :108A8000206B656570416C697665436E743A256448 :108A9000206B6565705F69646C653A25642070655C :108AA00072736973745F636E743A25640A00000020 :108AB0005B25735D2041524420544350205B257058 :108AC0002D25705D206172673D257020726574727E :108AD0006965733D25642070656E642E636C6F73E9 :108AE000653A2564206C656E3A25640A0000000032 :108AF0005B25735D2041524420544350205B257018 :108B00002D25705D2074727920746F20636C6F73F3 :108B1000652070656E64696E673A256420657272BF :108B20003A25642069643A25640A00005B25735D78 :108B30002041524420544350205B25702D25705D08 :108B4000206172673D257020726574726965733D9E :108B500025642070656E642E636C6F73653A2564BE :108B600020636F6E6E3A25640A000000572D5B2566 :108B7000735D2041524420544350205B25702D25C5 :108B8000705D206172673D25702072657472696541 :108B9000733D25640A0000005B25735D204152444B :108BA00020544350205B25702D25705D2074727910 :108BB00020746F20636C6F73652070656E64696EDE :108BC000673A25640A0000005B25735D206C656EC2 :108BD0003A25640A000000005B25735D20736F6313 :108BE0006B3A2564207063623A2570207062756666 :108BF0003A2570206572723A256420627566537456 :108C00006F72653A2570206C656E3A25640A000023 :108C10005B25735D20617463705F726563765F636B :108C20006220703D4E554C4C206F6E20736F636B0D :108C30003A2564207063623A25700A00572D5B253F :108C4000735D206572723D256420703D25700A00B9 :108C50005B25735D205265636569766564202570C8 :108C6000206C656E3A25640A000000006174637030 :108C70005F737461727400007463705F73656E6417 :108C80005F646174615F70636200000061746370AF :108C90005F706F6C6C000000617463705F7265637D :108CA000765F6362000000006172645F7463705FEE :108CB000737461727400000067657446697273743E :108CC000436C69656E7400006172645F7463705F09 :108CD00064657374726F7900636C6F73655F636F43 :108CE0006E6E000073656E6455647044617461005B :108CF000696E736572744E6577436C69656E744313 :108D00006F6E6E0061636B5F726563766564000011 :108D10007463705F636F6E6E6563745F636200009F :108D200073656E645463704461746100636C6F7347 :108D3000655F636F6E6E5F7063620000636C656198 :108D40006E536F636B53746174655F636200000000 :108D50007463705F646174615F73656E74000000BA :108D600061636B416E6446726565446174610000C5 :108D7000676574417661696C5463704461746142E3 :108D80007974650066726565744461746100000001 :108D9000676574546370446174614279746500005E :108DA00063616C634D657267654C656E0000000021 :108DB000696E73657274427566000000697341766E :108DC00061696C5463704461746142797465000038 :108DD00066726565744461746149647800000000DE :108DE0005B25735D202570205B25642C25645D0A5E :108DF00000000000686561644275663D256420746A :108E000061696C4275663D25640A000025645D2039 :108E10007063623A2570204275663A202570204CB6 :108E2000656E3A25640A00005B25735D20205B2592 :108E3000645D3A206C656E3A2564206964783A2551 :108E40006420746F743A25640A0000005B25735D2A :108E500020417661696C61626C6564206461746153 :108E60003A2025640A000000572D5B25735D2069B8 :108E70006478427566206F7574206F662072616E2B :108E800067653A2025640A005B25735D2025702004 :108E90006964783A25640A00572D5B25735D20428A :108EA0007566203D3D204E554C4C21005B25735D81 :108EB0002041636B207063623A2570206C656E3AC6 :108EC000256420736F636B3A256420646174613A92 :108ED00025700A005B25735D206765743A25642060 :108EE00025702025640A00005B25735D206368659A :108EF000636B3A25642025642025700A0000000079 :108F00005B25735D2046726565202570206F74684F :108F1000657220627566202564207461696C3A254B :108F20006420686561643A25640A0000572D5B255A :108F3000735D204F76657277726974696E6720621F :108F40007566666572202570206964783A2564210B :108F50000A000000572D5B25735D20706275665F07 :108F6000636F70795F7061727469616C20666169AA :108F70006C65643A207372633A25702C20647374B4 :108F80003A25702C206C656E3A25640A00000000BA :108F9000572D5B25735D2041766F696420746F20C7 :108FA0004F76657277726974652064617461205BC5 :108FB00025642D25645D210A000000005B25735D9A :108FC00020496E736572745B25645D3A2025703AA2 :108FD00025642D2564205B25642C25645D0A000032 :108FE000572D5B25735D20536F636B206F75742065 :108FF0006F662072616E67653A20736F636B3D2503 :1090000064000000696E736572745F70427566007B :109010006765745F70427566000000000000E10043 :1090200008040000000000000F01110110011301ED :109030000E01110110010F0106000500636D645F50 :109040007365745F69700000636D645F736574704D :1090500061737300636D645F7374617274436C69F0 :1090600000000000466F756E6420486F73743A20EC :109070006E616D653D25732069703D307825780AF5 :109080000000000075736167653A206474203C310C :109090007C303E0A0000000075736167653A2073FA :1090A000656E64556470205B736F636B5D0A097352 :1090B0006F636B3A20736F636B6574204E756D62DE :1090C00065720A00536F636B65743A2025640A0069 :1090D0005061747465726E547970653A2025640A23 :1090E0000000000050726F766100000031323334AE :1090F000353637383930000046696E65546573740B :10910000000000006F6666004465627567204F4688 :10911000460A00007072696E740000004465627552 :10912000672009656E61626C65643A203078257845 :109130000A000000566572626F736520656E616299 :109140006C65643A20307825780A000044756D70AB :109150002009656E61626C65643A20307825780A72 :1091600000000000504F6F6C6C2009656E61626CEE :1091700065643A20307825780A00000044656275FD :1091800067204F4E0A00000075736167653A2064DE :1091900065627567203C73656374696F6E3E203C41 :1091A0006C6576656C3E0A0973656374696F6E3A27 :1091B00020696E69742C20636D2C207370692C20DB :1091C000746370202C207574696C2C207761726E2A :1091D0000A096C6576656C20203A203020286F667D :1091E00066292C203120286F6E292C2032202876E9 :1091F0006572626F7365290A096F723A206465624D :109200007567207072696E742F6F6E2F6F66660AB5 :1092100000000000696E697400000000737069004E :1092200074637000636D00007574696C0000000069 :109230007761726E00000000616C6C0044756D70A7 :1092400020416C6C20427566666572730A000000EE :1092500075736167653A2064756D7050627566203C :109260005B736F636B5D0A09736F636B3A20736F97 :10927000636B6574204E756D6265720A00000000B4 :109280006E6F6E650000000044656C6574696E6702 :1092900020574550206B6579730A0000757361672C :1092A000653A207365746B6579203C6B65795F69FD :1092B00064782028302D33293E203C6B6579206965 :1092C0006E206865783E0A09206F723A20736574D3 :1092D0006B6579206E6F6E650A000000205745505F :1092E000206B6579206D75737420626520313020A4 :1092F000285745502D343029206F722032362028CF :109300005745502D31303429206469676974730AD8 :1093100000000000776C5F61706920766572736988 :109320006F6E2076322E372E300A00006661696C2F :10933000656420746F20676574206D6163206164CB :1093400064726573730A0000687720616464723A1E :109350002025730A000000006C696E6B2073746135 :109360007475733A20000000697020616464723A79 :10937000202573202D2000006E65746D61736B3A9B :10938000202573202D200000676174657761793A8C :109390002025730A00000000697020696E746572F0 :1093A0006661636520697320646F776E0A00000050 :1093B00064686370203A2000656E61626C65640ABF :1093C0000000000064697361626C65640A0000005B :1093D000444E533A202573202D2000007573616799 :1093E000653A207374617274436C69203C697061E2 :1093F0006464723E203C706F72743E203C736F63F5 :109400006B3E203C7463702830292F7564702831BE :10941000293E0A00537461727420636C69656E742E :10942000206F6E206164647220307825782C207063 :109430006F727420256420736F636B202564206D28 :109440006F64652025640A00572D5B25735D2053EA :109450007461727420636C69656E74206F6E207025 :109460006F727420256420736F636B2025642070F5 :10947000726F74202564206D6F646520256420461A :1094800041494C45440A000075736167653A207391 :1094900074617274537276203C706F72743E203C1B :1094A000736F636B3E203C7463702830292F7564A2 :1094B000702831293E0A00005374617274202573AC :1094C00020736572766572206F6E20706F727420E3 :1094D000256420736F636B2025640A00572D5B257C :1094E000735D2053746172742025732073657276E6 :1094F0006572206F6E20706F727420256420736F08 :10950000636B202564204641494C45440A00000015 :1095100075736167653A20736574646E73205B319F :109520002D325D206161612E6262622E6363632E63 :109530006464640A0000000053657420444E5320A4 :1095400073657276657220256420746F2025730A16 :10955000000000003D3D3E20444E53313A2025732B :109560000A0000003D3D3E20444E53323A20257310 :109570000A00000075736167653A20676574486F7B :109580007374203C686F73746E616D653E0A0000F1 :1095900075736167653A207770617373203C7373EC :1095A00069643E203C706173737068726173653EDC :1095B0000A0000002573203A204661696C6564202A :1095C000746F20616464207061737370687261737A :1095D000650A000075736167653A20647061737392 :1095E000203C737369643E0A000000002573203A32 :1095F000204661696C656420746F2064656C6574D5 :109600006520706173737068726173650A00000091 :1096100075736167653A206970636F6E666967206C :109620003C69703E203C6E65746D61736B3E203CFE :10963000676174657761792D69703E0A00000000EA :1096400020206F72203A206970636F6E6669672010 :109650006E6F6E652028746F20656E61626C652088 :1096600044484350290A00005B25735D206E6966FB :109670003A2570206C7769705F616464723D307860 :1096800025780A0075736167653A20636F6E6E65B1 :109690006374203C737369643E0A0000636D645F09 :1096A000737461727453727600000000636D645FBE :1096B00064656C70617373004D494D4C4644000005 :1096C0000A24200024200000617661696C61626CCC :1096D0006520636F6D6D616E64733A0A000000006F :1096E000202025730A000000636F756C64206E6F84 :1096F0007420616C6C6F63617465206669726D774C :10970000617265206275666665720A00547565202F :109710004D61722032362032323A30393A353420B7 :109720003230313300000000776C5F696E69745F1E :10973000636F6D706C6574655F6362006661696C10 :10974000656420746F20696E697420776C20636F84 :109750006E6E206D67720000572D5B25735D205380 :109760007069206E6F7420696E697469616C697AC2 :1097700065640A006C696E6B20646F776E2C2072D2 :10978000656C6561736520646863700A00000000A1 :109790006C696E6B20646F776E0A00006C696E6B8B :1097A0002075702C20636F6E6E6563746564207421 :1097B0006F20222573220A007265717565737469C2 :1097C0006E672064686370202E2E2E20000000003B :1097D0004641494C45440A00626F756E6420746FBF :1097E0002025730A00000000572D5B25735D20497A :1097F0006E74657266616365206E6F74207570218A :109800000A0000007363616E00000000636F6E6EFB :10981000656374007365746B6579000073746174BB :1098200075730000646562756700000064756D7093 :10983000427566006970636F6E66696700000000BC :10984000747463700000000077706173730000002F :109850006470617373000000676574486F7374000F :10986000736574444E53000073746172745372765E :10987000000000007374617274436C6900000000A2 :1098800073656E645564700041726475696E6F2013 :109890005769666920537461727475702E2E2E207C :1098A0005B25735D0A0000006F7574206F66206D84 :1098B000656D6F72790000006661696C6564207483 :1098C0006F207072657061726520666F72206669C4 :1098D000726D7761726520646F776E6C6F61640A78 :1098E00000000000436F756C64206E6F7420646527 :1098F0007465637420776C206465766963652C20D9 :1099000061626F7274696E670A000000496E766169 :109910006C6964206669726D776172652064617438 :10992000612C2061626F7274696E670A000000002A :109930004661696C656420746F2073746172742071 :10994000776C20696E697469616C697A6174696F9A :109950006E0A0000312E312E3000000069705F73F6 :1099600074617475735F63620000000002000000A0 :1099700000B71B000800000100010000286E756C94 :109980006C290000253032782D253032782D253095 :1099900032782D253032782D253032782D25303211 :1099A00078000000256C752E256C752E256C752EA3 :1099B000256C75007373696420746F6F206C6F6E13 :1099C0006720286D6178202564290A00257320000E :1099D00022257322000000002052535349202564A1 :1099E0002064426D200000002041642D486F6320F8 :1099F00000000000202857455020656E6372797082 :109A000074696F6E290000002028544B495020656E :109A10006E6372797074696F6E2900002028434369 :109A20004D5020656E6372797074696F6E29000005 :109A3000202020002530325820000000256300003F :109A40006E6F206E65747320666F756E640A000019 :109A5000496E76616C6964206C656E6774680A0093 :109A600025642E25642E25642E256400544B495010 :109A70000000000043434D500000000057455000D7 :109A8000776C5F636D5F696E6974000073656C6508 :109A900063745F6E65740000776C5F636F6E6E5FFA :109AA0006C6F73745F636200776C5F7363616E5F8A :109AB000636F6D706C6574655F636200776C5F6582 :109AC00076656E745F636200776C5F6D6564696173 :109AD0005F636F6E6E65637465645F636200000050 :109AE0005B25735D20434D3A206F7574206F6620AF :109AF0006D656D6F72790A005B25735D20434D3A89 :109B000020636F756C64206E6F7420726567697373 :109B1000746572206576656E742063620A000000C9 :109B20005B25735D20434D3A20696E697469616CF1 :109B3000697A65640A0000005B25735D20434D3A35 :109B400020636F6E6E656374656420746F20257387 :109B50000A0000005B25735D20434D3A20636F6E61 :109B60006E656374206661696C65642C2073636143 :109B70006E6E696E670A00005B25735D20434D3A87 :109B800020636F756C64206E6F74207374617274DF :109B9000207363616E20616674657220636F6E6E00 :109BA000656374206661696C210A00005B25735D42 :109BB00020434D3A20646973636F6E6E656374650C :109BC000640A00005B25735D20434D3A20636F6E8D :109BD0006E656374696F6E206C6F73742C20736391 :109BE000616E6E696E670A005B25735D20434D3AB6 :109BF00020636F756C64206E6F742073746172746F :109C0000207363616E20616674657220636F6E6E8F :109C1000656374206C6F7374210A00005B25735DAB :109C200020434D3A207363616E20636F6D706C65E5 :109C30007465640A00000000FFFFFFFFFFFF0000E3 :109C40005B25735D20434D3A20526F616D696E67ED :109C50002066726F6D207273736920256420746FA3 :109C60002025640A000000005B25735D20434D3A07 :109C7000204E6F2063616E64696461746520666F55 :109C8000756E6420666F7220737369642022257379 :109C9000220A00005B25735D20434D3A206661690E :109CA0006C656420746F20636F6E6E6563740A0068 :109CB0005B25735D20434D3A206661696C656420C5 :109CC000746F207363616E0A000000005B25735D92 :109CD00020434D3A20756E68616E646C6564206542 :109CE00076656E740A000000776C5F636F6E6E5F5E :109CF0006661696C7572655F636200000000000157 :109D0000000018500000000B00001854000000096B :109D1000000018800000000F000018A400000001DF :109D2000000018E000000001000018E4000000013D :109D300000001810000000010000181400000001CD :109D400000001818000000010000181C00000001AD :109D5000000018200000000100001824000000018D :109D600000001828000000010000182C000000036B :109D700000001830000000010000183C0000000145 :109D8000000018400000000100001844000000011D :109D900000001848000000010000184C4173736572 :109DA0007274696F6E2022257322206661696C656A :109DB00064206174206C696E6520256420696E20C2 :109DC00025730A002E2E2F7372632F534F4654575C :109DD0004152455F4652414D45574F524B2F5345D7 :109DE0005256494345532F4C5749502F6C77697051 :109DF0002D312E332E322F7372632F636F72652FC6 :109E0000646863702E630000646863705F6F7074D1 :109E1000696F6E3A20646863702D3E6F7074696F6D :109E20006E735F6F75745F6C656E202B2032202B14 :109E3000206F7074696F6E5F6C656E203C3D2044CE :109E40004843505F4F5054494F4E535F4C454E006E :109E5000646863705F6F7074696F6E5F6279746558 :109E60003A20646863702D3E6F7074696F6E735F23 :109E70006F75745F6C656E203C20444843505F4FA3 :109E80005054494F4E535F4C454E00006468637018 :109E90005F6F7074696F6E5F747261696C65723A3E :109EA000206468637020213D204E554C4C0000001A :109EB000646863705F6F7074696F6E5F74726169FC :109EC0006C65723A20646863702D3E6D73675F6FD6 :109ED000757420213D204E554C4C0A006468637017 :109EE0005F6F7074696F6E5F747261696C65723AEE :109EF00020646863702D3E6F7074696F6E735F6F5E :109F000075745F6C656E203C20444843505F4F5031 :109F100054494F4E535F4C454E0A000064686370CD :109F20005F6F7074696F6E5F73686F72743A2064EC :109F30006863702D3E6F7074696F6E735F6F7574B8 :109F40005F6C656E202B2032203C3D2044484350FE :109F50005F4F5054494F4E535F4C454E0000000038 :109F6000646863705F6F7074696F6E5F6C6F6E674B :109F70003A20646863702D3E6F7074696F6E735F12 :109F80006F75745F6C656E202B2034203C3D20443F :109F90004843505F4F5054494F4E535F4C454E001D :109FA0007265706C79207761736E277420667265B4 :109FB00065640000646863705F6372656174655F07 :109FC000726571756573743A206E657469662021D7 :109FD0003D204E554C4C0000646863705F637265B1 :109FE0006174655F726571756573743A2064686346 :109FF0007020213D204E554C4C0000006468637079 :10A000005F6372656174655F726571756573743ADB :10A0100020646863702D3E705F6F7574203D3D2035 :10A020004E554C4C00000000646863705F637265BD :10A030006174655F726571756573743A20646863F5 :10A04000702D3E6D73675F6F7574203D3D204E55DA :10A050004C4C0000646863705F6372656174655F97 :10A06000726571756573743A20636865636B2074FB :10A07000686174206669727374207062756620630B :10A08000616E20686F6C64207374727563742064F1 :10A090006863705F6D736700646863705F64656CAC :10A0A0006574655F726571756573743A206E657469 :10A0B000696620213D204E554C4C00006468637059 :10A0C0005F64656C6574655F726571756573743A1C :10A0D000206468637020213D204E554C4C000000E8 :10A0E000646863705F64656C6574655F72657175E3 :10A0F0006573743A20646863702D3E705F6F757489 :10A1000020213D204E554C4C0000000064686370D7 :10A110005F64656C6574655F726571756573743ACB :10A1200020646863702D3E6D73675F6F75742021C6 :10A130003D204E554C4C00006E6574696620213DF3 :10A14000204E554C4C0000007062756620705F6FA9 :10A150007574207761736E2774206672656564007C :10A16000646863705F62696E643A206E65746966E4 :10A1700020213D204E554C4C000000006468637067 :10A180005F62696E643A206468637020213D204EEE :10A19000554C4C00726574203D3D2073697A656FA3 :10A1A000662873747275637420646863705F6D737E :10A1B0006729202D20444843505F4F5054494F4E4B :10A1C000535F4C454E000000726574203D3D206495 :10A1D0006863702D3E6F7074696F6E735F696E5F38 :10A1E0006C656E002E2E2F7372632F534F4654579B :10A1F0004152455F4652414D45574F524B2F5345B3 :10A200005256494345532F4C5749502F6C7769702C :10A210002D312E332E322F7372632F636F72652FA1 :10A22000646E732E63000000646E73207365727633 :10A230006572206F7574206F66206172726179009B :10A24000646E732073657276657220686173206E28 :10A250006F20495020616464726573732073657464 :10A260000000000070627566206D75737420626571 :10A2700020696E206F6E652070696563650000005F :10A28000617272617920696E646578206F757420DF :10A290006F6620626F756E6473000000756E6B6E82 :10A2A0006F776E20646E735F7461626C6520656E9B :10A2B0007472792073746174653A00006C6F636125 :10A2C0006C686F73740000003230382E36372E32CF :10A2D00032322E3232320000000400040004000248 :10A2E000002000050002001E002000002E2E2F730B :10A2F00072632F534F4654574152455F4652414D6A :10A3000045574F524B2F53455256494345532F4CB7 :10A310005749502F6C7769702D312E332E322F73A1 :10A3200072632F636F72652F6D656D702E63000011 :10A330006D656D705F667265653A206D656D207044 :10A34000726F7065726C7920616C69676E6564000C :10A350006D656D705F6D616C6C6F633A20747970C0 :10A3600065203C204D454D505F4D41580000000098 :10A370006D656D705F6D616C6C6F633A206D656DBE :10A38000702070726F7065726C7920616C69676E95 :10A3900065640000001C002000B0002400140020B0 :10A3A00000080010025400002E2E2F7372632F53EA :10A3B0004F4654574152455F4652414D45574F52C3 :10A3C0004B2F53455256494345532F4C5749502F15 :10A3D0006C7769702D312E332E322F7372632F6399 :10A3E0006F72652F6E657469662E6300626F6775A4 :10A3F0007320706275663A206C656E20213D207472 :10A400006F745F6C656E20627574206E6578742061 :10A410003D3D204E554C4C210000000073686F7587 :10A420006C64206E6F74206265206E756C6C207396 :10A43000696E636520666972737420213D206C61CA :10A4400073742100696620666972737420213D204F :10A450004E554C4C2C206C617374206D75737420B8 :10A46000616C736F20626520213D204E554C4C007D :10A470002E2E2F7372632F534F4654574152455F10 :10A480004652414D45574F524B2F53455256494323 :10A4900045532F4C5749502F6C7769702D312E330F :10A4A0002E322F7372632F636F72652F7062756621 :10A4B0002E630000286820213D204E554C4C292059 :10A4C000262620287420213D204E554C4C2920283A :10A4D00070726F6772616D6D65722076696F6C6105 :10A4E000746573204150492900000000702D3E74AE :10A4F0006F745F6C656E203D3D20702D3E6C656E07 :10A5000020286F66206C6173742070627566206904 :10A510006E20636861696E2900000000696E6372D5 :10A52000656D656E745F6D61676E697475646520D5 :10A530003C3D20702D3E6C656E0000006261642021 :10A5400070627566207479706500000070627566CF :10A550005F74616B653A20696E76616C6964206234 :10A5600075660000706275665F74616B653A20699C :10A570006E76616C6964206461746170747200004D :10A58000706275665F74616B653A20696E76616CA6 :10A590006964207062756600646964206E6F74205F :10A5A000636F707920616C6C2064617461000000DD :10A5B000706275665F636F70795F706172746961F4 :10A5C0006C3A20696E76616C696420627566000081 :10A5D000706275665F636F70795F706172746961D4 :10A5E0006C3A20696E76616C696420646174617094 :10A5F00074720000706275665F636F70793A2074E0 :10A600006172676574206E6F742062696720656E81 :10A610006F75676820746F20686F6C6420736F7546 :10A6200072636500705F746F20213D204E554C4C65 :10A63000000000006F66667365745F746F203C3DB8 :10A6400020705F746F2D3E6C656E00006F666673E0 :10A6500065745F66726F6D203C3D20705F66726F3F :10A660006D2D3E6C656E0000706275665F636F7085 :10A6700079282920646F6573206E6F7420616C6C7B :10A680006F77207061636B65742071756575657394 :10A69000210A0000706275665F667265653A207314 :10A6A000616E6520747970650000000070627566E7 :10A6B0005F667265653A20702D3E726566203E20A9 :10A6C00030000000702D3E746F745F6C656E203D2D :10A6D0003D20702D3E6C656E202B20712D3E746FD9 :10A6E000745F6C656E000000702D3E746F745F6C5B :10A6F000656E203D3D20702D3E6C656E00000000B3 :10A70000706275665F7265616C6C6F633A20702071 :10A71000213D204E554C4C00706275665F7265613C :10A720006C6C6F633A2073616E6520702D3E747996 :10A730007065000067726F77203C206D61785F75EF :10A7400031365F7400000000706275665F7265618B :10A750006C6C6F633A207120213D204E554C4C00AB :10A76000706275665F616C6C6F633A206261642031 :10A7700070627566206C617965720000636865635C :10A780006B20702D3E7061796C6F6164202B20709E :10A790002D3E6C656E20646F6573206E6F74206F44 :10A7A000766572666C6F77207062756600000000D7 :10A7B000504255465F504F4F4C5F42554653495AA1 :10A7C00045206D75737420626520626967676572E4 :10A7D000207468616E204D454D5F414C49474E4D98 :10A7E000454E540072656D5F6C656E203C206D6156 :10A7F000785F7531365F7400706275665F616C6C8E :10A800006F633A207062756620712D3E7061796CBD :10A810006F61642070726F7065726C7920616C6911 :10A82000676E656400000000706275665F616C6C45 :10A830006F633A206572726F6E656F7573207479FD :10A8400070650000706275665F636F707920666185 :10A85000696C656400000000010203040506070737 :10A8600007070707070000002E2E2F7372632F5370 :10A870004F4654574152455F4652414D45574F52FE :10A880004B2F53455256494345532F4C5749502F50 :10A890006C7769702D312E332E322F7372632F63D4 :10A8A0006F72652F7463702E630000007463705FB5 :10A8B000706362735F73616E653A20616374697679 :10A8C00065207063622D3E737461746520213D20A4 :10A8D000434C4F53454400007463705F7063627370 :10A8E0005F73616E653A2061637469766520706399 :10A8F000622D3E737461746520213D204C49535490 :10A90000454E00007463705F706362735F73616EC5 :10A91000653A20616374697665207063622D3E73C9 :10A920007461746520213D2054494D452D5741499E :10A93000540000007463705F706362735F73616ED4 :10A94000653A207477207063622D3E73746174657C :10A95000203D3D2054494D452D57414954000000AC :10A960007463705F62696E643A2063616E206F6E1B :10A970006C792062696E6420696E207374617465FD :10A9800020434C4F534544007463705F7265637697 :10A9900065643A206C656E20776F756C6420777201 :10A9A0006170207263765F776E640A00756E7365FE :10A9B0006E74207365676D656E7473206C65616B72 :10A9C000696E6700756E61636B6564207365676DA2 :10A9D000656E7473206C65616B696E6700000000C2 :10A9E0006F6F736571207365676D656E7473206C2E :10A9F00065616B696E6700007463705F7063625FAE :10AA000072656D6F76653A207463705F7063627310 :10AA10005F73616E652829007463705F6C6973747D :10AA2000656E3A2070636220616C726561647920A2 :10AA3000636F6E6E65637465640000007463705FBD :10AA4000736C6F77746D723A2061637469766520F8 :10AA50007063622D3E737461746520213D20434C08 :10AA60004F5345440A0000007463705F736C6F7746 :10AA7000746D723A20616374697665207063622D2B :10AA80003E737461746520213D204C495354454EFA :10AA90000A0000007463705F736C6F77746D723AB4 :10AAA00020616374697665207063622D3E73746102 :10AAB000746520213D2054494D452D574149540A84 :10AAC000000000007463705F736C6F77746D723A8E :10AAD000206D6964646C652074637020213D20746E :10AAE00063705F6163746976655F706362730000B1 :10AAF0007463705F736C6F77746D723A20666972FD :10AB0000737420706362203D3D207463705F6163E5 :10AB1000746976655F706362730000007463705FD0 :10AB2000736C6F77746D723A2054494D452D5741BF :10AB30004954207063622D3E7374617465203D3DFD :10AB40002054494D452D5741495400007463705FAE :10AB5000736C6F77746D723A206D6964646C6520F4 :10AB600074637020213D207463705F74775F70633D :10AB7000627300007463705F736C6F77746D723A08 :10AB800020666972737420706362203D3D20746397 :10AB9000705F74775F706362730000007463705F4E :10ABA000636F6E6E6563743A2063616E206F6E6CC6 :10ABB0007920636F6E6E65637465642066726F6D75 :10ABC00020737461746520434C4F5345440000006A :10ABD00053594E5F53454E540000000053594E5F89 :10ABE000524356440000000045535441424C4953DF :10ABF0004845440046494E5F574149545F31000083 :10AC000046494E5F574149545F320000434C4F5311 :10AC1000455F574149540000434C4F53494E47004C :10AC20004C4153545F41434B0000000054494D4593 :10AC30005F5741495400000003060C18306078004B :10AC40008000FAFC8000FC6C8000FD4E8000FDB4AA :10AC50008000FE368000FD4E8000FE788000FEF809 :10AC60002E2E2F7372632F534F4654574152455F18 :10AC70004652414D45574F524B2F5345525649432B :10AC800045532F4C5749502F6C7769702D312E3317 :10AC90002E322F7372632F636F72652F7463705F30 :10ACA000696E2E63000000007063622D3E736E6457 :10ACB0005F71756575656C656E203E3D20706275CF :10ACC000665F636C656E286E6578742D3E70290032 :10ACD0007463705F726563656976653A2076616C4E :10ACE0006964207175657565206C656E67746800B0 :10ACF000696E7365672E7020213D204E554C4C00C7 :10AD0000696E73616E65206F6666736574210000FD :10AD10007062756620746F6F2073686F72742100A3 :10AD2000706275665F686561646572206661696CF2 :10AD3000656400007463705F726563656976653A87 :10AD4000207365676D656E74206E6F742074726910 :10AD50006D6D656420636F72726563746C792074C5 :10AD60006F207263765F776E640A00007463705FB1 :10AD7000726563656976653A207365676D656E74A3 :10AD8000206E6F74207472696D6D656420636F72DC :10AD9000726563746C7920746F206F6F73657120B6 :10ADA00071756575650A00007463705F726563652F :10ADB0006976653A207463706C656E203E2072631C :10ADC000765F776E640A00007463705F7265636516 :10ADD0006976653A206F6F736571207463706C6576 :10ADE0006E203E207263765F776E640A000000007A :10ADF0007463705F696E7075743A2061637469760C :10AE000065207063622D3E737461746520213D205E :10AE1000434C4F53454400007463705F696E707516 :10AE2000743A20616374697665207063622D3E73A5 :10AE30007461746520213D2054494D452D57414989 :10AE4000540000007463705F696E7075743A20611D :10AE50006374697665207063622D3E7374617465F6 :10AE600020213D204C495354454E00007463705FCF :10AE7000696E7075743A207063622D3E6E657874E9 :10AE800020213D2070636220286265666F72652014 :10AE900063616368652900007463705F696E707533 :10AEA000743A207063622D3E6E65787420213D20D7 :10AEB00070636220286166746572206361636865EF :10AEC000290000007463705F696E7075743A2054D5 :10AED000494D452D57414954207063622D3E73748E :10AEE000617465203D3D2054494D452D57414954DD :10AEF000000000007463705F696E7075743A2070B2 :10AF000063622D3E737461746520213D20434C4F74 :10AF1000534544007063622D3E736E645F717565C6 :10AF200075656C656E203E20300000007063622DF8 :10AF30003E61636365707420213D204E554C4C008A :10AF40007463705F696E7075743A207463705F70BB :10AF50006362735F73616E65282900002E2E2F7364 :10AF600072632F534F4654574152455F4652414DED :10AF700045574F524B2F53455256494345532F4C3B :10AF80005749502F6C7769702D312E332E322F7325 :10AF900072632F636F72652F7463705F6F75742EA9 :10AFA00063000000636865636B20746861742066E9 :10AFB0006972737420706275662063616E20686FB9 :10AFC0006C6420737472756374207463705F68645A :10AFD000720000007463705F656E71756575653A27 :10AFE000207061636B6574206E65656473207061A9 :10AFF000796C6F61642C206F7074696F6E732C2094 :10B000006F722053594E2F46494E202870726F6739 :10B0100072616D6D65722076696F6C617465732005 :10B0200041504929000000007463705F656E7175BE :10B030006575653A206C656E20213D2030207C7C52 :10B0400020617267203D3D204E554C4C2028707287 :10B050006F6772616D6D65722076696F6C61746582 :10B0600073204150492900007463705F656E7175EB :10B070006575653A207062756673206F6E20717514 :10B08000657565203D3E206174206C656173742098 :10B090006F6E65207175657565206E6F6E2D656DBF :10B0A000707479007463705F656E71756575653A6B :10B0B000206E6F207062756673206F6E20717565EB :10B0C0007565203D3E20626F7468207175657565F9 :10B0D0007320656D707479007573656720213D205C :10B0E0004E554C4C00000000636865636B2074682B :10B0F0006174206669727374207062756620636182 :10B100006E20686F6C642074686520636F6D706C6E :10B11000657465207365676C656E000070627566A6 :10B120005F686561646572206661696C65640A00C8 :10B1300046494E20656E71756575656420746F674C :10B140006574686572207769746820646174610051 :10B150007A65726F2D6C656E6774682070627566B3 :10B16000000000007463705F656E71756575653A07 :10B170002076616C6964207175657565206C656EFB :10B1800067746800525354206E6F74206578706540 :10B190006374656420686572652100002E2E2F732C :10B1A00072632F534F4654574152455F4652414DAB :10B1B00045574F524B2F53455256494345532F4CF9 :10B1C0005749502F6C7769702D312E332E322F73E3 :10B1D00072632F636F72652F7564702E63000000B9 :10B1E000726562696E64203D3D203000636865636E :10B1F0006B20746861742066697273742070627564 :10B20000662063616E20686F6C642073747275636E :10B2100074207564705F686472000000702D3E7069 :10B2200061796C6F6164203D3D20697068647200D3 :10B230002E2E2F7372632F534F4654574152455F42 :10B240004652414D45574F524B2F53455256494355 :10B2500045532F4C5749502F6C7769702D312E3341 :10B260002E322F7372632F636F72652F697076347D :10B270002F69636D702E6300636865636B2074686B :10B2800061742066697273742070627566206361F0 :10B290006E20686F6C642069636D70206D657373D8 :10B2A0006167650069636D705F696E7075743A20DF :10B2B0006D6F76696E6720702D3E7061796C6F617D :10B2C0006420746F2069702068656164657220660F :10B2D00061696C65640A0000636865636B2074686B :10B2E0006174206669727374207062756620636190 :10B2F0006E20686F6C642073747275637420746858 :10B30000652049434D502068656164657200000006 :10B3100069636D705F696E7075743A20636F7079E0 :10B32000696E6720746F206E657720706275662085 :10B330006661696C65640A0069636D705F696E704F :10B3400075743A20726573746F72696E67206F72DC :10B350006967696E616C20702D3E7061796C6F61F8 :10B3600064206661696C65640A00000043616E27B1 :10B3700074206D6F7665206F7665722068656164F4 :10B38000657220696E207061636B65740000000057 :10B390002E2E2F7372632F534F4654574152455FE1 :10B3A0004652414D45574F524B2F534552564943F4 :10B3B00045532F4C5749502F6C7769702D312E33E0 :10B3C0002E322F7372632F636F72652F697076341C :10B3D0002F69702E63000000636865636B207468DA :10B3E000617420666972737420706275662063618F :10B3F0006E20686F6C64207374727563742069705A :10B400005F68647200FFFFFFFF00000000000000A3 :10B410002E2E2F7372632F534F4654574152455F60 :10B420004652414D45574F524B2F53455256494373 :10B4300045532F4C5749502F6C7769702D312E335F :10B440002E322F7372632F636F72652F697076349B :10B450002F69705F667261672E630000746869739C :10B46000206E656564732061207062756620696E68 :10B47000206F6E65207069656365210073616E6978 :10B48000747920636865636B206C696E6B656420FA :10B490006C697374000000007072657620213D2095 :10B4A00069707200707265762D3E6E657874203D0D :10B4B0003D2069707200000069705F72656173738E :10B4C0005F70627566636F756E74203E3D20636CBD :10B4D000656E0000636865636B20667261676D6509 :10B4E0006E747320646F6E2774206F7665726C6162 :10B4F000700000006E6F2070726576696F75732042 :10B50000667261676D656E742C2074686973206D56 :10B51000757374206265207468652066697273743F :10B5200020667261676D656E7421000073616E69DB :10B53000747920636865636B0000000076616C6954 :10B54000646174655F646174616772616D3A6E65B0 :10B5500078745F70627566213D4E554C4C0000005A :10B5600076616C69646174655F646174616772615E :10B570006D3A646174616772616D20656E64213D2E :10B58000646174616772616D206C656E00FFFFFF1E :10B59000FFFFFF002E2E2F7372632F534F46545719 :10B5A0004152455F4652414D45574F524B2F5345EF :10B5B0005256494345532F4C5749502F6C77697069 :10B5C0002D312E332E322F7372632F6E65746966A0 :10B5D0002F6574686172702E630000006E65746977 :10B5E000662D3E6877616464725F6C656E206D7570 :10B5F0007374206265207468652073616D652061D5 :10B6000073204554484152505F4857414444525F6B :10B610004C454E20666F722065746861727021001F :10B620007120213D204E554C4C000000712D3E7084 :10B6300020213D204E554C4C00000000722D3E70E4 :10B6400020213D204E554C4C000000006172705F7F :10B650007461626C655B695D2E71203D3D204E55C5 :10B660004C4C000069203C204152505F5441424CF8 :10B67000455F53495A4500006E657469662D3E6802 :10B6800077616464725F6C656E203D3D204554486F :10B690004152505F4857414444525F4C454E000070 :10B6A000636865636B207468617420666972737483 :10B6B00020706275662063616E20686F6C64207311 :10B6C0007472756374206574686172705F68647207 :10B6D000000000006172705F7461626C655B695D9F :10B6E0002E7374617465203D3D2050454E44494E93 :10B6F00047206F7220535441424C45006E6F2070BA :10B7000061636B65742071756575657320616C6C20 :10B710006F77656421000000000000002E2E2F735B :10B7200072632F534F4654574152455F4652414D25 :10B7300045574F524B2F53455256494345532F4C73 :10B740005749502F6C7769702D706F72742D312EA0 :10B75000332E322F48442F69662F6E657469662F29 :10B76000776C69662E6300000A09000052580000D9 :10B7700054580000FFFFFF740000000001FFFFFFAE :10B780000000FFFFFFFFFF400000000001FFFFFF80 :10B7900041505000484D4700312E352E312E370094 :10B7A000312E352E312E3100312E352E312E3400F2 :10B7B00080017C7C80017C7480017C7C80017C6ABF :10B7C00080017DCA80017D7880017D2A80017CD83E :10B7D00080017C86800185D2800185CA800185CA6E :10B7E000800185D2800185C2800185C2800185BA31 :10B7F000800185BA02040B0C121618242C30424822 :10B80000606C0000322E312E312E310078C40E00D3 :10B81000352E332E31000000352E332E350000003A :10B82000352E332E340000008001BF808001BF928E :10B830008001BFA88001BF5A8001BF668001BFD4CC :10B840008001BF5A8001BFE08001BF5A8001BF5A0A :10B850008001BF5A8001BF5A8001BF5A8001BF5A80 :10B860008001BF5A8001BF5A8001BF5A8001BF5A70 :10B870008001BF5A8001BF5A8001BF5A8001BF5A60 :10B880008001BF5A8001BF5A8001BF5A8001BF5A50 :10B890008001BF5A8001BF5A8001BF5A8001BF5A40 :10B8A0008001BF5A8001BF5A8001BF5A8001BF5A30 :10B8B0008001BF5A8001BF5A8001BF5A8001BF5A20 :10B8C0008001BF5A8001BF5A8001BF5A8001BF5A10 :10B8D0008001BF5A8001BF5A8001BF5A8001BF5A00 :10B8E0008001BF5A8001BF5A8001BF5A8001BF5AF0 :10B8F0008001BF5A8001BF5A8001BF5A8001BF5AE0 :10B900008001BF5A8001BF5A8001BF5A8001BF5ACF :10B910008001BF5A8001BF5A8001BF5A8001BF5ABF :10B920008001BF5A8001BF7C8001C0448001BF5AA2 :10B930008001C0448001BF5A8001C17C8001BF5A90 :10B940008001C1708001BF5A8001C1648001BF5A6B :10B950008001BF5A8001BF5A8001BF5A8001C1AC2B :10B960008001BF5A8001BF5A8001C1A08001BF5A27 :10B970008001C1948001BF5A8001BF5A8001BF5A23 :10B980008001BF5A8001BF5A8001BF5A8001BF5A4F :10B990008001BF5A8001BF5A8001BF5A8001BF5A3F :10B9A0008001BF5A8001BF5A8001BF5A8001BF5A2F :10B9B0008001BF5A8001BF5A8001BF5A8001BF5A1F :10B9C0008001BF5A8001BF5A8001BF5A8001BF5A0F :10B9D0008001BF5A8001BF5A8001BF5A8001BF5AFF :10B9E0008001BF5A8001BF5A8001BF5A8001BF5AEF :10B9F0008001BF5A8001BF5A8001BF5A8001BF5ADF :10BA00008001BF5A8001BF5A8001BF5A8001BF5ACE :10BA10008001BF5A8001BF5A8001BF5A8001BF5ABE :10BA20008001BF5A8001BF5A8001BF5A8001BF5AAE :10BA30008001BF5A8001BF5A8001BF5A8001BF5A9E :10BA40008001BF5A8001BF5A8001BF5A8001BF5A8E :10BA50008001BF5A8001BF5A8001BF5A8001BF5A7E :10BA60008001BF5A8001BF5A8001BF5A8001BF5A6E :10BA70008001BF5A8001BF5A8001BF5A8001BF5A5E :10BA80008001BF5A8001BF5A8001BF5A8001BF5A4E :10BA90008001BF5A8001BF5A8001BF5A8001BF5A3E :10BAA0008001BF5A8001BF5A8001BF5A8001BF5A2E :10BAB0008001BF5A8001BF5A8001BF5A8001BF5A1E :10BAC0008001BF5A8001BF5A8001BF5A8001BF5A0E :10BAD0008001BF5A8001BF5A8001BF5A8001BF5AFE :10BAE0008001BF5A8001BF5A8001BF5A8001BF5AEE :10BAF0008001BF5A8001BF5A8001BF5A8001BF5ADE :10BB00008001BF5A8001BF5A8001BF5A8001BF5ACD :10BB10008001BF5A8001C02C8001C1588001C02C17 :10BB20008001C02C8001C1888001BF5A8001C044BF :10BB30008001BF5A8001C0508001BF5A8001C050AF :10BB40008001BF5A8001C02C8001BF5A8001C02CE7 :10BB50008001C0388001C0388001C0388001BF5AE0 :10BB60008001C02C8001C02C8001C14C8001BF5AD3 :10BB70008001BF5A8001C1408001BF5A8001BF5A75 :10BB80008001BF5A8001BF5A8001BF5A8001BF5A4D :10BB90008001BF5A8001BF5A8001BF5A8001BF5A3D :10BBA0008001C1348001BF5A8001BF5A8001BF5A51 :10BBB0008001BF5A8001BF5A8001BF5A8001BF5A1D :10BBC0008001C1288001BF5A8001BF5A8001BF5A3D :10BBD0008001BF5A8001BF5A8001BF5A8001BF5AFD :10BBE0008001BF5A8001BF5A8001BF5A8001BF5AED :10BBF0008001BF5A8001BF5A8001BF5A8001BF5ADD :10BC00008001BF5A8001BF5A8001BF5A8001BF5ACC :10BC10008001BF5A8001BF5A8001BF5A8001BF5ABC :10BC20008001BF5A8001BF5A8001BF5A8001BF5AAC :10BC30008001BF5A8001BF5A8001BF5A8001BF5A9C :10BC40008001BF5A8001BF5A8001BF5A8001BF5A8C :10BC50008001BF5A8001BF5A8001BF5A8001BF5A7C :10BC60008001BF5A8001BF5A8001BF5A8001BF5A6C :10BC70008001BF5A8001BF5A8001BF5A8001BF5A5C :10BC80008001BF5A8001BF5A8001BF5A8001BF5A4C :10BC90008001BF5A8001BF5A8001BF5A8001BF5A3C :10BCA0008001BF5A8001BF5A8001BF5A8001BF5A2C :10BCB0008001BF5A8001BF5A8001BF5A8001BF5A1C :10BCC0008001BF5A8001BF5A8001BF5A8001BF5A0C :10BCD0008001BF5A8001BF5A8001BF5A8001BF5AFC :10BCE0008001BF5A8001BF5A8001BF5A8001BF5AEC :10BCF0008001BF5A8001BF5A8001BF5A8001BF5ADC :10BD00008001BF5A8001BF5A8001BF5A8001BF5ACB :10BD10008001BF5A8001BF5A8001BF5A8001BF5ABB :10BD20008001BF5A8001BF5A8001BF5A8001BF5AAB :10BD30008001BF5A8001BF5A8001BF5A8001BF5A9B :10BD40008001BF5A8001BF5A8001BF5A8001BF5A8B :10BD50008001BF5A8001BF5A8001BF5A8001BF5A7B :10BD60008001BF5A8001BF5A8001BF5A8001C11CA7 :10BD70008001C1108001BF5A8001C1048001BF5AF7 :10BD80008001BF5A8001BF5A8001C0F88001C0EC19 :10BD90008001BF5A8001BF5A8001C0E08001BF5AB4 :10BDA0008001BF5A8001C0D48001C0C88001C0BCDE :10BDB0008001C0B08001C0A48001C0988001C08C07 :10BDC0008001BF5A8001C0808001C0748001BF5AC9 :10BDD0008001C0688001C05C8001C48E8001C47C89 :10BDE0008001C46A8001C4588001C4468001C43403 :10BDF0008001C3928001C3928001C4228001C410DB :10BE00008001C3FE8001C3EC8001C3DA8001C3C896 :10BE10008001C3B68001C3A48001C3A48001C4A073 :10BE20008001C2D48001C2D48001C2D48001C5C0C7 :10BE30008001C5AE8001C59C8001C2D48001C2D4FE :10BE40008001C58A8001C2D48001C2D48001C57836 :10BE50008001C5668001C5548001C5428001C5309E :10BE60008001C51E8001C50C8001C4FA8001C4E8B0 :10BE70008001C2D48001C4D68001C4C48001C2D470 :10BE80008001C2D48001C2D48001C2D48001C2D456 :10BE90008001C2D48001C2D48001C2D48001C2D446 :10BEA0008001C2D48001C2D48001C2D48001C2D436 :10BEB0008001C2D48001C2D48001C2D48001C2D426 :10BEC0008001C2D48001C2D48001C2D48001C2D416 :10BED0008001C2D48001C2D48001C2D48001C2D406 :10BEE0008001C2D48001C2D48001C2D48001C2D4F6 :10BEF0008001C2D48001C2D48001C2D48001C2D4E6 :10BF00008001C2D48001C2D48001C2D48001C2D4D5 :10BF10008001C2D48001C2D48001C2D48001C2D4C5 :10BF20008001C2D48001C2D48001C2D48001C2D4B5 :10BF30008001C2D48001C2D48001C2D48001C2D4A5 :10BF40008001C2D48001C2D48001C2D48001C2D495 :10BF50008001C2D48001C2D48001C2D48001C2D485 :10BF60008001C2D48001C2D48001C2D48001C2D475 :10BF70008001C2D48001C2D48001C2D48001C2D465 :10BF80008001C2D48001C2D48001C2D48001C2D455 :10BF90008001C2D48001C2D48001C2D48001C2D445 :10BFA0008001C2D48001C2D48001C2D48001C2D435 :10BFB0008001C2D48001C2D48001C2D48001C2D425 :10BFC0008001C2D48001C2D48001C2D48001C2D415 :10BFD0008001C2D48001C2D48001C2D48001C2D405 :10BFE0008001C2D48001C2D48001C2D48001C2D4F5 :10BFF0008001C2D48001C2D48001C2D48001C2D4E5 :10C000008001C2D48001C2D48001C2D48001C2D4D4 :10C010008001C4B28001EFCA8001EFCE8001EF7AC7 :10C020008001EF7A8001EF828001EF8A8001EF9238 :10C030008001EF9A8001EFA28001EFAA8001EFB2A8 :10C040008001EFBA8001EFC28001EFD68001F96074 :10C050008001F93E8001F9CC8001F8A68001F9BE8B :10C060008001F91C8001F8A68001F8E28001F8A6A1 :10C070008001F8A68001F8A68001F8A68001F8A644 :10C080008001F8A68001F8A68001F8A68001F8A634 :10C090008001F8A68001F8A68001F8A68001F8A624 :10C0A0008001F8A68001F8A68001F8A68001F8A614 :10C0B0008001F8A68001F8A68001F8A68001F8A604 :10C0C0008001F8A68001F8A68001F8A68001F8A6F4 :10C0D0008001F8A68001F8A68001F8A68001F8A6E4 :10C0E0008001F8A68001F8A68001F8A68001F8A6D4 :10C0F0008001F8A68001F8A68001F8A68001F8A6C4 :10C100008001F8A68001F8A68001F8A68001F8A6B3 :10C110008001F8A68001F8A68001F8A68001F8A6A3 :10C120008001F8A68001F8A68001F8A68001F8A693 :10C130008001F8A68001F8A68001F8A68001F8A683 :10C140008001F8A68001F8A68001F8C08001FA58A5 :10C150008001F8F08001F8F08001F90E8001F8F01C :10C160008001F8F08001F8F08001F8F08001F8F02B :10C170008001F8F08001F8F08001F8F08001F8F01B :10C180008001F8F08001F90E8001F8F08001F8F0EC :10C190008001F8F08001F8F08001F8F08001F8F0FB :10C1A0008001F8F08001FA488001F8F08001F8F091 :10C1B0008001F8F08001F8F08001F8F08001F8F0DB :10C1C0008001F8F08001F8F08001F8F08001F8F0CB :10C1D0008001F8F08001F8F08001F8F08001F8F0BB :10C1E0008001F8F08001F8F08001F8F08001F8F0AB :10C1F0008001F8F08001F8F08001F8F08001F8F09B :10C200008001F8F08001F8F08001F8F08001F8F08A :10C210008001F8F08001F8F08001F8F08001F8F07A :10C220008001F8F08001F8F08001F8F08001F8F06A :10C230008001F8F08001F8F08001F8F08001F8F05A :10C240008001F8F08001F8F08001F8F08001F8F04A :10C250008001F8F08001F8F08001F8F08001F8F03A :10C260008001F8F08001F8F08001F8F08001F8F02A :10C270008001F8F08001F8F08001F8F08001F8F01A :10C280008001F8F08001F8F08001F8F08001F8F00A :10C290008001F8F08001F8F08001F8F08001F8F0FA :10C2A0008001F8F08001F8F08001F8F08001F8F0EA :10C2B0008001F8F08001F8F08001F8F08001F8F0DA :10C2C0008001F8F08001F8F08001F8F08001F8F0CA :10C2D0008001F8F08001F8F08001F8F08001F8F0BA :10C2E0008001F8F08001F8F08001F8F08001F8F0AA :10C2F0008001F8F08001F8F08001F8F08001F8F09A :10C300008001F8F08001F8F08001F8F08001F8F089 :10C310008001F8F08001F8F08001F8F08001F8F079 :10C320008001F8F08001F8F08001F8F08001F8F069 :10C330008001F8F08001F8F08001F8F08001F8F059 :10C340008001F8F08001F8F08001F8F08001F8F049 :10C350008001F90E8001FA348001F8F08001F90EB5 :10C360008001F8F08001F8F08001F8F08001F8F029 :10C370008001F8F08001F8F08001F8F08001F90EFA :10C380008001F8F08001F8F08001FA2C8001FA2495 :10C390008001FA1C8001FA148001FA0C8001FA0471 :10C3A0008001FA408001F8F08001FA5057455F495A :10C3B0004E445F38303231315F434F4E4E45435427 :10C3C0004544000057455F494E445F3830323131B3 :10C3D0005F444953434F4E4E454354494E47000036 :10C3E00057455F494E445F38303231315F494253DF :10C3F000535F444953434F4E4E4543544544000018 :10C40000332E312E322E312E34000000352E3233B1 :10C4100000000000352E32322E320000352E32322E :10C420002E310000352E322E39000000352E3138E5 :10C430002E310000352E31382E320000352E3232AA :10C440002E340000352E32342E320000352E323498 :10C450002E310000352E31312E310000352E322E96 :10C4600032000000352E31362E320000352E3136A6 :10C470002E310000312E312E312E323200000000DC :10C48000352E322E31392E3500000000352E322E59 :10C4900031392E3400000000352E322E31392E3342 :10C4A00000000000352E322E31392E3200000000FF :10C4B000352E322E31392E3100000000352E322E2D :10C4C00031000000352E31312E320000352E313151 :10C4D0002E330000352E31312E340000352E31310F :10C4E0002E350000352E31312E360000352E3131FB :10C4F0002E380000352E31312E37000073736964F9 :10C500000000000070736B004A756E6B41500000B4 :10C5100057534300656170005746412D53696D7054 :10C520006C65436F6E6669672D456E726F6C6C65E6 :10C53000652D312D300000006964656E7469747971 :10C54000000000006E7277696669000064656661CC :10C55000756C740057455F494E445F383032313155 :10C560005F444953434F4E4E4543544544000000F9 :10C5700057455F494E445F50414952574953455FC3 :10C580004D49435F4552524F5200000057455F49A5 :10C590004E445F47524F55505F4D49435F4552529D :10C5A0004F52000057455F494E445F43414E444956 :10C5B000444154455F4C495354000000494E4143A7 :10C5C0005449564500000000444953434F4E4E45E0 :10C5D00043544544000000005343414E4E494E47EA :10C5E000000000004153534F43494154494E470016 :10C5F0004153534F43494154454400003457415936 :10C600005F48414E445348414B45000047524F5507 :10C61000505F48414E445348414B4500434F4D50B5 :10C620004C45544544000000554E4B4E4F574E006C :10C630004354524C2D4556454E542D5445524D4968 :10C640004E4154494E47202D207369676E616C201E :10C650002564207265636569766564007769726533 :10C660006400000043616E63656C6C696E672061F5 :10C67000757468656E7469636174696F6E2074693E :10C680006D656F75740000005750413A2045415068 :10C690004F4C2070726F63657373696E6720636FB0 :10C6A0006D706C657465000043616E63656C6C69E8 :10C6B0006E67207363616E207265717565737400B7 :10C6C00052534E3A207573696E672049454545209F :10C6D0003830322E3131692F44392E3000000000BD :10C6E0005750413A207573696E672049454545208A :10C6F0003830322E3131692F44332E3000000000A3 :10C700005750413A204661696C656420746F20700F :10C7100061727365205750412049452066726F6DE4 :10C72000206173736F63696174696F6E20696E66EF :10C730006F0000005750413A2044726976657220BC :10C74000757365642064697361626C6564206772E7 :10C750006F75702063697068657220307825782065 :10C76000286D61736B203078257829202D20726523 :10C770006A656374000000005750413A20447269B2 :10C7800076657220757365642064697361626C6597 :10C790006420706169727769736520636970686588 :10C7A00072203078257820286D61736B20307825D1 :10C7B0007829202D2072656A656374005750413ACC :10C7C00020447269766572207573656420646973AC :10C7D00061626C6564206B6579206D616E6167656F :10C7E0006D656E74203078257820286D61736B201C :10C7F0003078257829202D2072656A6563740000E1 :10C800005750413A207573696E672047544B204357 :10C81000434D50005750413A207573696E67204769 :10C82000544B20544B4950005750413A207573697E :10C830006E672047544B205745503130340000007C :10C840005750413A207573696E672047544B205703 :10C8500045503430000000005750413A207573694C :10C860006E672050544B2043434D50005750413A7F :10C87000207573696E672050544B20544B4950000B :10C880005750413A207573696E672050544B204EC3 :10C890004F4E45005750413A207573696E67204BE3 :10C8A00045595F4D474D54203830322E31580000E5 :10C8B0005750413A207573696E67204B45595F4D5B :10C8C000474D54205750412D50534B005750413A3B :10C8D000207573696E67204B45595F4D474D542055 :10C8E0005750412D4E4F4E45000000005750413AE1 :10C8F000204661696C656420746F2073656C6563A4 :10C9000074205750412F52534E0000004661696C0D :10C91000656420746F20706172736520746865208F :10C92000636F6E66696775726174696F6E206669A0 :10C930006C652027257327202D2065786974696E22 :10C94000670000005265636F6E6669677572617497 :10C95000696F6E20636F6D706C65746564000000B4 :10C9600053657474696E672061757468656E746967 :10C97000636174696F6E2074696D656F75743A20B8 :10C98000256420736563202564207573656300004A :10C9900053657474696E67207363616E207265718C :10C9A000756573743A2025642073656320256420BF :10C9B000757365630000000041757468656E746985 :10C9C000636174696F6E20776974682025303278EE :10C9D0003A253032783A253032783A253032783A72 :10C9E000253032783A253032782074696D656420BC :10C9F0006F75742E00000000547279696E672074A0 :10CA00006F206173736F63696174652077697468FF :10CA100020253032783A253032783A253032783A4B :10CA2000253032783A253032783A2530327820284D :10CA3000535349443D2725732720667265713D2570 :10CA400064204D487A290000547279696E67207419 :10CA50006F206173736F63696174652077697468AF :10CA60002053534944202725732700004173736FD7 :10CA700063696174696F6E20726571756573742086 :10CA8000746F2074686520647269766572206661CF :10CA9000696C6564000000007770615F7375707089 :10CAA0006C6963616E742076302E352E31300A4306 :10CAB0006F7079726967687420286329203230307A :10CAC000332D323030382C204A6F756E69204D611D :10CAD0006C696E656E203C6A4077312E66693E2037 :10CAE000616E6420636F6E7472696275746F7273C5 :10CAF00000000000546869732070726F6772616D86 :10CB0000206973206672656520736F667477617241 :10CB1000652E20596F752063616E2064697374728D :10CB2000696275746520697420616E642F6F72206C :10CB30006D6F646966792069740A756E6465722028 :10CB4000746865207465726D73206F662074686503 :10CB500020474E552047656E6572616C20507562A6 :10CB60006C6963204C6963656E73652076657273CA :10CB7000696F6E20322E0A0A416C7465726E6174A0 :10CB80006976656C792C207468697320736F66749C :10CB900077617265206D61792062652064697374C4 :10CBA0007269627574656420756E6465722074685C :10CBB00065207465726D73206F66207468650A4223 :10CBC0005344206C6963656E73652E205365652040 :10CBD000524541444D4520616E6420434F505949B0 :10CBE0004E4720666F72206D6F72652064657461B8 :10CBF000696C732E0A0000002530325800000000D6 :10CC00008003C4FC80024A908002490000000010AA :10CC100000000014000000000000002000000000E0 :10CC20008003D3EC80024DF0800248880000006051 :10CC300000000000000000000000000100000000F3 :10CC40008003D3F880024DCC800248280000000009 :10CC500000000000000000000000000000000000D4 :10CC60008003C50480024D00800248C4000000001B :10CC700000000000000000000000000000000001B3 :10CC80008003D4008002408C800247A8000000008E :10CC90000000000000000000000000000000000094 :10CCA0008003D40880023F448002467C00000000DC :10CCB0000000000000000000000000000000000074 :10CCC0008003D41480023F188002466C00000000EC :10CCD0000000000000000000000000000000000054 :10CCE0008003D42080023EEC8002465C00000000FD :10CCF0000000000000000000000000000000000034 :10CD00008003D42880023CA4800244740000000008 :10CD10000000000000000000000000000000000013 :10CD20008003C51480024B9080024B00000000007D :10CD300000000000000000000000000000000000F3 :10CD40008003C53880024A908002490000000068D4 :10CD50000000006C00000000000000000000000067 :10CD60008003D43480024A908002490000000070A1 :10CD7000000000740000000000000000000000003F :10CD80008003D44880024A90800249000000007865 :10CD90000000007C000000100000002000000001E6 :10CDA0008003D45080024A90800249000000008035 :10CDB00000000084000000000000000000000000EF :10CDC0008003D45480024A90800249000000008809 :10CDD0000000008C000000000000000000000001C6 :10CDE0008003D46080024A908002490000000090D5 :10CDF0000000000000000000000000000000000033 :10CE00008003D46880024A908002490000000094A8 :10CE10000000000000000000000000000000000012 :10CE20008003D47080024A9080024900000000987C :10CE300000000000000000000000000000000000F2 :10CE40008003D47C80024A90800249000000009C4C :10CE500000000000000000000000000000000000D2 :10CE60008003D48880024A9080024900000000A01C :10CE700000000000000000000000000000000001B1 :10CE80008003D49C80024A9080024900000000A4E4 :10CE90000000000000000000000000000000000092 :10CEA0008003D4A480024A9080024900000000A8B8 :10CEB0000000000000000000000000000000000072 :10CEC0008003D4B480024A9080024900000000AC84 :10CED0000000000000000000000000000000000052 :10CEE0008003D4C880024A9080024900000000B04C :10CEF0000000000000000000000000000000000032 :10CF00008003D4D480024A9080024900000000B41B :10CF10000000000000000000000000000000000011 :10CF20008003D4E080024A9080024900000000B8EB :10CF300000000000000000000000000000000000F1 :10CF40008003D4F080024A9080024900000000BCB7 :10CF500000000000000000000000000000000000D1 :10CF60008003D50080024A9080024900000000C082 :10CF700000000000000000000000000000000001B0 :10CF80008003D51480024A9080024900000000C44A :10CF90000000000000000000000000000000000091 :10CFA0008003D52080024A9080024900000000C81A :10CFB0000000000000000000000000000000000071 :10CFC0008003D53080024A9080024900000000CCE6 :10CFD0000000000000000000000000000000000051 :10CFE0008003D54480024A9080024900000000D4AA :10CFF0000000000000000000000000000000000031 :10D000008003D54C80024A9080024900000000D87D :10D010000000000000000000000000000000000010 :10D020008003D55480024A9080024900000000DC51 :10D0300000000000000000000000000000000000F0 :10D040008003D55C80024A9080024900000000E025 :10D0500000000000000000000000000000000001CF :10D060008003D56080024A9080024900000000E8F9 :10D0700000000000000000000000000000000000B0 :10D080008003D56C80024A9080024900000000ECC9 :10D090000000000000000000000000000000000090 :10D0A0008003D65C80024DF080024888000000E4D6 :10D0B0000000000000000000000000000000000070 :10D0C0008003D57480024DF080024888000000F093 :10D0D0000000000000000000000000000000000050 :10D0E0008003D58080024A78800244580000000006 :10D0F000000000000000000000000000000000012F :10D100008003D58C80024A608002443C000000000D :10D11000000000000000000000000000000000010E :10D120008003D59880024A48800244200000000015 :10D1300000000000000000000000000000000001EE :10D140008003D5A480024A3080024404000000001D :10D1500000000000000000000000000000000001CE :10D160008003D5B080024DF0800248880000014461 :10D1700000000000000000000000000000000000AF :10D180008003D5C080024DF0800248880000000C6A :10D19000000000000000000000000000000000008F :10D1A0008003D5CC80024DF0800248880000017CCD :10D1B000000000000000000000000000000000006F :10D1C0008003D5DC80024A90800249000000018083 :10D1D000000000000000000000000000000000004F :10D1E0008003D5E880024DF0800248880000019C51 :10D1F000000000000000000000000000000000002F :10D200008003D5F880024DF0800248880000018438 :10D21000000000000000000000000001000000000D :10D220008003D60080024DF0800248880000006430 :10D2300000000000000000000000000200000000EC :10D240008003D60880024DF0800248880000014823 :10D2500000000000000000000000000100000000CD :10D260008003D62080024DF080024888000001949F :10D2700000000000000000000000000100000000AD :10D280008003D62C80024A9080024900000001A051 :10D29000000000000000000000000000000000008E :10D2A0008003D63480024DF0800248880000019847 :10D2B000000000000000000000000001000000006D :10D2C0008003D63C80024DF0800248880000014C6B :10D2D000000000000000000000000001000000004D :10D2E0008003D64880024DF080024888000001A4E7 :10D2F00000000000000000000000271000000000F7 :10D300002A0000004F50454E000000005348415293 :10D31000454400004C454150000000005745503145 :10D320003034000057455034300000005750412D34 :10D3300045415000494545453830323158000000DC :10D340005750410052534E005750413200000000E8 :10D3500025734F50454E00002573534841524544B4 :10D360000000000025734C454150000025734343E5 :10D370004D5000002573544B49500000257357450C :10D3800050313034000000002573574550343000D0 :10D3900025734E4F4E45000025735750412D505375 :10D3A0004B00000025735750412D454150000000AF :10D3B000257349454545383032315800257357505B :10D3C000412D4E4F4E45000025735750410000003F :10D3D000257352534E0000007765705F6B657925A9 :10D3E0006400000025732573000000007363616E04 :10D3F0005F73736964000000627373696400000006 :10D4000070726F746F0000006B65795F6D676D748B :10D4100000000000706169727769736500000000A8 :10D4200067726F7570000000617574685F616C678A :10D4300000000000616E6F6E796D6F75735F6964D7 :10D44000656E74697479000065617070736B0000BB :10D450006E61690070617373776F72640000000021 :10D4600063615F636572740063615F70617468001B :10D47000636C69656E745F6365727400707269765F :10D480006174655F6B657900707269766174655F60 :10D490006B65795F706173737764000064685F66C1 :10D4A000696C65007375626A6563745F6D6174634E :10D4B00068000000616C747375626A6563745F6D07 :10D4C000617463680000000063615F6365727432B9 :10D4D0000000000063615F7061746832000000004A :10D4E000636C69656E745F6365727432000000007E :10D4F000707269766174655F6B6579320000000057 :10D50000707269766174655F6B6579325F706173A3 :10D510007377640064685F66696C653200000000C0 :10D520007375626A6563745F6D617463683200006D :10D53000616C747375626A6563745F6D617463684E :10D5400032000000706861736531000070686173BB :10D5500065320000706373630000000070696E0044 :10D56000656E67696E655F69640000006B65795F71 :10D57000696400006561706F6C5F666C6167730061 :10D580007765705F6B657930000000007765705FCC :10D590006B657931000000007765705F6B657932EB :10D5A000000000007765705F6B6579330000000054 :10D5B0007765705F74785F6B6579696478000000E7 :10D5C0007072696F72697479000000006561705F44 :10D5D000776F726B61726F756E6400007061635F6C :10D5E00066696C6500000000667261676D656E7447 :10D5F0005F73697A650000006D6F6465000000006C :10D600007573655F7770730070726F6163746976AC :10D61000655F6B65795F63616368696E67000000D1 :10D6200064697361626C65640000000069645F7323 :10D6300074720000706565726B6579006D6978655C :10D64000645F63656C6C00006672657175656E631E :10D6500079000000888E000077696669656E6769E9 :10D660006E65000057694669456E67696E65000022 :10D670008003D6588003D664800254C880025420A8 :10D6800080024F98800252E0800253E8800254A446 :10D690000000000080024F9A800252C880024F941E :10D6A00080024F96800252B08002529880024F9CB6 :10D6B00080024F9E8002523C800251E0800251D491 :10D6C000800251AC00000000000000008002518088 :10D6D00080024FF480024FD00000000000000000E4 :10D6E000000000000000000000000000000000003A :10D6F000000000000000000080024FA08002564E93 :10D700008002564A80025646800256408002563CAD :10D7100080025636800256328002562C80025626EF :10D72000800256928002568C800256888002568271 :10D730008002567C80025676800256728002566CB9 :10D740008002566680025B3480025C0880025BE0E7 :10D7500080025BBA80025BA080025B3480025B3493 :10D7600080025B3480025DC280025E3A80025E12FB :10D7700080025D8E80025CC280025AF680025DF4F7 :10D7800080025DCE800268DC80026AA280026A00AC :10D7900080026904800268F2800269EE800268DC1F :10D7A000800268DC800268E8800268E8800268E83D :10D7B000696E76616C696461746500004354524C13 :10D7C0002D4556454E542D4541502D535543434507 :10D7D0005353204541502061757468656E746963C8 :10D7E0006174696F6E20636F6D706C657465642021 :10D7F0007375636365737366756C6C7920286261F9 :10D80000736564206F6E206C6F776572206C617930 :10D810006572207375636365737329004354524CBA :10D820002D4556454E542D4541502D5355434345A6 :10D830005353204541502061757468656E74696367 :10D840006174696F6E20636F6D706C6574656420C0 :10D850007375636365737366756C6C7900000000A3 :10D860004354524C2D4556454E542D4541502D465E :10D8700041494C55524520454150206175746865B9 :10D880006E7469636174696F6E206661696C65644A :10D8900000000000494E495449414C495A45000096 :10D8A0004541503A206D6F7265207468616E202585 :10D8B000642061757468656E7469636174696F6E04 :10D8C00020726F756E6473202D2061626F72740018 :10D8D0004354524C2D4556454E542D4541502D4EE6 :10D8E0004F54494649434154494F4E2000000000DF :10D8F0004354524C2D4556454E542D4541502D53C1 :10D900005441525445442045415020617574686526 :10D910006E7469636174696F6E207374617274658B :10D92000640000004745545F4D4554484F44000093 :10D930004541503A204661696C656420746F2069E6 :10D940006E697469616C697A6520454150206D6526 :10D9500074686F643A2076656E646F722025752056 :10D960006D6574686F642025752028257329000073 :10D970004354524C2D4556454E542D4541502D4D46 :10D980004554484F44204541502076656E646F727F :10D99000202575206D6574686F6420257520282505 :10D9A00073292073656C656374656400454150207C :10D9B0006465696E697400008002794480027ADAD5 :10D9C00080027B5880027BA280027CC880027CD2CD :10D9D00080027AC45750413A20544B495020636F1B :10D9E000756E7465726D656173757265732073749D :10D9F0006F707065640000004173736F63696174D8 :10DA0000656420746F2061206E6577204253533A1D :10DA10002042535349443D253032783A25303278FC :10DA20003A253032783A253032783A253032783A11 :10DA300025303278000000004173736F63696174B0 :10DA40006564207769746820253032783A25303251 :10DA5000783A253032783A253032783A25303278A3 :10DA60003A253032780000005750413A20342D5783 :10DA700061792048616E647368616B6520666169D5 :10DA80006C6564202D207072652D73686172656409 :10DA9000206B6579206D617920626520696E636F06 :10DAA00072726563740000004354524C2D45564514 :10DAB0004E542D444953434F4E4E45435445442004 :10DAC0002D20446973636F6E6E656374206576659F :10DAD0006E74202D2072656D6F7665206B6579738D :10DAE000000000004D69636861656C204D4943206A :10DAF0006661696C757265206465746563746564DC :10DB000000000000544B495020636F756E746572BD :10DB10006D65617375726573207374617274656489 :10DB200000000000000000080000000600000006E1 :10DB3000496E646578202F204141202F20504D4BA5 :10DB40004944202F2065787069726174696F6E2076 :10DB500028696E207365636F6E647329202F206FB0 :10DB600070706F7274756E69737469630A00000077 :10DB7000256420253032783A253032783A25303203 :10DB8000783A253032783A253032783A2530327872 :10DB9000200000002025642025640A00504D4B2001 :10DBA0004E616D650000000052534E3A207374615F :10DBB0007274696E67207072652D61757468656E28 :10DBC0007469636174696F6E2077697468202530A9 :10DBD00032783A253032783A253032783A25303268 :10DBE000783A253032783A253032780052534E3A1E :10DBF0002070726F63657373696E6720504D4B536D :10DC0000412063616E646964617465206C6973743A :10DC10000000000052534E3A206E6F7420696E204F :10DC20007375697461626C652073746174652066D4 :10DC30006F72206E6577207072652D6175746865EE :10DC40006E7469636174696F6E00000052534E3ADE :10DC500020504D4B53412063616E6469646174656B :10DC600020253032783A253032783A253032783AE9 :10DC7000253032783A253032783A253032782073A0 :10DC8000656C656374656420666F72207072652DC3 :10DC900061757468656E7469636174696F6E0000A4 :10DCA00052534E3A20504D4B53412063616E64698C :10DCB0006461746520253032783A253032783A250F :10DCC0003032783A253032783A253032783A253079 :10DCD000327820646F6573206E6F74206E656564A2 :10DCE000207072652D61757468656E746963617406 :10DCF000696F6E20616E796D6F72650052534E3A96 :10DD0000206E6F206D6F72652070656E64696E673E :10DD100020504D4B53412063616E646964617465AA :10DD20007300000052534E3A2061646465642050D1 :10DD30004D4B53412063616368652063616E646984 :10DD40006461746520253032783A253032783A257E :10DD50003032783A253032783A253032783A2530E8 :10DD60003278207072696F202564000052534E3A59 :10DD7000207072652D61757468656E746963617475 :10DD8000696F6E207769746820253032783A2530C3 :10DD900032783A253032783A253032783A253032A6 :10DDA000783A253032782074696D6564206F757417 :10DDB00000000000636F6D706C657465642073759E :10DDC000636365737366756C6C79000052534E3AE9 :10DDD000206661696C656420746F20676574206DCE :10DDE00061737465722073657373696F6E206B6500 :10DDF000792066726F6D207072652D617574682070 :10DE00004541504F4C207374617465206D616368A7 :10DE1000696E65730000000052534E3A20707265BF :10DE20002D61757468656E7469636174696F6E20C5 :10DE30007769746820253032783A253032783A256F :10DE40003032783A253032783A253032783A2530F7 :10DE50003278202573000000800000008002B51C8D :10DE60008002B50A8002B5008002B4FA8002B4F4E0 :10DE70008002B4EE8002B4E8000FAC010050F20260 :10DE8000000FAC02000FAC01000FAC050050F20215 :10DE9000000FAC040050F2010050F2010050F201FA :10DEA0000050F2050050F200000FAC00000FAC0370 :10DEB0000050F200000FAC0449454545203830328F :10DEC0002E315820286E6F20575041290000000045 :10DED0005750412F49454545203830322E31582F73 :10DEE00045415000575041322F4945454520383073 :10DEF000322E31582F45415000000000575041321A :10DF00002D50534B000000005745502D3430000079 :10DF10005745502D313034007061697277697365EF :10DF20005F6369706865723D25730A67726F75700B :10DF30005F6369706865723D25730A6B65795F6D13 :10DF4000676D743D25730A005750413A20257320B0 :10DF5000287372633D253032783A253032783A257D :10DF60003032783A253032783A253032783A2530D6 :10DF7000327829005750413A204B6579206E656709 :10DF80006F74696174696F6E20636F6D706C657416 :10DF90006564207769746820253032783A253032FC :10DFA000783A253032783A253032783A253032784E :10DFB0003A25303278205B50544B3D25732047542E :10DFC0004B3D25735D0000005750413A20496E7665 :10DFD000616C6964204541504F4C2D4B657920663A :10DFE00072616D65202D206B65795F6461746120BD :10DFF0006F766572666C6F7720282564203E202539 :10E000006C752900494520696E20332F34206D73CB :10E010006720646F6573206E6F74206D6174636830 :10E02000207769746820494520696E2042656163E4 :10E030006F6E2F50726F62655265737020286E6F1D :10E040002049453F29000000494520696E20332FB3 :10E0500034206D736720646F6573206E6F74206D5C :10E0600061746368207769746820494520696E206F :10E07000426561636F6E2F50726F62655265737097 :10E0800000000000506F737369626C6520646F77E5 :10E090006E67726164652061747461636B2064658E :10E0A000746563746564202D2052534E207761732C :10E0B00020656E61626C656420616E642052534E0F :10E0C0002049452077617320696E206D7367203386 :10E0D0002F342C20627574206E6F7420696E20427C :10E0E0006561636F6E2F50726F6265526573700069 :10E0F0005750413A204661696C656420746F20670F :10E100006574206D61737465722073657373696FD4 :10E110006E206B65792066726F6D204541504F4CC3 :10E12000207374617465206D616368696E65730046 :10E130005750413A204B65792068616E647368617D :10E140006B652061626F7274656400005750413ADC :10E15000204661696C656420746F20676574207265 :10E16000616E646F6D206461746120666F7220530C :10E170004E6F6E6365000000506169727769736568 :10E18000206B657920657870616E73696F6E000031 :10E190005750413A2047726F75702072656B6579F0 :10E1A000696E6720636F6D706C6574656420776954 :10E1B000746820253032783A253032783A2530326A :10E1C000783A253032783A253032783A253032782C :10E1D000205B47544B3D25735D00000000000000AC :10E1E000000000000050F204000FAC02000FAC0170 :10E1F00052096AD53036A538BF40A39E81F3D7FBBC :10E200007CE339829B2FFF87348E4344C4DEE9CB05 :10E21000547B9432A6C2233DEE4C950B42FAC34E7A :10E22000082EA16628D924B2765BA2496D8BD12530 :10E2300072F8F66486689816D4A45CCC5D65B692D4 :10E240006C704850FDEDB9DA5E154657A78D9D8478 :10E2500090D8AB008CBCD30AF7E45805B8B3450698 :10E26000D02C1E8FCA3F0F02C1AFBD0301138A6BB2 :10E270003A9111414F67DCEA97F2CFCEF0B4E673E2 :10E2800096AC7422E7AD3585E2F937E81C75DF6E90 :10E2900047F11A711D29C5896FB7620EAA18BE1BF6 :10E2A000FC563E4BC6D279209ADBC0FE78CD5AF49C :10E2B0001FDDA8338807C731B11210592780EC5FE2 :10E2C00060517FA919B54A0D2DE57A9F93C99CEF3E :10E2D000A0E03B4DAE2AF5B0C8EBBB3C835399613F :10E2E000172B047EBA77D626E169146355210C7D7D :10E2F00001020408102040801B36000051F4A75092 :10E300007E4165531A17A4C33A275E963BAB6BCB8D :10E310001F9D45F1ACFA58AB4BE303932030FA55FF :10E32000AD766DF688CC7691F5024C254FE5D7FC9D :10E33000C52ACBD726354480B562A38FDEB15A49B2 :10E3400025BA1B6745EA0E985DFEC0E1C32F750232 :10E35000814CF0128D4697A36BD3F9C6038F5FE70C :10E3600015929C95BF6D7AEB955259DAD4BE832DE8 :10E37000587421D349E069298EC9C84475C2896A95 :10E38000F48E797899583E6B27B971DDBEE14FB6AE :10E39000F088AD17C920AC667DCE3AB463DF4A1869 :10E3A000E51A31829751336062537F45B16477E05B :10E3B000BB6BAE84FE81A01CF9082B947048685892 :10E3C0008F45FD1994DE6C87527BF8B7AB73D3236E :10E3D000724B02E2E31F8F576655AB2AB2EB280758 :10E3E0002FB5C20386C57B9AD33708A5302887F29C :10E3F00023BFA5B202036ABAED16825C8ACF1C2B3A :10E40000A779B492F307F2F04E69E2A165DAF4CD90 :10E410000605BED5D134621FC4A6FE8A342E539D94 :10E42000A2F355A0058AE132A4F6EB750B83EC3913 :10E430004060EFAA5E719F06BD6E10513E218AF9C1 :10E4400096DD063DDD3E05AE4DE6BD4691548DB5EB :10E4500071C45D050406D46F605015FF1998FB2444 :10E46000D6BDE997894043CC67D99E77B0E842BDD5 :10E4700007898B88E7195B3879C8EEDBA17C0A47EE :10E480007C420FE9F8841EC90000000009808683E1 :10E49000322BED481E1170AC6C5A724EFD0EFFFB14 :10E4A0000F8538563DAED51E362D39270A0FD96453 :10E4B000685CA6219B5B54D124362E3A0C0A67B1C6 :10E4C0009357E70FB4EE96D21B9B919E80C0C54F29 :10E4D00061DC20A25A774B691C121A16E293BA0A21 :10E4E000C0A02AE53C22E043121B171D0E090D0BAC :10E4F000F28BC7AD2DB6A8B9141EA9C857F119855E :10E50000AF75074CEE99DDBBA37F60FDF701269F39 :10E510005C72F5BC44663BC55BFB7E348B4329765D :10E52000CB23C6DCB6EDFC68B8E4F163D731DCCAB6 :10E53000426385101397224084C61120854A247DAA :10E54000D2BB3DF8AEF93211C729A16D1D9E2F4BEC :10E55000DCB230F30D8652EC77C1E3D02BB3166CEE :10E56000A970B999119448FA47E96422A8FC8CC4AF :10E57000A0F03F1A567D2CD8223390EF87494EC722 :10E58000D938D1C18CCAA2FE98D40B36A6F581CF5A :10E59000A57ADE28DAB78E263FADBFA42C3A9DE4DB :10E5A0005078920D6A5FCC9B547E4662F68D13C202 :10E5B00090D8B8E82E39F75E82C3AFF59F5D80BE74 :10E5C00069D0937C6FD52DA9CF2512B3C8AC993BE8 :10E5D00010187DA7E89C636EDB3BBB7BCD267809DA :10E5E0006E5918F4EC9AB701834F9AA8E6956E65B8 :10E5F000AAFFE67E21BCCF08EF15E8E6BAE79BD973 :10E600004A6F36CEEA9F09D429B07CD631A4B2AF86 :10E610002A3F2331C6A5943035A266C0744EBC375C :10E62000FC82CAA6E090D0B033A7D815F104984A6E :10E6300041ECDAF77FCD500E1791F62F764DD68D3F :10E6400043EFB04DCCAA4D54E49604DF9ED1B5E320 :10E650004C6A881BC12C1FB84665517F9D5EEA0439 :10E66000018C355DFA877473FB0B412EB3671D5A1D :10E6700092DBD252E91056336DD647139AD7618C8C :10E6800037A10C7A59F8148EEB133C89CEA927EEEA :10E69000B761C935E11CE5ED7A47B13C9CD2DF5941 :10E6A00055F2733F1814CE7973C737BF53F7CDEACD :10E6B0005FFDAA5BDF3D6F147844DB86CAAFF38150 :10E6C000B968C43E3824342CC2A3405F161DC372FF :10E6D000BCE2250C283C498BFF0D954139A80171FE :10E6E000080CB3DED8B4E49C6456C1907BCB846143 :10E6F000D532B670486C5C74D0B85742C66363A517 :10E70000F87C7C84EE777799F67B7B8DFFF2F20DB7 :10E71000D66B6BBDDE6F6FB191C5C55460303050A4 :10E7200002010103CE6767A9562B2B7DE7FEFE1978 :10E73000B5D7D7624DABABE6EC76769A8FCACA45B1 :10E740001F82829D89C9C940FA7D7D87EFFAFA153B :10E75000B25959EB8E4747C9FBF0F00B41ADADEC18 :10E76000B3D4D4675FA2A2FD45AFAFEA239C9CBFA0 :10E7700053A4A4F7E47272969BC0C05B75B7B7C28E :10E78000E1FDFD1C3D9393AE4C26266A6C36365A4D :10E790007E3F3F41F5F7F70283CCCC4F6834345CC1 :10E7A00051A5A5F4D1E5E534F9F1F108E2717193D1 :10E7B000ABD8D873623131532A15153F0804040CC5 :10E7C00095C7C752462323659DC3C35E30181828DA :10E7D000379696A10A05050F2F9A9AB50E070709D5 :10E7E000241212361B80809BDFE2E23DCDEBEB264C :10E7F0004E2727697FB2B2CDEA75759F1209091BB2 :10E800001D83839E582C2C74341A1A2E361B1B2DF4 :10E81000DC6E6EB2B45A5AEE5BA0A0FBA45252F664 :10E82000763B3B4DB7D6D6617DB3B3CE5229297B1B :10E83000DDE3E33E5E2F2F7113848497A65353F5D7 :10E84000B9D1D16800000000C1EDED2C402020605E :10E85000E3FCFC1F79B1B1C8B65B5BEDD46A6ABE5C :10E860008DCBCB4667BEBED97239394B944A4ADE4E :10E87000984C4CD4B05858E885CFCF4ABBD0D06B19 :10E88000C5EFEF2A4FAAAAE5EDFBFB16864343C569 :10E890009A4D4DD766333355118585948A4545CFBA :10E8A000E9F9F91004020206FE7F7F81A05050F0C2 :10E8B000783C3C44259F9FBA4BA8A8E3A25151F352 :10E8C0005DA3A3FE804040C0058F8F8A3F9292AD2A :10E8D000219D9DBC70383848F1F5F50463BCBCDF60 :10E8E00077B6B6C1AFDADA75422121632010103055 :10E8F000E5FFFF1AFDF3F30EBFD2D26D81CDCD4CF3 :10E90000180C0C1426131335C3ECEC2FBE5F5FE11B :10E91000359797A2884444CC2E17173993C4C4570F :10E9200055A7A7F2FC7E7E827A3D3D47C86464AC61 :10E93000BA5D5DE73219192BE6737395C06060A06C :10E94000198181989E4F4FD1A3DCDC7F442222663F :10E95000542A2A7E3B9090AB0B8888838C4646CA0B :10E96000C7EEEE296BB8B8D32814143CA7DEDE79C5 :10E97000BC5E5EE2160B0B1DADDBDB76DBE0E03B45 :10E9800064323256743A3A4E140A0A1E924949DBEE :10E990000C06060A4824246CB85C5CE49FC2C25D85 :10E9A000BDD3D36E43ACACEFC46262A6399191A8DB :10E9B000319595A4D3E4E437F279798BD5E7E73242 :10E9C0008BC8C8436E373759DA6D6DB7018D8D8CA2 :10E9D000B1D5D5649C4E4ED249A9A9E0D86C6CB48F :10E9E000AC5656FAF3F4F407CFEAEA25CA6565AFE8 :10E9F000F47A7A8E47AEAEE9100808186FBABAD525 :10EA0000F07878884A25256F5C2E2E72381C1C24DD :10EA100057A6A6F173B4B4C797C6C651CBE8E8238E :10EA2000A1DDDD7CE874749C3E1F1F21964B4BDDFD :10EA300061BDBDDC0D8B8B860F8A8A85E07070907E :10EA40007C3E3E4271B5B5C4CC6666AA904848D8B3 :10EA500006030305F7F6F6011C0E0E12C26161A350 :10EA60006A35355FAE5757F969B9B9D017868691BF :10EA700099C1C1583A1D1D27279E9EB9D9E1E13899 :10EA8000EBF8F8132B9898B322111133D26969BBB4 :10EA9000A9D9D970078E8E89339494A72D9B9BB6E4 :10EAA0003C1E1E2215878792C9E9E92087CECE49F0 :10EAB000AA5555FF50282878A5DFDF7A038C8C8F64 :10EAC00059A1A1F8098989801A0D0D1765BFBFDA10 :10EAD000D7E6E631844242C6D06868B8824141C375 :10EAE000299999B05A2D2D771E0F0F117BB0B0CBFD :10EAF000A85454FC6DBBBBD62C16163A002020201F :10EB000020202020202028282828282020202020DD :10EB100020202020202020202020202020881010AD :10EB20001010101010101010101010101004040409 :10EB300004040404040404101010101010104141C7 :10EB400041414141010101010101010101010101B5 :10EB500001010101010101011010101010104242C9 :10EB60004242424202020202020202020202020285 :10EB70000202020202020202101010102000000025 :10EB80000000000000000000000000000000000085 :10EB90000000000000000000000000000000000075 :10EBA0000000000000000000000000000000000065 :10EBB0000000000000000000000000000000000055 :10EBC0000000000000000000000000000000000045 :10EBD0000000000000000000000000000000000035 :10EBE0000000000000000000000000000000000025 :10EBF0000000000000000000000000000000000015 :10EC00002D2D0000504F5349584C595F434F5252DD :10EC10004543540025733A206F7074696F6E20600D :10EC200025732720697320616D626967756F75733D :10EC30002028636F756C6420626520602D2D25731C :10EC400027206F7220602D2D257327290A000000D0 :10EC500025733A20696E76616C6964206F707469FF :10EC60006F6E202D2D20602D2563270A00000000E7 :10EC700025733A20617267756D656E7420726571D7 :10EC8000756972656420666F72206F7074696F6E4B :10EC9000206000002D2D2573270A00002D256327F5 :10ECA0000A00000043000000000004A88002F4668F :10ECB0008002F4888002F2B08002F2E88002F4520E :10ECC0008002F4508002F3FE8002F4268002F3DC1E :10ECD0008002F3DC8002F3CC8002F3DC8002F3EAF2 :10ECE0008002F3EA8002F3DC3030303030303030F4 :10ECF000303030303030303001020B040B0506016B :10ED00000B01020B040B0506010B0B0B03040B0597 :10ED10000B0B0B0B0B0B040B050B0B0B0B0B0B0B50 :10ED20000B0B0B0B0B05080B040B0B070B0B0B0949 :10ED30000B040B050B0B0B0B0A0B040B0B0B0B0B38 :10ED40000B0B0B040B0B0B0B0B0B0B030B0B0B0B22 :10ED50000B0B0B0B080B0B0B0B0B0B00000000003D :10ED6000000000000001000304000000000001009A :10ED7000030400000000000007030400000000007E :10ED80000000030400000000000000000400000078 :10ED90000000020003040000000000010005060559 :10EDA0000000000001000506000000000000000354 :10EDB0000400000000000008000000000000000047 :10EDC000080000000000000000000000000000003B :10EDD0003031323334353637383941424344454691 :10EDE0000000000030313233343536373839616253 :10EDF0006364656600000000202020202020202081 :10EE000020202020202020200808080808080808C2 :10EE10000808080808080808080808080808080872 :10EE2000080808080808080807080807020808076B :10EE30000808060708070508000101010101010192 :10EE40000101080808080808080408040404040468 :10EE50000808080803080804080808040804080843 :10EE6000040808080808080808040804040404043E :10EE70000304030803080404040308040304080843 :10EE8000040803080808080808080808080808080B :10EE900008080808080808080808080808080808F2 :10EEA00008080808080808080808080808080808E2 :10EEB00008080808080808080808080808080808D2 :10EEC00008080808080808080808080808080808C2 :10EED00008080808080808080808080808080808B2 :10EEE00008080808080808080808080808080808A2 :10EEF0000808080808080808080808080808080892 :10EF00000808080808080808000A000100020003B1 :10EF1000000400050006000700080009000A000BB5 :10EF2000000C000D000E000F00100000000000009B :10EF300000000000000000000000000000000000D1 :10EF400000000000000000000000000000000000C1 :10EF500000000000000000000000000000000000B1 :10EF600000000000000000000000000000000000A1 :10EF70000000000000000000000000000000000091 :10EF800000000000000000000000000080037FB4CB :10EF900080037E2080037E2080037E2080037E20ED :10EFA00080037E2080037E2080037E2080037E20DD :10EFB00080037E20FFFFFFFFFFFFFFFF49534F2D20 :10EFC000383835392D310000800333228003334433 :10EFD0008003316C800331A48003330E8003330C33 :10EFE000800332BA800332E2800332988003329881 :10EFF0008003328880033298800332A6800332A6D1 :10F00000800332988003363480034AA480034AA4E4 :10F010008003364480034AA480034AA480034AA4A0 :10F0200080034AA480034AA480034AA4800336488C :10F030008003371C80034AA48003371880033724D9 :10F0400080034AA480033842800338468003384650 :10F0500080033846800338468003384680033846AC :10F0600080033846800338468003384680034AA42C :10F0700080034AA480034AA480034AA480034AA4CC :10F0800080034AA480034AA480034AA480034AA4BC :10F0900080034AA48003394480033B9680034AA43A :10F0A00080033B9680034AA480034AA480034AA4B9 :10F0B00080034AA48003387880034AA480034AA4CA :10F0C0008003416280034AA480034AA480034AA4C7 :10F0D00080034AA480034AA48003452680034AA4EF :10F0E00080034AA48003361A80034AA480034AA4FA :10F0F00080034AA480034AA480034AA480034AA44C :10F1000080034AA480034AA480034AA480034AA43B :10F11000800338988003395A80033B9680033B96DE :10F1200080033B968003387C8003395A80034AA4CD :10F1300080034AA48003388080034AA480033FA24E :10F1400080034178800343A48003389480034AA459 :10F150008003445880034AA48003453C80034AA4AA :10F1600080034AA48003476E01020B040B050601CD :10F170000B01020B040B0506010B0B0B03040B0523 :10F180000B0B0B0B0B0B040B050B0B0B0B0B0B0BDC :10F190000B0B0B0B0B05080B040B0B070B0B0B09D5 :10F1A0000B040B050B0B0B0B0A0B040B0B0B0B0BC4 :10F1B0000B0B0B040B0B0B0B0B0B0B030B0B0B0BAE :10F1C0000B0B0B0B080B0B0B0B0B0B0000000000C9 :10F1D0000000000000010003040000000000010026 :10F1E000030400000000000007030400000000000A :10F1F0000000030400000000000000000400000004 :10F2000000000200030400000000000100050605E4 :10F2100000000000010005060000000000000003DF :10F2200004000000000000080000000000000000D2 :10F2300008000000000000000000000000000000C6 :10F24000494E4600696E66004E414E006E616E008A :10F2500020202020202020202020202020202020AE :10F26000303030303030303030303030303030309E :10F27000080808080808080808080808080808080E :10F2800008080808080808080808080808080808FE :10F2900007080807020808070808060708070508FE :10F2A0000001010101010101010108080808080825 :10F2B00008040804040404040808080803080804EF :10F2C00008080804080408080408080808080808CA :10F2D00008040804040404040304030803080404E1 :10F2E00004030804030408080408030808080808BD :10F2F000080808080808080808080808080808088E :10F30000080808080808080808080808080808087D :10F31000080808080808080808080808080808086D :10F32000080808080808080808080808080808085D :10F33000080808080808080808080808080808084D :10F34000080808080808080808080808080808083D :10F35000080808080808080808080808080808082D :10F36000080808080808080808080808080808081D :10F37000496E66696E697479000000004E614E0046 :10F3800000000005000000190000007D3FF00000B3 :10F390000000000040240000000000004059000070 :10F3A00000000000408F40000000000040C38800C3 :10F3B0000000000040F86A0000000000412E848038 :10F3C00000000000416312D0000000004197D78484 :10F3D0000000000041CDCD65000000004202A05FAA :10F3E0002000000042374876E8000000426D1A9481 :10F3F000A200000042A2309CE540000042D6BCC4FE :10F400001E900000430C6BF5263400004341C37985 :10F4100037E080004376345785D8A00043ABC16DF8 :10F42000674EC80043E158E460913D004415AF1DAC :10F4300078B58C40444B1AE4D6E2EF504480F0CFCC :10F44000064DD59244B52D02C7E14AF644EA784309 :10F4500079D99DB44341C37937E080004693B8B56C :10F46000B5056E174D384F03E93FF9F55A827748D5 :0CF47000F9301D3275154FDD7F73BF3C75 :10F480000000000455736167653A2074746370204E :10F490002D742F2D72205B2D6F7074696F6E735DEC :10F4A00020686F73740A20202020202020202D6CDB :10F4B0002020202020206C656E677468206F6620F5 :10F4C00062756673207772697474656E20746F203C :10F4D0006E6574776F726B202864656661756C74F5 :10F4E0002031303234290A20202020202020202DD5 :10F4F0006E2020202020206E756D626572206F6660 :10F500002062756673207772697474656E20746FFB :10F51000206E6574776F726B202864656661756C08 :10F52000742031303234290A20202020202020204D :10F530002D70202020202020706F7274206E756D39 :10F5400062657220746F2073656E6420746F20286A :10F5500064656661756C742032303030290A202071 :10F560002020202020202D752020202020207564A0 :10F57000700A20202020202020202D7620202020EE :10F580002020766572626F73650A000080039954CB :10F59000000000000000000000000000000000006B :10F5A000000000000000000000000000000000005B :10F5B000000000000000000000000000000000004B :10F5C000000000000000000000000000000000003B :10F5D000000000000000000000000000000000002B :10F5E000000000000000000000000000000000001B :10F5F000000000000000000000000000000000000B :10F6000000000000000000000000000000000000FA :10F6100000000000000000000000000000000000EA :10F6200000000000000000000000000000000000DA :10F6300000000000000000000000000000000000CA :10F6400000000000000000000000000000000000BA :10F6500000000000000000000000000000000000AA :10F660000000000400000000ABCD00000000196E97 :10F6700010000000FFFFFFFFFFFFFFFFFF7590007E :10F68000000001FFFFFFFFFEFFFFFFFFFF751000FF :10F69000000001FFFFFFFFFE00050000800149ECB4 :10F6A000800149EC800149EC800149EC0000000038 :10F6B000000002340000000C02040B0C1216182487 :10F6C0003048606C000000000000000000000000F6 :10F6D00000000010010000146D3E86B0FFFFFFFF28 :10F6E000FFFF0000000003E800000001000000012F :10F6F00000000320000000010000000000000008DE :10F70000000000020000006400000000000000058E :10F710000000000F000000050000000F000013882B :10F7200000001388000007D00000138800003E800E :10F73000000000020000000C02040B0C121618243A :10F740003048606C00000000000000000000000075 :10F7500000000000000000000D0102030405060780 :10F7600008090A0B0C0D000000000011FF0000004A :10F770000000000000000000000000000000000089 :10F780000000000000000000000000000000FFFF7B :10F79000FFFFFFFF00000001000000030000000168 :10F7A0000000000100000000000000010000000156 :10F7B0000000000100000001000000000000000146 :10F7C0000000000A00000005000000000000000525 :10F7D00000000000FFFFFFFF00000001000000002C :10F7E00000000002FF000000000000000000000018 :10F7F0000000000000000000000000000000000009 :10F80000000000000000FFFFFFFFFFFF00000001FD :10F810000000000300000000000007D000000064AA :10F8200003010100060200000000000C82848B8CA2 :10F83000129618243048606C0000000000000000A0 :10F8400000000000000000000000000100000001B6 :10F85000000000010014000000000014000007D0A8 :10F860000000000000000001000000000000000691 :10F8700000000001FFFFFFFF0A00000064756D6DCE :10F88000795F7373696400000000000000000000ED :10F890000000000000000000000000000000000068 :10F8A000303030313032303330343035303630373C :10F8B0003038303930613062306330643065306602 :10F8C0003130313131323133313431353136313714 :10F8D00031383139316131623163316431653166DA :10F8E00000000000000000028003D670000000004D :10F8F000800255EC80025614800256588002569CB5 :10F90000800256AA800255F4800256B6800256D074 :10F910008002614C8003EAFD0000003F000000010E :10F920008003EF2C8003EF4C8003EF6C000000009D :10F9300000000000000000000000000000000000C7 :10F940008003ECA4000000000000000000000000A4 :10F9500000000000000000000000000000000000A7 :10F960000000000000000000000000000000000097 :10F970000000000000000000000000000000000087 :10F980000000000000000000000000000000000077 :10F990000000000000000000000000000000000067 :10F9A0000000000000000000000000000000000057 :10F9B0000000000000000000000000000000000047 :10F9C0000000000000000000000000000000000037 :10F9D0000000000000000000000000000000000027 :10F9E0000000000000000000000000000000000017 :10F9F0000000000000000000000000000000000007 :10FA000000000000000000000000000000000000F6 :10FA1000000004A800000000000000000000059C99 :10FA20000000059C000005A4000005A4000005AC32 :10FA3000000005AC000005B4000005B4000005BCE2 :10FA4000000005BC000005C4000005C4000005CC92 :10FA5000000005CC000005D4000005D4000005DC42 :10FA6000000005DC000005E4000005E4000005ECF2 :10FA7000000005EC000005F4000005F4000005FCA2 :10FA8000000005FC00000604000006040000060C4F :10FA90000000060C00000614000006140000061CFE :10FAA0000000061C00000624000006240000062CAE :10FAB0000000062C00000634000006340000063C5E :10FAC0000000063C00000644000006440000064C0E :10FAD0000000064C00000654000006540000065CBE :10FAE0000000065C00000664000006640000066C6E :10FAF0000000066C00000674000006740000067C1E :10FB00000000067C00000684000006840000068CCD :10FB10000000068C00000694000006940000069C7D :10FB20000000069C000006A4000006A4000006AC2D :10FB3000000006AC000006B4000006B4000006BCDD :10FB4000000006BC000006C4000006C4000006CC8D :10FB5000000006CC000006D4000006D4000006DC3D :10FB6000000006DC000006E4000006E4000006ECED :10FB7000000006EC000006F4000006F4000006FC9D :10FB8000000006FC00000704000007040000070C4A :10FB90000000070C00000714000007140000071CF9 :10FBA0000000071C00000724000007240000072CA9 :10FBB0000000072C00000734000007340000073C59 :10FBC0000000073C00000744000007440000074C09 :10FBD0000000074C00000754000007540000075CB9 :10FBE0000000075C00000764000007640000076C69 :10FBF0000000076C00000774000007740000077C19 :10FC00000000077C00000784000007840000078CC8 :10FC10000000078C00000794000007940000079C78 :10FC20000000079C000007A4000007A4000007AC28 :10FC3000000007AC000007B4000007B4000007BCD8 :10FC4000000007BC000007C4000007C4000007CC88 :10FC5000000007CC000007D4000007D4000007DC38 :10FC6000000007DC000007E4000007E4000007ECE8 :10FC7000000007EC000007F4000007F4000007FC98 :10FC8000000007FC00000804000008040000080C45 :10FC90000000080C00000814000008140000081CF4 :10FCA0000000081C00000824000008240000082CA4 :10FCB0000000082C00000834000008340000083C54 :10FCC0000000083C00000844000008440000084C04 :10FCD0000000084C00000854000008540000085CB4 :10FCE0000000085C00000864000008640000086C64 :10FCF0000000086C00000874000008740000087C14 :10FD00000000087C00000884000008840000088CC3 :10FD10000000088C00000894000008940000089C73 :10FD20000000089C000008A4000008A4000008AC23 :10FD3000000008AC000008B4000008B4000008BCD3 :10FD4000000008BC000008C4000008C4000008CC83 :10FD5000000008CC000008D4000008D4000008DC33 :10FD6000000008DC000008E4000008E4000008ECE3 :10FD7000000008EC000008F4000008F4000008FC93 :10FD8000000008FC00000904000009040000090C40 :10FD90000000090C00000914000009140000091CEF :10FDA0000000091C00000924000009240000092C9F :10FDB0000000092C00000934000009340000093C4F :10FDC0000000093C00000944000009440000094CFF :10FDD0000000094C00000954000009540000095CAF :10FDE0000000095C00000964000009640000096C5F :10FDF0000000096C00000974000009740000097C0F :10FE00000000097C00000984000009840000098CBE :10FE10000000098C00000994000009940002000011 :0CFE2000FFFFFFFF0000000100007AFC63 :040000058000000077 :00000001FF ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/CONFIG/conf_access.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Memory access control configuration file. * * This file contains the possible external configuration of the memory access * control. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _CONF_ACCESS_H_ #define _CONF_ACCESS_H_ #include "compiler.h" #include "board.h" /*! \name Activation of Logical Unit Numbers */ //! @{ #define LUN_0 DISABLE //!< On-Chip Virtual Memory. #define LUN_1 ENABLE //!< AT45DBX Data Flash. #define LUN_2 DISABLE //!< SD/MMC Card over SPI. #define LUN_3 DISABLE #define LUN_4 DISABLE #define LUN_5 DISABLE #define LUN_6 DISABLE #define LUN_7 DISABLE #define LUN_USB DISABLE //!< Host Mass-Storage Memory. //! @} /*! \name LUN 0 Definitions */ //! @{ #define VIRTUAL_MEM LUN_0 #define LUN_ID_VIRTUAL_MEM LUN_ID_0 #define LUN_0_INCLUDE "virtual_mem.h" #define Lun_0_test_unit_ready virtual_test_unit_ready #define Lun_0_read_capacity virtual_read_capacity #define Lun_0_wr_protect virtual_wr_protect #define Lun_0_removal virtual_removal #define Lun_0_usb_read_10 virtual_usb_read_10 #define Lun_0_usb_write_10 virtual_usb_write_10 #define Lun_0_mem_2_ram virtual_mem_2_ram #define Lun_0_ram_2_mem virtual_ram_2_mem #define LUN_0_NAME "\"On-Chip Virtual Memory\"" //! @} /*! \name LUN 1 Definitions */ //! @{ #define AT45DBX_MEM LUN_1 #define LUN_ID_AT45DBX_MEM LUN_ID_1 #define LUN_1_INCLUDE "at45dbx_mem.h" #define Lun_1_test_unit_ready at45dbx_test_unit_ready #define Lun_1_read_capacity at45dbx_read_capacity #define Lun_1_wr_protect at45dbx_wr_protect #define Lun_1_removal at45dbx_removal #define Lun_1_usb_read_10 at45dbx_usb_read_10 #define Lun_1_usb_write_10 at45dbx_usb_write_10 #define Lun_1_mem_2_ram at45dbx_df_2_ram #define Lun_1_ram_2_mem at45dbx_ram_2_df #define LUN_1_NAME "\"AT45DBX Data Flash\"" //! @} /*! \name LUN 2 Definitions */ //! @{ #define SD_MMC_SPI_MEM LUN_2 #define LUN_ID_SD_MMC_SPI_MEM LUN_ID_2 #define LUN_2_INCLUDE "sd_mmc_spi_mem.h" #define Lun_2_test_unit_ready sd_mmc_spi_test_unit_ready #define Lun_2_read_capacity sd_mmc_spi_read_capacity #define Lun_2_wr_protect sd_mmc_spi_wr_protect #define Lun_2_removal sd_mmc_spi_removal #define Lun_2_usb_read_10 sd_mmc_spi_usb_read_10 #define Lun_2_usb_write_10 sd_mmc_spi_usb_write_10 #define Lun_2_mem_2_ram sd_mmc_spi_mem_2_ram #define Lun_2_ram_2_mem sd_mmc_spi_ram_2_mem #define LUN_2_NAME "\"SD/MMC Card over SPI\"" //! @} /*! \name USB LUNs Definitions */ //! @{ #define MEM_USB LUN_USB #define LUN_ID_MEM_USB LUN_ID_USB #define LUN_USB_INCLUDE "host_mem.h" #define Lun_usb_test_unit_ready(lun) host_test_unit_ready(lun) #define Lun_usb_read_capacity(lun, nb_sect) host_read_capacity(lun, nb_sect) #define Lun_usb_read_sector_size(lun) host_read_sector_size(lun) #define Lun_usb_wr_protect(lun) host_wr_protect(lun) #define Lun_usb_removal() host_removal() #define Lun_usb_mem_2_ram(addr, ram) host_read_10_ram(addr, ram) #define Lun_usb_ram_2_mem(addr, ram) host_write_10_ram(addr, ram) #define LUN_USB_NAME "\"Host Mass-Storage Memory\"" //! @} /*! \name Actions Associated with Memory Accesses * * Write here the action to associate with each memory access. * * \warning Be careful not to waste time in order not to disturb the functions. */ //! @{ #define memory_start_read_action(nb_sectors) #define memory_stop_read_action() #define memory_start_write_action(nb_sectors) #define memory_stop_write_action() //! @} /*! \name Activation of Interface Features */ //! @{ #define ACCESS_USB DISABLED //!< MEM <-> USB interface. #define ACCESS_MEM_TO_RAM ENABLED //!< MEM <-> RAM interface. #define ACCESS_STREAM ENABLED //!< Streaming MEM <-> MEM interface. //mlf #define ACCESS_STREAM_RECORD DISABLED //!< Streaming MEM <-> MEM interface in record mode. #define ACCESS_MEM_TO_MEM DISABLED //!< MEM <-> MEM interface. #define ACCESS_CODEC DISABLED //!< Codec interface. //! @} /*! \name Specific Options for Access Control */ //! @{ #define GLOBAL_WR_PROTECT DISABLED //!< Management of a global write protection. //! @} #endif // _CONF_ACCESS_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/CONFIG/conf_at45dbx.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief AT45DBX configuration file. * * This file contains the possible external configuration of the AT45DBX. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with an SPI module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _CONF_AT45DBX_H_ #define _CONF_AT45DBX_H_ #include "conf_access.h" #if AT45DBX_MEM == DISABLE #error conf_at45dbx.h is #included although AT45DBX_MEM is disabled #endif #include "at45dbx.h" //_____ D E F I N I T I O N S ______________________________________________ //! Size of AT45DBX data flash memories to manage. #define AT45DBX_MEM_SIZE AT45DBX_1MB //! Number of AT45DBX components to manage. #define AT45DBX_MEM_CNT 1 //! First chip select used by AT45DBX components on the SPI module instance. //! AT45DBX_SPI_NPCS0_PIN always corresponds to this first NPCS, whatever it is. #define AT45DBX_SPI_FIRST_NPCS AT45DBX_SPI_NPCS //! SPI master speed in Hz. #define AT45DBX_SPI_MASTER_SPEED 12000000 //! Number of bits in each SPI transfer. #define AT45DBX_SPI_BITS 8 #endif // _CONF_AT45DBX_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/CONFIG/conf_ebi.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief CONF_EBI EBI/SMC driver for AVR32 UC3. * * \note The values defined in this file are device-specific. See the device * datasheet for further information. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with an SMC module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _CONF_EBI_H_ #define _CONF_EBI_H_ #include "compiler.h" #include "board.h" #if (ET024006DHU_SMC_USE_NCS == 0) #define SMC_USE_NCS0 #define SMC_COMPONENT_CS0 ET024006DHU_SMC_COMPONENT_CS #else #if (ET024006DHU_SMC_USE_NCS == 2) #define SMC_USE_NCS2 #define SMC_COMPONENT_CS2 ET024006DHU_SMC_COMPONENT_CS #else #error This board is not supported #endif #endif #define EBI_DATA_0 ET024006DHU_EBI_DATA_0 #define EBI_DATA_1 ET024006DHU_EBI_DATA_1 #define EBI_DATA_2 ET024006DHU_EBI_DATA_2 #define EBI_DATA_3 ET024006DHU_EBI_DATA_3 #define EBI_DATA_4 ET024006DHU_EBI_DATA_4 #define EBI_DATA_5 ET024006DHU_EBI_DATA_5 #define EBI_DATA_6 ET024006DHU_EBI_DATA_6 #define EBI_DATA_7 ET024006DHU_EBI_DATA_7 #define EBI_DATA_8 ET024006DHU_EBI_DATA_8 #define EBI_DATA_9 ET024006DHU_EBI_DATA_9 #define EBI_DATA_10 ET024006DHU_EBI_DATA_10 #define EBI_DATA_11 ET024006DHU_EBI_DATA_11 #define EBI_DATA_12 ET024006DHU_EBI_DATA_12 #define EBI_DATA_13 ET024006DHU_EBI_DATA_13 #define EBI_DATA_14 ET024006DHU_EBI_DATA_14 #define EBI_DATA_15 ET024006DHU_EBI_DATA_15 #if BOARD==EVK1105 #ifdef EVK1105_REV3 #define EBI_ADDR_19 AVR32_EBI_ADDR_19 #define EBI_NCS_2 ET024006DHU_EBI_NCS #else #define EBI_ADDR_21 ET024006DHU_EBI_ADDR_21 #define EBI_NCS_0 ET024006DHU_EBI_NCS #endif #elif BOARD == UC3C_EK #define EBI_ADDR_22 AVR32_EBI_ADDR_22 #define EBI_NCS_0 ET024006DHU_EBI_NCS #elif BOARD == EVK1104 #define EBI_ADDR_21 ET024006DHU_EBI_ADDR_21 #define EBI_NCS_0 ET024006DHU_EBI_NCS #endif #define EBI_NWE0 ET024006DHU_EBI_NWE #define EBI_NRD ET024006DHU_EBI_NRD #endif // _CONF_EBI_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/CONFIG/conf_sd_mmc_spi.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief SD/MMC configuration file. * * This file contains the possible external configuration of the SD/MMC. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with an SPI module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _CONF_SD_MMC_SPI_H_ #define _CONF_SD_MMC_SPI_H_ #include "conf_access.h" #if SD_MMC_SPI_MEM == DISABLE #error conf_sd_mmc_spi.h is #included although SD_MMC_SPI_MEM is disabled #endif #include "sd_mmc_spi.h" //_____ D E F I N I T I O N S ______________________________________________ //! SPI master speed in Hz. #define SD_MMC_SPI_MASTER_SPEED 12000000 //! Number of bits in each SPI transfer. #define SD_MMC_SPI_BITS 8 #endif // _CONF_SD_MMC_SPI_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/ASM/trampoline.x ================================================ /* This file is part of the ATMEL AVR32-SoftwareFramework-AT32UC3A-1.4.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief AVR32 UC3 ISP trampoline. * * In order to be able to program a project with both BatchISP and JTAGICE mkII * without having to take the general-purpose fuses into consideration, add this * file to the project and change the program entry point to _trampoline. * * The pre-programmed ISP will be erased if JTAGICE mkII is used. * * - Compiler: GNU GCC for AVR32 * - Supported devices: All AVR32UC devices can be used. * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (C) 2006-2008, Atmel Corporation All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of ATMEL may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "conf_isp.h" //! @{ //! \verbatim // This must be linked @ 0x80000000 if it is to be run upon reset. .section .reset, "ax", @progbits .global _trampoline .type _trampoline, @function _trampoline: // Jump to program start. rjmp program_start .org PROGRAM_START_OFFSET program_start: // Jump to the C runtime startup routine. lda.w pc, _stext //! \endverbatim //! @} ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/arduino.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief AT32UC3A EVK1100 board header file. * * This file contains definitions and services related to the features of the * EVK1100 board rev. B and C. * * To use this board, define BOARD=EVK1100. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 AT32UC3A devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _ARDUINO_H_ #define _ARDUINO_H_ #include "compiler.h" #ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling. # include "led.h" #endif // __AVR32_ABI_COMPILER__ /*! \name Oscillator Definitions */ //! @{ // RCOsc has no custom calibration by default. Set the following definition to // the appropriate value if a custom RCOsc calibration has been applied to your // part. //#define FRCOSC AVR32_PM_RCOSC_FREQUENCY //!< RCOsc frequency: Hz. #define FOSC32 32768 //!< Osc32 frequency: Hz. #define OSC32_STARTUP AVR32_PM_OSCCTRL32_STARTUP_8192_RCOSC //!< Osc32 startup time: RCOsc periods. #define FOSC0 12000000 //!< Osc0 frequency: Hz. #define OSC0_STARTUP AVR32_PM_OSCCTRL0_STARTUP_2048_RCOSC //!< Osc0 startup time: RCOsc periods. // Osc1 crystal is not mounted by default. Set the following definitions to the // appropriate values if a custom Osc1 crystal is mounted on your board. //#define FOSC1 12000000 //!< Osc1 frequency: Hz. //#define OSC1_STARTUP AVR32_PM_OSCCTRL1_STARTUP_2048_RCOSC //!< Osc1 startup time: RCOsc periods. //! @} //! Number of LEDs. #define LED_COUNT 0 /*! \name GPIO Connections of LEDs */ //! @{ #define LED0_GPIO AVR32_PIN_PB19 #define LED1_GPIO AVR32_PIN_PB20 #define LED2_GPIO AVR32_PIN_PB21 #define DEB_PIN_GPIO AVR32_PIN_PA20 #define DEB2_PIN_GPIO AVR32_PIN_PB00 //! @} /*! \name PWM Channels of LEDs */ //! @{ #define LED0_PWM 0 #define LED1_PWM 1 #define LED2_PWM 2 //! @} /*! \name PWM Functions of LEDs */ //! @{ #define LED0_PWM_FUNCTION AVR32_PWM_0_FUNCTION #define LED1_PWM_FUNCTION AVR32_PWM_1_FUNCTION #define LED2_PWM_FUNCTION AVR32_PWM_2_FUNCTION //! @} /*! \name Color Identifiers of LEDs to Use with LED Functions */ //! @{ #define LED_MONO0_GREEN LED0 #define LED_MONO1_RED LED1 #define LED_MONO2_BLU LED2 //! @} #if 0 /*! \name SPI Connections of the DIP204 LCD */ //! @{ #define DIP204_SPI (&AVR32_SPI1) #define DIP204_SPI_NPCS 2 #define DIP204_SPI_SCK_PIN AVR32_SPI1_SCK_0_0_PIN #define DIP204_SPI_SCK_FUNCTION AVR32_SPI1_SCK_0_0_FUNCTION #define DIP204_SPI_MISO_PIN AVR32_SPI1_MISO_0_0_PIN #define DIP204_SPI_MISO_FUNCTION AVR32_SPI1_MISO_0_0_FUNCTION #define DIP204_SPI_MOSI_PIN AVR32_SPI1_MOSI_0_0_PIN #define DIP204_SPI_MOSI_FUNCTION AVR32_SPI1_MOSI_0_0_FUNCTION #define DIP204_SPI_NPCS_PIN AVR32_SPI1_NPCS_2_0_PIN #define DIP204_SPI_NPCS_FUNCTION AVR32_SPI1_NPCS_2_0_FUNCTION //! @} /*! \name GPIO and PWM Connections of the DIP204 LCD Backlight */ //! @{ #define DIP204_BACKLIGHT_PIN AVR32_PIN_PB18 #define DIP204_PWM_CHANNEL 6 #define DIP204_PWM_PIN AVR32_PWM_6_PIN #define DIP204_PWM_FUNCTION AVR32_PWM_6_FUNCTION //! @} #endif /*! \name SPI Connections of the AT45DBX Data Flash Memory */ //! @{ #define AT45DBX_SPI (&AVR32_SPI1) #define AT45DBX_SPI_NPCS 2 #define AT45DBX_SPI_SCK_PIN AVR32_SPI1_SCK_0_0_PIN #define AT45DBX_SPI_SCK_FUNCTION AVR32_SPI1_SCK_0_0_FUNCTION #define AT45DBX_SPI_MISO_PIN AVR32_SPI1_MISO_0_0_PIN #define AT45DBX_SPI_MISO_FUNCTION AVR32_SPI1_MISO_0_0_FUNCTION #define AT45DBX_SPI_MOSI_PIN AVR32_SPI1_MOSI_0_0_PIN #define AT45DBX_SPI_MOSI_FUNCTION AVR32_SPI1_MOSI_0_0_FUNCTION #define AT45DBX_SPI_NPCS2_PIN AVR32_SPI1_NPCS_2_0_PIN #define AT45DBX_SPI_NPCS2_FUNCTION AVR32_SPI1_NPCS_2_0_FUNCTION #define AT45DBX_CHIP_RESET AVR32_PIN_PA02 //! @} /*! \name GPIO and SPI Connections of the SD/MMC Connector */ //! @{ //#define SD_MMC_CARD_DETECT_PIN AVR32_PIN_PA02 //#define SD_MMC_WRITE_PROTECT_PIN AVR32_PIN_PA07 #define SD_MMC_SPI (&AVR32_SPI1) #define SD_MMC_SPI_NPCS 1 #define SD_MMC_SPI_SCK_PIN AVR32_SPI1_SCK_0_0_PIN #define SD_MMC_SPI_SCK_FUNCTION AVR32_SPI1_SCK_0_0_FUNCTION #define SD_MMC_SPI_MISO_PIN AVR32_SPI1_MISO_0_0_PIN #define SD_MMC_SPI_MISO_FUNCTION AVR32_SPI1_MISO_0_0_FUNCTION #define SD_MMC_SPI_MOSI_PIN AVR32_SPI1_MOSI_0_0_PIN #define SD_MMC_SPI_MOSI_FUNCTION AVR32_SPI1_MOSI_0_0_FUNCTION #define SD_MMC_SPI_NPCS_PIN AVR32_SPI1_NPCS_1_0_PIN #define SD_MMC_SPI_NPCS_FUNCTION AVR32_SPI1_NPCS_1_0_FUNCTION //! @} /* Timer Counter to generate clock for WiFi chip*/ # define WIFI_TC (&AVR32_TC) # define WIFI_TC_CHANNEL_ID 0 # define WIFI_TC_CHANNEL_PIN AVR32_TC_A0_0_0_PIN # define WIFI_TC_CHANNEL_FUNCTION AVR32_TC_A0_0_0_FUNCTION // Note that TC_A0_0_0 pin is pin 6 (PB23) on AT32UC3A1512 QFP100. /* Pin related to WiFi chip communication */ #ifndef USE_POLL #define USE_POLL #endif #define SPI_CS 0 #define AVR32_SPI AVR32_SPI1 #define GPIO_IRQ_PIN AVR32_PIN_PA03 #define GPIO_IRQ AVR32_GPIO_IRQ_7 #define GPIO_W_RESET_PIN AVR32_PIN_PA07 #define GPIO_W_SHUTDOWN_PIN AVR32_PIN_PA09 /* Pin related to shield communication */ #define ARDUINO_HANDSHAKE_PIN AVR32_PIN_PA25 #define ARDUINO_EXTINT_PIN AVR32_PIN_PA04 //not used #define AVR32_PDCA_PID_TX AVR32_PDCA_PID_SPI1_TX #define AVR32_PDCA_PID_RX AVR32_PDCA_PID_SPI1_RX #if 0 /*! \name TWI Connections of the Spare TWI Connector */ //! @{ #define SPARE_TWI (&AVR32_TWI) #define SPARE_TWI_SCL_PIN AVR32_TWI_SCL_0_0_PIN #define SPARE_TWI_SCL_FUNCTION AVR32_TWI_SCL_0_0_FUNCTION #define SPARE_TWI_SDA_PIN AVR32_TWI_SDA_0_0_PIN #define SPARE_TWI_SDA_FUNCTION AVR32_TWI_SDA_0_0_FUNCTION //! @} /*! \name SPI Connections of the Spare SPI Connector */ //! @{ #define SPARE_SPI (&AVR32_SPI0) #define SPARE_SPI_NPCS 0 #define SPARE_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN #define SPARE_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION #define SPARE_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN #define SPARE_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION #define SPARE_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN #define SPARE_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION #define SPARE_SPI_NPCS_PIN AVR32_SPI0_NPCS_0_0_PIN #define SPARE_SPI_NPCS_FUNCTION AVR32_SPI0_NPCS_0_0_FUNCTION //! @} #endif #endif // _ARDUINO_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief AT32UC3A EVK1100 board LEDs support package. * * This file contains definitions and services related to the LED features of * the EVK1100 board. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 AT32UC3A devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include #include "preprocessor.h" #include "compiler.h" #include "arduino.h" #include "led.h" //! Structure describing LED hardware connections. typedef const struct { struct { U32 PORT; //!< LED GPIO port. U32 PIN_MASK; //!< Bit-mask of LED pin in GPIO port. } GPIO; //!< LED GPIO descriptor. struct { S32 CHANNEL; //!< LED PWM channel (< 0 if N/A). S32 FUNCTION; //!< LED pin PWM function (< 0 if N/A). } PWM; //!< LED PWM descriptor. } tLED_DESCRIPTOR; //! Hardware descriptors of all LEDs. static tLED_DESCRIPTOR LED_DESCRIPTOR[LED_COUNT] = { #define INSERT_LED_DESCRIPTOR(LED_NO, unused) \ { \ {LED##LED_NO##_GPIO / 32, 1 << (LED##LED_NO##_GPIO % 32)},\ {LED##LED_NO##_PWM, LED##LED_NO##_PWM_FUNCTION } \ }, MREPEAT(LED_COUNT, INSERT_LED_DESCRIPTOR, ~) #undef INSERT_LED_DESCRIPTOR }; //! Saved state of all LEDs. static volatile U32 LED_State = (1 << LED_COUNT) - 1; U32 LED_Read_Display(void) { return LED_State; } void LED_Display(U32 leds) { // Use the LED descriptors to get the connections of a given LED to the MCU. tLED_DESCRIPTOR *led_descriptor; volatile avr32_gpio_port_t *led_gpio_port; // Make sure only existing LEDs are specified. leds &= (1 << LED_COUNT) - 1; // Update the saved state of all LEDs with the requested changes. LED_State = leds; // For all LEDs... for (led_descriptor = &LED_DESCRIPTOR[0]; led_descriptor < LED_DESCRIPTOR + LED_COUNT; led_descriptor++) { // Set the LED to the requested state. led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; if (leds & 1) { led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK; } else { led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK; } led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; leds >>= 1; } } U32 LED_Read_Display_Mask(U32 mask) { return Rd_bits(LED_State, mask); } void LED_Display_Mask(U32 mask, U32 leds) { // Use the LED descriptors to get the connections of a given LED to the MCU. tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; volatile avr32_gpio_port_t *led_gpio_port; U8 led_shift; // Make sure only existing LEDs are specified. mask &= (1 << LED_COUNT) - 1; // Update the saved state of all LEDs with the requested changes. Wr_bits(LED_State, mask, leds); // While there are specified LEDs left to manage... while (mask) { // Select the next specified LED and set it to the requested state. led_shift = 1 + ctz(mask); led_descriptor += led_shift; led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; leds >>= led_shift - 1; if (leds & 1) { led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK; } else { led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK; } led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; leds >>= 1; mask >>= led_shift; } } Bool LED_Test(U32 leds) { return Tst_bits(LED_State, leds); } void LED_Off(U32 leds) { // Use the LED descriptors to get the connections of a given LED to the MCU. tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; volatile avr32_gpio_port_t *led_gpio_port; U8 led_shift; // Make sure only existing LEDs are specified. leds &= (1 << LED_COUNT) - 1; // Update the saved state of all LEDs with the requested changes. Clr_bits(LED_State, leds); // While there are specified LEDs left to manage... while (leds) { // Select the next specified LED and turn it off. led_shift = 1 + ctz(leds); led_descriptor += led_shift; led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK; led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; leds >>= led_shift; } } void LED_On(U32 leds) { // Use the LED descriptors to get the connections of a given LED to the MCU. tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; volatile avr32_gpio_port_t *led_gpio_port; U8 led_shift; // Make sure only existing LEDs are specified. leds &= (1 << LED_COUNT) - 1; // Update the saved state of all LEDs with the requested changes. Set_bits(LED_State, leds); // While there are specified LEDs left to manage... while (leds) { // Select the next specified LED and turn it on. led_shift = 1 + ctz(leds); led_descriptor += led_shift; led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK; led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; leds >>= led_shift; } } void LED_Toggle(U32 leds) { // Use the LED descriptors to get the connections of a given LED to the MCU. tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; volatile avr32_gpio_port_t *led_gpio_port; U8 led_shift; // Make sure only existing LEDs are specified. leds &= (1 << LED_COUNT) - 1; // Update the saved state of all LEDs with the requested changes. Tgl_bits(LED_State, leds); // While there are specified LEDs left to manage... while (leds) { // Select the next specified LED and toggle it. led_shift = 1 + ctz(leds); led_descriptor += led_shift; led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; led_gpio_port->ovrt = led_descriptor->GPIO.PIN_MASK; led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; leds >>= led_shift; } } U32 LED_Read_Display_Field(U32 field) { return Rd_bitfield(LED_State, field); } void LED_Display_Field(U32 field, U32 leds) { // Move the bit-field to the appropriate position for the bit-mask. LED_Display_Mask(field, leds << ctz(field)); } U8 LED_Get_Intensity(U32 led) { tLED_DESCRIPTOR *led_descriptor; // Check that the argument value is valid. led = ctz(led); led_descriptor = &LED_DESCRIPTOR[led]; if (led >= LED_COUNT || led_descriptor->PWM.CHANNEL < 0) return 0; // Return the duty cycle value if the LED PWM channel is enabled, else 0. return (AVR32_PWM.sr & (1 << led_descriptor->PWM.CHANNEL)) ? AVR32_PWM.channel[led_descriptor->PWM.CHANNEL].cdty : 0; } void LED_Set_Intensity(U32 leds, U8 intensity) { tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; volatile avr32_pwm_channel_t *led_pwm_channel; volatile avr32_gpio_port_t *led_gpio_port; U8 led_shift; // For each specified LED... for (leds &= (1 << LED_COUNT) - 1; leds; leds >>= led_shift) { // Select the next specified LED and check that it has a PWM channel. led_shift = 1 + ctz(leds); led_descriptor += led_shift; if (led_descriptor->PWM.CHANNEL < 0) continue; // Initialize or update the LED PWM channel. led_pwm_channel = &AVR32_PWM.channel[led_descriptor->PWM.CHANNEL]; if (!(AVR32_PWM.sr & (1 << led_descriptor->PWM.CHANNEL))) { led_pwm_channel->cmr = (AVR32_PWM_CPRE_MCK << AVR32_PWM_CPRE_OFFSET) & ~(AVR32_PWM_CALG_MASK | AVR32_PWM_CPOL_MASK | AVR32_PWM_CPD_MASK); led_pwm_channel->cprd = 0x000000FF; led_pwm_channel->cdty = intensity; AVR32_PWM.ena = 1 << led_descriptor->PWM.CHANNEL; } else { AVR32_PWM.isr; while (!(AVR32_PWM.isr & (1 << led_descriptor->PWM.CHANNEL))); led_pwm_channel->cupd = intensity; } // Switch the LED pin to its PWM function. led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; if (led_descriptor->PWM.FUNCTION & 0x1) { led_gpio_port->pmr0s = led_descriptor->GPIO.PIN_MASK; } else { led_gpio_port->pmr0c = led_descriptor->GPIO.PIN_MASK; } if (led_descriptor->PWM.FUNCTION & 0x2) { led_gpio_port->pmr1s = led_descriptor->GPIO.PIN_MASK; } else { led_gpio_port->pmr1c = led_descriptor->GPIO.PIN_MASK; } led_gpio_port->gperc = led_descriptor->GPIO.PIN_MASK; } } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief AT32UC3A EVK1100 board LEDs support package. * * This file contains definitions and services related to the LED features of * the EVK1100 board. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 AT32UC3A devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _LED_H_ #define _LED_H_ #include "compiler.h" /*! \name Identifiers of LEDs to Use with LED Functions */ //! @{ #define LED0 0x01 #define LED1 0x02 #define LED2 0x04 #define LED3 0x08 #define LED4 0x10 #define LED5 0x20 #define LED6 0x40 #define LED7 0x80 //! @} /*! \brief Gets the last state of all LEDs set through the LED API. * * \return State of all LEDs (1 bit per LED). * * \note The GPIO pin configuration of all LEDs is left unchanged. */ extern U32 LED_Read_Display(void); /*! \brief Sets the state of all LEDs. * * \param leds New state of all LEDs (1 bit per LED). * * \note The pins of all LEDs are set to GPIO output mode. */ extern void LED_Display(U32 leds); /*! \brief Gets the last state of the specified LEDs set through the LED API. * * \param mask LEDs of which to get the state (1 bit per LED). * * \return State of the specified LEDs (1 bit per LED). * * \note The GPIO pin configuration of all LEDs is left unchanged. */ extern U32 LED_Read_Display_Mask(U32 mask); /*! \brief Sets the state of the specified LEDs. * * \param mask LEDs of which to set the state (1 bit per LED). * * \param leds New state of the specified LEDs (1 bit per LED). * * \note The pins of the specified LEDs are set to GPIO output mode. */ extern void LED_Display_Mask(U32 mask, U32 leds); /*! \brief Tests the last state of the specified LEDs set through the LED API. * * \param leds LEDs of which to test the state (1 bit per LED). * * \return \c TRUE if at least one of the specified LEDs has a state on, else * \c FALSE. * * \note The GPIO pin configuration of all LEDs is left unchanged. */ extern Bool LED_Test(U32 leds); /*! \brief Turns off the specified LEDs. * * \param leds LEDs to turn off (1 bit per LED). * * \note The pins of the specified LEDs are set to GPIO output mode. */ extern void LED_Off(U32 leds); /*! \brief Turns on the specified LEDs. * * \param leds LEDs to turn on (1 bit per LED). * * \note The pins of the specified LEDs are set to GPIO output mode. */ extern void LED_On(U32 leds); /*! \brief Toggles the specified LEDs. * * \param leds LEDs to toggle (1 bit per LED). * * \note The pins of the specified LEDs are set to GPIO output mode. */ extern void LED_Toggle(U32 leds); /*! \brief Gets as a bit-field the last state of the specified LEDs set through * the LED API. * * \param field LEDs of which to get the state (1 bit per LED). * * \return State of the specified LEDs (1 bit per LED, beginning with the first * specified LED). * * \note The GPIO pin configuration of all LEDs is left unchanged. */ extern U32 LED_Read_Display_Field(U32 field); /*! \brief Sets as a bit-field the state of the specified LEDs. * * \param field LEDs of which to set the state (1 bit per LED). * \param leds New state of the specified LEDs (1 bit per LED, beginning with * the first specified LED). * * \note The pins of the specified LEDs are set to GPIO output mode. */ extern void LED_Display_Field(U32 field, U32 leds); /*! \brief Gets the intensity of the specified LED. * * \param led LED of which to get the intensity (1 bit per LED; only the least * significant set bit is used). * * \return Intensity of the specified LED (0x00 to 0xFF). * * \warning The PWM channel of the specified LED is supposed to be used only by * this module. * * \note The GPIO pin configuration of all LEDs is left unchanged. */ extern U8 LED_Get_Intensity(U32 led); /*! \brief Sets the intensity of the specified LEDs. * * \param leds LEDs of which to set the intensity (1 bit per LED). * \param intensity New intensity of the specified LEDs (0x00 to 0xFF). * * \warning The PWM channels of the specified LEDs are supposed to be used only * by this module. * * \note The pins of the specified LEDs are set to PWM output mode. */ extern void LED_Set_Intensity(U32 leds, U8 intensity); #endif // _LED_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/evk1105.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief AT32UC3A EVK1105 board header file. * * This file contains definitions and services related to the features of the * EVK1105 board rev. B. * * To use this board, define BOARD=EVK1105. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 AT32UC3A devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _EVK1105_H_ #define _EVK1105_H_ #ifdef EVK1105_REV3 # include "evk1105_rev3.h" #else #include "compiler.h" #ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling. # include "led.h" #endif // __AVR32_ABI_COMPILER__ /*! \name Oscillator Definitions */ //! @{ // RCOsc has no custom calibration by default. Set the following definition to // the appropriate value if a custom RCOsc calibration has been applied to your // part. //#define FRCOSC AVR32_PM_RCOSC_FREQUENCY //!< RCOsc frequency: Hz. #define FOSC32 32768 //!< Osc32 frequency: Hz. #define OSC32_STARTUP AVR32_PM_OSCCTRL32_STARTUP_8192_RCOSC //!< Osc32 startup time: RCOsc periods. #define FOSC0 12000000 //!< Osc0 frequency: Hz. #define OSC0_STARTUP AVR32_PM_OSCCTRL0_STARTUP_2048_RCOSC //!< Osc0 startup time: RCOsc periods. #define FOSC1 11289600 //!< Osc1 frequency: Hz #define OSC1_STARTUP AVR32_PM_OSCCTRL1_STARTUP_2048_RCOSC //!< Osc1 startup time: RCOsc periods. //! @} /*! \name SDRAM Definitions */ //! @{ //! Part header file of used SDRAM(s). #define SDRAM_PART_HDR "MT48LC16M16A2TG7E/mt48lc16m16a2tg7e.h" //! Data bus width to use the SDRAM(s) with (16 or 32 bits; always 16 bits on //! UC3). #define SDRAM_DBW 16 //! @} /*! \name USB Definitions */ //! @{ //! Multiplexed pin used for USB_ID: AVR32_USBB_USB_ID_x_x. //! To be selected according to the AVR32_USBB_USB_ID_x_x_PIN and //! AVR32_USBB_USB_ID_x_x_FUNCTION definitions from . #define AVR32_USBB_USB_ID_0_2_PIN 21 #define AVR32_USBB_USB_ID_0_2_FUNCTION 2 #define USB_ID AVR32_USBB_USB_ID_0_2 //! Multiplexed pin used for USB_VBOF: AVR32_USBB_USB_VBOF_x_x. //! To be selected according to the AVR32_USBB_USB_VBOF_x_x_PIN and //! AVR32_USBB_USB_VBOF_x_x_FUNCTION definitions from . # define USB_VBOF AVR32_USBB_USB_VBOF_0_1 //! Active level of the USB_VBOF output pin. # define USB_VBOF_ACTIVE_LEVEL LOW //! USB overcurrent detection pin. # define USB_OVERCURRENT_DETECT_PIN AVR32_PIN_PX15 //! @} //! GPIO connection of the MAC PHY PWR_DOWN/INT signal. # define MACB_INTERRUPT_PIN AVR32_PIN_PA26 //! Number of LEDs. #define LED_COUNT 4 /*! \name GPIO Connections of LEDs */ //! @{ # define LED0_GPIO AVR32_PIN_PB27 # define LED1_GPIO AVR32_PIN_PB28 # define LED2_GPIO AVR32_PIN_PA05 # define LED3_GPIO AVR32_PIN_PA06 //! @} /*! \name Color Identifiers of LEDs to Use with LED Functions */ //! @{ #define LED_MONO0_GREEN LED0 #define LED_MONO1_GREEN LED1 #define LED_MONO2_GREEN LED2 #define LED_MONO3_GREEN LED3 //! @} /*! \name PWM Channels of LEDs */ //! @{ #define LED0_PWM 4 #define LED1_PWM 5 #define LED2_PWM (-1) #define LED3_PWM (-1) //! @} /*! \name PWM Functions of LEDs */ //! @{ /* TODO: Implement PWM functionality */ #define LED0_PWM_FUNCTION (-1)//AVR32_PWM_0_FUNCTION #define LED1_PWM_FUNCTION (-1)//AVR32_PWM_1_FUNCTION #define LED2_PWM_FUNCTION (-1) #define LED3_PWM_FUNCTION (-1) //! @} //! External interrupt connection of touch sensor. #define QT1081_EIC_EXTINT_PIN AVR32_EIC_EXTINT_1_PIN #define QT1081_EIC_EXTINT_FUNCTION AVR32_EIC_EXTINT_1_FUNCTION #define QT1081_EIC_EXTINT_IRQ AVR32_EIC_IRQ_1 #define QT1081_EIC_EXTINT_INT AVR32_EIC_INT1 /*! \name Touch sensor low power mode select */ #define QT1081_LP_MODE AVR32_PIN_PB29 /*! \name GPIO Connections of touch buttons */ //! @{ #define QT1081_TOUCH_SENSOR_0 AVR32_PIN_PB22 #define QT1081_TOUCH_SENSOR_0_PRESSED 1 #define QT1081_TOUCH_SENSOR_1 AVR32_PIN_PB23 #define QT1081_TOUCH_SENSOR_1_PRESSED 1 #define QT1081_TOUCH_SENSOR_2 AVR32_PIN_PB24 #define QT1081_TOUCH_SENSOR_2_PRESSED 1 #define QT1081_TOUCH_SENSOR_3 AVR32_PIN_PB25 #define QT1081_TOUCH_SENSOR_3_PRESSED 1 #define QT1081_TOUCH_SENSOR_4 AVR32_PIN_PB26 #define QT1081_TOUCH_SENSOR_4_PRESSED 1 #define QT1081_TOUCH_SENSOR_ENTER QT1081_TOUCH_SENSOR_4 #define QT1081_TOUCH_SENSOR_ENTER_PRESSED QT1081_TOUCH_SENSOR_4_PRESSED #define QT1081_TOUCH_SENSOR_LEFT QT1081_TOUCH_SENSOR_3 #define QT1081_TOUCH_SENSOR_LEFT_PRESSED QT1081_TOUCH_SENSOR_3_PRESSED #define QT1081_TOUCH_SENSOR_RIGHT QT1081_TOUCH_SENSOR_2 #define QT1081_TOUCH_SENSOR_RIGHT_PRESSED QT1081_TOUCH_SENSOR_2_PRESSED #define QT1081_TOUCH_SENSOR_UP QT1081_TOUCH_SENSOR_0 #define QT1081_TOUCH_SENSOR_UP_PRESSED QT1081_TOUCH_SENSOR_0_PRESSED #define QT1081_TOUCH_SENSOR_DOWN QT1081_TOUCH_SENSOR_1 #define QT1081_TOUCH_SENSOR_DOWN_PRESSED QT1081_TOUCH_SENSOR_1_PRESSED //! @} /*! \name SPI Connections of the AT45DBX Data Flash Memory */ //! @{ #define AT45DBX_SPI (&AVR32_SPI0) #define AT45DBX_SPI_NPCS 0 #define AT45DBX_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN #define AT45DBX_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION #define AT45DBX_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN #define AT45DBX_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION #define AT45DBX_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN #define AT45DBX_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION #define AT45DBX_SPI_NPCS0_PIN AVR32_SPI0_NPCS_0_0_PIN #define AT45DBX_SPI_NPCS0_FUNCTION AVR32_SPI0_NPCS_0_0_FUNCTION //! @} /*! \name GPIO and SPI Connections of the SD/MMC Connector */ //! @{ #define SD_MMC_CARD_DETECT_PIN AVR32_PIN_PA02 #define SD_MMC_WRITE_PROTECT_PIN AVR32_PIN_PA18 #define SD_MMC_SPI (&AVR32_SPI0) #define SD_MMC_SPI_NPCS 1 #define SD_MMC_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN #define SD_MMC_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION #define SD_MMC_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN #define SD_MMC_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION #define SD_MMC_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN #define SD_MMC_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION #define SD_MMC_SPI_NPCS_PIN AVR32_SPI0_NPCS_1_0_PIN #define SD_MMC_SPI_NPCS_FUNCTION AVR32_SPI0_NPCS_1_0_FUNCTION //! @} /*! \name TWI expansion */ //! @{ #define EXPANSION_TWI (&AVR32_TWI) #define EXPANSION_RESET AVR32_PIN_PX16 #define EXPANSION_TWI_SCL_PIN AVR32_TWI_SCL_0_0_PIN #define EXPANSION_TWI_SCL_FUNCTION AVR32_TWI_SCL_0_0_FUNCTION #define EXPANSION_TWI_SDA_PIN AVR32_TWI_SDA_0_0_PIN #define EXPANSION_TWI_SDA_FUNCTION AVR32_TWI_SDA_0_0_FUNCTION //! @} /*! \name Wireless expansion */ #define WEXPANSION_EXTINT_PIN AVR32_EIC_EXTINT_8_PIN #define WEXPANSION_EXTINT_FUNCTION AVR32_EIC_EXTINT_8_FUNCTION #define WEXPANSION_GPIO1 AVR32_PIN_PB30 #define WEXPANSION_GPIO2 AVR32_PIN_PB31 #define WEXPANSION_SPI (&AVR32_SPI0) #define WEXPANSION_SPI_NPCS 2 #define WEXPANSION_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN #define WEXPANSION_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION #define WEXPANSION_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN #define WEXPANSION_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION #define WEXPANSION_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN #define WEXPANSION_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION #define WEXPANSION_SPI_NPCS_PIN AVR32_SPI0_NPCS_2_0_PIN #define WEXPANSION_SPI_NPCS_FUNCTION AVR32_SPI0_NPCS_2_0_FUNCTION //! @} /*! \name ET024006DHU TFT display */ //! @{ #define ET024006DHU_TE_PIN AVR32_PIN_PX19 #define ET024006DHU_RESET_PIN AVR32_PIN_PX22 #define ET024006DHU_BL_PIN AVR32_PWM_6_PIN #define ET024006DHU_BL_FUNCTION AVR32_PWM_6_FUNCTION #define ET024006DHU_DNC_PIN AVR32_EBI_ADDR_21_1_PIN #define ET024006DHU_DNC_FUNCTION AVR32_EBI_ADDR_21_1_FUNCTION #define ET024006DHU_EBI_NCS_PIN AVR32_EBI_NCS_0_1_PIN #define ET024006DHU_EBI_NCS_FUNCTION AVR32_EBI_NCS_0_1_FUNCTION //! @} /*! \name Optional SPI connection to the TFT */ //! @{ #define ET024006DHU_SPI (&AVR32_SPI0) #define ET024006DHU_SPI_NPCS 3 #define ET024006DHU_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN #define ET024006DHU_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION #define ET024006DHU_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN #define ET024006DHU_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION #define ET024006DHU_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN #define ET024006DHU_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION #define ET024006DHU_SPI_NPCS_PIN AVR32_SPI1_NPCS_3_0_PIN #define ET024006DHU_SPI_NPCS_FUNCTION AVR32_SPI1_NPCS_3_0_FUNCTION //! @} /*! \name Audio amplifier connection to the DAC */ //! @{ #define TPA6130_ABDAC (&AVR32_ABDAC) #define TPA6130_DATA0_PIN AVR32_ABDAC_DATA_0_1_PIN #define TPA6130_DATA0_FUNCTION AVR32_ABDAC_DATA_0_1_FUNCTION #define TPA6130_DATAN0_PIN AVR32_ABDAC_DATAN_0_1_PIN #define TPA6130_DATAN0_FUNCTION AVR32_ABDAC_DATAN_0_1_FUNCTION #define TPA6130_DATA1_PIN AVR32_ABDAC_DATA_1_1_PIN #define TPA6130_DATA1_FUNCTION AVR32_ABDAC_DATA_1_1_FUNCTION #define TPA6130_DATAN1_PIN AVR32_ABDAC_DATAN_1_1_PIN #define TPA6130_DATAN1_FUNCTION AVR32_ABDAC_DATAN_1_1_FUNCTION #define TPA6130_ABDAC_PDCA_PID AVR32_PDCA_PID_ABDAC_TX #define TPA6130_ABDAC_PDCA_CHANNEL 0 #define TPA6130_ABDAC_PDCA_IRQ AVR32_PDCA_IRQ_0 #define TPA6130_ABDAC_PDCA_INT_LEVEL AVR32_INTC_INT3 #define TPA6130_TWI (&AVR32_TWI) #define TPA6130_TWI_SCL_PIN AVR32_TWI_SCL_0_0_PIN #define TPA6130_TWI_SCL_FUNCTION AVR32_TWI_SCL_0_0_FUNCTION #define TPA6130_TWI_SDA_PIN AVR32_TWI_SDA_0_0_PIN #define TPA6130_TWI_SDA_FUNCTION AVR32_TWI_SDA_0_0_FUNCTION //! }@ /*! \name TI TLV320AIC23B sound chip */ //! @{ #define TLV320_SSC (&AVR32_SSC) #define TLV320_SSC_TX_CLOCK_PIN AVR32_SSC_TX_CLOCK_0_PIN #define TLV320_SSC_TX_CLOCK_FUNCTION AVR32_SSC_TX_CLOCK_0_FUNCTION #define TLV320_SSC_TX_DATA_PIN AVR32_SSC_TX_DATA_0_PIN #define TLV320_SSC_TX_DATA_FUNCTION AVR32_SSC_TX_DATA_0_FUNCTION #define TLV320_SSC_TX_FRAME_SYNC_PIN AVR32_SSC_TX_FRAME_SYNC_0_PIN #define TLV320_SSC_TX_FRAME_SYNC_FUNCTION AVR32_SSC_TX_FRAME_SYNC_0_FUNCTION #define TLV320_TWI (&AVR32_TWI) #define TLV320_TWI_SCL_PIN AVR32_TWI_SCL_0_0_PIN #define TLV320_TWI_SCL_FUNCTION AVR32_TWI_SCL_0_0_FUNCTION #define TLV320_TWI_SDA_PIN AVR32_TWI_SDA_0_0_PIN #define TLV320_TWI_SDA_FUNCTION AVR32_TWI_SDA_0_0_FUNCTION #define TLV320_PM_GCLK_PIN AVR32_PM_GCLK_0_0_PIN #define TLV320_PM_GCLK_FUNCTION AVR32_PM_GCLK_0_0_FUNCTION //! @} ////! \name SPI: Apple Authentication Chip Hardware Connections ////! @{ #define IPOD_AUTH_CHIP_SPI (&AVR32_SPI0) #define IPOD_AUTH_CHIP_SPI_IRQ AVR32_SPI0_IRQ #define IPOD_AUTH_CHIP_SPI_NPCS 2 #define IPOD_AUTH_CHIP_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN #define IPOD_AUTH_CHIP_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION #define IPOD_AUTH_CHIP_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN #define IPOD_AUTH_CHIP_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION #define IPOD_AUTH_CHIP_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN #define IPOD_AUTH_CHIP_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION #define IPOD_AUTH_CHIP_SPI_NPCS_PIN AVR32_SPI0_NPCS_2_0_PIN #define IPOD_AUTH_CHIP_SPI_NPCS_FUNCTION AVR32_SPI0_NPCS_2_0_FUNCTION #define IPOD_AUTH_CHIP_SPI_N_RESET_PIN AVR32_PIN_PB30 #define IPOD_AUTH_CHIP_SPI_CP_READY_PIN AVR32_PIN_PB31 //! }@ /*! \name Connections of the iPOD Authentication Coprocessor */ //! @{ #define IPOD_AUTH_CHIP_TWI (&AVR32_TWI) #define IPOD_AUTH_CHIP_TWI_SCL_PIN AVR32_TWI_SCL_0_0_PIN #define IPOD_AUTH_CHIP_TWI_SCL_FUNCTION AVR32_TWI_SCL_0_0_FUNCTION #define IPOD_AUTH_CHIP_TWI_SDA_PIN AVR32_TWI_SDA_0_0_PIN #define IPOD_AUTH_CHIP_TWI_SDA_FUNCTION AVR32_TWI_SDA_0_0_FUNCTION #define IPOD_AUTH_CHIP_TWI_N_RESET_PIN AVR32_PIN_PX16 //! @} /*! \name USART connection to the UC3B board controller */ //! @{ #define USART0_RXD_PIN AVR32_USART0_RXD_0_0_PIN #define USART0_RXD_FUNCTION AVR32_USART0_RXD_0_0_FUNCTION #define USART0_TXD_PIN AVR32_USART0_TXD_0_0_PIN #define USART0_TXD_FUNCTION AVR32_USART0_TXD_0_0_FUNCTION #define USART0_RTS_PIN AVR32_USART0_RTS_0_0_PIN #define USART0_RTS_FUNCTION AVR32_USART0_RTS_0_0_FUNCTION #define USART0_CTS_PIN AVR32_USART0_CTS_0_0_PIN #define USART0_CTS_FUNCTION AVR32_USART0_CTS_0_0_FUNCTION //! @} #define ADC_VEXT_PIN AVR32_ADC_AD_7_PIN #define ADC_VEXT_FUNCTION AVR32_ADC_AD_7_FUNCTION /*! \name LCD Connections of the ET024006DHU display */ //! @{ #define ET024006DHU_SMC_USE_NCS 0 #define ET024006DHU_SMC_COMPONENT_CS "smc_et024006dhu.h" #define ET024006DHU_EBI_DATA_0 AVR32_EBI_DATA_0 #define ET024006DHU_EBI_DATA_1 AVR32_EBI_DATA_1 #define ET024006DHU_EBI_DATA_2 AVR32_EBI_DATA_2 #define ET024006DHU_EBI_DATA_3 AVR32_EBI_DATA_3 #define ET024006DHU_EBI_DATA_4 AVR32_EBI_DATA_4 #define ET024006DHU_EBI_DATA_5 AVR32_EBI_DATA_5 #define ET024006DHU_EBI_DATA_6 AVR32_EBI_DATA_6 #define ET024006DHU_EBI_DATA_7 AVR32_EBI_DATA_7 #define ET024006DHU_EBI_DATA_8 AVR32_EBI_DATA_8 #define ET024006DHU_EBI_DATA_9 AVR32_EBI_DATA_9 #define ET024006DHU_EBI_DATA_10 AVR32_EBI_DATA_10 #define ET024006DHU_EBI_DATA_11 AVR32_EBI_DATA_11 #define ET024006DHU_EBI_DATA_12 AVR32_EBI_DATA_12 #define ET024006DHU_EBI_DATA_13 AVR32_EBI_DATA_13 #define ET024006DHU_EBI_DATA_14 AVR32_EBI_DATA_14 #define ET024006DHU_EBI_DATA_15 AVR32_EBI_DATA_15 #define ET024006DHU_EBI_ADDR_21 AVR32_EBI_ADDR_21_1 #define ET024006DHU_EBI_NWE AVR32_EBI_NWE0_0 #define ET024006DHU_EBI_NRD AVR32_EBI_NRD_0 #define ET024006DHU_EBI_NCS AVR32_EBI_NCS_0_1 //! @} #endif // !EVK1105_REVA #endif // _EVK1105_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief AT32UC3A EVK1105 board LEDs support package. * * This file contains definitions and services related to the LED features of * the EVK1105 board. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 AT32UC3A devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include #include "preprocessor.h" #include "compiler.h" #include "evk1105.h" #include "led.h" //! Structure describing LED hardware connections. typedef const struct { struct { U32 PORT; //!< LED GPIO port. U32 PIN_MASK; //!< Bit-mask of LED pin in GPIO port. } GPIO; //!< LED GPIO descriptor. struct { S32 CHANNEL; //!< LED PWM channel (< 0 if N/A). S32 FUNCTION; //!< LED pin PWM function (< 0 if N/A). } PWM; //!< LED PWM descriptor. } tLED_DESCRIPTOR; //! Hardware descriptors of all LEDs. static tLED_DESCRIPTOR LED_DESCRIPTOR[LED_COUNT] = { #define INSERT_LED_DESCRIPTOR(LED_NO, unused) \ { \ {LED##LED_NO##_GPIO / 32, 1 << (LED##LED_NO##_GPIO % 32)},\ {LED##LED_NO##_PWM, LED##LED_NO##_PWM_FUNCTION } \ }, MREPEAT(LED_COUNT, INSERT_LED_DESCRIPTOR, ~) #undef INSERT_LED_DESCRIPTOR }; //! Saved state of all LEDs. static volatile U32 LED_State = (1 << LED_COUNT) - 1; U32 LED_Read_Display(void) { return LED_State; } void LED_Display(U32 leds) { // Use the LED descriptors to get the connections of a given LED to the MCU. tLED_DESCRIPTOR *led_descriptor; volatile avr32_gpio_port_t *led_gpio_port; // Make sure only existing LEDs are specified. leds &= (1 << LED_COUNT) - 1; // Update the saved state of all LEDs with the requested changes. LED_State = leds; // For all LEDs... for (led_descriptor = &LED_DESCRIPTOR[0]; led_descriptor < LED_DESCRIPTOR + LED_COUNT; led_descriptor++) { // Set the LED to the requested state. led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; if (leds & 1) { led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK; } else { led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK; } led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; leds >>= 1; } } U32 LED_Read_Display_Mask(U32 mask) { return Rd_bits(LED_State, mask); } void LED_Display_Mask(U32 mask, U32 leds) { // Use the LED descriptors to get the connections of a given LED to the MCU. tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; volatile avr32_gpio_port_t *led_gpio_port; U8 led_shift; // Make sure only existing LEDs are specified. mask &= (1 << LED_COUNT) - 1; // Update the saved state of all LEDs with the requested changes. Wr_bits(LED_State, mask, leds); // While there are specified LEDs left to manage... while (mask) { // Select the next specified LED and set it to the requested state. led_shift = 1 + ctz(mask); led_descriptor += led_shift; led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; leds >>= led_shift - 1; if (leds & 1) { led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK; } else { led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK; } led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; leds >>= 1; mask >>= led_shift; } } Bool LED_Test(U32 leds) { return Tst_bits(LED_State, leds); } void LED_Off(U32 leds) { // Use the LED descriptors to get the connections of a given LED to the MCU. tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; volatile avr32_gpio_port_t *led_gpio_port; U8 led_shift; // Make sure only existing LEDs are specified. leds &= (1 << LED_COUNT) - 1; // Update the saved state of all LEDs with the requested changes. Clr_bits(LED_State, leds); // While there are specified LEDs left to manage... while (leds) { // Select the next specified LED and turn it off. led_shift = 1 + ctz(leds); led_descriptor += led_shift; led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK; led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; leds >>= led_shift; } } void LED_On(U32 leds) { // Use the LED descriptors to get the connections of a given LED to the MCU. tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; volatile avr32_gpio_port_t *led_gpio_port; U8 led_shift; // Make sure only existing LEDs are specified. leds &= (1 << LED_COUNT) - 1; // Update the saved state of all LEDs with the requested changes. Set_bits(LED_State, leds); // While there are specified LEDs left to manage... while (leds) { // Select the next specified LED and turn it on. led_shift = 1 + ctz(leds); led_descriptor += led_shift; led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK; led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; leds >>= led_shift; } } void LED_Toggle(U32 leds) { // Use the LED descriptors to get the connections of a given LED to the MCU. tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; volatile avr32_gpio_port_t *led_gpio_port; U8 led_shift; // Make sure only existing LEDs are specified. leds &= (1 << LED_COUNT) - 1; // Update the saved state of all LEDs with the requested changes. Tgl_bits(LED_State, leds); // While there are specified LEDs left to manage... while (leds) { // Select the next specified LED and toggle it. led_shift = 1 + ctz(leds); led_descriptor += led_shift; led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; led_gpio_port->ovrt = led_descriptor->GPIO.PIN_MASK; led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; leds >>= led_shift; } } U32 LED_Read_Display_Field(U32 field) { return Rd_bitfield(LED_State, field); } void LED_Display_Field(U32 field, U32 leds) { // Move the bit-field to the appropriate position for the bit-mask. LED_Display_Mask(field, leds << ctz(field)); } U8 LED_Get_Intensity(U32 led) { tLED_DESCRIPTOR *led_descriptor; // Check that the argument value is valid. led = ctz(led); led_descriptor = &LED_DESCRIPTOR[led]; if (led >= LED_COUNT || led_descriptor->PWM.CHANNEL < 0) return 0; // Return the duty cycle value if the LED PWM channel is enabled, else 0. return (AVR32_PWM.sr & (1 << led_descriptor->PWM.CHANNEL)) ? AVR32_PWM.channel[led_descriptor->PWM.CHANNEL].cdty : 0; } void LED_Set_Intensity(U32 leds, U8 intensity) { tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; volatile avr32_pwm_channel_t *led_pwm_channel; volatile avr32_gpio_port_t *led_gpio_port; U8 led_shift; // For each specified LED... for (leds &= (1 << LED_COUNT) - 1; leds; leds >>= led_shift) { // Select the next specified LED and check that it has a PWM channel. led_shift = 1 + ctz(leds); led_descriptor += led_shift; if (led_descriptor->PWM.CHANNEL < 0) continue; // Initialize or update the LED PWM channel. led_pwm_channel = &AVR32_PWM.channel[led_descriptor->PWM.CHANNEL]; if (!(AVR32_PWM.sr & (1 << led_descriptor->PWM.CHANNEL))) { led_pwm_channel->cmr = (AVR32_PWM_CPRE_MCK << AVR32_PWM_CPRE_OFFSET) & ~(AVR32_PWM_CALG_MASK | AVR32_PWM_CPOL_MASK | AVR32_PWM_CPD_MASK); led_pwm_channel->cprd = 0x000000FF; led_pwm_channel->cdty = intensity; AVR32_PWM.ena = 1 << led_descriptor->PWM.CHANNEL; } else { AVR32_PWM.isr; while (!(AVR32_PWM.isr & (1 << led_descriptor->PWM.CHANNEL))); led_pwm_channel->cupd = intensity; } // Switch the LED pin to its PWM function. led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; if (led_descriptor->PWM.FUNCTION & 0x1) { led_gpio_port->pmr0s = led_descriptor->GPIO.PIN_MASK; } else { led_gpio_port->pmr0c = led_descriptor->GPIO.PIN_MASK; } if (led_descriptor->PWM.FUNCTION & 0x2) { led_gpio_port->pmr1s = led_descriptor->GPIO.PIN_MASK; } else { led_gpio_port->pmr1c = led_descriptor->GPIO.PIN_MASK; } led_gpio_port->gperc = led_descriptor->GPIO.PIN_MASK; } } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief AT32UC3A EVK1105 board LEDs support package. * * This file contains definitions and services related to the LED features of * the EVK1105 board. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 AT32UC3A devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _LED_H_ #define _LED_H_ #include "compiler.h" /*! \name Identifiers of LEDs to Use with LED Functions */ //! @{ #define LED0 0x01 #define LED1 0x02 #define LED2 0x04 #define LED3 0x08 //! @} /*! \brief Gets the last state of all LEDs set through the LED API. * * \return State of all LEDs (1 bit per LED). * * \note The GPIO pin configuration of all LEDs is left unchanged. */ extern U32 LED_Read_Display(void); /*! \brief Sets the state of all LEDs. * * \param leds New state of all LEDs (1 bit per LED). * * \note The pins of all LEDs are set to GPIO output mode. */ extern void LED_Display(U32 leds); /*! \brief Gets the last state of the specified LEDs set through the LED API. * * \param mask LEDs of which to get the state (1 bit per LED). * * \return State of the specified LEDs (1 bit per LED). * * \note The GPIO pin configuration of all LEDs is left unchanged. */ extern U32 LED_Read_Display_Mask(U32 mask); /*! \brief Sets the state of the specified LEDs. * * \param mask LEDs of which to set the state (1 bit per LED). * * \param leds New state of the specified LEDs (1 bit per LED). * * \note The pins of the specified LEDs are set to GPIO output mode. */ extern void LED_Display_Mask(U32 mask, U32 leds); /*! \brief Tests the last state of the specified LEDs set through the LED API. * * \param leds LEDs of which to test the state (1 bit per LED). * * \return \c TRUE if at least one of the specified LEDs has a state on, else * \c FALSE. * * \note The GPIO pin configuration of all LEDs is left unchanged. */ extern Bool LED_Test(U32 leds); /*! \brief Turns off the specified LEDs. * * \param leds LEDs to turn off (1 bit per LED). * * \note The pins of the specified LEDs are set to GPIO output mode. */ extern void LED_Off(U32 leds); /*! \brief Turns on the specified LEDs. * * \param leds LEDs to turn on (1 bit per LED). * * \note The pins of the specified LEDs are set to GPIO output mode. */ extern void LED_On(U32 leds); /*! \brief Toggles the specified LEDs. * * \param leds LEDs to toggle (1 bit per LED). * * \note The pins of the specified LEDs are set to GPIO output mode. */ extern void LED_Toggle(U32 leds); /*! \brief Gets as a bit-field the last state of the specified LEDs set through * the LED API. * * \param field LEDs of which to get the state (1 bit per LED). * * \return State of the specified LEDs (1 bit per LED, beginning with the first * specified LED). * * \note The GPIO pin configuration of all LEDs is left unchanged. */ extern U32 LED_Read_Display_Field(U32 field); /*! \brief Sets as a bit-field the state of the specified LEDs. * * \param field LEDs of which to set the state (1 bit per LED). * \param leds New state of the specified LEDs (1 bit per LED, beginning with * the first specified LED). * * \note The pins of the specified LEDs are set to GPIO output mode. */ extern void LED_Display_Field(U32 field, U32 leds); /*! \brief Gets the intensity of the specified LED. * * \param led LED of which to get the intensity (1 bit per LED; only the least * significant set bit is used). * * \return Intensity of the specified LED (0x00 to 0xFF). * * \warning The PWM channel of the specified LED is supposed to be used only by * this module. * * \note The GPIO pin configuration of all LEDs is left unchanged. */ extern U8 LED_Get_Intensity(U32 led); /*! \brief Sets the intensity of the specified LEDs. * * \param leds LEDs of which to set the intensity (1 bit per LED). * \param intensity New intensity of the specified LEDs (0x00 to 0xFF). * * \warning The PWM channels of the specified LEDs are supposed to be used only * by this module. * * \note The pins of the specified LEDs are set to PWM output mode. */ extern void LED_Set_Intensity(U32 leds, U8 intensity); #endif // _LED_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/board.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Standard board header file. * * This file includes the appropriate board header file according to the * defined board. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _BOARD_H_ #define _BOARD_H_ #include /*! \name Base Boards */ //! @{ #define EVK1100 1 //!< AT32UC3A EVK1100 board. #define EVK1101 2 //!< AT32UC3B EVK1101 board. #define UC3C_EK 3 //!< AT32UC3C UC3C_EK board. #define EVK1104 4 //!< AT32UC3A3 EVK1104 board. #define EVK1105 5 //!< AT32UC3A EVK1105 board. #define STK1000 6 //!< AT32AP7000 STK1000 board. #define NGW100 7 //!< AT32AP7000 NGW100 board. #define STK600_RCUC3L0 8 //!< STK600 RCUC3L0 board. #define UC3L_EK 9 //!< AT32UC3L-EK board. #define USER_BOARD 99 //!< User-reserved board (if any). //! @} /*! \name Extension Boards */ //! @{ #define EXT1102 1 //!< AT32UC3B EXT1102 board. #define MC300 2 //!< AT32UC3 MC300 board. #define USER_EXT_BOARD 99 //!< User-reserved extension board (if any). //! @} #if BOARD == EVK1100 #include "EVK1100/evk1100.h" #elif BOARD == EVK1101 #include "EVK1101/evk1101.h" #elif BOARD == UC3C_EK #include "UC3C_EK/uc3c_ek.h" #elif BOARD == EVK1104 #include "EVK1104/evk1104.h" #elif BOARD == EVK1105 #include "EVK1105/evk1105.h" #elif BOARD == STK1000 #include "STK1000/stk1000.h" #elif BOARD == NGW100 #include "NGW100/ngw100.h" #elif BOARD == STK600_RCUC3L0 #include "STK600/RCUC3L0/stk600_rcuc3l0.h" #elif BOARD == UC3L_EK #include "UC3L_EK/uc3l_ek.h" #elif BOARD == ARDUINO #include "ARDUINO/arduino.h" #else #error No known AVR32 board defined #endif #if (defined EXT_BOARD) #if EXT_BOARD == EXT1102 #include "EXT1102/ext1102.h" #elif EXT_BOARD == MC300 #include "MC300/mc300.h" #elif EXT_BOARD == USER_EXT_BOARD // User-reserved area: #include the header file of your extension board here // (if any). #endif #endif #ifndef FRCOSC #define FRCOSC AVR32_PM_RCOSC_FREQUENCY //!< Default RCOsc frequency. #endif #endif // _BOARD_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/board.h.my ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Standard board header file. * * This file includes the appropriate board header file according to the * defined board. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _BOARD_H_ #define _BOARD_H_ #include /*! \name Base Boards */ //! @{ #define EVK1100 1 //!< AT32UC3A EVK1100 board. #define EVK1101 2 //!< AT32UC3B EVK1101 board. #define UC3C_EK 3 //!< AT32UC3C UC3C_EK board. #define EVK1104 4 //!< AT32UC3A3 EVK1104 board. #define EVK1105 5 //!< AT32UC3A EVK1105 board. #define STK1000 6 //!< AT32AP7000 STK1000 board. #define NGW100 7 //!< AT32AP7000 NGW100 board. #define STK600_RCUC3L0 8 //!< STK600 RCUC3L0 board. #define UC3L_EK 9 //!< AT32UC3L-EK board. #define USER_BOARD 99 //!< User-reserved board (if any). //! @} /*! \name Extension Boards */ //! @{ #define EXT1102 1 //!< AT32UC3B EXT1102 board. #define MC300 2 //!< AT32UC3 MC300 board. #define USER_EXT_BOARD 99 //!< User-reserved extension board (if any). //! @} #if BOARD == EVK1100 #include "EVK1100/evk1100.h" #elif BOARD == EVK1101 #include "EVK1101/evk1101.h" #elif BOARD == UC3C_EK #include "UC3C_EK/uc3c_ek.h" #elif BOARD == EVK1104 #include "EVK1104/evk1104.h" #elif BOARD == EVK1105 #include "EVK1105/evk1105.h" #elif BOARD == STK1000 #include "STK1000/stk1000.h" #elif BOARD == NGW100 #include "NGW100/ngw100.h" #elif BOARD == STK600_RCUC3L0 #include "STK600/RCUC3L0/stk600_rcuc3l0.h" #elif BOARD == UC3L_EK #include "UC3L_EK/uc3l_ek.h" #elif BOARD == ARDUINO #include "ARDUINO/arduino.h" #else #error No known AVR32 board defined #endif #if (defined EXT_BOARD) #if EXT_BOARD == EXT1102 #include "EXT1102/ext1102.h" #elif EXT_BOARD == MC300 #include "MC300/mc300.h" #elif EXT_BOARD == USER_EXT_BOARD // User-reserved area: #include the header file of your extension board here // (if any). #endif #endif #ifndef FRCOSC #define FRCOSC AVR32_PM_RCOSC_FREQUENCY //!< Default RCOsc frequency. #endif #endif // _BOARD_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Management of the AT45DBX data flash controller through SPI. * * This file manages the accesses to the AT45DBX data flash components. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with an SPI module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ //_____ I N C L U D E S ___________________________________________________ #include "conf_access.h" #if AT45DBX_MEM == ENABLE #include "compiler.h" #include "board.h" #include "gpio.h" #include "spi.h" #include "conf_at45dbx.h" #include "at45dbx.h" #if AT45DBX_MEM_CNT > 4 #error AT45DBX_MEM_CNT must not exceed 4 #endif //_____ D E F I N I T I O N S ______________________________________________ /*! \name AT45DBX Group A Commands */ //! @{ #define AT45DBX_CMDA_RD_PAGE 0xD2 //!< Main Memory Page Read (Serial/8-bit Mode). #define AT45DBX_CMDA_RD_ARRAY_LEG 0xE8 //!< Continuous Array Read, Legacy Command (Serial/8-bit Mode). #define AT45DBX_CMDA_RD_ARRAY_LF_SM 0x03 //!< Continuous Array Read, Low-Frequency Mode (Serial Mode). #define AT45DBX_CMDA_RD_ARRAY_AF_SM 0x0B //!< Continuous Array Read, Any-Frequency Mode (Serial Mode). #define AT45DBX_CMDA_RD_SECTOR_PROT_REG 0x32 //!< Read Sector Protection Register (Serial/8-bit Mode). #define AT45DBX_CMDA_RD_SECTOR_LKDN_REG 0x35 //!< Read Sector Lockdown Register (Serial/8-bit Mode). #define AT45DBX_CMDA_RD_SECURITY_REG 0x77 //!< Read Security Register (Serial/8-bit Mode). //! @} /*! \name AT45DBX Group B Commands */ //! @{ #define AT45DBX_CMDB_ER_PAGE 0x81 //!< Page Erase (Serial/8-bit Mode). #define AT45DBX_CMDB_ER_BLOCK 0x50 //!< Block Erase (Serial/8-bit Mode). #define AT45DBX_CMDB_ER_SECTOR 0x7C //!< Sector Erase (Serial/8-bit Mode). #define AT45DBX_CMDB_ER_CHIP 0xC794809A //!< Chip Erase (Serial/8-bit Mode). #define AT45DBX_CMDB_XFR_PAGE_TO_BUF1 0x53 //!< Main Memory Page to Buffer 1 Transfer (Serial/8-bit Mode). #define AT45DBX_CMDB_XFR_PAGE_TO_BUF2 0x55 //!< Main Memory Page to Buffer 2 Transfer (Serial/8-bit Mode). #define AT45DBX_CMDB_CMP_PAGE_TO_BUF1 0x60 //!< Main Memory Page to Buffer 1 Compare (Serial/8-bit Mode). #define AT45DBX_CMDB_CMP_PAGE_TO_BUF2 0x61 //!< Main Memory Page to Buffer 2 Compare (Serial/8-bit Mode). #define AT45DBX_CMDB_PR_BUF1_TO_PAGE_ER 0x83 //!< Buffer 1 to Main Memory Page Program with Built-in Erase (Serial/8-bit Mode). #define AT45DBX_CMDB_PR_BUF2_TO_PAGE_ER 0x86 //!< Buffer 2 to Main Memory Page Program with Built-in Erase (Serial/8-bit Mode). #define AT45DBX_CMDB_PR_BUF1_TO_PAGE 0x88 //!< Buffer 1 to Main Memory Page Program without Built-in Erase (Serial/8-bit Mode). #define AT45DBX_CMDB_PR_BUF2_TO_PAGE 0x89 //!< Buffer 2 to Main Memory Page Program without Built-in Erase (Serial/8-bit Mode). #define AT45DBX_CMDB_PR_PAGE_TH_BUF1 0x82 //!< Main Memory Page Program through Buffer 1 (Serial/8-bit Mode). #define AT45DBX_CMDB_PR_PAGE_TH_BUF2 0x85 //!< Main Memory Page Program through Buffer 2 (Serial/8-bit Mode). #define AT45DBX_CMDB_RWR_PAGE_TH_BUF1 0x58 //!< Auto Page Rewrite through Buffer 1 (Serial/8-bit Mode). #define AT45DBX_CMDB_RWR_PAGE_TH_BUF2 0x59 //!< Auto Page Rewrite through Buffer 2 (Serial/8-bit Mode). //! @} /*! \name AT45DBX Group C Commands */ //! @{ #define AT45DBX_CMDC_RD_BUF1_LF_SM 0xD1 //!< Buffer 1 Read, Low-Frequency Mode (Serial Mode). #define AT45DBX_CMDC_RD_BUF2_LF_SM 0xD3 //!< Buffer 2 Read, Low-Frequency Mode (Serial Mode). #define AT45DBX_CMDC_RD_BUF1_AF_SM 0xD4 //!< Buffer 1 Read, Any-Frequency Mode (Serial Mode). #define AT45DBX_CMDC_RD_BUF2_AF_SM 0xD6 //!< Buffer 2 Read, Any-Frequency Mode (Serial Mode). #define AT45DBX_CMDC_RD_BUF1_AF_8M 0x54 //!< Buffer 1 Read, Any-Frequency Mode (8-bit Mode). #define AT45DBX_CMDC_RD_BUF2_AF_8M 0x56 //!< Buffer 2 Read, Any-Frequency Mode (8-bit Mode). #define AT45DBX_CMDC_WR_BUF1 0x84 //!< Buffer 1 Write (Serial/8-bit Mode). #define AT45DBX_CMDC_WR_BUF2 0x87 //!< Buffer 2 Write (Serial/8-bit Mode). #define AT45DBX_CMDC_RD_STATUS_REG 0xD7 //!< Status Register Read (Serial/8-bit Mode). #define AT45DBX_CMDC_RD_MNFCT_DEV_ID_SM 0x9F //!< Manufacturer and Device ID Read (Serial Mode). //! @} /*! \name AT45DBX Group D Commands */ //! @{ #define AT45DBX_CMDD_EN_SECTOR_PROT 0x3D2A7FA9 //!< Enable Sector Protection (Serial/8-bit Mode). #define AT45DBX_CMDD_DIS_SECTOR_PROT 0x3D2A7F9A //!< Disable Sector Protection (Serial/8-bit Mode). #define AT45DBX_CMDD_ER_SECTOR_PROT_REG 0x3D2A7FCF //!< Erase Sector Protection Register (Serial/8-bit Mode). #define AT45DBX_CMDD_PR_SECTOR_PROT_REG 0x3D2A7FFC //!< Program Sector Protection Register (Serial/8-bit Mode). #define AT45DBX_CMDD_LKDN_SECTOR 0x3D2A7F30 //!< Sector Lockdown (Serial/8-bit Mode). #define AT45DBX_CMDD_PR_SECURITY_REG 0x9B000000 //!< Program Security Register (Serial/8-bit Mode). #define AT45DBX_CMDD_PR_CONF_REG 0x3D2A80A6 //!< Program Configuration Register (Serial/8-bit Mode). #define AT45DBX_CMDD_DEEP_PWR_DN 0xB9 //!< Deep Power-down (Serial/8-bit Mode). #define AT45DBX_CMDD_RSM_DEEP_PWR_DN 0xAB //!< Resume from Deep Power-down (Serial/8-bit Mode). //! @} /*! \name Bit-Masks and Values for the Status Register */ //! @{ #define AT45DBX_MSK_BUSY 0x80 //!< Busy status bit-mask. #define AT45DBX_BUSY 0x00 //!< Busy status value (0x00 when busy, 0x80 when ready). #define AT45DBX_MSK_DENSITY 0x3C //!< Device density bit-mask. //! @} #if AT45DBX_MEM_SIZE == AT45DBX_1MB /*! \name AT45DB081 Memories */ //! @{ #define AT45DBX_DENSITY 0x24 //!< Device density value. #define AT45DBX_BYTE_ADDR_BITS 9 //!< Address bits for byte position within buffer. //! @} #elif AT45DBX_MEM_SIZE == AT45DBX_2MB /*! \name AT45DB161 Memories */ //! @{ #define AT45DBX_DENSITY 0x2C //!< Device density value. #define AT45DBX_BYTE_ADDR_BITS 10 //!< Address bits for byte position within buffer. //! @} #elif AT45DBX_MEM_SIZE == AT45DBX_4MB /*! \name AT45DB321 Memories */ //! @{ #define AT45DBX_DENSITY 0x34 //!< Device density value. #define AT45DBX_BYTE_ADDR_BITS 10 //!< Address bits for byte position within buffer. //! @} #elif AT45DBX_MEM_SIZE == AT45DBX_8MB /*! \name AT45DB642 Memories */ //! @{ #define AT45DBX_DENSITY 0x3C //!< Device density value. #define AT45DBX_BYTE_ADDR_BITS 11 //!< Address bits for byte position within buffer. //! @} #else #error AT45DBX_MEM_SIZE is not defined to a supported value #endif //! Address bits for page selection. #define AT45DBX_PAGE_ADDR_BITS (AT45DBX_MEM_SIZE - AT45DBX_PAGE_BITS) //! Number of bits for addresses within pages. #define AT45DBX_PAGE_BITS (AT45DBX_BYTE_ADDR_BITS - 1) //! Page size in bytes. #define AT45DBX_PAGE_SIZE (1 << AT45DBX_PAGE_BITS) //! Bit-mask for byte position within buffer in \ref gl_ptr_mem. #define AT45DBX_MSK_PTR_BYTE ((1 << AT45DBX_PAGE_BITS) - 1) //! Bit-mask for page selection in \ref gl_ptr_mem. #define AT45DBX_MSK_PTR_PAGE (((1 << AT45DBX_PAGE_ADDR_BITS) - 1) << AT45DBX_PAGE_BITS) //! Bit-mask for byte position within sector in \ref gl_ptr_mem. #define AT45DBX_MSK_PTR_SECTOR ((1 << AT45DBX_SECTOR_BITS) - 1) /*! \brief Sends a dummy byte through SPI. */ #define spi_write_dummy() spi_write(AT45DBX_SPI, 0xFF) //! Boolean indicating whether memory is in busy state. static Bool at45dbx_busy; //! Memory data pointer. static U32 gl_ptr_mem; //! Sector buffer. static U8 sector_buf[AT45DBX_SECTOR_SIZE]; /*! \name Control Functions */ //! @{ Bool at45dbx_init(spi_options_t spiOptions, unsigned int pba_hz) { // Setup SPI registers according to spiOptions. for (spiOptions.reg = AT45DBX_SPI_FIRST_NPCS; spiOptions.reg < AT45DBX_SPI_FIRST_NPCS + AT45DBX_MEM_CNT; spiOptions.reg++) { if (spi_setupChipReg(AT45DBX_SPI, &spiOptions, pba_hz) != SPI_OK) return KO; } // Memory ready. at45dbx_busy = FALSE; return OK; } /*! \brief Selects or unselects a DF memory. * * \param memidx Memory ID of DF to select or unselect. * \param bSelect Boolean indicating whether the DF memory has to be selected. */ static void at45dbx_chipselect_df(U8 memidx, Bool bSelect) { if (bSelect) { // Select SPI chip. spi_selectChip(AT45DBX_SPI, AT45DBX_SPI_FIRST_NPCS + memidx); } else { // Unselect SPI chip. spi_unselectChip(AT45DBX_SPI, AT45DBX_SPI_FIRST_NPCS + memidx); } } Bool at45dbx_mem_check(void) { U8 df; U16 status = 0; // DF memory check. for (df = 0; df < AT45DBX_MEM_CNT; df++) { // Select the DF memory to check. at45dbx_chipselect_df(df, TRUE); // Send the Status Register Read command. spi_write(AT45DBX_SPI, AT45DBX_CMDC_RD_STATUS_REG); // Send a dummy byte to read the status register. spi_write_dummy(); spi_read(AT45DBX_SPI, &status); // Unselect the checked DF memory. at45dbx_chipselect_df(df, FALSE); // Unexpected device density value. if ((status & AT45DBX_MSK_DENSITY) < AT45DBX_DENSITY) return KO; } return OK; } /*! \brief Waits until the DF is ready. */ static void at45dbx_wait_ready(void) { U16 status; // Select the DF memory gl_ptr_mem points to. at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, TRUE); // Send the Status Register Read command. spi_write(AT45DBX_SPI, AT45DBX_CMDC_RD_STATUS_REG); // Read the status register until the DF is ready. do { // Send a dummy byte to read the status register. spi_write_dummy(); spi_read(AT45DBX_SPI, &status); } while ((status & AT45DBX_MSK_BUSY) == AT45DBX_BUSY); // Unselect the DF memory gl_ptr_mem points to. at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); } Bool at45dbx_read_open(U32 sector) { U32 addr; // Set the global memory pointer to a byte address. gl_ptr_mem = sector << AT45DBX_SECTOR_BITS; // gl_ptr_mem = sector * AT45DBX_SECTOR_SIZE. // If the DF memory is busy, wait until it's ready. if (at45dbx_busy) at45dbx_wait_ready(); at45dbx_busy = FALSE; // Select the DF memory gl_ptr_mem points to. at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, TRUE); // Initiate a page read at a given sector. // Send the Main Memory Page Read command. spi_write(AT45DBX_SPI, AT45DBX_CMDA_RD_PAGE); // Send the three address bytes, which comprise: // - (24 - (AT45DBX_PAGE_ADDR_BITS + AT45DBX_BYTE_ADDR_BITS)) reserved bits; // - then AT45DBX_PAGE_ADDR_BITS bits specifying the page in main memory to be read; // - then AT45DBX_BYTE_ADDR_BITS bits specifying the starting byte address within that page. // NOTE: The bits of gl_ptr_mem above the AT45DBX_MEM_SIZE bits are useless for the local // DF addressing. They are used for DF discrimination when there are several DFs. addr = (Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_PAGE) << AT45DBX_BYTE_ADDR_BITS) | Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE); spi_write(AT45DBX_SPI, LSB2W(addr)); spi_write(AT45DBX_SPI, LSB1W(addr)); spi_write(AT45DBX_SPI, LSB0W(addr)); // Send 32 don't care clock cycles to initialize the read operation. spi_write_dummy(); spi_write_dummy(); spi_write_dummy(); spi_write_dummy(); return OK; } void at45dbx_read_close(void) { // Unselect the DF memory gl_ptr_mem points to. at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); // Memory ready. at45dbx_busy = FALSE; } Bool at45dbx_write_open(U32 sector) { U32 addr; // Set the global memory pointer to a byte address. gl_ptr_mem = sector << AT45DBX_SECTOR_BITS; // gl_ptr_mem = sector * AT45DBX_SECTOR_SIZE. // If the DF memory is busy, wait until it's ready. if (at45dbx_busy) at45dbx_wait_ready(); at45dbx_busy = FALSE; #if AT45DBX_PAGE_SIZE > AT45DBX_SECTOR_SIZE // Select the DF memory gl_ptr_mem points to. at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, TRUE); // Transfer the content of the current page to buffer 1. // Send the Main Memory Page to Buffer 1 Transfer command. spi_write(AT45DBX_SPI, AT45DBX_CMDB_XFR_PAGE_TO_BUF1); // Send the three address bytes, which comprise: // - (24 - (AT45DBX_PAGE_ADDR_BITS + AT45DBX_BYTE_ADDR_BITS)) reserved bits; // - then AT45DBX_PAGE_ADDR_BITS bits specifying the page in main memory to be read; // - then AT45DBX_BYTE_ADDR_BITS don't care bits. // NOTE: The bits of gl_ptr_mem above the AT45DBX_MEM_SIZE bits are useless for the local // DF addressing. They are used for DF discrimination when there are several DFs. addr = Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_PAGE) << AT45DBX_BYTE_ADDR_BITS; spi_write(AT45DBX_SPI, LSB2W(addr)); spi_write(AT45DBX_SPI, LSB1W(addr)); spi_write(AT45DBX_SPI, LSB0W(addr)); // Unselect the DF memory gl_ptr_mem points to. at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); // Wait for end of page transfer. at45dbx_wait_ready(); #endif // Select the DF memory gl_ptr_mem points to. at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, TRUE); // Initiate a page write at a given sector. // Send the Main Memory Page Program through Buffer 1 command. spi_write(AT45DBX_SPI, AT45DBX_CMDB_PR_PAGE_TH_BUF1); // Send the three address bytes, which comprise: // - (24 - (AT45DBX_PAGE_ADDR_BITS + AT45DBX_BYTE_ADDR_BITS)) reserved bits; // - then AT45DBX_PAGE_ADDR_BITS bits specifying the page in main memory to be written; // - then AT45DBX_BYTE_ADDR_BITS bits specifying the starting byte address within that page. // NOTE: The bits of gl_ptr_mem above the AT45DBX_MEM_SIZE bits are useless for the local // DF addressing. They are used for DF discrimination when there are several DFs. addr = (Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_PAGE) << AT45DBX_BYTE_ADDR_BITS) | Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE); spi_write(AT45DBX_SPI, LSB2W(addr)); spi_write(AT45DBX_SPI, LSB1W(addr)); spi_write(AT45DBX_SPI, LSB0W(addr)); return OK; } void at45dbx_write_close(void) { // While end of logical sector not reached, zero-fill remaining memory bytes. while (Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_SECTOR)) { spi_write(AT45DBX_SPI, 0x00); gl_ptr_mem++; } // Unselect the DF memory gl_ptr_mem points to. at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); // Memory busy. at45dbx_busy = TRUE; } //! @} /*! \name Single-Byte Access Functions */ //! @{ U8 at45dbx_read_byte(void) { U16 data; // Memory busy. if (at45dbx_busy) { // Being here, we know that we previously finished a page read. // => We have to access the next page. // Memory ready. at45dbx_busy = FALSE; // Eventually select the next DF and open the next page. // NOTE: at45dbx_read_open input parameter is a sector. at45dbx_read_open(gl_ptr_mem >> AT45DBX_SECTOR_BITS); // gl_ptr_mem / AT45DBX_SECTOR_SIZE. } // Send a dummy byte to read the next data byte. spi_write_dummy(); spi_read(AT45DBX_SPI, &data); gl_ptr_mem++; // If end of page reached, if (!Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE)) { // unselect the DF memory gl_ptr_mem points to. at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); // Memory busy. at45dbx_busy = TRUE; } return data; } Bool at45dbx_write_byte(U8 b) { // Memory busy. if (at45dbx_busy) { // Being here, we know that we previously launched a page programming. // => We have to access the next page. // Eventually select the next DF and open the next page. // NOTE: at45dbx_write_open input parameter is a sector. at45dbx_write_open(gl_ptr_mem >> AT45DBX_SECTOR_BITS); // gl_ptr_mem / AT45DBX_SECTOR_SIZE. } // Write the next data byte. spi_write(AT45DBX_SPI, b); gl_ptr_mem++; // If end of page reached, if (!Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE)) { // unselect the DF memory gl_ptr_mem points to in order to program the page. at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); // Memory busy. at45dbx_busy = TRUE; } return OK; } //! @} /*! \name Multiple-Sector Access Functions */ //! @{ Bool at45dbx_read_multiple_sector(U16 nb_sector) { while (nb_sector--) { // Read the next sector. at45dbx_read_sector_2_ram(sector_buf); at45dbx_read_multiple_sector_callback(sector_buf); } return OK; } Bool at45dbx_write_multiple_sector(U16 nb_sector) { while (nb_sector--) { // Write the next sector. at45dbx_write_multiple_sector_callback(sector_buf); at45dbx_write_sector_from_ram(sector_buf); } return OK; } //! @} /*! \name Single-Sector Access Functions */ //! @{ Bool at45dbx_read_sector_2_ram(void *ram) { U8 *_ram = ram; U16 i; U16 data; // Memory busy. if (at45dbx_busy) { // Being here, we know that we previously finished a page read. // => We have to access the next page. // Memory ready. at45dbx_busy = FALSE; // Eventually select the next DF and open the next page. // NOTE: at45dbx_read_open input parameter is a sector. at45dbx_read_open(gl_ptr_mem >> AT45DBX_SECTOR_BITS); // gl_ptr_mem / AT45DBX_SECTOR_SIZE. } // Read the next sector. for (i = AT45DBX_SECTOR_SIZE; i; i--) { // Send a dummy byte to read the next data byte. spi_write_dummy(); spi_read(AT45DBX_SPI, &data); *_ram++ = data; } // Update the memory pointer. gl_ptr_mem += AT45DBX_SECTOR_SIZE; #if AT45DBX_PAGE_SIZE > AT45DBX_SECTOR_SIZE // If end of page reached, if (!Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE)) #endif { // unselect the DF memory gl_ptr_mem points to. at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); // Memory busy. at45dbx_busy = TRUE; } return OK; } Bool at45dbx_write_sector_from_ram(const void *ram) { const U8 *_ram = ram; U16 i; // Memory busy. if (at45dbx_busy) { // Being here, we know that we previously launched a page programming. // => We have to access the next page. // Eventually select the next DF and open the next page. // NOTE: at45dbx_write_open input parameter is a sector. at45dbx_write_open(gl_ptr_mem >> AT45DBX_SECTOR_BITS); // gl_ptr_mem / AT45DBX_SECTOR_SIZE. } // Write the next sector. for (i = AT45DBX_SECTOR_SIZE; i; i--) { // Write the next data byte. spi_write(AT45DBX_SPI, *_ram++); } // Update the memory pointer. gl_ptr_mem += AT45DBX_SECTOR_SIZE; #if AT45DBX_PAGE_SIZE > AT45DBX_SECTOR_SIZE // If end of page reached, if (!Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE)) #endif { // unselect the DF memory gl_ptr_mem points to in order to program the page. at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); // Memory busy. at45dbx_busy = TRUE; } return OK; } //! @} #endif // AT45DBX_MEM == ENABLE ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Management of the AT45DBX data flash controller through SPI. * * This file manages the accesses to the AT45DBX data flash components. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with an SPI module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _AT45DBX_H_ #define _AT45DBX_H_ #include "conf_access.h" #if AT45DBX_MEM == DISABLE #error at45dbx.h is #included although AT45DBX_MEM is disabled #endif #include "spi.h" //_____ D E F I N I T I O N S ______________________________________________ /*! \name Available AT45DBX Sizes * * Number of address bits of available AT45DBX data flash memories. * * \note Only memories with page sizes of at least 512 bytes (sector size) are * supported. */ //! @{ #define AT45DBX_1MB 20 #define AT45DBX_2MB 21 #define AT45DBX_4MB 22 #define AT45DBX_8MB 23 //! @} // AT45DBX_1MB #define AT45DBX_SECTOR_BITS 8 //! Number of bits for addresses within sectors. // AT45DBX_2MB AT45DBX_4MB AT45DBX_8MB //#define AT45DBX_SECTOR_BITS 9 //! Number of bits for addresses within sectors. //! Sector size in bytes. #define AT45DBX_SECTOR_SIZE (1 << AT45DBX_SECTOR_BITS) //_____ D E C L A R A T I O N S ____________________________________________ /*! \name Control Functions */ //! @{ /*! \brief Initializes the data flash controller and the SPI channel by which * the DF is controlled. * * \param spiOptions Initialization options of the DF SPI channel. * \param pba_hz SPI module input clock frequency (PBA clock, Hz). * * \retval OK Success. * \retval KO Failure. */ extern Bool at45dbx_init(spi_options_t spiOptions, unsigned int pba_hz); /*! \brief Performs a memory check on all DFs. * * \retval OK Success. * \retval KO Failure. */ extern Bool at45dbx_mem_check(void); /*! \brief Opens a DF memory in read mode at a given sector. * * \param sector Start sector. * * \retval OK Success. * \retval KO Failure. * * \note Sector may be page-unaligned (depending on the DF page size). */ extern Bool at45dbx_read_open(U32 sector); /*! \brief Unselects the current DF memory. */ extern void at45dbx_read_close(void); /*! \brief This function opens a DF memory in write mode at a given sector. * * \param sector Start sector. * * \retval OK Success. * \retval KO Failure. * * \note Sector may be page-unaligned (depending on the DF page size). * * \note If \ref AT45DBX_PAGE_SIZE > \ref AT45DBX_SECTOR_SIZE, page content is * first loaded in buffer to then be partially updated by write byte or * write sector functions. */ extern Bool at45dbx_write_open(U32 sector); /*! \brief Fills the end of the current logical sector and launches page programming. */ extern void at45dbx_write_close(void); //! @} /*! \name Single-Byte Access Functions */ //! @{ /*! \brief Performs a single byte read from DF memory. * * \return The read byte. * * \note First call must be preceded by a call to the \ref at45dbx_read_open * function. */ extern U8 at45dbx_read_byte(void); /*! \brief Performs a single byte write to DF memory. * * \param b The byte to write. * * \retval OK Success. * \retval KO Failure. * * \note First call must be preceded by a call to the \ref at45dbx_write_open * function. */ extern Bool at45dbx_write_byte(U8 b); //! @} /*! \name Multiple-Sector Access Functions */ //! @{ /*! \brief Reads \a nb_sector sectors from DF memory. * * Data flow is: DF -> callback. * * \param nb_sector Number of contiguous sectors to read. * * \retval OK Success. * \retval KO Failure. * * \note First call must be preceded by a call to the \ref at45dbx_read_open * function. * * \note As \ref AT45DBX_PAGE_SIZE is always a multiple of * \ref AT45DBX_SECTOR_SIZE, there is no need to check page end for each * byte. */ extern Bool at45dbx_read_multiple_sector(U16 nb_sector); /*! \brief Callback function invoked after each sector read during * \ref at45dbx_read_multiple_sector. * * \param psector Pointer to read sector. */ extern void at45dbx_read_multiple_sector_callback(const void *psector); /*! \brief Writes \a nb_sector sectors to DF memory. * * Data flow is: callback -> DF. * * \param nb_sector Number of contiguous sectors to write. * * \retval OK Success. * \retval KO Failure. * * \note First call must be preceded by a call to the \ref at45dbx_write_open * function. * * \note As \ref AT45DBX_PAGE_SIZE is always a multiple of * \ref AT45DBX_SECTOR_SIZE, there is no need to check page end for each * byte. */ extern Bool at45dbx_write_multiple_sector(U16 nb_sector); /*! \brief Callback function invoked before each sector write during * \ref at45dbx_write_multiple_sector. * * \param psector Pointer to sector to write. */ extern void at45dbx_write_multiple_sector_callback(void *psector); //! @} /*! \name Single-Sector Access Functions */ //! @{ /*! \brief Reads 1 DF sector to a RAM buffer. * * Data flow is: DF -> RAM. * * \param ram Pointer to RAM buffer. * * \retval OK Success. * \retval KO Failure. * * \note First call must be preceded by a call to the \ref at45dbx_read_open * function. */ extern Bool at45dbx_read_sector_2_ram(void *ram); /*! \brief Writes 1 DF sector from a RAM buffer. * * Data flow is: RAM -> DF. * * \param ram Pointer to RAM buffer. * * \retval OK Success. * \retval KO Failure. * * \note First call must be preceded by a call to the \ref at45dbx_write_open * function. */ extern Bool at45dbx_write_sector_from_ram(const void *ram); //! @} #endif // _AT45DBX_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief CTRL_ACCESS interface for the AT45DBX data flash controller. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with an SPI module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ //_____ I N C L U D E S ___________________________________________________ #include "conf_access.h" #if AT45DBX_MEM == ENABLE #include "conf_at45dbx.h" #include "at45dbx.h" #include "at45dbx_mem.h" //_____ D E F I N I T I O N S ______________________________________________ //! Whether to detect write accesses to the memory. #define AT45DBX_MEM_TEST_CHANGE_STATE ENABLED #if (ACCESS_USB == ENABLED || ACCESS_MEM_TO_RAM == ENABLED) && AT45DBX_MEM_TEST_CHANGE_STATE == ENABLED //! Memory data modified flag. static volatile Bool s_b_data_modify = FALSE; #endif /*! \name Control Interface */ //! @{ Ctrl_status at45dbx_test_unit_ready(void) { return (at45dbx_mem_check() == OK) ? CTRL_GOOD : CTRL_NO_PRESENT; } Ctrl_status at45dbx_read_capacity(U32 *u32_nb_sector) { *u32_nb_sector = (AT45DBX_MEM_CNT << (AT45DBX_MEM_SIZE - AT45DBX_SECTOR_BITS)) - 1; return CTRL_GOOD; } Bool at45dbx_wr_protect(void) { return FALSE; } Bool at45dbx_removal(void) { return FALSE; } //! @} #if ACCESS_USB == ENABLED #include "usb_drv.h" #include "scsi_decoder.h" /*! \name MEM <-> USB Interface */ //! @{ Ctrl_status at45dbx_usb_read_10(U32 addr, U16 nb_sector) { if (addr + nb_sector > AT45DBX_MEM_CNT << (AT45DBX_MEM_SIZE - AT45DBX_SECTOR_BITS)) return CTRL_FAIL; at45dbx_read_open(addr); at45dbx_read_multiple_sector(nb_sector); at45dbx_read_close(); return CTRL_GOOD; } void at45dbx_read_multiple_sector_callback(const void *psector) { U16 data_to_transfer = AT45DBX_SECTOR_SIZE; // Transfer read sector to the USB interface. while (data_to_transfer) { while (!Is_usb_in_ready(g_scsi_ep_ms_in)) { if(!Is_usb_endpoint_enabled(g_scsi_ep_ms_in)) return; // USB Reset } Usb_reset_endpoint_fifo_access(g_scsi_ep_ms_in); data_to_transfer = usb_write_ep_txpacket(g_scsi_ep_ms_in, psector, data_to_transfer, &psector); Usb_ack_in_ready_send(g_scsi_ep_ms_in); } } Ctrl_status at45dbx_usb_write_10(U32 addr, U16 nb_sector) { if (addr + nb_sector > AT45DBX_MEM_CNT << (AT45DBX_MEM_SIZE - AT45DBX_SECTOR_BITS)) return CTRL_FAIL; #if AT45DBX_MEM_TEST_CHANGE_STATE == ENABLED if (nb_sector) s_b_data_modify = TRUE; #endif at45dbx_write_open(addr); at45dbx_write_multiple_sector(nb_sector); at45dbx_write_close(); return CTRL_GOOD; } void at45dbx_write_multiple_sector_callback(void *psector) { U16 data_to_transfer = AT45DBX_SECTOR_SIZE; // Transfer sector to write from the USB interface. while (data_to_transfer) { while (!Is_usb_out_received(g_scsi_ep_ms_out)) { if(!Is_usb_endpoint_enabled(g_scsi_ep_ms_out)) return; // USB Reset } Usb_reset_endpoint_fifo_access(g_scsi_ep_ms_out); data_to_transfer = usb_read_ep_rxpacket(g_scsi_ep_ms_out, psector, data_to_transfer, &psector); Usb_ack_out_received_free(g_scsi_ep_ms_out); } } //! @} #endif // ACCESS_USB == ENABLED #if ACCESS_MEM_TO_RAM == ENABLED /*! \name MEM <-> RAM Interface */ //! @{ Ctrl_status at45dbx_df_2_ram(U32 addr, void *ram) { if (addr + 1 > AT45DBX_MEM_CNT << (AT45DBX_MEM_SIZE - AT45DBX_SECTOR_BITS)) return CTRL_FAIL; at45dbx_read_open(addr); at45dbx_read_sector_2_ram(ram); at45dbx_read_close(); return CTRL_GOOD; } Ctrl_status at45dbx_ram_2_df(U32 addr, const void *ram) { if (addr + 1 > AT45DBX_MEM_CNT << (AT45DBX_MEM_SIZE - AT45DBX_SECTOR_BITS)) return CTRL_FAIL; #if AT45DBX_MEM_TEST_CHANGE_STATE == ENABLED s_b_data_modify = TRUE; #endif at45dbx_write_open(addr); at45dbx_write_sector_from_ram(ram); at45dbx_write_close(); return CTRL_GOOD; } //! @} #endif // ACCESS_MEM_TO_RAM == ENABLED #endif // AT45DBX_MEM == ENABLE ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief CTRL_ACCESS interface for the AT45DBX data flash controller. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with an SPI module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _AT45DBX_MEM_H_ #define _AT45DBX_MEM_H_ #include "conf_access.h" #if AT45DBX_MEM == DISABLE #error at45dbx_mem.h is #included although AT45DBX_MEM is disabled #endif #include "ctrl_access.h" //_____ D E C L A R A T I O N S ____________________________________________ /*! \name Control Interface */ //! @{ /*! \brief Tests the memory state and initializes the memory if required. * * The TEST UNIT READY SCSI primary command allows an application client to poll * a LUN until it is ready without having to allocate memory for returned data. * * This command may be used to check the media status of LUNs with removable * media. * * \return Status. */ extern Ctrl_status at45dbx_test_unit_ready(void); /*! \brief Returns the address of the last valid sector in the memory. * * \param u32_nb_sector Pointer to the address of the last valid sector. * * \return Status. */ extern Ctrl_status at45dbx_read_capacity(U32 *u32_nb_sector); /*! \brief Returns the write-protection state of the memory. * * \return \c TRUE if the memory is write-protected, else \c FALSE. * * \note Only used by removable memories with hardware-specific write * protection. */ extern Bool at45dbx_wr_protect(void); /*! \brief Tells whether the memory is removable. * * \return \c TRUE if the memory is removable, else \c FALSE. */ extern Bool at45dbx_removal(void); //! @} #if ACCESS_USB == ENABLED /*! \name MEM <-> USB Interface */ //! @{ /*! \brief Tranfers data from the memory to USB. * * \param addr Address of first memory sector to read. * \param nb_sector Number of sectors to transfer. * * \return Status. */ extern Ctrl_status at45dbx_usb_read_10(U32 addr, U16 nb_sector); /*! \brief Tranfers data from USB to the memory. * * \param addr Address of first memory sector to write. * \param nb_sector Number of sectors to transfer. * * \return Status. */ extern Ctrl_status at45dbx_usb_write_10(U32 addr, U16 nb_sector); //! @} #endif #if ACCESS_MEM_TO_RAM == ENABLED /*! \name MEM <-> RAM Interface */ //! @{ /*! \brief Copies 1 data sector from the memory to RAM. * * \param addr Address of first memory sector to read. * \param ram Pointer to RAM buffer to write. * * \return Status. */ extern Ctrl_status at45dbx_df_2_ram(U32 addr, void *ram); /*! \brief Copies 1 data sector from RAM to the memory. * * \param addr Address of first memory sector to write. * \param ram Pointer to RAM buffer to read. * * \return Status. */ extern Ctrl_status at45dbx_ram_2_df(U32 addr, const void *ram); //! @} #endif #endif // _AT45DBX_MEM_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/revision.txt ================================================ Revision: 2491 ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_api.h ================================================ /* * Programming interface for wl_api. * Copyright (C) 2010 HD Wireless AB * * You should have received a copy of the license along with this library. */ /*! \file wl_api.h ************************************************************* * * \brief Basic WiFi API * * This file provides the wl_api interface. * * - Compiler: GNU GCC for AVR32 * - Supported devices: * \li SPB104 + EVK1100 * \li SPB104 + EVK1101 * \li SPB104 + EVK1104 * \li SPB104 + EVK1105 (SPI) * \li SPB104 + EVK1105 (SPI + irq) * \li SPB105 + EVK1105 (SPI) * - AppNote: * * \author H&D Wireless AB: \n * ***************************************************************************** * * \section intro Introduction * This is the documentation for the generic WiFi Driver API \a wl_api. * * \section files Main Files * - wl_api.h : WiFi driver interface. * - lib_ucr*_hd_wifi_standalone_v*.*.a - Driver library. * */ /** \mainpage wl_api Reference Manual \image html images/wl_api_block_diagram_small.png "wl_api Architecture" (o)WL API © is a programming interface for WiFi (802.11). It aims to be a complete interface for embedded applications wanting to use wireless as a communications interface. (o)WL API © is shortened "wl_api" in this document. wl_api has been designed to meet the following goals : \li Simple : The API is as simple as is practicable to make it easy to use. \li Minimal size : The API is usable on very resource constrained platforms. \li Portable : The API is deployable on any platform with a standards compliant C compiler. \li OS independent : The API is deployable on systems using a real time operating system as well as with applications running on the "bare metal" of a hardware platform (that is without an operating system). As a consequence of these design goals wl_api does not allow very fine grained control of most parameters relating to 802.11 networks. That would increase the flexibility of the API while also increasing complexity and code size. When the underlying WiFi hardware can support a richer feature set the extra features can be offered as a add-on library if required. The wl_api is implemented by two libraries. The core library is compiled for a hardware platform and is independent of operating system or IP stack. The core library contains all WiFi functionality. The core library is supported by a suite of transport libraries. The transport libraries implements the hardware communication layer and are specific to the type of hardware interface used to connect the host platform to the WiFi hardware. For example, there are transport libraries for SPI and for SDIO. Only the core library has a public interface (wl_api.h) but applications will need to link with both the core library and a transport library matching the hardware configuration. \section wl_api_princ Operation Principles There are three important properties of wl_api to keep in mind when programming with it. The first is that wl_api is \b asynchronous. For instance, when the \a wl_connect() function is called to attempt connection with an access point it will trigger a sequence of packets being exchanged with the access point after which, if everything is okay, a connection has been established. The \a wl_connect() call is asynchronous (or non-blocking) which means that you don't know if the connection attempt has succeeded after the call returns. You only know if the sequence was successfully started or not. To find out if, and when, the connection attempt was successful you must register an event handler using the function \a wl_register_event_cb(). This is true of a number of API calls (which is indicated in their documentation). The second important property is that wl_api is \b polled. wl_api never executes "by itself", since it would then have to support interrupts, timers, locks and other operating system dependent features. Instead all asynchronous processes proceed when wl_api is polled by calling the \a wl_tick() function. When \a wl_tick() is called wl_api reacts to any received management frames, expires any internal timers and performs any other tasks necessary for forward progress. After \a wl_tick() returns nothing will happen unless it or some other wl_api function is called again. Also, to send and receive data, the \a wl_process_rx() and \a wl_process_tx() must be invoked upon reception and transmission of data. The third important property is that wl_api is \b not \b thread \b safe. All wl_api calls must execute in the same context since the library has no knowledge of the locking mechanisms available (if any). \section wl_api_code_examples A note on the code examples The code examples illustrate how to call the different wl_api functions. They do not constitute a complete program. Functions with the prefix "app_" in the code examples are application specific calls that illustrate a particular action. These functions are not part of the API and will have to be implemented if needed. For a complete working code example see one of the H&D Wireless software reference designs, such as the WiFi HTTP server demo code in the Atmel Software Framework. The API is structured into these functional groups: \li \ref wl_api \li \ref wl_wifi \li \ref wl_data \li \ref wl_transport \li \ref wl_custom Also documented here is the transport layers for SPI and SDIO. There interfaces are only necessary when porting the library to a new hardware platform. \li \ref wl_spi \li \ref wl_sdio * \section contactinfo Contact Information * For further information, visit * H&D Wireless.\n * Support and FAQ: http://www.atmel.com/ */ #ifndef WL_API_H #define WL_API_H #define WL_API_RELEASE_NAME "v2.7.0" /*! Maximum size of a SSID */ #define WL_SSID_MAX_LENGTH 32 /*! Size of a MAC-address or BSSID */ #define WL_MAC_ADDR_LENGTH 6 /*! Maximum length of a passphrase */ #define WL_MAX_PASS_LEN 64 /*! Indicates that there is no SNR information */ #define WL_SNR_UNKNOWN -128 #define SPB104 104 #define SPB105 105 /*! \ingroup wl_api * API Error codes */ typedef enum { WL_FAILURE = -1, WL_SUCCESS = 1, WL_NOEFFECT, WL_OOM, WL_INVALID_LENGTH, WL_NOT_SUPPORTED, WL_ABSORBED, WL_RESOURCES, WL_BUSY, WL_RETRY, /*!< Retry the operation later. The driver is busy resolving an operation that conflicts with the request. */ WL_INVALID_ARGS, WL_AVAIL, WL_CARD_FAILURE, /*!< Could not detect SPB device */ WL_FIRMWARE_INVALID, /*!< Invalid firmware data */ } wl_err_t; /*! \ingroup wl_wifi * Event identifiers */ enum wl_event_id_t { WL_EVENT_MEDIA_CONNECTED = 0, WL_EVENT_CONN_FAILURE, WL_EVENT_MEDIA_DISCONNECTED, WL_EVENT_SCAN_COMPLETE, WL_EVENT_FAILURE, MAX_WL_EVENT }; /*! \ingroup wl_wifi * Authentication modes */ enum wl_auth_mode { AUTH_MODE_INVALID, AUTH_MODE_AUTO, AUTH_MODE_OPEN_SYSTEM, AUTH_MODE_SHARED_KEY, AUTH_MODE_WPA, AUTH_MODE_WPA2, AUTH_MODE_WPA_PSK, AUTH_MODE_WPA2_PSK }; /*! \ingroup wl_wifi * Encryption modes */ enum wl_enc_type { /* Values map to 802.11 encryption suites... */ ENC_TYPE_WEP = 5, ENC_TYPE_TKIP = 2, ENC_TYPE_CCMP = 4, /* ... except these two, 7 and 8 are reserved in 802.11-2007 */ ENC_TYPE_NONE = 7, ENC_TYPE_AUTO = 8 }; enum wl_host_attention_mode { WL_HOST_ATTENTION_SDIO = 0x1, /*!< For SDIO or polled SPI */ WL_HOST_ATTENTION_SPI = 0x5a /*!< For SPI with interrupt line */ }; /*! \ingroup wl_wifi * Event descriptor */ struct wl_event_t { enum wl_event_id_t id; /**< Event identifier. */ }; /*! \ingroup wl_wifi * Infrastructure (ESS) or Ad-hoc (IBSS) connection modes. */ enum wl_conn_type_t { WL_CONN_TYPE_INFRA, /*!< For infrastructure mode (default) */ WL_CONN_TYPE_ADHOC /*!< For ad-hoc mode */ }; /* Note: * If your environment does not have stdint.h you will have to * define the fixed-width integer types specified in that file * yourself, make sure that those definitions are included * before any inclusions of wl_api.h, and build with the macro * WITHOUT_STDINT defined. In this case the wl_api library * must have been built with the same integer type definitions. */ #ifndef WITHOUT_STDINT #include #endif /* Note: * If your environment does not have stdio.h you will have to define * the size_t type yourself, make sure that that definition is * included before any inclusions of wl_api.h, and build with the * macro WITHOUT_STDIO defined. In this case the wl_api library must * have been built with the same size_t type definition. */ #ifndef WITHOUT_STDIO #include #endif /*! \ingroup wl_wifi * * \brief SSID representation. * * The SSID is a binary string and cannot be treated as a * C-string safely. An empty SSID is represented by a * SSID struct with the len field set to 0. */ struct wl_ssid_t { char ssid[WL_SSID_MAX_LENGTH]; /**< Octet array containing the SSID data. */ uint8_t len; /**< Length of valid data in ssid member. * Cannot be longer than WL_SSID_MAX_LENGTH. */ }; /*! \ingroup wl_wifi * * MAC-address/BSSID representation * * A broadcast BSSID is one with all octets set to 0xFF. */ struct wl_mac_addr_t { uint8_t octet[WL_MAC_ADDR_LENGTH]; /**< Octet array containing the MAC address * data. This array is always WL_MAC_ADDR_LENGTH bytes. */ }; /*! \ingroup wl_wifi * * Network representation * */ struct wl_network_t { struct wl_ssid_t ssid; /**< The SSID of the network. */ struct wl_mac_addr_t bssid; /**< The BSSID of the network. */ uint8_t channel; /**< The wlan channel which the network uses */ uint32_t beacon_period; /**< Beacon period for the network */ uint16_t dtim_period; /**< DTIM period for the network */ int32_t rssi; /**< Received Signal Strength in dBm (measured on beacons) */ int32_t snr; /**< Received Signal to noise ratio in dBm (measured on beacons) */ uint8_t enc_type; /**< The encryption type used in the network. */ enum wl_conn_type_t net_type; /**< Type of network (Infrastructure or Ad-Hoc */ size_t ie_len; /**< Always 0 unless wl_api has been built with WL_CONFIG_WPA_SUPPLICANT */ uint8_t ie[0]; /**< Not used unless wl_api has been built with WL_CONFIG_WPA_SUPPLICANT */ }; /*! \ingroup wl_wifi * Network list representation. Array of pointers to wl_network_t entries. * */ struct wl_network_list_t { struct wl_network_t **net; /**< The list of pointers to networks */ size_t cnt; /**< Number of networks */ }; #define WL_RATE_1MBIT 2 #define WL_RATE_2MBIT 4 #define WL_RATE_5_5MBIT 11 #define WL_RATE_6MBIT 12 #define WL_RATE_9MBIT 18 #define WL_RATE_11MBIT 22 #define WL_RATE_12MBIT 24 #define WL_RATE_18MBIT 36 #define WL_RATE_22MBIT 44 #define WL_RATE_24MBIT 48 #define WL_RATE_33MBIT 66 #define WL_RATE_36MBIT 72 #define WL_RATE_48MBIT 96 #define WL_RATE_54MBIT 108 #define WL_RATE_NUM_RATES 14 #define WL_RATE_INVALID WL_RATE_NUM_RATES /*! \ingroup wl_wifi * * Rate representation * */ typedef uint8_t wl_rate_t; /** \defgroup wl_api Library support functions * * These functions manage the library in general. They concern initalizing * the library, downloading firmware to the WiFi chip and handling events * from the library. For this example we assume that the application is running stand-alone without an operating system. Before the library can do anything it needs to start up the WiFi hardware by downloading a firmware image. The firmware image is relatively big (around 144kB) and is therefore not included in the library it is only needed once. It is up to the application to decide where to store the firmware image and how to read it into the wl_api library. Step one is to write a function of the type \a ::wl_fw_read_cb_t that wl_api will call to retrive the firmware image. Assuming that you have some spare RAM (or whatever memory type is used for read only data, such as FLASH memory) on your platform you can simply include the firmware image from the \a wl_fw.h header file and write a firmware read function like this \code static size_t fw_read_cb(void* ctx, uint8_t** buf, size_t offset, size_t len) { if ( NULL == buf ) { return 0; } *buf = ((uint8_t*) fw_buf) + offset; if ( len > ( fw_len - offset ) ) { return fw_len - offset; } return len; } \endcode If the firmware image is stored in ROM this function may have to read it back block by block instead. First, firmware must be downloaded to the device \code if ( wl_transport_init(fw_read_cb, NULL, &mode) != WL_SUCCESS ) { app_error("Firmware download failed"); return 0; } \endcode The wl_api library is then initialized like this \code if ( wl_init(NULL, init_complete_cb, mode) != WL_SUCCESS ) { app_error("Init failed"); return 0; } \endcode The library startup process will now require \a wl_poll() to be called a number of times before it can complete. In addition, if the application needs to know when the startup process has completed so that it can, for example, start up an IP stack it will have to supply a valid callback function of the type \a ::wl_init_complete_cb_t as a parameter to the \a wl_init() call and start polling the wl_api library. The init complete callback will only be executed during a call to \a wl_poll() or another wl_api function. This simplifies the implementation since no internal locking is required and the wl_api library becomes OS-independent. \code static void init_complete_cb(void* ctx) { init_ip_stack(); } \endcode Registering the event callback is straightforward : \code if (wl_register_event_cb(event_cb, NULL) != WL_SUCCESS) { app_error("Failed to register event handler"); return 0; } \endcode Similar to \a wl_poll(), there is also a \a wl_tick() function that takes a free running "tick" counter with millisecond resolution as an argument so that it can trigger internal timers when necessary. Assuming that such a tick counter is provided by the macro GET_MS_TICK() the wl_api execution loop becomes \code while (TRUE) { wl_tick(GET_MS_TICK()); wl_poll(); } \endcode In a stand-alone application this loop would usually be the main application loop and include application specific calls as well. After some number of main loop iterations the init_complete_cb will be invoked and the application can initialize its IP stack. * @{ */ /*! \brief WiFi event callback. * * This function receives WiFi events that the application * wants notification of. This function is supplied by the user * of the API. * * @param event Struct describing the type of event and, for some * events, additional information regarding the * status of the event. See wl_event_t for additional * information. * @param ctx A context handle. This handle is passed * untouched to the callback and has the same value * as the context registered with the callback in * wl_register_event_cb(). */ typedef void (*wl_event_cb_t) (struct wl_event_t event, void* ctx); /*! \brief Initialization complete callback function. * * Invoked when WiFi initialization is complete. * * @param ctx Opaque context pointer as provided to \a wl_init() that will be * passed back to the callback. */ typedef void (wl_init_complete_cb_t)(void* ctx); /*! \brief Register an event handler. * * Register an event handler with the driver. This * event handler will be called whenever a event * listed in #wl_event_id_t occurs. * See #wl_event_cb_t and #wl_event_id_t for more details. * * @param cb Event callback function to register. * @param ctx Opaque context pointer that will be * passed to the callback when it is * invoked. This parameter is never * accessed by the API. * @return WL_SUCCESS */ wl_err_t wl_register_event_cb(wl_event_cb_t cb, void* ctx); /*! \brief Initialize the wl_api library. * * Note that \a wl_poll() must be called for this function to progress * towards complete init * * The startup process will proceed asynchronously and will inkove * init_complete_cb when completed. The callback will not be invoked if any * error occurs during initialization. * * This function should be called after firmware has been downloaded to the * device. * * @param ctx Opaque context pointer that will be passed to the callback * when invoked. This parameter is never accessed by the API. * @param init_complete_cb callback function to invoke when initialization is * complete. * @param mode Indicates the host attention mode used by the device. If * \a wl_transport_init() was used to download the firmware image to the * device, the proper mode can be obtained from the mode parameter of * that function. * * @return * - WL_SUCCESS * - WL_FAILURE */ wl_err_t wl_init(void* ctx, wl_init_complete_cb_t init_complete_cb, enum wl_host_attention_mode mode); /*! \brief Shutdown the wl_api library and free resources. * * \a wl_init() must be invoked to startup the library * again. * * @return * - WL_SUCCESS on success * - WL_FAILURE * */ wl_err_t wl_shutdown(void); /*! \brief WiFi driver timer tick function * * Periodic timers are triggered from this function so it should be called as * often as possible if precision timing is required (traffic timeouts, * authentication timeouts etc). * * @param tick A tick count in us. This is used to expire timers * in the driver. */ void wl_tick(uint32_t tick); /*! @} */ /** \defgroup wl_wifi Connection Management * * These functions access WiFi-specific functionality such as * scanning, connect/disconnect, authentication and encryption, * and power save modes. * \section scanning Scanning To scan all channels that are available in the current regulatory domain \code if ( wl_scan() != WL_SUCCESS ) { // May be busy scanning already, no fatal error return 0; } \endcode Since wl_scan() only starts the scanning process the application should add code to the event handler to catch the "scan complete" event and retrieve the list of seen networks from the library \code static void event_cb(struct wl_event_t event, void* ctx) { switch(event.id) { case WL_EVENT_SCAN_COMPLETE: struct wl_network_list_t *netlist; uint8_t netcnt; wl_get_network_list(&netlist); netcnt = netlist->cnt; while (--netcnt) { print_network(netlist->net[netcnt]); } break; } } \endcode The function print_network() could display the network name, the SSID, in a user interface. It is important to keep in mind is that despite the fact that the SSID is usually presented as a ASCII string, it is in fact just a byte string and can legally contain all kinds of non-printable characters, including a 0-byte. This means that it is easy to end up with buffer overrun bugs if the SSID is ever treated as a normal string without precautions. \code void print_network(struct wl_network_t* wl_network) { char ssid[WL_SSID_MAX_LENGTH + 1]; memset(ssid, 0, sizeof(ssid)); memcpy(ssid, wl_network->ssid.ssid, wl_network->ssid.len); if (app_is_printable(ssid)) { app_print("\"%s\" ", ssid); } else { app_print(" "); } switch (wl_network->enc_type) { case ENC_TYPE_WEP : app_print("(WEP encryption)"); break; case ENC_TYPE_TKIP : app_print("(TKIP encryption)"); break; case ENC_TYPE_CCMP : app_print("(CCMP encryption)"); break; } app_print("\n"); } \endcode \section connecting Connecting To connect to an access point (beware binary SSIDs) the connection process must be started \code if ( wl_connect("My AP", strlen("My AP")) != WL_SUCCESS ) { app_error("Connection failed.\n"); return 0; } \endcode and the \a WL_EVENT_MEDIA_CONNECTED and \a WL_EVENT_CONN_FAILURE events should be caught. To detect that a connection is terminated after it has been successfully established (such as when the AP goes out of range) the \a WL_EVENT_MEDIA_DISCONNECTED event must be also be caught \code static void event_cb(struct wl_event_t event, void* ctx) { switch(event.id) { case WL_EVENT_SCAN_COMPLETE: struct wl_network_list_t *netlist; uint8_t netcnt; wl_get_network_list(&netlist); netcnt = netlist->cnt; while (--netcnt) { print_network(netlist->net[netcnt]); } break; case WL_EVENT_CONN_FAILURE: app_error("Connection failed\n"); break; case WL_EVENT_MEDIA_CONNECTED: app_print("Connected to Access Point\n"); app_ip_interface_up(); break; case WL_EVENT_MEDIA_DISCONNECTED: app_print("Disconnected from Access Point\n"); app_ip_interface_down(); break; } } \endcode \section security Security To use WEP a WEP key must be added before the connection is initiated. To set the 40-bit WEP key 0xDEADBEEF00 as default key for key index 0 do \code char key[5] = { 0xDE, 0xAD, 0xBE, 0xEF, 0x00 }; struct wl_mac_addr_t bssid; // This means that the bssid is a broadcast bssid and the WEP key will be a default key instead of a key-mapping key. memset(&bssid.octet, 0xff, sizeof bssid.octet); if ( wl_add_wep_key(0, sizeof key, key, &bssid) != WL_SUCCESS ) { app_error("Failed to add WEP key."); return 0; } \endcode To use WPA/WPA2 with a Pre-shared key a passphrase must be associated with the network before the connection is initiated. \code struct wl_network_t net; char passphrase[] = "MySecretKey"; memset(&net, 0, sizeof net); memset(net.bssid.octet, 0xFF, sizeof net.bssid.octet); strncpy(net.ssid.ssid, "My AP", strlen("My AP")); net.ssid.len = strlen("My AP"); net.enc_type = ENC_TYPE_AUTO; if (wl_set_passphrase(&net, passphrase, strlen(passphrase), ENC_TYPE_AUTO, AUTH_MODE_AUTO) != WL_SUCCESS) { app_error("Failed to add passphrase"); } \endcode The library supports several passphrase-network associations to be configured simultaneously. Be aware that the \a wl_connect() call can take up to 15 seconds longer than normal when using a pre-shared WPA/WPA2 key since the platform must calculate a temporal encryption key from the passphrase before the connection attempt can start. * @{ */ /*! \brief Scan all channels. * * Starts a scan of all WiFi channels allowed in this regulatory * domain. The list of allowed channels (the domain) is adapted to the * channels announced as allowed by the first AP heard. * * The scan will proceed asynchronously and will raise a * WL_EVENT_SCAN_COMPLETE event when completed. * * Currently, there's a limit on the scan list size that depends on the * architecture (6 networks for the AVR32 UCR1 architecture 16 networks for * other architectures. If more network exist, the strongest networks are * chosen. Note that the limitation on the scan list size does not limit the * networks which the device can connect to. See wl_connect() for more * details. * * @return * - WL_SUCCESS * - WL_FAILURE. */ wl_err_t wl_scan(void); /*! \brief Get the list of currently known networks. * * Retrieves the list of currently known networks from * the driver. To ensure that this list is up-to-date * a wl_scan() call should be issued and this function * should be called upon reception of the WL_EVENT_SCAN_COMPLETE * event. This function can be called at other times * but the list of networks retrieved then might not * correspond to the networks actually in range. * * Note that a successful scan does not necessarily * find any networks. * * @param network_list Output buffer. The API call returns * a pointer to allocated memory containing the network list. * @return * - WL_SUCCESS * - WL_FAILURE. */ wl_err_t wl_get_network_list(struct wl_network_list_t **network_list); #ifdef WFE_6_12 /*! \brief Start a Ad-hoc network. * * Attempt to start a Ad-hoc (IBSS) network. If a Ad-hoc network * is successfully started then a WL_EVENT_MEDIA_CONNECTED event * will be raised once the first peer station connects to the Ad-hoc * network (and not when the network is announced on the air). * * If a Ad-hoc network should be started with encryption * enabled then \a wl_set_passphrase() should be called before * \a wl_start_adhoc_net() to configure the security parameters. * The Ad-hoc network is started with the security parameters * (if any) that was configured for the specified \a ssid. * * @param ssid The SSID of the new network. If there's a network * already present with this SSID this call will fail. * @param channel The channel to use. Valid channels are 1-14 * @param auth_mode The authentication mode to use. Supported * authentication modes for Ad-hoc networks are * AUTH_MODE_OPEN_SYSTEM and AUTH_MODE_SHARED_KEY. * Passing other modes will cause a WL_INVALID_ARGS return. * If AUTH_MODE_SHARED_KEY is used then a valid WEP * key must be set with a call to \a wl_add_wep_key() * and the default WEP key index must be set with a * call to \a wl_set_default_wep_key(). * @return * - WL_SUCCESS on success. * - WL_INVALID_ARGS if the ssid is malformed, if * the channel not valid or if the authentication mode * is invalid. * - WL_RETRY if the driver is busy resolving a conflicting * operation. The operation should be retried after a wait * (at least one call to wl_poll() for polled implementations). * - WL_BUSY if the driver is already connected or if a network * with the same SSID is already known. * */ wl_err_t wl_start_adhoc_net(struct wl_ssid_t ssid, uint8_t channel, enum wl_auth_mode auth_mode); #endif /*! \brief Connect to a SSID. * * Attempt to connect to a given SSID. If the driver is already * connected to an AP with a different SSID then this call will * return WL_BUSY and wl_disconnect() should be called before * trying again. * * The connection process will proceed asynchronously and will raise a * WL_EVENT_MEDIA_CONNECTED event when completed, or a WL_EVENT_CONN_FAILURE * when failed. After a WL_EVENT_MEDIA_CONNECTED event has been raised * a WL_EVENT_MEDIA_DISCONNECT event will be raised if the connection is * terminated. Note that this can be caused by external factors and can * happen at any time. * * If wl_connect() is invoked with a network that is not shown in the * scan list, the device will probe for that specific network and connect * to it, if found. This is also the method to use in order to connect to * "hidden" networks (AP's that doesn't broadcast its SSID). * * @param ssid Pointer to the SSID string. * Freed by caller. * @param ssid_len Length of the SSID string in octets. Max value is 32. * @return * - WL_SUCCESS * - WL_FAILURE if the network could not be found * - WL_BUSY if the driver is already connected * - WL_RETRY if the driver is busy resolving a conflicting operation. * The operation should be retried after a wait (at least one call to wl_poll() * for polled implementations). */ wl_err_t wl_connect(char* ssid, size_t ssid_len); /*! \brief Connect to a BSSID * * Attempt to connect to a given BSSID. If the driver is already * connected to an AP with a different BSSID then this call will * return WL_BUSY and wl_disconnect() should be called before * trying again. * * The connection process will proceed asynchronously and will raise a * WL_EVENT_MEDIA_CONNECTED event when completed, or a WL_EVENT_CONN_FAILURE * when failed. After a WL_EVENT_MEDIA_CONNECTED event has been raised * a WL_EVENT_MEDIA_DISCONNECT event will be raised if the connection is * terminated. Note that this can be caused by external factors and can * happen at any time. * * If wl_connect_bssid() is invoked with a network that is not shown in the * scan list, the device will probe for that specific network and connect * to it, if found. * * @param bssid Pointer to the BSSID. Freed by caller. * @return * - WL_SUCCESS * - WL_FAILURE if the network could not be found * - WL_BUSY if the driver is already connected * - WL_RETRY if the driver is busy resolving a conflicting operation. * The operation should be retried after a wait (at least one call to wl_poll() * for polled implementations). */ wl_err_t wl_connect_bssid(struct wl_mac_addr_t bssid); /*! \brief Disconnect from the network * * Disconnect from any currently associated network. * * The disconnection process will proceed asynchronously and will raise a * WL_EVENT_MEDIA_DISCONNECTED event when completed. * @return * - WL_SUCCESS if the disconnect process was started * - WL_FAILURE if the driver was not connected * - WL_RETRY if the driver is in the process of connecting. * In this case the disconnect must be retried after * the connection attempt has completed (resulted in a * WL_EVENT_MEDIA_CONNECTED or a WL_EVENT_CONN_FAILURE event). */ wl_err_t wl_disconnect(void); /*! * @brief Add a WEP encryption key to the device. * * Configure a key into the device. The key type (WEP-40, WEP-104) * is determined by the size of the key (5 bytes for WEP-40, 13 bytes for WEP-104). * * @param key_idx The key index to set. Valid values are 0-3. * @param key_len Length of key in bytes. Valid values are 5 and 13. * @param key Key input buffer. * @param bssid BSSID that the key applies to. If this is * the broadcast BSSID then the key is configured * as one of the default keys (not _the_ default key, * this must be set by calling set_default_wep_key() * after adding it). If the BSSID is a valid unicast * bssid then the key is configured as a key-mapping * key ( See 802.11-2007 8.2.1.3 ). * @return * - WL_SUCCESS on success. * - WL_INVALID_LENGTH if the key length is bad. * - WL_FAILURE on failure */ wl_err_t wl_add_wep_key(uint8_t key_idx, size_t key_len, const void *key, struct wl_mac_addr_t *bssid); /*! @brief Set the default WEP key index. * * Select which WEP key to use for transmitted packets. * For this to work correctly you must have added a WEP * key with \a wl_add_wep_key() as a default key, using the * same index as the one set in this call. * @param key_idx Index of the key to make the default key. * Valid values are 0-3. * @return WL_SUCCESS or WL_FAILURE. */ wl_err_t wl_set_default_wep_key(uint8_t key_idx); /*! \brief Delete a WEP key. * * Deletes a WEP key from the driver. * * @param key_idx The index of the key to delete. Valid values are 0-3. * @param bssid BSSID that the key applies to. If this is * the broadcast BSSID then the key deleted is a default key. * If the BSSID is a valid unicast bssid then the deleted * key is a key-mapping key. * @return WL_SUCCESS or WL_FAILURE */ wl_err_t wl_delete_wep_key(uint8_t key_idx, struct wl_mac_addr_t *bssid); /*! @brief Set a WPA/WPA2 passphase * * Associate a WPA/WPA2/RSN passphrase with a network. * The number of passphrases that can be stored can * vary but is always at least one. Passphrases can * be added until \a wl_add_wpa_passphrase() returns * WL_RESOURCES. * * @param net Network with which to associate the passphrase. * @param passphrase Passphrase. Valid characters in a passphrase * must lie between ASCII 32-126 (decimal). * @param len Length of passphrase. Valid lengths are 8-63. * @param enc_type Encryption type. If this is set to ENC_TYPE_AUTO * then the most secure supported mode will be automatically * selected. Normally you only need to pass something else here * if you need to enforce picking a certain encryption mode when * the network supports several modes and you don't want to use * the best one. * @param auth_mode Authentication mode. If this is set to AUTH_MODE_AUTO * then the most secure mode will be automatically selected. * Normally you only need to pass something else here if the network * announces support for both WPA and WPA2/RSN and the passphrases are * different. * @return * - WL_SUCCESS * - WL_INVALID_ARGS if the passphrase length is invalid. * - WL_RESOURCES if no more passphrases can be added. */ wl_err_t wl_set_passphrase(const struct wl_network_t *net, const char *passphrase, const size_t len, const enum wl_enc_type enc_type, const enum wl_auth_mode auth_mode); /*! @brief Remove a WPA/WPA2 passphase * * Remove a WPA/WPA2/RSN passphrase associated with a network. * * @param net Network with which to associate the passphrase. * If net is NULL then all stored passphrases will be * cleared. * @return * - WL_SUCCESS * - WL_FAILURE if no passphrase was associated with the net. */ wl_err_t wl_clear_passphrase(struct wl_network_t *net); /*! \brief Enable legacy power save mode * * Enable legacy power save mode. In legacy power save mode, the device * will power down when idle. When connected, the device will wake up to * receive beacon frames and any buffered data from the AP. The response * time when legacy power save is enabled might therefore be as long as the * AP beacon interval (mostly 100 ms). However, the throughput should not * be affected. * * @return WL_SUCCESS or WL_FAILURE. */ wl_err_t wl_enable_ps(void); /*! \brief Disable legacy power save mode * * @return WL_SUCCESS or WL_FAILURE. */ wl_err_t wl_disable_ps(void); /*! \brief Configure power save parameters. * * @param use_ps_poll Use PS-Poll frames to retrieve buffered data. Any changes * to this parameter will take effect upon next connect * or when power save is enabled through wl_enable_ps(). * Note: To retrieve one buffered packet, the ps poll scheme * needs one ps poll packet to the AP instead of two null * packets in the power management bit scheme. Ps poll avoids * the overhead of traffic monitoring time in active mode as * well. But since each ps poll request can make the AP * release only one buffered packet, it is not the optimal * scheme for applications with heavy downlink traffic. * @param ps_traffic_timeout Timeout in [ms] to wait for more buffered data * from AP. This setting has no effect if * use_ps_poll is 1. Any changes to this parameter * will take effect immediately. * @param ps_delay Power save will de delayed ps_delay [ms] after connecting to * an AP. * @param rx_all_dtim If set to 1, then STA will wake up to listen to every * beacon containing DTIM (delivery traffic indication messages) when * connected. The actual DTIM interval is configured in the AP. * If the DTIM interval, as configured in the AP, is larger than * \a listen_interval, the STA will wakeup according to the * \a listen_interval parameter. * @param listen_interval The Listen Interval field is used to indicate to the * AP how often a STA in power save mode wakes to listen * to beacon frames. The value of this parameter is expressed in units * of Beacon Interval. An AP may use the Listen Interval information in * determining the lifetime of frames that it buffers for a STA. * Any changes to this parameter will take effect upon next association. * * @return WL_SUCCESS or WL_FAILURE. */ wl_err_t wl_conf_ps(uint8_t use_ps_poll, uint32_t ps_traffic_timeout, uint32_t ps_delay, uint8_t rx_all_dtim, uint16_t listen_interval); /*! \brief Get the interface MAC address. * * Return the 802.3 MAC address of the network interface. * * @param buf Output buffer. It must be at least WL_MAC_ADDR_LENGTH * bytes long and only the first WL_MAC_ADDR_LENGTH bytes * will contain valid data. * @return * - WL_FAILURE if the interface is not up. * - WL_SUCCESS */ wl_err_t wl_get_mac_addr(uint8_t* buf); /*! \brief Return the associated network. * * Return the description of the currently associated * network, if any. * * @return The network description, or NULL of the driver * is unconnected. */ struct wl_network_t* wl_get_current_network(void); /*! @} */ /** \defgroup wl_data Data Transfer * * \brief Packet processing interface. * * Note that the examples in this group assumes that the transport library * functions in the \a wl_transport group are being used. For more information, * See the documentation for those functions in the \a wl_transport group. For the IP stack integration you need to intercept received packets so they can be sent up the stack and to transmit packets coming down the stack. By default the wl_api library discards all data packets. To receive them the application must register a rx interrupt service routine (isr) using the \a wl_register_rx_isr() function. \code static void rx_isr(void* ctx) { rx_pending = TRUE; } \endcode Since the rx_isr() function is only called in interrupt context, it is not safe to perform the actual read directly from rx_isr(). If an OS is used, the normal case is to signal a receiver thread to invoke the ip stack read function to read the pending data. In a system that runs without an OS (as in the example), a flag is set to indicate that wl_rx() can be invoked from the ip stack read function next time the ip stack is polled. The beginning of a ip stack read function can look like this \code static void ip_stack_rx_pkt() { char *pkt = malloc(MAX_PKT_SIZE); uint16_t len = MAX_PKT_SIZE; if (p == NULL) { app_error("Out of memory."); return; } wl_rx(pkt, &len); if (0 == len) { app_error("Packet reception failed."); free(pkt); return } } \endcode Since the ip_stack_rx_pkt() function should only be called when there is actually a packet ready to read you do not have to check the return value from \a wl_rx() since it only returns failure if there is no packet ready to read. A packet arriving from the WiFi interface can be either a data packet or a message from the WiFi hardware to the WiFi driver (which is implemented by the wl_api library). This means that wl_api must process every packet to decide if it is an internal message or a data frame that should be passed up to the application. Data packets are prefixed with an extra header containing some administrative information, and may be followed by padding bytes and so wl_api also needs to strip the extra header and any padding before the packet can be safely ingested by the IP stack. All this happens in the function \a wl_process_rx() which \b must be called on every packet received by a call to \a wl_rx(). Continuing the ip_stack_rx_pkt() example \code { char* stripped_pkt; size_t stripped_pkt_len; uint16_t vlan; int status; status = wl_process_rx(pkt, len, &stripped_pkt, &stripped_pkt_len, &vlan); if (WL_ABSORBED == status) { // This is normal. The packet was a // wl_api-internal message. free(pkt); return; } app_ip_stack_input(stripped_pkt, stripped_pkt_len, vlan); free(pkt); } } \endcode If \a wl_process_rx() decides that the packet was a command it processes it and returns \a WL_ABSORBED to signal that the packet should not be used by anyone else. Otherwise stripped_pkt is pointing to the beginning of a 802.3 Ethernet frame of length stripped_pkt_len. If the IP stack supports VLAN and QoS the extra VLAN tag should be passed to the IP stack together with the packet. For IP stacks without this support the VLAN tag contents can safely be ignored, but it must still be filled in by \a wl_process_tx(). To register the receive isr \code wl_register_rx_isr(rx_isr, NULL); \endcode Transmitting data packets happens in a similar way but does not require a callback/isr since the application/IP stack knows when it has packets to send. \code int ip_stack_tx_pkt(char *pkt, size_t len, uint16_t vlan_tag) { int status; char wlan_hdr[WL_HEADER_SIZE]; // The packet must have an Ethernet header if (len < ETHERNET_HEADER_SIZE) { app_error("Invalid packet length"); return 0; } hdr_len = sizeof wlan_hdr; status = wl_process_tx(pkt, ETHERNET_HEADER_SIZE, len, wlan_hdr, vlan_tag, NULL); if ( WL_SUCCESS != status ) { app_error("Packet processing failed"); return 0; } // Transmit the header first if (wl_tx(wlan_hdr, hdr_len) != WL_SUCCESS) { app_error("Header transmission failed"); return 0; } // Then transmit the data packet if (wl_tx(pkt, len) != WL_SUCCESS) { app_error("Packet transmission failed"); return 0; } } \endcode The final piece of the puzzle in the IP stack integration is the MAC address of the WiFi interface \code char mac_addr[WL_MAC_ADDR_LENGTH]; wl_get_mac_addr(mac_addr); ip_stack_set_mac_address(mac_addr); \endcode * @{ */ /*! Size of the wl_api packet header */ #ifdef WFE_6_12 #define WL_HEADER_SIZE 16 #else #define WL_HEADER_SIZE 14 #endif /*! Maximum packet size (including wl_api headers and paddings) * * Maximum packet size is obtained with the following data: * * 1500 bytes of Ethernet payload (MTU) + 14 bytes of Ethernet header + * WL_HEADER_SIZE of wl header. This data is then size-aligned to 16. * */ #define WL_MAX_PKT_LEN 1536 /*! * \brief Process rx packet. * * Processes a raw rx packet by unencrypting it (if necessary) * and stripping headers so as to output a 802.3 frame. * * wl_process_rx() will strip bytes both from the head and from the tail. * * Upon return from wl_process_rx(), the pointer at stripped_pkt will * point to the start of the Ethernet header, hence adjusting the offset * by WL_HEADER_LEN bytes. Any padding (added by the wifi device) will * be removed from the tail of the packet, hence making len smaller. * * The wl_api library of the device will not perform any Ethernet padding * removal. The padding removal performed by wl_process_rx() is only for * the padding used in the protocol shared by the host and the device. * This padding is mainly there to ensure that the host does not have to * deal with rx of odd-sized data buffers (which some DMA's have problems * to handle). * * @param pkt Input buffer (raw packet) * @param pkt_len Length of the input buffer (in bytes) * @param stripped_pkt Pointer to the packet with the * transport header stripped. * @param stripped_pkt_len Length of the stripped packet. * @param vlanid_prio VLAN ID and 802.1p priority value * using following format: *
 *        1
 *  5|432109876543|210
 *  -+------------+---
 *  0|   VLANID   |PRI
 * 
* * @returns * - WL_FAILURE * - WL_ABSORBED if the packet was an internal driver command * and not a proper data packet. The packet should * be freed and the stripped_pkt will not point * to a valid packet. * - WL_SUCCESS */ wl_err_t wl_process_rx(char *pkt, size_t pkt_len, char **stripped_pkt, size_t *stripped_pkt_len, uint16_t *vlanid_prio); /*! \brief Process tx packet. * * Prepare tx packet for transmission. * * This function is typically used only by the TCP/IP stack driver. * * Takes a Ethernet II frame header and generates a message passing header * for it. * * The caller should ensure that any frames injected into wl_process_tx() * are proper Ethernet frames. The wl_api library or the device will not * perform any Ethernet padding if the frames are too short. * * The Ethernet header is assumed to have the following layout : * ... * The rest of the Ethernet header buffer (if any) is ignored. * * A note on the TX packet representation : * If your TX packets are simple contiguous buffers you can ignore * the rest of this note and pass NULL in parameter \a pkt_handle. * A TX packet may have a more complex structure than a RX packet * (which must be a contiguous, flat buffer). The IP stack may * for example represent a packet as a linked list of buffers where * the Ethernet header, the IP header and other headers, are represented * by separate buffers. In some cases, such as when the driver is * running in SoftAP mode, a TX packet has to be copied and queued * internally for later processing and to support this when packets * have a complicated structure a special data access function can * be registered. See \a wl_register_pkt_read_cb() for details. * If you use \a wl_process_tx() with non-simple packets you * should pass a handle to the packet in parameter \a pkt_handle * and register an access function with \a wl_register_pkt_read_cb(). * * @param eth_hdr Input buffer (Ethernet header) * @param eth_hdr_len Input buffer length (must be >= 14) * This is usually the same as pkt_len unless e.g linked list or buffers * chained in other ways are being used. * @param pkt_len Length of the complete data packet (in bytes) * @param hdr Pointer to the header buffer (must be * allocated by the caller). The length of the buffer * must be at least WL_HEADER_SIZE bytes. * @param vlanid_prio VLAN ID and 802.1p priority value * using following format: *
 *        1
 *  5|432109876543|210
 *  -+------------+---
 *  0|   VLANID   |PRI
 * 
* Ignored for legacy association (no WMM) * @param pkt_handle A handle to the complete packet. If this parameter * is NULL then \a eth_hdr is expected to point to the whole packet * in a single contiguous buffer (the default). If a different packet * representation is used this parameter should be a handle to the * complete packet and will be passed unmodified to the data * access function that was registered with \a wl_register_pkt_read_cb(). * * @returns * - WL_FAILURE * - WL_RESOURCES if packet can not be processed at the moment. * The caller must either drop the packet or try * retransmit it later. * - WL_AVAIL if network not available * - WL_SUCCESS if packet is ready for transmission through wl_tx(). */ wl_err_t wl_process_tx(char *eth_hdr, size_t eth_hdr_len, size_t pkt_len, char *hdr, uint16_t vlanid_prio, void *pkt_handle); /*! \brief Get current TX and RX rate used for data transfer * * During transmission and reception of data, the actual rate used will depend * on the signal quality. This function can be used to get the actual rate used * for the last tx and rx data. * * @param tx will hold the tx rate upon successful return. * @param rx will hold the rx rate upon successful return. * * @return * - WL_SUCCESS on success * - WL_FAILURE on failure. */ wl_err_t wl_get_rate(wl_rate_t *tx, wl_rate_t *rx); /*! @} */ /* End wl_data group */ /** \defgroup wl_transport Transport interface * * \brief Low level transport interface. * * These functions access the low level transport driver which makes * the application independent of the actual physical transport * layer (usually SDIO or SPI). * For applications running on an real time kernel or without an operating system, the provided transport library will fit right into the application design. However, when running on a more complex operating system (such as windows or linux) which has its own transport primitivies and components (and probably its own IP stack) it might be preferred to design a custom transport library for that specific environment. Therefore, these transport interface functions are fully optional. * @{ */ #define WL_RX_MIN_PKT_LEN 32 /*! \brief WiFi event callback. * * This function is invoked in interrupt context when there is new data * available from the mac. This function is supplied by the user * of the API. * * This function is typically used only by the TCP/IP stack driver. * * @param ctx A context handle. This handle is passed * untouched to the callback and has the same value * as the context registered with the callback in * wl_register_event_cb(). */ typedef void (*wl_rx_isr_t) (void* ctx); /*! \brief Firmware access function. * * Reads the WiFi firmware image. This function is supplied by * the user of this API since storage for the firmware image is * managed by the application. * * This function should read the specified number of bytes of the * firmware image starting at the specified \a offset. The number of * bytes to read is given in \a len. Upon return, \a buf should point * to a buffer which holds the read data and the number of valid bytes * in \a buf is returned from the call. * * This function will be called repeatedly until the complete firmware * image has been read. * * This function may be called again at any time while the driver is * running to download further pieces of the WiFi firmware image as * needed by the runtime requirements. This will normally only happen * when the driver switches between networks of different kinds such * as from WEP to WPA, or from ESS to IBSS for example. * * For convenience, any time a firmware chunk has been completely * downloaded this function will be called once with the \a buf * parameter set to NULL to indicate that no more data is needed right * now and that any dynamically allocated buffers which holds firmware * data can be freed without much performance impact. * * @param ctx Opaque context pointer as provided to \a wl_init() that will be * passed back to the callback. * @param buf Should be assigned the address of the buffer holding the read * data upon return. This parameter can be NULL which indicates * that there are no further immediately pending accesses. * @param offset Offset in bytes from the start of the firmware image. * Data should be copied into buf starting at \a offset. * @param len The number of bytes to copy into \a buf. * @return The number of bytes copied into buf. This may be smaller than * \len if the implementation of the function so requires. */ typedef size_t (wl_fw_read_cb_t)(void *ctx, const uint8_t **buf, size_t offset, size_t len); /*! \brief Initialize the transport interface and download the WiFi firmware * image to the device. * * This operation will proceed synchronously until the firmware is completely * downloaded. wl_init() should be called after this function has returned to * perform device initialization. * * @param fw_read_cb callback function to invoke during firmware download. * @param ctx Opaque context pointer that will be passed to the callbacks * when they are invoked. This parameter is never * accessed by the API. * @param mode will hold the host attention mode used by the transport layer. * This parameter can be passed directly to \a wl_init(). * * @return * * - WL_CARD_FAILURE if the wl hardware device is not available * - WL_FIRMWARE_INVALID if the firmware obtained through fw_read_cb is * invalid. * - WL_OOM if the necessary memory could not be allocated. */ wl_err_t wl_transport_init(wl_fw_read_cb_t *fw_read_cb, void *ctx, enum wl_host_attention_mode *mode); /*! \brief WiFi driver forward progress function * * This function must be called in polled environments to * ensure forward progress. The call can be made as often as possible from * the main application loop. However, the call will not have any effect unless * there is an interrupt pending from the hardware. * * In interrupt mode, wl_poll() must be called if no interrupt * handler is registered through wl_register_rx_isr(). When an interrupt * handler is registered, it is no longer necessary to invoke wl_poll(). * * Note that this function should not be invoked from interrupt context. * */ void wl_poll(void); /*! \brief Register RX callback * * Register function to be called by the low level transport driver * when a new packet is available or when there is a state change in the * data path. When invoked, any pending data can be fetched by calling wl_rx(). * * This function is typically used only by the TCP/IP stack driver. * Note, the registered function is called in interrupt context. * * @param isr rx interrup handler. * @param ctx Opaque context pointer that is passed unmodified to the * rx_cb callback when it is invoked. * * @return WL_SUCCESS */ wl_err_t wl_register_rx_isr(wl_rx_isr_t isr, void* ctx); /*! \brief Read pending packet * * Read a pending packet from the low level transport driver. * The read packet must be passed to the wl_process_rx() function * for proper driver operation. * * @param buf Buffer to read the packet into. This buffer must be * at least WL_MAX_PKT_LEN bytes long. * @param len Length of buf in bytes. Contains the length of the * read packet in bytes on output. * @return * - WL_FAILURE if no RX packet is pending. * - WL_SUCCESS */ wl_err_t wl_rx(uint8_t* buf, uint16_t* len); /*! \brief Send processed tx packet * * Send a packet to the low level transport driver. * This packet has to have been successfully processed by the * wl_process_tx() function. * * @param buf Buffer to send. * @param len Length of buf in bytes. * * @return * - WL_FAILURE if the interface is not ready to send. * - WL_SUCCESS if the packet was successfully transmitted. */ wl_err_t wl_tx(const uint8_t* buf, uint16_t len); /*! \brief Configure data alignment * * This function can be used if the host SDIO/SPI controller has certain * requirements on the data transfer sizes that can be used on the SDIO/SPI bus. * * If the txsize parameter is non-zero, additional padding data should be added * when performing the low level transfer of data buffer of sizes that are not * a multiple of the size_align parameter. See \ref wl_sdio and \ref wl_spi for * more information. * * @param txsize will configure the size alignment for tx data. * */ void wl_conf_alignment(uint8_t txsize); /*! @} */ /* End wl_transport group */ /** \defgroup wl_custom Custom environment support * * \brief Support for custom environments * * These functions should only be used in cases where the transport library is * not used at all. This usually applies to operating systems and environments * where there already exists a transport layer framework, e.g. linux or * windows. * * Note that the \a wl_poll() function is part of the transport library. Therefore, it should not be used in custom environments. Therefore, it is necessary to implement a custom polling or interrupt based scheme to ensure that any incoming packets are processed by the core. * @{ */ /*! \brief Wakeup callback function. * * Invoked when the WiFi device should wake up from power save mode. * This function should send the proper commands to the device. * * Note that this type should only be used in custom environments, where * the transport library is not used. * * @param ctx Opaque context pointer as provided to \a wl_register_wakeup_cb() * that will be passed back to the callback. * @param wakeup indicates whether wakeup should be set or cleared in the * device. */ typedef void (wl_wakeup_cb_t)(void* ctx, uint8_t wakeup); /*! \brief Register wakeup callback function. * * Register a function that will be invoked when the WiFi device should wake * up from power save mode. * * Note that this function should only be used in custom environments, where * the transport library is not used. * * @param wakeup_cb Will be invoked when the device should wakeup from sleep * mode. * @param ctx Opaque context pointer that will be passed back to the callback. */ void wl_register_wakeup_cb(wl_wakeup_cb_t *wakeup_cb, void *ctx); /*! \brief Management tx callback function. * * Invoked when the a management message should be transmitted to the * WiFi device. This function should ensure that the message is passed through * to the device and should never fail. * * Note that this type should only be used in custom environments, where * the transport library is not used. * * @param ctx Opaque context pointer as provided to \a wl_register_mgmt_tx_cb() * that will be passed back to the callback. * @param buf Points to the buffer which holds the management data, * @param len Size of the buffer. */ typedef void (wl_mgmt_tx_cb_t)(void *ctx, const uint8_t *buf, uint16_t len); /*! \brief Register management tx callback function * * Register a function that will be invoked when a management message should * be transmitted to the device. * * Note that this function should only be used in custom environments, where * the transport library is not used. * * IMPORTANT : In a custom environment without a transport library \a * wl_register_mgmt_tx_cb() \b must have been called * before \a wl_fw_download() is called since \a * wl_fw_download() depends on the \a mgmt_tx_cb() to send * the firmware data to the WiFi chip. * * @param mgmt_tx_cb The callback function to invoke. * @param ctx Opaque context pointer that will be passed back to the callback. */ void wl_register_mgmt_tx_cb(wl_mgmt_tx_cb_t *mgmt_tx_cb, void *ctx); /*! \brief Download the WiFi firmware image to the device. * * This operation will proceed synchronously until the firmware is completely * downloaded. wl_init() should be called after this function has returned to * perform device initialization. This function depends on \a * wl_register_mgmt_tx_cb(). See that function for details. * * @param ctx Opaque context pointer that will be passed to the callbacks * when they are invoked. This parameter is never * accessed by the API. * @param fw_read_cb callback function to invoke during firmware download. * * @return * * - WL_CARD_FAILURE if the wl hardware device is not available * - WL_FIRMWARE_INVALID if the firmware obtained through fw_read_cb is * invalid. * - WL_OOM if the necessary memory could not be allocated. */ wl_err_t wl_fw_download(wl_fw_read_cb_t *fw_read_cb, void *ctx); /*! @} */ /* End wl_custom group */ #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_fw.h ================================================ /* * Programming interface for wl_api. * Copyright (C) 2010 HD Wireless AB * * You should have received a copy of the license along with this library. */ #ifndef WITHOUT_STDINT #include #endif const uint8_t fw_buf[154188] = { 0x10, 0x61, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x10, 0x61, 0x04, 0x00, 0x38, 0x61, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x61, 0x04, 0x00, 0x30, 0x61, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x30, 0x61, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x61, 0x04, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0xee, 0xee, 0xee, 0x18, 0xf0, 0x9f, 0xe5, 0x18, 0xf0, 0x9f, 0xe5, 0x18, 0xf0, 0x9f, 0xe5, 0x18, 0xf0, 0x9f, 0xe5, 0x00, 0x00, 0xa0, 0xe1, 0x18, 0xf0, 0x9f, 0xe5, 0x18, 0xf0, 0x9f, 0xe5, 0x44, 0x00, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x08, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe1, 0x1f, 0x00, 0xc0, 0xe3, 0x13, 0x00, 0x80, 0xe3, 0xc0, 0x00, 0x80, 0xe3, 0x00, 0xf0, 0x2f, 0xe1, 0x1c, 0xf0, 0x9f, 0xe5, 0x3d, 0x02, 0x00, 0xeb, 0x5a, 0x02, 0x00, 0xeb, 0x8d, 0x02, 0x00, 0xeb, 0x01, 0x00, 0x8f, 0xe2, 0x10, 0xff, 0x2f, 0xe1, 0x41, 0xf0, 0xde, 0xfb, 0x01, 0xf0, 0xdc, 0xfd, 0x3c, 0x00, 0x78, 0x00, 0x00, 0x00, 0xfe, 0xe7, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x78, 0x47, 0xc0, 0x46, 0x01, 0x00, 0x00, 0xea, 0x78, 0x47, 0xc0, 0x46, 0x17, 0x00, 0x00, 0xea, 0x8c, 0x11, 0x9f, 0xe5, 0x00, 0x20, 0x91, 0xe5, 0x00, 0x30, 0x0f, 0xe1, 0x84, 0x11, 0x9f, 0xe5, 0xfd, 0x20, 0xa1, 0xe8, 0x80, 0x01, 0x9f, 0xe5, 0x80, 0x21, 0x9f, 0xe5, 0x01, 0x20, 0x42, 0xe0, 0x0d, 0x00, 0x40, 0xe0, 0x3c, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x02, 0x00, 0x50, 0xe1, 0x28, 0x00, 0x00, 0xaa, 0x68, 0x01, 0x9f, 0xe5, 0x0d, 0x00, 0x50, 0xe1, 0x02, 0x00, 0x00, 0xba, 0x04, 0x20, 0x10, 0xe4, 0x04, 0x20, 0x81, 0xe4, 0xfa, 0xff, 0xff, 0xea, 0x58, 0x11, 0x9f, 0xe5, 0x58, 0x01, 0x9f, 0xe5, 0x00, 0x00, 0x81, 0xe5, 0x3c, 0x11, 0x9f, 0xe5, 0x50, 0x01, 0x9f, 0xe5, 0x00, 0x00, 0x81, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, 0x3c, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x48, 0x11, 0x9f, 0xe5, 0x00, 0x00, 0x91, 0xe5, 0x24, 0x11, 0x9f, 0xe5, 0x00, 0x00, 0x81, 0xe5, 0x2c, 0x11, 0x9f, 0xe5, 0x38, 0x01, 0x9f, 0xe5, 0x00, 0x00, 0x81, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, 0x74, 0x02, 0x00, 0xeb, 0x10, 0x01, 0x9f, 0xe5, 0x28, 0x11, 0x9f, 0xe5, 0x04, 0x20, 0x91, 0xe4, 0x04, 0x20, 0x00, 0xe4, 0x04, 0x21, 0x9f, 0xe5, 0x02, 0x00, 0x51, 0xe1, 0x3c, 0x00, 0x2c, 0x01, 0x00, 0x00, 0xfa, 0xff, 0xff, 0x1a, 0xf0, 0x10, 0x9f, 0xe5, 0xfd, 0x20, 0xb1, 0xe8, 0x03, 0xf0, 0x2f, 0xe1, 0xe0, 0x10, 0x9f, 0xe5, 0x00, 0x20, 0x81, 0xe5, 0xe8, 0x10, 0x9f, 0xe5, 0xf4, 0x20, 0x9f, 0xe5, 0x00, 0x20, 0x81, 0xe5, 0x02, 0x10, 0x80, 0xe2, 0x00, 0x00, 0x20, 0xe0, 0x01, 0x00, 0x40, 0xe2, 0x11, 0xff, 0x2f, 0xe1, 0x01, 0x00, 0x8f, 0xe2, 0x10, 0xff, 0x2f, 0xe1, 0x3c, 0x00, 0x68, 0x01, 0x00, 0x00, 0x01, 0xf0, 0x9c, 0xf8, 0x78, 0x47, 0x00, 0x00, 0x01, 0x00, 0x8f, 0xe2, 0x10, 0xff, 0x2f, 0xe1, 0x01, 0xf0, 0x94, 0xf8, 0x78, 0x47, 0x00, 0x00, 0x03, 0x00, 0x2d, 0xe9, 0x00, 0x10, 0x0f, 0xe1, 0x00, 0x10, 0x80, 0xe5, 0xb8, 0x10, 0x9f, 0xe5, 0x04, 0x10, 0x80, 0xe5, 0x00, 0x10, 0xa0, 0xe1, 0x10, 0x00, 0x80, 0xe2, 0xfc, 0x1f, 0xa0, 0xe8, 0x00, 0x20, 0xa0, 0xe1, 0x3c, 0x00, 0xa4, 0x01, 0x00, 0x00, 0x01, 0x30, 0xa0, 0xe1, 0x03, 0x00, 0xbd, 0xe8, 0x08, 0x00, 0x83, 0xe5, 0x0c, 0x10, 0x83, 0xe5, 0xd3, 0x00, 0xa0, 0xe3, 0x00, 0xf0, 0x21, 0xe1, 0x00, 0x60, 0xa2, 0xe8, 0x00, 0x10, 0x4f, 0xe1, 0x04, 0x10, 0x82, 0xe4, 0xd2, 0x00, 0xa0, 0xe3, 0x00, 0xf0, 0x21, 0xe1, 0x00, 0x60, 0xa2, 0xe8, 0x00, 0x10, 0x4f, 0xe1, 0x04, 0x10, 0x82, 0xe4, 0xd1, 0x00, 0xa0, 0xe3, 0x3c, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0xf0, 0x21, 0xe1, 0x00, 0x7f, 0xa2, 0xe8, 0x00, 0x10, 0x4f, 0xe1, 0x04, 0x10, 0x82, 0xe4, 0xd7, 0x00, 0xa0, 0xe3, 0x00, 0xf0, 0x21, 0xe1, 0x00, 0x60, 0xa2, 0xe8, 0x00, 0x10, 0x4f, 0xe1, 0x04, 0x10, 0x82, 0xe4, 0xdb, 0x00, 0xa0, 0xe3, 0x00, 0xf0, 0x21, 0xe1, 0x00, 0x60, 0xa2, 0xe8, 0x00, 0x10, 0x4f, 0xe1, 0x00, 0x10, 0x82, 0xe5, 0x00, 0x00, 0x93, 0xe5, 0x3c, 0x00, 0x1c, 0x02, 0x00, 0x00, 0x00, 0xf0, 0x2f, 0xe1, 0x1e, 0xff, 0x2f, 0xe1, 0x20, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0x20, 0xee, 0x01, 0x00, 0xd8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf0, 0x9f, 0xe5, 0x10, 0x01, 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, 0xee, 0xee, 0xee, 0xee, 0x24, 0x03, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x63, 0x1c, 0x0b, 0x4d, 0x3c, 0x00, 0x58, 0x02, 0x00, 0x00, 0x01, 0xd1, 0x6c, 0x69, 0x10, 0xe0, 0x00, 0xf0, 0x6c, 0xfb, 0x09, 0x48, 0xff, 0xf7, 0x0c, 0xff, 0xec, 0x60, 0x08, 0x4a, 0x51, 0x68, 0x50, 0x68, 0x88, 0x42, 0xfc, 0xd0, 0x02, 0x20, 0x28, 0x70, 0x01, 0x21, 0x8a, 0x20, 0x01, 0xf0, 0x12, 0xf8, 0x20, 0x1c, 0xb0, 0xbd, 0x30, 0x00, 0x07, 0x00, 0x51, 0x02, 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, 0xb0, 0xb5, 0x05, 0x1c, 0x3c, 0x00, 0x94, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0xf0, 0x50, 0xfb, 0x14, 0x48, 0xff, 0xf7, 0xf0, 0xfe, 0x13, 0x49, 0x14, 0x48, 0xc1, 0x60, 0x01, 0x21, 0x13, 0x4a, 0x49, 0x03, 0x91, 0x60, 0x13, 0x49, 0xca, 0x78, 0x08, 0x23, 0x9a, 0x43, 0xca, 0x70, 0xca, 0x78, 0x04, 0x23, 0x1a, 0x43, 0xca, 0x70, 0x6b, 0x1c, 0x0d, 0xd0, 0x0e, 0x4b, 0x5a, 0x68, 0x59, 0x68, 0x91, 0x42, 0xfc, 0xd0, 0xbe, 0x21, 0x3c, 0x00, 0xd0, 0x02, 0x00, 0x00, 0x19, 0x73, 0x19, 0x7a, 0x11, 0x22, 0x91, 0x43, 0x19, 0x72, 0x19, 0x7a, 0xc9, 0x07, 0xfc, 0xd4, 0x02, 0x21, 0x01, 0x70, 0xff, 0xf7, 0xd0, 0xfe, 0x20, 0x1c, 0xb0, 0xbd, 0x91, 0x02, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x30, 0x00, 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x84, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x08, 0x47, 0x10, 0x47, 0x18, 0x47, 0x20, 0x47, 0x28, 0x47, 0x30, 0x47, 0x38, 0x47, 0x10, 0xb5, 0x04, 0x1c, 0x10, 0x1c, 0x00, 0xf0, 0x23, 0xf9, 0x03, 0xc4, 0x10, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x3c, 0x00, 0xfc, 0x03, 0x00, 0x00, 0x10, 0xb4, 0x04, 0x2a, 0x0e, 0xd3, 0x03, 0x1c, 0x0b, 0x43, 0x9b, 0x07, 0x0a, 0xd1, 0x08, 0xc8, 0x10, 0xc9, 0xa3, 0x42, 0x02, 0xd1, 0x04, 0x3a, 0x04, 0x2a, 0xf8, 0xd2, 0xa3, 0x42, 0x01, 0xd0, 0x04, 0x38, 0x04, 0x39, 0x00, 0x2a, 0x02, 0xd1, 0x00, 0x20, 0x10, 0xbc, 0x70, 0x47, 0xd3, 0x07, 0x01, 0xd5, 0x01, 0x32, 0x05, 0xe0, 0x03, 0x78, 0x0c, 0x78, 0x01, 0x31, 0x3c, 0x00, 0x38, 0x04, 0x00, 0x00, 0x01, 0x30, 0xa3, 0x42, 0x07, 0xd1, 0x03, 0x78, 0x0c, 0x78, 0x01, 0x31, 0x01, 0x30, 0xa3, 0x42, 0x01, 0xd1, 0x02, 0x3a, 0xf1, 0xd1, 0x18, 0x1b, 0xe9, 0xe7, 0x00, 0x00, 0x78, 0x47, 0x00, 0x00, 0x00, 0x20, 0xa0, 0xe3, 0x04, 0x00, 0x51, 0xe3, 0x08, 0x00, 0x00, 0x3a, 0x03, 0xc0, 0x10, 0xe2, 0x0d, 0x00, 0x00, 0x0a, 0x04, 0xc0, 0x6c, 0xe2, 0x02, 0x00, 0x5c, 0xe3, 0x3c, 0x00, 0x74, 0x04, 0x00, 0x00, 0x01, 0x20, 0xc0, 0xe4, 0x01, 0x20, 0xc0, 0xa4, 0x01, 0x20, 0xc0, 0xc4, 0x0c, 0x10, 0x41, 0xe0, 0x06, 0x00, 0x00, 0xea, 0x81, 0xcf, 0xb0, 0xe1, 0x01, 0x20, 0xc0, 0x24, 0x01, 0x20, 0xc0, 0x24, 0x01, 0x20, 0xc0, 0x44, 0x1e, 0xff, 0x2f, 0xe1, 0x78, 0x47, 0x00, 0x00, 0x00, 0x20, 0xa0, 0xe3, 0x00, 0x40, 0x2d, 0xe9, 0x02, 0x30, 0xa0, 0xe1, 0x02, 0xc0, 0xa0, 0xe1, 0x3c, 0x00, 0xb0, 0x04, 0x00, 0x00, 0x02, 0xe0, 0xa0, 0xe1, 0x20, 0x10, 0x51, 0xe2, 0x0c, 0x50, 0xa0, 0x28, 0x0c, 0x50, 0xa0, 0x28, 0x20, 0x10, 0x51, 0x22, 0xfb, 0xff, 0xff, 0x2a, 0x01, 0x1e, 0xb0, 0xe1, 0x0c, 0x50, 0xa0, 0x28, 0x0c, 0x00, 0xa0, 0x48, 0x00, 0x40, 0xbd, 0xe8, 0x01, 0x11, 0xb0, 0xe1, 0x04, 0x20, 0x80, 0x24, 0x1e, 0xff, 0x2f, 0x01, 0x01, 0x20, 0xc0, 0x44, 0x01, 0x20, 0xc0, 0x44, 0x3c, 0x00, 0xec, 0x04, 0x00, 0x00, 0x40, 0x04, 0x11, 0xe3, 0x01, 0x20, 0xc0, 0x14, 0x1e, 0xff, 0x2f, 0xe1, 0x78, 0x47, 0x00, 0x00, 0x03, 0x00, 0x52, 0xe3, 0x3e, 0x00, 0x00, 0x9a, 0x03, 0xc0, 0x10, 0xe2, 0x08, 0x00, 0x00, 0x0a, 0x01, 0x30, 0xd1, 0xe4, 0x02, 0x00, 0x5c, 0xe3, 0x0c, 0x20, 0x82, 0xe0, 0x01, 0xc0, 0xd1, 0x94, 0x01, 0x30, 0xc0, 0xe4, 0x01, 0x30, 0xd1, 0x34, 0x04, 0x20, 0x42, 0xe2, 0x3c, 0x00, 0x28, 0x05, 0x00, 0x00, 0x01, 0xc0, 0xc0, 0x94, 0x01, 0x30, 0xc0, 0x34, 0x03, 0x30, 0x11, 0xe2, 0x1e, 0x00, 0x00, 0x0a, 0x04, 0x20, 0x52, 0xe2, 0x2f, 0x00, 0x00, 0x3a, 0x03, 0xc0, 0x31, 0xe7, 0x02, 0x00, 0x53, 0xe3, 0x08, 0x00, 0x00, 0x0a, 0x0f, 0x00, 0x00, 0x8a, 0x2c, 0x34, 0xa0, 0xe1, 0x04, 0xc0, 0xb1, 0xe5, 0x04, 0x20, 0x52, 0xe2, 0x0c, 0x3c, 0x83, 0xe1, 0x04, 0x30, 0x80, 0xe4, 0x3c, 0x00, 0x64, 0x05, 0x00, 0x00, 0xf9, 0xff, 0xff, 0x2a, 0x01, 0x10, 0x81, 0xe2, 0x23, 0x00, 0x00, 0xea, 0x2c, 0x38, 0xa0, 0xe1, 0x04, 0xc0, 0xb1, 0xe5, 0x04, 0x20, 0x52, 0xe2, 0x0c, 0x38, 0x83, 0xe1, 0x04, 0x30, 0x80, 0xe4, 0xf9, 0xff, 0xff, 0x2a, 0x02, 0x10, 0x81, 0xe2, 0x1b, 0x00, 0x00, 0xea, 0x2c, 0x3c, 0xa0, 0xe1, 0x04, 0xc0, 0xb1, 0xe5, 0x04, 0x20, 0x52, 0xe2, 0x0c, 0x34, 0x83, 0xe1, 0x3c, 0x00, 0xa0, 0x05, 0x00, 0x00, 0x04, 0x30, 0x80, 0xe4, 0xf9, 0xff, 0xff, 0x2a, 0x03, 0x10, 0x81, 0xe2, 0x13, 0x00, 0x00, 0xea, 0x78, 0x47, 0x00, 0x00, 0x10, 0x40, 0x2d, 0xe9, 0x20, 0x20, 0x52, 0xe2, 0x05, 0x00, 0x00, 0x3a, 0x18, 0x50, 0xb1, 0x28, 0x18, 0x50, 0xa0, 0x28, 0x18, 0x50, 0xb1, 0x28, 0x18, 0x50, 0xa0, 0x28, 0x20, 0x20, 0x52, 0x22, 0xf9, 0xff, 0xff, 0x2a, 0x02, 0xce, 0xb0, 0xe1, 0x3c, 0x00, 0xdc, 0x05, 0x00, 0x00, 0x18, 0x50, 0xb1, 0x28, 0x18, 0x50, 0xa0, 0x28, 0x18, 0x00, 0xb1, 0x48, 0x18, 0x00, 0xa0, 0x48, 0x10, 0x40, 0xbd, 0xe8, 0x02, 0xcf, 0xb0, 0xe1, 0x04, 0x30, 0x91, 0x24, 0x04, 0x30, 0x80, 0x24, 0x1e, 0xff, 0x2f, 0x01, 0x82, 0x2f, 0xb0, 0xe1, 0x01, 0x20, 0xd1, 0x44, 0x01, 0x30, 0xd1, 0x24, 0x01, 0xc0, 0xd1, 0x24, 0x01, 0x20, 0xc0, 0x44, 0x01, 0x30, 0xc0, 0x24, 0x3c, 0x00, 0x18, 0x06, 0x00, 0x00, 0x01, 0xc0, 0xc0, 0x24, 0x1e, 0xff, 0x2f, 0xe1, 0x78, 0x47, 0x00, 0x00, 0xff, 0x30, 0x01, 0xe2, 0x02, 0x10, 0xa0, 0xe1, 0x03, 0x24, 0x83, 0xe1, 0x02, 0x28, 0x82, 0xe1, 0x88, 0xff, 0xff, 0xea, 0x78, 0x47, 0x00, 0x00, 0x80, 0x24, 0x10, 0xe2, 0x00, 0x00, 0x60, 0x42, 0x41, 0x30, 0x32, 0xe0, 0x00, 0x10, 0x61, 0x22, 0xa1, 0xc1, 0x70, 0xe0, 0x20, 0x00, 0x00, 0x3a, 0x3c, 0x00, 0x54, 0x06, 0x00, 0x00, 0x21, 0xc4, 0x70, 0xe0, 0x0f, 0x00, 0x00, 0x3a, 0x00, 0x04, 0xa0, 0xe1, 0xff, 0x24, 0x82, 0xe3, 0x21, 0xc2, 0x70, 0xe0, 0x17, 0x00, 0x00, 0x3a, 0x21, 0xc4, 0x70, 0xe0, 0x09, 0x00, 0x00, 0x3a, 0x00, 0x04, 0xa0, 0xe1, 0xff, 0x28, 0x82, 0xe3, 0x21, 0xc4, 0x70, 0xe0, 0x00, 0x04, 0xa0, 0x21, 0xff, 0x2c, 0x82, 0x23, 0x21, 0xc2, 0x70, 0xe0, 0x0e, 0x00, 0x00, 0x3a, 0x3c, 0x00, 0x90, 0x06, 0x00, 0x00, 0x00, 0xc0, 0x70, 0xe2, 0x83, 0x00, 0x00, 0x2a, 0x20, 0x04, 0xa0, 0x21, 0xa1, 0xc3, 0x70, 0xe0, 0x80, 0x13, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x21, 0xc3, 0x70, 0xe0, 0x00, 0x13, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0xa1, 0xc2, 0x70, 0xe0, 0x80, 0x12, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x21, 0xc2, 0x70, 0xe0, 0x00, 0x12, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x3c, 0x00, 0xcc, 0x06, 0x00, 0x00, 0xa1, 0xc1, 0x70, 0xe0, 0x80, 0x11, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x21, 0xc1, 0x70, 0xe0, 0x00, 0x11, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0xa1, 0xc0, 0x70, 0xe0, 0x80, 0x10, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x01, 0xc0, 0x70, 0xe0, 0x00, 0x10, 0x41, 0x20, 0x02, 0x20, 0xb2, 0xe0, 0xe5, 0xff, 0xff, 0x2a, 0xc3, 0x0f, 0x32, 0xe0, 0xa3, 0x0f, 0x80, 0xe0, 0x3c, 0x00, 0x08, 0x07, 0x00, 0x00, 0x00, 0x10, 0x61, 0x22, 0x1e, 0xff, 0x2f, 0xe1, 0x78, 0x47, 0x00, 0x00, 0x00, 0x20, 0xa0, 0xe3, 0xa1, 0xc1, 0x70, 0xe0, 0x20, 0x00, 0x00, 0x3a, 0x21, 0xc4, 0x70, 0xe0, 0x0f, 0x00, 0x00, 0x3a, 0x00, 0x04, 0xa0, 0xe1, 0xff, 0x24, 0x82, 0xe3, 0x21, 0xc2, 0x70, 0xe0, 0x17, 0x00, 0x00, 0x3a, 0x21, 0xc4, 0x70, 0xe0, 0x09, 0x00, 0x00, 0x3a, 0x00, 0x04, 0xa0, 0xe1, 0x3c, 0x00, 0x44, 0x07, 0x00, 0x00, 0xff, 0x28, 0x82, 0xe3, 0x21, 0xc4, 0x70, 0xe0, 0x00, 0x04, 0xa0, 0x21, 0xff, 0x2c, 0x82, 0x23, 0x21, 0xc2, 0x70, 0xe0, 0x0e, 0x00, 0x00, 0x3a, 0x00, 0xc0, 0x70, 0xe2, 0x50, 0x00, 0x00, 0x2a, 0x20, 0x04, 0xa0, 0x21, 0xa1, 0xc3, 0x70, 0xe0, 0x80, 0x13, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x21, 0xc3, 0x70, 0xe0, 0x00, 0x13, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x3c, 0x00, 0x80, 0x07, 0x00, 0x00, 0xa1, 0xc2, 0x70, 0xe0, 0x80, 0x12, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x21, 0xc2, 0x70, 0xe0, 0x00, 0x12, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0xa1, 0xc1, 0x70, 0xe0, 0x80, 0x11, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x21, 0xc1, 0x70, 0xe0, 0x00, 0x11, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0xa1, 0xc0, 0x70, 0xe0, 0x80, 0x10, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x3c, 0x00, 0xbc, 0x07, 0x00, 0x00, 0x01, 0xc0, 0x70, 0xe0, 0x00, 0x10, 0x41, 0x20, 0x02, 0x20, 0xb2, 0xe0, 0xe5, 0xff, 0xff, 0x2a, 0x02, 0x00, 0xa0, 0xe1, 0x1e, 0xff, 0x2f, 0xe1, 0x78, 0x47, 0x00, 0x00, 0x0a, 0x10, 0x40, 0xe2, 0x20, 0x01, 0x40, 0xe0, 0x20, 0x02, 0x80, 0xe0, 0x20, 0x04, 0x80, 0xe0, 0x20, 0x08, 0x80, 0xe0, 0xa0, 0x01, 0xa0, 0xe1, 0x00, 0x21, 0x80, 0xe0, 0x82, 0x10, 0x51, 0xe0, 0x3c, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x01, 0x00, 0x80, 0x52, 0x0a, 0x10, 0x81, 0x42, 0x1e, 0xff, 0x2f, 0xe1, 0x30, 0xb4, 0x44, 0x1c, 0x81, 0x07, 0x08, 0xd0, 0x01, 0x78, 0x01, 0x30, 0x00, 0x29, 0x02, 0xd1, 0x00, 0x1b, 0x30, 0xbc, 0x70, 0x47, 0x81, 0x07, 0xf6, 0xd1, 0x0b, 0x4a, 0xd5, 0x01, 0x02, 0xc8, 0x8b, 0x1a, 0x8b, 0x43, 0x2b, 0x40, 0xfa, 0xd0, 0x00, 0x1b, 0x0a, 0x06, 0x01, 0xd1, 0x03, 0x38, 0x3c, 0x00, 0x34, 0x08, 0x00, 0x00, 0xef, 0xe7, 0x0a, 0x04, 0x12, 0x0e, 0x01, 0xd1, 0x02, 0x38, 0xea, 0xe7, 0x09, 0x02, 0x09, 0x0e, 0xe7, 0xd1, 0x01, 0x38, 0xe5, 0xe7, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0xf0, 0xb4, 0x03, 0x1c, 0x04, 0x1c, 0x0c, 0x43, 0xa4, 0x07, 0x0c, 0xd1, 0x10, 0x4d, 0xef, 0x01, 0x02, 0xe0, 0x04, 0x31, 0x04, 0x3a, 0x10, 0xc3, 0x04, 0x2a, 0x04, 0xd3, 0x0c, 0x68, 0x66, 0x1b, 0x3c, 0x00, 0x70, 0x08, 0x00, 0x00, 0xa6, 0x43, 0x3e, 0x40, 0xf5, 0xd0, 0x00, 0x2a, 0x07, 0xd0, 0x0c, 0x78, 0x01, 0x31, 0x1c, 0x70, 0x01, 0x33, 0x00, 0x2c, 0x03, 0xd0, 0x01, 0x3a, 0xf7, 0xd1, 0xf0, 0xbc, 0x70, 0x47, 0x01, 0x2a, 0xfb, 0xd9, 0x51, 0x1e, 0x00, 0x22, 0x1a, 0x70, 0x01, 0x33, 0x01, 0x39, 0xfb, 0xd1, 0xf4, 0xe7, 0x01, 0x01, 0x01, 0x01, 0x78, 0x47, 0x00, 0x00, 0x02, 0x00, 0xa0, 0xe3, 0x3c, 0x00, 0xac, 0x08, 0x00, 0x00, 0x02, 0x10, 0xa0, 0xe3, 0x2e, 0xfe, 0xff, 0xea, 0x1f, 0x40, 0x2d, 0xe9, 0x00, 0x00, 0x0f, 0xe1, 0xc0, 0x00, 0x80, 0xe3, 0x00, 0xf0, 0x2f, 0xe1, 0x81, 0x00, 0xa0, 0xe3, 0x02, 0x10, 0xa0, 0xe3, 0x01, 0x20, 0x8f, 0xe2, 0x12, 0xff, 0x2f, 0xe1, 0x00, 0xf0, 0xe6, 0xfc, 0x78, 0x47, 0x00, 0x00, 0x1f, 0x40, 0xbd, 0xe8, 0xfe, 0xff, 0xff, 0xea, 0x1f, 0x50, 0x2d, 0xe9, 0x3c, 0x00, 0xe8, 0x08, 0x00, 0x00, 0x01, 0x00, 0x8f, 0xe2, 0x10, 0xff, 0x2f, 0xe1, 0x00, 0xf0, 0x40, 0xfb, 0x78, 0x47, 0x00, 0x00, 0x1f, 0x50, 0xbd, 0xe8, 0x04, 0xf0, 0x5e, 0xe2, 0x1f, 0x50, 0x2d, 0xe9, 0x01, 0x00, 0x8f, 0xe2, 0x10, 0xff, 0x2f, 0xe1, 0x00, 0xf0, 0x18, 0xfb, 0x78, 0x47, 0x00, 0x00, 0x1f, 0x50, 0xbd, 0xe8, 0x04, 0xf0, 0x5e, 0xe2, 0x00, 0xbd, 0x01, 0xb5, 0x00, 0xa0, 0x00, 0x47, 0x3c, 0x00, 0x24, 0x09, 0x00, 0x00, 0x00, 0x30, 0x0f, 0xe1, 0xc0, 0x30, 0xc3, 0xe3, 0x03, 0xf0, 0x21, 0xe1, 0x01, 0x00, 0x8f, 0xe2, 0x10, 0xff, 0x2f, 0xe1, 0x01, 0xbd, 0x01, 0xb5, 0x00, 0xa0, 0x00, 0x47, 0x00, 0x30, 0x0f, 0xe1, 0xc0, 0x30, 0x83, 0xe3, 0x03, 0xf0, 0x21, 0xe1, 0x01, 0x00, 0x8f, 0xe2, 0x10, 0xff, 0x2f, 0xe1, 0x01, 0xbd, 0x00, 0x00, 0x18, 0x00, 0x9f, 0xe5, 0x04, 0x10, 0x90, 0xe4, 0x3c, 0x00, 0x60, 0x09, 0x00, 0x00, 0x00, 0x00, 0x51, 0xe3, 0x02, 0x00, 0x00, 0x0a, 0x04, 0x20, 0x90, 0xe4, 0x00, 0x20, 0x81, 0xe5, 0xf9, 0xff, 0xff, 0xea, 0x0e, 0xf0, 0xa0, 0xe1, 0x7c, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0xd8, 0x03, 0x00, 0x00, 0xd8, 0x03, 0x00, 0x00, 0xd8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x09, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x10, 0x8e, 0x01, 0x00, 0x10, 0x8e, 0x01, 0x00, 0x88, 0xf8, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0xc4, 0x33, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x50, 0xa0, 0xe1, 0x58, 0x40, 0x9f, 0xe5, 0x3c, 0x00, 0xd8, 0x09, 0x00, 0x00, 0x04, 0x00, 0x94, 0xe4, 0x01, 0x00, 0x50, 0xe3, 0x05, 0xf0, 0xa0, 0x01, 0x04, 0x10, 0x94, 0xe4, 0x04, 0x20, 0x94, 0xe4, 0x03, 0x00, 0x00, 0xeb, 0x04, 0x00, 0x94, 0xe4, 0x04, 0x10, 0x94, 0xe4, 0x07, 0x00, 0x00, 0xeb, 0xf5, 0xff, 0xff, 0xea, 0x01, 0x00, 0x50, 0xe1, 0x0e, 0xf0, 0xa0, 0x01, 0x02, 0x00, 0x51, 0xe1, 0x04, 0x30, 0x90, 0x14, 0x04, 0x30, 0x81, 0x14, 0x3c, 0x00, 0x14, 0x0a, 0x00, 0x00, 0xfb, 0xff, 0xff, 0x1a, 0x0e, 0xf0, 0xa0, 0xe1, 0x14, 0x20, 0x9f, 0xe5, 0x00, 0x20, 0x92, 0xe5, 0x01, 0x00, 0x50, 0xe1, 0x04, 0x20, 0x80, 0x14, 0xfc, 0xff, 0xff, 0x1a, 0x0e, 0xf0, 0xa0, 0xe1, 0x80, 0x09, 0x00, 0x00, 0xcc, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0xe6, 0x01, 0x00, 0x13, 0x00, 0x00, 0x00, 0x53, 0x56, 0x43, 0x5f, 0x00, 0x04, 0x00, 0x00, 0x3c, 0x00, 0x50, 0x0a, 0x00, 0x00, 0x20, 0xee, 0x01, 0x00, 0x12, 0x00, 0x00, 0x00, 0x49, 0x52, 0x51, 0x5f, 0x00, 0x02, 0x00, 0x00, 0x20, 0xf2, 0x01, 0x00, 0x11, 0x00, 0x00, 0x00, 0x46, 0x49, 0x51, 0x5f, 0x80, 0x00, 0x00, 0x00, 0x20, 0xf4, 0x01, 0x00, 0x17, 0x00, 0x00, 0x00, 0x41, 0x42, 0x54, 0x5f, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xf4, 0x01, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x55, 0x4e, 0x44, 0x5f, 0x3c, 0x00, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xf4, 0x01, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x55, 0x53, 0x52, 0x5f, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x50, 0xa0, 0xe1, 0x00, 0x60, 0x0f, 0xe1, 0x8c, 0x40, 0x9f, 0xe5, 0x04, 0x10, 0x94, 0xe4, 0x01, 0x00, 0x51, 0xe3, 0x09, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x94, 0xe4, 0x01, 0x10, 0x80, 0xe0, 0x03, 0x10, 0xc1, 0xe3, 0x04, 0x20, 0x94, 0xe4, 0x3c, 0x00, 0xc8, 0x0a, 0x00, 0x00, 0xc0, 0x20, 0x82, 0xe3, 0x02, 0xf0, 0x2f, 0xe1, 0x04, 0xd0, 0x41, 0xe2, 0x04, 0x20, 0x94, 0xe4, 0x13, 0x00, 0x00, 0xeb, 0xf2, 0xff, 0xff, 0xea, 0x06, 0xf0, 0x2f, 0xe1, 0x05, 0xf0, 0xa0, 0xe1, 0x0e, 0x50, 0xa0, 0xe1, 0x00, 0x60, 0x0f, 0xe1, 0x44, 0x40, 0x9f, 0xe5, 0x04, 0x10, 0x94, 0xe4, 0x01, 0x00, 0x51, 0xe3, 0x08, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x94, 0xe4, 0x3c, 0x00, 0x04, 0x0b, 0x00, 0x00, 0x01, 0x10, 0x80, 0xe0, 0x03, 0x10, 0xc1, 0xe3, 0x04, 0x20, 0x94, 0xe4, 0xc0, 0x20, 0x82, 0xe3, 0x02, 0xf0, 0x2f, 0xe1, 0x04, 0xd0, 0x41, 0xe2, 0x04, 0x20, 0x94, 0xe4, 0xf3, 0xff, 0xff, 0xea, 0x06, 0xf0, 0x2f, 0xe1, 0x05, 0xf0, 0xa0, 0xe1, 0x01, 0x00, 0x50, 0xe1, 0x04, 0x20, 0x80, 0x14, 0xfc, 0xff, 0xff, 0x1a, 0x0e, 0xf0, 0xa0, 0xe1, 0x3c, 0x0a, 0x00, 0x00, 0x3c, 0x00, 0x40, 0x0b, 0x00, 0x00, 0x01, 0x60, 0xc0, 0x46, 0xc0, 0x46, 0xc0, 0x46, 0x70, 0x47, 0x00, 0x00, 0x10, 0x1e, 0x10, 0xee, 0x02, 0x00, 0x11, 0xe3, 0xfc, 0xff, 0xff, 0x1a, 0x10, 0x0e, 0x01, 0xee, 0x10, 0x1e, 0x10, 0xee, 0x02, 0x00, 0x11, 0xe3, 0xfc, 0xff, 0xff, 0x1a, 0x1e, 0xff, 0x2f, 0xe1, 0x10, 0x1e, 0x10, 0xee, 0x01, 0x00, 0x11, 0xe3, 0x03, 0x00, 0x00, 0x0a, 0x10, 0x1e, 0x11, 0xee, 0x3c, 0x00, 0x7c, 0x0b, 0x00, 0x00, 0x00, 0x10, 0x80, 0xe5, 0x01, 0x00, 0xa0, 0xe3, 0x1e, 0xff, 0x2f, 0xe1, 0x00, 0x00, 0x20, 0xe0, 0x1e, 0xff, 0x2f, 0xe1, 0x8d, 0x46, 0x97, 0x46, 0x78, 0x47, 0xc0, 0x46, 0x78, 0xfd, 0xff, 0xea, 0x10, 0xb5, 0x04, 0x1c, 0x03, 0x28, 0x01, 0xd9, 0x00, 0xf0, 0xac, 0xfb, 0x0c, 0x48, 0x40, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x03, 0x24, 0x0b, 0x48, 0x01, 0x68, 0x09, 0x48, 0x3c, 0x00, 0xb8, 0x0b, 0x00, 0x00, 0x12, 0x30, 0x00, 0x29, 0x05, 0xd0, 0x06, 0x21, 0x61, 0x43, 0x40, 0x5c, 0xc3, 0x00, 0x18, 0x18, 0x04, 0xe0, 0x06, 0x21, 0x61, 0x43, 0x40, 0x5c, 0x14, 0x23, 0x58, 0x43, 0x0a, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x10, 0xbd, 0xd4, 0x7a, 0x01, 0x00, 0xa8, 0x69, 0x01, 0x00, 0x80, 0xb5, 0x09, 0x4a, 0x09, 0x49, 0x03, 0x20, 0x00, 0xf0, 0xf2, 0xf9, 0x08, 0x49, 0x08, 0x20, 0x3c, 0x00, 0xf4, 0x0b, 0x00, 0x00, 0x08, 0x60, 0x48, 0x60, 0x07, 0x49, 0x1d, 0x20, 0x01, 0xf0, 0xb2, 0xfc, 0x06, 0x49, 0x1e, 0x20, 0x01, 0xf0, 0xae, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x6c, 0x01, 0x00, 0x31, 0x27, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x29, 0x25, 0x00, 0x00, 0x31, 0x25, 0x00, 0x00, 0x05, 0x49, 0x80, 0xb5, 0x08, 0x20, 0x88, 0x60, 0x1d, 0x20, 0x01, 0xf0, 0xbf, 0xfc, 0x1e, 0x20, 0x3c, 0x00, 0x30, 0x0c, 0x00, 0x00, 0x01, 0xf0, 0xbc, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x02, 0x1c, 0x08, 0x1c, 0xd1, 0x2a, 0x80, 0xb5, 0x01, 0xd1, 0x05, 0xf0, 0x19, 0xfc, 0x80, 0xbd, 0x03, 0x49, 0x80, 0xb5, 0x00, 0x20, 0x08, 0x80, 0x05, 0x20, 0x05, 0xf0, 0xd5, 0xfb, 0x80, 0xbd, 0xb0, 0x74, 0x01, 0x00, 0x80, 0xb5, 0x54, 0x28, 0x01, 0xd1, 0x06, 0xf0, 0xcd, 0xf8, 0x80, 0xbd, 0x3c, 0x00, 0x6c, 0x0c, 0x00, 0x00, 0xb0, 0xb5, 0x10, 0x4d, 0x02, 0x1c, 0x01, 0x24, 0x01, 0x2a, 0x0d, 0x48, 0x29, 0x68, 0x06, 0xd0, 0xc4, 0x2a, 0x03, 0xd1, 0x6a, 0x68, 0x00, 0x2a, 0x05, 0xd0, 0xac, 0x60, 0xb0, 0xbd, 0x0e, 0xf0, 0x89, 0xfb, 0x6c, 0x60, 0x08, 0xe0, 0x00, 0x22, 0xaa, 0x60, 0x6c, 0x60, 0x0e, 0xf0, 0x82, 0xfb, 0x00, 0x21, 0x04, 0x20, 0x12, 0xf0, 0xc8, 0xfc, 0x06, 0xf0, 0xd8, 0xf8, 0x3c, 0x00, 0xa8, 0x0c, 0x00, 0x00, 0xb0, 0xbd, 0x00, 0x00, 0xc4, 0x60, 0x01, 0x00, 0xbc, 0x74, 0x01, 0x00, 0x05, 0x4a, 0x51, 0x69, 0x08, 0x1a, 0x11, 0x69, 0x09, 0x68, 0x10, 0x31, 0x81, 0x42, 0x01, 0xd8, 0x50, 0x61, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x8c, 0x6e, 0x01, 0x00, 0x01, 0x49, 0x49, 0x68, 0x40, 0x1a, 0x70, 0x47, 0x8c, 0x6e, 0x01, 0x00, 0x01, 0x48, 0x40, 0x69, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0x0c, 0x00, 0x00, 0x8c, 0x6e, 0x01, 0x00, 0x02, 0x4a, 0x51, 0x69, 0x08, 0x18, 0x50, 0x61, 0x70, 0x47, 0x00, 0x00, 0x8c, 0x6e, 0x01, 0x00, 0x0e, 0x49, 0x0f, 0x48, 0x10, 0xb5, 0x19, 0x22, 0x92, 0x01, 0x41, 0x60, 0x89, 0x18, 0xc1, 0x60, 0x0b, 0x49, 0x00, 0x22, 0x0c, 0x31, 0x01, 0x60, 0x0a, 0x49, 0x82, 0x60, 0x09, 0x68, 0x01, 0x23, 0xdb, 0x03, 0xc9, 0x18, 0x08, 0x4c, 0x41, 0x61, 0x3c, 0x00, 0x20, 0x0d, 0x00, 0x00, 0x21, 0x68, 0x00, 0x29, 0x02, 0xd0, 0x07, 0x49, 0x01, 0x61, 0x01, 0xe0, 0x00, 0xf0, 0x0c, 0xf8, 0x22, 0x60, 0x10, 0xbd, 0x44, 0xdc, 0x01, 0x00, 0x8c, 0x6e, 0x01, 0x00, 0xc8, 0x09, 0x00, 0x00, 0x34, 0x58, 0x01, 0x00, 0xc4, 0x09, 0x00, 0x00, 0x01, 0x48, 0x02, 0x49, 0x08, 0x61, 0x70, 0x47, 0xc8, 0x09, 0x00, 0x00, 0x8c, 0x6e, 0x01, 0x00, 0x08, 0x28, 0x05, 0xd2, 0x3c, 0x00, 0x5c, 0x0d, 0x00, 0x00, 0x03, 0x4b, 0x80, 0x00, 0x19, 0x50, 0x02, 0x49, 0x20, 0x31, 0x0a, 0x50, 0x70, 0x47, 0x00, 0x00, 0x64, 0x6d, 0x01, 0x00, 0x70, 0xb5, 0x06, 0x1c, 0x0d, 0x48, 0x0d, 0x1c, 0x00, 0x68, 0x14, 0x1c, 0x00, 0x28, 0x03, 0xd1, 0x20, 0x1c, 0x00, 0xf0, 0x09, 0xfc, 0x70, 0xbd, 0x28, 0x06, 0x01, 0xd5, 0x00, 0xf0, 0x22, 0xfe, 0x22, 0x1c, 0x29, 0x1c, 0x30, 0x1c, 0x08, 0xf0, 0x3c, 0x00, 0x98, 0x0d, 0x00, 0x00, 0xdd, 0xfd, 0x01, 0x1c, 0x03, 0x48, 0x54, 0x30, 0x43, 0x69, 0x32, 0x1c, 0xff, 0xf7, 0x1b, 0xfb, 0x70, 0xbd, 0x00, 0x00, 0x50, 0x6d, 0x01, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x0d, 0x48, 0x1f, 0x1c, 0x00, 0x68, 0x15, 0x1c, 0x0c, 0x1c, 0x00, 0x28, 0x02, 0xd1, 0x28, 0x1c, 0x00, 0xf0, 0xe8, 0xfb, 0x20, 0x06, 0x01, 0xd5, 0x00, 0xf0, 0x02, 0xfe, 0x2a, 0x1c, 0x21, 0x1c, 0x3c, 0x00, 0xd4, 0x0d, 0x00, 0x00, 0x30, 0x1c, 0x08, 0xf0, 0xbd, 0xfd, 0x01, 0x1c, 0x03, 0x48, 0x54, 0x30, 0x43, 0x69, 0x3a, 0x1c, 0xff, 0xf7, 0xfb, 0xfa, 0xf8, 0xbd, 0x00, 0x00, 0x50, 0x6d, 0x01, 0x00, 0xf8, 0xb5, 0xf1, 0x28, 0x4e, 0xd1, 0x2a, 0x48, 0x69, 0x46, 0x82, 0x69, 0xff, 0xf7, 0xee, 0xfa, 0x27, 0x49, 0x00, 0x26, 0x54, 0x39, 0xc8, 0x68, 0x8b, 0x68, 0xc2, 0x00, 0x01, 0x30, 0xd5, 0x18, 0x3c, 0x00, 0x10, 0x0e, 0x00, 0x00, 0x07, 0x28, 0xc8, 0x60, 0x00, 0xd1, 0xce, 0x60, 0x22, 0x48, 0x6c, 0x68, 0x00, 0x68, 0x00, 0x28, 0x03, 0xd0, 0x00, 0x21, 0x20, 0x1c, 0x08, 0xf0, 0x3b, 0xfb, 0x6e, 0x60, 0x25, 0x68, 0x20, 0x89, 0xa9, 0x78, 0x02, 0x39, 0x40, 0x1a, 0xe9, 0x78, 0x40, 0x1a, 0x20, 0x81, 0xa8, 0x78, 0x28, 0x18, 0x02, 0x38, 0x20, 0x60, 0x6e, 0x78, 0x28, 0x78, 0x08, 0x28, 0x17, 0xd2, 0x3c, 0x00, 0x4c, 0x0e, 0x00, 0x00, 0x30, 0x06, 0x07, 0xd5, 0x27, 0x1c, 0x20, 0x1c, 0x00, 0xf0, 0x7a, 0xfc, 0x04, 0x1c, 0x38, 0x1c, 0x00, 0xf0, 0x9c, 0xfb, 0x28, 0x78, 0x0f, 0x49, 0x40, 0x39, 0x80, 0x00, 0x0a, 0x58, 0x00, 0x2a, 0x04, 0xd0, 0x31, 0x1c, 0x20, 0x1c, 0xff, 0xf7, 0xb3, 0xfa, 0x08, 0xe0, 0x05, 0x21, 0x00, 0xe0, 0x04, 0x21, 0x06, 0x20, 0x00, 0xf0, 0x10, 0xfa, 0x20, 0x1c, 0x00, 0xf0, 0x3c, 0x00, 0x88, 0x0e, 0x00, 0x00, 0x87, 0xfb, 0x30, 0x06, 0x01, 0xd5, 0x00, 0xf0, 0xa1, 0xfd, 0xf8, 0xbd, 0x01, 0x21, 0x06, 0x20, 0x00, 0xf0, 0x04, 0xfa, 0xf9, 0xe7, 0x00, 0x00, 0xa4, 0x6d, 0x01, 0x00, 0xcc, 0x5c, 0x01, 0x00, 0xf8, 0xb5, 0x1a, 0x4d, 0x19, 0x4f, 0x01, 0x24, 0x54, 0x35, 0x29, 0x1c, 0x03, 0x20, 0x7c, 0x60, 0x17, 0x4b, 0x18, 0x4a, 0x05, 0xf0, 0xf4, 0xfb, 0x00, 0x28, 0x02, 0xd0, 0x3c, 0x00, 0xc4, 0x0e, 0x00, 0x00, 0x00, 0x20, 0x38, 0x60, 0x1f, 0xe0, 0x3c, 0x60, 0x07, 0x21, 0x28, 0x1c, 0xea, 0x69, 0xff, 0xf7, 0x83, 0xfa, 0x38, 0x20, 0x00, 0xf0, 0x80, 0xfc, 0x00, 0x24, 0xb8, 0x60, 0xb8, 0x68, 0xe6, 0x00, 0x35, 0x18, 0x68, 0x46, 0x02, 0x21, 0x00, 0xf0, 0x75, 0xfb, 0x28, 0x60, 0x28, 0x1c, 0x00, 0xf0, 0xa5, 0xfd, 0xb8, 0x68, 0x81, 0x59, 0x06, 0x48, 0x54, 0x30, 0x02, 0x6a, 0x3c, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xff, 0xf7, 0x6c, 0xfa, 0x01, 0x34, 0x07, 0x2c, 0xea, 0xdb, 0x00, 0x20, 0xf8, 0x60, 0x38, 0x61, 0xf8, 0xbd, 0x00, 0x00, 0x50, 0x6d, 0x01, 0x00, 0x81, 0x9a, 0x00, 0x00, 0x61, 0x9a, 0x00, 0x00, 0x05, 0x48, 0x80, 0xb5, 0x00, 0x68, 0x00, 0x28, 0x05, 0xd0, 0x03, 0x48, 0x54, 0x30, 0x42, 0x6a, 0x00, 0x21, 0xff, 0xf7, 0x53, 0xfa, 0x80, 0xbd, 0x50, 0x6d, 0x01, 0x00, 0x3c, 0x00, 0x3c, 0x0f, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0xb5, 0x0a, 0x4e, 0x09, 0x4d, 0x08, 0x4c, 0x08, 0x3e, 0xa1, 0x69, 0x00, 0x29, 0x07, 0xd0, 0x30, 0x68, 0x41, 0x60, 0x00, 0x7b, 0x81, 0x00, 0x69, 0x58, 0xff, 0xf7, 0x3e, 0xfa, 0xf4, 0xe7, 0x03, 0x49, 0x02, 0x20, 0x08, 0x70, 0x70, 0xbd, 0x00, 0x10, 0x07, 0x00, 0xe0, 0x7e, 0x01, 0x00, 0x00, 0x02, 0x07, 0x00, 0x70, 0xb5, 0x0a, 0x4e, 0x3c, 0x00, 0x78, 0x0f, 0x00, 0x00, 0x09, 0x4d, 0x08, 0x4c, 0x08, 0x3e, 0xe1, 0x69, 0x00, 0x29, 0x07, 0xd0, 0x70, 0x68, 0x41, 0x60, 0x00, 0x7b, 0x81, 0x00, 0x69, 0x58, 0xff, 0xf7, 0x24, 0xfa, 0xf4, 0xe7, 0x03, 0x49, 0x02, 0x20, 0x08, 0x70, 0x70, 0xbd, 0x00, 0x10, 0x07, 0x00, 0xe0, 0x7e, 0x01, 0x00, 0x00, 0x02, 0x07, 0x00, 0xb0, 0xb5, 0x09, 0x4d, 0x04, 0x1c, 0x28, 0x1c, 0x20, 0x22, 0x40, 0x30, 0x3c, 0x00, 0xb4, 0x0f, 0x00, 0x00, 0x05, 0x49, 0xff, 0xf7, 0x9f, 0xfa, 0xe0, 0x68, 0xe8, 0x60, 0x20, 0x69, 0x28, 0x61, 0xa0, 0x6a, 0xa8, 0x62, 0x60, 0x68, 0x68, 0x60, 0xb0, 0xbd, 0x70, 0x52, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, 0xf8, 0xb5, 0x00, 0x24, 0x00, 0x23, 0x20, 0x28, 0x01, 0xdb, 0x01, 0x24, 0x07, 0xe0, 0x08, 0x4e, 0x80, 0x00, 0x35, 0x58, 0x07, 0x4f, 0xbd, 0x42, 0x00, 0xd0, 0x2b, 0x1c, 0x3c, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x31, 0x50, 0x13, 0x60, 0x00, 0x2c, 0x03, 0xd0, 0x21, 0x1c, 0x82, 0x20, 0x00, 0xf0, 0x52, 0xf9, 0x20, 0x1c, 0xf8, 0xbd, 0xe0, 0x7e, 0x01, 0x00, 0x75, 0x75, 0x00, 0x00, 0xb0, 0xb5, 0x0b, 0x4d, 0x04, 0x1c, 0x28, 0x68, 0x00, 0x28, 0x0f, 0xd0, 0x20, 0x1c, 0x12, 0xf0, 0xb7, 0xfd, 0x00, 0x28, 0x0a, 0xd0, 0x21, 0x7a, 0x28, 0x7a, 0x0a, 0x07, 0x00, 0x07, 0x00, 0x0f, 0x3c, 0x00, 0x2c, 0x10, 0x00, 0x00, 0x12, 0x0f, 0x90, 0x42, 0x29, 0x72, 0x01, 0xd0, 0x01, 0x20, 0xb0, 0xbd, 0x00, 0x20, 0xb0, 0xbd, 0x70, 0x78, 0x01, 0x00, 0xf0, 0xb5, 0x42, 0x4e, 0x05, 0x1c, 0x30, 0x68, 0x85, 0xb0, 0x00, 0x28, 0x63, 0xd0, 0x00, 0x24, 0x00, 0x20, 0x00, 0x2d, 0x06, 0xd0, 0x69, 0x78, 0x18, 0x29, 0x03, 0xd1, 0xe9, 0x79, 0x01, 0x29, 0x00, 0xd1, 0x01, 0x20, 0x00, 0x28, 0x45, 0xd0, 0x3c, 0x00, 0x68, 0x10, 0x00, 0x00, 0x00, 0x20, 0xb0, 0x72, 0x81, 0x00, 0x4a, 0x19, 0x93, 0x7a, 0x59, 0x06, 0x89, 0x0f, 0xdb, 0x06, 0x04, 0xd5, 0xb3, 0x7a, 0x01, 0x27, 0x8f, 0x40, 0x3b, 0x43, 0xb3, 0x72, 0xd2, 0x7a, 0x13, 0x09, 0x12, 0x07, 0x12, 0x0f, 0x93, 0x42, 0x05, 0xd3, 0x01, 0x22, 0x8a, 0x40, 0x14, 0x43, 0x01, 0xaa, 0x89, 0x00, 0x50, 0x50, 0x01, 0x30, 0x04, 0x28, 0xe4, 0xdb, 0xb0, 0x7a, 0x3c, 0x00, 0xa4, 0x10, 0x00, 0x00, 0x20, 0x40, 0x01, 0x07, 0x0d, 0xd5, 0x41, 0x07, 0x09, 0xd5, 0xc1, 0x07, 0x05, 0xd5, 0x81, 0x07, 0x01, 0xd5, 0x00, 0x24, 0x05, 0xe0, 0x02, 0x99, 0x02, 0xe0, 0x01, 0x99, 0x00, 0xe0, 0x03, 0x99, 0x04, 0x91, 0x41, 0x07, 0x09, 0xd5, 0xc1, 0x07, 0x05, 0xd5, 0x81, 0x07, 0x01, 0xd5, 0x00, 0x24, 0x03, 0xe0, 0x02, 0x99, 0x00, 0xe0, 0x01, 0x99, 0x03, 0x91, 0xc1, 0x07, 0x3c, 0x00, 0xe0, 0x10, 0x00, 0x00, 0x05, 0xd5, 0x81, 0x07, 0x01, 0xd5, 0x00, 0x24, 0x01, 0xe0, 0x02, 0x99, 0x01, 0x91, 0x80, 0x07, 0x01, 0xd5, 0x00, 0x24, 0x22, 0xe0, 0x0f, 0x2c, 0x20, 0xd1, 0x70, 0x68, 0x00, 0x28, 0x0b, 0xd0, 0x04, 0x9a, 0x02, 0xab, 0x00, 0x92, 0x0a, 0xcb, 0x01, 0x9a, 0x28, 0x1c, 0x0b, 0xf0, 0x8a, 0xfb, 0x00, 0x20, 0x70, 0x60, 0x10, 0xe0, 0x17, 0xe0, 0x30, 0x7a, 0x29, 0x7a, 0x3c, 0x00, 0x1c, 0x11, 0x00, 0x00, 0x00, 0x07, 0x09, 0x07, 0x09, 0x0f, 0x00, 0x0f, 0x88, 0x42, 0x07, 0xd0, 0x04, 0x9a, 0x02, 0xab, 0x00, 0x92, 0x0a, 0xcb, 0x01, 0x9a, 0x28, 0x1c, 0x0b, 0xf0, 0x76, 0xfb, 0x28, 0x7a, 0x30, 0x72, 0x01, 0x20, 0x0f, 0x2c, 0x00, 0xd0, 0x00, 0x20, 0x05, 0xb0, 0xf0, 0xbd, 0x01, 0x20, 0xfb, 0xe7, 0x70, 0x78, 0x01, 0x00, 0x0d, 0x4a, 0x70, 0xb5, 0x11, 0x68, 0x00, 0x20, 0x3c, 0x00, 0x58, 0x11, 0x00, 0x00, 0x00, 0x29, 0x0e, 0xd0, 0x11, 0x7a, 0x09, 0x06, 0x0b, 0xd5, 0x53, 0x7a, 0x94, 0x7a, 0x03, 0x21, 0x01, 0x25, 0x2a, 0x1c, 0x8a, 0x40, 0x1e, 0x1c, 0x16, 0x40, 0x03, 0xd0, 0x22, 0x40, 0x01, 0xd1, 0x01, 0x20, 0x70, 0xbd, 0xff, 0x31, 0x09, 0x06, 0x09, 0x16, 0xf2, 0xd5, 0x70, 0xbd, 0x00, 0x00, 0x70, 0x78, 0x01, 0x00, 0x10, 0xb5, 0x08, 0x4c, 0x20, 0x68, 0x00, 0x28, 0x3c, 0x00, 0x94, 0x11, 0x00, 0x00, 0x04, 0xd0, 0x60, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x0b, 0xf0, 0xc0, 0xfb, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x07, 0xc4, 0x0c, 0x3c, 0x01, 0x20, 0x60, 0x60, 0x10, 0xbd, 0x70, 0x78, 0x01, 0x00, 0x01, 0x49, 0x01, 0x20, 0x08, 0x60, 0x70, 0x47, 0x70, 0x78, 0x01, 0x00, 0xf8, 0xb5, 0x0e, 0x4d, 0x04, 0x1c, 0x00, 0x20, 0x68, 0x72, 0x20, 0x1c, 0x12, 0xf0, 0xde, 0xfc, 0x3c, 0x00, 0xd0, 0x11, 0x00, 0x00, 0x00, 0x28, 0x12, 0xd0, 0x00, 0x20, 0x03, 0x21, 0x01, 0x22, 0x0f, 0x1a, 0x16, 0x1c, 0x23, 0x7a, 0xbe, 0x40, 0x33, 0x40, 0x04, 0xd0, 0x6b, 0x7a, 0x16, 0x1c, 0x86, 0x40, 0x33, 0x43, 0x6b, 0x72, 0x01, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x03, 0x28, 0xef, 0xd9, 0xf8, 0xbd, 0x70, 0x78, 0x01, 0x00, 0x92, 0x00, 0x51, 0x18, 0x8a, 0x7a, 0x12, 0x07, 0x12, 0x0f, 0x02, 0x70, 0x3c, 0x00, 0x0c, 0x12, 0x00, 0x00, 0xca, 0x7a, 0x12, 0x07, 0x12, 0x0f, 0x42, 0x70, 0xca, 0x7a, 0x12, 0x09, 0x82, 0x70, 0x09, 0x7b, 0x81, 0x80, 0x70, 0x47, 0x03, 0x4a, 0x0f, 0x21, 0x52, 0x7a, 0x01, 0x20, 0x91, 0x43, 0x00, 0xd0, 0x00, 0x20, 0x70, 0x47, 0x70, 0x78, 0x01, 0x00, 0x40, 0x07, 0x05, 0x49, 0x40, 0x0f, 0x05, 0x4a, 0x09, 0x56, 0x52, 0x7a, 0x01, 0x20, 0x0a, 0x40, 0x00, 0xd1, 0x00, 0x20, 0x3c, 0x00, 0x48, 0x12, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x5e, 0x46, 0x01, 0x00, 0x70, 0x78, 0x01, 0x00, 0x12, 0x4a, 0x70, 0xb5, 0x53, 0x7a, 0x94, 0x7a, 0xff, 0x20, 0x03, 0x21, 0x01, 0x25, 0x2a, 0x1c, 0x8a, 0x40, 0x1e, 0x1c, 0x16, 0x40, 0x14, 0xd0, 0x22, 0x40, 0x12, 0xd1, 0x08, 0x06, 0x00, 0x0e, 0x07, 0xd0, 0x01, 0x28, 0x07, 0xd0, 0x02, 0x28, 0x07, 0xd0, 0x03, 0x28, 0x07, 0xd1, 0x07, 0x20, 0x3c, 0x00, 0x84, 0x12, 0x00, 0x00, 0x70, 0xbd, 0x03, 0x20, 0x70, 0xbd, 0x01, 0x20, 0x70, 0xbd, 0x05, 0x20, 0x70, 0xbd, 0xff, 0x20, 0x70, 0xbd, 0xff, 0x31, 0x09, 0x06, 0x09, 0x16, 0xe1, 0xd5, 0x70, 0xbd, 0x70, 0x78, 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0x13, 0x48, 0x0d, 0x1c, 0x81, 0x68, 0x00, 0x29, 0x05, 0xd0, 0x01, 0x7b, 0x00, 0x29, 0x01, 0xd1, 0x04, 0x73, 0x45, 0x73, 0xf8, 0xbd, 0x0f, 0x4e, 0x3c, 0x00, 0xc0, 0x12, 0x00, 0x00, 0x31, 0x1c, 0x20, 0x31, 0x8a, 0x79, 0x00, 0xab, 0x1a, 0x70, 0xc9, 0x79, 0x59, 0x70, 0x42, 0x68, 0x00, 0x2a, 0x07, 0xd0, 0x20, 0x02, 0x28, 0x43, 0x01, 0x1c, 0x00, 0x20, 0xff, 0xf7, 0x7e, 0xf8, 0x00, 0x28, 0x04, 0xd1, 0x2a, 0x1c, 0x21, 0x1c, 0x00, 0x20, 0x11, 0xf0, 0x0f, 0xf8, 0x00, 0xab, 0x18, 0x88, 0xf0, 0x84, 0xe2, 0xe7, 0x00, 0x00, 0x88, 0x5a, 0x01, 0x00, 0x3c, 0x00, 0xfc, 0x12, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x80, 0xb5, 0x01, 0x21, 0x81, 0x20, 0xff, 0xf7, 0xcd, 0xff, 0x80, 0xbd, 0x01, 0x49, 0x01, 0x20, 0x88, 0x60, 0x70, 0x47, 0x88, 0x5a, 0x01, 0x00, 0x05, 0x49, 0x80, 0xb5, 0x00, 0x20, 0x88, 0x60, 0x08, 0x7b, 0x00, 0x28, 0x02, 0xd0, 0x49, 0x7b, 0xff, 0xf7, 0xbc, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x88, 0x5a, 0x01, 0x00, 0x02, 0x4a, 0x01, 0x1c, 0x3c, 0x00, 0x38, 0x13, 0x00, 0x00, 0x50, 0x68, 0x51, 0x60, 0x70, 0x47, 0x00, 0x00, 0x88, 0x5a, 0x01, 0x00, 0x10, 0xb5, 0x0c, 0x1c, 0x07, 0xf0, 0x64, 0xfa, 0x04, 0x61, 0x00, 0x20, 0x10, 0xbd, 0x00, 0x00, 0xff, 0xb5, 0x0e, 0x1c, 0x1f, 0x1c, 0x38, 0x20, 0x81, 0xb0, 0x00, 0xf0, 0x3d, 0xfa, 0x1d, 0x49, 0x04, 0x1c, 0x48, 0x69, 0x00, 0x28, 0x01, 0xd1, 0x4c, 0x61, 0x00, 0xe0, 0x04, 0x60, 0x30, 0x01, 0x3c, 0x00, 0x74, 0x13, 0x00, 0x00, 0x00, 0x90, 0x00, 0x04, 0x00, 0x0c, 0x00, 0xf0, 0x15, 0xfa, 0x05, 0x1c, 0x00, 0x99, 0xff, 0xf7, 0x8b, 0xf8, 0x00, 0x20, 0x73, 0x1e, 0x04, 0xe0, 0x01, 0x01, 0x4a, 0x19, 0x10, 0x32, 0x6a, 0x50, 0x01, 0x30, 0x98, 0x42, 0xf8, 0xd3, 0x00, 0x01, 0x2d, 0x50, 0x38, 0x21, 0x20, 0x1c, 0xff, 0xf7, 0x7b, 0xf8, 0xa5, 0x60, 0x65, 0x60, 0xe6, 0x85, 0x0c, 0x20, 0x60, 0x86, 0x3c, 0x00, 0xb0, 0x13, 0x00, 0x00, 0xaf, 0x20, 0x80, 0x01, 0xe0, 0x61, 0x0e, 0x20, 0xe0, 0x86, 0x00, 0x20, 0x20, 0x60, 0x01, 0x98, 0xe0, 0x60, 0x38, 0x68, 0x60, 0x61, 0x03, 0x99, 0x04, 0x48, 0x08, 0x60, 0x04, 0x48, 0x38, 0x60, 0x05, 0xb0, 0x00, 0x20, 0xf0, 0xbd, 0x00, 0x00, 0xfc, 0x5a, 0x01, 0x00, 0xdd, 0x15, 0x01, 0x00, 0xfd, 0x16, 0x01, 0x00, 0x02, 0x1c, 0x08, 0x1c, 0xf0, 0x2a, 0x80, 0xb5, 0x3c, 0x00, 0xec, 0x13, 0x00, 0x00, 0x04, 0xd0, 0xf1, 0x2a, 0x07, 0xd1, 0x06, 0xf0, 0x09, 0xfb, 0x80, 0xbd, 0x07, 0xf0, 0x0c, 0xfa, 0x0d, 0xf0, 0xa8, 0xfa, 0x80, 0xbd, 0x01, 0x21, 0x02, 0x20, 0xff, 0xf7, 0x4d, 0xff, 0x80, 0xbd, 0x01, 0x49, 0x00, 0x20, 0x48, 0x61, 0x70, 0x47, 0xfc, 0x5a, 0x01, 0x00, 0x00, 0x28, 0x02, 0xd0, 0x00, 0x29, 0x00, 0xd0, 0xc1, 0x60, 0x70, 0x47, 0xf8, 0xb5, 0x17, 0x1c, 0x3c, 0x00, 0x28, 0x14, 0x00, 0x00, 0x0e, 0x1c, 0x05, 0x1c, 0x1c, 0x1c, 0x1c, 0x30, 0x07, 0xf0, 0xc8, 0xf8, 0x01, 0x69, 0x42, 0x69, 0x80, 0x68, 0x89, 0x19, 0x89, 0x1a, 0x81, 0x42, 0x06, 0xd2, 0x23, 0x1c, 0x3a, 0x1c, 0x31, 0x1c, 0x28, 0x1c, 0x00, 0xf0, 0x05, 0xf8, 0xf8, 0xbd, 0x00, 0x20, 0x38, 0x60, 0x20, 0x60, 0xfa, 0xe7, 0xff, 0xb5, 0x85, 0xb0, 0x05, 0x98, 0x01, 0x27, 0x0e, 0x1c, 0x1c, 0x30, 0x3c, 0x00, 0x64, 0x14, 0x00, 0x00, 0x07, 0xf0, 0xae, 0xf8, 0x04, 0x1c, 0x80, 0x88, 0x04, 0x30, 0x03, 0x90, 0x2c, 0x48, 0x04, 0x90, 0x80, 0x79, 0x02, 0x90, 0xa0, 0x69, 0xb0, 0x42, 0x17, 0xd2, 0x35, 0x1a, 0x11, 0xe0, 0x03, 0x98, 0xff, 0xf7, 0x16, 0xfc, 0x00, 0x28, 0x06, 0xd1, 0x01, 0x21, 0x8e, 0x20, 0xff, 0xf7, 0x08, 0xff, 0x00, 0x25, 0x00, 0x27, 0x05, 0xe0, 0x21, 0x68, 0x01, 0x60, 0x20, 0x60, 0x3c, 0x00, 0xa0, 0x14, 0x00, 0x00, 0xa0, 0x69, 0x01, 0x30, 0xa0, 0x61, 0x01, 0x3d, 0xeb, 0xd2, 0x00, 0x2f, 0x35, 0xd0, 0xa0, 0x69, 0x80, 0x1b, 0xa0, 0x61, 0x20, 0x69, 0x80, 0x19, 0x20, 0x61, 0x61, 0x69, 0x40, 0x1a, 0xe1, 0x68, 0x88, 0x42, 0x03, 0xd9, 0x07, 0x21, 0x8e, 0x20, 0xff, 0xf7, 0xec, 0xfe, 0x25, 0x68, 0x2f, 0x1c, 0x70, 0x1e, 0x01, 0x95, 0x00, 0xe0, 0x3f, 0x68, 0x01, 0x38, 0xfc, 0xd2, 0x3c, 0x00, 0xdc, 0x14, 0x00, 0x00, 0x38, 0x68, 0x20, 0x60, 0x02, 0x98, 0x04, 0x99, 0x88, 0x71, 0x2e, 0x68, 0x2c, 0x60, 0x32, 0x1d, 0x00, 0x92, 0x29, 0x1c, 0x20, 0x31, 0x01, 0x22, 0x28, 0x1d, 0x05, 0x9b, 0x08, 0xf0, 0x7a, 0xfc, 0xbd, 0x42, 0x01, 0xd0, 0x35, 0x1c, 0xf0, 0xe7, 0x00, 0x20, 0x38, 0x61, 0x01, 0x98, 0x07, 0x99, 0x04, 0x30, 0x08, 0x60, 0x08, 0x98, 0x04, 0x37, 0x07, 0x60, 0x09, 0xb0, 0x3c, 0x00, 0x18, 0x15, 0x00, 0x00, 0xf0, 0xbd, 0x02, 0x98, 0x04, 0x99, 0x88, 0x71, 0xf9, 0xe7, 0x00, 0x00, 0x20, 0x10, 0x07, 0x00, 0x38, 0xb5, 0x04, 0x1c, 0x15, 0x1c, 0x00, 0x20, 0x0c, 0x60, 0x09, 0xe0, 0xe2, 0x68, 0x20, 0x1c, 0x00, 0x92, 0xa3, 0x8a, 0x21, 0x68, 0xa2, 0x69, 0x08, 0xf0, 0x56, 0xfc, 0x20, 0x1c, 0xe4, 0x68, 0x00, 0x2c, 0xf3, 0xd1, 0x28, 0x60, 0x38, 0xbd, 0x80, 0xb5, 0x0c, 0xe0, 0x3c, 0x00, 0x54, 0x15, 0x00, 0x00, 0xc2, 0x68, 0x8a, 0x42, 0x08, 0xd1, 0x00, 0x21, 0xc1, 0x60, 0x00, 0x28, 0x03, 0xd1, 0x06, 0x21, 0x8e, 0x20, 0xff, 0xf7, 0x9d, 0xfe, 0x80, 0xbd, 0x10, 0x1c, 0x00, 0x28, 0xf7, 0xd0, 0xef, 0xe7, 0x10, 0xb5, 0x04, 0x1c, 0x0c, 0xd0, 0xa0, 0x69, 0x00, 0x28, 0x06, 0xd1, 0x20, 0x69, 0x00, 0x28, 0x03, 0xd0, 0x06, 0xf0, 0xf7, 0xfd, 0x00, 0x20, 0x20, 0x61, 0x20, 0x1c, 0x3c, 0x00, 0x90, 0x15, 0x00, 0x00, 0x06, 0xf0, 0xf2, 0xfd, 0x10, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x00, 0x28, 0x09, 0xd0, 0xc4, 0x68, 0x03, 0xe0, 0xff, 0xf7, 0xe7, 0xff, 0x20, 0x1c, 0xf9, 0xe7, 0x00, 0x2c, 0xf9, 0xd1, 0xff, 0xf7, 0xe1, 0xff, 0x10, 0xbd, 0x01, 0x1c, 0x00, 0x20, 0x04, 0xe0, 0x0a, 0x89, 0xc9, 0x68, 0x10, 0x18, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x29, 0xf8, 0xd1, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0xcc, 0x15, 0x00, 0x00, 0x00, 0xe0, 0x08, 0x1c, 0xc1, 0x68, 0x00, 0x29, 0xfb, 0xd1, 0x70, 0x47, 0xf8, 0xb5, 0x06, 0x1c, 0x0c, 0x1c, 0x1c, 0x20, 0x00, 0xf0, 0x68, 0xfa, 0x05, 0x1c, 0x00, 0x2e, 0x01, 0xd1, 0x00, 0x2c, 0x02, 0xd1, 0x30, 0x1c, 0x01, 0x21, 0x03, 0xe0, 0x20, 0x1c, 0x00, 0xf0, 0x5d, 0xfa, 0x00, 0x21, 0x00, 0x22, 0x00, 0x92, 0x0a, 0x1c, 0x01, 0x1c, 0x23, 0x1c, 0x28, 0x1c, 0x3c, 0x00, 0x08, 0x16, 0x00, 0x00, 0x08, 0xf0, 0xf2, 0xfb, 0x28, 0x1c, 0xf8, 0xbd, 0xb0, 0xb5, 0x03, 0x32, 0x92, 0x08, 0x92, 0x00, 0x14, 0x04, 0x24, 0x0c, 0x09, 0x19, 0x1d, 0x1c, 0xc9, 0x18, 0x09, 0x04, 0x09, 0x0c, 0xff, 0xf7, 0xd7, 0xff, 0x01, 0x89, 0x02, 0x68, 0x12, 0x19, 0x09, 0x1b, 0x49, 0x1b, 0x02, 0x60, 0x01, 0x81, 0xb0, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x0a, 0x4c, 0xa0, 0x21, 0x20, 0x1c, 0x3c, 0x00, 0x44, 0x16, 0x00, 0x00, 0xfe, 0xf7, 0x2a, 0xff, 0x00, 0x20, 0x26, 0x1c, 0xa0, 0x36, 0x07, 0x4d, 0x07, 0xe0, 0x0c, 0x21, 0x41, 0x43, 0x49, 0x19, 0x0e, 0xc9, 0x27, 0x1d, 0x0e, 0xc7, 0x20, 0x34, 0x01, 0x30, 0xa6, 0x42, 0xf5, 0xd1, 0xf8, 0xbd, 0xd0, 0x5c, 0x01, 0x00, 0xc8, 0x3f, 0x01, 0x00, 0xf7, 0xb5, 0xc4, 0x68, 0x06, 0x1c, 0x00, 0x25, 0x00, 0x2c, 0x82, 0xb0, 0x23, 0xd0, 0x20, 0x89, 0x3c, 0x00, 0x80, 0x16, 0x00, 0x00, 0x90, 0x42, 0x20, 0xd3, 0xe1, 0x68, 0x87, 0x1a, 0x01, 0x91, 0x00, 0x21, 0xe1, 0x60, 0x03, 0x99, 0x00, 0x20, 0xff, 0xf7, 0xa1, 0xff, 0x05, 0x1c, 0x20, 0x89, 0xc0, 0x1b, 0x20, 0x81, 0x2a, 0x68, 0x03, 0x99, 0x30, 0x1c, 0x00, 0xf0, 0x16, 0xf8, 0x20, 0x89, 0xc0, 0x19, 0x20, 0x81, 0x01, 0x99, 0x20, 0x1c, 0xff, 0xf7, 0xb1, 0xfe, 0x21, 0x1c, 0x28, 0x1c, 0xff, 0xf7, 0x3c, 0x00, 0xbc, 0x16, 0x00, 0x00, 0xad, 0xfe, 0x29, 0x1c, 0x30, 0x1c, 0xff, 0xf7, 0xa9, 0xfe, 0x01, 0x20, 0x00, 0x2d, 0x00, 0xd1, 0x00, 0x20, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xf7, 0xb5, 0x04, 0x1c, 0x0e, 0x1c, 0x00, 0x20, 0x01, 0xe0, 0x20, 0x1c, 0x0c, 0x1c, 0xe1, 0x68, 0x00, 0x29, 0xfa, 0xd1, 0x27, 0x89, 0xb7, 0x42, 0x0a, 0xd3, 0xb8, 0x1b, 0x00, 0x04, 0x00, 0x0c, 0x20, 0x81, 0x21, 0x68, 0x3c, 0x00, 0xf8, 0x16, 0x00, 0x00, 0x09, 0x18, 0x02, 0x98, 0x32, 0x1c, 0xfe, 0xf7, 0xfb, 0xfe, 0xfe, 0xbd, 0xf1, 0x1b, 0x0d, 0x04, 0x2d, 0x0c, 0x00, 0x28, 0x19, 0xd0, 0x01, 0x89, 0xa9, 0x42, 0x16, 0xd3, 0x49, 0x1b, 0x09, 0x04, 0x09, 0x0c, 0x01, 0x81, 0x00, 0x68, 0x41, 0x18, 0x02, 0x98, 0x2a, 0x1c, 0xfe, 0xf7, 0xe8, 0xfe, 0x21, 0x68, 0x02, 0x98, 0x72, 0x1b, 0x40, 0x19, 0xfe, 0xf7, 0xe2, 0xfe, 0x3c, 0x00, 0x34, 0x17, 0x00, 0x00, 0x20, 0x89, 0xc0, 0x1b, 0x20, 0x81, 0x20, 0x68, 0xc0, 0x19, 0x20, 0x60, 0xdf, 0xe7, 0x03, 0x21, 0x8e, 0x20, 0xff, 0xf7, 0xad, 0xfd, 0xda, 0xe7, 0xf8, 0xb5, 0x04, 0x1c, 0x00, 0x26, 0x13, 0xe0, 0x21, 0x89, 0x00, 0x20, 0xff, 0xf7, 0x3e, 0xff, 0x05, 0x1c, 0x22, 0x89, 0x21, 0x68, 0x00, 0x68, 0xfe, 0xf7, 0xc8, 0xfe, 0x00, 0x2e, 0x01, 0xd1, 0x2e, 0x1c, 0x03, 0xe0, 0x3c, 0x00, 0x70, 0x17, 0x00, 0x00, 0x29, 0x1c, 0x38, 0x1c, 0xff, 0xf7, 0x50, 0xfe, 0xe4, 0x68, 0x2f, 0x1c, 0x00, 0x2c, 0xe9, 0xd1, 0x30, 0x1c, 0xf8, 0xbd, 0xb0, 0xb5, 0x04, 0x1c, 0x00, 0x89, 0x40, 0x1a, 0x05, 0x04, 0x20, 0x68, 0x2d, 0x0c, 0x40, 0x18, 0x29, 0x1c, 0xff, 0xf7, 0x1f, 0xff, 0x21, 0x89, 0x49, 0x1b, 0x21, 0x81, 0xe1, 0x68, 0xc1, 0x60, 0xe0, 0x60, 0xb0, 0xbd, 0x10, 0xb5, 0x03, 0x30, 0x3c, 0x00, 0xac, 0x17, 0x00, 0x00, 0x09, 0x4a, 0x81, 0x08, 0x10, 0x68, 0x3d, 0x24, 0x08, 0x4b, 0x64, 0x01, 0x89, 0x00, 0x09, 0x18, 0x1b, 0x19, 0x99, 0x42, 0x01, 0xd8, 0x11, 0x60, 0x10, 0xbd, 0x0f, 0x21, 0x80, 0x20, 0xff, 0xf7, 0x6b, 0xfd, 0x00, 0x20, 0x10, 0xbd, 0x00, 0x00, 0xb4, 0xcf, 0x01, 0x00, 0x14, 0xc8, 0x01, 0x00, 0x10, 0xb5, 0x11, 0xf0, 0x61, 0xff, 0x04, 0x1c, 0x03, 0xd1, 0x0d, 0x21, 0x3c, 0x00, 0xe8, 0x17, 0x00, 0x00, 0x80, 0x20, 0xff, 0xf7, 0x5b, 0xfd, 0x20, 0x1c, 0x10, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x01, 0x1f, 0x0b, 0x68, 0x0d, 0x48, 0x00, 0x22, 0x83, 0x42, 0x04, 0xd0, 0x01, 0x32, 0x10, 0x30, 0x03, 0x2a, 0xf9, 0xd3, 0x01, 0xe0, 0x03, 0x2a, 0x06, 0xd3, 0x09, 0x24, 0x21, 0x1c, 0x80, 0x20, 0xff, 0xf7, 0x45, 0xfd, 0x20, 0x1c, 0xb0, 0xbd, 0x05, 0x4b, 0x00, 0x24, 0x9a, 0x79, 0x3c, 0x00, 0x24, 0x18, 0x00, 0x00, 0x85, 0x68, 0x0d, 0x60, 0x81, 0x60, 0x9a, 0x71, 0xf5, 0xe7, 0x00, 0x00, 0x20, 0x57, 0x01, 0x00, 0x20, 0x10, 0x07, 0x00, 0xb0, 0xb5, 0x00, 0x21, 0x10, 0x4a, 0x00, 0x23, 0xd4, 0x68, 0x84, 0x42, 0x04, 0xd2, 0x01, 0x33, 0x10, 0x32, 0x03, 0x2b, 0xf8, 0xd3, 0x01, 0xe0, 0x03, 0x2b, 0x01, 0xd3, 0x04, 0x21, 0x0e, 0xe0, 0x0a, 0x4c, 0xa3, 0x79, 0x90, 0x68, 0x00, 0x28, 0x3c, 0x00, 0x60, 0x18, 0x00, 0x00, 0x02, 0xd1, 0xa3, 0x71, 0x03, 0x21, 0x06, 0xe0, 0x05, 0x68, 0x95, 0x60, 0xa3, 0x71, 0x00, 0x29, 0x01, 0xd1, 0x04, 0xc0, 0xb0, 0xbd, 0x80, 0x20, 0xff, 0xf7, 0x14, 0xfd, 0x00, 0x20, 0xb0, 0xbd, 0x20, 0x57, 0x01, 0x00, 0x20, 0x10, 0x07, 0x00, 0xa0, 0x30, 0x00, 0x8a, 0x40, 0x07, 0x40, 0x0f, 0x08, 0x28, 0x0f, 0xd2, 0x01, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x3c, 0x00, 0x9c, 0x18, 0x00, 0x00, 0x05, 0x03, 0x03, 0x05, 0x07, 0x07, 0x09, 0x09, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x02, 0x20, 0x70, 0x47, 0x03, 0x20, 0x70, 0x47, 0x04, 0x20, 0x70, 0x47, 0xb0, 0xb5, 0x10, 0x4d, 0x68, 0x69, 0x00, 0x28, 0x07, 0xd0, 0x0e, 0x49, 0x00, 0x22, 0x2c, 0x31, 0x03, 0xc9, 0x01, 0x43, 0x03, 0x20, 0x06, 0xf0, 0xcf, 0xff, 0x0b, 0x4c, 0x00, 0x22, 0x03, 0xcc, 0x3c, 0x00, 0xd8, 0x18, 0x00, 0x00, 0x08, 0x3c, 0x01, 0x43, 0x03, 0x20, 0x06, 0xf0, 0xaf, 0xff, 0x03, 0xcc, 0x08, 0x43, 0x07, 0x49, 0x4a, 0x68, 0x02, 0x43, 0x4a, 0x60, 0x8a, 0x68, 0x10, 0x43, 0x88, 0x60, 0x01, 0x20, 0x68, 0x61, 0xb0, 0xbd, 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, 0xb0, 0x58, 0x01, 0x00, 0x10, 0x00, 0x07, 0x00, 0xb0, 0xb5, 0x0c, 0x1c, 0x0f, 0xf0, 0xa8, 0xfa, 0x05, 0x4d, 0xe8, 0x6a, 0x3c, 0x00, 0x14, 0x19, 0x00, 0x00, 0x00, 0x28, 0x06, 0xd1, 0x00, 0x2c, 0x04, 0xd0, 0x20, 0x1c, 0x0f, 0xf0, 0xb7, 0xfd, 0x01, 0x20, 0x28, 0x70, 0xb0, 0xbd, 0xf4, 0x6e, 0x01, 0x00, 0x05, 0x49, 0x80, 0xb5, 0x88, 0x6a, 0x00, 0x28, 0x04, 0xda, 0x00, 0x20, 0x88, 0x62, 0x01, 0x21, 0x0d, 0xf0, 0x42, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0xac, 0x7e, 0x01, 0x00, 0xf8, 0xb5, 0x1e, 0x4d, 0x04, 0x1c, 0x00, 0x20, 0x3c, 0x00, 0x50, 0x19, 0x00, 0x00, 0x68, 0x62, 0xa8, 0x70, 0x1c, 0x48, 0x00, 0x78, 0xc0, 0x07, 0x22, 0xd5, 0xb8, 0x20, 0x03, 0x59, 0x1a, 0x48, 0x00, 0x78, 0x0e, 0x28, 0x09, 0xd1, 0x0a, 0x1c, 0x80, 0x32, 0x06, 0xd0, 0x18, 0x4e, 0x0d, 0x20, 0x32, 0x5c, 0x8a, 0x42, 0x01, 0xdd, 0x01, 0x38, 0xfa, 0xd1, 0x59, 0x1e, 0x0b, 0x06, 0x1b, 0x0e, 0xab, 0x70, 0xab, 0x62, 0x0e, 0x28, 0x0b, 0xd2, 0x08, 0xe0, 0x3c, 0x00, 0x8c, 0x19, 0x00, 0x00, 0x62, 0x18, 0xb0, 0x32, 0x12, 0x7b, 0x82, 0x42, 0x02, 0xd8, 0x58, 0x1a, 0xa8, 0x62, 0x02, 0xe0, 0x01, 0x39, 0x00, 0x29, 0xf4, 0xda, 0x0e, 0xf0, 0x35, 0xf9, 0x00, 0x90, 0x00, 0xab, 0x18, 0x78, 0x59, 0x78, 0x81, 0x42, 0x00, 0xd9, 0x58, 0x78, 0xed, 0x30, 0xe8, 0x70, 0x01, 0x21, 0x20, 0x1c, 0x0d, 0xf0, 0x02, 0xfd, 0xf8, 0xbd, 0x00, 0x00, 0xac, 0x7e, 0x01, 0x00, 0x3c, 0x00, 0xc8, 0x19, 0x00, 0x00, 0x1d, 0x75, 0x01, 0x00, 0x11, 0x67, 0x01, 0x00, 0xc7, 0x52, 0x01, 0x00, 0x0e, 0x49, 0x10, 0xb5, 0x08, 0x69, 0x8b, 0x68, 0xc2, 0x00, 0xd4, 0x18, 0x62, 0x68, 0x00, 0x2a, 0x0f, 0xd1, 0x01, 0x30, 0x08, 0x61, 0x07, 0x28, 0x01, 0xd1, 0x00, 0x20, 0x08, 0x61, 0x20, 0x1c, 0x00, 0xf0, 0x24, 0xf8, 0x05, 0x48, 0x21, 0x68, 0x54, 0x30, 0x02, 0x6a, 0xfe, 0xf7, 0xec, 0xfc, 0x3c, 0x00, 0x04, 0x1a, 0x00, 0x00, 0x10, 0xbd, 0x06, 0x21, 0x06, 0x20, 0xff, 0xf7, 0x4b, 0xfc, 0x10, 0xbd, 0x50, 0x6d, 0x01, 0x00, 0x08, 0x49, 0x09, 0x79, 0xc9, 0x07, 0x08, 0x4a, 0x08, 0xd4, 0x00, 0xe0, 0x08, 0x1c, 0xc1, 0x68, 0x00, 0x29, 0xfb, 0xd1, 0x01, 0x89, 0x04, 0x31, 0x01, 0x81, 0x00, 0xe0, 0x00, 0x20, 0xd0, 0x62, 0x70, 0x47, 0x00, 0x00, 0x60, 0x80, 0x07, 0x00, 0x04, 0x6c, 0x01, 0x00, 0x3c, 0x00, 0x40, 0x1a, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x19, 0x21, 0x89, 0x01, 0x00, 0x20, 0xff, 0xf7, 0xc5, 0xfd, 0x01, 0x1c, 0x60, 0x60, 0x20, 0x68, 0xff, 0xf7, 0xe0, 0xfc, 0x60, 0x68, 0x21, 0x68, 0x08, 0x30, 0x08, 0x60, 0x10, 0xbd, 0x00, 0x00, 0x0a, 0x28, 0x01, 0xda, 0x04, 0x20, 0x04, 0xe0, 0x50, 0x28, 0x01, 0xda, 0x05, 0x20, 0x00, 0xe0, 0x07, 0x20, 0x04, 0x4a, 0x11, 0x78, 0x38, 0x23, 0x3c, 0x00, 0x7c, 0x1a, 0x00, 0x00, 0xc0, 0x00, 0x18, 0x40, 0x99, 0x43, 0x08, 0x43, 0x10, 0x70, 0x70, 0x47, 0x88, 0x00, 0x07, 0x00, 0xb0, 0xb5, 0x05, 0x1c, 0x07, 0x48, 0x40, 0x68, 0x08, 0xe0, 0x01, 0x69, 0xa9, 0x42, 0x04, 0xd1, 0x44, 0x68, 0x05, 0xf0, 0xc7, 0xfd, 0x20, 0x1c, 0x00, 0xe0, 0x40, 0x68, 0x00, 0x28, 0xf4, 0xd1, 0xb0, 0xbd, 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, 0xf8, 0xb5, 0x00, 0x25, 0x3c, 0x00, 0xb8, 0x1a, 0x00, 0x00, 0x06, 0xf0, 0x84, 0xfd, 0x11, 0x4f, 0x04, 0x1c, 0xbe, 0x79, 0x20, 0x68, 0x00, 0x28, 0x07, 0xd1, 0xa0, 0x88, 0x04, 0x30, 0xff, 0xf7, 0xf2, 0xf8, 0x00, 0x28, 0x06, 0xd1, 0x01, 0x21, 0x0f, 0xe0, 0x01, 0x68, 0x21, 0x60, 0xa1, 0x69, 0x01, 0x39, 0xa1, 0x61, 0x10, 0xc0, 0x05, 0x1c, 0x20, 0x69, 0x01, 0x30, 0x20, 0x61, 0x61, 0x69, 0x40, 0x1a, 0xe1, 0x68, 0x88, 0x42, 0x3c, 0x00, 0xf4, 0x1a, 0x00, 0x00, 0x03, 0xd9, 0x07, 0x21, 0x8e, 0x20, 0xff, 0xf7, 0xd3, 0xfb, 0xbe, 0x71, 0x28, 0x1c, 0xf8, 0xbd, 0x20, 0x10, 0x07, 0x00, 0xb0, 0xb5, 0x09, 0xf0, 0xbb, 0xff, 0x2f, 0x4c, 0x00, 0x28, 0x20, 0x74, 0x03, 0xd0, 0x01, 0x21, 0x01, 0x20, 0x0a, 0xf0, 0x71, 0xfc, 0x2b, 0x4d, 0x14, 0x35, 0x28, 0x68, 0x00, 0x28, 0x4d, 0xd0, 0x01, 0x21, 0x0f, 0x20, 0x11, 0xf0, 0x82, 0xfd, 0x3c, 0x00, 0x30, 0x1b, 0x00, 0x00, 0x28, 0x89, 0x08, 0xf0, 0xfb, 0xff, 0x01, 0x1c, 0x01, 0x22, 0x0f, 0x20, 0x11, 0xf0, 0x40, 0xfd, 0xe0, 0x78, 0x01, 0x25, 0x02, 0x28, 0x36, 0xd1, 0x0a, 0xf0, 0xc6, 0xf8, 0x00, 0x28, 0x0a, 0xd0, 0x0b, 0xf0, 0x92, 0xfb, 0x1e, 0x49, 0x09, 0x68, 0x40, 0x18, 0x11, 0xf0, 0x5f, 0xf8, 0x00, 0x28, 0x01, 0xd1, 0x02, 0x20, 0x2f, 0xe0, 0xe0, 0x78, 0x02, 0x28, 0x24, 0xd1, 0x3c, 0x00, 0x6c, 0x1b, 0x00, 0x00, 0x60, 0x70, 0x25, 0x70, 0x60, 0x68, 0x01, 0x28, 0x1c, 0xd0, 0x15, 0x48, 0x10, 0x38, 0x81, 0x7b, 0x00, 0x29, 0x04, 0xd1, 0x85, 0x73, 0x0f, 0x20, 0x13, 0x49, 0x10, 0xf0, 0x01, 0xfc, 0x08, 0xf0, 0x4f, 0xfe, 0x00, 0x28, 0x07, 0xd0, 0x0e, 0x48, 0x01, 0x21, 0x98, 0x38, 0x00, 0x69, 0x01, 0xf0, 0xb7, 0xfd, 0x00, 0x28, 0x05, 0xd0, 0x01, 0x20, 0x0e, 0xf0, 0x0c, 0xfd, 0x3c, 0x00, 0xa8, 0x1b, 0x00, 0x00, 0x01, 0x20, 0x0e, 0xf0, 0x1d, 0xfc, 0xb0, 0xbd, 0x05, 0xf0, 0xdc, 0xfe, 0xb0, 0xbd, 0xe0, 0x78, 0x00, 0x28, 0x01, 0xd1, 0x25, 0x70, 0xf7, 0xe7, 0x03, 0x20, 0x00, 0xe0, 0x04, 0x20, 0x0d, 0xf0, 0x8d, 0xfa, 0xb0, 0xbd, 0x84, 0x66, 0x01, 0x00, 0x6c, 0x57, 0x01, 0x00, 0xe9, 0x03, 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x00, 0x21, 0x00, 0x20, 0x0a, 0x4d, 0x00, 0xe0, 0x3c, 0x00, 0xe4, 0x1b, 0x00, 0x00, 0x01, 0x31, 0xcb, 0x00, 0x5a, 0x19, 0x16, 0x79, 0x01, 0x2e, 0x02, 0xd0, 0x52, 0x79, 0xa2, 0x42, 0x02, 0xd0, 0x0b, 0x29, 0xf4, 0xd3, 0x70, 0xbd, 0x0b, 0x29, 0xfc, 0xd2, 0xc8, 0x00, 0x01, 0x21, 0x5a, 0x19, 0x28, 0x58, 0x11, 0x71, 0x70, 0xbd, 0x38, 0x58, 0x01, 0x00, 0x05, 0x48, 0x80, 0xb5, 0x00, 0x7f, 0x24, 0x23, 0x04, 0x49, 0x58, 0x43, 0x40, 0x18, 0x00, 0x6a, 0x3c, 0x00, 0x20, 0x1c, 0x00, 0x00, 0xfe, 0xf7, 0xda, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x94, 0x46, 0x01, 0x00, 0x80, 0xb5, 0x04, 0xf0, 0x37, 0xff, 0x00, 0x20, 0x11, 0xf0, 0x84, 0xfc, 0x00, 0x20, 0x80, 0xbd, 0xb0, 0xb5, 0x05, 0x4c, 0x05, 0x1c, 0x20, 0x6b, 0xe1, 0x6a, 0x02, 0xf0, 0xe3, 0xfd, 0x29, 0x1c, 0xa0, 0x6a, 0x02, 0xf0, 0x11, 0xfb, 0xb0, 0xbd, 0xa4, 0x6c, 0x01, 0x00, 0x3c, 0x00, 0x5c, 0x1c, 0x00, 0x00, 0xb0, 0xb5, 0x03, 0x1c, 0x08, 0x1c, 0x14, 0x1c, 0x00, 0x2b, 0x0c, 0x4d, 0x09, 0xd0, 0x69, 0x69, 0x89, 0x00, 0x01, 0x31, 0x0a, 0x04, 0x12, 0x0c, 0x22, 0x80, 0x29, 0x1c, 0xfe, 0xf7, 0x3e, 0xfc, 0x0a, 0xe0, 0x01, 0x1c, 0x28, 0x1c, 0x22, 0x88, 0xfe, 0xf7, 0x38, 0xfc, 0x20, 0x88, 0x01, 0x28, 0x02, 0xd9, 0x80, 0x08, 0x01, 0x38, 0x68, 0x61, 0x01, 0x20, 0xb0, 0xbd, 0x3c, 0x00, 0x98, 0x1c, 0x00, 0x00, 0x20, 0x6e, 0x01, 0x00, 0xf1, 0xb5, 0x00, 0x98, 0x00, 0x26, 0xc1, 0x68, 0x08, 0x68, 0x09, 0x89, 0x1c, 0x29, 0x34, 0xd3, 0xc1, 0x88, 0xff, 0x23, 0x01, 0x33, 0x99, 0x42, 0x2f, 0xd1, 0x01, 0x88, 0xc9, 0x1a, 0x2c, 0xd1, 0x41, 0x88, 0x08, 0x29, 0x29, 0xd1, 0x01, 0x79, 0x06, 0x29, 0x26, 0xd1, 0x41, 0x79, 0x04, 0x29, 0x23, 0xd1, 0x00, 0x25, 0x00, 0x24, 0x07, 0x1c, 0x3c, 0x00, 0xd4, 0x1c, 0x00, 0x00, 0x18, 0x37, 0x0b, 0xe0, 0xa0, 0x00, 0x41, 0x18, 0x04, 0x31, 0x04, 0x22, 0x38, 0x1c, 0xfe, 0xf7, 0x8b, 0xfb, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x25, 0x04, 0xe0, 0x01, 0x34, 0x0a, 0x49, 0x48, 0x69, 0xa0, 0x42, 0xef, 0xd8, 0x08, 0x49, 0x08, 0x78, 0x00, 0x28, 0x0a, 0xd0, 0x01, 0x28, 0x01, 0xd0, 0x02, 0x28, 0x06, 0xd1, 0x00, 0x2d, 0x04, 0xd1, 0x00, 0x98, 0xc0, 0x68, 0x3c, 0x00, 0x10, 0x1d, 0x00, 0x00, 0xff, 0xf7, 0x42, 0xfc, 0x01, 0x26, 0x30, 0x1c, 0xf8, 0xbd, 0x00, 0x00, 0x20, 0x6e, 0x01, 0x00, 0x01, 0x48, 0x40, 0x68, 0x70, 0x47, 0x00, 0x00, 0x20, 0x6e, 0x01, 0x00, 0x02, 0x49, 0x48, 0x60, 0x01, 0x20, 0x48, 0x61, 0x70, 0x47, 0x00, 0x00, 0x20, 0x6e, 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x01, 0x26, 0x03, 0xf0, 0xef, 0xfa, 0x25, 0x1c, 0x10, 0x35, 0x00, 0x28, 0x3c, 0x00, 0x4c, 0x1d, 0x00, 0x00, 0x04, 0xd0, 0x00, 0x20, 0x20, 0x77, 0x03, 0xf0, 0xf1, 0xfb, 0x07, 0xe0, 0x03, 0xf0, 0x38, 0xfd, 0x00, 0x28, 0x09, 0xd0, 0x01, 0x20, 0x20, 0x77, 0x03, 0xf0, 0xce, 0xfc, 0x01, 0x1c, 0x06, 0x22, 0x28, 0x1c, 0xfe, 0xf7, 0xc3, 0xfb, 0x02, 0xe0, 0x02, 0x20, 0x20, 0x77, 0x00, 0x26, 0x30, 0x1c, 0x70, 0xbd, 0x00, 0x00, 0x03, 0x48, 0x80, 0x7a, 0xc0, 0x07, 0x03, 0x49, 0x3c, 0x00, 0x88, 0x1d, 0x00, 0x00, 0xc0, 0x0f, 0x88, 0x62, 0x70, 0x47, 0x00, 0x00, 0x40, 0x90, 0x07, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x01, 0x49, 0x01, 0x20, 0x88, 0x62, 0x70, 0x47, 0xa4, 0x6c, 0x01, 0x00, 0x06, 0x48, 0x80, 0x7a, 0xc1, 0x07, 0x06, 0x4a, 0xc9, 0x0f, 0x91, 0x62, 0x20, 0x21, 0x80, 0x07, 0x00, 0xd4, 0x00, 0x21, 0xa0, 0x32, 0x11, 0x70, 0x70, 0x47, 0x00, 0x00, 0x40, 0x90, 0x07, 0x00, 0x3c, 0x00, 0xc4, 0x1d, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x07, 0x4a, 0x12, 0x68, 0x07, 0x4b, 0x9b, 0x69, 0x1a, 0x40, 0x01, 0xd0, 0x01, 0x22, 0x00, 0xe0, 0x00, 0x22, 0x0a, 0x60, 0x01, 0x21, 0x00, 0x2a, 0x00, 0xd0, 0x00, 0x21, 0x01, 0x60, 0x70, 0x47, 0x10, 0x00, 0x07, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x01, 0x22, 0x02, 0x60, 0x0a, 0x60, 0x70, 0x47, 0xb0, 0xb5, 0x0d, 0x1c, 0x01, 0x1c, 0x58, 0x31, 0x3c, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x04, 0x1c, 0x06, 0x22, 0x28, 0x1d, 0xfe, 0xf7, 0x77, 0xfb, 0x21, 0x1c, 0x5e, 0x31, 0x06, 0x22, 0x28, 0x1c, 0x0a, 0x30, 0xfe, 0xf7, 0x70, 0xfb, 0x21, 0x1c, 0x64, 0x31, 0x06, 0x22, 0x28, 0x1c, 0x10, 0x30, 0xfe, 0xf7, 0x69, 0xfb, 0xb0, 0xbd, 0xfe, 0xb5, 0x00, 0x25, 0x1d, 0x72, 0x17, 0x1c, 0x0e, 0x1c, 0xb2, 0x6d, 0x00, 0x21, 0x92, 0x19, 0x50, 0x32, 0xd2, 0x7a, 0x3c, 0x00, 0x3c, 0x1e, 0x00, 0x00, 0x1c, 0x1c, 0x5a, 0x72, 0x00, 0x78, 0x32, 0x1c, 0x80, 0x32, 0xc0, 0x07, 0xc0, 0x17, 0x01, 0x30, 0x01, 0x90, 0x08, 0x98, 0x02, 0x92, 0x00, 0x28, 0x01, 0xd1, 0x30, 0x7f, 0x2b, 0xe0, 0x37, 0x48, 0x00, 0x68, 0x00, 0x28, 0x00, 0xdd, 0x01, 0x1c, 0x01, 0x98, 0x00, 0x28, 0x02, 0xd0, 0x08, 0x98, 0x01, 0x28, 0x10, 0xd1, 0x02, 0x9a, 0x90, 0x6b, 0x00, 0x28, 0x06, 0xd0, 0x3c, 0x00, 0x78, 0x1e, 0x00, 0x00, 0x88, 0x42, 0x01, 0xd9, 0x45, 0x1a, 0x01, 0x3d, 0x70, 0x19, 0xb0, 0x30, 0x03, 0xe0, 0xb5, 0x6d, 0x01, 0x3d, 0x70, 0x19, 0x50, 0x30, 0x00, 0x7b, 0x0f, 0xe0, 0x02, 0x9a, 0x10, 0x6a, 0x00, 0x28, 0x07, 0xd0, 0x88, 0x42, 0x01, 0xd9, 0x45, 0x1a, 0x01, 0x3d, 0x70, 0x19, 0xa0, 0x30, 0x00, 0x79, 0x03, 0xe0, 0xbd, 0x69, 0x01, 0x3d, 0x78, 0x19, 0x00, 0x7f, 0xa0, 0x72, 0x3c, 0x00, 0xb4, 0x1e, 0x00, 0x00, 0x0e, 0xf0, 0x0c, 0xf8, 0x0e, 0x28, 0x11, 0xd1, 0xa0, 0x7a, 0x08, 0xf0, 0x67, 0xff, 0x00, 0x28, 0x0c, 0xd0, 0x78, 0x68, 0x00, 0x28, 0x05, 0xd1, 0x1b, 0x48, 0x00, 0x25, 0x00, 0x78, 0x08, 0xf0, 0x4b, 0xff, 0x02, 0xe0, 0x45, 0x1e, 0x78, 0x19, 0x00, 0x7a, 0xa0, 0x72, 0x02, 0x9a, 0x50, 0x69, 0x00, 0x28, 0x17, 0xd0, 0x08, 0x98, 0x01, 0x28, 0x14, 0xd0, 0xa0, 0x7a, 0x3c, 0x00, 0xf0, 0x1e, 0x00, 0x00, 0x08, 0xf0, 0x4e, 0xff, 0x00, 0x28, 0x0f, 0xd0, 0x01, 0x98, 0x00, 0x28, 0x07, 0xd0, 0x02, 0x20, 0x20, 0x72, 0x70, 0x6c, 0x80, 0x19, 0x40, 0x30, 0xc0, 0x79, 0x60, 0x72, 0x04, 0xe0, 0x7d, 0x68, 0x01, 0x3d, 0x78, 0x19, 0x00, 0x7a, 0xa0, 0x72, 0x02, 0x9a, 0xa0, 0x7a, 0x91, 0x69, 0x08, 0xf0, 0x51, 0xff, 0x20, 0x60, 0x02, 0x9a, 0x60, 0x7a, 0x91, 0x69, 0x08, 0xf0, 0x3c, 0x00, 0x2c, 0x1f, 0x00, 0x00, 0x4b, 0xff, 0x60, 0x60, 0xa0, 0x7a, 0xe0, 0x72, 0x25, 0x73, 0xfe, 0xbd, 0xd4, 0x7e, 0x01, 0x00, 0x90, 0x57, 0x01, 0x00, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x2a, 0x8c, 0xb5, 0x01, 0xd0, 0x8a, 0x22, 0x00, 0xe0, 0x88, 0x22, 0x00, 0xab, 0x1a, 0x80, 0x0c, 0xf0, 0xc2, 0xf8, 0x01, 0x90, 0x68, 0x46, 0x0b, 0xf0, 0xbc, 0xfa, 0x8c, 0xbd, 0x00, 0x00, 0x01, 0x1c, 0x08, 0x48, 0x3c, 0x00, 0x68, 0x1f, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x68, 0x00, 0x28, 0x09, 0xd0, 0x49, 0x68, 0x02, 0x20, 0x00, 0x29, 0x00, 0xd1, 0x01, 0x20, 0x01, 0x06, 0x09, 0x0e, 0x00, 0x20, 0x06, 0xf0, 0xd8, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x20, 0x67, 0x01, 0x00, 0x1c, 0xb5, 0x01, 0x90, 0x04, 0x1c, 0x44, 0x30, 0x01, 0xaa, 0x69, 0x46, 0x11, 0xf0, 0xb8, 0xfd, 0x00, 0x28, 0x0b, 0xd0, 0xa0, 0x69, 0x00, 0x21, 0x3c, 0x00, 0xa4, 0x1f, 0x00, 0x00, 0xc2, 0x07, 0xd2, 0x0f, 0x02, 0x20, 0xff, 0xf7, 0xc9, 0xff, 0x00, 0x21, 0x20, 0x1c, 0x0f, 0xf0, 0xd9, 0xfe, 0x1c, 0xbd, 0x04, 0x21, 0x98, 0x20, 0xff, 0xf7, 0x72, 0xf9, 0xf9, 0xe7, 0x00, 0x00, 0x8c, 0xb5, 0x00, 0xab, 0x84, 0x21, 0x19, 0x80, 0x05, 0x4b, 0x02, 0x1c, 0x18, 0x1c, 0x99, 0x8a, 0x0c, 0xf0, 0x8e, 0xf8, 0x01, 0x90, 0x68, 0x46, 0x0b, 0xf0, 0x7c, 0xfa, 0x3c, 0x00, 0xe0, 0x1f, 0x00, 0x00, 0x8c, 0xbd, 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x06, 0x49, 0x80, 0xb5, 0xc9, 0x68, 0x14, 0x23, 0x40, 0x31, 0x89, 0x7a, 0x04, 0x4a, 0x59, 0x43, 0x89, 0x18, 0x80, 0x00, 0x08, 0x58, 0xfe, 0xf7, 0xe9, 0xf9, 0x80, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x54, 0x47, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x20, 0xff, 0xf7, 0xd6, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0x20, 0x00, 0x00, 0x80, 0xb5, 0x12, 0x48, 0x11, 0x49, 0x80, 0x8a, 0x0a, 0x8b, 0x00, 0x21, 0x00, 0x28, 0xc2, 0xb0, 0x0c, 0xd1, 0x01, 0x2a, 0x05, 0xd0, 0x02, 0x2a, 0x15, 0xd0, 0x00, 0xab, 0x5a, 0x80, 0x0e, 0x22, 0x07, 0xe0, 0x02, 0x22, 0x00, 0xab, 0x5a, 0x80, 0x99, 0x80, 0x04, 0xe0, 0x00, 0xab, 0x5a, 0x80, 0x0d, 0x22, 0x00, 0xab, 0x9a, 0x80, 0x00, 0xab, 0x18, 0x80, 0xff, 0x20, 0x3c, 0x00, 0x58, 0x20, 0x00, 0x00, 0x98, 0x71, 0xd9, 0x71, 0x68, 0x46, 0x00, 0xf0, 0xd1, 0xf9, 0x42, 0xb0, 0x80, 0xbd, 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x10, 0xb5, 0x09, 0xf0, 0x5f, 0xfc, 0x00, 0x20, 0x05, 0xf0, 0x2a, 0xf9, 0x03, 0x4c, 0xe0, 0x8a, 0x05, 0xf0, 0x36, 0xf9, 0x20, 0x1c, 0x0f, 0xf0, 0xb3, 0xfe, 0x10, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x1c, 0xb5, 0x09, 0xf0, 0x4f, 0xfc, 0x07, 0x20, 0x3c, 0x00, 0x94, 0x20, 0x00, 0x00, 0x00, 0xab, 0x07, 0x4c, 0x18, 0x80, 0xe1, 0x8a, 0x20, 0x1c, 0x0c, 0xf0, 0x0b, 0xf8, 0x01, 0x90, 0x68, 0x46, 0x0b, 0xf0, 0x17, 0xfa, 0x20, 0x1c, 0x0f, 0xf0, 0x9e, 0xfe, 0x1c, 0xbd, 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x98, 0x20, 0xff, 0xf7, 0xf1, 0xf8, 0x80, 0xbd, 0x10, 0xb5, 0x15, 0x4c, 0xc2, 0xb0, 0xa0, 0x8a, 0x00, 0x28, 0x03, 0xd0, 0x3c, 0x00, 0xd0, 0x20, 0x00, 0x00, 0x01, 0x28, 0x1e, 0xd1, 0x02, 0x20, 0x00, 0xe0, 0x01, 0x20, 0xe1, 0x68, 0x40, 0x31, 0x88, 0x72, 0x20, 0x69, 0x08, 0xf0, 0x23, 0xfd, 0x02, 0x1c, 0x0c, 0x48, 0x18, 0x38, 0x80, 0x88, 0xe1, 0x68, 0x0f, 0xf0, 0xa4, 0xfe, 0xa0, 0x8a, 0x00, 0xab, 0x18, 0x80, 0x01, 0x20, 0x58, 0x80, 0x00, 0x20, 0x98, 0x80, 0xff, 0x21, 0x99, 0x71, 0xd8, 0x71, 0x68, 0x46, 0x00, 0xf0, 0x3c, 0x00, 0x0c, 0x21, 0x00, 0x00, 0x7b, 0xf9, 0x42, 0xb0, 0x10, 0xbd, 0x03, 0x21, 0x98, 0x20, 0xff, 0xf7, 0xc5, 0xf8, 0xf8, 0xe7, 0x70, 0x7c, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x03, 0x48, 0x0f, 0xf0, 0x60, 0xfe, 0x00, 0x20, 0x05, 0xf0, 0xcd, 0xf8, 0x80, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x48, 0x0f, 0xf0, 0x56, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x3c, 0x00, 0x48, 0x21, 0x00, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x98, 0x20, 0xff, 0xf7, 0xa9, 0xf8, 0x80, 0xbd, 0x80, 0xb5, 0x03, 0x20, 0xff, 0xf7, 0x34, 0xff, 0x80, 0xbd, 0x00, 0x00, 0xf0, 0xb5, 0x21, 0x4e, 0x00, 0x27, 0xb1, 0x8a, 0x30, 0x1c, 0x00, 0x25, 0x04, 0x24, 0x00, 0x29, 0x00, 0x8b, 0xc3, 0xb0, 0x1e, 0xd1, 0x01, 0x28, 0x07, 0xd0, 0x31, 0x1c, 0x49, 0x8b, 0x02, 0x28, 0x12, 0xd1, 0x00, 0x29, 0x3c, 0x00, 0x84, 0x21, 0x00, 0x00, 0x07, 0xd1, 0x00, 0x24, 0x05, 0xe0, 0x00, 0x24, 0x01, 0x25, 0x02, 0x20, 0x00, 0xab, 0xd8, 0x80, 0x1f, 0x81, 0x0f, 0xf0, 0x7f, 0xff, 0x00, 0x2c, 0x10, 0xd1, 0xf1, 0x68, 0x05, 0x20, 0x40, 0x31, 0x88, 0x72, 0x0e, 0xe0, 0x00, 0x29, 0x1a, 0xd1, 0x00, 0xab, 0xd8, 0x80, 0x0e, 0x20, 0x02, 0xe0, 0x00, 0xab, 0xd8, 0x80, 0x0d, 0x20, 0x00, 0xab, 0x18, 0x81, 0x07, 0xe0, 0x3c, 0x00, 0xc0, 0x21, 0x00, 0x00, 0x30, 0x1c, 0x0f, 0xf0, 0x13, 0xfe, 0x20, 0x1c, 0xff, 0xf7, 0xfc, 0xfe, 0x00, 0x2d, 0x08, 0xd0, 0xb0, 0x8a, 0x00, 0xab, 0x98, 0x80, 0xff, 0x20, 0x98, 0x72, 0xdf, 0x72, 0x01, 0xa8, 0x00, 0xf0, 0x11, 0xf9, 0x43, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x10, 0xb5, 0x00, 0x20, 0x05, 0xf0, 0x6c, 0xf8, 0x04, 0x4c, 0xe0, 0x8a, 0x05, 0xf0, 0x78, 0xf8, 0x3c, 0x00, 0xfc, 0x21, 0x00, 0x00, 0x0f, 0xf0, 0x4c, 0xff, 0x20, 0x1c, 0x0f, 0xf0, 0xf3, 0xfd, 0x10, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x04, 0x20, 0xff, 0xf7, 0xd8, 0xfe, 0x01, 0x48, 0x0f, 0xf0, 0xe9, 0xfd, 0x80, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x20, 0xff, 0xf7, 0xce, 0xfe, 0x01, 0x20, 0x05, 0xf0, 0x5f, 0xf8, 0x02, 0x48, 0x0f, 0xf0, 0xdc, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x22, 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x03, 0x20, 0xff, 0xf7, 0xc0, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x1d, 0x4d, 0xc2, 0xb0, 0x28, 0x8b, 0x00, 0xab, 0xff, 0x21, 0x58, 0x80, 0x99, 0x71, 0x00, 0x21, 0xd9, 0x71, 0xaa, 0x8a, 0x00, 0x24, 0x01, 0x2a, 0x18, 0xd1, 0x2a, 0x1c, 0x52, 0x8b, 0x02, 0x28, 0x0f, 0xd1, 0x00, 0x2a, 0x16, 0xd1, 0x03, 0x20, 0x58, 0x80, 0x3c, 0x00, 0x74, 0x22, 0x00, 0x00, 0x99, 0x80, 0x2c, 0x1c, 0xff, 0x22, 0x98, 0x1d, 0xe9, 0x69, 0xfe, 0xf7, 0x3b, 0xf9, 0xe1, 0x68, 0x04, 0x20, 0x40, 0x31, 0x88, 0x72, 0x10, 0xe0, 0x00, 0x2a, 0x06, 0xd1, 0x01, 0x24, 0x0e, 0x20, 0x01, 0xe0, 0x01, 0x24, 0x0d, 0x20, 0x00, 0xab, 0x98, 0x80, 0x28, 0x1c, 0x0f, 0xf0, 0xa4, 0xfd, 0x04, 0x20, 0xff, 0xf7, 0x8d, 0xfe, 0x00, 0x2c, 0x05, 0xd0, 0xa8, 0x8a, 0x3c, 0x00, 0xb0, 0x22, 0x00, 0x00, 0x00, 0xab, 0x18, 0x80, 0x68, 0x46, 0x00, 0xf0, 0xa5, 0xf8, 0x42, 0xb0, 0xb0, 0xbd, 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x10, 0xb5, 0x00, 0x20, 0x05, 0xf0, 0x00, 0xf8, 0x03, 0x4c, 0xe0, 0x8a, 0x05, 0xf0, 0x0c, 0xf8, 0x20, 0x1c, 0x0f, 0xf0, 0x89, 0xfd, 0x10, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x04, 0x20, 0xff, 0xf7, 0x6e, 0xfe, 0x01, 0x48, 0x0f, 0xf0, 0x3c, 0x00, 0xec, 0x22, 0x00, 0x00, 0x7f, 0xfd, 0x80, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x20, 0xff, 0xf7, 0x64, 0xfe, 0x01, 0x20, 0x04, 0xf0, 0xf5, 0xff, 0x02, 0x48, 0x0f, 0xf0, 0x72, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x03, 0x20, 0xff, 0xf7, 0x56, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x19, 0x4d, 0x04, 0x24, 0xa9, 0x8a, 0x28, 0x1c, 0x02, 0x8b, 0x3c, 0x00, 0x28, 0x23, 0x00, 0x00, 0xc2, 0xb0, 0x01, 0x29, 0x14, 0xd1, 0x40, 0x8b, 0x04, 0x2a, 0x0b, 0xd1, 0x00, 0x28, 0x00, 0xd1, 0x00, 0x24, 0x0f, 0xf0, 0xad, 0xfe, 0x00, 0x2c, 0x19, 0xd1, 0xe9, 0x68, 0x05, 0x20, 0x40, 0x31, 0x88, 0x72, 0x17, 0xe0, 0x00, 0x28, 0x10, 0xd1, 0x00, 0xab, 0x5a, 0x80, 0x0e, 0x20, 0x02, 0xe0, 0x00, 0xab, 0x5a, 0x80, 0x0d, 0x20, 0x00, 0xab, 0x98, 0x80, 0x19, 0x80, 0x3c, 0x00, 0x64, 0x23, 0x00, 0x00, 0xff, 0x20, 0x98, 0x71, 0x00, 0x20, 0xd8, 0x71, 0x68, 0x46, 0x00, 0xf0, 0x49, 0xf8, 0x42, 0xb0, 0xb0, 0xbd, 0x28, 0x1c, 0x0f, 0xf0, 0x38, 0xfd, 0x20, 0x1c, 0xff, 0xf7, 0x21, 0xfe, 0xf6, 0xe7, 0x70, 0x7c, 0x01, 0x00, 0x10, 0xb5, 0x00, 0x20, 0x04, 0xf0, 0x9e, 0xff, 0x03, 0x4c, 0xe0, 0x8a, 0x04, 0xf0, 0xaa, 0xff, 0x20, 0x1c, 0x0f, 0xf0, 0x27, 0xfd, 0x10, 0xbd, 0x3c, 0x00, 0xa0, 0x23, 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x04, 0x20, 0xff, 0xf7, 0x0c, 0xfe, 0x01, 0x48, 0x0f, 0xf0, 0x1d, 0xfd, 0x80, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x20, 0xff, 0xf7, 0x02, 0xfe, 0x01, 0x20, 0x04, 0xf0, 0x93, 0xff, 0x02, 0x48, 0x0f, 0xf0, 0x10, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0xb0, 0xb5, 0x0a, 0x4d, 0x01, 0x1c, 0x44, 0x31, 0x3c, 0x00, 0xdc, 0x23, 0x00, 0x00, 0x04, 0x1c, 0x06, 0x22, 0x28, 0x1c, 0xfe, 0xf7, 0x89, 0xf8, 0xec, 0x60, 0x20, 0x69, 0x03, 0xf0, 0x97, 0xf8, 0x01, 0x1c, 0x06, 0x22, 0xa8, 0x18, 0xfe, 0xf7, 0x80, 0xf8, 0x04, 0x20, 0xff, 0xf7, 0xf7, 0xfd, 0xb0, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x90, 0xb5, 0x04, 0x1c, 0x80, 0x88, 0x93, 0xb0, 0x00, 0x28, 0x06, 0xd0, 0x15, 0x49, 0x06, 0x22, 0x48, 0x80, 0x18, 0x31, 0x3c, 0x00, 0x18, 0x24, 0x00, 0x00, 0x88, 0x1f, 0xfe, 0xf7, 0x6d, 0xf8, 0x68, 0x46, 0x0c, 0xf0, 0x14, 0xf8, 0x20, 0x88, 0x01, 0x28, 0x08, 0xd1, 0x60, 0x88, 0x03, 0x28, 0x05, 0xd1, 0xa0, 0x88, 0x00, 0x28, 0x02, 0xd1, 0x06, 0x20, 0x0c, 0xa9, 0x08, 0x70, 0xa0, 0x79, 0x06, 0x21, 0xff, 0x28, 0x04, 0xd0, 0xe0, 0x79, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x1c, 0x08, 0x31, 0x0b, 0x20, 0x08, 0xaa, 0x50, 0x72, 0x3c, 0x00, 0x54, 0x24, 0x00, 0x00, 0x20, 0x1c, 0x08, 0xf0, 0x3b, 0xff, 0x03, 0x90, 0x68, 0x46, 0x0b, 0xf0, 0x31, 0xf8, 0x13, 0xb0, 0x90, 0xbd, 0x00, 0x00, 0x58, 0x7c, 0x01, 0x00, 0x07, 0x4b, 0x1a, 0x78, 0x82, 0x42, 0x01, 0xd0, 0x00, 0x29, 0x07, 0xd0, 0xff, 0x20, 0x18, 0x70, 0x04, 0x48, 0x01, 0x88, 0x01, 0x22, 0x52, 0x03, 0x91, 0x43, 0x01, 0x80, 0x70, 0x47, 0x00, 0x00, 0x4c, 0x7b, 0x01, 0x00, 0x3c, 0x00, 0x90, 0x24, 0x00, 0x00, 0x32, 0x80, 0x07, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x0c, 0x23, 0x07, 0x49, 0x58, 0x43, 0x40, 0x18, 0x00, 0x79, 0x0a, 0xf0, 0x4f, 0xf9, 0x01, 0x20, 0x03, 0x49, 0xa0, 0x40, 0x08, 0x39, 0x0a, 0x78, 0x10, 0x43, 0x08, 0x70, 0x10, 0xbd, 0x00, 0x00, 0x74, 0x7a, 0x01, 0x00, 0x03, 0x4a, 0x00, 0x21, 0x11, 0x54, 0x80, 0x00, 0x30, 0x32, 0x10, 0x58, 0x01, 0x70, 0x70, 0x47, 0x3c, 0x00, 0xcc, 0x24, 0x00, 0x00, 0xe0, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x05, 0x28, 0x01, 0xd3, 0xfe, 0xf7, 0x12, 0xff, 0x20, 0x1c, 0xff, 0xf7, 0xed, 0xff, 0x00, 0x21, 0x20, 0x1c, 0x0e, 0xf0, 0x89, 0xfb, 0x10, 0xbd, 0x05, 0x49, 0x80, 0xb5, 0x88, 0x60, 0x08, 0x7f, 0x24, 0x23, 0x04, 0x49, 0x58, 0x43, 0x08, 0x58, 0xfd, 0xf7, 0x6c, 0xff, 0x80, 0xbd, 0x00, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x3c, 0x00, 0x08, 0x25, 0x00, 0x00, 0x94, 0x46, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x21, 0x91, 0x20, 0xfe, 0xf7, 0xc7, 0xfe, 0x80, 0xbd, 0x02, 0x4a, 0x11, 0x68, 0x81, 0x43, 0x11, 0x60, 0x70, 0x47, 0x00, 0x00, 0x78, 0x6e, 0x01, 0x00, 0x80, 0xb5, 0xfe, 0xf7, 0xe9, 0xfe, 0x80, 0xbd, 0x80, 0xb5, 0xfe, 0xf7, 0xe5, 0xfe, 0x80, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x31, 0xfa, 0x80, 0xbd, 0x03, 0x49, 0x80, 0xb5, 0x3c, 0x00, 0x44, 0x25, 0x00, 0x00, 0x04, 0x20, 0x88, 0x60, 0x00, 0xf0, 0xd0, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x30, 0x07, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x99, 0xfa, 0x80, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x99, 0xfb, 0x80, 0xbd, 0x38, 0xb5, 0x20, 0x28, 0x15, 0xd2, 0x0d, 0x4c, 0x22, 0x1c, 0x20, 0x32, 0x95, 0x79, 0x00, 0xab, 0x1d, 0x70, 0xd2, 0x79, 0x5a, 0x70, 0x0a, 0x4b, 0x82, 0x00, 0x99, 0x50, 0x3c, 0x00, 0x80, 0x25, 0x00, 0x00, 0x01, 0x21, 0x81, 0x40, 0x08, 0x48, 0x01, 0x60, 0x42, 0x68, 0x11, 0x43, 0x41, 0x60, 0x00, 0xab, 0x18, 0x88, 0xe0, 0x84, 0x38, 0xbd, 0x01, 0x21, 0xff, 0x20, 0xfe, 0xf7, 0x83, 0xfe, 0xf9, 0xe7, 0x00, 0x10, 0x07, 0x00, 0x30, 0x74, 0x01, 0x00, 0x00, 0x40, 0x07, 0x00, 0x20, 0x28, 0x09, 0xd2, 0x05, 0x49, 0x06, 0x4b, 0x82, 0x00, 0x99, 0x50, 0x05, 0x4a, 0x51, 0x68, 0x3c, 0x00, 0xbc, 0x25, 0x00, 0x00, 0x01, 0x23, 0x83, 0x40, 0x99, 0x43, 0x51, 0x60, 0x70, 0x47, 0x00, 0x00, 0xa9, 0x75, 0x00, 0x00, 0x30, 0x74, 0x01, 0x00, 0x00, 0x40, 0x07, 0x00, 0x02, 0x4a, 0x11, 0x68, 0x08, 0x43, 0x10, 0x60, 0x70, 0x47, 0x00, 0x00, 0x78, 0x6e, 0x01, 0x00, 0x0b, 0x48, 0x01, 0x68, 0x03, 0x22, 0x12, 0x04, 0x11, 0x43, 0x01, 0x60, 0x01, 0x68, 0x07, 0x22, 0x12, 0x06, 0x91, 0x43, 0x3c, 0x00, 0xf8, 0x25, 0x00, 0x00, 0x01, 0x22, 0x52, 0x06, 0x89, 0x18, 0x01, 0x60, 0x01, 0x68, 0x12, 0x0c, 0x11, 0x43, 0x01, 0x60, 0x01, 0x68, 0x52, 0x08, 0x11, 0x43, 0x01, 0x60, 0x70, 0x47, 0x00, 0x00, 0x80, 0x00, 0x07, 0x00, 0xfe, 0xb5, 0x1c, 0x4e, 0x05, 0x1c, 0xb0, 0x8a, 0xf2, 0x68, 0x12, 0xd0, 0x01, 0x24, 0x00, 0x29, 0x09, 0xd1, 0x11, 0x6d, 0x02, 0xaa, 0x01, 0xab, 0xfe, 0xf7, 0xf8, 0xfe, 0x3c, 0x00, 0x34, 0x26, 0x00, 0x00, 0x02, 0x98, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x24, 0x0b, 0xe0, 0x01, 0xaa, 0x02, 0xa9, 0x28, 0x1c, 0xfe, 0xf7, 0x70, 0xff, 0x05, 0xe0, 0x11, 0x6d, 0x02, 0xaa, 0x00, 0x24, 0x01, 0xab, 0xfe, 0xf7, 0x01, 0xff, 0x0e, 0x49, 0x08, 0x1c, 0x20, 0x30, 0x82, 0x79, 0x00, 0xab, 0x1a, 0x70, 0xc0, 0x79, 0x58, 0x70, 0x30, 0x68, 0x00, 0x28, 0x02, 0xd1, 0x02, 0x98, 0x30, 0x60, 0x3c, 0x00, 0x70, 0x26, 0x00, 0x00, 0x02, 0xe0, 0x02, 0x98, 0x72, 0x68, 0xd0, 0x60, 0x01, 0x98, 0x00, 0xab, 0x70, 0x60, 0x18, 0x88, 0xc8, 0x84, 0xf0, 0x68, 0xc0, 0x6c, 0xf0, 0x60, 0x20, 0x1c, 0xfe, 0xbd, 0x24, 0x7e, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0x54, 0x27, 0x1d, 0x4e, 0x00, 0x20, 0x30, 0x60, 0x70, 0x60, 0x67, 0x43, 0x38, 0x04, 0x15, 0x1c, 0x00, 0x0c, 0xb1, 0x82, 0x3c, 0x00, 0xac, 0x26, 0x00, 0x00, 0xff, 0xf7, 0x96, 0xf8, 0x08, 0x21, 0x30, 0x61, 0x00, 0x26, 0x17, 0x4a, 0x14, 0xe0, 0x03, 0x1c, 0x24, 0x33, 0x42, 0x61, 0x03, 0x61, 0xc6, 0x61, 0x01, 0x83, 0x08, 0x33, 0x03, 0x60, 0xb1, 0x23, 0x43, 0x60, 0x03, 0x1c, 0x64, 0x33, 0xc3, 0x60, 0x0c, 0x23, 0x03, 0x81, 0x03, 0x1c, 0x54, 0x33, 0x4c, 0x30, 0x28, 0xc0, 0x01, 0x3c, 0x18, 0x1c, 0x00, 0x2c, 0xe8, 0xd1, 0x3c, 0x00, 0xe8, 0x26, 0x00, 0x00, 0x09, 0x4e, 0x07, 0x22, 0x30, 0x69, 0xd2, 0x43, 0xc1, 0x19, 0x50, 0x50, 0x02, 0x1c, 0x10, 0x32, 0x80, 0x39, 0x8a, 0x63, 0xf0, 0x60, 0xb0, 0x60, 0x00, 0x21, 0x00, 0x20, 0xff, 0xf7, 0x88, 0xff, 0x30, 0x69, 0xf0, 0x60, 0xb0, 0x60, 0xf8, 0xbd, 0x24, 0x7e, 0x01, 0x00, 0x91, 0x00, 0x05, 0x00, 0x01, 0x48, 0x40, 0x6a, 0x70, 0x47, 0x00, 0x00, 0xe8, 0x7d, 0x01, 0x00, 0x3c, 0x00, 0x24, 0x27, 0x00, 0x00, 0x01, 0x48, 0x00, 0x88, 0x70, 0x47, 0x00, 0x00, 0xfc, 0x6b, 0x01, 0x00, 0x06, 0x49, 0x80, 0xb5, 0x08, 0x88, 0x01, 0x30, 0x08, 0x80, 0x05, 0x49, 0x08, 0x20, 0x08, 0x60, 0x04, 0x49, 0x88, 0x69, 0x88, 0x61, 0x00, 0xf0, 0x21, 0xf8, 0x80, 0xbd, 0xfc, 0x6b, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, 0x03, 0x4a, 0x01, 0x20, 0x12, 0x1d, 0x06, 0xca, 0x3c, 0x00, 0x60, 0x27, 0x00, 0x00, 0x91, 0x42, 0x00, 0xd1, 0x00, 0x20, 0x70, 0x47, 0xe8, 0x7d, 0x01, 0x00, 0x06, 0x48, 0x00, 0xb5, 0xc0, 0x7c, 0x00, 0x28, 0x03, 0xd1, 0xff, 0xf7, 0xef, 0xff, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x20, 0x00, 0xbd, 0x00, 0x20, 0x00, 0xbd, 0x00, 0x00, 0xa0, 0x80, 0x07, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x80, 0x07, 0x02, 0xd5, 0x06, 0xf0, 0x3e, 0xfd, 0x03, 0xe0, 0xe0, 0x07, 0x3c, 0x00, 0x9c, 0x27, 0x00, 0x00, 0x01, 0xd5, 0x06, 0xf0, 0xe3, 0xfd, 0x60, 0x07, 0x01, 0xd5, 0xfe, 0xf7, 0xab, 0xfd, 0x10, 0xbd, 0x02, 0x4a, 0x01, 0x1c, 0x10, 0x68, 0x11, 0x60, 0x70, 0x47, 0x00, 0x00, 0xe8, 0x7d, 0x01, 0x00, 0x38, 0xb5, 0x20, 0x4d, 0x2c, 0x1c, 0x20, 0x34, 0xa0, 0x79, 0x00, 0xab, 0x18, 0x70, 0xe0, 0x79, 0x58, 0x70, 0xfe, 0xf7, 0x27, 0xfa, 0x00, 0xab, 0x18, 0x88, 0xe8, 0x84, 0x3c, 0x00, 0xd8, 0x27, 0x00, 0x00, 0x1a, 0x48, 0x81, 0x78, 0x08, 0x22, 0x91, 0x43, 0x81, 0x70, 0x81, 0x78, 0x11, 0x43, 0x81, 0x70, 0x17, 0x48, 0x41, 0x68, 0x80, 0x22, 0x91, 0x43, 0x41, 0x60, 0x01, 0x68, 0x11, 0x43, 0x01, 0x60, 0x00, 0x20, 0x01, 0x30, 0x64, 0x28, 0xfc, 0xd3, 0xa0, 0x79, 0x0f, 0x4d, 0x00, 0xab, 0x18, 0x70, 0xe0, 0x79, 0x10, 0x4c, 0x58, 0x70, 0x20, 0x1c, 0x10, 0x30, 0x00, 0xf0, 0x3c, 0x00, 0x14, 0x28, 0x00, 0x00, 0xdf, 0xfb, 0x00, 0x20, 0xc0, 0x43, 0xa0, 0x61, 0xff, 0xf7, 0x9c, 0xff, 0x00, 0x28, 0x09, 0xd0, 0x0a, 0x49, 0x08, 0x69, 0x01, 0x30, 0x08, 0x61, 0x00, 0x20, 0x3c, 0x31, 0x89, 0x68, 0x48, 0x63, 0x06, 0xf0, 0xee, 0xfc, 0x00, 0xab, 0x18, 0x88, 0xe8, 0x84, 0x38, 0xbd, 0x00, 0x10, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0xf4, 0x00, 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, 0x3c, 0x00, 0x50, 0x28, 0x00, 0x00, 0xe8, 0x7d, 0x01, 0x00, 0x0a, 0x48, 0x80, 0xb5, 0x00, 0x6a, 0x00, 0x28, 0x01, 0xd0, 0xfe, 0xf7, 0xc1, 0xf9, 0x07, 0x48, 0x07, 0x49, 0x3c, 0x30, 0x80, 0x68, 0x10, 0x30, 0x48, 0x61, 0x01, 0x20, 0x08, 0x61, 0x05, 0x49, 0x08, 0x68, 0x80, 0x22, 0x90, 0x43, 0x08, 0x60, 0x80, 0xbd, 0x00, 0x00, 0xe8, 0x7d, 0x01, 0x00, 0x00, 0x30, 0x07, 0x00, 0xf4, 0x00, 0x07, 0x00, 0x3c, 0x00, 0x8c, 0x28, 0x00, 0x00, 0x80, 0xb5, 0x0c, 0xf0, 0xcb, 0xfe, 0x06, 0xf0, 0xbf, 0xfc, 0x80, 0xbd, 0x01, 0x49, 0xc8, 0x62, 0x70, 0x47, 0x00, 0x00, 0xe8, 0x7d, 0x01, 0x00, 0x02, 0x4a, 0x91, 0x6a, 0x08, 0x43, 0x90, 0x62, 0x70, 0x47, 0x00, 0x00, 0xe8, 0x7d, 0x01, 0x00, 0x18, 0x23, 0x06, 0x49, 0x58, 0x43, 0x40, 0x18, 0x00, 0x21, 0x02, 0x79, 0x03, 0x68, 0x1a, 0x70, 0x01, 0x31, 0x08, 0x30, 0x3c, 0x00, 0xc8, 0x28, 0x00, 0x00, 0x03, 0x29, 0xf8, 0xd3, 0x70, 0x47, 0x00, 0x00, 0x28, 0x52, 0x01, 0x00, 0x03, 0x49, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x02, 0x48, 0x81, 0x62, 0x70, 0x47, 0x00, 0x00, 0x85, 0x75, 0x00, 0x00, 0x04, 0x6c, 0x01, 0x00, 0xf8, 0xb5, 0xff, 0xf7, 0x33, 0xff, 0x28, 0x4f, 0x00, 0x28, 0x04, 0xd0, 0xff, 0xf7, 0xc8, 0xff, 0x38, 0x6a, 0x01, 0x30, 0x38, 0x62, 0xf8, 0x6a, 0x3c, 0x00, 0x04, 0x29, 0x00, 0x00, 0x00, 0x28, 0x02, 0xd0, 0x01, 0x89, 0x04, 0x39, 0x01, 0x81, 0x38, 0x6b, 0x00, 0x25, 0x00, 0x28, 0x08, 0xd0, 0x0b, 0x20, 0x3d, 0x63, 0x10, 0xf0, 0xe5, 0xfa, 0x1e, 0x49, 0x08, 0x68, 0x21, 0x22, 0x90, 0x43, 0x08, 0x60, 0x38, 0x78, 0x3c, 0x21, 0x1b, 0x4a, 0x41, 0x43, 0x8c, 0x18, 0xff, 0x22, 0x79, 0x6a, 0x3a, 0x70, 0x00, 0x29, 0x0c, 0xd0, 0xb9, 0x69, 0x01, 0x31, 0x3c, 0x00, 0x40, 0x29, 0x00, 0x00, 0xb9, 0x61, 0x7d, 0x62, 0xbd, 0x68, 0x00, 0x2d, 0x04, 0xd0, 0x63, 0x6b, 0x7a, 0x6b, 0x00, 0x21, 0xfd, 0xf7, 0x47, 0xfd, 0xf8, 0xbd, 0x04, 0x28, 0x03, 0xd3, 0x01, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0xa1, 0xfc, 0x38, 0x69, 0x26, 0x1c, 0x01, 0x30, 0x38, 0x61, 0x20, 0x36, 0x30, 0x78, 0x02, 0x28, 0x03, 0xd0, 0x0c, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0x95, 0xfc, 0x35, 0x70, 0x3c, 0x00, 0x7c, 0x29, 0x00, 0x00, 0xa1, 0x69, 0x00, 0x29, 0xe8, 0xd0, 0x63, 0x6b, 0x30, 0x34, 0x20, 0x78, 0x0c, 0x1c, 0x00, 0x21, 0x7a, 0x6b, 0xfd, 0xf7, 0x27, 0xfd, 0xdf, 0xe7, 0x04, 0x6c, 0x01, 0x00, 0xf4, 0x00, 0x07, 0x00, 0x18, 0xdb, 0x01, 0x00, 0x10, 0xb5, 0x0b, 0x4c, 0x60, 0x6a, 0x00, 0x28, 0x0e, 0xd0, 0x0a, 0x48, 0x00, 0xf0, 0x12, 0xfb, 0x00, 0x20, 0x60, 0x62, 0xa4, 0x68, 0x00, 0x2c, 0x3c, 0x00, 0xb8, 0x29, 0x00, 0x00, 0x05, 0xd0, 0x7e, 0x23, 0xdb, 0x43, 0x00, 0x22, 0x01, 0x21, 0xfd, 0xf7, 0x0d, 0xfd, 0x10, 0xbd, 0xe0, 0x69, 0x01, 0x30, 0xe0, 0x61, 0x10, 0xbd, 0x04, 0x6c, 0x01, 0x00, 0x00, 0x30, 0x07, 0x00, 0x09, 0x48, 0x41, 0x68, 0x3f, 0x22, 0x12, 0x04, 0x91, 0x43, 0x0d, 0x22, 0x12, 0x04, 0x89, 0x18, 0x41, 0x60, 0x41, 0x68, 0x01, 0x22, 0x52, 0x02, 0x91, 0x43, 0x41, 0x60, 0x3c, 0x00, 0xf4, 0x29, 0x00, 0x00, 0x03, 0x48, 0x81, 0x78, 0x81, 0x70, 0x81, 0x78, 0x81, 0x70, 0x70, 0x47, 0x80, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0xf0, 0xb5, 0x01, 0x25, 0x08, 0x24, 0x00, 0x20, 0x0e, 0x4a, 0x0f, 0x49, 0x00, 0x26, 0x3c, 0x23, 0x43, 0x43, 0xd1, 0x52, 0x9b, 0x18, 0x5d, 0x71, 0x9b, 0x60, 0x5e, 0x61, 0x1c, 0x82, 0xc0, 0x27, 0xdf, 0x60, 0x20, 0x27, 0xfe, 0x54, 0x9e, 0x61, 0x3c, 0x00, 0x30, 0x2a, 0x00, 0x00, 0x30, 0x27, 0xfe, 0x54, 0x07, 0x4f, 0x3f, 0x18, 0x20, 0x37, 0x01, 0x30, 0x05, 0x28, 0x9f, 0x63, 0xe9, 0xd3, 0x05, 0x48, 0xff, 0x32, 0x01, 0x32, 0x90, 0x62, 0xf0, 0xbd, 0x18, 0xdb, 0x01, 0x00, 0xbe, 0xba, 0x00, 0x00, 0x30, 0x80, 0x07, 0x00, 0x06, 0x6c, 0x01, 0x00, 0x01, 0x49, 0x48, 0x60, 0x70, 0x47, 0x00, 0x00, 0x04, 0x6c, 0x01, 0x00, 0x05, 0x49, 0x08, 0x5c, 0x3c, 0x00, 0x6c, 0x2a, 0x00, 0x00, 0x05, 0x49, 0x49, 0x68, 0x40, 0x18, 0xc0, 0x06, 0xc0, 0x0e, 0x04, 0x49, 0x20, 0x30, 0x48, 0x72, 0x70, 0x47, 0x00, 0x00, 0xa0, 0x57, 0x01, 0x00, 0x04, 0x6c, 0x01, 0x00, 0x00, 0x80, 0x07, 0x00, 0x80, 0xb5, 0x15, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0x07, 0xfc, 0x80, 0xbd, 0xf8, 0xb5, 0x43, 0x48, 0x84, 0x68, 0x03, 0x34, 0x42, 0x4d, 0x04, 0xe0, 0x20, 0x1c, 0x10, 0xf0, 0x3c, 0x00, 0xa8, 0x2a, 0x00, 0x00, 0xb9, 0xf8, 0x00, 0x28, 0x71, 0xd1, 0x28, 0x69, 0xc0, 0x07, 0xf7, 0xd5, 0x3e, 0x48, 0x28, 0x60, 0x3e, 0x4a, 0x14, 0x1c, 0x20, 0x34, 0x20, 0x79, 0x00, 0x90, 0x3c, 0x23, 0x3c, 0x49, 0x58, 0x43, 0x45, 0x18, 0x28, 0x79, 0xff, 0xf7, 0xcc, 0xff, 0x28, 0x1c, 0x3a, 0x49, 0x08, 0x30, 0x48, 0x60, 0x01, 0x26, 0x08, 0x1c, 0x06, 0x60, 0x68, 0x6a, 0x00, 0x28, 0x0d, 0xd0, 0x3c, 0x00, 0xe4, 0x2a, 0x00, 0x00, 0xa9, 0x6a, 0x92, 0x6a, 0x35, 0x4b, 0x9f, 0x68, 0xd7, 0x1b, 0x1a, 0x68, 0x51, 0x18, 0x79, 0x18, 0x8a, 0x42, 0x5a, 0x68, 0x00, 0xd8, 0x00, 0xe0, 0x01, 0x32, 0x06, 0xc0, 0xe8, 0x6a, 0xfe, 0xf7, 0x87, 0xff, 0x2d, 0x49, 0xe8, 0x6a, 0x48, 0x60, 0x30, 0x1c, 0x0e, 0x60, 0x66, 0x79, 0x1f, 0xe0, 0x2b, 0x48, 0x46, 0x61, 0x04, 0x7f, 0x29, 0x49, 0x20, 0x1c, 0x50, 0x39, 0x3c, 0x00, 0x20, 0x2b, 0x00, 0x00, 0x89, 0x6a, 0xfd, 0xf7, 0x5a, 0xfc, 0x00, 0x98, 0x84, 0x42, 0x10, 0xd0, 0x3c, 0x20, 0x22, 0x49, 0x60, 0x43, 0x40, 0x18, 0x87, 0x69, 0x00, 0x2f, 0x09, 0xd0, 0x00, 0x21, 0x20, 0x30, 0x01, 0x70, 0x7e, 0x23, 0xdb, 0x43, 0x02, 0x21, 0x00, 0x22, 0x20, 0x1c, 0xfd, 0xf7, 0x4c, 0xfc, 0x01, 0x20, 0xa0, 0x40, 0x86, 0x43, 0x00, 0x2e, 0xdd, 0xd1, 0xe9, 0x69, 0x00, 0x29, 0x3c, 0x00, 0x5c, 0x2b, 0x00, 0x00, 0x03, 0xd0, 0x30, 0x20, 0x40, 0x5d, 0xfd, 0xf7, 0x3a, 0xfc, 0x16, 0x4c, 0x50, 0x3c, 0x60, 0x6a, 0x00, 0x28, 0x03, 0xd0, 0x0a, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0x96, 0xfb, 0x20, 0x35, 0x28, 0x78, 0x01, 0x28, 0x03, 0xd0, 0x0b, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0x8e, 0xfb, 0x02, 0x20, 0x28, 0x70, 0xe0, 0x68, 0x01, 0x30, 0x00, 0xe0, 0x07, 0xe0, 0xe0, 0x60, 0x00, 0x98, 0x3c, 0x00, 0x98, 0x2b, 0x00, 0x00, 0x20, 0x70, 0x00, 0x98, 0x60, 0x70, 0x0a, 0x48, 0x00, 0x68, 0x60, 0x63, 0xf8, 0xbd, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x40, 0x07, 0x00, 0x01, 0x00, 0x00, 0x01, 0x30, 0x80, 0x07, 0x00, 0x18, 0xdb, 0x01, 0x00, 0x00, 0x30, 0x07, 0x00, 0x54, 0x6c, 0x01, 0x00, 0x00, 0xa0, 0x07, 0x00, 0x78, 0x6e, 0x01, 0x00, 0x3c, 0x22, 0x3c, 0x23, 0x4a, 0x43, 0x09, 0x49, 0x3c, 0x00, 0xd4, 0x2b, 0x00, 0x00, 0xb0, 0xb5, 0x54, 0x18, 0x58, 0x43, 0x45, 0x18, 0x21, 0x1c, 0x38, 0x22, 0x28, 0x1c, 0xfd, 0xf7, 0xe5, 0xfc, 0xa0, 0x6b, 0x00, 0x78, 0xa9, 0x6b, 0x08, 0x70, 0x00, 0x20, 0x20, 0x34, 0x20, 0x70, 0xb0, 0xbd, 0x00, 0x00, 0x18, 0xdb, 0x01, 0x00, 0x3c, 0x23, 0x07, 0x49, 0x58, 0x43, 0x10, 0xb5, 0x44, 0x18, 0x20, 0x34, 0x20, 0x78, 0x02, 0x28, 0x03, 0xd1, 0x0d, 0x21, 0x3c, 0x00, 0x10, 0x2c, 0x00, 0x00, 0x84, 0x20, 0xfe, 0xf7, 0x47, 0xfb, 0x00, 0x20, 0x20, 0x70, 0x10, 0xbd, 0x18, 0xdb, 0x01, 0x00, 0xff, 0xb5, 0x3c, 0x20, 0x48, 0x43, 0x1a, 0x49, 0x81, 0xb0, 0x44, 0x18, 0x26, 0x1c, 0x20, 0x36, 0x30, 0x78, 0x15, 0x1c, 0x0f, 0x9f, 0x02, 0x28, 0x03, 0xd1, 0x04, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0x31, 0xfb, 0x01, 0x20, 0x30, 0x70, 0x25, 0x71, 0x0b, 0x99, 0x30, 0x22, 0x3c, 0x00, 0x4c, 0x2c, 0x00, 0x00, 0x61, 0x80, 0x0a, 0x99, 0xe1, 0x62, 0x0d, 0x99, 0xa1, 0x61, 0x0c, 0x99, 0xe1, 0x61, 0x0e, 0x99, 0x61, 0x62, 0xa7, 0x62, 0x01, 0x99, 0x11, 0x55, 0x7e, 0x21, 0xc9, 0x43, 0x61, 0x63, 0x04, 0x99, 0x00, 0x29, 0x00, 0xd1, 0x00, 0x20, 0x06, 0x1c, 0x28, 0x1c, 0x08, 0xf0, 0x8b, 0xf8, 0x00, 0x28, 0x01, 0xd0, 0x02, 0x20, 0x00, 0xe0, 0x00, 0x20, 0xa1, 0x6b, 0x30, 0x43, 0x3c, 0x00, 0x88, 0x2c, 0x00, 0x00, 0x08, 0x70, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0x18, 0xdb, 0x01, 0x00, 0x80, 0xb5, 0x14, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0x03, 0xfb, 0x80, 0xbd, 0x01, 0x48, 0x40, 0x78, 0x70, 0x47, 0x00, 0x00, 0x04, 0x6c, 0x01, 0x00, 0x02, 0x48, 0x00, 0x69, 0xc0, 0x07, 0xc0, 0x0f, 0x70, 0x47, 0x00, 0x00, 0x00, 0x40, 0x07, 0x00, 0x01, 0x1c, 0x3c, 0x23, 0x04, 0x4a, 0x59, 0x43, 0x3c, 0x00, 0xc4, 0x2c, 0x00, 0x00, 0x89, 0x18, 0x20, 0x31, 0x09, 0x78, 0x01, 0x20, 0x00, 0x29, 0x00, 0xd0, 0x00, 0x20, 0x70, 0x47, 0x18, 0xdb, 0x01, 0x00, 0x08, 0x48, 0x40, 0x6a, 0x00, 0x28, 0x0a, 0xd1, 0x07, 0x4a, 0x00, 0x21, 0x20, 0x23, 0x9b, 0x5c, 0x02, 0x2b, 0x04, 0xd0, 0x01, 0x31, 0x3c, 0x32, 0x05, 0x29, 0xf7, 0xd3, 0x70, 0x47, 0x01, 0x20, 0x70, 0x47, 0x00, 0x00, 0x04, 0x6c, 0x01, 0x00, 0x3c, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x18, 0xdb, 0x01, 0x00, 0xf8, 0xb5, 0x0e, 0x1c, 0x04, 0x1c, 0x17, 0x1c, 0xfe, 0xf7, 0x82, 0xfe, 0x20, 0x1c, 0x11, 0x4c, 0x60, 0x60, 0x01, 0x20, 0x20, 0x60, 0x10, 0x4d, 0x68, 0x69, 0x01, 0x30, 0x68, 0x61, 0x68, 0x6a, 0x00, 0x28, 0x03, 0xd0, 0x07, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0xba, 0xfa, 0xa0, 0x68, 0x40, 0x07, 0x03, 0xd5, 0x06, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0x3c, 0x00, 0x3c, 0x2d, 0x00, 0x00, 0xb3, 0xfa, 0x08, 0x48, 0x00, 0x69, 0x00, 0x28, 0x03, 0xda, 0xaa, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0xab, 0xfa, 0x02, 0x20, 0x68, 0x62, 0xae, 0x60, 0x2f, 0x70, 0xf8, 0xbd, 0x00, 0x30, 0x07, 0x00, 0x04, 0x6c, 0x01, 0x00, 0x00, 0x40, 0x07, 0x00, 0x04, 0x4a, 0x51, 0x80, 0x10, 0x71, 0x03, 0x48, 0x03, 0x49, 0x08, 0x30, 0x48, 0x60, 0x01, 0x20, 0x08, 0x60, 0x70, 0x47, 0x3c, 0x00, 0x78, 0x2d, 0x00, 0x00, 0x3c, 0x6c, 0x01, 0x00, 0x00, 0x30, 0x07, 0x00, 0x00, 0x21, 0x00, 0x23, 0x05, 0xe0, 0x02, 0x89, 0x43, 0x60, 0xc0, 0x68, 0x51, 0x18, 0x09, 0x04, 0x09, 0x0c, 0x00, 0x28, 0xf7, 0xd1, 0x04, 0x31, 0x08, 0x04, 0x00, 0x0c, 0x70, 0x47, 0x00, 0x00, 0x02, 0x4a, 0x51, 0x6b, 0x08, 0x43, 0x50, 0x63, 0x70, 0x47, 0x00, 0x00, 0x04, 0x6c, 0x01, 0x00, 0x38, 0xb5, 0x0a, 0x4c, 0x3c, 0x00, 0xb4, 0x2d, 0x00, 0x00, 0x22, 0x1c, 0x20, 0x32, 0x95, 0x79, 0x00, 0xab, 0x1d, 0x70, 0xd2, 0x79, 0x5a, 0x70, 0x03, 0x68, 0x40, 0x68, 0x06, 0x4a, 0x50, 0x65, 0x05, 0x48, 0x13, 0x65, 0x50, 0x30, 0x81, 0x60, 0x00, 0xab, 0x18, 0x88, 0xe0, 0x84, 0x38, 0xbd, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x04, 0x6c, 0x01, 0x00, 0x98, 0xb5, 0x0d, 0x4c, 0x20, 0x1c, 0x20, 0x30, 0x81, 0x79, 0x00, 0xab, 0x3c, 0x00, 0xf0, 0x2d, 0x00, 0x00, 0x19, 0x70, 0xc0, 0x79, 0x58, 0x70, 0x0a, 0x48, 0x00, 0xf0, 0xec, 0xf8, 0x09, 0x49, 0x00, 0x20, 0x48, 0x62, 0xff, 0xf7, 0x69, 0xff, 0x00, 0x28, 0x03, 0xd0, 0x12, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0x49, 0xfa, 0x00, 0xab, 0x18, 0x88, 0xe0, 0x84, 0x98, 0xbd, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, 0x04, 0x6c, 0x01, 0x00, 0x03, 0x48, 0x01, 0x7a, 0x3c, 0x00, 0x2c, 0x2e, 0x00, 0x00, 0xfe, 0x22, 0x91, 0x43, 0x0a, 0x31, 0x01, 0x72, 0x70, 0x47, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x90, 0xb5, 0x0e, 0x4c, 0x85, 0xb0, 0xa0, 0x78, 0x02, 0x28, 0x14, 0xd1, 0x03, 0x20, 0xa0, 0x70, 0x0b, 0x49, 0x00, 0x20, 0x00, 0x22, 0x04, 0x92, 0x02, 0x90, 0x03, 0x91, 0xe1, 0x88, 0x01, 0x22, 0x01, 0x92, 0x00, 0x91, 0x61, 0x78, 0x20, 0x78, 0x22, 0x69, 0xe3, 0x68, 0x3c, 0x00, 0x68, 0x2e, 0x00, 0x00, 0x08, 0xf0, 0x94, 0xfd, 0x04, 0x48, 0x09, 0xf0, 0x7f, 0xf9, 0x05, 0xb0, 0x90, 0xbd, 0x00, 0x00, 0xb4, 0x79, 0x01, 0x00, 0xad, 0xb6, 0x00, 0x00, 0x71, 0xb6, 0x00, 0x00, 0xb0, 0xb5, 0x0c, 0x4d, 0xac, 0x79, 0x0c, 0x49, 0x09, 0x78, 0x00, 0x29, 0x03, 0xd0, 0x01, 0x29, 0x0e, 0xd0, 0x02, 0x29, 0x08, 0xd1, 0xc2, 0x88, 0x00, 0x2a, 0x09, 0xd0, 0x01, 0x23, 0x81, 0x68, 0x3c, 0x00, 0xa4, 0x2e, 0x00, 0x00, 0x02, 0x20, 0x0f, 0xf0, 0xc1, 0xf8, 0x03, 0xe0, 0x02, 0x21, 0x86, 0x20, 0xfe, 0xf7, 0xf8, 0xf9, 0xac, 0x71, 0xb0, 0xbd, 0x20, 0x10, 0x07, 0x00, 0xa0, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x68, 0x07, 0x49, 0x4a, 0x60, 0x03, 0x79, 0xca, 0x78, 0xcb, 0x70, 0x00, 0x79, 0x90, 0x42, 0x06, 0xd0, 0x03, 0x48, 0x14, 0x30, 0x00, 0x89, 0x07, 0xf0, 0x27, 0xfe, 0x06, 0xf0, 0x3c, 0x00, 0xe0, 0x2e, 0x00, 0x00, 0xab, 0xfa, 0x80, 0xbd, 0x84, 0x66, 0x01, 0x00, 0x70, 0xb5, 0x16, 0x4c, 0x15, 0x4d, 0xa0, 0x78, 0x00, 0x26, 0x98, 0x3d, 0x01, 0x28, 0x03, 0xd1, 0x28, 0x69, 0x08, 0xf0, 0xfb, 0xfc, 0xa6, 0x70, 0x60, 0x68, 0x01, 0x28, 0x03, 0xd0, 0x00, 0x21, 0x28, 0x69, 0x00, 0xf0, 0xff, 0xfb, 0x0e, 0x48, 0x29, 0x69, 0x0c, 0xf0, 0x31, 0xfa, 0x01, 0x20, 0x0c, 0xf0, 0xe4, 0xf8, 0x3c, 0x00, 0x1c, 0x2f, 0x00, 0x00, 0xe0, 0x78, 0x01, 0x28, 0x02, 0xd0, 0x01, 0x20, 0x60, 0x70, 0x00, 0xe0, 0x66, 0x70, 0x06, 0x48, 0x14, 0x30, 0x41, 0x68, 0x01, 0x29, 0x06, 0xd1, 0x06, 0x60, 0x41, 0x6f, 0x00, 0x29, 0x02, 0xd0, 0x00, 0x20, 0xfd, 0xf7, 0x4c, 0xfa, 0x70, 0xbd, 0x84, 0x66, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x30, 0xb5, 0x00, 0x22, 0x00, 0x23, 0x01, 0x25, 0x2c, 0x1c, 0x94, 0x40, 0x3c, 0x00, 0x58, 0x2f, 0x00, 0x00, 0x04, 0x40, 0x01, 0xd0, 0xca, 0x54, 0x01, 0x33, 0x01, 0x32, 0x0e, 0x2a, 0xf6, 0xdb, 0x18, 0x1c, 0x30, 0xbd, 0x00, 0x00, 0xff, 0xb5, 0x01, 0x27, 0x00, 0x26, 0x05, 0x1c, 0x02, 0x20, 0x81, 0xb0, 0x00, 0x90, 0x00, 0x2d, 0x18, 0xd0, 0x28, 0x78, 0xff, 0x28, 0x15, 0xd0, 0x00, 0x24, 0x10, 0xe0, 0x28, 0x19, 0x80, 0x78, 0x0a, 0x99, 0x00, 0x29, 0x01, 0xd0, 0x01, 0x06, 0x3c, 0x00, 0x94, 0x2f, 0x00, 0x00, 0x08, 0xd5, 0x07, 0xf0, 0xe9, 0xfe, 0x0e, 0x28, 0x03, 0xd0, 0x01, 0x21, 0x81, 0x40, 0x0e, 0x43, 0x00, 0xe0, 0x00, 0x27, 0x01, 0x34, 0x68, 0x78, 0xa0, 0x42, 0xeb, 0xdc, 0x00, 0x98, 0x02, 0x9d, 0x01, 0x38, 0x00, 0x90, 0xdf, 0xd1, 0x03, 0x98, 0x31, 0x1c, 0x81, 0x43, 0x02, 0xd0, 0x03, 0x98, 0x06, 0x40, 0x00, 0x27, 0x04, 0x98, 0x06, 0x60, 0x05, 0xb0, 0x38, 0x1c, 0x3c, 0x00, 0xd0, 0x2f, 0x00, 0x00, 0xf0, 0xbd, 0x00, 0x00, 0x02, 0x21, 0x01, 0x60, 0x64, 0x21, 0x01, 0xe0, 0x01, 0x39, 0x02, 0xd0, 0x02, 0x68, 0x92, 0x07, 0xfa, 0xd4, 0x01, 0x20, 0x00, 0x29, 0x00, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x10, 0xb5, 0x00, 0x20, 0xc4, 0x43, 0x05, 0x4b, 0x02, 0x22, 0x01, 0x01, 0x5a, 0x50, 0xc9, 0x18, 0x8c, 0x60, 0x01, 0x30, 0x08, 0x28, 0xf8, 0xdb, 0x10, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x30, 0x07, 0x00, 0xf0, 0xb5, 0x05, 0x1c, 0x60, 0x35, 0xc7, 0x6a, 0x04, 0x1c, 0x28, 0x7b, 0x00, 0x2f, 0x8b, 0xb0, 0x15, 0xd0, 0x08, 0x28, 0x15, 0xd2, 0x02, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x00, 0x07, 0x04, 0x04, 0x07, 0x09, 0x09, 0x0c, 0x0c, 0x01, 0x26, 0x00, 0x21, 0x09, 0xe0, 0x00, 0x26, 0x06, 0xe0, 0x02, 0x26, 0x02, 0x21, 0x04, 0xe0, 0x3c, 0x00, 0x48, 0x30, 0x00, 0x00, 0x03, 0x26, 0x03, 0x21, 0x01, 0xe0, 0x04, 0x26, 0x01, 0x21, 0x8c, 0x22, 0x12, 0x59, 0x07, 0x91, 0x26, 0x49, 0x06, 0x90, 0x04, 0x91, 0x00, 0x20, 0x03, 0x90, 0x05, 0x97, 0x08, 0x92, 0xe0, 0x69, 0x22, 0x69, 0x21, 0x1c, 0x70, 0x31, 0x01, 0x91, 0x21, 0x49, 0x00, 0x90, 0x70, 0x00, 0x40, 0x18, 0x60, 0x30, 0x02, 0x92, 0x03, 0x88, 0x59, 0x1c, 0x01, 0x80, 0x1e, 0x48, 0x3c, 0x00, 0x84, 0x30, 0x00, 0x00, 0x02, 0x88, 0xa1, 0x68, 0x0a, 0xa8, 0x09, 0xf0, 0xe1, 0xff, 0x60, 0x60, 0xe8, 0x7a, 0xa1, 0x6a, 0xc9, 0x07, 0x00, 0x07, 0x00, 0x0e, 0xc9, 0x0d, 0x08, 0x43, 0x61, 0x6a, 0x22, 0x69, 0xc9, 0x07, 0x89, 0x0d, 0x01, 0x43, 0x01, 0x20, 0x00, 0x2a, 0x00, 0xd1, 0x00, 0x20, 0x80, 0x03, 0x08, 0x43, 0x21, 0x6a, 0xc9, 0x03, 0x08, 0x43, 0x08, 0x21, 0x08, 0x43, 0x0a, 0x99, 0x3c, 0x00, 0xc0, 0x30, 0x00, 0x00, 0x08, 0x80, 0x20, 0x1c, 0xfe, 0xf7, 0x98, 0xfe, 0x20, 0x69, 0x00, 0x28, 0x04, 0xd1, 0x20, 0x1c, 0x0a, 0xf0, 0x82, 0xf9, 0x0b, 0xb0, 0xf0, 0xbd, 0x80, 0x79, 0x06, 0x28, 0x01, 0xd9, 0xfe, 0xf7, 0x0f, 0xf9, 0x20, 0x69, 0x06, 0x49, 0x80, 0x79, 0x80, 0x00, 0x09, 0x58, 0x20, 0x1c, 0xfd, 0xf7, 0x74, 0xf9, 0xef, 0xe7, 0x79, 0x2f, 0x01, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x3c, 0x00, 0xfc, 0x30, 0x00, 0x00, 0x08, 0x61, 0x01, 0x00, 0x74, 0x57, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x58, 0x30, 0x8a, 0xb0, 0x0e, 0xf0, 0x7c, 0xfe, 0x22, 0x1c, 0x80, 0x32, 0x51, 0x68, 0x00, 0x29, 0x01, 0xd0, 0x11, 0x7a, 0x07, 0xe0, 0x00, 0x28, 0x04, 0xd0, 0x80, 0x69, 0x80, 0x07, 0x01, 0xd5, 0x03, 0x21, 0x00, 0xe0, 0x01, 0x21, 0xd2, 0x68, 0x07, 0x91, 0x22, 0x49, 0x00, 0x20, 0x08, 0x92, 0x3c, 0x00, 0x38, 0x31, 0x00, 0x00, 0x04, 0x91, 0x00, 0x22, 0x05, 0x92, 0x06, 0x90, 0x03, 0x90, 0xe0, 0x69, 0x22, 0x69, 0x00, 0x90, 0x21, 0x1c, 0x70, 0x31, 0x1c, 0x48, 0x01, 0x91, 0x02, 0x92, 0x03, 0x89, 0x59, 0x1c, 0x01, 0x81, 0x1a, 0x48, 0x02, 0x88, 0xa1, 0x68, 0x09, 0xa8, 0x09, 0xf0, 0x76, 0xff, 0x60, 0x60, 0x6b, 0x20, 0x00, 0x5d, 0xa1, 0x6a, 0x22, 0x69, 0xc9, 0x07, 0x00, 0x07, 0x00, 0x0e, 0x3c, 0x00, 0x74, 0x31, 0x00, 0x00, 0xc9, 0x0d, 0x01, 0x43, 0x01, 0x20, 0x00, 0x2a, 0x00, 0xd1, 0x00, 0x20, 0x80, 0x03, 0x08, 0x43, 0x09, 0x99, 0x08, 0x80, 0x20, 0x1c, 0xfe, 0xf7, 0x35, 0xfe, 0x20, 0x69, 0x00, 0x28, 0x04, 0xd1, 0x20, 0x1c, 0x0a, 0xf0, 0x1f, 0xf9, 0x0a, 0xb0, 0x10, 0xbd, 0x80, 0x79, 0x06, 0x28, 0x01, 0xd9, 0xfe, 0xf7, 0xac, 0xf8, 0x20, 0x69, 0x07, 0x49, 0x80, 0x79, 0x80, 0x00, 0x3c, 0x00, 0xb0, 0x31, 0x00, 0x00, 0x09, 0x58, 0x20, 0x1c, 0xfd, 0xf7, 0x11, 0xf9, 0xef, 0xe7, 0x00, 0x00, 0xbd, 0x2f, 0x01, 0x00, 0x24, 0x6a, 0x01, 0x00, 0x08, 0x61, 0x01, 0x00, 0x74, 0x57, 0x01, 0x00, 0x3e, 0xb5, 0x05, 0x1c, 0x00, 0x69, 0x04, 0x21, 0x07, 0xf0, 0xd2, 0xfa, 0x00, 0x28, 0x09, 0xd0, 0x42, 0x78, 0x02, 0x32, 0x01, 0x1c, 0x68, 0x46, 0xfd, 0xf7, 0x88, 0xf9, 0xe8, 0x6a, 0x6c, 0x46, 0x3c, 0x00, 0xec, 0x31, 0x00, 0x00, 0x02, 0x90, 0x00, 0xe0, 0x00, 0x24, 0x28, 0x1c, 0x14, 0x30, 0x02, 0xf0, 0x03, 0xfb, 0x00, 0x28, 0x04, 0xd0, 0x21, 0x1c, 0x28, 0x1c, 0x05, 0xf0, 0xa5, 0xfe, 0x3e, 0xbd, 0x00, 0x2c, 0xfc, 0xd0, 0x02, 0x49, 0x20, 0x1c, 0x49, 0x69, 0xfd, 0xf7, 0xe2, 0xf8, 0xf6, 0xe7, 0x44, 0x7d, 0x01, 0x00, 0x70, 0xb5, 0x1e, 0x1c, 0x18, 0x23, 0x58, 0x43, 0x06, 0x4b, 0x04, 0x9d, 0x3c, 0x00, 0x28, 0x32, 0x00, 0x00, 0x19, 0x50, 0xc4, 0x18, 0x00, 0x20, 0x60, 0x61, 0x62, 0x60, 0xa6, 0x60, 0xe5, 0x60, 0x0f, 0xf0, 0xb9, 0xfd, 0x20, 0x61, 0x70, 0xbd, 0x00, 0x00, 0xb8, 0x7d, 0x01, 0x00, 0x02, 0x4a, 0x01, 0x1c, 0x90, 0x69, 0x91, 0x61, 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x01, 0x48, 0x40, 0x6b, 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x04, 0x49, 0x04, 0x4b, 0x3c, 0x00, 0x64, 0x32, 0x00, 0x00, 0xca, 0x68, 0x09, 0x69, 0x5c, 0x3b, 0x5b, 0x68, 0xc9, 0x1a, 0x41, 0x43, 0x50, 0x18, 0x70, 0x47, 0xa0, 0x7d, 0x01, 0x00, 0x01, 0x48, 0x00, 0x78, 0x70, 0x47, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x80, 0xb5, 0x06, 0x22, 0x01, 0x49, 0xfd, 0xf7, 0x35, 0xf9, 0x80, 0xbd, 0xfe, 0x67, 0x01, 0x00, 0xf0, 0xb5, 0x89, 0xb0, 0x00, 0x93, 0x16, 0x4f, 0x13, 0x1c, 0x0e, 0x1c, 0x3c, 0x00, 0xa0, 0x32, 0x00, 0x00, 0x04, 0x1c, 0x3a, 0x1c, 0x01, 0xf0, 0x62, 0xff, 0x01, 0xa9, 0x06, 0xa8, 0xa2, 0x68, 0x02, 0xf0, 0x0b, 0xf9, 0x01, 0xaa, 0x06, 0xa9, 0x38, 0x1c, 0x63, 0x6a, 0x02, 0xf0, 0x81, 0xfc, 0x05, 0x1c, 0x01, 0x28, 0x14, 0xd1, 0x0c, 0x48, 0xfc, 0x21, 0xc8, 0x51, 0x38, 0x1c, 0x02, 0xf0, 0x0c, 0xf8, 0x03, 0x21, 0x30, 0x1c, 0x07, 0xf0, 0x52, 0xfa, 0x00, 0x28, 0x07, 0xd0, 0x3c, 0x00, 0xdc, 0x32, 0x00, 0x00, 0x80, 0x78, 0x00, 0xf0, 0x33, 0xfc, 0x20, 0x1c, 0x10, 0x30, 0x0e, 0xf0, 0x47, 0xfd, 0x00, 0xe0, 0x00, 0x25, 0x28, 0x1c, 0x09, 0xb0, 0xf0, 0xbd, 0xf4, 0x67, 0x01, 0x00, 0xc1, 0x38, 0x00, 0x00, 0x10, 0xb5, 0x07, 0x4c, 0x06, 0x48, 0x06, 0x22, 0x21, 0x1d, 0x08, 0x38, 0xfd, 0xf7, 0xf6, 0xf8, 0x01, 0xf0, 0xfc, 0xff, 0x00, 0xf0, 0x42, 0xfc, 0x20, 0x1c, 0x02, 0xf0, 0x3c, 0x00, 0x18, 0x33, 0x00, 0x00, 0x27, 0xfc, 0x10, 0xbd, 0xf4, 0x67, 0x01, 0x00, 0x08, 0x49, 0xc9, 0x68, 0x00, 0x29, 0x0a, 0xd0, 0x06, 0x4a, 0x01, 0x32, 0x51, 0x78, 0x12, 0x78, 0x48, 0x43, 0x00, 0x2a, 0x01, 0xd1, 0x08, 0x18, 0x70, 0x47, 0x10, 0x18, 0x70, 0x47, 0x01, 0x30, 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x04, 0x4b, 0x05, 0x49, 0x00, 0x28, 0x5a, 0x69, 0x00, 0xd0, 0x01, 0x1c, 0x3c, 0x00, 0x54, 0x33, 0x00, 0x00, 0x10, 0x1c, 0x59, 0x61, 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0xb9, 0x75, 0x00, 0x00, 0x07, 0x49, 0x00, 0x20, 0x0a, 0x78, 0x02, 0x2a, 0x09, 0xd1, 0x0a, 0x7c, 0x00, 0x2a, 0x05, 0xd1, 0xca, 0x68, 0x00, 0x2a, 0x03, 0xd0, 0x49, 0x69, 0x00, 0x29, 0x00, 0xd0, 0x01, 0x20, 0x70, 0x47, 0x78, 0x69, 0x01, 0x00, 0x0c, 0x4a, 0x80, 0xb5, 0x01, 0x21, 0x51, 0x60, 0x3c, 0x00, 0x90, 0x33, 0x00, 0x00, 0x09, 0xf0, 0x6a, 0xf8, 0x09, 0x48, 0x1c, 0x30, 0x81, 0x69, 0x00, 0x29, 0x07, 0xd0, 0x00, 0x23, 0x83, 0x61, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, 0xf0, 0xd2, 0xf8, 0x80, 0xbd, 0x00, 0x22, 0x00, 0x21, 0x03, 0x48, 0x00, 0xf0, 0x5c, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x5c, 0x69, 0x01, 0x00, 0x51, 0x35, 0x00, 0x00, 0xb0, 0xb5, 0x0c, 0x1c, 0x01, 0x28, 0x16, 0xd1, 0x3c, 0x00, 0xcc, 0x33, 0x00, 0x00, 0x0e, 0x4d, 0x02, 0x2c, 0x09, 0xd1, 0x00, 0xf0, 0x2b, 0xfa, 0x00, 0x28, 0x0e, 0xd0, 0x68, 0x69, 0x00, 0x28, 0x0b, 0xd1, 0x21, 0x1c, 0x13, 0x20, 0x0c, 0xe0, 0x03, 0x2c, 0xfa, 0xd1, 0x00, 0xf0, 0xf9, 0xf9, 0x00, 0x28, 0x02, 0xd0, 0x28, 0x7c, 0x00, 0x28, 0xf3, 0xd0, 0xb0, 0xbd, 0x21, 0x1c, 0x00, 0x06, 0x00, 0x0e, 0x04, 0xf0, 0x62, 0xfc, 0xb0, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x08, 0x34, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0xb0, 0xb5, 0x0c, 0x4c, 0x00, 0x25, 0x25, 0x74, 0x65, 0x61, 0xe5, 0x60, 0x00, 0xf0, 0x3c, 0xfa, 0x00, 0xf0, 0x34, 0xfa, 0x07, 0x48, 0x1c, 0x38, 0x05, 0x61, 0x09, 0xf0, 0x33, 0xff, 0x20, 0x78, 0x00, 0x28, 0x02, 0xd1, 0x04, 0xf0, 0x6e, 0xfa, 0xb0, 0xbd, 0x02, 0x28, 0xfc, 0xd1, 0x04, 0xf0, 0xa5, 0xfb, 0xb0, 0xbd, 0x78, 0x69, 0x01, 0x00, 0x3c, 0x00, 0x44, 0x34, 0x00, 0x00, 0x0c, 0x48, 0x80, 0xb5, 0x01, 0x78, 0x00, 0x29, 0x12, 0xd0, 0xc0, 0x68, 0x00, 0x28, 0x0f, 0xd1, 0x08, 0x48, 0x1c, 0x38, 0x40, 0x69, 0x00, 0x28, 0x0a, 0xd1, 0x07, 0x48, 0x00, 0x68, 0x00, 0x28, 0x06, 0xd0, 0x00, 0x22, 0x07, 0x21, 0x10, 0x20, 0x10, 0xf0, 0xa0, 0xf9, 0x02, 0xf0, 0x2c, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0xd4, 0x67, 0x01, 0x00, 0x3c, 0x00, 0x80, 0x34, 0x00, 0x00, 0xf8, 0xb5, 0x1d, 0x4e, 0x1c, 0x4d, 0x04, 0x1c, 0xf0, 0x68, 0x02, 0x27, 0x1c, 0x3d, 0x00, 0x28, 0x07, 0xd0, 0xe8, 0x68, 0x00, 0x28, 0x04, 0xd0, 0xfd, 0xf7, 0xc2, 0xfe, 0x00, 0x28, 0x00, 0xd0, 0xbc, 0x43, 0x00, 0x2c, 0x14, 0xd0, 0x37, 0x70, 0xf0, 0x68, 0x14, 0x4f, 0x00, 0x28, 0x10, 0xd0, 0xe0, 0x07, 0x17, 0xd4, 0xfd, 0xf7, 0xb4, 0xfe, 0x00, 0x28, 0x13, 0xd0, 0x3c, 0x00, 0xbc, 0x34, 0x00, 0x00, 0x70, 0x69, 0x00, 0x28, 0x06, 0xd1, 0xe8, 0x68, 0x00, 0x28, 0x01, 0xd0, 0xfd, 0xf7, 0x1a, 0xff, 0x0d, 0xf0, 0x0a, 0xfa, 0xf8, 0xbd, 0x68, 0x69, 0x00, 0x28, 0x05, 0xd1, 0x09, 0x48, 0x00, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x2c, 0x04, 0xd1, 0x39, 0x1c, 0x20, 0x1c, 0x0e, 0xf0, 0x52, 0xfd, 0xf0, 0xe7, 0x04, 0xf0, 0x1d, 0xfb, 0x02, 0xf0, 0xeb, 0xfb, 0xeb, 0xe7, 0x3c, 0x00, 0xf8, 0x34, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x50, 0xc3, 0x00, 0x00, 0xd4, 0x67, 0x01, 0x00, 0x05, 0x48, 0x41, 0x69, 0x00, 0x29, 0x04, 0xd0, 0x40, 0x6a, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x06, 0x49, 0x00, 0x20, 0x48, 0x60, 0x08, 0x60, 0x88, 0x60, 0x08, 0xf0, 0x9b, 0xff, 0x07, 0x21, 0x3c, 0x00, 0x34, 0x35, 0x00, 0x00, 0x12, 0x20, 0x22, 0x79, 0x10, 0xf0, 0x3a, 0xf9, 0x10, 0xbd, 0x00, 0x00, 0x5c, 0x69, 0x01, 0x00, 0x01, 0x49, 0x01, 0x20, 0x08, 0x60, 0x70, 0x47, 0xe8, 0x67, 0x01, 0x00, 0xf8, 0xb5, 0x07, 0x1c, 0x0e, 0x1c, 0x08, 0xf0, 0xa3, 0xfa, 0x13, 0x4d, 0x04, 0x1c, 0x68, 0x68, 0x00, 0x28, 0x17, 0xd0, 0x00, 0x2f, 0x02, 0xd0, 0xa8, 0x68, 0x03, 0x28, 0x13, 0xd3, 0x00, 0x20, 0x3c, 0x00, 0x70, 0x35, 0x00, 0x00, 0xa8, 0x60, 0x68, 0x60, 0x21, 0x1c, 0x0f, 0x20, 0x0e, 0xf0, 0xf0, 0xfe, 0x28, 0x68, 0x00, 0x28, 0x03, 0xd0, 0x00, 0x2c, 0x06, 0xd1, 0x01, 0x20, 0x02, 0xe0, 0x01, 0x2c, 0x02, 0xd1, 0x00, 0x20, 0xff, 0xf7, 0xfa, 0xfe, 0xf8, 0xbd, 0x72, 0x1c, 0x00, 0x21, 0x04, 0x48, 0x00, 0xf0, 0x68, 0xf8, 0xa8, 0x68, 0x01, 0x30, 0xa8, 0x60, 0xf5, 0xe7, 0x5c, 0x69, 0x01, 0x00, 0x3c, 0x00, 0xac, 0x35, 0x00, 0x00, 0x51, 0x35, 0x00, 0x00, 0x0a, 0x49, 0x80, 0xb5, 0xca, 0x68, 0x00, 0x2a, 0x0b, 0xd0, 0x42, 0x68, 0x00, 0x2a, 0x09, 0xd0, 0x00, 0x22, 0x4a, 0x62, 0x02, 0x68, 0x0a, 0x62, 0x02, 0x68, 0x07, 0x21, 0x17, 0x20, 0x10, 0xf0, 0xef, 0xf8, 0x80, 0xbd, 0x01, 0x20, 0x48, 0x62, 0x80, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x70, 0xb5, 0x14, 0x4d, 0x84, 0x6c, 0xe9, 0x68, 0x3c, 0x00, 0xe8, 0x35, 0x00, 0x00, 0x00, 0x29, 0x17, 0xd0, 0x40, 0x30, 0xec, 0x61, 0x40, 0x78, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x68, 0x62, 0x28, 0x6a, 0x0e, 0x4e, 0x00, 0x1b, 0xb0, 0x42, 0x0c, 0xd2, 0x08, 0xf0, 0x3a, 0xfe, 0x29, 0x6a, 0x40, 0x1a, 0xb0, 0x42, 0x03, 0xd2, 0x02, 0x22, 0x07, 0x21, 0x13, 0x20, 0x09, 0xe0, 0x04, 0xf0, 0xb6, 0xfa, 0x70, 0xbd, 0x07, 0x48, 0xa9, 0x68, 0x0b, 0xf0, 0x3c, 0x00, 0x24, 0x36, 0x00, 0x00, 0xbd, 0xfe, 0x22, 0x1c, 0x07, 0x21, 0x16, 0x20, 0x10, 0xf0, 0xc0, 0xf8, 0x70, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0xa0, 0x86, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x0a, 0x49, 0x80, 0xb5, 0x00, 0x20, 0x88, 0x61, 0x08, 0x69, 0x00, 0x28, 0x0c, 0xd0, 0x07, 0x48, 0x1c, 0x30, 0x00, 0x78, 0x00, 0x28, 0x07, 0xd0, 0x01, 0xf0, 0xd2, 0xff, 0x02, 0x28, 0x03, 0xd1, 0x3c, 0x00, 0x60, 0x36, 0x00, 0x00, 0x00, 0xf0, 0x12, 0xf9, 0x00, 0xf0, 0xbc, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x5c, 0x69, 0x01, 0x00, 0xf0, 0xb5, 0x06, 0x1c, 0x0c, 0x1c, 0x15, 0x1c, 0x91, 0xb0, 0x01, 0xa8, 0x40, 0x21, 0xfc, 0xf7, 0x0d, 0xff, 0x00, 0x21, 0x68, 0x46, 0xfd, 0xf7, 0xa7, 0xff, 0x04, 0x90, 0x01, 0xa8, 0x06, 0x22, 0x08, 0x49, 0xfc, 0xf7, 0x31, 0xff, 0x06, 0x22, 0x02, 0xa8, 0x02, 0x30, 0x3c, 0x00, 0x9c, 0x36, 0x00, 0x00, 0x06, 0x49, 0xfc, 0xf7, 0x2b, 0xff, 0x00, 0xab, 0xdc, 0x76, 0x0c, 0x95, 0x31, 0x1c, 0x01, 0xa8, 0x07, 0xf0, 0x4e, 0xf8, 0x11, 0xb0, 0xf0, 0xbd, 0x12, 0x61, 0x01, 0x00, 0xf8, 0x67, 0x01, 0x00, 0x03, 0x1c, 0x08, 0x1c, 0x19, 0x1c, 0x11, 0x4b, 0x80, 0xb5, 0x06, 0xd0, 0x04, 0x21, 0x11, 0x80, 0x04, 0x22, 0x19, 0x1c, 0xfc, 0xf7, 0x12, 0xff, 0x16, 0xe0, 0x04, 0x22, 0x3c, 0x00, 0xd8, 0x36, 0x00, 0x00, 0x01, 0x1c, 0x18, 0x1c, 0xfc, 0xf7, 0x0c, 0xff, 0x09, 0x48, 0x10, 0x38, 0x00, 0x69, 0x00, 0x28, 0x0c, 0xd0, 0x07, 0x48, 0x0c, 0x30, 0x00, 0x78, 0x00, 0x28, 0x07, 0xd0, 0x01, 0xf0, 0x84, 0xff, 0x02, 0x28, 0x03, 0xd1, 0x00, 0xf0, 0xc4, 0xf8, 0x00, 0xf0, 0x6e, 0xf8, 0x01, 0x20, 0x80, 0xbd, 0x6c, 0x69, 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0x0f, 0x1c, 0x00, 0x25, 0x3c, 0x00, 0x14, 0x37, 0x00, 0x00, 0x00, 0x26, 0x01, 0xf0, 0x73, 0xff, 0x02, 0x28, 0x2f, 0xd1, 0x19, 0x49, 0x01, 0x2f, 0x08, 0x68, 0x07, 0xd1, 0x02, 0x1c, 0x22, 0x40, 0x0a, 0xd1, 0x20, 0x43, 0x08, 0x60, 0xa0, 0x42, 0x06, 0xd1, 0x04, 0xe0, 0x00, 0x28, 0x03, 0xd0, 0xa0, 0x43, 0x08, 0x60, 0x00, 0xd1, 0x01, 0x25, 0x48, 0x68, 0x00, 0x28, 0x1a, 0xd1, 0x00, 0x2d, 0x17, 0xd0, 0x01, 0x20, 0x48, 0x60, 0x3c, 0x00, 0x50, 0x37, 0x00, 0x00, 0x38, 0x1c, 0x08, 0xf0, 0x89, 0xfe, 0x0b, 0x48, 0x1c, 0x30, 0x81, 0x69, 0x00, 0x29, 0x07, 0xd0, 0x00, 0x23, 0x83, 0x61, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0xff, 0xf7, 0xf1, 0xfe, 0x06, 0xe0, 0x00, 0x22, 0x00, 0x21, 0x04, 0x48, 0xff, 0xf7, 0x7b, 0xff, 0x00, 0xe0, 0x01, 0x26, 0x30, 0x1c, 0xf8, 0xbd, 0x00, 0x00, 0x5c, 0x69, 0x01, 0x00, 0x51, 0x35, 0x00, 0x00, 0x3c, 0x00, 0x8c, 0x37, 0x00, 0x00, 0x03, 0x1c, 0x08, 0x1c, 0x19, 0x1c, 0x12, 0x4b, 0x80, 0xb5, 0x06, 0xd0, 0x04, 0x21, 0x11, 0x80, 0x04, 0x22, 0x19, 0x1c, 0xfc, 0xf7, 0xaa, 0xfe, 0x18, 0xe0, 0x04, 0x22, 0x01, 0x1c, 0x18, 0x1c, 0xfc, 0xf7, 0xa4, 0xfe, 0x0a, 0x48, 0x10, 0x30, 0xc1, 0x68, 0x00, 0x29, 0x0e, 0xd0, 0x00, 0x78, 0x00, 0x28, 0x0b, 0xd0, 0x01, 0xf0, 0x1e, 0xff, 0x02, 0x28, 0x07, 0xd1, 0x3c, 0x00, 0xc8, 0x37, 0x00, 0x00, 0x00, 0xf0, 0x64, 0xf8, 0x00, 0xf0, 0x2e, 0xf8, 0x00, 0x28, 0x01, 0xd1, 0x09, 0xf0, 0x7a, 0xfd, 0x01, 0x20, 0x80, 0xbd, 0x68, 0x69, 0x01, 0x00, 0x10, 0xb5, 0x0a, 0x4c, 0x20, 0x69, 0x00, 0x28, 0x09, 0xd0, 0xa1, 0x69, 0x00, 0x29, 0x06, 0xd1, 0x7d, 0x21, 0xc9, 0x00, 0x41, 0x43, 0x03, 0x22, 0x07, 0x20, 0x0f, 0xf0, 0xe1, 0xfe, 0x21, 0x69, 0x01, 0x20, 0x00, 0x29, 0x3c, 0x00, 0x04, 0x38, 0x00, 0x00, 0x00, 0xd1, 0x00, 0x20, 0x10, 0xbd, 0x00, 0x00, 0x5c, 0x69, 0x01, 0x00, 0x10, 0xb5, 0x05, 0x4c, 0x00, 0x28, 0x03, 0xd0, 0xfd, 0xf7, 0x9a, 0xfc, 0xe0, 0x60, 0x10, 0xbd, 0x01, 0x20, 0x00, 0x21, 0xe1, 0x60, 0x10, 0xbd, 0x78, 0x69, 0x01, 0x00, 0x0a, 0x48, 0x0a, 0x49, 0x10, 0xb5, 0xc0, 0x68, 0x1c, 0x39, 0xc9, 0x68, 0x00, 0x28, 0x03, 0xd0, 0x00, 0x29, 0x01, 0xd0, 0x3c, 0x00, 0x40, 0x38, 0x00, 0x00, 0x01, 0x24, 0x00, 0xe0, 0x00, 0x24, 0x00, 0x2c, 0x03, 0xd0, 0x02, 0x22, 0x07, 0x20, 0x0f, 0xf0, 0xb7, 0xfe, 0x20, 0x1c, 0x10, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x10, 0xb5, 0x09, 0x4c, 0x00, 0x20, 0x21, 0x69, 0x00, 0x29, 0x0c, 0xd0, 0x06, 0x49, 0x1c, 0x31, 0x09, 0x78, 0x00, 0x29, 0x07, 0xd0, 0x00, 0xf0, 0x09, 0xf8, 0x01, 0x20, 0xa0, 0x61, 0x20, 0x69, 0x3c, 0x00, 0x7c, 0x38, 0x00, 0x00, 0x7d, 0x23, 0xdb, 0x00, 0x58, 0x43, 0x10, 0xbd, 0x5c, 0x69, 0x01, 0x00, 0x80, 0xb5, 0x03, 0x21, 0x07, 0x20, 0x0f, 0xf0, 0xd1, 0xfe, 0x80, 0xbd, 0x80, 0xb5, 0x02, 0x21, 0x07, 0x20, 0x0f, 0xf0, 0xcb, 0xfe, 0x80, 0xbd, 0x06, 0x48, 0x80, 0xb5, 0x00, 0x78, 0x00, 0x28, 0x01, 0xd0, 0xfd, 0xf7, 0x29, 0xfd, 0x00, 0x22, 0x07, 0x21, 0x11, 0x20, 0x0f, 0xf0, 0x7c, 0xff, 0x3c, 0x00, 0xb8, 0x38, 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x10, 0x1c, 0x06, 0x4a, 0x51, 0x61, 0x00, 0xf0, 0xa3, 0xf8, 0x10, 0x20, 0x00, 0x2c, 0x00, 0xd1, 0x11, 0x20, 0x00, 0x22, 0x07, 0x21, 0x0f, 0xf0, 0x69, 0xff, 0x10, 0xbd, 0x5c, 0x69, 0x01, 0x00, 0x01, 0x49, 0x48, 0x62, 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x10, 0xb5, 0x09, 0x4c, 0x3c, 0x00, 0xf4, 0x38, 0x00, 0x00, 0xe0, 0x69, 0x00, 0x28, 0x0c, 0xd1, 0xe0, 0x62, 0x01, 0x20, 0xe0, 0x61, 0x0b, 0xf0, 0x08, 0xfd, 0x0b, 0xf0, 0x74, 0xfe, 0x01, 0x20, 0x00, 0xf0, 0xb5, 0xf8, 0x0f, 0xf0, 0x4d, 0xfa, 0x60, 0x63, 0x10, 0xbd, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x05, 0x49, 0x80, 0xb5, 0x00, 0x20, 0xc8, 0x61, 0x88, 0x63, 0x00, 0xf0, 0x89, 0xf8, 0x00, 0xf0, 0x01, 0xf9, 0x02, 0xf0, 0x3c, 0x00, 0x30, 0x39, 0x00, 0x00, 0x91, 0xfb, 0x80, 0xbd, 0x44, 0x7d, 0x01, 0x00, 0x10, 0xb5, 0x01, 0x28, 0x38, 0xd1, 0x08, 0x06, 0x00, 0x0e, 0x05, 0x28, 0x32, 0xd1, 0x1d, 0x4c, 0x20, 0x78, 0x01, 0x28, 0x09, 0xd0, 0x02, 0x28, 0x1b, 0xd0, 0x03, 0x28, 0x2a, 0xd1, 0x02, 0xf0, 0x7d, 0xfb, 0x00, 0xf0, 0x6f, 0xf8, 0x01, 0x20, 0x10, 0xe0, 0x17, 0x48, 0x21, 0x6b, 0x0b, 0xf0, 0x1b, 0xfd, 0x0b, 0xf0, 0x3c, 0x00, 0x6c, 0x39, 0x00, 0x00, 0x41, 0xfe, 0x15, 0x48, 0x00, 0x69, 0x03, 0x28, 0x01, 0xd3, 0xc0, 0x07, 0x03, 0xd5, 0x01, 0x21, 0x20, 0x6b, 0x07, 0xf0, 0x19, 0xff, 0x02, 0x20, 0x00, 0xf0, 0x78, 0xf8, 0x10, 0xbd, 0x0f, 0x48, 0x00, 0x68, 0x20, 0x64, 0x0a, 0x48, 0x5c, 0x30, 0xc1, 0x68, 0x02, 0x69, 0x89, 0x18, 0xc1, 0x60, 0x03, 0xf0, 0xcc, 0xfc, 0x03, 0x20, 0x00, 0xf0, 0x69, 0xf8, 0x01, 0x20, 0x3c, 0x00, 0xa8, 0x39, 0x00, 0x00, 0xe0, 0x62, 0x10, 0xbd, 0x09, 0x21, 0x00, 0xe0, 0x08, 0x21, 0x09, 0x20, 0xfd, 0xf7, 0x76, 0xfc, 0x10, 0xbd, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0xf4, 0x68, 0x01, 0x00, 0x78, 0x6e, 0x01, 0x00, 0xb0, 0xb5, 0x0f, 0x4c, 0x20, 0x78, 0x65, 0x1e, 0x01, 0x28, 0x0f, 0xd1, 0x00, 0x20, 0xff, 0xf7, 0xa1, 0xfc, 0x0c, 0x49, 0x09, 0x88, 0x49, 0x08, 0x3c, 0x00, 0xe4, 0x39, 0x00, 0x00, 0x40, 0x1a, 0x0f, 0xf0, 0x19, 0xf9, 0x00, 0x28, 0x04, 0xd0, 0x28, 0x78, 0x01, 0x28, 0x07, 0xd0, 0x02, 0x28, 0x05, 0xd0, 0x20, 0x78, 0x00, 0x28, 0x04, 0xd1, 0x28, 0x78, 0x03, 0x28, 0x01, 0xd1, 0x01, 0x20, 0xb0, 0xbd, 0x00, 0x20, 0xb0, 0xbd, 0x45, 0x7d, 0x01, 0x00, 0xf4, 0x67, 0x01, 0x00, 0x01, 0x49, 0xc8, 0x64, 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x3c, 0x00, 0x20, 0x3a, 0x00, 0x00, 0x04, 0x49, 0x05, 0x4a, 0x89, 0x68, 0x12, 0x6d, 0x01, 0x20, 0x91, 0x42, 0x00, 0xd3, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0xf4, 0x68, 0x01, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x10, 0xb5, 0x06, 0x4c, 0x20, 0x6b, 0x07, 0xf0, 0xf9, 0xfe, 0xa0, 0x6b, 0x00, 0x28, 0x03, 0xd1, 0x03, 0x48, 0x21, 0x6b, 0x0b, 0xf0, 0x92, 0xfc, 0x10, 0xbd, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x3c, 0x00, 0x5c, 0x3a, 0x00, 0x00, 0x34, 0x63, 0x01, 0x00, 0x04, 0x48, 0x00, 0x78, 0x02, 0x28, 0x01, 0xd0, 0x03, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x44, 0x7d, 0x01, 0x00, 0xf8, 0xb5, 0x07, 0x1c, 0xff, 0xf7, 0xd0, 0xff, 0x06, 0x1c, 0x01, 0x2f, 0x26, 0x4d, 0x1f, 0xd0, 0x02, 0x2f, 0x45, 0xd0, 0x03, 0x2f, 0x12, 0xd1, 0x24, 0x48, 0x25, 0x4b, 0x00, 0x69, 0x6a, 0x69, 0x3c, 0x00, 0x98, 0x3a, 0x00, 0x00, 0x41, 0x08, 0x5a, 0x43, 0x23, 0x4b, 0xd4, 0x18, 0x8c, 0x42, 0x00, 0xd9, 0x0c, 0x1c, 0x00, 0x2e, 0x05, 0xd0, 0x1e, 0x49, 0x5b, 0x39, 0x09, 0x78, 0x00, 0x29, 0x00, 0xd1, 0x04, 0x1c, 0x05, 0x22, 0x21, 0x1c, 0x09, 0x20, 0x0f, 0xf0, 0x80, 0xfd, 0x18, 0x4a, 0x5c, 0x3a, 0x17, 0x70, 0xf8, 0xbd, 0xff, 0xf7, 0xd6, 0xfb, 0x00, 0x28, 0x02, 0xd0, 0x28, 0x69, 0x00, 0x28, 0x3c, 0x00, 0xd4, 0x3a, 0x00, 0x00, 0x0e, 0xd0, 0x04, 0xf0, 0xcf, 0xfb, 0x13, 0x4b, 0x69, 0x69, 0x11, 0x4a, 0x59, 0x43, 0x5c, 0x3a, 0xd2, 0x6b, 0x89, 0x18, 0x88, 0x42, 0x01, 0xd9, 0x44, 0x1a, 0x04, 0xe0, 0x00, 0x24, 0x02, 0xe0, 0x04, 0xf0, 0xae, 0xfd, 0x04, 0x1c, 0x00, 0x2e, 0xdb, 0xd0, 0x09, 0x48, 0x5b, 0x38, 0x00, 0x78, 0x01, 0x28, 0xd6, 0xd1, 0x08, 0x4b, 0x9c, 0x42, 0x02, 0xd9, 0x58, 0x42, 0x3c, 0x00, 0x10, 0x3b, 0x00, 0x00, 0x24, 0x18, 0xd0, 0xe7, 0x00, 0x24, 0xce, 0xe7, 0x04, 0xf0, 0xae, 0xfb, 0xca, 0xe7, 0x00, 0x00, 0xf4, 0x68, 0x01, 0x00, 0xa0, 0x7d, 0x01, 0x00, 0x98, 0x3a, 0x00, 0x00, 0x88, 0x13, 0x00, 0x00, 0x80, 0xb5, 0x05, 0x21, 0x09, 0x20, 0x0f, 0xf0, 0x7d, 0xfd, 0x02, 0x49, 0x00, 0x20, 0x08, 0x70, 0x80, 0xbd, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x70, 0xb5, 0x06, 0x1c, 0x3c, 0x00, 0x4c, 0x3b, 0x00, 0x00, 0x0d, 0xf0, 0xbc, 0xfa, 0xff, 0xf7, 0xce, 0xfe, 0x09, 0x4c, 0x0a, 0x48, 0x21, 0x6b, 0x0b, 0xf0, 0x21, 0xfc, 0x01, 0x25, 0x01, 0x21, 0x30, 0x06, 0x00, 0x0e, 0xa5, 0x63, 0x07, 0xf0, 0x3a, 0xfe, 0x05, 0x48, 0x29, 0x02, 0x09, 0x58, 0x00, 0x29, 0x00, 0xd1, 0x05, 0x61, 0x70, 0xbd, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0xf4, 0x67, 0x01, 0x00, 0x3c, 0x00, 0x88, 0x3b, 0x00, 0x00, 0x02, 0x4a, 0x11, 0x6c, 0x08, 0x43, 0x10, 0x64, 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x80, 0xb5, 0xff, 0xf7, 0xbf, 0xfe, 0x0b, 0xf0, 0xa1, 0xfb, 0x80, 0xbd, 0x02, 0x4a, 0x01, 0x1c, 0x10, 0x69, 0x11, 0x61, 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0xf3, 0xb5, 0x06, 0x1c, 0x00, 0x20, 0x89, 0xb0, 0xf8, 0x4c, 0x08, 0x90, 0xe2, 0x69, 0x08, 0x25, 0x3c, 0x00, 0xc4, 0x3b, 0x00, 0x00, 0x00, 0x2a, 0x03, 0xd0, 0x06, 0xa9, 0x07, 0xa8, 0xfc, 0xf7, 0x06, 0xfc, 0x30, 0x1c, 0xf3, 0x4e, 0x00, 0x27, 0x20, 0x36, 0x82, 0x28, 0x6f, 0xd0, 0x15, 0xdc, 0x01, 0x28, 0x18, 0xd0, 0x80, 0x28, 0x6b, 0xd1, 0xee, 0x4d, 0x80, 0x3d, 0xa8, 0x68, 0x01, 0x28, 0x67, 0xd1, 0x68, 0x68, 0x0f, 0xf0, 0x1b, 0xf8, 0x00, 0x28, 0x63, 0xd1, 0x01, 0x21, 0x01, 0x20, 0x0d, 0xf0, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x9d, 0xf8, 0x08, 0xf0, 0xdb, 0xfd, 0x0b, 0xb0, 0xf0, 0xbd, 0x83, 0x28, 0x6d, 0xd0, 0x84, 0x28, 0x55, 0xd1, 0xe7, 0xe0, 0x0a, 0x98, 0x0a, 0x28, 0x04, 0xd2, 0x03, 0xa3, 0x1b, 0x18, 0x1b, 0x5a, 0x5b, 0x00, 0x9f, 0x44, 0xf6, 0xe0, 0x00, 0x00, 0xee, 0x00, 0x0b, 0x00, 0xf7, 0x00, 0xf7, 0x00, 0xf7, 0x00, 0xf7, 0x00, 0x2f, 0x00, 0x88, 0x00, 0x8b, 0x00, 0xad, 0x00, 0x3c, 0x00, 0x3c, 0x3c, 0x00, 0x00, 0x00, 0xf0, 0x56, 0xfe, 0x00, 0x28, 0x17, 0xd0, 0xd6, 0x4a, 0x80, 0x3a, 0xd1, 0x6a, 0x06, 0x98, 0x81, 0x42, 0x16, 0xd0, 0x06, 0x21, 0x00, 0x28, 0x00, 0xd1, 0x07, 0x21, 0x0d, 0x06, 0x2d, 0x0e, 0x00, 0x28, 0x0e, 0xd0, 0xcf, 0x4a, 0x01, 0x20, 0x80, 0x3a, 0x50, 0x65, 0x0f, 0xf0, 0xa0, 0xf8, 0xcc, 0x4a, 0x80, 0x3a, 0x50, 0x66, 0x04, 0xe0, 0x00, 0x21, 0x16, 0x20, 0x3c, 0x00, 0x78, 0x3c, 0x00, 0x00, 0x0f, 0xf0, 0xdc, 0xfc, 0x01, 0x25, 0x02, 0x20, 0x05, 0x90, 0x2e, 0xe2, 0xc6, 0x48, 0x80, 0x38, 0x40, 0x6d, 0x00, 0x28, 0x2e, 0xd0, 0xc6, 0x49, 0x20, 0x69, 0xc4, 0x4d, 0x40, 0x18, 0x0e, 0xf0, 0xc1, 0xff, 0x00, 0x28, 0x12, 0xd0, 0x0f, 0xf0, 0x85, 0xf8, 0xc1, 0x49, 0x49, 0x42, 0x40, 0x18, 0xbd, 0x49, 0x20, 0x61, 0x80, 0x39, 0x48, 0x6e, 0x40, 0x19, 0x0e, 0xf0, 0x3c, 0x00, 0xb4, 0x3c, 0x00, 0x00, 0xbb, 0xff, 0x00, 0x28, 0x11, 0xd0, 0x0a, 0xe0, 0xf7, 0xe0, 0x17, 0xe2, 0xb2, 0xe0, 0xb0, 0xe0, 0xb6, 0x49, 0x20, 0x69, 0x80, 0x39, 0x49, 0x6e, 0x40, 0x1a, 0xa8, 0x42, 0x05, 0xdb, 0xb3, 0x49, 0xb5, 0x4d, 0x80, 0x39, 0x4f, 0x65, 0x03, 0xf0, 0x27, 0xfb, 0x06, 0x22, 0x29, 0x1c, 0x16, 0x20, 0x0f, 0xf0, 0x72, 0xfc, 0x47, 0xe0, 0x95, 0xe0, 0x00, 0xf0, 0xfe, 0xfd, 0x3c, 0x00, 0xf0, 0x3c, 0x00, 0x00, 0x00, 0x28, 0x42, 0xd1, 0xaa, 0x4d, 0xc4, 0x3d, 0xef, 0x60, 0x08, 0xf0, 0x19, 0xfd, 0x03, 0xf0, 0x15, 0xfb, 0xa8, 0x6a, 0x00, 0x28, 0x02, 0xd0, 0xff, 0xf7, 0x4c, 0xff, 0xaf, 0x62, 0xa4, 0x48, 0x80, 0x38, 0x00, 0x68, 0x00, 0x21, 0xff, 0xf7, 0xf9, 0xfc, 0x08, 0xf0, 0x3f, 0xf9, 0x09, 0x21, 0x16, 0x20, 0x0f, 0xf0, 0x87, 0xfc, 0x00, 0x22, 0x16, 0x21, 0x83, 0x20, 0x3c, 0x00, 0x2c, 0x3d, 0x00, 0x00, 0x0f, 0xf0, 0x40, 0xfd, 0xff, 0xf7, 0x86, 0xfc, 0x21, 0xe0, 0x00, 0xf0, 0x1b, 0xfe, 0x1e, 0xe0, 0x06, 0xf0, 0x54, 0xfa, 0x97, 0x4d, 0x80, 0x3d, 0xa9, 0x6f, 0x40, 0x1a, 0x04, 0x90, 0x06, 0x98, 0x00, 0x28, 0x01, 0xd0, 0xaf, 0x65, 0x02, 0xe0, 0xa8, 0x6d, 0x00, 0x28, 0x08, 0xd1, 0x91, 0x48, 0xc4, 0x38, 0x00, 0x78, 0x80, 0x07, 0x03, 0xd5, 0x92, 0x48, 0x47, 0x60, 0x3c, 0x00, 0x68, 0x3d, 0x00, 0x00, 0x00, 0xf0, 0x02, 0xfe, 0x04, 0x98, 0xff, 0x38, 0x23, 0x38, 0x14, 0x28, 0x02, 0xd2, 0x01, 0x20, 0xe8, 0x63, 0x53, 0xe0, 0xef, 0x63, 0x51, 0xe0, 0x87, 0x4a, 0xb5, 0x7a, 0x80, 0x3a, 0x00, 0x2d, 0x4c, 0xd0, 0x0d, 0xf0, 0x71, 0xff, 0x00, 0xf0, 0xad, 0xfd, 0x07, 0x1c, 0x82, 0x48, 0x80, 0x38, 0x40, 0x6f, 0xff, 0x30, 0x5f, 0x30, 0x0e, 0xf0, 0x3d, 0xff, 0x02, 0x1c, 0x3c, 0x00, 0xa4, 0x3d, 0x00, 0x00, 0x7e, 0x48, 0x80, 0x38, 0x40, 0x6d, 0x00, 0x28, 0x1a, 0xd1, 0x00, 0xf0, 0xf1, 0xfd, 0x00, 0x28, 0x16, 0xd1, 0x04, 0x2d, 0x02, 0xd1, 0x00, 0x2f, 0x12, 0xd1, 0x1b, 0xe0, 0x00, 0x2f, 0x06, 0xd0, 0x02, 0x2d, 0x14, 0xd0, 0x79, 0x48, 0x40, 0x68, 0x00, 0x28, 0x09, 0xd0, 0x12, 0xe0, 0x00, 0x2a, 0x10, 0xd1, 0x4b, 0x21, 0xc9, 0x00, 0x01, 0x23, 0x09, 0x22, 0x16, 0x20, 0x3c, 0x00, 0xe0, 0x3d, 0x00, 0x00, 0x0f, 0xf0, 0xd6, 0xfc, 0x6e, 0x4a, 0x73, 0x48, 0x80, 0x3a, 0x11, 0x68, 0x0b, 0xf0, 0xd8, 0xfa, 0x18, 0xe0, 0x01, 0x21, 0x00, 0x20, 0x01, 0xe0, 0x01, 0x21, 0x01, 0x20, 0x00, 0xf0, 0x2a, 0xfe, 0x10, 0xe0, 0x67, 0x4a, 0x6c, 0x49, 0x80, 0x3a, 0x90, 0x6e, 0x40, 0x18, 0x90, 0x66, 0x01, 0x25, 0x08, 0x95, 0x8b, 0xe1, 0x04, 0x21, 0x6c, 0xe1, 0x61, 0x4a, 0x66, 0x48, 0x3c, 0x00, 0x1c, 0x3e, 0x00, 0x00, 0x80, 0x3a, 0x11, 0x68, 0x0b, 0xf0, 0xaa, 0xfa, 0x88, 0xe1, 0xaf, 0x60, 0xa8, 0x6f, 0xe8, 0x67, 0x63, 0x48, 0x01, 0x6d, 0xa9, 0x67, 0x07, 0x9a, 0x14, 0x20, 0x00, 0x2a, 0x00, 0xd1, 0x00, 0x20, 0x08, 0x18, 0x12, 0x30, 0xa8, 0x66, 0x70, 0x78, 0xb0, 0x70, 0x30, 0x78, 0x70, 0x70, 0x02, 0x20, 0x30, 0x70, 0xa0, 0x69, 0xfc, 0xf7, 0xc2, 0xfa, 0xef, 0x64, 0xa8, 0x6f, 0x3c, 0x00, 0x58, 0x3e, 0x00, 0x00, 0xe9, 0x6f, 0x59, 0x4b, 0x40, 0x1a, 0x98, 0x42, 0x12, 0xd2, 0x68, 0x6d, 0x06, 0x99, 0x88, 0x42, 0x0e, 0xd0, 0x30, 0x78, 0x02, 0x28, 0x0b, 0xd8, 0x0e, 0xf0, 0x9c, 0xff, 0xa9, 0x6f, 0x08, 0x22, 0x40, 0x1a, 0x52, 0x49, 0x09, 0x1a, 0x3b, 0x1c, 0x16, 0x20, 0x0f, 0xf0, 0x85, 0xfc, 0x00, 0xe0, 0xaf, 0x65, 0x01, 0x20, 0x05, 0x90, 0x08, 0x90, 0x43, 0x48, 0x02, 0x25, 0x3c, 0x00, 0x94, 0x3e, 0x00, 0x00, 0xc4, 0x38, 0xc1, 0x68, 0x00, 0x29, 0x72, 0xd1, 0x01, 0x21, 0xc1, 0x60, 0x49, 0x48, 0x00, 0x6b, 0x00, 0x28, 0x6c, 0xd0, 0x08, 0xf0, 0x66, 0xfc, 0x69, 0xe0, 0x3c, 0x48, 0x00, 0x22, 0x01, 0x92, 0x80, 0x38, 0x80, 0x68, 0x01, 0x28, 0x04, 0xd1, 0x38, 0x48, 0x80, 0x38, 0x87, 0x60, 0x01, 0x20, 0x48, 0xe1, 0x3a, 0x48, 0x01, 0x23, 0x43, 0x60, 0x34, 0x48, 0xc4, 0x38, 0x3c, 0x00, 0xd0, 0x3e, 0x00, 0x00, 0x00, 0x78, 0x00, 0x28, 0x0a, 0xd1, 0x00, 0xf0, 0x25, 0xfe, 0x00, 0x28, 0x06, 0xd0, 0xff, 0x21, 0x91, 0x31, 0x01, 0x23, 0x09, 0x22, 0x16, 0x20, 0x0f, 0xf0, 0x52, 0xfc, 0x2c, 0x49, 0x80, 0x39, 0x48, 0x6f, 0x89, 0x6f, 0x42, 0x1a, 0x03, 0x92, 0x06, 0xf0, 0x76, 0xf9, 0x28, 0x49, 0x80, 0x39, 0x89, 0x6f, 0x03, 0x9a, 0x40, 0x1a, 0x02, 0x90, 0x37, 0x20, 0x00, 0x01, 0x3c, 0x00, 0x0c, 0x3f, 0x00, 0x00, 0x10, 0x1a, 0x50, 0x28, 0x0d, 0xd2, 0x23, 0x48, 0x80, 0x38, 0x40, 0x6d, 0x00, 0x28, 0x04, 0xd1, 0x02, 0x98, 0xff, 0x38, 0x55, 0x38, 0x14, 0x28, 0x01, 0xd2, 0x01, 0x22, 0x00, 0xe0, 0x00, 0x22, 0x01, 0x92, 0x03, 0x9a, 0x01, 0x20, 0xff, 0x3a, 0x0b, 0x3a, 0x50, 0x2a, 0x00, 0xd3, 0x00, 0x20, 0x04, 0x90, 0x00, 0x28, 0x0a, 0xd0, 0x17, 0x48, 0x80, 0x38, 0xc0, 0x6f, 0x3c, 0x00, 0x48, 0x3f, 0x00, 0x00, 0x08, 0x1a, 0x9b, 0x21, 0xc9, 0x00, 0x40, 0x1a, 0x14, 0x28, 0x01, 0xd2, 0x01, 0x22, 0x00, 0xe0, 0x00, 0x22, 0x00, 0x92, 0x00, 0x2a, 0x11, 0xd0, 0x0f, 0x4d, 0x01, 0x20, 0x80, 0x3d, 0x68, 0x65, 0x0e, 0xf0, 0x20, 0xff, 0x68, 0x66, 0x01, 0x25, 0x01, 0x21, 0x16, 0x20, 0x0f, 0xf0, 0x5e, 0xfb, 0x00, 0x21, 0x16, 0x20, 0x0f, 0xf0, 0x5a, 0xfb, 0x00, 0xe0, 0xba, 0xe0, 0x3c, 0x00, 0x84, 0x3f, 0x00, 0x00, 0xf0, 0x79, 0x02, 0x28, 0x3c, 0xd8, 0x05, 0x4a, 0x80, 0x3a, 0x51, 0x6c, 0x00, 0x29, 0x37, 0xd1, 0x13, 0x6c, 0x11, 0x1c, 0x00, 0x2b, 0x33, 0xd1, 0x16, 0xe0, 0x00, 0x00, 0x24, 0x6d, 0x01, 0x00, 0x50, 0xc3, 0x00, 0x00, 0xc0, 0x5c, 0x15, 0x00, 0x70, 0x99, 0x14, 0x00, 0xb0, 0x57, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0xe2, 0x04, 0x00, 0x00, 0x00, 0x90, 0x07, 0x00, 0x3c, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x53, 0x07, 0x00, 0x00, 0x1e, 0x02, 0x00, 0x00, 0xc8, 0x57, 0x01, 0x00, 0x4a, 0x6d, 0x00, 0x2a, 0x02, 0xd0, 0xb2, 0x7a, 0x02, 0x2a, 0x15, 0xd1, 0x00, 0x9a, 0x00, 0x2a, 0x03, 0xd0, 0xca, 0x6d, 0x01, 0x32, 0xca, 0x65, 0x00, 0xe0, 0xcf, 0x65, 0x01, 0x9a, 0x00, 0x2a, 0x0b, 0xd0, 0x8a, 0x6f, 0xcb, 0x6f, 0xd2, 0x1a, 0x5a, 0x4b, 0x9a, 0x42, 0x02, 0xd2, 0x8a, 0x6d, 0x3c, 0x00, 0xfc, 0x3f, 0x00, 0x00, 0x01, 0x32, 0x00, 0xe0, 0x01, 0x22, 0x8a, 0x65, 0x00, 0xe0, 0x8f, 0x65, 0x04, 0x99, 0x00, 0x29, 0x01, 0xd1, 0x02, 0x28, 0x0b, 0xd9, 0x54, 0x4a, 0x02, 0x28, 0x1e, 0xd9, 0xd0, 0x6f, 0x61, 0x68, 0x88, 0x42, 0x1a, 0xd1, 0x91, 0x6f, 0x08, 0x1a, 0x50, 0x49, 0x88, 0x42, 0x15, 0xdd, 0x4e, 0x4b, 0x98, 0x6f, 0xe1, 0x68, 0x40, 0x1a, 0x7d, 0x21, 0xc9, 0x00, 0x88, 0x42, 0x3c, 0x00, 0x38, 0x40, 0x00, 0x00, 0x0b, 0xdd, 0x61, 0x69, 0x40, 0x1a, 0x00, 0x28, 0x04, 0xdd, 0x02, 0x11, 0x40, 0x11, 0x10, 0x18, 0x40, 0x18, 0x01, 0xe0, 0x80, 0x10, 0x08, 0x18, 0x60, 0x61, 0x58, 0x6f, 0xe0, 0x60, 0x03, 0x98, 0xff, 0x38, 0x23, 0x38, 0x14, 0x28, 0x09, 0xd2, 0x02, 0x98, 0xff, 0x38, 0x23, 0x38, 0x14, 0x28, 0x04, 0xd2, 0x3e, 0x4a, 0x90, 0x6f, 0x50, 0x64, 0x90, 0x6a, 0x90, 0x64, 0x3c, 0x00, 0x74, 0x40, 0x00, 0x00, 0x0e, 0xf0, 0x9a, 0xfe, 0x3a, 0x49, 0x49, 0x6c, 0x40, 0x1a, 0x3b, 0x49, 0x88, 0x42, 0x01, 0xd9, 0x37, 0x49, 0x4f, 0x64, 0x39, 0x49, 0x03, 0x98, 0x40, 0x18, 0x14, 0x28, 0x07, 0xd2, 0x34, 0x49, 0xc8, 0x6b, 0x00, 0x28, 0x03, 0xd0, 0x88, 0x6f, 0x08, 0x64, 0x88, 0x6a, 0x88, 0x64, 0x0e, 0xf0, 0x83, 0xfe, 0x2f, 0x49, 0x09, 0x6c, 0x40, 0x1a, 0x31, 0x49, 0x88, 0x42, 0x3c, 0x00, 0xb0, 0x40, 0x00, 0x00, 0x01, 0xd9, 0x2c, 0x48, 0x07, 0x64, 0x04, 0x20, 0x05, 0x90, 0x08, 0x21, 0x16, 0x20, 0x0f, 0xf0, 0xb9, 0xfa, 0x28, 0x48, 0x40, 0x6d, 0x00, 0x28, 0x02, 0xd0, 0x04, 0x99, 0x00, 0x29, 0x08, 0xd0, 0x29, 0x49, 0x00, 0x28, 0x00, 0xd1, 0x29, 0x49, 0x3b, 0x1c, 0x06, 0x22, 0x16, 0x20, 0x0f, 0xf0, 0x57, 0xfb, 0x02, 0x2d, 0x09, 0xd0, 0x06, 0x2d, 0x0a, 0xd0, 0x07, 0x2d, 0x3c, 0x00, 0xec, 0x40, 0x00, 0x00, 0x13, 0xd1, 0x07, 0xe0, 0x01, 0x21, 0x16, 0x20, 0xfd, 0xf7, 0xd6, 0xf8, 0x1e, 0xe0, 0x1a, 0x4a, 0x57, 0x63, 0x97, 0x63, 0x18, 0x4a, 0x06, 0x98, 0xd0, 0x62, 0x07, 0x99, 0x11, 0x63, 0x53, 0x6b, 0x18, 0x43, 0x50, 0x63, 0x90, 0x6b, 0x08, 0x43, 0x90, 0x63, 0x05, 0x98, 0x00, 0x28, 0x05, 0xd0, 0x05, 0x98, 0x0c, 0xf0, 0x5f, 0xfa, 0x05, 0x98, 0x0c, 0xf0, 0xd2, 0xf9, 0x3c, 0x00, 0x28, 0x41, 0x00, 0x00, 0x08, 0x2d, 0x05, 0xd0, 0x0d, 0x48, 0x44, 0x38, 0x85, 0x70, 0x28, 0x1c, 0x03, 0xf0, 0xdc, 0xfd, 0x11, 0x49, 0xe0, 0x69, 0x88, 0x42, 0x00, 0xd1, 0x61, 0xe5, 0x08, 0x98, 0x00, 0x28, 0xfb, 0xd0, 0xb0, 0x7a, 0x02, 0x28, 0xf8, 0xd1, 0x01, 0x21, 0x16, 0x20, 0x0f, 0xf0, 0x6f, 0xfa, 0x02, 0x20, 0x0d, 0xf0, 0xe8, 0xfe, 0x53, 0xe5, 0x00, 0x00, 0x53, 0x07, 0x00, 0x00, 0x3c, 0x00, 0x64, 0x41, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x20, 0xa1, 0x07, 0x00, 0x20, 0x4e, 0x00, 0x00, 0x3f, 0xfb, 0xff, 0xff, 0xa0, 0x86, 0x01, 0x00, 0x50, 0xc3, 0x00, 0x00, 0xc0, 0x5c, 0x15, 0x00, 0xf1, 0x1d, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0xf8, 0xb5, 0x21, 0x48, 0x00, 0x68, 0x21, 0x4d, 0x69, 0x69, 0x08, 0x40, 0x01, 0xd1, 0x01, 0x27, 0x00, 0xe0, 0x00, 0x27, 0x3c, 0x00, 0xa0, 0x41, 0x00, 0x00, 0x1d, 0x4d, 0x01, 0x26, 0x69, 0x6a, 0x00, 0x29, 0x00, 0xd0, 0x00, 0x26, 0x1b, 0x4d, 0x1a, 0x48, 0x2c, 0x1c, 0xa0, 0x30, 0x02, 0x7a, 0x28, 0x1c, 0x40, 0x30, 0x80, 0x34, 0x10, 0x23, 0xb7, 0x42, 0x10, 0xd1, 0x01, 0x25, 0xc5, 0x80, 0x00, 0x29, 0x00, 0xd0, 0x00, 0x23, 0x1a, 0x43, 0x11, 0x1c, 0x01, 0x73, 0x01, 0x20, 0x0e, 0xf0, 0x88, 0xfe, 0x08, 0x20, 0x20, 0x70, 0x3c, 0x00, 0xdc, 0x41, 0x00, 0x00, 0x00, 0x22, 0x16, 0x21, 0x80, 0x20, 0x13, 0xe0, 0x11, 0x27, 0xc7, 0x80, 0x2e, 0x1c, 0x0b, 0x4d, 0x00, 0x29, 0x00, 0xd1, 0x00, 0x23, 0x1a, 0x43, 0x11, 0x1c, 0x01, 0x73, 0x01, 0x20, 0x0e, 0xf0, 0x75, 0xfe, 0x08, 0x20, 0x20, 0x70, 0x30, 0x6d, 0x00, 0x22, 0x16, 0x21, 0x68, 0x67, 0x82, 0x20, 0x0f, 0xf0, 0xd0, 0xfa, 0xf8, 0xbd, 0x00, 0x00, 0x10, 0x00, 0x07, 0x00, 0x3c, 0x00, 0x18, 0x42, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x00, 0x90, 0x07, 0x00, 0xb0, 0xb5, 0x0f, 0x4d, 0x04, 0x1c, 0xaa, 0x7a, 0x01, 0x21, 0x08, 0x1c, 0x00, 0x2a, 0x00, 0xd0, 0x00, 0x20, 0x00, 0x2c, 0x00, 0xd0, 0x00, 0x21, 0x88, 0x42, 0x0a, 0xd0, 0x00, 0x2c, 0x04, 0xd1, 0x00, 0xf0, 0x42, 0xfb, 0x00, 0xf0, 0xd6, 0xfa, 0x03, 0xe0, 0x00, 0xf0, 0xd9, 0xfa, 0x00, 0xf0, 0x09, 0xf8, 0xa8, 0x7a, 0x3c, 0x00, 0x54, 0x42, 0x00, 0x00, 0x02, 0x49, 0xe4, 0x39, 0x48, 0x71, 0xac, 0x72, 0xb0, 0xbd, 0x00, 0x00, 0x44, 0x6d, 0x01, 0x00, 0x80, 0xb5, 0x3e, 0xf0, 0x55, 0xf8, 0x02, 0x49, 0x01, 0x20, 0x08, 0x70, 0x80, 0xbd, 0x00, 0x00, 0x68, 0x7e, 0x01, 0x00, 0xf3, 0xb5, 0x01, 0x20, 0x8d, 0xb0, 0x0f, 0x1c, 0x01, 0x24, 0x08, 0x90, 0x0e, 0xf0, 0x92, 0xfd, 0x06, 0x1c, 0x00, 0xf0, 0xb5, 0xfa, 0x09, 0x90, 0x3c, 0x00, 0x90, 0x42, 0x00, 0x00, 0x00, 0xf0, 0x80, 0xfb, 0x07, 0x90, 0xfe, 0xf7, 0x3f, 0xfa, 0x05, 0x1c, 0x00, 0x21, 0x0c, 0x91, 0x08, 0xf0, 0xf0, 0xfb, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x0a, 0x90, 0xfe, 0xf7, 0x12, 0xfd, 0x05, 0xf0, 0xe0, 0xfe, 0x0b, 0x90, 0x00, 0x2d, 0x23, 0xd0, 0x28, 0x88, 0x41, 0x07, 0x20, 0xd4, 0x29, 0x1d, 0x04, 0x91, 0x0a, 0x35, 0x00, 0x06, 0x3c, 0x00, 0xcc, 0x42, 0x00, 0x00, 0x80, 0x0e, 0x01, 0x21, 0x20, 0x28, 0x03, 0x95, 0x00, 0xd0, 0x00, 0x21, 0x0d, 0x1c, 0x04, 0x98, 0x06, 0xf0, 0x38, 0xfd, 0x0c, 0x90, 0x04, 0x98, 0x06, 0xf0, 0x10, 0xfd, 0x00, 0x28, 0x08, 0xd0, 0x03, 0x98, 0x01, 0xf0, 0x87, 0xfa, 0x00, 0x28, 0x03, 0xd0, 0x00, 0x2d, 0x01, 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x0c, 0x99, 0x01, 0x43, 0x0c, 0x91, 0xfc, 0xf7, 0x3c, 0x00, 0x08, 0x43, 0x00, 0x00, 0x23, 0xff, 0x00, 0x28, 0x2f, 0xd0, 0x07, 0xf0, 0x99, 0xff, 0x05, 0x1c, 0x07, 0xf0, 0xb2, 0xff, 0x04, 0x90, 0xff, 0xf7, 0xf3, 0xf8, 0x0c, 0x99, 0x01, 0x43, 0x00, 0x2d, 0x06, 0xd0, 0x04, 0x98, 0xf0, 0x4a, 0x30, 0x1a, 0x90, 0x42, 0x01, 0xd2, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x08, 0x43, 0x0c, 0x90, 0x0b, 0x98, 0x0a, 0x9b, 0x18, 0x43, 0x01, 0x1c, 0x0b, 0x91, 0x3c, 0x00, 0x44, 0x43, 0x00, 0x00, 0x05, 0xf0, 0xce, 0xfe, 0x00, 0x28, 0x1a, 0xd1, 0x00, 0x2d, 0x06, 0xd0, 0x04, 0x98, 0xe7, 0x49, 0x30, 0x1a, 0x88, 0x42, 0x01, 0xd2, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x0c, 0x99, 0x08, 0x43, 0x05, 0x1c, 0x00, 0xf0, 0x1f, 0xfb, 0x28, 0x43, 0x03, 0xe0, 0x00, 0xf0, 0x1b, 0xfb, 0x0c, 0x99, 0x08, 0x43, 0x0c, 0x90, 0x00, 0xf0, 0xd4, 0xfb, 0x0b, 0x99, 0x01, 0x43, 0x3c, 0x00, 0x80, 0x43, 0x00, 0x00, 0x0b, 0x91, 0xdc, 0x49, 0xc8, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x38, 0xc8, 0x60, 0x08, 0xf0, 0xe7, 0xfb, 0x06, 0x90, 0x08, 0xf0, 0x90, 0xfd, 0x31, 0x1a, 0x05, 0x91, 0x06, 0x99, 0xd6, 0x48, 0x81, 0x42, 0x08, 0xd8, 0x00, 0x2f, 0x08, 0xd1, 0x05, 0x99, 0x40, 0x08, 0x81, 0x42, 0x04, 0xd9, 0x06, 0x99, 0x81, 0x42, 0x01, 0xd9, 0x00, 0x24, 0x8b, 0xe0, 0xd0, 0x48, 0x3c, 0x00, 0xbc, 0x43, 0x00, 0x00, 0x05, 0x99, 0xd0, 0x4d, 0x81, 0x42, 0x26, 0xd2, 0xe8, 0x79, 0x10, 0x28, 0x06, 0xd2, 0x00, 0x2f, 0x21, 0xd1, 0xcc, 0x48, 0xa0, 0x38, 0x80, 0x6a, 0x00, 0x28, 0x1c, 0xd1, 0x09, 0xf0, 0x62, 0xff, 0x04, 0x90, 0x00, 0x28, 0x02, 0xd1, 0x00, 0x20, 0xc3, 0x49, 0x13, 0xe0, 0x09, 0xf0, 0x10, 0xfe, 0x00, 0x28, 0x03, 0xd0, 0xc4, 0x48, 0xc0, 0x69, 0x00, 0x28, 0xf4, 0xd0, 0x3c, 0x00, 0xf8, 0x43, 0x00, 0x00, 0x04, 0x98, 0x05, 0x28, 0x03, 0xd0, 0xc1, 0x48, 0x00, 0x6a, 0x00, 0x28, 0x65, 0xd1, 0xbb, 0x49, 0x48, 0x6a, 0x00, 0x28, 0x23, 0xd0, 0x01, 0x38, 0x48, 0x62, 0x00, 0xf0, 0x87, 0xff, 0x00, 0x28, 0x11, 0xd0, 0xbb, 0x48, 0x05, 0x99, 0x81, 0x42, 0x0d, 0xd2, 0x01, 0xf0, 0x9b, 0xf8, 0x04, 0x30, 0x0d, 0xf0, 0xee, 0xfc, 0x40, 0x30, 0xc1, 0x7a, 0x01, 0x29, 0x4e, 0xd0, 0x3c, 0x00, 0x34, 0x44, 0x00, 0x00, 0x80, 0x7a, 0x00, 0x28, 0x01, 0xd0, 0x05, 0x28, 0x49, 0xd3, 0x01, 0xf0, 0xdf, 0xf8, 0x02, 0x28, 0x10, 0xd0, 0x00, 0x2f, 0x02, 0xd1, 0x06, 0x98, 0x00, 0x28, 0x40, 0xd1, 0x00, 0x20, 0x08, 0x90, 0x82, 0xe1, 0xaa, 0x48, 0xa0, 0x38, 0xc0, 0x68, 0x00, 0x28, 0x38, 0xd0, 0xa8, 0x48, 0x80, 0x69, 0x48, 0x62, 0x34, 0xe0, 0x0a, 0xa9, 0x03, 0xc9, 0x08, 0x43, 0x45, 0xd0, 0x3c, 0x00, 0x70, 0x44, 0x00, 0x00, 0xa3, 0x48, 0x29, 0x78, 0xa0, 0x38, 0x02, 0x29, 0x40, 0xd8, 0x40, 0x6d, 0x00, 0x28, 0x0a, 0xd0, 0x9f, 0x48, 0xa2, 0x49, 0x20, 0x38, 0xc0, 0x68, 0x40, 0x18, 0x0e, 0xf0, 0xc7, 0xfb, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0x96, 0x4a, 0x90, 0x6a, 0x00, 0x28, 0x02, 0xda, 0x64, 0x08, 0x64, 0x00, 0x2a, 0xe0, 0x00, 0x29, 0x09, 0xd1, 0x95, 0x4b, 0x3c, 0x00, 0xac, 0x44, 0x00, 0x00, 0xa0, 0x3b, 0x5b, 0x6d, 0x00, 0x2b, 0x02, 0xd0, 0x05, 0x28, 0x0d, 0xdb, 0x01, 0xe0, 0x07, 0x28, 0x0a, 0xdb, 0x01, 0x20, 0xc0, 0x43, 0x90, 0x62, 0x64, 0x08, 0x8e, 0x49, 0x64, 0x00, 0x00, 0x20, 0xa0, 0x39, 0x88, 0x65, 0x14, 0xe0, 0xd1, 0xe0, 0x39, 0x43, 0x11, 0xd1, 0x89, 0x49, 0xa0, 0x39, 0xcb, 0x6d, 0x00, 0x2b, 0x02, 0xd1, 0x89, 0x6d, 0x01, 0x29, 0x09, 0xd9, 0x3c, 0x00, 0xe8, 0x44, 0x00, 0x00, 0x07, 0x9b, 0x00, 0x2b, 0x01, 0xd1, 0x07, 0x28, 0x01, 0xdb, 0x64, 0x08, 0x64, 0x00, 0x01, 0x30, 0x90, 0x62, 0xbd, 0xe0, 0x7d, 0x49, 0x88, 0x69, 0x04, 0x90, 0x00, 0x20, 0x88, 0x61, 0x0c, 0x98, 0x00, 0x28, 0x2c, 0xd0, 0x07, 0xf0, 0x66, 0xfc, 0x00, 0x28, 0x02, 0xd0, 0x02, 0x20, 0x04, 0x43, 0x25, 0xe0, 0x7a, 0x48, 0xc0, 0x6a, 0x00, 0x28, 0x04, 0xd1, 0x77, 0x48, 0x3c, 0x00, 0x24, 0x45, 0x00, 0x00, 0xa0, 0x38, 0xc0, 0x68, 0x00, 0x28, 0x1c, 0xd1, 0x04, 0x98, 0x00, 0x28, 0x0d, 0xd1, 0x28, 0x78, 0x10, 0x28, 0x02, 0xd3, 0xe8, 0x78, 0x02, 0x28, 0x02, 0xd9, 0x28, 0x79, 0x10, 0x28, 0x04, 0xd3, 0x04, 0x24, 0x6b, 0x49, 0x01, 0x22, 0x8a, 0x61, 0x94, 0xe0, 0x6c, 0x48, 0xa0, 0x38, 0x40, 0x6d, 0x00, 0x28, 0x71, 0xd0, 0x05, 0xf0, 0xa2, 0xfd, 0x00, 0x28, 0x6d, 0xd0, 0x3c, 0x00, 0x60, 0x45, 0x00, 0x00, 0x64, 0x08, 0x64, 0x00, 0x88, 0xe0, 0xff, 0xf7, 0x5b, 0xfa, 0x00, 0x28, 0x1a, 0xd0, 0x68, 0x48, 0x00, 0x78, 0x02, 0x28, 0x01, 0xd1, 0x00, 0x2f, 0x14, 0xd1, 0x00, 0x20, 0xfe, 0xf7, 0x70, 0xfe, 0x30, 0x1a, 0x04, 0x90, 0xff, 0xf7, 0x6c, 0xfa, 0x00, 0x28, 0x07, 0xd0, 0xff, 0xf7, 0x1e, 0xfa, 0x00, 0x28, 0x03, 0xd0, 0x5d, 0x49, 0x04, 0x98, 0x88, 0x42, 0x4f, 0xd3, 0x3c, 0x00, 0x9c, 0x45, 0x00, 0x00, 0x05, 0xf0, 0x6c, 0xfd, 0x00, 0x28, 0x4b, 0xd1, 0x53, 0x49, 0x08, 0x78, 0x03, 0x28, 0x08, 0xd1, 0x88, 0x68, 0x01, 0x22, 0xd2, 0x07, 0x30, 0x1a, 0x90, 0x42, 0x41, 0xd2, 0x01, 0x22, 0x0a, 0x70, 0x57, 0xe0, 0x54, 0x48, 0x00, 0x78, 0x02, 0x28, 0x01, 0xd1, 0x00, 0x2f, 0x51, 0xd1, 0x4a, 0x49, 0x88, 0x68, 0x51, 0x49, 0x80, 0x1b, 0x88, 0x42, 0x07, 0xd9, 0x01, 0x20, 0x3c, 0x00, 0xd8, 0x45, 0x00, 0x00, 0xfe, 0xf7, 0x42, 0xfe, 0x7d, 0x21, 0x09, 0x01, 0x40, 0x18, 0x44, 0x49, 0x88, 0x60, 0x4a, 0x48, 0x00, 0x78, 0x02, 0x28, 0x04, 0xd1, 0x07, 0x9b, 0x00, 0x2b, 0x01, 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x47, 0x4b, 0x47, 0x49, 0x58, 0x43, 0x40, 0x18, 0x3c, 0x49, 0x89, 0x68, 0x89, 0x1b, 0x88, 0x42, 0x30, 0xd9, 0x07, 0x9b, 0x00, 0x20, 0x03, 0x93, 0x00, 0xf0, 0x3c, 0x00, 0x14, 0x46, 0x00, 0x00, 0x79, 0xff, 0x02, 0x90, 0xff, 0xf7, 0xd8, 0xf9, 0x04, 0x90, 0x01, 0xf0, 0x57, 0xf8, 0x04, 0x99, 0x02, 0x9a, 0x51, 0x43, 0x48, 0x43, 0x01, 0x90, 0x00, 0xf0, 0xdc, 0xff, 0x41, 0x1c, 0x01, 0x98, 0x01, 0x22, 0x48, 0x43, 0x11, 0x1c, 0x00, 0xe0, 0x1b, 0xe0, 0x31, 0x4b, 0x5b, 0x6a, 0x83, 0x42, 0x00, 0xd3, 0x00, 0x21, 0x03, 0x9b, 0x01, 0x22, 0x00, 0x2b, 0x00, 0xd0, 0x3c, 0x00, 0x50, 0x46, 0x00, 0x00, 0x00, 0x22, 0x2c, 0x4b, 0x51, 0x43, 0x9b, 0x6a, 0x01, 0x22, 0x83, 0x42, 0x00, 0xd3, 0x00, 0x22, 0x50, 0x00, 0x08, 0x18, 0x03, 0xd0, 0x23, 0x49, 0x03, 0x20, 0x08, 0x70, 0x03, 0xe0, 0x09, 0x98, 0xc0, 0x68, 0x06, 0x28, 0x08, 0xd9, 0x02, 0x24, 0x08, 0x98, 0x00, 0x28, 0x6e, 0xd0, 0x1d, 0x49, 0x00, 0x20, 0xc8, 0x61, 0x48, 0x61, 0xa5, 0xe0, 0x1a, 0x49, 0x48, 0x69, 0x3c, 0x00, 0x8c, 0x46, 0x00, 0x00, 0x00, 0x28, 0x0a, 0xd1, 0x00, 0x2f, 0x05, 0xd0, 0x01, 0x22, 0x4a, 0x61, 0xc8, 0x69, 0x80, 0x18, 0xc8, 0x61, 0x0a, 0xe0, 0x00, 0x20, 0xc8, 0x61, 0x03, 0xe0, 0x00, 0x2f, 0x05, 0xd1, 0x00, 0x20, 0x48, 0x61, 0x0d, 0x98, 0x00, 0x28, 0x00, 0xd1, 0xc8, 0x68, 0x00, 0x20, 0x08, 0x90, 0x08, 0x78, 0x01, 0x28, 0x2f, 0xd0, 0x02, 0x28, 0x4b, 0xd1, 0x00, 0x2f, 0x08, 0xd1, 0x3c, 0x00, 0xc8, 0x46, 0x00, 0x00, 0xe8, 0x78, 0x00, 0x28, 0x02, 0xd1, 0x28, 0x78, 0x10, 0x28, 0x43, 0xd2, 0x28, 0x79, 0x10, 0x28, 0x40, 0xd2, 0x48, 0x68, 0x0a, 0x69, 0x30, 0x1a, 0x90, 0x42, 0x67, 0xd3, 0x01, 0x22, 0x0a, 0x70, 0x38, 0xe0, 0x00, 0x00, 0xe2, 0x04, 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0x68, 0x7e, 0x01, 0x00, 0xa0, 0x86, 0x01, 0x00, 0x88, 0x13, 0x00, 0x00, 0x44, 0x6d, 0x01, 0x00, 0x3c, 0x00, 0x04, 0x47, 0x00, 0x00, 0xc8, 0x57, 0x01, 0x00, 0x50, 0xc3, 0x00, 0x00, 0x98, 0x3a, 0x00, 0x00, 0xc0, 0x57, 0x01, 0x00, 0x40, 0x0d, 0x03, 0x00, 0xc4, 0x09, 0x00, 0x00, 0xb2, 0x0c, 0x00, 0x00, 0x00, 0x20, 0x0b, 0x9a, 0x0a, 0x9b, 0xc0, 0x43, 0x1a, 0x43, 0x37, 0xd0, 0x00, 0x2f, 0x35, 0xd1, 0x07, 0x9b, 0x00, 0x2b, 0x08, 0xd0, 0x6a, 0x78, 0x02, 0x2a, 0x2f, 0xd9, 0x2a, 0x78, 0x10, 0x2a, 0x3c, 0x00, 0x40, 0x47, 0x00, 0x00, 0x2c, 0xd2, 0x2a, 0x79, 0x10, 0x2a, 0x29, 0xd2, 0x25, 0x4b, 0x1a, 0x6c, 0x00, 0x2a, 0x06, 0xd0, 0x9a, 0x6a, 0x9f, 0x6c, 0xba, 0x42, 0x02, 0xd1, 0x1f, 0x20, 0x1f, 0xe0, 0x2e, 0xe0, 0x20, 0x4b, 0x5a, 0x6c, 0x00, 0x2a, 0x03, 0xd0, 0x1f, 0x4f, 0xb3, 0x1a, 0xbb, 0x42, 0x16, 0xd3, 0x1c, 0x4b, 0x00, 0x2a, 0x05, 0xd0, 0x9a, 0x6a, 0x9f, 0x6c, 0xba, 0x42, 0x01, 0xd1, 0x3c, 0x00, 0x7c, 0x47, 0x00, 0x00, 0x0f, 0x20, 0x0d, 0xe0, 0x07, 0x9a, 0x00, 0x2a, 0x04, 0xd0, 0xea, 0x79, 0x20, 0x2a, 0x01, 0xd1, 0x00, 0x20, 0x05, 0xe0, 0xea, 0x79, 0x10, 0x2a, 0x01, 0xd3, 0x03, 0x20, 0x00, 0xe0, 0x9a, 0x6a, 0x12, 0x4a, 0x12, 0x68, 0x02, 0x40, 0x0b, 0xd1, 0x01, 0x20, 0x08, 0x90, 0x02, 0x20, 0x08, 0x70, 0x0f, 0x48, 0x08, 0x61, 0x4e, 0x60, 0x64, 0xe7, 0xff, 0xe7, 0x01, 0x20, 0x3c, 0x00, 0xb8, 0x47, 0x00, 0x00, 0x08, 0x90, 0x60, 0xe7, 0x0c, 0x49, 0x88, 0x6a, 0x00, 0x28, 0x01, 0xda, 0x01, 0x30, 0x02, 0xe0, 0x00, 0x28, 0x01, 0xdd, 0x00, 0x20, 0x88, 0x62, 0x00, 0x20, 0x08, 0x62, 0x08, 0x99, 0x20, 0x04, 0x08, 0x43, 0x0f, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x71, 0x02, 0x00, 0x00, 0x08, 0x20, 0x07, 0x00, 0x53, 0x07, 0x00, 0x00, 0x68, 0x7e, 0x01, 0x00, 0x3c, 0x00, 0xf4, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x00, 0x48, 0x70, 0x47, 0x50, 0x7e, 0x01, 0x00, 0x80, 0xb5, 0x3d, 0xf0, 0x7f, 0xfd, 0x02, 0x49, 0x01, 0x20, 0x08, 0x70, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x7e, 0x01, 0x00, 0xf8, 0xb5, 0x0d, 0x1c, 0x0e, 0xf0, 0xc8, 0xfa, 0x26, 0x49, 0x04, 0x1c, 0x88, 0x6a, 0x26, 0x4e, 0x00, 0x28, 0x01, 0xd0, 0x04, 0x20, 0x03, 0xe0, 0x70, 0x6a, 0x00, 0x28, 0x3c, 0x00, 0x30, 0x48, 0x00, 0x00, 0x01, 0xd0, 0x01, 0x38, 0x70, 0x62, 0x00, 0x27, 0x00, 0x2d, 0x02, 0xd0, 0xb7, 0x61, 0xf7, 0x61, 0x0a, 0xe0, 0xb0, 0x69, 0x1c, 0x49, 0x01, 0x30, 0xb0, 0x61, 0x49, 0x6d, 0x00, 0x29, 0x03, 0xd0, 0x03, 0x28, 0x01, 0xd9, 0x01, 0x20, 0xf0, 0x61, 0xb4, 0x60, 0xf1, 0x68, 0x00, 0x91, 0x08, 0xf0, 0xf7, 0xfc, 0xf0, 0x60, 0x00, 0x99, 0x88, 0x42, 0x02, 0xd0, 0x30, 0x62, 0x3c, 0x00, 0x6c, 0x48, 0x00, 0x00, 0x34, 0x61, 0x0b, 0xe0, 0x00, 0xf0, 0x90, 0xf8, 0x00, 0x28, 0x01, 0xd0, 0x11, 0x48, 0x00, 0xe0, 0x11, 0x48, 0x31, 0x69, 0x61, 0x1a, 0x81, 0x42, 0x00, 0xd9, 0x37, 0x62, 0x0b, 0x4a, 0x0c, 0x48, 0xd1, 0x6c, 0x20, 0x30, 0x00, 0x29, 0x01, 0xd0, 0x0a, 0x21, 0x03, 0xe0, 0x01, 0x7a, 0x00, 0x29, 0x01, 0xd0, 0xff, 0x31, 0x01, 0x72, 0x00, 0x2d, 0x03, 0xd1, 0x01, 0x7a, 0x3c, 0x00, 0xa8, 0x48, 0x00, 0x00, 0x00, 0x29, 0x00, 0xd0, 0x91, 0x6a, 0x00, 0x7a, 0x00, 0x28, 0x00, 0xd1, 0x17, 0x65, 0xf8, 0xbd, 0xa4, 0x6c, 0x01, 0x00, 0x3c, 0x7e, 0x01, 0x00, 0xa6, 0x0e, 0x00, 0x00, 0xa8, 0x61, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x06, 0x49, 0x80, 0xb5, 0x89, 0x68, 0x00, 0x29, 0x07, 0xd0, 0x05, 0x21, 0x00, 0x28, 0x00, 0xd1, 0x04, 0x21, 0x08, 0x06, 0x00, 0x0e, 0x03, 0xf0, 0x3c, 0x00, 0xe4, 0x48, 0x00, 0x00, 0x05, 0xfa, 0x80, 0xbd, 0x60, 0x6c, 0x01, 0x00, 0x07, 0x48, 0x00, 0x68, 0x07, 0x49, 0x4a, 0x69, 0x10, 0x40, 0x01, 0xd0, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x49, 0x6a, 0x88, 0x42, 0x01, 0xd1, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x10, 0x00, 0x07, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x70, 0xb5, 0x0e, 0xf0, 0x49, 0xfa, 0x02, 0x1c, 0x00, 0xf0, 0x3a, 0xf8, 0x3c, 0x00, 0x20, 0x49, 0x00, 0x00, 0x10, 0x49, 0x00, 0x28, 0x0e, 0xd0, 0x08, 0x1c, 0xa0, 0x31, 0x0e, 0x78, 0x0e, 0x4b, 0x10, 0x2e, 0x01, 0xd3, 0x80, 0x6f, 0x03, 0xe0, 0x49, 0x78, 0x10, 0x29, 0x0e, 0xd3, 0xc0, 0x6f, 0xc0, 0x18, 0x84, 0x1a, 0x0a, 0xe0, 0x08, 0x1c, 0x80, 0x30, 0x45, 0x69, 0x08, 0x49, 0x8d, 0x42, 0x01, 0xd9, 0x0c, 0x1c, 0x05, 0xe0, 0xc0, 0x68, 0x10, 0x1a, 0x2c, 0x1a, 0x00, 0x2c, 0x3c, 0x00, 0x5c, 0x49, 0x00, 0x00, 0x00, 0xda, 0x64, 0x19, 0x20, 0x1c, 0x70, 0xbd, 0xa4, 0x6c, 0x01, 0x00, 0xa6, 0x0e, 0x00, 0x00, 0x50, 0xc3, 0x00, 0x00, 0x80, 0xb5, 0x05, 0xf0, 0xb7, 0xfb, 0x00, 0x28, 0x02, 0xd0, 0x07, 0xf0, 0x1f, 0xff, 0x80, 0xbd, 0x03, 0x48, 0x00, 0x78, 0x00, 0x28, 0xfa, 0xd0, 0x07, 0xf0, 0x70, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, 0x03, 0x49, 0x01, 0x20, 0x3c, 0x00, 0x98, 0x49, 0x00, 0x00, 0x49, 0x69, 0x03, 0x29, 0x00, 0xd8, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, 0xb0, 0xb5, 0x0a, 0x4d, 0x00, 0x24, 0x28, 0x78, 0x01, 0x28, 0x03, 0xd0, 0x05, 0xf0, 0x6a, 0xfb, 0x04, 0x06, 0x24, 0x0e, 0xfe, 0xf7, 0xd2, 0xfc, 0x00, 0x02, 0x20, 0x43, 0x02, 0xd1, 0x68, 0x6a, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0xb0, 0xbd, 0x00, 0x20, 0xb0, 0xbd, 0x3c, 0x00, 0xd4, 0x49, 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, 0x01, 0x21, 0x01, 0x28, 0x00, 0xd0, 0x00, 0x21, 0x01, 0x48, 0x41, 0x62, 0x70, 0x47, 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, 0x15, 0x48, 0x10, 0xb5, 0x04, 0x68, 0x15, 0x48, 0x00, 0x6a, 0x00, 0x28, 0x14, 0xd0, 0xff, 0xf7, 0xcb, 0xff, 0x00, 0x28, 0x0e, 0xd1, 0x11, 0x48, 0x11, 0x49, 0xc4, 0x30, 0x40, 0x69, 0x88, 0x42, 0x08, 0xd2, 0xcc, 0x08, 0x3c, 0x00, 0x10, 0x4a, 0x00, 0x00, 0xa0, 0x42, 0x05, 0xd3, 0xff, 0xf7, 0x7e, 0xff, 0xa0, 0x42, 0x01, 0xda, 0x0c, 0x4c, 0x01, 0xe0, 0xff, 0x24, 0x91, 0x34, 0x7d, 0x20, 0x00, 0x01, 0x84, 0x42, 0x04, 0xd9, 0x00, 0x22, 0x16, 0x21, 0x83, 0x20, 0x0e, 0xf0, 0xbd, 0xfe, 0x01, 0x23, 0x09, 0x22, 0x21, 0x1c, 0x16, 0x20, 0x0e, 0xf0, 0xa7, 0xfe, 0x10, 0xbd, 0xb0, 0x57, 0x01, 0x00, 0x60, 0x6c, 0x01, 0x00, 0x3c, 0x00, 0x4c, 0x4a, 0x00, 0x00, 0xc0, 0x5d, 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0x70, 0xb5, 0x05, 0x1c, 0x0e, 0x1c, 0x00, 0xf0, 0x43, 0xf8, 0x00, 0x28, 0x0f, 0xd0, 0x08, 0x4c, 0x20, 0x78, 0xc0, 0x07, 0x03, 0xd4, 0x05, 0xf0, 0xab, 0xf9, 0x09, 0xf0, 0x31, 0xfe, 0x00, 0x2d, 0x05, 0xd0, 0x20, 0x78, 0x80, 0x07, 0x02, 0xd4, 0x30, 0x1c, 0x02, 0xf0, 0xfd, 0xfe, 0x70, 0xbd, 0x60, 0x6c, 0x01, 0x00, 0x3c, 0x00, 0x88, 0x4a, 0x00, 0x00, 0xb0, 0xb5, 0x00, 0x28, 0x18, 0xd0, 0x11, 0x48, 0x81, 0x42, 0x15, 0xd2, 0x10, 0x48, 0x0c, 0x1c, 0x0d, 0x18, 0x07, 0xf0, 0xdf, 0xfa, 0x81, 0x00, 0x09, 0x18, 0xa1, 0x42, 0x01, 0xd2, 0x40, 0x00, 0x03, 0xe0, 0x41, 0x00, 0x09, 0x18, 0xa1, 0x42, 0x01, 0xd2, 0x24, 0x1a, 0x06, 0xe0, 0x41, 0x00, 0xa1, 0x42, 0x03, 0xd2, 0x40, 0x08, 0xf8, 0xe7, 0x06, 0x4d, 0x07, 0x4c, 0x3c, 0x00, 0xc4, 0x4a, 0x00, 0x00, 0x0e, 0xf0, 0x72, 0xf9, 0x00, 0x19, 0x29, 0x1c, 0x07, 0xf0, 0xdc, 0xfa, 0xb0, 0xbd, 0x00, 0x00, 0x80, 0xb9, 0x2a, 0x00, 0x53, 0x07, 0x00, 0x00, 0x4c, 0x1d, 0x00, 0x00, 0x88, 0x13, 0x00, 0x00, 0xb0, 0xb5, 0x05, 0xf0, 0xfd, 0xfa, 0x00, 0x28, 0x13, 0xd1, 0xfe, 0xf7, 0xb5, 0xfe, 0x0a, 0x4c, 0x0a, 0x4d, 0x00, 0x28, 0x60, 0x63, 0x00, 0xd0, 0x28, 0x60, 0x0e, 0xf0, 0x3c, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x55, 0xf9, 0x21, 0x6a, 0x00, 0x29, 0x04, 0xd1, 0xe1, 0x69, 0x40, 0x1a, 0x29, 0x68, 0x88, 0x42, 0x01, 0xd9, 0x01, 0x20, 0xb0, 0xbd, 0x00, 0x20, 0xb0, 0xbd, 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, 0xb0, 0x57, 0x01, 0x00, 0x80, 0xb5, 0xff, 0xf7, 0xdd, 0xff, 0x00, 0x28, 0x05, 0xd0, 0x05, 0xf0, 0xb7, 0xfa, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x80, 0xbd, 0x00, 0x20, 0x3c, 0x00, 0x3c, 0x4b, 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x0a, 0x4c, 0x00, 0x21, 0xa2, 0x68, 0x00, 0x2a, 0x03, 0xd0, 0xa1, 0x60, 0x02, 0xf0, 0x83, 0xf9, 0x10, 0xbd, 0x61, 0x60, 0x01, 0x1c, 0x00, 0x22, 0x04, 0x20, 0x0e, 0xf0, 0x36, 0xfd, 0x03, 0x48, 0x21, 0x68, 0x0a, 0xf0, 0x08, 0xfc, 0x10, 0xbd, 0x00, 0x00, 0xbc, 0x74, 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, 0x70, 0xb5, 0x05, 0x1c, 0x3c, 0x00, 0x78, 0x4b, 0x00, 0x00, 0x01, 0xd1, 0xfc, 0xf7, 0xc1, 0xfb, 0x20, 0x4c, 0xe0, 0x6a, 0x00, 0x28, 0x15, 0xd0, 0x1f, 0x4b, 0xa0, 0x69, 0x58, 0x43, 0xc6, 0x0b, 0x20, 0x88, 0x46, 0x43, 0xf0, 0x00, 0x80, 0x19, 0xe6, 0x60, 0xfb, 0xf7, 0x1c, 0xfe, 0xa8, 0x42, 0x05, 0xd8, 0x30, 0x1c, 0xfb, 0xf7, 0x17, 0xfe, 0x80, 0x19, 0xa8, 0x42, 0x02, 0xd2, 0x00, 0x20, 0xe0, 0x60, 0x20, 0xe0, 0xe5, 0x60, 0x3c, 0x00, 0xb4, 0x4b, 0x00, 0x00, 0x00, 0x2d, 0x1d, 0xd0, 0x26, 0x88, 0xa0, 0x69, 0x70, 0x43, 0xc1, 0x03, 0x28, 0x1c, 0xfb, 0xf7, 0xa5, 0xfd, 0x60, 0x61, 0x0d, 0x48, 0x32, 0x1c, 0x29, 0x1c, 0x30, 0x30, 0xfb, 0xf7, 0x0a, 0xfc, 0x0c, 0x4b, 0x60, 0x69, 0x58, 0x43, 0xc0, 0x0b, 0x60, 0x62, 0x01, 0xf0, 0xb7, 0xfd, 0xa0, 0x62, 0xe0, 0x68, 0x00, 0x28, 0x04, 0xd0, 0x20, 0x69, 0xa1, 0x68, 0xfb, 0xf7, 0x3c, 0x00, 0xf0, 0x4b, 0x00, 0x00, 0xf4, 0xfb, 0x70, 0xbd, 0x05, 0x48, 0xa1, 0x68, 0xfb, 0xf7, 0xef, 0xfb, 0x70, 0xbd, 0x00, 0x00, 0xc8, 0x74, 0x01, 0x00, 0x40, 0x42, 0x0f, 0x00, 0xc0, 0xc6, 0x2d, 0x00, 0x88, 0x13, 0x00, 0x00, 0xf1, 0xb5, 0x3e, 0x48, 0x00, 0xab, 0x81, 0x78, 0xc0, 0x78, 0x3e, 0x4f, 0x0a, 0x07, 0x04, 0x07, 0x58, 0x78, 0x3b, 0x49, 0x12, 0x0f, 0x08, 0x5c, 0x14, 0x39, 0x24, 0x0f, 0x3c, 0x00, 0x2c, 0x4c, 0x00, 0x00, 0x80, 0x18, 0x78, 0x60, 0x01, 0x30, 0xb8, 0x60, 0x18, 0x78, 0x35, 0x4d, 0x08, 0x5c, 0x00, 0x19, 0xb8, 0x61, 0x01, 0x30, 0xf8, 0x61, 0xeb, 0x78, 0x33, 0x48, 0x1e, 0x09, 0x33, 0x4b, 0x18, 0x38, 0x81, 0x78, 0x5e, 0x43, 0xab, 0x78, 0x1d, 0x09, 0xc8, 0x23, 0x6b, 0x43, 0x00, 0x29, 0x08, 0xd1, 0x2b, 0x4d, 0x2d, 0x78, 0x3d, 0x60, 0xc5, 0x60, 0x7d, 0x25, 0xed, 0x00, 0x3c, 0x00, 0x68, 0x4c, 0x00, 0x00, 0x5d, 0x1b, 0x2c, 0x4b, 0x07, 0xe0, 0x27, 0x4d, 0x6d, 0x78, 0x3d, 0x60, 0xc5, 0x60, 0x4b, 0x25, 0x2d, 0x01, 0x5d, 0x1b, 0x28, 0x4b, 0xf6, 0x18, 0x02, 0x20, 0x00, 0xf0, 0x57, 0xf8, 0x28, 0x1a, 0xf8, 0x60, 0x22, 0x48, 0x22, 0x1c, 0x18, 0x38, 0x81, 0x78, 0x03, 0x20, 0x00, 0xf0, 0x4e, 0xf8, 0x30, 0x1a, 0x38, 0x62, 0x39, 0x68, 0x00, 0xab, 0x79, 0x61, 0x5a, 0x78, 0x3c, 0x00, 0xa4, 0x4c, 0x00, 0x00, 0x56, 0x23, 0xf9, 0x68, 0x5a, 0x43, 0x89, 0x1a, 0xf9, 0x60, 0xc8, 0x31, 0x39, 0x61, 0x18, 0x49, 0x18, 0x39, 0x89, 0x78, 0x00, 0x29, 0xb9, 0x69, 0x11, 0xd1, 0x00, 0xab, 0x1a, 0x78, 0x13, 0x4b, 0x14, 0x3b, 0x9a, 0x5c, 0x53, 0x1c, 0x59, 0x43, 0x0a, 0x23, 0x59, 0x43, 0x14, 0x4b, 0x59, 0x1a, 0x51, 0x43, 0x0a, 0x23, 0x59, 0x43, 0x40, 0x1a, 0x38, 0x62, 0x12, 0x49, 0x3c, 0x00, 0xe0, 0x4c, 0x00, 0x00, 0x10, 0xe0, 0x00, 0xab, 0x1a, 0x78, 0x0a, 0x4b, 0x14, 0x3b, 0x9a, 0x5c, 0x53, 0x1c, 0x59, 0x43, 0x0a, 0x23, 0x59, 0x43, 0x0d, 0x4b, 0x59, 0x1a, 0x51, 0x43, 0x0a, 0x23, 0x59, 0x43, 0x40, 0x1a, 0x0b, 0x49, 0x38, 0x62, 0x40, 0x18, 0x78, 0x62, 0xf8, 0xbd, 0x00, 0x00, 0x0c, 0x5a, 0x01, 0x00, 0x66, 0x5a, 0x01, 0x00, 0x94, 0x78, 0x01, 0x00, 0xa0, 0x86, 0x01, 0x00, 0x3c, 0x00, 0x1c, 0x4d, 0x00, 0x00, 0x00, 0x48, 0x71, 0x00, 0xb0, 0xd6, 0x8c, 0x00, 0x88, 0x10, 0x00, 0x00, 0x80, 0x38, 0x01, 0x00, 0x58, 0x12, 0x00, 0x00, 0x70, 0x11, 0x01, 0x00, 0x30, 0xb5, 0x19, 0x4b, 0x02, 0x28, 0xdd, 0x68, 0x06, 0xd1, 0x00, 0x29, 0x04, 0xd1, 0x2b, 0x1c, 0x0c, 0x33, 0x9c, 0x1a, 0x64, 0x23, 0x5c, 0x43, 0x02, 0x28, 0x09, 0xd1, 0x01, 0x29, 0x07, 0xd1, 0x64, 0x23, 0x7d, 0x24, 0x3c, 0x00, 0x58, 0x4d, 0x00, 0x00, 0xe4, 0x00, 0x6b, 0x43, 0x1c, 0x19, 0xa0, 0x23, 0x53, 0x43, 0xe4, 0x1a, 0x0a, 0x23, 0x5a, 0x43, 0x03, 0x28, 0x09, 0xd1, 0x00, 0x29, 0x07, 0xd1, 0x13, 0x23, 0xff, 0x24, 0xe4, 0x00, 0x6b, 0x43, 0x1b, 0x19, 0x9b, 0x1a, 0x1c, 0x1c, 0x5c, 0x43, 0x03, 0x28, 0x08, 0xd1, 0x01, 0x29, 0x06, 0xd1, 0x0e, 0x20, 0x05, 0x49, 0x68, 0x43, 0x40, 0x18, 0x80, 0x1a, 0x04, 0x1c, 0x3c, 0x00, 0x94, 0x4d, 0x00, 0x00, 0x44, 0x43, 0x20, 0x1c, 0x30, 0xbd, 0x00, 0x00, 0x7c, 0x78, 0x01, 0x00, 0x84, 0x08, 0x00, 0x00, 0x10, 0xb5, 0x07, 0x4c, 0x0c, 0x23, 0x60, 0x78, 0x05, 0x49, 0x14, 0x31, 0x58, 0x43, 0x40, 0x18, 0x40, 0x68, 0x01, 0xf0, 0x4f, 0xfc, 0x00, 0x21, 0x60, 0x78, 0x02, 0xf0, 0x4b, 0xff, 0x10, 0xbd, 0x4c, 0x7b, 0x01, 0x00, 0x0c, 0x48, 0xf8, 0xb5, 0x40, 0x78, 0x0c, 0x23, 0x3c, 0x00, 0xd0, 0x4d, 0x00, 0x00, 0x0a, 0x49, 0x58, 0x43, 0x14, 0x31, 0x44, 0x18, 0x26, 0x1d, 0x60, 0xce, 0x30, 0x1c, 0x0b, 0xf0, 0x0b, 0xfd, 0x00, 0x27, 0x41, 0x20, 0x47, 0x55, 0x05, 0x48, 0x29, 0x1c, 0x02, 0xf0, 0xf0, 0xfe, 0x28, 0x1c, 0x01, 0xf0, 0x31, 0xfc, 0x04, 0x34, 0xc0, 0xc4, 0xf8, 0xbd, 0x4c, 0x7b, 0x01, 0x00, 0x55, 0x80, 0x00, 0x00, 0xb0, 0xb5, 0x0a, 0x4d, 0x4c, 0x21, 0x28, 0x78, 0x3c, 0x00, 0x0c, 0x4e, 0x00, 0x00, 0x09, 0x4a, 0x41, 0x43, 0x8c, 0x18, 0x22, 0x68, 0x01, 0x21, 0xfb, 0xf7, 0xe1, 0xfa, 0x28, 0x78, 0x01, 0xf0, 0xfa, 0xfb, 0x3c, 0x23, 0xe0, 0x56, 0x41, 0x1e, 0x01, 0x20, 0x07, 0xf0, 0x34, 0xfb, 0xb0, 0xbd, 0x00, 0x00, 0x3c, 0x7c, 0x01, 0x00, 0x58, 0xe3, 0x01, 0x00, 0x0c, 0x23, 0x07, 0x49, 0x58, 0x43, 0x40, 0x18, 0x80, 0xb5, 0x40, 0x68, 0x41, 0x6b, 0x00, 0x29, 0x3c, 0x00, 0x48, 0x4e, 0x00, 0x00, 0x02, 0xd0, 0x0b, 0xf0, 0xfb, 0xfd, 0x80, 0xbd, 0x0b, 0xf0, 0x2c, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0x38, 0x22, 0x0a, 0x4b, 0x42, 0x43, 0xd2, 0x18, 0x00, 0x29, 0x80, 0xb5, 0x04, 0xd0, 0x02, 0x29, 0x07, 0xd1, 0x0b, 0xf0, 0xfb, 0xfc, 0x80, 0xbd, 0xd2, 0x6a, 0x01, 0x21, 0xfb, 0xf7, 0xb0, 0xfa, 0x80, 0xbd, 0x03, 0x21, 0x86, 0x20, 0xfc, 0xf7, 0x3c, 0x00, 0x84, 0x4e, 0x00, 0x00, 0x0f, 0xfa, 0x80, 0xbd, 0xd4, 0xe4, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x06, 0x24, 0x0e, 0x0c, 0x20, 0x0e, 0x49, 0x60, 0x43, 0x40, 0x18, 0x45, 0x68, 0xa8, 0x6b, 0x00, 0x28, 0x03, 0xd1, 0x00, 0x21, 0x20, 0x1c, 0xfd, 0xf7, 0xe1, 0xfa, 0x20, 0x1c, 0x07, 0xf0, 0xf2, 0xff, 0x00, 0x28, 0x08, 0xd0, 0x28, 0x1c, 0x60, 0x30, 0xc1, 0x79, 0x01, 0x29, 0x03, 0xd9, 0xff, 0x31, 0x3c, 0x00, 0xc0, 0x4e, 0x00, 0x00, 0xc1, 0x71, 0xff, 0x31, 0x81, 0x71, 0x01, 0x21, 0x20, 0x1c, 0x02, 0xf0, 0xc5, 0xfe, 0xb0, 0xbd, 0x60, 0x7b, 0x01, 0x00, 0x70, 0xb5, 0x00, 0x06, 0x00, 0x0e, 0x05, 0x1c, 0x4c, 0x23, 0x0a, 0x49, 0x58, 0x43, 0x44, 0x18, 0x3c, 0x20, 0x00, 0x5d, 0xff, 0x30, 0x06, 0x06, 0x36, 0x16, 0x28, 0x1c, 0x01, 0xf0, 0x90, 0xfb, 0x00, 0x21, 0x28, 0x1c, 0x22, 0x68, 0xfb, 0xf7, 0x3c, 0x00, 0xfc, 0x4e, 0x00, 0x00, 0x6f, 0xfa, 0x31, 0x1c, 0x00, 0x20, 0x07, 0xf0, 0xc7, 0xfa, 0x70, 0xbd, 0x58, 0xe3, 0x01, 0x00, 0x0c, 0x22, 0x0f, 0x4b, 0x42, 0x43, 0xd2, 0x18, 0x10, 0xb5, 0x54, 0x68, 0x00, 0x29, 0x0d, 0xd0, 0x02, 0x29, 0x0f, 0xd1, 0x2c, 0x20, 0x00, 0x5d, 0x00, 0x28, 0x03, 0xd0, 0x07, 0x21, 0x0c, 0x20, 0xfc, 0xf7, 0xba, 0xf9, 0x20, 0x1c, 0x0b, 0xf0, 0xbb, 0xfc, 0x10, 0xbd, 0x3c, 0x00, 0x38, 0x4f, 0x00, 0x00, 0x00, 0x21, 0x02, 0xf0, 0x8d, 0xfe, 0x10, 0xbd, 0x04, 0x21, 0x0c, 0x20, 0xfc, 0xf7, 0xae, 0xf9, 0x10, 0xbd, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x29, 0x07, 0xd0, 0x0c, 0x23, 0x05, 0x49, 0x58, 0x43, 0x40, 0x18, 0x40, 0x68, 0x0b, 0xf0, 0x4a, 0xfc, 0x80, 0xbd, 0x01, 0x21, 0x02, 0xf0, 0x76, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0x3c, 0x00, 0x74, 0x4f, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x00, 0x29, 0x05, 0xd0, 0x02, 0x29, 0x1a, 0xd1, 0x20, 0x1c, 0x0b, 0xf0, 0xeb, 0xfc, 0x10, 0xbd, 0x0d, 0x48, 0x04, 0x70, 0x0d, 0x48, 0x07, 0xf0, 0x07, 0xf9, 0x0d, 0x48, 0x01, 0x88, 0x01, 0x22, 0x12, 0x03, 0x11, 0x43, 0x01, 0x80, 0x4c, 0x20, 0x0a, 0x49, 0x60, 0x43, 0x40, 0x18, 0x40, 0x30, 0x00, 0x78, 0xfd, 0xf7, 0x5d, 0xfd, 0x20, 0x1c, 0x3c, 0x00, 0xb0, 0x4f, 0x00, 0x00, 0x0a, 0xf0, 0xd4, 0xf8, 0x10, 0xbd, 0x03, 0x21, 0x86, 0x20, 0xfc, 0xf7, 0x73, 0xf9, 0x10, 0xbd, 0x3c, 0x7c, 0x01, 0x00, 0x05, 0x4e, 0x00, 0x00, 0x32, 0x80, 0x07, 0x00, 0x58, 0xe3, 0x01, 0x00, 0xff, 0xb5, 0x05, 0x1c, 0x01, 0x20, 0x83, 0xb0, 0x01, 0x90, 0x0c, 0x20, 0x5d, 0x4a, 0x68, 0x43, 0x86, 0x18, 0x01, 0x27, 0x00, 0x29, 0x74, 0x68, 0x0e, 0xd0, 0x02, 0x29, 0x3c, 0x00, 0xec, 0x4f, 0x00, 0x00, 0x6a, 0xd1, 0x2c, 0x20, 0x00, 0x5d, 0x00, 0x28, 0x03, 0xd0, 0x06, 0x21, 0x0c, 0x20, 0xfc, 0xf7, 0x53, 0xf9, 0x20, 0x1c, 0x0b, 0xf0, 0x20, 0xfd, 0x07, 0xb0, 0xf0, 0xbd, 0x52, 0x48, 0x14, 0x38, 0x45, 0x70, 0xa0, 0x6b, 0x00, 0x28, 0x07, 0xd0, 0x50, 0x48, 0x07, 0xf0, 0x7f, 0xf8, 0x01, 0x21, 0x28, 0x1c, 0xfd, 0xf7, 0x25, 0xfa, 0x1c, 0xe0, 0x4d, 0x48, 0x07, 0xf0, 0x3c, 0x00, 0x28, 0x50, 0x00, 0x00, 0x77, 0xf8, 0x4a, 0x48, 0x14, 0x38, 0x05, 0x70, 0x4b, 0x48, 0x01, 0x88, 0x01, 0x22, 0x52, 0x03, 0x11, 0x43, 0x01, 0x80, 0x40, 0x20, 0x00, 0x5d, 0xfd, 0xf7, 0x12, 0xfd, 0xb0, 0x68, 0x00, 0x28, 0x09, 0xd1, 0x28, 0x1c, 0x07, 0xf0, 0x64, 0xff, 0xb0, 0x60, 0x00, 0x28, 0x03, 0xd1, 0x09, 0x21, 0x0c, 0x20, 0xfc, 0xf7, 0x23, 0xf9, 0x05, 0x98, 0x00, 0x28, 0x03, 0xd0, 0x3c, 0x00, 0x64, 0x50, 0x00, 0x00, 0xe0, 0x6c, 0x01, 0x30, 0xe0, 0x64, 0x0e, 0xe0, 0x67, 0x20, 0x00, 0x5d, 0x00, 0x28, 0x07, 0xd1, 0xe0, 0x6c, 0x00, 0x28, 0x04, 0xd1, 0x39, 0x48, 0x02, 0x38, 0xc0, 0x6a, 0xa0, 0x64, 0x09, 0xe0, 0x20, 0x6d, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x27, 0x04, 0xe0, 0x28, 0x1c, 0x07, 0xf0, 0x00, 0xff, 0x00, 0x28, 0xe5, 0xd1, 0x05, 0x98, 0x20, 0x65, 0x20, 0x1c, 0x20, 0x30, 0x3c, 0x00, 0xa0, 0x50, 0x00, 0x00, 0x62, 0x6a, 0x02, 0x90, 0x81, 0x7b, 0x28, 0x1c, 0x07, 0xf0, 0x78, 0xff, 0x00, 0x2f, 0x19, 0xd0, 0x20, 0x1c, 0x60, 0x30, 0xc1, 0x79, 0x4a, 0x1c, 0xc2, 0x71, 0x80, 0x79, 0x81, 0x42, 0x02, 0xd2, 0x01, 0x20, 0x01, 0xe0, 0x40, 0xe0, 0x00, 0x20, 0x01, 0x90, 0x00, 0x28, 0x0a, 0xd0, 0x25, 0x48, 0x00, 0x78, 0x80, 0x07, 0x06, 0xd5, 0x00, 0xf0, 0x0d, 0xfb, 0x01, 0x1c, 0x3c, 0x00, 0xdc, 0x50, 0x00, 0x00, 0x20, 0x1c, 0x0b, 0xf0, 0x15, 0xfd, 0x01, 0x90, 0x01, 0x98, 0x00, 0x28, 0x0f, 0xd0, 0x02, 0x98, 0x00, 0x7b, 0x02, 0x28, 0x03, 0xd1, 0x20, 0x1c, 0x04, 0xf0, 0xd0, 0xfe, 0x84, 0xe7, 0x01, 0x28, 0x00, 0xd0, 0x7e, 0xe7, 0x21, 0x1c, 0x30, 0x1c, 0x04, 0xf0, 0xe2, 0xfe, 0x7c, 0xe7, 0x25, 0x1c, 0x60, 0x35, 0xe8, 0x79, 0xff, 0x30, 0xa8, 0x71, 0x68, 0x7a, 0x06, 0xf0, 0x3c, 0x00, 0x18, 0x51, 0x00, 0x00, 0x9d, 0xfc, 0x0d, 0xf0, 0x47, 0xfe, 0x07, 0x1c, 0x05, 0xf0, 0x12, 0xff, 0x3f, 0x18, 0x02, 0x98, 0x81, 0x7b, 0x20, 0x69, 0x04, 0x30, 0x00, 0xf0, 0x35, 0xfa, 0x61, 0x6a, 0x05, 0xf0, 0xea, 0xfe, 0x39, 0x18, 0x6b, 0x7a, 0x30, 0x88, 0x80, 0x31, 0x09, 0x4a, 0x0d, 0xf0, 0x91, 0xfe, 0x5d, 0xe7, 0x03, 0x21, 0x0c, 0x20, 0xfc, 0xf7, 0xaa, 0xf8, 0x58, 0xe7, 0x00, 0x00, 0x3c, 0x00, 0x54, 0x51, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0xa5, 0x4d, 0x00, 0x00, 0xc9, 0x4d, 0x00, 0x00, 0x32, 0x80, 0x07, 0x00, 0x1d, 0x75, 0x01, 0x00, 0x8d, 0x4e, 0x00, 0x00, 0xff, 0xb5, 0x81, 0xb0, 0x1f, 0x1c, 0x05, 0x1c, 0x14, 0x1c, 0x10, 0x1c, 0x0a, 0x9e, 0x00, 0xf0, 0xf5, 0xfc, 0x29, 0x1c, 0x10, 0x31, 0x20, 0x1d, 0x06, 0x22, 0xfb, 0xf7, 0xb7, 0xf9, 0xa8, 0x8e, 0x20, 0x80, 0xe8, 0x8e, 0x3c, 0x00, 0x90, 0x51, 0x00, 0x00, 0x60, 0x80, 0x02, 0x99, 0x20, 0x1c, 0x00, 0xf0, 0x07, 0xf9, 0xff, 0x34, 0x01, 0x34, 0x66, 0x60, 0x27, 0x60, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x0f, 0x1c, 0x1e, 0x1c, 0x05, 0x1c, 0x14, 0x1c, 0x10, 0x1c, 0x00, 0xf0, 0xd8, 0xfc, 0xa8, 0x88, 0x39, 0x1c, 0x20, 0x80, 0x28, 0x89, 0x60, 0x80, 0x20, 0x1c, 0x00, 0xf0, 0xf0, 0xf8, 0xff, 0x34, 0x01, 0x34, 0x3c, 0x00, 0xcc, 0x51, 0x00, 0x00, 0x66, 0x60, 0xf8, 0xbd, 0x70, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0x05, 0x68, 0x20, 0x1c, 0x14, 0x30, 0x06, 0x1c, 0x00, 0xf0, 0x0f, 0xfb, 0x00, 0x28, 0x16, 0xd0, 0x01, 0x22, 0x02, 0x21, 0x20, 0x69, 0x05, 0xf0, 0xf8, 0xfa, 0x00, 0x28, 0x01, 0xd0, 0xfb, 0xf7, 0x24, 0xff, 0x00, 0x22, 0x02, 0x21, 0x20, 0x69, 0x05, 0xf0, 0xef, 0xfa, 0x00, 0x28, 0x06, 0xd0, 0xfb, 0xf7, 0x3c, 0x00, 0x08, 0x52, 0x00, 0x00, 0x01, 0xff, 0x00, 0x28, 0x02, 0xd0, 0x30, 0x1c, 0x0b, 0xf0, 0x7c, 0xfb, 0x68, 0x89, 0x80, 0x07, 0xc0, 0x0f, 0x03, 0xf0, 0xa7, 0xf8, 0x18, 0x23, 0x04, 0x49, 0x58, 0x43, 0x40, 0x18, 0xc1, 0x68, 0x00, 0x29, 0x02, 0xd0, 0x20, 0x1c, 0xfb, 0xf7, 0xd4, 0xf8, 0x70, 0xbd, 0x94, 0x67, 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0x10, 0x1c, 0x0d, 0x1c, 0x19, 0x1c, 0xff, 0x22, 0x3c, 0x00, 0x44, 0x52, 0x00, 0x00, 0x00, 0x27, 0xff, 0x2d, 0x25, 0xd0, 0x00, 0x29, 0x05, 0xd0, 0x4b, 0x88, 0x00, 0x2b, 0x02, 0xd0, 0x00, 0xf0, 0x50, 0xfc, 0x15, 0xe0, 0x00, 0x21, 0x10, 0x4e, 0x4b, 0x00, 0x9e, 0x19, 0x02, 0x23, 0xf6, 0x5e, 0x86, 0x42, 0x01, 0xdd, 0x0a, 0x1c, 0x04, 0xe0, 0x01, 0x31, 0x09, 0x06, 0x09, 0x0e, 0x26, 0x29, 0xf1, 0xd3, 0x09, 0x4e, 0x50, 0x00, 0x80, 0x19, 0x4e, 0x23, 0x3c, 0x00, 0x80, 0x52, 0x00, 0x00, 0xc0, 0x5e, 0x27, 0x2a, 0x07, 0xd2, 0x06, 0x49, 0x20, 0x39, 0x49, 0x57, 0x47, 0x31, 0x40, 0x1a, 0x20, 0x60, 0x01, 0x27, 0x02, 0xe0, 0x7e, 0x20, 0xc0, 0x43, 0x20, 0x60, 0x38, 0x1c, 0xf8, 0xbd, 0xfa, 0x47, 0x01, 0x00, 0xb0, 0xb5, 0x0c, 0x1c, 0x7e, 0x21, 0x05, 0x1c, 0x00, 0x20, 0xc9, 0x43, 0x00, 0x2c, 0x0f, 0xd0, 0x10, 0x1c, 0x05, 0xf0, 0x6b, 0xfd, 0x00, 0x28, 0x3c, 0x00, 0xbc, 0x52, 0x00, 0x00, 0x02, 0xd0, 0x21, 0x1c, 0xc9, 0x39, 0x01, 0xe0, 0x21, 0x1c, 0x86, 0x39, 0x02, 0x20, 0xc0, 0x43, 0xfb, 0xf7, 0xb4, 0xf9, 0x01, 0x1c, 0x01, 0x20, 0x29, 0x60, 0xb0, 0xbd, 0x98, 0xb5, 0x14, 0x1c, 0x00, 0x22, 0x00, 0x92, 0x22, 0x1c, 0xfd, 0xf7, 0x43, 0xfe, 0x98, 0xbd, 0x05, 0x49, 0x80, 0xb5, 0x08, 0x60, 0x05, 0x49, 0x01, 0x20, 0xc8, 0x61, 0x01, 0x21, 0x00, 0x20, 0x3c, 0x00, 0xf8, 0x52, 0x00, 0x00, 0x03, 0xf0, 0x1c, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x20, 0x67, 0x01, 0x00, 0xac, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x21, 0x00, 0x20, 0x03, 0xf0, 0x11, 0xfe, 0x06, 0xf0, 0x0d, 0xfb, 0x02, 0x49, 0x00, 0x20, 0x08, 0x60, 0x80, 0xbd, 0x00, 0x00, 0x20, 0x67, 0x01, 0x00, 0x03, 0x49, 0x01, 0x20, 0x09, 0x69, 0x00, 0x29, 0x00, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0x34, 0x53, 0x00, 0x00, 0x10, 0x67, 0x01, 0x00, 0x03, 0x48, 0x00, 0x69, 0x00, 0x28, 0x01, 0xd0, 0x40, 0x69, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x10, 0x67, 0x01, 0x00, 0x70, 0xb5, 0x16, 0x1c, 0x0d, 0x1c, 0x04, 0x1c, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x2c, 0x07, 0xd1, 0x00, 0xf0, 0x36, 0xfa, 0x00, 0x28, 0x05, 0xd0, 0x13, 0xf0, 0xca, 0xf9, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x70, 0xbd, 0x3c, 0x00, 0x70, 0x53, 0x00, 0x00, 0x01, 0x20, 0x00, 0x2c, 0x00, 0xd0, 0x00, 0x20, 0x0a, 0x4c, 0x04, 0x34, 0x61, 0xc4, 0x10, 0x3c, 0x00, 0xf0, 0x24, 0xfa, 0x00, 0x28, 0x02, 0xd0, 0x00, 0xf0, 0xc6, 0xf9, 0x01, 0xe0, 0x00, 0xf0, 0xe5, 0xf8, 0xc0, 0x30, 0xc3, 0x6b, 0x22, 0x1d, 0x07, 0xca, 0xfb, 0xf7, 0x20, 0xf8, 0x00, 0x20, 0x70, 0xbd, 0x00, 0x00, 0xd4, 0x67, 0x01, 0x00, 0xf8, 0xb5, 0x0d, 0x1c, 0x3c, 0x00, 0xac, 0x53, 0x00, 0x00, 0x00, 0x21, 0x04, 0x1c, 0x28, 0x1c, 0x05, 0xf0, 0xe3, 0xf9, 0x23, 0x1c, 0xff, 0x33, 0x21, 0x33, 0xff, 0x27, 0x00, 0x28, 0x05, 0xd0, 0x22, 0x22, 0x01, 0x1c, 0x18, 0x1c, 0xfb, 0xf7, 0x96, 0xf8, 0x00, 0xe0, 0x1f, 0x70, 0x03, 0x21, 0x28, 0x1c, 0x05, 0xf0, 0xd2, 0xf9, 0x26, 0x1c, 0xff, 0x36, 0x41, 0x36, 0x00, 0x28, 0x05, 0xd0, 0x03, 0x22, 0x01, 0x1c, 0xb0, 0x1c, 0x3c, 0x00, 0xe8, 0x53, 0x00, 0x00, 0xfb, 0xf7, 0x86, 0xf8, 0x00, 0xe0, 0xb7, 0x70, 0x01, 0x21, 0x28, 0x1c, 0x05, 0xf0, 0xc2, 0xf9, 0x00, 0x28, 0x07, 0xd0, 0x01, 0x1c, 0x20, 0x1c, 0xff, 0x30, 0x0a, 0x22, 0x46, 0x30, 0xfb, 0xf7, 0x77, 0xf8, 0x00, 0xe0, 0x77, 0x71, 0x32, 0x21, 0x28, 0x1c, 0x05, 0xf0, 0xb3, 0xf9, 0x00, 0x28, 0x07, 0xd0, 0x01, 0x1c, 0x20, 0x1c, 0xff, 0x30, 0x12, 0x22, 0x50, 0x30, 0x3c, 0x00, 0x24, 0x54, 0x00, 0x00, 0xfb, 0xf7, 0x68, 0xf8, 0x00, 0xe0, 0xf7, 0x73, 0x06, 0x21, 0x28, 0x1c, 0x05, 0xf0, 0xa4, 0xf9, 0x00, 0x28, 0x07, 0xd0, 0x01, 0x1c, 0x20, 0x1c, 0xff, 0x30, 0x04, 0x22, 0x63, 0x30, 0xfb, 0xf7, 0x59, 0xf8, 0xf8, 0xbd, 0xff, 0x34, 0x61, 0x34, 0xa7, 0x70, 0xfa, 0xe7, 0x08, 0x49, 0x80, 0xb5, 0x09, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x07, 0x48, 0x01, 0x68, 0x08, 0x1c, 0x3c, 0x00, 0x60, 0x54, 0x00, 0x00, 0x05, 0xd1, 0x03, 0x21, 0x90, 0x20, 0xfb, 0xf7, 0x1d, 0xff, 0x00, 0x20, 0x80, 0xbd, 0x01, 0xf0, 0xd7, 0xfb, 0x80, 0xbd, 0x1c, 0x67, 0x01, 0x00, 0x20, 0x67, 0x01, 0x00, 0x80, 0xb5, 0xff, 0xf7, 0xe7, 0xff, 0x80, 0xbd, 0xf0, 0xb5, 0x00, 0x24, 0x84, 0x46, 0x00, 0x20, 0x0b, 0xe0, 0x87, 0x40, 0x17, 0x40, 0x07, 0xd0, 0x14, 0x23, 0x0b, 0x4d, 0x43, 0x43, 0x5b, 0x19, 0x3c, 0x00, 0x9c, 0x54, 0x00, 0x00, 0x1b, 0x7c, 0x65, 0x46, 0x2b, 0x55, 0x01, 0x34, 0x01, 0x30, 0x01, 0x27, 0x3b, 0x1c, 0x0e, 0x28, 0x00, 0xd3, 0x00, 0x23, 0x0e, 0x88, 0x3d, 0x1c, 0xa6, 0x42, 0x00, 0xdc, 0x00, 0x25, 0x2b, 0x40, 0xe7, 0xd1, 0x0c, 0x80, 0xf0, 0xbd, 0x00, 0x00, 0x74, 0x40, 0x01, 0x00, 0x78, 0xb5, 0x04, 0x1c, 0x01, 0x20, 0x20, 0x70, 0x08, 0x20, 0x00, 0xab, 0x0d, 0x1c, 0x18, 0x80, 0x3c, 0x00, 0xd8, 0x54, 0x00, 0x00, 0x16, 0x1c, 0xa0, 0x1c, 0x69, 0x46, 0xff, 0xf7, 0xd1, 0xff, 0x00, 0xab, 0x00, 0x22, 0xd2, 0x43, 0x19, 0x88, 0x82, 0x40, 0x61, 0x70, 0x32, 0x20, 0x28, 0x70, 0x10, 0x20, 0x18, 0x80, 0x32, 0x40, 0xa8, 0x1c, 0x69, 0x46, 0xff, 0xf7, 0xc2, 0xff, 0x00, 0xab, 0x18, 0x88, 0x68, 0x70, 0x78, 0xbd, 0x80, 0xb5, 0x02, 0xf0, 0x35, 0xff, 0x00, 0x21, 0x00, 0x28, 0x00, 0xd0, 0x3c, 0x00, 0x14, 0x55, 0x00, 0x00, 0x01, 0x69, 0x08, 0x1c, 0x80, 0xbd, 0x00, 0x00, 0x05, 0x49, 0x00, 0x28, 0x01, 0xd0, 0xc8, 0x68, 0x00, 0xe0, 0x08, 0x69, 0x00, 0x28, 0x01, 0xd0, 0x04, 0x30, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x10, 0x67, 0x01, 0x00, 0x03, 0x48, 0x00, 0x69, 0x00, 0x28, 0x01, 0xd0, 0x04, 0x30, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x10, 0x67, 0x01, 0x00, 0x02, 0x48, 0x00, 0x69, 0x3c, 0x00, 0x50, 0x55, 0x00, 0x00, 0x00, 0x28, 0xff, 0xd1, 0x70, 0x47, 0x00, 0x00, 0x10, 0x67, 0x01, 0x00, 0x10, 0xb5, 0x05, 0x4c, 0x20, 0x69, 0x00, 0x28, 0x03, 0xd1, 0x04, 0x21, 0x90, 0x20, 0xfb, 0xf7, 0x9b, 0xfe, 0x20, 0x69, 0x10, 0xbd, 0x00, 0x00, 0x10, 0x67, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x00, 0xf0, 0x40, 0xf9, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x20, 0x10, 0xbd, 0x20, 0x1c, 0x00, 0xf0, 0x3c, 0x00, 0x8c, 0x55, 0x00, 0x00, 0x57, 0xf9, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x20, 0x10, 0xbd, 0x02, 0x20, 0x10, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x0f, 0x4e, 0x04, 0x1c, 0x30, 0x68, 0x0d, 0x1c, 0x00, 0x28, 0x07, 0xd0, 0x21, 0x1c, 0x04, 0x30, 0x05, 0xf0, 0xc1, 0xfb, 0x00, 0x28, 0x01, 0xd0, 0x30, 0x68, 0x0b, 0xe0, 0x09, 0x4a, 0x10, 0x68, 0x00, 0x28, 0x09, 0xd0, 0x21, 0x1c, 0x14, 0x1c, 0x04, 0x30, 0x3c, 0x00, 0xc8, 0x55, 0x00, 0x00, 0x05, 0xf0, 0xb4, 0xfb, 0x00, 0x28, 0x02, 0xd0, 0x20, 0x68, 0x9c, 0x30, 0x00, 0xe0, 0x03, 0x48, 0x40, 0x5d, 0x70, 0xbd, 0x20, 0x67, 0x01, 0x00, 0x1c, 0x67, 0x01, 0x00, 0xcc, 0x47, 0x01, 0x00, 0x04, 0x49, 0x00, 0x20, 0x09, 0x69, 0x00, 0x29, 0x02, 0xd0, 0xff, 0x31, 0x01, 0x31, 0x88, 0x69, 0x70, 0x47, 0x00, 0x00, 0x10, 0x67, 0x01, 0x00, 0x01, 0x48, 0x00, 0x7a, 0x3c, 0x00, 0x04, 0x56, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0xac, 0x7c, 0x01, 0x00, 0xfe, 0xb5, 0x06, 0x1c, 0x00, 0x20, 0x1f, 0x1c, 0x14, 0x1c, 0x00, 0x29, 0x02, 0x90, 0x19, 0xd0, 0x01, 0x29, 0x26, 0xd0, 0x02, 0x29, 0x47, 0xd1, 0x26, 0x48, 0x00, 0x78, 0x05, 0xf0, 0xa0, 0xfb, 0xa0, 0x72, 0x0a, 0xf0, 0x4f, 0xfc, 0x0e, 0x28, 0x09, 0xd1, 0xa0, 0x7a, 0x05, 0xf0, 0xaa, 0xfb, 0x00, 0x28, 0x04, 0xd0, 0x3c, 0x00, 0x40, 0x56, 0x00, 0x00, 0x20, 0x48, 0x00, 0x78, 0x05, 0xf0, 0x92, 0xfb, 0xa0, 0x72, 0x00, 0x20, 0x20, 0x72, 0x2f, 0xe0, 0x1d, 0x4d, 0x28, 0x68, 0x00, 0x28, 0x01, 0xd1, 0xfb, 0xf7, 0x52, 0xfe, 0x00, 0x97, 0x2a, 0x68, 0x23, 0x1c, 0x18, 0x32, 0x11, 0x1c, 0x30, 0x1c, 0xfc, 0xf7, 0xde, 0xfb, 0x26, 0xe0, 0x30, 0x1c, 0x0c, 0xf0, 0xca, 0xfb, 0x05, 0x1c, 0x02, 0xd0, 0xa8, 0x68, 0x00, 0x28, 0x3c, 0x00, 0x7c, 0x56, 0x00, 0x00, 0x08, 0xd1, 0x13, 0x48, 0x00, 0x68, 0x00, 0x28, 0x01, 0xd1, 0xfb, 0xf7, 0x3b, 0xfe, 0x10, 0x48, 0x00, 0x68, 0x18, 0x30, 0x02, 0x1c, 0x0e, 0x48, 0x00, 0x97, 0x01, 0x68, 0x23, 0x1c, 0x18, 0x31, 0x30, 0x1c, 0xfc, 0xf7, 0xc3, 0xfb, 0x00, 0x2d, 0x0a, 0xd0, 0x40, 0x35, 0x28, 0x88, 0x80, 0x06, 0x06, 0xd4, 0x00, 0x20, 0x20, 0x60, 0x03, 0xe0, 0x01, 0x21, 0x90, 0x20, 0x3c, 0x00, 0xb8, 0x56, 0x00, 0x00, 0xfb, 0xf7, 0xf4, 0xfd, 0x02, 0x98, 0xfe, 0xbd, 0xb0, 0x69, 0x01, 0x00, 0x90, 0x57, 0x01, 0x00, 0x20, 0x67, 0x01, 0x00, 0x1c, 0x67, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x20, 0x02, 0xf0, 0x4a, 0xfe, 0x18, 0x23, 0x05, 0x4a, 0x58, 0x43, 0x80, 0x18, 0x40, 0x69, 0x01, 0x21, 0x00, 0x28, 0x00, 0xd0, 0x41, 0x78, 0x08, 0x1c, 0x80, 0xbd, 0x00, 0x00, 0x94, 0x67, 0x01, 0x00, 0x3c, 0x00, 0xf4, 0x56, 0x00, 0x00, 0x02, 0x49, 0x08, 0x69, 0x00, 0x28, 0x00, 0xd1, 0xc8, 0x68, 0x70, 0x47, 0x10, 0x67, 0x01, 0x00, 0x03, 0x48, 0xc0, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x04, 0x30, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x10, 0x67, 0x01, 0x00, 0x10, 0xb5, 0x05, 0x4c, 0xe0, 0x68, 0x00, 0x28, 0x03, 0xd1, 0x05, 0x21, 0x90, 0x20, 0xfb, 0xf7, 0xbd, 0xfd, 0xe0, 0x68, 0x10, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x30, 0x57, 0x00, 0x00, 0x10, 0x67, 0x01, 0x00, 0xf8, 0xb5, 0x0d, 0x1c, 0x00, 0x2a, 0x03, 0xd0, 0x11, 0x49, 0x12, 0x4f, 0x0e, 0x78, 0x01, 0xe0, 0x11, 0x4f, 0x0c, 0x26, 0x08, 0x2e, 0x01, 0xd2, 0x34, 0x1c, 0x00, 0xe0, 0x08, 0x24, 0x01, 0x21, 0x01, 0x70, 0x44, 0x70, 0x39, 0x1c, 0x22, 0x1c, 0x02, 0x30, 0xfa, 0xf7, 0xcb, 0xfe, 0x32, 0x1b, 0x00, 0x2a, 0x07, 0xdd, 0x32, 0x20, 0x28, 0x70, 0x3c, 0x00, 0x6c, 0x57, 0x00, 0x00, 0x39, 0x19, 0xa8, 0x1c, 0x6a, 0x70, 0xfa, 0xf7, 0xc1, 0xfe, 0xf8, 0xbd, 0xff, 0x20, 0x28, 0x70, 0x00, 0x20, 0x68, 0x70, 0xf9, 0xe7, 0x00, 0x00, 0xa4, 0x69, 0x01, 0x00, 0xb0, 0x69, 0x01, 0x00, 0x90, 0x57, 0x01, 0x00, 0x01, 0x49, 0x48, 0x62, 0x70, 0x47, 0x00, 0x00, 0x94, 0x67, 0x01, 0x00, 0x03, 0x49, 0x80, 0xb5, 0x08, 0x60, 0x01, 0x21, 0x01, 0x20, 0x03, 0xf0, 0x3c, 0x00, 0xa8, 0x57, 0x00, 0x00, 0xc5, 0xfb, 0x80, 0xbd, 0x1c, 0x67, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x21, 0x01, 0x20, 0x03, 0xf0, 0xbd, 0xfb, 0x06, 0xf0, 0xb9, 0xf8, 0x02, 0x49, 0x00, 0x20, 0x08, 0x60, 0x80, 0xbd, 0x00, 0x00, 0x1c, 0x67, 0x01, 0x00, 0x03, 0x49, 0x01, 0x20, 0xc9, 0x68, 0x00, 0x29, 0x00, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x10, 0x67, 0x01, 0x00, 0x03, 0x48, 0xc0, 0x68, 0x3c, 0x00, 0xe4, 0x57, 0x00, 0x00, 0x00, 0x28, 0x01, 0xd0, 0x40, 0x69, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x10, 0x67, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x01, 0x20, 0x03, 0xf0, 0x9b, 0xfb, 0x80, 0xbd, 0x05, 0x4a, 0x80, 0xb5, 0x12, 0x69, 0x00, 0x21, 0x00, 0x2a, 0x03, 0xd0, 0x11, 0x1d, 0x05, 0xf0, 0x91, 0xfa, 0x01, 0x1c, 0x08, 0x1c, 0x80, 0xbd, 0x10, 0x67, 0x01, 0x00, 0x06, 0x4a, 0x80, 0xb5, 0x3c, 0x00, 0x20, 0x58, 0x00, 0x00, 0x12, 0x69, 0x00, 0x21, 0x00, 0x2a, 0x05, 0xd0, 0x11, 0x1c, 0xff, 0x31, 0x21, 0x31, 0x05, 0xf0, 0x8b, 0xfa, 0x01, 0x1c, 0x08, 0x1c, 0x80, 0xbd, 0x10, 0x67, 0x01, 0x00, 0x05, 0x4a, 0x80, 0xb5, 0xd2, 0x68, 0x00, 0x21, 0x00, 0x2a, 0x03, 0xd0, 0x11, 0x1d, 0x05, 0xf0, 0x73, 0xfa, 0x01, 0x1c, 0x08, 0x1c, 0x80, 0xbd, 0x10, 0x67, 0x01, 0x00, 0x06, 0x4a, 0x80, 0xb5, 0x3c, 0x00, 0x5c, 0x58, 0x00, 0x00, 0xd2, 0x68, 0x00, 0x21, 0x00, 0x2a, 0x05, 0xd0, 0x11, 0x1c, 0xff, 0x31, 0x21, 0x31, 0x05, 0xf0, 0x6d, 0xfa, 0x01, 0x1c, 0x08, 0x1c, 0x80, 0xbd, 0x10, 0x67, 0x01, 0x00, 0xff, 0xb5, 0x0d, 0x1c, 0x1f, 0x1c, 0x87, 0xb0, 0x10, 0x9e, 0x00, 0x24, 0x02, 0xf0, 0x72, 0xfd, 0x18, 0x23, 0x13, 0x49, 0x58, 0x43, 0x08, 0x58, 0x00, 0x28, 0x19, 0xd0, 0x04, 0x1c, 0x33, 0x1c, 0x3c, 0x00, 0x98, 0x58, 0x00, 0x00, 0x3a, 0x1c, 0x28, 0x1c, 0x09, 0x99, 0xfa, 0xf7, 0x9f, 0xfd, 0x04, 0x1c, 0x14, 0xd0, 0x18, 0x20, 0x00, 0xab, 0x18, 0x80, 0xaa, 0x68, 0x01, 0xa8, 0x69, 0x46, 0xff, 0xf7, 0xe7, 0xfd, 0x6a, 0x46, 0x01, 0xa9, 0x00, 0x20, 0x07, 0xf0, 0x44, 0xfe, 0x00, 0x28, 0x05, 0xd1, 0x0a, 0x21, 0x00, 0xe0, 0x0f, 0x21, 0x90, 0x20, 0xfb, 0xf7, 0xea, 0xfc, 0x20, 0x1c, 0x0b, 0xb0, 0x3c, 0x00, 0xd4, 0x58, 0x00, 0x00, 0xf0, 0xbd, 0x00, 0x00, 0x94, 0x67, 0x01, 0x00, 0x10, 0xb5, 0x00, 0x24, 0x02, 0xf0, 0x44, 0xfd, 0x18, 0x23, 0x05, 0x49, 0x58, 0x43, 0x40, 0x18, 0x80, 0x68, 0x00, 0x28, 0x02, 0xd0, 0xfa, 0xf7, 0x71, 0xfd, 0x01, 0x24, 0x20, 0x1c, 0x10, 0xbd, 0x94, 0x67, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x4b, 0x00, 0xf0, 0x4e, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x10, 0x67, 0x01, 0x00, 0x3c, 0x00, 0x10, 0x59, 0x00, 0x00, 0x80, 0xb5, 0x02, 0x4b, 0x00, 0xf0, 0x46, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x11, 0x67, 0x01, 0x00, 0xf8, 0xb5, 0x0e, 0x1c, 0x15, 0x1c, 0x00, 0x28, 0x1c, 0x49, 0x10, 0xd0, 0x48, 0x68, 0x1c, 0x4a, 0x28, 0x80, 0x00, 0x20, 0x07, 0xe0, 0x0b, 0x18, 0x1c, 0x7a, 0x14, 0x23, 0x63, 0x43, 0x9b, 0x18, 0x1b, 0x7c, 0x33, 0x54, 0x01, 0x30, 0x2b, 0x88, 0x83, 0x42, 0xf4, 0xdc, 0x3c, 0x00, 0x4c, 0x59, 0x00, 0x00, 0x24, 0xe0, 0x00, 0x20, 0x0f, 0x1c, 0x00, 0x24, 0x08, 0x60, 0x0f, 0xe0, 0x30, 0x5d, 0x05, 0xf0, 0x07, 0xfa, 0x0e, 0x28, 0x01, 0xd1, 0x00, 0x20, 0xf8, 0xbd, 0x39, 0x19, 0x08, 0x72, 0x01, 0x22, 0x39, 0x68, 0x82, 0x40, 0x11, 0x43, 0x08, 0x1c, 0x38, 0x60, 0x01, 0x34, 0x28, 0x88, 0xa0, 0x42, 0xec, 0xdc, 0x28, 0x88, 0x78, 0x60, 0xff, 0xf7, 0xb7, 0xfe, 0x00, 0x28, 0x3c, 0x00, 0x88, 0x59, 0x00, 0x00, 0x06, 0xd0, 0x01, 0x69, 0x00, 0x29, 0x03, 0xd0, 0x7f, 0x21, 0xc9, 0x43, 0x0b, 0xf0, 0x52, 0xfb, 0x01, 0x20, 0xe3, 0xe7, 0x2c, 0x7d, 0x01, 0x00, 0x74, 0x40, 0x01, 0x00, 0x10, 0xb5, 0x1c, 0x1c, 0x00, 0x28, 0x0b, 0xd0, 0x20, 0x78, 0x0e, 0x28, 0x05, 0xd2, 0x14, 0x23, 0x0c, 0x4a, 0x58, 0x43, 0x80, 0x18, 0x00, 0x7c, 0x00, 0xe0, 0x00, 0x20, 0x08, 0x70, 0x0e, 0xe0, 0x3c, 0x00, 0xc4, 0x59, 0x00, 0x00, 0x08, 0x78, 0x05, 0xf0, 0xd1, 0xf9, 0x20, 0x70, 0xff, 0xf7, 0x92, 0xfe, 0x00, 0x28, 0x06, 0xd0, 0x01, 0x69, 0x00, 0x29, 0x03, 0xd0, 0x7f, 0x21, 0xc9, 0x43, 0x0b, 0xf0, 0x2d, 0xfb, 0x01, 0x20, 0x10, 0xbd, 0x00, 0x00, 0x74, 0x40, 0x01, 0x00, 0x80, 0xb5, 0x27, 0x20, 0xc0, 0x43, 0x09, 0xf0, 0x31, 0xfc, 0x80, 0xbd, 0x80, 0xb5, 0x27, 0x20, 0xc0, 0x43, 0x09, 0xf0, 0x3c, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x39, 0xfc, 0x80, 0xbd, 0x80, 0xb5, 0x28, 0x20, 0x09, 0xf0, 0x42, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x28, 0x20, 0x09, 0xf0, 0x4a, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x01, 0x28, 0x28, 0xd1, 0x01, 0x29, 0x01, 0xd0, 0xfb, 0xf7, 0x6b, 0xfc, 0xff, 0xf7, 0xe9, 0xfd, 0x02, 0x28, 0x1a, 0xd1, 0x07, 0xf0, 0x13, 0xfc, 0x12, 0x4c, 0x21, 0x69, 0x88, 0x42, 0x3c, 0x00, 0x3c, 0x5a, 0x00, 0x00, 0x15, 0xd0, 0x07, 0xf0, 0x0d, 0xfc, 0x20, 0x61, 0x20, 0x68, 0x7d, 0x24, 0xe4, 0x00, 0x44, 0x43, 0x0d, 0xf0, 0xae, 0xf9, 0x05, 0x1c, 0x07, 0xf0, 0x0b, 0xfc, 0x28, 0x1a, 0x84, 0x42, 0x00, 0xd9, 0x24, 0x1a, 0x01, 0x22, 0x21, 0x1c, 0x0a, 0x20, 0x0d, 0xf0, 0xb2, 0xfd, 0xb0, 0xbd, 0x00, 0x21, 0x09, 0x20, 0x0c, 0xf0, 0x75, 0xfc, 0xb0, 0xbd, 0x07, 0x21, 0x0a, 0x20, 0x3c, 0x00, 0x78, 0x5a, 0x00, 0x00, 0xfb, 0xf7, 0x14, 0xfc, 0xb0, 0xbd, 0x00, 0x00, 0xd4, 0x67, 0x01, 0x00, 0x7d, 0x20, 0x02, 0x49, 0x00, 0x01, 0x08, 0x60, 0x70, 0x47, 0x00, 0x00, 0xd4, 0x67, 0x01, 0x00, 0x10, 0xb5, 0x81, 0x6d, 0x04, 0x1c, 0xff, 0x30, 0x46, 0x30, 0x0c, 0xf0, 0xd1, 0xfc, 0x20, 0x1c, 0xff, 0x30, 0x50, 0x30, 0xa1, 0x6d, 0x0c, 0xf0, 0xcb, 0xfc, 0x10, 0xbd, 0xb0, 0xb5, 0x04, 0x1c, 0x3c, 0x00, 0xb4, 0x5a, 0x00, 0x00, 0x0d, 0x1c, 0x02, 0xf0, 0x59, 0xfc, 0x20, 0x1c, 0x02, 0xf0, 0x56, 0xfc, 0x18, 0x23, 0x04, 0x49, 0x58, 0x43, 0x40, 0x18, 0x18, 0x22, 0x29, 0x1c, 0xfa, 0xf7, 0x70, 0xfd, 0xb0, 0xbd, 0x00, 0x00, 0x94, 0x67, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x09, 0xf0, 0xbc, 0xfb, 0x20, 0x1c, 0x09, 0xf0, 0xc7, 0xfb, 0x10, 0xbd, 0x10, 0xb5, 0x04, 0x1c, 0x09, 0xf0, 0xd0, 0xfb, 0x3c, 0x00, 0xf0, 0x5a, 0x00, 0x00, 0x20, 0x1c, 0x09, 0xf0, 0xdb, 0xfb, 0x10, 0xbd, 0x70, 0xb5, 0x0c, 0x78, 0x06, 0x1c, 0x48, 0x88, 0x4d, 0x78, 0xe2, 0x00, 0x80, 0x1a, 0xe9, 0x00, 0x40, 0x1a, 0x01, 0x1c, 0x41, 0x43, 0x12, 0x31, 0x24, 0x20, 0xfa, 0xf7, 0x91, 0xfd, 0x21, 0x1c, 0x61, 0x43, 0xc9, 0x00, 0x40, 0x18, 0x29, 0x1c, 0x69, 0x43, 0xc9, 0x00, 0x42, 0x18, 0x0c, 0x49, 0x88, 0x79, 0x0c, 0x4b, 0x3c, 0x00, 0x2c, 0x5b, 0x00, 0x00, 0x53, 0x43, 0x0c, 0x4a, 0x13, 0x60, 0x53, 0x7b, 0x34, 0x02, 0x14, 0x60, 0x52, 0x7b, 0x88, 0x71, 0x01, 0x33, 0x58, 0x10, 0x08, 0x4b, 0x80, 0x1a, 0x01, 0x21, 0x49, 0x02, 0x58, 0x43, 0x00, 0x28, 0x00, 0xda, 0x49, 0x42, 0x08, 0x18, 0x80, 0x12, 0x21, 0x38, 0x70, 0xbd, 0x20, 0x10, 0x07, 0x00, 0xec, 0x04, 0x00, 0x00, 0x00, 0xa0, 0x07, 0x00, 0x03, 0x03, 0x00, 0x00, 0x3c, 0x00, 0x68, 0x5b, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x06, 0x21, 0x04, 0x30, 0xfa, 0xf7, 0x70, 0xfc, 0xff, 0x20, 0x21, 0x30, 0xff, 0x21, 0x01, 0x55, 0x20, 0x1c, 0xff, 0x30, 0x41, 0x30, 0x81, 0x70, 0x41, 0x71, 0xc1, 0x73, 0xff, 0x20, 0x63, 0x30, 0x01, 0x55, 0x00, 0x20, 0x20, 0x61, 0x60, 0x61, 0xff, 0x34, 0x01, 0x34, 0xa0, 0x60, 0xe0, 0x60, 0x10, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x06, 0x1c, 0x3c, 0x00, 0xa4, 0x5b, 0x00, 0x00, 0x08, 0x1c, 0x58, 0x60, 0x9a, 0x60, 0x1c, 0x1c, 0x1e, 0x60, 0x15, 0x1c, 0x9b, 0x8a, 0xe2, 0x8a, 0x31, 0x1c, 0x02, 0xf0, 0xa1, 0xfc, 0x28, 0x1a, 0xe0, 0x60, 0x70, 0xbd, 0x70, 0xb5, 0x04, 0x1c, 0x08, 0x1c, 0x11, 0x1c, 0x1e, 0x1c, 0x00, 0x25, 0xeb, 0x43, 0x22, 0x1c, 0x18, 0x32, 0x0b, 0xf0, 0xf7, 0xfb, 0x22, 0x1c, 0xff, 0x32, 0x50, 0x32, 0x11, 0x1c, 0x0a, 0x39, 0x3c, 0x00, 0xe0, 0x5b, 0x00, 0x00, 0x01, 0x23, 0x20, 0x1c, 0x00, 0xf0, 0xc6, 0xf8, 0x0c, 0x28, 0x10, 0xd0, 0x01, 0x25, 0x20, 0x1c, 0x0b, 0xf0, 0xac, 0xfa, 0x20, 0x1c, 0x00, 0xf0, 0x19, 0xf8, 0x20, 0x1c, 0x00, 0xf0, 0x0a, 0xf8, 0x20, 0x1c, 0x00, 0xf0, 0x29, 0xf8, 0x31, 0x1c, 0x20, 0x1c, 0x0b, 0xf0, 0x17, 0xfa, 0x28, 0x1c, 0x70, 0xbd, 0x00, 0x00, 0xff, 0x21, 0x1d, 0x31, 0x09, 0x58, 0x80, 0x30, 0x3c, 0x00, 0x1c, 0x5c, 0x00, 0x00, 0x89, 0x07, 0x00, 0x29, 0x01, 0xda, 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0xc1, 0x62, 0x70, 0x47, 0x01, 0x1c, 0x80, 0x31, 0x00, 0x22, 0x0a, 0x63, 0x07, 0x4a, 0x12, 0x68, 0x00, 0x2a, 0x09, 0xd0, 0x42, 0x88, 0x92, 0x06, 0x06, 0xd5, 0xff, 0x30, 0x01, 0x30, 0xc0, 0x69, 0x40, 0x07, 0x01, 0xd4, 0x01, 0x20, 0x08, 0x63, 0x70, 0x47, 0x00, 0x00, 0xac, 0x69, 0x01, 0x00, 0x3c, 0x00, 0x58, 0x5c, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x1c, 0x4a, 0x88, 0x00, 0x20, 0x52, 0x05, 0x05, 0xd5, 0xff, 0x31, 0x01, 0x31, 0xc9, 0x69, 0x49, 0x07, 0x00, 0xd4, 0x01, 0x20, 0x06, 0xf0, 0xec, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x05, 0x1c, 0x98, 0x68, 0x17, 0x1c, 0x0e, 0x1c, 0x1c, 0x1c, 0x00, 0x28, 0x02, 0xd1, 0x20, 0x1c, 0x0c, 0xf0, 0x31, 0xf8, 0xab, 0x69, 0x39, 0x1c, 0x30, 0x1c, 0x3c, 0x00, 0x94, 0x5c, 0x00, 0x00, 0xa2, 0x68, 0x0b, 0xf0, 0x95, 0xfb, 0xf8, 0xbd, 0xf8, 0xb5, 0x16, 0x1c, 0x0d, 0x1c, 0x1f, 0x1c, 0x00, 0x24, 0x02, 0xf0, 0x61, 0xfb, 0x18, 0x23, 0x06, 0x49, 0x58, 0x43, 0x40, 0x18, 0x43, 0x68, 0x00, 0x2b, 0x05, 0xd0, 0x3a, 0x1c, 0x31, 0x1c, 0x28, 0x1c, 0xfa, 0xf7, 0x8e, 0xfb, 0x01, 0x24, 0x20, 0x1c, 0xf8, 0xbd, 0x94, 0x67, 0x01, 0x00, 0x80, 0xb5, 0x07, 0xf0, 0x3c, 0x00, 0xd0, 0x5c, 0x00, 0x00, 0xc5, 0xfa, 0x09, 0x49, 0x08, 0x61, 0x08, 0x68, 0x00, 0x28, 0x02, 0xd1, 0x7d, 0x20, 0x00, 0x01, 0x08, 0x60, 0x08, 0x68, 0x7d, 0x21, 0xc9, 0x00, 0x41, 0x43, 0x00, 0x23, 0x01, 0x22, 0x0a, 0x20, 0x0d, 0xf0, 0x4e, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0xd4, 0x67, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x21, 0x0a, 0x20, 0x0d, 0xf0, 0x97, 0xfc, 0x80, 0xbd, 0xf8, 0xb5, 0x0e, 0x1c, 0x3c, 0x00, 0x0c, 0x5d, 0x00, 0x00, 0x51, 0x68, 0x14, 0x1c, 0x12, 0x68, 0xa5, 0x68, 0x0b, 0x1c, 0x75, 0x1b, 0x57, 0x19, 0x97, 0x42, 0x00, 0xd2, 0x01, 0x31, 0x42, 0x68, 0x00, 0x25, 0x8a, 0x42, 0x02, 0xdd, 0x01, 0x25, 0x62, 0x60, 0x05, 0xe0, 0x9a, 0x42, 0x03, 0xd1, 0x01, 0x68, 0xb9, 0x42, 0x00, 0xd9, 0x01, 0x25, 0x00, 0x2d, 0x09, 0xd0, 0x01, 0x68, 0x21, 0x60, 0xa6, 0x60, 0xa3, 0x8a, 0xe2, 0x8a, 0x3c, 0x00, 0x48, 0x5d, 0x00, 0x00, 0x60, 0x68, 0x02, 0xf0, 0xd7, 0xfb, 0x30, 0x1a, 0xe0, 0x60, 0x28, 0x1c, 0xf8, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x02, 0xf0, 0x07, 0xfb, 0x18, 0x23, 0x03, 0x49, 0x58, 0x43, 0x40, 0x18, 0x18, 0x21, 0xfa, 0xf7, 0x98, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x94, 0x67, 0x01, 0x00, 0xfe, 0xb5, 0x04, 0x1c, 0x08, 0x1c, 0x11, 0x1c, 0x1e, 0x1c, 0x0c, 0x25, 0x01, 0x22, 0x00, 0x92, 0x3c, 0x00, 0x84, 0x5d, 0x00, 0x00, 0xa2, 0x69, 0x02, 0xab, 0xfd, 0xf7, 0xf0, 0xf8, 0x00, 0x28, 0x45, 0xd0, 0x02, 0x98, 0x27, 0x21, 0x02, 0x1c, 0x0a, 0x40, 0x01, 0xd1, 0x08, 0x43, 0x02, 0x90, 0x21, 0x49, 0xa0, 0x69, 0x08, 0x40, 0x06, 0xd0, 0x02, 0x98, 0x01, 0x40, 0x03, 0xd1, 0x49, 0x21, 0xc9, 0x00, 0x08, 0x43, 0x02, 0x90, 0xa0, 0x6d, 0x02, 0x99, 0x88, 0x42, 0x30, 0xd0, 0x00, 0x2e, 0x2d, 0xd0, 0x3c, 0x00, 0xc0, 0x5d, 0x00, 0x00, 0x40, 0x21, 0x20, 0x1c, 0x58, 0x30, 0xfa, 0xf7, 0x69, 0xfb, 0x02, 0x98, 0x00, 0x25, 0x00, 0x26, 0x37, 0x1c, 0xa0, 0x65, 0x19, 0xe0, 0xc0, 0x07, 0x11, 0xd5, 0xf0, 0x19, 0x00, 0x19, 0x70, 0x30, 0x05, 0x71, 0x28, 0x1c, 0x04, 0xf0, 0xd4, 0xff, 0x00, 0x28, 0x04, 0xd0, 0xa0, 0x19, 0x80, 0x30, 0x05, 0x72, 0x01, 0x36, 0x03, 0xe0, 0xe0, 0x19, 0x60, 0x30, 0x05, 0x70, 0x3c, 0x00, 0xfc, 0x5d, 0x00, 0x00, 0x01, 0x37, 0x01, 0x35, 0x2d, 0x06, 0x02, 0x98, 0x2d, 0x0e, 0x40, 0x08, 0x02, 0x90, 0x02, 0x98, 0x00, 0x28, 0xe2, 0xd1, 0x84, 0x20, 0x06, 0x51, 0xf0, 0x19, 0x20, 0x67, 0xe7, 0x65, 0x00, 0x25, 0x00, 0xe0, 0x0b, 0x25, 0x28, 0x1c, 0xfe, 0xbd, 0xd8, 0x3a, 0x00, 0x00, 0x38, 0xb5, 0x05, 0x1c, 0x08, 0x1c, 0x11, 0x1c, 0x00, 0x24, 0xe2, 0x43, 0x6b, 0x46, 0xff, 0xf7, 0x3c, 0x00, 0x38, 0x5e, 0x00, 0x00, 0x4f, 0xfa, 0x00, 0x28, 0x05, 0xd0, 0xa8, 0x69, 0x00, 0x99, 0x01, 0x40, 0x81, 0x42, 0x00, 0xd1, 0x01, 0x24, 0x20, 0x1c, 0x38, 0xbd, 0x00, 0x00, 0x7c, 0xb5, 0x05, 0x6a, 0x86, 0x69, 0x04, 0x1c, 0xc0, 0x68, 0xfb, 0xf7, 0xb7, 0xfb, 0xe1, 0x69, 0xfb, 0xf7, 0xda, 0xfa, 0x20, 0x1c, 0xe2, 0x69, 0x40, 0x30, 0xc1, 0x8b, 0x12, 0x89, 0x89, 0x18, 0xc1, 0x83, 0x06, 0x49, 0x3c, 0x00, 0x74, 0x5e, 0x00, 0x00, 0x01, 0x94, 0x00, 0x91, 0x28, 0x69, 0x33, 0x1c, 0x82, 0x88, 0x01, 0x68, 0xe0, 0x68, 0xc0, 0x68, 0x00, 0xf0, 0xf2, 0xf9, 0x7c, 0xbd, 0x00, 0x00, 0x91, 0x5e, 0x00, 0x00, 0xb0, 0xb5, 0xd1, 0x68, 0x55, 0x69, 0xc8, 0x68, 0x14, 0x1c, 0x14, 0x4b, 0x0c, 0xe0, 0x02, 0x68, 0x9a, 0x42, 0x07, 0xd1, 0xc2, 0x68, 0xca, 0x60, 0x00, 0x21, 0xc1, 0x60, 0x01, 0x60, 0xfb, 0xf7, 0x3c, 0x00, 0xb0, 0x5e, 0x00, 0x00, 0x73, 0xfb, 0x03, 0xe0, 0x01, 0x1c, 0xc0, 0x68, 0x00, 0x28, 0xf0, 0xd1, 0xe0, 0x68, 0xc0, 0x68, 0xe8, 0x60, 0xe0, 0x68, 0xc5, 0x60, 0x20, 0x1c, 0x40, 0x30, 0xc1, 0x8b, 0x2a, 0x89, 0x89, 0x18, 0xc1, 0x83, 0x20, 0x68, 0x00, 0x28, 0x02, 0xd0, 0xff, 0xf7, 0xba, 0xff, 0xb0, 0xbd, 0x04, 0x48, 0x04, 0xf0, 0x4e, 0xf9, 0x00, 0x6a, 0x07, 0xf0, 0x77, 0xfa, 0xb0, 0xbd, 0x3c, 0x00, 0xec, 0x5e, 0x00, 0x00, 0xa0, 0x7e, 0x01, 0x00, 0xa0, 0x6a, 0x01, 0x00, 0xf1, 0xb5, 0x82, 0xb0, 0x02, 0x98, 0x06, 0x69, 0x01, 0x1c, 0x08, 0x36, 0x60, 0x31, 0x45, 0x68, 0x01, 0x91, 0x82, 0xe0, 0x10, 0x21, 0x00, 0x20, 0x2f, 0x69, 0xfb, 0xf7, 0x63, 0xfb, 0x68, 0x61, 0x01, 0x89, 0x08, 0x39, 0x09, 0x04, 0x09, 0x0c, 0x01, 0x81, 0x68, 0x69, 0x00, 0x68, 0x40, 0x18, 0x08, 0x21, 0xfb, 0xf7, 0x3c, 0x00, 0x28, 0x5f, 0x00, 0x00, 0x57, 0xfb, 0xe8, 0x61, 0x68, 0x69, 0x71, 0x88, 0x00, 0x68, 0x20, 0x22, 0x01, 0x80, 0x71, 0x68, 0x41, 0x60, 0x01, 0x99, 0x49, 0x7b, 0x89, 0x01, 0x11, 0x43, 0xc1, 0x70, 0x00, 0x21, 0x81, 0x70, 0x28, 0x20, 0xfb, 0xf7, 0x75, 0xfc, 0x39, 0x88, 0x04, 0x1c, 0xc1, 0x81, 0xa8, 0x6b, 0x00, 0x28, 0x03, 0xd1, 0x01, 0x20, 0x80, 0x02, 0x08, 0x43, 0xe0, 0x81, 0x06, 0x22, 0x3c, 0x00, 0x64, 0x5f, 0x00, 0x00, 0x39, 0x1d, 0x20, 0x1c, 0x10, 0x30, 0xfa, 0xf7, 0xc5, 0xfa, 0x39, 0x1c, 0x0a, 0x31, 0x06, 0x22, 0x20, 0x1c, 0x16, 0x30, 0x00, 0x90, 0xfa, 0xf7, 0xbd, 0xfa, 0x39, 0x1c, 0x10, 0x31, 0x06, 0x22, 0x20, 0x1c, 0x1c, 0x30, 0xfa, 0xf7, 0xb6, 0xfa, 0xe1, 0x89, 0x25, 0x4a, 0x5c, 0x20, 0x11, 0x40, 0x01, 0x22, 0x92, 0x03, 0x11, 0x43, 0x40, 0x5b, 0xe1, 0x81, 0x0f, 0x21, 0x3c, 0x00, 0xa0, 0x5f, 0x00, 0x00, 0x08, 0x40, 0x60, 0x84, 0x20, 0x1c, 0x20, 0x30, 0x16, 0x21, 0x81, 0x71, 0x00, 0x21, 0x21, 0x70, 0xe9, 0x6b, 0x00, 0x29, 0x07, 0xd0, 0x29, 0x69, 0x09, 0x8b, 0x09, 0x07, 0x09, 0x0f, 0x21, 0x70, 0xa1, 0x84, 0x18, 0x21, 0x81, 0x71, 0x06, 0x22, 0x60, 0x1c, 0x00, 0x99, 0xfa, 0xf7, 0x94, 0xfa, 0x70, 0x68, 0x00, 0x0e, 0xe0, 0x71, 0x70, 0x68, 0x00, 0x02, 0x00, 0x0e, 0x3c, 0x00, 0xdc, 0x5f, 0x00, 0x00, 0x20, 0x72, 0x70, 0x68, 0x00, 0x04, 0x00, 0x0e, 0x60, 0x72, 0x70, 0x68, 0xa0, 0x72, 0x70, 0x88, 0x00, 0x0a, 0xe0, 0x72, 0x70, 0x88, 0x20, 0x73, 0x70, 0x88, 0x01, 0x30, 0x00, 0x04, 0x00, 0x0c, 0x70, 0x80, 0x02, 0xd1, 0x70, 0x68, 0x01, 0x30, 0x70, 0x60, 0xac, 0x61, 0x02, 0x98, 0x28, 0x62, 0x2d, 0x68, 0x00, 0x2d, 0x00, 0xd0, 0x79, 0xe7, 0x02, 0x98, 0x04, 0x49, 0x3c, 0x00, 0x18, 0x60, 0x00, 0x00, 0x42, 0x68, 0x04, 0x48, 0x04, 0xf0, 0x74, 0xf8, 0xfe, 0xbd, 0x00, 0x00, 0x8f, 0xc7, 0xff, 0xff, 0x3d, 0xda, 0x00, 0x00, 0xa0, 0x6a, 0x01, 0x00, 0xb0, 0xb5, 0x07, 0x4d, 0x28, 0x78, 0x03, 0x28, 0x08, 0xd0, 0x00, 0x24, 0x2c, 0x70, 0x69, 0x68, 0x00, 0x29, 0x03, 0xd0, 0x01, 0x20, 0xfa, 0xf7, 0xc8, 0xf9, 0x6c, 0x60, 0xb0, 0xbd, 0x00, 0x00, 0x9c, 0x73, 0x01, 0x00, 0x3c, 0x00, 0x54, 0x60, 0x00, 0x00, 0xf8, 0xb5, 0x2b, 0x4b, 0xd8, 0x6a, 0x00, 0x28, 0x50, 0xd0, 0x2a, 0x48, 0x01, 0x1c, 0xff, 0x31, 0x01, 0x31, 0xca, 0x68, 0x01, 0x32, 0xca, 0x60, 0x1a, 0x6c, 0x00, 0x2a, 0x02, 0xd1, 0x4a, 0x69, 0x01, 0x32, 0x4a, 0x61, 0x0a, 0x69, 0x01, 0x32, 0x0a, 0x61, 0xda, 0x68, 0x00, 0x2a, 0x04, 0xd0, 0x1f, 0x4a, 0x01, 0x32, 0x12, 0x78, 0x00, 0x2a, 0x02, 0xd1, 0x8a, 0x69, 0x3c, 0x00, 0x90, 0x60, 0x00, 0x00, 0x01, 0x32, 0x8a, 0x61, 0x00, 0x25, 0x07, 0x1d, 0x18, 0x26, 0x1a, 0x4a, 0x6e, 0x43, 0x74, 0x32, 0x90, 0x59, 0x00, 0x28, 0x29, 0xd0, 0xb4, 0x18, 0x60, 0x69, 0x00, 0x28, 0x25, 0xd1, 0x60, 0x68, 0x00, 0x28, 0x02, 0xd0, 0x01, 0x68, 0x00, 0x29, 0x05, 0xd1, 0xa1, 0x68, 0x00, 0x29, 0x1c, 0xd0, 0x09, 0x68, 0x00, 0x29, 0x19, 0xd0, 0x00, 0x28, 0x05, 0xd0, 0xe1, 0x68, 0x3c, 0x00, 0xcc, 0x60, 0x00, 0x00, 0x01, 0x31, 0xe1, 0x60, 0x00, 0x68, 0x81, 0x42, 0x11, 0xd3, 0xa0, 0x68, 0x00, 0x28, 0x06, 0xd0, 0x21, 0x69, 0x00, 0x68, 0x08, 0x18, 0x0c, 0xf0, 0xa3, 0xfd, 0x00, 0x28, 0x07, 0xd0, 0x06, 0x4a, 0x01, 0x20, 0x60, 0x61, 0x74, 0x32, 0x91, 0x59, 0x38, 0x1c, 0xfa, 0xf7, 0x70, 0xf9, 0x01, 0x35, 0x02, 0x2d, 0xcb, 0xdb, 0xf8, 0xbd, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x3c, 0x00, 0x08, 0x61, 0x00, 0x00, 0xf4, 0x67, 0x01, 0x00, 0xf8, 0xb5, 0x0f, 0x1c, 0x00, 0x25, 0x04, 0x1c, 0x00, 0x28, 0x25, 0xd0, 0x20, 0x1c, 0x04, 0xf0, 0x03, 0xfe, 0x00, 0x28, 0x06, 0xd0, 0xff, 0xf7, 0xff, 0xf8, 0x04, 0x1c, 0xff, 0xf7, 0x50, 0xfb, 0x06, 0x1c, 0x07, 0xe0, 0x20, 0x1c, 0xff, 0xf7, 0x91, 0xfb, 0x06, 0x1c, 0x20, 0x1c, 0xff, 0xf7, 0x6f, 0xfb, 0x04, 0x1c, 0x00, 0x2e, 0x06, 0xd0, 0x3c, 0x00, 0x44, 0x61, 0x00, 0x00, 0xff, 0xf7, 0x4c, 0xfb, 0x00, 0x28, 0x02, 0xd0, 0x01, 0x25, 0x01, 0x20, 0x07, 0xe0, 0x00, 0x2c, 0x06, 0xd0, 0xff, 0xf7, 0xef, 0xf8, 0x00, 0x28, 0x02, 0xd0, 0x01, 0x25, 0x00, 0x20, 0x38, 0x60, 0x28, 0x1c, 0xf8, 0xbd, 0xb0, 0xb5, 0xc5, 0x68, 0x04, 0x1c, 0x0d, 0xf0, 0x8f, 0xfc, 0x20, 0x7e, 0xc1, 0x07, 0x08, 0xd5, 0xe1, 0x68, 0xa9, 0x42, 0x05, 0xd9, 0x22, 0x69, 0x3c, 0x00, 0x80, 0x61, 0x00, 0x00, 0x91, 0x42, 0x02, 0xd3, 0xe1, 0x8a, 0x01, 0x31, 0xe1, 0x82, 0x81, 0x07, 0x08, 0xd5, 0xe1, 0x68, 0xa9, 0x42, 0x05, 0xd2, 0x22, 0x69, 0x91, 0x42, 0x02, 0xd8, 0xe1, 0x8a, 0x01, 0x31, 0xe1, 0x82, 0x40, 0x07, 0x06, 0xd5, 0xe0, 0x68, 0x21, 0x69, 0x88, 0x42, 0x02, 0xd1, 0xe0, 0x8a, 0x01, 0x30, 0xe0, 0x82, 0xe0, 0x8a, 0xa1, 0x8a, 0x88, 0x42, 0x0d, 0xd3, 0x60, 0x7e, 0x3c, 0x00, 0xbc, 0x61, 0x00, 0x00, 0x02, 0x28, 0x0b, 0xd0, 0x20, 0x68, 0xe1, 0x68, 0x04, 0x22, 0x07, 0xf0, 0x65, 0xfb, 0x60, 0x7e, 0x00, 0x28, 0x03, 0xd1, 0x20, 0x68, 0x08, 0xf0, 0xab, 0xff, 0xb0, 0xbd, 0x00, 0x20, 0xe0, 0x82, 0xb0, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x06, 0x1c, 0x0c, 0x23, 0x20, 0x49, 0x58, 0x43, 0x45, 0x18, 0x00, 0x20, 0xa8, 0x60, 0x30, 0x1c, 0x06, 0xf0, 0x91, 0xfe, 0x04, 0x1c, 0x3c, 0x00, 0xf8, 0x61, 0x00, 0x00, 0x68, 0x60, 0x33, 0xd0, 0x01, 0x20, 0xa8, 0x70, 0x2c, 0x20, 0x00, 0x5d, 0x02, 0x28, 0x03, 0xd1, 0x20, 0x1c, 0x03, 0xf0, 0x45, 0xfe, 0x10, 0xe0, 0x61, 0x6b, 0x00, 0x29, 0x0a, 0xd0, 0x01, 0x28, 0x04, 0xd1, 0x21, 0x1c, 0x28, 0x1c, 0x03, 0xf0, 0x55, 0xfe, 0x06, 0xe0, 0x20, 0x1c, 0x0a, 0xf0, 0x0d, 0xfc, 0x02, 0xe0, 0x20, 0x1c, 0x0a, 0xf0, 0x3d, 0xfb, 0x0d, 0x48, 0x3c, 0x00, 0x34, 0x62, 0x00, 0x00, 0x14, 0x38, 0x41, 0x68, 0x00, 0x29, 0x10, 0xd0, 0x20, 0x1c, 0x40, 0x30, 0x02, 0x8b, 0x12, 0x07, 0x92, 0x0f, 0x01, 0x2a, 0x09, 0xd0, 0x80, 0x8b, 0x32, 0x02, 0x00, 0x09, 0x00, 0x04, 0x10, 0x43, 0x81, 0x22, 0x02, 0x43, 0x0c, 0x20, 0x0d, 0xf0, 0xb7, 0xf9, 0x0c, 0xf0, 0xa5, 0xfd, 0x60, 0x64, 0x70, 0xbd, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0xff, 0xb5, 0x08, 0x1c, 0x3c, 0x00, 0x70, 0x62, 0x00, 0x00, 0x11, 0x1c, 0x0c, 0x32, 0x20, 0x24, 0x14, 0x43, 0x0c, 0x4a, 0x83, 0xb0, 0x0c, 0xae, 0x52, 0x68, 0x60, 0xce, 0x94, 0x70, 0x00, 0x24, 0xd4, 0x70, 0x93, 0x63, 0x0d, 0x23, 0x40, 0x27, 0xbb, 0x52, 0x94, 0x61, 0x14, 0x84, 0x01, 0x22, 0x02, 0x92, 0x32, 0x1c, 0x00, 0x90, 0x01, 0x91, 0x23, 0x1c, 0x29, 0x1c, 0x03, 0x98, 0x00, 0xf0, 0x66, 0xf9, 0x07, 0xb0, 0xf0, 0xbd, 0x3c, 0x00, 0xac, 0x62, 0x00, 0x00, 0xa0, 0x7e, 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0x00, 0x27, 0x11, 0x4e, 0x1d, 0xe0, 0xe0, 0x68, 0x00, 0x28, 0x70, 0x68, 0x0c, 0xd1, 0x80, 0x88, 0x00, 0x07, 0x0d, 0xd1, 0x01, 0x21, 0x0c, 0x48, 0xfb, 0xf7, 0x84, 0xf9, 0xc4, 0x60, 0xe8, 0x60, 0x70, 0x68, 0x81, 0x88, 0x01, 0x31, 0x02, 0xe0, 0x81, 0x88, 0x22, 0x89, 0x89, 0x18, 0x81, 0x80, 0xe0, 0x68, 0x39, 0x1c, 0x3c, 0x00, 0xe8, 0x62, 0x00, 0x00, 0x00, 0x28, 0x01, 0xd1, 0x71, 0x68, 0xc9, 0x6d, 0x25, 0x1c, 0x61, 0x60, 0x04, 0x1c, 0x00, 0x2c, 0xdf, 0xd1, 0xf8, 0xbd, 0xa0, 0x7e, 0x01, 0x00, 0x06, 0x49, 0x10, 0xb5, 0x49, 0x68, 0x00, 0x23, 0x05, 0xe0, 0x8a, 0x88, 0x04, 0x89, 0x12, 0x19, 0x8a, 0x80, 0x43, 0x60, 0xc0, 0x68, 0x00, 0x28, 0xf7, 0xd1, 0x10, 0xbd, 0xa0, 0x7e, 0x01, 0x00, 0x10, 0xb5, 0x09, 0x49, 0x3c, 0x00, 0x24, 0x63, 0x00, 0x00, 0x00, 0x24, 0x49, 0x68, 0x0a, 0xe0, 0x8a, 0x88, 0x03, 0x89, 0xd2, 0x18, 0x8a, 0x80, 0xc3, 0x68, 0x22, 0x1c, 0x00, 0x2b, 0x00, 0xd1, 0xca, 0x6d, 0x42, 0x60, 0x18, 0x1c, 0x00, 0x28, 0xf2, 0xd1, 0x10, 0xbd, 0x00, 0x00, 0xa0, 0x7e, 0x01, 0x00, 0x01, 0x1c, 0x13, 0x48, 0x10, 0xb5, 0x40, 0x68, 0x00, 0x23, 0x09, 0xe0, 0x82, 0x88, 0x0c, 0x89, 0x12, 0x19, 0x82, 0x80, 0x3c, 0x00, 0x60, 0x63, 0x00, 0x00, 0x4b, 0x60, 0xca, 0x68, 0x00, 0x2a, 0x00, 0xd1, 0x41, 0x66, 0xc9, 0x68, 0x00, 0x29, 0xf3, 0xd1, 0x01, 0x1c, 0x68, 0x31, 0x81, 0x64, 0xc3, 0x64, 0x43, 0x65, 0x82, 0x88, 0x08, 0x23, 0x11, 0x1c, 0x08, 0x31, 0x89, 0x07, 0x89, 0x0f, 0x59, 0x1a, 0x50, 0x23, 0x19, 0x52, 0x51, 0x18, 0x81, 0x80, 0x01, 0x1c, 0x40, 0x6e, 0x48, 0x31, 0xc1, 0x60, 0x10, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x63, 0x00, 0x00, 0xa0, 0x7e, 0x01, 0x00, 0x10, 0xb5, 0x07, 0x49, 0x00, 0x24, 0x4b, 0x68, 0x06, 0xe0, 0xc2, 0x68, 0x21, 0x1c, 0x00, 0x2a, 0x00, 0xd1, 0xd9, 0x6d, 0x41, 0x60, 0x10, 0x1c, 0x00, 0x28, 0xf6, 0xd1, 0x10, 0xbd, 0x00, 0x00, 0xa0, 0x7e, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0xfe, 0xb5, 0x06, 0x1c, 0x0c, 0x48, 0x0c, 0x1c, 0x40, 0x68, 0x80, 0x21, 0x81, 0x70, 0x00, 0x21, 0x3c, 0x00, 0xd8, 0x63, 0x00, 0x00, 0xc1, 0x70, 0x15, 0x1c, 0x40, 0x22, 0x81, 0x63, 0x11, 0x52, 0x81, 0x61, 0x01, 0x84, 0x00, 0x20, 0x04, 0x22, 0x02, 0x92, 0x00, 0x90, 0x01, 0x91, 0x29, 0x1c, 0x20, 0x1c, 0x1a, 0x1c, 0x33, 0x1c, 0x00, 0xf0, 0xbc, 0xf8, 0xfe, 0xbd, 0x00, 0x00, 0xa0, 0x7e, 0x01, 0x00, 0x70, 0xb5, 0x06, 0x1c, 0x17, 0x48, 0x80, 0x78, 0x02, 0x21, 0x16, 0x4a, 0x88, 0x43, 0x90, 0x70, 0x3c, 0x00, 0x14, 0x64, 0x00, 0x00, 0x10, 0x1c, 0x80, 0x78, 0x08, 0x43, 0x11, 0x1c, 0x88, 0x70, 0x13, 0x48, 0x00, 0x24, 0xc4, 0x70, 0x70, 0x20, 0xfb, 0xf7, 0xd9, 0xf9, 0x11, 0x4d, 0x70, 0x21, 0x68, 0x60, 0xfa, 0xf7, 0x34, 0xf8, 0x30, 0x07, 0x00, 0x0f, 0x69, 0x68, 0x90, 0x30, 0xc8, 0x65, 0x0d, 0x48, 0x68, 0x22, 0x08, 0x80, 0x08, 0x1c, 0x28, 0x30, 0x89, 0x60, 0x48, 0x61, 0x08, 0x20, 0x08, 0x82, 0x3c, 0x00, 0x50, 0x64, 0x00, 0x00, 0x08, 0x1c, 0x38, 0x30, 0x48, 0x63, 0x20, 0x38, 0x48, 0x64, 0x5a, 0x20, 0x50, 0x54, 0x06, 0x48, 0x08, 0x31, 0x41, 0x64, 0x44, 0x65, 0x70, 0xbd, 0x00, 0x00, 0x07, 0x00, 0x58, 0x00, 0x07, 0x00, 0xa0, 0x7e, 0x01, 0x00, 0xde, 0xc0, 0x00, 0x00, 0x00, 0x30, 0x07, 0x00, 0x0a, 0x4b, 0x10, 0xb5, 0x58, 0x6d, 0x0a, 0x49, 0x00, 0x22, 0x49, 0x68, 0x00, 0x24, 0x4a, 0x62, 0x3c, 0x00, 0x8c, 0x64, 0x00, 0x00, 0x5c, 0x65, 0x4b, 0x6e, 0x00, 0x2b, 0x01, 0xd0, 0xda, 0x60, 0x4a, 0x66, 0x8b, 0x6d, 0x00, 0x2b, 0x03, 0xd0, 0x0a, 0x6e, 0x00, 0x21, 0xf9, 0xf7, 0x9c, 0xff, 0x10, 0xbd, 0x00, 0x30, 0x07, 0x00, 0xa0, 0x7e, 0x01, 0x00, 0x09, 0x49, 0x10, 0xb5, 0x08, 0x88, 0x01, 0x30, 0x08, 0x80, 0x01, 0x20, 0x07, 0x49, 0x80, 0x02, 0x08, 0x60, 0x07, 0x4c, 0xa2, 0x6d, 0x00, 0x2a, 0x3c, 0x00, 0xc8, 0x64, 0x00, 0x00, 0x05, 0xd0, 0x05, 0x21, 0xd1, 0x20, 0x0d, 0xf0, 0x6f, 0xf9, 0x01, 0x20, 0xa0, 0x65, 0x10, 0xbd, 0xb0, 0x74, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, 0xff, 0xb5, 0x83, 0xb0, 0x0c, 0xae, 0x86, 0x46, 0x8c, 0x46, 0x0e, 0x4a, 0x43, 0xce, 0x0f, 0xad, 0x0f, 0x1c, 0x52, 0x68, 0x0c, 0x37, 0x30, 0xcd, 0x97, 0x70, 0xd3, 0x70, 0x96, 0x63, 0x0d, 0x26, 0x3c, 0x00, 0x04, 0x65, 0x00, 0x00, 0x40, 0x27, 0xbe, 0x52, 0x05, 0x9e, 0x96, 0x61, 0x13, 0x84, 0x00, 0x22, 0x02, 0x92, 0x2a, 0x1c, 0x00, 0x90, 0x01, 0x91, 0x21, 0x1c, 0x60, 0x46, 0x73, 0x46, 0x00, 0xf0, 0x29, 0xf8, 0x07, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xa0, 0x7e, 0x01, 0x00, 0xff, 0xb5, 0x10, 0x1c, 0x1a, 0x1c, 0x0c, 0x1c, 0x19, 0x1c, 0x60, 0x23, 0xff, 0x32, 0x13, 0x43, 0x0c, 0x4a, 0x83, 0xb0, 0x3c, 0x00, 0x40, 0x65, 0x00, 0x00, 0x0c, 0xae, 0x52, 0x68, 0x60, 0xce, 0x93, 0x70, 0x00, 0x23, 0xd3, 0x70, 0x93, 0x63, 0x40, 0x27, 0xbb, 0x52, 0x93, 0x61, 0x13, 0x84, 0x03, 0x22, 0x02, 0x92, 0x01, 0x91, 0x29, 0x1c, 0x32, 0x1c, 0x00, 0x90, 0x20, 0x1c, 0x03, 0x9b, 0x00, 0xf0, 0x05, 0xf8, 0x07, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xa0, 0x7e, 0x01, 0x00, 0xf8, 0xb5, 0x05, 0x1c, 0x11, 0x48, 0x1c, 0x1c, 0x3c, 0x00, 0x7c, 0x65, 0x00, 0x00, 0x08, 0x9b, 0x07, 0x9f, 0x40, 0x68, 0xde, 0x00, 0x81, 0x65, 0x02, 0x66, 0x00, 0x21, 0x81, 0x80, 0x0d, 0x48, 0x81, 0x59, 0x20, 0x1c, 0xf9, 0xf7, 0x22, 0xff, 0x0b, 0x48, 0x30, 0x18, 0x41, 0x68, 0x28, 0x1c, 0xf9, 0xf7, 0x1c, 0xff, 0x07, 0x49, 0x06, 0x98, 0x49, 0x68, 0x00, 0x2c, 0x88, 0x62, 0x0f, 0x86, 0x00, 0xd1, 0x2c, 0x1c, 0x05, 0x48, 0x4c, 0x62, 0x45, 0x65, 0x3c, 0x00, 0xb8, 0x65, 0x00, 0x00, 0x01, 0x21, 0x01, 0x65, 0x01, 0x64, 0xf8, 0xbd, 0xa0, 0x7e, 0x01, 0x00, 0x90, 0x52, 0x01, 0x00, 0x00, 0x30, 0x07, 0x00, 0xff, 0xb5, 0x83, 0xb0, 0x0d, 0xae, 0x60, 0xce, 0x0c, 0x9f, 0x08, 0x1c, 0x11, 0x1c, 0xd2, 0x19, 0xff, 0x32, 0x40, 0x24, 0x14, 0x43, 0x0b, 0x4a, 0x52, 0x68, 0x94, 0x70, 0x00, 0x24, 0xd4, 0x70, 0x93, 0x63, 0x40, 0x23, 0x9f, 0x52, 0x94, 0x61, 0x3c, 0x00, 0xf4, 0x65, 0x00, 0x00, 0x14, 0x84, 0x02, 0x22, 0x02, 0x92, 0x32, 0x1c, 0x00, 0x90, 0x01, 0x91, 0x23, 0x1c, 0x29, 0x1c, 0x03, 0x98, 0xff, 0xf7, 0xb5, 0xff, 0x07, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xa0, 0x7e, 0x01, 0x00, 0x4c, 0x21, 0x0d, 0x4a, 0x41, 0x43, 0x10, 0xb5, 0x8c, 0x18, 0x0c, 0x49, 0x09, 0x78, 0x88, 0x42, 0x07, 0xd1, 0x05, 0xf0, 0xc7, 0xfd, 0x0a, 0x48, 0x01, 0x88, 0x01, 0x22, 0x3c, 0x00, 0x30, 0x66, 0x00, 0x00, 0x12, 0x03, 0x91, 0x43, 0x01, 0x80, 0x20, 0x1c, 0x30, 0x30, 0x0c, 0x23, 0xc1, 0x56, 0x40, 0x7b, 0x81, 0x42, 0x02, 0xdd, 0x20, 0x8d, 0x0c, 0xf0, 0xe5, 0xfb, 0x10, 0xbd, 0x58, 0xe3, 0x01, 0x00, 0x3c, 0x7c, 0x01, 0x00, 0x32, 0x80, 0x07, 0x00, 0x01, 0x1c, 0x60, 0x31, 0x80, 0xb5, 0xca, 0x79, 0x8b, 0x79, 0x9a, 0x42, 0x07, 0xd9, 0x48, 0x7a, 0x0c, 0x23, 0x07, 0x49, 0x3c, 0x00, 0x6c, 0x66, 0x00, 0x00, 0x58, 0x43, 0x08, 0x5a, 0x0c, 0xf0, 0xd0, 0xfb, 0x80, 0xbd, 0x20, 0x30, 0x00, 0x7b, 0x01, 0x28, 0xfa, 0xd1, 0x48, 0x7a, 0x05, 0xf0, 0x40, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x1c, 0x21, 0xf9, 0xf7, 0x03, 0xff, 0x03, 0x48, 0xa0, 0x80, 0xe0, 0x80, 0x20, 0x81, 0x60, 0x81, 0xa0, 0x81, 0x10, 0xbd, 0xff, 0xff, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0x66, 0x00, 0x00, 0xff, 0xb5, 0x04, 0x1c, 0x00, 0x20, 0x83, 0xb0, 0x0d, 0x1c, 0x06, 0x2c, 0x02, 0x90, 0x38, 0xd2, 0x1f, 0x4a, 0xff, 0x26, 0xc1, 0x00, 0x89, 0x18, 0x89, 0x78, 0xa1, 0x42, 0x03, 0xd1, 0xc0, 0x00, 0x80, 0x18, 0x46, 0x78, 0x04, 0xe0, 0x01, 0x30, 0x00, 0x06, 0x00, 0x16, 0x06, 0x28, 0xf1, 0xdb, 0xff, 0x2e, 0x24, 0xd0, 0x01, 0x93, 0x20, 0x1c, 0x0d, 0xf0, 0xe8, 0xf9, 0x3c, 0x00, 0xe4, 0x66, 0x00, 0x00, 0x00, 0x28, 0x05, 0xd0, 0x24, 0x21, 0x28, 0x1c, 0x01, 0xab, 0x02, 0xaa, 0xfa, 0xf7, 0x30, 0xfe, 0x10, 0x49, 0xf0, 0x00, 0x30, 0x39, 0x0f, 0x58, 0x31, 0x06, 0x09, 0x16, 0x28, 0x1c, 0x05, 0x9a, 0x01, 0x9b, 0xf9, 0xf7, 0x6e, 0xfe, 0x06, 0x1c, 0x10, 0xd1, 0x20, 0x1c, 0x0d, 0xf0, 0xd0, 0xf9, 0x00, 0x28, 0x0b, 0xd0, 0x28, 0x1c, 0x69, 0x69, 0xfa, 0xf7, 0x12, 0xfe, 0x3c, 0x00, 0x20, 0x67, 0x00, 0x00, 0x02, 0x98, 0x68, 0x61, 0x04, 0xe0, 0x06, 0x2c, 0x01, 0xd3, 0x07, 0x26, 0x00, 0xe0, 0x08, 0x26, 0x30, 0x1c, 0x07, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xcc, 0x5a, 0x01, 0x00, 0x10, 0xb5, 0x0c, 0x1c, 0x09, 0xf0, 0x86, 0xf8, 0x00, 0x28, 0x02, 0xd0, 0x20, 0x1c, 0x09, 0xf0, 0xb5, 0xf8, 0x10, 0xbd, 0xfe, 0xb5, 0x13, 0x4d, 0x04, 0x1c, 0xae, 0x69, 0x00, 0x2e, 0x1c, 0xd0, 0x3c, 0x00, 0x5c, 0x67, 0x00, 0x00, 0x10, 0x4f, 0x30, 0x37, 0x78, 0x68, 0x60, 0x43, 0x01, 0x1c, 0x28, 0x88, 0xf9, 0xf7, 0xd2, 0xff, 0x39, 0x68, 0x61, 0x43, 0x41, 0x18, 0x01, 0xa8, 0x32, 0x1c, 0xf9, 0xf7, 0x37, 0xfe, 0x02, 0x98, 0x29, 0x6a, 0x40, 0x18, 0x28, 0x62, 0x0b, 0xd4, 0xe9, 0x69, 0x88, 0x42, 0x08, 0xd9, 0xa9, 0x69, 0x40, 0x1a, 0x28, 0x62, 0x01, 0x98, 0x01, 0x30, 0x01, 0xe0, 0x00, 0x20, 0x3c, 0x00, 0x98, 0x67, 0x00, 0x00, 0x02, 0x90, 0x01, 0x90, 0x01, 0x98, 0xfe, 0xbd, 0xc8, 0x74, 0x01, 0x00, 0xf8, 0xb5, 0x00, 0x28, 0x28, 0xd0, 0x00, 0x24, 0x14, 0x4d, 0x00, 0xe0, 0x01, 0x34, 0x61, 0x00, 0x09, 0x19, 0x49, 0x19, 0x49, 0x78, 0x00, 0x29, 0xf8, 0xd1, 0x63, 0x00, 0x1b, 0x19, 0x03, 0x33, 0x07, 0x22, 0x69, 0x46, 0x03, 0xf0, 0xd4, 0xfb, 0x00, 0x2c, 0x0f, 0xd0, 0x00, 0x20, 0x00, 0x99, 0x3c, 0x00, 0xd4, 0x67, 0x00, 0x00, 0x0a, 0xe0, 0x42, 0x00, 0x12, 0x18, 0xae, 0x5c, 0x53, 0x18, 0x52, 0x19, 0x5e, 0x71, 0x56, 0x78, 0x01, 0x30, 0x9e, 0x71, 0x92, 0x78, 0xda, 0x71, 0xa0, 0x42, 0xf2, 0xdb, 0x00, 0x98, 0x03, 0x22, 0x02, 0x30, 0x03, 0x49, 0xf9, 0xf7, 0x7e, 0xfe, 0xf8, 0xbd, 0x00, 0x00, 0xeb, 0x62, 0x01, 0x00, 0xe8, 0x62, 0x01, 0x00, 0xb0, 0xb5, 0x05, 0x1c, 0x08, 0x1c, 0xfa, 0xf7, 0x3c, 0x00, 0x10, 0x68, 0x00, 0x00, 0x9d, 0xff, 0x04, 0x1c, 0x28, 0x1c, 0xfa, 0xf7, 0xd9, 0xfe, 0x21, 0x1c, 0xfa, 0xf7, 0xfc, 0xfd, 0x20, 0x1c, 0xb0, 0xbd, 0xf3, 0xb5, 0x44, 0x48, 0x0c, 0x1c, 0x00, 0x78, 0x81, 0xb0, 0x01, 0x28, 0x72, 0xd1, 0xfa, 0xf7, 0x82, 0xf8, 0x41, 0x4d, 0xe8, 0x6a, 0x41, 0x49, 0x08, 0x60, 0xe8, 0x6b, 0x48, 0x60, 0x40, 0x48, 0xfa, 0xf7, 0xa6, 0xf9, 0xe8, 0x6a, 0x00, 0x28, 0x3c, 0x00, 0x4c, 0x68, 0x00, 0x00, 0xfc, 0xda, 0x22, 0x1c, 0x0f, 0x20, 0x01, 0x99, 0x0a, 0xf0, 0xa4, 0xf8, 0x38, 0x4d, 0x02, 0x27, 0x2f, 0x63, 0x38, 0x4a, 0x64, 0x26, 0x00, 0x20, 0xaa, 0x21, 0x08, 0x32, 0x13, 0x18, 0x01, 0x30, 0x00, 0x04, 0x00, 0x0c, 0x64, 0x28, 0x19, 0x74, 0xf8, 0xd3, 0x16, 0x81, 0x00, 0x20, 0x50, 0x60, 0x10, 0x1c, 0x10, 0x30, 0x10, 0x60, 0x00, 0x25, 0x17, 0x1c, 0xd2, 0x60, 0x3c, 0x00, 0x88, 0x68, 0x00, 0x00, 0x08, 0xe0, 0x28, 0x1c, 0xf9, 0xf7, 0xa2, 0xff, 0x41, 0x31, 0x78, 0x19, 0x01, 0x35, 0x2d, 0x04, 0x2d, 0x0c, 0x01, 0x74, 0xb5, 0x42, 0xf4, 0xd3, 0x26, 0x4d, 0x6f, 0x63, 0x01, 0x20, 0x28, 0x63, 0x24, 0x4d, 0xe8, 0x6a, 0x00, 0x28, 0xfb, 0xda, 0x0b, 0x22, 0x3b, 0x1c, 0x24, 0x4e, 0x03, 0xe0, 0x01, 0x32, 0x64, 0x2a, 0x00, 0xd1, 0x00, 0x22, 0x10, 0x1c, 0x0c, 0x21, 0x3c, 0x00, 0xc4, 0x68, 0x00, 0x00, 0x01, 0x39, 0x75, 0x5c, 0x1f, 0x18, 0x3f, 0x7c, 0xbd, 0x42, 0xf3, 0xd1, 0x01, 0x38, 0x00, 0xd5, 0x63, 0x20, 0x00, 0x29, 0xf4, 0xd1, 0x18, 0x4e, 0x50, 0x1c, 0xf1, 0x6b, 0x1a, 0x4a, 0x10, 0x1c, 0x01, 0x38, 0xfd, 0xd1, 0xf0, 0x6b, 0x88, 0x42, 0x01, 0xd0, 0x01, 0x1c, 0xf7, 0xe7, 0x02, 0x27, 0x37, 0x63, 0x16, 0x4d, 0x90, 0x21, 0x28, 0x1c, 0xf9, 0xf7, 0xce, 0xfd, 0x3c, 0x00, 0x00, 0x69, 0x00, 0x00, 0x28, 0x1c, 0x28, 0x30, 0x28, 0x60, 0x28, 0x1c, 0x10, 0x30, 0x2f, 0x81, 0xe8, 0x60, 0x28, 0x1c, 0x20, 0x30, 0x28, 0x61, 0x04, 0x21, 0x00, 0xe0, 0x0c, 0xe0, 0x29, 0x83, 0xe8, 0x61, 0xed, 0x62, 0x75, 0x63, 0x01, 0x20, 0x30, 0x63, 0x22, 0x1c, 0x89, 0x20, 0x01, 0x99, 0x0a, 0xf0, 0x38, 0xf8, 0x00, 0x20, 0x28, 0x63, 0xfe, 0xbd, 0x00, 0x00, 0x08, 0x57, 0x01, 0x00, 0x3c, 0x00, 0x3c, 0x69, 0x00, 0x00, 0x00, 0x30, 0x07, 0x00, 0x10, 0x8e, 0x01, 0x00, 0x74, 0xff, 0x01, 0x00, 0x09, 0x57, 0x01, 0x00, 0x20, 0x4e, 0x00, 0x00, 0xe4, 0xfe, 0x01, 0x00, 0x80, 0xb5, 0x13, 0x28, 0x1e, 0xd0, 0xf0, 0x28, 0x16, 0xd1, 0x09, 0xf0, 0xb5, 0xf9, 0x00, 0x28, 0x13, 0xd1, 0x0d, 0xf0, 0xbf, 0xfa, 0x11, 0xf0, 0x0d, 0xfc, 0x00, 0x22, 0x04, 0x21, 0xc4, 0x20, 0x0c, 0xf0, 0x1c, 0xff, 0x3c, 0x00, 0x78, 0x69, 0x00, 0x00, 0x09, 0x48, 0x00, 0x21, 0x00, 0x78, 0x05, 0xf0, 0x3f, 0xfd, 0x05, 0xf0, 0x93, 0xf8, 0x07, 0x49, 0x01, 0x20, 0x08, 0x60, 0x80, 0xbd, 0x01, 0x1c, 0x01, 0x20, 0xfa, 0xf7, 0x87, 0xfc, 0x80, 0xbd, 0x00, 0xf0, 0x32, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x6a, 0x57, 0x01, 0x00, 0x3c, 0xd9, 0x01, 0x00, 0xb0, 0xb5, 0x0c, 0xf0, 0xff, 0xf9, 0x0b, 0x49, 0x02, 0x24, 0x48, 0x60, 0x3c, 0x00, 0xb4, 0x69, 0x00, 0x00, 0x0a, 0x48, 0x04, 0x61, 0x01, 0x20, 0x77, 0x21, 0x09, 0x03, 0x08, 0x61, 0x08, 0x4d, 0x68, 0x68, 0x80, 0x07, 0x02, 0xd4, 0x68, 0x68, 0x20, 0x43, 0x68, 0x60, 0x09, 0xf0, 0xc7, 0xf9, 0x68, 0x68, 0xa0, 0x43, 0x68, 0x60, 0x00, 0x20, 0xb0, 0xbd, 0xe0, 0x60, 0x01, 0x00, 0x00, 0x30, 0x07, 0x00, 0x00, 0x01, 0x07, 0x00, 0x80, 0xb5, 0x01, 0x23, 0x03, 0x22, 0x00, 0x21, 0x3c, 0x00, 0xf0, 0x69, 0x00, 0x00, 0x02, 0x20, 0x3c, 0xf0, 0xf1, 0xfa, 0x00, 0x28, 0x01, 0xd0, 0xfa, 0xf7, 0x81, 0xfc, 0x80, 0xbd, 0x1c, 0xb5, 0xfc, 0xf7, 0xf5, 0xfa, 0xfa, 0xf7, 0x19, 0xfe, 0x01, 0xf0, 0x03, 0xf9, 0x00, 0x24, 0x21, 0x1c, 0x68, 0x46, 0x01, 0xf0, 0xe2, 0xfb, 0x00, 0xab, 0x18, 0x78, 0x01, 0x28, 0x03, 0xd0, 0x02, 0x28, 0x01, 0xd0, 0x03, 0x28, 0x01, 0xd1, 0x0c, 0xf0, 0xb2, 0xfc, 0x3c, 0x00, 0x2c, 0x6a, 0x00, 0x00, 0x01, 0x34, 0x24, 0x06, 0x24, 0x16, 0x06, 0x2c, 0xec, 0xdb, 0xfa, 0xf7, 0x09, 0xf9, 0xfa, 0xf7, 0xe7, 0xfc, 0xfa, 0xf7, 0x33, 0xfa, 0xfa, 0xf7, 0x6d, 0xfa, 0xfb, 0xf7, 0xdf, 0xff, 0x05, 0xf0, 0x4d, 0xfb, 0x06, 0xf0, 0x81, 0xfc, 0x0b, 0xf0, 0x7d, 0xf9, 0x07, 0xf0, 0x29, 0xfc, 0x11, 0x48, 0x10, 0x21, 0x01, 0x60, 0x09, 0x01, 0x01, 0x60, 0xc9, 0x02, 0x01, 0x60, 0x3c, 0x00, 0x68, 0x6a, 0x00, 0x00, 0x89, 0x00, 0x01, 0x60, 0x20, 0x21, 0x01, 0x60, 0x04, 0x21, 0x01, 0x60, 0x08, 0x21, 0x01, 0x60, 0x40, 0x21, 0x01, 0x60, 0x80, 0x21, 0x01, 0x60, 0x89, 0x00, 0x01, 0x60, 0x49, 0x00, 0x01, 0x60, 0x49, 0x00, 0x01, 0x60, 0x49, 0x00, 0x01, 0x60, 0xc9, 0x03, 0x01, 0x60, 0x89, 0x0b, 0x01, 0x60, 0xf9, 0xf7, 0x41, 0xff, 0x1c, 0xbd, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x3c, 0x00, 0xa4, 0x6a, 0x00, 0x00, 0x80, 0xb5, 0x3b, 0xf0, 0x4f, 0xf8, 0x3b, 0xf0, 0x7d, 0xf9, 0xfa, 0xf7, 0x4b, 0xf9, 0x80, 0xbd, 0xf8, 0xb5, 0x00, 0x25, 0x00, 0x24, 0x00, 0x22, 0x00, 0x28, 0x71, 0xd0, 0x43, 0x4f, 0xb9, 0x68, 0x0b, 0x1a, 0xbb, 0x60, 0xf8, 0x68, 0x39, 0x1c, 0x01, 0x30, 0xf8, 0x60, 0x89, 0x6a, 0x00, 0x2b, 0x1e, 0xdc, 0x02, 0x24, 0x00, 0x29, 0x06, 0xda, 0xfb, 0x69, 0x98, 0x42, 0x3c, 0x00, 0xe0, 0x6a, 0x00, 0x00, 0x06, 0xdd, 0x3b, 0x69, 0x98, 0x42, 0x09, 0xdd, 0x07, 0xe0, 0xbb, 0x69, 0x98, 0x42, 0x01, 0xdc, 0x01, 0x24, 0x03, 0xe0, 0x7b, 0x69, 0x98, 0x42, 0x00, 0xdd, 0x03, 0x24, 0x78, 0x6a, 0x00, 0x28, 0x08, 0xd0, 0x00, 0x20, 0x78, 0x62, 0x03, 0x2c, 0x01, 0xd1, 0x02, 0x24, 0x02, 0xe0, 0x02, 0x2c, 0x00, 0xd1, 0x01, 0x24, 0x2e, 0x48, 0x01, 0x2c, 0x00, 0x79, 0x18, 0xd1, 0x3c, 0x00, 0x1c, 0x6b, 0x00, 0x00, 0xbb, 0x78, 0x99, 0x42, 0x15, 0xda, 0x3b, 0x78, 0x7b, 0x70, 0x39, 0x70, 0x01, 0x31, 0xb9, 0x62, 0x01, 0xd5, 0x01, 0x31, 0xb9, 0x62, 0xb9, 0x6a, 0x01, 0x25, 0x99, 0x42, 0x03, 0xd1, 0x04, 0x28, 0x04, 0xd2, 0x01, 0x30, 0x00, 0xe0, 0x00, 0x20, 0x38, 0x71, 0x01, 0x22, 0x00, 0x29, 0x33, 0xda, 0x27, 0xe0, 0x03, 0x2c, 0x35, 0xd1, 0x00, 0x26, 0x00, 0x28, 0x07, 0xd0, 0x3c, 0x00, 0x58, 0x6b, 0x00, 0x00, 0x1e, 0x49, 0x81, 0x40, 0x38, 0x6a, 0x08, 0x18, 0x0c, 0xf0, 0x5c, 0xf8, 0x00, 0x28, 0x2c, 0xd0, 0x1b, 0x48, 0x00, 0x78, 0x40, 0x07, 0x05, 0xd5, 0xf8, 0x68, 0x39, 0x69, 0x88, 0x42, 0x01, 0xdb, 0x03, 0x23, 0xfe, 0x56, 0xb8, 0x6a, 0xb0, 0x42, 0x12, 0xdd, 0x01, 0x21, 0x79, 0x62, 0x39, 0x78, 0x01, 0x25, 0x79, 0x70, 0x38, 0x70, 0x01, 0x38, 0xb8, 0x62, 0x88, 0x42, 0x3c, 0x00, 0x94, 0x6b, 0x00, 0x00, 0x01, 0xd0, 0x00, 0x21, 0x39, 0x71, 0x00, 0x28, 0x0c, 0xda, 0x07, 0x20, 0x38, 0x71, 0x00, 0xe0, 0x12, 0xe0, 0x07, 0xe0, 0x38, 0x79, 0x00, 0x28, 0x09, 0xd0, 0xff, 0x30, 0x38, 0x71, 0x06, 0xe0, 0x00, 0x2a, 0x02, 0xd0, 0x0c, 0xf0, 0xf8, 0xf8, 0x38, 0x62, 0x00, 0x2c, 0x04, 0xd0, 0xfe, 0xf7, 0x97, 0xfd, 0x29, 0x1c, 0x08, 0xf0, 0xfc, 0xfb, 0xf8, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0xd0, 0x6b, 0x00, 0x00, 0xac, 0x7e, 0x01, 0x00, 0x50, 0xc3, 0x00, 0x00, 0x1d, 0x75, 0x01, 0x00, 0x80, 0xb5, 0x10, 0x68, 0x00, 0x28, 0x02, 0xd0, 0x00, 0xf0, 0x0a, 0xf8, 0x80, 0xbd, 0x03, 0x48, 0xc0, 0x69, 0x80, 0x68, 0x08, 0xf0, 0xb2, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x84, 0x6a, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0xc0, 0x68, 0x00, 0x28, 0x01, 0xd1, 0xfa, 0xf7, 0x7a, 0xfb, 0x3c, 0x00, 0x0c, 0x6c, 0x00, 0x00, 0xe0, 0x68, 0xe1, 0x69, 0xc0, 0x68, 0x23, 0x1c, 0x01, 0x4a, 0xff, 0xf7, 0xd7, 0xfb, 0x10, 0xbd, 0xdd, 0x6b, 0x00, 0x00, 0xb0, 0xb5, 0x05, 0x1c, 0x0c, 0x21, 0x00, 0x20, 0xfa, 0xf7, 0xd6, 0xfc, 0x04, 0x1c, 0x00, 0x68, 0x00, 0x21, 0x41, 0x60, 0x01, 0x60, 0x29, 0x88, 0x01, 0x81, 0x69, 0x88, 0x41, 0x81, 0x29, 0x1c, 0xff, 0x31, 0x21, 0x31, 0x20, 0x1c, 0x03, 0xf0, 0x3c, 0x00, 0x48, 0x6c, 0x00, 0x00, 0x77, 0xf9, 0x29, 0x1c, 0xff, 0x31, 0x46, 0x31, 0x20, 0x1c, 0x03, 0xf0, 0x71, 0xf9, 0x29, 0x1c, 0xff, 0x31, 0x50, 0x31, 0x20, 0x1c, 0x03, 0xf0, 0x6b, 0xf9, 0x29, 0x1c, 0xff, 0x31, 0x43, 0x31, 0x20, 0x1c, 0x03, 0xf0, 0x65, 0xf9, 0x29, 0x1c, 0xff, 0x31, 0x63, 0x31, 0x20, 0x1c, 0x03, 0xf0, 0x5f, 0xf9, 0x04, 0x48, 0x00, 0x68, 0x00, 0x28, 0x02, 0xd0, 0x20, 0x1c, 0x3c, 0x00, 0x84, 0x6c, 0x00, 0x00, 0xff, 0xf7, 0x8e, 0xfd, 0x20, 0x1c, 0xb0, 0xbd, 0xe4, 0x62, 0x01, 0x00, 0xf8, 0xb5, 0x05, 0x1c, 0x0c, 0x1c, 0x04, 0xd1, 0x05, 0x21, 0x18, 0x20, 0xfa, 0xf7, 0x02, 0xfb, 0x4d, 0xe0, 0x29, 0x1c, 0x12, 0x31, 0x06, 0x22, 0x60, 0x1c, 0xf9, 0xf7, 0x25, 0xfc, 0x22, 0x1c, 0x30, 0x32, 0x00, 0x26, 0x00, 0x21, 0x00, 0x20, 0x16, 0x70, 0x34, 0x4b, 0x1b, 0x5c, 0x2f, 0x8a, 0x3c, 0x00, 0xc0, 0x6c, 0x00, 0x00, 0xdf, 0x40, 0xff, 0x07, 0x07, 0xd5, 0x17, 0x78, 0x01, 0x33, 0x01, 0x37, 0x17, 0x70, 0x67, 0x18, 0x30, 0x37, 0x7b, 0x70, 0x01, 0x31, 0x01, 0x30, 0x0e, 0x28, 0xee, 0xdb, 0xa8, 0x7b, 0x60, 0x72, 0x10, 0x78, 0x00, 0x28, 0x2b, 0xd0, 0x2a, 0x48, 0x1e, 0x21, 0x09, 0x5c, 0x27, 0x1c, 0x10, 0x37, 0x21, 0x72, 0x01, 0x68, 0x61, 0x81, 0xc1, 0x89, 0x21, 0x77, 0x81, 0x89, 0x3c, 0x00, 0xfc, 0x6c, 0x00, 0x00, 0x79, 0x73, 0xc1, 0x8a, 0xa1, 0x81, 0x01, 0x8b, 0xe1, 0x81, 0x42, 0x8a, 0x21, 0x1c, 0x60, 0x31, 0x4a, 0x80, 0x82, 0x8a, 0x8a, 0x80, 0x1f, 0x49, 0x2c, 0x31, 0x09, 0x7a, 0x00, 0x29, 0x09, 0xd0, 0x02, 0x29, 0x0a, 0xd1, 0x01, 0x22, 0x62, 0x62, 0x62, 0x72, 0x42, 0x8b, 0xa2, 0x81, 0x80, 0x8b, 0xe0, 0x81, 0x03, 0xe0, 0x01, 0x21, 0x66, 0x62, 0x00, 0xe0, 0x00, 0x21, 0x3c, 0x00, 0x38, 0x6d, 0x00, 0x00, 0xe8, 0x7b, 0x08, 0x40, 0x01, 0xd1, 0x00, 0x20, 0xf8, 0xbd, 0xa8, 0x68, 0x43, 0x1c, 0x09, 0xd0, 0x22, 0x1c, 0x12, 0x32, 0x00, 0x92, 0x93, 0x1d, 0x02, 0x32, 0x21, 0x1c, 0x01, 0xf0, 0x9c, 0xfa, 0xa0, 0x62, 0x00, 0xe0, 0xa6, 0x62, 0x68, 0x7b, 0x29, 0x1c, 0x1d, 0x31, 0x20, 0x74, 0x0b, 0x48, 0x20, 0x22, 0x20, 0x62, 0x20, 0x1c, 0x42, 0x30, 0xbe, 0x73, 0xf9, 0xf7, 0x3c, 0x00, 0x74, 0x6d, 0x00, 0x00, 0xc1, 0xfb, 0x40, 0x34, 0x26, 0x70, 0x68, 0x7e, 0x04, 0x49, 0x60, 0x70, 0x68, 0x68, 0x2c, 0x31, 0x48, 0x60, 0x01, 0x20, 0xda, 0xe7, 0x00, 0x00, 0x90, 0x58, 0x01, 0x00, 0xc8, 0x6e, 0x01, 0x00, 0x91, 0x02, 0x01, 0x00, 0x70, 0xb5, 0x16, 0x1c, 0x0d, 0x1c, 0x04, 0x1c, 0x00, 0x28, 0x06, 0xd0, 0x0c, 0x20, 0xfa, 0xf7, 0x47, 0xfd, 0x30, 0xc0, 0x08, 0x38, 0x06, 0x72, 0x3c, 0x00, 0xb0, 0x6d, 0x00, 0x00, 0x70, 0xbd, 0x00, 0x20, 0x70, 0xbd, 0x00, 0x00, 0x01, 0x1c, 0x05, 0x48, 0x80, 0xb5, 0x00, 0x68, 0x01, 0xd0, 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0xfc, 0xf7, 0xa0, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x0c, 0x79, 0x01, 0x00, 0x70, 0xb5, 0x0e, 0x1c, 0x04, 0x1c, 0x00, 0x28, 0x01, 0xd1, 0xfa, 0xf7, 0x8f, 0xfa, 0x06, 0x4d, 0x28, 0x68, 0x00, 0x28, 0x01, 0xd0, 0xfa, 0xf7, 0x3c, 0x00, 0xec, 0x6d, 0x00, 0x00, 0x89, 0xfa, 0x04, 0x48, 0x2e, 0x60, 0xc4, 0x60, 0x01, 0x21, 0x01, 0x70, 0x70, 0xbd, 0x00, 0x00, 0xa8, 0x7e, 0x01, 0x00, 0x30, 0x00, 0x07, 0x00, 0x10, 0xb5, 0x07, 0x4c, 0x20, 0x68, 0x00, 0x28, 0x01, 0xd1, 0xfa, 0xf7, 0x77, 0xfa, 0x05, 0x48, 0x00, 0x69, 0x21, 0x68, 0xf9, 0xf7, 0xdf, 0xfa, 0x00, 0x20, 0x20, 0x60, 0x10, 0xbd, 0x00, 0x00, 0xa8, 0x7e, 0x01, 0x00, 0x3c, 0x00, 0x28, 0x6e, 0x00, 0x00, 0x30, 0x00, 0x07, 0x00, 0x01, 0x20, 0x05, 0x49, 0xc0, 0x06, 0x80, 0xb5, 0x08, 0x60, 0x00, 0x22, 0x03, 0x21, 0x54, 0x20, 0x0c, 0xf0, 0xb8, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x04, 0x21, 0xc4, 0x20, 0x0c, 0xf0, 0xae, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x04, 0x48, 0x80, 0xb5, 0x00, 0x88, 0x02, 0x49, 0xff, 0xf7, 0xb8, 0xff, 0x3c, 0x00, 0x64, 0x6e, 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x75, 0x4b, 0x00, 0x00, 0xc8, 0x74, 0x01, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x31, 0x48, 0x00, 0x25, 0xc0, 0x68, 0x0c, 0x1c, 0x00, 0x28, 0x30, 0xd0, 0x2e, 0x48, 0x2f, 0x4f, 0x04, 0x30, 0x00, 0x78, 0x38, 0x76, 0x2c, 0x48, 0x04, 0x30, 0x40, 0x78, 0x38, 0x81, 0x00, 0x2a, 0x0b, 0xd0, 0xf9, 0xf7, 0xa5, 0xfa, 0x1f, 0x20, 0xb8, 0x76, 0x20, 0x1c, 0x3c, 0x00, 0xa0, 0x6e, 0x00, 0x00, 0xf9, 0xf7, 0xf6, 0xf9, 0x25, 0x48, 0x04, 0x30, 0x80, 0x78, 0xb8, 0x76, 0x43, 0xe0, 0x25, 0x48, 0x22, 0x49, 0x84, 0x42, 0x4d, 0x69, 0x02, 0xd2, 0x6c, 0x43, 0xe4, 0x0b, 0x0f, 0xe0, 0x1f, 0x48, 0x21, 0x1c, 0x80, 0x6a, 0x00, 0x90, 0xf9, 0xf7, 0x23, 0xfc, 0x00, 0x99, 0x02, 0x1c, 0x4a, 0x43, 0xa1, 0x1a, 0x1a, 0x4a, 0x69, 0x43, 0x52, 0x6a, 0xc9, 0x0b, 0x50, 0x43, 0x3c, 0x00, 0xdc, 0x6e, 0x00, 0x00, 0x44, 0x18, 0x02, 0x2c, 0x01, 0xd8, 0x00, 0x20, 0xf8, 0xbd, 0xf9, 0xf7, 0x7d, 0xfa, 0x1f, 0x20, 0xb8, 0x76, 0x20, 0x1c, 0xf9, 0xf7, 0xae, 0xf9, 0x04, 0x1c, 0x11, 0x48, 0x04, 0x30, 0x80, 0x78, 0xb8, 0x76, 0x0f, 0x4f, 0x7d, 0x6a, 0xac, 0x42, 0x04, 0xd2, 0x20, 0x1c, 0xff, 0xf7, 0x22, 0xfc, 0x05, 0x1c, 0x12, 0xe0, 0x21, 0x1c, 0x28, 0x1c, 0xf9, 0xf7, 0xfc, 0xfb, 0x3c, 0x00, 0x18, 0x6f, 0x00, 0x00, 0x06, 0x1c, 0x68, 0x43, 0x20, 0x1a, 0xff, 0xf7, 0x17, 0xfc, 0x05, 0x1c, 0x00, 0x24, 0x04, 0xe0, 0x78, 0x6a, 0xff, 0xf7, 0x11, 0xfc, 0x45, 0x19, 0x01, 0x34, 0xb4, 0x42, 0xf8, 0xd3, 0x28, 0x1c, 0xd4, 0xe7, 0x00, 0x00, 0xc8, 0x74, 0x01, 0x00, 0x30, 0x00, 0x07, 0x00, 0xc0, 0xc6, 0x2d, 0x00, 0x01, 0x1c, 0x7d, 0x20, 0x80, 0xb5, 0xc0, 0x00, 0xf9, 0xf7, 0x72, 0xfb, 0x3c, 0x00, 0x54, 0x6f, 0x00, 0x00, 0x02, 0x49, 0x88, 0x61, 0x40, 0x08, 0xc8, 0x61, 0x80, 0xbd, 0x00, 0x00, 0xc8, 0x74, 0x01, 0x00, 0x10, 0xb5, 0x06, 0x4c, 0x21, 0x1c, 0x00, 0x20, 0x0b, 0xf0, 0x42, 0xfa, 0x21, 0x1c, 0x00, 0x20, 0x0b, 0xf0, 0x0a, 0xfa, 0x00, 0xf0, 0x68, 0xfe, 0x10, 0xbd, 0x00, 0x00, 0x85, 0x6f, 0x00, 0x00, 0x30, 0xb5, 0x0f, 0x4d, 0x2a, 0x78, 0x04, 0x2a, 0x19, 0xd8, 0x00, 0x2a, 0x3c, 0x00, 0x90, 0x6f, 0x00, 0x00, 0x17, 0xd0, 0x00, 0x21, 0x07, 0xe0, 0x4b, 0x00, 0x5b, 0x18, 0x5c, 0x19, 0x01, 0x23, 0xe4, 0x56, 0x84, 0x42, 0x02, 0xda, 0x01, 0x31, 0x8a, 0x42, 0xf5, 0xdc, 0x8a, 0x42, 0x00, 0xd1, 0x01, 0x39, 0x48, 0x00, 0x40, 0x18, 0x40, 0x19, 0x81, 0x78, 0x02, 0x4a, 0x34, 0x3a, 0x11, 0x70, 0xc0, 0x78, 0x50, 0x70, 0x30, 0xbd, 0x00, 0x75, 0x01, 0x00, 0x30, 0xb5, 0x11, 0x1c, 0x3c, 0x00, 0xcc, 0x6f, 0x00, 0x00, 0x38, 0x31, 0x85, 0xb0, 0x91, 0x62, 0x08, 0x21, 0x11, 0x86, 0x00, 0x23, 0x14, 0x1c, 0x01, 0x1c, 0x53, 0x63, 0xc0, 0x68, 0x15, 0x4d, 0x0b, 0xe0, 0x02, 0x68, 0xaa, 0x42, 0x06, 0xd1, 0xc2, 0x68, 0xca, 0x60, 0xc3, 0x60, 0x03, 0x60, 0xfa, 0xf7, 0xd1, 0xfa, 0x03, 0xe0, 0x01, 0x1c, 0xc0, 0x68, 0x00, 0x28, 0xf1, 0xd1, 0x22, 0x1c, 0x40, 0x32, 0x08, 0x21, 0x20, 0x68, 0x3c, 0x00, 0x08, 0x70, 0x00, 0x00, 0xfa, 0xf7, 0x64, 0xfb, 0x0b, 0x49, 0x20, 0x1c, 0x48, 0x30, 0x02, 0x90, 0x04, 0x94, 0x03, 0x91, 0xe0, 0x69, 0x82, 0x88, 0x01, 0x68, 0x6e, 0x20, 0x01, 0x92, 0x00, 0x91, 0x22, 0x1c, 0x56, 0x32, 0x03, 0x5d, 0x21, 0x1c, 0x28, 0x31, 0x20, 0x68, 0xff, 0xf7, 0x58, 0xfa, 0x05, 0xb0, 0x30, 0xbd, 0xa0, 0x7e, 0x01, 0x00, 0xd5, 0x70, 0x00, 0x00, 0x1c, 0xb5, 0x07, 0x49, 0x3c, 0x00, 0x44, 0x70, 0x00, 0x00, 0x02, 0x1c, 0x01, 0x90, 0x00, 0x91, 0xc0, 0x69, 0x13, 0x1c, 0x84, 0x88, 0x01, 0x68, 0x10, 0x68, 0x48, 0x33, 0x22, 0x1c, 0xff, 0xf7, 0x08, 0xf9, 0x1c, 0xbd, 0x00, 0x00, 0xc9, 0x6f, 0x00, 0x00, 0x10, 0xb5, 0x14, 0x1c, 0x18, 0x48, 0x03, 0xf0, 0x89, 0xf8, 0xa0, 0x42, 0x01, 0xd0, 0xfa, 0xf7, 0x45, 0xf9, 0x04, 0x22, 0x20, 0x1c, 0x40, 0x30, 0xa1, 0x6a, 0xf9, 0xf7, 0x3c, 0x00, 0x80, 0x70, 0x00, 0x00, 0xbd, 0xf9, 0x00, 0x28, 0x02, 0xd1, 0x01, 0x20, 0x20, 0x62, 0x05, 0xe0, 0x00, 0x20, 0x20, 0x62, 0x84, 0x20, 0x00, 0x5d, 0x00, 0x28, 0x03, 0xd1, 0x20, 0x1c, 0x09, 0xf0, 0x23, 0xfb, 0x05, 0xe0, 0x20, 0x68, 0xfa, 0xf7, 0x79, 0xfa, 0x20, 0x1c, 0xfa, 0xf7, 0xa4, 0xfb, 0xe0, 0x69, 0x80, 0x79, 0x06, 0x28, 0x06, 0xd1, 0x20, 0x6a, 0x06, 0x49, 0x00, 0x28, 0x03, 0xd0, 0x3c, 0x00, 0xbc, 0x70, 0x00, 0x00, 0x08, 0x69, 0x01, 0x30, 0x08, 0x61, 0x10, 0xbd, 0x48, 0x69, 0x01, 0x30, 0x48, 0x61, 0x10, 0xbd, 0xa0, 0x6a, 0x01, 0x00, 0x28, 0x61, 0x01, 0x00, 0x1c, 0xb5, 0x14, 0x1c, 0x15, 0x48, 0x03, 0xf0, 0x51, 0xf8, 0xa0, 0x42, 0x01, 0xd0, 0xfa, 0xf7, 0x0d, 0xf9, 0x20, 0x1c, 0x4f, 0x30, 0x02, 0x79, 0x41, 0x79, 0x00, 0xab, 0x12, 0x02, 0x11, 0x43, 0xc2, 0x78, 0x12, 0x04, 0x3c, 0x00, 0xf8, 0x70, 0x00, 0x00, 0x11, 0x43, 0x82, 0x78, 0x12, 0x06, 0x11, 0x43, 0x00, 0x91, 0x01, 0x78, 0x40, 0x78, 0x09, 0x02, 0x08, 0x43, 0x98, 0x80, 0x20, 0x1c, 0x69, 0x46, 0x06, 0xf0, 0x3c, 0xf9, 0x00, 0x28, 0x03, 0xd1, 0x20, 0x1c, 0x09, 0xf0, 0xe3, 0xfa, 0x1c, 0xbd, 0x20, 0x68, 0xfa, 0xf7, 0x39, 0xfa, 0x20, 0x1c, 0xfa, 0xf7, 0x64, 0xfb, 0xf7, 0xe7, 0x00, 0x00, 0xa0, 0x6a, 0x01, 0x00, 0x3c, 0x00, 0x34, 0x71, 0x00, 0x00, 0xbc, 0xb5, 0x1f, 0x4d, 0x14, 0x1c, 0x28, 0x1c, 0xdc, 0x30, 0x03, 0xf0, 0x1f, 0xf8, 0xa0, 0x42, 0x01, 0xd0, 0xfa, 0xf7, 0xdb, 0xf8, 0xa0, 0x6c, 0x00, 0xab, 0x02, 0x78, 0x81, 0x78, 0x12, 0x02, 0x11, 0x43, 0x02, 0x79, 0x12, 0x04, 0x11, 0x43, 0x42, 0x79, 0x12, 0x06, 0x11, 0x43, 0x00, 0x91, 0x81, 0x79, 0xc0, 0x79, 0x00, 0x02, 0x08, 0x43, 0x98, 0x80, 0x20, 0x1c, 0x3c, 0x00, 0x70, 0x71, 0x00, 0x00, 0x69, 0x46, 0x06, 0xf0, 0x0b, 0xf9, 0x00, 0x28, 0x17, 0xd0, 0x01, 0x28, 0x0e, 0xd1, 0xed, 0x6c, 0x00, 0x2d, 0x0b, 0xd0, 0x80, 0x20, 0x02, 0x5d, 0xe0, 0x6c, 0x01, 0x21, 0x00, 0x28, 0x00, 0xd1, 0x00, 0x21, 0x60, 0x68, 0x6b, 0x46, 0x0a, 0x30, 0xf9, 0xf7, 0x23, 0xf9, 0x20, 0x68, 0xfa, 0xf7, 0xfb, 0xf9, 0x20, 0x1c, 0xfa, 0xf7, 0x26, 0xfb, 0xbc, 0xbd, 0x20, 0x1c, 0x3c, 0x00, 0xac, 0x71, 0x00, 0x00, 0x00, 0xf0, 0x8e, 0xfe, 0xfa, 0xe7, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0xbc, 0xb5, 0x04, 0x1c, 0x40, 0x6a, 0x00, 0x25, 0x00, 0x28, 0x03, 0xd0, 0x60, 0x68, 0x00, 0x8b, 0x05, 0x07, 0x2d, 0x0f, 0x22, 0x1c, 0x40, 0x32, 0x08, 0x21, 0x20, 0x68, 0xfa, 0xf7, 0x7e, 0xfa, 0xa1, 0x68, 0x01, 0x95, 0x00, 0x91, 0x21, 0x1c, 0x22, 0x1c, 0x60, 0x32, 0x20, 0x68, 0x50, 0x31, 0x3c, 0x00, 0xe8, 0x71, 0x00, 0x00, 0x0d, 0x1c, 0xe3, 0x68, 0x09, 0xf0, 0xe2, 0xff, 0xe0, 0x69, 0x80, 0x6b, 0x00, 0x28, 0x03, 0xd1, 0xfe, 0xf7, 0xe8, 0xfa, 0x00, 0x28, 0x01, 0xd0, 0x18, 0x20, 0x00, 0xe0, 0x10, 0x20, 0x06, 0x49, 0x01, 0x94, 0x00, 0x91, 0xe1, 0x69, 0x08, 0x23, 0x09, 0x68, 0x0a, 0x18, 0x21, 0x1c, 0x28, 0x31, 0x28, 0x1c, 0xff, 0xf7, 0x87, 0xf9, 0xbc, 0xbd, 0x35, 0x71, 0x00, 0x00, 0x3c, 0x00, 0x24, 0x72, 0x00, 0x00, 0x10, 0xb5, 0x10, 0x1c, 0x38, 0x30, 0x90, 0x62, 0x04, 0x20, 0x10, 0x86, 0x00, 0x20, 0x50, 0x63, 0x10, 0x68, 0x14, 0x1c, 0x40, 0x32, 0x04, 0x21, 0xfa, 0xf7, 0x4a, 0xfa, 0x23, 0x1c, 0x21, 0x1c, 0x28, 0x31, 0x02, 0x4a, 0x20, 0x68, 0xff, 0xf7, 0xbd, 0xf8, 0x10, 0xbd, 0x65, 0x70, 0x00, 0x00, 0x0e, 0xb5, 0xc3, 0x69, 0x02, 0x1c, 0x98, 0x88, 0x05, 0x49, 0x02, 0x92, 0x3c, 0x00, 0x60, 0x72, 0x00, 0x00, 0x01, 0x91, 0x00, 0x90, 0x1b, 0x68, 0x10, 0x68, 0x91, 0x69, 0x03, 0x22, 0xff, 0xf7, 0xae, 0xf9, 0x0e, 0xbd, 0x00, 0x00, 0x25, 0x72, 0x00, 0x00, 0x0e, 0xb5, 0x02, 0x1c, 0x06, 0x49, 0x10, 0x20, 0x00, 0x90, 0x02, 0x92, 0x13, 0x1c, 0x01, 0x91, 0x10, 0x68, 0x00, 0x22, 0x70, 0x33, 0x00, 0x21, 0xff, 0xf7, 0x9c, 0xf9, 0x0e, 0xbd, 0x00, 0x00, 0x25, 0x72, 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x72, 0x00, 0x00, 0x10, 0xb5, 0x03, 0x1c, 0x00, 0x21, 0x00, 0x20, 0x08, 0x4c, 0x00, 0xe0, 0x01, 0x31, 0xca, 0x00, 0xa2, 0x58, 0x9a, 0x42, 0x02, 0xd0, 0x0b, 0x29, 0xf8, 0xd3, 0x10, 0xbd, 0x0b, 0x29, 0xfc, 0xd2, 0xc9, 0x00, 0x09, 0x19, 0x00, 0x20, 0x08, 0x71, 0x01, 0x20, 0x10, 0xbd, 0x38, 0x58, 0x01, 0x00, 0x8c, 0xb5, 0x00, 0xab, 0x86, 0x21, 0x19, 0x80, 0x01, 0x1c, 0x04, 0x48, 0x3c, 0x00, 0xd8, 0x72, 0x00, 0x00, 0x06, 0xf0, 0xee, 0xfe, 0x01, 0x90, 0x68, 0x46, 0x06, 0xf0, 0xfa, 0xf8, 0x8c, 0xbd, 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x0d, 0x48, 0x0d, 0x49, 0x94, 0xb0, 0x04, 0x80, 0x06, 0x22, 0x18, 0x31, 0x0c, 0x30, 0xf9, 0xf7, 0xfb, 0xf8, 0x01, 0xa8, 0x07, 0xf0, 0xa2, 0xf8, 0x0c, 0x20, 0x09, 0xa9, 0x48, 0x72, 0x00, 0xab, 0x1c, 0x80, 0x02, 0x21, 0x3c, 0x00, 0x14, 0x73, 0x00, 0x00, 0x68, 0x46, 0x03, 0xf0, 0xdb, 0xff, 0x04, 0x90, 0x01, 0xa8, 0x06, 0xf0, 0xd1, 0xf8, 0x14, 0xb0, 0x10, 0xbd, 0x00, 0x00, 0x58, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x04, 0xf0, 0x45, 0xfe, 0x05, 0xf0, 0x53, 0xfa, 0x80, 0xbd, 0x10, 0xb5, 0x19, 0x4c, 0xe0, 0x68, 0x00, 0x28, 0x06, 0xd0, 0x61, 0x1c, 0x08, 0x78, 0x00, 0x28, 0x03, 0xd1, 0x48, 0x78, 0xff, 0x30, 0x08, 0x70, 0x3c, 0x00, 0x50, 0x73, 0x00, 0x00, 0x10, 0xbd, 0xff, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x08, 0x70, 0xa1, 0x68, 0x00, 0x29, 0xf7, 0xd0, 0x00, 0x28, 0xf5, 0xd1, 0x0e, 0x48, 0x54, 0x30, 0x81, 0x78, 0x00, 0x29, 0x03, 0xd1, 0xc1, 0x78, 0xff, 0x31, 0x81, 0x70, 0x10, 0xbd, 0xff, 0x31, 0x09, 0x06, 0x09, 0x0e, 0x81, 0x70, 0xf9, 0xd1, 0xa1, 0x69, 0x00, 0x29, 0xf6, 0xd0, 0x80, 0x88, 0x03, 0xf0, 0xd0, 0xfb, 0x3c, 0x00, 0x8c, 0x73, 0x00, 0x00, 0x04, 0x4a, 0x01, 0x1c, 0x5c, 0x32, 0x0c, 0x32, 0x05, 0xca, 0x80, 0x1a, 0xa2, 0x69, 0xf9, 0xf7, 0x1f, 0xf8, 0x10, 0xbd, 0x44, 0x7d, 0x01, 0x00, 0xf0, 0xb5, 0x04, 0x1c, 0x40, 0x68, 0x00, 0x25, 0x01, 0x79, 0x00, 0x22, 0x85, 0xb0, 0xc9, 0x07, 0xcb, 0x17, 0x69, 0x49, 0x01, 0x33, 0x89, 0x6a, 0x10, 0x29, 0x05, 0xd3, 0x66, 0x49, 0xc0, 0x39, 0x08, 0x6b, 0x01, 0x30, 0x3c, 0x00, 0xc8, 0x73, 0x00, 0x00, 0x08, 0x63, 0x8e, 0xe0, 0x21, 0x68, 0x0e, 0x68, 0xf6, 0x78, 0xb7, 0x06, 0xff, 0x0f, 0xb6, 0x09, 0x00, 0x2b, 0x04, 0x97, 0x06, 0xd0, 0x63, 0x69, 0x1f, 0x1c, 0x1b, 0x6a, 0x50, 0x37, 0x9f, 0x42, 0x00, 0xd1, 0x01, 0x25, 0x00, 0x2d, 0x02, 0xd0, 0x63, 0x69, 0x1b, 0x6a, 0x04, 0xe0, 0x3c, 0x23, 0x59, 0x4f, 0x73, 0x43, 0xdb, 0x19, 0x04, 0x33, 0xe3, 0x61, 0x9f, 0x88, 0x3c, 0x00, 0x04, 0x74, 0x00, 0x00, 0x00, 0x2f, 0x70, 0xd0, 0x9b, 0x79, 0x02, 0x2b, 0x6e, 0xd0, 0x04, 0x2b, 0x17, 0xd0, 0x06, 0x2b, 0x69, 0xd1, 0x08, 0x68, 0xa0, 0x61, 0x08, 0x89, 0x04, 0x38, 0x08, 0x81, 0x20, 0x68, 0x01, 0x68, 0x04, 0x31, 0x01, 0x60, 0x4e, 0x49, 0x00, 0x29, 0x5d, 0xd0, 0x04, 0x9f, 0xba, 0x42, 0x5a, 0xd1, 0x49, 0x48, 0x22, 0x1c, 0x1c, 0x30, 0x02, 0xf0, 0x65, 0xfe, 0x05, 0xb0, 0x3c, 0x00, 0x40, 0x74, 0x00, 0x00, 0xf0, 0xbd, 0x09, 0x68, 0x25, 0x1c, 0xca, 0x79, 0x40, 0x35, 0x26, 0x1c, 0xea, 0x73, 0x8b, 0x79, 0x22, 0x1c, 0x50, 0x32, 0x13, 0x70, 0x4b, 0x79, 0x60, 0x36, 0x53, 0x70, 0x0b, 0x79, 0x93, 0x70, 0x4b, 0x78, 0xd3, 0x70, 0x09, 0x78, 0x11, 0x71, 0x00, 0x21, 0x29, 0x72, 0x16, 0x21, 0xb1, 0x73, 0x61, 0x6a, 0x00, 0x29, 0x06, 0xd0, 0x01, 0x8b, 0x09, 0x07, 0x09, 0x0f, 0x3c, 0x00, 0x7c, 0x74, 0x00, 0x00, 0x29, 0x72, 0xb1, 0x81, 0x18, 0x21, 0xb1, 0x73, 0x01, 0x1c, 0x0a, 0x31, 0x20, 0x1c, 0x06, 0x22, 0x49, 0x30, 0xf9, 0xf7, 0x33, 0xf8, 0x60, 0x68, 0x14, 0x22, 0x01, 0x88, 0xe9, 0x82, 0x01, 0x1d, 0x20, 0x1c, 0x58, 0x30, 0xf9, 0xf7, 0x2a, 0xf8, 0xe8, 0x8a, 0x30, 0x49, 0x08, 0x40, 0x01, 0x21, 0x89, 0x03, 0x08, 0x43, 0xe8, 0x82, 0x70, 0x89, 0x0f, 0x21, 0x08, 0x40, 0x3c, 0x00, 0xb8, 0x74, 0x00, 0x00, 0x70, 0x81, 0x20, 0x68, 0x01, 0x89, 0x08, 0x39, 0x01, 0x81, 0x20, 0x68, 0x01, 0x68, 0x08, 0x31, 0x01, 0x60, 0x08, 0x21, 0x00, 0x20, 0xfa, 0xf7, 0x83, 0xf8, 0x05, 0x1c, 0x02, 0x68, 0x20, 0x68, 0x08, 0x21, 0xfa, 0xf7, 0xfb, 0xf8, 0x20, 0x68, 0xfa, 0xf7, 0x74, 0xf8, 0x21, 0x49, 0xc5, 0x60, 0x2f, 0xe0, 0x30, 0xe0, 0xff, 0xe7, 0x21, 0x68, 0x60, 0x68, 0x0a, 0x68, 0x3c, 0x00, 0xf4, 0x74, 0x00, 0x00, 0x80, 0x23, 0xa2, 0x64, 0x1e, 0x55, 0xe5, 0x64, 0x55, 0x79, 0x13, 0x79, 0x2d, 0x02, 0x5b, 0x19, 0x95, 0x79, 0x2d, 0x04, 0x5b, 0x19, 0xd5, 0x79, 0x2d, 0x06, 0x5b, 0x19, 0x95, 0x78, 0x12, 0x78, 0x12, 0x02, 0xaa, 0x18, 0x15, 0x04, 0x0a, 0x89, 0x2d, 0x0c, 0x08, 0x3a, 0x0a, 0x81, 0x21, 0x68, 0x0a, 0x68, 0x08, 0x32, 0x0a, 0x60, 0xe1, 0x69, 0x02, 0x1c, 0x0a, 0x32, 0x3c, 0x00, 0x30, 0x75, 0x00, 0x00, 0x01, 0xa8, 0x09, 0x68, 0x0b, 0xf0, 0x3e, 0xf9, 0xe0, 0x69, 0x2b, 0x1c, 0x01, 0x68, 0x20, 0x1c, 0x70, 0x30, 0x01, 0xaa, 0x0b, 0xf0, 0x86, 0xf9, 0x09, 0x49, 0x01, 0x22, 0x6d, 0xe7, 0x20, 0x68, 0xfa, 0xf7, 0x22, 0xf8, 0x20, 0x1c, 0xfa, 0xf7, 0x4d, 0xf9, 0x70, 0xe7, 0x84, 0x6a, 0x01, 0x00, 0x68, 0x61, 0x01, 0x00, 0x55, 0x72, 0x00, 0x00, 0x8f, 0xc7, 0xff, 0xff, 0x3c, 0x00, 0x6c, 0x75, 0x00, 0x00, 0x41, 0x70, 0x00, 0x00, 0x79, 0x72, 0x00, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x82, 0x20, 0xf9, 0xf7, 0x93, 0xfe, 0x80, 0xbd, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0xc0, 0x68, 0xf9, 0xf7, 0xfa, 0xff, 0x01, 0x20, 0x80, 0xbd, 0x3c, 0x00, 0xa8, 0x75, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x21, 0xff, 0x20, 0xf9, 0xf7, 0x79, 0xfe, 0x80, 0xbd, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x01, 0x20, 0x70, 0x47, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x06, 0x21, 0x99, 0x20, 0xf9, 0xf7, 0x65, 0xfe, 0x80, 0xbd, 0xb0, 0xb5, 0x00, 0x25, 0x01, 0x29, 0x12, 0x4c, 0x3c, 0x00, 0xe4, 0x75, 0x00, 0x00, 0x0f, 0xd1, 0x0a, 0xf0, 0x0f, 0xfc, 0x00, 0x28, 0x1d, 0xd0, 0x61, 0x78, 0x3c, 0x23, 0x59, 0x43, 0x09, 0x19, 0x04, 0x31, 0x01, 0x62, 0x61, 0x1c, 0x41, 0x62, 0x84, 0x62, 0x04, 0x1c, 0x50, 0x34, 0x06, 0xe0, 0x00, 0x29, 0x0f, 0xd1, 0x3c, 0x20, 0x50, 0x43, 0x25, 0x70, 0x04, 0x19, 0x04, 0x34, 0x00, 0x2c, 0x08, 0xd0, 0x20, 0x68, 0x00, 0x28, 0x02, 0xd0, 0x20, 0x21, 0x3c, 0x00, 0x20, 0x76, 0x00, 0x00, 0xf8, 0xf7, 0x18, 0xff, 0xa5, 0x80, 0x07, 0x20, 0xa0, 0x71, 0xb0, 0xbd, 0x68, 0x61, 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x00, 0x21, 0x01, 0xf0, 0x41, 0xfc, 0x60, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x21, 0x68, 0x01, 0x60, 0x20, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x61, 0x68, 0x41, 0x60, 0x12, 0x4e, 0x70, 0x68, 0xa0, 0x42, 0x01, 0xd1, 0x60, 0x68, 0x70, 0x60, 0xe0, 0x68, 0x3c, 0x00, 0x5c, 0x76, 0x00, 0x00, 0x00, 0x28, 0x0b, 0xd0, 0x00, 0x25, 0x06, 0xe0, 0xe0, 0x68, 0xe9, 0x00, 0x41, 0x18, 0x14, 0x20, 0x0b, 0xf0, 0xe2, 0xff, 0x01, 0x35, 0x30, 0x88, 0x85, 0x42, 0xf5, 0xdb, 0x06, 0x21, 0x20, 0x1c, 0x44, 0x30, 0xf8, 0xf7, 0xe9, 0xfe, 0x20, 0x6b, 0x00, 0x28, 0x01, 0xd0, 0xf9, 0xf7, 0x86, 0xff, 0xe0, 0x69, 0x00, 0x28, 0x01, 0xd0, 0xfa, 0xf7, 0xaf, 0xf8, 0x70, 0xbd, 0x3c, 0x00, 0x98, 0x76, 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, 0xf0, 0xb5, 0x1d, 0x4f, 0x05, 0x9d, 0x3f, 0x68, 0x01, 0x26, 0x1c, 0x1c, 0x33, 0x1c, 0x00, 0x2f, 0x00, 0xd0, 0x2b, 0x1c, 0x1d, 0x06, 0x2d, 0x0e, 0x00, 0x29, 0x06, 0xd0, 0x11, 0x78, 0x0e, 0x23, 0x16, 0x4f, 0x09, 0x18, 0x09, 0x7a, 0x6b, 0x43, 0x10, 0xe0, 0x21, 0x78, 0x00, 0x29, 0x13, 0xd0, 0xff, 0x31, 0x0d, 0xe0, 0x01, 0x29, 0x01, 0xd9, 0x3c, 0x00, 0xd4, 0x76, 0x00, 0x00, 0x01, 0x31, 0x11, 0x70, 0x11, 0x78, 0x0e, 0x23, 0x0f, 0x4f, 0x49, 0x08, 0x11, 0x70, 0x09, 0x18, 0x09, 0x7a, 0x6b, 0x43, 0xdb, 0x19, 0x59, 0x5c, 0x21, 0x70, 0x21, 0x78, 0x00, 0x29, 0x02, 0xd1, 0x11, 0x78, 0x00, 0x29, 0xea, 0xd1, 0x09, 0x48, 0xc0, 0x68, 0x00, 0x28, 0x05, 0xd0, 0x21, 0x78, 0x30, 0x1c, 0x00, 0x29, 0x00, 0xd1, 0x00, 0x20, 0xf0, 0xbd, 0x01, 0x20, 0x3c, 0x00, 0x10, 0x77, 0x00, 0x00, 0xf0, 0xbd, 0x00, 0x00, 0x18, 0x67, 0x01, 0x00, 0x24, 0x67, 0x01, 0x00, 0x5c, 0x67, 0x01, 0x00, 0xac, 0x7c, 0x01, 0x00, 0x84, 0x46, 0x00, 0x20, 0xf0, 0xb5, 0x00, 0x29, 0x09, 0xd0, 0x11, 0x78, 0x1a, 0x4e, 0xb1, 0x70, 0x19, 0x4e, 0xb1, 0x78, 0x71, 0x70, 0x31, 0x70, 0x01, 0x21, 0x31, 0x61, 0x27, 0xe0, 0x16, 0x4e, 0x01, 0x23, 0xf1, 0x56, 0x63, 0x46, 0x5f, 0x68, 0x3c, 0x00, 0x4c, 0x77, 0x00, 0x00, 0x00, 0x23, 0xf6, 0x56, 0x01, 0x25, 0xcc, 0x0f, 0xb7, 0x42, 0x00, 0xd9, 0x00, 0x25, 0x00, 0x2c, 0x01, 0xd0, 0x00, 0x2d, 0xe8, 0xd1, 0x0e, 0x4f, 0x3b, 0x69, 0x00, 0x2b, 0x03, 0xd0, 0x00, 0x2d, 0x01, 0xd1, 0x16, 0x70, 0x02, 0xe0, 0x1c, 0x43, 0x01, 0xd1, 0x11, 0x70, 0x01, 0x20, 0x01, 0x24, 0x00, 0x2b, 0x00, 0xd0, 0x00, 0x24, 0x3c, 0x61, 0x00, 0x2c, 0x02, 0xd0, 0x3c, 0x00, 0x88, 0x77, 0x00, 0x00, 0x71, 0x1c, 0x39, 0x70, 0x01, 0xe0, 0xff, 0x31, 0x79, 0x70, 0x00, 0x28, 0xd5, 0xd0, 0x01, 0x20, 0xf0, 0xbd, 0x00, 0x00, 0xac, 0x7c, 0x01, 0x00, 0x90, 0xb5, 0x0a, 0x4c, 0x00, 0x20, 0x93, 0xb0, 0x20, 0x61, 0x03, 0x90, 0x68, 0x46, 0x00, 0x21, 0x08, 0xf0, 0x84, 0xfd, 0x20, 0x7a, 0x02, 0x28, 0x01, 0xd1, 0xe0, 0x6b, 0x00, 0xe0, 0x20, 0x6c, 0xe0, 0x61, 0x01, 0x20, 0x3c, 0x00, 0xc4, 0x77, 0x00, 0x00, 0x08, 0xf0, 0x8a, 0xfd, 0x13, 0xb0, 0x90, 0xbd, 0xf4, 0x6e, 0x01, 0x00, 0xf7, 0xb5, 0x05, 0x1c, 0x88, 0x88, 0x0c, 0x1c, 0x82, 0xb0, 0x1f, 0x4f, 0x00, 0x28, 0x00, 0xd1, 0x00, 0x27, 0x04, 0x98, 0x00, 0x28, 0x01, 0xd1, 0xf9, 0xf7, 0x8a, 0xfd, 0x1b, 0x48, 0x3b, 0x1c, 0x00, 0x68, 0x21, 0x1c, 0x02, 0x68, 0x28, 0x1c, 0x00, 0x92, 0x04, 0x9a, 0xfe, 0xf7, 0x3c, 0xf8, 0x3c, 0x00, 0x00, 0x78, 0x00, 0x00, 0x06, 0x1c, 0x22, 0xd0, 0x03, 0x21, 0x04, 0x98, 0x02, 0xf0, 0xb8, 0xff, 0x00, 0x28, 0x1b, 0xd0, 0x80, 0x78, 0x01, 0x21, 0x03, 0xf0, 0xe4, 0xff, 0xa0, 0x88, 0xa1, 0x8e, 0x48, 0x43, 0x00, 0x04, 0x0f, 0x49, 0x00, 0x0c, 0x08, 0x80, 0x03, 0xf0, 0x81, 0xf9, 0x01, 0x22, 0x00, 0x2d, 0x00, 0xd1, 0x00, 0x22, 0x01, 0x1c, 0x0e, 0x20, 0x0b, 0xf0, 0xc9, 0xfe, 0x00, 0x2f, 0x3c, 0x00, 0x3c, 0x78, 0x00, 0x00, 0x08, 0xd1, 0x00, 0x21, 0x28, 0x1c, 0x02, 0xf0, 0xbd, 0xfc, 0x03, 0xe0, 0x00, 0x26, 0x28, 0x1c, 0x00, 0xf0, 0x0a, 0xf8, 0x30, 0x1c, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xc1, 0xa1, 0x00, 0x00, 0xe4, 0x65, 0x01, 0x00, 0xa8, 0x7c, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0xfe, 0xf7, 0x38, 0xf8, 0x01, 0x21, 0x00, 0x2c, 0x00, 0xd1, 0x00, 0x21, 0x0e, 0x20, 0x0b, 0xf0, 0x3c, 0x00, 0x78, 0x78, 0x00, 0x00, 0xdd, 0xfe, 0x10, 0xbd, 0xf8, 0xb5, 0x07, 0x1c, 0x0b, 0xf0, 0x94, 0xfa, 0xfd, 0xf7, 0xbc, 0xfe, 0x00, 0x26, 0x02, 0x28, 0x1e, 0x4d, 0x01, 0xd0, 0x2e, 0x70, 0xf8, 0xbd, 0xfd, 0xf7, 0x3e, 0xf8, 0x04, 0x1c, 0xf9, 0xf7, 0x59, 0xfc, 0x00, 0x28, 0x14, 0xd0, 0xfd, 0xf7, 0x77, 0xf8, 0x00, 0x28, 0x10, 0xd0, 0x02, 0xf0, 0xf9, 0xfb, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x24, 0x3c, 0x00, 0xb4, 0x78, 0x00, 0x00, 0x00, 0xe0, 0x15, 0x4c, 0x33, 0x1c, 0x21, 0x1c, 0x07, 0x22, 0x16, 0x20, 0x0b, 0xf0, 0x66, 0xff, 0x68, 0x78, 0x80, 0x21, 0x08, 0x43, 0x68, 0x70, 0x02, 0xf0, 0x0a, 0xfc, 0x00, 0x28, 0xde, 0xd1, 0x28, 0x78, 0x80, 0x07, 0xdb, 0xd4, 0xfd, 0xf7, 0x23, 0xf9, 0x00, 0x28, 0x05, 0xd1, 0x28, 0x78, 0xc0, 0x07, 0x02, 0xd5, 0xfd, 0xf7, 0x42, 0xf8, 0xd1, 0xe7, 0x02, 0xf0, 0x3c, 0x00, 0xf0, 0x78, 0x00, 0x00, 0xcd, 0xfb, 0x00, 0x28, 0xcd, 0xd0, 0x28, 0x78, 0x02, 0x21, 0x08, 0x43, 0x28, 0x70, 0x21, 0x1c, 0x38, 0x1c, 0xfd, 0xf7, 0xc1, 0xf8, 0xc4, 0xe7, 0x60, 0x6c, 0x01, 0x00, 0x71, 0x02, 0x00, 0x00, 0x10, 0xb5, 0x12, 0x4c, 0x01, 0x20, 0x20, 0x70, 0xfe, 0xf7, 0xf0, 0xf9, 0x01, 0x21, 0xa0, 0x68, 0xfb, 0xf7, 0xf4, 0xfe, 0xa0, 0x68, 0x03, 0xf0, 0x87, 0xff, 0x0d, 0x48, 0x3c, 0x00, 0x2c, 0x79, 0x00, 0x00, 0xa1, 0x68, 0x07, 0xf0, 0x23, 0xfd, 0xfb, 0xf7, 0x55, 0xff, 0xe0, 0x68, 0x00, 0x28, 0x0d, 0xd0, 0x09, 0x49, 0x06, 0x20, 0x0a, 0xf0, 0x24, 0xfd, 0x08, 0x49, 0x05, 0x20, 0x0a, 0xf0, 0x20, 0xfd, 0xfb, 0xf7, 0x6e, 0xff, 0x00, 0x28, 0x01, 0xd0, 0x05, 0xf0, 0xf8, 0xfc, 0x10, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0xe1, 0x35, 0x00, 0x00, 0x3c, 0x00, 0x68, 0x79, 0x00, 0x00, 0xb1, 0x35, 0x00, 0x00, 0xf0, 0xb5, 0x24, 0x4d, 0x23, 0x4c, 0x68, 0x7c, 0x20, 0x3c, 0x9b, 0xb0, 0x00, 0x28, 0x08, 0xd0, 0x02, 0x28, 0x03, 0xd8, 0x20, 0x89, 0x01, 0x38, 0x20, 0x81, 0x37, 0xe0, 0x00, 0x27, 0x6f, 0x74, 0x34, 0xe0, 0x1c, 0x4e, 0x68, 0x22, 0x14, 0x36, 0x31, 0x1c, 0x0c, 0x31, 0x01, 0xa8, 0xf8, 0xf7, 0x09, 0xfe, 0x18, 0x48, 0x33, 0x89, 0x01, 0x21, 0x3c, 0x00, 0xa4, 0x79, 0x00, 0x00, 0x44, 0x30, 0x0a, 0x1c, 0x00, 0x2b, 0x00, 0x7b, 0x00, 0xd1, 0x02, 0x1c, 0x12, 0x06, 0x12, 0x0e, 0x0d, 0xaf, 0x3a, 0x70, 0x94, 0x46, 0xaa, 0x7b, 0x93, 0x19, 0x30, 0x33, 0x5b, 0x7b, 0x7b, 0x70, 0xea, 0x73, 0x01, 0x32, 0x12, 0x06, 0x12, 0x0e, 0x00, 0x27, 0x82, 0x42, 0xaa, 0x73, 0x01, 0xd3, 0xaf, 0x73, 0x04, 0xe0, 0x62, 0x46, 0x01, 0x2a, 0x01, 0xd1, 0x77, 0x60, 0x3c, 0x00, 0xe0, 0x79, 0x00, 0x00, 0x00, 0xe0, 0x71, 0x60, 0x06, 0x48, 0x07, 0x4a, 0x80, 0x38, 0x81, 0x67, 0x42, 0x67, 0x68, 0x22, 0x01, 0xa9, 0xf8, 0xf7, 0xdd, 0xfd, 0x27, 0x81, 0x08, 0xf0, 0x12, 0xfd, 0x1b, 0xb0, 0xf0, 0xbd, 0x84, 0x66, 0x01, 0x00, 0xe9, 0x2e, 0x00, 0x00, 0xf1, 0xb5, 0x86, 0xb0, 0x06, 0x99, 0x00, 0x20, 0x88, 0x61, 0x06, 0x98, 0x84, 0x68, 0x80, 0x8d, 0x65, 0x68, 0x01, 0x28, 0x3c, 0x00, 0x1c, 0x7a, 0x00, 0x00, 0x4c, 0xd9, 0x35, 0x49, 0x49, 0x68, 0x05, 0x91, 0x00, 0x29, 0x47, 0xd0, 0x00, 0x22, 0x00, 0x21, 0x00, 0x23, 0x03, 0x90, 0x28, 0x1c, 0x96, 0x46, 0x94, 0x46, 0x06, 0x68, 0x04, 0x96, 0xf2, 0x78, 0x80, 0x26, 0xb2, 0x43, 0x3f, 0x2a, 0x2e, 0xd8, 0xd7, 0x06, 0xff, 0x0e, 0x01, 0x26, 0xbe, 0x40, 0x37, 0x1c, 0x04, 0x9e, 0x52, 0x09, 0xb6, 0x78, 0x76, 0x00, 0xb2, 0x18, 0x3c, 0x00, 0x58, 0x7a, 0x00, 0x00, 0x26, 0x4e, 0x92, 0x00, 0x1c, 0x36, 0xb2, 0x58, 0x3a, 0x40, 0x1e, 0xd0, 0x03, 0xe0, 0x02, 0x90, 0x02, 0x89, 0xc0, 0x68, 0x51, 0x18, 0x00, 0x28, 0xf9, 0xd1, 0x05, 0x98, 0x81, 0x42, 0x14, 0xd8, 0x70, 0x46, 0x01, 0x30, 0x86, 0x46, 0x00, 0x2b, 0x04, 0xd0, 0x60, 0x46, 0xd8, 0x60, 0x01, 0x98, 0x62, 0x46, 0xd0, 0x60, 0x03, 0x98, 0x01, 0x38, 0x03, 0x90, 0x06, 0xd0, 0x3c, 0x00, 0x94, 0x7a, 0x00, 0x00, 0x23, 0x1c, 0x24, 0x68, 0x60, 0x68, 0x02, 0x9a, 0x01, 0x90, 0x94, 0x46, 0xc9, 0xe7, 0x70, 0x46, 0x01, 0x28, 0x07, 0xd9, 0x2a, 0x1c, 0x00, 0x21, 0x3f, 0x20, 0x01, 0xf0, 0x51, 0xff, 0x05, 0x1c, 0x06, 0x98, 0x85, 0x61, 0x28, 0x1c, 0x01, 0xf0, 0xb3, 0xff, 0x0e, 0x48, 0x00, 0x68, 0x00, 0x28, 0x07, 0xd0, 0x28, 0x68, 0x01, 0x88, 0x40, 0x79, 0x02, 0x31, 0x09, 0x1a, 0x3c, 0x00, 0xd0, 0x7a, 0x00, 0x00, 0x28, 0x1c, 0x01, 0xf0, 0xe5, 0xfc, 0xa2, 0x68, 0x06, 0x98, 0xc0, 0x68, 0x06, 0x99, 0x0b, 0x69, 0x29, 0x1c, 0xf8, 0xf7, 0x7c, 0xfc, 0x03, 0x49, 0x08, 0x69, 0x01, 0x30, 0x08, 0x61, 0x07, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xfc, 0x5a, 0x01, 0x00, 0xcc, 0x5c, 0x01, 0x00, 0x10, 0xb5, 0x09, 0x4a, 0x80, 0x00, 0x12, 0x58, 0xd0, 0x06, 0xc0, 0x0e, 0x01, 0x30, 0x07, 0x4b, 0x3c, 0x00, 0x0c, 0x7b, 0x00, 0x00, 0x1c, 0x68, 0x00, 0x2c, 0xfc, 0xdb, 0x5a, 0x60, 0x20, 0x22, 0x12, 0x1a, 0x91, 0x40, 0x19, 0x60, 0x19, 0x68, 0x00, 0x29, 0xfc, 0xdb, 0x10, 0xbd, 0xe8, 0x60, 0x01, 0x00, 0x30, 0x20, 0x07, 0x00, 0xb0, 0xb5, 0x12, 0x4c, 0x00, 0x25, 0x25, 0x70, 0xa1, 0x68, 0x11, 0x48, 0x07, 0xf0, 0x32, 0xfc, 0x65, 0x61, 0xfb, 0xf7, 0xa3, 0xfe, 0xe0, 0x68, 0x00, 0x28, 0x0d, 0xd0, 0x3c, 0x00, 0x48, 0x7b, 0x00, 0x00, 0xfb, 0xf7, 0xa4, 0xfe, 0x01, 0x21, 0x07, 0x20, 0x0b, 0xf0, 0x70, 0xfd, 0x0a, 0x49, 0x06, 0x20, 0x0a, 0xf0, 0x4c, 0xfc, 0x09, 0x49, 0x05, 0x20, 0x0a, 0xf0, 0x48, 0xfc, 0xa0, 0x68, 0x03, 0xf0, 0x67, 0xfe, 0x00, 0x21, 0xa0, 0x68, 0xfb, 0xf7, 0xcd, 0xfd, 0x05, 0xf0, 0xab, 0xfb, 0xb0, 0xbd, 0x78, 0x69, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0xe1, 0x35, 0x00, 0x00, 0x3c, 0x00, 0x84, 0x7b, 0x00, 0x00, 0xb1, 0x35, 0x00, 0x00, 0x10, 0xb5, 0x0f, 0x4c, 0x20, 0x7c, 0x00, 0x28, 0x19, 0xd1, 0x60, 0x69, 0x00, 0x28, 0x16, 0xd1, 0xe0, 0x68, 0x00, 0x28, 0x06, 0xd0, 0x0a, 0x48, 0x1c, 0x38, 0xc0, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x05, 0xf0, 0xce, 0xfb, 0x01, 0x21, 0x07, 0x20, 0x0b, 0xf0, 0x40, 0xfd, 0xa0, 0x68, 0x03, 0xf0, 0x3f, 0xfe, 0x04, 0x48, 0xa1, 0x68, 0x07, 0xf0, 0x3c, 0x00, 0xc0, 0x7b, 0x00, 0x00, 0xdb, 0xfb, 0x01, 0x20, 0x20, 0x70, 0x10, 0xbd, 0x78, 0x69, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x70, 0xb5, 0x0e, 0x4c, 0x01, 0x22, 0xa3, 0x68, 0xe5, 0x68, 0x26, 0x8a, 0x5d, 0x1b, 0xb5, 0x42, 0x01, 0xd1, 0x00, 0x22, 0x06, 0xe0, 0x25, 0x68, 0x01, 0x33, 0x2e, 0x68, 0xa3, 0x60, 0x26, 0x60, 0x04, 0x35, 0x03, 0xc5, 0x00, 0x2a, 0x04, 0xd1, 0x01, 0x21, 0x9d, 0x20, 0x3c, 0x00, 0xfc, 0x7b, 0x00, 0x00, 0xf9, 0xf7, 0x52, 0xfb, 0x70, 0xbd, 0x03, 0x49, 0x02, 0x20, 0x08, 0x60, 0x70, 0xbd, 0x00, 0x00, 0x44, 0xe3, 0x01, 0x00, 0x40, 0x20, 0x07, 0x00, 0x80, 0xb5, 0x02, 0xf0, 0xb9, 0xf8, 0x80, 0xbd, 0x80, 0xb5, 0x02, 0x21, 0x2d, 0x20, 0xf9, 0xf7, 0x3f, 0xfb, 0x00, 0x20, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x2a, 0x20, 0xf9, 0xf7, 0x37, 0xfb, 0x00, 0x20, 0x3c, 0x00, 0x38, 0x7c, 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x21, 0x2b, 0x20, 0xf9, 0xf7, 0x2f, 0xfb, 0x02, 0x20, 0x80, 0xbd, 0x00, 0x00, 0x01, 0x49, 0x01, 0x20, 0x08, 0x61, 0x70, 0x47, 0x7c, 0x78, 0x01, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x0c, 0x23, 0x0f, 0x1c, 0x17, 0x49, 0x58, 0x43, 0x45, 0x18, 0x6c, 0x68, 0x30, 0x1c, 0x0b, 0xf0, 0x3f, 0xfe, 0x00, 0x2f, 0x09, 0xd1, 0x30, 0x1c, 0x3c, 0x00, 0x74, 0x7c, 0x00, 0x00, 0x03, 0xf0, 0xee, 0xfe, 0x41, 0x20, 0x07, 0x55, 0x11, 0x48, 0x21, 0x1c, 0xff, 0xf7, 0xa6, 0xff, 0xf8, 0xbd, 0x41, 0x20, 0x07, 0x55, 0xa0, 0x6b, 0x00, 0x28, 0x03, 0xd0, 0x20, 0x1c, 0x00, 0xf0, 0xdf, 0xf9, 0xf5, 0xe7, 0x20, 0x1c, 0x00, 0xf0, 0xdb, 0xf9, 0xac, 0x68, 0x00, 0x2c, 0x02, 0xd0, 0x00, 0x20, 0xa8, 0x60, 0xed, 0xe7, 0x30, 0x1c, 0x05, 0xf0, 0x34, 0xf9, 0x3c, 0x00, 0xb0, 0x7c, 0x00, 0x00, 0x04, 0x1c, 0xe8, 0xd1, 0x08, 0x21, 0x0c, 0x20, 0xf9, 0xf7, 0xf4, 0xfa, 0xe3, 0xe7, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0x55, 0x80, 0x00, 0x00, 0x07, 0x4a, 0x80, 0xb5, 0x50, 0x70, 0x51, 0x60, 0x12, 0x78, 0x06, 0x4b, 0x80, 0x00, 0x52, 0x01, 0xd2, 0x18, 0x10, 0x18, 0x40, 0x38, 0x02, 0x68, 0x08, 0x1c, 0xf8, 0xf7, 0x7b, 0xfb, 0x80, 0xbd, 0x78, 0x69, 0x01, 0x00, 0x3c, 0x00, 0xec, 0x7c, 0x00, 0x00, 0xfc, 0x42, 0x01, 0x00, 0xb0, 0xb5, 0x0a, 0x49, 0x04, 0x1c, 0xc8, 0x70, 0x08, 0x4d, 0xe4, 0x35, 0xa8, 0x7a, 0x08, 0x71, 0x08, 0x2c, 0x01, 0xd3, 0xf9, 0xf7, 0xfc, 0xfa, 0xa8, 0x7a, 0x05, 0x49, 0x40, 0x01, 0x40, 0x18, 0xa1, 0x00, 0x40, 0x58, 0xf8, 0xf7, 0x60, 0xfb, 0xb0, 0xbd, 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, 0x80, 0x43, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x28, 0x3c, 0x00, 0x28, 0x7d, 0x00, 0x00, 0x01, 0xd0, 0x09, 0xf0, 0x1d, 0xf9, 0x80, 0xbd, 0xb0, 0xb5, 0x05, 0x1c, 0x0c, 0x1c, 0x00, 0x20, 0x08, 0x60, 0x68, 0x68, 0x09, 0xf0, 0x36, 0xfb, 0x6c, 0x60, 0xb0, 0xbd, 0x10, 0xb5, 0x04, 0x1c, 0x09, 0xf0, 0x34, 0xfb, 0x21, 0x68, 0x00, 0x29, 0x00, 0xd1, 0x64, 0x60, 0x10, 0xbd, 0x00, 0x00, 0x00, 0x21, 0x01, 0x60, 0x40, 0x60, 0x70, 0x47, 0xf8, 0xb5, 0x46, 0x68, 0x3c, 0x00, 0x64, 0x7d, 0x00, 0x00, 0x04, 0x1c, 0x40, 0x6a, 0x35, 0x1c, 0x0a, 0x35, 0x00, 0x28, 0x04, 0xd0, 0x20, 0x1c, 0xf9, 0xf7, 0x89, 0xfd, 0x07, 0x1c, 0x00, 0xe0, 0x04, 0x27, 0x29, 0x1c, 0x60, 0x69, 0x00, 0xf0, 0xf6, 0xfc, 0x79, 0x00, 0x0f, 0x18, 0xba, 0x88, 0xf1, 0x8a, 0x05, 0x1c, 0x8a, 0x42, 0x05, 0xd1, 0x30, 0x88, 0x00, 0x05, 0x02, 0xd5, 0x04, 0xf0, 0xbe, 0xfb, 0x3c, 0xe0, 0x28, 0x68, 0x3c, 0x00, 0xa0, 0x7d, 0x00, 0x00, 0x00, 0x28, 0x0f, 0xd0, 0x01, 0x32, 0x8a, 0x42, 0x04, 0xd1, 0xf9, 0xf7, 0x0f, 0xfc, 0x21, 0x68, 0xc1, 0x60, 0x0b, 0xe0, 0xf9, 0xf7, 0xf0, 0xfb, 0xf0, 0x8a, 0x00, 0x07, 0x04, 0xd0, 0x00, 0x21, 0x29, 0x60, 0x29, 0xe0, 0x08, 0x07, 0x27, 0xd1, 0x20, 0x68, 0x28, 0x60, 0xf0, 0x8a, 0xb8, 0x80, 0x13, 0x48, 0x01, 0x68, 0x01, 0x31, 0x01, 0x60, 0x31, 0x88, 0x49, 0x05, 0x3c, 0x00, 0xdc, 0x7d, 0x00, 0x00, 0x18, 0xd4, 0x29, 0x68, 0x21, 0x60, 0x00, 0x21, 0x29, 0x60, 0xe1, 0x69, 0x00, 0x29, 0x0d, 0xd0, 0x89, 0x79, 0x02, 0x29, 0x0a, 0xd1, 0x08, 0x21, 0x21, 0x86, 0x21, 0x1c, 0x38, 0x31, 0xa1, 0x62, 0x22, 0x1c, 0xdc, 0x30, 0x08, 0x49, 0x02, 0xf0, 0x81, 0xf9, 0xf8, 0xbd, 0x20, 0x1c, 0x00, 0xf0, 0x5f, 0xf8, 0xfa, 0xe7, 0x20, 0x1c, 0xf9, 0xf7, 0xef, 0xfc, 0xf6, 0xe7, 0x3c, 0x00, 0x18, 0x7e, 0x00, 0x00, 0x20, 0x68, 0xf9, 0xf7, 0xbd, 0xfb, 0xf7, 0xe7, 0xc4, 0x69, 0x01, 0x00, 0xb9, 0x71, 0x00, 0x00, 0xf8, 0xb5, 0x0f, 0x1c, 0x09, 0x78, 0x01, 0x24, 0xc9, 0x07, 0x21, 0xd5, 0x02, 0xf0, 0x8c, 0xff, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x24, 0x1b, 0xe0, 0x0e, 0x4e, 0x75, 0x6e, 0x00, 0x2d, 0x17, 0xd0, 0x34, 0x6e, 0x06, 0x22, 0x31, 0x1c, 0x38, 0x1c, 0xf8, 0xf7, 0xd4, 0xfa, 0x3c, 0x00, 0x54, 0x7e, 0x00, 0x00, 0x00, 0x28, 0x05, 0xd1, 0x01, 0x20, 0x00, 0x2c, 0x00, 0xd0, 0x00, 0x20, 0x04, 0x1c, 0x03, 0xe0, 0x01, 0x3d, 0x06, 0x36, 0x00, 0x2d, 0xee, 0xd1, 0x00, 0x2c, 0x03, 0xd1, 0x02, 0x4e, 0xb0, 0x6e, 0x01, 0x30, 0xb0, 0x66, 0x20, 0x1c, 0xf8, 0xbd, 0x10, 0x79, 0x01, 0x00, 0x30, 0xb5, 0x05, 0x1c, 0x00, 0x20, 0x06, 0x49, 0x00, 0x22, 0x1c, 0x23, 0xcc, 0x56, 0xac, 0x42, 0x3c, 0x00, 0x90, 0x7e, 0x00, 0x00, 0x01, 0xd1, 0x08, 0x1c, 0x30, 0xbd, 0x01, 0x32, 0x48, 0x31, 0x01, 0x2a, 0xf5, 0xd3, 0x30, 0xbd, 0xcc, 0x6d, 0x01, 0x00, 0x10, 0xb5, 0x08, 0x4c, 0x00, 0x22, 0x1c, 0x23, 0x53, 0x43, 0xe3, 0x58, 0x83, 0x42, 0x04, 0xd1, 0x1c, 0x20, 0x50, 0x43, 0x00, 0x19, 0x0a, 0x60, 0x10, 0xbd, 0x01, 0x32, 0x0e, 0x2a, 0xf2, 0xd3, 0x00, 0x20, 0x10, 0xbd, 0xdc, 0x71, 0x01, 0x00, 0x3c, 0x00, 0xcc, 0x7e, 0x00, 0x00, 0xf0, 0xb5, 0x41, 0x68, 0x95, 0xb0, 0x07, 0x1c, 0x90, 0x37, 0x13, 0x91, 0x04, 0x1c, 0xf8, 0x78, 0x25, 0x1c, 0x80, 0x35, 0xc6, 0x07, 0x28, 0x79, 0xf6, 0x0f, 0x4a, 0x49, 0x02, 0x28, 0x4d, 0xd1, 0x0a, 0x6d, 0x00, 0x2a, 0x4a, 0xd0, 0x48, 0x68, 0x01, 0x30, 0x48, 0x60, 0x0a, 0xf0, 0x58, 0xff, 0x44, 0x49, 0x08, 0x61, 0x48, 0x61, 0x13, 0x99, 0x09, 0x79, 0xc9, 0x07, 0x3c, 0x00, 0x08, 0x7f, 0x00, 0x00, 0x01, 0xd4, 0x41, 0x49, 0x88, 0x61, 0x20, 0x68, 0x06, 0x22, 0x06, 0x90, 0xa1, 0x68, 0x03, 0xa8, 0xf8, 0xf7, 0xee, 0xfa, 0x06, 0x22, 0x04, 0xa8, 0x02, 0x30, 0xe1, 0x68, 0xf8, 0xf7, 0xe8, 0xfa, 0x07, 0xa8, 0x06, 0x22, 0x21, 0x69, 0xf8, 0xf7, 0xe3, 0xfa, 0xb8, 0x78, 0x08, 0xab, 0x00, 0x21, 0x98, 0x70, 0x0c, 0x96, 0x63, 0x6a, 0x20, 0x1c, 0xa0, 0x30, 0x0a, 0x1c, 0x3c, 0x00, 0x44, 0x7f, 0x00, 0x00, 0x00, 0x2b, 0x02, 0xd0, 0x02, 0x8a, 0x52, 0x07, 0x52, 0x0f, 0x08, 0xab, 0xda, 0x70, 0x00, 0xab, 0x99, 0x84, 0x13, 0x99, 0x09, 0x88, 0xc9, 0x0b, 0xd9, 0x84, 0x69, 0x6b, 0x10, 0xab, 0x10, 0x91, 0xa9, 0x6b, 0x11, 0x91, 0x80, 0x8b, 0x29, 0x49, 0x18, 0x81, 0x09, 0x6d, 0x03, 0xa8, 0xf8, 0xf7, 0x32, 0xfa, 0x29, 0x79, 0x68, 0x6b, 0x0b, 0xf0, 0x4d, 0xfd, 0x29, 0x79, 0x3c, 0x00, 0x80, 0x7f, 0x00, 0x00, 0xa8, 0x6b, 0x0b, 0xf0, 0x67, 0xfd, 0x3d, 0xe0, 0x00, 0x28, 0x38, 0xd1, 0x48, 0x6d, 0x14, 0x90, 0x00, 0x28, 0x34, 0xd0, 0x20, 0x68, 0x06, 0x22, 0x03, 0x90, 0xa1, 0x68, 0x68, 0x46, 0xf8, 0xf7, 0xab, 0xfa, 0x06, 0x22, 0x68, 0x46, 0x80, 0x18, 0xe1, 0x68, 0xf8, 0xf7, 0xa5, 0xfa, 0x05, 0xa8, 0x06, 0x22, 0x21, 0x69, 0xf8, 0xf7, 0xa0, 0xfa, 0x00, 0x21, 0x04, 0x91, 0x3c, 0x00, 0xbc, 0x7f, 0x00, 0x00, 0xb9, 0x78, 0x08, 0xa8, 0x10, 0xab, 0x01, 0x72, 0x08, 0x96, 0xe9, 0x68, 0x0b, 0x91, 0x69, 0x79, 0x41, 0x72, 0x68, 0x6b, 0x0e, 0x90, 0xa8, 0x6b, 0x10, 0x90, 0x28, 0x8d, 0xd8, 0x80, 0x68, 0x8d, 0x18, 0x81, 0xe1, 0x69, 0x0c, 0xa8, 0x00, 0x29, 0x04, 0xd0, 0x89, 0x79, 0x01, 0x70, 0x20, 0x6a, 0x0d, 0x90, 0x01, 0xe0, 0x07, 0x21, 0x01, 0x70, 0x68, 0x46, 0x14, 0x99, 0x3c, 0x00, 0xf8, 0x7f, 0x00, 0x00, 0xf8, 0xf7, 0xef, 0xf9, 0x02, 0xe0, 0x20, 0x68, 0xf9, 0xf7, 0xca, 0xfa, 0x20, 0x1c, 0xf9, 0xf7, 0xf5, 0xfb, 0x15, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0x06, 0x22, 0x01, 0x89, 0x0c, 0x31, 0x01, 0x81, 0x05, 0x68, 0x21, 0x1c, 0x0c, 0x3d, 0x05, 0x60, 0xa8, 0x18, 0xf8, 0xf7, 0x64, 0xfa, 0x06, 0x22, 0xa1, 0x18, 0x3c, 0x00, 0x34, 0x80, 0x00, 0x00, 0x28, 0x1c, 0xf8, 0xf7, 0x5f, 0xfa, 0xa0, 0x8f, 0x00, 0x09, 0xe0, 0x62, 0x20, 0x63, 0x03, 0x48, 0x01, 0x69, 0x20, 0x1c, 0xf8, 0xf7, 0xc7, 0xf9, 0xb0, 0xbd, 0x00, 0x00, 0x7c, 0x79, 0x01, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x60, 0x36, 0x05, 0x1c, 0x70, 0x7a, 0x0c, 0x23, 0x25, 0x49, 0x58, 0x43, 0x44, 0x18, 0xa8, 0x6b, 0x00, 0x27, 0x00, 0x28, 0x06, 0xd0, 0xa0, 0x78, 0x3c, 0x00, 0x70, 0x80, 0x00, 0x00, 0x01, 0x28, 0x03, 0xd1, 0xa7, 0x70, 0x70, 0x7a, 0x0a, 0xf0, 0xb6, 0xfd, 0x2a, 0x1c, 0x0c, 0x21, 0x80, 0x20, 0x0b, 0xf0, 0x95, 0xfb, 0xa8, 0x6b, 0x00, 0x28, 0x33, 0xd0, 0xa0, 0x78, 0x02, 0x28, 0x0b, 0xd0, 0x04, 0x28, 0x22, 0xd1, 0xa7, 0x70, 0x2f, 0x1c, 0x40, 0x37, 0x78, 0x78, 0x02, 0x28, 0x0c, 0xd1, 0x70, 0x7a, 0x0a, 0xf0, 0xa0, 0xfd, 0x18, 0xe0, 0x03, 0x20, 0x3c, 0x00, 0xac, 0x80, 0x00, 0x00, 0xa0, 0x70, 0x12, 0x49, 0x00, 0x20, 0x14, 0x39, 0x09, 0x69, 0xf8, 0xf7, 0x90, 0xf9, 0x0f, 0xe0, 0x2c, 0x1c, 0x07, 0xe0, 0x78, 0x78, 0x41, 0x21, 0x22, 0x1c, 0x08, 0x55, 0x0c, 0x21, 0x80, 0x20, 0x0b, 0xf0, 0x70, 0xfb, 0x60, 0x34, 0x60, 0x7a, 0x04, 0xf0, 0x20, 0xff, 0x04, 0x1c, 0xf1, 0xd1, 0x70, 0x7a, 0x40, 0x35, 0xa9, 0x8b, 0x00, 0x02, 0x09, 0x09, 0x09, 0x04, 0x3c, 0x00, 0xe8, 0x80, 0x00, 0x00, 0x08, 0x43, 0x81, 0x21, 0x01, 0x43, 0x0c, 0x20, 0x0b, 0xf0, 0xa0, 0xfa, 0xf8, 0xbd, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0xf8, 0xb5, 0x1c, 0x49, 0x05, 0x1c, 0x88, 0x6a, 0x01, 0x30, 0x88, 0x62, 0x28, 0x1c, 0x0b, 0xf0, 0x7d, 0xfd, 0x04, 0x1c, 0x11, 0xd0, 0x2b, 0x1c, 0x20, 0x33, 0x1e, 0x1c, 0x5a, 0x79, 0x20, 0x1c, 0xb4, 0x30, 0x19, 0x79, 0x14, 0x4f, 0xfd, 0xf7, 0x3c, 0x00, 0x24, 0x81, 0x00, 0x00, 0x89, 0xf8, 0xaa, 0x7a, 0x20, 0x1c, 0xb8, 0x30, 0xb1, 0x79, 0xfd, 0xf7, 0xb9, 0xf8, 0x00, 0x2f, 0x04, 0xd1, 0x01, 0x21, 0x28, 0x68, 0xfa, 0xf7, 0x6d, 0xfa, 0xf8, 0xbd, 0x60, 0x68, 0xbc, 0x21, 0xc0, 0x8a, 0x08, 0x53, 0x28, 0x68, 0x00, 0x21, 0xfa, 0xf7, 0x64, 0xfa, 0x00, 0x28, 0x09, 0xd0, 0x06, 0x49, 0xc8, 0x6a, 0x01, 0x30, 0xc8, 0x62, 0x00, 0x2c, 0xee, 0xd0, 0x3c, 0x00, 0x60, 0x81, 0x00, 0x00, 0x20, 0x1c, 0xf9, 0xf7, 0x47, 0xfb, 0xea, 0xe7, 0x20, 0x1c, 0xf8, 0xf7, 0x3c, 0xf9, 0xe6, 0xe7, 0xc4, 0x69, 0x01, 0x00, 0xa1, 0xff, 0x00, 0x00, 0xf8, 0xb5, 0x16, 0x4c, 0x05, 0x1f, 0x00, 0x22, 0x21, 0x1c, 0xa0, 0x31, 0x03, 0xe0, 0x28, 0x68, 0xa0, 0x42, 0x09, 0xd0, 0x20, 0x34, 0xa1, 0x42, 0xf9, 0xd1, 0x00, 0x2a, 0x04, 0xd1, 0x02, 0x21, 0x8e, 0x20, 0xf9, 0xf7, 0x3c, 0x00, 0x9c, 0x81, 0x00, 0x00, 0x83, 0xf8, 0xf8, 0xbd, 0x0d, 0x4f, 0xbe, 0x79, 0x60, 0x69, 0x01, 0x30, 0x60, 0x61, 0xf8, 0xf7, 0x97, 0xfd, 0xa8, 0x42, 0x07, 0xd1, 0xa0, 0x88, 0x04, 0x30, 0xf8, 0xf7, 0x97, 0xfd, 0xe0, 0x69, 0x01, 0x30, 0xe0, 0x61, 0x05, 0xe0, 0x20, 0x68, 0x28, 0x60, 0x25, 0x60, 0xa0, 0x69, 0x01, 0x30, 0xa0, 0x61, 0xbe, 0x71, 0xe5, 0xe7, 0x00, 0x00, 0xd0, 0x5c, 0x01, 0x00, 0x3c, 0x00, 0xd8, 0x81, 0x00, 0x00, 0x20, 0x10, 0x07, 0x00, 0x00, 0x29, 0x01, 0xdb, 0x06, 0x29, 0x01, 0xdb, 0x02, 0x20, 0x70, 0x47, 0x06, 0x4b, 0xc9, 0x00, 0x5a, 0x5c, 0xc9, 0x18, 0x02, 0x70, 0x4a, 0x78, 0x42, 0x70, 0x8a, 0x78, 0x82, 0x70, 0x49, 0x68, 0x41, 0x60, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0xcc, 0x5a, 0x01, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x05, 0x28, 0x01, 0xd3, 0xf9, 0xf7, 0x3c, 0x00, 0x14, 0x82, 0x00, 0x00, 0x75, 0xf8, 0x10, 0x48, 0x40, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x03, 0x24, 0x10, 0x2d, 0x00, 0xd3, 0x0f, 0x25, 0x06, 0x20, 0x0b, 0x49, 0x60, 0x43, 0x12, 0x31, 0x40, 0x18, 0x41, 0x78, 0x80, 0x78, 0x49, 0x19, 0x09, 0x06, 0x09, 0x0e, 0x88, 0x42, 0x00, 0xd2, 0x01, 0x1c, 0x01, 0x20, 0x88, 0x40, 0x05, 0x49, 0x01, 0x38, 0x09, 0x68, 0x08, 0x40, 0x00, 0x04, 0x00, 0x0c, 0x3c, 0x00, 0x50, 0x82, 0x00, 0x00, 0x02, 0xf0, 0x44, 0xfe, 0xb0, 0xbd, 0x00, 0x00, 0xd4, 0x7a, 0x01, 0x00, 0x08, 0x20, 0x07, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, 0x09, 0xf0, 0xcf, 0xfd, 0x00, 0x28, 0x03, 0xd1, 0x20, 0x1c, 0x09, 0xf0, 0x82, 0xfd, 0x05, 0x61, 0xb0, 0xbd, 0x80, 0xb5, 0x0a, 0xf0, 0x97, 0xfd, 0x03, 0x4a, 0x0c, 0x32, 0x06, 0xca, 0x89, 0x18, 0x08, 0x1a, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x8c, 0x82, 0x00, 0x00, 0xa0, 0x7d, 0x01, 0x00, 0x70, 0xb5, 0x0b, 0x4c, 0x04, 0x9e, 0x64, 0x68, 0x0d, 0xe0, 0x65, 0x68, 0x85, 0x42, 0x09, 0xd1, 0x20, 0x7a, 0x08, 0x70, 0xe0, 0x68, 0x10, 0x60, 0x20, 0x69, 0x18, 0x60, 0x20, 0x7d, 0x30, 0x80, 0x01, 0x20, 0x70, 0xbd, 0x24, 0x68, 0x00, 0x2c, 0xef, 0xd1, 0x00, 0x20, 0x70, 0xbd, 0x00, 0x00, 0xa4, 0x6e, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x3c, 0x00, 0xc8, 0x82, 0x00, 0x00, 0x20, 0x30, 0x81, 0x7b, 0x20, 0x69, 0x04, 0x30, 0xfd, 0xf7, 0x64, 0xf9, 0x01, 0x1c, 0x62, 0x20, 0x02, 0x5b, 0x63, 0x6a, 0x40, 0x34, 0x20, 0x78, 0x02, 0xf0, 0xce, 0xfd, 0x10, 0xbd, 0x00, 0x00, 0x0b, 0x49, 0x10, 0xb5, 0x08, 0x88, 0x8a, 0x69, 0x0a, 0x23, 0x50, 0x43, 0x58, 0x43, 0x0e, 0xd0, 0x08, 0x4a, 0x53, 0x89, 0x94, 0x88, 0xd2, 0x88, 0x1b, 0x19, 0x52, 0x04, 0x3c, 0x00, 0x04, 0x83, 0x00, 0x00, 0x52, 0x0c, 0x9a, 0x18, 0xc9, 0x68, 0x06, 0x32, 0x4a, 0x43, 0x0a, 0x21, 0x51, 0x43, 0xf8, 0xf7, 0xfd, 0xf9, 0x10, 0xbd, 0xc8, 0x74, 0x01, 0x00, 0x30, 0x00, 0x07, 0x00, 0x10, 0xb5, 0x43, 0x1c, 0x01, 0xd1, 0x10, 0x48, 0x10, 0xbd, 0x0f, 0x4a, 0x0e, 0x4b, 0x94, 0x3a, 0x12, 0x68, 0x44, 0x3b, 0x1b, 0x7a, 0x10, 0xe0, 0x54, 0x68, 0x84, 0x42, 0x0c, 0xd1, 0x00, 0x29, 0x3c, 0x00, 0x40, 0x83, 0x00, 0x00, 0x0f, 0xd1, 0x02, 0x2b, 0x03, 0xd1, 0xd4, 0x7b, 0x02, 0x2c, 0x0a, 0xd2, 0x04, 0xe0, 0x00, 0x2b, 0x05, 0xd1, 0xd4, 0x7b, 0xe4, 0x07, 0x04, 0xd4, 0x12, 0x68, 0x00, 0x2a, 0xec, 0xd1, 0x00, 0x20, 0x10, 0xbd, 0x10, 0x1c, 0x10, 0xbd, 0x00, 0x00, 0x38, 0x6f, 0x01, 0x00, 0x01, 0x1c, 0x01, 0x20, 0x01, 0x29, 0x00, 0xd0, 0x00, 0x20, 0x70, 0x47, 0x00, 0xb5, 0x02, 0x1c, 0x3c, 0x00, 0x7c, 0x83, 0x00, 0x00, 0xfd, 0xf7, 0xce, 0xf8, 0x00, 0x28, 0x08, 0xd0, 0x10, 0x1c, 0xff, 0xf7, 0xf1, 0xff, 0x18, 0x23, 0x03, 0x49, 0x58, 0x43, 0x40, 0x18, 0x00, 0x69, 0x00, 0xbd, 0x00, 0x20, 0x00, 0xbd, 0x00, 0x00, 0x94, 0x67, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x28, 0x00, 0xd1, 0x08, 0x48, 0x07, 0x49, 0x00, 0x68, 0x50, 0x31, 0x09, 0x7a, 0x00, 0x29, 0x02, 0xd0, 0x02, 0x29, 0x04, 0xd1, 0x3c, 0x00, 0xb8, 0x83, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x21, 0x00, 0xf0, 0x06, 0xf8, 0x80, 0xbd, 0x00, 0x20, 0x80, 0xbd, 0x00, 0x00, 0xa4, 0x6e, 0x01, 0x00, 0x12, 0x4a, 0x12, 0x4b, 0x12, 0x7a, 0x2c, 0x3b, 0x00, 0x2a, 0x03, 0xd1, 0x5a, 0x68, 0x00, 0x2a, 0x18, 0xd1, 0x04, 0xe0, 0x02, 0x2a, 0x02, 0xd1, 0x9a, 0x68, 0x00, 0x2a, 0x12, 0xd1, 0x00, 0x20, 0x70, 0x47, 0xc2, 0x7b, 0x8a, 0x42, 0x01, 0xd0, 0x3c, 0x00, 0xf4, 0x83, 0x00, 0x00, 0x03, 0x2a, 0x0a, 0xd1, 0x82, 0x7e, 0x01, 0x2a, 0x07, 0xd1, 0x02, 0x7f, 0x01, 0x32, 0x12, 0x06, 0x12, 0x0e, 0x02, 0x77, 0xc3, 0x7e, 0x9a, 0x42, 0xee, 0xd2, 0x00, 0x68, 0x00, 0x28, 0xec, 0xd1, 0x70, 0x47, 0x00, 0x00, 0xf4, 0x6e, 0x01, 0x00, 0xf7, 0xb5, 0x84, 0x46, 0x00, 0x20, 0x01, 0x27, 0x00, 0x24, 0x00, 0x25, 0x88, 0xb0, 0x07, 0xe0, 0x62, 0x46, 0x52, 0x5d, 0x3c, 0x00, 0x30, 0x84, 0x00, 0x00, 0x00, 0x2a, 0x05, 0xd0, 0xab, 0x00, 0x6e, 0x46, 0xf2, 0x50, 0x01, 0x35, 0x8d, 0x42, 0xf5, 0xd3, 0x00, 0x2d, 0x00, 0xd0, 0x01, 0x20, 0x00, 0x28, 0x28, 0xd0, 0x00, 0x27, 0x16, 0x4c, 0x6e, 0x46, 0x22, 0xe0, 0x20, 0x1c, 0x00, 0xf0, 0x30, 0xf8, 0x01, 0x28, 0x01, 0xd0, 0x07, 0x28, 0x06, 0xd1, 0x00, 0x21, 0x20, 0x1c, 0x00, 0xf0, 0x34, 0xf8, 0x31, 0x68, 0x88, 0x42, 0x3c, 0x00, 0x6c, 0x84, 0x00, 0x00, 0x01, 0xd2, 0x02, 0x27, 0x14, 0xe0, 0x20, 0x68, 0xc9, 0x00, 0x0c, 0x18, 0x08, 0x3c, 0x20, 0x1c, 0x00, 0xf0, 0x1c, 0xf8, 0x07, 0x28, 0x07, 0xd1, 0x01, 0x20, 0x01, 0x2d, 0x00, 0xd0, 0x00, 0x20, 0x24, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x08, 0x34, 0x01, 0x3d, 0x04, 0x36, 0x00, 0x2d, 0xda, 0xd1, 0x0a, 0x98, 0x04, 0x60, 0x0b, 0xb0, 0x38, 0x1c, 0xf0, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0x84, 0x00, 0x00, 0x20, 0x52, 0x01, 0x00, 0x00, 0x68, 0x00, 0x29, 0x01, 0xd0, 0x80, 0x02, 0x80, 0x0a, 0x70, 0x47, 0x10, 0xb5, 0x40, 0x68, 0x80, 0x00, 0x44, 0x0f, 0x08, 0x2c, 0x03, 0xd3, 0x02, 0x21, 0x87, 0x20, 0xf8, 0xf7, 0xec, 0xfe, 0x20, 0x1c, 0x10, 0xbd, 0x00, 0x29, 0x02, 0xd0, 0x00, 0x68, 0x80, 0x0d, 0x70, 0x47, 0x40, 0x68, 0x80, 0x05, 0x80, 0x0d, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0x84, 0x00, 0x00, 0x10, 0xb5, 0x40, 0x68, 0x40, 0x01, 0x44, 0x0f, 0x05, 0x2c, 0x03, 0xd3, 0x05, 0x21, 0x87, 0x20, 0xf8, 0xf7, 0xd6, 0xfe, 0x20, 0x1c, 0x10, 0xbd, 0xf8, 0xb5, 0x05, 0x1c, 0x88, 0x0a, 0x00, 0x90, 0x1c, 0x48, 0x8e, 0x05, 0xc0, 0x69, 0xb6, 0x0d, 0x17, 0x1c, 0x1c, 0x1c, 0x00, 0x28, 0x05, 0xd1, 0x18, 0x48, 0x81, 0x69, 0x8d, 0x42, 0x1d, 0xd0, 0x85, 0x61, 0x11, 0xe0, 0x3c, 0x00, 0x20, 0x85, 0x00, 0x00, 0xfd, 0xf7, 0xe8, 0xf8, 0x15, 0x49, 0x09, 0x78, 0x0e, 0x29, 0x07, 0xd1, 0x00, 0x28, 0x05, 0xd0, 0x11, 0x49, 0x50, 0x31, 0x06, 0x23, 0xc9, 0x56, 0xf9, 0xf7, 0x06, 0xfa, 0x0e, 0x49, 0x00, 0x20, 0xc8, 0x61, 0x8d, 0x61, 0x29, 0x1c, 0x20, 0x1c, 0xf8, 0xf7, 0xe2, 0xf8, 0x79, 0x43, 0x20, 0x1c, 0xf8, 0xf7, 0xde, 0xf8, 0x08, 0x48, 0x41, 0x61, 0x20, 0x1c, 0x00, 0x99, 0x3c, 0x00, 0x5c, 0x85, 0x00, 0x00, 0xf8, 0xf7, 0xd8, 0xf8, 0x05, 0x48, 0x40, 0x69, 0x0a, 0x18, 0xa2, 0x42, 0x01, 0xd2, 0x40, 0x18, 0x01, 0xe0, 0x40, 0x18, 0x00, 0x1b, 0x80, 0x02, 0x80, 0x19, 0xf8, 0xbd, 0xac, 0x7c, 0x01, 0x00, 0x11, 0x67, 0x01, 0x00, 0xf8, 0xb5, 0x0f, 0x1c, 0x06, 0x1c, 0x14, 0x1c, 0x1d, 0x1c, 0x07, 0xf0, 0xa1, 0xfc, 0x0e, 0x28, 0x09, 0xd1, 0x20, 0x1c, 0x02, 0xf0, 0xfc, 0xfb, 0x3c, 0x00, 0x98, 0x85, 0x00, 0x00, 0x00, 0x28, 0x04, 0xd0, 0x08, 0x48, 0x00, 0x78, 0x02, 0xf0, 0xe4, 0xfb, 0x04, 0x1c, 0x01, 0x21, 0x00, 0x2e, 0xac, 0x72, 0x00, 0xd0, 0x39, 0x1c, 0x20, 0x1c, 0x02, 0xf0, 0x07, 0xfc, 0x28, 0x60, 0x00, 0x20, 0x28, 0x72, 0x6c, 0x72, 0xf8, 0xbd, 0x90, 0x57, 0x01, 0x00, 0x03, 0x1c, 0x0a, 0x48, 0x10, 0xb5, 0x00, 0x24, 0x02, 0x1c, 0xa0, 0x32, 0x03, 0xe0, 0x81, 0x88, 0x3c, 0x00, 0xd4, 0x85, 0x00, 0x00, 0x99, 0x42, 0x09, 0xd2, 0x20, 0x30, 0x82, 0x42, 0xf9, 0xd1, 0x00, 0x2c, 0x04, 0xd1, 0x02, 0x21, 0x8e, 0x20, 0xf8, 0xf7, 0x5d, 0xfe, 0x00, 0x20, 0x10, 0xbd, 0x00, 0x00, 0xd0, 0x5c, 0x01, 0x00, 0xff, 0xb5, 0x06, 0x1c, 0x00, 0x20, 0x81, 0xb0, 0x10, 0x60, 0x1f, 0x1c, 0x01, 0x25, 0x14, 0x1c, 0x30, 0x1c, 0xff, 0xf7, 0x6d, 0xff, 0x05, 0x28, 0x12, 0xd2, 0x02, 0xa3, 0x3c, 0x00, 0x10, 0x86, 0x00, 0x00, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x08, 0x00, 0x39, 0x1c, 0x30, 0x1c, 0xff, 0xf7, 0x55, 0xff, 0x03, 0xe0, 0x02, 0x98, 0xf8, 0xf7, 0xeb, 0xf8, 0x01, 0x30, 0x20, 0x60, 0x04, 0xe0, 0x05, 0x21, 0x87, 0x20, 0xf8, 0xf7, 0x34, 0xfe, 0x00, 0x25, 0x20, 0x68, 0x80, 0x28, 0x04, 0xd9, 0x06, 0x21, 0x87, 0x20, 0xf8, 0xf7, 0x2c, 0xfe, 0x3c, 0x00, 0x4c, 0x86, 0x00, 0x00, 0x00, 0x25, 0x28, 0x1c, 0x05, 0xb0, 0xf0, 0xbd, 0x70, 0xb5, 0x17, 0x4c, 0x60, 0x6c, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x20, 0x1d, 0xe0, 0x16, 0x4e, 0x14, 0x4d, 0x31, 0x88, 0xa0, 0x6c, 0x00, 0x28, 0x08, 0xd0, 0x28, 0x78, 0x81, 0x42, 0x05, 0xd9, 0xf8, 0xf7, 0x4c, 0xf8, 0x01, 0x38, 0xfa, 0xf7, 0x51, 0xfe, 0x0e, 0xe0, 0xe0, 0x6c, 0x00, 0x28, 0x0a, 0xd0, 0x00, 0x20, 0x3c, 0x00, 0x88, 0x86, 0x00, 0x00, 0xfa, 0xf7, 0x4a, 0xfe, 0x29, 0x78, 0x32, 0x88, 0x91, 0x42, 0x04, 0xd9, 0x90, 0x42, 0x02, 0xd9, 0x10, 0x1c, 0x00, 0xe0, 0x08, 0x1c, 0xfa, 0xf7, 0xdf, 0xfd, 0xe1, 0x6b, 0x44, 0x1a, 0x0a, 0xf0, 0x81, 0xfb, 0x20, 0x1a, 0x00, 0xd5, 0x00, 0x20, 0x70, 0xbd, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0xf8, 0x60, 0x01, 0x00, 0xfc, 0x60, 0x01, 0x00, 0xff, 0xb5, 0x27, 0x4e, 0x3c, 0x00, 0xc4, 0x86, 0x00, 0x00, 0x04, 0x1c, 0xb0, 0x79, 0x0f, 0x1c, 0x15, 0x1c, 0x81, 0xb0, 0x00, 0x90, 0x0a, 0xf0, 0x6c, 0xfb, 0xc1, 0x19, 0x23, 0x48, 0x07, 0x68, 0x00, 0x2f, 0x05, 0xd1, 0x0a, 0x21, 0x80, 0x20, 0xf8, 0xf7, 0xdf, 0xfd, 0x05, 0xb0, 0xf0, 0xbd, 0x1e, 0x48, 0x40, 0x68, 0x84, 0x46, 0x00, 0x28, 0x01, 0xd1, 0x00, 0x22, 0x0e, 0xe0, 0x82, 0x68, 0x03, 0x68, 0xab, 0x42, 0x07, 0xd1, 0x3c, 0x00, 0x00, 0x87, 0x00, 0x00, 0x03, 0x79, 0xa3, 0x42, 0x04, 0xd1, 0x0b, 0x21, 0x80, 0x20, 0xf8, 0xf7, 0xcb, 0xfd, 0x23, 0xe0, 0xc0, 0x68, 0x00, 0x28, 0xf1, 0xd1, 0x13, 0x4b, 0xf8, 0x68, 0x18, 0x60, 0x3d, 0x60, 0x3c, 0x71, 0xb9, 0x60, 0x04, 0x98, 0x8d, 0x1a, 0x38, 0x61, 0x60, 0x46, 0x00, 0x23, 0x05, 0xe0, 0x84, 0x68, 0xa4, 0x1a, 0xac, 0x42, 0x03, 0xda, 0x03, 0x1c, 0xc0, 0x68, 0x00, 0x28, 0x3c, 0x00, 0x3c, 0x87, 0x00, 0x00, 0xf7, 0xd1, 0xf8, 0x60, 0x00, 0x2b, 0x08, 0xd1, 0x07, 0x48, 0x3b, 0x1c, 0x47, 0x60, 0x08, 0x48, 0x06, 0x4a, 0x00, 0x88, 0x0a, 0xf0, 0x8a, 0xfb, 0x00, 0xe0, 0xdf, 0x60, 0x00, 0x98, 0xb0, 0x71, 0xc3, 0xe7, 0x00, 0x00, 0x20, 0x10, 0x07, 0x00, 0x7c, 0x5d, 0x01, 0x00, 0x21, 0x38, 0x01, 0x00, 0x2c, 0x74, 0x01, 0x00, 0xf3, 0xb5, 0x83, 0xb0, 0x04, 0x1c, 0x09, 0xd0, 0x3c, 0x00, 0x78, 0x87, 0x00, 0x00, 0x20, 0x1c, 0x04, 0x99, 0x09, 0xf0, 0x8e, 0xfb, 0x00, 0x28, 0x03, 0xd0, 0x20, 0x1c, 0x30, 0x30, 0x05, 0xb0, 0xf0, 0xbd, 0x0a, 0xf0, 0x0e, 0xfb, 0x1e, 0x4a, 0x00, 0x26, 0x04, 0x9f, 0x01, 0x96, 0x00, 0x90, 0x02, 0x92, 0x02, 0x9c, 0x00, 0x25, 0x39, 0x1c, 0x20, 0x1c, 0x14, 0x30, 0x02, 0xf0, 0xc5, 0xfa, 0x00, 0x28, 0x01, 0xd0, 0x26, 0x1c, 0x03, 0xe0, 0x01, 0x35, 0x3c, 0x00, 0xb4, 0x87, 0x00, 0x00, 0x1c, 0x34, 0x04, 0x2d, 0xf2, 0xd3, 0x00, 0x2e, 0x22, 0xd1, 0x01, 0x98, 0x13, 0x4f, 0x01, 0x30, 0x01, 0x90, 0x02, 0x28, 0xe8, 0xd3, 0x01, 0x21, 0xc9, 0x06, 0x02, 0x9a, 0x00, 0x20, 0x13, 0x69, 0x00, 0x9c, 0xe3, 0x1a, 0x8b, 0x42, 0x01, 0xdd, 0x19, 0x1c, 0x16, 0x1c, 0x01, 0x30, 0x1c, 0x32, 0x04, 0x28, 0xf4, 0xd3, 0x30, 0x68, 0x00, 0x28, 0x01, 0xd0, 0xf8, 0xf7, 0x3c, 0x00, 0xf0, 0x87, 0x00, 0x00, 0xd3, 0xfe, 0x30, 0x1c, 0xfd, 0xf7, 0x4a, 0xff, 0x30, 0x1c, 0x14, 0x30, 0x06, 0x22, 0x04, 0x99, 0xf7, 0xf7, 0x7a, 0xfe, 0x00, 0x9c, 0x30, 0x1c, 0x34, 0x61, 0xbd, 0xe7, 0x30, 0x6a, 0x01, 0x00, 0x34, 0x42, 0x01, 0x00, 0x09, 0x49, 0x10, 0xb5, 0x4c, 0x69, 0x03, 0xe0, 0xe1, 0x68, 0x81, 0x42, 0x03, 0xd0, 0x24, 0x68, 0x00, 0x2c, 0xf9, 0xd1, 0x01, 0xe0, 0x00, 0x2c, 0x3c, 0x00, 0x2c, 0x88, 0x00, 0x00, 0x03, 0xd1, 0x02, 0x21, 0x02, 0x20, 0xf8, 0xf7, 0x37, 0xfd, 0x20, 0x1c, 0x10, 0xbd, 0x00, 0x00, 0xfc, 0x5a, 0x01, 0x00, 0x10, 0xb5, 0xc3, 0x07, 0x06, 0xd5, 0x08, 0x4b, 0x5c, 0x69, 0x0c, 0x43, 0x5c, 0x61, 0x1c, 0x7e, 0x14, 0x43, 0x1c, 0x76, 0x80, 0x07, 0x06, 0xd5, 0x04, 0x48, 0x43, 0x69, 0x19, 0x43, 0x41, 0x61, 0x01, 0x7e, 0x11, 0x43, 0x01, 0x76, 0x10, 0xbd, 0x3c, 0x00, 0x68, 0x88, 0x00, 0x00, 0xfc, 0x57, 0x01, 0x00, 0x18, 0x58, 0x01, 0x00, 0x70, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x16, 0x1c, 0x00, 0xf0, 0x08, 0xf8, 0xa0, 0x07, 0xc0, 0x17, 0x01, 0x30, 0x32, 0x1c, 0x29, 0x1c, 0x00, 0xf0, 0x21, 0xf8, 0x70, 0xbd, 0x10, 0xb5, 0xc3, 0x07, 0x06, 0xd5, 0x08, 0x4b, 0x5c, 0x69, 0x8c, 0x43, 0x5c, 0x61, 0x1c, 0x7e, 0x94, 0x43, 0x1c, 0x76, 0x80, 0x07, 0x06, 0xd5, 0x3c, 0x00, 0xa4, 0x88, 0x00, 0x00, 0x04, 0x48, 0x43, 0x69, 0x8b, 0x43, 0x43, 0x61, 0x01, 0x7e, 0x91, 0x43, 0x01, 0x76, 0x10, 0xbd, 0xfc, 0x57, 0x01, 0x00, 0x18, 0x58, 0x01, 0x00, 0x03, 0x22, 0x11, 0x1f, 0x80, 0xb5, 0x01, 0x20, 0x00, 0xf0, 0x02, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x30, 0xb5, 0x15, 0x1c, 0x0c, 0x1c, 0x00, 0x28, 0x87, 0xb0, 0x02, 0xd0, 0x1c, 0x22, 0x22, 0x49, 0x01, 0xe0, 0x22, 0x49, 0x3c, 0x00, 0xe0, 0x88, 0x00, 0x00, 0x1c, 0x22, 0x68, 0x46, 0xf7, 0xf7, 0x64, 0xfe, 0x05, 0x99, 0x00, 0xab, 0x1a, 0x7e, 0x8c, 0x43, 0x20, 0x1c, 0x95, 0x43, 0x02, 0x9a, 0x29, 0x1c, 0x02, 0x40, 0x02, 0x92, 0x01, 0x9a, 0x02, 0x40, 0x01, 0x92, 0x00, 0x9a, 0x02, 0x40, 0x00, 0x92, 0x03, 0x9a, 0x02, 0x40, 0x03, 0x92, 0x98, 0x7c, 0x08, 0x40, 0x98, 0x74, 0x58, 0x7c, 0x08, 0x40, 0x58, 0x74, 0x18, 0x7c, 0x3c, 0x00, 0x1c, 0x89, 0x00, 0x00, 0x08, 0x40, 0x18, 0x74, 0xd8, 0x7c, 0x08, 0x40, 0xd8, 0x74, 0x02, 0x99, 0x10, 0x48, 0x41, 0x61, 0x01, 0xaa, 0x06, 0xca, 0x91, 0x43, 0x81, 0x61, 0x81, 0x68, 0x01, 0x9a, 0x11, 0x43, 0x81, 0x60, 0x81, 0x68, 0x00, 0x9a, 0x91, 0x43, 0x81, 0x60, 0x00, 0xaa, 0x06, 0xca, 0x11, 0x43, 0x42, 0x68, 0x11, 0x43, 0x41, 0x60, 0x41, 0x68, 0x03, 0x9a, 0x91, 0x43, 0x41, 0x60, 0x3c, 0x00, 0x58, 0x89, 0x00, 0x00, 0x04, 0xa8, 0x0b, 0xf0, 0x01, 0xf8, 0x07, 0xb0, 0x30, 0xbd, 0x00, 0x00, 0xfc, 0x57, 0x01, 0x00, 0x18, 0x58, 0x01, 0x00, 0x10, 0x00, 0x07, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x01, 0x1c, 0x01, 0x20, 0x08, 0xf0, 0xe0, 0xf9, 0x00, 0x2c, 0x02, 0xd0, 0x03, 0xf0, 0x1c, 0xff, 0x10, 0xbd, 0xfe, 0xf7, 0xd1, 0xfc, 0x10, 0xbd, 0xf0, 0xb5, 0x0c, 0x1c, 0x01, 0x0e, 0x01, 0x23, 0x3c, 0x00, 0x94, 0x89, 0x00, 0x00, 0x1b, 0x06, 0x09, 0x06, 0x99, 0x42, 0x9f, 0xb0, 0x28, 0xd1, 0x17, 0x49, 0x08, 0x40, 0x00, 0x21, 0x1a, 0x28, 0x00, 0xd3, 0x02, 0x21, 0x00, 0x29, 0x19, 0xd1, 0xc5, 0x00, 0x13, 0x4f, 0x10, 0xa8, 0xee, 0x19, 0xb2, 0x88, 0x21, 0x68, 0xf7, 0xf7, 0x9d, 0xfd, 0x20, 0x1c, 0xf8, 0xf7, 0xea, 0xfd, 0x7a, 0x59, 0x01, 0xa9, 0x10, 0xa8, 0xf7, 0xf7, 0x07, 0xfd, 0x00, 0x28, 0x3c, 0x00, 0xd0, 0x89, 0x00, 0x00, 0x05, 0xd0, 0x10, 0x98, 0x01, 0xa9, 0x01, 0x90, 0xb0, 0x79, 0x00, 0xf0, 0x9d, 0xf8, 0x1f, 0xb0, 0xf0, 0xbd, 0x2a, 0x20, 0xf8, 0xf7, 0x5e, 0xfc, 0x20, 0x1c, 0xf8, 0xf7, 0xd5, 0xfd, 0xf6, 0xe7, 0x03, 0x21, 0x2a, 0x20, 0xf8, 0xf7, 0x56, 0xfc, 0xf1, 0xe7, 0x00, 0x00, 0x7f, 0xff, 0xff, 0x00, 0x24, 0x45, 0x01, 0x00, 0x10, 0xb5, 0x0c, 0x1c, 0x80, 0x28, 0x02, 0xd0, 0x3c, 0x00, 0x0c, 0x8a, 0x00, 0x00, 0x81, 0x28, 0x08, 0xd1, 0x03, 0xe0, 0x20, 0x1c, 0x00, 0xf0, 0x06, 0xf9, 0x10, 0xbd, 0x20, 0x1c, 0xf8, 0xf7, 0xbc, 0xfd, 0x10, 0xbd, 0x03, 0x21, 0x2c, 0x20, 0xf8, 0xf7, 0x3d, 0xfc, 0xf6, 0xe7, 0xf0, 0xb5, 0x0c, 0x1c, 0x00, 0x21, 0x8b, 0xb0, 0x0a, 0x91, 0x01, 0x0e, 0x01, 0x23, 0x1b, 0x06, 0x09, 0x06, 0x99, 0x42, 0x2a, 0xd1, 0x18, 0x49, 0x08, 0x40, 0x06, 0x1c, 0x3c, 0x00, 0x48, 0x8a, 0x00, 0x00, 0x06, 0x2e, 0x01, 0xd3, 0x07, 0x21, 0x24, 0xe0, 0x20, 0x89, 0xf8, 0xf7, 0xf1, 0xfe, 0x22, 0x89, 0x21, 0x68, 0x05, 0x1c, 0xf7, 0xf7, 0x4c, 0xfd, 0x20, 0x1c, 0xf8, 0xf7, 0x99, 0xfd, 0xf4, 0x00, 0x0f, 0x4e, 0x28, 0x1c, 0x0a, 0xaa, 0x69, 0x46, 0x33, 0x59, 0xf7, 0xf7, 0xb4, 0xfc, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x28, 0x07, 0xd1, 0x28, 0x68, 0x69, 0x46, 0x00, 0x90, 0x3c, 0x00, 0x84, 0x8a, 0x00, 0x00, 0xa0, 0x19, 0x00, 0x79, 0x0a, 0x9a, 0x00, 0xf0, 0x09, 0xf9, 0x28, 0x1c, 0xf8, 0xf7, 0xb0, 0xfe, 0x0b, 0xb0, 0xf0, 0xbd, 0x01, 0x21, 0x2b, 0x20, 0xf8, 0xf7, 0x02, 0xfc, 0xf8, 0xe7, 0x00, 0x00, 0x7f, 0xff, 0xff, 0x00, 0x28, 0x46, 0x01, 0x00, 0x0a, 0x1c, 0x01, 0x0e, 0x01, 0x23, 0x1b, 0x06, 0x09, 0x06, 0x99, 0x42, 0x80, 0xb5, 0x08, 0xd0, 0x5b, 0x00, 0x99, 0x42, 0x3c, 0x00, 0xc0, 0x8a, 0x00, 0x00, 0x0b, 0xd1, 0x00, 0x06, 0x00, 0x0e, 0x11, 0x1c, 0x00, 0xf0, 0x0e, 0xf9, 0x80, 0xbd, 0x05, 0x49, 0x01, 0x40, 0x10, 0x1c, 0x05, 0xf0, 0xa2, 0xf9, 0x80, 0xbd, 0x01, 0x21, 0x2d, 0x20, 0xf8, 0xf7, 0xe1, 0xfb, 0x80, 0xbd, 0x7f, 0xff, 0xff, 0x00, 0x80, 0xb5, 0x01, 0x1c, 0x0f, 0x20, 0x00, 0xf0, 0x13, 0xf8, 0x80, 0xbd, 0x80, 0xb5, 0x01, 0x1c, 0x04, 0x20, 0x00, 0xf0, 0x3c, 0x00, 0xfc, 0x8a, 0x00, 0x00, 0x0d, 0xf8, 0x80, 0xbd, 0x80, 0xb5, 0x01, 0x1c, 0x17, 0x20, 0x00, 0xf0, 0x07, 0xf8, 0x80, 0xbd, 0x80, 0xb5, 0x01, 0x1c, 0x01, 0x20, 0x00, 0xf0, 0x01, 0xf8, 0x80, 0xbd, 0xf8, 0xb5, 0x04, 0x1c, 0x06, 0x1c, 0x80, 0x20, 0x84, 0x43, 0x0f, 0x1c, 0x19, 0x2c, 0x01, 0xd3, 0xf8, 0xf7, 0xea, 0xfb, 0x08, 0x48, 0x04, 0x5d, 0x21, 0x1c, 0x00, 0x20, 0xf8, 0xf7, 0x50, 0xfd, 0x3c, 0x00, 0x38, 0x8b, 0x00, 0x00, 0x05, 0x1c, 0x22, 0x1c, 0x39, 0x1c, 0x00, 0x68, 0xf7, 0xf7, 0xda, 0xfc, 0x2a, 0x1c, 0x31, 0x1c, 0x07, 0x20, 0xf8, 0xf7, 0x11, 0xf9, 0xf8, 0xbd, 0xf4, 0x45, 0x01, 0x00, 0xf8, 0xb5, 0x0d, 0x1c, 0x16, 0x1c, 0x04, 0x1c, 0x1f, 0x1c, 0x08, 0x21, 0x00, 0x20, 0xf8, 0xf7, 0x39, 0xfd, 0x14, 0x22, 0x01, 0x68, 0x0e, 0x4b, 0x72, 0x43, 0xd2, 0x18, 0x0c, 0x71, 0x12, 0x7c, 0x3c, 0x00, 0x74, 0x8b, 0x00, 0x00, 0x4a, 0x71, 0x0d, 0x60, 0x0b, 0x4a, 0x8f, 0x71, 0x12, 0x68, 0x7f, 0x2a, 0x03, 0xd9, 0x52, 0x05, 0x52, 0x0e, 0x80, 0x23, 0x1a, 0x43, 0xca, 0x71, 0x07, 0x4a, 0x00, 0x23, 0x51, 0x68, 0x01, 0x31, 0x51, 0x60, 0x02, 0x1c, 0x81, 0x21, 0x00, 0x20, 0xf8, 0xf7, 0x08, 0xf9, 0xf8, 0xbd, 0x00, 0x00, 0x74, 0x40, 0x01, 0x00, 0xfc, 0x5a, 0x01, 0x00, 0x80, 0x6e, 0x01, 0x00, 0x3c, 0x00, 0xb0, 0x8b, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x08, 0x21, 0x00, 0x20, 0xf8, 0xf7, 0x0e, 0xfd, 0x21, 0x8b, 0xe2, 0x7d, 0x05, 0x1c, 0x09, 0x05, 0x52, 0x07, 0x52, 0x0f, 0x49, 0x0c, 0x00, 0x68, 0x11, 0x43, 0x81, 0x80, 0xa1, 0x7d, 0x14, 0x23, 0x0e, 0x4a, 0x59, 0x43, 0x89, 0x18, 0x09, 0x7c, 0xc1, 0x71, 0xe1, 0x6a, 0x01, 0x60, 0xe1, 0x68, 0x28, 0x1c, 0xf8, 0xf7, 0x17, 0xfc, 0x0a, 0x48, 0x3c, 0x00, 0xec, 0x8b, 0x00, 0x00, 0x00, 0x68, 0x00, 0x28, 0x01, 0xd0, 0xf7, 0xf7, 0xf1, 0xfb, 0x07, 0x49, 0x04, 0x31, 0x88, 0x68, 0x01, 0x30, 0x88, 0x60, 0x00, 0x21, 0x2a, 0x1c, 0x00, 0x20, 0x23, 0x6b, 0xf8, 0xf7, 0xd2, 0xf8, 0x01, 0x20, 0xb0, 0xbd, 0x74, 0x40, 0x01, 0x00, 0x7c, 0x6e, 0x01, 0x00, 0x01, 0x48, 0x80, 0x68, 0x70, 0x47, 0x00, 0x00, 0x80, 0x6e, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x3c, 0x00, 0x28, 0x8c, 0x00, 0x00, 0x92, 0xb0, 0x01, 0x68, 0x68, 0x46, 0x08, 0x22, 0xf7, 0xf7, 0x62, 0xfc, 0x00, 0xab, 0x98, 0x88, 0x40, 0x07, 0x40, 0x0f, 0xd8, 0x77, 0x98, 0x88, 0x40, 0x04, 0x00, 0x0d, 0x18, 0x84, 0xd8, 0x88, 0x58, 0x84, 0x00, 0x98, 0x0d, 0x90, 0x05, 0x94, 0x20, 0x89, 0x08, 0x38, 0x20, 0x81, 0x05, 0x98, 0x01, 0x68, 0x08, 0x31, 0x01, 0x60, 0x00, 0x20, 0x0a, 0x90, 0x0c, 0x90, 0x3c, 0x00, 0x64, 0x8c, 0x00, 0x00, 0x00, 0x21, 0x11, 0x20, 0x09, 0xf0, 0x78, 0xfb, 0x05, 0x49, 0x06, 0x4a, 0x08, 0x68, 0x01, 0x30, 0x08, 0x60, 0x02, 0x21, 0x02, 0xa8, 0x01, 0xf0, 0xcd, 0xfc, 0x12, 0xb0, 0x10, 0xbd, 0x00, 0x00, 0x80, 0x6e, 0x01, 0x00, 0x55, 0x8b, 0x00, 0x00, 0x02, 0x1c, 0x01, 0x20, 0x00, 0x06, 0x08, 0x43, 0x80, 0xb5, 0x2b, 0x21, 0x0a, 0xf0, 0x8a, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0xa0, 0x8c, 0x00, 0x00, 0xf7, 0xb5, 0x04, 0x1c, 0x06, 0x1c, 0x80, 0x20, 0x84, 0x43, 0x17, 0x1c, 0x06, 0x2c, 0x01, 0xd3, 0xf8, 0xf7, 0x26, 0xfb, 0x0b, 0x48, 0x05, 0x5d, 0x29, 0x1c, 0x00, 0x20, 0xf8, 0xf7, 0x8c, 0xfc, 0x04, 0x1c, 0x00, 0x68, 0x01, 0x99, 0x2a, 0x1c, 0xf7, 0xf7, 0x16, 0xfc, 0x39, 0x1c, 0x20, 0x1c, 0xf8, 0xf7, 0xa2, 0xfb, 0x22, 0x1c, 0x31, 0x1c, 0x00, 0x23, 0x02, 0x20, 0x3c, 0x00, 0xdc, 0x8c, 0x00, 0x00, 0xf8, 0xf7, 0x68, 0xf8, 0xfe, 0xbd, 0x00, 0x00, 0x20, 0x46, 0x01, 0x00, 0x0a, 0x1c, 0x01, 0x1c, 0x80, 0xb5, 0x00, 0x23, 0x01, 0x20, 0xf8, 0xf7, 0x5d, 0xf8, 0x80, 0xbd, 0xff, 0xb5, 0x9f, 0xb0, 0x1f, 0x1c, 0x05, 0x1c, 0x0a, 0x30, 0x1e, 0x90, 0x1c, 0xaa, 0x1d, 0xa9, 0x0a, 0xf0, 0x00, 0xff, 0x00, 0x28, 0x71, 0xd0, 0x00, 0x2f, 0x09, 0xd0, 0x0a, 0x21, 0x00, 0x20, 0x3c, 0x00, 0x18, 0x8d, 0x00, 0x00, 0xf8, 0xf7, 0x5e, 0xfc, 0x06, 0x68, 0x04, 0x1c, 0x30, 0x1d, 0xfa, 0xf7, 0xaf, 0xfa, 0x05, 0xe0, 0x04, 0x21, 0x00, 0x20, 0xf8, 0xf7, 0x54, 0xfc, 0x06, 0x68, 0x04, 0x1c, 0x28, 0x89, 0x36, 0x49, 0x01, 0x22, 0x08, 0x80, 0x70, 0x80, 0xe8, 0x88, 0x14, 0xa9, 0x30, 0x80, 0x19, 0xa8, 0xfc, 0xf7, 0xf5, 0xfc, 0xfc, 0xf7, 0xff, 0xfb, 0x01, 0x1c, 0xff, 0x31, 0x21, 0x31, 0x3c, 0x00, 0x54, 0x8d, 0x00, 0x00, 0x20, 0x1c, 0x01, 0xf0, 0xef, 0xf8, 0x19, 0xa9, 0x20, 0x1c, 0x01, 0xf0, 0xeb, 0xf8, 0x14, 0xa9, 0x20, 0x1c, 0x01, 0xf0, 0xe7, 0xf8, 0x20, 0x1c, 0x20, 0x99, 0xfd, 0xf7, 0x4b, 0xfd, 0x00, 0x22, 0x02, 0x21, 0x01, 0xf0, 0x33, 0xfd, 0x06, 0x1c, 0x1c, 0x99, 0x00, 0x20, 0x88, 0x61, 0x30, 0x1c, 0xf8, 0xf7, 0x1c, 0xfa, 0x00, 0x2e, 0x0b, 0xd0, 0x30, 0x7a, 0x00, 0x28, 0x3c, 0x00, 0x90, 0x8d, 0x00, 0x00, 0x02, 0xd0, 0x40, 0x21, 0x08, 0x43, 0x30, 0x72, 0x1c, 0x98, 0x02, 0x22, 0x81, 0x69, 0x11, 0x43, 0x81, 0x61, 0x04, 0xe0, 0x1c, 0x99, 0x02, 0x22, 0x88, 0x69, 0x90, 0x43, 0x88, 0x61, 0x1d, 0xaa, 0x06, 0xca, 0x01, 0xa8, 0x05, 0xf0, 0x58, 0xfb, 0x09, 0xa8, 0x00, 0x2f, 0x02, 0xd0, 0x02, 0x22, 0x42, 0x72, 0x01, 0xe0, 0x00, 0x21, 0x41, 0x72, 0x04, 0x94, 0x01, 0xa8, 0x3c, 0x00, 0xcc, 0x8d, 0x00, 0x00, 0x04, 0xf0, 0x7a, 0xfb, 0x01, 0x21, 0x1c, 0x98, 0x08, 0xf0, 0xc8, 0xff, 0x00, 0x2f, 0x04, 0xd0, 0x1c, 0x98, 0x01, 0x22, 0x81, 0x69, 0x11, 0x43, 0x81, 0x61, 0xa8, 0x88, 0x1c, 0x9c, 0x01, 0xf0, 0x9f, 0xfe, 0x02, 0x1c, 0x21, 0x1c, 0x00, 0xe0, 0x04, 0xe0, 0x07, 0x48, 0x40, 0x88, 0x09, 0xf0, 0x1f, 0xf8, 0x04, 0xe0, 0x3a, 0x1c, 0x00, 0x21, 0x05, 0x20, 0xf9, 0xf7, 0x3c, 0x00, 0x08, 0x8e, 0x00, 0x00, 0x9b, 0xf8, 0x00, 0x20, 0x23, 0xb0, 0xf0, 0xbd, 0xfc, 0x60, 0x01, 0x00, 0x98, 0x7c, 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0x05, 0x68, 0xa0, 0x1d, 0x01, 0xf0, 0x95, 0xff, 0x00, 0x28, 0x45, 0xd0, 0x21, 0x1c, 0x14, 0x31, 0x20, 0x1c, 0x6a, 0x46, 0x0a, 0xf0, 0x55, 0xfe, 0x00, 0x28, 0x3d, 0xd0, 0xfc, 0xf7, 0x7d, 0xfa, 0x00, 0x28, 0x39, 0xd1, 0x00, 0x98, 0x3c, 0x00, 0x44, 0x8e, 0x00, 0x00, 0x4b, 0x21, 0x09, 0x5c, 0x01, 0x29, 0x34, 0xd1, 0x04, 0x26, 0x09, 0xf0, 0x19, 0xf9, 0x68, 0x88, 0x00, 0x28, 0x1b, 0xd1, 0xa8, 0x88, 0x03, 0x21, 0x89, 0x03, 0x88, 0x43, 0x15, 0x49, 0x00, 0x26, 0x08, 0x80, 0x01, 0x22, 0x02, 0x21, 0x20, 0x69, 0x01, 0xf0, 0xb8, 0xfc, 0x04, 0x1c, 0x14, 0xd0, 0x00, 0x98, 0x80, 0x69, 0x80, 0x07, 0x10, 0xd5, 0xf8, 0xf7, 0x9a, 0xf9, 0x3c, 0x00, 0x80, 0x8e, 0x00, 0x00, 0x20, 0x1c, 0xf8, 0xf7, 0xdd, 0xf8, 0x00, 0x28, 0x09, 0xd1, 0xf8, 0xf7, 0x7f, 0xf9, 0x01, 0x26, 0x00, 0x98, 0x02, 0x22, 0x81, 0x69, 0x91, 0x43, 0x81, 0x61, 0x00, 0x21, 0x01, 0xe0, 0x00, 0x98, 0x02, 0x21, 0x08, 0xf0, 0x61, 0xff, 0x00, 0x98, 0x80, 0x69, 0xa9, 0x88, 0xc2, 0x07, 0xd2, 0x0f, 0x30, 0x1c, 0xf9, 0xf7, 0x45, 0xf8, 0xf8, 0xbd, 0xfa, 0x60, 0x01, 0x00, 0x3c, 0x00, 0xbc, 0x8e, 0x00, 0x00, 0x1c, 0xb5, 0x04, 0x69, 0x00, 0x23, 0x00, 0x22, 0x00, 0x2c, 0x13, 0xd1, 0x4b, 0x24, 0x24, 0x5c, 0x02, 0x2c, 0x03, 0xd1, 0x02, 0x29, 0x05, 0xd0, 0x01, 0x22, 0x03, 0xe0, 0x02, 0x29, 0x01, 0xd1, 0x01, 0x22, 0x01, 0x23, 0x00, 0x2a, 0x05, 0xd0, 0x00, 0x90, 0x04, 0x20, 0x01, 0x93, 0x69, 0x46, 0x09, 0xf0, 0x36, 0xfa, 0x1c, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x3c, 0x00, 0xf8, 0x8e, 0x00, 0x00, 0xf2, 0x21, 0x0f, 0x20, 0x0c, 0x4d, 0x0a, 0xf0, 0x99, 0xfb, 0x28, 0x78, 0x08, 0x28, 0x0b, 0xd2, 0x01, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x07, 0x03, 0x03, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x2c, 0x01, 0xd1, 0x05, 0xf0, 0xbc, 0xfb, 0xb0, 0xbd, 0x01, 0x2c, 0xfc, 0xd1, 0xff, 0x20, 0x07, 0xf0, 0x38, 0xfa, 0xb0, 0xbd, 0x00, 0x00, 0x74, 0x66, 0x01, 0x00, 0x3c, 0x00, 0x34, 0x8f, 0x00, 0x00, 0x8c, 0xb5, 0x05, 0x4a, 0x00, 0xab, 0x11, 0x72, 0x00, 0x90, 0x19, 0x71, 0x69, 0x46, 0x08, 0x20, 0x09, 0xf0, 0x0a, 0xfa, 0x8c, 0xbd, 0x00, 0x00, 0xac, 0x7c, 0x01, 0x00, 0xf3, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0x06, 0x27, 0x85, 0xb0, 0x06, 0x68, 0x09, 0xf0, 0x26, 0xff, 0x98, 0x49, 0x48, 0x63, 0x20, 0x69, 0x03, 0x21, 0x01, 0xf0, 0x08, 0xfc, 0x96, 0x4d, 0x00, 0x28, 0x3c, 0x00, 0x70, 0x8f, 0x00, 0x00, 0x4d, 0xd0, 0x95, 0x49, 0x40, 0x31, 0x09, 0x79, 0x80, 0x78, 0x81, 0x42, 0x47, 0xd1, 0x01, 0x21, 0x20, 0x69, 0x01, 0xf0, 0xfb, 0xfb, 0x02, 0x90, 0x20, 0x69, 0x32, 0x21, 0x01, 0xf0, 0xf6, 0xfb, 0x01, 0x90, 0x02, 0x1c, 0x8d, 0x48, 0x02, 0x99, 0xfc, 0xf7, 0x46, 0xff, 0x00, 0x28, 0x36, 0xd0, 0x00, 0x23, 0x8a, 0x48, 0x02, 0x99, 0x01, 0x9a, 0xfc, 0xf7, 0xe4, 0xfe, 0x3c, 0x00, 0xac, 0x8f, 0x00, 0x00, 0x0b, 0x28, 0x2e, 0xd1, 0x86, 0x4a, 0x51, 0x88, 0x70, 0x89, 0x41, 0x40, 0x03, 0x91, 0x0b, 0x1c, 0x84, 0x49, 0x0b, 0x40, 0x25, 0xd1, 0x50, 0x80, 0x03, 0x99, 0x17, 0x1c, 0x00, 0x29, 0x0b, 0xd0, 0x03, 0x99, 0x48, 0x05, 0x02, 0xd5, 0x38, 0x1c, 0xfc, 0xf7, 0x40, 0xfe, 0x03, 0x99, 0x88, 0x06, 0x02, 0xd5, 0x38, 0x1c, 0xfc, 0xf7, 0x24, 0xfe, 0x2a, 0x21, 0x20, 0x69, 0x3c, 0x00, 0xe8, 0x8f, 0x00, 0x00, 0x01, 0xf0, 0xc8, 0xfb, 0x00, 0x28, 0x0d, 0xd0, 0x80, 0x78, 0xe9, 0x69, 0x81, 0x42, 0x09, 0xd0, 0xe8, 0x61, 0x38, 0x1c, 0xfc, 0xf7, 0x16, 0xfe, 0x38, 0x1c, 0xfc, 0xf7, 0x07, 0xfe, 0x38, 0x1c, 0xfc, 0xf7, 0x26, 0xfe, 0x00, 0x27, 0x20, 0x1c, 0x20, 0x30, 0x04, 0x90, 0x40, 0x7a, 0x08, 0x28, 0x71, 0xd1, 0x0a, 0xf0, 0xd1, 0xfc, 0x00, 0x20, 0x68, 0x61, 0x00, 0x23, 0x3c, 0x00, 0x24, 0x90, 0x00, 0x00, 0x2b, 0x61, 0xa8, 0x68, 0x66, 0x49, 0x01, 0x30, 0xa8, 0x60, 0x30, 0x89, 0x5c, 0x31, 0x88, 0x82, 0x01, 0xf0, 0x7a, 0xfd, 0x62, 0x49, 0x5c, 0x31, 0x08, 0x61, 0x22, 0x6a, 0x04, 0x98, 0x18, 0x21, 0x00, 0x7a, 0x01, 0xf0, 0x33, 0xfe, 0xe1, 0x6a, 0x40, 0x18, 0x03, 0x90, 0x5c, 0x48, 0x00, 0x6a, 0x00, 0x28, 0x0d, 0xd0, 0x00, 0x2f, 0x0b, 0xd1, 0x59, 0x48, 0x01, 0x23, 0x3c, 0x00, 0x60, 0x90, 0x00, 0x00, 0x5c, 0x30, 0x01, 0x68, 0x1b, 0x07, 0x00, 0x22, 0x30, 0x68, 0x09, 0xf0, 0x49, 0xff, 0x00, 0x28, 0x00, 0xd1, 0x05, 0x27, 0x00, 0x21, 0xa0, 0x6b, 0x0a, 0xf0, 0xce, 0xfc, 0x00, 0x21, 0x20, 0x6c, 0x0a, 0xf0, 0xe8, 0xfc, 0x4f, 0x4b, 0x03, 0xce, 0x03, 0x9a, 0x5c, 0x33, 0xfc, 0xf7, 0x88, 0xfd, 0x00, 0x20, 0x4c, 0x4e, 0x05, 0x21, 0xb0, 0x63, 0x20, 0x69, 0x01, 0xf0, 0x3c, 0x00, 0x9c, 0x90, 0x00, 0x00, 0x6f, 0xfb, 0x01, 0x1c, 0x01, 0xd1, 0xf0, 0x60, 0x1c, 0xe0, 0x01, 0x20, 0xf0, 0x60, 0x88, 0x78, 0x45, 0x4a, 0x01, 0x32, 0x10, 0x70, 0xc8, 0x78, 0x50, 0x70, 0x47, 0x4a, 0x10, 0x70, 0x30, 0x69, 0x00, 0x28, 0x0a, 0xd0, 0x4a, 0x78, 0x08, 0x79, 0x05, 0x31, 0x09, 0xf0, 0xdd, 0xfa, 0x31, 0x69, 0xf7, 0xf7, 0x85, 0xf9, 0xf0, 0x68, 0x00, 0x28, 0x04, 0xd0, 0x3b, 0x4a, 0x3c, 0x00, 0xd8, 0x90, 0x00, 0x00, 0x01, 0x32, 0x10, 0x78, 0x00, 0x28, 0x08, 0xd1, 0x00, 0x20, 0xa8, 0x61, 0x71, 0x6a, 0x00, 0x29, 0x03, 0xd0, 0x20, 0x1c, 0x14, 0x30, 0xf7, 0xf7, 0x74, 0xf9, 0x34, 0x4a, 0x5c, 0x32, 0x10, 0x69, 0x31, 0x6a, 0x41, 0x18, 0x00, 0xe0, 0x20, 0xe0, 0x0a, 0x23, 0xd0, 0x68, 0x0a, 0x22, 0x09, 0xf0, 0xfb, 0xfe, 0x00, 0x28, 0x07, 0xd0, 0x2d, 0x4a, 0x31, 0x6a, 0x5c, 0x32, 0x3c, 0x00, 0x14, 0x91, 0x00, 0x00, 0xd0, 0x68, 0x40, 0x1a, 0x11, 0x69, 0x40, 0x1a, 0x70, 0x60, 0x29, 0x4a, 0x5c, 0x32, 0xd0, 0x68, 0x30, 0x62, 0xf0, 0x69, 0x00, 0x28, 0x04, 0xd0, 0xfa, 0xf7, 0x00, 0xfd, 0x01, 0x20, 0xfa, 0xf7, 0xa1, 0xfc, 0xfa, 0xf7, 0x81, 0xfc, 0x27, 0x48, 0x00, 0x68, 0x03, 0xf0, 0x07, 0xf9, 0x06, 0x98, 0x00, 0x28, 0x03, 0xd1, 0x1e, 0x4e, 0x00, 0x23, 0xb3, 0x60, 0x16, 0xe0, 0x3c, 0x00, 0x50, 0x91, 0x00, 0x00, 0x1c, 0x4e, 0x01, 0x20, 0xb0, 0x60, 0x06, 0x98, 0x01, 0x68, 0x40, 0x68, 0xb0, 0x65, 0x19, 0x48, 0x71, 0x65, 0x54, 0x30, 0xc0, 0x88, 0x00, 0x28, 0x09, 0xd0, 0xb1, 0x69, 0x00, 0x29, 0x06, 0xd0, 0x01, 0xf0, 0xdc, 0xfc, 0x01, 0x1c, 0xe0, 0x6a, 0xb2, 0x69, 0xf7, 0xf7, 0x2f, 0xf9, 0x00, 0x2f, 0x15, 0xd1, 0x12, 0x48, 0x01, 0x69, 0x00, 0x29, 0x08, 0xd1, 0x01, 0x21, 0x3c, 0x00, 0x8c, 0x91, 0x00, 0x00, 0x01, 0x61, 0x2a, 0x68, 0x00, 0x2a, 0x03, 0xd0, 0x00, 0x21, 0x00, 0x20, 0xf7, 0xf7, 0x20, 0xf9, 0x09, 0x49, 0x00, 0x23, 0xcb, 0x62, 0x2b, 0x61, 0x6b, 0x61, 0x06, 0xf0, 0xb5, 0xf8, 0x07, 0xb0, 0xf0, 0xbd, 0x6b, 0x68, 0x06, 0x48, 0x00, 0x2b, 0xf9, 0xd0, 0x02, 0x1d, 0x11, 0x1c, 0x38, 0x1c, 0xf7, 0xf7, 0x0f, 0xf9, 0xf3, 0xe7, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x3c, 0x00, 0xc8, 0x91, 0x00, 0x00, 0xf4, 0x68, 0x01, 0x00, 0xf4, 0x67, 0x01, 0x00, 0x03, 0x08, 0x00, 0x00, 0xf8, 0x60, 0x01, 0x00, 0xc4, 0x67, 0x01, 0x00, 0x08, 0xb5, 0xf8, 0xf7, 0x2f, 0xfd, 0x00, 0x90, 0x00, 0xab, 0x18, 0x88, 0x00, 0x28, 0x0c, 0xd0, 0x05, 0xf0, 0x50, 0xff, 0x00, 0xab, 0x59, 0x88, 0x18, 0x88, 0x05, 0xf0, 0x6d, 0xf9, 0xfe, 0xf7, 0x97, 0xf8, 0x03, 0x20, 0xfb, 0xf7, 0x0e, 0xf8, 0x3c, 0x00, 0x04, 0x92, 0x00, 0x00, 0x08, 0xbd, 0x01, 0x20, 0xff, 0xf7, 0xb2, 0xfb, 0x00, 0x20, 0x08, 0xf0, 0x8d, 0xfe, 0xf7, 0xe7, 0xf8, 0xb5, 0x4f, 0x49, 0x8c, 0x68, 0x20, 0x6a, 0x00, 0x68, 0x05, 0x78, 0xfc, 0xf7, 0x68, 0xfa, 0x00, 0x28, 0x12, 0xd0, 0x2a, 0x07, 0x92, 0x0f, 0x01, 0x21, 0x01, 0x2a, 0x00, 0xd0, 0x00, 0x21, 0x00, 0x29, 0x03, 0xd0, 0x29, 0x06, 0x09, 0x0f, 0x0b, 0x29, 0x06, 0xd1, 0x3c, 0x00, 0x40, 0x92, 0x00, 0x00, 0x2a, 0x21, 0x09, 0x5d, 0x08, 0x18, 0x90, 0x30, 0x00, 0x7b, 0xf9, 0xf7, 0x0d, 0xfc, 0x41, 0x4f, 0x3c, 0x3f, 0xb8, 0x6b, 0x79, 0x6b, 0xf7, 0xf7, 0xc0, 0xf8, 0xa0, 0x6c, 0x00, 0x26, 0xc6, 0x60, 0x60, 0x6b, 0x80, 0x08, 0x04, 0xd0, 0xb8, 0x69, 0x01, 0x30, 0xb8, 0x61, 0x06, 0xf0, 0xdc, 0xf9, 0x39, 0x4d, 0x28, 0x69, 0x80, 0x05, 0x80, 0x0f, 0x08, 0xd1, 0x78, 0x69, 0x3c, 0x00, 0x7c, 0x92, 0x00, 0x00, 0x04, 0x21, 0x01, 0x30, 0x78, 0x61, 0x60, 0x6b, 0x40, 0x08, 0x40, 0x00, 0x08, 0x43, 0x60, 0x63, 0xb8, 0x6a, 0x00, 0x28, 0x03, 0xd0, 0x60, 0x6b, 0x08, 0x21, 0x08, 0x43, 0x60, 0x63, 0x20, 0x1c, 0x20, 0x30, 0x00, 0x90, 0x39, 0x68, 0xf7, 0xf7, 0x9a, 0xf8, 0x03, 0x20, 0x00, 0x02, 0x28, 0x60, 0x2b, 0x49, 0x88, 0x68, 0xa0, 0x63, 0xc8, 0x68, 0xe0, 0x63, 0x08, 0x79, 0x3c, 0x00, 0xb8, 0x92, 0x00, 0x00, 0xc0, 0x06, 0xc0, 0x0e, 0x25, 0x1c, 0x40, 0x35, 0x28, 0x71, 0x48, 0x79, 0x68, 0x71, 0x23, 0x48, 0x3c, 0x38, 0x46, 0x62, 0x00, 0x98, 0x80, 0x7a, 0x01, 0xf0, 0x5e, 0xfd, 0x00, 0x21, 0x00, 0x28, 0x21, 0x4a, 0x01, 0xd0, 0x11, 0x78, 0x03, 0xe0, 0x93, 0x78, 0xdb, 0x07, 0x00, 0xd5, 0x51, 0x78, 0xa9, 0x71, 0x00, 0x28, 0x04, 0xd0, 0x1b, 0x49, 0x14, 0x31, 0x08, 0x68, 0x3c, 0x00, 0xf4, 0x92, 0x00, 0x00, 0x20, 0x64, 0x00, 0xe0, 0x6e, 0x80, 0xb8, 0x6a, 0xc0, 0x07, 0x02, 0xd5, 0xff, 0x20, 0x28, 0x71, 0xae, 0x71, 0xe6, 0x61, 0xb8, 0x68, 0x01, 0x30, 0xb8, 0x60, 0x79, 0x68, 0x88, 0x42, 0x03, 0xd0, 0x0b, 0x21, 0x85, 0x20, 0xf7, 0xf7, 0xc4, 0xff, 0x0d, 0x49, 0x88, 0x68, 0xc0, 0x6c, 0x88, 0x60, 0xfb, 0x6a, 0x00, 0x2b, 0x0c, 0xd0, 0x0e, 0x4a, 0xd4, 0x7b, 0x00, 0x2b, 0x3c, 0x00, 0x30, 0x93, 0x00, 0x00, 0x02, 0xdd, 0x7f, 0x2c, 0x05, 0xd2, 0x01, 0xe0, 0x00, 0x2c, 0x02, 0xd0, 0xd4, 0x7b, 0xe3, 0x18, 0xd3, 0x73, 0xfe, 0x62, 0xc9, 0x68, 0x88, 0x42, 0x03, 0xd1, 0x05, 0x21, 0x85, 0x20, 0xf7, 0xf7, 0xa9, 0xff, 0xf8, 0xbd, 0x24, 0x7e, 0x01, 0x00, 0x00, 0x40, 0x07, 0x00, 0xa0, 0x80, 0x07, 0x00, 0xe8, 0x80, 0x07, 0x00, 0x40, 0x00, 0x07, 0x00, 0xfe, 0xb5, 0x30, 0x4c, 0x3c, 0x00, 0x6c, 0x93, 0x00, 0x00, 0xa0, 0x6b, 0x21, 0x6b, 0xf7, 0xf7, 0x33, 0xf8, 0x2d, 0x49, 0x3c, 0x31, 0x8e, 0x68, 0x70, 0x8b, 0x06, 0x28, 0x04, 0xd2, 0xe0, 0x69, 0x01, 0x30, 0xe0, 0x61, 0x0e, 0x20, 0x30, 0x85, 0x28, 0x49, 0x3c, 0x31, 0x0d, 0x68, 0x00, 0x2d, 0x03, 0xd1, 0x03, 0x21, 0x85, 0x20, 0xf7, 0xf7, 0x84, 0xff, 0x24, 0x48, 0x45, 0x61, 0x35, 0x62, 0x31, 0x8d, 0xef, 0x68, 0x04, 0x39, 0x3c, 0x00, 0xa8, 0x93, 0x00, 0x00, 0x0c, 0x04, 0x01, 0x21, 0x02, 0x91, 0x24, 0x0c, 0x00, 0x21, 0x01, 0x91, 0x1d, 0x48, 0x3c, 0x30, 0x80, 0x8a, 0xa0, 0x42, 0x03, 0xd3, 0x2c, 0x81, 0xee, 0x60, 0x00, 0x24, 0x0b, 0xe0, 0x00, 0x2f, 0x04, 0xd1, 0x03, 0x21, 0x85, 0x20, 0xf7, 0xf7, 0x69, 0xff, 0x04, 0xe0, 0x3d, 0x1c, 0x20, 0x1a, 0x04, 0x04, 0xff, 0x68, 0x24, 0x0c, 0x02, 0x98, 0x00, 0x28, 0x04, 0xd0, 0x3c, 0x00, 0xe4, 0x93, 0x00, 0x00, 0x12, 0x49, 0x01, 0x20, 0x08, 0x61, 0x00, 0x20, 0x02, 0x90, 0x01, 0x98, 0x01, 0x30, 0x01, 0x90, 0x00, 0x2c, 0xdd, 0xd1, 0x0c, 0x48, 0x0c, 0x4c, 0x3c, 0x30, 0x07, 0x60, 0x01, 0x98, 0x30, 0x65, 0xb5, 0x64, 0x30, 0x6a, 0x00, 0x68, 0x60, 0x62, 0x60, 0x68, 0x01, 0x30, 0x60, 0x60, 0xa1, 0x68, 0x01, 0x31, 0x88, 0x42, 0x03, 0xd0, 0x0a, 0x21, 0x85, 0x20, 0xf7, 0xf7, 0x3c, 0x00, 0x20, 0x94, 0x00, 0x00, 0x41, 0xff, 0x04, 0x48, 0x00, 0x68, 0xa0, 0x62, 0xfe, 0xbd, 0x00, 0x00, 0xe8, 0x7d, 0x01, 0x00, 0x00, 0x30, 0x07, 0x00, 0x78, 0x6e, 0x01, 0x00, 0xb0, 0xb5, 0x05, 0x1c, 0x01, 0x21, 0x0f, 0x20, 0x0a, 0xf0, 0xf8, 0xf8, 0xf2, 0x21, 0x0f, 0x20, 0x0a, 0xf0, 0xf4, 0xf8, 0x0c, 0x48, 0x0c, 0x4c, 0x00, 0x68, 0x14, 0x3c, 0x00, 0x28, 0x0c, 0xd0, 0xe0, 0x78, 0x01, 0x28, 0x3c, 0x00, 0x5c, 0x94, 0x00, 0x00, 0x09, 0xd0, 0x01, 0x22, 0x29, 0x1c, 0x0f, 0x20, 0x0a, 0xf0, 0xac, 0xf8, 0x60, 0x78, 0x02, 0x28, 0x06, 0xd0, 0x01, 0x20, 0x03, 0xe0, 0x60, 0x78, 0x02, 0x28, 0x01, 0xd0, 0x00, 0x20, 0x60, 0x70, 0xb0, 0xbd, 0x00, 0x00, 0x98, 0x66, 0x01, 0x00, 0x02, 0x22, 0x00, 0x28, 0x80, 0xb5, 0x00, 0xd1, 0x03, 0x22, 0x03, 0x49, 0x0e, 0x20, 0x0a, 0xf0, 0x9b, 0xf8, 0x00, 0x20, 0x3c, 0x00, 0x98, 0x94, 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x50, 0xc3, 0x00, 0x00, 0xf8, 0xb5, 0x00, 0x23, 0x00, 0x22, 0x00, 0x28, 0x2e, 0xd0, 0x06, 0x89, 0x04, 0x68, 0x75, 0x1e, 0x2d, 0x04, 0xb6, 0x1a, 0xf6, 0x07, 0x2d, 0x0c, 0xf6, 0x0f, 0xb4, 0x46, 0x0e, 0xe0, 0xa7, 0x5c, 0xa6, 0x18, 0x02, 0x33, 0x00, 0x97, 0x77, 0x78, 0xa7, 0x54, 0x02, 0x32, 0x12, 0x04, 0x00, 0x9f, 0x12, 0x0c, 0x00, 0x29, 0x3c, 0x00, 0xd4, 0x94, 0x00, 0x00, 0x77, 0x70, 0x01, 0xdd, 0x8b, 0x42, 0x15, 0xda, 0xaa, 0x42, 0xee, 0xd3, 0xc0, 0x68, 0x00, 0x28, 0x10, 0xd0, 0x02, 0x89, 0x00, 0x2a, 0xf9, 0xd0, 0x62, 0x46, 0x00, 0x2a, 0x0b, 0xd0, 0x02, 0x68, 0x66, 0x5d, 0x17, 0x78, 0x02, 0x33, 0x67, 0x55, 0x16, 0x70, 0x01, 0x22, 0x00, 0x29, 0xd2, 0xdd, 0x8b, 0x42, 0xd0, 0xdb, 0xf8, 0xbd, 0x00, 0x22, 0xcd, 0xe7, 0x00, 0x00, 0x3c, 0x00, 0x10, 0x95, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, 0x01, 0x20, 0xf8, 0xf7, 0x5e, 0xfb, 0x0d, 0x49, 0x00, 0x28, 0xc8, 0x61, 0x14, 0xd0, 0x62, 0x68, 0x42, 0x60, 0xa2, 0x7c, 0x02, 0x72, 0xa2, 0x68, 0xc2, 0x60, 0xe2, 0x68, 0x02, 0x61, 0x22, 0x8a, 0x02, 0x75, 0x0a, 0x1d, 0x0a, 0x62, 0x12, 0x68, 0x00, 0x2a, 0xff, 0xd1, 0x02, 0x60, 0x48, 0x60, 0x00, 0x20, 0xa8, 0x60, 0x01, 0x20, 0x3c, 0x00, 0x4c, 0x95, 0x00, 0x00, 0xb0, 0xbd, 0x01, 0x20, 0xfa, 0xe7, 0x00, 0x00, 0xa4, 0x6e, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x40, 0x68, 0x0d, 0x1c, 0x43, 0x1c, 0x02, 0xd1, 0x21, 0x1c, 0x09, 0x48, 0x08, 0xe0, 0x00, 0x20, 0xf8, 0xf7, 0x34, 0xfb, 0x06, 0x49, 0x94, 0x39, 0x08, 0x61, 0x00, 0x28, 0x03, 0xd0, 0x21, 0x1c, 0x00, 0xf0, 0x48, 0xfe, 0x00, 0xe0, 0x01, 0x20, 0xa8, 0x60, 0x01, 0x20, 0x3c, 0x00, 0x88, 0x95, 0x00, 0x00, 0xb0, 0xbd, 0x00, 0x00, 0x38, 0x6f, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x21, 0x97, 0x20, 0xf7, 0xf7, 0x85, 0xfe, 0x00, 0x20, 0x80, 0xbd, 0x00, 0x00, 0x38, 0xb5, 0x0a, 0x1c, 0x14, 0x32, 0x00, 0x92, 0x13, 0x1f, 0x05, 0x1c, 0x08, 0x3a, 0x0c, 0x1c, 0x16, 0x31, 0x40, 0x68, 0xfe, 0xf7, 0x6c, 0xfe, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x20, 0x00, 0xe0, 0x01, 0x20, 0x69, 0x68, 0x3c, 0x00, 0xc4, 0x95, 0x00, 0x00, 0xa0, 0x60, 0x61, 0x60, 0x01, 0x20, 0x38, 0xbd, 0x10, 0xb5, 0x0c, 0x1c, 0x01, 0x7a, 0x00, 0x29, 0x0f, 0xd0, 0x01, 0x29, 0x09, 0xd0, 0x02, 0x29, 0x03, 0xd1, 0x00, 0x21, 0x00, 0x20, 0x0a, 0xf0, 0x73, 0xfc, 0x00, 0x20, 0x20, 0x71, 0x01, 0x20, 0x10, 0xbd, 0x41, 0x68, 0x01, 0x20, 0x0a, 0xf0, 0x6b, 0xfc, 0x00, 0xf0, 0x0d, 0xf9, 0xf4, 0xe7, 0x80, 0xb5, 0x04, 0x49, 0x3c, 0x00, 0x00, 0x96, 0x00, 0x00, 0x48, 0x68, 0x01, 0x38, 0x48, 0x60, 0x01, 0xd1, 0x07, 0xf0, 0x6e, 0xfb, 0x00, 0x20, 0x80, 0xbd, 0xac, 0x79, 0x01, 0x00, 0xb0, 0xb5, 0x05, 0x1c, 0x0c, 0x1c, 0x00, 0xf0, 0x4f, 0xfe, 0xa0, 0x60, 0x68, 0x68, 0x60, 0x60, 0x01, 0x20, 0xb0, 0xbd, 0xb0, 0xb5, 0x05, 0x1c, 0x0c, 0x1c, 0x00, 0xf0, 0x6f, 0xfe, 0xa0, 0x60, 0x68, 0x68, 0x60, 0x60, 0x01, 0x20, 0xb0, 0xbd, 0x3c, 0x00, 0x3c, 0x96, 0x00, 0x00, 0x08, 0x1c, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x0e, 0xc0, 0x08, 0xc0, 0x01, 0x20, 0x70, 0x47, 0xf8, 0xb5, 0x0f, 0x1c, 0x04, 0x1c, 0x20, 0x79, 0x20, 0x28, 0x01, 0xd2, 0x20, 0x20, 0x20, 0x71, 0x66, 0x79, 0x00, 0x2e, 0x02, 0xd1, 0x25, 0x79, 0x00, 0x22, 0x0d, 0xe0, 0x25, 0x79, 0x29, 0x1c, 0x30, 0x1c, 0xf7, 0xf7, 0x4f, 0xf8, 0x00, 0x29, 0x01, 0xd1, 0x32, 0x1c, 0x3c, 0x00, 0x78, 0x96, 0x00, 0x00, 0x04, 0xe0, 0x70, 0x43, 0x80, 0x19, 0x05, 0x06, 0x2d, 0x0e, 0x32, 0x1c, 0xe0, 0x79, 0x29, 0x1c, 0x00, 0xf0, 0xf2, 0xf9, 0x20, 0x7a, 0x2f, 0x49, 0xc0, 0x07, 0xc0, 0x0f, 0x08, 0x60, 0x2e, 0x48, 0x00, 0x78, 0xc0, 0x07, 0x43, 0xd5, 0xa1, 0x79, 0x2c, 0x4a, 0xc8, 0x07, 0x48, 0xd4, 0x2c, 0x4e, 0x16, 0x60, 0x8b, 0x07, 0x2b, 0x48, 0x08, 0xd5, 0xcc, 0x08, 0x01, 0x23, 0x3c, 0x00, 0xb4, 0x96, 0x00, 0x00, 0xa3, 0x40, 0x03, 0x60, 0x49, 0x07, 0x04, 0xd5, 0x28, 0x49, 0x11, 0x60, 0x01, 0xe0, 0x40, 0x21, 0x01, 0x60, 0x13, 0x68, 0x26, 0x4a, 0xb3, 0x42, 0x10, 0xd1, 0x54, 0x68, 0x01, 0x68, 0x0c, 0x43, 0x54, 0x60, 0x14, 0x68, 0x0c, 0x40, 0x01, 0xd0, 0x51, 0x61, 0x00, 0xe0, 0x91, 0x61, 0x54, 0x68, 0x0c, 0x43, 0x54, 0x60, 0x94, 0x68, 0x21, 0x43, 0x91, 0x60, 0x13, 0xe0, 0x3c, 0x00, 0xf0, 0x96, 0x00, 0x00, 0x54, 0x7c, 0x01, 0x68, 0x0c, 0x43, 0x54, 0x74, 0x14, 0x7c, 0x0c, 0x40, 0x03, 0xd0, 0x14, 0x7c, 0x0c, 0x43, 0x14, 0x74, 0x02, 0xe0, 0x14, 0x7c, 0x8c, 0x43, 0x14, 0x74, 0x54, 0x7c, 0x0c, 0x43, 0x54, 0x74, 0x94, 0x7c, 0x21, 0x43, 0x91, 0x74, 0xb3, 0x42, 0x05, 0xd1, 0x00, 0x22, 0x01, 0x68, 0x03, 0x20, 0xff, 0xf7, 0x8d, 0xf8, 0x09, 0xe0, 0x00, 0x68, 0x00, 0x21, 0x3c, 0x00, 0x2c, 0x97, 0x00, 0x00, 0x02, 0x06, 0x12, 0x0e, 0x03, 0x20, 0xff, 0xf7, 0x85, 0xf8, 0x01, 0xe0, 0x0b, 0x48, 0x10, 0x60, 0x00, 0x20, 0x38, 0x71, 0x7d, 0x71, 0xf7, 0xf7, 0xe9, 0xfd, 0x01, 0x20, 0xf8, 0xbd, 0x00, 0x00, 0xcc, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x07, 0x00, 0x5c, 0x5b, 0x01, 0x00, 0xb9, 0x9b, 0x00, 0x00, 0x58, 0x5b, 0x01, 0x00, 0x95, 0x9b, 0x00, 0x00, 0x10, 0x00, 0x07, 0x00, 0x3c, 0x00, 0x68, 0x97, 0x00, 0x00, 0x55, 0x9b, 0x00, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x04, 0x30, 0x00, 0x24, 0xfe, 0xf7, 0xd6, 0xfa, 0x01, 0x20, 0x6c, 0x60, 0xb0, 0xbd, 0x00, 0x00, 0xf0, 0xb5, 0x07, 0x7a, 0x43, 0x68, 0x04, 0x1c, 0x0e, 0x48, 0x0e, 0x1c, 0x00, 0x68, 0x01, 0x25, 0x01, 0x1c, 0x9b, 0xb0, 0x06, 0xe0, 0x4a, 0x68, 0x9a, 0x42, 0x02, 0xd1, 0x8f, 0x76, 0x00, 0x25, 0x02, 0xe0, 0x09, 0x68, 0x3c, 0x00, 0xa4, 0x97, 0x00, 0x00, 0x00, 0x29, 0xf6, 0xd1, 0x00, 0x2d, 0x05, 0xd1, 0x21, 0x7a, 0x01, 0x29, 0x02, 0xd1, 0x01, 0xa9, 0xf8, 0xf7, 0xa8, 0xf8, 0x60, 0x68, 0x04, 0x36, 0x21, 0xc6, 0x1b, 0xb0, 0x01, 0x20, 0xf0, 0xbd, 0xa4, 0x6e, 0x01, 0x00, 0x10, 0xb5, 0x0c, 0x1c, 0x08, 0xf0, 0xae, 0xfc, 0x60, 0x60, 0x01, 0x20, 0x10, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x0c, 0x1c, 0x07, 0xf0, 0x84, 0xfa, 0x3c, 0x00, 0xe0, 0x97, 0x00, 0x00, 0x04, 0xf0, 0x54, 0xff, 0x00, 0x20, 0x60, 0x60, 0x01, 0x20, 0x10, 0xbd, 0x00, 0x20, 0xc0, 0x43, 0x48, 0x60, 0x01, 0x20, 0x70, 0x47, 0x00, 0x00, 0x10, 0xb5, 0x0c, 0x1c, 0x00, 0x79, 0xfa, 0xf7, 0x07, 0xf8, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x20, 0x00, 0xe0, 0x02, 0x20, 0x60, 0x60, 0x01, 0x20, 0x10, 0xbd, 0x00, 0x00, 0x1c, 0xb5, 0x06, 0x4c, 0x20, 0x68, 0x00, 0x28, 0x3c, 0x00, 0x1c, 0x98, 0x00, 0x00, 0x07, 0xd0, 0x09, 0xf0, 0xc5, 0xfa, 0x01, 0x90, 0x20, 0x68, 0x41, 0x68, 0x68, 0x46, 0xf6, 0xf7, 0xd6, 0xfd, 0x1c, 0xbd, 0xac, 0x79, 0x01, 0x00, 0x01, 0x49, 0x08, 0x60, 0x70, 0x47, 0x00, 0x00, 0xac, 0x79, 0x01, 0x00, 0x0e, 0xb5, 0x06, 0x4b, 0x1b, 0x68, 0x00, 0x2b, 0x06, 0xd0, 0x02, 0x90, 0x00, 0x91, 0x01, 0x92, 0x68, 0x46, 0xd9, 0x68, 0xf6, 0xf7, 0xc1, 0xfd, 0x3c, 0x00, 0x58, 0x98, 0x00, 0x00, 0x0e, 0xbd, 0x00, 0x00, 0xac, 0x79, 0x01, 0x00, 0x1c, 0xb5, 0x04, 0x1c, 0x07, 0xf0, 0x4c, 0xfa, 0x06, 0x48, 0x41, 0x68, 0x01, 0x31, 0x41, 0x60, 0x00, 0x94, 0x00, 0x21, 0x01, 0x91, 0x00, 0x68, 0x01, 0x68, 0x68, 0x46, 0xf6, 0xf7, 0xad, 0xfd, 0x1c, 0xbd, 0x00, 0x00, 0xac, 0x79, 0x01, 0x00, 0x80, 0xb5, 0xf8, 0xf7, 0xa3, 0xf8, 0x80, 0xbd, 0x80, 0xb5, 0x02, 0x1c, 0x3c, 0x00, 0x94, 0x98, 0x00, 0x00, 0x80, 0x21, 0x03, 0x20, 0x00, 0xf0, 0x5c, 0xf8, 0x01, 0x1c, 0x03, 0x48, 0x00, 0x22, 0x43, 0x69, 0xf6, 0xf7, 0x9b, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0xa4, 0x6d, 0x01, 0x00, 0xf8, 0xb5, 0x0c, 0x1c, 0x13, 0x49, 0x05, 0x1c, 0x08, 0x68, 0x16, 0x1c, 0x01, 0x30, 0x08, 0x60, 0x00, 0x20, 0x20, 0x61, 0x22, 0x1c, 0x10, 0x32, 0x28, 0x1d, 0x00, 0x21, 0x07, 0x1c, 0x00, 0x92, 0x3c, 0x00, 0xd0, 0x98, 0x00, 0x00, 0x03, 0xf0, 0xde, 0xfe, 0x20, 0x71, 0x20, 0x69, 0x00, 0x28, 0x10, 0xd0, 0x01, 0x04, 0x09, 0x0c, 0x00, 0x20, 0xf7, 0xf7, 0x79, 0xfe, 0x30, 0x60, 0x29, 0x1d, 0x03, 0xc9, 0xa0, 0x60, 0xe1, 0x60, 0x30, 0x68, 0x01, 0x68, 0x00, 0x9a, 0x38, 0x1c, 0x03, 0xf0, 0xca, 0xfe, 0x20, 0x71, 0x01, 0x20, 0xf8, 0xbd, 0x00, 0x00, 0x10, 0x75, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x1c, 0x3c, 0x00, 0x0c, 0x99, 0x00, 0x00, 0x08, 0x21, 0x04, 0x20, 0x09, 0xf0, 0x4e, 0xff, 0x03, 0x20, 0x80, 0xbd, 0x10, 0xb5, 0x07, 0x4a, 0x0c, 0x1c, 0x51, 0x68, 0x01, 0x31, 0x51, 0x60, 0x01, 0x1c, 0x10, 0x31, 0xc2, 0x68, 0x04, 0x30, 0x03, 0xf0, 0xf0, 0xfe, 0x20, 0x71, 0x00, 0x20, 0x10, 0xbd, 0x00, 0x00, 0x10, 0x75, 0x01, 0x00, 0x04, 0x49, 0x80, 0xb5, 0x81, 0x61, 0x08, 0x21, 0x02, 0x1c, 0x03, 0x20, 0x3c, 0x00, 0x48, 0x99, 0x00, 0x00, 0x09, 0xf0, 0x32, 0xff, 0x03, 0x20, 0x80, 0xbd, 0x95, 0xd8, 0x00, 0x00, 0xf7, 0xb5, 0x07, 0x1c, 0x16, 0x1c, 0x06, 0x21, 0x00, 0x20, 0x82, 0xb0, 0xf7, 0xf7, 0x3a, 0xfe, 0x05, 0x1c, 0x20, 0x48, 0x00, 0x78, 0x06, 0x28, 0x00, 0xd9, 0x28, 0x81, 0x2c, 0x68, 0x00, 0x20, 0xa7, 0x70, 0x03, 0x99, 0xe1, 0x70, 0x31, 0x1c, 0x03, 0xe0, 0x0a, 0x89, 0x10, 0x18, 0x0f, 0x1c, 0x3c, 0x00, 0x84, 0x99, 0x00, 0x00, 0xc9, 0x68, 0x00, 0x29, 0xf9, 0xd1, 0x6b, 0x46, 0x01, 0xaa, 0x21, 0x1d, 0x00, 0xf0, 0x34, 0xf8, 0x00, 0xab, 0x18, 0x78, 0x60, 0x71, 0x18, 0x78, 0x00, 0x28, 0x17, 0xd0, 0x11, 0x48, 0x40, 0x68, 0x00, 0x28, 0x08, 0xd0, 0x19, 0x78, 0x00, 0x20, 0xf7, 0xf7, 0x14, 0xfe, 0x01, 0x1c, 0x38, 0x1c, 0xf7, 0xf7, 0x30, 0xfd, 0x0a, 0xe0, 0x38, 0x68, 0x00, 0x28, 0x02, 0xd1, 0x3c, 0x00, 0xc0, 0x99, 0x00, 0x00, 0x3f, 0x60, 0x01, 0x20, 0xb8, 0x61, 0x00, 0xab, 0x19, 0x78, 0x38, 0x89, 0x40, 0x18, 0x38, 0x81, 0x00, 0xab, 0x98, 0x88, 0x31, 0x1c, 0x02, 0x38, 0x20, 0x80, 0x28, 0x1c, 0xf7, 0xf7, 0x1c, 0xfd, 0x28, 0x1c, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xc8, 0x5c, 0x01, 0x00, 0x01, 0x79, 0x42, 0x79, 0x00, 0x88, 0x89, 0x18, 0x02, 0x39, 0x40, 0x1a, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0xfc, 0x99, 0x00, 0x00, 0x70, 0xb5, 0x08, 0x4d, 0x2c, 0x78, 0xad, 0x78, 0x20, 0x18, 0x06, 0x1c, 0x00, 0x2d, 0x03, 0xd0, 0x70, 0x19, 0x01, 0x38, 0x01, 0x3d, 0xa8, 0x43, 0x10, 0x80, 0x80, 0x1b, 0x18, 0x70, 0x0c, 0x70, 0x70, 0xbd, 0x00, 0x00, 0xc8, 0x5c, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x68, 0x0c, 0x4a, 0x21, 0x88, 0x52, 0x78, 0x02, 0x31, 0x91, 0x42, 0x11, 0xd2, 0x55, 0x1a, 0xf7, 0xf7, 0x3c, 0x00, 0x38, 0x9a, 0x00, 0x00, 0xc9, 0xfd, 0x01, 0x68, 0x00, 0x29, 0x02, 0xd1, 0x00, 0x60, 0x01, 0x21, 0x81, 0x61, 0x01, 0x89, 0x49, 0x19, 0x01, 0x81, 0x20, 0x88, 0x40, 0x19, 0x20, 0x80, 0x60, 0x79, 0x40, 0x19, 0x60, 0x71, 0xb0, 0xbd, 0x00, 0x00, 0xc8, 0x5c, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x06, 0x21, 0xf1, 0x20, 0x09, 0xf0, 0xa2, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x03, 0x1c, 0x02, 0x48, 0x3c, 0x00, 0x74, 0x9a, 0x00, 0x00, 0x03, 0x70, 0x41, 0x70, 0x82, 0x70, 0x70, 0x47, 0xc8, 0x5c, 0x01, 0x00, 0xb0, 0xb5, 0x08, 0x1c, 0x09, 0x68, 0x15, 0x1c, 0x8c, 0x78, 0xf7, 0xf7, 0x85, 0xfd, 0x04, 0x49, 0xa0, 0x00, 0x09, 0x58, 0x00, 0x29, 0x02, 0xd0, 0x28, 0x1c, 0xf6, 0xf7, 0x9e, 0xfc, 0xb0, 0xbd, 0x84, 0x6d, 0x01, 0x00, 0xfe, 0xb5, 0x04, 0x1c, 0xc0, 0x7a, 0xa1, 0x7a, 0xc6, 0x07, 0xf6, 0x0f, 0x3c, 0x00, 0xb0, 0x9a, 0x00, 0x00, 0x32, 0x1c, 0x20, 0x1d, 0x01, 0xf0, 0x3c, 0xf8, 0x60, 0x69, 0x25, 0x4f, 0xc1, 0x07, 0x37, 0xd5, 0xb8, 0x69, 0x00, 0x28, 0x01, 0xd0, 0xf6, 0xf7, 0x87, 0xfc, 0x20, 0x68, 0x05, 0x68, 0x28, 0x88, 0x80, 0x07, 0x34, 0xd1, 0x01, 0xaa, 0x02, 0xa9, 0x28, 0x1c, 0x01, 0xf0, 0x0b, 0xfc, 0x28, 0x1c, 0x01, 0xf0, 0x12, 0xfc, 0x00, 0x78, 0xc0, 0x07, 0x0a, 0xd4, 0x60, 0x69, 0x3c, 0x00, 0xec, 0x9a, 0x00, 0x00, 0x80, 0x07, 0x26, 0xd4, 0x33, 0x1c, 0x29, 0x1c, 0xa2, 0x7a, 0x20, 0x69, 0x7d, 0x69, 0xf6, 0xf7, 0x72, 0xfc, 0x1e, 0xe0, 0x00, 0xab, 0x18, 0x7a, 0x00, 0x28, 0x03, 0xd0, 0x01, 0x28, 0x06, 0xd0, 0x02, 0x28, 0x16, 0xd1, 0x28, 0x1c, 0x79, 0x6a, 0xf6, 0xf7, 0x61, 0xfc, 0x11, 0xe0, 0x00, 0xab, 0x18, 0x79, 0x0e, 0x28, 0x01, 0xd0, 0x0f, 0x28, 0x0b, 0xd1, 0x28, 0x1c, 0x3c, 0x00, 0x28, 0x9b, 0x00, 0x00, 0x39, 0x6a, 0xf6, 0xf7, 0x56, 0xfc, 0x06, 0xe0, 0x00, 0x07, 0x80, 0x0f, 0x03, 0xd1, 0x20, 0x69, 0xf9, 0x69, 0xf6, 0xf7, 0x4e, 0xfc, 0x78, 0x6b, 0x21, 0x21, 0x01, 0x30, 0x78, 0x63, 0x22, 0x1c, 0x80, 0x20, 0x09, 0xf0, 0x31, 0xfe, 0xfe, 0xbd, 0x28, 0x7a, 0x01, 0x00, 0x0b, 0x49, 0x18, 0xb5, 0x08, 0x78, 0xc0, 0x07, 0x11, 0xd5, 0x0a, 0x4a, 0x10, 0x1c, 0x20, 0x30, 0x3c, 0x00, 0x64, 0x9b, 0x00, 0x00, 0x84, 0x79, 0x00, 0xab, 0x1c, 0x70, 0xc0, 0x79, 0x58, 0x70, 0x08, 0x78, 0x40, 0x23, 0x18, 0x43, 0x08, 0x70, 0x05, 0x48, 0x00, 0x78, 0x08, 0x70, 0x00, 0xab, 0x18, 0x88, 0xd0, 0x84, 0x18, 0xbd, 0x04, 0x00, 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0xe0, 0x60, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x05, 0x49, 0x10, 0xb5, 0x88, 0x79, 0x05, 0x4b, 0x1a, 0x7c, 0x05, 0x4c, 0x3c, 0x00, 0xa0, 0x9b, 0x00, 0x00, 0x24, 0x68, 0x62, 0x40, 0x1a, 0x74, 0x88, 0x71, 0x10, 0xbd, 0x00, 0x00, 0x20, 0x10, 0x07, 0x00, 0x10, 0x00, 0x07, 0x00, 0x58, 0x5b, 0x01, 0x00, 0x04, 0x49, 0x0a, 0x68, 0x04, 0x48, 0x00, 0x68, 0x02, 0x40, 0x01, 0xd0, 0x88, 0x61, 0x70, 0x47, 0x48, 0x61, 0x70, 0x47, 0x10, 0x00, 0x07, 0x00, 0x58, 0x5b, 0x01, 0x00, 0x02, 0x1c, 0x01, 0x20, 0x00, 0x06, 0x08, 0x43, 0x3c, 0x00, 0xdc, 0x9b, 0x00, 0x00, 0x80, 0xb5, 0x2a, 0x21, 0x09, 0xf0, 0xe6, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x00, 0x29, 0x03, 0xd0, 0x81, 0x29, 0x07, 0xd1, 0x81, 0x20, 0x00, 0xe0, 0x80, 0x20, 0x22, 0x1c, 0x2c, 0x21, 0x09, 0xf0, 0xd7, 0xfd, 0x10, 0xbd, 0x02, 0x21, 0x2c, 0x20, 0xf7, 0xf7, 0x4c, 0xfb, 0x20, 0x1c, 0xf7, 0xf7, 0xc3, 0xfc, 0x10, 0xbd, 0x80, 0xb5, 0xb4, 0xb0, 0x3c, 0x00, 0x18, 0x9c, 0x00, 0x00, 0x01, 0x28, 0x06, 0xd0, 0x82, 0x28, 0x1c, 0xd1, 0x1a, 0xa8, 0x07, 0xf0, 0x35, 0xfc, 0x34, 0xb0, 0x80, 0xbd, 0x81, 0x29, 0x13, 0xd1, 0x0d, 0x48, 0x0c, 0x4a, 0x81, 0x69, 0x00, 0x68, 0x50, 0x32, 0x81, 0x42, 0x02, 0xd0, 0xd1, 0x6a, 0x01, 0x29, 0x02, 0xd0, 0x11, 0x78, 0x02, 0x29, 0x02, 0xd1, 0x07, 0xf0, 0x0a, 0xf9, 0xeb, 0xe7, 0x69, 0x46, 0xf7, 0xf7, 0x5a, 0xfe, 0x3c, 0x00, 0x54, 0x9c, 0x00, 0x00, 0xe7, 0xe7, 0x01, 0x21, 0x00, 0xe0, 0x02, 0x21, 0x18, 0x20, 0xf7, 0xf7, 0x21, 0xfb, 0xe0, 0xe7, 0xa4, 0x6e, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x00, 0x68, 0x17, 0x4d, 0x9a, 0xb0, 0x68, 0x63, 0x08, 0xf0, 0x3e, 0xfa, 0x20, 0x79, 0x14, 0x49, 0x13, 0x4a, 0x50, 0x39, 0x2c, 0x3a, 0x02, 0x28, 0x0a, 0xd1, 0x90, 0x68, 0x80, 0x02, 0xa8, 0x61, 0xc8, 0x68, 0xe8, 0x61, 0x3c, 0x00, 0x90, 0x9c, 0x00, 0x00, 0x02, 0x20, 0x28, 0x72, 0x07, 0xf0, 0xe4, 0xf8, 0x1a, 0xb0, 0xb0, 0xbd, 0x03, 0x1c, 0x00, 0x20, 0x00, 0x2b, 0x0b, 0xd1, 0x52, 0x68, 0x92, 0x02, 0xaa, 0x61, 0x0a, 0x1c, 0x89, 0x68, 0xe9, 0x61, 0x28, 0x72, 0x10, 0x68, 0x69, 0x46, 0xf7, 0xf7, 0x27, 0xfe, 0xed, 0xe7, 0xa8, 0x61, 0x01, 0x20, 0x28, 0x72, 0x28, 0x70, 0x00, 0x20, 0x06, 0xf0, 0x7d, 0xfa, 0xe5, 0xe7, 0x3c, 0x00, 0xcc, 0x9c, 0x00, 0x00, 0xf4, 0x6e, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x21, 0x07, 0x20, 0xf7, 0xf7, 0xe1, 0xfa, 0x80, 0xbd, 0x70, 0x47, 0x00, 0x00, 0xf8, 0xb5, 0x00, 0x24, 0x19, 0x4a, 0x00, 0x26, 0xd5, 0x68, 0x11, 0x68, 0x04, 0x35, 0x08, 0x1c, 0x91, 0x60, 0x02, 0xe0, 0x01, 0x1c, 0x40, 0x19, 0x08, 0x60, 0x53, 0x68, 0x83, 0x42, 0xf9, 0xd8, 0x3c, 0x00, 0x08, 0x9d, 0x00, 0x00, 0x01, 0x34, 0x10, 0x32, 0x03, 0x2c, 0x0e, 0x60, 0xee, 0xd3, 0xf6, 0xf7, 0xf1, 0xff, 0x10, 0x48, 0x10, 0x49, 0x12, 0x4c, 0x08, 0x60, 0x10, 0x49, 0x00, 0x20, 0x01, 0x22, 0x19, 0x23, 0x5b, 0x01, 0x0c, 0x25, 0x43, 0x43, 0x1b, 0x19, 0x45, 0x43, 0x4a, 0x51, 0x1f, 0x1c, 0x6d, 0x18, 0xab, 0x60, 0x6b, 0x60, 0x00, 0x25, 0x1e, 0x1c, 0x14, 0x36, 0x9e, 0x60, 0x33, 0x1c, 0x3c, 0x00, 0x44, 0x9d, 0x00, 0x00, 0x01, 0x35, 0x27, 0x2d, 0xf8, 0xdb, 0x01, 0x30, 0x03, 0x28, 0x9f, 0x60, 0xe8, 0xdb, 0xf8, 0xbd, 0x20, 0x57, 0x01, 0x00, 0x14, 0xc8, 0x01, 0x00, 0xb4, 0xcf, 0x01, 0x00, 0x18, 0xd9, 0x01, 0x00, 0xb8, 0xcf, 0x01, 0x00, 0xb0, 0xb5, 0x07, 0x4c, 0x25, 0x1c, 0xc0, 0x35, 0x28, 0x6b, 0x1e, 0x21, 0x00, 0xf0, 0xf2, 0xf9, 0xa2, 0x6b, 0x20, 0x1c, 0xdc, 0x30, 0x29, 0x6b, 0x3c, 0x00, 0x80, 0x9d, 0x00, 0x00, 0x00, 0xf0, 0xb6, 0xf9, 0xb0, 0xbd, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x00, 0x20, 0x10, 0x22, 0x10, 0xb5, 0x0a, 0x49, 0x05, 0xe0, 0x0c, 0x23, 0x43, 0x43, 0x5c, 0x18, 0x0c, 0x34, 0xcc, 0x50, 0x01, 0x30, 0x0f, 0x28, 0xf7, 0xd3, 0x0c, 0x23, 0x58, 0x43, 0x09, 0x50, 0x04, 0x48, 0x41, 0x60, 0x01, 0x60, 0x02, 0x82, 0x00, 0x21, 0x81, 0x60, 0xc1, 0x60, 0x10, 0xbd, 0x3c, 0x00, 0xbc, 0x9d, 0x00, 0x00, 0x84, 0xe2, 0x01, 0x00, 0x44, 0xe3, 0x01, 0x00, 0x10, 0xb5, 0x08, 0x4c, 0xa0, 0x6a, 0x00, 0x28, 0x03, 0xd1, 0x07, 0x48, 0xf9, 0xf7, 0xe8, 0xfe, 0xa0, 0x62, 0x04, 0x48, 0x44, 0x30, 0x00, 0x68, 0x01, 0x21, 0xf9, 0xf7, 0x95, 0xfc, 0x60, 0x62, 0x10, 0xbd, 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, 0xcd, 0x26, 0x01, 0x00, 0xff, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x1e, 0x1c, 0x3c, 0x00, 0xf8, 0x9d, 0x00, 0x00, 0x81, 0xb0, 0x0a, 0x9f, 0x1c, 0x21, 0xf6, 0xf7, 0x4d, 0xfb, 0x03, 0x98, 0xa0, 0x61, 0x25, 0x60, 0x25, 0x61, 0x26, 0x81, 0xa6, 0x82, 0xe7, 0x60, 0x05, 0xb0, 0xf0, 0xbd, 0x70, 0xb5, 0x0d, 0x1c, 0xa4, 0x21, 0x04, 0x1c, 0x08, 0x30, 0xf6, 0xf7, 0x3d, 0xfb, 0x20, 0x1c, 0x44, 0x30, 0x06, 0x22, 0x29, 0x1c, 0xf6, 0xf7, 0x65, 0xfb, 0x18, 0x48, 0x3c, 0x23, 0x41, 0x1c, 0x3c, 0x00, 0x34, 0x9e, 0x00, 0x00, 0x61, 0x62, 0x41, 0x78, 0x59, 0x43, 0x09, 0x18, 0x89, 0x7a, 0x06, 0x29, 0x01, 0xd1, 0xa0, 0x62, 0x02, 0xe0, 0x21, 0x1c, 0x4d, 0x31, 0xa1, 0x62, 0x41, 0x78, 0x3c, 0x23, 0x59, 0x43, 0x08, 0x18, 0x04, 0x30, 0x0f, 0x49, 0x20, 0x62, 0x0b, 0x88, 0x00, 0x2b, 0x15, 0xd0, 0xac, 0x20, 0x00, 0x5d, 0x0b, 0x4a, 0x18, 0x32, 0x00, 0x02, 0x80, 0x18, 0xb0, 0x30, 0xe0, 0x60, 0x3c, 0x00, 0x70, 0x9e, 0x00, 0x00, 0x8d, 0x68, 0x00, 0x20, 0x08, 0xe0, 0xe2, 0x68, 0xc1, 0x00, 0x54, 0x50, 0xe6, 0x68, 0x82, 0x00, 0x52, 0x19, 0x71, 0x18, 0x4a, 0x60, 0x01, 0x30, 0x98, 0x42, 0xf4, 0xdb, 0x70, 0xbd, 0x00, 0x00, 0x68, 0x61, 0x01, 0x00, 0x58, 0x75, 0x01, 0x00, 0x1f, 0xb5, 0x04, 0x1c, 0x60, 0x34, 0x61, 0x7a, 0x03, 0x1c, 0x80, 0x6a, 0x08, 0x4a, 0x02, 0x91, 0x01, 0x90, 0x03, 0x92, 0x3c, 0x00, 0xac, 0x9e, 0x00, 0x00, 0xe2, 0x79, 0x18, 0x1c, 0x20, 0x30, 0x00, 0x92, 0x44, 0x7b, 0x82, 0x7b, 0x5e, 0x20, 0xc1, 0x5a, 0x18, 0x69, 0x04, 0x30, 0x23, 0x1c, 0x02, 0xf0, 0x7f, 0xfe, 0x1f, 0xbd, 0x39, 0x4e, 0x00, 0x00, 0xb0, 0xb5, 0x0b, 0x1c, 0x01, 0x88, 0x69, 0x20, 0xc0, 0x5c, 0x86, 0xb0, 0x0e, 0x4a, 0x04, 0x91, 0x03, 0x90, 0x05, 0x92, 0x0d, 0x4d, 0x59, 0x6a, 0x9a, 0x6a, 0x2d, 0x68, 0x3c, 0x00, 0xe8, 0x9e, 0x00, 0x00, 0x01, 0x24, 0x00, 0x2d, 0x00, 0xd0, 0x04, 0x1c, 0x0a, 0x48, 0x00, 0x5d, 0x01, 0x91, 0x02, 0x92, 0x00, 0x90, 0x18, 0x1c, 0x20, 0x30, 0x44, 0x7b, 0x82, 0x7b, 0x5e, 0x20, 0xc1, 0x5a, 0x18, 0x69, 0x04, 0x30, 0x23, 0x1c, 0x02, 0xf0, 0xa4, 0xfe, 0x06, 0xb0, 0xb0, 0xbd, 0x51, 0x4f, 0x00, 0x00, 0x18, 0x67, 0x01, 0x00, 0x0a, 0x61, 0x01, 0x00, 0x01, 0x89, 0x8a, 0x1c, 0x3c, 0x00, 0x24, 0x9f, 0x00, 0x00, 0x02, 0x81, 0x02, 0x68, 0x02, 0x3a, 0x02, 0x60, 0x08, 0x0a, 0x09, 0x02, 0x08, 0x43, 0x10, 0x80, 0x70, 0x47, 0x00, 0x00, 0x70, 0xb5, 0x05, 0x1c, 0x08, 0x78, 0x0e, 0x1c, 0xff, 0x28, 0x14, 0xd0, 0x71, 0x78, 0x02, 0x31, 0x00, 0x20, 0xf7, 0xf7, 0x45, 0xfb, 0x04, 0x1c, 0x02, 0x89, 0x00, 0x68, 0x31, 0x1c, 0xf6, 0xf7, 0xcf, 0xfa, 0x00, 0x2d, 0x06, 0xd0, 0x28, 0x1c, 0x3c, 0x00, 0x60, 0x9f, 0x00, 0x00, 0xf7, 0xf7, 0x34, 0xfb, 0x21, 0x1c, 0xf7, 0xf7, 0x57, 0xfa, 0x00, 0xe0, 0x25, 0x1c, 0x28, 0x1c, 0x70, 0xbd, 0x00, 0x00, 0xff, 0xb5, 0x0f, 0x1c, 0x1e, 0x1c, 0x04, 0x1c, 0x98, 0x1c, 0x01, 0x04, 0x09, 0x0c, 0x00, 0x20, 0x81, 0xb0, 0xf7, 0xf7, 0x27, 0xfb, 0x05, 0x1c, 0x00, 0x68, 0x00, 0x2c, 0x38, 0x60, 0x03, 0x99, 0x01, 0x70, 0x38, 0x68, 0x46, 0x70, 0x06, 0xd0, 0x3c, 0x00, 0x9c, 0x9f, 0x00, 0x00, 0x20, 0x1c, 0xf7, 0xf7, 0x15, 0xfb, 0x29, 0x1c, 0xf7, 0xf7, 0x38, 0xfa, 0x00, 0xe0, 0x2c, 0x1c, 0x20, 0x1c, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x10, 0x48, 0x04, 0x68, 0x04, 0x60, 0x0f, 0x49, 0x20, 0x20, 0x08, 0x60, 0xa0, 0x05, 0x0e, 0x4e, 0x02, 0xd5, 0x70, 0x6a, 0xf6, 0xf7, 0x05, 0xfa, 0xe0, 0x01, 0x02, 0xd5, 0x30, 0x6e, 0xf6, 0xf7, 0x00, 0xfa, 0x3c, 0x00, 0xd8, 0x9f, 0x00, 0x00, 0x0a, 0x48, 0x04, 0x40, 0x00, 0x25, 0x07, 0xe0, 0xe0, 0x07, 0x03, 0xd5, 0xa8, 0x00, 0x30, 0x58, 0xf6, 0xf7, 0xf6, 0xf9, 0x01, 0x35, 0x64, 0x08, 0x00, 0x2c, 0xf5, 0xd1, 0x70, 0xbd, 0x00, 0x00, 0x00, 0x40, 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0x30, 0x74, 0x01, 0x00, 0xff, 0xfd, 0xff, 0xfe, 0x80, 0xb5, 0x07, 0x21, 0x80, 0x20, 0xf7, 0xf7, 0x49, 0xf9, 0x80, 0xbd, 0x3c, 0x00, 0x14, 0xa0, 0x00, 0x00, 0xf8, 0xb5, 0x14, 0x4b, 0x82, 0x00, 0x9c, 0x58, 0xca, 0x06, 0x01, 0x27, 0x39, 0x1c, 0xd2, 0x0e, 0x91, 0x40, 0x11, 0x4a, 0x11, 0x60, 0x11, 0x4e, 0x40, 0x00, 0x85, 0x19, 0x15, 0xe0, 0x60, 0x60, 0x20, 0x7b, 0xc1, 0x00, 0x89, 0x19, 0x10, 0x31, 0x0a, 0x78, 0x0d, 0x23, 0x9a, 0x43, 0x0a, 0x70, 0x39, 0x1c, 0x81, 0x40, 0x31, 0x73, 0x07, 0x49, 0x00, 0x01, 0x08, 0x31, 0x3c, 0x00, 0x50, 0xa0, 0x00, 0x00, 0x40, 0x18, 0x08, 0x4a, 0x41, 0x68, 0x42, 0x60, 0x80, 0x68, 0xf6, 0xf7, 0xbe, 0xf9, 0x28, 0x7b, 0x00, 0x28, 0xe6, 0xd1, 0xf8, 0xbd, 0x00, 0x00, 0xa4, 0x73, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, 0x00, 0x60, 0x07, 0x00, 0xd1, 0x75, 0x00, 0x00, 0x03, 0x49, 0x01, 0x20, 0x09, 0x7a, 0x00, 0x29, 0x00, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x04, 0x7a, 0x01, 0x00, 0x3c, 0x00, 0x8c, 0xa0, 0x00, 0x00, 0x03, 0x49, 0x01, 0x20, 0x89, 0x7a, 0x00, 0x29, 0x00, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, 0xb0, 0xb5, 0x00, 0x24, 0xfa, 0xf7, 0x76, 0xfc, 0x00, 0x28, 0x14, 0xd0, 0x01, 0x24, 0x08, 0xf0, 0x7d, 0xfe, 0x0a, 0x4d, 0x0a, 0x4b, 0x00, 0x21, 0x5a, 0x18, 0xa0, 0x32, 0x12, 0x78, 0x10, 0x2a, 0x06, 0xd3, 0x8a, 0x00, 0xd2, 0x18, 0x92, 0x6f, 0x3c, 0x00, 0xc8, 0xa0, 0x00, 0x00, 0x82, 0x1a, 0xaa, 0x42, 0x00, 0xd2, 0x00, 0x24, 0x01, 0x31, 0x03, 0x29, 0xf0, 0xd3, 0x20, 0x1c, 0xb0, 0xbd, 0x00, 0x00, 0x8b, 0x08, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x01, 0x48, 0xc0, 0x68, 0x70, 0x47, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x70, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x16, 0x1c, 0xfd, 0xf7, 0x2e, 0xfe, 0x00, 0x20, 0xe0, 0x60, 0x26, 0x61, 0xa5, 0x60, 0x3c, 0x00, 0x04, 0xa1, 0x00, 0x00, 0x70, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x17, 0x1c, 0x0e, 0x1c, 0x04, 0x1c, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x2e, 0x01, 0xd1, 0xf7, 0xf7, 0xf2, 0xf8, 0xa0, 0x68, 0x07, 0xf0, 0x49, 0xf9, 0x05, 0x1c, 0x01, 0xd1, 0xf7, 0xf7, 0xeb, 0xf8, 0x29, 0x1c, 0x6e, 0x60, 0xaf, 0x60, 0x20, 0x1c, 0xfd, 0xf7, 0xfd, 0xfd, 0xe0, 0x68, 0x41, 0x1c, 0xe1, 0x60, 0x00, 0x28, 0x03, 0xd1, 0x3c, 0x00, 0x40, 0xa1, 0x00, 0x00, 0x05, 0x48, 0x21, 0x69, 0x05, 0xf0, 0x2c, 0xf9, 0x20, 0x68, 0xa8, 0x42, 0x02, 0xd1, 0x38, 0x1c, 0xf6, 0xf7, 0x48, 0xf9, 0xf8, 0xbd, 0x00, 0x00, 0xc4, 0x60, 0x01, 0x00, 0x00, 0x22, 0x01, 0x39, 0x10, 0xb5, 0x05, 0xe0, 0x0c, 0x23, 0x53, 0x43, 0x1c, 0x18, 0x0c, 0x34, 0xc4, 0x50, 0x01, 0x32, 0x8a, 0x42, 0xf7, 0xd3, 0x00, 0x21, 0x0c, 0x23, 0x5a, 0x43, 0x81, 0x50, 0x3c, 0x00, 0x7c, 0xa1, 0x00, 0x00, 0x10, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x01, 0xd1, 0xf7, 0xf7, 0xbb, 0xf8, 0x20, 0x1c, 0xfd, 0xf7, 0xda, 0xfd, 0x01, 0x1c, 0x85, 0x68, 0xa0, 0x68, 0x07, 0xf0, 0x09, 0xf9, 0xe0, 0x68, 0x01, 0x38, 0xe0, 0x60, 0x03, 0xd1, 0x06, 0x48, 0x21, 0x69, 0x05, 0xf0, 0xe7, 0xf8, 0x21, 0x68, 0x00, 0x29, 0x03, 0xd0, 0x88, 0x68, 0x49, 0x68, 0xf6, 0xf7, 0x11, 0xf9, 0x3c, 0x00, 0xb8, 0xa1, 0x00, 0x00, 0x28, 0x1c, 0xb0, 0xbd, 0xc4, 0x60, 0x01, 0x00, 0x01, 0x21, 0x00, 0x28, 0x8c, 0xb5, 0x00, 0xd1, 0x00, 0x21, 0x0e, 0x20, 0x09, 0xf0, 0x32, 0xfa, 0x83, 0x20, 0x00, 0xab, 0x18, 0x80, 0x00, 0x20, 0x04, 0xf0, 0x0c, 0xf8, 0x01, 0x90, 0x68, 0x46, 0x03, 0xf0, 0x7a, 0xf9, 0x8c, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x08, 0xf0, 0xdf, 0xfd, 0x06, 0x49, 0x0a, 0x89, 0x06, 0x49, 0x3c, 0x00, 0xf4, 0xa1, 0x00, 0x00, 0x09, 0x6e, 0x41, 0x1a, 0x0b, 0x0c, 0x59, 0x18, 0x89, 0x1a, 0x09, 0x04, 0x09, 0x0c, 0x40, 0x1a, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x90, 0x07, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x88, 0x7e, 0x0d, 0x1c, 0x20, 0x28, 0x03, 0xd9, 0x03, 0x21, 0x18, 0x20, 0xf7, 0xf7, 0x40, 0xf8, 0x00, 0x26, 0x26, 0x76, 0xa8, 0x7e, 0x29, 0x1c, 0x1b, 0x31, 0x60, 0x76, 0x3c, 0x00, 0x30, 0xa2, 0x00, 0x00, 0x20, 0x1c, 0x1d, 0x30, 0xaa, 0x7e, 0xf6, 0xf7, 0x5f, 0xf9, 0x68, 0x68, 0x29, 0x1c, 0x60, 0x60, 0xa8, 0x68, 0x13, 0x31, 0xa0, 0x60, 0xa8, 0x7b, 0x06, 0x22, 0x20, 0x73, 0xe8, 0x7b, 0x60, 0x73, 0x28, 0x7c, 0xa0, 0x73, 0x68, 0x7c, 0xe0, 0x73, 0xa8, 0x89, 0x20, 0x82, 0xa8, 0x7c, 0xe0, 0x76, 0x26, 0x77, 0x20, 0x1c, 0x12, 0x30, 0xa6, 0x76, 0xf6, 0xf7, 0x46, 0xf9, 0x3c, 0x00, 0x6c, 0xa2, 0x00, 0x00, 0x60, 0x68, 0x43, 0x1c, 0x1d, 0xd0, 0x11, 0x4d, 0x6d, 0x61, 0x28, 0x68, 0x00, 0x28, 0x1a, 0xd0, 0x22, 0x7b, 0x01, 0x1c, 0x0b, 0x7b, 0x9a, 0x42, 0x01, 0xd3, 0x20, 0x60, 0x14, 0xe0, 0x0b, 0x1c, 0x09, 0x68, 0x00, 0x29, 0x0b, 0xd0, 0x0e, 0x7b, 0xb2, 0x42, 0x08, 0xd2, 0x0b, 0x68, 0x00, 0x2b, 0xf0, 0xd0, 0x1e, 0x7b, 0xb2, 0x42, 0xed, 0xd3, 0x23, 0x60, 0x0c, 0x60, 0x3c, 0x00, 0xa8, 0xa2, 0x00, 0x00, 0x01, 0xe0, 0x21, 0x60, 0x1c, 0x60, 0x00, 0x20, 0x70, 0xbd, 0x26, 0x60, 0x2c, 0x60, 0xfa, 0xe7, 0xa4, 0x6e, 0x01, 0x00, 0x13, 0x4a, 0xb0, 0xb5, 0x51, 0x68, 0x01, 0x24, 0x00, 0x29, 0x1e, 0xd0, 0x13, 0x1d, 0xd1, 0x61, 0x13, 0x62, 0x43, 0x68, 0x04, 0xe0, 0x10, 0x62, 0x00, 0x68, 0xd0, 0x61, 0x00, 0x28, 0x14, 0xd0, 0xd0, 0x69, 0x45, 0x68, 0x9d, 0x42, 0xf6, 0xd1, 0x3c, 0x00, 0xe4, 0xa2, 0x00, 0x00, 0x10, 0x6a, 0x81, 0x42, 0x04, 0xd1, 0x51, 0x60, 0xd0, 0x69, 0x00, 0x68, 0x08, 0x60, 0x02, 0xe0, 0xd1, 0x69, 0x09, 0x68, 0x01, 0x60, 0xd0, 0x69, 0xfc, 0xf7, 0xce, 0xff, 0x00, 0x28, 0x00, 0xd0, 0x00, 0x24, 0x20, 0x1c, 0xb0, 0xbd, 0x00, 0x00, 0xa4, 0x6e, 0x01, 0x00, 0xb0, 0xb5, 0x17, 0x4d, 0x01, 0x24, 0x29, 0x68, 0x00, 0x29, 0x27, 0xd0, 0x6d, 0x61, 0x29, 0x61, 0x3c, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x43, 0x68, 0x04, 0xe0, 0x68, 0x61, 0x00, 0x68, 0x28, 0x61, 0x00, 0x28, 0x1d, 0xd0, 0x28, 0x69, 0x42, 0x68, 0x9a, 0x42, 0xf6, 0xd1, 0xaa, 0x69, 0x2b, 0x69, 0x9a, 0x42, 0x00, 0xd1, 0xa9, 0x61, 0x6a, 0x69, 0x91, 0x42, 0x03, 0xd1, 0x29, 0x60, 0x00, 0x68, 0x08, 0x60, 0x06, 0xe0, 0x00, 0x68, 0x10, 0x60, 0x28, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x07, 0xf0, 0xcc, 0xfe, 0x3c, 0x00, 0x5c, 0xa3, 0x00, 0x00, 0x28, 0x69, 0xfc, 0xf7, 0x9d, 0xff, 0x00, 0x28, 0x02, 0xd0, 0x00, 0x24, 0x00, 0xe0, 0x01, 0x24, 0x20, 0x1c, 0xb0, 0xbd, 0xa4, 0x6e, 0x01, 0x00, 0xb0, 0xb5, 0x05, 0x1c, 0x07, 0x48, 0x44, 0x68, 0x07, 0xe0, 0x21, 0x1c, 0x44, 0x31, 0x28, 0x1c, 0x00, 0xf0, 0xd6, 0xfc, 0x00, 0x28, 0x02, 0xd1, 0x64, 0x68, 0x00, 0x2c, 0xf5, 0xd1, 0x20, 0x1c, 0xb0, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xa3, 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, 0x70, 0xb5, 0x0d, 0x1c, 0x14, 0x1c, 0x00, 0x28, 0x0b, 0x4e, 0x08, 0xd0, 0x70, 0x6e, 0x06, 0x23, 0x58, 0x43, 0x02, 0x04, 0x12, 0x0c, 0x31, 0x1c, 0x28, 0x1c, 0x22, 0x80, 0x07, 0xe0, 0x21, 0x88, 0x06, 0x20, 0xf6, 0xf7, 0xa7, 0xf9, 0x70, 0x66, 0x22, 0x88, 0x29, 0x1c, 0x30, 0x1c, 0xf6, 0xf7, 0x95, 0xf8, 0x01, 0x20, 0x70, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0xd4, 0xa3, 0x00, 0x00, 0x10, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x03, 0x28, 0x03, 0xd8, 0x04, 0x4a, 0xc0, 0x00, 0x11, 0x50, 0x80, 0xbd, 0x01, 0x21, 0x26, 0x20, 0xf6, 0xf7, 0x5b, 0xff, 0x80, 0xbd, 0x7c, 0x79, 0x01, 0x00, 0xb0, 0xb5, 0x05, 0x1c, 0xc0, 0x68, 0x01, 0x89, 0x39, 0x29, 0x39, 0xd3, 0x04, 0x68, 0xa0, 0x79, 0x88, 0x28, 0x35, 0xd1, 0xe0, 0x79, 0x8e, 0x28, 0x32, 0xd1, 0x20, 0x7a, 0x3c, 0x00, 0x10, 0xa4, 0x00, 0x00, 0x01, 0x28, 0x2f, 0xd1, 0x60, 0x7a, 0x03, 0x28, 0x2c, 0xd1, 0x20, 0x7b, 0x02, 0x28, 0x01, 0xd0, 0xfe, 0x28, 0x27, 0xd1, 0x60, 0x7b, 0x1d, 0x21, 0x08, 0x40, 0x01, 0x28, 0x22, 0xd1, 0xa0, 0x7b, 0xc8, 0x21, 0x08, 0x40, 0x08, 0x28, 0x1d, 0xd1, 0xa8, 0x1d, 0xfb, 0xf7, 0xe1, 0xf9, 0x00, 0x28, 0x18, 0xd0, 0x19, 0x20, 0x21, 0x5c, 0x00, 0x29, 0x14, 0xd1, 0x01, 0x30, 0x3c, 0x00, 0x4c, 0xa4, 0x00, 0x00, 0x39, 0x28, 0xf9, 0xdb, 0x68, 0x8b, 0x04, 0x21, 0x08, 0x43, 0x68, 0x83, 0x03, 0xf0, 0xd6, 0xfe, 0x00, 0x28, 0x09, 0xd1, 0x00, 0x23, 0x00, 0x22, 0x26, 0x20, 0x04, 0x49, 0x09, 0xf0, 0x92, 0xf9, 0x03, 0x48, 0x00, 0x68, 0x01, 0xf0, 0x84, 0xf9, 0xb0, 0xbd, 0x00, 0x00, 0x50, 0xc3, 0x00, 0x00, 0x0c, 0x79, 0x01, 0x00, 0xb0, 0xb5, 0x08, 0x4c, 0xa3, 0x68, 0x01, 0x33, 0x3c, 0x00, 0x88, 0xa4, 0x00, 0x00, 0xa3, 0x60, 0x0c, 0x1c, 0x09, 0xd0, 0x25, 0x68, 0x00, 0x2d, 0x03, 0xd0, 0x23, 0x7a, 0x61, 0x68, 0xf5, 0xf7, 0xa3, 0xff, 0x20, 0x1c, 0xf7, 0xf7, 0xa9, 0xf9, 0xb0, 0xbd, 0x94, 0x79, 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0x01, 0x89, 0x05, 0x68, 0x08, 0x29, 0x53, 0xd3, 0x06, 0x22, 0x28, 0x1c, 0x55, 0x49, 0xf5, 0xf7, 0x9e, 0xff, 0x00, 0x28, 0x37, 0xd1, 0x3c, 0x00, 0xc4, 0xa4, 0x00, 0x00, 0xe9, 0x88, 0x52, 0x4e, 0x04, 0x3e, 0x81, 0x29, 0x24, 0xd1, 0xe5, 0x68, 0x29, 0x68, 0x08, 0x7a, 0x4a, 0x7a, 0x00, 0x02, 0x80, 0x18, 0x00, 0x04, 0x00, 0x0c, 0x42, 0x0b, 0x00, 0x05, 0x00, 0x0d, 0xe2, 0x75, 0x20, 0x83, 0x4b, 0x89, 0x00, 0x20, 0x42, 0x00, 0xb2, 0x5a, 0x9a, 0x42, 0x06, 0xd1, 0x28, 0x89, 0x0c, 0x38, 0x02, 0x0a, 0x00, 0x02, 0x10, 0x43, 0x48, 0x81, 0x3c, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x02, 0xe0, 0x01, 0x30, 0x02, 0x28, 0xf1, 0xd3, 0xe0, 0x68, 0x01, 0x89, 0x0a, 0x39, 0x01, 0x81, 0xe0, 0x68, 0x01, 0x68, 0x0a, 0x31, 0x1c, 0xe0, 0x00, 0x22, 0x00, 0x20, 0x43, 0x00, 0xf3, 0x5a, 0x8b, 0x42, 0x01, 0xd1, 0x01, 0x22, 0x02, 0xe0, 0x01, 0x30, 0x02, 0x28, 0xf6, 0xd3, 0x00, 0x2a, 0x11, 0xd1, 0x07, 0xe0, 0x36, 0x49, 0x06, 0x22, 0x06, 0x31, 0x28, 0x1c, 0x3c, 0x00, 0x3c, 0xa5, 0x00, 0x00, 0xf5, 0xf7, 0x5e, 0xff, 0x00, 0x28, 0x08, 0xd1, 0xe0, 0x68, 0x01, 0x89, 0x06, 0x39, 0x01, 0x81, 0xe0, 0x68, 0x01, 0x68, 0x06, 0x31, 0x01, 0x60, 0x10, 0xe0, 0xe0, 0x68, 0xff, 0xf7, 0xe2, 0xfc, 0x0c, 0xe0, 0x02, 0x31, 0x01, 0x81, 0xe0, 0x68, 0x01, 0x68, 0x02, 0x39, 0x01, 0x60, 0xe0, 0x68, 0x00, 0x89, 0x02, 0x38, 0x02, 0x0a, 0x00, 0x02, 0x10, 0x43, 0x08, 0x80, 0x3c, 0x00, 0x78, 0xa5, 0x00, 0x00, 0xe0, 0x68, 0x03, 0x25, 0x02, 0x89, 0x01, 0x68, 0x24, 0x4e, 0x02, 0x2a, 0x10, 0xd9, 0x09, 0x88, 0x08, 0x29, 0x05, 0xd0, 0xc1, 0x23, 0xdb, 0x00, 0x99, 0x42, 0x03, 0xd1, 0x01, 0x25, 0x02, 0xe0, 0x00, 0x25, 0x00, 0xe0, 0x02, 0x25, 0xe9, 0x00, 0x71, 0x58, 0x00, 0x29, 0x00, 0xd1, 0x02, 0x25, 0xf7, 0xf7, 0x04, 0xf8, 0xe9, 0x00, 0x89, 0x19, 0x89, 0x88, 0x88, 0x42, 0x3c, 0x00, 0xb4, 0xa5, 0x00, 0x00, 0x00, 0xd9, 0x03, 0x25, 0xa1, 0x1d, 0x20, 0x1c, 0xfd, 0xf7, 0x34, 0xfc, 0x00, 0x28, 0x00, 0xd1, 0x03, 0x25, 0x02, 0x2d, 0x05, 0xd0, 0x03, 0x2d, 0x07, 0xd1, 0xe0, 0x68, 0xf6, 0xf7, 0xe2, 0xff, 0x70, 0xbd, 0x20, 0x1c, 0xfd, 0xf7, 0x1c, 0xfd, 0x70, 0xbd, 0xe0, 0x68, 0x01, 0x89, 0x02, 0x39, 0x01, 0x81, 0xe0, 0x68, 0x01, 0x68, 0x02, 0x31, 0x01, 0x60, 0xe8, 0x00, 0x3c, 0x00, 0xf0, 0xa5, 0x00, 0x00, 0x31, 0x58, 0x20, 0x1c, 0xf5, 0xf7, 0xf1, 0xfe, 0x00, 0x28, 0xef, 0xd1, 0xe0, 0x68, 0x01, 0x89, 0x02, 0x31, 0x01, 0x81, 0xe0, 0x68, 0x01, 0x68, 0x02, 0x39, 0x01, 0x60, 0xe3, 0xe7, 0x00, 0x00, 0x6a, 0x46, 0x01, 0x00, 0x7c, 0x79, 0x01, 0x00, 0x70, 0xb5, 0x0e, 0x1c, 0x04, 0x1c, 0x15, 0x1c, 0xf7, 0xf7, 0x8c, 0xfb, 0x00, 0x28, 0x2a, 0xd0, 0x1b, 0x49, 0x08, 0x68, 0x3c, 0x00, 0x2c, 0xa6, 0x00, 0x00, 0x01, 0x30, 0x08, 0x60, 0x00, 0x2e, 0x0a, 0xd0, 0x01, 0x2e, 0x0b, 0xd0, 0x02, 0x2e, 0x0f, 0xd1, 0x20, 0x1c, 0x04, 0xf0, 0xcd, 0xf8, 0x20, 0x1c, 0xff, 0xf7, 0xd6, 0xfe, 0x0c, 0xe0, 0x08, 0x21, 0xe0, 0x68, 0x02, 0xe0, 0xc1, 0x21, 0xe0, 0x68, 0xc9, 0x00, 0x04, 0xf0, 0x35, 0xf9, 0x03, 0xe0, 0x02, 0x21, 0x26, 0x20, 0xf6, 0xf7, 0x20, 0xfe, 0xe2, 0x7d, 0xe1, 0x6a, 0x3c, 0x00, 0x68, 0xa6, 0x00, 0x00, 0x28, 0x1c, 0xfc, 0xf7, 0x95, 0xfb, 0x20, 0x63, 0x00, 0x20, 0x20, 0x62, 0xa0, 0x62, 0x20, 0x1c, 0x00, 0xf0, 0x6c, 0xfe, 0x70, 0xbd, 0xe0, 0x68, 0xf6, 0xf7, 0x8a, 0xff, 0x00, 0x2d, 0xf9, 0xd0, 0xe3, 0x7d, 0x00, 0x22, 0x01, 0x20, 0xe1, 0x6a, 0xf5, 0xf7, 0xa7, 0xfe, 0x70, 0xbd, 0x00, 0x00, 0x94, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x28, 0x04, 0xd1, 0x05, 0x48, 0x3c, 0x00, 0xa4, 0xa6, 0x00, 0x00, 0x00, 0x68, 0x01, 0xf0, 0x09, 0xf9, 0x80, 0xbd, 0x03, 0x21, 0x26, 0x20, 0xf6, 0xf7, 0xf8, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0x0c, 0x79, 0x01, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x80, 0x79, 0x00, 0x24, 0xc0, 0x07, 0x2d, 0xd5, 0xf0, 0x68, 0x00, 0x68, 0x41, 0x7a, 0x11, 0x29, 0x28, 0xd1, 0xc1, 0x88, 0x0a, 0x0a, 0x09, 0x02, 0x11, 0x43, 0xc9, 0x04, 0x22, 0xd1, 0x01, 0x78, 0x3c, 0x00, 0xe0, 0xa6, 0x00, 0x00, 0x11, 0x4f, 0x09, 0x07, 0x89, 0x0e, 0x08, 0x18, 0x41, 0x88, 0x0a, 0x0a, 0x09, 0x02, 0x11, 0x43, 0x0d, 0x04, 0x2d, 0x0c, 0x43, 0x2d, 0x39, 0x68, 0x01, 0xd1, 0xca, 0x07, 0x0e, 0xd4, 0x44, 0x2d, 0x06, 0xd1, 0xc9, 0x07, 0x04, 0xd5, 0x24, 0x30, 0x00, 0xf0, 0x22, 0xfb, 0x00, 0x28, 0x05, 0xd0, 0x06, 0x48, 0x85, 0x42, 0x06, 0xd1, 0x38, 0x68, 0x80, 0x07, 0x03, 0xd5, 0x3c, 0x00, 0x1c, 0xa7, 0x00, 0x00, 0x01, 0x24, 0xf0, 0x68, 0xf6, 0xf7, 0x3a, 0xff, 0x20, 0x1c, 0xf8, 0xbd, 0x7c, 0x5a, 0x01, 0x00, 0x6c, 0x07, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x28, 0x07, 0xd0, 0x00, 0x21, 0x26, 0x20, 0x08, 0xf0, 0x7b, 0xff, 0x02, 0x48, 0x00, 0x68, 0x01, 0xf0, 0xbb, 0xf8, 0x80, 0xbd, 0x0c, 0x79, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x09, 0x4a, 0x08, 0x1c, 0x51, 0x68, 0x01, 0x31, 0x3c, 0x00, 0x58, 0xa7, 0x00, 0x00, 0x51, 0x60, 0x00, 0x21, 0x21, 0x62, 0xa1, 0x62, 0xe2, 0x7d, 0xe1, 0x6a, 0xfc, 0xf7, 0x18, 0xfb, 0x20, 0x63, 0x20, 0x1c, 0xf7, 0xf7, 0xe6, 0xfa, 0x20, 0x1c, 0x00, 0xf0, 0xef, 0xfd, 0x10, 0xbd, 0x94, 0x79, 0x01, 0x00, 0x0c, 0xb5, 0x02, 0x1c, 0x08, 0x1c, 0x00, 0x21, 0x01, 0x91, 0x00, 0x92, 0x6a, 0x46, 0x01, 0xa9, 0x00, 0xf0, 0x02, 0xf8, 0x0c, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x94, 0xa7, 0x00, 0x00, 0x70, 0xb5, 0x13, 0x68, 0x00, 0x2b, 0x1e, 0xd0, 0x00, 0x26, 0x0b, 0x68, 0x00, 0x2b, 0x02, 0xd1, 0x13, 0x68, 0x1b, 0x68, 0x0b, 0x60, 0x13, 0x68, 0x1c, 0x68, 0x1b, 0x89, 0xe5, 0x18, 0x08, 0xe0, 0x5c, 0x78, 0x1c, 0x19, 0x02, 0x34, 0x0c, 0x60, 0x1c, 0x78, 0x84, 0x42, 0x01, 0xd1, 0x18, 0x1c, 0x70, 0xbd, 0x0b, 0x68, 0xab, 0x42, 0xf3, 0xd3, 0x13, 0x68, 0xdb, 0x68, 0x3c, 0x00, 0xd0, 0xa7, 0x00, 0x00, 0x13, 0x60, 0x0e, 0x60, 0x13, 0x68, 0x00, 0x2b, 0xe1, 0xd1, 0x00, 0x20, 0x70, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x03, 0x1c, 0x20, 0xd0, 0x18, 0x68, 0x1e, 0x89, 0x05, 0x1c, 0x16, 0xe0, 0x04, 0x78, 0xdd, 0x2c, 0x10, 0xd1, 0x84, 0x78, 0x00, 0x2c, 0x0d, 0xd1, 0xc4, 0x78, 0x50, 0x2c, 0x0a, 0xd1, 0x04, 0x79, 0xf2, 0x2c, 0x07, 0xd1, 0x44, 0x79, 0x8c, 0x42, 0x04, 0xd1, 0x3c, 0x00, 0x0c, 0xa8, 0x00, 0x00, 0x02, 0x29, 0x0c, 0xd1, 0x84, 0x79, 0x94, 0x42, 0x09, 0xd0, 0x44, 0x78, 0x20, 0x18, 0x02, 0x30, 0x44, 0x1b, 0xb4, 0x42, 0xe5, 0xdb, 0xdb, 0x68, 0x00, 0x2b, 0xde, 0xd1, 0x00, 0x20, 0x70, 0xbd, 0x04, 0x49, 0x80, 0xb5, 0x0a, 0x78, 0x0a, 0x20, 0x00, 0x2a, 0x00, 0xd0, 0x48, 0x6a, 0x00, 0xf0, 0xd1, 0xf8, 0x80, 0xbd, 0x1c, 0x75, 0x01, 0x00, 0xb0, 0xb5, 0x17, 0x4c, 0x3c, 0x00, 0x48, 0xa8, 0x00, 0x00, 0x20, 0x68, 0x00, 0x28, 0x29, 0xd0, 0x16, 0x4d, 0xe8, 0x69, 0x00, 0x28, 0x25, 0xd1, 0x01, 0xf0, 0x3f, 0xfa, 0x00, 0x28, 0x21, 0xd1, 0xff, 0xf7, 0x41, 0xfc, 0x00, 0x28, 0x1d, 0xd1, 0x20, 0x68, 0xa9, 0x69, 0x40, 0x18, 0x08, 0xf0, 0xd6, 0xf9, 0x00, 0x28, 0x16, 0xd0, 0x02, 0xf0, 0x06, 0xfd, 0x21, 0x68, 0x40, 0x18, 0x08, 0xf0, 0xce, 0xf9, 0x00, 0x28, 0x0e, 0xd0, 0x3c, 0x00, 0x84, 0xa8, 0x00, 0x00, 0x01, 0x20, 0xe8, 0x61, 0x00, 0x22, 0x25, 0x21, 0x80, 0x20, 0x08, 0xf0, 0x8f, 0xff, 0x06, 0x48, 0x29, 0x6a, 0x04, 0xf0, 0x83, 0xfd, 0x01, 0x21, 0x28, 0x6a, 0x00, 0xf0, 0x89, 0xff, 0xb0, 0xbd, 0xe8, 0x59, 0x01, 0x00, 0x1c, 0x75, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x70, 0xb5, 0x05, 0x1c, 0x00, 0x24, 0xfa, 0xf7, 0x0b, 0xff, 0x18, 0x4e, 0x71, 0x6a, 0x40, 0x18, 0x3c, 0x00, 0xc0, 0xa8, 0x00, 0x00, 0x00, 0xf0, 0x8e, 0xf8, 0x00, 0x28, 0x0b, 0xd1, 0x04, 0xf0, 0xfe, 0xfb, 0x00, 0x21, 0x25, 0x20, 0x08, 0xf0, 0xb0, 0xfe, 0x03, 0x22, 0x29, 0x1c, 0x28, 0x1c, 0x00, 0xf0, 0xaf, 0xf8, 0x18, 0xe0, 0x70, 0x6a, 0x44, 0x1e, 0x00, 0xf0, 0x7c, 0xf8, 0x00, 0x28, 0x12, 0xd1, 0x0c, 0x48, 0x31, 0x6a, 0x04, 0xf0, 0x56, 0xfd, 0x01, 0x21, 0x30, 0x6a, 0x00, 0xf0, 0x5c, 0xff, 0x3c, 0x00, 0xfc, 0xa8, 0x00, 0x00, 0x00, 0x20, 0xfa, 0xf7, 0x0d, 0xfe, 0x06, 0xf0, 0x03, 0xf8, 0x00, 0x23, 0x00, 0x22, 0x25, 0x20, 0x05, 0x49, 0x08, 0xf0, 0x3f, 0xff, 0x20, 0x1c, 0x07, 0xf0, 0xfc, 0xfa, 0x70, 0xbd, 0x00, 0x00, 0x1c, 0x75, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x10, 0x27, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x28, 0x07, 0xd0, 0x80, 0x28, 0x0d, 0xd1, 0x00, 0x22, 0x00, 0x21, 0x08, 0x48, 0x3c, 0x00, 0x38, 0xa9, 0x00, 0x00, 0xf8, 0xf7, 0x9a, 0xfe, 0x80, 0xbd, 0x01, 0x29, 0x02, 0xd1, 0x06, 0x49, 0x00, 0x20, 0xc8, 0x61, 0x04, 0xf0, 0xbe, 0xfb, 0x80, 0xbd, 0x05, 0x21, 0x25, 0x20, 0xf6, 0xf7, 0xa7, 0xfc, 0x80, 0xbd, 0x61, 0xa9, 0x00, 0x00, 0x1c, 0x75, 0x01, 0x00, 0x00, 0x21, 0x00, 0x28, 0x80, 0xb5, 0x01, 0xd1, 0x03, 0x48, 0x41, 0x68, 0x01, 0x22, 0x25, 0x20, 0x08, 0xf0, 0x2c, 0xfe, 0x3c, 0x00, 0x74, 0xa9, 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, 0xe8, 0x59, 0x01, 0x00, 0x02, 0x49, 0xc8, 0x68, 0x01, 0x38, 0x48, 0x62, 0x70, 0x47, 0x00, 0x00, 0x1c, 0x75, 0x01, 0x00, 0x38, 0xb5, 0x03, 0x1c, 0x08, 0x1c, 0x19, 0x1c, 0x11, 0x4b, 0x06, 0xd0, 0x01, 0x21, 0x11, 0x80, 0x0a, 0x1c, 0x19, 0x1c, 0xf5, 0xf7, 0xaa, 0xfd, 0x17, 0xe0, 0x0d, 0x4d, 0x01, 0x1c, 0x2c, 0x78, 0x12, 0x88, 0x18, 0x1c, 0x3c, 0x00, 0xb0, 0xa9, 0x00, 0x00, 0xf5, 0xf7, 0xa2, 0xfd, 0x28, 0x78, 0x84, 0x42, 0x0d, 0xd0, 0x00, 0x23, 0x6b, 0x61, 0x00, 0x28, 0x03, 0xd0, 0x00, 0x20, 0x07, 0xf0, 0xa4, 0xfa, 0x05, 0xe0, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, 0x92, 0xf8, 0xf7, 0x23, 0xfc, 0x01, 0x20, 0x38, 0xbd, 0x00, 0x00, 0x1c, 0x75, 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x01, 0x26, 0x08, 0xf0, 0xe1, 0xf9, 0x05, 0x1c, 0x3c, 0x00, 0xec, 0xa9, 0x00, 0x00, 0x00, 0x20, 0xfa, 0xf7, 0x8b, 0xfd, 0x44, 0x43, 0x02, 0xf0, 0x40, 0xfc, 0x02, 0xf0, 0x3e, 0xfc, 0x01, 0x1c, 0x23, 0x1c, 0x00, 0x22, 0x28, 0x1c, 0x08, 0xf0, 0x7c, 0xfa, 0x00, 0x28, 0x13, 0xd1, 0x0a, 0x48, 0x23, 0x1c, 0x00, 0x22, 0x81, 0x69, 0x28, 0x1c, 0x08, 0xf0, 0x73, 0xfa, 0x00, 0x28, 0x0a, 0xd1, 0xf8, 0xf7, 0x19, 0xfc, 0x01, 0x1c, 0x23, 0x1c, 0x00, 0x22, 0x3c, 0x00, 0x28, 0xaa, 0x00, 0x00, 0x28, 0x1c, 0x08, 0xf0, 0x69, 0xfa, 0x00, 0x28, 0x00, 0xd1, 0x00, 0x26, 0x30, 0x1c, 0x70, 0xbd, 0x1c, 0x75, 0x01, 0x00, 0x70, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x16, 0x1c, 0x07, 0xf0, 0x76, 0xf9, 0x00, 0x28, 0x0d, 0xd0, 0xfa, 0xf7, 0x52, 0xfe, 0x00, 0x28, 0x09, 0xd0, 0xff, 0x30, 0x01, 0x30, 0x43, 0x68, 0x00, 0x2b, 0x04, 0xd0, 0x22, 0x1c, 0x29, 0x1c, 0x30, 0x1c, 0x3c, 0x00, 0x64, 0xaa, 0x00, 0x00, 0xf5, 0xf7, 0xbb, 0xfc, 0x70, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x21, 0x1d, 0x20, 0x08, 0xf0, 0xdf, 0xfd, 0x07, 0x4a, 0x07, 0x48, 0x11, 0x69, 0x01, 0x60, 0x51, 0x69, 0x41, 0x60, 0x06, 0x49, 0x49, 0x68, 0x81, 0x60, 0x00, 0x21, 0xc1, 0x60, 0x03, 0xf0, 0x74, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x28, 0x61, 0x01, 0x00, 0x48, 0x75, 0x01, 0x00, 0x90, 0x5c, 0x01, 0x00, 0x3c, 0x00, 0xa0, 0xaa, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x40, 0x6b, 0x00, 0x28, 0x35, 0xd0, 0x1d, 0x4d, 0x00, 0x26, 0x28, 0x78, 0x00, 0x28, 0x24, 0xd0, 0x41, 0x20, 0x00, 0x5d, 0x00, 0x28, 0x03, 0xd1, 0x08, 0xf0, 0x76, 0xf9, 0xa8, 0x61, 0x1b, 0xe0, 0x69, 0x69, 0x01, 0x31, 0x69, 0x61, 0xa8, 0x68, 0x00, 0x28, 0x08, 0xd0, 0x81, 0x42, 0x06, 0xd1, 0x20, 0x69, 0x01, 0x1c, 0x10, 0x31, 0x04, 0x30, 0x3c, 0x00, 0xdc, 0xaa, 0x00, 0x00, 0x82, 0x22, 0xff, 0xf7, 0xad, 0xff, 0x68, 0x68, 0x00, 0x28, 0x0a, 0xd0, 0x69, 0x69, 0x81, 0x42, 0x07, 0xd1, 0x20, 0x69, 0x01, 0x1c, 0x10, 0x31, 0x04, 0x30, 0x02, 0x22, 0xff, 0xf7, 0xa0, 0xff, 0x6e, 0x61, 0x68, 0x78, 0x05, 0x21, 0x08, 0x40, 0x08, 0xd0, 0x07, 0x48, 0x00, 0x78, 0x0e, 0x28, 0x03, 0xd3, 0x60, 0x34, 0xe0, 0x79, 0xfb, 0xf7, 0xcf, 0xff, 0x70, 0xbd, 0x3c, 0x00, 0x18, 0xab, 0x00, 0x00, 0x03, 0x48, 0x06, 0x60, 0x70, 0xbd, 0x00, 0x00, 0x1c, 0x75, 0x01, 0x00, 0x10, 0x67, 0x01, 0x00, 0xd4, 0x7e, 0x01, 0x00, 0x80, 0x02, 0x70, 0x47, 0x14, 0x23, 0x30, 0xb5, 0x09, 0x4d, 0x4b, 0x43, 0x5b, 0x19, 0x5b, 0x68, 0x08, 0x24, 0x00, 0x2b, 0x00, 0xd1, 0x02, 0x24, 0x38, 0x23, 0x5a, 0x43, 0x05, 0x4b, 0x89, 0x00, 0xd2, 0x18, 0x51, 0x5a, 0x02, 0x68, 0x09, 0x19, 0x3c, 0x00, 0x54, 0xab, 0x00, 0x00, 0x51, 0x1a, 0x01, 0x60, 0x30, 0xbd, 0x00, 0x00, 0x74, 0x40, 0x01, 0x00, 0x8c, 0x41, 0x01, 0x00, 0xf8, 0xb5, 0x07, 0x1c, 0x2c, 0x48, 0x14, 0x1c, 0x2c, 0x4a, 0x48, 0x43, 0x86, 0x46, 0x80, 0x18, 0x80, 0x0d, 0x84, 0x46, 0x2b, 0x48, 0x2a, 0x4a, 0x06, 0x26, 0x1d, 0x1c, 0x48, 0x43, 0x4a, 0x43, 0x0e, 0x2f, 0x40, 0xd2, 0x01, 0xa3, 0xdb, 0x5d, 0x5b, 0x00, 0x9f, 0x44, 0x3c, 0x00, 0x90, 0xab, 0x00, 0x00, 0x06, 0x08, 0x0a, 0x0f, 0x14, 0x18, 0x1d, 0x20, 0x27, 0x24, 0x27, 0x2b, 0x2f, 0x31, 0xc8, 0x00, 0x1f, 0xe0, 0x88, 0x00, 0x1d, 0xe0, 0x21, 0x49, 0x70, 0x46, 0x40, 0x18, 0x00, 0x0d, 0x18, 0xe0, 0x1f, 0x4a, 0x80, 0x18, 0x80, 0x0d, 0x40, 0x18, 0x21, 0xe0, 0x1e, 0x48, 0x10, 0x18, 0x00, 0x0d, 0x1d, 0xe0, 0x1d, 0x49, 0x70, 0x46, 0x40, 0x18, 0x40, 0x0d, 0x0a, 0xe0, 0x3c, 0x00, 0xcc, 0xab, 0x00, 0x00, 0x1b, 0x49, 0x40, 0x18, 0x01, 0xe0, 0x1b, 0x48, 0x10, 0x18, 0x40, 0x0d, 0x11, 0xe0, 0x1a, 0x49, 0x40, 0x18, 0x05, 0xe0, 0x60, 0x46, 0x20, 0x80, 0x00, 0x20, 0x16, 0xe0, 0x17, 0x48, 0x10, 0x18, 0x80, 0x0d, 0x06, 0xe0, 0x16, 0x49, 0x02, 0xe0, 0x16, 0x48, 0x48, 0x43, 0x16, 0x49, 0x40, 0x18, 0xc0, 0x0d, 0x03, 0x30, 0x80, 0x08, 0x80, 0x00, 0x20, 0x80, 0x2e, 0x80, 0x3c, 0x00, 0x08, 0xac, 0x00, 0x00, 0xf8, 0xbd, 0xff, 0x21, 0xff, 0x20, 0xf6, 0xf7, 0x49, 0xfb, 0x00, 0x20, 0x20, 0x80, 0x28, 0x80, 0xf6, 0xe7, 0x00, 0x00, 0xd1, 0x45, 0x17, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xe3, 0x38, 0x0e, 0x00, 0x55, 0x55, 0x15, 0x00, 0xff, 0xff, 0x0f, 0x00, 0xa9, 0xaa, 0x2a, 0x01, 0x70, 0x1c, 0x37, 0x00, 0xff, 0xff, 0x1f, 0x00, 0xcb, 0xcc, 0x4c, 0x00, 0x70, 0x1c, 0x47, 0x00, 0x3c, 0x00, 0x44, 0xac, 0x00, 0x00, 0xa9, 0xaa, 0x7a, 0x00, 0x70, 0x1c, 0x67, 0x00, 0xa9, 0xaa, 0xba, 0x00, 0x84, 0xf6, 0x12, 0x00, 0xec, 0x25, 0xb4, 0x00, 0x04, 0x49, 0x00, 0x28, 0x01, 0xd0, 0x09, 0x22, 0x00, 0xe0, 0x14, 0x22, 0x4a, 0x80, 0x48, 0x60, 0x70, 0x47, 0x00, 0x00, 0xa4, 0x69, 0x01, 0x00, 0x80, 0xb5, 0x06, 0x22, 0xf5, 0xf7, 0x40, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0xbc, 0xb5, 0x15, 0x1c, 0x3c, 0x00, 0x80, 0xac, 0x00, 0x00, 0x04, 0x1c, 0x04, 0x31, 0x09, 0x04, 0x09, 0x0c, 0x01, 0xaa, 0x6b, 0x46, 0xff, 0xf7, 0x6a, 0xff, 0x38, 0x20, 0x06, 0x49, 0x68, 0x43, 0x40, 0x18, 0xa1, 0x00, 0x40, 0x5a, 0x00, 0xab, 0x99, 0x88, 0x40, 0x18, 0x19, 0x88, 0x40, 0x18, 0x00, 0x04, 0x00, 0x0c, 0xbc, 0xbd, 0x8c, 0x41, 0x01, 0x00, 0xbc, 0xb5, 0x04, 0x1c, 0x15, 0x1c, 0x01, 0xaa, 0x6b, 0x46, 0xff, 0xf7, 0x3c, 0x00, 0xbc, 0xac, 0x00, 0x00, 0x53, 0xff, 0x38, 0x20, 0x05, 0x49, 0x68, 0x43, 0x40, 0x18, 0xa1, 0x00, 0x40, 0x5a, 0x00, 0xab, 0x99, 0x88, 0x40, 0x18, 0x00, 0x04, 0x00, 0x0c, 0xbc, 0xbd, 0x00, 0x00, 0x8c, 0x41, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x28, 0x0f, 0xd0, 0x00, 0x29, 0x0d, 0xd0, 0x02, 0x78, 0x0b, 0x78, 0x9a, 0x42, 0x09, 0xd1, 0xff, 0x2a, 0x05, 0xd0, 0x42, 0x78, 0x02, 0x32, 0xf5, 0xf7, 0x3c, 0x00, 0xf8, 0xac, 0x00, 0x00, 0x81, 0xfb, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x80, 0xbd, 0x00, 0x20, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x06, 0x22, 0x04, 0x49, 0xf5, 0xf7, 0x75, 0xfb, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x80, 0xbd, 0x00, 0x20, 0x80, 0xbd, 0x00, 0x00, 0x5e, 0x40, 0x01, 0x00, 0x01, 0x1c, 0x49, 0x78, 0x01, 0x20, 0x00, 0x29, 0x00, 0xd0, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0x34, 0xad, 0x00, 0x00, 0x80, 0xb5, 0x06, 0x22, 0xf5, 0xf7, 0x60, 0xfb, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x80, 0xbd, 0x00, 0x20, 0x80, 0xbd, 0x80, 0xb5, 0xff, 0xf7, 0xc7, 0xff, 0x80, 0xbd, 0x80, 0xb5, 0x06, 0x22, 0x04, 0x49, 0xf5, 0xf7, 0x51, 0xfb, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x80, 0xbd, 0x00, 0x20, 0x80, 0xbd, 0x00, 0x00, 0x12, 0x61, 0x01, 0x00, 0x01, 0x1c, 0x80, 0x20, 0x3c, 0x00, 0x70, 0xad, 0x00, 0x00, 0x81, 0x43, 0x8a, 0x08, 0x0e, 0x20, 0x1c, 0x2a, 0x10, 0xb5, 0x06, 0xd2, 0x03, 0x4c, 0x52, 0x00, 0xa3, 0x5c, 0x8b, 0x42, 0x01, 0xd1, 0x10, 0x19, 0x40, 0x78, 0x10, 0xbd, 0xfc, 0x41, 0x01, 0x00, 0x14, 0x23, 0x02, 0x49, 0x58, 0x43, 0x40, 0x18, 0x40, 0x68, 0x70, 0x47, 0x74, 0x40, 0x01, 0x00, 0x20, 0x22, 0x01, 0x1c, 0x80, 0xb5, 0x02, 0x48, 0xf5, 0xf7, 0x52, 0xfd, 0x3c, 0x00, 0xac, 0xad, 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x48, 0x61, 0x01, 0x00, 0x08, 0x06, 0x00, 0x0e, 0x02, 0x28, 0x01, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x01, 0x20, 0x70, 0x47, 0x00, 0x29, 0x0c, 0xd0, 0x07, 0x49, 0x09, 0x68, 0x00, 0x29, 0x08, 0xd0, 0x14, 0x23, 0x06, 0x49, 0x58, 0x43, 0x40, 0x18, 0xc0, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xad, 0x00, 0x00, 0xac, 0x69, 0x01, 0x00, 0x74, 0x40, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x06, 0x22, 0x01, 0x1c, 0x04, 0x48, 0xf5, 0xf7, 0x7d, 0xfb, 0x06, 0x22, 0x21, 0x1c, 0x03, 0x48, 0xf5, 0xf7, 0x78, 0xfb, 0x10, 0xbd, 0x00, 0x00, 0x12, 0x61, 0x01, 0x00, 0x40, 0x80, 0x07, 0x00, 0x00, 0x29, 0x01, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x38, 0x23, 0x5a, 0x43, 0x07, 0x4b, 0xd2, 0x18, 0x3c, 0x00, 0x24, 0xae, 0x00, 0x00, 0x83, 0x00, 0xd2, 0x5a, 0x14, 0x23, 0x58, 0x43, 0x05, 0x4b, 0xc0, 0x18, 0x40, 0x88, 0x10, 0x18, 0x08, 0x1a, 0x0a, 0x38, 0x00, 0x04, 0x00, 0x0c, 0x70, 0x47, 0x00, 0x00, 0x8c, 0x41, 0x01, 0x00, 0x74, 0x40, 0x01, 0x00, 0xf8, 0xb5, 0x07, 0x1c, 0x08, 0x1c, 0x16, 0x1c, 0x1c, 0x1c, 0x19, 0x1c, 0x00, 0xf0, 0x5a, 0xf8, 0x05, 0x1c, 0x14, 0x35, 0x22, 0x1c, 0x31, 0x1c, 0x3c, 0x00, 0x60, 0xae, 0x00, 0x00, 0x38, 0x1c, 0xff, 0xf7, 0x0b, 0xff, 0x28, 0x18, 0x00, 0x04, 0x00, 0x0c, 0xf8, 0xbd, 0x00, 0x00, 0x00, 0xb5, 0x00, 0xf0, 0x4b, 0xf8, 0x0a, 0x30, 0x00, 0x04, 0x00, 0x0c, 0x00, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x07, 0x1c, 0x08, 0x1c, 0x16, 0x1c, 0x1c, 0x1c, 0x19, 0x1c, 0x00, 0xf0, 0x3e, 0xf8, 0x45, 0x00, 0x1e, 0x35, 0x22, 0x1c, 0x31, 0x1c, 0x38, 0x1c, 0xff, 0xf7, 0x3c, 0x00, 0x9c, 0xae, 0x00, 0x00, 0xef, 0xfe, 0x28, 0x18, 0x00, 0x04, 0x00, 0x0c, 0xf8, 0xbd, 0x00, 0x00, 0xff, 0xb5, 0x0f, 0x1c, 0x81, 0xb0, 0x0a, 0xa9, 0x14, 0x1c, 0x1e, 0x1c, 0x03, 0xc9, 0x00, 0xf0, 0x29, 0xf8, 0x05, 0x1c, 0x1e, 0x35, 0x21, 0x1c, 0x30, 0x1c, 0x00, 0xf0, 0x23, 0xf8, 0x2d, 0x18, 0x22, 0x1c, 0x39, 0x1c, 0x01, 0x98, 0xff, 0xf7, 0xd5, 0xfe, 0x28, 0x18, 0x00, 0x04, 0x00, 0x0c, 0x3c, 0x00, 0xd8, 0xae, 0x00, 0x00, 0x05, 0xb0, 0xf0, 0xbd, 0x0a, 0x49, 0x80, 0xb5, 0x09, 0x88, 0x09, 0x29, 0x04, 0xd0, 0x14, 0x29, 0x07, 0xd1, 0x01, 0x01, 0x80, 0x00, 0x00, 0xe0, 0xc1, 0x00, 0x08, 0x18, 0x00, 0x04, 0x00, 0x0c, 0x80, 0xbd, 0xff, 0x21, 0xff, 0x20, 0xf6, 0xf7, 0xd1, 0xf9, 0x00, 0x20, 0x80, 0xbd, 0x00, 0x00, 0xa6, 0x69, 0x01, 0x00, 0x38, 0x23, 0x59, 0x43, 0x06, 0x4a, 0x14, 0x23, 0x3c, 0x00, 0x14, 0xaf, 0x00, 0x00, 0x89, 0x18, 0x82, 0x00, 0x89, 0x5a, 0x05, 0x4a, 0x58, 0x43, 0x80, 0x18, 0x40, 0x88, 0x08, 0x18, 0x00, 0x04, 0x00, 0x0c, 0x70, 0x47, 0x00, 0x00, 0x8c, 0x41, 0x01, 0x00, 0x74, 0x40, 0x01, 0x00, 0x02, 0x48, 0x03, 0x49, 0x00, 0x68, 0x40, 0x00, 0x08, 0x5a, 0x70, 0x47, 0xa8, 0x69, 0x01, 0x00, 0x54, 0x40, 0x01, 0x00, 0x0a, 0x20, 0x70, 0x47, 0x10, 0xb5, 0x04, 0x1c, 0x3c, 0x00, 0x50, 0xaf, 0x00, 0x00, 0xfd, 0xf7, 0x62, 0xff, 0x20, 0x1c, 0x10, 0xbd, 0xb0, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0x05, 0x68, 0xa0, 0x1d, 0xff, 0xf7, 0xf5, 0xfe, 0x00, 0x28, 0x18, 0xd0, 0x21, 0x1c, 0x14, 0x31, 0x20, 0x1c, 0x08, 0xf0, 0xe2, 0xfd, 0x00, 0x28, 0x11, 0xd0, 0x29, 0x88, 0x09, 0x48, 0x20, 0x22, 0x81, 0x82, 0x69, 0x88, 0x01, 0x83, 0xa9, 0x88, 0x06, 0x35, 0x41, 0x83, 0xc5, 0x61, 0x3c, 0x00, 0x8c, 0xaf, 0x00, 0x00, 0x30, 0x21, 0x09, 0x5d, 0x11, 0x54, 0x61, 0x6b, 0x41, 0x62, 0x01, 0x20, 0xf7, 0xf7, 0x28, 0xf8, 0x20, 0x1c, 0xb0, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0x21, 0x1c, 0x14, 0x31, 0x05, 0x68, 0x20, 0x1c, 0x08, 0xf0, 0xc1, 0xfd, 0x00, 0x28, 0x08, 0xd0, 0x05, 0x4e, 0xf0, 0x68, 0x02, 0xf0, 0xcf, 0xfd, 0x28, 0x88, 0xf0, 0x82, 0x03, 0x20, 0x3c, 0x00, 0xc8, 0xaf, 0x00, 0x00, 0xf7, 0xf7, 0x10, 0xf8, 0x20, 0x1c, 0x70, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x3e, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0x05, 0x68, 0xa0, 0x1d, 0xff, 0xf7, 0xb7, 0xfe, 0x00, 0x28, 0x21, 0xd0, 0x21, 0x1c, 0x14, 0x31, 0x20, 0x1c, 0x02, 0xaa, 0x08, 0xf0, 0x77, 0xfd, 0x00, 0x28, 0x19, 0xd0, 0x02, 0x98, 0x4b, 0x21, 0x09, 0x5c, 0x00, 0x29, 0x10, 0xd0, 0x01, 0x29, 0x14, 0xd0, 0x3c, 0x00, 0x04, 0xb0, 0x00, 0x00, 0x02, 0x29, 0x0c, 0xd1, 0x29, 0x88, 0x0d, 0x20, 0x00, 0xab, 0x18, 0x80, 0x20, 0x1c, 0x03, 0xf0, 0x51, 0xf8, 0x01, 0x90, 0x68, 0x46, 0x02, 0xf0, 0x5d, 0xfa, 0xf6, 0xf7, 0xb5, 0xf8, 0x00, 0x21, 0x02, 0x98, 0x06, 0xf0, 0x9f, 0xfe, 0x20, 0x1c, 0x3e, 0xbd, 0x07, 0xf0, 0x29, 0xf8, 0x02, 0x98, 0x00, 0x21, 0x80, 0x69, 0xc2, 0x07, 0xd2, 0x0f, 0x04, 0x20, 0xf6, 0xf7, 0x3c, 0x00, 0x40, 0xb0, 0x00, 0x00, 0x7f, 0xff, 0xee, 0xe7, 0x10, 0xb5, 0x04, 0x1c, 0xfd, 0xf7, 0xe6, 0xfe, 0x20, 0x1c, 0x10, 0xbd, 0x3e, 0xb5, 0x05, 0x1c, 0x00, 0xf0, 0x40, 0xfe, 0x00, 0x28, 0x15, 0xd1, 0x28, 0x1c, 0x14, 0x30, 0xfa, 0xf7, 0xce, 0xfb, 0x00, 0x28, 0x0f, 0xd0, 0x05, 0x21, 0x28, 0x69, 0xff, 0xf7, 0x86, 0xfb, 0x04, 0x1c, 0x09, 0xd0, 0x05, 0x22, 0x21, 0x1c, 0x68, 0x46, 0xf5, 0xf7, 0x3c, 0x00, 0x7c, 0xb0, 0x00, 0x00, 0x3d, 0xfa, 0x05, 0x34, 0x02, 0x94, 0x68, 0x46, 0x03, 0xf0, 0x1a, 0xfb, 0x2a, 0x1c, 0x0d, 0x21, 0x8f, 0x20, 0x08, 0xf0, 0x8f, 0xfb, 0x00, 0x20, 0x3e, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0xfa, 0xf7, 0x98, 0xf8, 0x20, 0x1c, 0x05, 0xf0, 0xe5, 0xf8, 0x20, 0x1c, 0x10, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x00, 0x69, 0x00, 0x21, 0x94, 0xb0, 0xff, 0xf7, 0x3c, 0x00, 0xb8, 0xb0, 0x00, 0x00, 0x61, 0xfb, 0x69, 0x46, 0xfb, 0xf7, 0x26, 0xf8, 0x00, 0x28, 0x1e, 0xd0, 0x00, 0x98, 0xfa, 0xf7, 0x29, 0xfa, 0x01, 0x1c, 0x01, 0xa8, 0x02, 0xf0, 0xd7, 0xf9, 0x00, 0x98, 0xfa, 0xf7, 0xd2, 0xf9, 0x04, 0x90, 0x05, 0x20, 0x09, 0xad, 0x68, 0x72, 0x02, 0xa8, 0x21, 0x1c, 0x06, 0x22, 0x02, 0x30, 0xf5, 0xf7, 0x06, 0xfa, 0x01, 0x20, 0x08, 0x90, 0x21, 0x6a, 0x0a, 0x90, 0x3c, 0x00, 0xf4, 0xb0, 0x00, 0x00, 0x28, 0x20, 0x09, 0x91, 0x00, 0x5d, 0x28, 0x72, 0x01, 0xa8, 0x00, 0xf0, 0x69, 0xf8, 0x20, 0x1c, 0x14, 0xb0, 0xb0, 0xbd, 0xff, 0xb5, 0x16, 0x1c, 0x1f, 0x1c, 0x81, 0xb0, 0x0a, 0x9d, 0x4c, 0x20, 0xf6, 0xf7, 0x90, 0xfb, 0x04, 0x1c, 0x14, 0x30, 0x06, 0x22, 0x02, 0x99, 0xf5, 0xf7, 0xea, 0xf9, 0x20, 0x1c, 0x06, 0x22, 0x01, 0x99, 0xf5, 0xf7, 0xe5, 0xf9, 0x28, 0x20, 0x3c, 0x00, 0x30, 0xb1, 0x00, 0x00, 0x00, 0x21, 0x06, 0x55, 0xe1, 0x60, 0x27, 0x62, 0x00, 0x2d, 0x01, 0xd0, 0x8e, 0x20, 0x00, 0xe0, 0x8d, 0x20, 0x22, 0x1c, 0x0d, 0x21, 0x08, 0xf0, 0x33, 0xfb, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x05, 0x1c, 0x4c, 0x20, 0xf6, 0xf7, 0x6f, 0xfb, 0x04, 0x1c, 0x4c, 0x22, 0x29, 0x1c, 0xf5, 0xf7, 0x26, 0xfa, 0x29, 0x20, 0x40, 0x5d, 0x0d, 0x28, 0x2c, 0xd2, 0x3c, 0x00, 0x6c, 0xb1, 0x00, 0x00, 0x01, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x28, 0x1a, 0x28, 0x1e, 0x06, 0x0a, 0x28, 0x28, 0x0e, 0x28, 0x22, 0x12, 0x16, 0x00, 0x22, 0x1c, 0x0d, 0x21, 0x8c, 0x20, 0x1a, 0xe0, 0x22, 0x1c, 0x0d, 0x21, 0x83, 0x20, 0x16, 0xe0, 0x22, 0x1c, 0x0d, 0x21, 0x84, 0x20, 0x12, 0xe0, 0x22, 0x1c, 0x0d, 0x21, 0x85, 0x20, 0x0e, 0xe0, 0x22, 0x1c, 0x0d, 0x21, 0x86, 0x20, 0x3c, 0x00, 0xa8, 0xb1, 0x00, 0x00, 0x0a, 0xe0, 0x22, 0x1c, 0x0d, 0x21, 0x87, 0x20, 0x06, 0xe0, 0x22, 0x1c, 0x0d, 0x21, 0x89, 0x20, 0x02, 0xe0, 0x22, 0x1c, 0x0d, 0x21, 0x8b, 0x20, 0x08, 0xf0, 0xf6, 0xfa, 0xb0, 0xbd, 0xe8, 0x68, 0xf6, 0xf7, 0xe6, 0xf9, 0x20, 0x1c, 0xf6, 0xf7, 0x11, 0xfb, 0xb0, 0xbd, 0xfe, 0xb5, 0x05, 0x1c, 0x90, 0x20, 0xf6, 0xf7, 0x2d, 0xfb, 0x04, 0x1c, 0x90, 0x21, 0xf5, 0xf7, 0x3c, 0x00, 0xe4, 0xb1, 0x00, 0x00, 0x5b, 0xf9, 0x37, 0x4e, 0x01, 0x27, 0xf0, 0x69, 0x04, 0x28, 0x03, 0xd9, 0x70, 0x6b, 0x01, 0x30, 0x70, 0x63, 0x4d, 0xe0, 0x33, 0x48, 0xb1, 0x6b, 0x04, 0xf0, 0xd0, 0xf8, 0x01, 0x20, 0x20, 0x62, 0xa8, 0x7e, 0x21, 0x1c, 0x80, 0x31, 0x02, 0x91, 0x08, 0x70, 0x22, 0x1c, 0x60, 0x32, 0x01, 0x92, 0x00, 0x20, 0x2f, 0x1c, 0x20, 0x37, 0x90, 0x72, 0x78, 0x7a, 0x2b, 0x1c, 0x3c, 0x00, 0x20, 0xb2, 0x00, 0x00, 0x14, 0x33, 0xd0, 0x72, 0xe8, 0x68, 0xaa, 0x1d, 0xa0, 0x60, 0xe8, 0x6b, 0x48, 0x60, 0x44, 0x20, 0x40, 0x5d, 0x08, 0x72, 0x29, 0x1c, 0x20, 0x1c, 0x05, 0xf0, 0xaa, 0xfc, 0x68, 0x6a, 0x00, 0x28, 0x0a, 0xd1, 0x01, 0x9a, 0x20, 0x1c, 0x93, 0x7a, 0x02, 0x99, 0x22, 0x1c, 0x70, 0x32, 0x58, 0x30, 0x09, 0x78, 0xfa, 0xf7, 0xdb, 0xf9, 0x06, 0xe0, 0x3a, 0x7a, 0x23, 0x1c, 0x3c, 0x00, 0x5c, 0xb2, 0x00, 0x00, 0xe8, 0x69, 0x29, 0x6a, 0x70, 0x33, 0xfd, 0xf7, 0x8d, 0xf9, 0x30, 0x20, 0x40, 0x5d, 0x18, 0x49, 0x07, 0x28, 0x0b, 0xd1, 0x58, 0x20, 0x00, 0x5d, 0xc0, 0x07, 0xc0, 0x17, 0x01, 0x30, 0xe0, 0x61, 0x00, 0x20, 0x20, 0x61, 0x20, 0x1c, 0xf7, 0xf7, 0x3f, 0xff, 0x18, 0xe0, 0x01, 0x22, 0x20, 0x1c, 0x05, 0xf0, 0xac, 0xff, 0x07, 0x1c, 0x12, 0xd0, 0x03, 0xf0, 0x06, 0xff, 0x3c, 0x00, 0x98, 0xb2, 0x00, 0x00, 0xf3, 0x6d, 0x00, 0x2b, 0x06, 0xd0, 0x60, 0x68, 0x20, 0x30, 0x82, 0x7b, 0x61, 0x6b, 0x38, 0x1c, 0xf5, 0xf7, 0x99, 0xf8, 0xe8, 0x68, 0xf6, 0xf7, 0x73, 0xf9, 0x20, 0x1c, 0xf6, 0xf7, 0x9e, 0xfa, 0xfe, 0xbd, 0xf0, 0x69, 0x01, 0x30, 0xf0, 0x61, 0xfa, 0xe7, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x05, 0x31, 0x00, 0x00, 0x70, 0xb5, 0x06, 0x1c, 0x3c, 0x00, 0xd4, 0xb2, 0x00, 0x00, 0x0d, 0x1c, 0x09, 0x04, 0x09, 0x0c, 0x00, 0x20, 0xf6, 0xf7, 0x7c, 0xf9, 0x04, 0x1c, 0x2a, 0x1c, 0x31, 0x1c, 0x00, 0x68, 0xf5, 0xf7, 0x06, 0xf9, 0x20, 0x1c, 0x70, 0xbd, 0x40, 0x88, 0x70, 0x47, 0x03, 0x78, 0x1b, 0x07, 0x9b, 0x0f, 0x0b, 0x70, 0x00, 0x78, 0x00, 0x09, 0x10, 0x70, 0x70, 0x47, 0x04, 0x30, 0x70, 0x47, 0x04, 0x30, 0x70, 0x47, 0xd4, 0x21, 0x01, 0x70, 0x3c, 0x00, 0x10, 0xb3, 0x00, 0x00, 0x00, 0x21, 0x41, 0x70, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x21, 0x01, 0x70, 0x00, 0x21, 0x41, 0x70, 0x70, 0x47, 0x00, 0x00, 0xb4, 0x21, 0x01, 0x70, 0x00, 0x21, 0x41, 0x70, 0x70, 0x47, 0x00, 0x00, 0x01, 0x49, 0x48, 0x65, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x01, 0x49, 0x08, 0x65, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x01, 0x49, 0x88, 0x65, 0x3c, 0x00, 0x4c, 0xb3, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0xf8, 0xb5, 0x5f, 0x4f, 0x05, 0x1c, 0xb8, 0x68, 0x01, 0x30, 0xb8, 0x60, 0x07, 0xf0, 0x24, 0xfd, 0x38, 0x61, 0x90, 0x20, 0xf6, 0xf7, 0x66, 0xfa, 0x04, 0x1c, 0x90, 0x21, 0xf5, 0xf7, 0x94, 0xf8, 0x28, 0x6b, 0x27, 0x1c, 0x60, 0x63, 0x68, 0x8b, 0x80, 0x37, 0x26, 0x1c, 0xc0, 0x07, 0xc0, 0x0f, 0x20, 0x62, 0x68, 0x8b, 0x3c, 0x00, 0x88, 0xb3, 0x00, 0x00, 0x60, 0x36, 0x02, 0x21, 0x40, 0x07, 0xc0, 0x0f, 0x20, 0x63, 0x68, 0x8b, 0x80, 0x07, 0xc0, 0x0f, 0xf8, 0x60, 0x28, 0x7f, 0x38, 0x70, 0xb1, 0x72, 0x00, 0x28, 0x08, 0xd1, 0xf9, 0xf7, 0xc8, 0xff, 0x00, 0x28, 0x02, 0xd0, 0x01, 0x20, 0x60, 0x62, 0x01, 0xe0, 0x01, 0x20, 0xa0, 0x62, 0xf8, 0x68, 0x00, 0x28, 0x03, 0xd0, 0x00, 0x21, 0x02, 0x20, 0x06, 0xf0, 0xcc, 0xff, 0x3c, 0x00, 0xc4, 0xb3, 0x00, 0x00, 0x2b, 0x1c, 0x10, 0x33, 0xaa, 0x1d, 0x29, 0x1c, 0x20, 0x1c, 0x05, 0xf0, 0xdf, 0xfb, 0xa8, 0x6a, 0x00, 0x28, 0x0c, 0xd1, 0x39, 0x78, 0x02, 0x29, 0x07, 0xd0, 0x22, 0x1c, 0x70, 0x32, 0x20, 0x1c, 0x58, 0x30, 0xb3, 0x7a, 0xfa, 0xf7, 0x10, 0xf9, 0x08, 0xe0, 0x01, 0x26, 0x5e, 0xe0, 0xaa, 0x7d, 0x23, 0x1c, 0x28, 0x6a, 0x69, 0x6a, 0x70, 0x33, 0xfd, 0xf7, 0xc0, 0xf8, 0x3c, 0x00, 0x00, 0xb4, 0x00, 0x00, 0xe9, 0x68, 0x00, 0x20, 0x09, 0x89, 0x00, 0x29, 0x00, 0xd1, 0x04, 0x20, 0xf0, 0x72, 0x38, 0x78, 0x01, 0x28, 0x14, 0xd1, 0x00, 0x27, 0x00, 0x90, 0x00, 0x20, 0x06, 0xe0, 0x29, 0x69, 0x01, 0x29, 0x03, 0xd1, 0xa9, 0x69, 0x01, 0x27, 0x89, 0x07, 0x1a, 0xd5, 0x06, 0xf0, 0x79, 0xfc, 0x00, 0x28, 0xf4, 0xd1, 0x01, 0x2f, 0x14, 0xd1, 0x00, 0x98, 0x01, 0x28, 0x11, 0xd1, 0x3c, 0x00, 0x3c, 0xb4, 0x00, 0x00, 0x08, 0xe0, 0x20, 0x1c, 0x58, 0x30, 0x06, 0xf0, 0xe1, 0xfc, 0x00, 0x28, 0x0a, 0xd0, 0x80, 0x69, 0x80, 0x07, 0x07, 0xd5, 0xf0, 0x7a, 0x08, 0x21, 0x08, 0x43, 0xf0, 0x72, 0x01, 0x20, 0xe0, 0x62, 0xe8, 0x7d, 0x30, 0x73, 0xe8, 0x68, 0xa0, 0x60, 0xe0, 0x6a, 0x00, 0x28, 0x12, 0xd0, 0x1a, 0x4f, 0xf8, 0x6b, 0x00, 0x28, 0x0e, 0xd0, 0x30, 0x7b, 0xf5, 0xf7, 0xde, 0xfe, 0x3c, 0x00, 0x78, 0xb4, 0x00, 0x00, 0x00, 0x28, 0x09, 0xd0, 0x21, 0x1c, 0x38, 0x1c, 0x40, 0x30, 0xfc, 0xf7, 0x55, 0xfc, 0x14, 0x48, 0xb9, 0x6b, 0x03, 0xf0, 0x89, 0xff, 0xf8, 0xbd, 0x10, 0x4f, 0x12, 0x48, 0xb9, 0x6b, 0x03, 0xf0, 0x83, 0xff, 0x00, 0x22, 0x20, 0x1c, 0x10, 0x49, 0x05, 0xf0, 0xa2, 0xfe, 0x06, 0x1c, 0x03, 0xd1, 0x38, 0x6a, 0x01, 0x30, 0x38, 0x62, 0xee, 0xe7, 0x20, 0x1c, 0xf6, 0xf7, 0x3c, 0x00, 0xb4, 0xb4, 0x00, 0x00, 0x9f, 0xf9, 0xe8, 0x68, 0xf6, 0xf7, 0x6e, 0xf8, 0x03, 0xf0, 0xf2, 0xfd, 0x04, 0x48, 0x83, 0x6d, 0x00, 0x2b, 0xe2, 0xd0, 0x00, 0x22, 0x30, 0x1c, 0x29, 0x6b, 0xf4, 0xf7, 0x86, 0xff, 0xdc, 0xe7, 0xc4, 0x69, 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x11, 0x30, 0x00, 0x00, 0x10, 0xb5, 0x0a, 0x20, 0x07, 0xf0, 0xfe, 0xfc, 0x07, 0xf0, 0x5e, 0xfc, 0x3c, 0x00, 0xf0, 0xb4, 0x00, 0x00, 0x0b, 0x49, 0x44, 0x18, 0x0c, 0xe0, 0x20, 0x1c, 0x07, 0xf0, 0x90, 0xfb, 0x00, 0x28, 0x07, 0xd0, 0xf7, 0xf7, 0x34, 0xf9, 0x00, 0x28, 0x03, 0xd0, 0x12, 0x21, 0x86, 0x20, 0xf5, 0xf7, 0xca, 0xfe, 0xf7, 0xf7, 0x2c, 0xf9, 0x00, 0x28, 0xee, 0xd1, 0x01, 0xf0, 0x80, 0xfd, 0x10, 0xbd, 0x00, 0x00, 0x40, 0x9c, 0x00, 0x00, 0x10, 0xb5, 0x0c, 0x1c, 0x01, 0x1c, 0x17, 0x4a, 0x3c, 0x00, 0x2c, 0xb5, 0x00, 0x00, 0x01, 0x29, 0x50, 0x69, 0x04, 0xd0, 0x80, 0x29, 0x1d, 0xd0, 0x81, 0x29, 0x21, 0xd1, 0x1c, 0xe0, 0x91, 0x78, 0x01, 0x29, 0x15, 0xd1, 0x02, 0x21, 0x91, 0x70, 0x14, 0x1c, 0x01, 0x1c, 0x10, 0x48, 0x03, 0xf0, 0x28, 0xff, 0x01, 0x21, 0x60, 0x69, 0x00, 0xf0, 0x2e, 0xf9, 0x60, 0x69, 0x01, 0xf0, 0x5f, 0xfc, 0x20, 0x70, 0xa0, 0x88, 0xa1, 0x69, 0x00, 0x23, 0x0a, 0x4a, 0x3c, 0x00, 0x68, 0xb5, 0x00, 0x00, 0x07, 0xf0, 0x7e, 0xfc, 0x10, 0xbd, 0x22, 0x21, 0x06, 0xe0, 0x01, 0xf0, 0x1d, 0xfc, 0x20, 0x1c, 0x00, 0xf0, 0x4a, 0xf8, 0x10, 0xbd, 0x1c, 0x21, 0x20, 0x20, 0xf5, 0xf7, 0x8f, 0xfe, 0x10, 0xbd, 0xb4, 0x79, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x3d, 0x2e, 0x00, 0x00, 0x70, 0xb5, 0x1c, 0x4c, 0xa0, 0x78, 0x00, 0x28, 0x32, 0xd0, 0x05, 0x28, 0x30, 0xd0, 0x60, 0x69, 0x3c, 0x00, 0xa4, 0xb5, 0x00, 0x00, 0x00, 0xf0, 0xea, 0xf8, 0x18, 0x4e, 0xb5, 0x79, 0xa0, 0x78, 0x01, 0x28, 0x0b, 0xd0, 0x02, 0x28, 0x0e, 0xd0, 0x03, 0x28, 0x10, 0xd0, 0x04, 0x28, 0x17, 0xd1, 0x42, 0x1f, 0x80, 0x21, 0x20, 0x20, 0x08, 0xf0, 0x08, 0xf8, 0x0e, 0xe0, 0x00, 0x21, 0x20, 0x20, 0x08, 0xf0, 0x31, 0xf8, 0x0c, 0xe0, 0xa0, 0x88, 0x07, 0xf0, 0x1d, 0xfc, 0x05, 0xe0, 0x20, 0x78, 0x00, 0xf0, 0x3c, 0x00, 0xe0, 0xb5, 0x00, 0x00, 0x39, 0xfa, 0x00, 0x20, 0x00, 0xf0, 0xc4, 0xfd, 0x60, 0x69, 0x01, 0xf0, 0xe1, 0xfb, 0x05, 0x20, 0xa0, 0x70, 0xb5, 0x71, 0x60, 0x69, 0x00, 0xf0, 0x61, 0xf9, 0x00, 0x22, 0x20, 0x21, 0x81, 0x20, 0x08, 0xf0, 0xd6, 0xf8, 0x70, 0xbd, 0x00, 0x00, 0xb4, 0x79, 0x01, 0x00, 0x20, 0x10, 0x07, 0x00, 0xb0, 0xb5, 0x0d, 0x4d, 0x04, 0x1c, 0xa8, 0x78, 0x00, 0x28, 0x14, 0xd0, 0x3c, 0x00, 0x1c, 0xb6, 0x00, 0x00, 0x68, 0x69, 0x00, 0xf0, 0x0b, 0xf9, 0x0a, 0x48, 0x69, 0x69, 0x03, 0xf0, 0xa7, 0xfe, 0xa8, 0x88, 0x07, 0xf0, 0x9e, 0xfb, 0x00, 0x2c, 0x02, 0xd0, 0x68, 0x78, 0x00, 0xf0, 0x79, 0xff, 0x00, 0x20, 0xa8, 0x70, 0xa9, 0x68, 0x20, 0x1c, 0xf4, 0xf7, 0xca, 0xfe, 0xb0, 0xbd, 0xb4, 0x79, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x06, 0x4b, 0x80, 0xb5, 0x99, 0x78, 0x03, 0x29, 0x3c, 0x00, 0x58, 0xb6, 0x00, 0x00, 0x06, 0xd1, 0x04, 0x21, 0x99, 0x70, 0x20, 0x21, 0x02, 0x1c, 0x80, 0x20, 0x08, 0xf0, 0xa4, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0xb4, 0x79, 0x01, 0x00, 0x10, 0xb5, 0x0c, 0x4c, 0xa1, 0x78, 0x03, 0x29, 0x0f, 0xd1, 0x10, 0x30, 0xfa, 0xf7, 0xde, 0xf8, 0x00, 0x28, 0x09, 0xd0, 0x20, 0x78, 0x00, 0xf0, 0xe5, 0xf9, 0x00, 0x20, 0x00, 0xf0, 0x70, 0xfd, 0x00, 0x21, 0x05, 0x48, 0x3c, 0x00, 0x94, 0xb6, 0x00, 0x00, 0xfc, 0xf7, 0x9c, 0xfa, 0x10, 0xbd, 0x1b, 0x21, 0x20, 0x20, 0xf5, 0xf7, 0x01, 0xfe, 0x10, 0xbd, 0xb4, 0x79, 0x01, 0x00, 0x51, 0xb6, 0x00, 0x00, 0x09, 0x49, 0x80, 0xb5, 0x89, 0x78, 0x03, 0x29, 0x09, 0xd1, 0x00, 0xf0, 0xcd, 0xf9, 0x00, 0x20, 0x00, 0xf0, 0x58, 0xfd, 0x01, 0x21, 0x05, 0x48, 0xfc, 0xf7, 0x84, 0xfa, 0x80, 0xbd, 0x17, 0x21, 0x20, 0x20, 0xf5, 0xf7, 0x3c, 0x00, 0xd0, 0xb6, 0x00, 0x00, 0xe9, 0xfd, 0x80, 0xbd, 0xb4, 0x79, 0x01, 0x00, 0x51, 0xb6, 0x00, 0x00, 0x70, 0xb5, 0x10, 0x4c, 0x1d, 0x1c, 0xa3, 0x78, 0x06, 0x1c, 0x04, 0x98, 0x00, 0x2b, 0x18, 0xd1, 0x01, 0x23, 0xa3, 0x70, 0x22, 0x61, 0xe6, 0x60, 0x61, 0x70, 0xa0, 0x60, 0xa5, 0x61, 0x00, 0x20, 0x07, 0xf0, 0xac, 0xfa, 0xa0, 0x80, 0x30, 0x1c, 0xf7, 0xf7, 0x3c, 0xfb, 0xe0, 0x80, 0x07, 0xf0, 0x3c, 0x00, 0x0c, 0xb7, 0x00, 0x00, 0x4f, 0xfb, 0xc7, 0x21, 0xc9, 0x00, 0x28, 0x1a, 0x41, 0x1a, 0x00, 0x22, 0x20, 0x20, 0x07, 0xf0, 0x57, 0xff, 0x70, 0xbd, 0xb4, 0x79, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, 0x00, 0xf0, 0x09, 0xf8, 0x20, 0x1c, 0x00, 0xf0, 0x24, 0xf8, 0x00, 0x2d, 0x01, 0xd0, 0xff, 0xf7, 0xd4, 0xfe, 0xb0, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x0c, 0x4c, 0x05, 0x1c, 0xa0, 0x68, 0x3c, 0x00, 0x48, 0xb7, 0x00, 0x00, 0x00, 0x28, 0x0f, 0xd1, 0x0a, 0x48, 0x01, 0x7e, 0x02, 0x22, 0x11, 0x40, 0x61, 0x60, 0x01, 0x7e, 0x11, 0x43, 0x01, 0x76, 0x07, 0x20, 0x03, 0xf0, 0x49, 0xfc, 0x20, 0x60, 0x03, 0xf0, 0x98, 0xff, 0x03, 0xf0, 0xee, 0xff, 0xa0, 0x68, 0x28, 0x43, 0xa0, 0x60, 0xb0, 0xbd, 0x40, 0x7c, 0x01, 0x00, 0x0c, 0x80, 0x07, 0x00, 0x0a, 0x49, 0x38, 0xb5, 0x0a, 0x1c, 0x20, 0x32, 0x3c, 0x00, 0x84, 0xb7, 0x00, 0x00, 0x94, 0x79, 0x00, 0xab, 0x1c, 0x70, 0xd2, 0x79, 0x07, 0x4c, 0x5a, 0x70, 0xe2, 0x68, 0x00, 0x2a, 0x02, 0xd1, 0x06, 0x4d, 0x01, 0x23, 0x6b, 0x70, 0x10, 0x43, 0xe0, 0x60, 0x00, 0xab, 0x18, 0x88, 0xc8, 0x84, 0x38, 0xbd, 0x00, 0x10, 0x07, 0x00, 0x40, 0x7c, 0x01, 0x00, 0x00, 0x50, 0x07, 0x00, 0xb0, 0xb5, 0x05, 0x1c, 0x00, 0x29, 0x01, 0xd0, 0x00, 0xf0, 0x28, 0xf8, 0x3c, 0x00, 0xc0, 0xb7, 0x00, 0x00, 0x06, 0x4c, 0x60, 0x78, 0x21, 0x69, 0x08, 0x43, 0x03, 0xd1, 0x01, 0x21, 0x0e, 0x20, 0x06, 0xf0, 0xc5, 0xfd, 0x20, 0x69, 0x28, 0x43, 0x20, 0x61, 0xb0, 0xbd, 0x00, 0x00, 0x18, 0x63, 0x01, 0x00, 0xb0, 0xb5, 0x0a, 0x4c, 0x05, 0x1c, 0x22, 0x69, 0x00, 0x20, 0x00, 0x2a, 0x0c, 0xd1, 0x00, 0x29, 0x00, 0xd0, 0x04, 0xe0, 0x60, 0x78, 0x00, 0x28, 0x02, 0xd1, 0x04, 0xf0, 0x3c, 0x00, 0xfc, 0xb7, 0x00, 0x00, 0x69, 0xfb, 0x60, 0x70, 0x28, 0x1c, 0x06, 0xf0, 0xef, 0xfc, 0x01, 0x20, 0xb0, 0xbd, 0x00, 0x00, 0x18, 0x63, 0x01, 0x00, 0x10, 0xb5, 0x08, 0x4c, 0x60, 0x78, 0x00, 0x28, 0x0a, 0xd0, 0x06, 0xf0, 0xe3, 0xfc, 0x00, 0x20, 0x60, 0x70, 0x20, 0x69, 0x00, 0x28, 0x03, 0xd0, 0x01, 0x21, 0x0e, 0x20, 0x06, 0xf0, 0x96, 0xfd, 0x10, 0xbd, 0x00, 0x00, 0x18, 0x63, 0x01, 0x00, 0x3c, 0x00, 0x38, 0xb8, 0x00, 0x00, 0x09, 0x49, 0x80, 0xb5, 0x0b, 0x69, 0x83, 0x42, 0x04, 0xd1, 0x4a, 0x78, 0x00, 0x2a, 0x01, 0xd1, 0x01, 0x22, 0x00, 0xe0, 0x00, 0x22, 0x83, 0x43, 0x0b, 0x61, 0x00, 0x2a, 0x03, 0xd0, 0x00, 0x21, 0x0e, 0x20, 0x06, 0xf0, 0x7f, 0xfd, 0x80, 0xbd, 0x18, 0x63, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x20, 0xf6, 0xf7, 0x56, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x3c, 0x00, 0x74, 0xb8, 0x00, 0x00, 0x00, 0xf0, 0x04, 0xf8, 0x20, 0x1c, 0x00, 0xf0, 0x1f, 0xf8, 0x10, 0xbd, 0xb0, 0xb5, 0x0c, 0x4d, 0x04, 0x1c, 0xa8, 0x68, 0xa0, 0x42, 0x0f, 0xd1, 0x07, 0x20, 0x29, 0x68, 0x08, 0xf0, 0x8c, 0xfb, 0x68, 0x68, 0x02, 0x22, 0x07, 0x49, 0x00, 0x28, 0x08, 0x7e, 0x01, 0xd0, 0x10, 0x43, 0x00, 0xe0, 0x90, 0x43, 0x08, 0x76, 0x04, 0xf0, 0xc4, 0xf8, 0xa8, 0x68, 0xa0, 0x43, 0x3c, 0x00, 0xb0, 0xb8, 0x00, 0x00, 0xa8, 0x60, 0xb0, 0xbd, 0x40, 0x7c, 0x01, 0x00, 0x0c, 0x80, 0x07, 0x00, 0x0a, 0x49, 0x38, 0xb5, 0x0a, 0x1c, 0x20, 0x32, 0x94, 0x79, 0x00, 0xab, 0x1c, 0x70, 0xd2, 0x79, 0x07, 0x4c, 0x5a, 0x70, 0xe2, 0x68, 0x82, 0x42, 0x02, 0xd1, 0x06, 0x4d, 0x00, 0x23, 0x6b, 0x70, 0x82, 0x43, 0xe2, 0x60, 0x00, 0xab, 0x18, 0x88, 0xc8, 0x84, 0x38, 0xbd, 0x00, 0x10, 0x07, 0x00, 0x3c, 0x00, 0xec, 0xb8, 0x00, 0x00, 0x40, 0x7c, 0x01, 0x00, 0x00, 0x50, 0x07, 0x00, 0xb0, 0xb5, 0x05, 0x1c, 0x0a, 0x4c, 0x00, 0x21, 0x60, 0x69, 0xff, 0xf7, 0x11, 0xff, 0x04, 0x20, 0x01, 0xf0, 0x46, 0xf9, 0x01, 0xf0, 0x88, 0xfb, 0x00, 0x22, 0x04, 0x21, 0x04, 0x20, 0x01, 0xf0, 0x8b, 0xf8, 0x28, 0x1c, 0x01, 0xf0, 0x4a, 0xfa, 0x60, 0x69, 0xff, 0xf7, 0xa7, 0xff, 0xb0, 0xbd, 0x40, 0x7c, 0x01, 0x00, 0x3c, 0x00, 0x28, 0xb9, 0x00, 0x00, 0x80, 0xb5, 0x01, 0xf0, 0x77, 0xfa, 0x80, 0xbd, 0xb0, 0xb5, 0x0d, 0x4d, 0x01, 0x21, 0x28, 0x69, 0xff, 0xf7, 0xf4, 0xfe, 0xff, 0xf7, 0x2a, 0xfe, 0x00, 0xf0, 0x2c, 0xfb, 0x00, 0xf0, 0x84, 0xfa, 0x00, 0x24, 0x00, 0x22, 0x04, 0x21, 0x20, 0x1c, 0x01, 0xf0, 0x6c, 0xf8, 0x01, 0x34, 0x24, 0x06, 0x24, 0x0e, 0x04, 0x2c, 0xf5, 0xd3, 0x28, 0x69, 0xff, 0xf7, 0x86, 0xff, 0x3c, 0x00, 0x64, 0xb9, 0x00, 0x00, 0xb0, 0xbd, 0x00, 0x00, 0x40, 0x7c, 0x01, 0x00, 0xf8, 0xb5, 0x05, 0x1c, 0x0e, 0x1c, 0x07, 0x4c, 0x17, 0x1c, 0x01, 0x21, 0x20, 0x69, 0xff, 0xf7, 0xd3, 0xfe, 0x3a, 0x1c, 0x31, 0x1c, 0x28, 0x1c, 0x01, 0xf0, 0x52, 0xf8, 0x20, 0x69, 0xff, 0xf7, 0x71, 0xff, 0xf8, 0xbd, 0x40, 0x7c, 0x01, 0x00, 0xff, 0xb5, 0x89, 0xb0, 0x06, 0x1c, 0x16, 0x98, 0x1d, 0x1c, 0x00, 0x28, 0x3c, 0x00, 0xa0, 0xb9, 0x00, 0x00, 0x01, 0xd0, 0x29, 0x48, 0x14, 0x90, 0x28, 0x68, 0x00, 0x88, 0x00, 0x06, 0x80, 0x0e, 0x20, 0x28, 0x01, 0xd0, 0x14, 0x28, 0x17, 0xd1, 0x0a, 0xaa, 0x18, 0x24, 0x18, 0x21, 0x05, 0xca, 0xff, 0xf7, 0x77, 0xf9, 0x07, 0x1c, 0x28, 0x1c, 0x01, 0x89, 0xa1, 0x42, 0x02, 0xdd, 0x00, 0x68, 0x01, 0x19, 0x0b, 0xe0, 0xc0, 0x68, 0x64, 0x1a, 0x00, 0x28, 0xf5, 0xd1, 0x0f, 0x21, 0x3c, 0x00, 0xdc, 0xb9, 0x00, 0x00, 0x86, 0x20, 0xf5, 0xf7, 0x61, 0xfc, 0x00, 0x21, 0x01, 0xe0, 0x00, 0x21, 0x00, 0x27, 0x18, 0x48, 0x08, 0x90, 0x80, 0x79, 0x07, 0x90, 0x0c, 0x20, 0x16, 0x4a, 0x70, 0x43, 0x80, 0x18, 0x04, 0x79, 0x04, 0x91, 0x12, 0x99, 0x15, 0x98, 0x14, 0x9a, 0x01, 0x91, 0x03, 0x90, 0x05, 0x97, 0x00, 0x95, 0x0a, 0xab, 0x02, 0x92, 0x21, 0x1c, 0x30, 0x1c, 0x0c, 0xcb, 0xf7, 0xf7, 0x3c, 0x00, 0x18, 0xba, 0x00, 0x00, 0x03, 0xf9, 0x01, 0x25, 0xb5, 0x40, 0x0c, 0x4e, 0x08, 0x3e, 0x30, 0x78, 0x28, 0x40, 0x06, 0xd0, 0x20, 0x1c, 0x00, 0xf0, 0xc9, 0xfd, 0x30, 0x78, 0xa8, 0x43, 0x30, 0x70, 0x03, 0xe0, 0x20, 0x1c, 0x13, 0x99, 0x00, 0xf0, 0x43, 0xff, 0x07, 0xa9, 0x03, 0xc9, 0x88, 0x71, 0x0d, 0xb0, 0xf0, 0xbd, 0x95, 0x24, 0x00, 0x00, 0x20, 0x10, 0x07, 0x00, 0x74, 0x7a, 0x01, 0x00, 0x3c, 0x00, 0x54, 0xba, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0c, 0x23, 0x09, 0x49, 0x58, 0x43, 0x40, 0x18, 0x00, 0x79, 0x05, 0x1c, 0x00, 0xf0, 0x92, 0xfe, 0x28, 0x1c, 0xf7, 0xf7, 0xc7, 0xf8, 0x01, 0x20, 0x03, 0x4a, 0xa0, 0x40, 0x08, 0x3a, 0x11, 0x78, 0x81, 0x43, 0x11, 0x70, 0xb0, 0xbd, 0x00, 0x00, 0x74, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0x05, 0x4c, 0x20, 0x78, 0x00, 0x28, 0x03, 0xd1, 0x1a, 0x21, 0x3c, 0x00, 0x90, 0xba, 0x00, 0x00, 0x86, 0x20, 0xf5, 0xf7, 0x07, 0xfc, 0x20, 0x78, 0x10, 0xbd, 0x00, 0x00, 0x18, 0x63, 0x01, 0x00, 0x01, 0x48, 0x40, 0x78, 0x70, 0x47, 0x00, 0x00, 0x2c, 0x63, 0x01, 0x00, 0x80, 0xb5, 0xf6, 0xf7, 0xd1, 0xfe, 0x00, 0xf0, 0x1b, 0xf9, 0x80, 0xbd, 0xfe, 0xb5, 0x01, 0x68, 0x05, 0x1c, 0x0c, 0x68, 0x0e, 0x1c, 0x21, 0x78, 0x88, 0x07, 0x71, 0xd1, 0x68, 0x69, 0xc2, 0x07, 0x3c, 0x00, 0xcc, 0xba, 0x00, 0x00, 0x6e, 0xd5, 0x80, 0x07, 0x6d, 0xd5, 0xe8, 0x7a, 0xc2, 0x07, 0x08, 0x07, 0x09, 0x09, 0x02, 0x91, 0x45, 0x49, 0x80, 0x0f, 0xd2, 0x0f, 0x00, 0x28, 0x4f, 0x68, 0x05, 0xd0, 0x01, 0x28, 0x09, 0xd0, 0x02, 0x28, 0x21, 0xd0, 0x03, 0x28, 0x5b, 0xd1, 0xff, 0x23, 0x20, 0x1c, 0xa9, 0x7a, 0xf4, 0xf7, 0x74, 0xfc, 0x55, 0xe0, 0x02, 0x98, 0x0b, 0x28, 0x0a, 0xd0, 0x0c, 0x28, 0x3c, 0x00, 0x08, 0xbb, 0x00, 0x00, 0x0f, 0xd0, 0x0d, 0x28, 0x4e, 0xd1, 0x39, 0x4f, 0xf8, 0x68, 0xf4, 0xf7, 0x61, 0xfc, 0x00, 0x20, 0xc0, 0x43, 0x5a, 0xe0, 0x35, 0x4f, 0xa9, 0x7a, 0xbb, 0x68, 0x20, 0x1c, 0xf4, 0xf7, 0x5b, 0xfc, 0x40, 0xe0, 0x32, 0x4f, 0x38, 0x69, 0xf4, 0xf7, 0x53, 0xfc, 0x3b, 0xe0, 0x00, 0x21, 0x01, 0x91, 0x02, 0x99, 0x00, 0x20, 0xff, 0x23, 0x09, 0x07, 0x01, 0xd4, 0x01, 0x20, 0x3c, 0x00, 0x44, 0xbb, 0x00, 0x00, 0x13, 0xe0, 0x31, 0x89, 0x19, 0x29, 0x01, 0xd3, 0x26, 0x7e, 0x07, 0xe0, 0x15, 0x29, 0x04, 0xd3, 0x18, 0x26, 0x71, 0x1a, 0x49, 0x19, 0x0e, 0x7b, 0x00, 0xe0, 0x00, 0x26, 0xb1, 0x06, 0x02, 0xd4, 0x01, 0x20, 0x73, 0x07, 0x5b, 0x0f, 0x01, 0x21, 0x01, 0x91, 0x00, 0x28, 0x03, 0xd0, 0xa9, 0x7a, 0x20, 0x1c, 0xf4, 0xf7, 0x36, 0xfc, 0x01, 0x99, 0x01, 0x29, 0x15, 0xd1, 0x3c, 0x00, 0x80, 0xbb, 0x00, 0x00, 0xf0, 0x06, 0xc6, 0x0f, 0x20, 0x88, 0x1b, 0x4f, 0xe4, 0x8a, 0xf9, 0x6b, 0x00, 0x05, 0xc0, 0x0f, 0x00, 0x29, 0x1a, 0xd0, 0x4b, 0x1c, 0x18, 0xd0, 0x00, 0x2e, 0x0a, 0xd0, 0x00, 0x28, 0x08, 0xd0, 0x38, 0x88, 0x84, 0x42, 0x13, 0xd0, 0x02, 0x98, 0x0c, 0x28, 0x01, 0xe0, 0x1d, 0xe0, 0x12, 0xe0, 0x0d, 0xd0, 0x08, 0x1c, 0x01, 0xf0, 0x76, 0xf9, 0x00, 0x28, 0x03, 0xd1, 0x3c, 0x00, 0xbc, 0xbb, 0x00, 0x00, 0x00, 0xf0, 0xa6, 0xfa, 0xf4, 0xf7, 0x0a, 0xfc, 0x00, 0x20, 0xc0, 0x43, 0xf8, 0x63, 0x00, 0x2e, 0x0d, 0xd0, 0x3c, 0x80, 0x00, 0x20, 0xf8, 0x63, 0x09, 0xe0, 0x20, 0x88, 0x00, 0x06, 0x80, 0x0e, 0x20, 0x28, 0x04, 0xd1, 0x04, 0x4f, 0x20, 0x1c, 0xb9, 0x6a, 0xf4, 0xf7, 0xf8, 0xfb, 0x29, 0x1c, 0x02, 0x48, 0xfb, 0xf7, 0xef, 0xff, 0xfe, 0xbd, 0x28, 0x7a, 0x01, 0x00, 0x3c, 0x00, 0xf8, 0xbb, 0x00, 0x00, 0xa5, 0x9a, 0x00, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x00, 0x78, 0x00, 0x21, 0x00, 0xf0, 0xfc, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x18, 0x63, 0x01, 0x00, 0x04, 0x4b, 0x05, 0x49, 0x00, 0x28, 0x1a, 0x68, 0x00, 0xd0, 0x01, 0x1c, 0x10, 0x1c, 0x19, 0x60, 0x70, 0x47, 0x00, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x95, 0x75, 0x00, 0x00, 0x05, 0x48, 0x80, 0xb5, 0x00, 0x7f, 0x24, 0x23, 0x3c, 0x00, 0x34, 0xbc, 0x00, 0x00, 0x04, 0x49, 0x58, 0x43, 0x40, 0x18, 0xc0, 0x69, 0xf4, 0xf7, 0xcc, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x94, 0x46, 0x01, 0x00, 0x02, 0x1c, 0x06, 0x48, 0x80, 0xb5, 0x81, 0x62, 0x82, 0x60, 0x00, 0x7f, 0x24, 0x23, 0x04, 0x49, 0x58, 0x43, 0x40, 0x18, 0x80, 0x69, 0xf4, 0xf7, 0xb9, 0xfb, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x94, 0x46, 0x01, 0x00, 0x3c, 0x00, 0x70, 0xbc, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x20, 0x00, 0xf0, 0x3c, 0xfb, 0x00, 0x20, 0x00, 0xf0, 0x6d, 0xfa, 0x00, 0xf0, 0x65, 0xfa, 0x04, 0x49, 0xc8, 0x6a, 0x01, 0x30, 0xc8, 0x62, 0x08, 0x1f, 0x00, 0x88, 0x07, 0xf0, 0xc1, 0xf8, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x06, 0x48, 0x80, 0xb5, 0x00, 0x21, 0x01, 0x77, 0xc1, 0x6a, 0x01, 0x31, 0xc1, 0x62, 0x04, 0x38, 0x00, 0x88, 0x07, 0xf0, 0x3c, 0x00, 0xac, 0xbc, 0x00, 0x00, 0xb3, 0xf8, 0x03, 0xf0, 0xd1, 0xf9, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x05, 0xf0, 0xe9, 0xfa, 0x80, 0xbd, 0x80, 0xb5, 0x00, 0x28, 0x03, 0xd1, 0x01, 0x20, 0x04, 0xf0, 0x22, 0xfa, 0x80, 0xbd, 0x01, 0x20, 0x03, 0xf0, 0xe6, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x03, 0x49, 0x01, 0x20, 0x49, 0x78, 0x00, 0x29, 0x00, 0xd0, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xbc, 0x00, 0x00, 0x2c, 0x63, 0x01, 0x00, 0x70, 0xb5, 0x13, 0x4d, 0x28, 0x78, 0x00, 0x28, 0x20, 0xd1, 0x01, 0x21, 0x2e, 0x1c, 0x70, 0x68, 0xff, 0xf7, 0x12, 0xfd, 0x00, 0x21, 0x07, 0x20, 0x06, 0xf0, 0x2a, 0xfb, 0x0d, 0x48, 0x00, 0x24, 0x04, 0x71, 0x04, 0xf0, 0xed, 0xf8, 0x06, 0xf0, 0xd5, 0xf9, 0x01, 0x20, 0x28, 0x70, 0x0a, 0x48, 0x04, 0x60, 0x44, 0x60, 0xf6, 0xf7, 0x4c, 0xfd, 0x3c, 0x00, 0x24, 0xbd, 0x00, 0x00, 0xf7, 0xf7, 0x5e, 0xf8, 0xff, 0xf7, 0xa2, 0xff, 0x00, 0xf0, 0xa8, 0xfd, 0x05, 0x48, 0x71, 0x68, 0x03, 0xf0, 0x20, 0xfb, 0x01, 0x20, 0x70, 0xbd, 0x2c, 0x63, 0x01, 0x00, 0x50, 0x00, 0x07, 0x00, 0x80, 0x00, 0x07, 0x00, 0xc4, 0x60, 0x01, 0x00, 0xb0, 0xb5, 0x1e, 0x4c, 0x20, 0x78, 0x01, 0x28, 0x35, 0xd1, 0x25, 0x1c, 0x69, 0x68, 0x1c, 0x48, 0x03, 0xf0, 0x20, 0xfb, 0x3c, 0x00, 0x60, 0xbd, 0x00, 0x00, 0x04, 0xf0, 0xf0, 0xf8, 0x1a, 0x48, 0x01, 0x68, 0x49, 0x08, 0x49, 0x00, 0x01, 0x60, 0x01, 0x68, 0x01, 0x22, 0x11, 0x43, 0x01, 0x60, 0x00, 0xf0, 0x2b, 0xfe, 0x00, 0xf0, 0x1b, 0xfc, 0x06, 0xf0, 0x99, 0xf8, 0xf6, 0xf7, 0x29, 0xfe, 0xf6, 0xf7, 0x2d, 0xfc, 0x00, 0x20, 0x20, 0x70, 0xff, 0xf7, 0x83, 0xff, 0x00, 0xf0, 0x8b, 0xfd, 0x0f, 0x48, 0x81, 0x78, 0x08, 0x22, 0x3c, 0x00, 0x9c, 0xbd, 0x00, 0x00, 0x91, 0x43, 0x81, 0x70, 0x81, 0x78, 0x11, 0x43, 0x81, 0x70, 0x0c, 0x49, 0x10, 0x20, 0x08, 0x71, 0x68, 0x68, 0xff, 0xf7, 0x5f, 0xfd, 0xf7, 0xf7, 0x39, 0xf8, 0xf6, 0xf7, 0x4d, 0xfd, 0x01, 0x21, 0x07, 0x20, 0x06, 0xf0, 0xcd, 0xfa, 0x01, 0x20, 0xb0, 0xbd, 0x00, 0x00, 0x2c, 0x63, 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, 0xf0, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x3c, 0x00, 0xd8, 0xbd, 0x00, 0x00, 0x50, 0x00, 0x07, 0x00, 0x03, 0x49, 0x01, 0x20, 0x89, 0x7a, 0x01, 0x29, 0x00, 0xd0, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, 0xb0, 0xb5, 0x15, 0x4d, 0x04, 0x1c, 0x28, 0x7a, 0x00, 0x28, 0x20, 0xd1, 0xf9, 0xf7, 0x00, 0xfc, 0x02, 0x28, 0x1c, 0xd1, 0x01, 0x20, 0x28, 0x72, 0xe8, 0x68, 0x00, 0x28, 0x10, 0xd0, 0x20, 0x68, 0x29, 0x68, 0x08, 0x60, 0x3c, 0x00, 0x14, 0xbe, 0x00, 0x00, 0x69, 0x68, 0x0d, 0x48, 0x03, 0xf0, 0xc2, 0xfa, 0x01, 0x21, 0x68, 0x68, 0xff, 0xf7, 0xc8, 0xfc, 0x00, 0x22, 0x24, 0x20, 0x61, 0x68, 0x07, 0xf0, 0xcf, 0xfb, 0xb0, 0xbd, 0x00, 0x20, 0x28, 0x72, 0x21, 0x68, 0x01, 0x20, 0xf4, 0xf7, 0xcf, 0xfa, 0xb0, 0xbd, 0x00, 0x20, 0x21, 0x68, 0xf4, 0xf7, 0xca, 0xfa, 0xb0, 0xbd, 0x04, 0x7a, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x3c, 0x00, 0x50, 0xbe, 0x00, 0x00, 0x04, 0x48, 0x80, 0xb5, 0x00, 0x7a, 0x01, 0x28, 0x02, 0xd1, 0x00, 0x20, 0x02, 0xf0, 0xf0, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x04, 0x7a, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x28, 0x07, 0xd0, 0x80, 0x28, 0x09, 0xd1, 0x07, 0x48, 0x00, 0x7a, 0x00, 0x28, 0x04, 0xd0, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x02, 0xf0, 0xde, 0xfe, 0x80, 0xbd, 0x0e, 0x21, 0x24, 0x20, 0xf5, 0xf7, 0x3c, 0x00, 0x8c, 0xbe, 0x00, 0x00, 0x0b, 0xfa, 0x80, 0xbd, 0x04, 0x7a, 0x01, 0x00, 0xf8, 0xb5, 0x3a, 0x4e, 0x05, 0x1c, 0xb0, 0x7a, 0x00, 0x28, 0x69, 0xd1, 0xf9, 0xf7, 0xae, 0xfb, 0x02, 0x28, 0x65, 0xd1, 0x36, 0x48, 0x00, 0x68, 0x00, 0x28, 0x61, 0xd0, 0x35, 0x48, 0x71, 0x68, 0x03, 0xf0, 0x74, 0xfa, 0x01, 0x21, 0x70, 0x68, 0xff, 0xf7, 0x7a, 0xfc, 0x6c, 0x20, 0xf5, 0xf7, 0xb9, 0xfc, 0x04, 0x1c, 0x3c, 0x00, 0xc8, 0xbe, 0x00, 0x00, 0x6c, 0x21, 0xf4, 0xf7, 0xe7, 0xfa, 0x30, 0x68, 0x2c, 0x22, 0x04, 0x60, 0x29, 0x68, 0x81, 0x60, 0x69, 0x68, 0xc1, 0x60, 0x00, 0x21, 0x11, 0x54, 0x81, 0x62, 0xa9, 0x68, 0x00, 0x29, 0x02, 0xd0, 0xe9, 0x68, 0x01, 0x61, 0x05, 0xe0, 0x06, 0xf0, 0x5d, 0xff, 0x69, 0x68, 0x40, 0x18, 0x31, 0x68, 0x08, 0x61, 0x70, 0x68, 0xff, 0xf7, 0x14, 0xfd, 0x69, 0x21, 0x08, 0x55, 0x3c, 0x00, 0x04, 0xbf, 0x00, 0x00, 0x00, 0x20, 0xf9, 0xf7, 0x09, 0xfb, 0x01, 0x27, 0x3b, 0x1c, 0x06, 0x1c, 0x22, 0x1c, 0x24, 0x32, 0x00, 0x21, 0xf9, 0xf7, 0x79, 0xfb, 0x1c, 0x48, 0x03, 0x21, 0x00, 0x88, 0x89, 0x03, 0x08, 0x43, 0x21, 0x1c, 0x40, 0x31, 0x00, 0x91, 0x48, 0x83, 0x18, 0x48, 0x10, 0x21, 0x60, 0x60, 0x18, 0x48, 0xa0, 0x60, 0xa7, 0x63, 0x67, 0x63, 0x00, 0x20, 0xf5, 0xf7, 0x4c, 0xfb, 0x3c, 0x00, 0x40, 0xbf, 0x00, 0x00, 0xe0, 0x60, 0x02, 0x89, 0x00, 0x99, 0xca, 0x83, 0x07, 0x68, 0x31, 0x1c, 0x38, 0x1d, 0x27, 0x61, 0xfe, 0xf7, 0x8e, 0xfe, 0x38, 0x1c, 0x0a, 0x30, 0x0f, 0x49, 0xfe, 0xf7, 0x89, 0xfe, 0xa4, 0x20, 0x38, 0x80, 0x00, 0x20, 0x04, 0xf0, 0xde, 0xfb, 0x00, 0x22, 0x1f, 0x20, 0x69, 0x68, 0x07, 0xf0, 0x2d, 0xfb, 0xf8, 0xbd, 0xff, 0xe7, 0x00, 0x20, 0x29, 0x68, 0xf4, 0xf7, 0x3c, 0x00, 0x7c, 0xbf, 0x00, 0x00, 0x2e, 0xfa, 0xf8, 0xe7, 0x14, 0x7a, 0x01, 0x00, 0x80, 0x5a, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0xfa, 0x60, 0x01, 0x00, 0x99, 0xec, 0x00, 0x00, 0x15, 0xed, 0x00, 0x00, 0x12, 0x61, 0x01, 0x00, 0x06, 0x48, 0x80, 0xb5, 0x81, 0x7a, 0x00, 0x29, 0x07, 0xd0, 0x00, 0x68, 0x04, 0x22, 0x20, 0x30, 0x01, 0x7b, 0x11, 0x43, 0x01, 0x73, 0x02, 0xf0, 0x6b, 0xfd, 0x80, 0xbd, 0x3c, 0x00, 0xb8, 0xbf, 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x4c, 0xa0, 0x7a, 0x01, 0x28, 0x03, 0xd1, 0x06, 0xf0, 0xf1, 0xfe, 0x21, 0x68, 0x88, 0x61, 0x10, 0xbd, 0x14, 0x7a, 0x01, 0x00, 0x03, 0x1c, 0x08, 0x1c, 0x1f, 0x49, 0x70, 0xb5, 0x0a, 0x68, 0x01, 0x2b, 0x1c, 0xd0, 0x80, 0x2b, 0x05, 0xd0, 0x83, 0x2b, 0x30, 0xd1, 0x88, 0x7a, 0x00, 0x28, 0x14, 0xd0, 0x29, 0xe0, 0x53, 0x69, 0x3c, 0x00, 0xf4, 0xbf, 0x00, 0x00, 0x00, 0x2b, 0x0e, 0xd0, 0x94, 0x69, 0xd5, 0x69, 0x2e, 0x1b, 0x0c, 0x69, 0x5d, 0x1b, 0x36, 0x1b, 0xb6, 0x10, 0xa4, 0x19, 0x0c, 0x61, 0xcc, 0x68, 0x2d, 0x1b, 0xad, 0x10, 0x64, 0x19, 0xcc, 0x60, 0x93, 0x61, 0x02, 0xf0, 0x81, 0xfd, 0x70, 0xbd, 0x02, 0x28, 0x12, 0xd1, 0x90, 0x6a, 0x0c, 0x1c, 0x00, 0x28, 0xf8, 0xd0, 0x07, 0xf0, 0x0e, 0xfa, 0xa0, 0x7a, 0x01, 0x28, 0x3c, 0x00, 0x30, 0xc0, 0x00, 0x00, 0xf3, 0xd1, 0x20, 0x68, 0x81, 0x6a, 0x00, 0x29, 0xef, 0xd1, 0x20, 0x30, 0x01, 0x7b, 0x08, 0x22, 0x11, 0x43, 0x01, 0x73, 0x70, 0xbd, 0x02, 0xf0, 0x21, 0xfd, 0x70, 0xbd, 0x0e, 0x21, 0x1f, 0x20, 0xf5, 0xf7, 0x28, 0xf9, 0x70, 0xbd, 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, 0x02, 0x49, 0x0c, 0x31, 0x03, 0xc9, 0x40, 0x18, 0x70, 0x47, 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, 0x3c, 0x00, 0x6c, 0xc0, 0x00, 0x00, 0x05, 0x48, 0x80, 0xb5, 0x00, 0x68, 0x04, 0x22, 0x20, 0x30, 0x01, 0x7b, 0x11, 0x43, 0x01, 0x73, 0x07, 0xf0, 0xe4, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, 0x70, 0xb5, 0x16, 0x4c, 0x0e, 0x1c, 0xa1, 0x7a, 0x00, 0x29, 0x1c, 0xd0, 0x21, 0x68, 0x08, 0x61, 0x07, 0xf0, 0x32, 0xfa, 0x00, 0x28, 0x17, 0xd0, 0x20, 0x68, 0x00, 0x25, 0x05, 0x62, 0x00, 0x22, 0x3c, 0x00, 0xa8, 0xc0, 0x00, 0x00, 0x83, 0x21, 0x1f, 0x20, 0x07, 0xf0, 0x94, 0xfa, 0x60, 0x68, 0xff, 0xf7, 0x03, 0xfc, 0x21, 0x68, 0x04, 0x22, 0x20, 0x31, 0x08, 0x7b, 0x2b, 0x1c, 0x90, 0x43, 0x08, 0x73, 0x31, 0x1c, 0x00, 0x22, 0x1f, 0x20, 0x07, 0xf0, 0x61, 0xfb, 0x70, 0xbd, 0x20, 0x68, 0x08, 0x22, 0x20, 0x30, 0x01, 0x7b, 0x11, 0x43, 0x01, 0x73, 0x02, 0xf0, 0xd6, 0xfc, 0x70, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0xc0, 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x77, 0xfc, 0x00, 0xf0, 0x6f, 0xfc, 0x00, 0xf0, 0x29, 0xff, 0x00, 0xf0, 0x5d, 0xfa, 0x00, 0xf0, 0xc5, 0xf8, 0x00, 0xf0, 0x85, 0xff, 0x80, 0xbd, 0x80, 0xb5, 0xfa, 0xf7, 0x85, 0xfa, 0x80, 0xbd, 0x01, 0x48, 0xc0, 0x68, 0x70, 0x47, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x3c, 0x00, 0x20, 0xc1, 0x00, 0x00, 0x02, 0x48, 0xc1, 0x60, 0x70, 0x47, 0x00, 0x00, 0x81, 0x75, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x01, 0x48, 0x02, 0x49, 0xc8, 0x60, 0x70, 0x47, 0x81, 0x75, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x01, 0x49, 0x88, 0x61, 0x70, 0x47, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x01, 0x49, 0x00, 0x20, 0x88, 0x61, 0x70, 0x47, 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x00, 0x28, 0x3c, 0x00, 0x5c, 0xc1, 0x00, 0x00, 0x00, 0xd0, 0x01, 0x1c, 0x02, 0x48, 0xc1, 0x61, 0x70, 0x47, 0x00, 0x00, 0x89, 0x75, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x02, 0x48, 0x81, 0x62, 0x70, 0x47, 0x00, 0x00, 0x8d, 0x75, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x02, 0x48, 0x01, 0x62, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xc1, 0x00, 0x00, 0x91, 0x75, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x02, 0x48, 0x01, 0x61, 0x70, 0x47, 0x00, 0x00, 0x99, 0x75, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x01, 0x48, 0x02, 0x49, 0x08, 0x61, 0x70, 0x47, 0x81, 0x75, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x02, 0x1c, 0x08, 0x1c, 0x80, 0x2a, 0x80, 0xb5, 0x02, 0xd1, 0x00, 0xf0, 0x3c, 0x00, 0xd4, 0xc1, 0x00, 0x00, 0x07, 0xf8, 0x80, 0xbd, 0x1e, 0x21, 0x21, 0x20, 0xf5, 0xf7, 0x62, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x10, 0x4d, 0x04, 0x1c, 0xa8, 0x6b, 0x01, 0x30, 0xa8, 0x63, 0x69, 0x6b, 0x09, 0x1a, 0x28, 0x1c, 0x00, 0x6b, 0x0c, 0x29, 0x03, 0xd9, 0x00, 0x21, 0xff, 0xf7, 0x91, 0xfa, 0x03, 0xe0, 0x08, 0x29, 0x01, 0xd1, 0xff, 0xf7, 0x32, 0xfb, 0x20, 0x1c, 0x00, 0xf0, 0x3c, 0x00, 0x10, 0xc2, 0x00, 0x00, 0x4d, 0xf9, 0x60, 0x69, 0x40, 0x07, 0x01, 0xd5, 0x03, 0xf0, 0x0c, 0xfc, 0x20, 0x1c, 0xe9, 0x6a, 0xf4, 0xf7, 0xdb, 0xf8, 0xb0, 0xbd, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x02, 0x48, 0x41, 0x62, 0x70, 0x47, 0x00, 0x00, 0xb5, 0x75, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x01, 0x20, 0x09, 0x6c, 0x00, 0x29, 0x3c, 0x00, 0x4c, 0xc2, 0x00, 0x00, 0x00, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0x07, 0x4c, 0xe1, 0x6b, 0x00, 0x29, 0x01, 0xd1, 0xe0, 0x63, 0x04, 0xe0, 0x81, 0x42, 0x02, 0xd0, 0x00, 0x20, 0xc0, 0x43, 0xf8, 0xe7, 0x06, 0xf0, 0x9c, 0xfd, 0x20, 0x64, 0x10, 0xbd, 0x28, 0x7a, 0x01, 0x00, 0x01, 0x48, 0x00, 0x6c, 0x70, 0x47, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x3c, 0x00, 0x88, 0xc2, 0x00, 0x00, 0x05, 0x49, 0x80, 0xb5, 0x00, 0x20, 0x48, 0x63, 0x88, 0x63, 0xff, 0x21, 0x09, 0x31, 0x15, 0x22, 0x10, 0x20, 0xf6, 0xf7, 0xfb, 0xf9, 0x80, 0xbd, 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x02, 0x48, 0x81, 0x60, 0x70, 0x47, 0x00, 0x00, 0xc1, 0x75, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x3c, 0x00, 0xc4, 0xc2, 0x00, 0x00, 0x02, 0x48, 0xc1, 0x62, 0x70, 0x47, 0x00, 0x00, 0xc5, 0x75, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x04, 0x4b, 0x05, 0x49, 0x00, 0x28, 0x5a, 0x68, 0x00, 0xd0, 0x01, 0x1c, 0x10, 0x1c, 0x59, 0x60, 0x70, 0x47, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0xc9, 0x75, 0x00, 0x00, 0x03, 0x49, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x02, 0x48, 0x41, 0x61, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xc3, 0x00, 0x00, 0xcd, 0x75, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x0f, 0x4b, 0x10, 0xb5, 0xd9, 0x68, 0x00, 0x29, 0x19, 0xd0, 0x0e, 0x4c, 0x00, 0x21, 0xca, 0x00, 0x12, 0x19, 0x40, 0x3a, 0xd2, 0x6b, 0x82, 0x42, 0x02, 0xda, 0x01, 0x31, 0x03, 0x29, 0xf6, 0xd3, 0x48, 0x1c, 0x1a, 0x78, 0x00, 0x06, 0x00, 0x0e, 0x90, 0x42, 0x08, 0xd0, 0x18, 0x70, 0x08, 0x06, 0x00, 0x0e, 0x04, 0x1c, 0x3c, 0x00, 0x3c, 0xc3, 0x00, 0x00, 0xf6, 0xf7, 0xba, 0xfa, 0x20, 0x1c, 0x03, 0xf0, 0x1b, 0xfd, 0x10, 0xbd, 0x18, 0x63, 0x01, 0x00, 0x3c, 0x42, 0x01, 0x00, 0x10, 0xb5, 0x14, 0x4c, 0xe1, 0x68, 0x00, 0x29, 0x22, 0xd0, 0x21, 0x78, 0x12, 0x4b, 0xca, 0x00, 0xd2, 0x18, 0x40, 0x3a, 0xd3, 0x6b, 0x83, 0x42, 0x02, 0xda, 0x48, 0x1c, 0x20, 0x70, 0x0b, 0xe0, 0x92, 0x6b, 0x82, 0x42, 0x14, 0xdd, 0xff, 0x31, 0x3c, 0x00, 0x78, 0xc3, 0x00, 0x00, 0x08, 0x06, 0x00, 0x0e, 0x20, 0x70, 0x03, 0xd1, 0x19, 0x21, 0x86, 0x20, 0xf4, 0xf7, 0x8e, 0xff, 0x20, 0x78, 0xff, 0x30, 0x00, 0x06, 0x00, 0x0e, 0xf6, 0xf7, 0x90, 0xfa, 0x20, 0x78, 0xff, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x03, 0xf0, 0xee, 0xfc, 0x10, 0xbd, 0x00, 0x00, 0x18, 0x63, 0x01, 0x00, 0x3c, 0x42, 0x01, 0x00, 0x09, 0x48, 0x00, 0x21, 0x01, 0x81, 0x41, 0x81, 0x3c, 0x00, 0xb4, 0xc3, 0x00, 0x00, 0x81, 0x81, 0xc1, 0x81, 0x07, 0x4a, 0x02, 0x80, 0x01, 0x23, 0xdb, 0x02, 0x43, 0x80, 0x82, 0x80, 0xc2, 0x80, 0x41, 0x76, 0x31, 0x21, 0x81, 0x76, 0x01, 0x21, 0x01, 0x76, 0x70, 0x47, 0x00, 0x00, 0x30, 0x80, 0x07, 0x00, 0xff, 0xff, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x20, 0xf6, 0xf7, 0xf8, 0xf8, 0x01, 0x20, 0xf6, 0xf7, 0xdb, 0xfc, 0x01, 0x20, 0xf6, 0xf7, 0x5a, 0xfa, 0x3c, 0x00, 0xf0, 0xc3, 0x00, 0x00, 0x01, 0x20, 0x00, 0xf0, 0xf1, 0xfd, 0x01, 0x20, 0xf7, 0xf7, 0xc6, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x11, 0x4c, 0x00, 0x29, 0x07, 0xd1, 0x00, 0x28, 0x02, 0xd1, 0x01, 0x20, 0xe0, 0x60, 0x06, 0xe0, 0x00, 0x21, 0xe1, 0x60, 0x03, 0xe0, 0x01, 0x29, 0x07, 0xd1, 0x00, 0x28, 0x01, 0xd0, 0x20, 0x70, 0x03, 0xe0, 0x18, 0x21, 0x86, 0x20, 0xf4, 0xf7, 0x3c, 0xff, 0x3c, 0x00, 0x2c, 0xc4, 0x00, 0x00, 0x20, 0x78, 0xff, 0x30, 0x00, 0x06, 0x00, 0x0e, 0xf6, 0xf7, 0x3e, 0xfa, 0x20, 0x78, 0xff, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x03, 0xf0, 0x9c, 0xfc, 0x10, 0xbd, 0x00, 0x00, 0x18, 0x63, 0x01, 0x00, 0x05, 0x49, 0x80, 0xb5, 0x09, 0x68, 0x88, 0x42, 0x05, 0xd0, 0xfe, 0xf7, 0xff, 0xfb, 0x00, 0xf0, 0x87, 0xfa, 0xff, 0xf7, 0x2b, 0xfc, 0x80, 0xbd, 0xa8, 0x69, 0x01, 0x00, 0x3c, 0x00, 0x68, 0xc4, 0x00, 0x00, 0x01, 0x49, 0x48, 0x70, 0x70, 0x47, 0x00, 0x00, 0x2c, 0x63, 0x01, 0x00, 0x01, 0x49, 0xc8, 0x60, 0x70, 0x47, 0x00, 0x00, 0x4c, 0x7b, 0x01, 0x00, 0x03, 0x49, 0x01, 0x20, 0x09, 0x78, 0x00, 0x29, 0x00, 0xd0, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x2c, 0x63, 0x01, 0x00, 0x04, 0x4a, 0x00, 0x28, 0x02, 0xd0, 0x90, 0x69, 0x01, 0x30, 0x90, 0x61, 0xd0, 0x69, 0x40, 0x18, 0x3c, 0x00, 0xa4, 0xc4, 0x00, 0x00, 0xd0, 0x61, 0x70, 0x47, 0x90, 0x5c, 0x01, 0x00, 0xfe, 0xb5, 0x04, 0x1c, 0x00, 0x68, 0x05, 0x68, 0x28, 0x1c, 0xfe, 0xf7, 0x27, 0xff, 0x07, 0x1c, 0x60, 0x69, 0x15, 0x4e, 0xc0, 0x07, 0xc0, 0x0f, 0x21, 0xd0, 0x01, 0xaa, 0x02, 0xa9, 0x28, 0x1c, 0xfe, 0xf7, 0x12, 0xff, 0x38, 0x78, 0xc0, 0x07, 0x0c, 0xd4, 0x60, 0x69, 0x80, 0x07, 0x08, 0xd5, 0x00, 0xab, 0x18, 0x7a, 0x3c, 0x00, 0xe0, 0xc4, 0x00, 0x00, 0x00, 0x28, 0x01, 0xd0, 0x02, 0x28, 0x02, 0xd1, 0x70, 0x6a, 0x01, 0x30, 0x70, 0x62, 0xfe, 0xbd, 0x00, 0xab, 0x18, 0x7a, 0x00, 0x28, 0x01, 0xd0, 0x02, 0x28, 0xf8, 0xd1, 0x70, 0x6a, 0x01, 0x30, 0x70, 0x62, 0xb0, 0x6a, 0x01, 0x30, 0xb0, 0x62, 0xf1, 0xe7, 0xf0, 0x6a, 0x01, 0x30, 0xf0, 0x62, 0xed, 0xe7, 0x00, 0x00, 0x90, 0x5c, 0x01, 0x00, 0x02, 0x49, 0x48, 0x69, 0x3c, 0x00, 0x1c, 0xc5, 0x00, 0x00, 0x01, 0x30, 0x48, 0x61, 0x70, 0x47, 0x00, 0x00, 0x90, 0x5c, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x01, 0x1c, 0x40, 0x31, 0x10, 0xb5, 0x0a, 0x8b, 0x12, 0x07, 0x92, 0x0f, 0x01, 0x2a, 0x33, 0xd0, 0x4a, 0x78, 0x1a, 0x49, 0x04, 0x1c, 0x60, 0x34, 0x00, 0x2a, 0x0b, 0x6a, 0x22, 0xd1, 0xe2, 0x79, 0x01, 0x2a, 0x02, 0xd9, 0xcc, 0x68, 0x01, 0x34, 0x3c, 0x00, 0x58, 0xc5, 0x00, 0x00, 0xcc, 0x60, 0x02, 0x2a, 0x02, 0xd9, 0x0c, 0x69, 0x01, 0x34, 0x0c, 0x61, 0x0c, 0x68, 0x01, 0x34, 0x0c, 0x60, 0x44, 0x6b, 0x00, 0x2c, 0x03, 0xd0, 0x04, 0x69, 0x24, 0x7c, 0xe4, 0x07, 0x02, 0xd5, 0x4c, 0x68, 0x01, 0x34, 0x4c, 0x60, 0x80, 0x6b, 0x00, 0x28, 0x02, 0xd0, 0x08, 0x6b, 0x01, 0x30, 0x08, 0x63, 0x00, 0x2a, 0x0c, 0xd0, 0x98, 0x18, 0x01, 0x38, 0x08, 0xe0, 0x3c, 0x00, 0x94, 0xc5, 0x00, 0x00, 0x01, 0x2a, 0x01, 0xd0, 0x02, 0x2a, 0x02, 0xd1, 0x88, 0x68, 0x01, 0x30, 0x88, 0x60, 0xe0, 0x79, 0x18, 0x18, 0x08, 0x62, 0x10, 0xbd, 0x00, 0x00, 0x90, 0x5c, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x01, 0x49, 0x0a, 0x20, 0x08, 0x81, 0x70, 0x47, 0xc4, 0x7a, 0x01, 0x00, 0xf0, 0xb5, 0x32, 0x4f, 0x04, 0x1c, 0x78, 0x78, 0x85, 0xb0, 0xc0, 0x07, 0xc0, 0x0f, 0x03, 0x90, 0x3c, 0x00, 0xd0, 0xc5, 0x00, 0x00, 0xb8, 0x78, 0x02, 0x90, 0x01, 0x20, 0xa0, 0x40, 0x04, 0x90, 0x39, 0x1c, 0x88, 0x70, 0x2c, 0x48, 0x00, 0x88, 0x06, 0xf0, 0x0b, 0xfc, 0x01, 0x90, 0xfe, 0xf7, 0xae, 0xfc, 0x04, 0x30, 0x29, 0x4e, 0xa5, 0x00, 0x71, 0x59, 0x09, 0x79, 0x88, 0x42, 0x06, 0xd0, 0xfe, 0xf7, 0xa5, 0xfc, 0x71, 0x59, 0x04, 0x30, 0x08, 0x71, 0x01, 0x20, 0x78, 0x70, 0x00, 0x20, 0x78, 0x70, 0x3c, 0x00, 0x0c, 0xc6, 0x00, 0x00, 0x21, 0x48, 0x01, 0x21, 0x20, 0x4e, 0x30, 0x38, 0x01, 0x55, 0x71, 0x59, 0x03, 0x20, 0x08, 0x70, 0x06, 0xf0, 0xc6, 0xfb, 0x06, 0x1c, 0xfe, 0xf7, 0x91, 0xfc, 0x36, 0x18, 0x0e, 0x36, 0x09, 0xe0, 0x30, 0x1c, 0x06, 0xf0, 0xf5, 0xfa, 0x00, 0x28, 0x04, 0xd0, 0x23, 0x21, 0x86, 0x20, 0xf4, 0xf7, 0x33, 0xfe, 0x03, 0xe0, 0xf6, 0xf7, 0x34, 0xfb, 0x00, 0x28, 0xf1, 0xd0, 0x3c, 0x00, 0x48, 0xc6, 0x00, 0x00, 0x12, 0x48, 0x13, 0x49, 0x3c, 0x38, 0x00, 0x78, 0x08, 0x72, 0x20, 0x1c, 0xf4, 0xf7, 0xa2, 0xfa, 0x0e, 0x4e, 0x71, 0x59, 0x08, 0x71, 0x03, 0x98, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x21, 0x79, 0x70, 0x09, 0x48, 0x00, 0x88, 0x01, 0x99, 0x06, 0xf0, 0xbd, 0xfb, 0x02, 0x98, 0xb8, 0x70, 0x09, 0x49, 0x49, 0x79, 0x04, 0x98, 0x88, 0x42, 0x03, 0xd0, 0x24, 0x21, 0x86, 0x20, 0x3c, 0x00, 0x84, 0xc6, 0x00, 0x00, 0xf4, 0xf7, 0x0e, 0xfe, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x50, 0x07, 0x00, 0xd0, 0x79, 0x01, 0x00, 0x10, 0x7b, 0x01, 0x00, 0x80, 0x80, 0x07, 0x00, 0x50, 0x80, 0x07, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x05, 0x28, 0x01, 0xd3, 0xf4, 0xf7, 0x29, 0xfe, 0x05, 0x2d, 0x01, 0xd3, 0xf4, 0xf7, 0x25, 0xfe, 0x0b, 0x4a, 0xa8, 0x00, 0x11, 0x58, 0xa0, 0x00, 0x10, 0x58, 0x3c, 0x00, 0xc0, 0xc6, 0x00, 0x00, 0x0e, 0xc9, 0x0e, 0xc0, 0x06, 0x21, 0x06, 0x22, 0x06, 0x48, 0x69, 0x43, 0x2a, 0x38, 0x09, 0x18, 0x62, 0x43, 0x10, 0x18, 0x06, 0x22, 0xf3, 0xf7, 0x0f, 0xff, 0x02, 0x48, 0x30, 0x38, 0x41, 0x5d, 0x01, 0x55, 0xb0, 0xbd, 0x10, 0x7b, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0e, 0x48, 0x0d, 0x1c, 0x80, 0x78, 0x01, 0x21, 0xa1, 0x40, 0x08, 0x40, 0x03, 0xd0, 0x01, 0x21, 0x3c, 0x00, 0xfc, 0xc6, 0x00, 0x00, 0x86, 0x20, 0xf4, 0xf7, 0xd1, 0xfd, 0x06, 0x21, 0x06, 0x22, 0x09, 0x48, 0x69, 0x43, 0x09, 0x18, 0x62, 0x43, 0x10, 0x18, 0x06, 0x22, 0xf3, 0xf7, 0xf1, 0xfe, 0x20, 0x1c, 0xf4, 0xf7, 0x40, 0xfa, 0x03, 0x4a, 0xa1, 0x00, 0x2a, 0x32, 0x51, 0x58, 0x08, 0x71, 0xb0, 0xbd, 0x00, 0x50, 0x07, 0x00, 0xe6, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x80, 0xb5, 0x00, 0x20, 0x48, 0x60, 0x3c, 0x00, 0x38, 0xc7, 0x00, 0x00, 0x07, 0xf0, 0x32, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0xd4, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x05, 0x28, 0x01, 0xd3, 0xf4, 0xf7, 0xd8, 0xfd, 0x07, 0x49, 0x08, 0x7a, 0x07, 0x4a, 0x10, 0x70, 0x01, 0x20, 0x08, 0x72, 0xfe, 0xf7, 0xf4, 0xfb, 0x04, 0x4a, 0x04, 0x30, 0xa1, 0x00, 0x3c, 0x32, 0x51, 0x58, 0x08, 0x71, 0x10, 0xbd, 0x00, 0x00, 0x80, 0x80, 0x07, 0x00, 0x3c, 0x00, 0x74, 0xc7, 0x00, 0x00, 0xd4, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x80, 0xb5, 0x01, 0x20, 0x48, 0x60, 0x07, 0xf0, 0x0e, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0xd4, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x05, 0x28, 0x01, 0xd3, 0xf4, 0xf7, 0xb4, 0xfd, 0x20, 0x1c, 0xf5, 0xf7, 0x8f, 0xfe, 0x00, 0x21, 0x20, 0x1c, 0xfb, 0xf7, 0x31, 0xfd, 0x01, 0x21, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x09, 0x04, 0x3c, 0x00, 0xb0, 0xc7, 0x00, 0x00, 0x09, 0x0c, 0x20, 0x1c, 0x04, 0xf0, 0x22, 0xfa, 0x10, 0xbd, 0x00, 0x00, 0x06, 0x49, 0x01, 0x20, 0x05, 0x4b, 0x88, 0x60, 0x00, 0x20, 0x3c, 0x33, 0x00, 0x21, 0x82, 0x00, 0x9a, 0x58, 0x11, 0x70, 0x01, 0x30, 0x05, 0x28, 0xf9, 0xdb, 0x70, 0x47, 0xd4, 0x7a, 0x01, 0x00, 0x0f, 0x49, 0x38, 0xb5, 0x00, 0x20, 0x88, 0x60, 0x0e, 0x48, 0x01, 0x1c, 0x20, 0x31, 0x8a, 0x79, 0x3c, 0x00, 0xec, 0xc7, 0x00, 0x00, 0x00, 0xab, 0x1a, 0x70, 0xc9, 0x79, 0x0a, 0x4c, 0x09, 0x4d, 0x59, 0x70, 0x0c, 0x34, 0x3c, 0x35, 0x00, 0x21, 0x03, 0x22, 0x63, 0x5c, 0x00, 0x2b, 0x02, 0xd0, 0x8b, 0x00, 0xeb, 0x58, 0x1a, 0x70, 0x01, 0x31, 0x05, 0x29, 0xf6, 0xdb, 0x00, 0xab, 0x19, 0x88, 0xc1, 0x84, 0x38, 0xbd, 0x00, 0x00, 0xd4, 0x7a, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, 0xff, 0xb5, 0x14, 0x4f, 0x3c, 0x00, 0x28, 0xc8, 0x00, 0x00, 0x04, 0x1c, 0xbe, 0x79, 0x0d, 0x1c, 0x81, 0xb0, 0x0f, 0x20, 0x00, 0xf0, 0xb9, 0xf8, 0x2a, 0x1c, 0x10, 0x4d, 0x00, 0x90, 0x21, 0x1c, 0x28, 0x1c, 0xf4, 0xf7, 0xde, 0xfc, 0x21, 0x1c, 0xa8, 0x1d, 0x03, 0x9a, 0xf4, 0xf7, 0xd9, 0xfc, 0x21, 0x1c, 0x28, 0x1c, 0x0c, 0x30, 0x04, 0x9a, 0xf4, 0xf7, 0xd3, 0xfc, 0x21, 0x1c, 0x28, 0x1c, 0x12, 0x30, 0x0a, 0x9a, 0xf4, 0xf7, 0x3c, 0x00, 0x64, 0xc8, 0x00, 0x00, 0xcd, 0xfc, 0x07, 0xf0, 0x9b, 0xf8, 0x00, 0x98, 0x00, 0xf0, 0x76, 0xf8, 0xbe, 0x71, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0x20, 0x10, 0x07, 0x00, 0xe6, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0x00, 0x20, 0xf6, 0xf7, 0x26, 0xf8, 0x07, 0x49, 0x88, 0x78, 0x00, 0x09, 0x00, 0x01, 0x88, 0x70, 0x00, 0x24, 0x20, 0x1c, 0xf5, 0xf7, 0x11, 0xfe, 0x01, 0x34, 0x24, 0x06, 0x24, 0x0e, 0x3c, 0x00, 0xa0, 0xc8, 0x00, 0x00, 0x04, 0x2c, 0xf7, 0xd3, 0x10, 0xbd, 0x00, 0x00, 0x00, 0x50, 0x07, 0x00, 0x80, 0xb5, 0x02, 0xf0, 0xe3, 0xfb, 0x03, 0x48, 0x81, 0x78, 0x0f, 0x22, 0x11, 0x43, 0x81, 0x70, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x50, 0x07, 0x00, 0xf8, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x05, 0x28, 0x01, 0xd3, 0xf4, 0xf7, 0x17, 0xfd, 0xa6, 0x00, 0x00, 0x2d, 0x11, 0x4f, 0x07, 0xd1, 0xb8, 0x59, 0x3c, 0x00, 0xdc, 0xc8, 0x00, 0x00, 0x81, 0x68, 0x00, 0x29, 0x0e, 0xd1, 0x40, 0x78, 0x00, 0x28, 0x0b, 0xd0, 0x02, 0xe0, 0xff, 0x35, 0x2d, 0x06, 0x2d, 0x0e, 0x29, 0x1c, 0x20, 0x1c, 0xfb, 0xf7, 0x88, 0xfc, 0x01, 0x1c, 0x20, 0x1c, 0x04, 0xf0, 0x7e, 0xf9, 0x06, 0x49, 0x01, 0x20, 0x30, 0x39, 0x08, 0x55, 0x04, 0x48, 0x3c, 0x38, 0x80, 0x68, 0x00, 0x28, 0x02, 0xd1, 0xb9, 0x59, 0x03, 0x20, 0x08, 0x70, 0x3c, 0x00, 0x18, 0xc9, 0x00, 0x00, 0xf8, 0xbd, 0x00, 0x00, 0x10, 0x7b, 0x01, 0x00, 0x80, 0xb5, 0x04, 0xf0, 0xcd, 0xf9, 0x80, 0xbd, 0x10, 0xb5, 0x04, 0x1c, 0x05, 0x28, 0x01, 0xd3, 0xf4, 0xf7, 0xe6, 0xfc, 0x20, 0x1c, 0xf5, 0xf7, 0xc1, 0xfd, 0x00, 0x20, 0x05, 0x4a, 0xa1, 0x00, 0x51, 0x58, 0x88, 0x60, 0x04, 0x49, 0x88, 0x78, 0x01, 0x22, 0xa2, 0x40, 0x10, 0x43, 0x88, 0x70, 0x10, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x54, 0xc9, 0x00, 0x00, 0x10, 0x7b, 0x01, 0x00, 0x00, 0x50, 0x07, 0x00, 0x02, 0x4a, 0x91, 0x78, 0x08, 0x43, 0x90, 0x70, 0x70, 0x47, 0x00, 0x00, 0x00, 0x50, 0x07, 0x00, 0xf8, 0xb5, 0x0c, 0x4f, 0xbe, 0x79, 0x0f, 0x20, 0x00, 0xf0, 0x18, 0xf8, 0x05, 0x1c, 0x00, 0x24, 0x20, 0x1c, 0xf4, 0xf7, 0x0d, 0xf9, 0x08, 0x4a, 0xa1, 0x00, 0x51, 0x58, 0x08, 0x71, 0x01, 0x34, 0x24, 0x06, 0x24, 0x0e, 0x3c, 0x00, 0x90, 0xc9, 0x00, 0x00, 0x04, 0x2c, 0xf3, 0xd3, 0x28, 0x1c, 0xff, 0xf7, 0xe1, 0xff, 0xbe, 0x71, 0xf8, 0xbd, 0x00, 0x00, 0x20, 0x10, 0x07, 0x00, 0x10, 0x7b, 0x01, 0x00, 0xb0, 0xb5, 0x08, 0x49, 0x8d, 0x78, 0x8a, 0x78, 0x05, 0x40, 0x82, 0x43, 0x8a, 0x70, 0x06, 0xf0, 0xf9, 0xf9, 0x04, 0x1c, 0x0a, 0x34, 0x20, 0x1c, 0x06, 0xf0, 0x34, 0xf9, 0x00, 0x28, 0xfa, 0xd0, 0x28, 0x1c, 0xb0, 0xbd, 0x3c, 0x00, 0xcc, 0xc9, 0x00, 0x00, 0x00, 0x50, 0x07, 0x00, 0x01, 0x49, 0x0a, 0x20, 0x08, 0x81, 0x70, 0x47, 0x38, 0x7b, 0x01, 0x00, 0xf8, 0xb5, 0x10, 0x48, 0x04, 0x26, 0x04, 0x1c, 0xe0, 0x34, 0x05, 0x1c, 0x38, 0x3d, 0x00, 0x27, 0x20, 0x1c, 0x1c, 0x30, 0xe4, 0x60, 0xa0, 0x61, 0x27, 0x61, 0x0b, 0x48, 0xa6, 0x82, 0xe0, 0x61, 0x27, 0x62, 0xa7, 0x62, 0x06, 0x20, 0xa0, 0x84, 0x20, 0x1c, 0xfe, 0xf7, 0x3c, 0x00, 0x08, 0xca, 0x00, 0x00, 0x87, 0xfc, 0x20, 0x1c, 0x0c, 0x30, 0xf6, 0xf7, 0xb7, 0xf9, 0x05, 0x49, 0x38, 0x3c, 0xac, 0x42, 0x08, 0x80, 0xe7, 0xd1, 0xf8, 0xbd, 0x00, 0x00, 0xd4, 0xe4, 0x01, 0x00, 0x12, 0x61, 0x01, 0x00, 0x48, 0x7b, 0x01, 0x00, 0xf7, 0xb5, 0x05, 0x1c, 0x0c, 0x23, 0x0f, 0x1c, 0x12, 0x49, 0x58, 0x43, 0x44, 0x18, 0x20, 0x88, 0x06, 0xf0, 0xea, 0xf9, 0xa0, 0x78, 0x01, 0x28, 0x3c, 0x00, 0x44, 0xca, 0x00, 0x00, 0x1a, 0xd1, 0x66, 0x68, 0x02, 0x2f, 0x05, 0xd1, 0x5c, 0x20, 0x80, 0x5b, 0x02, 0x99, 0x00, 0x09, 0x88, 0x42, 0x11, 0xd1, 0x28, 0x1c, 0xfe, 0xf7, 0xfb, 0xff, 0x30, 0x1c, 0xf9, 0xf7, 0xfa, 0xfd, 0x04, 0x20, 0xa0, 0x70, 0x39, 0x1c, 0x28, 0x1c, 0xfb, 0xf7, 0xf4, 0xf8, 0x03, 0x4a, 0xe8, 0x00, 0x3c, 0x32, 0x11, 0x58, 0x01, 0x31, 0x11, 0x50, 0xfe, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x80, 0xca, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0x01, 0x20, 0x06, 0x4a, 0x00, 0x21, 0x0c, 0x23, 0x4b, 0x43, 0x9b, 0x18, 0x9b, 0x78, 0x00, 0x2b, 0x00, 0xd0, 0x00, 0x20, 0x01, 0x31, 0x04, 0x29, 0xf5, 0xdb, 0x70, 0x47, 0x60, 0x7b, 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0xff, 0xf7, 0xea, 0xfc, 0x00, 0x28, 0x03, 0xd1, 0x20, 0x21, 0x0c, 0x20, 0xf4, 0xf7, 0xf6, 0xfb, 0x26, 0x1c, 0x60, 0x36, 0x3c, 0x00, 0xbc, 0xca, 0x00, 0x00, 0x00, 0x21, 0xf1, 0x71, 0xe1, 0x64, 0x60, 0x6b, 0x25, 0x1c, 0x40, 0x35, 0x00, 0x28, 0x31, 0xd0, 0xff, 0xf7, 0x04, 0xf9, 0x01, 0x22, 0x12, 0x03, 0x00, 0x28, 0x20, 0x69, 0x01, 0x88, 0x01, 0xd0, 0x91, 0x43, 0x00, 0xe0, 0x11, 0x43, 0x01, 0x80, 0x20, 0x69, 0x01, 0x22, 0x00, 0x88, 0xd2, 0x02, 0x28, 0x83, 0x20, 0x1c, 0x58, 0x30, 0x01, 0x88, 0x91, 0x43, 0x01, 0x80, 0x3c, 0x00, 0xf8, 0xca, 0x00, 0x00, 0xa3, 0x6b, 0x52, 0x08, 0x00, 0x2b, 0x10, 0xd0, 0x91, 0x43, 0x01, 0x80, 0x28, 0x8b, 0x00, 0x07, 0x80, 0x0f, 0x01, 0x28, 0x15, 0xd0, 0x2e, 0x20, 0x01, 0x5d, 0x20, 0x69, 0x04, 0x30, 0xf8, 0xf7, 0x41, 0xfd, 0x61, 0x6a, 0xfe, 0xf7, 0xa8, 0xf9, 0x04, 0xe0, 0x11, 0x43, 0x01, 0x80, 0x20, 0x1c, 0xfb, 0xf7, 0xcc, 0xfb, 0x68, 0x83, 0x04, 0xe0, 0x20, 0x69, 0x41, 0x80, 0x3c, 0x00, 0x34, 0xcb, 0x00, 0x00, 0xa8, 0x8b, 0x21, 0x69, 0xc8, 0x82, 0xe0, 0x68, 0xf6, 0xf7, 0x20, 0xf9, 0x30, 0x80, 0x60, 0x6d, 0x00, 0x28, 0x04, 0xd0, 0x00, 0x22, 0x03, 0x21, 0x70, 0x7a, 0xfe, 0xf7, 0x0d, 0xff, 0x20, 0x1c, 0x00, 0xf0, 0xb6, 0xf9, 0x70, 0x7a, 0x06, 0xf0, 0x45, 0xf8, 0x70, 0xbd, 0xb0, 0xb5, 0x00, 0x24, 0x06, 0xf0, 0x22, 0xf9, 0x09, 0x4a, 0x00, 0x21, 0x0c, 0x23, 0x4b, 0x43, 0x3c, 0x00, 0x70, 0xcb, 0x00, 0x00, 0x9d, 0x18, 0x6b, 0x68, 0x5b, 0x6c, 0xad, 0x78, 0xc3, 0x1a, 0x01, 0x2d, 0x02, 0xd1, 0xa3, 0x42, 0x00, 0xdd, 0x1c, 0x1c, 0x01, 0x31, 0x05, 0x29, 0xf0, 0xd3, 0x20, 0x1c, 0xb0, 0xbd, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x06, 0xf0, 0xa8, 0xfe, 0x0c, 0x20, 0x08, 0x49, 0x60, 0x43, 0x45, 0x18, 0x28, 0x88, 0x06, 0xf0, 0x35, 0xf9, 0x68, 0x68, 0x3c, 0x00, 0xac, 0xcb, 0x00, 0x00, 0x00, 0x28, 0x06, 0xd0, 0x20, 0x30, 0x00, 0x7b, 0x01, 0x28, 0x02, 0xd1, 0x20, 0x1c, 0xff, 0xf7, 0xa3, 0xfa, 0xb0, 0xbd, 0x60, 0x7b, 0x01, 0x00, 0xff, 0xb5, 0x85, 0xb0, 0x0f, 0xae, 0x60, 0xce, 0x38, 0x20, 0x1e, 0x49, 0x70, 0x43, 0x17, 0x1c, 0x44, 0x18, 0xff, 0xf7, 0x7f, 0xf8, 0x01, 0x22, 0x12, 0x03, 0x00, 0x28, 0x03, 0xd0, 0x20, 0x88, 0x90, 0x43, 0x20, 0x80, 0x3c, 0x00, 0xe8, 0xcb, 0x00, 0x00, 0x02, 0xe0, 0x21, 0x88, 0x11, 0x43, 0x21, 0x80, 0x11, 0x98, 0x39, 0x1c, 0xe0, 0x62, 0x05, 0x98, 0xf8, 0xf7, 0xd0, 0xfc, 0x01, 0x1c, 0x2b, 0x1c, 0x38, 0x1c, 0x06, 0x9a, 0xfe, 0xf7, 0x20, 0xf9, 0x60, 0x80, 0x06, 0x22, 0x20, 0x1d, 0x0f, 0x49, 0xf3, 0xf7, 0x72, 0xfc, 0x23, 0x1c, 0x08, 0x98, 0x30, 0x33, 0x18, 0x70, 0x0e, 0x98, 0x0c, 0x49, 0x58, 0x70, 0x65, 0x63, 0x3c, 0x00, 0x24, 0xcc, 0x00, 0x00, 0x00, 0x20, 0x02, 0x90, 0x01, 0x22, 0x04, 0x92, 0x09, 0x48, 0x03, 0x91, 0x5a, 0x78, 0x01, 0x88, 0x01, 0x92, 0x00, 0x91, 0x19, 0x78, 0x24, 0x3b, 0x30, 0x1c, 0x62, 0x6b, 0xfe, 0xf7, 0xa8, 0xfe, 0x09, 0xb0, 0xf0, 0xbd, 0xd4, 0xe4, 0x01, 0x00, 0x12, 0x61, 0x01, 0x00, 0x5d, 0x4e, 0x00, 0x00, 0x48, 0x7b, 0x01, 0x00, 0xff, 0xb5, 0x87, 0xb0, 0x10, 0x98, 0x12, 0xaf, 0x3c, 0x00, 0x60, 0xcc, 0x00, 0x00, 0x8c, 0x46, 0xa2, 0xcf, 0x4c, 0x23, 0x30, 0x4c, 0x6b, 0x43, 0x1c, 0x19, 0x16, 0x1c, 0x15, 0x9a, 0x27, 0x85, 0x27, 0x1c, 0x30, 0x37, 0x06, 0x97, 0x05, 0x97, 0x00, 0x23, 0x3b, 0x73, 0x05, 0x9f, 0x78, 0x73, 0x11, 0x98, 0x27, 0x1c, 0x60, 0x64, 0x61, 0x60, 0x22, 0x60, 0x40, 0x37, 0x3e, 0x70, 0x61, 0x46, 0x61, 0x87, 0x07, 0x98, 0x31, 0x1c, 0xf8, 0xf7, 0x80, 0xfc, 0x3c, 0x00, 0x9c, 0xcc, 0x00, 0x00, 0x05, 0x99, 0xc8, 0x73, 0x0a, 0x98, 0x78, 0x70, 0x30, 0x1c, 0xfe, 0xf7, 0x73, 0xf8, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x41, 0x00, 0x02, 0x20, 0x01, 0x40, 0x11, 0x9a, 0x01, 0x20, 0x00, 0x2a, 0x00, 0xd1, 0x00, 0x20, 0x08, 0x43, 0x38, 0x72, 0x20, 0x1c, 0x2e, 0x30, 0x07, 0x99, 0xfd, 0xf7, 0xcf, 0xff, 0x28, 0x1c, 0x04, 0xf0, 0xae, 0xf8, 0x3c, 0x00, 0xd8, 0xcc, 0x00, 0x00, 0xfe, 0xf7, 0xfe, 0xff, 0x4c, 0x22, 0x12, 0x4b, 0x6a, 0x43, 0xd2, 0x18, 0x01, 0x21, 0x09, 0x03, 0x2a, 0x32, 0x00, 0x28, 0x04, 0xd0, 0x10, 0x1c, 0x12, 0x88, 0x8a, 0x43, 0x02, 0x80, 0x02, 0xe0, 0x10, 0x88, 0x08, 0x43, 0x10, 0x80, 0x0b, 0x49, 0x00, 0x20, 0x03, 0x91, 0x06, 0x99, 0x02, 0x90, 0x00, 0x22, 0x04, 0x92, 0x08, 0x48, 0x0a, 0x7b, 0x41, 0x88, 0x23, 0x1c, 0x3c, 0x00, 0x14, 0xcd, 0x00, 0x00, 0x01, 0x92, 0x00, 0x91, 0x79, 0x78, 0x08, 0x33, 0x28, 0x1c, 0x62, 0x68, 0xfe, 0xf7, 0x38, 0xfe, 0x0b, 0xb0, 0xf0, 0xbd, 0x58, 0xe3, 0x01, 0x00, 0x75, 0x4f, 0x00, 0x00, 0x3c, 0x7c, 0x01, 0x00, 0xb0, 0xb5, 0x0c, 0x1c, 0x01, 0x28, 0x27, 0xd0, 0x80, 0x28, 0x30, 0xd1, 0xe0, 0x6c, 0x00, 0x28, 0x08, 0xd0, 0x69, 0x20, 0x00, 0x5d, 0x18, 0x49, 0xc0, 0x00, 0x40, 0x18, 0x3c, 0x00, 0x50, 0xcd, 0x00, 0x00, 0x04, 0x30, 0x01, 0x68, 0x01, 0x31, 0x01, 0x60, 0x20, 0x1c, 0xff, 0xf7, 0xe9, 0xfb, 0x13, 0x4d, 0x50, 0x3d, 0xe8, 0x68, 0x00, 0x28, 0x05, 0xd0, 0x2e, 0x20, 0x00, 0x5d, 0xfe, 0xf7, 0x10, 0xf8, 0x02, 0xf0, 0x42, 0xfe, 0x20, 0x1c, 0x61, 0x68, 0xf3, 0xf7, 0x2f, 0xfb, 0x40, 0x34, 0x60, 0x78, 0x00, 0x28, 0x02, 0xd1, 0x06, 0xf0, 0x12, 0xf8, 0xa8, 0x60, 0xb0, 0xbd, 0x3c, 0x00, 0x8c, 0xcd, 0x00, 0x00, 0x20, 0x06, 0x00, 0x0e, 0x81, 0x28, 0xfa, 0xd1, 0x22, 0x0c, 0x20, 0x04, 0x00, 0x0e, 0x02, 0x21, 0xfe, 0xf7, 0xe6, 0xfd, 0xb0, 0xbd, 0x0a, 0x21, 0x0c, 0x20, 0xf4, 0xf7, 0x7d, 0xfa, 0xb0, 0xbd, 0x9c, 0x7b, 0x01, 0x00, 0xf8, 0xb5, 0x18, 0x4e, 0x18, 0x4f, 0x05, 0x1c, 0x34, 0x79, 0xb8, 0x79, 0x00, 0x90, 0x20, 0x1c, 0xf5, 0xf7, 0x7c, 0xff, 0x00, 0x28, 0x06, 0xd0, 0x3c, 0x00, 0xc8, 0xcd, 0x00, 0x00, 0x12, 0x48, 0x38, 0x38, 0x40, 0x68, 0x85, 0x42, 0x01, 0xd1, 0x00, 0x2d, 0x03, 0xd1, 0x10, 0x21, 0x86, 0x20, 0xf4, 0xf7, 0x63, 0xfa, 0x0d, 0x49, 0x00, 0x20, 0x38, 0x39, 0x48, 0x60, 0x04, 0x21, 0x20, 0x1c, 0xff, 0xf7, 0x59, 0xfc, 0x04, 0x21, 0x20, 0x1c, 0xf5, 0xf7, 0xeb, 0xfe, 0x0c, 0x21, 0x06, 0x4a, 0x61, 0x43, 0x30, 0x3a, 0x89, 0x18, 0x0c, 0x71, 0x04, 0x20, 0x3c, 0x00, 0x04, 0xce, 0x00, 0x00, 0x30, 0x71, 0x00, 0x98, 0xb8, 0x71, 0x0f, 0x20, 0xff, 0xf7, 0xa6, 0xfd, 0xf8, 0xbd, 0x00, 0x00, 0xa4, 0x7a, 0x01, 0x00, 0x20, 0x10, 0x07, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0x0f, 0x20, 0xff, 0xf7, 0xc1, 0xfd, 0xf5, 0xf7, 0x3b, 0xff, 0x01, 0x25, 0x00, 0x28, 0x00, 0xd0, 0x00, 0x25, 0x16, 0x4e, 0xb0, 0x79, 0x16, 0x4f, 0x00, 0x90, 0x38, 0x79, 0x04, 0x28, 0x01, 0xd1, 0x3c, 0x00, 0x40, 0xce, 0x00, 0x00, 0x00, 0x2c, 0x03, 0xd1, 0x11, 0x21, 0x86, 0x20, 0xf4, 0xf7, 0x2c, 0xfa, 0x10, 0x48, 0x29, 0x06, 0x38, 0x38, 0x44, 0x60, 0x09, 0x0e, 0x0c, 0x1c, 0x04, 0x20, 0xff, 0xf7, 0x21, 0xfc, 0x03, 0x21, 0x20, 0x1c, 0xff, 0xf7, 0x41, 0xfc, 0x21, 0x1c, 0x04, 0x20, 0xf5, 0xf7, 0xaf, 0xfe, 0x0c, 0x21, 0x07, 0x4a, 0x69, 0x43, 0x04, 0x20, 0x30, 0x3a, 0x89, 0x18, 0x08, 0x71, 0x3c, 0x00, 0x7c, 0xce, 0x00, 0x00, 0x3c, 0x71, 0x00, 0x98, 0xb0, 0x71, 0x20, 0x1c, 0xff, 0xf7, 0x50, 0xfd, 0x04, 0x20, 0xf8, 0xbd, 0x20, 0x10, 0x07, 0x00, 0xa4, 0x7a, 0x01, 0x00, 0x0c, 0x23, 0x02, 0x49, 0x58, 0x43, 0x40, 0x18, 0x80, 0x68, 0x70, 0x47, 0x74, 0x7a, 0x01, 0x00, 0x60, 0x30, 0xc1, 0x79, 0x80, 0x79, 0x81, 0x42, 0x01, 0xd9, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xce, 0x00, 0x00, 0x01, 0x48, 0x80, 0x68, 0x70, 0x47, 0x00, 0x00, 0x4c, 0x7b, 0x01, 0x00, 0x38, 0xb5, 0x69, 0x21, 0x09, 0x5c, 0x18, 0x23, 0x10, 0x4a, 0x59, 0x43, 0x89, 0x18, 0x8a, 0x68, 0x01, 0x32, 0x8a, 0x60, 0x4b, 0x69, 0xd2, 0x1a, 0xcb, 0x68, 0x93, 0x42, 0x00, 0xd2, 0xca, 0x60, 0x00, 0x22, 0x0b, 0x4c, 0x02, 0x60, 0x22, 0x1c, 0x20, 0x32, 0x95, 0x79, 0x00, 0xab, 0x1d, 0x70, 0x3c, 0x00, 0xf4, 0xce, 0x00, 0x00, 0xd2, 0x79, 0x5a, 0x70, 0x0a, 0x68, 0x00, 0x2a, 0x01, 0xd1, 0x48, 0x60, 0x00, 0xe0, 0x10, 0x60, 0x00, 0xab, 0x08, 0x60, 0x18, 0x88, 0xe0, 0x84, 0x38, 0xbd, 0x00, 0x00, 0xc4, 0x7b, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, 0x18, 0x23, 0x0a, 0x49, 0x58, 0x43, 0x41, 0x18, 0x08, 0x69, 0x01, 0x30, 0x08, 0x61, 0x48, 0x68, 0x00, 0x28, 0x09, 0xd0, 0x48, 0x69, 0x01, 0x30, 0x3c, 0x00, 0x30, 0xcf, 0x00, 0x00, 0x48, 0x61, 0x48, 0x68, 0x02, 0x68, 0x4a, 0x60, 0x00, 0x2a, 0x00, 0xd1, 0x0a, 0x60, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0xc4, 0x7b, 0x01, 0x00, 0xf8, 0xb5, 0x12, 0x4e, 0x10, 0x4d, 0x0f, 0x4c, 0x0a, 0x27, 0x21, 0x1c, 0x00, 0x20, 0xe0, 0x60, 0x2a, 0x31, 0x22, 0x1c, 0x18, 0x32, 0xa1, 0x60, 0x62, 0x61, 0x27, 0x82, 0x0c, 0x4a, 0xe0, 0x61, 0xa2, 0x61, 0x60, 0x62, 0x3c, 0x00, 0x6c, 0xcf, 0x00, 0x00, 0x06, 0x20, 0x20, 0x84, 0x08, 0x1c, 0xfe, 0xf7, 0xd7, 0xf9, 0x20, 0x1c, 0x08, 0x30, 0xf5, 0xf7, 0x01, 0xff, 0x4c, 0x3c, 0xac, 0x42, 0x70, 0x80, 0xe5, 0xd1, 0xff, 0x20, 0x30, 0x70, 0xf8, 0xbd, 0x88, 0xe4, 0x01, 0x00, 0x0c, 0xe3, 0x01, 0x00, 0x3c, 0x7c, 0x01, 0x00, 0x12, 0x61, 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0x0b, 0x48, 0x0e, 0x1c, 0x17, 0x1c, 0x44, 0x70, 0x3c, 0x00, 0xa8, 0xcf, 0x00, 0x00, 0x05, 0xf0, 0x00, 0xff, 0x05, 0x1c, 0x39, 0x1c, 0x30, 0x1c, 0xfd, 0xf7, 0xab, 0xff, 0x0c, 0x21, 0x05, 0x4a, 0x28, 0x18, 0x0a, 0x30, 0x61, 0x43, 0x08, 0x32, 0x50, 0x50, 0x03, 0x48, 0x89, 0x18, 0x00, 0x68, 0x88, 0x60, 0xf8, 0xbd, 0x00, 0x00, 0x6c, 0x7a, 0x01, 0x00, 0x78, 0x6e, 0x01, 0x00, 0x70, 0xb5, 0x0b, 0x4e, 0x05, 0x1c, 0x70, 0x78, 0xff, 0x28, 0x0f, 0xd0, 0x3c, 0x00, 0xe4, 0xcf, 0x00, 0x00, 0x0c, 0x23, 0x08, 0x4c, 0x58, 0x43, 0x08, 0x34, 0x20, 0x58, 0x05, 0xf0, 0x1d, 0xfe, 0x00, 0x28, 0x06, 0xd1, 0x70, 0x78, 0x0c, 0x23, 0x58, 0x43, 0x00, 0x19, 0x81, 0x68, 0x29, 0x43, 0x81, 0x60, 0x70, 0xbd, 0x00, 0x00, 0x6c, 0x7a, 0x01, 0x00, 0x80, 0xb5, 0x30, 0x21, 0x01, 0x48, 0xf3, 0xf7, 0x43, 0xfa, 0x80, 0xbd, 0xec, 0xe5, 0x01, 0x00, 0x10, 0xb5, 0x05, 0xf0, 0x3c, 0x00, 0x20, 0xd0, 0x00, 0x00, 0xc5, 0xfe, 0x0a, 0x49, 0x44, 0x18, 0x0c, 0xe0, 0x20, 0x1c, 0x05, 0xf0, 0xf7, 0xfd, 0x00, 0x28, 0x07, 0xd0, 0xf5, 0xf7, 0x51, 0xfe, 0x00, 0x28, 0x03, 0xd0, 0x13, 0x21, 0x86, 0x20, 0xf4, 0xf7, 0x31, 0xf9, 0xf5, 0xf7, 0x49, 0xfe, 0x00, 0x28, 0xee, 0xd1, 0x10, 0xbd, 0xb0, 0x36, 0x00, 0x00, 0xff, 0xb5, 0x8b, 0xb0, 0x19, 0x9b, 0x0d, 0x1c, 0x04, 0x1c, 0x1a, 0x20, 0x3c, 0x00, 0x5c, 0xd0, 0x00, 0x00, 0x00, 0x2b, 0x16, 0x99, 0x00, 0xd1, 0x18, 0x20, 0x01, 0x90, 0x14, 0x98, 0x00, 0x28, 0x27, 0xd0, 0xff, 0x20, 0x19, 0x9b, 0x01, 0x30, 0x00, 0x2b, 0x01, 0xd1, 0x18, 0x23, 0x00, 0xe0, 0x1a, 0x23, 0x04, 0x33, 0x82, 0x42, 0x04, 0xd3, 0xd0, 0x1a, 0x40, 0x08, 0x40, 0x00, 0x00, 0x04, 0x00, 0x0c, 0x0d, 0x90, 0x6a, 0x48, 0x00, 0x88, 0xc2, 0x1a, 0x12, 0x04, 0x12, 0x0c, 0x3c, 0x00, 0x98, 0xd0, 0x00, 0x00, 0x04, 0x92, 0x00, 0x29, 0x08, 0xd0, 0x89, 0x79, 0x66, 0x4a, 0x49, 0x00, 0x51, 0x5a, 0x04, 0x9a, 0x51, 0x1a, 0x0a, 0x04, 0x12, 0x0c, 0x04, 0x92, 0x04, 0x9a, 0x82, 0x42, 0x05, 0xd9, 0x00, 0x20, 0x04, 0x90, 0x02, 0xe0, 0x60, 0x48, 0x04, 0x90, 0x0d, 0x90, 0x01, 0x98, 0x01, 0x04, 0x09, 0x0c, 0x0a, 0x91, 0x00, 0x20, 0xf4, 0xf7, 0x84, 0xfa, 0x00, 0x90, 0x00, 0x68, 0x3c, 0x00, 0xd4, 0xd0, 0x00, 0x00, 0x00, 0x26, 0x06, 0x90, 0x20, 0x60, 0x00, 0x20, 0x05, 0x90, 0x0e, 0x98, 0x00, 0x24, 0x00, 0x05, 0x00, 0x0c, 0x09, 0x90, 0x1a, 0x98, 0x0d, 0x9f, 0x40, 0x07, 0x40, 0x0f, 0x08, 0x90, 0x07, 0x94, 0x03, 0x95, 0x00, 0x2d, 0x0d, 0xd0, 0x28, 0x89, 0xb8, 0x42, 0x04, 0xd8, 0x36, 0x18, 0x3f, 0x1a, 0x07, 0xd0, 0xed, 0x68, 0xf5, 0xe7, 0x39, 0x04, 0x09, 0x0c, 0x28, 0x1c, 0x3c, 0x00, 0x10, 0xd1, 0x00, 0x00, 0xf4, 0xf7, 0x38, 0xfb, 0xef, 0xe7, 0x00, 0x2e, 0x02, 0xd1, 0x07, 0x99, 0x00, 0x29, 0x71, 0xd1, 0x27, 0x1c, 0x6c, 0x20, 0xf4, 0xf7, 0x88, 0xfb, 0x07, 0x99, 0x04, 0x1c, 0x00, 0x29, 0x20, 0xd1, 0x07, 0x94, 0x00, 0x20, 0xa0, 0x61, 0x18, 0x98, 0x27, 0x1c, 0x60, 0x60, 0x17, 0x98, 0x24, 0x37, 0xa0, 0x60, 0x06, 0x98, 0x20, 0x61, 0x15, 0x98, 0x0f, 0xc8, 0x0f, 0xc7, 0x3c, 0x00, 0x4c, 0xd1, 0x00, 0x00, 0x14, 0x98, 0x5c, 0x21, 0x60, 0x63, 0x09, 0x98, 0x08, 0x53, 0x19, 0x98, 0x69, 0x21, 0xe0, 0x63, 0x1b, 0x98, 0x08, 0x55, 0x1c, 0x98, 0x60, 0x65, 0x19, 0x98, 0x00, 0x28, 0x23, 0xd0, 0x08, 0x98, 0x06, 0x99, 0x08, 0x83, 0x1f, 0xe0, 0x6c, 0x22, 0x20, 0x1c, 0x07, 0x99, 0xf3, 0xf7, 0x1a, 0xfa, 0x3c, 0x60, 0x01, 0x98, 0x62, 0x21, 0x30, 0x18, 0xc8, 0x53, 0x15, 0x98, 0x3c, 0x00, 0x88, 0xd1, 0x00, 0x00, 0x40, 0x21, 0x80, 0x7a, 0xc8, 0x55, 0x00, 0x20, 0xb8, 0x63, 0x06, 0x98, 0x0a, 0x99, 0xf4, 0xf7, 0x1f, 0xfa, 0xf8, 0x60, 0x02, 0x99, 0xf4, 0xf7, 0x3b, 0xf9, 0x20, 0x1c, 0x40, 0x30, 0x81, 0x8b, 0x05, 0x9a, 0x12, 0x07, 0x12, 0x0f, 0x11, 0x43, 0x81, 0x83, 0x03, 0x98, 0x5e, 0x21, 0x02, 0x90, 0x01, 0x98, 0x22, 0x4a, 0x30, 0x18, 0x08, 0x53, 0x12, 0x68, 0x01, 0x21, 0x3c, 0x00, 0xc4, 0xd1, 0x00, 0x00, 0x08, 0x1c, 0x00, 0x2a, 0x00, 0xd0, 0x1b, 0x98, 0x00, 0x06, 0x04, 0x9a, 0x00, 0x0e, 0x96, 0x42, 0x03, 0xd9, 0x2c, 0x22, 0x11, 0x55, 0x1b, 0x49, 0x04, 0xe0, 0x15, 0x99, 0x2c, 0x22, 0x09, 0x7a, 0x11, 0x55, 0x19, 0x49, 0x08, 0x5c, 0x66, 0x21, 0x08, 0x55, 0x1c, 0x98, 0x00, 0x28, 0x01, 0xd0, 0x1f, 0x20, 0x08, 0x55, 0x00, 0x2d, 0x03, 0xd0, 0xe8, 0x68, 0x03, 0x90, 0x3c, 0x00, 0x00, 0xd2, 0x00, 0x00, 0x00, 0x20, 0x00, 0xe0, 0x09, 0xe0, 0xe8, 0x60, 0x05, 0x98, 0x00, 0x26, 0x01, 0x30, 0x00, 0x04, 0x00, 0x0c, 0x0d, 0x9f, 0x05, 0x90, 0x03, 0x9d, 0x6d, 0xe7, 0x00, 0x98, 0xe0, 0x60, 0x02, 0x99, 0xf4, 0xf7, 0xfa, 0xf8, 0x00, 0x20, 0x20, 0x60, 0x01, 0x21, 0xa1, 0x63, 0x60, 0x34, 0x60, 0x80, 0x07, 0x98, 0x0f, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0x06, 0x61, 0x01, 0x00, 0x3c, 0x00, 0x3c, 0xd2, 0x00, 0x00, 0x5c, 0x43, 0x01, 0x00, 0x38, 0x09, 0x00, 0x00, 0x18, 0x67, 0x01, 0x00, 0x0e, 0x61, 0x01, 0x00, 0x0a, 0x61, 0x01, 0x00, 0x01, 0x48, 0x00, 0x68, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x6a, 0x01, 0x00, 0x02, 0x49, 0x09, 0x1d, 0x03, 0xc9, 0x40, 0x18, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x01, 0x48, 0x00, 0x69, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x3c, 0x00, 0x78, 0xd2, 0x00, 0x00, 0x01, 0x48, 0x40, 0x69, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x01, 0x48, 0x80, 0x69, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x70, 0xb5, 0x0d, 0x4e, 0x00, 0x20, 0x35, 0x1c, 0x40, 0x35, 0xf0, 0x63, 0x0d, 0xe0, 0xa0, 0x68, 0xf4, 0xf7, 0x7a, 0xf9, 0xb3, 0x6d, 0x00, 0x2b, 0x04, 0xd0, 0x00, 0x22, 0x01, 0x20, 0x61, 0x6b, 0xf3, 0xf7, 0x95, 0xf8, 0x3c, 0x00, 0xb4, 0xd2, 0x00, 0x00, 0x20, 0x1c, 0xf4, 0xf7, 0x9d, 0xfa, 0x28, 0x1c, 0xfa, 0xf7, 0x42, 0xfd, 0x04, 0x1c, 0xec, 0xd1, 0x70, 0xbd, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0xf8, 0xb5, 0x1a, 0x4f, 0x00, 0x26, 0xf8, 0x6b, 0x00, 0x28, 0x2c, 0xd0, 0x38, 0x1c, 0x40, 0x30, 0x00, 0x90, 0x1d, 0xe0, 0x16, 0x48, 0xb9, 0x6b, 0x02, 0xf0, 0x5c, 0xf8, 0x00, 0x22, 0x20, 0x1c, 0x14, 0x49, 0x03, 0xf0, 0x3c, 0x00, 0xf0, 0xd2, 0x00, 0x00, 0x7b, 0xff, 0x05, 0x1c, 0x04, 0xd1, 0x38, 0x6a, 0x01, 0x30, 0x38, 0x62, 0x01, 0x36, 0x0d, 0xe0, 0xa0, 0x68, 0xf4, 0xf7, 0x49, 0xf9, 0xbb, 0x6d, 0x00, 0x2b, 0x04, 0xd0, 0x00, 0x22, 0x28, 0x1c, 0x61, 0x6b, 0xf3, 0xf7, 0x64, 0xf8, 0x20, 0x1c, 0xf4, 0xf7, 0x6c, 0xfa, 0x00, 0x98, 0xfa, 0xf7, 0x11, 0xfd, 0x04, 0x1c, 0xdc, 0xd1, 0x07, 0x48, 0xb9, 0x6b, 0x02, 0xf0, 0x3c, 0x00, 0x2c, 0xd3, 0x00, 0x00, 0x25, 0xf8, 0x00, 0x20, 0xf8, 0x63, 0x30, 0x1c, 0xf8, 0xbd, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x11, 0x30, 0x00, 0x00, 0xc4, 0x60, 0x01, 0x00, 0x01, 0x49, 0x01, 0x20, 0xc8, 0x63, 0x70, 0x47, 0xc4, 0x69, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x20, 0x05, 0x4a, 0x00, 0x21, 0x1c, 0x23, 0x43, 0x43, 0x9b, 0x18, 0x01, 0x30, 0x04, 0x28, 0xd9, 0x66, 0x3c, 0x00, 0x68, 0xd3, 0x00, 0x00, 0xf8, 0xdb, 0xfc, 0xf7, 0xfd, 0xfc, 0x80, 0xbd, 0xc4, 0x69, 0x01, 0x00, 0x01, 0x49, 0xc8, 0x64, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x01, 0x49, 0x88, 0x64, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, 0x21, 0x1c, 0x02, 0x8e, 0x80, 0x6a, 0x40, 0x31, 0xf3, 0xf7, 0x2f, 0xf8, 0x00, 0x28, 0x16, 0xd1, 0x02, 0x21, 0x3c, 0x00, 0xa4, 0xd3, 0x00, 0x00, 0x20, 0x1c, 0xf4, 0xf7, 0x6f, 0xfa, 0xe2, 0x69, 0xc0, 0x00, 0x10, 0x18, 0x82, 0x8b, 0xab, 0x88, 0x9a, 0x42, 0x04, 0xd1, 0x82, 0x69, 0x2b, 0x68, 0x9a, 0x42, 0x08, 0xd2, 0x01, 0xe0, 0x9a, 0x42, 0x05, 0xd2, 0x00, 0x21, 0x18, 0x30, 0x0c, 0xcd, 0x0c, 0xc0, 0x00, 0xe0, 0x01, 0x21, 0x08, 0x1c, 0xb0, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x00, 0x27, 0x44, 0x68, 0x3c, 0x00, 0xe0, 0xd3, 0x00, 0x00, 0x0f, 0xe0, 0x09, 0x49, 0x48, 0x6a, 0x01, 0x30, 0x48, 0x62, 0xa0, 0x69, 0x00, 0x28, 0x02, 0xd0, 0xf4, 0xf7, 0x00, 0xfa, 0xa7, 0x61, 0x26, 0x62, 0x25, 0x68, 0x20, 0x1c, 0xff, 0xf7, 0x52, 0xfb, 0x2c, 0x1c, 0x00, 0x2c, 0xed, 0xd1, 0xf8, 0xbd, 0xc4, 0x69, 0x01, 0x00, 0x03, 0x30, 0x07, 0x4a, 0x81, 0x08, 0x13, 0x68, 0x50, 0x68, 0x1b, 0x68, 0x89, 0x00, 0x09, 0x18, 0x3c, 0x00, 0x1c, 0xd4, 0x00, 0x00, 0x8b, 0x42, 0x01, 0xd3, 0x51, 0x60, 0x00, 0xe0, 0x00, 0x20, 0x90, 0x60, 0x70, 0x47, 0x00, 0x00, 0x8c, 0x6e, 0x01, 0x00, 0x70, 0xb5, 0x12, 0x4e, 0x80, 0x38, 0xc5, 0x00, 0x70, 0x59, 0x0c, 0x1c, 0x00, 0x28, 0x04, 0xd1, 0x01, 0x21, 0x0d, 0x20, 0xf3, 0xf7, 0x2e, 0xff, 0x0d, 0xe0, 0x20, 0x69, 0x00, 0x28, 0x05, 0xd1, 0xa8, 0x19, 0x81, 0x88, 0xe0, 0x68, 0x01, 0xf0, 0x3c, 0x00, 0x58, 0xd4, 0x00, 0x00, 0x47, 0xfa, 0x20, 0x61, 0x71, 0x59, 0x20, 0x1c, 0xf2, 0xf7, 0xbb, 0xff, 0x04, 0x1c, 0x00, 0x2c, 0x07, 0xd0, 0xe0, 0x68, 0x00, 0x28, 0x01, 0xd0, 0xf4, 0xf7, 0x92, 0xf8, 0x20, 0x1c, 0xf4, 0xf7, 0xbd, 0xf9, 0x70, 0xbd, 0x54, 0x42, 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, 0x0e, 0x49, 0x06, 0x22, 0xf3, 0xf7, 0x35, 0xf8, 0x00, 0x26, 0xe6, 0x61, 0x66, 0x62, 0x3c, 0x00, 0x94, 0xd4, 0x00, 0x00, 0x07, 0x20, 0x30, 0x21, 0x08, 0x55, 0xe6, 0x63, 0x28, 0x1c, 0xf8, 0xf7, 0x6b, 0xf8, 0xa0, 0x76, 0x20, 0x1c, 0x14, 0x30, 0x06, 0x22, 0x29, 0x1c, 0xf3, 0xf7, 0x24, 0xf8, 0x06, 0x22, 0x29, 0x1c, 0xa0, 0x18, 0xf3, 0xf7, 0x1f, 0xf8, 0x26, 0x61, 0x70, 0xbd, 0x00, 0x00, 0x12, 0x61, 0x01, 0x00, 0x80, 0xb5, 0xfd, 0xf7, 0x85, 0xfe, 0x80, 0xbd, 0x01, 0x49, 0x48, 0x60, 0x3c, 0x00, 0xd0, 0xd4, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0xe4, 0x65, 0x01, 0x00, 0x02, 0x49, 0x80, 0xb5, 0x49, 0x68, 0xf2, 0xf7, 0x7c, 0xff, 0x80, 0xbd, 0xe4, 0x65, 0x01, 0x00, 0x80, 0xb5, 0xf4, 0xf7, 0xe5, 0xf9, 0x07, 0x49, 0x07, 0x48, 0x0e, 0xc9, 0x0e, 0xc0, 0x18, 0x38, 0x00, 0x68, 0x00, 0x28, 0x02, 0xd0, 0x02, 0xf0, 0xb7, 0xfa, 0x80, 0xbd, 0x02, 0xf0, 0x9e, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xd5, 0x00, 0x00, 0xb0, 0x58, 0x01, 0x00, 0x90, 0x73, 0x01, 0x00, 0x05, 0x49, 0x80, 0xb5, 0x89, 0x68, 0x00, 0x20, 0x00, 0x29, 0x00, 0xd1, 0x03, 0x20, 0x00, 0x06, 0x00, 0x0e, 0xfa, 0xf7, 0xe3, 0xfb, 0x80, 0xbd, 0x60, 0x6c, 0x01, 0x00, 0x80, 0xb5, 0x03, 0x48, 0x06, 0x22, 0x03, 0x49, 0xf2, 0xf7, 0xde, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x40, 0x80, 0x07, 0x00, 0x12, 0x61, 0x01, 0x00, 0x3c, 0x00, 0x48, 0xd5, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0c, 0x4d, 0x0b, 0x1c, 0x21, 0x1c, 0x00, 0x20, 0x0c, 0x3d, 0x00, 0x29, 0x09, 0x4c, 0x05, 0xd0, 0x28, 0x78, 0x21, 0x1c, 0x10, 0x80, 0x02, 0x1c, 0x18, 0x1c, 0x07, 0xe0, 0x11, 0x88, 0x0e, 0x29, 0x07, 0xd8, 0x0a, 0x06, 0x12, 0x0e, 0x19, 0x1c, 0x20, 0x1c, 0x2a, 0x70, 0xf2, 0xf7, 0xbe, 0xff, 0x01, 0x20, 0xb0, 0xbd, 0xb0, 0x69, 0x01, 0x00, 0x3c, 0x00, 0x84, 0xd5, 0x00, 0x00, 0x10, 0xb5, 0x00, 0x20, 0x0a, 0x4a, 0x01, 0x21, 0x11, 0x60, 0x0a, 0x4c, 0x0a, 0xe0, 0x02, 0x1c, 0x01, 0x6a, 0x50, 0x32, 0x91, 0x42, 0x05, 0xd0, 0x61, 0x78, 0x3c, 0x23, 0x59, 0x43, 0x09, 0x19, 0x04, 0x31, 0x01, 0x62, 0x04, 0xf0, 0xba, 0xfb, 0x00, 0x28, 0xf0, 0xd1, 0x10, 0xbd, 0x00, 0x00, 0xdc, 0x62, 0x01, 0x00, 0x68, 0x61, 0x01, 0x00, 0x04, 0x48, 0x80, 0xb5, 0x3c, 0x00, 0xc0, 0xd5, 0x00, 0x00, 0x00, 0x68, 0x00, 0x28, 0x03, 0xd0, 0x01, 0x1c, 0x10, 0x20, 0x04, 0xf0, 0xc7, 0xfe, 0x80, 0xbd, 0x28, 0x61, 0x01, 0x00, 0x03, 0x22, 0x11, 0x1f, 0x80, 0xb5, 0x00, 0x20, 0xfb, 0xf7, 0x76, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x0b, 0xf0, 0xb9, 0xfa, 0x80, 0xbd, 0xff, 0xb5, 0x83, 0xb0, 0x16, 0x1c, 0x00, 0x21, 0x01, 0x91, 0x1f, 0x1c, 0x08, 0x21, 0x02, 0xaa, 0x3c, 0x00, 0xfc, 0xd5, 0x00, 0x00, 0xfa, 0xf7, 0x0e, 0xff, 0x04, 0x1c, 0x2a, 0xd1, 0x02, 0x98, 0x41, 0x68, 0x49, 0x00, 0x01, 0xd4, 0x09, 0x24, 0x24, 0xe0, 0xfa, 0xf7, 0x52, 0xff, 0x38, 0x60, 0x02, 0x98, 0x41, 0x68, 0x49, 0x02, 0xcd, 0x0f, 0x29, 0x1c, 0xfa, 0xf7, 0x44, 0xff, 0x01, 0x1c, 0x30, 0x60, 0x38, 0x68, 0x00, 0x06, 0x00, 0x0e, 0x00, 0xf0, 0x1b, 0xf8, 0x00, 0x28, 0x01, 0xd1, 0x0a, 0x24, 0x3c, 0x00, 0x38, 0xd6, 0x00, 0x00, 0x0f, 0xe0, 0x31, 0x68, 0x02, 0x98, 0x2b, 0x1c, 0x01, 0xaa, 0xfa, 0xf7, 0xd7, 0xff, 0x00, 0x28, 0x06, 0xd0, 0x01, 0x98, 0x00, 0x28, 0x04, 0xd0, 0x04, 0x99, 0x09, 0x68, 0x81, 0x42, 0x00, 0xd2, 0x03, 0x24, 0x01, 0x98, 0x04, 0x99, 0x08, 0x60, 0x07, 0xb0, 0x20, 0x1c, 0xf0, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x05, 0x1c, 0x0e, 0x1c, 0x01, 0x24, 0x00, 0xf0, 0x84, 0xff, 0x3c, 0x00, 0x74, 0xd6, 0x00, 0x00, 0x00, 0x28, 0x08, 0xd0, 0x03, 0x2d, 0x01, 0xd0, 0x04, 0x2d, 0x04, 0xd1, 0x03, 0x20, 0xc0, 0x03, 0x86, 0x42, 0x00, 0xd3, 0x00, 0x24, 0x20, 0x1c, 0x70, 0xbd, 0x00, 0x00, 0x7c, 0xb5, 0x15, 0x1c, 0x06, 0x1c, 0x0c, 0x1c, 0x29, 0x1c, 0x6a, 0x46, 0x01, 0xab, 0xff, 0xf7, 0xa5, 0xff, 0x00, 0x28, 0x02, 0xd1, 0x00, 0x2c, 0x01, 0xd1, 0x03, 0x20, 0x7c, 0xbd, 0x17, 0x48, 0x3c, 0x00, 0xb0, 0xd6, 0x00, 0x00, 0x00, 0xab, 0x06, 0x60, 0x18, 0x79, 0x07, 0x28, 0x21, 0xd2, 0x02, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x00, 0x1d, 0x04, 0x04, 0x06, 0x10, 0x17, 0x13, 0x00, 0x04, 0x20, 0xed, 0xe7, 0x2a, 0x1c, 0x21, 0x1c, 0x01, 0x20, 0x00, 0x9b, 0xf2, 0xf7, 0x81, 0xfe, 0x00, 0x28, 0x12, 0xd1, 0x06, 0x20, 0xe3, 0xe7, 0x2a, 0x68, 0x00, 0x99, 0x05, 0xe0, 0x00, 0x98, 0x3c, 0x00, 0xec, 0xd6, 0x00, 0x00, 0x42, 0x78, 0x81, 0x1c, 0x01, 0xe0, 0x2a, 0x68, 0x69, 0x46, 0x20, 0x1c, 0xf2, 0xf7, 0xfe, 0xfe, 0x03, 0xe0, 0x04, 0x21, 0x87, 0x20, 0xf3, 0xf7, 0xcf, 0xfd, 0x00, 0x20, 0xd0, 0xe7, 0x00, 0x00, 0xf8, 0x6b, 0x01, 0x00, 0xf7, 0xb5, 0x86, 0xb0, 0x0e, 0x1c, 0x08, 0x21, 0x05, 0xaa, 0x06, 0x98, 0xfa, 0xf7, 0x7e, 0xfe, 0x04, 0x1c, 0x45, 0xd1, 0x05, 0x98, 0x41, 0x68, 0x3c, 0x00, 0x28, 0xd7, 0x00, 0x00, 0x02, 0x90, 0x49, 0x02, 0xc9, 0x0f, 0x00, 0x25, 0x04, 0x95, 0x03, 0x91, 0x08, 0x9f, 0xfa, 0xf7, 0xd5, 0xfe, 0x01, 0x90, 0x02, 0xa9, 0x03, 0xc9, 0xfa, 0xf7, 0xc6, 0xfe, 0x01, 0x99, 0x05, 0x29, 0x14, 0xd2, 0x02, 0xa3, 0x5b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x00, 0x0e, 0x03, 0x06, 0x0c, 0x03, 0x00, 0x87, 0x42, 0x0e, 0xd8, 0x07, 0xe0, 0x87, 0x42, 0x0b, 0xd8, 0x3c, 0x00, 0x64, 0xd7, 0x00, 0x00, 0x01, 0x25, 0xc0, 0x1b, 0x04, 0x90, 0x07, 0xe0, 0x87, 0x42, 0x05, 0xd1, 0x01, 0x25, 0x03, 0xe0, 0x05, 0x21, 0x87, 0x20, 0xf3, 0xf7, 0x94, 0xfd, 0x00, 0x2d, 0x01, 0xd1, 0x03, 0x24, 0x15, 0xe0, 0x05, 0x98, 0x41, 0x68, 0x00, 0x29, 0x69, 0xda, 0x3a, 0x4a, 0x06, 0x99, 0x11, 0x60, 0xfa, 0xf7, 0x91, 0xfe, 0x07, 0x1c, 0x05, 0x98, 0x03, 0x99, 0xfa, 0xf7, 0x86, 0xfe, 0x3c, 0x00, 0xa0, 0xd7, 0x00, 0x00, 0x05, 0x1c, 0x01, 0x1c, 0x38, 0x1c, 0xff, 0xf7, 0x5f, 0xff, 0x00, 0x28, 0x01, 0xd1, 0x0a, 0x24, 0x5e, 0xe0, 0x07, 0x2f, 0x57, 0xd2, 0x02, 0xa3, 0xdb, 0x5d, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x00, 0x53, 0x04, 0x04, 0x06, 0x2e, 0x50, 0x48, 0x00, 0x04, 0x24, 0x51, 0xe0, 0x04, 0x98, 0x00, 0x28, 0x01, 0xd1, 0x00, 0x27, 0x14, 0xe0, 0x08, 0x99, 0x08, 0x18, 0x00, 0x04, 0x3c, 0x00, 0xdc, 0xd7, 0x00, 0x00, 0x00, 0x0c, 0xf4, 0xf7, 0x2b, 0xf8, 0x07, 0x1c, 0x31, 0x1c, 0x08, 0x9a, 0xf2, 0xf7, 0x86, 0xfe, 0x08, 0x98, 0x04, 0x99, 0x38, 0x18, 0xf2, 0xf7, 0x2f, 0xfe, 0x08, 0x98, 0x04, 0x99, 0x3e, 0x1c, 0x40, 0x18, 0x08, 0x90, 0x31, 0x1c, 0x00, 0x20, 0x08, 0xaa, 0xf2, 0xf7, 0xec, 0xfd, 0x00, 0x28, 0x00, 0xd1, 0x05, 0x24, 0x00, 0x2f, 0x2d, 0xd0, 0x38, 0x1c, 0xf3, 0xf7, 0x3c, 0x00, 0x18, 0xd8, 0x00, 0x00, 0xed, 0xff, 0x29, 0xe0, 0x03, 0x99, 0x00, 0x29, 0x04, 0xd0, 0x05, 0x98, 0x40, 0x68, 0x87, 0x02, 0xbf, 0x0a, 0x00, 0xe0, 0x00, 0x27, 0x31, 0x1c, 0x28, 0x1c, 0x08, 0x9a, 0xf2, 0xf7, 0x60, 0xfe, 0x04, 0x99, 0x00, 0x29, 0x03, 0xd0, 0x08, 0x98, 0x28, 0x18, 0xf2, 0xf7, 0x07, 0xfe, 0x00, 0x2f, 0x12, 0xd0, 0xf2, 0xf7, 0xcc, 0xfd, 0x0f, 0xe0, 0x31, 0x1c, 0xa8, 0x1c, 0x3c, 0x00, 0x54, 0xd8, 0x00, 0x00, 0x08, 0x9a, 0xf2, 0xf7, 0x4f, 0xfe, 0x08, 0x98, 0x68, 0x70, 0x07, 0xe0, 0xff, 0xe7, 0x07, 0x24, 0x04, 0xe0, 0x08, 0x24, 0x03, 0x21, 0x87, 0x20, 0xf3, 0xf7, 0x1a, 0xfd, 0x20, 0x1c, 0x09, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xf8, 0x6b, 0x01, 0x00, 0x9e, 0xb5, 0x1c, 0x1c, 0x00, 0xab, 0x19, 0x72, 0x00, 0x92, 0x00, 0x22, 0x01, 0x94, 0x69, 0x46, 0xfb, 0xf7, 0x08, 0xfa, 0x3c, 0x00, 0x90, 0xd8, 0x00, 0x00, 0x9e, 0xbd, 0x00, 0x00, 0x8f, 0xb5, 0x02, 0x92, 0x00, 0x22, 0x00, 0x90, 0x01, 0x90, 0x03, 0x91, 0x69, 0x46, 0x04, 0x20, 0xfb, 0xf7, 0xfc, 0xf9, 0x8f, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x0c, 0x1c, 0x01, 0x28, 0x0a, 0xd0, 0x03, 0x28, 0x19, 0xd0, 0x04, 0x28, 0x2c, 0xd1, 0x60, 0x68, 0x01, 0xf0, 0x35, 0xfc, 0x01, 0x1c, 0x83, 0x20, 0x0c, 0xcc, 0x22, 0xe0, 0x1c, 0x20, 0x3c, 0x00, 0xcc, 0xd8, 0x00, 0x00, 0x14, 0x49, 0x60, 0x43, 0x40, 0x18, 0x14, 0x49, 0x45, 0x18, 0x28, 0x1c, 0xf8, 0xf7, 0x46, 0xfc, 0xa9, 0x68, 0x00, 0x29, 0x03, 0xd0, 0x22, 0x1c, 0x08, 0x20, 0x05, 0xf0, 0x71, 0xfe, 0xb0, 0xbd, 0x20, 0x8c, 0xc8, 0x28, 0x01, 0xd3, 0x04, 0x20, 0x04, 0xe0, 0x65, 0x28, 0x01, 0xd3, 0x02, 0x20, 0x00, 0xe0, 0x01, 0x20, 0x20, 0x84, 0x20, 0x1c, 0x03, 0xf0, 0xdc, 0xfa, 0x3c, 0x00, 0x08, 0xd9, 0x00, 0x00, 0x22, 0x68, 0xe3, 0x68, 0x01, 0x1c, 0x82, 0x20, 0xff, 0xf7, 0xb4, 0xff, 0xb0, 0xbd, 0xa0, 0x21, 0x08, 0x20, 0xf3, 0xf7, 0xc3, 0xfc, 0xb0, 0xbd, 0xdc, 0x71, 0x01, 0x00, 0x64, 0xee, 0xff, 0xff, 0x03, 0x48, 0x04, 0x4a, 0x81, 0x68, 0x51, 0x61, 0xc0, 0x68, 0x90, 0x61, 0x70, 0x47, 0x00, 0x00, 0xf4, 0x68, 0x01, 0x00, 0xc0, 0x71, 0x01, 0x00, 0x03, 0x49, 0x04, 0x4a, 0x3c, 0x00, 0x44, 0xd9, 0x00, 0x00, 0x08, 0x6b, 0x90, 0x60, 0x88, 0x68, 0xd0, 0x60, 0x70, 0x47, 0x00, 0x00, 0x90, 0x5c, 0x01, 0x00, 0xc0, 0x71, 0x01, 0x00, 0x00, 0xb5, 0xff, 0xf7, 0xf1, 0xff, 0xff, 0xf7, 0xe3, 0xff, 0x00, 0xbd, 0xb0, 0xb5, 0x0d, 0x1c, 0x00, 0x28, 0x14, 0xd0, 0x0b, 0x49, 0x0c, 0x4c, 0x88, 0x68, 0x62, 0x69, 0xc9, 0x68, 0x80, 0x1a, 0xa2, 0x69, 0x89, 0x1a, 0x40, 0x18, 0x04, 0xd0, 0x3c, 0x00, 0x80, 0xd9, 0x00, 0x00, 0x64, 0x23, 0x59, 0x43, 0xf2, 0xf7, 0xc4, 0xfe, 0x20, 0x61, 0xff, 0xf7, 0xcd, 0xff, 0x20, 0x69, 0x28, 0x60, 0x01, 0x20, 0xb0, 0xbd, 0x00, 0x20, 0xb0, 0xbd, 0x00, 0x00, 0xf4, 0x68, 0x01, 0x00, 0xc0, 0x71, 0x01, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x00, 0x28, 0x17, 0xd0, 0x0c, 0x49, 0x0d, 0x4c, 0x08, 0x6b, 0xa2, 0x68, 0x89, 0x68, 0x80, 0x1a, 0xe2, 0x68, 0x89, 0x1a, 0x3c, 0x00, 0xbc, 0xd9, 0x00, 0x00, 0x40, 0x18, 0x07, 0xd0, 0x22, 0x88, 0x90, 0x42, 0x04, 0xd9, 0x64, 0x23, 0x59, 0x43, 0xf2, 0xf7, 0xa1, 0xfe, 0x60, 0x60, 0xff, 0xf7, 0xb6, 0xff, 0x60, 0x68, 0x28, 0x60, 0x01, 0x20, 0xb0, 0xbd, 0x00, 0x20, 0xb0, 0xbd, 0x90, 0x5c, 0x01, 0x00, 0xc0, 0x71, 0x01, 0x00, 0x7c, 0xb5, 0x10, 0x68, 0x00, 0x28, 0x02, 0xd0, 0x00, 0xf0, 0x24, 0xf8, 0x7c, 0xbd, 0x0f, 0x48, 0x3c, 0x00, 0xf8, 0xd9, 0x00, 0x00, 0xc0, 0x69, 0x84, 0x68, 0xe0, 0x68, 0x25, 0x6a, 0xa6, 0x69, 0xf3, 0xf7, 0xe3, 0xfd, 0xe1, 0x69, 0xf3, 0xf7, 0x06, 0xfd, 0x20, 0x1c, 0xe2, 0x69, 0x40, 0x30, 0xc1, 0x8b, 0x12, 0x89, 0x89, 0x18, 0xc1, 0x83, 0x07, 0x49, 0x01, 0x94, 0x00, 0x91, 0x28, 0x69, 0x33, 0x1c, 0x82, 0x88, 0x01, 0x68, 0xe0, 0x68, 0xc0, 0x68, 0xf8, 0xf7, 0x1e, 0xfc, 0xe0, 0xe7, 0x00, 0x00, 0x3c, 0x00, 0x34, 0xda, 0x00, 0x00, 0x84, 0x6a, 0x01, 0x00, 0x91, 0x5e, 0x00, 0x00, 0xf0, 0xb5, 0x85, 0x69, 0x06, 0x6a, 0x04, 0x1c, 0xc0, 0x68, 0x85, 0xb0, 0xc0, 0x68, 0x00, 0x28, 0x01, 0xd1, 0xf3, 0xf7, 0x57, 0xfc, 0x0a, 0x49, 0x02, 0x95, 0x04, 0x94, 0x03, 0x91, 0x30, 0x69, 0x82, 0x88, 0x01, 0x68, 0x26, 0x20, 0x01, 0x92, 0x00, 0x91, 0x43, 0x5d, 0xe0, 0x68, 0xe1, 0x69, 0x2a, 0x1c, 0x0e, 0x32, 0x3c, 0x00, 0x70, 0xda, 0x00, 0x00, 0xc0, 0x68, 0xf8, 0xf7, 0x37, 0xfd, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xe9, 0xd9, 0x00, 0x00, 0x10, 0xb5, 0x14, 0x1c, 0x05, 0x48, 0xfc, 0xf7, 0x7b, 0xfb, 0xa0, 0x68, 0xf3, 0xf7, 0x9e, 0xfd, 0xe1, 0x68, 0xc1, 0x60, 0x20, 0x1c, 0xf5, 0xf7, 0xbb, 0xfa, 0x10, 0xbd, 0xa0, 0x6a, 0x01, 0x00, 0x7c, 0xb5, 0x04, 0x1c, 0x60, 0x30, 0x02, 0x7b, 0xa1, 0x69, 0x00, 0x91, 0x3c, 0x00, 0xac, 0xda, 0x00, 0x00, 0x01, 0x92, 0x22, 0x1c, 0x21, 0x1c, 0x38, 0x31, 0xa0, 0x68, 0x48, 0x32, 0x0d, 0x1c, 0x63, 0x69, 0x03, 0xf0, 0x7a, 0xfb, 0x08, 0x21, 0x00, 0x20, 0xf3, 0xf7, 0x88, 0xfd, 0xe0, 0x60, 0x26, 0x69, 0xb1, 0x6b, 0x00, 0x29, 0x01, 0xd0, 0x10, 0x23, 0x00, 0xe0, 0x18, 0x23, 0x05, 0x49, 0x01, 0x94, 0x00, 0x91, 0x31, 0x68, 0xca, 0x18, 0x08, 0x23, 0x01, 0x1c, 0x28, 0x1c, 0x3c, 0x00, 0xe8, 0xda, 0x00, 0x00, 0xf8, 0xf7, 0x20, 0xfd, 0x7c, 0xbd, 0x00, 0x00, 0x81, 0xda, 0x00, 0x00, 0xf0, 0xb5, 0x46, 0x68, 0x17, 0x1c, 0x04, 0x1c, 0x01, 0x21, 0x30, 0x1c, 0x9b, 0xb0, 0xfa, 0xf7, 0x0d, 0xfc, 0x00, 0x25, 0x00, 0x28, 0x03, 0xd0, 0x13, 0x49, 0x0a, 0x7a, 0x01, 0x2a, 0x01, 0xd1, 0x01, 0x25, 0x1c, 0xe0, 0x88, 0x62, 0x4e, 0x61, 0x20, 0x89, 0xc8, 0x61, 0x60, 0x89, 0x00, 0x28, 0x3c, 0x00, 0x24, 0xdb, 0x00, 0x00, 0x03, 0xd0, 0x00, 0x20, 0x08, 0x84, 0x48, 0x84, 0x04, 0xe0, 0xe0, 0x68, 0x08, 0x84, 0x20, 0x8a, 0x48, 0x84, 0x60, 0x8a, 0x88, 0x84, 0x08, 0x6b, 0x00, 0x28, 0x03, 0xd1, 0x01, 0xa8, 0x03, 0xf0, 0x77, 0xfc, 0x04, 0xe0, 0x01, 0x20, 0x08, 0x61, 0x00, 0x20, 0x02, 0xf0, 0x39, 0xfb, 0x3d, 0x71, 0x1b, 0xb0, 0x01, 0x20, 0xf0, 0xbd, 0x00, 0x00, 0xf4, 0x6e, 0x01, 0x00, 0x3c, 0x00, 0x60, 0xdb, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0xf7, 0xf7, 0xe8, 0xfb, 0x00, 0x28, 0x11, 0xd1, 0x4b, 0x20, 0x00, 0x5d, 0x01, 0x28, 0x0d, 0xd1, 0x20, 0x1c, 0x04, 0xf0, 0x85, 0xfa, 0x00, 0x21, 0x20, 0x1c, 0x04, 0xf0, 0xf3, 0xf8, 0xa0, 0x69, 0x00, 0x21, 0xc2, 0x07, 0xd2, 0x0f, 0x04, 0x20, 0xf4, 0xf7, 0xd8, 0xf9, 0x10, 0xbd, 0x00, 0x00, 0x38, 0xb5, 0x04, 0x1c, 0x04, 0xf0, 0x36, 0xf9, 0x3c, 0x00, 0x9c, 0xdb, 0x00, 0x00, 0x00, 0x28, 0x03, 0xd0, 0x40, 0x30, 0x80, 0x7a, 0x00, 0x28, 0x25, 0xd1, 0x0c, 0x20, 0x29, 0x21, 0x08, 0x55, 0x21, 0x1c, 0x06, 0x22, 0xa0, 0x18, 0xf2, 0xf7, 0xa0, 0xfc, 0x20, 0x1c, 0x06, 0x22, 0x0e, 0x49, 0xf2, 0xf7, 0x9b, 0xfc, 0x01, 0x20, 0xe0, 0x61, 0x60, 0x62, 0x07, 0x20, 0x30, 0x21, 0x08, 0x55, 0x00, 0x25, 0xe5, 0x63, 0x06, 0x20, 0x00, 0xab, 0x18, 0x80, 0x3c, 0x00, 0xd8, 0xdb, 0x00, 0x00, 0xe0, 0x68, 0x00, 0x28, 0x01, 0xd0, 0xf3, 0xf7, 0xdb, 0xfc, 0x02, 0x21, 0x68, 0x46, 0xfd, 0xf7, 0x73, 0xfb, 0xe0, 0x60, 0x20, 0x1c, 0xff, 0xf7, 0x69, 0xfc, 0xe5, 0x60, 0x20, 0x1c, 0x38, 0xbd, 0x12, 0x61, 0x01, 0x00, 0xfe, 0xb5, 0x05, 0x1c, 0x0e, 0x1c, 0x15, 0x20, 0x00, 0xab, 0x98, 0x80, 0x14, 0x21, 0x17, 0x1c, 0x00, 0x20, 0xf3, 0xf7, 0xe3, 0xfc, 0x02, 0x90, 0x3c, 0x00, 0x14, 0xdc, 0x00, 0x00, 0x04, 0x68, 0x06, 0x22, 0x31, 0x1c, 0x60, 0x1d, 0x25, 0x71, 0xf2, 0xf7, 0x6b, 0xfc, 0x06, 0x22, 0x39, 0x1c, 0x20, 0x1c, 0x0b, 0x30, 0xf2, 0xf7, 0x65, 0xfc, 0x01, 0xa8, 0xff, 0xf7, 0x52, 0xfc, 0xfe, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x23, 0xfb, 0xf7, 0x5c, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x05, 0x1c, 0x08, 0x35, 0x0f, 0x4e, 0x29, 0x1c, 0x04, 0x1c, 0x3c, 0x00, 0x50, 0xdc, 0x00, 0x00, 0x06, 0x22, 0x30, 0x1c, 0xf2, 0xf7, 0x50, 0xfc, 0xa0, 0x88, 0xb0, 0x82, 0x28, 0x1c, 0x05, 0xf0, 0xa1, 0xff, 0x00, 0x28, 0x0b, 0xd0, 0xe0, 0x88, 0x30, 0x61, 0x28, 0x1c, 0x04, 0xf0, 0xcc, 0xf8, 0xa1, 0x88, 0x40, 0x30, 0x41, 0x80, 0x00, 0x20, 0xf4, 0xf7, 0xb8, 0xf9, 0x02, 0xe0, 0x04, 0x20, 0xf4, 0xf7, 0xa0, 0xf9, 0x00, 0x20, 0x70, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x3c, 0x00, 0x8c, 0xdc, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x20, 0xfb, 0xf7, 0xf8, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x04, 0x30, 0x05, 0x1c, 0xfd, 0xf7, 0x32, 0xf8, 0x00, 0x28, 0x09, 0xd0, 0x00, 0x20, 0xf7, 0xf7, 0x37, 0xfc, 0x00, 0x28, 0x04, 0xd0, 0x06, 0x22, 0x01, 0x1c, 0x28, 0x1c, 0xf2, 0xf7, 0x1e, 0xfc, 0x0a, 0x4e, 0x06, 0x22, 0x29, 0x1c, 0x30, 0x1c, 0xf2, 0xf7, 0x18, 0xfc, 0x3c, 0x00, 0xc8, 0xdc, 0x00, 0x00, 0x60, 0x89, 0xf0, 0x82, 0x28, 0x1c, 0x05, 0xf0, 0x69, 0xff, 0x00, 0x28, 0x03, 0xd0, 0x02, 0x20, 0xf4, 0xf7, 0x88, 0xf9, 0x02, 0xe0, 0x05, 0x20, 0xf9, 0xf7, 0xf4, 0xfa, 0x00, 0x20, 0x70, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x00, 0x79, 0x04, 0x28, 0x1c, 0xd2, 0x60, 0x79, 0x01, 0x28, 0x01, 0xd0, 0x03, 0x28, 0x04, 0xd1, 0x00, 0x22, 0x01, 0x21, 0x3c, 0x00, 0x04, 0xdd, 0x00, 0x00, 0xa0, 0x1d, 0xf9, 0xf7, 0x69, 0xfc, 0x60, 0x79, 0x00, 0x28, 0x04, 0xd1, 0x22, 0x79, 0x00, 0x21, 0xf9, 0xf7, 0x62, 0xfc, 0x0a, 0xe0, 0x03, 0x28, 0x08, 0xd1, 0x00, 0x24, 0x22, 0x1c, 0x00, 0x21, 0x00, 0x20, 0xf9, 0xf7, 0x59, 0xfc, 0x01, 0x34, 0x04, 0x2c, 0xf7, 0xdb, 0x01, 0x20, 0x10, 0xbd, 0xf0, 0xb5, 0x97, 0xb0, 0x17, 0x1c, 0x05, 0x1c, 0x04, 0x30, 0x04, 0x1c, 0x3c, 0x00, 0x40, 0xdd, 0x00, 0x00, 0x15, 0xaa, 0x16, 0xa9, 0x05, 0xf0, 0xe2, 0xfe, 0x00, 0x28, 0x2e, 0xd0, 0x15, 0x98, 0x4b, 0x21, 0x09, 0x5c, 0x00, 0x29, 0x23, 0xd0, 0x01, 0x29, 0x02, 0xd0, 0x02, 0x29, 0x1f, 0xd1, 0x01, 0xe0, 0x04, 0xf0, 0x90, 0xf9, 0xad, 0x7a, 0x13, 0x48, 0x16, 0x9e, 0x05, 0x80, 0x06, 0x22, 0x21, 0x1c, 0x08, 0x30, 0xf2, 0xf7, 0xc1, 0xfb, 0x22, 0x1c, 0x31, 0x1c, 0x02, 0xa8, 0x3c, 0x00, 0x7c, 0xdd, 0x00, 0x00, 0x00, 0xf0, 0x74, 0xfb, 0x0a, 0x20, 0x0a, 0xa9, 0x48, 0x72, 0x00, 0xab, 0x9d, 0x80, 0x02, 0x21, 0x01, 0xa8, 0xfd, 0xf7, 0x9f, 0xfa, 0x05, 0x90, 0x02, 0xa8, 0xff, 0xf7, 0x95, 0xfb, 0xf3, 0xf7, 0xf7, 0xf9, 0x00, 0x21, 0x15, 0x98, 0x03, 0xf0, 0xe1, 0xff, 0x00, 0x20, 0x00, 0xe0, 0x01, 0x20, 0x38, 0x71, 0x17, 0xb0, 0x01, 0x20, 0xf0, 0xbd, 0x98, 0x7c, 0x01, 0x00, 0x3c, 0x00, 0xb8, 0xdd, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x20, 0xfb, 0xf7, 0x62, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x80, 0x7d, 0x15, 0x1c, 0x0a, 0x1c, 0xc0, 0x07, 0xc0, 0x17, 0x01, 0x30, 0x21, 0x1c, 0xf9, 0xf7, 0xfb, 0xfc, 0x00, 0x28, 0x03, 0xd1, 0x04, 0x20, 0x28, 0x71, 0x01, 0x20, 0xb0, 0xbd, 0x20, 0x6a, 0xf7, 0xf7, 0x76, 0xfe, 0x60, 0x6a, 0xf7, 0xf7, 0x7b, 0xfe, 0x20, 0x6a, 0x3c, 0x00, 0xf4, 0xdd, 0x00, 0x00, 0xfe, 0xf7, 0x88, 0xfa, 0x00, 0x20, 0xb0, 0xbd, 0x10, 0xb5, 0x14, 0x1c, 0xc2, 0x79, 0x81, 0x79, 0x80, 0x88, 0xf7, 0xf7, 0xa1, 0xfa, 0x20, 0x71, 0x01, 0x20, 0x10, 0xbd, 0x80, 0xb5, 0x01, 0x23, 0xfa, 0xf7, 0x70, 0xff, 0x80, 0xbd, 0x00, 0x00, 0xf0, 0xb5, 0x04, 0x1c, 0x08, 0x1c, 0x00, 0x21, 0x0f, 0x28, 0x91, 0xb0, 0x00, 0xd3, 0x02, 0x21, 0x00, 0x29, 0x41, 0xd1, 0x3c, 0x00, 0x30, 0xde, 0x00, 0x00, 0xc0, 0x00, 0x24, 0x4f, 0x10, 0x90, 0xc6, 0x19, 0xb2, 0x88, 0x21, 0x68, 0x02, 0xa8, 0xf2, 0xf7, 0x5b, 0xfb, 0x21, 0x89, 0xb0, 0x88, 0x09, 0x1a, 0x00, 0x29, 0x07, 0xdd, 0x09, 0x04, 0x22, 0x68, 0x09, 0x0c, 0x10, 0x18, 0xf3, 0xf7, 0xc0, 0xfb, 0x05, 0x1c, 0x00, 0xe0, 0x00, 0x25, 0xb0, 0x79, 0x80, 0x21, 0x88, 0x43, 0x17, 0x49, 0x78, 0x31, 0x09, 0x5c, 0x00, 0x20, 0x3c, 0x00, 0x6c, 0xde, 0x00, 0x00, 0xf3, 0xf7, 0xb4, 0xfb, 0x07, 0x1c, 0x00, 0x68, 0x13, 0x49, 0x01, 0x90, 0x10, 0x98, 0x0b, 0x58, 0x01, 0x9a, 0x29, 0x1c, 0x02, 0xa8, 0xf2, 0xf7, 0xac, 0xfa, 0x00, 0x90, 0x28, 0x1c, 0xf3, 0xf7, 0x73, 0xfb, 0x20, 0x1c, 0xf3, 0xf7, 0x82, 0xfb, 0x00, 0x98, 0x00, 0x28, 0x08, 0xd0, 0x02, 0x98, 0x01, 0x99, 0x08, 0x60, 0xb0, 0x79, 0x39, 0x1c, 0xfa, 0xf7, 0x20, 0xff, 0x3c, 0x00, 0xa8, 0xde, 0x00, 0x00, 0x11, 0xb0, 0xf0, 0xbd, 0x38, 0x1c, 0xf3, 0xf7, 0x61, 0xfb, 0xf9, 0xe7, 0x2d, 0x20, 0xf3, 0xf7, 0xf5, 0xf9, 0x20, 0x1c, 0xf3, 0xf7, 0x6c, 0xfb, 0xf2, 0xe7, 0x00, 0x00, 0x24, 0x44, 0x01, 0x00, 0x70, 0xb5, 0x05, 0x1c, 0x20, 0x35, 0x06, 0x1c, 0xa8, 0x79, 0x04, 0x28, 0x48, 0xd2, 0xe9, 0x79, 0x01, 0x29, 0x13, 0xd1, 0x30, 0x1c, 0x28, 0x30, 0x03, 0xf0, 0x92, 0xff, 0x3c, 0x00, 0xe4, 0xde, 0x00, 0x00, 0x00, 0x28, 0x3f, 0xd0, 0x01, 0x1c, 0x8c, 0x31, 0x01, 0x65, 0xa9, 0x79, 0x4c, 0x22, 0x04, 0x1c, 0x11, 0x54, 0x81, 0x18, 0x41, 0x62, 0x50, 0x34, 0x04, 0x62, 0xe1, 0x1e, 0x81, 0x62, 0x0b, 0xe0, 0x00, 0x29, 0x2f, 0xd1, 0x3c, 0x22, 0x18, 0x49, 0x42, 0x43, 0x54, 0x18, 0x17, 0x4a, 0x04, 0x34, 0x12, 0x68, 0x00, 0x2a, 0x00, 0xd1, 0x48, 0x70, 0x00, 0x2c, 0x23, 0xd0, 0x3c, 0x00, 0x20, 0xdf, 0x00, 0x00, 0x35, 0x1c, 0x30, 0x35, 0xe8, 0x79, 0x01, 0x28, 0x01, 0xd0, 0x05, 0x28, 0x01, 0xd1, 0x06, 0x20, 0xe8, 0x71, 0x20, 0x22, 0x31, 0x1d, 0x20, 0x68, 0xf2, 0xf7, 0xde, 0xfa, 0xb0, 0x8c, 0xa0, 0x80, 0xe8, 0x79, 0xa0, 0x71, 0xa8, 0x79, 0x00, 0x25, 0xa0, 0x63, 0x01, 0x20, 0x60, 0x81, 0x00, 0x20, 0xe0, 0x60, 0x2e, 0x36, 0xe8, 0x00, 0x00, 0x19, 0x18, 0x30, 0x08, 0x22, 0x3c, 0x00, 0x5c, 0xdf, 0x00, 0x00, 0x31, 0x1c, 0xf2, 0xf7, 0xcb, 0xfa, 0x01, 0x35, 0x04, 0x2d, 0xf5, 0xd3, 0x01, 0x20, 0x70, 0xbd, 0x68, 0x61, 0x01, 0x00, 0xdc, 0x62, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0xc0, 0x7a, 0x01, 0x28, 0x01, 0xd0, 0x03, 0x28, 0x07, 0xd1, 0x20, 0x1d, 0x03, 0xf0, 0x40, 0xff, 0x00, 0x28, 0x02, 0xd0, 0xa1, 0x7a, 0x40, 0x30, 0x41, 0x73, 0xe0, 0x7a, 0x00, 0x28, 0x01, 0xd0, 0x3c, 0x00, 0x98, 0xdf, 0x00, 0x00, 0x03, 0x28, 0x02, 0xd1, 0xa0, 0x7a, 0x02, 0x49, 0x08, 0x70, 0x01, 0x20, 0x10, 0xbd, 0x00, 0x00, 0x68, 0x61, 0x01, 0x00, 0x70, 0xb5, 0x0e, 0x1c, 0x03, 0x21, 0x04, 0x1c, 0x30, 0x1c, 0xfc, 0xf7, 0xe1, 0xfb, 0x00, 0x28, 0x01, 0xd0, 0x85, 0x78, 0x00, 0xe0, 0x00, 0x25, 0x0b, 0x48, 0x32, 0x1c, 0x00, 0x68, 0x03, 0x68, 0x20, 0x7c, 0x80, 0x07, 0xc0, 0x0f, 0x21, 0x1c, 0x3c, 0x00, 0xd4, 0xdf, 0x00, 0x00, 0xf7, 0xf7, 0x62, 0xfe, 0x00, 0x28, 0x05, 0xd0, 0x01, 0x21, 0x28, 0x1c, 0xfd, 0xf7, 0xfe, 0xfb, 0x00, 0x20, 0x00, 0xe0, 0x08, 0x20, 0x03, 0xf0, 0xc5, 0xff, 0x00, 0x20, 0x70, 0xbd, 0x00, 0x00, 0xe4, 0x65, 0x01, 0x00, 0x80, 0xb5, 0x42, 0x68, 0x00, 0x88, 0x01, 0x21, 0x49, 0x06, 0x08, 0x43, 0x2d, 0x21, 0x05, 0xf0, 0xd3, 0xfb, 0x80, 0xbd, 0x03, 0x49, 0x01, 0x20, 0x3c, 0x00, 0x10, 0xe0, 0x00, 0x00, 0x49, 0x78, 0x02, 0x29, 0x00, 0xd0, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x84, 0x66, 0x01, 0x00, 0x8c, 0xb5, 0x01, 0x28, 0x1f, 0xd1, 0x00, 0x29, 0x0d, 0xd0, 0x01, 0x29, 0x0b, 0xd0, 0x02, 0x29, 0x01, 0xd0, 0x03, 0x29, 0x16, 0xd1, 0x00, 0x20, 0xf9, 0xf7, 0x14, 0xfc, 0x93, 0x20, 0x00, 0xab, 0x18, 0x80, 0x00, 0x20, 0x08, 0xe0, 0x01, 0x29, 0x00, 0xd0, 0x00, 0x20, 0x3c, 0x00, 0x4c, 0xe0, 0x00, 0x00, 0xf9, 0xf7, 0x0a, 0xfc, 0x83, 0x20, 0x00, 0xab, 0x18, 0x80, 0x02, 0x20, 0x00, 0xf0, 0xcc, 0xf8, 0x01, 0x90, 0x68, 0x46, 0xff, 0xf7, 0x3a, 0xfa, 0x8c, 0xbd, 0x01, 0x21, 0x0e, 0x20, 0xf3, 0xf7, 0x1b, 0xf9, 0xf9, 0xe7, 0xff, 0xb5, 0x17, 0x1c, 0x1e, 0x1c, 0x14, 0x21, 0x00, 0x20, 0x83, 0xb0, 0xf3, 0xf7, 0xac, 0xfa, 0x05, 0x1c, 0x04, 0x68, 0x12, 0x20, 0x00, 0xab, 0x3c, 0x00, 0x88, 0xe0, 0x00, 0x00, 0x98, 0x80, 0x06, 0x22, 0x60, 0x1d, 0x03, 0x99, 0xf2, 0xf7, 0x32, 0xfa, 0x00, 0x20, 0x20, 0x71, 0x27, 0x73, 0x04, 0x99, 0x20, 0x1c, 0xe1, 0x72, 0x31, 0x1c, 0x06, 0x22, 0x0d, 0x30, 0xf2, 0xf7, 0x27, 0xfa, 0x02, 0x95, 0x01, 0xa8, 0xff, 0xf7, 0x13, 0xfa, 0x07, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x0f, 0x1c, 0x0c, 0x21, 0x00, 0x20, 0xf3, 0xf7, 0x3c, 0x00, 0xc4, 0xe0, 0x00, 0x00, 0x89, 0xfa, 0x05, 0x68, 0x04, 0x1c, 0x28, 0x1d, 0x06, 0x22, 0x31, 0x1c, 0xf2, 0xf7, 0x12, 0xfa, 0x6f, 0x81, 0x20, 0x1c, 0xf8, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, 0x08, 0x21, 0x00, 0x20, 0xf3, 0xf7, 0x77, 0xfa, 0x01, 0x68, 0x8c, 0x71, 0x8d, 0x80, 0xb0, 0xbd, 0x00, 0x00, 0xf7, 0xb5, 0x0e, 0x1c, 0x10, 0x21, 0x17, 0x1c, 0x00, 0x20, 0xf3, 0xf7, 0x3c, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x6b, 0xfa, 0x04, 0x68, 0x05, 0x1c, 0x20, 0x1d, 0x06, 0x22, 0x00, 0x99, 0xf2, 0xf7, 0xf4, 0xf9, 0x66, 0x81, 0xa7, 0x81, 0x28, 0x1c, 0xfe, 0xbd, 0xf3, 0xb5, 0x0c, 0x1c, 0x08, 0x21, 0x00, 0x20, 0x85, 0xb0, 0xf3, 0xf7, 0x59, 0xfa, 0x06, 0x1c, 0x07, 0x68, 0xe0, 0x68, 0x00, 0x28, 0x02, 0xd0, 0x05, 0x99, 0x01, 0x29, 0x04, 0xd1, 0x05, 0x98, 0x38, 0x71, 0x00, 0x20, 0x3c, 0x00, 0x3c, 0xe1, 0x00, 0x00, 0x78, 0x71, 0x56, 0xe0, 0x03, 0x68, 0x01, 0x21, 0x03, 0x93, 0x20, 0x69, 0x02, 0x90, 0xfc, 0xf7, 0x17, 0xfb, 0x05, 0x1c, 0x02, 0x98, 0x32, 0x21, 0xfc, 0xf7, 0x12, 0xfb, 0x00, 0x22, 0xd2, 0x43, 0x01, 0x1c, 0x28, 0x1c, 0x04, 0xab, 0xf7, 0xf7, 0xb9, 0xf8, 0x00, 0x28, 0x04, 0xd1, 0x30, 0x1c, 0xf3, 0xf7, 0x02, 0xfa, 0x00, 0x26, 0x3c, 0xe0, 0x00, 0x2d, 0x05, 0xd0, 0x3c, 0x00, 0x78, 0xe1, 0x00, 0x00, 0x68, 0x78, 0x09, 0x38, 0x07, 0x28, 0x01, 0xd8, 0x32, 0x20, 0x28, 0x70, 0x1c, 0x21, 0x00, 0x20, 0xf3, 0xf7, 0x26, 0xfa, 0x01, 0x90, 0x05, 0x68, 0x01, 0x1c, 0x30, 0x1c, 0xf3, 0xf7, 0x40, 0xf9, 0xe0, 0x68, 0xf3, 0xf7, 0x0b, 0xfa, 0xa8, 0x61, 0xe1, 0x68, 0x01, 0x98, 0xf3, 0xf7, 0x38, 0xf9, 0x00, 0x20, 0xe0, 0x60, 0x05, 0x98, 0x80, 0x21, 0x08, 0x43, 0x38, 0x71, 0x3c, 0x00, 0xb4, 0xe1, 0x00, 0x00, 0x01, 0x20, 0x21, 0x1c, 0x14, 0x31, 0x78, 0x71, 0x28, 0x1c, 0x06, 0x22, 0xf2, 0xf7, 0x9a, 0xf9, 0x02, 0x9a, 0x29, 0x20, 0x00, 0x92, 0x00, 0x5d, 0x01, 0x21, 0xe2, 0x6a, 0x08, 0x28, 0x00, 0xd0, 0x00, 0x21, 0x28, 0x1c, 0x03, 0x9b, 0x02, 0xf0, 0x9d, 0xff, 0xa0, 0x6b, 0x28, 0x61, 0x20, 0x6c, 0x68, 0x61, 0x7f, 0x30, 0x01, 0xd1, 0x0f, 0x20, 0x68, 0x61, 0x30, 0x1c, 0x3c, 0x00, 0xf0, 0xe1, 0x00, 0x00, 0x07, 0xb0, 0xf0, 0xbd, 0x10, 0xb5, 0x04, 0x1c, 0x08, 0x21, 0x00, 0x20, 0xf3, 0xf7, 0xec, 0xf9, 0x01, 0x68, 0x0c, 0x71, 0x10, 0xbd, 0x00, 0x00, 0x01, 0x48, 0x00, 0x68, 0x70, 0x47, 0x00, 0x00, 0x28, 0x61, 0x01, 0x00, 0x01, 0x49, 0x08, 0x60, 0x70, 0x47, 0x00, 0x00, 0xe4, 0x65, 0x01, 0x00, 0x02, 0x1c, 0x01, 0x20, 0x00, 0x06, 0x08, 0x43, 0x80, 0xb5, 0x2d, 0x21, 0x3c, 0x00, 0x2c, 0xe2, 0x00, 0x00, 0x05, 0xf0, 0xc0, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x28, 0x07, 0xd0, 0xf1, 0x28, 0x25, 0xd0, 0xf3, 0x28, 0x27, 0xd1, 0x02, 0x20, 0x02, 0xf0, 0xbc, 0xf9, 0x80, 0xbd, 0x00, 0x29, 0x1a, 0xd0, 0x01, 0x29, 0x03, 0xd0, 0xf2, 0x29, 0xf8, 0xd1, 0x88, 0x21, 0x1c, 0xe0, 0x10, 0x48, 0x01, 0x78, 0x00, 0x29, 0x05, 0xd1, 0x40, 0x78, 0x01, 0x28, 0xef, 0xd1, 0x3c, 0x00, 0x68, 0xe2, 0x00, 0x00, 0x00, 0xf0, 0x16, 0xfa, 0x80, 0xbd, 0x0b, 0x48, 0x14, 0x30, 0x00, 0x89, 0xfc, 0xf7, 0x5a, 0xfc, 0x01, 0x1c, 0x01, 0x22, 0x0f, 0x20, 0x05, 0xf0, 0x9f, 0xf9, 0x80, 0xbd, 0x04, 0xf0, 0x52, 0xfa, 0x80, 0xbd, 0x00, 0x20, 0xfa, 0xf7, 0x32, 0xfe, 0x80, 0xbd, 0x02, 0x21, 0x0f, 0x20, 0xf3, 0xf7, 0x05, 0xf8, 0x80, 0xbd, 0x84, 0x66, 0x01, 0x00, 0x01, 0x48, 0x00, 0x78, 0x3c, 0x00, 0xa4, 0xe2, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x74, 0x66, 0x01, 0x00, 0x01, 0x49, 0x00, 0x20, 0x48, 0x60, 0x70, 0x47, 0xec, 0x65, 0x01, 0x00, 0xf8, 0xb5, 0x0e, 0x1c, 0x13, 0x4d, 0x01, 0x1c, 0x14, 0x1c, 0x68, 0x22, 0x28, 0x1c, 0x1f, 0x1c, 0x0c, 0x30, 0xf2, 0xf7, 0x71, 0xf9, 0x0f, 0x49, 0x00, 0x20, 0xac, 0x39, 0x48, 0x60, 0x01, 0x21, 0x29, 0x60, 0x19, 0x21, 0x19, 0x2c, 0x6e, 0x67, 0x3c, 0x00, 0xe0, 0xe2, 0x00, 0x00, 0x00, 0xd3, 0x21, 0x1c, 0x29, 0x81, 0x09, 0x49, 0x14, 0x39, 0x88, 0x73, 0x8f, 0x74, 0xc8, 0x78, 0x01, 0x28, 0x08, 0xd0, 0x01, 0x21, 0x0f, 0x20, 0x05, 0xf0, 0x9c, 0xf9, 0x19, 0x20, 0xfc, 0xf7, 0x15, 0xfc, 0xfb, 0xf7, 0x99, 0xf8, 0x01, 0x20, 0xf8, 0xbd, 0x00, 0x00, 0x98, 0x66, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x28, 0x02, 0xd1, 0x00, 0xf0, 0x2f, 0xf8, 0x80, 0xbd, 0x3c, 0x00, 0x1c, 0xe3, 0x00, 0x00, 0x01, 0x21, 0x1d, 0x20, 0xf2, 0xf7, 0xc0, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x01, 0x20, 0x07, 0x49, 0x00, 0x05, 0x80, 0xb5, 0x88, 0x60, 0x00, 0x22, 0x80, 0x21, 0x16, 0x20, 0x05, 0xf0, 0x4c, 0xf9, 0x04, 0xf0, 0x34, 0xfd, 0x02, 0x49, 0x08, 0x61, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x24, 0x6d, 0x01, 0x00, 0x06, 0x4a, 0x80, 0xb5, 0x3c, 0x00, 0x58, 0xe3, 0x00, 0x00, 0xd1, 0x6a, 0x81, 0x42, 0x07, 0xd1, 0x10, 0x7f, 0x24, 0x23, 0x04, 0x49, 0x58, 0x43, 0x40, 0x18, 0xc0, 0x68, 0xf2, 0xf7, 0x35, 0xf8, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x94, 0x46, 0x01, 0x00, 0x1d, 0x48, 0x1c, 0xb5, 0x00, 0x78, 0x00, 0x28, 0x2d, 0xd0, 0x1c, 0x48, 0x00, 0x68, 0x00, 0x28, 0x29, 0xd0, 0x1a, 0x4a, 0x1a, 0x4b, 0x04, 0x32, 0x11, 0x68, 0x1c, 0x69, 0x3c, 0x00, 0x94, 0xe3, 0x00, 0x00, 0xa1, 0x42, 0x22, 0xd1, 0x51, 0x68, 0x5b, 0x69, 0x99, 0x42, 0x1f, 0xd1, 0x16, 0x49, 0x49, 0x68, 0x93, 0x68, 0xc9, 0x1a, 0x81, 0x42, 0x19, 0xd2, 0xd0, 0x68, 0x14, 0x49, 0x01, 0x30, 0xd0, 0x60, 0x09, 0x68, 0x88, 0x42, 0x0c, 0xd9, 0x06, 0x22, 0xff, 0x21, 0x68, 0x46, 0xf2, 0xf7, 0x2e, 0xf9, 0xf3, 0xf7, 0xac, 0xfc, 0x01, 0x1c, 0x00, 0x23, 0x00, 0x22, 0x68, 0x46, 0x3c, 0x00, 0xd0, 0xe3, 0x00, 0x00, 0x02, 0xf0, 0xce, 0xf9, 0x01, 0x22, 0x1d, 0x20, 0x0a, 0x49, 0x05, 0xf0, 0xf7, 0xf8, 0x1c, 0xbd, 0xf7, 0xf7, 0x88, 0xf9, 0x04, 0x22, 0x81, 0x18, 0x08, 0x1c, 0xfc, 0xf7, 0x27, 0xfb, 0xf6, 0xe7, 0x1c, 0x75, 0x01, 0x00, 0x44, 0x75, 0x01, 0x00, 0x28, 0x61, 0x01, 0x00, 0x90, 0x5c, 0x01, 0x00, 0xf0, 0x59, 0x01, 0x00, 0xa0, 0x86, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x68, 0x3c, 0x00, 0x0c, 0xe4, 0x00, 0x00, 0x00, 0x29, 0x15, 0xd1, 0x00, 0x79, 0x02, 0x28, 0x12, 0xd1, 0x08, 0x1c, 0xf7, 0xf7, 0x80, 0xf8, 0x00, 0x28, 0x0d, 0xd0, 0x03, 0xf0, 0xf2, 0xfc, 0x08, 0x30, 0x41, 0x8f, 0x00, 0x29, 0x07, 0xd1, 0x80, 0x69, 0x00, 0x28, 0x04, 0xd0, 0x80, 0x79, 0x06, 0x28, 0x01, 0xd1, 0xfc, 0xf7, 0x18, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x01, 0x49, 0x00, 0x20, 0x88, 0x62, 0x70, 0x47, 0x3c, 0x00, 0x48, 0xe4, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0xb0, 0xb5, 0x05, 0x4d, 0x04, 0x1c, 0xa9, 0x1d, 0xff, 0xf7, 0x14, 0xf8, 0x06, 0x22, 0x29, 0x1c, 0xa0, 0x18, 0xf2, 0xf7, 0x4b, 0xf8, 0xb0, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x15, 0x1c, 0xff, 0xf7, 0x07, 0xf8, 0x06, 0x22, 0x29, 0x1c, 0xa0, 0x18, 0xf2, 0xf7, 0x3e, 0xf8, 0xb0, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x0a, 0x30, 0x3c, 0x00, 0x84, 0xe4, 0x00, 0x00, 0xf7, 0xf7, 0xbc, 0xf9, 0x01, 0x23, 0x00, 0x28, 0x03, 0xd0, 0x05, 0x48, 0x00, 0x78, 0x01, 0x28, 0x04, 0xd1, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x03, 0xf0, 0xc6, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0xa0, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x23, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x03, 0xf0, 0xbb, 0xfd, 0x80, 0xbd, 0xb0, 0xb5, 0x05, 0x4d, 0xac, 0x79, 0x0a, 0x1c, 0x3c, 0x00, 0xc0, 0xe4, 0x00, 0x00, 0x01, 0x1c, 0x01, 0x23, 0x01, 0x20, 0x03, 0xf0, 0xb1, 0xfd, 0xac, 0x71, 0xb0, 0xbd, 0x00, 0x00, 0x20, 0x10, 0x07, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x0c, 0x1c, 0x88, 0x07, 0x02, 0xd5, 0xf6, 0xf7, 0x47, 0xfa, 0x10, 0xe0, 0x60, 0x07, 0x0e, 0xd5, 0x17, 0x4f, 0xa3, 0x20, 0xc0, 0x5d, 0x15, 0x4d, 0x10, 0x28, 0x00, 0xd3, 0x15, 0x4d, 0x04, 0xf0, 0x59, 0xfc, 0xb9, 0x6f, 0x3c, 0x00, 0xfc, 0xe4, 0x00, 0x00, 0x40, 0x1a, 0x29, 0x1a, 0x01, 0x20, 0xf6, 0xf7, 0xc1, 0xfa, 0xe0, 0x07, 0x11, 0x49, 0xc0, 0x0f, 0x48, 0x60, 0x0c, 0xd0, 0x0d, 0x4c, 0x44, 0x3c, 0x20, 0x78, 0x03, 0x28, 0x0f, 0xd1, 0x00, 0x2e, 0x06, 0xd0, 0xf6, 0xf7, 0xf9, 0xf9, 0x01, 0x1c, 0x01, 0x20, 0xf6, 0xf7, 0xaf, 0xfa, 0xf8, 0xbd, 0x09, 0x49, 0x01, 0x20, 0xf6, 0xf7, 0xaa, 0xfa, 0x01, 0x20, 0x20, 0x70, 0x3c, 0x00, 0x38, 0xe5, 0x00, 0x00, 0xf7, 0xe7, 0x01, 0x21, 0x30, 0x1c, 0xf6, 0xf7, 0x89, 0xfa, 0xf2, 0xe7, 0xa6, 0x0e, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0xc4, 0x09, 0x00, 0x00, 0xb0, 0x57, 0x01, 0x00, 0x40, 0x42, 0x0f, 0x00, 0x80, 0xb5, 0x06, 0x28, 0x04, 0xdb, 0x05, 0x21, 0xff, 0x20, 0xf2, 0xf7, 0x9f, 0xfe, 0x80, 0xbd, 0x03, 0x4a, 0xc0, 0x00, 0x11, 0x50, 0x01, 0x21, 0x80, 0x18, 0x01, 0x71, 0x3c, 0x00, 0x74, 0xe5, 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x9c, 0x5a, 0x01, 0x00, 0x01, 0x48, 0x80, 0x68, 0x70, 0x47, 0x00, 0x00, 0xd0, 0x60, 0x01, 0x00, 0xb0, 0xb5, 0x08, 0x4c, 0x25, 0x1d, 0x28, 0x1c, 0x21, 0x68, 0x00, 0xf0, 0xf1, 0xfe, 0x00, 0x28, 0x03, 0xd1, 0x01, 0x21, 0x04, 0x48, 0xf2, 0xf7, 0xcf, 0xfa, 0x28, 0x1c, 0x21, 0x68, 0x00, 0xf0, 0xfb, 0xfe, 0xb0, 0xbd, 0xc0, 0x60, 0x01, 0x00, 0x3c, 0x00, 0xb0, 0xe5, 0x00, 0x00, 0x2c, 0x10, 0x07, 0x00, 0xb0, 0xb5, 0x10, 0x4d, 0x0c, 0x1c, 0xa8, 0x68, 0x00, 0x28, 0x02, 0xd1, 0x04, 0xf0, 0xf4, 0xfb, 0x28, 0x60, 0x20, 0x1c, 0x04, 0xf0, 0x38, 0xfb, 0x01, 0x21, 0x03, 0x20, 0x03, 0xf0, 0xc4, 0xfe, 0x04, 0xf0, 0xf0, 0xfb, 0xa8, 0x68, 0x00, 0x28, 0x0b, 0xd1, 0x04, 0xf0, 0xe5, 0xfb, 0x29, 0x68, 0x00, 0x1b, 0x40, 0x1a, 0x69, 0x68, 0x40, 0x18, 0x3c, 0x00, 0xec, 0xe5, 0x00, 0x00, 0x41, 0x08, 0x40, 0x18, 0x28, 0x60, 0x01, 0x20, 0xa8, 0x60, 0xb0, 0xbd, 0xd0, 0x60, 0x01, 0x00, 0xf8, 0xb5, 0x1f, 0x4e, 0x00, 0x24, 0xb0, 0x68, 0x00, 0x28, 0x02, 0xd1, 0x04, 0xf0, 0xd0, 0xfb, 0x70, 0x60, 0x05, 0xf0, 0x61, 0xf8, 0x04, 0xf0, 0x8f, 0xfb, 0x05, 0x1c, 0xf9, 0xf7, 0x66, 0xfe, 0x31, 0x68, 0x18, 0x4a, 0x41, 0x18, 0x12, 0x68, 0xe8, 0x0b, 0x00, 0x2a, 0x3c, 0x00, 0x28, 0xe6, 0x00, 0x00, 0x00, 0xd1, 0xa8, 0x0a, 0x40, 0x18, 0x85, 0x42, 0x1f, 0xd9, 0x14, 0x4f, 0x2d, 0x1a, 0x38, 0x1c, 0x20, 0x30, 0x81, 0x79, 0x00, 0xab, 0x19, 0x70, 0xc0, 0x79, 0x58, 0x70, 0x05, 0xf0, 0x6e, 0xf8, 0x00, 0x28, 0x03, 0xd1, 0x02, 0x21, 0x8f, 0x20, 0xf2, 0xf7, 0x28, 0xfe, 0x29, 0x1c, 0x0c, 0x48, 0xf2, 0x68, 0xf8, 0xf7, 0x09, 0xfc, 0x00, 0x28, 0x04, 0xd0, 0x01, 0x1c, 0x3c, 0x00, 0x64, 0xe6, 0x00, 0x00, 0x28, 0x1c, 0xff, 0xf7, 0xa5, 0xff, 0x01, 0x24, 0x00, 0xab, 0x18, 0x88, 0xf8, 0x84, 0x05, 0xf0, 0x47, 0xf8, 0x20, 0x1c, 0xf8, 0xbd, 0x00, 0x00, 0xd0, 0x60, 0x01, 0x00, 0xf4, 0x74, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, 0x89, 0x13, 0x01, 0x00, 0x01, 0x49, 0x01, 0x20, 0xc8, 0x60, 0x70, 0x47, 0xd0, 0x60, 0x01, 0x00, 0x06, 0x48, 0x80, 0xb5, 0x00, 0x68, 0x01, 0x28, 0x3c, 0x00, 0xa0, 0xe6, 0x00, 0x00, 0x07, 0xd1, 0x04, 0x48, 0xac, 0x38, 0x01, 0x69, 0x03, 0x48, 0x00, 0xf0, 0x79, 0xfe, 0xf3, 0xf7, 0x2b, 0xfa, 0x80, 0xbd, 0x98, 0x66, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x80, 0xb5, 0x42, 0x78, 0x81, 0x68, 0x00, 0x79, 0x03, 0xf0, 0xde, 0xff, 0x00, 0x28, 0x01, 0xd1, 0xf5, 0xf7, 0xb6, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x1f, 0xb5, 0x04, 0xf0, 0x69, 0xfb, 0xf6, 0xf7, 0x3c, 0x00, 0xdc, 0xe6, 0x00, 0x00, 0x91, 0xff, 0x16, 0x4c, 0x02, 0x28, 0x03, 0xd1, 0xff, 0xf7, 0xdc, 0xfd, 0x04, 0x28, 0x02, 0xd3, 0x00, 0x20, 0x20, 0x70, 0x1f, 0xbd, 0xfb, 0xf7, 0xf7, 0xfc, 0x00, 0x28, 0xfa, 0xd1, 0x60, 0x6a, 0x00, 0x28, 0xf7, 0xd0, 0x20, 0x78, 0x80, 0x07, 0xf4, 0xd4, 0x09, 0x21, 0x16, 0x20, 0x04, 0xf0, 0x93, 0xff, 0x01, 0x20, 0x20, 0x70, 0x0b, 0x4c, 0x09, 0x49, 0x02, 0x90, 0x3c, 0x00, 0x18, 0xe7, 0x00, 0x00, 0x01, 0x94, 0x00, 0x91, 0x04, 0xf0, 0x46, 0xfb, 0x00, 0x19, 0x03, 0x90, 0x68, 0x46, 0xfd, 0xf7, 0xb5, 0xfb, 0x00, 0x22, 0x16, 0x21, 0x84, 0x20, 0x05, 0xf0, 0x3e, 0xf8, 0xdc, 0xe7, 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, 0x61, 0xed, 0x00, 0x00, 0x40, 0x42, 0x0f, 0x00, 0x23, 0x48, 0x70, 0xb5, 0x80, 0x78, 0x9c, 0xb0, 0x01, 0x28, 0x3e, 0xd1, 0x20, 0x4c, 0x09, 0xa8, 0x3c, 0x00, 0x54, 0xe7, 0x00, 0x00, 0x80, 0x3c, 0x61, 0x1c, 0xfe, 0xf7, 0x92, 0xfe, 0x04, 0x20, 0x11, 0xad, 0x68, 0x72, 0xa0, 0x6f, 0x19, 0xa9, 0x18, 0x90, 0x7c, 0x20, 0x00, 0x5d, 0x01, 0x26, 0x08, 0x71, 0x1d, 0x20, 0x00, 0x5d, 0x00, 0x28, 0x06, 0xd0, 0x10, 0x96, 0x12, 0x96, 0xfc, 0xf7, 0xf6, 0xfa, 0x28, 0x72, 0x20, 0x7a, 0x11, 0x90, 0xf3, 0xf7, 0xcd, 0xff, 0x6a, 0x21, 0x08, 0x53, 0x40, 0x34, 0x3c, 0x00, 0x90, 0xe7, 0x00, 0x00, 0x00, 0x22, 0x01, 0xa9, 0x06, 0xa8, 0xf6, 0xf7, 0xcd, 0xff, 0x21, 0x1c, 0x00, 0x20, 0xfb, 0xf7, 0xcb, 0xfb, 0x06, 0xa9, 0xfb, 0xf7, 0xc8, 0xfb, 0x01, 0xa9, 0xfb, 0xf7, 0xc5, 0xfb, 0x0a, 0x49, 0x09, 0x68, 0x00, 0x29, 0x07, 0xd0, 0x33, 0x1c, 0x0a, 0x22, 0x69, 0x46, 0xfb, 0xf7, 0xda, 0xfb, 0x00, 0x9a, 0x07, 0x21, 0x91, 0x70, 0x0c, 0x90, 0x09, 0xa8, 0xfe, 0xf7, 0x3c, 0x00, 0xcc, 0xe7, 0x00, 0x00, 0x7b, 0xfe, 0x1c, 0xb0, 0x70, 0xbd, 0x00, 0x00, 0x84, 0x66, 0x01, 0x00, 0xe4, 0x62, 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0xff, 0x22, 0x01, 0x68, 0x12, 0x02, 0x0e, 0x1c, 0x08, 0x7b, 0x49, 0x7b, 0x09, 0x02, 0x11, 0x40, 0x08, 0x43, 0x05, 0x1c, 0x31, 0x1c, 0x06, 0x22, 0xa0, 0x18, 0xf1, 0xf7, 0x7c, 0xfe, 0x06, 0x22, 0xb1, 0x18, 0x20, 0x1c, 0xf1, 0xf7, 0x3c, 0x00, 0x08, 0xe8, 0x00, 0x00, 0x77, 0xfe, 0x28, 0x0a, 0x29, 0x02, 0x08, 0x43, 0x00, 0x04, 0x03, 0x21, 0x49, 0x02, 0x00, 0x0c, 0x88, 0x42, 0x08, 0xd2, 0xe0, 0x68, 0x01, 0x89, 0x0e, 0x39, 0x01, 0x81, 0xe0, 0x68, 0x01, 0x68, 0x0e, 0x31, 0x01, 0x60, 0xf8, 0xbd, 0x00, 0x26, 0x20, 0x1c, 0x10, 0x30, 0x03, 0xf0, 0xe8, 0xfa, 0x21, 0x8b, 0x00, 0x29, 0x05, 0xd1, 0xe1, 0x7d, 0x00, 0x29, 0x0b, 0xd0, 0x3c, 0x00, 0x44, 0xe8, 0x00, 0x00, 0x80, 0x69, 0x80, 0x07, 0x08, 0xd4, 0xe0, 0x68, 0x01, 0x26, 0x01, 0x89, 0x02, 0x39, 0x01, 0x81, 0xe0, 0x68, 0x01, 0x68, 0x02, 0x31, 0x06, 0xe0, 0xe0, 0x68, 0x01, 0x89, 0x06, 0x39, 0x01, 0x81, 0xe0, 0x68, 0x01, 0x68, 0x06, 0x31, 0x01, 0x60, 0x14, 0x49, 0x00, 0x20, 0x0b, 0x1f, 0x42, 0x00, 0x9a, 0x5a, 0xaa, 0x42, 0x02, 0xd1, 0x11, 0x49, 0x06, 0x31, 0x02, 0xe0, 0x3c, 0x00, 0x80, 0xe8, 0x00, 0x00, 0x01, 0x30, 0x02, 0x28, 0xf5, 0xd3, 0xe0, 0x68, 0x06, 0x22, 0x00, 0x68, 0xf1, 0xf7, 0x34, 0xfe, 0x01, 0x2e, 0xcb, 0xd1, 0x81, 0x20, 0x00, 0xab, 0x18, 0x80, 0xe1, 0x7d, 0x20, 0x8b, 0x49, 0x03, 0x08, 0x43, 0x31, 0x03, 0x08, 0x43, 0x00, 0x04, 0x00, 0x0c, 0x01, 0x0a, 0x00, 0x02, 0x08, 0x43, 0x58, 0x80, 0xe0, 0x68, 0x19, 0x88, 0x00, 0x68, 0xc1, 0x80, 0x59, 0x88, 0x3c, 0x00, 0xbc, 0xe8, 0x00, 0x00, 0x01, 0x81, 0xb5, 0xe7, 0x6a, 0x46, 0x01, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x01, 0x89, 0x06, 0x22, 0x08, 0x31, 0x01, 0x81, 0x04, 0x68, 0x04, 0x49, 0x08, 0x3c, 0x04, 0x60, 0x20, 0x1c, 0xf1, 0xf7, 0x0d, 0xfe, 0xe5, 0x80, 0xb0, 0xbd, 0x00, 0x00, 0x6a, 0x46, 0x01, 0x00, 0xf8, 0xb5, 0x00, 0x29, 0x01, 0xd0, 0x00, 0x28, 0x01, 0xd1, 0x00, 0x20, 0xf8, 0xbd, 0x09, 0x04, 0x3c, 0x00, 0xf8, 0xe8, 0x00, 0x00, 0x09, 0x0c, 0xf2, 0xf7, 0x43, 0xff, 0x06, 0x1c, 0x05, 0x1c, 0x00, 0x27, 0x20, 0xe0, 0x2c, 0x89, 0x29, 0x68, 0x02, 0x2c, 0x01, 0xd2, 0x02, 0x20, 0x01, 0xe0, 0x48, 0x78, 0x02, 0x30, 0x84, 0x42, 0x02, 0xdd, 0x24, 0x1a, 0x09, 0x18, 0xf4, 0xe7, 0x84, 0x42, 0x10, 0xd0, 0x01, 0x1b, 0x0a, 0x04, 0x01, 0x04, 0x09, 0x0c, 0x12, 0x0c, 0x28, 0x1c, 0xf2, 0xf7, 0x9e, 0xfe, 0x3c, 0x00, 0x34, 0xe9, 0x00, 0x00, 0x00, 0x28, 0x06, 0xd1, 0xe8, 0x68, 0xf2, 0xf7, 0x2d, 0xfe, 0xef, 0x60, 0x28, 0x89, 0x00, 0x1b, 0x28, 0x81, 0xed, 0x68, 0x00, 0x2d, 0xdc, 0xd1, 0x30, 0x1c, 0xd1, 0xe7, 0xf8, 0xb5, 0x85, 0x68, 0x04, 0x1c, 0x80, 0x69, 0x2e, 0x1c, 0x00, 0x28, 0x0d, 0xd0, 0x71, 0x68, 0xf2, 0xf7, 0xf6, 0xfd, 0xa0, 0x69, 0xf2, 0xf7, 0x17, 0xfe, 0x06, 0xe0, 0x00, 0x21, 0xc1, 0x60, 0x3c, 0x00, 0x70, 0xe9, 0x00, 0x00, 0xf1, 0x60, 0xa0, 0x8d, 0x36, 0x68, 0x01, 0x38, 0xa0, 0x85, 0xf0, 0x68, 0x00, 0x28, 0xf5, 0xd1, 0x30, 0x68, 0xa0, 0x60, 0xa0, 0x8d, 0x01, 0x38, 0x00, 0x04, 0x00, 0x0c, 0xa0, 0x85, 0x02, 0xd0, 0x20, 0x1c, 0xf9, 0xf7, 0x39, 0xf8, 0x2a, 0x4f, 0x2a, 0x48, 0x00, 0x68, 0x00, 0x28, 0x03, 0xd0, 0x06, 0x21, 0x68, 0x68, 0xfa, 0xf7, 0x7c, 0xfd, 0x68, 0x68, 0x00, 0x68, 0x3c, 0x00, 0xac, 0xe9, 0x00, 0x00, 0x81, 0x78, 0x00, 0x29, 0x2b, 0xd1, 0xc1, 0x78, 0x00, 0x29, 0x30, 0xd1, 0x21, 0x8e, 0x01, 0x39, 0x21, 0x86, 0xfb, 0xf7, 0x15, 0xf8, 0xa1, 0x6a, 0x08, 0x1a, 0xa0, 0x62, 0xe1, 0x69, 0x88, 0x42, 0x03, 0xd9, 0x04, 0x21, 0x02, 0x20, 0xf2, 0xf7, 0x67, 0xfc, 0xb8, 0x68, 0x00, 0x28, 0x1e, 0xd0, 0x1a, 0x49, 0x20, 0x8e, 0x49, 0x68, 0x0c, 0x22, 0x52, 0x1a, 0x90, 0x42, 0x3c, 0x00, 0xe8, 0xe9, 0x00, 0x00, 0x08, 0xd3, 0x19, 0x23, 0x9b, 0x01, 0xaf, 0x22, 0x92, 0x01, 0x59, 0x43, 0xa0, 0x6a, 0x51, 0x1a, 0x88, 0x42, 0x0e, 0xd2, 0x00, 0x21, 0x0c, 0x20, 0x03, 0xf0, 0xac, 0xfc, 0x00, 0x20, 0xb8, 0x60, 0x07, 0xe0, 0x01, 0x29, 0x05, 0xd1, 0xc0, 0x78, 0x17, 0x28, 0x02, 0xd1, 0xa0, 0x8e, 0x01, 0x38, 0xa0, 0x86, 0x2a, 0x1d, 0x06, 0xca, 0xe0, 0x68, 0x63, 0x69, 0xf1, 0xf7, 0x3c, 0x00, 0x24, 0xea, 0x00, 0x00, 0xdc, 0xfc, 0xb5, 0x42, 0x01, 0xd0, 0x2d, 0x68, 0xb4, 0xe7, 0xa0, 0x8d, 0x00, 0x28, 0x03, 0xd1, 0x05, 0x48, 0xb9, 0x69, 0x00, 0xf0, 0x9e, 0xfc, 0xf8, 0xbd, 0x00, 0x00, 0xfc, 0x5a, 0x01, 0x00, 0xcc, 0x5c, 0x01, 0x00, 0x18, 0x57, 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, 0x89, 0x07, 0x07, 0x4b, 0xca, 0x0f, 0x80, 0xb5, 0x19, 0x7c, 0x00, 0x29, 0x06, 0xd0, 0x81, 0x43, 0x3c, 0x00, 0x60, 0xea, 0x00, 0x00, 0x19, 0x74, 0x03, 0xd1, 0x07, 0x21, 0x15, 0x20, 0x04, 0xf0, 0xa2, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x1c, 0x01, 0x20, 0xff, 0xf7, 0xe9, 0xff, 0x80, 0xbd, 0x80, 0xb5, 0x01, 0x1c, 0x02, 0x20, 0xff, 0xf7, 0xe3, 0xff, 0x80, 0xbd, 0xb0, 0xb5, 0x1b, 0x4c, 0x60, 0x68, 0xfc, 0xf7, 0x2f, 0xff, 0x20, 0x68, 0x00, 0x25, 0x40, 0x68, 0x3c, 0x00, 0x9c, 0xea, 0x00, 0x00, 0x00, 0x28, 0x03, 0xd0, 0xfd, 0xf7, 0x18, 0xfc, 0x20, 0x68, 0x45, 0x60, 0x60, 0x68, 0xfc, 0xf7, 0xc5, 0xfe, 0x14, 0x48, 0x61, 0x68, 0x00, 0xf0, 0x61, 0xfc, 0xa0, 0x7a, 0x01, 0x28, 0x05, 0xd0, 0x02, 0x28, 0x03, 0xd0, 0x20, 0x68, 0x00, 0x68, 0x00, 0xf0, 0xde, 0xf8, 0x01, 0x21, 0x1f, 0x20, 0x04, 0xf0, 0xb2, 0xfd, 0x00, 0x21, 0x1f, 0x20, 0x04, 0xf0, 0xae, 0xfd, 0x3c, 0x00, 0xd8, 0xea, 0x00, 0x00, 0x02, 0x21, 0x1f, 0x20, 0x04, 0xf0, 0xaa, 0xfd, 0xa5, 0x72, 0x21, 0x68, 0x2c, 0x20, 0x40, 0x5c, 0x89, 0x68, 0xf1, 0xf7, 0x76, 0xfc, 0x60, 0x68, 0xfc, 0xf7, 0xe4, 0xfe, 0x20, 0x68, 0x05, 0x62, 0xb0, 0xbd, 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x04, 0x49, 0x0a, 0x68, 0xc8, 0x68, 0x92, 0x6a, 0x00, 0x2a, 0x01, 0xd0, 0x09, 0x69, 0x08, 0x18, 0x3c, 0x00, 0x14, 0xeb, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, 0xb0, 0xb5, 0x13, 0x4c, 0x05, 0x1c, 0xa0, 0x7a, 0x01, 0x38, 0x02, 0x28, 0x19, 0xd8, 0x01, 0x21, 0x1f, 0x20, 0x04, 0xf0, 0x81, 0xfd, 0x20, 0x68, 0xfc, 0x23, 0x01, 0x1c, 0x20, 0x30, 0x02, 0x7b, 0x1a, 0x40, 0x02, 0x73, 0x00, 0x2d, 0x0f, 0xd0, 0x01, 0x23, 0x1a, 0x43, 0x02, 0x73, 0xa0, 0x7a, 0x03, 0x28, 0x07, 0xd1, 0x3c, 0x00, 0x50, 0xeb, 0x00, 0x00, 0x01, 0x20, 0x01, 0xf0, 0xe7, 0xfd, 0x00, 0x28, 0x01, 0xd1, 0xff, 0xf7, 0x97, 0xff, 0xb0, 0xbd, 0x4b, 0x62, 0xb0, 0xbd, 0x02, 0x21, 0x11, 0x43, 0x01, 0x73, 0xf6, 0xe7, 0x14, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x0a, 0x30, 0xf6, 0xf7, 0x43, 0xfe, 0x00, 0x28, 0x0c, 0xd0, 0x22, 0x88, 0x0a, 0x49, 0x0b, 0x7a, 0x90, 0x04, 0xc0, 0x0f, 0x00, 0x2b, 0x06, 0xd1, 0x3c, 0x00, 0x8c, 0xeb, 0x00, 0x00, 0x12, 0x06, 0x92, 0x0e, 0x20, 0x2a, 0x00, 0xd1, 0x01, 0x20, 0xc8, 0x60, 0x10, 0xbd, 0x00, 0x28, 0xfc, 0xd1, 0x00, 0x22, 0x24, 0x21, 0x80, 0x20, 0x04, 0xf0, 0x04, 0xfe, 0x10, 0xbd, 0x00, 0x00, 0x04, 0x7a, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x1c, 0x1f, 0x21, 0x80, 0x20, 0x04, 0xf0, 0xfa, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x1d, 0x4e, 0x04, 0x1c, 0x30, 0x68, 0x3c, 0x00, 0xc8, 0xeb, 0x00, 0x00, 0x1d, 0x1c, 0x47, 0x68, 0x20, 0x1c, 0xf1, 0xf7, 0x0a, 0xfc, 0xfb, 0xf7, 0x87, 0xfa, 0x00, 0x28, 0x04, 0xd0, 0x28, 0x1c, 0xf2, 0xf7, 0x2a, 0xfb, 0x00, 0x28, 0x28, 0xd1, 0x20, 0x88, 0x40, 0x05, 0x25, 0xd4, 0x30, 0x68, 0x00, 0x68, 0xfe, 0xf7, 0x59, 0xf9, 0x00, 0x28, 0x03, 0xd1, 0xfd, 0xf7, 0x89, 0xfa, 0xf1, 0xf7, 0xed, 0xfb, 0x30, 0x68, 0x00, 0x25, 0x40, 0x68, 0x3c, 0x00, 0x04, 0xec, 0x00, 0x00, 0x00, 0x28, 0x03, 0xd0, 0xfd, 0xf7, 0x64, 0xfb, 0x30, 0x68, 0x45, 0x60, 0x20, 0x88, 0x00, 0x09, 0x00, 0x07, 0x03, 0xd1, 0x04, 0xf0, 0xc8, 0xf8, 0x61, 0x88, 0x45, 0x18, 0x30, 0x68, 0x45, 0x61, 0x81, 0x6a, 0x01, 0x31, 0x81, 0x62, 0x20, 0x88, 0x80, 0x04, 0xc1, 0x0f, 0x02, 0x48, 0xf8, 0xf7, 0xcd, 0xff, 0xf8, 0xbd, 0x14, 0x7a, 0x01, 0x00, 0xb1, 0xeb, 0x00, 0x00, 0x3c, 0x00, 0x40, 0xec, 0x00, 0x00, 0xb0, 0xb5, 0x0e, 0x4c, 0x05, 0x1c, 0x60, 0x68, 0xfc, 0xf7, 0xf6, 0xfd, 0x0c, 0x48, 0x61, 0x68, 0x00, 0xf0, 0x92, 0xfb, 0x00, 0x21, 0x24, 0x20, 0x04, 0xf0, 0xec, 0xfc, 0x00, 0x22, 0xd2, 0x43, 0x80, 0x21, 0x24, 0x20, 0x04, 0xf0, 0xb8, 0xfc, 0x00, 0x20, 0xe0, 0x60, 0x20, 0x72, 0x20, 0x68, 0x01, 0x68, 0x28, 0x06, 0x00, 0x0e, 0xf1, 0xf7, 0xb0, 0xfb, 0xb0, 0xbd, 0x3c, 0x00, 0x7c, 0xec, 0x00, 0x00, 0x04, 0x7a, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0xf2, 0xf7, 0x85, 0xfc, 0x20, 0x1c, 0xf2, 0xf7, 0xb0, 0xfd, 0x10, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x1c, 0x4e, 0x05, 0x1c, 0xb0, 0x7a, 0x2c, 0x1c, 0x40, 0x34, 0x02, 0x28, 0x26, 0xd1, 0xa0, 0x8b, 0x31, 0x89, 0x88, 0x42, 0x22, 0xd1, 0x30, 0x68, 0x41, 0x6a, 0x00, 0x29, 0x08, 0xd0, 0x3c, 0x00, 0xb8, 0xec, 0x00, 0x00, 0x20, 0x30, 0x00, 0x7b, 0xc0, 0x07, 0x04, 0xd5, 0x01, 0x20, 0x01, 0xf0, 0x2f, 0xfd, 0x00, 0x28, 0x18, 0xd1, 0x60, 0x78, 0x00, 0x28, 0x09, 0xd1, 0x30, 0x68, 0x02, 0x23, 0x20, 0x30, 0x02, 0x7b, 0x0d, 0x49, 0x52, 0x08, 0x52, 0x00, 0x1a, 0x43, 0x02, 0x73, 0x01, 0xe0, 0xff, 0x21, 0xf5, 0x31, 0x01, 0x22, 0x1f, 0x20, 0x04, 0xf0, 0x6e, 0xfc, 0x03, 0x20, 0xb0, 0x72, 0x3c, 0x00, 0xf4, 0xec, 0x00, 0x00, 0x02, 0xe0, 0x28, 0x1c, 0xff, 0xf7, 0xc4, 0xff, 0x60, 0x78, 0x00, 0x28, 0x03, 0xd1, 0x29, 0x1c, 0x01, 0x20, 0x03, 0xf0, 0x29, 0xfb, 0x70, 0xbd, 0x14, 0x7a, 0x01, 0x00, 0x50, 0xc3, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x60, 0x34, 0xe0, 0x79, 0x0e, 0x4d, 0x00, 0x28, 0x0a, 0xd1, 0x02, 0x20, 0xa8, 0x72, 0x28, 0x68, 0x40, 0x68, 0x00, 0x28, 0x04, 0xd1, 0x0b, 0x48, 0x3c, 0x00, 0x30, 0xed, 0x00, 0x00, 0xfd, 0xf7, 0xd0, 0xfa, 0x29, 0x68, 0x48, 0x60, 0x04, 0xf0, 0x38, 0xf8, 0x29, 0x68, 0xc8, 0x61, 0xff, 0xf7, 0xe0, 0xfe, 0x29, 0x68, 0x09, 0x69, 0x08, 0x1a, 0x03, 0xf0, 0x6f, 0xff, 0x00, 0x28, 0x01, 0xd0, 0xe0, 0x79, 0xa0, 0x71, 0xb0, 0xbd, 0x14, 0x7a, 0x01, 0x00, 0xc1, 0xeb, 0x00, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0x00, 0x26, 0x04, 0xf0, 0x21, 0xf8, 0x05, 0x1c, 0x3c, 0x00, 0x6c, 0xed, 0x00, 0x00, 0x22, 0x48, 0x00, 0x27, 0x07, 0x70, 0xa1, 0x07, 0x04, 0xd0, 0xe1, 0x07, 0xc9, 0x0f, 0x01, 0x62, 0xc5, 0x61, 0x01, 0x26, 0x41, 0x6b, 0x00, 0x29, 0x34, 0xd1, 0x00, 0x2e, 0x32, 0xd0, 0x06, 0x1c, 0xf9, 0xf7, 0x44, 0xff, 0x31, 0x6b, 0x1a, 0x4b, 0x41, 0x1a, 0xa2, 0x07, 0x12, 0xd5, 0xda, 0x68, 0x00, 0x2a, 0x08, 0xdd, 0x91, 0x42, 0x1a, 0x68, 0x02, 0xda, 0x14, 0x09, 0x3c, 0x00, 0xa8, 0xed, 0x00, 0x00, 0xa2, 0x18, 0x06, 0xe0, 0x14, 0x09, 0x12, 0x1b, 0x03, 0xe0, 0x0a, 0x43, 0x02, 0xd1, 0x1a, 0x68, 0x52, 0x00, 0x1a, 0x60, 0xb7, 0x63, 0x0a, 0xe0, 0xb2, 0x6b, 0x01, 0x32, 0xb2, 0x63, 0x02, 0x2a, 0x1a, 0x68, 0x01, 0xdd, 0x94, 0x08, 0x00, 0xe0, 0x14, 0x09, 0x12, 0x1b, 0x1a, 0x60, 0xd9, 0x60, 0x30, 0x63, 0xf5, 0x62, 0x18, 0x68, 0x08, 0x49, 0x88, 0x42, 0x01, 0xd9, 0x3c, 0x00, 0xe4, 0xed, 0x00, 0x00, 0x19, 0x60, 0x03, 0xe0, 0x64, 0x28, 0x01, 0xd2, 0x64, 0x20, 0x18, 0x60, 0xf5, 0xf7, 0xfc, 0xfd, 0xf8, 0xbd, 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, 0xb0, 0x57, 0x01, 0x00, 0x20, 0xa1, 0x07, 0x00, 0xfe, 0xb5, 0x04, 0x1c, 0x00, 0x20, 0x50, 0x4d, 0x00, 0x21, 0x68, 0x61, 0x20, 0x69, 0xfb, 0xf7, 0xb3, 0xfc, 0x07, 0x1c, 0x20, 0x69, 0x03, 0x21, 0xfb, 0xf7, 0xae, 0xfc, 0x3c, 0x00, 0x20, 0xee, 0x00, 0x00, 0x00, 0x28, 0x03, 0xd0, 0x80, 0x78, 0x29, 0x78, 0x88, 0x42, 0x63, 0xd1, 0x47, 0x4d, 0x20, 0x1c, 0x14, 0x30, 0x39, 0x1c, 0x06, 0x1c, 0x2a, 0x78, 0x02, 0xf0, 0x5a, 0xfa, 0x00, 0x28, 0x59, 0xd1, 0xe0, 0x68, 0x05, 0x68, 0x41, 0x48, 0x01, 0x95, 0x58, 0x30, 0x02, 0x90, 0xfb, 0xf7, 0x6a, 0xff, 0x3e, 0x4d, 0x19, 0x35, 0x00, 0x28, 0x0b, 0xd0, 0x28, 0x1c, 0xfb, 0xf7, 0x3c, 0x00, 0x5c, 0xee, 0x00, 0x00, 0x55, 0xff, 0x00, 0x28, 0x1e, 0xd1, 0x31, 0x1c, 0x28, 0x1c, 0xfb, 0xf7, 0x65, 0xff, 0x00, 0x28, 0x42, 0xd0, 0x17, 0xe0, 0x28, 0x1c, 0xfb, 0xf7, 0x49, 0xff, 0x00, 0x28, 0x06, 0xd0, 0x39, 0x1c, 0x02, 0x98, 0xfb, 0xf7, 0x63, 0xff, 0x00, 0x28, 0x36, 0xd0, 0x0b, 0xe0, 0x39, 0x1c, 0x02, 0x98, 0xfb, 0xf7, 0x5c, 0xff, 0x00, 0x28, 0x2f, 0xd0, 0x31, 0x1c, 0x28, 0x1c, 0x3c, 0x00, 0x98, 0xee, 0x00, 0x00, 0xfb, 0xf7, 0x4c, 0xff, 0x00, 0x28, 0x29, 0xd0, 0x30, 0x1c, 0xf6, 0xf7, 0xad, 0xfc, 0x29, 0x4a, 0x18, 0x32, 0x11, 0x7c, 0x00, 0x29, 0x04, 0xd0, 0x51, 0x6a, 0x00, 0x29, 0x01, 0xd0, 0x00, 0x28, 0x1c, 0xd1, 0x90, 0x6a, 0x00, 0x28, 0x3b, 0xd0, 0x13, 0x78, 0x01, 0x9d, 0x01, 0x21, 0x6d, 0x89, 0x01, 0x20, 0x2b, 0x40, 0x9b, 0x07, 0x11, 0xd0, 0xa3, 0x6b, 0x1e, 0x4e, 0x3c, 0x00, 0xd4, 0xee, 0x00, 0x00, 0x1d, 0x1c, 0x7f, 0x35, 0x98, 0x36, 0x00, 0x2d, 0x14, 0xd0, 0x55, 0x8a, 0x00, 0x2d, 0x08, 0xd1, 0x55, 0x69, 0xab, 0x42, 0x0f, 0xda, 0x00, 0x20, 0x17, 0x4d, 0x01, 0x23, 0x6b, 0x61, 0x0a, 0xe0, 0x29, 0xe0, 0xf5, 0x78, 0x02, 0x2d, 0x06, 0xd1, 0x14, 0x4f, 0x55, 0x69, 0x3f, 0x68, 0xed, 0x19, 0xab, 0x42, 0x00, 0xda, 0x00, 0x20, 0x23, 0x6c, 0x1d, 0x1c, 0x7f, 0x35, 0x3c, 0x00, 0x10, 0xef, 0x00, 0x00, 0x10, 0xd0, 0x55, 0x8a, 0x00, 0x2d, 0x03, 0xd1, 0x95, 0x69, 0xab, 0x42, 0x0a, 0xd2, 0x08, 0xe0, 0xf5, 0x78, 0x02, 0x2d, 0x06, 0xd1, 0x0b, 0x4e, 0x95, 0x69, 0x36, 0x68, 0xad, 0x19, 0xab, 0x42, 0x00, 0xd2, 0x00, 0x21, 0x08, 0x43, 0x08, 0xd0, 0x10, 0x6a, 0x00, 0x28, 0x01, 0xd0, 0xf1, 0xf7, 0x4b, 0xfa, 0x00, 0x21, 0x20, 0x1c, 0x01, 0xf0, 0xb9, 0xf9, 0xfe, 0xbd, 0x3c, 0x00, 0x4c, 0xef, 0x00, 0x00, 0xec, 0x65, 0x01, 0x00, 0xc4, 0x67, 0x01, 0x00, 0xcc, 0x67, 0x01, 0x00, 0x3e, 0xb5, 0x05, 0x6a, 0x04, 0x1c, 0xc0, 0x68, 0xf2, 0xf7, 0x34, 0xfb, 0xe1, 0x69, 0xf2, 0xf7, 0x57, 0xfa, 0x20, 0x1c, 0x40, 0x30, 0xc1, 0x8b, 0x04, 0x31, 0xc1, 0x83, 0x2b, 0x69, 0x10, 0x49, 0x98, 0x79, 0x06, 0x28, 0x0a, 0xd1, 0x98, 0x88, 0x01, 0x91, 0x02, 0x94, 0x00, 0x90, 0x60, 0x69, 0x3c, 0x00, 0x88, 0xef, 0x00, 0x00, 0x1b, 0x68, 0x01, 0x68, 0xe0, 0x68, 0x03, 0x22, 0xc0, 0x68, 0x0a, 0xe0, 0x02, 0x28, 0x0b, 0xd1, 0x10, 0x20, 0x00, 0x90, 0x01, 0x91, 0x02, 0x94, 0xe0, 0x68, 0xa3, 0x69, 0xc0, 0x68, 0x00, 0x22, 0x00, 0x21, 0xf7, 0xf7, 0x0f, 0xfb, 0x3e, 0xbd, 0xf2, 0xf7, 0xa6, 0xf9, 0xfb, 0xe7, 0x00, 0x00, 0xbd, 0xef, 0x00, 0x00, 0x80, 0xb5, 0xd1, 0x68, 0x50, 0x69, 0xc9, 0x68, 0x3c, 0x00, 0xc4, 0xef, 0x00, 0x00, 0xc1, 0x60, 0xd1, 0x68, 0xc8, 0x60, 0x11, 0x1c, 0x40, 0x31, 0xcb, 0x8b, 0x00, 0x89, 0x18, 0x18, 0xc8, 0x83, 0x10, 0x68, 0x00, 0x28, 0x02, 0xd0, 0xff, 0xf7, 0xbc, 0xff, 0x80, 0xbd, 0x03, 0x48, 0xfb, 0xf7, 0xcc, 0xf8, 0x00, 0x6a, 0xfe, 0xf7, 0xf5, 0xf9, 0x80, 0xbd, 0xa0, 0x6a, 0x01, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x0a, 0x24, 0x30, 0x07, 0x01, 0x09, 0xa0, 0x07, 0x3c, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x43, 0x0f, 0x1c, 0x0a, 0x4d, 0x2f, 0x60, 0x04, 0xf0, 0xfa, 0xfe, 0xad, 0x68, 0x28, 0x01, 0x00, 0x0f, 0xb0, 0x42, 0x05, 0xd0, 0x01, 0x3c, 0xf4, 0xd2, 0x01, 0x21, 0x9b, 0x20, 0xf2, 0xf7, 0x41, 0xf9, 0x28, 0x02, 0x00, 0x0a, 0x08, 0x2e, 0x01, 0xd1, 0x31, 0x05, 0x08, 0x43, 0xf8, 0xbd, 0x60, 0x00, 0x07, 0x00, 0x01, 0x22, 0xd2, 0x05, 0x80, 0xb5, 0x00, 0x21, 0x3c, 0x00, 0x3c, 0xf0, 0x00, 0x00, 0x04, 0x20, 0x04, 0xf0, 0xdd, 0xfc, 0x0f, 0x20, 0xff, 0xf7, 0xd6, 0xff, 0x0f, 0x21, 0x09, 0x04, 0x08, 0x40, 0x00, 0x0c, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x05, 0x48, 0xfd, 0xf7, 0x4a, 0xf9, 0x04, 0x48, 0xfd, 0xf7, 0x7b, 0xf8, 0x04, 0x48, 0xfd, 0xf7, 0x6c, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x89, 0x34, 0x01, 0x00, 0xed, 0x24, 0x00, 0x00, 0x11, 0x1c, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xf0, 0x00, 0x00, 0x80, 0xb5, 0x02, 0x48, 0xf3, 0xf7, 0x2a, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0xd1, 0x24, 0x00, 0x00, 0x80, 0xb5, 0xf2, 0xf7, 0x53, 0xf9, 0x80, 0xbd, 0x80, 0xb5, 0x00, 0x21, 0x00, 0x20, 0x01, 0xf0, 0x51, 0xfe, 0x03, 0x20, 0x02, 0xf0, 0x46, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x06, 0x48, 0x80, 0xb5, 0xc1, 0x69, 0x00, 0x29, 0x06, 0xd1, 0x01, 0x6a, 0x00, 0x29, 0x03, 0xd1, 0x3c, 0x00, 0xb4, 0xf0, 0x00, 0x00, 0x81, 0x6b, 0x03, 0x48, 0x00, 0xf0, 0x5e, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x4c, 0x20, 0x6a, 0xfc, 0xf7, 0xb3, 0xfb, 0x03, 0x48, 0x21, 0x6a, 0x00, 0xf0, 0x4f, 0xf9, 0x10, 0xbd, 0x1c, 0x75, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0xb0, 0xb5, 0x0d, 0x4c, 0x20, 0x7c, 0x00, 0x28, 0x02, 0xd0, 0x01, 0x21, 0x3c, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xfd, 0xf7, 0x86, 0xf9, 0x00, 0x25, 0x25, 0x70, 0xa0, 0x68, 0x01, 0x28, 0x03, 0xd1, 0x00, 0x20, 0xa5, 0x60, 0x01, 0xf0, 0x8f, 0xf8, 0xa0, 0x78, 0x01, 0x28, 0x05, 0xd1, 0x03, 0x48, 0x98, 0x38, 0x00, 0x69, 0xfc, 0xf7, 0xef, 0xfb, 0xa5, 0x70, 0xb0, 0xbd, 0x00, 0x00, 0x84, 0x66, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x21, 0x01, 0x20, 0x01, 0xf0, 0x09, 0xfe, 0x80, 0xbd, 0x3c, 0x00, 0x2c, 0xf1, 0x00, 0x00, 0x38, 0xb5, 0x69, 0x46, 0x00, 0x25, 0xf8, 0xf7, 0xb7, 0xfe, 0x04, 0x1c, 0x01, 0xd1, 0x01, 0x20, 0x38, 0xbd, 0xa0, 0x68, 0x00, 0x28, 0x04, 0xd0, 0x00, 0x99, 0xa1, 0x31, 0x08, 0x20, 0x04, 0xf0, 0x73, 0xfa, 0x1c, 0x21, 0x20, 0x1c, 0xf1, 0xf7, 0xa3, 0xf9, 0x28, 0x1c, 0xf0, 0xe7, 0x00, 0x00, 0xfe, 0xb5, 0x07, 0x1c, 0x4c, 0x23, 0x39, 0x49, 0x58, 0x43, 0x44, 0x18, 0x3c, 0x00, 0x68, 0xf1, 0x00, 0x00, 0x25, 0x1c, 0x40, 0x35, 0x28, 0x7a, 0x37, 0x49, 0x48, 0x76, 0x21, 0x1c, 0x30, 0x31, 0x02, 0x91, 0x0c, 0x23, 0xc8, 0x56, 0x42, 0x1c, 0x0a, 0x73, 0x49, 0x7b, 0x88, 0x42, 0x46, 0xda, 0x32, 0x48, 0x00, 0x78, 0x80, 0x07, 0x3e, 0xd5, 0x00, 0x20, 0x01, 0x90, 0xf6, 0xf7, 0xaf, 0xfa, 0x00, 0x28, 0x2e, 0xd0, 0xac, 0x21, 0x09, 0x58, 0x00, 0x29, 0x01, 0xd0, 0xe4, 0x30, 0x3c, 0x00, 0xa4, 0xf1, 0x00, 0x00, 0x00, 0xe0, 0xcc, 0x30, 0x06, 0x1c, 0x40, 0x68, 0x00, 0x28, 0x25, 0xd0, 0x02, 0x99, 0x08, 0x7b, 0x01, 0x28, 0x11, 0xd1, 0x20, 0x1c, 0x2e, 0x30, 0x29, 0x78, 0xf6, 0xf7, 0xed, 0xf9, 0x71, 0x68, 0x03, 0xe0, 0x72, 0x18, 0x12, 0x7a, 0x82, 0x42, 0x03, 0xd9, 0xff, 0x31, 0x09, 0x06, 0x09, 0x0e, 0xf7, 0xd1, 0xa9, 0x70, 0x01, 0x20, 0x01, 0x90, 0x23, 0x1c, 0x3e, 0x33, 0x3c, 0x00, 0xe0, 0xf1, 0x00, 0x00, 0x1a, 0x1d, 0x30, 0x1c, 0x00, 0x97, 0x01, 0x99, 0xf8, 0xf7, 0x58, 0xfa, 0x00, 0x28, 0x11, 0xd0, 0xa8, 0x78, 0x80, 0x19, 0x00, 0x7a, 0x00, 0xe0, 0x00, 0x20, 0x68, 0x70, 0x68, 0x78, 0x01, 0x21, 0xfb, 0xf7, 0xe0, 0xfd, 0x60, 0x60, 0x38, 0x1c, 0x01, 0xf0, 0x14, 0xfe, 0x38, 0x1c, 0x01, 0xf0, 0xa5, 0xfb, 0xfe, 0xbd, 0x02, 0x99, 0x08, 0x7b, 0xff, 0x30, 0x48, 0x73, 0x3c, 0x00, 0x1c, 0xf2, 0x00, 0x00, 0x38, 0x1c, 0xfc, 0xf7, 0x19, 0xfc, 0x03, 0xf0, 0xc3, 0xfd, 0x06, 0x1c, 0xfb, 0xf7, 0x8e, 0xfe, 0x41, 0x00, 0x76, 0x18, 0x68, 0x78, 0x61, 0x68, 0xfb, 0xf7, 0x6a, 0xfe, 0x31, 0x18, 0x20, 0x8d, 0x3b, 0x1c, 0x05, 0x4a, 0x03, 0xf0, 0x12, 0xfe, 0xe5, 0xe7, 0x00, 0x00, 0x58, 0xe3, 0x01, 0x00, 0x30, 0x80, 0x07, 0x00, 0x1d, 0x75, 0x01, 0x00, 0xd5, 0x4e, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xf2, 0x00, 0x00, 0x03, 0x1c, 0x04, 0x48, 0x80, 0xb5, 0x02, 0x79, 0x20, 0x30, 0x03, 0x49, 0x00, 0xf0, 0x30, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0xac, 0x7c, 0x01, 0x00, 0xc4, 0x67, 0x01, 0x00, 0x03, 0x1c, 0x04, 0x48, 0x80, 0xb5, 0xc2, 0x78, 0x38, 0x30, 0x03, 0x49, 0x00, 0xf0, 0x22, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0xac, 0x7c, 0x01, 0x00, 0xc8, 0x67, 0x01, 0x00, 0x03, 0x1c, 0x04, 0x48, 0x3c, 0x00, 0x94, 0xf2, 0x00, 0x00, 0x80, 0xb5, 0x82, 0x79, 0x50, 0x30, 0x03, 0x49, 0x00, 0xf0, 0x14, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0xac, 0x7c, 0x01, 0x00, 0xcc, 0x67, 0x01, 0x00, 0x03, 0x1c, 0x04, 0x48, 0x80, 0xb5, 0x42, 0x79, 0x68, 0x30, 0x03, 0x49, 0x00, 0xf0, 0x06, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0xac, 0x7c, 0x01, 0x00, 0xd0, 0x67, 0x01, 0x00, 0x10, 0xb5, 0x00, 0x24, 0x84, 0x80, 0x0b, 0x60, 0x3c, 0x00, 0xd0, 0xf2, 0x00, 0x00, 0x19, 0x1c, 0x51, 0x43, 0x01, 0x60, 0x19, 0x06, 0x09, 0x16, 0x10, 0x22, 0x06, 0x30, 0xf1, 0xf7, 0x9f, 0xf9, 0x10, 0xbd, 0xb0, 0xb5, 0x06, 0x4d, 0x00, 0x24, 0xac, 0x60, 0xec, 0x60, 0xec, 0x61, 0x2c, 0x62, 0x02, 0xf0, 0xf1, 0xfc, 0x00, 0xf0, 0x0d, 0xf8, 0xec, 0x62, 0x2c, 0x70, 0xb0, 0xbd, 0x44, 0x7d, 0x01, 0x00, 0x80, 0xb5, 0x80, 0x21, 0x01, 0x48, 0xf1, 0xf7, 0x3c, 0x00, 0x0c, 0xf3, 0x00, 0x00, 0xc7, 0xf8, 0x80, 0xbd, 0x04, 0x66, 0x01, 0x00, 0xf8, 0xb5, 0x07, 0x4f, 0x00, 0x24, 0x00, 0x26, 0x18, 0x20, 0x60, 0x43, 0xc5, 0x19, 0xee, 0x60, 0x03, 0xf0, 0x42, 0xfd, 0x10, 0x35, 0x01, 0x34, 0x02, 0x2c, 0x41, 0xc5, 0xf4, 0xdb, 0xf8, 0xbd, 0xb8, 0x7d, 0x01, 0x00, 0x00, 0x23, 0x03, 0x60, 0x04, 0x4b, 0x00, 0x29, 0x00, 0xd1, 0x19, 0x1c, 0x41, 0x60, 0x00, 0x2a, 0x3c, 0x00, 0x48, 0xf3, 0x00, 0x00, 0x00, 0xd1, 0x1a, 0x1c, 0x82, 0x60, 0x70, 0x47, 0xbd, 0x75, 0x00, 0x00, 0x10, 0xb5, 0x07, 0x4c, 0x20, 0x68, 0x01, 0x30, 0x20, 0x60, 0x20, 0x28, 0x03, 0xd9, 0x58, 0x21, 0x58, 0x20, 0xf1, 0xf7, 0x9d, 0xff, 0x21, 0x68, 0x01, 0x20, 0x01, 0x39, 0x88, 0x40, 0x10, 0xbd, 0x60, 0x5b, 0x01, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x21, 0x68, 0x00, 0x20, 0x00, 0x29, 0x3c, 0x00, 0x84, 0xf3, 0x00, 0x00, 0x0a, 0xd0, 0xa9, 0x43, 0x21, 0x60, 0x07, 0xd1, 0xa0, 0x68, 0xf1, 0xf7, 0x23, 0xf8, 0x00, 0x28, 0x02, 0xd1, 0x21, 0x68, 0x29, 0x43, 0x21, 0x60, 0xb0, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x21, 0x68, 0x00, 0x20, 0x29, 0x43, 0x21, 0x60, 0xa9, 0x42, 0x07, 0xd1, 0x60, 0x68, 0xf1, 0xf7, 0x10, 0xf8, 0x00, 0x28, 0x02, 0xd1, 0x21, 0x68, 0xa9, 0x43, 0x3c, 0x00, 0xc0, 0xf3, 0x00, 0x00, 0x21, 0x60, 0xb0, 0xbd, 0x1a, 0x4b, 0xb0, 0xb5, 0x9a, 0x6a, 0x00, 0x28, 0x0b, 0xd0, 0x00, 0x2a, 0x07, 0xdb, 0xb8, 0x24, 0x24, 0x58, 0x01, 0x3c, 0xa4, 0x1a, 0x00, 0x19, 0xb0, 0x30, 0x00, 0x7b, 0x02, 0xe0, 0x0e, 0x20, 0x00, 0xe0, 0x0d, 0x20, 0x5d, 0x6a, 0x12, 0x4c, 0x00, 0x2d, 0x01, 0xd0, 0x20, 0x78, 0x00, 0xe0, 0x20, 0x5c, 0xff, 0x24, 0xa8, 0x34, 0xc4, 0x40, 0x3c, 0x00, 0xfc, 0xf3, 0x00, 0x00, 0x9c, 0x60, 0xf5, 0x24, 0xc4, 0x40, 0x9c, 0x61, 0xfd, 0x24, 0xc4, 0x40, 0xdc, 0x61, 0xff, 0x24, 0x29, 0x34, 0xc4, 0x40, 0x5c, 0x61, 0xff, 0x24, 0x53, 0x34, 0xc4, 0x40, 0x00, 0x20, 0x0c, 0x33, 0x11, 0xc3, 0x00, 0x29, 0x05, 0xd0, 0x00, 0x2a, 0x03, 0xdc, 0x02, 0x21, 0x50, 0x42, 0x00, 0xf0, 0x65, 0xfb, 0xb0, 0xbd, 0xac, 0x7e, 0x01, 0x00, 0xb8, 0x52, 0x01, 0x00, 0x3c, 0x00, 0x38, 0xf4, 0x00, 0x00, 0x10, 0xb5, 0x13, 0x4c, 0x13, 0x48, 0x21, 0x1c, 0xff, 0x31, 0x69, 0x31, 0x0e, 0xc9, 0x0e, 0xc0, 0x21, 0x1c, 0xff, 0x31, 0x24, 0x22, 0x75, 0x31, 0x0f, 0x48, 0xf1, 0xf7, 0x51, 0xf8, 0x21, 0x1c, 0xff, 0x31, 0x3c, 0x22, 0x99, 0x31, 0x0d, 0x48, 0xf1, 0xf7, 0xa6, 0xf8, 0xfc, 0xf7, 0xa2, 0xff, 0x21, 0x1c, 0xff, 0x31, 0x10, 0x22, 0xd5, 0x31, 0x09, 0x48, 0xf1, 0xf7, 0x3c, 0x00, 0x74, 0xf4, 0x00, 0x00, 0x41, 0xf8, 0x21, 0x1c, 0xff, 0x31, 0x28, 0x22, 0xe5, 0x31, 0x07, 0x48, 0xf1, 0xf7, 0x96, 0xf8, 0x10, 0xbd, 0x00, 0x00, 0x40, 0x63, 0x01, 0x00, 0x00, 0x80, 0x07, 0x00, 0x0c, 0x80, 0x07, 0x00, 0x30, 0x80, 0x07, 0x00, 0x80, 0x80, 0x07, 0x00, 0xa0, 0x80, 0x07, 0x00, 0xf8, 0xb5, 0x00, 0x28, 0x59, 0xd0, 0x04, 0xf0, 0x4b, 0xf9, 0xf8, 0xf7, 0xb3, 0xfb, 0x00, 0x22, 0x3c, 0x00, 0xb0, 0xf4, 0x00, 0x00, 0x01, 0x21, 0x13, 0x20, 0x04, 0xf0, 0x7c, 0xf9, 0x2a, 0x49, 0x29, 0x48, 0x49, 0x6c, 0x01, 0x60, 0x00, 0x21, 0x29, 0x48, 0xc9, 0x43, 0x41, 0x60, 0x26, 0x4c, 0x14, 0x34, 0x61, 0x6c, 0x81, 0x60, 0xa1, 0x6c, 0xc1, 0x60, 0x00, 0x20, 0x25, 0x4d, 0x02, 0x26, 0x01, 0x01, 0x6e, 0x50, 0x0a, 0x19, 0x4f, 0x19, 0x50, 0x32, 0x04, 0x37, 0x0e, 0xca, 0x01, 0x30, 0x08, 0x28, 0x3c, 0x00, 0xec, 0xf4, 0x00, 0x00, 0x0e, 0xc7, 0xf4, 0xdb, 0x14, 0x22, 0x21, 0x1c, 0xcc, 0x31, 0x1e, 0x48, 0xf1, 0xf7, 0x5a, 0xf8, 0x1d, 0x48, 0x81, 0x78, 0x09, 0x09, 0x09, 0x01, 0x81, 0x70, 0x00, 0x21, 0xc1, 0x70, 0x41, 0x70, 0x21, 0x1c, 0xe0, 0x31, 0x0a, 0x78, 0x02, 0x70, 0x49, 0x78, 0x41, 0x70, 0x21, 0x1c, 0xe8, 0x31, 0x30, 0x22, 0x08, 0x30, 0xf1, 0xf7, 0x46, 0xf8, 0x21, 0x1c, 0xff, 0x31, 0x3c, 0x00, 0x28, 0xf5, 0x00, 0x00, 0x50, 0x22, 0x19, 0x31, 0x12, 0x48, 0xf1, 0xf7, 0x3f, 0xf8, 0x83, 0x20, 0x80, 0x00, 0x14, 0x22, 0x21, 0x18, 0x10, 0x48, 0xf1, 0xf7, 0x38, 0xf8, 0x11, 0x20, 0x40, 0x01, 0x84, 0x22, 0x21, 0x18, 0x0d, 0x48, 0xf1, 0xf7, 0x31, 0xf8, 0xff, 0xf7, 0x73, 0xff, 0x20, 0x1c, 0xf1, 0xf7, 0x28, 0xfd, 0xf8, 0xbd, 0xff, 0xf7, 0x6d, 0xff, 0xfb, 0xe7, 0x08, 0x20, 0x07, 0x00, 0x3c, 0x00, 0x64, 0xf5, 0x00, 0x00, 0x2c, 0x63, 0x01, 0x00, 0x40, 0x20, 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, 0x00, 0x40, 0x07, 0x00, 0x00, 0x50, 0x07, 0x00, 0x00, 0x60, 0x07, 0x00, 0x10, 0x00, 0x07, 0x00, 0x00, 0x90, 0x07, 0x00, 0xf8, 0xb5, 0x05, 0x1c, 0x18, 0x48, 0xc0, 0x68, 0x00, 0x28, 0x25, 0xd0, 0x16, 0x4e, 0x01, 0x36, 0x74, 0x78, 0x30, 0x78, 0x27, 0x1a, 0x79, 0x19, 0x20, 0x1c, 0xf1, 0xf7, 0x3c, 0x00, 0xa0, 0xf5, 0x00, 0x00, 0x4b, 0xf8, 0x00, 0x90, 0x29, 0x1c, 0x20, 0x1c, 0xf1, 0xf7, 0xb2, 0xf8, 0xc1, 0x19, 0x20, 0x1c, 0xf1, 0xf7, 0x42, 0xf8, 0x60, 0x1a, 0x30, 0x70, 0x70, 0x1e, 0x80, 0x68, 0x00, 0x28, 0x0d, 0xd0, 0x53, 0x36, 0xf4, 0x78, 0x00, 0x99, 0x20, 0x1c, 0xf1, 0xf7, 0xa2, 0xf8, 0xb1, 0x78, 0x61, 0x1a, 0x41, 0x18, 0x20, 0x1c, 0xf1, 0xf7, 0x9c, 0xf8, 0x60, 0x1a, 0xb0, 0x70, 0x3c, 0x00, 0xdc, 0xf5, 0x00, 0x00, 0x03, 0x48, 0x5c, 0x30, 0x01, 0x69, 0xc2, 0x68, 0x69, 0x43, 0x51, 0x18, 0xc1, 0x60, 0xf8, 0xbd, 0x44, 0x7d, 0x01, 0x00, 0xb0, 0xb5, 0x0c, 0x4d, 0xe8, 0x68, 0x29, 0x69, 0x40, 0x18, 0x7d, 0x21, 0x09, 0x01, 0x44, 0x18, 0x20, 0x1c, 0x03, 0xf0, 0x0b, 0xfb, 0x00, 0x28, 0x0a, 0xd0, 0x03, 0xf0, 0xcf, 0xfb, 0x01, 0x1b, 0x28, 0x69, 0xf1, 0xf7, 0x7d, 0xf8, 0x01, 0x30, 0x3c, 0x00, 0x18, 0xf6, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0c, 0xff, 0xf7, 0xb2, 0xff, 0xb0, 0xbd, 0x00, 0x00, 0xa0, 0x7d, 0x01, 0x00, 0x70, 0xb5, 0x10, 0x4c, 0x60, 0x68, 0x80, 0x25, 0xa8, 0x43, 0x60, 0x60, 0x20, 0x68, 0x28, 0x43, 0x20, 0x60, 0x0d, 0x4e, 0x30, 0x1c, 0x10, 0x30, 0xf3, 0xf7, 0xc8, 0xfc, 0x00, 0x28, 0x03, 0xd1, 0x07, 0x21, 0x85, 0x20, 0xf1, 0xf7, 0x2a, 0xfe, 0x08, 0x48, 0x00, 0x21, 0x3c, 0x00, 0x54, 0xf6, 0x00, 0x00, 0x80, 0x68, 0x41, 0x63, 0xc0, 0x6c, 0x10, 0x30, 0x70, 0x61, 0x01, 0x20, 0x30, 0x61, 0x20, 0x68, 0xa8, 0x43, 0x20, 0x60, 0x70, 0xbd, 0x00, 0x00, 0xf4, 0x00, 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, 0x24, 0x7e, 0x01, 0x00, 0x01, 0x1c, 0x00, 0x20, 0x05, 0x29, 0x80, 0xb5, 0x09, 0xd2, 0x02, 0xa3, 0x5b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x3c, 0x00, 0x90, 0xf6, 0x00, 0x00, 0x03, 0x00, 0xff, 0xf7, 0xcf, 0xfc, 0x80, 0xbd, 0x01, 0x22, 0x92, 0x02, 0x80, 0xb5, 0x00, 0x21, 0x07, 0x20, 0x04, 0xf0, 0xab, 0xf9, 0x80, 0xbd, 0x80, 0xb5, 0x40, 0x22, 0x00, 0x21, 0x00, 0x20, 0x04, 0xf0, 0xa4, 0xf9, 0x03, 0x22, 0x00, 0x21, 0x00, 0x20, 0x04, 0xf0, 0x9f, 0xf9, 0x80, 0xbd, 0x70, 0xb5, 0x0e, 0x1c, 0x05, 0x1c, 0x14, 0x1c, 0x08, 0x28, 0x0e, 0xd1, 0x3c, 0x00, 0xcc, 0xf6, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xfc, 0x0e, 0x28, 0x01, 0xd1, 0x14, 0x20, 0x00, 0xe0, 0x10, 0x20, 0xe1, 0x03, 0x00, 0xd5, 0x01, 0x38, 0xc0, 0x06, 0x0a, 0x49, 0xc0, 0x0e, 0x88, 0x71, 0x08, 0xe0, 0x09, 0x2d, 0x06, 0xd1, 0xa0, 0x04, 0x01, 0xd5, 0x00, 0x20, 0x00, 0xe0, 0x01, 0x20, 0xf3, 0xf7, 0xb0, 0xf9, 0x34, 0x40, 0x21, 0x1c, 0x32, 0x1c, 0x28, 0x1c, 0x04, 0xf0, 0x7a, 0xf9, 0x3c, 0x00, 0x08, 0xf7, 0x00, 0x00, 0x70, 0xbd, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x70, 0xb5, 0x00, 0x24, 0x13, 0x29, 0x11, 0xd8, 0x00, 0x28, 0x01, 0xd1, 0x08, 0x4e, 0x08, 0x25, 0x01, 0x28, 0x01, 0xd1, 0x07, 0x4e, 0x09, 0x25, 0x00, 0xf0, 0x78, 0xfa, 0x00, 0x28, 0x05, 0xd0, 0x02, 0x1c, 0x31, 0x1c, 0x28, 0x1c, 0xff, 0xf7, 0xc3, 0xff, 0x01, 0x24, 0x20, 0x1c, 0x70, 0xbd, 0xf8, 0xff, 0x07, 0x00, 0x3c, 0x00, 0x44, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x01, 0x22, 0xd2, 0x02, 0x80, 0xb5, 0x00, 0x21, 0x07, 0x20, 0x04, 0xf0, 0x53, 0xf9, 0x80, 0xbd, 0x0f, 0x22, 0x12, 0x04, 0x07, 0x21, 0x49, 0x04, 0x80, 0xb5, 0x09, 0x20, 0x04, 0xf0, 0x4a, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x21, 0x04, 0x20, 0x04, 0xf0, 0x1b, 0xfc, 0x40, 0x21, 0x00, 0x20, 0x04, 0xf0, 0x17, 0xfc, 0x04, 0x49, 0x3c, 0x00, 0x80, 0xf7, 0x00, 0x00, 0x00, 0x20, 0x88, 0x60, 0x02, 0x48, 0x09, 0x69, 0x20, 0x30, 0xff, 0xf7, 0x09, 0xfe, 0x80, 0xbd, 0x64, 0x73, 0x01, 0x00, 0xb0, 0xb5, 0x60, 0x21, 0x00, 0x20, 0x04, 0xf0, 0x07, 0xfc, 0x11, 0x4d, 0x00, 0x24, 0x00, 0x22, 0x04, 0x20, 0x29, 0x5d, 0x04, 0xf0, 0x28, 0xf9, 0x0c, 0x20, 0x03, 0xf0, 0x9b, 0xfb, 0x01, 0x34, 0x24, 0x06, 0x24, 0x0e, 0x05, 0x2c, 0xf2, 0xd3, 0x3c, 0x00, 0xbc, 0xf7, 0x00, 0x00, 0x0f, 0x22, 0x00, 0x21, 0x0a, 0x20, 0x04, 0xf0, 0x1b, 0xf9, 0x61, 0x21, 0x00, 0x20, 0x04, 0xf0, 0xef, 0xfb, 0x06, 0x49, 0x01, 0x20, 0x88, 0x60, 0x04, 0x48, 0x09, 0x69, 0x20, 0x30, 0xff, 0xf7, 0xcd, 0xfd, 0xff, 0x20, 0x2d, 0x30, 0xb0, 0xbd, 0xa8, 0x58, 0x01, 0x00, 0x64, 0x73, 0x01, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x12, 0x48, 0xc6, 0x70, 0x01, 0x20, 0xff, 0xf7, 0x3c, 0x00, 0xf8, 0xf7, 0x00, 0x00, 0xfd, 0xfb, 0x01, 0x27, 0xbf, 0x02, 0x04, 0x1c, 0xb8, 0x43, 0x01, 0x1c, 0x01, 0x20, 0x04, 0xf0, 0xd1, 0xfb, 0x03, 0x20, 0xff, 0xf7, 0xf2, 0xfb, 0x05, 0x1c, 0xb8, 0x43, 0x01, 0x1c, 0x03, 0x20, 0x04, 0xf0, 0xc8, 0xfb, 0x30, 0x1c, 0x00, 0xf0, 0x9f, 0xf9, 0x00, 0xf0, 0x57, 0xf8, 0x21, 0x1c, 0x01, 0x20, 0x04, 0xf0, 0xbf, 0xfb, 0x29, 0x1c, 0x03, 0x20, 0x04, 0xf0, 0x3c, 0x00, 0x34, 0xf8, 0x00, 0x00, 0xbb, 0xfb, 0x00, 0x20, 0xf8, 0xbd, 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x40, 0x21, 0x00, 0x20, 0x04, 0xf0, 0xd8, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x05, 0x1c, 0x01, 0x24, 0x09, 0x20, 0xff, 0xf7, 0xcc, 0xfb, 0x0f, 0x21, 0x09, 0x04, 0x88, 0x43, 0x03, 0x21, 0x89, 0x04, 0xe2, 0x04, 0x05, 0x2d, 0x12, 0x4e, 0x20, 0xd2, 0x02, 0xa3, 0x3c, 0x00, 0x70, 0xf8, 0x00, 0x00, 0x5b, 0x5d, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x00, 0x06, 0x09, 0x0c, 0x10, 0x03, 0x00, 0x03, 0x21, 0x09, 0x04, 0x0c, 0xe0, 0x01, 0x21, 0x09, 0x04, 0x09, 0xe0, 0x01, 0x21, 0x49, 0x04, 0x06, 0xe0, 0xf3, 0x68, 0x04, 0x2b, 0x05, 0xd9, 0x02, 0xe0, 0xf3, 0x68, 0x04, 0x2b, 0x01, 0xd8, 0x01, 0x43, 0x01, 0xe0, 0x10, 0x43, 0x01, 0x1c, 0x09, 0x20, 0x04, 0xf0, 0x80, 0xfb, 0x3c, 0x00, 0xac, 0xf8, 0x00, 0x00, 0x20, 0x1c, 0x70, 0xbd, 0x00, 0x24, 0xfb, 0xe7, 0x64, 0x73, 0x01, 0x00, 0x01, 0x21, 0xc9, 0x05, 0x00, 0x28, 0x80, 0xb5, 0x02, 0xd0, 0x0a, 0x1c, 0x00, 0x21, 0x00, 0xe0, 0x00, 0x22, 0x04, 0x20, 0x04, 0xf0, 0x96, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0xf0, 0xb5, 0x91, 0xb0, 0x00, 0x26, 0x40, 0x21, 0x01, 0xa8, 0xf0, 0xf7, 0xdd, 0xfd, 0x2a, 0x4f, 0xb8, 0x79, 0x01, 0x22, 0x3c, 0x00, 0xe8, 0xf8, 0x00, 0x00, 0x52, 0x03, 0x00, 0x90, 0x00, 0x21, 0x06, 0x20, 0x04, 0xf0, 0x84, 0xf8, 0x60, 0x21, 0x00, 0x20, 0x04, 0xf0, 0x58, 0xfb, 0x61, 0x21, 0x00, 0x20, 0x04, 0xf0, 0x54, 0xfb, 0x08, 0x20, 0x03, 0xf0, 0xef, 0xfa, 0x00, 0x24, 0x0f, 0x20, 0xff, 0xf7, 0x71, 0xfb, 0x40, 0x05, 0x05, 0x0f, 0xa8, 0x00, 0x01, 0xa9, 0x09, 0x58, 0x01, 0xaa, 0x01, 0x31, 0x01, 0x34, 0x0c, 0x2c, 0x3c, 0x00, 0x24, 0xf9, 0x00, 0x00, 0x11, 0x50, 0xf1, 0xd3, 0x00, 0x20, 0x81, 0x00, 0x01, 0xaa, 0x51, 0x58, 0xb1, 0x42, 0x01, 0xd9, 0x0e, 0x1c, 0x05, 0x1c, 0x01, 0x30, 0x10, 0x28, 0xf5, 0xd3, 0x06, 0x20, 0xff, 0xf7, 0x58, 0xfb, 0x0f, 0x21, 0x49, 0x02, 0x88, 0x43, 0x69, 0x02, 0x08, 0x43, 0x01, 0x21, 0x49, 0x03, 0x01, 0x43, 0x06, 0x20, 0x04, 0xf0, 0x29, 0xfb, 0x0d, 0x48, 0x84, 0x68, 0x64, 0x34, 0x3c, 0x00, 0x60, 0xf9, 0x00, 0x00, 0x08, 0xe0, 0x20, 0x1c, 0x03, 0xf0, 0x5a, 0xf9, 0x00, 0x28, 0x03, 0xd0, 0x01, 0x21, 0x95, 0x20, 0xf1, 0xf7, 0x98, 0xfc, 0x0f, 0x20, 0xff, 0xf7, 0x3d, 0xfb, 0x00, 0x04, 0xf1, 0xd5, 0x87, 0x20, 0x03, 0xf0, 0xb2, 0xfa, 0x00, 0x98, 0xb8, 0x71, 0x11, 0xb0, 0xf0, 0xbd, 0x20, 0x10, 0x07, 0x00, 0x00, 0x01, 0x07, 0x00, 0x10, 0xb5, 0x17, 0x4c, 0x61, 0x69, 0x00, 0x29, 0x3c, 0x00, 0x9c, 0xf9, 0x00, 0x00, 0x04, 0xd0, 0x0a, 0x21, 0x13, 0x20, 0x03, 0xf0, 0x47, 0xfe, 0x10, 0xbd, 0x01, 0x1c, 0x12, 0x48, 0x01, 0x29, 0x00, 0x78, 0x0c, 0xd0, 0x11, 0x29, 0xf7, 0xd1, 0x05, 0x28, 0x03, 0xd1, 0x01, 0x21, 0x13, 0x20, 0xf1, 0xf7, 0x71, 0xfc, 0x20, 0x78, 0x07, 0x28, 0xee, 0xd1, 0x02, 0x21, 0x0a, 0xe0, 0x05, 0x28, 0x07, 0xd0, 0x06, 0x28, 0x0a, 0xd0, 0x07, 0x28, 0xf7, 0xd0, 0x3c, 0x00, 0xd8, 0xf9, 0x00, 0x00, 0x08, 0x28, 0xe4, 0xd1, 0x00, 0x20, 0x05, 0xe0, 0x01, 0x21, 0x13, 0x20, 0xf1, 0xf7, 0x5e, 0xfc, 0x10, 0xbd, 0x01, 0x20, 0x02, 0xf0, 0x6c, 0xfd, 0x10, 0xbd, 0x00, 0x00, 0x7c, 0x78, 0x01, 0x00, 0x0d, 0x49, 0x80, 0xb5, 0x09, 0x78, 0x03, 0x29, 0x01, 0xd1, 0x00, 0x28, 0x0b, 0xd0, 0x07, 0x29, 0x01, 0xd1, 0x00, 0x28, 0x07, 0xd0, 0x02, 0x29, 0x01, 0xd1, 0x00, 0x28, 0x3c, 0x00, 0x14, 0xfa, 0x00, 0x00, 0x03, 0xd1, 0x05, 0x29, 0x09, 0xd1, 0x00, 0x28, 0x07, 0xd0, 0x00, 0x20, 0xfc, 0xf7, 0x28, 0xfd, 0x00, 0x22, 0x13, 0x21, 0x11, 0x20, 0x03, 0xf0, 0xc1, 0xfe, 0x80, 0xbd, 0x7c, 0x78, 0x01, 0x00, 0x80, 0xb5, 0x06, 0x22, 0x08, 0x21, 0x00, 0x20, 0x03, 0xf0, 0xde, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x07, 0x48, 0x80, 0xb5, 0x40, 0x69, 0x00, 0x28, 0x01, 0xd1, 0xf1, 0xf7, 0x3c, 0x00, 0x50, 0xfa, 0x00, 0x00, 0x33, 0xff, 0x05, 0x49, 0x05, 0x4a, 0x08, 0x68, 0x50, 0x61, 0x48, 0x68, 0x90, 0x61, 0x01, 0x20, 0x80, 0xbd, 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, 0xb0, 0x58, 0x01, 0x00, 0x10, 0x00, 0x07, 0x00, 0x07, 0x48, 0x80, 0xb5, 0x40, 0x69, 0x00, 0x28, 0x01, 0xd1, 0xf1, 0xf7, 0x1d, 0xff, 0x05, 0x49, 0x05, 0x4a, 0x08, 0x68, 0x90, 0x61, 0x48, 0x68, 0x50, 0x61, 0x01, 0x20, 0x3c, 0x00, 0x8c, 0xfa, 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, 0xb0, 0x58, 0x01, 0x00, 0x10, 0x00, 0x07, 0x00, 0x11, 0xb5, 0x00, 0xab, 0x59, 0x78, 0x14, 0x48, 0x01, 0x23, 0xc0, 0x56, 0x00, 0x22, 0x09, 0x18, 0x0b, 0x06, 0x1b, 0x16, 0x13, 0x21, 0x13, 0x2b, 0x02, 0xdd, 0x00, 0xab, 0x59, 0x70, 0x07, 0xe0, 0x00, 0x2b, 0x02, 0xda, 0x00, 0xab, 0x5a, 0x70, 0x02, 0xe0, 0x1c, 0x1c, 0x3c, 0x00, 0xc8, 0xfa, 0x00, 0x00, 0x00, 0xab, 0x5c, 0x70, 0x00, 0xab, 0x1b, 0x78, 0x18, 0x18, 0x00, 0x06, 0x00, 0x16, 0x13, 0x28, 0x02, 0xdd, 0x00, 0xab, 0x19, 0x70, 0x06, 0xe0, 0x00, 0x28, 0x02, 0xda, 0x00, 0xab, 0x1a, 0x70, 0x01, 0xe0, 0x00, 0xab, 0x18, 0x70, 0x00, 0x98, 0x18, 0xbd, 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, 0x38, 0xb5, 0x0c, 0x1c, 0x15, 0x49, 0x00, 0xab, 0x49, 0x68, 0x13, 0x25, 0x3c, 0x00, 0x04, 0xfb, 0x00, 0x00, 0x00, 0x91, 0x59, 0x78, 0x09, 0x18, 0x59, 0x70, 0x19, 0x78, 0x08, 0x18, 0x18, 0x70, 0x19, 0x88, 0x10, 0x48, 0x02, 0x2c, 0xc1, 0x80, 0x01, 0xd0, 0x00, 0x2c, 0x0b, 0xd1, 0x00, 0xab, 0x18, 0x78, 0x13, 0x28, 0x00, 0xd9, 0x1d, 0x70, 0x00, 0xab, 0x19, 0x78, 0x00, 0x20, 0xff, 0xf7, 0xee, 0xfd, 0x02, 0x2c, 0x01, 0xd0, 0x01, 0x2c, 0x09, 0xd1, 0x00, 0xab, 0x58, 0x78, 0x3c, 0x00, 0x40, 0xfb, 0x00, 0x00, 0x13, 0x28, 0x00, 0xd9, 0x5d, 0x70, 0x00, 0xab, 0x59, 0x78, 0x01, 0x20, 0xff, 0xf7, 0xe0, 0xfd, 0x38, 0xbd, 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, 0xa0, 0x58, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0e, 0x28, 0x13, 0x4d, 0x04, 0xd0, 0x12, 0x49, 0xa0, 0x00, 0x00, 0x19, 0x4d, 0x39, 0x45, 0x18, 0x06, 0x20, 0xff, 0xf7, 0x3d, 0xfa, 0x0f, 0x49, 0x3c, 0x00, 0x7c, 0xfb, 0x00, 0x00, 0xe0, 0x22, 0x09, 0x19, 0x10, 0x39, 0xc9, 0x7b, 0x90, 0x43, 0x49, 0x01, 0x11, 0x40, 0x01, 0x43, 0x06, 0x20, 0x04, 0xf0, 0x0d, 0xfa, 0x29, 0x1c, 0x05, 0x20, 0x09, 0x4a, 0x03, 0xf0, 0x30, 0xff, 0x08, 0x48, 0x1f, 0x22, 0x00, 0x19, 0x10, 0x38, 0xc0, 0x7b, 0xc1, 0x04, 0xd2, 0x04, 0x08, 0x20, 0x03, 0xf0, 0x26, 0xff, 0xb0, 0xbd, 0x00, 0x00, 0xb4, 0x09, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xfb, 0x00, 0x00, 0x14, 0x45, 0x01, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xc0, 0x58, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x06, 0x49, 0x00, 0x28, 0x01, 0xd1, 0x08, 0x68, 0x80, 0xbd, 0x01, 0x28, 0x01, 0xd1, 0x48, 0x68, 0x80, 0xbd, 0xf1, 0xf7, 0x90, 0xfb, 0x00, 0x20, 0x80, 0xbd, 0x7c, 0x73, 0x01, 0x00, 0x01, 0x48, 0x40, 0x68, 0x70, 0x47, 0x00, 0x00, 0xa0, 0x58, 0x01, 0x00, 0x3c, 0x00, 0xf4, 0xfb, 0x00, 0x00, 0x04, 0x48, 0x01, 0x23, 0x04, 0x49, 0xc0, 0x56, 0xc9, 0x56, 0x40, 0x18, 0x00, 0x04, 0x00, 0x0c, 0x70, 0x47, 0x00, 0x00, 0xa0, 0x58, 0x01, 0x00, 0xa2, 0x58, 0x01, 0x00, 0x01, 0x48, 0x40, 0x68, 0x70, 0x47, 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, 0xf8, 0xb5, 0x05, 0x1c, 0x0e, 0x1c, 0x00, 0xf0, 0x55, 0xf9, 0x04, 0x1c, 0x00, 0xf0, 0x58, 0xf9, 0x00, 0x28, 0x2c, 0xd0, 0x3c, 0x00, 0x30, 0xfc, 0x00, 0x00, 0xb3, 0x00, 0x60, 0x1e, 0x00, 0x2d, 0x1c, 0x4e, 0x19, 0x49, 0x1a, 0x4a, 0x06, 0xd1, 0x0b, 0x25, 0x0e, 0x2c, 0x00, 0xd1, 0x19, 0x4a, 0xd2, 0x58, 0x08, 0x56, 0x08, 0xe0, 0x01, 0x2d, 0x1c, 0xd1, 0x9a, 0x18, 0x04, 0x36, 0x08, 0x18, 0x08, 0x25, 0x0e, 0x23, 0x12, 0x6d, 0xc0, 0x56, 0x07, 0x1c, 0x47, 0x43, 0xfb, 0x00, 0xdf, 0x19, 0x12, 0x4b, 0x3f, 0x21, 0x58, 0x43, 0x3c, 0x00, 0x6c, 0xfc, 0x00, 0x00, 0x11, 0x4b, 0xa9, 0x40, 0x0c, 0x1c, 0x38, 0x18, 0xc0, 0x18, 0x14, 0x40, 0xec, 0x40, 0xc0, 0x11, 0x60, 0x43, 0x1b, 0x0a, 0xc0, 0x18, 0x80, 0x12, 0x03, 0xd1, 0x01, 0x20, 0x04, 0xe0, 0x00, 0x20, 0xf8, 0xbd, 0x3f, 0x28, 0x00, 0xdd, 0x3f, 0x20, 0x30, 0x60, 0xa8, 0x40, 0x08, 0x40, 0x8a, 0x43, 0x10, 0x43, 0xf5, 0xe7, 0xcc, 0x59, 0x01, 0x00, 0xdc, 0x58, 0x01, 0x00, 0x3c, 0x00, 0xa8, 0xfc, 0x00, 0x00, 0x7c, 0x73, 0x01, 0x00, 0x7c, 0x59, 0x01, 0x00, 0x06, 0x06, 0x00, 0x00, 0x26, 0x00, 0x02, 0x00, 0x03, 0x48, 0x08, 0xb5, 0xc0, 0x88, 0x00, 0xab, 0x18, 0x80, 0x00, 0x98, 0x08, 0xbd, 0x00, 0x00, 0xa0, 0x58, 0x01, 0x00, 0xb0, 0xb5, 0x0b, 0x4d, 0x09, 0x4c, 0x0e, 0x20, 0x6c, 0x60, 0xff, 0xf7, 0x8d, 0xf9, 0x09, 0x49, 0x02, 0x1c, 0xc8, 0x60, 0x01, 0x06, 0x09, 0x0e, 0x3c, 0x00, 0xe4, 0xfc, 0x00, 0x00, 0x13, 0x3a, 0x02, 0x2a, 0x02, 0xd9, 0x17, 0x38, 0x04, 0x28, 0x00, 0xd8, 0x00, 0x21, 0x08, 0x1c, 0x6c, 0x60, 0xb0, 0xbd, 0x04, 0x18, 0x02, 0x00, 0x60, 0x00, 0x07, 0x00, 0x64, 0x73, 0x01, 0x00, 0x0a, 0x48, 0x98, 0xb5, 0x02, 0x78, 0x13, 0x21, 0x14, 0x2a, 0x00, 0xd3, 0x01, 0x70, 0x42, 0x78, 0x14, 0x2a, 0x00, 0xd3, 0x41, 0x70, 0x06, 0x4c, 0x60, 0x68, 0xff, 0xf7, 0x3c, 0x00, 0x20, 0xfd, 0x00, 0x00, 0xbd, 0xfe, 0x00, 0x90, 0x00, 0xab, 0x18, 0x88, 0xe0, 0x80, 0x00, 0xf0, 0x75, 0xff, 0x98, 0xbd, 0xa4, 0x58, 0x01, 0x00, 0xa0, 0x58, 0x01, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x41, 0x78, 0x01, 0x20, 0xff, 0xf7, 0xe6, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0xa6, 0x58, 0x01, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x01, 0x78, 0x00, 0x20, 0xff, 0xf7, 0xdc, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xfd, 0x00, 0x00, 0xa6, 0x58, 0x01, 0x00, 0xb0, 0xb5, 0x05, 0x4d, 0x00, 0x24, 0x20, 0x1c, 0xff, 0xf7, 0x44, 0xf9, 0x01, 0x34, 0x10, 0x2c, 0x01, 0xc5, 0xf8, 0xd3, 0xb0, 0xbd, 0x00, 0x00, 0xd4, 0x44, 0x01, 0x00, 0x04, 0x49, 0x80, 0xb5, 0x88, 0x70, 0x04, 0x49, 0x80, 0x00, 0x09, 0x58, 0x07, 0x20, 0x04, 0xf0, 0x0f, 0xf9, 0x80, 0xbd, 0x64, 0x73, 0x01, 0x00, 0xd0, 0x58, 0x01, 0x00, 0x3c, 0x00, 0x98, 0xfd, 0x00, 0x00, 0xb0, 0xb5, 0x3f, 0x24, 0x02, 0x1c, 0x00, 0x2a, 0x01, 0xd1, 0x08, 0x20, 0x0b, 0x23, 0x01, 0x2a, 0x01, 0xd1, 0x09, 0x20, 0x08, 0x23, 0x25, 0x1c, 0x9d, 0x40, 0x00, 0x29, 0x00, 0xd1, 0x01, 0x21, 0x3f, 0x29, 0x00, 0xd9, 0x21, 0x1c, 0x99, 0x40, 0x0a, 0x1c, 0x29, 0x1c, 0xff, 0xf7, 0x7c, 0xfc, 0xb0, 0xbd, 0x00, 0x00, 0x91, 0xb5, 0x12, 0x49, 0x00, 0xab, 0x1a, 0x78, 0x3c, 0x00, 0xd4, 0xfd, 0x00, 0x00, 0x08, 0x78, 0x11, 0x4c, 0x80, 0x18, 0x00, 0x06, 0x00, 0x0e, 0x20, 0x70, 0x49, 0x78, 0x5a, 0x78, 0x89, 0x18, 0x09, 0x06, 0x09, 0x0e, 0x13, 0x22, 0x13, 0x28, 0x61, 0x70, 0x00, 0xd9, 0x22, 0x70, 0x13, 0x29, 0x00, 0xd9, 0x62, 0x70, 0x08, 0x49, 0x08, 0x48, 0x06, 0x39, 0xc9, 0x88, 0x81, 0x80, 0x21, 0x78, 0x00, 0x20, 0xff, 0xf7, 0x82, 0xfc, 0x61, 0x78, 0x01, 0x20, 0x3c, 0x00, 0x10, 0xfe, 0x00, 0x00, 0xff, 0xf7, 0x7e, 0xfc, 0x98, 0xbd, 0x00, 0x00, 0xa4, 0x58, 0x01, 0x00, 0xa6, 0x58, 0x01, 0x00, 0x64, 0x73, 0x01, 0x00, 0x70, 0xb5, 0x1d, 0x4d, 0x04, 0x1c, 0x28, 0x78, 0x0e, 0x1c, 0x03, 0x28, 0x03, 0xd1, 0x02, 0x21, 0x11, 0x20, 0xf1, 0xf7, 0x35, 0xfa, 0x20, 0x1c, 0x00, 0xf0, 0x4e, 0xf8, 0x00, 0x28, 0x25, 0xd0, 0x28, 0x78, 0x01, 0x28, 0x0a, 0xd1, 0x68, 0x68, 0x3c, 0x00, 0x4c, 0xfe, 0x00, 0x00, 0x00, 0x28, 0x07, 0xd0, 0x01, 0x21, 0x11, 0x20, 0x03, 0xf0, 0xee, 0xfb, 0x01, 0x20, 0x69, 0x68, 0xf0, 0xf7, 0xbd, 0xfa, 0x6c, 0x70, 0x6e, 0x60, 0x20, 0x1c, 0xff, 0xf7, 0xc1, 0xfc, 0x04, 0x1c, 0x00, 0xf0, 0xd4, 0xfe, 0x00, 0x2c, 0x02, 0xd0, 0x68, 0x68, 0x00, 0x28, 0x02, 0xd1, 0xf6, 0xf7, 0xd9, 0xf8, 0x70, 0xbd, 0x01, 0x20, 0x28, 0x70, 0x01, 0x22, 0x21, 0x1c, 0x3c, 0x00, 0x88, 0xfe, 0x00, 0x00, 0x11, 0x20, 0x03, 0xf0, 0x9f, 0xfb, 0x70, 0xbd, 0x02, 0x21, 0x11, 0x20, 0xf1, 0xf7, 0x06, 0xfa, 0x70, 0xbd, 0x00, 0x00, 0x9c, 0x73, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x28, 0x05, 0xd1, 0x00, 0x29, 0x04, 0xd0, 0x01, 0x29, 0x01, 0xd1, 0xf6, 0xf7, 0xbf, 0xf8, 0x80, 0xbd, 0x05, 0x49, 0x08, 0x78, 0x03, 0x28, 0x02, 0xd0, 0x00, 0x20, 0x08, 0x70, 0x80, 0xbd, 0x03, 0x21, 0x3c, 0x00, 0xc4, 0xfe, 0x00, 0x00, 0x11, 0x20, 0xf1, 0xf7, 0xed, 0xf9, 0x80, 0xbd, 0x9c, 0x73, 0x01, 0x00, 0x01, 0x48, 0x40, 0x78, 0x70, 0x47, 0x00, 0x00, 0x9c, 0x73, 0x01, 0x00, 0x01, 0x1c, 0x01, 0x39, 0x01, 0x20, 0x0e, 0x29, 0x00, 0xd3, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x10, 0xb5, 0x13, 0x4c, 0x20, 0x78, 0x01, 0x28, 0x0e, 0xd1, 0x60, 0x68, 0x00, 0x28, 0x0d, 0xd0, 0x01, 0x21, 0x11, 0x20, 0x3c, 0x00, 0x00, 0xff, 0x00, 0x00, 0x03, 0xf0, 0x98, 0xfb, 0x01, 0x20, 0x61, 0x68, 0xf0, 0xf7, 0x67, 0xfa, 0x00, 0x20, 0x60, 0x60, 0x20, 0x70, 0x01, 0xe0, 0x03, 0x28, 0x0e, 0xd0, 0x00, 0x21, 0x11, 0x20, 0x03, 0xf0, 0x8a, 0xfb, 0xff, 0xf7, 0x24, 0xfc, 0xff, 0xf7, 0xc0, 0xfb, 0x05, 0x49, 0x08, 0x7b, 0x40, 0x08, 0x40, 0x00, 0x08, 0x73, 0x03, 0x20, 0x20, 0x70, 0x01, 0x20, 0x10, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xff, 0x00, 0x00, 0x9c, 0x73, 0x01, 0x00, 0x88, 0x00, 0x07, 0x00, 0x10, 0xb5, 0x0d, 0x4c, 0x20, 0x78, 0x03, 0x28, 0x13, 0xd1, 0x00, 0x20, 0x20, 0x70, 0x0b, 0x48, 0x01, 0x7b, 0x01, 0x22, 0x11, 0x43, 0x01, 0x73, 0xff, 0xf7, 0x70, 0xfc, 0xff, 0xf7, 0x18, 0xfc, 0x00, 0x28, 0x06, 0xd0, 0x02, 0x21, 0x21, 0x70, 0x01, 0x1c, 0x00, 0x22, 0x11, 0x20, 0x03, 0xf0, 0x2b, 0xfb, 0x01, 0x20, 0x3c, 0x00, 0x78, 0xff, 0x00, 0x00, 0x10, 0xbd, 0x00, 0x00, 0x9c, 0x73, 0x01, 0x00, 0x88, 0x00, 0x07, 0x00, 0x80, 0xb5, 0x05, 0x49, 0x00, 0x28, 0x04, 0xd0, 0x00, 0x20, 0x08, 0x60, 0x03, 0xf0, 0x5a, 0xfa, 0x80, 0xbd, 0x01, 0x20, 0x08, 0x60, 0x80, 0xbd, 0x80, 0x5a, 0x01, 0x00, 0xfe, 0xb5, 0x05, 0x1c, 0x80, 0x35, 0x04, 0x1c, 0xa8, 0x68, 0x29, 0x79, 0x06, 0x68, 0x20, 0x1c, 0xa0, 0x30, 0x02, 0x29, 0x3c, 0x00, 0xb4, 0xff, 0x00, 0x00, 0x1c, 0xd1, 0x69, 0x79, 0x08, 0x29, 0x01, 0xd0, 0x0c, 0x29, 0x17, 0xd1, 0x01, 0x21, 0x61, 0x62, 0xa9, 0x68, 0x09, 0x68, 0x09, 0x8b, 0x01, 0x82, 0xa9, 0x69, 0x01, 0x91, 0x00, 0x8a, 0xc0, 0x06, 0x05, 0xd5, 0x60, 0x68, 0x00, 0x88, 0x40, 0x05, 0x01, 0xd4, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x02, 0x90, 0x05, 0x20, 0x01, 0xa9, 0x02, 0xf0, 0xb7, 0xf9, 0x02, 0xe0, 0x3c, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x21, 0x61, 0x62, 0x01, 0x82, 0xa9, 0x68, 0x1a, 0x23, 0x0a, 0x89, 0x67, 0x6a, 0x18, 0x1c, 0x00, 0x2f, 0x00, 0xd1, 0x18, 0x20, 0x10, 0x1a, 0x08, 0x81, 0xa8, 0x68, 0x01, 0x68, 0x62, 0x6a, 0x00, 0x2a, 0x00, 0xd1, 0x18, 0x23, 0xc9, 0x18, 0x01, 0x60, 0xa8, 0x68, 0x41, 0xc4, 0x30, 0x88, 0x08, 0x3c, 0x40, 0x04, 0x03, 0xd5, 0x20, 0x1c, 0xf7, 0xf7, 0xbc, 0xf9, 0x3c, 0x00, 0x2c, 0x00, 0x01, 0x00, 0xfe, 0xbd, 0x00, 0x21, 0xe1, 0x61, 0x30, 0x79, 0xc0, 0x07, 0x03, 0xd4, 0x20, 0x1c, 0xf7, 0xf7, 0x91, 0xfe, 0xf5, 0xe7, 0x20, 0x1c, 0xf7, 0xf7, 0x43, 0xff, 0xf1, 0xe7, 0xf7, 0xb5, 0x05, 0x1c, 0x0a, 0x30, 0x06, 0x1c, 0xf5, 0xf7, 0xa4, 0xfa, 0x14, 0x4f, 0x04, 0x1c, 0x39, 0x88, 0xf2, 0xf7, 0x83, 0xfe, 0x32, 0x88, 0x78, 0x68, 0x02, 0x80, 0x72, 0x88, 0x02, 0x30, 0x3c, 0x00, 0x68, 0x00, 0x01, 0x00, 0x02, 0x80, 0xb1, 0x88, 0x41, 0x80, 0x69, 0x88, 0x02, 0x9a, 0x20, 0x1c, 0xfa, 0xf7, 0xce, 0xfe, 0x0b, 0x4d, 0x08, 0x35, 0x68, 0x80, 0xfb, 0xf7, 0x2b, 0xfe, 0x01, 0x21, 0x09, 0x03, 0x00, 0x28, 0x28, 0x88, 0x01, 0xd0, 0x88, 0x43, 0x00, 0xe0, 0x08, 0x43, 0x28, 0x80, 0x04, 0x48, 0x00, 0x22, 0x00, 0x21, 0x14, 0x30, 0xf2, 0xf7, 0x32, 0xfe, 0x20, 0x1c, 0xfc, 0xf7, 0x3c, 0x00, 0xa4, 0x00, 0x01, 0x00, 0x85, 0xfa, 0xfe, 0xbd, 0x24, 0x7b, 0x01, 0x00, 0x10, 0xb5, 0x13, 0x4c, 0x11, 0x49, 0x20, 0x1c, 0xff, 0x30, 0x69, 0x30, 0x0e, 0xc9, 0x0e, 0xc0, 0x20, 0x1c, 0xff, 0x30, 0x24, 0x22, 0x75, 0x30, 0x0e, 0x49, 0xf0, 0xf7, 0x17, 0xfa, 0x20, 0x1c, 0xff, 0x30, 0x3c, 0x22, 0x99, 0x30, 0x0c, 0x49, 0xf0, 0xf7, 0x6c, 0xfa, 0x20, 0x1c, 0xff, 0x30, 0x10, 0x22, 0xd5, 0x30, 0x3c, 0x00, 0xe0, 0x00, 0x01, 0x00, 0x09, 0x49, 0xf0, 0xf7, 0x09, 0xfa, 0x20, 0x1c, 0xff, 0x30, 0x28, 0x22, 0xe5, 0x30, 0x07, 0x49, 0xf0, 0xf7, 0x5e, 0xfa, 0x10, 0xbd, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x40, 0x63, 0x01, 0x00, 0x0c, 0x80, 0x07, 0x00, 0x30, 0x80, 0x07, 0x00, 0x80, 0x80, 0x07, 0x00, 0xa0, 0x80, 0x07, 0x00, 0xb0, 0xb5, 0x00, 0x28, 0x3f, 0xd0, 0x21, 0x48, 0x41, 0x68, 0x21, 0x4c, 0x3c, 0x00, 0x1c, 0x01, 0x01, 0x00, 0x61, 0x60, 0xc1, 0x68, 0xe1, 0x60, 0x01, 0x69, 0x21, 0x61, 0x80, 0x6a, 0xa0, 0x62, 0x1e, 0x49, 0x1c, 0x48, 0x09, 0x68, 0x14, 0x38, 0x41, 0x64, 0x1c, 0x48, 0x25, 0x1c, 0x3c, 0x35, 0x0f, 0xc8, 0x0f, 0xc5, 0x20, 0x1c, 0x80, 0x22, 0x4c, 0x30, 0x19, 0x49, 0xf0, 0xf7, 0x33, 0xfa, 0x14, 0x22, 0x20, 0x1c, 0xcc, 0x30, 0x17, 0x49, 0xf0, 0xf7, 0x2d, 0xfa, 0x38, 0x22, 0x3c, 0x00, 0x58, 0x01, 0x01, 0x00, 0x20, 0x1c, 0xe0, 0x30, 0x15, 0x49, 0xf0, 0xf7, 0x27, 0xfa, 0x20, 0x1c, 0xff, 0x30, 0x50, 0x22, 0x19, 0x30, 0x13, 0x49, 0xf0, 0xf7, 0x20, 0xfa, 0x83, 0x20, 0x80, 0x00, 0x14, 0x22, 0x20, 0x18, 0x10, 0x49, 0xf0, 0xf7, 0x19, 0xfa, 0x11, 0x20, 0x40, 0x01, 0x84, 0x22, 0x20, 0x18, 0x0e, 0x49, 0xf0, 0xf7, 0x12, 0xfa, 0xff, 0xf7, 0x8e, 0xff, 0xf8, 0xf7, 0x94, 0xfb, 0x3c, 0x00, 0x94, 0x01, 0x01, 0x00, 0xb0, 0xbd, 0xff, 0xf7, 0x89, 0xff, 0xb0, 0xbd, 0x00, 0x10, 0x07, 0x00, 0x40, 0x63, 0x01, 0x00, 0x08, 0x20, 0x07, 0x00, 0x40, 0x20, 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, 0x00, 0x40, 0x07, 0x00, 0x00, 0x50, 0x07, 0x00, 0x00, 0x60, 0x07, 0x00, 0x10, 0x00, 0x07, 0x00, 0x00, 0x90, 0x07, 0x00, 0x0c, 0x49, 0x80, 0xb5, 0x01, 0x20, 0x48, 0x60, 0x0a, 0x48, 0x14, 0x38, 0x3c, 0x00, 0xd0, 0x01, 0x01, 0x00, 0x00, 0x78, 0x01, 0x28, 0x04, 0xd0, 0x08, 0x48, 0x94, 0x38, 0x40, 0x6f, 0x00, 0x28, 0x03, 0xd0, 0x00, 0x20, 0x00, 0xf0, 0x1f, 0xf8, 0x80, 0xbd, 0x08, 0x68, 0x00, 0x28, 0xfb, 0xd0, 0x03, 0x48, 0xf2, 0xf7, 0x7a, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x98, 0x66, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x28, 0x09, 0xd1, 0xf2, 0x21, 0x0f, 0x20, 0x03, 0xf0, 0x3c, 0x00, 0x0c, 0x02, 0x01, 0x00, 0x13, 0xfa, 0x00, 0x22, 0x0f, 0x21, 0xf1, 0x20, 0x03, 0xf0, 0xcc, 0xfa, 0x80, 0xbd, 0x01, 0x20, 0xf8, 0xf7, 0x6a, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x03, 0x20, 0x00, 0xf0, 0xc9, 0xf9, 0x00, 0x21, 0x0f, 0x20, 0x03, 0xf0, 0xff, 0xf9, 0xff, 0xf7, 0x65, 0xf8, 0x0b, 0x49, 0x00, 0x20, 0x48, 0x74, 0xfb, 0xf7, 0xe6, 0xfa, 0x09, 0x48, 0x00, 0x68, 0x3c, 0x00, 0x48, 0x02, 0x01, 0x00, 0x00, 0x28, 0x03, 0xdc, 0x02, 0x21, 0x40, 0x42, 0xff, 0xf7, 0x52, 0xfc, 0x04, 0x48, 0x14, 0x30, 0x00, 0x68, 0x00, 0x28, 0x02, 0xd0, 0x20, 0x1c, 0xf2, 0xf7, 0x42, 0xfe, 0x10, 0xbd, 0x00, 0x00, 0x84, 0x66, 0x01, 0x00, 0xd4, 0x7e, 0x01, 0x00, 0x06, 0x49, 0x80, 0xb5, 0x09, 0x78, 0x04, 0x29, 0x05, 0xd0, 0x05, 0x29, 0x03, 0xd0, 0x06, 0x29, 0x01, 0xd0, 0x07, 0x29, 0x3c, 0x00, 0x84, 0x02, 0x01, 0x00, 0x01, 0xd1, 0xfe, 0xf7, 0xbd, 0xfd, 0x80, 0xbd, 0x74, 0x66, 0x01, 0x00, 0x10, 0xb5, 0x09, 0x4c, 0xe0, 0x68, 0x00, 0x28, 0x0b, 0xd1, 0x07, 0x48, 0x2c, 0x38, 0x00, 0x8a, 0xc0, 0x07, 0x04, 0xd5, 0x00, 0x21, 0x01, 0x20, 0x62, 0x68, 0xf9, 0xf7, 0xc9, 0xfa, 0x01, 0x20, 0xe0, 0x60, 0x01, 0x20, 0x10, 0xbd, 0x00, 0x00, 0xf4, 0x6e, 0x01, 0x00, 0x8c, 0xb5, 0x02, 0x1c, 0x3c, 0x00, 0xc0, 0x02, 0x01, 0x00, 0x08, 0x1c, 0x11, 0x1c, 0xfd, 0xf7, 0x28, 0xff, 0x01, 0x90, 0x00, 0x28, 0x05, 0xd0, 0x17, 0x20, 0x00, 0xab, 0x18, 0x80, 0x68, 0x46, 0xfd, 0xf7, 0xff, 0xf8, 0x8c, 0xbd, 0xf1, 0xb5, 0x2e, 0x4c, 0xae, 0xb0, 0x00, 0x25, 0x25, 0x63, 0x20, 0x69, 0x01, 0x28, 0x03, 0xd1, 0x01, 0xa8, 0x01, 0xf0, 0xa1, 0xf8, 0x4e, 0xe0, 0x01, 0x26, 0x28, 0x4f, 0x26, 0x70, 0x50, 0x3f, 0x3c, 0x00, 0xfc, 0x02, 0x01, 0x00, 0xb8, 0x69, 0xf8, 0xf7, 0x4f, 0xf8, 0x25, 0x49, 0x2c, 0x39, 0x00, 0x28, 0x1d, 0xd0, 0xe0, 0x6a, 0x01, 0x28, 0x1a, 0xd1, 0x08, 0x8a, 0x0f, 0x1c, 0x80, 0x07, 0x04, 0xd5, 0x00, 0x21, 0x02, 0x20, 0x62, 0x68, 0xf9, 0xf7, 0x8f, 0xfa, 0x38, 0x8a, 0x00, 0x07, 0x07, 0xd5, 0xe0, 0x68, 0x01, 0x28, 0x04, 0xd1, 0x00, 0x21, 0x08, 0x20, 0x62, 0x68, 0xf9, 0xf7, 0x84, 0xfa, 0x3c, 0x00, 0x38, 0x03, 0x01, 0x00, 0x00, 0x22, 0x18, 0x21, 0x82, 0x20, 0x26, 0x63, 0x03, 0xf0, 0x36, 0xfa, 0x25, 0xe0, 0x08, 0x8a, 0x0e, 0x1c, 0x80, 0x07, 0x04, 0xd5, 0x00, 0x21, 0x02, 0x20, 0x62, 0x68, 0xf9, 0xf7, 0x74, 0xfa, 0x30, 0x8a, 0x00, 0x07, 0x07, 0xd5, 0xe0, 0x68, 0x01, 0x28, 0x04, 0xd1, 0x00, 0x21, 0x08, 0x20, 0x62, 0x68, 0xf9, 0xf7, 0x69, 0xfa, 0x30, 0x8a, 0x40, 0x07, 0x04, 0xd5, 0x3c, 0x00, 0x74, 0x03, 0x01, 0x00, 0x00, 0x22, 0x00, 0x21, 0x04, 0x20, 0xf9, 0xf7, 0x61, 0xfa, 0x2e, 0x98, 0x01, 0x28, 0x04, 0xd0, 0x1e, 0x95, 0x09, 0x21, 0x1b, 0xa8, 0xff, 0xf7, 0x97, 0xff, 0xe5, 0x62, 0xbd, 0x61, 0xe5, 0x60, 0x2f, 0xb0, 0xf0, 0xbd, 0xf4, 0x6e, 0x01, 0x00, 0x80, 0xb5, 0x07, 0x20, 0xfe, 0xf7, 0xa0, 0xfe, 0x00, 0x21, 0x0f, 0x20, 0x03, 0xf0, 0x44, 0xf9, 0x0c, 0x48, 0x01, 0x78, 0x3c, 0x00, 0xb0, 0x03, 0x01, 0x00, 0x00, 0x29, 0x0f, 0xd0, 0x02, 0x21, 0x01, 0x70, 0x88, 0x38, 0x00, 0x78, 0x00, 0x28, 0x04, 0xd0, 0x07, 0x49, 0x10, 0x31, 0x48, 0x7c, 0x01, 0x30, 0x48, 0x74, 0xf2, 0x22, 0x0f, 0x20, 0x05, 0x49, 0x03, 0xf0, 0xfc, 0xf8, 0x00, 0x22, 0x0f, 0x21, 0xf3, 0x20, 0x03, 0xf0, 0xe9, 0xf9, 0x80, 0xbd, 0x74, 0x66, 0x01, 0x00, 0x80, 0x84, 0x1e, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x3c, 0x00, 0xec, 0x03, 0x01, 0x00, 0xf2, 0x21, 0x0f, 0x20, 0x03, 0xf0, 0x20, 0xf9, 0x01, 0x2c, 0x0a, 0xd1, 0x08, 0x48, 0x08, 0x49, 0x00, 0x68, 0x14, 0x39, 0x00, 0x28, 0x05, 0xd0, 0xc8, 0x78, 0x02, 0x28, 0x02, 0xd1, 0xf7, 0xf7, 0xaf, 0xfa, 0x10, 0xbd, 0x00, 0x20, 0x48, 0x70, 0x05, 0x20, 0xfe, 0xf7, 0x65, 0xfe, 0x10, 0xbd, 0x98, 0x66, 0x01, 0x00, 0xf8, 0xb5, 0x28, 0x4e, 0x30, 0x21, 0x35, 0x1c, 0x3c, 0x00, 0x28, 0x04, 0x01, 0x00, 0x60, 0x35, 0x28, 0x89, 0x89, 0x5d, 0x88, 0x42, 0x03, 0xd1, 0x00, 0x20, 0xff, 0xf7, 0xf6, 0xfe, 0xf8, 0xbd, 0x34, 0x1c, 0x70, 0x34, 0x01, 0x21, 0x21, 0x70, 0x41, 0x18, 0x80, 0x19, 0x30, 0x30, 0x29, 0x81, 0x40, 0x78, 0x1d, 0x4f, 0x18, 0x3f, 0x38, 0x70, 0x00, 0x28, 0x08, 0xd0, 0x00, 0x21, 0xfb, 0xf7, 0xc2, 0xf9, 0x00, 0x28, 0x07, 0xd1, 0x20, 0x78, 0xff, 0xf7, 0x3c, 0x00, 0x64, 0x04, 0x01, 0x00, 0x9b, 0xff, 0xe7, 0xe7, 0x01, 0x21, 0x0f, 0x20, 0xf0, 0xf7, 0x1a, 0xff, 0x14, 0x48, 0x01, 0x21, 0x80, 0x30, 0x81, 0x70, 0x38, 0x69, 0xfb, 0xf7, 0x55, 0xfa, 0x20, 0x73, 0x00, 0x21, 0x0f, 0x20, 0x03, 0xf0, 0xd6, 0xf8, 0x70, 0x7a, 0x01, 0x28, 0x0e, 0xd1, 0x0e, 0x48, 0x00, 0x68, 0x00, 0x28, 0x04, 0xd0, 0x38, 0x78, 0x02, 0xf0, 0xda, 0xfa, 0x00, 0x28, 0x05, 0xd0, 0x3c, 0x00, 0xa0, 0x04, 0x01, 0x00, 0x30, 0x7f, 0x60, 0x73, 0x03, 0x20, 0x20, 0x70, 0x71, 0x89, 0x05, 0xe0, 0x05, 0x20, 0x20, 0x70, 0xa8, 0x88, 0xfa, 0xf7, 0x3b, 0xfb, 0x01, 0x1c, 0x00, 0x22, 0x0f, 0x20, 0x03, 0xf0, 0x86, 0xf8, 0xba, 0xe7, 0x00, 0x00, 0x04, 0x66, 0x01, 0x00, 0xe4, 0x62, 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x02, 0xf0, 0x6c, 0xfc, 0x36, 0x4b, 0x19, 0x1c, 0xa0, 0x31, 0x0a, 0x78, 0x3c, 0x00, 0xdc, 0x04, 0x01, 0x00, 0x10, 0x2a, 0x02, 0xd2, 0x0a, 0x79, 0x10, 0x2a, 0x01, 0xd3, 0x01, 0x25, 0x00, 0xe0, 0x00, 0x25, 0x30, 0x4e, 0xca, 0x79, 0x80, 0x36, 0x01, 0x2c, 0x12, 0xd0, 0x00, 0x25, 0x02, 0x2c, 0x2e, 0xd0, 0x04, 0x2c, 0x3c, 0xd1, 0x5c, 0x6b, 0x00, 0x2c, 0x39, 0xd1, 0x9c, 0x6f, 0x00, 0x1b, 0x2a, 0x4c, 0xa0, 0x42, 0x34, 0xd9, 0xb2, 0x68, 0x98, 0x6a, 0x82, 0x42, 0x31, 0xd0, 0x3c, 0x00, 0x18, 0x05, 0x01, 0x00, 0x4d, 0x72, 0x34, 0xe0, 0xb0, 0x68, 0x9c, 0x6a, 0x02, 0x22, 0xa0, 0x42, 0x21, 0xd1, 0x58, 0x6b, 0x00, 0x28, 0x1e, 0xd1, 0x00, 0x2d, 0x1c, 0xd1, 0x48, 0x7a, 0x19, 0x28, 0x20, 0xd0, 0x34, 0x68, 0x98, 0x6f, 0x64, 0x00, 0x00, 0x1b, 0x74, 0x68, 0x00, 0x19, 0xff, 0x30, 0x1c, 0x4c, 0x39, 0x30, 0xa0, 0x42, 0x16, 0xd2, 0x48, 0x79, 0x8c, 0x79, 0x00, 0x19, 0x30, 0x28, 0x3c, 0x00, 0x54, 0x05, 0x01, 0x00, 0x11, 0xd3, 0x10, 0x22, 0x0f, 0xe0, 0x5c, 0x6b, 0x01, 0x2c, 0x06, 0xd1, 0xb0, 0x68, 0x9a, 0x6a, 0x90, 0x42, 0x00, 0xd1, 0x4d, 0x72, 0x00, 0x22, 0x05, 0xe0, 0x9c, 0x6f, 0x00, 0x1b, 0x12, 0x4c, 0xa0, 0x42, 0x00, 0xd3, 0x20, 0x22, 0x06, 0xe0, 0x4a, 0x7a, 0x19, 0x2a, 0x01, 0xd2, 0x01, 0x32, 0x4a, 0x72, 0x20, 0x22, 0xb0, 0x60, 0x30, 0x68, 0x9b, 0x6f, 0x98, 0x42, 0x3c, 0x00, 0x90, 0x05, 0x01, 0x00, 0x04, 0xd1, 0x00, 0x2a, 0x00, 0xd1, 0x48, 0x79, 0x4a, 0x71, 0x06, 0xe0, 0x10, 0x2a, 0x04, 0xd3, 0x70, 0x60, 0x33, 0x60, 0x48, 0x79, 0x88, 0x71, 0xf6, 0xe7, 0xca, 0x71, 0x70, 0xbd, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0xa3, 0x04, 0x00, 0x00, 0x71, 0x02, 0x00, 0x00, 0x35, 0x0c, 0x00, 0x00, 0x05, 0x48, 0x80, 0xb5, 0x81, 0x7b, 0x00, 0x29, 0x05, 0xd0, 0x00, 0x21, 0x3c, 0x00, 0xcc, 0x05, 0x01, 0x00, 0x81, 0x73, 0x03, 0x49, 0x0f, 0x20, 0x01, 0xf0, 0x0f, 0xff, 0x80, 0xbd, 0x74, 0x66, 0x01, 0x00, 0xe9, 0x03, 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0x02, 0xf0, 0xe2, 0xfb, 0x05, 0x1c, 0x38, 0x4e, 0x20, 0x1c, 0x37, 0x49, 0x34, 0x1c, 0xa0, 0x34, 0x10, 0x22, 0x44, 0x39, 0x01, 0x28, 0x2c, 0xd0, 0x04, 0x28, 0x4e, 0xd1, 0x37, 0x1c, 0x74, 0x36, 0x09, 0xce, 0x26, 0x78, 0x3c, 0x00, 0x08, 0x06, 0x01, 0x00, 0xc0, 0x1a, 0x20, 0x2e, 0x04, 0xd1, 0x30, 0x4e, 0xb0, 0x42, 0x01, 0xd9, 0x00, 0x26, 0x4e, 0x61, 0x3e, 0x1c, 0x3f, 0x6c, 0x00, 0x2f, 0x48, 0xd1, 0x77, 0x6c, 0x00, 0x2f, 0x45, 0xd1, 0xb7, 0x6a, 0x00, 0x2f, 0x3d, 0xd0, 0x77, 0x6b, 0x00, 0x2f, 0x3a, 0xd0, 0x27, 0x4f, 0xb8, 0x42, 0x37, 0xd2, 0x60, 0x78, 0x10, 0x28, 0x06, 0xd3, 0xf0, 0x6f, 0x18, 0x1a, 0x24, 0x4b, 0x3c, 0x00, 0x44, 0x06, 0x01, 0x00, 0x98, 0x42, 0x01, 0xd2, 0xe2, 0x70, 0xf5, 0x66, 0x48, 0x69, 0x06, 0x28, 0x2f, 0xd2, 0x01, 0x30, 0x2c, 0xe0, 0x20, 0x78, 0x20, 0x28, 0x01, 0xd1, 0x06, 0x23, 0x4b, 0x61, 0x02, 0x23, 0x23, 0x71, 0xb3, 0x6a, 0x00, 0x2b, 0x19, 0xd0, 0x49, 0x69, 0x03, 0x29, 0x16, 0xd9, 0x71, 0x6b, 0x73, 0x6d, 0x59, 0x40, 0x12, 0xd0, 0xe1, 0x78, 0x10, 0x29, 0x10, 0xd3, 0x61, 0x78, 0x3c, 0x00, 0x80, 0x06, 0x01, 0x00, 0x33, 0x1c, 0x10, 0x29, 0x0c, 0xd3, 0xd9, 0x6f, 0x69, 0x1a, 0x13, 0x4d, 0xa9, 0x42, 0x07, 0xd2, 0x58, 0x6c, 0x00, 0x28, 0x02, 0xd0, 0x98, 0x6c, 0x00, 0x28, 0x00, 0xd1, 0x22, 0x71, 0xf8, 0xbd, 0x02, 0x28, 0xfc, 0xd1, 0x22, 0x70, 0xfa, 0xe7, 0x48, 0x69, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x38, 0x48, 0x61, 0x0a, 0x49, 0xf0, 0x6e, 0x40, 0x18, 0x02, 0xf0, 0xb0, 0xfa, 0x3c, 0x00, 0xbc, 0x06, 0x01, 0x00, 0x00, 0x28, 0xee, 0xd0, 0x01, 0x20, 0xe0, 0x70, 0x06, 0x48, 0x28, 0x18, 0xf0, 0x66, 0xe8, 0xe7, 0xa4, 0x6c, 0x01, 0x00, 0xe2, 0x04, 0x00, 0x00, 0x1a, 0x06, 0x00, 0x00, 0x53, 0x07, 0x00, 0x00, 0x00, 0x2d, 0x31, 0x01, 0x00, 0x5a, 0x62, 0x02, 0x80, 0xb5, 0x41, 0x68, 0x09, 0x79, 0xc9, 0x07, 0x13, 0xd5, 0xc1, 0x69, 0x00, 0x29, 0x0d, 0xd0, 0x89, 0x79, 0x02, 0x29, 0x3c, 0x00, 0xf8, 0x06, 0x01, 0x00, 0x0a, 0xd1, 0x08, 0x21, 0x01, 0x86, 0x01, 0x1c, 0x38, 0x31, 0x81, 0x62, 0x02, 0x1c, 0x06, 0x48, 0x04, 0x49, 0xf9, 0xf7, 0xfd, 0xfc, 0x80, 0xbd, 0xf7, 0xf7, 0xdc, 0xfb, 0x80, 0xbd, 0xf7, 0xf7, 0x23, 0xfb, 0x80, 0xbd, 0xb9, 0x71, 0x00, 0x00, 0xa0, 0x6a, 0x01, 0x00, 0x10, 0xb5, 0x00, 0x24, 0x00, 0x28, 0x03, 0xd0, 0x02, 0xf0, 0xe8, 0xfe, 0x00, 0x28, 0x17, 0xd0, 0x3c, 0x00, 0x34, 0x07, 0x01, 0x00, 0x0c, 0x4c, 0x01, 0x20, 0xa0, 0x72, 0x20, 0x68, 0x00, 0x21, 0x41, 0x62, 0x0a, 0x49, 0x02, 0x68, 0xc9, 0x78, 0x60, 0x32, 0x91, 0x71, 0x21, 0x89, 0x01, 0x31, 0x21, 0x81, 0x00, 0x68, 0x40, 0x30, 0x81, 0x83, 0xfb, 0xf7, 0x31, 0xfc, 0x20, 0x68, 0x00, 0x68, 0xfc, 0xf7, 0xa1, 0xf9, 0x01, 0x24, 0x20, 0x1c, 0x10, 0xbd, 0x14, 0x7a, 0x01, 0x00, 0x0e, 0x61, 0x01, 0x00, 0x3c, 0x00, 0x70, 0x07, 0x01, 0x00, 0x7f, 0xb5, 0x06, 0x1c, 0x1e, 0x48, 0x1d, 0x1c, 0x43, 0x88, 0x02, 0x88, 0x1c, 0x21, 0x00, 0x20, 0x90, 0xb0, 0xf0, 0xf7, 0x45, 0xff, 0x03, 0x90, 0x04, 0x68, 0xff, 0x21, 0x01, 0x31, 0x21, 0x80, 0x08, 0x20, 0x60, 0x80, 0x06, 0x20, 0x20, 0x71, 0x04, 0x20, 0x60, 0x71, 0xc0, 0x01, 0x00, 0x2d, 0x00, 0xd1, 0x08, 0x1c, 0xe0, 0x80, 0x01, 0xa8, 0x02, 0x30, 0x31, 0x1c, 0x3c, 0x00, 0xac, 0x07, 0x01, 0x00, 0x05, 0x1c, 0xfa, 0xf7, 0x5f, 0xfa, 0x10, 0x49, 0x68, 0x46, 0xfa, 0xf7, 0x5b, 0xfa, 0x20, 0x1c, 0x08, 0x30, 0x69, 0x46, 0xfa, 0xf7, 0x56, 0xfa, 0x29, 0x1c, 0x20, 0x1c, 0x12, 0x30, 0xfa, 0xf7, 0x51, 0xfa, 0x10, 0xab, 0x98, 0x88, 0x00, 0x22, 0x01, 0x21, 0x20, 0x83, 0xd8, 0x88, 0x60, 0x83, 0x18, 0x89, 0xe0, 0x81, 0x58, 0x89, 0x20, 0x82, 0x68, 0x46, 0xf9, 0xf7, 0x3c, 0x00, 0xe8, 0x07, 0x01, 0x00, 0x17, 0xff, 0x14, 0xb0, 0x70, 0xbd, 0x00, 0x00, 0x14, 0x6e, 0x01, 0x00, 0x12, 0x61, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x18, 0x48, 0x25, 0x1c, 0x00, 0x78, 0x60, 0x35, 0x80, 0x07, 0x00, 0x28, 0x08, 0xda, 0xe8, 0x79, 0x00, 0x28, 0x05, 0xd0, 0xf4, 0xf7, 0x70, 0xff, 0x01, 0x1c, 0x20, 0x1c, 0x00, 0xf0, 0x78, 0xf9, 0x29, 0x88, 0x2e, 0x20, 0x00, 0x5d, 0xf2, 0xf7, 0x3c, 0x00, 0x24, 0x08, 0x01, 0x00, 0x9f, 0xfa, 0xe8, 0x79, 0x00, 0x28, 0x0b, 0xd1, 0x20, 0x1c, 0x40, 0x30, 0x01, 0x8b, 0x22, 0x69, 0x11, 0x80, 0x41, 0x8b, 0x22, 0x69, 0x51, 0x80, 0x80, 0x8b, 0x21, 0x69, 0xc8, 0x82, 0x07, 0xe0, 0x01, 0x28, 0x05, 0xd1, 0x20, 0x69, 0x01, 0x22, 0x01, 0x88, 0xd2, 0x02, 0x11, 0x43, 0x01, 0x80, 0x6a, 0x7a, 0xe0, 0x68, 0x02, 0x49, 0xf2, 0xf7, 0x53, 0xfa, 0xb0, 0xbd, 0x3c, 0x00, 0x60, 0x08, 0x01, 0x00, 0x1d, 0x75, 0x01, 0x00, 0xd1, 0x4f, 0x00, 0x00, 0x90, 0xb5, 0x04, 0x1c, 0x38, 0x23, 0x0c, 0x49, 0x58, 0x43, 0x43, 0x18, 0x85, 0xb0, 0x00, 0x20, 0x0a, 0x49, 0x02, 0x90, 0x18, 0x1c, 0x01, 0x22, 0x03, 0x91, 0x09, 0x49, 0x04, 0x92, 0x30, 0x30, 0x42, 0x78, 0x09, 0x88, 0x01, 0x92, 0x00, 0x91, 0x01, 0x78, 0x5a, 0x6b, 0x0c, 0x33, 0x20, 0x1c, 0xfb, 0xf7, 0x7c, 0xf8, 0x3c, 0x00, 0x9c, 0x08, 0x01, 0x00, 0x05, 0xb0, 0x90, 0xbd, 0xd4, 0xe4, 0x01, 0x00, 0x5d, 0x4e, 0x00, 0x00, 0x48, 0x7b, 0x01, 0x00, 0x90, 0xb5, 0x85, 0xb0, 0x03, 0x1c, 0x00, 0x20, 0x02, 0x90, 0x0a, 0x49, 0x18, 0x1c, 0x00, 0x22, 0x04, 0x92, 0x60, 0x30, 0x03, 0x91, 0xc2, 0x79, 0x01, 0x88, 0x01, 0x92, 0x00, 0x91, 0x5a, 0x6a, 0xdc, 0x68, 0x20, 0x33, 0x99, 0x7b, 0x40, 0x7a, 0x23, 0x1c, 0xfb, 0xf7, 0x3c, 0x00, 0xd8, 0x08, 0x01, 0x00, 0x5d, 0xf8, 0x05, 0xb0, 0x90, 0xbd, 0x00, 0x00, 0x0d, 0x4f, 0x00, 0x00, 0x07, 0x49, 0x80, 0xb5, 0x88, 0x6a, 0x00, 0x28, 0x08, 0xd1, 0x01, 0x20, 0x88, 0x62, 0xf0, 0xf7, 0xaf, 0xfc, 0x01, 0x1c, 0x03, 0x48, 0x00, 0x22, 0xf2, 0xf7, 0xb8, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x41, 0xe4, 0x00, 0x00, 0xf0, 0xb5, 0x9b, 0xb0, 0x00, 0x28, 0x20, 0xd0, 0x3c, 0x00, 0x14, 0x09, 0x01, 0x00, 0x01, 0x1c, 0x08, 0xa8, 0xfc, 0xf7, 0xb2, 0xfd, 0x01, 0x20, 0x11, 0x90, 0x03, 0x20, 0x10, 0xad, 0x28, 0x72, 0x04, 0x20, 0x68, 0x72, 0x05, 0xa8, 0x00, 0x22, 0x69, 0x46, 0xf4, 0xf7, 0x00, 0xff, 0x00, 0x24, 0x00, 0x26, 0x05, 0xa9, 0x00, 0x20, 0xf9, 0xf7, 0xfc, 0xfa, 0x69, 0x46, 0xf9, 0xf7, 0xf9, 0xfa, 0x0b, 0x90, 0x08, 0xa8, 0xfc, 0xf7, 0xbb, 0xfd, 0x01, 0x34, 0x3c, 0x00, 0x50, 0x09, 0x01, 0x00, 0x02, 0x2c, 0x2e, 0x72, 0xf0, 0xdb, 0x1b, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0x90, 0xb5, 0x04, 0x1c, 0x4c, 0x23, 0x0c, 0x49, 0x58, 0x43, 0x43, 0x18, 0x85, 0xb0, 0x00, 0x20, 0x0a, 0x49, 0x02, 0x90, 0x00, 0x22, 0x04, 0x92, 0x3c, 0x20, 0x03, 0x91, 0xc2, 0x5c, 0x08, 0x48, 0x41, 0x88, 0x01, 0x92, 0x41, 0x20, 0x00, 0x91, 0xc1, 0x5c, 0x5a, 0x68, 0x08, 0x33, 0x20, 0x1c, 0x3c, 0x00, 0x8c, 0x09, 0x01, 0x00, 0xfb, 0xf7, 0x02, 0xf8, 0x05, 0xb0, 0x90, 0xbd, 0x58, 0xe3, 0x01, 0x00, 0x75, 0x4f, 0x00, 0x00, 0x3c, 0x7c, 0x01, 0x00, 0xf8, 0xb5, 0x0e, 0x1c, 0x22, 0x4c, 0x38, 0x21, 0x17, 0x1c, 0x05, 0x1c, 0x20, 0x1c, 0xef, 0xf7, 0x75, 0xfd, 0x23, 0x1c, 0x25, 0x33, 0x21, 0x1c, 0x24, 0x31, 0x10, 0x20, 0x6a, 0x46, 0xf9, 0xf7, 0x1d, 0xf8, 0x00, 0xab, 0x18, 0x88, 0x07, 0x21, 0x3c, 0x00, 0xc8, 0x09, 0x01, 0x00, 0x1a, 0x4a, 0x02, 0x38, 0x20, 0x84, 0x20, 0x1c, 0x20, 0x30, 0x81, 0x70, 0xc5, 0x70, 0x11, 0x1c, 0x06, 0x73, 0x47, 0x73, 0x34, 0x31, 0x21, 0x63, 0x30, 0x32, 0x62, 0x63, 0x01, 0x79, 0x25, 0x1c, 0x10, 0x35, 0x21, 0x81, 0x20, 0x60, 0xe5, 0x60, 0x18, 0x88, 0x40, 0x1a, 0x20, 0x83, 0x20, 0x1c, 0x28, 0x30, 0x20, 0x61, 0x20, 0x1c, 0xf9, 0xf7, 0x11, 0xf8, 0x0d, 0x48, 0x3c, 0x00, 0x04, 0x0a, 0x01, 0x00, 0x00, 0x68, 0x00, 0x28, 0x07, 0xd0, 0x06, 0x21, 0x20, 0x1c, 0xf8, 0xf7, 0x47, 0xfd, 0x10, 0x21, 0x28, 0x1c, 0xf8, 0xf7, 0x43, 0xfd, 0x08, 0x48, 0x02, 0x21, 0x01, 0x62, 0x44, 0x62, 0x01, 0x21, 0x01, 0x62, 0x06, 0x48, 0x00, 0x68, 0xef, 0xf7, 0xd5, 0xfc, 0xf8, 0xbd, 0x8c, 0x8e, 0x01, 0x00, 0xe4, 0xfe, 0x01, 0x00, 0xcc, 0x5c, 0x01, 0x00, 0x00, 0x30, 0x07, 0x00, 0x3c, 0x00, 0x40, 0x0a, 0x01, 0x00, 0x5c, 0x5b, 0x01, 0x00, 0xf0, 0xb5, 0x06, 0x1c, 0x40, 0x36, 0x31, 0x8b, 0x04, 0x1c, 0x25, 0x1c, 0x08, 0x07, 0x80, 0x0f, 0x60, 0x35, 0x01, 0x28, 0x85, 0xb0, 0x3b, 0xd0, 0xe8, 0x79, 0x00, 0x28, 0x05, 0xd1, 0x20, 0x69, 0x01, 0x80, 0xb0, 0x8b, 0x21, 0x69, 0xc8, 0x82, 0x07, 0xe0, 0x01, 0x28, 0x05, 0xd1, 0x20, 0x69, 0x01, 0x22, 0x01, 0x88, 0xd2, 0x02, 0x11, 0x43, 0x3c, 0x00, 0x7c, 0x0a, 0x01, 0x00, 0x01, 0x80, 0x20, 0x48, 0x00, 0x78, 0x80, 0x07, 0x26, 0xd5, 0xe8, 0x79, 0x00, 0x28, 0x23, 0xd0, 0xa0, 0x6b, 0x00, 0x28, 0x1c, 0xd0, 0xf4, 0xf7, 0x2f, 0xfe, 0x00, 0x28, 0x09, 0xd0, 0xb8, 0x21, 0x09, 0x58, 0x00, 0x29, 0x05, 0xd0, 0x30, 0x21, 0x09, 0x5d, 0xb4, 0x30, 0x08, 0x18, 0x07, 0x7a, 0x00, 0xe0, 0x00, 0x27, 0x01, 0x21, 0x38, 0x1c, 0xfa, 0xf7, 0x86, 0xf9, 0x3c, 0x00, 0xb8, 0x0a, 0x01, 0x00, 0x04, 0x90, 0x20, 0x69, 0x04, 0x30, 0x39, 0x1c, 0xf4, 0xf7, 0x6c, 0xfd, 0x04, 0x99, 0xfa, 0xf7, 0xd3, 0xf9, 0x02, 0xe0, 0x20, 0x1c, 0xf7, 0xf7, 0xf9, 0xfb, 0x70, 0x83, 0x70, 0x8b, 0x21, 0x69, 0x00, 0x22, 0x48, 0x80, 0x09, 0x49, 0x0a, 0x48, 0x04, 0x92, 0x03, 0x91, 0x02, 0x90, 0xea, 0x79, 0x29, 0x88, 0x01, 0x92, 0x00, 0x91, 0x62, 0x6a, 0xe3, 0x68, 0x20, 0x34, 0x3c, 0x00, 0xf4, 0x0a, 0x01, 0x00, 0xa1, 0x7b, 0x68, 0x7a, 0xfa, 0xf7, 0x4c, 0xff, 0x05, 0xb0, 0xf0, 0xbd, 0x1d, 0x75, 0x01, 0x00, 0xd1, 0x4f, 0x00, 0x00, 0xdd, 0x2f, 0x01, 0x00, 0xfe, 0xb5, 0x04, 0x1c, 0x26, 0x1c, 0x01, 0x20, 0x20, 0x36, 0x00, 0x29, 0x02, 0x90, 0x2e, 0xd0, 0x58, 0x20, 0x00, 0x5b, 0x00, 0x07, 0x80, 0x0f, 0x01, 0x28, 0x01, 0xd1, 0xcc, 0x31, 0x00, 0xe0, 0xb4, 0x31, 0x48, 0x68, 0x3c, 0x00, 0x30, 0x0b, 0x01, 0x00, 0x0d, 0x1c, 0x00, 0x28, 0x24, 0xd0, 0x20, 0x1c, 0x60, 0x30, 0xc2, 0x79, 0x01, 0x21, 0x01, 0x2a, 0x00, 0xd0, 0x00, 0x21, 0x27, 0x1c, 0x62, 0x6d, 0x30, 0x37, 0x00, 0x2a, 0x04, 0xd0, 0x3a, 0x1c, 0x28, 0x1c, 0xf6, 0xf7, 0xe7, 0xfd, 0x07, 0xe0, 0x42, 0x7a, 0x23, 0x1c, 0x68, 0x33, 0x00, 0x92, 0x3a, 0x1c, 0x28, 0x1c, 0xf6, 0xf7, 0x9a, 0xfd, 0x02, 0x90, 0x38, 0x78, 0x3c, 0x00, 0x6c, 0x0b, 0x01, 0x00, 0x40, 0x19, 0x00, 0x7a, 0x01, 0x21, 0xb0, 0x73, 0xfa, 0xf7, 0x26, 0xf9, 0x01, 0xe0, 0x00, 0x20, 0xb0, 0x73, 0x60, 0x62, 0xb0, 0x7b, 0x0d, 0x28, 0x01, 0xd9, 0xf0, 0xf7, 0xbb, 0xfb, 0x02, 0x98, 0xfe, 0xbd, 0x00, 0x00, 0xff, 0xb5, 0x04, 0x1c, 0x80, 0x30, 0x25, 0x1c, 0x5e, 0x35, 0x00, 0x78, 0xae, 0x1d, 0xaf, 0x1f, 0x00, 0x28, 0x83, 0xb0, 0x12, 0xd1, 0xf4, 0xf7, 0x3c, 0x00, 0xa8, 0x0b, 0x01, 0x00, 0xc7, 0xfb, 0x00, 0x28, 0x07, 0xd0, 0x06, 0x98, 0x05, 0x99, 0x02, 0x90, 0x04, 0x98, 0x01, 0x90, 0xa6, 0x61, 0x67, 0x61, 0x0d, 0xe0, 0x04, 0x98, 0x06, 0x99, 0x02, 0x90, 0x05, 0x98, 0x01, 0x90, 0x66, 0x61, 0x05, 0xe0, 0x04, 0xa9, 0x03, 0xc9, 0x02, 0x90, 0x06, 0x98, 0x01, 0x90, 0x67, 0x61, 0xa5, 0x61, 0x06, 0x22, 0x38, 0x1c, 0xef, 0xf7, 0x8b, 0xfc, 0x06, 0x22, 0x3c, 0x00, 0xe4, 0x0b, 0x01, 0x00, 0x28, 0x1c, 0x02, 0x99, 0xef, 0xf7, 0x86, 0xfc, 0x06, 0x22, 0x30, 0x1c, 0x01, 0x99, 0xef, 0xf7, 0x81, 0xfc, 0x07, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x05, 0x28, 0x01, 0xd3, 0xf0, 0xf7, 0x7b, 0xfb, 0x02, 0x49, 0xa0, 0x00, 0x08, 0x58, 0x85, 0x60, 0xb0, 0xbd, 0x10, 0x7b, 0x01, 0x00, 0xf8, 0xb5, 0xff, 0xf7, 0x59, 0xf9, 0x05, 0x1c, 0x3c, 0x00, 0x20, 0x0c, 0x01, 0x00, 0xfe, 0xf7, 0xe8, 0xff, 0x04, 0x1c, 0x28, 0x1c, 0xff, 0xf7, 0x58, 0xf9, 0x00, 0x28, 0x42, 0xd0, 0x69, 0x1e, 0x21, 0x4d, 0x4a, 0x00, 0x20, 0x4b, 0x1c, 0x3d, 0xae, 0x5c, 0x98, 0x5c, 0x30, 0x40, 0xd6, 0x18, 0x01, 0x23, 0xf6, 0x56, 0x52, 0x19, 0xd2, 0x56, 0x96, 0x42, 0x01, 0xdd, 0x15, 0x1c, 0x00, 0xe0, 0x35, 0x1c, 0x18, 0x4b, 0x2a, 0x3b, 0x59, 0x56, 0x51, 0x18, 0x3c, 0x00, 0x5c, 0x0c, 0x01, 0x00, 0xb1, 0x42, 0x00, 0xdb, 0x31, 0x1c, 0x0e, 0x1c, 0x00, 0x28, 0x26, 0xd0, 0xfe, 0xf7, 0xbe, 0xff, 0x00, 0x90, 0x00, 0xab, 0x18, 0x78, 0x12, 0x49, 0x00, 0x23, 0xc9, 0x56, 0x00, 0xab, 0x15, 0x22, 0x10, 0x1a, 0x5b, 0x78, 0x00, 0x1b, 0x40, 0x18, 0xd2, 0x1a, 0x12, 0x1b, 0x51, 0x18, 0x00, 0x22, 0x85, 0x42, 0x02, 0xdb, 0x00, 0xab, 0x1a, 0x70, 0x02, 0xe0, 0x40, 0x1b, 0x3c, 0x00, 0x98, 0x0c, 0x01, 0x00, 0x00, 0xab, 0x18, 0x70, 0x8e, 0x42, 0x02, 0xdb, 0x00, 0xab, 0x5a, 0x70, 0x02, 0xe0, 0x88, 0x1b, 0x00, 0xab, 0x58, 0x70, 0x00, 0x98, 0xff, 0xf7, 0x8d, 0xf8, 0x01, 0xf0, 0xff, 0xf8, 0xf8, 0xbd, 0xe6, 0x78, 0x01, 0x00, 0x65, 0x73, 0x01, 0x00, 0x70, 0xb5, 0x08, 0x4e, 0x06, 0x4d, 0x00, 0x24, 0x06, 0x20, 0x60, 0x43, 0x80, 0x19, 0x06, 0x22, 0x29, 0x1c, 0xef, 0xf7, 0x3c, 0x00, 0xd4, 0x0c, 0x01, 0x00, 0x11, 0xfc, 0x01, 0x34, 0x05, 0x2c, 0xf5, 0xdb, 0x70, 0xbd, 0x00, 0x00, 0x4e, 0x47, 0x01, 0x00, 0xe6, 0x7a, 0x01, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x01, 0x68, 0x03, 0x48, 0xfe, 0xf7, 0x42, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xa8, 0x79, 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x01, 0x68, 0x03, 0x48, 0xfe, 0xf7, 0x4a, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x10, 0x0d, 0x01, 0x00, 0xa8, 0x79, 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, 0x10, 0xb5, 0x00, 0x28, 0x0a, 0xd0, 0x06, 0x4c, 0xa1, 0x69, 0x00, 0x29, 0x01, 0xd1, 0x00, 0x20, 0x00, 0xe0, 0x09, 0x68, 0xf7, 0xf7, 0x38, 0xfb, 0xa0, 0x61, 0x10, 0xbd, 0x00, 0x20, 0x10, 0xbd, 0xa4, 0x6e, 0x01, 0x00, 0xf3, 0xb5, 0x37, 0x48, 0x83, 0xb0, 0x02, 0x90, 0x80, 0x79, 0x0e, 0x1c, 0x00, 0x27, 0x01, 0x90, 0x3c, 0x00, 0x4c, 0x0d, 0x01, 0x00, 0x34, 0x48, 0x35, 0x4a, 0x01, 0x6a, 0x03, 0x9c, 0x03, 0x1c, 0x1b, 0x69, 0xa1, 0x42, 0x01, 0xd0, 0x93, 0x61, 0x00, 0xe0, 0x53, 0x61, 0x31, 0x49, 0x8a, 0x68, 0x96, 0x42, 0x3f, 0xd0, 0x2d, 0x48, 0x8e, 0x60, 0xc1, 0x68, 0x00, 0x24, 0x25, 0x1c, 0x00, 0x29, 0x2d, 0x48, 0x09, 0xd0, 0x00, 0x2e, 0x0b, 0xd0, 0x28, 0x48, 0x01, 0x24, 0xc0, 0x6a, 0x24, 0x03, 0x00, 0x28, 0x3c, 0x00, 0x88, 0x0d, 0x01, 0x00, 0x06, 0xd0, 0x01, 0x27, 0x04, 0xe0, 0x00, 0x2e, 0x01, 0xd0, 0x05, 0x1c, 0xf9, 0xe7, 0x04, 0x1c, 0x00, 0x2f, 0x06, 0xd0, 0xfb, 0xf7, 0x1e, 0xfb, 0x1f, 0x48, 0x01, 0x68, 0x22, 0x48, 0xfe, 0xf7, 0xfb, 0xfa, 0x20, 0x1c, 0x28, 0x43, 0x0e, 0xd0, 0x2a, 0x1c, 0x21, 0x1c, 0x01, 0x20, 0x02, 0xf0, 0x21, 0xfe, 0x2a, 0x1c, 0x21, 0x1c, 0x02, 0x20, 0x02, 0xf0, 0x1c, 0xfe, 0x3c, 0x00, 0xc4, 0x0d, 0x01, 0x00, 0x2a, 0x1c, 0x21, 0x1c, 0x03, 0x20, 0x02, 0xf0, 0x17, 0xfe, 0x00, 0x2f, 0x06, 0xd1, 0x13, 0x48, 0x01, 0x68, 0x16, 0x48, 0xfe, 0xf7, 0xce, 0xfa, 0xfa, 0xf7, 0x42, 0xfd, 0x03, 0x9c, 0x00, 0x2c, 0x01, 0xd1, 0x01, 0xf0, 0xe1, 0xff, 0x01, 0xa9, 0x03, 0xc9, 0x88, 0x71, 0x01, 0xf0, 0xdc, 0xff, 0x0a, 0x4c, 0x0a, 0x4b, 0x44, 0x3c, 0xa1, 0x69, 0x22, 0x69, 0x08, 0x3b, 0x3c, 0x00, 0x00, 0x0e, 0x01, 0x00, 0x41, 0x1a, 0x00, 0x2a, 0x03, 0xd0, 0x1a, 0x68, 0x51, 0x18, 0x19, 0x60, 0x02, 0xe0, 0x5a, 0x68, 0x51, 0x18, 0x59, 0x60, 0xa0, 0x61, 0x26, 0x61, 0x05, 0xb0, 0xf0, 0xbd, 0x20, 0x10, 0x07, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x10, 0x00, 0x07, 0x00, 0xb0, 0x57, 0x01, 0x00, 0x00, 0x10, 0x60, 0x00, 0x84, 0x73, 0x01, 0x00, 0x1c, 0xb5, 0x4c, 0x23, 0x08, 0x49, 0x58, 0x43, 0x3c, 0x00, 0x3c, 0x0e, 0x01, 0x00, 0x44, 0x18, 0x20, 0x1c, 0x40, 0x30, 0x41, 0x78, 0x62, 0x68, 0x00, 0x91, 0x01, 0x92, 0x3f, 0x21, 0x0b, 0x5d, 0x61, 0x8f, 0x00, 0x78, 0x62, 0x6c, 0xfa, 0xf7, 0x28, 0xf8, 0xa0, 0x85, 0x1c, 0xbd, 0x58, 0xe3, 0x01, 0x00, 0xb0, 0xb5, 0x16, 0x4d, 0xa9, 0x69, 0x00, 0x29, 0x25, 0xd0, 0x2c, 0x1c, 0x30, 0x34, 0x20, 0x7a, 0x00, 0x28, 0x20, 0xd0, 0x00, 0x23, 0x81, 0x22, 0x3c, 0x00, 0x78, 0x0e, 0x01, 0x00, 0x18, 0x20, 0x02, 0xf0, 0x89, 0xfc, 0x20, 0x7a, 0xff, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x20, 0x72, 0x12, 0xd1, 0x0c, 0x48, 0x28, 0x21, 0x2c, 0x38, 0x09, 0x5c, 0x21, 0x72, 0x29, 0x7a, 0x00, 0x29, 0x01, 0xd1, 0x00, 0x6a, 0x00, 0xe0, 0x40, 0x6a, 0xa9, 0x69, 0x80, 0x02, 0x81, 0x42, 0x03, 0xd2, 0x49, 0x00, 0x81, 0x42, 0x01, 0xd2, 0xa9, 0x61, 0xb0, 0xbd, 0xa8, 0x61, 0x3c, 0x00, 0xb4, 0x0e, 0x01, 0x00, 0xb0, 0xbd, 0x01, 0xf0, 0x1d, 0xf9, 0xb0, 0xbd, 0xf4, 0x6e, 0x01, 0x00, 0x7f, 0xb5, 0x05, 0x1c, 0x04, 0x20, 0x6b, 0x46, 0x1b, 0x18, 0x02, 0x90, 0x00, 0x26, 0x28, 0x18, 0x6a, 0x46, 0x02, 0xa9, 0xfc, 0xf7, 0x8a, 0xfb, 0x00, 0x28, 0x06, 0xd1, 0x00, 0xab, 0x18, 0x79, 0x04, 0x28, 0x08, 0xd0, 0x18, 0x79, 0x03, 0x28, 0x05, 0xd0, 0x00, 0xab, 0x18, 0x79, 0x10, 0x21, 0x3c, 0x00, 0xf0, 0x0e, 0x01, 0x00, 0x08, 0x43, 0x04, 0xb0, 0x70, 0xbd, 0x03, 0xa9, 0xe8, 0x68, 0xf6, 0xf7, 0xd3, 0xff, 0x00, 0x28, 0x05, 0xd0, 0x03, 0x98, 0x20, 0x21, 0x08, 0x43, 0x00, 0x06, 0x00, 0x0e, 0xf1, 0xe7, 0x03, 0xa9, 0x00, 0x20, 0xf6, 0xf7, 0xc7, 0xff, 0x04, 0x1c, 0x01, 0xd1, 0x02, 0x20, 0xe9, 0xe7, 0xe8, 0x68, 0x00, 0xab, 0x20, 0x60, 0x00, 0x98, 0x60, 0x60, 0x18, 0x79, 0xa0, 0x76, 0x3c, 0x00, 0x2c, 0x0f, 0x01, 0x00, 0xa8, 0x8c, 0x60, 0x76, 0xe8, 0x69, 0x20, 0x61, 0x68, 0x8c, 0xa0, 0x82, 0x28, 0x8c, 0x20, 0x76, 0x69, 0x69, 0x09, 0x48, 0x81, 0x42, 0x00, 0xd9, 0x08, 0x1c, 0xa0, 0x60, 0x20, 0x1c, 0x02, 0xf0, 0xa1, 0xfd, 0xa1, 0x68, 0x00, 0x29, 0x04, 0xd0, 0x03, 0x9a, 0xa1, 0x32, 0x08, 0x20, 0x02, 0xf0, 0x37, 0xfb, 0x30, 0x1c, 0xc7, 0xe7, 0x00, 0x00, 0xa0, 0x86, 0x01, 0x00, 0x3c, 0x00, 0x68, 0x0f, 0x01, 0x00, 0xfe, 0xb5, 0x06, 0x1c, 0x40, 0x78, 0x01, 0x24, 0x06, 0x28, 0x50, 0xd3, 0xc1, 0x1e, 0x03, 0x20, 0xef, 0xf7, 0x5e, 0xfb, 0x00, 0x90, 0x0e, 0x28, 0x49, 0xd8, 0x00, 0x20, 0x0a, 0xe0, 0x41, 0x00, 0x09, 0x18, 0x89, 0x19, 0x4a, 0x79, 0x89, 0x79, 0x51, 0x18, 0x01, 0x39, 0x0e, 0x29, 0x00, 0xd9, 0x00, 0x24, 0x01, 0x30, 0x00, 0x99, 0x88, 0x42, 0xf1, 0xdb, 0x00, 0x2c, 0x3c, 0x00, 0xa4, 0x0f, 0x01, 0x00, 0x37, 0xd0, 0x03, 0x22, 0xb1, 0x1c, 0x1b, 0x48, 0xef, 0xf7, 0xa4, 0xfa, 0x1a, 0x4c, 0x1c, 0x21, 0x20, 0x1c, 0xef, 0xf7, 0x4d, 0xfa, 0x00, 0x25, 0x28, 0xe0, 0x69, 0x00, 0x49, 0x19, 0x02, 0x91, 0x8a, 0x19, 0x53, 0x79, 0x15, 0x48, 0x43, 0x54, 0x93, 0x79, 0x0f, 0x18, 0x7b, 0x70, 0xd3, 0x79, 0xbb, 0x70, 0x07, 0x23, 0xd2, 0x56, 0x01, 0x92, 0x44, 0x5c, 0x0f, 0xe0, 0x3c, 0x00, 0xe0, 0x0f, 0x01, 0x00, 0x20, 0x1c, 0xfe, 0xf7, 0x7b, 0xff, 0x00, 0x28, 0x07, 0xd0, 0x0c, 0x4a, 0x60, 0x00, 0x80, 0x18, 0x01, 0x21, 0x10, 0x38, 0x81, 0x73, 0x01, 0x99, 0xc1, 0x73, 0x01, 0x34, 0x24, 0x06, 0x24, 0x0e, 0x07, 0x48, 0x02, 0x99, 0x40, 0x5c, 0x79, 0x78, 0x40, 0x18, 0xa0, 0x42, 0xe8, 0xd8, 0x01, 0x35, 0x00, 0x98, 0x85, 0x42, 0xd3, 0xdb, 0xfe, 0xbd, 0xe8, 0x62, 0x01, 0x00, 0x3c, 0x00, 0x1c, 0x10, 0x01, 0x00, 0xe6, 0x78, 0x01, 0x00, 0xeb, 0x62, 0x01, 0x00, 0x01, 0x68, 0x0f, 0x29, 0x01, 0xdd, 0x0f, 0x21, 0x01, 0x60, 0x01, 0x68, 0x00, 0x29, 0x01, 0xda, 0x00, 0x21, 0x01, 0x60, 0x70, 0x47, 0x00, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0x1e, 0x48, 0x22, 0x1d, 0x05, 0x68, 0x00, 0x92, 0x16, 0x1c, 0x23, 0x1c, 0x0f, 0x1c, 0xcc, 0x33, 0x2a, 0x1c, 0x20, 0x1c, 0x70, 0x30, 0xa1, 0x6d, 0x3c, 0x00, 0x58, 0x10, 0x01, 0x00, 0x00, 0xf0, 0x3e, 0xf9, 0x00, 0x96, 0xa1, 0x6d, 0x27, 0x20, 0x01, 0x40, 0x23, 0x1c, 0xe4, 0x33, 0x20, 0x1c, 0x2a, 0x1c, 0x5c, 0x30, 0x00, 0xf0, 0x33, 0xf9, 0x13, 0x48, 0x00, 0x78, 0x0e, 0x28, 0x01, 0xd2, 0x01, 0x25, 0x85, 0x40, 0x11, 0x48, 0xa1, 0x69, 0x00, 0x78, 0x29, 0x40, 0x00, 0x07, 0x0b, 0xd4, 0x48, 0x07, 0x03, 0xd5, 0x08, 0x07, 0x01, 0xd5, 0x04, 0x20, 0x3c, 0x00, 0x94, 0x10, 0x01, 0x00, 0x81, 0x43, 0x88, 0x06, 0x03, 0xd5, 0x48, 0x06, 0x01, 0xd5, 0x20, 0x20, 0x81, 0x43, 0x23, 0x1c, 0xb4, 0x33, 0x2a, 0x1c, 0x20, 0x1c, 0x30, 0x30, 0x00, 0x96, 0x00, 0xf0, 0x13, 0xf9, 0x39, 0x1c, 0x20, 0x1c, 0xf0, 0xf7, 0x47, 0xfc, 0xf8, 0xbd, 0x2c, 0x7d, 0x01, 0x00, 0x10, 0x67, 0x01, 0x00, 0x1d, 0x75, 0x01, 0x00, 0xb0, 0xb5, 0xf2, 0xf7, 0x27, 0xfc, 0xfe, 0xf7, 0x3c, 0x00, 0xd0, 0x10, 0x01, 0x00, 0x09, 0xf9, 0x0f, 0x48, 0x00, 0x25, 0x45, 0x70, 0x0e, 0x48, 0x0d, 0x4c, 0x00, 0x88, 0x5b, 0x34, 0xa0, 0x82, 0xf9, 0xf7, 0x23, 0xfd, 0x20, 0x61, 0xa0, 0x8a, 0x00, 0x28, 0x04, 0xd0, 0x01, 0x21, 0x89, 0x05, 0xef, 0xf7, 0x0d, 0xfb, 0xe1, 0x82, 0x05, 0x48, 0x01, 0x38, 0x45, 0x60, 0x01, 0xf0, 0x55, 0xfe, 0x02, 0x1c, 0x23, 0x1c, 0x00, 0x21, 0x00, 0x20, 0xf4, 0xf7, 0x3c, 0x00, 0x0c, 0x11, 0x01, 0x00, 0x49, 0xfd, 0xb0, 0xbd, 0x45, 0x7d, 0x01, 0x00, 0xf4, 0x67, 0x01, 0x00, 0x70, 0xb5, 0x16, 0x1c, 0x5a, 0x89, 0x04, 0x1c, 0x04, 0x98, 0x92, 0x07, 0x92, 0x0f, 0x00, 0x25, 0x00, 0x29, 0xa2, 0x71, 0x09, 0xd0, 0x05, 0x21, 0xf9, 0xf7, 0x24, 0xfb, 0x00, 0x28, 0x01, 0xd0, 0xc0, 0x78, 0x00, 0xe0, 0x01, 0x20, 0xe0, 0x71, 0x00, 0xe0, 0xe5, 0x71, 0xe5, 0x60, 0xa6, 0x60, 0x3c, 0x00, 0x48, 0x11, 0x01, 0x00, 0x70, 0xbd, 0x00, 0x00, 0xfe, 0xb5, 0x05, 0x1c, 0x0e, 0x22, 0x9c, 0x30, 0x16, 0x49, 0xef, 0xf7, 0xcf, 0xf9, 0x29, 0x1c, 0x28, 0x1c, 0x80, 0x30, 0x88, 0x31, 0x00, 0x24, 0x2f, 0x1c, 0x60, 0x37, 0x02, 0x91, 0x01, 0x90, 0x20, 0x06, 0x00, 0x0e, 0x06, 0x1c, 0xf9, 0xf7, 0x0d, 0xfe, 0x00, 0x28, 0x03, 0xd0, 0x01, 0x98, 0x42, 0x68, 0x02, 0x99, 0x01, 0xe0, 0xea, 0x6d, 0x3c, 0x00, 0x84, 0x11, 0x01, 0x00, 0x39, 0x1c, 0x00, 0x2a, 0x0d, 0xd0, 0x00, 0x20, 0x03, 0xe0, 0x0b, 0x5c, 0xb3, 0x42, 0x02, 0xd8, 0x01, 0x30, 0x90, 0x42, 0xf9, 0xdb, 0x08, 0x18, 0x10, 0x38, 0xc0, 0x7b, 0x29, 0x19, 0x90, 0x31, 0x08, 0x73, 0x01, 0x34, 0x0e, 0x2c, 0xdf, 0xd3, 0xfe, 0xbd, 0x00, 0x00, 0xcc, 0x47, 0x01, 0x00, 0xff, 0xb5, 0x81, 0xb0, 0x14, 0x1c, 0x10, 0x1c, 0x06, 0x22, 0x0d, 0x1c, 0x3c, 0x00, 0xc0, 0x11, 0x01, 0x00, 0x19, 0x1c, 0x0b, 0x9e, 0x0a, 0x9f, 0xef, 0xf7, 0x97, 0xf9, 0x06, 0x22, 0x39, 0x1c, 0xa0, 0x18, 0xef, 0xf7, 0x92, 0xf9, 0xe6, 0x60, 0x2c, 0x60, 0x10, 0x20, 0x28, 0x81, 0x6e, 0x60, 0x01, 0x98, 0xe8, 0x60, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x00, 0x20, 0x20, 0x61, 0x58, 0x20, 0x00, 0x5d, 0x0e, 0x1c, 0x15, 0x1c, 0xc0, 0x07, 0xc0, 0x17, 0x3c, 0x00, 0xfc, 0x11, 0x01, 0x00, 0x01, 0x30, 0xe0, 0x61, 0x21, 0x6b, 0x00, 0x29, 0x36, 0xd1, 0x1e, 0x49, 0x09, 0x68, 0x29, 0x43, 0x32, 0xd0, 0xa1, 0x68, 0x89, 0x8a, 0x00, 0x29, 0x2e, 0xd0, 0x00, 0x28, 0x0b, 0xd0, 0x20, 0x1c, 0x58, 0x30, 0x00, 0xf0, 0xf3, 0xfd, 0x00, 0x28, 0x1b, 0xd0, 0x81, 0x6a, 0x02, 0x6a, 0x40, 0x6a, 0x09, 0x78, 0x00, 0x78, 0x06, 0xe0, 0x14, 0x4a, 0x3c, 0x23, 0x11, 0x78, 0x3c, 0x00, 0x38, 0x12, 0x01, 0x00, 0x50, 0x78, 0x43, 0x43, 0x9a, 0x18, 0x04, 0x32, 0x00, 0x2d, 0x03, 0xd1, 0x02, 0x29, 0x01, 0xd0, 0x03, 0x29, 0x02, 0xd1, 0x6d, 0x21, 0x22, 0x61, 0x08, 0x55, 0x20, 0x69, 0x00, 0x28, 0x0d, 0xd0, 0x81, 0x88, 0x00, 0x29, 0x01, 0xd1, 0x01, 0x20, 0x70, 0xbd, 0x80, 0x79, 0x02, 0x28, 0x05, 0xd1, 0x22, 0x1c, 0x07, 0x49, 0x07, 0x48, 0xf8, 0xf7, 0x4b, 0xff, 0x02, 0xe0, 0x3c, 0x00, 0x74, 0x12, 0x01, 0x00, 0x20, 0x1c, 0xef, 0xf7, 0xb5, 0xf8, 0x00, 0x20, 0x70, 0xbd, 0x00, 0x00, 0x28, 0x61, 0x01, 0x00, 0x68, 0x61, 0x01, 0x00, 0xa1, 0xda, 0x00, 0x00, 0xa0, 0x6a, 0x01, 0x00, 0x10, 0xb5, 0x00, 0x21, 0x00, 0x20, 0xf9, 0xf7, 0x39, 0xfe, 0xc4, 0x00, 0xf9, 0xf7, 0x54, 0xfe, 0x24, 0x18, 0xf9, 0xf7, 0x47, 0xfe, 0x08, 0x49, 0x20, 0x18, 0x09, 0x88, 0x08, 0x4c, 0x40, 0x18, 0x3c, 0x00, 0xb0, 0x12, 0x01, 0x00, 0x06, 0x49, 0x09, 0x88, 0x40, 0x18, 0x60, 0x61, 0xf9, 0xf7, 0x46, 0xfe, 0x05, 0x49, 0x09, 0x88, 0x40, 0x18, 0x40, 0x00, 0xa0, 0x61, 0x10, 0xbd, 0x02, 0x61, 0x01, 0x00, 0x04, 0x61, 0x01, 0x00, 0xd4, 0x79, 0x01, 0x00, 0xa6, 0x69, 0x01, 0x00, 0x11, 0x40, 0x08, 0x1c, 0x10, 0xb5, 0x1c, 0x1c, 0x19, 0x1c, 0x08, 0x31, 0x18, 0x60, 0xf1, 0xf7, 0x31, 0xfe, 0x60, 0x60, 0x3c, 0x00, 0xec, 0x12, 0x01, 0x00, 0x10, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x22, 0x48, 0x0f, 0x1c, 0x41, 0x68, 0x91, 0x42, 0x03, 0xd0, 0x00, 0x21, 0x81, 0x60, 0xc1, 0x60, 0x42, 0x60, 0xc4, 0x68, 0x15, 0xe0, 0x28, 0x20, 0x1d, 0x49, 0x60, 0x43, 0x40, 0x18, 0x05, 0x1c, 0x06, 0x22, 0x31, 0x1c, 0xef, 0xf7, 0x70, 0xf8, 0x00, 0x28, 0x07, 0xd1, 0xa8, 0x1d, 0x39, 0x1c, 0xf9, 0xf7, 0x10, 0xfd, 0x3c, 0x00, 0x28, 0x13, 0x01, 0x00, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x20, 0xf8, 0xbd, 0x01, 0x34, 0x24, 0x07, 0x24, 0x0f, 0x12, 0x48, 0x80, 0x68, 0x84, 0x42, 0xe5, 0xd1, 0x10, 0x4c, 0x28, 0x23, 0xa0, 0x68, 0x0f, 0x4d, 0x58, 0x43, 0x40, 0x19, 0x06, 0x22, 0x31, 0x1c, 0xef, 0xf7, 0xd3, 0xf8, 0xa0, 0x68, 0x28, 0x23, 0x58, 0x43, 0x40, 0x19, 0x06, 0x30, 0x22, 0x22, 0x39, 0x1c, 0xef, 0xf7, 0xca, 0xf8, 0x3c, 0x00, 0x64, 0x13, 0x01, 0x00, 0xa0, 0x68, 0x01, 0x30, 0x00, 0x07, 0x00, 0x0f, 0xa0, 0x60, 0xe1, 0x68, 0x81, 0x42, 0x03, 0xd1, 0x01, 0x31, 0x08, 0x07, 0x00, 0x0f, 0xe0, 0x60, 0x00, 0x20, 0xd6, 0xe7, 0xec, 0x65, 0x01, 0x00, 0xa0, 0xf4, 0x01, 0x00, 0x10, 0xb5, 0x00, 0x21, 0x03, 0x20, 0x00, 0xf0, 0xe5, 0xff, 0x05, 0x4c, 0xa0, 0x68, 0x00, 0x28, 0x04, 0xd1, 0x01, 0xf0, 0x07, 0xfd, 0x61, 0x68, 0x3c, 0x00, 0xa0, 0x13, 0x01, 0x00, 0x40, 0x1a, 0x60, 0x60, 0x10, 0xbd, 0x00, 0x00, 0xd0, 0x60, 0x01, 0x00, 0x02, 0x68, 0x0a, 0x60, 0x01, 0x60, 0x70, 0x47, 0x01, 0x1c, 0x00, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x02, 0x68, 0x0a, 0x60, 0x70, 0x47, 0x00, 0x00, 0xfe, 0xb5, 0x14, 0x1c, 0x1d, 0x1c, 0x00, 0x22, 0xd2, 0x43, 0x01, 0xab, 0xf3, 0xf7, 0x82, 0xff, 0x01, 0x98, 0x00, 0x26, 0x28, 0x40, 0x01, 0x90, 0x3c, 0x00, 0xdc, 0x13, 0x01, 0x00, 0x00, 0x25, 0x00, 0x27, 0x20, 0x60, 0x1e, 0xe0, 0x01, 0x21, 0xb9, 0x40, 0x0a, 0x1c, 0x02, 0x40, 0x18, 0xd0, 0x88, 0x43, 0x01, 0x90, 0x39, 0x06, 0x09, 0x0e, 0x70, 0x19, 0x00, 0x19, 0x02, 0x91, 0x01, 0x77, 0x08, 0x1c, 0xf9, 0xf7, 0xc6, 0xfc, 0x00, 0x28, 0x06, 0xd0, 0x30, 0x1c, 0x00, 0x19, 0x01, 0x36, 0x02, 0x99, 0x30, 0x30, 0x01, 0x70, 0x04, 0xe0, 0x28, 0x1c, 0x3c, 0x00, 0x18, 0x14, 0x01, 0x00, 0x01, 0x35, 0x02, 0x99, 0x00, 0x19, 0x01, 0x72, 0x01, 0x37, 0x01, 0x98, 0x00, 0x28, 0xdd, 0xd1, 0x70, 0x19, 0xa0, 0x61, 0x65, 0x60, 0xe6, 0x62, 0xfe, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x14, 0x4d, 0x04, 0x1c, 0x28, 0x7a, 0x01, 0x28, 0x02, 0xd1, 0x04, 0x20, 0xf6, 0xf7, 0xad, 0xf9, 0x21, 0x1c, 0xa8, 0x6a, 0xf5, 0xf7, 0x21, 0xfc, 0x00, 0x28, 0x03, 0xd1, 0x04, 0x20, 0x3c, 0x00, 0x54, 0x14, 0x01, 0x00, 0xf6, 0xf7, 0xa4, 0xf9, 0xb0, 0xbd, 0x02, 0x20, 0x28, 0x70, 0x28, 0x8c, 0x00, 0x28, 0x00, 0xd0, 0x60, 0x81, 0x68, 0x8c, 0x00, 0x28, 0x00, 0xd0, 0xa0, 0x81, 0xa8, 0x8c, 0x00, 0x28, 0x00, 0xd0, 0xe0, 0x81, 0xe8, 0x69, 0x01, 0x23, 0x02, 0x04, 0x12, 0x0c, 0x20, 0x1c, 0x02, 0x49, 0xfc, 0xf7, 0x19, 0xff, 0xb0, 0xbd, 0xf4, 0x6e, 0x01, 0x00, 0xa1, 0x77, 0x00, 0x00, 0x3c, 0x00, 0x90, 0x14, 0x01, 0x00, 0xf8, 0xb5, 0x19, 0x4e, 0x05, 0x1c, 0xb0, 0x69, 0x00, 0x28, 0x00, 0xd1, 0x30, 0x68, 0xff, 0xf7, 0x3b, 0xfc, 0x15, 0x4f, 0x04, 0x1c, 0x50, 0x37, 0x00, 0x28, 0x0b, 0xd0, 0x60, 0x68, 0x29, 0x1c, 0x78, 0x60, 0x01, 0x20, 0x38, 0x63, 0x20, 0x1c, 0xf5, 0xf7, 0xea, 0xfb, 0x00, 0x28, 0x04, 0xd1, 0x00, 0x20, 0xf8, 0xbd, 0x00, 0x23, 0xfb, 0x62, 0xfa, 0xe7, 0x00, 0x23, 0x3c, 0x00, 0xcc, 0x14, 0x01, 0x00, 0x23, 0x77, 0xf8, 0x6a, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0xf8, 0x62, 0x38, 0x7a, 0x01, 0x28, 0x07, 0xd0, 0xf8, 0x69, 0x06, 0x49, 0x02, 0x04, 0x12, 0x0c, 0x28, 0x1c, 0xfc, 0xf7, 0xe6, 0xfe, 0x01, 0xe0, 0xfb, 0x62, 0xb3, 0x61, 0x01, 0x20, 0xe5, 0xe7, 0x00, 0x00, 0xa4, 0x6e, 0x01, 0x00, 0xdd, 0x02, 0x01, 0x00, 0x70, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x16, 0x1c, 0x3c, 0x00, 0x08, 0x15, 0x01, 0x00, 0x04, 0x2c, 0x1b, 0xd2, 0x10, 0x48, 0x83, 0x42, 0x07, 0xd2, 0x58, 0x00, 0x0f, 0x49, 0xef, 0xf7, 0xfb, 0xf8, 0xff, 0x30, 0x00, 0x0a, 0x01, 0x38, 0x00, 0xe0, 0x00, 0x20, 0x1f, 0x35, 0xea, 0x06, 0x61, 0x07, 0x09, 0x0e, 0xd2, 0x0e, 0x11, 0x43, 0x72, 0x07, 0x52, 0x0d, 0x11, 0x43, 0x00, 0x06, 0x00, 0x0a, 0x08, 0x43, 0x06, 0x4a, 0xa1, 0x00, 0x50, 0x50, 0x70, 0xbd, 0x3c, 0x00, 0x44, 0x15, 0x01, 0x00, 0x01, 0x21, 0x8d, 0x20, 0xef, 0xf7, 0xac, 0xfe, 0x70, 0xbd, 0x00, 0x00, 0x40, 0x9c, 0x00, 0x00, 0x00, 0x80, 0x38, 0x01, 0xe8, 0x60, 0x01, 0x00, 0x09, 0x4a, 0x80, 0x00, 0x10, 0x58, 0x40, 0x09, 0x40, 0x01, 0x07, 0x22, 0x02, 0x43, 0x07, 0x48, 0x03, 0x68, 0x00, 0x2b, 0xfc, 0xdb, 0x42, 0x60, 0x09, 0x06, 0x01, 0x60, 0x01, 0x68, 0x00, 0x29, 0xfc, 0xdb, 0x08, 0x20, 0x3c, 0x00, 0x80, 0x15, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0xe8, 0x60, 0x01, 0x00, 0x30, 0x20, 0x07, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, 0x07, 0x49, 0xa0, 0x00, 0x08, 0x58, 0x00, 0x28, 0x03, 0xd1, 0x02, 0x21, 0x8d, 0x20, 0xef, 0xf7, 0x80, 0xfe, 0x29, 0x1c, 0x20, 0x1c, 0xf6, 0xf7, 0xa8, 0xfa, 0xb0, 0xbd, 0x00, 0x00, 0xe8, 0x60, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, 0x07, 0x49, 0x3c, 0x00, 0xbc, 0x15, 0x01, 0x00, 0xa0, 0x00, 0x08, 0x58, 0x00, 0x28, 0x03, 0xd1, 0x02, 0x21, 0x8d, 0x20, 0xef, 0xf7, 0x6c, 0xfe, 0x29, 0x1c, 0x20, 0x1c, 0xff, 0xf7, 0xc4, 0xff, 0xb0, 0xbd, 0x00, 0x00, 0xe8, 0x60, 0x01, 0x00, 0xf8, 0xb5, 0x0d, 0x1c, 0x16, 0x1c, 0xf7, 0xf7, 0x17, 0xf9, 0x04, 0x1c, 0x28, 0x68, 0x40, 0x4f, 0x81, 0x78, 0x00, 0x29, 0x3b, 0xd1, 0xc1, 0x78, 0x00, 0x29, 0x58, 0xd1, 0x3c, 0x00, 0xf8, 0x15, 0x01, 0x00, 0xf8, 0xf7, 0xf8, 0xf9, 0x22, 0x8e, 0x61, 0x8e, 0x8a, 0x42, 0x04, 0xd0, 0xa1, 0x6a, 0x09, 0x18, 0xe0, 0x69, 0x81, 0x42, 0x10, 0xd9, 0x38, 0x49, 0x32, 0x1c, 0x48, 0x6b, 0x01, 0x30, 0x48, 0x63, 0x20, 0x6a, 0x01, 0x30, 0x20, 0x62, 0x38, 0x68, 0x01, 0x30, 0x38, 0x60, 0xe0, 0x68, 0x63, 0x69, 0x29, 0x1c, 0xee, 0xf7, 0xd8, 0xfe, 0xf8, 0xbd, 0x01, 0x32, 0x12, 0x04, 0x3c, 0x00, 0x34, 0x16, 0x01, 0x00, 0x12, 0x0c, 0x22, 0x86, 0xa1, 0x62, 0xb8, 0x68, 0x00, 0x28, 0x34, 0xd1, 0x2c, 0x48, 0x0c, 0x23, 0x00, 0x68, 0x1b, 0x1a, 0x9a, 0x42, 0x07, 0xd2, 0x19, 0x23, 0x9b, 0x01, 0xaf, 0x22, 0x92, 0x01, 0x58, 0x43, 0x10, 0x1a, 0x81, 0x42, 0x26, 0xd3, 0x01, 0x20, 0xb8, 0x60, 0x01, 0x21, 0x0c, 0x20, 0x00, 0xf0, 0x7a, 0xfe, 0x1f, 0xe0, 0x01, 0x29, 0x1d, 0xd1, 0xc0, 0x78, 0x3c, 0x00, 0x70, 0x16, 0x01, 0x00, 0x17, 0x28, 0x1a, 0xd1, 0xa0, 0x8e, 0xe1, 0x8e, 0x88, 0x42, 0x14, 0xd3, 0xe9, 0x68, 0x09, 0x68, 0x09, 0x79, 0x09, 0x06, 0x0f, 0xd5, 0x60, 0x6a, 0x32, 0x1c, 0x01, 0x30, 0x60, 0x62, 0xe0, 0x68, 0x63, 0x69, 0x29, 0x1c, 0xee, 0xf7, 0xa3, 0xfe, 0xe8, 0x68, 0x01, 0x68, 0x08, 0x31, 0x0b, 0x20, 0x00, 0xf0, 0x5c, 0xfe, 0xc3, 0xe7, 0x01, 0x30, 0xa0, 0x86, 0xa0, 0x8d, 0x3c, 0x00, 0xac, 0x16, 0x01, 0x00, 0xe1, 0x8d, 0x88, 0x42, 0x04, 0xd1, 0x03, 0x21, 0x02, 0x20, 0xef, 0xf7, 0xf5, 0xfd, 0xb8, 0xe7, 0x60, 0x68, 0x45, 0x60, 0x86, 0x60, 0x00, 0x68, 0x60, 0x60, 0xf8, 0x68, 0x01, 0x30, 0xf8, 0x60, 0xa0, 0x8d, 0x41, 0x1c, 0xa1, 0x85, 0x00, 0x28, 0xab, 0xd1, 0x08, 0x48, 0xb9, 0x69, 0xfd, 0xf7, 0x61, 0xfe, 0x22, 0x1c, 0x02, 0x21, 0xf1, 0x20, 0x02, 0xf0, 0x64, 0xf8, 0x3c, 0x00, 0xe8, 0x16, 0x01, 0x00, 0xa1, 0xe7, 0x00, 0x00, 0xfc, 0x5a, 0x01, 0x00, 0x90, 0x5c, 0x01, 0x00, 0x18, 0x57, 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x1c, 0x02, 0x21, 0xf0, 0x20, 0x02, 0xf0, 0x54, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x28, 0x03, 0xd1, 0x02, 0x48, 0x41, 0x78, 0xc9, 0x07, 0xfc, 0xd5, 0x70, 0x47, 0x00, 0x00, 0x04, 0x00, 0x07, 0x00, 0x80, 0xb5, 0x00, 0x06, 0x3c, 0x00, 0x24, 0x17, 0x01, 0x00, 0x01, 0xd1, 0xf1, 0xf7, 0x71, 0xfe, 0x80, 0xbd, 0x80, 0xb5, 0xf4, 0xf7, 0xe5, 0xfa, 0x80, 0xbd, 0x80, 0xb5, 0xf6, 0xf7, 0xeb, 0xf8, 0x80, 0xbd, 0x01, 0x49, 0x00, 0x20, 0x08, 0x74, 0x70, 0x47, 0x78, 0x69, 0x01, 0x00, 0x80, 0xb5, 0xc0, 0x07, 0x03, 0xd5, 0x02, 0x49, 0x01, 0x20, 0x00, 0xf0, 0x1d, 0xfc, 0x80, 0xbd, 0x50, 0xc3, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0e, 0x3c, 0x00, 0x60, 0x17, 0x01, 0x00, 0x01, 0x28, 0x80, 0xb5, 0x02, 0xd1, 0xf6, 0xf7, 0xe1, 0xf9, 0x80, 0xbd, 0x00, 0x28, 0xfc, 0xd1, 0xf1, 0xf7, 0x4c, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0xf6, 0xf7, 0xd7, 0xf9, 0x80, 0xbd, 0x03, 0x49, 0x80, 0xb5, 0x00, 0x20, 0x08, 0x74, 0xf6, 0xf7, 0xfe, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x06, 0x00, 0x0e, 0xf1, 0xf7, 0x3c, 0x00, 0x9c, 0x17, 0x01, 0x00, 0x71, 0xfe, 0x80, 0xbd, 0x10, 0xb5, 0x01, 0x28, 0x08, 0xd0, 0x02, 0x28, 0x03, 0xd0, 0x03, 0x28, 0x01, 0xd0, 0xef, 0xf7, 0xa7, 0xfd, 0xf6, 0xf7, 0xe9, 0xf9, 0x10, 0xbd, 0x01, 0xf0, 0xf8, 0xfa, 0x04, 0x1c, 0xfa, 0xf7, 0x5d, 0xfd, 0x24, 0x1a, 0xfa, 0xf7, 0x3e, 0xfd, 0x08, 0x49, 0x00, 0x28, 0x0b, 0xd0, 0x48, 0x6a, 0x00, 0x28, 0x08, 0xd0, 0x06, 0x48, 0x84, 0x42, 0x3c, 0x00, 0xd8, 0x17, 0x01, 0x00, 0x05, 0xd2, 0x01, 0x1b, 0x01, 0x22, 0x07, 0x20, 0x01, 0xf0, 0xf4, 0xfe, 0xe5, 0xe7, 0x00, 0x20, 0x48, 0x61, 0xe2, 0xe7, 0x78, 0x69, 0x01, 0x00, 0x50, 0xc3, 0x00, 0x00, 0x09, 0x49, 0x80, 0xb5, 0x48, 0x69, 0x00, 0x28, 0x0c, 0xd0, 0x08, 0x6a, 0xca, 0x69, 0x80, 0x1a, 0x00, 0x28, 0x07, 0xdd, 0x00, 0x20, 0x48, 0x61, 0x01, 0x21, 0x07, 0x20, 0x01, 0xf0, 0x10, 0xff, 0x3c, 0x00, 0x14, 0x18, 0x01, 0x00, 0xf6, 0xf7, 0xb8, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0xe7, 0xfb, 0x80, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x3f, 0xfc, 0x00, 0x20, 0xf7, 0xf7, 0xd4, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x37, 0xfc, 0xfd, 0xf7, 0x6f, 0xfc, 0xf5, 0xf7, 0x73, 0xfd, 0x30, 0xf0, 0x47, 0xfb, 0x80, 0xbd, 0x04, 0x48, 0x80, 0xb5, 0x3c, 0x00, 0x50, 0x18, 0x01, 0x00, 0xc1, 0x6a, 0x00, 0x6b, 0xf2, 0xf7, 0xde, 0xff, 0x01, 0x20, 0xf7, 0xf7, 0x89, 0xf8, 0x80, 0xbd, 0xa4, 0x6c, 0x01, 0x00, 0x10, 0xb5, 0xf3, 0xf7, 0x41, 0xf8, 0x0d, 0x4c, 0x00, 0x28, 0x04, 0xd0, 0x01, 0x20, 0xe0, 0x64, 0xf7, 0xf7, 0xb2, 0xfc, 0x10, 0xbd, 0x01, 0x21, 0x01, 0x20, 0xf3, 0xf7, 0xe9, 0xf8, 0xfd, 0xf7, 0x4d, 0xfc, 0x60, 0x6d, 0x00, 0x28, 0x03, 0xd0, 0x3c, 0x00, 0x8c, 0x18, 0x01, 0x00, 0xf3, 0xf7, 0x82, 0xf8, 0x00, 0x28, 0x01, 0xd0, 0xf5, 0xf7, 0x4a, 0xfd, 0x01, 0x20, 0xf2, 0xf7, 0xc1, 0xfc, 0x10, 0xbd, 0xa4, 0x6c, 0x01, 0x00, 0x04, 0x48, 0x80, 0xb5, 0xc1, 0x6a, 0x00, 0x6b, 0xf2, 0xf7, 0xb2, 0xff, 0x01, 0x20, 0xf7, 0xf7, 0x5d, 0xf8, 0x80, 0xbd, 0xa4, 0x6c, 0x01, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0xf5, 0xfb, 0xf5, 0xf7, 0x33, 0xfd, 0xfc, 0xf7, 0x3c, 0x00, 0xc8, 0x18, 0x01, 0x00, 0x31, 0xfd, 0xf9, 0xf7, 0xcb, 0xff, 0x04, 0x20, 0xf2, 0xf7, 0xa6, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x03, 0x48, 0x80, 0xb5, 0xc1, 0x6a, 0x00, 0x6b, 0xf2, 0xf7, 0x98, 0xff, 0x80, 0xbd, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0xdd, 0xfb, 0x00, 0x20, 0xf7, 0xf7, 0x3c, 0xf8, 0x30, 0xf0, 0xee, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x21, 0x3c, 0x00, 0x04, 0x19, 0x01, 0x00, 0x01, 0x20, 0xff, 0xf7, 0x19, 0xfa, 0x01, 0x20, 0xf2, 0xf7, 0x88, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0xc9, 0xfb, 0xfc, 0xf7, 0x07, 0xfd, 0x01, 0x21, 0x01, 0x20, 0xff, 0xf7, 0x0b, 0xfa, 0x04, 0x20, 0xf2, 0xf7, 0x7a, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, 0xf0, 0x8a, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x40, 0x19, 0x01, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x82, 0x6a, 0x01, 0x21, 0x04, 0x20, 0x00, 0xf0, 0x81, 0xfb, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x00, 0x21, 0x03, 0x20, 0x00, 0xf0, 0x78, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x82, 0x6a, 0x01, 0x21, 0x04, 0x20, 0x00, 0xf0, 0x6f, 0xfb, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x3c, 0x00, 0x7c, 0x19, 0x01, 0x00, 0x00, 0x21, 0x03, 0x20, 0x00, 0xf0, 0x66, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x06, 0x48, 0x80, 0xb5, 0x81, 0x68, 0x42, 0x69, 0x00, 0x69, 0x51, 0x18, 0x81, 0x42, 0x03, 0xd9, 0x01, 0x21, 0x01, 0x20, 0x00, 0xf0, 0x58, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x06, 0x48, 0x80, 0xb5, 0x82, 0x88, 0x81, 0x68, 0x00, 0x69, 0x51, 0x18, 0x81, 0x42, 0x03, 0xd9, 0x3c, 0x00, 0xb8, 0x19, 0x01, 0x00, 0x01, 0x21, 0x02, 0x20, 0x00, 0xf0, 0x48, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x10, 0xb5, 0x08, 0x4c, 0x20, 0x7b, 0x21, 0x6a, 0xf9, 0xf7, 0x9c, 0xfa, 0xa1, 0x69, 0x42, 0x18, 0xa0, 0x68, 0x21, 0x69, 0x80, 0x18, 0x88, 0x42, 0x03, 0xd9, 0x01, 0x21, 0x02, 0x20, 0x00, 0xf0, 0x33, 0xfb, 0x10, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x3c, 0x00, 0xf4, 0x19, 0x01, 0x00, 0x00, 0x21, 0x00, 0x20, 0x00, 0xf0, 0x2a, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0e, 0x01, 0x28, 0x80, 0xb5, 0x02, 0xd1, 0xf6, 0xf7, 0x8f, 0xf8, 0x80, 0xbd, 0x00, 0x28, 0xfc, 0xd1, 0xf1, 0xf7, 0xfa, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0xf6, 0xf7, 0x85, 0xf8, 0x80, 0xbd, 0x80, 0xb5, 0x00, 0x06, 0x00, 0x0e, 0xf1, 0xf7, 0x29, 0xfd, 0x80, 0xbd, 0x3c, 0x00, 0x30, 0x1a, 0x01, 0x00, 0xb0, 0xb5, 0x02, 0x25, 0x02, 0x28, 0x10, 0x4c, 0x0b, 0xd1, 0xfb, 0xf7, 0x47, 0xfc, 0x00, 0x28, 0x01, 0xd1, 0xfe, 0xf7, 0x4f, 0xff, 0x25, 0x70, 0xa1, 0x68, 0x0c, 0x48, 0xfd, 0xf7, 0xa8, 0xfc, 0xb0, 0xbd, 0x03, 0x28, 0x0d, 0xd1, 0x08, 0x48, 0x7d, 0x23, 0x1c, 0x38, 0x00, 0x69, 0xdb, 0x00, 0x58, 0x43, 0x19, 0x1c, 0x40, 0x18, 0x41, 0x08, 0x02, 0x20, 0x00, 0xf0, 0x3c, 0x00, 0x6c, 0x1a, 0x01, 0x00, 0x91, 0xfa, 0x25, 0x70, 0xb0, 0xbd, 0xf8, 0xf7, 0x31, 0xf9, 0xb0, 0xbd, 0x78, 0x69, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x10, 0xb5, 0x05, 0x4c, 0xe0, 0x68, 0x00, 0x28, 0x01, 0xd1, 0xef, 0xf7, 0x39, 0xfc, 0x02, 0x20, 0x20, 0x70, 0x00, 0xf0, 0xaf, 0xfa, 0x10, 0xbd, 0x78, 0x69, 0x01, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x82, 0x6a, 0x01, 0x21, 0x04, 0x20, 0x00, 0xf0, 0x3c, 0x00, 0xa8, 0x1a, 0x01, 0x00, 0xd3, 0xfa, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x00, 0x21, 0x03, 0x20, 0x00, 0xf0, 0xca, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, 0xf0, 0xc2, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x42, 0x69, 0x01, 0x21, 0x01, 0x20, 0x00, 0xf0, 0xb9, 0xfa, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x3c, 0x00, 0xe4, 0x1a, 0x01, 0x00, 0x06, 0x48, 0x80, 0xb5, 0x82, 0x88, 0x00, 0x2a, 0x02, 0xd0, 0x01, 0x21, 0x02, 0x20, 0x02, 0xe0, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, 0xf0, 0xa9, 0xfa, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x10, 0xb5, 0x06, 0x4c, 0x20, 0x7b, 0x21, 0x6a, 0xf9, 0xf7, 0xfe, 0xf9, 0xa1, 0x69, 0x42, 0x18, 0x01, 0x21, 0x02, 0x20, 0x00, 0xf0, 0x9a, 0xfa, 0x10, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x20, 0x1b, 0x01, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, 0xf0, 0x90, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x38, 0xb5, 0xfa, 0xf7, 0x41, 0xfe, 0x00, 0x20, 0xf0, 0xf7, 0x80, 0xf8, 0x00, 0x90, 0x00, 0xab, 0x1c, 0x88, 0x5d, 0x88, 0xf8, 0xf7, 0x3c, 0xf9, 0x00, 0x2c, 0x02, 0xd0, 0xfd, 0xf7, 0x9e, 0xfa, 0x02, 0xe0, 0x01, 0x20, 0xf6, 0xf7, 0x0a, 0xff, 0x3c, 0x00, 0x5c, 0x1b, 0x01, 0x00, 0x29, 0x1c, 0x20, 0x1c, 0xfc, 0xf7, 0xb8, 0xfc, 0x00, 0x2c, 0x02, 0xd0, 0xf5, 0xf7, 0xe0, 0xfb, 0x02, 0xe0, 0x00, 0x20, 0x00, 0xf0, 0xdc, 0xf9, 0x03, 0x20, 0x00, 0x2c, 0x00, 0xd1, 0x02, 0x20, 0x00, 0x06, 0x00, 0x0e, 0xf2, 0xf7, 0x4e, 0xfb, 0x38, 0xbd, 0x00, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x82, 0x6a, 0x01, 0x21, 0x04, 0x20, 0x00, 0xf0, 0x5d, 0xfa, 0x80, 0xbd, 0x3c, 0x00, 0x98, 0x1b, 0x01, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x30, 0xf0, 0x9b, 0xf9, 0x80, 0xbd, 0x80, 0xb5, 0x00, 0x22, 0x00, 0x21, 0x03, 0x20, 0x00, 0xf0, 0x50, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x42, 0x69, 0x01, 0x21, 0x01, 0x20, 0x00, 0xf0, 0x47, 0xfa, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x04, 0x48, 0x80, 0xb5, 0x82, 0x88, 0x00, 0x2a, 0x03, 0xd0, 0x01, 0x21, 0x3c, 0x00, 0xd4, 0x1b, 0x01, 0x00, 0x02, 0x20, 0x00, 0xf0, 0x3b, 0xfa, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x10, 0xb5, 0x06, 0x4c, 0x20, 0x7b, 0x21, 0x6a, 0xf9, 0xf7, 0x90, 0xf9, 0xa1, 0x69, 0x42, 0x18, 0x01, 0x21, 0x02, 0x20, 0x00, 0xf0, 0x2c, 0xfa, 0x10, 0xbd, 0x00, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x80, 0xb5, 0xfc, 0xf7, 0x93, 0xfb, 0x01, 0x21, 0x01, 0x20, 0xff, 0xf7, 0x97, 0xf8, 0x04, 0x20, 0x3c, 0x00, 0x10, 0x1c, 0x01, 0x00, 0xf2, 0xf7, 0x06, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x2f, 0xf0, 0x6b, 0xfb, 0x00, 0x28, 0x0a, 0xd0, 0x01, 0x20, 0xf2, 0xf7, 0xfc, 0xfa, 0xfa, 0xf7, 0x2a, 0xfc, 0x00, 0x28, 0x02, 0xd1, 0x04, 0x20, 0xf6, 0xf7, 0x5d, 0xf8, 0x80, 0xbd, 0x03, 0x21, 0x16, 0x20, 0xef, 0xf7, 0x32, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x02, 0x48, 0x80, 0xb5, 0x00, 0x68, 0xee, 0xf7, 0x3c, 0x00, 0x4c, 0x1c, 0x01, 0x00, 0xc5, 0xfb, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x42, 0x69, 0x01, 0x21, 0x01, 0x20, 0x00, 0xf0, 0xf7, 0xf9, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x30, 0xf0, 0x35, 0xf9, 0x80, 0xbd, 0xb0, 0xb5, 0x18, 0x4c, 0xaa, 0x20, 0x00, 0x5d, 0x04, 0x28, 0x19, 0xd1, 0x01, 0x25, 0xe5, 0x62, 0x25, 0x63, 0x01, 0xf0, 0x93, 0xf8, 0xa0, 0x66, 0x3c, 0x00, 0x88, 0x1c, 0x01, 0x00, 0x01, 0xf0, 0xfc, 0xfd, 0xf2, 0xf7, 0x2e, 0xfe, 0x00, 0x28, 0x0e, 0xd0, 0x02, 0x20, 0xf2, 0xf7, 0xc3, 0xfa, 0xa5, 0x60, 0x01, 0xf0, 0x86, 0xf8, 0x64, 0x30, 0x60, 0x60, 0xfa, 0xf7, 0x8a, 0xfd, 0x01, 0x21, 0x01, 0x20, 0xff, 0xf7, 0x46, 0xf8, 0xb0, 0xbd, 0x01, 0x20, 0xf2, 0xf7, 0xb4, 0xfa, 0x00, 0x20, 0xa0, 0x60, 0x00, 0x21, 0x01, 0x20, 0xff, 0xf7, 0x3c, 0xf8, 0x3c, 0x00, 0xc4, 0x1c, 0x01, 0x00, 0xf2, 0xf7, 0x66, 0xfe, 0x00, 0x28, 0xf1, 0xd0, 0xfa, 0xf7, 0x76, 0xfd, 0xb0, 0xbd, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x20, 0xef, 0xf7, 0xd6, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x20, 0xef, 0xf7, 0xd0, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0xac, 0x21, 0x09, 0x5c, 0x02, 0x4a, 0x09, 0x02, 0x89, 0x18, 0xc0, 0x31, 0x81, 0x60, 0x70, 0x47, 0x3c, 0x00, 0x00, 0x1d, 0x01, 0x00, 0x70, 0x75, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x28, 0x04, 0xd1, 0x03, 0xc9, 0x09, 0x68, 0xee, 0xf7, 0x64, 0xfb, 0x80, 0xbd, 0x01, 0x21, 0x14, 0x20, 0xef, 0xf7, 0xc4, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x28, 0x02, 0xd1, 0x02, 0x48, 0x40, 0x68, 0x70, 0x47, 0x40, 0x68, 0x70, 0x47, 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, 0x10, 0xb5, 0x00, 0x24, 0xf8, 0xf7, 0x1c, 0xfb, 0x3c, 0x00, 0x3c, 0x1d, 0x01, 0x00, 0x00, 0x28, 0x04, 0xd0, 0x40, 0x30, 0x80, 0x7a, 0x05, 0x28, 0x00, 0xd1, 0x01, 0x24, 0x20, 0x1c, 0x10, 0xbd, 0x00, 0x00, 0x04, 0x48, 0x00, 0x21, 0x40, 0x68, 0x01, 0xe0, 0x01, 0x63, 0x40, 0x68, 0x00, 0x28, 0xfb, 0xd1, 0x70, 0x47, 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, 0xf7, 0xf7, 0xa5, 0xf8, 0x40, 0x34, 0xe5, 0x72, 0xb0, 0xbd, 0x3c, 0x00, 0x78, 0x1d, 0x01, 0x00, 0xf8, 0xb5, 0x07, 0x1c, 0xf8, 0xf7, 0xfa, 0xfa, 0x04, 0x1c, 0x04, 0xd0, 0x05, 0x21, 0x14, 0x20, 0xef, 0xf7, 0x8c, 0xfa, 0x28, 0xe0, 0x00, 0x25, 0x14, 0x49, 0x28, 0x02, 0x46, 0x18, 0x30, 0x1c, 0x44, 0x30, 0x06, 0x22, 0x12, 0x49, 0xee, 0xf7, 0x2d, 0xfb, 0x00, 0x28, 0x02, 0xd1, 0xac, 0x20, 0x85, 0x55, 0x34, 0x1c, 0x01, 0x35, 0x03, 0x2d, 0xee, 0xd3, 0x00, 0x2c, 0x3c, 0x00, 0xb4, 0x1d, 0x01, 0x00, 0x14, 0xd0, 0x39, 0x1c, 0x20, 0x1c, 0xf8, 0xf7, 0x2b, 0xf8, 0x09, 0x49, 0x00, 0x20, 0x20, 0x60, 0x18, 0x39, 0x48, 0x68, 0x60, 0x60, 0x00, 0x28, 0x00, 0xd0, 0x04, 0x60, 0x4c, 0x60, 0xca, 0x68, 0x00, 0x2a, 0x03, 0xd0, 0x01, 0x21, 0x20, 0x1c, 0xee, 0xf7, 0xfe, 0xfa, 0x20, 0x1c, 0xf8, 0xbd, 0x70, 0x75, 0x01, 0x00, 0x58, 0x46, 0x01, 0x00, 0x80, 0xb5, 0xf8, 0xf7, 0x3c, 0x00, 0xf0, 0x1d, 0x01, 0x00, 0xc1, 0xfa, 0x00, 0x28, 0x04, 0xd1, 0x06, 0x21, 0x14, 0x20, 0xef, 0xf7, 0x53, 0xfa, 0x80, 0xbd, 0xf5, 0xf7, 0x16, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0xf8, 0xf7, 0xb3, 0xfa, 0x80, 0xbd, 0x10, 0xb5, 0x09, 0x4c, 0x21, 0x88, 0x02, 0x29, 0x03, 0xd1, 0x14, 0x20, 0xef, 0xf7, 0x42, 0xfa, 0x04, 0xe0, 0xa3, 0x68, 0x8a, 0x00, 0x98, 0x50, 0x48, 0x1c, 0x20, 0x80, 0x3c, 0x00, 0x2c, 0x1e, 0x01, 0x00, 0x20, 0x88, 0x01, 0x38, 0x00, 0x04, 0x00, 0x0c, 0x10, 0xbd, 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, 0x0b, 0x1c, 0x11, 0x1c, 0x08, 0x4a, 0x80, 0xb5, 0x12, 0x88, 0x90, 0x42, 0x06, 0xd2, 0xda, 0x68, 0xc0, 0x00, 0x12, 0x18, 0x14, 0x20, 0x01, 0xf0, 0xbb, 0xfb, 0x80, 0xbd, 0x03, 0x21, 0x14, 0x20, 0xef, 0xf7, 0x22, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, 0x3c, 0x00, 0x68, 0x1e, 0x01, 0x00, 0x08, 0x4a, 0x80, 0xb5, 0x12, 0x88, 0x90, 0x42, 0x06, 0xd2, 0xc9, 0x68, 0xc0, 0x00, 0x09, 0x18, 0x14, 0x20, 0x01, 0xf0, 0xdb, 0xfb, 0x80, 0xbd, 0x04, 0x21, 0x14, 0x20, 0xef, 0xf7, 0x0e, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, 0x01, 0x49, 0xc8, 0x60, 0x70, 0x47, 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, 0x80, 0xb5, 0x06, 0x22, 0x44, 0x30, 0xee, 0xf7, 0x3c, 0x00, 0xa4, 0x1e, 0x01, 0x00, 0xab, 0xfa, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x80, 0xbd, 0x00, 0x20, 0x80, 0xbd, 0x00, 0x00, 0x1c, 0xb5, 0x14, 0x4c, 0x20, 0x69, 0x00, 0x28, 0x23, 0xd0, 0x20, 0x78, 0x0a, 0x28, 0x01, 0xd0, 0x00, 0xf0, 0xfc, 0xf8, 0x00, 0x20, 0x60, 0x61, 0x0f, 0x48, 0x40, 0x79, 0xa0, 0x70, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x28, 0x15, 0xd1, 0xfd, 0xf7, 0xed, 0xfe, 0x01, 0x90, 0x3c, 0x00, 0xe0, 0x1e, 0x01, 0x00, 0xfd, 0xf7, 0x82, 0xfe, 0x00, 0x90, 0x00, 0xab, 0x18, 0x79, 0x19, 0x78, 0x40, 0x1a, 0x18, 0x71, 0x58, 0x79, 0x59, 0x78, 0x40, 0x1a, 0x58, 0x71, 0x01, 0x98, 0xf2, 0xf7, 0x89, 0xfe, 0x05, 0x20, 0x20, 0x70, 0x00, 0xf0, 0xbf, 0xf9, 0x1c, 0xbd, 0x7c, 0x78, 0x01, 0x00, 0x0c, 0x5a, 0x01, 0x00, 0x08, 0xb5, 0x04, 0x4a, 0x00, 0x90, 0x14, 0x32, 0x00, 0x20, 0x02, 0x4b, 0x3c, 0x00, 0x1c, 0x1f, 0x01, 0x00, 0x02, 0x49, 0xf1, 0xf7, 0x7d, 0xf9, 0x08, 0xbd, 0x2c, 0x75, 0x01, 0x00, 0xb1, 0xa8, 0x00, 0x00, 0xb0, 0xb5, 0x00, 0x28, 0x06, 0xd0, 0x01, 0x28, 0x06, 0xd0, 0x02, 0x28, 0x07, 0xd1, 0x0c, 0x4c, 0x01, 0x25, 0x07, 0xe0, 0x0b, 0x4c, 0x04, 0xe0, 0x0a, 0x4c, 0x2a, 0x3c, 0x01, 0xe0, 0x08, 0x4c, 0xb6, 0x34, 0x00, 0x25, 0x00, 0xf0, 0x2c, 0xff, 0x07, 0x49, 0x89, 0x6e, 0x3c, 0x00, 0x58, 0x1f, 0x01, 0x00, 0x09, 0x19, 0x09, 0x1a, 0xa1, 0x42, 0x00, 0xd9, 0x00, 0x21, 0x2a, 0x1c, 0x16, 0x20, 0x01, 0xf0, 0x31, 0xfb, 0xb0, 0xbd, 0x71, 0x02, 0x00, 0x00, 0x0c, 0x05, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x8c, 0xb5, 0x00, 0xab, 0x8e, 0x21, 0x19, 0x80, 0xfc, 0xf7, 0x38, 0xf9, 0x01, 0x90, 0x68, 0x46, 0xfb, 0xf7, 0xa6, 0xfa, 0x8c, 0xbd, 0x00, 0x00, 0xbf, 0xb5, 0x13, 0x4a, 0x3c, 0x00, 0x94, 0x1f, 0x01, 0x00, 0x01, 0x91, 0x0d, 0x1c, 0x11, 0x7c, 0x88, 0x43, 0x04, 0x1c, 0x21, 0x43, 0x08, 0x1c, 0x10, 0x74, 0xa0, 0x07, 0x0b, 0xd5, 0x0e, 0x48, 0x00, 0x90, 0x01, 0x20, 0x02, 0x90, 0x00, 0xf0, 0xfc, 0xfe, 0x0c, 0x49, 0x40, 0x18, 0x03, 0x90, 0x68, 0x46, 0xf9, 0xf7, 0x6a, 0xff, 0xe0, 0x07, 0x0c, 0xd5, 0xf1, 0xf7, 0x2c, 0xfd, 0x00, 0x28, 0x03, 0xd0, 0x07, 0x48, 0x85, 0x42, 0x3c, 0x00, 0xd0, 0x1f, 0x01, 0x00, 0x00, 0xd2, 0x01, 0x90, 0x06, 0x48, 0x00, 0x90, 0x68, 0x46, 0xf9, 0xf7, 0x09, 0xff, 0xbf, 0xbd, 0x78, 0x69, 0x01, 0x00, 0x81, 0xea, 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0xa0, 0x86, 0x01, 0x00, 0x75, 0xea, 0x00, 0x00, 0x10, 0xb5, 0x0a, 0x4c, 0x60, 0x69, 0x00, 0x28, 0x0e, 0xd1, 0x01, 0x20, 0x60, 0x61, 0xa1, 0x68, 0x07, 0x48, 0xfd, 0xf7, 0xcb, 0xf9, 0x00, 0x21, 0x3c, 0x00, 0x0c, 0x20, 0x01, 0x00, 0xa0, 0x68, 0xf9, 0xf7, 0xd1, 0xfb, 0x01, 0x22, 0x07, 0x20, 0x04, 0x49, 0x01, 0xf0, 0xd8, 0xfa, 0x10, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x98, 0x3a, 0x00, 0x00, 0x10, 0xb5, 0x0c, 0x1c, 0x11, 0x1c, 0x06, 0x4a, 0x00, 0x2b, 0x10, 0x70, 0x03, 0xd0, 0x00, 0x28, 0x02, 0xd1, 0xf9, 0xf7, 0xf5, 0xfd, 0x10, 0xbd, 0x20, 0x1c, 0xf9, 0xf7, 0x3c, 0x00, 0x48, 0x20, 0x01, 0x00, 0x01, 0xfe, 0x10, 0xbd, 0xa0, 0x79, 0x01, 0x00, 0xb0, 0xb5, 0x0a, 0x4c, 0x05, 0x1c, 0xe3, 0x6a, 0x20, 0x1f, 0x01, 0x33, 0xe3, 0x62, 0x00, 0x88, 0x00, 0x29, 0x06, 0xd0, 0xa1, 0x68, 0x89, 0x18, 0x21, 0x61, 0x05, 0x4a, 0x00, 0xf0, 0xfc, 0xfe, 0x01, 0xe0, 0x00, 0xf0, 0xcf, 0xfe, 0x25, 0x77, 0xb0, 0xbd, 0x00, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x55, 0xe3, 0x00, 0x00, 0x3c, 0x00, 0x84, 0x20, 0x01, 0x00, 0x01, 0x1c, 0x03, 0x48, 0x80, 0xb5, 0x40, 0x88, 0xff, 0xf7, 0xec, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x98, 0x7c, 0x01, 0x00, 0x03, 0x48, 0x80, 0xb5, 0xc1, 0x68, 0x18, 0x38, 0x80, 0x88, 0xff, 0xf7, 0xe1, 0xfe, 0x80, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x21, 0x16, 0x20, 0x01, 0xf0, 0xbf, 0xfa, 0x01, 0x21, 0x16, 0x20, 0x01, 0xf0, 0xbb, 0xfa, 0x80, 0xbd, 0x3c, 0x00, 0xc0, 0x20, 0x01, 0x00, 0x10, 0xb5, 0x0b, 0x4c, 0x20, 0x78, 0x0a, 0x28, 0x10, 0xd0, 0x01, 0x20, 0x60, 0x61, 0x0a, 0x21, 0x13, 0x20, 0x01, 0xf0, 0xaf, 0xfa, 0x0a, 0x20, 0x60, 0x70, 0x20, 0x70, 0xfd, 0xf7, 0x3c, 0xfb, 0x01, 0x20, 0xfd, 0xf7, 0xe9, 0xfb, 0x00, 0x20, 0xfa, 0xf7, 0xc4, 0xf9, 0x10, 0xbd, 0x00, 0x00, 0x7c, 0x78, 0x01, 0x00, 0x10, 0xb5, 0x0c, 0x4c, 0x00, 0x20, 0x0b, 0x49, 0x3c, 0x00, 0xfc, 0x20, 0x01, 0x00, 0x20, 0x63, 0xe0, 0x62, 0x50, 0x39, 0x88, 0x61, 0x20, 0x70, 0x08, 0x48, 0x38, 0x21, 0x0c, 0x38, 0x00, 0x7a, 0x08, 0x55, 0x81, 0x21, 0x18, 0x20, 0x01, 0xf0, 0x8e, 0xfa, 0x20, 0x69, 0x01, 0x28, 0x02, 0xd1, 0x00, 0x20, 0xf5, 0xf7, 0x3e, 0xfb, 0x10, 0xbd, 0x00, 0x00, 0xf4, 0x6e, 0x01, 0x00, 0xb0, 0xb5, 0x1c, 0x4c, 0x00, 0x25, 0x2c, 0x22, 0x01, 0x1d, 0x20, 0x1c, 0x3c, 0x00, 0x38, 0x21, 0x01, 0x00, 0x9a, 0xb0, 0xee, 0xf7, 0x39, 0xfa, 0x18, 0x49, 0x2c, 0x31, 0x08, 0x1c, 0x00, 0x7a, 0x8a, 0x69, 0x00, 0x2a, 0x13, 0xd1, 0x02, 0x28, 0x03, 0xd1, 0xa0, 0x68, 0x00, 0x28, 0x20, 0xd0, 0x04, 0xe0, 0x00, 0x28, 0x1d, 0xd1, 0x60, 0x68, 0x00, 0x28, 0x1a, 0xd0, 0x80, 0x02, 0x88, 0x61, 0x0e, 0x48, 0x69, 0x46, 0x24, 0x38, 0x00, 0x68, 0xef, 0xf7, 0xcb, 0xfb, 0x11, 0xe0, 0x3c, 0x00, 0x74, 0x21, 0x01, 0x00, 0x00, 0x22, 0x02, 0x28, 0x03, 0xd1, 0xa0, 0x68, 0x00, 0x28, 0x09, 0xd1, 0x04, 0xe0, 0x00, 0x28, 0x08, 0xd1, 0x60, 0x68, 0x00, 0x28, 0x03, 0xd1, 0x8a, 0x61, 0xff, 0xf7, 0xb1, 0xff, 0x01, 0xe0, 0x80, 0x02, 0x88, 0x61, 0x28, 0x1c, 0x1a, 0xb0, 0xb0, 0xbd, 0x00, 0x00, 0xc8, 0x6e, 0x01, 0x00, 0xf8, 0xb5, 0x0c, 0x49, 0x02, 0x20, 0x48, 0x60, 0x0b, 0x49, 0x00, 0x05, 0x3c, 0x00, 0xb0, 0x21, 0x01, 0x00, 0x08, 0x60, 0x0b, 0x4f, 0xb8, 0x68, 0xf9, 0x68, 0x7c, 0x68, 0x45, 0x1a, 0x2e, 0x1c, 0x04, 0xe0, 0xa0, 0x68, 0x61, 0x68, 0xee, 0xf7, 0x09, 0xf9, 0x24, 0x68, 0x01, 0x3d, 0xf8, 0xd2, 0x7c, 0x60, 0xf8, 0x68, 0x80, 0x19, 0xf8, 0x60, 0xf8, 0xbd, 0x40, 0x20, 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0x44, 0xe3, 0x01, 0x00, 0xf8, 0xb5, 0x1f, 0x4e, 0x04, 0x1c, 0x30, 0x69, 0x3c, 0x00, 0xec, 0x21, 0x01, 0x00, 0x01, 0x21, 0xf9, 0xf7, 0x99, 0xfa, 0x1d, 0x49, 0x60, 0x00, 0x40, 0x18, 0x10, 0x38, 0x81, 0x7b, 0x1b, 0x4a, 0x51, 0x72, 0xc0, 0x7b, 0x10, 0x74, 0x1a, 0x4f, 0x1b, 0x4d, 0x0e, 0x2c, 0x0a, 0xd1, 0x01, 0x22, 0x02, 0x21, 0x08, 0x20, 0x01, 0xf0, 0xf3, 0xfb, 0x03, 0x20, 0xff, 0x21, 0x41, 0x31, 0x39, 0x86, 0x14, 0x21, 0x08, 0xe0, 0x02, 0x22, 0x01, 0x21, 0x08, 0x20, 0x3c, 0x00, 0x28, 0x22, 0x01, 0x00, 0x01, 0xf0, 0xe8, 0xfb, 0x12, 0x49, 0x02, 0x20, 0x39, 0x86, 0x10, 0x21, 0xa9, 0x71, 0xe8, 0x71, 0x10, 0x48, 0x11, 0x4a, 0x00, 0x19, 0x10, 0x38, 0xc0, 0x7b, 0x00, 0x28, 0x03, 0xd0, 0x01, 0x21, 0x51, 0x73, 0x10, 0x73, 0x01, 0xe0, 0x00, 0x20, 0x50, 0x73, 0x00, 0x21, 0x20, 0x1c, 0xfd, 0xf7, 0xe5, 0xfd, 0x30, 0x69, 0xf9, 0xf7, 0x08, 0xfb, 0xf8, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x64, 0x22, 0x01, 0x00, 0x40, 0x7c, 0x01, 0x00, 0x76, 0x46, 0x01, 0x00, 0x0c, 0x80, 0x07, 0x00, 0x30, 0x80, 0x07, 0x00, 0x00, 0x80, 0x07, 0x00, 0xff, 0x01, 0x00, 0x00, 0x5c, 0x57, 0x01, 0x00, 0xd0, 0x80, 0x07, 0x00, 0x10, 0xb5, 0x15, 0x4c, 0x14, 0x4a, 0x21, 0x78, 0x00, 0x20, 0x18, 0x32, 0x05, 0x29, 0x1d, 0xd0, 0x06, 0x29, 0x1b, 0xd0, 0x07, 0x29, 0x01, 0xd0, 0x08, 0x29, 0x06, 0xd1, 0x3c, 0x00, 0xa0, 0x22, 0x01, 0x00, 0x91, 0x68, 0x05, 0x20, 0x10, 0x29, 0x00, 0xdb, 0x06, 0x20, 0x20, 0x70, 0x01, 0x20, 0xa1, 0x78, 0x00, 0x28, 0x61, 0x70, 0x0b, 0xd0, 0x00, 0x20, 0xfa, 0xf7, 0xdc, 0xf8, 0x00, 0x21, 0x60, 0x78, 0xf4, 0xf7, 0x3c, 0xfa, 0x0a, 0x22, 0x1e, 0x21, 0x13, 0x20, 0x01, 0xf0, 0x7f, 0xf9, 0x10, 0xbd, 0xd1, 0x69, 0x07, 0x20, 0x10, 0x29, 0xe8, 0xdb, 0x08, 0x20, 0xe6, 0xe7, 0x3c, 0x00, 0xdc, 0x22, 0x01, 0x00, 0x7c, 0x78, 0x01, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x01, 0x1c, 0x04, 0x1c, 0x44, 0x31, 0x00, 0x20, 0xf6, 0xf7, 0x40, 0xfa, 0x30, 0x34, 0x00, 0x2d, 0x07, 0xd0, 0x0e, 0xc8, 0x0e, 0xc4, 0x08, 0xc8, 0x10, 0x38, 0x08, 0xc4, 0xf4, 0xf7, 0xc4, 0xf9, 0xb0, 0xbd, 0x1e, 0xcc, 0x1e, 0xc0, 0xb0, 0xbd, 0xf8, 0xb5, 0x08, 0x1c, 0x11, 0x1c, 0xf4, 0xf7, 0x87, 0xfa, 0x08, 0x4c, 0x3c, 0x00, 0x18, 0x23, 0x01, 0x00, 0x00, 0x25, 0x08, 0x4e, 0x08, 0x4f, 0x06, 0xe0, 0x30, 0x6b, 0x00, 0x28, 0x03, 0xd0, 0x35, 0x63, 0x20, 0x68, 0xee, 0xf7, 0x55, 0xf8, 0x38, 0x68, 0x00, 0x28, 0xf5, 0xd0, 0xf8, 0xbd, 0x00, 0x00, 0x5c, 0x5b, 0x01, 0x00, 0xe4, 0xfe, 0x01, 0x00, 0x84, 0x5a, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x06, 0x00, 0x0e, 0x00, 0xf0, 0x07, 0xf8, 0x80, 0xbd, 0x80, 0xb5, 0x0a, 0x1c, 0x3c, 0x00, 0x54, 0x23, 0x01, 0x00, 0x23, 0x21, 0x01, 0xf0, 0x2b, 0xfa, 0x80, 0xbd, 0xb0, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x12, 0x28, 0x03, 0xd3, 0x01, 0x21, 0x23, 0x20, 0xee, 0xf7, 0x9b, 0xff, 0x06, 0x49, 0xa0, 0x00, 0x08, 0x58, 0x04, 0xe0, 0x12, 0xc8, 0x28, 0x1c, 0xee, 0xf7, 0x2e, 0xf8, 0x20, 0x1c, 0x00, 0x28, 0xf8, 0xd1, 0xb0, 0xbd, 0x00, 0x00, 0x68, 0x5b, 0x01, 0x00, 0xf8, 0xb5, 0x0e, 0x1c, 0x3c, 0x00, 0x90, 0x23, 0x01, 0x00, 0x00, 0x25, 0x04, 0x1c, 0x12, 0x28, 0x03, 0xd3, 0x01, 0x21, 0x23, 0x20, 0xee, 0xf7, 0x82, 0xff, 0x13, 0x48, 0xa7, 0x00, 0xc4, 0x59, 0x08, 0xe0, 0x20, 0x68, 0xb0, 0x42, 0x03, 0xd1, 0x03, 0x21, 0x23, 0x20, 0xee, 0xf7, 0x77, 0xff, 0x25, 0x1c, 0x64, 0x68, 0x00, 0x2c, 0xf4, 0xd1, 0x0c, 0x4a, 0x04, 0x3a, 0x10, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x41, 0x68, 0x11, 0x60, 0x3c, 0x00, 0xcc, 0x23, 0x01, 0x00, 0x00, 0x28, 0x04, 0xd1, 0x02, 0x21, 0x23, 0x20, 0xee, 0xf7, 0x66, 0xff, 0xf8, 0xbd, 0x00, 0x21, 0x41, 0x60, 0x06, 0x60, 0x00, 0x2d, 0x01, 0xd0, 0x68, 0x60, 0xf7, 0xe7, 0x01, 0x49, 0xc8, 0x51, 0xf4, 0xe7, 0x00, 0x00, 0x68, 0x5b, 0x01, 0x00, 0x70, 0xb5, 0x0e, 0x1c, 0x05, 0x1c, 0x00, 0x24, 0x12, 0x28, 0x03, 0xd3, 0x01, 0x21, 0x23, 0x20, 0xee, 0xf7, 0x4e, 0xff, 0x3c, 0x00, 0x08, 0x24, 0x01, 0x00, 0x0d, 0x4b, 0xaa, 0x00, 0x98, 0x58, 0x04, 0xe0, 0x01, 0x68, 0xb1, 0x42, 0x04, 0xd0, 0x04, 0x1c, 0x40, 0x68, 0x00, 0x28, 0xf8, 0xd1, 0x70, 0xbd, 0x00, 0x28, 0xfc, 0xd0, 0x00, 0x2c, 0x41, 0x68, 0x01, 0xd1, 0x99, 0x50, 0x00, 0xe0, 0x61, 0x60, 0x00, 0x21, 0x03, 0x4a, 0x01, 0x60, 0x04, 0x3a, 0x11, 0x68, 0x41, 0x60, 0x10, 0x60, 0x70, 0xbd, 0x68, 0x5b, 0x01, 0x00, 0x3c, 0x00, 0x44, 0x24, 0x01, 0x00, 0xf3, 0xb5, 0x81, 0xb0, 0x00, 0x28, 0x17, 0xd0, 0x01, 0x78, 0xff, 0x29, 0x14, 0xd0, 0x45, 0x78, 0x44, 0x19, 0x02, 0x34, 0x80, 0x27, 0x01, 0x3c, 0x26, 0x78, 0x01, 0x3d, 0xbe, 0x43, 0x30, 0x1c, 0xf8, 0xf7, 0x82, 0xfc, 0x01, 0x21, 0x81, 0x40, 0x02, 0x98, 0x01, 0x40, 0x02, 0xd0, 0x3e, 0x43, 0x30, 0x1c, 0x20, 0x70, 0x00, 0x2d, 0xee, 0xd1, 0xfe, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x80, 0x24, 0x01, 0x00, 0x10, 0x4b, 0x10, 0xb5, 0x59, 0x68, 0x41, 0x1a, 0x0f, 0x29, 0x0d, 0xdc, 0x0e, 0x22, 0xd2, 0x43, 0x91, 0x42, 0x09, 0xdb, 0x1a, 0x1c, 0x92, 0x68, 0x00, 0x29, 0x01, 0xdd, 0x00, 0x2a, 0x03, 0xda, 0x00, 0x29, 0x0d, 0xda, 0x00, 0x2a, 0x0b, 0xdc, 0x04, 0x33, 0x03, 0xc3, 0xfd, 0xf7, 0x10, 0xfd, 0x04, 0x1c, 0xfd, 0xf7, 0x13, 0xfd, 0x00, 0x28, 0x02, 0xd0, 0x20, 0x1c, 0x3c, 0x00, 0xbc, 0x24, 0x01, 0x00, 0xff, 0xf7, 0x92, 0xfe, 0x10, 0xbd, 0x00, 0x00, 0x18, 0x63, 0x01, 0x00, 0xf8, 0xb5, 0x64, 0x4c, 0x07, 0x1c, 0x60, 0x78, 0xa1, 0x78, 0x88, 0x42, 0x0f, 0xd1, 0x08, 0x1c, 0xfd, 0xf7, 0xce, 0xf8, 0xe0, 0x60, 0x04, 0x20, 0x60, 0x70, 0x0a, 0x22, 0x1e, 0x21, 0x13, 0x20, 0x01, 0xf0, 0x70, 0xf8, 0x00, 0x21, 0x60, 0x78, 0xf4, 0xf7, 0x24, 0xf9, 0xf8, 0xbd, 0x04, 0x28, 0x3c, 0x00, 0xf8, 0x24, 0x01, 0x00, 0x6e, 0xd1, 0x58, 0x4e, 0xfd, 0xf7, 0xbc, 0xf8, 0x00, 0x90, 0x71, 0x78, 0x04, 0x1c, 0x00, 0x20, 0x05, 0x29, 0x21, 0xd2, 0x01, 0xa3, 0x5b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x0b, 0x0f, 0x14, 0x1a, 0x02, 0x00, 0x51, 0x48, 0x51, 0x49, 0x60, 0x43, 0x41, 0x18, 0x7d, 0x20, 0xc0, 0x00, 0xee, 0xf7, 0x87, 0xf8, 0x11, 0xe0, 0x87, 0x20, 0x60, 0x43, 0x4d, 0x49, 0x02, 0xe0, 0x3c, 0x00, 0x34, 0x25, 0x01, 0x00, 0x45, 0x20, 0x4d, 0x49, 0x60, 0x43, 0x40, 0x18, 0x08, 0xe0, 0x4c, 0x48, 0xcd, 0x21, 0x09, 0x01, 0x60, 0x43, 0x40, 0x1a, 0x02, 0xe0, 0x46, 0x20, 0x60, 0x43, 0x82, 0x38, 0x06, 0x06, 0x48, 0x48, 0x07, 0x21, 0x00, 0x79, 0x36, 0x16, 0x08, 0x1a, 0x00, 0x19, 0x00, 0x90, 0x68, 0x46, 0xfe, 0xf7, 0x5f, 0xfd, 0x38, 0x1c, 0xfd, 0xf7, 0x2e, 0xfb, 0x00, 0x99, 0x42, 0x4a, 0x3c, 0x00, 0x70, 0x25, 0x01, 0x00, 0x49, 0x00, 0x51, 0x5a, 0x48, 0x43, 0x39, 0x49, 0x04, 0x1c, 0x88, 0x78, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x28, 0x1e, 0xd1, 0x35, 0x49, 0x00, 0x28, 0x03, 0xd1, 0x3a, 0x48, 0x05, 0x78, 0x04, 0x20, 0x02, 0xe0, 0x38, 0x48, 0x45, 0x78, 0x0c, 0x20, 0x30, 0x49, 0xc9, 0x68, 0x49, 0x1b, 0x08, 0x18, 0x00, 0x90, 0x68, 0x46, 0xfe, 0xf7, 0x3e, 0xfd, 0x00, 0x98, 0x33, 0x49, 0x3c, 0x00, 0xac, 0x25, 0x01, 0x00, 0x40, 0x00, 0x20, 0x31, 0x08, 0x5a, 0x2a, 0x49, 0x44, 0x43, 0xc8, 0x68, 0xa8, 0x42, 0x01, 0xd9, 0x01, 0x25, 0x00, 0xe0, 0x00, 0x25, 0x2e, 0x48, 0x21, 0x18, 0x40, 0x00, 0xee, 0xf7, 0xa2, 0xf8, 0x04, 0x1c, 0x00, 0x2d, 0x03, 0xd0, 0xfd, 0xf7, 0xc3, 0xfa, 0x02, 0xe0, 0x3d, 0xe0, 0xfd, 0xf7, 0xf3, 0xfa, 0x00, 0x2f, 0x02, 0xd1, 0x25, 0x48, 0x0e, 0x38, 0x01, 0xe0, 0x3c, 0x00, 0xe8, 0x25, 0x01, 0x00, 0x23, 0x48, 0x0a, 0x38, 0x01, 0x68, 0x61, 0x1a, 0xcb, 0x1c, 0x01, 0xdb, 0x03, 0x29, 0x00, 0xdd, 0x04, 0x60, 0x01, 0x68, 0xa1, 0x42, 0x01, 0xd2, 0x01, 0x31, 0x04, 0xe0, 0xa1, 0x42, 0x03, 0xd9, 0x00, 0x29, 0x01, 0xd0, 0x01, 0x39, 0x01, 0x60, 0x01, 0x68, 0x38, 0x1c, 0xfd, 0xf7, 0xc0, 0xfb, 0x10, 0x4c, 0x0a, 0x20, 0x60, 0x70, 0x0a, 0x22, 0x13, 0x20, 0xa1, 0x68, 0x3c, 0x00, 0x24, 0x26, 0x01, 0x00, 0x00, 0xf0, 0xd2, 0xff, 0x60, 0x68, 0x00, 0xf0, 0xf7, 0xfa, 0x00, 0x28, 0x00, 0xd1, 0x5f, 0xe7, 0x00, 0xf0, 0xba, 0xfb, 0x11, 0x49, 0x00, 0x23, 0x40, 0x18, 0x0e, 0x49, 0x60, 0x60, 0x1e, 0x39, 0xc8, 0x56, 0xb0, 0x42, 0xf3, 0xd0, 0x0e, 0x70, 0x31, 0x1c, 0x00, 0x20, 0xff, 0xf7, 0x84, 0xfe, 0x4e, 0xe7, 0xff, 0xf7, 0x15, 0xfe, 0x4b, 0xe7, 0x7c, 0x78, 0x01, 0x00, 0x3c, 0x00, 0x60, 0x26, 0x01, 0x00, 0x60, 0xd7, 0xff, 0xff, 0x60, 0x8f, 0x01, 0x00, 0x54, 0x0b, 0x00, 0x00, 0xc9, 0x09, 0x00, 0x00, 0x8e, 0xfe, 0xff, 0xff, 0x0c, 0x5a, 0x01, 0x00, 0x12, 0x5a, 0x01, 0x00, 0x20, 0xa1, 0x07, 0x00, 0x40, 0x42, 0x0f, 0x00, 0x30, 0xb5, 0x0c, 0x4b, 0xfe, 0x24, 0x1b, 0x88, 0x04, 0x40, 0xc0, 0x07, 0x5d, 0x07, 0x6d, 0x0f, 0xdb, 0x08, 0xc0, 0x0f, 0x9c, 0x42, 0x0b, 0xd8, 0x3c, 0x00, 0x9c, 0x26, 0x01, 0x00, 0xa2, 0x18, 0x04, 0x3a, 0x9a, 0x42, 0x07, 0xd3, 0x1a, 0x1b, 0x89, 0x5c, 0x01, 0x22, 0xaa, 0x40, 0x11, 0x40, 0x01, 0xd0, 0x02, 0x21, 0x08, 0x43, 0x30, 0xbd, 0x00, 0x00, 0xfa, 0x60, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x28, 0x03, 0xd0, 0x01, 0x1c, 0x14, 0x20, 0xf5, 0xf7, 0xff, 0xfa, 0x80, 0xbd, 0xb0, 0xb5, 0x04, 0x1c, 0xf7, 0xf7, 0x08, 0xfd, 0x13, 0x4d, 0x00, 0x28, 0x3c, 0x00, 0xd8, 0x26, 0x01, 0x00, 0x1d, 0xd1, 0xa0, 0x07, 0x16, 0xd5, 0x02, 0x20, 0x84, 0x43, 0x11, 0x48, 0x01, 0x22, 0x2a, 0x62, 0x40, 0x68, 0x00, 0x28, 0x13, 0xd0, 0xf2, 0xf7, 0x51, 0xf9, 0x00, 0x28, 0x0f, 0xd1, 0x0b, 0x48, 0xe4, 0x30, 0x80, 0x7a, 0x01, 0x28, 0x00, 0xd0, 0x00, 0x22, 0x11, 0x1c, 0x01, 0x20, 0xf2, 0xf7, 0xa5, 0xf9, 0x04, 0xe0, 0x00, 0xf0, 0x4e, 0xfb, 0xe8, 0x61, 0xf2, 0xf7, 0x3c, 0x00, 0x14, 0x27, 0x01, 0x00, 0x6b, 0xf9, 0xa9, 0x6a, 0x00, 0x29, 0x02, 0xd0, 0x20, 0x1c, 0xed, 0xf7, 0x5c, 0xfe, 0xb0, 0xbd, 0x60, 0x6c, 0x01, 0x00, 0xb0, 0x57, 0x01, 0x00, 0x20, 0x48, 0xb0, 0xb5, 0x81, 0x68, 0x01, 0x29, 0x04, 0xd1, 0x00, 0x78, 0x00, 0x28, 0x01, 0xd1, 0xfd, 0xf7, 0x72, 0xfd, 0x1b, 0x4d, 0x80, 0x3d, 0x2c, 0x1c, 0x70, 0x34, 0x20, 0x78, 0x03, 0x38, 0x05, 0x28, 0x18, 0xd2, 0x3c, 0x00, 0x50, 0x27, 0x01, 0x00, 0x01, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x04, 0x15, 0x27, 0x27, 0x27, 0x00, 0xfb, 0xf7, 0xf1, 0xff, 0x60, 0x7b, 0x01, 0x1c, 0xff, 0x31, 0x61, 0x73, 0x00, 0x28, 0xf7, 0xd1, 0x04, 0x20, 0x20, 0x70, 0xa8, 0x89, 0xf8, 0xf7, 0xda, 0xf9, 0x01, 0x1c, 0x00, 0x22, 0x0f, 0x20, 0x00, 0xf0, 0x25, 0xff, 0xb0, 0xbd, 0xef, 0xf7, 0xce, 0xff, 0x6a, 0x21, 0x49, 0x5b, 0x3c, 0x00, 0x8c, 0x27, 0x01, 0x00, 0x88, 0x42, 0x0b, 0xd0, 0xe8, 0x89, 0xf8, 0xf7, 0xcb, 0xf9, 0x01, 0x1c, 0x00, 0x23, 0x00, 0x22, 0x0f, 0x20, 0x00, 0xf0, 0xf7, 0xff, 0x07, 0x20, 0x20, 0x70, 0xb0, 0xbd, 0xfd, 0xf7, 0x3a, 0xfe, 0xb0, 0xbd, 0x00, 0x00, 0x84, 0x66, 0x01, 0x00, 0xf0, 0xb5, 0x85, 0xb0, 0x04, 0x1c, 0x03, 0x80, 0x18, 0x0c, 0x60, 0x80, 0x0d, 0x1c, 0x51, 0x78, 0x10, 0x78, 0x09, 0x02, 0x3c, 0x00, 0xc8, 0x27, 0x01, 0x00, 0x48, 0x40, 0xa0, 0x80, 0xd1, 0x78, 0x90, 0x78, 0x09, 0x02, 0x48, 0x40, 0xe0, 0x80, 0x51, 0x79, 0x10, 0x79, 0x09, 0x02, 0x48, 0x40, 0x20, 0x81, 0x68, 0x46, 0x1a, 0x49, 0x14, 0x22, 0xed, 0xf7, 0xe3, 0xfe, 0x00, 0x23, 0x00, 0x20, 0xd9, 0x07, 0xc9, 0x0f, 0x8c, 0x46, 0x42, 0x00, 0x56, 0x07, 0x76, 0x0f, 0x61, 0x46, 0x89, 0x19, 0x49, 0x00, 0x6e, 0x5c, 0x49, 0x19, 0x3c, 0x00, 0x04, 0x28, 0x01, 0x00, 0x49, 0x78, 0x6f, 0x46, 0x09, 0x02, 0x4e, 0x40, 0x81, 0x00, 0x79, 0x58, 0x0f, 0x4f, 0x49, 0x00, 0x61, 0x5a, 0x01, 0x30, 0x4e, 0x40, 0x31, 0x06, 0x36, 0x0a, 0x76, 0x00, 0xc9, 0x0d, 0x79, 0x5a, 0xf6, 0x19, 0x01, 0x27, 0x7f, 0x02, 0xf6, 0x19, 0x36, 0x88, 0x71, 0x40, 0xa6, 0x5a, 0x89, 0x19, 0xa1, 0x52, 0x05, 0x28, 0xdc, 0xdb, 0x20, 0x89, 0xc0, 0x18, 0x01, 0x33, 0x3c, 0x00, 0x40, 0x28, 0x01, 0x00, 0x08, 0x2b, 0x20, 0x81, 0xd2, 0xdb, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xd8, 0x56, 0x01, 0x00, 0xd8, 0x52, 0x01, 0x00, 0xf0, 0xb5, 0x05, 0x1c, 0x0c, 0x1c, 0x1e, 0x1c, 0x00, 0x20, 0x89, 0xb0, 0x41, 0x00, 0x53, 0x5a, 0x01, 0x30, 0x06, 0xaf, 0x7b, 0x52, 0x05, 0x28, 0xf8, 0xdb, 0x10, 0x89, 0x00, 0xab, 0x3a, 0x49, 0x80, 0x19, 0x58, 0x84, 0x68, 0x46, 0x18, 0x22, 0x3c, 0x00, 0x7c, 0x28, 0x01, 0x00, 0xed, 0xf7, 0x98, 0xfe, 0x00, 0x20, 0x41, 0x00, 0x0a, 0x19, 0x52, 0x78, 0x63, 0x5c, 0x6f, 0x46, 0x12, 0x02, 0x53, 0x40, 0x82, 0x00, 0xba, 0x58, 0x06, 0xaf, 0x52, 0x00, 0xba, 0x5a, 0x31, 0x4f, 0x01, 0x30, 0x53, 0x40, 0x1a, 0x06, 0x1b, 0x0a, 0x5b, 0x00, 0xd2, 0x0d, 0xba, 0x5a, 0xdb, 0x19, 0x01, 0x27, 0x7f, 0x02, 0xdb, 0x19, 0x1b, 0x88, 0x5a, 0x40, 0x06, 0xab, 0x3c, 0x00, 0xb8, 0x28, 0x01, 0x00, 0x5b, 0x5a, 0xd2, 0x18, 0x06, 0xab, 0x5a, 0x52, 0x06, 0x28, 0xde, 0xdb, 0x61, 0x7b, 0x20, 0x7b, 0x00, 0xab, 0x09, 0x02, 0x48, 0x40, 0x59, 0x8c, 0x48, 0x40, 0x41, 0x08, 0xc0, 0x03, 0x48, 0x40, 0x19, 0x8b, 0x40, 0x18, 0x18, 0x83, 0xe1, 0x7b, 0xa0, 0x7b, 0x09, 0x02, 0x48, 0x40, 0x19, 0x8b, 0x48, 0x40, 0x41, 0x08, 0xc0, 0x03, 0x48, 0x40, 0x59, 0x8b, 0x40, 0x18, 0x3c, 0x00, 0xf4, 0x28, 0x01, 0x00, 0x58, 0x83, 0x02, 0x20, 0x41, 0x00, 0x06, 0xaa, 0x8a, 0x18, 0x20, 0x3a, 0xd2, 0x8b, 0x01, 0x30, 0x53, 0x08, 0xd2, 0x03, 0x5a, 0x40, 0x06, 0xab, 0x5b, 0x5a, 0xd2, 0x18, 0x06, 0xab, 0x5a, 0x52, 0x06, 0x28, 0xef, 0xdb, 0x30, 0x0a, 0x28, 0x70, 0x70, 0x04, 0x40, 0x0e, 0x20, 0x21, 0x08, 0x43, 0x68, 0x70, 0xae, 0x70, 0x61, 0x78, 0x20, 0x78, 0x00, 0xab, 0x09, 0x02, 0x3c, 0x00, 0x30, 0x29, 0x01, 0x00, 0x48, 0x40, 0x59, 0x8c, 0x48, 0x40, 0xc0, 0x05, 0x00, 0x0e, 0xe8, 0x70, 0x00, 0x20, 0x41, 0x00, 0x06, 0xaa, 0x53, 0x5a, 0x4a, 0x19, 0x01, 0x30, 0x13, 0x71, 0x06, 0xab, 0x59, 0x5a, 0x09, 0x0a, 0x51, 0x71, 0x06, 0x28, 0xf3, 0xdb, 0x09, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xec, 0x56, 0x01, 0x00, 0xd8, 0x52, 0x01, 0x00, 0xf0, 0xb5, 0x46, 0x68, 0x05, 0x1c, 0x60, 0x30, 0x3c, 0x00, 0x6c, 0x29, 0x01, 0x00, 0x85, 0xb0, 0x04, 0x90, 0x60, 0xe0, 0x68, 0x68, 0x0c, 0x21, 0x07, 0x69, 0x00, 0x20, 0xee, 0xf7, 0x2d, 0xfe, 0x70, 0x61, 0x01, 0x89, 0x04, 0x39, 0x09, 0x04, 0x09, 0x0c, 0x01, 0x81, 0x70, 0x69, 0x00, 0x68, 0x40, 0x18, 0x04, 0x21, 0xee, 0xf7, 0x21, 0xfe, 0xf0, 0x61, 0x70, 0x69, 0x20, 0x21, 0x04, 0x68, 0x04, 0x98, 0x04, 0x22, 0x40, 0x7b, 0x80, 0x01, 0x08, 0x43, 0x3c, 0x00, 0xa8, 0x29, 0x01, 0x00, 0xe0, 0x70, 0x28, 0x69, 0x40, 0x89, 0xa0, 0x70, 0x28, 0x69, 0x40, 0x89, 0x00, 0x0a, 0x20, 0x70, 0x29, 0x69, 0x0c, 0x31, 0xa0, 0x18, 0xed, 0xf7, 0x9b, 0xfd, 0x20, 0x78, 0x20, 0x21, 0x40, 0x06, 0x40, 0x0e, 0x08, 0x43, 0x60, 0x70, 0x28, 0x69, 0x0a, 0x30, 0x01, 0x88, 0x01, 0x31, 0x09, 0x04, 0x09, 0x0c, 0x01, 0x80, 0x04, 0xd1, 0x28, 0x69, 0x0c, 0x30, 0x01, 0x68, 0x3c, 0x00, 0xe4, 0x29, 0x01, 0x00, 0x01, 0x31, 0x01, 0x60, 0x35, 0x62, 0x61, 0x79, 0x20, 0x79, 0x09, 0x02, 0x40, 0x18, 0xa1, 0x79, 0x09, 0x04, 0x40, 0x18, 0xe1, 0x79, 0x09, 0x06, 0x43, 0x18, 0x00, 0x93, 0xa0, 0x78, 0x21, 0x78, 0x09, 0x02, 0x40, 0x18, 0x04, 0x04, 0x24, 0x0c, 0x10, 0x20, 0xee, 0xf7, 0x13, 0xff, 0xb0, 0x61, 0x28, 0x69, 0x3a, 0x1c, 0x01, 0x68, 0x00, 0x9b, 0x01, 0xa8, 0x0a, 0x32, 0x3c, 0x00, 0x20, 0x2a, 0x01, 0x00, 0xff, 0xf7, 0xc8, 0xfe, 0x28, 0x69, 0x23, 0x1c, 0x01, 0x68, 0xb0, 0x69, 0x01, 0xaa, 0xff, 0xf7, 0x11, 0xff, 0x36, 0x68, 0x00, 0x2e, 0x9c, 0xd1, 0x03, 0x49, 0x04, 0x48, 0x6a, 0x68, 0xf7, 0xf7, 0x63, 0xfb, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xfd, 0x6b, 0x00, 0x00, 0xa0, 0x6a, 0x01, 0x00, 0x01, 0x38, 0x07, 0x49, 0x40, 0x00, 0x09, 0x5c, 0x00, 0x29, 0x06, 0xd0, 0x3c, 0x00, 0x5c, 0x2a, 0x01, 0x00, 0x04, 0x49, 0x1c, 0x39, 0x08, 0x5c, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0xe6, 0x78, 0x01, 0x00, 0xfe, 0xb5, 0x05, 0x1c, 0x00, 0x20, 0x02, 0x90, 0x13, 0x48, 0x17, 0x1c, 0x00, 0x68, 0x0c, 0x1c, 0x86, 0x78, 0x30, 0x1c, 0xfd, 0xf7, 0x28, 0xfa, 0x00, 0x28, 0x01, 0xd1, 0x02, 0x98, 0xfe, 0xbd, 0x00, 0x2d, 0x08, 0xd1, 0x3c, 0x00, 0x98, 0x2a, 0x01, 0x00, 0x20, 0x68, 0x00, 0xab, 0x18, 0x71, 0x60, 0x68, 0x58, 0x71, 0xa0, 0x68, 0x98, 0x71, 0x03, 0x20, 0x38, 0x80, 0x29, 0x1c, 0x30, 0x1c, 0x01, 0xaa, 0x00, 0xf0, 0x0e, 0xf8, 0x00, 0x2d, 0xec, 0xd0, 0x00, 0xab, 0x19, 0x79, 0x21, 0x60, 0x59, 0x79, 0x61, 0x60, 0x99, 0x79, 0xa1, 0x60, 0x0c, 0x21, 0x39, 0x80, 0xe2, 0xe7, 0xf8, 0x6b, 0x01, 0x00, 0xf8, 0xb5, 0x15, 0x1c, 0x3c, 0x00, 0xd4, 0x2a, 0x01, 0x00, 0x42, 0x1e, 0x01, 0x38, 0x47, 0x00, 0x3f, 0x18, 0x1f, 0x48, 0x3e, 0x18, 0x00, 0x29, 0x06, 0xd0, 0x01, 0x24, 0x03, 0x22, 0x31, 0x1c, 0x28, 0x1c, 0xed, 0xf7, 0x04, 0xfd, 0x32, 0xe0, 0x68, 0x78, 0x01, 0x24, 0x00, 0x28, 0x05, 0xd0, 0x29, 0x78, 0x08, 0x18, 0x01, 0x38, 0x0e, 0x28, 0x00, 0xd9, 0x00, 0x24, 0x00, 0x2c, 0x26, 0xd0, 0x00, 0x2a, 0x07, 0xd1, 0x2a, 0x21, 0x3c, 0x00, 0x10, 0x2b, 0x01, 0x00, 0x12, 0x48, 0xed, 0xf7, 0x9f, 0xfc, 0x1c, 0x21, 0x11, 0x48, 0xed, 0xf7, 0x9b, 0xfc, 0x0f, 0x48, 0x03, 0x22, 0x29, 0x1c, 0x30, 0x1c, 0xed, 0xf7, 0xe7, 0xfc, 0x0c, 0x48, 0x71, 0x78, 0xc0, 0x5d, 0xb2, 0x78, 0x00, 0x29, 0x0e, 0xd0, 0x00, 0x2a, 0x0c, 0xd0, 0x01, 0x22, 0x43, 0x18, 0x08, 0x4d, 0x06, 0xe0, 0x41, 0x00, 0x49, 0x19, 0x10, 0x39, 0x8a, 0x73, 0xb7, 0x78, 0x3c, 0x00, 0x4c, 0x2b, 0x01, 0x00, 0x01, 0x30, 0xcf, 0x73, 0x83, 0x42, 0xf6, 0xd8, 0xfe, 0xf7, 0x60, 0xf8, 0x20, 0x1c, 0xf8, 0xbd, 0xeb, 0x62, 0x01, 0x00, 0xca, 0x78, 0x01, 0x00, 0x70, 0xb5, 0x05, 0x1c, 0x1c, 0x48, 0x00, 0x23, 0xc0, 0x56, 0x43, 0x1c, 0x32, 0xd1, 0xa8, 0x7a, 0xf8, 0xf7, 0x0c, 0xf9, 0x00, 0x26, 0x00, 0x28, 0x18, 0x4c, 0x08, 0xd0, 0xe8, 0x69, 0xe1, 0x6b, 0x00, 0x29, 0x0b, 0xd1, 0x3c, 0x00, 0x88, 0x2b, 0x01, 0x00, 0x66, 0x63, 0x01, 0x21, 0xe1, 0x63, 0xa6, 0x63, 0x06, 0xe0, 0xa8, 0x69, 0xe1, 0x6b, 0x00, 0x29, 0x02, 0xd0, 0x66, 0x63, 0xa6, 0x63, 0xe6, 0x63, 0xa1, 0x6b, 0x01, 0x31, 0xa1, 0x63, 0x82, 0x03, 0x01, 0xd5, 0x0e, 0x4a, 0x10, 0x43, 0xe2, 0x6b, 0x00, 0x2a, 0x00, 0xd0, 0x40, 0x42, 0x62, 0x6b, 0x10, 0x18, 0x60, 0x63, 0x08, 0x29, 0x0b, 0xd1, 0x00, 0x28, 0x01, 0xdd, 0x3c, 0x00, 0xc4, 0x2b, 0x01, 0x00, 0x01, 0x20, 0x03, 0xe0, 0x00, 0x28, 0x03, 0xda, 0x00, 0x20, 0xc0, 0x43, 0xef, 0xf7, 0x62, 0xfe, 0x66, 0x63, 0xa6, 0x63, 0x70, 0xbd, 0x00, 0x00, 0xf4, 0x6b, 0x01, 0x00, 0x84, 0x6a, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x0c, 0x21, 0x05, 0x4a, 0x41, 0x43, 0x89, 0x18, 0x80, 0xb5, 0x89, 0x78, 0x00, 0x29, 0x01, 0xd1, 0xf3, 0xf7, 0xf2, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x60, 0x7b, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x1c, 0x00, 0x20, 0xf7, 0xf7, 0x03, 0xfa, 0x80, 0xbd, 0x80, 0xb5, 0x01, 0x1c, 0x01, 0x20, 0xf7, 0xf7, 0xfd, 0xf9, 0x80, 0xbd, 0x02, 0x49, 0x89, 0x68, 0x40, 0x1a, 0xc0, 0x0f, 0x70, 0x47, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x02, 0x49, 0x89, 0x68, 0x08, 0x1a, 0xc0, 0x17, 0x01, 0x30, 0x70, 0x47, 0x00, 0x01, 0x07, 0x00, 0x3c, 0x00, 0x3c, 0x2c, 0x01, 0x00, 0x05, 0x49, 0x4a, 0x68, 0x01, 0x23, 0x1a, 0x43, 0x4a, 0x60, 0x8a, 0x68, 0x10, 0x18, 0x88, 0x60, 0x48, 0x68, 0x98, 0x43, 0x48, 0x60, 0x70, 0x47, 0x00, 0x01, 0x07, 0x00, 0x10, 0xb5, 0x15, 0x4b, 0x00, 0x21, 0x0a, 0x01, 0x9a, 0x58, 0x00, 0x2a, 0x17, 0xd1, 0x01, 0x24, 0x0a, 0x01, 0x9c, 0x50, 0xd2, 0x18, 0x10, 0x73, 0x00, 0x23, 0x53, 0x73, 0x02, 0x23, 0x01, 0x28, 0x3c, 0x00, 0x78, 0x2c, 0x01, 0x00, 0x0e, 0x4a, 0x05, 0xd1, 0xc8, 0x00, 0x80, 0x18, 0x10, 0x30, 0x02, 0x78, 0x9a, 0x43, 0x04, 0xe0, 0xc8, 0x00, 0x80, 0x18, 0x10, 0x30, 0x02, 0x78, 0x1a, 0x43, 0x02, 0x70, 0x02, 0xe0, 0x01, 0x31, 0x08, 0x29, 0xe0, 0xdb, 0x08, 0x29, 0x04, 0xd1, 0x01, 0x21, 0x99, 0x20, 0xee, 0xf7, 0xfe, 0xfa, 0x03, 0x49, 0x08, 0x04, 0x00, 0x0c, 0x10, 0xbd, 0xac, 0x73, 0x01, 0x00, 0x3c, 0x00, 0xb4, 0x2c, 0x01, 0x00, 0x00, 0x60, 0x07, 0x00, 0xff, 0xff, 0x00, 0x00, 0xf7, 0xb5, 0x19, 0x4f, 0x19, 0x4e, 0x0c, 0x1c, 0xc1, 0x00, 0xc9, 0x19, 0xb2, 0x68, 0x10, 0x31, 0x81, 0xb0, 0x01, 0x3a, 0x4a, 0x60, 0x0b, 0x78, 0x1d, 0x1c, 0x0d, 0x22, 0x93, 0x43, 0x0b, 0x70, 0x01, 0x22, 0x82, 0x40, 0x3a, 0x73, 0x12, 0x4b, 0x00, 0x01, 0x03, 0x9a, 0xc0, 0x18, 0x82, 0x60, 0x10, 0x4a, 0x10, 0x1c, 0x3c, 0x00, 0xf0, 0x2c, 0x01, 0x00, 0x20, 0x30, 0x87, 0x79, 0x00, 0xab, 0x1f, 0x70, 0xc0, 0x79, 0x58, 0x70, 0xb0, 0x68, 0x03, 0x30, 0x00, 0x23, 0x26, 0x1a, 0x01, 0xd5, 0x04, 0x1c, 0x01, 0x23, 0x4c, 0x60, 0x0d, 0x70, 0x00, 0x2b, 0x04, 0xd0, 0x20, 0x1c, 0xff, 0xf7, 0x8a, 0xff, 0x00, 0x28, 0xfa, 0xd0, 0x00, 0xab, 0x18, 0x88, 0xd0, 0x84, 0xff, 0xbd, 0x00, 0x60, 0x07, 0x00, 0x00, 0x01, 0x07, 0x00, 0x3c, 0x00, 0x2c, 0x2d, 0x01, 0x00, 0xac, 0x73, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, 0x30, 0xb5, 0x00, 0x20, 0xc0, 0x43, 0x0b, 0x4c, 0x09, 0x4b, 0x00, 0x22, 0xd1, 0x00, 0x09, 0x19, 0x0d, 0x7c, 0xed, 0x07, 0x07, 0xd5, 0x49, 0x69, 0x9d, 0x68, 0x49, 0x1b, 0x00, 0xd5, 0x00, 0x21, 0x81, 0x42, 0x00, 0xd2, 0x08, 0x1c, 0x01, 0x32, 0x08, 0x2a, 0xef, 0xdb, 0x30, 0xbd, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x3c, 0x00, 0x68, 0x2d, 0x01, 0x00, 0x00, 0x60, 0x07, 0x00, 0xb0, 0xb5, 0x08, 0x28, 0x0b, 0xd2, 0x08, 0x4d, 0x04, 0x01, 0x29, 0x59, 0x00, 0x29, 0x04, 0xd0, 0x00, 0xf0, 0x4a, 0xf8, 0x00, 0x20, 0x28, 0x51, 0xb0, 0xbd, 0x02, 0x21, 0x00, 0xe0, 0x03, 0x21, 0x99, 0x20, 0xee, 0xf7, 0x89, 0xfa, 0xb0, 0xbd, 0xac, 0x73, 0x01, 0x00, 0x03, 0x49, 0x00, 0x01, 0x40, 0x18, 0x41, 0x7b, 0x08, 0x22, 0x11, 0x43, 0x3c, 0x00, 0xa4, 0x2d, 0x01, 0x00, 0x41, 0x73, 0x70, 0x47, 0xac, 0x73, 0x01, 0x00, 0x01, 0x48, 0x80, 0x68, 0x70, 0x47, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x70, 0xb5, 0x0b, 0x4e, 0x09, 0x4d, 0x00, 0x22, 0xd0, 0x00, 0x84, 0x19, 0x20, 0x7c, 0xc0, 0x07, 0x07, 0xd5, 0x60, 0x69, 0xff, 0xf7, 0x26, 0xff, 0x00, 0x28, 0x02, 0xd0, 0xa8, 0x68, 0x32, 0x30, 0x60, 0x61, 0x01, 0x32, 0x08, 0x2a, 0xef, 0xdb, 0x3c, 0x00, 0xe0, 0x2d, 0x01, 0x00, 0x70, 0xbd, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x60, 0x07, 0x00, 0x02, 0x4a, 0xc0, 0x00, 0x80, 0x18, 0x01, 0x74, 0x70, 0x47, 0x00, 0x00, 0x00, 0x60, 0x07, 0x00, 0x04, 0x49, 0xc0, 0x00, 0x41, 0x18, 0x08, 0x7c, 0x08, 0x23, 0x02, 0x1c, 0x9a, 0x43, 0x0a, 0x74, 0x70, 0x47, 0x00, 0x00, 0x00, 0x60, 0x07, 0x00, 0x70, 0xb5, 0x08, 0x28, 0x17, 0xd2, 0x0e, 0x49, 0x3c, 0x00, 0x1c, 0x2e, 0x01, 0x00, 0x8a, 0x68, 0x0e, 0x4d, 0x01, 0x3a, 0xc1, 0x00, 0x49, 0x19, 0x4a, 0x61, 0x0c, 0x4b, 0x9a, 0x79, 0x10, 0x31, 0x0c, 0x78, 0x0d, 0x26, 0xb4, 0x43, 0x0c, 0x70, 0x01, 0x21, 0x81, 0x40, 0x29, 0x73, 0x9a, 0x71, 0x09, 0x4a, 0x07, 0x49, 0x00, 0x01, 0x80, 0x18, 0x41, 0x60, 0x70, 0xbd, 0x05, 0x21, 0x99, 0x20, 0xee, 0xf7, 0x29, 0xfa, 0x70, 0xbd, 0x00, 0x01, 0x07, 0x00, 0x3c, 0x00, 0x58, 0x2e, 0x01, 0x00, 0x00, 0x60, 0x07, 0x00, 0x20, 0x10, 0x07, 0x00, 0xd1, 0x75, 0x00, 0x00, 0xac, 0x73, 0x01, 0x00, 0xf8, 0xb5, 0x9e, 0x46, 0x1a, 0x4b, 0x94, 0x46, 0x9b, 0x68, 0x1a, 0x4c, 0xc2, 0x00, 0x12, 0x19, 0x01, 0x3b, 0x53, 0x61, 0x15, 0x1c, 0x18, 0x4c, 0xa6, 0x79, 0x2a, 0x1c, 0x10, 0x32, 0x13, 0x78, 0x0d, 0x27, 0xbb, 0x43, 0x13, 0x70, 0x01, 0x27, 0x12, 0x4b, 0x87, 0x40, 0x3c, 0x00, 0x94, 0x2e, 0x01, 0x00, 0x1f, 0x73, 0xa6, 0x71, 0x12, 0x4e, 0x00, 0x01, 0x80, 0x19, 0x63, 0x46, 0x43, 0x60, 0x73, 0x46, 0x83, 0x60, 0x13, 0x78, 0x40, 0x7b, 0xa6, 0x79, 0x01, 0x27, 0x18, 0x43, 0x38, 0x43, 0x14, 0x35, 0x00, 0xab, 0x1e, 0x70, 0xe4, 0x79, 0x5c, 0x70, 0x06, 0x4b, 0x9b, 0x68, 0x03, 0x33, 0xcc, 0x1a, 0x00, 0xd5, 0x19, 0x1c, 0x29, 0x60, 0x10, 0x70, 0x00, 0xab, 0x18, 0x88, 0x3c, 0x00, 0xd0, 0x2e, 0x01, 0x00, 0x03, 0x4c, 0x20, 0x3c, 0xe0, 0x84, 0xf8, 0xbd, 0x00, 0x01, 0x07, 0x00, 0x00, 0x60, 0x07, 0x00, 0x20, 0x10, 0x07, 0x00, 0xac, 0x73, 0x01, 0x00, 0x00, 0xb5, 0x01, 0x1c, 0xff, 0xf7, 0x5e, 0xff, 0x42, 0x18, 0x10, 0x1c, 0xff, 0xf7, 0x92, 0xfe, 0x00, 0x28, 0xfa, 0xd0, 0x00, 0xbd, 0x00, 0x00, 0x89, 0x1a, 0x40, 0x1a, 0x99, 0x18, 0x88, 0x42, 0x01, 0xd8, 0x01, 0x20, 0x3c, 0x00, 0x0c, 0x2f, 0x01, 0x00, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0xf8, 0xb5, 0x0f, 0x1c, 0x04, 0x1c, 0x00, 0x28, 0x01, 0xd1, 0xee, 0xf7, 0xef, 0xf9, 0x21, 0x1c, 0x01, 0x20, 0xff, 0xf7, 0x19, 0xfa, 0x41, 0x20, 0x00, 0x5d, 0x00, 0x28, 0x01, 0xd1, 0x00, 0x25, 0x04, 0xe0, 0x02, 0x28, 0x01, 0xd1, 0x05, 0x25, 0x00, 0xe0, 0x01, 0x25, 0xe0, 0x68, 0xee, 0xf7, 0x29, 0xfb, 0xa6, 0x6b, 0x3c, 0x00, 0x48, 0x2f, 0x01, 0x00, 0x00, 0x2e, 0x10, 0xd0, 0x00, 0x2f, 0x06, 0xd0, 0x2f, 0x20, 0x02, 0x5d, 0x20, 0x6a, 0x41, 0x6b, 0x28, 0x1c, 0xed, 0xf7, 0x44, 0xfa, 0xa0, 0x69, 0x00, 0x28, 0x01, 0xd0, 0xee, 0xf7, 0x46, 0xfc, 0x20, 0x6a, 0xee, 0xf7, 0x43, 0xfc, 0x20, 0x1c, 0xee, 0xf7, 0x40, 0xfc, 0x30, 0x1c, 0xf8, 0xbd, 0xb0, 0xb5, 0x04, 0x1c, 0xc0, 0x6b, 0x00, 0x28, 0x09, 0xd0, 0x20, 0x69, 0x3c, 0x00, 0x84, 0x2f, 0x01, 0x00, 0x00, 0x8b, 0xee, 0xf7, 0x55, 0xf9, 0x00, 0x28, 0x03, 0xd0, 0x21, 0x1c, 0x06, 0x20, 0xff, 0xf7, 0xe3, 0xf9, 0x08, 0x4d, 0x20, 0x1c, 0xa9, 0x6d, 0xff, 0xf7, 0xba, 0xff, 0x00, 0x28, 0x07, 0xd0, 0xe8, 0x68, 0x01, 0x30, 0xe8, 0x60, 0x28, 0x6a, 0x01, 0x38, 0x28, 0x62, 0xfc, 0xf7, 0x78, 0xf8, 0xb0, 0xbd, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x10, 0xb5, 0x06, 0x4c, 0x3c, 0x00, 0xc0, 0x2f, 0x01, 0x00, 0xe1, 0x6d, 0xff, 0xf7, 0xa7, 0xff, 0x00, 0x28, 0x04, 0xd0, 0xe0, 0x69, 0x01, 0x38, 0xe0, 0x61, 0xfc, 0xf7, 0x68, 0xf8, 0x10, 0xbd, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x0c, 0x23, 0x0c, 0x49, 0x58, 0x43, 0x40, 0x18, 0x10, 0xb5, 0x44, 0x68, 0xa1, 0x68, 0x00, 0x29, 0x02, 0xd0, 0x20, 0x1c, 0xed, 0xf7, 0xf3, 0xf9, 0xe0, 0x6b, 0x00, 0x28, 0x08, 0xd0, 0x20, 0x69, 0x3c, 0x00, 0xfc, 0x2f, 0x01, 0x00, 0x00, 0x8b, 0xee, 0xf7, 0x19, 0xf9, 0x00, 0x28, 0x02, 0xd0, 0x20, 0x1c, 0xf9, 0xf7, 0x26, 0xf9, 0x10, 0xbd, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0xf8, 0xb5, 0x22, 0x49, 0x48, 0x68, 0x80, 0x00, 0x06, 0xd4, 0x01, 0x20, 0x40, 0x07, 0x08, 0x60, 0x4a, 0x69, 0x92, 0x00, 0x00, 0xd4, 0x48, 0x60, 0x1d, 0x4f, 0x78, 0x7e, 0xc3, 0x06, 0x01, 0x20, 0x02, 0x1c, 0xdb, 0x0e, 0x3c, 0x00, 0x38, 0x30, 0x01, 0x00, 0x9a, 0x40, 0x0a, 0x60, 0x79, 0x69, 0x8c, 0x68, 0x8c, 0x60, 0x21, 0x07, 0x89, 0x0f, 0x09, 0xd0, 0x21, 0x07, 0x04, 0xd5, 0x0b, 0x21, 0x9e, 0x20, 0xee, 0xf7, 0x28, 0xf9, 0x00, 0xe0, 0x78, 0x64, 0x0c, 0x20, 0x84, 0x43, 0x12, 0x48, 0x3d, 0x68, 0x06, 0x5d, 0x6c, 0x68, 0x2c, 0x34, 0x06, 0xe0, 0xa0, 0x68, 0x00, 0x68, 0xa0, 0x60, 0xe9, 0x68, 0x28, 0x1c, 0xed, 0xf7, 0x3c, 0x00, 0x74, 0x30, 0x01, 0x00, 0xb2, 0xf9, 0x01, 0x3e, 0xf6, 0xd2, 0xa0, 0x68, 0x80, 0x68, 0x00, 0x28, 0x0d, 0xd0, 0x40, 0x89, 0x00, 0x28, 0x0a, 0xd0, 0x78, 0x6c, 0x00, 0x28, 0x07, 0xd1, 0x78, 0x69, 0x80, 0x68, 0x80, 0x07, 0x03, 0xd1, 0x0c, 0x21, 0x9e, 0x20, 0xee, 0xf7, 0x03, 0xf9, 0xf8, 0xbd, 0x00, 0x10, 0x07, 0x00, 0xcc, 0x6d, 0x01, 0x00, 0xb4, 0x44, 0x01, 0x00, 0x09, 0x49, 0x80, 0xb5, 0x3c, 0x00, 0xb0, 0x30, 0x01, 0x00, 0x08, 0x7e, 0xc2, 0x06, 0xd2, 0x0e, 0x01, 0x20, 0x90, 0x40, 0x07, 0x4a, 0x10, 0x60, 0x00, 0x20, 0x0a, 0x69, 0xc0, 0x43, 0x90, 0x60, 0x08, 0x68, 0x24, 0x31, 0x06, 0xc9, 0x03, 0x69, 0xed, 0xf7, 0x86, 0xf9, 0x80, 0xbd, 0xcc, 0x6d, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, 0xf8, 0xb5, 0x44, 0x68, 0x06, 0x1c, 0x2c, 0x34, 0x20, 0x68, 0x0d, 0x1c, 0x80, 0x68, 0x00, 0x90, 0x3c, 0x00, 0xec, 0x30, 0x01, 0x00, 0x00, 0x28, 0x00, 0xd0, 0xc5, 0x60, 0x20, 0x68, 0x00, 0x68, 0x20, 0x60, 0x40, 0x68, 0x00, 0x28, 0x03, 0xd0, 0x0a, 0x21, 0x9e, 0x20, 0xee, 0xf7, 0xcf, 0xf8, 0x20, 0x68, 0x45, 0x60, 0x28, 0x1c, 0x02, 0xe0, 0x00, 0x22, 0x42, 0x60, 0x08, 0x1c, 0xc1, 0x68, 0x00, 0x29, 0xf9, 0xd1, 0x71, 0x68, 0x60, 0x27, 0x0b, 0x1c, 0x40, 0x33, 0x9c, 0x46, 0x9b, 0x78, 0xca, 0x7e, 0x3c, 0x00, 0x28, 0x31, 0x01, 0x00, 0x5b, 0x01, 0x12, 0x07, 0x12, 0x0f, 0x3b, 0x40, 0x1a, 0x43, 0x8b, 0x8f, 0xff, 0x27, 0x3f, 0x04, 0x1b, 0x04, 0x3b, 0x40, 0x1a, 0x43, 0x90, 0x23, 0x1a, 0x43, 0x42, 0x60, 0x63, 0x46, 0x9a, 0x78, 0x01, 0x32, 0xd2, 0x07, 0xd2, 0x0f, 0x9a, 0x70, 0x89, 0x6b, 0xc1, 0x60, 0x21, 0x68, 0x88, 0x60, 0x00, 0x98, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x98, 0xc5, 0x60, 0x0a, 0x4f, 0x3c, 0x00, 0x64, 0x31, 0x01, 0x00, 0xbd, 0x79, 0xa0, 0x69, 0x00, 0x28, 0x0c, 0xd0, 0x00, 0x22, 0xa2, 0x61, 0x74, 0x68, 0x60, 0x69, 0xef, 0xf7, 0x2e, 0xff, 0xe0, 0x6a, 0x61, 0x69, 0x40, 0x68, 0x48, 0x60, 0x61, 0x69, 0x01, 0x20, 0x08, 0x60, 0xbd, 0x71, 0xf8, 0xbd, 0x00, 0x00, 0x20, 0x10, 0x07, 0x00, 0xfe, 0xb5, 0x44, 0x68, 0x0f, 0x1c, 0x01, 0x94, 0x2c, 0x34, 0x20, 0x1c, 0x12, 0x30, 0x02, 0x90, 0x3c, 0x00, 0xa0, 0x31, 0x01, 0x00, 0x2c, 0xe0, 0x0c, 0x20, 0xee, 0xf7, 0x00, 0xfb, 0x05, 0x1c, 0x60, 0x68, 0x00, 0x28, 0x1d, 0xd1, 0x02, 0x98, 0x00, 0x21, 0x00, 0x90, 0x00, 0x20, 0xee, 0xf7, 0x0e, 0xfa, 0x06, 0x1c, 0x00, 0x98, 0x04, 0x21, 0xee, 0xf7, 0x09, 0xfa, 0x01, 0x1c, 0x01, 0x98, 0xc0, 0x7e, 0x00, 0x07, 0x00, 0x0f, 0xd0, 0x30, 0x70, 0x60, 0x01, 0x98, 0xc0, 0x7e, 0x00, 0x07, 0x00, 0x0f, 0x3c, 0x00, 0xdc, 0x31, 0x01, 0x00, 0xf0, 0x30, 0x48, 0x60, 0x30, 0x1c, 0xee, 0xf7, 0x19, 0xf9, 0x65, 0x60, 0xe6, 0x60, 0x01, 0xe0, 0x20, 0x68, 0x05, 0x60, 0x60, 0x68, 0x28, 0x60, 0x25, 0x60, 0x00, 0x20, 0x68, 0x60, 0xa8, 0x60, 0x38, 0x1c, 0xff, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x39, 0x1c, 0x07, 0x1c, 0x00, 0x29, 0xca, 0xd1, 0x60, 0x68, 0xa0, 0x60, 0xfe, 0xbd, 0x00, 0x00, 0xff, 0xb5, 0x05, 0x1c, 0x3c, 0x00, 0x18, 0x32, 0x01, 0x00, 0x08, 0x1c, 0x00, 0x26, 0x81, 0xb0, 0xf4, 0xf7, 0x2f, 0xfe, 0x04, 0x1c, 0x02, 0xd0, 0x60, 0x68, 0xff, 0x28, 0x01, 0xd1, 0x06, 0x26, 0x28, 0xe0, 0x21, 0x1c, 0x20, 0x31, 0x0a, 0x78, 0x01, 0x2a, 0x01, 0xd1, 0x03, 0x26, 0x21, 0xe0, 0x01, 0x27, 0x25, 0x60, 0x0f, 0x70, 0x11, 0xc5, 0x1d, 0x48, 0x08, 0x3d, 0x68, 0x61, 0x03, 0x98, 0x6a, 0x46, 0xe8, 0x60, 0x04, 0x98, 0x3c, 0x00, 0x54, 0x32, 0x01, 0x00, 0x28, 0x61, 0x1a, 0x48, 0xa8, 0x61, 0x1a, 0x48, 0xe8, 0x61, 0x1a, 0x48, 0x28, 0x62, 0x1a, 0x48, 0x68, 0x62, 0x20, 0x7e, 0xa1, 0x68, 0xed, 0xf7, 0xb3, 0xfe, 0x00, 0x28, 0x06, 0xd1, 0x60, 0x7e, 0xe1, 0x68, 0x6a, 0x46, 0xed, 0xf7, 0xac, 0xfe, 0x00, 0x28, 0x07, 0xd0, 0x04, 0x26, 0x31, 0x1c, 0x9e, 0x20, 0xee, 0xf7, 0x0d, 0xf8, 0x30, 0x1c, 0x05, 0xb0, 0xf0, 0xbd, 0x3c, 0x00, 0x90, 0x32, 0x01, 0x00, 0x6a, 0x46, 0x0f, 0x49, 0x1d, 0x20, 0xed, 0xf7, 0x9d, 0xfe, 0x01, 0x21, 0x0d, 0x48, 0x49, 0x07, 0x01, 0x60, 0x22, 0x7e, 0x3b, 0x1c, 0xd2, 0x06, 0xd2, 0x0e, 0x93, 0x40, 0x43, 0x60, 0x62, 0x7e, 0xd2, 0x06, 0xd2, 0x0e, 0x97, 0x40, 0x47, 0x60, 0x41, 0x60, 0xe6, 0xe7, 0x31, 0x33, 0x01, 0x00, 0xd9, 0x32, 0x01, 0x00, 0x91, 0x31, 0x01, 0x00, 0xdd, 0x30, 0x01, 0x00, 0x3c, 0x00, 0xcc, 0x32, 0x01, 0x00, 0xfd, 0x32, 0x01, 0x00, 0x71, 0x33, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, 0x42, 0x68, 0x2c, 0x32, 0x50, 0x68, 0x43, 0x68, 0x0b, 0x60, 0x81, 0x68, 0x4b, 0x89, 0x0b, 0x81, 0x83, 0x68, 0x00, 0x21, 0xd9, 0x60, 0x41, 0x60, 0x81, 0x60, 0x00, 0x68, 0x50, 0x60, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x70, 0xb5, 0x42, 0x68, 0xff, 0x26, 0x91, 0x87, 0x10, 0x6b, 0x0c, 0x04, 0x3c, 0x00, 0x08, 0x33, 0x01, 0x00, 0x05, 0x1c, 0x36, 0x04, 0x34, 0x40, 0x43, 0x68, 0x59, 0x68, 0xb1, 0x43, 0x21, 0x43, 0x59, 0x60, 0x00, 0x68, 0xa8, 0x42, 0xf7, 0xd1, 0x10, 0x6b, 0x51, 0x69, 0x40, 0x68, 0x48, 0x60, 0x51, 0x69, 0x01, 0x20, 0x08, 0x60, 0x70, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x43, 0x68, 0x08, 0x1c, 0x59, 0x62, 0x9a, 0x62, 0x00, 0x25, 0x0a, 0xe0, 0x45, 0x81, 0xc4, 0x68, 0x2a, 0x1c, 0x3c, 0x00, 0x44, 0x33, 0x01, 0x00, 0x00, 0x2c, 0x03, 0xd1, 0x9a, 0x7e, 0x12, 0x07, 0x12, 0x0f, 0x10, 0x32, 0x42, 0x60, 0x20, 0x1c, 0x00, 0x28, 0xf2, 0xd1, 0x18, 0x69, 0x41, 0x60, 0x19, 0x69, 0x01, 0x20, 0x08, 0x60, 0x02, 0x48, 0x00, 0x68, 0xed, 0xf7, 0x37, 0xf8, 0xb0, 0xbd, 0x5c, 0x5b, 0x01, 0x00, 0x01, 0x20, 0x05, 0x49, 0x40, 0x07, 0x80, 0xb5, 0x88, 0x60, 0x04, 0x48, 0x01, 0x68, 0x0d, 0x20, 0x3c, 0x00, 0x80, 0x33, 0x01, 0x00, 0xfe, 0xf7, 0xe6, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0xc4, 0x60, 0x01, 0x00, 0xf8, 0xb5, 0x0e, 0x4f, 0x0c, 0x4e, 0x00, 0x24, 0x48, 0x20, 0x60, 0x43, 0xc5, 0x19, 0x48, 0x21, 0x28, 0x1c, 0xed, 0xf7, 0x7b, 0xf8, 0x1c, 0x20, 0x60, 0x43, 0x81, 0x19, 0x28, 0x1d, 0x1c, 0x22, 0xed, 0xf7, 0xfe, 0xf8, 0x1c, 0x23, 0xe8, 0x56, 0x05, 0x49, 0xfb, 0xf7, 0x3c, 0x00, 0xbc, 0x33, 0x01, 0x00, 0xcd, 0xf8, 0x01, 0x34, 0x01, 0x2c, 0xe9, 0xd3, 0xf8, 0xbd, 0x00, 0x00, 0xb8, 0x44, 0x01, 0x00, 0xcc, 0x6d, 0x01, 0x00, 0x15, 0x32, 0x01, 0x00, 0xff, 0xb5, 0x05, 0x1c, 0x0a, 0x30, 0x06, 0x1c, 0x81, 0xb0, 0xf2, 0xf7, 0xdd, 0xf8, 0x18, 0x4f, 0x04, 0x1c, 0x39, 0x88, 0xef, 0xf7, 0xbc, 0xfc, 0x32, 0x88, 0x78, 0x68, 0x02, 0x80, 0x72, 0x88, 0x02, 0x30, 0x02, 0x80, 0x3c, 0x00, 0xf8, 0x33, 0x01, 0x00, 0xb1, 0x88, 0x12, 0x4e, 0x41, 0x80, 0x28, 0x88, 0x08, 0x36, 0x40, 0x05, 0x00, 0x28, 0x05, 0xda, 0x69, 0x88, 0x03, 0x9a, 0x20, 0x1c, 0xf7, 0xf7, 0x01, 0xfd, 0x00, 0xe0, 0x00, 0x20, 0x70, 0x80, 0xf8, 0xf7, 0x5e, 0xfc, 0x01, 0x21, 0x09, 0x03, 0x00, 0x28, 0x30, 0x88, 0x01, 0xd0, 0x88, 0x43, 0x00, 0xe0, 0x08, 0x43, 0x30, 0x80, 0x05, 0x48, 0x00, 0x22, 0x00, 0x21, 0x3c, 0x00, 0x34, 0x34, 0x01, 0x00, 0x14, 0x30, 0xef, 0xf7, 0x65, 0xfc, 0x20, 0x1c, 0xf9, 0xf7, 0x74, 0xf8, 0x05, 0xb0, 0xf0, 0xbd, 0xb0, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0x0e, 0x4c, 0x60, 0x68, 0xf8, 0xf7, 0x95, 0xf9, 0x20, 0x68, 0x00, 0x6a, 0x00, 0x28, 0x13, 0xd1, 0xf8, 0xf7, 0xbf, 0xfc, 0x00, 0x28, 0x08, 0xd0, 0x21, 0x68, 0x01, 0x20, 0x08, 0x62, 0x1f, 0x21, 0x00, 0x22, 0x83, 0x20, 0x00, 0xf0, 0x3c, 0x00, 0x70, 0x34, 0x01, 0x00, 0x9f, 0xf9, 0x02, 0xe0, 0x60, 0x68, 0xf8, 0xf7, 0x21, 0xfa, 0xff, 0xf7, 0x97, 0xfc, 0x21, 0x68, 0x08, 0x61, 0x10, 0xbd, 0x14, 0x7a, 0x01, 0x00, 0xfe, 0xb5, 0x1b, 0x4e, 0x0f, 0x1c, 0x1d, 0x1c, 0x14, 0x1c, 0xb0, 0x60, 0x08, 0x1c, 0xf7, 0xf7, 0x2b, 0xff, 0xb0, 0x80, 0x34, 0x73, 0x35, 0x62, 0x38, 0x1c, 0x01, 0xaa, 0x02, 0xa9, 0xf7, 0xf7, 0x25, 0xff, 0x00, 0xab, 0x3c, 0x00, 0xac, 0x34, 0x01, 0x00, 0x18, 0x7a, 0x01, 0x28, 0x18, 0xd1, 0x18, 0x79, 0x0b, 0x28, 0x08, 0xd1, 0x30, 0x7f, 0x24, 0x23, 0x0f, 0x49, 0x58, 0x43, 0x40, 0x18, 0x80, 0x68, 0xec, 0xf7, 0x88, 0xff, 0xfe, 0xbd, 0x00, 0xab, 0x18, 0x79, 0x0a, 0x28, 0x08, 0xd1, 0xf7, 0xf7, 0x39, 0xfd, 0x07, 0x1c, 0x29, 0x1c, 0x20, 0x1c, 0xf7, 0xf7, 0x16, 0xfd, 0x38, 0x18, 0xb0, 0x80, 0x30, 0x7f, 0x24, 0x23, 0x3c, 0x00, 0xe8, 0x34, 0x01, 0x00, 0x04, 0x49, 0x58, 0x43, 0x40, 0x18, 0x40, 0x68, 0xec, 0xf7, 0x72, 0xff, 0xe8, 0xe7, 0x00, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x94, 0x46, 0x01, 0x00, 0xb0, 0xb5, 0xff, 0xf7, 0x53, 0xfc, 0x04, 0x1c, 0xfb, 0xf7, 0xfc, 0xfa, 0x0c, 0x4d, 0x29, 0x68, 0x09, 0x69, 0x09, 0x1b, 0x0c, 0x1a, 0x02, 0x21, 0x1f, 0x20, 0x00, 0xf0, 0x8b, 0xf8, 0x14, 0x2c, 0x06, 0xdd, 0x02, 0x22, 0x3c, 0x00, 0x24, 0x35, 0x01, 0x00, 0x21, 0x1c, 0x1f, 0x20, 0x00, 0xf0, 0x50, 0xf8, 0x01, 0x20, 0xb0, 0xbd, 0x29, 0x68, 0x01, 0x20, 0x89, 0x6a, 0x00, 0x29, 0xf9, 0xd0, 0x00, 0x20, 0xb0, 0xbd, 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, 0xf8, 0xb5, 0x1a, 0x4d, 0x07, 0x1c, 0xae, 0x79, 0x01, 0x21, 0x19, 0x4c, 0x00, 0x20, 0x22, 0x68, 0x00, 0x2a, 0x14, 0xd1, 0xae, 0x71, 0xa2, 0x68, 0xd0, 0x68, 0x06, 0xca, 0x3c, 0x00, 0x60, 0x35, 0x01, 0x00, 0xec, 0xf7, 0x3c, 0xff, 0xae, 0x79, 0x00, 0x21, 0x13, 0x4a, 0x50, 0x69, 0x01, 0x30, 0x50, 0x61, 0xa0, 0x68, 0x80, 0x68, 0xa0, 0x60, 0x62, 0x68, 0x90, 0x42, 0x06, 0xd1, 0x01, 0x20, 0x20, 0x60, 0x03, 0xe0, 0x01, 0x30, 0x0c, 0x34, 0x03, 0x28, 0xe3, 0xdb, 0x00, 0x2f, 0x08, 0xd1, 0x00, 0x29, 0x0a, 0xd0, 0x0a, 0x48, 0x40, 0x68, 0x00, 0x28, 0x06, 0xd0, 0xfa, 0xf7, 0x3c, 0x00, 0x9c, 0x35, 0x01, 0x00, 0xf5, 0xff, 0x03, 0xe0, 0x01, 0x2f, 0x03, 0xd0, 0x00, 0x29, 0x01, 0xd1, 0xae, 0x71, 0xce, 0xe7, 0xae, 0x71, 0xf8, 0xbd, 0x20, 0x10, 0x07, 0x00, 0x18, 0xd9, 0x01, 0x00, 0xa8, 0x60, 0x01, 0x00, 0x70, 0x5d, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x23, 0xf5, 0xf7, 0x7c, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x23, 0xf5, 0xf7, 0x76, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0x35, 0x01, 0x00, 0xf8, 0xb5, 0x13, 0x4b, 0x00, 0x24, 0x1b, 0x88, 0x98, 0x42, 0x1b, 0xd2, 0x11, 0x4b, 0xc0, 0x00, 0xc0, 0x18, 0x45, 0x68, 0x06, 0x68, 0x28, 0x68, 0x00, 0x28, 0x17, 0xd1, 0x0e, 0x4f, 0xa8, 0x68, 0x43, 0x68, 0xb3, 0x42, 0x09, 0xd1, 0xc3, 0x68, 0x8b, 0x42, 0x06, 0xd1, 0x03, 0x68, 0x93, 0x42, 0x01, 0xd0, 0x53, 0x1c, 0x01, 0xd1, 0x01, 0x24, 0x47, 0x60, 0x80, 0x68, 0x3c, 0x00, 0x14, 0x36, 0x01, 0x00, 0x6b, 0x68, 0x83, 0x42, 0xee, 0xd1, 0x03, 0xe0, 0x01, 0x21, 0x80, 0x20, 0xed, 0xf7, 0x40, 0xfe, 0x20, 0x1c, 0xf8, 0xbd, 0x56, 0x57, 0x01, 0x00, 0x84, 0x5d, 0x01, 0x00, 0x29, 0xe3, 0x00, 0x00, 0xf8, 0xb5, 0x17, 0x4f, 0x0a, 0x1c, 0xbe, 0x79, 0x16, 0x4d, 0x00, 0x23, 0x6c, 0x68, 0x07, 0xe0, 0x21, 0x68, 0x91, 0x42, 0x02, 0xd1, 0x21, 0x79, 0x81, 0x42, 0x04, 0xd0, 0x3c, 0x00, 0x50, 0x36, 0x01, 0x00, 0x23, 0x1c, 0xe4, 0x68, 0x00, 0x2c, 0xf5, 0xd1, 0x17, 0xe0, 0x00, 0x2c, 0x15, 0xd0, 0x00, 0x2b, 0x0d, 0xd1, 0xe3, 0x68, 0x0d, 0x48, 0x6b, 0x60, 0x00, 0x88, 0x00, 0x2b, 0x02, 0xd1, 0xff, 0xf7, 0xd1, 0xfb, 0x06, 0xe0, 0x0a, 0x4a, 0x99, 0x68, 0xff, 0xf7, 0xf6, 0xfb, 0x01, 0xe0, 0xe0, 0x68, 0xd8, 0x60, 0x28, 0x68, 0xe0, 0x60, 0x2c, 0x60, 0x02, 0xe0, 0x01, 0x21, 0x3c, 0x00, 0x8c, 0x36, 0x01, 0x00, 0xff, 0xf7, 0xa4, 0xff, 0xbe, 0x71, 0xf8, 0xbd, 0x20, 0x10, 0x07, 0x00, 0x7c, 0x5d, 0x01, 0x00, 0x2c, 0x74, 0x01, 0x00, 0x21, 0x38, 0x01, 0x00, 0x70, 0xb5, 0x09, 0x4e, 0xb5, 0x79, 0xf9, 0xf7, 0xaf, 0xfe, 0x04, 0x1c, 0x09, 0xd0, 0x20, 0x1c, 0xed, 0xf7, 0x0c, 0xfb, 0x05, 0x49, 0x8a, 0x68, 0x80, 0x18, 0x88, 0x60, 0x08, 0x68, 0x01, 0x30, 0x08, 0x60, 0xb5, 0x71, 0x3c, 0x00, 0xc8, 0x36, 0x01, 0x00, 0x20, 0x1c, 0x70, 0xbd, 0x20, 0x10, 0x07, 0x00, 0xa8, 0x60, 0x01, 0x00, 0x09, 0x48, 0x80, 0xb5, 0x40, 0x68, 0x02, 0x1c, 0x0b, 0xe0, 0x01, 0x69, 0x00, 0x29, 0x07, 0xd0, 0x82, 0x42, 0x04, 0xd0, 0x81, 0x68, 0x05, 0x48, 0x00, 0x88, 0xff, 0xf7, 0xe5, 0xfa, 0x80, 0xbd, 0xc0, 0x68, 0x00, 0x28, 0xf1, 0xd1, 0x80, 0xbd, 0x7c, 0x5d, 0x01, 0x00, 0x2c, 0x74, 0x01, 0x00, 0x3c, 0x00, 0x04, 0x37, 0x01, 0x00, 0x05, 0x48, 0x80, 0xb5, 0x42, 0x68, 0x00, 0x2a, 0x04, 0xd0, 0x04, 0x48, 0x00, 0x88, 0x91, 0x68, 0xff, 0xf7, 0xd2, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x7c, 0x5d, 0x01, 0x00, 0x2c, 0x74, 0x01, 0x00, 0x05, 0x48, 0x01, 0x68, 0x00, 0x29, 0x04, 0xd0, 0xc0, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x18, 0xd9, 0x01, 0x00, 0x3c, 0x00, 0x40, 0x37, 0x01, 0x00, 0x80, 0xb5, 0xf6, 0xf7, 0xd1, 0xfa, 0x80, 0xbd, 0x13, 0x1c, 0x0d, 0x4a, 0xb0, 0xb5, 0x12, 0x88, 0x90, 0x42, 0x0f, 0xd2, 0x03, 0x29, 0x0d, 0xd2, 0x0a, 0x4a, 0xc0, 0x00, 0x14, 0x58, 0x0a, 0x4d, 0xac, 0x42, 0x07, 0xd1, 0x13, 0x50, 0x0c, 0x23, 0x59, 0x43, 0x08, 0x4b, 0xc9, 0x18, 0x80, 0x18, 0x41, 0x60, 0xb0, 0xbd, 0x02, 0x21, 0x80, 0x20, 0xed, 0xf7, 0x94, 0xfd, 0x3c, 0x00, 0x7c, 0x37, 0x01, 0x00, 0xb0, 0xbd, 0x00, 0x00, 0x56, 0x57, 0x01, 0x00, 0x84, 0x5d, 0x01, 0x00, 0x09, 0xa0, 0x00, 0x00, 0x18, 0xd9, 0x01, 0x00, 0xf8, 0xb5, 0x0f, 0x1c, 0x1e, 0x1c, 0x15, 0x1c, 0x04, 0x1c, 0x11, 0x1c, 0xff, 0xf7, 0x4a, 0xff, 0x33, 0x1c, 0x2a, 0x1c, 0x39, 0x1c, 0x20, 0x1c, 0xf4, 0xf7, 0x8a, 0xff, 0xf8, 0xbd, 0x00, 0x00, 0xf7, 0xb5, 0x94, 0x46, 0xff, 0x29, 0x21, 0xd0, 0x3c, 0x00, 0xb8, 0x37, 0x01, 0x00, 0x15, 0x48, 0x00, 0x88, 0x81, 0x42, 0x21, 0xd2, 0x14, 0x4a, 0x15, 0x4e, 0xc8, 0x00, 0x85, 0x18, 0xb4, 0x79, 0x68, 0x68, 0x02, 0x68, 0x00, 0x2a, 0x03, 0xd1, 0x03, 0x1d, 0x0c, 0xcb, 0x9a, 0x42, 0x11, 0xd0, 0x43, 0x68, 0x9a, 0x68, 0x42, 0x60, 0x0e, 0x4a, 0x17, 0x69, 0x01, 0x37, 0x17, 0x61, 0xb4, 0x71, 0x00, 0x22, 0x02, 0x60, 0x00, 0x98, 0xd8, 0x60, 0x60, 0x46, 0x3c, 0x00, 0xf4, 0x37, 0x01, 0x00, 0x18, 0x60, 0x19, 0x74, 0x28, 0x68, 0x58, 0x60, 0xfe, 0xbd, 0xb4, 0x71, 0x06, 0x21, 0x00, 0xe0, 0x07, 0x21, 0x80, 0x20, 0xed, 0xf7, 0x4c, 0xfd, 0xf6, 0xe7, 0x00, 0x00, 0x56, 0x57, 0x01, 0x00, 0x84, 0x5d, 0x01, 0x00, 0x20, 0x10, 0x07, 0x00, 0xa8, 0x60, 0x01, 0x00, 0xb0, 0xb5, 0x14, 0x4d, 0x6c, 0x68, 0x00, 0x2c, 0x01, 0xd0, 0x84, 0x42, 0x04, 0xd0, 0x0c, 0x21, 0x3c, 0x00, 0x30, 0x38, 0x01, 0x00, 0x80, 0x20, 0xed, 0xf7, 0x37, 0xfd, 0xb0, 0xbd, 0xff, 0xf7, 0xb8, 0xfa, 0xa1, 0x68, 0x40, 0x1a, 0x0d, 0x49, 0x88, 0x42, 0x03, 0xda, 0x10, 0x21, 0x80, 0x20, 0xed, 0xf7, 0x2b, 0xfd, 0x21, 0x79, 0x22, 0x68, 0x01, 0x20, 0xff, 0xf7, 0xac, 0xff, 0xe3, 0x68, 0x6b, 0x60, 0x00, 0x2b, 0x05, 0xd0, 0x07, 0x48, 0x06, 0x4a, 0x00, 0x88, 0x99, 0x68, 0xff, 0xf7, 0xfe, 0xfa, 0x3c, 0x00, 0x6c, 0x38, 0x01, 0x00, 0x28, 0x68, 0xe0, 0x60, 0x2c, 0x60, 0xb0, 0xbd, 0x7c, 0x5d, 0x01, 0x00, 0x18, 0xfc, 0xff, 0xff, 0x21, 0x38, 0x01, 0x00, 0x2c, 0x74, 0x01, 0x00, 0xb0, 0xb5, 0x15, 0x4c, 0x08, 0x20, 0x21, 0x1c, 0x80, 0x31, 0x08, 0x70, 0x13, 0x4a, 0x41, 0x04, 0x11, 0x60, 0x13, 0x48, 0x00, 0x68, 0x13, 0x4d, 0x6b, 0x69, 0x18, 0x40, 0x01, 0xd1, 0x10, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x3c, 0x00, 0xa8, 0x38, 0x01, 0x00, 0xa8, 0x23, 0x5b, 0x5d, 0x18, 0x43, 0x23, 0x1c, 0x40, 0x33, 0x18, 0x73, 0x51, 0x60, 0x20, 0x78, 0x80, 0x08, 0x80, 0x00, 0x20, 0x70, 0x00, 0x20, 0xff, 0xf7, 0x12, 0xfb, 0xff, 0xf7, 0x72, 0xfa, 0x64, 0x30, 0x28, 0x66, 0x01, 0x38, 0xa0, 0x61, 0x20, 0x78, 0x03, 0x21, 0x08, 0x43, 0x20, 0x70, 0xb0, 0xbd, 0x00, 0x00, 0x00, 0x90, 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0x3c, 0x00, 0xe4, 0x38, 0x01, 0x00, 0x10, 0x00, 0x07, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x38, 0xb5, 0x0a, 0x4c, 0x21, 0x1c, 0x20, 0x31, 0x8a, 0x79, 0x00, 0xab, 0x1a, 0x70, 0xc9, 0x79, 0x07, 0x4d, 0x59, 0x70, 0x69, 0x78, 0x88, 0x42, 0x03, 0xd1, 0xf8, 0xf7, 0x13, 0xfc, 0xff, 0x20, 0x68, 0x70, 0x00, 0xab, 0x18, 0x88, 0xe0, 0x84, 0x38, 0xbd, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x4c, 0x7b, 0x01, 0x00, 0x3c, 0x00, 0x20, 0x39, 0x01, 0x00, 0xf8, 0xb5, 0x0b, 0x1c, 0x06, 0x1c, 0x04, 0x1d, 0x7f, 0x33, 0x14, 0xd0, 0x33, 0x68, 0x5d, 0x18, 0x35, 0x60, 0x23, 0x88, 0x1f, 0x18, 0x06, 0x23, 0xff, 0x56, 0xeb, 0x1b, 0x33, 0x60, 0x23, 0x88, 0x18, 0x18, 0x81, 0x71, 0x20, 0x88, 0x01, 0x30, 0x00, 0x04, 0x00, 0x0c, 0x20, 0x80, 0x90, 0x42, 0x01, 0xd3, 0x00, 0x20, 0x20, 0x80, 0x10, 0x1c, 0x31, 0x68, 0xec, 0xf7, 0x3c, 0x00, 0x5c, 0x39, 0x01, 0x00, 0x6d, 0xfe, 0xf8, 0xbd, 0x0e, 0x49, 0x0a, 0x7c, 0x83, 0x78, 0x1a, 0x43, 0x0a, 0x74, 0x42, 0x78, 0x83, 0x78, 0x9a, 0x43, 0x0b, 0x7c, 0x93, 0x43, 0x0b, 0x74, 0x8a, 0x7c, 0x43, 0x78, 0x1a, 0x43, 0x8a, 0x74, 0x8a, 0x7c, 0x03, 0x78, 0x9a, 0x43, 0x8a, 0x74, 0x02, 0x78, 0x43, 0x78, 0x1a, 0x43, 0x4b, 0x7c, 0x1a, 0x43, 0x4a, 0x74, 0x4a, 0x7c, 0xc0, 0x78, 0x82, 0x43, 0x3c, 0x00, 0x98, 0x39, 0x01, 0x00, 0x4a, 0x74, 0x70, 0x47, 0x10, 0x00, 0x07, 0x00, 0xb0, 0xb5, 0x06, 0x4d, 0x00, 0x24, 0x20, 0x06, 0x00, 0x0e, 0xed, 0xf7, 0xf7, 0xf8, 0xa1, 0x00, 0x69, 0x58, 0x08, 0x71, 0x01, 0x34, 0x04, 0x2c, 0xf5, 0xdb, 0xb0, 0xbd, 0x10, 0x7b, 0x01, 0x00, 0x0b, 0x48, 0x0c, 0x49, 0x7d, 0x23, 0x42, 0x69, 0xdb, 0x00, 0x00, 0x2a, 0xc8, 0x6b, 0x07, 0xd0, 0xc0, 0x18, 0x1a, 0x01, 0x3c, 0x00, 0xd4, 0x39, 0x01, 0x00, 0x90, 0x42, 0xc8, 0x63, 0x01, 0xd9, 0x07, 0x48, 0xc8, 0x63, 0x70, 0x47, 0xff, 0x38, 0xf5, 0x38, 0xc8, 0x63, 0x98, 0x42, 0xf9, 0xd2, 0xcb, 0x63, 0x70, 0x47, 0x00, 0x00, 0xf4, 0x68, 0x01, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x70, 0x17, 0x00, 0x00, 0x70, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x16, 0x1c, 0xfb, 0xf7, 0xf6, 0xfa, 0xb0, 0x43, 0x28, 0x43, 0x01, 0x1c, 0x20, 0x1c, 0x3c, 0x00, 0x10, 0x3a, 0x01, 0x00, 0x00, 0xf0, 0xcc, 0xfa, 0x70, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x0b, 0x4a, 0x00, 0x29, 0x09, 0xd0, 0x02, 0x29, 0x0f, 0xd1, 0x01, 0x1c, 0x08, 0x48, 0xd2, 0x78, 0x38, 0x30, 0xff, 0xf7, 0x78, 0xff, 0x06, 0x49, 0x06, 0xe0, 0x01, 0x1c, 0x04, 0x48, 0x12, 0x79, 0x20, 0x30, 0xff, 0xf7, 0x70, 0xff, 0x03, 0x49, 0x08, 0x60, 0x80, 0xbd, 0x00, 0x00, 0xac, 0x7c, 0x01, 0x00, 0x3c, 0x00, 0x4c, 0x3a, 0x01, 0x00, 0xc8, 0x67, 0x01, 0x00, 0xc4, 0x67, 0x01, 0x00, 0x80, 0xb5, 0x0b, 0x4a, 0x00, 0x29, 0x09, 0xd0, 0x02, 0x29, 0x0f, 0xd1, 0x01, 0x1c, 0x08, 0x48, 0x52, 0x79, 0x68, 0x30, 0xff, 0xf7, 0x5a, 0xff, 0x06, 0x49, 0x06, 0xe0, 0x01, 0x1c, 0x04, 0x48, 0x92, 0x79, 0x50, 0x30, 0xff, 0xf7, 0x52, 0xff, 0x03, 0x49, 0x08, 0x60, 0x80, 0xbd, 0x00, 0x00, 0xac, 0x7c, 0x01, 0x00, 0x3c, 0x00, 0x88, 0x3a, 0x01, 0x00, 0xd0, 0x67, 0x01, 0x00, 0xcc, 0x67, 0x01, 0x00, 0x08, 0xb5, 0x04, 0x21, 0x00, 0x91, 0x81, 0x7e, 0x43, 0x68, 0x03, 0x29, 0x06, 0xd1, 0x01, 0x1c, 0x0c, 0x31, 0x01, 0x20, 0x6a, 0x46, 0xec, 0xf7, 0x9a, 0xfc, 0x08, 0xbd, 0x19, 0x68, 0xc1, 0x60, 0xfb, 0xe7, 0x00, 0x00, 0x10, 0xb5, 0x03, 0x1c, 0x00, 0x20, 0x08, 0x4c, 0x00, 0x21, 0xca, 0x00, 0x12, 0x19, 0x92, 0x78, 0x3c, 0x00, 0xc4, 0x3a, 0x01, 0x00, 0x9a, 0x42, 0x03, 0xd1, 0xc8, 0x00, 0x00, 0x19, 0x40, 0x68, 0x10, 0xbd, 0x01, 0x31, 0x09, 0x06, 0x09, 0x16, 0x06, 0x29, 0xf1, 0xdb, 0x10, 0xbd, 0xcc, 0x5a, 0x01, 0x00, 0xf8, 0xb5, 0x0f, 0x1c, 0x16, 0x1c, 0x00, 0x25, 0xfe, 0xf7, 0x8e, 0xf9, 0x04, 0x1c, 0x0a, 0xd0, 0x4a, 0x20, 0x00, 0x5d, 0x05, 0x28, 0x06, 0xd1, 0x38, 0x1c, 0xf1, 0xf7, 0x81, 0xfe, 0x00, 0x28, 0x3c, 0x00, 0x00, 0x3b, 0x01, 0x00, 0x01, 0xd0, 0x01, 0x25, 0x34, 0x60, 0x28, 0x1c, 0xf8, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x0d, 0x1c, 0x16, 0x1c, 0x00, 0x24, 0xfe, 0xf7, 0x78, 0xf9, 0x00, 0x28, 0x0b, 0xd0, 0x4a, 0x21, 0x09, 0x5c, 0x05, 0x29, 0x07, 0xd1, 0x01, 0x69, 0x00, 0x29, 0x04, 0xd1, 0x30, 0x60, 0xf1, 0xf7, 0x04, 0xfd, 0x01, 0x24, 0x28, 0x60, 0x20, 0x1c, 0x70, 0xbd, 0xf8, 0xb5, 0x06, 0x1c, 0x3c, 0x00, 0x3c, 0x3b, 0x01, 0x00, 0x00, 0x25, 0x0c, 0x1c, 0x08, 0x1c, 0xf1, 0xf7, 0x5d, 0xfe, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x21, 0x05, 0xe0, 0x20, 0x1c, 0xf1, 0xf7, 0x74, 0xfe, 0x00, 0x28, 0x14, 0xd0, 0x01, 0x21, 0x30, 0x1c, 0xf4, 0xf7, 0x80, 0xfb, 0x00, 0x90, 0x00, 0x28, 0x0d, 0xd0, 0x08, 0x4f, 0x01, 0x25, 0x06, 0x22, 0x31, 0x1c, 0x38, 0x1c, 0xec, 0xf7, 0xc2, 0xfc, 0x06, 0x22, 0x21, 0x1c, 0x3c, 0x00, 0x78, 0x3b, 0x01, 0x00, 0xb8, 0x18, 0xec, 0xf7, 0xbd, 0xfc, 0x00, 0x98, 0xf8, 0x60, 0x28, 0x1c, 0xf8, 0xbd, 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x00, 0x21, 0x00, 0x28, 0x06, 0xd0, 0x42, 0x78, 0x07, 0x2a, 0x03, 0xd1, 0xc0, 0x79, 0x01, 0x28, 0x00, 0xd1, 0x01, 0x21, 0x08, 0x1c, 0x70, 0x47, 0xf8, 0xb5, 0x05, 0x1c, 0x00, 0x27, 0x16, 0x4e, 0xf1, 0xf7, 0x28, 0xfe, 0x00, 0x28, 0x07, 0xd0, 0x3c, 0x00, 0xb4, 0x3b, 0x01, 0x00, 0xf1, 0xf7, 0xc0, 0xfb, 0x00, 0x28, 0x10, 0xd1, 0x00, 0x24, 0xf1, 0xf7, 0xbb, 0xfc, 0x06, 0xe0, 0xf1, 0xf7, 0x02, 0xfe, 0x00, 0x28, 0x08, 0xd0, 0x01, 0x24, 0xf1, 0xf7, 0x99, 0xfd, 0x01, 0x1c, 0x06, 0x22, 0x30, 0x1c, 0xec, 0xf7, 0x8e, 0xfc, 0x01, 0x27, 0x00, 0x2f, 0x0d, 0xd0, 0x21, 0x1c, 0x28, 0x1c, 0xf4, 0xf7, 0x3b, 0xfb, 0x01, 0x1c, 0x05, 0x48, 0x06, 0x22, 0x3c, 0x00, 0xf0, 0x3b, 0x01, 0x00, 0x06, 0x38, 0xc1, 0x60, 0x29, 0x1c, 0xec, 0xf7, 0x7f, 0xfc, 0x01, 0x20, 0xf8, 0xbd, 0x00, 0x20, 0xfc, 0xe7, 0x00, 0x00, 0x76, 0x7c, 0x01, 0x00, 0xf0, 0xb5, 0x07, 0x1c, 0x00, 0x68, 0x02, 0x21, 0x04, 0x68, 0x78, 0x69, 0x87, 0xb0, 0x01, 0x40, 0x00, 0x25, 0x00, 0x29, 0x05, 0x91, 0x74, 0x4e, 0x12, 0xd0, 0x22, 0x88, 0x01, 0x21, 0x13, 0x05, 0x02, 0xd4, 0xc0, 0x07, 0x3c, 0x00, 0x2c, 0x3c, 0x01, 0x00, 0xc1, 0x17, 0x01, 0x31, 0x6f, 0x48, 0x00, 0x29, 0x00, 0x68, 0x01, 0xd0, 0x01, 0x30, 0x04, 0xe0, 0x11, 0x06, 0x89, 0x0e, 0x2d, 0x29, 0x01, 0xd1, 0x03, 0x30, 0x30, 0x60, 0x20, 0x88, 0x80, 0x07, 0x67, 0xd1, 0x78, 0x69, 0xc0, 0x07, 0x64, 0xd5, 0x03, 0xaa, 0x04, 0xa9, 0x20, 0x1c, 0xf7, 0xf7, 0x4b, 0xfb, 0x00, 0xab, 0x18, 0x7c, 0x00, 0x28, 0x07, 0xd0, 0x18, 0x7c, 0x3c, 0x00, 0x68, 0x3c, 0x01, 0x00, 0x02, 0x28, 0x58, 0xd1, 0x18, 0x7b, 0x40, 0x07, 0x40, 0x0f, 0x04, 0x28, 0x53, 0xd8, 0x20, 0x79, 0x05, 0x99, 0xc0, 0x07, 0xc0, 0x17, 0x01, 0x30, 0x02, 0x90, 0x00, 0x29, 0x02, 0xd1, 0x02, 0x98, 0x00, 0x28, 0x48, 0xd1, 0x05, 0x99, 0x00, 0x29, 0x04, 0xd0, 0x20, 0x88, 0x00, 0x05, 0x01, 0xd4, 0x00, 0x20, 0x30, 0x60, 0xc0, 0x20, 0xed, 0xf7, 0xcb, 0xfd, 0x05, 0x1c, 0x3c, 0x00, 0xa4, 0x3c, 0x01, 0x00, 0x20, 0x1c, 0x0a, 0x30, 0x06, 0x90, 0xfe, 0xf7, 0xad, 0xf8, 0x06, 0x1c, 0x28, 0x1c, 0x08, 0x30, 0x23, 0x88, 0x02, 0x1d, 0x11, 0x1d, 0xdb, 0x05, 0x06, 0xd5, 0x06, 0x9b, 0x03, 0x60, 0x20, 0x1c, 0x10, 0x30, 0x10, 0x60, 0x20, 0x1d, 0x0e, 0xe0, 0x23, 0x1d, 0x13, 0x60, 0x22, 0x88, 0x92, 0x05, 0x05, 0xd5, 0x22, 0x1c, 0x10, 0x32, 0x02, 0x60, 0x06, 0x9b, 0x0b, 0x60, 0x3c, 0x00, 0xe0, 0x3c, 0x01, 0x00, 0x04, 0xe0, 0x06, 0x9b, 0x03, 0x60, 0x20, 0x1c, 0x10, 0x30, 0x08, 0x60, 0x28, 0x69, 0xf1, 0xf7, 0x43, 0xfc, 0x00, 0x28, 0x08, 0xd0, 0x01, 0x28, 0x12, 0xd0, 0x02, 0x28, 0x58, 0xd1, 0x00, 0xab, 0x18, 0x7c, 0x00, 0x28, 0x54, 0xd1, 0x12, 0xe0, 0x00, 0xab, 0x18, 0x7c, 0x02, 0x28, 0x0b, 0xd1, 0x00, 0x2e, 0x4d, 0xd0, 0x4b, 0x20, 0x80, 0x5d, 0x02, 0x28, 0x49, 0xd1, 0x3c, 0x00, 0x1c, 0x3d, 0x01, 0x00, 0x07, 0xe0, 0x63, 0xe0, 0x00, 0xab, 0x18, 0x7c, 0x00, 0x28, 0x02, 0xd1, 0x38, 0x1c, 0xfe, 0xf7, 0x1b, 0xff, 0x20, 0x88, 0x41, 0x04, 0x30, 0x48, 0x11, 0xd5, 0x00, 0x2e, 0x52, 0xd0, 0x00, 0xab, 0x19, 0x7c, 0x00, 0x29, 0x26, 0xd0, 0x02, 0x99, 0x00, 0x29, 0x02, 0xd0, 0xb0, 0x6a, 0x00, 0x78, 0x00, 0xe0, 0x00, 0x78, 0x01, 0x28, 0x1d, 0xd0, 0x03, 0x28, 0x43, 0xd1, 0x3c, 0x00, 0x58, 0x3d, 0x01, 0x00, 0x1a, 0xe0, 0x00, 0xab, 0x19, 0x7c, 0x02, 0x29, 0x16, 0xd1, 0x19, 0x7b, 0x04, 0x29, 0x13, 0xd0, 0x19, 0x7b, 0x0c, 0x29, 0x10, 0xd0, 0x22, 0x49, 0x09, 0x68, 0x00, 0x29, 0x0c, 0xd0, 0x00, 0x2e, 0x0a, 0xd0, 0x02, 0x99, 0x00, 0x29, 0x02, 0xd0, 0xb0, 0x6a, 0x00, 0x78, 0x00, 0xe0, 0x00, 0x78, 0x01, 0x28, 0x29, 0xd0, 0x03, 0x28, 0x27, 0xd0, 0x28, 0x22, 0x39, 0x1c, 0x3c, 0x00, 0x94, 0x3d, 0x01, 0x00, 0x28, 0x1c, 0x88, 0x30, 0xec, 0xf7, 0x0a, 0xfc, 0x00, 0xab, 0x19, 0x7c, 0x28, 0x1c, 0x80, 0x30, 0x01, 0x71, 0x19, 0x7b, 0x41, 0x71, 0x6c, 0x60, 0x6e, 0x61, 0x1b, 0xe0, 0x05, 0x99, 0x00, 0x29, 0x14, 0xd0, 0x11, 0x48, 0x84, 0x6c, 0x00, 0x2c, 0x10, 0xd0, 0x00, 0x22, 0x00, 0x2e, 0x04, 0xd0, 0x40, 0x36, 0xb0, 0x7a, 0x05, 0x28, 0x00, 0xd1, 0x01, 0x22, 0x00, 0x92, 0x3c, 0x00, 0xd0, 0x3d, 0x01, 0x00, 0xf8, 0x7a, 0xba, 0x7a, 0x29, 0x69, 0xc3, 0x07, 0xdb, 0x0f, 0x06, 0x98, 0xec, 0xf7, 0x00, 0xfb, 0x28, 0x1c, 0xed, 0xf7, 0x07, 0xfd, 0x00, 0x25, 0x28, 0x1c, 0x07, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xc4, 0x6a, 0x01, 0x00, 0x68, 0x61, 0x01, 0x00, 0x28, 0x61, 0x01, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x20, 0xff, 0xf7, 0x70, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x3e, 0x01, 0x00, 0xb0, 0xb5, 0x1d, 0x4d, 0x01, 0x28, 0x17, 0xd0, 0xa2, 0x28, 0x06, 0xd0, 0xa3, 0x28, 0x03, 0xd1, 0x01, 0x21, 0x15, 0x20, 0xff, 0xf7, 0x08, 0xfc, 0xb0, 0xbd, 0x00, 0x29, 0x01, 0xd1, 0x17, 0x48, 0x02, 0xe0, 0x7d, 0x20, 0xc0, 0x00, 0x48, 0x43, 0x00, 0x23, 0x01, 0x22, 0x01, 0x1c, 0x28, 0x60, 0x15, 0x20, 0xff, 0xf7, 0xa7, 0xfc, 0xb0, 0xbd, 0x01, 0x29, 0x04, 0xd0, 0x3c, 0x00, 0x48, 0x3e, 0x01, 0x00, 0x02, 0x29, 0xfa, 0xd1, 0x00, 0xf0, 0x2a, 0xf8, 0xb0, 0xbd, 0x6c, 0x68, 0xf5, 0xf7, 0xde, 0xfc, 0xfe, 0xf7, 0xa8, 0xff, 0x68, 0x60, 0x00, 0x2c, 0x09, 0xd0, 0x29, 0x68, 0x0a, 0x23, 0x59, 0x43, 0x00, 0x1b, 0x88, 0x42, 0x03, 0xd9, 0x01, 0x21, 0x15, 0x20, 0xed, 0xf7, 0x17, 0xfa, 0x01, 0x22, 0x15, 0x20, 0x29, 0x68, 0xff, 0xf7, 0xa6, 0xfb, 0xb0, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x84, 0x3e, 0x01, 0x00, 0x04, 0x79, 0x01, 0x00, 0x00, 0x87, 0x93, 0x03, 0x01, 0x20, 0x04, 0x49, 0x40, 0x03, 0x80, 0xb5, 0x08, 0x60, 0x03, 0x21, 0x15, 0x20, 0xed, 0xf7, 0x03, 0xfa, 0x80, 0xbd, 0x00, 0x10, 0x07, 0x00, 0x07, 0x48, 0x80, 0xb5, 0xbe, 0x21, 0x01, 0x73, 0x01, 0x7a, 0x10, 0x22, 0x11, 0x43, 0x01, 0x72, 0x00, 0x23, 0x02, 0x22, 0x15, 0x20, 0x03, 0x49, 0xff, 0xf7, 0x68, 0xfc, 0x3c, 0x00, 0xc0, 0x3e, 0x01, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, 0x80, 0x9f, 0xd5, 0x00, 0x80, 0xb5, 0x00, 0x28, 0x03, 0xd0, 0x0a, 0x1c, 0x15, 0x21, 0xa2, 0x20, 0x02, 0xe0, 0x00, 0x22, 0x15, 0x21, 0xa3, 0x20, 0xff, 0xf7, 0x66, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x00, 0xf0, 0x19, 0xf8, 0x0a, 0x48, 0xbe, 0x21, 0x01, 0x73, 0x03, 0x7a, 0x10, 0x22, 0x93, 0x43, 0x01, 0x24, 0x3c, 0x00, 0xfc, 0x3e, 0x01, 0x00, 0x23, 0x43, 0x03, 0x72, 0x01, 0x73, 0x01, 0x7a, 0x91, 0x43, 0x20, 0x22, 0x11, 0x43, 0x01, 0x72, 0x02, 0x22, 0x15, 0x20, 0x02, 0x49, 0xff, 0xf7, 0x5b, 0xfb, 0x10, 0xbd, 0x00, 0x03, 0x07, 0x00, 0x80, 0x9f, 0xd5, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x15, 0x20, 0xff, 0xf7, 0x85, 0xfb, 0x04, 0x48, 0xbe, 0x21, 0x01, 0x73, 0x01, 0x7a, 0x11, 0x22, 0x91, 0x43, 0x01, 0x72, 0x3c, 0x00, 0x38, 0x3f, 0x01, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x05, 0x1c, 0x60, 0x36, 0x00, 0x27, 0x44, 0x68, 0x22, 0xe0, 0x08, 0x21, 0x00, 0x20, 0xed, 0xf7, 0x41, 0xfb, 0x60, 0x61, 0x01, 0x89, 0x04, 0x39, 0x09, 0x04, 0x09, 0x0c, 0x01, 0x81, 0x60, 0x69, 0x00, 0x68, 0x40, 0x18, 0x04, 0x21, 0xed, 0xf7, 0x35, 0xfb, 0xe0, 0x61, 0x60, 0x69, 0x71, 0x7b, 0x3c, 0x00, 0x74, 0x3f, 0x01, 0x00, 0x00, 0x68, 0x89, 0x01, 0xc1, 0x70, 0x29, 0x69, 0x0c, 0x31, 0x03, 0x22, 0xec, 0xf7, 0xba, 0xfa, 0x28, 0x69, 0x0c, 0x30, 0x01, 0x68, 0x01, 0x31, 0x01, 0x60, 0x25, 0x62, 0xa7, 0x61, 0x24, 0x68, 0x00, 0x2c, 0xda, 0xd1, 0x02, 0x49, 0x03, 0x48, 0x6a, 0x68, 0xf6, 0xf7, 0xb3, 0xf8, 0xf8, 0xbd, 0xfd, 0x6b, 0x00, 0x00, 0xa0, 0x6a, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x07, 0x3c, 0x00, 0xb0, 0x3f, 0x01, 0x00, 0x00, 0x09, 0x09, 0x02, 0x09, 0x0a, 0x08, 0x43, 0x02, 0x49, 0x08, 0x60, 0xff, 0xf7, 0x20, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x60, 0x00, 0x07, 0x00, 0x08, 0x00, 0x14, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x10, 0x00, 0x14, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x1c, 0x00, 0x14, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x3c, 0x00, 0xec, 0x3f, 0x01, 0x00, 0x24, 0x01, 0x07, 0x00, 0x32, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x40, 0x06, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x41, 0x6e, 0x62, 0x69, 0x7e, 0x64, 0x61, 0x6f, 0x6f, 0x00, 0x00, 0x00, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x36, 0x5f, 0x37, 0x5f, 0x31, 0x35, 0x20, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x32, 0x3a, 0x35, 0x3c, 0x00, 0x28, 0x40, 0x01, 0x00, 0x32, 0x39, 0x38, 0x20, 0x53, 0x65, 0x70, 0x20, 0x30, 0x34, 0x20, 0x32, 0x30, 0x30, 0x39, 0x20, 0x31, 0x37, 0x3a, 0x31, 0x33, 0x3a, 0x32, 0x30, 0x20, 0x28, 0x48, 0x57, 0x3d, 0x34, 0x3a, 0x33, 0x2c, 0x42, 0x54, 0x43, 0x4f, 0x45, 0x58, 0x29, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x1c, 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3c, 0x00, 0x64, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xd0, 0x07, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x7c, 0x15, 0x15, 0x00, 0x3c, 0x00, 0xa0, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x70, 0x17, 0x1e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x28, 0x23, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xf8, 0x2a, 0x0b, 0x00, 0x3c, 0x00, 0xdc, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0xe0, 0x2e, 0x12, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x50, 0x46, 0x0e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0xf0, 0x55, 0x08, 0x00, 0x3c, 0x00, 0x18, 0x41, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0xc0, 0x5d, 0x0e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xe8, 0x80, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x3c, 0x00, 0x54, 0x41, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x80, 0xbb, 0x0a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0xf0, 0xd2, 0x0a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x90, 0x00, 0x3c, 0x00, 0x90, 0x41, 0x01, 0x00, 0xc0, 0x00, 0x90, 0x00, 0xc0, 0x00, 0x90, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0xc0, 0x00, 0x90, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0xc0, 0x00, 0x90, 0x00, 0x14, 0x00, 0x10, 0x00, 0xc0, 0x00, 0x90, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0xc0, 0x00, 0x90, 0x00, 0x60, 0x00, 0x48, 0x00, 0x3c, 0x00, 0xcc, 0x41, 0x01, 0x00, 0x60, 0x00, 0x48, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0x60, 0x00, 0x48, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0x60, 0x00, 0x48, 0x00, 0x14, 0x00, 0x10, 0x00, 0x60, 0x00, 0x48, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0x02, 0x00, 0x04, 0x01, 0x0b, 0x02, 0x0c, 0x03, 0x12, 0x04, 0x16, 0x05, 0x3c, 0x00, 0x08, 0x42, 0x01, 0x00, 0x18, 0x06, 0x00, 0x0e, 0x00, 0x0e, 0x24, 0x07, 0x00, 0x0e, 0x2c, 0x08, 0x30, 0x09, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x42, 0x0a, 0x00, 0x0e, 0x48, 0x0b, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x60, 0x0c, 0x00, 0x0e, 0x00, 0x0e, 0x6c, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xff, 0xff, 0xff, 0x3c, 0x00, 0x44, 0x42, 0x01, 0x00, 0xb6, 0xff, 0xff, 0xff, 0xd3, 0xff, 0xff, 0xff, 0xc9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0xb0, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x51, 0xb0, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x59, 0xaf, 0x00, 0x00, 0x3c, 0x00, 0x80, 0x42, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0xaf, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xb0, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xbc, 0x42, 0x01, 0x00, 0x95, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0xb0, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x42, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x17, 0x01, 0x00, 0x35, 0x17, 0x01, 0x00, 0x21, 0x17, 0x01, 0x00, 0xd9, 0x9c, 0x00, 0x00, 0x49, 0x17, 0x01, 0x00, 0x3d, 0x17, 0x01, 0x00, 0xd1, 0x9c, 0x00, 0x00, 0xd1, 0x9c, 0x00, 0x00, 0x1d, 0x1a, 0x01, 0x00, 0xd1, 0x9c, 0x00, 0x00, 0x01, 0x1a, 0x01, 0x00, 0x31, 0x1a, 0x01, 0x00, 0x25, 0x1a, 0x01, 0x00, 0x3d, 0x17, 0x01, 0x00, 0x3c, 0x00, 0x34, 0x43, 0x01, 0x00, 0x81, 0x1a, 0x01, 0x00, 0xd1, 0x9c, 0x00, 0x00, 0x79, 0x17, 0x01, 0x00, 0xd9, 0x9c, 0x00, 0x00, 0x5d, 0x17, 0x01, 0x00, 0xa1, 0x17, 0x01, 0x00, 0x95, 0x17, 0x01, 0x00, 0x81, 0x17, 0x01, 0x00, 0x21, 0x18, 0x01, 0x00, 0xf5, 0x17, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x70, 0x43, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x19, 0x1c, 0x01, 0x00, 0x89, 0x41, 0x00, 0x00, 0x89, 0x41, 0x00, 0x00, 0x85, 0x41, 0x00, 0x00, 0x85, 0x41, 0x00, 0x00, 0x85, 0x41, 0x00, 0x00, 0x85, 0x41, 0x00, 0x00, 0x89, 0x41, 0x00, 0x00, 0x85, 0x41, 0x00, 0x00, 0x85, 0x41, 0x00, 0x00, 0x35, 0x1b, 0x01, 0x00, 0x3c, 0x00, 0xac, 0x43, 0x01, 0x00, 0x9d, 0x1b, 0x01, 0x00, 0x01, 0x1c, 0x01, 0x00, 0x89, 0x41, 0x00, 0x00, 0x89, 0x41, 0x00, 0x00, 0x89, 0x41, 0x00, 0x00, 0x85, 0x41, 0x00, 0x00, 0x65, 0x18, 0x01, 0x00, 0x29, 0x18, 0x01, 0x00, 0x39, 0x18, 0x01, 0x00, 0xbd, 0x18, 0x01, 0x00, 0x89, 0x41, 0x00, 0x00, 0x4d, 0x18, 0x01, 0x00, 0xa5, 0x18, 0x01, 0x00, 0x85, 0x41, 0x00, 0x00, 0x01, 0x19, 0x01, 0x00, 0x3c, 0x00, 0xe8, 0x43, 0x01, 0x00, 0xd9, 0x18, 0x01, 0x00, 0xed, 0x18, 0x01, 0x00, 0x15, 0x19, 0x01, 0x00, 0x89, 0x41, 0x00, 0x00, 0x89, 0x41, 0x00, 0x00, 0x89, 0x41, 0x00, 0x00, 0x85, 0x41, 0x00, 0x00, 0x89, 0x41, 0x00, 0x00, 0x89, 0x41, 0x00, 0x00, 0x69, 0x1c, 0x01, 0x00, 0x89, 0x41, 0x00, 0x00, 0x71, 0x1c, 0x01, 0x00, 0x89, 0x41, 0x00, 0x00, 0x89, 0x41, 0x00, 0x00, 0xfd, 0xdb, 0x00, 0x00, 0x3c, 0x00, 0x24, 0x44, 0x01, 0x00, 0x1d, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xf5, 0xda, 0x00, 0x00, 0x14, 0x00, 0x81, 0x00, 0xfd, 0xdd, 0x00, 0x00, 0x08, 0x00, 0x82, 0x00, 0xc5, 0xdd, 0x00, 0x00, 0x38, 0x00, 0x83, 0x00, 0x45, 0xdc, 0x00, 0x00, 0x10, 0x00, 0x84, 0x00, 0x99, 0xdc, 0x00, 0x00, 0x0c, 0x00, 0x86, 0x00, 0x39, 0xdc, 0x00, 0x00, 0x10, 0x00, 0x88, 0x00, 0x11, 0xde, 0x00, 0x00, 0x3c, 0x00, 0x60, 0x44, 0x01, 0x00, 0x10, 0x00, 0x8a, 0x00, 0x35, 0xdd, 0x00, 0x00, 0x0c, 0x00, 0x8c, 0x00, 0xad, 0xdf, 0x00, 0x00, 0x1c, 0x00, 0x8e, 0x00, 0xc9, 0xde, 0x00, 0x00, 0x38, 0x00, 0x8f, 0x00, 0xed, 0xdc, 0x00, 0x00, 0x38, 0x00, 0x90, 0x00, 0x75, 0xdf, 0x00, 0x00, 0x0c, 0x00, 0x91, 0x00, 0x8d, 0xdc, 0x00, 0x00, 0x0c, 0x00, 0x93, 0x00, 0xb9, 0xdd, 0x00, 0x00, 0x0c, 0x00, 0x94, 0x00, 0x3c, 0x00, 0x9c, 0x44, 0x01, 0x00, 0x00, 0x08, 0x08, 0x08, 0x10, 0x0c, 0x0c, 0x0c, 0x08, 0x0c, 0x08, 0x0c, 0x08, 0x0c, 0x08, 0x08, 0x08, 0x08, 0x14, 0x08, 0x08, 0x14, 0x00, 0x30, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0xad, 0x30, 0x01, 0x00, 0x15, 0x30, 0x01, 0x00, 0x20, 0x30, 0x07, 0x00, 0x30, 0x30, 0x07, 0x00, 0x06, 0x07, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0x44, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc9, 0x02, 0x00, 0x94, 0x3f, 0x03, 0x00, 0xe0, 0x8b, 0x5a, 0x00, 0x05, 0x3a, 0x85, 0x00, 0xc8, 0xf2, 0x06, 0x00, 0xf8, 0x4c, 0x56, 0x00, 0x20, 0xa7, 0x3d, 0x00, 0xb7, 0x4a, 0x00, 0x00, 0xb7, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x14, 0x45, 0x01, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x06, 0x00, 0x00, 0x2d, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xfd, 0x95, 0x00, 0x00, 0x08, 0x00, 0xff, 0x00, 0xed, 0x97, 0x00, 0x00, 0x08, 0x00, 0x82, 0x00, 0xcd, 0x95, 0x00, 0x00, 0x0c, 0x00, 0x83, 0x00, 0x4d, 0x96, 0x00, 0x00, 0x0c, 0x00, 0x85, 0x00, 0x2d, 0x7c, 0x00, 0x00, 0x3c, 0x00, 0x50, 0x45, 0x01, 0x00, 0x00, 0x00, 0xff, 0x00, 0x2d, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x2d, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x3d, 0x96, 0x00, 0x00, 0x0c, 0x00, 0x89, 0x00, 0xd9, 0x97, 0x00, 0x00, 0x08, 0x00, 0x8a, 0x00, 0x91, 0x95, 0x00, 0x00, 0x08, 0x00, 0xff, 0x00, 0x2d, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x2d, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x3c, 0x00, 0x8c, 0x45, 0x01, 0x00, 0xf9, 0x97, 0x00, 0x00, 0x08, 0x00, 0x8d, 0x00, 0x2d, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x2d, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xc9, 0x97, 0x00, 0x00, 0x30, 0x00, 0x90, 0x00, 0x11, 0x95, 0x00, 0x00, 0x18, 0x00, 0x91, 0x00, 0x15, 0x96, 0x00, 0x00, 0x08, 0x00, 0x92, 0x00, 0x59, 0x95, 0x00, 0x00, 0x3c, 0x00, 0x93, 0x00, 0x29, 0x96, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0x45, 0x01, 0x00, 0x08, 0x00, 0x94, 0x00, 0xa1, 0x95, 0x00, 0x00, 0x08, 0x00, 0x95, 0x00, 0x81, 0x97, 0x00, 0x00, 0x0c, 0x00, 0x96, 0x00, 0x6d, 0x97, 0x00, 0x00, 0x10, 0x00, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x08, 0x00, 0x10, 0x3c, 0x00, 0x04, 0x46, 0x01, 0x00, 0x08, 0x0c, 0x0c, 0x0c, 0x0c, 0x1c, 0x0c, 0x0c, 0x08, 0x00, 0x00, 0x00, 0x0d, 0x8b, 0x00, 0x00, 0xf5, 0x8a, 0x00, 0x00, 0xe9, 0x8a, 0x00, 0x00, 0x01, 0x8b, 0x00, 0x00, 0x14, 0x08, 0x0c, 0x0c, 0x10, 0x0c, 0x00, 0x00, 0xb1, 0x98, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x19, 0x99, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x3d, 0x7c, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x40, 0x46, 0x01, 0x00, 0x3d, 0x99, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x09, 0x99, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x3d, 0x7c, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x01, 0x04, 0x04, 0x08, 0x08, 0x81, 0x37, 0x80, 0xf3, 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8, 0x6d, 0xa9, 0x6d, 0xa9, 0x6e, 0xa9, 0x3c, 0x00, 0x7c, 0x46, 0x01, 0x00, 0x6e, 0xa8, 0x6e, 0xa8, 0x6e, 0xa8, 0x6f, 0xa7, 0x6f, 0xa7, 0x6f, 0xa7, 0x6f, 0xa6, 0x6f, 0xa6, 0x70, 0xa6, 0x70, 0xa5, 0x70, 0xa4, 0x00, 0x00, 0xb5, 0x1b, 0x01, 0x00, 0xc9, 0x1b, 0x01, 0x00, 0xe1, 0x1b, 0x01, 0x00, 0xe5, 0x9c, 0x00, 0x00, 0xa5, 0x1b, 0x01, 0x00, 0xe5, 0x9c, 0x00, 0x00, 0x89, 0x1b, 0x01, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0x46, 0x01, 0x00, 0xd1, 0x1a, 0x01, 0x00, 0xe5, 0x1a, 0x01, 0x00, 0x05, 0x1b, 0x01, 0x00, 0x25, 0x1b, 0x01, 0x00, 0xb1, 0x1a, 0x01, 0x00, 0xe5, 0x9c, 0x00, 0x00, 0x9d, 0x1a, 0x01, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0xc1, 0x1a, 0x01, 0x00, 0x89, 0x19, 0x01, 0x00, 0xa9, 0x19, 0x01, 0x00, 0xc9, 0x19, 0x01, 0x00, 0xf1, 0x19, 0x01, 0x00, 0x79, 0x19, 0x01, 0x00, 0xe5, 0x9c, 0x00, 0x00, 0x3c, 0x00, 0xf4, 0x46, 0x01, 0x00, 0x65, 0x19, 0x01, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0x55, 0x1c, 0x01, 0x00, 0x45, 0x1c, 0x01, 0x00, 0x45, 0x1c, 0x01, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0x3c, 0x00, 0x30, 0x47, 0x01, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0x55, 0x19, 0x01, 0x00, 0xe5, 0x9c, 0x00, 0x00, 0x41, 0x19, 0x01, 0x00, 0x31, 0x19, 0x01, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0x02, 0x05, 0x0a, 0x00, 0x00, 0x00, 0x02, 0x04, 0x0a, 0x00, 0x00, 0x00, 0xc5, 0x20, 0x00, 0x00, 0x21, 0x21, 0x00, 0x00, 0x25, 0x21, 0x00, 0x00, 0x39, 0x21, 0x00, 0x00, 0x49, 0x21, 0x00, 0x00, 0x55, 0x21, 0x00, 0x00, 0x3c, 0x00, 0x6c, 0x47, 0x01, 0x00, 0x61, 0x21, 0x00, 0x00, 0xed, 0x21, 0x00, 0x00, 0x0d, 0x22, 0x00, 0x00, 0x21, 0x22, 0x00, 0x00, 0x3d, 0x22, 0x00, 0x00, 0x49, 0x22, 0x00, 0x00, 0xc5, 0x22, 0x00, 0x00, 0xe1, 0x22, 0x00, 0x00, 0xf5, 0x22, 0x00, 0x00, 0xe9, 0x1f, 0x00, 0x00, 0xe9, 0x1f, 0x00, 0x00, 0xe9, 0x1f, 0x00, 0x00, 0xe9, 0x1f, 0x00, 0x00, 0xe9, 0x1f, 0x00, 0x00, 0x11, 0x23, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0x47, 0x01, 0x00, 0x1d, 0x23, 0x00, 0x00, 0x89, 0x23, 0x00, 0x00, 0xa5, 0x23, 0x00, 0x00, 0xb9, 0x23, 0x00, 0x00, 0x11, 0x20, 0x00, 0x00, 0x1d, 0x20, 0x00, 0x00, 0x6d, 0x20, 0x00, 0x00, 0x8d, 0x20, 0x00, 0x00, 0xb9, 0x20, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x03, 0x05, 0x06, 0x06, 0x08, 0x09, 0x08, 0x09, 0x09, 0x09, 0xc4, 0x80, 0xca, 0x80, 0x80, 0x80, 0x80, 0x80, 0xd0, 0x80, 0x3c, 0x00, 0xe4, 0x47, 0x01, 0x00, 0xd6, 0xd9, 0xdc, 0xdf, 0xe2, 0x80, 0x80, 0x80, 0xe5, 0xe8, 0x80, 0x80, 0x80, 0x80, 0xeb, 0xee, 0xf1, 0xf4, 0xf7, 0xfa, 0xfd, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x10, 0x00, 0x11, 0x00, 0x13, 0x00, 0x16, 0x00, 0x18, 0x00, 0x1b, 0x00, 0x3c, 0x00, 0x20, 0x48, 0x01, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x26, 0x00, 0x2b, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3c, 0x00, 0x44, 0x00, 0x4c, 0x00, 0x55, 0x00, 0x5f, 0x00, 0x6b, 0x00, 0x78, 0x00, 0x86, 0x00, 0x97, 0x00, 0xa9, 0x00, 0xbe, 0x00, 0xd5, 0x00, 0xef, 0x00, 0xff, 0x7f, 0x0c, 0x00, 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xf8, 0xff, 0x3c, 0x00, 0x5c, 0x48, 0x01, 0x00, 0xf7, 0xff, 0xf6, 0xff, 0xf5, 0xff, 0xf4, 0xff, 0xf3, 0xff, 0xf2, 0xff, 0xf1, 0xff, 0xf0, 0xff, 0xef, 0xff, 0xee, 0xff, 0xed, 0xff, 0xec, 0xff, 0xeb, 0xff, 0xea, 0xff, 0xe9, 0xff, 0xe8, 0xff, 0xe7, 0xff, 0xe6, 0xff, 0xe5, 0xff, 0xe4, 0xff, 0xe3, 0xff, 0xe2, 0xff, 0xe1, 0xff, 0xe0, 0xff, 0xdf, 0xff, 0xde, 0xff, 0xdd, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0x00, 0x00, 0x3c, 0x00, 0x98, 0x48, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb1, 0x7c, 0x41, 0x00, 0x11, 0x5a, 0x40, 0xe2, 0xb2, 0x7c, 0x41, 0x00, 0x05, 0x5a, 0x40, 0xe2, 0xaf, 0x7c, 0x41, 0x00, 0xf9, 0x59, 0x40, 0xe2, 0xb0, 0x7c, 0x41, 0x00, 0xed, 0x59, 0x40, 0xe2, 0x24, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x5c, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x0a, 0x61, 0x01, 0x00, 0x3c, 0x00, 0xd4, 0x48, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0x0e, 0x61, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0x32, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x6a, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x0b, 0x61, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0x0f, 0x61, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0x40, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x78, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x3c, 0x00, 0x10, 0x49, 0x01, 0x00, 0x0c, 0x61, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0x10, 0x61, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0x4e, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x86, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x0d, 0x61, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0x11, 0x61, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0xc0, 0x48, 0x01, 0x00, 0x04, 0x00, 0x00, 0x0a, 0xe0, 0x48, 0x01, 0x00, 0x3c, 0x00, 0x4c, 0x49, 0x01, 0x00, 0x04, 0x00, 0x00, 0x0a, 0x00, 0x49, 0x01, 0x00, 0x04, 0x00, 0x00, 0x0a, 0x20, 0x49, 0x01, 0x00, 0x04, 0x00, 0x00, 0x0a, 0x18, 0x67, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x28, 0x75, 0x01, 0x01, 0x7d, 0xa9, 0x40, 0xe2, 0x2c, 0x75, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x20, 0x75, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x44, 0x75, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x3c, 0x00, 0x88, 0x49, 0x01, 0x00, 0xf0, 0x59, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x75, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xb8, 0x7c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x8d, 0xa9, 0x00, 0x00, 0x01, 0x00, 0x00, 0xda, 0x1d, 0x75, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe2, 0xc4, 0x67, 0x01, 0x00, 0x3c, 0x00, 0xc4, 0x49, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x59, 0x00, 0x00, 0x0e, 0x00, 0x00, 0xd9, 0xc8, 0x67, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xcc, 0x67, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xd0, 0x67, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x65, 0xd9, 0x00, 0x00, 0x04, 0x00, 0x00, 0xda, 0xa5, 0xd9, 0x00, 0x00, 0x04, 0x00, 0x00, 0xda, 0x3c, 0x00, 0x00, 0x4a, 0x01, 0x00, 0x01, 0x59, 0x00, 0x00, 0x01, 0x00, 0x00, 0xda, 0x32, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x6a, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x11, 0x59, 0x00, 0x00, 0x01, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x48, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0xa0, 0x48, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x40, 0x49, 0x01, 0x00, 0x3c, 0x00, 0x3c, 0x4a, 0x01, 0x00, 0x05, 0x00, 0x00, 0x0a, 0x68, 0x49, 0x01, 0x00, 0x09, 0x00, 0x00, 0x0a, 0x6c, 0x57, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x38, 0x61, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x6e, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xb0, 0x6e, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x70, 0x57, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x3c, 0x00, 0x78, 0x4a, 0x01, 0x00, 0xe8, 0x59, 0x01, 0x00, 0x08, 0x00, 0x00, 0xe3, 0xdc, 0x58, 0x01, 0x14, 0x4d, 0xfd, 0x40, 0xe3, 0x2c, 0x59, 0x01, 0x14, 0x39, 0xfd, 0x40, 0xe3, 0xc0, 0x58, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x73, 0x41, 0x00, 0x3d, 0x2e, 0x44, 0xe2, 0x7c, 0x59, 0x01, 0x14, 0x3c, 0x00, 0xb4, 0x4a, 0x01, 0x00, 0x9d, 0x2f, 0x44, 0xe3, 0x5c, 0x57, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe2, 0x79, 0x2e, 0x04, 0x00, 0x01, 0x00, 0x00, 0xdb, 0xa0, 0x58, 0x01, 0x00, 0x02, 0x00, 0x00, 0xe3, 0xa2, 0x58, 0x01, 0x00, 0x02, 0x00, 0x00, 0xe3, 0xa0, 0x57, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0xd1, 0x88, 0x01, 0x00, 0x01, 0x00, 0x00, 0xda, 0x1d, 0x89, 0x01, 0x00, 0x04, 0x00, 0x00, 0xda, 0x3c, 0x00, 0xf0, 0x4a, 0x01, 0x00, 0x95, 0x88, 0x01, 0x00, 0x04, 0x00, 0x00, 0xdb, 0x31, 0x2f, 0x04, 0x00, 0x0e, 0x00, 0x00, 0xd9, 0xc5, 0x2e, 0x04, 0x00, 0x0e, 0x00, 0x00, 0xd9, 0x68, 0x6c, 0x01, 0x01, 0x15, 0xd5, 0x40, 0xe2, 0xc0, 0x57, 0x01, 0x00, 0x08, 0x00, 0x00, 0xe3, 0xc8, 0x57, 0x01, 0x00, 0x34, 0x00, 0x00, 0xe3, 0x9c, 0x6c, 0x01, 0x00, 0x08, 0x00, 0x00, 0xe3, 0xb0, 0x58, 0x01, 0x03, 0x3c, 0x00, 0x2c, 0x4b, 0x01, 0x00, 0xe9, 0xd4, 0x40, 0xe2, 0xbc, 0x58, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x9d, 0xa3, 0x00, 0x00, 0x60, 0x00, 0x00, 0xd9, 0x70, 0x79, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x78, 0x79, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x7c, 0x5a, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x5d, 0x1c, 0x00, 0x00, 0x11, 0x00, 0x00, 0xd9, 0x24, 0x6e, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x3c, 0x00, 0x68, 0x4b, 0x01, 0x00, 0x18, 0x58, 0x01, 0x05, 0xd5, 0xd5, 0x40, 0xe3, 0xfc, 0x57, 0x01, 0x00, 0x14, 0x00, 0x00, 0xe3, 0x04, 0x8e, 0x01, 0x03, 0xe5, 0xd5, 0x40, 0xe3, 0x00, 0x5b, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x18, 0x5b, 0x01, 0x00, 0x40, 0x00, 0x00, 0xe2, 0xd4, 0x67, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x8d, 0x37, 0x00, 0x00, 0x04, 0x00, 0x00, 0xdb, 0xbd, 0x36, 0x00, 0x00, 0x3c, 0x00, 0xa4, 0x4b, 0x01, 0x00, 0x04, 0x00, 0x00, 0xdb, 0xfc, 0x60, 0x01, 0x00, 0x02, 0x00, 0x00, 0xe2, 0x90, 0x7d, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x70, 0x69, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x49, 0x01, 0x00, 0x1a, 0x00, 0x00, 0x0a, 0x90, 0x4b, 0x01, 0x00, 0x06, 0x00, 0x00, 0x0a, 0xa4, 0x58, 0x81, 0x00, 0x05, 0xfd, 0x40, 0xe3, 0x3c, 0x00, 0xe0, 0x4b, 0x01, 0x00, 0x80, 0x4a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x0a, 0x0c, 0x5a, 0x81, 0x01, 0x25, 0x2d, 0x44, 0xe3, 0xe0, 0x4a, 0x01, 0x00, 0x03, 0x00, 0x00, 0x0a, 0x18, 0x63, 0x41, 0x00, 0xfd, 0xbb, 0x40, 0xe2, 0x08, 0x57, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe2, 0x9c, 0x48, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x4a, 0x01, 0x00, 0x3c, 0x00, 0x1c, 0x4c, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0xcc, 0x74, 0x01, 0x00, 0x03, 0x00, 0x00, 0xe3, 0x65, 0x73, 0x41, 0x00, 0xa9, 0x2e, 0x44, 0xe2, 0xf6, 0x59, 0x01, 0x01, 0xd1, 0x2c, 0x44, 0xe3, 0x08, 0x4b, 0x01, 0x00, 0x04, 0x00, 0x00, 0x0a, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x6a, 0x28, 0x4b, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x88, 0x7d, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x3c, 0x00, 0x58, 0x4c, 0x01, 0x00, 0x00, 0x75, 0x01, 0x04, 0x65, 0x6f, 0x40, 0xe3, 0xbc, 0x78, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x38, 0x4b, 0x01, 0x00, 0x04, 0x00, 0x00, 0x0a, 0x04, 0x57, 0x01, 0x00, 0x04, 0x00, 0x00, 0x62, 0x58, 0x4b, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x80, 0x4b, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x68, 0x4b, 0x01, 0x00, 0x03, 0x00, 0x00, 0x0a, 0x8c, 0x7d, 0x01, 0x00, 0x3c, 0x00, 0x94, 0x4c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x39, 0x2d, 0x04, 0x00, 0x04, 0x00, 0x00, 0xdb, 0x94, 0x7d, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x64, 0xa8, 0x4c, 0x01, 0x00, 0x04, 0x00, 0x00, 0x0a, 0x3c, 0x00, 0xd0, 0x4c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x4c, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0a, 0xd0, 0x4c, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x7a, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe2, 0xe8, 0x7a, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x7a, 0x01, 0x00, 0x3c, 0x00, 0x0c, 0x4d, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe2, 0xee, 0x7a, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf3, 0x7a, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe2, 0xf4, 0x7a, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x7a, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe2, 0xfa, 0x7a, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe2, 0x3c, 0x00, 0x48, 0x4d, 0x01, 0x00, 0xe8, 0x4c, 0x01, 0x00, 0x03, 0x00, 0x00, 0x0a, 0x00, 0x4d, 0x01, 0x00, 0x03, 0x00, 0x00, 0x0a, 0x18, 0x4d, 0x01, 0x00, 0x03, 0x00, 0x00, 0x0a, 0x30, 0x4d, 0x01, 0x00, 0x03, 0x00, 0x00, 0x0a, 0x90, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x94, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x98, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x9c, 0x5c, 0x01, 0x00, 0x3c, 0x00, 0x84, 0x4d, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xa0, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xa4, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xa8, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xac, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xb0, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xb4, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xb8, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x3c, 0x00, 0xc0, 0x4d, 0x01, 0x00, 0xbc, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xc0, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xc4, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x90, 0x5c, 0x01, 0x00, 0x38, 0x00, 0x00, 0xe3, 0x68, 0x4d, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x0a, 0xd8, 0x4d, 0x01, 0x00, 0x02, 0x00, 0x00, 0xfa, 0x12, 0x61, 0x81, 0x01, 0x31, 0xd5, 0x40, 0xe3, 0x06, 0x61, 0x01, 0x00, 0x3c, 0x00, 0xfc, 0x4d, 0x01, 0x00, 0x02, 0x00, 0x00, 0xe2, 0x0b, 0x61, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0x0f, 0x61, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0x08, 0x61, 0x01, 0x00, 0x02, 0x00, 0x00, 0xe2, 0x50, 0x7b, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x4e, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x64, 0x9c, 0x57, 0x01, 0x01, 0x91, 0x88, 0x41, 0xe3, 0x3c, 0x00, 0x38, 0x4e, 0x01, 0x00, 0x6e, 0x41, 0x67, 0x6f, 0xe2, 0x65, 0x60, 0x69, 0x6f, 0x20, 0x41, 0x42, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x4d, 0x01, 0x00, 0x09, 0x00, 0x00, 0x0a, 0x48, 0x4e, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0a, 0xe8, 0x4d, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x4d, 0x01, 0x00, 0x04, 0x00, 0x00, 0x0a, 0x28, 0x61, 0x01, 0x01, 0x3c, 0x00, 0x74, 0x4e, 0x01, 0x00, 0xbd, 0xd5, 0x40, 0xe2, 0x69, 0x61, 0x41, 0x00, 0x85, 0xd5, 0x40, 0xe2, 0x30, 0x61, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x34, 0x61, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x3c, 0x61, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x34, 0x61, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x44, 0x61, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x3c, 0x00, 0xb0, 0x4e, 0x01, 0x00, 0x70, 0x4e, 0x01, 0x00, 0x08, 0x00, 0x00, 0x0a, 0x18, 0x61, 0x01, 0x00, 0x02, 0x00, 0x00, 0xe2, 0x1c, 0x61, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x20, 0x61, 0x01, 0x00, 0x02, 0x00, 0x00, 0xe2, 0x24, 0x61, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xb8, 0x4e, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0xc8, 0x4e, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0xd8, 0x4e, 0x01, 0x00, 0x3c, 0x00, 0xec, 0x4e, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x96, 0x48, 0x01, 0x00, 0x06, 0x00, 0x00, 0xe3, 0xe0, 0x62, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x9b, 0x7d, 0x01, 0x00, 0x01, 0x00, 0x00, 0x62, 0x9c, 0x7d, 0x01, 0x00, 0x02, 0x00, 0x00, 0x62, 0x60, 0x7c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x3c, 0x00, 0x28, 0x4f, 0x01, 0x00, 0x2d, 0x63, 0x01, 0x00, 0x01, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xd5, 0x00, 0x00, 0x0e, 0x00, 0x00, 0xd9, 0xf4, 0x67, 0x01, 0x00, 0x02, 0x00, 0x00, 0x62, 0x46, 0x7d, 0x01, 0x00, 0x01, 0x00, 0x00, 0x62, 0x9c, 0x7c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x98, 0x7c, 0x01, 0x00, 0x3c, 0x00, 0x64, 0x4f, 0x01, 0x00, 0x02, 0x00, 0x00, 0x62, 0xa0, 0x7c, 0x01, 0x00, 0x06, 0x00, 0x00, 0x62, 0x58, 0x7c, 0x01, 0x00, 0x02, 0x00, 0x00, 0x62, 0x64, 0x7c, 0x01, 0x00, 0x06, 0x00, 0x00, 0x62, 0x5a, 0x7c, 0x01, 0x00, 0x02, 0x00, 0x00, 0x62, 0x6a, 0x7c, 0x01, 0x00, 0x06, 0x00, 0x00, 0x62, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0xe4, 0x62, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x3c, 0x00, 0xa0, 0x4f, 0x01, 0x00, 0xe8, 0x62, 0x01, 0x00, 0x03, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xdc, 0x4f, 0x01, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x3c, 0x00, 0x18, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0xf0, 0x4e, 0x01, 0x00, 0x2a, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x3c, 0x00, 0x54, 0x50, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x3c, 0x00, 0x90, 0x50, 0x01, 0x00, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x07, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x09, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xcc, 0x50, 0x01, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x0a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x0b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x3c, 0x00, 0x08, 0x51, 0x01, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x0e, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x48, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x58, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x68, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x78, 0x50, 0x01, 0x00, 0x3c, 0x00, 0x44, 0x51, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x88, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x98, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0xa8, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0xb8, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0xc8, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0xd8, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0xe8, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x3c, 0x00, 0x80, 0x51, 0x01, 0x00, 0xf8, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x08, 0x51, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x18, 0x51, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x40, 0x50, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0a, 0xe8, 0x4e, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x4e, 0x01, 0x00, 0x3c, 0x00, 0xbc, 0x51, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x51, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x51, 0x01, 0x00, 0x98, 0x51, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x0a, 0x50, 0x4e, 0x01, 0x00, 0x04, 0x00, 0x00, 0x0a, 0xe0, 0x4c, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x4b, 0x01, 0x00, 0x1d, 0x00, 0x00, 0x0a, 0xf8, 0x51, 0x01, 0x00, 0x05, 0x00, 0x00, 0x0a, 0x24, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x80, 0x07, 0x00, 0x3c, 0x00, 0x34, 0x52, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x2a, 0x80, 0x07, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x24, 0x80, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1d, 0x80, 0x07, 0x00, 0x20, 0x00, 0x00, 0x00, 0x2a, 0x80, 0x07, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x24, 0x80, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1d, 0x80, 0x07, 0x00, 0x20, 0x00, 0x00, 0x00, 0x2a, 0x80, 0x07, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x70, 0x52, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x01, 0x63, 0x00, 0x00, 0xa1, 0x63, 0x00, 0x00, 0xc5, 0x63, 0x00, 0x00, 0xb1, 0x62, 0x00, 0x00, 0xc5, 0x63, 0x00, 0x00, 0x21, 0x63, 0x00, 0x00, 0x4d, 0x63, 0x00, 0x00, 0x3c, 0x00, 0xac, 0x52, 0x01, 0x00, 0xa1, 0x63, 0x00, 0x00, 0x01, 0x63, 0x00, 0x00, 0xa1, 0x63, 0x00, 0x00, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x03, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0a, 0x0c, 0x0d, 0x0e, 0x0f, 0x0f, 0x10, 0x11, 0x00, 0x00, 0x00, 0xa5, 0xc6, 0x84, 0xf8, 0x99, 0xee, 0x8d, 0xf6, 0x0d, 0xff, 0xbd, 0xd6, 0xb1, 0xde, 0x54, 0x91, 0x3c, 0x00, 0xe8, 0x52, 0x01, 0x00, 0x50, 0x60, 0x03, 0x02, 0xa9, 0xce, 0x7d, 0x56, 0x19, 0xe7, 0x62, 0xb5, 0xe6, 0x4d, 0x9a, 0xec, 0x45, 0x8f, 0x9d, 0x1f, 0x40, 0x89, 0x87, 0xfa, 0x15, 0xef, 0xeb, 0xb2, 0xc9, 0x8e, 0x0b, 0xfb, 0xec, 0x41, 0x67, 0xb3, 0xfd, 0x5f, 0xea, 0x45, 0xbf, 0x23, 0xf7, 0x53, 0x96, 0xe4, 0x5b, 0x9b, 0xc2, 0x75, 0x1c, 0xe1, 0xae, 0x3d, 0x6a, 0x4c, 0x5a, 0x6c, 0x41, 0x7e, 0x3c, 0x00, 0x24, 0x53, 0x01, 0x00, 0x02, 0xf5, 0x4f, 0x83, 0x5c, 0x68, 0xf4, 0x51, 0x34, 0xd1, 0x08, 0xf9, 0x93, 0xe2, 0x73, 0xab, 0x53, 0x62, 0x3f, 0x2a, 0x0c, 0x08, 0x52, 0x95, 0x65, 0x46, 0x5e, 0x9d, 0x28, 0x30, 0xa1, 0x37, 0x0f, 0x0a, 0xb5, 0x2f, 0x09, 0x0e, 0x36, 0x24, 0x9b, 0x1b, 0x3d, 0xdf, 0x26, 0xcd, 0x69, 0x4e, 0xcd, 0x7f, 0x9f, 0xea, 0x1b, 0x12, 0x9e, 0x1d, 0x74, 0x58, 0x2e, 0x34, 0x3c, 0x00, 0x60, 0x53, 0x01, 0x00, 0x2d, 0x36, 0xb2, 0xdc, 0xee, 0xb4, 0xfb, 0x5b, 0xf6, 0xa4, 0x4d, 0x76, 0x61, 0xb7, 0xce, 0x7d, 0x7b, 0x52, 0x3e, 0xdd, 0x71, 0x5e, 0x97, 0x13, 0xf5, 0xa6, 0x68, 0xb9, 0x00, 0x00, 0x2c, 0xc1, 0x60, 0x40, 0x1f, 0xe3, 0xc8, 0x79, 0xed, 0xb6, 0xbe, 0xd4, 0x46, 0x8d, 0xd9, 0x67, 0x4b, 0x72, 0xde, 0x94, 0xd4, 0x98, 0xe8, 0xb0, 0x4a, 0x85, 0x6b, 0xbb, 0x2a, 0xc5, 0x3c, 0x00, 0x9c, 0x53, 0x01, 0x00, 0xe5, 0x4f, 0x16, 0xed, 0xc5, 0x86, 0xd7, 0x9a, 0x55, 0x66, 0x94, 0x11, 0xcf, 0x8a, 0x10, 0xe9, 0x06, 0x04, 0x81, 0xfe, 0xf0, 0xa0, 0x44, 0x78, 0xba, 0x25, 0xe3, 0x4b, 0xf3, 0xa2, 0xfe, 0x5d, 0xc0, 0x80, 0x8a, 0x05, 0xad, 0x3f, 0xbc, 0x21, 0x48, 0x70, 0x04, 0xf1, 0xdf, 0x63, 0xc1, 0x77, 0x75, 0xaf, 0x63, 0x42, 0x30, 0x20, 0x1a, 0xe5, 0x0e, 0xfd, 0x6d, 0xbf, 0x3c, 0x00, 0xd8, 0x53, 0x01, 0x00, 0x4c, 0x81, 0x14, 0x18, 0x35, 0x26, 0x2f, 0xc3, 0xe1, 0xbe, 0xa2, 0x35, 0xcc, 0x88, 0x39, 0x2e, 0x57, 0x93, 0xf2, 0x55, 0x82, 0xfc, 0x47, 0x7a, 0xac, 0xc8, 0xe7, 0xba, 0x2b, 0x32, 0x95, 0xe6, 0xa0, 0xc0, 0x98, 0x19, 0xd1, 0x9e, 0x7f, 0xa3, 0x66, 0x44, 0x7e, 0x54, 0xab, 0x3b, 0x83, 0x0b, 0xca, 0x8c, 0x29, 0xc7, 0xd3, 0x6b, 0x3c, 0x28, 0x79, 0xa7, 0xe2, 0xbc, 0x3c, 0x00, 0x14, 0x54, 0x01, 0x00, 0x1d, 0x16, 0x76, 0xad, 0x3b, 0xdb, 0x56, 0x64, 0x4e, 0x74, 0x1e, 0x14, 0xdb, 0x92, 0x0a, 0x0c, 0x6c, 0x48, 0xe4, 0xb8, 0x5d, 0x9f, 0x6e, 0xbd, 0xef, 0x43, 0xa6, 0xc4, 0xa8, 0x39, 0xa4, 0x31, 0x37, 0xd3, 0x8b, 0xf2, 0x32, 0xd5, 0x43, 0x8b, 0x59, 0x6e, 0xb7, 0xda, 0x8c, 0x01, 0x64, 0xb1, 0xd2, 0x9c, 0xe0, 0x49, 0xb4, 0xd8, 0xfa, 0xac, 0x07, 0xf3, 0x25, 0xcf, 0x3c, 0x00, 0x50, 0x54, 0x01, 0x00, 0xaf, 0xca, 0x8e, 0xf4, 0xe9, 0x47, 0x18, 0x10, 0xd5, 0x6f, 0x88, 0xf0, 0x6f, 0x4a, 0x72, 0x5c, 0x24, 0x38, 0xf1, 0x57, 0xc7, 0x73, 0x51, 0x97, 0x23, 0xcb, 0x7c, 0xa1, 0x9c, 0xe8, 0x21, 0x3e, 0xdd, 0x96, 0xdc, 0x61, 0x86, 0x0d, 0x85, 0x0f, 0x90, 0xe0, 0x42, 0x7c, 0xc4, 0x71, 0xaa, 0xcc, 0xd8, 0x90, 0x05, 0x06, 0x01, 0xf7, 0x12, 0x1c, 0xa3, 0xc2, 0x5f, 0x6a, 0x3c, 0x00, 0x8c, 0x54, 0x01, 0x00, 0xf9, 0xae, 0xd0, 0x69, 0x91, 0x17, 0x58, 0x99, 0x27, 0x3a, 0xb9, 0x27, 0x38, 0xd9, 0x13, 0xeb, 0xb3, 0x2b, 0x33, 0x22, 0xbb, 0xd2, 0x70, 0xa9, 0x89, 0x07, 0xa7, 0x33, 0xb6, 0x2d, 0x22, 0x3c, 0x92, 0x15, 0x20, 0xc9, 0x49, 0x87, 0xff, 0xaa, 0x78, 0x50, 0x7a, 0xa5, 0x8f, 0x03, 0xf8, 0x59, 0x80, 0x09, 0x17, 0x1a, 0xda, 0x65, 0x31, 0xd7, 0xc6, 0x84, 0xb8, 0xd0, 0x3c, 0x00, 0xc8, 0x54, 0x01, 0x00, 0xc3, 0x82, 0xb0, 0x29, 0x77, 0x5a, 0x11, 0x1e, 0xcb, 0x7b, 0xfc, 0xa8, 0xd6, 0x6d, 0x3a, 0x2c, 0xc6, 0xa5, 0xf8, 0x84, 0xee, 0x99, 0xf6, 0x8d, 0xff, 0x0d, 0xd6, 0xbd, 0xde, 0xb1, 0x91, 0x54, 0x60, 0x50, 0x02, 0x03, 0xce, 0xa9, 0x56, 0x7d, 0xe7, 0x19, 0xb5, 0x62, 0x4d, 0xe6, 0xec, 0x9a, 0x8f, 0x45, 0x1f, 0x9d, 0x89, 0x40, 0xfa, 0x87, 0xef, 0x15, 0xb2, 0xeb, 0x3c, 0x00, 0x04, 0x55, 0x01, 0x00, 0x8e, 0xc9, 0xfb, 0x0b, 0x41, 0xec, 0xb3, 0x67, 0x5f, 0xfd, 0x45, 0xea, 0x23, 0xbf, 0x53, 0xf7, 0xe4, 0x96, 0x9b, 0x5b, 0x75, 0xc2, 0xe1, 0x1c, 0x3d, 0xae, 0x4c, 0x6a, 0x6c, 0x5a, 0x7e, 0x41, 0xf5, 0x02, 0x83, 0x4f, 0x68, 0x5c, 0x51, 0xf4, 0xd1, 0x34, 0xf9, 0x08, 0xe2, 0x93, 0xab, 0x73, 0x62, 0x53, 0x2a, 0x3f, 0x08, 0x0c, 0x95, 0x52, 0x46, 0x65, 0x9d, 0x5e, 0x3c, 0x00, 0x40, 0x55, 0x01, 0x00, 0x30, 0x28, 0x37, 0xa1, 0x0a, 0x0f, 0x2f, 0xb5, 0x0e, 0x09, 0x24, 0x36, 0x1b, 0x9b, 0xdf, 0x3d, 0xcd, 0x26, 0x4e, 0x69, 0x7f, 0xcd, 0xea, 0x9f, 0x12, 0x1b, 0x1d, 0x9e, 0x58, 0x74, 0x34, 0x2e, 0x36, 0x2d, 0xdc, 0xb2, 0xb4, 0xee, 0x5b, 0xfb, 0xa4, 0xf6, 0x76, 0x4d, 0xb7, 0x61, 0x7d, 0xce, 0x52, 0x7b, 0xdd, 0x3e, 0x5e, 0x71, 0x13, 0x97, 0xa6, 0xf5, 0xb9, 0x68, 0x3c, 0x00, 0x7c, 0x55, 0x01, 0x00, 0x00, 0x00, 0xc1, 0x2c, 0x40, 0x60, 0xe3, 0x1f, 0x79, 0xc8, 0xb6, 0xed, 0xd4, 0xbe, 0x8d, 0x46, 0x67, 0xd9, 0x72, 0x4b, 0x94, 0xde, 0x98, 0xd4, 0xb0, 0xe8, 0x85, 0x4a, 0xbb, 0x6b, 0xc5, 0x2a, 0x4f, 0xe5, 0xed, 0x16, 0x86, 0xc5, 0x9a, 0xd7, 0x66, 0x55, 0x11, 0x94, 0x8a, 0xcf, 0xe9, 0x10, 0x04, 0x06, 0xfe, 0x81, 0xa0, 0xf0, 0x78, 0x44, 0x25, 0xba, 0x4b, 0xe3, 0x3c, 0x00, 0xb8, 0x55, 0x01, 0x00, 0xa2, 0xf3, 0x5d, 0xfe, 0x80, 0xc0, 0x05, 0x8a, 0x3f, 0xad, 0x21, 0xbc, 0x70, 0x48, 0xf1, 0x04, 0x63, 0xdf, 0x77, 0xc1, 0xaf, 0x75, 0x42, 0x63, 0x20, 0x30, 0xe5, 0x1a, 0xfd, 0x0e, 0xbf, 0x6d, 0x81, 0x4c, 0x18, 0x14, 0x26, 0x35, 0xc3, 0x2f, 0xbe, 0xe1, 0x35, 0xa2, 0x88, 0xcc, 0x2e, 0x39, 0x93, 0x57, 0x55, 0xf2, 0xfc, 0x82, 0x7a, 0x47, 0xc8, 0xac, 0xba, 0xe7, 0x3c, 0x00, 0xf4, 0x55, 0x01, 0x00, 0x32, 0x2b, 0xe6, 0x95, 0xc0, 0xa0, 0x19, 0x98, 0x9e, 0xd1, 0xa3, 0x7f, 0x44, 0x66, 0x54, 0x7e, 0x3b, 0xab, 0x0b, 0x83, 0x8c, 0xca, 0xc7, 0x29, 0x6b, 0xd3, 0x28, 0x3c, 0xa7, 0x79, 0xbc, 0xe2, 0x16, 0x1d, 0xad, 0x76, 0xdb, 0x3b, 0x64, 0x56, 0x74, 0x4e, 0x14, 0x1e, 0x92, 0xdb, 0x0c, 0x0a, 0x48, 0x6c, 0xb8, 0xe4, 0x9f, 0x5d, 0xbd, 0x6e, 0x43, 0xef, 0xc4, 0xa6, 0x3c, 0x00, 0x30, 0x56, 0x01, 0x00, 0x39, 0xa8, 0x31, 0xa4, 0xd3, 0x37, 0xf2, 0x8b, 0xd5, 0x32, 0x8b, 0x43, 0x6e, 0x59, 0xda, 0xb7, 0x01, 0x8c, 0xb1, 0x64, 0x9c, 0xd2, 0x49, 0xe0, 0xd8, 0xb4, 0xac, 0xfa, 0xf3, 0x07, 0xcf, 0x25, 0xca, 0xaf, 0xf4, 0x8e, 0x47, 0xe9, 0x10, 0x18, 0x6f, 0xd5, 0xf0, 0x88, 0x4a, 0x6f, 0x5c, 0x72, 0x38, 0x24, 0x57, 0xf1, 0x73, 0xc7, 0x97, 0x51, 0xcb, 0x23, 0xa1, 0x7c, 0x3c, 0x00, 0x6c, 0x56, 0x01, 0x00, 0xe8, 0x9c, 0x3e, 0x21, 0x96, 0xdd, 0x61, 0xdc, 0x0d, 0x86, 0x0f, 0x85, 0xe0, 0x90, 0x7c, 0x42, 0x71, 0xc4, 0xcc, 0xaa, 0x90, 0xd8, 0x06, 0x05, 0xf7, 0x01, 0x1c, 0x12, 0xc2, 0xa3, 0x6a, 0x5f, 0xae, 0xf9, 0x69, 0xd0, 0x17, 0x91, 0x99, 0x58, 0x3a, 0x27, 0x27, 0xb9, 0xd9, 0x38, 0xeb, 0x13, 0x2b, 0xb3, 0x22, 0x33, 0xd2, 0xbb, 0xa9, 0x70, 0x07, 0x89, 0x33, 0xa7, 0x3c, 0x00, 0xa8, 0x56, 0x01, 0x00, 0x2d, 0xb6, 0x3c, 0x22, 0x15, 0x92, 0xc9, 0x20, 0x87, 0x49, 0xaa, 0xff, 0x50, 0x78, 0xa5, 0x7a, 0x03, 0x8f, 0x59, 0xf8, 0x09, 0x80, 0x1a, 0x17, 0x65, 0xda, 0xd7, 0x31, 0x84, 0xc6, 0xd0, 0xb8, 0x82, 0xc3, 0x29, 0xb0, 0x5a, 0x77, 0x1e, 0x11, 0x7b, 0xcb, 0xa8, 0xfc, 0x6d, 0xd6, 0x2c, 0x3a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0x56, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x72, 0x65, 0x71, 0x45, 0x72, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x20, 0x57, 0x01, 0x00, 0xc4, 0x8e, 0x01, 0x00, 0x24, 0x9a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x24, 0x9a, 0x01, 0x00, 0xa4, 0xb2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0xa4, 0xb2, 0x01, 0x00, 0x14, 0xc8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0xbb, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x5c, 0x57, 0x01, 0x00, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, 0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2b, 0x2c, 0x01, 0x00, 0x70, 0x17, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0d, 0x25, 0x00, 0x00, 0x41, 0x3f, 0x01, 0x00, 0x65, 0x29, 0x01, 0x00, 0x0d, 0x25, 0x00, 0x00, 0xf5, 0x5e, 0x00, 0x00, 0x41, 0x3f, 0x01, 0x00, 0x41, 0x3f, 0x01, 0x00, 0x02, 0x04, 0x0b, 0x0c, 0x12, 0x16, 0x18, 0x24, 0x3c, 0x00, 0x98, 0x57, 0x01, 0x00, 0x30, 0x48, 0x60, 0x6c, 0x01, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x12, 0x11, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd4, 0x57, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x93, 0x04, 0x00, 0x40, 0x42, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xdf, 0x40, 0xcf, 0xfd, 0x00, 0x40, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x3c, 0x00, 0x10, 0x58, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x80, 0x81, 0x00, 0x00, 0x80, 0x00, 0xbf, 0xff, 0x7f, 0x7e, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x78, 0x6f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x6f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x6f, 0x01, 0x00, 0x3c, 0x00, 0x4c, 0x58, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x71, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x71, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x90, 0x71, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x3c, 0x00, 0x88, 0x58, 0x01, 0x00, 0xa8, 0x71, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x0a, 0x01, 0x06, 0x0b, 0x02, 0x07, 0x0c, 0x03, 0x08, 0x0d, 0x04, 0x09, 0x00, 0x00, 0x03, 0x03, 0x01, 0x01, 0x00, 0x04, 0x00, 0x04, 0x04, 0x06, 0x16, 0x1e, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0xc4, 0x58, 0x01, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x61, 0x8b, 0x4a, 0x00, 0x61, 0x8f, 0x4a, 0x00, 0x61, 0x8b, 0x4a, 0x00, 0x05, 0xe3, 0xc0, 0x00, 0x05, 0xcb, 0xc0, 0x00, 0x05, 0xbb, 0xc0, 0x00, 0x85, 0xba, 0xc0, 0x00, 0x85, 0xa2, 0xc0, 0x00, 0x85, 0x92, 0xc0, 0x00, 0x85, 0x8a, 0xc0, 0x00, 0x85, 0x7a, 0xc0, 0x00, 0x45, 0x89, 0xc0, 0x00, 0x3c, 0x00, 0x00, 0x59, 0x01, 0x00, 0x45, 0x71, 0xc0, 0x00, 0x45, 0x69, 0xc0, 0x00, 0x45, 0x61, 0xc0, 0x00, 0x45, 0x59, 0xc0, 0x00, 0x45, 0x51, 0xc0, 0x00, 0x45, 0x49, 0xc0, 0x00, 0x45, 0x41, 0xc0, 0x00, 0x45, 0x39, 0xc0, 0x00, 0x45, 0x31, 0xc0, 0x00, 0x45, 0x29, 0xc0, 0x00, 0x45, 0x21, 0xc0, 0x00, 0x60, 0x2d, 0x06, 0x00, 0x60, 0x2d, 0x06, 0x00, 0x60, 0x2d, 0x06, 0x00, 0x60, 0x2d, 0x06, 0x00, 0x3c, 0x00, 0x3c, 0x59, 0x01, 0x00, 0x60, 0x2d, 0x06, 0x00, 0x60, 0x28, 0x06, 0x00, 0x50, 0x26, 0x06, 0x00, 0x50, 0x21, 0x06, 0x00, 0x50, 0x1f, 0x06, 0x00, 0x50, 0x1c, 0x06, 0x00, 0x50, 0x1a, 0x06, 0x00, 0x50, 0x18, 0x06, 0x00, 0x50, 0x16, 0x06, 0x00, 0x50, 0x14, 0x06, 0x00, 0x50, 0x12, 0x06, 0x00, 0x50, 0x10, 0x06, 0x00, 0x50, 0x0e, 0x06, 0x00, 0x50, 0x0c, 0x06, 0x00, 0x50, 0x0a, 0x06, 0x00, 0x3c, 0x00, 0x78, 0x59, 0x01, 0x00, 0x2b, 0x0b, 0x06, 0x00, 0x1d, 0x75, 0xc0, 0x00, 0x1d, 0x75, 0xc0, 0x00, 0x1d, 0x75, 0xc0, 0x00, 0x1d, 0x75, 0xc0, 0x00, 0x1d, 0x75, 0xc0, 0x00, 0x1d, 0x75, 0xc0, 0x00, 0x1d, 0x6d, 0xc0, 0x00, 0xdd, 0x5b, 0xc0, 0x00, 0xdd, 0x4b, 0xc0, 0x00, 0xdd, 0x43, 0xc0, 0x00, 0xdd, 0x3b, 0xc0, 0x00, 0xdd, 0x33, 0xc0, 0x00, 0xdd, 0x2b, 0xc0, 0x00, 0xdd, 0x23, 0xc0, 0x00, 0x3c, 0x00, 0xb4, 0x59, 0x01, 0x00, 0xdd, 0x1b, 0xc0, 0x00, 0xdd, 0x13, 0xc0, 0x00, 0xdd, 0x13, 0xc0, 0x00, 0xdd, 0x13, 0xc0, 0x00, 0xdd, 0x13, 0xc0, 0x00, 0xdd, 0x13, 0xc0, 0x00, 0x05, 0x05, 0x05, 0x04, 0x04, 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x05, 0x05, 0x05, 0x04, 0x04, 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x13, 0x00, 0x00, 0x3c, 0x00, 0xf0, 0x59, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x80, 0x00, 0x5b, 0x00, 0x40, 0x02, 0xe0, 0xfd, 0xf2, 0x00, 0xb8, 0xfc, 0xa4, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x03, 0x0b, 0x9f, 0x5f, 0x07, 0x01, 0x2a, 0x04, 0x21, 0x04, 0x17, 0x04, 0x0e, 0x04, 0x04, 0x04, 0xfb, 0x03, 0xf1, 0x03, 0xe8, 0x03, 0xc9, 0x03, 0xaa, 0x03, 0x8a, 0x03, 0x6b, 0x03, 0x4c, 0x03, 0x3c, 0x00, 0x2c, 0x5a, 0x01, 0x00, 0x2d, 0x03, 0x0e, 0x03, 0xee, 0x02, 0xec, 0x02, 0x01, 0x03, 0x16, 0x03, 0x2b, 0x03, 0x40, 0x03, 0x55, 0x03, 0x6a, 0x03, 0x7f, 0x03, 0x94, 0x03, 0xa9, 0x03, 0xbe, 0x03, 0xd3, 0x03, 0xe8, 0x03, 0xbe, 0x03, 0x94, 0x03, 0x6a, 0x03, 0x00, 0x02, 0x04, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x03, 0x3c, 0x00, 0x68, 0x5a, 0x01, 0x00, 0x05, 0x08, 0x0b, 0x0e, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa4, 0x5a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe0, 0x5a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0x5b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0x5b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x94, 0x5b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd0, 0x5b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x5c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0x5c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x84, 0x5c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0x5c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xfc, 0x5c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x5d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x74, 0x5d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb0, 0x5d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xec, 0x5d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0x5e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x64, 0x5e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa0, 0x5e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xdc, 0x5e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0x5f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x54, 0x5f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x90, 0x5f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xcc, 0x5f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0x60, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x44, 0x60, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x80, 0x60, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xbc, 0x60, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x60, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x34, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x70, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xac, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x24, 0x62, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x60, 0x62, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x62, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0x62, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x14, 0x63, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x50, 0x63, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x8c, 0x63, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0x63, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x04, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x40, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x7c, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf4, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x30, 0x65, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x6c, 0x65, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0x65, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0x65, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x20, 0x66, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x5c, 0x66, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0x66, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd4, 0x66, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x10, 0x67, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x4c, 0x67, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0x67, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc4, 0x67, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x68, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0x68, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0x68, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb4, 0x68, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf0, 0x68, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x2c, 0x69, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0x69, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa4, 0x69, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe0, 0x69, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x94, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd0, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x6b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0x6b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x84, 0x6b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0x6b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xfc, 0x6b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x6c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x74, 0x6c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb0, 0x6c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xec, 0x6c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x64, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa0, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xdc, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0x6e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x54, 0x6e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x90, 0x6e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xcc, 0x6e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0x6f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x44, 0x6f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x80, 0x6f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xbc, 0x6f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x6f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x34, 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x70, 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xac, 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x24, 0x71, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x60, 0x71, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x71, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0x71, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x14, 0x72, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x50, 0x72, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x8c, 0x72, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0x72, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x04, 0x73, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x40, 0x73, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x7c, 0x73, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0x73, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf4, 0x73, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x30, 0x74, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x6c, 0x74, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0x74, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0x74, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x20, 0x75, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x5c, 0x75, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0x75, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd4, 0x75, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x10, 0x76, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x4c, 0x76, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0x76, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc4, 0x76, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x77, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0x77, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0x77, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb4, 0x77, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf0, 0x77, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x2c, 0x78, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0x78, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa4, 0x78, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe0, 0x78, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0x79, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0x79, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x94, 0x79, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd0, 0x79, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x7a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0x7a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x84, 0x7a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0x7a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xfc, 0x7a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x7b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x74, 0x7b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb0, 0x7b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xec, 0x7b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0x7c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x64, 0x7c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa0, 0x7c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xdc, 0x7c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0x7d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x54, 0x7d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x90, 0x7d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xcc, 0x7d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0x7e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x44, 0x7e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x80, 0x7e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xbc, 0x7e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x7e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x34, 0x7f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x70, 0x7f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xac, 0x7f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0x7f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x01, 0x25, 0x07, 0x4e, 0xad, 0x03, 0x75, 0x61, 0x0a, 0x20, 0xfa, 0xf7, 0x6c, 0xff, 0x30, 0x68, 0x80, 0x03, 0xc4, 0x0f, 0xb5, 0x61, 0x0a, 0x20, 0xfa, 0xf7, 0x65, 0xff, 0x20, 0x1c, 0x70, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x24, 0x80, 0x01, 0x00, 0x10, 0x00, 0x07, 0x00, 0x70, 0xb5, 0x01, 0x25, 0x6d, 0x04, 0x00, 0x28, 0x10, 0x4c, 0x01, 0xd0, 0x65, 0x61, 0x00, 0xe0, 0xa5, 0x61, 0x60, 0x68, 0x28, 0x43, 0x60, 0x60, 0xa0, 0x68, 0x28, 0x43, 0xa0, 0x60, 0x0a, 0x20, 0xfa, 0xf7, 0x4e, 0xff, 0x01, 0x26, 0xb6, 0x03, 0x66, 0x61, 0x0a, 0x20, 0xfa, 0xf7, 0x48, 0xff, 0xa6, 0x61, 0x01, 0x20, 0xfa, 0xf7, 0x44, 0xff, 0x3c, 0x00, 0x60, 0x80, 0x01, 0x00, 0xa0, 0x68, 0xa8, 0x43, 0xa0, 0x60, 0x60, 0x68, 0x28, 0x43, 0x60, 0x60, 0x0a, 0x20, 0xfa, 0xf7, 0x3b, 0xff, 0x70, 0xbd, 0x10, 0x00, 0x07, 0x00, 0x70, 0xb5, 0x01, 0x25, 0x10, 0x4c, 0x6d, 0x04, 0x65, 0x61, 0x60, 0x68, 0x28, 0x43, 0x60, 0x60, 0xa0, 0x68, 0x28, 0x43, 0xa0, 0x60, 0xee, 0x08, 0xa6, 0x61, 0x0a, 0x20, 0xfa, 0xf7, 0x28, 0xff, 0x66, 0x61, 0x0a, 0x20, 0x3c, 0x00, 0x9c, 0x80, 0x01, 0x00, 0xfa, 0xf7, 0x24, 0xff, 0xa5, 0x61, 0x0a, 0x20, 0xfa, 0xf7, 0x20, 0xff, 0xa6, 0x61, 0x0a, 0x20, 0xfa, 0xf7, 0x1c, 0xff, 0xa0, 0x68, 0xa8, 0x43, 0xa0, 0x60, 0x60, 0x68, 0x28, 0x43, 0x60, 0x60, 0x70, 0xbd, 0x00, 0x00, 0x10, 0x00, 0x07, 0x00, 0x70, 0xb5, 0x01, 0x25, 0x0e, 0x4c, 0x6d, 0x04, 0xa5, 0x61, 0x60, 0x68, 0x28, 0x43, 0x60, 0x60, 0xa0, 0x68, 0x28, 0x43, 0x3c, 0x00, 0xd8, 0x80, 0x01, 0x00, 0xa0, 0x60, 0xee, 0x08, 0x66, 0x61, 0x0a, 0x20, 0xfa, 0xf7, 0x02, 0xff, 0x65, 0x61, 0x0a, 0x20, 0xfa, 0xf7, 0xfe, 0xfe, 0xa6, 0x61, 0x0a, 0x20, 0xfa, 0xf7, 0xfa, 0xfe, 0xa0, 0x68, 0xa8, 0x43, 0xa0, 0x60, 0x60, 0x68, 0x28, 0x43, 0x60, 0x60, 0x70, 0xbd, 0x00, 0x00, 0x10, 0x00, 0x07, 0x00, 0x70, 0xb5, 0x05, 0x1c, 0x00, 0x24, 0x80, 0x26, 0x28, 0x1c, 0x30, 0x40, 0x3c, 0x00, 0x14, 0x81, 0x01, 0x00, 0xff, 0xf7, 0x88, 0xff, 0x68, 0x06, 0x05, 0x0e, 0x01, 0x34, 0x08, 0x2c, 0xf6, 0xdb, 0xff, 0xf7, 0x6d, 0xff, 0x70, 0xbd, 0x80, 0xb5, 0x02, 0x1c, 0x0b, 0x21, 0x80, 0x20, 0xfb, 0xf7, 0x3e, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x12, 0x48, 0x00, 0x25, 0x07, 0x1c, 0xff, 0x37, 0x06, 0x1d, 0x01, 0x37, 0x28, 0x1c, 0xf9, 0xf7, 0xea, 0xfd, 0x04, 0x1c, 0x17, 0xd0, 0x3c, 0x00, 0x50, 0x81, 0x01, 0x00, 0x20, 0x69, 0x00, 0x28, 0x04, 0xd0, 0xe0, 0x6a, 0x00, 0x28, 0x03, 0xd0, 0x00, 0x20, 0xe0, 0x62, 0x25, 0x1c, 0xf0, 0xe7, 0x7b, 0x68, 0x00, 0x2b, 0x05, 0xd0, 0x32, 0x1c, 0x21, 0x1c, 0x44, 0x31, 0x01, 0x20, 0xe8, 0xf7, 0x34, 0xf9, 0x20, 0x1c, 0x44, 0x30, 0xf9, 0xf7, 0x37, 0xfe, 0xe2, 0xe7, 0xf8, 0xbd, 0x00, 0x00, 0x20, 0xf7, 0x01, 0x00, 0x11, 0x48, 0x70, 0xb5, 0x3c, 0x00, 0x8c, 0x81, 0x01, 0x00, 0x00, 0x68, 0xff, 0x28, 0x1d, 0xd1, 0xff, 0x20, 0x32, 0x30, 0xfa, 0xf7, 0xa7, 0xfe, 0x0e, 0x4d, 0x6c, 0x68, 0x0e, 0x48, 0xfa, 0xf7, 0xa2, 0xfe, 0x68, 0x68, 0x24, 0x1a, 0x01, 0x20, 0x00, 0xf0, 0x95, 0xfd, 0x6e, 0x68, 0x09, 0x48, 0xfa, 0xf7, 0x99, 0xfe, 0x68, 0x68, 0x21, 0x1c, 0x0a, 0x39, 0x30, 0x1a, 0x88, 0x42, 0x02, 0xd3, 0x0a, 0x34, 0xa0, 0x42, 0x02, 0xd9, 0x3c, 0x00, 0xc8, 0x81, 0x01, 0x00, 0x00, 0x20, 0x00, 0xf0, 0x85, 0xfd, 0x70, 0xbd, 0xf4, 0x74, 0x01, 0x00, 0x00, 0x03, 0x07, 0x00, 0x93, 0x03, 0x00, 0x00, 0x70, 0xb5, 0x00, 0xf0, 0x4d, 0xf8, 0x01, 0x20, 0xed, 0xf7, 0x34, 0xf9, 0x11, 0x4d, 0x18, 0x21, 0x68, 0x60, 0x00, 0x20, 0xe9, 0xf7, 0xf2, 0xf9, 0x28, 0x60, 0x04, 0x68, 0x80, 0x20, 0x20, 0x80, 0x00, 0x26, 0x06, 0x22, 0xff, 0x21, 0x20, 0x1d, 0x3c, 0x00, 0x04, 0x82, 0x01, 0x00, 0x66, 0x80, 0xe8, 0xf7, 0x0b, 0xfa, 0x20, 0x1c, 0x0a, 0x30, 0x09, 0x49, 0xf2, 0xf7, 0x2e, 0xfd, 0x20, 0x1c, 0x10, 0x30, 0x07, 0x49, 0xf2, 0xf7, 0x29, 0xfd, 0xe6, 0x82, 0x03, 0xcd, 0xe9, 0xf7, 0xf9, 0xf8, 0x02, 0x49, 0x01, 0x20, 0x14, 0x39, 0x88, 0x60, 0x70, 0xbd, 0x90, 0xd9, 0x01, 0x00, 0x12, 0x61, 0x01, 0x00, 0x24, 0xf7, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0x40, 0x82, 0x01, 0x00, 0x10, 0xb5, 0x06, 0x4c, 0x00, 0x22, 0x02, 0x20, 0xe1, 0x68, 0xf0, 0xf7, 0x11, 0xfb, 0x60, 0x78, 0x02, 0x28, 0x01, 0xd1, 0x00, 0xf0, 0x1a, 0xf9, 0x10, 0xbd, 0x00, 0x00, 0x40, 0xd9, 0x01, 0x00, 0x80, 0xb5, 0xa1, 0x20, 0xff, 0xf7, 0x50, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x40, 0x00, 0x0e, 0x21, 0x08, 0x40, 0x80, 0xb5, 0xa0, 0x30, 0xff, 0xf7, 0x47, 0xff, 0x80, 0xbd, 0x3c, 0x00, 0x7c, 0x82, 0x01, 0x00, 0x10, 0xb5, 0x05, 0x4c, 0x20, 0x68, 0x00, 0x28, 0x04, 0xd0, 0xe9, 0xf7, 0x87, 0xf9, 0x00, 0x20, 0x20, 0x60, 0x60, 0x60, 0x10, 0xbd, 0x00, 0x00, 0x90, 0xd9, 0x01, 0x00, 0x10, 0xb5, 0x07, 0x4c, 0x01, 0x21, 0x07, 0x4a, 0x21, 0x61, 0x02, 0x20, 0x10, 0x70, 0x61, 0x61, 0x00, 0xf0, 0xd6, 0xfc, 0x00, 0xf0, 0xc8, 0xfb, 0x20, 0x1c, 0xed, 0xf7, 0x9f, 0xfa, 0x10, 0xbd, 0x3c, 0x00, 0xb8, 0x82, 0x01, 0x00, 0x20, 0xf7, 0x01, 0x00, 0x7c, 0xd9, 0x01, 0x00, 0x70, 0xb5, 0x02, 0x1c, 0x08, 0x1c, 0x02, 0x25, 0x00, 0x2a, 0x13, 0x4e, 0x14, 0xd0, 0x00, 0xf0, 0x11, 0xfc, 0x30, 0x78, 0x01, 0x21, 0x08, 0x43, 0x30, 0x70, 0x30, 0x78, 0x28, 0x43, 0x30, 0x70, 0x00, 0x20, 0x7d, 0x21, 0x49, 0x01, 0xb2, 0x79, 0x92, 0x07, 0x00, 0xd5, 0x01, 0x34, 0x01, 0x30, 0x88, 0x42, 0xf8, 0xdb, 0x3c, 0x00, 0xf4, 0x82, 0x01, 0x00, 0x20, 0x1c, 0x70, 0xbd, 0x30, 0x78, 0xa8, 0x43, 0x30, 0x70, 0x30, 0x78, 0x40, 0x08, 0x40, 0x00, 0x30, 0x70, 0x05, 0x49, 0x48, 0x68, 0x01, 0x22, 0x12, 0x04, 0x90, 0x43, 0x48, 0x60, 0x01, 0x20, 0x70, 0xbd, 0x00, 0x00, 0x88, 0x00, 0x07, 0x00, 0x6c, 0x00, 0x07, 0x00, 0xff, 0xb5, 0x09, 0xae, 0x00, 0x20, 0x60, 0xce, 0x28, 0x60, 0x00, 0x23, 0x9c, 0x46, 0x30, 0x60, 0x3c, 0x00, 0x30, 0x83, 0x01, 0x00, 0x69, 0x46, 0x01, 0xaa, 0x17, 0xe0, 0xdb, 0x07, 0x0e, 0xd5, 0x12, 0x4b, 0x1c, 0x56, 0x63, 0x1c, 0x0a, 0xd0, 0x01, 0x27, 0x2b, 0x68, 0xa7, 0x40, 0x3b, 0x43, 0x2b, 0x60, 0x13, 0x68, 0xdb, 0x07, 0x02, 0xd5, 0x33, 0x68, 0x3b, 0x43, 0x33, 0x60, 0x0b, 0x68, 0x5b, 0x08, 0x0b, 0x60, 0x13, 0x68, 0x5b, 0x08, 0x13, 0x60, 0x01, 0x30, 0x0b, 0x68, 0x00, 0x2b, 0x01, 0xd0, 0x3c, 0x00, 0x6c, 0x83, 0x01, 0x00, 0x22, 0x28, 0xe2, 0xd3, 0x63, 0x46, 0x01, 0x33, 0x20, 0x20, 0x02, 0x2b, 0x9c, 0x46, 0x02, 0xa9, 0x03, 0xaa, 0xf2, 0xdb, 0xff, 0xbd, 0x00, 0x00, 0xb4, 0x8d, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, 0x1e, 0x21, 0x00, 0x22, 0x03, 0x20, 0x05, 0x4b, 0xf9, 0xf7, 0xb3, 0xf8, 0x21, 0x1c, 0x03, 0x20, 0xf9, 0xf7, 0xf5, 0xf8, 0x29, 0x1c, 0x03, 0x20, 0xf9, 0xf7, 0x3c, 0x00, 0xa8, 0x83, 0x01, 0x00, 0xf1, 0xf8, 0xb0, 0xbd, 0x80, 0x38, 0x01, 0x00, 0xb0, 0xb5, 0x1c, 0x4c, 0x1c, 0x4d, 0x21, 0x78, 0x02, 0x29, 0x09, 0xd0, 0x03, 0x29, 0x19, 0xd0, 0x04, 0x29, 0x1f, 0xd0, 0x05, 0x29, 0x23, 0xd1, 0x00, 0x20, 0x00, 0xf0, 0x17, 0xfb, 0x23, 0xe0, 0x68, 0x61, 0x14, 0x48, 0x1c, 0x30, 0xc1, 0x68, 0x02, 0x69, 0x89, 0x18, 0xc1, 0x60, 0x00, 0xf0, 0x2f, 0xfb, 0xe0, 0x68, 0x3c, 0x00, 0xe4, 0x83, 0x01, 0x00, 0x01, 0x38, 0xe0, 0x60, 0x16, 0xd1, 0x32, 0x20, 0xe0, 0x60, 0xff, 0xf7, 0xa3, 0xfe, 0x11, 0xe0, 0x00, 0x20, 0x00, 0xf0, 0x01, 0xfb, 0x00, 0xf0, 0x2d, 0xfc, 0x01, 0x20, 0x20, 0x70, 0x09, 0xe0, 0x00, 0x20, 0x00, 0xf0, 0xf9, 0xfa, 0xff, 0xf7, 0x45, 0xff, 0x03, 0xe0, 0x05, 0x21, 0x0b, 0x20, 0xe8, 0xf7, 0x46, 0xff, 0x68, 0x69, 0x61, 0x68, 0xe7, 0xf7, 0xdd, 0xff, 0x3c, 0x00, 0x20, 0x84, 0x01, 0x00, 0xb0, 0xbd, 0x00, 0x00, 0x7c, 0xd9, 0x01, 0x00, 0x20, 0xf7, 0x01, 0x00, 0xf7, 0xb5, 0x04, 0x1c, 0x17, 0x1c, 0xff, 0xf7, 0x21, 0xfe, 0x20, 0x0a, 0xff, 0xf7, 0x18, 0xff, 0x20, 0x06, 0x00, 0x0e, 0xff, 0xf7, 0x62, 0xfe, 0xff, 0xf7, 0x18, 0xfe, 0xa1, 0x20, 0xff, 0xf7, 0x5d, 0xfe, 0x00, 0x25, 0x16, 0xe0, 0x00, 0x20, 0x00, 0x24, 0x40, 0x06, 0x06, 0x0e, 0xff, 0xf7, 0x3c, 0x00, 0x5c, 0x84, 0x01, 0x00, 0xd1, 0xfd, 0x00, 0x06, 0x00, 0x0e, 0x30, 0x43, 0x01, 0x34, 0x08, 0x2c, 0xf5, 0xdb, 0x29, 0x1c, 0x01, 0x9a, 0x01, 0x35, 0xbd, 0x42, 0x50, 0x54, 0x01, 0xda, 0x00, 0x20, 0x00, 0xe0, 0x01, 0x20, 0xff, 0xf7, 0xd4, 0xfd, 0xbd, 0x42, 0xe6, 0xdb, 0xff, 0xf7, 0x1e, 0xfe, 0xfe, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0xff, 0xf7, 0x19, 0xfe, 0x09, 0x21, 0x89, 0x03, 0x00, 0x22, 0x3c, 0x00, 0x98, 0x84, 0x01, 0x00, 0x02, 0x20, 0xf0, 0xf7, 0xe9, 0xf9, 0x80, 0xbd, 0x09, 0x21, 0x89, 0x03, 0x80, 0xb5, 0x00, 0x22, 0x02, 0x20, 0xf0, 0xf7, 0xc9, 0xf9, 0x01, 0x21, 0x09, 0x48, 0x89, 0x03, 0x81, 0x61, 0x42, 0x68, 0x0a, 0x43, 0x42, 0x60, 0x82, 0x68, 0x11, 0x43, 0x81, 0x60, 0x01, 0x21, 0x49, 0x04, 0x81, 0x61, 0x82, 0x68, 0x8a, 0x43, 0x82, 0x60, 0x42, 0x68, 0x11, 0x43, 0x41, 0x60, 0x3c, 0x00, 0xd4, 0x84, 0x01, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x10, 0x00, 0x07, 0x00, 0xf0, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0x7b, 0x4e, 0x05, 0x68, 0x30, 0x78, 0x85, 0xb0, 0x01, 0x28, 0x01, 0xd0, 0x02, 0x28, 0x72, 0xd1, 0x00, 0x21, 0x20, 0x69, 0xf2, 0xf7, 0x41, 0xf9, 0x76, 0x49, 0xf2, 0xf7, 0x24, 0xfc, 0x00, 0x28, 0x69, 0xd0, 0x20, 0x1c, 0x20, 0x30, 0x41, 0x7a, 0x08, 0x29, 0x02, 0xd1, 0x72, 0x4a, 0x3c, 0x00, 0x10, 0x85, 0x01, 0x00, 0x00, 0x21, 0x51, 0x61, 0x00, 0x7a, 0x22, 0x6a, 0x18, 0x21, 0xf2, 0xf7, 0xc9, 0xfb, 0xe1, 0x6a, 0x37, 0x1c, 0x40, 0x18, 0x6c, 0x49, 0x02, 0x90, 0x30, 0x78, 0x0e, 0x1c, 0xff, 0x36, 0x0a, 0x1d, 0x01, 0x36, 0x01, 0x28, 0x04, 0x92, 0x07, 0xd0, 0x65, 0x4a, 0x02, 0x99, 0x1c, 0x32, 0x28, 0x1c, 0xed, 0xf7, 0xe2, 0xfb, 0x00, 0x28, 0x6b, 0xd0, 0x32, 0x21, 0x20, 0x69, 0x3c, 0x00, 0x4c, 0x85, 0x01, 0x00, 0xf2, 0xf7, 0x16, 0xf9, 0x01, 0x90, 0x20, 0x69, 0x01, 0x21, 0xf2, 0xf7, 0x11, 0xf9, 0x01, 0x1c, 0x5e, 0x48, 0x01, 0x23, 0x01, 0x9a, 0xed, 0xf7, 0x07, 0xfc, 0x00, 0x28, 0x04, 0xd1, 0x5b, 0x48, 0xed, 0xf7, 0x92, 0xfa, 0x00, 0x21, 0xb9, 0x60, 0x56, 0x48, 0x1c, 0x30, 0x81, 0x68, 0xea, 0xf7, 0x19, 0xfc, 0x20, 0x1c, 0x14, 0x30, 0x03, 0x90, 0x04, 0x99, 0xf2, 0xf7, 0x3c, 0x00, 0x88, 0x85, 0x01, 0x00, 0xd5, 0xfb, 0x00, 0x28, 0x05, 0xd1, 0x00, 0x22, 0xba, 0x60, 0x04, 0x98, 0x03, 0x99, 0xf2, 0xf7, 0x6b, 0xfb, 0x4f, 0x49, 0x28, 0x89, 0x09, 0x88, 0x88, 0x42, 0x03, 0xd0, 0x00, 0x22, 0x4c, 0x49, 0xba, 0x60, 0x08, 0x80, 0x03, 0x21, 0x20, 0x69, 0xf2, 0xf7, 0xe4, 0xf8, 0x00, 0x28, 0x10, 0xd0, 0x46, 0x49, 0x82, 0x78, 0x20, 0x31, 0x0b, 0x79, 0x94, 0x46, 0x9a, 0x42, 0x3c, 0x00, 0xc4, 0x85, 0x01, 0x00, 0x09, 0xd0, 0x00, 0x22, 0xba, 0x60, 0x62, 0x46, 0x0a, 0x71, 0x80, 0x78, 0x01, 0x21, 0xf3, 0xf7, 0x05, 0xf9, 0x00, 0xe0, 0x77, 0xe0, 0x06, 0x21, 0x20, 0x69, 0xf2, 0xf7, 0xcd, 0xf8, 0x00, 0x28, 0x08, 0xd0, 0x81, 0x78, 0x3a, 0x48, 0x40, 0x30, 0x82, 0x88, 0x91, 0x42, 0x02, 0xd0, 0x00, 0x22, 0xba, 0x60, 0x81, 0x80, 0x2a, 0x21, 0x20, 0x69, 0xf2, 0xf7, 0xbe, 0xf8, 0x3c, 0x00, 0x00, 0x86, 0x01, 0x00, 0x00, 0x28, 0x0d, 0xd0, 0x80, 0x78, 0xf1, 0x69, 0x33, 0x4a, 0x81, 0x42, 0x08, 0xd0, 0x00, 0x21, 0xb9, 0x60, 0xf0, 0x61, 0x10, 0x1c, 0xed, 0xf7, 0x09, 0xfb, 0x2f, 0x48, 0xed, 0xf7, 0xfa, 0xfa, 0x38, 0x78, 0x3b, 0x1c, 0x01, 0x28, 0x17, 0xd1, 0x02, 0x20, 0x18, 0x70, 0x2a, 0x4f, 0x01, 0x23, 0x3b, 0x61, 0x27, 0x4b, 0x03, 0xcd, 0x1c, 0x33, 0x08, 0x3d, 0x02, 0x9a, 0x3c, 0x00, 0x3c, 0x86, 0x01, 0x00, 0xed, 0xf7, 0xb0, 0xfa, 0x38, 0x1c, 0xed, 0xf7, 0xd7, 0xf8, 0x32, 0x68, 0x00, 0x2a, 0x03, 0xd0, 0x00, 0x21, 0x01, 0x20, 0xe7, 0xf7, 0xc4, 0xfe, 0x00, 0xf0, 0xf4, 0xf9, 0x20, 0x1c, 0xf9, 0xf7, 0xd5, 0xfb, 0x07, 0x1c, 0x11, 0xd1, 0x20, 0x1c, 0xf9, 0xf7, 0x88, 0xfb, 0x07, 0x1c, 0x2e, 0xd0, 0x01, 0x23, 0x3b, 0x61, 0x68, 0x89, 0x40, 0x21, 0xc8, 0x53, 0x73, 0x68, 0x3c, 0x00, 0x78, 0x86, 0x01, 0x00, 0x00, 0x2b, 0x04, 0xd0, 0x21, 0x1c, 0x00, 0x20, 0x04, 0x9a, 0xe7, 0xf7, 0xac, 0xfe, 0x01, 0x23, 0xfb, 0x62, 0x20, 0x69, 0x32, 0x21, 0xf2, 0xf7, 0x75, 0xf8, 0x05, 0x1c, 0x20, 0x69, 0x01, 0x21, 0xf2, 0xf7, 0x70, 0xf8, 0x0e, 0x4e, 0x01, 0x1c, 0x2a, 0x1c, 0x30, 0x1c, 0xed, 0xf7, 0xc0, 0xfb, 0x00, 0x28, 0x0e, 0xd1, 0x32, 0x21, 0x20, 0x69, 0xf2, 0xf7, 0x64, 0xf8, 0x3c, 0x00, 0xb4, 0x86, 0x01, 0x00, 0x05, 0x1c, 0x20, 0x69, 0x01, 0x21, 0xf2, 0xf7, 0x5f, 0xf8, 0x01, 0x1c, 0x3b, 0x1c, 0x2a, 0x1c, 0x30, 0x1c, 0xed, 0xf7, 0xd7, 0xfa, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0x7c, 0xd9, 0x01, 0x00, 0x40, 0xf8, 0x01, 0x00, 0x20, 0xf7, 0x01, 0x00, 0x02, 0x1c, 0x08, 0x1c, 0x80, 0x2a, 0x80, 0xb5, 0x06, 0xd0, 0x81, 0x2a, 0x03, 0xd0, 0x04, 0x21, 0x0b, 0x20, 0xe8, 0xf7, 0x3c, 0x00, 0xf0, 0x86, 0x01, 0x00, 0xd9, 0xfd, 0x80, 0xbd, 0xff, 0xf7, 0x5c, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x03, 0x48, 0x81, 0x78, 0xff, 0x29, 0x01, 0xd0, 0x00, 0x79, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x80, 0xf8, 0x01, 0x00, 0x30, 0xb5, 0x89, 0xb0, 0x00, 0x93, 0x0e, 0x4d, 0x13, 0x1c, 0x04, 0x1c, 0x2a, 0x1c, 0xec, 0xf7, 0x25, 0xfd, 0x01, 0xa9, 0x06, 0xa8, 0xa2, 0x68, 0xec, 0xf7, 0xce, 0xfe, 0x3c, 0x00, 0x2c, 0x87, 0x01, 0x00, 0x01, 0xaa, 0x06, 0xa9, 0x28, 0x1c, 0x63, 0x6a, 0xed, 0xf7, 0x44, 0xfa, 0x04, 0x1c, 0x01, 0x28, 0x04, 0xd1, 0x28, 0x1c, 0xed, 0xf7, 0x2c, 0xf8, 0x00, 0xf0, 0x4a, 0xf8, 0x20, 0x1c, 0x09, 0xb0, 0x30, 0xbd, 0x00, 0x00, 0x20, 0xf7, 0x01, 0x00, 0x80, 0xb5, 0xed, 0xf7, 0x2b, 0xf8, 0x00, 0xf0, 0x7d, 0xf8, 0x02, 0x48, 0xed, 0xf7, 0x02, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x68, 0x87, 0x01, 0x00, 0x20, 0xf7, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x28, 0x0b, 0xd1, 0x06, 0x48, 0xed, 0xf7, 0xf8, 0xf9, 0x00, 0xf0, 0x6e, 0xf8, 0x01, 0x20, 0xed, 0xf7, 0xeb, 0xfa, 0x03, 0x49, 0x03, 0x20, 0xf9, 0xf7, 0x35, 0xfe, 0x80, 0xbd, 0x20, 0xf7, 0x01, 0x00, 0x6d, 0x87, 0x01, 0x00, 0xb0, 0xb5, 0x10, 0x4d, 0x04, 0x1c, 0x13, 0x1c, 0x2a, 0x1c, 0x88, 0xb0, 0xec, 0xf7, 0x02, 0xfd, 0x3c, 0x00, 0xa4, 0x87, 0x01, 0x00, 0x21, 0x1c, 0x0a, 0x31, 0x06, 0x22, 0x28, 0x1d, 0xe7, 0xf7, 0xa4, 0xfe, 0x69, 0x46, 0x05, 0xa8, 0x62, 0x69, 0xec, 0xf7, 0x87, 0xfe, 0x28, 0x1c, 0xec, 0xf7, 0xee, 0xff, 0x7f, 0x23, 0xdb, 0x43, 0x28, 0x1c, 0x6a, 0x46, 0x05, 0xa9, 0xed, 0xf7, 0xf9, 0xf9, 0x00, 0xf0, 0x1d, 0xf8, 0x08, 0xb0, 0xb0, 0xbd, 0x00, 0x00, 0x20, 0xf7, 0x01, 0x00, 0x0a, 0x48, 0x80, 0xb5, 0x3c, 0x00, 0xe0, 0x87, 0x01, 0x00, 0x01, 0x78, 0x00, 0x29, 0x06, 0xd0, 0x02, 0x29, 0x01, 0xd0, 0x05, 0x29, 0x07, 0xd1, 0x03, 0x21, 0x01, 0x70, 0x80, 0xbd, 0x01, 0x21, 0x01, 0x70, 0x00, 0xf0, 0x2e, 0xfa, 0x80, 0xbd, 0x03, 0x21, 0x0b, 0x20, 0xe8, 0xf7, 0x4f, 0xfd, 0x80, 0xbd, 0x7c, 0xd9, 0x01, 0x00, 0x09, 0x49, 0x80, 0xb5, 0x08, 0x78, 0x00, 0x28, 0x06, 0xd0, 0x02, 0x28, 0x01, 0xd0, 0x05, 0x28, 0x3c, 0x00, 0x1c, 0x88, 0x01, 0x00, 0x05, 0xd1, 0x04, 0x20, 0x08, 0x70, 0x80, 0xbd, 0xff, 0xf7, 0x38, 0xfd, 0x80, 0xbd, 0x02, 0x21, 0x0b, 0x20, 0xe8, 0xf7, 0x39, 0xfd, 0x80, 0xbd, 0x7c, 0xd9, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x0b, 0x20, 0x04, 0x4a, 0xfa, 0xf7, 0x82, 0xff, 0xf6, 0xf7, 0x86, 0xfd, 0x02, 0x49, 0x08, 0x61, 0x80, 0xbd, 0x00, 0x00, 0xdd, 0x86, 0x01, 0x00, 0x7c, 0xd9, 0x01, 0x00, 0x3c, 0x00, 0x58, 0x88, 0x01, 0x00, 0x0c, 0x48, 0x80, 0xb5, 0x01, 0x78, 0x06, 0x29, 0x0e, 0xd2, 0x02, 0xa3, 0x5b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x00, 0x06, 0x03, 0x07, 0x07, 0x07, 0x06, 0x00, 0x20, 0x00, 0xf0, 0xc2, 0xf8, 0x80, 0xbd, 0x05, 0x21, 0x01, 0x70, 0x80, 0xbd, 0x04, 0x21, 0x0b, 0x20, 0xe8, 0xf7, 0x0e, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0x7c, 0xd9, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0x94, 0x88, 0x01, 0x00, 0x10, 0xb5, 0x0d, 0x4b, 0x04, 0x1c, 0x18, 0x1c, 0x10, 0x30, 0x00, 0x2c, 0x08, 0xd0, 0xdb, 0x88, 0x5b, 0x04, 0x5b, 0x0c, 0x0b, 0x80, 0x80, 0x7b, 0x48, 0x80, 0x04, 0x20, 0x10, 0x80, 0x08, 0xe0, 0xda, 0x88, 0x01, 0x24, 0xe4, 0x03, 0x22, 0x40, 0x0c, 0x88, 0x22, 0x43, 0xda, 0x80, 0x49, 0x88, 0x81, 0x73, 0x01, 0x20, 0x10, 0xbd, 0x00, 0x00, 0x30, 0x00, 0x07, 0x00, 0x3c, 0x00, 0xd0, 0x88, 0x01, 0x00, 0x70, 0xb5, 0x10, 0x4e, 0x02, 0x1c, 0x00, 0x23, 0xf0, 0x56, 0x00, 0x2a, 0x02, 0xd0, 0x08, 0x70, 0x01, 0x24, 0x15, 0xe0, 0x00, 0x23, 0xcd, 0x56, 0x85, 0x42, 0x01, 0xd1, 0x01, 0x20, 0x70, 0xbd, 0x28, 0x1c, 0x00, 0xf0, 0x5f, 0xf9, 0x04, 0x1c, 0x0a, 0xd0, 0x07, 0x48, 0x35, 0x70, 0x00, 0x68, 0x00, 0x28, 0x03, 0xd0, 0x00, 0x21, 0x0a, 0x20, 0xf9, 0xf7, 0x28, 0xfd, 0x3c, 0x00, 0x0c, 0x89, 0x01, 0x00, 0x00, 0xf0, 0x16, 0xfa, 0x20, 0x1c, 0x70, 0xbd, 0xf4, 0x6b, 0x01, 0x00, 0x3c, 0xd9, 0x01, 0x00, 0x03, 0x1c, 0x08, 0x1c, 0x00, 0x2b, 0x80, 0xb5, 0x06, 0xd0, 0x04, 0x21, 0x11, 0x80, 0x04, 0x22, 0x04, 0x49, 0xe7, 0xf7, 0xe3, 0xfd, 0x02, 0xe0, 0x00, 0x68, 0x00, 0xf0, 0xcf, 0xf9, 0x01, 0x20, 0x80, 0xbd, 0x00, 0x00, 0xf4, 0x74, 0x01, 0x00, 0x10, 0xb5, 0xff, 0xf7, 0x3c, 0x00, 0x48, 0x89, 0x01, 0x00, 0x97, 0xfb, 0xff, 0xf7, 0x89, 0xfc, 0x04, 0x1c, 0xff, 0xf7, 0xb8, 0xfb, 0xff, 0xf7, 0x84, 0xfc, 0x00, 0x2c, 0x02, 0xd1, 0x01, 0x28, 0x00, 0xd1, 0x10, 0xbd, 0x00, 0x20, 0x10, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x20, 0x4f, 0x04, 0x1c, 0x78, 0x78, 0x0e, 0x1c, 0x02, 0x28, 0x2e, 0xd0, 0x1e, 0x4a, 0xf9, 0x68, 0x91, 0x61, 0x14, 0x23, 0x1d, 0x49, 0x58, 0x43, 0x40, 0x18, 0x3c, 0x00, 0x84, 0x89, 0x01, 0x00, 0x41, 0x7b, 0xb8, 0x78, 0xf8, 0xf7, 0x14, 0xfe, 0x00, 0xf0, 0x8a, 0xf9, 0x00, 0x25, 0x04, 0xe0, 0x00, 0x21, 0xb8, 0x78, 0xf8, 0xf7, 0x0c, 0xfe, 0x01, 0x35, 0x78, 0x78, 0x14, 0x23, 0x14, 0x49, 0x58, 0x43, 0x40, 0x18, 0x80, 0x7a, 0xa8, 0x42, 0xf2, 0xdc, 0x00, 0x25, 0x08, 0xe0, 0x00, 0x21, 0xb8, 0x78, 0xf8, 0xf7, 0xfd, 0xfd, 0x0f, 0x48, 0x00, 0x68, 0x20, 0x70, 0x3c, 0x00, 0xc0, 0x89, 0x01, 0x00, 0x01, 0x34, 0x01, 0x35, 0xb5, 0x42, 0xf4, 0xdb, 0x09, 0x4a, 0xf8, 0x68, 0x50, 0x61, 0x78, 0x78, 0x02, 0x28, 0x06, 0xd1, 0xb8, 0x68, 0x32, 0x1c, 0x21, 0x1c, 0x00, 0x04, 0x00, 0x0c, 0xff, 0xf7, 0x25, 0xfd, 0xb8, 0x68, 0x80, 0x19, 0xb8, 0x60, 0xf8, 0xbd, 0x00, 0x00, 0x40, 0xd9, 0x01, 0x00, 0x10, 0x00, 0x07, 0x00, 0x64, 0x8d, 0x01, 0x00, 0x30, 0x20, 0x07, 0x00, 0x3c, 0x00, 0xfc, 0x89, 0x01, 0x00, 0x70, 0xb5, 0x06, 0x1c, 0x0c, 0x4d, 0x00, 0x24, 0x2c, 0x70, 0xff, 0xf7, 0x39, 0xfc, 0x0a, 0x48, 0x18, 0x21, 0x1c, 0x30, 0xac, 0x60, 0xe7, 0xf7, 0x43, 0xfd, 0x08, 0x48, 0x44, 0x61, 0xf9, 0xf7, 0x63, 0xf9, 0x00, 0x2e, 0x06, 0xd1, 0x06, 0x48, 0x29, 0x69, 0xf6, 0xf7, 0xa7, 0xfc, 0x00, 0x20, 0xec, 0xf7, 0xb0, 0xfe, 0x70, 0xbd, 0x00, 0x00, 0x7c, 0xd9, 0x01, 0x00, 0x3c, 0x00, 0x38, 0x8a, 0x01, 0x00, 0x20, 0xf7, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x30, 0xb5, 0x12, 0x4c, 0x85, 0xb0, 0x20, 0x68, 0x00, 0x28, 0x1c, 0xd0, 0x0f, 0x48, 0x14, 0x38, 0x80, 0x68, 0x00, 0x28, 0x01, 0xd1, 0xff, 0xf7, 0xc1, 0xfb, 0x20, 0x68, 0x00, 0x23, 0x00, 0x68, 0x01, 0xaa, 0x04, 0x30, 0x01, 0x21, 0xec, 0xf7, 0xd1, 0xfd, 0x08, 0x49, 0x08, 0x4a, 0x08, 0x31, 0x0c, 0x31, 0x00, 0x92, 0x3c, 0x00, 0x74, 0x8a, 0x01, 0x00, 0x03, 0xc9, 0x00, 0xab, 0x45, 0x18, 0x99, 0x7b, 0x01, 0x9a, 0x20, 0x68, 0x2b, 0x1c, 0xf2, 0xf7, 0x2b, 0xfe, 0x05, 0xb0, 0x30, 0xbd, 0x00, 0x00, 0x90, 0xd9, 0x01, 0x00, 0x29, 0x81, 0x01, 0x00, 0x10, 0xb5, 0x13, 0x4c, 0x14, 0x23, 0x60, 0x70, 0x58, 0x43, 0x12, 0x4b, 0xc1, 0x18, 0x8a, 0x88, 0xe2, 0x80, 0x18, 0x58, 0xe0, 0x60, 0x08, 0x7a, 0xa0, 0x70, 0xff, 0x28, 0x3c, 0x00, 0xb0, 0x8a, 0x01, 0x00, 0x12, 0xd0, 0x00, 0x22, 0x08, 0x21, 0x0d, 0x4b, 0xf8, 0xf7, 0x22, 0xfd, 0x00, 0x22, 0x02, 0x20, 0xe1, 0x68, 0xef, 0xf7, 0xbd, 0xfe, 0x0a, 0x49, 0xe0, 0x68, 0x48, 0x61, 0x4a, 0x68, 0x02, 0x43, 0x4a, 0x60, 0x8a, 0x68, 0x10, 0x43, 0x88, 0x60, 0x60, 0x78, 0x02, 0x28, 0x01, 0xd1, 0xff, 0xf7, 0xdf, 0xfc, 0x10, 0xbd, 0x40, 0xd9, 0x01, 0x00, 0x64, 0x8d, 0x01, 0x00, 0x3c, 0x00, 0xec, 0x8a, 0x01, 0x00, 0xb8, 0x0b, 0x00, 0x00, 0x10, 0x00, 0x07, 0x00, 0xfe, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x06, 0x21, 0x15, 0x4b, 0x41, 0x43, 0x58, 0x5c, 0x82, 0x06, 0x14, 0x48, 0x92, 0x0e, 0x42, 0x71, 0xc9, 0x18, 0x4a, 0x78, 0xd2, 0x06, 0xd2, 0x0e, 0x02, 0x71, 0x42, 0x78, 0x0c, 0x23, 0x1a, 0x43, 0x42, 0x70, 0x42, 0x78, 0x8b, 0x78, 0x92, 0x08, 0x92, 0x00, 0x9b, 0x07, 0x9b, 0x0f, 0x3c, 0x00, 0x28, 0x8b, 0x01, 0x00, 0x1a, 0x43, 0x42, 0x70, 0x02, 0x78, 0xc0, 0x23, 0x9a, 0x43, 0x40, 0x32, 0x02, 0x70, 0x02, 0x78, 0x38, 0x23, 0x1a, 0x43, 0x02, 0x70, 0x02, 0x78, 0xc9, 0x78, 0x04, 0x23, 0x9a, 0x43, 0x89, 0x00, 0x19, 0x40, 0x11, 0x43, 0x01, 0x70, 0x01, 0x20, 0x70, 0x47, 0x00, 0x00, 0xd8, 0x8d, 0x01, 0x00, 0x88, 0x00, 0x07, 0x00, 0x8f, 0xb5, 0x00, 0x20, 0x02, 0x90, 0x03, 0x90, 0x3c, 0x00, 0x64, 0x8b, 0x01, 0x00, 0x07, 0x48, 0x02, 0xaa, 0x03, 0xa9, 0x00, 0x91, 0x01, 0x92, 0x43, 0x89, 0x02, 0x89, 0x03, 0xc8, 0xff, 0xf7, 0xd4, 0xfb, 0x03, 0x98, 0x02, 0x99, 0xff, 0xf7, 0x04, 0xfc, 0x8f, 0xbd, 0x00, 0x00, 0x04, 0x8e, 0x01, 0x00, 0x08, 0x49, 0x4a, 0x78, 0x00, 0x2a, 0x03, 0xd1, 0x88, 0x80, 0x00, 0x20, 0x88, 0x60, 0x70, 0x47, 0x14, 0x23, 0x5a, 0x43, 0x04, 0x4b, 0xd2, 0x18, 0x3c, 0x00, 0xa0, 0x8b, 0x01, 0x00, 0xd2, 0x88, 0x42, 0x43, 0xc8, 0x88, 0x42, 0x43, 0x8a, 0x60, 0x70, 0x47, 0x40, 0xd9, 0x01, 0x00, 0x64, 0x8d, 0x01, 0x00, 0xf8, 0xb5, 0x25, 0x4e, 0x04, 0x1c, 0x30, 0x7a, 0x40, 0x08, 0x40, 0x00, 0x30, 0x72, 0xb0, 0x7a, 0x00, 0x20, 0xb0, 0x72, 0x01, 0x27, 0x01, 0x2c, 0x20, 0x4d, 0x01, 0xd0, 0xfc, 0x42, 0x13, 0xd1, 0x30, 0x7b, 0x38, 0x43, 0x30, 0x73, 0x00, 0x22, 0x3c, 0x00, 0xdc, 0x8b, 0x01, 0x00, 0x21, 0x1c, 0x00, 0x20, 0xff, 0xf7, 0x6e, 0xfb, 0x63, 0x1c, 0x01, 0xd1, 0x3f, 0x21, 0xe9, 0x73, 0xb1, 0x7a, 0xa0, 0x22, 0x11, 0x43, 0xb1, 0x72, 0x31, 0x7a, 0x39, 0x43, 0x31, 0x72, 0xf8, 0xbd, 0x30, 0x7b, 0x40, 0x08, 0x40, 0x00, 0x30, 0x73, 0x01, 0x22, 0x21, 0x1c, 0x01, 0x20, 0xff, 0xf7, 0x59, 0xfb, 0x01, 0x20, 0x00, 0x21, 0xe9, 0x73, 0xb1, 0x7a, 0x02, 0x22, 0x3c, 0x00, 0x18, 0x8c, 0x01, 0x00, 0x11, 0x43, 0xb1, 0x72, 0xb1, 0x7a, 0x04, 0x22, 0x11, 0x43, 0xb1, 0x72, 0xb1, 0x7a, 0x30, 0x22, 0x11, 0x43, 0xb1, 0x72, 0x31, 0x7a, 0x39, 0x43, 0x31, 0x72, 0x08, 0x49, 0x4a, 0x68, 0x80, 0x23, 0x9a, 0x43, 0x4a, 0x60, 0x0a, 0x68, 0x1a, 0x43, 0x0a, 0x60, 0x31, 0x7b, 0x39, 0x43, 0x31, 0x73, 0xd7, 0xe7, 0x00, 0x00, 0x88, 0x00, 0x07, 0x00, 0x40, 0x00, 0x07, 0x00, 0x3c, 0x00, 0x54, 0x8c, 0x01, 0x00, 0x6c, 0x00, 0x07, 0x00, 0xb0, 0xb5, 0x0e, 0x4d, 0x0e, 0x48, 0x29, 0x69, 0xf6, 0xf7, 0x9e, 0xfb, 0x0d, 0x48, 0xec, 0xf7, 0x93, 0xfd, 0x0d, 0x48, 0x09, 0x4c, 0x00, 0x88, 0x1c, 0x34, 0xa0, 0x82, 0xf1, 0xf7, 0x5a, 0xff, 0x20, 0x61, 0xfa, 0xf7, 0x97, 0xf8, 0x02, 0x1c, 0x23, 0x1c, 0x00, 0x21, 0x00, 0x20, 0xec, 0xf7, 0x8b, 0xff, 0x32, 0x20, 0xe8, 0x60, 0xff, 0xf7, 0x3c, 0x00, 0x90, 0x8c, 0x01, 0x00, 0xa5, 0xfa, 0xb0, 0xbd, 0x7c, 0xd9, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0xdd, 0x84, 0x01, 0x00, 0x20, 0xf7, 0x01, 0x00, 0xb0, 0xb5, 0x0a, 0x4d, 0x68, 0x78, 0x00, 0x28, 0x0e, 0xd0, 0x14, 0x23, 0x08, 0x49, 0x58, 0x43, 0x40, 0x18, 0x44, 0x7a, 0x06, 0xe0, 0xa8, 0x68, 0xe0, 0x40, 0x01, 0x06, 0x09, 0x0e, 0xa8, 0x78, 0xf8, 0xf7, 0x76, 0xfc, 0x08, 0x3c, 0xf6, 0xd5, 0x3c, 0x00, 0xcc, 0x8c, 0x01, 0x00, 0xb0, 0xbd, 0x00, 0x00, 0x40, 0xd9, 0x01, 0x00, 0x64, 0x8d, 0x01, 0x00, 0x01, 0x1c, 0x14, 0x48, 0xb0, 0xb5, 0x01, 0x60, 0x13, 0x48, 0x02, 0x7f, 0x02, 0x23, 0x9a, 0x43, 0x02, 0x77, 0x02, 0x7f, 0x01, 0x24, 0x22, 0x43, 0x02, 0x77, 0x10, 0x4d, 0x00, 0x29, 0x0c, 0xd0, 0x01, 0x22, 0x00, 0x21, 0x03, 0x20, 0xef, 0xf7, 0x9f, 0xfd, 0x0d, 0x49, 0x48, 0x7c, 0xa0, 0x43, 0x3c, 0x00, 0x08, 0x8d, 0x01, 0x00, 0x48, 0x74, 0x68, 0x7a, 0x20, 0x43, 0x68, 0x72, 0xb0, 0xbd, 0x01, 0x7f, 0x21, 0x43, 0x01, 0x77, 0x68, 0x7a, 0x40, 0x08, 0x40, 0x00, 0x68, 0x72, 0x01, 0x22, 0x00, 0x21, 0x03, 0x20, 0xef, 0xf7, 0xb1, 0xfd, 0xb0, 0xbd, 0xf4, 0x74, 0x01, 0x00, 0x30, 0x00, 0x07, 0x00, 0x88, 0x00, 0x07, 0x00, 0x10, 0x00, 0x07, 0x00, 0x10, 0xb5, 0x07, 0x4c, 0x21, 0x1c, 0x00, 0x20, 0x3c, 0x00, 0x44, 0x8d, 0x01, 0x00, 0xf9, 0xf7, 0x56, 0xfb, 0x05, 0x48, 0x00, 0x23, 0xc0, 0x56, 0x01, 0x28, 0x03, 0xdd, 0x21, 0x1c, 0x00, 0x20, 0xf9, 0xf7, 0x19, 0xfb, 0x10, 0xbd, 0x65, 0x1a, 0x00, 0x00, 0xf4, 0x6b, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x01, 0x01, 0x00, 0x02, 0x18, 0x04, 0xff, 0x82, 0xe8, 0xd7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x3c, 0x00, 0x80, 0x8d, 0x01, 0x00, 0x00, 0x18, 0x00, 0x06, 0x02, 0x03, 0x05, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0xff, 0x10, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x00, 0x01, 0x00, 0x02, 0x10, 0x00, 0x06, 0x02, 0x03, 0x05, 0x01, 0x01, 0x00, 0x00, 0x00, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0c, 0x0d, 0x0e, 0x3c, 0x00, 0xbc, 0x8d, 0x01, 0x00, 0xff, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0xff, 0x1a, 0x11, 0x13, 0x12, 0x0f, 0x10, 0xff, 0x02, 0x00, 0xff, 0x01, 0x03, 0x09, 0x0a, 0x0b, 0x00, 0x00, 0x30, 0x0d, 0x02, 0x00, 0x00, 0x00, 0x28, 0x0e, 0x03, 0x00, 0x00, 0x00, 0x1e, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0d, 0x02, 0x01, 0x00, 0x00, 0x1e, 0x0c, 0x00, 0x01, 0x00, 0x00, 0x23, 0x0d, 0x3c, 0x00, 0xf8, 0x8d, 0x01, 0x00, 0x02, 0x01, 0x00, 0x00, 0x1d, 0x0d, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0xfb, 0x6d, 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x34, 0x8e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x70, 0x8e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xac, 0x8e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0x8e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x24, 0x8f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x60, 0x8f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x8f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0x8f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x14, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x50, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x8c, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x04, 0x91, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x40, 0x91, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x7c, 0x91, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0x91, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf4, 0x91, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x30, 0x92, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x6c, 0x92, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0x92, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0x92, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x20, 0x93, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x5c, 0x93, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0x93, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd4, 0x93, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x10, 0x94, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x4c, 0x94, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0x94, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc4, 0x94, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x95, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0x95, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0x95, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb4, 0x95, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf0, 0x95, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x2c, 0x96, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0x96, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa4, 0x96, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe0, 0x96, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0x97, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0x97, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x94, 0x97, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd0, 0x97, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x98, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0x98, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x84, 0x98, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0x98, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xfc, 0x98, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x99, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x74, 0x99, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb0, 0x99, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xec, 0x99, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0x9a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x64, 0x9a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa0, 0x9a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xdc, 0x9a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0x9b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x54, 0x9b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x90, 0x9b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xcc, 0x9b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0x9c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x44, 0x9c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x80, 0x9c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xbc, 0x9c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x9c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x34, 0x9d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x70, 0x9d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xac, 0x9d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0x9d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x24, 0x9e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x60, 0x9e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x9e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0x9e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x14, 0x9f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x50, 0x9f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x8c, 0x9f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0x9f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x04, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x40, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf4, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x30, 0xa1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xa1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xa1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0xa1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x20, 0xa2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xa2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xa2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd4, 0xa2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x10, 0xa3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xa3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xa3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc4, 0xa3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xa4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xa4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xa4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb4, 0xa4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf0, 0xa4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xa5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0xa5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa4, 0xa5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe0, 0xa5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0xa6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xa6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x94, 0xa6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd0, 0xa6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xa7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0xa7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x84, 0xa7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0xa7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xfc, 0xa7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0xa8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x74, 0xa8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb0, 0xa8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xec, 0xa8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0xa9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x64, 0xa9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa0, 0xa9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xdc, 0xa9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0xaa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x54, 0xaa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x90, 0xaa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xcc, 0xaa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0xab, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x44, 0xab, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x80, 0xab, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xbc, 0xab, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0xab, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x34, 0xac, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x70, 0xac, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xac, 0xac, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xac, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x24, 0xad, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x60, 0xad, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x9c, 0xad, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0xad, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x14, 0xae, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x50, 0xae, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x8c, 0xae, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0xae, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x04, 0xaf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x40, 0xaf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xaf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xaf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf4, 0xaf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x30, 0xb0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xb0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xb0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0xb0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x20, 0xb1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xb1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xb1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd4, 0xb1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x10, 0xb2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xb2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xb2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc4, 0xb2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xb3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xb3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xb3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb4, 0xb3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf0, 0xb3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xb4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0xb4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa4, 0xb4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe0, 0xb4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0xb5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xb5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x94, 0xb5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd0, 0xb5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xb6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0xb6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x84, 0xb6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0xb6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xfc, 0xb6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0xb7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x74, 0xb7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb0, 0xb7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xec, 0xb7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0xb8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x64, 0xb8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa0, 0xb8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xdc, 0xb8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0xb9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x54, 0xb9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x90, 0xb9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xcc, 0xb9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0xba, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x44, 0xba, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x80, 0xba, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xbc, 0xba, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0xba, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x34, 0xbb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x70, 0xbb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xac, 0xbb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xbb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x24, 0xbc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x60, 0xbc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x9c, 0xbc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0xbc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x14, 0xbd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x50, 0xbd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x8c, 0xbd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0xbd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x04, 0xbe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x40, 0xbe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xbe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xbe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf4, 0xbe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x30, 0xbf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xbf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xbf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0xbf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x20, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd4, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x10, 0xc1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xc1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xc1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc4, 0xc1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb4, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf0, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xc3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0xc3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa4, 0xc3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe0, 0xc3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0xc4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xc4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x94, 0xc4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd0, 0xc4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xc5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0xc5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x84, 0xc5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0xc5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xfc, 0xc5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0xc6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x74, 0xc6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb0, 0xc6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xec, 0xc6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0xc7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x64, 0xc7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa0, 0xc7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xdc, 0xc7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0xc8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x54, 0xc8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x90, 0xc8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xcc, 0xc8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0xc9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x44, 0xc9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x80, 0xc9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xbc, 0xc9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0xc9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x34, 0xca, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x70, 0xca, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xac, 0xca, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xca, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x24, 0xcb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x60, 0xcb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x9c, 0xcb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0xcb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x14, 0xcc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x50, 0xcc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x8c, 0xcc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0xcc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x04, 0xcd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x40, 0xcd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xcd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xcd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf4, 0xcd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x30, 0xce, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xce, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xce, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0xce, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x20, 0xcf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xcf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xcf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd4, 0xcf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x10, 0xd0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xd0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xd0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc4, 0xd0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xd1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xd1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xd1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb4, 0xd1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf0, 0xd1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xd2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0xd2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa4, 0xd2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe0, 0xd2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0xd3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xd3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x94, 0xd3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd0, 0xd3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x84, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xfc, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x74, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb0, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xec, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0xd6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x64, 0xd6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa0, 0xd6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xdc, 0xd6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0xd7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x54, 0xd7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x90, 0xd7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xcc, 0xd7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0xd8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x44, 0xd8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x80, 0xd8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xbc, 0xd8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0xd8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x34, 0xd9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x70, 0xd9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xac, 0xd9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xd9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x24, 0xda, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x60, 0xda, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x9c, 0xda, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0xda, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x14, 0xdb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x50, 0xdb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x8c, 0xdb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0xdb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x04, 0xdc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x40, 0xdc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xdc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xdc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf4, 0xdc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x30, 0xdd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xdd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xdd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0xdd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x20, 0xde, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xde, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xde, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd4, 0xde, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x10, 0xdf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xdf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xdf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc4, 0xdf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb4, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf0, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xe1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0xe1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa4, 0xe1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe0, 0xe1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0xe2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xe2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x94, 0xe2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd0, 0xe2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xe3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0xe3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x84, 0xe3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0xe3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xfc, 0xe3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0xe4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x74, 0xe4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb0, 0xe4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xec, 0xe4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0xe5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x64, 0xe5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa0, 0xe5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xdc, 0xe5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0xe6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x54, 0xe6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x90, 0xe6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xcc, 0xe6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0xe7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x44, 0xe7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x80, 0xe7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xbc, 0xe7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0xe7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x34, 0xe8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x70, 0xe8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xac, 0xe8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xe8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x24, 0xe9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x60, 0xe9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x9c, 0xe9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0xe9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x14, 0xea, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x50, 0xea, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x8c, 0xea, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0xea, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x04, 0xeb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x40, 0xeb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xeb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xeb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf4, 0xeb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x30, 0xec, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xec, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xec, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0xec, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x20, 0xed, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xed, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xed, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd4, 0xed, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x10, 0xee, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xee, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xee, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc4, 0xee, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xef, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xef, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xef, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb4, 0xef, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf0, 0xef, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa4, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe0, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0xf1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xf1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x94, 0xf1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd0, 0xf1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xf2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0xf2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x84, 0xf2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0xf2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xfc, 0xf2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0xf3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x74, 0xf3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb0, 0xf3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xec, 0xf3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0xf4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x64, 0xf4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa0, 0xf4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xdc, 0xf4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0xf5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x54, 0xf5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x90, 0xf5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xcc, 0xf5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0xf6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x44, 0xf6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x80, 0xf6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xbc, 0xf6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0xf6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x34, 0xf7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x70, 0xf7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xac, 0xf7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xf7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x24, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x60, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x9c, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x14, 0xf9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x50, 0xf9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x8c, 0xf9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0xf9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x04, 0xfa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x40, 0xfa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xfa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xfa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf4, 0xfa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x30, 0xfb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xfb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xfb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0xfb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x20, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd4, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x10, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc4, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb4, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf0, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x68, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x10, 0x04, 0x00, 0x70, 0xb5, 0x2b, 0x48, 0x06, 0x21, 0x81, 0x75, 0xc1, 0x75, 0x01, 0x7e, 0x49, 0x08, 0x49, 0x00, 0x01, 0x76, 0x01, 0x7e, 0x02, 0x22, 0x91, 0x43, 0x01, 0x76, 0x26, 0x49, 0x0b, 0x78, 0x5b, 0x08, 0x5b, 0x00, 0x0b, 0x70, 0x04, 0x23, 0x8b, 0x70, 0x0c, 0x23, 0x43, 0x76, 0x20, 0x23, 0x03, 0x75, 0x1a, 0x24, 0x44, 0x75, 0x24, 0x24, 0x84, 0x76, 0x10, 0x24, 0xc4, 0x76, 0x3c, 0x00, 0x3c, 0x10, 0x04, 0x00, 0x2a, 0x25, 0x4d, 0x70, 0x05, 0x7a, 0x30, 0x26, 0xb5, 0x43, 0x20, 0x35, 0x05, 0x72, 0x85, 0x7a, 0x6d, 0x08, 0x6d, 0x00, 0x85, 0x72, 0x85, 0x7a, 0x95, 0x43, 0x85, 0x72, 0x85, 0x7a, 0x04, 0x26, 0x35, 0x43, 0x85, 0x72, 0x85, 0x7a, 0x08, 0x26, 0x35, 0x43, 0x85, 0x72, 0x85, 0x7a, 0xa5, 0x43, 0x85, 0x72, 0x05, 0x7b, 0x2c, 0x43, 0x04, 0x73, 0x04, 0x7b, 0x1c, 0x43, 0x3c, 0x00, 0x78, 0x10, 0x04, 0x00, 0x04, 0x73, 0x04, 0x7b, 0x40, 0x25, 0x2c, 0x43, 0x04, 0x73, 0x84, 0x7a, 0x23, 0x43, 0x83, 0x72, 0x83, 0x7a, 0xab, 0x43, 0x83, 0x72, 0x03, 0x7b, 0x80, 0x24, 0x23, 0x43, 0x03, 0x73, 0x08, 0x78, 0x90, 0x43, 0x08, 0x70, 0x08, 0x78, 0x01, 0x22, 0x10, 0x43, 0x08, 0x70, 0x08, 0x78, 0x04, 0x22, 0x90, 0x43, 0x08, 0x70, 0x70, 0xbd, 0x00, 0x00, 0x0c, 0x80, 0x07, 0x00, 0x3c, 0x00, 0xb4, 0x10, 0x04, 0x00, 0x80, 0x80, 0x07, 0x00, 0x01, 0x49, 0x04, 0x20, 0x48, 0x73, 0x70, 0x47, 0x40, 0x80, 0x07, 0x00, 0x03, 0x49, 0x80, 0xb5, 0x00, 0x20, 0x08, 0x80, 0x00, 0xf0, 0x0a, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xfc, 0x6b, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x67, 0xfb, 0x80, 0xbd, 0x80, 0xb5, 0x0a, 0x49, 0x18, 0x20, 0xc1, 0xf7, 0x3b, 0xfa, 0x09, 0x49, 0x3c, 0x00, 0xf0, 0x10, 0x04, 0x00, 0x02, 0x20, 0xc1, 0xf7, 0x37, 0xfa, 0x08, 0x49, 0x1f, 0x20, 0xc1, 0xf7, 0x33, 0xfa, 0x07, 0x49, 0x1c, 0x20, 0xc1, 0xf7, 0x2f, 0xfa, 0x06, 0x49, 0x03, 0x20, 0xc1, 0xf7, 0x2b, 0xfa, 0x80, 0xbd, 0x99, 0x2a, 0x00, 0x00, 0x41, 0x25, 0x00, 0x00, 0x55, 0x25, 0x00, 0x00, 0x5d, 0x25, 0x00, 0x00, 0x39, 0x25, 0x00, 0x00, 0x80, 0xb5, 0xbf, 0xf7, 0x91, 0xfd, 0x80, 0xbd, 0x3c, 0x00, 0x2c, 0x11, 0x04, 0x00, 0x80, 0xb5, 0x05, 0x4a, 0x05, 0x49, 0x0a, 0x20, 0xbf, 0xf7, 0x4e, 0xff, 0x01, 0x20, 0x04, 0x49, 0x80, 0x02, 0x08, 0x60, 0x48, 0x60, 0x80, 0xbd, 0xb4, 0x74, 0x01, 0x00, 0xb1, 0x64, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x91, 0xfe, 0x80, 0xbd, 0x80, 0xb5, 0x05, 0x4a, 0x05, 0x49, 0x1b, 0x20, 0xbf, 0xf7, 0x38, 0xff, 0x01, 0x20, 0x04, 0x49, 0x3c, 0x00, 0x68, 0x11, 0x04, 0x00, 0xc0, 0x06, 0x08, 0x60, 0x48, 0x60, 0x80, 0xbd, 0xb8, 0x74, 0x01, 0x00, 0x2d, 0x6e, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x80, 0xb5, 0x04, 0x48, 0x00, 0xf0, 0x80, 0xfe, 0x03, 0x49, 0x00, 0x20, 0x48, 0x60, 0x88, 0x60, 0x80, 0xbd, 0x00, 0x00, 0x41, 0x4b, 0x00, 0x00, 0xbc, 0x74, 0x01, 0x00, 0x80, 0xb5, 0xc5, 0xf7, 0xd5, 0xfe, 0xce, 0xf7, 0xd9, 0xf8, 0x03, 0x49, 0x3c, 0x00, 0xa4, 0x11, 0x04, 0x00, 0x08, 0x60, 0x03, 0x49, 0x0a, 0x20, 0xd1, 0xf7, 0xef, 0xf8, 0x80, 0xbd, 0xbc, 0x74, 0x01, 0x00, 0x49, 0x6e, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x22, 0x20, 0x21, 0x06, 0x20, 0xc8, 0xf7, 0x56, 0xfc, 0xbf, 0xf7, 0x70, 0xfe, 0x03, 0x49, 0x00, 0x20, 0x08, 0x60, 0x20, 0x21, 0x02, 0x48, 0xbf, 0xf7, 0x63, 0xf9, 0x80, 0xbd, 0xcc, 0x5c, 0x01, 0x00, 0x64, 0x6d, 0x01, 0x00, 0x3c, 0x00, 0xe0, 0x11, 0x04, 0x00, 0x08, 0x48, 0x80, 0xb5, 0x00, 0x68, 0x00, 0x28, 0x05, 0xd0, 0x06, 0x48, 0x54, 0x30, 0x42, 0x6a, 0x00, 0x21, 0xbf, 0xf7, 0xf3, 0xf8, 0x04, 0x4a, 0x04, 0x49, 0x03, 0x20, 0xbf, 0xf7, 0xac, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0x50, 0x6d, 0x01, 0x00, 0x89, 0x98, 0x00, 0x00, 0x91, 0x98, 0x00, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x03, 0xf8, 0x00, 0xf0, 0x19, 0xf8, 0x80, 0xbd, 0x3c, 0x00, 0x1c, 0x12, 0x04, 0x00, 0x10, 0xb5, 0x09, 0x4c, 0x60, 0x21, 0x20, 0x1c, 0xbf, 0xf7, 0x3a, 0xf9, 0x00, 0x20, 0xc0, 0x43, 0xa0, 0x60, 0x20, 0x60, 0xff, 0x20, 0x02, 0x30, 0xe0, 0x84, 0x20, 0x22, 0x20, 0x1c, 0x40, 0x30, 0x02, 0x49, 0xbf, 0xf7, 0x5b, 0xf9, 0x10, 0xbd, 0x00, 0x10, 0x07, 0x00, 0x70, 0x52, 0x01, 0x00, 0x00, 0x20, 0x0a, 0x49, 0xc0, 0x43, 0x88, 0x60, 0x09, 0x4b, 0x0a, 0x49, 0x3c, 0x00, 0x58, 0x12, 0x04, 0x00, 0x00, 0x20, 0x82, 0x00, 0x01, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x20, 0x28, 0x99, 0x50, 0xf8, 0xd3, 0x06, 0x49, 0x04, 0x4a, 0x08, 0x1c, 0x10, 0x30, 0x08, 0x3a, 0x03, 0xc2, 0x70, 0x47, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0xe0, 0x7e, 0x01, 0x00, 0x75, 0x75, 0x00, 0x00, 0x00, 0xa0, 0x07, 0x00, 0x04, 0x48, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x0e, 0xc0, 0x0c, 0x38, 0x3c, 0x00, 0x94, 0x12, 0x04, 0x00, 0x01, 0x21, 0x41, 0x60, 0x70, 0x47, 0x00, 0x00, 0x70, 0x78, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x03, 0x48, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x0e, 0xc0, 0x08, 0xc0, 0x70, 0x47, 0x00, 0x00, 0x88, 0x5a, 0x01, 0x00, 0x04, 0x49, 0x80, 0xb5, 0x00, 0x20, 0x48, 0x61, 0x02, 0x48, 0x40, 0x21, 0x1c, 0x30, 0xbf, 0xf7, 0xe9, 0xf8, 0x80, 0xbd, 0xfc, 0x5a, 0x01, 0x00, 0x3c, 0x00, 0xd0, 0x12, 0x04, 0x00, 0x80, 0xb5, 0xce, 0xf7, 0x3f, 0xf8, 0x03, 0x49, 0x88, 0x61, 0x03, 0x49, 0x03, 0x20, 0xd1, 0xf7, 0x55, 0xf8, 0x80, 0xbd, 0xfc, 0x5a, 0x01, 0x00, 0x0d, 0x17, 0x01, 0x00, 0x80, 0xb5, 0xc0, 0xf7, 0xa5, 0xf9, 0x80, 0xbd, 0xfe, 0xb5, 0x6c, 0x49, 0x00, 0x20, 0x00, 0x90, 0xc8, 0x78, 0x6b, 0x4c, 0x6b, 0x4f, 0x43, 0x07, 0xc0, 0x06, 0xc0, 0x17, 0xdb, 0x0e, 0xe3, 0x58, 0x3c, 0x00, 0x0c, 0x13, 0x04, 0x00, 0x01, 0x30, 0x38, 0x62, 0x3b, 0x61, 0x08, 0x1c, 0x80, 0x78, 0x66, 0x4e, 0x03, 0x22, 0x41, 0x07, 0xa0, 0x36, 0x02, 0x96, 0x49, 0x0f, 0x31, 0x72, 0x89, 0x00, 0x61, 0x58, 0x3c, 0x1c, 0x61, 0x61, 0x01, 0x91, 0xc0, 0x06, 0xc0, 0x0f, 0x78, 0x62, 0x20, 0x1c, 0x00, 0x27, 0x87, 0x61, 0x00, 0x20, 0x21, 0x1c, 0xc8, 0x61, 0x59, 0x48, 0x59, 0x49, 0x00, 0x78, 0x09, 0x79, 0x3c, 0x00, 0x48, 0x13, 0x04, 0x00, 0x5a, 0x4c, 0x4e, 0x07, 0x76, 0x0f, 0x71, 0x1c, 0x8c, 0x46, 0xb1, 0x00, 0x8e, 0x46, 0x56, 0x49, 0x80, 0x31, 0x00, 0x28, 0x24, 0xd0, 0x52, 0x4f, 0x01, 0x28, 0x7f, 0x78, 0x1a, 0xd0, 0x02, 0x28, 0x71, 0xd1, 0x4f, 0x48, 0x00, 0x2f, 0x0c, 0xd0, 0x01, 0x2f, 0x6c, 0xd1, 0x40, 0x79, 0x4d, 0x4d, 0x40, 0x07, 0x40, 0x0f, 0x82, 0x00, 0xaa, 0x58, 0x4b, 0x4d, 0x01, 0x30, 0x3c, 0x00, 0x84, 0x13, 0x04, 0x00, 0xea, 0x61, 0xa0, 0x73, 0x04, 0x22, 0x4b, 0x48, 0x48, 0x4d, 0xc8, 0x61, 0x4a, 0x48, 0x00, 0x2f, 0x00, 0xd0, 0x4a, 0x48, 0x2f, 0x1c, 0x11, 0xe0, 0x42, 0x48, 0x00, 0x2f, 0x55, 0xd1, 0x07, 0x70, 0x02, 0x27, 0x47, 0x70, 0x3f, 0x48, 0x40, 0x78, 0x00, 0x28, 0x10, 0xd0, 0x01, 0x28, 0x01, 0xd0, 0x02, 0x28, 0x4a, 0xd1, 0x3f, 0x48, 0x3d, 0x4f, 0xc8, 0x61, 0x3f, 0x48, 0x3c, 0x00, 0xc0, 0x13, 0x04, 0x00, 0x88, 0x61, 0x3a, 0x49, 0x70, 0x46, 0x08, 0x58, 0x35, 0x1c, 0xb8, 0x61, 0x60, 0x46, 0x60, 0x73, 0x04, 0xe0, 0x3c, 0x48, 0x02, 0x22, 0x88, 0x61, 0x3b, 0x48, 0xc8, 0x61, 0x00, 0x20, 0x32, 0x49, 0x06, 0xe0, 0x0e, 0x18, 0xb6, 0x78, 0x76, 0x07, 0x76, 0x0f, 0x04, 0x2e, 0x2f, 0xd8, 0x01, 0x30, 0x90, 0x42, 0xf6, 0xd3, 0xc8, 0x79, 0x2e, 0x4f, 0xc0, 0x07, 0xc0, 0x0f, 0x3c, 0x00, 0xfc, 0x13, 0x04, 0x00, 0xf8, 0x60, 0x33, 0x48, 0x41, 0x68, 0x19, 0x43, 0x41, 0x60, 0x81, 0x68, 0x19, 0x43, 0x81, 0x60, 0x01, 0x9a, 0xb9, 0x69, 0x8c, 0x46, 0x11, 0x43, 0xfa, 0x69, 0x86, 0x68, 0x11, 0x43, 0x8e, 0x43, 0x86, 0x60, 0x46, 0x68, 0x31, 0x43, 0x41, 0x60, 0x01, 0x99, 0x0b, 0x43, 0x18, 0x1c, 0x61, 0x46, 0x08, 0x43, 0x10, 0x43, 0x01, 0x1c, 0x00, 0x22, 0x02, 0x20, 0xc7, 0xf7, 0x3c, 0x00, 0x38, 0x14, 0x04, 0x00, 0x03, 0xfa, 0x1e, 0x4e, 0x40, 0x3e, 0x70, 0x78, 0xc0, 0x08, 0xc0, 0x00, 0x28, 0x43, 0x70, 0x70, 0x70, 0x1c, 0x01, 0x78, 0x00, 0xe0, 0x29, 0xe0, 0x08, 0x25, 0xa9, 0x43, 0x01, 0x70, 0x01, 0x20, 0xc0, 0x43, 0xb0, 0x80, 0x00, 0x21, 0x01, 0x20, 0xcf, 0xf7, 0x6c, 0xfc, 0x30, 0x1c, 0x80, 0x30, 0x81, 0x78, 0x09, 0x09, 0x09, 0x01, 0x81, 0x70, 0x0f, 0x21, 0x01, 0x70, 0x3c, 0x00, 0x74, 0x14, 0x04, 0x00, 0x16, 0x4a, 0x69, 0x04, 0x11, 0x60, 0x51, 0x60, 0x02, 0x9e, 0x10, 0x21, 0x32, 0x7a, 0x7b, 0x6a, 0x00, 0x2b, 0x00, 0xd1, 0x00, 0x21, 0x11, 0x43, 0x21, 0x73, 0x81, 0x78, 0x29, 0x43, 0x81, 0x70, 0xe0, 0x78, 0x01, 0x21, 0x08, 0x43, 0xe0, 0x70, 0xd2, 0xf7, 0xf2, 0xf9, 0x01, 0x20, 0x00, 0x90, 0x00, 0x98, 0xfe, 0xbd, 0xc0, 0x57, 0x01, 0x00, 0x6c, 0x43, 0x01, 0x00, 0x3c, 0x00, 0xb0, 0x14, 0x04, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x40, 0x90, 0x07, 0x00, 0xc9, 0x1d, 0x00, 0x00, 0x81, 0x1d, 0x00, 0x00, 0xa5, 0x1d, 0x00, 0x00, 0x99, 0x1d, 0x00, 0x00, 0xf1, 0x1d, 0x00, 0x00, 0x10, 0x00, 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0x03, 0x49, 0x00, 0x20, 0x88, 0x62, 0x08, 0x70, 0x48, 0x70, 0x08, 0x71, 0x08, 0x62, 0x70, 0x47, 0xac, 0x7e, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x21, 0x3c, 0x00, 0xec, 0x14, 0x04, 0x00, 0x00, 0x20, 0xcd, 0xf7, 0x69, 0xff, 0x80, 0xbd, 0xb0, 0xb5, 0x0f, 0x48, 0xc0, 0xf7, 0x18, 0xfc, 0x0e, 0x4d, 0x03, 0x20, 0x28, 0x70, 0x0d, 0x49, 0x0d, 0x48, 0x0c, 0x39, 0x48, 0x60, 0x0d, 0x48, 0x0a, 0x4c, 0x88, 0x60, 0x40, 0x21, 0x18, 0x34, 0x20, 0x1c, 0xbe, 0xf7, 0xc1, 0xff, 0xff, 0x21, 0x68, 0x68, 0x09, 0x06, 0x08, 0x43, 0x20, 0x60, 0xff, 0x21, 0x06, 0x22, 0x3c, 0x00, 0x28, 0x15, 0x04, 0x00, 0x20, 0x1d, 0xbf, 0xf7, 0x79, 0xf8, 0x01, 0x20, 0xe0, 0x60, 0xb0, 0xbd, 0xc0, 0xa8, 0x13, 0x0a, 0x20, 0x6e, 0x01, 0x00, 0xc0, 0xa8, 0x13, 0x01, 0xff, 0xff, 0xff, 0x00, 0x80, 0xb5, 0x02, 0x49, 0x01, 0x20, 0xc8, 0xf7, 0x45, 0xff, 0x80, 0xbd, 0x9d, 0x1c, 0x00, 0x00, 0x98, 0xb5, 0x0c, 0x4c, 0x00, 0x20, 0x60, 0x60, 0xe0, 0x60, 0x0b, 0x4b, 0x0b, 0x49, 0x82, 0x00, 0x3c, 0x00, 0x64, 0x15, 0x04, 0x00, 0x01, 0x30, 0x20, 0x28, 0x99, 0x50, 0xfa, 0xdb, 0x6a, 0x46, 0x09, 0x49, 0x05, 0x20, 0xbf, 0xf7, 0x2f, 0xfd, 0x00, 0x20, 0xc0, 0x43, 0x20, 0x60, 0x06, 0x49, 0x20, 0x20, 0x08, 0x60, 0x48, 0x60, 0x98, 0xbd, 0x00, 0x00, 0x00, 0x40, 0x07, 0x00, 0x30, 0x74, 0x01, 0x00, 0xa9, 0x75, 0x00, 0x00, 0xb5, 0x9f, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x05, 0x49, 0x00, 0x20, 0x3c, 0x00, 0xa0, 0x15, 0x04, 0x00, 0x08, 0x60, 0x05, 0x48, 0x81, 0x78, 0x28, 0x22, 0x91, 0x43, 0x81, 0x70, 0x81, 0x78, 0x11, 0x43, 0x81, 0x70, 0x70, 0x47, 0x78, 0x6e, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x70, 0x47, 0x00, 0x00, 0x41, 0x48, 0x10, 0xb5, 0x00, 0x68, 0x02, 0x21, 0x88, 0x43, 0x3f, 0x49, 0x08, 0x60, 0x08, 0x1c, 0x00, 0x68, 0x02, 0x21, 0x08, 0x43, 0x3c, 0x49, 0x08, 0x60, 0x3c, 0x48, 0x3c, 0x00, 0xdc, 0x15, 0x04, 0x00, 0x40, 0x68, 0x80, 0x21, 0x88, 0x43, 0x3a, 0x49, 0x48, 0x60, 0x08, 0x1c, 0x00, 0x68, 0x80, 0x21, 0x08, 0x43, 0x37, 0x49, 0x08, 0x60, 0x37, 0x48, 0x01, 0x7a, 0x01, 0x24, 0x21, 0x43, 0x01, 0x72, 0x01, 0x7a, 0x02, 0x22, 0x11, 0x43, 0x01, 0x72, 0x01, 0x7a, 0x04, 0x22, 0x91, 0x43, 0x01, 0x72, 0x01, 0x7a, 0x08, 0x22, 0x11, 0x43, 0x01, 0x72, 0x01, 0x7b, 0x21, 0x43, 0x3c, 0x00, 0x18, 0x16, 0x04, 0x00, 0x01, 0x73, 0x01, 0x7b, 0x02, 0x22, 0x11, 0x43, 0x01, 0x73, 0x01, 0x7b, 0x04, 0x22, 0x11, 0x43, 0x01, 0x73, 0x01, 0x7b, 0x08, 0x22, 0x11, 0x43, 0x01, 0x73, 0x2e, 0x21, 0x41, 0x73, 0x81, 0x7b, 0x38, 0x22, 0x91, 0x43, 0x28, 0x31, 0x81, 0x73, 0x20, 0x21, 0x41, 0x74, 0x81, 0x7b, 0xc9, 0x08, 0xc9, 0x00, 0x03, 0x31, 0x81, 0x73, 0x22, 0x21, 0xc1, 0x73, 0x20, 0x49, 0x3c, 0x00, 0x54, 0x16, 0x04, 0x00, 0x09, 0x7a, 0x41, 0x72, 0x1e, 0x49, 0x49, 0x7a, 0x01, 0x74, 0x3c, 0x22, 0x02, 0x77, 0x01, 0x1c, 0x10, 0x31, 0x4a, 0x73, 0x50, 0x23, 0x8b, 0x73, 0x5a, 0x23, 0xcb, 0x73, 0x0d, 0x23, 0x01, 0x1c, 0x20, 0x31, 0x0b, 0x70, 0x17, 0x4b, 0x43, 0x84, 0x0e, 0x23, 0x4b, 0x70, 0x00, 0x21, 0x41, 0x82, 0x30, 0x21, 0x01, 0x70, 0x05, 0x21, 0x41, 0x70, 0x04, 0x21, 0x41, 0x71, 0x3c, 0x00, 0x90, 0x16, 0x04, 0x00, 0x84, 0x71, 0xc4, 0x71, 0x0c, 0x21, 0x01, 0x71, 0xf8, 0x21, 0x41, 0x80, 0x0f, 0x49, 0xca, 0x72, 0x8a, 0x72, 0x03, 0x22, 0x0a, 0x72, 0x09, 0x22, 0x4a, 0x72, 0x08, 0x22, 0x0a, 0x73, 0x02, 0x7a, 0x40, 0x23, 0x1a, 0x43, 0x02, 0x72, 0x4c, 0x73, 0xff, 0xf7, 0xa2, 0xfc, 0x08, 0x48, 0x01, 0x78, 0x21, 0x43, 0x01, 0x70, 0x10, 0xbd, 0x00, 0x00, 0xf0, 0x00, 0x07, 0x00, 0x3c, 0x00, 0xcc, 0x16, 0x04, 0x00, 0xf4, 0x00, 0x07, 0x00, 0x0c, 0x80, 0x07, 0x00, 0x76, 0x46, 0x01, 0x00, 0x24, 0x09, 0x00, 0x00, 0x80, 0x80, 0x07, 0x00, 0xa0, 0x80, 0x07, 0x00, 0x80, 0xb5, 0x18, 0x21, 0x09, 0x48, 0xbe, 0xf7, 0xd7, 0xfe, 0x08, 0x48, 0x00, 0x21, 0x3c, 0x38, 0x41, 0x60, 0x81, 0x60, 0xc1, 0x60, 0x01, 0x61, 0x41, 0x61, 0x81, 0x61, 0x01, 0x21, 0x01, 0x62, 0xff, 0xf7, 0x5c, 0xff, 0x3c, 0x00, 0x08, 0x17, 0x04, 0x00, 0xc0, 0xf7, 0x6c, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x24, 0x7e, 0x01, 0x00, 0xb0, 0xb5, 0x21, 0x48, 0x00, 0x68, 0x40, 0x08, 0x1f, 0x49, 0x40, 0x00, 0x08, 0x60, 0x08, 0x1c, 0x00, 0x68, 0x01, 0x21, 0x08, 0x43, 0x1c, 0x49, 0x08, 0x60, 0x1c, 0x4a, 0x10, 0x79, 0x01, 0x21, 0x08, 0x43, 0x10, 0x71, 0x10, 0x79, 0x02, 0x21, 0x88, 0x43, 0x10, 0x71, 0x00, 0xf0, 0x6c, 0xf8, 0x3c, 0x00, 0x44, 0x17, 0x04, 0x00, 0x10, 0x7a, 0x01, 0x21, 0x08, 0x43, 0x10, 0x72, 0x10, 0x7a, 0xfe, 0x21, 0x88, 0x43, 0x0a, 0x30, 0x10, 0x72, 0x28, 0x20, 0x90, 0x72, 0x5a, 0x20, 0xd0, 0x72, 0x11, 0x4d, 0x14, 0x20, 0x28, 0x77, 0x2c, 0x1c, 0x10, 0x34, 0xa0, 0x73, 0x16, 0x20, 0xa8, 0x75, 0x18, 0x20, 0xe8, 0x75, 0xff, 0xf7, 0xa1, 0xfc, 0x0c, 0x48, 0x68, 0x86, 0xe0, 0x7b, 0x40, 0x06, 0x40, 0x0e, 0x3c, 0x00, 0x80, 0x17, 0x04, 0x00, 0x0e, 0x21, 0x08, 0x43, 0xe0, 0x73, 0xe0, 0x7b, 0x80, 0x21, 0x08, 0x43, 0xe0, 0x73, 0x07, 0x48, 0x41, 0x79, 0x04, 0x22, 0x11, 0x43, 0x41, 0x71, 0xb0, 0xbd, 0x00, 0x00, 0xf0, 0x00, 0x07, 0x00, 0x00, 0x80, 0x07, 0x00, 0x30, 0x80, 0x07, 0x00, 0xff, 0x01, 0x00, 0x00, 0x50, 0x00, 0x07, 0x00, 0x80, 0xb5, 0xff, 0xf7, 0xaf, 0xff, 0x00, 0x20, 0x14, 0x49, 0xc0, 0x43, 0x3c, 0x00, 0xbc, 0x17, 0x04, 0x00, 0x88, 0x60, 0xc1, 0xf7, 0x0b, 0xf9, 0x13, 0x49, 0x00, 0x20, 0x48, 0x62, 0xc8, 0x60, 0x48, 0x61, 0x08, 0x61, 0x88, 0x61, 0xc8, 0x61, 0x0f, 0x4b, 0x08, 0x62, 0x0f, 0x4a, 0x08, 0x63, 0x38, 0x33, 0x1a, 0x80, 0x01, 0x22, 0x5a, 0x71, 0x0b, 0x4a, 0x40, 0x32, 0xd0, 0x60, 0x13, 0x60, 0x08, 0x23, 0x13, 0x81, 0x50, 0x60, 0x09, 0x4a, 0x8a, 0x62, 0xff, 0x22, 0x0a, 0x70, 0x3c, 0x00, 0xf8, 0x17, 0x04, 0x00, 0x48, 0x70, 0x05, 0x48, 0x00, 0x21, 0x00, 0x22, 0x50, 0x30, 0x00, 0x23, 0x0e, 0xc0, 0xc1, 0xf7, 0xff, 0xf8, 0x80, 0xbd, 0x00, 0x30, 0x07, 0x00, 0x04, 0x6c, 0x01, 0x00, 0xbe, 0xba, 0x00, 0x00, 0x85, 0x75, 0x00, 0x00, 0x03, 0x48, 0x10, 0x21, 0x81, 0x71, 0x02, 0x21, 0xc1, 0x71, 0x30, 0x21, 0x41, 0x72, 0x70, 0x47, 0x00, 0x80, 0x07, 0x00, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0x34, 0x18, 0x04, 0x00, 0x00, 0xb5, 0xc1, 0xf7, 0xdb, 0xfb, 0x00, 0xbd, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0xcd, 0xf7, 0x87, 0xfd, 0x01, 0x49, 0x88, 0x60, 0x80, 0xbd, 0x50, 0xd9, 0x01, 0x00, 0x80, 0xb5, 0x06, 0x21, 0x05, 0x48, 0xbe, 0xf7, 0xfd, 0xfd, 0x04, 0x49, 0x00, 0x20, 0x04, 0x39, 0x08, 0x60, 0x00, 0xf0, 0x67, 0xf8, 0x00, 0xf0, 0x03, 0xf8, 0x80, 0xbd, 0xec, 0x67, 0x01, 0x00, 0x3c, 0x00, 0x70, 0x18, 0x04, 0x00, 0x10, 0xb5, 0x07, 0x4c, 0x2c, 0x21, 0x20, 0x1c, 0xbe, 0xf7, 0x10, 0xfe, 0x01, 0x20, 0x20, 0x70, 0x03, 0x49, 0x00, 0x20, 0x1c, 0x39, 0xc8, 0x60, 0x08, 0x61, 0x88, 0x61, 0x10, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x80, 0xb5, 0xcd, 0xf7, 0x5d, 0xfd, 0x09, 0x49, 0x88, 0x60, 0x09, 0x49, 0x08, 0x20, 0xd0, 0xf7, 0x73, 0xfd, 0x08, 0x49, 0x09, 0x20, 0xd0, 0xf7, 0x3c, 0x00, 0xac, 0x18, 0x04, 0x00, 0x6f, 0xfd, 0x07, 0x49, 0x11, 0x20, 0xd0, 0xf7, 0x6b, 0xfd, 0x06, 0x48, 0xc2, 0xf7, 0x74, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x21, 0x35, 0x00, 0x00, 0xa1, 0x38, 0x00, 0x00, 0x45, 0x34, 0x00, 0x00, 0xbd, 0x26, 0x01, 0x00, 0x80, 0xb5, 0x86, 0xb0, 0x0f, 0x48, 0xc4, 0xf7, 0x45, 0xf9, 0x00, 0xf0, 0x45, 0xf8, 0xff, 0xf7, 0xd7, 0xff, 0xff, 0xf7, 0x3c, 0x00, 0xe8, 0x18, 0x04, 0x00, 0xab, 0xff, 0x0c, 0x49, 0x03, 0x20, 0xd0, 0xf7, 0x4d, 0xfd, 0x0b, 0x48, 0x69, 0x46, 0x00, 0x90, 0x00, 0x20, 0x01, 0x90, 0x09, 0x48, 0x04, 0x90, 0x09, 0x48, 0x02, 0x90, 0x09, 0x48, 0x03, 0x90, 0x09, 0x48, 0x05, 0x90, 0x00, 0x20, 0xc4, 0xf7, 0xcf, 0xf8, 0x06, 0xb0, 0x80, 0xbd, 0x00, 0x00, 0xf4, 0x67, 0x01, 0x00, 0x45, 0x35, 0x00, 0x00, 0x95, 0x32, 0x00, 0x00, 0x3c, 0x00, 0x24, 0x19, 0x04, 0x00, 0xa0, 0x7d, 0x01, 0x00, 0xfd, 0x32, 0x00, 0x00, 0xcd, 0x31, 0x00, 0x00, 0x45, 0x7d, 0x01, 0x00, 0x10, 0xb5, 0xcd, 0xf7, 0xd5, 0xfc, 0x09, 0x48, 0x09, 0x4c, 0x30, 0x21, 0x60, 0x61, 0x08, 0x48, 0x74, 0x30, 0xbe, 0xf7, 0xa9, 0xfd, 0x00, 0x20, 0xa0, 0x62, 0x06, 0x49, 0x20, 0x61, 0xe1, 0x63, 0x60, 0x64, 0xa0, 0x64, 0x14, 0x21, 0x21, 0x65, 0x60, 0x62, 0x10, 0xbd, 0x3c, 0x00, 0x60, 0x19, 0x04, 0x00, 0xb9, 0x75, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x70, 0x17, 0x00, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x09, 0x20, 0x04, 0x4a, 0xd1, 0xf7, 0xe8, 0xfe, 0xcd, 0xf7, 0xec, 0xfc, 0x02, 0x49, 0x08, 0x63, 0x80, 0xbd, 0x00, 0x00, 0x39, 0x39, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x80, 0xb5, 0xac, 0x21, 0x03, 0x48, 0xbe, 0xf7, 0x83, 0xfd, 0x00, 0xf0, 0x51, 0xf8, 0x00, 0xf0, 0x3c, 0x00, 0x9c, 0x19, 0x04, 0x00, 0x49, 0xf8, 0x80, 0xbd, 0xa4, 0x6c, 0x01, 0x00, 0x08, 0xb5, 0x00, 0xf0, 0x4d, 0xf8, 0x00, 0xf0, 0x45, 0xf8, 0x00, 0x21, 0x16, 0x20, 0x18, 0x4a, 0xd1, 0xf7, 0xc8, 0xfe, 0x17, 0x4a, 0x04, 0x21, 0x10, 0x1c, 0x40, 0x30, 0x01, 0x70, 0x00, 0x21, 0x81, 0x70, 0x11, 0x21, 0xc1, 0x80, 0x14, 0x49, 0x01, 0x81, 0x10, 0x1c, 0x80, 0x30, 0xc1, 0x78, 0x08, 0x22, 0x91, 0x43, 0x3c, 0x00, 0xd8, 0x19, 0x04, 0x00, 0xc1, 0x70, 0xc1, 0x78, 0x11, 0x43, 0xc1, 0x70, 0x6a, 0x46, 0x0f, 0x49, 0x14, 0x20, 0xbf, 0xf7, 0xf5, 0xfa, 0x0e, 0x49, 0x07, 0x20, 0xd0, 0xf7, 0xcd, 0xfc, 0x0d, 0x49, 0x0f, 0x20, 0xd0, 0xf7, 0xc9, 0xfc, 0xcd, 0xf7, 0xab, 0xfc, 0x0b, 0x49, 0x08, 0x60, 0x0a, 0x48, 0x44, 0x38, 0x80, 0x68, 0x00, 0x28, 0x02, 0xd0, 0x00, 0x20, 0xc6, 0xf7, 0x6f, 0xf9, 0x08, 0xbd, 0x3c, 0x00, 0x14, 0x1a, 0x04, 0x00, 0xb5, 0x3b, 0x00, 0x00, 0x00, 0x90, 0x07, 0x00, 0xe7, 0xfd, 0x00, 0x00, 0x8d, 0x41, 0x00, 0x00, 0xcd, 0x48, 0x00, 0x00, 0xd9, 0x49, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x6f, 0xfc, 0x80, 0xbd, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x61, 0xfc, 0x80, 0xbd, 0x70, 0x47, 0x00, 0x00, 0xb0, 0xb5, 0x30, 0x21, 0x0c, 0x48, 0xbe, 0xf7, 0x3c, 0x00, 0x50, 0x1a, 0x04, 0x00, 0x25, 0xfd, 0x0b, 0x4c, 0x00, 0x25, 0x0a, 0x48, 0x84, 0x3c, 0x38, 0x22, 0x03, 0x21, 0x70, 0x38, 0x65, 0x60, 0xbe, 0xf7, 0xdd, 0xfd, 0x06, 0x48, 0x38, 0x22, 0x01, 0x21, 0x38, 0x38, 0xbe, 0xf7, 0xd7, 0xfd, 0x0e, 0x20, 0xa5, 0x60, 0x60, 0x70, 0x20, 0x70, 0x00, 0xf0, 0x1d, 0xf8, 0xb0, 0xbd, 0x94, 0x67, 0x01, 0x00, 0x04, 0x49, 0x00, 0xb5, 0x01, 0x20, 0x48, 0x60, 0x3c, 0x00, 0x8c, 0x1a, 0x04, 0x00, 0x88, 0x60, 0xc8, 0x60, 0xc3, 0xf7, 0xf8, 0xff, 0x00, 0xbd, 0x00, 0x00, 0xd4, 0x67, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x0a, 0x20, 0x02, 0x4a, 0xd1, 0xf7, 0x50, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x1d, 0x5a, 0x00, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x05, 0xf8, 0x80, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0xfd, 0xfb, 0x80, 0xbd, 0x80, 0xb5, 0x02, 0x49, 0x04, 0x20, 0xd0, 0xf7, 0x3c, 0x00, 0xc8, 0x1a, 0x04, 0x00, 0x61, 0xfc, 0x80, 0xbd, 0x65, 0x1f, 0x00, 0x00, 0x00, 0x21, 0x17, 0x48, 0xc9, 0x43, 0x80, 0xb5, 0x16, 0x4b, 0x01, 0x70, 0x18, 0x1c, 0x10, 0x22, 0x20, 0x30, 0x02, 0x71, 0x00, 0x22, 0x10, 0x33, 0x9a, 0x73, 0x42, 0x79, 0x04, 0x23, 0x1a, 0x43, 0x42, 0x71, 0x42, 0x79, 0x18, 0x23, 0x9a, 0x43, 0x08, 0x32, 0x42, 0x71, 0x08, 0x1c, 0xd7, 0xf7, 0x59, 0xf8, 0x00, 0x28, 0x3c, 0x00, 0x04, 0x1b, 0x04, 0x00, 0x03, 0xd1, 0x01, 0x21, 0x9a, 0x20, 0xbf, 0xf7, 0xcb, 0xfb, 0x50, 0x20, 0x09, 0x49, 0x50, 0x22, 0x0a, 0x60, 0xc8, 0x60, 0x88, 0x60, 0x48, 0x60, 0x08, 0x61, 0x01, 0x20, 0x48, 0x61, 0x00, 0x20, 0xd7, 0xf7, 0xd8, 0xf8, 0x04, 0x49, 0xff, 0x20, 0x08, 0x60, 0x80, 0xbd, 0xf4, 0x6b, 0x01, 0x00, 0x30, 0x00, 0x07, 0x00, 0x04, 0x02, 0x07, 0x00, 0xf4, 0x74, 0x01, 0x00, 0x3c, 0x00, 0x40, 0x1b, 0x04, 0x00, 0x80, 0xb5, 0xd7, 0xf7, 0xfb, 0xf8, 0x80, 0xbd, 0x10, 0xb5, 0xff, 0xf7, 0xab, 0xfb, 0xbf, 0xf7, 0xdd, 0xfb, 0x81, 0x48, 0xcd, 0xf7, 0x98, 0xfa, 0x00, 0x24, 0x23, 0x1c, 0x04, 0x22, 0x04, 0x21, 0x00, 0x20, 0x01, 0xf0, 0x39, 0xfa, 0x00, 0x28, 0x01, 0xd0, 0xbf, 0xf7, 0xc9, 0xfb, 0x23, 0x1c, 0x00, 0x22, 0xff, 0x21, 0x00, 0x20, 0x01, 0xf0, 0x2f, 0xfa, 0x00, 0x28, 0x3c, 0x00, 0x7c, 0x1b, 0x04, 0x00, 0x01, 0xd0, 0xbf, 0xf7, 0xbf, 0xfb, 0x23, 0x1c, 0x00, 0x22, 0xff, 0x21, 0x00, 0x20, 0x01, 0xf0, 0x25, 0xfa, 0x00, 0x28, 0x01, 0xd0, 0xbf, 0xf7, 0xb5, 0xfb, 0xc4, 0xf7, 0x27, 0xff, 0x70, 0x48, 0x84, 0x70, 0x6f, 0x49, 0x7f, 0x20, 0x88, 0x70, 0x6e, 0x49, 0x0c, 0x60, 0x03, 0x20, 0x08, 0x60, 0x6b, 0x48, 0x44, 0x70, 0x6c, 0x48, 0x04, 0x80, 0x69, 0x48, 0xc0, 0x78, 0x3c, 0x00, 0xb8, 0x1b, 0x04, 0x00, 0x08, 0x21, 0x08, 0x43, 0x67, 0x49, 0xc8, 0x70, 0x08, 0x1c, 0xc0, 0x78, 0x04, 0x21, 0x08, 0x43, 0x64, 0x49, 0xc8, 0x70, 0x01, 0xf0, 0x7e, 0xfa, 0xff, 0xf7, 0x7e, 0xff, 0xff, 0xf7, 0x2c, 0xfe, 0x01, 0xf0, 0x46, 0xfb, 0xff, 0xf7, 0x18, 0xfb, 0x01, 0xf0, 0x52, 0xfa, 0xff, 0xf7, 0x82, 0xfb, 0x5f, 0x48, 0xc1, 0x68, 0x10, 0x22, 0x91, 0x43, 0xc1, 0x60, 0x01, 0x69, 0x3c, 0x00, 0xf4, 0x1b, 0x04, 0x00, 0x5d, 0x4a, 0x11, 0x43, 0x01, 0x61, 0x01, 0x69, 0xd2, 0x0a, 0x91, 0x43, 0x01, 0x61, 0xc1, 0x68, 0x5a, 0x4a, 0x11, 0x43, 0xc1, 0x60, 0x81, 0x6a, 0x59, 0x4a, 0x11, 0x43, 0x81, 0x62, 0x00, 0xf0, 0x77, 0xf9, 0x01, 0xf0, 0x1f, 0xf8, 0x00, 0xf0, 0x93, 0xfa, 0x01, 0xf0, 0x99, 0xfb, 0x00, 0xf0, 0xf1, 0xff, 0x00, 0xf0, 0x99, 0xfc, 0x00, 0xf0, 0xdd, 0xfc, 0x00, 0xf0, 0x3c, 0x00, 0x30, 0x1c, 0x04, 0x00, 0x83, 0xfc, 0xff, 0xf7, 0xb3, 0xfc, 0x01, 0xf0, 0x31, 0xfa, 0x01, 0xf0, 0x71, 0xfa, 0xff, 0xf7, 0x87, 0xfa, 0xff, 0xf7, 0x9b, 0xfa, 0x01, 0x21, 0x01, 0x20, 0x4b, 0x4a, 0xd1, 0xf7, 0x7c, 0xfd, 0x01, 0x21, 0x02, 0x20, 0x49, 0x4a, 0xd1, 0xf7, 0x77, 0xfd, 0x02, 0x21, 0x03, 0x20, 0x48, 0x4a, 0xd1, 0xf7, 0x72, 0xfd, 0x02, 0x21, 0x04, 0x20, 0x46, 0x4a, 0xd1, 0xf7, 0x3c, 0x00, 0x6c, 0x1c, 0x04, 0x00, 0x6d, 0xfd, 0x02, 0x21, 0x05, 0x20, 0x45, 0x4a, 0xd1, 0xf7, 0x68, 0xfd, 0x02, 0x21, 0x06, 0x20, 0x43, 0x4a, 0xd1, 0xf7, 0x63, 0xfd, 0x01, 0x21, 0x07, 0x20, 0x42, 0x4a, 0xd1, 0xf7, 0x5e, 0xfd, 0x02, 0x21, 0x17, 0x20, 0x40, 0x4a, 0xd1, 0xf7, 0x59, 0xfd, 0x02, 0x21, 0x08, 0x20, 0x3f, 0x4a, 0xd1, 0xf7, 0x54, 0xfd, 0xff, 0xf7, 0xc8, 0xfd, 0x3d, 0x48, 0x04, 0x60, 0x3c, 0x00, 0xa8, 0x1c, 0x04, 0x00, 0x44, 0x60, 0xff, 0xf7, 0x17, 0xfa, 0xff, 0xf7, 0x09, 0xfa, 0xff, 0xf7, 0x4f, 0xfc, 0x00, 0xf0, 0x43, 0xf9, 0xff, 0xf7, 0x33, 0xfa, 0xff, 0xf7, 0xfb, 0xfa, 0x01, 0xf0, 0x85, 0xf8, 0x01, 0xf0, 0xeb, 0xf9, 0x01, 0xf0, 0x23, 0xfa, 0x01, 0xf0, 0x71, 0xf9, 0x00, 0xf0, 0xe3, 0xff, 0xff, 0xf7, 0x6f, 0xfa, 0x00, 0xf0, 0xaf, 0xf9, 0x00, 0xf0, 0xbd, 0xf9, 0x00, 0xf0, 0x3c, 0x00, 0xe4, 0x1c, 0x04, 0x00, 0xad, 0xfc, 0x00, 0xf0, 0x9b, 0xfe, 0xff, 0xf7, 0xcd, 0xfa, 0xff, 0xf7, 0xab, 0xfe, 0x00, 0xf0, 0xc3, 0xf9, 0xff, 0xf7, 0xab, 0xfd, 0x00, 0xf0, 0x8d, 0xff, 0x00, 0xf0, 0x21, 0xff, 0x00, 0xf0, 0x65, 0xf9, 0x00, 0xf0, 0x97, 0xf9, 0x00, 0xf0, 0xfd, 0xfe, 0x00, 0xf0, 0xe5, 0xfe, 0x00, 0xf0, 0x3f, 0xf9, 0x00, 0xf0, 0x73, 0xf9, 0xff, 0xf7, 0x37, 0xfe, 0x00, 0xf0, 0x3c, 0x00, 0x20, 0x1d, 0x04, 0x00, 0x21, 0xf9, 0x00, 0xf0, 0x73, 0xfb, 0xff, 0xf7, 0xe5, 0xfb, 0x00, 0xf0, 0xd3, 0xfb, 0xff, 0xf7, 0xa9, 0xfe, 0x00, 0xf0, 0xbb, 0xfb, 0x00, 0xf0, 0x09, 0xff, 0x00, 0xf0, 0xdb, 0xf9, 0x18, 0x48, 0xc9, 0xf7, 0x56, 0xf8, 0x17, 0x48, 0xc9, 0xf7, 0x2b, 0xf8, 0x00, 0x22, 0x01, 0x21, 0xf0, 0x20, 0xd1, 0xf7, 0x2e, 0xfd, 0x00, 0x20, 0x10, 0xbd, 0xa9, 0x69, 0x00, 0x00, 0x3c, 0x00, 0x5c, 0x1d, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0xf0, 0x00, 0x07, 0x00, 0x2c, 0x00, 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0x3c, 0x00, 0x08, 0x00, 0xc0, 0x3f, 0x74, 0x38, 0xfc, 0xdf, 0x7f, 0x38, 0x55, 0x69, 0x00, 0x00, 0xe5, 0x13, 0x00, 0x00, 0x61, 0x0c, 0x00, 0x00, 0x6d, 0x0c, 0x00, 0x00, 0x3d, 0x0c, 0x00, 0x00, 0xf1, 0x0d, 0x00, 0x00, 0xc5, 0x33, 0x00, 0x00, 0x3d, 0x0f, 0x00, 0x00, 0x3c, 0x00, 0x98, 0x1d, 0x04, 0x00, 0xad, 0xd8, 0x00, 0x00, 0x80, 0x00, 0x07, 0x00, 0x50, 0x57, 0x01, 0x00, 0x04, 0x40, 0x01, 0x00, 0x80, 0xb5, 0x01, 0xf0, 0xa9, 0xf9, 0x00, 0xf0, 0xc9, 0xf8, 0xff, 0xf7, 0xc5, 0xfe, 0x01, 0xf0, 0x03, 0xfb, 0x01, 0xf0, 0x93, 0xfa, 0xff, 0xf7, 0xcb, 0xf9, 0x2c, 0x48, 0xff, 0xf7, 0xe8, 0xf9, 0x00, 0xf0, 0xaa, 0xf8, 0x00, 0xf0, 0x58, 0xff, 0xff, 0xf7, 0x34, 0xfd, 0x3c, 0x00, 0xd4, 0x1d, 0x04, 0x00, 0xff, 0xf7, 0xf2, 0xfb, 0xff, 0xf7, 0x7a, 0xfa, 0xff, 0xf7, 0x00, 0xfa, 0x00, 0xf0, 0x34, 0xf9, 0x00, 0xf0, 0x3c, 0xf9, 0x01, 0xf0, 0xe2, 0xf8, 0xff, 0xf7, 0x7a, 0xf9, 0xff, 0xf7, 0x72, 0xf9, 0xff, 0xf7, 0x9a, 0xf9, 0x01, 0xf0, 0x66, 0xf9, 0x01, 0xf0, 0x8e, 0xf9, 0x01, 0xf0, 0xe0, 0xf8, 0x00, 0xf0, 0x06, 0xff, 0x00, 0xf0, 0xf0, 0xfb, 0x00, 0xf0, 0x46, 0xfb, 0x3c, 0x00, 0x10, 0x1e, 0x04, 0x00, 0x00, 0xf0, 0xbc, 0xff, 0x00, 0xf0, 0xe4, 0xfc, 0x00, 0xf0, 0x20, 0xfe, 0xff, 0xf7, 0x40, 0xfa, 0xff, 0xf7, 0x46, 0xfe, 0xff, 0xf7, 0x56, 0xfd, 0x00, 0xf0, 0x2c, 0xf9, 0x00, 0xf0, 0xfa, 0xfe, 0x00, 0xf0, 0x8a, 0xfe, 0x00, 0xf0, 0xd4, 0xf8, 0x00, 0xf0, 0xb4, 0xf8, 0x00, 0xf0, 0x78, 0xfe, 0x00, 0xf0, 0x4e, 0xfe, 0x00, 0xf0, 0xde, 0xf8, 0xff, 0xf7, 0xac, 0xfd, 0x3c, 0x00, 0x4c, 0x1e, 0x04, 0x00, 0x00, 0xf0, 0x8c, 0xf8, 0x00, 0xf0, 0xf8, 0xfa, 0xff, 0xf7, 0x76, 0xfb, 0xff, 0xf7, 0x20, 0xfe, 0x01, 0xf0, 0xa6, 0xfa, 0x00, 0xf0, 0x48, 0xfb, 0x00, 0xf0, 0x7c, 0xfe, 0x00, 0xf0, 0x5c, 0xf9, 0xbe, 0xf7, 0x57, 0xfd, 0x00, 0x20, 0x80, 0xbd, 0x80, 0x38, 0x01, 0x00, 0x01, 0x49, 0x00, 0x20, 0x08, 0x60, 0x70, 0x47, 0xa8, 0x7e, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x3c, 0x00, 0x88, 0x1e, 0x04, 0x00, 0x01, 0xd1, 0xbf, 0xf7, 0x39, 0xfa, 0x0f, 0x48, 0x7d, 0x21, 0xc9, 0x00, 0x84, 0x60, 0x01, 0x80, 0x0d, 0x49, 0x01, 0x61, 0x80, 0x21, 0x41, 0x80, 0x00, 0x21, 0xc1, 0x60, 0x01, 0x62, 0x0b, 0x48, 0x41, 0x80, 0x14, 0x21, 0x81, 0x80, 0x07, 0x21, 0x41, 0x81, 0x06, 0x4a, 0x46, 0x23, 0x04, 0x32, 0x05, 0x24, 0x13, 0x70, 0x54, 0x70, 0x0a, 0x21, 0x91, 0x70, 0x81, 0x76, 0x3c, 0x00, 0xc4, 0x1e, 0x04, 0x00, 0x03, 0x76, 0x04, 0x81, 0x10, 0xbd, 0x00, 0x00, 0xc8, 0x74, 0x01, 0x00, 0x00, 0x87, 0x93, 0x03, 0x30, 0x00, 0x07, 0x00, 0x09, 0x48, 0x80, 0xb5, 0x01, 0x69, 0x42, 0x69, 0x11, 0x43, 0x82, 0x69, 0xc0, 0x69, 0x11, 0x43, 0x01, 0x43, 0x00, 0x22, 0x03, 0x20, 0xc6, 0xf7, 0xbf, 0xfc, 0xcc, 0xf7, 0x1b, 0xfa, 0x00, 0x20, 0xc2, 0xf7, 0x92, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x1f, 0x04, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x05, 0x48, 0x80, 0xb5, 0x00, 0x21, 0x81, 0x60, 0x02, 0x21, 0xc1, 0x60, 0x03, 0x39, 0x41, 0x60, 0xc7, 0xf7, 0x3a, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x40, 0x20, 0x07, 0x00, 0x08, 0xb5, 0x6a, 0x46, 0x04, 0x49, 0x15, 0x20, 0xbf, 0xf7, 0x54, 0xf8, 0x01, 0x20, 0x03, 0x49, 0x40, 0x05, 0x08, 0x60, 0x48, 0x60, 0x08, 0xbd, 0xa5, 0x21, 0x01, 0x00, 0x3c, 0x00, 0x3c, 0x1f, 0x04, 0x00, 0x00, 0x10, 0x07, 0x00, 0x70, 0x47, 0x00, 0x00, 0x06, 0x48, 0x80, 0xb5, 0x80, 0x68, 0xc0, 0x01, 0x80, 0x0f, 0x05, 0xd1, 0x03, 0x22, 0xc1, 0x43, 0xc6, 0xf7, 0xba, 0xfc, 0xd6, 0xf7, 0x00, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x10, 0x00, 0x07, 0x00, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x2a, 0x20, 0x06, 0x4a, 0xd1, 0xf7, 0xea, 0xfb, 0x00, 0x22, 0x07, 0x20, 0x3c, 0x00, 0x78, 0x1f, 0x04, 0x00, 0x04, 0x49, 0xbe, 0xf7, 0xed, 0xfe, 0x04, 0x48, 0xc7, 0xf7, 0x58, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x8d, 0x89, 0x00, 0x00, 0xd5, 0x9b, 0x00, 0x00, 0x10, 0x46, 0x01, 0x00, 0x02, 0x48, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x0e, 0xc0, 0x70, 0x47, 0x80, 0x6e, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x2c, 0x20, 0x06, 0x4a, 0xd1, 0xf7, 0xcc, 0xfb, 0x00, 0x22, 0x00, 0x20, 0x3c, 0x00, 0xb4, 0x1f, 0x04, 0x00, 0x04, 0x49, 0xbe, 0xf7, 0xcf, 0xfe, 0x04, 0x49, 0x02, 0x20, 0xc8, 0xf7, 0x0b, 0xfa, 0x80, 0xbd, 0x05, 0x8a, 0x00, 0x00, 0xe9, 0x9b, 0x00, 0x00, 0xb1, 0x8b, 0x00, 0x00, 0x02, 0x48, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x0e, 0xc0, 0x70, 0x47, 0x10, 0x75, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x2b, 0x20, 0x04, 0x4a, 0xd1, 0xf7, 0xae, 0xfb, 0x00, 0x22, 0x02, 0x20, 0x3c, 0x00, 0xf0, 0x1f, 0x04, 0x00, 0x02, 0x49, 0xbe, 0xf7, 0xb1, 0xfe, 0x80, 0xbd, 0x2d, 0x8a, 0x00, 0x00, 0x8d, 0x8c, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x2d, 0x20, 0x07, 0x4a, 0xd1, 0xf7, 0x9c, 0xfb, 0x00, 0x22, 0x01, 0x20, 0x05, 0x49, 0xbe, 0xf7, 0x9f, 0xfe, 0x05, 0x48, 0xcb, 0xf7, 0x56, 0xfa, 0x04, 0x48, 0xcc, 0xf7, 0xf7, 0xf8, 0x80, 0xbd, 0xad, 0x8a, 0x00, 0x00, 0x3c, 0x00, 0x2c, 0x20, 0x04, 0x00, 0x21, 0xe2, 0x00, 0x00, 0xf9, 0xdf, 0x00, 0x00, 0x20, 0x44, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x02, 0x49, 0x00, 0x20, 0x08, 0x60, 0x01, 0x20, 0x48, 0x60, 0x70, 0x47, 0xac, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x49, 0x0d, 0x20, 0xd0, 0xf7, 0x9b, 0xf9, 0x80, 0xbd, 0x61, 0x98, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0xcd, 0xf7, 0x77, 0xf9, 0x03, 0x49, 0x3c, 0x00, 0x68, 0x20, 0x04, 0x00, 0x08, 0x60, 0x01, 0x1c, 0x02, 0x48, 0xcd, 0xf7, 0x97, 0xf9, 0x80, 0xbd, 0xa8, 0x79, 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x29, 0xf8, 0x80, 0xbd, 0x80, 0xb5, 0x86, 0xb0, 0x0c, 0x48, 0xc3, 0xf7, 0x6d, 0xfd, 0xd6, 0xf7, 0xd3, 0xfb, 0x0b, 0x48, 0x0d, 0x49, 0x00, 0x90, 0x0a, 0x48, 0x04, 0x91, 0x01, 0x90, 0x0a, 0x48, 0x69, 0x46, 0x02, 0x90, 0x3c, 0x00, 0xa4, 0x20, 0x04, 0x00, 0x00, 0x20, 0x03, 0x90, 0x05, 0x90, 0x01, 0x20, 0xc3, 0xf7, 0x00, 0xfd, 0x07, 0x49, 0x03, 0x20, 0xd0, 0xf7, 0x6a, 0xf9, 0x06, 0xb0, 0x80, 0xbd, 0x20, 0xf7, 0x01, 0x00, 0x11, 0x87, 0x01, 0x00, 0x95, 0x87, 0x01, 0x00, 0x55, 0x87, 0x01, 0x00, 0x98, 0xd9, 0x01, 0x00, 0x6d, 0x87, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x20, 0xd6, 0xf7, 0x90, 0xfc, 0x03, 0x49, 0x00, 0x20, 0x3c, 0x00, 0xe0, 0x20, 0x04, 0x00, 0x08, 0x60, 0x48, 0x60, 0x02, 0x48, 0x14, 0x39, 0x48, 0x60, 0x80, 0xbd, 0x90, 0xd9, 0x01, 0x00, 0x3d, 0x82, 0x01, 0x00, 0x70, 0xb5, 0x00, 0x26, 0x09, 0x4c, 0x09, 0x4d, 0x26, 0x60, 0x66, 0x60, 0x44, 0x21, 0x50, 0x35, 0x28, 0x1c, 0xa6, 0x61, 0xbe, 0xf7, 0xc8, 0xf9, 0x14, 0x20, 0xe0, 0x60, 0xe8, 0x63, 0x28, 0x20, 0xe8, 0x61, 0xa0, 0x60, 0x28, 0x64, 0x2e, 0x70, 0x3c, 0x00, 0x1c, 0x21, 0x04, 0x00, 0x70, 0xbd, 0x00, 0x00, 0xa4, 0x6e, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x18, 0x20, 0x04, 0x4a, 0xd1, 0xf7, 0x0c, 0xfb, 0x03, 0x49, 0x08, 0x20, 0xd0, 0xf7, 0x2a, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x15, 0x9c, 0x00, 0x00, 0x69, 0x9c, 0x00, 0x00, 0xfe, 0xb5, 0x26, 0x4d, 0x28, 0x78, 0xc0, 0x07, 0x0c, 0xd4, 0x25, 0x49, 0x00, 0x20, 0x08, 0x70, 0x28, 0x70, 0x24, 0x48, 0x3c, 0x00, 0x58, 0x21, 0x04, 0x00, 0x81, 0x78, 0x49, 0x08, 0x49, 0x00, 0x81, 0x70, 0x81, 0x78, 0x01, 0x22, 0x11, 0x43, 0x81, 0x70, 0x00, 0x24, 0xff, 0x26, 0x1f, 0x4f, 0x01, 0x36, 0x21, 0x1c, 0x01, 0xa8, 0xc6, 0xf7, 0x32, 0xf8, 0x00, 0xab, 0x18, 0x79, 0x01, 0x28, 0x1f, 0xd0, 0x02, 0x28, 0x19, 0xd0, 0x03, 0x28, 0x1e, 0xd1, 0xb8, 0x68, 0x00, 0x21, 0xb0, 0x43, 0xb8, 0x60, 0x78, 0x68, 0x30, 0x43, 0x3c, 0x00, 0x94, 0x21, 0x04, 0x00, 0x78, 0x60, 0x3a, 0x68, 0x32, 0x40, 0xa0, 0x20, 0x05, 0xe0, 0x3b, 0x68, 0x33, 0x40, 0x93, 0x42, 0x01, 0xd0, 0x01, 0x21, 0x01, 0xe0, 0x01, 0x38, 0xf7, 0xd2, 0x78, 0x68, 0xb0, 0x43, 0x78, 0x60, 0x00, 0x29, 0x03, 0xd0, 0x01, 0xa8, 0x00, 0xf0, 0x27, 0xff, 0x02, 0xe0, 0x01, 0xa8, 0x00, 0xf0, 0x45, 0xff, 0x01, 0x34, 0x24, 0x06, 0x24, 0x16, 0x06, 0x2c, 0xcf, 0xdb, 0x3c, 0x00, 0xd0, 0x21, 0x04, 0x00, 0x04, 0x49, 0x02, 0x22, 0x08, 0x78, 0x10, 0x43, 0x08, 0x70, 0x28, 0x70, 0xfe, 0xbd, 0x00, 0x00, 0x04, 0x00, 0x07, 0x00, 0xe0, 0x60, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x10, 0x00, 0x07, 0x00, 0xb0, 0xb5, 0x00, 0x20, 0x15, 0x23, 0x14, 0x49, 0x01, 0x25, 0x42, 0x00, 0x8d, 0x54, 0x52, 0x18, 0x01, 0x30, 0x0e, 0x28, 0x53, 0x70, 0xf8, 0xd3, 0x0f, 0x48, 0x1c, 0x22, 0x3c, 0x00, 0x0c, 0x22, 0x04, 0x00, 0x1c, 0x38, 0xbe, 0xf7, 0x73, 0xf9, 0x0d, 0x48, 0x0e, 0x21, 0x2a, 0x38, 0xbe, 0xf7, 0x1c, 0xf9, 0x0b, 0x49, 0x00, 0x20, 0x08, 0x60, 0x0b, 0x4c, 0x2a, 0x21, 0x20, 0x1c, 0xbe, 0xf7, 0x14, 0xf9, 0x25, 0x70, 0x0e, 0x20, 0x60, 0x70, 0x17, 0x20, 0xa0, 0x70, 0x07, 0x48, 0x53, 0x21, 0x01, 0x70, 0x45, 0x21, 0x41, 0x70, 0x20, 0x21, 0x81, 0x70, 0xb0, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x48, 0x22, 0x04, 0x00, 0xe6, 0x78, 0x01, 0x00, 0xe4, 0x62, 0x01, 0x00, 0xeb, 0x62, 0x01, 0x00, 0xe8, 0x62, 0x01, 0x00, 0x0c, 0x49, 0x0d, 0x48, 0x00, 0x22, 0x41, 0x60, 0x0c, 0x49, 0x81, 0x60, 0x0c, 0x49, 0xc1, 0x60, 0x0c, 0x49, 0x01, 0x61, 0x0c, 0x49, 0x41, 0x61, 0x0c, 0x49, 0x82, 0x61, 0xc1, 0x61, 0x0c, 0x49, 0x01, 0x62, 0x0c, 0x49, 0x41, 0x62, 0x0c, 0x49, 0x81, 0x62, 0x0c, 0x49, 0x3c, 0x00, 0x84, 0x22, 0x04, 0x00, 0xc1, 0x62, 0xc2, 0x63, 0x70, 0x47, 0x00, 0x00, 0xc9, 0x75, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0xc1, 0x75, 0x00, 0x00, 0x81, 0x75, 0x00, 0x00, 0x99, 0x75, 0x00, 0x00, 0xcd, 0x75, 0x00, 0x00, 0x89, 0x75, 0x00, 0x00, 0x91, 0x75, 0x00, 0x00, 0xb5, 0x75, 0x00, 0x00, 0x8d, 0x75, 0x00, 0x00, 0xc5, 0x75, 0x00, 0x00, 0xb0, 0xb5, 0x0e, 0x48, 0x0e, 0x49, 0x08, 0x60, 0x3c, 0x00, 0xc0, 0x22, 0x04, 0x00, 0x08, 0x31, 0xc0, 0xf7, 0x43, 0xfe, 0x0c, 0x49, 0x00, 0x25, 0x48, 0x60, 0x0b, 0x48, 0x0a, 0x4c, 0x05, 0x60, 0x0b, 0x48, 0x80, 0x3c, 0x05, 0x60, 0x10, 0x20, 0x20, 0x71, 0xe0, 0x70, 0xa0, 0x71, 0x60, 0x71, 0x27, 0x20, 0xc0, 0x43, 0xc3, 0xf7, 0xf7, 0xfb, 0x28, 0x20, 0xc3, 0xf7, 0xfc, 0xfb, 0x25, 0x72, 0xb0, 0xbd, 0xff, 0x3f, 0x00, 0x00, 0x2c, 0x7d, 0x01, 0x00, 0x3c, 0x00, 0xfc, 0x22, 0x04, 0x00, 0x1c, 0x67, 0x01, 0x00, 0x20, 0x67, 0x01, 0x00, 0x80, 0xb5, 0x2c, 0x21, 0x01, 0x48, 0xbe, 0xf7, 0xc7, 0xf8, 0x80, 0xbd, 0x3c, 0x7e, 0x01, 0x00, 0x80, 0xb5, 0x38, 0x21, 0x01, 0x48, 0xbe, 0xf7, 0xbf, 0xf8, 0x80, 0xbd, 0x68, 0x7e, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x0e, 0x20, 0x02, 0x4a, 0xd1, 0xf7, 0x0c, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x21, 0xe0, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x23, 0x04, 0x00, 0x70, 0x47, 0x00, 0x00, 0xf0, 0xb5, 0x85, 0xb0, 0x00, 0x27, 0x00, 0xab, 0x2f, 0x4e, 0x1f, 0x81, 0x00, 0x25, 0x00, 0x24, 0x28, 0x1c, 0xd6, 0xf7, 0xa1, 0xfb, 0x02, 0x2d, 0x03, 0xd1, 0xd6, 0xf7, 0xf5, 0xfa, 0x00, 0x28, 0x0c, 0xd0, 0x01, 0x24, 0x01, 0x2d, 0x03, 0xd1, 0x07, 0x20, 0x00, 0xab, 0x18, 0x71, 0x01, 0xe0, 0x00, 0xab, 0x1f, 0x71, 0x00, 0xab, 0x18, 0x79, 0x3c, 0x00, 0x74, 0x23, 0x04, 0x00, 0xd6, 0xf7, 0x08, 0xfc, 0x00, 0x2c, 0x39, 0xd0, 0x08, 0x21, 0x03, 0xa8, 0xd6, 0xf7, 0xf2, 0xfa, 0x00, 0xab, 0x18, 0x7b, 0xfe, 0x28, 0x31, 0xd1, 0x58, 0x7b, 0x01, 0x28, 0x2a, 0xd1, 0x02, 0x21, 0x02, 0xa8, 0xd6, 0xf7, 0xe7, 0xfa, 0x00, 0xab, 0x18, 0x89, 0x00, 0x28, 0x26, 0xd0, 0x18, 0x89, 0x18, 0x49, 0x88, 0x42, 0x22, 0xd0, 0x19, 0x89, 0x00, 0x20, 0xbf, 0xf7, 0x3c, 0x00, 0xb0, 0x23, 0x04, 0x00, 0x13, 0xf9, 0x04, 0x1c, 0x00, 0x69, 0x00, 0xab, 0x19, 0x89, 0xd6, 0xf7, 0xd5, 0xfa, 0x20, 0x68, 0x00, 0xab, 0x1a, 0x89, 0x01, 0x1c, 0x08, 0x31, 0x08, 0x3a, 0xcb, 0xf7, 0xa1, 0xf9, 0x00, 0x28, 0x06, 0xd0, 0x02, 0x28, 0x04, 0xd0, 0x02, 0x21, 0x94, 0x20, 0x37, 0x60, 0xbe, 0xf7, 0x62, 0xff, 0x20, 0x1c, 0xbf, 0xf7, 0xc7, 0xf8, 0xd4, 0xe7, 0x01, 0x21, 0x94, 0x20, 0x3c, 0x00, 0xec, 0x23, 0x04, 0x00, 0xbe, 0xf7, 0x5a, 0xff, 0xd5, 0xf7, 0x26, 0xff, 0x01, 0x35, 0x2d, 0x06, 0x2d, 0x0e, 0x04, 0x2d, 0xa5, 0xd3, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0x58, 0x57, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x0a, 0x48, 0x00, 0x21, 0x02, 0x1c, 0x18, 0x32, 0x80, 0xb5, 0x09, 0x4b, 0x02, 0xe0, 0x01, 0x60, 0x83, 0x80, 0x08, 0x30, 0x82, 0x42, 0xfa, 0xd1, 0x04, 0x48, 0x6c, 0x21, 0x3c, 0x00, 0x28, 0x24, 0x04, 0x00, 0x6c, 0x38, 0xbe, 0xf7, 0x37, 0xf8, 0x04, 0x49, 0x02, 0x20, 0xc7, 0xf7, 0xd1, 0xff, 0x80, 0xbd, 0x7c, 0x79, 0x01, 0x00, 0xfc, 0x05, 0x00, 0x00, 0x9d, 0x75, 0x00, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x26, 0x20, 0x0d, 0x4a, 0xd1, 0xf7, 0x7c, 0xf9, 0x0c, 0x48, 0xc8, 0xf7, 0x73, 0xff, 0x0c, 0x48, 0xc8, 0xf7, 0x76, 0xff, 0x0b, 0x49, 0x10, 0x20, 0xcf, 0xf7, 0x94, 0xff, 0x3c, 0x00, 0x64, 0x24, 0x04, 0x00, 0x0a, 0x49, 0x0c, 0x20, 0xcf, 0xf7, 0x90, 0xff, 0x09, 0x49, 0x00, 0x20, 0xc7, 0xf7, 0xb2, 0xff, 0xcc, 0xf7, 0x6e, 0xff, 0x07, 0x49, 0x08, 0x60, 0x80, 0xbd, 0x00, 0x00, 0x9d, 0xa6, 0x00, 0x00, 0xa9, 0xa4, 0x00, 0x00, 0x81, 0xa4, 0x00, 0x00, 0x31, 0xa7, 0x00, 0x00, 0xb9, 0x6d, 0x00, 0x00, 0xbd, 0xa6, 0x00, 0x00, 0x0c, 0x79, 0x01, 0x00, 0x02, 0x49, 0x08, 0x78, 0x3c, 0x00, 0xa0, 0x24, 0x04, 0x00, 0x40, 0x08, 0x40, 0x00, 0x08, 0x70, 0x70, 0x47, 0x58, 0x00, 0x07, 0x00, 0x00, 0x21, 0x08, 0x48, 0x80, 0xb5, 0x41, 0x61, 0x81, 0x61, 0x01, 0x70, 0x41, 0x70, 0x41, 0x60, 0x81, 0x60, 0x14, 0x22, 0xc2, 0x60, 0x01, 0x61, 0x42, 0x62, 0xc1, 0x61, 0xff, 0xf7, 0x04, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x1c, 0x75, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x1d, 0x20, 0x04, 0x4a, 0x3c, 0x00, 0xdc, 0x24, 0x04, 0x00, 0xd1, 0xf7, 0x34, 0xf9, 0x03, 0x49, 0x08, 0x20, 0xcf, 0xf7, 0x52, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x11, 0xe3, 0x00, 0x00, 0x09, 0xe4, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x21, 0x25, 0x20, 0x0a, 0x4a, 0xd1, 0xf7, 0x24, 0xf9, 0xcc, 0xf7, 0x28, 0xff, 0x08, 0x49, 0x08, 0x62, 0x08, 0x49, 0x01, 0x20, 0xcf, 0xf7, 0x3e, 0xff, 0x07, 0x49, 0x02, 0x20, 0xcf, 0xf7, 0x3a, 0xff, 0x3c, 0x00, 0x18, 0x25, 0x04, 0x00, 0xfe, 0xf7, 0xe6, 0xff, 0x05, 0x48, 0xc1, 0xf7, 0xe1, 0xf9, 0x80, 0xbd, 0x29, 0xa9, 0x00, 0x00, 0x1c, 0x75, 0x01, 0x00, 0xa1, 0xaa, 0x00, 0x00, 0x2d, 0x19, 0x00, 0x00, 0x45, 0xa8, 0x00, 0x00, 0x10, 0xb5, 0x06, 0x4c, 0x0c, 0x22, 0x22, 0x70, 0xa0, 0x18, 0x05, 0x49, 0xbd, 0xf7, 0xd8, 0xff, 0x00, 0x20, 0xc8, 0xf7, 0x85, 0xfb, 0x01, 0x20, 0xa0, 0x60, 0x10, 0xbd, 0x3c, 0x00, 0x54, 0x25, 0x04, 0x00, 0xa4, 0x69, 0x01, 0x00, 0x90, 0x57, 0x01, 0x00, 0xb0, 0xb5, 0x1f, 0x4c, 0x00, 0x25, 0x65, 0x80, 0x01, 0x20, 0x20, 0x70, 0x0a, 0x20, 0xa0, 0x80, 0x90, 0x20, 0xe0, 0x80, 0x30, 0x20, 0x20, 0x81, 0x90, 0x20, 0x60, 0x81, 0x30, 0x20, 0xa0, 0x81, 0x17, 0x48, 0x04, 0x22, 0x07, 0x21, 0x12, 0x30, 0xbe, 0xf7, 0x4c, 0xf8, 0x14, 0x48, 0x04, 0x22, 0x05, 0x21, 0x16, 0x30, 0x3c, 0x00, 0x90, 0x25, 0x04, 0x00, 0xbe, 0xf7, 0x46, 0xf8, 0x12, 0x48, 0x11, 0x4a, 0xe0, 0x81, 0x20, 0x82, 0x70, 0x32, 0x15, 0x70, 0x55, 0x70, 0x00, 0x20, 0x3c, 0x23, 0x41, 0x01, 0x43, 0x43, 0x89, 0x18, 0xf4, 0x31, 0x9b, 0x18, 0x01, 0x30, 0x04, 0x28, 0x59, 0x60, 0xf5, 0xdb, 0x08, 0x48, 0x06, 0x22, 0x1a, 0x30, 0x09, 0x49, 0xbd, 0xf7, 0x9a, 0xff, 0x07, 0x48, 0x05, 0x4c, 0x0c, 0x30, 0x0f, 0xc8, 0x3c, 0x00, 0xcc, 0x25, 0x04, 0x00, 0x20, 0x34, 0x0f, 0xc4, 0x20, 0x21, 0x20, 0x1c, 0xbd, 0xf7, 0x62, 0xff, 0xb0, 0xbd, 0x00, 0x00, 0xf8, 0x60, 0x01, 0x00, 0x2c, 0x09, 0x00, 0x00, 0x58, 0x40, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x07, 0x48, 0x10, 0xb5, 0x00, 0x68, 0x00, 0x28, 0x08, 0xd0, 0x06, 0x48, 0xbe, 0xf7, 0x9c, 0xfe, 0x04, 0x1c, 0xff, 0xf7, 0x9d, 0xfe, 0x20, 0x1c, 0xbe, 0xf7, 0x96, 0xfe, 0x3c, 0x00, 0x08, 0x26, 0x04, 0x00, 0x10, 0xbd, 0x00, 0x00, 0x58, 0x57, 0x01, 0x00, 0xb5, 0xad, 0x00, 0x00, 0x04, 0x49, 0x80, 0xb5, 0x00, 0x20, 0x88, 0x70, 0x02, 0x21, 0x20, 0x20, 0x02, 0x4a, 0xd1, 0xf7, 0x91, 0xf8, 0x80, 0xbd, 0xb4, 0x79, 0x01, 0x00, 0x25, 0xb5, 0x00, 0x00, 0x80, 0xb5, 0xcc, 0xf7, 0x8f, 0xfe, 0x01, 0x49, 0x48, 0x61, 0x80, 0xbd, 0xb4, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x18, 0x21, 0x3c, 0x00, 0x44, 0x26, 0x04, 0x00, 0x14, 0x48, 0xbd, 0xf7, 0x29, 0xff, 0x14, 0x48, 0x01, 0x21, 0x01, 0x70, 0x00, 0x21, 0xc1, 0x60, 0x41, 0x70, 0x01, 0x61, 0x00, 0xf0, 0x02, 0xf9, 0x00, 0xf0, 0xaa, 0xf8, 0x00, 0xf0, 0x1e, 0xf8, 0x00, 0xf0, 0xba, 0xf9, 0x00, 0xf0, 0xcc, 0xf9, 0x00, 0xf0, 0x20, 0xf9, 0x00, 0xf0, 0x64, 0xf9, 0x00, 0xf0, 0xce, 0xf9, 0x00, 0xf0, 0xfc, 0xf8, 0x00, 0xf0, 0x82, 0xf9, 0x3c, 0x00, 0x80, 0x26, 0x04, 0x00, 0x00, 0xf0, 0x28, 0xf8, 0x00, 0xf0, 0x6e, 0xf8, 0x00, 0xf0, 0x4a, 0xf8, 0xff, 0xf7, 0xc2, 0xff, 0x00, 0xf0, 0x72, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x40, 0x7c, 0x01, 0x00, 0x18, 0x63, 0x01, 0x00, 0xb0, 0xb5, 0x08, 0x4c, 0x00, 0x25, 0x08, 0x48, 0x25, 0x77, 0x20, 0x60, 0xce, 0xf7, 0xf0, 0xfd, 0x00, 0x20, 0xe5, 0x62, 0xd0, 0xf7, 0xd0, 0xfa, 0x21, 0x1f, 0x08, 0x80, 0x3c, 0x00, 0xbc, 0x26, 0x04, 0x00, 0xd0, 0xf7, 0x6c, 0xfb, 0xb0, 0xbd, 0x00, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x95, 0x75, 0x00, 0x00, 0x80, 0xb5, 0xcc, 0xf7, 0xc1, 0xfc, 0x80, 0xbd, 0x05, 0x49, 0x80, 0xb5, 0x00, 0x20, 0x08, 0x70, 0x48, 0x70, 0x03, 0x48, 0x04, 0x49, 0x03, 0x4a, 0x08, 0x30, 0xcc, 0xf7, 0x27, 0xfe, 0x80, 0xbd, 0x2c, 0x63, 0x01, 0x00, 0xed, 0xbc, 0x00, 0x00, 0x4d, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x26, 0x04, 0x00, 0x80, 0xb5, 0xcc, 0xf7, 0x2b, 0xfe, 0x05, 0x49, 0x48, 0x60, 0x01, 0x1c, 0x04, 0x48, 0xcc, 0xf7, 0x4b, 0xfe, 0x04, 0x49, 0x03, 0x20, 0xcf, 0xf7, 0x3d, 0xfe, 0x80, 0xbd, 0x2c, 0x63, 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, 0xc1, 0xbc, 0x00, 0x00, 0x04, 0x48, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x0e, 0xc0, 0x08, 0xc0, 0x02, 0x49, 0x10, 0x38, 0x01, 0x60, 0x70, 0x47, 0x3c, 0x00, 0x34, 0x27, 0x04, 0x00, 0x04, 0x7a, 0x01, 0x00, 0x1c, 0xe6, 0x01, 0x00, 0x80, 0xb5, 0xcc, 0xf7, 0x09, 0xfe, 0x05, 0x49, 0x05, 0x4a, 0x48, 0x60, 0x02, 0x21, 0x24, 0x20, 0xd0, 0xf7, 0xfc, 0xff, 0x03, 0x48, 0xc9, 0xf7, 0x6b, 0xfd, 0x80, 0xbd, 0x04, 0x7a, 0x01, 0x00, 0x69, 0xbe, 0x00, 0x00, 0x71, 0xeb, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x4c, 0x14, 0x21, 0x20, 0x1c, 0xbd, 0xf7, 0x96, 0xfe, 0x3c, 0x00, 0x70, 0x27, 0x04, 0x00, 0x02, 0x48, 0x20, 0x60, 0x10, 0xbd, 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, 0xec, 0xe5, 0x01, 0x00, 0x80, 0xb5, 0xcc, 0xf7, 0xe7, 0xfd, 0x07, 0x49, 0x07, 0x4a, 0x48, 0x60, 0x02, 0x21, 0x1f, 0x20, 0xd0, 0xf7, 0xda, 0xff, 0x05, 0x49, 0x01, 0x20, 0x08, 0x60, 0x05, 0x49, 0x0c, 0x20, 0xcf, 0xf7, 0xf5, 0xfd, 0x80, 0xbd, 0x14, 0x7a, 0x01, 0x00, 0xd5, 0xbf, 0x00, 0x00, 0x3c, 0x00, 0xac, 0x27, 0x04, 0x00, 0x80, 0x5a, 0x01, 0x00, 0x85, 0xff, 0x00, 0x00, 0x80, 0xb5, 0xff, 0xf7, 0x4f, 0xfd, 0x01, 0x21, 0x21, 0x20, 0x02, 0x4a, 0xd0, 0xf7, 0xc2, 0xff, 0x80, 0xbd, 0x00, 0x00, 0xc9, 0xc1, 0x00, 0x00, 0x80, 0xb5, 0xcc, 0xf7, 0xc1, 0xfd, 0x02, 0x49, 0x08, 0x63, 0xc9, 0xf7, 0x57, 0xfd, 0x80, 0xbd, 0x28, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0xcc, 0xf7, 0xb7, 0xfd, 0x16, 0x4c, 0x3c, 0x00, 0xe8, 0x27, 0x04, 0x00, 0x20, 0x61, 0xcc, 0xf7, 0xb3, 0xfd, 0x60, 0x61, 0x14, 0x48, 0x15, 0x49, 0x08, 0x60, 0x16, 0x49, 0x14, 0x48, 0x08, 0x60, 0xcc, 0xf7, 0xaa, 0xfd, 0x14, 0x49, 0x08, 0x60, 0x00, 0xf0, 0x34, 0xf8, 0xff, 0xf7, 0xe0, 0xff, 0xff, 0xf7, 0x5e, 0xff, 0x00, 0xf0, 0x04, 0xf9, 0x00, 0xf0, 0x8e, 0xf8, 0xff, 0xf7, 0x6e, 0xff, 0xff, 0xf7, 0xb0, 0xff, 0xff, 0xf7, 0x8c, 0xff, 0x3c, 0x00, 0x24, 0x28, 0x04, 0x00, 0xff, 0xf7, 0x04, 0xff, 0x00, 0xf0, 0xaa, 0xf8, 0x0a, 0x48, 0xbf, 0xf7, 0xbd, 0xff, 0xc9, 0xf7, 0xbb, 0xfd, 0x09, 0x49, 0x00, 0x20, 0xcf, 0xf7, 0xa7, 0xfd, 0x10, 0xbd, 0x40, 0x7c, 0x01, 0x00, 0x7d, 0xb7, 0x00, 0x00, 0x18, 0x7e, 0x01, 0x00, 0xbd, 0xb8, 0x00, 0x00, 0x1c, 0x7e, 0x01, 0x00, 0x20, 0x7e, 0x01, 0x00, 0xb9, 0xba, 0x00, 0x00, 0x81, 0x24, 0x01, 0x00, 0x3c, 0x00, 0x60, 0x28, 0x04, 0x00, 0x80, 0xb5, 0x38, 0x21, 0x01, 0x48, 0xbd, 0xf7, 0x19, 0xfe, 0x80, 0xbd, 0x90, 0x5c, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0xb0, 0xb5, 0x0c, 0x4c, 0x0b, 0x4d, 0x00, 0x20, 0x0c, 0x34, 0x60, 0x60, 0x25, 0x60, 0xe0, 0x60, 0x0a, 0x20, 0x20, 0x81, 0x28, 0x1c, 0xc8, 0xf7, 0x3f, 0xfd, 0x28, 0x1c, 0xc8, 0xf7, 0x3a, 0xfd, 0x08, 0x3d, 0x68, 0x60, 0x04, 0x48, 0xc9, 0xf7, 0x3c, 0x00, 0x9c, 0x28, 0x04, 0x00, 0x1b, 0xfd, 0x20, 0x1c, 0xc0, 0xf7, 0x6e, 0xfa, 0x28, 0x80, 0xb0, 0xbd, 0xb8, 0x7a, 0x01, 0x00, 0xd5, 0x33, 0x01, 0x00, 0xf8, 0xb5, 0x1f, 0x4e, 0x1d, 0x4c, 0x00, 0x20, 0x0c, 0x21, 0x41, 0x43, 0x82, 0x00, 0x01, 0x30, 0x09, 0x19, 0x08, 0x31, 0x00, 0x06, 0x00, 0x0e, 0x04, 0x28, 0xb1, 0x50, 0xf4, 0xd3, 0x18, 0x48, 0x0c, 0x38, 0x30, 0x61, 0xce, 0xf7, 0xf4, 0xf9, 0x3c, 0x00, 0xd8, 0x28, 0x04, 0x00, 0x14, 0x4c, 0xa0, 0x78, 0x00, 0x09, 0x00, 0x01, 0xa0, 0x70, 0x00, 0x27, 0xe7, 0x70, 0x67, 0x70, 0x00, 0x24, 0xa5, 0x00, 0x70, 0x59, 0x07, 0x70, 0x20, 0x1c, 0xbe, 0xf7, 0x53, 0xf9, 0x71, 0x59, 0x08, 0x71, 0x00, 0x21, 0x20, 0x1c, 0xce, 0xf7, 0x7d, 0xf9, 0x01, 0x34, 0x24, 0x06, 0x24, 0x0e, 0x04, 0x2c, 0xee, 0xd3, 0x07, 0x4c, 0x20, 0x78, 0x00, 0x09, 0x00, 0x01, 0x3c, 0x00, 0x14, 0x29, 0x04, 0x00, 0x0a, 0x30, 0x20, 0x70, 0x20, 0x78, 0xf0, 0x21, 0x88, 0x43, 0x30, 0x30, 0x20, 0x70, 0xa0, 0x78, 0x0f, 0x21, 0x08, 0x43, 0xa0, 0x70, 0xf8, 0xbd, 0x00, 0x50, 0x07, 0x00, 0x10, 0x7b, 0x01, 0x00, 0x80, 0xb5, 0xcc, 0xf7, 0x9f, 0xfb, 0x80, 0xbd, 0xb0, 0xb5, 0x0c, 0x4c, 0x0b, 0x4d, 0x00, 0x20, 0x0c, 0x34, 0x60, 0x60, 0x25, 0x60, 0xe0, 0x60, 0x0a, 0x20, 0x20, 0x81, 0x3c, 0x00, 0x50, 0x29, 0x04, 0x00, 0x28, 0x1c, 0xc8, 0xf7, 0xe1, 0xfc, 0x28, 0x1c, 0xc8, 0xf7, 0xd4, 0xfc, 0x08, 0x3d, 0x68, 0x60, 0x20, 0x1c, 0xc0, 0xf7, 0x0d, 0xfa, 0x28, 0x80, 0x02, 0x48, 0xc9, 0xf7, 0x9b, 0xfc, 0xb0, 0xbd, 0x2c, 0x7b, 0x01, 0x00, 0x49, 0x00, 0x01, 0x00, 0x80, 0xb5, 0xca, 0xf7, 0x2f, 0xf8, 0x80, 0xbd, 0x70, 0x47, 0x00, 0x00, 0xb0, 0xb5, 0x12, 0x4d, 0x3c, 0x21, 0x28, 0x1c, 0x3c, 0x00, 0x8c, 0x29, 0x04, 0x00, 0xbd, 0xf7, 0x86, 0xfd, 0x0f, 0x48, 0x28, 0x21, 0x3c, 0x30, 0xbd, 0xf7, 0x81, 0xfd, 0x0d, 0x48, 0x00, 0x21, 0x14, 0x38, 0x01, 0x61, 0xc1, 0x60, 0xff, 0x21, 0x01, 0x70, 0x41, 0x70, 0x0a, 0x49, 0x0a, 0x4a, 0x41, 0x60, 0x01, 0x21, 0x0c, 0x20, 0xd0, 0xf7, 0xc8, 0xfe, 0x2c, 0x1c, 0x30, 0x34, 0x0c, 0x3d, 0x00, 0x20, 0xd0, 0xf7, 0x4a, 0xf9, 0x20, 0x80, 0x0c, 0x3c, 0x3c, 0x00, 0xc8, 0x29, 0x04, 0x00, 0xac, 0x42, 0xf8, 0xd1, 0xb0, 0xbd, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0x20, 0xa1, 0x07, 0x00, 0x35, 0xcd, 0x00, 0x00, 0x08, 0x49, 0x00, 0x20, 0x0c, 0x22, 0x42, 0x43, 0x52, 0x18, 0x10, 0x71, 0x01, 0x30, 0x05, 0x28, 0xf8, 0xdb, 0x04, 0x48, 0x00, 0x21, 0x08, 0x38, 0x01, 0x70, 0x41, 0x60, 0xff, 0x21, 0x41, 0x70, 0x70, 0x47, 0x00, 0x00, 0x74, 0x7a, 0x01, 0x00, 0x3c, 0x00, 0x04, 0x2a, 0x04, 0x00, 0x80, 0xb5, 0x78, 0x21, 0x01, 0x48, 0xbd, 0xf7, 0x47, 0xfd, 0x80, 0xbd, 0xc4, 0x7b, 0x01, 0x00, 0x80, 0xb5, 0xca, 0xf7, 0x97, 0xfa, 0x80, 0xbd, 0x70, 0x47, 0x00, 0x00, 0x10, 0xb5, 0x0b, 0x4c, 0xff, 0x21, 0x05, 0x31, 0x20, 0x1c, 0xbd, 0xf7, 0x37, 0xfd, 0x09, 0x48, 0xf0, 0x21, 0x08, 0x51, 0x20, 0x1c, 0x40, 0x30, 0xc5, 0xf7, 0x8e, 0xf9, 0x6c, 0x21, 0x06, 0x48, 0x3c, 0x00, 0x40, 0x2a, 0x04, 0x00, 0xbd, 0xf7, 0x2c, 0xfd, 0x04, 0x48, 0xc0, 0x21, 0x6c, 0x30, 0xbd, 0xf7, 0x27, 0xfd, 0x10, 0xbd, 0xc4, 0x69, 0x01, 0x00, 0xb0, 0xd9, 0x01, 0x00, 0xc8, 0x6a, 0x01, 0x00, 0xb0, 0xb5, 0x0b, 0x4d, 0x00, 0x24, 0x1c, 0x20, 0x60, 0x43, 0x40, 0x19, 0x6c, 0x30, 0xc3, 0xf7, 0x0f, 0xfe, 0x01, 0x34, 0x04, 0x2c, 0xf6, 0xdb, 0xcc, 0xf7, 0x6e, 0xfc, 0xa8, 0x63, 0xc7, 0xf7, 0x3c, 0x00, 0x7c, 0x2a, 0x04, 0x00, 0x75, 0xf9, 0x04, 0x48, 0xc9, 0xf7, 0x1c, 0xfc, 0x03, 0x48, 0xcf, 0xf7, 0x03, 0xfa, 0xb0, 0xbd, 0xc4, 0x69, 0x01, 0x00, 0xfd, 0x80, 0x00, 0x00, 0xe1, 0x22, 0x01, 0x00, 0x10, 0xb5, 0x05, 0x4c, 0x00, 0x20, 0x20, 0x80, 0x03, 0x48, 0x06, 0x21, 0x08, 0x30, 0xbd, 0xf7, 0xd5, 0xfc, 0x14, 0x20, 0x60, 0x60, 0x10, 0xbd, 0x98, 0x7c, 0x01, 0x00, 0x10, 0xb5, 0x08, 0x4c, 0x3c, 0x00, 0xb8, 0x2a, 0x04, 0x00, 0x00, 0x20, 0x20, 0x80, 0x60, 0x80, 0x06, 0x48, 0x06, 0x21, 0x0c, 0x30, 0xbd, 0xf7, 0xc6, 0xfc, 0x03, 0x48, 0x06, 0x21, 0x12, 0x30, 0xbd, 0xf7, 0xc1, 0xfc, 0x14, 0x20, 0xa0, 0x60, 0x10, 0xbd, 0x58, 0x7c, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x0d, 0x20, 0x05, 0x4a, 0xd0, 0xf7, 0x2e, 0xfe, 0x04, 0x48, 0xc8, 0xf7, 0x1f, 0xfc, 0x04, 0x48, 0x3c, 0x00, 0xf4, 0x2a, 0x04, 0x00, 0xca, 0xf7, 0x44, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x31, 0xd4, 0x00, 0x00, 0x51, 0xb1, 0x00, 0x00, 0x09, 0xb1, 0x00, 0x00, 0x08, 0x49, 0x80, 0xb5, 0x00, 0x20, 0x08, 0x60, 0xff, 0xf7, 0xd0, 0xff, 0xff, 0xf7, 0xc0, 0xff, 0xff, 0xf7, 0x04, 0xfc, 0x00, 0xf0, 0x4a, 0xf8, 0xff, 0xf7, 0x0a, 0xfc, 0x00, 0xf0, 0x3c, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0xe4, 0x65, 0x01, 0x00, 0x3c, 0x00, 0x30, 0x2b, 0x04, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x29, 0xf8, 0x00, 0xf0, 0x1b, 0xf8, 0x00, 0xf0, 0x51, 0xf8, 0x00, 0xf0, 0x31, 0xf8, 0x80, 0xbd, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0xff, 0x21, 0x89, 0x31, 0x02, 0x48, 0xbd, 0xf7, 0xa2, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0xdc, 0x71, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x49, 0x08, 0x20, 0xcf, 0xf7, 0x11, 0xfc, 0x80, 0xbd, 0x3c, 0x00, 0x6c, 0x2b, 0x04, 0x00, 0x59, 0xd9, 0x00, 0x00, 0x80, 0xb5, 0x03, 0x48, 0xcf, 0xf7, 0x4c, 0xf9, 0x02, 0x49, 0x48, 0x80, 0x80, 0xbd, 0x00, 0x00, 0x8d, 0x1f, 0x00, 0x00, 0x98, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x03, 0x48, 0xcf, 0xf7, 0x40, 0xf9, 0x02, 0x49, 0x88, 0x80, 0x80, 0xbd, 0x00, 0x00, 0xd5, 0x23, 0x00, 0x00, 0x58, 0x7c, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x02, 0x48, 0x3c, 0x00, 0xa8, 0x2b, 0x04, 0x00, 0xca, 0xf7, 0xe4, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x71, 0xe0, 0x00, 0x00, 0x80, 0xb5, 0xcc, 0xf7, 0xa5, 0xfb, 0x02, 0x21, 0x0f, 0x20, 0x06, 0x4a, 0xd0, 0xf7, 0xc2, 0xfd, 0x14, 0x21, 0x05, 0x48, 0xbd, 0xf7, 0x68, 0xfc, 0x03, 0x48, 0x78, 0x21, 0x14, 0x30, 0xbd, 0xf7, 0x63, 0xfc, 0x80, 0xbd, 0x35, 0xe2, 0x00, 0x00, 0x84, 0x66, 0x01, 0x00, 0x80, 0xb5, 0xcc, 0xf7, 0x3c, 0x00, 0xe4, 0x2b, 0x04, 0x00, 0xb7, 0xfb, 0x05, 0x49, 0x08, 0x61, 0x05, 0x49, 0x0e, 0x20, 0xcf, 0xf7, 0xcd, 0xfb, 0x04, 0x49, 0x08, 0x20, 0xcf, 0xf7, 0xc9, 0xfb, 0x80, 0xbd, 0xec, 0x65, 0x01, 0x00, 0x01, 0x02, 0x01, 0x00, 0xc1, 0x2e, 0x00, 0x00, 0x01, 0x49, 0x00, 0x20, 0x08, 0x70, 0x70, 0x47, 0x40, 0xd9, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x01, 0x49, 0x00, 0x20, 0x08, 0x70, 0x70, 0x47, 0x3c, 0x00, 0x20, 0x2c, 0x04, 0x00, 0xa0, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x07, 0x48, 0xc8, 0xf7, 0xf2, 0xff, 0x06, 0x49, 0x48, 0x60, 0x06, 0x48, 0xc0, 0xf7, 0x07, 0xfb, 0x06, 0x48, 0xc0, 0xf7, 0x86, 0xfb, 0x05, 0x48, 0xc9, 0xf7, 0xa3, 0xfa, 0x80, 0xbd, 0xa9, 0xe4, 0x00, 0x00, 0xa0, 0x79, 0x01, 0x00, 0xb9, 0xe4, 0x00, 0x00, 0x85, 0x2e, 0x00, 0x00, 0x81, 0xe4, 0x00, 0x00, 0x07, 0x48, 0x80, 0xb5, 0x3c, 0x00, 0x5c, 0x2c, 0x04, 0x00, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x0e, 0xc0, 0x08, 0xc0, 0x10, 0x38, 0xc8, 0x21, 0x01, 0x60, 0x00, 0x21, 0x0c, 0x38, 0x02, 0x4a, 0xcc, 0xf7, 0x61, 0xfb, 0x80, 0xbd, 0xd0, 0x60, 0x01, 0x00, 0xfd, 0xe5, 0x00, 0x00, 0x80, 0xb5, 0xcc, 0xf7, 0x67, 0xfb, 0x04, 0x49, 0x08, 0x60, 0x01, 0x1c, 0x02, 0x48, 0x04, 0x30, 0xcc, 0xf7, 0x86, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x98, 0x2c, 0x04, 0x00, 0xc0, 0x60, 0x01, 0x00, 0x09, 0x48, 0x80, 0xb5, 0x0a, 0x21, 0x01, 0x70, 0x41, 0x70, 0x08, 0x49, 0x08, 0x4a, 0x81, 0x60, 0x00, 0x21, 0xc1, 0x60, 0x52, 0x79, 0x82, 0x70, 0x01, 0x61, 0x41, 0x61, 0x28, 0x21, 0x18, 0x30, 0xbd, 0xf7, 0xee, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x7c, 0x78, 0x01, 0x00, 0xa0, 0x86, 0x01, 0x00, 0x0c, 0x5a, 0x01, 0x00, 0xf8, 0xb5, 0x0f, 0x49, 0x3c, 0x00, 0xd4, 0x2c, 0x04, 0x00, 0x0f, 0x48, 0x0d, 0x88, 0x4f, 0x88, 0x06, 0x79, 0x00, 0x24, 0x30, 0x1b, 0x68, 0x43, 0x68, 0x23, 0x0c, 0x49, 0x58, 0x43, 0x41, 0x18, 0x7d, 0x20, 0xc0, 0x00, 0xbd, 0xf7, 0x0f, 0xfd, 0x61, 0x00, 0x09, 0x4a, 0xa6, 0x42, 0x50, 0x52, 0x00, 0xd1, 0x3d, 0x1c, 0x01, 0x34, 0x24, 0x06, 0x24, 0x0e, 0x10, 0x2c, 0xea, 0xd3, 0x05, 0x49, 0x01, 0x20, 0x08, 0x61, 0xf8, 0xbd, 0x3c, 0x00, 0x10, 0x2d, 0x04, 0x00, 0xf6, 0x59, 0x01, 0x00, 0x0c, 0x5a, 0x01, 0x00, 0x34, 0x44, 0x0f, 0x00, 0x12, 0x5a, 0x01, 0x00, 0x7c, 0x78, 0x01, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0xe7, 0xfa, 0x02, 0x49, 0x01, 0x20, 0x08, 0x61, 0x80, 0xbd, 0x00, 0x00, 0x7c, 0x78, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x08, 0x1c, 0x0f, 0x49, 0x49, 0x79, 0x00, 0x29, 0x01, 0xd1, 0x0e, 0x4b, 0x00, 0xe0, 0x0e, 0x4b, 0x3c, 0x00, 0x4c, 0x2d, 0x04, 0x00, 0x00, 0x2c, 0x07, 0xd0, 0x04, 0x21, 0x11, 0x80, 0x0a, 0x1c, 0x01, 0x24, 0x19, 0x1c, 0xbd, 0xf7, 0xcd, 0xfb, 0x0a, 0xe0, 0x01, 0x24, 0x01, 0x1c, 0x18, 0x1c, 0x12, 0x88, 0xbd, 0xf7, 0xc6, 0xfb, 0x00, 0xf0, 0xc4, 0xfa, 0x05, 0x49, 0x01, 0x20, 0x08, 0x61, 0x20, 0x1c, 0x10, 0xbd, 0x00, 0x00, 0x0c, 0x5a, 0x01, 0x00, 0xfe, 0x59, 0x01, 0x00, 0xfa, 0x59, 0x01, 0x00, 0x3c, 0x00, 0x88, 0x2d, 0x04, 0x00, 0x7c, 0x78, 0x01, 0x00, 0x0d, 0x48, 0x8c, 0xb5, 0xc1, 0x88, 0x00, 0xab, 0x0c, 0x4a, 0x99, 0x80, 0x01, 0x89, 0x04, 0x20, 0xd9, 0x80, 0x18, 0x80, 0x02, 0x21, 0x13, 0x20, 0xd0, 0xf7, 0xd0, 0xfc, 0x00, 0xf0, 0xa6, 0xfa, 0x07, 0x49, 0x01, 0x20, 0x08, 0x61, 0xff, 0xf7, 0x8d, 0xff, 0x6a, 0x46, 0x01, 0xa9, 0x00, 0x20, 0xff, 0xf7, 0xbc, 0xff, 0x8c, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0xc4, 0x2d, 0x04, 0x00, 0xf4, 0x59, 0x01, 0x00, 0x95, 0xf9, 0x00, 0x00, 0x7c, 0x78, 0x01, 0x00, 0xf8, 0xb5, 0x13, 0x4e, 0x01, 0x25, 0xb5, 0x70, 0x05, 0x20, 0xf0, 0x70, 0x11, 0x49, 0x10, 0x48, 0x0e, 0xc9, 0x2c, 0x30, 0x0e, 0xc0, 0x00, 0x20, 0x70, 0x61, 0x0f, 0x48, 0x0f, 0x49, 0x10, 0x4f, 0x00, 0x24, 0x48, 0x60, 0xa0, 0x00, 0x39, 0x58, 0x20, 0x1c, 0xd1, 0xf7, 0xd7, 0xf8, 0x01, 0x34, 0x3c, 0x00, 0x00, 0x2e, 0x04, 0x00, 0x10, 0x2c, 0xf7, 0xd3, 0x06, 0x4c, 0x0b, 0x4a, 0x20, 0x34, 0x20, 0x1c, 0x0a, 0x49, 0xb5, 0x60, 0xcc, 0xf7, 0x92, 0xfa, 0xcc, 0xf7, 0x9e, 0xfa, 0x30, 0x61, 0x20, 0x60, 0xf8, 0xbd, 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, 0xb0, 0x58, 0x01, 0x00, 0x04, 0x18, 0x02, 0x00, 0x60, 0x00, 0x07, 0x00, 0xd4, 0x44, 0x01, 0x00, 0x45, 0xfa, 0x00, 0x00, 0x71, 0xfa, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0x2e, 0x04, 0x00, 0x0c, 0x49, 0x30, 0xb5, 0x00, 0x23, 0xcc, 0x56, 0x0b, 0x4b, 0x00, 0x20, 0xf0, 0x25, 0x1a, 0x5c, 0x11, 0x07, 0x09, 0x0f, 0x09, 0x19, 0x0f, 0x29, 0x01, 0xdd, 0x0f, 0x21, 0x02, 0xe0, 0x00, 0x29, 0x00, 0xda, 0x00, 0x21, 0x2a, 0x40, 0x51, 0x18, 0x19, 0x54, 0x01, 0x30, 0x0e, 0x28, 0xee, 0xdb, 0x30, 0xbd, 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, 0xc0, 0x58, 0x01, 0x00, 0x3c, 0x00, 0x78, 0x2e, 0x04, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x00, 0x28, 0x08, 0xd0, 0x01, 0x24, 0x14, 0x80, 0x05, 0x20, 0xcc, 0xf7, 0xb5, 0xf8, 0x80, 0x03, 0xc0, 0x0f, 0x28, 0x70, 0x07, 0xe0, 0x28, 0x78, 0x01, 0x22, 0x41, 0x04, 0x52, 0x04, 0x05, 0x20, 0xd0, 0xf7, 0xae, 0xfd, 0x01, 0x24, 0x20, 0x1c, 0xb0, 0xbd, 0x00, 0x00, 0x98, 0xb5, 0x05, 0x4c, 0x60, 0x68, 0xcc, 0xf7, 0xf5, 0xfd, 0x00, 0x90, 0x3c, 0x00, 0xb4, 0x2e, 0x04, 0x00, 0x00, 0xab, 0x18, 0x88, 0xe0, 0x80, 0xce, 0xf7, 0xfb, 0xff, 0x98, 0xbd, 0xa0, 0x58, 0x01, 0x00, 0x38, 0xb5, 0x03, 0x1c, 0x08, 0x1c, 0x00, 0x24, 0x00, 0x2b, 0x17, 0x4d, 0x07, 0xd0, 0x0e, 0x21, 0x11, 0x80, 0x0a, 0x1c, 0x01, 0x24, 0x29, 0x1c, 0xbd, 0xf7, 0x0c, 0xfb, 0x22, 0xe0, 0x11, 0x88, 0x04, 0x29, 0x17, 0xd1, 0x01, 0x1c, 0x68, 0x46, 0x12, 0x88, 0xbd, 0xf7, 0x3c, 0x00, 0xf0, 0x2e, 0x04, 0x00, 0x03, 0xfb, 0x00, 0x98, 0x00, 0x28, 0x01, 0xdb, 0x32, 0x30, 0x00, 0xe0, 0x32, 0x38, 0x00, 0x90, 0x01, 0x1c, 0x64, 0x20, 0xbd, 0xf7, 0x98, 0xfb, 0x01, 0x06, 0x09, 0x16, 0x00, 0x90, 0x0e, 0x22, 0x28, 0x1c, 0xbd, 0xf7, 0x85, 0xfb, 0x06, 0xe0, 0x0e, 0x29, 0x05, 0xd1, 0x0a, 0x1c, 0x01, 0x1c, 0x28, 0x1c, 0xbd, 0xf7, 0xe9, 0xfa, 0x01, 0x24, 0x20, 0x1c, 0x38, 0xbd, 0x3c, 0x00, 0x2c, 0x2f, 0x04, 0x00, 0xda, 0x59, 0x01, 0x00, 0x38, 0xb5, 0x03, 0x1c, 0x08, 0x1c, 0x00, 0x24, 0x00, 0x2b, 0x17, 0x4d, 0x07, 0xd0, 0x0e, 0x21, 0x11, 0x80, 0x0a, 0x1c, 0x01, 0x24, 0x29, 0x1c, 0xbd, 0xf7, 0xd6, 0xfa, 0x22, 0xe0, 0x11, 0x88, 0x04, 0x29, 0x17, 0xd1, 0x01, 0x1c, 0x68, 0x46, 0x12, 0x88, 0xbd, 0xf7, 0xcd, 0xfa, 0x00, 0x98, 0x00, 0x28, 0x01, 0xdb, 0x32, 0x30, 0x00, 0xe0, 0x3c, 0x00, 0x68, 0x2f, 0x04, 0x00, 0x32, 0x38, 0x00, 0x90, 0x01, 0x1c, 0x64, 0x20, 0xbd, 0xf7, 0x62, 0xfb, 0x01, 0x06, 0x09, 0x16, 0x00, 0x90, 0x0e, 0x22, 0x28, 0x1c, 0xbd, 0xf7, 0x4f, 0xfb, 0x06, 0xe0, 0x0e, 0x29, 0x05, 0xd1, 0x0a, 0x1c, 0x01, 0x1c, 0x28, 0x1c, 0xbd, 0xf7, 0xb3, 0xfa, 0x01, 0x24, 0x20, 0x1c, 0x38, 0xbd, 0xcc, 0x59, 0x01, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x01, 0x78, 0x00, 0x20, 0x3c, 0x00, 0xa4, 0x2f, 0x04, 0x00, 0xcc, 0xf7, 0xb4, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xa6, 0x58, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x02, 0x49, 0x03, 0x20, 0x08, 0x70, 0x00, 0x20, 0x48, 0x70, 0x70, 0x47, 0x9c, 0x73, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x11, 0x20, 0x02, 0x4a, 0xd0, 0xf7, 0xbc, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xa1, 0xfe, 0x00, 0x00, 0xf0, 0xb5, 0x0b, 0x4f, 0x1c, 0x1c, 0x00, 0x23, 0x3c, 0x00, 0xe0, 0x2f, 0x04, 0x00, 0xfd, 0x56, 0x2b, 0x1c, 0x06, 0x2d, 0x01, 0xd1, 0x01, 0x20, 0xf0, 0xbd, 0x06, 0x4e, 0x05, 0x1c, 0xd8, 0x00, 0x34, 0x36, 0x35, 0x54, 0x80, 0x19, 0x41, 0x70, 0x82, 0x70, 0x44, 0x60, 0x58, 0x1c, 0x38, 0x70, 0x00, 0x20, 0xf0, 0xbd, 0x00, 0x00, 0x98, 0x5a, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x0c, 0x48, 0x00, 0xf0, 0x21, 0xf9, 0x60, 0x78, 0xff, 0x28, 0x04, 0xd0, 0x3c, 0x00, 0x1c, 0x30, 0x04, 0x00, 0x01, 0x23, 0xe0, 0x56, 0x06, 0x21, 0x00, 0xf0, 0xcd, 0xf8, 0x08, 0x4a, 0x01, 0x21, 0x10, 0x78, 0x08, 0x43, 0x07, 0x49, 0x08, 0x70, 0x20, 0x23, 0x18, 0x43, 0x08, 0x70, 0x80, 0x23, 0x18, 0x43, 0x10, 0x70, 0x08, 0x70, 0x10, 0xbd, 0x00, 0x00, 0x91, 0x9b, 0x00, 0x00, 0xe0, 0x60, 0x01, 0x00, 0x04, 0x00, 0x07, 0x00, 0x10, 0xb5, 0x0a, 0x49, 0x04, 0x1c, 0x08, 0x78, 0x3c, 0x00, 0x58, 0x30, 0x04, 0x00, 0x40, 0x08, 0x40, 0x00, 0x08, 0x70, 0x08, 0x49, 0x08, 0x70, 0x08, 0x48, 0x00, 0xf0, 0xf8, 0xf8, 0x60, 0x78, 0xff, 0x28, 0x04, 0xd0, 0x01, 0x23, 0xe0, 0x56, 0x05, 0x21, 0x00, 0xf0, 0xa4, 0xf8, 0x10, 0xbd, 0x00, 0x00, 0xe0, 0x60, 0x01, 0x00, 0x04, 0x00, 0x07, 0x00, 0x91, 0x9b, 0x00, 0x00, 0x03, 0x48, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x0e, 0xc0, 0x08, 0xc0, 0x3c, 0x00, 0x94, 0x30, 0x04, 0x00, 0x70, 0x47, 0x00, 0x00, 0xe8, 0x60, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x10, 0xb5, 0x07, 0x4c, 0x00, 0x20, 0x60, 0x60, 0x20, 0x80, 0xe0, 0x60, 0x02, 0x21, 0x14, 0x20, 0x04, 0x4a, 0xd0, 0xf7, 0x49, 0xfb, 0x02, 0x48, 0x10, 0x30, 0xa0, 0x60, 0x10, 0xbd, 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, 0x05, 0x1d, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x10, 0xb5, 0x48, 0x21, 0x3c, 0x00, 0xd0, 0x30, 0x04, 0x00, 0x0a, 0x48, 0xbd, 0xf7, 0xe3, 0xf9, 0x09, 0x4c, 0xe0, 0x21, 0x48, 0x34, 0x20, 0x1c, 0xbd, 0xf7, 0xdd, 0xf9, 0x00, 0x20, 0xc1, 0x00, 0x09, 0x19, 0x0a, 0x1c, 0x08, 0x32, 0x01, 0x30, 0x1b, 0x28, 0x4a, 0x60, 0xf7, 0xd3, 0x01, 0x48, 0x04, 0x38, 0x04, 0x60, 0x10, 0xbd, 0x68, 0x5b, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x23, 0x20, 0x02, 0x4a, 0xd0, 0xf7, 0x1e, 0xfb, 0x3c, 0x00, 0x0c, 0x31, 0x04, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x45, 0x23, 0x01, 0x00, 0x80, 0xb5, 0xff, 0xf7, 0x6b, 0xf8, 0x80, 0xbd, 0x70, 0x47, 0x00, 0x00, 0xf8, 0xb5, 0x01, 0x20, 0x1d, 0x49, 0xc0, 0x07, 0x48, 0x60, 0x1d, 0x49, 0xff, 0x20, 0x08, 0x73, 0x1c, 0x4e, 0x10, 0x20, 0x30, 0x60, 0x05, 0x01, 0x35, 0x60, 0x1b, 0x4c, 0x80, 0x21, 0x20, 0x1c, 0xbd, 0xf7, 0xac, 0xf9, 0x00, 0x21, 0x19, 0x4a, 0x3c, 0x00, 0x48, 0x31, 0x04, 0x00, 0x15, 0x4f, 0x00, 0x20, 0x0b, 0x01, 0x1b, 0x19, 0x5a, 0x60, 0xcb, 0x00, 0xdb, 0x19, 0x18, 0x74, 0x01, 0x31, 0x08, 0x29, 0xf6, 0xdb, 0x0f, 0x4c, 0xfa, 0x21, 0x21, 0x80, 0x12, 0x49, 0x61, 0x80, 0xa0, 0x60, 0x6a, 0x46, 0x11, 0x49, 0x04, 0x20, 0xbd, 0xf7, 0x30, 0xff, 0x6a, 0x46, 0x10, 0x49, 0x08, 0x20, 0xbd, 0xf7, 0x2b, 0xff, 0x10, 0x20, 0x70, 0x60, 0x75, 0x60, 0x3c, 0x00, 0x84, 0x31, 0x04, 0x00, 0x60, 0x68, 0x02, 0x21, 0x08, 0x43, 0x60, 0x60, 0x0b, 0x49, 0x06, 0x4a, 0x08, 0x1c, 0x10, 0x30, 0x08, 0x3a, 0x03, 0xc2, 0xf8, 0xbd, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x60, 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0xac, 0x73, 0x01, 0x00, 0xd1, 0x75, 0x00, 0x00, 0x20, 0x4e, 0x00, 0x00, 0x05, 0x2c, 0x01, 0x00, 0x11, 0x2c, 0x01, 0x00, 0x00, 0xa0, 0x07, 0x00, 0x3c, 0x00, 0xc0, 0x31, 0x04, 0x00, 0x70, 0xb5, 0x0e, 0x1c, 0x00, 0x24, 0xc4, 0xf7, 0x5b, 0xfe, 0x00, 0x28, 0x3b, 0xd0, 0x45, 0x68, 0xff, 0x2d, 0x38, 0xd0, 0x0c, 0x2e, 0x28, 0xd2, 0x01, 0xa3, 0x9b, 0x5d, 0x5b, 0x00, 0x9f, 0x44, 0x05, 0x07, 0x09, 0x0b, 0x0d, 0x10, 0x13, 0x16, 0x18, 0x1b, 0x1e, 0x21, 0x18, 0x24, 0x20, 0xe0, 0x30, 0x24, 0x1e, 0xe0, 0x60, 0x24, 0x1c, 0xe0, 0xc0, 0x24, 0x1a, 0xe0, 0x3c, 0x00, 0xfc, 0x31, 0x04, 0x00, 0xff, 0x24, 0x81, 0x34, 0x17, 0xe0, 0x09, 0x24, 0xa4, 0x01, 0x14, 0xe0, 0x09, 0x24, 0xe4, 0x01, 0x11, 0xe0, 0x0f, 0x4c, 0x0f, 0xe0, 0x09, 0x24, 0x24, 0x02, 0x0c, 0xe0, 0x09, 0x24, 0x64, 0x02, 0x09, 0xe0, 0x03, 0x24, 0xe4, 0x02, 0x06, 0xe0, 0x09, 0x24, 0xa4, 0x02, 0x03, 0xe0, 0x09, 0x21, 0x9e, 0x20, 0xbe, 0xf7, 0x39, 0xf8, 0x60, 0x00, 0x00, 0x19, 0x40, 0x08, 0x3c, 0x00, 0x38, 0x32, 0x04, 0x00, 0x05, 0x49, 0x80, 0x04, 0x40, 0x18, 0x05, 0x4a, 0xa9, 0x00, 0x89, 0x18, 0x48, 0x60, 0x64, 0x20, 0x60, 0x43, 0x70, 0xbd, 0xdc, 0x07, 0x00, 0x00, 0x80, 0x38, 0x01, 0x00, 0x04, 0x00, 0x07, 0x00, 0x02, 0x49, 0x80, 0xb5, 0x08, 0x60, 0xd0, 0xf7, 0x97, 0xf8, 0x80, 0xbd, 0x5c, 0x5b, 0x01, 0x00, 0xf8, 0xb5, 0x00, 0x26, 0x17, 0x4c, 0x17, 0x4b, 0x19, 0x49, 0x26, 0x70, 0x3c, 0x00, 0x74, 0x32, 0x04, 0x00, 0x00, 0x20, 0x14, 0x33, 0x0d, 0x88, 0x15, 0x4e, 0x15, 0x4a, 0x04, 0xe0, 0xc1, 0x00, 0xcf, 0x18, 0x7a, 0x60, 0x5e, 0x50, 0x01, 0x30, 0xa8, 0x42, 0xf8, 0xdb, 0xc6, 0xf7, 0x2b, 0xfd, 0xff, 0x21, 0x11, 0x4d, 0xa5, 0x31, 0x28, 0x1c, 0xbd, 0xf7, 0xff, 0xf8, 0x00, 0x21, 0x28, 0x1c, 0x02, 0x1c, 0x14, 0x32, 0xc2, 0x60, 0x10, 0x1c, 0x01, 0x31, 0x14, 0x29, 0xf8, 0xdb, 0x3c, 0x00, 0xb0, 0x32, 0x04, 0x00, 0x00, 0x26, 0xc6, 0x60, 0x05, 0x48, 0x0c, 0x30, 0x60, 0xc0, 0x09, 0x48, 0x18, 0x21, 0xbd, 0xf7, 0xed, 0xf8, 0x01, 0x20, 0x04, 0x34, 0x41, 0xc4, 0x00, 0x20, 0xf8, 0xbd, 0x70, 0x5d, 0x01, 0x00, 0x09, 0xa0, 0x00, 0x00, 0x30, 0xd9, 0x01, 0x00, 0x56, 0x57, 0x01, 0x00, 0x04, 0x5f, 0x01, 0x00, 0xa8, 0x60, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x20, 0xcf, 0xf7, 0xb6, 0xfc, 0x3c, 0x00, 0xec, 0x32, 0x04, 0x00, 0x01, 0x49, 0x08, 0x80, 0x80, 0xbd, 0x00, 0x00, 0x2c, 0x74, 0x01, 0x00, 0x11, 0x48, 0xf8, 0xb5, 0x41, 0x79, 0x00, 0x29, 0x02, 0xd1, 0x05, 0x78, 0x0f, 0x4e, 0x01, 0xe0, 0x45, 0x78, 0x0f, 0x4e, 0x02, 0x23, 0xf7, 0x5e, 0x00, 0x24, 0x60, 0x1b, 0x78, 0x43, 0x64, 0x23, 0x0c, 0x49, 0x58, 0x43, 0x41, 0x18, 0x7d, 0x20, 0xc0, 0x00, 0xbd, 0xf7, 0xf5, 0xf9, 0x61, 0x00, 0x3c, 0x00, 0x28, 0x33, 0x04, 0x00, 0x09, 0x4a, 0xac, 0x42, 0x50, 0x52, 0x01, 0xd1, 0x00, 0x23, 0xf7, 0x5e, 0x01, 0x34, 0x24, 0x06, 0x24, 0x0e, 0x10, 0x2c, 0xe9, 0xd3, 0xf8, 0xbd, 0x0c, 0x5a, 0x01, 0x00, 0xfe, 0x59, 0x01, 0x00, 0xfa, 0x59, 0x01, 0x00, 0x34, 0x44, 0x0f, 0x00, 0x32, 0x5a, 0x01, 0x00, 0x38, 0xb5, 0x10, 0x4c, 0xbe, 0x25, 0x25, 0x73, 0x20, 0x7a, 0x18, 0x21, 0x88, 0x43, 0x20, 0x72, 0x3c, 0x00, 0x64, 0x33, 0x04, 0x00, 0x6a, 0x46, 0x0d, 0x49, 0x0d, 0x20, 0xbd, 0xf7, 0x33, 0xfe, 0x01, 0x20, 0x0b, 0x49, 0x40, 0x03, 0x08, 0x60, 0x48, 0x60, 0x25, 0x73, 0x2d, 0x20, 0xc0, 0x03, 0x20, 0x60, 0x25, 0x73, 0x20, 0x7a, 0x10, 0x21, 0x08, 0x43, 0x20, 0x72, 0x06, 0x48, 0x06, 0x49, 0x08, 0x60, 0x00, 0x20, 0x48, 0x60, 0x38, 0xbd, 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, 0x8d, 0x3e, 0x01, 0x00, 0x24, 0x00, 0xa0, 0x33, 0x04, 0x00, 0x00, 0x10, 0x07, 0x00, 0x00, 0x87, 0x93, 0x03, 0x04, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x15, 0x20, 0x02, 0x4a, 0xd0, 0xf7, 0xc8, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x0d, 0x3e, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x04, 0x00, 0x00, 0x60, 0x04, 0x00, 0x44, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x20, 0x07, 0x00, 0xff, 0xff, 0xff, 0xff, }; const uint32_t fw_len = sizeof(fw_buf) / sizeof(fw_buf[0]); ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_os.h ================================================ #ifndef WL_OS_H #define WL_OS_H #include #include void *owl_os_alloc(size_t size); void *owl_os_realloc(void *ptr, size_t size); void owl_os_free(void *p); void *owl_os_memcpy(void *dst, const void *src, size_t n); void *owl_os_memset(void *s, int c, size_t n); void *owl_os_memmove(void *dst, const void *src, size_t n); size_t owl_os_strlen(char *s); char *owl_os_strncpy(char *dst, const char *src, size_t n); int owl_os_strncmp(const char *s1, const char *s2, size_t n); int owl_os_strcmp(const char *s1, const char *s2); char *owl_os_strcpy(char *dst, const char *src); char *owl_os_strdup(const char *s); char *owl_os_strndup(const char *s, size_t n); int owl_os_memcmp(const void *s1, const void *s2, size_t n); long int owl_os_strtol(const char *nptr, char **endptr, int base); char *owl_os_strchr(const char *s, int c); char *owl_os_strrchr(const char *s, int c); int owl_os_strcasecmp(const char *s1, const char *s2); char *owl_os_strstr(const char *haystack, const char *needle); int owl_os_snprintf(char *str, size_t size, const char *format, ...) __attribute__((format(printf, 3, 4))); int owl_os_vprintf(const char *format, va_list arg); /* debug only */ int owl_os_printf(const char *format, ...) /* debug only */ __attribute__((format(printf, 1, 2))); #endif /* WL_OS_H */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_sdio.h ================================================ /*! * \file wl_sdio.h * \brief SDIO interface for wl_api. * Copyright (C) 2010 HD Wireless AB * * You should have received a copy of the license along with this library. */ #ifndef WL_SDIO_H #define WL_SDIO_H /** \defgroup wl_sdio SDIO Interface * * These functions implement the interface that the wl_api library * needs to work with a SDIO transport layer. * * The functions prototyped here must be implemented when porting the * wl_api library to a new platform with a different SDIO configuration * * On platforms supported by H&D Wireless these functions are * implemented in the file avr32_sdio.c * * @{ */ /** * Maximum transfer size. This will set an upper limit on the len parameter * passed to owl_sdio_tx() and owl_sdio_rx(). * */ #define MAX_BLOCK_LEN 512 /** * This flag might be set when owl_sdio_cmd() is called in case the cmd will * be followed by a data transfer. If the flag is set, the transfer direction is * from the device to the host (read). Otherwise, the transfer direction is * from the host to the device (write). * */ #define CMD_FLAG_TO_HOST (1 << 0) /** * Indicates that the sdio driver needs to be polled in order to make * forward progress, i.e. it does not support interrupts * * The actual polling will result in owl_sdio_cmd() being called to * request status information from the device. * * To activate polling, this flag should be set in owl_sdio_init(). */ #define SDIO_FLAG_POLL (1 << 0) /** * Indicates that the sdio driver only supports 1-bit mode. * * To set 1-bit mode, this flag should be set in owl_sdio_init(). */ #define SDIO_FLAG_1BIT_MODE (1 << 1) /** * This function will be invoked when wlan initialization should be performed, * this happens when the wl_fw_download() function in the transport group of * wl_api is invoked. * * The wifi device supports sdio high speed mode and clock frequencies up to * 50 MHz. * * The function is responsible for doing any necessary sdio initialization such * as allocating gpio's, setting up the mci master, one time allocations of * dma buffers etc. * * @param flags is an out parameter that should hold any sdio flags upon return. * The avaible flags are prefixed with SDIO_FLAG_ * * */ void owl_sdio_init(uint8_t *flags); /** * This function will be invoked when an sdio cmd should be sent to the * device. * * @param idx is the sdio command number * @param arg is the sdio command argument * @param flags specifies other options, such as any transfer direction. * @param rsp should hold the command response upon return. If null, the * response can be ignored. * @param data holds a pointer to any data that might follow the command. This * allows the sdio driver to setup dma transfers while waiting for the * command response. NULL if no data transfer will follow. Note that * the same data pointer will be passed to owl_sdio_tx(), which should * start the actual transfer. * @param len is the length of the data buffer. * */ void owl_sdio_cmd(uint8_t idx, uint32_t arg, uint8_t flags, uint32_t *rsp, const uint8_t *data, uint16_t len); /** * This function will be invoked when data should be transmitted to the device. * * If wl_fw_downlad() was called with the size_align parameter set to non-zero, * the pad parameter should be used. If the pad parameter is not 0, additional * data must be transmitted after the data buffer has be sent. Depending on * how the data buffer was first allocated (probably by an TCP/IP stack), it * might be safe or unsafe to continue reading beyond the data buffer to * transmit the additional padding bytes. * * @param data holds a pointer to the data to transmit, the pointer is the * same as the one passed to wl_tx(). * @param len is the number of bytes that should be transmitted, including * padding. * @param pad is the number of padding bytes to send. * */ void owl_sdio_tx(const uint8_t *data, uint16_t len, uint8_t pad); /** * This function will be invoked when data should be received from the device. * * @param data should hold the read data upon return. * @param len is the number of bytes to read. * */ void owl_sdio_rx(uint8_t *data, uint16_t len); /** * Invoked when sdio rx interrupts from the device should be enabled or * disabled. * * If SDIO_FLAG_POLL was set in wl_spi_init(), then this function can be * left empty. * * @param enable specifies if interrupts should be enabled or disabled. * */ void owl_sdio_irq(uint8_t enable); /** * Delay executiom for the specified number of ms. This function will be called * with delays in the 10-20 ms range during fw download and startup of the * Wi-Fi device. This function can be implemented with a simple for-loop if * desired (beware of optimization). The timing does not have to be accurate as * long as the actual delay becomes at least the specified number of ms. * * @param ms is the minimal amount of time to wait [ms]. * */ void owl_sdio_mdelay(uint32_t ms); /** * This function should be called whenever an interrupt is detected. It can * be called from an interrupt context. * * If SDIO_FLAG_POLL was set in owl_sdio_init(), then wl_sdio_irq() * should never be called. * */ extern void wl_sdio_irq(void); /*! @} */ #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_spi.h ================================================ /*! * \file wl_spi.h * \brief SPI interface for wl_api. * Copyright (C) 2010 HD Wireless AB * * You should have received a copy of the license along with this library. */ #ifndef WL_SPI_H #define WL_SPI_H #ifndef WITHOUT_STDINT #include #endif /** \defgroup wl_spi SPI Interface * * These functions implement the interface that the wl_api library * needs to work with a SPI transport layer. * * The functions prototyped here must be implemented when porting the * wl_api library to a new platform with a different SPI configuration * * On platforms supported by H&D Wireless these functions are * implemented in the file avr32_spi.c * * @{ */ /** * Maximum transfer size. This will set an upper limit on the len parameter * passed to owl_spi_txrx(). * * */ #define MAX_BLOCK_LEN 512 /** * Indicates that the spi driver needs to be polled in order to make * forward progress, i.e. it does not support interrupts through SD pin 8. * * The actual polling will result in owl_spi_txrx() being call to * request status information from the device. * * To activate polling, this flag should be set in owl_spi_init(). * * See wl_poll() and wl_register_rx_isr() for more information regarding * polled and interrupt modes. * */ #define SPI_FLAG_POLL (1 << 0) /** * This function will be invoked when wlan device initialization should be * performed, this happens when the wl_fw_download() function in the transport * group of wl_api is invoked. * * The wifi device requires spi mode 3, i.e. clock polarity high and sample * on second phase. This corresponds to CPOL=1, CPHA=1. Maximum frequency on * spi clock is 30 MHz. * * The function is also responsible for doing any necessary spi initialization * such as allocating gpio's, setting up the SPI master, one time allocations of * dma buffers etc. * * * If the SPB105 device is used, two signals; POWER (pin 10 on SPB105) and * SHUTDOWN (pin 4 on SPB105) might be connected to gpio's on the host. * The GPIO_POWER_PIN is the main power supply to the device. The * GPIO_SHUTDOWN_PIN (active low) should be defined as an input. * * After GPIO_POWER_PIN is pulled high by the host, the device will pull the * GPIO_SHUTDOWN_PIN high once the device is properly powered. * * However, if pin 4 (GPIO_SHUTDOWN_PIN) is not connected to the host, a delay * of up to 250 ms must be added after GPIO_POWER_PIN is pulled high to ensure * that startup is completed. The actual time is usually much shorter, therefore * one might try to reduce the delay for a particualar hardware design. * * On SPB104, the GPIO_POWER_PIN will be connected to VCC and GPIO_SHUTDOWN_PIN * will be unconnected; hence we have to make sure that we have enough delay * after powering on the host. Since the device power-on usually happens at the * same time as the host power-on, the startup time of the host can be * subtracted from any delay put into owl_spi_init(). * * @param flags is an out parameter that should hold any spi flags upon return. * The avaible flags are prefixed with SPI_FLAG_ * * @return 0 on success * -1 if any error occurs * */ int owl_spi_init(uint8_t *flags); /** * Invoked when a spi transfer should be performed. * * All buffers that are allocated by the wl library will have a size that is * aligned to 4. If size-unaligned data is passed to this function, it is * always allocated by the ip stack. If 4-byte size alignment (e.g. for DMA) * is required, 1-3 extra padding bytes can be transmitted after the in buffer. * These bytes must be 0xff. * * Since size-unaligned data always comes from the ip stack, the out ptr is * always NULL for such data. * * @param in points a buffer which holds the data to be transmitted. If NULL, * then \a len bytes with the value 0xff should be transmitted on the * bus. * @param out points a buffer should hold the data received from the device. If * NULL, any received data can be discarded. * @param len is the length of the in and out buffers. * */ void owl_spi_txrx(const uint8_t *in, uint8_t* out, uint16_t len); /** * Invoked when spi rx interrupts from the device should be enabled or disabled. * Note that the spi interrupts are obtained from pin 8 on SPB104 or pin 3 from * SPB105. This pin can be be connected to a gpio on the host. The irq line * will signal an interrupt on both edges. * * In general, the wifi device will not issue a new interrupt unless the * last interrupt has been handled. Also, during normal operation (i.e after * the complete callback registered in wl_init() has been invoked), * owl_spi_irq() will never be invoked so interrupts will be enabled all * the time. For the SPI-mode, the purpose of owl_spi_irq() is basically to * make sure that the first interrupt (coming after the reset performed in * owl_spi_init()) is ignored. * * If SPI_FLAG_POLL was set in owl_spi_init(), then this function can be * left empty and the wifi device will be used in polled mode. In polled mode, * the interrupt line is not used. Regardless of polled or interrupt-mode, * wl_poll() must be called to ensure progress of the driver. * * @param enable specifies if interrupts should be enabled or disabled. * */ void owl_spi_irq(uint8_t enable); /** * Invoked when the spi cs for the wifi device should be enabled. Note that * multiple calls to owl_spi_txrx() might be done during a 'single' chip * select. * * @param enable specifies whether chip select should be asserted or deasserted, * The chip select signal is active low, so if enable is '1' then the * chip select connected to the wifi device should be set to '0'. * */ void owl_spi_cs(uint8_t enable); /** * Delay executiom for the specified number of ms. This function will be called * with delays in the 10-20 ms range during fw download and startup of the * Wi-Fi device. This function can be implemented with a simple for-loop if * desired (beware of optimization). The timing does not have to be accurate as * long as the actual delay becomes at least the specified number of ms. * * @param ms is the minimal amount of time to wait [ms]. * */ void owl_spi_mdelay(uint32_t ms); /** * This function should be called whenever an interrupt is detected. It can * be called from an interrupt context. * * If SPI_FLAG_POLL was set in owl_spi_init(), then wl_spi_irq() * should never be called. * */ extern void wl_spi_irq(void); /*! @} */ #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wlap_api.h ================================================ /* * Programming interface for wlap_api. * Copyright (C) 2011 HD Wireless AB * * You should have received a copy of the license along with this library. */ /*! \file wlap_api.h ************************************************************* * * \brief WiFi AP API * * This file provides the wlap_api interface. * * - Compiler: GNU GCC for AVR32 * - Supported devices: * \li SPB104 + EVK1100 * \li SPB104 + EVK1101 * \li SPB104 + EVK1104 * \li SPB104 + EVK1105 (SPI) * \li SPB104 + EVK1105 (SPI + irq) * \li SPB105 + EVK1105 (SPI) * - AppNote: * * \author H&D Wireless AB: \n * ***************************************************************************** * * \section intro Introduction * This is the documentation for the WiFi AP Driver API \a wlap_api. * * \section files Main Files * - wlap_api.h : WiFi driver interface. * - libwlap_api_*.*.a - Driver library. * */ #ifndef WLAP_API_H #define WLAP_API_H #define WLAP_API_RELEASE_NAME "unknown" #include /** \defgroup wl_softap Access Point Mode * * \brief Support the WiFi Access Point mode. * * @{ */ /* * Station representation * */ struct wl_sta_t { struct wl_mac_addr_t bssid; /**< The BSSID of the network. */ uint8_t queued_pkt_cnt; /**< Number of queueud packets for this STA. */ uint8_t in_ps; /**< Is the STA in power save mode. */ uint8_t aid; /**< STA AID */ }; /* Station list representation. Array of pointers to wl_sta_t entries. */ struct wl_sta_list_t { struct wl_sta_t **sta; /**< The list of pointers to stations */ size_t cnt; /**< Number of stations */ }; /*! \brief Get the list of currently associated stations (SoftAP). * * Retrieves the list of current stations from * the driver. * * This function is not thread safe. It must be called in the * same execution context as wl_poll(). * * @param network_list Output buffer. The API call returns * a pointer to allocated memory containing the network list. * @return * - WL_SUCCESS * - WL_FAILURE. */ wl_err_t wlap_get_sta_list(struct wl_sta_list_t **network_list); /*! Callback used to read data from a TX packet. * This function is supplied by the user of the API. * * @param dst Destination buffer. The data should be copied * to this buffer. * @param src_handle Handle to the source packet from where * the data should be copied. This handle is the same one that * is passed in parameter \a pkt_handle to \a wl_process_tx(). * @param read_len Number of bytes to copy from \a src_handle * to \a dst. * @param offset The offset in bytes, counting from the * beginning of the Ethernet header, from where to copy data. * @return * - The number of bytes copied. This number may be smaller * than the length requested in \a read_len but it may not * be shorter than the length of the packet counting from * \a offset. In other words, if the caller of this function * receives a return count that is shorter than \a read_len * he will assume that all packet data has been read. * - < 0 on error. */ typedef ssize_t (*wl_pkt_read_cb_t)(char *dst, void *src_handle, size_t read_len, int offset); /*! \brief Register a data access function for TX packets (SoftAP). * * When a TX data packet has a different representation than a single * contiguous buffer in memory then a packet read function must be * implemented and registered with this call. Whenever the library * needs to read packet data it will call this function to do it. * * This function can be ignored if the TX packet representation is * a single contiguous buffer. This function is only needed in SoftAP * mode. * * @param pkt_read_cb Read callback. * @param ctx Context */ void wl_register_pkt_read_cb(wl_pkt_read_cb_t pkt_read_cb); /*! \brief Start a network using the SoftAP mode. * * This call will cause the WiFi chip to start sending beacons * and accept associations from WiFi stations. * */ wl_err_t wlap_start_ap(const char *ssid, const size_t ssid_len, const uint8_t channel, const enum wl_auth_mode auth_mode, const enum wl_enc_type enc_type); /*! \brief Disconnect a STA (SoftAP) * * @param bssid The BSSID of the station to disconnect. * @return * - WL_SUCCESS * - WL_FAILURE. */ wl_err_t wlap_disconnect_sta(const struct wl_mac_addr_t bssid); /*! @} */ /* End wl_softap group */ #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER/cycle_counter.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file has been prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Cycle counter driver. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32UC devices. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * *****************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _CYCLE_COUNTER_H_ #define _CYCLE_COUNTER_H_ #include "compiler.h" //! Structure holding private information, automatically initialized by the //! cpu_set_timeout() function. typedef struct { //! The cycle count at the begining of the timeout. unsigned long delay_start_cycle; //! The cycle count at the end of the timeout. unsigned long delay_end_cycle; //! Enable/disable the timout detection unsigned char timer_state; #define CPU_TIMER_STATE_STARTED 0 #define CPU_TIMER_STATE_REACHED 1 #define CPU_TIMER_STATE_STOPPED 2 } t_cpu_time; /*! * \brief Convert milli-seconds into CPU cycles. * * \param ms: Number of millisecond. * \param fcpu_hz: CPU frequency in Hz. * * \return the converted number of CPU cycles. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ U32 cpu_ms_2_cy(unsigned long ms, unsigned long fcpu_hz) { return ((unsigned long long)ms * fcpu_hz + 999) / 1000; } /*! * \brief Convert micro-seconds into CPU cycles. * * \param us: Number of microsecond. * \param fcpu_hz: CPU frequency in Hz. * * \return the converted number of CPU cycles. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ U32 cpu_us_2_cy(unsigned long us, unsigned long fcpu_hz) { return ((unsigned long long)us * fcpu_hz + 999999) / 1000000; } /*! * \brief Convert CPU cycles into milli-seconds. * * \param cy: Number of CPU cycles. * \param fcpu_hz: CPU frequency in Hz. * * \return the converted number of milli-second. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ U32 cpu_cy_2_ms(unsigned long cy, unsigned long fcpu_hz) { return ((unsigned long long)cy * 1000 + fcpu_hz-1) / fcpu_hz; } /*! * \brief Convert CPU cycles into micro-seconds. * * \param cy: Number of CPU cycles. * \param fcpu_hz: CPU frequency in Hz. * * \return the converted number of micro-second. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ U32 cpu_cy_2_us(unsigned long cy, unsigned long fcpu_hz) { return ((unsigned long long)cy * 1000000 + fcpu_hz-1) / fcpu_hz; } /*! * \brief Set a timer variable. * * Ex: t_cpu_time timer; * cpu_set_timeout( cpu_ms_2_cy(10, FOSC0), &timer ); // timeout in 10 ms * if( cpu_is_timeout(&timer) ) * cpu_stop_timeout(&timer); * ../.. * * \param delay: (input) delay in CPU cycles before timeout. * \param cpu_time: (output) internal information used by the timer API. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void cpu_set_timeout(unsigned long delay, t_cpu_time *cpu_time) { cpu_time->delay_start_cycle = Get_system_register(AVR32_COUNT); cpu_time->delay_end_cycle = cpu_time->delay_start_cycle + delay; cpu_time->timer_state = CPU_TIMER_STATE_STARTED; } /*! * \brief Test if a timer variable reached its timeout. * * Once the timeout is reached, the function will always return TRUE, * until the cpu_stop_timeout() function is called. * * Ex: t_cpu_time timer; * cpu_set_timeout( 10, FOSC0, &timer ); // timeout in 10 ms * if( cpu_is_timeout(&timer) ) * cpu_stop_timeout(&timer); * ../.. * * \param cpu_time: (input) internal information used by the timer API. * * \return TRUE if timeout occured, otherwise FALSE. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ unsigned long cpu_is_timeout(t_cpu_time *cpu_time) { unsigned long current_cycle_count = Get_system_register(AVR32_COUNT); if( cpu_time->timer_state==CPU_TIMER_STATE_STOPPED ) return FALSE; // Test if the timeout as already occured. else if (cpu_time->timer_state == CPU_TIMER_STATE_REACHED) return TRUE; // If the ending cycle count of this timeout is wrapped, ... else if (cpu_time->delay_start_cycle > cpu_time->delay_end_cycle) { if (current_cycle_count < cpu_time->delay_start_cycle && current_cycle_count > cpu_time->delay_end_cycle) { cpu_time->timer_state = CPU_TIMER_STATE_REACHED; return TRUE; } return FALSE; } else { if (current_cycle_count < cpu_time->delay_start_cycle || current_cycle_count > cpu_time->delay_end_cycle) { cpu_time->timer_state = CPU_TIMER_STATE_REACHED; return TRUE; } return FALSE; } } /*! * \brief Stop a timeout detection. * * Ex: t_cpu_time timer; * cpu_set_timeout( 10, FOSC0, &timer ); // timeout in 10 ms * if( cpu_is_timeout(&timer) ) * cpu_stop_timeout(&timer); * ../.. * * \param cpu_time: (input) internal information used by the timer API. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void cpu_stop_timeout(t_cpu_time *cpu_time) { cpu_time->timer_state = CPU_TIMER_STATE_STOPPED; } /*! * \brief Test if a timer is stopped. * * \param cpu_time: (input) internal information used by the timer API. * * \return TRUE if timer is stopped, otherwise FALSE. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ unsigned long cpu_is_timer_stopped(t_cpu_time *cpu_time) { if( cpu_time->timer_state==CPU_TIMER_STATE_STOPPED ) return TRUE; else return FALSE; } /*! * \brief Waits during at least the specified delay (in millisecond) before returning. * * \param delay: Number of millisecond to wait. * \param fcpu_hz: CPU frequency in Hz. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void cpu_delay_ms(unsigned long delay, unsigned long fcpu_hz) { t_cpu_time timer; cpu_set_timeout( cpu_ms_2_cy(delay, fcpu_hz), &timer); while( !cpu_is_timeout(&timer) ); } /*! * \brief Waits during at least the specified delay (in microsecond) before returning. * * \param delay: Number of microsecond to wait. * \param fcpu_hz: CPU frequency in Hz. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void cpu_delay_us(unsigned long delay, unsigned long fcpu_hz) { t_cpu_time timer; cpu_set_timeout( cpu_us_2_cy(delay, fcpu_hz), &timer); while( !cpu_is_timeout(&timer) ); } /*! * \brief Waits during at least the specified delay (in CPU cycles) before returning. * * \param delay: Number of CPU cycles to wait. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void cpu_delay_cy(unsigned long delay) { t_cpu_time timer; cpu_set_timeout( delay, &timer); while( !cpu_is_timeout(&timer) ); } #define Get_sys_count() ( Get_system_register(AVR32_COUNT) ) #define Set_sys_count(x) ( Set_system_register(AVR32_COUNT, (x)) ) #define Get_sys_compare() ( Get_system_register(AVR32_COMPARE) ) #define Set_sys_compare(x) ( Set_system_register(AVR32_COMPARE, (x)) ) #endif // _CYCLE_COUNTER_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC/smc.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief SMC on EBI driver for AVR32 UC3. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a SMC module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "compiler.h" #include "preprocessor.h" #include "gpio.h" #include "smc.h" // Configure the SM Controller with SM setup and timing information for all chip select #define SMC_CS_SETUP(ncs) { \ U32 nwe_setup = ((NWE_SETUP * hsb_mhz_up + 999) / 1000); \ U32 ncs_wr_setup = ((NCS_WR_SETUP * hsb_mhz_up + 999) / 1000); \ U32 nrd_setup = ((NRD_SETUP * hsb_mhz_up + 999) / 1000); \ U32 ncs_rd_setup = ((NCS_RD_SETUP * hsb_mhz_up + 999) / 1000); \ U32 nwe_pulse = ((NWE_PULSE * hsb_mhz_up + 999) / 1000); \ U32 ncs_wr_pulse = ((NCS_WR_PULSE * hsb_mhz_up + 999) / 1000); \ U32 nrd_pulse = ((NRD_PULSE * hsb_mhz_up + 999) / 1000); \ U32 ncs_rd_pulse = ((NCS_RD_PULSE * hsb_mhz_up + 999) / 1000); \ U32 nwe_cycle = ((NWE_CYCLE * hsb_mhz_up + 999) / 1000); \ U32 nrd_cycle = ((NRD_CYCLE * hsb_mhz_up + 999) / 1000); \ \ /* Some coherence checks... */ \ /* Ensures CS is active during Rd or Wr */ \ if( ncs_rd_setup + ncs_rd_pulse < nrd_setup + nrd_pulse ) \ ncs_rd_pulse = nrd_setup + nrd_pulse - ncs_rd_setup; \ if( ncs_wr_setup + ncs_wr_pulse < nwe_setup + nwe_pulse ) \ ncs_wr_pulse = nwe_setup + nwe_pulse - ncs_wr_setup; \ \ /* ncs_hold = n_cycle - ncs_setup - ncs_pulse */ \ /* n_hold = n_cycle - n_setup - n_pulse */ \ /* */ \ /* All holds parameters must be positive or null, so: */ \ /* nwe_cycle shall be >= ncs_wr_setup + ncs_wr_pulse */ \ if( nwe_cycle < ncs_wr_setup + ncs_wr_pulse ) \ nwe_cycle = ncs_wr_setup + ncs_wr_pulse; \ \ /* nwe_cycle shall be >= nwe_setup + nwe_pulse */ \ if( nwe_cycle < nwe_setup + nwe_pulse ) \ nwe_cycle = nwe_setup + nwe_pulse; \ \ /* nrd_cycle shall be >= ncs_rd_setup + ncs_rd_pulse */ \ if( nrd_cycle < ncs_rd_setup + ncs_rd_pulse ) \ nrd_cycle = ncs_rd_setup + ncs_rd_pulse; \ \ /* nrd_cycle shall be >= nrd_setup + nrd_pulse */ \ if( nrd_cycle < nrd_setup + nrd_pulse ) \ nrd_cycle = nrd_setup + nrd_pulse; \ \ AVR32_SMC.cs[ncs].setup = (nwe_setup << AVR32_SMC_SETUP0_NWE_SETUP_OFFSET) | \ (ncs_wr_setup << AVR32_SMC_SETUP0_NCS_WR_SETUP_OFFSET) | \ (nrd_setup << AVR32_SMC_SETUP0_NRD_SETUP_OFFSET) | \ (ncs_rd_setup << AVR32_SMC_SETUP0_NCS_RD_SETUP_OFFSET); \ AVR32_SMC.cs[ncs].pulse = (nwe_pulse << AVR32_SMC_PULSE0_NWE_PULSE_OFFSET) | \ (ncs_wr_pulse << AVR32_SMC_PULSE0_NCS_WR_PULSE_OFFSET) | \ (nrd_pulse << AVR32_SMC_PULSE0_NRD_PULSE_OFFSET) | \ (ncs_rd_pulse << AVR32_SMC_PULSE0_NCS_RD_PULSE_OFFSET); \ AVR32_SMC.cs[ncs].cycle = (nwe_cycle << AVR32_SMC_CYCLE0_NWE_CYCLE_OFFSET) | \ (nrd_cycle << AVR32_SMC_CYCLE0_NRD_CYCLE_OFFSET); \ AVR32_SMC.cs[ncs].mode = (((NCS_CONTROLLED_READ) ? AVR32_SMC_MODE0_READ_MODE_NCS_CONTROLLED : \ AVR32_SMC_MODE0_READ_MODE_NRD_CONTROLLED) << AVR32_SMC_MODE0_READ_MODE_OFFSET) | \ + (((NCS_CONTROLLED_WRITE) ? AVR32_SMC_MODE0_WRITE_MODE_NCS_CONTROLLED : \ AVR32_SMC_MODE0_WRITE_MODE_NWE_CONTROLLED) << AVR32_SMC_MODE0_WRITE_MODE_OFFSET) | \ (NWAIT_MODE << AVR32_SMC_MODE0_EXNW_MODE_OFFSET) | \ (((SMC_8_BIT_CHIPS) ? AVR32_SMC_MODE0_BAT_BYTE_WRITE : \ AVR32_SMC_MODE0_BAT_BYTE_SELECT) << AVR32_SMC_MODE0_BAT_OFFSET) | \ (((SMC_DBW <= 8 ) ? AVR32_SMC_MODE0_DBW_8_BITS : \ (SMC_DBW <= 16) ? AVR32_SMC_MODE0_DBW_16_BITS : \ AVR32_SMC_MODE0_DBW_32_BITS) << AVR32_SMC_MODE0_DBW_OFFSET) | \ (TDF_CYCLES << AVR32_SMC_MODE0_TDF_CYCLES_OFFSET) | \ (TDF_OPTIM << AVR32_SMC_MODE0_TDF_MODE_OFFSET) | \ (PAGE_MODE << AVR32_SMC_MODE0_PMEN_OFFSET) | \ (PAGE_SIZE << AVR32_SMC_MODE0_PS_OFFSET); \ smc_tab_cs_size[ncs] = (U8)EXT_SM_SIZE; \ } static U8 smc_tab_cs_size[6]; static void smc_enable_muxed_pins(void); void smc_init(unsigned long hsb_hz) { unsigned long hsb_mhz_up = (hsb_hz + 999999) / 1000000; //! Whether to use the NCS0 pin #ifdef SMC_USE_NCS0 #include SMC_COMPONENT_CS0 // Setup SMC for NCS0 SMC_CS_SETUP(0) #ifdef SMC_DBW_GLOBAL #if (SMC_DBW_GLOBAL < SMC_DBW) #undef SMC_DBW_GLOBAL #if (SMC_DBW == 8) #define SMC_DBW_GLOBAL 8 #elif (SMC_DBW == 16) #define SMC_DBW_GLOBAL 16 #elif (SMC_DBW == 32) #define SMC_DBW_GLOBAL 32 #else #error error in SMC_DBW size #endif #endif #else #if (SMC_DBW == 8) #define SMC_DBW_GLOBAL 8 #elif (SMC_DBW == 16) #define SMC_DBW_GLOBAL 16 #elif (SMC_DBW == 32) #define SMC_DBW_GLOBAL 32 #else #error error in SMC_DBW size #endif #endif #ifdef SMC_8_BIT_CHIPS_GLOBAL #if (SMC_8_BIT_CHIPS_GLOBAL < SMC_8_BIT) #undef SMC_8_BIT_CHIPS_GLOBAL #if (SMC_8_BIT_CHIPS == TRUE) #define SMC_8_BIT_CHIPS_GLOBAL TRUE #elif (SMC_8_BIT_CHIPS == FALSE) #define SMC_8_BIT_CHIPS_GLOBAL FALSE #else #error error in SMC_8_BIT_CHIPS size #endif #endif #else #if (SMC_8_BIT_CHIPS == TRUE) #define SMC_8_BIT_CHIPS_GLOBAL TRUE #elif (SMC_8_BIT_CHIPS == FALSE) #define SMC_8_BIT_CHIPS_GLOBAL FALSE #else #error error in SMC_8_BIT_CHIPS size #endif #endif #ifdef NWAIT_MODE_GLOBAL #if (NWAIT_MODE_GLOBAL < NWAIT_MODE) #undef NWAIT_MODE_GLOBAL #if (NWAIT_MODE == AVR32_SMC_EXNW_MODE_DISABLED) #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_DISABLED #elif (NWAIT_MODE == AVR32_SMC_EXNW_MODE_FROZEN) #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_FROZEN #else #error error in NWAIT_MODE size #endif #endif #else #if (NWAIT_MODE == AVR32_SMC_EXNW_MODE_DISABLED) #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_DISABLED #elif (NWAIT_MODE == AVR32_SMC_EXNW_MODE_FROZEN) #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_FROZEN #else #error error in NWAIT_MODE size #endif #endif #undef EXT_SM_SIZE #undef SMC_DBW #undef SMC_8_BIT_CHIPS #undef NWE_SETUP #undef NCS_WR_SETUP #undef NRD_SETUP #undef NCS_RD_SETUP #undef NCS_WR_PULSE #undef NWE_PULSE #undef NCS_RD_PULSE #undef NRD_PULSE #undef NCS_WR_HOLD #undef NWE_HOLD #undef NWE_CYCLE #undef NCS_RD_HOLD #undef NRD_CYCLE #undef TDF_CYCLES #undef TDF_OPTIM #undef PAGE_MODE #undef PAGE_SIZE #undef NCS_CONTROLLED_READ #undef NCS_CONTROLLED_WRITE #undef NWAIT_MODE #endif //! Whether to use the NCS1 pin #ifdef SMC_USE_NCS1 #include SMC_COMPONENT_CS1 // Enable SM mode for CS1 if necessary. AVR32_HMATRIX.sfr[AVR32_EBI_HMATRIX_NR] &= ~(1 << AVR32_EBI_SDRAM_CS); AVR32_HMATRIX.sfr[AVR32_EBI_HMATRIX_NR]; // Setup SMC for NCS1 SMC_CS_SETUP(1) #ifdef SMC_DBW_GLOBAL #if (SMC_DBW_GLOBAL < SMC_DBW) #undef SMC_DBW_GLOBAL #if (SMC_DBW == 8) #define SMC_DBW_GLOBAL 8 #elif (SMC_DBW == 16) #define SMC_DBW_GLOBAL 16 #elif (SMC_DBW == 32) #define SMC_DBW_GLOBAL 32 #else #error error in SMC_DBW size #endif #endif #else #if (SMC_DBW == 8) #define SMC_DBW_GLOBAL 8 #elif (SMC_DBW == 16) #define SMC_DBW_GLOBAL 16 #elif (SMC_DBW == 32) #define SMC_DBW_GLOBAL 32 #else #error error in SMC_DBW size #endif #endif #ifdef SMC_8_BIT_CHIPS_GLOBAL #if (SMC_8_BIT_CHIPS_GLOBAL < SMC_8_BIT) #undef SMC_8_BIT_CHIPS_GLOBAL #if (SMC_8_BIT_CHIPS == TRUE) #define SMC_8_BIT_CHIPS_GLOBAL TRUE #elif (SMC_8_BIT_CHIPS == FALSE) #define SMC_8_BIT_CHIPS_GLOBAL FALSE #else #error error in SMC_8_BIT_CHIPS size #endif #endif #else #if (SMC_8_BIT_CHIPS == TRUE) #define SMC_8_BIT_CHIPS_GLOBAL TRUE #elif (SMC_8_BIT_CHIPS == FALSE) #define SMC_8_BIT_CHIPS_GLOBAL FALSE #else #error error in SMC_8_BIT_CHIPS size #endif #endif #ifdef NWAIT_MODE_GLOBAL #if (NWAIT_MODE_GLOBAL < NWAIT_MODE) #undef NWAIT_MODE_GLOBAL #if (NWAIT_MODE == AVR32_SMC_EXNW_MODE_DISABLED) #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_DISABLED #elif (NWAIT_MODE == AVR32_SMC_EXNW_MODE_FROZEN) #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_FROZEN #else #error error in NWAIT_MODE size #endif #endif #else #if (NWAIT_MODE == AVR32_SMC_EXNW_MODE_DISABLED) #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_DISABLED #elif (NWAIT_MODE == AVR32_SMC_EXNW_MODE_FROZEN) #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_FROZEN #else #error error in NWAIT_MODE size #endif #endif #undef EXT_SM_SIZE #undef SMC_DBW #undef SMC_8_BIT_CHIPS #undef NWE_SETUP #undef NCS_WR_SETUP #undef NRD_SETUP #undef NCS_RD_SETUP #undef NCS_WR_PULSE #undef NWE_PULSE #undef NCS_RD_PULSE #undef NRD_PULSE #undef NCS_WR_HOLD #undef NWE_HOLD #undef NWE_CYCLE #undef NCS_RD_HOLD #undef NRD_CYCLE #undef TDF_CYCLES #undef TDF_OPTIM #undef PAGE_MODE #undef PAGE_SIZE #undef NCS_CONTROLLED_READ #undef NCS_CONTROLLED_WRITE #undef NWAIT_MODE #endif //! Whether to use the NCS2 pin #ifdef SMC_USE_NCS2 #include SMC_COMPONENT_CS2 // Setup SMC for NCS2 SMC_CS_SETUP(2) #ifdef SMC_DBW_GLOBAL #if (SMC_DBW_GLOBAL < SMC_DBW) #undef SMC_DBW_GLOBAL #if (SMC_DBW == 8) #define SMC_DBW_GLOBAL 8 #elif (SMC_DBW == 16) #define SMC_DBW_GLOBAL 16 #elif (SMC_DBW == 32) #define SMC_DBW_GLOBAL 32 #else #error error in SMC_DBW size #endif #endif #else #if (SMC_DBW == 8) #define SMC_DBW_GLOBAL 8 #elif (SMC_DBW == 16) #define SMC_DBW_GLOBAL 16 #elif (SMC_DBW == 32) #define SMC_DBW_GLOBAL 32 #else #error error in SMC_DBW size #endif #endif #ifdef SMC_8_BIT_CHIPS_GLOBAL #if (SMC_8_BIT_CHIPS_GLOBAL < SMC_8_BIT) #undef SMC_8_BIT_CHIPS_GLOBAL #if (SMC_8_BIT_CHIPS == TRUE) #define SMC_8_BIT_CHIPS_GLOBAL TRUE #elif (SMC_8_BIT_CHIPS == FALSE) #define SMC_8_BIT_CHIPS_GLOBAL FALSE #else #error error in SMC_8_BIT_CHIPS size #endif #endif #else #if (SMC_8_BIT_CHIPS == TRUE) #define SMC_8_BIT_CHIPS_GLOBAL TRUE #elif (SMC_8_BIT_CHIPS == FALSE) #define SMC_8_BIT_CHIPS_GLOBAL FALSE #else #error error in SMC_8_BIT_CHIPS size #endif #endif #ifdef NWAIT_MODE_GLOBAL #if (NWAIT_MODE_GLOBAL < NWAIT_MODE) #undef NWAIT_MODE_GLOBAL #if (NWAIT_MODE == AVR32_SMC_EXNW_MODE_DISABLED) #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_DISABLED #elif (NWAIT_MODE == AVR32_SMC_EXNW_MODE_FROZEN) #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_FROZEN #else #error error in NWAIT_MODE size #endif #endif #else #if (NWAIT_MODE == AVR32_SMC_EXNW_MODE_DISABLED) #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_DISABLED #elif (NWAIT_MODE == AVR32_SMC_EXNW_MODE_FROZEN) #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_FROZEN #else #error error in NWAIT_MODE size #endif #endif #undef EXT_SM_SIZE #undef SMC_DBW #undef SMC_8_BIT_CHIPS #undef NWE_SETUP #undef NCS_WR_SETUP #undef NRD_SETUP #undef NCS_RD_SETUP #undef NCS_WR_PULSE #undef NWE_PULSE #undef NCS_RD_PULSE #undef NRD_PULSE #undef NCS_WR_HOLD #undef NWE_HOLD #undef NWE_CYCLE #undef NCS_RD_HOLD #undef NRD_CYCLE #undef TDF_CYCLES #undef TDF_OPTIM #undef PAGE_MODE #undef PAGE_SIZE #undef NCS_CONTROLLED_READ #undef NCS_CONTROLLED_WRITE #undef NWAIT_MODE #endif //! Whether to use the NCS3 pin #ifdef SMC_USE_NCS3 #include SMC_COMPONENT_CS3 // Setup SMC for NCS3 SMC_CS_SETUP(3) #ifdef SMC_DBW_GLOBAL #if (SMC_DBW_GLOBAL < SMC_DBW) #undef SMC_DBW_GLOBAL #if (SMC_DBW == 8) #define SMC_DBW_GLOBAL 8 #elif (SMC_DBW == 16) #define SMC_DBW_GLOBAL 16 #elif (SMC_DBW == 32) #define SMC_DBW_GLOBAL 32 #else #error error in SMC_DBW size #endif #endif #else #if (SMC_DBW == 8) #define SMC_DBW_GLOBAL 8 #elif (SMC_DBW == 16) #define SMC_DBW_GLOBAL 16 #elif (SMC_DBW == 32) #define SMC_DBW_GLOBAL 32 #else #error error in SMC_DBW size #endif #endif #ifdef SMC_8_BIT_CHIPS_GLOBAL #if (SMC_8_BIT_CHIPS_GLOBAL < SMC_8_BIT) #undef SMC_8_BIT_CHIPS_GLOBAL #if (SMC_8_BIT_CHIPS == TRUE) #define SMC_8_BIT_CHIPS_GLOBAL TRUE #elif (SMC_8_BIT_CHIPS == FALSE) #define SMC_8_BIT_CHIPS_GLOBAL FALSE #else #error error in SMC_8_BIT_CHIPS size #endif #endif #else #if (SMC_8_BIT_CHIPS == TRUE) #define SMC_8_BIT_CHIPS_GLOBAL TRUE #elif (SMC_8_BIT_CHIPS == FALSE) #define SMC_8_BIT_CHIPS_GLOBAL FALSE #else #error error in SMC_8_BIT_CHIPS size #endif #endif #ifdef NWAIT_MODE_GLOBAL #if (NWAIT_MODE_GLOBAL < NWAIT_MODE) #undef NWAIT_MODE_GLOBAL #if (NWAIT_MODE == AVR32_SMC_EXNW_MODE_DISABLED) #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_DISABLED #elif (NWAIT_MODE == AVR32_SMC_EXNW_MODE_FROZEN) #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_FROZEN #else #error error in NWAIT_MODE size #endif #endif #else #if (NWAIT_MODE == AVR32_SMC_EXNW_MODE_DISABLED) #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_DISABLED #elif (NWAIT_MODE == AVR32_SMC_EXNW_MODE_FROZEN) #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_FROZEN #else #error error in NWAIT_MODE size #endif #endif #undef EXT_SM_SIZE #undef SMC_DBW #undef SMC_8_BIT_CHIPS #undef NWE_SETUP #undef NCS_WR_SETUP #undef NRD_SETUP #undef NCS_RD_SETUP #undef NCS_WR_PULSE #undef NWE_PULSE #undef NCS_RD_PULSE #undef NRD_PULSE #undef NCS_WR_HOLD #undef NWE_HOLD #undef NWE_CYCLE #undef NCS_RD_HOLD #undef NRD_CYCLE #undef TDF_CYCLES #undef TDF_OPTIM #undef PAGE_MODE #undef PAGE_SIZE #undef NCS_CONTROLLED_READ #undef NCS_CONTROLLED_WRITE #undef NWAIT_MODE #endif //! Whether to use the NCS4 pin #ifdef SMC_USE_NCS4 #include SMC_COMPONENT_CS4 // Setup SMC for NCS4 SMC_CS_SETUP(4) #ifdef SMC_DBW_GLOBAL #if (SMC_DBW_GLOBAL < SMC_DBW) #undef SMC_DBW_GLOBAL #if (SMC_DBW == 8) #define SMC_DBW_GLOBAL 8 #elif (SMC_DBW == 16) #define SMC_DBW_GLOBAL 16 #elif (SMC_DBW == 32) #define SMC_DBW_GLOBAL 32 #else #error error in SMC_DBW size #endif #endif #else #if (SMC_DBW == 8) #define SMC_DBW_GLOBAL 8 #elif (SMC_DBW == 16) #define SMC_DBW_GLOBAL 16 #elif (SMC_DBW == 32) #define SMC_DBW_GLOBAL 32 #else #error error in SMC_DBW size #endif #endif #ifdef SMC_8_BIT_CHIPS_GLOBAL #if (SMC_8_BIT_CHIPS_GLOBAL < SMC_8_BIT) #undef SMC_8_BIT_CHIPS_GLOBAL #if (SMC_8_BIT_CHIPS == TRUE) #define SMC_8_BIT_CHIPS_GLOBAL TRUE #elif (SMC_8_BIT_CHIPS == FALSE) #define SMC_8_BIT_CHIPS_GLOBAL FALSE #else #error error in SMC_8_BIT_CHIPS size #endif #endif #else #if (SMC_8_BIT_CHIPS == TRUE) #define SMC_8_BIT_CHIPS_GLOBAL TRUE #elif (SMC_8_BIT_CHIPS == FALSE) #define SMC_8_BIT_CHIPS_GLOBAL FALSE #else #error error in SMC_8_BIT_CHIPS size #endif #endif #ifdef NWAIT_MODE_GLOBAL #if (NWAIT_MODE_GLOBAL < NWAIT_MODE) #undef NWAIT_MODE_GLOBAL #if (NWAIT_MODE == AVR32_SMC_EXNW_MODE_DISABLED) #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_DISABLED #elif (NWAIT_MODE == AVR32_SMC_EXNW_MODE_FROZEN) #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_FROZEN #else #error error in NWAIT_MODE size #endif #endif #else #if (NWAIT_MODE == AVR32_SMC_EXNW_MODE_DISABLED) #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_DISABLED #elif (NWAIT_MODE == AVR32_SMC_EXNW_MODE_FROZEN) #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_FROZEN #else #error error in NWAIT_MODE size #endif #endif #undef EXT_SM_SIZE #undef SMC_DBW #undef SMC_8_BIT_CHIPS #undef NWE_SETUP #undef NCS_WR_SETUP #undef NRD_SETUP #undef NCS_RD_SETUP #undef NCS_WR_PULSE #undef NWE_PULSE #undef NCS_RD_PULSE #undef NRD_PULSE #undef NCS_WR_HOLD #undef NWE_HOLD #undef NWE_CYCLE #undef NCS_RD_HOLD #undef NRD_CYCLE #undef TDF_CYCLES #undef TDF_OPTIM #undef PAGE_MODE #undef PAGE_SIZE #undef NCS_CONTROLLED_READ #undef NCS_CONTROLLED_WRITE #undef NWAIT_MODE #endif //! Whether to use the NCS5 pin #ifdef SMC_USE_NCS5 #include SMC_COMPONENT_CS5 // Setup SMC for NCS5 SMC_CS_SETUP(5) #ifdef SMC_DBW_GLOBAL #if (SMC_DBW_GLOBAL < SMC_DBW) #undef SMC_DBW_GLOBAL #if (SMC_DBW == 8) #define SMC_DBW_GLOBAL 8 #elif (SMC_DBW == 16) #define SMC_DBW_GLOBAL 16 #elif (SMC_DBW == 32) #define SMC_DBW_GLOBAL 32 #else #error error in SMC_DBW size #endif #endif #else #if (SMC_DBW == 8) #define SMC_DBW_GLOBAL 8 #elif (SMC_DBW == 16) #define SMC_DBW_GLOBAL 16 #elif (SMC_DBW == 32) #define SMC_DBW_GLOBAL 32 #else #error error in SMC_DBW size #endif #endif #ifdef SMC_8_BIT_CHIPS_GLOBAL #if (SMC_8_BIT_CHIPS_GLOBAL < SMC_8_BIT) #undef SMC_8_BIT_CHIPS_GLOBAL #if (SMC_8_BIT_CHIPS == TRUE) #define SMC_8_BIT_CHIPS_GLOBAL TRUE #elif (SMC_8_BIT_CHIPS == FALSE) #define SMC_8_BIT_CHIPS_GLOBAL FALSE #else #error error in SMC_8_BIT_CHIPS size #endif #endif #else #if (SMC_8_BIT_CHIPS == TRUE) #define SMC_8_BIT_CHIPS_GLOBAL TRUE #elif (SMC_8_BIT_CHIPS == FALSE) #define SMC_8_BIT_CHIPS_GLOBAL FALSE #else #error error in SMC_8_BIT_CHIPS size #endif #endif #ifdef NWAIT_MODE_GLOBAL #if (NWAIT_MODE_GLOBAL < NWAIT_MODE) #undef NWAIT_MODE_GLOBAL #if (NWAIT_MODE == AVR32_SMC_EXNW_MODE_DISABLED) #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_DISABLED #elif (NWAIT_MODE == AVR32_SMC_EXNW_MODE_FROZEN) #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_FROZEN #else #error error in NWAIT_MODE size #endif #endif #else #if (NWAIT_MODE == AVR32_SMC_EXNW_MODE_DISABLED) #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_DISABLED #elif (NWAIT_MODE == AVR32_SMC_EXNW_MODE_FROZEN) #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_FROZEN #else #error error in NWAIT_MODE size #endif #endif #undef EXT_SM_SIZE #undef SMC_DBW #undef SMC_8_BIT_CHIPS #undef NWE_SETUP #undef NCS_WR_SETUP #undef NRD_SETUP #undef NCS_RD_SETUP #undef NCS_WR_PULSE #undef NWE_PULSE #undef NCS_RD_PULSE #undef NRD_PULSE #undef NCS_WR_HOLD #undef NWE_HOLD #undef NWE_CYCLE #undef NCS_RD_HOLD #undef NRD_CYCLE #undef TDF_CYCLES #undef TDF_OPTIM #undef PAGE_MODE #undef PAGE_SIZE #undef NCS_CONTROLLED_READ #undef NCS_CONTROLLED_WRITE #undef NWAIT_MODE #endif // Put the multiplexed MCU pins used for the SM under control of the SMC. smc_enable_muxed_pins(); } /*! \brief Puts the multiplexed MCU pins used for the SMC * */ static void smc_enable_muxed_pins(void) { static const gpio_map_t SMC_EBI_GPIO_MAP = { // Enable data pins. #ifdef EBI_DATA_0 {ATPASTE2(EBI_DATA_0,_PIN),ATPASTE2(EBI_DATA_0,_FUNCTION)}, #endif #ifdef EBI_DATA_1 {ATPASTE2(EBI_DATA_1,_PIN),ATPASTE2(EBI_DATA_1,_FUNCTION)}, #endif #ifdef EBI_DATA_2 {ATPASTE2(EBI_DATA_2,_PIN),ATPASTE2(EBI_DATA_2,_FUNCTION)}, #endif #ifdef EBI_DATA_3 {ATPASTE2(EBI_DATA_3,_PIN),ATPASTE2(EBI_DATA_3,_FUNCTION)}, #endif #ifdef EBI_DATA_4 {ATPASTE2(EBI_DATA_4,_PIN),ATPASTE2(EBI_DATA_4,_FUNCTION)}, #endif #ifdef EBI_DATA_5 {ATPASTE2(EBI_DATA_5,_PIN),ATPASTE2(EBI_DATA_5,_FUNCTION)}, #endif #ifdef EBI_DATA_6 {ATPASTE2(EBI_DATA_6,_PIN),ATPASTE2(EBI_DATA_6,_FUNCTION)}, #endif #ifdef EBI_DATA_7 {ATPASTE2(EBI_DATA_7,_PIN),ATPASTE2(EBI_DATA_7,_FUNCTION)}, #endif #ifdef EBI_DATA_8 {ATPASTE2(EBI_DATA_8,_PIN),ATPASTE2(EBI_DATA_8,_FUNCTION)}, #endif #ifdef EBI_DATA_9 {ATPASTE2(EBI_DATA_9,_PIN),ATPASTE2(EBI_DATA_9,_FUNCTION)}, #endif #ifdef EBI_DATA_10 {ATPASTE2(EBI_DATA_10,_PIN),ATPASTE2(EBI_DATA_10,_FUNCTION)}, #endif #ifdef EBI_DATA_11 {ATPASTE2(EBI_DATA_11,_PIN),ATPASTE2(EBI_DATA_11,_FUNCTION)}, #endif #ifdef EBI_DATA_12 {ATPASTE2(EBI_DATA_12,_PIN),ATPASTE2(EBI_DATA_12,_FUNCTION)}, #endif #ifdef EBI_DATA_13 {ATPASTE2(EBI_DATA_13,_PIN),ATPASTE2(EBI_DATA_13,_FUNCTION)}, #endif #ifdef EBI_DATA_14 {ATPASTE2(EBI_DATA_14,_PIN),ATPASTE2(EBI_DATA_14,_FUNCTION)}, #endif #ifdef EBI_DATA_15 {ATPASTE2(EBI_DATA_15,_PIN),ATPASTE2(EBI_DATA_15,_FUNCTION)}, #endif #ifdef EBI_DATA_16 {ATPASTE2(EBI_DATA_16,_PIN),ATPASTE2(EBI_DATA_16,_FUNCTION)}, #endif #ifdef EBI_DATA_17 {ATPASTE2(EBI_DATA_17,_PIN),ATPASTE2(EBI_DATA_17,_FUNCTION)}, #endif #ifdef EBI_DATA_18 {ATPASTE2(EBI_DATA_18,_PIN),ATPASTE2(EBI_DATA_18,_FUNCTION)}, #endif #ifdef EBI_DATA_19 {ATPASTE2(EBI_DATA_19,_PIN),ATPASTE2(EBI_DATA_19,_FUNCTION)}, #endif #ifdef EBI_DATA_20 {ATPASTE2(EBI_DATA_20,_PIN),ATPASTE2(EBI_DATA_20,_FUNCTION)}, #endif #ifdef EBI_DATA_21 {ATPASTE2(EBI_DATA_21,_PIN),ATPASTE2(EBI_DATA_21,_FUNCTION)}, #endif #ifdef EBI_DATA_22 {ATPASTE2(EBI_DATA_22,_PIN),ATPASTE2(EBI_DATA_22,_FUNCTION)}, #endif #ifdef EBI_DATA_23 {ATPASTE2(EBI_DATA_23,_PIN),ATPASTE2(EBI_DATA_23,_FUNCTION)}, #endif #ifdef EBI_DATA_24 {ATPASTE2(EBI_DATA_24,_PIN),ATPASTE2(EBI_DATA_24,_FUNCTION)}, #endif #ifdef EBI_DATA_25 {ATPASTE2(EBI_DATA_25,_PIN),ATPASTE2(EBI_DATA_25,_FUNCTION)}, #endif #ifdef EBI_DATA_26 {ATPASTE2(EBI_DATA_26,_PIN),ATPASTE2(EBI_DATA_26,_FUNCTION)}, #endif #ifdef EBI_DATA_27 {ATPASTE2(EBI_DATA_27,_PIN),ATPASTE2(EBI_DATA_27,_FUNCTION)}, #endif #ifdef EBI_DATA_28 {ATPASTE2(EBI_DATA_28,_PIN),ATPASTE2(EBI_DATA_28,_FUNCTION)}, #endif #ifdef EBI_DATA_29 {ATPASTE2(EBI_DATA_29,_PIN),ATPASTE2(EBI_DATA_29,_FUNCTION)}, #endif #ifdef EBI_DATA_30 {ATPASTE2(EBI_DATA_30,_PIN),ATPASTE2(EBI_DATA_30,_FUNCTION)}, #endif #ifdef EBI_DATA_31 {ATPASTE2(EBI_DATA_31,_PIN),ATPASTE2(EBI_DATA_31,_FUNCTION)}, #endif // Enable address pins. #if SMC_DBW_GLOBAL <= 8 #ifdef EBI_ADDR_0 {ATPASTE2(EBI_ADDR_0,_PIN),ATPASTE2(EBI_ADDR_0,_FUNCTION)}, #endif #endif #if SMC_DBW_GLOBAL <= 16 #ifdef EBI_ADDR_1 {ATPASTE2(EBI_ADDR_1,_PIN),ATPASTE2(EBI_ADDR_1,_FUNCTION)}, #endif #endif #ifdef EBI_ADDR_2 {ATPASTE2(EBI_ADDR_2,_PIN),ATPASTE2(EBI_ADDR_2,_FUNCTION)}, #endif #ifdef EBI_ADDR_3 {ATPASTE2(EBI_ADDR_3,_PIN),ATPASTE2(EBI_ADDR_3,_FUNCTION)}, #endif #ifdef EBI_ADDR_4 {ATPASTE2(EBI_ADDR_4,_PIN),ATPASTE2(EBI_ADDR_4,_FUNCTION)}, #endif #ifdef EBI_ADDR_5 {ATPASTE2(EBI_ADDR_5,_PIN),ATPASTE2(EBI_ADDR_5,_FUNCTION)}, #endif #ifdef EBI_ADDR_6 {ATPASTE2(EBI_ADDR_6,_PIN),ATPASTE2(EBI_ADDR_6,_FUNCTION)}, #endif #ifdef EBI_ADDR_7 {ATPASTE2(EBI_ADDR_7,_PIN),ATPASTE2(EBI_ADDR_7,_FUNCTION)}, #endif #ifdef EBI_ADDR_8 {ATPASTE2(EBI_ADDR_8,_PIN),ATPASTE2(EBI_ADDR_8,_FUNCTION)}, #endif #ifdef EBI_ADDR_9 {ATPASTE2(EBI_ADDR_9,_PIN),ATPASTE2(EBI_ADDR_9,_FUNCTION)}, #endif #ifdef EBI_ADDR_10 {ATPASTE2(EBI_ADDR_10,_PIN),ATPASTE2(EBI_ADDR_10,_FUNCTION)}, #endif #ifdef EBI_ADDR_11 {ATPASTE2(EBI_ADDR_11,_PIN),ATPASTE2(EBI_ADDR_11,_FUNCTION)}, #endif #ifdef EBI_ADDR_12 {ATPASTE2(EBI_ADDR_12,_PIN),ATPASTE2(EBI_ADDR_12,_FUNCTION)}, #endif #ifdef EBI_ADDR_13 {ATPASTE2(EBI_ADDR_13,_PIN),ATPASTE2(EBI_ADDR_13,_FUNCTION)}, #endif #ifdef EBI_ADDR_14 {ATPASTE2(EBI_ADDR_14,_PIN),ATPASTE2(EBI_ADDR_14,_FUNCTION)}, #endif #ifdef EBI_ADDR_15 {ATPASTE2(EBI_ADDR_15,_PIN),ATPASTE2(EBI_ADDR_15,_FUNCTION)}, #endif #ifdef EBI_ADDR_16 {ATPASTE2(EBI_ADDR_16,_PIN),ATPASTE2(EBI_ADDR_16,_FUNCTION)}, #endif #ifdef EBI_ADDR_17 {ATPASTE2(EBI_ADDR_17,_PIN),ATPASTE2(EBI_ADDR_17,_FUNCTION)}, #endif #ifdef EBI_ADDR_18 {ATPASTE2(EBI_ADDR_18,_PIN),ATPASTE2(EBI_ADDR_18,_FUNCTION)}, #endif #ifdef EBI_ADDR_19 {ATPASTE2(EBI_ADDR_19,_PIN),ATPASTE2(EBI_ADDR_19,_FUNCTION)}, #endif #ifdef EBI_ADDR_20 {ATPASTE2(EBI_ADDR_20,_PIN),ATPASTE2(EBI_ADDR_20,_FUNCTION)}, #endif #ifdef EBI_ADDR_21 {ATPASTE2(EBI_ADDR_21,_PIN),ATPASTE2(EBI_ADDR_21,_FUNCTION)}, #endif #ifdef EBI_ADDR_22 {ATPASTE2(EBI_ADDR_22,_PIN),ATPASTE2(EBI_ADDR_22,_FUNCTION)}, #endif #ifdef EBI_ADDR_23 {ATPASTE2(EBI_ADDR_23,_PIN),ATPASTE2(EBI_ADDR_23,_FUNCTION)}, #endif #if SMC_DBW_GLOBAL <= 8 #undef SMC_8_BIT_CHIPS #define SMC_8_BIT_CHIPS TRUE #endif // Enable data mask pins. #if !SMC_8_BIT_CHIPS_GLOBAL #ifdef EBI_ADDR_0 {ATPASTE2(EBI_ADDR_0,_PIN),ATPASTE2(EBI_ADDR_0,_FUNCTION)}, #endif #endif #ifdef EBI_NWE0 {ATPASTE2(EBI_NWE0,_PIN),ATPASTE2(EBI_NWE0,_FUNCTION)}, #endif #if SMC_DBW_GLOBAL >= 16 #ifdef EBI_NWE1 {ATPASTE2(EBI_NWE1,_PIN),ATPASTE2(EBI_NWE1,_FUNCTION)}, #endif #if SMC_DBW_GLOBAL >= 32 #ifdef EBI_ADDR_1 {ATPASTE2(EBI_ADDR_1,_PIN),ATPASTE2(EBI_ADDR_1,_FUNCTION)}, #endif #ifdef EBI_NWE3 {ATPASTE2(EBI_NWE3,_PIN),ATPASTE2(EBI_NWE3,_FUNCTION)}, #endif #endif #endif #ifdef EBI_NRD {ATPASTE2(EBI_NRD,_PIN),ATPASTE2(EBI_NRD,_FUNCTION)}, #endif // Enable control pins. #if NWAIT_MODE_GLOBAL != AVR32_SMC_EXNW_MODE_DISABLED #ifdef EBI_NWAIT {ATPASTE2(EBI_NWAIT,_PIN),ATPASTE2(EBI_NWAIT,_FUNCTION)}, #endif #endif #ifdef SMC_USE_NCS0 #ifdef EBI_NCS_0 {ATPASTE2(EBI_NCS_0,_PIN),ATPASTE2(EBI_NCS_0,_FUNCTION)}, #endif #endif #ifdef SMC_USE_NCS1 #ifdef EBI_NCS_1 {ATPASTE2(EBI_NCS_1,_PIN),ATPASTE2(EBI_NCS_1,_FUNCTION)}, #endif #endif #ifdef SMC_USE_NCS2 #ifdef EBI_NCS_2 {ATPASTE2(EBI_NCS_2,_PIN),ATPASTE2(EBI_NCS_2,_FUNCTION)}, #endif #endif #ifdef SMC_USE_NCS3 #ifdef EBI_NCS_3 {ATPASTE2(EBI_NCS_3,_PIN),ATPASTE2(EBI_NCS_3,_FUNCTION)}, #endif #endif #ifdef SMC_USE_NCS4 #ifdef EBI_NCS_4 {ATPASTE2(EBI_NCS_4,_PIN),ATPASTE2(EBI_NCS_4,_FUNCTION)}, #endif #endif #ifdef SMC_USE_NCS5 #ifdef EBI_NCS_5 {ATPASTE2(EBI_NCS_5,_PIN),ATPASTE2(EBI_NCS_5,_FUNCTION)}, #endif #endif }; gpio_enable_module(SMC_EBI_GPIO_MAP, sizeof(SMC_EBI_GPIO_MAP) / sizeof(SMC_EBI_GPIO_MAP[0])); } unsigned char smc_get_cs_size(unsigned char cs) { return smc_tab_cs_size[cs]; } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC/smc.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief SMC on EBI driver for AVR32 UC3. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a SMC module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _SMC_H_ #define _SMC_H_ #include #include "compiler.h" #include "conf_ebi.h" /*! \brief Initializes the AVR32 SMC module and the connected SRAM(s). * \param hsb_hz HSB frequency in Hz (the HSB frequency is applied to the SMC). * \note Each access to the SMC address space validates the mode of the SMC * and generates an operation corresponding to this mode. */ extern void smc_init(unsigned long hsb_hz); /*! \brief Return the size of the peripheral connected . * \param cs The chip select value */ extern unsigned char smc_get_cs_size(unsigned char cs); #endif // _SMC_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/EIC/eic.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief EIC driver for AVR32 UC3. * * AVR32 External Interrupt Controller driver module. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with an EIC module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include #include "compiler.h" #include "preprocessor.h" #include "eic.h" void eic_init(volatile avr32_eic_t *eic, const eic_options_t *opt, unsigned int nb_lines) { int i; for (i = 0; i < nb_lines; i++) { // Set up mode level eic->mode = (opt[i].eic_mode == 1) ? (eic->mode | (1 << opt[i].eic_line)) : (eic->mode & ~(1 << opt[i].eic_line)); // Set up edge type eic->edge = (opt[i].eic_edge == 1) ? (eic->edge | (1 << opt[i].eic_line)) : (eic->edge & ~(1 << opt[i].eic_line)); // Set up level eic->level = (opt[i].eic_level == 1) ? (eic->level | (1 << opt[i].eic_line)) : (eic->level & ~(1 << opt[i].eic_line)); // Set up if filter is used eic->filter = (opt[i].eic_filter == 1) ? (eic->filter | (1 << opt[i].eic_line)) : (eic->filter & ~(1 << opt[i].eic_line)); // Set up which mode is used : asynchronous mode/ synchronous mode eic->async = (opt[i].eic_async == 1) ? (eic->async | (1 << opt[i].eic_line)) : (eic->async & ~(1 << opt[i].eic_line)); } } void eic_enable_lines(volatile avr32_eic_t *eic, unsigned int mask_lines) { eic->en = mask_lines; } void eic_enable_line(volatile avr32_eic_t *eic, unsigned int line_number) { // Enable line line_number eic->en = 1 << line_number; } void eic_disable_lines(volatile avr32_eic_t *eic, unsigned int mask_lines) { eic->dis = mask_lines; } void eic_disable_line(volatile avr32_eic_t *eic, unsigned int line_number) { // Disable line line_number eic->dis = 1 << line_number; } Bool eic_is_line_enabled(volatile avr32_eic_t *eic, unsigned int line_number) { return (eic->ctrl & (1 << line_number)) != 0; } void eic_enable_interrupt_lines(volatile avr32_eic_t *eic, unsigned int mask_lines) { eic->ier = mask_lines; } void eic_enable_interrupt_line(volatile avr32_eic_t *eic, unsigned int line_number) { // Enable line line_number eic->ier = 1 << line_number; } void eic_disable_interrupt_lines(volatile avr32_eic_t *eic, unsigned int mask_lines) { Bool global_interrupt_enabled = Is_global_interrupt_enabled(); if (global_interrupt_enabled) Disable_global_interrupt(); eic->idr = mask_lines; eic->imr; if (global_interrupt_enabled) Enable_global_interrupt(); } void eic_disable_interrupt_line(volatile avr32_eic_t *eic, unsigned int line_number) { Bool global_interrupt_enabled = Is_global_interrupt_enabled(); // Disable line line_number if (global_interrupt_enabled) Disable_global_interrupt(); eic->idr = 1 << line_number; eic->imr; if (global_interrupt_enabled) Enable_global_interrupt(); } Bool eic_is_interrupt_line_enabled(volatile avr32_eic_t *eic, unsigned int line_number) { return (eic->imr & (1 << line_number)) != 0; } void eic_clear_interrupt_lines(volatile avr32_eic_t *eic, unsigned int mask_lines) { Bool global_interrupt_enabled = Is_global_interrupt_enabled(); if (global_interrupt_enabled) Disable_global_interrupt(); eic->icr = mask_lines; eic->isr; if (global_interrupt_enabled) Enable_global_interrupt(); } void eic_clear_interrupt_line(volatile avr32_eic_t *eic, unsigned int line_number) { Bool global_interrupt_enabled = Is_global_interrupt_enabled(); // Clear line line_number if (global_interrupt_enabled) Disable_global_interrupt(); eic->icr = 1 << line_number; eic->isr; if (global_interrupt_enabled) Enable_global_interrupt(); } Bool eic_is_interrupt_line_pending(volatile avr32_eic_t *eic, unsigned int line_number) { return (eic->isr & (1 << line_number)) != 0; } #if !defined(AVR32_EIC_301_H_INCLUDED) void eic_enable_interrupt_scan(volatile avr32_eic_t *eic,unsigned int presc) { // Enable SCAN function with PRESC value eic->scan |= (presc << AVR32_EIC_SCAN_PRESC_OFFSET) | (1 << AVR32_EIC_SCAN_EN_OFFSET); } void eic_disable_interrupt_scan(volatile avr32_eic_t *eic) { // Disable SCAN function eic->scan = 0 << AVR32_EIC_SCAN_EN_OFFSET; } unsigned long eic_get_interrupt_pad_scan(volatile avr32_eic_t *eic) { // Return pad number that causes interrupt return(eic->scan>>AVR32_EIC_SCAN_PIN_OFFSET); } #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/EIC/eic.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief EIC driver for AVR32 UC3. * * AVR32 External Interrupt Controller driver module. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with an EIC module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _EIC_H_ #define _EIC_H_ #include "compiler.h" /*! \name External Interrupt lines */ //! @{ #if (UC3A || UC3B) #define EXT_INT0 AVR32_EIC_INT0 //!< Line 0 #define EXT_INT1 AVR32_EIC_INT1 //!< Line 1 #define EXT_INT2 AVR32_EIC_INT2 //!< Line 2 #define EXT_INT3 AVR32_EIC_INT3 //!< Line 3 #define EXT_INT4 AVR32_EIC_INT4 //!< Line 4 #define EXT_INT5 AVR32_EIC_INT5 //!< Line 5 #define EXT_INT6 AVR32_EIC_INT6 //!< Line 6 #define EXT_INT7 AVR32_EIC_INT7 //!< Line 7 #define EXT_NMI AVR32_EIC_NMI //!< Line 8 #else #define EXT_INT0 AVR32_EIC_INT1 //!< Line 0 #define EXT_INT1 AVR32_EIC_INT2 //!< Line 1 #define EXT_INT2 AVR32_EIC_INT3 //!< Line 2 #define EXT_INT3 AVR32_EIC_INT4 //!< Line 3 #define EXT_INT4 AVR32_EIC_INT5 //!< Line 4 #define EXT_INT5 AVR32_EIC_INT6 //!< Line 5 #define EXT_INT6 AVR32_EIC_INT7 //!< Line 6 #define EXT_INT7 AVR32_EIC_INT8 //!< Line 7 #define EXT_NMI AVR32_EIC_NMI //!< Line 8 #endif //! @} /*! \name Mode Trigger Options */ //! @{ #define EIC_MODE_EDGE_TRIGGERED AVR32_EIC_EDGE_IRQ //!< #define EIC_MODE_LEVEL_TRIGGERED AVR32_EIC_LEVEL_IRQ //!< //! @} /*! \name Edge level Options */ //! @{ #define EIC_EDGE_FALLING_EDGE AVR32_EIC_FALLING_EDGE //!< #define EIC_EDGE_RISING_EDGE AVR32_EIC_RISING_EDGE //!< //! @} /*! \name Level Options */ //! @{ #define EIC_LEVEL_LOW_LEVEL AVR32_EIC_LOW_LEVEL //!< #define EIC_LEVEL_HIGH_LEVEL AVR32_EIC_HIGH_LEVEL //!< //! @} /*! \name Filter Options */ //! @{ #define EIC_FILTER_ENABLED AVR32_EIC_FILTER_ON //!< #define EIC_FILTER_DISABLED AVR32_EIC_FILTER_OFF //!< //! @} /*! \name Synch Mode Options */ //! @{ #define EIC_SYNCH_MODE AVR32_EIC_SYNC //!< #define EIC_ASYNCH_MODE AVR32_EIC_USE_ASYNC //!< //! @} //! Configuration parameters of the EIC module. typedef struct { //!Line unsigned char eic_line; //! Mode : EDGE_LEVEL or TRIGGER_LEVEL unsigned char eic_mode; //! Edge : FALLING_EDGE or RISING_EDGE unsigned char eic_edge; //! Level : LOW_LEVEL or HIGH_LEVEL unsigned char eic_level; //! Filter: NOT_FILTERED or FILTERED unsigned char eic_filter; //! Async: SYNC mode or ASYNC unsigned char eic_async; } eic_options_t; /*! \brief Init the EIC driver. * * \param eic Base address of the EIC module * \param opt Configuration parameters of the EIC module (see \ref eic_options_t) * \param nb_lines Number of lines to consider, equal to size of opt buffer */ extern void eic_init(volatile avr32_eic_t *eic, const eic_options_t *opt, unsigned int nb_lines); /*! \brief Enable the EIC driver. * * \param eic Base address of the EIC module * \param mask_lines Mask for current selected lines */ extern void eic_enable_lines(volatile avr32_eic_t *eic, unsigned int mask_lines); /*! \brief Enable the EIC driver. * * \param eic Base address of the EIC module * \param line_number Line number to enable */ extern void eic_enable_line(volatile avr32_eic_t *eic, unsigned int line_number); /*! \brief Disable the EIC driver. * * \param eic Base address of the EIC module * \param mask_lines Mask for current selected lines */ extern void eic_disable_lines(volatile avr32_eic_t *eic, unsigned int mask_lines); /*! \brief Disable the EIC driver. * * \param eic Base address of the EIC module * \param line_number Line number to disable */ extern void eic_disable_line(volatile avr32_eic_t *eic, unsigned int line_number); /*! \brief Tells whether an EIC line is enabled. * * \param eic Base address of the EIC module * \param line_number Line number to test * * \return Whether an EIC line is enabled. */ extern Bool eic_is_line_enabled(volatile avr32_eic_t *eic, unsigned int line_number); /*! \name Interrupt Control Functions */ //! @{ /*! \brief Enable the interrupt feature of the EIC. * * \param eic Base address of the EIC (i.e. &AVR32_EIC). * \param mask_lines Mask for current selected lines */ extern void eic_enable_interrupt_lines(volatile avr32_eic_t *eic, unsigned int mask_lines); /*! \brief Enable the interrupt feature of the EIC. * * \param eic Base address of the EIC (i.e. &AVR32_EIC). * \param line_number Line number to enable */ extern void eic_enable_interrupt_line(volatile avr32_eic_t *eic, unsigned int line_number); /*! \brief Disable the interrupt feature of the EIC. * * \param eic Base address of the EIC (i.e. &AVR32_EIC). * \param mask_lines Mask for current selected lines */ extern void eic_disable_interrupt_lines(volatile avr32_eic_t *eic, unsigned int mask_lines); /*! \brief Disable the interrupt feature of the EIC. * * \param eic Base address of the EIC (i.e. &AVR32_EIC). * \param line_number Line number to disable */ extern void eic_disable_interrupt_line(volatile avr32_eic_t *eic, unsigned int line_number); /*! \brief Tells whether an EIC interrupt line is enabled. * * \param eic Base address of the EIC module * \param line_number Line number to test * * \return Whether an EIC interrupt line is enabled. */ extern Bool eic_is_interrupt_line_enabled(volatile avr32_eic_t *eic, unsigned int line_number); /*! \brief Clear the interrupt flag. * Call this function once you've handled the interrupt. * * \param eic Base address of the EIC (i.e. &AVR32_EIC). * \param mask_lines Mask for current selected lines */ extern void eic_clear_interrupt_lines(volatile avr32_eic_t *eic, unsigned int mask_lines); /*! \brief Clear the interrupt flag. * Call this function once you've handled the interrupt. * * \param eic Base address of the EIC (i.e. &AVR32_EIC). * \param line_number Line number to clear */ extern void eic_clear_interrupt_line(volatile avr32_eic_t *eic, unsigned int line_number); /*! \brief Tells whether an EIC interrupt line is pending. * * \param eic Base address of the EIC module * \param line_number Line number to test * * \return Whether an EIC interrupt line is pending. */ extern Bool eic_is_interrupt_line_pending(volatile avr32_eic_t *eic, unsigned int line_number); /*! \brief Enable the interrupt scan feature of the EIC. * * \param eic Base address of the EIC (i.e. &AVR32_EIC). * \param presc Prescale select for the keypad scan rate in the range [0,31]. */ extern void eic_enable_interrupt_scan(volatile avr32_eic_t *eic, unsigned int presc); /*! \brief Disable the interrupt scan feature of the EIC. * * \param eic Base address of the EIC (i.e. &AVR32_EIC). */ extern void eic_disable_interrupt_scan(volatile avr32_eic_t *eic); /*! \brief Return scan pad number that causes interrupt. * * \param eic Base address of the EIC (i.e. &AVR32_EIC). */ extern unsigned long eic_get_interrupt_pad_scan(volatile avr32_eic_t *eic); //! @} #endif // _EIC_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC/flashc.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief FLASHC driver for AVR32 UC3. * * AVR32 Flash Controller driver module. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a FLASHC module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include #include #include "compiler.h" #include "flashc.h" /*! \name FLASHC Writable Bit-Field Registers */ //! @{ typedef union { unsigned long fcr; avr32_flashc_fcr_t FCR; } u_avr32_flashc_fcr_t; typedef union { unsigned long fcmd; avr32_flashc_fcmd_t FCMD; } u_avr32_flashc_fcmd_t; //! @} /*! \name Flash Properties */ //! @{ unsigned int flashc_get_flash_size(void) { #if (defined AVR32_FLASHC_300_H_INCLUDED) static const unsigned int FLASH_SIZE[1 << AVR32_FLASHC_PR_FSZ_SIZE] = { 32 << 10, 64 << 10, 128 << 10, 256 << 10, 384 << 10, 512 << 10, 768 << 10, 1024 << 10 }; return FLASH_SIZE[(AVR32_FLASHC.pr & AVR32_FLASHC_PR_FSZ_MASK) >> AVR32_FLASHC_PR_FSZ_OFFSET]; #else static const unsigned int FLASH_SIZE[1 << AVR32_FLASHC_FSR_FSZ_SIZE] = { 32 << 10, 64 << 10, 128 << 10, 256 << 10, 384 << 10, 512 << 10, 768 << 10, 1024 << 10 }; return FLASH_SIZE[(AVR32_FLASHC.fsr & AVR32_FLASHC_FSR_FSZ_MASK) >> AVR32_FLASHC_FSR_FSZ_OFFSET]; #endif } unsigned int flashc_get_page_count(void) { return flashc_get_flash_size() / AVR32_FLASHC_PAGE_SIZE; } unsigned int flashc_get_page_count_per_region(void) { return flashc_get_page_count() / AVR32_FLASHC_REGIONS; } unsigned int flashc_get_page_region(int page_number) { return ((page_number >= 0) ? page_number : flashc_get_page_number()) / flashc_get_page_count_per_region(); } unsigned int flashc_get_region_first_page_number(unsigned int region) { return region * flashc_get_page_count_per_region(); } //! @} /*! \name FLASHC Control */ //! @{ unsigned int flashc_get_wait_state(void) { return (AVR32_FLASHC.fcr & AVR32_FLASHC_FCR_FWS_MASK) >> AVR32_FLASHC_FCR_FWS_OFFSET; } void flashc_set_wait_state(unsigned int wait_state) { u_avr32_flashc_fcr_t u_avr32_flashc_fcr = {AVR32_FLASHC.fcr}; u_avr32_flashc_fcr.FCR.fws = wait_state; AVR32_FLASHC.fcr = u_avr32_flashc_fcr.fcr; } Bool flashc_is_ready_int_enabled(void) { return ((AVR32_FLASHC.fcr & AVR32_FLASHC_FCR_FRDY_MASK) != 0); } void flashc_enable_ready_int(Bool enable) { u_avr32_flashc_fcr_t u_avr32_flashc_fcr = {AVR32_FLASHC.fcr}; u_avr32_flashc_fcr.FCR.frdy = (enable != FALSE); AVR32_FLASHC.fcr = u_avr32_flashc_fcr.fcr; } Bool flashc_is_lock_error_int_enabled(void) { return ((AVR32_FLASHC.fcr & AVR32_FLASHC_FCR_LOCKE_MASK) != 0); } void flashc_enable_lock_error_int(Bool enable) { u_avr32_flashc_fcr_t u_avr32_flashc_fcr = {AVR32_FLASHC.fcr}; u_avr32_flashc_fcr.FCR.locke = (enable != FALSE); AVR32_FLASHC.fcr = u_avr32_flashc_fcr.fcr; } Bool flashc_is_prog_error_int_enabled(void) { return ((AVR32_FLASHC.fcr & AVR32_FLASHC_FCR_PROGE_MASK) != 0); } void flashc_enable_prog_error_int(Bool enable) { u_avr32_flashc_fcr_t u_avr32_flashc_fcr = {AVR32_FLASHC.fcr}; u_avr32_flashc_fcr.FCR.proge = (enable != FALSE); AVR32_FLASHC.fcr = u_avr32_flashc_fcr.fcr; } //! @} /*! \name FLASHC Status */ //! @{ Bool flashc_is_ready(void) { return ((AVR32_FLASHC.fsr & AVR32_FLASHC_FSR_FRDY_MASK) != 0); } void flashc_default_wait_until_ready(void) { while (!flashc_is_ready()); } void (*volatile flashc_wait_until_ready)(void) = flashc_default_wait_until_ready; /*! \brief Gets the error status of the FLASHC. * * \return The error status of the FLASHC built up from * \c AVR32_FLASHC_FSR_LOCKE_MASK and \c AVR32_FLASHC_FSR_PROGE_MASK. * * \warning This hardware error status is cleared by all functions reading the * Flash Status Register (FSR). This function is therefore not part of * the driver's API which instead presents \ref flashc_is_lock_error * and \ref flashc_is_programming_error. */ static unsigned int flashc_get_error_status(void) { return AVR32_FLASHC.fsr & (AVR32_FLASHC_FSR_LOCKE_MASK | AVR32_FLASHC_FSR_PROGE_MASK); } //! Sticky error status of the FLASHC. //! This variable is updated by functions that issue FLASHC commands. It //! contains the cumulated FLASHC error status of all the FLASHC commands issued //! by a function. static unsigned int flashc_error_status = 0; Bool flashc_is_lock_error(void) { return ((flashc_error_status & AVR32_FLASHC_FSR_LOCKE_MASK) != 0); } Bool flashc_is_programming_error(void) { return ((flashc_error_status & AVR32_FLASHC_FSR_PROGE_MASK) != 0); } //! @} /*! \name FLASHC Command Control */ //! @{ unsigned int flashc_get_command(void) { return (AVR32_FLASHC.fcmd & AVR32_FLASHC_FCMD_CMD_MASK) >> AVR32_FLASHC_FCMD_CMD_OFFSET; } unsigned int flashc_get_page_number(void) { return (AVR32_FLASHC.fcmd & AVR32_FLASHC_FCMD_PAGEN_MASK) >> AVR32_FLASHC_FCMD_PAGEN_OFFSET; } void flashc_issue_command(unsigned int command, int page_number) { u_avr32_flashc_fcmd_t u_avr32_flashc_fcmd; flashc_wait_until_ready(); u_avr32_flashc_fcmd.fcmd = AVR32_FLASHC.fcmd; u_avr32_flashc_fcmd.FCMD.cmd = command; if (page_number >= 0) u_avr32_flashc_fcmd.FCMD.pagen = page_number; u_avr32_flashc_fcmd.FCMD.key = AVR32_FLASHC_FCMD_KEY_KEY; AVR32_FLASHC.fcmd = u_avr32_flashc_fcmd.fcmd; flashc_error_status = flashc_get_error_status(); flashc_wait_until_ready(); } //! @} /*! \name FLASHC Global Commands */ //! @{ void flashc_no_operation(void) { flashc_issue_command(AVR32_FLASHC_FCMD_CMD_NOP, -1); } void flashc_erase_all(void) { flashc_issue_command(AVR32_FLASHC_FCMD_CMD_EA, -1); } //! @} /*! \name FLASHC Protection Mechanisms */ //! @{ Bool flashc_is_security_bit_active(void) { return ((AVR32_FLASHC.fsr & AVR32_FLASHC_FSR_SECURITY_MASK) != 0); } void flashc_activate_security_bit(void) { flashc_issue_command(AVR32_FLASHC_FCMD_CMD_SSB, -1); } unsigned int flashc_get_bootloader_protected_size(void) { unsigned int bootprot = (1 << AVR32_FLASHC_FGPFRLO_BOOTPROT_SIZE) - 1 - flashc_read_gp_fuse_bitfield(AVR32_FLASHC_FGPFRLO_BOOTPROT_OFFSET, AVR32_FLASHC_FGPFRLO_BOOTPROT_SIZE); return (bootprot) ? AVR32_FLASHC_PAGE_SIZE << bootprot : 0; } unsigned int flashc_set_bootloader_protected_size(unsigned int bootprot_size) { flashc_set_gp_fuse_bitfield(AVR32_FLASHC_FGPFRLO_BOOTPROT_OFFSET, AVR32_FLASHC_FGPFRLO_BOOTPROT_SIZE, (1 << AVR32_FLASHC_FGPFRLO_BOOTPROT_SIZE) - 1 - ((bootprot_size) ? 32 - clz((((min(max(bootprot_size, AVR32_FLASHC_PAGE_SIZE << 1), AVR32_FLASHC_PAGE_SIZE << ((1 << AVR32_FLASHC_FGPFRLO_BOOTPROT_SIZE) - 1)) + AVR32_FLASHC_PAGE_SIZE - 1) / AVR32_FLASHC_PAGE_SIZE) << 1) - 1) - 1 : 0)); return flashc_get_bootloader_protected_size(); } Bool flashc_is_external_privileged_fetch_locked(void) { return (!flashc_read_gp_fuse_bit(AVR32_FLASHC_FGPFRLO_EPFL_OFFSET)); } void flashc_lock_external_privileged_fetch(Bool lock) { flashc_set_gp_fuse_bit(AVR32_FLASHC_FGPFRLO_EPFL_OFFSET, !lock); } Bool flashc_is_page_region_locked(int page_number) { return flashc_is_region_locked(flashc_get_page_region(page_number)); } Bool flashc_is_region_locked(unsigned int region) { return ((AVR32_FLASHC.fsr & AVR32_FLASHC_FSR_LOCK0_MASK << (region & (AVR32_FLASHC_REGIONS - 1))) != 0); } void flashc_lock_page_region(int page_number, Bool lock) { flashc_issue_command((lock) ? AVR32_FLASHC_FCMD_CMD_LP : AVR32_FLASHC_FCMD_CMD_UP, page_number); } void flashc_lock_region(unsigned int region, Bool lock) { flashc_lock_page_region(flashc_get_region_first_page_number(region), lock); } void flashc_lock_all_regions(Bool lock) { unsigned int error_status = 0; unsigned int region = AVR32_FLASHC_REGIONS; while (region) { flashc_lock_region(--region, lock); error_status |= flashc_error_status; } flashc_error_status = error_status; } //! @} /*! \name Access to General-Purpose Fuses */ //! @{ Bool flashc_read_gp_fuse_bit(unsigned int gp_fuse_bit) { return ((flashc_read_all_gp_fuses() & 1ULL << (gp_fuse_bit & 0x3F)) != 0); } U64 flashc_read_gp_fuse_bitfield(unsigned int pos, unsigned int width) { return flashc_read_all_gp_fuses() >> (pos & 0x3F) & ((1ULL << min(width, 64)) - 1); } U8 flashc_read_gp_fuse_byte(unsigned int gp_fuse_byte) { return flashc_read_all_gp_fuses() >> ((gp_fuse_byte & 0x07) << 3); } U64 flashc_read_all_gp_fuses(void) { return AVR32_FLASHC.fgpfrlo | (U64)AVR32_FLASHC.fgpfrhi << 32; } Bool flashc_erase_gp_fuse_bit(unsigned int gp_fuse_bit, Bool check) { flashc_issue_command(AVR32_FLASHC_FCMD_CMD_EGPB, gp_fuse_bit & 0x3F); return (check) ? flashc_read_gp_fuse_bit(gp_fuse_bit) : TRUE; } Bool flashc_erase_gp_fuse_bitfield(unsigned int pos, unsigned int width, Bool check) { unsigned int error_status = 0; unsigned int gp_fuse_bit; pos &= 0x3F; width = min(width, 64); for (gp_fuse_bit = pos; gp_fuse_bit < pos + width; gp_fuse_bit++) { flashc_erase_gp_fuse_bit(gp_fuse_bit, FALSE); error_status |= flashc_error_status; } flashc_error_status = error_status; return (check) ? (flashc_read_gp_fuse_bitfield(pos, width) == (1ULL << width) - 1) : TRUE; } Bool flashc_erase_gp_fuse_byte(unsigned int gp_fuse_byte, Bool check) { unsigned int error_status; unsigned int current_gp_fuse_byte; U64 value = flashc_read_all_gp_fuses(); flashc_erase_all_gp_fuses(FALSE); error_status = flashc_error_status; for (current_gp_fuse_byte = 0; current_gp_fuse_byte < 8; current_gp_fuse_byte++, value >>= 8) { if (current_gp_fuse_byte != gp_fuse_byte) { flashc_write_gp_fuse_byte(current_gp_fuse_byte, value); error_status |= flashc_error_status; } } flashc_error_status = error_status; return (check) ? (flashc_read_gp_fuse_byte(gp_fuse_byte) == 0xFF) : TRUE; } Bool flashc_erase_all_gp_fuses(Bool check) { flashc_issue_command(AVR32_FLASHC_FCMD_CMD_EAGPF, -1); return (check) ? (flashc_read_all_gp_fuses() == 0xFFFFFFFFFFFFFFFFULL) : TRUE; } void flashc_write_gp_fuse_bit(unsigned int gp_fuse_bit, Bool value) { if (!value) flashc_issue_command(AVR32_FLASHC_FCMD_CMD_WGPB, gp_fuse_bit & 0x3F); } void flashc_write_gp_fuse_bitfield(unsigned int pos, unsigned int width, U64 value) { unsigned int error_status = 0; unsigned int gp_fuse_bit; pos &= 0x3F; width = min(width, 64); for (gp_fuse_bit = pos; gp_fuse_bit < pos + width; gp_fuse_bit++, value >>= 1) { flashc_write_gp_fuse_bit(gp_fuse_bit, value & 0x01); error_status |= flashc_error_status; } flashc_error_status = error_status; } void flashc_write_gp_fuse_byte(unsigned int gp_fuse_byte, U8 value) { flashc_issue_command(AVR32_FLASHC_FCMD_CMD_PGPFB, (gp_fuse_byte & 0x07) | value << 3); } void flashc_write_all_gp_fuses(U64 value) { unsigned int error_status = 0; unsigned int gp_fuse_byte; for (gp_fuse_byte = 0; gp_fuse_byte < 8; gp_fuse_byte++, value >>= 8) { flashc_write_gp_fuse_byte(gp_fuse_byte, value); error_status |= flashc_error_status; } flashc_error_status = error_status; } void flashc_set_gp_fuse_bit(unsigned int gp_fuse_bit, Bool value) { if (value) flashc_erase_gp_fuse_bit(gp_fuse_bit, FALSE); else flashc_write_gp_fuse_bit(gp_fuse_bit, FALSE); } void flashc_set_gp_fuse_bitfield(unsigned int pos, unsigned int width, U64 value) { unsigned int error_status = 0; unsigned int gp_fuse_bit; pos &= 0x3F; width = min(width, 64); for (gp_fuse_bit = pos; gp_fuse_bit < pos + width; gp_fuse_bit++, value >>= 1) { flashc_set_gp_fuse_bit(gp_fuse_bit, value & 0x01); error_status |= flashc_error_status; } flashc_error_status = error_status; } void flashc_set_gp_fuse_byte(unsigned int gp_fuse_byte, U8 value) { unsigned int error_status; switch (value) { case 0xFF: flashc_erase_gp_fuse_byte(gp_fuse_byte, FALSE); break; case 0x00: flashc_write_gp_fuse_byte(gp_fuse_byte, 0x00); break; default: flashc_erase_gp_fuse_byte(gp_fuse_byte, FALSE); error_status = flashc_error_status; flashc_write_gp_fuse_byte(gp_fuse_byte, value); flashc_error_status |= error_status; } } void flashc_set_all_gp_fuses(U64 value) { unsigned int error_status; switch (value) { case 0xFFFFFFFFFFFFFFFFULL: flashc_erase_all_gp_fuses(FALSE); break; case 0x0000000000000000ULL: flashc_write_all_gp_fuses(0x0000000000000000ULL); break; default: flashc_erase_all_gp_fuses(FALSE); error_status = flashc_error_status; flashc_write_all_gp_fuses(value); flashc_error_status |= error_status; } } //! @} /*! \name Access to Flash Pages */ //! @{ void flashc_clear_page_buffer(void) { flashc_issue_command(AVR32_FLASHC_FCMD_CMD_CPB, -1); } Bool flashc_is_page_erased(void) { return ((AVR32_FLASHC.fsr & AVR32_FLASHC_FSR_QPRR_MASK) != 0); } Bool flashc_quick_page_read(int page_number) { flashc_issue_command(AVR32_FLASHC_FCMD_CMD_QPR, page_number); return flashc_is_page_erased(); } Bool flashc_erase_page(int page_number, Bool check) { Bool page_erased = TRUE; flashc_issue_command(AVR32_FLASHC_FCMD_CMD_EP, page_number); if (check) { unsigned int error_status = flashc_error_status; page_erased = flashc_quick_page_read(-1); flashc_error_status |= error_status; } return page_erased; } Bool flashc_erase_all_pages(Bool check) { Bool all_pages_erased = TRUE; unsigned int error_status = 0; unsigned int page_number = flashc_get_page_count(); while (page_number) { all_pages_erased &= flashc_erase_page(--page_number, check); error_status |= flashc_error_status; } flashc_error_status = error_status; return all_pages_erased; } void flashc_write_page(int page_number) { flashc_issue_command(AVR32_FLASHC_FCMD_CMD_WP, page_number); } Bool flashc_quick_user_page_read(void) { flashc_issue_command(AVR32_FLASHC_FCMD_CMD_QPRUP, -1); return flashc_is_page_erased(); } Bool flashc_erase_user_page(Bool check) { flashc_issue_command(AVR32_FLASHC_FCMD_CMD_EUP, -1); return (check) ? flashc_quick_user_page_read() : TRUE; } void flashc_write_user_page(void) { flashc_issue_command(AVR32_FLASHC_FCMD_CMD_WUP, -1); } volatile void *flashc_memset8(volatile void *dst, U8 src, size_t nbytes, Bool erase) { return flashc_memset16(dst, src | (U16)src << 8, nbytes, erase); } volatile void *flashc_memset16(volatile void *dst, U16 src, size_t nbytes, Bool erase) { return flashc_memset32(dst, src | (U32)src << 16, nbytes, erase); } volatile void *flashc_memset32(volatile void *dst, U32 src, size_t nbytes, Bool erase) { return flashc_memset64(dst, src | (U64)src << 32, nbytes, erase); } volatile void *flashc_memset64(volatile void *dst, U64 src, size_t nbytes, Bool erase) { // Use aggregated pointers to have several alignments available for a same address. UnionCVPtr flash_array_end; UnionVPtr dest; Union64 source = {0}; StructCVPtr dest_end; UnionCVPtr flash_page_source_end; Bool incomplete_flash_page_end; Union64 flash_dword; UnionVPtr tmp; unsigned int error_status = 0; unsigned int i; // Reformat arguments. flash_array_end.u8ptr = AVR32_FLASH + flashc_get_flash_size(); dest.u8ptr = dst; for (i = (Get_align((U32)dest.u8ptr, sizeof(U64)) - 1) & (sizeof(U64) - 1); src; i = (i - 1) & (sizeof(U64) - 1)) { source.u8[i] = src; src >>= 8; } dest_end.u8ptr = dest.u8ptr + nbytes; // If destination is outside flash, go to next flash page if any. if (dest.u8ptr < AVR32_FLASH) { dest.u8ptr = AVR32_FLASH; } else if (flash_array_end.u8ptr <= dest.u8ptr && dest.u8ptr < AVR32_FLASHC_USER_PAGE) { dest.u8ptr = AVR32_FLASHC_USER_PAGE; } // If end of destination is outside flash, move it to the end of the previous flash page if any. if (dest_end.u8ptr > AVR32_FLASHC_USER_PAGE + AVR32_FLASHC_USER_PAGE_SIZE) { dest_end.u8ptr = AVR32_FLASHC_USER_PAGE + AVR32_FLASHC_USER_PAGE_SIZE; } else if (AVR32_FLASHC_USER_PAGE >= dest_end.u8ptr && dest_end.u8ptr > flash_array_end.u8ptr) { dest_end.u8ptr = flash_array_end.u8ptr; } // Align each end of destination pointer with its natural boundary. dest_end.u16ptr = (U16 *)Align_down((U32)dest_end.u8ptr, sizeof(U16)); dest_end.u32ptr = (U32 *)Align_down((U32)dest_end.u16ptr, sizeof(U32)); dest_end.u64ptr = (U64 *)Align_down((U32)dest_end.u32ptr, sizeof(U64)); // While end of destination is not reached... while (dest.u8ptr < dest_end.u8ptr) { // Clear the page buffer in order to prepare data for a flash page write. flashc_clear_page_buffer(); error_status |= flashc_error_status; // Determine where the source data will end in the current flash page. flash_page_source_end.u64ptr = (U64 *)min((U32)dest_end.u64ptr, Align_down((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE) + AVR32_FLASHC_PAGE_SIZE); // Determine if the current destination page has an incomplete end. incomplete_flash_page_end = (Align_down((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE) >= Align_down((U32)dest_end.u8ptr, AVR32_FLASHC_PAGE_SIZE)); // Use a flash double-word buffer to manage unaligned accesses. flash_dword.u64 = source.u64; // If destination does not point to the beginning of the current flash page... if (!Test_align((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE)) { // Fill the beginning of the page buffer with the current flash page data. // This is required by the hardware, even if page erase is not requested, // in order to be able to write successfully to erased parts of flash // pages that have already been written to. for (tmp.u8ptr = (U8 *)Align_down((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE); tmp.u64ptr < (U64 *)Align_down((U32)dest.u8ptr, sizeof(U64)); tmp.u64ptr++) *tmp.u64ptr = *tmp.u64ptr; // If destination is not 64-bit aligned... if (!Test_align((U32)dest.u8ptr, sizeof(U64))) { // Fill the beginning of the flash double-word buffer with the current // flash page data. // This is required by the hardware, even if page erase is not // requested, in order to be able to write successfully to erased parts // of flash pages that have already been written to. for (i = 0; i < Get_align((U32)dest.u8ptr, sizeof(U64)); i++) flash_dword.u8[i] = *tmp.u8ptr++; // Align the destination pointer with its 64-bit boundary. dest.u64ptr = (U64 *)Align_down((U32)dest.u8ptr, sizeof(U64)); // If the current destination double-word is not the last one... if (dest.u64ptr < dest_end.u64ptr) { // Write the flash double-word buffer to the page buffer and reinitialize it. *dest.u64ptr++ = flash_dword.u64; flash_dword.u64 = source.u64; } } } // Write the source data to the page buffer with 64-bit alignment. for (i = flash_page_source_end.u64ptr - dest.u64ptr; i; i--) *dest.u64ptr++ = source.u64; // If the current destination page has an incomplete end... if (incomplete_flash_page_end) { // This is required by the hardware, even if page erase is not requested, // in order to be able to write successfully to erased parts of flash // pages that have already been written to. { tmp.u8ptr = (volatile U8 *)dest_end.u8ptr; // If end of destination is not 64-bit aligned... if (!Test_align((U32)dest_end.u8ptr, sizeof(U64))) { // Fill the end of the flash double-word buffer with the current flash page data. for (i = Get_align((U32)dest_end.u8ptr, sizeof(U64)); i < sizeof(U64); i++) flash_dword.u8[i] = *tmp.u8ptr++; // Write the flash double-word buffer to the page buffer. *dest.u64ptr++ = flash_dword.u64; } // Fill the end of the page buffer with the current flash page data. for (; !Test_align((U32)tmp.u64ptr, AVR32_FLASHC_PAGE_SIZE); tmp.u64ptr++) *tmp.u64ptr = *tmp.u64ptr; } } // If the current flash page is in the flash array... if (dest.u8ptr <= AVR32_FLASHC_USER_PAGE) { // Erase the current page if requested and write it from the page buffer. if (erase) { flashc_erase_page(-1, FALSE); error_status |= flashc_error_status; } flashc_write_page(-1); error_status |= flashc_error_status; // If the end of the flash array is reached, go to the User page. if (dest.u8ptr >= flash_array_end.u8ptr) dest.u8ptr = AVR32_FLASHC_USER_PAGE; } // If the current flash page is the User page... else { // Erase the User page if requested and write it from the page buffer. if (erase) { flashc_erase_user_page(FALSE); error_status |= flashc_error_status; } flashc_write_user_page(); error_status |= flashc_error_status; } } // Update the FLASHC error status. flashc_error_status = error_status; // Return the initial destination pointer as the standard memset function does. return dst; } volatile void *flashc_memcpy(volatile void *dst, const void *src, size_t nbytes, Bool erase) { // Use aggregated pointers to have several alignments available for a same address. UnionCVPtr flash_array_end; UnionVPtr dest; UnionCPtr source; StructCVPtr dest_end; UnionCVPtr flash_page_source_end; Bool incomplete_flash_page_end; Union64 flash_dword; Bool flash_dword_pending = FALSE; UnionVPtr tmp; unsigned int error_status = 0; unsigned int i, j; // Reformat arguments. flash_array_end.u8ptr = AVR32_FLASH + flashc_get_flash_size(); dest.u8ptr = dst; source.u8ptr = src; dest_end.u8ptr = dest.u8ptr + nbytes; // If destination is outside flash, go to next flash page if any. if (dest.u8ptr < AVR32_FLASH) { source.u8ptr += AVR32_FLASH - dest.u8ptr; dest.u8ptr = AVR32_FLASH; } else if (flash_array_end.u8ptr <= dest.u8ptr && dest.u8ptr < AVR32_FLASHC_USER_PAGE) { source.u8ptr += AVR32_FLASHC_USER_PAGE - dest.u8ptr; dest.u8ptr = AVR32_FLASHC_USER_PAGE; } // If end of destination is outside flash, move it to the end of the previous flash page if any. if (dest_end.u8ptr > AVR32_FLASHC_USER_PAGE + AVR32_FLASHC_USER_PAGE_SIZE) { dest_end.u8ptr = AVR32_FLASHC_USER_PAGE + AVR32_FLASHC_USER_PAGE_SIZE; } else if (AVR32_FLASHC_USER_PAGE >= dest_end.u8ptr && dest_end.u8ptr > flash_array_end.u8ptr) { dest_end.u8ptr = flash_array_end.u8ptr; } // Align each end of destination pointer with its natural boundary. dest_end.u16ptr = (U16 *)Align_down((U32)dest_end.u8ptr, sizeof(U16)); dest_end.u32ptr = (U32 *)Align_down((U32)dest_end.u16ptr, sizeof(U32)); dest_end.u64ptr = (U64 *)Align_down((U32)dest_end.u32ptr, sizeof(U64)); // While end of destination is not reached... while (dest.u8ptr < dest_end.u8ptr) { // Clear the page buffer in order to prepare data for a flash page write. flashc_clear_page_buffer(); error_status |= flashc_error_status; // Determine where the source data will end in the current flash page. flash_page_source_end.u64ptr = (U64 *)min((U32)dest_end.u64ptr, Align_down((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE) + AVR32_FLASHC_PAGE_SIZE); // Determine if the current destination page has an incomplete end. incomplete_flash_page_end = (Align_down((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE) >= Align_down((U32)dest_end.u8ptr, AVR32_FLASHC_PAGE_SIZE)); // If destination does not point to the beginning of the current flash page... if (!Test_align((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE)) { // Fill the beginning of the page buffer with the current flash page data. // This is required by the hardware, even if page erase is not requested, // in order to be able to write successfully to erased parts of flash // pages that have already been written to. for (tmp.u8ptr = (U8 *)Align_down((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE); tmp.u64ptr < (U64 *)Align_down((U32)dest.u8ptr, sizeof(U64)); tmp.u64ptr++) *tmp.u64ptr = *tmp.u64ptr; // If destination is not 64-bit aligned... if (!Test_align((U32)dest.u8ptr, sizeof(U64))) { // Fill the beginning of the flash double-word buffer with the current // flash page data. // This is required by the hardware, even if page erase is not // requested, in order to be able to write successfully to erased parts // of flash pages that have already been written to. for (i = 0; i < Get_align((U32)dest.u8ptr, sizeof(U64)); i++) flash_dword.u8[i] = *tmp.u8ptr++; // Fill the end of the flash double-word buffer with the source data. for (; i < sizeof(U64); i++) flash_dword.u8[i] = *source.u8ptr++; // Align the destination pointer with its 64-bit boundary. dest.u64ptr = (U64 *)Align_down((U32)dest.u8ptr, sizeof(U64)); // If the current destination double-word is not the last one... if (dest.u64ptr < dest_end.u64ptr) { // Write the flash double-word buffer to the page buffer. *dest.u64ptr++ = flash_dword.u64; } // If the current destination double-word is the last one, the flash // double-word buffer must be kept for later. else flash_dword_pending = TRUE; } } // Read the source data with the maximal possible alignment and write it to // the page buffer with 64-bit alignment. switch (Get_align((U32)source.u8ptr, sizeof(U32))) { case 0: for (i = flash_page_source_end.u64ptr - dest.u64ptr; i; i--) *dest.u64ptr++ = *source.u64ptr++; break; case sizeof(U16): for (i = flash_page_source_end.u64ptr - dest.u64ptr; i; i--) { for (j = 0; j < sizeof(U64) / sizeof(U16); j++) flash_dword.u16[j] = *source.u16ptr++; *dest.u64ptr++ = flash_dword.u64; } break; default: for (i = flash_page_source_end.u64ptr - dest.u64ptr; i; i--) { for (j = 0; j < sizeof(U64); j++) flash_dword.u8[j] = *source.u8ptr++; *dest.u64ptr++ = flash_dword.u64; } } // If the current destination page has an incomplete end... if (incomplete_flash_page_end) { // If the flash double-word buffer is in use, do not initialize it. if (flash_dword_pending) i = Get_align((U32)dest_end.u8ptr, sizeof(U64)); // If the flash double-word buffer is free... else { // Fill the beginning of the flash double-word buffer with the source data. for (i = 0; i < Get_align((U32)dest_end.u8ptr, sizeof(U64)); i++) flash_dword.u8[i] = *source.u8ptr++; } // This is required by the hardware, even if page erase is not requested, // in order to be able to write successfully to erased parts of flash // pages that have already been written to. { tmp.u8ptr = (volatile U8 *)dest_end.u8ptr; // If end of destination is not 64-bit aligned... if (!Test_align((U32)dest_end.u8ptr, sizeof(U64))) { // Fill the end of the flash double-word buffer with the current flash page data. for (; i < sizeof(U64); i++) flash_dword.u8[i] = *tmp.u8ptr++; // Write the flash double-word buffer to the page buffer. *dest.u64ptr++ = flash_dword.u64; } // Fill the end of the page buffer with the current flash page data. for (; !Test_align((U32)tmp.u64ptr, AVR32_FLASHC_PAGE_SIZE); tmp.u64ptr++) *tmp.u64ptr = *tmp.u64ptr; } } // If the current flash page is in the flash array... if (dest.u8ptr <= AVR32_FLASHC_USER_PAGE) { // Erase the current page if requested and write it from the page buffer. if (erase) { flashc_erase_page(-1, FALSE); error_status |= flashc_error_status; } flashc_write_page(-1); error_status |= flashc_error_status; // If the end of the flash array is reached, go to the User page. if (dest.u8ptr >= flash_array_end.u8ptr) { source.u8ptr += AVR32_FLASHC_USER_PAGE - dest.u8ptr; dest.u8ptr = AVR32_FLASHC_USER_PAGE; } } // If the current flash page is the User page... else { // Erase the User page if requested and write it from the page buffer. if (erase) { flashc_erase_user_page(FALSE); error_status |= flashc_error_status; } flashc_write_user_page(); error_status |= flashc_error_status; } } // Update the FLASHC error status. flashc_error_status = error_status; // Return the initial destination pointer as the standard memcpy function does. return dst; } #if UC3C void flashc_set_flash_waitstate_and_readmode(unsigned long cpu_f_hz) { //! Device-specific data #undef AVR32_FLASHC_FWS_0_MAX_FREQ #undef AVR32_FLASHC_FWS_1_MAX_FREQ #undef AVR32_FLASHC_HSEN_FWS_0_MAX_FREQ #undef AVR32_FLASHC_HSEN_FWS_1_MAX_FREQ #define AVR32_FLASHC_FWS_0_MAX_FREQ 33000000 #define AVR32_FLASHC_FWS_1_MAX_FREQ 66000000 #define AVR32_FLASHC_HSEN_FWS_0_MAX_FREQ 33000000 #define AVR32_FLASHC_HSEN_FWS_1_MAX_FREQ 72000000 // These defines are missing from or wrong in the toolchain header files uc3cxxx.h // Put a Bugzilla if(cpu_f_hz > AVR32_FLASHC_HSEN_FWS_0_MAX_FREQ) // > 33MHz { // Set a wait-state flashc_set_wait_state(1); if(cpu_f_hz <= AVR32_FLASHC_FWS_1_MAX_FREQ) // <= 66MHz and >33Mhz { // Disable the high-speed read mode. flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSDIS, -1); } else // > 66Mhz { // Enable the high-speed read mode. flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSEN, -1); } } else // <= 33 MHz { // Disable wait-state flashc_set_wait_state(0); // Disable the high-speed read mode. flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSDIS, -1); } } #endif // UC3C device-specific implementation //! @} ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC/flashc.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief FLASHC driver for AVR32 UC3. * * AVR32 Flash Controller driver module. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a FLASHC module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _FLASHC_H_ #define _FLASHC_H_ #include #include #include "compiler.h" //! Number of flash regions defined by the FLASHC. #define AVR32_FLASHC_REGIONS (AVR32_FLASHC_FLASH_SIZE /\ (AVR32_FLASHC_PAGES_PR_REGION * AVR32_FLASHC_PAGE_SIZE)) /*! \name Flash Properties */ //! @{ /*! \brief Gets the size of the whole flash array. * * \return The size of the whole flash array in bytes. */ extern unsigned int flashc_get_flash_size(void); /*! \brief Gets the total number of pages in the flash array. * * \return The total number of pages in the flash array. */ extern unsigned int flashc_get_page_count(void); /*! \brief Gets the number of pages in each flash region. * * \return The number of pages in each flash region. */ extern unsigned int flashc_get_page_count_per_region(void); /*! \brief Gets the region number of a page. * * \param page_number The page number: * \arg \c 0 to (flashc_get_page_count() - 1): a page number within * the flash array; * \arg < 0: the current page number. * * \return The region number of the specified page. */ extern unsigned int flashc_get_page_region(int page_number); /*! \brief Gets the number of the first page of a region. * * \param region The region number: \c 0 to (AVR32_FLASHC_REGIONS - 1). * * \return The number of the first page of the specified region. */ extern unsigned int flashc_get_region_first_page_number(unsigned int region); //! @} /*! \name FLASHC Control */ //! @{ /*! \brief Gets the number of wait states of flash read accesses. * * \return The number of wait states of flash read accesses. */ extern unsigned int flashc_get_wait_state(void); /*! \brief Sets the number of wait states of flash read accesses. * * \param wait_state The number of wait states of flash read accesses: \c 0 to * \c 1. */ extern void flashc_set_wait_state(unsigned int wait_state); /*! \brief Tells whether the Flash Ready interrupt is enabled. * * \return Whether the Flash Ready interrupt is enabled. */ extern Bool flashc_is_ready_int_enabled(void); /*! \brief Enables or disables the Flash Ready interrupt. * * \param enable Whether to enable the Flash Ready interrupt: \c TRUE or * \c FALSE. */ extern void flashc_enable_ready_int(Bool enable); /*! \brief Tells whether the Lock Error interrupt is enabled. * * \return Whether the Lock Error interrupt is enabled. */ extern Bool flashc_is_lock_error_int_enabled(void); /*! \brief Enables or disables the Lock Error interrupt. * * \param enable Whether to enable the Lock Error interrupt: \c TRUE or * \c FALSE. */ extern void flashc_enable_lock_error_int(Bool enable); /*! \brief Tells whether the Programming Error interrupt is enabled. * * \return Whether the Programming Error interrupt is enabled. */ extern Bool flashc_is_prog_error_int_enabled(void); /*! \brief Enables or disables the Programming Error interrupt. * * \param enable Whether to enable the Programming Error interrupt: \c TRUE or * \c FALSE. */ extern void flashc_enable_prog_error_int(Bool enable); //! @} /*! \name FLASHC Status */ //! @{ /*! \brief Tells whether the FLASHC is ready to run a new command. * * \return Whether the FLASHC is ready to run a new command. */ extern Bool flashc_is_ready(void); /*! \brief Waits actively until the FLASHC is ready to run a new command. * * This is the default function assigned to \ref flashc_wait_until_ready. */ extern void flashc_default_wait_until_ready(void); //! Pointer to the function used by the driver when it needs to wait until the //! FLASHC is ready to run a new command. //! The default function is \ref flashc_default_wait_until_ready. //! The user may change this pointer to use another implementation. extern void (*volatile flashc_wait_until_ready)(void); /*! \brief Tells whether a Lock Error has occurred during the last function * called that issued one or more FLASHC commands. * * \return Whether a Lock Error has occurred during the last function called * that issued one or more FLASHC commands. */ extern Bool flashc_is_lock_error(void); /*! \brief Tells whether a Programming Error has occurred during the last * function called that issued one or more FLASHC commands. * * \return Whether a Programming Error has occurred during the last function * called that issued one or more FLASHC commands. */ extern Bool flashc_is_programming_error(void); //! @} /*! \name FLASHC Command Control */ //! @{ /*! \brief Gets the last issued FLASHC command. * * \return The last issued FLASHC command. */ extern unsigned int flashc_get_command(void); /*! \brief Gets the current FLASHC page number. * * \return The current FLASHC page number. */ extern unsigned int flashc_get_page_number(void); /*! \brief Issues a FLASHC command. * * \param command The command: \c AVR32_FLASHC_FCMD_CMD_x. * \param page_number The page number to apply the command to: * \arg \c 0 to (flashc_get_page_count() - 1): a page number within * the flash array; * \arg < 0: use this to apply the command to the current page number * or if the command does not apply to any page number; * \arg this argument may have other meanings according to the command. See * the FLASHC chapter of the MCU datasheet. * * \warning A Lock Error is issued if the command violates the protection * mechanism. * * \warning A Programming Error is issued if the command is invalid. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern void flashc_issue_command(unsigned int command, int page_number); //! @} /*! \name FLASHC Global Commands */ //! @{ /*! \brief Issues a No Operation command to the FLASHC. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern void flashc_no_operation(void); /*! \brief Issues an Erase All command to the FLASHC. * * This command erases all bits in the flash array, the general-purpose fuse * bits and the Security bit. The User page is not erased. * * This command also ensures that all volatile memories, such as register file * and RAMs, are erased before the Security bit is erased, i.e. deactivated. * * \warning A Lock Error is issued if at least one region is locked or the * bootloader protection is active. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note An erase operation can only set bits. */ extern void flashc_erase_all(void); //! @} /*! \name FLASHC Protection Mechanisms */ //! @{ /*! \brief Tells whether the Security bit is active. * * \return Whether the Security bit is active. */ extern Bool flashc_is_security_bit_active(void); /*! \brief Activates the Security bit. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern void flashc_activate_security_bit(void); /*! \brief Gets the bootloader protected size. * * \return The bootloader protected size in bytes. */ extern unsigned int flashc_get_bootloader_protected_size(void); /*! \brief Sets the bootloader protected size. * * \param bootprot_size The wanted bootloader protected size in bytes. If this * size is not supported, the actual size will be the * nearest greater available size or the maximal possible * size if the requested size is too large. * * \return The actual bootloader protected size in bytes. * * \warning A Lock Error is issued if the Security bit is active. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern unsigned int flashc_set_bootloader_protected_size(unsigned int bootprot_size); /*! \brief Tells whether external privileged fetch is locked. * * \return Whether external privileged fetch is locked. */ extern Bool flashc_is_external_privileged_fetch_locked(void); /*! \brief Locks or unlocks external privileged fetch. * * \param lock Whether to lock external privileged fetch: \c TRUE or \c FALSE. * * \warning A Lock Error is issued if the Security bit is active. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern void flashc_lock_external_privileged_fetch(Bool lock); /*! \brief Tells whether the region of a page is locked. * * \param page_number The page number: * \arg \c 0 to (flashc_get_page_count() - 1): a page number within * the flash array; * \arg < 0: the current page number. * * \return Whether the region of the specified page is locked. */ extern Bool flashc_is_page_region_locked(int page_number); /*! \brief Tells whether a region is locked. * * \param region The region number: \c 0 to (AVR32_FLASHC_REGIONS - 1). * * \return Whether the specified region is locked. */ extern Bool flashc_is_region_locked(unsigned int region); /*! \brief Locks or unlocks the region of a page. * * \param page_number The page number: * \arg \c 0 to (flashc_get_page_count() - 1): a page number within * the flash array; * \arg < 0: the current page number. * \param lock Whether to lock the region of the specified page: \c TRUE or * \c FALSE. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern void flashc_lock_page_region(int page_number, Bool lock); /*! \brief Locks or unlocks a region. * * \param region The region number: \c 0 to (AVR32_FLASHC_REGIONS - 1). * \param lock Whether to lock the specified region: \c TRUE or \c FALSE. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern void flashc_lock_region(unsigned int region, Bool lock); /*! \brief Locks or unlocks all regions. * * \param lock Whether to lock the regions: \c TRUE or \c FALSE. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern void flashc_lock_all_regions(Bool lock); //! @} /*! \name Access to General-Purpose Fuses */ //! @{ /*! \brief Reads a general-purpose fuse bit. * * \param gp_fuse_bit The general-purpose fuse bit: \c 0 to \c 63. * * \return The value of the specified general-purpose fuse bit. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern Bool flashc_read_gp_fuse_bit(unsigned int gp_fuse_bit); /*! \brief Reads a general-purpose fuse bit-field. * * \param pos The bit-position of the general-purpose fuse bit-field: \c 0 to * \c 63. * \param width The bit-width of the general-purpose fuse bit-field: \c 0 to * \c 64. * * \return The value of the specified general-purpose fuse bit-field. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern U64 flashc_read_gp_fuse_bitfield(unsigned int pos, unsigned int width); /*! \brief Reads a general-purpose fuse byte. * * \param gp_fuse_byte The general-purpose fuse byte: \c 0 to \c 7. * * \return The value of the specified general-purpose fuse byte. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern U8 flashc_read_gp_fuse_byte(unsigned int gp_fuse_byte); /*! \brief Reads all general-purpose fuses. * * \return The value of all general-purpose fuses as a word. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern U64 flashc_read_all_gp_fuses(void); /*! \brief Erases a general-purpose fuse bit. * * \param gp_fuse_bit The general-purpose fuse bit: \c 0 to \c 63. * \param check Whether to check erase: \c TRUE or \c FALSE. * * \return Whether the erase succeeded or always \c TRUE if erase check was not * requested. * * \warning A Lock Error is issued if the Security bit is active and the command * is applied to BOOTPROT or EPFL fuses. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note An erase operation can only set bits. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern Bool flashc_erase_gp_fuse_bit(unsigned int gp_fuse_bit, Bool check); /*! \brief Erases a general-purpose fuse bit-field. * * \param pos The bit-position of the general-purpose fuse bit-field: \c 0 to * \c 63. * \param width The bit-width of the general-purpose fuse bit-field: \c 0 to * \c 64. * \param check Whether to check erase: \c TRUE or \c FALSE. * * \return Whether the erase succeeded or always \c TRUE if erase check was not * requested. * * \warning A Lock Error is issued if the Security bit is active and the command * is applied to BOOTPROT or EPFL fuses. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note An erase operation can only set bits. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern Bool flashc_erase_gp_fuse_bitfield(unsigned int pos, unsigned int width, Bool check); /*! \brief Erases a general-purpose fuse byte. * * \param gp_fuse_byte The general-purpose fuse byte: \c 0 to \c 7. * \param check Whether to check erase: \c TRUE or \c FALSE. * * \return Whether the erase succeeded or always \c TRUE if erase check was not * requested. * * \warning A Lock Error is issued if the Security bit is active. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note An erase operation can only set bits. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern Bool flashc_erase_gp_fuse_byte(unsigned int gp_fuse_byte, Bool check); /*! \brief Erases all general-purpose fuses. * * \param check Whether to check erase: \c TRUE or \c FALSE. * * \return Whether the erase succeeded or always \c TRUE if erase check was not * requested. * * \warning A Lock Error is issued if the Security bit is active. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note An erase operation can only set bits. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern Bool flashc_erase_all_gp_fuses(Bool check); /*! \brief Writes a general-purpose fuse bit. * * \param gp_fuse_bit The general-purpose fuse bit: \c 0 to \c 63. * \param value The value of the specified general-purpose fuse bit. * * \warning A Lock Error is issued if the Security bit is active and the command * is applied to BOOTPROT or EPFL fuses. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note A write operation can only clear bits. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern void flashc_write_gp_fuse_bit(unsigned int gp_fuse_bit, Bool value); /*! \brief Writes a general-purpose fuse bit-field. * * \param pos The bit-position of the general-purpose fuse bit-field: \c 0 to * \c 63. * \param width The bit-width of the general-purpose fuse bit-field: \c 0 to * \c 64. * \param value The value of the specified general-purpose fuse bit-field. * * \warning A Lock Error is issued if the Security bit is active and the command * is applied to BOOTPROT or EPFL fuses. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note A write operation can only clear bits. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern void flashc_write_gp_fuse_bitfield(unsigned int pos, unsigned int width, U64 value); /*! \brief Writes a general-purpose fuse byte. * * \param gp_fuse_byte The general-purpose fuse byte: \c 0 to \c 7. * \param value The value of the specified general-purpose fuse byte. * * \warning A Lock Error is issued if the Security bit is active. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note A write operation can only clear bits. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern void flashc_write_gp_fuse_byte(unsigned int gp_fuse_byte, U8 value); /*! \brief Writes all general-purpose fuses. * * \param value The value of all general-purpose fuses as a word. * * \warning A Lock Error is issued if the Security bit is active. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note A write operation can only clear bits. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern void flashc_write_all_gp_fuses(U64 value); /*! \brief Sets a general-purpose fuse bit with the appropriate erase and write * operations. * * \param gp_fuse_bit The general-purpose fuse bit: \c 0 to \c 63. * \param value The value of the specified general-purpose fuse bit. * * \warning A Lock Error is issued if the Security bit is active and the command * is applied to BOOTPROT or EPFL fuses. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern void flashc_set_gp_fuse_bit(unsigned int gp_fuse_bit, Bool value); /*! \brief Sets a general-purpose fuse bit-field with the appropriate erase and * write operations. * * \param pos The bit-position of the general-purpose fuse bit-field: \c 0 to * \c 63. * \param width The bit-width of the general-purpose fuse bit-field: \c 0 to * \c 64. * \param value The value of the specified general-purpose fuse bit-field. * * \warning A Lock Error is issued if the Security bit is active and the command * is applied to BOOTPROT or EPFL fuses. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern void flashc_set_gp_fuse_bitfield(unsigned int pos, unsigned int width, U64 value); /*! \brief Sets a general-purpose fuse byte with the appropriate erase and write * operations. * * \param gp_fuse_byte The general-purpose fuse byte: \c 0 to \c 7. * \param value The value of the specified general-purpose fuse byte. * * \warning A Lock Error is issued if the Security bit is active. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern void flashc_set_gp_fuse_byte(unsigned int gp_fuse_byte, U8 value); /*! \brief Sets all general-purpose fuses with the appropriate erase and write * operations. * * \param value The value of all general-purpose fuses as a word. * * \warning A Lock Error is issued if the Security bit is active. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern void flashc_set_all_gp_fuses(U64 value); //! @} /*! \name Access to Flash Pages */ //! @{ /*! \brief Clears the page buffer. * * This command resets all bits in the page buffer to one. Write accesses to the * page buffer can only change page buffer bits from one to zero. * * \warning The page buffer is not automatically reset after a page write. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern void flashc_clear_page_buffer(void); /*! \brief Tells whether the page to which the last Quick Page Read or Quick * Page Read User Page command was applied was erased. * * \return Whether the page to which the last Quick Page Read or Quick Page Read * User Page command was applied was erased. */ extern Bool flashc_is_page_erased(void); /*! \brief Applies the Quick Page Read command to a page. * * \param page_number The page number: * \arg \c 0 to (flashc_get_page_count() - 1): a page number within * the flash array; * \arg < 0: the current page number. * * \return Whether the specified page is erased. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern Bool flashc_quick_page_read(int page_number); /*! \brief Erases a page. * * \param page_number The page number: * \arg \c 0 to (flashc_get_page_count() - 1): a page number within * the flash array; * \arg < 0: the current page number. * \param check Whether to check erase: \c TRUE or \c FALSE. * * \return Whether the erase succeeded or always \c TRUE if erase check was not * requested. * * \warning A Lock Error is issued if the command is applied to a page belonging * to a locked region or to the bootloader protected area. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note An erase operation can only set bits. */ extern Bool flashc_erase_page(int page_number, Bool check); /*! \brief Erases all pages within the flash array. * * \param check Whether to check erase: \c TRUE or \c FALSE. * * \return Whether the erase succeeded or always \c TRUE if erase check was not * requested. * * \warning A Lock Error is issued if at least one region is locked or the * bootloader protection is active. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note An erase operation can only set bits. */ extern Bool flashc_erase_all_pages(Bool check); /*! \brief Writes a page from the page buffer. * * \param page_number The page number: * \arg \c 0 to (flashc_get_page_count() - 1): a page number within * the flash array; * \arg < 0: the current page number. * * \warning A Lock Error is issued if the command is applied to a page belonging * to a locked region or to the bootloader protected area. * * \warning The page buffer is not automatically reset after a page write. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note A write operation can only clear bits. */ extern void flashc_write_page(int page_number); /*! \brief Issues a Quick Page Read User Page command to the FLASHC. * * \return Whether the User page is erased. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern Bool flashc_quick_user_page_read(void); /*! \brief Erases the User page. * * \param check Whether to check erase: \c TRUE or \c FALSE. * * \return Whether the erase succeeded or always \c TRUE if erase check was not * requested. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note An erase operation can only set bits. */ extern Bool flashc_erase_user_page(Bool check); /*! \brief Writes the User page from the page buffer. * * \warning The page buffer is not automatically reset after a page write. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note A write operation can only clear bits. */ extern void flashc_write_user_page(void); /*! \brief Copies \a nbytes bytes to the flash destination pointed to by \a dst * from the repeated \a src source byte. * * The destination areas that are not within the flash array or the User page * are ignored. * * All pointer and size alignments are supported. * * \param dst Pointer to flash destination. * \param src Source byte. * \param nbytes Number of bytes to set. * \param erase Whether to erase before writing: \c TRUE or \c FALSE. * * \return The value of \a dst. * * \warning This function may be called with \a erase set to \c FALSE only if * the destination consists only of erased words, i.e. this function * can not be used to write only one bit of a previously written word. * E.g., if \c 0x00000001 then \c 0xFFFFFFFE are written to a word, the * resulting value in flash may be different from \c 0x00000000. * * \warning A Lock Error is issued if the command is applied to pages belonging * to a locked region or to the bootloader protected area. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern volatile void *flashc_memset8(volatile void *dst, U8 src, size_t nbytes, Bool erase); /*! \brief Copies \a nbytes bytes to the flash destination pointed to by \a dst * from the repeated \a src big-endian source half-word. * * The destination areas that are not within the flash array or the User page * are ignored. * * All pointer and size alignments are supported. * * \param dst Pointer to flash destination. * \param src Source half-word. * \param nbytes Number of bytes to set. * \param erase Whether to erase before writing: \c TRUE or \c FALSE. * * \return The value of \a dst. * * \warning This function may be called with \a erase set to \c FALSE only if * the destination consists only of erased words, i.e. this function * can not be used to write only one bit of a previously written word. * E.g., if \c 0x00000001 then \c 0xFFFFFFFE are written to a word, the * resulting value in flash may be different from \c 0x00000000. * * \warning A Lock Error is issued if the command is applied to pages belonging * to a locked region or to the bootloader protected area. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern volatile void *flashc_memset16(volatile void *dst, U16 src, size_t nbytes, Bool erase); /*! \brief Copies \a nbytes bytes to the flash destination pointed to by \a dst * from the repeated \a src big-endian source word. * * The destination areas that are not within the flash array or the User page * are ignored. * * All pointer and size alignments are supported. * * \param dst Pointer to flash destination. * \param src Source word. * \param nbytes Number of bytes to set. * \param erase Whether to erase before writing: \c TRUE or \c FALSE. * * \return The value of \a dst. * * \warning This function may be called with \a erase set to \c FALSE only if * the destination consists only of erased words, i.e. this function * can not be used to write only one bit of a previously written word. * E.g., if \c 0x00000001 then \c 0xFFFFFFFE are written to a word, the * resulting value in flash may be different from \c 0x00000000. * * \warning A Lock Error is issued if the command is applied to pages belonging * to a locked region or to the bootloader protected area. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern volatile void *flashc_memset32(volatile void *dst, U32 src, size_t nbytes, Bool erase); /*! \brief Copies \a nbytes bytes to the flash destination pointed to by \a dst * from the repeated \a src big-endian source double-word. * * The destination areas that are not within the flash array or the User page * are ignored. * * All pointer and size alignments are supported. * * \param dst Pointer to flash destination. * \param src Source double-word. * \param nbytes Number of bytes to set. * \param erase Whether to erase before writing: \c TRUE or \c FALSE. * * \return The value of \a dst. * * \warning This function may be called with \a erase set to \c FALSE only if * the destination consists only of erased words, i.e. this function * can not be used to write only one bit of a previously written word. * E.g., if \c 0x00000001 then \c 0xFFFFFFFE are written to a word, the * resulting value in flash may be different from \c 0x00000000. * * \warning A Lock Error is issued if the command is applied to pages belonging * to a locked region or to the bootloader protected area. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern volatile void *flashc_memset64(volatile void *dst, U64 src, size_t nbytes, Bool erase); /*! \brief Copies \a nbytes bytes to the flash destination pointed to by \a dst * from the repeated \a src big-endian source pattern. * * The destination areas that are not within the flash array or the User page * are ignored. * * All pointer and size alignments are supported. * * \param dst Pointer to flash destination. * \param src Source double-word. * \param src_width \a src width in bits: 8, 16, 32 or 64. * \param nbytes Number of bytes to set. * \param erase Whether to erase before writing: \c TRUE or \c FALSE. * * \return The value of \a dst. * * \warning This function may be called with \a erase set to \c FALSE only if * the destination consists only of erased words, i.e. this function * can not be used to write only one bit of a previously written word. * E.g., if \c 0x00000001 then \c 0xFFFFFFFE are written to a word, the * resulting value in flash may be different from \c 0x00000000. * * \warning A Lock Error is issued if the command is applied to pages belonging * to a locked region or to the bootloader protected area. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ #define flashc_memset(dst, src, src_width, nbytes, erase) \ TPASTE2(flashc_memset, src_width)((dst), (src), (nbytes), (erase)) /*! \brief Copies \a nbytes bytes to the flash destination pointed to by \a dst * from the source pointed to by \a src. * * The destination areas that are not within the flash array or the User page * are ignored. * * All pointer and size alignments are supported. * * \param dst Pointer to flash destination. * \param src Pointer to source data. * \param nbytes Number of bytes to copy. * \param erase Whether to erase before writing: \c TRUE or \c FALSE. * * \return The value of \a dst. * * \warning If copying takes place between areas that overlap, the behavior is * undefined. * * \warning This function may be called with \a erase set to \c FALSE only if * the destination consists only of erased words, i.e. this function * can not be used to write only one bit of a previously written word. * E.g., if \c 0x00000001 then \c 0xFFFFFFFE are written to a word, the * resulting value in flash may be different from \c 0x00000000. * * \warning A Lock Error is issued if the command is applied to pages belonging * to a locked region or to the bootloader protected area. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern volatile void *flashc_memcpy(volatile void *dst, const void *src, size_t nbytes, Bool erase); #if UC3C /*! \brief Depednding to the CPU frequency, set the wait states of flash read * accesses and enable or disable the High speed read mode. * * \param cpu_f_hz The CPU frequency */ void flashc_set_flash_waitstate_and_readmode(unsigned long cpu_f_hz); #endif // UC3C device-specific implementation //! @} #endif // _FLASHC_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file has been prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief GPIO driver for AVR32 UC3. * * This file defines a useful set of functions for the GPIO. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a GPIO module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * *****************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "gpio.h" //! GPIO module instance. #define GPIO AVR32_GPIO /*! \name Peripheral Bus Interface */ //! @{ int gpio_enable_module(const gpio_map_t gpiomap, unsigned int size) { int status = GPIO_SUCCESS; unsigned int i; for (i = 0; i < size; i++) { status |= gpio_enable_module_pin(gpiomap->pin, gpiomap->function); gpiomap++; } return status; } int gpio_enable_module_pin(unsigned int pin, unsigned int function) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; // Enable the correct function. switch (function) { case 0: // A function. gpio_port->pmr0c = 1 << (pin & 0x1F); gpio_port->pmr1c = 1 << (pin & 0x1F); #if defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) gpio_port->pmr2c = 1 << (pin & 0x1F); #endif break; case 1: // B function. gpio_port->pmr0s = 1 << (pin & 0x1F); gpio_port->pmr1c = 1 << (pin & 0x1F); #if defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) gpio_port->pmr2c = 1 << (pin & 0x1F); #endif break; case 2: // C function. gpio_port->pmr0c = 1 << (pin & 0x1F); gpio_port->pmr1s = 1 << (pin & 0x1F); #if defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) gpio_port->pmr2c = 1 << (pin & 0x1F); #endif break; case 3: // D function. gpio_port->pmr0s = 1 << (pin & 0x1F); gpio_port->pmr1s = 1 << (pin & 0x1F); #if defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) gpio_port->pmr2c = 1 << (pin & 0x1F); #endif break; #if defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) case 4: // E function. gpio_port->pmr0c = 1 << (pin & 0x1F); gpio_port->pmr1c = 1 << (pin & 0x1F); gpio_port->pmr2s = 1 << (pin & 0x1F); break; case 5: // F function. gpio_port->pmr0s = 1 << (pin & 0x1F); gpio_port->pmr1c = 1 << (pin & 0x1F); gpio_port->pmr2s = 1 << (pin & 0x1F); break; case 6: // G function. gpio_port->pmr0c = 1 << (pin & 0x1F); gpio_port->pmr1s = 1 << (pin & 0x1F); gpio_port->pmr2s = 1 << (pin & 0x1F); break; case 7: // H function. gpio_port->pmr0s = 1 << (pin & 0x1F); gpio_port->pmr1s = 1 << (pin & 0x1F); gpio_port->pmr2s = 1 << (pin & 0x1F); break; #endif default: return GPIO_INVALID_ARGUMENT; } // Disable GPIO control. gpio_port->gperc = 1 << (pin & 0x1F); return GPIO_SUCCESS; } void gpio_enable_gpio(const gpio_map_t gpiomap, unsigned int size) { unsigned int i; for (i = 0; i < size; i++) { gpio_enable_gpio_pin(gpiomap->pin); gpiomap++; } } void gpio_enable_gpio_pin(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->oderc = 1 << (pin & 0x1F); gpio_port->gpers = 1 << (pin & 0x1F); } // The open-drain mode is not synthesized on the current AVR32 products. // If one day some AVR32 products have this feature, the corresponding part // numbers should be listed in the #if below. // Note that other functions are available in this driver to use pins with open // drain in GPIO mode. The advantage of the open-drain mode functions over these // other functions is that they can be used not only in GPIO mode but also in // module mode. #if 0 void gpio_enable_pin_open_drain(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->odmers = 1 << (pin & 0x1F); } void gpio_disable_pin_open_drain(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->odmerc = 1 << (pin & 0x1F); } #endif void gpio_enable_pin_pull_up(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->puers = 1 << (pin & 0x1F); #if defined(AVR32_GPIO_200_H_INCLUDED) || defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) gpio_port->pderc = 1 << (pin & 0x1F); #endif } void gpio_disable_pin_pull_up(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->puerc = 1 << (pin & 0x1F); } #if defined(AVR32_GPIO_200_H_INCLUDED) || defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) // Added support of Pull-up Resistor, Pull-down Resistor and Buskeeper Control. /*! \brief Enables the pull-down resistor of a pin. * * \param pin The pin number. */ void gpio_enable_pin_pull_down(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->puerc = 1 << (pin & 0x1F); gpio_port->pders = 1 << (pin & 0x1F); } /*! \brief Disables the pull-down resistor of a pin. * * \param pin The pin number. */ void gpio_disable_pin_pull_down(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->pderc = 1 << (pin & 0x1F); } /*! \brief Enables the buskeeper functionality on a pin. * * \param pin The pin number. */ void gpio_enable_pin_buskeeper(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->puers = 1 << (pin & 0x1F); gpio_port->pders = 1 << (pin & 0x1F); } /*! \brief Disables the buskeeper functionality on a pin. * * \param pin The pin number. */ void gpio_disable_pin_buskeeper(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->puerc = 1 << (pin & 0x1F); gpio_port->pderc = 1 << (pin & 0x1F); } #endif int gpio_get_pin_value(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; return (gpio_port->pvr >> (pin & 0x1F)) & 1; } int gpio_get_gpio_pin_output_value(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; return (gpio_port->ovr >> (pin & 0x1F)) & 1; } int gpio_get_gpio_open_drain_pin_output_value(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; return ((gpio_port->oder >> (pin & 0x1F)) & 1) ^ 1; } void gpio_set_gpio_pin(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->ovrs = 1 << (pin & 0x1F); // Value to be driven on the I/O line: 1. gpio_port->oders = 1 << (pin & 0x1F); // The GPIO output driver is enabled for that pin. gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin. } void gpio_clr_gpio_pin(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->ovrc = 1 << (pin & 0x1F); // Value to be driven on the I/O line: 0. gpio_port->oders = 1 << (pin & 0x1F); // The GPIO output driver is enabled for that pin. gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin. } void gpio_tgl_gpio_pin(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->ovrt = 1 << (pin & 0x1F); // Toggle the I/O line. gpio_port->oders = 1 << (pin & 0x1F); // The GPIO output driver is enabled for that pin. gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin. } void gpio_set_gpio_open_drain_pin(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->oderc = 1 << (pin & 0x1F); // The GPIO output driver is disabled for that pin. gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin. } void gpio_clr_gpio_open_drain_pin(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->ovrc = 1 << (pin & 0x1F); // Value to be driven on the I/O line: 0. gpio_port->oders = 1 << (pin & 0x1F); // The GPIO output driver is enabled for that pin. gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin. } void gpio_tgl_gpio_open_drain_pin(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->ovrc = 1 << (pin & 0x1F); // Value to be driven on the I/O line if the GPIO output driver is enabled: 0. gpio_port->odert = 1 << (pin & 0x1F); // The GPIO output driver is toggled for that pin. gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin. } void gpio_enable_pin_glitch_filter(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->gfers = 1 << (pin & 0x1F); } void gpio_disable_pin_glitch_filter(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->gferc = 1 << (pin & 0x1F); } /*! \brief Configure the edge detector of an input pin * * \param pin The pin number. * \param mode The edge detection mode (\ref GPIO_PIN_CHANGE, \ref GPIO_RISING_EDGE * or \ref GPIO_FALLING_EDGE). * * \return \ref GPIO_SUCCESS or \ref GPIO_INVALID_ARGUMENT. */ static int gpio_configure_edge_detector(unsigned int pin, unsigned int mode) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; // Configure the edge detector. switch (mode) { case GPIO_PIN_CHANGE: gpio_port->imr0c = 1 << (pin & 0x1F); gpio_port->imr1c = 1 << (pin & 0x1F); break; case GPIO_RISING_EDGE: gpio_port->imr0s = 1 << (pin & 0x1F); gpio_port->imr1c = 1 << (pin & 0x1F); break; case GPIO_FALLING_EDGE: gpio_port->imr0c = 1 << (pin & 0x1F); gpio_port->imr1s = 1 << (pin & 0x1F); break; default: return GPIO_INVALID_ARGUMENT; } return GPIO_SUCCESS; } int gpio_enable_pin_interrupt(unsigned int pin, unsigned int mode) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; // Enable the glitch filter. gpio_port->gfers = 1 << (pin & 0x1F); // Configure the edge detector. if(GPIO_INVALID_ARGUMENT == gpio_configure_edge_detector(pin, mode)) return(GPIO_INVALID_ARGUMENT); // Enable interrupt. gpio_port->iers = 1 << (pin & 0x1F); return GPIO_SUCCESS; } void gpio_disable_pin_interrupt(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->ierc = 1 << (pin & 0x1F); } int gpio_get_pin_interrupt_flag(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; return (gpio_port->ifr >> (pin & 0x1F)) & 1; } void gpio_clear_pin_interrupt_flag(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->ifrc = 1 << (pin & 0x1F); } //# //# Peripheral Event System Support. //# #if UC3L int gpio_configure_pin_periph_event_mode(unsigned int pin, unsigned int mode, unsigned int use_igf) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; if(TRUE == use_igf) { // Enable the glitch filter. gpio_port->gfers = 1 << (pin & 0x1F); } else { // Disable the glitch filter. gpio_port->gferc = 1 << (pin & 0x1F); } // Configure the edge detector. return(gpio_configure_edge_detector(pin, mode)); } #endif //! @} ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file has been prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief GPIO header for AVR32 UC3. * * This file contains basic GPIO driver functions. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a GPIO module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * *****************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _GPIO_H_ #define _GPIO_H_ #include #include "compiler.h" /*! \name Return Values of the GPIO API */ //! @{ #define GPIO_SUCCESS 0 //!< Function successfully completed. #define GPIO_INVALID_ARGUMENT 1 //!< Input parameters are out of range. //! @} /*! \name Interrupt Trigger Modes */ //! @{ #define GPIO_PIN_CHANGE 0 //!< Interrupt triggered upon pin change. #define GPIO_RISING_EDGE 1 //!< Interrupt triggered upon rising edge. #define GPIO_FALLING_EDGE 2 //!< Interrupt triggered upon falling edge. //! @} //! A type definition of pins and modules connectivity. typedef struct { unsigned char pin; //!< Module pin. unsigned char function; //!< Module function. } gpio_map_t[]; /*! \name Peripheral Bus Interface * * Low-speed interface with a non-deterministic number of clock cycles per * access. * * This interface operates with lower clock frequencies (fPB <= fCPU), and its * timing is not deterministic since it needs to access a shared bus which may * be heavily loaded. * * \note This interface is immediately available without initialization. */ //! @{ /*! \brief Enables specific module modes for a set of pins. * * \param gpiomap The pin map. * \param size The number of pins in \a gpiomap. * * \return \ref GPIO_SUCCESS or \ref GPIO_INVALID_ARGUMENT. */ extern int gpio_enable_module(const gpio_map_t gpiomap, unsigned int size); /*! \brief Enables a specific module mode for a pin. * * \param pin The pin number.\n * Refer to the product header file `uc3x.h' (where x is the part * number; e.g. x = a0512) for module pins. E.g., to enable a PWM * channel output, the pin number can be AVR32_PWM_3_PIN for PWM * channel 3. * \param function The pin function.\n * Refer to the product header file `uc3x.h' (where x is the * part number; e.g. x = a0512) for module pin functions. E.g., * to enable a PWM channel output, the pin function can be * AVR32_PWM_3_FUNCTION for PWM channel 3. * * \return \ref GPIO_SUCCESS or \ref GPIO_INVALID_ARGUMENT. */ extern int gpio_enable_module_pin(unsigned int pin, unsigned int function); /*! \brief Enables the GPIO mode of a set of pins. * * \param gpiomap The pin map. * \param size The number of pins in \a gpiomap. */ extern void gpio_enable_gpio(const gpio_map_t gpiomap, unsigned int size); /*! \brief Enables the GPIO mode of a pin. * * \param pin The pin number.\n * Refer to the product header file `uc3x.h' (where x is the part * number; e.g. x = a0512) for pin definitions. E.g., to enable the * GPIO mode of PX21, AVR32_PIN_PX21 can be used. Module pins such as * AVR32_PWM_3_PIN for PWM channel 3 can also be used to release * module pins for GPIO. */ extern void gpio_enable_gpio_pin(unsigned int pin); // The open-drain mode is not synthesized on the current AVR32 products. // If one day some AVR32 products have this feature, the corresponding part // numbers should be listed in the #if below. // Note that other functions are available in this driver to use pins with open // drain in GPIO mode. The advantage of the open-drain mode functions over these // other functions is that they can be used not only in GPIO mode but also in // module mode. #if 0 /*! \brief Enables the open-drain mode of a pin. * * \param pin The pin number. */ extern void gpio_enable_pin_open_drain(unsigned int pin); /*! \brief Disables the open-drain mode of a pin. * * \param pin The pin number. */ extern void gpio_disable_pin_open_drain(unsigned int pin); #endif /*! \brief Enables the pull-up resistor of a pin. * * \param pin The pin number. */ extern void gpio_enable_pin_pull_up(unsigned int pin); /*! \brief Disables the pull-up resistor of a pin. * * \param pin The pin number. */ extern void gpio_disable_pin_pull_up(unsigned int pin); #if defined(AVR32_GPIO_200_H_INCLUDED) || defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) // Added support of Pull-up Resistor, Pull-down Resistor and Buskeeper Control. /*! \brief Enables the pull-down resistor of a pin. * * \param pin The pin number. */ extern void gpio_enable_pin_pull_down(unsigned int pin); /*! \brief Disables the pull-down resistor of a pin. * * \param pin The pin number. */ extern void gpio_disable_pin_pull_down(unsigned int pin); /*! \brief Enables the buskeeper functionality on a pin. * * \param pin The pin number. */ extern void gpio_enable_pin_buskeeper(unsigned int pin); /*! \brief Disables the buskeeper functionality on a pin. * * \param pin The pin number. */ extern void gpio_disable_pin_buskeeper(unsigned int pin); #endif /*! \brief Returns the value of a pin. * * \param pin The pin number. * * \return The pin value. */ extern int gpio_get_pin_value(unsigned int pin); /*! \brief Returns the output value set for a GPIO pin. * * \param pin The pin number. * * \return The pin output value. * * \note This function must be used in conjunction with \ref gpio_set_gpio_pin, * \ref gpio_clr_gpio_pin and \ref gpio_tgl_gpio_pin. */ extern int gpio_get_gpio_pin_output_value(unsigned int pin); /*! \brief Returns the output value set for a GPIO pin using open drain. * * \param pin The pin number. * * \return The pin output value. * * \note This function must be used in conjunction with * \ref gpio_set_gpio_open_drain_pin, \ref gpio_clr_gpio_open_drain_pin * and \ref gpio_tgl_gpio_open_drain_pin. */ extern int gpio_get_gpio_open_drain_pin_output_value(unsigned int pin); /*! \brief Drives a GPIO pin to 1. * * \param pin The pin number. */ extern void gpio_set_gpio_pin(unsigned int pin); /*! \brief Drives a GPIO pin to 0. * * \param pin The pin number. */ extern void gpio_clr_gpio_pin(unsigned int pin); /*! \brief Toggles a GPIO pin. * * \param pin The pin number. */ extern void gpio_tgl_gpio_pin(unsigned int pin); /*! \brief Drives a GPIO pin to 1 using open drain. * * \param pin The pin number. */ extern void gpio_set_gpio_open_drain_pin(unsigned int pin); /*! \brief Drives a GPIO pin to 0 using open drain. * * \param pin The pin number. */ extern void gpio_clr_gpio_open_drain_pin(unsigned int pin); /*! \brief Toggles a GPIO pin using open drain. * * \param pin The pin number. */ extern void gpio_tgl_gpio_open_drain_pin(unsigned int pin); /*! \brief Enables the glitch filter of a pin. * * When the glitch filter is enabled, a glitch with duration of less than 1 * clock cycle is automatically rejected, while a pulse with duration of 2 clock * cycles or more is accepted. For pulse durations between 1 clock cycle and 2 * clock cycles, the pulse may or may not be taken into account, depending on * the precise timing of its occurrence. Thus for a pulse to be guaranteed * visible it must exceed 2 clock cycles, whereas for a glitch to be reliably * filtered out, its duration must not exceed 1 clock cycle. The filter * introduces 2 clock cycles latency. * * \param pin The pin number. */ extern void gpio_enable_pin_glitch_filter(unsigned int pin); /*! \brief Disables the glitch filter of a pin. * * \param pin The pin number. */ extern void gpio_disable_pin_glitch_filter(unsigned int pin); /*! \brief Enables the interrupt of a pin with the specified settings. * * \param pin The pin number. * \param mode The trigger mode (\ref GPIO_PIN_CHANGE, \ref GPIO_RISING_EDGE or * \ref GPIO_FALLING_EDGE). * * \return \ref GPIO_SUCCESS or \ref GPIO_INVALID_ARGUMENT. */ extern int gpio_enable_pin_interrupt(unsigned int pin, unsigned int mode); /*! \brief Disables the interrupt of a pin. * * \param pin The pin number. */ extern void gpio_disable_pin_interrupt(unsigned int pin); /*! \brief Gets the interrupt flag of a pin. * * \param pin The pin number. * * \return The pin interrupt flag. */ extern int gpio_get_pin_interrupt_flag(unsigned int pin); /*! \brief Clears the interrupt flag of a pin. * * \param pin The pin number. */ extern void gpio_clear_pin_interrupt_flag(unsigned int pin); //! @} #if (defined AVR32_GPIO_LOCAL_ADDRESS) /*! \name Local Bus Interface * * High-speed interface with only one clock cycle per access. * * This interface operates with high clock frequency (fCPU), and its timing is * deterministic since it does not need to access a shared bus which may be * heavily loaded. * * \warning To use this interface, the clock frequency of the peripheral bus on * which the GPIO peripheral is connected must be set to the CPU clock * frequency (fPB = fCPU). * * \note This interface has to be initialized in order to be available. */ //! @{ /*! \brief Enables the local bus interface for GPIO. * * \note This function must have been called at least once before using other * functions in this interface. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void gpio_local_init(void) { Set_system_register(AVR32_CPUCR, Get_system_register(AVR32_CPUCR) | AVR32_CPUCR_LOCEN_MASK); } /*! \brief Enables the output driver of a pin. * * \param pin The pin number. * * \note \ref gpio_local_init must have been called beforehand. * * \note This function does not enable the GPIO mode of the pin. * \ref gpio_enable_gpio_pin can be called for this purpose. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void gpio_local_enable_pin_output_driver(unsigned int pin) { AVR32_GPIO_LOCAL.port[pin >> 5].oders = 1 << (pin & 0x1F); } /*! \brief Disables the output driver of a pin. * * \param pin The pin number. * * \note \ref gpio_local_init must have been called beforehand. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void gpio_local_disable_pin_output_driver(unsigned int pin) { AVR32_GPIO_LOCAL.port[pin >> 5].oderc = 1 << (pin & 0x1F); } /*! \brief Returns the value of a pin. * * \param pin The pin number. * * \return The pin value. * * \note \ref gpio_local_init must have been called beforehand. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ int gpio_local_get_pin_value(unsigned int pin) { return (AVR32_GPIO_LOCAL.port[pin >> 5].pvr >> (pin & 0x1F)) & 1; } /*! \brief Drives a GPIO pin to 1. * * \param pin The pin number. * * \note \ref gpio_local_init must have been called beforehand. * * \note This function does not enable the GPIO mode of the pin nor its output * driver. \ref gpio_enable_gpio_pin and * \ref gpio_local_enable_pin_output_driver can be called for this * purpose. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void gpio_local_set_gpio_pin(unsigned int pin) { AVR32_GPIO_LOCAL.port[pin >> 5].ovrs = 1 << (pin & 0x1F); } /*! \brief Drives a GPIO pin to 0. * * \param pin The pin number. * * \note \ref gpio_local_init must have been called beforehand. * * \note This function does not enable the GPIO mode of the pin nor its output * driver. \ref gpio_enable_gpio_pin and * \ref gpio_local_enable_pin_output_driver can be called for this * purpose. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void gpio_local_clr_gpio_pin(unsigned int pin) { AVR32_GPIO_LOCAL.port[pin >> 5].ovrc = 1 << (pin & 0x1F); } /*! \brief Toggles a GPIO pin. * * \param pin The pin number. * * \note \ref gpio_local_init must have been called beforehand. * * \note This function does not enable the GPIO mode of the pin nor its output * driver. \ref gpio_enable_gpio_pin and * \ref gpio_local_enable_pin_output_driver can be called for this * purpose. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void gpio_local_tgl_gpio_pin(unsigned int pin) { AVR32_GPIO_LOCAL.port[pin >> 5].ovrt = 1 << (pin & 0x1F); } /*! \brief Initializes the configuration of a GPIO pin so that it can be used * with GPIO open-drain functions. * * \note This function must have been called at least once before using * \ref gpio_local_set_gpio_open_drain_pin, * \ref gpio_local_clr_gpio_open_drain_pin or * \ref gpio_local_tgl_gpio_open_drain_pin. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void gpio_local_init_gpio_open_drain_pin(unsigned int pin) { AVR32_GPIO_LOCAL.port[pin >> 5].ovrc = 1 << (pin & 0x1F); } /*! \brief Drives a GPIO pin to 1 using open drain. * * \param pin The pin number. * * \note \ref gpio_local_init and \ref gpio_local_init_gpio_open_drain_pin must * have been called beforehand. * * \note This function does not enable the GPIO mode of the pin. * \ref gpio_enable_gpio_pin can be called for this purpose. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void gpio_local_set_gpio_open_drain_pin(unsigned int pin) { AVR32_GPIO_LOCAL.port[pin >> 5].oderc = 1 << (pin & 0x1F); } /*! \brief Drives a GPIO pin to 0 using open drain. * * \param pin The pin number. * * \note \ref gpio_local_init and \ref gpio_local_init_gpio_open_drain_pin must * have been called beforehand. * * \note This function does not enable the GPIO mode of the pin. * \ref gpio_enable_gpio_pin can be called for this purpose. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void gpio_local_clr_gpio_open_drain_pin(unsigned int pin) { AVR32_GPIO_LOCAL.port[pin >> 5].oders = 1 << (pin & 0x1F); } /*! \brief Toggles a GPIO pin using open drain. * * \param pin The pin number. * * \note \ref gpio_local_init and \ref gpio_local_init_gpio_open_drain_pin must * have been called beforehand. * * \note This function does not enable the GPIO mode of the pin. * \ref gpio_enable_gpio_pin can be called for this purpose. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void gpio_local_tgl_gpio_open_drain_pin(unsigned int pin) { AVR32_GPIO_LOCAL.port[pin >> 5].odert = 1 << (pin & 0x1F); } //! @} #endif // AVR32_GPIO_LOCAL_ADDRESS #if UC3L //! @{ /*! \name Peripheral Event System support * * The GPIO can be programmed to output peripheral events whenever an interrupt * condition is detected, such as pin value change, or only when a rising or * falling edge is detected. * */ /*! \brief Enables the peripheral event generation of a pin. * * \param pin The pin number. * */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void gpio_enable_pin_periph_event(unsigned int pin) { AVR32_GPIO.port[pin >> 5].oderc = 1 << (pin & 0x1F); // The GPIO output driver is disabled for that pin. AVR32_GPIO.port[pin >> 5].evers = 1 << (pin & 0x1F); } /*! \brief Disables the peripheral event generation of a pin. * * \param pin The pin number. * */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void gpio_disable_pin_periph_event(unsigned int pin) { AVR32_GPIO.port[pin >> 5].everc = 1 << (pin & 0x1F); } /*! \brief Configure the peripheral event trigger mode of a pin * * \param pin The pin number. * \param mode The trigger mode (\ref GPIO_PIN_CHANGE, \ref GPIO_RISING_EDGE or * \ref GPIO_FALLING_EDGE). * \param use_igf use the Input Glitch Filter (TRUE) or not (FALSE). * * \return \ref GPIO_SUCCESS or \ref GPIO_INVALID_ARGUMENT. */ extern int gpio_configure_pin_periph_event_mode(unsigned int pin, unsigned int mode, unsigned int use_igf); //! @} #endif #endif // _GPIO_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/exception.x ================================================ /* This file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Exception and interrupt vectors. * * This file maps all events supported by an AVR32. * * - Compiler: GNU GCC for AVR32 * - Supported devices: All AVR32 devices with an INTC module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #if !__AVR32_UC__ && !__AVR32_AP__ #error Implementation of the AVR32 architecture not supported by the INTC driver. #endif #include //! @{ //! \verbatim .section .exception, "ax", @progbits // Start of Exception Vector Table. // EVBA must be aligned with a power of two strictly greater than the EVBA- // relative offset of the last vector. .balign 0x200 // Export symbol. .global _evba .type _evba, @function _evba: .org 0x000 // Unrecoverable Exception. _handle_Unrecoverable_Exception: rjmp $ .org 0x004 // TLB Multiple Hit. _handle_TLB_Multiple_Hit: rjmp $ .org 0x008 // Bus Error Data Fetch. _handle_Bus_Error_Data_Fetch: rjmp $ .org 0x00C // Bus Error Instruction Fetch. _handle_Bus_Error_Instruction_Fetch: rjmp $ .org 0x010 // NMI. _handle_NMI: rjmp $ .org 0x014 // Instruction Address. _handle_Instruction_Address: rjmp $ .org 0x018 // ITLB Protection. _handle_ITLB_Protection: rjmp $ .org 0x01C // Breakpoint. _handle_Breakpoint: rjmp $ .org 0x020 // Illegal Opcode. _handle_Illegal_Opcode: rjmp $ .org 0x024 // Unimplemented Instruction. _handle_Unimplemented_Instruction: rjmp $ .org 0x028 // Privilege Violation. _handle_Privilege_Violation: rjmp $ .org 0x02C // Floating-Point: UNUSED IN AVR32UC and AVR32AP. _handle_Floating_Point: rjmp $ .org 0x030 // Coprocessor Absent: UNUSED IN AVR32UC. _handle_Coprocessor_Absent: rjmp $ .org 0x034 // Data Address (Read). _handle_Data_Address_Read: rjmp $ .org 0x038 // Data Address (Write). _handle_Data_Address_Write: rjmp $ .org 0x03C // DTLB Protection (Read). _handle_DTLB_Protection_Read: rjmp $ .org 0x040 // DTLB Protection (Write). _handle_DTLB_Protection_Write: rjmp $ .org 0x044 // DTLB Modified: UNUSED IN AVR32UC. _handle_DTLB_Modified: rjmp $ .org 0x050 // ITLB Miss. _handle_ITLB_Miss: rjmp $ .org 0x060 // DTLB Miss (Read). _handle_DTLB_Miss_Read: rjmp $ .org 0x070 // DTLB Miss (Write). _handle_DTLB_Miss_Write: rjmp $ .org 0x100 // Supervisor Call. _handle_Supervisor_Call: rjmp $ // Interrupt support. // The interrupt controller must provide the offset address relative to EVBA. // Important note: // All interrupts call a C function named _get_interrupt_handler. // This function will read group and interrupt line number to then return in // R12 a pointer to a user-provided interrupt handler. .balign 4 .irp priority, 0, 1, 2, 3 _int\priority: #if __AVR32_UC__ // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the // CPU upon interrupt entry. No other register is saved by hardware. #elif __AVR32_AP__ // PC and SR are automatically saved in respectively RAR_INTx and RSR_INTx by // the CPU upon interrupt entry. No other register is saved by hardware. pushm r8-r12, lr #endif mov r12, \priority // Pass the int_level parameter to the _get_interrupt_handler function. call _get_interrupt_handler cp.w r12, 0 // Get the pointer to the interrupt handler returned by the function. #if __AVR32_UC__ movne pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler. #elif __AVR32_AP__ breq spint\priority // If this was a spurious interrupt (R12 == NULL), branch. st.w --sp, r12 // Push the pointer to the interrupt handler onto the system stack since no register may be altered. popm r8-r12, lr, pc // Restore registers and jump to the handler. spint\priority: popm r8-r12, lr #endif rete // If this was a spurious interrupt (R12 == NULL), return from event handler. .endr // Constant data area. .balign 4 // Values to store in the interrupt priority registers for the various interrupt priority levels. // The interrupt priority registers contain the interrupt priority level and // the EVBA-relative interrupt vector offset. .global ipr_val .type ipr_val, @object ipr_val: .word (AVR32_INTC_INT0 << AVR32_INTC_IPR_INTLEVEL_OFFSET) | (_int0 - _evba),\ (AVR32_INTC_INT1 << AVR32_INTC_IPR_INTLEVEL_OFFSET) | (_int1 - _evba),\ (AVR32_INTC_INT2 << AVR32_INTC_IPR_INTLEVEL_OFFSET) | (_int2 - _evba),\ (AVR32_INTC_INT3 << AVR32_INTC_IPR_INTLEVEL_OFFSET) | (_int3 - _evba) //! \endverbatim //! @} ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief INTC driver for AVR32 UC3. * * AVR32 Interrupt Controller driver module. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with an INTC module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include #include "compiler.h" #include "preprocessor.h" #include "intc.h" // define _evba from exception.S extern void _evba; //! Values to store in the interrupt priority registers for the various interrupt priority levels. extern const unsigned int ipr_val[AVR32_INTC_NUM_INT_LEVELS]; //! Creates a table of interrupt line handlers per interrupt group in order to optimize RAM space. //! Each line handler table contains a set of pointers to interrupt handlers. #if (defined __GNUC__) #define DECL_INT_LINE_HANDLER_TABLE(GRP, unused) \ static volatile __int_handler _int_line_handler_table_##GRP[Max(AVR32_INTC_NUM_IRQS_PER_GRP##GRP, 1)]; #elif (defined __ICCAVR32__) #define DECL_INT_LINE_HANDLER_TABLE(GRP, unused) \ static volatile __no_init __int_handler _int_line_handler_table_##GRP[Max(AVR32_INTC_NUM_IRQS_PER_GRP##GRP, 1)]; #endif MREPEAT(AVR32_INTC_NUM_INT_GRPS, DECL_INT_LINE_HANDLER_TABLE, ~); #undef DECL_INT_LINE_HANDLER_TABLE //! Table containing for each interrupt group the number of interrupt request //! lines and a pointer to the table of interrupt line handlers. static const struct { unsigned int num_irqs; volatile __int_handler *_int_line_handler_table; } _int_handler_table[AVR32_INTC_NUM_INT_GRPS] = { #define INSERT_INT_LINE_HANDLER_TABLE(GRP, unused) \ {AVR32_INTC_NUM_IRQS_PER_GRP##GRP, _int_line_handler_table_##GRP}, MREPEAT(AVR32_INTC_NUM_INT_GRPS, INSERT_INT_LINE_HANDLER_TABLE, ~) #undef INSERT_INT_LINE_HANDLER_TABLE }; /*! \brief Default interrupt handler. * * \note Taken and adapted from Newlib. */ #if (defined __GNUC__) __attribute__((__interrupt__)) #elif (defined __ICCAVR32__) __interrupt #endif static void _unhandled_interrupt(void) { // Catch unregistered interrupts. while (TRUE); } /*! \brief Gets the interrupt handler of the current event at the \a int_level * interrupt priority level (called from exception.S). * * \param int_level Interrupt priority level to handle. * * \return Interrupt handler to execute. * * \note Taken and adapted from Newlib. */ __int_handler _get_interrupt_handler(unsigned int int_level) { // ICR3 is mapped first, ICR0 last. // Code in exception.S puts int_level in R12 which is used by AVR32-GCC to // pass a single argument to a function. unsigned int int_grp = AVR32_INTC.icr[AVR32_INTC_INT3 - int_level]; unsigned int int_req = AVR32_INTC.irr[int_grp]; // As an interrupt may disappear while it is being fetched by the CPU // (spurious interrupt caused by a delayed response from an MCU peripheral to // an interrupt flag clear or interrupt disable instruction), check if there // are remaining interrupt lines to process. // If a spurious interrupt occurs, the status register (SR) contains an // execution mode and interrupt level masks corresponding to a level 0 // interrupt, whatever the interrupt priority level causing the spurious // event. This behavior has been chosen because a spurious interrupt has not // to be a priority one and because it may not cause any trouble to other // interrupts. // However, these spurious interrupts place the hardware in an unstable state // and could give problems in other/future versions of the CPU, so the // software has to be written so that they never occur. The only safe way of // achieving this is to always clear or disable peripheral interrupts with the // following sequence: // 1: Mask the interrupt in the CPU by setting GM (or IxM) in SR. // 2: Perform the bus access to the peripheral register that clears or // disables the interrupt. // 3: Wait until the interrupt has actually been cleared or disabled by the // peripheral. This is usually performed by reading from a register in the // same peripheral (it DOES NOT have to be the same register that was // accessed in step 2, but it MUST be in the same peripheral), what takes // bus system latencies into account, but peripheral internal latencies // (generally 0 cycle) also have to be considered. // 4: Unmask the interrupt in the CPU by clearing GM (or IxM) in SR. // Note that steps 1 and 4 are useless inside interrupt handlers as the // corresponding interrupt level is automatically masked by IxM (unless IxM is // explicitly cleared by the software). // // Get the right IRQ handler. // // If several interrupt lines are active in the group, the interrupt line with // the highest number is selected. This is to be coherent with the // prioritization of interrupt groups performed by the hardware interrupt // controller. // // If no handler has been registered for the pending interrupt, // _unhandled_interrupt will be selected thanks to the initialization of // _int_line_handler_table_x by INTC_init_interrupts. // // exception.S will provide the interrupt handler with a clean interrupt stack // frame, with nothing more pushed onto the stack. The interrupt handler must // manage the `rete' instruction, what can be done thanks to pure assembly, // inline assembly or the `__attribute__((__interrupt__))' C function // attribute. return (int_req) ? _int_handler_table[int_grp]._int_line_handler_table[32 - clz(int_req) - 1] : NULL; } //! Init EVBA address. This sequence might also be done in the UTILS/STARTUP/GCC/crt0.S static __inline__ void INTC_init_evba(void) { Set_system_register(AVR32_EVBA, (int)&_evba ); } void INTC_init_interrupts(void) { unsigned int int_grp, int_req; INTC_init_evba(); // For all interrupt groups, for (int_grp = 0; int_grp < AVR32_INTC_NUM_INT_GRPS; int_grp++) { // For all interrupt request lines of each group, for (int_req = 0; int_req < _int_handler_table[int_grp].num_irqs; int_req++) { // Assign _unhandled_interrupt as default interrupt handler. _int_handler_table[int_grp]._int_line_handler_table[int_req] = &_unhandled_interrupt; } // Set the interrupt group priority register to its default value. // By default, all interrupt groups are linked to the interrupt priority // level 0 and to the interrupt vector _int0. AVR32_INTC.ipr[int_grp] = ipr_val[AVR32_INTC_INT0]; } } void INTC_register_interrupt(__int_handler handler, unsigned int irq, unsigned int int_level) { // Determine the group of the IRQ. unsigned int int_grp = irq / AVR32_INTC_MAX_NUM_IRQS_PER_GRP; // Store in _int_line_handler_table_x the pointer to the interrupt handler, so // that _get_interrupt_handler can retrieve it when the interrupt is vectored. _int_handler_table[int_grp]._int_line_handler_table[irq % AVR32_INTC_MAX_NUM_IRQS_PER_GRP] = handler; // Program the corresponding IPRX register to set the interrupt priority level // and the interrupt vector offset that will be fetched by the core interrupt // system. // NOTE: The _intx functions are intermediate assembly functions between the // core interrupt system and the user interrupt handler. AVR32_INTC.ipr[int_grp] = ipr_val[int_level & (AVR32_INTC_IPR_INTLEVEL_MASK >> AVR32_INTC_IPR_INTLEVEL_OFFSET)]; } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief INTC driver for AVR32 UC3. * * AVR32 Interrupt Controller driver module. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with an INTC module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _INTC_H_ #define _INTC_H_ #include "compiler.h" //! Maximal number of interrupt request lines per group. #define AVR32_INTC_MAX_NUM_IRQS_PER_GRP 32 //! Number of interrupt priority levels. #define AVR32_INTC_NUM_INT_LEVELS (1 << AVR32_INTC_IPR_INTLEVEL_SIZE) #ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling. //! Pointer to interrupt handler. #if (defined __GNUC__) typedef void (*__int_handler)(void); #elif (defined __ICCAVR32__) typedef void (__interrupt *__int_handler)(void); #endif /*! \brief Initializes the hardware interrupt controller driver. * * \note Taken and adapted from Newlib. */ extern void INTC_init_interrupts(void); /*! \brief Registers an interrupt handler. * * \param handler Interrupt handler to register. * \param irq IRQ of the interrupt handler to register. * \param int_level Interrupt priority level to assign to the group of this IRQ. * * \warning The interrupt handler must manage the `rete' instruction, what can * be done thanks to pure assembly, inline assembly or the * `__attribute__((__interrupt__))' C function attribute. * * \warning If several interrupt handlers of a same group are registered with * different priority levels, only the latest priority level set will * be effective. * * \note Taken and adapted from Newlib. */ extern void INTC_register_interrupt(__int_handler handler, unsigned int irq, unsigned int int_level); #endif // __AVR32_ABI_COMPILER__ #endif // _INTC_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA/pdca.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief PDCA driver for AVR32 UC3. * * This file defines a useful set of functions for the PDCA interface on AVR32 * devices. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a PDCA module. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "compiler.h" #include "pdca.h" volatile avr32_pdca_channel_t *pdca_get_handler(unsigned int pdca_ch_number) { // get the correct channel pointer volatile avr32_pdca_channel_t *pdca_channel = &AVR32_PDCA.channel[pdca_ch_number]; if (pdca_ch_number >= AVR32_PDCA_CHANNEL_LENGTH) return (volatile avr32_pdca_channel_t *)PDCA_INVALID_ARGUMENT; return pdca_channel; } int pdca_init_channel(unsigned int pdca_ch_number, const pdca_channel_options_t *opt) { // get the correct channel pointer volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); pdca_disable_interrupt_transfer_complete(pdca_ch_number); // disable channel interrupt pdca_disable_interrupt_reload_counter_zero(pdca_ch_number); // disable channel interrupt Bool global_interrupt_enabled = Is_global_interrupt_enabled(); if (global_interrupt_enabled) Disable_global_interrupt(); pdca_channel->mar = (unsigned long)opt->addr; pdca_channel->tcr = opt->size; pdca_channel->psr = opt->pid; pdca_channel->marr = (unsigned long)opt->r_addr; pdca_channel->tcrr = opt->r_size; pdca_channel->mr = #if (defined AVR32_PDCA_120_H_INCLUDED ) || (defined AVR32_PDCA_121_H_INCLUDED ) || (defined AVR32_PDCA_122_H_INCLUDED ) opt->etrig << AVR32_PDCA_ETRIG_OFFSET | #endif // #ifdef AVR32_PDCA_120_H_INCLUDED opt->transfer_size << AVR32_PDCA_SIZE_OFFSET; pdca_channel->cr = AVR32_PDCA_ECLR_MASK; pdca_channel->isr; if (global_interrupt_enabled) Enable_global_interrupt(); return PDCA_SUCCESS; } unsigned int pdca_get_channel_status(unsigned int pdca_ch_number) { // get the correct channel pointer volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); return (pdca_channel->sr & AVR32_PDCA_TEN_MASK) != 0; } void pdca_disable(unsigned int pdca_ch_number) { // get the correct channel pointer volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); // Disable transfer pdca_channel->cr = AVR32_PDCA_TDIS_MASK; } void pdca_enable(unsigned int pdca_ch_number) { // get the correct channel pointer volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); // Enable transfer pdca_channel->cr = AVR32_PDCA_TEN_MASK; } unsigned int pdca_get_load_size(unsigned int pdca_ch_number) { // get the correct channel pointer volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); return pdca_channel->tcr; } void pdca_load_channel(unsigned int pdca_ch_number, volatile void *addr, unsigned int size) { // get the correct channel pointer volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); Bool global_interrupt_enabled = Is_global_interrupt_enabled(); if (global_interrupt_enabled) Disable_global_interrupt(); pdca_channel->mar = (unsigned long)addr; pdca_channel->tcr = size; pdca_channel->cr = AVR32_PDCA_ECLR_MASK; pdca_channel->isr; if (global_interrupt_enabled) Enable_global_interrupt(); } unsigned int pdca_get_reload_size(unsigned int pdca_ch_number) { // get the correct channel pointer volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); return pdca_channel->tcrr; } void pdca_reload_channel(unsigned int pdca_ch_number, volatile void *addr, unsigned int size) { // get the correct channel pointer volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); Bool global_interrupt_enabled = Is_global_interrupt_enabled(); if (global_interrupt_enabled) Disable_global_interrupt(); // set up next memory address pdca_channel->marr = (unsigned long)addr; // set up next memory size pdca_channel->tcrr = size; pdca_channel->cr = AVR32_PDCA_ECLR_MASK; pdca_channel->isr; if (global_interrupt_enabled) Enable_global_interrupt(); } void pdca_set_peripheral_select(unsigned int pdca_ch_number, unsigned int pid) { // get the correct channel pointer volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); pdca_channel->psr = pid; } void pdca_set_transfer_size(unsigned int pdca_ch_number, unsigned int transfer_size) { // get the correct channel pointer volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); pdca_channel->mr = (pdca_channel->mr & ~AVR32_PDCA_SIZE_MASK) | transfer_size << AVR32_PDCA_SIZE_OFFSET; } #if (defined AVR32_PDCA_120_H_INCLUDED ) || (defined AVR32_PDCA_121_H_INCLUDED ) || (defined AVR32_PDCA_122_H_INCLUDED ) void pdca_disable_event_trigger(unsigned int pdca_ch_number) { // get the correct channel pointer volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); pdca_channel->mr &= ~AVR32_PDCA_ETRIG_MASK; } void pdca_enable_event_trigger(unsigned int pdca_ch_number) { // get the correct channel pointer volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); pdca_channel->mr |= AVR32_PDCA_ETRIG_MASK; } #endif // #ifdef AVR32_PDCA_120_H_INCLUDED void pdca_disable_interrupt_transfer_error(unsigned int pdca_ch_number) { // get the correct channel pointer volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); Bool global_interrupt_enabled = Is_global_interrupt_enabled(); if (global_interrupt_enabled) Disable_global_interrupt(); pdca_channel->idr = AVR32_PDCA_TERR_MASK; pdca_channel->isr; if (global_interrupt_enabled) Enable_global_interrupt(); } void pdca_enable_interrupt_transfer_error(unsigned int pdca_ch_number) { // get the correct channel pointer volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); pdca_channel->ier = AVR32_PDCA_TERR_MASK; } void pdca_disable_interrupt_transfer_complete(unsigned int pdca_ch_number) { // get the correct channel pointer volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); Bool global_interrupt_enabled = Is_global_interrupt_enabled(); if (global_interrupt_enabled) Disable_global_interrupt(); pdca_channel->idr = AVR32_PDCA_TRC_MASK; pdca_channel->isr; if (global_interrupt_enabled) Enable_global_interrupt(); } void pdca_enable_interrupt_transfer_complete(unsigned int pdca_ch_number) { // get the correct channel pointer volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); pdca_channel->ier = AVR32_PDCA_TRC_MASK; } void pdca_disable_interrupt_reload_counter_zero(unsigned int pdca_ch_number) { // get the correct channel pointer volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); Bool global_interrupt_enabled = Is_global_interrupt_enabled(); if (global_interrupt_enabled) Disable_global_interrupt(); pdca_channel->idr = AVR32_PDCA_RCZ_MASK; pdca_channel->isr; if (global_interrupt_enabled) Enable_global_interrupt(); } void pdca_enable_interrupt_reload_counter_zero(unsigned int pdca_ch_number) { // get the correct channel pointer volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); pdca_channel->ier = AVR32_PDCA_RCZ_MASK; } unsigned long pdca_get_transfer_status(unsigned int pdca_ch_number) { // get the correct channel pointer volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); return pdca_channel->isr; } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA/pdca.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief PDCA driver for AVR32 UC3. * * This file defines a useful set of functions for the PDCA interface on AVR32 * devices. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a PDCA module. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _PDCA_H_ #define _PDCA_H_ #include //! Size of PDCA transfer: byte. #define PDCA_TRANSFER_SIZE_BYTE AVR32_PDCA_BYTE //! Size of PDCA transfer: half-word. #define PDCA_TRANSFER_SIZE_HALF_WORD AVR32_PDCA_HALF_WORD //! Size of PDCA transfer: word. #define PDCA_TRANSFER_SIZE_WORD AVR32_PDCA_WORD /*! \name PDCA Driver Status Codes */ //! @{ #define PDCA_SUCCESS 0 #define PDCA_INVALID_ARGUMENT -1 //! @} /*! \name PDCA Transfer Status Codes */ //! @{ #define PDCA_TRANSFER_ERROR AVR32_PDCA_TERR_MASK #define PDCA_TRANSFER_COMPLETE AVR32_PDCA_TRC_MASK #define PDCA_TRANSFER_COUNTER_RELOAD_IS_ZERO AVR32_PDCA_RCZ_MASK //! @} //! PDCA channel options. typedef struct { //! Memory address. volatile void *addr ; //! Transfer counter. unsigned int size ; //! Next memory address. volatile void *r_addr ; //! Next transfer counter. unsigned int r_size ; //! Select peripheral ID. unsigned int pid ; //! Select the size of the transfer (byte, half-word or word). unsigned int transfer_size ; #if (defined AVR32_PDCA_120_H_INCLUDED ) || (defined AVR32_PDCA_121_H_INCLUDED ) || (defined AVR32_PDCA_122_H_INCLUDED ) // Note: the options in this preprocessor section are only available from the PDCA IP version 1.2.0 on. //! Enable (\c 1) or disable (\c 0) the transfer upon event trigger. unsigned char etrig ; #endif // #ifdef AVR32_PDCA_120_H_INCLUDED } pdca_channel_options_t; /*! \brief Get PDCA channel handler * * \param pdca_ch_number PDCA channel * * \return channel handled or PDCA_INVALID_ARGUMENT */ extern volatile avr32_pdca_channel_t *pdca_get_handler(unsigned int pdca_ch_number); /*! \brief Set the channel configuration * * \param pdca_ch_number PDCA channel * \param opt channel option */ extern int pdca_init_channel(unsigned int pdca_ch_number, const pdca_channel_options_t *opt); /*! \brief Get the PDCA channel transfer enable status * * \param pdca_ch_number PDCA channel * * \return \c 1 if channel transfer is enabled, else \c 0 */ extern unsigned int pdca_get_channel_status(unsigned int pdca_ch_number); /*! \brief Disable the PDCA for the given channel * * \param pdca_ch_number PDCA channel */ extern void pdca_disable(unsigned int pdca_ch_number); /*! \brief Enable the PDCA for the given channel * * \param pdca_ch_number PDCA channel */ extern void pdca_enable(unsigned int pdca_ch_number); /*! \brief Get PDCA channel load size (or remaining size if transfer started) * * \param pdca_ch_number PDCA channel * * \return size current size to transfer */ extern unsigned int pdca_get_load_size(unsigned int pdca_ch_number); /*! \brief Set PDCA channel load values * * \param pdca_ch_number PDCA channel * \param addr address where data to load are stored * \param size size of the data block to load */ extern void pdca_load_channel(unsigned int pdca_ch_number, volatile void *addr, unsigned int size); /*! \brief Get PDCA channel reload size * * \param pdca_ch_number PDCA channel * * \return size current reload size */ extern unsigned int pdca_get_reload_size(unsigned int pdca_ch_number); /*! \brief Set PDCA channel reload values * * \param pdca_ch_number PDCA channel * \param addr address where data to load are stored * \param size size of the data block to load */ extern void pdca_reload_channel(unsigned int pdca_ch_number, volatile void *addr, unsigned int size); /*! \brief Set the peripheral function to use with the PDCA channel * * \param pdca_ch_number PDCA channel * \param pid the peripheral ID */ extern void pdca_set_peripheral_select(unsigned int pdca_ch_number, unsigned int pid); /*! \brief Set the size of the transfer * * \param pdca_ch_number PDCA channel * \param transfer_size size of the transfer (byte, half-word or word) */ extern void pdca_set_transfer_size(unsigned int pdca_ch_number, unsigned int transfer_size); #if (defined AVR32_PDCA_120_H_INCLUDED ) || (defined AVR32_PDCA_121_H_INCLUDED ) || (defined AVR32_PDCA_122_H_INCLUDED ) // Note: the functions in this preprocessor section are only available from the PDCA IP version 1.2.0 on. /*! \brief Disable the event-triggered transfer feature * * \param pdca_ch_number PDCA channel */ extern void pdca_disable_event_trigger(unsigned int pdca_ch_number); /*! \brief Enable the event-triggered transfer feature * * \param pdca_ch_number PDCA channel */ extern void pdca_enable_event_trigger(unsigned int pdca_ch_number); #endif // #ifdef AVR32_PDCA_120_H_INCLUDED /*! \brief Disable PDCA transfer error interrupt * * \param pdca_ch_number PDCA channel */ extern void pdca_disable_interrupt_transfer_error(unsigned int pdca_ch_number); /*! \brief Enable PDCA transfer error interrupt * * \param pdca_ch_number PDCA channel */ extern void pdca_enable_interrupt_transfer_error(unsigned int pdca_ch_number); /*! \brief Disable PDCA transfer interrupt when completed (ie TCR and TCRR are both zero) * * \param pdca_ch_number PDCA channel */ extern void pdca_disable_interrupt_transfer_complete(unsigned int pdca_ch_number); /*! \brief Enable PDCA transfer interrupt when completed (ie TCR and TCRR are both zero) * * \param pdca_ch_number PDCA channel */ extern void pdca_enable_interrupt_transfer_complete(unsigned int pdca_ch_number); /*! \brief Disable PDCA transfer interrupt when TCRR reaches zero * * \param pdca_ch_number PDCA channel */ extern void pdca_disable_interrupt_reload_counter_zero(unsigned int pdca_ch_number); /*! \brief Enable PDCA transfer interrupt when TCRR reaches zero * * \param pdca_ch_number PDCA channel */ extern void pdca_enable_interrupt_reload_counter_zero(unsigned int pdca_ch_number); /*! \brief Get PDCA channel transfer status * * \param pdca_ch_number PDCA channel * * \return PDCA transfer status with the following bit-masks:\n * - \c PDCA_TRANSFER_ERROR;\n * - \c PDCA_TRANSFER_COMPLETE;\n * - \c PDCA_TRANSFER_COUNTER_RELOAD_IS_ZERO. */ extern unsigned long pdca_get_transfer_status(unsigned int pdca_ch_number); #endif // _PDCA_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file has been prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Power Manager driver. * * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * *****************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "compiler.h" #include "pm.h" /*! \name PM Writable Bit-Field Registers */ //! @{ typedef union { unsigned long mcctrl; avr32_pm_mcctrl_t MCCTRL; } u_avr32_pm_mcctrl_t; typedef union { unsigned long cksel; avr32_pm_cksel_t CKSEL; } u_avr32_pm_cksel_t; typedef union { unsigned long pll; avr32_pm_pll_t PLL; } u_avr32_pm_pll_t; typedef union { unsigned long oscctrl0; avr32_pm_oscctrl0_t OSCCTRL0; } u_avr32_pm_oscctrl0_t; typedef union { unsigned long oscctrl1; avr32_pm_oscctrl1_t OSCCTRL1; } u_avr32_pm_oscctrl1_t; typedef union { unsigned long oscctrl32; avr32_pm_oscctrl32_t OSCCTRL32; } u_avr32_pm_oscctrl32_t; typedef union { unsigned long ier; avr32_pm_ier_t IER; } u_avr32_pm_ier_t; typedef union { unsigned long idr; avr32_pm_idr_t IDR; } u_avr32_pm_idr_t; typedef union { unsigned long icr; avr32_pm_icr_t ICR; } u_avr32_pm_icr_t; typedef union { unsigned long gcctrl; avr32_pm_gcctrl_t GCCTRL; } u_avr32_pm_gcctrl_t; typedef union { unsigned long rccr; avr32_pm_rccr_t RCCR; } u_avr32_pm_rccr_t; typedef union { unsigned long bgcr; avr32_pm_bgcr_t BGCR; } u_avr32_pm_bgcr_t; typedef union { unsigned long vregcr; avr32_pm_vregcr_t VREGCR; } u_avr32_pm_vregcr_t; typedef union { unsigned long bod; avr32_pm_bod_t BOD; } u_avr32_pm_bod_t; //! @} /*! \brief Sets the mode of the oscillator 0. * * \param pm Base address of the Power Manager (i.e. &AVR32_PM). * \param mode Oscillator 0 mode (i.e. AVR32_PM_OSCCTRL0_MODE_x). */ static void pm_set_osc0_mode(volatile avr32_pm_t *pm, unsigned int mode) { // Read u_avr32_pm_oscctrl0_t u_avr32_pm_oscctrl0 = {pm->oscctrl0}; // Modify u_avr32_pm_oscctrl0.OSCCTRL0.mode = mode; // Write pm->oscctrl0 = u_avr32_pm_oscctrl0.oscctrl0; } void pm_enable_osc0_ext_clock(volatile avr32_pm_t *pm) { pm_set_osc0_mode(pm, AVR32_PM_OSCCTRL0_MODE_EXT_CLOCK); } void pm_enable_osc0_crystal(volatile avr32_pm_t *pm, unsigned int fosc0) { pm_set_osc0_mode(pm, (fosc0 < 900000) ? AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G0 : (fosc0 < 3000000) ? AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G1 : (fosc0 < 8000000) ? AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G2 : AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G3); } void pm_enable_clk0(volatile avr32_pm_t *pm, unsigned int startup) { pm_enable_clk0_no_wait(pm, startup); pm_wait_for_clk0_ready(pm); } void pm_disable_clk0(volatile avr32_pm_t *pm) { pm->mcctrl &= ~AVR32_PM_MCCTRL_OSC0EN_MASK; } void pm_enable_clk0_no_wait(volatile avr32_pm_t *pm, unsigned int startup) { // Read register u_avr32_pm_oscctrl0_t u_avr32_pm_oscctrl0 = {pm->oscctrl0}; // Modify u_avr32_pm_oscctrl0.OSCCTRL0.startup = startup; // Write back pm->oscctrl0 = u_avr32_pm_oscctrl0.oscctrl0; pm->mcctrl |= AVR32_PM_MCCTRL_OSC0EN_MASK; } void pm_wait_for_clk0_ready(volatile avr32_pm_t *pm) { while (!(pm->poscsr & AVR32_PM_POSCSR_OSC0RDY_MASK)); } /*! \brief Sets the mode of the oscillator 1. * * \param pm Base address of the Power Manager (i.e. &AVR32_PM). * \param mode Oscillator 1 mode (i.e. AVR32_PM_OSCCTRL1_MODE_x). */ static void pm_set_osc1_mode(volatile avr32_pm_t *pm, unsigned int mode) { // Read u_avr32_pm_oscctrl1_t u_avr32_pm_oscctrl1 = {pm->oscctrl1}; // Modify u_avr32_pm_oscctrl1.OSCCTRL1.mode = mode; // Write pm->oscctrl1 = u_avr32_pm_oscctrl1.oscctrl1; } void pm_enable_osc1_ext_clock(volatile avr32_pm_t *pm) { pm_set_osc1_mode(pm, AVR32_PM_OSCCTRL1_MODE_EXT_CLOCK); } void pm_enable_osc1_crystal(volatile avr32_pm_t *pm, unsigned int fosc1) { pm_set_osc1_mode(pm, (fosc1 < 900000) ? AVR32_PM_OSCCTRL1_MODE_CRYSTAL_G0 : (fosc1 < 3000000) ? AVR32_PM_OSCCTRL1_MODE_CRYSTAL_G1 : (fosc1 < 8000000) ? AVR32_PM_OSCCTRL1_MODE_CRYSTAL_G2 : AVR32_PM_OSCCTRL1_MODE_CRYSTAL_G3); } void pm_enable_clk1(volatile avr32_pm_t *pm, unsigned int startup) { pm_enable_clk1_no_wait(pm, startup); pm_wait_for_clk1_ready(pm); } void pm_disable_clk1(volatile avr32_pm_t *pm) { pm->mcctrl &= ~AVR32_PM_MCCTRL_OSC1EN_MASK; } void pm_enable_clk1_no_wait(volatile avr32_pm_t *pm, unsigned int startup) { // Read register u_avr32_pm_oscctrl1_t u_avr32_pm_oscctrl1 = {pm->oscctrl1}; // Modify u_avr32_pm_oscctrl1.OSCCTRL1.startup = startup; // Write back pm->oscctrl1 = u_avr32_pm_oscctrl1.oscctrl1; pm->mcctrl |= AVR32_PM_MCCTRL_OSC1EN_MASK; } void pm_wait_for_clk1_ready(volatile avr32_pm_t *pm) { while (!(pm->poscsr & AVR32_PM_POSCSR_OSC1RDY_MASK)); } /*! \brief Sets the mode of the 32-kHz oscillator. * * \param pm Base address of the Power Manager (i.e. &AVR32_PM). * \param mode 32-kHz oscillator mode (i.e. AVR32_PM_OSCCTRL32_MODE_x). */ static void pm_set_osc32_mode(volatile avr32_pm_t *pm, unsigned int mode) { // Read u_avr32_pm_oscctrl32_t u_avr32_pm_oscctrl32 = {pm->oscctrl32}; // Modify u_avr32_pm_oscctrl32.OSCCTRL32.mode = mode; // Write pm->oscctrl32 = u_avr32_pm_oscctrl32.oscctrl32; } void pm_enable_osc32_ext_clock(volatile avr32_pm_t *pm) { pm_set_osc32_mode(pm, AVR32_PM_OSCCTRL32_MODE_EXT_CLOCK); } void pm_enable_osc32_crystal(volatile avr32_pm_t *pm) { pm_set_osc32_mode(pm, AVR32_PM_OSCCTRL32_MODE_CRYSTAL); } void pm_enable_clk32(volatile avr32_pm_t *pm, unsigned int startup) { pm_enable_clk32_no_wait(pm, startup); pm_wait_for_clk32_ready(pm); } void pm_disable_clk32(volatile avr32_pm_t *pm) { pm->oscctrl32 &= ~AVR32_PM_OSCCTRL32_OSC32EN_MASK; } void pm_enable_clk32_no_wait(volatile avr32_pm_t *pm, unsigned int startup) { // Read register u_avr32_pm_oscctrl32_t u_avr32_pm_oscctrl32 = {pm->oscctrl32}; // Modify u_avr32_pm_oscctrl32.OSCCTRL32.osc32en = 1; u_avr32_pm_oscctrl32.OSCCTRL32.startup = startup; // Write back pm->oscctrl32 = u_avr32_pm_oscctrl32.oscctrl32; } void pm_wait_for_clk32_ready(volatile avr32_pm_t *pm) { while (!(pm->poscsr & AVR32_PM_POSCSR_OSC32RDY_MASK)); } void pm_cksel(volatile avr32_pm_t *pm, unsigned int pbadiv, unsigned int pbasel, unsigned int pbbdiv, unsigned int pbbsel, unsigned int hsbdiv, unsigned int hsbsel) { u_avr32_pm_cksel_t u_avr32_pm_cksel = {0}; u_avr32_pm_cksel.CKSEL.cpusel = hsbsel; u_avr32_pm_cksel.CKSEL.cpudiv = hsbdiv; u_avr32_pm_cksel.CKSEL.hsbsel = hsbsel; u_avr32_pm_cksel.CKSEL.hsbdiv = hsbdiv; u_avr32_pm_cksel.CKSEL.pbasel = pbasel; u_avr32_pm_cksel.CKSEL.pbadiv = pbadiv; u_avr32_pm_cksel.CKSEL.pbbsel = pbbsel; u_avr32_pm_cksel.CKSEL.pbbdiv = pbbdiv; pm->cksel = u_avr32_pm_cksel.cksel; // Wait for ckrdy bit and then clear it while (!(pm->poscsr & AVR32_PM_POSCSR_CKRDY_MASK)); } void pm_gc_setup(volatile avr32_pm_t *pm, unsigned int gc, unsigned int osc_or_pll, // Use Osc (=0) or PLL (=1) unsigned int pll_osc, // Sel Osc0/PLL0 or Osc1/PLL1 unsigned int diven, unsigned int div) { u_avr32_pm_gcctrl_t u_avr32_pm_gcctrl = {0}; u_avr32_pm_gcctrl.GCCTRL.oscsel = pll_osc; u_avr32_pm_gcctrl.GCCTRL.pllsel = osc_or_pll; u_avr32_pm_gcctrl.GCCTRL.diven = diven; u_avr32_pm_gcctrl.GCCTRL.div = div; pm->gcctrl[gc] = u_avr32_pm_gcctrl.gcctrl; } void pm_gc_enable(volatile avr32_pm_t *pm, unsigned int gc) { pm->gcctrl[gc] |= AVR32_PM_GCCTRL_CEN_MASK; } void pm_gc_disable(volatile avr32_pm_t *pm, unsigned int gc) { pm->gcctrl[gc] &= ~AVR32_PM_GCCTRL_CEN_MASK; } void pm_pll_setup(volatile avr32_pm_t *pm, unsigned int pll, unsigned int mul, unsigned int div, unsigned int osc, unsigned int lockcount) { u_avr32_pm_pll_t u_avr32_pm_pll = {0}; u_avr32_pm_pll.PLL.pllosc = osc; u_avr32_pm_pll.PLL.plldiv = div; u_avr32_pm_pll.PLL.pllmul = mul; u_avr32_pm_pll.PLL.pllcount = lockcount; pm->pll[pll] = u_avr32_pm_pll.pll; } void pm_pll_set_option(volatile avr32_pm_t *pm, unsigned int pll, unsigned int pll_freq, unsigned int pll_div2, unsigned int pll_wbwdisable) { u_avr32_pm_pll_t u_avr32_pm_pll = {pm->pll[pll]}; u_avr32_pm_pll.PLL.pllopt = pll_freq | (pll_div2 << 1) | (pll_wbwdisable << 2); pm->pll[pll] = u_avr32_pm_pll.pll; } unsigned int pm_pll_get_option(volatile avr32_pm_t *pm, unsigned int pll) { return (pm->pll[pll] & AVR32_PM_PLLOPT_MASK) >> AVR32_PM_PLLOPT_OFFSET; } void pm_pll_enable(volatile avr32_pm_t *pm, unsigned int pll) { pm->pll[pll] |= AVR32_PM_PLLEN_MASK; } void pm_pll_disable(volatile avr32_pm_t *pm, unsigned int pll) { pm->pll[pll] &= ~AVR32_PM_PLLEN_MASK; } void pm_wait_for_pll0_locked(volatile avr32_pm_t *pm) { while (!(pm->poscsr & AVR32_PM_POSCSR_LOCK0_MASK)); } void pm_wait_for_pll1_locked(volatile avr32_pm_t *pm) { while (!(pm->poscsr & AVR32_PM_POSCSR_LOCK1_MASK)); } void pm_switch_to_clock(volatile avr32_pm_t *pm, unsigned long clock) { // Read u_avr32_pm_mcctrl_t u_avr32_pm_mcctrl = {pm->mcctrl}; // Modify u_avr32_pm_mcctrl.MCCTRL.mcsel = clock; // Write back pm->mcctrl = u_avr32_pm_mcctrl.mcctrl; } void pm_switch_to_osc0(volatile avr32_pm_t *pm, unsigned int fosc0, unsigned int startup) { pm_enable_osc0_crystal(pm, fosc0); // Enable the Osc0 in crystal mode pm_enable_clk0(pm, startup); // Crystal startup time - This parameter is critical and depends on the characteristics of the crystal pm_switch_to_clock(pm, AVR32_PM_MCSEL_OSC0); // Then switch main clock to Osc0 } void pm_bod_enable_irq(volatile avr32_pm_t *pm) { pm->ier = AVR32_PM_IER_BODDET_MASK; } void pm_bod_disable_irq(volatile avr32_pm_t *pm) { Bool global_interrupt_enabled = Is_global_interrupt_enabled(); if (global_interrupt_enabled) Disable_global_interrupt(); pm->idr = AVR32_PM_IDR_BODDET_MASK; pm->isr; if (global_interrupt_enabled) Enable_global_interrupt(); } void pm_bod_clear_irq(volatile avr32_pm_t *pm) { pm->icr = AVR32_PM_ICR_BODDET_MASK; } unsigned long pm_bod_get_irq_status(volatile avr32_pm_t *pm) { return ((pm->isr & AVR32_PM_ISR_BODDET_MASK) != 0); } unsigned long pm_bod_get_irq_enable_bit(volatile avr32_pm_t *pm) { return ((pm->imr & AVR32_PM_IMR_BODDET_MASK) != 0); } unsigned long pm_bod_get_level(volatile avr32_pm_t *pm) { return (pm->bod & AVR32_PM_BOD_LEVEL_MASK) >> AVR32_PM_BOD_LEVEL_OFFSET; } unsigned long pm_read_gplp(volatile avr32_pm_t *pm, unsigned long gplp) { return pm->gplp[gplp]; } void pm_write_gplp(volatile avr32_pm_t *pm, unsigned long gplp, unsigned long value) { pm->gplp[gplp] = value; } long pm_enable_module(volatile avr32_pm_t *pm, unsigned long module) { unsigned long domain = module>>5; unsigned long *regptr = (unsigned long*)(&(pm->cpumask) + domain); // Implementation-specific shortcut: the ckMASK registers are contiguous and // memory-mapped in that order: CPUMASK, HSBMASK, PBAMASK, PBBMASK. *regptr |= (1<<(module%32)); return PASS; } long pm_disable_module(volatile avr32_pm_t *pm, unsigned long module) { unsigned long domain = module>>5; unsigned long *regptr = (unsigned long*)(&(pm->cpumask) + domain); // Implementation-specific shortcut: the ckMASK registers are contiguous and // memory-mapped in that order: CPUMASK, HSBMASK, PBAMASK, PBBMASK. *regptr &= ~(1<<(module%32)); return PASS; } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file has been prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Power Manager driver. * * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * *****************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _PM_H_ #define _PM_H_ #include #include "compiler.h" #include "preprocessor.h" /*! \brief Sets the MCU in the specified sleep mode. * * \param mode Sleep mode: * \arg \c AVR32_PM_SMODE_IDLE: Idle; * \arg \c AVR32_PM_SMODE_FROZEN: Frozen; * \arg \c AVR32_PM_SMODE_STANDBY: Standby; * \arg \c AVR32_PM_SMODE_STOP: Stop; * \arg \c AVR32_PM_SMODE_DEEP_STOP: DeepStop; * \arg \c AVR32_PM_SMODE_STATIC: Static. */ #define SLEEP(mode) {__asm__ __volatile__ ("sleep "STRINGZ(mode));} //! Input and output parameters when initializing PM clocks using pm_configure_clocks(). typedef struct { //! CPU frequency (input/output argument). unsigned long cpu_f; //! PBA frequency (input/output argument). unsigned long pba_f; //! Oscillator 0's external crystal(or external clock) frequency (board dependant) (input argument). unsigned long osc0_f; //! Oscillator 0's external crystal(or external clock) startup time: AVR32_PM_OSCCTRL0_STARTUP_x_RCOSC (input argument). unsigned long osc0_startup; } pm_freq_param_t; #define PM_FREQ_STATUS_FAIL (-1) #define PM_FREQ_STATUS_OK (0) /*! \brief Gets the MCU reset cause. * * \param pm Base address of the Power Manager instance (i.e. &AVR32_PM). * * \return The MCU reset cause which can be masked with the * \c AVR32_PM_RCAUSE_x_MASK bit-masks to isolate specific causes. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ unsigned int pm_get_reset_cause(volatile avr32_pm_t *pm) { return pm->rcause; } /*! * \brief This function will enable the external clock mode of the oscillator 0. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) */ extern void pm_enable_osc0_ext_clock(volatile avr32_pm_t *pm); /*! * \brief This function will enable the crystal mode of the oscillator 0. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param fosc0 Oscillator 0 crystal frequency (Hz) */ extern void pm_enable_osc0_crystal(volatile avr32_pm_t *pm, unsigned int fosc0); /*! * \brief This function will enable the oscillator 0 to be used with a startup time. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param startup Clock 0 startup time. AVR32_PM_OSCCTRL0_STARTUP_x_RCOSC. */ extern void pm_enable_clk0(volatile avr32_pm_t *pm, unsigned int startup); /*! * \brief This function will disable the oscillator 0. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) */ extern void pm_disable_clk0(volatile avr32_pm_t *pm); /*! * \brief This function will enable the oscillator 0 to be used with no startup time. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param startup Clock 0 startup time, for which the function does not wait. AVR32_PM_OSCCTRL0_STARTUP_x_RCOSC. */ extern void pm_enable_clk0_no_wait(volatile avr32_pm_t *pm, unsigned int startup); /*! * \brief This function will wait until the Osc0 clock is ready. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) */ extern void pm_wait_for_clk0_ready(volatile avr32_pm_t *pm); /*! * \brief This function will enable the external clock mode of the oscillator 1. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) */ extern void pm_enable_osc1_ext_clock(volatile avr32_pm_t *pm); /*! * \brief This function will enable the crystal mode of the oscillator 1. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param fosc1 Oscillator 1 crystal frequency (Hz) */ extern void pm_enable_osc1_crystal(volatile avr32_pm_t *pm, unsigned int fosc1); /*! * \brief This function will enable the oscillator 1 to be used with a startup time. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param startup Clock 1 startup time. AVR32_PM_OSCCTRL1_STARTUP_x_RCOSC. */ extern void pm_enable_clk1(volatile avr32_pm_t *pm, unsigned int startup); /*! * \brief This function will disable the oscillator 1. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) */ extern void pm_disable_clk1(volatile avr32_pm_t *pm); /*! * \brief This function will enable the oscillator 1 to be used with no startup time. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param startup Clock 1 startup time, for which the function does not wait. AVR32_PM_OSCCTRL1_STARTUP_x_RCOSC. */ extern void pm_enable_clk1_no_wait(volatile avr32_pm_t *pm, unsigned int startup); /*! * \brief This function will wait until the Osc1 clock is ready. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) */ extern void pm_wait_for_clk1_ready(volatile avr32_pm_t *pm); /*! * \brief This function will enable the external clock mode of the 32-kHz oscillator. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) */ extern void pm_enable_osc32_ext_clock(volatile avr32_pm_t *pm); /*! * \brief This function will enable the crystal mode of the 32-kHz oscillator. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) */ extern void pm_enable_osc32_crystal(volatile avr32_pm_t *pm); /*! * \brief This function will enable the oscillator 32 to be used with a startup time. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param startup Clock 32 kHz startup time. AVR32_PM_OSCCTRL32_STARTUP_x_RCOSC. */ extern void pm_enable_clk32(volatile avr32_pm_t *pm, unsigned int startup); /*! * \brief This function will disable the oscillator 32. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) */ extern void pm_disable_clk32(volatile avr32_pm_t *pm); /*! * \brief This function will enable the oscillator 32 to be used with no startup time. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param startup Clock 32 kHz startup time, for which the function does not wait. AVR32_PM_OSCCTRL32_STARTUP_x_RCOSC. */ extern void pm_enable_clk32_no_wait(volatile avr32_pm_t *pm, unsigned int startup); /*! * \brief This function will wait until the osc32 clock is ready. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) */ extern void pm_wait_for_clk32_ready(volatile avr32_pm_t *pm); /*! * \brief This function will select all the power manager clocks. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param pbadiv Peripheral Bus A clock divisor enable * \param pbasel Peripheral Bus A select * \param pbbdiv Peripheral Bus B clock divisor enable * \param pbbsel Peripheral Bus B select * \param hsbdiv High Speed Bus clock divisor enable (CPU clock = HSB clock) * \param hsbsel High Speed Bus select (CPU clock = HSB clock ) */ extern void pm_cksel(volatile avr32_pm_t *pm, unsigned int pbadiv, unsigned int pbasel, unsigned int pbbdiv, unsigned int pbbsel, unsigned int hsbdiv, unsigned int hsbsel); /*! * \brief This function will setup a generic clock. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param gc generic clock number (0 for gc0...) * \param osc_or_pll Use OSC (=0) or PLL (=1) * \param pll_osc Select Osc0/PLL0 or Osc1/PLL1 * \param diven Generic clock divisor enable * \param div Generic clock divisor */ extern void pm_gc_setup(volatile avr32_pm_t *pm, unsigned int gc, unsigned int osc_or_pll, unsigned int pll_osc, unsigned int diven, unsigned int div); /*! * \brief This function will enable a generic clock. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param gc generic clock number (0 for gc0...) */ extern void pm_gc_enable(volatile avr32_pm_t *pm, unsigned int gc); /*! * \brief This function will disable a generic clock. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param gc generic clock number (0 for gc0...) */ extern void pm_gc_disable(volatile avr32_pm_t *pm, unsigned int gc); /*! * \brief This function will setup a PLL. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param pll PLL number(0 for PLL0, 1 for PLL1) * \param mul PLL MUL in the PLL formula * \param div PLL DIV in the PLL formula * \param osc OSC number (0 for osc0, 1 for osc1) * \param lockcount PLL lockount */ extern void pm_pll_setup(volatile avr32_pm_t *pm, unsigned int pll, unsigned int mul, unsigned int div, unsigned int osc, unsigned int lockcount); /*! * \brief This function will set a PLL option. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param pll PLL number(0 for PLL0, 1 for PLL1) * \param pll_freq Set to 1 for VCO frequency range 80-180MHz, set to 0 for VCO frequency range 160-240Mhz. * \param pll_div2 Divide the PLL output frequency by 2 (this settings does not change the FVCO value) * \param pll_wbwdisable 1 Disable the Wide-Bandith Mode (Wide-Bandwith mode allow a faster startup time and out-of-lock time). 0 to enable the Wide-Bandith Mode. */ extern void pm_pll_set_option(volatile avr32_pm_t *pm, unsigned int pll, unsigned int pll_freq, unsigned int pll_div2, unsigned int pll_wbwdisable); /*! * \brief This function will get a PLL option. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param pll PLL number(0 for PLL0, 1 for PLL1) * \return Option */ extern unsigned int pm_pll_get_option(volatile avr32_pm_t *pm, unsigned int pll); /*! * \brief This function will enable a PLL. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param pll PLL number(0 for PLL0, 1 for PLL1) */ extern void pm_pll_enable(volatile avr32_pm_t *pm, unsigned int pll); /*! * \brief This function will disable a PLL. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param pll PLL number(0 for PLL0, 1 for PLL1) */ extern void pm_pll_disable(volatile avr32_pm_t *pm, unsigned int pll); /*! * \brief This function will wait for PLL0 locked * \param pm Base address of the Power Manager (i.e. &AVR32_PM) */ extern void pm_wait_for_pll0_locked(volatile avr32_pm_t *pm); /*! * \brief This function will wait for PLL1 locked * \param pm Base address of the Power Manager (i.e. &AVR32_PM) */ extern void pm_wait_for_pll1_locked(volatile avr32_pm_t *pm); /*! * \brief This function will switch the power manager main clock. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param clock Clock to be switched on. AVR32_PM_MCSEL_SLOW for RCOsc, AVR32_PM_MCSEL_OSC0 for Osc0, AVR32_PM_MCSEL_PLL0 for PLL0. */ extern void pm_switch_to_clock(volatile avr32_pm_t *pm, unsigned long clock); /*! * \brief Switch main clock to clock Osc0 (crystal mode) * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param fosc0 Oscillator 0 crystal frequency (Hz) * \param startup Crystal 0 startup time. AVR32_PM_OSCCTRL0_STARTUP_x_RCOSC. */ extern void pm_switch_to_osc0(volatile avr32_pm_t *pm, unsigned int fosc0, unsigned int startup); /*! \brief Enables the Brown-Out Detector interrupt. * * \param pm Base address of the Power Manager (i.e. &AVR32_PM). */ extern void pm_bod_enable_irq(volatile avr32_pm_t *pm); /*! \brief Disables the Brown-Out Detector interrupt. * * \param pm Base address of the Power Manager (i.e. &AVR32_PM). */ extern void pm_bod_disable_irq(volatile avr32_pm_t *pm); /*! \brief Clears the Brown-Out Detector interrupt flag. * * \param pm Base address of the Power Manager (i.e. &AVR32_PM). */ extern void pm_bod_clear_irq(volatile avr32_pm_t *pm); /*! \brief Gets the Brown-Out Detector interrupt flag. * * \param pm Base address of the Power Manager (i.e. &AVR32_PM). * * \retval 0 No BOD interrupt. * \retval 1 BOD interrupt pending. */ extern unsigned long pm_bod_get_irq_status(volatile avr32_pm_t *pm); /*! \brief Gets the Brown-Out Detector interrupt enable status. * * \param pm Base address of the Power Manager (i.e. &AVR32_PM). * * \retval 0 BOD interrupt disabled. * \retval 1 BOD interrupt enabled. */ extern unsigned long pm_bod_get_irq_enable_bit(volatile avr32_pm_t *pm); /*! \brief Gets the triggering threshold of the Brown-Out Detector. * * \param pm Base address of the Power Manager (i.e. &AVR32_PM). * * \return Triggering threshold of the BOD. See the electrical characteristics * in the part datasheet for actual voltage levels. */ extern unsigned long pm_bod_get_level(volatile avr32_pm_t *pm); /*! * \brief Read the content of the PM GPLP registers * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param gplp GPLP register index (0,1,... depending on the number of GPLP registers for a given part) * * \return The content of the chosen GPLP register. */ extern unsigned long pm_read_gplp(volatile avr32_pm_t *pm, unsigned long gplp); /*! * \brief Write into the PM GPLP registers * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param gplp GPLP register index (0,1,... depending on the number of GPLP registers for a given part) * \param value Value to write */ extern void pm_write_gplp(volatile avr32_pm_t *pm, unsigned long gplp, unsigned long value); /*! \brief Enable the clock of a module. * * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param module The module to clock (use one of the defines in the part-specific * header file under "toolchain folder"/avr32/inc(lude)/avr32/; depending on the * clock domain, look for the sections "CPU clocks", "HSB clocks", "PBx clocks") * * \return Status. * \retval 0 Success. * \retval <0 An error occured. */ extern long pm_enable_module(volatile avr32_pm_t *pm, unsigned long module); /*! \brief Disable the clock of a module. * * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param module The module to shut down (use one of the defines in the part-specific * header file under "toolchain folder"/avr32/inc(lude)/avr32/; depending on the * clock domain, look for the sections "CPU clocks", "HSB clocks", "PBx clocks") * * \return Status. * \retval 0 Success. * \retval <0 An error occured. */ extern long pm_disable_module(volatile avr32_pm_t *pm, unsigned long module); /*! \brief Automatically configure the CPU, PBA, PBB, and HSB clocks * according to the user wishes. * * This function needs some parameters stored in a pm_freq_param_t structure: * - cpu_f and pba_f are the wanted frequencies, * - osc0_f is the oscillator 0 on-board frequency (e.g. FOSC0), * - osc0_startup is the oscillator 0 startup time (e.g. OSC0_STARTUP). * * The function will then configure the clocks using the following rules: * - It first try to find a valid PLL frequency (the highest possible value to avoid jitter) in order * to satisfy the CPU frequency, * - It optimizes the configuration depending the various divide stages, * - Then, the PBA frequency is configured from the CPU freq. * - Note that HSB and PBB are configured with the same frequency as CPU. * - Note also that the number of wait states of the flash read accesses is automatically set-up depending * the CPU frequency. As a consequence, the application needs the FLASHC driver to compile. * * The CPU, HSB and PBA frequencies programmed after configuration are stored back into cpu_f and pba_f. * * \param param pointer on the configuration structure. * * \retval PM_FREQ_STATUS_OK Mode successfully initialized. * \retval PM_FREQ_STATUS_FAIL The configuration can not be done. */ extern int pm_configure_clocks(pm_freq_param_t *param); /*! \brief Automatically configure the USB clock. * * USB clock is configured to 48MHz, using the PLL1 from the Oscillator0, assuming * a 12 MHz crystal is connected to it. */ extern void pm_configure_usb_clock(void); #endif // _PM_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm_conf_clocks.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file has been prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Power Manager clocks configuration helper. * * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * *****************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include #include "compiler.h" #include "pm.h" extern void flashc_set_wait_state(unsigned int wait_state); #if (defined AVR32_FLASHC_210_H_INCLUDED) extern void flashc_issue_command(unsigned int command, int page_number); #endif #define PM_MAX_MUL ((1 << AVR32_PM_PLL0_PLLMUL_SIZE) - 1) int pm_configure_clocks(pm_freq_param_t *param) { // Supported frequencies: // Fosc0 mul div PLL div2_en cpu_f pba_f Comment // 12 15 1 192 1 12 12 // 12 9 3 40 1 20 20 PLL out of spec // 12 15 1 192 1 24 12 // 12 9 1 120 1 30 15 // 12 9 3 40 0 40 20 PLL out of spec // 12 15 1 192 1 48 12 // 12 15 1 192 1 48 24 // 12 8 1 108 1 54 27 // 12 9 1 120 1 60 15 // 12 9 1 120 1 60 30 // 12 10 1 132 1 66 16.5 // unsigned long in_cpu_f = param->cpu_f; unsigned long in_osc0_f = param->osc0_f; unsigned long mul, div, div2_en = 0, div2_cpu = 0, div2_pba = 0; unsigned long pll_freq, rest; Bool b_div2_pba, b_div2_cpu; // Switch to external Oscillator 0 pm_switch_to_osc0(&AVR32_PM, in_osc0_f, param->osc0_startup); // Start with CPU freq config if (in_cpu_f == in_osc0_f) { param->cpu_f = in_osc0_f; param->pba_f = in_osc0_f; return PM_FREQ_STATUS_OK; } else if (in_cpu_f < in_osc0_f) { // TBD } rest = in_cpu_f % in_osc0_f; for (div = 1; div < 32; div++) { if ((div * rest) % in_osc0_f == 0) break; } if (div == 32) return PM_FREQ_STATUS_FAIL; mul = (in_cpu_f * div) / in_osc0_f; if (mul > PM_MAX_MUL) return PM_FREQ_STATUS_FAIL; // export 2power from PLL div to div2_cpu while (!(div % 2)) { div /= 2; div2_cpu++; } // Here we know the mul and div parameter of the PLL config. // . Check out if the PLL has a valid in_cpu_f. // . Try to have for the PLL frequency (VCO output) the highest possible value // to reduce jitter. while (in_osc0_f * 2 * mul / div < AVR32_PM_PLL_VCO_RANGE0_MAX_FREQ) { if (2 * mul > PM_MAX_MUL) break; mul *= 2; div2_cpu++; } if (div2_cpu != 0) { div2_cpu--; div2_en = 1; } pll_freq = in_osc0_f * mul / (div * (1 << div2_en)); // Update real CPU Frequency param->cpu_f = pll_freq / (1 << div2_cpu); mul--; pm_pll_setup(&AVR32_PM , 0 // pll , mul // mul , div // div , 0 // osc , 16 // lockcount ); pm_pll_set_option(&AVR32_PM , 0 // pll // PLL clock is lower than 160MHz: need to set pllopt. , (pll_freq < AVR32_PM_PLL_VCO_RANGE0_MIN_FREQ) ? 1 : 0 // pll_freq , div2_en // pll_div2 , 0 // pll_wbwdisable ); rest = pll_freq; while (rest > AVR32_PM_PBA_MAX_FREQ || rest != param->pba_f) { div2_pba++; rest = pll_freq / (1 << div2_pba); if (rest < param->pba_f) break; } // Update real PBA Frequency param->pba_f = pll_freq / (1 << div2_pba); // Enable PLL0 pm_pll_enable(&AVR32_PM, 0); // Wait for PLL0 locked pm_wait_for_pll0_locked(&AVR32_PM); if (div2_cpu) { b_div2_cpu = TRUE; div2_cpu--; } else b_div2_cpu = FALSE; if (div2_pba) { b_div2_pba = TRUE; div2_pba--; } else b_div2_pba = FALSE; pm_cksel(&AVR32_PM , b_div2_pba, div2_pba // PBA , b_div2_cpu, div2_cpu // PBB , b_div2_cpu, div2_cpu // HSB ); if (param->cpu_f > AVR32_FLASHC_FWS_0_MAX_FREQ) { flashc_set_wait_state(1); #if (defined AVR32_FLASHC_210_H_INCLUDED) if (param->cpu_f > AVR32_FLASHC_HSEN_FWS_1_MAX_FREQ) flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSEN, -1); else flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSDIS, -1); #endif } else { flashc_set_wait_state(0); #if (defined AVR32_FLASHC_210_H_INCLUDED) if (param->cpu_f > AVR32_FLASHC_HSEN_FWS_0_MAX_FREQ) flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSEN, -1); else flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSDIS, -1); #endif } pm_switch_to_clock(&AVR32_PM, AVR32_PM_MCCTRL_MCSEL_PLL0); return PM_FREQ_STATUS_OK; } void pm_configure_usb_clock(void) { #if UC3A3 // Setup USB GCLK. pm_gc_setup(&AVR32_PM, AVR32_PM_GCLK_USBB, // gc 0, // osc_or_pll: use Osc (if 0) or PLL (if 1) 0, // pll_osc: select Osc0/PLL0 or Osc1/PLL1 0, // diven 0); // div // Enable USB GCLK. pm_gc_enable(&AVR32_PM, AVR32_PM_GCLK_USBB); #else // Use 12MHz from OSC0 and generate 96 MHz pm_pll_setup(&AVR32_PM, 1, // pll. 7, // mul. 1, // div. 0, // osc. 16); // lockcount. pm_pll_set_option(&AVR32_PM, 1, // pll. 1, // pll_freq: choose the range 80-180MHz. 1, // pll_div2. 0); // pll_wbwdisable. // start PLL1 and wait forl lock pm_pll_enable(&AVR32_PM, 1); // Wait for PLL1 locked. pm_wait_for_pll1_locked(&AVR32_PM); pm_gc_setup(&AVR32_PM, AVR32_PM_GCLK_USBB, // gc. 1, // osc_or_pll: use Osc (if 0) or PLL (if 1). 1, // pll_osc: select Osc0/PLL0 or Osc1/PLL1. 0, // diven. 0); // div. pm_gc_enable(&AVR32_PM, AVR32_PM_GCLK_USBB); #endif } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/power_clocks_lib.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file has been prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief High-level library abstracting features such as oscillators/pll/dfll * configuration, clock configuration, System-sensible parameters * configuration, buses clocks configuration, sleep mode, reset. * * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * *****************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "power_clocks_lib.h" //! Device-specific data #if UC3L static long int pcl_configure_clocks_uc3l(pcl_freq_param_t *param); // FORWARD declaration #endif #if UC3C static long int pcl_configure_clocks_uc3c(pcl_freq_param_t *param); // FORWARD declaration #endif long int pcl_configure_clocks(pcl_freq_param_t *param) { #ifndef AVR32_PM_VERSION_RESETVALUE // Implementation for UC3A, UC3A3, UC3B parts. return(pm_configure_clocks(param)); #else #ifdef AVR32_PM_410_H_INCLUDED // Implementation for UC3C parts. return(pcl_configure_clocks_uc3c(param)); #else // Implementation for UC3L parts. return(pcl_configure_clocks_uc3l(param)); #endif #endif } //! Device-specific implementation #if UC3L // FORWARD declaration static long int pcl_configure_synchronous_clocks( pm_clk_src_t main_clk_src, unsigned long main_clock_freq_hz, pcl_freq_param_t *param); long int pcl_configure_clocks_rcsys(pcl_freq_param_t *param) { // Supported main clock sources: PCL_MC_RCSYS // Supported synchronous clocks frequencies if RCSYS is the main clock source: // 115200Hz, 57600Hz, 28800Hz, 14400Hz, 7200Hz, 3600Hz, 1800Hz, 900Hz, 450Hz. // NOTE: by default, this implementation doesn't perform thorough checks on the // input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. #ifdef AVR32SFW_INPUT_CHECK // Verify that fCPU >= fPBx if((param->cpu_f < param->pba_f) || (param->cpu_f < param->pbb_f)) return(-1); #endif #ifdef AVR32SFW_INPUT_CHECK // Verify that the target frequencies are reachable. if((param->cpu_f > SCIF_SLOWCLOCK_FREQ_HZ) || (param->pba_f > SCIF_SLOWCLOCK_FREQ_HZ) || (param->pbb_f > SCIF_SLOWCLOCK_FREQ_HZ)) return(-1); #endif return(pcl_configure_synchronous_clocks(PM_CLK_SRC_SLOW, SCIF_SLOWCLOCK_FREQ_HZ, param)); } long int pcl_configure_clocks_rc120m(pcl_freq_param_t *param) { // Supported main clock sources: PCL_MC_RC120M // Supported synchronous clocks frequencies if RC120M is the main clock source: // 30MHz, 15MHz, 7.5MHz, 3.75MHz, 1.875MHz, 937.5kHz, 468.75kHz. // NOTE: by default, this implementation doesn't perform thorough checks on the // input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. #ifdef AVR32SFW_INPUT_CHECK // Verify that fCPU >= fPBx if((param->cpu_f < param->pba_f) || (param->cpu_f < param->pbb_f)) return(-1); #endif #ifdef AVR32SFW_INPUT_CHECK // Verify that the target frequencies are reachable. if((param->cpu_f > SCIF_RC120M_FREQ_HZ) || (param->pba_f > SCIF_RC120M_FREQ_HZ) || (param->pbb_f > SCIF_RC120M_FREQ_HZ)) return(-1); #endif // Start the 120MHz internal RCosc (RC120M) clock scif_start_rc120M(); return(pcl_configure_synchronous_clocks(PM_CLK_SRC_RC120M, SCIF_RC120M_FREQ_HZ, param)); } long int pcl_configure_clocks_osc0(pcl_freq_param_t *param) { // Supported main clock sources: PCL_MC_OSC0 // Supported synchronous clocks frequencies if OSC0 is the main clock source: // (these obviously depend on the OSC0 frequency; we'll take 16MHz as an example) // 16MHz, 8MHz, 4MHz, 2MHz, 1MHz, 500kHz, 250kHz, 125kHz, 62.5kHz. // NOTE: by default, this implementation doesn't perform thorough checks on the // input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. unsigned long main_clock_freq; #ifdef AVR32SFW_INPUT_CHECK // Verify that fCPU >= fPBx if((param->cpu_f < param->pba_f) || (param->cpu_f < param->pbb_f)) return(-1); #endif main_clock_freq = param->osc0_f; #ifdef AVR32SFW_INPUT_CHECK // Verify that the target frequencies are reachable. if((param->cpu_f > main_clock_freq) || (param->pba_f > main_clock_freq) || (param->pbb_f > main_clock_freq)) return(-1); #endif // Configure OSC0 in crystal mode, external crystal with a fcrystal Hz frequency. scif_configure_osc_crystalmode(SCIF_OSC0, main_clock_freq); // Enable the OSC0 scif_enable_osc(SCIF_OSC0, param->osc0_startup, true); return(pcl_configure_synchronous_clocks(PM_CLK_SRC_OSC0, main_clock_freq, param)); } long int pcl_configure_clocks_dfll0(pcl_freq_param_t *param) { // Supported main clock sources: PCL_MC_DFLL // Supported synchronous clocks frequencies if DFLL is the main clock source: // (these obviously depend on the DFLL target frequency; we'll take 100MHz as an example) // 50MHz, 25MHz, 12.5MHz, 6.25MHz, 3.125MHz, 1562.5kHz, 781.25kHz, 390.625kHz. // NOTE: by default, this implementation doesn't perform thorough checks on the // input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. unsigned long main_clock_freq; scif_gclk_opt_t *pgc_dfllif_ref_opt; #ifdef AVR32SFW_INPUT_CHECK // Verify that fCPU >= fPBx if((param->cpu_f < param->pba_f) || (param->cpu_f < param->pbb_f)) return(-1); #endif main_clock_freq = param->dfll_f; #ifdef AVR32SFW_INPUT_CHECK // Verify that the target DFLL output frequency is in the correct range. if((main_clock_freq > SCIF_DFLL_MAXFREQ_HZ) || (main_clock_freq < SCIF_DFLL_MINFREQ_HZ)) return(-1); // Verify that the target frequencies are reachable. if((param->cpu_f > main_clock_freq) || (param->pba_f > main_clock_freq) || (param->pbb_f > main_clock_freq)) return(-1); #endif pgc_dfllif_ref_opt = (scif_gclk_opt_t *)param->pextra_params; // Implementation note: this implementation configures the DFLL in closed-loop // mode (because it gives the best accuracy) which enables the generic clock CLK_DFLLIF_REF // as a reference (RCSYS being used as the generic clock source, undivided). scif_dfll0_closedloop_configure_and_start(pgc_dfllif_ref_opt, main_clock_freq, TRUE); return(pcl_configure_synchronous_clocks(PM_CLK_SRC_DFLL0, main_clock_freq, param)); } static long int pcl_configure_clocks_uc3l(pcl_freq_param_t *param) { // Supported main clock sources: PCL_MC_RCSYS, PCL_MC_OSC0, PCL_MC_DFLL0, PCL_MC_RC120M // Supported synchronous clocks frequencies if RCSYS is the main clock source: // 115200Hz, 57600Hz, 28800Hz, 14400Hz, 7200Hz, 3600Hz, 1800Hz, 900Hz, 450Hz. // Supported synchronous clocks frequencies if RC120M is the main clock source: // 30MHz, 15MHz, 7.5MHz, 3.75MHz, 1.875MHz, 937.5kHz, 468.75kHz. // Supported synchronous clocks frequencies if OSC0 is the main clock source: // (these obviously depend on the OSC0 frequency; we'll take 16MHz as an example) // 16MHz, 8MHz, 4MHz, 2MHz, 1MHz, 500kHz, 250kHz, 125kHz, 62.5kHz. // Supported synchronous clocks frequencies if DFLL is the main clock source: // (these obviously depend on the DFLL target frequency; we'll take 100MHz as an example) // 50MHz, 25MHz, 12.5MHz, 6.25MHz, 3.125MHz, 1562.5kHz, 781.25kHz, 390.625kHz. // NOTE: by default, this implementation doesn't perform thorough checks on the // input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. #ifdef AVR32SFW_INPUT_CHECK // Verify that fCPU >= fPBx if((param->cpu_f < param->pba_f) || (param->cpu_f < param->pbb_f)) return(-1); #endif if(PCL_MC_RCSYS == param->main_clk_src) { return(pcl_configure_clocks_rcsys(param)); } else if(PCL_MC_RC120M == param->main_clk_src) { return(pcl_configure_clocks_rc120m(param)); } else if(PCL_MC_OSC0 == param->main_clk_src) { return(pcl_configure_clocks_osc0(param)); } else // PCL_MC_DFLL0 == param->main_clk_src { return(pcl_configure_clocks_dfll0(param)); } } static long int pcl_configure_synchronous_clocks(pm_clk_src_t main_clk_src, unsigned long main_clock_freq_hz, pcl_freq_param_t *param) { //# //# Set the Synchronous clock division ratio for each clock domain //# pm_set_all_cksel(main_clock_freq_hz, param->cpu_f, param->pba_f, param->pbb_f); //# //# Set the Flash wait state and the speed read mode (depending on the target CPU frequency). //# #if UC3L flashcdw_set_flash_waitstate_and_readmode(param->cpu_f); #elif UC3C flashc_set_flash_waitstate_and_readmode(param->cpu_f); #endif //# //# Switch the main clock source to the selected clock. //# pm_set_mclk_source(main_clk_src); return PASS; } #endif // UC3L device-specific implementation //! UC3C Device-specific implementation #if UC3C static long int pcl_configure_clocks_uc3c(pcl_freq_param_t *param) { #define PM_MAX_MUL ((1 << AVR32_SCIF_PLLMUL_SIZE) - 1) #define AVR32_PM_PBA_MAX_FREQ 66000000 #define AVR32_PM_PLL_VCO_RANGE0_MAX_FREQ 240000000 #define AVR32_PM_PLL_VCO_RANGE0_MIN_FREQ 160000000 // Implementation for UC3C parts. // Supported frequencies: // Fosc0 mul div PLL div2_en cpu_f pba_f Comment // 12 15 1 192 1 12 12 // 12 9 3 40 1 20 20 PLL out of spec // 12 15 1 192 1 24 12 // 12 9 1 120 1 30 15 // 12 9 3 40 0 40 20 PLL out of spec // 12 15 1 192 1 48 12 // 12 15 1 192 1 48 24 // 12 8 1 108 1 54 27 // 12 9 1 120 1 60 15 // 12 9 1 120 1 60 30 // 12 10 1 132 1 66 16.5 // unsigned long in_cpu_f = param->cpu_f; unsigned long in_osc0_f = param->osc0_f; unsigned long mul, div, div2_en = 0, div2_cpu = 0, div2_pba = 0; unsigned long pll_freq, rest; Bool b_div2_pba, b_div2_cpu; // Configure OSC0 in crystal mode, external crystal with a FOSC0 Hz frequency. scif_configure_osc_crystalmode(SCIF_OSC0, in_osc0_f); // Enable the OSC0 scif_enable_osc(SCIF_OSC0, param->osc0_startup, true); // Set the main clock source as being OSC0. pm_set_mclk_source(PM_CLK_SRC_OSC0); // Start with CPU freq config if (in_cpu_f == in_osc0_f) { param->cpu_f = in_osc0_f; param->pba_f = in_osc0_f; return PASS; } else if (in_cpu_f < in_osc0_f) { // TBD } rest = in_cpu_f % in_osc0_f; for (div = 1; div < 32; div++) { if ((div * rest) % in_osc0_f == 0) break; } if (div == 32) return FAIL; mul = (in_cpu_f * div) / in_osc0_f; if (mul > PM_MAX_MUL) return FAIL; // export 2power from PLL div to div2_cpu while (!(div % 2)) { div /= 2; div2_cpu++; } // Here we know the mul and div parameter of the PLL config. // . Check out if the PLL has a valid in_cpu_f. // . Try to have for the PLL frequency (VCO output) the highest possible value // to reduce jitter. while (in_osc0_f * 2 * mul / div < AVR32_PM_PLL_VCO_RANGE0_MAX_FREQ) { if (2 * mul > PM_MAX_MUL) break; mul *= 2; div2_cpu++; } if (div2_cpu != 0) { div2_cpu--; div2_en = 1; } pll_freq = in_osc0_f * mul / (div * (1 << div2_en)); // Update real CPU Frequency param->cpu_f = pll_freq / (1 << div2_cpu); mul--; scif_pll_opt_t opt; opt.osc = SCIF_OSC0, // Sel Osc0 or Osc1 opt.lockcount = 16, // lockcount in main clock for the PLL wait lock opt.div = div, // DIV=1 in the formula opt.mul = mul, // MUL=7 in the formula opt.pll_div2 = div2_en, // pll_div2 Divide the PLL output frequency by 2 (this settings does not change the FVCO value) opt.pll_wbwdisable = 0, //pll_wbwdisable 1 Disable the Wide-Bandith Mode (Wide-Bandwith mode allow a faster startup time and out-of-lock time). 0 to enable the Wide-Bandith Mode. opt.pll_freq = (pll_freq < AVR32_PM_PLL_VCO_RANGE0_MIN_FREQ) ? 1 : 0, // Set to 1 for VCO frequency range 80-180MHz, set to 0 for VCO frequency range 160-240Mhz. scif_pll_setup(SCIF_PLL0, opt); // lockcount in main clock for the PLL wait lock /* Enable PLL0 */ scif_pll_enable(SCIF_PLL0); /* Wait for PLL0 locked */ scif_wait_for_pll_locked(SCIF_PLL0) ; rest = pll_freq; while (rest > AVR32_PM_PBA_MAX_FREQ || rest != param->pba_f) { div2_pba++; rest = pll_freq / (1 << div2_pba); if (rest < param->pba_f) break; } // Update real PBA Frequency param->pba_f = pll_freq / (1 << div2_pba); if (div2_cpu) { b_div2_cpu = TRUE; div2_cpu--; } else b_div2_cpu = FALSE; if (div2_pba) { b_div2_pba = TRUE; div2_pba--; } else b_div2_pba = FALSE; if (b_div2_cpu == TRUE ) { pm_set_clk_domain_div(PM_CLK_DOMAIN_0, (pm_divratio_t) div2_cpu); // CPU pm_set_clk_domain_div(PM_CLK_DOMAIN_1, (pm_divratio_t) div2_cpu); // HSB pm_set_clk_domain_div(PM_CLK_DOMAIN_3, (pm_divratio_t) div2_cpu); // PBB } if (b_div2_pba == TRUE ) { pm_set_clk_domain_div(PM_CLK_DOMAIN_2, (pm_divratio_t) div2_pba); // PBA pm_set_clk_domain_div(PM_CLK_DOMAIN_4, (pm_divratio_t) div2_pba); // PBC } // Set Flashc Wait State flashc_set_flash_waitstate_and_readmode(param->cpu_f); // Set the main clock source as being PLL0. pm_set_mclk_source(PM_CLK_SRC_PLL0); return PASS; } #endif // UC3C device-specific implementation long int pcl_switch_to_osc(pcl_osc_t osc, unsigned int fcrystal, unsigned int startup) { #ifndef AVR32_PM_VERSION_RESETVALUE // Implementation for UC3A, UC3A3, UC3B parts. if(PCL_OSC0 == osc) { // Configure OSC0 in crystal mode, external crystal with a FOSC0 Hz frequency, // enable the OSC0, set the main clock source as being OSC0. pm_switch_to_osc0(&AVR32_PM, fcrystal, startup); } else { return PCL_NOT_SUPPORTED; } #else // Implementation for UC3C, UC3L parts. #if AVR32_PM_VERSION_RESETVALUE < 0x400 return PCL_NOT_SUPPORTED; #else if(PCL_OSC0 == osc) { // Configure OSC0 in crystal mode, external crystal with a fcrystal Hz frequency. scif_configure_osc_crystalmode(SCIF_OSC0, fcrystal); // Enable the OSC0 scif_enable_osc(SCIF_OSC0, startup, true); // Set the Flash wait state and the speed read mode (depending on the target CPU frequency). #if UC3L flashcdw_set_flash_waitstate_and_readmode(fcrystal); #elif UC3C flashc_set_flash_waitstate_and_readmode(fcrystal); #endif // Set the main clock source as being OSC0. pm_set_mclk_source(PM_CLK_SRC_OSC0); } else { return PCL_NOT_SUPPORTED; } #endif #endif return PASS; } long int pcl_configure_usb_clock(void) { #ifndef AVR32_PM_VERSION_RESETVALUE // Implementation for UC3A, UC3A3, UC3B parts. pm_configure_usb_clock(); return PASS; #else #ifdef AVR32_PM_410_H_INCLUDED const scif_pll_opt_t opt = { .osc = SCIF_OSC0, // Sel Osc0 or Osc1 .lockcount = 16, // lockcount in main clock for the PLL wait lock .div = 1, // DIV=1 in the formula .mul = 5, // MUL=7 in the formula .pll_div2 = 1, // pll_div2 Divide the PLL output frequency by 2 (this settings does not change the FVCO value) .pll_wbwdisable = 0, //pll_wbwdisable 1 Disable the Wide-Bandith Mode (Wide-Bandwith mode allow a faster startup time and out-of-lock time). 0 to enable the Wide-Bandith Mode. .pll_freq = 1, // Set to 1 for VCO frequency range 80-180MHz, set to 0 for VCO frequency range 160-240Mhz. }; /* Setup PLL1 on Osc0, mul=7 ,no divisor, lockcount=16, ie. 16Mhzx6 = 96MHz output */ scif_pll_setup(SCIF_PLL1, opt); // lockcount in main clock for the PLL wait lock /* Enable PLL1 */ scif_pll_enable(SCIF_PLL1); /* Wait for PLL1 locked */ scif_wait_for_pll_locked(SCIF_PLL1) ; // Implementation for UC3C parts. // Setup the generic clock for USB scif_gc_setup(AVR32_SCIF_GCLK_USB, SCIF_GCCTRL_PLL1, AVR32_SCIF_GC_NO_DIV_CLOCK, 0); // Now enable the generic clock scif_gc_enable(AVR32_SCIF_GCLK_USB); return PASS; #else return PCL_NOT_SUPPORTED; #endif #endif } #if UC3L #else void pcl_write_gplp(unsigned long gplp, unsigned long value) { #ifndef AVR32_PM_VERSION_RESETVALUE // Implementation for UC3A, UC3A3, UC3B parts. pm_write_gplp(&AVR32_PM,gplp,value); #else scif_write_gplp(gplp,value); #endif } unsigned long pcl_read_gplp(unsigned long gplp) { #ifndef AVR32_PM_VERSION_RESETVALUE // Implementation for UC3A, UC3A3, UC3B parts. return pm_read_gplp(&AVR32_PM,gplp); #else return scif_read_gplp(gplp); #endif } #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/power_clocks_lib.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file has been prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief High-level library abstracting features such as oscillators/pll/dfll * configuration, clock configuration, System-sensible parameters * configuration, buses clocks configuration, sleep mode, reset. * * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * *****************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _POWER_CLOCKS_LIB_H_ #define _POWER_CLOCKS_LIB_H_ #ifdef __cplusplus extern "C" { #endif #include #include "compiler.h" #ifndef AVR32_PM_VERSION_RESETVALUE // Support for UC3A, UC3A3, UC3B parts. #include "pm.h" #else //! Device-specific data #if UC3L #include "pm_uc3l.h" #include "scif_uc3l.h" #include "flashcdw.h" #elif UC3C #include "pm_uc3c.h" #include "scif_uc3c.h" #include "flashc.h" #endif #endif /*! \name Clocks Management */ //! @{ //! The different oscillators typedef enum { PCL_OSC0 = 0, PCL_OSC1 = 1 } pcl_osc_t; //! The different DFLLs typedef enum { PCL_DFLL0 = 0, PCL_DFLL1 = 1 } pcl_dfll_t; //! Possible Main Clock Sources typedef enum { PCL_MC_RCSYS, // Default main clock source, supported by all (aka Slow Clock) PCL_MC_OSC0, // Supported by all PCL_MC_OSC1, // Supported by UC3C only PCL_MC_OSC0_PLL0, // Supported by UC3A, UC3B, UC3A3, UC3C (the main clock source is PLL0 with OSC0 as reference) PCL_MC_OSC1_PLL0, // Supported by UC3A, UC3B, UC3A3, UC3C (the main clock source is PLL0 with OSC1 as reference) PCL_MC_OSC0_PLL1, // Supported by UC3C (the main clock source is PLL1 with OSC0 as reference) PCL_MC_OSC1_PLL1, // Supported by UC3C (the main clock source is PLL1 with OSC1 as reference) PCL_MC_DFLL0, // Supported by UC3L PCL_MC_DFLL1, // Not supported yet PCL_MC_RC120M, // Supported by UC3L, UC3C PCL_MC_RC8M, // Supported by UC3C PCL_MC_CRIPOSC // Supported by UC3C } pcl_mainclk_t; //! Input and output parameters to configure clocks with pcl_configure_clocks(). // NOTE: regarding the frequency settings, always abide by the datasheet rules and min & max supported frequencies. #ifndef AVR32_PM_VERSION_RESETVALUE // Support for UC3A, UC3A3, UC3B parts. #define pcl_freq_param_t pm_freq_param_t // See pm.h #else // Support for UC3C, UC3L parts. typedef struct { //! Main clock source selection (input argument). pcl_mainclk_t main_clk_src; //! Target CPU frequency (input/output argument). unsigned long cpu_f; //! Target PBA frequency (input/output argument). unsigned long pba_f; //! Target PBB frequency (input/output argument). unsigned long pbb_f; //! Target PBC frequency (input/output argument). unsigned long pbc_f; //! Oscillator 0's external crystal(or external clock) frequency (board dependant) (input argument). unsigned long osc0_f; //! Oscillator 0's external crystal(or external clock) startup time: AVR32_PM_OSCCTRL0_STARTUP_x_RCOSC (input argument). unsigned long osc0_startup; //! DFLL target frequency (input/output argument) (NOTE: the bigger, the most stable the frequency) unsigned long dfll_f; //! Other parameters that might be necessary depending on the device (implementation-dependent). // For the UC3L DFLL setup, this parameter should be pointing to a structure of // type (scif_gclk_opt_t *). void *pextra_params; } pcl_freq_param_t; #endif //! Define "not supported" for the lib. #define PCL_NOT_SUPPORTED (-10000) /*! \brief Automatically configure the CPU, PBA, PBB, and HSB clocks * * This function needs some parameters stored in a pcl_freq_param_t structure: * - main_clk_src is the id of the main clock source to use, * - cpu_f and pba_f and pbb_f are the wanted frequencies, * - osc0_f is the oscillator 0's external crystal (or external clock) on-board frequency (e.g. FOSC0), * - osc0_startup is the oscillator 0's external crystal (or external clock) startup time (e.g. OSC0_STARTUP). * - dfll_f is the target DFLL frequency to set-up if main_clk_src is the dfll. * * The CPU, HSB and PBA frequencies programmed after configuration are stored back into cpu_f and pba_f. * * \note: since it is dynamically computing the appropriate field values of the * configuration registers from the parameters structure, this function is not * optimal in terms of code size. For a code size optimal solution, it is better * to create a new function from pcl_configure_clocks() and modify it to use * preprocessor computation from pre-defined target frequencies. * * \param param pointer on the configuration structure. * * \retval 0 Success. * \retval <0 The configuration cannot be performed. */ extern long int pcl_configure_clocks(pcl_freq_param_t *param); /*! \brief Automatically configure the CPU, PBA, PBB, and HSB clocks using the RCSYS osc as main source clock. * * This function needs some parameters stored in a pcl_freq_param_t structure: * - cpu_f and pba_f and pbb_f are the wanted frequencies * * Supported main clock sources: PCL_MC_RCSYS * * Supported synchronous clocks frequencies: * 115200Hz, 57600Hz, 28800Hz, 14400Hz, 7200Hz, 3600Hz, 1800Hz, 900Hz, 450Hz. * * \note: by default, this implementation doesn't perform thorough checks on the * input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. * * \note: since it is dynamically computing the appropriate field values of the * configuration registers from the parameters structure, this function is not * optimal in terms of code size. For a code size optimal solution, it is better * to create a new function from pcl_configure_clocks_rcsys() and modify it to use * preprocessor computation from pre-defined target frequencies. * * \param param pointer on the configuration structure. * * \retval 0 Success. * \retval <0 The configuration cannot be performed. */ extern long int pcl_configure_clocks_rcsys(pcl_freq_param_t *param); /*! \brief Automatically configure the CPU, PBA, PBB, and HSB clocks using the RC120M osc as main source clock. * * This function needs some parameters stored in a pcl_freq_param_t structure: * - cpu_f and pba_f and pbb_f are the wanted frequencies * * Supported main clock sources: PCL_MC_RC120M * * Supported synchronous clocks frequencies: * 30MHz, 15MHz, 7.5MHz, 3.75MHz, 1.875MHz, 937.5kHz, 468.75kHz. * * \note: by default, this implementation doesn't perform thorough checks on the * input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. * * \note: since it is dynamically computing the appropriate field values of the * configuration registers from the parameters structure, this function is not * optimal in terms of code size. For a code size optimal solution, it is better * to create a new function from pcl_configure_clocks_rc120m() and modify it to * use preprocessor computation from pre-defined target frequencies. * * \param param pointer on the configuration structure. * * \retval 0 Success. * \retval <0 The configuration cannot be performed. */ extern long int pcl_configure_clocks_rc120m(pcl_freq_param_t *param); /*! \brief Automatically configure the CPU, PBA, PBB, and HSB clocks using the OSC0 osc as main source clock * * This function needs some parameters stored in a pcl_freq_param_t structure: * - cpu_f and pba_f and pbb_f are the wanted frequencies, * - osc0_f is the oscillator 0's external crystal (or external clock) on-board frequency (e.g. FOSC0), * - osc0_startup is the oscillator 0's external crystal (or external clock) startup time (e.g. OSC0_STARTUP). * * Supported main clock sources: PCL_MC_OSC0 * * Supported synchronous clocks frequencies: * (these obviously depend on the OSC0 frequency; we'll take 16MHz as an example) * 16MHz, 8MHz, 4MHz, 2MHz, 1MHz, 500kHz, 250kHz, 125kHz, 62.5kHz. * * \note: by default, this implementation doesn't perform thorough checks on the * input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. * * \note: since it is dynamically computing the appropriate field values of the * configuration registers from the parameters structure, this function is not * optimal in terms of code size. For a code size optimal solution, it is better * to create a new function from pcl_configure_clocks_osc0() and modify it to use * preprocessor computation from pre-defined target frequencies. * * \param param pointer on the configuration structure. * * \retval 0 Success. * \retval <0 The configuration cannot be performed. */ extern long int pcl_configure_clocks_osc0(pcl_freq_param_t *param); /*! \brief Automatically configure the CPU, PBA, PBB, and HSB clocks using the DFLL0 as main source clock * * This function needs some parameters stored in a pcl_freq_param_t structure: * - cpu_f and pba_f and pbb_f are the wanted frequencies, * - dfll_f is the target DFLL frequency to set-up * * \note: when the DFLL0 is to be used as main source clock for the synchronous clocks, * the target frequency of the DFLL should be chosen to be as high as possible * within the specification range (for stability reasons); the target cpu and pbx * frequencies will then be reached by appropriate division ratio. * * Supported main clock sources: PCL_MC_DFLL0 * * Supported synchronous clocks frequencies: * (these obviously depend on the DFLL target frequency; we'll take 100MHz as an example) * 50MHz, 25MHz, 12.5MHz, 6.25MHz, 3.125MHz, 1562.5kHz, 781.25kHz, 390.625kHz. * * \note: by default, this implementation doesn't perform thorough checks on the * input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. * * \note: since it is dynamically computing the appropriate field values of the * configuration registers from the parameters structure, this function is not * optimal in terms of code size. For a code size optimal solution, it is better * to create a new function from pcl_configure_clocks_dfll0() and modify it to * use preprocessor computation from pre-defined target frequencies. * * \param param pointer on the configuration structure. * * \retval 0 Success. * \retval <0 The configuration cannot be performed. */ extern long int pcl_configure_clocks_dfll0(pcl_freq_param_t *param); /*! \brief Switch the main clock source to Osc0 configured in crystal mode * * \param osc The oscillator to enable and switch to. * \param fcrystal Oscillator external crystal frequency (Hz) * \param startup Oscillator startup time. * * \return Status. * \retval 0 Success. * \retval <0 An error occured. */ extern long int pcl_switch_to_osc(pcl_osc_t osc, unsigned int fcrystal, unsigned int startup); /*! \brief Enable the clock of a module. * * \param module The module to clock (use one of the defines in the part-specific * header file under "toolchain folder"/avr32/inc(lude)/avr32/; depending on the * clock domain, look for the sections "CPU clocks", "HSB clocks", "PBx clocks" * or look in the module section). * * \return Status. * \retval 0 Success. * \retval <0 An error occured. */ #ifndef AVR32_PM_VERSION_RESETVALUE // Implementation for UC3A, UC3A3, UC3B parts. #define pcl_enable_module(module) pm_enable_module(&AVR32_PM, module) #else // Implementation for UC3C, UC3L parts. #define pcl_enable_module(module) pm_enable_module(module) #endif /*! \brief Disable the clock of a module. * * \param module The module to shut down (use one of the defines in the part-specific * header file under "toolchain folder"/avr32/inc(lude)/avr32/; depending on the * clock domain, look for the sections "CPU clocks", "HSB clocks", "PBx clocks" * or look in the module section). * * \return Status. * \retval 0 Success. * \retval <0 An error occured. */ #ifndef AVR32_PM_VERSION_RESETVALUE // Implementation for UC3A, UC3A3, UC3B parts. #define pcl_disable_module(module) pm_disable_module(&AVR32_PM, module) #else // Implementation for UC3C, UC3L parts. #define pcl_disable_module(module) pm_disable_module(module) #endif /*! \brief Configure the USB Clock * * * \return Status. * \retval 0 Success. * \retval <0 An error occured. */ extern long int pcl_configure_usb_clock(void); //! @} /*! \name Power Management */ //! @{ /*! * \brief Read the content of the GPLP registers * \param gplp GPLP register index (0,1,... depending on the number of GPLP registers for a given part) * * \return The content of the chosen GPLP register. */ extern unsigned long pcl_read_gplp(unsigned long gplp); /*! * \brief Write into the GPLP registers * \param gplp GPLP register index (0,1,... depending on the number of GPLP registers for a given part) * \param value Value to write */ extern void pcl_write_gplp(unsigned long gplp, unsigned long value); //! @} #ifdef __cplusplus } #endif #endif // _POWER_CLOCKS_LIB_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/RTC/rtc.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief RTC driver for AVR32 UC3. * * AVR32 Real Time Counter driver module. * * - Compiler: GNU GCC for AVR32 * - Supported devices: All AVR32 devices with an RTC and a PM module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include #include "compiler.h" #include "pm.h" #include "rtc.h" int rtc_is_busy(volatile avr32_rtc_t *rtc) { return (rtc->ctrl & AVR32_RTC_CTRL_BUSY_MASK) != 0; } int rtc_init(volatile avr32_rtc_t *rtc, unsigned char osc_type, unsigned char psel) { // If exit, it means that the configuration has not been set correctly if (osc_type > (1 << AVR32_RTC_CTRL_CLK32_SIZE) - 1 || psel > (1 << AVR32_RTC_CTRL_PSEL_SIZE) - 1) return 0; // If we use the 32-kHz oscillator, we have to enable it first if (osc_type == RTC_OSC_32KHZ) { // Select the 32-kHz oscillator crystal pm_enable_osc32_crystal(&AVR32_PM); // Enable the 32-kHz clock pm_enable_clk32_no_wait(&AVR32_PM, AVR32_PM_OSCCTRL32_STARTUP_0_RCOSC); } // Wait until the rtc CTRL register is up-to-date while (rtc_is_busy(rtc)); // Set the new RTC configuration rtc->ctrl = osc_type << AVR32_RTC_CTRL_CLK32_OFFSET | psel << AVR32_RTC_CTRL_PSEL_OFFSET | AVR32_RTC_CTRL_CLKEN_MASK; // Wait until write is done while (rtc_is_busy(rtc)); // Set the counter value to 0 rtc_set_value(rtc, 0x00000000); // Set the top value to 0xFFFFFFFF rtc_set_top_value(rtc, 0xFFFFFFFF); return 1; } void rtc_set_value(volatile avr32_rtc_t *rtc, unsigned long val) { // Wait until we can write into the VAL register while (rtc_is_busy(rtc)); // Set the new val value rtc->val = val; // Wait until write is done while (rtc_is_busy(rtc)); } unsigned long rtc_get_value(volatile avr32_rtc_t *rtc) { return rtc->val; } void rtc_enable_wake_up(volatile avr32_rtc_t *rtc) { // Wait until the rtc CTRL register is up-to-date while (rtc_is_busy(rtc)); // Enable the wake up of the RTC rtc->ctrl |= AVR32_RTC_CTRL_WAKE_EN_MASK; // Wait until write is done while (rtc_is_busy(rtc)); } void rtc_disable_wake_up(volatile avr32_rtc_t *rtc) { // Wait until the rtc CTRL register is up-to-date while (rtc_is_busy(rtc)); // Disable the wake up of the RTC rtc->ctrl &= ~AVR32_RTC_CTRL_WAKE_EN_MASK; // Wait until write is done while (rtc_is_busy(rtc)); } void rtc_enable(volatile avr32_rtc_t *rtc) { // Wait until the rtc CTRL register is up-to-date while (rtc_is_busy(rtc)); // Enable the RTC rtc->ctrl |= AVR32_RTC_CTRL_EN_MASK; // Wait until write is done while (rtc_is_busy(rtc)); } void rtc_disable(volatile avr32_rtc_t *rtc) { // Wait until the rtc CTRL register is up-to-date while (rtc_is_busy(rtc)); // Disable the RTC rtc->ctrl &= ~AVR32_RTC_CTRL_EN_MASK; // Wait until write is done while (rtc_is_busy(rtc)); } void rtc_enable_interrupt(volatile avr32_rtc_t *rtc) { rtc->ier = AVR32_RTC_IER_TOPI_MASK; } void rtc_disable_interrupt(volatile avr32_rtc_t *rtc) { Bool global_interrupt_enabled = Is_global_interrupt_enabled(); if (global_interrupt_enabled) Disable_global_interrupt(); rtc->idr = AVR32_RTC_IDR_TOPI_MASK; rtc->imr; if (global_interrupt_enabled) Enable_global_interrupt(); } void rtc_clear_interrupt(volatile avr32_rtc_t *rtc) { Bool global_interrupt_enabled = Is_global_interrupt_enabled(); if (global_interrupt_enabled) Disable_global_interrupt(); rtc->icr = AVR32_RTC_ICR_TOPI_MASK; rtc->isr; if (global_interrupt_enabled) Enable_global_interrupt(); } void rtc_set_top_value(volatile avr32_rtc_t *rtc, unsigned long top) { // Wait until we can write into the VAL register while (rtc_is_busy(rtc)); // Set the new val value rtc->top = top; // Wait until write is done while (rtc_is_busy(rtc)); } unsigned long rtc_get_top_value(volatile avr32_rtc_t *rtc) { return rtc->top; } int rtc_interrupt_enabled(volatile avr32_rtc_t *rtc) { return (rtc->imr & AVR32_RTC_IMR_TOPI_MASK) != 0; } int rtc_is_interrupt(volatile avr32_rtc_t *rtc) { return (rtc->isr & AVR32_RTC_ISR_TOPI_MASK) != 0; } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/RTC/rtc.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief RTC driver for AVR32 UC3. * * AVR32 Real Time Counter driver module. * * - Compiler: GNU GCC for AVR32 * - Supported devices: All AVR32 devices with an RTC and a PM module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _RTC_H_ #define _RTC_H_ #include "compiler.h" #include /*! \name Oscillator Types */ //! @{ #define RTC_OSC_32KHZ 1 #define RTC_OSC_RC 0 //! @} /*! \name Predefined PSEL Values */ //! @{ //! The PSEL value to set the RTC source clock (after the prescaler) to 1 Hz, //! when using an external 32-kHz crystal. #define RTC_PSEL_32KHZ_1HZ 14 //! The PSEL value to set the RTC source clock (after the prescaler) to 1.76 Hz, //! when using the internal RC oscillator (~ 115 kHz). #define RTC_PSEL_RC_1_76HZ 15 //! @} /*! * \brief This function will initialise the RTC module. * If you use the 32 KHz oscillator, it will enable this module. * This function also set the top value of the RTC to 0xFFFFFFFF * and the value to 0. * \param rtc Base address of the RTC (i.e. &AVR32_RTC). * \param osc_type The oscillator you want to use. If you need a better * accuracy, use the 32 KHz oscillator (i.e. RTC_OSC_32KHZ). * \param psel The preselector value for the corresponding oscillator (4-bits). * To obtain this value, you can use this formula: * psel = log(Fosc/Frtc)/log(2)-1, where Fosc is the frequency of the * oscillator you are using (32 KHz or 115 KHz) and Frtc the frequency * desired. * \return 1 if the initialisation succeds otherwize it will return 0. */ extern int rtc_init(volatile avr32_rtc_t *rtc, unsigned char osc_type, unsigned char psel); /*! * \brief Enable the RTC. * \param rtc Base address of the RTC (i.e. &AVR32_RTC). */ extern void rtc_enable(volatile avr32_rtc_t *rtc); /*! * \brief Disable the RTC. * \param rtc Base address of the RTC (i.e. &AVR32_RTC). */ extern void rtc_disable(volatile avr32_rtc_t *rtc); /*! * \brief Enable the wake up feature of the RTC. * \param rtc Base address of the RTC (i.e. &AVR32_RTC). */ extern void rtc_enable_wake_up(volatile avr32_rtc_t *rtc); /*! * \brief Disable the wake up feature of the RTC. * \param rtc Base address of the RTC (i.e. &AVR32_RTC). */ extern void rtc_disable_wake_up(volatile avr32_rtc_t *rtc); /*! * \brief Enable the interrupt feature of the RTC. * An interrupt is raised when the value of the RTC * is equal to its top value. * \param rtc Base address of the RTC (i.e. &AVR32_RTC). */ extern void rtc_enable_interrupt(volatile avr32_rtc_t *rtc); /*! * \brief Disable the interrupt feature of the RTC. * \param rtc Base address of the RTC (i.e. &AVR32_RTC). */ extern void rtc_disable_interrupt(volatile avr32_rtc_t *rtc); /*! * \brief Clear the interrupt flag. * Call this function once you handled the interrupt. * \param rtc Base address of the RTC (i.e. &AVR32_RTC). */ extern void rtc_clear_interrupt(volatile avr32_rtc_t *rtc); /*! * \brief Get the status of interrupts. * \param rtc Base address of the RTC (i.e. &AVR32_RTC). * \return 1 if the interrupts are enabled otherwize it returns 0. */ extern int rtc_interrupt_enabled(volatile avr32_rtc_t *rtc); /*! * \brief Check if an interrupt is raised. * \param rtc Base address of the RTC (i.e. &AVR32_RTC). * \return 1 if an interrupt is currently raised otherwize it returns 0. */ extern int rtc_is_interrupt(volatile avr32_rtc_t *rtc); /*! * \brief This function sets the RTC current top value. * \param rtc Base address of the RTC (i.e. &AVR32_RTC). * \param top The top value you want to store. */ extern void rtc_set_top_value(volatile avr32_rtc_t *rtc, unsigned long top); /*! * \brief This function returns the RTC current top value. * \param rtc Base address of the RTC (i.e. &AVR32_RTC). * \return The RTC current top value. */ extern unsigned long rtc_get_top_value(volatile avr32_rtc_t *rtc); /*! * \brief This function checks if the RTC is busy or not. * \param rtc Base address of the RTC (i.e. &AVR32_RTC). * \return 1 if the RTC is busy otherwize it will return 0. */ extern int rtc_is_busy(volatile avr32_rtc_t *rtc); /*! * \brief This function sets the RTC current value. * \param rtc Base address of the RTC (i.e. &AVR32_RTC). * \param val The value you want to store. */ extern void rtc_set_value(volatile avr32_rtc_t *rtc, unsigned long val); /*! * \brief This function returns the RTC current value. * \param rtc Base address of the RTC (i.e. &AVR32_RTC). * \return The RTC current value. */ extern unsigned long rtc_get_value(volatile avr32_rtc_t *rtc); #endif // _RTC_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief SPI driver for AVR32 UC3. * * This file defines a useful set of functions for the SPI interface on AVR32 * devices. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with an SPI module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "spi.h" #ifdef FREERTOS_USED #include "FreeRTOS.h" #include "semphr.h" #endif /*! \name SPI Writable Bit-Field Registers */ //! @{ typedef union { unsigned long cr; avr32_spi_cr_t CR; } u_avr32_spi_cr_t; typedef union { unsigned long mr; avr32_spi_mr_t MR; } u_avr32_spi_mr_t; typedef union { unsigned long tdr; avr32_spi_tdr_t TDR; } u_avr32_spi_tdr_t; typedef union { unsigned long ier; avr32_spi_ier_t IER; } u_avr32_spi_ier_t; typedef union { unsigned long idr; avr32_spi_idr_t IDR; } u_avr32_spi_idr_t; typedef union { unsigned long csr; avr32_spi_csr0_t CSR; } u_avr32_spi_csr_t; //! @} #ifdef FREERTOS_USED //! The SPI mutex. static xSemaphoreHandle xSPIMutex; #endif /*! \brief Calculates the baudrate divider. * * \param options Pointer to a structure containing initialization options for * an SPI channel. * \param pba_hz SPI module input clock frequency (PBA clock, Hz). * * \return Divider or error code. * \retval >=0 Success. * \retval <0 Error. */ static int getBaudDiv(const spi_options_t *options, unsigned int pba_hz) { int baudDiv = (pba_hz + options->baudrate / 2) / options->baudrate; if (baudDiv <= 0 || baudDiv > 255) { return -1; } return baudDiv; } void spi_reset(volatile avr32_spi_t *spi) { spi->cr = AVR32_SPI_CR_SWRST_MASK; } spi_status_t spi_initSlave(volatile avr32_spi_t *spi, unsigned char bits, unsigned char spi_mode) { if (spi_mode > 3 || bits < 8 || bits > 16) { return SPI_ERROR_ARGUMENT; } // Reset. spi->cr = AVR32_SPI_CR_SWRST_MASK; // Will use CSR0 offsets; these are the same for CSR0 to CSR3. spi->csr0 = ((spi_mode >> 1) << AVR32_SPI_CSR0_CPOL_OFFSET) | (((spi_mode & 0x1) ^ 0x1) << AVR32_SPI_CSR0_NCPHA_OFFSET) | ((bits - 8) << AVR32_SPI_CSR0_BITS_OFFSET); return SPI_OK; } spi_status_t spi_initTest(volatile avr32_spi_t *spi) { // Reset. spi->cr = AVR32_SPI_CR_SWRST_MASK; spi->mr |= AVR32_SPI_MR_MSTR_MASK | // Master Mode. AVR32_SPI_MR_LLB_MASK; // Local Loopback. return SPI_OK; } spi_status_t spi_initMaster(volatile avr32_spi_t *spi, const spi_options_t *options) { u_avr32_spi_mr_t u_avr32_spi_mr; if (options->modfdis > 1) { return SPI_ERROR_ARGUMENT; } // Reset. spi->cr = AVR32_SPI_CR_SWRST_MASK; // Master Mode. u_avr32_spi_mr.mr = spi->mr; u_avr32_spi_mr.MR.mstr = 1; u_avr32_spi_mr.MR.modfdis = options->modfdis; u_avr32_spi_mr.MR.llb = 0; u_avr32_spi_mr.MR.pcs = (1 << AVR32_SPI_MR_PCS_SIZE) - 1; spi->mr = u_avr32_spi_mr.mr; return SPI_OK; } spi_status_t spi_selectionMode(volatile avr32_spi_t *spi, unsigned char variable_ps, unsigned char pcs_decode, unsigned char delay) { u_avr32_spi_mr_t u_avr32_spi_mr; if (variable_ps > 1 || pcs_decode > 1) { return SPI_ERROR_ARGUMENT; } u_avr32_spi_mr.mr = spi->mr; u_avr32_spi_mr.MR.ps = variable_ps; u_avr32_spi_mr.MR.pcsdec = pcs_decode; u_avr32_spi_mr.MR.dlybcs = delay; spi->mr = u_avr32_spi_mr.mr; return SPI_OK; } spi_status_t spi_selectChip(volatile avr32_spi_t *spi, unsigned char chip) { #ifdef FREERTOS_USED while (pdFALSE == xSemaphoreTake(xSPIMutex, 20)); #endif // Assert all lines; no peripheral is selected. spi->mr |= AVR32_SPI_MR_PCS_MASK; if (spi->mr & AVR32_SPI_MR_PCSDEC_MASK) { // The signal is decoded; allow up to 15 chips. if (chip > 14) { return SPI_ERROR_ARGUMENT; } spi->mr &= ~AVR32_SPI_MR_PCS_MASK | (chip << AVR32_SPI_MR_PCS_OFFSET); } else { if (chip > 3) { return SPI_ERROR_ARGUMENT; } spi->mr &= ~(1 << (AVR32_SPI_MR_PCS_OFFSET + chip)); } return SPI_OK; } spi_status_t spi_unselectChip(volatile avr32_spi_t *spi, unsigned char chip) { unsigned int timeout = SPI_TIMEOUT; while (!(spi->sr & AVR32_SPI_SR_TXEMPTY_MASK)) { if (!timeout--) { return SPI_ERROR_TIMEOUT; } } // Assert all lines; no peripheral is selected. spi->mr |= AVR32_SPI_MR_PCS_MASK; // Last transfer, so deassert the current NPCS if CSAAT is set. spi->cr = AVR32_SPI_CR_LASTXFER_MASK; #ifdef FREERTOS_USED xSemaphoreGive(xSPIMutex); #endif return SPI_OK; } spi_status_t spi_setupChipReg(volatile avr32_spi_t *spi, const spi_options_t *options, unsigned int pba_hz) { u_avr32_spi_csr_t u_avr32_spi_csr; if (options->spi_mode > 3 || options->stay_act > 1 || options->bits < 8 || options->bits > 16) { return SPI_ERROR_ARGUMENT; } int baudDiv = getBaudDiv(options, pba_hz); if (baudDiv < 0) { return SPI_ERROR_ARGUMENT; } // Will use CSR0 offsets; these are the same for CSR0 to CSR3. u_avr32_spi_csr.csr = 0; u_avr32_spi_csr.CSR.cpol = options->spi_mode >> 1; u_avr32_spi_csr.CSR.ncpha = (options->spi_mode & 0x1) ^ 0x1; u_avr32_spi_csr.CSR.csaat = options->stay_act; u_avr32_spi_csr.CSR.bits = options->bits - 8; u_avr32_spi_csr.CSR.scbr = baudDiv; u_avr32_spi_csr.CSR.dlybs = options->spck_delay; u_avr32_spi_csr.CSR.dlybct = options->trans_delay; switch(options->reg) { case 0: spi->csr0 = u_avr32_spi_csr.csr; break; case 1: spi->csr1 = u_avr32_spi_csr.csr; break; case 2: spi->csr2 = u_avr32_spi_csr.csr; break; case 3: spi->csr3 = u_avr32_spi_csr.csr; break; default: return SPI_ERROR_ARGUMENT; } #ifdef FREERTOS_USED if (!xSPIMutex) { // Create the SPI mutex. vSemaphoreCreateBinary(xSPIMutex); if (!xSPIMutex) { while(1); } } #endif return SPI_OK; } void spi_enable(volatile avr32_spi_t *spi) { spi->cr = AVR32_SPI_CR_SPIEN_MASK; } void spi_disable(volatile avr32_spi_t *spi) { spi->cr = AVR32_SPI_CR_SPIDIS_MASK; } int spi_is_enabled(volatile avr32_spi_t *spi) { return (spi->sr & AVR32_SPI_SR_SPIENS_MASK) != 0; } inline unsigned char spi_writeRegisterEmptyCheck(volatile avr32_spi_t *spi) { return ((spi->sr & AVR32_SPI_SR_TDRE_MASK) != 0); } inline spi_status_t spi_write(volatile avr32_spi_t *spi, unsigned short data) { unsigned int timeout = SPI_TIMEOUT; while (!(spi->sr & AVR32_SPI_SR_TDRE_MASK)) { if (!timeout--) { return SPI_ERROR_TIMEOUT; } } spi->tdr = data << AVR32_SPI_TDR_TD_OFFSET; return SPI_OK; } spi_status_t spi_variableSlaveWrite(volatile avr32_spi_t *spi, unsigned short data, unsigned char pcs, unsigned char lastxfer) { unsigned int timeout = SPI_TIMEOUT; if (pcs > 14 || lastxfer > 1) { return SPI_ERROR_ARGUMENT; } while (!(spi->sr & AVR32_SPI_SR_TDRE_MASK)) { if (!timeout--) { return SPI_ERROR_TIMEOUT; } } spi->tdr = (data << AVR32_SPI_TDR_TD_OFFSET) | (pcs << AVR32_SPI_TDR_PCS_OFFSET) | (lastxfer << AVR32_SPI_TDR_LASTXFER_OFFSET); return SPI_OK; } inline unsigned char spi_writeEndCheck(volatile avr32_spi_t *spi) { return ((spi->sr & AVR32_SPI_SR_TXEMPTY_MASK) != 0); } unsigned char spi_readRegisterFullCheck(volatile avr32_spi_t *spi) { return ((spi->sr & AVR32_SPI_SR_RDRF_MASK) != 0); } inline spi_status_t spi_read(volatile avr32_spi_t *spi, unsigned short *data) { unsigned int timeout = SPI_TIMEOUT; while ((spi->sr & (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) != (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) { if (!timeout--) { return SPI_ERROR_TIMEOUT; } } *data = spi->rdr >> AVR32_SPI_RDR_RD_OFFSET; return SPI_OK; } unsigned char spi_getStatus(volatile avr32_spi_t *spi) { spi_status_t ret = SPI_OK; unsigned long sr = spi->sr; if (sr & AVR32_SPI_SR_OVRES_MASK) { ret = SPI_ERROR_OVERRUN; } if (sr & AVR32_SPI_SR_MODF_MASK) { ret += SPI_ERROR_MODE_FAULT; } if (ret == (SPI_ERROR_OVERRUN + SPI_ERROR_MODE_FAULT)) { return SPI_ERROR_OVERRUN_AND_MODE_FAULT; } else if (ret > 0) { return ret; } else { return SPI_OK; } } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief SPI driver for AVR32 UC3. * * This file defines a useful set of functions for the SPI interface on AVR32 * devices. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with an SPI module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _SPI_H_ #define _SPI_H_ #include //! Time-out value (number of attempts). #define SPI_TIMEOUT 10000 //! Status codes used by the SPI driver. typedef enum { SPI_ERROR = -1, SPI_OK = 0, SPI_ERROR_TIMEOUT = 1, SPI_ERROR_ARGUMENT, SPI_ERROR_OVERRUN, SPI_ERROR_MODE_FAULT, SPI_ERROR_OVERRUN_AND_MODE_FAULT } spi_status_t; //! Option structure for SPI channels. typedef struct { //! The SPI channel to set up. unsigned char reg; //! Preferred baudrate for the SPI. unsigned int baudrate; //! Number of bits in each character (8 to 16). unsigned char bits; //! Delay before first clock pulse after selecting slave (in PBA clock periods). unsigned char spck_delay; //! Delay between each transfer/character (in PBA clock periods). unsigned char trans_delay; //! Sets this chip to stay active after last transfer to it. unsigned char stay_act; //! Which SPI mode to use when transmitting. unsigned char spi_mode; //! Disables the mode fault detection. //! With this bit cleared, the SPI master mode will disable itself if another //! master tries to address it. unsigned char modfdis; } spi_options_t; /*! \brief Resets the SPI controller. * * \param spi Base address of the SPI instance. */ extern void spi_reset(volatile avr32_spi_t *spi); /*! \brief Initializes the SPI in slave mode. * * \param spi Base address of the SPI instance. * \param bits Number of bits in each transmitted character (8 to 16). * \param spi_mode Clock polarity and phase. * * \return Status. * \retval SPI_OK Success. * \retval SPI_ERROR_ARGUMENT Invalid argument(s) passed. */ extern spi_status_t spi_initSlave(volatile avr32_spi_t *spi, unsigned char bits, unsigned char spi_mode); /*! \brief Sets up the SPI in a test mode where the transmitter is connected to * the receiver (local loopback). * * \param spi Base address of the SPI instance. * * \return Status. * \retval SPI_OK Success. */ extern spi_status_t spi_initTest(volatile avr32_spi_t *spi); /*! \brief Initializes the SPI in master mode. * * \param spi Base address of the SPI instance. * \param options Pointer to a structure containing initialization options. * * \return Status. * \retval SPI_OK Success. * \retval SPI_ERROR_ARGUMENT Invalid argument(s) passed. */ extern spi_status_t spi_initMaster(volatile avr32_spi_t *spi, const spi_options_t *options); /*! \brief Sets up how and when the slave chips are selected (master mode only). * * \param spi Base address of the SPI instance. * \param variable_ps Target slave is selected in transfer register for every * character to transmit. * \param pcs_decode The four chip select lines are decoded externally. Values * 0 to 14 can be given to \ref spi_selectChip. * \param delay Delay in PBA periods between chip selects. * * \return Status. * \retval SPI_OK Success. * \retval SPI_ERROR_ARGUMENT Invalid argument(s) passed. */ extern spi_status_t spi_selectionMode(volatile avr32_spi_t *spi, unsigned char variable_ps, unsigned char pcs_decode, unsigned char delay); /*! \brief Selects slave chip. * * \param spi Base address of the SPI instance. * \param chip Slave chip number (normal: 0 to 3, extarnally decoded signal: 0 * to 14). * * \return Status. * \retval SPI_OK Success. * \retval SPI_ERROR_ARGUMENT Invalid argument(s) passed. */ extern spi_status_t spi_selectChip(volatile avr32_spi_t *spi, unsigned char chip); /*! \brief Unselects slave chip. * * \param spi Base address of the SPI instance. * \param chip Slave chip number (normal: 0 to 3, extarnally decoded signal: 0 * to 14). * * \return Status. * \retval SPI_OK Success. * \retval SPI_ERROR_TIMEOUT Time-out. * * \note Will block program execution until time-out occurs if last transmission * is not complete. Invoke \ref spi_writeEndCheck beforehand if needed. */ extern spi_status_t spi_unselectChip(volatile avr32_spi_t *spi, unsigned char chip); /*! \brief Sets options for a specific slave chip. * * The baudrate field has to be written before transfer in master mode. Four * similar registers exist, one for each slave. When using encoded slave * addressing, reg=0 sets options for slaves 0 to 3, reg=1 for slaves 4 to 7 and * so on. * * \param spi Base address of the SPI instance. * \param options Pointer to a structure containing initialization options for * an SPI channel. * \param pba_hz SPI module input clock frequency (PBA clock, Hz). * * \return Status. * \retval SPI_OK Success. * \retval SPI_ERROR_ARGUMENT Invalid argument(s) passed. */ extern spi_status_t spi_setupChipReg(volatile avr32_spi_t *spi, const spi_options_t *options, unsigned int pba_hz); /*! \brief Enables the SPI. * * \param spi Base address of the SPI instance. */ extern void spi_enable(volatile avr32_spi_t *spi); /*! \brief Disables the SPI. * * Ensures that nothing is transferred while setting up buffers. * * \param spi Base address of the SPI instance. * * \warning This may cause data loss if used on a slave SPI. */ extern void spi_disable(volatile avr32_spi_t *spi); /*! \brief Tests if the SPI is enabled. * * \param spi Base address of the SPI instance. * * \return \c 1 if the SPI is enabled, otherwise \c 0. */ extern int spi_is_enabled(volatile avr32_spi_t *spi); /*! \brief Checks if there is no data in the transmit register. * * \param spi Base address of the SPI instance. * * \return Status. * \retval 1 No data in TDR. * \retval 0 Some data in TDR. */ extern unsigned char spi_writeRegisterEmptyCheck(volatile avr32_spi_t *spi); /*! \brief Writes one data word in master fixed peripheral select mode or in * slave mode. * * \param spi Base address of the SPI instance. * \param data The data word to write. * * \return Status. * \retval SPI_OK Success. * \retval SPI_ERROR_TIMEOUT Time-out. * * \note Will block program execution until time-out occurs if transmitter is * busy and transmit buffer is full. Invoke * \ref spi_writeRegisterEmptyCheck beforehand if needed. * * \note Once the data has been written to the transmit buffer, the end of * transmission is not waited for. Invoke \ref spi_writeEndCheck if * needed. */ extern spi_status_t spi_write(volatile avr32_spi_t *spi, unsigned short data); /*! \brief Selects a slave in master variable peripheral select mode and writes * one data word to it. * * \param spi Base address of the SPI instance. * \param data The data word to write. * \param pcs Slave selector (bit 0 -> nCS line 0, bit 1 -> nCS line 1, * etc.). * \param lastxfer Boolean indicating whether this is the last data word * transfer. * * \return Status. * \retval SPI_OK Success. * \retval SPI_ERROR_TIMEOUT Time-out. * \retval SPI_ERROR_ARGUMENT Invalid argument(s) passed. * * \note Will block program execution until time-out occurs if transmitter is * busy and transmit buffer is full. Invoke * \ref spi_writeRegisterEmptyCheck beforehand if needed. * * \note Once the data has been written to the transmit buffer, the end of * transmission is not waited for. Invoke \ref spi_writeEndCheck if * needed. */ extern spi_status_t spi_variableSlaveWrite(volatile avr32_spi_t *spi, unsigned short data, unsigned char pcs, unsigned char lastxfer); /*! \brief Checks if all transmissions are complete. * * \param spi Base address of the SPI instance. * * \return Status. * \retval 1 All transmissions complete. * \retval 0 Transmissions not complete. */ extern unsigned char spi_writeEndCheck(volatile avr32_spi_t *spi); /*! \brief Checks if there is data in the receive register. * * \param spi Base address of the SPI instance. * * \return Status. * \retval 1 Some data in RDR. * \retval 0 No data in RDR. */ extern unsigned char spi_readRegisterFullCheck(volatile avr32_spi_t *spi); /*! \brief Reads one data word in master mode or in slave mode. * * \param spi Base address of the SPI instance. * \param data Pointer to the location where to store the received data word. * * \return Status. * \retval SPI_OK Success. * \retval SPI_ERROR_TIMEOUT Time-out. * * \note Will block program execution until time-out occurs if no data is * received or last transmission is not complete. Invoke * \ref spi_writeEndCheck or \ref spi_readRegisterFullCheck beforehand if * needed. */ extern spi_status_t spi_read(volatile avr32_spi_t *spi, unsigned short *data); /*! \brief Gets status information from the SPI. * * \param spi Base address of the SPI instance. * * \return Status. * \retval SPI_OK Success. * \retval SPI_ERROR_OVERRUN Overrun error. * \retval SPI_ERROR_MODE_FAULT Mode fault (SPI addressed as slave * while in master mode). * \retval SPI_ERROR_OVERRUN_AND_MODE_FAULT Overrun error and mode fault. */ extern unsigned char spi_getStatus(volatile avr32_spi_t *spi); #endif // _SPI_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/TC/tc.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief TC driver for AVR32 UC3. * * AVR32 Timer/Counter driver module. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a TC module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include #include "compiler.h" #include "tc.h" int tc_get_interrupt_settings(volatile avr32_tc_t *tc, unsigned int channel) { // Check for valid input. if (channel >= TC_NUMBER_OF_CHANNELS) return TC_INVALID_ARGUMENT; return tc->channel[channel].imr; } int tc_configure_interrupts(volatile avr32_tc_t *tc, unsigned int channel, const tc_interrupt_t *bitfield) { Bool global_interrupt_enabled = Is_global_interrupt_enabled(); // Check for valid input. if (channel >= TC_NUMBER_OF_CHANNELS) return TC_INVALID_ARGUMENT; // Enable the appropriate interrupts. tc->channel[channel].ier = bitfield->etrgs << AVR32_TC_ETRGS_OFFSET | bitfield->ldrbs << AVR32_TC_LDRBS_OFFSET | bitfield->ldras << AVR32_TC_LDRAS_OFFSET | bitfield->cpcs << AVR32_TC_CPCS_OFFSET | bitfield->cpbs << AVR32_TC_CPBS_OFFSET | bitfield->cpas << AVR32_TC_CPAS_OFFSET | bitfield->lovrs << AVR32_TC_LOVRS_OFFSET | bitfield->covfs << AVR32_TC_COVFS_OFFSET; // Disable the appropriate interrupts. if (global_interrupt_enabled) Disable_global_interrupt(); tc->channel[channel].idr = (~bitfield->etrgs & 1) << AVR32_TC_ETRGS_OFFSET | (~bitfield->ldrbs & 1) << AVR32_TC_LDRBS_OFFSET | (~bitfield->ldras & 1) << AVR32_TC_LDRAS_OFFSET | (~bitfield->cpcs & 1) << AVR32_TC_CPCS_OFFSET | (~bitfield->cpbs & 1) << AVR32_TC_CPBS_OFFSET | (~bitfield->cpas & 1) << AVR32_TC_CPAS_OFFSET | (~bitfield->lovrs & 1) << AVR32_TC_LOVRS_OFFSET | (~bitfield->covfs & 1) << AVR32_TC_COVFS_OFFSET; tc->channel[channel].sr; if (global_interrupt_enabled) Enable_global_interrupt(); return 0; } int tc_select_external_clock(volatile avr32_tc_t *tc, unsigned int channel, unsigned int ext_clk_sig_src) { // Check for valid input. if (channel >= TC_NUMBER_OF_CHANNELS || ext_clk_sig_src >= 1 << AVR32_TC_BMR_TC0XC0S_SIZE) return TC_INVALID_ARGUMENT; // Clear bit-field and set the correct behavior. tc->bmr = (tc->bmr & ~(AVR32_TC_BMR_TC0XC0S_MASK << (channel * AVR32_TC_BMR_TC0XC0S_SIZE))) | (ext_clk_sig_src << (channel * AVR32_TC_BMR_TC0XC0S_SIZE)); return 0; } int tc_init_capture(volatile avr32_tc_t *tc, const tc_capture_opt_t *opt) { // Check for valid input. if (opt->channel >= TC_NUMBER_OF_CHANNELS) return TC_INVALID_ARGUMENT; // MEASURE SIGNALS: Capture operating mode. tc->channel[opt->channel].cmr = opt->ldrb << AVR32_TC_LDRB_OFFSET | opt->ldra << AVR32_TC_LDRA_OFFSET | 0 << AVR32_TC_WAVE_OFFSET | opt->cpctrg << AVR32_TC_CPCTRG_OFFSET | opt->abetrg << AVR32_TC_ABETRG_OFFSET | opt->etrgedg << AVR32_TC_ETRGEDG_OFFSET| opt->ldbdis << AVR32_TC_LDBDIS_OFFSET | opt->ldbstop << AVR32_TC_LDBSTOP_OFFSET | opt->burst << AVR32_TC_BURST_OFFSET | opt->clki << AVR32_TC_CLKI_OFFSET | opt->tcclks << AVR32_TC_TCCLKS_OFFSET; return 0; } int tc_init_waveform(volatile avr32_tc_t *tc, const tc_waveform_opt_t *opt) { // Check for valid input. if (opt->channel >= TC_NUMBER_OF_CHANNELS) return TC_INVALID_ARGUMENT; // GENERATE SIGNALS: Waveform operating mode. tc->channel[opt->channel].cmr = opt->bswtrg << AVR32_TC_BSWTRG_OFFSET | opt->beevt << AVR32_TC_BEEVT_OFFSET | opt->bcpc << AVR32_TC_BCPC_OFFSET | opt->bcpb << AVR32_TC_BCPB_OFFSET | opt->aswtrg << AVR32_TC_ASWTRG_OFFSET | opt->aeevt << AVR32_TC_AEEVT_OFFSET | opt->acpc << AVR32_TC_ACPC_OFFSET | opt->acpa << AVR32_TC_ACPA_OFFSET | 1 << AVR32_TC_WAVE_OFFSET | opt->wavsel << AVR32_TC_WAVSEL_OFFSET | opt->enetrg << AVR32_TC_ENETRG_OFFSET | opt->eevt << AVR32_TC_EEVT_OFFSET | opt->eevtedg << AVR32_TC_EEVTEDG_OFFSET | opt->cpcdis << AVR32_TC_CPCDIS_OFFSET | opt->cpcstop << AVR32_TC_CPCSTOP_OFFSET | opt->burst << AVR32_TC_BURST_OFFSET | opt->clki << AVR32_TC_CLKI_OFFSET | opt->tcclks << AVR32_TC_TCCLKS_OFFSET; return 0; } int tc_start(volatile avr32_tc_t *tc, unsigned int channel) { // Check for valid input. if (channel >= TC_NUMBER_OF_CHANNELS) return TC_INVALID_ARGUMENT; // Enable, reset and start the selected timer/counter channel. tc->channel[channel].ccr = AVR32_TC_SWTRG_MASK | AVR32_TC_CLKEN_MASK; return 0; } int tc_stop(volatile avr32_tc_t *tc, unsigned int channel) { // Check for valid input. if (channel >= TC_NUMBER_OF_CHANNELS) return TC_INVALID_ARGUMENT; // Disable the selected timer/counter channel. tc->channel[channel].ccr = AVR32_TC_CLKDIS_MASK; return 0; } int tc_software_trigger(volatile avr32_tc_t *tc, unsigned int channel) { // Check for valid input. if (channel >= TC_NUMBER_OF_CHANNELS) return TC_INVALID_ARGUMENT; // Reset the selected timer/counter channel. tc->channel[channel].ccr = AVR32_TC_SWTRG_MASK; return 0; } void tc_sync_trigger(volatile avr32_tc_t *tc) { // Reset all channels of the selected timer/counter. tc->bcr = AVR32_TC_BCR_SYNC_MASK; } void tc_sync_start(volatile avr32_tc_t *tc) { unsigned int i; // Enable the clock for each channel. for(i=0; ichannel[i].ccr = AVR32_TC_CLKEN_MASK; // Reset all channels of the selected timer/counter. tc->bcr = AVR32_TC_BCR_SYNC_MASK; } int tc_read_sr(volatile avr32_tc_t *tc, unsigned int channel) { // Check for valid input. if (channel >= TC_NUMBER_OF_CHANNELS) return TC_INVALID_ARGUMENT; return tc->channel[channel].sr; } int tc_read_tc(volatile avr32_tc_t *tc, unsigned int channel) { // Check for valid input. if (channel >= TC_NUMBER_OF_CHANNELS) return TC_INVALID_ARGUMENT; return Rd_bitfield(tc->channel[channel].cv, AVR32_TC_CV_MASK); } int tc_read_ra(volatile avr32_tc_t *tc, unsigned int channel) { // Check for valid input. if (channel >= TC_NUMBER_OF_CHANNELS) return TC_INVALID_ARGUMENT; return Rd_bitfield(tc->channel[channel].ra, AVR32_TC_RA_MASK); } int tc_read_rb(volatile avr32_tc_t *tc, unsigned int channel) { // Check for valid input. if (channel >= TC_NUMBER_OF_CHANNELS) return TC_INVALID_ARGUMENT; return Rd_bitfield(tc->channel[channel].rb, AVR32_TC_RB_MASK); } int tc_read_rc(volatile avr32_tc_t *tc, unsigned int channel) { // Check for valid input. if (channel >= TC_NUMBER_OF_CHANNELS) return TC_INVALID_ARGUMENT; return Rd_bitfield(tc->channel[channel].rc, AVR32_TC_RC_MASK); } int tc_write_ra(volatile avr32_tc_t *tc, unsigned int channel, unsigned short value) { // Check for valid input. if (channel >= TC_NUMBER_OF_CHANNELS) return TC_INVALID_ARGUMENT; // This function is only available in WAVEFORM mode. if (Tst_bits(tc->channel[channel].cmr, AVR32_TC_WAVE_MASK)) Wr_bitfield(tc->channel[channel].ra, AVR32_TC_RA_MASK, value); return value; } int tc_write_rb(volatile avr32_tc_t *tc, unsigned int channel, unsigned short value) { // Check for valid input. if (channel >= TC_NUMBER_OF_CHANNELS) return TC_INVALID_ARGUMENT; // This function is only available in WAVEFORM mode. if (Tst_bits(tc->channel[channel].cmr, AVR32_TC_WAVE_MASK)) Wr_bitfield(tc->channel[channel].rb, AVR32_TC_RB_MASK, value); return value; } int tc_write_rc(volatile avr32_tc_t *tc, unsigned int channel, unsigned short value) { // Check for valid input. if (channel >= TC_NUMBER_OF_CHANNELS) return TC_INVALID_ARGUMENT; // This function is only available in WAVEFORM mode. if (Tst_bits(tc->channel[channel].cmr, AVR32_TC_WAVE_MASK)) Wr_bitfield(tc->channel[channel].rc, AVR32_TC_RC_MASK, value); return value; } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/TC/tc.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Timer/Counter driver for AVR32 UC3. * * AVR32 Timer/Counter driver module. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a TC module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _TC_H_ #define _TC_H_ #include //! TC driver functions return value in case of invalid argument(s). #define TC_INVALID_ARGUMENT (-1) //! Number of timer/counter channels. #define TC_NUMBER_OF_CHANNELS (sizeof(((avr32_tc_t *)0)->channel) / sizeof(avr32_tc_channel_t)) /*! \name External Clock Signal 0 Selection */ //! @{ #define TC_CH0_EXT_CLK0_SRC_TCLK0 AVR32_TC_TC0XC0S_TCLK0 #define TC_CH0_EXT_CLK0_SRC_NO_CLK AVR32_TC_TC0XC0S_NO_CLK #define TC_CH0_EXT_CLK0_SRC_TIOA1 AVR32_TC_TC0XC0S_TIOA1 #define TC_CH0_EXT_CLK0_SRC_TIOA2 AVR32_TC_TC0XC0S_TIOA2 //! @} /*! \name External Clock Signal 1 Selection */ //! @{ #define TC_CH1_EXT_CLK1_SRC_TCLK1 AVR32_TC_TC1XC1S_TCLK1 #define TC_CH1_EXT_CLK1_SRC_NO_CLK AVR32_TC_TC1XC1S_NO_CLK #define TC_CH1_EXT_CLK1_SRC_TIOA0 AVR32_TC_TC1XC1S_TIOA0 #define TC_CH1_EXT_CLK1_SRC_TIOA2 AVR32_TC_TC1XC1S_TIOA2 //! @} /*! \name External Clock Signal 2 Selection */ //! @{ #define TC_CH2_EXT_CLK2_SRC_TCLK2 AVR32_TC_TC2XC2S_TCLK2 #define TC_CH2_EXT_CLK2_SRC_NO_CLK AVR32_TC_TC2XC2S_NO_CLK #define TC_CH2_EXT_CLK2_SRC_TIOA0 AVR32_TC_TC2XC2S_TIOA0 #define TC_CH2_EXT_CLK2_SRC_TIOA1 AVR32_TC_TC2XC2S_TIOA1 //! @} /*! \name Event/Trigger Actions on Output */ //! @{ #define TC_EVT_EFFECT_NOOP AVR32_TC_NONE #define TC_EVT_EFFECT_SET AVR32_TC_SET #define TC_EVT_EFFECT_CLEAR AVR32_TC_CLEAR #define TC_EVT_EFFECT_TOGGLE AVR32_TC_TOGGLE //! @} /*! \name RC Compare Trigger Enable */ //! @{ #define TC_NO_TRIGGER_COMPARE_RC 0 #define TC_TRIGGER_COMPARE_RC 1 //! @} /*! \name Waveform Selection */ //! @{ #define TC_WAVEFORM_SEL_UP_MODE AVR32_TC_WAVSEL_UP_NO_AUTO #define TC_WAVEFORM_SEL_UP_MODE_RC_TRIGGER AVR32_TC_WAVSEL_UP_AUTO #define TC_WAVEFORM_SEL_UPDOWN_MODE AVR32_TC_WAVSEL_UPDOWN_NO_AUTO #define TC_WAVEFORM_SEL_UPDOWN_MODE_RC_TRIGGER AVR32_TC_WAVSEL_UPDOWN_AUTO //! @} /*! \name TIOA or TIOB External Trigger Selection */ //! @{ #define TC_EXT_TRIG_SEL_TIOA 1 #define TC_EXT_TRIG_SEL_TIOB 0 //! @} /*! \name External Event Selection */ //! @{ #define TC_EXT_EVENT_SEL_TIOB_INPUT AVR32_TC_EEVT_TIOB_INPUT #define TC_EXT_EVENT_SEL_XC0_OUTPUT AVR32_TC_EEVT_XC0_OUTPUT #define TC_EXT_EVENT_SEL_XC1_OUTPUT AVR32_TC_EEVT_XC1_OUTPUT #define TC_EXT_EVENT_SEL_XC2_OUTPUT AVR32_TC_EEVT_XC2_OUTPUT //! @} /*! \name Edge Selection */ //! @{ #define TC_SEL_NO_EDGE AVR32_TC_EEVTEDG_NO_EDGE #define TC_SEL_RISING_EDGE AVR32_TC_EEVTEDG_POS_EDGE #define TC_SEL_FALLING_EDGE AVR32_TC_EEVTEDG_NEG_EDGE #define TC_SEL_EACH_EDGE AVR32_TC_EEVTEDG_BOTH_EDGES //! @} /*! \name Burst Signal Selection */ //! @{ #define TC_BURST_NOT_GATED AVR32_TC_BURST_NOT_GATED #define TC_BURST_CLK_AND_XC0 AVR32_TC_BURST_CLK_AND_XC0 #define TC_BURST_CLK_AND_XC1 AVR32_TC_BURST_CLK_AND_XC1 #define TC_BURST_CLK_AND_XC2 AVR32_TC_BURST_CLK_AND_XC2 //! @} /*! \name Clock Invert */ //! @{ #define TC_CLOCK_RISING_EDGE 0 #define TC_CLOCK_FALLING_EDGE 1 //! @} /*! \name Clock Selection */ //! @{ #define TC_CLOCK_SOURCE_TC1 AVR32_TC_TCCLKS_TIMER_CLOCK1 #define TC_CLOCK_SOURCE_TC2 AVR32_TC_TCCLKS_TIMER_CLOCK2 #define TC_CLOCK_SOURCE_TC3 AVR32_TC_TCCLKS_TIMER_CLOCK3 #define TC_CLOCK_SOURCE_TC4 AVR32_TC_TCCLKS_TIMER_CLOCK4 #define TC_CLOCK_SOURCE_TC5 AVR32_TC_TCCLKS_TIMER_CLOCK5 #define TC_CLOCK_SOURCE_XC0 AVR32_TC_TCCLKS_XC0 #define TC_CLOCK_SOURCE_XC1 AVR32_TC_TCCLKS_XC1 #define TC_CLOCK_SOURCE_XC2 AVR32_TC_TCCLKS_XC2 //! @} //! Timer/counter interrupts. typedef struct { unsigned int :24; //! External trigger interrupt. unsigned int etrgs : 1; //! RB load interrupt. unsigned int ldrbs : 1; //! RA load interrupt. unsigned int ldras : 1; //! RC compare interrupt. unsigned int cpcs : 1; //! RB compare interrupt. unsigned int cpbs : 1; //! RA compare interrupt. unsigned int cpas : 1; //! Load overrun interrupt. unsigned int lovrs : 1; //! Counter overflow interrupt. unsigned int covfs : 1; } tc_interrupt_t; //! Parameters when initializing a timer/counter in capture mode. typedef struct { //! Channel to initialize. unsigned int channel ; unsigned int :12; //! RB loading selection:\n //! - \ref TC_SEL_NO_EDGE;\n //! - \ref TC_SEL_RISING_EDGE;\n //! - \ref TC_SEL_FALLING_EDGE;\n //! - \ref TC_SEL_EACH_EDGE. unsigned int ldrb : 2; //! RA loading selection:\n //! - \ref TC_SEL_NO_EDGE;\n //! - \ref TC_SEL_RISING_EDGE;\n //! - \ref TC_SEL_FALLING_EDGE;\n //! - \ref TC_SEL_EACH_EDGE. unsigned int ldra : 2; unsigned int : 1; //! RC compare trigger enable:\n //! - \ref TC_NO_TRIGGER_COMPARE_RC;\n //! - \ref TC_TRIGGER_COMPARE_RC. unsigned int cpctrg : 1; unsigned int : 3; //! TIOA or TIOB external trigger selection:\n //! - \ref TC_EXT_TRIG_SEL_TIOA;\n //! - \ref TC_EXT_TRIG_SEL_TIOB. unsigned int abetrg : 1; //! External trigger edge selection:\n //! - \ref TC_SEL_NO_EDGE;\n //! - \ref TC_SEL_RISING_EDGE;\n //! - \ref TC_SEL_FALLING_EDGE;\n //! - \ref TC_SEL_EACH_EDGE. unsigned int etrgedg : 2; //! Counter clock disable with RB loading:\n //! - \c FALSE;\n //! - \c TRUE. unsigned int ldbdis : 1; //! Counter clock stopped with RB loading:\n //! - \c FALSE;\n //! - \c TRUE. unsigned int ldbstop : 1; //! Burst signal selection:\n //! - \ref TC_BURST_NOT_GATED;\n //! - \ref TC_BURST_CLK_AND_XC0;\n //! - \ref TC_BURST_CLK_AND_XC1;\n //! - \ref TC_BURST_CLK_AND_XC2. unsigned int burst : 2; //! Clock invert:\n //! - \ref TC_CLOCK_RISING_EDGE;\n //! - \ref TC_CLOCK_FALLING_EDGE. unsigned int clki : 1; //! Clock selection:\n //! - \ref TC_CLOCK_SOURCE_TC1;\n //! - \ref TC_CLOCK_SOURCE_TC2;\n //! - \ref TC_CLOCK_SOURCE_TC3;\n //! - \ref TC_CLOCK_SOURCE_TC4;\n //! - \ref TC_CLOCK_SOURCE_TC5;\n //! - \ref TC_CLOCK_SOURCE_XC0;\n //! - \ref TC_CLOCK_SOURCE_XC1;\n //! - \ref TC_CLOCK_SOURCE_XC2. unsigned int tcclks : 3; } tc_capture_opt_t; //! Parameters when initializing a timer/counter in waveform mode. typedef struct { //! Channel to initialize. unsigned int channel ; //! Software trigger effect on TIOB:\n //! - \ref TC_EVT_EFFECT_NOOP;\n //! - \ref TC_EVT_EFFECT_SET;\n //! - \ref TC_EVT_EFFECT_CLEAR;\n //! - \ref TC_EVT_EFFECT_TOGGLE. unsigned int bswtrg : 2; //! External event effect on TIOB:\n //! - \ref TC_EVT_EFFECT_NOOP;\n //! - \ref TC_EVT_EFFECT_SET;\n //! - \ref TC_EVT_EFFECT_CLEAR;\n //! - \ref TC_EVT_EFFECT_TOGGLE. unsigned int beevt : 2; //! RC compare effect on TIOB:\n //! - \ref TC_EVT_EFFECT_NOOP;\n //! - \ref TC_EVT_EFFECT_SET;\n //! - \ref TC_EVT_EFFECT_CLEAR;\n //! - \ref TC_EVT_EFFECT_TOGGLE. unsigned int bcpc : 2; //! RB compare effect on TIOB:\n //! - \ref TC_EVT_EFFECT_NOOP;\n //! - \ref TC_EVT_EFFECT_SET;\n //! - \ref TC_EVT_EFFECT_CLEAR;\n //! - \ref TC_EVT_EFFECT_TOGGLE. unsigned int bcpb : 2; //! Software trigger effect on TIOA:\n //! - \ref TC_EVT_EFFECT_NOOP;\n //! - \ref TC_EVT_EFFECT_SET;\n //! - \ref TC_EVT_EFFECT_CLEAR;\n //! - \ref TC_EVT_EFFECT_TOGGLE. unsigned int aswtrg : 2; //! External event effect on TIOA:\n //! - \ref TC_EVT_EFFECT_NOOP;\n //! - \ref TC_EVT_EFFECT_SET;\n //! - \ref TC_EVT_EFFECT_CLEAR;\n //! - \ref TC_EVT_EFFECT_TOGGLE. unsigned int aeevt : 2; //! RC compare effect on TIOA:\n //! - \ref TC_EVT_EFFECT_NOOP;\n //! - \ref TC_EVT_EFFECT_SET;\n //! - \ref TC_EVT_EFFECT_CLEAR;\n //! - \ref TC_EVT_EFFECT_TOGGLE. unsigned int acpc : 2; //! RA compare effect on TIOA:\n //! - \ref TC_EVT_EFFECT_NOOP;\n //! - \ref TC_EVT_EFFECT_SET;\n //! - \ref TC_EVT_EFFECT_CLEAR;\n //! - \ref TC_EVT_EFFECT_TOGGLE. unsigned int acpa : 2; unsigned int : 1; //! Waveform selection:\n //! - \ref TC_WAVEFORM_SEL_UP_MODE;\n //! - \ref TC_WAVEFORM_SEL_UP_MODE_RC_TRIGGER;\n //! - \ref TC_WAVEFORM_SEL_UPDOWN_MODE;\n //! - \ref TC_WAVEFORM_SEL_UPDOWN_MODE_RC_TRIGGER. unsigned int wavsel : 2; //! External event trigger enable:\n //! - \c FALSE;\n //! - \c TRUE. unsigned int enetrg : 1; //! External event selection:\n //! - \ref TC_EXT_EVENT_SEL_TIOB_INPUT;\n //! - \ref TC_EXT_EVENT_SEL_XC0_OUTPUT;\n //! - \ref TC_EXT_EVENT_SEL_XC1_OUTPUT;\n //! - \ref TC_EXT_EVENT_SEL_XC2_OUTPUT. unsigned int eevt : 2; //! External event edge selection:\n //! - \ref TC_SEL_NO_EDGE;\n //! - \ref TC_SEL_RISING_EDGE;\n //! - \ref TC_SEL_FALLING_EDGE;\n //! - \ref TC_SEL_EACH_EDGE. unsigned int eevtedg : 2; //! Counter clock disable with RC compare:\n //! - \c FALSE;\n //! - \c TRUE. unsigned int cpcdis : 1; //! Counter clock stopped with RC compare:\n //! - \c FALSE;\n //! - \c TRUE. unsigned int cpcstop : 1; //! Burst signal selection:\n //! - \ref TC_BURST_NOT_GATED;\n //! - \ref TC_BURST_CLK_AND_XC0;\n //! - \ref TC_BURST_CLK_AND_XC1;\n //! - \ref TC_BURST_CLK_AND_XC2. unsigned int burst : 2; //! Clock invert:\n //! - \ref TC_CLOCK_RISING_EDGE;\n //! - \ref TC_CLOCK_FALLING_EDGE. unsigned int clki : 1; //! Clock selection:\n //! - \ref TC_CLOCK_SOURCE_TC1;\n //! - \ref TC_CLOCK_SOURCE_TC2;\n //! - \ref TC_CLOCK_SOURCE_TC3;\n //! - \ref TC_CLOCK_SOURCE_TC4;\n //! - \ref TC_CLOCK_SOURCE_TC5;\n //! - \ref TC_CLOCK_SOURCE_XC0;\n //! - \ref TC_CLOCK_SOURCE_XC1;\n //! - \ref TC_CLOCK_SOURCE_XC2. unsigned int tcclks : 3; } tc_waveform_opt_t; /*! \brief Reads timer/counter interrupt settings. * * \param tc Pointer to the TC instance to access. * \param channel The TC instance channel to access. * * \retval >=0 The interrupt enable configuration organized according to \ref tc_interrupt_t. * \retval TC_INVALID_ARGUMENT Invalid argument(s). */ extern int tc_get_interrupt_settings(volatile avr32_tc_t *tc, unsigned int channel); /*! \brief Enables various timer/counter interrupts. * * \param tc Pointer to the TC instance to access. * \param channel The TC instance channel to access. * \param bitfield The interrupt enable configuration. * * \retval 0 Success. * \retval TC_INVALID_ARGUMENT Invalid argument(s). */ extern int tc_configure_interrupts(volatile avr32_tc_t *tc, unsigned int channel, const tc_interrupt_t *bitfield); /*! \brief Selects which external clock to use and how to configure it. * * \param tc Pointer to the TC instance to access. * \param channel The TC instance channel to access. * \param ext_clk_sig_src External clock signal selection: * \arg \c TC_CH0_EXT_CLK0_SRC_TCLK0; * \arg \c TC_CH0_EXT_CLK0_SRC_NO_CLK; * \arg \c TC_CH0_EXT_CLK0_SRC_TIOA1; * \arg \c TC_CH0_EXT_CLK0_SRC_TIOA2; * \arg \c TC_CH1_EXT_CLK1_SRC_TCLK1; * \arg \c TC_CH1_EXT_CLK1_SRC_NO_CLK; * \arg \c TC_CH1_EXT_CLK1_SRC_TIOA0; * \arg \c TC_CH1_EXT_CLK1_SRC_TIOA2; * \arg \c TC_CH2_EXT_CLK2_SRC_TCLK2; * \arg \c TC_CH2_EXT_CLK2_SRC_NO_CLK; * \arg \c TC_CH2_EXT_CLK2_SRC_TIOA0; * \arg \c TC_CH2_EXT_CLK2_SRC_TIOA1. * * \retval 0 Success. * \retval TC_INVALID_ARGUMENT Invalid argument(s). */ extern int tc_select_external_clock(volatile avr32_tc_t *tc, unsigned int channel, unsigned int ext_clk_sig_src); /*! \brief Sets options for timer/counter capture initialization. * * \param tc Pointer to the TC instance to access. * \param opt Options for capture mode. * * \retval 0 Success. * \retval TC_INVALID_ARGUMENT Invalid argument(s). */ extern int tc_init_capture(volatile avr32_tc_t *tc, const tc_capture_opt_t *opt); /*! \brief Sets options for timer/counter waveform initialization. * * \param tc Pointer to the TC instance to access. * \param opt Options for waveform generation. * * \retval 0 Success. * \retval TC_INVALID_ARGUMENT Invalid argument(s). */ extern int tc_init_waveform(volatile avr32_tc_t *tc, const tc_waveform_opt_t *opt); /*! \brief Starts a timer/counter. * * \param tc Pointer to the TC instance to access. * \param channel The TC instance channel to access. * * \retval 0 Success. * \retval TC_INVALID_ARGUMENT Invalid argument(s). */ extern int tc_start(volatile avr32_tc_t *tc, unsigned int channel); /*! \brief Stops a timer/counter. * * \param tc Pointer to the TC instance to access. * \param channel The TC instance channel to access. * * \retval 0 Success. * \retval TC_INVALID_ARGUMENT Invalid argument(s). */ extern int tc_stop(volatile avr32_tc_t *tc, unsigned int channel); /*! \brief Performs a software trigger: the counter is reset and the clock is started. * * \param tc Pointer to the TC instance to access. * \param channel The TC instance channel to access. * * \retval 0 Success. * \retval TC_INVALID_ARGUMENT Invalid argument(s). */ extern int tc_software_trigger(volatile avr32_tc_t *tc, unsigned int channel); /*! \brief Asserts a SYNC signal to generate a software trigger and reset all channels. * * \param tc Pointer to the TC instance to access. */ extern void tc_sync_trigger(volatile avr32_tc_t *tc); /*! \brief Start all TC channels simultaneously. * * \param tc Pointer to the TC instance to access. */ extern void tc_sync_start(volatile avr32_tc_t *tc); /*! \brief Reads the status register. * * \param tc Pointer to the TC instance to access. * \param channel The TC instance channel to access. * * \retval >=0 Status register value. * \retval TC_INVALID_ARGUMENT Invalid argument(s). */ extern int tc_read_sr(volatile avr32_tc_t *tc, unsigned int channel); /*! \brief Reads the channel's TC counter and returns the value. * * \param tc Pointer to the TC instance to access. * \param channel The TC instance channel to access. * * \retval >=0 TC counter value. * \retval TC_INVALID_ARGUMENT Invalid argument(s). */ extern int tc_read_tc(volatile avr32_tc_t *tc, unsigned int channel); /*! \brief Reads the channel's RA register and returns the value. * * \param tc Pointer to the TC instance to access. * \param channel The TC instance channel to access. * * \retval >=0 RA register value. * \retval TC_INVALID_ARGUMENT Invalid argument(s). */ extern int tc_read_ra(volatile avr32_tc_t *tc, unsigned int channel); /*! \brief Reads the channel's RB register and returns the value. * * \param tc Pointer to the TC instance to access. * \param channel The TC instance channel to access. * * \retval >=0 RB register value. * \retval TC_INVALID_ARGUMENT Invalid argument(s). */ extern int tc_read_rb(volatile avr32_tc_t *tc, unsigned int channel); /*! \brief Reads the channel's RC register and returns the value. * * \param tc Pointer to the TC instance to access. * \param channel The TC instance channel to access. * * \retval >=0 RC register value. * \retval TC_INVALID_ARGUMENT Invalid argument(s). */ extern int tc_read_rc(volatile avr32_tc_t *tc, unsigned int channel); /*! \brief Writes a value to the channel's RA register. * * \param tc Pointer to the TC instance to access. * \param channel The TC instance channel to access. * \param value Value to write to the RA register. * * \retval >=0 Written value. * \retval TC_INVALID_ARGUMENT Invalid argument(s). */ extern int tc_write_ra(volatile avr32_tc_t *tc, unsigned int channel, unsigned short value); /*! \brief Writes a value to the channel's RB register. * * \param tc Pointer to the TC instance to access. * \param channel The TC instance channel to access. * \param value Value to write to the RB register. * * \retval >=0 Written value. * \retval TC_INVALID_ARGUMENT Invalid argument(s). */ extern int tc_write_rb(volatile avr32_tc_t *tc, unsigned int channel, unsigned short value); /*! \brief Writes a value to the channel's RC register. * * \param tc Pointer to the TC instance to access. * \param channel The TC instance channel to access. * \param value Value to write to the RC register. * * \retval >=0 Written value. * \retval TC_INVALID_ARGUMENT Invalid argument(s). */ extern int tc_write_rc(volatile avr32_tc_t *tc, unsigned int channel, unsigned short value); #endif // _TC_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/USART/usart.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief USART driver for AVR32 UC3. * * This file contains basic functions for the AVR32 USART, with support for all * modes, settings and clock speeds. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a USART module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "compiler.h" #include "usart.h" //------------------------------------------------------------------------------ /*! \name Private Functions */ //! @{ /*! \brief Checks if the USART is in multidrop mode. * * \param usart Base address of the USART instance. * * \return \c 1 if the USART is in multidrop mode, otherwise \c 0. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif static __inline__ int usart_mode_is_multidrop(volatile avr32_usart_t *usart) { return ((usart->mr >> AVR32_USART_MR_PAR_OFFSET) & AVR32_USART_MR_PAR_MULTI) == AVR32_USART_MR_PAR_MULTI; } /*! \brief Calculates a clock divider (\e CD) and a fractional part (\e FP) for * the USART asynchronous modes to generate a baud rate as close as * possible to the baud rate set point. * * Baud rate calculation: * \f$ Baudrate = \frac{SelectedClock}{Over \times (CD + \frac{FP}{8})} \f$, \e Over being 16 or 8. * The maximal oversampling is selected if it allows to generate a baud rate close to the set point. * * \param usart Base address of the USART instance. * \param baudrate Baud rate set point. * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS Baud rate successfully initialized. * \retval USART_INVALID_INPUT Baud rate set point is out of range for the given input clock frequency. */ static int usart_set_async_baudrate(volatile avr32_usart_t *usart, unsigned int baudrate, unsigned long pba_hz) { unsigned int over = (pba_hz >= 16 * baudrate) ? 16 : 8; unsigned int cd_fp = ((1 << AVR32_USART_BRGR_FP_SIZE) * pba_hz + (over * baudrate) / 2) / (over * baudrate); unsigned int cd = cd_fp >> AVR32_USART_BRGR_FP_SIZE; unsigned int fp = cd_fp & ((1 << AVR32_USART_BRGR_FP_SIZE) - 1); if (cd < 1 || cd > (1 << AVR32_USART_BRGR_CD_SIZE) - 1) return USART_INVALID_INPUT; usart->mr = (usart->mr & ~(AVR32_USART_MR_USCLKS_MASK | AVR32_USART_MR_SYNC_MASK | AVR32_USART_MR_OVER_MASK)) | AVR32_USART_MR_USCLKS_MCK << AVR32_USART_MR_USCLKS_OFFSET | ((over == 16) ? AVR32_USART_MR_OVER_X16 : AVR32_USART_MR_OVER_X8) << AVR32_USART_MR_OVER_OFFSET; usart->brgr = cd << AVR32_USART_BRGR_CD_OFFSET | fp << AVR32_USART_BRGR_FP_OFFSET; return USART_SUCCESS; } /*! \brief Calculates a clock divider (\e CD) for the USART synchronous master * modes to generate a baud rate as close as possible to the baud rate * set point. * * Baud rate calculation: * \f$ Baudrate = \frac{SelectedClock}{CD} \f$. * * \param usart Base address of the USART instance. * \param baudrate Baud rate set point. * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS Baud rate successfully initialized. * \retval USART_INVALID_INPUT Baud rate set point is out of range for the given input clock frequency. */ static int usart_set_sync_master_baudrate(volatile avr32_usart_t *usart, unsigned int baudrate, unsigned long pba_hz) { unsigned int cd = (pba_hz + baudrate / 2) / baudrate; if (cd < 1 || cd > (1 << AVR32_USART_BRGR_CD_SIZE) - 1) return USART_INVALID_INPUT; usart->mr = (usart->mr & ~AVR32_USART_MR_USCLKS_MASK) | AVR32_USART_MR_USCLKS_MCK << AVR32_USART_MR_USCLKS_OFFSET | AVR32_USART_MR_SYNC_MASK; usart->brgr = cd << AVR32_USART_BRGR_CD_OFFSET; return USART_SUCCESS; } /*! \brief Selects the SCK pin as the source of baud rate for the USART * synchronous slave modes. * * \param usart Base address of the USART instance. * * \retval USART_SUCCESS Baud rate successfully initialized. */ static int usart_set_sync_slave_baudrate(volatile avr32_usart_t *usart) { usart->mr = (usart->mr & ~AVR32_USART_MR_USCLKS_MASK) | AVR32_USART_MR_USCLKS_SCK << AVR32_USART_MR_USCLKS_OFFSET | AVR32_USART_MR_SYNC_MASK; return USART_SUCCESS; } /*! \brief Calculates a clock divider (\e CD) for the USART ISO7816 mode to * generate an ISO7816 clock as close as possible to the clock set point. * * ISO7816 clock calculation: * \f$ Clock = \frac{SelectedClock}{CD} \f$. * * \param usart Base address of the USART instance. * \param clock ISO7816 clock set point. * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS ISO7816 clock successfully initialized. * \retval USART_INVALID_INPUT ISO7816 clock set point is out of range for the given input clock frequency. */ static int usart_set_iso7816_clock(volatile avr32_usart_t *usart, unsigned int clock, unsigned long pba_hz) { unsigned int cd = (pba_hz + clock / 2) / clock; if (cd < 1 || cd > (1 << AVR32_USART_BRGR_CD_SIZE) - 1) return USART_INVALID_INPUT; usart->mr = (usart->mr & ~(AVR32_USART_MR_USCLKS_MASK | AVR32_USART_MR_SYNC_MASK | AVR32_USART_MR_OVER_MASK)) | AVR32_USART_MR_USCLKS_MCK << AVR32_USART_MR_USCLKS_OFFSET | AVR32_USART_MR_OVER_X16 << AVR32_USART_MR_OVER_OFFSET; usart->brgr = cd << AVR32_USART_BRGR_CD_OFFSET; return USART_SUCCESS; } #if defined(AVR32_USART_400_H_INCLUDED) || \ defined(AVR32_USART_410_H_INCLUDED) || \ defined(AVR32_USART_420_H_INCLUDED) || \ defined(AVR32_USART_440_H_INCLUDED) || \ defined(AVR32_USART_602_H_INCLUDED) /*! \brief Calculates a clock divider (\e CD) for the USART SPI master mode to * generate a baud rate as close as possible to the baud rate set point. * * Baud rate calculation: * \f$ Baudrate = \frac{SelectedClock}{CD} \f$. * * \param usart Base address of the USART instance. * \param baudrate Baud rate set point. * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS Baud rate successfully initialized. * \retval USART_INVALID_INPUT Baud rate set point is out of range for the given input clock frequency. */ static int usart_set_spi_master_baudrate(volatile avr32_usart_t *usart, unsigned int baudrate, unsigned long pba_hz) { unsigned int cd = (pba_hz + baudrate / 2) / baudrate; if (cd < 4 || cd > (1 << AVR32_USART_BRGR_CD_SIZE) - 1) return USART_INVALID_INPUT; usart->mr = (usart->mr & ~AVR32_USART_MR_USCLKS_MASK) | AVR32_USART_MR_USCLKS_MCK << AVR32_USART_MR_USCLKS_OFFSET; usart->brgr = cd << AVR32_USART_BRGR_CD_OFFSET; return USART_SUCCESS; } /*! \brief Selects the SCK pin as the source of baud rate for the USART SPI * slave mode. * * \param usart Base address of the USART instance. * * \retval USART_SUCCESS Baud rate successfully initialized. */ static int usart_set_spi_slave_baudrate(volatile avr32_usart_t *usart) { usart->mr = (usart->mr & ~AVR32_USART_MR_USCLKS_MASK) | AVR32_USART_MR_USCLKS_SCK << AVR32_USART_MR_USCLKS_OFFSET; return USART_SUCCESS; } #endif // USART rev. >= 4.0.0 //! @} //------------------------------------------------------------------------------ /*! \name Initialization Functions */ //! @{ void usart_reset(volatile avr32_usart_t *usart) { Bool global_interrupt_enabled = Is_global_interrupt_enabled(); // Disable all USART interrupts. // Interrupts needed should be set explicitly on every reset. if (global_interrupt_enabled) Disable_global_interrupt(); usart->idr = 0xFFFFFFFF; usart->csr; if (global_interrupt_enabled) Enable_global_interrupt(); // Reset mode and other registers that could cause unpredictable behavior after reset. usart->mr = 0; usart->rtor = 0; usart->ttgr = 0; // Shutdown TX and RX (will be re-enabled when setup has successfully completed), // reset status bits and turn off DTR and RTS. usart->cr = AVR32_USART_CR_RSTRX_MASK | AVR32_USART_CR_RSTTX_MASK | AVR32_USART_CR_RSTSTA_MASK | AVR32_USART_CR_RSTIT_MASK | AVR32_USART_CR_RSTNACK_MASK | #ifndef AVR32_USART_440_H_INCLUDED // Note: Modem Signal Management DTR-DSR-DCD-RI are not included in USART rev.440. AVR32_USART_CR_DTRDIS_MASK | #endif AVR32_USART_CR_RTSDIS_MASK; } int usart_init_rs232(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) { // Reset the USART and shutdown TX and RX. usart_reset(usart); // Check input values. if (!opt || // Null pointer. opt->charlength < 5 || opt->charlength > 9 || opt->paritytype > 7 || opt->stopbits > 2 + 255 || opt->channelmode > 3 || usart_set_async_baudrate(usart, opt->baudrate, pba_hz) == USART_INVALID_INPUT) return USART_INVALID_INPUT; if (opt->charlength == 9) { // Character length set to 9 bits. MODE9 dominates CHRL. usart->mr |= AVR32_USART_MR_MODE9_MASK; } else { // CHRL gives the character length (- 5) when MODE9 = 0. usart->mr |= (opt->charlength - 5) << AVR32_USART_MR_CHRL_OFFSET; } usart->mr |= opt->paritytype << AVR32_USART_MR_PAR_OFFSET | opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET; if (opt->stopbits > USART_2_STOPBITS) { // Set two stop bits usart->mr |= AVR32_USART_MR_NBSTOP_2 << AVR32_USART_MR_NBSTOP_OFFSET; // and a timeguard period gives the rest. usart->ttgr = opt->stopbits - USART_2_STOPBITS; } else // Insert 1, 1.5 or 2 stop bits. usart->mr |= opt->stopbits << AVR32_USART_MR_NBSTOP_OFFSET; // Set normal mode. usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | AVR32_USART_MR_MODE_NORMAL << AVR32_USART_MR_MODE_OFFSET; // Setup complete; enable communication. // Enable input and output. usart->cr = AVR32_USART_CR_RXEN_MASK | AVR32_USART_CR_TXEN_MASK; return USART_SUCCESS; } int usart_init_rs232_tx_only(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) { // Reset the USART and shutdown TX and RX. usart_reset(usart); // Check input values. if (!opt || // Null pointer. opt->charlength < 5 || opt->charlength > 9 || opt->paritytype > 7 || opt->stopbits == 1 || opt->stopbits > 2 + 255 || opt->channelmode > 3 || usart_set_sync_master_baudrate(usart, opt->baudrate, pba_hz) == USART_INVALID_INPUT) return USART_INVALID_INPUT; if (opt->charlength == 9) { // Character length set to 9 bits. MODE9 dominates CHRL. usart->mr |= AVR32_USART_MR_MODE9_MASK; } else { // CHRL gives the character length (- 5) when MODE9 = 0. usart->mr |= (opt->charlength - 5) << AVR32_USART_MR_CHRL_OFFSET; } usart->mr |= opt->paritytype << AVR32_USART_MR_PAR_OFFSET | opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET; if (opt->stopbits > USART_2_STOPBITS) { // Set two stop bits usart->mr |= AVR32_USART_MR_NBSTOP_2 << AVR32_USART_MR_NBSTOP_OFFSET; // and a timeguard period gives the rest. usart->ttgr = opt->stopbits - USART_2_STOPBITS; } else // Insert 1 or 2 stop bits. usart->mr |= opt->stopbits << AVR32_USART_MR_NBSTOP_OFFSET; // Set normal mode. usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | AVR32_USART_MR_MODE_NORMAL << AVR32_USART_MR_MODE_OFFSET; // Setup complete; enable communication. // Enable only output as input is not possible in synchronous mode without // transferring clock. usart->cr = AVR32_USART_CR_TXEN_MASK; return USART_SUCCESS; } int usart_init_hw_handshaking(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) { // First: Setup standard RS232. if (usart_init_rs232(usart, opt, pba_hz) == USART_INVALID_INPUT) return USART_INVALID_INPUT; // Set hardware handshaking mode. usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | AVR32_USART_MR_MODE_HARDWARE << AVR32_USART_MR_MODE_OFFSET; return USART_SUCCESS; } int usart_init_modem(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) { // First: Setup standard RS232. if (usart_init_rs232(usart, opt, pba_hz) == USART_INVALID_INPUT) return USART_INVALID_INPUT; // Set modem mode. usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | AVR32_USART_MR_MODE_MODEM << AVR32_USART_MR_MODE_OFFSET; return USART_SUCCESS; } int usart_init_sync_master(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) { // Reset the USART and shutdown TX and RX. usart_reset(usart); // Check input values. if (!opt || // Null pointer. opt->charlength < 5 || opt->charlength > 9 || opt->paritytype > 7 || opt->stopbits == 1 || opt->stopbits > 2 + 255 || opt->channelmode > 3 || usart_set_sync_master_baudrate(usart, opt->baudrate, pba_hz) == USART_INVALID_INPUT) return USART_INVALID_INPUT; if (opt->charlength == 9) { // Character length set to 9 bits. MODE9 dominates CHRL. usart->mr |= AVR32_USART_MR_MODE9_MASK; } else { // CHRL gives the character length (- 5) when MODE9 = 0. usart->mr |= (opt->charlength - 5) << AVR32_USART_MR_CHRL_OFFSET; } usart->mr |= opt->paritytype << AVR32_USART_MR_PAR_OFFSET | opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET; if (opt->stopbits > USART_2_STOPBITS) { // Set two stop bits usart->mr |= AVR32_USART_MR_NBSTOP_2 << AVR32_USART_MR_NBSTOP_OFFSET; // and a timeguard period gives the rest. usart->ttgr = opt->stopbits - USART_2_STOPBITS; } else // Insert 1 or 2 stop bits. usart->mr |= opt->stopbits << AVR32_USART_MR_NBSTOP_OFFSET; // Set normal mode. usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | AVR32_USART_MR_MODE_NORMAL << AVR32_USART_MR_MODE_OFFSET | AVR32_USART_MR_CLKO_MASK; // Setup complete; enable communication. // Enable input and output. usart->cr = AVR32_USART_CR_RXEN_MASK | AVR32_USART_CR_TXEN_MASK; return USART_SUCCESS; } int usart_init_sync_slave(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) { // Reset the USART and shutdown TX and RX. usart_reset(usart); // Check input values. if (!opt || // Null pointer. opt->charlength < 5 || opt->charlength > 9 || opt->paritytype > 7 || opt->stopbits == 1 || opt->stopbits > 2 + 255 || opt->channelmode > 3 || usart_set_sync_slave_baudrate(usart) == USART_INVALID_INPUT) return USART_INVALID_INPUT; if (opt->charlength == 9) { // Character length set to 9 bits. MODE9 dominates CHRL. usart->mr |= AVR32_USART_MR_MODE9_MASK; } else { // CHRL gives the character length (- 5) when MODE9 = 0. usart->mr |= (opt->charlength - 5) << AVR32_USART_MR_CHRL_OFFSET; } usart->mr |= opt->paritytype << AVR32_USART_MR_PAR_OFFSET | opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET; if (opt->stopbits > USART_2_STOPBITS) { // Set two stop bits usart->mr |= AVR32_USART_MR_NBSTOP_2 << AVR32_USART_MR_NBSTOP_OFFSET; // and a timeguard period gives the rest. usart->ttgr = opt->stopbits - USART_2_STOPBITS; } else // Insert 1 or 2 stop bits. usart->mr |= opt->stopbits << AVR32_USART_MR_NBSTOP_OFFSET; // Set normal mode. usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | AVR32_USART_MR_MODE_NORMAL << AVR32_USART_MR_MODE_OFFSET; // Setup complete; enable communication. // Enable input and output. usart->cr = AVR32_USART_CR_RXEN_MASK | AVR32_USART_CR_TXEN_MASK; return USART_SUCCESS; } int usart_init_rs485(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) { // First: Setup standard RS232. if (usart_init_rs232(usart, opt, pba_hz) == USART_INVALID_INPUT) return USART_INVALID_INPUT; // Set RS485 mode. usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | AVR32_USART_MR_MODE_RS485 << AVR32_USART_MR_MODE_OFFSET; return USART_SUCCESS; } int usart_init_IrDA(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz, unsigned char irda_filter) { // First: Setup standard RS232. if (usart_init_rs232(usart, opt, pba_hz) == USART_INVALID_INPUT) return USART_INVALID_INPUT; // Set IrDA filter. usart->ifr = irda_filter; // Set IrDA mode and activate filtering of input. usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | AVR32_USART_MODE_IRDA << AVR32_USART_MR_MODE_OFFSET | AVR32_USART_MR_FILTER_MASK; return USART_SUCCESS; } int usart_init_iso7816(volatile avr32_usart_t *usart, const usart_iso7816_options_t *opt, int t, long pba_hz) { // Reset the USART and shutdown TX and RX. usart_reset(usart); // Check input values. if (!opt || // Null pointer. opt->paritytype > 1) return USART_INVALID_INPUT; if (t == 0) { // Set USART mode to ISO7816, T=0. // The T=0 protocol always uses 2 stop bits. usart->mr = AVR32_USART_MR_MODE_ISO7816_T0 << AVR32_USART_MR_MODE_OFFSET | AVR32_USART_MR_NBSTOP_2 << AVR32_USART_MR_NBSTOP_OFFSET | opt->bit_order << AVR32_USART_MR_MSBF_OFFSET; // Allow MSBF in T=0. } else if (t == 1) { // Only LSB first in the T=1 protocol. // max_iterations field is only used in T=0 mode. if (opt->bit_order != 0 || opt->max_iterations != 0) return USART_INVALID_INPUT; // Set USART mode to ISO7816, T=1. // The T=1 protocol always uses 1 stop bit. usart->mr = AVR32_USART_MR_MODE_ISO7816_T1 << AVR32_USART_MR_MODE_OFFSET | AVR32_USART_MR_NBSTOP_1 << AVR32_USART_MR_NBSTOP_OFFSET; } else return USART_INVALID_INPUT; if (usart_set_iso7816_clock(usart, opt->iso7816_hz, pba_hz) == USART_INVALID_INPUT) return USART_INVALID_INPUT; // Set FIDI register: bit rate = selected clock/FI_DI_ratio/16. usart->fidi = opt->fidi_ratio; // Set ISO7816 spesific options in the MODE register. usart->mr |= opt->paritytype << AVR32_USART_MR_PAR_OFFSET | AVR32_USART_MR_CLKO_MASK | // Enable clock output. opt->inhibit_nack << AVR32_USART_MR_INACK_OFFSET | opt->dis_suc_nack << AVR32_USART_MR_DSNACK_OFFSET | opt->max_iterations << AVR32_USART_MR_MAX_ITERATION_OFFSET; // Setup complete; enable the receiver by default. usart_iso7816_enable_receiver(usart); return USART_SUCCESS; } #if defined(AVR32_USART_400_H_INCLUDED) || \ defined(AVR32_USART_410_H_INCLUDED) || \ defined(AVR32_USART_420_H_INCLUDED) || \ defined(AVR32_USART_440_H_INCLUDED) || \ defined(AVR32_USART_602_H_INCLUDED) int usart_init_lin_master(volatile avr32_usart_t *usart, unsigned long baudrate, long pba_hz) { // Reset the USART and shutdown TX and RX. usart_reset(usart); // Check input values. if (usart_set_async_baudrate(usart, baudrate, pba_hz) == USART_INVALID_INPUT) return USART_INVALID_INPUT; usart->mr |= AVR32_USART_MR_MODE_LIN_MASTER << AVR32_USART_MR_MODE_OFFSET; // LIN master mode. // Setup complete; enable communication. // Enable input and output. usart->cr = AVR32_USART_CR_RXEN_MASK | AVR32_USART_CR_TXEN_MASK; return USART_SUCCESS; } int usart_init_lin_slave(volatile avr32_usart_t *usart, unsigned long baudrate, long pba_hz) { // Reset the USART and shutdown TX and RX. usart_reset(usart); // Check input values. if (usart_set_async_baudrate(usart, baudrate, pba_hz) == USART_INVALID_INPUT) return USART_INVALID_INPUT; usart->mr |= AVR32_USART_MR_MODE_LIN_SLAVE << AVR32_USART_MR_MODE_OFFSET; // LIN slave mode. // Setup complete; enable communication. // Enable input and output. usart->cr = AVR32_USART_CR_RXEN_MASK | AVR32_USART_CR_TXEN_MASK; return USART_SUCCESS; } int usart_init_spi_master(volatile avr32_usart_t *usart, const usart_spi_options_t *opt, long pba_hz) { // Reset the USART and shutdown TX and RX. usart_reset(usart); // Check input values. if (!opt || // Null pointer. opt->charlength < 5 || opt->charlength > 9 || opt->spimode > 3 || opt->channelmode > 3 || usart_set_spi_master_baudrate(usart, opt->baudrate, pba_hz) == USART_INVALID_INPUT) return USART_INVALID_INPUT; if (opt->charlength == 9) { // Character length set to 9 bits. MODE9 dominates CHRL. usart->mr |= AVR32_USART_MR_MODE9_MASK; } else { // CHRL gives the character length (- 5) when MODE9 = 0. usart->mr |= (opt->charlength - 5) << AVR32_USART_MR_CHRL_OFFSET; } usart->mr |= AVR32_USART_MR_MODE_SPI_MASTER << AVR32_USART_MR_MODE_OFFSET | // SPI master mode. ((opt->spimode & 0x1) ^ 0x1) << AVR32_USART_MR_SYNC_OFFSET | // SPI clock phase. opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET | // Channel mode. (opt->spimode >> 1) << AVR32_USART_MR_MSBF_OFFSET | // SPI clock polarity. AVR32_USART_MR_CLKO_MASK; // Drive SCK pin. // Setup complete; enable communication. // Enable input and output. usart->cr = AVR32_USART_CR_RXEN_MASK | AVR32_USART_CR_TXEN_MASK; return USART_SUCCESS; } int usart_init_spi_slave(volatile avr32_usart_t *usart, const usart_spi_options_t *opt, long pba_hz) { // Reset the USART and shutdown TX and RX. usart_reset(usart); // Check input values. if (!opt || // Null pointer. opt->charlength < 5 || opt->charlength > 9 || opt->spimode > 3 || opt->channelmode > 3 || usart_set_spi_slave_baudrate(usart) == USART_INVALID_INPUT) return USART_INVALID_INPUT; if (opt->charlength == 9) { // Character length set to 9 bits. MODE9 dominates CHRL. usart->mr |= AVR32_USART_MR_MODE9_MASK; } else { // CHRL gives the character length (- 5) when MODE9 = 0. usart->mr |= (opt->charlength - 5) << AVR32_USART_MR_CHRL_OFFSET; } usart->mr |= AVR32_USART_MR_MODE_SPI_SLAVE << AVR32_USART_MR_MODE_OFFSET | // SPI slave mode. ((opt->spimode & 0x1) ^ 0x1) << AVR32_USART_MR_SYNC_OFFSET | // SPI clock phase. opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET | // Channel mode. (opt->spimode >> 1) << AVR32_USART_MR_MSBF_OFFSET; // SPI clock polarity. // Setup complete; enable communication. // Enable input and output. usart->cr = AVR32_USART_CR_RXEN_MASK | AVR32_USART_CR_TXEN_MASK; return USART_SUCCESS; } #endif // USART rev. >= 4.0.0 //! @} //------------------------------------------------------------------------------ #if defined(AVR32_USART_400_H_INCLUDED) || \ defined(AVR32_USART_410_H_INCLUDED) || \ defined(AVR32_USART_420_H_INCLUDED) || \ defined(AVR32_USART_440_H_INCLUDED) || \ defined(AVR32_USART_602_H_INCLUDED) /*! \name SPI Control Functions */ //! @{ int usart_spi_selectChip(volatile avr32_usart_t *usart) { // Force the SPI chip select. usart->cr = AVR32_USART_CR_RTSEN_MASK; return USART_SUCCESS; } int usart_spi_unselectChip(volatile avr32_usart_t *usart) { int timeout = USART_DEFAULT_TIMEOUT; do { if (!timeout--) return USART_FAILURE; } while (!usart_tx_empty(usart)); // Release the SPI chip select. usart->cr = AVR32_USART_CR_RTSDIS_MASK; return USART_SUCCESS; } //! @} #endif // USART rev. >= 4.0.0 //------------------------------------------------------------------------------ /*! \name Transmit/Receive Functions */ //! @{ int usart_send_address(volatile avr32_usart_t *usart, int address) { // Check if USART is in multidrop / RS485 mode. if (!usart_mode_is_multidrop(usart)) return USART_MODE_FAULT; // Prepare to send an address. usart->cr = AVR32_USART_CR_SENDA_MASK; // Write the address to TX. usart_bw_write_char(usart, address); return USART_SUCCESS; } int usart_write_char(volatile avr32_usart_t *usart, int c) { if (usart_tx_ready(usart)) { usart->thr = (c << AVR32_USART_THR_TXCHR_OFFSET) & AVR32_USART_THR_TXCHR_MASK; return USART_SUCCESS; } else return USART_TX_BUSY; } int usart_putchar(volatile avr32_usart_t *usart, int c) { int timeout = USART_DEFAULT_TIMEOUT; if (c == '\n') { do { if (!timeout--) return USART_FAILURE; } while (usart_write_char(usart, '\r') != USART_SUCCESS); timeout = USART_DEFAULT_TIMEOUT; } do { if (!timeout--) return USART_FAILURE; } while (usart_write_char(usart, c) != USART_SUCCESS); return USART_SUCCESS; } int usart_read_char(volatile avr32_usart_t *usart, int *c) { // Check for errors: frame, parity and overrun. In RS485 mode, a parity error // would mean that an address char has been received. if (usart->csr & (AVR32_USART_CSR_OVRE_MASK | AVR32_USART_CSR_FRAME_MASK | AVR32_USART_CSR_PARE_MASK)) return USART_RX_ERROR; // No error; if we really did receive a char, read it and return SUCCESS. if (usart_test_hit(usart)) { *c = (usart->rhr & AVR32_USART_RHR_RXCHR_MASK) >> AVR32_USART_RHR_RXCHR_OFFSET; return USART_SUCCESS; } else return USART_RX_EMPTY; } int usart_getchar(volatile avr32_usart_t *usart) { int c, ret; while ((ret = usart_read_char(usart, &c)) == USART_RX_EMPTY); if (ret == USART_RX_ERROR) return USART_FAILURE; return c; } void usart_write_line(volatile avr32_usart_t *usart, const char *string) { while (*string != '\0') usart_putchar(usart, *string++); } int usart_get_echo_line(volatile avr32_usart_t *usart) { int rx_char; int retval = USART_SUCCESS; while (1) { rx_char = usart_getchar(usart); if (rx_char == USART_FAILURE) { usart_write_line(usart, "Error!!!\n"); retval = USART_FAILURE; break; } if (rx_char == '\x03') { retval = USART_FAILURE; break; } usart_putchar(usart, rx_char); if (rx_char == '\r') { usart_putchar(usart, '\n'); break; } } return retval; } //! @} ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/USART/usart.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief USART driver for AVR32 UC3. * * This file contains basic functions for the AVR32 USART, with support for all * modes, settings and clock speeds. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a USART module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _USART_H_ #define _USART_H_ #include #include "compiler.h" /*! \name Return Values */ //! @{ #define USART_SUCCESS 0 //!< Successful completion. #define USART_FAILURE -1 //!< Failure because of some unspecified reason. #define USART_INVALID_INPUT 1 //!< Input value out of range. #define USART_INVALID_ARGUMENT -1 //!< Argument value out of range. #define USART_TX_BUSY 2 //!< Transmitter was busy. #define USART_RX_EMPTY 3 //!< Nothing was received. #define USART_RX_ERROR 4 //!< Transmission error occurred. #define USART_MODE_FAULT 5 //!< USART not in the appropriate mode. //! @} //! Default time-out value (number of attempts). #define USART_DEFAULT_TIMEOUT 10000 /*! \name Parity Settings */ //! @{ #define USART_EVEN_PARITY AVR32_USART_MR_PAR_EVEN //!< Use even parity on character transmission. #define USART_ODD_PARITY AVR32_USART_MR_PAR_ODD //!< Use odd parity on character transmission. #define USART_SPACE_PARITY AVR32_USART_MR_PAR_SPACE //!< Use a space as parity bit. #define USART_MARK_PARITY AVR32_USART_MR_PAR_MARK //!< Use a mark as parity bit. #define USART_NO_PARITY AVR32_USART_MR_PAR_NONE //!< Don't use a parity bit. #define USART_MULTIDROP_PARITY AVR32_USART_MR_PAR_MULTI //!< Parity bit is used to flag address characters. //! @} /*! \name Stop Bits Settings */ //! @{ #define USART_1_STOPBIT AVR32_USART_MR_NBSTOP_1 //!< Use 1 stop bit. #define USART_1_5_STOPBITS AVR32_USART_MR_NBSTOP_1_5 //!< Use 1.5 stop bits. #define USART_2_STOPBITS AVR32_USART_MR_NBSTOP_2 //!< Use 2 stop bits (for more, just give the number of bits). //! @} /*! \name Channel Modes */ //! @{ #define USART_NORMAL_CHMODE AVR32_USART_MR_CHMODE_NORMAL //!< Normal communication. #define USART_AUTO_ECHO AVR32_USART_MR_CHMODE_ECHO //!< Echo data. #define USART_LOCAL_LOOPBACK AVR32_USART_MR_CHMODE_LOCAL_LOOP //!< Local loopback. #define USART_REMOTE_LOOPBACK AVR32_USART_MR_CHMODE_REMOTE_LOOP //!< Remote loopback. //! @} #if defined(AVR32_USART_400_H_INCLUDED) || \ defined(AVR32_USART_410_H_INCLUDED) || \ defined(AVR32_USART_420_H_INCLUDED) || \ defined(AVR32_USART_440_H_INCLUDED) || \ defined(AVR32_USART_602_H_INCLUDED) /*! \name LIN Node Actions */ //! @{ #define USART_LIN_PUBLISH_ACTION AVR32_USART_LINMR_NACT_PUBLISH //!< The USART transmits the response. #define USART_LIN_SUBSCRIBE_ACTION AVR32_USART_LINMR_NACT_SUBSCRIBE //!< The USART receives the response. #define USART_LIN_IGNORE_ACTION AVR32_USART_LINMR_NACT_IGNORE //!< The USART does not transmit and does not receive the reponse. //! @} /*! \name LIN Checksum Types */ //! @{ #define USART_LIN_ENHANCED_CHECKSUM 0 //!< LIN 2.0 "enhanced" checksum. #define USART_LIN_CLASSIC_CHECKSUM 1 //!< LIN 1.3 "classic" checksum. //! @} #endif // USART rev. >= 4.0.0 //! Input parameters when initializing RS232 and similar modes. typedef struct { //! Set baud rate of the USART (unused in slave modes). unsigned long baudrate; //! Number of bits to transmit as a character (5 to 9). unsigned char charlength; //! How to calculate the parity bit: \ref USART_EVEN_PARITY, \ref USART_ODD_PARITY, //! \ref USART_SPACE_PARITY, \ref USART_MARK_PARITY, \ref USART_NO_PARITY or //! \ref USART_MULTIDROP_PARITY. unsigned char paritytype; //! Number of stop bits between two characters: \ref USART_1_STOPBIT, //! \ref USART_1_5_STOPBITS, \ref USART_2_STOPBITS or any number from 3 to 257 //! which will result in a time guard period of that length between characters. //! \note \ref USART_1_5_STOPBITS is supported in asynchronous modes only. unsigned short stopbits; //! Run the channel in testmode: \ref USART_NORMAL_CHMODE, \ref USART_AUTO_ECHO, //! \ref USART_LOCAL_LOOPBACK or \ref USART_REMOTE_LOOPBACK. unsigned char channelmode; } usart_options_t; //! Input parameters when initializing ISO7816 mode. typedef struct { //! Set the frequency of the ISO7816 clock. unsigned long iso7816_hz; //! The number of ISO7816 clock ticks in every bit period (1 to 2047, 0 = disable clock). //! Bit rate = \ref iso7816_hz / \ref fidi_ratio. unsigned short fidi_ratio; //! How to calculate the parity bit: \ref USART_EVEN_PARITY for normal mode or //! \ref USART_ODD_PARITY for inverse mode. unsigned char paritytype; //! Inhibit Non Acknowledge:\n //! - 0: the NACK is generated;\n //! - 1: the NACK is not generated. //! //! \note This bit will be used only in ISO7816 mode, protocol T = 0 receiver. int inhibit_nack; //! Disable successive NACKs. //! Successive parity errors are counted up to the value in the \ref max_iterations field. //! These parity errors generate a NACK on the ISO line. As soon as this value is reached, //! no addititional NACK is sent on the ISO line. The ITERATION flag is asserted. int dis_suc_nack; //! Max number of repetitions (0 to 7). unsigned char max_iterations; //! Bit order in transmitted characters:\n //! - 0: LSB first;\n //! - 1: MSB first. int bit_order; } usart_iso7816_options_t; #if defined(AVR32_USART_400_H_INCLUDED) || \ defined(AVR32_USART_410_H_INCLUDED) || \ defined(AVR32_USART_420_H_INCLUDED) || \ defined(AVR32_USART_440_H_INCLUDED) || \ defined(AVR32_USART_602_H_INCLUDED) //! Input parameters when initializing SPI mode. typedef struct { //! Set the frequency of the SPI clock (unused in slave mode). unsigned long baudrate; //! Number of bits to transmit as a character (5 to 9). unsigned char charlength; //! Which SPI mode to use. unsigned char spimode; //! Run the channel in testmode: \ref USART_NORMAL_CHMODE, \ref USART_AUTO_ECHO, //! \ref USART_LOCAL_LOOPBACK or \ref USART_REMOTE_LOOPBACK. unsigned char channelmode; } usart_spi_options_t; #endif // USART rev. >= 4.0.0 //------------------------------------------------------------------------------ /*! \name Initialization Functions */ //! @{ /*! \brief Resets the USART and disables TX and RX. * * \param usart Base address of the USART instance. */ extern void usart_reset(volatile avr32_usart_t *usart); /*! \brief Sets up the USART to use the standard RS232 protocol. * * \param usart Base address of the USART instance. * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS Mode successfully initialized. * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. */ extern int usart_init_rs232(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); /*! \brief Sets up the USART to use the standard RS232 protocol in TX-only mode. * * Compared to \ref usart_init_rs232, this function allows very high baud rates * (up to \a pba_hz instead of \a pba_hz / \c 8) at the expense of full duplex. * * \param usart Base address of the USART instance. * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS Mode successfully initialized. * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. * * \note The \c 1.5 stop bit is not supported in this mode. */ extern int usart_init_rs232_tx_only(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); /*! \brief Sets up the USART to use hardware handshaking. * * \param usart Base address of the USART instance. * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS Mode successfully initialized. * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. * * \note \ref usart_init_rs232 does not need to be invoked before this function. */ extern int usart_init_hw_handshaking(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); /*! \brief Sets up the USART to use the modem protocol, activating dedicated inputs/outputs. * * \param usart Base address of the USART instance. * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS Mode successfully initialized. * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. */ extern int usart_init_modem(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); /*! \brief Sets up the USART to use a synchronous RS232-like protocol in master mode. * * \param usart Base address of the USART instance. * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS Mode successfully initialized. * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. */ extern int usart_init_sync_master(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); /*! \brief Sets up the USART to use a synchronous RS232-like protocol in slave mode. * * \param usart Base address of the USART instance. * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS Mode successfully initialized. * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. */ extern int usart_init_sync_slave(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); /*! \brief Sets up the USART to use the RS485 protocol. * * \param usart Base address of the USART instance. * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS Mode successfully initialized. * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. */ extern int usart_init_rs485(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); /*! \brief Sets up the USART to use the IrDA protocol. * * \param usart Base address of the USART instance. * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). * \param pba_hz USART module input clock frequency (PBA clock, Hz). * \param irda_filter Counter used to distinguish received ones from zeros. * * \retval USART_SUCCESS Mode successfully initialized. * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. */ extern int usart_init_IrDA(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz, unsigned char irda_filter); /*! \brief Sets up the USART to use the ISO7816 T=0 or T=1 smartcard protocols. * * The receiver is enabled by default. \ref usart_iso7816_enable_receiver and * \ref usart_iso7816_enable_transmitter can be called to change the half-duplex * communication direction. * * \param usart Base address of the USART instance. * \param opt Options needed to set up ISO7816 communication (see \ref usart_iso7816_options_t). * \param t ISO7816 mode to use (T=0 or T=1). * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS Mode successfully initialized. * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. */ extern int usart_init_iso7816(volatile avr32_usart_t *usart, const usart_iso7816_options_t *opt, int t, long pba_hz); #if defined(AVR32_USART_400_H_INCLUDED) || \ defined(AVR32_USART_410_H_INCLUDED) || \ defined(AVR32_USART_420_H_INCLUDED) || \ defined(AVR32_USART_440_H_INCLUDED) || \ defined(AVR32_USART_602_H_INCLUDED) /*! \brief Sets up the USART to use the LIN master mode. * * \param usart Base address of the USART instance. * \param baudrate Baud rate. * \param pba_hz USART module input clock frequency (PBA clock, Hz). * */ extern int usart_init_lin_master(volatile avr32_usart_t *usart, unsigned long baudrate, long pba_hz); /*! \brief Sets up the USART to use the LIN slave mode. * * \param usart Base address of the USART instance. * \param baudrate Baud rate. * \param pba_hz USART module input clock frequency (PBA clock, Hz). * */ extern int usart_init_lin_slave(volatile avr32_usart_t *usart, unsigned long baudrate, long pba_hz); /*! \brief Sets up the USART to use the SPI master mode. * * \ref usart_spi_selectChip and \ref usart_spi_unselectChip can be called to * select or unselect the SPI slave chip. * * \param usart Base address of the USART instance. * \param opt Options needed to set up SPI mode (see \ref usart_spi_options_t). * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS Mode successfully initialized. * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. */ extern int usart_init_spi_master(volatile avr32_usart_t *usart, const usart_spi_options_t *opt, long pba_hz); /*! \brief Sets up the USART to use the SPI slave mode. * * \param usart Base address of the USART instance. * \param opt Options needed to set up SPI mode (see \ref usart_spi_options_t). * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS Mode successfully initialized. * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. */ extern int usart_init_spi_slave(volatile avr32_usart_t *usart, const usart_spi_options_t *opt, long pba_hz); #endif // USART rev. >= 4.0.0 //! @} //------------------------------------------------------------------------------ /*! \name Read and Reset Error Status Bits */ //! @{ /*! \brief Resets the error status. * * This function resets the status bits indicating that a parity error, * framing error or overrun has occurred. The RXBRK bit, indicating * a start/end of break condition on the RX line, is also reset. * * \param usart Base address of the USART instance. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void usart_reset_status(volatile avr32_usart_t *usart) { usart->cr = AVR32_USART_CR_RSTSTA_MASK; } /*! \brief Checks if a parity error has occurred since last status reset. * * \param usart Base address of the USART instance. * * \return \c 1 if a parity error has been detected, otherwise \c 0. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ int usart_parity_error(volatile avr32_usart_t *usart) { return (usart->csr & AVR32_USART_CSR_PARE_MASK) != 0; } /*! \brief Checks if a framing error has occurred since last status reset. * * \param usart Base address of the USART instance. * * \return \c 1 if a framing error has been detected, otherwise \c 0. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ int usart_framing_error(volatile avr32_usart_t *usart) { return (usart->csr & AVR32_USART_CSR_FRAME_MASK) != 0; } /*! \brief Checks if an overrun error has occurred since last status reset. * * \param usart Base address of the USART instance. * * \return \c 1 if a overrun error has been detected, otherwise \c 0. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ int usart_overrun_error(volatile avr32_usart_t *usart) { return (usart->csr & AVR32_USART_CSR_OVRE_MASK) != 0; } #if defined(AVR32_USART_400_H_INCLUDED) || \ defined(AVR32_USART_410_H_INCLUDED) || \ defined(AVR32_USART_420_H_INCLUDED) || \ defined(AVR32_USART_440_H_INCLUDED) || \ defined(AVR32_USART_602_H_INCLUDED) /*! \brief Get LIN Error Status * * \param usart Base address of the USART instance. * * \retval The binary value of the error field. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ int usart_lin_get_error(volatile avr32_usart_t *usart) { return (usart->csr & (AVR32_USART_CSR_LINSNRE_MASK | AVR32_USART_CSR_LINCE_MASK | AVR32_USART_CSR_LINIPE_MASK | AVR32_USART_CSR_LINISFE_MASK | AVR32_USART_CSR_LINBE_MASK)) >> AVR32_USART_CSR_LINBE_OFFSET; } #endif // USART rev. >= 4.0.0 //! @} //------------------------------------------------------------------------------ /*! \name ISO7816 Control Functions */ //! @{ /*! \brief Enables the ISO7816 receiver. * * The ISO7816 transmitter is disabled. * * \param usart Base address of the USART instance. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void usart_iso7816_enable_receiver(volatile avr32_usart_t *usart) { usart->cr = AVR32_USART_CR_TXDIS_MASK | AVR32_USART_CR_RXEN_MASK; } /*! \brief Enables the ISO7816 transmitter. * * The ISO7816 receiver is disabled. * * \param usart Base address of the USART instance. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void usart_iso7816_enable_transmitter(volatile avr32_usart_t *usart) { usart->cr = AVR32_USART_CR_RXDIS_MASK | AVR32_USART_CR_TXEN_MASK; } //! @} //------------------------------------------------------------------------------ #if defined(AVR32_USART_400_H_INCLUDED) || \ defined(AVR32_USART_410_H_INCLUDED) || \ defined(AVR32_USART_420_H_INCLUDED) || \ defined(AVR32_USART_440_H_INCLUDED) || \ defined(AVR32_USART_602_H_INCLUDED) /*! \name LIN Control Functions */ //! @{ /*! \brief Sets the node action. * * \param usart Base address of the USART instance. * \param action The node action: \ref USART_LIN_PUBLISH_ACTION, * \ref USART_LIN_SUBSCRIBE_ACTION or * \ref USART_LIN_IGNORE_ACTION. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void usart_lin_set_node_action(volatile avr32_usart_t *usart, unsigned char action) { usart->linmr = (usart->linmr & ~AVR32_USART_LINMR_NACT_MASK) | action << AVR32_USART_LINMR_NACT_OFFSET; } /*! \brief Enables or disables the Identifier parity. * * \param usart Base address of the USART instance. * \param parity Whether to enable the Identifier parity: \c TRUE or \c FALSE. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void usart_lin_enable_parity(volatile avr32_usart_t *usart, unsigned char parity) { usart->linmr = (usart->linmr & ~AVR32_USART_LINMR_PARDIS_MASK) | !parity << AVR32_USART_LINMR_PARDIS_OFFSET; } /*! \brief Enables or disables the checksum. * * \param usart Base address of the USART instance. * \param parity Whether to enable the checksum: \c TRUE or \c FALSE. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void usart_lin_enable_checksum(volatile avr32_usart_t *usart, unsigned char checksum) { usart->linmr = (usart->linmr & ~AVR32_USART_LINMR_CHKDIS_MASK) | !checksum << AVR32_USART_LINMR_CHKDIS_OFFSET; } /*! \brief Sets the checksum type. * * \param usart Base address of the USART instance. * \param chktyp The checksum type: \ref USART_LIN_ENHANCED_CHEKSUM or * \ref USART_LIN_CLASSIC_CHECKSUM. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void usart_lin_set_checksum(volatile avr32_usart_t *usart, unsigned char chktyp) { usart->linmr = (usart->linmr & ~AVR32_USART_LINMR_CHKTYP_MASK) | chktyp << AVR32_USART_LINMR_CHKTYP_OFFSET; } /*! \brief Gets the response data length. * * \param usart Base address of the USART instance. * * \return The response data length. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ unsigned char usart_lin_get_data_length(volatile avr32_usart_t *usart) { if (usart->linmr & AVR32_USART_LINMR_DLM_MASK) { unsigned char data_length = 1 << ((usart->linir >> (AVR32_USART_LINIR_IDCHR_OFFSET + 4)) & 0x03); if (data_length == 1) data_length = 2; return data_length; } else return ((usart->linmr & AVR32_USART_LINMR_DLC_MASK) >> AVR32_USART_LINMR_DLC_OFFSET) + 1; } /*! \brief Sets the response data length for LIN 1.x. * * \param usart Base address of the USART instance. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void usart_lin_set_data_length_lin1x(volatile avr32_usart_t *usart) { usart->linmr |= AVR32_USART_LINMR_DLM_MASK; } /*! \brief Sets the response data length for LIN 2.x. * * \param usart Base address of the USART instance. * \param data_length The response data length. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void usart_lin_set_data_length_lin2x(volatile avr32_usart_t *usart, unsigned char data_length) { usart->linmr = (usart->linmr & ~(AVR32_USART_LINMR_DLC_MASK | AVR32_USART_LINMR_DLM_MASK)) | (data_length - 1) << AVR32_USART_LINMR_DLC_OFFSET; } /*! \brief Enables or disables the frame slot mode. * * \param usart Base address of the USART instance. * \param frameslot Whether to enable the frame slot mode: \c TRUE or * \c FALSE. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void usart_lin_enable_frameslot(volatile avr32_usart_t *usart, unsigned char frameslot) { usart->linmr = (usart->linmr & ~AVR32_USART_LINMR_FSDIS_MASK) | !frameslot << AVR32_USART_LINMR_FSDIS_OFFSET; } /*! \brief Gets the Identifier character. * * \param usart Base address of the USART instance. * * \return The Identifier character. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ unsigned char usart_lin_get_id_char(volatile avr32_usart_t *usart) { return (usart->linir & AVR32_USART_LINIR_IDCHR_MASK) >> AVR32_USART_LINIR_IDCHR_OFFSET; } /*! \brief Sets the Identifier character. * * \param usart Base address of the USART instance. * \param id_char The Identifier character. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void usart_lin_set_id_char(volatile avr32_usart_t *usart, unsigned char id_char) { usart->linir = (usart->linir & ~AVR32_USART_LINIR_IDCHR_MASK) | id_char << AVR32_USART_LINIR_IDCHR_OFFSET; } //! @} #endif // USART rev. >= 4.0.0 //------------------------------------------------------------------------------ #if defined(AVR32_USART_400_H_INCLUDED) || \ defined(AVR32_USART_410_H_INCLUDED) || \ defined(AVR32_USART_420_H_INCLUDED) || \ defined(AVR32_USART_440_H_INCLUDED) || \ defined(AVR32_USART_602_H_INCLUDED) /*! \name SPI Control Functions */ //! @{ /*! \brief Selects SPI slave chip. * * \param usart Base address of the USART instance. * * \retval USART_SUCCESS Success. */ extern int usart_spi_selectChip(volatile avr32_usart_t *usart); /*! \brief Unselects SPI slave chip. * * \param usart Base address of the USART instance. * * \retval USART_SUCCESS Success. * \retval USART_FAILURE Time-out. */ extern int usart_spi_unselectChip(volatile avr32_usart_t *usart); //! @} #endif // USART rev. >= 4.0.0 //------------------------------------------------------------------------------ /*! \name Transmit/Receive Functions */ //! @{ /*! \brief Addresses a receiver. * * While in RS485 mode, receivers only accept data addressed to them. * A packet/char with the address tag set has to precede any data. * This function is used to address a receiver. This receiver should read * all the following data, until an address packet addresses another receiver. * * \param usart Base address of the USART instance. * \param address Address of the target device. * * \retval USART_SUCCESS Address successfully sent (if current mode is RS485). * \retval USART_MODE_FAULT Wrong operating mode. */ extern int usart_send_address(volatile avr32_usart_t *usart, int address); /*! \brief Tests if the USART is ready to transmit a character. * * \param usart Base address of the USART instance. * * \return \c 1 if the USART Transmit Holding Register is free, otherwise \c 0. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ int usart_tx_ready(volatile avr32_usart_t *usart) { return (usart->csr & AVR32_USART_CSR_TXRDY_MASK) != 0; } /*! \brief Writes the given character to the TX buffer if the transmitter is ready. * * \param usart Base address of the USART instance. * \param c The character (up to 9 bits) to transmit. * * \retval USART_SUCCESS The transmitter was ready. * \retval USART_TX_BUSY The transmitter was busy. */ extern int usart_write_char(volatile avr32_usart_t *usart, int c); /*! \brief An active wait writing a character to the USART. * * \param usart Base address of the USART instance. * \param c The character (up to 9 bits) to transmit. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void usart_bw_write_char(volatile avr32_usart_t *usart, int c) { while (usart_write_char(usart, c) != USART_SUCCESS); } /*! \brief Sends a character with the USART. * * \param usart Base address of the USART instance. * \param c Character to write. * * \retval USART_SUCCESS The character was written. * \retval USART_FAILURE The function timed out before the USART transmitter became ready to send. */ extern int usart_putchar(volatile avr32_usart_t *usart, int c); /*! \brief Tests if all requested USART transmissions are over. * * \param usart Base address of the USART instance. * * \return \c 1 if the USART Transmit Shift Register and the USART Transmit * Holding Register are free, otherwise \c 0. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ int usart_tx_empty(volatile avr32_usart_t *usart) { return (usart->csr & AVR32_USART_CSR_TXEMPTY_MASK) != 0; } /*! \brief Tests if the USART contains a received character. * * \param usart Base address of the USART instance. * * \return \c 1 if the USART Receive Holding Register is full, otherwise \c 0. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ int usart_test_hit(volatile avr32_usart_t *usart) { return (usart->csr & AVR32_USART_CSR_RXRDY_MASK) != 0; } /*! \brief Checks the RX buffer for a received character, and stores it at the * given memory location. * * \param usart Base address of the USART instance. * \param c Pointer to the where the read character should be stored * (must be at least short in order to accept 9-bit characters). * * \retval USART_SUCCESS The character was read successfully. * \retval USART_RX_EMPTY The RX buffer was empty. * \retval USART_RX_ERROR An error was deteceted. */ extern int usart_read_char(volatile avr32_usart_t *usart, int *c); /*! \brief Waits until a character is received, and returns it. * * \param usart Base address of the USART instance. * * \return The received character, or \ref USART_FAILURE upon error. */ extern int usart_getchar(volatile avr32_usart_t *usart); /*! \brief Writes one character string to the USART. * * \param usart Base address of the USART instance. * \param string String to be written. */ extern void usart_write_line(volatile avr32_usart_t *usart, const char *string); /*! \brief Gets and echoes characters until end of line. * * \param usart Base address of the USART instance. * * \retval USART_SUCCESS Success. * \retval USART_FAILURE Low-level error detected or ETX character received. */ extern int usart_get_echo_line(volatile avr32_usart_t *usart); #if defined(AVR32_USART_400_H_INCLUDED) || \ defined(AVR32_USART_410_H_INCLUDED) || \ defined(AVR32_USART_420_H_INCLUDED) || \ defined(AVR32_USART_440_H_INCLUDED) || \ defined(AVR32_USART_602_H_INCLUDED) /*! \brief Abort LIN transmission. * * \param usart Base address of the USART instance. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void usart_lin_abort(volatile avr32_usart_t *usart) { usart->cr = AVR32_USART_LINABT_MASK; } /*! \brief Tests if a LIN transfer has been completed. * * \param usart Base address of the USART instance. * * \return \c 1 if a LIN transfer has been completed, otherwise \c 0. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ int usart_lin_transfer_completed(volatile avr32_usart_t *usart) { return (usart->csr & AVR32_USART_CSR_LINTC_MASK) != 0; } #endif // USART rev. >= 4.0.0 //! @} #endif // _USART_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/DELAY/delay.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ****************************************************************** * * \brief Management of the delays. * * This file manages the "delays", with or without an OS. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ***************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ //_____ I N C L U D E S ___________________________________________________ #include "delay.h" //_____ M A C R O S ________________________________________________________ //_____ D E F I N I T I O N S ______________________________________________ //! CPU frequency #ifndef FREERTOS_USED static unsigned long s_fcpu_hz; #endif #if (defined NUTOS_USED) extern void NutSleep(unsigned long ms); #endif //_____ D E C L A R A T I O N S ____________________________________________ void delay_init(unsigned long fcpu_hz) { #ifndef FREERTOS_USED s_fcpu_hz = fcpu_hz; #endif } void delay_ms(unsigned long delay) { #if (defined FREERTOS_USED) vTaskDelay( (portTickType)TASK_DELAY_MS(delay) ); #elif (defined NUTOS_USED) NutSleep(delay); #else cpu_delay_ms(delay, s_fcpu_hz); #endif } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/DELAY/delay.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief AT32UC3 delay management header file. * * This file contains definitions and services to handle "delays". * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 AT32UC3 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _DELAY_H_ #define _DELAY_H_ #include "compiler.h" #ifdef FREERTOS_USED # include "FreeRTOS.h" # include "task.h" #else # include "cycle_counter.h" #endif /*! * \brief Initialize the delay driver. * * \param fcpu_hz: CPU frequency in Hz. */ extern void delay_init(unsigned long fcpu_hz); /*! * \brief Waits during at least the specified delay (in millisecond) before returning. * * Note that in the case of FreeRTOS, the function will delay the current task for a given number of ms. * * \param delay: Number of millisecond to wait. */ extern void delay_ms(unsigned long delay); #endif // _DELAY_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/dhcp.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * Dynamic Host Configuration Protocol client * */ /* * * Copyright (c) 2001-2004 Leon Woestenberg * Copyright (c) 2001-2004 Axon Digital Design B.V., The Netherlands. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is a contribution to the lwIP TCP/IP stack. * The Swedish Institute of Computer Science and Adam Dunkels * are specifically granted permission to redistribute this * source code. * * Author: Leon Woestenberg * * This is a DHCP client for the lwIP TCP/IP stack. It aims to conform * with RFC 2131 and RFC 2132. * * TODO: * - Proper parsing of DHCP messages exploiting file/sname field overloading. * - Add JavaDoc style documentation (API, internals). * - Support for interfaces other than Ethernet (SLIP, PPP, ...) * * Please coordinate changes and requests with Leon Woestenberg * * * Integration with your code: * * In lwip/dhcp.h * #define DHCP_COARSE_TIMER_SECS (recommended 60 which is a minute) * #define DHCP_FINE_TIMER_MSECS (recommended 500 which equals TCP coarse timer) * * Then have your application call dhcp_coarse_tmr() and * dhcp_fine_tmr() on the defined intervals. * * dhcp_start(struct netif *netif); * starts a DHCP client instance which configures the interface by * obtaining an IP address lease and maintaining it. * * Use dhcp_release(netif) to end the lease and use dhcp_stop(netif) * to remove the DHCP client. * */ #include "lwip/opt.h" #if LWIP_DHCP /* don't build if not configured for use in lwipopts.h */ #include "lwip/stats.h" #include "lwip/mem.h" #include "lwip/udp.h" #include "lwip/ip_addr.h" #include "lwip/netif.h" #include "lwip/inet.h" #include "lwip/sys.h" #include "lwip/dhcp.h" #include "lwip/autoip.h" #include "lwip/dns.h" #include "netif/etharp.h" #include /** Default for DHCP_GLOBAL_XID is 0xABCD0000 * This can be changed by defining DHCP_GLOBAL_XID and DHCP_GLOBAL_XID_HEADER, e.g. * #define DHCP_GLOBAL_XID_HEADER "stdlib.h" * #define DHCP_GLOBAL_XID rand() */ #ifdef DHCP_GLOBAL_XID_HEADER #include DHCP_GLOBAL_XID_HEADER /* include optional starting XID generation prototypes */ #endif /** DHCP_OPTION_MAX_MSG_SIZE is set to the MTU * MTU is checked to be big enough in dhcp_start */ #define DHCP_MAX_MSG_LEN(netif) (netif->mtu) #define DHCP_MAX_MSG_LEN_MIN_REQUIRED 576 /** Minimum length for reply before packet is parsed */ #define DHCP_MIN_REPLY_LEN 44 #define REBOOT_TRIES 2 /* DHCP client state machine functions */ static void dhcp_handle_ack(struct netif *netif); static void dhcp_handle_nak(struct netif *netif); static void dhcp_handle_offer(struct netif *netif); static err_t dhcp_discover(struct netif *netif); static err_t dhcp_select(struct netif *netif); static void dhcp_bind(struct netif *netif); #if DHCP_DOES_ARP_CHECK static void dhcp_check(struct netif *netif); static err_t dhcp_decline(struct netif *netif); #endif /* DHCP_DOES_ARP_CHECK */ static err_t dhcp_rebind(struct netif *netif); static err_t dhcp_reboot(struct netif *netif); static void dhcp_set_state(struct dhcp *dhcp, u8_t new_state); /* receive, unfold, parse and free incoming messages */ static void dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port); static err_t dhcp_unfold_reply(struct dhcp *dhcp, struct pbuf *p); static u8_t *dhcp_get_option_ptr(struct dhcp *dhcp, u8_t option_type); static u8_t dhcp_get_option_byte(u8_t *ptr); #if 0 static u16_t dhcp_get_option_short(u8_t *ptr); #endif static u32_t dhcp_get_option_long(u8_t *ptr); static void dhcp_free_reply(struct dhcp *dhcp); /* set the DHCP timers */ static void dhcp_timeout(struct netif *netif); static void dhcp_t1_timeout(struct netif *netif); static void dhcp_t2_timeout(struct netif *netif); /* build outgoing messages */ /* create a DHCP request, fill in common headers */ static err_t dhcp_create_request(struct netif *netif); /* free a DHCP request */ static void dhcp_delete_request(struct netif *netif); /* add a DHCP option (type, then length in bytes) */ static void dhcp_option(struct dhcp *dhcp, u8_t option_type, u8_t option_len); /* add option values */ static void dhcp_option_byte(struct dhcp *dhcp, u8_t value); static void dhcp_option_short(struct dhcp *dhcp, u16_t value); static void dhcp_option_long(struct dhcp *dhcp, u32_t value); /* always add the DHCP options trailer to end and pad */ static void dhcp_option_trailer(struct dhcp *dhcp); /** * Back-off the DHCP client (because of a received NAK response). * * Back-off the DHCP client because of a received NAK. Receiving a * NAK means the client asked for something non-sensible, for * example when it tries to renew a lease obtained on another network. * * We clear any existing set IP address and restart DHCP negotiation * afresh (as per RFC2131 3.2.3). * * @param netif the netif under DHCP control */ static void dhcp_handle_nak(struct netif *netif) { struct dhcp *dhcp = netif->dhcp; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_nak(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); /* Set the interface down since the address must no longer be used, as per RFC2131 */ netif_set_down(netif); /* remove IP address from interface */ netif_set_ipaddr(netif, IP_ADDR_ANY); netif_set_gw(netif, IP_ADDR_ANY); netif_set_netmask(netif, IP_ADDR_ANY); /* Change to a defined state */ dhcp_set_state(dhcp, DHCP_BACKING_OFF); /* We can immediately restart discovery */ dhcp_discover(netif); } #if DHCP_DOES_ARP_CHECK /** * Checks if the offered IP address is already in use. * * It does so by sending an ARP request for the offered address and * entering CHECKING state. If no ARP reply is received within a small * interval, the address is assumed to be free for use by us. * * @param netif the netif under DHCP control */ static void dhcp_check(struct netif *netif) { struct dhcp *dhcp = netif->dhcp; err_t result; u16_t msecs; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_check(netif=%p) %c%c\n", (void *)netif, (s16_t)netif->name[0], (s16_t)netif->name[1])); dhcp_set_state(dhcp, DHCP_CHECKING); /* create an ARP query for the offered IP address, expecting that no host responds, as the IP address should not be in use. */ result = etharp_query(netif, &dhcp->offered_ip_addr, NULL); if (result != ERR_OK) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("dhcp_check: could not perform ARP query\n")); } dhcp->tries++; msecs = 500; dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_check(): set request timeout %"U16_F" msecs\n", msecs)); } #endif /* DHCP_DOES_ARP_CHECK */ /** * Remember the configuration offered by a DHCP server. * * @param netif the netif under DHCP control */ static void dhcp_handle_offer(struct netif *netif) { struct dhcp *dhcp = netif->dhcp; /* obtain the server address */ u8_t *option_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_SERVER_ID); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_offer(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); if (option_ptr != NULL) { dhcp->server_ip_addr.addr = htonl(dhcp_get_option_long(&option_ptr[2])); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): server 0x%08"X32_F"\n", dhcp->server_ip_addr.addr)); /* remember offered address */ ip_addr_set(&dhcp->offered_ip_addr, (struct ip_addr *)&dhcp->msg_in->yiaddr); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): offer for 0x%08"X32_F"\n", dhcp->offered_ip_addr.addr)); dhcp_select(netif); } } /** * Select a DHCP server offer out of all offers. * * Simply select the first offer received. * * @param netif the netif under DHCP control * @return lwIP specific error (see error.h) */ static err_t dhcp_select(struct netif *netif) { struct dhcp *dhcp = netif->dhcp; err_t result; u16_t msecs; #if LWIP_NETIF_HOSTNAME const char *p; #endif /* LWIP_NETIF_HOSTNAME */ LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_select(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); dhcp_set_state(dhcp, DHCP_REQUESTING); /* create and initialize the DHCP message header */ result = dhcp_create_request(netif); if (result == ERR_OK) { dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN); dhcp_option_byte(dhcp, DHCP_REQUEST); dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif)); /* MUST request the offered IP address */ dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4); dhcp_option_long(dhcp, ntohl(dhcp->offered_ip_addr.addr)); dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4); dhcp_option_long(dhcp, ntohl(dhcp->server_ip_addr.addr)); dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, 4/*num options*/); dhcp_option_byte(dhcp, DHCP_OPTION_SUBNET_MASK); dhcp_option_byte(dhcp, DHCP_OPTION_ROUTER); dhcp_option_byte(dhcp, DHCP_OPTION_BROADCAST); dhcp_option_byte(dhcp, DHCP_OPTION_DNS_SERVER); #if LWIP_NETIF_HOSTNAME p = (const char*)netif->hostname; if (p != NULL) { dhcp_option(dhcp, DHCP_OPTION_HOSTNAME, strlen(p)); while (*p) { dhcp_option_byte(dhcp, *p++); } } #endif /* LWIP_NETIF_HOSTNAME */ dhcp_option_trailer(dhcp); /* shrink the pbuf to the actual content length */ pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); /* send broadcast to any DHCP server */ udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif); dhcp_delete_request(netif); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_select: REQUESTING\n")); } else { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("dhcp_select: could not allocate DHCP request\n")); } dhcp->tries++; msecs = (dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000; dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_select(): set request timeout %"U16_F" msecs\n", msecs)); return result; } /** * The DHCP timer that checks for lease renewal/rebind timeouts. * */ void dhcp_coarse_tmr() { struct netif *netif = netif_list; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_coarse_tmr()\n")); /* iterate through all network interfaces */ while (netif != NULL) { /* only act on DHCP configured interfaces */ if (netif->dhcp != NULL) { /* timer is active (non zero), and triggers (zeroes) now? */ if (netif->dhcp->t2_timeout-- == 1) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_coarse_tmr(): t2 timeout\n")); /* this clients' rebind timeout triggered */ dhcp_t2_timeout(netif); /* timer is active (non zero), and triggers (zeroes) now */ } else if (netif->dhcp->t1_timeout-- == 1) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_coarse_tmr(): t1 timeout\n")); /* this clients' renewal timeout triggered */ dhcp_t1_timeout(netif); } } /* proceed to next netif */ netif = netif->next; } } /** * DHCP transaction timeout handling * * A DHCP server is expected to respond within a short period of time. * This timer checks whether an outstanding DHCP request is timed out. * */ void dhcp_fine_tmr() { struct netif *netif = netif_list; /* loop through netif's */ while (netif != NULL) { /* only act on DHCP configured interfaces */ if (netif->dhcp != NULL) { /* timer is active (non zero), and is about to trigger now */ if (netif->dhcp->request_timeout > 1) { netif->dhcp->request_timeout--; } else if (netif->dhcp->request_timeout == 1) { netif->dhcp->request_timeout--; /* { netif->dhcp->request_timeout == 0 } */ LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_fine_tmr(): request timeout\n")); /* this clients' request timeout triggered */ dhcp_timeout(netif); } } /* proceed to next network interface */ netif = netif->next; } } /** * A DHCP negotiation transaction, or ARP request, has timed out. * * The timer that was started with the DHCP or ARP request has * timed out, indicating no response was received in time. * * @param netif the netif under DHCP control */ static void dhcp_timeout(struct netif *netif) { struct dhcp *dhcp = netif->dhcp; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_timeout()\n")); /* back-off period has passed, or server selection timed out */ if ((dhcp->state == DHCP_BACKING_OFF) || (dhcp->state == DHCP_SELECTING)) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_timeout(): restarting discovery\n")); dhcp_discover(netif); /* receiving the requested lease timed out */ } else if (dhcp->state == DHCP_REQUESTING) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): REQUESTING, DHCP request timed out\n")); if (dhcp->tries <= 5) { dhcp_select(netif); } else { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): REQUESTING, releasing, restarting\n")); dhcp_release(netif); dhcp_discover(netif); } #if DHCP_DOES_ARP_CHECK /* received no ARP reply for the offered address (which is good) */ } else if (dhcp->state == DHCP_CHECKING) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): CHECKING, ARP request timed out\n")); if (dhcp->tries <= 1) { dhcp_check(netif); /* no ARP replies on the offered address, looks like the IP address is indeed free */ } else { /* bind the interface to the offered address */ dhcp_bind(netif); } #endif /* DHCP_DOES_ARP_CHECK */ } /* did not get response to renew request? */ else if (dhcp->state == DHCP_RENEWING) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): RENEWING, DHCP request timed out\n")); /* just retry renewal */ /* note that the rebind timer will eventually time-out if renew does not work */ dhcp_renew(netif); /* did not get response to rebind request? */ } else if (dhcp->state == DHCP_REBINDING) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): REBINDING, DHCP request timed out\n")); if (dhcp->tries <= 8) { dhcp_rebind(netif); } else { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): RELEASING, DISCOVERING\n")); dhcp_release(netif); dhcp_discover(netif); } } else if (dhcp->state == DHCP_REBOOTING) { if (dhcp->tries < REBOOT_TRIES) { dhcp_reboot(netif); } else { dhcp_discover(netif); } } } /** * The renewal period has timed out. * * @param netif the netif under DHCP control */ static void dhcp_t1_timeout(struct netif *netif) { struct dhcp *dhcp = netif->dhcp; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_t1_timeout()\n")); if ((dhcp->state == DHCP_REQUESTING) || (dhcp->state == DHCP_BOUND) || (dhcp->state == DHCP_RENEWING)) { /* just retry to renew - note that the rebind timer (t2) will * eventually time-out if renew tries fail. */ LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_t1_timeout(): must renew\n")); dhcp_renew(netif); } } /** * The rebind period has timed out. * * @param netif the netif under DHCP control */ static void dhcp_t2_timeout(struct netif *netif) { struct dhcp *dhcp = netif->dhcp; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_t2_timeout()\n")); if ((dhcp->state == DHCP_REQUESTING) || (dhcp->state == DHCP_BOUND) || (dhcp->state == DHCP_RENEWING)) { /* just retry to rebind */ LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_t2_timeout(): must rebind\n")); dhcp_rebind(netif); } } /** * Handle a DHCP ACK packet * * @param netif the netif under DHCP control */ static void dhcp_handle_ack(struct netif *netif) { struct dhcp *dhcp = netif->dhcp; u8_t *option_ptr; /* clear options we might not get from the ACK */ dhcp->offered_sn_mask.addr = 0; dhcp->offered_gw_addr.addr = 0; dhcp->offered_bc_addr.addr = 0; /* lease time given? */ option_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_LEASE_TIME); if (option_ptr != NULL) { /* remember offered lease time */ dhcp->offered_t0_lease = dhcp_get_option_long(option_ptr + 2); } /* renewal period given? */ option_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_T1); if (option_ptr != NULL) { /* remember given renewal period */ dhcp->offered_t1_renew = dhcp_get_option_long(option_ptr + 2); } else { /* calculate safe periods for renewal */ dhcp->offered_t1_renew = dhcp->offered_t0_lease / 2; } /* renewal period given? */ option_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_T2); if (option_ptr != NULL) { /* remember given rebind period */ dhcp->offered_t2_rebind = dhcp_get_option_long(option_ptr + 2); } else { /* calculate safe periods for rebinding */ dhcp->offered_t2_rebind = dhcp->offered_t0_lease; } /* (y)our internet address */ ip_addr_set(&dhcp->offered_ip_addr, &dhcp->msg_in->yiaddr); /** * Patch #1308 * TODO: we must check if the file field is not overloaded by DHCP options! */ #if 0 /* boot server address */ ip_addr_set(&dhcp->offered_si_addr, &dhcp->msg_in->siaddr); /* boot file name */ if (dhcp->msg_in->file[0]) { dhcp->boot_file_name = mem_malloc(strlen(dhcp->msg_in->file) + 1); strcpy(dhcp->boot_file_name, dhcp->msg_in->file); } #endif /* subnet mask */ option_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_SUBNET_MASK); /* subnet mask given? */ if (option_ptr != NULL) { dhcp->offered_sn_mask.addr = htonl(dhcp_get_option_long(&option_ptr[2])); } /* gateway router */ option_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_ROUTER); if (option_ptr != NULL) { dhcp->offered_gw_addr.addr = htonl(dhcp_get_option_long(&option_ptr[2])); } /* broadcast address */ option_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_BROADCAST); if (option_ptr != NULL) { dhcp->offered_bc_addr.addr = htonl(dhcp_get_option_long(&option_ptr[2])); } /* DNS servers */ option_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_DNS_SERVER); if (option_ptr != NULL) { u8_t n; dhcp->dns_count = dhcp_get_option_byte(&option_ptr[1]) / (u32_t)sizeof(struct ip_addr); /* limit to at most DHCP_MAX_DNS DNS servers */ if (dhcp->dns_count > DHCP_MAX_DNS) dhcp->dns_count = DHCP_MAX_DNS; for (n = 0; n < dhcp->dns_count; n++) { dhcp->offered_dns_addr[n].addr = htonl(dhcp_get_option_long(&option_ptr[2 + n * 4])); #if LWIP_DNS dns_setserver( n, (struct ip_addr *)(&(dhcp->offered_dns_addr[n].addr))); #endif /* LWIP_DNS */ } #if LWIP_DNS dns_setserver( n, (struct ip_addr *)(&ip_addr_any)); #endif /* LWIP_DNS */ } } /** * Start DHCP negotiation for a network interface. * * If no DHCP client instance was attached to this interface, * a new client is created first. If a DHCP client instance * was already present, it restarts negotiation. * * @param netif The lwIP network interface * @return lwIP error code * - ERR_OK - No error * - ERR_MEM - Out of memory */ err_t dhcp_start(struct netif *netif) { struct dhcp *dhcp; err_t result = ERR_OK; LWIP_ERROR("netif != NULL", (netif != NULL), return ERR_ARG;); dhcp = netif->dhcp; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_start(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); /* Remove the flag that says this netif is handled by DHCP, it is set when we succeeded starting. */ netif->flags &= ~NETIF_FLAG_DHCP; /* check MTU of the netif */ if (netif->mtu < DHCP_MAX_MSG_LEN_MIN_REQUIRED) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): Cannot use this netif with DHCP: MTU is too small\n")); return ERR_MEM; } /* no DHCP client attached yet? */ if (dhcp == NULL) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): starting new DHCP client\n")); dhcp = mem_malloc(sizeof(struct dhcp)); if (dhcp == NULL) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): could not allocate dhcp\n")); return ERR_MEM; } /* store this dhcp client in the netif */ netif->dhcp = dhcp; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): allocated dhcp")); /* already has DHCP client attached */ } else { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_start(): restarting DHCP configuration\n")); if (dhcp->pcb != NULL) { udp_remove(dhcp->pcb); } LWIP_ASSERT("pbuf p_out wasn't freed", dhcp->p_out == NULL); LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL && dhcp->options_in == NULL && dhcp->options_in_len == 0); } /* clear data structure */ memset(dhcp, 0, sizeof(struct dhcp)); /* allocate UDP PCB */ dhcp->pcb = udp_new(); if (dhcp->pcb == NULL) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): could not obtain pcb\n")); mem_free((void *)dhcp); netif->dhcp = dhcp = NULL; return ERR_MEM; } #if IP_SOF_BROADCAST dhcp->pcb->so_options|=SOF_BROADCAST; #endif /* IP_SOF_BROADCAST */ /* set up local and remote port for the pcb */ udp_bind(dhcp->pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT); udp_connect(dhcp->pcb, IP_ADDR_ANY, DHCP_SERVER_PORT); /* set up the recv callback and argument */ udp_recv(dhcp->pcb, dhcp_recv, netif); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): starting DHCP configuration\n")); /* (re)start the DHCP negotiation */ result = dhcp_discover(netif); if (result != ERR_OK) { /* free resources allocated above */ dhcp_stop(netif); return ERR_MEM; } /* Set the flag that says this netif is handled by DHCP. */ netif->flags |= NETIF_FLAG_DHCP; return result; } /** * Inform a DHCP server of our manual configuration. * * This informs DHCP servers of our fixed IP address configuration * by sending an INFORM message. It does not involve DHCP address * configuration, it is just here to be nice to the network. * * @param netif The lwIP network interface */ void dhcp_inform(struct netif *netif) { struct dhcp *dhcp, *old_dhcp; err_t result = ERR_OK; dhcp = mem_malloc(sizeof(struct dhcp)); if (dhcp == NULL) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_inform(): could not allocate dhcp\n")); return; } memset(dhcp, 0, sizeof(struct dhcp)); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_inform(): allocated dhcp\n")); dhcp->pcb = udp_new(); if (dhcp->pcb == NULL) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_inform(): could not obtain pcb")); goto free_dhcp_and_return; } old_dhcp = netif->dhcp; netif->dhcp = dhcp; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_inform(): created new udp pcb\n")); /* create and initialize the DHCP message header */ result = dhcp_create_request(netif); if (result == ERR_OK) { dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN); dhcp_option_byte(dhcp, DHCP_INFORM); dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif)); dhcp_option_trailer(dhcp); pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); #if IP_SOF_BROADCAST dhcp->pcb->so_options|=SOF_BROADCAST; #endif /* IP_SOF_BROADCAST */ udp_bind(dhcp->pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_inform: INFORMING\n")); udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif); dhcp_delete_request(netif); } else { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_inform: could not allocate DHCP request\n")); } udp_remove(dhcp->pcb); dhcp->pcb = NULL; netif->dhcp = old_dhcp; free_dhcp_and_return: mem_free((void *)dhcp); } /** Handle a possible change in the network configuration. * * This enters the REBOOTING state to verify that the currently bound * address is still valid. */ void dhcp_network_changed(struct netif *netif) { struct dhcp *dhcp = netif->dhcp; if (!dhcp) return; switch (dhcp->state) { case DHCP_REBINDING: case DHCP_RENEWING: case DHCP_BOUND: case DHCP_REBOOTING: netif_set_down(netif); dhcp->tries = 0; dhcp_reboot(netif); break; case DHCP_OFF: /* stay off */ break; default: dhcp->tries = 0; dhcp_discover(netif); break; } } #if DHCP_DOES_ARP_CHECK /** * Match an ARP reply with the offered IP address. * * @param netif the network interface on which the reply was received * @param addr The IP address we received a reply from */ void dhcp_arp_reply(struct netif *netif, struct ip_addr *addr) { LWIP_ERROR("netif != NULL", (netif != NULL), return;); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_arp_reply()\n")); /* is a DHCP client doing an ARP check? */ if ((netif->dhcp != NULL) && (netif->dhcp->state == DHCP_CHECKING)) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_arp_reply(): CHECKING, arp reply for 0x%08"X32_F"\n", addr->addr)); /* did a host respond with the address we were offered by the DHCP server? */ if (ip_addr_cmp(addr, &netif->dhcp->offered_ip_addr)) { /* we will not accept the offered address */ LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING, ("dhcp_arp_reply(): arp reply matched with offered address, declining\n")); dhcp_decline(netif); } } } /** * Decline an offered lease. * * Tell the DHCP server we do not accept the offered address. * One reason to decline the lease is when we find out the address * is already in use by another host (through ARP). * * @param netif the netif under DHCP control */ static err_t dhcp_decline(struct netif *netif) { struct dhcp *dhcp = netif->dhcp; err_t result = ERR_OK; u16_t msecs; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_decline()\n")); dhcp_set_state(dhcp, DHCP_BACKING_OFF); /* create and initialize the DHCP message header */ result = dhcp_create_request(netif); if (result == ERR_OK) { dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN); dhcp_option_byte(dhcp, DHCP_DECLINE); dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4); dhcp_option_long(dhcp, ntohl(dhcp->offered_ip_addr.addr)); dhcp_option_trailer(dhcp); /* resize pbuf to reflect true size of options */ pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); /* per section 4.4.4, broadcast DECLINE messages */ udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif); dhcp_delete_request(netif); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_decline: BACKING OFF\n")); } else { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_decline: could not allocate DHCP request\n")); } dhcp->tries++; msecs = 10*1000; dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_decline(): set request timeout %"U16_F" msecs\n", msecs)); return result; } #endif /** * Start the DHCP process, discover a DHCP server. * * @param netif the netif under DHCP control */ static err_t dhcp_discover(struct netif *netif) { struct dhcp *dhcp = netif->dhcp; err_t result = ERR_OK; u16_t msecs; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover()\n")); ip_addr_set(&dhcp->offered_ip_addr, IP_ADDR_ANY); dhcp_set_state(dhcp, DHCP_SELECTING); /* create and initialize the DHCP message header */ result = dhcp_create_request(netif); if (result == ERR_OK) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: making request\n")); dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN); dhcp_option_byte(dhcp, DHCP_DISCOVER); dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif)); dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, 4/*num options*/); dhcp_option_byte(dhcp, DHCP_OPTION_SUBNET_MASK); dhcp_option_byte(dhcp, DHCP_OPTION_ROUTER); dhcp_option_byte(dhcp, DHCP_OPTION_BROADCAST); dhcp_option_byte(dhcp, DHCP_OPTION_DNS_SERVER); dhcp_option_trailer(dhcp); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: realloc()ing\n")); pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: sendto(DISCOVER, IP_ADDR_BROADCAST, DHCP_SERVER_PORT)\n")); udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: deleting()ing\n")); dhcp_delete_request(netif); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_discover: SELECTING\n")); } else { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_discover: could not allocate DHCP request\n")); } dhcp->tries++; #if LWIP_DHCP_AUTOIP_COOP if(dhcp->tries >= LWIP_DHCP_AUTOIP_COOP_TRIES && dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_OFF) { dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_ON; autoip_start(netif); } #endif /* LWIP_DHCP_AUTOIP_COOP */ msecs = (dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000; dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_discover(): set request timeout %"U16_F" msecs\n", msecs)); return result; } /** * Bind the interface to the offered IP address. * * @param netif network interface to bind to the offered address */ static void dhcp_bind(struct netif *netif) { u32_t timeout; struct dhcp *dhcp; struct ip_addr sn_mask, gw_addr; LWIP_ERROR("dhcp_bind: netif != NULL", (netif != NULL), return;); dhcp = netif->dhcp; LWIP_ERROR("dhcp_bind: dhcp != NULL", (dhcp != NULL), return;); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); /* temporary DHCP lease? */ if (dhcp->offered_t1_renew != 0xffffffffUL) { /* set renewal period timer */ LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(): t1 renewal timer %"U32_F" secs\n", dhcp->offered_t1_renew)); timeout = (dhcp->offered_t1_renew + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS; if(timeout > 0xffff) { timeout = 0xffff; } dhcp->t1_timeout = (u16_t)timeout; if (dhcp->t1_timeout == 0) { dhcp->t1_timeout = 1; } LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t1_renew*1000)); } /* set renewal period timer */ if (dhcp->offered_t2_rebind != 0xffffffffUL) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(): t2 rebind timer %"U32_F" secs\n", dhcp->offered_t2_rebind)); timeout = (dhcp->offered_t2_rebind + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS; if(timeout > 0xffff) { timeout = 0xffff; } dhcp->t2_timeout = (u16_t)timeout; if (dhcp->t2_timeout == 0) { dhcp->t2_timeout = 1; } LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t2_rebind*1000)); } /* copy offered network mask */ ip_addr_set(&sn_mask, &dhcp->offered_sn_mask); /* subnet mask not given? */ /* TODO: this is not a valid check. what if the network mask is 0? */ if (sn_mask.addr == 0) { /* choose a safe subnet mask given the network class */ u8_t first_octet = ip4_addr1(&sn_mask); if (first_octet <= 127) { sn_mask.addr = htonl(0xff000000); } else if (first_octet >= 192) { sn_mask.addr = htonl(0xffffff00); } else { sn_mask.addr = htonl(0xffff0000); } } ip_addr_set(&gw_addr, &dhcp->offered_gw_addr); /* gateway address not given? */ if (gw_addr.addr == 0) { /* copy network address */ gw_addr.addr = (dhcp->offered_ip_addr.addr & sn_mask.addr); /* use first host address on network as gateway */ gw_addr.addr |= htonl(0x00000001); } #if LWIP_DHCP_AUTOIP_COOP if(dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_ON) { autoip_stop(netif); dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_OFF; } #endif /* LWIP_DHCP_AUTOIP_COOP */ LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_bind(): IP: 0x%08"X32_F"\n", dhcp->offered_ip_addr.addr)); netif_set_ipaddr(netif, &dhcp->offered_ip_addr); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_bind(): SN: 0x%08"X32_F"\n", sn_mask.addr)); netif_set_netmask(netif, &sn_mask); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_bind(): GW: 0x%08"X32_F"\n", gw_addr.addr)); netif_set_gw(netif, &gw_addr); /* bring the interface up */ netif_set_up(netif); /* netif is now bound to DHCP leased address */ dhcp_set_state(dhcp, DHCP_BOUND); } /** * Renew an existing DHCP lease at the involved DHCP server. * * @param netif network interface which must renew its lease */ err_t dhcp_renew(struct netif *netif) { struct dhcp *dhcp = netif->dhcp; err_t result; u16_t msecs; #if LWIP_NETIF_HOSTNAME const char *p; #endif /* LWIP_NETIF_HOSTNAME */ LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_renew()\n")); dhcp_set_state(dhcp, DHCP_RENEWING); /* create and initialize the DHCP message header */ result = dhcp_create_request(netif); if (result == ERR_OK) { dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN); dhcp_option_byte(dhcp, DHCP_REQUEST); dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif)); #if LWIP_NETIF_HOSTNAME p = (const char*)netif->hostname; if (p != NULL) { dhcp_option(dhcp, DHCP_OPTION_HOSTNAME, strlen(p)); while (*p) { dhcp_option_byte(dhcp, *p++); } } #endif /* LWIP_NETIF_HOSTNAME */ #if 0 dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4); dhcp_option_long(dhcp, ntohl(dhcp->offered_ip_addr.addr)); #endif #if 0 dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4); dhcp_option_long(dhcp, ntohl(dhcp->server_ip_addr.addr)); #endif /* append DHCP message trailer */ dhcp_option_trailer(dhcp); pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); udp_sendto_if(dhcp->pcb, dhcp->p_out, &dhcp->server_ip_addr, DHCP_SERVER_PORT, netif); dhcp_delete_request(netif); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_renew: RENEWING\n")); } else { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_renew: could not allocate DHCP request\n")); } dhcp->tries++; /* back-off on retries, but to a maximum of 20 seconds */ msecs = dhcp->tries < 10 ? dhcp->tries * 2000 : 20 * 1000; dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_renew(): set request timeout %"U16_F" msecs\n", msecs)); return result; } /** * Rebind with a DHCP server for an existing DHCP lease. * * @param netif network interface which must rebind with a DHCP server */ static err_t dhcp_rebind(struct netif *netif) { struct dhcp *dhcp = netif->dhcp; err_t result; u16_t msecs; #if LWIP_NETIF_HOSTNAME const char *p; #endif /* LWIP_NETIF_HOSTNAME */ LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind()\n")); dhcp_set_state(dhcp, DHCP_REBINDING); /* create and initialize the DHCP message header */ result = dhcp_create_request(netif); if (result == ERR_OK) { dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN); dhcp_option_byte(dhcp, DHCP_REQUEST); dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif)); #if LWIP_NETIF_HOSTNAME p = (const char*)netif->hostname; if (p != NULL) { dhcp_option(dhcp, DHCP_OPTION_HOSTNAME, strlen(p)); while (*p) { dhcp_option_byte(dhcp, *p++); } } #endif /* LWIP_NETIF_HOSTNAME */ #if 0 dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4); dhcp_option_long(dhcp, ntohl(dhcp->offered_ip_addr.addr)); dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4); dhcp_option_long(dhcp, ntohl(dhcp->server_ip_addr.addr)); #endif dhcp_option_trailer(dhcp); pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); /* broadcast to server */ udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif); dhcp_delete_request(netif); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind: REBINDING\n")); } else { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_rebind: could not allocate DHCP request\n")); } dhcp->tries++; msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000; dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind(): set request timeout %"U16_F" msecs\n", msecs)); return result; } /** * Enter REBOOTING state to verify an existing lease * * @param netif network interface which must reboot */ static err_t dhcp_reboot(struct netif *netif) { struct dhcp *dhcp = netif->dhcp; err_t result; u16_t msecs; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot()\n")); dhcp_set_state(dhcp, DHCP_REBOOTING); /* create and initialize the DHCP message header */ result = dhcp_create_request(netif); if (result == ERR_OK) { dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN); dhcp_option_byte(dhcp, DHCP_REQUEST); dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); dhcp_option_short(dhcp, 576); dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4); dhcp_option_long(dhcp, ntohl(dhcp->offered_ip_addr.addr)); dhcp_option_trailer(dhcp); pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); /* broadcast to server */ udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif); dhcp_delete_request(netif); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot: REBOOTING\n")); } else { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_reboot: could not allocate DHCP request\n")); } dhcp->tries++; msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000; dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot(): set request timeout %"U16_F" msecs\n", msecs)); return result; } /** * Release a DHCP lease. * * @param netif network interface which must release its lease */ err_t dhcp_release(struct netif *netif) { struct dhcp *dhcp = netif->dhcp; err_t result; u16_t msecs; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_release()\n")); /* idle DHCP client */ dhcp_set_state(dhcp, DHCP_OFF); /* clean old DHCP offer */ dhcp->server_ip_addr.addr = 0; dhcp->offered_ip_addr.addr = dhcp->offered_sn_mask.addr = 0; dhcp->offered_gw_addr.addr = dhcp->offered_bc_addr.addr = 0; dhcp->offered_t0_lease = dhcp->offered_t1_renew = dhcp->offered_t2_rebind = 0; dhcp->dns_count = 0; /* create and initialize the DHCP message header */ result = dhcp_create_request(netif); if (result == ERR_OK) { dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN); dhcp_option_byte(dhcp, DHCP_RELEASE); dhcp_option_trailer(dhcp); pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); udp_sendto_if(dhcp->pcb, dhcp->p_out, &dhcp->server_ip_addr, DHCP_SERVER_PORT, netif); dhcp_delete_request(netif); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_release: RELEASED, DHCP_OFF\n")); } else { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_release: could not allocate DHCP request\n")); } dhcp->tries++; msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000; dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_release(): set request timeout %"U16_F" msecs\n", msecs)); /* bring the interface down */ netif_set_down(netif); /* remove IP address from interface */ netif_set_ipaddr(netif, IP_ADDR_ANY); netif_set_gw(netif, IP_ADDR_ANY); netif_set_netmask(netif, IP_ADDR_ANY); /* TODO: netif_down(netif); */ return result; } /** * Remove the DHCP client from the interface. * * @param netif The network interface to stop DHCP on */ void dhcp_stop(struct netif *netif) { struct dhcp *dhcp = netif->dhcp; LWIP_ERROR("dhcp_stop: netif != NULL", (netif != NULL), return;); /* Remove the flag that says this netif is handled by DHCP. */ netif->flags &= ~NETIF_FLAG_DHCP; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_stop()\n")); /* netif is DHCP configured? */ if (dhcp != NULL) { #if LWIP_DHCP_AUTOIP_COOP if(dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_ON) { autoip_stop(netif); dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_OFF; } #endif /* LWIP_DHCP_AUTOIP_COOP */ if (dhcp->pcb != NULL) { udp_remove(dhcp->pcb); dhcp->pcb = NULL; } LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL && dhcp->options_in == NULL && dhcp->options_in_len == 0); mem_free((void *)dhcp); netif->dhcp = NULL; } } /* * Set the DHCP state of a DHCP client. * * If the state changed, reset the number of tries. * * TODO: we might also want to reset the timeout here? */ static void dhcp_set_state(struct dhcp *dhcp, u8_t new_state) { if (new_state != dhcp->state) { dhcp->state = new_state; dhcp->tries = 0; } } /* * Concatenate an option type and length field to the outgoing * DHCP message. * */ static void dhcp_option(struct dhcp *dhcp, u8_t option_type, u8_t option_len) { LWIP_ASSERT("dhcp_option: dhcp->options_out_len + 2 + option_len <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U + option_len <= DHCP_OPTIONS_LEN); dhcp->msg_out->options[dhcp->options_out_len++] = option_type; dhcp->msg_out->options[dhcp->options_out_len++] = option_len; } /* * Concatenate a single byte to the outgoing DHCP message. * */ static void dhcp_option_byte(struct dhcp *dhcp, u8_t value) { LWIP_ASSERT("dhcp_option_byte: dhcp->options_out_len < DHCP_OPTIONS_LEN", dhcp->options_out_len < DHCP_OPTIONS_LEN); dhcp->msg_out->options[dhcp->options_out_len++] = value; } static void dhcp_option_short(struct dhcp *dhcp, u16_t value) { LWIP_ASSERT("dhcp_option_short: dhcp->options_out_len + 2 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U <= DHCP_OPTIONS_LEN); dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff00U) >> 8); dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t) (value & 0x00ffU); } static void dhcp_option_long(struct dhcp *dhcp, u32_t value) { LWIP_ASSERT("dhcp_option_long: dhcp->options_out_len + 4 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 4U <= DHCP_OPTIONS_LEN); dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff000000UL) >> 24); dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x00ff0000UL) >> 16); dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x0000ff00UL) >> 8); dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x000000ffUL)); } /** * Extract the DHCP message and the DHCP options. * * Extract the DHCP message and the DHCP options, each into a contiguous * piece of memory. As a DHCP message is variable sized by its options, * and also allows overriding some fields for options, the easy approach * is to first unfold the options into a conitguous piece of memory, and * use that further on. * */ static err_t dhcp_unfold_reply(struct dhcp *dhcp, struct pbuf *p) { u16_t ret; LWIP_ERROR("dhcp != NULL", (dhcp != NULL), return ERR_ARG;); /* free any left-overs from previous unfolds */ dhcp_free_reply(dhcp); /* options present? */ if (p->tot_len > (sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN)) { dhcp->options_in_len = p->tot_len - (sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN); dhcp->options_in = mem_malloc(dhcp->options_in_len); if (dhcp->options_in == NULL) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_unfold_reply(): could not allocate dhcp->options\n")); dhcp->options_in_len = 0; return ERR_MEM; } } dhcp->msg_in = mem_malloc(sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN); if (dhcp->msg_in == NULL) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_unfold_reply(): could not allocate dhcp->msg_in\n")); if (dhcp->options_in != NULL) { mem_free(dhcp->options_in); dhcp->options_in = NULL; dhcp->options_in_len = 0; } return ERR_MEM; } /** copy the DHCP message without options */ ret = pbuf_copy_partial(p, dhcp->msg_in, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN, 0); LWIP_ASSERT("ret == sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN", ret == sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_unfold_reply(): copied %"U16_F" bytes into dhcp->msg_in[]\n", sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN)); if (dhcp->options_in != NULL) { /** copy the DHCP options */ ret = pbuf_copy_partial(p, dhcp->options_in, dhcp->options_in_len, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN); LWIP_ASSERT("ret == dhcp->options_in_len", ret == dhcp->options_in_len); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_unfold_reply(): copied %"U16_F" bytes to dhcp->options_in[]\n", dhcp->options_in_len)); } LWIP_UNUSED_ARG(ret); return ERR_OK; } /** * Free the incoming DHCP message including contiguous copy of * its DHCP options. */ static void dhcp_free_reply(struct dhcp *dhcp) { if (dhcp->msg_in != NULL) { mem_free((void *)dhcp->msg_in); dhcp->msg_in = NULL; } if (dhcp->options_in) { mem_free(dhcp->options_in); dhcp->options_in = NULL; dhcp->options_in_len = 0; } LWIP_DEBUGF(DHCP_DEBUG, ("dhcp_free_reply(): free'd\n")); } /** * If an incoming DHCP message is in response to us, then trigger the state machine */ static void dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port) { struct netif *netif = (struct netif *)arg; struct dhcp *dhcp = netif->dhcp; struct dhcp_msg *reply_msg = (struct dhcp_msg *)p->payload; u8_t *options_ptr; u8_t msg_type; u8_t i; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_recv(pbuf = %p) from DHCP server %"U16_F".%"U16_F".%"U16_F".%"U16_F" port %"U16_F"\n", (void*)p, (u16_t)(ntohl(addr->addr) >> 24 & 0xff), (u16_t)(ntohl(addr->addr) >> 16 & 0xff), (u16_t)(ntohl(addr->addr) >> 8 & 0xff), (u16_t)(ntohl(addr->addr) & 0xff), port)); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("pbuf->len = %"U16_F"\n", p->len)); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("pbuf->tot_len = %"U16_F"\n", p->tot_len)); /* prevent warnings about unused arguments */ LWIP_UNUSED_ARG(pcb); LWIP_UNUSED_ARG(addr); LWIP_UNUSED_ARG(port); LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL && dhcp->options_in == NULL && dhcp->options_in_len == 0); if (p->len < DHCP_MIN_REPLY_LEN) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("DHCP reply message too short\n")); goto free_pbuf_and_return; } if (reply_msg->op != DHCP_BOOTREPLY) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("not a DHCP reply message, but type %"U16_F"\n", (u16_t)reply_msg->op)); goto free_pbuf_and_return; } /* iterate through hardware address and match against DHCP message */ for (i = 0; i < netif->hwaddr_len; i++) { if (netif->hwaddr[i] != reply_msg->chaddr[i]) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("netif->hwaddr[%"U16_F"]==%02"X16_F" != reply_msg->chaddr[%"U16_F"]==%02"X16_F"\n", (u16_t)i, (u16_t)netif->hwaddr[i], (u16_t)i, (u16_t)reply_msg->chaddr[i])); goto free_pbuf_and_return; } } /* match transaction ID against what we expected */ if (ntohl(reply_msg->xid) != dhcp->xid) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("transaction id mismatch reply_msg->xid(%"X32_F")!=dhcp->xid(%"X32_F")\n",ntohl(reply_msg->xid),dhcp->xid)); goto free_pbuf_and_return; } /* option fields could be unfold? */ if (dhcp_unfold_reply(dhcp, p) != ERR_OK) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("problem unfolding DHCP message - too short on memory?\n")); goto free_pbuf_and_return; } LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("searching DHCP_OPTION_MESSAGE_TYPE\n")); /* obtain pointer to DHCP message type */ options_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_MESSAGE_TYPE); if (options_ptr == NULL) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("DHCP_OPTION_MESSAGE_TYPE option not found\n")); goto free_pbuf_and_return; } /* read DHCP message type */ msg_type = dhcp_get_option_byte(options_ptr + 2); /* message type is DHCP ACK? */ if (msg_type == DHCP_ACK) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_ACK received\n")); /* in requesting state? */ if (dhcp->state == DHCP_REQUESTING) { dhcp_handle_ack(netif); dhcp->request_timeout = 0; #if DHCP_DOES_ARP_CHECK /* check if the acknowledged lease address is already in use */ dhcp_check(netif); #else /* bind interface to the acknowledged lease address */ dhcp_bind(netif); #endif } /* already bound to the given lease address? */ else if ((dhcp->state == DHCP_REBOOTING) || (dhcp->state == DHCP_REBINDING) || (dhcp->state == DHCP_RENEWING)) { dhcp->request_timeout = 0; dhcp_bind(netif); } } /* received a DHCP_NAK in appropriate state? */ else if ((msg_type == DHCP_NAK) && ((dhcp->state == DHCP_REBOOTING) || (dhcp->state == DHCP_REQUESTING) || (dhcp->state == DHCP_REBINDING) || (dhcp->state == DHCP_RENEWING ))) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_NAK received\n")); dhcp->request_timeout = 0; dhcp_handle_nak(netif); } /* received a DHCP_OFFER in DHCP_SELECTING state? */ else if ((msg_type == DHCP_OFFER) && (dhcp->state == DHCP_SELECTING)) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_OFFER received in DHCP_SELECTING state\n")); dhcp->request_timeout = 0; /* remember offered lease */ dhcp_handle_offer(netif); } free_pbuf_and_return: dhcp_free_reply(dhcp); pbuf_free(p); } /** * Create a DHCP request, fill in common headers * * @param netif the netif under DHCP control */ static err_t dhcp_create_request(struct netif *netif) { struct dhcp *dhcp; u16_t i; #ifndef DHCP_GLOBAL_XID /** default global transaction identifier starting value (easy to match * with a packet analyser). We simply increment for each new request. * Predefine DHCP_GLOBAL_XID to a better value or a function call to generate one * at runtime, any supporting function prototypes can be defined in DHCP_GLOBAL_XID_HEADER */ static u32_t xid = 0xABCD0000; #else static u32_t xid; static u8_t xid_initialised = 0; if (!xid_initialised) { xid = DHCP_GLOBAL_XID; xid_initialised = !xid_initialised; } #endif LWIP_ERROR("dhcp_create_request: netif != NULL", (netif != NULL), return ERR_ARG;); dhcp = netif->dhcp; LWIP_ERROR("dhcp_create_request: dhcp != NULL", (dhcp != NULL), return ERR_VAL;); LWIP_ASSERT("dhcp_create_request: dhcp->p_out == NULL", dhcp->p_out == NULL); LWIP_ASSERT("dhcp_create_request: dhcp->msg_out == NULL", dhcp->msg_out == NULL); dhcp->p_out = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcp_msg), PBUF_RAM); if (dhcp->p_out == NULL) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_create_request(): could not allocate pbuf\n")); return ERR_MEM; } LWIP_ASSERT("dhcp_create_request: check that first pbuf can hold struct dhcp_msg", (dhcp->p_out->len >= sizeof(struct dhcp_msg))); /* reuse transaction identifier in retransmissions */ if (dhcp->tries==0) xid++; dhcp->xid = xid; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("transaction id xid(%"X32_F")\n", xid)); dhcp->msg_out = (struct dhcp_msg *)dhcp->p_out->payload; dhcp->msg_out->op = DHCP_BOOTREQUEST; /* TODO: make link layer independent */ dhcp->msg_out->htype = DHCP_HTYPE_ETH; /* TODO: make link layer independent */ dhcp->msg_out->hlen = DHCP_HLEN_ETH; dhcp->msg_out->hops = 0; dhcp->msg_out->xid = htonl(dhcp->xid); dhcp->msg_out->secs = 0; dhcp->msg_out->flags = 0; dhcp->msg_out->ciaddr.addr = 0; if (dhcp->state==DHCP_BOUND || dhcp->state==DHCP_RENEWING || dhcp->state==DHCP_REBINDING) { dhcp->msg_out->ciaddr.addr = netif->ip_addr.addr; } dhcp->msg_out->yiaddr.addr = 0; dhcp->msg_out->siaddr.addr = 0; dhcp->msg_out->giaddr.addr = 0; for (i = 0; i < DHCP_CHADDR_LEN; i++) { /* copy netif hardware address, pad with zeroes */ dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/; } for (i = 0; i < DHCP_SNAME_LEN; i++) { dhcp->msg_out->sname[i] = 0; } for (i = 0; i < DHCP_FILE_LEN; i++) { dhcp->msg_out->file[i] = 0; } dhcp->msg_out->cookie = htonl(0x63825363UL); dhcp->options_out_len = 0; /* fill options field with an incrementing array (for debugging purposes) */ for (i = 0; i < DHCP_OPTIONS_LEN; i++) { dhcp->msg_out->options[i] = (u8_t)i; /* for debugging only, no matter if truncated */ } return ERR_OK; } /** * Free previously allocated memory used to send a DHCP request. * * @param netif the netif under DHCP control */ static void dhcp_delete_request(struct netif *netif) { struct dhcp *dhcp; LWIP_ERROR("dhcp_delete_request: netif != NULL", (netif != NULL), return;); dhcp = netif->dhcp; LWIP_ERROR("dhcp_delete_request: dhcp != NULL", (dhcp != NULL), return;); LWIP_ASSERT("dhcp_delete_request: dhcp->p_out != NULL", dhcp->p_out != NULL); LWIP_ASSERT("dhcp_delete_request: dhcp->msg_out != NULL", dhcp->msg_out != NULL); if (dhcp->p_out != NULL) { pbuf_free(dhcp->p_out); } dhcp->p_out = NULL; dhcp->msg_out = NULL; } /** * Add a DHCP message trailer * * Adds the END option to the DHCP message, and if * necessary, up to three padding bytes. * * @param dhcp DHCP state structure */ static void dhcp_option_trailer(struct dhcp *dhcp) { LWIP_ERROR("dhcp_option_trailer: dhcp != NULL", (dhcp != NULL), return;); LWIP_ASSERT("dhcp_option_trailer: dhcp->msg_out != NULL\n", dhcp->msg_out != NULL); LWIP_ASSERT("dhcp_option_trailer: dhcp->options_out_len < DHCP_OPTIONS_LEN\n", dhcp->options_out_len < DHCP_OPTIONS_LEN); dhcp->msg_out->options[dhcp->options_out_len++] = DHCP_OPTION_END; /* packet is too small, or not 4 byte aligned? */ while ((dhcp->options_out_len < DHCP_MIN_OPTIONS_LEN) || (dhcp->options_out_len & 3)) { /* LWIP_DEBUGF(DHCP_DEBUG,("dhcp_option_trailer:dhcp->options_out_len=%"U16_F", DHCP_OPTIONS_LEN=%"U16_F, dhcp->options_out_len, DHCP_OPTIONS_LEN)); */ LWIP_ASSERT("dhcp_option_trailer: dhcp->options_out_len < DHCP_OPTIONS_LEN\n", dhcp->options_out_len < DHCP_OPTIONS_LEN); /* add a fill/padding byte */ dhcp->msg_out->options[dhcp->options_out_len++] = 0; } } /** * Find the offset of a DHCP option inside the DHCP message. * * @param dhcp DHCP client * @param option_type * * @return a byte offset into the UDP message where the option was found, or * zero if the given option was not found. */ static u8_t *dhcp_get_option_ptr(struct dhcp *dhcp, u8_t option_type) { u8_t overload = DHCP_OVERLOAD_NONE; /* options available? */ if ((dhcp->options_in != NULL) && (dhcp->options_in_len > 0)) { /* start with options field */ u8_t *options = (u8_t *)dhcp->options_in; u16_t offset = 0; /* at least 1 byte to read and no end marker, then at least 3 bytes to read? */ while ((offset < dhcp->options_in_len) && (options[offset] != DHCP_OPTION_END)) { /* LWIP_DEBUGF(DHCP_DEBUG, ("msg_offset=%"U16_F", q->len=%"U16_F, msg_offset, q->len)); */ /* are the sname and/or file field overloaded with options? */ if (options[offset] == DHCP_OPTION_OVERLOAD) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded message detected\n")); /* skip option type and length */ offset += 2; overload = options[offset++]; } /* requested option found */ else if (options[offset] == option_type) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("option found at offset %"U16_F" in options\n", offset)); return &options[offset]; /* skip option */ } else { LWIP_DEBUGF(DHCP_DEBUG, ("skipping option %"U16_F" in options\n", options[offset])); /* skip option type */ offset++; /* skip option length, and then length bytes */ offset += 1 + options[offset]; } } /* is this an overloaded message? */ if (overload != DHCP_OVERLOAD_NONE) { u16_t field_len; if (overload == DHCP_OVERLOAD_FILE) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded file field\n")); options = (u8_t *)&dhcp->msg_in->file; field_len = DHCP_FILE_LEN; } else if (overload == DHCP_OVERLOAD_SNAME) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded sname field\n")); options = (u8_t *)&dhcp->msg_in->sname; field_len = DHCP_SNAME_LEN; /* TODO: check if else if () is necessary */ } else { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded sname and file field\n")); options = (u8_t *)&dhcp->msg_in->sname; field_len = DHCP_FILE_LEN + DHCP_SNAME_LEN; } offset = 0; /* at least 1 byte to read and no end marker */ while ((offset < field_len) && (options[offset] != DHCP_OPTION_END)) { if (options[offset] == option_type) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("option found at offset=%"U16_F"\n", offset)); return &options[offset]; /* skip option */ } else { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("skipping option %"U16_F"\n", options[offset])); /* skip option type */ offset++; offset += 1 + options[offset]; } } } } return NULL; } /** * Return the byte of DHCP option data. * * @param client DHCP client. * @param ptr pointer obtained by dhcp_get_option_ptr(). * * @return byte value at the given address. */ static u8_t dhcp_get_option_byte(u8_t *ptr) { LWIP_DEBUGF(DHCP_DEBUG, ("option byte value=%"U16_F"\n", (u16_t)(*ptr))); return *ptr; } #if 0 /* currently unused */ /** * Return the 16-bit value of DHCP option data. * * @param client DHCP client. * @param ptr pointer obtained by dhcp_get_option_ptr(). * * @return byte value at the given address. */ static u16_t dhcp_get_option_short(u8_t *ptr) { u16_t value; value = *ptr++ << 8; value |= *ptr; LWIP_DEBUGF(DHCP_DEBUG, ("option short value=%"U16_F"\n", value)); return value; } #endif /** * Return the 32-bit value of DHCP option data. * * @param client DHCP client. * @param ptr pointer obtained by dhcp_get_option_ptr(). * * @return byte value at the given address. */ static u32_t dhcp_get_option_long(u8_t *ptr) { u32_t value; value = (u32_t)(*ptr++) << 24; value |= (u32_t)(*ptr++) << 16; value |= (u32_t)(*ptr++) << 8; value |= (u32_t)(*ptr++); LWIP_DEBUGF(DHCP_DEBUG, ("option long value=%"U32_F"\n", value)); return value; } #endif /* LWIP_DHCP */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/dns.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * DNS - host name to IP address resolver. * */ /** * This file implements a DNS host name to IP address resolver. * Port to lwIP from uIP * by Jim Pettinato April 2007 * uIP version Copyright (c) 2002-2003, Adam Dunkels. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * DNS.C * * The lwIP DNS resolver functions are used to lookup a host name and * map it to a numerical IP address. It maintains a list of resolved * hostnames that can be queried with the dns_lookup() function. * New hostnames can be resolved using the dns_query() function. * * The lwIP version of the resolver also adds a non-blocking version of * gethostbyname() that will work with a raw API application. This function * checks for an IP address string first and converts it if it is valid. * gethostbyname() then does a dns_lookup() to see if the name is * already in the table. If so, the IP is returned. If not, a query is * issued and the function returns with a ERR_INPROGRESS status. The app * using the dns client must then go into a waiting state. * * Once a hostname has been resolved (or found to be non-existent), * the resolver code calls a specified callback function (which * must be implemented by the module that uses the resolver). */ /*----------------------------------------------------------------------------- * RFC 1035 - Domain names - implementation and specification * RFC 2181 - Clarifications to the DNS Specification *----------------------------------------------------------------------------*/ /** @todo: define good default values (rfc compliance) */ /** @todo: improve answer parsing, more checkings... */ /** @todo: check RFC1035 - 7.3. Processing responses */ /*----------------------------------------------------------------------------- * Includes *----------------------------------------------------------------------------*/ #include "lwip/opt.h" #if LWIP_DNS /* don't build if not configured for use in lwipopts.h */ #include "lwip/udp.h" #include "lwip/mem.h" #include "lwip/dns.h" #include /** DNS server IP address */ #ifndef DNS_SERVER_ADDRESS #define DNS_SERVER_ADDRESS inet_addr("208.67.222.222") /* resolver1.opendns.com */ #endif /** DNS server port address */ #ifndef DNS_SERVER_PORT #define DNS_SERVER_PORT 53 #endif /** DNS maximum number of retries when asking for a name, before "timeout". */ #ifndef DNS_MAX_RETRIES #define DNS_MAX_RETRIES 4 #endif /** DNS resource record max. TTL (one week as default) */ #ifndef DNS_MAX_TTL #define DNS_MAX_TTL 604800 #endif /* DNS protocol flags */ #define DNS_FLAG1_RESPONSE 0x80 #define DNS_FLAG1_OPCODE_STATUS 0x10 #define DNS_FLAG1_OPCODE_INVERSE 0x08 #define DNS_FLAG1_OPCODE_STANDARD 0x00 #define DNS_FLAG1_AUTHORATIVE 0x04 #define DNS_FLAG1_TRUNC 0x02 #define DNS_FLAG1_RD 0x01 #define DNS_FLAG2_RA 0x80 #define DNS_FLAG2_ERR_MASK 0x0f #define DNS_FLAG2_ERR_NONE 0x00 #define DNS_FLAG2_ERR_NAME 0x03 /* DNS protocol states */ #define DNS_STATE_UNUSED 0 #define DNS_STATE_NEW 1 #define DNS_STATE_ASKING 2 #define DNS_STATE_DONE 3 #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" #endif PACK_STRUCT_BEGIN /** DNS message header */ struct dns_hdr { PACK_STRUCT_FIELD(u16_t id); PACK_STRUCT_FIELD(u8_t flags1); PACK_STRUCT_FIELD(u8_t flags2); PACK_STRUCT_FIELD(u16_t numquestions); PACK_STRUCT_FIELD(u16_t numanswers); PACK_STRUCT_FIELD(u16_t numauthrr); PACK_STRUCT_FIELD(u16_t numextrarr); } PACK_STRUCT_STRUCT; PACK_STRUCT_END #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/epstruct.h" #endif #define SIZEOF_DNS_HDR 12 #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" #endif PACK_STRUCT_BEGIN /** DNS query message structure */ struct dns_query { /* DNS query record starts with either a domain name or a pointer to a name already present somewhere in the packet. */ PACK_STRUCT_FIELD(u16_t type); PACK_STRUCT_FIELD(u16_t class); } PACK_STRUCT_STRUCT; PACK_STRUCT_END #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/epstruct.h" #endif #define SIZEOF_DNS_QUERY 4 #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" #endif PACK_STRUCT_BEGIN /** DNS answer message structure */ struct dns_answer { /* DNS answer record starts with either a domain name or a pointer to a name already present somewhere in the packet. */ PACK_STRUCT_FIELD(u16_t type); PACK_STRUCT_FIELD(u16_t class); PACK_STRUCT_FIELD(u32_t ttl); PACK_STRUCT_FIELD(u16_t len); } PACK_STRUCT_STRUCT; PACK_STRUCT_END #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/epstruct.h" #endif #define SIZEOF_DNS_ANSWER 10 /** DNS table entry */ struct dns_table_entry { u8_t state; u8_t numdns; u8_t tmr; u8_t retries; u8_t seqno; u8_t err; u32_t ttl; char name[DNS_MAX_NAME_LENGTH]; struct ip_addr ipaddr; /* pointer to callback on DNS query done */ dns_found_callback found; void *arg; }; #if DNS_LOCAL_HOSTLIST /** struct used for local host-list */ struct local_hostlist_entry { /** static hostname */ const char *name; /** static host address in network byteorder */ u32_t addr; struct local_hostlist_entry *next; }; #if DNS_LOCAL_HOSTLIST_IS_DYNAMIC /** Local host-list. For hostnames in this list, no * external name resolution is performed */ static struct local_hostlist_entry *local_hostlist_dynamic; #else /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ /** Defining this allows the local_hostlist_static to be placed in a different * linker section (e.g. FLASH) */ #ifndef DNS_LOCAL_HOSTLIST_STORAGE_PRE #define DNS_LOCAL_HOSTLIST_STORAGE_PRE static #endif /* DNS_LOCAL_HOSTLIST_STORAGE_PRE */ /** Defining this allows the local_hostlist_static to be placed in a different * linker section (e.g. FLASH) */ #ifndef DNS_LOCAL_HOSTLIST_STORAGE_POST #define DNS_LOCAL_HOSTLIST_STORAGE_POST #endif /* DNS_LOCAL_HOSTLIST_STORAGE_POST */ DNS_LOCAL_HOSTLIST_STORAGE_PRE struct local_hostlist_entry local_hostlist_static[] DNS_LOCAL_HOSTLIST_STORAGE_POST = DNS_LOCAL_HOSTLIST_INIT; #endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ static void dns_init_local(); #endif /* DNS_LOCAL_HOSTLIST */ /* forward declarations */ static void dns_recv(void *s, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port); static void dns_check_entries(void); /*----------------------------------------------------------------------------- * Globales *----------------------------------------------------------------------------*/ /* DNS variables */ static struct udp_pcb *dns_pcb; static u8_t dns_seqno; static struct dns_table_entry dns_table[DNS_TABLE_SIZE]; static struct ip_addr dns_servers[DNS_MAX_SERVERS]; #if (DNS_USES_STATIC_BUF == 1) static u8_t dns_payload[DNS_MSG_SIZE]; #endif /* (DNS_USES_STATIC_BUF == 1) */ /** * Initialize the resolver: set up the UDP pcb and configure the default server * (DNS_SERVER_ADDRESS). */ void dns_init() { struct ip_addr dnsserver; /* initialize default DNS server address */ dnsserver.addr = DNS_SERVER_ADDRESS; LWIP_DEBUGF(DNS_DEBUG, ("dns_init: initializing\n")); /* if dns client not yet initialized... */ if (dns_pcb == NULL) { dns_pcb = udp_new(); if (dns_pcb != NULL) { /* initialize DNS table not needed (initialized to zero since it is a * global variable) */ LWIP_ASSERT("For implicit initialization to work, DNS_STATE_UNUSED needs to be 0", DNS_STATE_UNUSED == 0); /* initialize DNS client */ udp_bind(dns_pcb, IP_ADDR_ANY, 0); udp_recv(dns_pcb, dns_recv, NULL); /* initialize default DNS primary server */ dns_setserver(0, &dnsserver); } } #if DNS_LOCAL_HOSTLIST dns_init_local(); #endif } /** * Initialize one of the DNS servers. * * @param numdns the index of the DNS server to set must be < DNS_MAX_SERVERS * @param dnsserver IP address of the DNS server to set */ void dns_setserver(u8_t numdns, struct ip_addr *dnsserver) { if ((numdns < DNS_MAX_SERVERS) && (dns_pcb != NULL) && (dnsserver != NULL) && (dnsserver->addr !=0 )) { dns_servers[numdns] = (*dnsserver); } } /** * Obtain one of the currently configured DNS server. * * @param numdns the index of the DNS server * @return IP address of the indexed DNS server or "ip_addr_any" if the DNS * server has not been configured. */ struct ip_addr dns_getserver(u8_t numdns) { if (numdns < DNS_MAX_SERVERS) { return dns_servers[numdns]; } else { return *IP_ADDR_ANY; } } /** * The DNS resolver client timer - handle retries and timeouts and should * be called every DNS_TMR_INTERVAL milliseconds (every second by default). */ void dns_tmr(void) { if (dns_pcb != NULL) { LWIP_DEBUGF(DNS_DEBUG, ("dns_tmr: dns_check_entries\n")); dns_check_entries(); } } #if DNS_LOCAL_HOSTLIST static void dns_init_local() { #if DNS_LOCAL_HOSTLIST_IS_DYNAMIC && defined(DNS_LOCAL_HOSTLIST_INIT) int i; struct local_hostlist_entry *entry; /* Dynamic: copy entries from DNS_LOCAL_HOSTLIST_INIT to list */ struct local_hostlist_entry local_hostlist_init[] = DNS_LOCAL_HOSTLIST_INIT; for (i = 0; i < sizeof(local_hostlist_init) / sizeof(struct local_hostlist_entry); i++) { entry = mem_malloc(sizeof(struct local_hostlist_entry)); LWIP_ASSERT("mem-error in dns_init_local", entry != NULL); if (entry != NULL) { struct local_hostlist_entry *init_entry = &local_hostlist_init[i]; entry->name = init_entry->name; entry->addr = init_entry->addr; entry->next = local_hostlist_dynamic; local_hostlist_dynamic = entry; } } #endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC && defined(DNS_LOCAL_HOSTLIST_INIT) */ } /** * Scans the local host-list for a hostname. * * @param hostname Hostname to look for in the local host-list * @return The first IP address for the hostname in the local host-list or * INADDR_NONE if not found. */ static u32_t dns_lookup_local(const char *hostname) { #if DNS_LOCAL_HOSTLIST_IS_DYNAMIC struct local_hostlist_entry *entry = local_hostlist_dynamic; while(entry != NULL) { if(strcmp(entry->name, hostname) == 0) { return entry->addr; } entry = entry->next; } #else /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ int i; for (i = 0; i < sizeof(local_hostlist_static) / sizeof(struct local_hostlist_entry); i++) { if(strcmp(local_hostlist_static[i].name, hostname) == 0) { return local_hostlist_static[i].addr; } } #endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ return INADDR_NONE; } #if DNS_LOCAL_HOSTLIST_IS_DYNAMIC /** Remove all entries from the local host-list for a specific hostname * and/or IP addess * * @param hostname hostname for which entries shall be removed from the local * host-list * @param addr address for which entries shall be removed from the local host-list * @return the number of removed entries */ int dns_local_removehost(const char *hostname, const struct ip_addr *addr) { int removed = 0; struct local_hostlist_entry *entry = local_hostlist_dynamic; struct local_hostlist_entry *last_entry = NULL; while (entry != NULL) { if (((hostname == NULL) || !strcmp(entry->name, hostname)) && ((addr == NULL) || (entry->addr == addr->addr))) { struct local_hostlist_entry *free_entry; if (last_entry != NULL) { last_entry->next = entry->next; } else { local_hostlist_dynamic = entry->next; } free_entry = entry; entry = entry->next; mem_free(free_entry); removed++; } else { last_entry = entry; entry = entry->next; } } return removed; } /** * Add a hostname/IP address pair to the local host-list. * Duplicates are not checked. * * @param hostname hostname of the new entry * @param addr IP address of the new entry * @return ERR_OK if succeeded or ERR_MEM on memory error */ err_t dns_local_addhost(const char *hostname, const struct ip_addr *addr) { struct local_hostlist_entry *entry; entry = mem_malloc(sizeof(struct local_hostlist_entry)); if (entry == NULL) { return ERR_MEM; } entry->name = hostname; entry->addr = addr->addr; entry->next = local_hostlist_dynamic; local_hostlist_dynamic = entry; return ERR_OK; } #endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC*/ #endif /* DNS_LOCAL_HOSTLIST */ /** * Look up a hostname in the array of known hostnames. * * @note This function only looks in the internal array of known * hostnames, it does not send out a query for the hostname if none * was found. The function dns_enqueue() can be used to send a query * for a hostname. * * @param name the hostname to look up * @return the hostname's IP address, as u32_t (instead of struct ip_addr to * better check for failure: != INADDR_NONE) or INADDR_NONE if the hostname * was not found in the cached dns_table. */ static u32_t dns_lookup(const char *name) { u8_t i; #if DNS_LOCAL_HOSTLIST || defined(DNS_LOOKUP_LOCAL_EXTERN) u32_t addr; #endif /* DNS_LOCAL_HOSTLIST || defined(DNS_LOOKUP_LOCAL_EXTERN) */ #if DNS_LOCAL_HOSTLIST if ((addr = dns_lookup_local(name)) != INADDR_NONE) { return addr; } #endif /* DNS_LOCAL_HOSTLIST */ #ifdef DNS_LOOKUP_LOCAL_EXTERN if((addr = DNS_LOOKUP_LOCAL_EXTERN(name)) != INADDR_NONE) { return addr; } #endif /* DNS_LOOKUP_LOCAL_EXTERN */ /* Walk through name list, return entry if found. If not, return NULL. */ for (i = 0; i < DNS_TABLE_SIZE; ++i) { if ((dns_table[i].state == DNS_STATE_DONE) && (strcmp(name, dns_table[i].name) == 0)) { LWIP_DEBUGF(DNS_DEBUG, ("dns_lookup: \"%s\": found = ", name)); ip_addr_debug_print(DNS_DEBUG, &(dns_table[i].ipaddr)); LWIP_DEBUGF(DNS_DEBUG, ("\n")); return dns_table[i].ipaddr.addr; } } return INADDR_NONE; } #if DNS_DOES_NAME_CHECK /** * Compare the "dotted" name "query" with the encoded name "response" * to make sure an answer from the DNS server matches the current dns_table * entry (otherwise, answers might arrive late for hostname not on the list * any more). * * @param query hostname (not encoded) from the dns_table * @param response encoded hostname in the DNS response * @return 0: names equal; 1: names differ */ static u8_t dns_compare_name(unsigned char *query, unsigned char *response) { unsigned char n; do { n = *response++; /** @see RFC 1035 - 4.1.4. Message compression */ if ((n & 0xc0) == 0xc0) { /* Compressed name */ break; } else { /* Not compressed name */ while (n > 0) { if ((*query) != (*response)) { return 1; } ++response; ++query; --n; }; ++query; } } while (*response != 0); return 0; } #endif /* DNS_DOES_NAME_CHECK */ /** * Walk through a compact encoded DNS name and return the end of the name. * * @param query encoded DNS name in the DNS server response * @return end of the name */ static unsigned char * dns_parse_name(unsigned char *query) { unsigned char n; do { n = *query++; /** @see RFC 1035 - 4.1.4. Message compression */ if ((n & 0xc0) == 0xc0) { /* Compressed name */ break; } else { /* Not compressed name */ while (n > 0) { ++query; --n; }; } } while (*query != 0); return query + 1; } /** * Send a DNS query packet. * * @param numdns index of the DNS server in the dns_servers table * @param name hostname to query * @param id index of the hostname in dns_table, used as transaction ID in the * DNS query packet * @return ERR_OK if packet is sent; an err_t indicating the problem otherwise */ static err_t dns_send(u8_t numdns, const char* name, u8_t id) { err_t err; struct dns_hdr *hdr; struct dns_query qry; struct pbuf *p; char *query, *nptr; const char *pHostname; u8_t n; LWIP_DEBUGF(DNS_DEBUG, ("dns_send: dns_servers[%"U16_F"] \"%s\": request\n", (u16_t)(numdns), name)); LWIP_ASSERT("dns server out of array", numdns < DNS_MAX_SERVERS); LWIP_ASSERT("dns server has no IP address set", dns_servers[numdns].addr != 0); /* if here, we have either a new query or a retry on a previous query to process */ p = pbuf_alloc(PBUF_TRANSPORT, SIZEOF_DNS_HDR + DNS_MAX_NAME_LENGTH + SIZEOF_DNS_QUERY, PBUF_RAM); if (p != NULL) { LWIP_ASSERT("pbuf must be in one piece", p->next == NULL); /* fill dns header */ hdr = (struct dns_hdr*)p->payload; memset(hdr, 0, SIZEOF_DNS_HDR); hdr->id = htons(id); hdr->flags1 = DNS_FLAG1_RD; hdr->numquestions = htons(1); query = (char*)hdr + SIZEOF_DNS_HDR; pHostname = name; --pHostname; /* convert hostname into suitable query format. */ do { ++pHostname; nptr = query; ++query; for(n = 0; *pHostname != '.' && *pHostname != 0; ++pHostname) { *query = *pHostname; ++query; ++n; } *nptr = n; } while(*pHostname != 0); *query++='\0'; /* fill dns query */ qry.type = htons(DNS_RRTYPE_A); qry.class = htons(DNS_RRCLASS_IN); MEMCPY( query, &qry, SIZEOF_DNS_QUERY); /* resize pbuf to the exact dns query */ pbuf_realloc(p, (query + SIZEOF_DNS_QUERY) - ((char*)(p->payload))); /* connect to the server for faster receiving */ udp_connect(dns_pcb, &dns_servers[numdns], DNS_SERVER_PORT); /* send dns packet */ err = udp_sendto(dns_pcb, p, &dns_servers[numdns], DNS_SERVER_PORT); /* free pbuf */ pbuf_free(p); } else { err = ERR_MEM; } return err; } /** * dns_check_entry() - see if pEntry has not yet been queried and, if so, sends out a query. * Check an entry in the dns_table: * - send out query for new entries * - retry old pending entries on timeout (also with different servers) * - remove completed entries from the table if their TTL has expired * * @param i index of the dns_table entry to check */ static void dns_check_entry(u8_t i) { struct dns_table_entry *pEntry = &dns_table[i]; LWIP_ASSERT("array index out of bounds", i < DNS_TABLE_SIZE); switch(pEntry->state) { case DNS_STATE_NEW: { /* initialize new entry */ pEntry->state = DNS_STATE_ASKING; pEntry->numdns = 0; pEntry->tmr = 1; pEntry->retries = 0; /* send DNS packet for this entry */ dns_send(pEntry->numdns, pEntry->name, i); break; } case DNS_STATE_ASKING: { if (--pEntry->tmr == 0) { if (++pEntry->retries == DNS_MAX_RETRIES) { if ((pEntry->numdns+1numdns+1].addr!=0)) { /* change of server */ pEntry->numdns++; pEntry->tmr = 1; pEntry->retries = 0; break; } else { LWIP_DEBUGF(DNS_DEBUG, ("dns_check_entry: \"%s\": timeout\n", pEntry->name)); /* call specified callback function if provided */ if (pEntry->found) (*pEntry->found)(pEntry->name, NULL, pEntry->arg); /* flush this entry */ pEntry->state = DNS_STATE_UNUSED; pEntry->found = NULL; break; } } /* wait longer for the next retry */ pEntry->tmr = pEntry->retries; /* send DNS packet for this entry */ dns_send(pEntry->numdns, pEntry->name, i); } break; } case DNS_STATE_DONE: { /* if the time to live is nul */ if (--pEntry->ttl == 0) { LWIP_DEBUGF(DNS_DEBUG, ("dns_check_entry: \"%s\": flush\n", pEntry->name)); /* flush this entry */ pEntry->state = DNS_STATE_UNUSED; pEntry->found = NULL; } break; } case DNS_STATE_UNUSED: /* nothing to do */ break; default: LWIP_ASSERT("unknown dns_table entry state:", 0); break; } } /** * Call dns_check_entry for each entry in dns_table - check all entries. */ static void dns_check_entries(void) { u8_t i; for (i = 0; i < DNS_TABLE_SIZE; ++i) { dns_check_entry(i); } } /** * Receive input function for DNS response packets arriving for the dns UDP pcb. * * @params see udp.h */ static void dns_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port) { u8_t i; char *pHostname; struct dns_hdr *hdr; struct dns_answer ans; struct dns_table_entry *pEntry; u8_t nquestions, nanswers; #if (DNS_USES_STATIC_BUF == 0) u8_t dns_payload[DNS_MSG_SIZE]; #endif /* (DNS_USES_STATIC_BUF == 0) */ #if (DNS_USES_STATIC_BUF == 2) u8_t* dns_payload; #endif /* (DNS_USES_STATIC_BUF == 2) */ LWIP_UNUSED_ARG(arg); LWIP_UNUSED_ARG(pcb); LWIP_UNUSED_ARG(addr); LWIP_UNUSED_ARG(port); /* is the dns message too big ? */ if (p->tot_len > DNS_MSG_SIZE) { LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: pbuf too big\n")); /* free pbuf and return */ goto memerr1; } /* is the dns message big enough ? */ if (p->tot_len < (SIZEOF_DNS_HDR + SIZEOF_DNS_QUERY + SIZEOF_DNS_ANSWER)) { LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: pbuf too small\n")); /* free pbuf and return */ goto memerr1; } #if (DNS_USES_STATIC_BUF == 2) dns_payload = mem_malloc(p->tot_len); if (dns_payload == NULL) { LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: mem_malloc error\n")); /* free pbuf and return */ goto memerr1; } #endif /* (DNS_USES_STATIC_BUF == 2) */ /* copy dns payload inside static buffer for processing */ if (pbuf_copy_partial(p, dns_payload, p->tot_len, 0) == p->tot_len) { /* The ID in the DNS header should be our entry into the name table. */ hdr = (struct dns_hdr*)dns_payload; i = htons(hdr->id); if (i < DNS_TABLE_SIZE) { pEntry = &dns_table[i]; if(pEntry->state == DNS_STATE_ASKING) { /* This entry is now completed. */ pEntry->state = DNS_STATE_DONE; pEntry->err = hdr->flags2 & DNS_FLAG2_ERR_MASK; /* We only care about the question(s) and the answers. The authrr and the extrarr are simply discarded. */ nquestions = htons(hdr->numquestions); nanswers = htons(hdr->numanswers); /* Check for error. If so, call callback to inform. */ if (((hdr->flags1 & DNS_FLAG1_RESPONSE) == 0) || (pEntry->err != 0) || (nquestions != 1)) { LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": error in flags\n", pEntry->name)); /* call callback to indicate error, clean up memory and return */ goto responseerr; } #if DNS_DOES_NAME_CHECK /* Check if the name in the "question" part match with the name in the entry. */ if (dns_compare_name((unsigned char *)(pEntry->name), (unsigned char *)dns_payload + SIZEOF_DNS_HDR) != 0) { LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": response not match to query\n", pEntry->name)); /* call callback to indicate error, clean up memory and return */ goto responseerr; } #endif /* DNS_DOES_NAME_CHECK */ /* Skip the name in the "question" part */ pHostname = (char *) dns_parse_name((unsigned char *)dns_payload + SIZEOF_DNS_HDR) + SIZEOF_DNS_QUERY; while(nanswers > 0) { /* skip answer resource record's host name */ pHostname = (char *) dns_parse_name((unsigned char *)pHostname); /* Check for IP address type and Internet class. Others are discarded. */ MEMCPY(&ans, pHostname, SIZEOF_DNS_ANSWER); if((ntohs(ans.type) == DNS_RRTYPE_A) && (ntohs(ans.class) == DNS_RRCLASS_IN) && (ntohs(ans.len) == sizeof(struct ip_addr)) ) { /* read the answer resource record's TTL, and maximize it if needed */ pEntry->ttl = ntohl(ans.ttl); if (pEntry->ttl > DNS_MAX_TTL) { pEntry->ttl = DNS_MAX_TTL; } /* read the IP address after answer resource record's header */ MEMCPY( &(pEntry->ipaddr), (pHostname+SIZEOF_DNS_ANSWER), sizeof(struct ip_addr)); LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": response = ", pEntry->name)); ip_addr_debug_print(DNS_DEBUG, (&(pEntry->ipaddr))); LWIP_DEBUGF(DNS_DEBUG, ("\n")); /* call specified callback function if provided */ if (pEntry->found) { (*pEntry->found)(pEntry->name, &pEntry->ipaddr, pEntry->arg); } /* deallocate memory and return */ goto memerr2; } else { pHostname = pHostname + SIZEOF_DNS_ANSWER + htons(ans.len); } --nanswers; } LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": error in response\n", pEntry->name)); /* call callback to indicate error, clean up memory and return */ goto responseerr; } } } /* deallocate memory and return */ goto memerr2; responseerr: /* ERROR: call specified callback function with NULL as name to indicate an error */ if (pEntry->found) { (*pEntry->found)(pEntry->name, NULL, pEntry->arg); } /* flush this entry */ pEntry->state = DNS_STATE_UNUSED; pEntry->found = NULL; memerr2: #if (DNS_USES_STATIC_BUF == 2) /* free dns buffer */ mem_free(dns_payload); #endif /* (DNS_USES_STATIC_BUF == 2) */ memerr1: /* free pbuf */ pbuf_free(p); return; } /** * Queues a new hostname to resolve and sends out a DNS query for that hostname * * @param name the hostname that is to be queried * @param found a callback founction to be called on success, failure or timeout * @param callback_arg argument to pass to the callback function * @return @return a err_t return code. */ static err_t dns_enqueue(const char *name, dns_found_callback found, void *callback_arg) { u8_t i; u8_t lseq, lseqi; struct dns_table_entry *pEntry = NULL; /* search an unused entry, or the oldest one */ lseq = lseqi = 0; for (i = 0; i < DNS_TABLE_SIZE; ++i) { pEntry = &dns_table[i]; /* is it an unused entry ? */ if (pEntry->state == DNS_STATE_UNUSED) break; /* check if this is the oldest completed entry */ if (pEntry->state == DNS_STATE_DONE) { if ((dns_seqno - pEntry->seqno) > lseq) { lseq = dns_seqno - pEntry->seqno; lseqi = i; } } } /* if we don't have found an unused entry, use the oldest completed one */ if (i == DNS_TABLE_SIZE) { if ((lseqi >= DNS_TABLE_SIZE) || (dns_table[lseqi].state != DNS_STATE_DONE)) { /* no entry can't be used now, table is full */ LWIP_DEBUGF(DNS_DEBUG, ("dns_enqueue: \"%s\": DNS entries table is full\n", name)); return ERR_MEM; } else { /* use the oldest completed one */ i = lseqi; pEntry = &dns_table[i]; } } /* use this entry */ LWIP_DEBUGF(DNS_DEBUG, ("dns_enqueue: \"%s\": use DNS entry %"U16_F"\n", name, (u16_t)(i))); /* fill the entry */ pEntry->state = DNS_STATE_NEW; pEntry->seqno = dns_seqno++; pEntry->found = found; pEntry->arg = callback_arg; strcpy(pEntry->name, name); /* force to send query without waiting timer */ dns_check_entry(i); /* dns query is enqueued */ return ERR_INPROGRESS; } /** * Resolve a hostname (string) into an IP address. * NON-BLOCKING callback version for use with raw API!!! * * Returns immediately with one of err_t return codes: * - ERR_OK if hostname is a valid IP address string or the host * name is already in the local names table. * - ERR_INPROGRESS enqueue a request to be sent to the DNS server * for resolution if no errors are present. * * @param hostname the hostname that is to be queried * @param addr pointer to a struct ip_addr where to store the address if it is already * cached in the dns_table (only valid if ERR_OK is returned!) * @param found a callback function to be called on success, failure or timeout (only if * ERR_INPROGRESS is returned!) * @param callback_arg argument to pass to the callback function * @return a err_t return code. */ err_t dns_gethostbyname(const char *hostname, struct ip_addr *addr, dns_found_callback found, void *callback_arg) { /* not initialized or no valid server yet, or invalid addr pointer * or invalid hostname or invalid hostname length */ if ((dns_pcb == NULL) || (addr == NULL) || (!hostname) || (!hostname[0]) || (strlen(hostname) >= DNS_MAX_NAME_LENGTH)) { return ERR_VAL; } #if LWIP_HAVE_LOOPIF if (strcmp(hostname,"localhost")==0) { addr->addr = htonl(INADDR_LOOPBACK); return ERR_OK; } #endif /* LWIP_HAVE_LOOPIF */ /* host name already in octet notation? set ip addr and return ERR_OK * already have this address cached? */ if (((addr->addr = inet_addr(hostname)) != INADDR_NONE) || ((addr->addr = dns_lookup(hostname)) != INADDR_NONE)) { return ERR_OK; } /* queue query with specified callback */ return dns_enqueue(hostname, found, callback_arg); } #endif /* LWIP_DNS */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/init.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * Modules initialization * */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #include "lwip/opt.h" #include "lwip/init.h" #include "lwip/stats.h" #include "lwip/sys.h" #include "lwip/mem.h" #include "lwip/memp.h" #include "lwip/pbuf.h" #include "lwip/netif.h" #include "lwip/sockets.h" #include "lwip/ip.h" #include "lwip/raw.h" #include "lwip/udp.h" #include "lwip/tcp.h" #include "lwip/snmp_msg.h" #include "lwip/autoip.h" #include "lwip/igmp.h" #include "lwip/dns.h" #include "netif/etharp.h" /* Compile-time sanity checks for configuration errors. * These can be done independently of LWIP_DEBUG, without penalty. */ #ifndef BYTE_ORDER #error "BYTE_ORDER is not defined, you have to define it in your cc.h" #endif #if (!IP_SOF_BROADCAST && IP_SOF_BROADCAST_RECV) #error "If you want to use broadcast filter per pcb on recv operations, you have to define IP_SOF_BROADCAST=1 in your lwipopts.h" #endif #if (!LWIP_ARP && ARP_QUEUEING) #error "If you want to use ARP Queueing, you have to define LWIP_ARP=1 in your lwipopts.h" #endif #if (!LWIP_UDP && LWIP_UDPLITE) #error "If you want to use UDP Lite, you have to define LWIP_UDP=1 in your lwipopts.h" #endif #if (!LWIP_UDP && LWIP_SNMP) #error "If you want to use SNMP, you have to define LWIP_UDP=1 in your lwipopts.h" #endif #if (!LWIP_UDP && LWIP_DHCP) #error "If you want to use DHCP, you have to define LWIP_UDP=1 in your lwipopts.h" #endif #if (!LWIP_UDP && LWIP_IGMP) #error "If you want to use IGMP, you have to define LWIP_UDP=1 in your lwipopts.h" #endif #if (!LWIP_UDP && LWIP_DNS) #error "If you want to use DNS, you have to define LWIP_UDP=1 in your lwipopts.h" #endif #if (LWIP_ARP && (ARP_TABLE_SIZE > 0x7f)) #error "If you want to use ARP, ARP_TABLE_SIZE must fit in an s8_t, so, you have to reduce it in your lwipopts.h" #endif #if (LWIP_ARP && ARP_QUEUEING && (MEMP_NUM_ARP_QUEUE<=0)) #error "If you want to use ARP Queueing, you have to define MEMP_NUM_ARP_QUEUE>=1 in your lwipopts.h" #endif #if (LWIP_RAW && (MEMP_NUM_RAW_PCB<=0)) #error "If you want to use RAW, you have to define MEMP_NUM_RAW_PCB>=1 in your lwipopts.h" #endif #if (LWIP_UDP && (MEMP_NUM_UDP_PCB<=0)) #error "If you want to use UDP, you have to define MEMP_NUM_UDP_PCB>=1 in your lwipopts.h" #endif #if (LWIP_TCP && (MEMP_NUM_TCP_PCB<=0)) #error "If you want to use TCP, you have to define MEMP_NUM_TCP_PCB>=1 in your lwipopts.h" #endif #if (LWIP_TCP && (TCP_WND > 0xffff)) #error "If you want to use TCP, TCP_WND must fit in an u16_t, so, you have to reduce it in your lwipopts.h" #endif #if (LWIP_TCP && (TCP_SND_QUEUELEN > 0xffff)) #error "If you want to use TCP, TCP_SND_QUEUELEN must fit in an u16_t, so, you have to reduce it in your lwipopts.h" #endif #if (LWIP_TCP && ((TCP_MAXRTX > 12) || (TCP_SYNMAXRTX > 12))) #error "If you want to use TCP, TCP_MAXRTX and TCP_SYNMAXRTX must less or equal to 12 (due to tcp_backoff table), so, you have to reduce them in your lwipopts.h" #endif #if (LWIP_TCP && TCP_LISTEN_BACKLOG && (TCP_DEFAULT_LISTEN_BACKLOG < 0) || (TCP_DEFAULT_LISTEN_BACKLOG > 0xff)) #error "If you want to use TCP backlog, TCP_DEFAULT_LISTEN_BACKLOG must fit into an u8_t" #endif #if (LWIP_IGMP && (MEMP_NUM_IGMP_GROUP<=1)) #error "If you want to use IGMP, you have to define MEMP_NUM_IGMP_GROUP>1 in your lwipopts.h" #endif #if (PPP_SUPPORT && (NO_SYS==1)) #error "If you want to use PPP, you have to define NO_SYS=0 in your lwipopts.h" #endif #if (LWIP_NETIF_API && (NO_SYS==1)) #error "If you want to use NETIF API, you have to define NO_SYS=0 in your lwipopts.h" #endif #if ((LWIP_SOCKET || LWIP_NETCONN) && (NO_SYS==1)) #error "If you want to use Sequential API, you have to define NO_SYS=0 in your lwipopts.h" #endif #if ((LWIP_NETCONN || LWIP_SOCKET) && (MEMP_NUM_TCPIP_MSG_API<=0)) #error "If you want to use Sequential API, you have to define MEMP_NUM_TCPIP_MSG_API>=1 in your lwipopts.h" #endif #if (!LWIP_NETCONN && LWIP_SOCKET) #error "If you want to use Socket API, you have to define LWIP_NETCONN=1 in your lwipopts.h" #endif #if (((!LWIP_DHCP) || (!LWIP_AUTOIP)) && LWIP_DHCP_AUTOIP_COOP) #error "If you want to use DHCP/AUTOIP cooperation mode, you have to define LWIP_DHCP=1 and LWIP_AUTOIP=1 in your lwipopts.h" #endif #if (((!LWIP_DHCP) || (!LWIP_ARP)) && DHCP_DOES_ARP_CHECK) #error "If you want to use DHCP ARP checking, you have to define LWIP_DHCP=1 and LWIP_ARP=1 in your lwipopts.h" #endif #if (!LWIP_ARP && LWIP_AUTOIP) #error "If you want to use AUTOIP, you have to define LWIP_ARP=1 in your lwipopts.h" #endif #if (LWIP_SNMP && (SNMP_CONCURRENT_REQUESTS<=0)) #error "If you want to use SNMP, you have to define SNMP_CONCURRENT_REQUESTS>=1 in your lwipopts.h" #endif #if (LWIP_SNMP && (SNMP_TRAP_DESTINATIONS<=0)) #error "If you want to use SNMP, you have to define SNMP_TRAP_DESTINATIONS>=1 in your lwipopts.h" #endif #if (LWIP_TCP && ((LWIP_EVENT_API && LWIP_CALLBACK_API) || (!LWIP_EVENT_API && !LWIP_CALLBACK_API))) #error "One and exactly one of LWIP_EVENT_API and LWIP_CALLBACK_API has to be enabled in your lwipopts.h" #endif /* There must be sufficient timeouts, taking into account requirements of the subsystems. */ #if ((NO_SYS==0) && (MEMP_NUM_SYS_TIMEOUT < (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (2*LWIP_DHCP) + LWIP_AUTOIP + LWIP_IGMP + LWIP_DNS + PPP_SUPPORT))) #error "MEMP_NUM_SYS_TIMEOUT is too low to accomodate all required timeouts" #endif #if (IP_REASSEMBLY && (MEMP_NUM_REASSDATA > IP_REASS_MAX_PBUFS)) #error "MEMP_NUM_REASSDATA > IP_REASS_MAX_PBUFS doesn't make sense since each struct ip_reassdata must hold 2 pbufs at least!" #endif #if (MEM_LIBC_MALLOC && MEM_USE_POOLS) #error "MEM_LIBC_MALLOC and MEM_USE_POOLS may not both be simultaneously enabled in your lwipopts.h" #endif #if (MEM_USE_POOLS && !MEMP_USE_CUSTOM_POOLS) #error "MEM_USE_POOLS requires custom pools (MEMP_USE_CUSTOM_POOLS) to be enabled in your lwipopts.h" #endif #if (PBUF_POOL_BUFSIZE <= MEM_ALIGNMENT) #error "PBUF_POOL_BUFSIZE must be greater than MEM_ALIGNMENT or the offset may take the full first pbuf" #endif #if (TCP_QUEUE_OOSEQ && !LWIP_TCP) #error "TCP_QUEUE_OOSEQ requires LWIP_TCP" #endif #if (DNS_LOCAL_HOSTLIST && !DNS_LOCAL_HOSTLIST_IS_DYNAMIC && !(defined(DNS_LOCAL_HOSTLIST_INIT))) #error "you have to define define DNS_LOCAL_HOSTLIST_INIT {{'host1', 0x123}, {'host2', 0x234}} to initialize DNS_LOCAL_HOSTLIST" #endif #if PPP_SUPPORT && !PPPOS_SUPPORT & !PPPOE_SUPPORT #error "PPP_SUPPORT needs either PPPOS_SUPPORT or PPPOE_SUPPORT turned on" #endif /* Compile-time checks for deprecated options. */ #ifdef MEMP_NUM_TCPIP_MSG #error "MEMP_NUM_TCPIP_MSG option is deprecated. Remove it from your lwipopts.h." #endif #ifdef MEMP_NUM_API_MSG #error "MEMP_NUM_API_MSG option is deprecated. Remove it from your lwipopts.h." #endif #ifdef TCP_REXMIT_DEBUG #error "TCP_REXMIT_DEBUG option is deprecated. Remove it from your lwipopts.h." #endif #ifdef RAW_STATS #error "RAW_STATS option is deprecated. Remove it from your lwipopts.h." #endif #ifdef ETHARP_QUEUE_FIRST #error "ETHARP_QUEUE_FIRST option is deprecated. Remove it from your lwipopts.h." #endif #ifdef ETHARP_ALWAYS_INSERT #error "ETHARP_ALWAYS_INSERT option is deprecated. Remove it from your lwipopts.h." #endif #if SO_REUSE /* I removed the lot since this was an ugly hack. It broke the raw-API. It also came with many ugly goto's, Christiaan Simons. */ #error "SO_REUSE currently unavailable, this was a hack" #endif #ifdef LWIP_DEBUG static void lwip_sanity_check(void) { /* Warnings */ #if LWIP_NETCONN if (MEMP_NUM_NETCONN > (MEMP_NUM_TCP_PCB+MEMP_NUM_TCP_PCB_LISTEN+MEMP_NUM_UDP_PCB+MEMP_NUM_RAW_PCB)) LWIP_PLATFORM_DIAG(("lwip_sanity_check: WARNING: MEMP_NUM_NETCONN should be less than the sum of MEMP_NUM_{TCP,RAW,UDP}_PCB+MEMP_NUM_TCP_PCB_LISTEN\n")); #endif /* LWIP_NETCONN */ #if LWIP_TCP if (MEMP_NUM_TCP_SEG < TCP_SND_QUEUELEN) LWIP_PLATFORM_DIAG(("lwip_sanity_check: WARNING: MEMP_NUM_TCP_SEG should be at least as big as TCP_SND_QUEUELEN\n")); if (TCP_SND_BUF < 2 * TCP_MSS) LWIP_PLATFORM_DIAG(("lwip_sanity_check: WARNING: TCP_SND_BUF must be at least as much as (2 * TCP_MSS) for things to work smoothly\n")); if (TCP_SND_QUEUELEN < (2 * (TCP_SND_BUF/TCP_MSS))) LWIP_PLATFORM_DIAG(("lwip_sanity_check: WARNING: TCP_SND_QUEUELEN must be at least as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work\n")); if (TCP_SNDLOWAT > TCP_SND_BUF) LWIP_PLATFORM_DIAG(("lwip_sanity_check: WARNING: TCP_SNDLOWAT must be less than or equal to TCP_SND_BUF.\n")); if (TCP_WND > (PBUF_POOL_SIZE*PBUF_POOL_BUFSIZE)) LWIP_PLATFORM_DIAG(("lwip_sanity_check: WARNING: TCP_WND is larger than space provided by PBUF_POOL_SIZE*PBUF_POOL_BUFSIZE\n")); if (TCP_WND < TCP_MSS) LWIP_PLATFORM_DIAG(("lwip_sanity_check: WARNING: TCP_WND is smaller than MSS\n")); #endif /* LWIP_TCP */ } #else /* LWIP_DEBUG */ #define lwip_sanity_check() #endif /* LWIP_DEBUG */ /** * Perform Sanity check of user-configurable values, and initialize all modules. */ void lwip_init(void) { /* Sanity check user-configurable values */ lwip_sanity_check(); /* Modules initialization */ stats_init(); sys_init(); mem_init(); memp_init(); pbuf_init(); netif_init(); #if LWIP_SOCKET lwip_socket_init(); #endif /* LWIP_SOCKET */ ip_init(); #if LWIP_ARP etharp_init(); #endif /* LWIP_ARP */ #if LWIP_RAW raw_init(); #endif /* LWIP_RAW */ #if LWIP_UDP udp_init(); #endif /* LWIP_UDP */ #if LWIP_TCP tcp_init(); #endif /* LWIP_TCP */ #if LWIP_SNMP snmp_init(); #endif /* LWIP_SNMP */ #if LWIP_AUTOIP autoip_init(); #endif /* LWIP_AUTOIP */ #if LWIP_IGMP igmp_init(); #endif /* LWIP_IGMP */ #if LWIP_DNS dns_init(); #endif /* LWIP_DNS */ } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/autoip.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * AutoIP Automatic LinkLocal IP Configuration * */ /* * * Copyright (c) 2007 Dominik Spies * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * Author: Dominik Spies * * This is a AutoIP implementation for the lwIP TCP/IP stack. It aims to conform * with RFC 3927. * * * Please coordinate changes and requests with Dominik Spies * */ /******************************************************************************* * USAGE: * * define LWIP_AUTOIP 1 in your lwipopts.h * * If you don't use tcpip.c (so, don't call, you don't call tcpip_init): * - First, call autoip_init(). * - call autoip_tmr() all AUTOIP_TMR_INTERVAL msces, * that should be defined in autoip.h. * I recommend a value of 100. The value must divide 1000 with a remainder almost 0. * Possible values are 1000, 500, 333, 250, 200, 166, 142, 125, 111, 100 .... * * Without DHCP: * - Call autoip_start() after netif_add(). * * With DHCP: * - define LWIP_DHCP_AUTOIP_COOP 1 in your lwipopts.h. * - Configure your DHCP Client. * */ #include "lwip/opt.h" #if LWIP_AUTOIP /* don't build if not configured for use in lwipopts.h */ #include "lwip/mem.h" #include "lwip/udp.h" #include "lwip/ip_addr.h" #include "lwip/netif.h" #include "lwip/autoip.h" #include "netif/etharp.h" #include #include /* 169.254.0.0 */ #define AUTOIP_NET 0xA9FE0000 /* 169.254.1.0 */ #define AUTOIP_RANGE_START (AUTOIP_NET | 0x0100) /* 169.254.254.255 */ #define AUTOIP_RANGE_END (AUTOIP_NET | 0xFEFF) /** Pseudo random macro based on netif informations. * You could use "rand()" from the C Library if you define LWIP_AUTOIP_RAND in lwipopts.h */ #ifndef LWIP_AUTOIP_RAND #define LWIP_AUTOIP_RAND(netif) ( (((u32_t)((netif->hwaddr[5]) & 0xff) << 24) | \ ((u32_t)((netif->hwaddr[3]) & 0xff) << 16) | \ ((u32_t)((netif->hwaddr[2]) & 0xff) << 8) | \ ((u32_t)((netif->hwaddr[4]) & 0xff))) + \ (netif->autoip?netif->autoip->tried_llipaddr:0)) #endif /* LWIP_AUTOIP_RAND */ /** * Macro that generates the initial IP address to be tried by AUTOIP. * If you want to override this, define it to something else in lwipopts.h. */ #ifndef LWIP_AUTOIP_CREATE_SEED_ADDR #define LWIP_AUTOIP_CREATE_SEED_ADDR(netif) \ htonl(AUTOIP_RANGE_START + ((u32_t)(((u8_t)(netif->hwaddr[4])) | \ ((u32_t)((u8_t)(netif->hwaddr[5]))) << 8))) #endif /* LWIP_AUTOIP_CREATE_SEED_ADDR */ /* static functions */ static void autoip_handle_arp_conflict(struct netif *netif); /* creates a pseudo random LL IP-Address for a network interface */ static void autoip_create_addr(struct netif *netif, struct ip_addr *ipaddr); /* sends an ARP probe */ static err_t autoip_arp_probe(struct netif *netif); /* sends an ARP announce */ static err_t autoip_arp_announce(struct netif *netif); /* configure interface for use with current LL IP-Address */ static err_t autoip_bind(struct netif *netif); /* start sending probes for llipaddr */ static void autoip_start_probing(struct netif *netif); /** * Initialize this module */ void autoip_init(void) { LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, ("autoip_init()\n")); } /** * Handle a IP address conflict after an ARP conflict detection */ static void autoip_handle_arp_conflict(struct netif *netif) { /* Somehow detect if we are defending or retreating */ unsigned char defend = 1; /* tbd */ if(defend) { if(netif->autoip->lastconflict > 0) { /* retreat, there was a conflicting ARP in the last * DEFEND_INTERVAL seconds */ LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("autoip_handle_arp_conflict(): we are defending, but in DEFEND_INTERVAL, retreating\n")); /* TODO: close all TCP sessions */ autoip_start(netif); } else { LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("autoip_handle_arp_conflict(): we are defend, send ARP Announce\n")); autoip_arp_announce(netif); netif->autoip->lastconflict = DEFEND_INTERVAL * AUTOIP_TICKS_PER_SECOND; } } else { LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("autoip_handle_arp_conflict(): we do not defend, retreating\n")); /* TODO: close all TCP sessions */ autoip_start(netif); } } /** * Create an IP-Address out of range 169.254.1.0 to 169.254.254.255 * * @param netif network interface on which create the IP-Address * @param ipaddr ip address to initialize */ static void autoip_create_addr(struct netif *netif, struct ip_addr *ipaddr) { /* Here we create an IP-Address out of range 169.254.1.0 to 169.254.254.255 * compliant to RFC 3927 Section 2.1 * We have 254 * 256 possibilities */ u32_t addr = ntohl(LWIP_AUTOIP_CREATE_SEED_ADDR(netif)); addr += netif->autoip->tried_llipaddr; addr = AUTOIP_NET | (addr & 0xffff); /* Now, 169.254.0.0 <= addr <= 169.254.255.255 */ if (addr < AUTOIP_RANGE_START) { addr += AUTOIP_RANGE_END - AUTOIP_RANGE_START + 1; } if (addr > AUTOIP_RANGE_END) { addr -= AUTOIP_RANGE_END - AUTOIP_RANGE_START + 1; } LWIP_ASSERT("AUTOIP address not in range", (addr >= AUTOIP_RANGE_START) && (addr <= AUTOIP_RANGE_END)); ipaddr->addr = htonl(addr); LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("autoip_create_addr(): tried_llipaddr=%"U16_F", 0x%08"X32_F"\n", (u16_t)(netif->autoip->tried_llipaddr), (u32_t)(ipaddr->addr))); } /** * Sends an ARP probe from a network interface * * @param netif network interface used to send the probe */ static err_t autoip_arp_probe(struct netif *netif) { return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, ðbroadcast, (struct eth_addr *)netif->hwaddr, IP_ADDR_ANY, ðzero, &netif->autoip->llipaddr, ARP_REQUEST); } /** * Sends an ARP announce from a network interface * * @param netif network interface used to send the announce */ static err_t autoip_arp_announce(struct netif *netif) { return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, ðbroadcast, (struct eth_addr *)netif->hwaddr, &netif->autoip->llipaddr, ðzero, &netif->autoip->llipaddr, ARP_REQUEST); } /** * Configure interface for use with current LL IP-Address * * @param netif network interface to configure with current LL IP-Address */ static err_t autoip_bind(struct netif *netif) { struct autoip *autoip = netif->autoip; struct ip_addr sn_mask, gw_addr; LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, ("autoip_bind(netif=%p) %c%c%"U16_F" 0x%08"X32_F"\n", (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num, autoip->llipaddr.addr)); IP4_ADDR(&sn_mask, 255, 255, 0, 0); IP4_ADDR(&gw_addr, 0, 0, 0, 0); netif_set_ipaddr(netif, &autoip->llipaddr); netif_set_netmask(netif, &sn_mask); netif_set_gw(netif, &gw_addr); /* bring the interface up */ netif_set_up(netif); return ERR_OK; } /** * Start AutoIP client * * @param netif network interface on which start the AutoIP client */ err_t autoip_start(struct netif *netif) { struct autoip *autoip = netif->autoip; err_t result = ERR_OK; if(netif_is_up(netif)) { netif_set_down(netif); } /* Set IP-Address, Netmask and Gateway to 0 to make sure that * ARP Packets are formed correctly */ netif->ip_addr.addr = 0; netif->netmask.addr = 0; netif->gw.addr = 0; LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("autoip_start(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); if(autoip == NULL) { /* no AutoIP client attached yet? */ LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, ("autoip_start(): starting new AUTOIP client\n")); autoip = mem_malloc(sizeof(struct autoip)); if(autoip == NULL) { LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, ("autoip_start(): could not allocate autoip\n")); return ERR_MEM; } memset( autoip, 0, sizeof(struct autoip)); /* store this AutoIP client in the netif */ netif->autoip = autoip; LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, ("autoip_start(): allocated autoip")); } else { autoip->state = AUTOIP_STATE_OFF; autoip->ttw = 0; autoip->sent_num = 0; memset(&autoip->llipaddr, 0, sizeof(struct ip_addr)); autoip->lastconflict = 0; } autoip_create_addr(netif, &(autoip->llipaddr)); autoip->tried_llipaddr++; autoip_start_probing(netif); return result; } static void autoip_start_probing(struct netif *netif) { struct autoip *autoip = netif->autoip; autoip->state = AUTOIP_STATE_PROBING; autoip->sent_num = 0; /* time to wait to first probe, this is randomly * choosen out of 0 to PROBE_WAIT seconds. * compliant to RFC 3927 Section 2.2.1 */ autoip->ttw = (u16_t)(LWIP_AUTOIP_RAND(netif) % (PROBE_WAIT * AUTOIP_TICKS_PER_SECOND)); /* * if we tried more then MAX_CONFLICTS we must limit our rate for * accquiring and probing address * compliant to RFC 3927 Section 2.2.1 */ if(autoip->tried_llipaddr > MAX_CONFLICTS) { autoip->ttw = RATE_LIMIT_INTERVAL * AUTOIP_TICKS_PER_SECOND; } } /** * Handle a possible change in the network configuration. * * If there is an AutoIP address configured, take the interface down * and begin probing with the same address. */ void autoip_network_changed(struct netif *netif) { if (netif->autoip && netif->autoip->state != AUTOIP_STATE_OFF) { netif_set_down(netif); autoip_start_probing(netif); } } /** * Stop AutoIP client * * @param netif network interface on which stop the AutoIP client */ err_t autoip_stop(struct netif *netif) { netif->autoip->state = AUTOIP_STATE_OFF; netif_set_down(netif); return ERR_OK; } /** * Has to be called in loop every AUTOIP_TMR_INTERVAL milliseconds */ void autoip_tmr() { struct netif *netif = netif_list; /* loop through netif's */ while (netif != NULL) { /* only act on AutoIP configured interfaces */ if (netif->autoip != NULL) { if(netif->autoip->lastconflict > 0) { netif->autoip->lastconflict--; } LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, ("autoip_tmr() AutoIP-State: %"U16_F", ttw=%"U16_F"\n", (u16_t)(netif->autoip->state), netif->autoip->ttw)); switch(netif->autoip->state) { case AUTOIP_STATE_PROBING: if(netif->autoip->ttw > 0) { netif->autoip->ttw--; } else { if(netif->autoip->sent_num >= PROBE_NUM) { netif->autoip->state = AUTOIP_STATE_ANNOUNCING; netif->autoip->sent_num = 0; netif->autoip->ttw = ANNOUNCE_WAIT * AUTOIP_TICKS_PER_SECOND; } else { autoip_arp_probe(netif); LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, ("autoip_tmr() PROBING Sent Probe\n")); netif->autoip->sent_num++; /* calculate time to wait to next probe */ netif->autoip->ttw = (u16_t)((LWIP_AUTOIP_RAND(netif) % ((PROBE_MAX - PROBE_MIN) * AUTOIP_TICKS_PER_SECOND) ) + PROBE_MIN * AUTOIP_TICKS_PER_SECOND); } } break; case AUTOIP_STATE_ANNOUNCING: if(netif->autoip->ttw > 0) { netif->autoip->ttw--; } else { if(netif->autoip->sent_num == 0) { /* We are here the first time, so we waited ANNOUNCE_WAIT seconds * Now we can bind to an IP address and use it. * * autoip_bind calls netif_set_up. This triggers a gratuitous ARP * which counts as an announcement. */ autoip_bind(netif); } else { autoip_arp_announce(netif); LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, ("autoip_tmr() ANNOUNCING Sent Announce\n")); } netif->autoip->ttw = ANNOUNCE_INTERVAL * AUTOIP_TICKS_PER_SECOND; netif->autoip->sent_num++; if(netif->autoip->sent_num >= ANNOUNCE_NUM) { netif->autoip->state = AUTOIP_STATE_BOUND; netif->autoip->sent_num = 0; netif->autoip->ttw = 0; } } break; } } /* proceed to next network interface */ netif = netif->next; } } /** * Handles every incoming ARP Packet, called by etharp_arp_input. * * @param netif network interface to use for autoip processing * @param hdr Incoming ARP packet */ void autoip_arp_reply(struct netif *netif, struct etharp_hdr *hdr) { LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, ("autoip_arp_reply()\n")); if ((netif->autoip != NULL) && (netif->autoip->state != AUTOIP_STATE_OFF)) { /* when ip.src == llipaddr && hw.src != netif->hwaddr * * when probing ip.dst == llipaddr && hw.src != netif->hwaddr * we have a conflict and must solve it */ struct ip_addr sipaddr, dipaddr; struct eth_addr netifaddr; netifaddr.addr[0] = netif->hwaddr[0]; netifaddr.addr[1] = netif->hwaddr[1]; netifaddr.addr[2] = netif->hwaddr[2]; netifaddr.addr[3] = netif->hwaddr[3]; netifaddr.addr[4] = netif->hwaddr[4]; netifaddr.addr[5] = netif->hwaddr[5]; /* Copy struct ip_addr2 to aligned ip_addr, to support compilers without * structure packing (not using structure copy which breaks strict-aliasing rules). */ SMEMCPY(&sipaddr, &hdr->sipaddr, sizeof(sipaddr)); SMEMCPY(&dipaddr, &hdr->dipaddr, sizeof(dipaddr)); if ((netif->autoip->state == AUTOIP_STATE_PROBING) || ((netif->autoip->state == AUTOIP_STATE_ANNOUNCING) && (netif->autoip->sent_num == 0))) { /* RFC 3927 Section 2.2.1: * from beginning to after ANNOUNCE_WAIT * seconds we have a conflict if * ip.src == llipaddr OR * ip.dst == llipaddr && hw.src != own hwaddr */ if ((ip_addr_cmp(&sipaddr, &netif->autoip->llipaddr)) || (ip_addr_cmp(&dipaddr, &netif->autoip->llipaddr) && !eth_addr_cmp(&netifaddr, &hdr->shwaddr))) { LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING, ("autoip_arp_reply(): Probe Conflict detected\n")); autoip_start(netif); } } else { /* RFC 3927 Section 2.5: * in any state we have a conflict if * ip.src == llipaddr && hw.src != own hwaddr */ if (ip_addr_cmp(&sipaddr, &netif->autoip->llipaddr) && !eth_addr_cmp(&netifaddr, &hdr->shwaddr)) { LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING, ("autoip_arp_reply(): Conflicting ARP-Packet detected\n")); autoip_handle_arp_conflict(netif); } } } } #endif /* LWIP_AUTOIP */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/icmp.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * ICMP - Internet Control Message Protocol * */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ /* Some ICMP messages should be passed to the transport protocols. This is not implemented. */ #include "lwip/opt.h" #if LWIP_ICMP /* don't build if not configured for use in lwipopts.h */ #include "lwip/icmp.h" #include "lwip/inet.h" #include "lwip/inet_chksum.h" #include "lwip/ip.h" #include "lwip/def.h" #include "lwip/stats.h" #include "lwip/snmp.h" #include /** Small optimization: set to 0 if incoming PBUF_POOL pbuf always can be * used to modify and send a response packet (and to 1 if this is not the case, * e.g. when link header is stripped of when receiving) */ #ifndef LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN #define LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN 1 #endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */ /* The amount of data from the original packet to return in a dest-unreachable */ #define ICMP_DEST_UNREACH_DATASIZE 8 static void icmp_send_response(struct pbuf *p, u8_t type, u8_t code); /** * Processes ICMP input packets, called from ip_input(). * * Currently only processes icmp echo requests and sends * out the echo response. * * @param p the icmp echo request packet, p->payload pointing to the ip header * @param inp the netif on which this packet was received */ void icmp_input(struct pbuf *p, struct netif *inp) { u8_t type; #ifdef LWIP_DEBUG u8_t code; #endif /* LWIP_DEBUG */ struct icmp_echo_hdr *iecho; struct ip_hdr *iphdr; struct ip_addr tmpaddr; s16_t hlen; ICMP_STATS_INC(icmp.recv); snmp_inc_icmpinmsgs(); iphdr = p->payload; hlen = IPH_HL(iphdr) * 4; if (pbuf_header(p, -hlen) || (p->tot_len < sizeof(u16_t)*2)) { LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: short ICMP (%"U16_F" bytes) received\n", p->tot_len)); goto lenerr; } type = *((u8_t *)p->payload); #ifdef LWIP_DEBUG code = *(((u8_t *)p->payload)+1); #endif /* LWIP_DEBUG */ switch (type) { case ICMP_ECHO: #if !LWIP_MULTICAST_PING || !LWIP_BROADCAST_PING { int accepted = 1; #if !LWIP_MULTICAST_PING /* multicast destination address? */ if (ip_addr_ismulticast(&iphdr->dest)) { accepted = 0; } #endif /* LWIP_MULTICAST_PING */ #if !LWIP_BROADCAST_PING /* broadcast destination address? */ if (ip_addr_isbroadcast(&iphdr->dest, inp)) { accepted = 0; } #endif /* LWIP_BROADCAST_PING */ /* broadcast or multicast destination address not acceptd? */ if (!accepted) { LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: Not echoing to multicast or broadcast pings\n")); ICMP_STATS_INC(icmp.err); pbuf_free(p); return; } } #endif /* !LWIP_MULTICAST_PING || !LWIP_BROADCAST_PING */ LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ping\n")); if (p->tot_len < sizeof(struct icmp_echo_hdr)) { LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: bad ICMP echo received\n")); goto lenerr; } if (inet_chksum_pbuf(p) != 0) { LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: checksum failed for received ICMP echo\n")); pbuf_free(p); ICMP_STATS_INC(icmp.chkerr); snmp_inc_icmpinerrors(); return; } #if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN if (pbuf_header(p, (PBUF_IP_HLEN + PBUF_LINK_HLEN))) { /* p is not big enough to contain link headers * allocate a new one and copy p into it */ struct pbuf *r; /* switch p->payload to ip header */ if (pbuf_header(p, hlen)) { LWIP_ASSERT("icmp_input: moving p->payload to ip header failed\n", 0); goto memerr; } /* allocate new packet buffer with space for link headers */ r = pbuf_alloc(PBUF_LINK, p->tot_len, PBUF_RAM); if (r == NULL) { LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: allocating new pbuf failed\n")); goto memerr; } LWIP_ASSERT("check that first pbuf can hold struct the ICMP header", (r->len >= hlen + sizeof(struct icmp_echo_hdr))); /* copy the whole packet including ip header */ if (pbuf_copy(r, p) != ERR_OK) { LWIP_ASSERT("icmp_input: copying to new pbuf failed\n", 0); goto memerr; } iphdr = r->payload; /* switch r->payload back to icmp header */ if (pbuf_header(r, -hlen)) { LWIP_ASSERT("icmp_input: restoring original p->payload failed\n", 0); goto memerr; } /* free the original p */ pbuf_free(p); /* we now have an identical copy of p that has room for link headers */ p = r; } else { /* restore p->payload to point to icmp header */ if (pbuf_header(p, -(s16_t)(PBUF_IP_HLEN + PBUF_LINK_HLEN))) { LWIP_ASSERT("icmp_input: restoring original p->payload failed\n", 0); goto memerr; } } #endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */ /* At this point, all checks are OK. */ /* We generate an answer by switching the dest and src ip addresses, * setting the icmp type to ECHO_RESPONSE and updating the checksum. */ iecho = p->payload; tmpaddr.addr = iphdr->src.addr; iphdr->src.addr = iphdr->dest.addr; iphdr->dest.addr = tmpaddr.addr; ICMPH_TYPE_SET(iecho, ICMP_ER); /* adjust the checksum */ if (iecho->chksum >= htons(0xffff - (ICMP_ECHO << 8))) { iecho->chksum += htons(ICMP_ECHO << 8) + 1; } else { iecho->chksum += htons(ICMP_ECHO << 8); } /* Set the correct TTL and recalculate the header checksum. */ IPH_TTL_SET(iphdr, ICMP_TTL); IPH_CHKSUM_SET(iphdr, 0); #if CHECKSUM_GEN_IP IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, IP_HLEN)); #endif /* CHECKSUM_GEN_IP */ ICMP_STATS_INC(icmp.xmit); /* increase number of messages attempted to send */ snmp_inc_icmpoutmsgs(); /* increase number of echo replies attempted to send */ snmp_inc_icmpoutechoreps(); if(pbuf_header(p, hlen)) { LWIP_ASSERT("Can't move over header in packet", 0); } else { err_t ret; ret = ip_output_if(p, &(iphdr->src), IP_HDRINCL, ICMP_TTL, 0, IP_PROTO_ICMP, inp); if (ret != ERR_OK) { LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ip_output_if returned an error: %c.\n", ret)); } } break; default: LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ICMP type %"S16_F" code %"S16_F" not supported.\n", (s16_t)type, (s16_t)code)); ICMP_STATS_INC(icmp.proterr); ICMP_STATS_INC(icmp.drop); } pbuf_free(p); return; lenerr: pbuf_free(p); ICMP_STATS_INC(icmp.lenerr); snmp_inc_icmpinerrors(); return; #if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN memerr: pbuf_free(p); ICMP_STATS_INC(icmp.err); snmp_inc_icmpinerrors(); return; #endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */ } /** * Send an icmp 'destination unreachable' packet, called from ip_input() if * the transport layer protocol is unknown and from udp_input() if the local * port is not bound. * * @param p the input packet for which the 'unreachable' should be sent, * p->payload pointing to the IP header * @param t type of the 'unreachable' packet */ void icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t) { icmp_send_response(p, ICMP_DUR, t); } #if IP_FORWARD || IP_REASSEMBLY /** * Send a 'time exceeded' packet, called from ip_forward() if TTL is 0. * * @param p the input packet for which the 'time exceeded' should be sent, * p->payload pointing to the IP header * @param t type of the 'time exceeded' packet */ void icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t) { icmp_send_response(p, ICMP_TE, t); } #endif /* IP_FORWARD || IP_REASSEMBLY */ /** * Send an icmp packet in response to an incoming packet. * * @param p the input packet for which the 'unreachable' should be sent, * p->payload pointing to the IP header * @param type Type of the ICMP header * @param code Code of the ICMP header */ static void icmp_send_response(struct pbuf *p, u8_t type, u8_t code) { struct pbuf *q; struct ip_hdr *iphdr; /* we can use the echo header here */ struct icmp_echo_hdr *icmphdr; /* ICMP header + IP header + 8 bytes of data */ q = pbuf_alloc(PBUF_IP, sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE, PBUF_RAM); if (q == NULL) { LWIP_DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded: failed to allocate pbuf for ICMP packet.\n")); return; } LWIP_ASSERT("check that first pbuf can hold icmp message", (q->len >= (sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE))); iphdr = p->payload; LWIP_DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded from ")); ip_addr_debug_print(ICMP_DEBUG, &(iphdr->src)); LWIP_DEBUGF(ICMP_DEBUG, (" to ")); ip_addr_debug_print(ICMP_DEBUG, &(iphdr->dest)); LWIP_DEBUGF(ICMP_DEBUG, ("\n")); icmphdr = q->payload; icmphdr->type = type; icmphdr->code = code; icmphdr->id = 0; icmphdr->seqno = 0; /* copy fields from original packet */ SMEMCPY((u8_t *)q->payload + sizeof(struct icmp_echo_hdr), (u8_t *)p->payload, IP_HLEN + ICMP_DEST_UNREACH_DATASIZE); /* calculate checksum */ icmphdr->chksum = 0; icmphdr->chksum = inet_chksum(icmphdr, q->len); ICMP_STATS_INC(icmp.xmit); /* increase number of messages attempted to send */ snmp_inc_icmpoutmsgs(); /* increase number of destination unreachable messages attempted to send */ snmp_inc_icmpouttimeexcds(); ip_output(q, NULL, &(iphdr->src), ICMP_TTL, 0, IP_PROTO_ICMP); pbuf_free(q); } #endif /* LWIP_ICMP */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/igmp.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * IGMP - Internet Group Management Protocol * */ /* * Copyright (c) 2002 CITEL Technologies Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of CITEL Technologies Ltd nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY CITEL TECHNOLOGIES AND CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL CITEL TECHNOLOGIES OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * This file is a contribution to the lwIP TCP/IP stack. * The Swedish Institute of Computer Science and Adam Dunkels * are specifically granted permission to redistribute this * source code. */ /*------------------------------------------------------------- Note 1) Although the rfc requires V1 AND V2 capability we will only support v2 since now V1 is very old (August 1989) V1 can be added if required a debug print and statistic have been implemented to show this up. ------------------------------------------------------------- ------------------------------------------------------------- Note 2) A query for a specific group address (as opposed to ALLHOSTS) has now been implemented as I am unsure if it is required a debug print and statistic have been implemented to show this up. ------------------------------------------------------------- ------------------------------------------------------------- Note 3) The router alert rfc 2113 is implemented in outgoing packets but not checked rigorously incoming ------------------------------------------------------------- Steve Reynolds ------------------------------------------------------------*/ /*----------------------------------------------------------------------------- * RFC 988 - Host extensions for IP multicasting - V0 * RFC 1054 - Host extensions for IP multicasting - * RFC 1112 - Host extensions for IP multicasting - V1 * RFC 2236 - Internet Group Management Protocol, Version 2 - V2 <- this code is based on this RFC (it's the "de facto" standard) * RFC 3376 - Internet Group Management Protocol, Version 3 - V3 * RFC 4604 - Using Internet Group Management Protocol Version 3... - V3+ * RFC 2113 - IP Router Alert Option - *----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------- * Includes *----------------------------------------------------------------------------*/ #include "lwip/opt.h" #if LWIP_IGMP /* don't build if not configured for use in lwipopts.h */ #include "lwip/igmp.h" #include "lwip/debug.h" #include "lwip/def.h" #include "lwip/mem.h" #include "lwip/ip.h" #include "lwip/inet.h" #include "lwip/inet_chksum.h" #include "lwip/netif.h" #include "lwip/icmp.h" #include "lwip/udp.h" #include "lwip/tcp.h" #include "lwip/stats.h" #include "string.h" /*----------------------------------------------------------------------------- * Globales *----------------------------------------------------------------------------*/ static struct igmp_group* igmp_group_list; static struct ip_addr allsystems; static struct ip_addr allrouters; /** * Initialize the IGMP module */ void igmp_init(void) { LWIP_DEBUGF(IGMP_DEBUG, ("igmp_init: initializing\n")); IP4_ADDR(&allsystems, 224, 0, 0, 1); IP4_ADDR(&allrouters, 224, 0, 0, 2); } #ifdef LWIP_DEBUG /** * Dump global IGMP groups list */ void igmp_dump_group_list() { struct igmp_group *group = igmp_group_list; while (group != NULL) { LWIP_DEBUGF(IGMP_DEBUG, ("igmp_dump_group_list: [%"U32_F"] ", (u32_t)(group->group_state))); ip_addr_debug_print(IGMP_DEBUG, &group->group_address); LWIP_DEBUGF(IGMP_DEBUG, (" on if %p\n", group->interface)); group = group->next; } LWIP_DEBUGF(IGMP_DEBUG, ("\n")); } #else #define igmp_dump_group_list() #endif /* LWIP_DEBUG */ /** * Start IGMP processing on interface * * @param netif network interface on which start IGMP processing */ err_t igmp_start(struct netif *netif) { struct igmp_group* group; LWIP_DEBUGF(IGMP_DEBUG, ("igmp_start: starting IGMP processing on if %p\n", netif)); group = igmp_lookup_group(netif, &allsystems); if (group != NULL) { group->group_state = IGMP_GROUP_IDLE_MEMBER; group->use++; /* Allow the igmp messages at the MAC level */ if (netif->igmp_mac_filter != NULL) { LWIP_DEBUGF(IGMP_DEBUG, ("igmp_start: igmp_mac_filter(ADD ")); ip_addr_debug_print(IGMP_DEBUG, &allsystems); LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", netif)); netif->igmp_mac_filter( netif, &allsystems, IGMP_ADD_MAC_FILTER); } return ERR_OK; } return ERR_MEM; } /** * Stop IGMP processing on interface * * @param netif network interface on which stop IGMP processing */ err_t igmp_stop(struct netif *netif) { struct igmp_group *group = igmp_group_list; struct igmp_group *prev = NULL; struct igmp_group *next; /* look for groups joined on this interface further down the list */ while (group != NULL) { next = group->next; /* is it a group joined on this interface? */ if (group->interface == netif) { /* is it the first group of the list? */ if (group == igmp_group_list) { igmp_group_list = next; } /* is there a "previous" group defined? */ if (prev != NULL) { prev->next = next; } /* disable the group at the MAC level */ if (netif->igmp_mac_filter != NULL) { LWIP_DEBUGF(IGMP_DEBUG, ("igmp_stop: igmp_mac_filter(DEL ")); ip_addr_debug_print(IGMP_DEBUG, &group->group_address); LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", netif)); netif->igmp_mac_filter(netif, &(group->group_address), IGMP_DEL_MAC_FILTER); } /* free group */ memp_free(MEMP_IGMP_GROUP, group); } else { /* change the "previous" */ prev = group; } /* move to "next" */ group = next; } return ERR_OK; } /** * Report IGMP memberships for this interface * * @param netif network interface on which report IGMP memberships */ void igmp_report_groups( struct netif *netif) { struct igmp_group *group = igmp_group_list; LWIP_DEBUGF(IGMP_DEBUG, ("igmp_report_groups: sending IGMP reports on if %p\n", netif)); while (group != NULL) { if (group->interface == netif) { igmp_delaying_member( group, IGMP_JOIN_DELAYING_MEMBER_TMR); } group = group->next; } } /** * Search for a group in the global igmp_group_list * * @param ifp the network interface for which to look * @param addr the group ip address to search for * @return a struct igmp_group* if the group has been found, * NULL if the group wasn't found. */ struct igmp_group * igmp_lookfor_group(struct netif *ifp, struct ip_addr *addr) { struct igmp_group *group = igmp_group_list; while (group != NULL) { if ((group->interface == ifp) && (ip_addr_cmp(&(group->group_address), addr))) { return group; } group = group->next; } /* to be clearer, we return NULL here instead of * 'group' (which is also NULL at this point). */ return NULL; } /** * Search for a specific igmp group and create a new one if not found- * * @param ifp the network interface for which to look * @param addr the group ip address to search * @return a struct igmp_group*, * NULL on memory error. */ struct igmp_group * igmp_lookup_group(struct netif *ifp, struct ip_addr *addr) { struct igmp_group *group = igmp_group_list; /* Search if the group already exists */ group = igmp_lookfor_group(ifp, addr); if (group != NULL) { /* Group already exists. */ return group; } /* Group doesn't exist yet, create a new one */ group = memp_malloc(MEMP_IGMP_GROUP); if (group != NULL) { group->interface = ifp; ip_addr_set(&(group->group_address), addr); group->timer = 0; /* Not running */ group->group_state = IGMP_GROUP_NON_MEMBER; group->last_reporter_flag = 0; group->use = 0; group->next = igmp_group_list; igmp_group_list = group; } LWIP_DEBUGF(IGMP_DEBUG, ("igmp_lookup_group: %sallocated a new group with address ", (group?"":"impossible to "))); ip_addr_debug_print(IGMP_DEBUG, addr); LWIP_DEBUGF(IGMP_DEBUG, (" on if %p\n", ifp)); return group; } /** * Remove a group in the global igmp_group_list * * @param group the group to remove from the global igmp_group_list * @return ERR_OK if group was removed from the list, an err_t otherwise */ err_t igmp_remove_group(struct igmp_group *group) { err_t err = ERR_OK; /* Is it the first group? */ if (igmp_group_list == group) { igmp_group_list = group->next; } else { /* look for group further down the list */ struct igmp_group *tmpGroup; for (tmpGroup = igmp_group_list; tmpGroup != NULL; tmpGroup = tmpGroup->next) { if (tmpGroup->next == group) { tmpGroup->next = group->next; break; } } /* Group not found in the global igmp_group_list */ if (tmpGroup == NULL) err = ERR_ARG; } /* free group */ memp_free(MEMP_IGMP_GROUP, group); return err; } /** * Called from ip_input() if a new IGMP packet is received. * * @param p received igmp packet, p->payload pointing to the ip header * @param inp network interface on which the packet was received * @param dest destination ip address of the igmp packet */ void igmp_input(struct pbuf *p, struct netif *inp, struct ip_addr *dest) { struct ip_hdr * iphdr; struct igmp_msg* igmp; struct igmp_group* group; struct igmp_group* groupref; /* Note that the length CAN be greater than 8 but only 8 are used - All are included in the checksum */ iphdr = p->payload; if (pbuf_header(p, -(s16_t)(IPH_HL(iphdr) * 4)) || (p->len < IGMP_MINLEN)) { pbuf_free(p); IGMP_STATS_INC(igmp.lenerr); LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: length error\n")); return; } LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: message from ")); ip_addr_debug_print(IGMP_DEBUG, &(iphdr->src)); LWIP_DEBUGF(IGMP_DEBUG, (" to address ")); ip_addr_debug_print(IGMP_DEBUG, &(iphdr->dest)); LWIP_DEBUGF(IGMP_DEBUG, (" on if %p\n", inp)); /* Now calculate and check the checksum */ igmp = (struct igmp_msg *)p->payload; if (inet_chksum(igmp, p->len)) { pbuf_free(p); IGMP_STATS_INC(igmp.chkerr); LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: checksum error\n")); return; } /* Packet is ok so find an existing group */ group = igmp_lookfor_group(inp, dest); /* use the incoming IP address! */ /* If group can be found or create... */ if (!group) { pbuf_free(p); LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: IGMP frame not for us\n")); return; } /* NOW ACT ON THE INCOMING MESSAGE TYPE... */ switch (igmp->igmp_msgtype) { case IGMP_MEMB_QUERY: { /* IGMP_MEMB_QUERY to the "all systems" address ? */ if ((ip_addr_cmp(dest, &allsystems)) && (igmp->igmp_group_address.addr == 0)) { /* THIS IS THE GENERAL QUERY */ LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: General IGMP_MEMB_QUERY on \"ALL SYSTEMS\" address (224.0.0.1) [igmp_maxresp=%i]\n", (int)(igmp->igmp_maxresp))); if (igmp->igmp_maxresp == 0) { IGMP_STATS_INC(igmp.v1_rxed); LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: got an all hosts query with time== 0 - this is V1 and not implemented - treat as v2\n")); igmp->igmp_maxresp = IGMP_V1_DELAYING_MEMBER_TMR; } IGMP_STATS_INC(igmp.group_query_rxed); groupref = igmp_group_list; while (groupref) { /* Do not send messages on the all systems group address! */ if ((groupref->interface == inp) && (!(ip_addr_cmp(&(groupref->group_address), &allsystems)))) { igmp_delaying_member( groupref, igmp->igmp_maxresp); } groupref = groupref->next; } } else { /* IGMP_MEMB_QUERY to a specific group ? */ if (group->group_address.addr != 0) { LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: IGMP_MEMB_QUERY to a specific group ")); ip_addr_debug_print(IGMP_DEBUG, &group->group_address); if (ip_addr_cmp (dest, &allsystems)) { LWIP_DEBUGF(IGMP_DEBUG, (" using \"ALL SYSTEMS\" address (224.0.0.1) [igmp_maxresp=%i]\n", (int)(igmp->igmp_maxresp))); /* we first need to re-lookfor the group since we used dest last time */ group = igmp_lookfor_group(inp, &igmp->igmp_group_address); } else { LWIP_DEBUGF(IGMP_DEBUG, (" with the group address as destination [igmp_maxresp=%i]\n", (int)(igmp->igmp_maxresp))); } if (group != NULL) { IGMP_STATS_INC(igmp.unicast_query); igmp_delaying_member( group, igmp->igmp_maxresp); } } } break; } case IGMP_V2_MEMB_REPORT: { LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: IGMP_V2_MEMB_REPORT\n")); IGMP_STATS_INC(igmp.report_rxed); if (group->group_state == IGMP_GROUP_DELAYING_MEMBER) { /* This is on a specific group we have already looked up */ group->timer = 0; /* stopped */ group->group_state = IGMP_GROUP_IDLE_MEMBER; group->last_reporter_flag = 0; } break; } default: { LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: unexpected msg %d in state %d on group %p on if %p\n", igmp->igmp_msgtype, group->group_state, &group, group->interface)); break; } } pbuf_free(p); return; } /** * Join a group on one network interface. * * @param ifaddr ip address of the network interface which should join a new group * @param groupaddr the ip address of the group which to join * @return ERR_OK if group was joined on the netif(s), an err_t otherwise */ err_t igmp_joingroup(struct ip_addr *ifaddr, struct ip_addr *groupaddr) { err_t err = ERR_VAL; /* no matching interface */ struct igmp_group *group; struct netif *netif; /* make sure it is multicast address */ LWIP_ERROR("igmp_joingroup: attempt to join non-multicast address", ip_addr_ismulticast(groupaddr), return ERR_VAL;); LWIP_ERROR("igmp_joingroup: attempt to join allsystems address", (!ip_addr_cmp(groupaddr, &allsystems)), return ERR_VAL;); /* loop through netif's */ netif = netif_list; while (netif != NULL) { /* Should we join this interface ? */ if ((netif->flags & NETIF_FLAG_IGMP) && ((ip_addr_isany(ifaddr) || ip_addr_cmp(&(netif->ip_addr), ifaddr)))) { /* find group or create a new one if not found */ group = igmp_lookup_group(netif, groupaddr); if (group != NULL) { /* This should create a new group, check the state to make sure */ if (group->group_state != IGMP_GROUP_NON_MEMBER) { LWIP_DEBUGF(IGMP_DEBUG, ("igmp_joingroup: join to group not in state IGMP_GROUP_NON_MEMBER\n")); } else { /* OK - it was new group */ LWIP_DEBUGF(IGMP_DEBUG, ("igmp_joingroup: join to new group: ")); ip_addr_debug_print(IGMP_DEBUG, groupaddr); LWIP_DEBUGF(IGMP_DEBUG, ("\n")); /* If first use of the group, allow the group at the MAC level */ if ((group->use==0) && (netif->igmp_mac_filter != NULL)) { LWIP_DEBUGF(IGMP_DEBUG, ("igmp_joingroup: igmp_mac_filter(ADD ")); ip_addr_debug_print(IGMP_DEBUG, groupaddr); LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", netif)); netif->igmp_mac_filter(netif, groupaddr, IGMP_ADD_MAC_FILTER); } IGMP_STATS_INC(igmp.join_sent); igmp_send(group, IGMP_V2_MEMB_REPORT); igmp_start_timer(group, IGMP_JOIN_DELAYING_MEMBER_TMR); /* Need to work out where this timer comes from */ group->group_state = IGMP_GROUP_DELAYING_MEMBER; } /* Increment group use */ group->use++; /* Join on this interface */ err = ERR_OK; } else { /* Return an error even if some network interfaces are joined */ /** @todo undo any other netif already joined */ LWIP_DEBUGF(IGMP_DEBUG, ("igmp_joingroup: Not enought memory to join to group\n")); return ERR_MEM; } } /* proceed to next network interface */ netif = netif->next; } return err; } /** * Leave a group on one network interface. * * @param ifaddr ip address of the network interface which should leave a group * @param groupaddr the ip address of the group which to leave * @return ERR_OK if group was left on the netif(s), an err_t otherwise */ err_t igmp_leavegroup(struct ip_addr *ifaddr, struct ip_addr *groupaddr) { err_t err = ERR_VAL; /* no matching interface */ struct igmp_group *group; struct netif *netif; /* make sure it is multicast address */ LWIP_ERROR("igmp_leavegroup: attempt to leave non-multicast address", ip_addr_ismulticast(groupaddr), return ERR_VAL;); LWIP_ERROR("igmp_leavegroup: attempt to leave allsystems address", (!ip_addr_cmp(groupaddr, &allsystems)), return ERR_VAL;); /* loop through netif's */ netif = netif_list; while (netif != NULL) { /* Should we leave this interface ? */ if ((netif->flags & NETIF_FLAG_IGMP) && ((ip_addr_isany(ifaddr) || ip_addr_cmp(&(netif->ip_addr), ifaddr)))) { /* find group */ group = igmp_lookfor_group(netif, groupaddr); if (group != NULL) { /* Only send a leave if the flag is set according to the state diagram */ LWIP_DEBUGF(IGMP_DEBUG, ("igmp_leavegroup: Leaving group: ")); ip_addr_debug_print(IGMP_DEBUG, groupaddr); LWIP_DEBUGF(IGMP_DEBUG, ("\n")); /* If there is no other use of the group */ if (group->use <= 1) { /* If we are the last reporter for this group */ if (group->last_reporter_flag) { LWIP_DEBUGF(IGMP_DEBUG, ("igmp_leavegroup: sending leaving group\n")); IGMP_STATS_INC(igmp.leave_sent); igmp_send(group, IGMP_LEAVE_GROUP); } /* Disable the group at the MAC level */ if (netif->igmp_mac_filter != NULL) { LWIP_DEBUGF(IGMP_DEBUG, ("igmp_leavegroup: igmp_mac_filter(DEL ")); ip_addr_debug_print(IGMP_DEBUG, groupaddr); LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", netif)); netif->igmp_mac_filter(netif, groupaddr, IGMP_DEL_MAC_FILTER); } LWIP_DEBUGF(IGMP_DEBUG, ("igmp_leavegroup: remove group: ")); ip_addr_debug_print(IGMP_DEBUG, groupaddr); LWIP_DEBUGF(IGMP_DEBUG, ("\n")); /* Free the group */ igmp_remove_group(group); } else { /* Decrement group use */ group->use--; } /* Leave on this interface */ err = ERR_OK; } else { /* It's not a fatal error on "leavegroup" */ LWIP_DEBUGF(IGMP_DEBUG, ("igmp_leavegroup: not member of group\n")); } } /* proceed to next network interface */ netif = netif->next; } return err; } /** * The igmp timer function (both for NO_SYS=1 and =0) * Should be called every IGMP_TMR_INTERVAL milliseconds (100 ms is default). */ void igmp_tmr(void) { struct igmp_group *group = igmp_group_list; while (group != NULL) { if (group->timer != 0) { group->timer -= 1; if (group->timer == 0) { igmp_timeout(group); } } group = group->next; } } /** * Called if a timeout for one group is reached. * Sends a report for this group. * * @param group an igmp_group for which a timeout is reached */ void igmp_timeout(struct igmp_group *group) { /* If the state is IGMP_GROUP_DELAYING_MEMBER then we send a report for this group */ if (group->group_state == IGMP_GROUP_DELAYING_MEMBER) { LWIP_DEBUGF(IGMP_DEBUG, ("igmp_timeout: report membership for group with address ")); ip_addr_debug_print(IGMP_DEBUG, &(group->group_address)); LWIP_DEBUGF(IGMP_DEBUG, (" on if %p\n", group->interface)); igmp_send(group, IGMP_V2_MEMB_REPORT); } } /** * Start a timer for an igmp group * * @param group the igmp_group for which to start a timer * @param max_time the time in multiples of IGMP_TMR_INTERVAL (decrease with * every call to igmp_tmr()) */ void igmp_start_timer(struct igmp_group *group, u8_t max_time) { /** * @todo Important !! this should be random 0 -> max_time. Find out how to do this */ group->timer = max_time; } /** * Stop a timer for an igmp_group * * @param group the igmp_group for which to stop the timer */ void igmp_stop_timer(struct igmp_group *group) { group->timer = 0; } /** * Delaying membership report for a group if necessary * * @param group the igmp_group for which "delaying" membership report * @param maxresp query delay */ void igmp_delaying_member( struct igmp_group *group, u8_t maxresp) { if ((group->group_state == IGMP_GROUP_IDLE_MEMBER) || ((group->group_state == IGMP_GROUP_DELAYING_MEMBER) && (maxresp > group->timer))) { igmp_start_timer(group, (maxresp)/2); group->group_state = IGMP_GROUP_DELAYING_MEMBER; } } /** * Sends an IP packet on a network interface. This function constructs the IP header * and calculates the IP header checksum. If the source IP address is NULL, * the IP address of the outgoing network interface is filled in as source address. * * @param p the packet to send (p->payload points to the data, e.g. next protocol header; if dest == IP_HDRINCL, p already includes an IP header and p->payload points to that IP header) * @param src the source IP address to send from (if src == IP_ADDR_ANY, the * IP address of the netif used to send is used as source address) * @param dest the destination IP address to send the packet to * @param ttl the TTL value to be set in the IP header * @param proto the PROTOCOL to be set in the IP header * @param netif the netif on which to send this packet * @return ERR_OK if the packet was sent OK * ERR_BUF if p doesn't have enough space for IP/LINK headers * returns errors returned by netif->output */ err_t igmp_ip_output_if(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, u8_t ttl, u8_t proto, struct netif *netif) { /* This is the "router alert" option */ u16_t ra[2]; ra[0] = htons (ROUTER_ALERT); ra[1] = 0x0000; /* Router shall examine packet */ return ip_output_if_opt(p, src, dest, ttl, 0, proto, netif, ra, ROUTER_ALERTLEN); } /** * Send an igmp packet to a specific group. * * @param group the group to which to send the packet * @param type the type of igmp packet to send */ void igmp_send(struct igmp_group *group, u8_t type) { struct pbuf* p = NULL; struct igmp_msg* igmp = NULL; struct ip_addr src = {0}; struct ip_addr* dest = NULL; /* IP header + "router alert" option + IGMP header */ p = pbuf_alloc(PBUF_TRANSPORT, IGMP_MINLEN, PBUF_RAM); if (p) { igmp = p->payload; LWIP_ASSERT("igmp_send: check that first pbuf can hold struct igmp_msg", (p->len >= sizeof(struct igmp_msg))); ip_addr_set(&src, &((group->interface)->ip_addr)); if (type == IGMP_V2_MEMB_REPORT) { dest = &(group->group_address); IGMP_STATS_INC(igmp.report_sent); ip_addr_set(&(igmp->igmp_group_address), &(group->group_address)); group->last_reporter_flag = 1; /* Remember we were the last to report */ } else { if (type == IGMP_LEAVE_GROUP) { dest = &allrouters; ip_addr_set(&(igmp->igmp_group_address), &(group->group_address)); } } if ((type == IGMP_V2_MEMB_REPORT) || (type == IGMP_LEAVE_GROUP)) { igmp->igmp_msgtype = type; igmp->igmp_maxresp = 0; igmp->igmp_checksum = 0; igmp->igmp_checksum = inet_chksum( igmp, IGMP_MINLEN); igmp_ip_output_if(p, &src, dest, IGMP_TTL, IP_PROTO_IGMP, group->interface); } pbuf_free(p); } else { LWIP_DEBUGF(IGMP_DEBUG, ("igmp_send: not enough memory for igmp_send\n")); } } #endif /* LWIP_IGMP */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/inet.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * Functions common to all TCP/IPv4 modules, such as the byte order functions. * */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #include "lwip/opt.h" #include "lwip/inet.h" /* Here for now until needed in other places in lwIP */ #ifndef isprint #define in_range(c, lo, up) ((u8_t)c >= lo && (u8_t)c <= up) #define isprint(c) in_range(c, 0x20, 0x7f) #define isdigit(c) in_range(c, '0', '9') #define isxdigit(c) (isdigit(c) || in_range(c, 'a', 'f') || in_range(c, 'A', 'F')) #define islower(c) in_range(c, 'a', 'z') #define isspace(c) (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v') #endif /** * Ascii internet address interpretation routine. * The value returned is in network order. * * @param cp IP address in ascii represenation (e.g. "127.0.0.1") * @return ip address in network order */ u32_t inet_addr(const char *cp) { struct in_addr val; if (inet_aton(cp, &val)) { return (val.s_addr); } return (INADDR_NONE); } /** * Check whether "cp" is a valid ascii representation * of an Internet address and convert to a binary address. * Returns 1 if the address is valid, 0 if not. * This replaces inet_addr, the return value from which * cannot distinguish between failure and a local broadcast address. * * @param cp IP address in ascii represenation (e.g. "127.0.0.1") * @param addr pointer to which to save the ip address in network order * @return 1 if cp could be converted to addr, 0 on failure */ int inet_aton(const char *cp, struct in_addr *addr) { u32_t val; u8_t base; char c; u32_t parts[4]; u32_t *pp = parts; c = *cp; for (;;) { /* * Collect number up to ``.''. * Values are specified as for C: * 0x=hex, 0=octal, 1-9=decimal. */ if (!isdigit(c)) return (0); val = 0; base = 10; if (c == '0') { c = *++cp; if (c == 'x' || c == 'X') { base = 16; c = *++cp; } else base = 8; } for (;;) { if (isdigit(c)) { val = (val * base) + (int)(c - '0'); c = *++cp; } else if (base == 16 && isxdigit(c)) { val = (val << 4) | (int)(c + 10 - (islower(c) ? 'a' : 'A')); c = *++cp; } else break; } if (c == '.') { /* * Internet format: * a.b.c.d * a.b.c (with c treated as 16 bits) * a.b (with b treated as 24 bits) */ if (pp >= parts + 3) return (0); *pp++ = val; c = *++cp; } else break; } /* * Check for trailing characters. */ if (c != '\0' && !isspace(c)) return (0); /* * Concoct the address according to * the number of parts specified. */ switch (pp - parts + 1) { case 0: return (0); /* initial nondigit */ case 1: /* a -- 32 bits */ break; case 2: /* a.b -- 8.24 bits */ if (val > 0xffffffUL) return (0); val |= parts[0] << 24; break; case 3: /* a.b.c -- 8.8.16 bits */ if (val > 0xffff) return (0); val |= (parts[0] << 24) | (parts[1] << 16); break; case 4: /* a.b.c.d -- 8.8.8.8 bits */ if (val > 0xff) return (0); val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8); break; } if (addr) addr->s_addr = htonl(val); return (1); } /** * Convert numeric IP address into decimal dotted ASCII representation. * returns ptr to static buffer; not reentrant! * * @param addr ip address in network order to convert * @return pointer to a global static (!) buffer that holds the ASCII * represenation of addr */ char * inet_ntoa(struct in_addr addr) { static char str[16]; u32_t s_addr = addr.s_addr; char inv[3]; char *rp; u8_t *ap; u8_t rem; u8_t n; u8_t i; rp = str; ap = (u8_t *)&s_addr; for(n = 0; n < 4; n++) { i = 0; do { rem = *ap % (u8_t)10; *ap /= (u8_t)10; inv[i++] = '0' + rem; } while(*ap); while(i--) *rp++ = inv[i]; *rp++ = '.'; ap++; } *--rp = 0; return str; } /** * These are reference implementations of the byte swapping functions. * Again with the aim of being simple, correct and fully portable. * Byte swapping is the second thing you would want to optimize. You will * need to port it to your architecture and in your cc.h: * * #define LWIP_PLATFORM_BYTESWAP 1 * #define LWIP_PLATFORM_HTONS(x) * #define LWIP_PLATFORM_HTONL(x) * * Note ntohs() and ntohl() are merely references to the htonx counterparts. */ #if (LWIP_PLATFORM_BYTESWAP == 0) && (BYTE_ORDER == LITTLE_ENDIAN) /** * Convert an u16_t from host- to network byte order. * * @param n u16_t in host byte order * @return n in network byte order */ u16_t htons(u16_t n) { return ((n & 0xff) << 8) | ((n & 0xff00) >> 8); } /** * Convert an u16_t from network- to host byte order. * * @param n u16_t in network byte order * @return n in host byte order */ u16_t ntohs(u16_t n) { return htons(n); } /** * Convert an u32_t from host- to network byte order. * * @param n u32_t in host byte order * @return n in network byte order */ u32_t htonl(u32_t n) { return ((n & 0xff) << 24) | ((n & 0xff00) << 8) | ((n & 0xff0000UL) >> 8) | ((n & 0xff000000UL) >> 24); } /** * Convert an u32_t from network- to host byte order. * * @param n u32_t in network byte order * @return n in host byte order */ u32_t ntohl(u32_t n) { return htonl(n); } #endif /* (LWIP_PLATFORM_BYTESWAP == 0) && (BYTE_ORDER == LITTLE_ENDIAN) */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/inet_chksum.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * Incluse internet checksum functions. * */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #include "lwip/opt.h" #include "lwip/inet_chksum.h" #include "lwip/inet.h" #include /* These are some reference implementations of the checksum algorithm, with the * aim of being simple, correct and fully portable. Checksumming is the * first thing you would want to optimize for your platform. If you create * your own version, link it in and in your cc.h put: * * #define LWIP_CHKSUM * * Or you can select from the implementations below by defining * LWIP_CHKSUM_ALGORITHM to 1, 2 or 3. */ #ifndef LWIP_CHKSUM # define LWIP_CHKSUM lwip_standard_chksum # ifndef LWIP_CHKSUM_ALGORITHM # define LWIP_CHKSUM_ALGORITHM 1 # endif #endif /* If none set: */ #ifndef LWIP_CHKSUM_ALGORITHM # define LWIP_CHKSUM_ALGORITHM 0 #endif /** Like the name says... */ #if LWIP_PLATFORM_BYTESWAP && (BYTE_ORDER == LITTLE_ENDIAN) /* little endian and PLATFORM_BYTESWAP defined */ #define SWAP_BYTES_IN_WORD(w) LWIP_PLATFORM_HTONS(w) #else /* can't use htons on big endian (or PLATFORM_BYTESWAP not defined)... */ #define SWAP_BYTES_IN_WORD(w) ((w & 0xff) << 8) | ((w & 0xff00) >> 8) #endif /** Split an u32_t in two u16_ts and add them up */ #define FOLD_U32T(u) ((u >> 16) + (u & 0x0000ffffUL)) #if (LWIP_CHKSUM_ALGORITHM == 1) /* Version #1 */ /** * lwip checksum * * @param dataptr points to start of data to be summed at any boundary * @param len length of data to be summed * @return host order (!) lwip checksum (non-inverted Internet sum) * * @note accumulator size limits summable length to 64k * @note host endianess is irrelevant (p3 RFC1071) */ static u16_t lwip_standard_chksum(void *dataptr, u16_t len) { u32_t acc; u16_t src; u8_t *octetptr; acc = 0; /* dataptr may be at odd or even addresses */ octetptr = (u8_t*)dataptr; while (len > 1) { /* declare first octet as most significant thus assume network order, ignoring host order */ src = (*octetptr) << 8; octetptr++; /* declare second octet as least significant */ src |= (*octetptr); octetptr++; acc += src; len -= 2; } if (len > 0) { /* accumulate remaining octet */ src = (*octetptr) << 8; acc += src; } /* add deferred carry bits */ acc = (acc >> 16) + (acc & 0x0000ffffUL); if ((acc & 0xffff0000UL) != 0) { acc = (acc >> 16) + (acc & 0x0000ffffUL); } /* This maybe a little confusing: reorder sum using htons() instead of ntohs() since it has a little less call overhead. The caller must invert bits for Internet sum ! */ return htons((u16_t)acc); } #endif #if (LWIP_CHKSUM_ALGORITHM == 2) /* Alternative version #2 */ /* * Curt McDowell * Broadcom Corp. * csm@broadcom.com * * IP checksum two bytes at a time with support for * unaligned buffer. * Works for len up to and including 0x20000. * by Curt McDowell, Broadcom Corp. 12/08/2005 * * @param dataptr points to start of data to be summed at any boundary * @param len length of data to be summed * @return host order (!) lwip checksum (non-inverted Internet sum) */ static u16_t lwip_standard_chksum(void *dataptr, int len) { u8_t *pb = dataptr; u16_t *ps, t = 0; u32_t sum = 0; int odd = ((u32_t)pb & 1); /* Get aligned to u16_t */ if (odd && len > 0) { ((u8_t *)&t)[1] = *pb++; len--; } /* Add the bulk of the data */ ps = (u16_t *)pb; while (len > 1) { sum += *ps++; len -= 2; } /* Consume left-over byte, if any */ if (len > 0) { ((u8_t *)&t)[0] = *(u8_t *)ps;; } /* Add end bytes */ sum += t; /* Fold 32-bit sum to 16 bits calling this twice is propably faster than if statements... */ sum = FOLD_U32T(sum); sum = FOLD_U32T(sum); /* Swap if alignment was odd */ if (odd) { sum = SWAP_BYTES_IN_WORD(sum); } return sum; } #endif #if (LWIP_CHKSUM_ALGORITHM == 3) /* Alternative version #3 */ /** * An optimized checksum routine. Basically, it uses loop-unrolling on * the checksum loop, treating the head and tail bytes specially, whereas * the inner loop acts on 8 bytes at a time. * * @arg start of buffer to be checksummed. May be an odd byte address. * @len number of bytes in the buffer to be checksummed. * @return host order (!) lwip checksum (non-inverted Internet sum) * * by Curt McDowell, Broadcom Corp. December 8th, 2005 */ static u16_t lwip_standard_chksum(void *dataptr, int len) { u8_t *pb = dataptr; u16_t *ps, t = 0; u32_t *pl; u32_t sum = 0, tmp; /* starts at odd byte address? */ int odd = ((u32_t)pb & 1); if (odd && len > 0) { ((u8_t *)&t)[1] = *pb++; len--; } ps = (u16_t *)pb; if (((u32_t)ps & 3) && len > 1) { sum += *ps++; len -= 2; } pl = (u32_t *)ps; while (len > 7) { tmp = sum + *pl++; /* ping */ if (tmp < sum) { tmp++; /* add back carry */ } sum = tmp + *pl++; /* pong */ if (sum < tmp) { sum++; /* add back carry */ } len -= 8; } /* make room in upper bits */ sum = FOLD_U32T(sum); ps = (u16_t *)pl; /* 16-bit aligned word remaining? */ while (len > 1) { sum += *ps++; len -= 2; } /* dangling tail byte remaining? */ if (len > 0) { /* include odd byte */ ((u8_t *)&t)[0] = *(u8_t *)ps; } sum += t; /* add end bytes */ /* Fold 32-bit sum to 16 bits calling this twice is propably faster than if statements... */ sum = FOLD_U32T(sum); sum = FOLD_U32T(sum); if (odd) { sum = SWAP_BYTES_IN_WORD(sum); } return sum; } #endif /* inet_chksum_pseudo: * * Calculates the pseudo Internet checksum used by TCP and UDP for a pbuf chain. * IP addresses are expected to be in network byte order. * * @param p chain of pbufs over that a checksum should be calculated (ip data part) * @param src source ip address (used for checksum of pseudo header) * @param dst destination ip address (used for checksum of pseudo header) * @param proto ip protocol (used for checksum of pseudo header) * @param proto_len length of the ip data part (used for checksum of pseudo header) * @return checksum (as u16_t) to be saved directly in the protocol header */ u16_t inet_chksum_pseudo(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, u8_t proto, u16_t proto_len) { u32_t acc; struct pbuf *q; u8_t swapped; acc = 0; swapped = 0; /* iterate through all pbuf in chain */ for(q = p; q != NULL; q = q->next) { LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): checksumming pbuf %p (has next %p) \n", (void *)q, (void *)q->next)); acc += LWIP_CHKSUM(q->payload, q->len); /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): unwrapped lwip_chksum()=%"X32_F" \n", acc));*/ /* just executing this next line is probably faster that the if statement needed to check whether we really need to execute it, and does no harm */ acc = FOLD_U32T(acc); if (q->len % 2 != 0) { swapped = 1 - swapped; acc = SWAP_BYTES_IN_WORD(acc); } /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): wrapped lwip_chksum()=%"X32_F" \n", acc));*/ } if (swapped) { acc = SWAP_BYTES_IN_WORD(acc); } acc += (src->addr & 0xffffUL); acc += ((src->addr >> 16) & 0xffffUL); acc += (dest->addr & 0xffffUL); acc += ((dest->addr >> 16) & 0xffffUL); acc += (u32_t)htons((u16_t)proto); acc += (u32_t)htons(proto_len); /* Fold 32-bit sum to 16 bits calling this twice is propably faster than if statements... */ acc = FOLD_U32T(acc); acc = FOLD_U32T(acc); LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): pbuf chain lwip_chksum()=%"X32_F"\n", acc)); return (u16_t)~(acc & 0xffffUL); } /* inet_chksum_pseudo: * * Calculates the pseudo Internet checksum used by TCP and UDP for a pbuf chain. * IP addresses are expected to be in network byte order. * * @param p chain of pbufs over that a checksum should be calculated (ip data part) * @param src source ip address (used for checksum of pseudo header) * @param dst destination ip address (used for checksum of pseudo header) * @param proto ip protocol (used for checksum of pseudo header) * @param proto_len length of the ip data part (used for checksum of pseudo header) * @return checksum (as u16_t) to be saved directly in the protocol header */ /* Currently only used by UDPLITE, although this could change in the future. */ #if LWIP_UDPLITE u16_t inet_chksum_pseudo_partial(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, u8_t proto, u16_t proto_len, u16_t chksum_len) { u32_t acc; struct pbuf *q; u8_t swapped; u16_t chklen; acc = 0; swapped = 0; /* iterate through all pbuf in chain */ for(q = p; (q != NULL) && (chksum_len > 0); q = q->next) { LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): checksumming pbuf %p (has next %p) \n", (void *)q, (void *)q->next)); chklen = q->len; if (chklen > chksum_len) { chklen = chksum_len; } acc += LWIP_CHKSUM(q->payload, chklen); chksum_len -= chklen; LWIP_ASSERT("delete me", chksum_len < 0x7fff); /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): unwrapped lwip_chksum()=%"X32_F" \n", acc));*/ /* fold the upper bit down */ acc = FOLD_U32T(acc); if (q->len % 2 != 0) { swapped = 1 - swapped; acc = SWAP_BYTES_IN_WORD(acc); } /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): wrapped lwip_chksum()=%"X32_F" \n", acc));*/ } if (swapped) { acc = SWAP_BYTES_IN_WORD(acc); } acc += (src->addr & 0xffffUL); acc += ((src->addr >> 16) & 0xffffUL); acc += (dest->addr & 0xffffUL); acc += ((dest->addr >> 16) & 0xffffUL); acc += (u32_t)htons((u16_t)proto); acc += (u32_t)htons(proto_len); /* Fold 32-bit sum to 16 bits calling this twice is propably faster than if statements... */ acc = FOLD_U32T(acc); acc = FOLD_U32T(acc); LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): pbuf chain lwip_chksum()=%"X32_F"\n", acc)); return (u16_t)~(acc & 0xffffUL); } #endif /* LWIP_UDPLITE */ /* inet_chksum: * * Calculates the Internet checksum over a portion of memory. Used primarily for IP * and ICMP. * * @param dataptr start of the buffer to calculate the checksum (no alignment needed) * @param len length of the buffer to calculate the checksum * @return checksum (as u16_t) to be saved directly in the protocol header */ u16_t inet_chksum(void *dataptr, u16_t len) { return ~LWIP_CHKSUM(dataptr, len); } /** * Calculate a checksum over a chain of pbufs (without pseudo-header, much like * inet_chksum only pbufs are used). * * @param p pbuf chain over that the checksum should be calculated * @return checksum (as u16_t) to be saved directly in the protocol header */ u16_t inet_chksum_pbuf(struct pbuf *p) { u32_t acc; struct pbuf *q; u8_t swapped; acc = 0; swapped = 0; for(q = p; q != NULL; q = q->next) { acc += LWIP_CHKSUM(q->payload, q->len); acc = FOLD_U32T(acc); if (q->len % 2 != 0) { swapped = 1 - swapped; acc = SWAP_BYTES_IN_WORD(acc); } } if (swapped) { acc = SWAP_BYTES_IN_WORD(acc); } return (u16_t)~(acc & 0xffffUL); } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/ip.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * This is the IPv4 layer implementation for incoming and outgoing IP traffic. * * @see ip_frag.c * */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #include "lwip/opt.h" #include "lwip/ip.h" #include "lwip/def.h" #include "lwip/mem.h" #include "lwip/ip_frag.h" #include "lwip/inet.h" #include "lwip/inet_chksum.h" #include "lwip/netif.h" #include "lwip/icmp.h" #include "lwip/igmp.h" #include "lwip/raw.h" #include "lwip/udp.h" #include "lwip/tcp.h" #include "lwip/snmp.h" #include "lwip/dhcp.h" #include "lwip/stats.h" #include "arch/perf.h" #include /** * The interface that provided the packet for the current callback * invocation. */ struct netif *current_netif; /** * Header of the input packet currently being processed. */ const struct ip_hdr *current_header; /** * Finds the appropriate network interface for a given IP address. It * searches the list of network interfaces linearly. A match is found * if the masked IP address of the network interface equals the masked * IP address given to the function. * * @param dest the destination IP address for which to find the route * @return the netif on which to send to reach dest */ struct netif * ip_route(struct ip_addr *dest) { struct netif *netif; /* iterate through netifs */ for(netif = netif_list; netif != NULL; netif = netif->next) { /* network mask matches? */ if (netif_is_up(netif)) { if (ip_addr_netcmp(dest, &(netif->ip_addr), &(netif->netmask))) { /* return netif on which to forward IP packet */ return netif; } } } if ((netif_default == NULL) || (!netif_is_up(netif_default))) { LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip_route: No route to 0x%"X32_F"\n", dest->addr)); IP_STATS_INC(ip.rterr); snmp_inc_ipoutnoroutes(); return NULL; } /* no matching netif found, use default netif */ return netif_default; } #if IP_FORWARD /** * Forwards an IP packet. It finds an appropriate route for the * packet, decrements the TTL value of the packet, adjusts the * checksum and outputs the packet on the appropriate interface. * * @param p the packet to forward (p->payload points to IP header) * @param iphdr the IP header of the input packet * @param inp the netif on which this packet was received * @return the netif on which the packet was sent (NULL if it wasn't sent) */ static struct netif * ip_forward(struct pbuf *p, struct ip_hdr *iphdr, struct netif *inp) { struct netif *netif; PERF_START; /* Find network interface where to forward this IP packet to. */ netif = ip_route((struct ip_addr *)&(iphdr->dest)); if (netif == NULL) { LWIP_DEBUGF(IP_DEBUG, ("ip_forward: no forwarding route for 0x%"X32_F" found\n", iphdr->dest.addr)); snmp_inc_ipoutnoroutes(); return (struct netif *)NULL; } /* Do not forward packets onto the same network interface on which * they arrived. */ if (netif == inp) { LWIP_DEBUGF(IP_DEBUG, ("ip_forward: not bouncing packets back on incoming interface.\n")); snmp_inc_ipoutnoroutes(); return (struct netif *)NULL; } /* decrement TTL */ IPH_TTL_SET(iphdr, IPH_TTL(iphdr) - 1); /* send ICMP if TTL == 0 */ if (IPH_TTL(iphdr) == 0) { snmp_inc_ipinhdrerrors(); #if LWIP_ICMP /* Don't send ICMP messages in response to ICMP messages */ if (IPH_PROTO(iphdr) != IP_PROTO_ICMP) { icmp_time_exceeded(p, ICMP_TE_TTL); } #endif /* LWIP_ICMP */ return (struct netif *)NULL; } /* Incrementally update the IP checksum. */ if (IPH_CHKSUM(iphdr) >= htons(0xffff - 0x100)) { IPH_CHKSUM_SET(iphdr, IPH_CHKSUM(iphdr) + htons(0x100) + 1); } else { IPH_CHKSUM_SET(iphdr, IPH_CHKSUM(iphdr) + htons(0x100)); } LWIP_DEBUGF(IP_DEBUG, ("ip_forward: forwarding packet to 0x%"X32_F"\n", iphdr->dest.addr)); IP_STATS_INC(ip.fw); IP_STATS_INC(ip.xmit); snmp_inc_ipforwdatagrams(); PERF_STOP("ip_forward"); /* transmit pbuf on chosen interface */ netif->output(netif, p, (struct ip_addr *)&(iphdr->dest)); return netif; } #endif /* IP_FORWARD */ /** * This function is called by the network interface device driver when * an IP packet is received. The function does the basic checks of the * IP header such as packet size being at least larger than the header * size etc. If the packet was not destined for us, the packet is * forwarded (using ip_forward). The IP checksum is always checked. * * Finally, the packet is sent to the upper layer protocol input function. * * @param p the received IP packet (p->payload points to IP header) * @param inp the netif on which this packet was received * @return ERR_OK if the packet was processed (could return ERR_* if it wasn't * processed, but currently always returns ERR_OK) */ err_t ip_input(struct pbuf *p, struct netif *inp) { struct ip_hdr *iphdr; struct netif *netif; u16_t iphdr_hlen; u16_t iphdr_len; #if LWIP_DHCP int check_ip_src=1; #endif /* LWIP_DHCP */ IP_STATS_INC(ip.recv); snmp_inc_ipinreceives(); /* identify the IP header */ iphdr = p->payload; if (IPH_V(iphdr) != 4) { LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_WARNING, ("IP packet dropped due to bad version number %"U16_F"\n", IPH_V(iphdr))); ip_debug_print(p); pbuf_free(p); IP_STATS_INC(ip.err); IP_STATS_INC(ip.drop); snmp_inc_ipinhdrerrors(); return ERR_OK; } /* obtain IP header length in number of 32-bit words */ iphdr_hlen = IPH_HL(iphdr); /* calculate IP header length in bytes */ iphdr_hlen *= 4; /* obtain ip length in bytes */ iphdr_len = ntohs(IPH_LEN(iphdr)); /* header length exceeds first pbuf length, or ip length exceeds total pbuf length? */ if ((iphdr_hlen > p->len) || (iphdr_len > p->tot_len)) { if (iphdr_hlen > p->len) { LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("IP header (len %"U16_F") does not fit in first pbuf (len %"U16_F"), IP packet dropped.\n", iphdr_hlen, p->len)); } if (iphdr_len > p->tot_len) { LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("IP (len %"U16_F") is longer than pbuf (len %"U16_F"), IP packet dropped.\n", iphdr_len, p->tot_len)); } /* free (drop) packet pbufs */ pbuf_free(p); IP_STATS_INC(ip.lenerr); IP_STATS_INC(ip.drop); snmp_inc_ipindiscards(); return ERR_OK; } /* verify checksum */ #if CHECKSUM_CHECK_IP if (inet_chksum(iphdr, iphdr_hlen) != 0) { LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("Checksum (0x%"X16_F") failed, IP packet dropped.\n", inet_chksum(iphdr, iphdr_hlen))); ip_debug_print(p); pbuf_free(p); IP_STATS_INC(ip.chkerr); IP_STATS_INC(ip.drop); snmp_inc_ipinhdrerrors(); return ERR_OK; } #endif /* Trim pbuf. This should have been done at the netif layer, * but we'll do it anyway just to be sure that its done. */ pbuf_realloc(p, iphdr_len); /* match packet against an interface, i.e. is this packet for us? */ #if LWIP_IGMP if (ip_addr_ismulticast(&(iphdr->dest))) { if ((inp->flags & NETIF_FLAG_IGMP) && (igmp_lookfor_group(inp, &(iphdr->dest)))) { netif = inp; } else { netif = NULL; } } else #endif /* LWIP_IGMP */ { /* start trying with inp. if that's not acceptable, start walking the list of configured netifs. 'first' is used as a boolean to mark whether we started walking the list */ int first = 1; netif = inp; do { LWIP_DEBUGF(IP_DEBUG, ("ip_input: iphdr->dest 0x%"X32_F" netif->ip_addr 0x%"X32_F" (0x%"X32_F", 0x%"X32_F", 0x%"X32_F")\n", iphdr->dest.addr, netif->ip_addr.addr, iphdr->dest.addr & netif->netmask.addr, netif->ip_addr.addr & netif->netmask.addr, iphdr->dest.addr & ~(netif->netmask.addr))); /* interface is up and configured? */ if ((netif_is_up(netif)) && (!ip_addr_isany(&(netif->ip_addr)))) { /* unicast to this interface address? */ if (ip_addr_cmp(&(iphdr->dest), &(netif->ip_addr)) || /* or broadcast on this interface network address? */ ip_addr_isbroadcast(&(iphdr->dest), netif)) { LWIP_DEBUGF(IP_DEBUG, ("ip_input: packet accepted on interface %c%c\n", netif->name[0], netif->name[1])); /* break out of for loop */ break; } } if (first) { first = 0; netif = netif_list; } else { netif = netif->next; } if (netif == inp) { netif = netif->next; } } while(netif != NULL); } #if LWIP_DHCP /* Pass DHCP messages regardless of destination address. DHCP traffic is addressed * using link layer addressing (such as Ethernet MAC) so we must not filter on IP. * According to RFC 1542 section 3.1.1, referred by RFC 2131). */ if (netif == NULL) { /* remote port is DHCP server? */ if (IPH_PROTO(iphdr) == IP_PROTO_UDP) { LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip_input: UDP packet to DHCP client port %"U16_F"\n", ntohs(((struct udp_hdr *)((u8_t *)iphdr + iphdr_hlen))->dest))); if (ntohs(((struct udp_hdr *)((u8_t *)iphdr + iphdr_hlen))->dest) == DHCP_CLIENT_PORT) { LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip_input: DHCP packet accepted.\n")); netif = inp; check_ip_src = 0; } } } #endif /* LWIP_DHCP */ /* broadcast or multicast packet source address? Compliant with RFC 1122: 3.2.1.3 */ #if LWIP_DHCP /* DHCP servers need 0.0.0.0 to be allowed as source address (RFC 1.1.2.2: 3.2.1.3/a) */ if (check_ip_src && (iphdr->src.addr != 0)) #endif /* LWIP_DHCP */ { if ((ip_addr_isbroadcast(&(iphdr->src), inp)) || (ip_addr_ismulticast(&(iphdr->src)))) { /* packet source is not valid */ LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("ip_input: packet source is not valid.\n")); /* free (drop) packet pbufs */ pbuf_free(p); IP_STATS_INC(ip.drop); snmp_inc_ipinaddrerrors(); snmp_inc_ipindiscards(); return ERR_OK; } } /* packet not for us? */ if (netif == NULL) { /* packet not for us, route or discard */ LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip_input: packet not for us.\n")); #if IP_FORWARD /* non-broadcast packet? */ if (!ip_addr_isbroadcast(&(iphdr->dest), inp)) { /* try to forward IP packet on (other) interfaces */ ip_forward(p, iphdr, inp); } else #endif /* IP_FORWARD */ { snmp_inc_ipinaddrerrors(); snmp_inc_ipindiscards(); } pbuf_free(p); return ERR_OK; } /* packet consists of multiple fragments? */ if ((IPH_OFFSET(iphdr) & htons(IP_OFFMASK | IP_MF)) != 0) { #if IP_REASSEMBLY /* packet fragment reassembly code present? */ LWIP_DEBUGF(IP_DEBUG, ("IP packet is a fragment (id=0x%04"X16_F" tot_len=%"U16_F" len=%"U16_F" MF=%"U16_F" offset=%"U16_F"), calling ip_reass()\n", ntohs(IPH_ID(iphdr)), p->tot_len, ntohs(IPH_LEN(iphdr)), !!(IPH_OFFSET(iphdr) & htons(IP_MF)), (ntohs(IPH_OFFSET(iphdr)) & IP_OFFMASK)*8)); /* reassemble the packet*/ p = ip_reass(p); /* packet not fully reassembled yet? */ if (p == NULL) { return ERR_OK; } iphdr = p->payload; #else /* IP_REASSEMBLY == 0, no packet fragment reassembly code present */ pbuf_free(p); LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("IP packet dropped since it was fragmented (0x%"X16_F") (while IP_REASSEMBLY == 0).\n", ntohs(IPH_OFFSET(iphdr)))); IP_STATS_INC(ip.opterr); IP_STATS_INC(ip.drop); /* unsupported protocol feature */ snmp_inc_ipinunknownprotos(); return ERR_OK; #endif /* IP_REASSEMBLY */ } #if IP_OPTIONS_ALLOWED == 0 /* no support for IP options in the IP header? */ #if LWIP_IGMP /* there is an extra "router alert" option in IGMP messages which we allow for but do not police */ if((iphdr_hlen > IP_HLEN && (IPH_PROTO(iphdr) != IP_PROTO_IGMP)) { #else if (iphdr_hlen > IP_HLEN) { #endif /* LWIP_IGMP */ LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("IP packet dropped since there were IP options (while IP_OPTIONS_ALLOWED == 0).\n")); pbuf_free(p); IP_STATS_INC(ip.opterr); IP_STATS_INC(ip.drop); /* unsupported protocol feature */ snmp_inc_ipinunknownprotos(); return ERR_OK; } #endif /* IP_OPTIONS_ALLOWED == 0 */ /* send to upper layers */ LWIP_DEBUGF(IP_DEBUG, ("ip_input: \n")); ip_debug_print(p); LWIP_DEBUGF(IP_DEBUG, ("ip_input: p->len %"U16_F" p->tot_len %"U16_F"\n", p->len, p->tot_len)); current_netif = inp; current_header = iphdr; #if LWIP_RAW /* raw input did not eat the packet? */ if (raw_input(p, inp) == 0) #endif /* LWIP_RAW */ { switch (IPH_PROTO(iphdr)) { #if LWIP_UDP case IP_PROTO_UDP: #if LWIP_UDPLITE case IP_PROTO_UDPLITE: #endif /* LWIP_UDPLITE */ snmp_inc_ipindelivers(); udp_input(p, inp); break; #endif /* LWIP_UDP */ #if LWIP_TCP case IP_PROTO_TCP: snmp_inc_ipindelivers(); tcp_input(p, inp); break; #endif /* LWIP_TCP */ #if LWIP_ICMP case IP_PROTO_ICMP: snmp_inc_ipindelivers(); icmp_input(p, inp); break; #endif /* LWIP_ICMP */ #if LWIP_IGMP case IP_PROTO_IGMP: igmp_input(p,inp,&(iphdr->dest)); break; #endif /* LWIP_IGMP */ default: #if LWIP_ICMP /* send ICMP destination protocol unreachable unless is was a broadcast */ if (!ip_addr_isbroadcast(&(iphdr->dest), inp) && !ip_addr_ismulticast(&(iphdr->dest))) { p->payload = iphdr; icmp_dest_unreach(p, ICMP_DUR_PROTO); } #endif /* LWIP_ICMP */ pbuf_free(p); LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("Unsupported transport protocol %"U16_F"\n", IPH_PROTO(iphdr))); IP_STATS_INC(ip.proterr); IP_STATS_INC(ip.drop); snmp_inc_ipinunknownprotos(); } } current_netif = NULL; current_header = NULL; return ERR_OK; } /** * Sends an IP packet on a network interface. This function constructs * the IP header and calculates the IP header checksum. If the source * IP address is NULL, the IP address of the outgoing network * interface is filled in as source address. * If the destination IP address is IP_HDRINCL, p is assumed to already * include an IP header and p->payload points to it instead of the data. * * @param p the packet to send (p->payload points to the data, e.g. next protocol header; if dest == IP_HDRINCL, p already includes an IP header and p->payload points to that IP header) * @param src the source IP address to send from (if src == IP_ADDR_ANY, the * IP address of the netif used to send is used as source address) * @param dest the destination IP address to send the packet to * @param ttl the TTL value to be set in the IP header * @param tos the TOS value to be set in the IP header * @param proto the PROTOCOL to be set in the IP header * @param netif the netif on which to send this packet * @return ERR_OK if the packet was sent OK * ERR_BUF if p doesn't have enough space for IP/LINK headers * returns errors returned by netif->output * * @note ip_id: RFC791 "some host may be able to simply use * unique identifiers independent of destination" */ err_t ip_output_if(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif) { #if IP_OPTIONS_SEND return ip_output_if_opt(p, src, dest, ttl, tos, proto, netif, NULL, 0); } /** * Same as ip_output_if() but with the possibility to include IP options: * * @ param ip_options pointer to the IP options, copied into the IP header * @ param optlen length of ip_options */ err_t ip_output_if_opt(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, u16_t optlen) { #endif /* IP_OPTIONS_SEND */ struct ip_hdr *iphdr; static u16_t ip_id = 0; snmp_inc_ipoutrequests(); /* Should the IP header be generated or is it already included in p? */ if (dest != IP_HDRINCL) { u16_t ip_hlen = IP_HLEN; #if IP_OPTIONS_SEND u16_t optlen_aligned = 0; if (optlen != 0) { /* round up to a multiple of 4 */ optlen_aligned = ((optlen + 3) & ~3); ip_hlen += optlen_aligned; /* First write in the IP options */ if (pbuf_header(p, optlen_aligned)) { LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip_output_if_opt: not enough room for IP options in pbuf\n")); IP_STATS_INC(ip.err); snmp_inc_ipoutdiscards(); return ERR_BUF; } MEMCPY(p->payload, ip_options, optlen); if (optlen < optlen_aligned) { /* zero the remaining bytes */ memset(((char*)p->payload) + optlen, 0, optlen_aligned - optlen); } } #endif /* IP_OPTIONS_SEND */ /* generate IP header */ if (pbuf_header(p, IP_HLEN)) { LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip_output: not enough room for IP header in pbuf\n")); IP_STATS_INC(ip.err); snmp_inc_ipoutdiscards(); return ERR_BUF; } iphdr = p->payload; LWIP_ASSERT("check that first pbuf can hold struct ip_hdr", (p->len >= sizeof(struct ip_hdr))); IPH_TTL_SET(iphdr, ttl); IPH_PROTO_SET(iphdr, proto); ip_addr_set(&(iphdr->dest), dest); IPH_VHLTOS_SET(iphdr, 4, ip_hlen / 4, tos); IPH_LEN_SET(iphdr, htons(p->tot_len)); IPH_OFFSET_SET(iphdr, 0); IPH_ID_SET(iphdr, htons(ip_id)); ++ip_id; if (ip_addr_isany(src)) { ip_addr_set(&(iphdr->src), &(netif->ip_addr)); } else { ip_addr_set(&(iphdr->src), src); } IPH_CHKSUM_SET(iphdr, 0); #if CHECKSUM_GEN_IP IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, ip_hlen)); #endif } else { /* IP header already included in p */ iphdr = p->payload; dest = &(iphdr->dest); } IP_STATS_INC(ip.xmit); LWIP_DEBUGF(IP_DEBUG, ("ip_output_if: %c%c%"U16_F"\n", netif->name[0], netif->name[1], netif->num)); ip_debug_print(p); #if ENABLE_LOOPBACK if (ip_addr_cmp(dest, &netif->ip_addr)) { /* Packet to self, enqueue it for loopback */ LWIP_DEBUGF(IP_DEBUG, ("netif_loop_output()")); return netif_loop_output(netif, p, dest); } #endif /* ENABLE_LOOPBACK */ #if IP_FRAG /* don't fragment if interface has mtu set to 0 [loopif] */ if (netif->mtu && (p->tot_len > netif->mtu)) { return ip_frag(p,netif,dest); } #endif LWIP_DEBUGF(IP_DEBUG, ("netif->output()")); return netif->output(netif, p, dest); } /** * Simple interface to ip_output_if. It finds the outgoing network * interface and calls upon ip_output_if to do the actual work. * * @param p the packet to send (p->payload points to the data, e.g. next protocol header; if dest == IP_HDRINCL, p already includes an IP header and p->payload points to that IP header) * @param src the source IP address to send from (if src == IP_ADDR_ANY, the * IP address of the netif used to send is used as source address) * @param dest the destination IP address to send the packet to * @param ttl the TTL value to be set in the IP header * @param tos the TOS value to be set in the IP header * @param proto the PROTOCOL to be set in the IP header * * @return ERR_RTE if no route is found * see ip_output_if() for more return values */ err_t ip_output(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, u8_t ttl, u8_t tos, u8_t proto) { struct netif *netif; if ((netif = ip_route(dest)) == NULL) { LWIP_DEBUGF(IP_DEBUG, ("ip_output: No route to 0x%"X32_F"\n", dest->addr)); IP_STATS_INC(ip.rterr); return ERR_RTE; } return ip_output_if(p, src, dest, ttl, tos, proto, netif); } #if LWIP_NETIF_HWADDRHINT /** Like ip_output, but takes and addr_hint pointer that is passed on to netif->addr_hint * before calling ip_output_if. * * @param p the packet to send (p->payload points to the data, e.g. next protocol header; if dest == IP_HDRINCL, p already includes an IP header and p->payload points to that IP header) * @param src the source IP address to send from (if src == IP_ADDR_ANY, the * IP address of the netif used to send is used as source address) * @param dest the destination IP address to send the packet to * @param ttl the TTL value to be set in the IP header * @param tos the TOS value to be set in the IP header * @param proto the PROTOCOL to be set in the IP header * @param addr_hint address hint pointer set to netif->addr_hint before * calling ip_output_if() * * @return ERR_RTE if no route is found * see ip_output_if() for more return values */ err_t ip_output_hinted(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, u8_t ttl, u8_t tos, u8_t proto, u8_t *addr_hint) { struct netif *netif; err_t err; if ((netif = ip_route(dest)) == NULL) { LWIP_DEBUGF(IP_DEBUG, ("ip_output: No route to 0x%"X32_F"\n", dest->addr)); IP_STATS_INC(ip.rterr); return ERR_RTE; } netif->addr_hint = addr_hint; err = ip_output_if(p, src, dest, ttl, tos, proto, netif); netif->addr_hint = NULL; return err; } #endif /* LWIP_NETIF_HWADDRHINT*/ #if IP_DEBUG /* Print an IP header by using LWIP_DEBUGF * @param p an IP packet, p->payload pointing to the IP header */ void ip_debug_print(struct pbuf *p) { struct ip_hdr *iphdr = p->payload; u8_t *payload; payload = (u8_t *)iphdr + IP_HLEN; LWIP_DEBUGF(IP_DEBUG, ("IP header:\n")); LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); LWIP_DEBUGF(IP_DEBUG, ("|%2"S16_F" |%2"S16_F" | 0x%02"X16_F" | %5"U16_F" | (v, hl, tos, len)\n", IPH_V(iphdr), IPH_HL(iphdr), IPH_TOS(iphdr), ntohs(IPH_LEN(iphdr)))); LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); LWIP_DEBUGF(IP_DEBUG, ("| %5"U16_F" |%"U16_F"%"U16_F"%"U16_F"| %4"U16_F" | (id, flags, offset)\n", ntohs(IPH_ID(iphdr)), ntohs(IPH_OFFSET(iphdr)) >> 15 & 1, ntohs(IPH_OFFSET(iphdr)) >> 14 & 1, ntohs(IPH_OFFSET(iphdr)) >> 13 & 1, ntohs(IPH_OFFSET(iphdr)) & IP_OFFMASK)); LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); LWIP_DEBUGF(IP_DEBUG, ("| %3"U16_F" | %3"U16_F" | 0x%04"X16_F" | (ttl, proto, chksum)\n", IPH_TTL(iphdr), IPH_PROTO(iphdr), ntohs(IPH_CHKSUM(iphdr)))); LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); LWIP_DEBUGF(IP_DEBUG, ("| %3"U16_F" | %3"U16_F" | %3"U16_F" | %3"U16_F" | (src)\n", ip4_addr1(&iphdr->src), ip4_addr2(&iphdr->src), ip4_addr3(&iphdr->src), ip4_addr4(&iphdr->src))); LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); LWIP_DEBUGF(IP_DEBUG, ("| %3"U16_F" | %3"U16_F" | %3"U16_F" | %3"U16_F" | (dest)\n", ip4_addr1(&iphdr->dest), ip4_addr2(&iphdr->dest), ip4_addr3(&iphdr->dest), ip4_addr4(&iphdr->dest))); LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); } #endif /* IP_DEBUG */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/ip_addr.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * This is the IPv4 address tools implementation. * */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #include "lwip/opt.h" #include "lwip/ip_addr.h" #include "lwip/inet.h" #include "lwip/netif.h" #define IP_ADDR_ANY_VALUE 0x00000000UL #define IP_ADDR_BROADCAST_VALUE 0xffffffffUL /* used by IP_ADDR_ANY and IP_ADDR_BROADCAST in ip_addr.h */ const struct ip_addr ip_addr_any = { IP_ADDR_ANY_VALUE }; const struct ip_addr ip_addr_broadcast = { IP_ADDR_BROADCAST_VALUE }; /** * Determine if an address is a broadcast address on a network interface * * @param addr address to be checked * @param netif the network interface against which the address is checked * @return returns non-zero if the address is a broadcast address */ u8_t ip_addr_isbroadcast(struct ip_addr *addr, struct netif *netif) { u32_t addr2test; addr2test = addr->addr; /* all ones (broadcast) or all zeroes (old skool broadcast) */ if ((~addr2test == IP_ADDR_ANY_VALUE) || (addr2test == IP_ADDR_ANY_VALUE)) return 1; /* no broadcast support on this network interface? */ else if ((netif->flags & NETIF_FLAG_BROADCAST) == 0) /* the given address cannot be a broadcast address * nor can we check against any broadcast addresses */ return 0; /* address matches network interface address exactly? => no broadcast */ else if (addr2test == netif->ip_addr.addr) return 0; /* on the same (sub) network... */ else if (ip_addr_netcmp(addr, &(netif->ip_addr), &(netif->netmask)) /* ...and host identifier bits are all ones? =>... */ && ((addr2test & ~netif->netmask.addr) == (IP_ADDR_BROADCAST_VALUE & ~netif->netmask.addr))) /* => network broadcast address */ return 1; else return 0; } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/ip_frag.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * This is the IPv4 packet segmentation and reassembly implementation. * */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Jani Monoses * Simon Goldschmidt * original reassembly code by Adam Dunkels * */ #include "lwip/opt.h" #include "lwip/ip_frag.h" #include "lwip/ip.h" #include "lwip/inet.h" #include "lwip/inet_chksum.h" #include "lwip/netif.h" #include "lwip/snmp.h" #include "lwip/stats.h" #include "lwip/icmp.h" #include #if IP_REASSEMBLY /** * The IP reassembly code currently has the following limitations: * - IP header options are not supported * - fragments must not overlap (e.g. due to different routes), * currently, overlapping or duplicate fragments are thrown away * if IP_REASS_CHECK_OVERLAP=1 (the default)! * * @todo: work with IP header options */ /** Setting this to 0, you can turn off checking the fragments for overlapping * regions. The code gets a little smaller. Only use this if you know that * overlapping won't occur on your network! */ #ifndef IP_REASS_CHECK_OVERLAP #define IP_REASS_CHECK_OVERLAP 1 #endif /* IP_REASS_CHECK_OVERLAP */ /** Set to 0 to prevent freeing the oldest datagram when the reassembly buffer is * full (IP_REASS_MAX_PBUFS pbufs are enqueued). The code gets a little smaller. * Datagrams will be freed by timeout only. Especially useful when MEMP_NUM_REASSDATA * is set to 1, so one datagram can be reassembled at a time, only. */ #ifndef IP_REASS_FREE_OLDEST #define IP_REASS_FREE_OLDEST 1 #endif /* IP_REASS_FREE_OLDEST */ #define IP_REASS_FLAG_LASTFRAG 0x01 /** This is a helper struct which holds the starting * offset and the ending offset of this fragment to * easily chain the fragments. * It has to be packed since it has to fit inside the IP header. */ #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" #endif PACK_STRUCT_BEGIN struct ip_reass_helper { PACK_STRUCT_FIELD(struct pbuf *next_pbuf); PACK_STRUCT_FIELD(u16_t start); PACK_STRUCT_FIELD(u16_t end); } PACK_STRUCT_STRUCT; PACK_STRUCT_END #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/epstruct.h" #endif #define IP_ADDRESSES_AND_ID_MATCH(iphdrA, iphdrB) \ (ip_addr_cmp(&(iphdrA)->src, &(iphdrB)->src) && \ ip_addr_cmp(&(iphdrA)->dest, &(iphdrB)->dest) && \ IPH_ID(iphdrA) == IPH_ID(iphdrB)) ? 1 : 0 /* global variables */ static struct ip_reassdata *reassdatagrams; static u16_t ip_reass_pbufcount; /* function prototypes */ static void ip_reass_dequeue_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev); static int ip_reass_free_complete_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev); /** * Reassembly timer base function * for both NO_SYS == 0 and 1 (!). * * Should be called every 1000 msec (defined by IP_TMR_INTERVAL). */ void ip_reass_tmr(void) { struct ip_reassdata *r, *prev = NULL; r = reassdatagrams; while (r != NULL) { /* Decrement the timer. Once it reaches 0, * clean up the incomplete fragment assembly */ if (r->timer > 0) { r->timer--; LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass_tmr: timer dec %"U16_F"\n",(u16_t)r->timer)); prev = r; r = r->next; } else { /* reassembly timed out */ struct ip_reassdata *tmp; LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass_tmr: timer timed out\n")); tmp = r; /* get the next pointer before freeing */ r = r->next; /* free the helper struct and all enqueued pbufs */ ip_reass_free_complete_datagram(tmp, prev); } } } /** * Free a datagram (struct ip_reassdata) and all its pbufs. * Updates the total count of enqueued pbufs (ip_reass_pbufcount), * SNMP counters and sends an ICMP time exceeded packet. * * @param ipr datagram to free * @param prev the previous datagram in the linked list * @return the number of pbufs freed */ static int ip_reass_free_complete_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev) { int pbufs_freed = 0; struct pbuf *p; struct ip_reass_helper *iprh; LWIP_ASSERT("prev != ipr", prev != ipr); if (prev != NULL) { LWIP_ASSERT("prev->next == ipr", prev->next == ipr); } snmp_inc_ipreasmfails(); #if LWIP_ICMP iprh = (struct ip_reass_helper *)ipr->p->payload; if (iprh->start == 0) { /* The first fragment was received, send ICMP time exceeded. */ /* First, de-queue the first pbuf from r->p. */ p = ipr->p; ipr->p = iprh->next_pbuf; /* Then, copy the original header into it. */ SMEMCPY(p->payload, &ipr->iphdr, IP_HLEN); icmp_time_exceeded(p, ICMP_TE_FRAG); pbufs_freed += pbuf_clen(p); pbuf_free(p); } #endif /* LWIP_ICMP */ /* First, free all received pbufs. The individual pbufs need to be released separately as they have not yet been chained */ p = ipr->p; while (p != NULL) { struct pbuf *pcur; iprh = (struct ip_reass_helper *)p->payload; pcur = p; /* get the next pointer before freeing */ p = iprh->next_pbuf; pbufs_freed += pbuf_clen(pcur); pbuf_free(pcur); } /* Then, unchain the struct ip_reassdata from the list and free it. */ ip_reass_dequeue_datagram(ipr, prev); LWIP_ASSERT("ip_reass_pbufcount >= clen", ip_reass_pbufcount >= pbufs_freed); ip_reass_pbufcount -= pbufs_freed; return pbufs_freed; } #if IP_REASS_FREE_OLDEST /** * Free the oldest datagram to make room for enqueueing new fragments. * The datagram 'fraghdr' belongs to is not freed! * * @param fraghdr IP header of the current fragment * @param pbufs_needed number of pbufs needed to enqueue * (used for freeing other datagrams if not enough space) * @return the number of pbufs freed */ static int ip_reass_remove_oldest_datagram(struct ip_hdr *fraghdr, int pbufs_needed) { /* @todo Can't we simply remove the last datagram in the * linked list behind reassdatagrams? */ struct ip_reassdata *r, *oldest, *prev; int pbufs_freed = 0, pbufs_freed_current; int other_datagrams; /* Free datagrams until being allowed to enqueue 'pbufs_needed' pbufs, * but don't free the datagram that 'fraghdr' belongs to! */ do { oldest = NULL; prev = NULL; other_datagrams = 0; r = reassdatagrams; while (r != NULL) { if (!IP_ADDRESSES_AND_ID_MATCH(&r->iphdr, fraghdr)) { /* Not the same datagram as fraghdr */ other_datagrams++; if (oldest == NULL) { oldest = r; } else if (r->timer <= oldest->timer) { /* older than the previous oldest */ oldest = r; } } if (r->next != NULL) { prev = r; } r = r->next; } if (oldest != NULL) { pbufs_freed_current = ip_reass_free_complete_datagram(oldest, prev); pbufs_freed += pbufs_freed_current; } } while ((pbufs_freed < pbufs_needed) && (other_datagrams > 1)); return pbufs_freed; } #endif /* IP_REASS_FREE_OLDEST */ /** * Enqueues a new fragment into the fragment queue * @param fraghdr points to the new fragments IP hdr * @param clen number of pbufs needed to enqueue (used for freeing other datagrams if not enough space) * @return A pointer to the queue location into which the fragment was enqueued */ static struct ip_reassdata* ip_reass_enqueue_new_datagram(struct ip_hdr *fraghdr, int clen) { struct ip_reassdata* ipr; /* No matching previous fragment found, allocate a new reassdata struct */ ipr = memp_malloc(MEMP_REASSDATA); if (ipr == NULL) { #if IP_REASS_FREE_OLDEST if (ip_reass_remove_oldest_datagram(fraghdr, clen) >= clen) { ipr = memp_malloc(MEMP_REASSDATA); } if (ipr == NULL) #endif /* IP_REASS_FREE_OLDEST */ { IPFRAG_STATS_INC(ip_frag.memerr); LWIP_DEBUGF(IP_REASS_DEBUG,("Failed to alloc reassdata struct\n")); return NULL; } } memset(ipr, 0, sizeof(struct ip_reassdata)); ipr->timer = IP_REASS_MAXAGE; /* enqueue the new structure to the front of the list */ ipr->next = reassdatagrams; reassdatagrams = ipr; /* copy the ip header for later tests and input */ /* @todo: no ip options supported? */ SMEMCPY(&(ipr->iphdr), fraghdr, IP_HLEN); return ipr; } /** * Dequeues a datagram from the datagram queue. Doesn't deallocate the pbufs. * @param ipr points to the queue entry to dequeue */ static void ip_reass_dequeue_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev) { /* dequeue the reass struct */ if (reassdatagrams == ipr) { /* it was the first in the list */ reassdatagrams = ipr->next; } else { /* it wasn't the first, so it must have a valid 'prev' */ LWIP_ASSERT("sanity check linked list", prev != NULL); prev->next = ipr->next; } /* now we can free the ip_reass struct */ memp_free(MEMP_REASSDATA, ipr); } /** * Chain a new pbuf into the pbuf list that composes the datagram. The pbuf list * will grow over time as new pbufs are rx. * Also checks that the datagram passes basic continuity checks (if the last * fragment was received at least once). * @param root_p points to the 'root' pbuf for the current datagram being assembled. * @param new_p points to the pbuf for the current fragment * @return 0 if invalid, >0 otherwise */ static int ip_reass_chain_frag_into_datagram_and_validate(struct ip_reassdata *ipr, struct pbuf *new_p) { struct ip_reass_helper *iprh, *iprh_tmp, *iprh_prev=NULL; struct pbuf *q; u16_t offset,len; struct ip_hdr *fraghdr; int valid = 1; /* Extract length and fragment offset from current fragment */ fraghdr = (struct ip_hdr*)new_p->payload; len = ntohs(IPH_LEN(fraghdr)) - IPH_HL(fraghdr) * 4; offset = (ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) * 8; /* overwrite the fragment's ip header from the pbuf with our helper struct, * and setup the embedded helper structure. */ /* make sure the struct ip_reass_helper fits into the IP header */ LWIP_ASSERT("sizeof(struct ip_reass_helper) <= IP_HLEN", sizeof(struct ip_reass_helper) <= IP_HLEN); iprh = (struct ip_reass_helper*)new_p->payload; iprh->next_pbuf = NULL; iprh->start = offset; iprh->end = offset + len; /* Iterate through until we either get to the end of the list (append), * or we find on with a larger offset (insert). */ for (q = ipr->p; q != NULL;) { iprh_tmp = (struct ip_reass_helper*)q->payload; if (iprh->start < iprh_tmp->start) { /* the new pbuf should be inserted before this */ iprh->next_pbuf = q; if (iprh_prev != NULL) { /* not the fragment with the lowest offset */ #if IP_REASS_CHECK_OVERLAP if ((iprh->start < iprh_prev->end) || (iprh->end > iprh_tmp->start)) { /* fragment overlaps with previous or following, throw away */ goto freepbuf; } #endif /* IP_REASS_CHECK_OVERLAP */ iprh_prev->next_pbuf = new_p; } else { /* fragment with the lowest offset */ ipr->p = new_p; } break; } else if(iprh->start == iprh_tmp->start) { /* received the same datagram twice: no need to keep the datagram */ goto freepbuf; #if IP_REASS_CHECK_OVERLAP } else if(iprh->start < iprh_tmp->end) { /* overlap: no need to keep the new datagram */ goto freepbuf; #endif /* IP_REASS_CHECK_OVERLAP */ } else { /* Check if the fragments received so far have no wholes. */ if (iprh_prev != NULL) { if (iprh_prev->end != iprh_tmp->start) { /* There is a fragment missing between the current * and the previous fragment */ valid = 0; } } } q = iprh_tmp->next_pbuf; iprh_prev = iprh_tmp; } /* If q is NULL, then we made it to the end of the list. Determine what to do now */ if (q == NULL) { if (iprh_prev != NULL) { /* this is (for now), the fragment with the highest offset: * chain it to the last fragment */ #if IP_REASS_CHECK_OVERLAP LWIP_ASSERT("check fragments don't overlap", iprh_prev->end <= iprh->start); #endif /* IP_REASS_CHECK_OVERLAP */ iprh_prev->next_pbuf = new_p; if (iprh_prev->end != iprh->start) { valid = 0; } } else { #if IP_REASS_CHECK_OVERLAP LWIP_ASSERT("no previous fragment, this must be the first fragment!", ipr->p == NULL); #endif /* IP_REASS_CHECK_OVERLAP */ /* this is the first fragment we ever received for this ip datagram */ ipr->p = new_p; } } /* At this point, the validation part begins: */ /* If we already received the last fragment */ if ((ipr->flags & IP_REASS_FLAG_LASTFRAG) != 0) { /* and had no wholes so far */ if (valid) { /* then check if the rest of the fragments is here */ /* Check if the queue starts with the first datagram */ if (((struct ip_reass_helper*)ipr->p->payload)->start != 0) { valid = 0; } else { /* and check that there are no wholes after this datagram */ iprh_prev = iprh; q = iprh->next_pbuf; while (q != NULL) { iprh = (struct ip_reass_helper*)q->payload; if (iprh_prev->end != iprh->start) { valid = 0; break; } iprh_prev = iprh; q = iprh->next_pbuf; } /* if still valid, all fragments are received * (because to the MF==0 already arrived */ if (valid) { LWIP_ASSERT("sanity check", ipr->p != NULL); LWIP_ASSERT("sanity check", ((struct ip_reass_helper*)ipr->p->payload) != iprh); LWIP_ASSERT("validate_datagram:next_pbuf!=NULL", iprh->next_pbuf == NULL); LWIP_ASSERT("validate_datagram:datagram end!=datagram len", iprh->end == ipr->datagram_len); } } } /* If valid is 0 here, there are some fragments missing in the middle * (since MF == 0 has already arrived). Such datagrams simply time out if * no more fragments are received... */ return valid; } /* If we come here, not all fragments were received, yet! */ return 0; /* not yet valid! */ #if IP_REASS_CHECK_OVERLAP freepbuf: ip_reass_pbufcount -= pbuf_clen(new_p); pbuf_free(new_p); return 0; #endif /* IP_REASS_CHECK_OVERLAP */ } /** * Reassembles incoming IP fragments into an IP datagram. * * @param p points to a pbuf chain of the fragment * @return NULL if reassembly is incomplete, ? otherwise */ struct pbuf * ip_reass(struct pbuf *p) { struct pbuf *r; struct ip_hdr *fraghdr; struct ip_reassdata *ipr; struct ip_reass_helper *iprh; u16_t offset, len; u8_t clen; struct ip_reassdata *ipr_prev = NULL; IPFRAG_STATS_INC(ip_frag.recv); snmp_inc_ipreasmreqds(); fraghdr = (struct ip_hdr*)p->payload; if ((IPH_HL(fraghdr) * 4) != IP_HLEN) { LWIP_DEBUGF(IP_REASS_DEBUG,("ip_reass: IP options currently not supported!\n")); IPFRAG_STATS_INC(ip_frag.err); goto nullreturn; } offset = (ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) * 8; len = ntohs(IPH_LEN(fraghdr)) - IPH_HL(fraghdr) * 4; /* Check if we are allowed to enqueue more datagrams. */ clen = pbuf_clen(p); if ((ip_reass_pbufcount + clen) > IP_REASS_MAX_PBUFS) { #if IP_REASS_FREE_OLDEST if (!ip_reass_remove_oldest_datagram(fraghdr, clen) || ((ip_reass_pbufcount + clen) > IP_REASS_MAX_PBUFS)) #endif /* IP_REASS_FREE_OLDEST */ { /* No datagram could be freed and still too many pbufs enqueued */ LWIP_DEBUGF(IP_REASS_DEBUG,("ip_reass: Overflow condition: pbufct=%d, clen=%d, MAX=%d\n", ip_reass_pbufcount, clen, IP_REASS_MAX_PBUFS)); IPFRAG_STATS_INC(ip_frag.memerr); /* @todo: send ICMP time exceeded here? */ /* drop this pbuf */ goto nullreturn; } } /* Look for the datagram the fragment belongs to in the current datagram queue, * remembering the previous in the queue for later dequeueing. */ for (ipr = reassdatagrams; ipr != NULL; ipr = ipr->next) { /* Check if the incoming fragment matches the one currently present in the reassembly buffer. If so, we proceed with copying the fragment into the buffer. */ if (IP_ADDRESSES_AND_ID_MATCH(&ipr->iphdr, fraghdr)) { LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass: matching previous fragment ID=%"X16_F"\n", ntohs(IPH_ID(fraghdr)))); IPFRAG_STATS_INC(ip_frag.cachehit); break; } ipr_prev = ipr; } if (ipr == NULL) { /* Enqueue a new datagram into the datagram queue */ ipr = ip_reass_enqueue_new_datagram(fraghdr, clen); /* Bail if unable to enqueue */ if(ipr == NULL) { goto nullreturn; } } else { if (((ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) == 0) && ((ntohs(IPH_OFFSET(&ipr->iphdr)) & IP_OFFMASK) != 0)) { /* ipr->iphdr is not the header from the first fragment, but fraghdr is * -> copy fraghdr into ipr->iphdr since we want to have the header * of the first fragment (for ICMP time exceeded and later, for copying * all options, if supported)*/ SMEMCPY(&ipr->iphdr, fraghdr, IP_HLEN); } } /* Track the current number of pbufs current 'in-flight', in order to limit the number of fragments that may be enqueued at any one time */ ip_reass_pbufcount += clen; /* At this point, we have either created a new entry or pointing * to an existing one */ /* check for 'no more fragments', and update queue entry*/ if ((ntohs(IPH_OFFSET(fraghdr)) & IP_MF) == 0) { ipr->flags |= IP_REASS_FLAG_LASTFRAG; ipr->datagram_len = offset + len; LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass: last fragment seen, total len %"S16_F"\n", ipr->datagram_len)); } /* find the right place to insert this pbuf */ /* @todo: trim pbufs if fragments are overlapping */ if (ip_reass_chain_frag_into_datagram_and_validate(ipr, p)) { /* the totally last fragment (flag more fragments = 0) was received at least * once AND all fragments are received */ ipr->datagram_len += IP_HLEN; /* save the second pbuf before copying the header over the pointer */ r = ((struct ip_reass_helper*)ipr->p->payload)->next_pbuf; /* copy the original ip header back to the first pbuf */ fraghdr = (struct ip_hdr*)(ipr->p->payload); SMEMCPY(fraghdr, &ipr->iphdr, IP_HLEN); IPH_LEN_SET(fraghdr, htons(ipr->datagram_len)); IPH_OFFSET_SET(fraghdr, 0); IPH_CHKSUM_SET(fraghdr, 0); /* @todo: do we need to set calculate the correct checksum? */ IPH_CHKSUM_SET(fraghdr, inet_chksum(fraghdr, IP_HLEN)); p = ipr->p; /* chain together the pbufs contained within the reass_data list. */ while(r != NULL) { iprh = (struct ip_reass_helper*)r->payload; /* hide the ip header for every succeding fragment */ pbuf_header(r, -IP_HLEN); pbuf_cat(p, r); r = iprh->next_pbuf; } /* release the sources allocate for the fragment queue entry */ ip_reass_dequeue_datagram(ipr, ipr_prev); /* and adjust the number of pbufs currently queued for reassembly. */ ip_reass_pbufcount -= pbuf_clen(p); /* Return the pbuf chain */ return p; } /* the datagram is not (yet?) reassembled completely */ LWIP_DEBUGF(IP_REASS_DEBUG,("ip_reass_pbufcount: %d out\n", ip_reass_pbufcount)); return NULL; nullreturn: LWIP_DEBUGF(IP_REASS_DEBUG,("ip_reass: nullreturn\n")); IPFRAG_STATS_INC(ip_frag.drop); pbuf_free(p); return NULL; } #endif /* IP_REASSEMBLY */ #if IP_FRAG #if IP_FRAG_USES_STATIC_BUF static u8_t buf[LWIP_MEM_ALIGN_SIZE(IP_FRAG_MAX_MTU + MEM_ALIGNMENT - 1)]; #endif /* IP_FRAG_USES_STATIC_BUF */ /** * Fragment an IP datagram if too large for the netif. * * Chop the datagram in MTU sized chunks and send them in order * by using a fixed size static memory buffer (PBUF_REF) or * point PBUF_REFs into p (depending on IP_FRAG_USES_STATIC_BUF). * * @param p ip packet to send * @param netif the netif on which to send * @param dest destination ip address to which to send * * @return ERR_OK if sent successfully, err_t otherwise */ err_t ip_frag(struct pbuf *p, struct netif *netif, struct ip_addr *dest) { struct pbuf *rambuf; #if IP_FRAG_USES_STATIC_BUF struct pbuf *header; #else struct pbuf *newpbuf; struct ip_hdr *original_iphdr; #endif struct ip_hdr *iphdr; u16_t nfb; u16_t left, cop; u16_t mtu = netif->mtu; u16_t ofo, omf; u16_t last; u16_t poff = IP_HLEN; u16_t tmp; #if !IP_FRAG_USES_STATIC_BUF u16_t newpbuflen = 0; u16_t left_to_copy; #endif /* Get a RAM based MTU sized pbuf */ #if IP_FRAG_USES_STATIC_BUF /* When using a static buffer, we use a PBUF_REF, which we will * use to reference the packet (without link header). * Layer and length is irrelevant. */ rambuf = pbuf_alloc(PBUF_LINK, 0, PBUF_REF); if (rambuf == NULL) { LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_frag: pbuf_alloc(PBUF_LINK, 0, PBUF_REF) failed\n")); return ERR_MEM; } rambuf->tot_len = rambuf->len = mtu; rambuf->payload = LWIP_MEM_ALIGN((void *)buf); /* Copy the IP header in it */ iphdr = rambuf->payload; SMEMCPY(iphdr, p->payload, IP_HLEN); #else /* IP_FRAG_USES_STATIC_BUF */ original_iphdr = p->payload; iphdr = original_iphdr; #endif /* IP_FRAG_USES_STATIC_BUF */ /* Save original offset */ tmp = ntohs(IPH_OFFSET(iphdr)); ofo = tmp & IP_OFFMASK; omf = tmp & IP_MF; left = p->tot_len - IP_HLEN; nfb = (mtu - IP_HLEN) / 8; while (left) { last = (left <= mtu - IP_HLEN); /* Set new offset and MF flag */ tmp = omf | (IP_OFFMASK & (ofo)); if (!last) tmp = tmp | IP_MF; /* Fill this fragment */ cop = last ? left : nfb * 8; #if IP_FRAG_USES_STATIC_BUF poff += pbuf_copy_partial(p, (u8_t*)iphdr + IP_HLEN, cop, poff); #else /* IP_FRAG_USES_STATIC_BUF */ /* When not using a static buffer, create a chain of pbufs. * The first will be a PBUF_RAM holding the link and IP header. * The rest will be PBUF_REFs mirroring the pbuf chain to be fragged, * but limited to the size of an mtu. */ rambuf = pbuf_alloc(PBUF_LINK, IP_HLEN, PBUF_RAM); if (rambuf == NULL) { return ERR_MEM; } LWIP_ASSERT("this needs a pbuf in one piece!", (p->len >= (IP_HLEN))); SMEMCPY(rambuf->payload, original_iphdr, IP_HLEN); iphdr = rambuf->payload; /* Can just adjust p directly for needed offset. */ p->payload = (u8_t *)p->payload + poff; p->len -= poff; left_to_copy = cop; while (left_to_copy) { newpbuflen = (left_to_copy < p->len) ? left_to_copy : p->len; /* Is this pbuf already empty? */ if (!newpbuflen) { p = p->next; continue; } newpbuf = pbuf_alloc(PBUF_RAW, 0, PBUF_REF); if (newpbuf == NULL) { pbuf_free(rambuf); return ERR_MEM; } /* Mirror this pbuf, although we might not need all of it. */ newpbuf->payload = p->payload; newpbuf->len = newpbuf->tot_len = newpbuflen; /* Add it to end of rambuf's chain, but using pbuf_cat, not pbuf_chain * so that it is removed when pbuf_dechain is later called on rambuf. */ pbuf_cat(rambuf, newpbuf); left_to_copy -= newpbuflen; if (left_to_copy) p = p->next; } poff = newpbuflen; #endif /* IP_FRAG_USES_STATIC_BUF */ /* Correct header */ IPH_OFFSET_SET(iphdr, htons(tmp)); IPH_LEN_SET(iphdr, htons(cop + IP_HLEN)); IPH_CHKSUM_SET(iphdr, 0); IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, IP_HLEN)); #if IP_FRAG_USES_STATIC_BUF if (last) pbuf_realloc(rambuf, left + IP_HLEN); /* This part is ugly: we alloc a RAM based pbuf for * the link level header for each chunk and then * free it.A PBUF_ROM style pbuf for which pbuf_header * worked would make things simpler. */ header = pbuf_alloc(PBUF_LINK, 0, PBUF_RAM); if (header != NULL) { pbuf_chain(header, rambuf); netif->output(netif, header, dest); IPFRAG_STATS_INC(ip_frag.xmit); snmp_inc_ipfragcreates(); pbuf_free(header); } else { LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_frag: pbuf_alloc() for header failed\n")); pbuf_free(rambuf); return ERR_MEM; } #else /* IP_FRAG_USES_STATIC_BUF */ /* No need for separate header pbuf - we allowed room for it in rambuf * when allocated. */ netif->output(netif, rambuf, dest); IPFRAG_STATS_INC(ip_frag.xmit); /* Unfortunately we can't reuse rambuf - the hardware may still be * using the buffer. Instead we free it (and the ensuing chain) and * recreate it next time round the loop. If we're lucky the hardware * will have already sent the packet, the free will really free, and * there will be zero memory penalty. */ pbuf_free(rambuf); #endif /* IP_FRAG_USES_STATIC_BUF */ left -= cop; ofo += nfb; } #if IP_FRAG_USES_STATIC_BUF pbuf_free(rambuf); #endif /* IP_FRAG_USES_STATIC_BUF */ snmp_inc_ipfragoks(); return ERR_OK; } #endif /* IP_FRAG */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/mem.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * Dynamic memory manager * * This is a lightweight replacement for the standard C library malloc(). * * If you want to use the standard C library malloc() instead, define * MEM_LIBC_MALLOC to 1 in your lwipopts.h * * To let mem_malloc() use pools (prevents fragmentation and is much faster than * a heap but might waste some memory), define MEM_USE_POOLS to 1, define * MEM_USE_CUSTOM_POOLS to 1 and create a file "lwippools.h" that includes a list * of pools like this (more pools can be added between _START and _END): * * Define three pools with sizes 256, 512, and 1512 bytes * LWIP_MALLOC_MEMPOOL_START * LWIP_MALLOC_MEMPOOL(20, 256) * LWIP_MALLOC_MEMPOOL(10, 512) * LWIP_MALLOC_MEMPOOL(5, 1512) * LWIP_MALLOC_MEMPOOL_END */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * Simon Goldschmidt * */ #include "lwip/opt.h" #if !MEM_LIBC_MALLOC /* don't build if not configured for use in lwipopts.h */ #include "lwip/def.h" #include "lwip/mem.h" #include "lwip/sys.h" #include "lwip/stats.h" #include #if MEM_USE_POOLS /* lwIP head implemented with different sized pools */ /** * Allocate memory: determine the smallest pool that is big enough * to contain an element of 'size' and get an element from that pool. * * @param size the size in bytes of the memory needed * @return a pointer to the allocated memory or NULL if the pool is empty */ void * mem_malloc(mem_size_t size) { struct memp_malloc_helper *element; memp_t poolnr; mem_size_t required_size = size + sizeof(struct memp_malloc_helper); for (poolnr = MEMP_POOL_FIRST; poolnr <= MEMP_POOL_LAST; poolnr++) { #if MEM_USE_POOLS_TRY_BIGGER_POOL again: #endif /* MEM_USE_POOLS_TRY_BIGGER_POOL */ /* is this pool big enough to hold an element of the required size plus a struct memp_malloc_helper that saves the pool this element came from? */ if (required_size <= memp_sizes[poolnr]) { break; } } if (poolnr > MEMP_POOL_LAST) { LWIP_ASSERT("mem_malloc(): no pool is that big!", 0); return NULL; } element = (struct memp_malloc_helper*)memp_malloc(poolnr); if (element == NULL) { /* No need to DEBUGF or ASSERT: This error is already taken care of in memp.c */ #if MEM_USE_POOLS_TRY_BIGGER_POOL /** Try a bigger pool if this one is empty! */ if (poolnr < MEMP_POOL_LAST) { poolnr++; goto again; } #endif /* MEM_USE_POOLS_TRY_BIGGER_POOL */ return NULL; } /* save the pool number this element came from */ element->poolnr = poolnr; /* and return a pointer to the memory directly after the struct memp_malloc_helper */ element++; return element; } /** * Free memory previously allocated by mem_malloc. Loads the pool number * and calls memp_free with that pool number to put the element back into * its pool * * @param rmem the memory element to free */ void mem_free(void *rmem) { struct memp_malloc_helper *hmem = (struct memp_malloc_helper*)rmem; LWIP_ASSERT("rmem != NULL", (rmem != NULL)); LWIP_ASSERT("rmem == MEM_ALIGN(rmem)", (rmem == LWIP_MEM_ALIGN(rmem))); /* get the original struct memp_malloc_helper */ hmem--; LWIP_ASSERT("hmem != NULL", (hmem != NULL)); LWIP_ASSERT("hmem == MEM_ALIGN(hmem)", (hmem == LWIP_MEM_ALIGN(hmem))); LWIP_ASSERT("hmem->poolnr < MEMP_MAX", (hmem->poolnr < MEMP_MAX)); /* and put it in the pool we saved earlier */ memp_free(hmem->poolnr, hmem); } #else /* MEM_USE_POOLS */ /* lwIP replacement for your libc malloc() */ /** * The heap is made up as a list of structs of this type. * This does not have to be aligned since for getting its size, * we only use the macro SIZEOF_STRUCT_MEM, which automatically alignes. */ struct mem { /** index (-> ram[next]) of the next struct */ mem_size_t next; /** index (-> ram[next]) of the next struct */ mem_size_t prev; /** 1: this area is used; 0: this area is unused */ u8_t used; }; /** All allocated blocks will be MIN_SIZE bytes big, at least! * MIN_SIZE can be overridden to suit your needs. Smaller values save space, * larger values could prevent too small blocks to fragment the RAM too much. */ #ifndef MIN_SIZE #define MIN_SIZE 12 #endif /* MIN_SIZE */ /* some alignment macros: we define them here for better source code layout */ #define MIN_SIZE_ALIGNED LWIP_MEM_ALIGN_SIZE(MIN_SIZE) #define SIZEOF_STRUCT_MEM LWIP_MEM_ALIGN_SIZE(sizeof(struct mem)) #define MEM_SIZE_ALIGNED LWIP_MEM_ALIGN_SIZE(MEM_SIZE) /** the heap. we need one struct mem at the end and some room for alignment */ static u8_t ram_heap[MEM_SIZE_ALIGNED + (2*SIZEOF_STRUCT_MEM) + MEM_ALIGNMENT]; /** pointer to the heap (ram_heap): for alignment, ram is now a pointer instead of an array */ static u8_t *ram; /** the last entry, always unused! */ static struct mem *ram_end; /** pointer to the lowest free block, this is used for faster search */ static struct mem *lfree; /** concurrent access protection */ static sys_sem_t mem_sem; #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT static volatile u8_t mem_free_count; /* Allow mem_free from other (e.g. interrupt) context */ #define LWIP_MEM_FREE_DECL_PROTECT() SYS_ARCH_DECL_PROTECT(lev_free) #define LWIP_MEM_FREE_PROTECT() SYS_ARCH_PROTECT(lev_free) #define LWIP_MEM_FREE_UNPROTECT() SYS_ARCH_UNPROTECT(lev_free) #define LWIP_MEM_ALLOC_DECL_PROTECT() SYS_ARCH_DECL_PROTECT(lev_alloc) #define LWIP_MEM_ALLOC_PROTECT() SYS_ARCH_PROTECT(lev_alloc) #define LWIP_MEM_ALLOC_UNPROTECT() SYS_ARCH_UNPROTECT(lev_alloc) #else /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ /* Protect the heap only by using a semaphore */ #define LWIP_MEM_FREE_DECL_PROTECT() #define LWIP_MEM_FREE_PROTECT() sys_arch_sem_wait(mem_sem, 0) #define LWIP_MEM_FREE_UNPROTECT() sys_sem_signal(mem_sem) /* mem_malloc is protected using semaphore AND LWIP_MEM_ALLOC_PROTECT */ #define LWIP_MEM_ALLOC_DECL_PROTECT() #define LWIP_MEM_ALLOC_PROTECT() #define LWIP_MEM_ALLOC_UNPROTECT() #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ /** * "Plug holes" by combining adjacent empty struct mems. * After this function is through, there should not exist * one empty struct mem pointing to another empty struct mem. * * @param mem this points to a struct mem which just has been freed * @internal this function is only called by mem_free() and mem_realloc() * * This assumes access to the heap is protected by the calling function * already. */ static void plug_holes(struct mem *mem) { struct mem *nmem; struct mem *pmem; LWIP_ASSERT("plug_holes: mem >= ram", (u8_t *)mem >= ram); LWIP_ASSERT("plug_holes: mem < ram_end", (u8_t *)mem < (u8_t *)ram_end); LWIP_ASSERT("plug_holes: mem->used == 0", mem->used == 0); /* plug hole forward */ LWIP_ASSERT("plug_holes: mem->next <= MEM_SIZE_ALIGNED", mem->next <= MEM_SIZE_ALIGNED); nmem = (struct mem *)&ram[mem->next]; if (mem != nmem && nmem->used == 0 && (u8_t *)nmem != (u8_t *)ram_end) { /* if mem->next is unused and not end of ram, combine mem and mem->next */ if (lfree == nmem) { lfree = mem; } mem->next = nmem->next; ((struct mem *)&ram[nmem->next])->prev = (u8_t *)mem - ram; } /* plug hole backward */ pmem = (struct mem *)&ram[mem->prev]; if (pmem != mem && pmem->used == 0) { /* if mem->prev is unused, combine mem and mem->prev */ if (lfree == mem) { lfree = pmem; } pmem->next = mem->next; ((struct mem *)&ram[mem->next])->prev = (u8_t *)pmem - ram; } } /** * Zero the heap and initialize start, end and lowest-free */ void mem_init(void) { struct mem *mem; LWIP_ASSERT("Sanity check alignment", (SIZEOF_STRUCT_MEM & (MEM_ALIGNMENT-1)) == 0); /* align the heap */ ram = LWIP_MEM_ALIGN(ram_heap); /* initialize the start of the heap */ mem = (struct mem *)ram; mem->next = MEM_SIZE_ALIGNED; mem->prev = 0; mem->used = 0; /* initialize the end of the heap */ ram_end = (struct mem *)&ram[MEM_SIZE_ALIGNED]; ram_end->used = 1; ram_end->next = MEM_SIZE_ALIGNED; ram_end->prev = MEM_SIZE_ALIGNED; mem_sem = sys_sem_new(1); /* initialize the lowest-free pointer to the start of the heap */ lfree = (struct mem *)ram; MEM_STATS_AVAIL(avail, MEM_SIZE_ALIGNED); } /** * Put a struct mem back on the heap * * @param rmem is the data portion of a struct mem as returned by a previous * call to mem_malloc() */ void mem_free(void *rmem) { struct mem *mem; LWIP_MEM_FREE_DECL_PROTECT(); if (rmem == NULL) { LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("mem_free(p == NULL) was called.\n")); return; } LWIP_ASSERT("mem_free: sanity check alignment", (((mem_ptr_t)rmem) & (MEM_ALIGNMENT-1)) == 0); LWIP_ASSERT("mem_free: legal memory", (u8_t *)rmem >= (u8_t *)ram && (u8_t *)rmem < (u8_t *)ram_end); if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) { SYS_ARCH_DECL_PROTECT(lev); LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: illegal memory\n")); /* protect mem stats from concurrent access */ SYS_ARCH_PROTECT(lev); MEM_STATS_INC(illegal); SYS_ARCH_UNPROTECT(lev); return; } /* protect the heap from concurrent access */ LWIP_MEM_FREE_PROTECT(); /* Get the corresponding struct mem ... */ mem = (struct mem *)((u8_t *)rmem - SIZEOF_STRUCT_MEM); /* ... which has to be in a used state ... */ LWIP_ASSERT("mem_free: mem->used", mem->used); /* ... and is now unused. */ mem->used = 0; if (mem < lfree) { /* the newly freed struct is now the lowest */ lfree = mem; } MEM_STATS_DEC_USED(used, mem->next - ((u8_t *)mem - ram)); /* finally, see if prev or next are free also */ plug_holes(mem); #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT mem_free_count = 1; #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ LWIP_MEM_FREE_UNPROTECT(); } /** * In contrast to its name, mem_realloc can only shrink memory, not expand it. * Since the only use (for now) is in pbuf_realloc (which also can only shrink), * this shouldn't be a problem! * * @param rmem pointer to memory allocated by mem_malloc the is to be shrinked * @param newsize required size after shrinking (needs to be smaller than or * equal to the previous size) * @return for compatibility reasons: is always == rmem, at the moment * or NULL if newsize is > old size, in which case rmem is NOT touched * or freed! */ void * mem_realloc(void *rmem, mem_size_t newsize) { mem_size_t size; mem_size_t ptr, ptr2; struct mem *mem, *mem2; /* use the FREE_PROTECT here: it protects with sem OR SYS_ARCH_PROTECT */ LWIP_MEM_FREE_DECL_PROTECT(); /* Expand the size of the allocated memory region so that we can adjust for alignment. */ newsize = LWIP_MEM_ALIGN_SIZE(newsize); if(newsize < MIN_SIZE_ALIGNED) { /* every data block must be at least MIN_SIZE_ALIGNED long */ newsize = MIN_SIZE_ALIGNED; } if (newsize > MEM_SIZE_ALIGNED) { return NULL; } LWIP_ASSERT("mem_realloc: legal memory", (u8_t *)rmem >= (u8_t *)ram && (u8_t *)rmem < (u8_t *)ram_end); if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) { SYS_ARCH_DECL_PROTECT(lev); LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_realloc: illegal memory\n")); /* protect mem stats from concurrent access */ SYS_ARCH_PROTECT(lev); MEM_STATS_INC(illegal); SYS_ARCH_UNPROTECT(lev); return rmem; } /* Get the corresponding struct mem ... */ mem = (struct mem *)((u8_t *)rmem - SIZEOF_STRUCT_MEM); /* ... and its offset pointer */ ptr = (u8_t *)mem - ram; size = mem->next - ptr - SIZEOF_STRUCT_MEM; LWIP_ASSERT("mem_realloc can only shrink memory", newsize <= size); if (newsize > size) { /* not supported */ return NULL; } if (newsize == size) { /* No change in size, simply return */ return rmem; } /* protect the heap from concurrent access */ LWIP_MEM_FREE_PROTECT(); MEM_STATS_DEC_USED(used, (size - newsize)); mem2 = (struct mem *)&ram[mem->next]; if(mem2->used == 0) { /* The next struct is unused, we can simply move it at little */ mem_size_t next; /* remember the old next pointer */ next = mem2->next; /* create new struct mem which is moved directly after the shrinked mem */ ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize; if (lfree == mem2) { lfree = (struct mem *)&ram[ptr2]; } mem2 = (struct mem *)&ram[ptr2]; mem2->used = 0; /* restore the next pointer */ mem2->next = next; /* link it back to mem */ mem2->prev = ptr; /* link mem to it */ mem->next = ptr2; /* last thing to restore linked list: as we have moved mem2, * let 'mem2->next->prev' point to mem2 again. but only if mem2->next is not * the end of the heap */ if (mem2->next != MEM_SIZE_ALIGNED) { ((struct mem *)&ram[mem2->next])->prev = ptr2; } /* no need to plug holes, we've already done that */ } else if (newsize + SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED <= size) { /* Next struct is used but there's room for another struct mem with * at least MIN_SIZE_ALIGNED of data. * Old size ('size') must be big enough to contain at least 'newsize' plus a struct mem * ('SIZEOF_STRUCT_MEM') with some data ('MIN_SIZE_ALIGNED'). * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty * region that couldn't hold data, but when mem->next gets freed, * the 2 regions would be combined, resulting in more free memory */ ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize; mem2 = (struct mem *)&ram[ptr2]; if (mem2 < lfree) { lfree = mem2; } mem2->used = 0; mem2->next = mem->next; mem2->prev = ptr; mem->next = ptr2; if (mem2->next != MEM_SIZE_ALIGNED) { ((struct mem *)&ram[mem2->next])->prev = ptr2; } /* the original mem->next is used, so no need to plug holes! */ } /* else { next struct mem is used but size between mem and mem2 is not big enough to create another struct mem -> don't do anyhting. -> the remaining space stays unused since it is too small } */ #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT mem_free_count = 1; #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ LWIP_MEM_FREE_UNPROTECT(); return rmem; } /** * Adam's mem_malloc() plus solution for bug #17922 * Allocate a block of memory with a minimum of 'size' bytes. * * @param size is the minimum size of the requested block in bytes. * @return pointer to allocated memory or NULL if no free memory was found. * * Note that the returned value will always be aligned (as defined by MEM_ALIGNMENT). */ void * mem_malloc(mem_size_t size) { mem_size_t ptr, ptr2; struct mem *mem, *mem2; #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT u8_t local_mem_free_count = 0; #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ LWIP_MEM_ALLOC_DECL_PROTECT(); if (size == 0) { return NULL; } /* Expand the size of the allocated memory region so that we can adjust for alignment. */ size = LWIP_MEM_ALIGN_SIZE(size); if(size < MIN_SIZE_ALIGNED) { /* every data block must be at least MIN_SIZE_ALIGNED long */ size = MIN_SIZE_ALIGNED; } if (size > MEM_SIZE_ALIGNED) { return NULL; } /* protect the heap from concurrent access */ sys_arch_sem_wait(mem_sem, 0); LWIP_MEM_ALLOC_PROTECT(); #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT /* run as long as a mem_free disturbed mem_malloc */ do { local_mem_free_count = 0; #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ /* Scan through the heap searching for a free block that is big enough, * beginning with the lowest free block. */ for (ptr = (u8_t *)lfree - ram; ptr < MEM_SIZE_ALIGNED - size; ptr = ((struct mem *)&ram[ptr])->next) { mem = (struct mem *)&ram[ptr]; #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT mem_free_count = 0; LWIP_MEM_ALLOC_UNPROTECT(); /* allow mem_free to run */ LWIP_MEM_ALLOC_PROTECT(); if (mem_free_count != 0) { local_mem_free_count = mem_free_count; } mem_free_count = 0; #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ if ((!mem->used) && (mem->next - (ptr + SIZEOF_STRUCT_MEM)) >= size) { /* mem is not used and at least perfect fit is possible: * mem->next - (ptr + SIZEOF_STRUCT_MEM) gives us the 'user data size' of mem */ if (mem->next - (ptr + SIZEOF_STRUCT_MEM) >= (size + SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED)) { /* (in addition to the above, we test if another struct mem (SIZEOF_STRUCT_MEM) containing * at least MIN_SIZE_ALIGNED of data also fits in the 'user data space' of 'mem') * -> split large block, create empty remainder, * remainder must be large enough to contain MIN_SIZE_ALIGNED data: if * mem->next - (ptr + (2*SIZEOF_STRUCT_MEM)) == size, * struct mem would fit in but no data between mem2 and mem2->next * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty * region that couldn't hold data, but when mem->next gets freed, * the 2 regions would be combined, resulting in more free memory */ ptr2 = ptr + SIZEOF_STRUCT_MEM + size; /* create mem2 struct */ mem2 = (struct mem *)&ram[ptr2]; mem2->used = 0; mem2->next = mem->next; mem2->prev = ptr; /* and insert it between mem and mem->next */ mem->next = ptr2; mem->used = 1; if (mem2->next != MEM_SIZE_ALIGNED) { ((struct mem *)&ram[mem2->next])->prev = ptr2; } MEM_STATS_INC_USED(used, (size + SIZEOF_STRUCT_MEM)); } else { /* (a mem2 struct does no fit into the user data space of mem and mem->next will always * be used at this point: if not we have 2 unused structs in a row, plug_holes should have * take care of this). * -> near fit or excact fit: do not split, no mem2 creation * also can't move mem->next directly behind mem, since mem->next * will always be used at this point! */ mem->used = 1; MEM_STATS_INC_USED(used, mem->next - ((u8_t *)mem - ram)); } if (mem == lfree) { /* Find next free block after mem and update lowest free pointer */ while (lfree->used && lfree != ram_end) { LWIP_MEM_ALLOC_UNPROTECT(); /* prevent high interrupt latency... */ LWIP_MEM_ALLOC_PROTECT(); lfree = (struct mem *)&ram[lfree->next]; } LWIP_ASSERT("mem_malloc: !lfree->used", ((lfree == ram_end) || (!lfree->used))); } LWIP_MEM_ALLOC_UNPROTECT(); sys_sem_signal(mem_sem); LWIP_ASSERT("mem_malloc: allocated memory not above ram_end.", (mem_ptr_t)mem + SIZEOF_STRUCT_MEM + size <= (mem_ptr_t)ram_end); LWIP_ASSERT("mem_malloc: allocated memory properly aligned.", ((mem_ptr_t)mem + SIZEOF_STRUCT_MEM) % MEM_ALIGNMENT == 0); LWIP_ASSERT("mem_malloc: sanity check alignment", (((mem_ptr_t)mem) & (MEM_ALIGNMENT-1)) == 0); return (u8_t *)mem + SIZEOF_STRUCT_MEM; } } #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT /* if we got interrupted by a mem_free, try again */ } while(local_mem_free_count != 0); #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("mem_malloc: could not allocate %"S16_F" bytes\n", (s16_t)size)); MEM_STATS_INC(err); LWIP_MEM_ALLOC_UNPROTECT(); sys_sem_signal(mem_sem); return NULL; } #endif /* MEM_USE_POOLS */ /** * Contiguously allocates enough space for count objects that are size bytes * of memory each and returns a pointer to the allocated memory. * * The allocated memory is filled with bytes of value zero. * * @param count number of objects to allocate * @param size size of the objects to allocate * @return pointer to allocated memory / NULL pointer if there is an error */ void *mem_calloc(mem_size_t count, mem_size_t size) { void *p; /* allocate 'count' objects of size 'size' */ p = mem_malloc(count * size); if (p) { /* zero the memory */ memset(p, 0, count * size); } return p; } #endif /* !MEM_LIBC_MALLOC */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/memp.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * Dynamic pool memory manager * * lwIP has dedicated pools for many structures (netconn, protocol control blocks, * packet buffers, ...). All these pools are managed here. */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #include "lwip/opt.h" #include "lwip/memp.h" #include "lwip/pbuf.h" #include "lwip/udp.h" #include "lwip/raw.h" #include "lwip/tcp.h" #include "lwip/igmp.h" #include "lwip/api.h" #include "lwip/api_msg.h" #include "lwip/tcpip.h" #include "lwip/sys.h" #include "lwip/stats.h" #include "netif/etharp.h" #include "lwip/ip_frag.h" #include #if !MEMP_MEM_MALLOC /* don't build if not configured for use in lwipopts.h */ struct memp { struct memp *next; #if MEMP_OVERFLOW_CHECK const char *file; int line; #endif /* MEMP_OVERFLOW_CHECK */ }; #if MEMP_OVERFLOW_CHECK /* if MEMP_OVERFLOW_CHECK is turned on, we reserve some bytes at the beginning * and at the end of each element, initialize them as 0xcd and check * them later. */ /* If MEMP_OVERFLOW_CHECK is >= 2, on every call to memp_malloc or memp_free, * every single element in each pool is checked! * This is VERY SLOW but also very helpful. */ /* MEMP_SANITY_REGION_BEFORE and MEMP_SANITY_REGION_AFTER can be overridden in * lwipopts.h to change the amount reserved for checking. */ #ifndef MEMP_SANITY_REGION_BEFORE #define MEMP_SANITY_REGION_BEFORE 16 #endif /* MEMP_SANITY_REGION_BEFORE*/ #if MEMP_SANITY_REGION_BEFORE > 0 #define MEMP_SANITY_REGION_BEFORE_ALIGNED LWIP_MEM_ALIGN_SIZE(MEMP_SANITY_REGION_BEFORE) #else #define MEMP_SANITY_REGION_BEFORE_ALIGNED 0 #endif /* MEMP_SANITY_REGION_BEFORE*/ #ifndef MEMP_SANITY_REGION_AFTER #define MEMP_SANITY_REGION_AFTER 16 #endif /* MEMP_SANITY_REGION_AFTER*/ #if MEMP_SANITY_REGION_AFTER > 0 #define MEMP_SANITY_REGION_AFTER_ALIGNED LWIP_MEM_ALIGN_SIZE(MEMP_SANITY_REGION_AFTER) #else #define MEMP_SANITY_REGION_AFTER_ALIGNED 0 #endif /* MEMP_SANITY_REGION_AFTER*/ /* MEMP_SIZE: save space for struct memp and for sanity check */ #define MEMP_SIZE (LWIP_MEM_ALIGN_SIZE(sizeof(struct memp)) + MEMP_SANITY_REGION_BEFORE_ALIGNED) #define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x) + MEMP_SANITY_REGION_AFTER_ALIGNED) #else /* MEMP_OVERFLOW_CHECK */ /* No sanity checks * We don't need to preserve the struct memp while not allocated, so we * can save a little space and set MEMP_SIZE to 0. */ #define MEMP_SIZE 0 #define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x)) #endif /* MEMP_OVERFLOW_CHECK */ /** This array holds the first free element of each pool. * Elements form a linked list. */ static struct memp *memp_tab[MEMP_MAX]; #else /* MEMP_MEM_MALLOC */ #define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x)) #endif /* MEMP_MEM_MALLOC */ /** This array holds the element sizes of each pool. */ #if !MEM_USE_POOLS && !MEMP_MEM_MALLOC static #endif const u16_t memp_sizes[MEMP_MAX] = { #define LWIP_MEMPOOL(name,num,size,desc) LWIP_MEM_ALIGN_SIZE(size), #include "lwip/memp_std.h" }; #if !MEMP_MEM_MALLOC /* don't build if not configured for use in lwipopts.h */ /** This array holds the number of elements in each pool. */ static const u16_t memp_num[MEMP_MAX] = { #define LWIP_MEMPOOL(name,num,size,desc) (num), #include "lwip/memp_std.h" }; /** This array holds a textual description of each pool. */ #ifdef LWIP_DEBUG static const char *memp_desc[MEMP_MAX] = { #define LWIP_MEMPOOL(name,num,size,desc) (desc), #include "lwip/memp_std.h" }; #endif /* LWIP_DEBUG */ /** This is the actual memory used by the pools. */ static u8_t memp_memory[MEM_ALIGNMENT - 1 #define LWIP_MEMPOOL(name,num,size,desc) + ( (num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size) ) ) #include "lwip/memp_std.h" ]; #if MEMP_SANITY_CHECK /** * Check that memp-lists don't form a circle */ static int memp_sanity(void) { s16_t i, c; struct memp *m, *n; for (i = 0; i < MEMP_MAX; i++) { for (m = memp_tab[i]; m != NULL; m = m->next) { c = 1; for (n = memp_tab[i]; n != NULL; n = n->next) { if (n == m && --c < 0) { return 0; } } } } return 1; } #endif /* MEMP_SANITY_CHECK*/ #if MEMP_OVERFLOW_CHECK /** * Check if a memp element was victim of an overflow * (e.g. the restricted area after it has been altered) * * @param p the memp element to check * @param memp_size the element size of the pool p comes from */ static void memp_overflow_check_element(struct memp *p, u16_t memp_size) { u16_t k; u8_t *m; #if MEMP_SANITY_REGION_BEFORE_ALIGNED > 0 m = (u8_t*)p + MEMP_SIZE - MEMP_SANITY_REGION_BEFORE_ALIGNED; for (k = 0; k < MEMP_SANITY_REGION_BEFORE_ALIGNED; k++) { if (m[k] != 0xcd) { LWIP_ASSERT("detected memp underflow!", 0); } } #endif #if MEMP_SANITY_REGION_AFTER_ALIGNED > 0 m = (u8_t*)p + MEMP_SIZE + memp_size; for (k = 0; k < MEMP_SANITY_REGION_AFTER_ALIGNED; k++) { if (m[k] != 0xcd) { LWIP_ASSERT("detected memp overflow!", 0); } } #endif } /** * Do an overflow check for all elements in every pool. * * @see memp_overflow_check_element for a description of the check */ static void memp_overflow_check_all(void) { u16_t i, j; struct memp *p; p = LWIP_MEM_ALIGN(memp_memory); for (i = 0; i < MEMP_MAX; ++i) { p = p; for (j = 0; j < memp_num[i]; ++j) { memp_overflow_check_element(p, memp_sizes[i]); p = (struct memp*)((u8_t*)p + MEMP_SIZE + memp_sizes[i] + MEMP_SANITY_REGION_AFTER_ALIGNED); } } } /** * Initialize the restricted areas of all memp elements in every pool. */ static void memp_overflow_init(void) { u16_t i, j; struct memp *p; u8_t *m; p = LWIP_MEM_ALIGN(memp_memory); for (i = 0; i < MEMP_MAX; ++i) { p = p; for (j = 0; j < memp_num[i]; ++j) { #if MEMP_SANITY_REGION_BEFORE_ALIGNED > 0 m = (u8_t*)p + MEMP_SIZE - MEMP_SANITY_REGION_BEFORE_ALIGNED; memset(m, 0xcd, MEMP_SANITY_REGION_BEFORE_ALIGNED); #endif #if MEMP_SANITY_REGION_AFTER_ALIGNED > 0 m = (u8_t*)p + MEMP_SIZE + memp_sizes[i]; memset(m, 0xcd, MEMP_SANITY_REGION_AFTER_ALIGNED); #endif p = (struct memp*)((u8_t*)p + MEMP_SIZE + memp_sizes[i] + MEMP_SANITY_REGION_AFTER_ALIGNED); } } } #endif /* MEMP_OVERFLOW_CHECK */ /** * Initialize this module. * * Carves out memp_memory into linked lists for each pool-type. */ void memp_init(void) { struct memp *memp; u16_t i, j; for (i = 0; i < MEMP_MAX; ++i) { MEMP_STATS_AVAIL(used, i, 0); MEMP_STATS_AVAIL(max, i, 0); MEMP_STATS_AVAIL(err, i, 0); MEMP_STATS_AVAIL(avail, i, memp_num[i]); } memp = LWIP_MEM_ALIGN(memp_memory); /* for every pool: */ for (i = 0; i < MEMP_MAX; ++i) { memp_tab[i] = NULL; /* create a linked list of memp elements */ for (j = 0; j < memp_num[i]; ++j) { memp->next = memp_tab[i]; memp_tab[i] = memp; memp = (struct memp *)((u8_t *)memp + MEMP_SIZE + memp_sizes[i] #if MEMP_OVERFLOW_CHECK + MEMP_SANITY_REGION_AFTER_ALIGNED #endif ); } } #if MEMP_OVERFLOW_CHECK memp_overflow_init(); /* check everything a first time to see if it worked */ memp_overflow_check_all(); #endif /* MEMP_OVERFLOW_CHECK */ } /** * Get an element from a specific pool. * * @param type the pool to get an element from * * the debug version has two more parameters: * @param file file name calling this function * @param line number of line where this function is called * * @return a pointer to the allocated memory or a NULL pointer on error */ void * #if !MEMP_OVERFLOW_CHECK memp_malloc(memp_t type) #else memp_malloc_fn(memp_t type, const char* file, const int line) #endif { struct memp *memp; SYS_ARCH_DECL_PROTECT(old_level); LWIP_ERROR("memp_malloc: type < MEMP_MAX", (type < MEMP_MAX), return NULL;); SYS_ARCH_PROTECT(old_level); #if MEMP_OVERFLOW_CHECK >= 2 memp_overflow_check_all(); #endif /* MEMP_OVERFLOW_CHECK >= 2 */ memp = memp_tab[type]; if (memp != NULL) { memp_tab[type] = memp->next; #if MEMP_OVERFLOW_CHECK memp->next = NULL; memp->file = file; memp->line = line; #endif /* MEMP_OVERFLOW_CHECK */ MEMP_STATS_INC_USED(used, type); LWIP_ASSERT("memp_malloc: memp properly aligned", ((mem_ptr_t)memp % MEM_ALIGNMENT) == 0); memp = (struct memp*)((u8_t*)memp + MEMP_SIZE); } else { LWIP_DEBUGF(MEMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("memp_malloc: out of memory in pool %s\n", memp_desc[type])); MEMP_STATS_INC(err, type); } SYS_ARCH_UNPROTECT(old_level); return memp; } /** * Put an element back into its pool. * * @param type the pool where to put mem * @param mem the memp element to free */ void memp_free(memp_t type, void *mem) { struct memp *memp; SYS_ARCH_DECL_PROTECT(old_level); if (mem == NULL) { return; } LWIP_ASSERT("memp_free: mem properly aligned", ((mem_ptr_t)mem % MEM_ALIGNMENT) == 0); memp = (struct memp *)((u8_t*)mem - MEMP_SIZE); SYS_ARCH_PROTECT(old_level); #if MEMP_OVERFLOW_CHECK #if MEMP_OVERFLOW_CHECK >= 2 memp_overflow_check_all(); #else memp_overflow_check_element(memp, memp_sizes[type]); #endif /* MEMP_OVERFLOW_CHECK >= 2 */ #endif /* MEMP_OVERFLOW_CHECK */ MEMP_STATS_DEC(used, type); memp->next = memp_tab[type]; memp_tab[type] = memp; #if MEMP_SANITY_CHECK LWIP_ASSERT("memp sanity", memp_sanity()); #endif /* MEMP_SANITY_CHECK */ SYS_ARCH_UNPROTECT(old_level); } #endif /* MEMP_MEM_MALLOC */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/netif.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * lwIP network interface abstraction * */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #include "lwip/opt.h" #include "lwip/def.h" #include "lwip/ip_addr.h" #include "lwip/netif.h" #include "lwip/tcp.h" #include "lwip/snmp.h" #include "lwip/igmp.h" #include "netif/etharp.h" #if ENABLE_LOOPBACK #include "lwip/sys.h" #if LWIP_NETIF_LOOPBACK_MULTITHREADING #include "lwip/tcpip.h" #endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */ #endif /* ENABLE_LOOPBACK */ #if LWIP_AUTOIP #include "lwip/autoip.h" #endif /* LWIP_AUTOIP */ #if LWIP_DHCP #include "lwip/dhcp.h" #endif /* LWIP_DHCP */ #if LWIP_NETIF_STATUS_CALLBACK #define NETIF_STATUS_CALLBACK(n) { if (n->status_callback) (n->status_callback)(n); } #else #define NETIF_STATUS_CALLBACK(n) { /* NOP */ } #endif /* LWIP_NETIF_STATUS_CALLBACK */ #if LWIP_NETIF_LINK_CALLBACK #define NETIF_LINK_CALLBACK(n) { if (n->link_callback) (n->link_callback)(n); } #else #define NETIF_LINK_CALLBACK(n) { /* NOP */ } #endif /* LWIP_NETIF_LINK_CALLBACK */ struct netif *netif_list; struct netif *netif_default; /** * Add a network interface to the list of lwIP netifs. * * @param netif a pre-allocated netif structure * @param ipaddr IP address for the new netif * @param netmask network mask for the new netif * @param gw default gateway IP address for the new netif * @param state opaque data passed to the new netif * @param init callback function that initializes the interface * @param input callback function that is called to pass * ingress packets up in the protocol layer stack. * * @return netif, or NULL if failed. */ struct netif * netif_add(struct netif *netif, struct ip_addr *ipaddr, struct ip_addr *netmask, struct ip_addr *gw, void *state, err_t (* init)(struct netif *netif), err_t (* input)(struct pbuf *p, struct netif *netif)) { static u8_t netifnum = 0; /* reset new interface configuration state */ netif->ip_addr.addr = 0; netif->netmask.addr = 0; netif->gw.addr = 0; netif->flags = 0; #if LWIP_DHCP /* netif not under DHCP control by default */ netif->dhcp = NULL; #endif /* LWIP_DHCP */ #if LWIP_AUTOIP /* netif not under AutoIP control by default */ netif->autoip = NULL; #endif /* LWIP_AUTOIP */ #if LWIP_NETIF_STATUS_CALLBACK netif->status_callback = NULL; #endif /* LWIP_NETIF_STATUS_CALLBACK */ #if LWIP_NETIF_LINK_CALLBACK netif->link_callback = NULL; #endif /* LWIP_NETIF_LINK_CALLBACK */ #if LWIP_IGMP netif->igmp_mac_filter = NULL; #endif /* LWIP_IGMP */ #if ENABLE_LOOPBACK netif->loop_first = NULL; netif->loop_last = NULL; #endif /* ENABLE_LOOPBACK */ /* remember netif specific state information data */ netif->state = state; netif->num = netifnum++; netif->input = input; #if LWIP_NETIF_HWADDRHINT netif->addr_hint = NULL; #endif /* LWIP_NETIF_HWADDRHINT*/ #if ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS netif->loop_cnt_current = 0; #endif /* ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS */ netif_set_addr(netif, ipaddr, netmask, gw); /* call user specified initialization function for netif */ if (init(netif) != ERR_OK) { return NULL; } /* add this netif to the list */ netif->next = netif_list; netif_list = netif; snmp_inc_iflist(); #if LWIP_IGMP /* start IGMP processing */ if (netif->flags & NETIF_FLAG_IGMP) { igmp_start( netif); } #endif /* LWIP_IGMP */ LWIP_DEBUGF(NETIF_DEBUG, ("netif: added interface %c%c IP addr ", netif->name[0], netif->name[1])); ip_addr_debug_print(NETIF_DEBUG, ipaddr); LWIP_DEBUGF(NETIF_DEBUG, (" netmask ")); ip_addr_debug_print(NETIF_DEBUG, netmask); LWIP_DEBUGF(NETIF_DEBUG, (" gw ")); ip_addr_debug_print(NETIF_DEBUG, gw); LWIP_DEBUGF(NETIF_DEBUG, ("\n")); return netif; } /** * Change IP address configuration for a network interface (including netmask * and default gateway). * * @param netif the network interface to change * @param ipaddr the new IP address * @param netmask the new netmask * @param gw the new default gateway */ void netif_set_addr(struct netif *netif, struct ip_addr *ipaddr, struct ip_addr *netmask, struct ip_addr *gw) { netif_set_ipaddr(netif, ipaddr); netif_set_netmask(netif, netmask); netif_set_gw(netif, gw); } /** * Remove a network interface from the list of lwIP netifs. * * @param netif the network interface to remove */ void netif_remove(struct netif * netif) { if ( netif == NULL ) return; #if LWIP_IGMP /* stop IGMP processing */ if (netif->flags & NETIF_FLAG_IGMP) { igmp_stop( netif); } #endif /* LWIP_IGMP */ snmp_delete_ipaddridx_tree(netif); /* is it the first netif? */ if (netif_list == netif) { netif_list = netif->next; snmp_dec_iflist(); } else { /* look for netif further down the list */ struct netif * tmpNetif; for (tmpNetif = netif_list; tmpNetif != NULL; tmpNetif = tmpNetif->next) { if (tmpNetif->next == netif) { tmpNetif->next = netif->next; snmp_dec_iflist(); break; } } if (tmpNetif == NULL) return; /* we didn't find any netif today */ } /* this netif is default? */ if (netif_default == netif) /* reset default netif */ netif_set_default(NULL); LWIP_DEBUGF( NETIF_DEBUG, ("netif_remove: removed netif\n") ); } /** * Find a network interface by searching for its name * * @param name the name of the netif (like netif->name) plus concatenated number * in ascii representation (e.g. 'en0') */ struct netif * netif_find(char *name) { struct netif *netif; u8_t num; if (name == NULL) { return NULL; } num = name[2] - '0'; for(netif = netif_list; netif != NULL; netif = netif->next) { if (num == netif->num && name[0] == netif->name[0] && name[1] == netif->name[1]) { LWIP_DEBUGF(NETIF_DEBUG, ("netif_find: found %c%c\n", name[0], name[1])); return netif; } } LWIP_DEBUGF(NETIF_DEBUG, ("netif_find: didn't find %c%c\n", name[0], name[1])); return NULL; } /** * Change the IP address of a network interface * * @param netif the network interface to change * @param ipaddr the new IP address * * @note call netif_set_addr() if you also want to change netmask and * default gateway */ void netif_set_ipaddr(struct netif *netif, struct ip_addr *ipaddr) { /* TODO: Handling of obsolete pcbs */ /* See: http://mail.gnu.org/archive/html/lwip-users/2003-03/msg00118.html */ #if LWIP_TCP struct tcp_pcb *pcb; struct tcp_pcb_listen *lpcb; /* address is actually being changed? */ if ((ip_addr_cmp(ipaddr, &(netif->ip_addr))) == 0) { /* extern struct tcp_pcb *tcp_active_pcbs; defined by tcp.h */ LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: netif address being changed\n")); pcb = tcp_active_pcbs; while (pcb != NULL) { /* PCB bound to current local interface address? */ if (ip_addr_cmp(&(pcb->local_ip), &(netif->ip_addr))) { /* this connection must be aborted */ struct tcp_pcb *next = pcb->next; LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: aborting TCP pcb %p\n", (void *)pcb)); tcp_abort(pcb); pcb = next; } else { pcb = pcb->next; } } for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { /* PCB bound to current local interface address? */ if ((!(ip_addr_isany(&(lpcb->local_ip)))) && (ip_addr_cmp(&(lpcb->local_ip), &(netif->ip_addr)))) { /* The PCB is listening to the old ipaddr and * is set to listen to the new one instead */ ip_addr_set(&(lpcb->local_ip), ipaddr); } } } #endif snmp_delete_ipaddridx_tree(netif); snmp_delete_iprteidx_tree(0,netif); /* set new IP address to netif */ ip_addr_set(&(netif->ip_addr), ipaddr); snmp_insert_ipaddridx_tree(netif); snmp_insert_iprteidx_tree(0,netif); LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: IP address of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", netif->name[0], netif->name[1], ip4_addr1(&netif->ip_addr), ip4_addr2(&netif->ip_addr), ip4_addr3(&netif->ip_addr), ip4_addr4(&netif->ip_addr))); } /** * Change the default gateway for a network interface * * @param netif the network interface to change * @param gw the new default gateway * * @note call netif_set_addr() if you also want to change ip address and netmask */ void netif_set_gw(struct netif *netif, struct ip_addr *gw) { ip_addr_set(&(netif->gw), gw); LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: GW address of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", netif->name[0], netif->name[1], ip4_addr1(&netif->gw), ip4_addr2(&netif->gw), ip4_addr3(&netif->gw), ip4_addr4(&netif->gw))); } /** * Change the netmask of a network interface * * @param netif the network interface to change * @param netmask the new netmask * * @note call netif_set_addr() if you also want to change ip address and * default gateway */ void netif_set_netmask(struct netif *netif, struct ip_addr *netmask) { snmp_delete_iprteidx_tree(0, netif); /* set new netmask to netif */ ip_addr_set(&(netif->netmask), netmask); snmp_insert_iprteidx_tree(0, netif); LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: netmask of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", netif->name[0], netif->name[1], ip4_addr1(&netif->netmask), ip4_addr2(&netif->netmask), ip4_addr3(&netif->netmask), ip4_addr4(&netif->netmask))); } /** * Set a network interface as the default network interface * (used to output all packets for which no specific route is found) * * @param netif the default network interface */ void netif_set_default(struct netif *netif) { if (netif == NULL) { /* remove default route */ snmp_delete_iprteidx_tree(1, netif); } else { /* install default route */ snmp_insert_iprteidx_tree(1, netif); } netif_default = netif; LWIP_DEBUGF(NETIF_DEBUG, ("netif: setting default interface %c%c\n", netif ? netif->name[0] : '\'', netif ? netif->name[1] : '\'')); } /** * Bring an interface up, available for processing * traffic. * * @note: Enabling DHCP on a down interface will make it come * up once configured. * * @see dhcp_start() */ void netif_set_up(struct netif *netif) { if ( !(netif->flags & NETIF_FLAG_UP )) { netif->flags |= NETIF_FLAG_UP; #if LWIP_SNMP snmp_get_sysuptime(&netif->ts); #endif /* LWIP_SNMP */ NETIF_LINK_CALLBACK(netif); NETIF_STATUS_CALLBACK(netif); #if LWIP_ARP /* For Ethernet network interfaces, we would like to send a "gratuitous ARP" */ if (netif->flags & NETIF_FLAG_ETHARP) { etharp_gratuitous(netif); } #endif /* LWIP_ARP */ #if LWIP_IGMP /* resend IGMP memberships */ if (netif->flags & NETIF_FLAG_IGMP) { igmp_report_groups( netif); } #endif /* LWIP_IGMP */ } } /** * Bring an interface down, disabling any traffic processing. * * @note: Enabling DHCP on a down interface will make it come * up once configured. * * @see dhcp_start() */ void netif_set_down(struct netif *netif) { if ( netif->flags & NETIF_FLAG_UP ) { netif->flags &= ~NETIF_FLAG_UP; #if LWIP_SNMP snmp_get_sysuptime(&netif->ts); #endif NETIF_LINK_CALLBACK(netif); NETIF_STATUS_CALLBACK(netif); } } /** * Ask if an interface is up */ u8_t netif_is_up(struct netif *netif) { return (netif->flags & NETIF_FLAG_UP)?1:0; } #if LWIP_NETIF_STATUS_CALLBACK /** * Set callback to be called when interface is brought up/down */ void netif_set_status_callback(struct netif *netif, void (* status_callback)(struct netif *netif )) { if ( netif ) netif->status_callback = status_callback; } #endif /* LWIP_NETIF_STATUS_CALLBACK */ #if LWIP_NETIF_LINK_CALLBACK /** * Called by a driver when its link goes up */ void netif_set_link_up(struct netif *netif ) { netif->flags |= NETIF_FLAG_LINK_UP; #if LWIP_DHCP if (netif->dhcp) { dhcp_network_changed(netif); } #endif /* LWIP_DHCP */ #if LWIP_AUTOIP if (netif->autoip) { autoip_network_changed(netif); } #endif /* LWIP_AUTOIP */ if (netif->flags & NETIF_FLAG_UP) { #if LWIP_ARP /* For Ethernet network interfaces, we would like to send a "gratuitous ARP" */ if (netif->flags & NETIF_FLAG_ETHARP) { etharp_gratuitous(netif); } #endif /* LWIP_ARP */ #if LWIP_IGMP /* resend IGMP memberships */ if (netif->flags & NETIF_FLAG_IGMP) { igmp_report_groups( netif); } #endif /* LWIP_IGMP */ } NETIF_LINK_CALLBACK(netif); } /** * Called by a driver when its link goes down */ void netif_set_link_down(struct netif *netif ) { netif->flags &= ~NETIF_FLAG_LINK_UP; NETIF_LINK_CALLBACK(netif); } /** * Ask if a link is up */ u8_t netif_is_link_up(struct netif *netif) { return (netif->flags & NETIF_FLAG_LINK_UP) ? 1 : 0; } /** * Set callback to be called when link is brought up/down */ void netif_set_link_callback(struct netif *netif, void (* link_callback)(struct netif *netif )) { if (netif) { netif->link_callback = link_callback; } } #endif /* LWIP_NETIF_LINK_CALLBACK */ #if ENABLE_LOOPBACK /** * Send an IP packet to be received on the same netif (loopif-like). * The pbuf is simply copied and handed back to netif->input. * In multithreaded mode, this is done directly since netif->input must put * the packet on a queue. * In callback mode, the packet is put on an internal queue and is fed to * netif->input by netif_poll(). * * @param netif the lwip network interface structure * @param p the (IP) packet to 'send' * @param ipaddr the ip address to send the packet to (not used) * @return ERR_OK if the packet has been sent * ERR_MEM if the pbuf used to copy the packet couldn't be allocated */ err_t netif_loop_output(struct netif *netif, struct pbuf *p, struct ip_addr *ipaddr) { struct pbuf *r; err_t err; struct pbuf *last; #if LWIP_LOOPBACK_MAX_PBUFS u8_t clen = 0; #endif /* LWIP_LOOPBACK_MAX_PBUFS */ SYS_ARCH_DECL_PROTECT(lev); LWIP_UNUSED_ARG(ipaddr); /* Allocate a new pbuf */ r = pbuf_alloc(PBUF_LINK, p->tot_len, PBUF_RAM); if (r == NULL) { return ERR_MEM; } #if LWIP_LOOPBACK_MAX_PBUFS clen = pbuf_clen(r); /* check for overflow or too many pbuf on queue */ if(((netif->loop_cnt_current + clen) < netif->loop_cnt_current) || ((netif->loop_cnt_current + clen) > LWIP_LOOPBACK_MAX_PBUFS)) { pbuf_free(r); r = NULL; return ERR_MEM; } netif->loop_cnt_current += clen; #endif /* LWIP_LOOPBACK_MAX_PBUFS */ /* Copy the whole pbuf queue p into the single pbuf r */ if ((err = pbuf_copy(r, p)) != ERR_OK) { pbuf_free(r); r = NULL; return err; } /* Put the packet on a linked list which gets emptied through calling netif_poll(). */ /* let last point to the last pbuf in chain r */ for (last = r; last->next != NULL; last = last->next); SYS_ARCH_PROTECT(lev); if(netif->loop_first != NULL) { LWIP_ASSERT("if first != NULL, last must also be != NULL", netif->loop_last != NULL); netif->loop_last->next = r; netif->loop_last = last; } else { netif->loop_first = r; netif->loop_last = last; } SYS_ARCH_UNPROTECT(lev); #if LWIP_NETIF_LOOPBACK_MULTITHREADING /* For multithreading environment, schedule a call to netif_poll */ tcpip_callback((void (*)(void *))(netif_poll), netif); #endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */ return ERR_OK; } /** * Call netif_poll() in the main loop of your application. This is to prevent * reentering non-reentrant functions like tcp_input(). Packets passed to * netif_loop_output() are put on a list that is passed to netif->input() by * netif_poll(). */ void netif_poll(struct netif *netif) { struct pbuf *in; SYS_ARCH_DECL_PROTECT(lev); do { /* Get a packet from the list. With SYS_LIGHTWEIGHT_PROT=1, this is protected */ SYS_ARCH_PROTECT(lev); in = netif->loop_first; if(in != NULL) { struct pbuf *in_end = in; #if LWIP_LOOPBACK_MAX_PBUFS u8_t clen = pbuf_clen(in); /* adjust the number of pbufs on queue */ LWIP_ASSERT("netif->loop_cnt_current underflow", ((netif->loop_cnt_current - clen) < netif->loop_cnt_current)); netif->loop_cnt_current -= clen; #endif /* LWIP_LOOPBACK_MAX_PBUFS */ while(in_end->len != in_end->tot_len) { LWIP_ASSERT("bogus pbuf: len != tot_len but next == NULL!", in_end->next != NULL); in_end = in_end->next; } /* 'in_end' now points to the last pbuf from 'in' */ if(in_end == netif->loop_last) { /* this was the last pbuf in the list */ netif->loop_first = netif->loop_last = NULL; } else { /* pop the pbuf off the list */ netif->loop_first = in_end->next; LWIP_ASSERT("should not be null since first != last!", netif->loop_first != NULL); } /* De-queue the pbuf from its successors on the 'loop_' list. */ in_end->next = NULL; } SYS_ARCH_UNPROTECT(lev); if(in != NULL) { /* loopback packets are always IP packets! */ if(ip_input(in, netif) != ERR_OK) { pbuf_free(in); } /* Don't reference the packet any more! */ in = NULL; } /* go on while there is a packet on the list */ } while(netif->loop_first != NULL); } #if !LWIP_NETIF_LOOPBACK_MULTITHREADING /** * Calls netif_poll() for every netif on the netif_list. */ void netif_poll_all(void) { struct netif *netif = netif_list; /* loop through netifs */ while (netif != NULL) { netif_poll(netif); /* proceed to next network interface */ netif = netif->next; } } #endif /* !LWIP_NETIF_LOOPBACK_MULTITHREADING */ #endif /* ENABLE_LOOPBACK */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/pbuf.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * Packet buffer management * * Packets are built from the pbuf data structure. It supports dynamic * memory allocation for packet contents or can reference externally * managed packet contents both in RAM and ROM. Quick allocation for * incoming packets is provided through pools with fixed sized pbufs. * * A packet may span over multiple pbufs, chained as a singly linked * list. This is called a "pbuf chain". * * Multiple packets may be queued, also using this singly linked list. * This is called a "packet queue". * * So, a packet queue consists of one or more pbuf chains, each of * which consist of one or more pbufs. CURRENTLY, PACKET QUEUES ARE * NOT SUPPORTED!!! Use helper structs to queue multiple packets. * * The differences between a pbuf chain and a packet queue are very * precise but subtle. * * The last pbuf of a packet has a ->tot_len field that equals the * ->len field. It can be found by traversing the list. If the last * pbuf of a packet has a ->next field other than NULL, more packets * are on the queue. * * Therefore, looping through a pbuf of a single packet, has an * loop end condition (tot_len == p->len), NOT (next == NULL). */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #include "lwip/opt.h" #include "lwip/stats.h" #include "lwip/def.h" #include "lwip/mem.h" #include "lwip/memp.h" #include "lwip/pbuf.h" #include "lwip/sys.h" #include "arch/perf.h" #if TCP_QUEUE_OOSEQ #include "lwip/tcp.h" #endif #include #define SIZEOF_STRUCT_PBUF LWIP_MEM_ALIGN_SIZE(sizeof(struct pbuf)) /* Since the pool is created in memp, PBUF_POOL_BUFSIZE will be automatically aligned there. Therefore, PBUF_POOL_BUFSIZE_ALIGNED can be used here. */ #define PBUF_POOL_BUFSIZE_ALIGNED LWIP_MEM_ALIGN_SIZE(PBUF_POOL_BUFSIZE) #if !TCP_QUEUE_OOSEQ || NO_SYS #define PBUF_POOL_IS_EMPTY() #else /* !TCP_QUEUE_OOSEQ || NO_SYS */ /** Define this to 0 to prevent freeing ooseq pbufs when the PBUF_POOL is empty */ #ifndef PBUF_POOL_FREE_OOSEQ #define PBUF_POOL_FREE_OOSEQ 1 #endif /* PBUF_POOL_FREE_OOSEQ */ #if PBUF_POOL_FREE_OOSEQ #include "lwip/tcpip.h" #define PBUF_POOL_IS_EMPTY() pbuf_pool_is_empty() static u8_t pbuf_free_ooseq_queued; /** * Attempt to reclaim some memory from queued out-of-sequence TCP segments * if we run out of pool pbufs. It's better to give priority to new packets * if we're running out. * * This must be done in the correct thread context therefore this function * can only be used with NO_SYS=0 and through tcpip_callback. */ static void pbuf_free_ooseq(void* arg) { struct tcp_pcb* pcb; SYS_ARCH_DECL_PROTECT(old_level); LWIP_UNUSED_ARG(arg); SYS_ARCH_PROTECT(old_level); pbuf_free_ooseq_queued = 0; SYS_ARCH_UNPROTECT(old_level); for (pcb = tcp_active_pcbs; NULL != pcb; pcb = pcb->next) { if (NULL != pcb->ooseq) { /** Free the ooseq pbufs of one PCB only */ LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free_ooseq: freeing out-of-sequence pbufs\n")); tcp_segs_free(pcb->ooseq); pcb->ooseq = NULL; return; } } } /** Queue a call to pbuf_free_ooseq if not already queued. */ static void pbuf_pool_is_empty(void) { u8_t queued; SYS_ARCH_DECL_PROTECT(old_level); SYS_ARCH_PROTECT(old_level); queued = pbuf_free_ooseq_queued; pbuf_free_ooseq_queued = 1; SYS_ARCH_UNPROTECT(old_level); if(!queued) { /* queue a call to pbuf_free_ooseq if not already queued */ if(tcpip_callback_with_block(pbuf_free_ooseq, NULL, 0) != ERR_OK) { SYS_ARCH_PROTECT(old_level); pbuf_free_ooseq_queued = 0; SYS_ARCH_UNPROTECT(old_level); } } } #endif /* PBUF_POOL_FREE_OOSEQ */ #endif /* !TCP_QUEUE_OOSEQ || NO_SYS */ /** * Allocates a pbuf of the given type (possibly a chain for PBUF_POOL type). * * The actual memory allocated for the pbuf is determined by the * layer at which the pbuf is allocated and the requested size * (from the size parameter). * * @param layer flag to define header size * @param length size of the pbuf's payload * @param type this parameter decides how and where the pbuf * should be allocated as follows: * * - PBUF_RAM: buffer memory for pbuf is allocated as one large * chunk. This includes protocol headers as well. * - PBUF_ROM: no buffer memory is allocated for the pbuf, even for * protocol headers. Additional headers must be prepended * by allocating another pbuf and chain in to the front of * the ROM pbuf. It is assumed that the memory used is really * similar to ROM in that it is immutable and will not be * changed. Memory which is dynamic should generally not * be attached to PBUF_ROM pbufs. Use PBUF_REF instead. * - PBUF_REF: no buffer memory is allocated for the pbuf, even for * protocol headers. It is assumed that the pbuf is only * being used in a single thread. If the pbuf gets queued, * then pbuf_take should be called to copy the buffer. * - PBUF_POOL: the pbuf is allocated as a pbuf chain, with pbufs from * the pbuf pool that is allocated during pbuf_init(). * * @return the allocated pbuf. If multiple pbufs where allocated, this * is the first pbuf of a pbuf chain. */ struct pbuf * pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type) { struct pbuf *p, *q, *r; u16_t offset; s32_t rem_len; /* remaining length */ LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F")\n", length)); /* determine header offset */ offset = 0; switch (layer) { case PBUF_TRANSPORT: /* add room for transport (often TCP) layer header */ offset += PBUF_TRANSPORT_HLEN; /* FALLTHROUGH */ case PBUF_IP: /* add room for IP layer header */ offset += PBUF_IP_HLEN; /* FALLTHROUGH */ case PBUF_LINK: /* add room for link layer header */ offset += PBUF_LINK_HLEN; break; case PBUF_RAW: break; default: LWIP_ASSERT("pbuf_alloc: bad pbuf layer", 0); return NULL; } switch (type) { case PBUF_POOL: /* allocate head of pbuf chain into p */ p = memp_malloc(MEMP_PBUF_POOL); LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc: allocated pbuf %p\n", (void *)p)); if (p == NULL) { PBUF_POOL_IS_EMPTY(); return NULL; } p->type = type; p->next = NULL; /* make the payload pointer point 'offset' bytes into pbuf data memory */ p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + (SIZEOF_STRUCT_PBUF + offset))); LWIP_ASSERT("pbuf_alloc: pbuf p->payload properly aligned", ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0); /* the total length of the pbuf chain is the requested size */ p->tot_len = length; /* set the length of the first pbuf in the chain */ p->len = LWIP_MIN(length, PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset)); LWIP_ASSERT("check p->payload + p->len does not overflow pbuf", ((u8_t*)p->payload + p->len <= (u8_t*)p + SIZEOF_STRUCT_PBUF + PBUF_POOL_BUFSIZE_ALIGNED)); LWIP_ASSERT("PBUF_POOL_BUFSIZE must be bigger than MEM_ALIGNMENT", (PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset)) > 0 ); /* set reference count (needed here in case we fail) */ p->ref = 1; /* now allocate the tail of the pbuf chain */ /* remember first pbuf for linkage in next iteration */ r = p; /* remaining length to be allocated */ rem_len = length - p->len; /* any remaining pbufs to be allocated? */ while (rem_len > 0) { q = memp_malloc(MEMP_PBUF_POOL); if (q == NULL) { PBUF_POOL_IS_EMPTY(); /* free chain so far allocated */ pbuf_free(p); /* bail out unsuccesfully */ return NULL; } q->type = type; q->flags = 0; q->next = NULL; /* make previous pbuf point to this pbuf */ r->next = q; /* set total length of this pbuf and next in chain */ LWIP_ASSERT("rem_len < max_u16_t", rem_len < 0xffff); q->tot_len = (u16_t)rem_len; /* this pbuf length is pool size, unless smaller sized tail */ q->len = LWIP_MIN((u16_t)rem_len, PBUF_POOL_BUFSIZE_ALIGNED); q->payload = (void *)((u8_t *)q + SIZEOF_STRUCT_PBUF); LWIP_ASSERT("pbuf_alloc: pbuf q->payload properly aligned", ((mem_ptr_t)q->payload % MEM_ALIGNMENT) == 0); LWIP_ASSERT("check p->payload + p->len does not overflow pbuf", ((u8_t*)p->payload + p->len <= (u8_t*)p + SIZEOF_STRUCT_PBUF + PBUF_POOL_BUFSIZE_ALIGNED)); q->ref = 1; /* calculate remaining length to be allocated */ rem_len -= q->len; /* remember this pbuf for linkage in next iteration */ r = q; } /* end of chain */ /*r->next = NULL;*/ break; case PBUF_RAM: /* If pbuf is to be allocated in RAM, allocate memory for it. */ p = (struct pbuf*)mem_malloc(LWIP_MEM_ALIGN_SIZE(SIZEOF_STRUCT_PBUF + offset) + LWIP_MEM_ALIGN_SIZE(length)); if (p == NULL) { return NULL; } /* Set up internal structure of the pbuf. */ p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + SIZEOF_STRUCT_PBUF + offset)); p->len = p->tot_len = length; p->next = NULL; p->type = type; LWIP_ASSERT("pbuf_alloc: pbuf->payload properly aligned", ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0); break; /* pbuf references existing (non-volatile static constant) ROM payload? */ case PBUF_ROM: /* pbuf references existing (externally allocated) RAM payload? */ case PBUF_REF: /* only allocate memory for the pbuf structure */ p = memp_malloc(MEMP_PBUF); if (p == NULL) { LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("pbuf_alloc: Could not allocate MEMP_PBUF for PBUF_%s.\n", (type == PBUF_ROM) ? "ROM" : "REF")); return NULL; } /* caller must set this field properly, afterwards */ p->payload = NULL; p->len = p->tot_len = length; p->next = NULL; p->type = type; break; default: LWIP_ASSERT("pbuf_alloc: erroneous type", 0); return NULL; } /* set reference count */ p->ref = 1; /* set flags */ p->flags = 0; LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F") == %p\n", length, (void *)p)); return p; } /** * Shrink a pbuf chain to a desired length. * * @param p pbuf to shrink. * @param new_len desired new length of pbuf chain * * Depending on the desired length, the first few pbufs in a chain might * be skipped and left unchanged. The new last pbuf in the chain will be * resized, and any remaining pbufs will be freed. * * @note If the pbuf is ROM/REF, only the ->tot_len and ->len fields are adjusted. * @note May not be called on a packet queue. * * @note Despite its name, pbuf_realloc cannot grow the size of a pbuf (chain). */ void pbuf_realloc(struct pbuf *p, u16_t new_len) { struct pbuf *q; u16_t rem_len; /* remaining length */ s32_t grow; LWIP_ASSERT("pbuf_realloc: p != NULL", p != NULL); LWIP_ASSERT("pbuf_realloc: sane p->type", p->type == PBUF_POOL || p->type == PBUF_ROM || p->type == PBUF_RAM || p->type == PBUF_REF); /* desired length larger than current length? */ if (new_len >= p->tot_len) { /* enlarging not yet supported */ return; } /* the pbuf chain grows by (new_len - p->tot_len) bytes * (which may be negative in case of shrinking) */ grow = new_len - p->tot_len; /* first, step over any pbufs that should remain in the chain */ rem_len = new_len; q = p; /* should this pbuf be kept? */ while (rem_len > q->len) { /* decrease remaining length by pbuf length */ rem_len -= q->len; /* decrease total length indicator */ LWIP_ASSERT("grow < max_u16_t", grow < 0xffff); q->tot_len += (u16_t)grow; /* proceed to next pbuf in chain */ q = q->next; LWIP_ASSERT("pbuf_realloc: q != NULL", q != NULL); } /* we have now reached the new last pbuf (in q) */ /* rem_len == desired length for pbuf q */ /* shrink allocated memory for PBUF_RAM */ /* (other types merely adjust their length fields */ if ((q->type == PBUF_RAM) && (rem_len != q->len)) { /* reallocate and adjust the length of the pbuf that will be split */ q = mem_realloc(q, (u8_t *)q->payload - (u8_t *)q + rem_len); LWIP_ASSERT("mem_realloc give q == NULL", q != NULL); } /* adjust length fields for new last pbuf */ q->len = rem_len; q->tot_len = q->len; /* any remaining pbufs in chain? */ if (q->next != NULL) { /* free remaining pbufs in chain */ pbuf_free(q->next); } /* q is last packet in chain */ q->next = NULL; } /** * Adjusts the payload pointer to hide or reveal headers in the payload. * * Adjusts the ->payload pointer so that space for a header * (dis)appears in the pbuf payload. * * The ->payload, ->tot_len and ->len fields are adjusted. * * @param p pbuf to change the header size. * @param header_size_increment Number of bytes to increment header size which * increases the size of the pbuf. New space is on the front. * (Using a negative value decreases the header size.) * If hdr_size_inc is 0, this function does nothing and returns succesful. * * PBUF_ROM and PBUF_REF type buffers cannot have their sizes increased, so * the call will fail. A check is made that the increase in header size does * not move the payload pointer in front of the start of the buffer. * @return non-zero on failure, zero on success. * */ u8_t pbuf_header(struct pbuf *p, s16_t header_size_increment) { u16_t type; void *payload; u16_t increment_magnitude; LWIP_ASSERT("p != NULL", p != NULL); if ((header_size_increment == 0) || (p == NULL)) return 0; if (header_size_increment < 0){ increment_magnitude = -header_size_increment; /* Check that we aren't going to move off the end of the pbuf */ LWIP_ERROR("increment_magnitude <= p->len", (increment_magnitude <= p->len), return 1;); } else { increment_magnitude = header_size_increment; #if 0 /* Can't assert these as some callers speculatively call pbuf_header() to see if it's OK. Will return 1 below instead. */ /* Check that we've got the correct type of pbuf to work with */ LWIP_ASSERT("p->type == PBUF_RAM || p->type == PBUF_POOL", p->type == PBUF_RAM || p->type == PBUF_POOL); /* Check that we aren't going to move off the beginning of the pbuf */ LWIP_ASSERT("p->payload - increment_magnitude >= p + SIZEOF_STRUCT_PBUF", (u8_t *)p->payload - increment_magnitude >= (u8_t *)p + SIZEOF_STRUCT_PBUF); #endif } type = p->type; /* remember current payload pointer */ payload = p->payload; /* pbuf types containing payloads? */ if (type == PBUF_RAM || type == PBUF_POOL) { /* set new payload pointer */ p->payload = (u8_t *)p->payload - header_size_increment; /* boundary check fails? */ if ((u8_t *)p->payload < (u8_t *)p + SIZEOF_STRUCT_PBUF) { LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("pbuf_header: failed as %p < %p (not enough space for new header size)\n", (void *)p->payload, (void *)(p + 1))); /* restore old payload pointer */ p->payload = payload; /* bail out unsuccesfully */ return 1; } /* pbuf types refering to external payloads? */ } else if (type == PBUF_REF || type == PBUF_ROM) { /* hide a header in the payload? */ if ((header_size_increment < 0) && (increment_magnitude <= p->len)) { /* increase payload pointer */ p->payload = (u8_t *)p->payload - header_size_increment; } else { /* cannot expand payload to front (yet!) * bail out unsuccesfully */ return 1; } } else { /* Unknown type */ LWIP_ASSERT("bad pbuf type", 0); return 1; } /* modify pbuf length fields */ p->len += header_size_increment; p->tot_len += header_size_increment; LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_header: old %p new %p (%"S16_F")\n", (void *)payload, (void *)p->payload, header_size_increment)); return 0; } /** * Dereference a pbuf chain or queue and deallocate any no-longer-used * pbufs at the head of this chain or queue. * * Decrements the pbuf reference count. If it reaches zero, the pbuf is * deallocated. * * For a pbuf chain, this is repeated for each pbuf in the chain, * up to the first pbuf which has a non-zero reference count after * decrementing. So, when all reference counts are one, the whole * chain is free'd. * * @param p The pbuf (chain) to be dereferenced. * * @return the number of pbufs that were de-allocated * from the head of the chain. * * @note MUST NOT be called on a packet queue (Not verified to work yet). * @note the reference counter of a pbuf equals the number of pointers * that refer to the pbuf (or into the pbuf). * * @internal examples: * * Assuming existing chains a->b->c with the following reference * counts, calling pbuf_free(a) results in: * * 1->2->3 becomes ...1->3 * 3->3->3 becomes 2->3->3 * 1->1->2 becomes ......1 * 2->1->1 becomes 1->1->1 * 1->1->1 becomes ....... * */ u8_t pbuf_free(struct pbuf *p) { u16_t type; struct pbuf *q; u8_t count; if (p == NULL) { LWIP_ASSERT("p != NULL", p != NULL); /* if assertions are disabled, proceed with debug output */ LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("pbuf_free(p == NULL) was called.\n")); return 0; } LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free(%p)\n", (void *)p)); PERF_START; LWIP_ASSERT("pbuf_free: sane type", p->type == PBUF_RAM || p->type == PBUF_ROM || p->type == PBUF_REF || p->type == PBUF_POOL); count = 0; /* de-allocate all consecutive pbufs from the head of the chain that * obtain a zero reference count after decrementing*/ while (p != NULL) { u16_t ref; SYS_ARCH_DECL_PROTECT(old_level); /* Since decrementing ref cannot be guaranteed to be a single machine operation * we must protect it. We put the new ref into a local variable to prevent * further protection. */ SYS_ARCH_PROTECT(old_level); /* all pbufs in a chain are referenced at least once */ LWIP_ASSERT("pbuf_free: p->ref > 0", p->ref > 0); /* decrease reference count (number of pointers to pbuf) */ ref = --(p->ref); SYS_ARCH_UNPROTECT(old_level); /* this pbuf is no longer referenced to? */ if (ref == 0) { /* remember next pbuf in chain for next iteration */ q = p->next; LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free: deallocating %p\n", (void *)p)); type = p->type; /* is this a pbuf from the pool? */ if (type == PBUF_POOL) { memp_free(MEMP_PBUF_POOL, p); /* is this a ROM or RAM referencing pbuf? */ } else if (type == PBUF_ROM || type == PBUF_REF) { memp_free(MEMP_PBUF, p); /* type == PBUF_RAM */ } else { mem_free(p); } count++; /* proceed to next pbuf */ p = q; /* p->ref > 0, this pbuf is still referenced to */ /* (and so the remaining pbufs in chain as well) */ } else { LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free: %p has ref %"U16_F", ending here.\n", (void *)p, ref)); /* stop walking through the chain */ p = NULL; } } PERF_STOP("pbuf_free"); /* return number of de-allocated pbufs */ return count; } /** * Count number of pbufs in a chain * * @param p first pbuf of chain * @return the number of pbufs in a chain */ u8_t pbuf_clen(struct pbuf *p) { u8_t len; len = 0; while (p != NULL) { ++len; p = p->next; } return len; } /** * Increment the reference count of the pbuf. * * @param p pbuf to increase reference counter of * */ void pbuf_ref(struct pbuf *p) { SYS_ARCH_DECL_PROTECT(old_level); /* pbuf given? */ if (p != NULL) { SYS_ARCH_PROTECT(old_level); ++(p->ref); SYS_ARCH_UNPROTECT(old_level); } } /** * Concatenate two pbufs (each may be a pbuf chain) and take over * the caller's reference of the tail pbuf. * * @note The caller MAY NOT reference the tail pbuf afterwards. * Use pbuf_chain() for that purpose. * * @see pbuf_chain() */ void pbuf_cat(struct pbuf *h, struct pbuf *t) { struct pbuf *p; LWIP_ERROR("(h != NULL) && (t != NULL) (programmer violates API)", ((h != NULL) && (t != NULL)), return;); /* proceed to last pbuf of chain */ for (p = h; p->next != NULL; p = p->next) { /* add total length of second chain to all totals of first chain */ p->tot_len += t->tot_len; } /* { p is last pbuf of first h chain, p->next == NULL } */ LWIP_ASSERT("p->tot_len == p->len (of last pbuf in chain)", p->tot_len == p->len); LWIP_ASSERT("p->next == NULL", p->next == NULL); /* add total length of second chain to last pbuf total of first chain */ p->tot_len += t->tot_len; /* chain last pbuf of head (p) with first of tail (t) */ p->next = t; /* p->next now references t, but the caller will drop its reference to t, * so netto there is no change to the reference count of t. */ } /** * Chain two pbufs (or pbuf chains) together. * * The caller MUST call pbuf_free(t) once it has stopped * using it. Use pbuf_cat() instead if you no longer use t. * * @param h head pbuf (chain) * @param t tail pbuf (chain) * @note The pbufs MUST belong to the same packet. * @note MAY NOT be called on a packet queue. * * The ->tot_len fields of all pbufs of the head chain are adjusted. * The ->next field of the last pbuf of the head chain is adjusted. * The ->ref field of the first pbuf of the tail chain is adjusted. * */ void pbuf_chain(struct pbuf *h, struct pbuf *t) { pbuf_cat(h, t); /* t is now referenced by h */ pbuf_ref(t); LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_chain: %p references %p\n", (void *)h, (void *)t)); } /** * Dechains the first pbuf from its succeeding pbufs in the chain. * * Makes p->tot_len field equal to p->len. * @param p pbuf to dechain * @return remainder of the pbuf chain, or NULL if it was de-allocated. * @note May not be called on a packet queue. */ struct pbuf * pbuf_dechain(struct pbuf *p) { struct pbuf *q; u8_t tail_gone = 1; /* tail */ q = p->next; /* pbuf has successor in chain? */ if (q != NULL) { /* assert tot_len invariant: (p->tot_len == p->len + (p->next? p->next->tot_len: 0) */ LWIP_ASSERT("p->tot_len == p->len + q->tot_len", q->tot_len == p->tot_len - p->len); /* enforce invariant if assertion is disabled */ q->tot_len = p->tot_len - p->len; /* decouple pbuf from remainder */ p->next = NULL; /* total length of pbuf p is its own length only */ p->tot_len = p->len; /* q is no longer referenced by p, free it */ LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_dechain: unreferencing %p\n", (void *)q)); tail_gone = pbuf_free(q); if (tail_gone > 0) { LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_dechain: deallocated %p (as it is no longer referenced)\n", (void *)q)); } /* return remaining tail or NULL if deallocated */ } /* assert tot_len invariant: (p->tot_len == p->len + (p->next? p->next->tot_len: 0) */ LWIP_ASSERT("p->tot_len == p->len", p->tot_len == p->len); return ((tail_gone > 0) ? NULL : q); } /** * * Create PBUF_RAM copies of pbufs. * * Used to queue packets on behalf of the lwIP stack, such as * ARP based queueing. * * @note You MUST explicitly use p = pbuf_take(p); * * @note Only one packet is copied, no packet queue! * * @param p_to pbuf destination of the copy * @param p_from pbuf source of the copy * * @return ERR_OK if pbuf was copied * ERR_ARG if one of the pbufs is NULL or p_to is not big * enough to hold p_from */ err_t pbuf_copy(struct pbuf *p_to, struct pbuf *p_from) { u16_t offset_to=0, offset_from=0, len; LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy(%p, %p)\n", (void*)p_to, (void*)p_from)); /* is the target big enough to hold the source? */ LWIP_ERROR("pbuf_copy: target not big enough to hold source", ((p_to != NULL) && (p_from != NULL) && (p_to->tot_len >= p_from->tot_len)), return ERR_ARG;); /* iterate through pbuf chain */ do { LWIP_ASSERT("p_to != NULL", p_to != NULL); /* copy one part of the original chain */ if ((p_to->len - offset_to) >= (p_from->len - offset_from)) { /* complete current p_from fits into current p_to */ len = p_from->len - offset_from; } else { /* current p_from does not fit into current p_to */ len = p_to->len - offset_to; } MEMCPY((u8_t*)p_to->payload + offset_to, (u8_t*)p_from->payload + offset_from, len); offset_to += len; offset_from += len; LWIP_ASSERT("offset_to <= p_to->len", offset_to <= p_to->len); if (offset_to == p_to->len) { /* on to next p_to (if any) */ offset_to = 0; p_to = p_to->next; } LWIP_ASSERT("offset_from <= p_from->len", offset_from <= p_from->len); if (offset_from >= p_from->len) { /* on to next p_from (if any) */ offset_from = 0; p_from = p_from->next; } if((p_from != NULL) && (p_from->len == p_from->tot_len)) { /* don't copy more than one packet! */ LWIP_ERROR("pbuf_copy() does not allow packet queues!\n", (p_from->next == NULL), return ERR_VAL;); } if((p_to != NULL) && (p_to->len == p_to->tot_len)) { /* don't copy more than one packet! */ LWIP_ERROR("pbuf_copy() does not allow packet queues!\n", (p_to->next == NULL), return ERR_VAL;); } } while (p_from); LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy: end of chain reached.\n")); return ERR_OK; } /** * Copy (part of) the contents of a packet buffer * to an application supplied buffer. * * @param buf the pbuf from which to copy data * @param dataptr the application supplied buffer * @param len length of data to copy (dataptr must be big enough). No more * than buf->tot_len will be copied, irrespective of len * @param offset offset into the packet buffer from where to begin copying len bytes * @return the number of bytes copied, or 0 on failure */ u16_t pbuf_copy_partial(struct pbuf *buf, void *dataptr, u16_t len, u16_t offset) { struct pbuf *p; u16_t left; u16_t buf_copy_len; u16_t copied_total = 0; LWIP_ERROR("pbuf_copy_partial: invalid buf", (buf != NULL), return 0;); LWIP_ERROR("pbuf_copy_partial: invalid dataptr", (dataptr != NULL), return 0;); left = 0; if((buf == NULL) || (dataptr == NULL)) { return 0; } /* Note some systems use byte copy if dataptr or one of the pbuf payload pointers are unaligned. */ for(p = buf; len != 0 && p != NULL; p = p->next) { if ((offset != 0) && (offset >= p->len)) { /* don't copy from this buffer -> on to the next */ offset -= p->len; } else { /* copy from this buffer. maybe only partially. */ buf_copy_len = p->len - offset; if (buf_copy_len > len) buf_copy_len = len; /* copy the necessary parts of the buffer */ MEMCPY(&((char*)dataptr)[left], &((char*)p->payload)[offset], buf_copy_len); copied_total += buf_copy_len; left += buf_copy_len; len -= buf_copy_len; offset = 0; } } return copied_total; } /** * Copy application supplied data into a pbuf. * This function can only be used to copy the equivalent of buf->tot_len data. * * @param buf pbuf to fill with data * @param dataptr application supplied data buffer * @param len length of the application supplied data buffer * * @return ERR_OK if successful, ERR_MEM if the pbuf is not big enough */ err_t pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len) { struct pbuf *p; u16_t buf_copy_len; u16_t total_copy_len = len; u16_t copied_total = 0; LWIP_ERROR("pbuf_take: invalid buf", (buf != NULL), return 0;); LWIP_ERROR("pbuf_take: invalid dataptr", (dataptr != NULL), return 0;); if ((buf == NULL) || (dataptr == NULL) || (buf->tot_len < len)) { return ERR_ARG; } /* Note some systems use byte copy if dataptr or one of the pbuf payload pointers are unaligned. */ for(p = buf; total_copy_len != 0; p = p->next) { LWIP_ASSERT("pbuf_take: invalid pbuf", p != NULL); buf_copy_len = total_copy_len; if (buf_copy_len > p->len) { /* this pbuf cannot hold all remaining data */ buf_copy_len = p->len; } /* copy the necessary parts of the buffer */ MEMCPY(p->payload, &((char*)dataptr)[copied_total], buf_copy_len); total_copy_len -= buf_copy_len; copied_total += buf_copy_len; } LWIP_ASSERT("did not copy all data", total_copy_len == 0 && copied_total == len); return ERR_OK; } /** * Creates a single pbuf out of a queue of pbufs. * * @remark: The source pbuf 'p' is not freed by this function because that can * be illegal in some places! * * @param p the source pbuf * @param layer pbuf_layer of the new pbuf * * @return a new, single pbuf (p->next is NULL) * or the old pbuf if allocation fails */ struct pbuf* pbuf_coalesce(struct pbuf *p, pbuf_layer layer) { struct pbuf *q; err_t err; if (p->next == NULL) { return p; } q = pbuf_alloc(layer, p->tot_len, PBUF_RAM); if (q == NULL) { /* @todo: what do we do now? */ return p; } err = pbuf_copy(q, p); LWIP_ASSERT("pbuf_copy failed", err == ERR_OK); pbuf_free(p); return q; } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/raw.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * Implementation of raw protocol PCBs for low-level handling of * different types of protocols besides (or overriding) those * already available in lwIP. * */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #include "lwip/opt.h" #if LWIP_RAW /* don't build if not configured for use in lwipopts.h */ #include "lwip/def.h" #include "lwip/memp.h" #include "lwip/inet.h" #include "lwip/ip_addr.h" #include "lwip/netif.h" #include "lwip/raw.h" #include "lwip/stats.h" #include "lwip/snmp.h" #include "arch/perf.h" #include /** The list of RAW PCBs */ static struct raw_pcb *raw_pcbs; /** * Determine if in incoming IP packet is covered by a RAW PCB * and if so, pass it to a user-provided receive callback function. * * Given an incoming IP datagram (as a chain of pbufs) this function * finds a corresponding RAW PCB and calls the corresponding receive * callback function. * * @param p pbuf to be demultiplexed to a RAW PCB. * @param inp network interface on which the datagram was received. * @return - 1 if the packet has been eaten by a RAW PCB receive * callback function. The caller MAY NOT not reference the * packet any longer, and MAY NOT call pbuf_free(). * @return - 0 if packet is not eaten (pbuf is still referenced by the * caller). * */ u8_t raw_input(struct pbuf *p, struct netif *inp) { struct raw_pcb *pcb, *prev; struct ip_hdr *iphdr; s16_t proto; u8_t eaten = 0; LWIP_UNUSED_ARG(inp); iphdr = p->payload; proto = IPH_PROTO(iphdr); prev = NULL; pcb = raw_pcbs; /* loop through all raw pcbs until the packet is eaten by one */ /* this allows multiple pcbs to match against the packet by design */ while ((eaten == 0) && (pcb != NULL)) { if (pcb->protocol == proto) { #if IP_SOF_BROADCAST_RECV /* broadcast filter? */ if ((pcb->so_options & SOF_BROADCAST) || !ip_addr_isbroadcast(&(iphdr->dest), inp)) #endif /* IP_SOF_BROADCAST_RECV */ { /* receive callback function available? */ if (pcb->recv != NULL) { /* the receive callback function did not eat the packet? */ if (pcb->recv(pcb->recv_arg, pcb, p, &(iphdr->src)) != 0) { /* receive function ate the packet */ p = NULL; eaten = 1; if (prev != NULL) { /* move the pcb to the front of raw_pcbs so that is found faster next time */ prev->next = pcb->next; pcb->next = raw_pcbs; raw_pcbs = pcb; } } } /* no receive callback function was set for this raw PCB */ } /* drop the packet */ } prev = pcb; pcb = pcb->next; } return eaten; } /** * Bind a RAW PCB. * * @param pcb RAW PCB to be bound with a local address ipaddr. * @param ipaddr local IP address to bind with. Use IP_ADDR_ANY to * bind to all local interfaces. * * @return lwIP error code. * - ERR_OK. Successful. No error occured. * - ERR_USE. The specified IP address is already bound to by * another RAW PCB. * * @see raw_disconnect() */ err_t raw_bind(struct raw_pcb *pcb, struct ip_addr *ipaddr) { ip_addr_set(&pcb->local_ip, ipaddr); return ERR_OK; } /** * Connect an RAW PCB. This function is required by upper layers * of lwip. Using the raw api you could use raw_sendto() instead * * This will associate the RAW PCB with the remote address. * * @param pcb RAW PCB to be connected with remote address ipaddr and port. * @param ipaddr remote IP address to connect with. * * @return lwIP error code * * @see raw_disconnect() and raw_sendto() */ err_t raw_connect(struct raw_pcb *pcb, struct ip_addr *ipaddr) { ip_addr_set(&pcb->remote_ip, ipaddr); return ERR_OK; } /** * Set the callback function for received packets that match the * raw PCB's protocol and binding. * * The callback function MUST either * - eat the packet by calling pbuf_free() and returning non-zero. The * packet will not be passed to other raw PCBs or other protocol layers. * - not free the packet, and return zero. The packet will be matched * against further PCBs and/or forwarded to another protocol layers. * * @return non-zero if the packet was free()d, zero if the packet remains * available for others. */ void raw_recv(struct raw_pcb *pcb, u8_t (* recv)(void *arg, struct raw_pcb *upcb, struct pbuf *p, struct ip_addr *addr), void *recv_arg) { /* remember recv() callback and user data */ pcb->recv = recv; pcb->recv_arg = recv_arg; } /** * Send the raw IP packet to the given address. Note that actually you cannot * modify the IP headers (this is inconsistent with the receive callback where * you actually get the IP headers), you can only specify the IP payload here. * It requires some more changes in lwIP. (there will be a raw_send() function * then.) * * @param pcb the raw pcb which to send * @param p the IP payload to send * @param ipaddr the destination address of the IP packet * */ err_t raw_sendto(struct raw_pcb *pcb, struct pbuf *p, struct ip_addr *ipaddr) { err_t err; struct netif *netif; struct ip_addr *src_ip; struct pbuf *q; /* q will be sent down the stack */ LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_TRACE, ("raw_sendto\n")); /* not enough space to add an IP header to first pbuf in given p chain? */ if (pbuf_header(p, IP_HLEN)) { /* allocate header in new pbuf */ q = pbuf_alloc(PBUF_IP, 0, PBUF_RAM); /* new header pbuf could not be allocated? */ if (q == NULL) { LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("raw_sendto: could not allocate header\n")); return ERR_MEM; } /* chain header q in front of given pbuf p */ pbuf_chain(q, p); /* { first pbuf q points to header pbuf } */ LWIP_DEBUGF(RAW_DEBUG, ("raw_sendto: added header pbuf %p before given pbuf %p\n", (void *)q, (void *)p)); } else { /* first pbuf q equals given pbuf */ q = p; if(pbuf_header(q, -IP_HLEN)) { LWIP_ASSERT("Can't restore header we just removed!", 0); return ERR_MEM; } } if ((netif = ip_route(ipaddr)) == NULL) { LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_LEVEL_WARNING, ("raw_sendto: No route to 0x%"X32_F"\n", ipaddr->addr)); /* free any temporary header pbuf allocated by pbuf_header() */ if (q != p) { pbuf_free(q); } return ERR_RTE; } #if IP_SOF_BROADCAST /* broadcast filter? */ if ( ((pcb->so_options & SOF_BROADCAST) == 0) && ip_addr_isbroadcast(ipaddr, netif) ) { LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_LEVEL_WARNING, ("raw_sendto: SOF_BROADCAST not enabled on pcb %p\n", (void *)pcb)); /* free any temporary header pbuf allocated by pbuf_header() */ if (q != p) { pbuf_free(q); } return ERR_VAL; } #endif /* IP_SOF_BROADCAST */ if (ip_addr_isany(&pcb->local_ip)) { /* use outgoing network interface IP address as source address */ src_ip = &(netif->ip_addr); } else { /* use RAW PCB local IP address as source address */ src_ip = &(pcb->local_ip); } #if LWIP_NETIF_HWADDRHINT netif->addr_hint = &(pcb->addr_hint); #endif /* LWIP_NETIF_HWADDRHINT*/ err = ip_output_if (q, src_ip, ipaddr, pcb->ttl, pcb->tos, pcb->protocol, netif); #if LWIP_NETIF_HWADDRHINT netif->addr_hint = NULL; #endif /* LWIP_NETIF_HWADDRHINT*/ /* did we chain a header earlier? */ if (q != p) { /* free the header */ pbuf_free(q); } return err; } /** * Send the raw IP packet to the address given by raw_connect() * * @param pcb the raw pcb which to send * @param p the IP payload to send * */ err_t raw_send(struct raw_pcb *pcb, struct pbuf *p) { return raw_sendto(pcb, p, &pcb->remote_ip); } /** * Remove an RAW PCB. * * @param pcb RAW PCB to be removed. The PCB is removed from the list of * RAW PCB's and the data structure is freed from memory. * * @see raw_new() */ void raw_remove(struct raw_pcb *pcb) { struct raw_pcb *pcb2; /* pcb to be removed is first in list? */ if (raw_pcbs == pcb) { /* make list start at 2nd pcb */ raw_pcbs = raw_pcbs->next; /* pcb not 1st in list */ } else { for(pcb2 = raw_pcbs; pcb2 != NULL; pcb2 = pcb2->next) { /* find pcb in raw_pcbs list */ if (pcb2->next != NULL && pcb2->next == pcb) { /* remove pcb from list */ pcb2->next = pcb->next; } } } memp_free(MEMP_RAW_PCB, pcb); } /** * Create a RAW PCB. * * @return The RAW PCB which was created. NULL if the PCB data structure * could not be allocated. * * @param proto the protocol number of the IPs payload (e.g. IP_PROTO_ICMP) * * @see raw_remove() */ struct raw_pcb * raw_new(u8_t proto) { struct raw_pcb *pcb; LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_TRACE, ("raw_new\n")); pcb = memp_malloc(MEMP_RAW_PCB); /* could allocate RAW PCB? */ if (pcb != NULL) { /* initialize PCB to all zeroes */ memset(pcb, 0, sizeof(struct raw_pcb)); pcb->protocol = proto; pcb->ttl = RAW_TTL; pcb->next = raw_pcbs; raw_pcbs = pcb; } return pcb; } #endif /* LWIP_RAW */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/stats.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * Statistics module * */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #include "lwip/opt.h" #if LWIP_STATS /* don't build if not configured for use in lwipopts.h */ #include "lwip/def.h" #include "lwip/stats.h" #include "lwip/mem.h" #include struct stats_ lwip_stats; #if LWIP_STATS_DISPLAY void stats_display_proto(struct stats_proto *proto, char *name) { LWIP_PLATFORM_DIAG(("\n%s\n\t", name)); LWIP_PLATFORM_DIAG(("xmit: %"STAT_COUNTER_F"\n\t", proto->xmit)); LWIP_PLATFORM_DIAG(("recv: %"STAT_COUNTER_F"\n\t", proto->recv)); LWIP_PLATFORM_DIAG(("fw: %"STAT_COUNTER_F"\n\t", proto->fw)); LWIP_PLATFORM_DIAG(("drop: %"STAT_COUNTER_F"\n\t", proto->drop)); LWIP_PLATFORM_DIAG(("chkerr: %"STAT_COUNTER_F"\n\t", proto->chkerr)); LWIP_PLATFORM_DIAG(("lenerr: %"STAT_COUNTER_F"\n\t", proto->lenerr)); LWIP_PLATFORM_DIAG(("memerr: %"STAT_COUNTER_F"\n\t", proto->memerr)); LWIP_PLATFORM_DIAG(("rterr: %"STAT_COUNTER_F"\n\t", proto->rterr)); LWIP_PLATFORM_DIAG(("proterr: %"STAT_COUNTER_F"\n\t", proto->proterr)); LWIP_PLATFORM_DIAG(("opterr: %"STAT_COUNTER_F"\n\t", proto->opterr)); LWIP_PLATFORM_DIAG(("err: %"STAT_COUNTER_F"\n\t", proto->err)); LWIP_PLATFORM_DIAG(("cachehit: %"STAT_COUNTER_F"\n", proto->cachehit)); } #if IGMP_STATS void stats_display_igmp(struct stats_igmp *igmp) { LWIP_PLATFORM_DIAG(("\nIGMP\n\t")); LWIP_PLATFORM_DIAG(("lenerr: %"STAT_COUNTER_F"\n\t", igmp->lenerr)); LWIP_PLATFORM_DIAG(("chkerr: %"STAT_COUNTER_F"\n\t", igmp->chkerr)); LWIP_PLATFORM_DIAG(("v1_rxed: %"STAT_COUNTER_F"\n\t", igmp->v1_rxed)); LWIP_PLATFORM_DIAG(("join_sent: %"STAT_COUNTER_F"\n\t", igmp->join_sent)); LWIP_PLATFORM_DIAG(("leave_sent: %"STAT_COUNTER_F"\n\t", igmp->leave_sent)); LWIP_PLATFORM_DIAG(("unicast_query: %"STAT_COUNTER_F"\n\t", igmp->unicast_query)); LWIP_PLATFORM_DIAG(("report_sent: %"STAT_COUNTER_F"\n\t", igmp->report_sent)); LWIP_PLATFORM_DIAG(("report_rxed: %"STAT_COUNTER_F"\n\t", igmp->report_rxed)); LWIP_PLATFORM_DIAG(("group_query_rxed: %"STAT_COUNTER_F"\n", igmp->group_query_rxed)); } #endif /* IGMP_STATS */ #if MEM_STATS || MEMP_STATS void stats_display_mem(struct stats_mem *mem, char *name) { LWIP_PLATFORM_DIAG(("\nMEM %s\n\t", name)); LWIP_PLATFORM_DIAG(("avail: %"U32_F"\n\t", (u32_t)mem->avail)); LWIP_PLATFORM_DIAG(("used: %"U32_F"\n\t", (u32_t)mem->used)); LWIP_PLATFORM_DIAG(("max: %"U32_F"\n\t", (u32_t)mem->max)); LWIP_PLATFORM_DIAG(("err: %"U32_F"\n", (u32_t)mem->err)); } #if MEMP_STATS void stats_display_memp(struct stats_mem *mem, int index) { char * memp_names[] = { #define LWIP_MEMPOOL(name,num,size,desc) desc, #include "lwip/memp_std.h" }; if(index < MEMP_MAX) { stats_display_mem(mem, memp_names[index]); } } #endif /* MEMP_STATS */ #endif /* MEM_STATS || MEMP_STATS */ #if SYS_STATS void stats_display_sys(struct stats_sys *sys) { LWIP_PLATFORM_DIAG(("\nSYS\n\t")); LWIP_PLATFORM_DIAG(("sem.used: %"U32_F"\n\t", (u32_t)sys->sem.used)); LWIP_PLATFORM_DIAG(("sem.max: %"U32_F"\n\t", (u32_t)sys->sem.max)); LWIP_PLATFORM_DIAG(("sem.err: %"U32_F"\n\t", (u32_t)sys->sem.err)); LWIP_PLATFORM_DIAG(("mbox.used: %"U32_F"\n\t", (u32_t)sys->mbox.used)); LWIP_PLATFORM_DIAG(("mbox.max: %"U32_F"\n\t", (u32_t)sys->mbox.max)); LWIP_PLATFORM_DIAG(("mbox.err: %"U32_F"\n\t", (u32_t)sys->mbox.err)); } #endif /* SYS_STATS */ void stats_display(void) { s16_t i; LINK_STATS_DISPLAY(); ETHARP_STATS_DISPLAY(); IPFRAG_STATS_DISPLAY(); IP_STATS_DISPLAY(); IGMP_STATS_DISPLAY(); ICMP_STATS_DISPLAY(); UDP_STATS_DISPLAY(); TCP_STATS_DISPLAY(); MEM_STATS_DISPLAY(); for (i = 0; i < MEMP_MAX; i++) { MEMP_STATS_DISPLAY(i); } SYS_STATS_DISPLAY(); } #endif /* LWIP_STATS_DISPLAY */ #endif /* LWIP_STATS */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/tcp.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * Transmission Control Protocol for IP * * This file contains common functions for the TCP implementation, such as functinos * for manipulating the data structures and the TCP timer functions. TCP functions * related to input and output is found in tcp_in.c and tcp_out.c respectively. * */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #include "lwip/opt.h" #if LWIP_TCP /* don't build if not configured for use in lwipopts.h */ #include "lwip/def.h" #include "lwip/mem.h" #include "lwip/memp.h" #include "lwip/snmp.h" #include "lwip/tcp.h" #include "lwip/debug.h" #include "lwip/stats.h" #include const char *tcp_state_str[] = { "CLOSED", "LISTEN", "SYN_SENT", "SYN_RCVD", "ESTABLISHED", "FIN_WAIT_1", "FIN_WAIT_2", "CLOSE_WAIT", "CLOSING", "LAST_ACK", "TIME_WAIT" }; /* Incremented every coarse grained timer shot (typically every 500 ms). */ u32_t tcp_ticks; const u8_t tcp_backoff[13] = { 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7}; /* Times per slowtmr hits */ const u8_t tcp_persist_backoff[7] = { 3, 6, 12, 24, 48, 96, 120 }; /* The TCP PCB lists. */ /** List of all TCP PCBs bound but not yet (connected || listening) */ struct tcp_pcb *tcp_bound_pcbs; /** List of all TCP PCBs in LISTEN state */ union tcp_listen_pcbs_t tcp_listen_pcbs; /** List of all TCP PCBs that are in a state in which * they accept or send data. */ struct tcp_pcb *tcp_active_pcbs; /** List of all TCP PCBs in TIME-WAIT state */ struct tcp_pcb *tcp_tw_pcbs; struct tcp_pcb *tcp_tmp_pcb; static u8_t tcp_timer; static u16_t tcp_new_port(void); /** * Called periodically to dispatch TCP timers. * */ void tcp_tmr(void) { /* Call tcp_fasttmr() every 250 ms */ tcp_fasttmr(); if (++tcp_timer & 1) { /* Call tcp_tmr() every 500 ms, i.e., every other timer tcp_tmr() is called. */ tcp_slowtmr(); } } /** * Closes the connection held by the PCB. * * Listening pcbs are freed and may not be referenced any more. * Connection pcbs are freed if not yet connected and may not be referenced * any more. If a connection is established (at least SYN received or in * a closing state), the connection is closed, and put in a closing state. * The pcb is then automatically freed in tcp_slowtmr(). It is therefore * unsafe to reference it. * * @param pcb the tcp_pcb to close * @return ERR_OK if connection has been closed * another err_t if closing failed and pcb is not freed */ err_t tcp_close(struct tcp_pcb *pcb) { err_t err; #if TCP_DEBUG LWIP_DEBUGF(TCP_DEBUG, ("tcp_close: closing in ")); tcp_debug_print_state(pcb->state); #endif /* TCP_DEBUG */ switch (pcb->state) { case CLOSED: /* Closing a pcb in the CLOSED state might seem erroneous, * however, it is in this state once allocated and as yet unused * and the user needs some way to free it should the need arise. * Calling tcp_close() with a pcb that has already been closed, (i.e. twice) * or for a pcb that has been used and then entered the CLOSED state * is erroneous, but this should never happen as the pcb has in those cases * been freed, and so any remaining handles are bogus. */ err = ERR_OK; TCP_RMV(&tcp_bound_pcbs, pcb); memp_free(MEMP_TCP_PCB, pcb); pcb = NULL; break; case LISTEN: err = ERR_OK; tcp_pcb_remove((struct tcp_pcb **)&tcp_listen_pcbs.pcbs, pcb); memp_free(MEMP_TCP_PCB_LISTEN, pcb); pcb = NULL; break; case SYN_SENT: err = ERR_OK; tcp_pcb_remove(&tcp_active_pcbs, pcb); memp_free(MEMP_TCP_PCB, pcb); pcb = NULL; snmp_inc_tcpattemptfails(); break; case SYN_RCVD: err = tcp_send_ctrl(pcb, TCP_FIN); if (err == ERR_OK) { snmp_inc_tcpattemptfails(); pcb->state = FIN_WAIT_1; } break; case ESTABLISHED: err = tcp_send_ctrl(pcb, TCP_FIN); if (err == ERR_OK) { snmp_inc_tcpestabresets(); pcb->state = FIN_WAIT_1; } break; case CLOSE_WAIT: err = tcp_send_ctrl(pcb, TCP_FIN); if (err == ERR_OK) { snmp_inc_tcpestabresets(); pcb->state = LAST_ACK; } break; default: /* Has already been closed, do nothing. */ err = ERR_OK; pcb = NULL; break; } if (pcb != NULL && err == ERR_OK) { /* To ensure all data has been sent when tcp_close returns, we have to make sure tcp_output doesn't fail. Since we don't really have to ensure all data has been sent when tcp_close returns (unsent data is sent from tcp timer functions, also), we don't care for the return value of tcp_output for now. */ /* @todo: When implementing SO_LINGER, this must be changed somehow: If SOF_LINGER is set, the data should be sent when tcp_close returns. */ tcp_output(pcb); } return err; } /** * Abandons a connection and optionally sends a RST to the remote * host. Deletes the local protocol control block. This is done when * a connection is killed because of shortage of memory. * * @param pcb the tcp_pcb to abort * @param reset boolean to indicate whether a reset should be sent */ void tcp_abandon(struct tcp_pcb *pcb, int reset) { u32_t seqno, ackno; u16_t remote_port, local_port; struct ip_addr remote_ip, local_ip; #if LWIP_CALLBACK_API void (* errf)(void *arg, err_t err); #endif /* LWIP_CALLBACK_API */ void *errf_arg; /* Figure out on which TCP PCB list we are, and remove us. If we are in an active state, call the receive function associated with the PCB with a NULL argument, and send an RST to the remote end. */ if (pcb->state == TIME_WAIT) { tcp_pcb_remove(&tcp_tw_pcbs, pcb); memp_free(MEMP_TCP_PCB, pcb); } else { seqno = pcb->snd_nxt; ackno = pcb->rcv_nxt; ip_addr_set(&local_ip, &(pcb->local_ip)); ip_addr_set(&remote_ip, &(pcb->remote_ip)); local_port = pcb->local_port; remote_port = pcb->remote_port; #if LWIP_CALLBACK_API errf = pcb->errf; #endif /* LWIP_CALLBACK_API */ errf_arg = pcb->callback_arg; tcp_pcb_remove(&tcp_active_pcbs, pcb); if (pcb->unacked != NULL) { tcp_segs_free(pcb->unacked); } if (pcb->unsent != NULL) { tcp_segs_free(pcb->unsent); } #if TCP_QUEUE_OOSEQ if (pcb->ooseq != NULL) { tcp_segs_free(pcb->ooseq); } #endif /* TCP_QUEUE_OOSEQ */ memp_free(MEMP_TCP_PCB, pcb); TCP_EVENT_ERR(errf, errf_arg, ERR_ABRT); if (reset) { LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_abandon: sending RST\n")); tcp_rst(seqno, ackno, &local_ip, &remote_ip, local_port, remote_port); } } } /** * Binds the connection to a local portnumber and IP address. If the * IP address is not given (i.e., ipaddr == NULL), the IP address of * the outgoing network interface is used instead. * * @param pcb the tcp_pcb to bind (no check is done whether this pcb is * already bound!) * @param ipaddr the local ip address to bind to (use IP_ADDR_ANY to bind * to any local address * @param port the local port to bind to * @return ERR_USE if the port is already in use * ERR_OK if bound */ err_t tcp_bind(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port) { struct tcp_pcb *cpcb; LWIP_ERROR("tcp_bind: can only bind in state CLOSED", pcb->state == CLOSED, return ERR_ISCONN); if (port == 0) { port = tcp_new_port(); } /* Check if the address already is in use. */ /* Check the listen pcbs. */ for(cpcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; cpcb != NULL; cpcb = cpcb->next) { if (cpcb->local_port == port) { if (ip_addr_isany(&(cpcb->local_ip)) || ip_addr_isany(ipaddr) || ip_addr_cmp(&(cpcb->local_ip), ipaddr)) { return ERR_USE; } } } /* Check the connected pcbs. */ for(cpcb = tcp_active_pcbs; cpcb != NULL; cpcb = cpcb->next) { if (cpcb->local_port == port) { if (ip_addr_isany(&(cpcb->local_ip)) || ip_addr_isany(ipaddr) || ip_addr_cmp(&(cpcb->local_ip), ipaddr)) { return ERR_USE; } } } /* Check the bound, not yet connected pcbs. */ for(cpcb = tcp_bound_pcbs; cpcb != NULL; cpcb = cpcb->next) { if (cpcb->local_port == port) { if (ip_addr_isany(&(cpcb->local_ip)) || ip_addr_isany(ipaddr) || ip_addr_cmp(&(cpcb->local_ip), ipaddr)) { return ERR_USE; } } } /* @todo: until SO_REUSEADDR is implemented (see task #6995 on savannah), * we have to check the pcbs in TIME-WAIT state, also: */ for(cpcb = tcp_tw_pcbs; cpcb != NULL; cpcb = cpcb->next) { if (cpcb->local_port == port) { if (ip_addr_cmp(&(cpcb->local_ip), ipaddr)) { return ERR_USE; } } } if (!ip_addr_isany(ipaddr)) { pcb->local_ip = *ipaddr; } pcb->local_port = port; TCP_REG(&tcp_bound_pcbs, pcb); LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: bind to port %"U16_F"\n", port)); return ERR_OK; } #if LWIP_CALLBACK_API /** * Default accept callback if no accept callback is specified by the user. */ static err_t tcp_accept_null(void *arg, struct tcp_pcb *pcb, err_t err) { LWIP_UNUSED_ARG(arg); LWIP_UNUSED_ARG(pcb); LWIP_UNUSED_ARG(err); return ERR_ABRT; } #endif /* LWIP_CALLBACK_API */ /** * Set the state of the connection to be LISTEN, which means that it * is able to accept incoming connections. The protocol control block * is reallocated in order to consume less memory. Setting the * connection to LISTEN is an irreversible process. * * @param pcb the original tcp_pcb * @param backlog the incoming connections queue limit * @return tcp_pcb used for listening, consumes less memory. * * @note The original tcp_pcb is freed. This function therefore has to be * called like this: * tpcb = tcp_listen(tpcb); */ struct tcp_pcb * tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog) { struct tcp_pcb_listen *lpcb; LWIP_UNUSED_ARG(backlog); LWIP_ERROR("tcp_listen: pcb already connected", pcb->state == CLOSED, return NULL); /* already listening? */ if (pcb->state == LISTEN) { return pcb; } lpcb = memp_malloc(MEMP_TCP_PCB_LISTEN); if (lpcb == NULL) { return NULL; } lpcb->callback_arg = pcb->callback_arg; lpcb->local_port = pcb->local_port; lpcb->state = LISTEN; lpcb->so_options = pcb->so_options; lpcb->so_options |= SOF_ACCEPTCONN; lpcb->ttl = pcb->ttl; lpcb->tos = pcb->tos; ip_addr_set(&lpcb->local_ip, &pcb->local_ip); TCP_RMV(&tcp_bound_pcbs, pcb); memp_free(MEMP_TCP_PCB, pcb); #if LWIP_CALLBACK_API lpcb->accept = tcp_accept_null; #endif /* LWIP_CALLBACK_API */ #if TCP_LISTEN_BACKLOG lpcb->accepts_pending = 0; lpcb->backlog = (backlog ? backlog : 1); #endif /* TCP_LISTEN_BACKLOG */ TCP_REG(&tcp_listen_pcbs.listen_pcbs, lpcb); return (struct tcp_pcb *)lpcb; } /** * Update the state that tracks the available window space to advertise. * * Returns how much extra window would be advertised if we sent an * update now. */ u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb) { u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd; if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2), pcb->mss))) { /* we can advertise more window */ pcb->rcv_ann_wnd = pcb->rcv_wnd; return new_right_edge - pcb->rcv_ann_right_edge; } else { if (TCP_SEQ_GT(pcb->rcv_nxt, pcb->rcv_ann_right_edge)) { /* Can happen due to other end sending out of advertised window, * but within actual available (but not yet advertised) window */ pcb->rcv_ann_wnd = 0; } else { /* keep the right edge of window constant */ pcb->rcv_ann_wnd = pcb->rcv_ann_right_edge - pcb->rcv_nxt; } return 0; } } /** * This function should be called by the application when it has * processed the data. The purpose is to advertise a larger window * when the data has been processed. * * @param pcb the tcp_pcb for which data is read * @param len the amount of bytes that have been read by the application */ void tcp_recved(struct tcp_pcb *pcb, u16_t len) { int wnd_inflation; LWIP_ASSERT("tcp_recved: len would wrap rcv_wnd\n", len <= 0xffff - pcb->rcv_wnd ); pcb->rcv_wnd += len; if (pcb->rcv_wnd > TCP_WND) pcb->rcv_wnd = TCP_WND; wnd_inflation = tcp_update_rcv_ann_wnd(pcb); /* If the change in the right edge of window is significant (default * watermark is TCP_WND/2), then send an explicit update now. * Otherwise wait for a packet to be sent in the normal course of * events (or more window to be available later) */ if (wnd_inflation >= TCP_WND_UPDATE_THRESHOLD) tcp_ack_now(pcb); LWIP_DEBUGF(TCP_DEBUG, ("tcp_recved: recveived %"U16_F" bytes, wnd %"U16_F" (%"U16_F").\n", len, pcb->rcv_wnd, TCP_WND - pcb->rcv_wnd)); } /** * A nastly hack featuring 'goto' statements that allocates a * new TCP local port. * * @return a new (free) local TCP port number */ static u16_t tcp_new_port(void) { struct tcp_pcb *pcb; #ifndef TCP_LOCAL_PORT_RANGE_START #define TCP_LOCAL_PORT_RANGE_START 4096 #define TCP_LOCAL_PORT_RANGE_END 0x7fff #endif static u16_t port = TCP_LOCAL_PORT_RANGE_START; again: if (++port > TCP_LOCAL_PORT_RANGE_END) { port = TCP_LOCAL_PORT_RANGE_START; } for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { if (pcb->local_port == port) { goto again; } } for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { if (pcb->local_port == port) { goto again; } } for(pcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; pcb != NULL; pcb = pcb->next) { if (pcb->local_port == port) { goto again; } } return port; } /** * Connects to another host. The function given as the "connected" * argument will be called when the connection has been established. * * @param pcb the tcp_pcb used to establish the connection * @param ipaddr the remote ip address to connect to * @param port the remote tcp port to connect to * @param connected callback function to call when connected (or on error) * @return ERR_VAL if invalid arguments are given * ERR_OK if connect request has been sent * other err_t values if connect request couldn't be sent */ err_t tcp_connect(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port, err_t (* connected)(void *arg, struct tcp_pcb *tpcb, err_t err)) { err_t ret; u32_t iss; LWIP_ERROR("tcp_connect: can only connected from state CLOSED", pcb->state == CLOSED, return ERR_ISCONN); LWIP_DEBUGF(TCP_DEBUG, ("tcp_connect to port %"U16_F"\n", port)); if (ipaddr != NULL) { pcb->remote_ip = *ipaddr; } else { return ERR_VAL; } pcb->remote_port = port; if (pcb->local_port == 0) { pcb->local_port = tcp_new_port(); } iss = tcp_next_iss(); pcb->rcv_nxt = 0; pcb->snd_nxt = iss; pcb->lastack = iss - 1; pcb->snd_lbb = iss - 1; pcb->rcv_wnd = TCP_WND; pcb->rcv_ann_wnd = TCP_WND; pcb->rcv_ann_right_edge = pcb->rcv_nxt; pcb->snd_wnd = TCP_WND; /* As initial send MSS, we use TCP_MSS but limit it to 536. The send MSS is updated when an MSS option is received. */ pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS; #if TCP_CALCULATE_EFF_SEND_MSS pcb->mss = tcp_eff_send_mss(pcb->mss, ipaddr); #endif /* TCP_CALCULATE_EFF_SEND_MSS */ pcb->cwnd = 1; pcb->ssthresh = pcb->mss * 10; pcb->state = SYN_SENT; #if LWIP_CALLBACK_API pcb->connected = connected; #endif /* LWIP_CALLBACK_API */ TCP_RMV(&tcp_bound_pcbs, pcb); TCP_REG(&tcp_active_pcbs, pcb); snmp_inc_tcpactiveopens(); ret = tcp_enqueue(pcb, NULL, 0, TCP_SYN, 0, TF_SEG_OPTS_MSS #if LWIP_TCP_TIMESTAMPS | TF_SEG_OPTS_TS #endif ); if (ret == ERR_OK) { tcp_output(pcb); } return ret; } /** * Called every 500 ms and implements the retransmission timer and the timer that * removes PCBs that have been in TIME-WAIT for enough time. It also increments * various timers such as the inactivity timer in each PCB. * * Automatically called from tcp_tmr(). */ void tcp_slowtmr(void) { struct tcp_pcb *pcb, *pcb2, *prev; u16_t eff_wnd; u8_t pcb_remove; /* flag if a PCB should be removed */ u8_t pcb_reset; /* flag if a RST should be sent when removing */ err_t err; err = ERR_OK; ++tcp_ticks; /* Steps through all of the active PCBs. */ prev = NULL; pcb = tcp_active_pcbs; if (pcb == NULL) { LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: no active pcbs\n")); } while (pcb != NULL) { LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: processing active pcb\n")); LWIP_ASSERT("tcp_slowtmr: active pcb->state != CLOSED\n", pcb->state != CLOSED); LWIP_ASSERT("tcp_slowtmr: active pcb->state != LISTEN\n", pcb->state != LISTEN); LWIP_ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT\n", pcb->state != TIME_WAIT); pcb_remove = 0; pcb_reset = 0; if (pcb->state == SYN_SENT && pcb->nrtx == TCP_SYNMAXRTX) { ++pcb_remove; LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max SYN retries reached\n")); } else if (pcb->nrtx == TCP_MAXRTX) { ++pcb_remove; LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reached\n")); } else { if (pcb->persist_backoff > 0) { /* If snd_wnd is zero, use persist timer to send 1 byte probes * instead of using the standard retransmission mechanism. */ pcb->persist_cnt++; if (pcb->persist_cnt >= tcp_persist_backoff[pcb->persist_backoff-1]) { pcb->persist_cnt = 0; if (pcb->persist_backoff < sizeof(tcp_persist_backoff)) { pcb->persist_backoff++; } tcp_zero_window_probe(pcb); } } else { /* Increase the retransmission timer if it is running */ if(pcb->rtime >= 0) ++pcb->rtime; if (pcb->unacked != NULL && pcb->rtime >= pcb->rto) { /* Time for a retransmission. */ LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_slowtmr: rtime %"S16_F " pcb->rto %"S16_F"\n", pcb->rtime, pcb->rto)); /* Double retransmission time-out unless we are trying to * connect to somebody (i.e., we are in SYN_SENT). */ if (pcb->state != SYN_SENT) { pcb->rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[pcb->nrtx]; } /* Reset the retransmission timer. */ pcb->rtime = 0; /* Reduce congestion window and ssthresh. */ eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd); pcb->ssthresh = eff_wnd >> 1; if (pcb->ssthresh < pcb->mss) { pcb->ssthresh = pcb->mss * 2; } pcb->cwnd = pcb->mss; LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: cwnd %"U16_F " ssthresh %"U16_F"\n", pcb->cwnd, pcb->ssthresh)); /* The following needs to be called AFTER cwnd is set to one mss - STJ */ tcp_rexmit_rto(pcb); } } } /* Check if this PCB has stayed too long in FIN-WAIT-2 */ if (pcb->state == FIN_WAIT_2) { if ((u32_t)(tcp_ticks - pcb->tmr) > TCP_FIN_WAIT_TIMEOUT / TCP_SLOW_INTERVAL) { ++pcb_remove; LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in FIN-WAIT-2\n")); } } /* Check if KEEPALIVE should be sent */ if((pcb->so_options & SOF_KEEPALIVE) && ((pcb->state == ESTABLISHED) || (pcb->state == CLOSE_WAIT))) { #if LWIP_TCP_KEEPALIVE if((u32_t)(tcp_ticks - pcb->tmr) > (pcb->keep_idle + (pcb->keep_cnt*pcb->keep_intvl)) / TCP_SLOW_INTERVAL) #else if((u32_t)(tcp_ticks - pcb->tmr) > (pcb->keep_idle + TCP_MAXIDLE) / TCP_SLOW_INTERVAL) #endif /* LWIP_TCP_KEEPALIVE */ { LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: KEEPALIVE timeout. Aborting connection to %"U16_F".%"U16_F".%"U16_F".%"U16_F".\n", ip4_addr1(&pcb->remote_ip), ip4_addr2(&pcb->remote_ip), ip4_addr3(&pcb->remote_ip), ip4_addr4(&pcb->remote_ip))); ++pcb_remove; ++pcb_reset; } #if LWIP_TCP_KEEPALIVE else if((u32_t)(tcp_ticks - pcb->tmr) > (pcb->keep_idle + pcb->keep_cnt_sent * pcb->keep_intvl) / TCP_SLOW_INTERVAL) #else else if((u32_t)(tcp_ticks - pcb->tmr) > (pcb->keep_idle + pcb->keep_cnt_sent * TCP_KEEPINTVL_DEFAULT) / TCP_SLOW_INTERVAL) #endif /* LWIP_TCP_KEEPALIVE */ { tcp_keepalive(pcb); pcb->keep_cnt_sent++; } } /* If this PCB has queued out of sequence data, but has been inactive for too long, will drop the data (it will eventually be retransmitted). */ #if TCP_QUEUE_OOSEQ if (pcb->ooseq != NULL && (u32_t)tcp_ticks - pcb->tmr >= pcb->rto * TCP_OOSEQ_TIMEOUT) { tcp_segs_free(pcb->ooseq); pcb->ooseq = NULL; LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: dropping OOSEQ queued data\n")); } #endif /* TCP_QUEUE_OOSEQ */ /* Check if this PCB has stayed too long in SYN-RCVD */ if (pcb->state == SYN_RCVD) { if ((u32_t)(tcp_ticks - pcb->tmr) > TCP_SYN_RCVD_TIMEOUT / TCP_SLOW_INTERVAL) { ++pcb_remove; LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in SYN-RCVD\n")); } } /* Check if this PCB has stayed too long in LAST-ACK */ if (pcb->state == LAST_ACK) { if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) { ++pcb_remove; LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in LAST-ACK\n")); } } /* If the PCB should be removed, do it. */ if (pcb_remove) { tcp_pcb_purge(pcb); /* Remove PCB from tcp_active_pcbs list. */ if (prev != NULL) { LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_active_pcbs", pcb != tcp_active_pcbs); prev->next = pcb->next; } else { /* This PCB was the first. */ LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_active_pcbs", tcp_active_pcbs == pcb); tcp_active_pcbs = pcb->next; } TCP_EVENT_ERR(pcb->errf, pcb->callback_arg, ERR_ABRT); if (pcb_reset) { tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip, pcb->local_port, pcb->remote_port); } pcb2 = pcb->next; memp_free(MEMP_TCP_PCB, pcb); pcb = pcb2; } else { /* We check if we should poll the connection. */ ++pcb->polltmr; if (pcb->polltmr >= pcb->pollinterval) { pcb->polltmr = 0; LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: polling application\n")); TCP_EVENT_POLL(pcb, err); if (err == ERR_OK) { tcp_output(pcb); } } prev = pcb; pcb = pcb->next; } } /* Steps through all of the TIME-WAIT PCBs. */ prev = NULL; pcb = tcp_tw_pcbs; while (pcb != NULL) { LWIP_ASSERT("tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT); pcb_remove = 0; /* Check if this PCB has stayed long enough in TIME-WAIT */ if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) { ++pcb_remove; } /* If the PCB should be removed, do it. */ if (pcb_remove) { tcp_pcb_purge(pcb); /* Remove PCB from tcp_tw_pcbs list. */ if (prev != NULL) { LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs); prev->next = pcb->next; } else { /* This PCB was the first. */ LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb); tcp_tw_pcbs = pcb->next; } pcb2 = pcb->next; memp_free(MEMP_TCP_PCB, pcb); pcb = pcb2; } else { prev = pcb; pcb = pcb->next; } } } /** * Is called every TCP_FAST_INTERVAL (250 ms) and process data previously * "refused" by upper layer (application) and sends delayed ACKs. * * Automatically called from tcp_tmr(). */ void tcp_fasttmr(void) { struct tcp_pcb *pcb; for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { /* If there is data which was previously "refused" by upper layer */ if (pcb->refused_data != NULL) { /* Notify again application with data previously received. */ err_t err; LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_fasttmr: notify kept packet\n")); TCP_EVENT_RECV(pcb, pcb->refused_data, ERR_OK, err); if (err == ERR_OK) { pcb->refused_data = NULL; } } /* send delayed ACKs */ if (pcb->flags & TF_ACK_DELAY) { LWIP_DEBUGF(TCP_DEBUG, ("tcp_fasttmr: delayed ACK\n")); tcp_ack_now(pcb); pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW); } } } /** * Deallocates a list of TCP segments (tcp_seg structures). * * @param seg tcp_seg list of TCP segments to free * @return the number of pbufs that were deallocated */ u8_t tcp_segs_free(struct tcp_seg *seg) { u8_t count = 0; struct tcp_seg *next; while (seg != NULL) { next = seg->next; count += tcp_seg_free(seg); seg = next; } return count; } /** * Frees a TCP segment (tcp_seg structure). * * @param seg single tcp_seg to free * @return the number of pbufs that were deallocated */ u8_t tcp_seg_free(struct tcp_seg *seg) { u8_t count = 0; if (seg != NULL) { if (seg->p != NULL) { count = pbuf_free(seg->p); #if TCP_DEBUG seg->p = NULL; #endif /* TCP_DEBUG */ } memp_free(MEMP_TCP_SEG, seg); } return count; } /** * Sets the priority of a connection. * * @param pcb the tcp_pcb to manipulate * @param prio new priority */ void tcp_setprio(struct tcp_pcb *pcb, u8_t prio) { pcb->prio = prio; } #if TCP_QUEUE_OOSEQ /** * Returns a copy of the given TCP segment. * The pbuf and data are not copied, only the pointers * * @param seg the old tcp_seg * @return a copy of seg */ struct tcp_seg * tcp_seg_copy(struct tcp_seg *seg) { struct tcp_seg *cseg; cseg = memp_malloc(MEMP_TCP_SEG); if (cseg == NULL) { return NULL; } SMEMCPY((u8_t *)cseg, (const u8_t *)seg, sizeof(struct tcp_seg)); pbuf_ref(cseg->p); return cseg; } #endif #if LWIP_CALLBACK_API /** * Default receive callback that is called if the user didn't register * a recv callback for the pcb. */ err_t tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) { LWIP_UNUSED_ARG(arg); if (p != NULL) { tcp_recved(pcb, p->tot_len); pbuf_free(p); } else if (err == ERR_OK) { return tcp_close(pcb); } return ERR_OK; } #endif /* LWIP_CALLBACK_API */ /** * Kills the oldest active connection that has lower priority than prio. * * @param prio minimum priority */ static void tcp_kill_prio(u8_t prio) { struct tcp_pcb *pcb, *inactive; u32_t inactivity; u8_t mprio; mprio = TCP_PRIO_MAX; /* We kill the oldest active connection that has lower priority than prio. */ inactivity = 0; inactive = NULL; for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { if (pcb->prio <= prio && pcb->prio <= mprio && (u32_t)(tcp_ticks - pcb->tmr) >= inactivity) { inactivity = tcp_ticks - pcb->tmr; inactive = pcb; mprio = pcb->prio; } } if (inactive != NULL) { LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_prio: killing oldest PCB %p (%"S32_F")\n", (void *)inactive, inactivity)); tcp_abort(inactive); } } /** * Kills the oldest connection that is in TIME_WAIT state. * Called from tcp_alloc() if no more connections are available. */ static void tcp_kill_timewait(void) { struct tcp_pcb *pcb, *inactive; u32_t inactivity; inactivity = 0; inactive = NULL; /* Go through the list of TIME_WAIT pcbs and get the oldest pcb. */ for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) { inactivity = tcp_ticks - pcb->tmr; inactive = pcb; } } if (inactive != NULL) { LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_timewait: killing oldest TIME-WAIT PCB %p (%"S32_F")\n", (void *)inactive, inactivity)); tcp_abort(inactive); } } /** * Allocate a new tcp_pcb structure. * * @param prio priority for the new pcb * @return a new tcp_pcb that initially is in state CLOSED */ struct tcp_pcb * tcp_alloc(u8_t prio) { struct tcp_pcb *pcb; u32_t iss; pcb = memp_malloc(MEMP_TCP_PCB); if (pcb == NULL) { /* Try killing oldest connection in TIME-WAIT. */ LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest TIME-WAIT connection\n")); tcp_kill_timewait(); /* Try to allocate a tcp_pcb again. */ pcb = memp_malloc(MEMP_TCP_PCB); if (pcb == NULL) { /* Try killing active connections with lower priority than the new one. */ LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing connection with prio lower than %d\n", prio)); tcp_kill_prio(prio); /* Try to allocate a tcp_pcb again. */ pcb = memp_malloc(MEMP_TCP_PCB); if (pcb != NULL) { /* adjust err stats: memp_malloc failed twice before */ MEMP_STATS_DEC(err, MEMP_TCP_PCB); } } if (pcb != NULL) { /* adjust err stats: timewait PCB was freed above */ MEMP_STATS_DEC(err, MEMP_TCP_PCB); } } if (pcb != NULL) { memset(pcb, 0, sizeof(struct tcp_pcb)); pcb->prio = TCP_PRIO_NORMAL; pcb->snd_buf = TCP_SND_BUF; pcb->snd_queuelen = 0; pcb->rcv_wnd = TCP_WND; pcb->rcv_ann_wnd = TCP_WND; pcb->tos = 0; pcb->ttl = TCP_TTL; /* As initial send MSS, we use TCP_MSS but limit it to 536. The send MSS is updated when an MSS option is received. */ pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS; pcb->rto = 3000 / TCP_SLOW_INTERVAL; pcb->sa = 0; pcb->sv = 3000 / TCP_SLOW_INTERVAL; pcb->rtime = -1; pcb->cwnd = 1; iss = tcp_next_iss(); pcb->snd_wl2 = iss; pcb->snd_nxt = iss; pcb->lastack = iss; pcb->snd_lbb = iss; pcb->tmr = tcp_ticks; pcb->polltmr = 0; #if LWIP_CALLBACK_API pcb->recv = tcp_recv_null; #endif /* LWIP_CALLBACK_API */ /* Init KEEPALIVE timer */ pcb->keep_idle = TCP_KEEPIDLE_DEFAULT; #if LWIP_TCP_KEEPALIVE pcb->keep_intvl = TCP_KEEPINTVL_DEFAULT; pcb->keep_cnt = TCP_KEEPCNT_DEFAULT; #endif /* LWIP_TCP_KEEPALIVE */ pcb->keep_cnt_sent = 0; } return pcb; } /** * Creates a new TCP protocol control block but doesn't place it on * any of the TCP PCB lists. * The pcb is not put on any list until binding using tcp_bind(). * * @internal: Maybe there should be a idle TCP PCB list where these * PCBs are put on. Port reservation using tcp_bind() is implemented but * allocated pcbs that are not bound can't be killed automatically if wanting * to allocate a pcb with higher prio (@see tcp_kill_prio()) * * @return a new tcp_pcb that initially is in state CLOSED */ struct tcp_pcb * tcp_new(void) { return tcp_alloc(TCP_PRIO_NORMAL); } /** * Used to specify the argument that should be passed callback * functions. * * @param pcb tcp_pcb to set the callback argument * @param arg void pointer argument to pass to callback functions */ void tcp_arg(struct tcp_pcb *pcb, void *arg) { pcb->callback_arg = arg; } #if LWIP_CALLBACK_API /** * Used to specify the function that should be called when a TCP * connection receives data. * * @param pcb tcp_pcb to set the recv callback * @param recv callback function to call for this pcb when data is received */ void tcp_recv(struct tcp_pcb *pcb, err_t (* recv)(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)) { pcb->recv = recv; } /** * Used to specify the function that should be called when TCP data * has been successfully delivered to the remote host. * * @param pcb tcp_pcb to set the sent callback * @param sent callback function to call for this pcb when data is successfully sent */ void tcp_sent(struct tcp_pcb *pcb, err_t (* sent)(void *arg, struct tcp_pcb *tpcb, u16_t len)) { pcb->sent = sent; } /** * Used to specify the function that should be called when a fatal error * has occured on the connection. * * @param pcb tcp_pcb to set the err callback * @param errf callback function to call for this pcb when a fatal error * has occured on the connection */ void tcp_err(struct tcp_pcb *pcb, void (* errf)(void *arg, err_t err)) { pcb->errf = errf; } /** * Used for specifying the function that should be called when a * LISTENing connection has been connected to another host. * * @param pcb tcp_pcb to set the accept callback * @param accept callback function to call for this pcb when LISTENing * connection has been connected to another host */ void tcp_accept(struct tcp_pcb *pcb, err_t (* accept)(void *arg, struct tcp_pcb *newpcb, err_t err)) { pcb->accept = accept; } #endif /* LWIP_CALLBACK_API */ /** * Used to specify the function that should be called periodically * from TCP. The interval is specified in terms of the TCP coarse * timer interval, which is called twice a second. * */ void tcp_poll(struct tcp_pcb *pcb, err_t (* poll)(void *arg, struct tcp_pcb *tpcb), u8_t interval) { #if LWIP_CALLBACK_API pcb->poll = poll; #endif /* LWIP_CALLBACK_API */ pcb->pollinterval = interval; } /** * Purges a TCP PCB. Removes any buffered data and frees the buffer memory * (pcb->ooseq, pcb->unsent and pcb->unacked are freed). * * @param pcb tcp_pcb to purge. The pcb itself is not deallocated! */ void tcp_pcb_purge(struct tcp_pcb *pcb) { if (pcb->state != CLOSED && pcb->state != TIME_WAIT && pcb->state != LISTEN) { LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge\n")); #if TCP_LISTEN_BACKLOG if (pcb->state == SYN_RCVD) { /* Need to find the corresponding listen_pcb and decrease its accepts_pending */ struct tcp_pcb_listen *lpcb; LWIP_ASSERT("tcp_pcb_purge: pcb->state == SYN_RCVD but tcp_listen_pcbs is NULL", tcp_listen_pcbs.listen_pcbs != NULL); for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { if ((lpcb->local_port == pcb->local_port) && (ip_addr_isany(&lpcb->local_ip) || ip_addr_cmp(&pcb->local_ip, &lpcb->local_ip))) { /* port and address of the listen pcb match the timed-out pcb */ LWIP_ASSERT("tcp_pcb_purge: listen pcb does not have accepts pending", lpcb->accepts_pending > 0); lpcb->accepts_pending--; break; } } } #endif /* TCP_LISTEN_BACKLOG */ if (pcb->refused_data != NULL) { LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->refused_data\n")); pbuf_free(pcb->refused_data); pcb->refused_data = NULL; } if (pcb->unsent != NULL) { LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: not all data sent\n")); } if (pcb->unacked != NULL) { LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->unacked\n")); } #if TCP_QUEUE_OOSEQ /* LW */ if (pcb->ooseq != NULL) { LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->ooseq\n")); } /* Stop the retransmission timer as it will expect data on unacked queue if it fires */ pcb->rtime = -1; tcp_segs_free(pcb->ooseq); pcb->ooseq = NULL; #endif /* TCP_QUEUE_OOSEQ */ tcp_segs_free(pcb->unsent); tcp_segs_free(pcb->unacked); pcb->unacked = pcb->unsent = NULL; } } /** * Purges the PCB and removes it from a PCB list. Any delayed ACKs are sent first. * * @param pcblist PCB list to purge. * @param pcb tcp_pcb to purge. The pcb itself is NOT deallocated! */ void tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb) { TCP_RMV(pcblist, pcb); tcp_pcb_purge(pcb); /* if there is an outstanding delayed ACKs, send it */ if (pcb->state != TIME_WAIT && pcb->state != LISTEN && pcb->flags & TF_ACK_DELAY) { pcb->flags |= TF_ACK_NOW; tcp_output(pcb); } if (pcb->state != LISTEN) { LWIP_ASSERT("unsent segments leaking", pcb->unsent == NULL); LWIP_ASSERT("unacked segments leaking", pcb->unacked == NULL); #if TCP_QUEUE_OOSEQ LWIP_ASSERT("ooseq segments leaking", pcb->ooseq == NULL); #endif /* TCP_QUEUE_OOSEQ */ } pcb->state = CLOSED; LWIP_ASSERT("tcp_pcb_remove: tcp_pcbs_sane()", tcp_pcbs_sane()); } /** * Calculates a new initial sequence number for new connections. * * @return u32_t pseudo random sequence number */ u32_t tcp_next_iss(void) { static u32_t iss = 6510; iss += tcp_ticks; /* XXX */ return iss; } #if TCP_CALCULATE_EFF_SEND_MSS /** * Calcluates the effective send mss that can be used for a specific IP address * by using ip_route to determin the netif used to send to the address and * calculating the minimum of TCP_MSS and that netif's mtu (if set). */ u16_t tcp_eff_send_mss(u16_t sendmss, struct ip_addr *addr) { u16_t mss_s; struct netif *outif; outif = ip_route(addr); if ((outif != NULL) && (outif->mtu != 0)) { mss_s = outif->mtu - IP_HLEN - TCP_HLEN; /* RFC 1122, chap 4.2.2.6: * Eff.snd.MSS = min(SendMSS+20, MMS_S) - TCPhdrsize - IPoptionsize * We correct for TCP options in tcp_enqueue(), and don't support * IP options */ sendmss = LWIP_MIN(sendmss, mss_s); } return sendmss; } #endif /* TCP_CALCULATE_EFF_SEND_MSS */ const char* tcp_debug_state_str(enum tcp_state s) { return tcp_state_str[s]; } #if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG /** * Print a tcp header for debugging purposes. * * @param tcphdr pointer to a struct tcp_hdr */ void tcp_debug_print(struct tcp_hdr *tcphdr) { LWIP_DEBUGF(TCP_DEBUG, ("TCP header:\n")); LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); LWIP_DEBUGF(TCP_DEBUG, ("| %5"U16_F" | %5"U16_F" | (src port, dest port)\n", ntohs(tcphdr->src), ntohs(tcphdr->dest))); LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); LWIP_DEBUGF(TCP_DEBUG, ("| %010"U32_F" | (seq no)\n", ntohl(tcphdr->seqno))); LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); LWIP_DEBUGF(TCP_DEBUG, ("| %010"U32_F" | (ack no)\n", ntohl(tcphdr->ackno))); LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); LWIP_DEBUGF(TCP_DEBUG, ("| %2"U16_F" | |%"U16_F"%"U16_F"%"U16_F"%"U16_F"%"U16_F"%"U16_F"| %5"U16_F" | (hdrlen, flags (", TCPH_HDRLEN(tcphdr), TCPH_FLAGS(tcphdr) >> 5 & 1, TCPH_FLAGS(tcphdr) >> 4 & 1, TCPH_FLAGS(tcphdr) >> 3 & 1, TCPH_FLAGS(tcphdr) >> 2 & 1, TCPH_FLAGS(tcphdr) >> 1 & 1, TCPH_FLAGS(tcphdr) & 1, ntohs(tcphdr->wnd))); tcp_debug_print_flags(TCPH_FLAGS(tcphdr)); LWIP_DEBUGF(TCP_DEBUG, ("), win)\n")); LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); LWIP_DEBUGF(TCP_DEBUG, ("| 0x%04"X16_F" | %5"U16_F" | (chksum, urgp)\n", ntohs(tcphdr->chksum), ntohs(tcphdr->urgp))); LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); } /** * Print a tcp state for debugging purposes. * * @param s enum tcp_state to print */ void tcp_debug_print_state(enum tcp_state s) { LWIP_DEBUGF(TCP_DEBUG, ("State: %s\n", tcp_state_str[s])); } /** * Print tcp flags for debugging purposes. * * @param flags tcp flags, all active flags are printed */ void tcp_debug_print_flags(u8_t flags) { if (flags & TCP_FIN) { LWIP_DEBUGF(TCP_DEBUG, ("FIN ")); } if (flags & TCP_SYN) { LWIP_DEBUGF(TCP_DEBUG, ("SYN ")); } if (flags & TCP_RST) { LWIP_DEBUGF(TCP_DEBUG, ("RST ")); } if (flags & TCP_PSH) { LWIP_DEBUGF(TCP_DEBUG, ("PSH ")); } if (flags & TCP_ACK) { LWIP_DEBUGF(TCP_DEBUG, ("ACK ")); } if (flags & TCP_URG) { LWIP_DEBUGF(TCP_DEBUG, ("URG ")); } if (flags & TCP_ECE) { LWIP_DEBUGF(TCP_DEBUG, ("ECE ")); } if (flags & TCP_CWR) { LWIP_DEBUGF(TCP_DEBUG, ("CWR ")); } LWIP_DEBUGF(TCP_DEBUG, ("\n")); } /** * Print all tcp_pcbs in every list for debugging purposes. */ void tcp_debug_print_pcbs(void) { struct tcp_pcb *pcb; LWIP_DEBUGF(TCP_DEBUG, ("Active PCB states:\n")); for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { LWIP_DEBUGF(TCP_DEBUG, ("[%p]Local port %"U16_F", foreign port %"U16_F" snd_nxt %"U32_F" rcv_nxt %"U32_F" ", pcb, pcb->local_port, pcb->remote_port, pcb->snd_nxt, pcb->rcv_nxt)); tcp_debug_print_state(pcb->state); } LWIP_DEBUGF(TCP_DEBUG, ("Listen PCB states:\n")); for(pcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; pcb != NULL; pcb = pcb->next) { LWIP_DEBUGF(TCP_DEBUG, ("[%p]Local port %"U16_F", foreign port %"U16_F" snd_nxt %"U32_F" rcv_nxt %"U32_F" ", pcb, pcb->local_port, pcb->remote_port, pcb->snd_nxt, pcb->rcv_nxt)); tcp_debug_print_state(pcb->state); } LWIP_DEBUGF(TCP_DEBUG, ("TIME-WAIT PCB states:\n")); for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { LWIP_DEBUGF(TCP_DEBUG, ("[%p]Local port %"U16_F", foreign port %"U16_F" snd_nxt %"U32_F" rcv_nxt %"U32_F" ", pcb, pcb->local_port, pcb->remote_port, pcb->snd_nxt, pcb->rcv_nxt)); tcp_debug_print_state(pcb->state); } } /** * Check state consistency of the tcp_pcb lists. */ s16_t tcp_pcbs_sane(void) { struct tcp_pcb *pcb; for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != CLOSED", pcb->state != CLOSED); LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != LISTEN", pcb->state != LISTEN); LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT); } for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { LWIP_ASSERT("tcp_pcbs_sane: tw pcb->state == TIME-WAIT", pcb->state == TIME_WAIT); } return 1; } #endif /* TCP_DEBUG */ #endif /* LWIP_TCP */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/tcp_in.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * Transmission Control Protocol, incoming traffic * * The input processing functions of the TCP layer. * * These functions are generally called in the order (ip_input() ->) * tcp_input() -> * tcp_process() -> tcp_receive() (-> application). * */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #include "lwip/opt.h" #if LWIP_TCP /* don't build if not configured for use in lwipopts.h */ #include "lwip/tcp.h" #include "lwip/def.h" #include "lwip/ip_addr.h" #include "lwip/netif.h" #include "lwip/mem.h" #include "lwip/memp.h" #include "lwip/inet.h" #include "lwip/inet_chksum.h" #include "lwip/stats.h" #include "lwip/snmp.h" #include "arch/perf.h" /* These variables are global to all functions involved in the input processing of TCP segments. They are set by the tcp_input() function. */ static struct tcp_seg inseg; static struct tcp_hdr *tcphdr; static struct ip_hdr *iphdr; static u32_t seqno, ackno; static u8_t flags; static u16_t tcplen; static u8_t recv_flags; static struct pbuf *recv_data; struct tcp_pcb *tcp_input_pcb; /* Forward declarations. */ static err_t tcp_process(struct tcp_pcb *pcb); static void tcp_receive(struct tcp_pcb *pcb); static void tcp_parseopt(struct tcp_pcb *pcb); static err_t tcp_listen_input(struct tcp_pcb_listen *pcb); static err_t tcp_timewait_input(struct tcp_pcb *pcb); /** * The initial input processing of TCP. It verifies the TCP header, demultiplexes * the segment between the PCBs and passes it on to tcp_process(), which implements * the TCP finite state machine. This function is called by the IP layer (in * ip_input()). * * @param p received TCP segment to process (p->payload pointing to the IP header) * @param inp network interface on which this segment was received */ void tcp_input(struct pbuf *p, struct netif *inp) { struct tcp_pcb *pcb, *prev; struct tcp_pcb_listen *lpcb; u8_t hdrlen; err_t err; PERF_START; TCP_STATS_INC(tcp.recv); snmp_inc_tcpinsegs(); iphdr = p->payload; tcphdr = (struct tcp_hdr *)((u8_t *)p->payload + IPH_HL(iphdr) * 4); #if TCP_INPUT_DEBUG tcp_debug_print(tcphdr); #endif /* remove header from payload */ if (pbuf_header(p, -((s16_t)(IPH_HL(iphdr) * 4))) || (p->tot_len < sizeof(struct tcp_hdr))) { /* drop short packets */ LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: short packet (%"U16_F" bytes) discarded\n", p->tot_len)); TCP_STATS_INC(tcp.lenerr); TCP_STATS_INC(tcp.drop); snmp_inc_tcpinerrs(); pbuf_free(p); return; } /* Don't even process incoming broadcasts/multicasts. */ if (ip_addr_isbroadcast(&(iphdr->dest), inp) || ip_addr_ismulticast(&(iphdr->dest))) { TCP_STATS_INC(tcp.proterr); TCP_STATS_INC(tcp.drop); snmp_inc_tcpinerrs(); pbuf_free(p); return; } #if CHECKSUM_CHECK_TCP /* Verify TCP checksum. */ if (inet_chksum_pseudo(p, (struct ip_addr *)&(iphdr->src), (struct ip_addr *)&(iphdr->dest), IP_PROTO_TCP, p->tot_len) != 0) { LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packet discarded due to failing checksum 0x%04"X16_F"\n", inet_chksum_pseudo(p, (struct ip_addr *)&(iphdr->src), (struct ip_addr *)&(iphdr->dest), IP_PROTO_TCP, p->tot_len))); #if TCP_DEBUG tcp_debug_print(tcphdr); #endif /* TCP_DEBUG */ TCP_STATS_INC(tcp.chkerr); TCP_STATS_INC(tcp.drop); snmp_inc_tcpinerrs(); pbuf_free(p); return; } #endif /* Move the payload pointer in the pbuf so that it points to the TCP data instead of the TCP header. */ hdrlen = TCPH_HDRLEN(tcphdr); if(pbuf_header(p, -(hdrlen * 4))){ /* drop short packets */ LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: short packet\n")); TCP_STATS_INC(tcp.lenerr); TCP_STATS_INC(tcp.drop); snmp_inc_tcpinerrs(); pbuf_free(p); return; } /* Convert fields in TCP header to host byte order. */ tcphdr->src = ntohs(tcphdr->src); tcphdr->dest = ntohs(tcphdr->dest); seqno = tcphdr->seqno = ntohl(tcphdr->seqno); ackno = tcphdr->ackno = ntohl(tcphdr->ackno); tcphdr->wnd = ntohs(tcphdr->wnd); flags = TCPH_FLAGS(tcphdr); tcplen = p->tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0); /* Demultiplex an incoming segment. First, we check if it is destined for an active connection. */ prev = NULL; for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { LWIP_ASSERT("tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED); LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT); LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN); if (pcb->remote_port == tcphdr->src && pcb->local_port == tcphdr->dest && ip_addr_cmp(&(pcb->remote_ip), &(iphdr->src)) && ip_addr_cmp(&(pcb->local_ip), &(iphdr->dest))) { /* Move this PCB to the front of the list so that subsequent lookups will be faster (we exploit locality in TCP segment arrivals). */ LWIP_ASSERT("tcp_input: pcb->next != pcb (before cache)", pcb->next != pcb); if (prev != NULL) { prev->next = pcb->next; pcb->next = tcp_active_pcbs; tcp_active_pcbs = pcb; } LWIP_ASSERT("tcp_input: pcb->next != pcb (after cache)", pcb->next != pcb); break; } prev = pcb; } if (pcb == NULL) { /* If it did not go to an active connection, we check the connections in the TIME-WAIT state. */ for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { LWIP_ASSERT("tcp_input: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT); if (pcb->remote_port == tcphdr->src && pcb->local_port == tcphdr->dest && ip_addr_cmp(&(pcb->remote_ip), &(iphdr->src)) && ip_addr_cmp(&(pcb->local_ip), &(iphdr->dest))) { /* We don't really care enough to move this PCB to the front of the list since we are not very likely to receive that many segments for connections in TIME-WAIT. */ LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packed for TIME_WAITing connection.\n")); tcp_timewait_input(pcb); pbuf_free(p); return; } } /* Finally, if we still did not get a match, we check all PCBs that are LISTENing for incoming connections. */ prev = NULL; for(lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { if ((ip_addr_isany(&(lpcb->local_ip)) || ip_addr_cmp(&(lpcb->local_ip), &(iphdr->dest))) && lpcb->local_port == tcphdr->dest) { /* Move this PCB to the front of the list so that subsequent lookups will be faster (we exploit locality in TCP segment arrivals). */ if (prev != NULL) { ((struct tcp_pcb_listen *)prev)->next = lpcb->next; /* our successor is the remainder of the listening list */ lpcb->next = tcp_listen_pcbs.listen_pcbs; /* put this listening pcb at the head of the listening list */ tcp_listen_pcbs.listen_pcbs = lpcb; } LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packed for LISTENing connection.\n")); tcp_listen_input(lpcb); pbuf_free(p); return; } prev = (struct tcp_pcb *)lpcb; } } #if TCP_INPUT_DEBUG LWIP_DEBUGF(TCP_INPUT_DEBUG, ("+-+-+-+-+-+-+-+-+-+-+-+-+-+- tcp_input: flags ")); tcp_debug_print_flags(TCPH_FLAGS(tcphdr)); LWIP_DEBUGF(TCP_INPUT_DEBUG, ("-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n")); #endif /* TCP_INPUT_DEBUG */ if (pcb != NULL) { /* The incoming segment belongs to a connection. */ #if TCP_INPUT_DEBUG #if TCP_DEBUG tcp_debug_print_state(pcb->state); #endif /* TCP_DEBUG */ #endif /* TCP_INPUT_DEBUG */ /* Set up a tcp_seg structure. */ inseg.next = NULL; inseg.len = p->tot_len; inseg.dataptr = p->payload; inseg.p = p; inseg.tcphdr = tcphdr; recv_data = NULL; recv_flags = 0; /* If there is data which was previously "refused" by upper layer */ if (pcb->refused_data != NULL) { /* Notify again application with data previously received. */ LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: notify kept packet\n")); TCP_EVENT_RECV(pcb, pcb->refused_data, ERR_OK, err); if (err == ERR_OK) { pcb->refused_data = NULL; } else { /* drop incoming packets, because pcb is "full" */ LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: drop incoming packets, because pcb is \"full\"\n")); TCP_STATS_INC(tcp.drop); snmp_inc_tcpinerrs(); pbuf_free(p); return; } } tcp_input_pcb = pcb; err = tcp_process(pcb); /* A return value of ERR_ABRT means that tcp_abort() was called and that the pcb has been freed. If so, we don't do anything. */ if (err != ERR_ABRT) { if (recv_flags & TF_RESET) { /* TF_RESET means that the connection was reset by the other end. We then call the error callback to inform the application that the connection is dead before we deallocate the PCB. */ TCP_EVENT_ERR(pcb->errf, pcb->callback_arg, ERR_RST); tcp_pcb_remove(&tcp_active_pcbs, pcb); memp_free(MEMP_TCP_PCB, pcb); } else if (recv_flags & TF_CLOSED) { /* The connection has been closed and we will deallocate the PCB. */ tcp_pcb_remove(&tcp_active_pcbs, pcb); memp_free(MEMP_TCP_PCB, pcb); } else { err = ERR_OK; /* If the application has registered a "sent" function to be called when new send buffer space is available, we call it now. */ if (pcb->acked > 0) { TCP_EVENT_SENT(pcb, pcb->acked, err); } if (recv_data != NULL) { if(flags & TCP_PSH) { recv_data->flags |= PBUF_FLAG_PUSH; } /* Notify application that data has been received. */ TCP_EVENT_RECV(pcb, recv_data, ERR_OK, err); /* If the upper layer can't receive this data, store it */ if (err != ERR_OK) { pcb->refused_data = recv_data; LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: keep incoming packet, because pcb is \"full\"\n")); } } /* If a FIN segment was received, we call the callback function with a NULL buffer to indicate EOF. */ if (recv_flags & TF_GOT_FIN) { TCP_EVENT_RECV(pcb, NULL, ERR_OK, err); } tcp_input_pcb = NULL; /* Try to send something out. */ tcp_output(pcb); #if TCP_INPUT_DEBUG #if TCP_DEBUG tcp_debug_print_state(pcb->state); #endif /* TCP_DEBUG */ #endif /* TCP_INPUT_DEBUG */ } } tcp_input_pcb = NULL; /* give up our reference to inseg.p */ if (inseg.p != NULL) { pbuf_free(inseg.p); inseg.p = NULL; } } else { /* If no matching PCB was found, send a TCP RST (reset) to the sender. */ LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_input: no PCB match found, resetting.\n")); if (!(TCPH_FLAGS(tcphdr) & TCP_RST)) { TCP_STATS_INC(tcp.proterr); TCP_STATS_INC(tcp.drop); tcp_rst(ackno, seqno + tcplen, &(iphdr->dest), &(iphdr->src), tcphdr->dest, tcphdr->src); } pbuf_free(p); } LWIP_ASSERT("tcp_input: tcp_pcbs_sane()", tcp_pcbs_sane()); PERF_STOP("tcp_input"); } /** * Called by tcp_input() when a segment arrives for a listening * connection (from tcp_input()). * * @param pcb the tcp_pcb_listen for which a segment arrived * @return ERR_OK if the segment was processed * another err_t on error * * @note the return value is not (yet?) used in tcp_input() * @note the segment which arrived is saved in global variables, therefore only the pcb * involved is passed as a parameter to this function */ static err_t tcp_listen_input(struct tcp_pcb_listen *pcb) { struct tcp_pcb *npcb; err_t rc; /* In the LISTEN state, we check for incoming SYN segments, creates a new PCB, and responds with a SYN|ACK. */ if (flags & TCP_ACK) { /* For incoming segments with the ACK flag set, respond with a RST. */ LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_listen_input: ACK in LISTEN, sending reset\n")); tcp_rst(ackno + 1, seqno + tcplen, &(iphdr->dest), &(iphdr->src), tcphdr->dest, tcphdr->src); } else if (flags & TCP_SYN) { LWIP_DEBUGF(TCP_DEBUG, ("TCP connection request %"U16_F" -> %"U16_F".\n", tcphdr->src, tcphdr->dest)); #if TCP_LISTEN_BACKLOG if (pcb->accepts_pending >= pcb->backlog) { LWIP_DEBUGF(TCP_DEBUG, ("tcp_listen_input: listen backlog exceeded for port %"U16_F"\n", tcphdr->dest)); return ERR_ABRT; } #endif /* TCP_LISTEN_BACKLOG */ npcb = tcp_alloc(pcb->prio); /* If a new PCB could not be created (probably due to lack of memory), we don't do anything, but rely on the sender will retransmit the SYN at a time when we have more memory available. */ if (npcb == NULL) { LWIP_DEBUGF(TCP_DEBUG, ("tcp_listen_input: could not allocate PCB\n")); TCP_STATS_INC(tcp.memerr); return ERR_MEM; } #if TCP_LISTEN_BACKLOG pcb->accepts_pending++; #endif /* TCP_LISTEN_BACKLOG */ /* Set up the new PCB. */ ip_addr_set(&(npcb->local_ip), &(iphdr->dest)); npcb->local_port = pcb->local_port; ip_addr_set(&(npcb->remote_ip), &(iphdr->src)); npcb->remote_port = tcphdr->src; npcb->state = SYN_RCVD; npcb->rcv_nxt = seqno + 1; npcb->rcv_ann_right_edge = npcb->rcv_nxt; npcb->snd_wnd = tcphdr->wnd; npcb->ssthresh = npcb->snd_wnd; npcb->snd_wl1 = seqno - 1;/* initialise to seqno-1 to force window update */ npcb->callback_arg = pcb->callback_arg; #if LWIP_CALLBACK_API npcb->accept = pcb->accept; #endif /* LWIP_CALLBACK_API */ /* inherit socket options */ npcb->so_options = pcb->so_options & (SOF_DEBUG|SOF_DONTROUTE|SOF_KEEPALIVE|SOF_OOBINLINE|SOF_LINGER); /* Register the new PCB so that we can begin receiving segments for it. */ TCP_REG(&tcp_active_pcbs, npcb); /* Parse any options in the SYN. */ tcp_parseopt(npcb); #if TCP_CALCULATE_EFF_SEND_MSS npcb->mss = tcp_eff_send_mss(npcb->mss, &(npcb->remote_ip)); #endif /* TCP_CALCULATE_EFF_SEND_MSS */ snmp_inc_tcppassiveopens(); /* Send a SYN|ACK together with the MSS option. */ rc = tcp_enqueue(npcb, NULL, 0, TCP_SYN | TCP_ACK, 0, TF_SEG_OPTS_MSS #if LWIP_TCP_TIMESTAMPS /* and maybe include the TIMESTAMP option */ | (npcb->flags & TF_TIMESTAMP ? TF_SEG_OPTS_TS : 0) #endif ); if (rc != ERR_OK) { tcp_abandon(npcb, 0); return rc; } return tcp_output(npcb); } return ERR_OK; } /** * Called by tcp_input() when a segment arrives for a connection in * TIME_WAIT. * * @param pcb the tcp_pcb for which a segment arrived * * @note the segment which arrived is saved in global variables, therefore only the pcb * involved is passed as a parameter to this function */ static err_t tcp_timewait_input(struct tcp_pcb *pcb) { /* RFC 1337: in TIME_WAIT, ignore RST and ACK FINs + any 'acceptable' segments */ /* RFC 793 3.9 Event Processing - Segment Arrives: * - first check sequence number - we skip that one in TIME_WAIT (always * acceptable since we only send ACKs) * - second check the RST bit (... return) */ if (flags & TCP_RST) { return ERR_OK; } /* - fourth, check the SYN bit, */ if (flags & TCP_SYN) { /* If an incoming segment is not acceptable, an acknowledgment should be sent in reply */ if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt+pcb->rcv_wnd)) { /* If the SYN is in the window it is an error, send a reset */ tcp_rst(ackno, seqno + tcplen, &(iphdr->dest), &(iphdr->src), tcphdr->dest, tcphdr->src); return ERR_OK; } } else if (flags & TCP_FIN) { /* - eighth, check the FIN bit: Remain in the TIME-WAIT state. Restart the 2 MSL time-wait timeout.*/ pcb->tmr = tcp_ticks; } if ((tcplen > 0)) { /* Acknowledge data, FIN or out-of-window SYN */ pcb->flags |= TF_ACK_NOW; return tcp_output(pcb); } return ERR_OK; } /** * Implements the TCP state machine. Called by tcp_input. In some * states tcp_receive() is called to receive data. The tcp_seg * argument will be freed by the caller (tcp_input()) unless the * recv_data pointer in the pcb is set. * * @param pcb the tcp_pcb for which a segment arrived * * @note the segment which arrived is saved in global variables, therefore only the pcb * involved is passed as a parameter to this function */ static err_t tcp_process(struct tcp_pcb *pcb) { struct tcp_seg *rseg; u8_t acceptable = 0; err_t err; err = ERR_OK; /* Process incoming RST segments. */ if (flags & TCP_RST) { /* First, determine if the reset is acceptable. */ if (pcb->state == SYN_SENT) { if (ackno == pcb->snd_nxt) { acceptable = 1; } } else { if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt+pcb->rcv_wnd)) { acceptable = 1; } } if (acceptable) { LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: Connection RESET\n")); LWIP_ASSERT("tcp_input: pcb->state != CLOSED", pcb->state != CLOSED); recv_flags |= TF_RESET; pcb->flags &= ~TF_ACK_DELAY; return ERR_RST; } else { LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: unacceptable reset seqno %"U32_F" rcv_nxt %"U32_F"\n", seqno, pcb->rcv_nxt)); LWIP_DEBUGF(TCP_DEBUG, ("tcp_process: unacceptable reset seqno %"U32_F" rcv_nxt %"U32_F"\n", seqno, pcb->rcv_nxt)); return ERR_OK; } } if ((flags & TCP_SYN) && (pcb->state != SYN_SENT && pcb->state != SYN_RCVD)) { /* Cope with new connection attempt after remote end crashed */ tcp_ack_now(pcb); return ERR_OK; } /* Update the PCB (in)activity timer. */ pcb->tmr = tcp_ticks; pcb->keep_cnt_sent = 0; tcp_parseopt(pcb); /* Do different things depending on the TCP state. */ switch (pcb->state) { case SYN_SENT: LWIP_DEBUGF(TCP_INPUT_DEBUG, ("SYN-SENT: ackno %"U32_F" pcb->snd_nxt %"U32_F" unacked %"U32_F"\n", ackno, pcb->snd_nxt, ntohl(pcb->unacked->tcphdr->seqno))); /* received SYN ACK with expected sequence number? */ if ((flags & TCP_ACK) && (flags & TCP_SYN) && ackno == ntohl(pcb->unacked->tcphdr->seqno) + 1) { pcb->snd_buf++; pcb->rcv_nxt = seqno + 1; pcb->rcv_ann_right_edge = pcb->rcv_nxt; pcb->lastack = ackno; pcb->snd_wnd = tcphdr->wnd; pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */ pcb->state = ESTABLISHED; #if TCP_CALCULATE_EFF_SEND_MSS pcb->mss = tcp_eff_send_mss(pcb->mss, &(pcb->remote_ip)); #endif /* TCP_CALCULATE_EFF_SEND_MSS */ /* Set ssthresh again after changing pcb->mss (already set in tcp_connect * but for the default value of pcb->mss) */ pcb->ssthresh = pcb->mss * 10; pcb->cwnd = ((pcb->cwnd == 1) ? (pcb->mss * 2) : pcb->mss); LWIP_ASSERT("pcb->snd_queuelen > 0", (pcb->snd_queuelen > 0)); --pcb->snd_queuelen; LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_process: SYN-SENT --queuelen %"U16_F"\n", (u16_t)pcb->snd_queuelen)); rseg = pcb->unacked; pcb->unacked = rseg->next; /* If there's nothing left to acknowledge, stop the retransmit timer, otherwise reset it to start again */ if(pcb->unacked == NULL) pcb->rtime = -1; else { pcb->rtime = 0; pcb->nrtx = 0; } tcp_seg_free(rseg); /* Call the user specified function to call when sucessfully * connected. */ TCP_EVENT_CONNECTED(pcb, ERR_OK, err); tcp_ack_now(pcb); } /* received ACK? possibly a half-open connection */ else if (flags & TCP_ACK) { /* send a RST to bring the other side in a non-synchronized state. */ tcp_rst(ackno, seqno + tcplen, &(iphdr->dest), &(iphdr->src), tcphdr->dest, tcphdr->src); } break; case SYN_RCVD: if (flags & TCP_ACK) { /* expected ACK number? */ if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt)) { u16_t old_cwnd; pcb->state = ESTABLISHED; LWIP_DEBUGF(TCP_DEBUG, ("TCP connection established %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); #if LWIP_CALLBACK_API LWIP_ASSERT("pcb->accept != NULL", pcb->accept != NULL); #endif /* Call the accept function. */ TCP_EVENT_ACCEPT(pcb, ERR_OK, err); if (err != ERR_OK) { /* If the accept function returns with an error, we abort * the connection. */ tcp_abort(pcb); return ERR_ABRT; } old_cwnd = pcb->cwnd; /* If there was any data contained within this ACK, * we'd better pass it on to the application as well. */ tcp_receive(pcb); /* Prevent ACK for SYN to generate a sent event */ if (pcb->acked != 0) { pcb->acked--; } pcb->cwnd = ((old_cwnd == 1) ? (pcb->mss * 2) : pcb->mss); if (recv_flags & TF_GOT_FIN) { tcp_ack_now(pcb); pcb->state = CLOSE_WAIT; } } /* incorrect ACK number */ else { /* send RST */ tcp_rst(ackno, seqno + tcplen, &(iphdr->dest), &(iphdr->src), tcphdr->dest, tcphdr->src); } } else if ((flags & TCP_SYN) && (seqno == pcb->rcv_nxt - 1)) { /* Looks like another copy of the SYN - retransmit our SYN-ACK */ tcp_rexmit(pcb); } break; case CLOSE_WAIT: /* FALLTHROUGH */ case ESTABLISHED: tcp_receive(pcb); if (recv_flags & TF_GOT_FIN) { /* passive close */ tcp_ack_now(pcb); pcb->state = CLOSE_WAIT; } break; case FIN_WAIT_1: tcp_receive(pcb); if (recv_flags & TF_GOT_FIN) { if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt)) { LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: FIN_WAIT_1 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); tcp_ack_now(pcb); tcp_pcb_purge(pcb); TCP_RMV(&tcp_active_pcbs, pcb); pcb->state = TIME_WAIT; TCP_REG(&tcp_tw_pcbs, pcb); } else { tcp_ack_now(pcb); pcb->state = CLOSING; } } else if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt)) { pcb->state = FIN_WAIT_2; } break; case FIN_WAIT_2: tcp_receive(pcb); if (recv_flags & TF_GOT_FIN) { LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: FIN_WAIT_2 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); tcp_ack_now(pcb); tcp_pcb_purge(pcb); TCP_RMV(&tcp_active_pcbs, pcb); pcb->state = TIME_WAIT; TCP_REG(&tcp_tw_pcbs, pcb); } break; case CLOSING: tcp_receive(pcb); if (flags & TCP_ACK && ackno == pcb->snd_nxt) { LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: CLOSING %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); tcp_pcb_purge(pcb); TCP_RMV(&tcp_active_pcbs, pcb); pcb->state = TIME_WAIT; TCP_REG(&tcp_tw_pcbs, pcb); } break; case LAST_ACK: tcp_receive(pcb); if (flags & TCP_ACK && ackno == pcb->snd_nxt) { LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: LAST_ACK %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); /* bugfix #21699: don't set pcb->state to CLOSED here or we risk leaking segments */ recv_flags |= TF_CLOSED; } break; default: break; } return ERR_OK; } #if TCP_QUEUE_OOSEQ /** * Insert segment into the list (segments covered with new one will be deleted) * * Called from tcp_receive() */ static void tcp_oos_insert_segment(struct tcp_seg *cseg, struct tcp_seg *next) { struct tcp_seg *old_seg; if (TCPH_FLAGS(cseg->tcphdr) & TCP_FIN) { /* received segment overlaps all following segments */ tcp_segs_free(next); next = NULL; } else { /* delete some following segments oos queue may have segments with FIN flag */ while (next && TCP_SEQ_GEQ((seqno + cseg->len), (next->tcphdr->seqno + next->len))) { /* cseg with FIN already processed */ if (TCPH_FLAGS(next->tcphdr) & TCP_FIN) { TCPH_FLAGS_SET(cseg->tcphdr, TCPH_FLAGS(cseg->tcphdr) | TCP_FIN); } old_seg = next; next = next->next; tcp_seg_free(old_seg); } if (next && TCP_SEQ_GT(seqno + cseg->len, next->tcphdr->seqno)) { /* We need to trim the incoming segment. */ cseg->len = (u16_t)(next->tcphdr->seqno - seqno); pbuf_realloc(cseg->p, cseg->len); } } cseg->next = next; } #endif /** * Called by tcp_process. Checks if the given segment is an ACK for outstanding * data, and if so frees the memory of the buffered data. Next, is places the * segment on any of the receive queues (pcb->recved or pcb->ooseq). If the segment * is buffered, the pbuf is referenced by pbuf_ref so that it will not be freed until * i it has been removed from the buffer. * * If the incoming segment constitutes an ACK for a segment that was used for RTT * estimation, the RTT is estimated here as well. * * Called from tcp_process(). */ static void tcp_receive(struct tcp_pcb *pcb) { struct tcp_seg *next; #if TCP_QUEUE_OOSEQ struct tcp_seg *prev, *cseg; #endif struct pbuf *p; s32_t off; s16_t m; u32_t right_wnd_edge; u16_t new_tot_len; int found_dupack = 0; if (flags & TCP_ACK) { right_wnd_edge = pcb->snd_wnd + pcb->snd_wl2; /* Update window. */ if (TCP_SEQ_LT(pcb->snd_wl1, seqno) || (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) || (pcb->snd_wl2 == ackno && tcphdr->wnd > pcb->snd_wnd)) { pcb->snd_wnd = tcphdr->wnd; pcb->snd_wl1 = seqno; pcb->snd_wl2 = ackno; if (pcb->snd_wnd > 0 && pcb->persist_backoff > 0) { pcb->persist_backoff = 0; } LWIP_DEBUGF(TCP_WND_DEBUG, ("tcp_receive: window update %"U16_F"\n", pcb->snd_wnd)); #if TCP_WND_DEBUG } else { if (pcb->snd_wnd != tcphdr->wnd) { LWIP_DEBUGF(TCP_WND_DEBUG, ("tcp_receive: no window update lastack %"U32_F" ackno %" U32_F" wl1 %"U32_F" seqno %"U32_F" wl2 %"U32_F"\n", pcb->lastack, ackno, pcb->snd_wl1, seqno, pcb->snd_wl2)); } #endif /* TCP_WND_DEBUG */ } /* (From Stevens TCP/IP Illustrated Vol II, p970.) Its only a * duplicate ack if: * 1) It doesn't ACK new data * 2) length of received packet is zero (i.e. no payload) * 3) the advertised window hasn't changed * 4) There is outstanding unacknowledged data (retransmission timer running) * 5) The ACK is == biggest ACK sequence number so far seen (snd_una) * * If it passes all five, should process as a dupack: * a) dupacks < 3: do nothing * b) dupacks == 3: fast retransmit * c) dupacks > 3: increase cwnd * * If it only passes 1-3, should reset dupack counter (and add to * stats, which we don't do in lwIP) * * If it only passes 1, should reset dupack counter * */ /* Clause 1 */ if (TCP_SEQ_LEQ(ackno, pcb->lastack)) { pcb->acked = 0; /* Clause 2 */ if (tcplen == 0) { /* Clause 3 */ if (pcb->snd_wl2 + pcb->snd_wnd == right_wnd_edge){ /* Clause 4 */ if (pcb->rtime >= 0) { /* Clause 5 */ if (pcb->lastack == ackno) { found_dupack = 1; if (pcb->dupacks + 1 > pcb->dupacks) ++pcb->dupacks; if (pcb->dupacks > 3) { /* Inflate the congestion window, but not if it means that the value overflows. */ if ((u16_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) { pcb->cwnd += pcb->mss; } } else if (pcb->dupacks == 3) { /* Do fast retransmit */ tcp_rexmit_fast(pcb); } } } } } /* If Clause (1) or more is true, but not a duplicate ack, reset * count of consecutive duplicate acks */ if (!found_dupack) { pcb->dupacks = 0; } } else if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt)){ /* We come here when the ACK acknowledges new data. */ /* Reset the "IN Fast Retransmit" flag, since we are no longer in fast retransmit. Also reset the congestion window to the slow start threshold. */ if (pcb->flags & TF_INFR) { pcb->flags &= ~TF_INFR; pcb->cwnd = pcb->ssthresh; } /* Reset the number of retransmissions. */ pcb->nrtx = 0; /* Reset the retransmission time-out. */ pcb->rto = (pcb->sa >> 3) + pcb->sv; /* Update the send buffer space. Diff between the two can never exceed 64K? */ pcb->acked = (u16_t)(ackno - pcb->lastack); pcb->snd_buf += pcb->acked; /* Reset the fast retransmit variables. */ pcb->dupacks = 0; pcb->lastack = ackno; /* Update the congestion control variables (cwnd and ssthresh). */ if (pcb->state >= ESTABLISHED) { if (pcb->cwnd < pcb->ssthresh) { if ((u16_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) { pcb->cwnd += pcb->mss; } LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_receive: slow start cwnd %"U16_F"\n", pcb->cwnd)); } else { u16_t new_cwnd = (pcb->cwnd + pcb->mss * pcb->mss / pcb->cwnd); if (new_cwnd > pcb->cwnd) { pcb->cwnd = new_cwnd; } LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_receive: congestion avoidance cwnd %"U16_F"\n", pcb->cwnd)); } } LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: ACK for %"U32_F", unacked->seqno %"U32_F":%"U32_F"\n", ackno, pcb->unacked != NULL? ntohl(pcb->unacked->tcphdr->seqno): 0, pcb->unacked != NULL? ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked): 0)); /* Remove segment from the unacknowledged list if the incoming ACK acknowlegdes them. */ while (pcb->unacked != NULL && TCP_SEQ_LEQ(ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked), ackno)) { LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %"U32_F":%"U32_F" from pcb->unacked\n", ntohl(pcb->unacked->tcphdr->seqno), ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked))); next = pcb->unacked; pcb->unacked = pcb->unacked->next; LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"U16_F" ... ", (u16_t)pcb->snd_queuelen)); LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= pbuf_clen(next->p))); /* Prevent ACK for FIN to generate a sent event */ if ((pcb->acked != 0) && ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0)) { pcb->acked--; } pcb->snd_queuelen -= pbuf_clen(next->p); tcp_seg_free(next); LWIP_DEBUGF(TCP_QLEN_DEBUG, ("%"U16_F" (after freeing unacked)\n", (u16_t)pcb->snd_queuelen)); if (pcb->snd_queuelen != 0) { LWIP_ASSERT("tcp_receive: valid queue length", pcb->unacked != NULL || pcb->unsent != NULL); } } /* If there's nothing left to acknowledge, stop the retransmit timer, otherwise reset it to start again */ if(pcb->unacked == NULL) pcb->rtime = -1; else pcb->rtime = 0; pcb->polltmr = 0; } else { /* Fix bug bug #21582: out of sequence ACK, didn't really ack anything */ pcb->acked = 0; } /* We go through the ->unsent list to see if any of the segments on the list are acknowledged by the ACK. This may seem strange since an "unsent" segment shouldn't be acked. The rationale is that lwIP puts all outstanding segments on the ->unsent list after a retransmission, so these segments may in fact have been sent once. */ while (pcb->unsent != NULL && TCP_SEQ_BETWEEN(ackno, ntohl(pcb->unsent->tcphdr->seqno) + TCP_TCPLEN(pcb->unsent), pcb->snd_nxt)) { LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %"U32_F":%"U32_F" from pcb->unsent\n", ntohl(pcb->unsent->tcphdr->seqno), ntohl(pcb->unsent->tcphdr->seqno) + TCP_TCPLEN(pcb->unsent))); next = pcb->unsent; pcb->unsent = pcb->unsent->next; LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"U16_F" ... ", (u16_t)pcb->snd_queuelen)); LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= pbuf_clen(next->p))); /* Prevent ACK for FIN to generate a sent event */ if ((pcb->acked != 0) && ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0)) { pcb->acked--; } pcb->snd_queuelen -= pbuf_clen(next->p); tcp_seg_free(next); LWIP_DEBUGF(TCP_QLEN_DEBUG, ("%"U16_F" (after freeing unsent)\n", (u16_t)pcb->snd_queuelen)); if (pcb->snd_queuelen != 0) { LWIP_ASSERT("tcp_receive: valid queue length", pcb->unacked != NULL || pcb->unsent != NULL); } } /* End of ACK for new data processing. */ LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: pcb->rttest %"U32_F" rtseq %"U32_F" ackno %"U32_F"\n", pcb->rttest, pcb->rtseq, ackno)); /* RTT estimation calculations. This is done by checking if the incoming segment acknowledges the segment we use to take a round-trip time measurement. */ if (pcb->rttest && TCP_SEQ_LT(pcb->rtseq, ackno)) { /* diff between this shouldn't exceed 32K since this are tcp timer ticks and a round-trip shouldn't be that long... */ m = (s16_t)(tcp_ticks - pcb->rttest); LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: experienced rtt %"U16_F" ticks (%"U16_F" msec).\n", m, m * TCP_SLOW_INTERVAL)); /* This is taken directly from VJs original code in his paper */ m = m - (pcb->sa >> 3); pcb->sa += m; if (m < 0) { m = -m; } m = m - (pcb->sv >> 2); pcb->sv += m; pcb->rto = (pcb->sa >> 3) + pcb->sv; LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: RTO %"U16_F" (%"U16_F" milliseconds)\n", pcb->rto, pcb->rto * TCP_SLOW_INTERVAL)); pcb->rttest = 0; } } /* If the incoming segment contains data, we must process it further. */ if (tcplen > 0) { /* This code basically does three things: +) If the incoming segment contains data that is the next in-sequence data, this data is passed to the application. This might involve trimming the first edge of the data. The rcv_nxt variable and the advertised window are adjusted. +) If the incoming segment has data that is above the next sequence number expected (->rcv_nxt), the segment is placed on the ->ooseq queue. This is done by finding the appropriate place in the ->ooseq queue (which is ordered by sequence number) and trim the segment in both ends if needed. An immediate ACK is sent to indicate that we received an out-of-sequence segment. +) Finally, we check if the first segment on the ->ooseq queue now is in sequence (i.e., if rcv_nxt >= ooseq->seqno). If rcv_nxt > ooseq->seqno, we must trim the first edge of the segment on ->ooseq before we adjust rcv_nxt. The data in the segments that are now on sequence are chained onto the incoming segment so that we only need to call the application once. */ /* First, we check if we must trim the first edge. We have to do this if the sequence number of the incoming segment is less than rcv_nxt, and the sequence number plus the length of the segment is larger than rcv_nxt. */ /* if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)){ if (TCP_SEQ_LT(pcb->rcv_nxt, seqno + tcplen)) {*/ if (TCP_SEQ_BETWEEN(pcb->rcv_nxt, seqno + 1, seqno + tcplen - 1)){ /* Trimming the first edge is done by pushing the payload pointer in the pbuf downwards. This is somewhat tricky since we do not want to discard the full contents of the pbuf up to the new starting point of the data since we have to keep the TCP header which is present in the first pbuf in the chain. What is done is really quite a nasty hack: the first pbuf in the pbuf chain is pointed to by inseg.p. Since we need to be able to deallocate the whole pbuf, we cannot change this inseg.p pointer to point to any of the later pbufs in the chain. Instead, we point the ->payload pointer in the first pbuf to data in one of the later pbufs. We also set the inseg.data pointer to point to the right place. This way, the ->p pointer will still point to the first pbuf, but the ->p->payload pointer will point to data in another pbuf. After we are done with adjusting the pbuf pointers we must adjust the ->data pointer in the seg and the segment length.*/ off = pcb->rcv_nxt - seqno; p = inseg.p; LWIP_ASSERT("inseg.p != NULL", inseg.p); LWIP_ASSERT("insane offset!", (off < 0x7fff)); if (inseg.p->len < off) { LWIP_ASSERT("pbuf too short!", (((s32_t)inseg.p->tot_len) >= off)); new_tot_len = (u16_t)(inseg.p->tot_len - off); while (p->len < off) { off -= p->len; /* KJM following line changed (with addition of new_tot_len var) to fix bug #9076 inseg.p->tot_len -= p->len; */ p->tot_len = new_tot_len; p->len = 0; p = p->next; } if(pbuf_header(p, (s16_t)-off)) { /* Do we need to cope with this failing? Assert for now */ LWIP_ASSERT("pbuf_header failed", 0); } } else { if(pbuf_header(inseg.p, (s16_t)-off)) { /* Do we need to cope with this failing? Assert for now */ LWIP_ASSERT("pbuf_header failed", 0); } } /* KJM following line changed to use p->payload rather than inseg->p->payload to fix bug #9076 */ inseg.dataptr = p->payload; inseg.len -= (u16_t)(pcb->rcv_nxt - seqno); inseg.tcphdr->seqno = seqno = pcb->rcv_nxt; } else { if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)){ /* the whole segment is < rcv_nxt */ /* must be a duplicate of a packet that has already been correctly handled */ LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: duplicate seqno %"U32_F"\n", seqno)); tcp_ack_now(pcb); } } /* The sequence number must be within the window (above rcv_nxt and below rcv_nxt + rcv_wnd) in order to be further processed. */ if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd - 1)){ if (pcb->rcv_nxt == seqno) { /* The incoming segment is the next in sequence. We check if we have to trim the end of the segment and update rcv_nxt and pass the data to the application. */ tcplen = TCP_TCPLEN(&inseg); if (tcplen > pcb->rcv_wnd) { LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: other end overran receive window" "seqno %"U32_F" len %"U32_F" right edge %"U32_F"\n", seqno, tcplen, pcb->rcv_nxt + pcb->rcv_wnd)); if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) { /* Must remove the FIN from the header as we're trimming * that byte of sequence-space from the packet */ TCPH_FLAGS_SET(inseg.tcphdr, TCPH_FLAGS(inseg.tcphdr) &~ TCP_FIN); } /* Adjust length of segment to fit in the window. */ inseg.len = pcb->rcv_wnd; if (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) { inseg.len -= 1; } pbuf_realloc(inseg.p, inseg.len); tcplen = TCP_TCPLEN(&inseg); LWIP_ASSERT("tcp_receive: segment not trimmed correctly to rcv_wnd\n", (seqno + tcplen) == (pcb->rcv_nxt + pcb->rcv_wnd)); } #if TCP_QUEUE_OOSEQ if (pcb->ooseq != NULL) { if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) { LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: received in-order FIN, binning ooseq queue\n")); /* Received in-order FIN means anything that was received * out of order must now have been received in-order, so * bin the ooseq queue * rcv_nxt * . |--ooseq--| * .==seg============|FIN */ while (pcb->ooseq != NULL) { struct tcp_seg *old_ooseq = pcb->ooseq; pcb->ooseq = pcb->ooseq->next; tcp_seg_free(old_ooseq); } } else { struct tcp_seg* next = pcb->ooseq; struct tcp_seg *old_seg; /* rcv_nxt * . |--ooseq--| * .==seg============| */ while (next && TCP_SEQ_GEQ(seqno + tcplen, next->tcphdr->seqno + next->len)) { /* inseg doesn't have FIN (already processed) */ if (TCPH_FLAGS(next->tcphdr) & TCP_FIN && (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) == 0) { TCPH_FLAGS_SET(inseg.tcphdr, TCPH_FLAGS(inseg.tcphdr) | TCP_FIN); tcplen = TCP_TCPLEN(&inseg); } old_seg = next; next = next->next; tcp_seg_free(old_seg); } /* rcv_nxt * . |--ooseq--| * .==seg============| */ if (next && TCP_SEQ_GT(seqno + tcplen, next->tcphdr->seqno)) { /* FIN in inseg already handled by dropping whole ooseq queue */ inseg.len = (u16_t)(pcb->ooseq->tcphdr->seqno - seqno); if (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) { inseg.len -= 1; } pbuf_realloc(inseg.p, inseg.len); tcplen = TCP_TCPLEN(&inseg); LWIP_ASSERT("tcp_receive: segment not trimmed correctly to ooseq queue\n", (seqno + tcplen) == pcb->ooseq->tcphdr->seqno); } pcb->ooseq = next; } } #endif /* TCP_QUEUE_OOSEQ */ pcb->rcv_nxt = seqno + tcplen; /* Update the receiver's (our) window. */ LWIP_ASSERT("tcp_receive: tcplen > rcv_wnd\n", pcb->rcv_wnd >= tcplen); pcb->rcv_wnd -= tcplen; tcp_update_rcv_ann_wnd(pcb); /* If there is data in the segment, we make preparations to pass this up to the application. The ->recv_data variable is used for holding the pbuf that goes to the application. The code for reassembling out-of-sequence data chains its data on this pbuf as well. If the segment was a FIN, we set the TF_GOT_FIN flag that will be used to indicate to the application that the remote side has closed its end of the connection. */ if (inseg.p->tot_len > 0) { recv_data = inseg.p; /* Since this pbuf now is the responsibility of the application, we delete our reference to it so that we won't (mistakingly) deallocate it. */ inseg.p = NULL; } if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) { LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: received FIN.\n")); recv_flags |= TF_GOT_FIN; } #if TCP_QUEUE_OOSEQ /* We now check if we have segments on the ->ooseq queue that is now in sequence. */ while (pcb->ooseq != NULL && pcb->ooseq->tcphdr->seqno == pcb->rcv_nxt) { cseg = pcb->ooseq; seqno = pcb->ooseq->tcphdr->seqno; pcb->rcv_nxt += TCP_TCPLEN(cseg); LWIP_ASSERT("tcp_receive: ooseq tcplen > rcv_wnd\n", pcb->rcv_wnd >= TCP_TCPLEN(cseg)); pcb->rcv_wnd -= TCP_TCPLEN(cseg); tcp_update_rcv_ann_wnd(pcb); if (cseg->p->tot_len > 0) { /* Chain this pbuf onto the pbuf that we will pass to the application. */ if (recv_data) { pbuf_cat(recv_data, cseg->p); } else { recv_data = cseg->p; } cseg->p = NULL; } if (TCPH_FLAGS(cseg->tcphdr) & TCP_FIN) { LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: dequeued FIN.\n")); recv_flags |= TF_GOT_FIN; if (pcb->state == ESTABLISHED) { /* force passive close or we can move to active close */ pcb->state = CLOSE_WAIT; } } pcb->ooseq = cseg->next; tcp_seg_free(cseg); } #endif /* TCP_QUEUE_OOSEQ */ /* Acknowledge the segment(s). */ tcp_ack(pcb); } else { /* We get here if the incoming segment is out-of-sequence. */ tcp_send_empty_ack(pcb); #if TCP_QUEUE_OOSEQ /* We queue the segment on the ->ooseq queue. */ if (pcb->ooseq == NULL) { pcb->ooseq = tcp_seg_copy(&inseg); } else { /* If the queue is not empty, we walk through the queue and try to find a place where the sequence number of the incoming segment is between the sequence numbers of the previous and the next segment on the ->ooseq queue. That is the place where we put the incoming segment. If needed, we trim the second edges of the previous and the incoming segment so that it will fit into the sequence. If the incoming segment has the same sequence number as a segment on the ->ooseq queue, we discard the segment that contains less data. */ prev = NULL; for(next = pcb->ooseq; next != NULL; next = next->next) { if (seqno == next->tcphdr->seqno) { /* The sequence number of the incoming segment is the same as the sequence number of the segment on ->ooseq. We check the lengths to see which one to discard. */ if (inseg.len > next->len) { /* The incoming segment is larger than the old segment. We replace some segments with the new one. */ cseg = tcp_seg_copy(&inseg); if (cseg != NULL) { if (prev != NULL) { prev->next = cseg; } else { pcb->ooseq = cseg; } tcp_oos_insert_segment(cseg, next); } break; } else { /* Either the lenghts are the same or the incoming segment was smaller than the old one; in either case, we ditch the incoming segment. */ break; } } else { if (prev == NULL) { if (TCP_SEQ_LT(seqno, next->tcphdr->seqno)) { /* The sequence number of the incoming segment is lower than the sequence number of the first segment on the queue. We put the incoming segment first on the queue. */ cseg = tcp_seg_copy(&inseg); if (cseg != NULL) { pcb->ooseq = cseg; tcp_oos_insert_segment(cseg, next); } break; } } else { /*if (TCP_SEQ_LT(prev->tcphdr->seqno, seqno) && TCP_SEQ_LT(seqno, next->tcphdr->seqno)) {*/ if (TCP_SEQ_BETWEEN(seqno, prev->tcphdr->seqno+1, next->tcphdr->seqno-1)) { /* The sequence number of the incoming segment is in between the sequence numbers of the previous and the next segment on ->ooseq. We trim trim the previous segment, delete next segments that included in received segment and trim received, if needed. */ cseg = tcp_seg_copy(&inseg); if (cseg != NULL) { if (TCP_SEQ_GT(prev->tcphdr->seqno + prev->len, seqno)) { /* We need to trim the prev segment. */ prev->len = (u16_t)(seqno - prev->tcphdr->seqno); pbuf_realloc(prev->p, prev->len); } prev->next = cseg; tcp_oos_insert_segment(cseg, next); } break; } } /* If the "next" segment is the last segment on the ooseq queue, we add the incoming segment to the end of the list. */ if (next->next == NULL && TCP_SEQ_GT(seqno, next->tcphdr->seqno)) { if (TCPH_FLAGS(next->tcphdr) & TCP_FIN) { /* segment "next" already contains all data */ break; } next->next = tcp_seg_copy(&inseg); if (next->next != NULL) { if (TCP_SEQ_GT(next->tcphdr->seqno + next->len, seqno)) { /* We need to trim the last segment. */ next->len = (u16_t)(seqno - next->tcphdr->seqno); pbuf_realloc(next->p, next->len); } } break; } } prev = next; } } #endif /* TCP_QUEUE_OOSEQ */ } } else { /* The incoming segment is not withing the window. */ tcp_send_empty_ack(pcb); } } else { /* Segments with length 0 is taken care of here. Segments that fall out of the window are ACKed. */ /*if (TCP_SEQ_GT(pcb->rcv_nxt, seqno) || TCP_SEQ_GEQ(seqno, pcb->rcv_nxt + pcb->rcv_wnd)) {*/ if(!TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd-1)){ tcp_ack_now(pcb); } } } /** * Parses the options contained in the incoming segment. * * Called from tcp_listen_input() and tcp_process(). * Currently, only the MSS option is supported! * * @param pcb the tcp_pcb for which a segment arrived */ static void tcp_parseopt(struct tcp_pcb *pcb) { u16_t c, max_c; u16_t mss; u8_t *opts, opt; #if LWIP_TCP_TIMESTAMPS u32_t tsval; #endif opts = (u8_t *)tcphdr + TCP_HLEN; /* Parse the TCP MSS option, if present. */ if(TCPH_HDRLEN(tcphdr) > 0x5) { max_c = (TCPH_HDRLEN(tcphdr) - 5) << 2; for (c = 0; c < max_c; ) { opt = opts[c]; switch (opt) { case 0x00: /* End of options. */ LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: EOL\n")); return; case 0x01: /* NOP option. */ ++c; LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: NOP\n")); break; case 0x02: LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: MSS\n")); if (opts[c + 1] != 0x04 || c + 0x04 > max_c) { /* Bad length */ LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n")); return; } /* An MSS option with the right option length. */ mss = (opts[c + 2] << 8) | opts[c + 3]; /* Limit the mss to the configured TCP_MSS and prevent division by zero */ pcb->mss = ((mss > TCP_MSS) || (mss == 0)) ? TCP_MSS : mss; /* Advance to next option */ c += 0x04; break; #if LWIP_TCP_TIMESTAMPS case 0x08: LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: TS\n")); if (opts[c + 1] != 0x0A || c + 0x0A > max_c) { /* Bad length */ LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n")); return; } /* TCP timestamp option with valid length */ tsval = (opts[c+2]) | (opts[c+3] << 8) | (opts[c+4] << 16) | (opts[c+5] << 24); if (flags & TCP_SYN) { pcb->ts_recent = ntohl(tsval); pcb->flags |= TF_TIMESTAMP; } else if (TCP_SEQ_BETWEEN(pcb->ts_lastacksent, seqno, seqno+tcplen)) { pcb->ts_recent = ntohl(tsval); } /* Advance to next option */ c += 0x0A; break; #endif default: LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: other\n")); if (opts[c + 1] == 0) { LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n")); /* If the length field is zero, the options are malformed and we don't process them further. */ return; } /* All other options have a length field, so that we easily can skip past them. */ c += opts[c + 1]; } } } } #endif /* LWIP_TCP */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/tcp_out.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * Transmission Control Protocol, outgoing traffic * * The output functions of TCP. * */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #include "lwip/opt.h" #if LWIP_TCP /* don't build if not configured for use in lwipopts.h */ #include "lwip/tcp.h" #include "lwip/def.h" #include "lwip/mem.h" #include "lwip/memp.h" #include "lwip/sys.h" #include "lwip/ip_addr.h" #include "lwip/netif.h" #include "lwip/inet.h" #include "lwip/inet_chksum.h" #include "lwip/stats.h" #include "lwip/snmp.h" #include #define _TEST_HD_ /* Forward declarations.*/ static void tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb); static struct tcp_hdr * tcp_output_set_header(struct tcp_pcb *pcb, struct pbuf *p, int optlen, u32_t seqno_be /* already in network byte order */) { struct tcp_hdr *tcphdr = p->payload; tcphdr->src = htons(pcb->local_port); tcphdr->dest = htons(pcb->remote_port); tcphdr->seqno = seqno_be; tcphdr->ackno = htonl(pcb->rcv_nxt); TCPH_FLAGS_SET(tcphdr, TCP_ACK); tcphdr->wnd = htons(pcb->rcv_ann_wnd); tcphdr->urgp = 0; TCPH_HDRLEN_SET(tcphdr, (5 + optlen / 4)); tcphdr->chksum = 0; /* If we're sending a packet, update the announced right window edge */ pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd; return tcphdr; } /** * Called by tcp_close() to send a segment including flags but not data. * * @param pcb the tcp_pcb over which to send a segment * @param flags the flags to set in the segment header * @return ERR_OK if sent, another err_t otherwise */ err_t tcp_send_ctrl(struct tcp_pcb *pcb, u8_t flags) { /* no data, no length, flags, copy=1, no optdata */ return tcp_enqueue(pcb, NULL, 0, flags, TCP_WRITE_FLAG_COPY, 0); } /** * Write data for sending (but does not send it immediately). * * It waits in the expectation of more data being sent soon (as * it can send them more efficiently by combining them together). * To prompt the system to send data now, call tcp_output() after * calling tcp_write(). * * @param pcb Protocol control block of the TCP connection to enqueue data for. * @param data pointer to the data to send * @param len length (in bytes) of the data to send * @param apiflags combination of following flags : * - TCP_WRITE_FLAG_COPY (0x01) data will be copied into memory belonging to the stack * - TCP_WRITE_FLAG_MORE (0x02) for TCP connection, PSH flag will be set on last segment sent, * @return ERR_OK if enqueued, another err_t on error * * @see tcp_write() */ err_t tcp_write(struct tcp_pcb *pcb, const void *data, u16_t len, u8_t apiflags) { LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_write(pcb=%p, data=%p, len=%"U16_F", apiflags=%"U16_F")\n", (void *)pcb, data, len, (u16_t)apiflags)); /* connection is in valid state for data transmission? */ if (pcb->state == ESTABLISHED || pcb->state == CLOSE_WAIT || pcb->state == SYN_SENT || pcb->state == SYN_RCVD) { if (len > 0) { #if LWIP_TCP_TIMESTAMPS return tcp_enqueue(pcb, (void *)data, len, 0, apiflags, pcb->flags & TF_TIMESTAMP ? TF_SEG_OPTS_TS : 0); #else return tcp_enqueue(pcb, (void *)data, len, 0, apiflags, 0); #endif } return ERR_OK; } else { LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_STATE | LWIP_DBG_LEVEL_SEVERE, ("tcp_write() called in invalid state\n")); return ERR_CONN; } } /** * Enqueue data and/or TCP options for transmission * * Called by tcp_connect(), tcp_listen_input(), tcp_send_ctrl() and tcp_write(). * * @param pcb Protocol control block for the TCP connection to enqueue data for. * @param arg Pointer to the data to be enqueued for sending. * @param len Data length in bytes * @param flags tcp header flags to set in the outgoing segment * @param apiflags combination of following flags : * - TCP_WRITE_FLAG_COPY (0x01) data will be copied into memory belonging to the stack * - TCP_WRITE_FLAG_MORE (0x02) for TCP connection, PSH flag will be set on last segment sent, * @param optflags options to include in segment later on (see definition of struct tcp_seg) */ err_t tcp_enqueue(struct tcp_pcb *pcb, void *arg, u16_t len, u8_t flags, u8_t apiflags, u8_t optflags) { struct pbuf *p; struct tcp_seg *seg, *useg, *queue; u32_t seqno; u16_t left, seglen; void *ptr; u16_t queuelen; u8_t optlen; LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_enqueue(pcb=%p, arg=%p, len=%"U16_F", flags=%"X16_F", apiflags=%"U16_F")\n", (void *)pcb, arg, len, (u16_t)flags, (u16_t)apiflags)); LWIP_ERROR("tcp_enqueue: packet needs payload, options, or SYN/FIN (programmer violates API)", ((len != 0) || (optflags != 0) || ((flags & (TCP_SYN | TCP_FIN)) != 0)), return ERR_ARG;); LWIP_ERROR("tcp_enqueue: len != 0 || arg == NULL (programmer violates API)", ((len != 0) || (arg == NULL)), return ERR_ARG;); /* fail on too much data */ if (len > pcb->snd_buf) { LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_WARNING, ("tcp_enqueue: too much data (len=%"U16_F" > snd_buf=%"U16_F")\n", len, pcb->snd_buf)); pcb->flags |= TF_NAGLEMEMERR; return ERR_MEM; } left = len; ptr = arg; optlen = LWIP_TCP_OPT_LENGTH(optflags); /* seqno will be the sequence number of the first segment enqueued * by the call to this function. */ seqno = pcb->snd_lbb; LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_enqueue: queuelen: %"U16_F"\n", (u16_t)pcb->snd_queuelen)); /* If total number of pbufs on the unsent/unacked queues exceeds the * configured maximum, return an error */ queuelen = pcb->snd_queuelen; /* check for configured max queuelen and possible overflow */ if ((queuelen >= TCP_SND_QUEUELEN) || (queuelen > TCP_SNDQUEUELEN_OVERFLOW)) { LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_WARNING, ("tcp_enqueue: too long queue %"U16_F" (max %"U16_F")\n", queuelen, TCP_SND_QUEUELEN)); TCP_STATS_INC(tcp.memerr); pcb->flags |= TF_NAGLEMEMERR; return ERR_MEM; } if (queuelen != 0) { LWIP_ASSERT("tcp_enqueue: pbufs on queue => at least one queue non-empty", pcb->unacked != NULL || pcb->unsent != NULL); } else { LWIP_ASSERT("tcp_enqueue: no pbufs on queue => both queues empty", pcb->unacked == NULL && pcb->unsent == NULL); } /* First, break up the data into segments and tuck them together in * the local "queue" variable. */ useg = queue = seg = NULL; seglen = 0; while (queue == NULL || left > 0) { /* The segment length (including options) should be at most the MSS */ seglen = left > (pcb->mss - optlen) ? (pcb->mss - optlen) : left; /* Allocate memory for tcp_seg, and fill in fields. */ seg = memp_malloc(MEMP_TCP_SEG); if (seg == NULL) { LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_enqueue: could not allocate memory for tcp_seg\n")); goto memerr; } seg->next = NULL; seg->p = NULL; /* first segment of to-be-queued data? */ if (queue == NULL) { queue = seg; } /* subsequent segments of to-be-queued data */ else { /* Attach the segment to the end of the queued segments */ LWIP_ASSERT("useg != NULL", useg != NULL); useg->next = seg; } /* remember last segment of to-be-queued data for next iteration */ useg = seg; /* If copy is set, memory should be allocated * and data copied into pbuf, otherwise data comes from * ROM or other static memory, and need not be copied. */ if (apiflags & TCP_WRITE_FLAG_COPY) { if ((seg->p = pbuf_alloc(PBUF_TRANSPORT, seglen + optlen, PBUF_RAM)) == NULL) { LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_enqueue : could not allocate memory for pbuf copy size %"U16_F"\n", seglen)); goto memerr; } LWIP_ASSERT("check that first pbuf can hold the complete seglen", (seg->p->len >= seglen + optlen)); queuelen += pbuf_clen(seg->p); if (arg != NULL) { MEMCPY((char *)seg->p->payload + optlen, ptr, seglen); } seg->dataptr = seg->p->payload; } /* do not copy data */ else { /* First, allocate a pbuf for the headers. */ if ((seg->p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) { LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_enqueue: could not allocate memory for header pbuf\n")); goto memerr; } queuelen += pbuf_clen(seg->p); /* Second, allocate a pbuf for holding the data. * since the referenced data is available at least until it is sent out on the * link (as it has to be ACKed by the remote party) we can safely use PBUF_ROM * instead of PBUF_REF here. */ if (left > 0) { if ((p = pbuf_alloc(PBUF_RAW, seglen, PBUF_ROM)) == NULL) { /* If allocation fails, we have to deallocate the header pbuf as well. */ pbuf_free(seg->p); seg->p = NULL; LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_enqueue: could not allocate memory for zero-copy pbuf\n")); goto memerr; } ++queuelen; /* reference the non-volatile payload data */ p->payload = ptr; seg->dataptr = ptr; /* Concatenate the headers and data pbufs together. */ pbuf_cat(seg->p/*header*/, p/*data*/); p = NULL; } } /* Now that there are more segments queued, we check again if the length of the queue exceeds the configured maximum or overflows. */ if ((queuelen > TCP_SND_QUEUELEN) || (queuelen > TCP_SNDQUEUELEN_OVERFLOW)) { LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_enqueue: queue too long %"U16_F" (%"U16_F")\n", queuelen, TCP_SND_QUEUELEN)); goto memerr; } seg->len = seglen; /* build TCP header */ if (pbuf_header(seg->p, TCP_HLEN)) { LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_enqueue: no room for TCP header in pbuf.\n")); TCP_STATS_INC(tcp.err); goto memerr; } seg->tcphdr = seg->p->payload; seg->tcphdr->src = htons(pcb->local_port); seg->tcphdr->dest = htons(pcb->remote_port); seg->tcphdr->seqno = htonl(seqno); seg->tcphdr->urgp = 0; TCPH_FLAGS_SET(seg->tcphdr, flags); /* don't fill in tcphdr->ackno and tcphdr->wnd until later */ seg->flags = optflags; /* Set the length of the header */ TCPH_HDRLEN_SET(seg->tcphdr, (5 + optlen / 4)); LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_TRACE, ("tcp_enqueue: queueing %"U32_F":%"U32_F" (0x%"X16_F")\n", ntohl(seg->tcphdr->seqno), ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg), (u16_t)flags)); left -= seglen; seqno += seglen; ptr = (void *)((u8_t *)ptr + seglen); } /* Now that the data to be enqueued has been broken up into TCP segments in the queue variable, we add them to the end of the pcb->unsent queue. */ if (pcb->unsent == NULL) { useg = NULL; } else { for (useg = pcb->unsent; useg->next != NULL; useg = useg->next); } /* { useg is last segment on the unsent queue, NULL if list is empty } */ /* If there is room in the last pbuf on the unsent queue, chain the first pbuf on the queue together with that. */ if (useg != NULL && TCP_TCPLEN(useg) != 0 && !(TCPH_FLAGS(useg->tcphdr) & (TCP_SYN | TCP_FIN)) && (!(flags & (TCP_SYN | TCP_FIN)) || (flags == TCP_FIN)) && /* fit within max seg size */ (useg->len + queue->len <= pcb->mss) && /* only concatenate segments with the same options */ (useg->flags == queue->flags) && /* segments are consecutive */ (ntohl(useg->tcphdr->seqno) + useg->len == ntohl(queue->tcphdr->seqno)) ) { /* Remove TCP header from first segment of our to-be-queued list */ if(pbuf_header(queue->p, -(TCP_HLEN + optlen))) { /* Can we cope with this failing? Just assert for now */ LWIP_ASSERT("pbuf_header failed\n", 0); TCP_STATS_INC(tcp.err); goto memerr; } if (queue->p->len == 0) { /* free the first (header-only) pbuf if it is now empty (contained only headers) */ struct pbuf *old_q = queue->p; queue->p = queue->p->next; old_q->next = NULL; queuelen--; pbuf_free(old_q); } if (flags & TCP_FIN) { /* the new segment contains only FIN, no data -> put the FIN into the last segment */ LWIP_ASSERT("FIN enqueued together with data", queue->p == NULL && queue->len == 0); TCPH_SET_FLAG(useg->tcphdr, TCP_FIN); } else { LWIP_ASSERT("zero-length pbuf", (queue->p != NULL) && (queue->p->len > 0)); pbuf_cat(useg->p, queue->p); useg->len += queue->len; useg->next = queue->next; } LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("tcp_enqueue: chaining segments, new len %"U16_F"\n", useg->len)); if (seg == queue) { seg = useg; seglen = useg->len; } memp_free(MEMP_TCP_SEG, queue); } else { /* empty list */ if (useg == NULL) { /* initialize list with this segment */ pcb->unsent = queue; } /* enqueue segment */ else { useg->next = queue; } } if ((flags & TCP_SYN) || (flags & TCP_FIN)) { ++len; } if (flags & TCP_FIN) { pcb->flags |= TF_FIN; } pcb->snd_lbb += len; pcb->snd_buf -= len; /* update number of segments on the queues */ pcb->snd_queuelen = queuelen; LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_enqueue: %"S16_F" (after enqueued)\n", pcb->snd_queuelen)); if (pcb->snd_queuelen != 0) { LWIP_ASSERT("tcp_enqueue: valid queue length", pcb->unacked != NULL || pcb->unsent != NULL); } /* Set the PSH flag in the last segment that we enqueued, but only if the segment has data (indicated by seglen > 0). */ if (seg != NULL && seglen > 0 && seg->tcphdr != NULL && ((apiflags & TCP_WRITE_FLAG_MORE)==0)) { TCPH_SET_FLAG(seg->tcphdr, TCP_PSH); } return ERR_OK; memerr: pcb->flags |= TF_NAGLEMEMERR; TCP_STATS_INC(tcp.memerr); if (queue != NULL) { tcp_segs_free(queue); } if (pcb->snd_queuelen != 0) { LWIP_ASSERT("tcp_enqueue: valid queue length", pcb->unacked != NULL || pcb->unsent != NULL); } LWIP_DEBUGF(TCP_QLEN_DEBUG | LWIP_DBG_STATE, ("tcp_enqueue: %"S16_F" (with mem err)\n", pcb->snd_queuelen)); return ERR_MEM; } #if LWIP_TCP_TIMESTAMPS /* Build a timestamp option (12 bytes long) at the specified options pointer) * * @param pcb tcp_pcb * @param opts option pointer where to store the timestamp option */ static void tcp_build_timestamp_option(struct tcp_pcb *pcb, u32_t *opts) { /* Pad with two NOP options to make everything nicely aligned */ opts[0] = htonl(0x0101080A); opts[1] = htonl(sys_now()); opts[2] = htonl(pcb->ts_recent); } #endif /** Send an ACK without data. * * @param pcb Protocol control block for the TCP connection to send the ACK */ err_t tcp_send_empty_ack(struct tcp_pcb *pcb) { struct pbuf *p; struct tcp_hdr *tcphdr; u8_t optlen = 0; #if LWIP_TCP_TIMESTAMPS if (pcb->flags & TF_TIMESTAMP) { optlen = LWIP_TCP_OPT_LENGTH(TF_SEG_OPTS_TS); } #endif p = pbuf_alloc(PBUF_IP, TCP_HLEN + optlen, PBUF_RAM); if (p == NULL) { LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: (ACK) could not allocate pbuf\n")); return ERR_BUF; } LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: sending ACK for %"U32_F"\n", pcb->rcv_nxt)); /* remove ACK flags from the PCB, as we send an empty ACK now */ pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW); tcphdr = tcp_output_set_header(pcb, p, optlen, htonl(pcb->snd_nxt)); /* NB. MSS option is only sent on SYNs, so ignore it here */ #if LWIP_TCP_TIMESTAMPS pcb->ts_lastacksent = pcb->rcv_nxt; if (pcb->flags & TF_TIMESTAMP) { tcp_build_timestamp_option(pcb, (u32_t *)(tcphdr + 1)); } #endif #if CHECKSUM_GEN_TCP tcphdr->chksum = inet_chksum_pseudo(p, &(pcb->local_ip), &(pcb->remote_ip), IP_PROTO_TCP, p->tot_len); #endif #if LWIP_NETIF_HWADDRHINT ip_output_hinted(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos, IP_PROTO_TCP, &(pcb->addr_hint)); #else /* LWIP_NETIF_HWADDRHINT*/ ip_output(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos, IP_PROTO_TCP); #endif /* LWIP_NETIF_HWADDRHINT*/ pbuf_free(p); return ERR_OK; } /** * Find out what we can send and send it * * @param pcb Protocol control block for the TCP connection to send data * @return ERR_OK if data has been sent or nothing to send * another err_t on error */ err_t tcp_output(struct tcp_pcb *pcb) { struct tcp_seg *seg, *useg; u32_t wnd, snd_nxt; #if TCP_CWND_DEBUG s16_t i = 0; #endif /* TCP_CWND_DEBUG */ /* First, check if we are invoked by the TCP input processing code. If so, we do not output anything. Instead, we rely on the input processing code to call us when input processing is done with. */ if (tcp_input_pcb == pcb) { return ERR_OK; } wnd = LWIP_MIN(pcb->snd_wnd, pcb->cwnd); seg = pcb->unsent; /* If the TF_ACK_NOW flag is set and no data will be sent (either * because the ->unsent queue is empty or because the window does * not allow it), construct an empty ACK segment and send it. * * If data is to be sent, we will just piggyback the ACK (see below). */ if (pcb->flags & TF_ACK_NOW && (seg == NULL || ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd)) { return tcp_send_empty_ack(pcb); } /* useg should point to last segment on unacked queue */ useg = pcb->unacked; if (useg != NULL) { for (; useg->next != NULL; useg = useg->next); } #if TCP_OUTPUT_DEBUG if (seg == NULL) { LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: nothing to send (%p)\n", (void*)pcb->unsent)); } #endif /* TCP_OUTPUT_DEBUG */ #if TCP_CWND_DEBUG if (seg == NULL) { LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_output: snd_wnd %"U16_F ", cwnd %"U16_F", wnd %"U32_F ", seg == NULL, ack %"U32_F"\n", pcb->snd_wnd, pcb->cwnd, wnd, pcb->lastack)); } else { LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_output: snd_wnd %"U16_F", cwnd %"U16_F", wnd %"U32_F ", effwnd %"U32_F", seq %"U32_F", ack %"U32_F"\n", pcb->snd_wnd, pcb->cwnd, wnd, ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len, ntohl(seg->tcphdr->seqno), pcb->lastack)); } #endif /* TCP_CWND_DEBUG */ /* data available and window allows it to be sent? */ while (seg != NULL && ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len <= wnd) { LWIP_ASSERT("RST not expected here!", (TCPH_FLAGS(seg->tcphdr) & TCP_RST) == 0); /* Stop sending if the nagle algorithm would prevent it * Don't stop: * - if tcp_enqueue had a memory error before (prevent delayed ACK timeout) or * - if FIN was already enqueued for this PCB (SYN is always alone in a segment - * either seg->next != NULL or pcb->unacked == NULL; * RST is no sent using tcp_enqueue/tcp_output. */ if((tcp_do_output_nagle(pcb) == 0) && ((pcb->flags & (TF_NAGLEMEMERR | TF_FIN)) == 0)){ break; } #if TCP_CWND_DEBUG LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_output: snd_wnd %"U16_F", cwnd %"U16_F", wnd %"U32_F", effwnd %"U32_F", seq %"U32_F", ack %"U32_F", i %"S16_F"\n", pcb->snd_wnd, pcb->cwnd, wnd, ntohl(seg->tcphdr->seqno) + seg->len - pcb->lastack, ntohl(seg->tcphdr->seqno), pcb->lastack, i)); ++i; #endif /* TCP_CWND_DEBUG */ pcb->unsent = seg->next; if (pcb->state != SYN_SENT) { TCPH_SET_FLAG(seg->tcphdr, TCP_ACK); pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW); } tcp_output_segment(seg, pcb); snd_nxt = ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg); if (TCP_SEQ_LT(pcb->snd_nxt, snd_nxt)) { pcb->snd_nxt = snd_nxt; } /* put segment on unacknowledged list if length > 0 */ if (TCP_TCPLEN(seg) > 0) { seg->next = NULL; /* unacked list is empty? */ if (pcb->unacked == NULL) { pcb->unacked = seg; useg = seg; /* unacked list is not empty? */ } else { /* In the case of fast retransmit, the packet should not go to the tail * of the unacked queue, but rather somewhere before it. We need to check for * this case. -STJ Jul 27, 2004 */ if (TCP_SEQ_LT(ntohl(seg->tcphdr->seqno), ntohl(useg->tcphdr->seqno))){ /* add segment to before tail of unacked list, keeping the list sorted */ struct tcp_seg **cur_seg = &(pcb->unacked); while (*cur_seg && TCP_SEQ_LT(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) { cur_seg = &((*cur_seg)->next ); } seg->next = (*cur_seg); (*cur_seg) = seg; } else { /* add segment to tail of unacked list */ useg->next = seg; useg = useg->next; } } /* do not queue empty segments on the unacked list */ } else { tcp_seg_free(seg); } seg = pcb->unsent; } if (seg != NULL && pcb->persist_backoff == 0 && ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > pcb->snd_wnd) { /* prepare for persist timer */ pcb->persist_cnt = 0; pcb->persist_backoff = 1; } pcb->flags &= ~TF_NAGLEMEMERR; return ERR_OK; } /** * Called by tcp_output() to actually send a TCP segment over IP. * * @param seg the tcp_seg to send * @param pcb the tcp_pcb for the TCP connection used to send the segment */ static void tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb) { u16_t len; struct netif *netif; u32_t *opts; /** @bug Exclude retransmitted segments from this count. */ snmp_inc_tcpoutsegs(); /* The TCP header has already been constructed, but the ackno and wnd fields remain. */ seg->tcphdr->ackno = htonl(pcb->rcv_nxt); /* advertise our receive window size in this TCP segment */ seg->tcphdr->wnd = htons(pcb->rcv_ann_wnd); pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd; /* Add any requested options. NB MSS option is only set on SYN packets, so ignore it here */ opts = (u32_t *)(seg->tcphdr + 1); if (seg->flags & TF_SEG_OPTS_MSS) { TCP_BUILD_MSS_OPTION(*opts); opts += 1; } #if LWIP_TCP_TIMESTAMPS pcb->ts_lastacksent = pcb->rcv_nxt; if (seg->flags & TF_SEG_OPTS_TS) { tcp_build_timestamp_option(pcb, opts); opts += 3; } #endif #ifdef _TEST_HD_ /* ANGR: set rtime this _before_ checking ip_route(). Otherwise TCP_SYN will * not be retransmitted in case the interface was down and tcp_connect() * will not return any error. Since we still want the err_cb() (or maybe * the wifi link comes up), make sure that we fulfill the retransmissions in * tcp_slowtmr() */ /* Set retransmission timer running if it is not currently enabled */ if(pcb->rtime == -1) pcb->rtime = 0; #endif /* If we don't have a local IP address, we get one by calling ip_route(). */ if (ip_addr_isany(&(pcb->local_ip))) { netif = ip_route(&(pcb->remote_ip)); if (netif == NULL) { return; } ip_addr_set(&(pcb->local_ip), &(netif->ip_addr)); } #ifndef _TEST_HD_ //Set retransmission timer running if it is not currently enabled if(pcb->rtime == -1) pcb->rtime = 0; #endif if (pcb->rttest == 0) { pcb->rttest = tcp_ticks; pcb->rtseq = ntohl(seg->tcphdr->seqno); LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_output_segment: rtseq %"U32_F"\n", pcb->rtseq)); } LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output_segment: %"U32_F":%"U32_F"\n", htonl(seg->tcphdr->seqno), htonl(seg->tcphdr->seqno) + seg->len)); len = (u16_t)((u8_t *)seg->tcphdr - (u8_t *)seg->p->payload); seg->p->len -= len; seg->p->tot_len -= len; seg->p->payload = seg->tcphdr; seg->tcphdr->chksum = 0; #if CHECKSUM_GEN_TCP seg->tcphdr->chksum = inet_chksum_pseudo(seg->p, &(pcb->local_ip), &(pcb->remote_ip), IP_PROTO_TCP, seg->p->tot_len); #endif TCP_STATS_INC(tcp.xmit); #if LWIP_NETIF_HWADDRHINT ip_output_hinted(seg->p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos, IP_PROTO_TCP, &(pcb->addr_hint)); #else /* LWIP_NETIF_HWADDRHINT*/ ip_output(seg->p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos, IP_PROTO_TCP); #endif /* LWIP_NETIF_HWADDRHINT*/ } /** * Send a TCP RESET packet (empty segment with RST flag set) either to * abort a connection or to show that there is no matching local connection * for a received segment. * * Called by tcp_abort() (to abort a local connection), tcp_input() (if no * matching local pcb was found), tcp_listen_input() (if incoming segment * has ACK flag set) and tcp_process() (received segment in the wrong state) * * Since a RST segment is in most cases not sent for an active connection, * tcp_rst() has a number of arguments that are taken from a tcp_pcb for * most other segment output functions. * * @param seqno the sequence number to use for the outgoing segment * @param ackno the acknowledge number to use for the outgoing segment * @param local_ip the local IP address to send the segment from * @param remote_ip the remote IP address to send the segment to * @param local_port the local TCP port to send the segment from * @param remote_port the remote TCP port to send the segment to */ void tcp_rst(u32_t seqno, u32_t ackno, struct ip_addr *local_ip, struct ip_addr *remote_ip, u16_t local_port, u16_t remote_port) { struct pbuf *p; struct tcp_hdr *tcphdr; p = pbuf_alloc(PBUF_IP, TCP_HLEN, PBUF_RAM); if (p == NULL) { LWIP_DEBUGF(TCP_DEBUG, ("tcp_rst: could not allocate memory for pbuf\n")); return; } LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr", (p->len >= sizeof(struct tcp_hdr))); tcphdr = p->payload; tcphdr->src = htons(local_port); tcphdr->dest = htons(remote_port); tcphdr->seqno = htonl(seqno); tcphdr->ackno = htonl(ackno); TCPH_FLAGS_SET(tcphdr, TCP_RST | TCP_ACK); tcphdr->wnd = htons(TCP_WND); tcphdr->urgp = 0; TCPH_HDRLEN_SET(tcphdr, 5); tcphdr->chksum = 0; #if CHECKSUM_GEN_TCP tcphdr->chksum = inet_chksum_pseudo(p, local_ip, remote_ip, IP_PROTO_TCP, p->tot_len); #endif TCP_STATS_INC(tcp.xmit); snmp_inc_tcpoutrsts(); /* Send output with hardcoded TTL since we have no access to the pcb */ ip_output(p, local_ip, remote_ip, TCP_TTL, 0, IP_PROTO_TCP); pbuf_free(p); LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_rst: seqno %"U32_F" ackno %"U32_F".\n", seqno, ackno)); } /** * Requeue all unacked segments for retransmission * * Called by tcp_slowtmr() for slow retransmission. * * @param pcb the tcp_pcb for which to re-enqueue all unacked segments */ void tcp_rexmit_rto(struct tcp_pcb *pcb) { struct tcp_seg *seg; if (pcb->unacked == NULL) { return; } /* Move all unacked segments to the head of the unsent queue */ for (seg = pcb->unacked; seg->next != NULL; seg = seg->next); /* concatenate unsent queue after unacked queue */ seg->next = pcb->unsent; /* unsent queue is the concatenated queue (of unacked, unsent) */ pcb->unsent = pcb->unacked; /* unacked queue is now empty */ pcb->unacked = NULL; /* increment number of retransmissions */ ++pcb->nrtx; /* Don't take any RTT measurements after retransmitting. */ pcb->rttest = 0; /* Do the actual retransmission */ tcp_output(pcb); } /** * Requeue the first unacked segment for retransmission * * Called by tcp_receive() for fast retramsmit. * * @param pcb the tcp_pcb for which to retransmit the first unacked segment */ void tcp_rexmit(struct tcp_pcb *pcb) { struct tcp_seg *seg; struct tcp_seg **cur_seg; if (pcb->unacked == NULL) { return; } /* Move the first unacked segment to the unsent queue */ /* Keep the unsent queue sorted. */ seg = pcb->unacked; pcb->unacked = seg->next; cur_seg = &(pcb->unsent); while (*cur_seg && TCP_SEQ_LT(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) { cur_seg = &((*cur_seg)->next ); } seg->next = *cur_seg; *cur_seg = seg; ++pcb->nrtx; /* Don't take any rtt measurements after retransmitting. */ pcb->rttest = 0; /* Do the actual retransmission. */ snmp_inc_tcpretranssegs(); /* No need to call tcp_output: we are always called from tcp_input() and thus tcp_output directly returns. */ } /** * Handle retransmission after three dupacks received * * @param pcb the tcp_pcb for which to retransmit the first unacked segment */ void tcp_rexmit_fast(struct tcp_pcb *pcb) { if (pcb->unacked != NULL && !(pcb->flags & TF_INFR)) { /* This is fast retransmit. Retransmit the first unacked segment. */ LWIP_DEBUGF(TCP_FR_DEBUG, ("tcp_receive: dupacks %"U16_F" (%"U32_F "), fast retransmit %"U32_F"\n", (u16_t)pcb->dupacks, pcb->lastack, ntohl(pcb->unacked->tcphdr->seqno))); tcp_rexmit(pcb); /* Set ssthresh to half of the minimum of the current * cwnd and the advertised window */ if (pcb->cwnd > pcb->snd_wnd) pcb->ssthresh = pcb->snd_wnd / 2; else pcb->ssthresh = pcb->cwnd / 2; /* The minimum value for ssthresh should be 2 MSS */ if (pcb->ssthresh < 2*pcb->mss) { LWIP_DEBUGF(TCP_FR_DEBUG, ("tcp_receive: The minimum value for ssthresh %"U16_F " should be min 2 mss %"U16_F"...\n", pcb->ssthresh, 2*pcb->mss)); pcb->ssthresh = 2*pcb->mss; } pcb->cwnd = pcb->ssthresh + 3 * pcb->mss; pcb->flags |= TF_INFR; } } /** * Send keepalive packets to keep a connection active although * no data is sent over it. * * Called by tcp_slowtmr() * * @param pcb the tcp_pcb for which to send a keepalive packet */ void tcp_keepalive(struct tcp_pcb *pcb) { struct pbuf *p; struct tcp_hdr *tcphdr; LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: sending KEEPALIVE probe to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", ip4_addr1(&pcb->remote_ip), ip4_addr2(&pcb->remote_ip), ip4_addr3(&pcb->remote_ip), ip4_addr4(&pcb->remote_ip))); LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: tcp_ticks %"U32_F" pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n", tcp_ticks, pcb->tmr, pcb->keep_cnt_sent)); p = pbuf_alloc(PBUF_IP, TCP_HLEN, PBUF_RAM); if(p == NULL) { LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: could not allocate memory for pbuf\n")); return; } LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr", (p->len >= sizeof(struct tcp_hdr))); tcphdr = tcp_output_set_header(pcb, p, 0, htonl(pcb->snd_nxt - 1)); #if CHECKSUM_GEN_TCP tcphdr->chksum = inet_chksum_pseudo(p, &pcb->local_ip, &pcb->remote_ip, IP_PROTO_TCP, p->tot_len); #endif TCP_STATS_INC(tcp.xmit); /* Send output to IP */ #if LWIP_NETIF_HWADDRHINT ip_output_hinted(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP, &(pcb->addr_hint)); #else /* LWIP_NETIF_HWADDRHINT*/ ip_output(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP); #endif /* LWIP_NETIF_HWADDRHINT*/ pbuf_free(p); LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: seqno %"U32_F" ackno %"U32_F".\n", pcb->snd_nxt - 1, pcb->rcv_nxt)); } /** * Send persist timer zero-window probes to keep a connection active * when a window update is lost. * * Called by tcp_slowtmr() * * @param pcb the tcp_pcb for which to send a zero-window probe packet */ void tcp_zero_window_probe(struct tcp_pcb *pcb) { struct pbuf *p; struct tcp_hdr *tcphdr; struct tcp_seg *seg; u16_t len; u8_t is_fin; LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: sending ZERO WINDOW probe to %" U16_F".%"U16_F".%"U16_F".%"U16_F"\n", ip4_addr1(&pcb->remote_ip), ip4_addr2(&pcb->remote_ip), ip4_addr3(&pcb->remote_ip), ip4_addr4(&pcb->remote_ip))); LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: tcp_ticks %"U32_F " pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n", tcp_ticks, pcb->tmr, pcb->keep_cnt_sent)); seg = pcb->unacked; if(seg == NULL) seg = pcb->unsent; if(seg == NULL) return; is_fin = ((TCPH_FLAGS(seg->tcphdr) & TCP_FIN) != 0) && (seg->len == 0); len = is_fin ? TCP_HLEN : TCP_HLEN + 1; p = pbuf_alloc(PBUF_IP, len, PBUF_RAM); if(p == NULL) { LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: no memory for pbuf\n")); return; } LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr", (p->len >= sizeof(struct tcp_hdr))); tcphdr = tcp_output_set_header(pcb, p, 0, seg->tcphdr->seqno); if (is_fin) { /* FIN segment, no data */ TCPH_FLAGS_SET(tcphdr, TCP_ACK | TCP_FIN); } else { /* Data segment, copy in one byte from the head of the unacked queue */ *((char *)p->payload + sizeof(struct tcp_hdr)) = *(char *)seg->dataptr; } #if CHECKSUM_GEN_TCP tcphdr->chksum = inet_chksum_pseudo(p, &pcb->local_ip, &pcb->remote_ip, IP_PROTO_TCP, p->tot_len); #endif TCP_STATS_INC(tcp.xmit); /* Send output to IP */ #if LWIP_NETIF_HWADDRHINT ip_output_hinted(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP, &(pcb->addr_hint)); #else /* LWIP_NETIF_HWADDRHINT*/ ip_output(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP); #endif /* LWIP_NETIF_HWADDRHINT*/ pbuf_free(p); LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: seqno %"U32_F " ackno %"U32_F".\n", pcb->snd_nxt - 1, pcb->rcv_nxt)); } #endif /* LWIP_TCP */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/udp.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * User Datagram Protocol module * */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ /* udp.c * * The code for the User Datagram Protocol UDP & UDPLite (RFC 3828). * */ /* @todo Check the use of '(struct udp_pcb).chksum_len_rx'! */ #include "lwip/opt.h" #if LWIP_UDP /* don't build if not configured for use in lwipopts.h */ #include "lwip/udp.h" #include "lwip/def.h" #include "lwip/memp.h" #include "lwip/inet.h" #include "lwip/inet_chksum.h" #include "lwip/ip_addr.h" #include "lwip/netif.h" #include "lwip/icmp.h" #include "lwip/stats.h" #include "lwip/snmp.h" #include "arch/perf.h" #include "lwip/dhcp.h" #include /* The list of UDP PCBs */ /* exported in udp.h (was static) */ struct udp_pcb *udp_pcbs; /** * Process an incoming UDP datagram. * * Given an incoming UDP datagram (as a chain of pbufs) this function * finds a corresponding UDP PCB and hands over the pbuf to the pcbs * recv function. If no pcb is found or the datagram is incorrect, the * pbuf is freed. * * @param p pbuf to be demultiplexed to a UDP PCB. * @param inp network interface on which the datagram was received. * */ void udp_input(struct pbuf *p, struct netif *inp) { struct udp_hdr *udphdr; struct udp_pcb *pcb, *prev; struct udp_pcb *uncon_pcb; struct ip_hdr *iphdr; u16_t src, dest; u8_t local_match; u8_t broadcast; PERF_START; UDP_STATS_INC(udp.recv); iphdr = p->payload; /* Check minimum length (IP header + UDP header) * and move payload pointer to UDP header */ if (p->tot_len < (IPH_HL(iphdr) * 4 + UDP_HLEN) || pbuf_header(p, -(s16_t)(IPH_HL(iphdr) * 4))) { /* drop short packets */ LWIP_DEBUGF(UDP_DEBUG, ("udp_input: short UDP datagram (%"U16_F" bytes) discarded\n", p->tot_len)); UDP_STATS_INC(udp.lenerr); UDP_STATS_INC(udp.drop); snmp_inc_udpinerrors(); pbuf_free(p); goto end; } udphdr = (struct udp_hdr *)p->payload; /* is broadcast packet ? */ broadcast = ip_addr_isbroadcast(&(iphdr->dest), inp); LWIP_DEBUGF(UDP_DEBUG, ("udp_input: received datagram of length %"U16_F"\n", p->tot_len)); /* convert src and dest ports to host byte order */ src = ntohs(udphdr->src); dest = ntohs(udphdr->dest); udp_debug_print(udphdr); /* print the UDP source and destination */ LWIP_DEBUGF(UDP_DEBUG, ("udp (%"U16_F".%"U16_F".%"U16_F".%"U16_F", %"U16_F") <-- " "(%"U16_F".%"U16_F".%"U16_F".%"U16_F", %"U16_F")\n", ip4_addr1(&iphdr->dest), ip4_addr2(&iphdr->dest), ip4_addr3(&iphdr->dest), ip4_addr4(&iphdr->dest), ntohs(udphdr->dest), ip4_addr1(&iphdr->src), ip4_addr2(&iphdr->src), ip4_addr3(&iphdr->src), ip4_addr4(&iphdr->src), ntohs(udphdr->src))); #if LWIP_DHCP pcb = NULL; /* when LWIP_DHCP is active, packets to DHCP_CLIENT_PORT may only be processed by the dhcp module, no other UDP pcb may use the local UDP port DHCP_CLIENT_PORT */ if (dest == DHCP_CLIENT_PORT) { /* all packets for DHCP_CLIENT_PORT not coming from DHCP_SERVER_PORT are dropped! */ if (src == DHCP_SERVER_PORT) { if ((inp->dhcp != NULL) && (inp->dhcp->pcb != NULL)) { /* accept the packe if (- broadcast or directed to us) -> DHCP is link-layer-addressed, local ip is always ANY! - inp->dhcp->pcb->remote == ANY or iphdr->src */ if ((ip_addr_isany(&inp->dhcp->pcb->remote_ip) || ip_addr_cmp(&(inp->dhcp->pcb->remote_ip), &(iphdr->src)))) { pcb = inp->dhcp->pcb; } } } } else #endif /* LWIP_DHCP */ { prev = NULL; local_match = 0; uncon_pcb = NULL; /* Iterate through the UDP pcb list for a matching pcb. * 'Perfect match' pcbs (connected to the remote port & ip address) are * preferred. If no perfect match is found, the first unconnected pcb that * matches the local port and ip address gets the datagram. */ for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) { local_match = 0; /* print the PCB local and remote address */ LWIP_DEBUGF(UDP_DEBUG, ("pcb (%"U16_F".%"U16_F".%"U16_F".%"U16_F", %"U16_F") --- " "(%"U16_F".%"U16_F".%"U16_F".%"U16_F", %"U16_F")\n", ip4_addr1(&pcb->local_ip), ip4_addr2(&pcb->local_ip), ip4_addr3(&pcb->local_ip), ip4_addr4(&pcb->local_ip), pcb->local_port, ip4_addr1(&pcb->remote_ip), ip4_addr2(&pcb->remote_ip), ip4_addr3(&pcb->remote_ip), ip4_addr4(&pcb->remote_ip), pcb->remote_port)); /* compare PCB local addr+port to UDP destination addr+port */ if ((pcb->local_port == dest) && ((!broadcast && ip_addr_isany(&pcb->local_ip)) || ip_addr_cmp(&(pcb->local_ip), &(iphdr->dest)) || #if LWIP_IGMP ip_addr_ismulticast(&(iphdr->dest)) || #endif /* LWIP_IGMP */ #if IP_SOF_BROADCAST_RECV (broadcast && (pcb->so_options & SOF_BROADCAST)))) { #else /* IP_SOF_BROADCAST_RECV */ (broadcast))) { #endif /* IP_SOF_BROADCAST_RECV */ local_match = 1; if ((uncon_pcb == NULL) && ((pcb->flags & UDP_FLAGS_CONNECTED) == 0)) { /* the first unconnected matching PCB */ uncon_pcb = pcb; } } /* compare PCB remote addr+port to UDP source addr+port */ if ((local_match != 0) && (pcb->remote_port == src) && (ip_addr_isany(&pcb->remote_ip) || ip_addr_cmp(&(pcb->remote_ip), &(iphdr->src)))) { /* the first fully matching PCB */ if (prev != NULL) { /* move the pcb to the front of udp_pcbs so that is found faster next time */ prev->next = pcb->next; pcb->next = udp_pcbs; udp_pcbs = pcb; } else { UDP_STATS_INC(udp.cachehit); } break; } prev = pcb; } /* no fully matching pcb found? then look for an unconnected pcb */ if (pcb == NULL) { pcb = uncon_pcb; } } /* Check checksum if this is a match or if it was directed at us. */ if (pcb != NULL || ip_addr_cmp(&inp->ip_addr, &iphdr->dest)) { LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_input: calculating checksum\n")); #if LWIP_UDPLITE if (IPH_PROTO(iphdr) == IP_PROTO_UDPLITE) { /* Do the UDP Lite checksum */ #if CHECKSUM_CHECK_UDP u16_t chklen = ntohs(udphdr->len); if (chklen < sizeof(struct udp_hdr)) { if (chklen == 0) { /* For UDP-Lite, checksum length of 0 means checksum over the complete packet (See RFC 3828 chap. 3.1) */ chklen = p->tot_len; } else { /* At least the UDP-Lite header must be covered by the checksum! (Again, see RFC 3828 chap. 3.1) */ UDP_STATS_INC(udp.chkerr); UDP_STATS_INC(udp.drop); snmp_inc_udpinerrors(); pbuf_free(p); goto end; } } if (inet_chksum_pseudo_partial(p, (struct ip_addr *)&(iphdr->src), (struct ip_addr *)&(iphdr->dest), IP_PROTO_UDPLITE, p->tot_len, chklen) != 0) { LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("udp_input: UDP Lite datagram discarded due to failing checksum\n")); UDP_STATS_INC(udp.chkerr); UDP_STATS_INC(udp.drop); snmp_inc_udpinerrors(); pbuf_free(p); goto end; } #endif /* CHECKSUM_CHECK_UDP */ } else #endif /* LWIP_UDPLITE */ { #if CHECKSUM_CHECK_UDP if (udphdr->chksum != 0) { if (inet_chksum_pseudo(p, (struct ip_addr *)&(iphdr->src), (struct ip_addr *)&(iphdr->dest), IP_PROTO_UDP, p->tot_len) != 0) { LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("udp_input: UDP datagram discarded due to failing checksum\n")); UDP_STATS_INC(udp.chkerr); UDP_STATS_INC(udp.drop); snmp_inc_udpinerrors(); pbuf_free(p); goto end; } } #endif /* CHECKSUM_CHECK_UDP */ } if(pbuf_header(p, -UDP_HLEN)) { /* Can we cope with this failing? Just assert for now */ LWIP_ASSERT("pbuf_header failed\n", 0); UDP_STATS_INC(udp.drop); snmp_inc_udpinerrors(); pbuf_free(p); goto end; } if (pcb != NULL) { snmp_inc_udpindatagrams(); /* callback */ if (pcb->recv != NULL) { /* now the recv function is responsible for freeing p */ pcb->recv(pcb->recv_arg, pcb, p, &iphdr->src, src); } else { /* no recv function registered? then we have to free the pbuf! */ pbuf_free(p); goto end; } } else { LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_input: not for us.\n")); #if LWIP_ICMP /* No match was found, send ICMP destination port unreachable unless destination address was broadcast/multicast. */ if (!broadcast && !ip_addr_ismulticast(&iphdr->dest)) { /* move payload pointer back to ip header */ pbuf_header(p, (IPH_HL(iphdr) * 4) + UDP_HLEN); LWIP_ASSERT("p->payload == iphdr", (p->payload == iphdr)); icmp_dest_unreach(p, ICMP_DUR_PORT); } #endif /* LWIP_ICMP */ UDP_STATS_INC(udp.proterr); UDP_STATS_INC(udp.drop); snmp_inc_udpnoports(); pbuf_free(p); } } else { pbuf_free(p); } end: PERF_STOP("udp_input"); } /** * Send data using UDP. * * @param pcb UDP PCB used to send the data. * @param p chain of pbuf's to be sent. * * The datagram will be sent to the current remote_ip & remote_port * stored in pcb. If the pcb is not bound to a port, it will * automatically be bound to a random port. * * @return lwIP error code. * - ERR_OK. Successful. No error occured. * - ERR_MEM. Out of memory. * - ERR_RTE. Could not find route to destination address. * - More errors could be returned by lower protocol layers. * * @see udp_disconnect() udp_sendto() */ err_t udp_send(struct udp_pcb *pcb, struct pbuf *p) { /* send to the packet using remote ip and port stored in the pcb */ return udp_sendto(pcb, p, &pcb->remote_ip, pcb->remote_port); } /** * Send data to a specified address using UDP. * * @param pcb UDP PCB used to send the data. * @param p chain of pbuf's to be sent. * @param dst_ip Destination IP address. * @param dst_port Destination UDP port. * * dst_ip & dst_port are expected to be in the same byte order as in the pcb. * * If the PCB already has a remote address association, it will * be restored after the data is sent. * * @return lwIP error code (@see udp_send for possible error codes) * * @see udp_disconnect() udp_send() */ err_t udp_sendto(struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *dst_ip, u16_t dst_port) { struct netif *netif; LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_send\n")); /* find the outgoing network interface for this packet */ #if LWIP_IGMP netif = ip_route((ip_addr_ismulticast(dst_ip))?(&(pcb->multicast_ip)):(dst_ip)); #else netif = ip_route(dst_ip); #endif /* LWIP_IGMP */ /* no outgoing network interface could be found? */ if (netif == NULL) { LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: No route to 0x%"X32_F"\n", dst_ip->addr)); UDP_STATS_INC(udp.rterr); return ERR_RTE; } return udp_sendto_if(pcb, p, dst_ip, dst_port, netif); } /** * Send data to a specified address using UDP. * The netif used for sending can be specified. * * This function exists mainly for DHCP, to be able to send UDP packets * on a netif that is still down. * * @param pcb UDP PCB used to send the data. * @param p chain of pbuf's to be sent. * @param dst_ip Destination IP address. * @param dst_port Destination UDP port. * @param netif the netif used for sending. * * dst_ip & dst_port are expected to be in the same byte order as in the pcb. * * @return lwIP error code (@see udp_send for possible error codes) * * @see udp_disconnect() udp_send() */ err_t udp_sendto_if(struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *dst_ip, u16_t dst_port, struct netif *netif) { struct udp_hdr *udphdr; struct ip_addr *src_ip; err_t err; struct pbuf *q; /* q will be sent down the stack */ #if IP_SOF_BROADCAST /* broadcast filter? */ if ( ((pcb->so_options & SOF_BROADCAST) == 0) && ip_addr_isbroadcast(dst_ip, netif) ) { LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("udp_sendto_if: SOF_BROADCAST not enabled on pcb %p\n", (void *)pcb)); return ERR_VAL; } #endif /* IP_SOF_BROADCAST */ /* if the PCB is not yet bound to a port, bind it here */ if (pcb->local_port == 0) { LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_send: not yet bound to a port, binding now\n")); err = udp_bind(pcb, &pcb->local_ip, pcb->local_port); if (err != ERR_OK) { LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: forced port bind failed\n")); return err; } } /* not enough space to add an UDP header to first pbuf in given p chain? */ if (pbuf_header(p, UDP_HLEN)) { /* allocate header in a separate new pbuf */ q = pbuf_alloc(PBUF_IP, UDP_HLEN, PBUF_RAM); /* new header pbuf could not be allocated? */ if (q == NULL) { LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: could not allocate header\n")); return ERR_MEM; } /* chain header q in front of given pbuf p */ pbuf_chain(q, p); /* first pbuf q points to header pbuf */ LWIP_DEBUGF(UDP_DEBUG, ("udp_send: added header pbuf %p before given pbuf %p\n", (void *)q, (void *)p)); } else { /* adding space for header within p succeeded */ /* first pbuf q equals given pbuf */ q = p; LWIP_DEBUGF(UDP_DEBUG, ("udp_send: added header in given pbuf %p\n", (void *)p)); } LWIP_ASSERT("check that first pbuf can hold struct udp_hdr", (q->len >= sizeof(struct udp_hdr))); /* q now represents the packet to be sent */ udphdr = q->payload; udphdr->src = htons(pcb->local_port); udphdr->dest = htons(dst_port); /* in UDP, 0 checksum means 'no checksum' */ udphdr->chksum = 0x0000; /* PCB local address is IP_ANY_ADDR? */ if (ip_addr_isany(&pcb->local_ip)) { /* use outgoing network interface IP address as source address */ src_ip = &(netif->ip_addr); } else { /* check if UDP PCB local IP address is correct * this could be an old address if netif->ip_addr has changed */ if (!ip_addr_cmp(&(pcb->local_ip), &(netif->ip_addr))) { /* local_ip doesn't match, drop the packet */ if (q != p) { /* free the header pbuf */ pbuf_free(q); q = NULL; /* p is still referenced by the caller, and will live on */ } return ERR_VAL; } /* use UDP PCB local IP address as source address */ src_ip = &(pcb->local_ip); } LWIP_DEBUGF(UDP_DEBUG, ("udp_send: sending datagram of length %"U16_F"\n", q->tot_len)); #if LWIP_UDPLITE /* UDP Lite protocol? */ if (pcb->flags & UDP_FLAGS_UDPLITE) { u16_t chklen, chklen_hdr; LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP LITE packet length %"U16_F"\n", q->tot_len)); /* set UDP message length in UDP header */ chklen_hdr = chklen = pcb->chksum_len_tx; if ((chklen < sizeof(struct udp_hdr)) || (chklen > q->tot_len)) { if (chklen != 0) { LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP LITE pcb->chksum_len is illegal: %"U16_F"\n", chklen)); } /* For UDP-Lite, checksum length of 0 means checksum over the complete packet. (See RFC 3828 chap. 3.1) At least the UDP-Lite header must be covered by the checksum, therefore, if chksum_len has an illegal value, we generate the checksum over the complete packet to be safe. */ chklen_hdr = 0; chklen = q->tot_len; } udphdr->len = htons(chklen_hdr); /* calculate checksum */ #if CHECKSUM_GEN_UDP udphdr->chksum = inet_chksum_pseudo_partial(q, src_ip, dst_ip, IP_PROTO_UDPLITE, q->tot_len, chklen); /* chksum zero must become 0xffff, as zero means 'no checksum' */ if (udphdr->chksum == 0x0000) udphdr->chksum = 0xffff; #endif /* CHECKSUM_CHECK_UDP */ /* output to IP */ LWIP_DEBUGF(UDP_DEBUG, ("udp_send: ip_output_if (,,,,IP_PROTO_UDPLITE,)\n")); #if LWIP_NETIF_HWADDRHINT netif->addr_hint = &(pcb->addr_hint); #endif /* LWIP_NETIF_HWADDRHINT*/ err = ip_output_if(q, src_ip, dst_ip, pcb->ttl, pcb->tos, IP_PROTO_UDPLITE, netif); #if LWIP_NETIF_HWADDRHINT netif->addr_hint = NULL; #endif /* LWIP_NETIF_HWADDRHINT*/ } else #endif /* LWIP_UDPLITE */ { /* UDP */ LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP packet length %"U16_F"\n", q->tot_len)); udphdr->len = htons(q->tot_len); /* calculate checksum */ #if CHECKSUM_GEN_UDP if ((pcb->flags & UDP_FLAGS_NOCHKSUM) == 0) { udphdr->chksum = inet_chksum_pseudo(q, src_ip, dst_ip, IP_PROTO_UDP, q->tot_len); /* chksum zero must become 0xffff, as zero means 'no checksum' */ if (udphdr->chksum == 0x0000) udphdr->chksum = 0xffff; } #endif /* CHECKSUM_CHECK_UDP */ LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP checksum 0x%04"X16_F"\n", udphdr->chksum)); LWIP_DEBUGF(UDP_DEBUG, ("udp_send: ip_output_if (,,,,IP_PROTO_UDP,)\n")); /* output to IP */ #if LWIP_NETIF_HWADDRHINT netif->addr_hint = &(pcb->addr_hint); #endif /* LWIP_NETIF_HWADDRHINT*/ err = ip_output_if(q, src_ip, dst_ip, pcb->ttl, pcb->tos, IP_PROTO_UDP, netif); #if LWIP_NETIF_HWADDRHINT netif->addr_hint = NULL; #endif /* LWIP_NETIF_HWADDRHINT*/ } /* TODO: must this be increased even if error occured? */ snmp_inc_udpoutdatagrams(); /* did we chain a separate header pbuf earlier? */ if (q != p) { /* free the header pbuf */ pbuf_free(q); q = NULL; /* p is still referenced by the caller, and will live on */ } UDP_STATS_INC(udp.xmit); return err; } /** * Bind an UDP PCB. * * @param pcb UDP PCB to be bound with a local address ipaddr and port. * @param ipaddr local IP address to bind with. Use IP_ADDR_ANY to * bind to all local interfaces. * @param port local UDP port to bind with. Use 0 to automatically bind * to a random port between UDP_LOCAL_PORT_RANGE_START and * UDP_LOCAL_PORT_RANGE_END. * * ipaddr & port are expected to be in the same byte order as in the pcb. * * @return lwIP error code. * - ERR_OK. Successful. No error occured. * - ERR_USE. The specified ipaddr and port are already bound to by * another UDP PCB. * * @see udp_disconnect() */ err_t udp_bind(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port) { struct udp_pcb *ipcb; u8_t rebind; LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_bind(ipaddr = ")); ip_addr_debug_print(UDP_DEBUG, ipaddr); LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (", port = %"U16_F")\n", port)); rebind = 0; /* Check for double bind and rebind of the same pcb */ for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) { /* is this UDP PCB already on active list? */ if (pcb == ipcb) { /* pcb may occur at most once in active list */ LWIP_ASSERT("rebind == 0", rebind == 0); /* pcb already in list, just rebind */ rebind = 1; } /* this code does not allow upper layer to share a UDP port for listening to broadcast or multicast traffic (See SO_REUSE_ADDR and SO_REUSE_PORT under *BSD). TODO: See where it fits instead, OR combine with implementation of UDP PCB flags. Leon Woestenberg. */ #ifdef LWIP_UDP_TODO /* port matches that of PCB in list? */ else if ((ipcb->local_port == port) && /* IP address matches, or one is IP_ADDR_ANY? */ (ip_addr_isany(&(ipcb->local_ip)) || ip_addr_isany(ipaddr) || ip_addr_cmp(&(ipcb->local_ip), ipaddr))) { /* other PCB already binds to this local IP and port */ LWIP_DEBUGF(UDP_DEBUG, ("udp_bind: local port %"U16_F" already bound by another pcb\n", port)); return ERR_USE; } #endif } ip_addr_set(&pcb->local_ip, ipaddr); /* no port specified? */ if (port == 0) { #ifndef UDP_LOCAL_PORT_RANGE_START #define UDP_LOCAL_PORT_RANGE_START 4096 #define UDP_LOCAL_PORT_RANGE_END 0x7fff #endif port = UDP_LOCAL_PORT_RANGE_START; ipcb = udp_pcbs; while ((ipcb != NULL) && (port != UDP_LOCAL_PORT_RANGE_END)) { if (ipcb->local_port == port) { /* port is already used by another udp_pcb */ port++; /* restart scanning all udp pcbs */ ipcb = udp_pcbs; } else /* go on with next udp pcb */ ipcb = ipcb->next; } if (ipcb != NULL) { /* no more ports available in local range */ LWIP_DEBUGF(UDP_DEBUG, ("udp_bind: out of free UDP ports\n")); return ERR_USE; } } pcb->local_port = port; snmp_insert_udpidx_tree(pcb); /* pcb not active yet? */ if (rebind == 0) { /* place the PCB on the active list if not already there */ pcb->next = udp_pcbs; udp_pcbs = pcb; } LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("udp_bind: bound to %"U16_F".%"U16_F".%"U16_F".%"U16_F", port %"U16_F"\n", (u16_t)((ntohl(pcb->local_ip.addr) >> 24) & 0xff), (u16_t)((ntohl(pcb->local_ip.addr) >> 16) & 0xff), (u16_t)((ntohl(pcb->local_ip.addr) >> 8) & 0xff), (u16_t)(ntohl(pcb->local_ip.addr) & 0xff), pcb->local_port)); return ERR_OK; } /** * Connect an UDP PCB. * * This will associate the UDP PCB with the remote address. * * @param pcb UDP PCB to be connected with remote address ipaddr and port. * @param ipaddr remote IP address to connect with. * @param port remote UDP port to connect with. * * @return lwIP error code * * ipaddr & port are expected to be in the same byte order as in the pcb. * * The udp pcb is bound to a random local port if not already bound. * * @see udp_disconnect() */ err_t udp_connect(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port) { struct udp_pcb *ipcb; if (pcb->local_port == 0) { err_t err = udp_bind(pcb, &pcb->local_ip, pcb->local_port); if (err != ERR_OK) return err; } ip_addr_set(&pcb->remote_ip, ipaddr); pcb->remote_port = port; pcb->flags |= UDP_FLAGS_CONNECTED; /** TODO: this functionality belongs in upper layers */ #ifdef LWIP_UDP_TODO /* Nail down local IP for netconn_addr()/getsockname() */ if (ip_addr_isany(&pcb->local_ip) && !ip_addr_isany(&pcb->remote_ip)) { struct netif *netif; if ((netif = ip_route(&(pcb->remote_ip))) == NULL) { LWIP_DEBUGF(UDP_DEBUG, ("udp_connect: No route to 0x%lx\n", pcb->remote_ip.addr)); UDP_STATS_INC(udp.rterr); return ERR_RTE; } /** TODO: this will bind the udp pcb locally, to the interface which is used to route output packets to the remote address. However, we might want to accept incoming packets on any interface! */ pcb->local_ip = netif->ip_addr; } else if (ip_addr_isany(&pcb->remote_ip)) { pcb->local_ip.addr = 0; } #endif LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("udp_connect: connected to %"U16_F".%"U16_F".%"U16_F".%"U16_F",port %"U16_F"\n", (u16_t)((ntohl(pcb->remote_ip.addr) >> 24) & 0xff), (u16_t)((ntohl(pcb->remote_ip.addr) >> 16) & 0xff), (u16_t)((ntohl(pcb->remote_ip.addr) >> 8) & 0xff), (u16_t)(ntohl(pcb->remote_ip.addr) & 0xff), pcb->remote_port)); /* Insert UDP PCB into the list of active UDP PCBs. */ for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) { if (pcb == ipcb) { /* already on the list, just return */ return ERR_OK; } } /* PCB not yet on the list, add PCB now */ pcb->next = udp_pcbs; udp_pcbs = pcb; return ERR_OK; } /** * Disconnect a UDP PCB * * @param pcb the udp pcb to disconnect. */ void udp_disconnect(struct udp_pcb *pcb) { /* reset remote address association */ ip_addr_set(&pcb->remote_ip, IP_ADDR_ANY); pcb->remote_port = 0; /* mark PCB as unconnected */ pcb->flags &= ~UDP_FLAGS_CONNECTED; } /** * Set a receive callback for a UDP PCB * * This callback will be called when receiving a datagram for the pcb. * * @param pcb the pcb for wich to set the recv callback * @param recv function pointer of the callback function * @param recv_arg additional argument to pass to the callback function */ void udp_recv(struct udp_pcb *pcb, void (* recv)(void *arg, struct udp_pcb *upcb, struct pbuf *p, struct ip_addr *addr, u16_t port), void *recv_arg) { /* remember recv() callback and user data */ pcb->recv = recv; pcb->recv_arg = recv_arg; } /** * Remove an UDP PCB. * * @param pcb UDP PCB to be removed. The PCB is removed from the list of * UDP PCB's and the data structure is freed from memory. * * @see udp_new() */ void udp_remove(struct udp_pcb *pcb) { struct udp_pcb *pcb2; snmp_delete_udpidx_tree(pcb); /* pcb to be removed is first in list? */ if (udp_pcbs == pcb) { /* make list start at 2nd pcb */ udp_pcbs = udp_pcbs->next; /* pcb not 1st in list */ } else for (pcb2 = udp_pcbs; pcb2 != NULL; pcb2 = pcb2->next) { /* find pcb in udp_pcbs list */ if (pcb2->next != NULL && pcb2->next == pcb) { /* remove pcb from list */ pcb2->next = pcb->next; } } memp_free(MEMP_UDP_PCB, pcb); } /** * Create a UDP PCB. * * @return The UDP PCB which was created. NULL if the PCB data structure * could not be allocated. * * @see udp_remove() */ struct udp_pcb * udp_new(void) { struct udp_pcb *pcb; pcb = memp_malloc(MEMP_UDP_PCB); /* could allocate UDP PCB? */ if (pcb != NULL) { /* UDP Lite: by initializing to all zeroes, chksum_len is set to 0 * which means checksum is generated over the whole datagram per default * (recommended as default by RFC 3828). */ /* initialize PCB to all zeroes */ memset(pcb, 0, sizeof(struct udp_pcb)); pcb->ttl = UDP_TTL; } return pcb; } #if UDP_DEBUG /** * Print UDP header information for debug purposes. * * @param udphdr pointer to the udp header in memory. */ void udp_debug_print(struct udp_hdr *udphdr) { LWIP_DEBUGF(UDP_DEBUG, ("UDP header:\n")); LWIP_DEBUGF(UDP_DEBUG, ("+-------------------------------+\n")); LWIP_DEBUGF(UDP_DEBUG, ("| %5"U16_F" | %5"U16_F" | (src port, dest port)\n", ntohs(udphdr->src), ntohs(udphdr->dest))); LWIP_DEBUGF(UDP_DEBUG, ("+-------------------------------+\n")); LWIP_DEBUGF(UDP_DEBUG, ("| %5"U16_F" | 0x%04"X16_F" | (len, chksum)\n", ntohs(udphdr->len), ntohs(udphdr->chksum))); LWIP_DEBUGF(UDP_DEBUG, ("+-------------------------------+\n")); } #endif /* UDP_DEBUG */ #endif /* LWIP_UDP */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/autoip.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * * AutoIP Automatic LinkLocal IP Configuration */ /* * * Copyright (c) 2007 Dominik Spies * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * Author: Dominik Spies * * This is a AutoIP implementation for the lwIP TCP/IP stack. It aims to conform * with RFC 3927. * * * Please coordinate changes and requests with Dominik Spies * */ #ifndef __LWIP_AUTOIP_H__ #define __LWIP_AUTOIP_H__ #include "lwip/opt.h" #if LWIP_AUTOIP /* don't build if not configured for use in lwipopts.h */ #include "lwip/netif.h" #include "lwip/udp.h" #include "netif/etharp.h" #ifdef __cplusplus extern "C" { #endif /* AutoIP Timing */ #define AUTOIP_TMR_INTERVAL 100 #define AUTOIP_TICKS_PER_SECOND (1000 / AUTOIP_TMR_INTERVAL) /* RFC 3927 Constants */ #define PROBE_WAIT 1 /* second (initial random delay) */ #define PROBE_MIN 1 /* second (minimum delay till repeated probe) */ #define PROBE_MAX 2 /* seconds (maximum delay till repeated probe) */ #define PROBE_NUM 3 /* (number of probe packets) */ #define ANNOUNCE_NUM 2 /* (number of announcement packets) */ #define ANNOUNCE_INTERVAL 2 /* seconds (time between announcement packets) */ #define ANNOUNCE_WAIT 2 /* seconds (delay before announcing) */ #define MAX_CONFLICTS 10 /* (max conflicts before rate limiting) */ #define RATE_LIMIT_INTERVAL 60 /* seconds (delay between successive attempts) */ #define DEFEND_INTERVAL 10 /* seconds (min. wait between defensive ARPs) */ /* AutoIP client states */ #define AUTOIP_STATE_OFF 0 #define AUTOIP_STATE_PROBING 1 #define AUTOIP_STATE_ANNOUNCING 2 #define AUTOIP_STATE_BOUND 3 struct autoip { struct ip_addr llipaddr; /* the currently selected, probed, announced or used LL IP-Address */ u8_t state; /* current AutoIP state machine state */ u8_t sent_num; /* sent number of probes or announces, dependent on state */ u16_t ttw; /* ticks to wait, tick is AUTOIP_TMR_INTERVAL long */ u8_t lastconflict; /* ticks until a conflict can be solved by defending */ u8_t tried_llipaddr; /* total number of probed/used Link Local IP-Addresses */ }; /** Init srand, has to be called before entering mainloop */ void autoip_init(void); /** Start AutoIP client */ err_t autoip_start(struct netif *netif); /** Stop AutoIP client */ err_t autoip_stop(struct netif *netif); /** Handles every incoming ARP Packet, called by etharp_arp_input */ void autoip_arp_reply(struct netif *netif, struct etharp_hdr *hdr); /** Has to be called in loop every AUTOIP_TMR_INTERVAL milliseconds */ void autoip_tmr(void); /** Handle a possible change in the network configuration */ void autoip_network_changed(struct netif *netif); #ifdef __cplusplus } #endif #endif /* LWIP_AUTOIP */ #endif /* __LWIP_AUTOIP_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/icmp.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIP_ICMP_H__ #define __LWIP_ICMP_H__ #include "lwip/opt.h" #include "lwip/pbuf.h" #include "lwip/ip_addr.h" #include "lwip/netif.h" #ifdef __cplusplus extern "C" { #endif #define ICMP_ER 0 /* echo reply */ #define ICMP_DUR 3 /* destination unreachable */ #define ICMP_SQ 4 /* source quench */ #define ICMP_RD 5 /* redirect */ #define ICMP_ECHO 8 /* echo */ #define ICMP_TE 11 /* time exceeded */ #define ICMP_PP 12 /* parameter problem */ #define ICMP_TS 13 /* timestamp */ #define ICMP_TSR 14 /* timestamp reply */ #define ICMP_IRQ 15 /* information request */ #define ICMP_IR 16 /* information reply */ enum icmp_dur_type { ICMP_DUR_NET = 0, /* net unreachable */ ICMP_DUR_HOST = 1, /* host unreachable */ ICMP_DUR_PROTO = 2, /* protocol unreachable */ ICMP_DUR_PORT = 3, /* port unreachable */ ICMP_DUR_FRAG = 4, /* fragmentation needed and DF set */ ICMP_DUR_SR = 5 /* source route failed */ }; enum icmp_te_type { ICMP_TE_TTL = 0, /* time to live exceeded in transit */ ICMP_TE_FRAG = 1 /* fragment reassembly time exceeded */ }; #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" #endif /** This is the standard ICMP header only that the u32_t data * is splitted to two u16_t like ICMP echo needs it. * This header is also used for other ICMP types that do not * use the data part. */ PACK_STRUCT_BEGIN struct icmp_echo_hdr { PACK_STRUCT_FIELD(u8_t type); PACK_STRUCT_FIELD(u8_t code); PACK_STRUCT_FIELD(u16_t chksum); PACK_STRUCT_FIELD(u16_t id); PACK_STRUCT_FIELD(u16_t seqno); } PACK_STRUCT_STRUCT; PACK_STRUCT_END #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/epstruct.h" #endif #define ICMPH_TYPE(hdr) ((hdr)->type) #define ICMPH_CODE(hdr) ((hdr)->code) /** Combines type and code to an u16_t */ #define ICMPH_TYPE_SET(hdr, t) ((hdr)->type = (t)) #define ICMPH_CODE_SET(hdr, c) ((hdr)->code = (c)) #if LWIP_ICMP /* don't build if not configured for use in lwipopts.h */ void icmp_input(struct pbuf *p, struct netif *inp); void icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t); void icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t); #endif /* LWIP_ICMP */ #ifdef __cplusplus } #endif #endif /* __LWIP_ICMP_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/igmp.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2002 CITEL Technologies Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of CITEL Technologies Ltd nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY CITEL TECHNOLOGIES AND CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL CITEL TECHNOLOGIES OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * This file is a contribution to the lwIP TCP/IP stack. * The Swedish Institute of Computer Science and Adam Dunkels * are specifically granted permission to redistribute this * source code. */ #ifndef __LWIP_IGMP_H__ #define __LWIP_IGMP_H__ #include "lwip/opt.h" #include "lwip/ip_addr.h" #include "lwip/netif.h" #include "lwip/pbuf.h" #if LWIP_IGMP /* don't build if not configured for use in lwipopts.h */ #ifdef __cplusplus extern "C" { #endif /* * IGMP constants */ #define IP_PROTO_IGMP 2 #define IGMP_TTL 1 #define IGMP_MINLEN 8 #define ROUTER_ALERT 0x9404 #define ROUTER_ALERTLEN 4 /* * IGMP message types, including version number. */ #define IGMP_MEMB_QUERY 0x11 /* Membership query */ #define IGMP_V1_MEMB_REPORT 0x12 /* Ver. 1 membership report */ #define IGMP_V2_MEMB_REPORT 0x16 /* Ver. 2 membership report */ #define IGMP_LEAVE_GROUP 0x17 /* Leave-group message */ /* IGMP timer */ #define IGMP_TMR_INTERVAL 100 /* Milliseconds */ #define IGMP_V1_DELAYING_MEMBER_TMR (1000/IGMP_TMR_INTERVAL) #define IGMP_JOIN_DELAYING_MEMBER_TMR (500 /IGMP_TMR_INTERVAL) /* MAC Filter Actions */ #define IGMP_DEL_MAC_FILTER 0 #define IGMP_ADD_MAC_FILTER 1 /* Group membership states */ #define IGMP_GROUP_NON_MEMBER 0 #define IGMP_GROUP_DELAYING_MEMBER 1 #define IGMP_GROUP_IDLE_MEMBER 2 /* * IGMP packet format. */ #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" #endif PACK_STRUCT_BEGIN struct igmp_msg { PACK_STRUCT_FIELD(u8_t igmp_msgtype); PACK_STRUCT_FIELD(u8_t igmp_maxresp); PACK_STRUCT_FIELD(u16_t igmp_checksum); PACK_STRUCT_FIELD(struct ip_addr igmp_group_address); } PACK_STRUCT_STRUCT; PACK_STRUCT_END #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/epstruct.h" #endif /* * now a group structure - there is * a list of groups for each interface * these should really be linked from the interface, but * if we keep them separate we will not affect the lwip original code * too much * * There will be a group for the all systems group address but this * will not run the state machine as it is used to kick off reports * from all the other groups */ struct igmp_group { struct igmp_group *next; struct netif *interface; struct ip_addr group_address; u8_t last_reporter_flag; /* signifies we were the last person to report */ u8_t group_state; u16_t timer; u8_t use; /* counter of simultaneous uses */ }; /* Prototypes */ void igmp_init(void); err_t igmp_start( struct netif *netif); err_t igmp_stop( struct netif *netif); void igmp_report_groups( struct netif *netif); struct igmp_group *igmp_lookfor_group( struct netif *ifp, struct ip_addr *addr); struct igmp_group *igmp_lookup_group( struct netif *ifp, struct ip_addr *addr); err_t igmp_remove_group( struct igmp_group *group); void igmp_input( struct pbuf *p, struct netif *inp, struct ip_addr *dest); err_t igmp_joingroup( struct ip_addr *ifaddr, struct ip_addr *groupaddr); err_t igmp_leavegroup( struct ip_addr *ifaddr, struct ip_addr *groupaddr); void igmp_tmr(void); void igmp_timeout( struct igmp_group *group); void igmp_start_timer( struct igmp_group *group, u8_t max_time); void igmp_stop_timer( struct igmp_group *group); void igmp_delaying_member( struct igmp_group *group, u8_t maxresp); err_t igmp_ip_output_if( struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, u8_t ttl, u8_t proto, struct netif *netif); void igmp_send( struct igmp_group *group, u8_t type); #ifdef __cplusplus } #endif #endif /* LWIP_IGMP */ #endif /* __LWIP_IGMP_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/inet.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIP_INET_H__ #define __LWIP_INET_H__ #include "lwip/opt.h" #ifdef __cplusplus extern "C" { #endif /* For compatibility with BSD code */ struct in_addr { u32_t s_addr; }; #define INADDR_NONE ((u32_t)0xffffffffUL) /* 255.255.255.255 */ #define INADDR_LOOPBACK ((u32_t)0x7f000001UL) /* 127.0.0.1 */ #define INADDR_ANY ((u32_t)0x00000000UL) /* 0.0.0.0 */ #define INADDR_BROADCAST ((u32_t)0xffffffffUL) /* 255.255.255.255 */ u32_t inet_addr(const char *cp); int inet_aton(const char *cp, struct in_addr *addr); char *inet_ntoa(struct in_addr addr); /* returns ptr to static buffer; not reentrant! */ #ifdef htons #undef htons #endif /* htons */ #ifdef htonl #undef htonl #endif /* htonl */ #ifdef ntohs #undef ntohs #endif /* ntohs */ #ifdef ntohl #undef ntohl #endif /* ntohl */ #ifndef LWIP_PLATFORM_BYTESWAP #define LWIP_PLATFORM_BYTESWAP 0 #endif #if BYTE_ORDER == BIG_ENDIAN #define htons(x) (x) #define ntohs(x) (x) #define htonl(x) (x) #define ntohl(x) (x) #else /* BYTE_ORDER != BIG_ENDIAN */ #ifdef LWIP_PREFIX_BYTEORDER_FUNCS /* workaround for naming collisions on some platforms */ #define htons lwip_htons #define ntohs lwip_ntohs #define htonl lwip_htonl #define ntohl lwip_ntohl #endif /* LWIP_PREFIX_BYTEORDER_FUNCS */ #if LWIP_PLATFORM_BYTESWAP #define htons(x) LWIP_PLATFORM_HTONS(x) #define ntohs(x) LWIP_PLATFORM_HTONS(x) #define htonl(x) LWIP_PLATFORM_HTONL(x) #define ntohl(x) LWIP_PLATFORM_HTONL(x) #else /* LWIP_PLATFORM_BYTESWAP */ u16_t htons(u16_t x); u16_t ntohs(u16_t x); u32_t htonl(u32_t x); u32_t ntohl(u32_t x); #endif /* LWIP_PLATFORM_BYTESWAP */ #endif /* BYTE_ORDER == BIG_ENDIAN */ #ifdef __cplusplus } #endif #endif /* __LWIP_INET_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/inet_chksum.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIP_INET_CHKSUM_H__ #define __LWIP_INET_CHKSUM_H__ #include "lwip/opt.h" #include "lwip/pbuf.h" #include "lwip/ip_addr.h" #ifdef __cplusplus extern "C" { #endif u16_t inet_chksum(void *dataptr, u16_t len); u16_t inet_chksum_pbuf(struct pbuf *p); u16_t inet_chksum_pseudo(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, u8_t proto, u16_t proto_len); #if LWIP_UDPLITE u16_t inet_chksum_pseudo_partial(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, u8_t proto, u16_t proto_len, u16_t chksum_len); #endif #ifdef __cplusplus } #endif #endif /* __LWIP_INET_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/ip.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIP_IP_H__ #define __LWIP_IP_H__ #include "lwip/opt.h" #include "lwip/def.h" #include "lwip/pbuf.h" #include "lwip/ip_addr.h" #include "lwip/err.h" #include "lwip/netif.h" #ifdef __cplusplus extern "C" { #endif /** Currently, the function ip_output_if_opt() is only used with IGMP */ #define IP_OPTIONS_SEND LWIP_IGMP #define IP_HLEN 20 #define IP_PROTO_ICMP 1 #define IP_PROTO_UDP 17 #define IP_PROTO_UDPLITE 136 #define IP_PROTO_TCP 6 /* This is passed as the destination address to ip_output_if (not to ip_output), meaning that an IP header already is constructed in the pbuf. This is used when TCP retransmits. */ #ifdef IP_HDRINCL #undef IP_HDRINCL #endif /* IP_HDRINCL */ #define IP_HDRINCL NULL #if LWIP_NETIF_HWADDRHINT #define IP_PCB_ADDRHINT ;u8_t addr_hint #else #define IP_PCB_ADDRHINT #endif /* LWIP_NETIF_HWADDRHINT */ /* This is the common part of all PCB types. It needs to be at the beginning of a PCB type definition. It is located here so that changes to this common part are made in one location instead of having to change all PCB structs. */ #define IP_PCB \ /* ip addresses in network byte order */ \ struct ip_addr local_ip; \ struct ip_addr remote_ip; \ /* Socket options */ \ u16_t so_options; \ /* Type Of Service */ \ u8_t tos; \ /* Time To Live */ \ u8_t ttl \ /* link layer address resolution hint */ \ IP_PCB_ADDRHINT struct ip_pcb { /* Common members of all PCB types */ IP_PCB; }; /* * Option flags per-socket. These are the same like SO_XXX. */ #define SOF_DEBUG (u16_t)0x0001U /* turn on debugging info recording */ #define SOF_ACCEPTCONN (u16_t)0x0002U /* socket has had listen() */ #define SOF_REUSEADDR (u16_t)0x0004U /* allow local address reuse */ #define SOF_KEEPALIVE (u16_t)0x0008U /* keep connections alive */ #define SOF_DONTROUTE (u16_t)0x0010U /* just use interface addresses */ #define SOF_BROADCAST (u16_t)0x0020U /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */ #define SOF_USELOOPBACK (u16_t)0x0040U /* bypass hardware when possible */ #define SOF_LINGER (u16_t)0x0080U /* linger on close if data present */ #define SOF_OOBINLINE (u16_t)0x0100U /* leave received OOB data in line */ #define SOF_REUSEPORT (u16_t)0x0200U /* allow local address & port reuse */ #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" #endif PACK_STRUCT_BEGIN struct ip_hdr { /* version / header length / type of service */ PACK_STRUCT_FIELD(u16_t _v_hl_tos); /* total length */ PACK_STRUCT_FIELD(u16_t _len); /* identification */ PACK_STRUCT_FIELD(u16_t _id); /* fragment offset field */ PACK_STRUCT_FIELD(u16_t _offset); #define IP_RF 0x8000 /* reserved fragment flag */ #define IP_DF 0x4000 /* dont fragment flag */ #define IP_MF 0x2000 /* more fragments flag */ #define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ /* time to live / protocol*/ PACK_STRUCT_FIELD(u16_t _ttl_proto); /* checksum */ PACK_STRUCT_FIELD(u16_t _chksum); /* source and destination IP addresses */ PACK_STRUCT_FIELD(struct ip_addr src); PACK_STRUCT_FIELD(struct ip_addr dest); } PACK_STRUCT_STRUCT; PACK_STRUCT_END #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/epstruct.h" #endif #define IPH_V(hdr) (ntohs((hdr)->_v_hl_tos) >> 12) #define IPH_HL(hdr) ((ntohs((hdr)->_v_hl_tos) >> 8) & 0x0f) #define IPH_TOS(hdr) (ntohs((hdr)->_v_hl_tos) & 0xff) #define IPH_LEN(hdr) ((hdr)->_len) #define IPH_ID(hdr) ((hdr)->_id) #define IPH_OFFSET(hdr) ((hdr)->_offset) #define IPH_TTL(hdr) (ntohs((hdr)->_ttl_proto) >> 8) #define IPH_PROTO(hdr) (ntohs((hdr)->_ttl_proto) & 0xff) #define IPH_CHKSUM(hdr) ((hdr)->_chksum) #define IPH_VHLTOS_SET(hdr, v, hl, tos) (hdr)->_v_hl_tos = (htons(((v) << 12) | ((hl) << 8) | (tos))) #define IPH_LEN_SET(hdr, len) (hdr)->_len = (len) #define IPH_ID_SET(hdr, id) (hdr)->_id = (id) #define IPH_OFFSET_SET(hdr, off) (hdr)->_offset = (off) #define IPH_TTL_SET(hdr, ttl) (hdr)->_ttl_proto = (htons(IPH_PROTO(hdr) | ((u16_t)(ttl) << 8))) #define IPH_PROTO_SET(hdr, proto) (hdr)->_ttl_proto = (htons((proto) | (IPH_TTL(hdr) << 8))) #define IPH_CHKSUM_SET(hdr, chksum) (hdr)->_chksum = (chksum) /** The interface that provided the packet for the current callback invocation. */ extern struct netif *current_netif; /** Header of the input packet currently being processed. */ extern const struct ip_hdr *current_header; #define ip_init() /* Compatibility define, not init needed. */ struct netif *ip_route(struct ip_addr *dest); err_t ip_input(struct pbuf *p, struct netif *inp); err_t ip_output(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, u8_t ttl, u8_t tos, u8_t proto); err_t ip_output_if(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif); #if LWIP_NETIF_HWADDRHINT err_t ip_output_hinted(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, u8_t ttl, u8_t tos, u8_t proto, u8_t *addr_hint); #endif /* LWIP_NETIF_HWADDRHINT */ #if IP_OPTIONS_SEND err_t ip_output_if_opt(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, u16_t optlen); #endif /* IP_OPTIONS_SEND */ /** Get the interface that received the current packet. * This function must only be called from a receive callback (udp_recv, * raw_recv, tcp_accept). It will return NULL otherwise. */ #define ip_current_netif() (current_netif) /** Get the IP header of the current packet. * This function must only be called from a receive callback (udp_recv, * raw_recv, tcp_accept). It will return NULL otherwise. */ #define ip_current_header() (current_header) #if IP_DEBUG void ip_debug_print(struct pbuf *p); #else #define ip_debug_print(p) #endif /* IP_DEBUG */ #ifdef __cplusplus } #endif #endif /* __LWIP_IP_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/ip_addr.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIP_IP_ADDR_H__ #define __LWIP_IP_ADDR_H__ #include "lwip/opt.h" #include "lwip/inet.h" #ifdef __cplusplus extern "C" { #endif #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" #endif PACK_STRUCT_BEGIN struct ip_addr { PACK_STRUCT_FIELD(u32_t addr); } PACK_STRUCT_STRUCT; PACK_STRUCT_END #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/epstruct.h" #endif /* * struct ipaddr2 is used in the definition of the ARP packet format in * order to support compilers that don't have structure packing. */ #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" #endif PACK_STRUCT_BEGIN struct ip_addr2 { PACK_STRUCT_FIELD(u16_t addrw[2]); } PACK_STRUCT_STRUCT; PACK_STRUCT_END #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/epstruct.h" #endif struct netif; extern const struct ip_addr ip_addr_any; extern const struct ip_addr ip_addr_broadcast; /** IP_ADDR_ can be used as a fixed IP address * for the wildcard and the broadcast address */ #define IP_ADDR_ANY ((struct ip_addr *)&ip_addr_any) #define IP_ADDR_BROADCAST ((struct ip_addr *)&ip_addr_broadcast) /* Definitions of the bits in an Internet address integer. On subnets, host and network parts are found according to the subnet mask, not these masks. */ #define IN_CLASSA(a) ((((u32_t)(a)) & 0x80000000UL) == 0) #define IN_CLASSA_NET 0xff000000 #define IN_CLASSA_NSHIFT 24 #define IN_CLASSA_HOST (0xffffffff & ~IN_CLASSA_NET) #define IN_CLASSA_MAX 128 #define IN_CLASSB(a) ((((u32_t)(a)) & 0xc0000000UL) == 0x80000000UL) #define IN_CLASSB_NET 0xffff0000 #define IN_CLASSB_NSHIFT 16 #define IN_CLASSB_HOST (0xffffffff & ~IN_CLASSB_NET) #define IN_CLASSB_MAX 65536 #define IN_CLASSC(a) ((((u32_t)(a)) & 0xe0000000UL) == 0xc0000000UL) #define IN_CLASSC_NET 0xffffff00 #define IN_CLASSC_NSHIFT 8 #define IN_CLASSC_HOST (0xffffffff & ~IN_CLASSC_NET) #define IN_CLASSD(a) (((u32_t)(a) & 0xf0000000UL) == 0xe0000000UL) #define IN_CLASSD_NET 0xf0000000 /* These ones aren't really */ #define IN_CLASSD_NSHIFT 28 /* net and host fields, but */ #define IN_CLASSD_HOST 0x0fffffff /* routing needn't know. */ #define IN_MULTICAST(a) IN_CLASSD(a) #define IN_EXPERIMENTAL(a) (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL) #define IN_BADCLASS(a) (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL) #define IN_LOOPBACKNET 127 /* official! */ #define IP4_ADDR(ipaddr, a,b,c,d) \ (ipaddr)->addr = htonl(((u32_t)((a) & 0xff) << 24) | \ ((u32_t)((b) & 0xff) << 16) | \ ((u32_t)((c) & 0xff) << 8) | \ (u32_t)((d) & 0xff)) #define ip_addr_set(dest, src) (dest)->addr = \ ((src) == NULL? 0:\ (src)->addr) /** * Determine if two address are on the same network. * * @arg addr1 IP address 1 * @arg addr2 IP address 2 * @arg mask network identifier mask * @return !0 if the network identifiers of both address match */ #define ip_addr_netcmp(addr1, addr2, mask) (((addr1)->addr & \ (mask)->addr) == \ ((addr2)->addr & \ (mask)->addr)) #define ip_addr_cmp(addr1, addr2) ((addr1)->addr == (addr2)->addr) #define ip_addr_isany(addr1) ((addr1) == NULL || (addr1)->addr == 0) u8_t ip_addr_isbroadcast(struct ip_addr *, struct netif *); #define ip_addr_ismulticast(addr1) (((addr1)->addr & ntohl(0xf0000000UL)) == ntohl(0xe0000000UL)) #define ip_addr_islinklocal(addr1) (((addr1)->addr & ntohl(0xffff0000UL)) == ntohl(0xa9fe0000UL)) #define ip_addr_debug_print(debug, ipaddr) \ LWIP_DEBUGF(debug, ("%"U16_F".%"U16_F".%"U16_F".%"U16_F, \ ipaddr != NULL ? \ (u16_t)(ntohl((ipaddr)->addr) >> 24) & 0xff : 0, \ ipaddr != NULL ? \ (u16_t)(ntohl((ipaddr)->addr) >> 16) & 0xff : 0, \ ipaddr != NULL ? \ (u16_t)(ntohl((ipaddr)->addr) >> 8) & 0xff : 0, \ ipaddr != NULL ? \ (u16_t)ntohl((ipaddr)->addr) & 0xff : 0)) /* These are cast to u16_t, with the intent that they are often arguments * to printf using the U16_F format from cc.h. */ #define ip4_addr1(ipaddr) ((u16_t)(ntohl((ipaddr)->addr) >> 24) & 0xff) #define ip4_addr2(ipaddr) ((u16_t)(ntohl((ipaddr)->addr) >> 16) & 0xff) #define ip4_addr3(ipaddr) ((u16_t)(ntohl((ipaddr)->addr) >> 8) & 0xff) #define ip4_addr4(ipaddr) ((u16_t)(ntohl((ipaddr)->addr)) & 0xff) /** * Same as inet_ntoa() but takes a struct ip_addr* */ #define ip_ntoa(addr) ((addr != NULL) ? inet_ntoa(*((struct in_addr*)(addr))) : "NULL") #ifdef __cplusplus } #endif #endif /* __LWIP_IP_ADDR_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/ip_frag.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Jani Monoses * */ #ifndef __LWIP_IP_FRAG_H__ #define __LWIP_IP_FRAG_H__ #include "lwip/opt.h" #include "lwip/err.h" #include "lwip/pbuf.h" #include "lwip/netif.h" #include "lwip/ip_addr.h" #include "lwip/ip.h" #ifdef __cplusplus extern "C" { #endif #if IP_REASSEMBLY /* The IP reassembly timer interval in milliseconds. */ #define IP_TMR_INTERVAL 1000 /* IP reassembly helper struct. * This is exported because memp needs to know the size. */ struct ip_reassdata { struct ip_reassdata *next; struct pbuf *p; struct ip_hdr iphdr; u16_t datagram_len; u8_t flags; u8_t timer; }; void ip_reass_init(void); void ip_reass_tmr(void); struct pbuf * ip_reass(struct pbuf *p); #endif /* IP_REASSEMBLY */ #if IP_FRAG err_t ip_frag(struct pbuf *p, struct netif *netif, struct ip_addr *dest); #endif /* IP_FRAG */ #ifdef __cplusplus } #endif #endif /* __LWIP_IP_FRAG_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/api.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIP_API_H__ #define __LWIP_API_H__ #include "lwip/opt.h" #if LWIP_NETCONN /* don't build if not configured for use in lwipopts.h */ #include /* for size_t */ #include "lwip/netbuf.h" #include "lwip/sys.h" #include "lwip/ip_addr.h" #include "lwip/err.h" #ifdef __cplusplus extern "C" { #endif /* Throughout this file, IP addresses and port numbers are expected to be in * the same byte order as in the corresponding pcb. */ /* Flags for netconn_write */ #define NETCONN_NOFLAG 0x00 #define NETCONN_NOCOPY 0x00 /* Only for source code compatibility */ #define NETCONN_COPY 0x01 #define NETCONN_MORE 0x02 /* Helpers to process several netconn_types by the same code */ #define NETCONNTYPE_GROUP(t) (t&0xF0) #define NETCONNTYPE_DATAGRAM(t) (t&0xE0) enum netconn_type { NETCONN_INVALID = 0, /* NETCONN_TCP Group */ NETCONN_TCP = 0x10, /* NETCONN_UDP Group */ NETCONN_UDP = 0x20, NETCONN_UDPLITE = 0x21, NETCONN_UDPNOCHKSUM= 0x22, /* NETCONN_RAW Group */ NETCONN_RAW = 0x40 }; enum netconn_state { NETCONN_NONE, NETCONN_WRITE, NETCONN_LISTEN, NETCONN_CONNECT, NETCONN_CLOSE }; enum netconn_evt { NETCONN_EVT_RCVPLUS, NETCONN_EVT_RCVMINUS, NETCONN_EVT_SENDPLUS, NETCONN_EVT_SENDMINUS }; #if LWIP_IGMP enum netconn_igmp { NETCONN_JOIN, NETCONN_LEAVE }; #endif /* LWIP_IGMP */ /* forward-declare some structs to avoid to include their headers */ struct ip_pcb; struct tcp_pcb; struct udp_pcb; struct raw_pcb; struct netconn; /** A callback prototype to inform about events for a netconn */ typedef void (* netconn_callback)(struct netconn *, enum netconn_evt, u16_t len); /** A netconn descriptor */ struct netconn { /** type of the netconn (TCP, UDP or RAW) */ enum netconn_type type; /** current state of the netconn */ enum netconn_state state; /** the lwIP internal protocol control block */ union { struct ip_pcb *ip; struct tcp_pcb *tcp; struct udp_pcb *udp; struct raw_pcb *raw; } pcb; /** the last error this netconn had */ err_t err; /** sem that is used to synchroneously execute functions in the core context */ sys_sem_t op_completed; /** mbox where received packets are stored until they are fetched by the netconn application thread (can grow quite big) */ sys_mbox_t recvmbox; /** mbox where new connections are stored until processed by the application thread */ sys_mbox_t acceptmbox; /** only used for socket layer */ int socket; #if LWIP_SO_RCVTIMEO /** timeout to wait for new data to be received (or connections to arrive for listening netconns) */ int recv_timeout; #endif /* LWIP_SO_RCVTIMEO */ #if LWIP_SO_RCVBUF /** maximum amount of bytes queued in recvmbox */ int recv_bufsize; #endif /* LWIP_SO_RCVBUF */ s16_t recv_avail; #if LWIP_TCP /** TCP: when data passed to netconn_write doesn't fit into the send buffer, this temporarily stores the message. */ struct api_msg_msg *write_msg; /** TCP: when data passed to netconn_write doesn't fit into the send buffer, this temporarily stores how much is already sent. */ size_t write_offset; #if LWIP_TCPIP_CORE_LOCKING /** TCP: when data passed to netconn_write doesn't fit into the send buffer, this temporarily stores whether to wake up the original application task if data couldn't be sent in the first try. */ u8_t write_delayed; #endif /* LWIP_TCPIP_CORE_LOCKING */ #endif /* LWIP_TCP */ /** A callback function that is informed about events for this netconn */ netconn_callback callback; }; /* Register an Network connection event */ #define API_EVENT(c,e,l) if (c->callback) { \ (*c->callback)(c, e, l); \ } /* Network connection functions: */ #define netconn_new(t) netconn_new_with_proto_and_callback(t, 0, NULL) #define netconn_new_with_callback(t, c) netconn_new_with_proto_and_callback(t, 0, c) struct netconn *netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto, netconn_callback callback); err_t netconn_delete (struct netconn *conn); /** Get the type of a netconn (as enum netconn_type). */ #define netconn_type(conn) (conn->type) err_t netconn_getaddr (struct netconn *conn, struct ip_addr *addr, u16_t *port, u8_t local); #define netconn_peer(c,i,p) netconn_getaddr(c,i,p,0) #define netconn_addr(c,i,p) netconn_getaddr(c,i,p,1) err_t netconn_bind (struct netconn *conn, struct ip_addr *addr, u16_t port); err_t netconn_connect (struct netconn *conn, struct ip_addr *addr, u16_t port); err_t netconn_disconnect (struct netconn *conn); err_t netconn_listen_with_backlog(struct netconn *conn, u8_t backlog); #define netconn_listen(conn) netconn_listen_with_backlog(conn, TCP_DEFAULT_LISTEN_BACKLOG) struct netconn * netconn_accept (struct netconn *conn); struct netbuf * netconn_recv (struct netconn *conn); err_t netconn_sendto (struct netconn *conn, struct netbuf *buf, struct ip_addr *addr, u16_t port); err_t netconn_send (struct netconn *conn, struct netbuf *buf); err_t netconn_write (struct netconn *conn, const void *dataptr, size_t size, u8_t apiflags); err_t netconn_close (struct netconn *conn); #if LWIP_IGMP err_t netconn_join_leave_group (struct netconn *conn, struct ip_addr *multiaddr, struct ip_addr *interface, enum netconn_igmp join_or_leave); #endif /* LWIP_IGMP */ #if LWIP_DNS err_t netconn_gethostbyname(const char *name, struct ip_addr *addr); #endif /* LWIP_DNS */ #define netconn_err(conn) ((conn)->err) #define netconn_recv_bufsize(conn) ((conn)->recv_bufsize) #ifdef __cplusplus } #endif #endif /* LWIP_NETCONN */ #endif /* __LWIP_API_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/api_msg.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIP_API_MSG_H__ #define __LWIP_API_MSG_H__ #include "lwip/opt.h" #if LWIP_NETCONN /* don't build if not configured for use in lwipopts.h */ #include /* for size_t */ #include "lwip/ip_addr.h" #include "lwip/err.h" #include "lwip/sys.h" #include "lwip/igmp.h" #include "lwip/api.h" #ifdef __cplusplus extern "C" { #endif /* IP addresses and port numbers are expected to be in * the same byte order as in the corresponding pcb. */ /** This struct includes everything that is necessary to execute a function for a netconn in another thread context (mainly used to process netconns in the tcpip_thread context to be thread safe). */ struct api_msg_msg { /** The netconn which to process - always needed: it includes the semaphore which is used to block the application thread until the function finished. */ struct netconn *conn; /** Depending on the executed function, one of these union members is used */ union { /** used for do_send */ struct netbuf *b; /** used for do_newconn */ struct { u8_t proto; } n; /** used for do_bind and do_connect */ struct { struct ip_addr *ipaddr; u16_t port; } bc; /** used for do_getaddr */ struct { struct ip_addr *ipaddr; u16_t *port; u8_t local; } ad; /** used for do_write */ struct { const void *dataptr; size_t len; u8_t apiflags; } w; /** used for do_recv */ struct { u16_t len; } r; #if LWIP_IGMP /** used for do_join_leave_group */ struct { struct ip_addr *multiaddr; struct ip_addr *interface; enum netconn_igmp join_or_leave; } jl; #endif /* LWIP_IGMP */ #if TCP_LISTEN_BACKLOG struct { u8_t backlog; } lb; #endif /* TCP_LISTEN_BACKLOG */ } msg; }; /** This struct contains a function to execute in another thread context and a struct api_msg_msg that serves as an argument for this function. This is passed to tcpip_apimsg to execute functions in tcpip_thread context. */ struct api_msg { /** function to execute in tcpip_thread context */ void (* function)(struct api_msg_msg *msg); /** arguments for this function */ struct api_msg_msg msg; }; #if LWIP_DNS /** As do_gethostbyname requires more arguments but doesn't require a netconn, it has its own struct (to avoid struct api_msg getting bigger than necessary). do_gethostbyname must be called using tcpip_callback instead of tcpip_apimsg (see netconn_gethostbyname). */ struct dns_api_msg { /** Hostname to query or dotted IP address string */ const char *name; /** Rhe resolved address is stored here */ struct ip_addr *addr; /** This semaphore is posted when the name is resolved, the application thread should wait on it. */ sys_sem_t sem; /** Errors are given back here */ err_t *err; }; #endif /* LWIP_DNS */ void do_newconn ( struct api_msg_msg *msg); void do_delconn ( struct api_msg_msg *msg); void do_bind ( struct api_msg_msg *msg); void do_connect ( struct api_msg_msg *msg); void do_disconnect ( struct api_msg_msg *msg); void do_listen ( struct api_msg_msg *msg); void do_send ( struct api_msg_msg *msg); void do_recv ( struct api_msg_msg *msg); void do_write ( struct api_msg_msg *msg); void do_getaddr ( struct api_msg_msg *msg); void do_close ( struct api_msg_msg *msg); #if LWIP_IGMP void do_join_leave_group( struct api_msg_msg *msg); #endif /* LWIP_IGMP */ #if LWIP_DNS void do_gethostbyname(void *arg); #endif /* LWIP_DNS */ struct netconn* netconn_alloc(enum netconn_type t, netconn_callback callback); void netconn_free(struct netconn *conn); #ifdef __cplusplus } #endif #endif /* LWIP_NETCONN */ #endif /* __LWIP_API_MSG_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/arch.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIP_ARCH_H__ #define __LWIP_ARCH_H__ #ifndef LITTLE_ENDIAN #define LITTLE_ENDIAN 1234 #endif #ifndef BIG_ENDIAN #define BIG_ENDIAN 4321 #endif #include "arch/cc.h" /** Temporary: define format string for size_t if not defined in cc.h */ #ifndef SZT_F #define SZT_F U32_F #endif /* SZT_F */ #ifdef __cplusplus extern "C" { #endif #ifndef PACK_STRUCT_BEGIN #define PACK_STRUCT_BEGIN #endif /* PACK_STRUCT_BEGIN */ #ifndef PACK_STRUCT_END #define PACK_STRUCT_END #endif /* PACK_STRUCT_END */ #ifndef PACK_STRUCT_FIELD #define PACK_STRUCT_FIELD(x) x #endif /* PACK_STRUCT_FIELD */ #ifndef LWIP_UNUSED_ARG #define LWIP_UNUSED_ARG(x) (void)x #endif /* LWIP_UNUSED_ARG */ #ifdef LWIP_PROVIDE_ERRNO #define EPERM 1 /* Operation not permitted */ #define ENOENT 2 /* No such file or directory */ #define ESRCH 3 /* No such process */ #define EINTR 4 /* Interrupted system call */ #define EIO 5 /* I/O error */ #define ENXIO 6 /* No such device or address */ #define E2BIG 7 /* Arg list too long */ #define ENOEXEC 8 /* Exec format error */ #define EBADF 9 /* Bad file number */ #define ECHILD 10 /* No child processes */ #define EAGAIN 11 /* Try again */ #define ENOMEM 12 /* Out of memory */ #define EACCES 13 /* Permission denied */ #define EFAULT 14 /* Bad address */ #define ENOTBLK 15 /* Block device required */ #define EBUSY 16 /* Device or resource busy */ #define EEXIST 17 /* File exists */ #define EXDEV 18 /* Cross-device link */ #define ENODEV 19 /* No such device */ #define ENOTDIR 20 /* Not a directory */ #define EISDIR 21 /* Is a directory */ #define EINVAL 22 /* Invalid argument */ #define ENFILE 23 /* File table overflow */ #define EMFILE 24 /* Too many open files */ #define ENOTTY 25 /* Not a typewriter */ #define ETXTBSY 26 /* Text file busy */ #define EFBIG 27 /* File too large */ #define ENOSPC 28 /* No space left on device */ #define ESPIPE 29 /* Illegal seek */ #define EROFS 30 /* Read-only file system */ #define EMLINK 31 /* Too many links */ #define EPIPE 32 /* Broken pipe */ #define EDOM 33 /* Math argument out of domain of func */ #define ERANGE 34 /* Math result not representable */ #define EDEADLK 35 /* Resource deadlock would occur */ #define ENAMETOOLONG 36 /* File name too long */ #define ENOLCK 37 /* No record locks available */ #define ENOSYS 38 /* Function not implemented */ #define ENOTEMPTY 39 /* Directory not empty */ #define ELOOP 40 /* Too many symbolic links encountered */ #define EWOULDBLOCK EAGAIN /* Operation would block */ #define ENOMSG 42 /* No message of desired type */ #define EIDRM 43 /* Identifier removed */ #define ECHRNG 44 /* Channel number out of range */ #define EL2NSYNC 45 /* Level 2 not synchronized */ #define EL3HLT 46 /* Level 3 halted */ #define EL3RST 47 /* Level 3 reset */ #define ELNRNG 48 /* Link number out of range */ #define EUNATCH 49 /* Protocol driver not attached */ #define ENOCSI 50 /* No CSI structure available */ #define EL2HLT 51 /* Level 2 halted */ #define EBADE 52 /* Invalid exchange */ #define EBADR 53 /* Invalid request descriptor */ #define EXFULL 54 /* Exchange full */ #define ENOANO 55 /* No anode */ #define EBADRQC 56 /* Invalid request code */ #define EBADSLT 57 /* Invalid slot */ #define EDEADLOCK EDEADLK #define EBFONT 59 /* Bad font file format */ #define ENOSTR 60 /* Device not a stream */ #define ENODATA 61 /* No data available */ #define ETIME 62 /* Timer expired */ #define ENOSR 63 /* Out of streams resources */ #define ENONET 64 /* Machine is not on the network */ #define ENOPKG 65 /* Package not installed */ #define EREMOTE 66 /* Object is remote */ #define ENOLINK 67 /* Link has been severed */ #define EADV 68 /* Advertise error */ #define ESRMNT 69 /* Srmount error */ #define ECOMM 70 /* Communication error on send */ #define EPROTO 71 /* Protocol error */ #define EMULTIHOP 72 /* Multihop attempted */ #define EDOTDOT 73 /* RFS specific error */ #define EBADMSG 74 /* Not a data message */ #define EOVERFLOW 75 /* Value too large for defined data type */ #define ENOTUNIQ 76 /* Name not unique on network */ #define EBADFD 77 /* File descriptor in bad state */ #define EREMCHG 78 /* Remote address changed */ #define ELIBACC 79 /* Can not access a needed shared library */ #define ELIBBAD 80 /* Accessing a corrupted shared library */ #define ELIBSCN 81 /* .lib section in a.out corrupted */ #define ELIBMAX 82 /* Attempting to link in too many shared libraries */ #define ELIBEXEC 83 /* Cannot exec a shared library directly */ #define EILSEQ 84 /* Illegal byte sequence */ #define ERESTART 85 /* Interrupted system call should be restarted */ #define ESTRPIPE 86 /* Streams pipe error */ #define EUSERS 87 /* Too many users */ #define ENOTSOCK 88 /* Socket operation on non-socket */ #define EDESTADDRREQ 89 /* Destination address required */ #define EMSGSIZE 90 /* Message too long */ #define EPROTOTYPE 91 /* Protocol wrong type for socket */ #define ENOPROTOOPT 92 /* Protocol not available */ #define EPROTONOSUPPORT 93 /* Protocol not supported */ #define ESOCKTNOSUPPORT 94 /* Socket type not supported */ #define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ #define EPFNOSUPPORT 96 /* Protocol family not supported */ #define EAFNOSUPPORT 97 /* Address family not supported by protocol */ #define EADDRINUSE 98 /* Address already in use */ #define EADDRNOTAVAIL 99 /* Cannot assign requested address */ #define ENETDOWN 100 /* Network is down */ #define ENETUNREACH 101 /* Network is unreachable */ #define ENETRESET 102 /* Network dropped connection because of reset */ #define ECONNABORTED 103 /* Software caused connection abort */ #define ECONNRESET 104 /* Connection reset by peer */ #define ENOBUFS 105 /* No buffer space available */ #define EISCONN 106 /* Transport endpoint is already connected */ #define ENOTCONN 107 /* Transport endpoint is not connected */ #define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */ #define ETOOMANYREFS 109 /* Too many references: cannot splice */ #define ETIMEDOUT 110 /* Connection timed out */ #define ECONNREFUSED 111 /* Connection refused */ #define EHOSTDOWN 112 /* Host is down */ #define EHOSTUNREACH 113 /* No route to host */ #define EALREADY 114 /* Operation already in progress */ #define EINPROGRESS 115 /* Operation now in progress */ #define ESTALE 116 /* Stale NFS file handle */ #define EUCLEAN 117 /* Structure needs cleaning */ #define ENOTNAM 118 /* Not a XENIX named type file */ #define ENAVAIL 119 /* No XENIX semaphores available */ #define EISNAM 120 /* Is a named type file */ #define EREMOTEIO 121 /* Remote I/O error */ #define EDQUOT 122 /* Quota exceeded */ #define ENOMEDIUM 123 /* No medium found */ #define EMEDIUMTYPE 124 /* Wrong medium type */ #define ENSROK 0 /* DNS server returned answer with no data */ #define ENSRNODATA 160 /* DNS server returned answer with no data */ #define ENSRFORMERR 161 /* DNS server claims query was misformatted */ #define ENSRSERVFAIL 162 /* DNS server returned general failure */ #define ENSRNOTFOUND 163 /* Domain name not found */ #define ENSRNOTIMP 164 /* DNS server does not implement requested operation */ #define ENSRREFUSED 165 /* DNS server refused query */ #define ENSRBADQUERY 166 /* Misformatted DNS query */ #define ENSRBADNAME 167 /* Misformatted domain name */ #define ENSRBADFAMILY 168 /* Unsupported address family */ #define ENSRBADRESP 169 /* Misformatted DNS reply */ #define ENSRCONNREFUSED 170 /* Could not contact DNS servers */ #define ENSRTIMEOUT 171 /* Timeout while contacting DNS servers */ #define ENSROF 172 /* End of file */ #define ENSRFILE 173 /* Error reading file */ #define ENSRNOMEM 174 /* Out of memory */ #define ENSRDESTRUCTION 175 /* Application terminated lookup */ #define ENSRQUERYDOMAINTOOLONG 176 /* Domain name is too long */ #define ENSRCNAMELOOP 177 /* Domain name is too long */ #ifndef errno extern int errno; #endif #endif /* LWIP_PROVIDE_ERRNO */ #ifdef __cplusplus } #endif #endif /* __LWIP_ARCH_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/debug.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIP_DEBUG_H__ #define __LWIP_DEBUG_H__ #include "lwip/arch.h" /** lower two bits indicate debug level * - 0 all * - 1 warning * - 2 serious * - 3 severe */ #define LWIP_DBG_LEVEL_ALL 0x00 #define LWIP_DBG_LEVEL_OFF LWIP_DBG_LEVEL_ALL /* compatibility define only */ #define LWIP_DBG_LEVEL_WARNING 0x01 /* bad checksums, dropped packets, ... */ #define LWIP_DBG_LEVEL_SERIOUS 0x02 /* memory allocation failures, ... */ #define LWIP_DBG_LEVEL_SEVERE 0x03 #define LWIP_DBG_MASK_LEVEL 0x03 /** flag for LWIP_DEBUGF to enable that debug message */ #define LWIP_DBG_ON 0x80U /** flag for LWIP_DEBUGF to disable that debug message */ #define LWIP_DBG_OFF 0x00U /** flag for LWIP_DEBUGF indicating a tracing message (to follow program flow) */ #define LWIP_DBG_TRACE 0x40U /** flag for LWIP_DEBUGF indicating a state debug message (to follow module states) */ #define LWIP_DBG_STATE 0x20U /** flag for LWIP_DEBUGF indicating newly added code, not thoroughly tested yet */ #define LWIP_DBG_FRESH 0x10U /** flag for LWIP_DEBUGF to halt after printing this debug message */ #define LWIP_DBG_HALT 0x08U #ifndef LWIP_NOASSERT #define LWIP_ASSERT(message, assertion) do { if(!(assertion)) \ LWIP_PLATFORM_ASSERT(message); } while(0) #else /* LWIP_NOASSERT */ #define LWIP_ASSERT(message, assertion) #endif /* LWIP_NOASSERT */ /** if "expression" isn't true, then print "message" and execute "handler" expression */ #ifndef LWIP_ERROR #define LWIP_ERROR(message, expression, handler) do { if (!(expression)) { \ LWIP_PLATFORM_ASSERT(message); handler;}} while(0) #endif /* LWIP_ERROR */ #ifdef LWIP_DEBUG /** print debug message only if debug message type is enabled... * AND is of correct type AND is at least LWIP_DBG_LEVEL */ #define LWIP_DEBUGF(debug, message) do { \ if ( \ ((debug) & LWIP_DBG_ON) && \ ((debug) & LWIP_DBG_TYPES_ON) && \ ((s16_t)((debug) & LWIP_DBG_MASK_LEVEL) >= LWIP_DBG_MIN_LEVEL)) { \ LWIP_PLATFORM_DIAG(message); \ if ((debug) & LWIP_DBG_HALT) { \ while(1); \ } \ } \ } while(0) #else /* LWIP_DEBUG */ #define LWIP_DEBUGF(debug, message) #endif /* LWIP_DEBUG */ #endif /* __LWIP_DEBUG_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/def.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIP_DEF_H__ #define __LWIP_DEF_H__ /* this might define NULL already */ #include "lwip/arch.h" #define LWIP_MAX(x , y) (((x) > (y)) ? (x) : (y)) #define LWIP_MIN(x , y) (((x) < (y)) ? (x) : (y)) #ifndef NULL #define NULL ((void *)0) #endif #endif /* __LWIP_DEF_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/dhcp.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** @file */ #ifndef __LWIP_DHCP_H__ #define __LWIP_DHCP_H__ #include "lwip/opt.h" #if LWIP_DHCP /* don't build if not configured for use in lwipopts.h */ #include "lwip/netif.h" #include "lwip/udp.h" #ifdef __cplusplus extern "C" { #endif /** period (in seconds) of the application calling dhcp_coarse_tmr() */ #define DHCP_COARSE_TIMER_SECS 60 /** period (in milliseconds) of the application calling dhcp_coarse_tmr() */ #define DHCP_COARSE_TIMER_MSECS (DHCP_COARSE_TIMER_SECS * 1000UL) /** period (in milliseconds) of the application calling dhcp_fine_tmr() */ #define DHCP_FINE_TIMER_MSECS 500 struct dhcp { /** transaction identifier of last sent request */ u32_t xid; /** our connection to the DHCP server */ struct udp_pcb *pcb; /** incoming msg */ struct dhcp_msg *msg_in; /** incoming msg options */ void *options_in; /** ingoing msg options length */ u16_t options_in_len; /** current DHCP state machine state */ u8_t state; /** retries of current request */ u8_t tries; struct pbuf *p_out; /* pbuf of outcoming msg */ struct dhcp_msg *msg_out; /* outgoing msg */ u16_t options_out_len; /* outgoing msg options length */ u16_t request_timeout; /* #ticks with period DHCP_FINE_TIMER_SECS for request timeout */ u16_t t1_timeout; /* #ticks with period DHCP_COARSE_TIMER_SECS for renewal time */ u16_t t2_timeout; /* #ticks with period DHCP_COARSE_TIMER_SECS for rebind time */ struct ip_addr server_ip_addr; /* dhcp server address that offered this lease */ struct ip_addr offered_ip_addr; struct ip_addr offered_sn_mask; struct ip_addr offered_gw_addr; struct ip_addr offered_bc_addr; #define DHCP_MAX_DNS 2 u32_t dns_count; /* actual number of DNS servers obtained */ struct ip_addr offered_dns_addr[DHCP_MAX_DNS]; /* DNS server addresses */ u32_t offered_t0_lease; /* lease period (in seconds) */ u32_t offered_t1_renew; /* recommended renew time (usually 50% of lease period) */ u32_t offered_t2_rebind; /* recommended rebind time (usually 66% of lease period) */ #if LWIP_DHCP_AUTOIP_COOP u8_t autoip_coop_state; #endif /** Patch #1308 * TODO: See dhcp.c "TODO"s */ #if 0 struct ip_addr offered_si_addr; u8_t *boot_file_name; #endif }; /* MUST be compiled with "pack structs" or equivalent! */ #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" #endif PACK_STRUCT_BEGIN /** minimum set of fields of any DHCP message */ struct dhcp_msg { PACK_STRUCT_FIELD(u8_t op); PACK_STRUCT_FIELD(u8_t htype); PACK_STRUCT_FIELD(u8_t hlen); PACK_STRUCT_FIELD(u8_t hops); PACK_STRUCT_FIELD(u32_t xid); PACK_STRUCT_FIELD(u16_t secs); PACK_STRUCT_FIELD(u16_t flags); PACK_STRUCT_FIELD(struct ip_addr ciaddr); PACK_STRUCT_FIELD(struct ip_addr yiaddr); PACK_STRUCT_FIELD(struct ip_addr siaddr); PACK_STRUCT_FIELD(struct ip_addr giaddr); #define DHCP_CHADDR_LEN 16U PACK_STRUCT_FIELD(u8_t chaddr[DHCP_CHADDR_LEN]); #define DHCP_SNAME_LEN 64U PACK_STRUCT_FIELD(u8_t sname[DHCP_SNAME_LEN]); #define DHCP_FILE_LEN 128U PACK_STRUCT_FIELD(u8_t file[DHCP_FILE_LEN]); PACK_STRUCT_FIELD(u32_t cookie); #define DHCP_MIN_OPTIONS_LEN 68U /** make sure user does not configure this too small */ #if ((defined(DHCP_OPTIONS_LEN)) && (DHCP_OPTIONS_LEN < DHCP_MIN_OPTIONS_LEN)) # undef DHCP_OPTIONS_LEN #endif /** allow this to be configured in lwipopts.h, but not too small */ #if (!defined(DHCP_OPTIONS_LEN)) /** set this to be sufficient for your options in outgoing DHCP msgs */ # define DHCP_OPTIONS_LEN DHCP_MIN_OPTIONS_LEN #endif PACK_STRUCT_FIELD(u8_t options[DHCP_OPTIONS_LEN]); } PACK_STRUCT_STRUCT; PACK_STRUCT_END #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/epstruct.h" #endif /** start DHCP configuration */ err_t dhcp_start(struct netif *netif); /** enforce early lease renewal (not needed normally)*/ err_t dhcp_renew(struct netif *netif); /** release the DHCP lease, usually called before dhcp_stop()*/ err_t dhcp_release(struct netif *netif); /** stop DHCP configuration */ void dhcp_stop(struct netif *netif); /** inform server of our manual IP address */ void dhcp_inform(struct netif *netif); /** Handle a possible change in the network configuration */ void dhcp_network_changed(struct netif *netif); /** if enabled, check whether the offered IP address is not in use, using ARP */ #if DHCP_DOES_ARP_CHECK void dhcp_arp_reply(struct netif *netif, struct ip_addr *addr); #endif /** to be called every minute */ void dhcp_coarse_tmr(void); /** to be called every half second */ void dhcp_fine_tmr(void); /** DHCP message item offsets and length */ #define DHCP_MSG_OFS (UDP_DATA_OFS) #define DHCP_OP_OFS (DHCP_MSG_OFS + 0) #define DHCP_HTYPE_OFS (DHCP_MSG_OFS + 1) #define DHCP_HLEN_OFS (DHCP_MSG_OFS + 2) #define DHCP_HOPS_OFS (DHCP_MSG_OFS + 3) #define DHCP_XID_OFS (DHCP_MSG_OFS + 4) #define DHCP_SECS_OFS (DHCP_MSG_OFS + 8) #define DHCP_FLAGS_OFS (DHCP_MSG_OFS + 10) #define DHCP_CIADDR_OFS (DHCP_MSG_OFS + 12) #define DHCP_YIADDR_OFS (DHCP_MSG_OFS + 16) #define DHCP_SIADDR_OFS (DHCP_MSG_OFS + 20) #define DHCP_GIADDR_OFS (DHCP_MSG_OFS + 24) #define DHCP_CHADDR_OFS (DHCP_MSG_OFS + 28) #define DHCP_SNAME_OFS (DHCP_MSG_OFS + 44) #define DHCP_FILE_OFS (DHCP_MSG_OFS + 108) #define DHCP_MSG_LEN 236 #define DHCP_COOKIE_OFS (DHCP_MSG_OFS + DHCP_MSG_LEN) #define DHCP_OPTIONS_OFS (DHCP_MSG_OFS + DHCP_MSG_LEN + 4) #define DHCP_CLIENT_PORT 68 #define DHCP_SERVER_PORT 67 /** DHCP client states */ #define DHCP_REQUESTING 1 #define DHCP_INIT 2 #define DHCP_REBOOTING 3 #define DHCP_REBINDING 4 #define DHCP_RENEWING 5 #define DHCP_SELECTING 6 #define DHCP_INFORMING 7 #define DHCP_CHECKING 8 #define DHCP_PERMANENT 9 #define DHCP_BOUND 10 /** not yet implemented #define DHCP_RELEASING 11 */ #define DHCP_BACKING_OFF 12 #define DHCP_OFF 13 /** AUTOIP cooperatation flags */ #define DHCP_AUTOIP_COOP_STATE_OFF 0 #define DHCP_AUTOIP_COOP_STATE_ON 1 #define DHCP_BOOTREQUEST 1 #define DHCP_BOOTREPLY 2 #define DHCP_DISCOVER 1 #define DHCP_OFFER 2 #define DHCP_REQUEST 3 #define DHCP_DECLINE 4 #define DHCP_ACK 5 #define DHCP_NAK 6 #define DHCP_RELEASE 7 #define DHCP_INFORM 8 #define DHCP_HTYPE_ETH 1 #define DHCP_HLEN_ETH 6 #define DHCP_BROADCAST_FLAG 15 #define DHCP_BROADCAST_MASK (1 << DHCP_FLAG_BROADCAST) /** BootP options */ #define DHCP_OPTION_PAD 0 #define DHCP_OPTION_SUBNET_MASK 1 /* RFC 2132 3.3 */ #define DHCP_OPTION_ROUTER 3 #define DHCP_OPTION_DNS_SERVER 6 #define DHCP_OPTION_HOSTNAME 12 #define DHCP_OPTION_IP_TTL 23 #define DHCP_OPTION_MTU 26 #define DHCP_OPTION_BROADCAST 28 #define DHCP_OPTION_TCP_TTL 37 #define DHCP_OPTION_END 255 /** DHCP options */ #define DHCP_OPTION_REQUESTED_IP 50 /* RFC 2132 9.1, requested IP address */ #define DHCP_OPTION_LEASE_TIME 51 /* RFC 2132 9.2, time in seconds, in 4 bytes */ #define DHCP_OPTION_OVERLOAD 52 /* RFC2132 9.3, use file and/or sname field for options */ #define DHCP_OPTION_MESSAGE_TYPE 53 /* RFC 2132 9.6, important for DHCP */ #define DHCP_OPTION_MESSAGE_TYPE_LEN 1 #define DHCP_OPTION_SERVER_ID 54 /* RFC 2132 9.7, server IP address */ #define DHCP_OPTION_PARAMETER_REQUEST_LIST 55 /* RFC 2132 9.8, requested option types */ #define DHCP_OPTION_MAX_MSG_SIZE 57 /* RFC 2132 9.10, message size accepted >= 576 */ #define DHCP_OPTION_MAX_MSG_SIZE_LEN 2 #define DHCP_OPTION_T1 58 /* T1 renewal time */ #define DHCP_OPTION_T2 59 /* T2 rebinding time */ #define DHCP_OPTION_US 60 #define DHCP_OPTION_CLIENT_ID 61 #define DHCP_OPTION_TFTP_SERVERNAME 66 #define DHCP_OPTION_BOOTFILE 67 /** possible combinations of overloading the file and sname fields with options */ #define DHCP_OVERLOAD_NONE 0 #define DHCP_OVERLOAD_FILE 1 #define DHCP_OVERLOAD_SNAME 2 #define DHCP_OVERLOAD_SNAME_FILE 3 #ifdef __cplusplus } #endif #endif /* LWIP_DHCP */ #endif /*__LWIP_DHCP_H__*/ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/dns.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * lwip DNS resolver header file. * Author: Jim Pettinato * April 2007 * ported from uIP resolv.c Copyright (c) 2002-2003, Adam Dunkels. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef __LWIP_DNS_H__ #define __LWIP_DNS_H__ #include "lwip/opt.h" #if LWIP_DNS /* don't build if not configured for use in lwipopts.h */ /** DNS timer period */ #define DNS_TMR_INTERVAL 1000 /** DNS field TYPE used for "Resource Records" */ #define DNS_RRTYPE_A 1 /* a host address */ #define DNS_RRTYPE_NS 2 /* an authoritative name server */ #define DNS_RRTYPE_MD 3 /* a mail destination (Obsolete - use MX) */ #define DNS_RRTYPE_MF 4 /* a mail forwarder (Obsolete - use MX) */ #define DNS_RRTYPE_CNAME 5 /* the canonical name for an alias */ #define DNS_RRTYPE_SOA 6 /* marks the start of a zone of authority */ #define DNS_RRTYPE_MB 7 /* a mailbox domain name (EXPERIMENTAL) */ #define DNS_RRTYPE_MG 8 /* a mail group member (EXPERIMENTAL) */ #define DNS_RRTYPE_MR 9 /* a mail rename domain name (EXPERIMENTAL) */ #define DNS_RRTYPE_NULL 10 /* a null RR (EXPERIMENTAL) */ #define DNS_RRTYPE_WKS 11 /* a well known service description */ #define DNS_RRTYPE_PTR 12 /* a domain name pointer */ #define DNS_RRTYPE_HINFO 13 /* host information */ #define DNS_RRTYPE_MINFO 14 /* mailbox or mail list information */ #define DNS_RRTYPE_MX 15 /* mail exchange */ #define DNS_RRTYPE_TXT 16 /* text strings */ /** DNS field CLASS used for "Resource Records" */ #define DNS_RRCLASS_IN 1 /* the Internet */ #define DNS_RRCLASS_CS 2 /* the CSNET class (Obsolete - used only for examples in some obsolete RFCs) */ #define DNS_RRCLASS_CH 3 /* the CHAOS class */ #define DNS_RRCLASS_HS 4 /* Hesiod [Dyer 87] */ #define DNS_RRCLASS_FLUSH 0x800 /* Flush bit */ /** Callback which is invoked when a hostname is found. * A function of this type must be implemented by the application using the DNS resolver. * @param name pointer to the name that was looked up. * @param ipaddr pointer to a struct ip_addr containing the IP address of the hostname, * or NULL if the name could not be found (or on any other error). * @param callback_arg a user-specified callback argument passed to dns_gethostbyname */ typedef void (*dns_found_callback)(const char *name, struct ip_addr *ipaddr, void *callback_arg); void dns_init(void); void dns_tmr(void); void dns_setserver(u8_t numdns, struct ip_addr *dnsserver); struct ip_addr dns_getserver(u8_t numdns); err_t dns_gethostbyname(const char *hostname, struct ip_addr *addr, dns_found_callback found, void *callback_arg); #if DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC int dns_local_removehost(const char *hostname, const struct ip_addr *addr); err_t dns_local_addhost(const char *hostname, const struct ip_addr *addr); #endif /* DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ #endif /* LWIP_DNS */ #endif /* __LWIP_DNS_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/err.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIP_ERR_H__ #define __LWIP_ERR_H__ #include "lwip/opt.h" #include "lwip/arch.h" #ifdef __cplusplus extern "C" { #endif /** Define LWIP_ERR_T in cc.h if you want to use * a different type for your platform (must be signed). */ #ifdef LWIP_ERR_T typedef LWIP_ERR_T err_t; #else /* LWIP_ERR_T */ typedef s8_t err_t; #endif /* LWIP_ERR_T*/ /* Definitions for error constants. */ #define ERR_OK 0 /* No error, everything OK. */ #define ERR_MEM -1 /* Out of memory error. */ #define ERR_BUF -2 /* Buffer error. */ #define ERR_TIMEOUT -3 /* Timeout. */ #define ERR_RTE -4 /* Routing problem. */ #define ERR_IS_FATAL(e) ((e) < ERR_RTE) #define ERR_ABRT -5 /* Connection aborted. */ #define ERR_RST -6 /* Connection reset. */ #define ERR_CLSD -7 /* Connection closed. */ #define ERR_CONN -8 /* Not connected. */ #define ERR_VAL -9 /* Illegal value. */ #define ERR_ARG -10 /* Illegal argument. */ #define ERR_USE -11 /* Address in use. */ #define ERR_IF -12 /* Low-level netif error */ #define ERR_ISCONN -13 /* Already connected. */ #define ERR_INPROGRESS -14 /* Operation in progress */ #ifdef LWIP_DEBUG extern const char *lwip_strerr(err_t err); #else #define lwip_strerr(x) "" #endif /* LWIP_DEBUG */ #ifdef __cplusplus } #endif #endif /* __LWIP_ERR_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/init.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIP_INIT_H__ #define __LWIP_INIT_H__ #include "lwip/opt.h" #ifdef __cplusplus extern "C" { #endif /** X.x.x: Major version of the stack */ #define LWIP_VERSION_MAJOR 1U /** x.X.x: Minor version of the stack */ #define LWIP_VERSION_MINOR 3U /** x.x.X: Revision of the stack */ #define LWIP_VERSION_REVISION 2U /** For release candidates, this is set to 1..254 * For official releases, this is set to 255 (LWIP_RC_RELEASE) * For development versions (CVS), this is set to 0 (LWIP_RC_DEVELOPMENT) */ #define LWIP_VERSION_RC 255U /** LWIP_VERSION_RC is set to LWIP_RC_RELEASE for official releases */ #define LWIP_RC_RELEASE 255U /** LWIP_VERSION_RC is set to LWIP_RC_DEVELOPMENT for CVS versions */ #define LWIP_RC_DEVELOPMENT 0U #define LWIP_VERSION_IS_RELEASE (LWIP_VERSION_RC == LWIP_RC_RELEASE) #define LWIP_VERSION_IS_DEVELOPMENT (LWIP_VERSION_RC == LWIP_RC_DEVELOPMENT) #define LWIP_VERSION_IS_RC ((LWIP_VERSION_RC != LWIP_RC_RELEASE) && (LWIP_VERSION_RC != LWIP_RC_DEVELOPMENT)) /** Provides the version of the stack */ #define LWIP_VERSION (LWIP_VERSION_MAJOR << 24 | LWIP_VERSION_MINOR << 16 | \ LWIP_VERSION_REVISION << 8 | LWIP_VERSION_RC) /* Modules initialization */ void lwip_init(void); #ifdef __cplusplus } #endif #endif /* __LWIP_INIT_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/mem.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIP_MEM_H__ #define __LWIP_MEM_H__ #include "lwip/opt.h" #ifdef __cplusplus extern "C" { #endif #if MEM_LIBC_MALLOC #include /* for size_t */ typedef size_t mem_size_t; /* aliases for C library malloc() */ #define mem_init() /* in case C library malloc() needs extra protection, * allow these defines to be overridden. */ #ifndef mem_free #define mem_free free #endif #ifndef mem_malloc #define mem_malloc malloc #endif #ifndef mem_calloc #define mem_calloc calloc #endif #ifndef mem_realloc static void *mem_realloc(void *mem, mem_size_t size) { LWIP_UNUSED_ARG(size); return mem; } #endif #else /* MEM_LIBC_MALLOC */ /* MEM_SIZE would have to be aligned, but using 64000 here instead of * 65535 leaves some room for alignment... */ #if MEM_SIZE > 64000l typedef u32_t mem_size_t; #else typedef u16_t mem_size_t; #endif /* MEM_SIZE > 64000 */ #if MEM_USE_POOLS /** mem_init is not used when using pools instead of a heap */ #define mem_init() /** mem_realloc is not used when using pools instead of a heap: we can't free part of a pool element and don't want to copy the rest */ #define mem_realloc(mem, size) (mem) #else /* MEM_USE_POOLS */ /* lwIP alternative malloc */ void mem_init(void); void *mem_realloc(void *mem, mem_size_t size); #endif /* MEM_USE_POOLS */ void *mem_malloc(mem_size_t size); void *mem_calloc(mem_size_t count, mem_size_t size); void mem_free(void *mem); #endif /* MEM_LIBC_MALLOC */ #ifndef LWIP_MEM_ALIGN_SIZE #define LWIP_MEM_ALIGN_SIZE(size) (((size) + MEM_ALIGNMENT - 1) & ~(MEM_ALIGNMENT-1)) #endif #ifndef LWIP_MEM_ALIGN #define LWIP_MEM_ALIGN(addr) ((void *)(((mem_ptr_t)(addr) + MEM_ALIGNMENT - 1) & ~(mem_ptr_t)(MEM_ALIGNMENT-1))) #endif #ifdef __cplusplus } #endif #endif /* __LWIP_MEM_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/memp.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIP_MEMP_H__ #define __LWIP_MEMP_H__ #include "lwip/opt.h" #ifdef __cplusplus extern "C" { #endif /* Create the list of all memory pools managed by memp. MEMP_MAX represents a NULL pool at the end */ typedef enum { #define LWIP_MEMPOOL(name,num,size,desc) MEMP_##name, #include "lwip/memp_std.h" MEMP_MAX } memp_t; #if MEM_USE_POOLS /* Use a helper type to get the start and end of the user "memory pools" for mem_malloc */ typedef enum { /* Get the first (via: MEMP_POOL_HELPER_START = ((u8_t) 1*MEMP_POOL_A + 0*MEMP_POOL_B + 0*MEMP_POOL_C + 0)*/ MEMP_POOL_HELPER_FIRST = ((u8_t) #define LWIP_MEMPOOL(name,num,size,desc) #define LWIP_MALLOC_MEMPOOL_START 1 #define LWIP_MALLOC_MEMPOOL(num, size) * MEMP_POOL_##size + 0 #define LWIP_MALLOC_MEMPOOL_END #include "lwip/memp_std.h" ) , /* Get the last (via: MEMP_POOL_HELPER_END = ((u8_t) 0 + MEMP_POOL_A*0 + MEMP_POOL_B*0 + MEMP_POOL_C*1) */ MEMP_POOL_HELPER_LAST = ((u8_t) #define LWIP_MEMPOOL(name,num,size,desc) #define LWIP_MALLOC_MEMPOOL_START #define LWIP_MALLOC_MEMPOOL(num, size) 0 + MEMP_POOL_##size * #define LWIP_MALLOC_MEMPOOL_END 1 #include "lwip/memp_std.h" ) } memp_pool_helper_t; /* The actual start and stop values are here (cast them over) We use this helper type and these defines so we can avoid using const memp_t values */ #define MEMP_POOL_FIRST ((memp_t) MEMP_POOL_HELPER_FIRST) #define MEMP_POOL_LAST ((memp_t) MEMP_POOL_HELPER_LAST) #endif /* MEM_USE_POOLS */ #if MEMP_MEM_MALLOC || MEM_USE_POOLS extern const u16_t memp_sizes[MEMP_MAX]; #endif /* MEMP_MEM_MALLOC || MEM_USE_POOLS */ #if MEMP_MEM_MALLOC #include "mem.h" #define memp_init() #define memp_malloc(type) mem_malloc(memp_sizes[type]) #define memp_free(type, mem) mem_free(mem) #else /* MEMP_MEM_MALLOC */ #if MEM_USE_POOLS /** This structure is used to save the pool one element came from. */ struct memp_malloc_helper { memp_t poolnr; }; #endif /* MEM_USE_POOLS */ void memp_init(void); #if MEMP_OVERFLOW_CHECK void *memp_malloc_fn(memp_t type, const char* file, const int line); #define memp_malloc(t) memp_malloc_fn((t), __FILE__, __LINE__) #else void *memp_malloc(memp_t type); #endif void memp_free(memp_t type, void *mem); #endif /* MEMP_MEM_MALLOC */ #ifdef __cplusplus } #endif #endif /* __LWIP_MEMP_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/memp_std.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * SETUP: Make sure we define everything we will need. * * We have create three types of pools: * 1) MEMPOOL - standard pools * 2) MALLOC_MEMPOOL - to be used by mem_malloc in mem.c * 3) PBUF_MEMPOOL - a mempool of pbuf's, so include space for the pbuf struct * * If the include'r doesn't require any special treatment of each of the types * above, then will declare #2 & #3 to be just standard mempools. */ #ifndef LWIP_MALLOC_MEMPOOL /* This treats "malloc pools" just like any other pool. The pools are a little bigger to provide 'size' as the amount of user data. */ #define LWIP_MALLOC_MEMPOOL(num, size) LWIP_MEMPOOL(POOL_##size, num, (size + sizeof(struct memp_malloc_helper)), "MALLOC_"#size) #define LWIP_MALLOC_MEMPOOL_START #define LWIP_MALLOC_MEMPOOL_END #endif /* LWIP_MALLOC_MEMPOOL */ #ifndef LWIP_PBUF_MEMPOOL /* This treats "pbuf pools" just like any other pool. * Allocates buffers for a pbuf struct AND a payload size */ #define LWIP_PBUF_MEMPOOL(name, num, payload, desc) LWIP_MEMPOOL(name, num, (MEMP_ALIGN_SIZE(sizeof(struct pbuf)) + MEMP_ALIGN_SIZE(payload)), desc) #endif /* LWIP_PBUF_MEMPOOL */ /* * A list of internal pools used by LWIP. * * LWIP_MEMPOOL(pool_name, number_elements, element_size, pool_description) * creates a pool name MEMP_pool_name. description is used in stats.c */ #if LWIP_RAW LWIP_MEMPOOL(RAW_PCB, MEMP_NUM_RAW_PCB, sizeof(struct raw_pcb), "RAW_PCB") #endif /* LWIP_RAW */ #if LWIP_UDP LWIP_MEMPOOL(UDP_PCB, MEMP_NUM_UDP_PCB, sizeof(struct udp_pcb), "UDP_PCB") #endif /* LWIP_UDP */ #if LWIP_TCP LWIP_MEMPOOL(TCP_PCB, MEMP_NUM_TCP_PCB, sizeof(struct tcp_pcb), "TCP_PCB") LWIP_MEMPOOL(TCP_PCB_LISTEN, MEMP_NUM_TCP_PCB_LISTEN, sizeof(struct tcp_pcb_listen), "TCP_PCB_LISTEN") LWIP_MEMPOOL(TCP_SEG, MEMP_NUM_TCP_SEG, sizeof(struct tcp_seg), "TCP_SEG") #endif /* LWIP_TCP */ #if IP_REASSEMBLY LWIP_MEMPOOL(REASSDATA, MEMP_NUM_REASSDATA, sizeof(struct ip_reassdata), "REASSDATA") #endif /* IP_REASSEMBLY */ #if LWIP_NETCONN LWIP_MEMPOOL(NETBUF, MEMP_NUM_NETBUF, sizeof(struct netbuf), "NETBUF") LWIP_MEMPOOL(NETCONN, MEMP_NUM_NETCONN, sizeof(struct netconn), "NETCONN") #endif /* LWIP_NETCONN */ #if NO_SYS==0 LWIP_MEMPOOL(TCPIP_MSG_API, MEMP_NUM_TCPIP_MSG_API, sizeof(struct tcpip_msg), "TCPIP_MSG_API") LWIP_MEMPOOL(TCPIP_MSG_INPKT,MEMP_NUM_TCPIP_MSG_INPKT, sizeof(struct tcpip_msg), "TCPIP_MSG_INPKT") #endif /* NO_SYS==0 */ #if ARP_QUEUEING LWIP_MEMPOOL(ARP_QUEUE, MEMP_NUM_ARP_QUEUE, sizeof(struct etharp_q_entry), "ARP_QUEUE") #endif /* ARP_QUEUEING */ #if LWIP_IGMP LWIP_MEMPOOL(IGMP_GROUP, MEMP_NUM_IGMP_GROUP, sizeof(struct igmp_group), "IGMP_GROUP") #endif /* LWIP_IGMP */ #if NO_SYS==0 LWIP_MEMPOOL(SYS_TIMEOUT, MEMP_NUM_SYS_TIMEOUT, sizeof(struct sys_timeo), "SYS_TIMEOUT") #endif /* NO_SYS==0 */ /* * A list of pools of pbuf's used by LWIP. * * LWIP_PBUF_MEMPOOL(pool_name, number_elements, pbuf_payload_size, pool_description) * creates a pool name MEMP_pool_name. description is used in stats.c * This allocates enough space for the pbuf struct and a payload. * (Example: pbuf_payload_size=0 allocates only size for the struct) */ LWIP_PBUF_MEMPOOL(PBUF, MEMP_NUM_PBUF, 0, "PBUF_REF/ROM") LWIP_PBUF_MEMPOOL(PBUF_POOL, PBUF_POOL_SIZE, PBUF_POOL_BUFSIZE, "PBUF_POOL") /* * Allow for user-defined pools; this must be explicitly set in lwipopts.h * since the default is to NOT look for lwippools.h */ #if MEMP_USE_CUSTOM_POOLS #include "lwippools.h" #endif /* MEMP_USE_CUSTOM_POOLS */ /* * REQUIRED CLEANUP: Clear up so we don't get "multiply defined" error later * (#undef is ignored for something that is not defined) */ #undef LWIP_MEMPOOL #undef LWIP_MALLOC_MEMPOOL #undef LWIP_MALLOC_MEMPOOL_START #undef LWIP_MALLOC_MEMPOOL_END #undef LWIP_PBUF_MEMPOOL ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/netbuf.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIP_NETBUF_H__ #define __LWIP_NETBUF_H__ #include "lwip/opt.h" #include "lwip/pbuf.h" #include "lwip/ip_addr.h" #ifdef __cplusplus extern "C" { #endif struct netbuf { struct pbuf *p, *ptr; struct ip_addr *addr; u16_t port; #if LWIP_NETBUF_RECVINFO struct ip_addr *toaddr; u16_t toport; #endif /* LWIP_NETBUF_RECVINFO */ }; /* Network buffer functions: */ struct netbuf * netbuf_new (void); void netbuf_delete (struct netbuf *buf); void * netbuf_alloc (struct netbuf *buf, u16_t size); void netbuf_free (struct netbuf *buf); err_t netbuf_ref (struct netbuf *buf, const void *dataptr, u16_t size); void netbuf_chain (struct netbuf *head, struct netbuf *tail); u16_t netbuf_len (struct netbuf *buf); err_t netbuf_data (struct netbuf *buf, void **dataptr, u16_t *len); s8_t netbuf_next (struct netbuf *buf); void netbuf_first (struct netbuf *buf); #define netbuf_copy_partial(buf, dataptr, len, offset) \ pbuf_copy_partial((buf)->p, (dataptr), (len), (offset)) #define netbuf_copy(buf,dataptr,len) netbuf_copy_partial(buf, dataptr, len, 0) #define netbuf_take(buf, dataptr, len) pbuf_take((buf)->p, dataptr, len) #define netbuf_len(buf) ((buf)->p->tot_len) #define netbuf_fromaddr(buf) ((buf)->addr) #define netbuf_fromport(buf) ((buf)->port) #if LWIP_NETBUF_RECVINFO #define netbuf_destaddr(buf) ((buf)->toaddr) #define netbuf_destport(buf) ((buf)->toport) #endif /* LWIP_NETBUF_RECVINFO */ #ifdef __cplusplus } #endif #endif /* __LWIP_NETBUF_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/netdb.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Simon Goldschmidt * */ #include "lwip/opt.h" #if LWIP_DNS && LWIP_SOCKET #include /* for size_t */ #include "lwip/sockets.h" /* some rarely used options */ #ifndef LWIP_DNS_API_DECLARE_H_ERRNO #define LWIP_DNS_API_DECLARE_H_ERRNO 1 #endif #ifndef LWIP_DNS_API_DEFINE_ERRORS #define LWIP_DNS_API_DEFINE_ERRORS 1 #endif #ifndef LWIP_DNS_API_DECLARE_STRUCTS #define LWIP_DNS_API_DECLARE_STRUCTS 1 #endif #if LWIP_DNS_API_DEFINE_ERRORS /** Errors used by the DNS API functions, h_errno can be one of them */ #define EAI_NONAME 200 #define EAI_SERVICE 201 #define EAI_FAIL 202 #define EAI_MEMORY 203 #define HOST_NOT_FOUND 210 #define NO_DATA 211 #define NO_RECOVERY 212 #define TRY_AGAIN 213 #endif /* LWIP_DNS_API_DEFINE_ERRORS */ #if LWIP_DNS_API_DECLARE_STRUCTS struct hostent { char *h_name; /* Official name of the host. */ char **h_aliases; /* A pointer to an array of pointers to alternative host names, terminated by a null pointer. */ int h_addrtype; /* Address type. */ int h_length; /* The length, in bytes, of the address. */ char **h_addr_list; /* A pointer to an array of pointers to network addresses (in network byte order) for the host, terminated by a null pointer. */ #define h_addr h_addr_list[0] /* for backward compatibility */ }; struct addrinfo { int ai_flags; /* Input flags. */ int ai_family; /* Address family of socket. */ int ai_socktype; /* Socket type. */ int ai_protocol; /* Protocol of socket. */ socklen_t ai_addrlen; /* Length of socket address. */ struct sockaddr *ai_addr; /* Socket address of socket. */ char *ai_canonname; /* Canonical name of service location. */ struct addrinfo *ai_next; /* Pointer to next in list. */ }; #endif /* LWIP_DNS_API_DECLARE_STRUCTS */ #if LWIP_DNS_API_DECLARE_H_ERRNO /* application accessable error code set by the DNS API functions */ extern int h_errno; #endif /* LWIP_DNS_API_DECLARE_H_ERRNO*/ struct hostent *lwip_gethostbyname(const char *name); int lwip_gethostbyname_r(const char *name, struct hostent *ret, char *buf, size_t buflen, struct hostent **result, int *h_errnop); void lwip_freeaddrinfo(struct addrinfo *ai); int lwip_getaddrinfo(const char *nodename, const char *servname, const struct addrinfo *hints, struct addrinfo **res); #if LWIP_COMPAT_SOCKETS #define gethostbyname(name) lwip_gethostbyname(name) #define gethostbyname_r(name, ret, buf, buflen, result, h_errnop) \ lwip_gethostbyname_r(name, ret, buf, buflen, result, h_errnop) #define freeaddrinfo(addrinfo) lwip_freeaddrinfo(addrinfo) #define getaddrinfo(nodname, servname, hints, res) \ lwip_getaddrinfo(nodname, servname, hints, res) #endif /* LWIP_COMPAT_SOCKETS */ #endif /* LWIP_DNS && LWIP_SOCKET */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/netif.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIP_NETIF_H__ #define __LWIP_NETIF_H__ #include "lwip/opt.h" #define ENABLE_LOOPBACK (LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF) #include "lwip/err.h" #include "lwip/ip_addr.h" #include "lwip/inet.h" #include "lwip/pbuf.h" #if LWIP_DHCP struct dhcp; #endif #if LWIP_AUTOIP struct autoip; #endif #ifdef __cplusplus extern "C" { #endif /* Throughout this file, IP addresses are expected to be in * the same byte order as in IP_PCB. */ /** must be the maximum of all used hardware address lengths across all types of interfaces in use */ #define NETIF_MAX_HWADDR_LEN 6U /** TODO: define the use (where, when, whom) of netif flags */ /** whether the network interface is 'up'. this is * a software flag used to control whether this network * interface is enabled and processes traffic. */ #define NETIF_FLAG_UP 0x01U /** if set, the netif has broadcast capability */ #define NETIF_FLAG_BROADCAST 0x02U /** if set, the netif is one end of a point-to-point connection */ #define NETIF_FLAG_POINTTOPOINT 0x04U /** if set, the interface is configured using DHCP */ #define NETIF_FLAG_DHCP 0x08U /** if set, the interface has an active link * (set by the network interface driver) */ #define NETIF_FLAG_LINK_UP 0x10U /** if set, the netif is an device using ARP */ #define NETIF_FLAG_ETHARP 0x20U /** if set, the netif has IGMP capability */ #define NETIF_FLAG_IGMP 0x40U /** Generic data structure used for all lwIP network interfaces. * The following fields should be filled in by the initialization * function for the device driver: hwaddr_len, hwaddr[], mtu, flags */ struct netif { /** pointer to next in linked list */ struct netif *next; /** IP address configuration in network byte order */ struct ip_addr ip_addr; struct ip_addr netmask; struct ip_addr gw; /** This function is called by the network device driver * to pass a packet up the TCP/IP stack. */ err_t (* input)(struct pbuf *p, struct netif *inp); /** This function is called by the IP module when it wants * to send a packet on the interface. This function typically * first resolves the hardware address, then sends the packet. */ err_t (* output)(struct netif *netif, struct pbuf *p, struct ip_addr *ipaddr); /** This function is called by the ARP module when it wants * to send a packet on the interface. This function outputs * the pbuf as-is on the link medium. */ err_t (* linkoutput)(struct netif *netif, struct pbuf *p); #if LWIP_NETIF_STATUS_CALLBACK /** This function is called when the netif state is set to up or down */ void (* status_callback)(struct netif *netif); #endif /* LWIP_NETIF_STATUS_CALLBACK */ #if LWIP_NETIF_LINK_CALLBACK /** This function is called when the netif link is set to up or down */ void (* link_callback)(struct netif *netif); #endif /* LWIP_NETIF_LINK_CALLBACK */ /** This field can be set by the device driver and could point * to state information for the device. */ void *state; #if LWIP_DHCP /** the DHCP client state information for this netif */ struct dhcp *dhcp; #endif /* LWIP_DHCP */ #if LWIP_AUTOIP /** the AutoIP client state information for this netif */ struct autoip *autoip; #endif #if LWIP_NETIF_HOSTNAME /* the hostname for this netif, NULL is a valid value */ char* hostname; #endif /* LWIP_NETIF_HOSTNAME */ /** maximum transfer unit (in bytes) */ u16_t mtu; /** number of bytes used in hwaddr */ u8_t hwaddr_len; /** link level hardware address of this interface */ u8_t hwaddr[NETIF_MAX_HWADDR_LEN]; /** flags (see NETIF_FLAG_ above) */ u8_t flags; /** descriptive abbreviation */ char name[2]; /** number of this interface */ u8_t num; #if LWIP_SNMP /** link type (from "snmp_ifType" enum from snmp.h) */ u8_t link_type; /** (estimate) link speed */ u32_t link_speed; /** timestamp at last change made (up/down) */ u32_t ts; /** counters */ u32_t ifinoctets; u32_t ifinucastpkts; u32_t ifinnucastpkts; u32_t ifindiscards; u32_t ifoutoctets; u32_t ifoutucastpkts; u32_t ifoutnucastpkts; u32_t ifoutdiscards; #endif /* LWIP_SNMP */ #if LWIP_IGMP /* This function could be called to add or delete a entry in the multicast filter table of the ethernet MAC.*/ err_t (*igmp_mac_filter)( struct netif *netif, struct ip_addr *group, u8_t action); #endif /* LWIP_IGMP */ #if LWIP_NETIF_HWADDRHINT u8_t *addr_hint; #endif /* LWIP_NETIF_HWADDRHINT */ #if ENABLE_LOOPBACK /* List of packets to be queued for ourselves. */ struct pbuf *loop_first; struct pbuf *loop_last; #if LWIP_LOOPBACK_MAX_PBUFS u16_t loop_cnt_current; #endif /* LWIP_LOOPBACK_MAX_PBUFS */ #endif /* ENABLE_LOOPBACK */ }; #if LWIP_SNMP #define NETIF_INIT_SNMP(netif, type, speed) \ /* use "snmp_ifType" enum from snmp.h for "type", snmp_ifType_ethernet_csmacd by example */ \ netif->link_type = type; \ /* your link speed here (units: bits per second) */ \ netif->link_speed = speed; \ netif->ts = 0; \ netif->ifinoctets = 0; \ netif->ifinucastpkts = 0; \ netif->ifinnucastpkts = 0; \ netif->ifindiscards = 0; \ netif->ifoutoctets = 0; \ netif->ifoutucastpkts = 0; \ netif->ifoutnucastpkts = 0; \ netif->ifoutdiscards = 0 #else /* LWIP_SNMP */ #define NETIF_INIT_SNMP(netif, type, speed) #endif /* LWIP_SNMP */ /** The list of network interfaces. */ extern struct netif *netif_list; /** The default network interface. */ extern struct netif *netif_default; #define netif_init() /* Compatibility define, not init needed. */ struct netif *netif_add(struct netif *netif, struct ip_addr *ipaddr, struct ip_addr *netmask, struct ip_addr *gw, void *state, err_t (* init)(struct netif *netif), err_t (* input)(struct pbuf *p, struct netif *netif)); void netif_set_addr(struct netif *netif,struct ip_addr *ipaddr, struct ip_addr *netmask, struct ip_addr *gw); void netif_remove(struct netif * netif); /* Returns a network interface given its name. The name is of the form "et0", where the first two letters are the "name" field in the netif structure, and the digit is in the num field in the same structure. */ struct netif *netif_find(char *name); void netif_set_default(struct netif *netif); void netif_set_ipaddr(struct netif *netif, struct ip_addr *ipaddr); void netif_set_netmask(struct netif *netif, struct ip_addr *netmask); void netif_set_gw(struct netif *netif, struct ip_addr *gw); void netif_set_up(struct netif *netif); void netif_set_down(struct netif *netif); u8_t netif_is_up(struct netif *netif); #if LWIP_NETIF_STATUS_CALLBACK /* * Set callback to be called when interface is brought up/down */ void netif_set_status_callback(struct netif *netif, void (* status_callback)(struct netif *netif)); #endif /* LWIP_NETIF_STATUS_CALLBACK */ #if LWIP_NETIF_LINK_CALLBACK void netif_set_link_up(struct netif *netif); void netif_set_link_down(struct netif *netif); u8_t netif_is_link_up(struct netif *netif); /* * Set callback to be called when link is brought up/down */ void netif_set_link_callback(struct netif *netif, void (* link_callback)(struct netif *netif)); #endif /* LWIP_NETIF_LINK_CALLBACK */ #ifdef __cplusplus } #endif #if ENABLE_LOOPBACK err_t netif_loop_output(struct netif *netif, struct pbuf *p, struct ip_addr *dest_ip); void netif_poll(struct netif *netif); #if !LWIP_NETIF_LOOPBACK_MULTITHREADING void netif_poll_all(void); #endif /* !LWIP_NETIF_LOOPBACK_MULTITHREADING */ #endif /* ENABLE_LOOPBACK */ #endif /* __LWIP_NETIF_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/netifapi.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * */ #ifndef __LWIP_NETIFAPI_H__ #define __LWIP_NETIFAPI_H__ #include "lwip/opt.h" #if LWIP_NETIF_API /* don't build if not configured for use in lwipopts.h */ #include "lwip/sys.h" #include "lwip/netif.h" #include "lwip/dhcp.h" #include "lwip/autoip.h" #ifdef __cplusplus extern "C" { #endif struct netifapi_msg_msg { #if !LWIP_TCPIP_CORE_LOCKING sys_sem_t sem; #endif /* !LWIP_TCPIP_CORE_LOCKING */ err_t err; struct netif *netif; union { struct { struct ip_addr *ipaddr; struct ip_addr *netmask; struct ip_addr *gw; void *state; err_t (* init) (struct netif *netif); err_t (* input)(struct pbuf *p, struct netif *netif); } add; struct { void (* voidfunc)(struct netif *netif); err_t (* errtfunc)(struct netif *netif); } common; } msg; }; struct netifapi_msg { void (* function)(struct netifapi_msg_msg *msg); struct netifapi_msg_msg msg; }; /* API for application */ err_t netifapi_netif_add ( struct netif *netif, struct ip_addr *ipaddr, struct ip_addr *netmask, struct ip_addr *gw, void *state, err_t (* init)(struct netif *netif), err_t (* input)(struct pbuf *p, struct netif *netif) ); err_t netifapi_netif_set_addr ( struct netif *netif, struct ip_addr *ipaddr, struct ip_addr *netmask, struct ip_addr *gw ); err_t netifapi_netif_common ( struct netif *netif, void (* voidfunc)(struct netif *netif), err_t (* errtfunc)(struct netif *netif) ); #define netifapi_netif_remove(n) netifapi_netif_common(n, netif_remove, NULL) #define netifapi_netif_set_up(n) netifapi_netif_common(n, netif_set_up, NULL) #define netifapi_netif_set_down(n) netifapi_netif_common(n, netif_set_down, NULL) #define netifapi_netif_set_default(n) netifapi_netif_common(n, netif_set_default, NULL) #define netifapi_dhcp_start(n) netifapi_netif_common(n, NULL, dhcp_start) #define netifapi_dhcp_stop(n) netifapi_netif_common(n, dhcp_stop, NULL) #define netifapi_autoip_start(n) netifapi_netif_common(n, NULL, autoip_start) #define netifapi_autoip_stop(n) netifapi_netif_common(n, NULL, autoip_stop) #ifdef __cplusplus } #endif #endif /* LWIP_NETIF_API */ #endif /* __LWIP_NETIFAPI_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/opt.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * * lwIP Options Configuration */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIP_OPT_H__ #define __LWIP_OPT_H__ /* * Include user defined options first. Anything not defined in these files * will be set to standard values. Override anything you dont like! */ #include "lwipopts.h" #include "lwip/debug.h" /* ----------------------------------------------- ---------- Platform specific locking ---------- ----------------------------------------------- */ /** * SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain * critical regions during buffer allocation, deallocation and memory * allocation and deallocation. */ #ifndef SYS_LIGHTWEIGHT_PROT #define SYS_LIGHTWEIGHT_PROT 0 #endif /** * NO_SYS==1: Provides VERY minimal functionality. Otherwise, * use lwIP facilities. */ #ifndef NO_SYS #define NO_SYS 0 #endif /** * MEMCPY: override this if you have a faster implementation at hand than the * one included in your C library */ #ifndef MEMCPY #define MEMCPY(dst,src,len) memcpy(dst,src,len) #endif /** * SMEMCPY: override this with care! Some compilers (e.g. gcc) can inline a * call to memcpy() if the length is known at compile time and is small. */ #ifndef SMEMCPY #define SMEMCPY(dst,src,len) memcpy(dst,src,len) #endif /* ------------------------------------ ---------- Memory options ---------- ------------------------------------ */ /** * MEM_LIBC_MALLOC==1: Use malloc/free/realloc provided by your C-library * instead of the lwip internal allocator. Can save code size if you * already use it. */ #ifndef MEM_LIBC_MALLOC #define MEM_LIBC_MALLOC 0 #endif /** * MEMP_MEM_MALLOC==1: Use mem_malloc/mem_free instead of the lwip pool allocator. * Especially useful with MEM_LIBC_MALLOC but handle with care regarding execution * speed and usage from interrupts! */ #ifndef MEMP_MEM_MALLOC #define MEMP_MEM_MALLOC 0 #endif /** * MEM_ALIGNMENT: should be set to the alignment of the CPU * 4 byte alignment -> #define MEM_ALIGNMENT 4 * 2 byte alignment -> #define MEM_ALIGNMENT 2 */ #ifndef MEM_ALIGNMENT #define MEM_ALIGNMENT 1 #endif /** * MEM_SIZE: the size of the heap memory. If the application will send * a lot of data that needs to be copied, this should be set high. */ #ifndef MEM_SIZE #define MEM_SIZE 1600 #endif /** * MEMP_OVERFLOW_CHECK: memp overflow protection reserves a configurable * amount of bytes before and after each memp element in every pool and fills * it with a prominent default value. * MEMP_OVERFLOW_CHECK == 0 no checking * MEMP_OVERFLOW_CHECK == 1 checks each element when it is freed * MEMP_OVERFLOW_CHECK >= 2 checks each element in every pool every time * memp_malloc() or memp_free() is called (useful but slow!) */ #ifndef MEMP_OVERFLOW_CHECK #define MEMP_OVERFLOW_CHECK 0 #endif /** * MEMP_SANITY_CHECK==1: run a sanity check after each memp_free() to make * sure that there are no cycles in the linked lists. */ #ifndef MEMP_SANITY_CHECK #define MEMP_SANITY_CHECK 0 #endif /** * MEM_USE_POOLS==1: Use an alternative to malloc() by allocating from a set * of memory pools of various sizes. When mem_malloc is called, an element of * the smallest pool that can provide the length needed is returned. * To use this, MEMP_USE_CUSTOM_POOLS also has to be enabled. */ #ifndef MEM_USE_POOLS #define MEM_USE_POOLS 0 #endif /** * MEM_USE_POOLS_TRY_BIGGER_POOL==1: if one malloc-pool is empty, try the next * bigger pool - WARNING: THIS MIGHT WASTE MEMORY but it can make a system more * reliable. */ #ifndef MEM_USE_POOLS_TRY_BIGGER_POOL #define MEM_USE_POOLS_TRY_BIGGER_POOL 0 #endif /** * MEMP_USE_CUSTOM_POOLS==1: whether to include a user file lwippools.h * that defines additional pools beyond the "standard" ones required * by lwIP. If you set this to 1, you must have lwippools.h in your * inlude path somewhere. */ #ifndef MEMP_USE_CUSTOM_POOLS #define MEMP_USE_CUSTOM_POOLS 0 #endif /** * Set this to 1 if you want to free PBUF_RAM pbufs (or call mem_free()) from * interrupt context (or another context that doesn't allow waiting for a * semaphore). * If set to 1, mem_malloc will be protected by a semaphore and SYS_ARCH_PROTECT, * while mem_free will only use SYS_ARCH_PROTECT. mem_malloc SYS_ARCH_UNPROTECTs * with each loop so that mem_free can run. * * ATTENTION: As you can see from the above description, this leads to dis-/ * enabling interrupts often, which can be slow! Also, on low memory, mem_malloc * can need longer. * * If you don't want that, at least for NO_SYS=0, you can still use the following * functions to enqueue a deallocation call which then runs in the tcpip_thread * context: * - pbuf_free_callback(p); * - mem_free_callback(m); */ #ifndef LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT #define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 0 #endif /* ------------------------------------------------ ---------- Internal Memory Pool Sizes ---------- ------------------------------------------------ */ /** * MEMP_NUM_PBUF: the number of memp struct pbufs (used for PBUF_ROM and PBUF_REF). * If the application sends a lot of data out of ROM (or other static memory), * this should be set high. */ #ifndef MEMP_NUM_PBUF #define MEMP_NUM_PBUF 16 #endif /** * MEMP_NUM_RAW_PCB: Number of raw connection PCBs * (requires the LWIP_RAW option) */ #ifndef MEMP_NUM_RAW_PCB #define MEMP_NUM_RAW_PCB 4 #endif /** * MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One * per active UDP "connection". * (requires the LWIP_UDP option) */ #ifndef MEMP_NUM_UDP_PCB #define MEMP_NUM_UDP_PCB 4 #endif /** * MEMP_NUM_TCP_PCB: the number of simulatenously active TCP connections. * (requires the LWIP_TCP option) */ #ifndef MEMP_NUM_TCP_PCB #define MEMP_NUM_TCP_PCB 5 #endif /** * MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP connections. * (requires the LWIP_TCP option) */ #ifndef MEMP_NUM_TCP_PCB_LISTEN #define MEMP_NUM_TCP_PCB_LISTEN 8 #endif /** * MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments. * (requires the LWIP_TCP option) */ #ifndef MEMP_NUM_TCP_SEG #define MEMP_NUM_TCP_SEG 16 #endif /** * MEMP_NUM_REASSDATA: the number of simultaneously IP packets queued for * reassembly (whole packets, not fragments!) */ #ifndef MEMP_NUM_REASSDATA #define MEMP_NUM_REASSDATA 5 #endif /** * MEMP_NUM_ARP_QUEUE: the number of simulateously queued outgoing * packets (pbufs) that are waiting for an ARP request (to resolve * their destination address) to finish. * (requires the ARP_QUEUEING option) */ #ifndef MEMP_NUM_ARP_QUEUE #define MEMP_NUM_ARP_QUEUE 30 #endif /** * MEMP_NUM_IGMP_GROUP: The number of multicast groups whose network interfaces * can be members et the same time (one per netif - allsystems group -, plus one * per netif membership). * (requires the LWIP_IGMP option) */ #ifndef MEMP_NUM_IGMP_GROUP #define MEMP_NUM_IGMP_GROUP 8 #endif /** * MEMP_NUM_SYS_TIMEOUT: the number of simulateously active timeouts. * (requires NO_SYS==0) */ #ifndef MEMP_NUM_SYS_TIMEOUT #define MEMP_NUM_SYS_TIMEOUT 3 #endif /** * MEMP_NUM_NETBUF: the number of struct netbufs. * (only needed if you use the sequential API, like api_lib.c) */ #ifndef MEMP_NUM_NETBUF #define MEMP_NUM_NETBUF 2 #endif /** * MEMP_NUM_NETCONN: the number of struct netconns. * (only needed if you use the sequential API, like api_lib.c) */ #ifndef MEMP_NUM_NETCONN #define MEMP_NUM_NETCONN 4 #endif /** * MEMP_NUM_TCPIP_MSG_API: the number of struct tcpip_msg, which are used * for callback/timeout API communication. * (only needed if you use tcpip.c) */ #ifndef MEMP_NUM_TCPIP_MSG_API #define MEMP_NUM_TCPIP_MSG_API 8 #endif /** * MEMP_NUM_TCPIP_MSG_INPKT: the number of struct tcpip_msg, which are used * for incoming packets. * (only needed if you use tcpip.c) */ #ifndef MEMP_NUM_TCPIP_MSG_INPKT #define MEMP_NUM_TCPIP_MSG_INPKT 8 #endif /** * PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */ #ifndef PBUF_POOL_SIZE #define PBUF_POOL_SIZE 16 #endif /* --------------------------------- ---------- ARP options ---------- --------------------------------- */ /** * LWIP_ARP==1: Enable ARP functionality. */ #ifndef LWIP_ARP #define LWIP_ARP 1 #endif /** * ARP_TABLE_SIZE: Number of active MAC-IP address pairs cached. */ #ifndef ARP_TABLE_SIZE #define ARP_TABLE_SIZE 10 #endif /** * ARP_QUEUEING==1: Outgoing packets are queued during hardware address * resolution. */ #ifndef ARP_QUEUEING #define ARP_QUEUEING 1 #endif /** * ETHARP_TRUST_IP_MAC==1: Incoming IP packets cause the ARP table to be * updated with the source MAC and IP addresses supplied in the packet. * You may want to disable this if you do not trust LAN peers to have the * correct addresses, or as a limited approach to attempt to handle * spoofing. If disabled, lwIP will need to make a new ARP request if * the peer is not already in the ARP table, adding a little latency. */ #ifndef ETHARP_TRUST_IP_MAC #define ETHARP_TRUST_IP_MAC 1 #endif /** * ETHARP_SUPPORT_VLAN==1: support receiving ethernet packets with VLAN header. * Additionally, you can define ETHARP_VLAN_CHECK to an u16_t VLAN ID to check. * If ETHARP_VLAN_CHECK is defined, only VLAN-traffic for this VLAN is accepted. * If ETHARP_VLAN_CHECK is not defined, all traffic is accepted. */ #ifndef ETHARP_SUPPORT_VLAN #define ETHARP_SUPPORT_VLAN 0 #endif /* -------------------------------- ---------- IP options ---------- -------------------------------- */ /** * IP_FORWARD==1: Enables the ability to forward IP packets across network * interfaces. If you are going to run lwIP on a device with only one network * interface, define this to 0. */ #ifndef IP_FORWARD #define IP_FORWARD 0 #endif /** * IP_OPTIONS_ALLOWED: Defines the behavior for IP options. * IP_OPTIONS_ALLOWED==0: All packets with IP options are dropped. * IP_OPTIONS_ALLOWED==1: IP options are allowed (but not parsed). */ #ifndef IP_OPTIONS_ALLOWED #define IP_OPTIONS_ALLOWED 1 #endif /** * IP_REASSEMBLY==1: Reassemble incoming fragmented IP packets. Note that * this option does not affect outgoing packet sizes, which can be controlled * via IP_FRAG. */ #ifndef IP_REASSEMBLY #define IP_REASSEMBLY 1 #endif /** * IP_FRAG==1: Fragment outgoing IP packets if their size exceeds MTU. Note * that this option does not affect incoming packet sizes, which can be * controlled via IP_REASSEMBLY. */ #ifndef IP_FRAG #define IP_FRAG 1 #endif /** * IP_REASS_MAXAGE: Maximum time (in multiples of IP_TMR_INTERVAL - so seconds, normally) * a fragmented IP packet waits for all fragments to arrive. If not all fragments arrived * in this time, the whole packet is discarded. */ #ifndef IP_REASS_MAXAGE #define IP_REASS_MAXAGE 3 #endif /** * IP_REASS_MAX_PBUFS: Total maximum amount of pbufs waiting to be reassembled. * Since the received pbufs are enqueued, be sure to configure * PBUF_POOL_SIZE > IP_REASS_MAX_PBUFS so that the stack is still able to receive * packets even if the maximum amount of fragments is enqueued for reassembly! */ #ifndef IP_REASS_MAX_PBUFS #define IP_REASS_MAX_PBUFS 10 #endif /** * IP_FRAG_USES_STATIC_BUF==1: Use a static MTU-sized buffer for IP * fragmentation. Otherwise pbufs are allocated and reference the original * packet data to be fragmented. */ #ifndef IP_FRAG_USES_STATIC_BUF #define IP_FRAG_USES_STATIC_BUF 1 #endif /** * IP_FRAG_MAX_MTU: Assumed max MTU on any interface for IP frag buffer * (requires IP_FRAG_USES_STATIC_BUF==1) */ #if IP_FRAG_USES_STATIC_BUF && !defined(IP_FRAG_MAX_MTU) #define IP_FRAG_MAX_MTU 1500 #endif /** * IP_DEFAULT_TTL: Default value for Time-To-Live used by transport layers. */ #ifndef IP_DEFAULT_TTL #define IP_DEFAULT_TTL 255 #endif /** * IP_SOF_BROADCAST=1: Use the SOF_BROADCAST field to enable broadcast * filter per pcb on udp and raw send operations. To enable broadcast filter * on recv operations, you also have to set IP_SOF_BROADCAST_RECV=1. */ #ifndef IP_SOF_BROADCAST #define IP_SOF_BROADCAST 0 #endif /** * IP_SOF_BROADCAST_RECV (requires IP_SOF_BROADCAST=1) enable the broadcast * filter on recv operations. */ #ifndef IP_SOF_BROADCAST_RECV #define IP_SOF_BROADCAST_RECV 0 #endif /* ---------------------------------- ---------- ICMP options ---------- ---------------------------------- */ /** * LWIP_ICMP==1: Enable ICMP module inside the IP stack. * Be careful, disable that make your product non-compliant to RFC1122 */ #ifndef LWIP_ICMP #define LWIP_ICMP 1 #endif /** * ICMP_TTL: Default value for Time-To-Live used by ICMP packets. */ #ifndef ICMP_TTL #define ICMP_TTL (IP_DEFAULT_TTL) #endif /** * LWIP_BROADCAST_PING==1: respond to broadcast pings (default is unicast only) */ #ifndef LWIP_BROADCAST_PING #define LWIP_BROADCAST_PING 0 #endif /** * LWIP_MULTICAST_PING==1: respond to multicast pings (default is unicast only) */ #ifndef LWIP_MULTICAST_PING #define LWIP_MULTICAST_PING 0 #endif /* --------------------------------- ---------- RAW options ---------- --------------------------------- */ /** * LWIP_RAW==1: Enable application layer to hook into the IP layer itself. */ #ifndef LWIP_RAW #define LWIP_RAW 1 #endif /** * LWIP_RAW==1: Enable application layer to hook into the IP layer itself. */ #ifndef RAW_TTL #define RAW_TTL (IP_DEFAULT_TTL) #endif /* ---------------------------------- ---------- DHCP options ---------- ---------------------------------- */ /** * LWIP_DHCP==1: Enable DHCP module. */ #ifndef LWIP_DHCP #define LWIP_DHCP 0 #endif /** * DHCP_DOES_ARP_CHECK==1: Do an ARP check on the offered address. */ #ifndef DHCP_DOES_ARP_CHECK #define DHCP_DOES_ARP_CHECK ((LWIP_DHCP) && (LWIP_ARP)) #endif /* ------------------------------------ ---------- AUTOIP options ---------- ------------------------------------ */ /** * LWIP_AUTOIP==1: Enable AUTOIP module. */ #ifndef LWIP_AUTOIP #define LWIP_AUTOIP 0 #endif /** * LWIP_DHCP_AUTOIP_COOP==1: Allow DHCP and AUTOIP to be both enabled on * the same interface at the same time. */ #ifndef LWIP_DHCP_AUTOIP_COOP #define LWIP_DHCP_AUTOIP_COOP 0 #endif /** * LWIP_DHCP_AUTOIP_COOP_TRIES: Set to the number of DHCP DISCOVER probes * that should be sent before falling back on AUTOIP. This can be set * as low as 1 to get an AutoIP address very quickly, but you should * be prepared to handle a changing IP address when DHCP overrides * AutoIP. */ #ifndef LWIP_DHCP_AUTOIP_COOP_TRIES #define LWIP_DHCP_AUTOIP_COOP_TRIES 9 #endif /* ---------------------------------- ---------- SNMP options ---------- ---------------------------------- */ /** * LWIP_SNMP==1: Turn on SNMP module. UDP must be available for SNMP * transport. */ #ifndef LWIP_SNMP #define LWIP_SNMP 0 #endif /** * SNMP_CONCURRENT_REQUESTS: Number of concurrent requests the module will * allow. At least one request buffer is required. */ #ifndef SNMP_CONCURRENT_REQUESTS #define SNMP_CONCURRENT_REQUESTS 1 #endif /** * SNMP_TRAP_DESTINATIONS: Number of trap destinations. At least one trap * destination is required */ #ifndef SNMP_TRAP_DESTINATIONS #define SNMP_TRAP_DESTINATIONS 1 #endif /** * SNMP_PRIVATE_MIB: */ #ifndef SNMP_PRIVATE_MIB #define SNMP_PRIVATE_MIB 0 #endif /** * Only allow SNMP write actions that are 'safe' (e.g. disabeling netifs is not * a safe action and disabled when SNMP_SAFE_REQUESTS = 1). * Unsafe requests are disabled by default! */ #ifndef SNMP_SAFE_REQUESTS #define SNMP_SAFE_REQUESTS 1 #endif /* ---------------------------------- ---------- IGMP options ---------- ---------------------------------- */ /** * LWIP_IGMP==1: Turn on IGMP module. */ #ifndef LWIP_IGMP #define LWIP_IGMP 0 #endif /* ---------------------------------- ---------- DNS options ----------- ---------------------------------- */ /** * LWIP_DNS==1: Turn on DNS module. UDP must be available for DNS * transport. */ #ifndef LWIP_DNS #define LWIP_DNS 0 #endif /** DNS maximum number of entries to maintain locally. */ #ifndef DNS_TABLE_SIZE #define DNS_TABLE_SIZE 4 #endif /** DNS maximum host name length supported in the name table. */ #ifndef DNS_MAX_NAME_LENGTH #define DNS_MAX_NAME_LENGTH 256 #endif /** The maximum of DNS servers */ #ifndef DNS_MAX_SERVERS #define DNS_MAX_SERVERS 2 #endif /** DNS do a name checking between the query and the response. */ #ifndef DNS_DOES_NAME_CHECK #define DNS_DOES_NAME_CHECK 1 #endif /** DNS use a local buffer if DNS_USES_STATIC_BUF=0, a static one if DNS_USES_STATIC_BUF=1, or a dynamic one if DNS_USES_STATIC_BUF=2. The buffer will be of size DNS_MSG_SIZE */ #ifndef DNS_USES_STATIC_BUF #define DNS_USES_STATIC_BUF 1 #endif /** DNS message max. size. Default value is RFC compliant. */ #ifndef DNS_MSG_SIZE #define DNS_MSG_SIZE 512 #endif /** DNS_LOCAL_HOSTLIST: Implements a local host-to-address list. If enabled, * you have to define * #define DNS_LOCAL_HOSTLIST_INIT {{"host1", 0x123}, {"host2", 0x234}} * (an array of structs name/address, where address is an u32_t in network * byte order). * * Instead, you can also use an external function: * #define DNS_LOOKUP_LOCAL_EXTERN(x) extern u32_t my_lookup_function(const char *name) * that returns the IP address or INADDR_NONE if not found. */ #ifndef DNS_LOCAL_HOSTLIST #define DNS_LOCAL_HOSTLIST 0 #endif /* DNS_LOCAL_HOSTLIST */ /** If this is turned on, the local host-list can be dynamically changed * at runtime. */ #ifndef DNS_LOCAL_HOSTLIST_IS_DYNAMIC #define DNS_LOCAL_HOSTLIST_IS_DYNAMIC 0 #endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ /* --------------------------------- ---------- UDP options ---------- --------------------------------- */ /** * LWIP_UDP==1: Turn on UDP. */ #ifndef LWIP_UDP #define LWIP_UDP 1 #endif /** * LWIP_UDPLITE==1: Turn on UDP-Lite. (Requires LWIP_UDP) */ #ifndef LWIP_UDPLITE #define LWIP_UDPLITE 0 #endif /** * UDP_TTL: Default Time-To-Live value. */ #ifndef UDP_TTL #define UDP_TTL (IP_DEFAULT_TTL) #endif /** * LWIP_NETBUF_RECVINFO==1: append destination addr and port to every netbuf. */ #ifndef LWIP_NETBUF_RECVINFO #define LWIP_NETBUF_RECVINFO 0 #endif /* --------------------------------- ---------- TCP options ---------- --------------------------------- */ /** * LWIP_TCP==1: Turn on TCP. */ #ifndef LWIP_TCP #define LWIP_TCP 1 #endif /** * TCP_TTL: Default Time-To-Live value. */ #ifndef TCP_TTL #define TCP_TTL (IP_DEFAULT_TTL) #endif /** * TCP_WND: The size of a TCP window. This must be at least * (2 * TCP_MSS) for things to work well */ #ifndef TCP_WND #define TCP_WND (4 * TCP_MSS) #endif /** * TCP_MAXRTX: Maximum number of retransmissions of data segments. */ #ifndef TCP_MAXRTX #define TCP_MAXRTX 12 #endif /** * TCP_SYNMAXRTX: Maximum number of retransmissions of SYN segments. */ #ifndef TCP_SYNMAXRTX #define TCP_SYNMAXRTX 6 #endif /** * TCP_QUEUE_OOSEQ==1: TCP will queue segments that arrive out of order. * Define to 0 if your device is low on memory. */ #ifndef TCP_QUEUE_OOSEQ #define TCP_QUEUE_OOSEQ (LWIP_TCP) #endif /** * TCP_MSS: TCP Maximum segment size. (default is 536, a conservative default, * you might want to increase this.) * For the receive side, this MSS is advertised to the remote side * when opening a connection. For the transmit size, this MSS sets * an upper limit on the MSS advertised by the remote host. */ #ifndef TCP_MSS #define TCP_MSS 536 #endif /** * TCP_CALCULATE_EFF_SEND_MSS: "The maximum size of a segment that TCP really * sends, the 'effective send MSS,' MUST be the smaller of the send MSS (which * reflects the available reassembly buffer size at the remote host) and the * largest size permitted by the IP layer" (RFC 1122) * Setting this to 1 enables code that checks TCP_MSS against the MTU of the * netif used for a connection and limits the MSS if it would be too big otherwise. */ #ifndef TCP_CALCULATE_EFF_SEND_MSS #define TCP_CALCULATE_EFF_SEND_MSS 1 #endif /** * TCP_SND_BUF: TCP sender buffer space (bytes). */ #ifndef TCP_SND_BUF #define TCP_SND_BUF 256 #endif /** * TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least * as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. */ #ifndef TCP_SND_QUEUELEN #define TCP_SND_QUEUELEN (4 * (TCP_SND_BUF)/(TCP_MSS)) #endif /** * TCP_SNDLOWAT: TCP writable space (bytes). This must be less than or equal * to TCP_SND_BUF. It is the amount of space which must be available in the * TCP snd_buf for select to return writable. */ #ifndef TCP_SNDLOWAT #define TCP_SNDLOWAT ((TCP_SND_BUF)/2) #endif /** * TCP_LISTEN_BACKLOG: Enable the backlog option for tcp listen pcb. */ #ifndef TCP_LISTEN_BACKLOG #define TCP_LISTEN_BACKLOG 0 #endif /** * The maximum allowed backlog for TCP listen netconns. * This backlog is used unless another is explicitly specified. * 0xff is the maximum (u8_t). */ #ifndef TCP_DEFAULT_LISTEN_BACKLOG #define TCP_DEFAULT_LISTEN_BACKLOG 0xff #endif /** * LWIP_TCP_TIMESTAMPS==1: support the TCP timestamp option. */ #ifndef LWIP_TCP_TIMESTAMPS #define LWIP_TCP_TIMESTAMPS 0 #endif /** * TCP_WND_UPDATE_THRESHOLD: difference in window to trigger an * explicit window update */ #ifndef TCP_WND_UPDATE_THRESHOLD #define TCP_WND_UPDATE_THRESHOLD (TCP_WND / 4) #endif /** * LWIP_EVENT_API and LWIP_CALLBACK_API: Only one of these should be set to 1. * LWIP_EVENT_API==1: The user defines lwip_tcp_event() to receive all * events (accept, sent, etc) that happen in the system. * LWIP_CALLBACK_API==1: The PCB callback function is called directly * for the event. */ #ifndef LWIP_EVENT_API #define LWIP_EVENT_API 0 #define LWIP_CALLBACK_API 1 #else #define LWIP_EVENT_API 1 #define LWIP_CALLBACK_API 0 #endif /* ---------------------------------- ---------- Pbuf options ---------- ---------------------------------- */ /** * PBUF_LINK_HLEN: the number of bytes that should be allocated for a * link level header. The default is 14, the standard value for * Ethernet. */ #ifndef PBUF_LINK_HLEN #define PBUF_LINK_HLEN 14 #endif /** * PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. The default is * designed to accomodate single full size TCP frame in one pbuf, including * TCP_MSS, IP header, and link header. */ #ifndef PBUF_POOL_BUFSIZE #define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN) #endif /* ------------------------------------------------ ---------- Network Interfaces options ---------- ------------------------------------------------ */ /** * LWIP_NETIF_HOSTNAME==1: use DHCP_OPTION_HOSTNAME with netif's hostname * field. */ #ifndef LWIP_NETIF_HOSTNAME #define LWIP_NETIF_HOSTNAME 0 #endif /** * LWIP_NETIF_API==1: Support netif api (in netifapi.c) */ #ifndef LWIP_NETIF_API #define LWIP_NETIF_API 0 #endif /** * LWIP_NETIF_STATUS_CALLBACK==1: Support a callback function whenever an interface * changes its up/down status (i.e., due to DHCP IP acquistion) */ #ifndef LWIP_NETIF_STATUS_CALLBACK #define LWIP_NETIF_STATUS_CALLBACK 0 #endif /** * LWIP_NETIF_LINK_CALLBACK==1: Support a callback function from an interface * whenever the link changes (i.e., link down) */ #ifndef LWIP_NETIF_LINK_CALLBACK #define LWIP_NETIF_LINK_CALLBACK 0 #endif /** * LWIP_NETIF_HWADDRHINT==1: Cache link-layer-address hints (e.g. table * indices) in struct netif. TCP and UDP can make use of this to prevent * scanning the ARP table for every sent packet. While this is faster for big * ARP tables or many concurrent connections, it might be counterproductive * if you have a tiny ARP table or if there never are concurrent connections. */ #ifndef LWIP_NETIF_HWADDRHINT #define LWIP_NETIF_HWADDRHINT 0 #endif /** * LWIP_NETIF_LOOPBACK==1: Support sending packets with a destination IP * address equal to the netif IP address, looping them back up the stack. */ #ifndef LWIP_NETIF_LOOPBACK #define LWIP_NETIF_LOOPBACK 0 #endif /** * LWIP_LOOPBACK_MAX_PBUFS: Maximum number of pbufs on queue for loopback * sending for each netif (0 = disabled) */ #ifndef LWIP_LOOPBACK_MAX_PBUFS #define LWIP_LOOPBACK_MAX_PBUFS 0 #endif /** * LWIP_NETIF_LOOPBACK_MULTITHREADING: Indicates whether threading is enabled in * the system, as netifs must change how they behave depending on this setting * for the LWIP_NETIF_LOOPBACK option to work. * Setting this is needed to avoid reentering non-reentrant functions like * tcp_input(). * LWIP_NETIF_LOOPBACK_MULTITHREADING==1: Indicates that the user is using a * multithreaded environment like tcpip.c. In this case, netif->input() * is called directly. * LWIP_NETIF_LOOPBACK_MULTITHREADING==0: Indicates a polling (or NO_SYS) setup. * The packets are put on a list and netif_poll() must be called in * the main application loop. */ #ifndef LWIP_NETIF_LOOPBACK_MULTITHREADING #define LWIP_NETIF_LOOPBACK_MULTITHREADING (!NO_SYS) #endif /** * LWIP_NETIF_TX_SINGLE_PBUF: if this is set to 1, lwIP tries to put all data * to be sent into one single pbuf. This is for compatibility with DMA-enabled * MACs that do not support scatter-gather. * Beware that this might involve CPU-memcpy before transmitting that would not * be needed without this flag! Use this only if you need to! * * @todo: TCP and IP-frag do not work with this, yet: */ #ifndef LWIP_NETIF_TX_SINGLE_PBUF #define LWIP_NETIF_TX_SINGLE_PBUF 0 #endif /* LWIP_NETIF_TX_SINGLE_PBUF */ /* ------------------------------------ ---------- LOOPIF options ---------- ------------------------------------ */ /** * LWIP_HAVE_LOOPIF==1: Support loop interface (127.0.0.1) and loopif.c */ #ifndef LWIP_HAVE_LOOPIF #define LWIP_HAVE_LOOPIF 0 #endif /* ------------------------------------ ---------- SLIPIF options ---------- ------------------------------------ */ /** * LWIP_HAVE_SLIPIF==1: Support slip interface and slipif.c */ #ifndef LWIP_HAVE_SLIPIF #define LWIP_HAVE_SLIPIF 0 #endif /* ------------------------------------ ---------- Thread options ---------- ------------------------------------ */ /** * TCPIP_THREAD_NAME: The name assigned to the main tcpip thread. */ #ifndef TCPIP_THREAD_NAME #define TCPIP_THREAD_NAME "tcpip_thread" #endif /** * TCPIP_THREAD_STACKSIZE: The stack size used by the main tcpip thread. * The stack size value itself is platform-dependent, but is passed to * sys_thread_new() when the thread is created. */ #ifndef TCPIP_THREAD_STACKSIZE #define TCPIP_THREAD_STACKSIZE 0 #endif /** * TCPIP_THREAD_PRIO: The priority assigned to the main tcpip thread. * The priority value itself is platform-dependent, but is passed to * sys_thread_new() when the thread is created. */ #ifndef TCPIP_THREAD_PRIO #define TCPIP_THREAD_PRIO 1 #endif /** * TCPIP_MBOX_SIZE: The mailbox size for the tcpip thread messages * The queue size value itself is platform-dependent, but is passed to * sys_mbox_new() when tcpip_init is called. */ #ifndef TCPIP_MBOX_SIZE #define TCPIP_MBOX_SIZE 0 #endif /** * SLIPIF_THREAD_NAME: The name assigned to the slipif_loop thread. */ #ifndef SLIPIF_THREAD_NAME #define SLIPIF_THREAD_NAME "slipif_loop" #endif /** * SLIP_THREAD_STACKSIZE: The stack size used by the slipif_loop thread. * The stack size value itself is platform-dependent, but is passed to * sys_thread_new() when the thread is created. */ #ifndef SLIPIF_THREAD_STACKSIZE #define SLIPIF_THREAD_STACKSIZE 0 #endif /** * SLIPIF_THREAD_PRIO: The priority assigned to the slipif_loop thread. * The priority value itself is platform-dependent, but is passed to * sys_thread_new() when the thread is created. */ #ifndef SLIPIF_THREAD_PRIO #define SLIPIF_THREAD_PRIO 1 #endif /** * PPP_THREAD_NAME: The name assigned to the pppMain thread. */ #ifndef PPP_THREAD_NAME #define PPP_THREAD_NAME "pppMain" #endif /** * PPP_THREAD_STACKSIZE: The stack size used by the pppMain thread. * The stack size value itself is platform-dependent, but is passed to * sys_thread_new() when the thread is created. */ #ifndef PPP_THREAD_STACKSIZE #define PPP_THREAD_STACKSIZE 0 #endif /** * PPP_THREAD_PRIO: The priority assigned to the pppMain thread. * The priority value itself is platform-dependent, but is passed to * sys_thread_new() when the thread is created. */ #ifndef PPP_THREAD_PRIO #define PPP_THREAD_PRIO 1 #endif /** * DEFAULT_THREAD_NAME: The name assigned to any other lwIP thread. */ #ifndef DEFAULT_THREAD_NAME #define DEFAULT_THREAD_NAME "lwIP" #endif /** * DEFAULT_THREAD_STACKSIZE: The stack size used by any other lwIP thread. * The stack size value itself is platform-dependent, but is passed to * sys_thread_new() when the thread is created. */ #ifndef DEFAULT_THREAD_STACKSIZE #define DEFAULT_THREAD_STACKSIZE 0 #endif /** * DEFAULT_THREAD_PRIO: The priority assigned to any other lwIP thread. * The priority value itself is platform-dependent, but is passed to * sys_thread_new() when the thread is created. */ #ifndef DEFAULT_THREAD_PRIO #define DEFAULT_THREAD_PRIO 1 #endif /** * DEFAULT_RAW_RECVMBOX_SIZE: The mailbox size for the incoming packets on a * NETCONN_RAW. The queue size value itself is platform-dependent, but is passed * to sys_mbox_new() when the recvmbox is created. */ #ifndef DEFAULT_RAW_RECVMBOX_SIZE #define DEFAULT_RAW_RECVMBOX_SIZE 0 #endif /** * DEFAULT_UDP_RECVMBOX_SIZE: The mailbox size for the incoming packets on a * NETCONN_UDP. The queue size value itself is platform-dependent, but is passed * to sys_mbox_new() when the recvmbox is created. */ #ifndef DEFAULT_UDP_RECVMBOX_SIZE #define DEFAULT_UDP_RECVMBOX_SIZE 0 #endif /** * DEFAULT_TCP_RECVMBOX_SIZE: The mailbox size for the incoming packets on a * NETCONN_TCP. The queue size value itself is platform-dependent, but is passed * to sys_mbox_new() when the recvmbox is created. */ #ifndef DEFAULT_TCP_RECVMBOX_SIZE #define DEFAULT_TCP_RECVMBOX_SIZE 0 #endif /** * DEFAULT_ACCEPTMBOX_SIZE: The mailbox size for the incoming connections. * The queue size value itself is platform-dependent, but is passed to * sys_mbox_new() when the acceptmbox is created. */ #ifndef DEFAULT_ACCEPTMBOX_SIZE #define DEFAULT_ACCEPTMBOX_SIZE 0 #endif /* ---------------------------------------------- ---------- Sequential layer options ---------- ---------------------------------------------- */ /** * LWIP_TCPIP_CORE_LOCKING: (EXPERIMENTAL!) * Don't use it if you're not an active lwIP project member */ #ifndef LWIP_TCPIP_CORE_LOCKING #define LWIP_TCPIP_CORE_LOCKING 0 #endif /** * LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c) */ #ifndef LWIP_NETCONN #define LWIP_NETCONN 1 #endif /* ------------------------------------ ---------- Socket options ---------- ------------------------------------ */ /** * LWIP_SOCKET==1: Enable Socket API (require to use sockets.c) */ #ifndef LWIP_SOCKET #define LWIP_SOCKET 1 #endif /** * LWIP_COMPAT_SOCKETS==1: Enable BSD-style sockets functions names. * (only used if you use sockets.c) */ #ifndef LWIP_COMPAT_SOCKETS #define LWIP_COMPAT_SOCKETS 1 #endif /** * LWIP_POSIX_SOCKETS_IO_NAMES==1: Enable POSIX-style sockets functions names. * Disable this option if you use a POSIX operating system that uses the same * names (read, write & close). (only used if you use sockets.c) */ #ifndef LWIP_POSIX_SOCKETS_IO_NAMES #define LWIP_POSIX_SOCKETS_IO_NAMES 1 #endif /** * LWIP_TCP_KEEPALIVE==1: Enable TCP_KEEPIDLE, TCP_KEEPINTVL and TCP_KEEPCNT * options processing. Note that TCP_KEEPIDLE and TCP_KEEPINTVL have to be set * in seconds. (does not require sockets.c, and will affect tcp.c) */ #ifndef LWIP_TCP_KEEPALIVE #define LWIP_TCP_KEEPALIVE 1 #endif /** * LWIP_SO_RCVTIMEO==1: Enable SO_RCVTIMEO processing. */ #ifndef LWIP_SO_RCVTIMEO #define LWIP_SO_RCVTIMEO 0 #endif /** * LWIP_SO_RCVBUF==1: Enable SO_RCVBUF processing. */ #ifndef LWIP_SO_RCVBUF #define LWIP_SO_RCVBUF 0 #endif /** * If LWIP_SO_RCVBUF is used, this is the default value for recv_bufsize. */ #ifndef RECV_BUFSIZE_DEFAULT #define RECV_BUFSIZE_DEFAULT INT_MAX #endif /** * SO_REUSE==1: Enable SO_REUSEADDR and SO_REUSEPORT options. DO NOT USE! */ #ifndef SO_REUSE #define SO_REUSE 0 #endif /* ---------------------------------------- ---------- Statistics options ---------- ---------------------------------------- */ /** * LWIP_STATS==1: Enable statistics collection in lwip_stats. */ #ifndef LWIP_STATS #define LWIP_STATS 1 #endif #if LWIP_STATS /** * LWIP_STATS_DISPLAY==1: Compile in the statistics output functions. */ #ifndef LWIP_STATS_DISPLAY #define LWIP_STATS_DISPLAY 0 #endif /** * LINK_STATS==1: Enable link stats. */ #ifndef LINK_STATS #define LINK_STATS 1 #endif /** * ETHARP_STATS==1: Enable etharp stats. */ #ifndef ETHARP_STATS #define ETHARP_STATS (LWIP_ARP) #endif /** * IP_STATS==1: Enable IP stats. */ #ifndef IP_STATS #define IP_STATS 1 #endif /** * IPFRAG_STATS==1: Enable IP fragmentation stats. Default is * on if using either frag or reass. */ #ifndef IPFRAG_STATS #define IPFRAG_STATS (IP_REASSEMBLY || IP_FRAG) #endif /** * ICMP_STATS==1: Enable ICMP stats. */ #ifndef ICMP_STATS #define ICMP_STATS 1 #endif /** * IGMP_STATS==1: Enable IGMP stats. */ #ifndef IGMP_STATS #define IGMP_STATS (LWIP_IGMP) #endif /** * UDP_STATS==1: Enable UDP stats. Default is on if * UDP enabled, otherwise off. */ #ifndef UDP_STATS #define UDP_STATS (LWIP_UDP) #endif /** * TCP_STATS==1: Enable TCP stats. Default is on if TCP * enabled, otherwise off. */ #ifndef TCP_STATS #define TCP_STATS (LWIP_TCP) #endif /** * MEM_STATS==1: Enable mem.c stats. */ #ifndef MEM_STATS #define MEM_STATS ((MEM_LIBC_MALLOC == 0) && (MEM_USE_POOLS == 0)) #endif /** * MEMP_STATS==1: Enable memp.c pool stats. */ #ifndef MEMP_STATS #define MEMP_STATS (MEMP_MEM_MALLOC == 0) #endif /** * SYS_STATS==1: Enable system stats (sem and mbox counts, etc). */ #ifndef SYS_STATS #define SYS_STATS (NO_SYS == 0) #endif #else #define LINK_STATS 0 #define IP_STATS 0 #define IPFRAG_STATS 0 #define ICMP_STATS 0 #define IGMP_STATS 0 #define UDP_STATS 0 #define TCP_STATS 0 #define MEM_STATS 0 #define MEMP_STATS 0 #define SYS_STATS 0 #define LWIP_STATS_DISPLAY 0 #endif /* LWIP_STATS */ /* --------------------------------- ---------- PPP options ---------- --------------------------------- */ /** * PPP_SUPPORT==1: Enable PPP. */ #ifndef PPP_SUPPORT #define PPP_SUPPORT 0 #endif /** * PPPOE_SUPPORT==1: Enable PPP Over Ethernet */ #ifndef PPPOE_SUPPORT #define PPPOE_SUPPORT 0 #endif /** * PPPOS_SUPPORT==1: Enable PPP Over Serial */ #ifndef PPPOS_SUPPORT #define PPPOS_SUPPORT PPP_SUPPORT #endif #if PPP_SUPPORT /** * NUM_PPP: Max PPP sessions. */ #ifndef NUM_PPP #define NUM_PPP 1 #endif /** * PAP_SUPPORT==1: Support PAP. */ #ifndef PAP_SUPPORT #define PAP_SUPPORT 0 #endif /** * CHAP_SUPPORT==1: Support CHAP. */ #ifndef CHAP_SUPPORT #define CHAP_SUPPORT 0 #endif /** * MSCHAP_SUPPORT==1: Support MSCHAP. CURRENTLY NOT SUPPORTED! DO NOT SET! */ #ifndef MSCHAP_SUPPORT #define MSCHAP_SUPPORT 0 #endif /** * CBCP_SUPPORT==1: Support CBCP. CURRENTLY NOT SUPPORTED! DO NOT SET! */ #ifndef CBCP_SUPPORT #define CBCP_SUPPORT 0 #endif /** * CCP_SUPPORT==1: Support CCP. CURRENTLY NOT SUPPORTED! DO NOT SET! */ #ifndef CCP_SUPPORT #define CCP_SUPPORT 0 #endif /** * VJ_SUPPORT==1: Support VJ header compression. */ #ifndef VJ_SUPPORT #define VJ_SUPPORT 0 #endif /** * MD5_SUPPORT==1: Support MD5 (see also CHAP). */ #ifndef MD5_SUPPORT #define MD5_SUPPORT 0 #endif /* * Timeouts */ #ifndef FSM_DEFTIMEOUT #define FSM_DEFTIMEOUT 6 /* Timeout time in seconds */ #endif #ifndef FSM_DEFMAXTERMREQS #define FSM_DEFMAXTERMREQS 2 /* Maximum Terminate-Request transmissions */ #endif #ifndef FSM_DEFMAXCONFREQS #define FSM_DEFMAXCONFREQS 10 /* Maximum Configure-Request transmissions */ #endif #ifndef FSM_DEFMAXNAKLOOPS #define FSM_DEFMAXNAKLOOPS 5 /* Maximum number of nak loops */ #endif #ifndef UPAP_DEFTIMEOUT #define UPAP_DEFTIMEOUT 6 /* Timeout (seconds) for retransmitting req */ #endif #ifndef UPAP_DEFREQTIME #define UPAP_DEFREQTIME 30 /* Time to wait for auth-req from peer */ #endif #ifndef CHAP_DEFTIMEOUT #define CHAP_DEFTIMEOUT 6 /* Timeout time in seconds */ #endif #ifndef CHAP_DEFTRANSMITS #define CHAP_DEFTRANSMITS 10 /* max # times to send challenge */ #endif /* Interval in seconds between keepalive echo requests, 0 to disable. */ #ifndef LCP_ECHOINTERVAL #define LCP_ECHOINTERVAL 0 #endif /* Number of unanswered echo requests before failure. */ #ifndef LCP_MAXECHOFAILS #define LCP_MAXECHOFAILS 3 #endif /* Max Xmit idle time (in jiffies) before resend flag char. */ #ifndef PPP_MAXIDLEFLAG #define PPP_MAXIDLEFLAG 100 #endif /* * Packet sizes * * Note - lcp shouldn't be allowed to negotiate stuff outside these * limits. See lcp.h in the pppd directory. * (XXX - these constants should simply be shared by lcp.c instead * of living in lcp.h) */ #define PPP_MTU 1500 /* Default MTU (size of Info field) */ #ifndef PPP_MAXMTU /* #define PPP_MAXMTU 65535 - (PPP_HDRLEN + PPP_FCSLEN) */ #define PPP_MAXMTU 1500 /* Largest MTU we allow */ #endif #define PPP_MINMTU 64 #define PPP_MRU 1500 /* default MRU = max length of info field */ #define PPP_MAXMRU 1500 /* Largest MRU we allow */ #ifndef PPP_DEFMRU #define PPP_DEFMRU 296 /* Try for this */ #endif #define PPP_MINMRU 128 /* No MRUs below this */ #ifndef MAXNAMELEN #define MAXNAMELEN 256 /* max length of hostname or name for auth */ #endif #ifndef MAXSECRETLEN #define MAXSECRETLEN 256 /* max length of password or secret */ #endif #endif /* PPP_SUPPORT */ /* -------------------------------------- ---------- Checksum options ---------- -------------------------------------- */ /** * CHECKSUM_GEN_IP==1: Generate checksums in software for outgoing IP packets. */ #ifndef CHECKSUM_GEN_IP #define CHECKSUM_GEN_IP 1 #endif /** * CHECKSUM_GEN_UDP==1: Generate checksums in software for outgoing UDP packets. */ #ifndef CHECKSUM_GEN_UDP #define CHECKSUM_GEN_UDP 1 #endif /** * CHECKSUM_GEN_TCP==1: Generate checksums in software for outgoing TCP packets. */ #ifndef CHECKSUM_GEN_TCP #define CHECKSUM_GEN_TCP 1 #endif /** * CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets. */ #ifndef CHECKSUM_CHECK_IP #define CHECKSUM_CHECK_IP 1 #endif /** * CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets. */ #ifndef CHECKSUM_CHECK_UDP #define CHECKSUM_CHECK_UDP 1 #endif /** * CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets. */ #ifndef CHECKSUM_CHECK_TCP #define CHECKSUM_CHECK_TCP 1 #endif /* --------------------------------------- ---------- Debugging options ---------- --------------------------------------- */ /** * LWIP_DBG_MIN_LEVEL: After masking, the value of the debug is * compared against this value. If it is smaller, then debugging * messages are written. */ #ifndef LWIP_DBG_MIN_LEVEL #define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_ALL #endif /** * LWIP_DBG_TYPES_ON: A mask that can be used to globally enable/disable * debug messages of certain types. */ #ifndef LWIP_DBG_TYPES_ON #define LWIP_DBG_TYPES_ON LWIP_DBG_ON #endif /** * ETHARP_DEBUG: Enable debugging in etharp.c. */ #ifndef ETHARP_DEBUG #define ETHARP_DEBUG LWIP_DBG_OFF #endif /** * NETIF_DEBUG: Enable debugging in netif.c. */ #ifndef NETIF_DEBUG #define NETIF_DEBUG LWIP_DBG_OFF #endif /** * PBUF_DEBUG: Enable debugging in pbuf.c. */ #ifndef PBUF_DEBUG #define PBUF_DEBUG LWIP_DBG_OFF #endif /** * API_LIB_DEBUG: Enable debugging in api_lib.c. */ #ifndef API_LIB_DEBUG #define API_LIB_DEBUG LWIP_DBG_OFF #endif /** * API_MSG_DEBUG: Enable debugging in api_msg.c. */ #ifndef API_MSG_DEBUG #define API_MSG_DEBUG LWIP_DBG_OFF #endif /** * SOCKETS_DEBUG: Enable debugging in sockets.c. */ #ifndef SOCKETS_DEBUG #define SOCKETS_DEBUG LWIP_DBG_OFF #endif /** * ICMP_DEBUG: Enable debugging in icmp.c. */ #ifndef ICMP_DEBUG #define ICMP_DEBUG LWIP_DBG_OFF #endif /** * IGMP_DEBUG: Enable debugging in igmp.c. */ #ifndef IGMP_DEBUG #define IGMP_DEBUG LWIP_DBG_OFF #endif /** * INET_DEBUG: Enable debugging in inet.c. */ #ifndef INET_DEBUG #define INET_DEBUG LWIP_DBG_OFF #endif /** * IP_DEBUG: Enable debugging for IP. */ #ifndef IP_DEBUG #define IP_DEBUG LWIP_DBG_OFF #endif /** * IP_REASS_DEBUG: Enable debugging in ip_frag.c for both frag & reass. */ #ifndef IP_REASS_DEBUG #define IP_REASS_DEBUG LWIP_DBG_OFF #endif /** * RAW_DEBUG: Enable debugging in raw.c. */ #ifndef RAW_DEBUG #define RAW_DEBUG LWIP_DBG_OFF #endif /** * MEM_DEBUG: Enable debugging in mem.c. */ #ifndef MEM_DEBUG #define MEM_DEBUG LWIP_DBG_OFF #endif /** * MEMP_DEBUG: Enable debugging in memp.c. */ #ifndef MEMP_DEBUG #define MEMP_DEBUG LWIP_DBG_OFF #endif /** * SYS_DEBUG: Enable debugging in sys.c. */ #ifndef SYS_DEBUG #define SYS_DEBUG LWIP_DBG_OFF #endif /** * TCP_DEBUG: Enable debugging for TCP. */ #ifndef TCP_DEBUG #define TCP_DEBUG LWIP_DBG_OFF #endif /** * TCP_INPUT_DEBUG: Enable debugging in tcp_in.c for incoming debug. */ #ifndef TCP_INPUT_DEBUG #define TCP_INPUT_DEBUG LWIP_DBG_ON #endif /** * TCP_FR_DEBUG: Enable debugging in tcp_in.c for fast retransmit. */ #ifndef TCP_FR_DEBUG #define TCP_FR_DEBUG LWIP_DBG_OFF #endif /** * TCP_RTO_DEBUG: Enable debugging in TCP for retransmit * timeout. */ #ifndef TCP_RTO_DEBUG #define TCP_RTO_DEBUG LWIP_DBG_OFF #endif /** * TCP_CWND_DEBUG: Enable debugging for TCP congestion window. */ #ifndef TCP_CWND_DEBUG #define TCP_CWND_DEBUG LWIP_DBG_OFF #endif /** * TCP_WND_DEBUG: Enable debugging in tcp_in.c for window updating. */ #ifndef TCP_WND_DEBUG #define TCP_WND_DEBUG LWIP_DBG_OFF #endif /** * TCP_OUTPUT_DEBUG: Enable debugging in tcp_out.c output functions. */ #ifndef TCP_OUTPUT_DEBUG #define TCP_OUTPUT_DEBUG LWIP_DBG_OFF #endif /** * TCP_RST_DEBUG: Enable debugging for TCP with the RST message. */ #ifndef TCP_RST_DEBUG #define TCP_RST_DEBUG LWIP_DBG_OFF #endif /** * TCP_QLEN_DEBUG: Enable debugging for TCP queue lengths. */ #ifndef TCP_QLEN_DEBUG #define TCP_QLEN_DEBUG LWIP_DBG_OFF #endif /** * UDP_DEBUG: Enable debugging in UDP. */ #ifndef UDP_DEBUG #define UDP_DEBUG LWIP_DBG_OFF #endif /** * TCPIP_DEBUG: Enable debugging in tcpip.c. */ #ifndef TCPIP_DEBUG #define TCPIP_DEBUG LWIP_DBG_OFF #endif /** * PPP_DEBUG: Enable debugging for PPP. */ #ifndef PPP_DEBUG #define PPP_DEBUG LWIP_DBG_OFF #endif /** * SLIP_DEBUG: Enable debugging in slipif.c. */ #ifndef SLIP_DEBUG #define SLIP_DEBUG LWIP_DBG_OFF #endif /** * DHCP_DEBUG: Enable debugging in dhcp.c. */ #ifndef DHCP_DEBUG #define DHCP_DEBUG LWIP_DBG_OFF #endif /** * AUTOIP_DEBUG: Enable debugging in autoip.c. */ #ifndef AUTOIP_DEBUG #define AUTOIP_DEBUG LWIP_DBG_OFF #endif /** * SNMP_MSG_DEBUG: Enable debugging for SNMP messages. */ #ifndef SNMP_MSG_DEBUG #define SNMP_MSG_DEBUG LWIP_DBG_OFF #endif /** * SNMP_MIB_DEBUG: Enable debugging for SNMP MIBs. */ #ifndef SNMP_MIB_DEBUG #define SNMP_MIB_DEBUG LWIP_DBG_OFF #endif /** * DNS_DEBUG: Enable debugging for DNS. */ #ifndef DNS_DEBUG #define DNS_DEBUG LWIP_DBG_OFF #endif #endif /* __LWIP_OPT_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/pbuf.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIP_PBUF_H__ #define __LWIP_PBUF_H__ #include "lwip/opt.h" #include "lwip/err.h" #ifdef __cplusplus extern "C" { #endif #define PBUF_TRANSPORT_HLEN 20 #define PBUF_IP_HLEN 20 typedef enum { PBUF_TRANSPORT, PBUF_IP, PBUF_LINK, PBUF_RAW } pbuf_layer; typedef enum { PBUF_RAM, /* pbuf data is stored in RAM */ PBUF_ROM, /* pbuf data is stored in ROM */ PBUF_REF, /* pbuf comes from the pbuf pool */ PBUF_POOL /* pbuf payload refers to RAM */ } pbuf_type; /** indicates this packet's data should be immediately passed to the application */ #define PBUF_FLAG_PUSH 0x01U struct pbuf { /** next pbuf in singly linked pbuf chain */ struct pbuf *next; /** pointer to the actual data in the buffer */ void *payload; /** * total length of this buffer and all next buffers in chain * belonging to the same packet. * * For non-queue packet chains this is the invariant: * p->tot_len == p->len + (p->next? p->next->tot_len: 0) */ u16_t tot_len; /** length of this buffer */ u16_t len; /** pbuf_type as u8_t instead of enum to save space */ u8_t /*pbuf_type*/ type; /** misc flags */ u8_t flags; /** * the reference count always equals the number of pointers * that refer to this pbuf. This can be pointers from an application, * the stack itself, or pbuf->next pointers from a chain. */ u16_t ref; }; /* Initializes the pbuf module. This call is empty for now, but may not be in future. */ #define pbuf_init() struct pbuf *pbuf_alloc(pbuf_layer l, u16_t size, pbuf_type type); void pbuf_realloc(struct pbuf *p, u16_t size); u8_t pbuf_header(struct pbuf *p, s16_t header_size); void pbuf_ref(struct pbuf *p); void pbuf_ref_chain(struct pbuf *p); u8_t pbuf_free(struct pbuf *p); u8_t pbuf_clen(struct pbuf *p); void pbuf_cat(struct pbuf *head, struct pbuf *tail); void pbuf_chain(struct pbuf *head, struct pbuf *tail); struct pbuf *pbuf_dechain(struct pbuf *p); err_t pbuf_copy(struct pbuf *p_to, struct pbuf *p_from); u16_t pbuf_copy_partial(struct pbuf *p, void *dataptr, u16_t len, u16_t offset); err_t pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len); struct pbuf *pbuf_coalesce(struct pbuf *p, pbuf_layer layer); #ifdef __cplusplus } #endif #endif /* __LWIP_PBUF_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/raw.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIP_RAW_H__ #define __LWIP_RAW_H__ #include "lwip/opt.h" #if LWIP_RAW /* don't build if not configured for use in lwipopts.h */ #include "lwip/pbuf.h" #include "lwip/inet.h" #include "lwip/ip.h" #include "lwip/ip_addr.h" #ifdef __cplusplus extern "C" { #endif struct raw_pcb { /* Common members of all PCB types */ IP_PCB; struct raw_pcb *next; u8_t protocol; /* receive callback function * @param arg user supplied argument (raw_pcb.recv_arg) * @param pcb the raw_pcb which received data * @param p the packet buffer that was received * @param addr the remote IP address from which the packet was received * @return 1 if the packet was 'eaten' (aka. deleted), * 0 if the packet lives on * If returning 1, the callback is responsible for freeing the pbuf * if it's not used any more. */ u8_t (* recv)(void *arg, struct raw_pcb *pcb, struct pbuf *p, struct ip_addr *addr); /* user-supplied argument for the recv callback */ void *recv_arg; }; /* The following functions is the application layer interface to the RAW code. */ struct raw_pcb * raw_new (u8_t proto); void raw_remove (struct raw_pcb *pcb); err_t raw_bind (struct raw_pcb *pcb, struct ip_addr *ipaddr); err_t raw_connect (struct raw_pcb *pcb, struct ip_addr *ipaddr); void raw_recv (struct raw_pcb *pcb, u8_t (* recv)(void *arg, struct raw_pcb *pcb, struct pbuf *p, struct ip_addr *addr), void *recv_arg); err_t raw_sendto (struct raw_pcb *pcb, struct pbuf *p, struct ip_addr *ipaddr); err_t raw_send (struct raw_pcb *pcb, struct pbuf *p); /* The following functions are the lower layer interface to RAW. */ u8_t raw_input (struct pbuf *p, struct netif *inp); #define raw_init() /* Compatibility define, not init needed. */ #ifdef __cplusplus } #endif #endif /* LWIP_RAW */ #endif /* __LWIP_RAW_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/sio.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. */ /* * This is the interface to the platform specific serial IO module * It needs to be implemented by those platforms which need SLIP or PPP */ #ifndef __SIO_H__ #define __SIO_H__ #include "lwip/arch.h" #ifdef __cplusplus extern "C" { #endif /* If you want to define sio_fd_t elsewhere or differently, define this in your cc.h file. */ #ifndef __sio_fd_t_defined typedef void * sio_fd_t; #endif /* The following functions can be defined to something else in your cc.h file or be implemented in your custom sio.c file. */ #ifndef sio_open /** * Opens a serial device for communication. * * @param devnum device number * @return handle to serial device if successful, NULL otherwise */ sio_fd_t sio_open(u8_t devnum); #endif #ifndef sio_send /** * Sends a single character to the serial device. * * @param c character to send * @param fd serial device handle * * @note This function will block until the character can be sent. */ void sio_send(u8_t c, sio_fd_t fd); #endif #ifndef sio_recv /** * Receives a single character from the serial device. * * @param fd serial device handle * * @note This function will block until a character is received. */ u8_t sio_recv(sio_fd_t fd); #endif #ifndef sio_read /** * Reads from the serial device. * * @param fd serial device handle * @param data pointer to data buffer for receiving * @param len maximum length (in bytes) of data to receive * @return number of bytes actually received - may be 0 if aborted by sio_read_abort * * @note This function will block until data can be received. The blocking * can be cancelled by calling sio_read_abort(). */ u32_t sio_read(sio_fd_t fd, u8_t *data, u32_t len); #endif #ifndef sio_tryread /** * Tries to read from the serial device. Same as sio_read but returns * immediately if no data is available and never blocks. * * @param fd serial device handle * @param data pointer to data buffer for receiving * @param len maximum length (in bytes) of data to receive * @return number of bytes actually received */ u32_t sio_tryread(sio_fd_t fd, u8_t *data, u32_t len); #endif #ifndef sio_write /** * Writes to the serial device. * * @param fd serial device handle * @param data pointer to data to send * @param len length (in bytes) of data to send * @return number of bytes actually sent * * @note This function will block until all data can be sent. */ u32_t sio_write(sio_fd_t fd, u8_t *data, u32_t len); #endif #ifndef sio_read_abort /** * Aborts a blocking sio_read() call. * * @param fd serial device handle */ void sio_read_abort(sio_fd_t fd); #endif #ifdef __cplusplus } #endif #endif /* __SIO_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/snmp.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001, 2002 Leon Woestenberg * Copyright (c) 2001, 2002 Axon Digital Design B.V., The Netherlands. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Leon Woestenberg * */ #ifndef __LWIP_SNMP_H__ #define __LWIP_SNMP_H__ #include "lwip/opt.h" #include "lwip/netif.h" #include "lwip/udp.h" #ifdef __cplusplus extern "C" { #endif /** * @see RFC1213, "MIB-II, 6. Definitions" */ enum snmp_ifType { snmp_ifType_other=1, /* none of the following */ snmp_ifType_regular1822, snmp_ifType_hdh1822, snmp_ifType_ddn_x25, snmp_ifType_rfc877_x25, snmp_ifType_ethernet_csmacd, snmp_ifType_iso88023_csmacd, snmp_ifType_iso88024_tokenBus, snmp_ifType_iso88025_tokenRing, snmp_ifType_iso88026_man, snmp_ifType_starLan, snmp_ifType_proteon_10Mbit, snmp_ifType_proteon_80Mbit, snmp_ifType_hyperchannel, snmp_ifType_fddi, snmp_ifType_lapb, snmp_ifType_sdlc, snmp_ifType_ds1, /* T-1 */ snmp_ifType_e1, /* european equiv. of T-1 */ snmp_ifType_basicISDN, snmp_ifType_primaryISDN, /* proprietary serial */ snmp_ifType_propPointToPointSerial, snmp_ifType_ppp, snmp_ifType_softwareLoopback, snmp_ifType_eon, /* CLNP over IP [11] */ snmp_ifType_ethernet_3Mbit, snmp_ifType_nsip, /* XNS over IP */ snmp_ifType_slip, /* generic SLIP */ snmp_ifType_ultra, /* ULTRA technologies */ snmp_ifType_ds3, /* T-3 */ snmp_ifType_sip, /* SMDS */ snmp_ifType_frame_relay }; #if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */ /** SNMP "sysuptime" Interval */ #define SNMP_SYSUPTIME_INTERVAL 10 /** fixed maximum length for object identifier type */ #define LWIP_SNMP_OBJ_ID_LEN 32 /** internal object identifier representation */ struct snmp_obj_id { u8_t len; s32_t id[LWIP_SNMP_OBJ_ID_LEN]; }; /* system */ void snmp_set_sysdesr(u8_t* str, u8_t* len); void snmp_set_sysobjid(struct snmp_obj_id *oid); void snmp_get_sysobjid_ptr(struct snmp_obj_id **oid); void snmp_inc_sysuptime(void); void snmp_add_sysuptime(u32_t value); void snmp_get_sysuptime(u32_t *value); void snmp_set_syscontact(u8_t *ocstr, u8_t *ocstrlen); void snmp_set_sysname(u8_t *ocstr, u8_t *ocstrlen); void snmp_set_syslocation(u8_t *ocstr, u8_t *ocstrlen); /* network interface */ void snmp_add_ifinoctets(struct netif *ni, u32_t value); void snmp_inc_ifinucastpkts(struct netif *ni); void snmp_inc_ifinnucastpkts(struct netif *ni); void snmp_inc_ifindiscards(struct netif *ni); void snmp_add_ifoutoctets(struct netif *ni, u32_t value); void snmp_inc_ifoutucastpkts(struct netif *ni); void snmp_inc_ifoutnucastpkts(struct netif *ni); void snmp_inc_ifoutdiscards(struct netif *ni); void snmp_inc_iflist(void); void snmp_dec_iflist(void); /* ARP (for atTable and ipNetToMediaTable) */ void snmp_insert_arpidx_tree(struct netif *ni, struct ip_addr *ip); void snmp_delete_arpidx_tree(struct netif *ni, struct ip_addr *ip); /* IP */ void snmp_inc_ipinreceives(void); void snmp_inc_ipinhdrerrors(void); void snmp_inc_ipinaddrerrors(void); void snmp_inc_ipforwdatagrams(void); void snmp_inc_ipinunknownprotos(void); void snmp_inc_ipindiscards(void); void snmp_inc_ipindelivers(void); void snmp_inc_ipoutrequests(void); void snmp_inc_ipoutdiscards(void); void snmp_inc_ipoutnoroutes(void); void snmp_inc_ipreasmreqds(void); void snmp_inc_ipreasmoks(void); void snmp_inc_ipreasmfails(void); void snmp_inc_ipfragoks(void); void snmp_inc_ipfragfails(void); void snmp_inc_ipfragcreates(void); void snmp_inc_iproutingdiscards(void); void snmp_insert_ipaddridx_tree(struct netif *ni); void snmp_delete_ipaddridx_tree(struct netif *ni); void snmp_insert_iprteidx_tree(u8_t dflt, struct netif *ni); void snmp_delete_iprteidx_tree(u8_t dflt, struct netif *ni); /* ICMP */ void snmp_inc_icmpinmsgs(void); void snmp_inc_icmpinerrors(void); void snmp_inc_icmpindestunreachs(void); void snmp_inc_icmpintimeexcds(void); void snmp_inc_icmpinparmprobs(void); void snmp_inc_icmpinsrcquenchs(void); void snmp_inc_icmpinredirects(void); void snmp_inc_icmpinechos(void); void snmp_inc_icmpinechoreps(void); void snmp_inc_icmpintimestamps(void); void snmp_inc_icmpintimestampreps(void); void snmp_inc_icmpinaddrmasks(void); void snmp_inc_icmpinaddrmaskreps(void); void snmp_inc_icmpoutmsgs(void); void snmp_inc_icmpouterrors(void); void snmp_inc_icmpoutdestunreachs(void); void snmp_inc_icmpouttimeexcds(void); void snmp_inc_icmpoutparmprobs(void); void snmp_inc_icmpoutsrcquenchs(void); void snmp_inc_icmpoutredirects(void); void snmp_inc_icmpoutechos(void); void snmp_inc_icmpoutechoreps(void); void snmp_inc_icmpouttimestamps(void); void snmp_inc_icmpouttimestampreps(void); void snmp_inc_icmpoutaddrmasks(void); void snmp_inc_icmpoutaddrmaskreps(void); /* TCP */ void snmp_inc_tcpactiveopens(void); void snmp_inc_tcppassiveopens(void); void snmp_inc_tcpattemptfails(void); void snmp_inc_tcpestabresets(void); void snmp_inc_tcpinsegs(void); void snmp_inc_tcpoutsegs(void); void snmp_inc_tcpretranssegs(void); void snmp_inc_tcpinerrs(void); void snmp_inc_tcpoutrsts(void); /* UDP */ void snmp_inc_udpindatagrams(void); void snmp_inc_udpnoports(void); void snmp_inc_udpinerrors(void); void snmp_inc_udpoutdatagrams(void); void snmp_insert_udpidx_tree(struct udp_pcb *pcb); void snmp_delete_udpidx_tree(struct udp_pcb *pcb); /* SNMP */ void snmp_inc_snmpinpkts(void); void snmp_inc_snmpoutpkts(void); void snmp_inc_snmpinbadversions(void); void snmp_inc_snmpinbadcommunitynames(void); void snmp_inc_snmpinbadcommunityuses(void); void snmp_inc_snmpinasnparseerrs(void); void snmp_inc_snmpintoobigs(void); void snmp_inc_snmpinnosuchnames(void); void snmp_inc_snmpinbadvalues(void); void snmp_inc_snmpinreadonlys(void); void snmp_inc_snmpingenerrs(void); void snmp_add_snmpintotalreqvars(u8_t value); void snmp_add_snmpintotalsetvars(u8_t value); void snmp_inc_snmpingetrequests(void); void snmp_inc_snmpingetnexts(void); void snmp_inc_snmpinsetrequests(void); void snmp_inc_snmpingetresponses(void); void snmp_inc_snmpintraps(void); void snmp_inc_snmpouttoobigs(void); void snmp_inc_snmpoutnosuchnames(void); void snmp_inc_snmpoutbadvalues(void); void snmp_inc_snmpoutgenerrs(void); void snmp_inc_snmpoutgetrequests(void); void snmp_inc_snmpoutgetnexts(void); void snmp_inc_snmpoutsetrequests(void); void snmp_inc_snmpoutgetresponses(void); void snmp_inc_snmpouttraps(void); void snmp_get_snmpgrpid_ptr(struct snmp_obj_id **oid); void snmp_set_snmpenableauthentraps(u8_t *value); void snmp_get_snmpenableauthentraps(u8_t *value); /* LWIP_SNMP support not available */ /* define everything to be empty */ #else /* system */ #define snmp_set_sysdesr(str, len) #define snmp_set_sysobjid(oid); #define snmp_get_sysobjid_ptr(oid) #define snmp_inc_sysuptime() #define snmp_add_sysuptime(value) #define snmp_get_sysuptime(value) #define snmp_set_syscontact(ocstr, ocstrlen); #define snmp_set_sysname(ocstr, ocstrlen); #define snmp_set_syslocation(ocstr, ocstrlen); /* network interface */ #define snmp_add_ifinoctets(ni,value) #define snmp_inc_ifinucastpkts(ni) #define snmp_inc_ifinnucastpkts(ni) #define snmp_inc_ifindiscards(ni) #define snmp_add_ifoutoctets(ni,value) #define snmp_inc_ifoutucastpkts(ni) #define snmp_inc_ifoutnucastpkts(ni) #define snmp_inc_ifoutdiscards(ni) #define snmp_inc_iflist() #define snmp_dec_iflist() /* ARP */ #define snmp_insert_arpidx_tree(ni,ip) #define snmp_delete_arpidx_tree(ni,ip) /* IP */ #define snmp_inc_ipinreceives() #define snmp_inc_ipinhdrerrors() #define snmp_inc_ipinaddrerrors() #define snmp_inc_ipforwdatagrams() #define snmp_inc_ipinunknownprotos() #define snmp_inc_ipindiscards() #define snmp_inc_ipindelivers() #define snmp_inc_ipoutrequests() #define snmp_inc_ipoutdiscards() #define snmp_inc_ipoutnoroutes() #define snmp_inc_ipreasmreqds() #define snmp_inc_ipreasmoks() #define snmp_inc_ipreasmfails() #define snmp_inc_ipfragoks() #define snmp_inc_ipfragfails() #define snmp_inc_ipfragcreates() #define snmp_inc_iproutingdiscards() #define snmp_insert_ipaddridx_tree(ni) #define snmp_delete_ipaddridx_tree(ni) #define snmp_insert_iprteidx_tree(dflt, ni) #define snmp_delete_iprteidx_tree(dflt, ni) /* ICMP */ #define snmp_inc_icmpinmsgs() #define snmp_inc_icmpinerrors() #define snmp_inc_icmpindestunreachs() #define snmp_inc_icmpintimeexcds() #define snmp_inc_icmpinparmprobs() #define snmp_inc_icmpinsrcquenchs() #define snmp_inc_icmpinredirects() #define snmp_inc_icmpinechos() #define snmp_inc_icmpinechoreps() #define snmp_inc_icmpintimestamps() #define snmp_inc_icmpintimestampreps() #define snmp_inc_icmpinaddrmasks() #define snmp_inc_icmpinaddrmaskreps() #define snmp_inc_icmpoutmsgs() #define snmp_inc_icmpouterrors() #define snmp_inc_icmpoutdestunreachs() #define snmp_inc_icmpouttimeexcds() #define snmp_inc_icmpoutparmprobs() #define snmp_inc_icmpoutsrcquenchs() #define snmp_inc_icmpoutredirects() #define snmp_inc_icmpoutechos() #define snmp_inc_icmpoutechoreps() #define snmp_inc_icmpouttimestamps() #define snmp_inc_icmpouttimestampreps() #define snmp_inc_icmpoutaddrmasks() #define snmp_inc_icmpoutaddrmaskreps() /* TCP */ #define snmp_inc_tcpactiveopens() #define snmp_inc_tcppassiveopens() #define snmp_inc_tcpattemptfails() #define snmp_inc_tcpestabresets() #define snmp_inc_tcpinsegs() #define snmp_inc_tcpoutsegs() #define snmp_inc_tcpretranssegs() #define snmp_inc_tcpinerrs() #define snmp_inc_tcpoutrsts() /* UDP */ #define snmp_inc_udpindatagrams() #define snmp_inc_udpnoports() #define snmp_inc_udpinerrors() #define snmp_inc_udpoutdatagrams() #define snmp_insert_udpidx_tree(pcb) #define snmp_delete_udpidx_tree(pcb) /* SNMP */ #define snmp_inc_snmpinpkts() #define snmp_inc_snmpoutpkts() #define snmp_inc_snmpinbadversions() #define snmp_inc_snmpinbadcommunitynames() #define snmp_inc_snmpinbadcommunityuses() #define snmp_inc_snmpinasnparseerrs() #define snmp_inc_snmpintoobigs() #define snmp_inc_snmpinnosuchnames() #define snmp_inc_snmpinbadvalues() #define snmp_inc_snmpinreadonlys() #define snmp_inc_snmpingenerrs() #define snmp_add_snmpintotalreqvars(value) #define snmp_add_snmpintotalsetvars(value) #define snmp_inc_snmpingetrequests() #define snmp_inc_snmpingetnexts() #define snmp_inc_snmpinsetrequests() #define snmp_inc_snmpingetresponses() #define snmp_inc_snmpintraps() #define snmp_inc_snmpouttoobigs() #define snmp_inc_snmpoutnosuchnames() #define snmp_inc_snmpoutbadvalues() #define snmp_inc_snmpoutgenerrs() #define snmp_inc_snmpoutgetrequests() #define snmp_inc_snmpoutgetnexts() #define snmp_inc_snmpoutsetrequests() #define snmp_inc_snmpoutgetresponses() #define snmp_inc_snmpouttraps() #define snmp_get_snmpgrpid_ptr(oid) #define snmp_set_snmpenableauthentraps(value) #define snmp_get_snmpenableauthentraps(value) #endif /* LWIP_SNMP */ #ifdef __cplusplus } #endif #endif /* __LWIP_SNMP_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/snmp_asn1.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * Abstract Syntax Notation One (ISO 8824, 8825) codec. */ /* * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * Author: Christiaan Simons */ #ifndef __LWIP_SNMP_ASN1_H__ #define __LWIP_SNMP_ASN1_H__ #include "lwip/opt.h" #include "lwip/err.h" #include "lwip/pbuf.h" #include "lwip/snmp.h" #if LWIP_SNMP #ifdef __cplusplus extern "C" { #endif #define SNMP_ASN1_UNIV (!0x80 | !0x40) #define SNMP_ASN1_APPLIC (!0x80 | 0x40) #define SNMP_ASN1_CONTXT ( 0x80 | !0x40) #define SNMP_ASN1_CONSTR (0x20) #define SNMP_ASN1_PRIMIT (!0x20) /* universal tags */ #define SNMP_ASN1_INTEG 2 #define SNMP_ASN1_OC_STR 4 #define SNMP_ASN1_NUL 5 #define SNMP_ASN1_OBJ_ID 6 #define SNMP_ASN1_SEQ 16 /* application specific (SNMP) tags */ #define SNMP_ASN1_IPADDR 0 /* octet string size(4) */ #define SNMP_ASN1_COUNTER 1 /* u32_t */ #define SNMP_ASN1_GAUGE 2 /* u32_t */ #define SNMP_ASN1_TIMETICKS 3 /* u32_t */ #define SNMP_ASN1_OPAQUE 4 /* octet string */ /* context specific (SNMP) tags */ #define SNMP_ASN1_PDU_GET_REQ 0 #define SNMP_ASN1_PDU_GET_NEXT_REQ 1 #define SNMP_ASN1_PDU_GET_RESP 2 #define SNMP_ASN1_PDU_SET_REQ 3 #define SNMP_ASN1_PDU_TRAP 4 err_t snmp_asn1_dec_type(struct pbuf *p, u16_t ofs, u8_t *type); err_t snmp_asn1_dec_length(struct pbuf *p, u16_t ofs, u8_t *octets_used, u16_t *length); err_t snmp_asn1_dec_u32t(struct pbuf *p, u16_t ofs, u16_t len, u32_t *value); err_t snmp_asn1_dec_s32t(struct pbuf *p, u16_t ofs, u16_t len, s32_t *value); err_t snmp_asn1_dec_oid(struct pbuf *p, u16_t ofs, u16_t len, struct snmp_obj_id *oid); err_t snmp_asn1_dec_raw(struct pbuf *p, u16_t ofs, u16_t len, u16_t raw_len, u8_t *raw); void snmp_asn1_enc_length_cnt(u16_t length, u8_t *octets_needed); void snmp_asn1_enc_u32t_cnt(u32_t value, u16_t *octets_needed); void snmp_asn1_enc_s32t_cnt(s32_t value, u16_t *octets_needed); void snmp_asn1_enc_oid_cnt(u8_t ident_len, s32_t *ident, u16_t *octets_needed); err_t snmp_asn1_enc_type(struct pbuf *p, u16_t ofs, u8_t type); err_t snmp_asn1_enc_length(struct pbuf *p, u16_t ofs, u16_t length); err_t snmp_asn1_enc_u32t(struct pbuf *p, u16_t ofs, u8_t octets_needed, u32_t value); err_t snmp_asn1_enc_s32t(struct pbuf *p, u16_t ofs, u8_t octets_needed, s32_t value); err_t snmp_asn1_enc_oid(struct pbuf *p, u16_t ofs, u8_t ident_len, s32_t *ident); err_t snmp_asn1_enc_raw(struct pbuf *p, u16_t ofs, u8_t raw_len, u8_t *raw); #ifdef __cplusplus } #endif #endif /* LWIP_SNMP */ #endif /* __LWIP_SNMP_ASN1_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/snmp_msg.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * SNMP Agent message handling structures. */ /* * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * Author: Christiaan Simons */ #ifndef __LWIP_SNMP_MSG_H__ #define __LWIP_SNMP_MSG_H__ #include "lwip/opt.h" #include "lwip/snmp.h" #include "lwip/snmp_structs.h" #if LWIP_SNMP #if SNMP_PRIVATE_MIB #include "private_mib.h" #endif #ifdef __cplusplus extern "C" { #endif /* The listen port of the SNMP agent. Clients have to make their requests to this port. Most standard clients won't work if you change this! */ #ifndef SNMP_IN_PORT #define SNMP_IN_PORT 161 #endif /* The remote port the SNMP agent sends traps to. Most standard trap sinks won't work if you change this! */ #ifndef SNMP_TRAP_PORT #define SNMP_TRAP_PORT 162 #endif #define SNMP_ES_NOERROR 0 #define SNMP_ES_TOOBIG 1 #define SNMP_ES_NOSUCHNAME 2 #define SNMP_ES_BADVALUE 3 #define SNMP_ES_READONLY 4 #define SNMP_ES_GENERROR 5 #define SNMP_GENTRAP_COLDSTART 0 #define SNMP_GENTRAP_WARMSTART 1 #define SNMP_GENTRAP_AUTHFAIL 4 #define SNMP_GENTRAP_ENTERPRISESPC 6 struct snmp_varbind { /* next pointer, NULL for last in list */ struct snmp_varbind *next; /* previous pointer, NULL for first in list */ struct snmp_varbind *prev; /* object identifier length (in s32_t) */ u8_t ident_len; /* object identifier array */ s32_t *ident; /* object value ASN1 type */ u8_t value_type; /* object value length (in u8_t) */ u8_t value_len; /* object value */ void *value; /* encoding varbind seq length length */ u8_t seqlenlen; /* encoding object identifier length length */ u8_t olenlen; /* encoding object value length length */ u8_t vlenlen; /* encoding varbind seq length */ u16_t seqlen; /* encoding object identifier length */ u16_t olen; /* encoding object value length */ u16_t vlen; }; struct snmp_varbind_root { struct snmp_varbind *head; struct snmp_varbind *tail; /* number of variable bindings in list */ u8_t count; /* encoding varbind-list seq length length */ u8_t seqlenlen; /* encoding varbind-list seq length */ u16_t seqlen; }; /** output response message header length fields */ struct snmp_resp_header_lengths { /* encoding error-index length length */ u8_t erridxlenlen; /* encoding error-status length length */ u8_t errstatlenlen; /* encoding request id length length */ u8_t ridlenlen; /* encoding pdu length length */ u8_t pdulenlen; /* encoding community length length */ u8_t comlenlen; /* encoding version length length */ u8_t verlenlen; /* encoding sequence length length */ u8_t seqlenlen; /* encoding error-index length */ u16_t erridxlen; /* encoding error-status length */ u16_t errstatlen; /* encoding request id length */ u16_t ridlen; /* encoding pdu length */ u16_t pdulen; /* encoding community length */ u16_t comlen; /* encoding version length */ u16_t verlen; /* encoding sequence length */ u16_t seqlen; }; /** output response message header length fields */ struct snmp_trap_header_lengths { /* encoding timestamp length length */ u8_t tslenlen; /* encoding specific-trap length length */ u8_t strplenlen; /* encoding generic-trap length length */ u8_t gtrplenlen; /* encoding agent-addr length length */ u8_t aaddrlenlen; /* encoding enterprise-id length length */ u8_t eidlenlen; /* encoding pdu length length */ u8_t pdulenlen; /* encoding community length length */ u8_t comlenlen; /* encoding version length length */ u8_t verlenlen; /* encoding sequence length length */ u8_t seqlenlen; /* encoding timestamp length */ u16_t tslen; /* encoding specific-trap length */ u16_t strplen; /* encoding generic-trap length */ u16_t gtrplen; /* encoding agent-addr length */ u16_t aaddrlen; /* encoding enterprise-id length */ u16_t eidlen; /* encoding pdu length */ u16_t pdulen; /* encoding community length */ u16_t comlen; /* encoding version length */ u16_t verlen; /* encoding sequence length */ u16_t seqlen; }; /* Accepting new SNMP messages. */ #define SNMP_MSG_EMPTY 0 /* Search for matching object for variable binding. */ #define SNMP_MSG_SEARCH_OBJ 1 /* Perform SNMP operation on in-memory object. Pass-through states, for symmetry only. */ #define SNMP_MSG_INTERNAL_GET_OBJDEF 2 #define SNMP_MSG_INTERNAL_GET_VALUE 3 #define SNMP_MSG_INTERNAL_SET_TEST 4 #define SNMP_MSG_INTERNAL_GET_OBJDEF_S 5 #define SNMP_MSG_INTERNAL_SET_VALUE 6 /* Perform SNMP operation on object located externally. In theory this could be used for building a proxy agent. Practical use is for an enterprise spc. app. gateway. */ #define SNMP_MSG_EXTERNAL_GET_OBJDEF 7 #define SNMP_MSG_EXTERNAL_GET_VALUE 8 #define SNMP_MSG_EXTERNAL_SET_TEST 9 #define SNMP_MSG_EXTERNAL_GET_OBJDEF_S 10 #define SNMP_MSG_EXTERNAL_SET_VALUE 11 #define SNMP_COMMUNITY_STR_LEN 64 struct snmp_msg_pstat { /* lwIP local port (161) binding */ struct udp_pcb *pcb; /* source IP address */ struct ip_addr sip; /* source UDP port */ u16_t sp; /* request type */ u8_t rt; /* request ID */ s32_t rid; /* error status */ s32_t error_status; /* error index */ s32_t error_index; /* community name (zero terminated) */ u8_t community[SNMP_COMMUNITY_STR_LEN + 1]; /* community string length (exclusive zero term) */ u8_t com_strlen; /* one out of MSG_EMPTY, MSG_DEMUX, MSG_INTERNAL, MSG_EXTERNAL_x */ u8_t state; /* saved arguments for MSG_EXTERNAL_x */ struct mib_external_node *ext_mib_node; struct snmp_name_ptr ext_name_ptr; struct obj_def ext_object_def; struct snmp_obj_id ext_oid; /* index into input variable binding list */ u8_t vb_idx; /* ptr into input variable binding list */ struct snmp_varbind *vb_ptr; /* list of variable bindings from input */ struct snmp_varbind_root invb; /* list of variable bindings to output */ struct snmp_varbind_root outvb; /* output response lengths used in ASN encoding */ struct snmp_resp_header_lengths rhl; }; struct snmp_msg_trap { /* lwIP local port (161) binding */ struct udp_pcb *pcb; /* destination IP address in network order */ struct ip_addr dip; /* source enterprise ID (sysObjectID) */ struct snmp_obj_id *enterprise; /* source IP address, raw network order format */ u8_t sip_raw[4]; /* generic trap code */ u32_t gen_trap; /* specific trap code */ u32_t spc_trap; /* timestamp */ u32_t ts; /* list of variable bindings to output */ struct snmp_varbind_root outvb; /* output trap lengths used in ASN encoding */ struct snmp_trap_header_lengths thl; }; /** Agent Version constant, 0 = v1 oddity */ extern const s32_t snmp_version; /** Agent default "public" community string */ extern const char snmp_publiccommunity[7]; extern struct snmp_msg_trap trap_msg; /** Agent setup, start listening to port 161. */ void snmp_init(void); void snmp_trap_dst_enable(u8_t dst_idx, u8_t enable); void snmp_trap_dst_ip_set(u8_t dst_idx, struct ip_addr *dst); /** Varbind-list functions. */ struct snmp_varbind* snmp_varbind_alloc(struct snmp_obj_id *oid, u8_t type, u8_t len); void snmp_varbind_free(struct snmp_varbind *vb); void snmp_varbind_list_free(struct snmp_varbind_root *root); void snmp_varbind_tail_add(struct snmp_varbind_root *root, struct snmp_varbind *vb); struct snmp_varbind* snmp_varbind_tail_remove(struct snmp_varbind_root *root); /** Handle an internal (recv) or external (private response) event. */ void snmp_msg_event(u8_t request_id); err_t snmp_send_response(struct snmp_msg_pstat *m_stat); err_t snmp_send_trap(s8_t generic_trap, struct snmp_obj_id *eoid, s32_t specific_trap); void snmp_coldstart_trap(void); void snmp_authfail_trap(void); #ifdef __cplusplus } #endif #endif /* LWIP_SNMP */ #endif /* __LWIP_SNMP_MSG_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/snmp_structs.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * Generic MIB tree structures. * * @todo namespace prefixes */ /* * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * Author: Christiaan Simons */ #ifndef __LWIP_SNMP_STRUCTS_H__ #define __LWIP_SNMP_STRUCTS_H__ #include "lwip/opt.h" #if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */ #include "lwip/snmp.h" #if SNMP_PRIVATE_MIB #include "private_mib.h" #endif #ifdef __cplusplus extern "C" { #endif /* MIB object instance */ #define MIB_OBJECT_NONE 0 #define MIB_OBJECT_SCALAR 1 #define MIB_OBJECT_TAB 2 /* MIB object access */ #define MIB_OBJECT_READ_ONLY 0 #define MIB_OBJECT_READ_WRITE 1 #define MIB_OBJECT_WRITE_ONLY 2 #define MIB_OBJECT_NOT_ACCESSIBLE 3 /** object definition returned by (get_object_def)() */ struct obj_def { /* MIB_OBJECT_NONE (0), MIB_OBJECT_SCALAR (1), MIB_OBJECT_TAB (2) */ u8_t instance; /* 0 read-only, 1 read-write, 2 write-only, 3 not-accessible */ u8_t access; /* ASN type for this object */ u8_t asn_type; /* value length (host length) */ u16_t v_len; /* length of instance part of supplied object identifier */ u8_t id_inst_len; /* instance part of supplied object identifier */ s32_t *id_inst_ptr; }; struct snmp_name_ptr { u8_t ident_len; s32_t *ident; }; /** MIB const scalar (.0) node */ #define MIB_NODE_SC 0x01 /** MIB const array node */ #define MIB_NODE_AR 0x02 /** MIB array node (mem_malloced from RAM) */ #define MIB_NODE_RA 0x03 /** MIB list root node (mem_malloced from RAM) */ #define MIB_NODE_LR 0x04 /** MIB node for external objects */ #define MIB_NODE_EX 0x05 /** node "base class" layout, the mandatory fields for a node */ struct mib_node { /** returns struct obj_def for the given object identifier */ void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od); /** returns object value for the given object identifier, @note the caller must allocate at least len bytes for the value */ void (*get_value)(struct obj_def *od, u16_t len, void *value); /** tests length and/or range BEFORE setting */ u8_t (*set_test)(struct obj_def *od, u16_t len, void *value); /** sets object value, only to be called when set_test() */ void (*set_value)(struct obj_def *od, u16_t len, void *value); /** One out of MIB_NODE_AR, MIB_NODE_LR or MIB_NODE_EX */ const u8_t node_type; /* array or max list length */ const u16_t maxlength; }; /** derived node for scalars .0 index */ typedef struct mib_node mib_scalar_node; /** derived node, points to a fixed size const array of sub-identifiers plus a 'child' pointer */ struct mib_array_node { /* inherited "base class" members */ void (* const get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od); void (* const get_value)(struct obj_def *od, u16_t len, void *value); u8_t (*set_test)(struct obj_def *od, u16_t len, void *value); void (*set_value)(struct obj_def *od, u16_t len, void *value); const u8_t node_type; const u16_t maxlength; /* aditional struct members */ const s32_t *objid; struct mib_node* const *nptr; }; /** derived node, points to a fixed size mem_malloced array of sub-identifiers plus a 'child' pointer */ struct mib_ram_array_node { /* inherited "base class" members */ void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od); void (*get_value)(struct obj_def *od, u16_t len, void *value); u8_t (*set_test)(struct obj_def *od, u16_t len, void *value); void (*set_value)(struct obj_def *od, u16_t len, void *value); u8_t node_type; u16_t maxlength; /* aditional struct members */ s32_t *objid; struct mib_node **nptr; }; struct mib_list_node { struct mib_list_node *prev; struct mib_list_node *next; s32_t objid; struct mib_node *nptr; }; /** derived node, points to a doubly linked list of sub-identifiers plus a 'child' pointer */ struct mib_list_rootnode { /* inherited "base class" members */ void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od); void (*get_value)(struct obj_def *od, u16_t len, void *value); u8_t (*set_test)(struct obj_def *od, u16_t len, void *value); void (*set_value)(struct obj_def *od, u16_t len, void *value); u8_t node_type; u16_t maxlength; /* aditional struct members */ struct mib_list_node *head; struct mib_list_node *tail; /* counts list nodes in list */ u16_t count; }; /** derived node, has access functions for mib object in external memory or device using 'tree_level' and 'idx', with a range 0 .. (level_length() - 1) */ struct mib_external_node { /* inherited "base class" members */ void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od); void (*get_value)(struct obj_def *od, u16_t len, void *value); u8_t (*set_test)(struct obj_def *od, u16_t len, void *value); void (*set_value)(struct obj_def *od, u16_t len, void *value); u8_t node_type; u16_t maxlength; /* aditional struct members */ /** points to an extenal (in memory) record of some sort of addressing information, passed to and interpreted by the funtions below */ void* addr_inf; /** tree levels under this node */ u8_t tree_levels; /** number of objects at this level */ u16_t (*level_length)(void* addr_inf, u8_t level); /** compares object sub identifier with external id return zero when equal, nonzero when unequal */ s32_t (*ident_cmp)(void* addr_inf, u8_t level, u16_t idx, s32_t sub_id); void (*get_objid)(void* addr_inf, u8_t level, u16_t idx, s32_t *sub_id); /** async Questions */ void (*get_object_def_q)(void* addr_inf, u8_t rid, u8_t ident_len, s32_t *ident); void (*get_value_q)(u8_t rid, struct obj_def *od); void (*set_test_q)(u8_t rid, struct obj_def *od); void (*set_value_q)(u8_t rid, struct obj_def *od, u16_t len, void *value); /** async Answers */ void (*get_object_def_a)(u8_t rid, u8_t ident_len, s32_t *ident, struct obj_def *od); void (*get_value_a)(u8_t rid, struct obj_def *od, u16_t len, void *value); u8_t (*set_test_a)(u8_t rid, struct obj_def *od, u16_t len, void *value); void (*set_value_a)(u8_t rid, struct obj_def *od, u16_t len, void *value); /** async Panic Close (agent returns error reply, e.g. used for external transaction cleanup) */ void (*get_object_def_pc)(u8_t rid, u8_t ident_len, s32_t *ident); void (*get_value_pc)(u8_t rid, struct obj_def *od); void (*set_test_pc)(u8_t rid, struct obj_def *od); void (*set_value_pc)(u8_t rid, struct obj_def *od); }; /** export MIB tree from mib2.c */ extern const struct mib_array_node internet; /** dummy function pointers for non-leaf MIB nodes from mib2.c */ void noleafs_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); void noleafs_get_value(struct obj_def *od, u16_t len, void *value); u8_t noleafs_set_test(struct obj_def *od, u16_t len, void *value); void noleafs_set_value(struct obj_def *od, u16_t len, void *value); void snmp_oidtoip(s32_t *ident, struct ip_addr *ip); void snmp_iptooid(struct ip_addr *ip, s32_t *ident); void snmp_ifindextonetif(s32_t ifindex, struct netif **netif); void snmp_netiftoifindex(struct netif *netif, s32_t *ifidx); struct mib_list_node* snmp_mib_ln_alloc(s32_t id); void snmp_mib_ln_free(struct mib_list_node *ln); struct mib_list_rootnode* snmp_mib_lrn_alloc(void); void snmp_mib_lrn_free(struct mib_list_rootnode *lrn); s8_t snmp_mib_node_insert(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **insn); s8_t snmp_mib_node_find(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **fn); struct mib_list_rootnode *snmp_mib_node_delete(struct mib_list_rootnode *rn, struct mib_list_node *n); struct mib_node* snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_name_ptr *np); struct mib_node* snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret); u8_t snmp_iso_prefix_tst(u8_t ident_len, s32_t *ident); u8_t snmp_iso_prefix_expand(u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret); #ifdef __cplusplus } #endif #endif /* LWIP_SNMP */ #endif /* __LWIP_SNMP_STRUCTS_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/sockets.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIP_SOCKETS_H__ #define __LWIP_SOCKETS_H__ #include "lwip/opt.h" #if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */ #include /* for size_t */ #include "lwip/ip_addr.h" #include "lwip/inet.h" #ifdef __cplusplus extern "C" { #endif /* members are in network byte order */ struct sockaddr_in { u8_t sin_len; u8_t sin_family; u16_t sin_port; struct in_addr sin_addr; char sin_zero[8]; }; struct sockaddr { u8_t sa_len; u8_t sa_family; char sa_data[14]; }; #ifndef socklen_t # define socklen_t u32_t #endif /* Socket protocol types (TCP/UDP/RAW) */ #define SOCK_STREAM 1 #define SOCK_DGRAM 2 #define SOCK_RAW 3 /* * Option flags per-socket. These must match the SOF_ flags in ip.h! */ #define SO_DEBUG 0x0001 /* Unimplemented: turn on debugging info recording */ #define SO_ACCEPTCONN 0x0002 /* socket has had listen() */ #define SO_REUSEADDR 0x0004 /* Unimplemented: allow local address reuse */ #define SO_KEEPALIVE 0x0008 /* keep connections alive */ #define SO_DONTROUTE 0x0010 /* Unimplemented: just use interface addresses */ #define SO_BROADCAST 0x0020 /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */ #define SO_USELOOPBACK 0x0040 /* Unimplemented: bypass hardware when possible */ #define SO_LINGER 0x0080 /* linger on close if data present */ #define SO_OOBINLINE 0x0100 /* Unimplemented: leave received OOB data in line */ #define SO_REUSEPORT 0x0200 /* Unimplemented: allow local address & port reuse */ #define SO_DONTLINGER ((int)(~SO_LINGER)) /* * Additional options, not kept in so_options. */ #define SO_SNDBUF 0x1001 /* Unimplemented: send buffer size */ #define SO_RCVBUF 0x1002 /* receive buffer size */ #define SO_SNDLOWAT 0x1003 /* Unimplemented: send low-water mark */ #define SO_RCVLOWAT 0x1004 /* Unimplemented: receive low-water mark */ #define SO_SNDTIMEO 0x1005 /* Unimplemented: send timeout */ #define SO_RCVTIMEO 0x1006 /* receive timeout */ #define SO_ERROR 0x1007 /* get error status and clear */ #define SO_TYPE 0x1008 /* get socket type */ #define SO_CONTIMEO 0x1009 /* Unimplemented: connect timeout */ #define SO_NO_CHECK 0x100a /* don't create UDP checksum */ /* * Structure used for manipulating linger option. */ struct linger { int l_onoff; /* option on/off */ int l_linger; /* linger time */ }; /* * Level number for (get/set)sockopt() to apply to socket itself. */ #define SOL_SOCKET 0xfff /* options for socket level */ #define AF_UNSPEC 0 #define AF_INET 2 #define PF_INET AF_INET #define PF_UNSPEC AF_UNSPEC #define IPPROTO_IP 0 #define IPPROTO_TCP 6 #define IPPROTO_UDP 17 #define IPPROTO_UDPLITE 136 /* Flags we can use with send and recv. */ #define MSG_PEEK 0x01 /* Peeks at an incoming message */ #define MSG_WAITALL 0x02 /* Unimplemented: Requests that the function block until the full amount of data requested can be returned */ #define MSG_OOB 0x04 /* Unimplemented: Requests out-of-band data. The significance and semantics of out-of-band data are protocol-specific */ #define MSG_DONTWAIT 0x08 /* Nonblocking i/o for this operation only */ #define MSG_MORE 0x10 /* Sender will send more */ /* * Options for level IPPROTO_IP */ #define IP_TOS 1 #define IP_TTL 2 #if LWIP_TCP /* * Options for level IPPROTO_TCP */ #define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */ #define TCP_KEEPALIVE 0x02 /* send KEEPALIVE probes when idle for pcb->keep_idle milliseconds */ #define TCP_KEEPIDLE 0x03 /* set pcb->keep_idle - Same as TCP_KEEPALIVE, but use seconds for get/setsockopt */ #define TCP_KEEPINTVL 0x04 /* set pcb->keep_intvl - Use seconds for get/setsockopt */ #define TCP_KEEPCNT 0x05 /* set pcb->keep_cnt - Use number of probes sent for get/setsockopt */ #endif /* LWIP_TCP */ #if LWIP_UDP && LWIP_UDPLITE /* * Options for level IPPROTO_UDPLITE */ #define UDPLITE_SEND_CSCOV 0x01 /* sender checksum coverage */ #define UDPLITE_RECV_CSCOV 0x02 /* minimal receiver checksum coverage */ #endif /* LWIP_UDP && LWIP_UDPLITE*/ #if LWIP_IGMP /* * Options and types for UDP multicast traffic handling */ #define IP_ADD_MEMBERSHIP 3 #define IP_DROP_MEMBERSHIP 4 #define IP_MULTICAST_TTL 5 #define IP_MULTICAST_IF 6 #define IP_MULTICAST_LOOP 7 typedef struct ip_mreq { struct in_addr imr_multiaddr; /* IP multicast address of group */ struct in_addr imr_interface; /* local IP address of interface */ } ip_mreq; #endif /* LWIP_IGMP */ /* * The Type of Service provides an indication of the abstract * parameters of the quality of service desired. These parameters are * to be used to guide the selection of the actual service parameters * when transmitting a datagram through a particular network. Several * networks offer service precedence, which somehow treats high * precedence traffic as more important than other traffic (generally * by accepting only traffic above a certain precedence at time of high * load). The major choice is a three way tradeoff between low-delay, * high-reliability, and high-throughput. * The use of the Delay, Throughput, and Reliability indications may * increase the cost (in some sense) of the service. In many networks * better performance for one of these parameters is coupled with worse * performance on another. Except for very unusual cases at most two * of these three indications should be set. */ #define IPTOS_TOS_MASK 0x1E #define IPTOS_TOS(tos) ((tos) & IPTOS_TOS_MASK) #define IPTOS_LOWDELAY 0x10 #define IPTOS_THROUGHPUT 0x08 #define IPTOS_RELIABILITY 0x04 #define IPTOS_LOWCOST 0x02 #define IPTOS_MINCOST IPTOS_LOWCOST /* * The Network Control precedence designation is intended to be used * within a network only. The actual use and control of that * designation is up to each network. The Internetwork Control * designation is intended for use by gateway control originators only. * If the actual use of these precedence designations is of concern to * a particular network, it is the responsibility of that network to * control the access to, and use of, those precedence designations. */ #define IPTOS_PREC_MASK 0xe0 #define IPTOS_PREC(tos) ((tos) & IPTOS_PREC_MASK) #define IPTOS_PREC_NETCONTROL 0xe0 #define IPTOS_PREC_INTERNETCONTROL 0xc0 #define IPTOS_PREC_CRITIC_ECP 0xa0 #define IPTOS_PREC_FLASHOVERRIDE 0x80 #define IPTOS_PREC_FLASH 0x60 #define IPTOS_PREC_IMMEDIATE 0x40 #define IPTOS_PREC_PRIORITY 0x20 #define IPTOS_PREC_ROUTINE 0x00 /* * Commands for ioctlsocket(), taken from the BSD file fcntl.h. * lwip_ioctl only supports FIONREAD and FIONBIO, for now * * Ioctl's have the command encoded in the lower word, * and the size of any in or out parameters in the upper * word. The high 2 bits of the upper word are used * to encode the in/out status of the parameter; for now * we restrict parameters to at most 128 bytes. */ #if !defined(FIONREAD) || !defined(FIONBIO) #define IOCPARM_MASK 0x7fU /* parameters must be < 128 bytes */ #define IOC_VOID 0x20000000UL /* no parameters */ #define IOC_OUT 0x40000000UL /* copy out parameters */ #define IOC_IN 0x80000000UL /* copy in parameters */ #define IOC_INOUT (IOC_IN|IOC_OUT) /* 0x20000000 distinguishes new & old ioctl's */ #define _IO(x,y) (IOC_VOID|((x)<<8)|(y)) #define _IOR(x,y,t) (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) #define _IOW(x,y,t) (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) #endif /* !defined(FIONREAD) || !defined(FIONBIO) */ #ifndef FIONREAD #define FIONREAD _IOR('f', 127, unsigned long) /* get # bytes to read */ #endif #ifndef FIONBIO #define FIONBIO _IOW('f', 126, unsigned long) /* set/clear non-blocking i/o */ #endif /* Socket I/O Controls: unimplemented */ #ifndef SIOCSHIWAT #define SIOCSHIWAT _IOW('s', 0, unsigned long) /* set high watermark */ #define SIOCGHIWAT _IOR('s', 1, unsigned long) /* get high watermark */ #define SIOCSLOWAT _IOW('s', 2, unsigned long) /* set low watermark */ #define SIOCGLOWAT _IOR('s', 3, unsigned long) /* get low watermark */ #define SIOCATMARK _IOR('s', 7, unsigned long) /* at oob mark? */ #endif /* Socket flags: */ #ifndef O_NONBLOCK #define O_NONBLOCK 04000U #endif /* FD_SET used for lwip_select */ #ifndef FD_SET #undef FD_SETSIZE /* Make FD_SETSIZE match NUM_SOCKETS in socket.c */ #define FD_SETSIZE MEMP_NUM_NETCONN #define FD_SET(n, p) ((p)->fd_bits[(n)/8] |= (1 << ((n) & 7))) #define FD_CLR(n, p) ((p)->fd_bits[(n)/8] &= ~(1 << ((n) & 7))) #define FD_ISSET(n,p) ((p)->fd_bits[(n)/8] & (1 << ((n) & 7))) #define FD_ZERO(p) memset((void*)(p),0,sizeof(*(p))) typedef struct fd_set { unsigned char fd_bits [(FD_SETSIZE+7)/8]; } fd_set; #endif /* FD_SET */ /** LWIP_TIMEVAL_PRIVATE: if you want to use the struct timeval provided * by your system, set this to 0 and include in cc.h */ #ifndef LWIP_TIMEVAL_PRIVATE #define LWIP_TIMEVAL_PRIVATE 1 #endif #if LWIP_TIMEVAL_PRIVATE struct timeval { long tv_sec; /* seconds */ long tv_usec; /* and microseconds */ }; #endif /* LWIP_TIMEVAL_PRIVATE */ void lwip_socket_init(void); int lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen); int lwip_bind(int s, const struct sockaddr *name, socklen_t namelen); int lwip_shutdown(int s, int how); int lwip_getpeername (int s, struct sockaddr *name, socklen_t *namelen); int lwip_getsockname (int s, struct sockaddr *name, socklen_t *namelen); int lwip_getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen); int lwip_setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen); int lwip_close(int s); int lwip_connect(int s, const struct sockaddr *name, socklen_t namelen); int lwip_listen(int s, int backlog); int lwip_recv(int s, void *mem, size_t len, int flags); int lwip_read(int s, void *mem, size_t len); int lwip_recvfrom(int s, void *mem, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen); int lwip_send(int s, const void *dataptr, size_t size, int flags); int lwip_sendto(int s, const void *dataptr, size_t size, int flags, const struct sockaddr *to, socklen_t tolen); int lwip_socket(int domain, int type, int protocol); int lwip_write(int s, const void *dataptr, size_t size); int lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, struct timeval *timeout); int lwip_ioctl(int s, long cmd, void *argp); #if LWIP_COMPAT_SOCKETS #define accept(a,b,c) lwip_accept(a,b,c) #define bind(a,b,c) lwip_bind(a,b,c) #define shutdown(a,b) lwip_shutdown(a,b) #define closesocket(s) lwip_close(s) #define connect(a,b,c) lwip_connect(a,b,c) #define getsockname(a,b,c) lwip_getsockname(a,b,c) #define getpeername(a,b,c) lwip_getpeername(a,b,c) #define setsockopt(a,b,c,d,e) lwip_setsockopt(a,b,c,d,e) #define getsockopt(a,b,c,d,e) lwip_getsockopt(a,b,c,d,e) #define listen(a,b) lwip_listen(a,b) #define recv(a,b,c,d) lwip_recv(a,b,c,d) #define recvfrom(a,b,c,d,e,f) lwip_recvfrom(a,b,c,d,e,f) #define send(a,b,c,d) lwip_send(a,b,c,d) #define sendto(a,b,c,d,e,f) lwip_sendto(a,b,c,d,e,f) #define socket(a,b,c) lwip_socket(a,b,c) #define select(a,b,c,d,e) lwip_select(a,b,c,d,e) #define ioctlsocket(a,b,c) lwip_ioctl(a,b,c) #if LWIP_POSIX_SOCKETS_IO_NAMES #define read(a,b,c) lwip_read(a,b,c) #define write(a,b,c) lwip_write(a,b,c) #define close(s) lwip_close(s) #endif /* LWIP_POSIX_SOCKETS_IO_NAMES */ #endif /* LWIP_COMPAT_SOCKETS */ #ifdef __cplusplus } #endif #endif /* LWIP_SOCKET */ #endif /* __LWIP_SOCKETS_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/stats.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIP_STATS_H__ #define __LWIP_STATS_H__ #include "lwip/opt.h" #include "lwip/mem.h" #include "lwip/memp.h" #ifdef __cplusplus extern "C" { #endif #if LWIP_STATS #ifndef LWIP_STATS_LARGE #define LWIP_STATS_LARGE 0 #endif #if LWIP_STATS_LARGE #define STAT_COUNTER u32_t #define STAT_COUNTER_F U32_F #else #define STAT_COUNTER u16_t #define STAT_COUNTER_F U16_F #endif struct stats_proto { STAT_COUNTER xmit; /* Transmitted packets. */ STAT_COUNTER recv; /* Received packets. */ STAT_COUNTER fw; /* Forwarded packets. */ STAT_COUNTER drop; /* Dropped packets. */ STAT_COUNTER chkerr; /* Checksum error. */ STAT_COUNTER lenerr; /* Invalid length error. */ STAT_COUNTER memerr; /* Out of memory error. */ STAT_COUNTER rterr; /* Routing error. */ STAT_COUNTER proterr; /* Protocol error. */ STAT_COUNTER opterr; /* Error in options. */ STAT_COUNTER err; /* Misc error. */ STAT_COUNTER cachehit; }; struct stats_igmp { STAT_COUNTER lenerr; /* Invalid length error. */ STAT_COUNTER chkerr; /* Checksum error. */ STAT_COUNTER v1_rxed; /* */ STAT_COUNTER join_sent; /* */ STAT_COUNTER leave_sent; /* */ STAT_COUNTER unicast_query; /* */ STAT_COUNTER report_sent; /* */ STAT_COUNTER report_rxed; /* */ STAT_COUNTER group_query_rxed; /* */ }; struct stats_mem { mem_size_t avail; mem_size_t used; mem_size_t max; STAT_COUNTER err; STAT_COUNTER illegal; }; struct stats_syselem { STAT_COUNTER used; STAT_COUNTER max; STAT_COUNTER err; }; struct stats_sys { struct stats_syselem sem; struct stats_syselem mbox; }; struct stats_ { #if LINK_STATS struct stats_proto link; #endif #if ETHARP_STATS struct stats_proto etharp; #endif #if IPFRAG_STATS struct stats_proto ip_frag; #endif #if IP_STATS struct stats_proto ip; #endif #if ICMP_STATS struct stats_proto icmp; #endif #if IGMP_STATS struct stats_igmp igmp; #endif #if UDP_STATS struct stats_proto udp; #endif #if TCP_STATS struct stats_proto tcp; #endif #if MEM_STATS struct stats_mem mem; #endif #if MEMP_STATS struct stats_mem memp[MEMP_MAX]; #endif #if SYS_STATS struct stats_sys sys; #endif }; extern struct stats_ lwip_stats; #define stats_init() /* Compatibility define, not init needed. */ #define STATS_INC(x) ++lwip_stats.x #define STATS_DEC(x) --lwip_stats.x #else #define stats_init() #define STATS_INC(x) #define STATS_DEC(x) #endif /* LWIP_STATS */ #if TCP_STATS #define TCP_STATS_INC(x) STATS_INC(x) #define TCP_STATS_DISPLAY() stats_display_proto(&lwip_stats.tcp, "TCP") #else #define TCP_STATS_INC(x) #define TCP_STATS_DISPLAY() #endif #if UDP_STATS #define UDP_STATS_INC(x) STATS_INC(x) #define UDP_STATS_DISPLAY() stats_display_proto(&lwip_stats.udp, "UDP") #else #define UDP_STATS_INC(x) #define UDP_STATS_DISPLAY() #endif #if ICMP_STATS #define ICMP_STATS_INC(x) STATS_INC(x) #define ICMP_STATS_DISPLAY() stats_display_proto(&lwip_stats.icmp, "ICMP") #else #define ICMP_STATS_INC(x) #define ICMP_STATS_DISPLAY() #endif #if IGMP_STATS #define IGMP_STATS_INC(x) STATS_INC(x) #define IGMP_STATS_DISPLAY() stats_display_igmp(&lwip_stats.igmp) #else #define IGMP_STATS_INC(x) #define IGMP_STATS_DISPLAY() #endif #if IP_STATS #define IP_STATS_INC(x) STATS_INC(x) #define IP_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip, "IP") #else #define IP_STATS_INC(x) #define IP_STATS_DISPLAY() #endif #if IPFRAG_STATS #define IPFRAG_STATS_INC(x) STATS_INC(x) #define IPFRAG_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip_frag, "IP_FRAG") #else #define IPFRAG_STATS_INC(x) #define IPFRAG_STATS_DISPLAY() #endif #if ETHARP_STATS #define ETHARP_STATS_INC(x) STATS_INC(x) #define ETHARP_STATS_DISPLAY() stats_display_proto(&lwip_stats.etharp, "ETHARP") #else #define ETHARP_STATS_INC(x) #define ETHARP_STATS_DISPLAY() #endif #if LINK_STATS #define LINK_STATS_INC(x) STATS_INC(x) #define LINK_STATS_DISPLAY() stats_display_proto(&lwip_stats.link, "LINK") #else #define LINK_STATS_INC(x) #define LINK_STATS_DISPLAY() #endif #if MEM_STATS #define MEM_STATS_AVAIL(x, y) lwip_stats.mem.x = y #define MEM_STATS_INC(x) STATS_INC(mem.x) #define MEM_STATS_INC_USED(x, y) do { lwip_stats.mem.used += y; \ if (lwip_stats.mem.max < lwip_stats.mem.used) { \ lwip_stats.mem.max = lwip_stats.mem.used; \ } \ } while(0) #define MEM_STATS_DEC_USED(x, y) lwip_stats.mem.x -= y #define MEM_STATS_DISPLAY() stats_display_mem(&lwip_stats.mem, "HEAP") #else #define MEM_STATS_AVAIL(x, y) #define MEM_STATS_INC(x) #define MEM_STATS_INC_USED(x, y) #define MEM_STATS_DEC_USED(x, y) #define MEM_STATS_DISPLAY() #endif #if MEMP_STATS #define MEMP_STATS_AVAIL(x, i, y) lwip_stats.memp[i].x = y #define MEMP_STATS_INC(x, i) STATS_INC(memp[i].x) #define MEMP_STATS_DEC(x, i) STATS_DEC(memp[i].x) #define MEMP_STATS_INC_USED(x, i) do { ++lwip_stats.memp[i].used; \ if (lwip_stats.memp[i].max < lwip_stats.memp[i].used) { \ lwip_stats.memp[i].max = lwip_stats.memp[i].used; \ } \ } while(0) #define MEMP_STATS_DISPLAY(i) stats_display_memp(&lwip_stats.memp[i], i) #else #define MEMP_STATS_AVAIL(x, i, y) #define MEMP_STATS_INC(x, i) #define MEMP_STATS_DEC(x, i) #define MEMP_STATS_INC_USED(x, i) #define MEMP_STATS_DISPLAY(i) #endif #if SYS_STATS #define SYS_STATS_INC(x) STATS_INC(sys.x) #define SYS_STATS_DEC(x) STATS_DEC(sys.x) #define SYS_STATS_DISPLAY() stats_display_sys(&lwip_stats.sys) #else #define SYS_STATS_INC(x) #define SYS_STATS_DEC(x) #define SYS_STATS_DISPLAY() #endif /* Display of statistics */ #if LWIP_STATS_DISPLAY void stats_display(void); void stats_display_proto(struct stats_proto *proto, char *name); void stats_display_igmp(struct stats_igmp *igmp); void stats_display_mem(struct stats_mem *mem, char *name); void stats_display_memp(struct stats_mem *mem, int index); void stats_display_sys(struct stats_sys *sys); #else #define stats_display() #define stats_display_proto(proto, name) #define stats_display_igmp(igmp) #define stats_display_mem(mem, name) #define stats_display_memp(mem, index) #define stats_display_sys(sys) #endif /* LWIP_STATS_DISPLAY */ #ifdef __cplusplus } #endif #endif /* __LWIP_STATS_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/sys.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIP_SYS_H__ #define __LWIP_SYS_H__ #include "lwip/opt.h" #ifdef __cplusplus extern "C" { #endif #if NO_SYS /* For a totally minimal and standalone system, we provide null definitions of the sys_ functions. */ typedef u8_t sys_sem_t; typedef u8_t sys_mbox_t; struct sys_timeo {u8_t dummy;}; #define sys_init() #define sys_timeout(m,h,a) #define sys_untimeout(m,a) #define sys_sem_new(c) c #define sys_sem_signal(s) #define sys_sem_wait(s) #define sys_sem_wait_timeout(s,t) #define sys_arch_sem_wait(s,t) #define sys_sem_free(s) #define sys_mbox_new(s) 0 #define sys_mbox_fetch(m,d) #define sys_mbox_tryfetch(m,d) #define sys_mbox_post(m,d) #define sys_mbox_trypost(m,d) #define sys_mbox_free(m) #define sys_thread_new(n,t,a,s,p) #else /* NO_SYS */ /** Return code for timeouts from sys_arch_mbox_fetch and sys_arch_sem_wait */ #define SYS_ARCH_TIMEOUT 0xffffffffUL /* sys_mbox_tryfetch returns SYS_MBOX_EMPTY if appropriate. * For now we use the same magic value, but we allow this to change in future. */ #define SYS_MBOX_EMPTY SYS_ARCH_TIMEOUT #include "lwip/err.h" #include "arch/sys_arch.h" typedef void (* sys_timeout_handler)(void *arg); struct sys_timeo { struct sys_timeo *next; u32_t time; sys_timeout_handler h; void *arg; }; struct sys_timeouts { struct sys_timeo *next; }; /* sys_init() must be called before anthing else. */ void sys_init(void); /* * sys_timeout(): * * Schedule a timeout a specified amount of milliseconds in the * future. When the timeout occurs, the specified timeout handler will * be called. The handler will be passed the "arg" argument when * called. * */ void sys_timeout(u32_t msecs, sys_timeout_handler h, void *arg); void sys_untimeout(sys_timeout_handler h, void *arg); struct sys_timeouts *sys_arch_timeouts(void); /* Semaphore functions. */ sys_sem_t sys_sem_new(u8_t count); void sys_sem_signal(sys_sem_t sem); u32_t sys_arch_sem_wait(sys_sem_t sem, u32_t timeout); void sys_sem_free(sys_sem_t sem); void sys_sem_wait(sys_sem_t sem); int sys_sem_wait_timeout(sys_sem_t sem, u32_t timeout); /* Time functions. */ #ifndef sys_msleep void sys_msleep(u32_t ms); /* only has a (close to) 1 jiffy resolution. */ #endif #ifndef sys_jiffies u32_t sys_jiffies(void); /* since power up. */ #endif /* Mailbox functions. */ sys_mbox_t sys_mbox_new(int size); void sys_mbox_post(sys_mbox_t mbox, void *msg); err_t sys_mbox_trypost(sys_mbox_t mbox, void *msg); u32_t sys_arch_mbox_fetch(sys_mbox_t mbox, void **msg, u32_t timeout); #ifndef sys_arch_mbox_tryfetch /* Allow port to override with a macro */ u32_t sys_arch_mbox_tryfetch(sys_mbox_t mbox, void **msg); #endif /* For now, we map straight to sys_arch implementation. */ #define sys_mbox_tryfetch(mbox, msg) sys_arch_mbox_tryfetch(mbox, msg) void sys_mbox_free(sys_mbox_t mbox); void sys_mbox_fetch(sys_mbox_t mbox, void **msg); /* Thread functions. */ sys_thread_t sys_thread_new(char *name, void (* thread)(void *arg), void *arg, int stacksize, int prio); #endif /* NO_SYS */ /** Returns the current time in milliseconds. */ u32_t sys_now(void); /* Critical Region Protection */ /* These functions must be implemented in the sys_arch.c file. In some implementations they can provide a more light-weight protection mechanism than using semaphores. Otherwise semaphores can be used for implementation */ #ifndef SYS_ARCH_PROTECT /** SYS_LIGHTWEIGHT_PROT * define SYS_LIGHTWEIGHT_PROT in lwipopts.h if you want inter-task protection * for certain critical regions during buffer allocation, deallocation and memory * allocation and deallocation. */ #if SYS_LIGHTWEIGHT_PROT /** SYS_ARCH_DECL_PROTECT * declare a protection variable. This macro will default to defining a variable of * type sys_prot_t. If a particular port needs a different implementation, then * this macro may be defined in sys_arch.h. */ #define SYS_ARCH_DECL_PROTECT(lev) sys_prot_t lev /** SYS_ARCH_PROTECT * Perform a "fast" protect. This could be implemented by * disabling interrupts for an embedded system or by using a semaphore or * mutex. The implementation should allow calling SYS_ARCH_PROTECT when * already protected. The old protection level is returned in the variable * "lev". This macro will default to calling the sys_arch_protect() function * which should be implemented in sys_arch.c. If a particular port needs a * different implementation, then this macro may be defined in sys_arch.h */ #define SYS_ARCH_PROTECT(lev) lev = sys_arch_protect() /** SYS_ARCH_UNPROTECT * Perform a "fast" set of the protection level to "lev". This could be * implemented by setting the interrupt level to "lev" within the MACRO or by * using a semaphore or mutex. This macro will default to calling the * sys_arch_unprotect() function which should be implemented in * sys_arch.c. If a particular port needs a different implementation, then * this macro may be defined in sys_arch.h */ #define SYS_ARCH_UNPROTECT(lev) sys_arch_unprotect(lev) sys_prot_t sys_arch_protect(void); void sys_arch_unprotect(sys_prot_t pval); #else #define SYS_ARCH_DECL_PROTECT(lev) #define SYS_ARCH_PROTECT(lev) #define SYS_ARCH_UNPROTECT(lev) #endif /* SYS_LIGHTWEIGHT_PROT */ #endif /* SYS_ARCH_PROTECT */ /* * Macros to set/get and increase/decrease variables in a thread-safe way. * Use these for accessing variable that are used from more than one thread. */ #ifndef SYS_ARCH_INC #define SYS_ARCH_INC(var, val) do { \ SYS_ARCH_DECL_PROTECT(old_level); \ SYS_ARCH_PROTECT(old_level); \ var += val; \ SYS_ARCH_UNPROTECT(old_level); \ } while(0) #endif /* SYS_ARCH_INC */ #ifndef SYS_ARCH_DEC #define SYS_ARCH_DEC(var, val) do { \ SYS_ARCH_DECL_PROTECT(old_level); \ SYS_ARCH_PROTECT(old_level); \ var -= val; \ SYS_ARCH_UNPROTECT(old_level); \ } while(0) #endif /* SYS_ARCH_DEC */ #ifndef SYS_ARCH_GET #define SYS_ARCH_GET(var, ret) do { \ SYS_ARCH_DECL_PROTECT(old_level); \ SYS_ARCH_PROTECT(old_level); \ ret = var; \ SYS_ARCH_UNPROTECT(old_level); \ } while(0) #endif /* SYS_ARCH_GET */ #ifndef SYS_ARCH_SET #define SYS_ARCH_SET(var, val) do { \ SYS_ARCH_DECL_PROTECT(old_level); \ SYS_ARCH_PROTECT(old_level); \ var = val; \ SYS_ARCH_UNPROTECT(old_level); \ } while(0) #endif /* SYS_ARCH_SET */ #ifdef __cplusplus } #endif #endif /* __LWIP_SYS_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/tcp.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIP_TCP_H__ #define __LWIP_TCP_H__ #include "lwip/opt.h" #if LWIP_TCP /* don't build if not configured for use in lwipopts.h */ #include "lwip/sys.h" #include "lwip/mem.h" #include "lwip/pbuf.h" #include "lwip/ip.h" #include "lwip/icmp.h" #include "lwip/err.h" #ifdef __cplusplus extern "C" { #endif struct tcp_pcb; /* Functions for interfacing with TCP: */ /* Lower layer interface to TCP: */ #define tcp_init() /* Compatibility define, not init needed. */ void tcp_tmr (void); /* Must be called every TCP_TMR_INTERVAL ms. (Typically 250 ms). */ /* Application program's interface: */ struct tcp_pcb * tcp_new (void); struct tcp_pcb * tcp_alloc (u8_t prio); void tcp_arg (struct tcp_pcb *pcb, void *arg); void tcp_accept (struct tcp_pcb *pcb, err_t (* accept)(void *arg, struct tcp_pcb *newpcb, err_t err)); void tcp_recv (struct tcp_pcb *pcb, err_t (* recv)(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)); void tcp_sent (struct tcp_pcb *pcb, err_t (* sent)(void *arg, struct tcp_pcb *tpcb, u16_t len)); void tcp_poll (struct tcp_pcb *pcb, err_t (* poll)(void *arg, struct tcp_pcb *tpcb), u8_t interval); void tcp_err (struct tcp_pcb *pcb, void (* err)(void *arg, err_t err)); #define tcp_mss(pcb) ((pcb)->mss) #define tcp_sndbuf(pcb) ((pcb)->snd_buf) #define tcp_nagle_disable(pcb) ((pcb)->flags |= TF_NODELAY) #define tcp_nagle_enable(pcb) ((pcb)->flags &= ~TF_NODELAY) #define tcp_nagle_disabled(pcb) (((pcb)->flags & TF_NODELAY) != 0) #if TCP_LISTEN_BACKLOG #define tcp_accepted(pcb) (((struct tcp_pcb_listen *)(pcb))->accepts_pending--) #else /* TCP_LISTEN_BACKLOG */ #define tcp_accepted(pcb) #endif /* TCP_LISTEN_BACKLOG */ void tcp_recved (struct tcp_pcb *pcb, u16_t len); err_t tcp_bind (struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port); err_t tcp_connect (struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port, err_t (* connected)(void *arg, struct tcp_pcb *tpcb, err_t err)); struct tcp_pcb * tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog); #define tcp_listen(pcb) tcp_listen_with_backlog(pcb, TCP_DEFAULT_LISTEN_BACKLOG) void tcp_abandon (struct tcp_pcb *pcb, int reset); #define tcp_abort(pcb) tcp_abandon((pcb), 1) err_t tcp_close (struct tcp_pcb *pcb); /* Flags for "apiflags" parameter in tcp_write and tcp_enqueue */ #define TCP_WRITE_FLAG_COPY 0x01 #define TCP_WRITE_FLAG_MORE 0x02 err_t tcp_write (struct tcp_pcb *pcb, const void *dataptr, u16_t len, u8_t apiflags); void tcp_setprio (struct tcp_pcb *pcb, u8_t prio); #define TCP_PRIO_MIN 1 #define TCP_PRIO_NORMAL 64 #define TCP_PRIO_MAX 127 /* It is also possible to call these two functions at the right intervals (instead of calling tcp_tmr()). */ void tcp_slowtmr (void); void tcp_fasttmr (void); /* Only used by IP to pass a TCP segment to TCP: */ void tcp_input (struct pbuf *p, struct netif *inp); /* Used within the TCP code only: */ err_t tcp_send_empty_ack(struct tcp_pcb *pcb); err_t tcp_output (struct tcp_pcb *pcb); void tcp_rexmit (struct tcp_pcb *pcb); void tcp_rexmit_rto (struct tcp_pcb *pcb); void tcp_rexmit_fast (struct tcp_pcb *pcb); u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb); /** * This is the Nagle algorithm: try to combine user data to send as few TCP * segments as possible. Only send if * - no previously transmitted data on the connection remains unacknowledged or * - the TF_NODELAY flag is set (nagle algorithm turned off for this pcb) or * - the only unsent segment is at least pcb->mss bytes long (or there is more * than one unsent segment - with lwIP, this can happen although unsent->len < mss) * - or if we are in fast-retransmit (TF_INFR) */ #define tcp_do_output_nagle(tpcb) ((((tpcb)->unacked == NULL) || \ ((tpcb)->flags & (TF_NODELAY | TF_INFR)) || \ (((tpcb)->unsent != NULL) && (((tpcb)->unsent->next != NULL) || \ ((tpcb)->unsent->len >= (tpcb)->mss))) \ ) ? 1 : 0) #define tcp_output_nagle(tpcb) (tcp_do_output_nagle(tpcb) ? tcp_output(tpcb) : ERR_OK) #define TCP_SEQ_LT(a,b) ((s32_t)((a)-(b)) < 0) #define TCP_SEQ_LEQ(a,b) ((s32_t)((a)-(b)) <= 0) #define TCP_SEQ_GT(a,b) ((s32_t)((a)-(b)) > 0) #define TCP_SEQ_GEQ(a,b) ((s32_t)((a)-(b)) >= 0) /* is b<=a<=c? */ #if 0 /* see bug #10548 */ #define TCP_SEQ_BETWEEN(a,b,c) ((c)-(b) >= (a)-(b)) #endif #define TCP_SEQ_BETWEEN(a,b,c) (TCP_SEQ_GEQ(a,b) && TCP_SEQ_LEQ(a,c)) #define TCP_FIN 0x01U #define TCP_SYN 0x02U #define TCP_RST 0x04U #define TCP_PSH 0x08U #define TCP_ACK 0x10U #define TCP_URG 0x20U #define TCP_ECE 0x40U #define TCP_CWR 0x80U #define TCP_FLAGS 0x3fU /* Length of the TCP header, excluding options. */ #define TCP_HLEN 20 #ifndef TCP_TMR_INTERVAL #define TCP_TMR_INTERVAL 250 /* The TCP timer interval in milliseconds. */ #endif /* TCP_TMR_INTERVAL */ #ifndef TCP_FAST_INTERVAL #define TCP_FAST_INTERVAL TCP_TMR_INTERVAL /* the fine grained timeout in milliseconds */ #endif /* TCP_FAST_INTERVAL */ #ifndef TCP_SLOW_INTERVAL #define TCP_SLOW_INTERVAL (2*TCP_TMR_INTERVAL) /* the coarse grained timeout in milliseconds */ #endif /* TCP_SLOW_INTERVAL */ #define TCP_FIN_WAIT_TIMEOUT 20000 /* milliseconds */ #define TCP_SYN_RCVD_TIMEOUT 20000 /* milliseconds */ #define TCP_OOSEQ_TIMEOUT 6U /* x RTO */ #ifndef TCP_MSL #define TCP_MSL 60000UL /* The maximum segment lifetime in milliseconds */ #endif /* Keepalive values, compliant with RFC 1122. Don't change this unless you know what you're doing */ #ifndef TCP_KEEPIDLE_DEFAULT #define TCP_KEEPIDLE_DEFAULT 7200000UL /* Default KEEPALIVE timer in milliseconds */ #endif #ifndef TCP_KEEPINTVL_DEFAULT #define TCP_KEEPINTVL_DEFAULT 75000UL /* Default Time between KEEPALIVE probes in milliseconds */ #endif #ifndef TCP_KEEPCNT_DEFAULT #define TCP_KEEPCNT_DEFAULT 9U /* Default Counter for KEEPALIVE probes */ #endif #define TCP_MAXIDLE TCP_KEEPCNT_DEFAULT * TCP_KEEPINTVL_DEFAULT /* Maximum KEEPALIVE probe time */ /* Fields are (of course) in network byte order. * Some fields are converted to host byte order in tcp_input(). */ #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" #endif PACK_STRUCT_BEGIN struct tcp_hdr { PACK_STRUCT_FIELD(u16_t src); PACK_STRUCT_FIELD(u16_t dest); PACK_STRUCT_FIELD(u32_t seqno); PACK_STRUCT_FIELD(u32_t ackno); PACK_STRUCT_FIELD(u16_t _hdrlen_rsvd_flags); PACK_STRUCT_FIELD(u16_t wnd); PACK_STRUCT_FIELD(u16_t chksum); PACK_STRUCT_FIELD(u16_t urgp); } PACK_STRUCT_STRUCT; PACK_STRUCT_END #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/epstruct.h" #endif #define TCPH_OFFSET(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) >> 8) #define TCPH_HDRLEN(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) >> 12) #define TCPH_FLAGS(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) & TCP_FLAGS) #define TCPH_OFFSET_SET(phdr, offset) (phdr)->_hdrlen_rsvd_flags = htons(((offset) << 8) | TCPH_FLAGS(phdr)) #define TCPH_HDRLEN_SET(phdr, len) (phdr)->_hdrlen_rsvd_flags = htons(((len) << 12) | TCPH_FLAGS(phdr)) #define TCPH_FLAGS_SET(phdr, flags) (phdr)->_hdrlen_rsvd_flags = (((phdr)->_hdrlen_rsvd_flags & htons((u16_t)(~(u16_t)(TCP_FLAGS)))) | htons(flags)) #define TCPH_SET_FLAG(phdr, flags ) (phdr)->_hdrlen_rsvd_flags = ((phdr)->_hdrlen_rsvd_flags | htons(flags)) #define TCPH_UNSET_FLAG(phdr, flags) (phdr)->_hdrlen_rsvd_flags = htons(ntohs((phdr)->_hdrlen_rsvd_flags) | (TCPH_FLAGS(phdr) & ~(flags)) ) #define TCP_TCPLEN(seg) ((seg)->len + ((TCPH_FLAGS((seg)->tcphdr) & (TCP_FIN | TCP_SYN)) != 0)) enum tcp_state { CLOSED = 0, LISTEN = 1, SYN_SENT = 2, SYN_RCVD = 3, ESTABLISHED = 4, FIN_WAIT_1 = 5, FIN_WAIT_2 = 6, CLOSE_WAIT = 7, CLOSING = 8, LAST_ACK = 9, TIME_WAIT = 10 }; /** Flags used on input processing, not on pcb->flags */ #define TF_RESET (u8_t)0x08U /* Connection was reset. */ #define TF_CLOSED (u8_t)0x10U /* Connection was sucessfully closed. */ #define TF_GOT_FIN (u8_t)0x20U /* Connection was closed by the remote end. */ #if LWIP_CALLBACK_API /* Function to call when a listener has been connected. * @param arg user-supplied argument (tcp_pcb.callback_arg) * @param pcb a new tcp_pcb that now is connected * @param err an error argument (TODO: that is current always ERR_OK?) * @return ERR_OK: accept the new connection, * any other err_t abortsthe new connection */ #define DEF_ACCEPT_CALLBACK err_t (* accept)(void *arg, struct tcp_pcb *newpcb, err_t err) #else /* LWIP_CALLBACK_API */ #define DEF_ACCEPT_CALLBACK #endif /* LWIP_CALLBACK_API */ /** * members common to struct tcp_pcb and struct tcp_listen_pcb */ #define TCP_PCB_COMMON(type) \ type *next; /* for the linked list */ \ enum tcp_state state; /* TCP state */ \ u8_t prio; \ void *callback_arg; \ /* ports are in host byte order */ \ u16_t local_port; \ /* the accept callback for listen- and normal pcbs, if LWIP_CALLBACK_API */ \ DEF_ACCEPT_CALLBACK /* the TCP protocol control block */ struct tcp_pcb { /** common PCB members */ IP_PCB; /** protocol specific PCB members */ TCP_PCB_COMMON(struct tcp_pcb); /* ports are in host byte order */ u16_t remote_port; u8_t flags; #define TF_ACK_DELAY ((u8_t)0x01U) /* Delayed ACK. */ #define TF_ACK_NOW ((u8_t)0x02U) /* Immediate ACK. */ #define TF_INFR ((u8_t)0x04U) /* In fast recovery. */ #define TF_TIMESTAMP ((u8_t)0x08U) /* Timestamp option enabled */ #define TF_FIN ((u8_t)0x20U) /* Connection was closed locally (FIN segment enqueued). */ #define TF_NODELAY ((u8_t)0x40U) /* Disable Nagle algorithm */ #define TF_NAGLEMEMERR ((u8_t)0x80U) /* nagle enabled, memerr, try to output to prevent delayed ACK to happen */ /* the rest of the fields are in host byte order as we have to do some math with them */ /* receiver variables */ u32_t rcv_nxt; /* next seqno expected */ u16_t rcv_wnd; /* receiver window available */ u16_t rcv_ann_wnd; /* receiver window to announce */ u32_t rcv_ann_right_edge; /* announced right edge of window */ /* Timers */ u32_t tmr; u8_t polltmr, pollinterval; /* Retransmission timer. */ s16_t rtime; u16_t mss; /* maximum segment size */ /* RTT (round trip time) estimation variables */ u32_t rttest; /* RTT estimate in 500ms ticks */ u32_t rtseq; /* sequence number being timed */ s16_t sa, sv; /* @todo document this */ s16_t rto; /* retransmission time-out */ u8_t nrtx; /* number of retransmissions */ /* fast retransmit/recovery */ u32_t lastack; /* Highest acknowledged seqno. */ u8_t dupacks; /* congestion avoidance/control variables */ u16_t cwnd; u16_t ssthresh; /* sender variables */ u32_t snd_nxt; /* next new seqno to be sent */ u16_t snd_wnd; /* sender window */ u32_t snd_wl1, snd_wl2; /* Sequence and acknowledgement numbers of last window update. */ u32_t snd_lbb; /* Sequence number of next byte to be buffered. */ u16_t acked; u16_t snd_buf; /* Available buffer space for sending (in bytes). */ #define TCP_SNDQUEUELEN_OVERFLOW (0xffff-3) u16_t snd_queuelen; /* Available buffer space for sending (in tcp_segs). */ /* These are ordered by sequence number: */ struct tcp_seg *unsent; /* Unsent (queued) segments. */ struct tcp_seg *unacked; /* Sent but unacknowledged segments. */ #if TCP_QUEUE_OOSEQ struct tcp_seg *ooseq; /* Received out of sequence segments. */ #endif /* TCP_QUEUE_OOSEQ */ struct pbuf *refused_data; /* Data previously received but not yet taken by upper layer */ #if LWIP_CALLBACK_API /* Function to be called when more send buffer space is available. * @param arg user-supplied argument (tcp_pcb.callback_arg) * @param pcb the tcp_pcb which has send buffer space available * @param space the amount of bytes available * @return ERR_OK: try to send some data by calling tcp_output */ err_t (* sent)(void *arg, struct tcp_pcb *pcb, u16_t space); /* Function to be called when (in-sequence) data has arrived. * @param arg user-supplied argument (tcp_pcb.callback_arg) * @param pcb the tcp_pcb for which data has arrived * @param p the packet buffer which arrived * @param err an error argument (TODO: that is current always ERR_OK?) * @return ERR_OK: try to send some data by calling tcp_output */ err_t (* recv)(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err); /* Function to be called when a connection has been set up. * @param arg user-supplied argument (tcp_pcb.callback_arg) * @param pcb the tcp_pcb that now is connected * @param err an error argument (TODO: that is current always ERR_OK?) * @return value is currently ignored */ err_t (* connected)(void *arg, struct tcp_pcb *pcb, err_t err); /* Function which is called periodically. * The period can be adjusted in multiples of the TCP slow timer interval * by changing tcp_pcb.polltmr. * @param arg user-supplied argument (tcp_pcb.callback_arg) * @param pcb the tcp_pcb to poll for * @return ERR_OK: try to send some data by calling tcp_output */ err_t (* poll)(void *arg, struct tcp_pcb *pcb); /* Function to be called whenever a fatal error occurs. * There is no pcb parameter since most of the times, the pcb is * already deallocated (or there is no pcb) when this function is called. * @param arg user-supplied argument (tcp_pcb.callback_arg) * @param err an indication why the error callback is called: * ERR_ABRT: aborted through tcp_abort or by a TCP timer * ERR_RST: the connection was reset by the remote host */ void (* errf)(void *arg, err_t err); #endif /* LWIP_CALLBACK_API */ #if LWIP_TCP_TIMESTAMPS u32_t ts_lastacksent; u32_t ts_recent; #endif /* LWIP_TCP_TIMESTAMPS */ /* idle time before KEEPALIVE is sent */ u32_t keep_idle; #if LWIP_TCP_KEEPALIVE u32_t keep_intvl; u32_t keep_cnt; #endif /* LWIP_TCP_KEEPALIVE */ /* Persist timer counter */ u32_t persist_cnt; /* Persist timer back-off */ u8_t persist_backoff; /* KEEPALIVE counter */ u8_t keep_cnt_sent; }; struct tcp_pcb_listen { /* Common members of all PCB types */ IP_PCB; /* Protocol specific PCB members */ TCP_PCB_COMMON(struct tcp_pcb_listen); #if TCP_LISTEN_BACKLOG u8_t backlog; u8_t accepts_pending; #endif /* TCP_LISTEN_BACKLOG */ }; #if LWIP_EVENT_API enum lwip_event { LWIP_EVENT_ACCEPT, LWIP_EVENT_SENT, LWIP_EVENT_RECV, LWIP_EVENT_CONNECTED, LWIP_EVENT_POLL, LWIP_EVENT_ERR }; err_t lwip_tcp_event(void *arg, struct tcp_pcb *pcb, enum lwip_event, struct pbuf *p, u16_t size, err_t err); #define TCP_EVENT_ACCEPT(pcb,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ LWIP_EVENT_ACCEPT, NULL, 0, err) #define TCP_EVENT_SENT(pcb,space,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ LWIP_EVENT_SENT, NULL, space, ERR_OK) #define TCP_EVENT_RECV(pcb,p,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ LWIP_EVENT_RECV, (p), 0, (err)) #define TCP_EVENT_CONNECTED(pcb,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ LWIP_EVENT_CONNECTED, NULL, 0, (err)) #define TCP_EVENT_POLL(pcb,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ LWIP_EVENT_POLL, NULL, 0, ERR_OK) #define TCP_EVENT_ERR(errf,arg,err) lwip_tcp_event((arg), NULL, \ LWIP_EVENT_ERR, NULL, 0, (err)) #else /* LWIP_EVENT_API */ #define TCP_EVENT_ACCEPT(pcb,err,ret) \ do { \ if((pcb)->accept != NULL) \ (ret) = (pcb)->accept((pcb)->callback_arg,(pcb),(err)); \ else (ret) = ERR_OK; \ } while (0) #define TCP_EVENT_SENT(pcb,space,ret) \ do { \ if((pcb)->sent != NULL) \ (ret) = (pcb)->sent((pcb)->callback_arg,(pcb),(space)); \ else (ret) = ERR_OK; \ } while (0) #define TCP_EVENT_RECV(pcb,p,err,ret) \ do { \ if((pcb)->recv != NULL) { \ (ret) = (pcb)->recv((pcb)->callback_arg,(pcb),(p),(err)); \ } else { \ (ret) = tcp_recv_null(NULL, (pcb), (p), (err)); \ } \ } while (0) #define TCP_EVENT_CONNECTED(pcb,err,ret) \ do { \ if((pcb)->connected != NULL) \ (ret) = (pcb)->connected((pcb)->callback_arg,(pcb),(err)); \ else (ret) = ERR_OK; \ } while (0) #define TCP_EVENT_POLL(pcb,ret) \ do { \ if((pcb)->poll != NULL) \ (ret) = (pcb)->poll((pcb)->callback_arg,(pcb)); \ else (ret) = ERR_OK; \ } while (0) #define TCP_EVENT_ERR(errf,arg,err) \ do { \ if((errf) != NULL) \ (errf)((arg),(err)); \ } while (0) #endif /* LWIP_EVENT_API */ /* This structure represents a TCP segment on the unsent and unacked queues */ struct tcp_seg { struct tcp_seg *next; /* used when putting segements on a queue */ struct pbuf *p; /* buffer containing data + TCP header */ void *dataptr; /* pointer to the TCP data in the pbuf */ u16_t len; /* the TCP length of this segment */ u8_t flags; #define TF_SEG_OPTS_MSS (u8_t)0x01U /* Include MSS option. */ #define TF_SEG_OPTS_TS (u8_t)0x02U /* Include timestamp option. */ struct tcp_hdr *tcphdr; /* the TCP header */ }; #define LWIP_TCP_OPT_LENGTH(flags) \ (flags & TF_SEG_OPTS_MSS ? 4 : 0) + \ (flags & TF_SEG_OPTS_TS ? 12 : 0) /** This returns a TCP header option for MSS in an u32_t */ #define TCP_BUILD_MSS_OPTION(x) (x) = htonl(((u32_t)2 << 24) | \ ((u32_t)4 << 16) | \ (((u32_t)TCP_MSS / 256) << 8) | \ (TCP_MSS & 255)) /* Internal functions and global variables: */ struct tcp_pcb *tcp_pcb_copy(struct tcp_pcb *pcb); void tcp_pcb_purge(struct tcp_pcb *pcb); void tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb); u8_t tcp_segs_free(struct tcp_seg *seg); u8_t tcp_seg_free(struct tcp_seg *seg); struct tcp_seg *tcp_seg_copy(struct tcp_seg *seg); #define tcp_ack(pcb) \ do { \ if((pcb)->flags & TF_ACK_DELAY) { \ (pcb)->flags &= ~TF_ACK_DELAY; \ (pcb)->flags |= TF_ACK_NOW; \ tcp_output(pcb); \ } \ else { \ (pcb)->flags |= TF_ACK_DELAY; \ } \ } while (0) #define tcp_ack_now(pcb) \ do { \ (pcb)->flags |= TF_ACK_NOW; \ tcp_output(pcb); \ } while (0) err_t tcp_send_ctrl(struct tcp_pcb *pcb, u8_t flags); err_t tcp_enqueue(struct tcp_pcb *pcb, void *dataptr, u16_t len, u8_t flags, u8_t apiflags, u8_t optflags); void tcp_rexmit_seg(struct tcp_pcb *pcb, struct tcp_seg *seg); void tcp_rst(u32_t seqno, u32_t ackno, struct ip_addr *local_ip, struct ip_addr *remote_ip, u16_t local_port, u16_t remote_port); u32_t tcp_next_iss(void); void tcp_keepalive(struct tcp_pcb *pcb); void tcp_zero_window_probe(struct tcp_pcb *pcb); #if TCP_CALCULATE_EFF_SEND_MSS u16_t tcp_eff_send_mss(u16_t sendmss, struct ip_addr *addr); #endif /* TCP_CALCULATE_EFF_SEND_MSS */ #if LWIP_CALLBACK_API err_t tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err); #endif /* LWIP_CALLBACK_API */ extern struct tcp_pcb *tcp_input_pcb; extern u32_t tcp_ticks; const char* tcp_debug_state_str(enum tcp_state s); #if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG void tcp_debug_print(struct tcp_hdr *tcphdr); void tcp_debug_print_flags(u8_t flags); void tcp_debug_print_state(enum tcp_state s); void tcp_debug_print_pcbs(void); s16_t tcp_pcbs_sane(void); #else # define tcp_debug_print(tcphdr) # define tcp_debug_print_flags(flags) # define tcp_debug_print_state(s) # define tcp_debug_print_pcbs() # define tcp_pcbs_sane() 1 #endif /* TCP_DEBUG */ #if NO_SYS #define tcp_timer_needed() #else void tcp_timer_needed(void); #endif /* The TCP PCB lists. */ union tcp_listen_pcbs_t { /* List of all TCP PCBs in LISTEN state. */ struct tcp_pcb_listen *listen_pcbs; struct tcp_pcb *pcbs; }; extern union tcp_listen_pcbs_t tcp_listen_pcbs; extern struct tcp_pcb *tcp_active_pcbs; /* List of all TCP PCBs that are in a state in which they accept or send data. */ extern struct tcp_pcb *tcp_tw_pcbs; /* List of all TCP PCBs in TIME-WAIT. */ extern struct tcp_pcb *tcp_tmp_pcb; /* Only used for temporary storage. */ /* Axioms about the above lists: 1) Every TCP PCB that is not CLOSED is in one of the lists. 2) A PCB is only in one of the lists. 3) All PCBs in the tcp_listen_pcbs list is in LISTEN state. 4) All PCBs in the tcp_tw_pcbs list is in TIME-WAIT state. */ /* Define two macros, TCP_REG and TCP_RMV that registers a TCP PCB with a PCB list or removes a PCB from a list, respectively. */ #if 0 #define TCP_REG(pcbs, npcb) do {\ LWIP_DEBUGF(TCP_DEBUG, ("TCP_REG %p local port %d\n", npcb, npcb->local_port)); \ for(tcp_tmp_pcb = *pcbs; \ tcp_tmp_pcb != NULL; \ tcp_tmp_pcb = tcp_tmp_pcb->next) { \ LWIP_ASSERT("TCP_REG: already registered\n", tcp_tmp_pcb != npcb); \ } \ LWIP_ASSERT("TCP_REG: pcb->state != CLOSED", npcb->state != CLOSED); \ npcb->next = *pcbs; \ LWIP_ASSERT("TCP_REG: npcb->next != npcb", npcb->next != npcb); \ *(pcbs) = npcb; \ LWIP_ASSERT("TCP_RMV: tcp_pcbs sane", tcp_pcbs_sane()); \ tcp_timer_needed(); \ } while(0) #define TCP_RMV(pcbs, npcb) do { \ LWIP_ASSERT("TCP_RMV: pcbs != NULL", *pcbs != NULL); \ LWIP_DEBUGF(TCP_DEBUG, ("TCP_RMV: removing %p from %p\n", npcb, *pcbs)); \ if(*pcbs == npcb) { \ *pcbs = (*pcbs)->next; \ } else for(tcp_tmp_pcb = *pcbs; tcp_tmp_pcb != NULL; tcp_tmp_pcb = tcp_tmp_pcb->next) { \ if(tcp_tmp_pcb->next == npcb) { \ tcp_tmp_pcb->next = npcb->next; \ break; \ } \ } \ npcb->next = NULL; \ LWIP_ASSERT("TCP_RMV: tcp_pcbs sane", tcp_pcbs_sane()); \ LWIP_DEBUGF(TCP_DEBUG, ("TCP_RMV: removed %p from %p\n", npcb, *pcbs)); \ } while(0) #else /* LWIP_DEBUG */ #define TCP_REG(pcbs, npcb) \ do { \ npcb->next = *pcbs; \ *(pcbs) = npcb; \ tcp_timer_needed(); \ } while (0) #define TCP_RMV(pcbs, npcb) \ do { \ if(*(pcbs) == npcb) { \ (*(pcbs)) = (*pcbs)->next; \ } \ else { \ for(tcp_tmp_pcb = *pcbs; \ tcp_tmp_pcb != NULL; \ tcp_tmp_pcb = tcp_tmp_pcb->next) { \ if(tcp_tmp_pcb->next == npcb) { \ tcp_tmp_pcb->next = npcb->next; \ break; \ } \ } \ } \ npcb->next = NULL; \ } while(0) #endif /* LWIP_DEBUG */ #ifdef __cplusplus } #endif #endif /* LWIP_TCP */ #endif /* __LWIP_TCP_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/tcpip.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIP_TCPIP_H__ #define __LWIP_TCPIP_H__ #include "lwip/opt.h" #if !NO_SYS /* don't build if not configured for use in lwipopts.h */ #include "lwip/api_msg.h" #include "lwip/netifapi.h" #include "lwip/pbuf.h" #include "lwip/api.h" #include "lwip/sys.h" #include "lwip/netif.h" #ifdef __cplusplus extern "C" { #endif #if LWIP_TCPIP_CORE_LOCKING /** The global semaphore to lock the stack. */ extern sys_sem_t lock_tcpip_core; #define LOCK_TCPIP_CORE() sys_sem_wait(lock_tcpip_core) #define UNLOCK_TCPIP_CORE() sys_sem_signal(lock_tcpip_core) #define TCPIP_APIMSG(m) tcpip_apimsg_lock(m) #define TCPIP_APIMSG_ACK(m) #define TCPIP_NETIFAPI(m) tcpip_netifapi_lock(m) #define TCPIP_NETIFAPI_ACK(m) #else #define LOCK_TCPIP_CORE() #define UNLOCK_TCPIP_CORE() #define TCPIP_APIMSG(m) tcpip_apimsg(m) #define TCPIP_APIMSG_ACK(m) sys_sem_signal(m->conn->op_completed) #define TCPIP_NETIFAPI(m) tcpip_netifapi(m) #define TCPIP_NETIFAPI_ACK(m) sys_sem_signal(m->sem) #endif /* LWIP_TCPIP_CORE_LOCKING */ void tcpip_init(void (* tcpip_init_done)(void *), void *arg); #if LWIP_NETCONN err_t tcpip_apimsg(struct api_msg *apimsg); #if LWIP_TCPIP_CORE_LOCKING err_t tcpip_apimsg_lock(struct api_msg *apimsg); #endif /* LWIP_TCPIP_CORE_LOCKING */ #endif /* LWIP_NETCONN */ err_t tcpip_input(struct pbuf *p, struct netif *inp); #if LWIP_NETIF_API err_t tcpip_netifapi(struct netifapi_msg *netifapimsg); #if LWIP_TCPIP_CORE_LOCKING err_t tcpip_netifapi_lock(struct netifapi_msg *netifapimsg); #endif /* LWIP_TCPIP_CORE_LOCKING */ #endif /* LWIP_NETIF_API */ err_t tcpip_callback_with_block(void (*f)(void *ctx), void *ctx, u8_t block); #define tcpip_callback(f, ctx) tcpip_callback_with_block(f, ctx, 1) /* free pbufs or heap memory from another context without blocking */ err_t pbuf_free_callback(struct pbuf *p); err_t mem_free_callback(void *m); err_t tcpip_timeout(u32_t msecs, sys_timeout_handler h, void *arg); err_t tcpip_untimeout(sys_timeout_handler h, void *arg); enum tcpip_msg_type { #if LWIP_NETCONN TCPIP_MSG_API, #endif /* LWIP_NETCONN */ TCPIP_MSG_INPKT, #if LWIP_NETIF_API TCPIP_MSG_NETIFAPI, #endif /* LWIP_NETIF_API */ TCPIP_MSG_CALLBACK, TCPIP_MSG_TIMEOUT, TCPIP_MSG_UNTIMEOUT }; struct tcpip_msg { enum tcpip_msg_type type; sys_sem_t *sem; union { #if LWIP_NETCONN struct api_msg *apimsg; #endif /* LWIP_NETCONN */ #if LWIP_NETIF_API struct netifapi_msg *netifapimsg; #endif /* LWIP_NETIF_API */ struct { struct pbuf *p; struct netif *netif; } inp; struct { void (*f)(void *ctx); void *ctx; } cb; struct { u32_t msecs; sys_timeout_handler h; void *arg; } tmo; } msg; }; #ifdef __cplusplus } #endif #endif /* !NO_SYS */ #endif /* __LWIP_TCPIP_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/udp.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIP_UDP_H__ #define __LWIP_UDP_H__ #include "lwip/opt.h" #if LWIP_UDP /* don't build if not configured for use in lwipopts.h */ #include "lwip/pbuf.h" #include "lwip/netif.h" #include "lwip/ip_addr.h" #include "lwip/ip.h" #ifdef __cplusplus extern "C" { #endif #define UDP_HLEN 8 /* Fields are (of course) in network byte order. */ #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" #endif PACK_STRUCT_BEGIN struct udp_hdr { PACK_STRUCT_FIELD(u16_t src); PACK_STRUCT_FIELD(u16_t dest); /* src/dest UDP ports */ PACK_STRUCT_FIELD(u16_t len); PACK_STRUCT_FIELD(u16_t chksum); } PACK_STRUCT_STRUCT; PACK_STRUCT_END #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/epstruct.h" #endif #define UDP_FLAGS_NOCHKSUM 0x01U #define UDP_FLAGS_UDPLITE 0x02U #define UDP_FLAGS_CONNECTED 0x04U struct udp_pcb { /* Common members of all PCB types */ IP_PCB; /* Protocol specific PCB members */ struct udp_pcb *next; u8_t flags; /* ports are in host byte order */ u16_t local_port, remote_port; #if LWIP_IGMP /* outgoing network interface for multicast packets */ struct ip_addr multicast_ip; #endif /* LWIP_IGMP */ #if LWIP_UDPLITE /* used for UDP_LITE only */ u16_t chksum_len_rx, chksum_len_tx; #endif /* LWIP_UDPLITE */ /* receive callback function * addr and port are in same byte order as in the pcb * The callback is responsible for freeing the pbuf * if it's not used any more. * * ATTENTION: Be aware that 'addr' points into the pbuf 'p' so freeing this pbuf * makes 'addr' invalid, too. * * @param arg user supplied argument (udp_pcb.recv_arg) * @param pcb the udp_pcb which received data * @param p the packet buffer that was received * @param addr the remote IP address from which the packet was received * @param port the remote port from which the packet was received */ void (* recv)(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port); /* user-supplied argument for the recv callback */ void *recv_arg; }; /* udp_pcbs export for exernal reference (e.g. SNMP agent) */ extern struct udp_pcb *udp_pcbs; /* The following functions is the application layer interface to the UDP code. */ struct udp_pcb * udp_new (void); void udp_remove (struct udp_pcb *pcb); err_t udp_bind (struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port); err_t udp_connect (struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port); void udp_disconnect (struct udp_pcb *pcb); void udp_recv (struct udp_pcb *pcb, void (* recv)(void *arg, struct udp_pcb *upcb, struct pbuf *p, struct ip_addr *addr, u16_t port), void *recv_arg); err_t udp_sendto_if (struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *dst_ip, u16_t dst_port, struct netif *netif); err_t udp_sendto (struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *dst_ip, u16_t dst_port); err_t udp_send (struct udp_pcb *pcb, struct pbuf *p); #define udp_flags(pcb) ((pcb)->flags) #define udp_setflags(pcb, f) ((pcb)->flags = (f)) /* The following functions are the lower layer interface to UDP. */ void udp_input (struct pbuf *p, struct netif *inp); #define udp_init() /* Compatibility define, not init needed. */ #if UDP_DEBUG void udp_debug_print(struct udp_hdr *udphdr); #else #define udp_debug_print(udphdr) #endif #ifdef __cplusplus } #endif #endif /* LWIP_UDP */ #endif /* __LWIP_UDP_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/netif/etharp.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2003 Swedish Institute of Computer Science. * Copyright (c) 2003-2004 Leon Woestenberg * Copyright (c) 2003-2004 Axon Digital Design B.V., The Netherlands. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __NETIF_ETHARP_H__ #define __NETIF_ETHARP_H__ #include "lwip/opt.h" #if LWIP_ARP /* don't build if not configured for use in lwipopts.h */ #include "lwip/pbuf.h" #include "lwip/ip_addr.h" #include "lwip/netif.h" #include "lwip/ip.h" #ifdef __cplusplus extern "C" { #endif #ifndef ETH_PAD_SIZE #define ETH_PAD_SIZE 0 #endif #ifndef ETHARP_HWADDR_LEN #define ETHARP_HWADDR_LEN 6 #endif #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" #endif PACK_STRUCT_BEGIN struct eth_addr { PACK_STRUCT_FIELD(u8_t addr[ETHARP_HWADDR_LEN]); } PACK_STRUCT_STRUCT; PACK_STRUCT_END #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/epstruct.h" #endif #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" #endif PACK_STRUCT_BEGIN struct eth_hdr { #if ETH_PAD_SIZE PACK_STRUCT_FIELD(u8_t padding[ETH_PAD_SIZE]); #endif PACK_STRUCT_FIELD(struct eth_addr dest); PACK_STRUCT_FIELD(struct eth_addr src); PACK_STRUCT_FIELD(u16_t type); } PACK_STRUCT_STRUCT; PACK_STRUCT_END #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/epstruct.h" #endif #define SIZEOF_ETH_HDR (14 + ETH_PAD_SIZE) #if ETHARP_SUPPORT_VLAN #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" #endif PACK_STRUCT_BEGIN struct eth_vlan_hdr { PACK_STRUCT_FIELD(u16_t tpid); PACK_STRUCT_FIELD(u16_t prio_vid); } PACK_STRUCT_STRUCT; PACK_STRUCT_END #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/epstruct.h" #endif #define SIZEOF_VLAN_HDR 4 #define VLAN_ID(vlan_hdr) (htons((vlan_hdr)->prio_vid) & 0xFFF) #endif /* ETHARP_SUPPORT_VLAN */ #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" #endif PACK_STRUCT_BEGIN /** the ARP message */ struct etharp_hdr { PACK_STRUCT_FIELD(u16_t hwtype); PACK_STRUCT_FIELD(u16_t proto); PACK_STRUCT_FIELD(u16_t _hwlen_protolen); PACK_STRUCT_FIELD(u16_t opcode); PACK_STRUCT_FIELD(struct eth_addr shwaddr); PACK_STRUCT_FIELD(struct ip_addr2 sipaddr); PACK_STRUCT_FIELD(struct eth_addr dhwaddr); PACK_STRUCT_FIELD(struct ip_addr2 dipaddr); } PACK_STRUCT_STRUCT; PACK_STRUCT_END #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/epstruct.h" #endif #define SIZEOF_ETHARP_HDR 28 #define SIZEOF_ETHARP_PACKET (SIZEOF_ETH_HDR + SIZEOF_ETHARP_HDR) /** 5 seconds period */ #define ARP_TMR_INTERVAL 5000 #define ETHTYPE_ARP 0x0806 #define ETHTYPE_IP 0x0800 #define ETHTYPE_VLAN 0x8100 #define ETHTYPE_PPPOEDISC 0x8863 /* PPP Over Ethernet Discovery Stage */ #define ETHTYPE_PPPOE 0x8864 /* PPP Over Ethernet Session Stage */ /** ARP message types (opcodes) */ #define ARP_REQUEST 1 #define ARP_REPLY 2 #if ARP_QUEUEING /** struct for queueing outgoing packets for unknown address * defined here to be accessed by memp.h */ struct etharp_q_entry { struct etharp_q_entry *next; struct pbuf *p; }; #endif /* ARP_QUEUEING */ #define etharp_init() /* Compatibility define, not init needed. */ void etharp_tmr(void); s8_t etharp_find_addr(struct netif *netif, struct ip_addr *ipaddr, struct eth_addr **eth_ret, struct ip_addr **ip_ret); void etharp_ip_input(struct netif *netif, struct pbuf *p); void etharp_arp_input(struct netif *netif, struct eth_addr *ethaddr, struct pbuf *p); err_t etharp_output(struct netif *netif, struct pbuf *q, struct ip_addr *ipaddr); err_t etharp_query(struct netif *netif, struct ip_addr *ipaddr, struct pbuf *q); err_t etharp_request(struct netif *netif, struct ip_addr *ipaddr); /** For Ethernet network interfaces, we might want to send "gratuitous ARP"; * this is an ARP packet sent by a node in order to spontaneously cause other * nodes to update an entry in their ARP cache. * From RFC 3220 "IP Mobility Support for IPv4" section 4.6. */ #define etharp_gratuitous(netif) etharp_request((netif), &(netif)->ip_addr) err_t ethernet_input(struct pbuf *p, struct netif *netif); #if LWIP_AUTOIP err_t etharp_raw(struct netif *netif, const struct eth_addr *ethsrc_addr, const struct eth_addr *ethdst_addr, const struct eth_addr *hwsrc_addr, const struct ip_addr *ipsrc_addr, const struct eth_addr *hwdst_addr, const struct ip_addr *ipdst_addr, const u16_t opcode); #endif /* LWIP_AUTOIP */ #define eth_addr_cmp(addr1, addr2) (memcmp((addr1)->addr, (addr2)->addr, ETHARP_HWADDR_LEN) == 0) extern const struct eth_addr ethbroadcast, ethzero; #ifdef __cplusplus } #endif #endif /* LWIP_ARP */ #endif /* __NETIF_ARP_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/netif/loopif.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __NETIF_LOOPIF_H__ #define __NETIF_LOOPIF_H__ #include "lwip/opt.h" #include "lwip/netif.h" #include "lwip/err.h" #ifdef __cplusplus extern "C" { #endif #if !LWIP_NETIF_LOOPBACK_MULTITHREADING #define loopif_poll netif_poll #endif /* !LWIP_NETIF_LOOPBACK_MULTITHREADING */ err_t loopif_init(struct netif *netif); #ifdef __cplusplus } #endif #endif /* __NETIF_LOOPIF_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/netif/ppp_oe.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /***************************************************************************** * ppp_oe.h - PPP Over Ethernet implementation for lwIP. * * Copyright (c) 2006 by Marc Boucher, Services Informatiques (MBSI) inc. * * The authors hereby grant permission to use, copy, modify, distribute, * and license this software and its documentation for any purpose, provided * that existing copyright notices are retained in all copies and that this * notice and the following disclaimer are included verbatim in any * distributions. No written agreement, license, or royalty fee is required * for any of the authorized uses. * * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** * REVISION HISTORY * * 06-01-01 Marc Boucher * Ported to lwIP. *****************************************************************************/ /* based on NetBSD: if_pppoe.c,v 1.64 2006/01/31 23:50:15 martin Exp */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation * by Martin Husemann . * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the NetBSD * Foundation, Inc. and its contributors. * 4. Neither the name of The NetBSD Foundation nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef PPP_OE_H #define PPP_OE_H #include "lwip/opt.h" #if PPPOE_SUPPORT > 0 #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" #endif PACK_STRUCT_BEGIN struct pppoehdr { PACK_STRUCT_FIELD(u8_t vertype); PACK_STRUCT_FIELD(u8_t code); PACK_STRUCT_FIELD(u16_t session); PACK_STRUCT_FIELD(u16_t plen); } PACK_STRUCT_STRUCT; PACK_STRUCT_END #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/epstruct.h" #endif #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" #endif PACK_STRUCT_BEGIN struct pppoetag { PACK_STRUCT_FIELD(u16_t tag); PACK_STRUCT_FIELD(u16_t len); } PACK_STRUCT_STRUCT; PACK_STRUCT_END #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/epstruct.h" #endif #define PPPOE_STATE_INITIAL 0 #define PPPOE_STATE_PADI_SENT 1 #define PPPOE_STATE_PADR_SENT 2 #define PPPOE_STATE_SESSION 3 #define PPPOE_STATE_CLOSING 4 /* passive */ #define PPPOE_STATE_PADO_SENT 1 #define PPPOE_HEADERLEN sizeof(struct pppoehdr) #define PPPOE_VERTYPE 0x11 /* VER=1, TYPE = 1 */ #define PPPOE_TAG_EOL 0x0000 /* end of list */ #define PPPOE_TAG_SNAME 0x0101 /* service name */ #define PPPOE_TAG_ACNAME 0x0102 /* access concentrator name */ #define PPPOE_TAG_HUNIQUE 0x0103 /* host unique */ #define PPPOE_TAG_ACCOOKIE 0x0104 /* AC cookie */ #define PPPOE_TAG_VENDOR 0x0105 /* vendor specific */ #define PPPOE_TAG_RELAYSID 0x0110 /* relay session id */ #define PPPOE_TAG_SNAME_ERR 0x0201 /* service name error */ #define PPPOE_TAG_ACSYS_ERR 0x0202 /* AC system error */ #define PPPOE_TAG_GENERIC_ERR 0x0203 /* gerneric error */ #define PPPOE_CODE_PADI 0x09 /* Active Discovery Initiation */ #define PPPOE_CODE_PADO 0x07 /* Active Discovery Offer */ #define PPPOE_CODE_PADR 0x19 /* Active Discovery Request */ #define PPPOE_CODE_PADS 0x65 /* Active Discovery Session confirmation */ #define PPPOE_CODE_PADT 0xA7 /* Active Discovery Terminate */ #ifndef ETHERMTU #define ETHERMTU 1500 #endif /* two byte PPP protocol discriminator, then IP data */ #define PPPOE_MAXMTU (ETHERMTU-PPPOE_HEADERLEN-2) struct pppoe_softc; void pppoe_init(void); err_t pppoe_create(struct netif *ethif, int pd, void (*linkStatusCB)(int pd, int up), struct pppoe_softc **scptr); err_t pppoe_destroy(struct netif *ifp); int pppoe_connect(struct pppoe_softc *sc); void pppoe_disconnect(struct pppoe_softc *sc); void pppoe_disc_input(struct netif *netif, struct pbuf *p); void pppoe_data_input(struct netif *netif, struct pbuf *p); err_t pppoe_xmit(struct pppoe_softc *sc, struct pbuf *pb); extern int pppoe_hdrlen; #endif /* PPPOE_SUPPORT */ #endif /* PPP_OE_H */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/netif/slipif.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001, Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the Institute nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __NETIF_SLIPIF_H__ #define __NETIF_SLIPIF_H__ #include "lwip/netif.h" #ifdef __cplusplus extern "C" { #endif err_t slipif_init(struct netif * netif); void slipif_poll(struct netif *netif); #ifdef __cplusplus } #endif #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/netif/etharp.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * Address Resolution Protocol module for IP over Ethernet * * Functionally, ARP is divided into two parts. The first maps an IP address * to a physical address when sending a packet, and the second part answers * requests from other machines for our physical address. * * This implementation complies with RFC 826 (Ethernet ARP). It supports * Gratuitious ARP from RFC3220 (IP Mobility Support for IPv4) section 4.6 * if an interface calls etharp_gratuitous(our_netif) upon address change. */ /* * Copyright (c) 2001-2003 Swedish Institute of Computer Science. * Copyright (c) 2003-2004 Leon Woestenberg * Copyright (c) 2003-2004 Axon Digital Design B.V., The Netherlands. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * */ #include "lwip/opt.h" #if LWIP_ARP /* don't build if not configured for use in lwipopts.h */ #include "lwip/inet.h" #include "lwip/ip.h" #include "lwip/stats.h" #include "lwip/snmp.h" #include "lwip/dhcp.h" #include "lwip/autoip.h" #include "netif/etharp.h" #if PPPOE_SUPPORT #include "netif/ppp_oe.h" #endif /* PPPOE_SUPPORT */ #include /** the time an ARP entry stays valid after its last update, * for ARP_TMR_INTERVAL = 5000, this is * (240 * 5) seconds = 20 minutes. */ #define ARP_MAXAGE 240 /** the time an ARP entry stays pending after first request, * for ARP_TMR_INTERVAL = 5000, this is * (2 * 5) seconds = 10 seconds. * * @internal Keep this number at least 2, otherwise it might * run out instantly if the timeout occurs directly after a request. */ #define ARP_MAXPENDING 2 #define HWTYPE_ETHERNET 1 #define ARPH_HWLEN(hdr) (ntohs((hdr)->_hwlen_protolen) >> 8) #define ARPH_PROTOLEN(hdr) (ntohs((hdr)->_hwlen_protolen) & 0xff) #define ARPH_HWLEN_SET(hdr, len) (hdr)->_hwlen_protolen = htons(ARPH_PROTOLEN(hdr) | ((len) << 8)) #define ARPH_PROTOLEN_SET(hdr, len) (hdr)->_hwlen_protolen = htons((len) | (ARPH_HWLEN(hdr) << 8)) enum etharp_state { ETHARP_STATE_EMPTY = 0, ETHARP_STATE_PENDING, ETHARP_STATE_STABLE }; struct etharp_entry { #if ARP_QUEUEING /** * Pointer to queue of pending outgoing packets on this ARP entry. */ struct etharp_q_entry *q; #endif struct ip_addr ipaddr; struct eth_addr ethaddr; enum etharp_state state; u8_t ctime; struct netif *netif; }; const struct eth_addr ethbroadcast = {{0xff,0xff,0xff,0xff,0xff,0xff}}; const struct eth_addr ethzero = {{0,0,0,0,0,0}}; static struct etharp_entry arp_table[ARP_TABLE_SIZE]; #if !LWIP_NETIF_HWADDRHINT static u8_t etharp_cached_entry; #endif /** * Try hard to create a new entry - we want the IP address to appear in * the cache (even if this means removing an active entry or so). */ #define ETHARP_TRY_HARD 1 #define ETHARP_FIND_ONLY 2 #if LWIP_NETIF_HWADDRHINT #define NETIF_SET_HINT(netif, hint) if (((netif) != NULL) && ((netif)->addr_hint != NULL)) \ *((netif)->addr_hint) = (hint); static s8_t find_entry(struct ip_addr *ipaddr, u8_t flags, struct netif *netif); #else /* LWIP_NETIF_HWADDRHINT */ static s8_t find_entry(struct ip_addr *ipaddr, u8_t flags); #endif /* LWIP_NETIF_HWADDRHINT */ static err_t update_arp_entry(struct netif *netif, struct ip_addr *ipaddr, struct eth_addr *ethaddr, u8_t flags); /* Some checks, instead of etharp_init(): */ #if (LWIP_ARP && (ARP_TABLE_SIZE > 0x7f)) #error "If you want to use ARP, ARP_TABLE_SIZE must fit in an s8_t, so, you have to reduce it in your lwipopts.h" #endif #if ARP_QUEUEING /** * Free a complete queue of etharp entries * * @param q a qeueue of etharp_q_entry's to free */ static void free_etharp_q(struct etharp_q_entry *q) { struct etharp_q_entry *r; LWIP_ASSERT("q != NULL", q != NULL); LWIP_ASSERT("q->p != NULL", q->p != NULL); while (q) { r = q; q = q->next; LWIP_ASSERT("r->p != NULL", (r->p != NULL)); pbuf_free(r->p); memp_free(MEMP_ARP_QUEUE, r); } } #endif /** * Clears expired entries in the ARP table. * * This function should be called every ETHARP_TMR_INTERVAL microseconds (5 seconds), * in order to expire entries in the ARP table. */ void etharp_tmr(void) { u8_t i; LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer\n")); /* remove expired entries from the ARP table */ for (i = 0; i < ARP_TABLE_SIZE; ++i) { arp_table[i].ctime++; if (((arp_table[i].state == ETHARP_STATE_STABLE) && (arp_table[i].ctime >= ARP_MAXAGE)) || ((arp_table[i].state == ETHARP_STATE_PENDING) && (arp_table[i].ctime >= ARP_MAXPENDING))) { /* pending or stable entry has become old! */ LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer: expired %s entry %"U16_F".\n", arp_table[i].state == ETHARP_STATE_STABLE ? "stable" : "pending", (u16_t)i)); /* clean up entries that have just been expired */ /* remove from SNMP ARP index tree */ snmp_delete_arpidx_tree(arp_table[i].netif, &arp_table[i].ipaddr); #if ARP_QUEUEING /* and empty packet queue */ if (arp_table[i].q != NULL) { /* remove all queued packets */ LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer: freeing entry %"U16_F", packet queue %p.\n", (u16_t)i, (void *)(arp_table[i].q))); free_etharp_q(arp_table[i].q); arp_table[i].q = NULL; } #endif /* recycle entry for re-use */ arp_table[i].state = ETHARP_STATE_EMPTY; } #if ARP_QUEUEING /* still pending entry? (not expired) */ if (arp_table[i].state == ETHARP_STATE_PENDING) { /* resend an ARP query here? */ } #endif } } /** * Search the ARP table for a matching or new entry. * * If an IP address is given, return a pending or stable ARP entry that matches * the address. If no match is found, create a new entry with this address set, * but in state ETHARP_EMPTY. The caller must check and possibly change the * state of the returned entry. * * If ipaddr is NULL, return a initialized new entry in state ETHARP_EMPTY. * * In all cases, attempt to create new entries from an empty entry. If no * empty entries are available and ETHARP_TRY_HARD flag is set, recycle * old entries. Heuristic choose the least important entry for recycling. * * @param ipaddr IP address to find in ARP cache, or to add if not found. * @param flags * - ETHARP_TRY_HARD: Try hard to create a entry by allowing recycling of * active (stable or pending) entries. * * @return The ARP entry index that matched or is created, ERR_MEM if no * entry is found or could be recycled. */ static s8_t #if LWIP_NETIF_HWADDRHINT find_entry(struct ip_addr *ipaddr, u8_t flags, struct netif *netif) #else /* LWIP_NETIF_HWADDRHINT */ find_entry(struct ip_addr *ipaddr, u8_t flags) #endif /* LWIP_NETIF_HWADDRHINT */ { s8_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE; s8_t empty = ARP_TABLE_SIZE; u8_t i = 0, age_pending = 0, age_stable = 0; #if ARP_QUEUEING /* oldest entry with packets on queue */ s8_t old_queue = ARP_TABLE_SIZE; /* its age */ u8_t age_queue = 0; #endif /* First, test if the last call to this function asked for the * same address. If so, we're really fast! */ if (ipaddr) { /* ipaddr to search for was given */ #if LWIP_NETIF_HWADDRHINT if ((netif != NULL) && (netif->addr_hint != NULL)) { /* per-pcb cached entry was given */ u8_t per_pcb_cache = *(netif->addr_hint); if ((per_pcb_cache < ARP_TABLE_SIZE) && arp_table[per_pcb_cache].state == ETHARP_STATE_STABLE) { /* the per-pcb-cached entry is stable */ if (ip_addr_cmp(ipaddr, &arp_table[per_pcb_cache].ipaddr)) { /* per-pcb cached entry was the right one! */ ETHARP_STATS_INC(etharp.cachehit); return per_pcb_cache; } } } #else /* #if LWIP_NETIF_HWADDRHINT */ if (arp_table[etharp_cached_entry].state == ETHARP_STATE_STABLE) { /* the cached entry is stable */ if (ip_addr_cmp(ipaddr, &arp_table[etharp_cached_entry].ipaddr)) { /* cached entry was the right one! */ ETHARP_STATS_INC(etharp.cachehit); return etharp_cached_entry; } } #endif /* #if LWIP_NETIF_HWADDRHINT */ } /** * a) do a search through the cache, remember candidates * b) select candidate entry * c) create new entry */ /* a) in a single search sweep, do all of this * 1) remember the first empty entry (if any) * 2) remember the oldest stable entry (if any) * 3) remember the oldest pending entry without queued packets (if any) * 4) remember the oldest pending entry with queued packets (if any) * 5) search for a matching IP entry, either pending or stable * until 5 matches, or all entries are searched for. */ for (i = 0; i < ARP_TABLE_SIZE; ++i) { /* no empty entry found yet and now we do find one? */ if ((empty == ARP_TABLE_SIZE) && (arp_table[i].state == ETHARP_STATE_EMPTY)) { LWIP_DEBUGF(ETHARP_DEBUG, ("find_entry: found empty entry %"U16_F"\n", (u16_t)i)); /* remember first empty entry */ empty = i; } /* pending entry? */ else if (arp_table[i].state == ETHARP_STATE_PENDING) { /* if given, does IP address match IP address in ARP entry? */ if (ipaddr && ip_addr_cmp(ipaddr, &arp_table[i].ipaddr)) { LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("find_entry: found matching pending entry %"U16_F"\n", (u16_t)i)); /* found exact IP address match, simply bail out */ #if LWIP_NETIF_HWADDRHINT NETIF_SET_HINT(netif, i); #else /* #if LWIP_NETIF_HWADDRHINT */ etharp_cached_entry = i; #endif /* #if LWIP_NETIF_HWADDRHINT */ return i; #if ARP_QUEUEING /* pending with queued packets? */ } else if (arp_table[i].q != NULL) { if (arp_table[i].ctime >= age_queue) { old_queue = i; age_queue = arp_table[i].ctime; } #endif /* pending without queued packets? */ } else { if (arp_table[i].ctime >= age_pending) { old_pending = i; age_pending = arp_table[i].ctime; } } } /* stable entry? */ else if (arp_table[i].state == ETHARP_STATE_STABLE) { /* if given, does IP address match IP address in ARP entry? */ if (ipaddr && ip_addr_cmp(ipaddr, &arp_table[i].ipaddr)) { LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("find_entry: found matching stable entry %"U16_F"\n", (u16_t)i)); /* found exact IP address match, simply bail out */ #if LWIP_NETIF_HWADDRHINT NETIF_SET_HINT(netif, i); #else /* #if LWIP_NETIF_HWADDRHINT */ etharp_cached_entry = i; #endif /* #if LWIP_NETIF_HWADDRHINT */ return i; /* remember entry with oldest stable entry in oldest, its age in maxtime */ } else if (arp_table[i].ctime >= age_stable) { old_stable = i; age_stable = arp_table[i].ctime; } } } /* { we have no match } => try to create a new entry */ /* no empty entry found and not allowed to recycle? */ if (((empty == ARP_TABLE_SIZE) && ((flags & ETHARP_TRY_HARD) == 0)) /* or don't create new entry, only search? */ || ((flags & ETHARP_FIND_ONLY) != 0)) { LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("find_entry: no empty entry found and not allowed to recycle\n")); return (s8_t)ERR_MEM; } /* b) choose the least destructive entry to recycle: * 1) empty entry * 2) oldest stable entry * 3) oldest pending entry without queued packets * 4) oldest pending entry with queued packets * * { ETHARP_TRY_HARD is set at this point } */ /* 1) empty entry available? */ if (empty < ARP_TABLE_SIZE) { i = empty; LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("find_entry: selecting empty entry %"U16_F"\n", (u16_t)i)); } /* 2) found recyclable stable entry? */ else if (old_stable < ARP_TABLE_SIZE) { /* recycle oldest stable*/ i = old_stable; LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("find_entry: selecting oldest stable entry %"U16_F"\n", (u16_t)i)); #if ARP_QUEUEING /* no queued packets should exist on stable entries */ LWIP_ASSERT("arp_table[i].q == NULL", arp_table[i].q == NULL); #endif /* 3) found recyclable pending entry without queued packets? */ } else if (old_pending < ARP_TABLE_SIZE) { /* recycle oldest pending */ i = old_pending; LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("find_entry: selecting oldest pending entry %"U16_F" (without queue)\n", (u16_t)i)); #if ARP_QUEUEING /* 4) found recyclable pending entry with queued packets? */ } else if (old_queue < ARP_TABLE_SIZE) { /* recycle oldest pending */ i = old_queue; LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("find_entry: selecting oldest pending entry %"U16_F", freeing packet queue %p\n", (u16_t)i, (void *)(arp_table[i].q))); free_etharp_q(arp_table[i].q); arp_table[i].q = NULL; #endif /* no empty or recyclable entries found */ } else { return (s8_t)ERR_MEM; } /* { empty or recyclable entry found } */ LWIP_ASSERT("i < ARP_TABLE_SIZE", i < ARP_TABLE_SIZE); if (arp_table[i].state != ETHARP_STATE_EMPTY) { snmp_delete_arpidx_tree(arp_table[i].netif, &arp_table[i].ipaddr); } /* recycle entry (no-op for an already empty entry) */ arp_table[i].state = ETHARP_STATE_EMPTY; /* IP address given? */ if (ipaddr != NULL) { /* set IP address */ ip_addr_set(&arp_table[i].ipaddr, ipaddr); } arp_table[i].ctime = 0; #if LWIP_NETIF_HWADDRHINT NETIF_SET_HINT(netif, i); #else /* #if LWIP_NETIF_HWADDRHINT */ etharp_cached_entry = i; #endif /* #if LWIP_NETIF_HWADDRHINT */ return (err_t)i; } /** * Send an IP packet on the network using netif->linkoutput * The ethernet header is filled in before sending. * * @params netif the lwIP network interface on which to send the packet * @params p the packet to send, p->payload pointing to the (uninitialized) ethernet header * @params src the source MAC address to be copied into the ethernet header * @params dst the destination MAC address to be copied into the ethernet header * @return ERR_OK if the packet was sent, any other err_t on failure */ static err_t etharp_send_ip(struct netif *netif, struct pbuf *p, struct eth_addr *src, struct eth_addr *dst) { struct eth_hdr *ethhdr = p->payload; u8_t k; LWIP_ASSERT("netif->hwaddr_len must be the same as ETHARP_HWADDR_LEN for etharp!", (netif->hwaddr_len == ETHARP_HWADDR_LEN)); k = ETHARP_HWADDR_LEN; while(k > 0) { k--; ethhdr->dest.addr[k] = dst->addr[k]; ethhdr->src.addr[k] = src->addr[k]; } ethhdr->type = htons(ETHTYPE_IP); LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_send_ip: sending packet %p\n", (void *)p)); /* send the packet */ return netif->linkoutput(netif, p); } /** * Update (or insert) a IP/MAC address pair in the ARP cache. * * If a pending entry is resolved, any queued packets will be sent * at this point. * * @param ipaddr IP address of the inserted ARP entry. * @param ethaddr Ethernet address of the inserted ARP entry. * @param flags Defines behaviour: * - ETHARP_TRY_HARD Allows ARP to insert this as a new item. If not specified, * only existing ARP entries will be updated. * * @return * - ERR_OK Succesfully updated ARP cache. * - ERR_MEM If we could not add a new ARP entry when ETHARP_TRY_HARD was set. * - ERR_ARG Non-unicast address given, those will not appear in ARP cache. * * @see pbuf_free() */ static err_t update_arp_entry(struct netif *netif, struct ip_addr *ipaddr, struct eth_addr *ethaddr, u8_t flags) { s8_t i; u8_t k; LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("update_arp_entry()\n")); LWIP_ASSERT("netif->hwaddr_len == ETHARP_HWADDR_LEN", netif->hwaddr_len == ETHARP_HWADDR_LEN); LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("update_arp_entry: %"U16_F".%"U16_F".%"U16_F".%"U16_F" - %02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F"\n", ip4_addr1(ipaddr), ip4_addr2(ipaddr), ip4_addr3(ipaddr), ip4_addr4(ipaddr), ethaddr->addr[0], ethaddr->addr[1], ethaddr->addr[2], ethaddr->addr[3], ethaddr->addr[4], ethaddr->addr[5])); /* non-unicast address? */ if (ip_addr_isany(ipaddr) || ip_addr_isbroadcast(ipaddr, netif) || ip_addr_ismulticast(ipaddr)) { LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("update_arp_entry: will not add non-unicast IP address to ARP cache\n")); return ERR_ARG; } /* find or create ARP entry */ #if LWIP_NETIF_HWADDRHINT i = find_entry(ipaddr, flags, netif); #else /* LWIP_NETIF_HWADDRHINT */ i = find_entry(ipaddr, flags); #endif /* LWIP_NETIF_HWADDRHINT */ /* bail out if no entry could be found */ if (i < 0) return (err_t)i; /* mark it stable */ arp_table[i].state = ETHARP_STATE_STABLE; /* record network interface */ arp_table[i].netif = netif; /* insert in SNMP ARP index tree */ snmp_insert_arpidx_tree(netif, &arp_table[i].ipaddr); LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("update_arp_entry: updating stable entry %"S16_F"\n", (s16_t)i)); /* update address */ k = ETHARP_HWADDR_LEN; while (k > 0) { k--; arp_table[i].ethaddr.addr[k] = ethaddr->addr[k]; } /* reset time stamp */ arp_table[i].ctime = 0; #if ARP_QUEUEING /* this is where we will send out queued packets! */ while (arp_table[i].q != NULL) { struct pbuf *p; /* remember remainder of queue */ struct etharp_q_entry *q = arp_table[i].q; /* pop first item off the queue */ arp_table[i].q = q->next; /* get the packet pointer */ p = q->p; /* now queue entry can be freed */ memp_free(MEMP_ARP_QUEUE, q); /* send the queued IP packet */ etharp_send_ip(netif, p, (struct eth_addr*)(netif->hwaddr), ethaddr); /* free the queued IP packet */ pbuf_free(p); } #endif return ERR_OK; } /** * Finds (stable) ethernet/IP address pair from ARP table * using interface and IP address index. * @note the addresses in the ARP table are in network order! * * @param netif points to interface index * @param ipaddr points to the (network order) IP address index * @param eth_ret points to return pointer * @param ip_ret points to return pointer * @return table index if found, -1 otherwise */ s8_t etharp_find_addr(struct netif *netif, struct ip_addr *ipaddr, struct eth_addr **eth_ret, struct ip_addr **ip_ret) { s8_t i; LWIP_UNUSED_ARG(netif); #if LWIP_NETIF_HWADDRHINT i = find_entry(ipaddr, ETHARP_FIND_ONLY, NULL); #else /* LWIP_NETIF_HWADDRHINT */ i = find_entry(ipaddr, ETHARP_FIND_ONLY); #endif /* LWIP_NETIF_HWADDRHINT */ if((i >= 0) && arp_table[i].state == ETHARP_STATE_STABLE) { *eth_ret = &arp_table[i].ethaddr; *ip_ret = &arp_table[i].ipaddr; return i; } return -1; } /** * Updates the ARP table using the given IP packet. * * Uses the incoming IP packet's source address to update the * ARP cache for the local network. The function does not alter * or free the packet. This function must be called before the * packet p is passed to the IP layer. * * @param netif The lwIP network interface on which the IP packet pbuf arrived. * @param p The IP packet that arrived on netif. * * @return NULL * * @see pbuf_free() */ void etharp_ip_input(struct netif *netif, struct pbuf *p) { struct eth_hdr *ethhdr; struct ip_hdr *iphdr; LWIP_ERROR("netif != NULL", (netif != NULL), return;); /* Only insert an entry if the source IP address of the incoming IP packet comes from a host on the local network. */ ethhdr = p->payload; iphdr = (struct ip_hdr *)((u8_t*)ethhdr + SIZEOF_ETH_HDR); #if ETHARP_SUPPORT_VLAN if (ethhdr->type == ETHTYPE_VLAN) { iphdr = (struct ip_hdr *)((u8_t*)ethhdr + SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR); } #endif /* ETHARP_SUPPORT_VLAN */ /* source is not on the local network? */ if (!ip_addr_netcmp(&(iphdr->src), &(netif->ip_addr), &(netif->netmask))) { /* do nothing */ return; } LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_ip_input: updating ETHARP table.\n")); /* update ARP table */ /* @todo We could use ETHARP_TRY_HARD if we think we are going to talk * back soon (for example, if the destination IP address is ours. */ update_arp_entry(netif, &(iphdr->src), &(ethhdr->src), 0); } /** * Responds to ARP requests to us. Upon ARP replies to us, add entry to cache * send out queued IP packets. Updates cache with snooped address pairs. * * Should be called for incoming ARP packets. The pbuf in the argument * is freed by this function. * * @param netif The lwIP network interface on which the ARP packet pbuf arrived. * @param ethaddr Ethernet address of netif. * @param p The ARP packet that arrived on netif. Is freed by this function. * * @return NULL * * @see pbuf_free() */ void etharp_arp_input(struct netif *netif, struct eth_addr *ethaddr, struct pbuf *p) { struct etharp_hdr *hdr; struct eth_hdr *ethhdr; /* these are aligned properly, whereas the ARP header fields might not be */ struct ip_addr sipaddr, dipaddr; u8_t i; u8_t for_us; #if LWIP_AUTOIP const u8_t * ethdst_hwaddr; #endif /* LWIP_AUTOIP */ LWIP_ERROR("netif != NULL", (netif != NULL), return;); /* drop short ARP packets: we have to check for p->len instead of p->tot_len here since a struct etharp_hdr is pointed to p->payload, so it musn't be chained! */ if (p->len < SIZEOF_ETHARP_PACKET) { LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("etharp_arp_input: packet dropped, too short (%"S16_F"/%"S16_F")\n", p->tot_len, (s16_t)SIZEOF_ETHARP_PACKET)); ETHARP_STATS_INC(etharp.lenerr); ETHARP_STATS_INC(etharp.drop); pbuf_free(p); return; } ethhdr = p->payload; hdr = (struct etharp_hdr *)((u8_t*)ethhdr + SIZEOF_ETH_HDR); #if ETHARP_SUPPORT_VLAN if (ethhdr->type == ETHTYPE_VLAN) { hdr = (struct etharp_hdr *)(((u8_t*)ethhdr) + SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR); } #endif /* ETHARP_SUPPORT_VLAN */ /* RFC 826 "Packet Reception": */ if ((hdr->hwtype != htons(HWTYPE_ETHERNET)) || (hdr->_hwlen_protolen != htons((ETHARP_HWADDR_LEN << 8) | sizeof(struct ip_addr))) || (hdr->proto != htons(ETHTYPE_IP)) || (ethhdr->type != htons(ETHTYPE_ARP))) { LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("etharp_arp_input: packet dropped, wrong hw type, hwlen, proto, protolen or ethernet type (%"U16_F"/%"U16_F"/%"U16_F"/%"U16_F"/%"U16_F")\n", hdr->hwtype, ARPH_HWLEN(hdr), hdr->proto, ARPH_PROTOLEN(hdr), ethhdr->type)); ETHARP_STATS_INC(etharp.proterr); ETHARP_STATS_INC(etharp.drop); pbuf_free(p); return; } ETHARP_STATS_INC(etharp.recv); #if LWIP_AUTOIP /* We have to check if a host already has configured our random * created link local address and continously check if there is * a host with this IP-address so we can detect collisions */ autoip_arp_reply(netif, hdr); #endif /* LWIP_AUTOIP */ /* Copy struct ip_addr2 to aligned ip_addr, to support compilers without * structure packing (not using structure copy which breaks strict-aliasing rules). */ SMEMCPY(&sipaddr, &hdr->sipaddr, sizeof(sipaddr)); SMEMCPY(&dipaddr, &hdr->dipaddr, sizeof(dipaddr)); /* this interface is not configured? */ if (netif->ip_addr.addr == 0) { for_us = 0; } else { /* ARP packet directed to us? */ for_us = ip_addr_cmp(&dipaddr, &(netif->ip_addr)); } /* ARP message directed to us? */ if (for_us) { /* add IP address in ARP cache; assume requester wants to talk to us. * can result in directly sending the queued packets for this host. */ update_arp_entry(netif, &sipaddr, &(hdr->shwaddr), ETHARP_TRY_HARD); /* ARP message not directed to us? */ } else { /* update the source IP address in the cache, if present */ update_arp_entry(netif, &sipaddr, &(hdr->shwaddr), 0); } /* now act on the message itself */ switch (htons(hdr->opcode)) { /* ARP request? */ case ARP_REQUEST: /* ARP request. If it asked for our address, we send out a * reply. In any case, we time-stamp any existing ARP entry, * and possiby send out an IP packet that was queued on it. */ LWIP_DEBUGF (ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: incoming ARP request\n")); /* ARP request for our address? */ if (for_us) { LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: replying to ARP request for our IP address\n")); /* Re-use pbuf to send ARP reply. Since we are re-using an existing pbuf, we can't call etharp_raw since that would allocate a new pbuf. */ hdr->opcode = htons(ARP_REPLY); hdr->dipaddr = hdr->sipaddr; SMEMCPY(&hdr->sipaddr, &netif->ip_addr, sizeof(hdr->sipaddr)); LWIP_ASSERT("netif->hwaddr_len must be the same as ETHARP_HWADDR_LEN for etharp!", (netif->hwaddr_len == ETHARP_HWADDR_LEN)); i = ETHARP_HWADDR_LEN; #if LWIP_AUTOIP /* If we are using Link-Local, ARP packets must be broadcast on the * link layer. (See RFC3927 Section 2.5) */ ethdst_hwaddr = ((netif->autoip != NULL) && (netif->autoip->state != AUTOIP_STATE_OFF)) ? (u8_t*)(ethbroadcast.addr) : hdr->shwaddr.addr; #endif /* LWIP_AUTOIP */ while(i > 0) { i--; hdr->dhwaddr.addr[i] = hdr->shwaddr.addr[i]; #if LWIP_AUTOIP ethhdr->dest.addr[i] = ethdst_hwaddr[i]; #else /* LWIP_AUTOIP */ ethhdr->dest.addr[i] = hdr->shwaddr.addr[i]; #endif /* LWIP_AUTOIP */ hdr->shwaddr.addr[i] = ethaddr->addr[i]; ethhdr->src.addr[i] = ethaddr->addr[i]; } /* hwtype, hwaddr_len, proto, protolen and the type in the ethernet header are already correct, we tested that before */ /* return ARP reply */ netif->linkoutput(netif, p); /* we are not configured? */ } else if (netif->ip_addr.addr == 0) { /* { for_us == 0 and netif->ip_addr.addr == 0 } */ LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: we are unconfigured, ARP request ignored.\n")); /* request was not directed to us */ } else { /* { for_us == 0 and netif->ip_addr.addr != 0 } */ LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: ARP request was not for us.\n")); } break; case ARP_REPLY: /* ARP reply. We already updated the ARP cache earlier. */ LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: incoming ARP reply\n")); #if (LWIP_DHCP && DHCP_DOES_ARP_CHECK) /* DHCP wants to know about ARP replies from any host with an * IP address also offered to us by the DHCP server. We do not * want to take a duplicate IP address on a single network. * @todo How should we handle redundant (fail-over) interfaces? */ dhcp_arp_reply(netif, &sipaddr); #endif break; default: LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: ARP unknown opcode type %"S16_F"\n", htons(hdr->opcode))); ETHARP_STATS_INC(etharp.err); break; } /* free ARP packet */ pbuf_free(p); } /** * Resolve and fill-in Ethernet address header for outgoing IP packet. * * For IP multicast and broadcast, corresponding Ethernet addresses * are selected and the packet is transmitted on the link. * * For unicast addresses, the packet is submitted to etharp_query(). In * case the IP address is outside the local network, the IP address of * the gateway is used. * * @param netif The lwIP network interface which the IP packet will be sent on. * @param q The pbuf(s) containing the IP packet to be sent. * @param ipaddr The IP address of the packet destination. * * @return * - ERR_RTE No route to destination (no gateway to external networks), * or the return type of either etharp_query() or etharp_send_ip(). */ err_t etharp_output(struct netif *netif, struct pbuf *q, struct ip_addr *ipaddr) { struct eth_addr *dest, mcastaddr; /* make room for Ethernet header - should not fail */ if (pbuf_header(q, sizeof(struct eth_hdr)) != 0) { /* bail out */ LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("etharp_output: could not allocate room for header.\n")); LINK_STATS_INC(link.lenerr); return ERR_BUF; } /* assume unresolved Ethernet address */ dest = NULL; /* Determine on destination hardware address. Broadcasts and multicasts * are special, other IP addresses are looked up in the ARP table. */ /* broadcast destination IP address? */ if (ip_addr_isbroadcast(ipaddr, netif)) { /* broadcast on Ethernet also */ dest = (struct eth_addr *)ðbroadcast; /* multicast destination IP address? */ } else if (ip_addr_ismulticast(ipaddr)) { /* Hash IP multicast address to MAC address.*/ mcastaddr.addr[0] = 0x01; mcastaddr.addr[1] = 0x00; mcastaddr.addr[2] = 0x5e; mcastaddr.addr[3] = ip4_addr2(ipaddr) & 0x7f; mcastaddr.addr[4] = ip4_addr3(ipaddr); mcastaddr.addr[5] = ip4_addr4(ipaddr); /* destination Ethernet address is multicast */ dest = &mcastaddr; /* unicast destination IP address? */ } else { /* outside local network? */ if (!ip_addr_netcmp(ipaddr, &(netif->ip_addr), &(netif->netmask))) { /* interface has default gateway? */ if (netif->gw.addr != 0) { /* send to hardware address of default gateway IP address */ ipaddr = &(netif->gw); /* no default gateway available */ } else { /* no route to destination error (default gateway missing) */ return ERR_RTE; } } /* queue on destination Ethernet address belonging to ipaddr */ return etharp_query(netif, ipaddr, q); } /* continuation for multicast/broadcast destinations */ /* obtain source Ethernet address of the given interface */ /* send packet directly on the link */ return etharp_send_ip(netif, q, (struct eth_addr*)(netif->hwaddr), dest); } /** * Send an ARP request for the given IP address and/or queue a packet. * * If the IP address was not yet in the cache, a pending ARP cache entry * is added and an ARP request is sent for the given address. The packet * is queued on this entry. * * If the IP address was already pending in the cache, a new ARP request * is sent for the given address. The packet is queued on this entry. * * If the IP address was already stable in the cache, and a packet is * given, it is directly sent and no ARP request is sent out. * * If the IP address was already stable in the cache, and no packet is * given, an ARP request is sent out. * * @param netif The lwIP network interface on which ipaddr * must be queried for. * @param ipaddr The IP address to be resolved. * @param q If non-NULL, a pbuf that must be delivered to the IP address. * q is not freed by this function. * * @note q must only be ONE packet, not a packet queue! * * @return * - ERR_BUF Could not make room for Ethernet header. * - ERR_MEM Hardware address unknown, and no more ARP entries available * to query for address or queue the packet. * - ERR_MEM Could not queue packet due to memory shortage. * - ERR_RTE No route to destination (no gateway to external networks). * - ERR_ARG Non-unicast address given, those will not appear in ARP cache. * */ err_t etharp_query(struct netif *netif, struct ip_addr *ipaddr, struct pbuf *q) { struct eth_addr * srcaddr = (struct eth_addr *)netif->hwaddr; err_t result = ERR_MEM; s8_t i; /* ARP entry index */ /* non-unicast address? */ if (ip_addr_isbroadcast(ipaddr, netif) || ip_addr_ismulticast(ipaddr) || ip_addr_isany(ipaddr)) { LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: will not add non-unicast IP address to ARP cache\n")); return ERR_ARG; } /* find entry in ARP cache, ask to create entry if queueing packet */ #if LWIP_NETIF_HWADDRHINT i = find_entry(ipaddr, ETHARP_TRY_HARD, netif); #else /* LWIP_NETIF_HWADDRHINT */ i = find_entry(ipaddr, ETHARP_TRY_HARD); #endif /* LWIP_NETIF_HWADDRHINT */ /* could not find or create entry? */ if (i < 0) { LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: could not create ARP entry\n")); if (q) { LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: packet dropped\n")); ETHARP_STATS_INC(etharp.memerr); } return (err_t)i; } /* mark a fresh entry as pending (we just sent a request) */ if (arp_table[i].state == ETHARP_STATE_EMPTY) { arp_table[i].state = ETHARP_STATE_PENDING; } /* { i is either a STABLE or (new or existing) PENDING entry } */ LWIP_ASSERT("arp_table[i].state == PENDING or STABLE", ((arp_table[i].state == ETHARP_STATE_PENDING) || (arp_table[i].state == ETHARP_STATE_STABLE))); /* do we have a pending entry? or an implicit query request? */ if ((arp_table[i].state == ETHARP_STATE_PENDING) || (q == NULL)) { /* try to resolve it; send out ARP request */ result = etharp_request(netif, ipaddr); if (result != ERR_OK) { /* ARP request couldn't be sent */ /* We don't re-send arp request in etharp_tmr, but we still queue packets, since this failure could be temporary, and the next packet calling etharp_query again could lead to sending the queued packets. */ } } /* packet given? */ if (q != NULL) { /* stable entry? */ if (arp_table[i].state == ETHARP_STATE_STABLE) { /* we have a valid IP->Ethernet address mapping */ /* send the packet */ result = etharp_send_ip(netif, q, srcaddr, &(arp_table[i].ethaddr)); /* pending entry? (either just created or already pending */ } else if (arp_table[i].state == ETHARP_STATE_PENDING) { #if ARP_QUEUEING /* queue the given q packet */ struct pbuf *p; int copy_needed = 0; /* IF q includes a PBUF_REF, PBUF_POOL or PBUF_RAM, we have no choice but * to copy the whole queue into a new PBUF_RAM (see bug #11400) * PBUF_ROMs can be left as they are, since ROM must not get changed. */ p = q; while (p) { LWIP_ASSERT("no packet queues allowed!", (p->len != p->tot_len) || (p->next == 0)); if(p->type != PBUF_ROM) { copy_needed = 1; break; } p = p->next; } if(copy_needed) { /* copy the whole packet into new pbufs */ p = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM); if(p != NULL) { if (pbuf_copy(p, q) != ERR_OK) { pbuf_free(p); p = NULL; } } } else { /* referencing the old pbuf is enough */ p = q; pbuf_ref(p); } /* packet could be taken over? */ if (p != NULL) { /* queue packet ... */ struct etharp_q_entry *new_entry; /* allocate a new arp queue entry */ new_entry = memp_malloc(MEMP_ARP_QUEUE); if (new_entry != NULL) { new_entry->next = 0; new_entry->p = p; if(arp_table[i].q != NULL) { /* queue was already existent, append the new entry to the end */ struct etharp_q_entry *r; r = arp_table[i].q; while (r->next != NULL) { r = r->next; } r->next = new_entry; } else { /* queue did not exist, first item in queue */ arp_table[i].q = new_entry; } LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: queued packet %p on ARP entry %"S16_F"\n", (void *)q, (s16_t)i)); result = ERR_OK; } else { /* the pool MEMP_ARP_QUEUE is empty */ pbuf_free(p); LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: could not queue a copy of PBUF_REF packet %p (out of memory)\n", (void *)q)); /* { result == ERR_MEM } through initialization */ } } else { ETHARP_STATS_INC(etharp.memerr); LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: could not queue a copy of PBUF_REF packet %p (out of memory)\n", (void *)q)); /* { result == ERR_MEM } through initialization */ } #else /* ARP_QUEUEING == 0 */ /* q && state == PENDING && ARP_QUEUEING == 0 => result = ERR_MEM */ /* { result == ERR_MEM } through initialization */ LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: Ethernet destination address unknown, queueing disabled, packet %p dropped\n", (void *)q)); #endif } } return result; } /** * Send a raw ARP packet (opcode and all addresses can be modified) * * @param netif the lwip network interface on which to send the ARP packet * @param ethsrc_addr the source MAC address for the ethernet header * @param ethdst_addr the destination MAC address for the ethernet header * @param hwsrc_addr the source MAC address for the ARP protocol header * @param ipsrc_addr the source IP address for the ARP protocol header * @param hwdst_addr the destination MAC address for the ARP protocol header * @param ipdst_addr the destination IP address for the ARP protocol header * @param opcode the type of the ARP packet * @return ERR_OK if the ARP packet has been sent * ERR_MEM if the ARP packet couldn't be allocated * any other err_t on failure */ #if !LWIP_AUTOIP static #endif /* LWIP_AUTOIP */ err_t etharp_raw(struct netif *netif, const struct eth_addr *ethsrc_addr, const struct eth_addr *ethdst_addr, const struct eth_addr *hwsrc_addr, const struct ip_addr *ipsrc_addr, const struct eth_addr *hwdst_addr, const struct ip_addr *ipdst_addr, const u16_t opcode) { struct pbuf *p; err_t result = ERR_OK; u8_t k; /* ARP entry index */ struct eth_hdr *ethhdr; struct etharp_hdr *hdr; #if LWIP_AUTOIP const u8_t * ethdst_hwaddr; #endif /* LWIP_AUTOIP */ /* allocate a pbuf for the outgoing ARP request packet */ p = pbuf_alloc(PBUF_RAW, SIZEOF_ETHARP_PACKET, PBUF_RAM); /* could allocate a pbuf for an ARP request? */ if (p == NULL) { LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("etharp_raw: could not allocate pbuf for ARP request.\n")); ETHARP_STATS_INC(etharp.memerr); return ERR_MEM; } LWIP_ASSERT("check that first pbuf can hold struct etharp_hdr", (p->len >= SIZEOF_ETHARP_PACKET)); ethhdr = p->payload; hdr = (struct etharp_hdr *)((u8_t*)ethhdr + SIZEOF_ETH_HDR); LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_raw: sending raw ARP packet.\n")); hdr->opcode = htons(opcode); LWIP_ASSERT("netif->hwaddr_len must be the same as ETHARP_HWADDR_LEN for etharp!", (netif->hwaddr_len == ETHARP_HWADDR_LEN)); k = ETHARP_HWADDR_LEN; #if LWIP_AUTOIP /* If we are using Link-Local, ARP packets must be broadcast on the * link layer. (See RFC3927 Section 2.5) */ ethdst_hwaddr = ((netif->autoip != NULL) && (netif->autoip->state != AUTOIP_STATE_OFF)) ? (u8_t*)(ethbroadcast.addr) : ethdst_addr->addr; #endif /* LWIP_AUTOIP */ /* Write MAC-Addresses (combined loop for both headers) */ while(k > 0) { k--; /* Write the ARP MAC-Addresses */ hdr->shwaddr.addr[k] = hwsrc_addr->addr[k]; hdr->dhwaddr.addr[k] = hwdst_addr->addr[k]; /* Write the Ethernet MAC-Addresses */ #if LWIP_AUTOIP ethhdr->dest.addr[k] = ethdst_hwaddr[k]; #else /* LWIP_AUTOIP */ ethhdr->dest.addr[k] = ethdst_addr->addr[k]; #endif /* LWIP_AUTOIP */ ethhdr->src.addr[k] = ethsrc_addr->addr[k]; } hdr->sipaddr = *(struct ip_addr2 *)ipsrc_addr; hdr->dipaddr = *(struct ip_addr2 *)ipdst_addr; hdr->hwtype = htons(HWTYPE_ETHERNET); hdr->proto = htons(ETHTYPE_IP); /* set hwlen and protolen together */ hdr->_hwlen_protolen = htons((ETHARP_HWADDR_LEN << 8) | sizeof(struct ip_addr)); ethhdr->type = htons(ETHTYPE_ARP); /* send ARP query */ result = netif->linkoutput(netif, p); ETHARP_STATS_INC(etharp.xmit); /* free ARP query packet */ pbuf_free(p); p = NULL; /* could not allocate pbuf for ARP request */ return result; } /** * Send an ARP request packet asking for ipaddr. * * @param netif the lwip network interface on which to send the request * @param ipaddr the IP address for which to ask * @return ERR_OK if the request has been sent * ERR_MEM if the ARP packet couldn't be allocated * any other err_t on failure */ err_t etharp_request(struct netif *netif, struct ip_addr *ipaddr) { LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_request: sending ARP request.\n")); return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, ðbroadcast, (struct eth_addr *)netif->hwaddr, &netif->ip_addr, ðzero, ipaddr, ARP_REQUEST); } /** * Process received ethernet frames. Using this function instead of directly * calling ip_input and passing ARP frames through etharp in ethernetif_input, * the ARP cache is protected from concurrent access. * * @param p the recevied packet, p->payload pointing to the ethernet header * @param netif the network interface on which the packet was received */ err_t ethernet_input(struct pbuf *p, struct netif *netif) { struct eth_hdr* ethhdr; u16_t type; /* points to packet payload, which starts with an Ethernet header */ ethhdr = p->payload; LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("ethernet_input: dest:%02x:%02x:%02x:%02x:%02x:%02x, src:%02x:%02x:%02x:%02x:%02x:%02x, type:%2hx\n", (unsigned)ethhdr->dest.addr[0], (unsigned)ethhdr->dest.addr[1], (unsigned)ethhdr->dest.addr[2], (unsigned)ethhdr->dest.addr[3], (unsigned)ethhdr->dest.addr[4], (unsigned)ethhdr->dest.addr[5], (unsigned)ethhdr->src.addr[0], (unsigned)ethhdr->src.addr[1], (unsigned)ethhdr->src.addr[2], (unsigned)ethhdr->src.addr[3], (unsigned)ethhdr->src.addr[4], (unsigned)ethhdr->src.addr[5], (unsigned)htons(ethhdr->type))); type = htons(ethhdr->type); #if ETHARP_SUPPORT_VLAN if (type == ETHTYPE_VLAN) { struct eth_vlan_hdr *vlan = (struct eth_vlan_hdr*)(((char*)ethhdr) + SIZEOF_ETH_HDR); #ifdef ETHARP_VLAN_CHECK /* if not, allow all VLANs */ if (VLAN_ID(vlan) != ETHARP_VLAN_CHECK) { /* silently ignore this packet: not for our VLAN */ pbuf_free(p); return ERR_OK; } #endif /* ETHARP_VLAN_CHECK */ type = htons(vlan->tpid); } #endif /* ETHARP_SUPPORT_VLAN */ switch (type) { /* IP packet? */ case ETHTYPE_IP: #if ETHARP_TRUST_IP_MAC /* update ARP table */ etharp_ip_input(netif, p); #endif /* ETHARP_TRUST_IP_MAC */ /* skip Ethernet header */ if(pbuf_header(p, -(s16_t)SIZEOF_ETH_HDR)) { LWIP_ASSERT("Can't move over header in packet", 0); pbuf_free(p); p = NULL; } else { /* pass to IP layer */ ip_input(p, netif); } break; case ETHTYPE_ARP: /* pass p to ARP module */ etharp_arp_input(netif, (struct eth_addr*)(netif->hwaddr), p); break; #if PPPOE_SUPPORT case ETHTYPE_PPPOEDISC: /* PPP Over Ethernet Discovery Stage */ pppoe_disc_input(netif, p); break; case ETHTYPE_PPPOE: /* PPP Over Ethernet Session Stage */ pppoe_data_input(netif, p); break; #endif /* PPPOE_SUPPORT */ default: ETHARP_STATS_INC(etharp.proterr); ETHARP_STATS_INC(etharp.drop); pbuf_free(p); p = NULL; break; } /* This means the pbuf is freed or consumed, so the caller doesn't have to free it again */ return ERR_OK; } #endif /* LWIP_ARP */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/netif/loopif.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * Loop Interface * */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #include "lwip/opt.h" #if LWIP_HAVE_LOOPIF #include "netif/loopif.h" #include "lwip/snmp.h" /** * Initialize a lwip network interface structure for a loopback interface * * @param netif the lwip network interface structure for this loopif * @return ERR_OK if the loopif is initialized * ERR_MEM if private data couldn't be allocated */ err_t loopif_init(struct netif *netif) { /* initialize the snmp variables and counters inside the struct netif * ifSpeed: no assumption can be made! */ NETIF_INIT_SNMP(netif, snmp_ifType_softwareLoopback, 0); netif->name[0] = 'l'; netif->name[1] = 'o'; netif->output = netif_loop_output; return ERR_OK; } #endif /* LWIP_HAVE_LOOPIF */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include/arch/cc.h ================================================ /* * Copyright (c) 2001-2003 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __ARCH_CC_H__ #define __ARCH_CC_H__ /* Define platform endianness */ #ifndef BYTE_ORDER #define BYTE_ORDER BIG_ENDIAN #endif /* BYTE_ORDER */ /* Define generic types used in lwIP */ typedef unsigned char u8_t; typedef signed char s8_t; typedef unsigned short u16_t; typedef signed short s16_t; typedef unsigned long u32_t; typedef signed long s32_t; typedef u32_t mem_ptr_t; /* Define (sn)printf formatters for these lwIP types */ #define U16_F "u" #define S16_F "d" #define X16_F "x" #define U32_F "u" #define S32_F "d" #define X32_F "x" /* Compiler hints for packing structures */ #define PACK_STRUCT_FIELD(x) x #define PACK_STRUCT_STRUCT __attribute__((packed)) #define PACK_STRUCT_BEGIN #define PACK_STRUCT_END /* Plaform specific diagnostic output */ #ifdef CONFIG_OWL # include # define LWIP_PLATFORM_DIAG(x) owl_printf x # define LWIP_PLATFORM_ASSERT(x) owl_assert(x) #else # include # define LWIP_PLATFORM_DIAG(x) do { printk x; } while(0) # define LWIP_PLATFORM_ASSERT(x) do { \ printk("Assertion \"%s\" failed at line " \ "%d in %s\n", \ x, __LINE__, __FILE__); while(1); \ } while(0) #endif #endif /* __ARCH_CC_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include/arch/perf.h ================================================ #ifndef __PERF_H__ #define __PERF_H__ #define PERF_START /* null definition */ #define PERF_STOP(x) /* null definition */ #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include/lwipopts.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * * lwIP Options Configuration */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIPOPTS_H__ #define __LWIPOPTS_H__ #include "wl_api.h" /* ----------------------------------------------- ---------- Platform specific locking ---------- ----------------------------------------------- */ /** * NO_SYS==1: Provides VERY minimal functionality. Otherwise, * use lwIP facilities. */ #define NO_SYS 1 /* ------------------------------------ ---------- Memory options ---------- ------------------------------------ */ /** * MEM_ALIGNMENT: should be set to the alignment of the CPU * 4 byte alignment -> #define MEM_ALIGNMENT 4 * 2 byte alignment -> #define MEM_ALIGNMENT 2 */ #define MEM_ALIGNMENT 4 /** * MEM_SIZE: the size of the heap memory. If the application will send * a lot of data that needs to be copied, this should be set high. */ #define MEM_SIZE 16000 /* ------------------------------------------------ ---------- Internal Memory Pool Sizes ---------- ------------------------------------------------ */ /** * MEMP_NUM_PBUF: the number of memp struct pbufs (used for PBUF_ROM and PBUF_REF). * If the application sends a lot of data out of ROM (or other static memory), * this should be set high. */ #define MEMP_NUM_PBUF 30 /** * MEMP_NUM_RAW_PCB: Number of raw connection PCBs * (requires the LWIP_RAW option) */ #define MEMP_NUM_RAW_PCB 4 /** * MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One * per active UDP "connection". * (requires the LWIP_UDP option) */ #define MEMP_NUM_UDP_PCB 4 /** * MEMP_NUM_TCP_PCB: the number of simulatenously active TCP connections. * (requires the LWIP_TCP option) */ #define MEMP_NUM_TCP_PCB 2 /** * MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP connections. * (requires the LWIP_TCP option) */ #define MEMP_NUM_TCP_PCB_LISTEN 2 /** * MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments. * (requires the LWIP_TCP option) */ #define MEMP_NUM_TCP_SEG 32 /** * MEMP_NUM_ARP_QUEUE: the number of simulateously queued outgoing * packets (pbufs) that are waiting for an ARP request (to resolve * their destination address) to finish. * (requires the ARP_QUEUEING option) */ #define MEMP_NUM_ARP_QUEUE 2 /** * MEMP_NUM_SYS_TIMEOUT: the number of simulateously active timeouts. * (requires NO_SYS==0) */ #define MEMP_NUM_SYS_TIMEOUT 0 /** * MEMP_NUM_NETBUF: the number of struct netbufs. * (only needed if you use the sequential API, like api_lib.c) */ #define MEMP_NUM_NETBUF 0 /** * MEMP_NUM_NETCONN: the number of struct netconns. * (only needed if you use the sequential API, like api_lib.c) */ #define MEMP_NUM_NETCONN 0 /** * MEMP_NUM_TCPIP_MSG_API: the number of struct tcpip_msg, which are used * for callback/timeout API communication. * (only needed if you use tcpip.c) */ #define MEMP_NUM_TCPIP_MSG_API 0 /** * MEMP_NUM_TCPIP_MSG_INPKT: the number of struct tcpip_msg, which are used * for incoming packets. * (only needed if you use tcpip.c) */ #define MEMP_NUM_TCPIP_MSG_INPKT 0 /** * PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */ #define PBUF_POOL_SIZE 32 /* --------------------------------- ---------- ARP options ---------- --------------------------------- */ /** * LWIP_ARP==1: Enable ARP functionality. */ #define LWIP_ARP 1 /* -------------------------------- ---------- IP options ---------- -------------------------------- */ /** * IP_FORWARD==1: Enables the ability to forward IP packets across network * interfaces. If you are going to run lwIP on a device with only one network * interface, define this to 0. */ #define IP_FORWARD 0 /** * IP_OPTIONS: Defines the behavior for IP options. * IP_OPTIONS==0_ALLOWED: All packets with IP options are dropped. * IP_OPTIONS==1_ALLOWED: IP options are allowed (but not parsed). */ #define IP_OPTIONS_ALLOWED 1 /** * IP_REASSEMBLY==1: Reassemble incoming fragmented IP packets. Note that * this option does not affect outgoing packet sizes, which can be controlled * via IP_FRAG. */ #define IP_REASSEMBLY 1 /** * IP_FRAG==1: Fragment outgoing IP packets if their size exceeds MTU. Note * that this option does not affect incoming packet sizes, which can be * controlled via IP_REASSEMBLY. */ #define IP_FRAG 1 /** * IP_REASS_MAXAGE: Maximum time (in multiples of IP_TMR_INTERVAL - so seconds, normally) * a fragmented IP packet waits for all fragments to arrive. If not all fragments arrived * in this time, the whole packet is discarded. */ #define IP_REASS_MAXAGE 3 /** * IP_REASS_MAX_PBUFS: Total maximum amount of pbufs waiting to be reassembled. * Since the received pbufs are enqueued, be sure to configure * PBUF_POOL_SIZE > IP_REASS_MAX_PBUFS so that the stack is still able to receive * packets even if the maximum amount of fragments is enqueued for reassembly! */ #define IP_REASS_MAX_PBUFS 10 /** * IP_FRAG_USES_STATIC_BUF==1: Use a static MTU-sized buffer for IP * fragmentation. Otherwise pbufs are allocated and reference the original * packet data to be fragmented. */ #define IP_FRAG_USES_STATIC_BUF 0 /** * IP_DEFAULT_TTL: Default value for Time-To-Live used by transport layers. */ #define IP_DEFAULT_TTL 255 /* ---------------------------------- ---------- ICMP options ---------- ---------------------------------- */ /** * LWIP_ICMP==1: Enable ICMP module inside the IP stack. * Be careful, disable that make your product non-compliant to RFC1122 */ #define LWIP_ICMP 1 /** * ICMP_TTL: Default value for Time-To-Live used by ICMP packets. */ #define ICMP_TTL (IP_DEFAULT_TTL) /* --------------------------------- ---------- RAW options ---------- --------------------------------- */ /** * LWIP_RAW==1: Enable application layer to hook into the IP layer itself. */ #define LWIP_RAW 1 /* ---------------------------------- ---------- DHCP options ---------- ---------------------------------- */ /** * LWIP_DHCP==1: Enable DHCP module. */ #define LWIP_DHCP 1 /* ------------------------------------ ---------- AUTOIP options ---------- ------------------------------------ */ /** * LWIP_AUTOIP==1: Enable AUTOIP module. */ #define LWIP_AUTOIP 0 /* ---------------------------------- ---------- SNMP options ---------- ---------------------------------- */ /** * LWIP_SNMP==1: Turn on SNMP module. UDP must be available for SNMP * transport. */ #define LWIP_SNMP 0 #define SNMP_PRIVATE_MIB 0 /* ---------------------------------- ---------- IGMP options ---------- ---------------------------------- */ /** * LWIP_IGMP==1: Turn on IGMP module. */ #define LWIP_IGMP 1 /* ---------------------------------- ---------- DNS options ----------- ---------------------------------- */ /** * LWIP_DNS==1: Turn on DNS module. UDP must be available for DNS * transport. */ #define LWIP_DNS 1 /* --------------------------------- ---------- UDP options ---------- --------------------------------- */ /** * LWIP_UDP==1: Turn on UDP. */ #define LWIP_UDP 1 /** * LWIP_UDPLITE==1: Turn on UDP-Lite. (Requires LWIP_UDP) */ #define LWIP_UDPLITE 0 /** * UDP_TTL: Default Time-To-Live value. */ #define UDP_TTL (IP_DEFAULT_TTL) /* --------------------------------- ---------- TCP options ---------- --------------------------------- */ /** * LWIP_TCP==1: Turn on TCP. */ #define LWIP_TCP 1 /* ---------------------------------- ---------- Pbuf options ---------- ---------------------------------- */ /** * PBUF_LINK_HLEN: the number of bytes that should be allocated for a * link level header. The default is 14, the standard value for * Ethernet. */ #define PBUF_LINK_HLEN (14 + ETH_PAD_SIZE) /* ------------------------------------ ---------- LOOPIF options ---------- ------------------------------------ */ /** * LWIP_HAVE_LOOPIF==1: Support loop interface (127.0.0.1) and loopif.c */ #define LWIP_HAVE_LOOPIF 1 #define LWIP_LOOPIF_MULTITHREADING 0 /* ---------------------------------------------- ---------- Sequential layer options ---------- ---------------------------------------------- */ /** * LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c) */ #define LWIP_NETCONN 0 /* ------------------------------------ ---------- Socket options ---------- ------------------------------------ */ /** * LWIP_SOCKET==1: Enable Socket API (require to use sockets.c) */ #define LWIP_SOCKET 0 /* ---------------------------------------- ---------- Statistics options ---------- ---------------------------------------- */ /** * LWIP_STATS==1: Enable statistics collection in lwip_stats. */ #define LWIP_STATS 1 #define LINK_STATS 1 /* Misc */ #define LWIP_NETIF_LINK_CALLBACK 1 #define LWIP_NETIF_STATUS_CALLBACK 1 #define LWIP_TIMEVAL_PRIVATE 0 #undef DHCP_DOES_ARP_CHECK #if 0 #define LWIP_DEBUG 1 //#define NETIF_DEBUG LWIP_DBG_ON #define DHCP_DEBUG LWIP_DBG_ON //#define ICMP_DEBUG LWIP_DBG_ON //#define TCP_DEBUG LWIP_DBG_ON //#define TCP_RTO_DEBUG LWIP_DBG_ON //#define IP_DEBUG LWIP_DBG_ON //#define TCP_CWND_DEBUG LWIP_DBG_ON //#define ETHARP_DEBUG LWIP_DBG_ON //#define PBUF_DEBUG LWIP_DBG_ON #define TCP_INPUT_DEBUG LWIP_DBG_ON #define TCP_OUTPUT_DEBUG LWIP_DBG_ON #endif #define ETH_PAD_SIZE WL_HEADER_SIZE /* size of wifiengine header */ #define MEM_LIBC_MALLOC 1 #define TCP_MSS 512 #define TCP_SND_BUF 4096 #endif /* __LWIPOPTS_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include/netif/wlif.h ================================================ #ifndef __NETIF_NRWLANIF_H__ #define __NETIF_NRWLANIF_H__ #include "lwip/netif.h" #include "lwip/err.h" err_t wlif_init(struct netif *netif); void wlif_poll(struct netif *netif); #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/netif/wlif.c ================================================ #include "lwip/opt.h" #include "lwip/def.h" #include "lwip/mem.h" #include "lwip/pbuf.h" #include "lwip/stats.h" #include "lwip/sys.h" #include "netif/etharp.h" #include "netif/wlif.h" #include #include #define IFNAME0 'w' #define IFNAME1 'l' /* the queue size will affect the tx performance when using power save. * A small queue will quickly become filled up if we have to wake the device * before the actual transmission can occur. When the queue is filled up, the * packets will be discarded and retransmission will be handled by the upper * layers. In case of TCP, the retransmission time might be quite long. * * If the packets can be put in the pqueue instead, all the packets * (if possible) will be transmitted when the device wakes up, so we don't have * to wait for retransmission from upper layers. */ #define PQUEUE_SIZE 8 struct wlif_t { volatile uint8_t rx_pending; struct { struct pbuf* buf[PQUEUE_SIZE]; uint8_t first; uint8_t last; } pqueue; }; #define PQUEUE_EMPTY(q) (q.last == q.first) #define PQUEUE_FULL(q) ((q.last + 1) % PQUEUE_SIZE == q.first) #define PQUEUE_FIRST(q) (q.buf[q.first]) #define PQUEUE_DEQUEUE(q) \ ({ \ struct pbuf* __p = PQUEUE_FIRST(q); \ q.first = (q.first + 1) % PQUEUE_SIZE; \ __p; \ }) #define PQUEUE_ENQUEUE(q, p) \ ({ \ q.buf[q.last] = p; \ q.last = (q.last + 1) % PQUEUE_SIZE; \ }) static err_t process_pqueue(struct netif* netif) { struct pbuf *p; struct pbuf *q; int status; struct wlif_t *priv = (struct wlif_t*) netif->state; /* queue empty? finished */ if (PQUEUE_EMPTY(priv->pqueue)) return ERR_OK; /* get first packet in queue */ p = PQUEUE_FIRST(priv->pqueue); status = wl_process_tx( p->payload + WL_HEADER_SIZE, /* ptr to eth hdr */ p->len - WL_HEADER_SIZE, /* input buffer len */ p->tot_len - WL_HEADER_SIZE, /* pkt len */ p->payload, /* ptr to WE hdr */ 0, /* prio */ p); /* pkt handle */ /* if we fail due to power save mode, leave packet in queue and * try again when target is awake again (upon WL_RX_EVENT_WAKEUP). */ if (status == WL_RESOURCES) return ERR_IF; /* if we fail for another reason, just discard the packet */ if (status != WL_SUCCESS) { PQUEUE_DEQUEUE(priv->pqueue); pbuf_free(p); return ERR_IF; } /* Send the data from the pbuf to the interface, one pbuf at a * time. The size of the data in each pbuf is kept in the ->len * variable. */ for (q = p; q != NULL; q = q->next) wl_tx(q->payload, q->len); /* remove packet from queue and dec refcnt */ PQUEUE_DEQUEUE(priv->pqueue); pbuf_free(p); LINK_STATS_INC(link.xmit); /* tell caller to process next packet */ return ERR_INPROGRESS; } /** * Called in interrupt context when we can read more data from the mac. * */ static void rx_isr(void* ctx) { struct netif *netif = ctx; struct wlif_t *priv = (struct wlif_t*) netif->state; priv->rx_pending = 1; } /** * In this function, the hardware should be initialized. * Called from wlif_init(). * * @param netif the already initialized lwip network interface structure * for this ethernetif */ static err_t low_level_init(struct netif *netif) { /* device capabilities */ netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_IGMP; /* NETIF_FLAG_LINK_UP must be set only when we have an wlan assoc */ /* set MAC hardware address length */ netif->hwaddr_len = ETHARP_HWADDR_LEN; if (wl_get_mac_addr(netif->hwaddr) != WL_SUCCESS) return ERR_IF; /* maximum transfer unit */ netif->mtu = 1500; return ERR_OK; } /** * This function should do the actual transmission of the packet. The packet is * contained in the pbuf that is passed to the function. This pbuf * might be chained. * * @param netif the lwip network interface structure for this ethernetif * @param p the MAC packet to send (e.g. IP packet including MAC addresses and * type) * @return ERR_OK if the packet could be sent * an err_t value if the packet couldn't be sent * * @note Returning ERR_MEM here if a DMA queue of your MAC is full can lead to * strange results. You might consider waiting for space in the DMA queue * to become availale since the stack doesn't retry to send a packet * dropped because of memory failure (except for the TCP timers). */ static err_t low_level_output(struct netif *netif, struct pbuf *p) { struct wlif_t* priv = (struct wlif_t*) netif->state; /* must have a linear buffer containing up to and including * the ethernet header */ if (p->len < sizeof(struct eth_hdr)) return ERR_IF; /* queue full? drop packet */ if (PQUEUE_FULL(priv->pqueue)) return ERR_INPROGRESS; /* no one seems to check this anyway */ /* queue packet */ PQUEUE_ENQUEUE(priv->pqueue, p); pbuf_ref(p); while (process_pqueue(netif) == ERR_INPROGRESS); return ERR_OK; /* no one seems to check this anyway */ } /** * Should allocate a pbuf and transfer the bytes of the incoming * packet from the interface into the pbuf. * * @param netif the lwip network interface structure for this ethernetif * @return a pbuf filled with the received packet (including MAC header) * NULL on memory error */ static struct pbuf * low_level_input(struct netif *netif) { struct pbuf *p; struct wlif_t *priv = (struct wlif_t*) netif->state; char *stripped_pkt; size_t stripped_pkt_len; u16_t vlan; u8_t rx_hdr_size; int status; u16_t len; /* maximum packet length from wl_rx() */ len = WL_MAX_PKT_LEN; /* We allocate a continous pbuf */ p = pbuf_alloc(PBUF_RAW, len, PBUF_RAM); if (p == NULL) { LWIP_DEBUGF(NETIF_DEBUG, ("low_level_input: fail to alloc " "pbuf of len:%"S32_F"\n", len)); return NULL; } /* Read the entire msg */ priv->rx_pending = 0; wl_rx(p->payload, &len); if (len == 0) { LWIP_DEBUGF(NETIF_DEBUG, ("low_level_input: len was 0")); return NULL; } status = wl_process_rx( p->payload, /* input buf */ len, /* input buf length */ &stripped_pkt, &stripped_pkt_len, &vlan); if (status == WL_ABSORBED) { LWIP_DEBUGF(NETIF_DEBUG, ("low_level_input: absorbed")); pbuf_free(p); return NULL; } /* Data packet, remove padding */ rx_hdr_size = stripped_pkt - (char*) p->payload; pbuf_realloc(p, stripped_pkt_len + rx_hdr_size); LINK_STATS_INC(link.recv); return p; } /** * This function will be called by wlif_poll() when a packet has been received * from the mac. Then the type of the received packet is determined and * the appropriate input function is called. * * @param netif the lwip network interface structure for this ethernetif */ static void wlif_input(struct netif *netif) { struct eth_hdr *ethhdr; struct pbuf *p; /* move received packet into a new pbuf */ p = low_level_input(netif); /* no packet could be read, silently ignore this */ if (p == NULL) return; /* points to packet payload, which starts with an Ethernet header */ ethhdr = p->payload; switch (htons(ethhdr->type)) { /* IP or ARP packet? */ case ETHTYPE_IP: case ETHTYPE_ARP: #if PPPOE_SUPPORT /* PPPoE packet? */ case ETHTYPE_PPPOEDISC: case ETHTYPE_PPPOE: #endif /* PPPOE_SUPPORT */ /* full packet send to tcpip_thread to process */ if (netif->input(p, netif) != ERR_OK) { LWIP_DEBUGF(NETIF_DEBUG, ("wlif_input: IP input error\n")); pbuf_free(p); p = NULL; } break; default: pbuf_free(p); p = NULL; break; } } static ssize_t pkt_read_cb(char *dst, void *src_handle, size_t read_len, int offset) { ssize_t rc; rc = pbuf_copy_partial((struct pbuf *)src_handle, dst, read_len, offset + WL_HEADER_SIZE); if ( 0 == rc ) { return -1; } return rc; } /** * Should be called at the beginning of the program to set up the * network interface. It calls the function low_level_init() to do the * actual setup of the hardware. * * This function should be passed as a parameter to netif_add(). * * @param netif the lwip network interface structure for this ethernetif * @return ERR_OK if the loopif is initialized * ERR_MEM if private data couldn't be allocated * any other err_t on error */ err_t wlif_init(struct netif *netif) { static struct wlif_t wlif; LWIP_ASSERT("netif != NULL", (netif != NULL)); #if LWIP_NETIF_HOSTNAME /* Initialize interface hostname */ if ( NULL == netif->hostname ) { netif->hostname = "wlif"; } #endif /* LWIP_NETIF_HOSTNAME */ netif->state = &wlif; netif->name[0] = IFNAME0; netif->name[1] = IFNAME1; /* We directly use etharp_output() here to save a function call. * You can instead declare your own function an call etharp_output() * from it if you have to do some checks before sending (e.g. if link * is available...) */ netif->output = etharp_output; netif->linkoutput = low_level_output; wl_register_rx_isr(rx_isr, netif); wl_register_pkt_read_cb(pkt_read_cb); /* initialize the hardware */ return low_level_init(netif); } /** * */ void wlif_poll(struct netif* netif) { struct wlif_t* priv = NULL; /* wl api forward progress */ wl_poll(); if (netif) priv = (struct wlif_t*) netif->state; /* wlif_init() not called yet? */ if (priv == NULL) return; /* no packets pending? */ if (!priv->rx_pending) return; /* read the pending packet */ wlif_input(netif); /* send any packets that was queued due to filled up target queue * or power save mode. */ process_pqueue(netif); } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/readme.txt ================================================ This directory is specific to the WIFI H&D SPB104 components (\COMPONENTS\WIFI\HD_SPB104). ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Abstraction layer for memory interfaces. * * This module contains the interfaces: * - MEM <-> USB; * - MEM <-> RAM; * - MEM <-> MEM. * * This module may be configured and expanded to support the following features: * - write-protected globals; * - password-protected data; * - specific features; * - etc. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ //_____ I N C L U D E S ____________________________________________________ #include "compiler.h" #include "preprocessor.h" #ifdef FREERTOS_USED #include "FreeRTOS.h" #include "semphr.h" #endif #include "ctrl_access.h" //_____ D E F I N I T I O N S ______________________________________________ #ifdef FREERTOS_USED /*! \name LUN Access Protection Macros */ //! @{ /*! \brief Locks accesses to LUNs. * * \return \c TRUE if the access was successfully locked, else \c FALSE. */ #define Ctrl_access_lock() ctrl_access_lock() /*! \brief Unlocks accesses to LUNs. */ #define Ctrl_access_unlock() xSemaphoreGive(ctrl_access_semphr) //! @} //! Handle to the semaphore protecting accesses to LUNs. static xSemaphoreHandle ctrl_access_semphr = NULL; #else /*! \name LUN Access Protection Macros */ //! @{ /*! \brief Locks accesses to LUNs. * * \return \c TRUE if the access was successfully locked, else \c FALSE. */ #define Ctrl_access_lock() TRUE /*! \brief Unlocks accesses to LUNs. */ #define Ctrl_access_unlock() //! @} #endif // FREERTOS_USED #if MAX_LUN /*! \brief Initializes an entry of the LUN descriptor table. * * \param lun Logical Unit Number. * * \return LUN descriptor table entry initializer. */ #if ACCESS_USB == ENABLED && ACCESS_MEM_TO_RAM == ENABLED #define Lun_desc_entry(lun) \ {\ TPASTE3(Lun_, lun, _test_unit_ready),\ TPASTE3(Lun_, lun, _read_capacity),\ TPASTE3(Lun_, lun, _wr_protect),\ TPASTE3(Lun_, lun, _removal),\ TPASTE3(Lun_, lun, _usb_read_10),\ TPASTE3(Lun_, lun, _usb_write_10),\ TPASTE3(Lun_, lun, _mem_2_ram),\ TPASTE3(Lun_, lun, _ram_2_mem),\ TPASTE3(LUN_, lun, _NAME)\ } #elif ACCESS_USB == ENABLED #define Lun_desc_entry(lun) \ {\ TPASTE3(Lun_, lun, _test_unit_ready),\ TPASTE3(Lun_, lun, _read_capacity),\ TPASTE3(Lun_, lun, _wr_protect),\ TPASTE3(Lun_, lun, _removal),\ TPASTE3(Lun_, lun, _usb_read_10),\ TPASTE3(Lun_, lun, _usb_write_10),\ TPASTE3(LUN_, lun, _NAME)\ } #elif ACCESS_MEM_TO_RAM == ENABLED #define Lun_desc_entry(lun) \ {\ TPASTE3(Lun_, lun, _test_unit_ready),\ TPASTE3(Lun_, lun, _read_capacity),\ TPASTE3(Lun_, lun, _wr_protect),\ TPASTE3(Lun_, lun, _removal),\ TPASTE3(Lun_, lun, _mem_2_ram),\ TPASTE3(Lun_, lun, _ram_2_mem),\ TPASTE3(LUN_, lun, _NAME)\ } #else #define Lun_desc_entry(lun) \ {\ TPASTE3(Lun_, lun, _test_unit_ready),\ TPASTE3(Lun_, lun, _read_capacity),\ TPASTE3(Lun_, lun, _wr_protect),\ TPASTE3(Lun_, lun, _removal),\ TPASTE3(LUN_, lun, _NAME)\ } #endif //! LUN descriptor table. static const struct { Ctrl_status (*test_unit_ready)(void); Ctrl_status (*read_capacity)(U32 *); Bool (*wr_protect)(void); Bool (*removal)(void); #if ACCESS_USB == ENABLED Ctrl_status (*usb_read_10)(U32, U16); Ctrl_status (*usb_write_10)(U32, U16); #endif #if ACCESS_MEM_TO_RAM == ENABLED Ctrl_status (*mem_2_ram)(U32, void *); Ctrl_status (*ram_2_mem)(U32, const void *); #endif const char *name; } lun_desc[MAX_LUN] = { #if LUN_0 == ENABLE Lun_desc_entry(0), #endif #if LUN_1 == ENABLE Lun_desc_entry(1), #endif #if LUN_2 == ENABLE Lun_desc_entry(2), #endif #if LUN_3 == ENABLE Lun_desc_entry(3), #endif #if LUN_4 == ENABLE Lun_desc_entry(4), #endif #if LUN_5 == ENABLE Lun_desc_entry(5), #endif #if LUN_6 == ENABLE Lun_desc_entry(6), #endif #if LUN_7 == ENABLE Lun_desc_entry(7) #endif }; #endif #if GLOBAL_WR_PROTECT == ENABLED Bool g_wr_protect; #endif /*! \name Control Interface */ //! @{ #ifdef FREERTOS_USED Bool ctrl_access_init(void) { // If the handle to the protecting semaphore is not valid, if (!ctrl_access_semphr) { // try to create the semaphore. vSemaphoreCreateBinary(ctrl_access_semphr); // If the semaphore could not be created, there is no backup solution. if (!ctrl_access_semphr) return FALSE; } return TRUE; } /*! \brief Locks accesses to LUNs. * * \return \c TRUE if the access was successfully locked, else \c FALSE. */ static Bool ctrl_access_lock(void) { // If the semaphore could not be created, there is no backup solution. if (!ctrl_access_semphr) return FALSE; // Wait for the semaphore. while (!xSemaphoreTake(ctrl_access_semphr, portMAX_DELAY)); return TRUE; } #endif // FREERTOS_USED U8 get_nb_lun(void) { #if MEM_USB == ENABLE U8 nb_lun; if (!Ctrl_access_lock()) return MAX_LUN; nb_lun = MAX_LUN + host_get_lun(); Ctrl_access_unlock(); return nb_lun; #else return MAX_LUN; #endif } U8 get_cur_lun(void) { return LUN_ID_0; } Ctrl_status mem_test_unit_ready(U8 lun) { Ctrl_status status; if (!Ctrl_access_lock()) return CTRL_FAIL; status = #if MAX_LUN (lun < MAX_LUN) ? lun_desc[lun].test_unit_ready() : #endif #if LUN_USB == ENABLE Lun_usb_test_unit_ready(lun - LUN_ID_USB); #else CTRL_FAIL; #endif Ctrl_access_unlock(); return status; } Ctrl_status mem_read_capacity(U8 lun, U32 *u32_nb_sector) { Ctrl_status status; if (!Ctrl_access_lock()) return CTRL_FAIL; status = #if MAX_LUN (lun < MAX_LUN) ? lun_desc[lun].read_capacity(u32_nb_sector) : #endif #if LUN_USB == ENABLE Lun_usb_read_capacity(lun - LUN_ID_USB, u32_nb_sector); #else CTRL_FAIL; #endif Ctrl_access_unlock(); return status; } U8 mem_sector_size(U8 lun) { U8 sector_size; if (!Ctrl_access_lock()) return 0; sector_size = #if MAX_LUN (lun < MAX_LUN) ? 1 : #endif #if LUN_USB == ENABLE Lun_usb_read_sector_size(lun - LUN_ID_USB); #else 0; #endif Ctrl_access_unlock(); return sector_size; } Bool mem_wr_protect(U8 lun) { Bool wr_protect; if (!Ctrl_access_lock()) return TRUE; wr_protect = #if MAX_LUN (lun < MAX_LUN) ? lun_desc[lun].wr_protect() : #endif #if LUN_USB == ENABLE Lun_usb_wr_protect(lun - LUN_ID_USB); #else TRUE; #endif Ctrl_access_unlock(); return wr_protect; } Bool mem_removal(U8 lun) { Bool removal; if (!Ctrl_access_lock()) return TRUE; removal = #if MAX_LUN (lun < MAX_LUN) ? lun_desc[lun].removal() : #endif #if LUN_USB == ENABLE Lun_usb_removal(); #else TRUE; #endif Ctrl_access_unlock(); return removal; } const char *mem_name(U8 lun) { return #if MAX_LUN (lun < MAX_LUN) ? lun_desc[lun].name : #endif #if LUN_USB == ENABLE LUN_USB_NAME; #else NULL; #endif } //! @} #if ACCESS_USB == ENABLED /*! \name MEM <-> USB Interface */ //! @{ Ctrl_status memory_2_usb(U8 lun, U32 addr, U16 nb_sector) { Ctrl_status status; if (!Ctrl_access_lock()) return CTRL_FAIL; memory_start_read_action(nb_sector); status = #if MAX_LUN (lun < MAX_LUN) ? lun_desc[lun].usb_read_10(addr, nb_sector) : #endif CTRL_FAIL; memory_stop_read_action(); Ctrl_access_unlock(); return status; } Ctrl_status usb_2_memory(U8 lun, U32 addr, U16 nb_sector) { Ctrl_status status; if (!Ctrl_access_lock()) return CTRL_FAIL; memory_start_write_action(nb_sector); status = #if MAX_LUN (lun < MAX_LUN) ? lun_desc[lun].usb_write_10(addr, nb_sector) : #endif CTRL_FAIL; memory_stop_write_action(); Ctrl_access_unlock(); return status; } //! @} #endif // ACCESS_USB == ENABLED #if ACCESS_MEM_TO_RAM == ENABLED /*! \name MEM <-> RAM Interface */ //! @{ Ctrl_status memory_2_ram(U8 lun, U32 addr, void *ram) { Ctrl_status status; if (!Ctrl_access_lock()) return CTRL_FAIL; memory_start_read_action(1); status = #if MAX_LUN (lun < MAX_LUN) ? lun_desc[lun].mem_2_ram(addr, ram) : #endif #if LUN_USB == ENABLE Lun_usb_mem_2_ram(addr, ram); #else CTRL_FAIL; #endif memory_stop_read_action(); Ctrl_access_unlock(); return status; } Ctrl_status ram_2_memory(U8 lun, U32 addr, const void *ram) { Ctrl_status status; if (!Ctrl_access_lock()) return CTRL_FAIL; memory_start_write_action(1); status = #if MAX_LUN (lun < MAX_LUN) ? lun_desc[lun].ram_2_mem(addr, ram) : #endif #if LUN_USB == ENABLE Lun_usb_ram_2_mem(addr, ram); #else CTRL_FAIL; #endif memory_stop_write_action(); Ctrl_access_unlock(); return status; } //! @} #endif // ACCESS_MEM_TO_RAM == ENABLED #if ACCESS_STREAM == ENABLED /*! \name Streaming MEM <-> MEM Interface */ //! @{ #if ACCESS_MEM_TO_MEM == ENABLED #include "fat.h" Ctrl_status stream_mem_to_mem(U8 src_lun, U32 src_addr, U8 dest_lun, U32 dest_addr, U16 nb_sector) { #if (defined __GNUC__) && (defined __AVR32__) __attribute__((__aligned__(4))) #elif (defined __ICCAVR32__) #pragma data_alignment = 4 #endif static U8 sector_buf[FS_512B]; Ctrl_status status = CTRL_GOOD; while (nb_sector--) { if ((status = memory_2_ram(src_lun, src_addr++, sector_buf)) != CTRL_GOOD) break; if ((status = ram_2_memory(dest_lun, dest_addr++, sector_buf)) != CTRL_GOOD) break; } return status; } #endif // ACCESS_MEM_TO_MEM == ENABLED Ctrl_status stream_state(U8 id) { return CTRL_GOOD; } U16 stream_stop(U8 id) { return 0; } //! @} #endif // ACCESS_STREAM == ENABLED ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Abstraction layer for memory interfaces. * * This module contains the interfaces: * - MEM <-> USB; * - MEM <-> RAM; * - MEM <-> MEM. * * This module may be configured and expanded to support the following features: * - write-protected globals; * - password-protected data; * - specific features; * - etc. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _CTRL_ACCESS_H_ #define _CTRL_ACCESS_H_ #include "compiler.h" #include "conf_access.h" //! Status returned by CTRL_ACCESS interfaces. typedef enum { CTRL_GOOD = PASS, //!< Success, memory ready. CTRL_FAIL = FAIL, //!< An error occurred. CTRL_NO_PRESENT = FAIL + 1, //!< Memory unplugged. CTRL_BUSY = FAIL + 2 //!< Memory not initialized or changed. } Ctrl_status; // FYI: Each Logical Unit Number (LUN) corresponds to a memory. // Check LUN defines. #ifndef LUN_0 #error LUN_0 must be defined as ENABLE or DISABLE in conf_access.h #endif #ifndef LUN_1 #error LUN_1 must be defined as ENABLE or DISABLE in conf_access.h #endif #ifndef LUN_2 #error LUN_2 must be defined as ENABLE or DISABLE in conf_access.h #endif #ifndef LUN_3 #error LUN_3 must be defined as ENABLE or DISABLE in conf_access.h #endif #ifndef LUN_4 #error LUN_4 must be defined as ENABLE or DISABLE in conf_access.h #endif #ifndef LUN_5 #error LUN_5 must be defined as ENABLE or DISABLE in conf_access.h #endif #ifndef LUN_6 #error LUN_6 must be defined as ENABLE or DISABLE in conf_access.h #endif #ifndef LUN_7 #error LUN_7 must be defined as ENABLE or DISABLE in conf_access.h #endif #ifndef LUN_USB #error LUN_USB must be defined as ENABLE or DISABLE in conf_access.h #endif /*! \name LUN IDs */ //! @{ #define LUN_ID_0 (0) //!< First static LUN. #define LUN_ID_1 (LUN_ID_0 + LUN_0) #define LUN_ID_2 (LUN_ID_1 + LUN_1) #define LUN_ID_3 (LUN_ID_2 + LUN_2) #define LUN_ID_4 (LUN_ID_3 + LUN_3) #define LUN_ID_5 (LUN_ID_4 + LUN_4) #define LUN_ID_6 (LUN_ID_5 + LUN_5) #define LUN_ID_7 (LUN_ID_6 + LUN_6) #define MAX_LUN (LUN_ID_7 + LUN_7) //!< Number of static LUNs. #define LUN_ID_USB (MAX_LUN) //!< First dynamic LUN (USB host mass storage). //! @} // Include LUN header files. #if LUN_0 == ENABLE #include LUN_0_INCLUDE #endif #if LUN_1 == ENABLE #include LUN_1_INCLUDE #endif #if LUN_2 == ENABLE #include LUN_2_INCLUDE #endif #if LUN_3 == ENABLE #include LUN_3_INCLUDE #endif #if LUN_4 == ENABLE #include LUN_4_INCLUDE #endif #if LUN_5 == ENABLE #include LUN_5_INCLUDE #endif #if LUN_6 == ENABLE #include LUN_6_INCLUDE #endif #if LUN_7 == ENABLE #include LUN_7_INCLUDE #endif #if LUN_USB == ENABLE #include LUN_USB_INCLUDE #endif // Check the configuration of write protection in conf_access.h. #ifndef GLOBAL_WR_PROTECT #error GLOBAL_WR_PROTECT must be defined as ENABLED or DISABLED in conf_access.h #endif #if GLOBAL_WR_PROTECT == ENABLED //! Write protect. extern Bool g_wr_protect; #endif /*! \name Control Interface */ //! @{ #ifdef FREERTOS_USED /*! \brief Initializes the LUN access locker. * * \return \c TRUE if the locker was successfully initialized, else \c FALSE. */ extern Bool ctrl_access_init(void); #endif // FREERTOS_USED /*! \brief Returns the number of LUNs. * * \return Number of LUNs in the system. */ extern U8 get_nb_lun(void); /*! \brief Returns the current LUN. * * \return Current LUN. * * \todo Implement. */ extern U8 get_cur_lun(void); /*! \brief Tests the memory state and initializes the memory if required. * * The TEST UNIT READY SCSI primary command allows an application client to poll * a LUN until it is ready without having to allocate memory for returned data. * * This command may be used to check the media status of LUNs with removable * media. * * \param lun Logical Unit Number. * * \return Status. */ extern Ctrl_status mem_test_unit_ready(U8 lun); /*! \brief Returns the address of the last valid sector (512 bytes) in the * memory. * * \param lun Logical Unit Number. * \param u32_nb_sector Pointer to the address of the last valid sector. * * \return Status. */ extern Ctrl_status mem_read_capacity(U8 lun, U32 *u32_nb_sector); /*! \brief Returns the size of the physical sector. * * \param lun Logical Unit Number. * * \return Sector size (unit: 512 bytes). */ extern U8 mem_sector_size(U8 lun); /*! \brief Returns the write-protection state of the memory. * * \param lun Logical Unit Number. * * \return \c TRUE if the memory is write-protected, else \c FALSE. * * \note Only used by removable memories with hardware-specific write * protection. */ extern Bool mem_wr_protect(U8 lun); /*! \brief Tells whether the memory is removable. * * \param lun Logical Unit Number. * * \return \c TRUE if the memory is removable, else \c FALSE. */ extern Bool mem_removal(U8 lun); /*! \brief Returns a pointer to the LUN name. * * \param lun Logical Unit Number. * * \return Pointer to the LUN name string. */ extern const char *mem_name(U8 lun); //! @} #if ACCESS_USB == ENABLED /*! \name MEM <-> USB Interface */ //! @{ /*! \brief Tranfers data from the memory to USB. * * \param lun Logical Unit Number. * \param addr Address of first memory sector to read. * \param nb_sector Number of sectors to transfer. * * \return Status. */ extern Ctrl_status memory_2_usb(U8 lun, U32 addr, U16 nb_sector); /*! \brief Tranfers data from USB to the memory. * * \param lun Logical Unit Number. * \param addr Address of first memory sector to write. * \param nb_sector Number of sectors to transfer. * * \return Status. */ extern Ctrl_status usb_2_memory(U8 lun, U32 addr, U16 nb_sector); //! @} #endif // ACCESS_USB == ENABLED #if ACCESS_MEM_TO_RAM == ENABLED /*! \name MEM <-> RAM Interface */ //! @{ /*! \brief Copies 1 data sector from the memory to RAM. * * \param lun Logical Unit Number. * \param addr Address of first memory sector to read. * \param ram Pointer to RAM buffer to write. * * \return Status. */ extern Ctrl_status memory_2_ram(U8 lun, U32 addr, void *ram); /*! \brief Copies 1 data sector from RAM to the memory. * * \param lun Logical Unit Number. * \param addr Address of first memory sector to write. * \param ram Pointer to RAM buffer to read. * * \return Status. */ extern Ctrl_status ram_2_memory(U8 lun, U32 addr, const void *ram); //! @} #endif // ACCESS_MEM_TO_RAM == ENABLED #if ACCESS_STREAM == ENABLED /*! \name Streaming MEM <-> MEM Interface */ //! @{ //! Erroneous streaming data transfer ID. #define ID_STREAM_ERR 0xFF #if ACCESS_MEM_TO_MEM == ENABLED /*! \brief Copies data from one memory to another. * * \param src_lun Source Logical Unit Number. * \param src_addr Source address of first memory sector to read. * \param dest_lun Destination Logical Unit Number. * \param dest_addr Destination address of first memory sector to write. * \param nb_sector Number of sectors to copy. * * \return Status. */ extern Ctrl_status stream_mem_to_mem(U8 src_lun, U32 src_addr, U8 dest_lun, U32 dest_addr, U16 nb_sector); #endif // ACCESS_MEM_TO_MEM == ENABLED /*! \brief Returns the state of a streaming data transfer. * * \param id Transfer ID. * * \return Status. * * \todo Implement. */ extern Ctrl_status stream_state(U8 id); /*! \brief Stops a streaming data transfer. * * \param id Transfer ID. * * \return Number of remaining sectors. * * \todo Implement. */ extern U16 stream_stop(U8 id); //! @} #endif // ACCESS_STREAM == ENABLED #endif // _CTRL_ACCESS_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Macros and functions dedicated to debug purposes. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a USART module can be used. * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "compiler.h" #include "debug.h" #include "util.h" #if (defined __GNUC__) # include "malloc.h" U32 get_heap_curr_used_size( void ) { struct mallinfo my_info=mallinfo(); return my_info.uordblks; } U32 get_heap_total_used_size( void ) { struct mallinfo my_info=mallinfo(); return my_info.arena; } #endif U32 get_heap_free_size( void ) { U32 high_mark= AVR32_SRAM_SIZE; U32 low_mark = 0; U32 size ; void* p_mem; size = (high_mark + low_mark)/2; do { p_mem = malloc(size); if( p_mem != NULL) { // Can allocate memory free(p_mem); low_mark = size; } else { // Can not allocate memory high_mark = size; } size = (high_mark + low_mark)/2; } while( (high_mark-low_mark) >1 ); return size; } static void* round_trace_pbuf; static U32 round_trace_size; void uc3_round_trace_init(void* buf, U32 size) { round_trace_pbuf = buf; (*(U32*)round_trace_pbuf)=(U32)buf+4; round_trace_size = size; } void uc3_round_trace(U32 val) { //Disable_global_interrupt(); U32* p_wr = (U32*)(*(U32*)round_trace_pbuf); *p_wr = val; p_wr++; if( ((U32)p_wr % round_trace_size) ==0 ) p_wr= (U32*)round_trace_pbuf+1; *p_wr = 0xdeadbeef; *(U32*)round_trace_pbuf = (U32)p_wr; //Enable_global_interrupt(); } void dump(char* _buf, uint16_t _count) { int i; for (i = 0; i < _count; ++i) { printk("0x%x ", _buf[i]); if ((i!=0)&&(i % 10 == 0)) printk("\n\t"); } printk("\n"); } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Macros and functions dedicated to debug purposes. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a USART module can be used. * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _DEBUG_H_ #define _DEBUG_H_ #include "stringz.h" /*! \brief These macros are used to add traces memory. * * First, initialise the trace with Uc3_trace_init(pointer), giving the start address * of the memory location where will be stored the trace. * Use Uc3_trace(something) to store "something" into the memory. The end of the trace * is signaled by the "0xdeadbeef" pattern. */ #define Uc3_trace_init(debug_addr) \ *(U32*)(debug_addr)=debug_addr+4 #define Uc3_trace(debug_addr, x) \ *(U32*)(*(U32*)(debug_addr) ) = (U32)(x) ;\ *(U32*)(*(U32*)(debug_addr)+4) = 0xdeadbeef ;\ *(U32*)(debug_addr ) = *(U32*)(debug_addr)+4 /*! \brief This macro is used to insert labels into assembly output. * */ #define Insert_label(name) \ __asm__ __volatile__ (STRINGZ(name)":"); #if (defined __GNUC__) /*! \brief Returns the number of total of used bytes allocated from the HEAP. * * \retval total number of used bytes. */ U32 get_heap_total_used_size( void ); /*! \brief Returns the number of bytes currently used from the HEAP. * * \retval total number of used bytes. */ U32 get_heap_curr_used_size( void ); #endif /*! \brief Returns the number of free bytes in the HEAP. * * This funtion tries to allocate the maximum number of bytes by dichotomical method. * * \retval number of free bytes. */ extern U32 get_heap_free_size( void ); /*! \name Traces function using a round buffer */ //! @{ /*! \brief Initialize the trace using a round buffer. * * \param buf Base address of the buffer used for the trace. * \param size Size of the round buffer. Must be a power of 2. */ void uc3_round_trace_init(void* buf, U32 size); /*! \brief Trace a data in the round buffer. * * The end of the trace is signaled by the "0xdeadbeef" pattern. * \param val Data to trace; */ void uc3_round_trace(U32 val); //! @} #endif // _DEBUG_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/print_funcs.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Strings and integers print module for debug purposes. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a USART module can be used. * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "compiler.h" #include "gpio.h" #include "usart.h" #include "print_funcs.h" //! ASCII representation of hexadecimal digits. static const char HEX_DIGITS[16] = "0123456789ABCDEF"; void init_dbg_rs232(long pba_hz) { init_dbg_rs232_ex(DBG_USART_BAUDRATE, pba_hz); } void init_dbg_rs232_ex(unsigned long baudrate, long pba_hz) { static const gpio_map_t DBG_USART_GPIO_MAP = { {DBG_USART_RX_PIN, DBG_USART_RX_FUNCTION}, {DBG_USART_TX_PIN, DBG_USART_TX_FUNCTION} }; // Options for debug USART. usart_options_t dbg_usart_options = { .baudrate = baudrate, .charlength = 8, .paritytype = USART_NO_PARITY, .stopbits = USART_1_STOPBIT, .channelmode = USART_NORMAL_CHMODE }; // Setup GPIO for debug USART. gpio_enable_module(DBG_USART_GPIO_MAP, sizeof(DBG_USART_GPIO_MAP) / sizeof(DBG_USART_GPIO_MAP[0])); // Initialize it in RS232 mode. usart_init_rs232(DBG_USART, &dbg_usart_options, pba_hz); } void print_dbg(const char *str) { // Redirection to the debug USART. print(DBG_USART, str); } void print_dbg_char(int c) { // Redirection to the debug USART. print_char(DBG_USART, c); } void print_dbg_ulong(unsigned long n) { // Redirection to the debug USART. print_ulong(DBG_USART, n); } void print_dbg_char_hex(unsigned char n) { // Redirection to the debug USART. print_char_hex(DBG_USART, n); } void print_dbg_short_hex(unsigned short n) { // Redirection to the debug USART. print_short_hex(DBG_USART, n); } void print_dbg_hex(unsigned long n) { // Redirection to the debug USART. print_hex(DBG_USART, n); } void print(volatile avr32_usart_t *usart, const char *str) { // Invoke the USART driver to transmit the input string with the given USART. usart_write_line(usart, str); } void print_char(volatile avr32_usart_t *usart, int c) { // Invoke the USART driver to transmit the input character with the given USART. usart_putchar(usart, c); } void print_ulong(volatile avr32_usart_t *usart, unsigned long n) { char tmp[11]; int i = sizeof(tmp) - 1; // Convert the given number to an ASCII decimal representation. tmp[i] = '\0'; do { tmp[--i] = '0' + n % 10; n /= 10; } while (n); // Transmit the resulting string with the given USART. print(usart, tmp + i); } void print_char_hex(volatile avr32_usart_t *usart, unsigned char n) { char tmp[3]; int i; // Convert the given number to an ASCII hexadecimal representation. tmp[2] = '\0'; for (i = 1; i >= 0; i--) { tmp[i] = HEX_DIGITS[n & 0xF]; n >>= 4; } // Transmit the resulting string with the given USART. print(usart, tmp); } void print_short_hex(volatile avr32_usart_t *usart, unsigned short n) { char tmp[5]; int i; // Convert the given number to an ASCII hexadecimal representation. tmp[4] = '\0'; for (i = 3; i >= 0; i--) { tmp[i] = HEX_DIGITS[n & 0xF]; n >>= 4; } // Transmit the resulting string with the given USART. print(usart, tmp); } void print_hex(volatile avr32_usart_t *usart, unsigned long n) { char tmp[9]; int i; // Convert the given number to an ASCII hexadecimal representation. tmp[8] = '\0'; for (i = 7; i >= 0; i--) { tmp[i] = HEX_DIGITS[n & 0xF]; n >>= 4; } // Transmit the resulting string with the given USART. print(usart, tmp); } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/print_funcs.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Strings and integers print module for debug purposes. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a USART module can be used. * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _PRINT_FUNCS_H_ #define _PRINT_FUNCS_H_ #include #include "board.h" /*! \name USART Settings for the Debug Module */ //! @{ #if BOARD == EVK1100 # define DBG_USART (&AVR32_USART1) # define DBG_USART_RX_PIN AVR32_USART1_RXD_0_0_PIN # define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_0_FUNCTION # define DBG_USART_TX_PIN AVR32_USART1_TXD_0_0_PIN # define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_0_FUNCTION # define DBG_USART_BAUDRATE 57600 #elif BOARD == EVK1101 # define DBG_USART (&AVR32_USART1) # define DBG_USART_RX_PIN AVR32_USART1_RXD_0_0_PIN # define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_0_FUNCTION # define DBG_USART_TX_PIN AVR32_USART1_TXD_0_0_PIN # define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_0_FUNCTION # define DBG_USART_BAUDRATE 57600 #elif BOARD == UC3C_EK # define DBG_USART (&AVR32_USART2) # define DBG_USART_RX_PIN AVR32_USART2_RXD_0_1_PIN # define DBG_USART_RX_FUNCTION AVR32_USART2_RXD_0_1_FUNCTION # define DBG_USART_TX_PIN AVR32_USART2_TXD_0_1_PIN # define DBG_USART_TX_FUNCTION AVR32_USART2_TXD_0_1_FUNCTION # define DBG_USART_BAUDRATE 57600 #elif BOARD == EVK1104 # define DBG_USART (&AVR32_USART1) # define DBG_USART_RX_PIN AVR32_USART1_RXD_0_0_PIN # define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_0_FUNCTION # define DBG_USART_TX_PIN AVR32_USART1_TXD_0_0_PIN # define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_0_FUNCTION # define DBG_USART_BAUDRATE 57600 #elif BOARD == EVK1105 # define DBG_USART (&AVR32_USART0) # define DBG_USART_RX_PIN AVR32_USART0_RXD_0_0_PIN # define DBG_USART_RX_FUNCTION AVR32_USART0_RXD_0_0_FUNCTION # define DBG_USART_TX_PIN AVR32_USART0_TXD_0_0_PIN # define DBG_USART_TX_FUNCTION AVR32_USART0_TXD_0_0_FUNCTION # define DBG_USART_BAUDRATE 57600 #elif BOARD == STK1000 # define DBG_USART (&AVR32_USART1) # define DBG_USART_RX_PIN AVR32_USART1_RXD_0_PIN # define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_FUNCTION # define DBG_USART_TX_PIN AVR32_USART1_TXD_0_PIN # define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_FUNCTION # define DBG_USART_BAUDRATE 115200 #elif BOARD == NGW100 # define DBG_USART (&AVR32_USART1) # define DBG_USART_RX_PIN AVR32_USART1_RXD_0_PIN # define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_FUNCTION # define DBG_USART_TX_PIN AVR32_USART1_TXD_0_PIN # define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_FUNCTION # define DBG_USART_BAUDRATE 115200 #elif BOARD == STK600_RCUC3L0 # define DBG_USART (&AVR32_USART1) # define DBG_USART_RX_PIN AVR32_USART1_RXD_0_1_PIN # define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_1_FUNCTION // For the RX pin, connect STK600.PORTE.PE3 to STK600.RS232 SPARE.RXD # define DBG_USART_TX_PIN AVR32_USART1_TXD_0_1_PIN # define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_1_FUNCTION // For the TX pin, connect STK600.PORTE.PE2 to STK600.RS232 SPARE.TXD # define DBG_USART_BAUDRATE 57600 # define DBG_USART_CLOCK_MASK AVR32_USART1_CLK_PBA #elif BOARD == UC3L_EK # define DBG_USART (&AVR32_USART3) # define DBG_USART_RX_PIN AVR32_USART3_RXD_0_0_PIN # define DBG_USART_RX_FUNCTION AVR32_USART3_RXD_0_0_FUNCTION # define DBG_USART_TX_PIN AVR32_USART3_TXD_0_0_PIN # define DBG_USART_TX_FUNCTION AVR32_USART3_TXD_0_0_FUNCTION # define DBG_USART_BAUDRATE 57600 # define DBG_USART_CLOCK_MASK AVR32_USART3_CLK_PBA #elif BOARD == ARDUINO # define DBG_USART (&AVR32_USART1) # define DBG_USART_RX_PIN AVR32_USART1_RXD_0_0_PIN # define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_0_FUNCTION # define DBG_USART_TX_PIN AVR32_USART1_TXD_0_0_PIN # define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_0_FUNCTION # define DBG_USART_BAUDRATE 57600 # define DBG_USART_CLOCK_MASK AVR32_USART1_CLK_PBA #endif #if !defined(DBG_USART) || \ !defined(DBG_USART_RX_PIN) || \ !defined(DBG_USART_RX_FUNCTION) || \ !defined(DBG_USART_TX_PIN) || \ !defined(DBG_USART_TX_FUNCTION) || \ !defined(DBG_USART_BAUDRATE) # error The USART configuration to use for debug on your board is missing #endif //! @} /*! \name VT100 Common Commands */ //! @{ #define CLEARSCR "\x1B[2J\x1B[;H" //!< Clear screen. #define CLEAREOL "\x1B[K" //!< Clear end of line. #define CLEAREOS "\x1B[J" //!< Clear end of screen. #define CLEARLCR "\x1B[0K" //!< Clear line cursor right. #define CLEARLCL "\x1B[1K" //!< Clear line cursor left. #define CLEARELN "\x1B[2K" //!< Clear entire line. #define CLEARCDW "\x1B[0J" //!< Clear cursor down. #define CLEARCUP "\x1B[1J" //!< Clear cursor up. #define GOTOYX "\x1B[%.2d;%.2dH" //!< Set cursor to (y, x). #define INSERTMOD "\x1B[4h" //!< Insert mode. #define OVERWRITEMOD "\x1B[4l" //!< Overwrite mode. #define DELAFCURSOR "\x1B[K" //!< Erase from cursor to end of line. #define CRLF "\r\n" //!< Carriage Return + Line Feed. //! @} /*! \name VT100 Cursor Commands */ //! @{ #define CURSON "\x1B[?25h" //!< Show cursor. #define CURSOFF "\x1B[?25l" //!< Hide cursor. //! @} /*! \name VT100 Character Commands */ //! @{ #define NORMAL "\x1B[0m" //!< Normal. #define BOLD "\x1B[1m" //!< Bold. #define UNDERLINE "\x1B[4m" //!< Underline. #define BLINKING "\x1B[5m" //!< Blink. #define INVVIDEO "\x1B[7m" //!< Inverse video. //! @} /*! \name VT100 Color Commands */ //! @{ #define CL_BLACK "\033[22;30m" //!< Black. #define CL_RED "\033[22;31m" //!< Red. #define CL_GREEN "\033[22;32m" //!< Green. #define CL_BROWN "\033[22;33m" //!< Brown. #define CL_BLUE "\033[22;34m" //!< Blue. #define CL_MAGENTA "\033[22;35m" //!< Magenta. #define CL_CYAN "\033[22;36m" //!< Cyan. #define CL_GRAY "\033[22;37m" //!< Gray. #define CL_DARKGRAY "\033[01;30m" //!< Dark gray. #define CL_LIGHTRED "\033[01;31m" //!< Light red. #define CL_LIGHTGREEN "\033[01;32m" //!< Light green. #define CL_YELLOW "\033[01;33m" //!< Yellow. #define CL_LIGHTBLUE "\033[01;34m" //!< Light blue. #define CL_LIGHTMAGENTA "\033[01;35m" //!< Light magenta. #define CL_LIGHTCYAN "\033[01;36m" //!< Light cyan. #define CL_WHITE "\033[01;37m" //!< White. //! @} /*! \brief Sets up DBG_USART with 8N1 at DBG_USART_BAUDRATE. * * \param pba_hz PBA clock frequency (Hz). */ extern void init_dbg_rs232(long pba_hz); /*! \brief Sets up DBG_USART with 8N1 at a given baud rate. * * \param baudrate Baud rate to set DBG_USART to. * \param pba_hz PBA clock frequency (Hz). */ extern void init_dbg_rs232_ex(unsigned long baudrate, long pba_hz); /*! \brief Prints a string of characters to DBG_USART. * * \param str The string of characters to print. */ extern void print_dbg(const char *str); /*! \brief Prints a character to DBG_USART. * * \param c The character to print. */ extern void print_dbg_char(int c); /*! \brief Prints an integer to DBG_USART in a decimal representation. * * \param n The integer to print. */ extern void print_dbg_ulong(unsigned long n); /*! \brief Prints a char to DBG_USART in an hexadecimal representation. * * \param n The char to print. */ extern void print_dbg_char_hex(unsigned char n); /*! \brief Prints a short integer to DBG_USART in an hexadecimal representation. * * \param n The short integer to print. */ extern void print_dbg_short_hex(unsigned short n); /*! \brief Prints an integer to DBG_USART in an hexadecimal representation. * * \param n The integer to print. */ extern void print_dbg_hex(unsigned long n); /*! \brief Prints a string of characters to a given USART. * * \param usart Base address of the USART instance to print to. * \param str The string of characters to print. */ extern void print(volatile avr32_usart_t *usart, const char *str); /*! \brief Prints a character to a given USART. * * \param usart Base address of the USART instance to print to. * \param c The character to print. */ extern void print_char(volatile avr32_usart_t *usart, int c); /*! \brief Prints an integer to a given USART in a decimal representation. * * \param usart Base address of the USART instance to print to. * \param n The integer to print. */ extern void print_ulong(volatile avr32_usart_t *usart, unsigned long n); /*! \brief Prints a char to a given USART in an hexadecimal representation. * * \param usart Base address of the USART instance to print to. * \param n The char to print. */ extern void print_char_hex(volatile avr32_usart_t *usart, unsigned char n); /*! \brief Prints a short integer to a given USART in an hexadecimal * representation. * * \param usart Base address of the USART instance to print to. * \param n The short integer to print. */ extern void print_short_hex(volatile avr32_usart_t *usart, unsigned short n); /*! \brief Prints an integer to a given USART in an hexadecimal representation. * * \param usart Base address of the USART instance to print to. * \param n The integer to print. */ extern void print_hex(volatile avr32_usart_t *usart, unsigned long n); #endif // _PRINT_FUNCS_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_cpu.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief NEWLIB_ADDONS CPU include file for AVR32. * * - Compiler: GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef __AVR32_NEWLIB_ADDONS_CPU_H__ #define __AVR32_NEWLIB_ADDONS_CPU_H__ #include <_ansi.h> _BEGIN_STD_C #define CPU_HZ get_cpu_hz() void udelay(unsigned long usec); void set_cpu_hz(unsigned int clk_hz); unsigned int get_cpu_hz(); _END_STD_C #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_exceptions.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief NEWLIB_ADDONS exceptions include file for AVR32. * * - Compiler: GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef __AVR32_NEWLIB_ADDONS_EXCEPTIONS_H__ #define __AVR32_NEWLIB_ADDONS_EXCEPTIONS_H__ #include <_ansi.h> _BEGIN_STD_C /* Exception vector offsets */ #define EVBA_UNRECOVERABLE 0x000 #define EVBA_TLB_MULTIPLE 0x004 #define EVBA_BUS_ERROR_DATA 0x008 #define EVBA_BUS_ERROR_INSTR 0x00C #define EVBA_NMI 0x010 #define EVBA_INSTR_ADDR 0x014 #define EVBA_ITLB_MISS 0x050 #define EVBA_ITLB_PROT 0x018 #define EVBA_BREAKPOINT 0x01C #define EVBA_ILLEGAL_OPCODE 0x020 #define EVBA_UNIMPLEMENTED 0x024 #define EVBA_PRIVILEGE_VIOL 0x028 #define EVBA_FLOATING_POINT 0x02C #define EVBA_COP_ABSENT 0x030 #define EVBA_SCALL 0x100 #define EVBA_DATA_ADDR_R 0x034 #define EVBA_DATA_ADDR_W 0x038 #define EVBA_DTLB_MISS_R 0x060 #define EVBA_DTLB_MISS_W 0x070 #define EVBA_DTLB_PROT_R 0x03C #define EVBA_DTLB_PROT_W 0x040 #define EVBA_DTLB_MODIFIED 0x044 /* Define the form of the function used when registering exceptions. The function should return the address which the exception should return to after the exception processing. */ typedef unsigned int (*__exception_handler)(int /*evba_offset*/, int /*return address*/); /* Define the form of the function used when registering a scall handler. */ typedef void (*__scall_handler)(int /*code*/, int /*p1*/, int /*p2*/ , int /*p3*/, int /*p4*/); /* Function for registering an exception handler for the exception with offset given by evba_offset. */ void _register_exception_handler(__exception_handler handler, int evba_offset); /* Function for registering a scall handler which can be a arbirary function which uses r8-r12 for parameters. */ void _register_scall_handler(__scall_handler handler); /* Initialize exceptions. Must be called before registering exception handlers and needed to enable exceptions. 'evba' is the pointer to the exception vector. 'handler_table' is a pointer to an array where the pointers to the exception handlers are stored. This array must be at least 0x104 bytes and word aligned. */ void init_exceptions(void *evba, void *handler_table); _END_STD_C #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_interrupts.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief NEWLIB_ADDONS interrupts include file for AVR32. * * - Compiler: GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef __AVR32_NEWLIB_ADDONS_INTERRUPTS_H__ #define __AVR32_NEWLIB_ADDONS_INTERRUPTS_H__ #include <_ansi.h> _BEGIN_STD_C #define INT_GRPS 64 #define INT_LINES 32 #define INTPR_BASE (__intc_base__ + 0x0000) #define INTREQ_BASE (__intc_base__ + 64*4) #define INTCAUSE_BASE (__intc_base__ + 2*64*4) //Register offsets #define INTLEVEL 30 #define AUTOVECTOR 0 #define AUTOVECTOR_BITS 14 //Priorities #define INT0 0 #define INT1 1 #define INT2 2 #define INT3 3 typedef void (*__newlib_int_handler)(int /* int_grp*/, void */*user_handle*/); __newlib_int_handler register_interrupt(__newlib_int_handler handler, int int_grp, int line, int priority, .../* void *user_handle*/); void init_interrupts(); void set_interrupts_base(void *base); _END_STD_C #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_io.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief NEWLIB_ADDONS miscellaneous macros include file for AVR32. * * - Compiler: GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef __AVR32_NEWLIB_ADDONS_IO_H__ #define __AVR32_NEWLIB_ADDONS_IO_H__ #include <_ansi.h> _BEGIN_STD_C typedef char u8; typedef unsigned int u32; #define __raw_writeb(v,a) (*(volatile unsigned char *)(a) = (v)) #define __raw_writew(v,a) (*(volatile unsigned short *)(a) = (v)) #define __raw_writel(v,a) (*(volatile unsigned int *)(a) = (v)) #define __raw_readb(a) (*(volatile unsigned char *)(a)) #define __raw_readw(a) (*(volatile unsigned short *)(a)) #define __raw_readl(a) (*(volatile unsigned int *)(a)) /* As long as I/O is only performed in P4 (or possibly P3), we're safe */ #define writeb(v,a) __raw_writeb(v,a) #define writew(v,a) __raw_writew(v,a) #define writel(v,a) __raw_writel(v,a) #define readb(a) __raw_readb(a) #define readw(a) __raw_readw(a) #define readl(a) __raw_readl(a) /* Memory segments when segmentation is enabled */ #define P0SEG 0x00000000 #define P1SEG 0x80000000 #define P2SEG 0xa0000000 #define P3SEG 0xc0000000 #define P4SEG 0xe0000000 /* Returns the privileged segment base of a given address */ #define PXSEG(a) (((unsigned long)(a)) & 0xe0000000) /* Returns the physical address of a PnSEG (n=1,2) address */ #define PHYSADDR(a) (((unsigned long)(a)) & 0x1fffffff) /* * Map an address to a certain privileged segment */ #define P1SEGADDR(a) ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P1SEG)) #define P2SEGADDR(a) ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P2SEG)) #define P3SEGADDR(a) ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P3SEG)) #define P4SEGADDR(a) ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P4SEG)) #define cached(addr) P1SEGADDR(addr) #define uncached(addr) P2SEGADDR(addr) #define physaddr(addr) PHYSADDR(addr) #define BF(field, value) \ ({ union { \ struct { \ unsigned : 32 - field ## _OFFSET - field ## _SIZE ; \ unsigned long __val: field ## _SIZE ; \ }; \ unsigned long __ul; \ } __tmp; \ __tmp.__ul = 0; \ __tmp.__val = value; \ __tmp.__ul;}) #define BF_D(field, value) \ ({ union { \ struct { \ unsigned long long : 64 - field ## _OFFSET - field ## _SIZE ; \ unsigned long long __val: field ## _SIZE ; \ }; \ unsigned long long __ul; \ } __tmp; \ __tmp.__ul = 0; \ __tmp.__val = value; \ __tmp.__ul;}) #define BFINS(var, field, value) \ { union {\ struct { \ unsigned : 32 - field ## _OFFSET - field ## _SIZE ; \ unsigned long __val: field ## _SIZE ; \ }; \ unsigned long __ul; \ } __tmp; \ __tmp.__ul = var; \ __tmp.__val = value; \ var = __tmp.__ul;} #define BFEXT(var, field) \ ({ union {\ struct { \ unsigned : 32 - field ## _OFFSET - field ## _SIZE ; \ unsigned long __val: field ## _SIZE ; \ }; \ unsigned long __ul; \ } __tmp; \ __tmp.__ul = var; \ __tmp.__val; }) #define BFINS_D(var, field, value) \ { union {\ struct { \ unsigned long long : 64 - field ## _OFFSET - field ## _SIZE ; \ unsigned long long __val: field ## _SIZE ; \ }; \ unsigned long long __ul; \ } __tmp; \ __tmp.__ul = var; \ __tmp.__val = value; \ var = __tmp.__ul;} #define BFEXT_D(var, field) \ ({ union {\ struct { \ unsigned long long : 64 - field ## _OFFSET - field ## _SIZE ; \ unsigned long long __val: field ## _SIZE ; \ }; \ unsigned long long __ul; \ } __tmp; \ __tmp.__ul = var; \ __tmp.__val; }) _END_STD_C #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_usart.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief NEWLIB_ADDONS USART include file for AVR32. * * - Compiler: GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef __AVR32_NEWLIB_ADDONS_USART_H__ #define __AVR32_NEWLIB_ADDONS_USART_H__ #include <_ansi.h> #include "nlao_io.h" _BEGIN_STD_C struct usart3 { volatile u32 us_cr; volatile u32 us_mr; volatile u32 us_ier; volatile u32 us_idr; volatile u32 us_imr; volatile u32 us_csr; volatile u32 us_rhr; volatile u32 us_thr; volatile u32 us_brgr; volatile u32 us_rtor; volatile u32 us_ttgr; volatile u32 us_reserved[5]; volatile u32 us_fidi; volatile u32 us_ner; volatile u32 us_xxr; volatile u32 us_if; }; /* Register offsets */ #define US_CR 0x0000 #define US_MR 0x0004 #define US_IER 0x0008 #define US_IDR 0x000c #define US_IMR 0x0010 #define US_CSR 0x0014 #define US_RHR 0x0018 #define US_THR 0x001c #define US_BRGR 0x0020 #define US_RTOR 0x0024 #define US_TTGR 0x0028 #define US_FIDI 0x0040 #define US_NER 0x0044 #define US_XXR 0x0048 #define US_IF 0x004c #define US_RPR 0x0100 #define US_RCR 0x0104 #define US_TPR 0x0108 #define US_TCR 0x010c #define US_RNPR 0x0110 #define US_RNCR 0x0114 #define US_TNPR 0x0118 #define US_TNCR 0x011c #define US_PTCR 0x0120 #define US_PTSR 0x0124 /* USART3 Control Register */ #define US_CR_RSTRX (1 << 2) #define US_CR_RSTTX (1 << 3) #define US_CR_RXEN (1 << 4) #define US_CR_RXDIS (1 << 5) #define US_CR_TXEN (1 << 6) #define US_CR_TXDIS (1 << 7) #define US_CR_RSTSTA (1 << 8) #define US_CR_STTBRK (1 << 9) #define US_CR_STPBRK (1 << 10) #define US_CR_DTREN (1 << 16) #define US_CR_DTRDIS (1 << 17) #define US_CR_RTSEN (1 << 18) #define US_CR_RTSDIS (1 << 19) /* USART3 Mode Register */ #define US_MR_MODE (15 << 0) #define US_MR_MODE_NORMAL ( 0 << 0) #define US_MR_MODE_HWFLOW ( 2 << 0) #define US_MR_CLKS ( 3 << 4) #define US_MR_CLKS_CLOCK ( 0 << 4) #define US_MR_CLKS_FDIV1 ( 1 << 4) #define US_MR_CLKS_SLOW ( 2 << 4) #define US_MR_CLKS_EXT ( 3 << 4) #define US_MR_CHRL_5BITS ( 0 << 6) #define US_MR_CHRL_6BITS ( 1 << 6) #define US_MR_CHRL_7BITS ( 2 << 6) #define US_MR_CHRL_8BITS ( 3 << 6) #define US_MR_SYNC ( 1 << 8) #define US_MR_PAR_EVEN ( 0 << 9) #define US_MR_PAR_ODD ( 1 << 9) #define US_MR_PAR_SPACE ( 2 << 9) #define US_MR_PAR_MARK ( 3 << 9) #define US_MR_PAR_NONE ( 4 << 9) #define US_MR_PAR_MDROP ( 6 << 9) #define US_MR_NBSTOP_1BIT ( 0 << 12) #define US_MR_NBSTOP_1_5BIT ( 1 << 12) #define US_MR_NBSTOP_2BITS ( 2 << 12) #define US_MR_OVER ( 1 << 19) #define US_MR_OVER_X16 ( 0 << 19) #define US_MR_OVER_X8 ( 1 << 19) /* USART3 Channel Status Register */ #define US_CSR_RXRDY (1 << 0) #define US_CSR_TXRDY (1 << 1) #define US_CSR_RXBRK (1 << 2) #define US_CSR_ENDRX (1 << 3) #define US_CSR_ENDTX (1 << 4) #define US_CSR_OVRE (1 << 5) #define US_CSR_FRAME (1 << 6) #define US_CSR_PARE (1 << 7) #define US_CSR_TXEMPTY (1 << 9) #define US_CSR_TXBUFE (1 << 11) #define US_CSR_RXBUFF (1 << 12) #define US_CSR_RIIC (1 << 16) #define US_CSR_DSRIC (1 << 17) #define US_CSR_DCDIC (1 << 18) #define US_CSR_CTSIC (1 << 19) #define US_CSR_RI (1 << 20) #define US_CSR_DSR (1 << 21) #define US_CSR_DCD (1 << 22) #define US_CSR_CTS (1 << 23) /* USART3 Baud Rate Generator Register */ #define US_BRGR_CD_OFFSET 0 #define US_BRGR_FP_OFFSET 16 #define US_BRGR_CD_SIZE 16 #define US_BRGR_FP_SIZE 3 #define US_BRGR_CD (0xFFFF << 0) #define US_BRGR_FP ( 7 << 16) /*USART3 PDC Transfer Control Register */ #define US_PTCR_RXTEN (1 << 0) #define US_PTCR_RXTDIS (1 << 1) #define US_PTCR_TXTEN (1 << 8) #define US_PTCR_TXTDIS (1 << 9) /*USART3 PDC Transfer Status Register */ #define US_PTSR_RXTEN (1 << 0) #define US_PTSR_TXTEN (1 << 8) int usart_init(int baudrate); void usart_putc(char c); void usart_puts(const char *s); int usart_getc(void); int usart_tstc(void); void usart_setbrg(int baudrate, int cpu_clock); void set_usart_base(void *usart_base); _END_STD_C #endif /* MERLIN_USART3_H */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LINKER_SCRIPTS/AT32UC3A/0512/GCC/link_uc3a0512.lds ================================================ /****************************************************************************** * AVR32 AT32UC3A0512 GNU LD script file. * * - Compiler: GNU GCC for AVR32 * - Supported devices: AVR32 AT32UC3A0512 * * - author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ OUTPUT_FORMAT("elf32-avr32", "elf32-avr32", "elf32-avr32") OUTPUT_ARCH(avr32:uc) ENTRY(_start) MEMORY { FLASH (rxai!w) : ORIGIN = 0x80000000, LENGTH = 0x00080000 INTRAM (wxa!ri) : ORIGIN = 0x00000004, LENGTH = 0x0000FFFC USERPAGE : ORIGIN = 0x80800000, LENGTH = 0x00000200 } PHDRS { FLASH PT_LOAD; INTRAM_ALIGN PT_NULL; INTRAM_AT_FLASH PT_LOAD; INTRAM PT_NULL; USERPAGE PT_LOAD; } SECTIONS { /* If this heap size is selected, all the INTRAM space from the end of the data area to the beginning of the stack will be allocated for the heap. */ __max_heap_size__ = -1; /* Use a default heap size if heap size was not defined. */ __heap_size__ = DEFINED(__heap_size__) ? __heap_size__ : __max_heap_size__; /* Use a default stack size if stack size was not defined. */ __stack_size__ = DEFINED(__stack_size__) ? __stack_size__ : 4K; /* Read-only sections, merged into text segment: */ PROVIDE (__executable_start = 0x80000000); . = 0x80000000; .interp : { *(.interp) } >FLASH AT>FLASH :FLASH .reset : { *(.reset) } >FLASH AT>FLASH :FLASH .hash : { *(.hash) } >FLASH AT>FLASH :FLASH .dynsym : { *(.dynsym) } >FLASH AT>FLASH :FLASH .dynstr : { *(.dynstr) } >FLASH AT>FLASH :FLASH .gnu.version : { *(.gnu.version) } >FLASH AT>FLASH :FLASH .gnu.version_d : { *(.gnu.version_d) } >FLASH AT>FLASH :FLASH .gnu.version_r : { *(.gnu.version_r) } >FLASH AT>FLASH :FLASH .rel.init : { *(.rel.init) } >FLASH AT>FLASH :FLASH .rela.init : { *(.rela.init) } >FLASH AT>FLASH :FLASH .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } >FLASH AT>FLASH :FLASH .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } >FLASH AT>FLASH :FLASH .rel.fini : { *(.rel.fini) } >FLASH AT>FLASH :FLASH .rela.fini : { *(.rela.fini) } >FLASH AT>FLASH :FLASH .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH .rel.data.rel.ro : { *(.rel.data.rel.ro*) } >FLASH AT>FLASH :FLASH .rela.data.rel.ro : { *(.rel.data.rel.ro*) } >FLASH AT>FLASH :FLASH .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } >FLASH AT>FLASH :FLASH .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } >FLASH AT>FLASH :FLASH .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } >FLASH AT>FLASH :FLASH .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } >FLASH AT>FLASH :FLASH .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } >FLASH AT>FLASH :FLASH .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } >FLASH AT>FLASH :FLASH .rel.ctors : { *(.rel.ctors) } >FLASH AT>FLASH :FLASH .rela.ctors : { *(.rela.ctors) } >FLASH AT>FLASH :FLASH .rel.dtors : { *(.rel.dtors) } >FLASH AT>FLASH :FLASH .rela.dtors : { *(.rela.dtors) } >FLASH AT>FLASH :FLASH .rel.got : { *(.rel.got) } >FLASH AT>FLASH :FLASH .rela.got : { *(.rela.got) } >FLASH AT>FLASH :FLASH .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } >FLASH AT>FLASH :FLASH .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } >FLASH AT>FLASH :FLASH .rel.plt : { *(.rel.plt) } >FLASH AT>FLASH :FLASH .rela.plt : { *(.rela.plt) } >FLASH AT>FLASH :FLASH .init : { KEEP (*(.init)) } >FLASH AT>FLASH :FLASH =0xd703d703 .plt : { *(.plt) } >FLASH AT>FLASH :FLASH .text : { *(.text .stub .text.* .gnu.linkonce.t.*) KEEP (*(.text.*personality*)) /* .gnu.warning sections are handled specially by elf32.em. */ *(.gnu.warning) } >FLASH AT>FLASH :FLASH =0xd703d703 .fini : { KEEP (*(.fini)) } >FLASH AT>FLASH :FLASH =0xd703d703 PROVIDE (__etext = .); PROVIDE (_etext = .); PROVIDE (etext = .); .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH .rodata1 : { *(.rodata1) } >FLASH AT>FLASH :FLASH .eh_frame_hdr : { *(.eh_frame_hdr) } >FLASH AT>FLASH :FLASH .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } >FLASH AT>FLASH :FLASH .gcc_except_table : ONLY_IF_RO { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) } >FLASH AT>FLASH :FLASH .lalign : { . = ALIGN(8); PROVIDE(_data_lma = .); } >FLASH AT>FLASH :FLASH . = ORIGIN(INTRAM); .dalign : { . = ALIGN(8); PROVIDE(_data = .); } >INTRAM AT>INTRAM :INTRAM_ALIGN /* Exception handling */ .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .gcc_except_table : ONLY_IF_RW { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH /* Thread Local Storage sections */ .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } >INTRAM AT>FLASH :INTRAM_AT_FLASH /* Ensure the __preinit_array_start label is properly aligned. We could instead move the label definition inside the section, but the linker would then create the section even if it turns out to be empty, which isn't pretty. */ PROVIDE (__preinit_array_start = ALIGN(32 / 8)); .preinit_array : { KEEP (*(.preinit_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH PROVIDE (__preinit_array_end = .); PROVIDE (__init_array_start = .); .init_array : { KEEP (*(.init_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH PROVIDE (__init_array_end = .); PROVIDE (__fini_array_start = .); .fini_array : { KEEP (*(.fini_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH PROVIDE (__fini_array_end = .); .ctors : { /* gcc uses crtbegin.o to find the start of the constructors, so we make sure it is first. Because this is a wildcard, it doesn't matter if the user does not actually link against crtbegin.o; the linker won't look for a file to match a wildcard. The wildcard also means that it doesn't matter which directory crtbegin.o is in. */ KEEP (*crtbegin*.o(.ctors)) /* We don't want to include the .ctor section from from the crtend.o file until after the sorted ctors. The .ctor section from the crtend file contains the end of ctors marker and it must be last */ KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors)) KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .dtors : { KEEP (*crtbegin*.o(.dtors)) KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors)) KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .jcr : { KEEP (*(.jcr)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .data.rel.ro : { *(.data.rel.ro.local) *(.data.rel.ro*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .dynamic : { *(.dynamic) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .got : { *(.got.plt) *(.got) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .ramtext : { *(.ramtext .ramtext.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .ddalign : { . = ALIGN(8); } >INTRAM AT>FLASH :INTRAM_AT_FLASH .data : { *(.data .data.* .gnu.linkonce.d.*) KEEP (*(.gnu.linkonce.d.*personality*)) SORT(CONSTRUCTORS) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .data1 : { *(.data1) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .balign : { . = ALIGN(8); PROVIDE(_edata = .); } >INTRAM AT>FLASH :INTRAM_AT_FLASH PROVIDE (edata = .); __bss_start = .; .bss : { *(.dynbss) *(.bss .bss.* .gnu.linkonce.b.*) *(COMMON) /* Align here to ensure that the .bss section occupies space up to _end. Align after .bss to ensure correct alignment even if the .bss section disappears because there are no input sections. */ . = ALIGN(8); } >INTRAM AT>INTRAM :INTRAM . = ALIGN(8); _end = .; PROVIDE (end = .); __heap_start__ = ALIGN(8); .heap : { *(.heap) . = (__heap_size__ == __max_heap_size__) ? ORIGIN(INTRAM) + LENGTH(INTRAM) - __stack_size__ - ABSOLUTE(.) : __heap_size__; } >INTRAM AT>INTRAM :INTRAM __heap_end__ = .; /* Stabs debugging sections. */ .stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } .stab.excl 0 : { *(.stab.excl) } .stab.exclstr 0 : { *(.stab.exclstr) } .stab.index 0 : { *(.stab.index) } .stab.indexstr 0 : { *(.stab.indexstr) } .comment 0 : { *(.comment) } /* DWARF debug sections. Symbols in the DWARF debugging sections are relative to the beginning of the section so we begin them at 0. */ /* DWARF 1 */ .debug 0 : { *(.debug) } .line 0 : { *(.line) } /* GNU DWARF 1 extensions */ .debug_srcinfo 0 : { *(.debug_srcinfo) } .debug_sfnames 0 : { *(.debug_sfnames) } /* DWARF 1.1 and DWARF 2 */ .debug_aranges 0 : { *(.debug_aranges) } .debug_pubnames 0 : { *(.debug_pubnames) } /* DWARF 2 */ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } .debug_abbrev 0 : { *(.debug_abbrev) } .debug_line 0 : { *(.debug_line) } .debug_frame 0 : { *(.debug_frame) } .debug_str 0 : { *(.debug_str) } .debug_loc 0 : { *(.debug_loc) } .debug_macinfo 0 : { *(.debug_macinfo) } /* SGI/MIPS DWARF 2 extensions */ .debug_weaknames 0 : { *(.debug_weaknames) } .debug_funcnames 0 : { *(.debug_funcnames) } .debug_typenames 0 : { *(.debug_typenames) } .debug_varnames 0 : { *(.debug_varnames) } .stack ORIGIN(INTRAM) + LENGTH(INTRAM) - __stack_size__ : { _stack = .; *(.stack) . = __stack_size__; _estack = .; } >INTRAM AT>INTRAM :INTRAM .userpage : { *(.userpage .userpage.*) } >USERPAGE AT>USERPAGE :USERPAGE /DISCARD/ : { *(.note.GNU-stack) } } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LINKER_SCRIPTS/AT32UC3A/1256/GCC/link_uc3a1256.lds ================================================ /****************************************************************************** * AVR32 AT32UC3A1256 GNU LD script file. * * - Compiler: GNU GCC for AVR32 * - Supported devices: AVR32 AT32UC3A1256 * * - author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ OUTPUT_FORMAT("elf32-avr32", "elf32-avr32", "elf32-avr32") OUTPUT_ARCH(avr32:uc) ENTRY(_start) MEMORY { FLASH (rxai!w) : ORIGIN = 0x80000000, LENGTH = 0x00040000 INTRAM (wxa!ri) : ORIGIN = 0x00000004, LENGTH = 0x0000FFFC USERPAGE : ORIGIN = 0x80800000, LENGTH = 0x00000200 } PHDRS { FLASH PT_LOAD; INTRAM_ALIGN PT_NULL; INTRAM_AT_FLASH PT_LOAD; INTRAM PT_NULL; USERPAGE PT_LOAD; } SECTIONS { /* If this heap size is selected, all the INTRAM space from the end of the data area to the beginning of the stack will be allocated for the heap. */ __max_heap_size__ = -1; /* Use a default heap size if heap size was not defined. */ __heap_size__ = DEFINED(__heap_size__) ? __heap_size__ : __max_heap_size__; /* Use a default stack size if stack size was not defined. */ __stack_size__ = DEFINED(__stack_size__) ? __stack_size__ : 4K; /* Read-only sections, merged into text segment: */ PROVIDE (__executable_start = 0x80000000); . = 0x80000000; .interp : { *(.interp) } >FLASH AT>FLASH :FLASH .reset : { *(.reset) } >FLASH AT>FLASH :FLASH .hash : { *(.hash) } >FLASH AT>FLASH :FLASH .dynsym : { *(.dynsym) } >FLASH AT>FLASH :FLASH .dynstr : { *(.dynstr) } >FLASH AT>FLASH :FLASH .gnu.version : { *(.gnu.version) } >FLASH AT>FLASH :FLASH .gnu.version_d : { *(.gnu.version_d) } >FLASH AT>FLASH :FLASH .gnu.version_r : { *(.gnu.version_r) } >FLASH AT>FLASH :FLASH .rel.init : { *(.rel.init) } >FLASH AT>FLASH :FLASH .rela.init : { *(.rela.init) } >FLASH AT>FLASH :FLASH .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } >FLASH AT>FLASH :FLASH .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } >FLASH AT>FLASH :FLASH .rel.fini : { *(.rel.fini) } >FLASH AT>FLASH :FLASH .rela.fini : { *(.rela.fini) } >FLASH AT>FLASH :FLASH .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH .rel.data.rel.ro : { *(.rel.data.rel.ro*) } >FLASH AT>FLASH :FLASH .rela.data.rel.ro : { *(.rel.data.rel.ro*) } >FLASH AT>FLASH :FLASH .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } >FLASH AT>FLASH :FLASH .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } >FLASH AT>FLASH :FLASH .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } >FLASH AT>FLASH :FLASH .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } >FLASH AT>FLASH :FLASH .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } >FLASH AT>FLASH :FLASH .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } >FLASH AT>FLASH :FLASH .rel.ctors : { *(.rel.ctors) } >FLASH AT>FLASH :FLASH .rela.ctors : { *(.rela.ctors) } >FLASH AT>FLASH :FLASH .rel.dtors : { *(.rel.dtors) } >FLASH AT>FLASH :FLASH .rela.dtors : { *(.rela.dtors) } >FLASH AT>FLASH :FLASH .rel.got : { *(.rel.got) } >FLASH AT>FLASH :FLASH .rela.got : { *(.rela.got) } >FLASH AT>FLASH :FLASH .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } >FLASH AT>FLASH :FLASH .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } >FLASH AT>FLASH :FLASH .rel.plt : { *(.rel.plt) } >FLASH AT>FLASH :FLASH .rela.plt : { *(.rela.plt) } >FLASH AT>FLASH :FLASH .init : { KEEP (*(.init)) } >FLASH AT>FLASH :FLASH =0xd703d703 .plt : { *(.plt) } >FLASH AT>FLASH :FLASH .text : { *(.text .stub .text.* .gnu.linkonce.t.*) KEEP (*(.text.*personality*)) /* .gnu.warning sections are handled specially by elf32.em. */ *(.gnu.warning) } >FLASH AT>FLASH :FLASH =0xd703d703 .fini : { KEEP (*(.fini)) } >FLASH AT>FLASH :FLASH =0xd703d703 PROVIDE (__etext = .); PROVIDE (_etext = .); PROVIDE (etext = .); .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH .rodata1 : { *(.rodata1) } >FLASH AT>FLASH :FLASH .eh_frame_hdr : { *(.eh_frame_hdr) } >FLASH AT>FLASH :FLASH .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } >FLASH AT>FLASH :FLASH .gcc_except_table : ONLY_IF_RO { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) } >FLASH AT>FLASH :FLASH .lalign : { . = ALIGN(8); PROVIDE(_data_lma = .); } >FLASH AT>FLASH :FLASH . = ORIGIN(INTRAM); .dalign : { . = ALIGN(8); PROVIDE(_data = .); } >INTRAM AT>INTRAM :INTRAM_ALIGN /* Exception handling */ .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .gcc_except_table : ONLY_IF_RW { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH /* Thread Local Storage sections */ .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } >INTRAM AT>FLASH :INTRAM_AT_FLASH /* Ensure the __preinit_array_start label is properly aligned. We could instead move the label definition inside the section, but the linker would then create the section even if it turns out to be empty, which isn't pretty. */ PROVIDE (__preinit_array_start = ALIGN(32 / 8)); .preinit_array : { KEEP (*(.preinit_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH PROVIDE (__preinit_array_end = .); PROVIDE (__init_array_start = .); .init_array : { KEEP (*(.init_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH PROVIDE (__init_array_end = .); PROVIDE (__fini_array_start = .); .fini_array : { KEEP (*(.fini_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH PROVIDE (__fini_array_end = .); .ctors : { /* gcc uses crtbegin.o to find the start of the constructors, so we make sure it is first. Because this is a wildcard, it doesn't matter if the user does not actually link against crtbegin.o; the linker won't look for a file to match a wildcard. The wildcard also means that it doesn't matter which directory crtbegin.o is in. */ KEEP (*crtbegin*.o(.ctors)) /* We don't want to include the .ctor section from from the crtend.o file until after the sorted ctors. The .ctor section from the crtend file contains the end of ctors marker and it must be last */ KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors)) KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .dtors : { KEEP (*crtbegin*.o(.dtors)) KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors)) KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .jcr : { KEEP (*(.jcr)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .data.rel.ro : { *(.data.rel.ro.local) *(.data.rel.ro*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .dynamic : { *(.dynamic) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .got : { *(.got.plt) *(.got) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .ramtext : { *(.ramtext .ramtext.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .ddalign : { . = ALIGN(8); } >INTRAM AT>FLASH :INTRAM_AT_FLASH .data : { *(.data .data.* .gnu.linkonce.d.*) KEEP (*(.gnu.linkonce.d.*personality*)) SORT(CONSTRUCTORS) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .data1 : { *(.data1) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .balign : { . = ALIGN(8); PROVIDE(_edata = .); } >INTRAM AT>FLASH :INTRAM_AT_FLASH PROVIDE (edata = .); __bss_start = .; .bss : { *(.dynbss) *(.bss .bss.* .gnu.linkonce.b.*) *(COMMON) /* Align here to ensure that the .bss section occupies space up to _end. Align after .bss to ensure correct alignment even if the .bss section disappears because there are no input sections. */ . = ALIGN(8); } >INTRAM AT>INTRAM :INTRAM . = ALIGN(8); _end = .; PROVIDE (end = .); __heap_start__ = ALIGN(8); .heap : { *(.heap) . = (__heap_size__ == __max_heap_size__) ? ORIGIN(INTRAM) + LENGTH(INTRAM) - __stack_size__ - ABSOLUTE(.) : __heap_size__; } >INTRAM AT>INTRAM :INTRAM __heap_end__ = .; /* Stabs debugging sections. */ .stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } .stab.excl 0 : { *(.stab.excl) } .stab.exclstr 0 : { *(.stab.exclstr) } .stab.index 0 : { *(.stab.index) } .stab.indexstr 0 : { *(.stab.indexstr) } .comment 0 : { *(.comment) } /* DWARF debug sections. Symbols in the DWARF debugging sections are relative to the beginning of the section so we begin them at 0. */ /* DWARF 1 */ .debug 0 : { *(.debug) } .line 0 : { *(.line) } /* GNU DWARF 1 extensions */ .debug_srcinfo 0 : { *(.debug_srcinfo) } .debug_sfnames 0 : { *(.debug_sfnames) } /* DWARF 1.1 and DWARF 2 */ .debug_aranges 0 : { *(.debug_aranges) } .debug_pubnames 0 : { *(.debug_pubnames) } /* DWARF 2 */ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } .debug_abbrev 0 : { *(.debug_abbrev) } .debug_line 0 : { *(.debug_line) } .debug_frame 0 : { *(.debug_frame) } .debug_str 0 : { *(.debug_str) } .debug_loc 0 : { *(.debug_loc) } .debug_macinfo 0 : { *(.debug_macinfo) } /* SGI/MIPS DWARF 2 extensions */ .debug_weaknames 0 : { *(.debug_weaknames) } .debug_funcnames 0 : { *(.debug_funcnames) } .debug_typenames 0 : { *(.debug_typenames) } .debug_varnames 0 : { *(.debug_varnames) } .stack ORIGIN(INTRAM) + LENGTH(INTRAM) - __stack_size__ : { _stack = .; *(.stack) . = __stack_size__; _estack = .; } >INTRAM AT>INTRAM :INTRAM .userpage : { *(.userpage .userpage.*) } >USERPAGE AT>USERPAGE :USERPAGE /DISCARD/ : { *(.note.GNU-stack) } } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/mrepeat.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Preprocessor macro repeating utils. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _MREPEAT_H_ #define _MREPEAT_H_ #include "preprocessor.h" //! Maximal number of repetitions supported by MREPEAT. #define MREPEAT_LIMIT 256 /*! \brief Macro repeat. * * This macro represents a horizontal repetition construct. * * \param count The number of repetitious calls to macro. Valid values range from 0 to MREPEAT_LIMIT. * \param macro A binary operation of the form macro(n, data). This macro is expanded by MREPEAT with * the current repetition number and the auxiliary data argument. * \param data Auxiliary data passed to macro. * * \return macro(0, data) macro(1, data) ... macro(count - 1, data) */ #define MREPEAT(count, macro, data) TPASTE2(MREPEAT, count)(macro, data) #define MREPEAT0( macro, data) #define MREPEAT1( macro, data) MREPEAT0( macro, data) macro( 0, data) #define MREPEAT2( macro, data) MREPEAT1( macro, data) macro( 1, data) #define MREPEAT3( macro, data) MREPEAT2( macro, data) macro( 2, data) #define MREPEAT4( macro, data) MREPEAT3( macro, data) macro( 3, data) #define MREPEAT5( macro, data) MREPEAT4( macro, data) macro( 4, data) #define MREPEAT6( macro, data) MREPEAT5( macro, data) macro( 5, data) #define MREPEAT7( macro, data) MREPEAT6( macro, data) macro( 6, data) #define MREPEAT8( macro, data) MREPEAT7( macro, data) macro( 7, data) #define MREPEAT9( macro, data) MREPEAT8( macro, data) macro( 8, data) #define MREPEAT10( macro, data) MREPEAT9( macro, data) macro( 9, data) #define MREPEAT11( macro, data) MREPEAT10( macro, data) macro( 10, data) #define MREPEAT12( macro, data) MREPEAT11( macro, data) macro( 11, data) #define MREPEAT13( macro, data) MREPEAT12( macro, data) macro( 12, data) #define MREPEAT14( macro, data) MREPEAT13( macro, data) macro( 13, data) #define MREPEAT15( macro, data) MREPEAT14( macro, data) macro( 14, data) #define MREPEAT16( macro, data) MREPEAT15( macro, data) macro( 15, data) #define MREPEAT17( macro, data) MREPEAT16( macro, data) macro( 16, data) #define MREPEAT18( macro, data) MREPEAT17( macro, data) macro( 17, data) #define MREPEAT19( macro, data) MREPEAT18( macro, data) macro( 18, data) #define MREPEAT20( macro, data) MREPEAT19( macro, data) macro( 19, data) #define MREPEAT21( macro, data) MREPEAT20( macro, data) macro( 20, data) #define MREPEAT22( macro, data) MREPEAT21( macro, data) macro( 21, data) #define MREPEAT23( macro, data) MREPEAT22( macro, data) macro( 22, data) #define MREPEAT24( macro, data) MREPEAT23( macro, data) macro( 23, data) #define MREPEAT25( macro, data) MREPEAT24( macro, data) macro( 24, data) #define MREPEAT26( macro, data) MREPEAT25( macro, data) macro( 25, data) #define MREPEAT27( macro, data) MREPEAT26( macro, data) macro( 26, data) #define MREPEAT28( macro, data) MREPEAT27( macro, data) macro( 27, data) #define MREPEAT29( macro, data) MREPEAT28( macro, data) macro( 28, data) #define MREPEAT30( macro, data) MREPEAT29( macro, data) macro( 29, data) #define MREPEAT31( macro, data) MREPEAT30( macro, data) macro( 30, data) #define MREPEAT32( macro, data) MREPEAT31( macro, data) macro( 31, data) #define MREPEAT33( macro, data) MREPEAT32( macro, data) macro( 32, data) #define MREPEAT34( macro, data) MREPEAT33( macro, data) macro( 33, data) #define MREPEAT35( macro, data) MREPEAT34( macro, data) macro( 34, data) #define MREPEAT36( macro, data) MREPEAT35( macro, data) macro( 35, data) #define MREPEAT37( macro, data) MREPEAT36( macro, data) macro( 36, data) #define MREPEAT38( macro, data) MREPEAT37( macro, data) macro( 37, data) #define MREPEAT39( macro, data) MREPEAT38( macro, data) macro( 38, data) #define MREPEAT40( macro, data) MREPEAT39( macro, data) macro( 39, data) #define MREPEAT41( macro, data) MREPEAT40( macro, data) macro( 40, data) #define MREPEAT42( macro, data) MREPEAT41( macro, data) macro( 41, data) #define MREPEAT43( macro, data) MREPEAT42( macro, data) macro( 42, data) #define MREPEAT44( macro, data) MREPEAT43( macro, data) macro( 43, data) #define MREPEAT45( macro, data) MREPEAT44( macro, data) macro( 44, data) #define MREPEAT46( macro, data) MREPEAT45( macro, data) macro( 45, data) #define MREPEAT47( macro, data) MREPEAT46( macro, data) macro( 46, data) #define MREPEAT48( macro, data) MREPEAT47( macro, data) macro( 47, data) #define MREPEAT49( macro, data) MREPEAT48( macro, data) macro( 48, data) #define MREPEAT50( macro, data) MREPEAT49( macro, data) macro( 49, data) #define MREPEAT51( macro, data) MREPEAT50( macro, data) macro( 50, data) #define MREPEAT52( macro, data) MREPEAT51( macro, data) macro( 51, data) #define MREPEAT53( macro, data) MREPEAT52( macro, data) macro( 52, data) #define MREPEAT54( macro, data) MREPEAT53( macro, data) macro( 53, data) #define MREPEAT55( macro, data) MREPEAT54( macro, data) macro( 54, data) #define MREPEAT56( macro, data) MREPEAT55( macro, data) macro( 55, data) #define MREPEAT57( macro, data) MREPEAT56( macro, data) macro( 56, data) #define MREPEAT58( macro, data) MREPEAT57( macro, data) macro( 57, data) #define MREPEAT59( macro, data) MREPEAT58( macro, data) macro( 58, data) #define MREPEAT60( macro, data) MREPEAT59( macro, data) macro( 59, data) #define MREPEAT61( macro, data) MREPEAT60( macro, data) macro( 60, data) #define MREPEAT62( macro, data) MREPEAT61( macro, data) macro( 61, data) #define MREPEAT63( macro, data) MREPEAT62( macro, data) macro( 62, data) #define MREPEAT64( macro, data) MREPEAT63( macro, data) macro( 63, data) #define MREPEAT65( macro, data) MREPEAT64( macro, data) macro( 64, data) #define MREPEAT66( macro, data) MREPEAT65( macro, data) macro( 65, data) #define MREPEAT67( macro, data) MREPEAT66( macro, data) macro( 66, data) #define MREPEAT68( macro, data) MREPEAT67( macro, data) macro( 67, data) #define MREPEAT69( macro, data) MREPEAT68( macro, data) macro( 68, data) #define MREPEAT70( macro, data) MREPEAT69( macro, data) macro( 69, data) #define MREPEAT71( macro, data) MREPEAT70( macro, data) macro( 70, data) #define MREPEAT72( macro, data) MREPEAT71( macro, data) macro( 71, data) #define MREPEAT73( macro, data) MREPEAT72( macro, data) macro( 72, data) #define MREPEAT74( macro, data) MREPEAT73( macro, data) macro( 73, data) #define MREPEAT75( macro, data) MREPEAT74( macro, data) macro( 74, data) #define MREPEAT76( macro, data) MREPEAT75( macro, data) macro( 75, data) #define MREPEAT77( macro, data) MREPEAT76( macro, data) macro( 76, data) #define MREPEAT78( macro, data) MREPEAT77( macro, data) macro( 77, data) #define MREPEAT79( macro, data) MREPEAT78( macro, data) macro( 78, data) #define MREPEAT80( macro, data) MREPEAT79( macro, data) macro( 79, data) #define MREPEAT81( macro, data) MREPEAT80( macro, data) macro( 80, data) #define MREPEAT82( macro, data) MREPEAT81( macro, data) macro( 81, data) #define MREPEAT83( macro, data) MREPEAT82( macro, data) macro( 82, data) #define MREPEAT84( macro, data) MREPEAT83( macro, data) macro( 83, data) #define MREPEAT85( macro, data) MREPEAT84( macro, data) macro( 84, data) #define MREPEAT86( macro, data) MREPEAT85( macro, data) macro( 85, data) #define MREPEAT87( macro, data) MREPEAT86( macro, data) macro( 86, data) #define MREPEAT88( macro, data) MREPEAT87( macro, data) macro( 87, data) #define MREPEAT89( macro, data) MREPEAT88( macro, data) macro( 88, data) #define MREPEAT90( macro, data) MREPEAT89( macro, data) macro( 89, data) #define MREPEAT91( macro, data) MREPEAT90( macro, data) macro( 90, data) #define MREPEAT92( macro, data) MREPEAT91( macro, data) macro( 91, data) #define MREPEAT93( macro, data) MREPEAT92( macro, data) macro( 92, data) #define MREPEAT94( macro, data) MREPEAT93( macro, data) macro( 93, data) #define MREPEAT95( macro, data) MREPEAT94( macro, data) macro( 94, data) #define MREPEAT96( macro, data) MREPEAT95( macro, data) macro( 95, data) #define MREPEAT97( macro, data) MREPEAT96( macro, data) macro( 96, data) #define MREPEAT98( macro, data) MREPEAT97( macro, data) macro( 97, data) #define MREPEAT99( macro, data) MREPEAT98( macro, data) macro( 98, data) #define MREPEAT100(macro, data) MREPEAT99( macro, data) macro( 99, data) #define MREPEAT101(macro, data) MREPEAT100(macro, data) macro(100, data) #define MREPEAT102(macro, data) MREPEAT101(macro, data) macro(101, data) #define MREPEAT103(macro, data) MREPEAT102(macro, data) macro(102, data) #define MREPEAT104(macro, data) MREPEAT103(macro, data) macro(103, data) #define MREPEAT105(macro, data) MREPEAT104(macro, data) macro(104, data) #define MREPEAT106(macro, data) MREPEAT105(macro, data) macro(105, data) #define MREPEAT107(macro, data) MREPEAT106(macro, data) macro(106, data) #define MREPEAT108(macro, data) MREPEAT107(macro, data) macro(107, data) #define MREPEAT109(macro, data) MREPEAT108(macro, data) macro(108, data) #define MREPEAT110(macro, data) MREPEAT109(macro, data) macro(109, data) #define MREPEAT111(macro, data) MREPEAT110(macro, data) macro(110, data) #define MREPEAT112(macro, data) MREPEAT111(macro, data) macro(111, data) #define MREPEAT113(macro, data) MREPEAT112(macro, data) macro(112, data) #define MREPEAT114(macro, data) MREPEAT113(macro, data) macro(113, data) #define MREPEAT115(macro, data) MREPEAT114(macro, data) macro(114, data) #define MREPEAT116(macro, data) MREPEAT115(macro, data) macro(115, data) #define MREPEAT117(macro, data) MREPEAT116(macro, data) macro(116, data) #define MREPEAT118(macro, data) MREPEAT117(macro, data) macro(117, data) #define MREPEAT119(macro, data) MREPEAT118(macro, data) macro(118, data) #define MREPEAT120(macro, data) MREPEAT119(macro, data) macro(119, data) #define MREPEAT121(macro, data) MREPEAT120(macro, data) macro(120, data) #define MREPEAT122(macro, data) MREPEAT121(macro, data) macro(121, data) #define MREPEAT123(macro, data) MREPEAT122(macro, data) macro(122, data) #define MREPEAT124(macro, data) MREPEAT123(macro, data) macro(123, data) #define MREPEAT125(macro, data) MREPEAT124(macro, data) macro(124, data) #define MREPEAT126(macro, data) MREPEAT125(macro, data) macro(125, data) #define MREPEAT127(macro, data) MREPEAT126(macro, data) macro(126, data) #define MREPEAT128(macro, data) MREPEAT127(macro, data) macro(127, data) #define MREPEAT129(macro, data) MREPEAT128(macro, data) macro(128, data) #define MREPEAT130(macro, data) MREPEAT129(macro, data) macro(129, data) #define MREPEAT131(macro, data) MREPEAT130(macro, data) macro(130, data) #define MREPEAT132(macro, data) MREPEAT131(macro, data) macro(131, data) #define MREPEAT133(macro, data) MREPEAT132(macro, data) macro(132, data) #define MREPEAT134(macro, data) MREPEAT133(macro, data) macro(133, data) #define MREPEAT135(macro, data) MREPEAT134(macro, data) macro(134, data) #define MREPEAT136(macro, data) MREPEAT135(macro, data) macro(135, data) #define MREPEAT137(macro, data) MREPEAT136(macro, data) macro(136, data) #define MREPEAT138(macro, data) MREPEAT137(macro, data) macro(137, data) #define MREPEAT139(macro, data) MREPEAT138(macro, data) macro(138, data) #define MREPEAT140(macro, data) MREPEAT139(macro, data) macro(139, data) #define MREPEAT141(macro, data) MREPEAT140(macro, data) macro(140, data) #define MREPEAT142(macro, data) MREPEAT141(macro, data) macro(141, data) #define MREPEAT143(macro, data) MREPEAT142(macro, data) macro(142, data) #define MREPEAT144(macro, data) MREPEAT143(macro, data) macro(143, data) #define MREPEAT145(macro, data) MREPEAT144(macro, data) macro(144, data) #define MREPEAT146(macro, data) MREPEAT145(macro, data) macro(145, data) #define MREPEAT147(macro, data) MREPEAT146(macro, data) macro(146, data) #define MREPEAT148(macro, data) MREPEAT147(macro, data) macro(147, data) #define MREPEAT149(macro, data) MREPEAT148(macro, data) macro(148, data) #define MREPEAT150(macro, data) MREPEAT149(macro, data) macro(149, data) #define MREPEAT151(macro, data) MREPEAT150(macro, data) macro(150, data) #define MREPEAT152(macro, data) MREPEAT151(macro, data) macro(151, data) #define MREPEAT153(macro, data) MREPEAT152(macro, data) macro(152, data) #define MREPEAT154(macro, data) MREPEAT153(macro, data) macro(153, data) #define MREPEAT155(macro, data) MREPEAT154(macro, data) macro(154, data) #define MREPEAT156(macro, data) MREPEAT155(macro, data) macro(155, data) #define MREPEAT157(macro, data) MREPEAT156(macro, data) macro(156, data) #define MREPEAT158(macro, data) MREPEAT157(macro, data) macro(157, data) #define MREPEAT159(macro, data) MREPEAT158(macro, data) macro(158, data) #define MREPEAT160(macro, data) MREPEAT159(macro, data) macro(159, data) #define MREPEAT161(macro, data) MREPEAT160(macro, data) macro(160, data) #define MREPEAT162(macro, data) MREPEAT161(macro, data) macro(161, data) #define MREPEAT163(macro, data) MREPEAT162(macro, data) macro(162, data) #define MREPEAT164(macro, data) MREPEAT163(macro, data) macro(163, data) #define MREPEAT165(macro, data) MREPEAT164(macro, data) macro(164, data) #define MREPEAT166(macro, data) MREPEAT165(macro, data) macro(165, data) #define MREPEAT167(macro, data) MREPEAT166(macro, data) macro(166, data) #define MREPEAT168(macro, data) MREPEAT167(macro, data) macro(167, data) #define MREPEAT169(macro, data) MREPEAT168(macro, data) macro(168, data) #define MREPEAT170(macro, data) MREPEAT169(macro, data) macro(169, data) #define MREPEAT171(macro, data) MREPEAT170(macro, data) macro(170, data) #define MREPEAT172(macro, data) MREPEAT171(macro, data) macro(171, data) #define MREPEAT173(macro, data) MREPEAT172(macro, data) macro(172, data) #define MREPEAT174(macro, data) MREPEAT173(macro, data) macro(173, data) #define MREPEAT175(macro, data) MREPEAT174(macro, data) macro(174, data) #define MREPEAT176(macro, data) MREPEAT175(macro, data) macro(175, data) #define MREPEAT177(macro, data) MREPEAT176(macro, data) macro(176, data) #define MREPEAT178(macro, data) MREPEAT177(macro, data) macro(177, data) #define MREPEAT179(macro, data) MREPEAT178(macro, data) macro(178, data) #define MREPEAT180(macro, data) MREPEAT179(macro, data) macro(179, data) #define MREPEAT181(macro, data) MREPEAT180(macro, data) macro(180, data) #define MREPEAT182(macro, data) MREPEAT181(macro, data) macro(181, data) #define MREPEAT183(macro, data) MREPEAT182(macro, data) macro(182, data) #define MREPEAT184(macro, data) MREPEAT183(macro, data) macro(183, data) #define MREPEAT185(macro, data) MREPEAT184(macro, data) macro(184, data) #define MREPEAT186(macro, data) MREPEAT185(macro, data) macro(185, data) #define MREPEAT187(macro, data) MREPEAT186(macro, data) macro(186, data) #define MREPEAT188(macro, data) MREPEAT187(macro, data) macro(187, data) #define MREPEAT189(macro, data) MREPEAT188(macro, data) macro(188, data) #define MREPEAT190(macro, data) MREPEAT189(macro, data) macro(189, data) #define MREPEAT191(macro, data) MREPEAT190(macro, data) macro(190, data) #define MREPEAT192(macro, data) MREPEAT191(macro, data) macro(191, data) #define MREPEAT193(macro, data) MREPEAT192(macro, data) macro(192, data) #define MREPEAT194(macro, data) MREPEAT193(macro, data) macro(193, data) #define MREPEAT195(macro, data) MREPEAT194(macro, data) macro(194, data) #define MREPEAT196(macro, data) MREPEAT195(macro, data) macro(195, data) #define MREPEAT197(macro, data) MREPEAT196(macro, data) macro(196, data) #define MREPEAT198(macro, data) MREPEAT197(macro, data) macro(197, data) #define MREPEAT199(macro, data) MREPEAT198(macro, data) macro(198, data) #define MREPEAT200(macro, data) MREPEAT199(macro, data) macro(199, data) #define MREPEAT201(macro, data) MREPEAT200(macro, data) macro(200, data) #define MREPEAT202(macro, data) MREPEAT201(macro, data) macro(201, data) #define MREPEAT203(macro, data) MREPEAT202(macro, data) macro(202, data) #define MREPEAT204(macro, data) MREPEAT203(macro, data) macro(203, data) #define MREPEAT205(macro, data) MREPEAT204(macro, data) macro(204, data) #define MREPEAT206(macro, data) MREPEAT205(macro, data) macro(205, data) #define MREPEAT207(macro, data) MREPEAT206(macro, data) macro(206, data) #define MREPEAT208(macro, data) MREPEAT207(macro, data) macro(207, data) #define MREPEAT209(macro, data) MREPEAT208(macro, data) macro(208, data) #define MREPEAT210(macro, data) MREPEAT209(macro, data) macro(209, data) #define MREPEAT211(macro, data) MREPEAT210(macro, data) macro(210, data) #define MREPEAT212(macro, data) MREPEAT211(macro, data) macro(211, data) #define MREPEAT213(macro, data) MREPEAT212(macro, data) macro(212, data) #define MREPEAT214(macro, data) MREPEAT213(macro, data) macro(213, data) #define MREPEAT215(macro, data) MREPEAT214(macro, data) macro(214, data) #define MREPEAT216(macro, data) MREPEAT215(macro, data) macro(215, data) #define MREPEAT217(macro, data) MREPEAT216(macro, data) macro(216, data) #define MREPEAT218(macro, data) MREPEAT217(macro, data) macro(217, data) #define MREPEAT219(macro, data) MREPEAT218(macro, data) macro(218, data) #define MREPEAT220(macro, data) MREPEAT219(macro, data) macro(219, data) #define MREPEAT221(macro, data) MREPEAT220(macro, data) macro(220, data) #define MREPEAT222(macro, data) MREPEAT221(macro, data) macro(221, data) #define MREPEAT223(macro, data) MREPEAT222(macro, data) macro(222, data) #define MREPEAT224(macro, data) MREPEAT223(macro, data) macro(223, data) #define MREPEAT225(macro, data) MREPEAT224(macro, data) macro(224, data) #define MREPEAT226(macro, data) MREPEAT225(macro, data) macro(225, data) #define MREPEAT227(macro, data) MREPEAT226(macro, data) macro(226, data) #define MREPEAT228(macro, data) MREPEAT227(macro, data) macro(227, data) #define MREPEAT229(macro, data) MREPEAT228(macro, data) macro(228, data) #define MREPEAT230(macro, data) MREPEAT229(macro, data) macro(229, data) #define MREPEAT231(macro, data) MREPEAT230(macro, data) macro(230, data) #define MREPEAT232(macro, data) MREPEAT231(macro, data) macro(231, data) #define MREPEAT233(macro, data) MREPEAT232(macro, data) macro(232, data) #define MREPEAT234(macro, data) MREPEAT233(macro, data) macro(233, data) #define MREPEAT235(macro, data) MREPEAT234(macro, data) macro(234, data) #define MREPEAT236(macro, data) MREPEAT235(macro, data) macro(235, data) #define MREPEAT237(macro, data) MREPEAT236(macro, data) macro(236, data) #define MREPEAT238(macro, data) MREPEAT237(macro, data) macro(237, data) #define MREPEAT239(macro, data) MREPEAT238(macro, data) macro(238, data) #define MREPEAT240(macro, data) MREPEAT239(macro, data) macro(239, data) #define MREPEAT241(macro, data) MREPEAT240(macro, data) macro(240, data) #define MREPEAT242(macro, data) MREPEAT241(macro, data) macro(241, data) #define MREPEAT243(macro, data) MREPEAT242(macro, data) macro(242, data) #define MREPEAT244(macro, data) MREPEAT243(macro, data) macro(243, data) #define MREPEAT245(macro, data) MREPEAT244(macro, data) macro(244, data) #define MREPEAT246(macro, data) MREPEAT245(macro, data) macro(245, data) #define MREPEAT247(macro, data) MREPEAT246(macro, data) macro(246, data) #define MREPEAT248(macro, data) MREPEAT247(macro, data) macro(247, data) #define MREPEAT249(macro, data) MREPEAT248(macro, data) macro(248, data) #define MREPEAT250(macro, data) MREPEAT249(macro, data) macro(249, data) #define MREPEAT251(macro, data) MREPEAT250(macro, data) macro(250, data) #define MREPEAT252(macro, data) MREPEAT251(macro, data) macro(251, data) #define MREPEAT253(macro, data) MREPEAT252(macro, data) macro(252, data) #define MREPEAT254(macro, data) MREPEAT253(macro, data) macro(253, data) #define MREPEAT255(macro, data) MREPEAT254(macro, data) macro(254, data) #define MREPEAT256(macro, data) MREPEAT255(macro, data) macro(255, data) #endif // _MREPEAT_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/preprocessor.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Preprocessor utils. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _PREPROCESSOR_H_ #define _PREPROCESSOR_H_ #include "tpaste.h" #include "stringz.h" #include "mrepeat.h" #endif // _PREPROCESSOR_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/stringz.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Preprocessor stringizing utils. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _STRINGZ_H_ #define _STRINGZ_H_ /*! \brief Stringize. * * Stringize a preprocessing token, this token being allowed to be \#defined. * * May be used only within macros with the token passed as an argument if the token is \#defined. * * For example, writing STRINGZ(PIN) within a macro \#defined by PIN_NAME(PIN) * and invoked as PIN_NAME(PIN0) with PIN0 \#defined as A0 is equivalent to * writing "A0". */ #define STRINGZ(x) #x /*! \brief Absolute stringize. * * Stringize a preprocessing token, this token being allowed to be \#defined. * * No restriction of use if the token is \#defined. * * For example, writing ASTRINGZ(PIN0) anywhere with PIN0 \#defined as A0 is * equivalent to writing "A0". */ #define ASTRINGZ(x) STRINGZ(x) #endif // _STRINGZ_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/tpaste.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Preprocessor token pasting utils. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _TPASTE_H_ #define _TPASTE_H_ /*! \name Token Paste * * Paste N preprocessing tokens together, these tokens being allowed to be \#defined. * * May be used only within macros with the tokens passed as arguments if the tokens are \#defined. * * For example, writing TPASTE2(U, WIDTH) within a macro \#defined by * UTYPE(WIDTH) and invoked as UTYPE(UL_WIDTH) with UL_WIDTH \#defined as 32 is * equivalent to writing U32. */ //! @{ #define TPASTE2( a, b) a##b #define TPASTE3( a, b, c) a##b##c #define TPASTE4( a, b, c, d) a##b##c##d #define TPASTE5( a, b, c, d, e) a##b##c##d##e #define TPASTE6( a, b, c, d, e, f) a##b##c##d##e##f #define TPASTE7( a, b, c, d, e, f, g) a##b##c##d##e##f##g #define TPASTE8( a, b, c, d, e, f, g, h) a##b##c##d##e##f##g##h #define TPASTE9( a, b, c, d, e, f, g, h, i) a##b##c##d##e##f##g##h##i #define TPASTE10(a, b, c, d, e, f, g, h, i, j) a##b##c##d##e##f##g##h##i##j //! @} /*! \name Absolute Token Paste * * Paste N preprocessing tokens together, these tokens being allowed to be \#defined. * * No restriction of use if the tokens are \#defined. * * For example, writing ATPASTE2(U, UL_WIDTH) anywhere with UL_WIDTH \#defined * as 32 is equivalent to writing U32. */ //! @{ #define ATPASTE2( a, b) TPASTE2( a, b) #define ATPASTE3( a, b, c) TPASTE3( a, b, c) #define ATPASTE4( a, b, c, d) TPASTE4( a, b, c, d) #define ATPASTE5( a, b, c, d, e) TPASTE5( a, b, c, d, e) #define ATPASTE6( a, b, c, d, e, f) TPASTE6( a, b, c, d, e, f) #define ATPASTE7( a, b, c, d, e, f, g) TPASTE7( a, b, c, d, e, f, g) #define ATPASTE8( a, b, c, d, e, f, g, h) TPASTE8( a, b, c, d, e, f, g, h) #define ATPASTE9( a, b, c, d, e, f, g, h, i) TPASTE9( a, b, c, d, e, f, g, h, i) #define ATPASTE10(a, b, c, d, e, f, g, h, i, j) TPASTE10(a, b, c, d, e, f, g, h, i, j) //! @} #endif // _TPASTE_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/STARTUP_FILES/GCC/crt0.x ================================================ /* This file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief AVR32UC C runtime startup file. * * This file has been built from the Newlib crt0.S. * * - Compiler: GNU GCC for AVR32 * - Supported devices: All AVR32UC devices can be used. * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include //! @{ //! \verbatim // This must be linked @ 0x80000000 if it is to be run upon reset. .section .reset, "ax", @progbits .global _start .type _start, @function _start: // Jump to the C runtime startup routine. lda.w pc, _stext // _stext is placed outside the .reset section so that the program entry point // can be changed without affecting the C runtime startup. .section .text._stext, "ax", @progbits .global _stext .type _stext, @function _stext: // Set initial stack pointer. lda.w sp, _estack // Set up EVBA so interrupts can be enabled. lda.w r0, _evba mtsr AVR32_EVBA, r0 // Enable the exception processing. csrf AVR32_SR_EM_OFFSET // Load initialized data having a global lifetime from the data LMA. lda.w r0, _data lda.w r1, _edata cp r0, r1 brhs idata_load_loop_end lda.w r2, _data_lma idata_load_loop: ld.d r4, r2++ st.d r0++, r4 cp r0, r1 brlo idata_load_loop idata_load_loop_end: // Clear uninitialized data having a global lifetime in the blank static storage section. lda.w r0, __bss_start lda.w r1, _end cp r0, r1 brhs udata_clear_loop_end mov r2, 0 mov r3, 0 udata_clear_loop: st.d r0++, r2 cp r0, r1 brlo udata_clear_loop udata_clear_loop_end: #ifdef CONFIG_FRAME_POINTER // Safety: Set the default "return" @ to the exit routine address. lda.w lr, exit #endif // Start the show. lda.w pc, main //! \endverbatim //! @} ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/compiler.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Compiler file for AVR32. * * This file defines commonly used types and macros. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _COMPILER_H_ #define _COMPILER_H_ #if ((defined __GNUC__) && (defined __AVR32__)) || (defined __ICCAVR32__ || defined __AAVR32__) # include #endif #if (defined __ICCAVR32__) # include #endif #include "preprocessor.h" #include "parts.h" //_____ D E C L A R A T I O N S ____________________________________________ #ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling. #include #include #if (defined __ICCAVR32__) /*! \name Compiler Keywords * * Port of some keywords from GNU GCC for AVR32 to IAR Embedded Workbench for Atmel AVR32. */ //! @{ #define __asm__ asm #define __inline__ inline #define __volatile__ //! @} #endif /*! \name Usual Types */ //! @{ typedef unsigned char Bool; //!< Boolean. #ifndef __cplusplus #if !defined(__bool_true_false_are_defined) typedef unsigned char bool; //!< Boolean. #endif #endif typedef signed char S8 ; //!< 8-bit signed integer. typedef unsigned char U8 ; //!< 8-bit unsigned integer. typedef signed short int S16; //!< 16-bit signed integer. typedef unsigned short int U16; //!< 16-bit unsigned integer. typedef signed long int S32; //!< 32-bit signed integer. typedef unsigned long int U32; //!< 32-bit unsigned integer. typedef signed long long int S64; //!< 64-bit signed integer. typedef unsigned long long int U64; //!< 64-bit unsigned integer. typedef float F32; //!< 32-bit floating-point number. typedef double F64; //!< 64-bit floating-point number. //! @} /*! \name Status Types */ //! @{ typedef Bool Status_bool_t; //!< Boolean status. typedef U8 Status_t; //!< 8-bit-coded status. //! @} /*! \name Aliasing Aggregate Types */ //! @{ //! 16-bit union. typedef union { S16 s16 ; U16 u16 ; S8 s8 [2]; U8 u8 [2]; } Union16; //! 32-bit union. typedef union { S32 s32 ; U32 u32 ; S16 s16[2]; U16 u16[2]; S8 s8 [4]; U8 u8 [4]; } Union32; //! 64-bit union. typedef union { S64 s64 ; U64 u64 ; S32 s32[2]; U32 u32[2]; S16 s16[4]; U16 u16[4]; S8 s8 [8]; U8 u8 [8]; } Union64; //! Union of pointers to 64-, 32-, 16- and 8-bit unsigned integers. typedef union { S64 *s64ptr; U64 *u64ptr; S32 *s32ptr; U32 *u32ptr; S16 *s16ptr; U16 *u16ptr; S8 *s8ptr ; U8 *u8ptr ; } UnionPtr; //! Union of pointers to volatile 64-, 32-, 16- and 8-bit unsigned integers. typedef union { volatile S64 *s64ptr; volatile U64 *u64ptr; volatile S32 *s32ptr; volatile U32 *u32ptr; volatile S16 *s16ptr; volatile U16 *u16ptr; volatile S8 *s8ptr ; volatile U8 *u8ptr ; } UnionVPtr; //! Union of pointers to constant 64-, 32-, 16- and 8-bit unsigned integers. typedef union { const S64 *s64ptr; const U64 *u64ptr; const S32 *s32ptr; const U32 *u32ptr; const S16 *s16ptr; const U16 *u16ptr; const S8 *s8ptr ; const U8 *u8ptr ; } UnionCPtr; //! Union of pointers to constant volatile 64-, 32-, 16- and 8-bit unsigned integers. typedef union { const volatile S64 *s64ptr; const volatile U64 *u64ptr; const volatile S32 *s32ptr; const volatile U32 *u32ptr; const volatile S16 *s16ptr; const volatile U16 *u16ptr; const volatile S8 *s8ptr ; const volatile U8 *u8ptr ; } UnionCVPtr; //! Structure of pointers to 64-, 32-, 16- and 8-bit unsigned integers. typedef struct { S64 *s64ptr; U64 *u64ptr; S32 *s32ptr; U32 *u32ptr; S16 *s16ptr; U16 *u16ptr; S8 *s8ptr ; U8 *u8ptr ; } StructPtr; //! Structure of pointers to volatile 64-, 32-, 16- and 8-bit unsigned integers. typedef struct { volatile S64 *s64ptr; volatile U64 *u64ptr; volatile S32 *s32ptr; volatile U32 *u32ptr; volatile S16 *s16ptr; volatile U16 *u16ptr; volatile S8 *s8ptr ; volatile U8 *u8ptr ; } StructVPtr; //! Structure of pointers to constant 64-, 32-, 16- and 8-bit unsigned integers. typedef struct { const S64 *s64ptr; const U64 *u64ptr; const S32 *s32ptr; const U32 *u32ptr; const S16 *s16ptr; const U16 *u16ptr; const S8 *s8ptr ; const U8 *u8ptr ; } StructCPtr; //! Structure of pointers to constant volatile 64-, 32-, 16- and 8-bit unsigned integers. typedef struct { const volatile S64 *s64ptr; const volatile U64 *u64ptr; const volatile S32 *s32ptr; const volatile U32 *u32ptr; const volatile S16 *s16ptr; const volatile U16 *u16ptr; const volatile S8 *s8ptr ; const volatile U8 *u8ptr ; } StructCVPtr; //! @} #endif // __AVR32_ABI_COMPILER__ //_____ M A C R O S ________________________________________________________ /*! \name Usual Constants */ //! @{ #define DISABLE 0 #define ENABLE 1 #define DISABLED 0 #define ENABLED 1 #define OFF 0 #define ON 1 #define FALSE 0 #define TRUE 1 #ifndef __cplusplus #if !defined(__bool_true_false_are_defined) #define false FALSE #define true TRUE #endif #endif #define KO 0 #define OK 1 #define PASS 0 #define FAIL 1 #define LOW 0 #define HIGH 1 #define CLR 0 #define SET 1 //! @} #ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling. /*! \name Bit-Field Handling */ //! @{ /*! \brief Reads the bits of a value specified by a given bit-mask. * * \param value Value to read bits from. * \param mask Bit-mask indicating bits to read. * * \return Read bits. */ #define Rd_bits( value, mask) ((value) & (mask)) /*! \brief Writes the bits of a C lvalue specified by a given bit-mask. * * \param lvalue C lvalue to write bits to. * \param mask Bit-mask indicating bits to write. * \param bits Bits to write. * * \return Resulting value with written bits. */ #define Wr_bits(lvalue, mask, bits) ((lvalue) = ((lvalue) & ~(mask)) |\ ((bits ) & (mask))) /*! \brief Tests the bits of a value specified by a given bit-mask. * * \param value Value of which to test bits. * \param mask Bit-mask indicating bits to test. * * \return \c 1 if at least one of the tested bits is set, else \c 0. */ #define Tst_bits( value, mask) (Rd_bits(value, mask) != 0) /*! \brief Clears the bits of a C lvalue specified by a given bit-mask. * * \param lvalue C lvalue of which to clear bits. * \param mask Bit-mask indicating bits to clear. * * \return Resulting value with cleared bits. */ #define Clr_bits(lvalue, mask) ((lvalue) &= ~(mask)) /*! \brief Sets the bits of a C lvalue specified by a given bit-mask. * * \param lvalue C lvalue of which to set bits. * \param mask Bit-mask indicating bits to set. * * \return Resulting value with set bits. */ #define Set_bits(lvalue, mask) ((lvalue) |= (mask)) /*! \brief Toggles the bits of a C lvalue specified by a given bit-mask. * * \param lvalue C lvalue of which to toggle bits. * \param mask Bit-mask indicating bits to toggle. * * \return Resulting value with toggled bits. */ #define Tgl_bits(lvalue, mask) ((lvalue) ^= (mask)) /*! \brief Reads the bit-field of a value specified by a given bit-mask. * * \param value Value to read a bit-field from. * \param mask Bit-mask indicating the bit-field to read. * * \return Read bit-field. */ #define Rd_bitfield( value, mask) (Rd_bits( value, mask) >> ctz(mask)) /*! \brief Writes the bit-field of a C lvalue specified by a given bit-mask. * * \param lvalue C lvalue to write a bit-field to. * \param mask Bit-mask indicating the bit-field to write. * \param bitfield Bit-field to write. * * \return Resulting value with written bit-field. */ #define Wr_bitfield(lvalue, mask, bitfield) (Wr_bits(lvalue, mask, (U32)(bitfield) << ctz(mask))) //! @} /*! \brief This macro is used to test fatal errors. * * The macro tests if the expression is FALSE. If it is, a fatal error is * detected and the application hangs up. * * \param expr Expression to evaluate and supposed to be nonzero. */ #ifdef _ASSERT_ENABLE_ #define Assert(expr) \ {\ if (!(expr)) while (TRUE);\ } #else #define Assert(expr) #endif /*! \name Zero-Bit Counting * * Under AVR32-GCC, __builtin_clz and __builtin_ctz behave like macros when * applied to constant expressions (values known at compile time), so they are * more optimized than the use of the corresponding assembly instructions and * they can be used as constant expressions e.g. to initialize objects having * static storage duration, and like the corresponding assembly instructions * when applied to non-constant expressions (values unknown at compile time), so * they are more optimized than an assembly periphrasis. Hence, clz and ctz * ensure a possible and optimized behavior for both constant and non-constant * expressions. */ //! @{ /*! \brief Counts the leading zero bits of the given value considered as a 32-bit integer. * * \param u Value of which to count the leading zero bits. * * \return The count of leading zero bits in \a u. */ #if (defined __GNUC__) #define clz(u) __builtin_clz(u) #elif (defined __ICCAVR32__) #define clz(u) __count_leading_zeros(u) #endif /*! \brief Counts the trailing zero bits of the given value considered as a 32-bit integer. * * \param u Value of which to count the trailing zero bits. * * \return The count of trailing zero bits in \a u. */ #if (defined __GNUC__) #define ctz(u) __builtin_ctz(u) #elif (defined __ICCAVR32__) #define ctz(u) __count_trailing_zeros(u) #endif //! @} /*! \name Bit Reversing */ //! @{ /*! \brief Reverses the bits of \a u8. * * \param u8 U8 of which to reverse the bits. * * \return Value resulting from \a u8 with reversed bits. */ #define bit_reverse8(u8) ((U8)(bit_reverse32((U8)(u8)) >> 24)) /*! \brief Reverses the bits of \a u16. * * \param u16 U16 of which to reverse the bits. * * \return Value resulting from \a u16 with reversed bits. */ #define bit_reverse16(u16) ((U16)(bit_reverse32((U16)(u16)) >> 16)) /*! \brief Reverses the bits of \a u32. * * \param u32 U32 of which to reverse the bits. * * \return Value resulting from \a u32 with reversed bits. */ #if (defined __GNUC__) #define bit_reverse32(u32) \ (\ {\ unsigned int __value = (U32)(u32);\ __asm__ ("brev\t%0" : "+r" (__value) : : "cc");\ (U32)__value;\ }\ ) #elif (defined __ICCAVR32__) #define bit_reverse32(u32) ((U32)__bit_reverse((U32)(u32))) #endif /*! \brief Reverses the bits of \a u64. * * \param u64 U64 of which to reverse the bits. * * \return Value resulting from \a u64 with reversed bits. */ #define bit_reverse64(u64) ((U64)(((U64)bit_reverse32((U64)(u64) >> 32)) |\ ((U64)bit_reverse32((U64)(u64)) << 32))) //! @} /*! \name Alignment */ //! @{ /*! \brief Tests alignment of the number \a val with the \a n boundary. * * \param val Input value. * \param n Boundary. * * \return \c 1 if the number \a val is aligned with the \a n boundary, else \c 0. */ #define Test_align(val, n ) (!Tst_bits( val, (n) - 1 ) ) /*! \brief Gets alignment of the number \a val with respect to the \a n boundary. * * \param val Input value. * \param n Boundary. * * \return Alignment of the number \a val with respect to the \a n boundary. */ #define Get_align( val, n ) ( Rd_bits( val, (n) - 1 ) ) /*! \brief Sets alignment of the lvalue number \a lval to \a alg with respect to the \a n boundary. * * \param lval Input/output lvalue. * \param n Boundary. * \param alg Alignment. * * \return New value of \a lval resulting from its alignment set to \a alg with respect to the \a n boundary. */ #define Set_align(lval, n, alg) ( Wr_bits(lval, (n) - 1, alg) ) /*! \brief Aligns the number \a val with the upper \a n boundary. * * \param val Input value. * \param n Boundary. * * \return Value resulting from the number \a val aligned with the upper \a n boundary. */ #define Align_up( val, n ) (((val) + ((n) - 1)) & ~((n) - 1)) /*! \brief Aligns the number \a val with the lower \a n boundary. * * \param val Input value. * \param n Boundary. * * \return Value resulting from the number \a val aligned with the lower \a n boundary. */ #define Align_down(val, n ) ( (val) & ~((n) - 1)) //! @} /*! \name Mathematics * * The same considerations as for clz and ctz apply here but AVR32-GCC does not * provide built-in functions to access the assembly instructions abs, min and * max and it does not produce them by itself in most cases, so two sets of * macros are defined here: * - Abs, Min and Max to apply to constant expressions (values known at * compile time); * - abs, min and max to apply to non-constant expressions (values unknown at * compile time). */ //! @{ /*! \brief Takes the absolute value of \a a. * * \param a Input value. * * \return Absolute value of \a a. * * \note More optimized if only used with values known at compile time. */ #define Abs(a) (((a) < 0 ) ? -(a) : (a)) /*! \brief Takes the minimal value of \a a and \a b. * * \param a Input value. * \param b Input value. * * \return Minimal value of \a a and \a b. * * \note More optimized if only used with values known at compile time. */ #define Min(a, b) (((a) < (b)) ? (a) : (b)) /*! \brief Takes the maximal value of \a a and \a b. * * \param a Input value. * \param b Input value. * * \return Maximal value of \a a and \a b. * * \note More optimized if only used with values known at compile time. */ #define Max(a, b) (((a) > (b)) ? (a) : (b)) /*! \brief Takes the absolute value of \a a. * * \param a Input value. * * \return Absolute value of \a a. * * \note More optimized if only used with values unknown at compile time. */ #if (defined __GNUC__) #define abs(a) \ (\ {\ int __value = (a);\ __asm__ ("abs\t%0" : "+r" (__value) : : "cc");\ __value;\ }\ ) #elif (defined __ICCAVR32__) #define abs(a) Abs(a) #endif /*! \brief Takes the minimal value of \a a and \a b. * * \param a Input value. * \param b Input value. * * \return Minimal value of \a a and \a b. * * \note More optimized if only used with values unknown at compile time. */ #if (defined __GNUC__) #define min(a, b) \ (\ {\ int __value, __arg_a = (a), __arg_b = (b);\ __asm__ ("min\t%0, %1, %2" : "=r" (__value) : "r" (__arg_a), "r" (__arg_b));\ __value;\ }\ ) #elif (defined __ICCAVR32__) #define min(a, b) __min(a, b) #endif /*! \brief Takes the maximal value of \a a and \a b. * * \param a Input value. * \param b Input value. * * \return Maximal value of \a a and \a b. * * \note More optimized if only used with values unknown at compile time. */ #if (defined __GNUC__) #define max(a, b) \ (\ {\ int __value, __arg_a = (a), __arg_b = (b);\ __asm__ ("max\t%0, %1, %2" : "=r" (__value) : "r" (__arg_a), "r" (__arg_b));\ __value;\ }\ ) #elif (defined __ICCAVR32__) #define max(a, b) __max(a, b) #endif //! @} /*! \brief Calls the routine at address \a addr. * * It generates a long call opcode. * * For example, `Long_call(0x80000000)' generates a software reset on a UC3 if * it is invoked from the CPU supervisor mode. * * \param addr Address of the routine to call. * * \note It may be used as a long jump opcode in some special cases. */ #define Long_call(addr) ((*(void (*)(void))(addr))()) /*! \brief Resets the CPU by software. * * \warning It shall not be called from the CPU application mode. */ #if (defined __GNUC__) #define Reset_CPU() \ (\ {\ __asm__ __volatile__ (\ "lddpc r9, 3f\n\t"\ "mfsr r8, %[SR]\n\t"\ "bfextu r8, r8, %[SR_M_OFFSET], %[SR_M_SIZE]\n\t"\ "cp.w r8, 0b001\n\t"\ "breq 0f\n\t"\ "sub r8, pc, $ - 1f\n\t"\ "pushm r8-r9\n\t"\ "rete\n"\ "0:\n\t"\ "mtsr %[SR], r9\n"\ "1:\n\t"\ "mov r0, 0\n\t"\ "mov r1, 0\n\t"\ "mov r2, 0\n\t"\ "mov r3, 0\n\t"\ "mov r4, 0\n\t"\ "mov r5, 0\n\t"\ "mov r6, 0\n\t"\ "mov r7, 0\n\t"\ "mov r8, 0\n\t"\ "mov r9, 0\n\t"\ "mov r10, 0\n\t"\ "mov r11, 0\n\t"\ "mov r12, 0\n\t"\ "mov sp, 0\n\t"\ "stdsp sp[0], sp\n\t"\ "ldmts sp, sp\n\t"\ "mov lr, 0\n\t"\ "lddpc pc, 2f\n\t"\ ".balign 4\n"\ "2:\n\t"\ ".word _start\n"\ "3:\n\t"\ ".word %[RESET_SR]"\ :\ : [SR] "i" (AVR32_SR),\ [SR_M_OFFSET] "i" (AVR32_SR_M_OFFSET),\ [SR_M_SIZE] "i" (AVR32_SR_M_SIZE),\ [RESET_SR] "i" (AVR32_SR_GM_MASK | AVR32_SR_EM_MASK | (AVR32_SR_M_SUP << AVR32_SR_M_OFFSET))\ );\ }\ ) #elif (defined __ICCAVR32__) #define Reset_CPU() \ {\ extern void *volatile __program_start;\ __asm__ __volatile__ (\ "mov r7, LWRD(__program_start)\n\t"\ "orh r7, HWRD(__program_start)\n\t"\ "mov r9, LWRD("ASTRINGZ(AVR32_SR_GM_MASK | AVR32_SR_EM_MASK | (AVR32_SR_M_SUP << AVR32_SR_M_OFFSET))")\n\t"\ "orh r9, HWRD("ASTRINGZ(AVR32_SR_GM_MASK | AVR32_SR_EM_MASK | (AVR32_SR_M_SUP << AVR32_SR_M_OFFSET))")\n\t"\ "mfsr r8, "ASTRINGZ(AVR32_SR)"\n\t"\ "bfextu r8, r8, "ASTRINGZ(AVR32_SR_M_OFFSET)", "ASTRINGZ(AVR32_SR_M_SIZE)"\n\t"\ "cp.w r8, 001b\n\t"\ "breq $ + 10\n\t"\ "sub r8, pc, -12\n\t"\ "pushm r8-r9\n\t"\ "rete\n\t"\ "mtsr "ASTRINGZ(AVR32_SR)", r9\n\t"\ "mov r0, 0\n\t"\ "mov r1, 0\n\t"\ "mov r2, 0\n\t"\ "mov r3, 0\n\t"\ "mov r4, 0\n\t"\ "mov r5, 0\n\t"\ "mov r6, 0\n\t"\ "st.w r0[4], r7\n\t"\ "mov r7, 0\n\t"\ "mov r8, 0\n\t"\ "mov r9, 0\n\t"\ "mov r10, 0\n\t"\ "mov r11, 0\n\t"\ "mov r12, 0\n\t"\ "mov sp, 0\n\t"\ "stdsp sp[0], sp\n\t"\ "ldmts sp, sp\n\t"\ "mov lr, 0\n\t"\ "ld.w pc, lr[4]"\ );\ __program_start;\ } #endif /*! \name System Register Access */ //! @{ /*! \brief Gets the value of the \a sysreg system register. * * \param sysreg Address of the system register of which to get the value. * * \return Value of the \a sysreg system register. */ #if (defined __GNUC__) #define Get_system_register(sysreg) __builtin_mfsr(sysreg) #elif (defined __ICCAVR32__) #define Get_system_register(sysreg) __get_system_register(sysreg) #endif /*! \brief Sets the value of the \a sysreg system register to \a value. * * \param sysreg Address of the system register of which to set the value. * \param value Value to set the \a sysreg system register to. */ #if (defined __GNUC__) #define Set_system_register(sysreg, value) __builtin_mtsr(sysreg, value) #elif (defined __ICCAVR32__) #define Set_system_register(sysreg, value) __set_system_register(sysreg, value) #endif //! @} /*! \name CPU Status Register Access */ //! @{ /*! \brief Tells whether exceptions are globally enabled. * * \return \c 1 if exceptions are globally enabled, else \c 0. */ #define Is_global_exception_enabled() (!Tst_bits(Get_system_register(AVR32_SR), AVR32_SR_EM_MASK)) /*! \brief Disables exceptions globally. */ #if (defined __GNUC__) #define Disable_global_exception() ({__asm__ __volatile__ ("ssrf\t%0" : : "i" (AVR32_SR_EM_OFFSET));}) #elif (defined __ICCAVR32__) #define Disable_global_exception() (__set_status_flag(AVR32_SR_EM_OFFSET)) #endif /*! \brief Enables exceptions globally. */ #if (defined __GNUC__) #define Enable_global_exception() ({__asm__ __volatile__ ("csrf\t%0" : : "i" (AVR32_SR_EM_OFFSET));}) #elif (defined __ICCAVR32__) #define Enable_global_exception() (__clear_status_flag(AVR32_SR_EM_OFFSET)) #endif /*! \brief Tells whether interrupts are globally enabled. * * \return \c 1 if interrupts are globally enabled, else \c 0. */ #define Is_global_interrupt_enabled() (!Tst_bits(Get_system_register(AVR32_SR), AVR32_SR_GM_MASK)) /*! \brief Disables interrupts globally. */ #if (defined __GNUC__) #define Disable_global_interrupt() ({__asm__ __volatile__ ("ssrf\t%0" : : "i" (AVR32_SR_GM_OFFSET));}) #elif (defined __ICCAVR32__) #define Disable_global_interrupt() (__disable_interrupt()) #endif /*! \brief Enables interrupts globally. */ #if (defined __GNUC__) #define Enable_global_interrupt() ({__asm__ __volatile__ ("csrf\t%0" : : "i" (AVR32_SR_GM_OFFSET));}) #elif (defined __ICCAVR32__) #define Enable_global_interrupt() (__enable_interrupt()) #endif /*! \brief Tells whether interrupt level \a int_level is enabled. * * \param int_level Interrupt level (0 to 3). * * \return \c 1 if interrupt level \a int_level is enabled, else \c 0. */ #define Is_interrupt_level_enabled(int_level) (!Tst_bits(Get_system_register(AVR32_SR), TPASTE3(AVR32_SR_I, int_level, M_MASK))) /*! \brief Disables interrupt level \a int_level. * * \param int_level Interrupt level to disable (0 to 3). */ #if (defined __GNUC__) #define Disable_interrupt_level(int_level) ({__asm__ __volatile__ ("ssrf\t%0" : : "i" (TPASTE3(AVR32_SR_I, int_level, M_OFFSET)));}) #elif (defined __ICCAVR32__) #define Disable_interrupt_level(int_level) (__set_status_flag(TPASTE3(AVR32_SR_I, int_level, M_OFFSET))) #endif /*! \brief Enables interrupt level \a int_level. * * \param int_level Interrupt level to enable (0 to 3). */ #if (defined __GNUC__) #define Enable_interrupt_level(int_level) ({__asm__ __volatile__ ("csrf\t%0" : : "i" (TPASTE3(AVR32_SR_I, int_level, M_OFFSET)));}) #elif (defined __ICCAVR32__) #define Enable_interrupt_level(int_level) (__clear_status_flag(TPASTE3(AVR32_SR_I, int_level, M_OFFSET))) #endif /*! \brief Protects subsequent code from interrupts. */ #define AVR32_ENTER_CRITICAL_REGION( ) \ { \ Bool global_interrupt_enabled = Is_global_interrupt_enabled(); \ Disable_global_interrupt(); // Disable the appropriate interrupts. /*! \brief This macro must always be used in conjunction with AVR32_ENTER_CRITICAL_REGION * so that interrupts are enabled again. */ #define AVR32_LEAVE_CRITICAL_REGION( ) \ if (global_interrupt_enabled) Enable_global_interrupt(); \ } //! @} /*! \name Debug Register Access */ //! @{ /*! \brief Gets the value of the \a dbgreg debug register. * * \param dbgreg Address of the debug register of which to get the value. * * \return Value of the \a dbgreg debug register. */ #if (defined __GNUC__) #define Get_debug_register(dbgreg) __builtin_mfdr(dbgreg) #elif (defined __ICCAVR32__) #define Get_debug_register(dbgreg) __get_debug_register(dbgreg) #endif /*! \brief Sets the value of the \a dbgreg debug register to \a value. * * \param dbgreg Address of the debug register of which to set the value. * \param value Value to set the \a dbgreg debug register to. */ #if (defined __GNUC__) #define Set_debug_register(dbgreg, value) __builtin_mtdr(dbgreg, value) #elif (defined __ICCAVR32__) #define Set_debug_register(dbgreg, value) __set_debug_register(dbgreg, value) #endif //! @} #endif // __AVR32_ABI_COMPILER__ //! Boolean evaluating MCU little endianism. #if ((defined __GNUC__) && (defined __AVR32__)) || ((defined __ICCAVR32__) || (defined __AAVR32__)) #define LITTLE_ENDIAN_MCU FALSE #else #error If you are here, you should check what is exactly the processor you are using... #define LITTLE_ENDIAN_MCU FALSE #endif // Check that MCU endianism is correctly defined. #ifndef LITTLE_ENDIAN_MCU #error YOU MUST define the MCU endianism with LITTLE_ENDIAN_MCU: either FALSE or TRUE #endif //! Boolean evaluating MCU big endianism. #define BIG_ENDIAN_MCU (!LITTLE_ENDIAN_MCU) #ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling. /*! \name MCU Endianism Handling */ //! @{ #if (LITTLE_ENDIAN_MCU==TRUE) #define LSB(u16) (((U8 *)&(u16))[0]) //!< Least significant byte of \a u16. #define MSB(u16) (((U8 *)&(u16))[1]) //!< Most significant byte of \a u16. #define LSH(u32) (((U16 *)&(u32))[0]) //!< Least significant half-word of \a u32. #define MSH(u32) (((U16 *)&(u32))[1]) //!< Most significant half-word of \a u32. #define LSB0W(u32) (((U8 *)&(u32))[0]) //!< Least significant byte of 1st rank of \a u32. #define LSB1W(u32) (((U8 *)&(u32))[1]) //!< Least significant byte of 2nd rank of \a u32. #define LSB2W(u32) (((U8 *)&(u32))[2]) //!< Least significant byte of 3rd rank of \a u32. #define LSB3W(u32) (((U8 *)&(u32))[3]) //!< Least significant byte of 4th rank of \a u32. #define MSB3W(u32) LSB0W(u32) //!< Most significant byte of 4th rank of \a u32. #define MSB2W(u32) LSB1W(u32) //!< Most significant byte of 3rd rank of \a u32. #define MSB1W(u32) LSB2W(u32) //!< Most significant byte of 2nd rank of \a u32. #define MSB0W(u32) LSB3W(u32) //!< Most significant byte of 1st rank of \a u32. #define LSW(u64) (((U32 *)&(u64))[0]) //!< Least significant word of \a u64. #define MSW(u64) (((U32 *)&(u64))[1]) //!< Most significant word of \a u64. #define LSH0(u64) (((U16 *)&(u64))[0]) //!< Least significant half-word of 1st rank of \a u64. #define LSH1(u64) (((U16 *)&(u64))[1]) //!< Least significant half-word of 2nd rank of \a u64. #define LSH2(u64) (((U16 *)&(u64))[2]) //!< Least significant half-word of 3rd rank of \a u64. #define LSH3(u64) (((U16 *)&(u64))[3]) //!< Least significant half-word of 4th rank of \a u64. #define MSH3(u64) LSH0(u64) //!< Most significant half-word of 4th rank of \a u64. #define MSH2(u64) LSH1(u64) //!< Most significant half-word of 3rd rank of \a u64. #define MSH1(u64) LSH2(u64) //!< Most significant half-word of 2nd rank of \a u64. #define MSH0(u64) LSH3(u64) //!< Most significant half-word of 1st rank of \a u64. #define LSB0D(u64) (((U8 *)&(u64))[0]) //!< Least significant byte of 1st rank of \a u64. #define LSB1D(u64) (((U8 *)&(u64))[1]) //!< Least significant byte of 2nd rank of \a u64. #define LSB2D(u64) (((U8 *)&(u64))[2]) //!< Least significant byte of 3rd rank of \a u64. #define LSB3D(u64) (((U8 *)&(u64))[3]) //!< Least significant byte of 4th rank of \a u64. #define LSB4D(u64) (((U8 *)&(u64))[4]) //!< Least significant byte of 5th rank of \a u64. #define LSB5D(u64) (((U8 *)&(u64))[5]) //!< Least significant byte of 6th rank of \a u64. #define LSB6D(u64) (((U8 *)&(u64))[6]) //!< Least significant byte of 7th rank of \a u64. #define LSB7D(u64) (((U8 *)&(u64))[7]) //!< Least significant byte of 8th rank of \a u64. #define MSB7D(u64) LSB0D(u64) //!< Most significant byte of 8th rank of \a u64. #define MSB6D(u64) LSB1D(u64) //!< Most significant byte of 7th rank of \a u64. #define MSB5D(u64) LSB2D(u64) //!< Most significant byte of 6th rank of \a u64. #define MSB4D(u64) LSB3D(u64) //!< Most significant byte of 5th rank of \a u64. #define MSB3D(u64) LSB4D(u64) //!< Most significant byte of 4th rank of \a u64. #define MSB2D(u64) LSB5D(u64) //!< Most significant byte of 3rd rank of \a u64. #define MSB1D(u64) LSB6D(u64) //!< Most significant byte of 2nd rank of \a u64. #define MSB0D(u64) LSB7D(u64) //!< Most significant byte of 1st rank of \a u64. #elif (BIG_ENDIAN_MCU==TRUE) #define MSB(u16) (((U8 *)&(u16))[0]) //!< Most significant byte of \a u16. #define LSB(u16) (((U8 *)&(u16))[1]) //!< Least significant byte of \a u16. #define MSH(u32) (((U16 *)&(u32))[0]) //!< Most significant half-word of \a u32. #define LSH(u32) (((U16 *)&(u32))[1]) //!< Least significant half-word of \a u32. #define MSB0W(u32) (((U8 *)&(u32))[0]) //!< Most significant byte of 1st rank of \a u32. #define MSB1W(u32) (((U8 *)&(u32))[1]) //!< Most significant byte of 2nd rank of \a u32. #define MSB2W(u32) (((U8 *)&(u32))[2]) //!< Most significant byte of 3rd rank of \a u32. #define MSB3W(u32) (((U8 *)&(u32))[3]) //!< Most significant byte of 4th rank of \a u32. #define LSB3W(u32) MSB0W(u32) //!< Least significant byte of 4th rank of \a u32. #define LSB2W(u32) MSB1W(u32) //!< Least significant byte of 3rd rank of \a u32. #define LSB1W(u32) MSB2W(u32) //!< Least significant byte of 2nd rank of \a u32. #define LSB0W(u32) MSB3W(u32) //!< Least significant byte of 1st rank of \a u32. #define MSW(u64) (((U32 *)&(u64))[0]) //!< Most significant word of \a u64. #define LSW(u64) (((U32 *)&(u64))[1]) //!< Least significant word of \a u64. #define MSH0(u64) (((U16 *)&(u64))[0]) //!< Most significant half-word of 1st rank of \a u64. #define MSH1(u64) (((U16 *)&(u64))[1]) //!< Most significant half-word of 2nd rank of \a u64. #define MSH2(u64) (((U16 *)&(u64))[2]) //!< Most significant half-word of 3rd rank of \a u64. #define MSH3(u64) (((U16 *)&(u64))[3]) //!< Most significant half-word of 4th rank of \a u64. #define LSH3(u64) MSH0(u64) //!< Least significant half-word of 4th rank of \a u64. #define LSH2(u64) MSH1(u64) //!< Least significant half-word of 3rd rank of \a u64. #define LSH1(u64) MSH2(u64) //!< Least significant half-word of 2nd rank of \a u64. #define LSH0(u64) MSH3(u64) //!< Least significant half-word of 1st rank of \a u64. #define MSB0D(u64) (((U8 *)&(u64))[0]) //!< Most significant byte of 1st rank of \a u64. #define MSB1D(u64) (((U8 *)&(u64))[1]) //!< Most significant byte of 2nd rank of \a u64. #define MSB2D(u64) (((U8 *)&(u64))[2]) //!< Most significant byte of 3rd rank of \a u64. #define MSB3D(u64) (((U8 *)&(u64))[3]) //!< Most significant byte of 4th rank of \a u64. #define MSB4D(u64) (((U8 *)&(u64))[4]) //!< Most significant byte of 5th rank of \a u64. #define MSB5D(u64) (((U8 *)&(u64))[5]) //!< Most significant byte of 6th rank of \a u64. #define MSB6D(u64) (((U8 *)&(u64))[6]) //!< Most significant byte of 7th rank of \a u64. #define MSB7D(u64) (((U8 *)&(u64))[7]) //!< Most significant byte of 8th rank of \a u64. #define LSB7D(u64) MSB0D(u64) //!< Least significant byte of 8th rank of \a u64. #define LSB6D(u64) MSB1D(u64) //!< Least significant byte of 7th rank of \a u64. #define LSB5D(u64) MSB2D(u64) //!< Least significant byte of 6th rank of \a u64. #define LSB4D(u64) MSB3D(u64) //!< Least significant byte of 5th rank of \a u64. #define LSB3D(u64) MSB4D(u64) //!< Least significant byte of 4th rank of \a u64. #define LSB2D(u64) MSB5D(u64) //!< Least significant byte of 3rd rank of \a u64. #define LSB1D(u64) MSB6D(u64) //!< Least significant byte of 2nd rank of \a u64. #define LSB0D(u64) MSB7D(u64) //!< Least significant byte of 1st rank of \a u64. #else #error Unknown endianism. #endif //! @} /*! \name Endianism Conversion * * The same considerations as for clz and ctz apply here but AVR32-GCC's * __builtin_bswap_16 and __builtin_bswap_32 do not behave like macros when * applied to constant expressions, so two sets of macros are defined here: * - Swap16, Swap32 and Swap64 to apply to constant expressions (values known * at compile time); * - swap16, swap32 and swap64 to apply to non-constant expressions (values * unknown at compile time). */ //! @{ /*! \brief Toggles the endianism of \a u16 (by swapping its bytes). * * \param u16 U16 of which to toggle the endianism. * * \return Value resulting from \a u16 with toggled endianism. * * \note More optimized if only used with values known at compile time. */ #define Swap16(u16) ((U16)(((U16)(u16) >> 8) |\ ((U16)(u16) << 8))) /*! \brief Toggles the endianism of \a u32 (by swapping its bytes). * * \param u32 U32 of which to toggle the endianism. * * \return Value resulting from \a u32 with toggled endianism. * * \note More optimized if only used with values known at compile time. */ #define Swap32(u32) ((U32)(((U32)Swap16((U32)(u32) >> 16)) |\ ((U32)Swap16((U32)(u32)) << 16))) /*! \brief Toggles the endianism of \a u64 (by swapping its bytes). * * \param u64 U64 of which to toggle the endianism. * * \return Value resulting from \a u64 with toggled endianism. * * \note More optimized if only used with values known at compile time. */ #define Swap64(u64) ((U64)(((U64)Swap32((U64)(u64) >> 32)) |\ ((U64)Swap32((U64)(u64)) << 32))) /*! \brief Toggles the endianism of \a u16 (by swapping its bytes). * * \param u16 U16 of which to toggle the endianism. * * \return Value resulting from \a u16 with toggled endianism. * * \note More optimized if only used with values unknown at compile time. */ #if (defined __GNUC__) #define swap16(u16) ((U16)__builtin_bswap_16((U16)(u16))) #elif (defined __ICCAVR32__) #define swap16(u16) ((U16)__swap_bytes_in_halfwords((U16)(u16))) #endif /*! \brief Toggles the endianism of \a u32 (by swapping its bytes). * * \param u32 U32 of which to toggle the endianism. * * \return Value resulting from \a u32 with toggled endianism. * * \note More optimized if only used with values unknown at compile time. */ #if (defined __GNUC__) #define swap32(u32) ((U32)__builtin_bswap_32((U32)(u32))) #elif (defined __ICCAVR32__) #define swap32(u32) ((U32)__swap_bytes((U32)(u32))) #endif /*! \brief Toggles the endianism of \a u64 (by swapping its bytes). * * \param u64 U64 of which to toggle the endianism. * * \return Value resulting from \a u64 with toggled endianism. * * \note More optimized if only used with values unknown at compile time. */ #define swap64(u64) ((U64)(((U64)swap32((U64)(u64) >> 32)) |\ ((U64)swap32((U64)(u64)) << 32))) //! @} /*! \name Target Abstraction */ //! @{ #define _GLOBEXT_ extern //!< extern storage-class specifier. #define _CONST_TYPE_ const //!< const type qualifier. #define _MEM_TYPE_SLOW_ //!< Slow memory type. #define _MEM_TYPE_MEDFAST_ //!< Fairly fast memory type. #define _MEM_TYPE_FAST_ //!< Fast memory type. typedef U8 Byte; //!< 8-bit unsigned integer. #define memcmp_ram2ram memcmp //!< Target-specific memcmp of RAM to RAM. #define memcmp_code2ram memcmp //!< Target-specific memcmp of RAM to NVRAM. #define memcpy_ram2ram memcpy //!< Target-specific memcpy from RAM to RAM. #define memcpy_code2ram memcpy //!< Target-specific memcpy from NVRAM to RAM. #define LSB0(u32) LSB0W(u32) //!< Least significant byte of 1st rank of \a u32. #define LSB1(u32) LSB1W(u32) //!< Least significant byte of 2nd rank of \a u32. #define LSB2(u32) LSB2W(u32) //!< Least significant byte of 3rd rank of \a u32. #define LSB3(u32) LSB3W(u32) //!< Least significant byte of 4th rank of \a u32. #define MSB3(u32) MSB3W(u32) //!< Most significant byte of 4th rank of \a u32. #define MSB2(u32) MSB2W(u32) //!< Most significant byte of 3rd rank of \a u32. #define MSB1(u32) MSB1W(u32) //!< Most significant byte of 2nd rank of \a u32. #define MSB0(u32) MSB0W(u32) //!< Most significant byte of 1st rank of \a u32. //! @} #endif // __AVR32_ABI_COMPILER__ #endif // _COMPILER_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/conf_isp.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ****************************************************************** * * \brief ISP configuration file. * * This file contains the possible external configuration of the ISP. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a USB module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ***************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _CONF_ISP_H_ #define _CONF_ISP_H_ #include #include "compiler.h" //_____ D E F I N I T I O N S ______________________________________________ #define PRODUCT_MANUFACTURER_ID 0x58 #define PRODUCT_FAMILY_ID 0x20 #define ISP_VERSION 0x10 #define ISP_ID0 0x00 #define ISP_ID1 0x00 #define ISP_CFG1 (*(volatile U32 *)ISP_CFG1_ADDRESS) #define ISP_CFG1_ADDRESS (AVR32_FLASHC_USER_PAGE_ADDRESS + ISP_CFG1_OFFSET) #define ISP_CFG1_OFFSET 0x000001FC #define ISP_CFG1_SIZE 4 #define ISP_CFG1_BOOT_KEY1 16 #define ISP_CFG1_BOOT_KEY1_MASK 0xFFFF0000 #define ISP_CFG1_BOOT_KEY1_OFFSET 16 #define ISP_CFG1_BOOT_KEY1_SIZE 16 #define ISP_CFG1_BOOT_KEY1_VALUE 0xE11E #define ISP_CFG1_FORCE 9 #define ISP_CFG1_FORCE_MASK 0x00000200 #define ISP_CFG1_FORCE_OFFSET 9 #define ISP_CFG1_FORCE_SIZE 1 #define ISP_CFG1_IO_COND_EN 8 #define ISP_CFG1_IO_COND_EN_MASK 0x00000100 #define ISP_CFG1_IO_COND_EN_OFFSET 8 #define ISP_CFG1_IO_COND_EN_SIZE 1 #define ISP_CFG1_CRC8 0 #define ISP_CFG1_CRC8_MASK 0x000000FF #define ISP_CFG1_CRC8_OFFSET 0 #define ISP_CFG1_CRC8_SIZE 8 #define ISP_CFG1_CRC8_POLYNOMIAL 0x107 #define ISP_CFG2 (*(volatile U32 *)ISP_CFG2_ADDRESS) #define ISP_CFG2_ADDRESS (AVR32_FLASHC_USER_PAGE_ADDRESS + ISP_CFG2_OFFSET) #define ISP_CFG2_OFFSET 0x000001F8 #define ISP_CFG2_SIZE 4 #define ISP_CFG2_BOOT_KEY 17 #define ISP_CFG2_BOOT_KEY_MASK 0xFFFE0000 #define ISP_CFG2_BOOT_KEY_OFFSET 17 #define ISP_CFG2_BOOT_KEY_SIZE 15 #define ISP_CFG2_BOOT_KEY_VALUE 0x494F #define ISP_CFG2_IO_COND_LEVEL 16 #define ISP_CFG2_IO_COND_LEVEL_MASK 0x00010000 #define ISP_CFG2_IO_COND_LEVEL_OFFSET 16 #define ISP_CFG2_IO_COND_LEVEL_SIZE 1 #define ISP_CFG2_IO_COND_PIN 8 #define ISP_CFG2_IO_COND_PIN_MASK 0x0000FF00 #define ISP_CFG2_IO_COND_PIN_OFFSET 8 #define ISP_CFG2_IO_COND_PIN_SIZE 8 #define ISP_CFG2_CRC8 0 #define ISP_CFG2_CRC8_MASK 0x000000FF #define ISP_CFG2_CRC8_OFFSET 0 #define ISP_CFG2_CRC8_SIZE 8 #define ISP_CFG2_CRC8_POLYNOMIAL 0x107 #define ISP_KEY (*(volatile U32 *)ISP_KEY_ADDRESS) #define ISP_KEY_ADDRESS (AVR32_SRAM_ADDRESS + ISP_KEY_OFFSET) #define ISP_KEY_OFFSET 0x00000000 #define ISP_KEY_SIZE 4 #define ISP_KEY_VALUE ('I' << 24 | 'S' << 16 | 'P' << 8 | 'K') #ifndef ISP_OSC #define ISP_OSC 0 #endif #define DFU_FRAME_LENGTH 2048 #define PROGRAM_START_ADDRESS (AVR32_FLASH_ADDRESS + PROGRAM_START_OFFSET) #define PROGRAM_START_OFFSET 0x00002000 #endif // _CONF_ISP_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/parts.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Arch file for AVR32. * * This file defines common AVR32 UC3 series. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _ARCH_H_ #define _ARCH_H_ // UC3 A Series #define UC3A0 ( defined (__GNUC__) && \ ( defined (__AVR32_UC3A0128__) || \ defined (__AVR32_UC3A0256__) || \ defined (__AVR32_UC3A0512__) || \ defined (__AVR32_UC3A0512ES__))) \ ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ ( defined (__AT32UC3A0128__) || \ defined (__AT32UC3A0256__) || \ defined (__AT32UC3A0512__) || \ defined (__AT32UC3A0512ES__))) #define UC3A1 ( defined (__GNUC__) && \ ( defined (__AVR32_UC3A1128__) || \ defined (__AVR32_UC3A1256__) || \ defined (__AVR32_UC3A1512__) || \ defined (__AVR32_UC3A1512ES__))) \ ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ ( defined (__AT32UC3A1128__) || \ defined (__AT32UC3A1256__) || \ defined (__AT32UC3A1512__) || \ defined (__AT32UC3A1512ES__))) #define UC3A3 ( defined (__GNUC__) && \ ( defined (__AVR32_UC3A364__) || \ defined (__AVR32_UC3A364S__) || \ defined (__AVR32_UC3A3128__) || \ defined (__AVR32_UC3A3128S__) || \ defined (__AVR32_UC3A3256__) || \ defined (__AVR32_UC3A3256S__))) \ ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ ( defined (__AT32UC3A364__) || \ defined (__AT32UC3A364S__) || \ defined (__AT32UC3A3128__) || \ defined (__AT32UC3A3128S__) || \ defined (__AT32UC3A3256__) || \ defined (__AT32UC3A3256S__))) #define UC3A (UC3A0 || UC3A1 || UC3A3) // UC3 B Series #define UC3B0 ( defined (__GNUC__) && \ ( defined (__AVR32_UC3B064__) || \ defined (__AVR32_UC3B0128__) || \ defined (__AVR32_UC3B0256__) || \ defined (__AVR32_UC3B0256ES__) || \ defined (__AVR32_UC3B0512__) || \ defined (__AVR32_UC3B0512REVC_))) \ ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ ( defined (__AT32UC3B064__) || \ defined (__AT32UC3B0128__) || \ defined (__AT32UC3B0256__) || \ defined (__AT32UC3B0256ES__) || \ defined (__AT32UC3B0512__) || \ defined (__AT32UC3B0512REVC__))) #define UC3B1 ( defined (__GNUC__) && \ ( defined (__AVR32_UC3B164__) || \ defined (__AVR32_UC3B1128__) || \ defined (__AVR32_UC3B1256__) || \ defined (__AVR32_UC3B1256ES__) || \ defined (__AVR32_UC3B1512__) || \ defined (__AVR32_UC3B1512ES__))) \ ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ ( defined (__AT32UC3B164__) || \ defined (__AT32UC3B1128__) || \ defined (__AT32UC3B1256__) || \ defined (__AT32UC3B1256ES__) || \ defined (__AT32UC3B1512__) || \ defined (__AT32UC3B1512REVC__))) #define UC3B (UC3B0 || UC3B1 ) // UC3 C Series #define UC3C0 ( defined (__GNUC__) && \ ( defined (__AVR32_UC3C064C__) || \ defined (__AVR32_UC3C0128C__) || \ defined (__AVR32_UC3C0256C__) || \ defined (__AVR32_UC3C0512CREVC__))) \ ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ ( defined (__AT32UC3C064C__) || \ defined (__AT32UC3C0128C__) || \ defined (__AT32UC3C0256C__) || \ defined (__AT32UC3C0512C__))) #define UC3C1 ( defined (__GNUC__) && \ ( defined (__AVR32_UC3C164C__) || \ defined (__AVR32_UC3C1128C__) || \ defined (__AVR32_UC3C1256C__) || \ defined (__AVR32_UC3C1512CREVC__))) \ ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ ( defined (__AT32UC3C164C__) || \ defined (__AT32UC3C1128C__) || \ defined (__AT32UC3C1256C__) || \ defined (__AT32UC3C1512C__))) #define UC3C2 ( defined (__GNUC__) && \ ( defined (__AVR32_UC3C264C__) || \ defined (__AVR32_UC3C2128C__) || \ defined (__AVR32_UC3C2256C__) || \ defined (__AVR32_UC3C2512CREVC__))) \ ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ ( defined (__AT32UC3C264C__) || \ defined (__AT32UC3C2128C__) || \ defined (__AT32UC3C2256C__) || \ defined (__AT32UC3C2512C__))) #define UC3C (UC3C0 || UC3C1 || UC3C2) // UC3 L Device series #define UC3L0 ( defined (__GNUC__) && \ ( defined (__AVR32_UC3L016__) || \ defined (__AVR32_UC3L032__) || \ defined (__AVR32_UC3L064__) || \ defined (__AVR32_UC3L064REVB__))) \ ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ ( defined (__AT32UC3L016__) || \ defined (__AT32UC3L032__) || \ defined (__AT32UC3L064__) || \ defined (__AT32UC3L064REVB__))) #define UC3L1 ( defined (__GNUC__) && \ ( defined (__AVR32_UC3L116__) || \ defined (__AVR32_UC3L132__) || \ defined (__AVR32_UC3L164__))) \ ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ ( defined (__AT32UC3L116__) || \ defined (__AT32UC3L132__) || \ defined (__AT32UC3L164__))) #define UC3L2 ( defined (__GNUC__) && \ ( defined (__AVR32_UC3L216__) || \ defined (__AVR32_UC3L232__) || \ defined (__AVR32_UC3L264__))) \ ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ ( defined (__AT32UC3L216__) || \ defined (__AT32UC3L232__) || \ defined (__AT32UC3L264__))) #define UC3L3 ( defined (__GNUC__) && \ ( defined (__AVR32_UC3L316__) || \ defined (__AVR32_UC3L332__) || \ defined (__AVR32_UC3L364__))) \ ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ ( defined (__AT32UC3L316__) || \ defined (__AT32UC3L332__) || \ defined (__AT32UC3L364__))) #define UC3L (UC3L0 || UC3L1 || UC3L2 || UC3L3) #endif // _ARCH_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/ard_spi.c ================================================ /* * ard_spi.c * * Created on: May 27, 2010 * Author: mlf by Metodo2 srl */ //#define _APP_DEBUG_ #include #include "board.h" #include "gpio.h" #include "usart.h" #include "ard_spi.h" #include "ard_tcp.h" #include "wifi_spi.h" #include "wl_cm.h" #include "ard_utils.h" #include "intc.h" #include "spi.h" #include "debug.h" #include "delay.h" #include "eic.h" #include "timer.h" #include "lwip/dns.h" #include #include "util.h" #include "lwip/udp.h" #include "lwip_setup.h" extern const char* fwVersion; /*! \name USART Settings */ //! @{ #if BOARD == EVK1105 # define ARD_USART_SPI (&AVR32_USART1) # define ARD_USART_SPI_SCK_PIN AVR32_USART1_CLK_0_PIN # define ARD_USART_SPI_SCK_FUNCTION AVR32_USART1_CLK_0_FUNCTION # define ARD_USART_SPI_MISO_PIN AVR32_USART1_TXD_0_0_PIN # define ARD_USART_SPI_MISO_FUNCTION AVR32_USART1_TXD_0_0_FUNCTION # define ARD_USART_SPI_MOSI_PIN AVR32_USART1_RXD_0_0_PIN # define ARD_USART_SPI_MOSI_FUNCTION AVR32_USART1_RXD_0_0_FUNCTION # define ARD_USART_SPI_NSS_PIN AVR32_USART1_CTS_0_0_PIN # define ARD_USART_SPI_NSS_FUNCTION AVR32_USART1_CTS_0_0_FUNCTION # define ARD_USART_SPI_IRQ AVR32_USART1_IRQ #endif #if BOARD == ARDUINO # define ARD_SPI (&AVR32_SPI0) #define EXT_INT_PIN_LINE1 AVR32_EIC_EXTINT_5_PIN #define EXT_INT_FUNCTION_LINE1 AVR32_EIC_EXTINT_5_FUNCTION #define EXT_INT_LINE1 EXT_INT5 #define EXT_INT_IRQ_LINE1 AVR32_EIC_IRQ_5 #define EXT_INT_NB_LINES 1 #endif /* These defines should be adjusted to match the application */ /*! \brief CPU core speed in Hz */ #define CPUHZ 60000000 /*! \brief Number of bytes in the receive buffer when operating in slave mode */ #define BUFFERSIZE 64 /*! \brief A adjustable delay avoiding multiple requests on the switches */ //#define TIMEOUT 150000 #define TIMEOUT CPUHZ/200 /*! \brief Number of bits in each SPI package*/ #define SPI_BITS 8 /*! \brief SPI slave speed in Hz */ #define SPI_SLAVE_SPEED 1000000 #ifndef CMD_MAX_LEN #define CMD_MAX_LEN 1024 #endif #ifndef REPLY_MAX_LEN #define REPLY_MAX_LEN 1024 #endif #define _BUFFERSIZE 100 extern void tcp_debug_print_pcbs(void); extern bool ifStatus; extern bool scanNetCompleted; static char buf[CMD_MAX_LEN]; static char reply[REPLY_MAX_LEN]; static uint16_t cmdCorr = 0; static uint16_t count = 0; static uint16_t replyCount = 0; static cmd_spi_state_t state = SPI_CMD_IDLE; int receivedChars = 0; static uint8_t _receiveBuffer[_BUFFERSIZE]; bool startReply = false; bool end_write = false; //TODO only for debug // Signal indicating a new command is coming from SPI interface static volatile Bool startRecvCmdSignal = FALSE; #define MAX_CMD_NUM 36 typedef struct sCmd_spi_list{ cmd_spi_cb_t cb; char cmd_id; cmd_spi_rcb_t reply_cb; void* ctx; char flags; }tCmd_spi_list; static tCmd_spi_list cmd_spi_list[MAX_CMD_NUM] = { {0} }; #ifdef _SPI_STATS_ typedef struct sStatSpi { int timeoutIntErr; int timeoutErr; int txErr; int rxErr; int wrongFrame; int frameDisalign; int overrideFrame; int lastCmd; int lastError; unsigned long status; }tStatSpi; tStatSpi statSpi = {0}; void initStatSpi() { statSpi.lastCmd = 0; statSpi.lastError = 0; statSpi.status= 0; statSpi.txErr = 0; statSpi.rxErr = 0; statSpi.timeoutErr= 0; statSpi.timeoutIntErr= 0; statSpi.wrongFrame = 0; statSpi.frameDisalign = 0; statSpi.overrideFrame = 0; } void printStatSpi() { printk("totSpiCmds\t: 0x%x\n", cmdCorr); printk("lastCmd \t: 0x%x\n", statSpi.lastCmd); printk("lastErr \t: 0x%x\n", statSpi.lastError); printk("spiStatus\t: 0x%X\n", statSpi.status); printk("spiTxErr \t: 0x%x\n", statSpi.txErr); printk("spiRxErr \t: 0x%x\n", statSpi.rxErr); printk("spiTmoErr\t: 0x%x\n", statSpi.timeoutErr); printk("spiTmoIntErr\t: 0x%x\n", statSpi.timeoutIntErr); printk("wrongFrame\t: 0x%x\n", statSpi.wrongFrame); printk("disalFrame\t: 0x%x\n", statSpi.frameDisalign); printk("overrideFrame\t: 0x%x\n", statSpi.overrideFrame); } cmd_state_t cmd_statSpi(int argc, char* argv[], void* ctx) { printStatSpi(); return CMD_DONE; } cmd_state_t cmd_resetStatSpi(int argc, char* argv[], void* ctx) { initStatSpi(); return CMD_DONE; } #endif #define ARRAY_SIZE(a) sizeof(a) / sizeof(a[0]) #define RETURN_ERR(e) return (e==WL_SUCCESS) ? WIFI_SPI_ACK : WIFI_SPI_ERR; #define RESET_USART_CSR(usart) usart->cr = AVR32_USART_CR_RSTSTA_MASK; int result = WL_CONNECT_FAILED; //Store the result of the last operation void* mapSockTCP[MAX_SOCK_NUM][MAX_MODE_NUM]; //Udp RemoteIp and remote Port static tRemoteClient remoteClients[MAX_SOCK_NUM] = {{0,0}}; void setRemoteClient(uint16_t sock, uint32_t _ipaddr, uint16_t _port) { if (sock < MAX_SOCK_NUM) { remoteClients[sock].ipaddr = _ipaddr; remoteClients[sock].port = _port; } } tRemoteClient* getRemoteClient(uint16_t sock) { if (sock < MAX_SOCK_NUM) { return &remoteClients[sock]; } return NULL; } struct netif* ard_netif = NULL; // Network list retrived in the last scanNetwork static struct wl_network_list_t network_list = { 0 }; struct ip_addr _hostIpAddr; static bool hostIpAddrFound = false; void* getTTCP(uint8_t sock, uint8_t mode) { if (sock < MAX_SOCK_NUM) return mapSockTCP[sock][mode]; return NULL; } int getSock(void * _ttcp) { if (_ttcp != NULL) { int i = 0; for (; istart_time; uint32_t bytes = ttcp->mode == TTCP_MODE_TRANSMIT ? ttcp->nbuf * ttcp->buflen : ttcp->recved; if (ttcp->verbose) printk("\n"); printk("TTCP [%p]: %d bytes processed, %d.%d KB/s (%s/%s)\n", ttcp, bytes, bytes / ms, bytes % ms, ProtMode2Str(ttcp->udp), Mode2Str(ttcp->mode)); } #endif void showTTCPstatus() { printk("IF status: %s\n", (ifStatus) ? "UP":"DOWN"); printk("CONN status: %s\n", (_connected) ? "UP":"DOWN"); int i = 0; for (; iudp), Mode2Str(_ttcp->mode), ip2str(_ttcp->addr), _ttcp->port); if (_ttcp->udp == TCP_MODE) { int j = 0; for (; jtpcb[j]){ printk("[%d tpcp-%p]-Status:%d\n", j, _ttcp->tpcb[j], _ttcp->tpcb[j]->state); } } if (_ttcp->lpcb){ printk("[tlcp-%p]-Status:%d\n", _ttcp->lpcb, _ttcp->lpcb->state); } }else{ if (_ttcp->upcb){ struct ip_addr loc = _ttcp->upcb->local_ip; printk("[upcp-%p] flags:0x%x local:%s[0x%x]-%d\n", _ttcp->upcb, _ttcp->upcb->flags, ip2str(loc), loc, _ttcp->upcb->local_port); tRemoteClient remote = {0,0};; getRemoteData(i, ii, &remote); struct ip_addr ipaddr = { remote.ipaddr }; printk("remote:%s(0x%x)-%d\n", ip2str(ipaddr), remote.ipaddr, remote.port); } } //ard_tcp_print_stats(_ttcp); printk("Data avail:%s\n", isAvailTcpDataByte(i)?"YES":"NO"); printk("------------------------------\n"); } } } tcp_debug_print_pcbs(); } int write_stream(volatile avr32_spi_t *spi, const char *stream, uint16_t len) { uint16_t _len = 0; unsigned short dummy=0; do { //SIGN1_DN(); if (spi_write(spi, *stream) == SPI_ERROR_TIMEOUT) { #ifdef _SPI_STATS_ statSpi.timeoutErr++; statSpi.txErr++; statSpi.lastError = SPI_ERROR_TIMEOUT; statSpi.status = spi_getStatus(spi); #endif return SPI_ERROR_TIMEOUT; } else { stream++; _len++; spi_read(spi,&dummy); } //SIGN1_UP(); }while (_len < len); return SPI_OK; } void sendError() { AVAIL_FOR_SPI(); if (spi_write(&AVR32_SPI, ERR_CMD) != SPI_ERROR_TIMEOUT) { //Wait to empty the buffer while(!spi_writeRegisterEmptyCheck(&AVR32_SPI)); } BUSY_FOR_SPI(); WARN("Send SPI error!\n"); } #define ENABLE_SPI_INT() do { \ volatile avr32_spi_t *spi = ARD_SPI; \ Bool global_interrupt_enabled = Is_global_interrupt_enabled(); \ if (global_interrupt_enabled) Disable_global_interrupt(); \ spi->IER.rdrf = 1; spi->IER.rxbuff = 1; spi->IER.endrx = 1; \ if (global_interrupt_enabled) Enable_global_interrupt(); \ }while(0); #define DISABLE_SPI_INT() do { \ volatile avr32_spi_t *spi = ARD_SPI; \ Bool global_interrupt_enabled = Is_global_interrupt_enabled(); \ if (global_interrupt_enabled) Disable_global_interrupt(); \ spi->IDR.rdrf = 1; spi->IDR.rxbuff = 1; spi->IDR.endrx = 1; \ if (global_interrupt_enabled) Enable_global_interrupt(); \ }while(0); #define CLEAR_SPI_INT() do { \ eic_clear_interrupt_line(&AVR32_EIC, AVR32_SPI0_IRQ); \ }while(0); int spi_add_cmd(char _cmd_id, cmd_spi_cb_t cb, cmd_spi_rcb_t rcb, void* ctx, char flag) { U32 i; for (i = 0; i < ARRAY_SIZE(cmd_spi_list); i++) if (!cmd_spi_list[i].cb) break; if (i == ARRAY_SIZE(cmd_spi_list)) { printk("List Commands full!\n"); return -1; } cmd_spi_list[i].cmd_id = _cmd_id; cmd_spi_list[i].cb = cb; cmd_spi_list[i].reply_cb = rcb; cmd_spi_list[i].ctx = ctx; cmd_spi_list[i].flags = flag; return 0; } int set_net_cmd_cb(int numParam, char* buf, void* ctx) { struct wl_ssid_t ssid; wl_err_t err = WL_FAILURE; tParam* param = (tParam*) buf; if (param->paramLen < WL_SSID_MAX_LENGTH) { memcpy(ssid.ssid, ¶m->param, param->paramLen); ssid.len = param->paramLen; ssid.ssid[ssid.len] = 0; INFO_SPI("SSID:%s\n", ssid.ssid); //dump(ssid.ssid, ssid.len); err = wl_cm_set_network(&ssid, NULL); if (err != 1) WARN("err=%d\n", err); } else { WARN("SSID len out of range"); } return err; } extern uint8_t ascii_to_key(char *outp, const char *inp); int set_key_cmd_cb(int numParam, char* buf, void* ctx) { struct wl_ssid_t ssid; struct wl_mac_addr_t bssid; uint8_t idx=0, len=0; char key[13], key_hex[27]; char keyIdx[2]; wl_err_t err = WL_SUCCESS; tParam* params = (tParam*) buf; INFO_SPI("%s params=%d\n", __FUNCTION__, numParam); // SSID memset(&ssid, 0, sizeof ssid); if (params->paramLen < WL_SSID_MAX_LENGTH) { memcpy(ssid.ssid, ¶ms->param, params->paramLen); ssid.len = params->paramLen; INFO_SPI("%s\n", ssid.ssid); } else { //printk("SSID len out of range"); RETURN_ERR(WL_FAILURE) } params = (tParam*)((char*)buf+PARAM_LEN_SIZE+params->paramLen); strncpy(keyIdx, (const char*)¶ms->param, params->paramLen); keyIdx[(uint8_t)params->paramLen]='\0'; idx = (uint8_t)atoi(keyIdx); // KEY IDX if ((params->paramLen != 1)||(idx < 0)||(idx > 3)){ //printk("KEY IDX out of range %d\n", idx); RETURN_ERR(WL_FAILURE) } params = (tParam*)((char*)params+PARAM_LEN_SIZE+params->paramLen); strncpy(key_hex, (const char*)¶ms->param, params->paramLen); key_hex[(uint8_t)params->paramLen]='\0'; len = ascii_to_key(key, key_hex); // KEY if (( len != 5)&&(len != 13)) { //printk("KEY len out of range %d", len); RETURN_ERR(WL_FAILURE) } #if 0 printk("KEY IDX = %d\n", idx); dump(key, len); printk("KEY len %d\n", len); #endif memset(&bssid.octet, 0xff, sizeof bssid.octet); wl_add_wep_key(idx, len, key, &bssid); //wl_set_auth_mode(AUTH_MODE_SHARED_KEY); wl_set_default_wep_key(idx); //Connect err = wl_cm_set_network(&ssid, NULL); if (err != 1) WARN("err=%d\n", err); RETURN_ERR(err) } int set_passphrase_cmd_cb(int numParam, char* buf, void* ctx) { struct wl_network_t net; char pass[64]; wl_err_t err = WL_SUCCESS; tParam* params = (tParam*) buf; INFO_SPI("%s params=%d\n", __FUNCTION__, numParam); memset(&net, 0, sizeof net); memset(net.bssid.octet, 0xFF, sizeof net.bssid.octet); net.enc_type = ENC_TYPE_AUTO; // SSID if (params->paramLen < WL_SSID_MAX_LENGTH) { memcpy(net.ssid.ssid, ¶ms->param, params->paramLen); net.ssid.len = params->paramLen; INFO_SPI("%s %d\n", net.ssid.ssid, net.ssid.len); } else { //printk("SSID len out of range"); RETURN_ERR(WL_FAILURE) } params = (tParam*)((char*)buf+PARAM_LEN_SIZE+params->paramLen); // PASSPHRASE strncpy(pass, (const char*)¶ms->param, params->paramLen); pass[(uint8_t)params->paramLen]='\0'; INFO_SPI("Pass: %s %d\n", pass, params->paramLen); if (wl_set_passphrase(&net, pass, params->paramLen, ENC_TYPE_AUTO, AUTH_MODE_AUTO) != WL_SUCCESS) { WARN("%s : Failed to add passphrase\n", __func__); RETURN_ERR(WL_FAILURE) } printk("Connect to network..."); //Connect err = wl_cm_set_network(&net.ssid, NULL); if (err != 1) printk("err=%d\n", err); else printk("OK\n"); RETURN_ERR(err) } int set_ip_config_cmd_cb(int numParam, char* buf, void* ctx) { struct ip_addr lwip_addr; struct ctx_server *hs = ctx; struct net_cfg *ncfg = &(hs->net_cfg); struct netif *nif = ncfg->netif; uint8_t parmsToChange=0; const uint8_t MAX_IP_CONFIG_PARAMS = 3; wl_err_t err = WL_SUCCESS; tParam* params = (tParam*) buf; if (params->paramLen == 1) { GET_PARAM_NEXT(BYTE, params, _parmsToChange); parmsToChange = _parmsToChange; } else RETURN_ERR(WL_FAILURE) INFO_SPI("%p numParam=%d parmsToChange=%d\n", ctx, numParam, parmsToChange); if (parmsToChange <= MAX_IP_CONFIG_PARAMS) { int i=0; for (; iparamLen == 4) { GET_PARAM_NEXT(LONG, params, _ip_addr); lwip_addr.addr = _ip_addr; INFO_SPI("%d] nif:%p lwip_addr=0x%x\n", i, nif, lwip_addr.addr); switch (i) { case 0: // local_ip { netif_set_ipaddr(nif, &lwip_addr); break; } case 1: // gateway { netif_set_gw(nif, &lwip_addr); break; } case 2: // subnet { netif_set_netmask(nif, &lwip_addr); break; } } }else{ RETURN_ERR(WL_FAILURE) } } /* Disable DHCP */ ncfg->dhcp_enabled = STATIC_IP_CONFIG; }else RETURN_ERR(WL_FAILURE) RETURN_ERR(err) } int set_dns_config_cmd_cb(int numParam, char* buf, void* ctx) { struct ip_addr lwip_addr; struct ctx_server *hs = ctx; struct net_cfg *ncfg = &(hs->net_cfg); struct netif *nif = ncfg->netif; uint8_t parmsToChange=0; const uint8_t MAX_DNS_CONFIG_PARAMS = 2; wl_err_t err = WL_SUCCESS; tParam* params = (tParam*) buf; if (params->paramLen == 1) { GET_PARAM_NEXT(BYTE, params, _parmsToChange); parmsToChange = _parmsToChange; } else RETURN_ERR(WL_FAILURE) INFO_SPI("%p numParam=%d parmsToChange=%d\n", ctx, numParam, parmsToChange); if (parmsToChange <= MAX_DNS_CONFIG_PARAMS) { int i=0; for (; iparamLen == 4) { GET_PARAM_NEXT(LONG, params, _ip_addr); lwip_addr.addr = _ip_addr; INFO_SPI("%d] nif:%p lwip_addr=0x%x\n", i, nif, lwip_addr.addr); dns_setserver(i, &lwip_addr); }else{ RETURN_ERR(WL_FAILURE) } } /* Disable DHCP */ ncfg->dhcp_enabled = STATIC_IP_CONFIG; }else RETURN_ERR(WL_FAILURE) RETURN_ERR(err) } void set_result(wl_status_t _status) { result = _status; } void set_result_cmd(int err) { wl_err_t _err = (wl_err_t)err; switch (_err) { case WL_SUCCESS: set_result(WL_CONNECTED); ERROR_LED_OFF(); break; default: case WL_OOM: case WL_INVALID_LENGTH: case WL_NOT_SUPPORTED: case WL_ABSORBED: case WL_RESOURCES: case WL_BUSY: case WL_RETRY: case WL_FAILURE: set_result(WL_CONNECT_FAILED); ERROR_LED_ON(); break; } INFO_SPI("%s %d\n", __FUNCTION__, result); } extern int ttcp_start(struct ip_addr addr, uint16_t port, void *opaque, void *done_cb, int mode, uint16_t nbuf, uint16_t buflen, int udp, int verbose); int start_server_tcp(uint16_t port, uint8_t sock, uint8_t protMode) { struct ip_addr addr = { 0 }; uint16_t buflen = 1024; uint16_t nbuf = 1024; wl_err_t err = WL_FAILURE; #ifdef _APP_DEBUG_ int verbose = 1; #else int verbose = 0; #endif int udp = protMode; int mode = 1; //RECEIVE void* _ttcp = NULL; if (sock >= MAX_SOCK_NUM) return WIFI_SPI_ERR; if (_connected) { WARN("Still connected...wait\n"); return WIFI_SPI_ERR; } if (!ifStatus) { WARN_VER("IF down...wait\n"); return WIFI_SPI_ERR; } if (ard_tcp_start(addr, port, NULL, NULL, mode, nbuf, buflen, udp, verbose, sock, &_ttcp) == 0) { INFO_SPI("Start Server %s [%d, %d] OK!\n", ProtMode2Str(protMode), port, sock); setMapSock(sock, _ttcp); err = WL_SUCCESS; }else{ WARN("Start Server %s [%d, %d] FAILED!\n", ProtMode2Str(protMode), port, sock); clearMapSockTcp(sock, TTCP_MODE_RECEIVE); } return err; } int start_server_tcp_cmd_cb(int numParam, char* buf, void* ctx) { wl_err_t err = WL_FAILURE; tParam* params = (tParam*) buf; if (numParam == 3) { GET_PARAM_NEXT(INT, params, port); GET_PARAM_NEXT(BYTE, params, sock); GET_PARAM_NEXT(BYTE, params, protMode); err = start_server_tcp(port, sock, protMode); } return (err==WL_SUCCESS) ? WIFI_SPI_ACK : WIFI_SPI_ERR; } int start_client_tcp(uint32_t _addr, uint16_t port, uint8_t sock, uint8_t protMode) { uint16_t buflen = 1024; uint16_t nbuf = 1024; wl_err_t err = WL_FAILURE; struct ip_addr addr = { .addr = _addr}; INFO_SPI("Addr:0x%x, port:%d, sock:%d, prot:%s\n", _addr, port, sock, ProtMode2Str(protMode)); #ifdef _APP_DEBUG_ int verbose = 1; #else int verbose = 0; #endif int udp = protMode; int mode = 0; //TRANSMIT void* _ttcp = NULL; if (sock >= MAX_SOCK_NUM) return WIFI_SPI_ERR; // Check previous connection _ttcp = getTTCP(sock, TTCP_MODE_TRANSMIT); if (_ttcp != NULL) { WARN("Previous client %p not stopped !\n", _ttcp); ard_tcp_stop(_ttcp); clearMapSockTcp(sock, TTCP_MODE_TRANSMIT); } if (ard_tcp_start(addr, port, NULL, NULL, mode, nbuf, buflen, udp, verbose, sock, &_ttcp) == 0) { INFO_SPI("Start Client %s %p [0x%x, %d, %d] OK!\n", ProtMode2Str(protMode), _ttcp, addr, port, sock); setMapSock(sock, _ttcp); err = WL_SUCCESS; }else{ INFO_SPI("Start Client %s %p [0x%x, %d, %d] FAILED!\n", ProtMode2Str(protMode), _ttcp, addr, port, sock); clearMapSockTcp(sock, TTCP_MODE_TRANSMIT); } return err; } int start_client_tcp_cmd_cb(int numParam, char* buf, void* ctx) { wl_err_t err = WL_FAILURE; tParam* params = (tParam*) buf; if (numParam == 4) { GET_PARAM_NEXT(LONG, params, _addr); GET_PARAM_NEXT(INT, params, port); GET_PARAM_NEXT(BYTE, params, sock); GET_PARAM_NEXT(BYTE, params, protMode); err = start_client_tcp(_addr, port, sock, protMode); } return (err==WL_SUCCESS) ? WIFI_SPI_ACK : WIFI_SPI_ERR; } int stop_client_tcp_cmd_cb(int numParam, char* buf, void* ctx) { wl_err_t err = WL_FAILURE; tParam* params = (tParam*) buf; void* _ttcp = NULL; if (numParam == 1) { GET_PARAM_NEXT(BYTE, params, sock); INFO_SPI("Stop client sock:%d\n", sock); if (sock < MAX_SOCK_NUM) { _ttcp = getTTCP(sock, TTCP_MODE_TRANSMIT); ard_tcp_stop(_ttcp); err = WL_SUCCESS; } } return (err==WL_SUCCESS) ? WIFI_SPI_ACK : WIFI_SPI_ERR; } int insert_data_cmd_cb(int numParam, char* buf, void* ctx) { tDataParam* msg = (tDataParam*) buf; if ((numParam == 2)&&(msg->dataLen == 1)) { GET_DATA_BYTE(sock, buf+2); GET_DATA_INT(len, buf+3); //printk("tcp:%p buf:%p len:%d\n", getTTCP(sock), (uint8_t*)(buf+5), len); insertBuf(sock, (uint8_t*)(buf+5), len); } return WIFI_SPI_ACK; } int send_data_udp_cmd_cb(int numParam, char* buf, void* ctx) { wl_err_t err = WL_FAILURE; tParam* params = (tParam*) buf; if ((numParam == 1)&&(params->paramLen == 1)) { GET_PARAM_NEXT(BYTE, params, sock); uint16_t len = 0; uint8_t* p = mergeBuf(sock, NULL, &len); err = sendUdpData(getTTCP(sock, TTCP_MODE_TRANSMIT), p, len); clearBuf(sock); free(p); } return (err==WL_SUCCESS) ? WIFI_SPI_ACK : WIFI_SPI_ERR; } int send_data_tcp_cmd_cb(int numParam, char* buf, void* ctx) { wl_err_t err = WL_FAILURE; DATA_LED_ON(); tDataParam* msg = (tDataParam*) buf; if ((numParam == 2)&&(msg->dataLen == 1)) { GET_DATA_BYTE(sock, buf+2); GET_DATA_INT(len, buf+3); //printk("tcp:%p buf:%p len:%d\n", getTTCP(sock), (uint8_t*)(buf+5), len); err = sendTcpData(getTTCP(sock, TTCP_MODE_TRANSMIT), (uint8_t*)(buf+5), len); } DATA_LED_OFF(); return (err==WL_SUCCESS) ? WIFI_SPI_ACK : WIFI_SPI_ERR; } int ack_cmd_cb(int numParam, char* buf, void* ctx) { return WIFI_SPI_ACK; } int get_result_cmd_cb(int numParam, char* buf, void* ctx) { INFO_SPI("ifStatus:%d result:%d\n", ifStatus, result); return WIFI_SPI_ACK; } int disconnect_cmd_cb(int numParam, char* buf, void* ctx) { return ((wl_disconnect()==WL_SUCCESS)? WIFI_SPI_ACK : WIFI_SPI_ERR); } cmd_spi_state_t get_reply_cb(char* recv, char* reply, void* ctx, uint16_t* count) { CREATE_HEADER_REPLY(reply, recv, 1); reply[3] = 1; // paramLen if (ctx != NULL) { reply[4] = (*(uint8_t*)ctx); //param } else { reply[4] = (ifStatus)?WL_CONNECTED:result; //param } END_HEADER_REPLY(reply, 5, *count); //INFO_SPI("result:%d\n", result); return SPI_CMD_DONE; } cmd_spi_state_t ack_reply_cb(char* recv, char* reply, void* ctx, uint16_t* count) { CREATE_HEADER_REPLY(reply, recv, 1); reply[3] = 1; // paramLen if (ctx != NULL) { reply[4] = (*(uint8_t*) ctx != 1) ? WIFI_SPI_ERR : WIFI_SPI_ACK; //param } else { reply[4] = WIFI_SPI_ACK; //param } END_HEADER_REPLY(reply, 5, *count); return SPI_CMD_DONE; } cmd_spi_state_t get_reply_ipaddr_cb(char* recv, char* reply, void* ctx, uint16_t* count) { CHECK_ARD_NETIF(recv, reply, count); CREATE_HEADER_REPLY(reply, recv, 3); PUT_LONG_IN_BYTE_NO(ard_netif->ip_addr.addr, reply, 3); PUT_LONG_IN_BYTE_NO(ard_netif->netmask.addr, reply, 8); PUT_LONG_IN_BYTE_NO(ard_netif->gw.addr, reply, 13); END_HEADER_REPLY(reply, 18, *count); return SPI_CMD_DONE; } void getRemoteData(uint8_t sock, uint8_t mode, tRemoteClient* remoteData) { if ((sock>=0) && (sockudp == UDP_MODE)) { if (_ttcp->mode == TTCP_MODE_RECEIVE) { remoteData->ipaddr = getRemoteClient(sock)->ipaddr; remoteData->port = getRemoteClient(sock)->port; }else{ remoteData->ipaddr = (_ttcp->upcb) ? _ttcp->upcb->remote_ip.addr : 0; remoteData->port = (_ttcp->upcb) ? _ttcp->upcb->remote_port : 0; } } } } } cmd_spi_state_t get_reply_remote_data_cb(char* recv, char* reply, void* ctx, uint16_t* count) { CHECK_ARD_NETIF(recv, reply, count); DUMP_SPI_CMD(recv); GET_DATA_BYTE(sock, recv+4); CREATE_HEADER_REPLY(reply, recv, 2); tRemoteClient remoteData = {0,0}; //TODO pass the mode getRemoteData(sock, TTCP_MODE_RECEIVE, &remoteData); PUT_LONG_IN_BYTE_NO(remoteData.ipaddr, reply, 3); PUT_DATA_INT(remoteData.port, reply, 8); END_HEADER_REPLY(reply, 11, *count); return SPI_CMD_DONE; } void foundHostByName(const char *name, struct ip_addr *ipaddr, void *callback_arg) { _hostIpAddr.addr = (ipaddr)?ipaddr->addr:0xffffffff; INFO_SPI("foundHostByName: Found Host: name=%s ip=0x%x\n", name, _hostIpAddr.addr); hostIpAddrFound = true; } int req_reply_host_by_name_cb(int numParam, char* buf, void* ctx) { char hostName[DNS_MAX_NAME_LENGTH]; tParam* params = (tParam*) buf; // HostName if (params->paramLen < DNS_MAX_NAME_LENGTH) { memcpy(hostName, ¶ms->param, params->paramLen); hostName[params->paramLen]='\0'; } else { RETURN_ERR(WL_FAILURE) } INFO_SPI("Looking for Host: name=%s\n", hostName); _hostIpAddr.addr = 0; hostIpAddrFound = false; err_t err = dns_gethostbyname(hostName, &_hostIpAddr, foundHostByName, NULL); if (err == ERR_OK) { INFO_SPI("Found Host: name=%s ip=0x%x\n", hostName, _hostIpAddr.addr); hostIpAddrFound = true; RETURN_ERR(WL_SUCCESS) } RETURN_ERR(WL_FAILURE) } cmd_spi_state_t get_reply_host_by_name_cb(char* recv, char* reply, void* ctx, uint16_t* count) { u32_t addr = (hostIpAddrFound)?_hostIpAddr.addr : 0xffffffff; INFO_SPI("Searching for Host: ip=0x%x found=%d\n", addr, hostIpAddrFound); CHECK_ARD_NETIF(recv, reply, count); CREATE_HEADER_REPLY(reply, recv, 1); PUT_LONG_IN_BYTE_NO(addr, reply, 3); END_HEADER_REPLY(reply, 8, *count); return SPI_CMD_DONE; } cmd_spi_state_t get_reply_mac_cb(char* recv, char* reply, void* ctx, uint16_t* count) { CHECK_ARD_NETIF(recv, reply, count); CREATE_HEADER_REPLY(reply, recv, 1); reply[3] = WL_MAC_ADDR_LENGTH; uint8_t mac[WL_MAC_ADDR_LENGTH]; if (wl_get_mac_addr(mac) != WL_SUCCESS) { RETURN_ERR_REPLY(recv, reply, count); } //rotate the byte order reply[4]=mac[5]; reply[5]=mac[4]; reply[6]=mac[3]; reply[7]=mac[2]; reply[8]=mac[1]; reply[9]=mac[0]; END_HEADER_REPLY(reply, 10, *count); return SPI_CMD_DONE; } cmd_spi_state_t get_reply_curr_net_cb(char* recv, char* reply, void* ctx, uint16_t* count) { uint32_t type = (uint32_t)ctx; CHECK_ARD_NETIF(recv, reply, count); CREATE_HEADER_REPLY(reply, recv, 1); struct wl_network_t* net = wl_get_current_network(); uint8_t len = 0; if (net != NULL) { switch (type) { default: case GET_CURR_SSID_CMD: { len = net->ssid.len; PUT_BUFDATA_BYTE(net->ssid.ssid, len, reply, 3); break; } case GET_CURR_BSSID_CMD: { len = WL_MAC_ADDR_LENGTH; ; PUT_BUFDATA_BYTE_REV(net->bssid.octet, len, reply, 3); break; } case GET_CURR_RSSI_CMD: { len=sizeof(net->rssi); PUT_LONG_IN_BYTE_HO(net->rssi, reply, 3); //printk("RSSI:%d", net->rssi); break; } case GET_CURR_ENCT_CMD: { len = sizeof(net->enc_type); PUT_DATA_BYTE(net->enc_type, reply, 3); //printk("ENCT:%d", net->enc_type); break; } } }else{ PUT_DATA_BYTE(0, reply, 3); } END_HEADER_REPLY(reply, 3+len+1, *count); //dump(reply, *count); return SPI_CMD_DONE; } cmd_spi_state_t get_reply_idx_net_cb(char* recv, char* reply, void* ctx, uint16_t* count) { uint32_t type = (uint32_t)ctx; CHECK_ARD_NETIF(recv, reply, count); CREATE_HEADER_REPLY(reply, recv, 1); DUMP_SPI_CMD(recv); GET_DATA_BYTE(idx, recv+4); if (idx >= WL_NETWORKS_LIST_MAXNUM) { WARN("Index out of range: %d\n", idx); return SPI_CMD_DONE; } uint8_t len = 0; switch (type) { default: case GET_IDX_SSID_CMD: { len = network_list.net[idx]->ssid.len; PUT_BUFDATA_BYTE(network_list.net[idx]->ssid.ssid, len, reply, 3); INFO_UTIL("SSID:%s\n", network_list.net[idx]->ssid.ssid); break; } case GET_IDX_RSSI_CMD: { len = 4; PUT_LONG_IN_BYTE_HO(network_list.net[idx]->rssi, reply, 3); INFO_UTIL("RSSI:%d\n", network_list.net[idx]->rssi); break; } case GET_IDX_ENCT_CMD: { len = 1; PUT_DATA_BYTE(network_list.net[idx]->enc_type, reply, 3); INFO_UTIL("ENCT:%d\n", network_list.net[idx]->enc_type); break; } } END_HEADER_REPLY(reply, 3+len+1, *count); DUMP(reply, *count); return SPI_CMD_DONE; } static void copy_network_list(struct wl_network_list_t *dst, struct wl_network_list_t *src) { int i; for (i = 0; i < dst->cnt; i++) free(dst->net[i]); free(dst->net); dst->cnt = 0; if (src->cnt == 0) return; dst->net = calloc(1, src->cnt * sizeof(struct wl_network_t *)); if (dst->net == NULL) { printk("could not allocate all gui net array\n"); return; } for (i = 0; i < src->cnt; i++) { struct wl_network_t *net = src->net[i]; dst->net[i] = malloc(sizeof(*net)); if (dst->net[i] == NULL) { printk("could not allocate all gui nets\n"); return; } memcpy(dst->net[i], net, sizeof(*net)); dst->cnt++; } } int start_scan_net_cmd_cb(int numParam, char* buf, void* ctx) { wl_err_t err = WL_FAILURE; INFO_SPI("Start Network Scan %d\n", numParam); if (scanNetCompleted){ scanNetCompleted = false; err = wl_scan(); if (err != WL_SUCCESS) { // May be busy scanning already, no fatal error WARN("err=%d\n", err); err = WL_SUCCESS; } } return err; } cmd_spi_state_t get_reply_scan_networks_cb(char* recv, char* reply, void* ctx, uint16_t* count) { const int8_t SCAN_NOT_YET_COMPLETED = 0; if (!scanNetCompleted) { //return empty list with an error to retry CREATE_HEADER_REPLY(reply, recv, SCAN_NOT_YET_COMPLETED); END_HEADER_REPLY(reply, 3, *count); INFO_SPI("Scan not completed!\n"); return SPI_CMD_DONE; } int network_cnt = 0; struct wl_network_list_t* wl_network_list; wl_get_network_list(&wl_network_list); if (wl_network_list->cnt == 0) { CREATE_HEADER_REPLY(reply, recv, 0); END_HEADER_REPLY(reply, 3, *count); INFO_SPI("Networks not found!\n"); return SPI_CMD_DONE; } if (wl_network_list->cnt > WL_NETWORKS_LIST_MAXNUM) { network_cnt = WL_NETWORKS_LIST_MAXNUM ; } else{ network_cnt = wl_network_list->cnt ; } copy_network_list(&network_list, wl_network_list); CREATE_HEADER_REPLY(reply, recv, network_cnt); uint8_t start = 3; int ii = 0; for (; ii < network_cnt; ii++) { uint8_t len = network_list.net[ii]->ssid.len+1; network_list.net[ii]->ssid.ssid[network_list.net[ii]->ssid.len]=0; PUT_BUFDATA_BYTE(network_list.net[ii]->ssid.ssid, len, reply, start); start += len+1; INFO_SPI("%d - %s [%d]- %d - %d - 0x%x\n",ii, network_list.net[ii]->ssid.ssid, len, network_list.net[ii]->enc_type, network_list.net[ii]->rssi, network_list.net[ii]->bssid); } END_HEADER_REPLY(reply, start, *count); //DUMP(reply, *count); return SPI_CMD_DONE; } cmd_spi_state_t get_state_tcp_cmd_cb(char* recv, char* reply, void* ctx, uint16_t* count) { CHECK_ARD_NETIF(recv, reply, count); CREATE_HEADER_REPLY(reply, recv, PARAM_NUMS_1); uint8_t _state = CLOSED; if ((recv[3]==1)&&(recv[4]>=0)&&(recv[4]=0)&&(_sock=0)&&(recv[4]=0)&&(recv[4]=0)&&(recv[4]=0)&&(sock=0)&&(recv[4]<0xFF)) { len = recv[4]; int i= 0; for (; i")); DUMP_SPI(recv, count); IF_SPI_DUMP(printk("<==")); DUMP_SPI(reply, _count); replyCount = _count; return _result; } unsigned char* getStartCmdSeq(unsigned char* _recv, int len, int *offset) { int i = 0; *offset = 0; //DEB_PIN_UP(); for (; inParam, (char*) &(spiMsg->params[0]), cmd_spi_list[i].ctx); }else { tSpiMsgData* spiMsg = (tSpiMsgData*) recv; _result = cmd_spi_list[i].cb(spiMsg->nParam, (char*) &(spiMsg->params[0]), cmd_spi_list[i].ctx); } if (_result != WIFI_SPI_ACK) return REPLY_ERR_CMD; else return REPLY_NO_ERR; }else{ if (spiMsg8(cmdId)) { tSpiMsg* spiMsg = (tSpiMsg*) recv; _result = cmd_spi_list[i].cb(spiMsg->nParam, (char*) &(spiMsg->params[0]), NULL); }else{ tSpiMsgData* spiMsg = (tSpiMsgData*) recv; _result = cmd_spi_list[i].cb(spiMsg->nParam, (char*) &(spiMsg->params[0]), NULL); } //Send Reply for GET commands or Immediate SET apply if (cmd_spi_list[i].flags == CMD_GET_FLAG) { if (sendReply(i, recv, reply, cmd_spi_list[i].ctx) != SPI_OK) return REPLY_ERR_GET; else return REPLY_NO_ERR; }else if (cmd_spi_list[i].flags == CMD_IMM_SET_FLAG) { if (sendReply(i, recv, reply, &_result) != SPI_OK) return REPLY_ERR_GET; else return REPLY_NO_ERR; } } } } // Command not found if (i==ARRAY_SIZE(cmd_spi_list)) { WARN("Unknown cmd 0x%x\n", cmdId); DUMP(recv, count); return REPLY_ERR_CMD; } return REPLY_NO_ERR; } void init_spi_cmds(void* ctx) { spi_add_cmd(SET_NET_CMD, set_net_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG); spi_add_cmd(SET_PASSPHRASE_CMD, set_passphrase_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG); spi_add_cmd(SET_KEY_CMD, set_key_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG); spi_add_cmd(SET_IP_CONFIG_CMD, set_ip_config_cmd_cb, ack_reply_cb, ctx, CMD_SET_FLAG); spi_add_cmd(SET_DNS_CONFIG_CMD, set_dns_config_cmd_cb, ack_reply_cb, ctx, CMD_SET_FLAG); spi_add_cmd(GET_CONN_STATUS_CMD, get_result_cmd_cb, get_reply_cb, NULL, CMD_GET_FLAG); spi_add_cmd(GET_IPADDR_CMD, ack_cmd_cb, get_reply_ipaddr_cb, NULL, CMD_GET_FLAG); spi_add_cmd(GET_MACADDR_CMD, ack_cmd_cb, get_reply_mac_cb, NULL, CMD_GET_FLAG); spi_add_cmd(GET_CURR_SSID_CMD, ack_cmd_cb, get_reply_curr_net_cb, (void*)GET_CURR_SSID_CMD, CMD_GET_FLAG); spi_add_cmd(GET_CURR_BSSID_CMD, ack_cmd_cb, get_reply_curr_net_cb, (void*)GET_CURR_BSSID_CMD, CMD_GET_FLAG); spi_add_cmd(GET_CURR_RSSI_CMD, ack_cmd_cb, get_reply_curr_net_cb, (void*)GET_CURR_RSSI_CMD, CMD_GET_FLAG); spi_add_cmd(GET_CURR_ENCT_CMD, ack_cmd_cb, get_reply_curr_net_cb, (void*)GET_CURR_ENCT_CMD, CMD_GET_FLAG); spi_add_cmd(START_SCAN_NETWORKS, start_scan_net_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG); spi_add_cmd(SCAN_NETWORKS, ack_cmd_cb, get_reply_scan_networks_cb, NULL, CMD_GET_FLAG); spi_add_cmd(DISCONNECT_CMD, disconnect_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG); spi_add_cmd(GET_IDX_ENCT_CMD, ack_cmd_cb, get_reply_idx_net_cb, (void*)GET_IDX_ENCT_CMD, CMD_GET_FLAG); spi_add_cmd(GET_IDX_SSID_CMD, ack_cmd_cb, get_reply_idx_net_cb, (void*)GET_IDX_SSID_CMD, CMD_GET_FLAG); spi_add_cmd(GET_IDX_RSSI_CMD, ack_cmd_cb, get_reply_idx_net_cb, (void*)GET_IDX_RSSI_CMD, CMD_GET_FLAG); spi_add_cmd(REQ_HOST_BY_NAME_CMD, req_reply_host_by_name_cb, ack_reply_cb, NULL, CMD_SET_FLAG); spi_add_cmd(GET_HOST_BY_NAME_CMD, ack_cmd_cb, get_reply_host_by_name_cb, NULL, CMD_GET_FLAG); spi_add_cmd(START_SERVER_TCP_CMD, start_server_tcp_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG); spi_add_cmd(START_CLIENT_TCP_CMD, start_client_tcp_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG); spi_add_cmd(STOP_CLIENT_TCP_CMD, stop_client_tcp_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG); spi_add_cmd(GET_STATE_TCP_CMD, ack_cmd_cb, get_state_tcp_cmd_cb, NULL, CMD_GET_FLAG); spi_add_cmd(GET_DATA_TCP_CMD, ack_cmd_cb, get_data_tcp_cmd_cb, NULL, CMD_GET_FLAG); spi_add_cmd(AVAIL_DATA_TCP_CMD, ack_cmd_cb, avail_data_tcp_cmd_cb, NULL, CMD_GET_FLAG); spi_add_cmd(SEND_DATA_TCP_CMD, send_data_tcp_cmd_cb, ack_reply_cb, NULL, CMD_IMM_SET_FLAG); spi_add_cmd(DATA_SENT_TCP_CMD, ack_cmd_cb, data_sent_tcp_cmd_cb, NULL, CMD_GET_FLAG); spi_add_cmd(GET_DATABUF_TCP_CMD, ack_cmd_cb, get_databuf_tcp_cmd_cb, NULL, CMD_GET_FLAG); spi_add_cmd(GET_CLIENT_STATE_TCP_CMD, ack_cmd_cb, get_client_state_tcp_cmd_cb, NULL, CMD_GET_FLAG); spi_add_cmd(GET_FW_VERSION_CMD, ack_cmd_cb, get_firmware_version_cmd_cb, NULL, CMD_GET_FLAG); spi_add_cmd(GET_TEST_CMD, ack_cmd_cb, get_test_cmd_cb, NULL, CMD_GET_FLAG); spi_add_cmd(INSERT_DATABUF_CMD, insert_data_cmd_cb, ack_reply_cb, NULL, CMD_IMM_SET_FLAG); spi_add_cmd(SEND_DATA_UDP_CMD, send_data_udp_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG); spi_add_cmd(GET_REMOTE_DATA_CMD, ack_cmd_cb, get_reply_remote_data_cb, NULL, CMD_GET_FLAG); } int checkMsgParam8(unsigned char* buf) { int paramLenTot=0; tSpiMsg* spiMsg = (tSpiMsg*)buf; tParam *param = spiMsg->params; int i=0; for (; inParam; ++i) { uint8_t _len = param->paramLen; paramLenTot+= _len+1; //printk("%d) len:0x%x\n", i, _len); param = (tParam*)((char*)(param)+_len+1); } return paramLenTot; } int checkMsgParam16(unsigned char* buf) { int paramLenTot=0; tSpiMsgData* spiMsg = (tSpiMsgData*)buf; tDataParam* param = (tDataParam*)spiMsg->params; int i=0; for (; inParam; ++i) { uint16_t _len = param->dataLen; paramLenTot+= _len+sizeof(param->dataLen); //printk("%d) len:0x%x\n", i, _len); param = (tDataParam*)((char*)(param)+_len+sizeof(param->dataLen)); } return paramLenTot; } bool checkMsgFormat(uint8_t* _recv, int len, int* offset) { unsigned char* recv = getStartCmdSeq(_recv, len, offset); if ((recv == NULL)||(recv!=_recv)) { DEB_PIN_TRIGGER(); IF_WARN_VER(DUMP((char*)_recv, len)); STATSPI_DISALIGN_ERROR(); if (recv == NULL) return false; } tSpiMsg* spiMsg = (tSpiMsg*) recv; if ((spiMsg->cmd == START_CMD)&&((spiMsg->tcmd & REPLY_FLAG) == 0)) { int paramLenTot = 0; if (spiMsg8(spiMsg->tcmd)) paramLenTot = checkMsgParam8(recv); else { DUMP_SPI(_recv, len); paramLenTot = checkMsgParam16(recv); } //INFO_SPI("cmd:0x%x TotLen:%d\n", spiMsg->tcmd, paramLenTot); char* p = (char*)recv + paramLenTot + sizeof(tSpiHdr); if (*p == END_CMD) { return true; }else{ WARN("%d] Not found end cmd: 0x%x\n", cmdCorr, *p); } } return false; } //#define AVR32_USART_CSR_ITERATION_MASK (UNDERRUN) 0x00000400 //#define AVR32_USART_CSR_OVRE_MASK 0x00000020 //#define AVR32_USART_CSR_RXRDY_MASK 0x00000001 void spi_poll(struct netif* netif) { ard_netif = netif; if (startReply) { startReply = false; int offset = 0; DISABLE_SPI_INT(); if (checkMsgFormat(_receiveBuffer, receivedChars, &offset)) { state = SPI_CMD_INPROGRESS; count = receivedChars-offset; if (count >= CMD_MAX_LEN) count = CMD_MAX_LEN; memcpy(buf, &_receiveBuffer[offset], count); //mark as buffer used _receiveBuffer[0] = 0; int err = call_reply_cb(buf, &reply[0]); if (err != REPLY_NO_ERR) { DUMP_SPI(buf, count); DUMP_SPI(reply, replyCount); } receivedChars = 0; count = 0; state = SPI_CMD_IDLE; } else { sendError(); WARN("%d] Check format msg failed!\n", cmdCorr); IF_WARN_VER(dump((char*)_receiveBuffer, receivedChars)); state = SPI_CMD_IDLE; count=0; //mark as buffer used _receiveBuffer[0] = 0; } CLEAR_SPI_INT(); //Enable Spi int to receive a new command ENABLE_SPI_INT(); //Available for receiving a new spi data AVAIL_FOR_SPI(); } #ifdef _SPI_STATS_ if (statSpi.lastError != 0) { WARN("%d] Errot=0x%x spiStatus:0x%x\n", cmdCorr, statSpi.lastError, statSpi.status); statSpi.lastError = 0; } #endif } inline int spi_slaveReceiveInt(volatile avr32_spi_t *spi) { receivedChars=0; int index = 0; int err = SPI_OK; state = SPI_CMD_INPUT; bool endOfFrame = false; do { unsigned int timeout = SPI_TIMEOUT; err = SPI_OK; while ((spi->sr & (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) != (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) { if ((timeout--)==0) { err=SPI_ERROR_TIMEOUT; break; } } //DEB_PIN_TG(); #if 0 #ifdef _SPI_STATS_ if (spi->sr & AVR32_SPI_SR_OVRES_MASK) { STATSPI_OVERRIDE_ERROR(); } #endif #endif if (err == SPI_OK) { _receiveBuffer[index] = (spi->rdr >> AVR32_SPI_RDR_RD_OFFSET) & 0x00ff; DEB_PIN_UP(2); if ((index==0) && (_receiveBuffer[index] != START_CMD)) DEB_PIN_TRIGGER(); ++index; ++receivedChars; }else{ #ifdef _SPI_STATS_ STATSPI_TIMEOUT_ERROR(); #endif break; } /* break on buffer overflow */ if (receivedChars >= _BUFFERSIZE) { err = SPI_ERROR_OVERRUN_AND_MODE_FAULT; break; } if (_receiveBuffer[index - 1] == END_CMD) { int8_t numParams = 0; int idx = PARAM_LEN_POS+1; bool islen16bit = ((_receiveBuffer[CMD_POS] & DATA_FLAG) == DATA_FLAG); if (index >= idx) { numParams = _receiveBuffer[PARAM_LEN_POS]; while (((index-1) > idx)&&(numParams>0)) { if (islen16bit) idx += (_receiveBuffer[idx]<<8) + _receiveBuffer[idx+1]+2; else idx += _receiveBuffer[idx]+1; --numParams; } if (((index-1) == idx) && (numParams == 0)) endOfFrame = true; } if (!endOfFrame){ WARN("Wrong termination index:%d nParam:%d idx:%d 16bit:%d\n", index, numParams, idx, islen16bit); #ifdef _DEBUG_ dump((char*)_receiveBuffer, receivedChars); while(0); #endif } } } while (!endOfFrame); return err; } #if defined (__GNUC__) __attribute__((__interrupt__)) #elif defined (__ICCAVR32__) __interrupt #endif static void spi_int_handler(void) { volatile avr32_spi_t *spi = ARD_SPI; DEB_PIN_DN(2); DISABLE_SPI_INT(); if ((spi->sr & AVR32_SPI_SR_RDRF_MASK) != 0) { int err = spi_slaveReceiveInt(ARD_SPI); if (err == SPI_OK) { BUSY_FOR_SPI(); startReply=true; ++cmdCorr; //maintain disable interrupt to send the reply command return; } } ENABLE_SPI_INT(); } inline spi_status_t spi_read8(volatile avr32_spi_t *spi, unsigned char *data) { unsigned int timeout = SPI_TIMEOUT; while ((spi->sr & (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) != (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) { if (!timeout--) { return SPI_ERROR_TIMEOUT; } } *data = (spi->rdr >> AVR32_SPI_RDR_RD_OFFSET) & 0x00ff; return SPI_OK; } /*! * \brief Interrupt handler of the External interrupt line "1". */ #if __GNUC__ __attribute__((__interrupt__)) #elif __ICCAVR32__ __interrupt #endif static void eic_int_handler1(void) { eic_clear_interrupt_line(&AVR32_EIC, EXT_INT_LINE1); startRecvCmdSignal = TRUE; } //! Structure holding the configuration parameters of the EIC module. eic_options_t eic_options[EXT_INT_NB_LINES]; void initExtInt() { // Enable edge-triggered interrupt. eic_options[0].eic_mode = EIC_MODE_EDGE_TRIGGERED; // Interrupt will trigger on falling edge. eic_options[0].eic_edge = EIC_EDGE_FALLING_EDGE; // Initialize in synchronous mode : interrupt is synchronized to the clock eic_options[0].eic_async = EIC_SYNCH_MODE; // Set the interrupt line number. eic_options[0].eic_line = EXT_INT_LINE1; // Disable all interrupts. Disable_global_interrupt(); INTC_register_interrupt(&eic_int_handler1, EXT_INT_IRQ_LINE1, AVR32_INTC_INT0); // Map the interrupt lines to the GPIO pins with the right peripheral functions. gpio_enable_module_pin(EXT_INT_PIN_LINE1,EXT_INT_FUNCTION_LINE1); // Init the EIC controller with the options eic_init(&AVR32_EIC, eic_options, EXT_INT_NB_LINES); // Enable the chosen lines and their corresponding interrupt feature. eic_enable_line(&AVR32_EIC, eic_options[0].eic_line); eic_enable_interrupt_line(&AVR32_EIC, eic_options[0].eic_line); // Enable all interrupts. Enable_global_interrupt(); } int initSpi(void* ctx) { volatile avr32_spi_t *spi = &AVR32_SPI0; gpio_map_t spi_piomap = { \ {AVR32_SPI0_SCK_0_0_PIN, AVR32_SPI0_SCK_0_0_FUNCTION}, \ {AVR32_SPI0_MISO_0_0_PIN, AVR32_SPI0_MISO_0_0_FUNCTION}, \ {AVR32_SPI0_MOSI_0_0_PIN, AVR32_SPI0_MOSI_0_0_FUNCTION}, \ {AVR32_SPI0_NPCS_0_0_PIN, AVR32_SPI0_NPCS_0_0_FUNCTION}, \ }; INFO_INIT("SPI init...\n"); /* Init PIO */ gpio_enable_module(spi_piomap, ARRAY_SIZE(spi_piomap)); spi_options_t spiOptions; spiOptions.reg = 0; spiOptions.baudrate = SPI_SLAVE_SPEED; spiOptions.bits = SPI_BITS; spiOptions.spck_delay = 0; spiOptions.trans_delay = 4; spiOptions.stay_act = 0; spiOptions.spi_mode = 0; spiOptions.modfdis = 0; /* Initialize as slave; bits, spi_mode */ if (spi_initSlave(spi, spiOptions.bits, spiOptions.spi_mode) != SPI_OK) { INFO_SPI("SPI initialization failed!"); return 1; } spi_status_t status = spi_setupChipReg(spi, &spiOptions, FPBA_HZ); if (status == SPI_ERROR_ARGUMENT) WARN("Error configuring SPI\n"); // Disable all interrupts. Disable_global_interrupt(); // Register the SPI interrupt handler to the interrupt controller. INTC_register_interrupt((__int_handler)(&spi_int_handler), AVR32_SPI0_IRQ, AVR32_INTC_INT0); // Enable all interrupts. Enable_global_interrupt(); ENABLE_SPI_INT(); spi_enable(spi); #ifdef _SPI_STATS_ initStatSpi(); #endif init_spi_cmds(ctx); memset(_receiveBuffer, 0, sizeof(_receiveBuffer)); memset(buf, 0, sizeof(buf)); memset(reply, 0, sizeof(reply)); initMapSockTcp(); set_result(WL_IDLE_STATUS); init_pBuf(); return 0; } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/ard_spi.h ================================================ /* * ard_spi.h * * Created on: May 27, 2010 * Author: mlf by Metodo2 srl */ #ifndef ARD_SPI_H_ #define ARD_SPI_H_ #include "lwip/netif.h" #include "console.h" #include "wl_definitions.h" typedef enum { SPI_CMD_IDLE, SPI_CMD_INPUT, SPI_CMD_DONE, SPI_CMD_INPROGRESS, SPI_CMD_REPLING, SPI_CMD_FAIL, } cmd_spi_state_t; typedef enum { REPLY_ERR_GET, REPLY_ERR_SET, REPLY_ERR_CMD, REPLY_ERR_MSG, REPLY_NO_ERR, } reply_err_t; typedef enum { CMD_GET_FLAG = 0x01, CMD_SET_FLAG = 0x02, CMD_IMM_SET_FLAG = 0x04, }cmd_flags; typedef enum eProtMode {TCP_MODE, UDP_MODE}tProtMode; #define TIMEOUT_SPI 200 #define SPI_ALIGN_ERROR 0xF0 #define SPI_OVERRIDE_ERROR 0xF1 #define SPI_TIMEOUT_ERROR 0xF2 #define DUMMY_DATA 0xFF typedef int (*cmd_spi_cb_t)(int numParam, char* buf, void* ctx); typedef cmd_spi_state_t (*cmd_spi_rcb_t)(char* recv, char* reply, void* ctx, uint16_t* _count); typedef struct eRemoteClient{ uint32_t ipaddr; uint16_t port; }tRemoteClient; void set_result_cmd(int err) ; void set_result(wl_status_t _status); int initSpi(void* ctx); void initExtInt(); void spi_poll(struct netif* netif); int spi_slaveReceive(volatile avr32_spi_t *spi); void showTTCPstatus(); int getSock(void * _ttcp); void* getTTCP(uint8_t sock, uint8_t mode); void setMapSockMode(uint8_t sock, void* _ttcp, uint8_t _tcp_mode); void clearMapSockTcp(uint8_t sock, uint8_t mode); int start_server_tcp(uint16_t port, uint8_t sock, uint8_t protMode); int start_client_tcp(uint32_t _addr, uint16_t port, uint8_t sock, uint8_t protMode); void setRemoteClient(uint16_t sock, uint32_t _ipaddr, uint16_t _port); tRemoteClient* getRemoteClient(uint16_t sock); void getRemoteData(uint8_t sock, uint8_t mode, tRemoteClient* remoteData); #endif /* ARD_SPI_H_ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/ard_tcp.c ================================================ /* * ard_tcp.c * * Created on: May 27, 2010 * Author: mlf by Metodo2 srl */ //#define _APP_DEBUG_ #include "lwip/opt.h" #include "lwip/mem.h" #include "lwip/raw.h" #include "lwip/icmp.h" #include "lwip/netif.h" #include "lwip/sys.h" #include "lwip/sockets.h" #include "lwip/inet.h" #include "lwip/inet_chksum.h" #include "lwip/tcp.h" #include "lwip/udp.h" #include "ard_tcp.h" #include "ard_spi.h" #include "timer.h" #include "util.h" #include "getopt.h" #include "ard_utils.h" #include "debug.h" #include "trace.h" unsigned int startTime = 0; extern bool ifStatus; static err_t tcp_data_sent(void *arg, struct tcp_pcb *pcb, u16_t len); static void atcp_init_pend_flags(struct ttcp* _ttcp) { int i = 0; for (; ipending_close[i] = false; } } /** * Clean up and free the ttcp structure */ static void ard_tcp_destroy(struct ttcp* ttcp) { err_t err = ERR_OK; DUMP_TCP_STATE(ttcp); uint8_t sock = getSock(ttcp); if (sock == -1) WARN("ttcp already deallocated!\n"); freeAllTcpData(sock); int i = 0; for (; itpcb[i]) { tcp_arg(ttcp->tpcb[i], NULL); tcp_sent(ttcp->tpcb[i], NULL); tcp_recv(ttcp->tpcb[i], NULL); tcp_err(ttcp->tpcb[i], NULL); //TEMPORAQARY //err = tcp_close(ttcp->tpcb); INFO_TCP("Closing tpcb: state:0x%x err:%d\n", ttcp->tpcb[i]->state, err); } } if (ttcp->lpcb) { tcp_arg(ttcp->lpcb, NULL); tcp_accept(ttcp->lpcb, NULL); err = tcp_close(ttcp->lpcb); INFO_TCP("Closing lpcb: state:0x%x err:%d\n", ttcp->lpcb->state, err); } if (ttcp->upcb) { udp_disconnect(ttcp->upcb); udp_remove(ttcp->upcb); } FREE_PAYLOAD(ttcp); free(ttcp); } /** * Invoked when transfer is done or aborted (non-zero result). */ static void ard_tcp_done(struct ttcp* ttcp, int result) { // if (result == 0) // ard_tcp_print_stats(ttcp); if (ttcp->done_cb) ttcp->done_cb(ttcp->opaque, result); ard_tcp_destroy(ttcp); clearMapSockTcp(getSock(ttcp), GET_TCP_MODE(ttcp)); } /** * Only used in TCP mode. * Will transmit a maximum of pbuf->tot_len bytes. * Called upon connect and when there's space available in the TCP send window * */ static err_t tcp_send_data_pcb(struct ttcp *ttcp, struct tcp_pcb *pcb) { err_t err = ERR_OK; uint32_t len; GET_CLIENT_ID(ttcp, pcb); len = ttcp->left[id]; ttcp->buff_sent[id] = 0; if (len == 0) return ERR_MEM; INFO_TCP_VER("left=%d len:%d\n", ttcp->left[id], len); /* don't send more than we have in the payload */ if (len > ttcp->buflen) len = ttcp->buflen; /* We cannot send more data than space available in the send buffer. */ if (len > tcp_sndbuf(pcb)) len = tcp_sndbuf(pcb); IF_TCP(startTime = timer_get_ms()); err = tcp_write(pcb, ttcp->payload[id], len, TCP_WRITE_FLAG_COPY); if (err != ERR_OK) { INFO_TCP("tcp_write failed %p state:%d len:%d err:%d\n", pcb, pcb->state, len, err); ttcp->buff_sent[id] = 0; }else{ ttcp->buff_sent[id] = 1; ttcp->left[id] -= len; } return err; } /** * Only used in TCP mode. */ static err_t tcp_connect_cb(void *arg, struct tcp_pcb *tpcb, err_t err) { struct ttcp* _ttcp = arg; if (_ttcp == NULL) return ERR_ARG; GET_CLIENT_ID(_ttcp, tpcb); INFO_TCP("TTCP [%p-%p]: connect %d %d\n", _ttcp, tpcb, err, tpcb->state); _connected = ( tpcb->state == ESTABLISHED) ? 1 : 0; _ttcp->tcp_poll_retries[id] = 0; _ttcp->start_time = timer_get_ms(); return ERR_OK; } static void cleanSockState_cb(void *ctx) { struct ttcp* _ttcp = ctx; if (_ttcp == NULL) return; int sock = getSock(_ttcp); if (sock != -1) clearMapSockTcp(sock, GET_TCP_MODE(_ttcp)); INFO_TCP("TTCP [%p]: cleanSockState_cb %d\n", _ttcp, sock); _connected = false; } /** * Only used in TCP mode. */ static err_t close_conn_pcb(struct tcp_pcb* tpcb) { err_t err = tcp_close(tpcb); if (err== ERR_OK) { tcp_arg(tpcb, NULL); tcp_sent(tpcb, NULL); tcp_recv(tpcb, NULL); } INFO_TCP("Closing tpcb[%p]: state:0x%x err:%d\n", tpcb, tpcb->state, err); return err; } static void atcp_conn_err_cb(void *arg, err_t err) { struct ttcp* _ttcp = arg; WARN("TTCP [%p]: connection error: %d currId:%d\n", _ttcp, err, getCurrClientConnId()); if (ifStatus == false) printk("Abort connection\n"); if (err == ERR_ABRT) { removeNewClientConn(_ttcp, GET_CURR_PCB(_ttcp)); FREE_PAYLOAD_ID(_ttcp, getCurrClientConnId()); } } static void atcp_conn_cli_err_cb(void *arg, err_t err) { struct ttcp* _ttcp = arg; if (_ttcp == NULL) return; WARN("TTCP [%p]: connection error: %d arg:%p\n", _ttcp, err, arg); if (ifStatus == false) printk("Abort connection\n"); if ((_ttcp)&&(err == ERR_ABRT)) { WARN("TTCP [%p]: free memory\n", _ttcp); cleanSockState_cb(_ttcp); // TODO FREE_PAYLOAD(_ttcp); } //atcp_init_pend_flags(_ttcp); } static err_t close_conn(struct ttcp *_ttcp, struct tcp_pcb* tpcb) { if (_ttcp == NULL) return ERR_MEM; GET_CLIENT_ID(_ttcp, tpcb); err_t err = close_conn_pcb(_ttcp->tpcb[id]); if (err == ERR_MEM) { WARN("Cannot close id:%d-%p put pending\n", id, _ttcp->tpcb[id]); _ttcp->pending_close[id] = true; } else{ _ttcp->pending_close[id] = false; removeNewClientConn(_ttcp, _ttcp->tpcb[id]); FREE_PAYLOAD_ID(_ttcp, id); INFO_TCP("----------------------\n"); } return err; } void closeConnections() { int ii=0; for (; iiudp == TCP_MODE) { ard_tcp_destroy(_ttcp); clearMapSockTcp(getSock(_ttcp), GET_TCP_MODE(_ttcp)); } } } } } /** * Only used in TCP mode. */ static err_t atcp_recv_cb(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) { struct ttcp* ttcp = arg; if (err == ERR_OK && p != NULL) { DATA_LED_ON(); /* for print_stats() */ ttcp->recved += p->tot_len; if ((ttcp->verbose)||(verboseDebug & INFO_TCP_FLAG)) { INFO_TCP("len:%d\n",p->tot_len); DUMP_TCP(p->payload, p->tot_len); ttcp->print_cnt++; } uint8_t* pBufferStore = insert_pBuf(p, ttcp->sock, (void*) pcb); INFO_TCP("sock:%d pcb:%p pbuf:%p err:%d bufStore:%p len:%d\n", ttcp->sock, pcb, p, err, pBufferStore, p->tot_len); pbuf_free(p); DATA_LED_OFF(); } /* p will be NULL when remote end is done */ if (err == ERR_OK && p == NULL) { INFO_TCP("atcp_recv_cb p=NULL on sock:%d pcb:%p\n", ttcp->sock, pcb); close_conn(ttcp, pcb); } if (err!=ERR_OK) WARN("err=%d p=%p\n", err, p); return ERR_OK; } void ack_recved(void* pcb, int len) { // Comment the call because it is activated on atcp_recv_cb INFO_TCP("Received %p len:%d\n", pcb, len); tcp_recved(pcb, len); } static err_t atcp_poll(void *arg, struct tcp_pcb *pcb) { struct ttcp* _ttcp = arg; if (_ttcp == NULL) return ERR_ARG; GET_CLIENT_ID(_ttcp, pcb); if (_ttcp->left[id]>0) ++_ttcp->tcp_poll_retries[id]; if (_ttcp->tcp_poll_retries[id] > 4) { WARN("ARD TCP [%p] arg=%p retries=%d abort\n", pcb, arg, _ttcp->tcp_poll_retries[id]); _ttcp->tcp_poll_retries[id] = 0; tcp_abort(pcb); _ttcp->pending_close[id] = false; return ERR_ABRT; } if (pcb) INFO_TCP_POLL("keepAliveCnt:%d keep_idle:%d persist_cnt:%d\n", pcb->keep_cnt_sent, pcb->keep_idle, pcb->persist_cnt); if (_ttcp->left[id] > 0) INFO_TCP("ARD TCP [%p-%p] arg=%p retries=%d pend.close:%d len:%d\n", (_ttcp)?GET_FIRST_CLIENT_TCP(_ttcp):0, pcb, arg, _ttcp->tcp_poll_retries[id], _ttcp->pending_close[id], (_ttcp)?_ttcp->left[id]:0); tcp_send_data_pcb(_ttcp, pcb); if (_ttcp->pending_close[id]) { err_t err = ERR_OK; if (id >=0){ err = tcp_close(pcb); if (err == ERR_MEM) { _ttcp->pending_close[id] = true; } else { _ttcp->pending_close[id] = false; removeNewClientConn(_ttcp, _ttcp->tpcb[id]); FREE_PAYLOAD_ID(_ttcp, id); INFO_TCP("----------------------\n"); } } INFO_TCP("ARD TCP [%p-%p] try to close pending:%d err:%d id:%d\n", pcb, (_ttcp)?GET_FIRST_CLIENT_TCP(_ttcp):0, _ttcp->pending_close[id], err, id); } return ERR_OK; } static err_t atcp_poll_conn(void *arg, struct tcp_pcb *pcb) { struct ttcp* _ttcp = arg; if (_ttcp == NULL) return ERR_ARG; GET_CLIENT_ID(_ttcp, pcb) INFO_TCP_POLL("ARD TCP [%p-%p] arg=%p retries=%d pend.close:%d conn:%d\n", (_ttcp)?GET_FIRST_CLIENT_TCP(_ttcp):0, pcb, arg, _ttcp->tcp_poll_retries[id], _ttcp->pending_close[id], _connected); if (id != NO_VALID_ID) { if (_ttcp->pending_close[id]) ++(_ttcp->tcp_poll_retries[id]); } if (_ttcp->tcp_poll_retries[id] > 8) { WARN("ARD TCP [%p-%p] arg=%p retries=%d\n", pcb, GET_FIRST_CLIENT_TCP(_ttcp), arg, _ttcp->tcp_poll_retries[id]); _ttcp->tcp_poll_retries[id] = 0; tcp_abort(pcb); return ERR_ABRT; } if ((_ttcp)&&(_connected)) tcp_send_data_pcb(_ttcp, pcb); if ((id != NO_VALID_ID) && (_ttcp->pending_close[id])) { err_t err = tcp_close(pcb); if (err == ERR_MEM) { _ttcp->pending_close[id] = true; } else { cleanSockState_cb(_ttcp); FREE_PAYLOAD_ID(_ttcp, id); _ttcp->pending_close[id] = false; } INFO_TCP("ARD TCP [%p-%p] try to close pending:%d\n", pcb, (_ttcp)?GET_FIRST_CLIENT_TCP(_ttcp):0, _ttcp->pending_close[id]); } return ERR_OK; } int8_t currConnId = 0; int8_t getCurrClientConnId() { return currConnId;} int8_t getNewClientConnId(struct ttcp* _ttcp, struct tcp_pcb *newpcb) { if (_ttcp != NULL){ int i = 0; for (; itpcb[idx] == newpcb) { INFO_TCP_VER("ttcp:%p id=%d, tpcb=%p\n", _ttcp, idx, newpcb); return idx; } } } WARN("No Valid Id for ttcp:%p pcb:%p\n", _ttcp, newpcb); return NO_VALID_ID; } struct tcp_pcb * getFirstClient(struct ttcp* _ttcp, bool verbose) { if (_ttcp != NULL){ int i = 0; for (; itpcb[idx] != NULL) { if (verbose) INFO_TCP("ttcp:%p id=%d, tpcb=%p\n", _ttcp, idx, _ttcp->tpcb[idx]); currConnId = idx; return _ttcp->tpcb[idx]; } } } if (verbose) WARN("No Valid client for ttcp:%p\n", _ttcp); return NULL; } int8_t setNewClientConn(struct ttcp* _ttcp, struct tcp_pcb *newpcb, uint8_t id) { if ((_ttcp != NULL)&&(id>=0)&&(idtpcb[id] = newpcb; return id; } return NO_VALID_ID; } int8_t insertNewClientConn(struct ttcp* _ttcp, struct tcp_pcb *newpcb) { if (_ttcp != NULL){ int i = 0; for (; itpcb[idx] == NULL)||(_ttcp->tpcb[idx] == newpcb)) { INFO_TCP("ttcp:%p id=%d, tpcb=%p\n", _ttcp, idx, newpcb); _ttcp->tpcb[idx] = newpcb; return idx; } } } return NO_VALID_ID; } int8_t removeNewClientConn(struct ttcp* _ttcp, struct tcp_pcb *newpcb) { if (_ttcp != NULL){ int i = 0; for (; itpcb[idx] == newpcb) { INFO_TCP("ttcp:%p id=%d, tpcb=%p\n", _ttcp, idx, newpcb); _ttcp->tpcb[idx] = NULL; return idx; } } } return NO_VALID_ID; } bool cleanNewClientConn(struct ttcp* _ttcp) { if (_ttcp != NULL){ int i = 0; for (; itpcb[i] = NULL; return true; } return false; } /** * Only used in TCP mode. */ static err_t atcp_accept_cb(void *arg, struct tcp_pcb *newpcb, err_t err) { struct ttcp* _ttcp = arg; if (_ttcp == NULL) return ERR_ARG; INFO_TCP("ARD TCP [%p]: accept new [%p]\n", _ttcp, newpcb); INFO_TCP("local:%d remote:%d state:%d\n", newpcb->local_port, newpcb->remote_port, newpcb->state); int8_t id = insertNewClientConn(_ttcp, newpcb); ASSERT((_ttcp->payload[id]==NULL), "payload not freed!"); _ttcp->payload[id] = malloc(_ttcp->buflen); INFO_TCP("Alloc payload %d-%p\n", id, _ttcp->payload[id]); if (_ttcp->payload[id] == NULL) { WARN("TTCP [%p]: could not allocate payload\n", _ttcp); return -1; } tcp_arg(_ttcp->tpcb[id], _ttcp); tcp_recv(_ttcp->tpcb[id], atcp_recv_cb); tcp_err(_ttcp->tpcb[id], atcp_conn_err_cb); tcp_poll(_ttcp->tpcb[id], atcp_poll, 4); // Copy the pointer to ttcp also to TRANSMIT mode for the clients connected to the server int _sock = getSock(_ttcp); if ((_sock != -1)&&(IS_VALID_SOCK(_sock))) setMapSockMode(_sock, _ttcp, TTCP_MODE_TRANSMIT); _ttcp->start_time = timer_get_ms(); return ERR_OK; } /** * Start TCP transfer. */ static int atcp_start(struct ttcp* ttcp) { err_t err = ERR_OK; struct tcp_pcb * p = tcp_new(); if (p == NULL) { WARN("TTCP [%p]: could not allocate pcb\n", ttcp); return -1; } currConnId = 0; tcp_arg(p, ttcp); atcp_init_pend_flags(ttcp); if (ttcp->mode == TTCP_MODE_TRANSMIT) { int8_t id = insertNewClientConn(ttcp, p); ttcp->payload[id] = malloc(ttcp->buflen); INFO_TCP("Alloc payload %d-%p\n", id, ttcp->payload[id]); if (ttcp->payload[id] == NULL) { WARN("TTCP [%p]: could not allocate payload\n", ttcp); return -1; } struct tcp_pcb * pcb = p; tcp_err(pcb, atcp_conn_cli_err_cb); tcp_recv(pcb, atcp_recv_cb); tcp_sent(pcb, tcp_data_sent); tcp_poll(pcb, atcp_poll_conn, 4); _connected = false; INFO_TCP("[tpcb]-%p payload:%p\n", pcb, ttcp->payload[id]); DUMP_TCP_STATE(ttcp); if (tcp_connect(pcb, &ttcp->addr, ttcp->port, tcp_connect_cb) != ERR_OK) { WARN("TTCP [%p]: tcp connect failed\n", ttcp); return -1; } } else { INFO_TCP("BEFORE BIND ttcp:%p lpcb:%p pcb:%p\n", ttcp, ttcp->lpcb, GET_FIRST_CLIENT_TCP(ttcp)); err = tcp_bind(p, IP_ADDR_ANY, ttcp->port); if (err != ERR_OK){ WARN("TTCP [%p]: bind failed err=%d Port already used\n", ttcp, err); return -1; } ttcp->lpcb = tcp_listen(p); if (ttcp->lpcb == NULL) { WARN("TTCP [%p]: listen failed\n", ttcp); return -1; } DUMP_TCP_STATE(ttcp); tcp_accept(ttcp->lpcb, atcp_accept_cb); } return 0; } /** * Only used in UDP mode. Will finalize the ttcp process when an end marker * is seen. */ static void audp_recv_cb(void *arg, struct udp_pcb *upcb, struct pbuf *p, struct ip_addr *addr, u16_t port) { struct ttcp* ttcp = arg; /* for print_stats() */ ttcp->recved += p->tot_len; DUMP(p->payload,p->tot_len); if (ttcp->verbose) { printk("."); if (ttcp->print_cnt % 80 == 0) printk("\n"); ttcp->print_cnt++; } INFO_TCP("UDP Insert %p sock:%d addr:%s port:%d\n", p, ttcp->sock, ip2str(*addr), port); insert_pBuf(p, ttcp->sock, (void*) upcb); setRemoteClient(ttcp->sock, addr->addr, port); pbuf_free(p); } /** * Start UDP transfer. */ static int udp_start(struct ttcp* ttcp) { err_t err = ERR_OK; ttcp->udp_end_marker_left = 5; ttcp->upcb = udp_new(); if (ttcp->upcb == NULL) { WARN("TTCP [%p]: could not allocate pcb\n", ttcp); return -1; } INFO_TCP("%s, upcb:%p %s:%d\n", __FUNCTION__, ttcp->upcb, ip2str(ttcp->addr), ttcp->port); if (ttcp->mode == TTCP_MODE_TRANSMIT) { if (udp_connect(ttcp->upcb, &(ttcp->addr), ttcp->port) != ERR_OK) { WARN("TTCP [%p]: udp connect failed\n", ttcp); return -1; } udp_recv(ttcp->upcb, audp_recv_cb, ttcp); } else { /* bind to any IP address on port specified */ err = udp_bind(ttcp->upcb, IP_ADDR_ANY, ttcp->port); if (err!= ERR_OK) { WARN("TTCP [%p]: bind failed err=%d Port already used\n", ttcp, err); return -1; } // clear remote client data setRemoteClient(ttcp->sock, 0, 0); udp_recv(ttcp->upcb, audp_recv_cb, ttcp); } INFO_TCP("%s, loc:0x%x-%d rem:0x%x-%d\n", __FUNCTION__, ttcp->upcb->local_ip.addr, ttcp->upcb->local_port, ttcp->upcb->remote_ip.addr, ttcp->upcb->remote_port); return 0; } /** * Start a new ttcp transfer. It should be possible to call this function * multiple times in order to get multiple ttcp streams. done_cb() will be * invoked upon completion. * */ int ard_tcp_start(struct ip_addr addr, uint16_t port, void *opaque, ard_tcp_done_cb_t *done_cb, int mode, uint16_t nbuf, uint16_t buflen, int udp, int verbose, uint8_t sock, void** _ttcp) { struct ttcp* ttcp; int status; if (mode != TTCP_MODE_TRANSMIT && mode != TTCP_MODE_RECEIVE) { WARN("TTCP [-]: invalid mode\n"); return -1; } if (nbuf == 0) { WARN("TTCP [-]: invalid nbuf\n"); return -1; } if (buflen == 0) { WARN("TTCP [-]: invalid buflen\n"); return -1; } ttcp = calloc(1, sizeof(struct ttcp)); if (ttcp == NULL) { WARN("TTCP [-]: could not allocate memory for ttcp\n"); return -1; } ttcp->addr = addr; ttcp->port = port; ttcp->nbuf = nbuf; ttcp->mode = mode; ttcp->done_cb = done_cb; ttcp->opaque = opaque; ttcp->udp = udp; ttcp->verbose = verbose; ttcp->buflen = buflen; cleanNewClientConn(ttcp); if (ttcp->udp) status = udp_start(ttcp); else status = atcp_start(ttcp); if (status) { WARN("Start server FAILED!\n"); goto fail; } INFO_TCP("TTCP [%p-%p]: nbuf=%d, buflen=%d, port=%d (%s/%s)\n", ttcp, ((ttcp->udp==1)?(void*)ttcp->upcb:GET_FIRST_CLIENT_TCP(ttcp)), ttcp->nbuf, ttcp->buflen, ttcp->port, ProtMode2Str(ttcp->udp), Mode2Str(ttcp->mode)); *_ttcp = (void*) ttcp; ttcp->sock = sock; return 0; fail: ard_tcp_destroy(ttcp); return -1; } void ard_tcp_stop(void* ttcp) { struct ttcp* _ttcp = (struct ttcp*) ttcp; if (_ttcp == NULL) { WARN("ttcp = NULL!\n"); return; } if (_ttcp->mode == TTCP_MODE_TRANSMIT) { int i = getCurrClientConnId(); ard_tcp_destroy(_ttcp); clearMapSockTcp(getSock(_ttcp), GET_TCP_MODE(_ttcp)); _ttcp->tcp_poll_retries[i] = 0; }else{ DUMP_TCP_STATE(_ttcp); int i = getCurrClientConnId(); if ((_ttcp)&&(_ttcp->tpcb[i])&&(_ttcp->tpcb[i]->state!=LAST_ACK)&&(_ttcp->tpcb[i]->state!=CLOSED)) { // Flush all the data err_t err=tcp_output(_ttcp->tpcb[i]); INFO_TCP("flush data: tpcb:%p err:%d\n", _ttcp->tpcb[i], err); // if any socket cannot be close stop the close connection close_conn(_ttcp, _ttcp->tpcb[i]); } } } uint8_t getStateTcp(void* p, bool client) { struct ttcp* _ttcp = (struct ttcp*) p; if (ifStatus == false) return CLOSED; struct tcp_pcb * pcb = GET_FIRST_CLIENT_TCP_NV(_ttcp); if ((_ttcp != NULL) && ((pcb != NULL) || (client==0))) { IF_SPI_POLL(DUMP_TCP_STATE(_ttcp)); if (client) { if ((pcb->state != ESTABLISHED)&&(pcb->state != CLOSED)) DUMP_TCP_STATE(_ttcp); return pcb->state; } else { return _ttcp->lpcb->state; } } else { WARN_POLL("TCP not initialized ttcp:%p tpcb:%p lpcb:%p\n", _ttcp, ((_ttcp)?pcb:0), ((_ttcp)?_ttcp->lpcb:0)); } return CLOSED; } uint8_t getModeTcp(void* p) { struct ttcp* _ttcp = (struct ttcp*) p; if (_ttcp != NULL) return _ttcp->mode; return 0; } uint8_t isDataSent(void* p) { struct ttcp *_ttcp = (struct ttcp *)p; int8_t id = getCurrClientConnId(); if ((_ttcp)&&(!_ttcp->buff_sent[id])) { return 0; } return 1; } static err_t tcp_data_sent(void *arg, struct tcp_pcb *pcb, u16_t len) { struct ttcp *_ttcp; LWIP_UNUSED_ARG(len); _ttcp = arg; if (_ttcp == NULL) return ERR_ARG; GET_CLIENT_ID(_ttcp, pcb); _ttcp->tcp_poll_retries[id] = 0; _ttcp->buff_sent[id] = 1; INFO_TCP("Packet sent pcb:%p len:%d dur:%d left:%d\n", pcb, len, timer_get_ms() - startTime, (_ttcp)?(_ttcp->left[id]):0); if ((_ttcp)&&(_ttcp->left[id] > 0)) { tcp_send_data_pcb(_ttcp, pcb); } return ERR_OK; } int sendTcpData(void* p, uint8_t* buf, uint16_t len) { struct ttcp* _ttcp = (struct ttcp*) p; if (_ttcp==NULL) { WARN("ttcp == NULL!\n"); return WL_FAILURE; } struct tcp_pcb * pcb = GET_FIRST_CLIENT_TCP_NV(_ttcp); GET_CLIENT_ID(_ttcp, pcb); INFO_TCP_VER("ttcp:%p pcb:%p buf:%p len:%d\n", _ttcp, pcb, buf, len); DUMP_TCP(buf,len); IF_TCP_VER(DUMP_TCP_STATE(_ttcp)); if ((_ttcp != NULL) && (pcb != NULL) && (buf != NULL) && (len != 0) && (_ttcp->payload[id] != NULL)) { if (pcb->state == ESTABLISHED || pcb->state == CLOSE_WAIT || pcb->state == SYN_SENT || pcb->state == SYN_RCVD) { memcpy(_ttcp->payload[id], buf, len); _ttcp->payload[id][len]='\0'; INFO_TCP_VER("'%s'\n", _ttcp->payload[id]); _ttcp->left[id] = len; tcp_sent(pcb, tcp_data_sent); tcp_send_data_pcb(_ttcp, pcb); return WL_SUCCESS; } } //printk("Write failure _ttcp=%p _ttcp->tpcb=%p buf=%p len=%d\n", _ttcp, _ttcp->tpcb, buf, len); return WL_FAILURE; } int sendUdpData(void* ttcp, uint8_t* buf, uint16_t len) { struct ttcp* _ttcp = (struct ttcp*) ttcp; if ((_ttcp != NULL) && (buf != NULL) && (len != 0)) { INFO_TCP("buf:%p len:%d\n", buf, len); DUMP_TCP(buf,len); }else{ return WL_FAILURE; } struct pbuf* p = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM); if (p == NULL) { WARN("TTCP [%p]: could not allocate pbuf\n", ttcp); return WL_FAILURE; } memcpy(p->payload, buf, len); if (udp_send(_ttcp->upcb, p) != ERR_OK) { WARN("TTCP [%p]: udp_send() failed\n", _ttcp); pbuf_free(p); return WL_FAILURE; } pbuf_free(p); return WL_SUCCESS; } char usage[] = "Usage: ttcp -t/-r [-options] host\n\ -l length of bufs written to network (default 1024)\n\ -n number of bufs written to network (default 1024)\n\ -p port number to send to (default 2000)\n\ -u udp\n\ -v verbose\n"; /** * */ cmd_state_t cmd_ttcp(int argc, char* argv[], void* ctx) { int c; int mode = TTCP_MODE_TRANSMIT; int verbose = 0; uint16_t buflen = 1024; uint16_t nbuf = 1024; uint16_t port = 2000; int udp = 0; struct ip_addr addr = { 0 }; optind = 1; while ((c = getopt(argc, argv, "utrl:n:p:v")) != -1) { switch (c) { case 't': mode = TTCP_MODE_TRANSMIT; break; case 'r': mode = TTCP_MODE_RECEIVE; break; case 'l': buflen = atoi(optarg); break; case 'v': verbose = 1; break; case 'n': nbuf = atoi(optarg); break; case 'u': udp = 1; break; case 'p': port = atoi(optarg); break; } } if (mode == TTCP_MODE_TRANSMIT) { if (optind >= argc) { printk("%s", usage); return CMD_DONE; } addr = str2ip(argv[optind]); if (!addr.addr) { printk("%s", usage); return CMD_DONE; } } void* _ttcp = NULL; if (ard_tcp_start(addr, port, NULL, NULL, mode, nbuf, buflen, udp, verbose, 0, &_ttcp)) return CMD_DONE; return CMD_DONE; } #if 0 #include "lwip/sockets.h" void testlwip() { int Sock; fd_set fdsetR; FD_ZERO(&fdsetR); FD_SET(Sock, &fdsetR); fd_set fdsetE = fdsetR; int rc; const int cMillies = 10000; struct timeval timeout; timeout.tv_sec = cMillies / 1000; timeout.tv_usec = (cMillies % 1000) * 1000; //rc = lwip_select(Sock + 1, &fdsetR, NULL, &fdsetE, &timeout); } #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/ard_tcp.h ================================================ /* * ard_tcp.h * * Created on: May 27, 2010 * Author: mlf by Metodo2 srl */ #ifndef ARD_TCP_H #define ARD_TCP_H #include "console.h" #include "lwip/tcp.h" typedef void (ard_tcp_done_cb_t)(void *opaque, int result); #define TTCP_MODE_TRANSMIT 0 #define TTCP_MODE_RECEIVE 1 #define MAX_MODE_NUM 2 #define GET_TCP_MODE(X) ((X!=NULL)?((struct ttcp*)(X))->mode:0) #define IS_VALID_SOCK(SOCK) ((SOCK>=0)&&(SOCKudp:0) // Maximum number of client connection accepted by server #define MAX_CLIENT_ACCEPTED 4 #define NO_VALID_ID 0xff #define GET_FIRST_CLIENT_TCP(TTCP) getFirstClient(TTCP, 1) #define GET_FIRST_CLIENT_TCP_NV(TTCP) getFirstClient(TTCP, 0) #define GET_CLIENT_TCP(TTCP,ID) (((TTCP!=NULL)&&(ID>=0)&&(IDtpcb[ID] : NULL) #define GET_CLIENT_ID(TTCP, PCB) uint8_t id = NO_VALID_ID; do { \ id = getNewClientConnId(TTCP, PCB); \ if (id == NO_VALID_ID) return ERR_MEM; \ }while(0); #define GET_IDX_CONN(I) ((I+currConnId)payload[id]); \ if (TTCP->payload[id]) { \ free(TTCP->payload[id]); \ TTCP->payload[id] = NULL; } \ }while(0); #define FREE_PAYLOAD_ID(TTCP,ID) do { \ INFO_TCP("Freeing payload %d-%p\n", ID, TTCP->payload[ID]); \ if (TTCP->payload[ID]) { \ free(TTCP->payload[ID]); \ TTCP->payload[ID] = NULL; } \ }while(0); typedef struct ttcp { /* options */ struct ip_addr addr; /* host */ uint16_t port; /* -p */ uint16_t nbuf; /* -n */ int mode; /* -t */ int verbose; /* -v */ int udp; /* -u */ uint8_t sock; uint8_t buff_sent[MAX_CLIENT_ACCEPTED]; /* common */ uint16_t print_cnt; uint32_t start_time; uint32_t left[MAX_CLIENT_ACCEPTED]; uint32_t recved; ard_tcp_done_cb_t* done_cb; void* opaque; uint32_t buflen; /* -l */ uint32_t tid; /* TCP specific */ struct tcp_pcb* tpcb[MAX_CLIENT_ACCEPTED]; struct tcp_pcb* lpcb; char* payload[MAX_CLIENT_ACCEPTED]; uint8_t tcp_poll_retries[MAX_CLIENT_ACCEPTED]; bool pending_close[MAX_CLIENT_ACCEPTED]; /* UDP specific */ int udp_started; uint16_t udp_end_marker_left; struct udp_pcb* upcb; }ttcp_t; bool _connected; int ard_tcp_start(struct ip_addr addr, uint16_t port, void *opaque, ard_tcp_done_cb_t *done_cb, int mode, uint16_t nbuf, uint16_t buflen, int udp, int verbose, uint8_t sock, void** _ttcp); void ard_tcp_stop(void* ttcp); uint8_t getStateTcp(void* p, bool client ); uint8_t getModeTcp(void* p); int sendTcpData(void* p, uint8_t* buf, uint16_t len); int sendUdpData(void* p, uint8_t* buf, uint16_t len); uint8_t isDataSent(void* p ); cmd_state_t cmd_ttcp(int argc, char* argv[], void* ctx); int8_t setNewClientConn(struct ttcp* _ttcp, struct tcp_pcb *newpcb, uint8_t id); int8_t insertNewClientConn(struct ttcp* _ttcp, struct tcp_pcb *newpcb); int8_t removeNewClientConn(struct ttcp* _ttcp, struct tcp_pcb *newpcb); bool cleanNewClientConn(struct ttcp* _ttcp); int8_t getNewClientConnId(struct ttcp* _ttcp, struct tcp_pcb *newpcb); int8_t getCurrClientConnId(); struct tcp_pcb * getFirstClient(struct ttcp* _ttcp, bool verbose); void closeConnections(); #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/ard_utils.c ================================================ /* * ard_utils.c * * Created on: Jul 4, 2010 * Author: mlf by Metodo2 srl */ //#define _APP_DEBUG_ #include "lwip/pbuf.h" #include "wifi_spi.h" #include "ard_utils.h" #include "debug.h" #include "ard_spi.h" #include "ard_tcp.h" #define MAX_PBUF_STORED 30 tData pBufStore[MAX_PBUF_STORED][MAX_SOCK_NUM]; unsigned char headBuf[MAX_SOCK_NUM] = {0}; unsigned char tailBuf[MAX_SOCK_NUM] = {0}; #define IS_BUF_AVAIL(x) (tailBuf[x] != headBuf[x]) #define IS_BUF_EMPTY(x) ((tailBuf[x] == 0) && (headBuf[x] == 0)) void init_pBuf() { memset(pBufStore, 0, sizeof(pBufStore)); } uint8_t* insertBuf(uint8_t sock, uint8_t* buf, uint16_t len) { DUMP(buf,len); if (sock>= MAX_SOCK_NUM) { WARN("Sock out of range: sock=%d", sock); return NULL; } if (pBufStore[headBuf[sock]][sock].data != NULL) { WARN("Overwriting buffer %p idx:%d!\n", pBufStore[headBuf[sock]][sock].data, headBuf[sock]); // to avoid memory leak free the oldest buffer freetDataIdx(headBuf[sock], sock); } u8_t* p = (u8_t*)calloc(len,sizeof(u8_t)); if(p != NULL) { memcpy(p, buf, len); pBufStore[headBuf[sock]][sock].data = p; pBufStore[headBuf[sock]][sock].len = len; pBufStore[headBuf[sock]][sock].idx = 0; pBufStore[headBuf[sock]][sock].pcb = getTTCP(sock, TTCP_MODE_TRANSMIT); headBuf[sock]++; if (headBuf[sock] == MAX_PBUF_STORED) headBuf[sock] = 0; if (headBuf[sock] == tailBuf[sock]) { WARN("Avoid to Overwrite data [%d-%d]!\n", headBuf[sock], tailBuf[sock]); if (headBuf[sock] != 0) --headBuf[sock]; else headBuf[sock] = MAX_PBUF_STORED-1; } INFO_UTIL("Insert[%d]: %p:%d-%d [%d,%d]\n", sock, p, len, p[0], headBuf[sock], tailBuf[sock]); } return p; } uint16_t calcMergeLen(uint8_t sock) { uint16_t len = 0; unsigned char index = tailBuf[sock]; do { if (pBufStore[index][sock].data != NULL) { len += pBufStore[index][sock].len; len -= pBufStore[index][sock].idx; INFO_UTIL_VER(" [%d]: len:%d idx:%d tot:%d\n", sock, pBufStore[index][sock].len, pBufStore[index][sock].idx, len); } ++index; if (index == MAX_PBUF_STORED) index = 0; }while (index!=headBuf[sock]); return len; } uint16_t clearBuf(uint8_t sock) { uint16_t len = 0; unsigned char index = tailBuf[sock]; do { if (pBufStore[index][sock].data != NULL) { freetDataIdx(index,sock); } ++index; if (index == MAX_PBUF_STORED) index = 0; }while (index!=headBuf[sock]); tailBuf[sock]=index; return len; } uint8_t* mergeBuf(uint8_t sock, uint8_t** buf, uint16_t* _len) { uint16_t len = calcMergeLen(sock); uint8_t* p = (u8_t*)calloc(len,sizeof(u8_t)); uint8_t* _p = p; if(p != NULL) { unsigned char index = tailBuf[sock]; do { if (pBufStore[index][sock].data != NULL) { memcpy(p, pBufStore[index][sock].data, pBufStore[index][sock].len); p += pBufStore[index][sock].len; } ++index; if (index == MAX_PBUF_STORED) index = 0; }while (index!=headBuf[sock]); } DUMP(_p,len); if (buf != NULL) *buf = _p; if (_len != NULL) *_len = len; return _p; } uint8_t* insert_pBuf(struct pbuf* q, uint8_t sock, void* _pcb) { if (q == NULL) return NULL; if (pBufStore[headBuf[sock]][sock].data != NULL) { WARN("Overwriting buffer %p idx:%d!\n", pBufStore[headBuf[sock]][sock].data, headBuf[sock]); // to avoid memory leak free the oldest buffer freetDataIdx(headBuf[sock], sock); } u8_t* p = (u8_t*)calloc(q->tot_len,sizeof(u8_t)); if(p != NULL) { if (pbuf_copy_partial(q, p, q->tot_len,0) != q->tot_len) { WARN("pbuf_copy_partial failed: src:%p, dst:%p, len:%d\n", q, p, q->tot_len); free(p); p = NULL; return p; } pBufStore[headBuf[sock]][sock].data = p; pBufStore[headBuf[sock]][sock].len = q->tot_len; pBufStore[headBuf[sock]][sock].idx = 0; pBufStore[headBuf[sock]][sock].pcb = _pcb; headBuf[sock]++; if (headBuf[sock] == MAX_PBUF_STORED) headBuf[sock] = 0; if (headBuf[sock] == tailBuf[sock]) { WARN("Avoid to Overwrite data [%d-%d]!\n", headBuf[sock], tailBuf[sock]); if (headBuf[sock] != 0) --headBuf[sock]; else headBuf[sock] = MAX_PBUF_STORED-1; } INFO_UTIL("Insert[%d]: %p:%d-%d [%d,%d]\n", sock, p, q->tot_len, p[0], headBuf[sock], tailBuf[sock]); } return p; } void dumpPbuf(uint8_t sock) { unsigned char index = tailBuf[sock]; printk("headBuf=%d tailBuf=%d\n", headBuf[sock], tailBuf[sock]); do { if (pBufStore[index][sock].data != NULL) { printk("%d] pcb:%p Buf: %p Len:%d\n", pBufStore[index][sock].idx, pBufStore[index][sock].pcb, pBufStore[index][sock].data, pBufStore[index][sock].len); } ++index; if (index == MAX_PBUF_STORED) index = 0; }while (index!=headBuf[sock]); } tData* get_pBuf(uint8_t sock) { if (IS_BUF_EMPTY(sock)) return NULL; if (IS_BUF_AVAIL(sock)) { tData* p = &(pBufStore[tailBuf[sock]][sock]); INFO_UTIL_VER("%p [%d,%d]\n", p, headBuf[sock], tailBuf[sock]); return p; } return NULL; } void freetData(void * buf, uint8_t sock) { if (buf==NULL) { WARN("Buf == NULL!"); return; } pBufStore[tailBuf[sock]][sock].data = NULL; pBufStore[tailBuf[sock]][sock].len = 0; pBufStore[tailBuf[sock]][sock].idx = 0; pBufStore[tailBuf[sock]][sock].pcb = 0; if (++tailBuf[sock] == MAX_PBUF_STORED) tailBuf[sock] = 0; INFO_UTIL("%p [%d,%d]\n", buf, headBuf[sock], tailBuf[sock]); free(buf); } void freetDataIdx(uint8_t idxBuf, uint8_t sock) { if (idxBuf >=MAX_PBUF_STORED) { WARN("idxBuf out of range: %d\n", idxBuf); return; } void * buf = pBufStore[idxBuf][sock].data; INFO_UTIL("%p idx:%d\n", buf, idxBuf); free(buf); pBufStore[idxBuf][sock].data = 0; pBufStore[idxBuf][sock].len = 0; pBufStore[idxBuf][sock].idx = 0; pBufStore[idxBuf][sock].pcb = 0; } void ack_recved(void* pcb, int len); void ackAndFreeData(void* pcb, int len, uint8_t sock, uint8_t* data) { INFO_TCP("Ack pcb:%p len:%d sock:%d data:%p\n", pcb, len, sock, data); if (!IS_UDP_SOCK(sock)) ack_recved(pcb, len); if (data != NULL) freetData(data, sock); } bool isAvailTcpDataByte(uint8_t sock) { tData* p = get_pBuf(sock); if (p != NULL) { INFO_UTIL_VER("check:%d %d %p\n",p->idx, p->len, p->data); if (p->idx == p->len) { INFO_UTIL("Free %p other buf %d tail:%d head:%d\n", p->data, IS_BUF_AVAIL(sock), tailBuf[sock], headBuf[sock]); ackAndFreeData(p->pcb, p->len, sock, p->data); return (IS_BUF_AVAIL(sock)); }else{ return true; } } return false; } uint16_t getAvailTcpDataByte(uint8_t sock) { uint16_t len = calcMergeLen(sock); INFO_UTIL_VER("Availabled data: %d\n", len); return len; } bool getTcpDataByte(uint8_t sock, uint8_t* payload, uint8_t peek) { // ref field in struct pbuf has been used as index pointer for byte data tData* p = get_pBuf(sock); if (p != NULL) { if (p->idx < p->len) { uint8_t* buf = (uint8_t*)p->data; if (peek) *payload = buf[p->idx]; else *payload = buf[p->idx++]; INFO_UTIL_VER("get:%d %p %d\n",p->idx, p->data, *payload); if (p->idx == p->len) ackAndFreeData(p->pcb, p->len, sock, p->data); return true; }else{ ackAndFreeData(p->pcb, p->len, sock, p->data); } } return false; } bool getTcpData(uint8_t sock, void** payload, uint16_t* len) { tData* p = NULL; p = get_pBuf(sock); if (p != NULL) { *payload = p->data; *len = p->len; return true; } return false; } bool freeTcpData(uint8_t sock) { tData* p = NULL; p = get_pBuf(sock); if (p != NULL) { ackAndFreeData(p->pcb, p->len, sock, p->data); return true; } return false; } void freeAllTcpData(uint8_t sock) { tData* p = NULL; do{ p = get_pBuf(sock); if (p != NULL) freetData(p->data, sock); }while(p!=NULL); } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/ard_utils.h ================================================ /* * ard_utils.h * * Created on: Jul 4, 2010 * Author: mlf by Metodo2 srl */ #ifndef ARD_UTILS_H_ #define ARD_UTILS_H_ #include "gpio.h" #include "debug.h" #include "ARDUINO/arduino.h" #define INIT_SIGNAL_FOR_SPI() gpio_disable_pin_pull_up(ARDUINO_HANDSHAKE_PIN); #define BUSY_FOR_SPI() gpio_set_gpio_pin(ARDUINO_HANDSHAKE_PIN) #define AVAIL_FOR_SPI() gpio_clr_gpio_pin(ARDUINO_HANDSHAKE_PIN) #define LED0_UP() gpio_set_gpio_pin(LED0_GPIO) #define LED0_DN() gpio_clr_gpio_pin(LED0_GPIO) #define LED0_TL() gpio_tgl_gpio_pin(LED0_GPIO) #define LED1_UP() gpio_set_gpio_pin(LED1_GPIO) #define LED1_DN() gpio_clr_gpio_pin(LED1_GPIO) #define LED1_TL() gpio_tgl_gpio_pin(LED1_GPIO) #define LED2_UP() gpio_set_gpio_pin(LED2_GPIO) #define LED2_DN() gpio_clr_gpio_pin(LED2_GPIO) #define LED2_TL() gpio_tgl_gpio_pin(LED2_GPIO) #ifdef _DEBUG_ #define SIGN0_UP LED0_UP #define SIGN0_DN LED0_DN #define SIGN0_TL LED0_TL #define SIGN1_UP LED1_UP #define SIGN1_DN LED1_DN #define SIGN1_TL LED1_TL #define SIGN2_UP LED2_UP #define SIGN2_DN LED2_DN #define SIGN2_TL LED2_TL #define DEB_PIN_UP(X) gpio_set_gpio_pin(DEB##X##_PIN_GPIO) #define DEB_PIN_DN(X) gpio_clr_gpio_pin(DEB##X##_PIN_GPIO) #define DEB_PIN_ENA(X) gpio_enable_gpio_pin(DEB##X##_PIN_GPIO) #define DEB_PIN_TOGGLE(X) gpio_tgl_gpio_pin(DEB##X##_PIN_GPIO) #define DEB_PIN_TRIGGER(X) DEB_PIN_DN(X); DEB_PIN_UP(X); #else #define SIGN0_UP() #define SIGN0_DN() #define SIGN0_TL() #define SIGN1_UP() #define SIGN1_DN() #define SIGN1_TL() #define SIGN2_UP() #define SIGN2_DN() #define SIGN2_TL() #define DEB_PIN_UP(X) #define DEB_PIN_DN(X) #define DEB_PIN_ENA(X) #define DEB_PIN_TOGGLE(X) #define DEB_PIN_TRIGGER(X) //#define TOGGLE_SIG0 #endif #define DELAY_450NS asm volatile("nop") #define DELAY_1uS DELAY_450NS; DELAY_450NS; #define TOGGLE_SIG0() SIGN0_UP(); DELAY_450NS;SIGN0_DN(); #define LINK_LED_OFF LED0_UP #define ERROR_LED_OFF LED1_UP #define DATA_LED_OFF LED2_UP #define LINK_LED_ON LED0_DN #define ERROR_LED_ON LED1_DN #define DATA_LED_ON LED2_DN #define LINK_LED_BL LED0_TL #define ERROR_LED_BL LED1_TL #define DATA_LED_BL LED2_TL #define CREATE_HEADER_REPLY(REPLY, RECV, NUM_PARAMS)\ REPLY[0] = RECV[0]; \ REPLY[1] = RECV[1] | REPLY_FLAG; \ REPLY[2] = NUM_PARAMS; #define CREATE_HEADER_REPLY_WAIT(REPLY, RECV, NUM_PARAMS)\ REPLY[0] = RECV[0]; \ REPLY[1] = RECV[1] | WAIT_FLAG; \ REPLY[2] = NUM_PARAMS; #define END_HEADER_REPLY(REPLY, TOT_LEN, COUNT)\ REPLY[TOT_LEN] = END_CMD; \ REPLY[TOT_LEN+1] = 0; \ COUNT=TOT_LEN+1; #define RETURN_ERR_REPLY(RECV,REPLY,COUNT) \ {uint8_t err = 0; return ack_reply_cb(RECV,REPLY,&err,COUNT);} #define CHECK_ARD_NETIF(RECV,REPLY,COUNT) \ if (ard_netif == NULL) \ { uint8_t err = 0; return ack_reply_cb(RECV,REPLY,&err,COUNT); } #define PUT_LONG_IN_BYTE_HO(LONG, BYTE, IDX) { \ uint32_t _long = LONG; \ BYTE[IDX] = 4; \ BYTE[IDX+1] = (uint8_t)(_long & 0xff); \ BYTE[IDX+2] = (uint8_t)((_long & 0xff00)>>8); \ BYTE[IDX+3] = (uint8_t)((_long & 0xff0000)>>16); \ BYTE[IDX+4] = (uint8_t)((_long & 0xff000000)>>24); \ } #define PUT_LONG_IN_BYTE_NO(LONG, BYTE, IDX) { \ uint32_t _long = LONG; \ BYTE[IDX] = 4; \ BYTE[IDX+4] = (uint8_t)(_long & 0xff); \ BYTE[IDX+3] = (uint8_t)((_long & 0xff00)>>8); \ BYTE[IDX+2] = (uint8_t)((_long & 0xff0000)>>16); \ BYTE[IDX+1] = (uint8_t)((_long & 0xff000000)>>24); \ } #define PUT_DATA_INT(INT, BYTE, IDX) { \ uint16_t _int = INT; \ BYTE[IDX] = 2; \ BYTE[IDX+1] = (uint8_t)((_int & 0xff00)>>8); \ BYTE[IDX+2] = (uint8_t)(_int & 0xff); \ } #define PUT_DATA_INT_NO(INT, BYTE, IDX) { \ uint16_t _int = INT; \ BYTE[IDX] = 2; \ BYTE[IDX+2] = (uint8_t)((_int & 0xff00)>>8); \ BYTE[IDX+1] = (uint8_t)(_int & 0xff); \ } #define PUT_DATA_BYTE(DATA, BYTE, IDX) { \ BYTE[IDX] = 1; \ BYTE[IDX+1] = (uint8_t)DATA; \ } #define PUT_BUFDATA_BYTE(BUF, BUFLEN, BYTE, IDX) { \ BYTE[IDX] = (uint8_t)(BUFLEN & 0xff); \ uint16_t i = 0; \ for (; i>8); \ BYTE[IDX+1] = (uint8_t)(BUFLEN & 0xff); \ uint16_t i = 0; \ for (; iparamLen == LEN)) #define NEXT_PARAM(PARAM) \ do { \ if (PARAM!=NULL){ \ PARAM=(tParam*)((uint8_t*)PARAM+PARAM->paramLen+1); \ GET_PARAM_BYTE(PARAM, end) \ if (end == END_CMD) WARN("End of cmd params", PARAM); \ } \ }while(0); #define GET_PARAM_LONG(PARAM, LONG) \ uint32_t LONG = 0; \ if CHECK_PARAM_LEN(PARAM, 4) { \ tLongParam* s = (tLongParam*)PARAM; \ LONG = s->param; \ } #define GET_PARAM_INT(PARAM, INT) \ uint16_t INT = 0; \ if CHECK_PARAM_LEN(PARAM, 2) { \ tIntParam* s = (tIntParam*)PARAM; \ INT = s->param; \ } #define GET_PARAM_BYTE(PARAM, BYTE) \ uint8_t BYTE = 0; \ if CHECK_PARAM_LEN(PARAM, 1) { \ tByteParam* s = (tByteParam*)PARAM; \ BYTE = s->param; \ } #define GET_PARAM_NEXT(TYPE, PARAM, DATA) \ GET_PARAM_##TYPE(PARAM, DATA) \ NEXT_PARAM(PARAM) #ifdef _SPI_STATS_ #define STATSPI_TIMEOUT_ERROR() \ statSpi.timeoutIntErr++; \ statSpi.rxErr++; \ statSpi.lastError = SPI_TIMEOUT_ERROR; \ statSpi.status = spi_getStatus(ARD_SPI); #define STATSPI_DISALIGN_ERROR() \ statSpi.frameDisalign++; \ statSpi.rxErr++; \ statSpi.lastError = SPI_ALIGN_ERROR; \ statSpi.status = spi_getStatus(ARD_SPI); #define STATSPI_OVERRIDE_ERROR() \ statSpi.overrideFrame++; \ statSpi.rxErr++; \ statSpi.lastError = SPI_OVERRIDE_ERROR; \ statSpi.status = spi_getStatus(ARD_SPI); #define STATSPI_TX_TIMEOUT_ERROR() \ statSpi.timeoutErr++; \ statSpi.txErr++; \ statSpi.lastError = SPI_ERROR_TIMEOUT; \ statSpi.status = spi_getStatus(ARD_SPI); #else #define STATSPI_TIMEOUT_ERROR() #define STATSPI_TX_TIMEOUT_ERROR() #define STATSPI_DISALIGN_ERROR() #define STATSPI_OVERRIDE_ERROR() #endif #define DUMP_TCP_STATE(TTCP) do {\ int i = getCurrClientConnId(); \ INFO_TCP("%d] ttcp:%p tpcb:%p state:%d lpcb:%p state:%d left:%d sent:%d\n", \ i, TTCP, TTCP->tpcb[i], (TTCP->tpcb[i])?TTCP->tpcb[i]->state:0, \ TTCP->lpcb, (TTCP->lpcb)?TTCP->lpcb->state:0, \ (TTCP->tpcb[i])?TTCP->left[i]:0, (TTCP->tpcb[i])?TTCP->buff_sent[i]:0); \ } while(0); #define Mode2Str(_Mode) ((_Mode==0)?"TRANSMIT":"RECEIVE") #define ProtMode2Str(_protMode) ((_protMode==0)?"TCP":"UDP") typedef struct sData { uint8_t* data; uint16_t len; uint16_t idx; void* pcb; }tData; struct pbuf; void init_pBuf(); uint8_t* insert_pBuf(struct pbuf* q, uint8_t sock, void* _pcb); uint8_t* insertBuf(uint8_t sock, uint8_t* buf, uint16_t len); uint8_t* mergeBuf(uint8_t sock, uint8_t** buf, uint16_t* _len); uint16_t clearBuf(uint8_t sock); tData* get_pBuf(uint8_t sock); void freetData(void * buf, uint8_t sock); void freetDataIdx(uint8_t idxBuf, uint8_t sock); bool isBufAvail(); bool getTcpData(uint8_t sock, void** payload, uint16_t* len); bool getTcpDataByte(uint8_t sock, uint8_t* payload, uint8_t peek); uint16_t getAvailTcpDataByte(uint8_t sock); bool isAvailTcpDataByte(uint8_t sock); uint8_t freeTcpData(uint8_t sock); void freeAllTcpData(uint8_t sock); #endif /* ARD_UTILS_H_ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/avr32_spi.c ================================================ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #define ARRAY_SIZE(a) sizeof(a) / sizeof(a[0]) __attribute__((__interrupt__)) void avr32_irq_handler(void); void owl_spi_mdelay(uint32_t ms); int owl_spi_init(U8 *flags) { #ifdef _ASSERT_ENABLE_ /* To silence warning if Assert() macro is empty */ volatile avr32_pm_t *pm = &AVR32_PM; #endif volatile avr32_spi_t *spi = &WL_SPI; #if WL_SPI_CS == 1 volatile avr32_spi_csr1_t* CSR = &spi->CSR1; #elif WL_SPI_CS == 2 volatile avr32_spi_csr2_t* CSR = &spi->CSR2; #elif WL_SPI_CS == 3 volatile avr32_spi_csr3_t* CSR = &spi->CSR3; #elif SPI_CS == 0 volatile avr32_spi_csr0_t* CSR = &spi->CSR0; #endif #ifndef WITH_NO_DMA volatile avr32_pdca_channel_t *pdca_tx = &AVR32_PDCA.channel[0]; volatile avr32_pdca_channel_t *pdca_rx = &AVR32_PDCA.channel[1]; #endif #ifndef WL_IRQ_PIN *flags = SPI_FLAG_POLL; #else *flags = 0; #endif #ifdef WL_IRQ_PIN /* input, irq */ gpio_enable_gpio_pin(WL_IRQ_PIN); gpio_enable_pin_pull_up(WL_IRQ_PIN); #endif //#ifdef WL_RESET_PIN // /* reset pin */ // gpio_enable_gpio_pin(WL_RESET_PIN); // gpio_set_gpio_pin(WL_RESET_PIN); //#endif #ifdef WL_POWER_PIN /* power off the device */ gpio_enable_gpio_pin(WL_POWER_PIN); gpio_set_gpio_pin(WL_POWER_PIN); #endif #ifdef WL_SHUTDOWN_PIN gpio_enable_gpio_pin(WL_SHUTDOWN_PIN); #ifdef WL_NO_INTERNAL_RESET /* never defined for SPB104/SPB105 */ gpio_clr_gpio_pin(WL_SHUTDOWN_PIN); #endif #ifdef WL_EXTERNAL_RESET gpio_enable_gpio_pin(WL_RESET_PIN); #endif #endif /* WL_SHUTDOWN_PIN */ #ifdef WL_POWER_PIN /* power on the device */ gpio_clr_gpio_pin(WL_POWER_PIN); #endif #ifdef WL_SHUTDOWN_PIN #ifdef WL_NO_INTERNAL_RESET /* never defined for SPB104/SPB105 */ owl_spi_mdelay(5); gpio_set_gpio_pin(WL_SHUTDOWN_PIN); #elif WL_EXTERNAL_RESET owl_spi_mdelay(5); gpio_set_gpio_pin(WL_SHUTDOWN_PIN); owl_spi_mdelay(20); //delay_ms(10); //2ms /* reset pin */ gpio_set_gpio_pin(WL_RESET_PIN); #else /* The shutdown pin will go high once the device is powered */ { #define SHUTDOWN_TIMEOUT 350 uint32_t shutdown_timer = 0; while (gpio_get_pin_value(WL_SHUTDOWN_PIN) == 0) { if (shutdown_timer > SHUTDOWN_TIMEOUT) { printk("Timeout WL Shutdown\n"); return -1; } owl_spi_mdelay(5); shutdown_timer += 5; } } #endif /* WL_NO_INTERNAL_RESET */ #else /* We need to make a guess about the time needed to power the device, * this will depend on the hardware design. */ owl_spi_mdelay(5); #endif /* WL_SHUTDOWN_PIN */ /* Note: SPI0 clock enabled at reset in pm->pbamask (see 13.6.3) */ Assert(pm->pbamask & (1 << 5)); /* Note: GPIO clock enabled at reset in pm->pbamask (see 13.6.3) */ Assert(pm->pbamask & (1 << 1)); #ifdef WL_IRQ_PIN /* 22.4.7: "In every port there are four interrupt lines * connected to the interrupt controller. Every eigth * interrupts in the port are ored together to form an * interrupt line." * * WL_IRQ_# = (WL_IRQ_PIN / 32) * 4 + (WL_IRQ_PIN / 8) % 4 * 62 => 1 * 4 + 3 = 7 */ INTC_register_interrupt(&avr32_irq_handler, WL_IRQ, AVR32_INTC_INT0); #endif #ifndef WITH_NO_DMA INTC_register_interrupt(&avr32_irq_handler, AVR32_PDCA_IRQ_0, AVR32_INTC_INT0); INTC_register_interrupt(&avr32_irq_handler, AVR32_PDCA_IRQ_1, AVR32_INTC_INT0); pdca_tx->IER.terr = 1; pdca_rx->IER.terr = 1; #endif #ifdef WL_SPI_CLOCK_DIVIDER CSR->scbr = WL_SPI_CLOCK_DIVIDER; #else CSR->scbr = 2; #endif /* Use max width of TDR register, 16 bit transfers */ CSR->bits = 0x8; /* Make sure that we can hold CS low until transfer is completed, e.g * LASTXFER is set in TDR. */ CSR->csaat = 1; /* NRG component requires clock polarity high */ CSR->cpol = 1; #ifdef WL_IRQ_PIN /* make sure to clear any pending bits in ifr here. */ gpio_clear_pin_interrupt_flag(WL_IRQ_PIN); #endif return 0; } #ifndef WITH_NO_DMA static void dma_txrx(const U8* in, U8* out, U16 len) { volatile avr32_pdca_channel_t *pdca_tx = &AVR32_PDCA.channel[0]; volatile avr32_pdca_channel_t *pdca_rx = &AVR32_PDCA.channel[1]; /* setup tx */ pdca_tx->mar = (U32) in; pdca_tx->PSR.pid = WL_PDCA_PID_TX; pdca_tx->tcr = len / 2; pdca_tx->MR.size = 1; /* 2-byte */ pdca_tx->IER.trc = 1; /* setup rx */ pdca_rx->mar = (U32) out; pdca_rx->PSR.pid = WL_PDCA_PID_RX; pdca_rx->tcr = len / 2; pdca_rx->MR.size = 1; /* 2-byte */ pdca_rx->IER.trc = 1; /* start dma's. for some reason rx must be started prior to tx */ pdca_rx->CR.ten = 1; pdca_tx->CR.ten = 1; /* blocking wait until transfer is completed */ while (!(pdca_tx->ISR.trc && pdca_rx->ISR.trc)); } #endif /* access data using byte pointers since we might get unaligned * data from lwip. The cpu will issue a data abort if we try * to access data which is not properly aligned. See data sheet. * * Note that fifo_txrx() doesn't handle the case where len is not a * multiple of two bytes properly. * * However, there is no actual case where len is odd at the same time * as the "out" pointer is non-NULL; therefore I think that in practice, * we'll not write beyond the end of the "out" array. * * The extra unknown byte fetched from the in pointer will be discarded * by the device since a length field included in the packet header will inform * the device of the actual number of valid bytes (this implementation is * kind of hidden inside the library). */ static void fifo_txrx(const U8 *in, U8* out, U16 len) { volatile avr32_spi_t *spi = &WL_SPI; UnionCPtr in_ptr; UnionPtr out_ptr; U32 sr; Assert(len); in_ptr.u8ptr = in; out_ptr.u8ptr = out; while (len) { U16 rdr; union { avr32_spi_tdr_t TDR; U32 tdr; } reg = { { 0 } }; while (!spi->SR.tdre); while (!spi->SR.txempty); /* prepare tx data register contents */ if (in_ptr.u8ptr) { reg.TDR.td |= (in_ptr.u8ptr[0] << 8) | in_ptr.u8ptr[1]; in_ptr.u16ptr++; } else reg.TDR.td |= 0xffff; /* perform tx */ spi->tdr = reg.tdr; /* wait until rx is ready */ while (!spi->SR.rdrf); /* fetch rx data */ rdr = spi->RDR.rd; if (out_ptr.u8ptr) { out_ptr.u8ptr[0] = (rdr >> 8) & 0xff; out_ptr.u8ptr[1] = rdr & 0xff; out_ptr.u16ptr++; } if (len >= 2) len -= 2; else len = 0; } sr = spi->sr; Assert(!(sr & AVR32_SPI_SR_OVRES_MASK)); Assert(!(sr & AVR32_SPI_SR_MODF_MASK)); } void owl_spi_txrx(const U8 *in, U8* out, U16 len) { #ifndef WITH_NO_DMA static uint8_t buf[MAX_BLOCK_LEN]; /* unaligned data or odd number of bytes, then skip dma */ if ((U32) in % 4 || (U32) out % 4 || len % 2) { fifo_txrx(in, out, len); } else { if (in == NULL) { memset(buf, 0xff, len); in = buf; } else if (out == NULL) { out = buf; } dma_txrx(in, out, len); } #else fifo_txrx(in, out, len); #endif } void owl_spi_irq(U8 enable) { #ifdef WL_IRQ_PIN if (enable) gpio_enable_pin_interrupt(WL_IRQ_PIN, GPIO_PIN_CHANGE); else gpio_disable_pin_interrupt(WL_IRQ_PIN); #endif } void owl_spi_cs(U8 enable) { volatile avr32_spi_t *spi = &WL_SPI; /* * PCS = xxx0 => NPCS[3:0] = 1110 * PCS = xx01 => NPCS[3:0] = 1101 * PCS = x011 => NPCS[3:0] = 1011 * PCS = 0111 => NPCS[3:0] = 0111 * PCS = 1111 => forbidden (no peripheral is selected) */ if (enable) #if WL_SPI_CS == 2 spi->MR.pcs = 0x3; /* cs2 */ #elif WL_SPI_CS == 1 spi->MR.pcs = 0x1; /* cs1 */ #elif WL_SPI_CS == 3 spi->MR.pcs = 0x7; /* cs3 */ #elif WL_SPI_CS == 0 spi->MR.pcs = 0x0; /* cs0 */ #endif else spi->MR.pcs = 0xf; } void owl_spi_mdelay(uint32_t ms) { volatile int a = 0; int i; for (i = 0; i < ms * 5000; i++) a++; } __attribute__((__interrupt__)) void avr32_irq_handler(void) { #ifndef WITH_NO_DMA volatile avr32_pdca_channel_t *pdca_tx = &AVR32_PDCA.channel[0]; volatile avr32_pdca_channel_t *pdca_rx = &AVR32_PDCA.channel[1]; /* tx xfer complete */ if (pdca_tx->IMR.trc && pdca_tx->ISR.trc) { pdca_tx->IDR.trc = 1; pdca_tx->CR.tdis = 1; /* disable tx xfer */ } /* rx xfer complete */ if (pdca_rx->IMR.trc && pdca_rx->ISR.trc) { pdca_rx->IDR.trc = 1; pdca_rx->CR.tdis = 1; /* disable rx xfer */ } #endif #ifdef WL_IRQ_PIN if (gpio_get_pin_interrupt_flag(WL_IRQ_PIN)) { gpio_clear_pin_interrupt_flag(WL_IRQ_PIN); wl_spi_irq(); } #endif } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/board_init.c ================================================ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #ifdef WITH_SDRAM #include #endif #include #include #ifndef NO_SERIAL /* The bootloader does not want serial port * code */ #include int board_putchar(char c) { int timeout = USART_DEFAULT_TIMEOUT; if (c == '\n') { do { if (!timeout--) return USART_FAILURE; } while (usart_write_char(&CONFIG_CONSOLE_PORT, '\r') != USART_SUCCESS); timeout = USART_DEFAULT_TIMEOUT; } do { if (!timeout--) return USART_FAILURE; } while (usart_write_char(&CONFIG_CONSOLE_PORT, c) != USART_SUCCESS); return USART_SUCCESS; } #endif /* NO_SERIAL */ /** * Initializes the MCU system clocks. */ static void init_sys_clocks(void) { /* if we don't run on OSC0 don't switch to it since we don't know * what kind of oscillator we have here */ #if OSC == 0 /* switch to OSC0 to speed up the booting */ pm_switch_to_osc0(&AVR32_PM, FOSC0, OSC0_STARTUP); #endif #ifndef USE_PLL return; #endif /* For audio, ee have to use OSC1 on to generate the correct clockrate * for the SSC */ #if OSC == 1 /* start oscillator1 */ pm_enable_osc1_crystal(&AVR32_PM, FOSC1); pm_enable_clk1(&AVR32_PM, OSC1_STARTUP); #endif /* configure pll multipliers */ pm_pll_setup(&AVR32_PM, 0, /* pll */ PLL_MUL, /* mul */ 1, /* div */ OSC, /* osc */ 16); /* lockcount */ /* set PLL operating range and divider (fpll = fvco/2) * this gives PLL output = 66 MHz (62.0928 MHz for EVK1105/OSC1) */ pm_pll_set_option(&AVR32_PM, 0, /* pll */ 1, /* pll_freq */ 1, /* pll_div2 */ 0); /* pll_wbwdisable. */ /* start PLL0 and wait for the lock */ pm_pll_enable(&AVR32_PM, 0); pm_wait_for_pll0_locked(&AVR32_PM); /* Set all peripheral clocks torun at master clock rate */ pm_cksel(&AVR32_PM, 0, /* pbadiv */ 0, /* pbasel */ 0, /* pbbdiv */ 0, /* pbbsel */ 0, /* hsbdiv */ 0); /* hsbsel */ /* Set one waitstate for the flash */ flashc_set_wait_state(1); /* Switch to PLL0 as the master clock */ pm_switch_to_clock(&AVR32_PM, AVR32_PM_MCCTRL_MCSEL_PLL0); } static void init_exceptions(void) { extern void _evba; Set_system_register(AVR32_EVBA, (int)&_evba); Enable_global_exception(); } static void init_hmatrix(void) { union { unsigned long scfg; avr32_hmatrix_scfg_t SCFG; } u_avr32_hmatrix_scfg = { AVR32_HMATRIX.scfg[AVR32_HMATRIX_SLAVE_FLASH] }; u_avr32_hmatrix_scfg.SCFG.defmstr_type = AVR32_HMATRIX_DEFMSTR_TYPE_LAST_DEFAULT; AVR32_HMATRIX.scfg[AVR32_HMATRIX_SLAVE_FLASH] = u_avr32_hmatrix_scfg.scfg; } static void init_interrupts(void) { INTC_init_interrupts(); Enable_global_interrupt(); } static void init_spi(void) { #if defined(WL_SPI) int i; #endif #if defined(AT45DBX_SPI) static const gpio_map_t AT45DBX_SPI_GPIO_MAP = { { AT45DBX_SPI_SCK_PIN, AT45DBX_SPI_SCK_FUNCTION }, { AT45DBX_SPI_MISO_PIN, AT45DBX_SPI_MISO_FUNCTION }, { AT45DBX_SPI_MOSI_PIN, AT45DBX_SPI_MOSI_FUNCTION }, { AT45DBX_SPI_NPCS2_PIN, AT45DBX_SPI_NPCS2_FUNCTION }, }; #endif #if defined(WL_SPI) const gpio_map_t WL_SPI_GPIO_MAP = { #if defined(WL_SPI_NPCS0) WL_SPI_NPCS0, #endif WL_SPI_NPCS, WL_SPI_MISO, WL_SPI_MOSI, WL_SPI_SCK }; #endif #if defined(WL_SPI) || defined(AT45DBX_SPI) spi_options_t spiOptions = { .modfdis = 1 /* only param used by spi_initMaster() */ }; #endif #if defined(AT45DBX_SPI) gpio_enable_module(AT45DBX_SPI_GPIO_MAP, sizeof(AT45DBX_SPI_GPIO_MAP) / sizeof(AT45DBX_SPI_GPIO_MAP[0])); spi_initMaster(AT45DBX_SPI, &spiOptions); spi_selectionMode(AT45DBX_SPI, 0, 0, 0); #endif #if defined(WL_SPI) /* same pins might be initialized twice here */ gpio_enable_module(WL_SPI_GPIO_MAP, sizeof(WL_SPI_GPIO_MAP) / sizeof(WL_SPI_GPIO_MAP[0])); for (i = 0; i < sizeof(WL_SPI_GPIO_MAP)/sizeof(WL_SPI_GPIO_MAP[0]); i++) gpio_enable_pin_pull_up(WL_SPI_GPIO_MAP[i].pin); /* same SPI controller might be initialized again */ spi_initMaster(&WL_SPI, &spiOptions); spi_selectionMode(&WL_SPI, 0, 0, 0); #endif #if defined(AT45DBX_SPI) spi_enable(AT45DBX_SPI); /* put up flash reset pin */ gpio_set_gpio_pin(AT45DBX_CHIP_RESET); #endif #if defined(WL_SPI) spi_enable(&WL_SPI); #endif } static void init_rs232(void) { #ifndef NO_SERIAL #if defined(BOARD_RS232_0) const gpio_map_t BOARD_RS232_0_GPIO_MAP = { BOARD_RS232_0_TX, BOARD_RS232_0_RX, #if defined(BOARD_RS232_0_RTS) && defined (BOARD_RS232_0_CTS) BOARD_RS232_0_RTS, BOARD_RS232_0_CTS #endif }; #endif #if defined(BOARD_RS232_1) const gpio_map_t BOARD_RS232_1_GPIO_MAP = { BOARD_RS232_1_TX, BOARD_RS232_1_RX #if defined(BOARD_RS232_1_RTS) && defined (BOARD_RS232_1_CTS) BOARD_RS232_1_RTS, BOARD_RS232_1_CTS #endif }; #endif #if defined(BOARD_RS232_0) gpio_enable_module(BOARD_RS232_0_GPIO_MAP, sizeof(BOARD_RS232_0_GPIO_MAP) / sizeof(BOARD_RS232_0_GPIO_MAP[0])); #endif #if defined(BOARD_RS232_1) gpio_enable_module(BOARD_RS232_1_GPIO_MAP, sizeof(BOARD_RS232_1_GPIO_MAP) / sizeof(BOARD_RS232_1_GPIO_MAP[0])); #endif #endif /* NO_SERIAL */ } static void init_printk(void) { #ifndef NO_SERIAL #if defined(CONFIG_CONSOLE_PORT) const usart_options_t usart_options = { .baudrate = 57600, .charlength = 8, .paritytype = USART_NO_PARITY, .stopbits = USART_1_STOPBIT, .channelmode = USART_NORMAL_CHMODE }; usart_init_rs232(&CONFIG_CONSOLE_PORT, &usart_options, FPBA_HZ); #endif #endif /* NO_SERIAL */ } void board_init(void) { init_exceptions(); init_hmatrix(); init_sys_clocks(); init_interrupts(); init_rs232(); init_printk(); #ifdef WITH_SDRAM sdramc_init(FHSB_HZ); #endif init_spi(); } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/board_init.h ================================================ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef STARTUP_H #define STARTUP_H #include #include /* defines SPB104, SPB105 */ void board_init(void); /* * * EVK1100 * --------------------------------------------------------------------------- * */ #if BOARD == EVK1100 /* USART0 physical assignment */ #define BOARD_RS232_0 AVR32_USART1 #define BOARD_RS232_0_TX \ { AVR32_USART1_TXD_0_0_PIN, AVR32_USART1_TXD_0_0_FUNCTION } #define BOARD_RS232_0_RX \ { AVR32_USART1_RXD_0_0_PIN, AVR32_USART1_RXD_0_0_FUNCTION } /* USART1 physical assignment */ #define BOARD_RS232_1 AVR32_USART0 #define BOARD_RS232_1_TX \ { AVR32_USART0_TXD_0_0_PIN, AVR32_USART0_TXD_0_0_FUNCTION } #define BOARD_RS232_1_RX \ { AVR32_USART0_RXD_0_0_PIN, AVR32_USART0_RXD_0_0_FUNCTION }, /* Clocks */ #define USE_PLL #define OSC 0 #define PLL_MUL 10 /* Wifi (SPB104 only) */ #if defined(EXT_BOARD) #if EXT_BOARD == SPB104 #define WL_SPI AVR32_SPI1 /* Pin 8 NC, so no irq support if using SD-slot */ #define WL_SPI_CLOCK_DIVIDER 3 /* due to adapter */ #define WL_PDCA_PID_TX AVR32_PDCA_PID_SPI1_TX #define WL_PDCA_PID_RX AVR32_PDCA_PID_SPI1_RX #define WL_SPI_CS 1 #define WL_SPI_NPCS0 { AVR32_SPI1_NPCS_0_0_PIN, AVR32_SPI1_NPCS_0_0_FUNCTION } #define WL_SPI_NPCS { AVR32_SPI1_NPCS_1_0_PIN, AVR32_SPI1_NPCS_1_0_FUNCTION } #define WL_SPI_MISO { AVR32_SPI1_MISO_0_0_PIN, AVR32_SPI1_MISO_0_0_FUNCTION } #define WL_SPI_MOSI { AVR32_SPI1_MOSI_0_0_PIN, AVR32_SPI1_MOSI_0_0_FUNCTION } #define WL_SPI_SCK { AVR32_SPI1_SCK_0_0_PIN, AVR32_SPI1_SCK_0_0_FUNCTION } #endif #endif /* EXT_BOARD */ /* * * EVK1101 * --------------------------------------------------------------------------- * */ #elif BOARD == EVK1101 /* USART0 physical assignment */ #define BOARD_RS232_0 AVR32_USART1 #define BOARD_RS232_0_TX \ { AVR32_USART1_TXD_0_0_PIN, AVR32_USART1_TXD_0_0_FUNCTION } #define BOARD_RS232_0_RX \ { AVR32_USART1_RXD_0_0_PIN, AVR32_USART1_RXD_0_0_FUNCTION } /* Clocks */ #define USE_PLL #define OSC 0 #define PLL_MUL 9 /* Wifi (SPB104 only) */ #if defined(EXT_BOARD) #if EXT_BOARD == SPB104 /* Pin 8 NC, so no irq support if using SD-slot */ #define WL_SPI AVR32_SPI #define WL_SPI_CLOCK_DIVIDER 3 /* due to adapter */ #define WL_PDCA_PID_TX AVR32_PDCA_PID_SPI_TX #define WL_PDCA_PID_RX AVR32_PDCA_PID_SPI_RX #define WL_SPI_CS 1 #if EXT_BOARD == SPB105 #define WL_SHUTDOWN_PIN AVR32_PIN_PA06 #define WL_POWER_PIN AVR32_PIN_PA30 #endif #define WL_SPI_NPCS0 { AVR32_SPI_NPCS_0_0_PIN, AVR32_SPI_NPCS_0_0_FUNCTION } #define WL_SPI_NPCS { AVR32_SPI_NPCS_1_0_PIN, AVR32_SPI_NPCS_1_0_FUNCTION } #define WL_SPI_MISO { AVR32_SPI_MISO_0_0_PIN, AVR32_SPI_MISO_0_0_FUNCTION } #define WL_SPI_MOSI { AVR32_SPI_MOSI_0_0_PIN, AVR32_SPI_MOSI_0_0_FUNCTION } #define WL_SPI_SCK { AVR32_SPI_SCK_0_0_PIN, AVR32_SPI_SCK_0_0_FUNCTION } #endif #endif /* EXT_BOARD */ /* * * EVK1104 * --------------------------------------------------------------------------- * */ #elif BOARD == EVK1104 /* EVK1104 */ /* USART0 physical assignment */ #define BOARD_RS232_0 AVR32_USART1 #define BOARD_RS232_0_TX \ { AVR32_USART1_TXD_0_0_PIN, AVR32_USART1_TXD_0_0_FUNCTION } #define BOARD_RS232_0_RX \ { AVR32_USART1_RXD_0_0_PIN, AVR32_USART1_RXD_0_0_FUNCTION } /* Clocks */ #define USE_PLL #define OSC 0 #define PLL_MUL 9 /* for some reason we cant use 66 MHz */ /* Wifi (SDIO: SPB104 only; SPI: SPB105 only) */ #if defined(EXT_BOARD) #if EXT_BOARD == SPB105 #define WL_SPI AVR32_SPI0 #define WL_PDCA_PID_TX AVR32_PDCA_PID_SPI0_TX #define WL_PDCA_PID_RX AVR32_PDCA_PID_SPI0_RX #define WL_SPI_CLOCK_DIVIDER 3 /* due to adapter */ #define WL_SHUTDOWN_PIN AVR32_PIN_PA17 /* Pin 8 on RF-head -> Pin 4 on wifi */ #define WL_IRQ_PIN AVR32_PIN_PA18 /* Pin 6 on RF-head -> Pin 3 on wifi */ #define WL_IRQ AVR32_GPIO_IRQ_2 #define WL_SPI_CS 3 #define WL_SPI_NPCS { AVR32_SPI0_NPCS_3_1_PIN, AVR32_SPI0_NPCS_3_1_FUNCTION } #define WL_SPI_MISO { AVR32_SPI0_MISO_0_0_PIN, AVR32_SPI0_MISO_0_0_FUNCTION } #define WL_SPI_MOSI { AVR32_SPI0_MOSI_0_0_PIN, AVR32_SPI0_MOSI_0_0_FUNCTION } #define WL_SPI_SCK { AVR32_SPI0_SCK_0_0_PIN, AVR32_SPI0_SCK_0_0_FUNCTION } #elif EXT_BOARD == SPB104 #ifdef SDIO_SLOT_A #define WL_SDIO_CLK { AVR32_MCI_CLK_0_PIN, AVR32_MCI_CLK_0_FUNCTION } #define WL_SDIO_CMD { AVR32_MCI_CMD_0_PIN, AVR32_MCI_CMD_0_FUNCTION } #define WL_SDIO_DAT0 { AVR32_MCI_DATA_0_PIN, AVR32_MCI_DATA_0_FUNCTION } #define WL_SDIO_DAT1 { AVR32_MCI_DATA_1_PIN, AVR32_MCI_DATA_1_FUNCTION } #define WL_SDIO_DAT2 { AVR32_MCI_DATA_2_PIN, AVR32_MCI_DATA_2_FUNCTION } #define WL_SDIO_DAT3 { AVR32_MCI_DATA_3_PIN, AVR32_MCI_DATA_3_FUNCTION } #else #define WL_SDIO_CLK { AVR32_MCI_CLK_0_PIN, AVR32_MCI_CLK_0_FUNCTION } #define WL_SDIO_CMD { AVR32_MCI_CMD_1_0_PIN, AVR32_MCI_CMD_1_0_FUNCTION } #define WL_SDIO_DAT0 { AVR32_MCI_DATA_8_0_PIN, AVR32_MCI_DATA_8_0_FUNCTION } #define WL_SDIO_DAT1 { AVR32_MCI_DATA_9_0_PIN, AVR32_MCI_DATA_9_0_FUNCTION } #define WL_SDIO_DAT2 { AVR32_MCI_DATA_10_0_PIN, AVR32_MCI_DATA_10_0_FUNCTION } #define WL_SDIO_DAT3 { AVR32_MCI_DATA_11_0_PIN, AVR32_MCI_DATA_11_0_FUNCTION } #endif #endif #endif /* EXT_BOARD */ /* * * EVK1105 * --------------------------------------------------------------------------- * */ #elif BOARD == EVK1105 /* EVK1105 */ /* USART0 physical assignment */ #define BOARD_RS232_0 AVR32_USART0 #define BOARD_RS232_0_TX \ { AVR32_USART0_TXD_0_0_PIN, AVR32_USART0_TXD_0_0_FUNCTION } #define BOARD_RS232_0_RX \ { AVR32_USART0_RXD_0_0_PIN, AVR32_USART0_RXD_0_0_FUNCTION } /* Clocks */ #define USE_PLL #define OSC 1 #define PLL_MUL 10 /* Wifi SPB104/SPB105 */ #if defined(EXT_BOARD) #define WL_SPI AVR32_SPI0 #define WL_PDCA_PID_TX AVR32_PDCA_PID_SPI0_TX #define WL_PDCA_PID_RX AVR32_PDCA_PID_SPI0_RX #if EXT_BOARD == SPB105 #define WL_SPI_CLOCK_DIVIDER 3 /* due to adapter */ #define WL_SHUTDOWN_PIN AVR32_PIN_PB31 /* Pin 8 on RF-head -> Pin 4 on wifi */ #define WL_IRQ_PIN AVR32_PIN_PB30 /* Pin 6 on RF-head -> Pin 3 on wifi */ #define WL_IRQ AVR32_GPIO_IRQ_7 #define WL_SPI_CS 2 #elif EXT_BOARD == SPB104 #define WL_SPI_CLOCK_DIVIDER 3 /* due to adapter */ #define WL_SPI_CS 1 #endif #define WL_SPI_NPCS0 { AVR32_SPI0_NPCS_0_0_PIN, AVR32_SPI0_NPCS_0_0_FUNCTION } #if WL_SPI_CS == 1 #define WL_SPI_NPCS { AVR32_SPI0_NPCS_1_0_PIN, AVR32_SPI0_NPCS_1_0_FUNCTION } #elif WL_SPI_CS == 2 #define WL_SPI_NPCS { AVR32_SPI0_NPCS_2_0_PIN, AVR32_SPI0_NPCS_2_0_FUNCTION } #endif #define WL_SPI_MISO { AVR32_SPI0_MISO_0_0_PIN, AVR32_SPI0_MISO_0_0_FUNCTION } #define WL_SPI_MOSI { AVR32_SPI0_MOSI_0_0_PIN, AVR32_SPI0_MOSI_0_0_FUNCTION } #define WL_SPI_SCK { AVR32_SPI0_SCK_0_0_PIN, AVR32_SPI0_SCK_0_0_FUNCTION } #endif /* EXT_BOARD */ /* * * ARDUINO * --------------------------------------------------------------------------- * */ #elif BOARD == ARDUINO /* ARDUINO */ /* USART0 physical assignment */ #define BOARD_RS232_1 AVR32_USART1 #define BOARD_RS232_1_TX \ { AVR32_USART1_TXD_0_0_PIN, AVR32_USART1_TXD_0_0_FUNCTION } #define BOARD_RS232_1_RX \ { AVR32_USART1_RXD_0_0_PIN, AVR32_USART1_RXD_0_0_FUNCTION } /* Clocks */ #define USE_PLL #define OSC 0 #define PLL_MUL 8 #define WL_SPI AVR32_SPI1 #define WL_PDCA_PID_TX AVR32_PDCA_PID_SPI1_TX #define WL_PDCA_PID_RX AVR32_PDCA_PID_SPI1_RX #define WL_SHUTDOWN_PIN AVR32_PIN_PA09 #define WL_IRQ_PIN AVR32_PIN_PA03 /* * WL_IRQ_# = (WL_IRQ_PIN / 32) * 4 + (WL_IRQ_PIN / 8) % 4 * 3 => 0 * 4 + 0 = 0 */ #define WL_IRQ AVR32_GPIO_IRQ_0 #define WL_SPI_CS 0 #define WL_RESET_PIN AVR32_PIN_PA07 #define WL_EXTERNAL_RESET 1 #define WL_SPI_NPCS { AVR32_SPI1_NPCS_0_0_PIN, AVR32_SPI1_NPCS_0_0_FUNCTION } #define WL_SPI_MISO { AVR32_SPI1_MISO_0_0_PIN, AVR32_SPI1_MISO_0_0_FUNCTION } #define WL_SPI_MOSI { AVR32_SPI1_MOSI_0_0_PIN, AVR32_SPI1_MOSI_0_0_FUNCTION } #define WL_SPI_SCK { AVR32_SPI1_SCK_0_0_PIN, AVR32_SPI1_SCK_0_0_FUNCTION } #endif /* EVKxxxx */ #if OSC == 0 # define FOSC FOSC0 /* 12 MHz */ #else # define FOSC FOSC1 /* 11.2896 MHz */ #endif #ifdef USE_PLL # define FMCK_HZ ((FOSC * (PLL_MUL + 1)) / 2) #else # define FMCK_HZ FOSC #endif #define FCPU_HZ FMCK_HZ #define FHSB_HZ FCPU_HZ #define FPBB_HZ FMCK_HZ #define FPBA_HZ FMCK_HZ #ifndef CONFIG_CONSOLE_PORT #define CONFIG_CONSOLE_PORT BOARD_RS232_1 #endif #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/cmd_wl.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include "lwip/netif.h" #include "lwip/dns.h" #include "debug.h" #include "ard_spi.h" #include "ard_tcp.h" #include "ard_utils.h" extern void showTTCPstatus(); #define _DNS_CMD_ /** * */ cmd_state_t cmd_scan(int argc, char* argv[], void* ctx) { /* Note that the scan results presented will * be from the last scan, not this one. */ wl_scan(); print_network_list(); return CMD_DONE; } cmd_state_t cmd_debug_toggle(int argc, char* argv[], void* ctx) { extern uint8_t tr_data_trace; if ( argc != 2 ) { printk("usage: dt <1|0>\n"); return CMD_DONE; } if ( '0' == argv[1][0] ) { tr_data_trace = 0; } if ( '1' == argv[1][0] ) { tr_data_trace = 1; } return CMD_DONE; } /** * */ cmd_state_t cmd_connect(int argc, char* argv[], void* ctx) { struct wl_ssid_t ssid; char desired_ssid[WL_SSID_MAX_LENGTH]; int len = 0; if (argc < 2) { printk("usage: connect \n"); return CMD_DONE; } len = join_argv(desired_ssid, sizeof desired_ssid, argc - 1, argv + 1); if (0 == len) { return CMD_DONE; } memcpy(ssid.ssid, desired_ssid, len); ssid.len = len; /* Start connection manager */ wl_cm_set_network(&ssid, NULL); wl_cm_start(); return CMD_DONE; } #ifdef WFE_6_12 cmd_state_t cmd_ibss(int argc, char* argv[], void* ctx) { struct wl_ssid_t ssid; char desired_ssid[WL_SSID_MAX_LENGTH]; uint8_t channel; enum wl_auth_mode amode; int len = 0; wl_err_t ret; if ( 2 == argc && ! strncmp(argv[1], "none", 4) ) { printk("Disconnecting\n"); wl_disconnect(); wl_cm_stop(); return CMD_DONE; } if (argc < 4) { printk("usage: ibss \n"); printk(" ibss none\n"); return CMD_DONE; } channel = atoi(argv[argc - 2]); if ( *argv[argc - 1] == '0' ) { amode = AUTH_MODE_OPEN_SYSTEM; } else { amode = AUTH_MODE_SHARED_KEY; } len = join_argv(desired_ssid, sizeof desired_ssid, argc - 3, argv + 1); if (0 == len) { return CMD_DONE; } if ( channel > 14 ) { printk("Invalid channel %d\n", (int)channel); return CMD_DONE; } printk("%s : Start with ssid \"%s\", channel %d\n", __func__, desired_ssid, channel); memcpy(ssid.ssid, desired_ssid, len); ssid.len = len; /* Stop the connection manager */ wl_cm_stop(); ret = wl_start_adhoc_net(ssid, channel, amode); switch (ret) { case WL_BUSY: printk("Driver is busy. Already connected?\n"); break; case WL_RETRY: printk("Driver is busy. Retry operation\n"); break; case WL_OOM: printk("Out of memory\n"); break; case WL_INVALID_ARGS: printk("Invalid argument\n"); break; case WL_SUCCESS: break; default: printk("Unknown error %d\n", ret); break; } return CMD_DONE; } #endif /** * */ cmd_state_t cmd_set_ip(int argc, char* argv[], void* ctx) { struct ctx_server *hs = ctx; struct net_cfg *ncfg = &(hs->net_cfg); struct ip_addr lwip_addr; struct netif *nif = ncfg->netif; if (argc == 2 && (strncmp(argv[1], "none", 4) == 0)) { ncfg->dhcp_enabled = DYNAMIC_IP_CONFIG; return CMD_DONE; } else if (argc != 4 ) { printk("usage: ipconfig \n"); printk(" or : ipconfig none (to enable DHCP)\n"); return CMD_DONE; } /* IP address */ lwip_addr = str2ip(argv[1]); INFO_SPI("nif:%p lwip_addr=0x%x\n", nif, lwip_addr.addr); netif_set_ipaddr(nif, &lwip_addr); /* Netmask */ lwip_addr = str2ip(argv[2]); netif_set_netmask(nif, &lwip_addr); /* Default Gateway address */ lwip_addr = str2ip(argv[3]); netif_set_gw(nif, &lwip_addr); /* Disable DHCP */ ncfg->dhcp_enabled = STATIC_IP_CONFIG; return CMD_DONE; } #ifdef WITH_WPA /** * */ cmd_state_t cmd_delpass(int argc, char* argv[], void* ctx) { const char *usage = "usage: dpass \n"; struct wl_network_t net; char desired_ssid[WL_SSID_MAX_LENGTH]; int len = 0; if (argc != 2) { printk(usage); return CMD_DONE; } memset(&net, 0, sizeof net); memset(net.bssid.octet, 0xFF, sizeof net.bssid.octet); len = join_argv(desired_ssid, sizeof desired_ssid, argc - 1, argv + 1); if (0 == len) { return CMD_DONE; } memcpy(net.ssid.ssid, desired_ssid, len); net.ssid.len = len; net.enc_type = ENC_TYPE_AUTO; if (wl_clear_passphrase(&net) != WL_SUCCESS) { printk("%s : Failed to delete passphrase\n", __func__); } return CMD_DONE; } /** * */ cmd_state_t cmd_setpass(int argc, char* argv[], void* ctx) { const char *usage = "usage: wpass \n"; struct wl_network_t net; char desired_ssid[WL_SSID_MAX_LENGTH]; int len = 0; if (argc < 3) { printk(usage); return CMD_DONE; } /* Not really kosher, an ssid may legally contain 0-bytes but * the console interface does not deal with that. */ memset(&net, 0, sizeof net); memset(net.bssid.octet, 0xFF, sizeof net.bssid.octet); len = join_argv(desired_ssid, sizeof desired_ssid, argc - 2, argv + 1); if (0 == len) { return CMD_DONE; } memcpy(net.ssid.ssid, desired_ssid, len); net.ssid.len = len; net.enc_type = ENC_TYPE_AUTO; if (wl_set_passphrase(&net, argv[argc - 1], strlen(argv[argc - 1]), ENC_TYPE_AUTO, AUTH_MODE_AUTO) != WL_SUCCESS) { printk("%s : Failed to add passphrase\n", __func__); } return CMD_DONE; } #endif #ifdef _DNS_CMD_ void foundHost(const char *name, struct ip_addr *ipaddr, void *callback_arg) { printk("Found Host: name=%s ip=0x%x\n", name, ipaddr->addr); } /** * */ cmd_state_t cmd_gethostbyname(int argc, char* argv[], void* ctx) { const char *usage = "usage: getHost \n"; char hostname[DNS_MAX_NAME_LENGTH]; struct ip_addr _addr; int len = 0; if (argc < 2) { printk(usage); return CMD_DONE; } len = join_argv(hostname, sizeof hostname, argc - 1, argv + 1); if (0 == len) { return CMD_DONE; } err_t err = dns_gethostbyname(hostname, &_addr, foundHost, NULL); if (err == ERR_OK) { printk("Found Host: name=%s ip=0x%x\n", hostname, _addr.addr); } return CMD_DONE; } /** * */ cmd_state_t cmd_setDnsServer(int argc, char* argv[], void* ctx) { const char *usage = "usage: setdns [1-2] aaa.bbb.ccc.ddd\n"; struct ip_addr dnsIp; int dnsIdx = 0; if (argc < 3) { printk(usage); return CMD_DONE; } /* DNS IDX */ dnsIdx = atoi(argv[1])-1; /* IP address */ dnsIp = str2ip(argv[2]); printk("Set DNS server %d to %s\n", dnsIdx, ip2str(dnsIp)); dns_setserver(dnsIdx, &dnsIp); struct ip_addr addr1 = dns_getserver(0); struct ip_addr addr2 = dns_getserver(1); printk("==> DNS1: %s\n", ip2str(addr1), addr1); printk("==> DNS2: %s\n", ip2str(addr2), addr2); return CMD_DONE; } /** * */ cmd_state_t cmd_startSrv(int argc, char* argv[], void* ctx) { const char *usage = "usage: startSrv \n"; int port = 0; int sock = 0; int protMode = 0; if (argc < 4) { printk(usage); return CMD_DONE; } /* TCP port */ port = atoi(argv[1]); /* socket index */ sock = atoi(argv[2]); /* Protocol Mode */ protMode = atoi(argv[3]); printk("Start %s server on port %d sock %d\n", ProtMode2Str(protMode), port, sock); if (start_server_tcp(port, sock, protMode) == -1) { WARN("Start %s server on port %d sock %d FAILED\n", ProtMode2Str(protMode), port, sock); } return CMD_DONE; } /** * */ cmd_state_t cmd_startCli(int argc, char* argv[], void* ctx) { const char *usage = "usage: startCli \n"; struct ip_addr addr = {0}; int port = 0; int sock = 0; int protMode = 0; if (argc < 5) { printk(usage); return CMD_DONE; } /* IP address */ addr = str2ip(argv[1]); /* TCP port */ port = atoi(argv[2]); /* socket index */ sock = atoi(argv[3]); /* Protocol Mode */ protMode = atoi(argv[4]); printk("Start client on addr 0x%x, port %d sock %d mode %d\n", addr, port, sock, protMode); if (start_client_tcp(addr.addr, port, sock, protMode) == -1) { WARN("Start client on port %d sock %d prot %d mode %d FAILED\n", port, sock, protMode); } return CMD_DONE; } #endif /** * */ cmd_state_t cmd_status(int argc, char* argv[], void* ctx) { struct net_cfg *ncfg = ctx; struct wl_network_t* net; uint8_t mac[WL_MAC_ADDR_LENGTH]; printk("wl_api version " WL_API_RELEASE_NAME "\n"); /* print mac address */ if (wl_get_mac_addr(mac) != WL_SUCCESS) { printk("failed to get mac address\n"); }else{ printk("hw addr: %s\n", mac2str(mac)); } /* print network info */ net = wl_get_current_network(); printk("link status: "); if (!net) { printk("down\n"); }else{ print_network(net); } /* print ip address */ if (netif_is_up(netif_default)) { printk("ip addr: %s - ", ip2str(netif_default->ip_addr)); printk("netmask: %s - ", ip2str(netif_default->netmask)); printk("gateway: %s\n", ip2str(netif_default->gw)); } else printk("ip interface is down\n"); printk("dhcp : "); if (ncfg->dhcp_enabled == DYNAMIC_IP_CONFIG) { printk("enabled\n"); } else { printk("disabled\n"); } struct ip_addr addr1 = dns_getserver(0); struct ip_addr addr2 = dns_getserver(1); printk("DNS: %s - ", ip2str(addr1)); printk("%s\n", ip2str(addr2)); showTTCPstatus(); return CMD_DONE; } #ifdef ADD_CMDS /** * */ cmd_state_t cmd_power(int argc, char* argv[], void* ctx) { const char *usage = "usage: powersave \n"; if (argc < 2) { printk(usage); return CMD_DONE; } if (!strcmp(argv[1], "on")) { if (wl_enable_ps() != WL_SUCCESS) { printk("could not enable power save\n"); return CMD_DONE; } return CMD_DONE; } else if(!strcmp(argv[1], "off")) { if (wl_disable_ps() != WL_SUCCESS) { printk("could not disable power save\n"); return CMD_DONE; } return CMD_DONE; } printk(usage); return CMD_DONE; } #endif #ifdef ADD_CMDS /** * */ cmd_state_t cmd_psconf(int argc, char* argv[], void* ctx) { const char *usage = "usage: psconf (0/1 default 0)\n" \ " ([ms] default 10)\n" \ " ([ms] default 5000)\n"\ " (0/1 default 1)\n"\ " ([beacons] default 20)\n"; uint8_t use_ps_poll; uint32_t traffic_timeout; uint32_t ps_delay; uint8_t rx_all_dtim; uint16_t listen_interval; if (argc < 6) { printk(usage); return CMD_DONE; } use_ps_poll = atoi(argv[1]); traffic_timeout = atoi(argv[2]); ps_delay = atoi(argv[3]); rx_all_dtim = atoi(argv[4]); listen_interval = atoi(argv[5]); if (use_ps_poll > 1) { printk(usage); return CMD_DONE; } if (rx_all_dtim > 1) { printk(usage); return CMD_DONE; } if (wl_conf_ps(use_ps_poll, traffic_timeout, ps_delay, rx_all_dtim, listen_interval) != WL_SUCCESS) printk("configuration failed\n"); return CMD_DONE; } #endif /** * */ cmd_state_t cmd_setkey(int argc, char* argv[], void* ctx) { int idx, len; char key[13]; struct wl_mac_addr_t bssid; const char *usage = "usage: setkey \n\t "\ "or: setkey none\n"; memset(&bssid.octet, 0xff, sizeof bssid.octet); if (argc == 2 && strcmp(argv[1], "none") == 0) { printk("Deleting WEP keys\n"); wl_delete_wep_key(0, &bssid); wl_delete_wep_key(1, &bssid); wl_delete_wep_key(2, &bssid); wl_delete_wep_key(3, &bssid); return CMD_DONE; } if (argc < 3) { printk(usage); return CMD_DONE; } idx = atoi(argv[1]); len = strlen(argv[2]); /* Pass phrase? */ if ( 5 == len || 13 == len ) { strncpy(key, argv[2], len); } /* Otherwise it's a hex string */ else { len = ascii_to_key(key, argv[2]); if (0 == len || idx > 3 || idx < 0 || (idx == 0 && *argv[1] != '0')) { printk(usage); return CMD_DONE; } if (len != 5 && len != 13) { printk(" WEP key must be 10 (WEP-40) or 26 (WEP-104) digits\n"); return CMD_DONE; } } wl_add_wep_key(idx, len, key, &bssid); wl_set_default_wep_key(idx); return CMD_DONE; } cmd_state_t cmd_debug(int argc, char* argv[], void* ctx) { int level; const char *usage = "usage: debug
\n\t"\ "section: init, cm, spi, tcp , util, warn\n\t" "level : 0 (off), 1 (on), 2 (verbose)\n\t" "or: debug print/on/off\n"; if (argc == 2 && strcmp(argv[1], "off") == 0) { printk("Debug OFF\n"); INIT_DEBUG_VARIABLES() return CMD_DONE; }else if (argc == 2 && strcmp(argv[1], "print") == 0) { PRINT_DEBUG_VARIABLES() return CMD_DONE; }else if (argc == 2 && strcmp(argv[1], "on") == 0) { printk("Debug ON\n"); TURNON_DEBUG_VARIABLES(); return CMD_DONE; } if (argc < 3) { printk(usage); return CMD_DONE; } level = atoi(argv[2]); if (argc == 3 && strcmp(argv[1], "init") == 0) { CHECK_DEBUG_LEVEL(level, INFO_INIT_FLAG); }else if (argc == 3 && strcmp(argv[1], "spi") == 0) { CHECK_DEBUG_LEVEL(level, INFO_SPI_FLAG); }else if (argc == 3 && strcmp(argv[1], "tcp") == 0) { CHECK_DEBUG_LEVEL(level, INFO_TCP_FLAG); }else if (argc == 3 && strcmp(argv[1], "cm") == 0) { CHECK_DEBUG_LEVEL(level, INFO_CM_FLAG); }else if (argc == 3 && strcmp(argv[1], "util") == 0) { CHECK_DEBUG_LEVEL(level, INFO_UTIL_FLAG); }else if (argc == 3 && strcmp(argv[1], "warn") == 0) { CHECK_DEBUG_LEVEL(level, INFO_WARN_FLAG); } return CMD_DONE; } extern void dumpPbuf(uint8_t sock); /** * */ cmd_state_t cmd_dumpBuf(int argc, char* argv[], void* ctx) { const char *usage = "usage: dumpPbuf [sock]\n\t"\ "sock: socket Number\n"; if (argc == 2 && strcmp(argv[1], "all") == 0) { printk("Dump All Buffers\n"); int i = 0; for (; i= 2) { uint8_t sock = atoi(argv[1]); printk("Socket: %d\n", sock); if (argc >= 3) { uint8_t patternType = atoi(argv[2]); printk("PatternType: %d\n", patternType); if (patternType == 1) { insertBuf(sock, (uint8_t*)pattern2[0], strlen(pattern2[0])); insertBuf(sock, (uint8_t*)pattern2[1], strlen(pattern2[1])); insertBuf(sock, (uint8_t*)pattern2[2], strlen(pattern2[2])); } if (patternType == 2) { mergeBuf(sock, NULL, NULL); } }else{ if (sock < MAX_SOCK_NUM) { sendUdpData(getTTCP(sock, TTCP_MODE_TRANSMIT), (uint8_t*)pattern, sizeof(pattern)/sizeof(char)); } } } return CMD_DONE; } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/cmd_wl.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef CMD_CM_H #define CMD_CM_H #include #include "netif/wlif.h" /*! A pointer to a struct of type "struct net_cfg" should be passed as * the ctx pointer in the callbacks below. The struct must have a * single instance per netif. */ #define _DNS_CMD_ cmd_state_t cmd_scan(int argc, char* argv[], void* ctx); cmd_state_t cmd_connect(int argc, char* argv[], void* ctx); cmd_state_t cmd_set_ip(int argc, char* argv[], void* ctx); cmd_state_t cmd_setkey(int argc, char* argv[], void* ctx); cmd_state_t cmd_status(int argc, char* argv[], void* ctx); cmd_state_t cmd_power(int argc, char* argv[], void* ctx); cmd_state_t cmd_psconf(int argc, char* argv[], void* ctx); cmd_state_t cmd_setpass(int argc, char* argv[], void* ctx); cmd_state_t cmd_delpass(int argc, char* argv[], void* ctx); cmd_state_t cmd_debug(int argc, char* argv[], void* ctx); cmd_state_t cmd_debug_toggle(int argc, char* argv[], void* ctx); cmd_state_t cmd_statSpi(int argc, char* argv[], void* ctx); cmd_state_t cmd_resetStatSpi(int argc, char* argv[], void* ctx); cmd_state_t cmd_gethostbyname(int argc, char* argv[], void* ctx); cmd_state_t cmd_setDnsServer(int argc, char* argv[], void* ctx); cmd_state_t cmd_startSrv(int argc, char* argv[], void* ctx); cmd_state_t cmd_startCli(int argc, char* argv[], void* ctx); cmd_state_t cmd_dumpBuf(int argc, char* argv[], void* ctx); cmd_state_t cmd_sendUdpData(int argc, char* argv[], void* ctx); #ifdef WFE_6_12 cmd_state_t cmd_ibss(int argc, char* argv[], void* ctx); #endif #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/console.c ================================================ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #define MAX_CMD_CONSOLE_NUM 15 struct { cmd_cb_t cb; const char* str; void* ctx; } cmd_list[MAX_CMD_CONSOLE_NUM] = { { 0 } }; #ifndef CMD_MAX_LEN #define CMD_MAX_LEN 80 #endif extern int board_putchar(char c); int io_getc(char *c) { int ci; int status; status = usart_read_char(&CONFIG_CONSOLE_PORT, &ci); if (status == USART_RX_EMPTY) return 1; if (status == USART_RX_ERROR) { CONFIG_CONSOLE_PORT.cr = AVR32_USART_CR_RSTSTA_MASK; return 1; } if (ci == '\r') { board_putchar('\n'); /* Echo char. */ } else if (ci == '\b') { board_putchar(ci); board_putchar(' '); board_putchar(ci); } else board_putchar(ci); *c = ci; return 0; } static uint8_t is_initialized = 0; char* console_gets() { static char buf[CMD_MAX_LEN]; static int pos = 0; char c; for (;;) { if (io_getc(&c)) return NULL; if (c == '\r' || c == '\n') { buf[pos] = 0; pos = 0; return buf; } if (c == '\b') { pos -= 1; if (pos < 0) pos = 0; buf[pos] = 0; } else buf[pos++] = c; if (pos == sizeof(buf)) pos = 0; } return NULL; } int console_add_cmd(const char* str, cmd_cb_t cb, void* ctx) { uint32_t i; for (i = 0; i < ARRAY_SIZE(cmd_list); i++) if (!cmd_list[i].cb) break; if (i == ARRAY_SIZE(cmd_list)) return -1; cmd_list[i].str = str; cmd_list[i].cb = cb; cmd_list[i].ctx = ctx; return 0; } void console_init(void) { printk("\n$ "); is_initialized = 1; } void console_init_silent(void) { is_initialized = 1; } int console_schedule_cmd(char *cmd, int interactive) { #define MAX_ARGS 16 static int argc, i; static char* argv[MAX_ARGS]; static char *buf; static enum { INPUT, RUN } state = INPUT; switch (state) { case INPUT: { char* token; if (NULL == cmd) { return 0; } buf = strdup(cmd); if (!buf) return 0; if (!strlen(buf)) { interactive ? printk("$ ") : 0; free(buf); return 0; } #ifdef WIFI_DEBUG_ON printk("%s : Scheduling command \"%s\"\n", __func__, buf); #endif for (i = 0; i < ARRAY_SIZE(cmd_list); i++) if(cmd_list[i].str && !strncmp(cmd_list[i].str, buf, min(strlen(cmd_list[i].str), strlen(buf)))) break; if (ARRAY_SIZE(cmd_list) == 0) { printk("No commands available. Is the WiFi card responding?\n"); } if (i == ARRAY_SIZE(cmd_list)) { if (interactive) { printk("available commands:\n"); for (i = 0; i < ARRAY_SIZE(cmd_list); i++) if (cmd_list[i].cb) printk(" %s\n", cmd_list[i].str); printk("$ "); } free(buf); return 0; } for (token = strtok(buf, " "); token != NULL; token = strtok(NULL, " ")) { argv[argc] = token; argc++; if (argc == MAX_ARGS) break; } state = RUN; } /* fall through */ case RUN: { cmd_state_t s = cmd_list[i].cb(argc, argv, cmd_list[i].ctx); if (s == CMD_INPROGRESS) return 1; interactive ? printk("$ ") : 0; argc = 0; memset(argv, 0, sizeof argv); free(buf); state = INPUT; } } return 1; } void console_poll(void) { char *buf; buf = console_gets(); console_schedule_cmd(buf, 1); } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/console.h ================================================ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef CONSOLE_H #define CONSOLE_H typedef enum { CMD_DONE, CMD_INPROGRESS } cmd_state_t; typedef cmd_state_t (*cmd_cb_t)(int argc, char* argv[], void* ctx); void console_init(void); void console_init_silent(void); char* console_gets(void); int console_add_cmd(const char* str, cmd_cb_t cb, void* ctx); int console_schedule_cmd(char *cmd, int interactive); void console_poll(void); #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/debug.h ================================================ //*********************************************/ // // File: debug.h // // Author: Domenico La Fauci // //********************************************/ #ifndef Debug_H #define Debug_H #include #include #define INFO_INIT_FLAG 1 #define INFO_TCP_FLAG 2 #define INFO_SPI_FLAG 4 #define INFO_CM_FLAG 8 #define INFO_UTIL_FLAG 16 #define INFO_D (1<<0xD) // Debug #define INFO_E (1<<0xE) // Error #define INFO_WARN_FLAG (1<<0xF) // Warning #define DEFAULT_INFO_FLAG 0 //INFO_WARN_FLAG #ifdef _DEBUG_ #define DEFINE_DEBUG_VARIABLES() \ uint16_t enableDebug = DEFAULT_INFO_FLAG | INFO_WARN_FLAG; \ uint16_t verboseDebug = 0; \ uint16_t dumpDebug = 0; \ uint16_t pollDebug = 0; #else #define DEFINE_DEBUG_VARIABLES() \ uint16_t enableDebug = DEFAULT_INFO_FLAG; \ uint16_t verboseDebug = 0; \ uint16_t dumpDebug = 0; \ uint16_t pollDebug = 0; #endif #define INIT_DEBUG_VARIABLES() \ enableDebug = DEFAULT_INFO_FLAG | INFO_WARN_FLAG; \ verboseDebug = 0; \ dumpDebug = 0; pollDebug = 0; #define PRINT_DEBUG_VARIABLES() \ printk("Debug enabled: 0x%x\n", enableDebug); \ printk("Verbose enabled: 0x%x\n", verboseDebug); \ printk("Dump enabled: 0x%x\n", dumpDebug); \ printk("POoll enabled: 0x%x\n", pollDebug); #define TURNON_DEBUG_VARIABLES() \ enableDebug = 0xff; extern uint16_t enableDebug; extern uint16_t verboseDebug; extern uint16_t dumpDebug; extern uint16_t pollDebug; #define ENABLE_DEBUG_LEVEL 1 #define VERBOSE_DEBUG_LEVEL 2 #define DUMP_DEBUG_LEVEL 3 #define POLL_DEBUG_LEVEL 4 #define CHECK_DEBUG(VAR, LEVEL, LEVEL_LIMIT, FLAG) \ do{ \ if (LEVEL >= LEVEL_LIMIT) VAR |= FLAG; \ else VAR &= ~FLAG; \ }while(0); #define CHECK_ENA_DEBUG(LEVEL, FLAG) \ CHECK_DEBUG(enableDebug, LEVEL, ENABLE_DEBUG_LEVEL, FLAG) #define CHECK_VERB_DEBUG(LEVEL, FLAG) \ CHECK_DEBUG(verboseDebug, LEVEL, VERBOSE_DEBUG_LEVEL, FLAG) #define CHECK_DUMP_DEBUG(LEVEL, FLAG) \ CHECK_DEBUG(dumpDebug, LEVEL, DUMP_DEBUG_LEVEL, FLAG) #define CHECK_POLL_DEBUG(LEVEL, FLAG) \ CHECK_DEBUG(pollDebug, LEVEL, POLL_DEBUG_LEVEL, FLAG) #define CHECK_DEBUG_LEVEL(LEVEL, INFO_FLAG) \ CHECK_ENA_DEBUG(LEVEL, INFO_FLAG) \ CHECK_VERB_DEBUG(LEVEL, INFO_FLAG) \ CHECK_DUMP_DEBUG(LEVEL, INFO_FLAG) \ CHECK_POLL_DEBUG(LEVEL, INFO_FLAG) #ifdef _INFO_DEBUG_ #define PRINT_DEBUG(msg, args...) do { \ printk("[%s] " msg , __func__ , ##args ); \ } while (0) #define INFO_DEBUG(msg, args...) do { \ printk("I-[%s] " msg , __func__ , ##args ); \ } while (0) #define WARN_DEBUG(msg, args...) do { \ printk("W-[%s] " msg , __func__ , ##args ); \ } while (0) #else do { }while(0); #endif #define IF_DEBUG(X,Y) do { \ if (enableDebug & INFO_##X##_FLAG) \ Y; \ } while (0) #define IF_DEBUG_VER(X,Y) do { \ if (verboseDebug & INFO_##X##_FLAG) \ Y; \ } while (0) #define IF_DEBUG_DUMP(X,Y) do { \ if (dumpDebug & INFO_##X##_FLAG) \ Y; \ } while (0) #define IF_DEBUG_POLL(X,Y) do { \ if (pollDebug & INFO_##X##_FLAG) {\ Y; \ }} while (0) #define IF_WARN(Y) IF_DEBUG(WARN,Y) #define IF_WARN_VER(Y) IF_DEBUG_VER(WARN,Y) #define IF_TCP(Y) IF_DEBUG(TCP,Y) #define IF_TCP_VER(Y) IF_DEBUG_VER(TCP,Y) #define IF_TCP_POLL(Y) IF_DEBUG_POLL(TCP,Y) #define IF_TCP_DUMP(Y) IF_DEBUG_DUMP(TCP,Y) #define IF_SPI(Y) IF_DEBUG(SPI,Y) #define IF_SPI_VER(Y) IF_DEBUG_VER(SPI,Y) #define IF_SPI_DUMP(Y) IF_DEBUG_DUMP(SPI,Y) #define IF_SPI_POLL(Y) IF_DEBUG_POLL(SPI,Y) #define IF_UTIL(Y) IF_DEBUG(UTIL,Y) #define IF_UTIL_VER(Y) IF_DEBUG_VER(UTIL,Y) #define WARN(msg, args...) IF_DEBUG(WARN,WARN_DEBUG(msg, ##args)) #define WARN_VER(msg, args...) IF_DEBUG_VER(WARN,WARN_DEBUG(msg, ##args)) #define WARN_POLL(msg, args...) IF_DEBUG_POLL(WARN,WARN_DEBUG(msg, ##args)) #if 0 // disable to reduce the size of binary #define INFO_INIT(msg, args...) IF_DEBUG(INIT,PRINT_DEBUG(msg, ##args)) #define INFO_INIT_VER(msg, args...) IF_DEBUG_VER(INIT,PRINT_DEBUG(msg, ##args)) #else #define INFO_INIT(msg, args...) #define INFO_INIT_VER(msg, args...) #endif #define INFO_TCP(msg, args...) IF_DEBUG(TCP,PRINT_DEBUG(msg, ##args)) #define INFO_TCP_VER(msg, args...) IF_DEBUG_VER(TCP,PRINT_DEBUG(msg, ##args)) #define INFO_TCP_DUMP(msg, args...) IF_DEBUG_DUMP(TCP,PRINT_DEBUG(msg, ##args)) #define INFO_TCP_POLL(msg, args...) IF_DEBUG_POLL(TCP,PRINT_DEBUG(msg, ##args)) #define INFO_SPI(msg, args...) IF_DEBUG(SPI,PRINT_DEBUG(msg, ##args)) #define INFO_SPI_VER(msg, args...) IF_DEBUG_VER(SPI,PRINT_DEBUG(msg, ##args)) #define INFO_SPI_DUMP(msg, args...) IF_DEBUG_DUMP(SPI,PRINT_DEBUG(msg, ##args)) #define INFO_SPI_POLL(msg, args...) IF_DEBUG_POLL(SPI,PRINT_DEBUG(msg, ##args)) #define INFO_UTIL(msg, args...) IF_DEBUG(UTIL,PRINT_DEBUG(msg, ##args)) #define INFO_UTIL_VER(msg, args...) IF_DEBUG_VER(UTIL,PRINT_DEBUG(msg, ##args)) #define CM_DPRINTF(msg, args...) IF_DEBUG(CM,PRINT_DEBUG(msg, ##args)) extern void dump(char* _buf, uint16_t _count); #define _DUMP(BUF, COUNT) do { \ printk("[%s]: ", __func__); \ dump((char*)BUF, COUNT); \ } while (0) #ifdef _APP_DEBUG_ #define DUMP(BUF, COUNT) _DUMP(BUF, COUNT) #else #define DUMP(BUF, COUNT) do {} while (0) #endif #endif #define DUMP_TCP(BUF, COUNT) IF_TCP_DUMP(_DUMP(BUF, COUNT)) #define DUMP_SPI(BUF, COUNT) IF_SPI_DUMP(_DUMP(BUF, COUNT)) #define DUMP_SPI_CMD(BUF) do { \ if (dumpDebug & INFO_SPI_FLAG) { \ int i = 0; \ for (; i < CMD_MAX_LEN; ++i) \ { \ printk("0x%x ", BUF[i]); \ if (BUF[i] == END_CMD) \ break; \ } \ printk("\n"); \ } \ }while(0); ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/fw_download.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FW_DOWNLOAD_H #define FW_DOWNLOAD_H #include #include int fw_download_init(void); size_t fw_read_cb(void *ctx, const uint8_t** buf, size_t offset, size_t len); #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/fw_download_extflash.c ================================================ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include int fw_download_init(void) { nvram_init(); return 0; } #define BUF_SIZE 512 size_t fw_read_cb(void* ctx, const uint8_t** buf, size_t offset, size_t len) { static uint8_t* fw_buf = NULL; size_t rlen; /* when firmware download is completed, this function will be * invoked one additional time with buf set to NULL. we can * free the firmware buffer at this time since it's no longer * needed. */ if (NULL == buf) { if (fw_buf) { free(fw_buf); fw_buf = NULL; } return 0; } /* first call? then initialize flash and allocate a buffer to hold * firmware data. */ if (fw_buf == NULL) { fw_buf = malloc(BUF_SIZE); if (fw_buf == NULL) { printk("could not allocate firmware buffer\n"); return 0; } } /* read at most a full buffer */ rlen = len > BUF_SIZE ? BUF_SIZE : len; /* read data and update output parameters */ nvram_read(offset, fw_buf, rlen); *buf = fw_buf; return rlen; } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/license.txt ================================================ Copyright (C) 2009, H&D Wireless AB All rights reserved. The license to use this software in whole and in part and to redistribute it in any form follows with the WiFi HW module from H&D Wireless and is granted under the following restrictions: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of H&D Wireless AB may not be used to endorse or promote products derived from this software without specific prior written permission. 4. The software may only be used together with hardware from H&D Wireless all other use is prohibited. 5. The license to use and redistribute the software is granted together with the purchase of a hardware platform on a one to one basis 6. The binary code may not be reversed engineered or by other means copied to circumvent this license. THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL HD WIRELESS AB BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. For more information regarding this software license Contact H&D Wireless AB (support@hd-wireless.se). ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/lwip_setup.c ================================================ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /*! * \file lwIP setup code * * \brief Collects the lwIP setup code that an application has to * execute in a standalone environment. * * \author H&D Wireless AB \n * */ #include #include #include #include #include #include #include #include "lwip_setup.h" #include "lwip/dns.h" /** * */ static void tcp_tmr_cb(void *ctx) { tcp_tmr(); } /** * */ static void ip_tmr_cb(void *ctx) { ip_reass_tmr(); } /** * */ static void dns_tmr_cb(void *ctx) { dns_tmr(); } /** * */ static void etharp_tmr_cb(void *ctx) { etharp_tmr(); } /** * */ static void dhcp_fine_tmr_cb(void *ctx) { dhcp_fine_tmr(); } /** * */ static void dhcp_coarse_tmr_cb(void *ctx) { dhcp_coarse_tmr(); } int start_ip_stack(struct net_cfg *cfg, struct ip_addr ipaddr, struct ip_addr netmask, struct ip_addr gw) { if (cfg->dhcp_enabled) { IP4_ADDR(&gw, 0,0,0,0); IP4_ADDR(&ipaddr, 0,0,0,0); IP4_ADDR(&netmask, 0,0,0,0); } /* add wl to lwip interface list and set as default */ cfg->netif = netif_add(cfg->netif, &ipaddr, &netmask, &gw, NULL, wlif_init, /* init */ ethernet_input /* handles ARP and IP packets */); if (cfg->netif == NULL) return -1; netif_set_default(cfg->netif); /* register lwip timer callbacks for tcp, arp and dhcp protocols */ timer_sched_timeout_cb(5000, TIMEOUT_PERIODIC, etharp_tmr_cb, NULL); timer_sched_timeout_cb(TCP_TMR_INTERVAL, TIMEOUT_PERIODIC, tcp_tmr_cb, NULL); timer_sched_timeout_cb(DHCP_FINE_TIMER_MSECS, TIMEOUT_PERIODIC, dhcp_fine_tmr_cb, NULL); timer_sched_timeout_cb(DHCP_COARSE_TIMER_MSECS, TIMEOUT_PERIODIC, dhcp_coarse_tmr_cb, NULL); timer_sched_timeout_cb(IP_TMR_INTERVAL, TIMEOUT_PERIODIC, ip_tmr_cb, NULL); timer_sched_timeout_cb(DNS_TMR_INTERVAL, TIMEOUT_PERIODIC, dns_tmr_cb, NULL); return 1; } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/lwip_setup.h ================================================ #ifndef _LWIP_SETUP_H #define _LWIP_SETUP_H #define INIT_IP_CONFIG 0xff #define STATIC_IP_CONFIG 0 #define DYNAMIC_IP_CONFIG 1 struct net_cfg { struct netif *netif; /* lwip network interface */ uint8_t dhcp_enabled; uint8_t dhcp_running; }; struct ctx_server { struct net_cfg net_cfg; uint8_t wl_init_complete; }; /*! Start the IP stack. * If cfg->netif must have been allocated and lwip_init() * must have been called before this function is called * (since the IP stack may have to be polled before this * function can be called). */ int start_ip_stack(struct net_cfg *cfg, struct ip_addr ipaddr, struct ip_addr netmask, struct ip_addr gw); #endif /* _LWIP_SETUP_H */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/lwipopts.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /** * @file * * lwIP Options Configuration */ /* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * */ #ifndef __LWIPOPTS_H__ #define __LWIPOPTS_H__ #include "wl_api.h" #include #ifndef BOARD #error "BOARD must be defined" #endif /* ----------------------------------------------- ---------- Platform specific locking ---------- ----------------------------------------------- */ /** * NO_SYS==1: Provides VERY minimal functionality. Otherwise, * use lwIP facilities. */ #define NO_SYS 1 /* ------------------------------------ ---------- Memory options ---------- ------------------------------------ */ /** * MEM_ALIGNMENT: should be set to the alignment of the CPU * 4 byte alignment -> #define MEM_ALIGNMENT 4 * 2 byte alignment -> #define MEM_ALIGNMENT 2 */ #define MEM_ALIGNMENT 4 /** * MEM_SIZE: the size of the heap memory. If the application will send * a lot of data that needs to be copied, this should be set high. */ #define MEM_SIZE 16000 /* ------------------------------------------------ ---------- Internal Memory Pool Sizes ---------- ------------------------------------------------ */ /** * MEMP_NUM_PBUF: the number of memp struct pbufs (used for PBUF_ROM and PBUF_REF). * If the application sends a lot of data out of ROM (or other static memory), * this should be set high. */ #if BOARD == EVK1101 /* Reduced RAM */ #define MEMP_NUM_PBUF 4 #else #define MEMP_NUM_PBUF 30 #endif /** * MEMP_NUM_RAW_PCB: Number of raw connection PCBs * (requires the LWIP_RAW option) */ #define MEMP_NUM_RAW_PCB 4 /** * MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One * per active UDP "connection". * (requires the LWIP_UDP option) */ #define MEMP_NUM_UDP_PCB 4 /** * MEMP_NUM_TCP_PCB: the number of simulatenously active TCP connections. * (requires the LWIP_TCP option) */ #define MEMP_NUM_TCP_PCB 4 /** * MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP connections. * (requires the LWIP_TCP option) */ #define MEMP_NUM_TCP_PCB_LISTEN 2 /** * MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments. * (requires the LWIP_TCP option) */ #if BOARD == EVK1101 /* Reduced RAM */ #define MEMP_NUM_TCP_SEG 2 #else #define MEMP_NUM_TCP_SEG 32 #endif /** * MEMP_NUM_ARP_QUEUE: the number of simulateously queued outgoing * packets (pbufs) that are waiting for an ARP request (to resolve * their destination address) to finish. * (requires the ARP_QUEUEING option) */ #define MEMP_NUM_ARP_QUEUE 2 /** * MEMP_NUM_SYS_TIMEOUT: the number of simulateously active timeouts. * (requires NO_SYS==0) */ #define MEMP_NUM_SYS_TIMEOUT 0 /** * MEMP_NUM_NETBUF: the number of struct netbufs. * (only needed if you use the sequential API, like api_lib.c) */ #define MEMP_NUM_NETBUF 0 /** * MEMP_NUM_NETCONN: the number of struct netconns. * (only needed if you use the sequential API, like api_lib.c) */ #define MEMP_NUM_NETCONN 0 /** * MEMP_NUM_TCPIP_MSG_API: the number of struct tcpip_msg, which are used * for callback/timeout API communication. * (only needed if you use tcpip.c) */ #define MEMP_NUM_TCPIP_MSG_API 0 /** * MEMP_NUM_TCPIP_MSG_INPKT: the number of struct tcpip_msg, which are used * for incoming packets. * (only needed if you use tcpip.c) */ #define MEMP_NUM_TCPIP_MSG_INPKT 0 /** * PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */ #if BOARD == EVK1101 /* Reduced RAM */ #define PBUF_POOL_SIZE 2 #else #define PBUF_POOL_SIZE 32 #endif /* --------------------------------- ---------- ARP options ---------- --------------------------------- */ /** * LWIP_ARP==1: Enable ARP functionality. */ #define LWIP_ARP 1 /* -------------------------------- ---------- IP options ---------- -------------------------------- */ /** * IP_FORWARD==1: Enables the ability to forward IP packets across network * interfaces. If you are going to run lwIP on a device with only one network * interface, define this to 0. */ #define IP_FORWARD 0 /** * IP_OPTIONS: Defines the behavior for IP options. * IP_OPTIONS==0_ALLOWED: All packets with IP options are dropped. * IP_OPTIONS==1_ALLOWED: IP options are allowed (but not parsed). */ #define IP_OPTIONS_ALLOWED 1 /** * IP_REASSEMBLY==1: Reassemble incoming fragmented IP packets. Note that * this option does not affect outgoing packet sizes, which can be controlled * via IP_FRAG. */ #define IP_REASSEMBLY 1 /** * IP_FRAG==1: Fragment outgoing IP packets if their size exceeds MTU. Note * that this option does not affect incoming packet sizes, which can be * controlled via IP_REASSEMBLY. */ #define IP_FRAG 1 /** * IP_REASS_MAXAGE: Maximum time (in multiples of IP_TMR_INTERVAL - so seconds, normally) * a fragmented IP packet waits for all fragments to arrive. If not all fragments arrived * in this time, the whole packet is discarded. */ #define IP_REASS_MAXAGE 3 /** * IP_REASS_MAX_PBUFS: Total maximum amount of pbufs waiting to be reassembled. * Since the received pbufs are enqueued, be sure to configure * PBUF_POOL_SIZE > IP_REASS_MAX_PBUFS so that the stack is still able to receive * packets even if the maximum amount of fragments is enqueued for reassembly! */ #if BOARD == EVK1101 /* Reduced RAM */ #define IP_REASS_MAX_PBUFS PBUF_POOL_SIZE #define MEMP_NUM_REASSDATA PBUF_POOL_SIZE-1 #else #define IP_REASS_MAX_PBUFS 10 #endif /** * IP_FRAG_USES_STATIC_BUF==1: Use a static MTU-sized buffer for IP * fragmentation. Otherwise pbufs are allocated and reference the original * packet data to be fragmented. */ #define IP_FRAG_USES_STATIC_BUF 0 /** * IP_DEFAULT_TTL: Default value for Time-To-Live used by transport layers. */ #define IP_DEFAULT_TTL 255 /* ---------------------------------- ---------- ICMP options ---------- ---------------------------------- */ /** * LWIP_ICMP==1: Enable ICMP module inside the IP stack. * Be careful, disable that make your product non-compliant to RFC1122 */ #define LWIP_ICMP 1 /** * ICMP_TTL: Default value for Time-To-Live used by ICMP packets. */ #define ICMP_TTL (IP_DEFAULT_TTL) /* --------------------------------- ---------- RAW options ---------- --------------------------------- */ /** * LWIP_RAW==1: Enable application layer to hook into the IP layer itself. */ #define LWIP_RAW 1 /* ---------------------------------- ---------- DHCP options ---------- ---------------------------------- */ /** * LWIP_DHCP==1: Enable DHCP module. */ #define LWIP_DHCP 1 /* ------------------------------------ ---------- AUTOIP options ---------- ------------------------------------ */ /** * LWIP_AUTOIP==1: Enable AUTOIP module. */ #define LWIP_AUTOIP 0 /* ---------------------------------- ---------- SNMP options ---------- ---------------------------------- */ /** * LWIP_SNMP==1: Turn on SNMP module. UDP must be available for SNMP * transport. */ #define LWIP_SNMP 0 #define SNMP_PRIVATE_MIB 0 /* ---------------------------------- ---------- IGMP options ---------- ---------------------------------- */ /** * LWIP_IGMP==1: Turn on IGMP module. */ #define LWIP_IGMP 0 /* ---------------------------------- ---------- DNS options ----------- ---------------------------------- */ /** * LWIP_DNS==1: Turn on DNS module. UDP must be available for DNS * transport. */ #define LWIP_DNS 1 /* --------------------------------- ---------- UDP options ---------- --------------------------------- */ /** * LWIP_UDP==1: Turn on UDP. */ #define LWIP_UDP 1 /** * LWIP_UDPLITE==1: Turn on UDP-Lite. (Requires LWIP_UDP) */ #define LWIP_UDPLITE 0 /** * UDP_TTL: Default Time-To-Live value. */ #define UDP_TTL (IP_DEFAULT_TTL) /* --------------------------------- ---------- TCP options ---------- --------------------------------- */ /** * LWIP_TCP==1: Turn on TCP. */ #define LWIP_TCP 1 /* ---------------------------------- ---------- Pbuf options ---------- ---------------------------------- */ /** * PBUF_LINK_HLEN: the number of bytes that should be allocated for a * link level header. The default is 14, the standard value for * Ethernet. */ #define PBUF_LINK_HLEN (14 + ETH_PAD_SIZE) /* ------------------------------------ ---------- LOOPIF options ---------- ------------------------------------ */ /** * LWIP_HAVE_LOOPIF==1: Support loop interface (127.0.0.1) and loopif.c */ #define LWIP_HAVE_LOOPIF 1 #define LWIP_LOOPIF_MULTITHREADING 0 /* ---------------------------------------------- ---------- Sequential layer options ---------- ---------------------------------------------- */ /** * LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c) */ #define LWIP_NETCONN 0 /* ------------------------------------ ---------- Socket options ---------- ------------------------------------ */ /** * LWIP_SOCKET==1: Enable Socket API (require to use sockets.c) */ #define LWIP_SOCKET 0 /* ---------------------------------------- ---------- Statistics options ---------- ---------------------------------------- */ /** * LWIP_STATS==1: Enable statistics collection in lwip_stats. */ #define LWIP_STATS 1 #define LINK_STATS 1 /* Misc */ #define LWIP_NETIF_LINK_CALLBACK 1 #define LWIP_NETIF_STATUS_CALLBACK 1 #define LWIP_TIMEVAL_PRIVATE 0 #undef DHCP_DOES_ARP_CHECK #if 0 #define LWIP_DEBUG 1 //#define NETIF_DEBUG LWIP_DBG_ON //#define DHCP_DEBUG LWIP_DBG_ON //#define ICMP_DEBUG LWIP_DBG_ON //#define TCP_DEBUG LWIP_DBG_ON //#define TCP_RTO_DEBUG LWIP_DBG_ON //#define IP_DEBUG LWIP_DBG_ON //#define TCP_CWND_DEBUG LWIP_DBG_ON //#define ETHARP_DEBUG LWIP_DBG_ON #define PBUF_DEBUG LWIP_DBG_ON //#define TCP_INPUT_DEBUG LWIP_DBG_ON //#define TCP_OUTPUT_DEBUG LWIP_DBG_ON #endif #define ETH_PAD_SIZE WL_HEADER_SIZE /* size of wifiengine header */ #define MEM_LIBC_MALLOC 1 #define TCP_MSS 512 #if BOARD == EVK1101 /* Reduced RAM */ #define TCP_SND_BUF (1460*1) /* MTU (1500) - IP - TCP hdrs == 1460 */ #else #define TCP_SND_BUF 4096 #endif #endif /* __LWIPOPTS_H__ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/main.c ================================================ /* * main.c * * Created on: May 27, 2010 * Author: mlf by Metodo2 srl */ //#define _TEST_SPI_ #include #include "board.h" #include "gpio.h" #include #include "wl_api.h" #include "wl_cm.h" #include "lwip/init.h" #include "lwip/dhcp.h" #include "lwip/dns.h" #include "lwip/tcp.h" #include "netif/etharp.h" #include "netif/wlif.h" #include "board_init.h" #include "trace.h" #include "timer.h" #include "util.h" #include "cmd_wl.h" #include "ping.h" #include "ard_tcp.h" #include "spi.h" #include "ard_spi.h" #include "delay.h" #include "tc.h" #include "debug.h" #include "ard_utils.h" #include /* FIRMWARE version */ const char* fwVersion = "1.1.0"; #if BOARD == ARDUINO #if !defined(DATAFLASH) #include "wl_fw.h" int fw_download_init(void) { return 0;} void fw_download_cb(void* ctx, uint8_t** buf, uint32_t* len) { //printk("Fw download not available!\n"); /* remember accross different calls */ static uint8_t* _fw_buf = (uint8_t*)&fw_buf[0]; static uint32_t offset = 0; /* when firmware download is completed, this function will be invoked * on additional time with the input value of len set to 0. we can free * the firmware buffer at this time since it's no longer needed. */ if (*len == 0) { return; } /* decide how much to read. we know *len bytes remains, but we only have * room for SECTOR_SIEZ bytes in our buffer (fw_buf) */ uint32_t fw_len = *len; *buf = (_fw_buf+offset); *len = fw_len; /* we need to know where to start reading upon next call */ offset += fw_len; } #else #include "fw_download.h" #endif #endif bool ifStatus = false; bool scanNetCompleted = false; static bool initSpiComplete = false; // variable used as enable flag for debug prints DEFINE_DEBUG_VARIABLES(); /** * */ static void wl_cm_scan_cb(void* ctx) { INFO_INIT("Scan Completed!\n"); scanNetCompleted=true; } /** * */ static void wl_cm_conn_cb(struct wl_network_t* net, void* ctx) { struct ctx_server* hs = ctx; LINK_LED_ON(); INFO_INIT("Connection cb...\n"); printk("link up, connected to \"%s\"\n", ssid2str(&net->ssid)); if ( hs->net_cfg.dhcp_enabled == DYNAMIC_IP_CONFIG ) { INFO_INIT("Start DHCP...\n"); printk("requesting dhcp ... "); int8_t result = dhcp_start(hs->net_cfg.netif); printk((result==ERR_OK)?"OK\n":"FAILED\n"); hs->net_cfg.dhcp_running = 1; } else { netif_set_up(hs->net_cfg.netif); } INFO_INIT("Start DNS...\n"); dns_init(); } /** * */ static void wl_cm_disconn_cb(void* ctx) { struct ctx_server* hs = ctx; LINK_LED_OFF(); INFO_INIT("Disconnection cb...\n"); if (hs->net_cfg.dhcp_running) { printk("link down, release dhcp\n"); dhcp_release(hs->net_cfg.netif); dhcp_stop(hs->net_cfg.netif); hs->net_cfg.dhcp_running = 0; } else { printk("link down\n"); netif_set_down(hs->net_cfg.netif); } set_result_cmd(WL_FAILURE); } #if 0 static void wl_cm_err_cb(void* ctx) { int err = *(int*)ctx; WARN("Error: %d\n", err); set_result_cmd(err); } #endif /** * */ static void ip_status_cb(struct netif* netif) { INFO_INIT("IP status cb...\n"); if (netif_is_up(netif)) { set_result_cmd(WL_SUCCESS); printk("bound to %s\n", ip2str(netif->ip_addr)); ifStatus = true; }else{ ifStatus = false; closeConnections(); WARN("Interface not up!\n"); } } /** * */ void led_init(void) { gpio_enable_gpio_pin(LED0_GPIO); gpio_enable_gpio_pin(LED1_GPIO); gpio_enable_gpio_pin(LED2_GPIO); LINK_LED_OFF(); ERROR_LED_OFF(); DATA_LED_OFF(); } void tc_init(void) { // The timer/counter instance and channel number are used in several functions. // It's defined as local variable for ease-of-use causes and readability. volatile avr32_tc_t *tc = WIFI_TC; // Options for waveform genration. tc_waveform_opt_t waveform_opt = { .channel = WIFI_TC_CHANNEL_ID, // Channel selection. .bswtrg = TC_EVT_EFFECT_NOOP, // Software trigger effect on TIOB. .beevt = TC_EVT_EFFECT_NOOP, // External event effect on TIOB. .bcpc = TC_EVT_EFFECT_NOOP, // RC compare effect on TIOB. .bcpb = TC_EVT_EFFECT_NOOP, // RB compare effect on TIOB. .aswtrg = TC_EVT_EFFECT_NOOP, // Software trigger effect on TIOA. .aeevt = TC_EVT_EFFECT_NOOP, // External event effect on TIOA. .acpc = TC_EVT_EFFECT_TOGGLE, // RC compare effect on TIOA: toggle. .acpa = TC_EVT_EFFECT_TOGGLE, // RA compare effect on TIOA: toggle (other possibilities are none, set and clear). .wavsel = TC_WAVEFORM_SEL_UP_MODE_RC_TRIGGER,// Waveform selection: Up mode with automatic trigger(reset) on RC compare. .enetrg = FALSE, // External event trigger enable. .eevt = TC_EXT_EVENT_SEL_TIOB_INPUT, // External event selection. .eevtedg = TC_SEL_NO_EDGE, // External event edge selection. .cpcdis = FALSE, // Counter disable when RC compare. .cpcstop = FALSE, // Counter clock stopped with RC compare. .burst = TC_BURST_NOT_GATED, // Burst signal selection. .clki = TC_CLOCK_RISING_EDGE, // Clock inversion. .tcclks = TC_CLOCK_SOURCE_TC2 // Internal source clock 3, connected to fPBA / 2. }; // Assign I/O to timer/counter channel pin & function. gpio_enable_module_pin(WIFI_TC_CHANNEL_PIN, WIFI_TC_CHANNEL_FUNCTION); // Initialize the timer/counter. tc_init_waveform(tc, &waveform_opt); // Initialize the timer/counter waveform. // Set the compare triggers. tc_write_ra(tc, WIFI_TC_CHANNEL_ID, 0x01A4); // Set RA value. tc_write_rc(tc, WIFI_TC_CHANNEL_ID, 0x0348); // Set RC value. // Start the timer/counter. tc_start(tc, WIFI_TC_CHANNEL_ID); } /** * */ void poll(struct ctx_server* hs) { /* this will trigger any scheduled timer callbacks */ timer_poll(); /* handle console input */ console_poll(); /* wl api 'tick' */ wl_tick(timer_get_ms()); /* lwip driver poll */ wlif_poll(hs->net_cfg.netif); if (initSpiComplete) spi_poll(hs->net_cfg.netif); #ifdef WITH_GUI gui_exec(timer_get_ms()); #endif } void initShell(void* ctx) { /* initialize shell */ INFO_INIT("Shell init...\n"); console_init(); console_add_cmd("scan", cmd_scan, NULL); console_add_cmd("connect", cmd_connect, NULL); console_add_cmd("setkey", cmd_setkey, NULL); console_add_cmd("status", cmd_status, ctx); console_add_cmd("debug", cmd_debug, NULL); console_add_cmd("dumpBuf", cmd_dumpBuf, NULL); console_add_cmd("ipconfig", cmd_set_ip, ctx); #ifdef ADD_CMDS console_add_cmd("powersave", cmd_power, NULL); console_add_cmd("psconf", cmd_psconf, NULL); #endif #ifdef PING_CMD console_add_cmd("ping", cmd_ping, NULL); #endif console_add_cmd("ttcp", cmd_ttcp, NULL); #ifdef WITH_WPA console_add_cmd("wpass", cmd_setpass, NULL); console_add_cmd("dpass", cmd_delpass, NULL); #endif #ifdef _SPI_STATS_ console_add_cmd("spiStat", cmd_statSpi, NULL); console_add_cmd("resetSpiStat", cmd_resetStatSpi, NULL); #endif #ifdef _DNS_CMD_ console_add_cmd("getHost", cmd_gethostbyname, NULL); console_add_cmd("setDNS", cmd_setDnsServer, NULL); #endif console_add_cmd("startSrv", cmd_startSrv, NULL); console_add_cmd("startCli", cmd_startCli, NULL); console_add_cmd("sendUdp", cmd_sendUdpData, NULL); } /** * */ void wl_init_complete_cb(void* ctx) { struct ctx_server *hs = ctx; struct ip_addr ipaddr, netmask, gw; wl_err_t wl_status; if (hs->net_cfg.dhcp_enabled == INIT_IP_CONFIG) { IP4_ADDR(&gw, 0,0,0,0); IP4_ADDR(&ipaddr, 0,0,0,0); IP4_ADDR(&netmask, 0,0,0,0); /* default is dhcp enabled */ hs->net_cfg.dhcp_enabled = DYNAMIC_IP_CONFIG; } start_ip_stack(&hs->net_cfg, ipaddr, netmask, gw); netif_set_status_callback(hs->net_cfg.netif, ip_status_cb); INFO_INIT("Starting CM...\n"); /* start connection manager */ wl_status = wl_cm_init(wl_cm_scan_cb, wl_cm_conn_cb, wl_cm_disconn_cb, hs); ASSERT(wl_status == WL_SUCCESS, "failed to init wl conn mgr"); wl_cm_start(); wl_scan(); if (initSpi(hs)){ WARN("Spi not initialized\n"); }else { initSpiComplete = true; AVAIL_FOR_SPI(); } hs->wl_init_complete = 1; } void startup_init(void) { INIT_SIGNAL_FOR_SPI(); BUSY_FOR_SPI(); // if DEBUG enabled use DEB_PIN_GPIO for debug purposes DEB_PIN_ENA(); DEB_PIN_ENA(2); DEB_PIN_UP(); DEB_PIN_UP(2); } const char timestamp[] = __TIMESTAMP__; /** * */ int main(void) { wl_err_t wl_status; int status; struct ctx_server *hs; enum wl_host_attention_mode mode; startup_init(); board_init(); led_init(); tc_init(); delay_init(FOSC0); #ifdef _TEST_SPI_ for (;;) { /* handle console input */ console_poll(); spi_poll(NULL); } #else printk("Arduino Wifi Startup... [%s]\n", timestamp); size_t size_ctx_server = sizeof(struct ctx_server); hs = calloc(1, size_ctx_server); ASSERT(hs, "out of memory"); size_t size_netif = sizeof(struct netif); hs->net_cfg.netif = calloc(1, size_netif); ASSERT(hs->net_cfg.netif, "out of memory"); hs->net_cfg.dhcp_enabled = INIT_IP_CONFIG; INFO_INIT("hs:%p size:0x%x netif:%p size:0x%x\n", hs, size_ctx_server, hs->net_cfg.netif, size_netif); initShell(hs); timer_init(NULL, NULL); lwip_init(); status = fw_download_init(); ASSERT(status == 0, "failed to prepare for firmware download\n"); wl_status = wl_transport_init(fw_read_cb, hs, &mode); if (wl_status != WL_SUCCESS) goto err; INFO_INIT("Mode: 0x%x\n", mode); wl_status = wl_init(hs, wl_init_complete_cb, mode); if (wl_status != WL_SUCCESS) goto err; /* start main loop */ for (;;) poll(hs); err: /* show error message on console and display if wlan initialization fails */ #define WL_CARD_FAILURE_STR "Could not detect wl device, aborting\n" #define WL_FIRMWARE_INVALID_STR "Invalid firmware data, aborting\n" #define WL_OTHER_FAILURE_STR "Failed to start wl initialization\n" switch (wl_status) { case WL_CARD_FAILURE: printk(WL_CARD_FAILURE_STR); break; case WL_FIRMWARE_INVALID: printk(WL_FIRMWARE_INVALID_STR); break; default: printk(WL_OTHER_FAILURE_STR); break; } for (;;) { timer_poll(); } #endif } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/nvram.c ================================================ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include "compiler.h" #include "preprocessor.h" #include "board.h" #include "power_clocks_lib.h" #include "gpio.h" #include "spi.h" #include "conf_at45dbx.h" #include "at45dbx.h" #include #include static struct nvram { uint8_t read; void *data; uint32_t len; uint16_t off; } PRIV; int nvram_init(void) { spi_options_t spiOptions = { .reg = AT45DBX_SPI_FIRST_NPCS, .baudrate = AT45DBX_SPI_MASTER_SPEED, .bits = AT45DBX_SPI_BITS, .spck_delay = 0, .trans_delay = 0, .stay_act = 1, .spi_mode = 0, .modfdis = 1 }; at45dbx_init(spiOptions, FPBA_HZ); return 0; } /** * Invoked by at45dbx driver * */ void at45dbx_read_multiple_sector_callback(const void *psector) { struct nvram *priv = &PRIV; const uint8_t *buf = psector; if (!priv->read) return; memcpy(priv->data, buf + priv->off, priv->len); } /** * Invoked by at45dbx driver * */ void at45dbx_write_multiple_sector_callback(void *psector) { struct nvram *priv = &PRIV; uint8_t *buf = psector; memcpy(buf + priv->off, priv->data, priv->len); } /** * Write/read any number bytes into any offset of nor flash by taking care * of cases where the length is not aligned to the sector size or where * the addr is not aligned to the sector offsets. * */ static int nvram_rw(uint32_t addr, void *data, uint16_t len, int write) { struct nvram *priv = &PRIV; priv->read = write ? 0 : 1; while (len) { uint32_t sector = addr / AT45DBX_SECTOR_SIZE; priv->data = data; priv->off = addr % AT45DBX_SECTOR_SIZE; priv->len = AT45DBX_SECTOR_SIZE; if (len < AT45DBX_SECTOR_SIZE) priv->len = len; if (priv->len > AT45DBX_SECTOR_SIZE - priv->off) priv->len = AT45DBX_SECTOR_SIZE - priv->off; at45dbx_read_open(sector); at45dbx_read_multiple_sector(1); at45dbx_read_close(); if (write) { at45dbx_write_open(sector); at45dbx_write_multiple_sector(1); at45dbx_write_close(); } data += priv->len; len -= priv->len; addr += priv->len; } return 0; } /** * Write any number bytes into any offset of nor flash. * */ int nvram_write(uint32_t addr, const void *data, uint32_t len) { return nvram_rw(addr, (void *) data, len, 1); } /** * Read any number bytes into any offset of nor flash. * */ int nvram_read(uint32_t addr, void *data, uint32_t len) { return nvram_rw(addr, data, len, 0); } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/nvram.h ================================================ #ifndef NVRAM_H #define NVRAM_H #include int nvram_init(void); int nvram_read(uint32_t addr, void *data, uint32_t len); int nvram_write(uint32_t addr, const void *data, uint32_t len); #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/owl_os.c ================================================ #include #include #include #include #include void *owl_os_alloc(size_t size) { return malloc(size); } void *owl_os_realloc(void *ptr, size_t size) { return realloc(ptr, size); } void owl_os_free(void *p) { free(p); } void *owl_os_memcpy(void *dst, const void *src, size_t n) { return memcpy(dst, src, n); } void *owl_os_memset(void *s, int c, size_t n) { return memset(s, c, n); } void *owl_os_memmove(void *dst, const void *src, size_t n) { return memmove(dst, src, n); } size_t owl_os_strlen(char *s) { return strlen(s); } char *owl_os_strncpy(char *dst, const char *src, size_t n) { return strncpy(dst, src, n); } int owl_os_strncmp(const char *s1, const char *s2, size_t n) { return strncmp(s1, s2, n); } int owl_os_strcmp(const char *s1, const char *s2) { return strcmp(s1, s2); } char *owl_os_strcpy(char *dst, const char *src) { return strcpy(dst, src); } char *owl_os_strdup(const char *s) { return strdup(s); } char *owl_os_strndup(const char *s, size_t n) { return strndup(s, n); } int owl_os_memcmp(const void *s1, const void *s2, size_t n) { return memcmp(s1, s2, n); } long int owl_os_strtol(const char *nptr, char **endptr, int base) { return strtol(nptr, endptr, base); } char *owl_os_strchr(const char *s, int c) { return strchr(s, c); } char *owl_os_strrchr(const char *s, int c) { return strrchr(s, c); } int owl_os_strcasecmp(const char *s1, const char *s2) { return strcasecmp(s1, s2); } char *owl_os_strstr(const char *haystack, const char *needle) { return strstr(haystack, needle); } int owl_os_snprintf(char *str, size_t size, const char *format, ...) { int ret; va_list ap; va_start(ap, format); ret = vsniprintf(str, size, format, ap); va_end(ap); return ret; } /* for debugging only, never called if wl_api was built without debug */ #ifdef CONFIG_OWL #include "owl_env.h" int owl_os_printf(const char *fmt, ...) { char *str = NULL; va_list args; int len; char *iter; va_start(args, fmt); if ((str = malloc(160)) == NULL) return -1; if ((len = vsniprintf(str, 160, fmt, args)) < 0) { free(str); return -1; } iter = str; while (*iter) owl_putc(*iter++); free(str); return len; } #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/ping.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2003 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is derived from a part of the lwIP TCP/IP stack. * */ #ifdef PING_CMD #include "lwip/opt.h" #include "lwip/mem.h" #include "lwip/raw.h" #include "lwip/icmp.h" #include "lwip/netif.h" #include "lwip/sys.h" #include "lwip/sockets.h" #include "lwip/inet.h" #include "lwip/inet_chksum.h" #include "ping.h" #include "timer.h" #include "util.h" #include "getopt.h" #define PING_ID 0xAFAF struct ping_info_t { struct ip_addr destination; uint32_t deadline; /* -w (in seconds) */ uint32_t interval; /* -i (in ms) */ uint32_t timeout; /* ms */ uint32_t data_size; /* -s */ uint32_t count; /* -c, 0 means continous ping */ uint32_t size; uint32_t first_tx_tm; uint32_t last_tx_tm; uint32_t last_rx_tm; uint32_t num_tx; uint32_t num_rx; uint32_t flags; uint16_t seq_num; Bool quiet; /* -q */ ping_complete_cb_t complete_cb; void *ctx; #define PING_REPLY (1 << 0) }; static struct ping_info_t INFO; /** Prepare a echo ICMP request */ static void ping_prepare_echo(struct icmp_echo_hdr *iecho, struct ping_info_t* ping_info) { int i; ICMPH_TYPE_SET(iecho,ICMP_ECHO); ICMPH_CODE_SET(iecho, 0); iecho->chksum = 0; iecho->id = PING_ID; iecho->seqno = htons(++ping_info->seq_num); iecho->chksum = 0; /* fill the additional data buffer with some data */ for(i = 0; i < ping_info->data_size; i++) { ((char*)iecho)[sizeof(struct icmp_echo_hdr) + i] = i; } iecho->chksum = inet_chksum(iecho, ping_info->size); } /* Ping using the raw ip */ static u8_t ping_recv(void *arg, struct raw_pcb *pcb, struct pbuf *p, struct ip_addr *addr) { struct icmp_echo_hdr *iecho; struct ip_hdr *ip = p->payload; struct ping_info_t* ping_info = (struct ping_info_t*) arg; uint32_t us; if (pbuf_header( p, -PBUF_IP_HLEN)==0) { iecho = p->payload; if ((iecho->id == PING_ID) && (iecho->seqno == htons(ping_info->seq_num))) { ping_info->last_rx_tm = timer_get_ms(); ping_info->num_rx++; us = 1000 * (ping_info->last_rx_tm - ping_info->last_tx_tm); if (!ping_info->quiet) printk("%d bytes from %s: icmp_seq=%d ttl=%d " \ "time=%d.%03d ms\n", p->tot_len, ip2str(ip->src), iecho->seqno, IPH_TTL(ip), us / 1000, us % 1000); /* do some ping result processing */ ping_info->flags |= PING_REPLY; } } pbuf_free(p); return 1; /* eat the event */ } static void ping_send(struct raw_pcb *raw, struct ping_info_t* ping_info) { struct pbuf *p; struct icmp_echo_hdr *iecho; if (!(p = pbuf_alloc(PBUF_IP, ping_info->size, PBUF_RAM))) { return; } if ((p->len == p->tot_len) && (p->next == NULL)) { iecho = p->payload; ping_prepare_echo(iecho, ping_info); raw_sendto(raw, p, &ping_info->destination); if (!ping_info->first_tx_tm) ping_info->first_tx_tm = timer_get_ms(); ping_info->last_tx_tm = timer_get_ms(); ping_info->num_tx++; } pbuf_free(p); } void ping_set_callback(ping_complete_cb_t cb, void *ctx) { INFO.complete_cb = cb; INFO.ctx = ctx; } void ping_stop(uint32_t *tx_cnt, uint32_t *rx_cnt) { struct ping_info_t *ping_info = &INFO; *tx_cnt = ping_info->num_tx; *rx_cnt = ping_info->num_rx; ping_info->count = ping_info->num_tx; if ( 0 == ping_info->count ) { ping_info->count = 1; } } static int init_ping_info(int argc, char* argv[], struct ping_info_t* ping_info) { int c; ping_complete_cb_t cb; void *ctx; cb = ping_info->complete_cb; ctx = ping_info->ctx; memset(ping_info, 0, sizeof(struct ping_info_t)); ping_info->complete_cb = cb; ping_info->ctx = ctx; ping_info->deadline = 0; ping_info->interval = 1000; ping_info->timeout = 3000; ping_info->data_size = 32; ping_info->count = 3; ping_info->destination = netif_default ? netif_default->gw : ip_addr_any; optind = 1; while ((c = getopt(argc, argv, "c:i:s:w:q")) != -1) { switch (c) { case 'c': ping_info->count = atoi(optarg); break; case 'i': ping_info->interval = atoi(optarg); break; case 's': ping_info->data_size = atoi(optarg); break; case 'q': ping_info->quiet = TRUE; break; case 'w': ping_info->deadline = atoi(optarg); break; } } ping_info->size = sizeof(struct icmp_echo_hdr) + ping_info->data_size; if (optind >= argc) return -1; ping_info->destination = str2ip(argv[optind]); if (!ping_info->destination.addr) return -1; ping_info->last_rx_tm = timer_get_ms(); return 0; } static void print_stats(struct ping_info_t* ping_info) { printk("\n--- %s ping statistics ---\n", ip2str(ping_info->destination)); printk("%d packets transmitted, %d received, %d%% packet loss, "\ "time %dms\n\n", ping_info->num_tx, ping_info->num_rx, 100 * (ping_info->num_tx - ping_info->num_rx) / ping_info->num_tx, timer_get_ms() - ping_info->first_tx_tm); } static void ping_finalize(struct ping_info_t* ping_info) { print_stats(ping_info); if (ping_info->complete_cb) { ping_info->complete_cb(ping_info->num_tx, ping_info->num_rx, ping_info->ctx); } } cmd_state_t cmd_ping(int argc, char* argv[], void* ctx) { static enum { INIT, PING, WAIT_REPLY } state = INIT; struct ping_info_t *ping_info = &INFO; static struct raw_pcb *pcb; switch (state) { case INIT: if (init_ping_info(argc, argv, ping_info) != 0) { printk("Usage: ping [-c count] [-i interval] " \ "[-s packetsize]\n " \ "[-w deadline] [-q] destination\n"); return CMD_DONE; } if (!(pcb = raw_new(IP_PROTO_ICMP))) { printk("could not allocate pcb\n"); state = INIT; return CMD_DONE; } raw_recv(pcb, ping_recv, ping_info); raw_bind(pcb, IP_ADDR_ANY); printk("PING %s %d(%d) bytes of data\n", ip2str(ping_info->destination), ping_info->data_size, ping_info->size); state = PING; /* fall through */ case PING: if (!netif_is_up(netif_default)) { printk("netif is down\n"); raw_remove(pcb); state = INIT; return CMD_DONE; } if (ping_info->count && ping_info->num_tx == ping_info->count) { ping_finalize(ping_info); raw_remove(pcb); state = INIT; return CMD_DONE; } if (timer_get_ms() < ping_info->last_rx_tm + ping_info->interval) { return CMD_INPROGRESS; } ping_send(pcb, ping_info); state = WAIT_REPLY; return CMD_INPROGRESS; case WAIT_REPLY: if (ping_info->flags & PING_REPLY) { ping_info->flags &= (~PING_REPLY); state = PING; return CMD_INPROGRESS; } if (timer_get_ms() > ping_info->last_tx_tm + ping_info->timeout) { if (!ping_info->quiet) printk("timeout from %s\n", ip2str(ping_info->destination)); state = PING; return CMD_INPROGRESS; } if (ping_info->deadline && timer_get_ms() > ping_info->first_tx_tm + ping_info->deadline * 1000) { ping_finalize(ping_info); raw_remove(pcb); state = INIT; return CMD_DONE; } return CMD_INPROGRESS; } /* unreachable */ Assert(0); return CMD_DONE; } #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/ping.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* * Copyright (c) 2001-2003 Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is derived from a part of the lwIP TCP/IP stack. * */ #ifndef PING_H #define PING_H #include "console.h" typedef void (*ping_complete_cb_t)(uint32_t tx_pkt_cnt, uint32_t rx_pkt_cnt, void *ctx); void ping_set_callback(ping_complete_cb_t cb, void *ctx); void ping_stop(uint32_t *tx_cnt, uint32_t *rx_cnt); cmd_state_t cmd_ping(int argc, char* argv[], void* ctx); #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/printf-stdarg.c ================================================ /* This source file is part of the ATMEL AVR32-SoftwareFramework-AT32UC3A-1.4.0 Release */ /*This file has been prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief sprintf functions to replace newlib for AVR32 UC3. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * *****************************************************************************/ /* Copyright (C) 2006-2008, Atmel Corporation All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of ATMEL may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Copyright 2001, 2002 Georges Menie (www.menie.org) stdarg version contributed by Christian Ettinger This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* putchar is the only external dependency for this file, if you have a working putchar, leave it commented out. If not, uncomment the define below and replace outbyte(c) by your own function call. */ #include static void printchar(char **str, int c) { extern int board_putchar(char c); if (str) { **str = c; ++(*str); } else (void) board_putchar(c); } #define PAD_RIGHT 1 #define PAD_ZERO 2 static int prints(char **out, const char *string, int width, int pad) { register int pc = 0, padchar = ' '; if (width > 0) { register int len = 0; register const char *ptr; for (ptr = string; *ptr; ++ptr) ++len; if (len >= width) width = 0; else width -= len; if (pad & PAD_ZERO) padchar = '0'; } if (!(pad & PAD_RIGHT)) { for ( ; width > 0; --width) { printchar (out, padchar); ++pc; } } for ( ; *string ; ++string) { printchar (out, *string); ++pc; } for ( ; width > 0; --width) { printchar (out, padchar); ++pc; } return pc; } /* the following should be enough for 32 bit int */ #define PRINT_BUF_LEN 12 static int printi(char **out, int i, int b, int sg, int width, int pad, int letbase) { char print_buf[PRINT_BUF_LEN]; register char *s; register int t, neg = 0, pc = 0; register unsigned int u = i; if (i == 0) { print_buf[0] = '0'; print_buf[1] = '\0'; return prints (out, print_buf, width, pad); } if (sg && b == 10 && i < 0) { neg = 1; u = -i; } s = print_buf + PRINT_BUF_LEN-1; *s = '\0'; while (u) { t = u % b; if( t >= 10 ) t += letbase - '0' - 10; *--s = t + '0'; u /= b; } if (neg) { if( width && (pad & PAD_ZERO) ) { printchar (out, '-'); ++pc; --width; } else { *--s = '-'; } } return pc + prints (out, s, width, pad); } #if 0 int fprintf(__FILE *stream, const char *format, ...) { return 0; } #endif int printk_va(char **out, const char *format, va_list args ) { register int width, pad; register int pc = 0; char scr[2]; for (; *format != 0; ++format) { if (*format == '%') { ++format; width = pad = 0; if (*format == '\0') break; if (*format == '%') goto out; if (*format == '-') { ++format; pad = PAD_RIGHT; } while (*format == '0') { ++format; pad |= PAD_ZERO; } for ( ; *format >= '0' && *format <= '9'; ++format) { width *= 10; width += *format - '0'; } if( *format == 's' ) { register char *s = (char *)va_arg( args, int ); pc += prints (out, s?s:"(null)", width, pad); continue; } if( *format == 'd' ) { pc += printi (out, va_arg( args, int ), 10, 1, width, pad, 'a'); continue; } if( *format == 'p' ) { pad = 8; pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'a'); continue; } if( *format == 'x' ) { pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'a'); continue; } if( *format == 'X' ) { pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'A'); continue; } if( *format == 'u' ) { pc += printi (out, va_arg( args, int ), 10, 0, width, pad, 'a'); continue; } if( *format == 'c' ) { /* char are converted to int then pushed on the stack */ scr[0] = (char)va_arg( args, int ); scr[1] = '\0'; pc += prints (out, scr, width, pad); continue; } } else { out: printchar (out, *format); ++pc; } } if (out) **out = '\0'; va_end( args ); return pc; } int printk(const char *format, ...) { va_list args; va_start( args, format ); return printk_va( 0, format, args ); } #ifndef __ARM__ int sprintf(char *out, const char *format, ...) { va_list args; va_start( args, format ); return printk_va( &out, format, args ); } #endif #ifdef TEST_PRINTF int main(void) { char *ptr = "Hello world!"; char *np = 0; int i = 5; unsigned int bs = sizeof(int)*8; int mi; char buf[80]; mi = (1 << (bs-1)) + 1; printf("%s\n", ptr); printf("printf test\n"); printf("%s is null pointer\n", np); printf("%d = 5\n", i); printf("%d = - max int\n", mi); printf("char %c = 'a'\n", 'a'); printf("hex %x = ff\n", 0xff); printf("hex %02x = 00\n", 0); printf("signed %d = unsigned %u = hex %x\n", -3, -3, -3); printf("%d %s(s)%", 0, "message"); printf("\n"); printf("%d %s(s) with %%\n", 0, "message"); sprintf(buf, "justif: \"%-10s\"\n", "left"); printf("%s", buf); sprintf(buf, "justif: \"%10s\"\n", "right"); printf("%s", buf); sprintf(buf, " 3: %04d zero padded\n", 3); printf("%s", buf); sprintf(buf, " 3: %-4d left justif.\n", 3); printf("%s", buf); sprintf(buf, " 3: %4d right justif.\n", 3); printf("%s", buf); sprintf(buf, "-3: %04d zero padded\n", -3); printf("%s", buf); sprintf(buf, "-3: %-4d left justif.\n", -3); printf("%s", buf); sprintf(buf, "-3: %4d right justif.\n", -3); printf("%s", buf); return 0; } /* * if you compile this file with * gcc -Wall $(YOUR_C_OPTIONS) -DTEST_PRINTF -c printf.c * you will get a normal warning: * printf.c:214: warning: spurious trailing `%' in format * this line is testing an invalid % at the end of the format string. * * this should display (on 32bit int machine) : * * Hello world! * printf test * (null) is null pointer * 5 = 5 * -2147483647 = - max int * char a = 'a' * hex ff = ff * hex 00 = 00 * signed -3 = unsigned 4294967293 = hex fffffffd * 0 message(s) * 0 message(s) with % * justif: "left " * justif: " right" * 3: 0003 zero padded * 3: 3 left justif. * 3: 3 right justif. * -3: -003 zero padded * -3: -3 left justif. * -3: -3 right justif. */ #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/printf-stdarg.h ================================================ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef PRINTF_STDARG_H #define PRINTF_STDARG_H #include int printk(const char *format, ...); int printk_va(char **out, const char *format, va_list args ); #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/timer.c ================================================ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #ifdef FREERTOS_USED #include "FreeRTOS.h" #include "task.h" #endif #define TIMER_HZ 4 struct timeout_t { U32 tick; U32 expire_at_tick; Bool expired; U8 type; void (*cb)(void* ctx); void* ctx; }; struct timer_t { volatile U32 tick; struct timeout_t timeout[10]; void (*tick_isr) (void* ctx); const U32 MS_PER_TICK; void *ctx; }; #define ARRAY_SIZE(a) sizeof(a) / sizeof(a[0]) static struct timer_t TIMER = { .tick = 0, #ifdef FREERTOS_USED .MS_PER_TICK = 1 / portTICK_RATE_MS, #else .MS_PER_TICK = TIMER_HZ, #endif .timeout = { { 0 } }, }; #ifdef FREERTOS_USED /* Use TICK-hook */ void vApplicationTickHook( void ) { struct timer_t* priv = &TIMER; priv->tick++; if(priv->tick_isr) { priv->tick_isr(priv->ctx); } } #else /* Use interrupt directly */ static __attribute__((__interrupt__)) void irq_handler(void) { volatile avr32_rtc_t *rtc = &AVR32_RTC; struct timer_t* priv = &TIMER; priv->tick++; if(priv->tick_isr) priv->tick_isr(priv->ctx); rtc->icr = AVR32_RTC_ICR_TOPI_MASK; rtc->isr; } #endif void timer_init(void (*tick_isr) (void* ctx), void* ctx) { struct timer_t* priv = &TIMER; uint8_t id; #ifndef FREERTOS_USED INTC_register_interrupt(&irq_handler, AVR32_RTC_IRQ, AVR32_INTC_INT0); if (!rtc_init(&AVR32_RTC, RTC_OSC_RC, 0)) Assert(0); rtc_set_top_value(&AVR32_RTC, 115 * priv->MS_PER_TICK / 2); rtc_enable_interrupt(&AVR32_RTC); rtc_enable(&AVR32_RTC); #else /* With FreeRTOS we use the OS tick instead */ #endif priv->tick_isr = tick_isr; priv->ctx = ctx; for (id = 0; id < ARRAY_SIZE(priv->timeout); id++) priv->timeout[id].expired = TRUE; } U32 timer_get_ms(void) { struct timer_t* priv = &TIMER; return priv->tick * priv->MS_PER_TICK; } void timer_delay(U32 ms) { struct timer_t* priv = &TIMER; U32 expire_at_tick = priv->tick + ms / priv->MS_PER_TICK; while (priv->tick < expire_at_tick); } /** * Called from application main loop to invoke any scheduled timeout cbs. * This function might be called as often as possible rather than at each tick * to support the timeout value '0', e.g a timeout within less than one tick. * */ void timer_poll(void) { struct timer_t* priv = &TIMER; U8 i; for (i = 0; i < ARRAY_SIZE(priv->timeout); i++) { struct timeout_t* tmo = &priv->timeout[i]; if (tmo->expired) continue; if (tmo->expire_at_tick > priv->tick) continue; if (tmo->cb) tmo->cb(tmo->ctx); if (tmo->type == TIMEOUT_PERIODIC) tmo->expire_at_tick = priv->tick + tmo->tick; else tmo->expired = TRUE; } } static U32 timer_sched_timeout(U32 ms, U8 type) { struct timer_t* priv = &TIMER; struct timeout_t* tmo; U8 id; Assert(type == TIMEOUT_ONESHOT || type == TIMEOUT_PERIODIC); for (id = 0; id < ARRAY_SIZE(priv->timeout); id++) { tmo = &priv->timeout[id]; if (tmo->expired) break; } Assert(id != ARRAY_SIZE(priv->timeout)); tmo->tick = ms / priv->MS_PER_TICK; tmo->expire_at_tick = priv->tick + tmo->tick; tmo->type = type; tmo->expired = FALSE; return id; } U32 timer_sched_timeout_cb(U32 ms, U8 type, void (*cb)(void *ctx), void* ctx) { struct timer_t* priv = &TIMER; struct timeout_t* tmo; U8 id; Assert(cb); id = timer_sched_timeout(ms, type); tmo = &priv->timeout[id]; tmo->cb = cb; tmo->ctx = ctx; return id; } U32 timer_mod(U32 id, U32 ms, U8 type, void (*cb)(void *ctx), void* ctx) { struct timer_t* priv = &TIMER; if (id != INVALID_TIMER_ID && !priv->timeout[id].expired) timer_cancel_timeout(id); return timer_sched_timeout_cb(ms, type, cb, ctx); } void timer_cancel_timeout(U32 id) { struct timer_t* priv = &TIMER; struct timeout_t* tmo; tmo = &priv->timeout[id]; tmo->expired = TRUE; } int timer_interval_passed(U32 old, U32 new, U32 diff) { /* New did not wrap */ if (new > old && new - old > diff) { return 1; } /* New did wrap */ else if (new < old && ( ( (U32)(-1) - old ) + new ) > diff ) { return 1; } return 0; } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/timer.h ================================================ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef TIMER_H #define TIMER_H #include enum { TIMEOUT_ONESHOT, TIMEOUT_PERIODIC }; #define INVALID_TIMER_ID 0xFFFFFFFF /* Handle timer overflows. Return 1 if the interval has passed. */ int timer_interval_passed(uint32_t old, uint32_t new, uint32_t diff); void timer_tick(); void timer_init(void (*tick_isr) (void* ctx), void* ctx); void timer_poll(void); void timer_delay(uint32_t ms); uint32_t timer_sched_timeout_cb(uint32_t ms, uint8_t type, void (*cb)(void *ctx), void* ctx); uint32_t timer_mod(uint32_t id, uint32_t ms, uint8_t type, void (*cb)(void *ctx), void* ctx); void timer_cancel_timeout(uint32_t id); uint32_t timer_get_ms(void); #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/top_defs.h ================================================ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _TOP_DEFS_H #define _TOP_DEFS_H #include #include #define ARRAY_SIZE(a) sizeof(a) / sizeof((a)[0]) #ifndef UNREF #define UNREF(x) x = x #endif #if __GNUC__ #ifdef __KERNEL__ #define WEAK_DECL #else #define WEAK_DECL __attribute__ ((__weak__)) #endif #define PACKED __attribute__ ((__packed__)) #define USED __attribute__ ((__used__)) #else #error "Unsupported compiler" #endif #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #if 0 #include /* * These functions should _NOT_ be used, call iprintf, sniprintf, iscanf, siscanf etc * instead. Those functions do not have support for floating point formats. * Not using these functions saves 27kB of code. */ extern int printf(const char *format, ...) __attribute__ ((deprecated)); extern int sprintf(char *str, const char *format, ...) __attribute__ ((deprecated)); extern int snprintf(char *str, size_t size, const char *format, ...) __attribute__ ((deprecated)); int vprintf(const char *format, va_list ap) __attribute__ ((deprecated)); int vfprintf(FILE *stream, const char *format, va_list ap) __attribute__ ((deprecated)); int vsprintf(char *str, const char *format, va_list ap) __attribute__ ((deprecated)); int vsnprintf(char *str, size_t size, const char *format, va_list ap) __attribute__ ((deprecated)); int scanf(const char *format, ...) __attribute__ ((deprecated)); int fscanf(FILE *stream, const char *format, ...) __attribute__ ((deprecated)); int sscanf(const char *str, const char *format, ...) __attribute__ ((deprecated)); int vscanf(const char *format, va_list ap) __attribute__ ((deprecated)); int vsscanf(const char *str, const char *format, va_list ap) __attribute__ ((deprecated)); int vfscanf(FILE *stream, const char *format, va_list ap) __attribute__ ((deprecated)); #endif #endif #if defined(__linux__) || defined(__APPLE__) #include #include #define sniprintf snprintf #define asiprintf asprintf #define printk printf #define siscanf sscanf #define WL_ASSERT(x) assert(x) #define WL_DEBUG(args...) printf(args) #ifdef NO_LWIP /* IP address representation from lwIP */ struct ip_addr { uint32_t addr; } PACKED; #endif #define FEAT_SOCKETS #else #define WL_ASSERT(cond) do { \ if (!(cond)) { \ printk("%s:%d\n", __FILE__, __LINE__); \ for(;;); \ } \ } while(0) #define WL_DEBUG(args...) printk(args) #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/trace.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef TRACE_H #define TRACE_H #include #include "printf-stdarg.h" #define ASSERT(cond, str) do { \ if (!(cond)) { \ printk("%s\n", str); \ Assert(0); \ } \ } while(0) #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/util.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include const char* ip2str(struct ip_addr addr) { static char buf[16]; #if BYTE_ORDER == LITTLE_ENDIAN sniprintf(buf, sizeof(buf), "%lu.%lu.%lu.%lu", addr.addr & 0xff, (addr.addr >> 8) & 0xff, (addr.addr >> 16) & 0xff, (addr.addr >> 24) & 0xff); return buf; #else sniprintf(buf, sizeof(buf), "%lu.%lu.%lu.%lu", (addr.addr >> 24) & 0xff, (addr.addr >> 16) & 0xff, (addr.addr >> 8) & 0xff, (addr.addr) & 0xff); return buf; #endif } struct ip_addr str2ip(const char* str) { int a,b,c,d; uint32_t ip = 0; struct ip_addr addr; if (siscanf(str,"%d.%d.%d.%d",&a,&b,&c,&d) != 4) goto out; if (a < 0 || a > 255 || b < 0 || b > 255 || c < 0 || c > 255 || d < 0 || d > 255) { goto out; } #if BYTE_ORDER == LITTLE_ENDIAN ip = (d << 24) | (c << 16) | (b << 8) | a; #else ip = (a << 24) | (b << 16) | (c << 8) | d; #endif out: addr.addr = ip; return addr; } uint8_t ascii_to_key(char *outp, const char *inp) { char buf[3]; int len; buf[2] = '\0'; len = strlen(inp); if (len % 2) { printk("Invalid length\n"); } len = 0; while (*inp) { if (! isxdigit(*inp) || ! isxdigit(*(inp+1)) || len > WL_MAX_PASS_LEN) { return 0; } buf[0] = *inp++; buf[1] = *inp++; *outp++ = strtol(buf, NULL, 16); len++; } return len; } void printbuf(const char *prefix, const void *data, size_t len) { const unsigned char *s = data; int i, j; for (i = 0; i < len; i += 16) { printk("%s ", prefix); for(j = 0; j < 16; j++) { if(i + j >= len) printk(" "); else printk("%02X ", (uint16_t)s[i + j]); } printk(": "); for(j = 0; j < 16; j++) { if(i + j >= len) break; if(s[i+j] >= 32 && s[i+j] < 127) printk("%c", s[i + j]); else printk("."); } printk("\n"); } } void print_network(struct wl_network_t* wl_network) { printk("%s ", mac2str(wl_network->bssid.octet)); printk("\"%s\"", ssid2str(&wl_network->ssid)); printk(" RSSI %d dBm ", wl_network->rssi); switch(wl_network->net_type) { case WL_CONN_TYPE_ADHOC: printk(" Ad-Hoc "); break; default : break; } switch (wl_network->enc_type) { case ENC_TYPE_WEP : printk(" (WEP encryption)"); break; case ENC_TYPE_TKIP : printk(" (TKIP encryption)"); break; case ENC_TYPE_CCMP : printk(" (CCMP encryption)"); break; case ENC_TYPE_NONE : break; } printk("\n"); } void print_network_list(void) { struct wl_network_list_t* wl_network_list; uint8_t i; wl_get_network_list(&wl_network_list); if (wl_network_list->cnt == 0) printk("no nets found\n"); for (i = 0; i < wl_network_list->cnt; i++) print_network(wl_network_list->net[i]); } int join_argv(char *dst, size_t dst_len, int argc, char* argv[]) { char *p = dst; int i; int len = 0; /* Not really kosher, an ssid may legally contain 0-bytes but * the console interface does not deal with that. */ for (i = 0; i < argc; i++) { len += strlen(argv[i]); if (len > dst_len) { printk("ssid too long (max %d)\n", (int) dst_len); return 0; } p += sniprintf(p, dst_len - (p - dst), "%s ", argv[i]); } if (p == dst) { return 0; } p--; *p = '\0'; /* Delete last space */ return p - dst; } const char* ssid2str(struct wl_ssid_t *ssid) { static char buf[WL_SSID_MAX_LENGTH + 1]; memset(buf, 0, sizeof buf); memcpy(buf, ssid->ssid, ssid->len); return buf; } const char* mac2str(uint8_t* mac) { static char buf[18]; sniprintf(buf, sizeof(buf), "%02x-%02x-%02x-%02x-%02x-%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); return buf; } char* enc_type2str(enum wl_enc_type enc_type) { switch(enc_type) { case ENC_TYPE_WEP: return "WEP"; case ENC_TYPE_CCMP: return "CCMP"; case ENC_TYPE_TKIP: return "TKIP"; default: return ""; }; } int equal_ssid(const struct wl_ssid_t* ssid1, const struct wl_ssid_t* ssid2) { if (ssid1->len == ssid2->len && (memcmp(ssid1->ssid, ssid2->ssid, ssid1->len) == 0)) { return 1; } return 0; } int equal_bssid(const struct wl_mac_addr_t* bssid1, const struct wl_mac_addr_t* bssid2) { if (memcmp(bssid1, bssid2, sizeof *bssid1) == 0) { return 1; } return 0; } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/util.h ================================================ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _UTIL_H #define _UTIL_H #include #include #include #include "lwip/ip.h" #include const char* ip2str(struct ip_addr addr); struct ip_addr str2ip(const char* str); uint8_t ascii_to_key(char *outp, const char *inp); void print_network(struct wl_network_t* wl_network); void print_network_list(void); int join_argv(char *dst, size_t dst_len, int argc, char* argv[]); void printbuf(const char *prefix, const void *data, size_t len); const char* ssid2str(struct wl_ssid_t *ssid); const char* mac2str(uint8_t mac[6]); char* enc_type2str(enum wl_enc_type enc_type); int equal_ssid(const struct wl_ssid_t* ssid1, const struct wl_ssid_t* ssid2); int equal_bssid(const struct wl_mac_addr_t* bssid1, const struct wl_mac_addr_t* bssid2); #define NET_SET_SSID(net, xssid, ssid_len) do { \ DE_MEMCPY((net)->ssid.ssid, (xssid), (ssid_len)); \ (net)->ssid.len = (ssid_len); \ } while (0) #define NET_SET_BSSID(net, xbssid) do { \ DE_MEMCPY(&(net)->bssid, &(xbssid), sizeof (xbssid)); \ } while (0) #endif /* _UTIL_H */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/wifi_spi.h ================================================ /* * wifi_spi.h * * Created on: Jul 4, 2010 * Author: mlf by Metodo2 srl */ #ifndef WiFi_Spi_h #define WiFi_Spi_h #include "wl_definitions.h" #define CMD_FLAG 0 #define REPLY_FLAG 1<<7 #define DATA_FLAG 0x40 #define WIFI_SPI_ACK 1 #define WIFI_SPI_ERR 0xFF #define TIMEOUT_CHAR 1000 //#define MAX_SOCK_NUM 4 /**< Maxmium number of socket */ #define NO_SOCKET_AVAIL 255 #define START_CMD 0xE0 #define END_CMD 0xEE #define ERR_CMD 0xEF #define CMD_POS 1 // Position of Command OpCode on SPI stream #define PARAM_LEN_POS 2 // Position of Param len on SPI stream enum { SET_NET_CMD = 0x10, SET_PASSPHRASE_CMD = 0x11, SET_KEY_CMD = 0x12, TEST_CMD = 0x13, SET_IP_CONFIG_CMD = 0x14, SET_DNS_CONFIG_CMD = 0x15, GET_CONN_STATUS_CMD = 0x20, GET_IPADDR_CMD = 0x21, GET_MACADDR_CMD = 0x22, GET_CURR_SSID_CMD = 0x23, GET_CURR_BSSID_CMD = 0x24, GET_CURR_RSSI_CMD = 0x25, GET_CURR_ENCT_CMD = 0x26, SCAN_NETWORKS = 0x27, START_SERVER_TCP_CMD= 0x28, GET_STATE_TCP_CMD = 0x29, DATA_SENT_TCP_CMD = 0x2A, AVAIL_DATA_TCP_CMD = 0x2B, GET_DATA_TCP_CMD = 0x2C, START_CLIENT_TCP_CMD= 0x2D, STOP_CLIENT_TCP_CMD = 0x2E, GET_CLIENT_STATE_TCP_CMD = 0x2F, DISCONNECT_CMD = 0x30, GET_IDX_SSID_CMD = 0x31, GET_IDX_RSSI_CMD = 0x32, GET_IDX_ENCT_CMD = 0x33, REQ_HOST_BY_NAME_CMD= 0x34, GET_HOST_BY_NAME_CMD= 0x35, START_SCAN_NETWORKS = 0x36, GET_FW_VERSION_CMD = 0x37, GET_TEST_CMD = 0x38, SEND_DATA_UDP_CMD = 0x39, GET_REMOTE_DATA_CMD = 0x3A, // All command with DATA_FLAG 0x40 send a 16bit Len SEND_DATA_TCP_CMD = 0x44, GET_DATABUF_TCP_CMD = 0x45, INSERT_DATABUF_CMD = 0x46, }; #if 0 enum wl_tcp_state { CLOSED = 0, LISTEN = 1, SYN_SENT = 2, SYN_RCVD = 3, ESTABLISHED = 4, FIN_WAIT_1 = 5, FIN_WAIT_2 = 6, CLOSE_WAIT = 7, CLOSING = 8, LAST_ACK = 9, TIME_WAIT = 10 }; #endif enum numParams{ PARAM_NUMS_0, PARAM_NUMS_1, PARAM_NUMS_2, PARAM_NUMS_3, PARAM_NUMS_4, PARAM_NUMS_5, MAX_PARAM_NUMS }; #define MAX_PARAMS MAX_PARAM_NUMS-1 #define PARAM_LEN_SIZE 1 typedef struct __attribute__((__packed__)) { uint8_t paramLen; char* param; }tParam; typedef struct __attribute__((__packed__)) { uint16_t dataLen; char* data; }tDataParam; typedef struct __attribute__((__packed__)) { unsigned char cmd; unsigned char tcmd; unsigned char nParam; tParam params[MAX_PARAMS]; }tSpiMsg; typedef struct __attribute__((__packed__)) { unsigned char cmd; unsigned char tcmd; unsigned char nParam; tDataParam params[MAX_PARAMS]; }tSpiMsgData; typedef struct __attribute__((__packed__)) { unsigned char cmd; unsigned char tcmd; //unsigned char totLen; unsigned char nParam; }tSpiHdr; typedef struct __attribute__((__packed__)) { uint8_t paramLen; uint32_t param; }tLongParam; typedef struct __attribute__((__packed__)) { uint8_t paramLen; uint16_t param; }tIntParam; typedef struct __attribute__((__packed__)) { uint8_t paramLen; uint8_t param; }tByteParam; #endif uint8_t param; ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/wl_cm.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "wl_cm.h" #include "util.h" #include #include "debug.h" /** Roaming configuration parameters **/ /*! The ROAMING_RSSI_THRESHOLD setting defines how bad the current * signal strength should be before we'll consider roaming to an AP * with better signal strength. The objective is to stay on the * current AP as long as the RSSI is decent, even if there are other * APs in the same BSS with better RSSI available. * If ROAMING_RSSI_THRESHOLD is too high we might roam unecessarily. * If ROAMING_RSSI_THRESHOLD is too low we might not roam in time to * avoid packet loss. This also impacts power consumption, staying * too long with an AP with poor RSSI will consume more power. * Unit is dBm. */ #define ROAMING_RSSI_THRESHOLD -65 /*! The ROAMING_RSSI_DIFF setting defines how much better * than the currently associated AP a new AP must be before * we'll attempt to roam over to the new AP. * If ROAMING_RSSI_DIFF is too high it might be too hard * to roam (important if the STA is expected to move * quickly through different AP coverage areas). * If ROAMING_RSSI_DIFF is too low we might bounce between * two APs with similar signal strengths. * Unit is dBm. */ #define ROAMING_RSSI_DIFF 10 # include "printf-stdarg.h" #include "ard_utils.h" #include "debug.h" /** \defgroup wl_cm Connection Manager * * These functions are used to configure and control the WiFi connetion * manager. * * * @{ */ struct cm_candidate { struct wl_ssid_t ssid; struct wl_mac_addr_t bssid; }; struct cm { cm_scan_cb_t *scan_cb; cm_conn_cb_t *conn_cb; cm_disconn_cb_t *disconn_cb; void* ctx; uint8_t enabled; struct cm_candidate candidate; }; /** * This function can be modified to pick a network based on * application specific criteria. * * If the SSID can not be found in the scan list it will be * assumed to be a hidden SSID and the wl_connect() command * will be called to attempt to probe for the network and * connect to it. */ static struct wl_network_t* find_best_candidate(struct cm* cm) { struct wl_network_list_t* netlist; struct wl_network_t *best_net = NULL; uint8_t i; if (wl_get_network_list(&netlist) != WL_SUCCESS) return NULL; if (netlist->cnt == 0) return NULL; for (i = 0; i < netlist->cnt; i++) { /* match on ssid */ if (cm->candidate.ssid.len) if (!equal_ssid(&cm->candidate.ssid, &netlist->net[i]->ssid)) continue; /* match bssid */ if (strncmp((char*) cm->candidate.bssid.octet, "\xff\xff\xff\xff\xff\xff", 6)) if (!equal_bssid(&cm->candidate.bssid, &netlist->net[i]->bssid)) continue; /* check for best rssi. */ if ( best_net && ( best_net->rssi > netlist->net[i]->rssi) ) { continue; } best_net = netlist->net[i]; } return best_net; } /** * */ static void select_net(struct cm* cm) { struct wl_network_t *candidate_net; struct wl_network_t *current_net; struct wl_ssid_t *ssid_p; int ret; /* Nothing to do */ if (0 == cm->candidate.ssid.len) { return; } current_net = wl_get_current_network(); candidate_net = find_best_candidate(cm); /* Connected to the candidate? ... */ if ( current_net == candidate_net ) { if ( current_net ) { /* ...yes, dont change. */ return; } } /* Roaming checks */ if (current_net && candidate_net) { /* Are we changing BSSs? */ if ( equal_ssid(&candidate_net->ssid, ¤t_net->ssid)) { /* ...no. Does the currently connected * net have a decent RSSI?...*/ if ( current_net->rssi > ROAMING_RSSI_THRESHOLD ) { /* ...yes, stay with it. */ return; } /* ...no. Does the candidate have * sufficiently better RSSI to * motivate a switch to it? */ if ( candidate_net->rssi < current_net->rssi + ROAMING_RSSI_DIFF) { return; } /* ...yes, try to roam to candidate_net */ CM_DPRINTF("CM: Roaming from rssi %d to %d\n", current_net->rssi, candidate_net->rssi); } } /* a candidate is found */ if (candidate_net) { /* We connect to a specific bssid here because * find_best_candidate() might have picked a * particulare AP among many with the same SSID. * wl_connect() would pick one of them at random. */ ret = wl_connect_bssid(candidate_net->bssid); } /* no candidate found */ else { CM_DPRINTF("CM: No candidate found for ssid \"%s\"\n", ssid2str(&cm->candidate.ssid)); /* Might be a hidden SSID so we try to connect to it. * wl_connect() will trigger a directed scan * for the SSID in this case. */ ssid_p = &cm->candidate.ssid; ret = wl_connect(ssid_p->ssid, ssid_p->len); } switch (ret) { case WL_SUCCESS : return; case WL_BUSY: wl_disconnect(); return; case WL_RETRY: break; default : CM_DPRINTF("CM: failed to connect\n"); break; } /* some operation failed or no candidate found */ if (wl_scan() != WL_SUCCESS) CM_DPRINTF("CM: failed to scan\n"); } /** * */ static void wl_scan_complete_cb(void* ctx) { struct cm *cm = ctx; CM_DPRINTF("CM: scan completed\n"); if (cm->scan_cb) cm->scan_cb(cm->ctx); if ( 0 == cm->enabled ) { return; } select_net(cm); } /** * */ static void wl_media_connected_cb(void* ctx) { struct cm *cm = ctx; struct wl_network_t *net = wl_get_current_network(); CM_DPRINTF("CM: connected to %s\n", ssid2str(&net->ssid)); LINK_LED_ON(); ERROR_LED_OFF(); if (cm->conn_cb) cm->conn_cb(net, cm->ctx); } /** * */ static void wl_conn_failure_cb(void* ctx) { struct cm *cm = ctx; CM_DPRINTF("CM: connect failed, scanning\n"); ERROR_LED_ON(); LINK_LED_OFF(); if ( 0 == cm->enabled ) { return; } if (wl_scan() != WL_SUCCESS) /* should never happen */ CM_DPRINTF("CM: could not start scan after connect fail!\n"); } /** * */ static void wl_conn_lost_cb(void* ctx) { struct cm *cm = ctx; CM_DPRINTF("CM: connection lost, scanning\n"); LINK_LED_OFF(); if (cm->disconn_cb) cm->disconn_cb(cm->ctx); if ( 0 == cm->enabled ) { return; } if (wl_scan() != WL_SUCCESS) /* should never happen */ CM_DPRINTF("CM: could not start scan after connect lost!\n"); } /** * */ static void wl_event_cb(struct wl_event_t event, void* ctx) { struct cm *cm = ctx; switch (event.id) { case WL_EVENT_MEDIA_CONNECTED: wl_media_connected_cb(cm); break; case WL_EVENT_CONN_FAILURE: wl_conn_failure_cb(cm); break; case WL_EVENT_MEDIA_DISCONNECTED: CM_DPRINTF("CM: disconnected\n"); wl_conn_lost_cb(cm); break; case WL_EVENT_SCAN_COMPLETE: wl_scan_complete_cb(cm); break; default: CM_DPRINTF("CM: unhandled event\n"); }; } static struct cm *cm = NULL; /** * Doesn't actually start the CM, just initializing. CM will run whenever * an valid ssid is set through wl_cm_set_network() and wl_cm_start() * has been called. */ wl_err_t wl_cm_init(cm_scan_cb_t scan_cb, cm_conn_cb_t conn_cb, cm_disconn_cb_t disconn_cb, void* ctx) { if (cm != NULL) return WL_FAILURE; cm = calloc(1, sizeof(struct cm)); if (cm == NULL) { CM_DPRINTF("CM: out of memory\n"); return WL_FAILURE; } if (wl_register_event_cb(wl_event_cb, cm) != WL_SUCCESS) { CM_DPRINTF("CM: could not register event cb\n"); return WL_FAILURE; } cm->scan_cb = scan_cb; cm->conn_cb = conn_cb; cm->disconn_cb = disconn_cb; cm->enabled = 0; cm->ctx = ctx; CM_DPRINTF("CM: initialized\n"); return WL_SUCCESS; } wl_err_t wl_cm_start(void) { if (NULL == cm) return WL_FAILURE; cm->enabled = 1; return WL_SUCCESS; } wl_err_t wl_cm_stop(void) { if (NULL == cm) return WL_FAILURE; cm->enabled = 0; return WL_SUCCESS; } /** * Set the desired network which the connection manager should try to * connect to. * * The ssid and bssid of the desired network should be specified. The ssid and * bssid will be matched against the networks found during scan. If any * parameter is null, it will always match. If both parameters are null, * the first found network will be chosen. * * @param ssid The ssid of the desired network. If null, any ssid will match. * @param bssid The bssid of the desired network. If null, any bssid will match. * */ wl_err_t wl_cm_set_network(struct wl_ssid_t *ssid, struct wl_mac_addr_t *bssid) { if (cm == NULL) return WL_FAILURE; if (ssid) memcpy(&cm->candidate.ssid, ssid, sizeof(cm->candidate.ssid)); else cm->candidate.ssid.len = 0; if (bssid) memcpy(&cm->candidate.bssid, bssid, sizeof(cm->candidate.bssid)); else memset(&cm->candidate.bssid, 0xff, sizeof(cm->candidate.bssid)); if (cm->candidate.ssid.len) wl_scan(); return WL_SUCCESS; } /* * @} */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/wl_cm.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef WL_CM_H #define WL_CM_H #include #include #include typedef void (cm_scan_cb_t)(void* ctx); typedef void (cm_conn_cb_t)(struct wl_network_t *net, void* ctx); typedef void (cm_disconn_cb_t)(void* ctx); wl_err_t wl_cm_set_network(struct wl_ssid_t *ssid, struct wl_mac_addr_t *bssid); wl_err_t wl_cm_init(cm_scan_cb_t scan_cb, cm_conn_cb_t conn_cb, cm_disconn_cb_t disconn_cb, void* ctx); wl_err_t wl_cm_start(void); wl_err_t wl_cm_stop(void); #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/src/wl_definitions.h ================================================ /* * wl_definitions.h * * Created on: Mar 6, 2011 * Author: mlf by Metodo2 srl */ #ifndef WL_DEFINITIONS_H_ #define WL_DEFINITIONS_H_ // Maximum size of a SSID #define WL_SSID_MAX_LENGTH 32 // Length of passphrase. Valid lengths are 8-63. #define WL_WPA_KEY_MAX_LENGTH 63 // Length of key in bytes. Valid values are 5 and 13. #define WL_WEP_KEY_MAX_LENGTH 13 // Size of a MAC-address or BSSID #define WL_MAC_ADDR_LENGTH 6 // Size of a MAC-address or BSSID #define WL_IPV4_LENGTH 4 // Maximum size of a SSID list #define WL_NETWORKS_LIST_MAXNUM 10 // Maxmium number of socket #define MAX_SOCK_NUM 4 //Maximum number of attempts to establish wifi connection #define WL_MAX_ATTEMPT_CONNECTION 10 typedef enum { WL_IDLE_STATUS, WL_NO_SSID_AVAIL, WL_SCAN_COMPLETED, WL_CONNECTED, WL_CONNECT_FAILED, WL_CONNECTION_LOST, WL_DISCONNECTED } wl_status_t; #endif /* WL_DEFINITIONS_H_ */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifiHD/wifiHD.cproj ================================================  2.0 6.0 com.Atmel.AVRGCC32 417e15db-488a-4b56-8d4e-fbe832b2b649 wifiHD AT32uc3a1256 none Importer Executable C wifiHD .elf $(MSBuildProjectDirectory)\$(Configuration) Native com.atmel.avrdbg.tool.jtagicemk3 true JTAG com.atmel.avrdbg.tool.jtagicemk3 JTAGICE3 J30200003078 true false 127.0.0.1 51999 False JTAG 250000 1000000 150000 false false 0 0 0 0 3.5.0 false 0 True True True True BOARD=ARDUINO WITH_KEY WITH_WPA WITH_NO_DMA DATAFLASH=1 _INFO_DEBUG_=1 ../src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA ../src/SOFTWARE_FRAMEWORK/DRIVERS/TC ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC ../src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG ../src/SOFTWARE_FRAMEWORK/SERVICES/DELAY ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI ../src/SOFTWARE_FRAMEWORK/DRIVERS/RTC ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO ../src/SOFTWARE_FRAMEWORK/DRIVERS/EIC ../src/CONFIG ../src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR ../src/SOFTWARE_FRAMEWORK/UTILS ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC ../src/SOFTWARE_FRAMEWORK/BOARDS ../src ../src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include ../src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4 ../src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include ../src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD Optimize for size (-Os) -fdata-sections -ffunction-sections True True True True -c -fmessage-length=0 True newlib_addons-at32ucr2-speed_opt _ucr2_hd_spi_v2.7.0 _ucr2_hd_wl_sta_intwpa_v2.7.0 ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS ../src/SOFTWARE_FRAMEWORK/BOARDS ../src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR2/GCC True True True -Wl,--gc-sections -Wl,-e,_trampoline -T../src/SOFTWARE_FRAMEWORK/UTILS/LINKER_SCRIPTS/AT32UC3A/1256/GCC/link_uc3a1256.lds ../src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA ../src/SOFTWARE_FRAMEWORK/DRIVERS/TC ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC ../src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG ../src/SOFTWARE_FRAMEWORK/SERVICES/DELAY ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI ../src/SOFTWARE_FRAMEWORK/DRIVERS/RTC ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO ../src/SOFTWARE_FRAMEWORK/DRIVERS/EIC ../src/CONFIG ../src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR ../src/SOFTWARE_FRAMEWORK/UTILS ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC ../src/SOFTWARE_FRAMEWORK/BOARDS -Wa,-g ../src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA ../src/SOFTWARE_FRAMEWORK/DRIVERS/TC ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC ../src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG ../src/SOFTWARE_FRAMEWORK/SERVICES/DELAY ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI ../src/SOFTWARE_FRAMEWORK/DRIVERS/RTC ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO ../src/SOFTWARE_FRAMEWORK/DRIVERS/EIC ../src/CONFIG ../src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR ../src/SOFTWARE_FRAMEWORK/UTILS ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC ../src/SOFTWARE_FRAMEWORK/BOARDS True True True True false false BOARD=ARDUINO NO_SYS _DEBUG_ _ASSERT_ENABLE_ WITH_KEY WITH_WPA WITH_NO_DMA DATAFLASH=1 _INFO_DEBUG_=1 ../src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA ../src/SOFTWARE_FRAMEWORK/DRIVERS/TC ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC ../src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG ../src/SOFTWARE_FRAMEWORK/SERVICES/DELAY ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI ../src/SOFTWARE_FRAMEWORK/DRIVERS/RTC ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO ../src/SOFTWARE_FRAMEWORK/DRIVERS/EIC ../src/CONFIG ../src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR ../src/SOFTWARE_FRAMEWORK/UTILS ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC ../src/SOFTWARE_FRAMEWORK/BOARDS ../src ../src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include ../src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4 ../src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include ../src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD Optimize (-O1) -fdata-sections -ffunction-sections true false false false false true true false false false Maximum (-g3) false false true false false false false -c -fmessage-length=0 false true false false false false newlib_addons-at32ucr2-speed_opt _ucr2_hd_spi_v2.7.0 _ucr2_hd_wl_sta_intwpa_v2.7.0 ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS ../src/SOFTWARE_FRAMEWORK/BOARDS ../src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR2/GCC true false false false false true true ../src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA ../src/SOFTWARE_FRAMEWORK/DRIVERS/TC ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC ../src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG ../src/SOFTWARE_FRAMEWORK/SERVICES/DELAY ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI ../src/SOFTWARE_FRAMEWORK/DRIVERS/RTC ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO ../src/SOFTWARE_FRAMEWORK/DRIVERS/EIC ../src/CONFIG ../src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR ../src/SOFTWARE_FRAMEWORK/UTILS ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC ../src/SOFTWARE_FRAMEWORK/BOARDS false Default (-g) -Wa,-g ../src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA ../src/SOFTWARE_FRAMEWORK/DRIVERS/TC ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC ../src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG ../src/SOFTWARE_FRAMEWORK/SERVICES/DELAY ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI ../src/SOFTWARE_FRAMEWORK/DRIVERS/RTC ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO ../src/SOFTWARE_FRAMEWORK/DRIVERS/EIC ../src/CONFIG ../src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR ../src/SOFTWARE_FRAMEWORK/UTILS ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC ../src/SOFTWARE_FRAMEWORK/BOARDS false false Default (-Wa,-g) bin\Debug_512\ True True True True false false BOARD=ARDUINO _APP_DEBUG_ _DEBUG_ _ASSERT_ENABLE_ EXT_BOARD=SPB104 WITH_KEY WITH_WPA WITH_NO_DMA LWIP_DEBUG _INFO_DEBUG_=1 ../src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA ../src/SOFTWARE_FRAMEWORK/DRIVERS/TC ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC ../src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG ../src/SOFTWARE_FRAMEWORK/SERVICES/DELAY ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI ../src/SOFTWARE_FRAMEWORK/DRIVERS/RTC ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO ../src/SOFTWARE_FRAMEWORK/DRIVERS/EIC ../src/CONFIG ../src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR ../src/SOFTWARE_FRAMEWORK/UTILS ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC ../src/SOFTWARE_FRAMEWORK/BOARDS ../src ../src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include ../src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4 ../src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include ../src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD Optimize (-O1) -fdata-sections true false false false false true false false false false Maximum (-g3) false false true false false false false -c -fmessage-length=0 false true false false false false newlib_addons-at32ucr2-speed_opt _ucr2_hd_spi_standalone_v2.1.1 _ucr2_hd_wl_standalone_v2.1.1 ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS ../src/SOFTWARE_FRAMEWORK/BOARDS ../src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.1.1/UCR2/GCC true false false false false true true ../src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA ../src/SOFTWARE_FRAMEWORK/DRIVERS/TC ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC ../src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG ../src/SOFTWARE_FRAMEWORK/SERVICES/DELAY ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI ../src/SOFTWARE_FRAMEWORK/DRIVERS/RTC ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO ../src/SOFTWARE_FRAMEWORK/DRIVERS/EIC ../src/CONFIG ../src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR ../src/SOFTWARE_FRAMEWORK/UTILS ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC ../src/SOFTWARE_FRAMEWORK/BOARDS false Default (-g) -Wa,-g ../src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA ../src/SOFTWARE_FRAMEWORK/DRIVERS/TC ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC ../src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG ../src/SOFTWARE_FRAMEWORK/SERVICES/DELAY ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI ../src/SOFTWARE_FRAMEWORK/DRIVERS/RTC ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO ../src/SOFTWARE_FRAMEWORK/DRIVERS/EIC ../src/CONFIG ../src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR ../src/SOFTWARE_FRAMEWORK/UTILS ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC ../src/SOFTWARE_FRAMEWORK/BOARDS false false Default (-Wa,-g) bin\Release_512\ True True True True false false BOARD=ARDUINO _ASSERT_ENABLE_ EXT_BOARD=SPB104 WITH_KEY WITH_WPA WITH_NO_DMA LWIP_DEBUG _INFO_DEBUG_=1 ../src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA ../src/SOFTWARE_FRAMEWORK/DRIVERS/TC ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC ../src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG ../src/SOFTWARE_FRAMEWORK/SERVICES/DELAY ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI ../src/SOFTWARE_FRAMEWORK/DRIVERS/RTC ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO ../src/SOFTWARE_FRAMEWORK/DRIVERS/EIC ../src/CONFIG ../src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR ../src/SOFTWARE_FRAMEWORK/UTILS ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC ../src/SOFTWARE_FRAMEWORK/BOARDS ../src ../src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include ../src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4 ../src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include ../src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD -fdata-sections true false false false false true false false false false false false true false false false false -c -fmessage-length=0 false true false false false false newlib_addons-at32ucr2-speed_opt _ucr2_hd_spi_standalone_v2.1.1 _ucr2_hd_wl_standalone_v2.1.1 ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS ../src/SOFTWARE_FRAMEWORK/BOARDS ../src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.1.1/UCR2/GCC true false false false false true true ../src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA ../src/SOFTWARE_FRAMEWORK/DRIVERS/TC ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC ../src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG ../src/SOFTWARE_FRAMEWORK/SERVICES/DELAY ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI ../src/SOFTWARE_FRAMEWORK/DRIVERS/RTC ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO ../src/SOFTWARE_FRAMEWORK/DRIVERS/EIC ../src/CONFIG ../src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR ../src/SOFTWARE_FRAMEWORK/UTILS ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC ../src/SOFTWARE_FRAMEWORK/BOARDS false -Wa,-g ../src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA ../src/SOFTWARE_FRAMEWORK/DRIVERS/TC ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC ../src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG ../src/SOFTWARE_FRAMEWORK/SERVICES/DELAY ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI ../src/SOFTWARE_FRAMEWORK/DRIVERS/RTC ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO ../src/SOFTWARE_FRAMEWORK/DRIVERS/EIC ../src/CONFIG ../src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR ../src/SOFTWARE_FRAMEWORK/UTILS ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC ../src/SOFTWARE_FRAMEWORK/BOARDS false false compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/.cproject ================================================ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/.project ================================================ wifi_dnld org.eclipse.cdt.managedbuilder.core.genmakebuilder clean,full,incremental, ?name? org.eclipse.cdt.make.core.append_environment true org.eclipse.cdt.make.core.buildArguments org.eclipse.cdt.make.core.buildCommand make org.eclipse.cdt.make.core.buildLocation ${workspace_loc:/wifi_dnld/Debug} org.eclipse.cdt.make.core.contents org.eclipse.cdt.make.core.activeConfigSettings org.eclipse.cdt.make.core.enableAutoBuild false org.eclipse.cdt.make.core.enableCleanBuild true org.eclipse.cdt.make.core.enableFullBuild true org.eclipse.cdt.make.core.stopOnError true org.eclipse.cdt.make.core.useDefaultBuildCmd true org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder com.atmel.avr32.core.nature org.eclipse.cdt.core.cnature org.eclipse.cdt.managedbuilder.core.managedBuildNature org.eclipse.cdt.managedbuilder.core.ScannerConfigNature ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/CONFIG/conf_access.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Memory access control configuration file. * * This file contains the possible external configuration of the memory access * control. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _CONF_ACCESS_H_ #define _CONF_ACCESS_H_ #include "compiler.h" #include "board.h" /*! \name Activation of Logical Unit Numbers */ //! @{ #define LUN_0 DISABLE //!< On-Chip Virtual Memory. #define LUN_1 ENABLE //!< AT45DBX Data Flash. #define LUN_2 DISABLE //!< SD/MMC Card over SPI. #define LUN_3 DISABLE #define LUN_4 DISABLE #define LUN_5 DISABLE #define LUN_6 DISABLE #define LUN_7 DISABLE #define LUN_USB DISABLE //!< Host Mass-Storage Memory. //! @} /*! \name LUN 0 Definitions */ //! @{ #define VIRTUAL_MEM LUN_0 #define LUN_ID_VIRTUAL_MEM LUN_ID_0 #define LUN_0_INCLUDE "virtual_mem.h" #define Lun_0_test_unit_ready virtual_test_unit_ready #define Lun_0_read_capacity virtual_read_capacity #define Lun_0_wr_protect virtual_wr_protect #define Lun_0_removal virtual_removal #define Lun_0_usb_read_10 virtual_usb_read_10 #define Lun_0_usb_write_10 virtual_usb_write_10 #define Lun_0_mem_2_ram virtual_mem_2_ram #define Lun_0_ram_2_mem virtual_ram_2_mem #define LUN_0_NAME "\"On-Chip Virtual Memory\"" //! @} /*! \name LUN 1 Definitions */ //! @{ #define AT45DBX_MEM LUN_1 #define LUN_ID_AT45DBX_MEM LUN_ID_1 #define LUN_1_INCLUDE "at45dbx_mem.h" #define Lun_1_test_unit_ready at45dbx_test_unit_ready #define Lun_1_read_capacity at45dbx_read_capacity #define Lun_1_wr_protect at45dbx_wr_protect #define Lun_1_removal at45dbx_removal #define Lun_1_usb_read_10 at45dbx_usb_read_10 #define Lun_1_usb_write_10 at45dbx_usb_write_10 #define Lun_1_mem_2_ram at45dbx_df_2_ram #define Lun_1_ram_2_mem at45dbx_ram_2_df #define LUN_1_NAME "\"AT45DBX Data Flash\"" //! @} /*! \name LUN 2 Definitions */ //! @{ #define SD_MMC_SPI_MEM LUN_2 #define LUN_ID_SD_MMC_SPI_MEM LUN_ID_2 #define LUN_2_INCLUDE "sd_mmc_spi_mem.h" #define Lun_2_test_unit_ready sd_mmc_spi_test_unit_ready #define Lun_2_read_capacity sd_mmc_spi_read_capacity #define Lun_2_wr_protect sd_mmc_spi_wr_protect #define Lun_2_removal sd_mmc_spi_removal #define Lun_2_usb_read_10 sd_mmc_spi_usb_read_10 #define Lun_2_usb_write_10 sd_mmc_spi_usb_write_10 #define Lun_2_mem_2_ram sd_mmc_spi_mem_2_ram #define Lun_2_ram_2_mem sd_mmc_spi_ram_2_mem #define LUN_2_NAME "\"SD/MMC Card over SPI\"" //! @} /*! \name USB LUNs Definitions */ //! @{ #define MEM_USB LUN_USB #define LUN_ID_MEM_USB LUN_ID_USB #define LUN_USB_INCLUDE "host_mem.h" #define Lun_usb_test_unit_ready(lun) host_test_unit_ready(lun) #define Lun_usb_read_capacity(lun, nb_sect) host_read_capacity(lun, nb_sect) #define Lun_usb_read_sector_size(lun) host_read_sector_size(lun) #define Lun_usb_wr_protect(lun) host_wr_protect(lun) #define Lun_usb_removal() host_removal() #define Lun_usb_mem_2_ram(addr, ram) host_read_10_ram(addr, ram) #define Lun_usb_ram_2_mem(addr, ram) host_write_10_ram(addr, ram) #define LUN_USB_NAME "\"Host Mass-Storage Memory\"" //! @} /*! \name Actions Associated with Memory Accesses * * Write here the action to associate with each memory access. * * \warning Be careful not to waste time in order not to disturb the functions. */ //! @{ #define memory_start_read_action(nb_sectors) #define memory_stop_read_action() #define memory_start_write_action(nb_sectors) #define memory_stop_write_action() //! @} /*! \name Activation of Interface Features */ //! @{ #define ACCESS_USB DISABLED //!< MEM <-> USB interface. #define ACCESS_MEM_TO_RAM ENABLED //!< MEM <-> RAM interface. #define ACCESS_STREAM DISABLED //!< Streaming MEM <-> MEM interface. #define ACCESS_STREAM_RECORD DISABLED //!< Streaming MEM <-> MEM interface in record mode. #define ACCESS_MEM_TO_MEM DISABLED //!< MEM <-> MEM interface. #define ACCESS_CODEC DISABLED //!< Codec interface. //! @} /*! \name Specific Options for Access Control */ //! @{ #define GLOBAL_WR_PROTECT DISABLED //!< Management of a global write protection. //! @} #endif // _CONF_ACCESS_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/CONFIG/conf_at45dbx.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief AT45DBX configuration file. * * This file contains the possible external configuration of the AT45DBX. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with an SPI module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _CONF_AT45DBX_H_ #define _CONF_AT45DBX_H_ #include "conf_access.h" #if AT45DBX_MEM == DISABLE #error conf_at45dbx.h is #included although AT45DBX_MEM is disabled #endif #include "at45dbx.h" //_____ D E F I N I T I O N S ______________________________________________ //! Size of AT45DBX data flash memories to manage. #define AT45DBX_MEM_SIZE AT45DBX_1MB //! Number of AT45DBX components to manage. #define AT45DBX_MEM_CNT 1 //! First chip select used by AT45DBX components on the SPI module instance. //! AT45DBX_SPI_NPCS0_PIN always corresponds to this first NPCS, whatever it is. #define AT45DBX_SPI_FIRST_NPCS AT45DBX_SPI_NPCS //! SPI master speed in Hz. #define AT45DBX_SPI_MASTER_SPEED 12000000 //! Number of bits in each SPI transfer. #define AT45DBX_SPI_BITS 8 #endif // _CONF_AT45DBX_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/ASM/trampoline.x ================================================ /* This file is part of the ATMEL AVR32-SoftwareFramework-AT32UC3A-1.4.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief AVR32 UC3 ISP trampoline. * * In order to be able to program a project with both BatchISP and JTAGICE mkII * without having to take the general-purpose fuses into consideration, add this * file to the project and change the program entry point to _trampoline. * * The pre-programmed ISP will be erased if JTAGICE mkII is used. * * - Compiler: GNU GCC for AVR32 * - Supported devices: All AVR32UC devices can be used. * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (C) 2006-2008, Atmel Corporation All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of ATMEL may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "conf_isp.h" //! @{ //! \verbatim // This must be linked @ 0x80000000 if it is to be run upon reset. .section .reset, "ax", @progbits .global _trampoline .type _trampoline, @function _trampoline: // Jump to program start. rjmp program_start .org PROGRAM_START_OFFSET program_start: // Jump to the C runtime startup routine. lda.w pc, _stext //! \endverbatim //! @} ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/arduino.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief AT32UC3A EVK1100 board header file. * * This file contains definitions and services related to the features of the * EVK1100 board rev. B and C. * * To use this board, define BOARD=EVK1100. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 AT32UC3A devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _ARDUINO_H_ #define _ARDUINO_H_ #include "compiler.h" #ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling. # include "led.h" #endif // __AVR32_ABI_COMPILER__ /*! \name Oscillator Definitions */ //! @{ // RCOsc has no custom calibration by default. Set the following definition to // the appropriate value if a custom RCOsc calibration has been applied to your // part. //#define FRCOSC AVR32_PM_RCOSC_FREQUENCY //!< RCOsc frequency: Hz. #define FOSC32 32768 //!< Osc32 frequency: Hz. #define OSC32_STARTUP AVR32_PM_OSCCTRL32_STARTUP_8192_RCOSC //!< Osc32 startup time: RCOsc periods. #define FOSC0 12000000 //!< Osc0 frequency: Hz. #define OSC0_STARTUP AVR32_PM_OSCCTRL0_STARTUP_2048_RCOSC //!< Osc0 startup time: RCOsc periods. // Osc1 crystal is not mounted by default. Set the following definitions to the // appropriate values if a custom Osc1 crystal is mounted on your board. //#define FOSC1 12000000 //!< Osc1 frequency: Hz. //#define OSC1_STARTUP AVR32_PM_OSCCTRL1_STARTUP_2048_RCOSC //!< Osc1 startup time: RCOsc periods. //! @} //! Number of LEDs. #define LED_COUNT 3 /*! \name GPIO Connections of LEDs */ //! @{ #define LED0_GPIO AVR32_PIN_PB19 #define LED1_GPIO AVR32_PIN_PB20 #define LED2_GPIO AVR32_PIN_PB21 //! @} /*! \name PWM Channels of LEDs */ //! @{ #define LED0_PWM 0 #define LED1_PWM 1 #define LED2_PWM 2 //! @} /*! \name PWM Functions of LEDs */ //! @{ #define LED0_PWM_FUNCTION AVR32_PWM_0_FUNCTION #define LED1_PWM_FUNCTION AVR32_PWM_1_FUNCTION #define LED2_PWM_FUNCTION AVR32_PWM_2_FUNCTION //! @} /*! \name Color Identifiers of LEDs to Use with LED Functions */ //! @{ #define LED_MONO0_GREEN LED0 #define LED_MONO1_GREEN LED1 #define LED_MONO2_GREEN LED2 //! @} #if 0 /*! \name SPI Connections of the DIP204 LCD */ //! @{ #define DIP204_SPI (&AVR32_SPI1) #define DIP204_SPI_NPCS 2 #define DIP204_SPI_SCK_PIN AVR32_SPI1_SCK_0_0_PIN #define DIP204_SPI_SCK_FUNCTION AVR32_SPI1_SCK_0_0_FUNCTION #define DIP204_SPI_MISO_PIN AVR32_SPI1_MISO_0_0_PIN #define DIP204_SPI_MISO_FUNCTION AVR32_SPI1_MISO_0_0_FUNCTION #define DIP204_SPI_MOSI_PIN AVR32_SPI1_MOSI_0_0_PIN #define DIP204_SPI_MOSI_FUNCTION AVR32_SPI1_MOSI_0_0_FUNCTION #define DIP204_SPI_NPCS_PIN AVR32_SPI1_NPCS_2_0_PIN #define DIP204_SPI_NPCS_FUNCTION AVR32_SPI1_NPCS_2_0_FUNCTION //! @} /*! \name GPIO and PWM Connections of the DIP204 LCD Backlight */ //! @{ #define DIP204_BACKLIGHT_PIN AVR32_PIN_PB18 #define DIP204_PWM_CHANNEL 6 #define DIP204_PWM_PIN AVR32_PWM_6_PIN #define DIP204_PWM_FUNCTION AVR32_PWM_6_FUNCTION //! @} #endif /*! \name SPI Connections of the AT45DBX Data Flash Memory */ //! @{ #define AT45DBX_SPI (&AVR32_SPI1) #define AT45DBX_SPI_NPCS 2 #define AT45DBX_SPI_SCK_PIN AVR32_SPI1_SCK_0_0_PIN #define AT45DBX_SPI_SCK_FUNCTION AVR32_SPI1_SCK_0_0_FUNCTION #define AT45DBX_SPI_MISO_PIN AVR32_SPI1_MISO_0_0_PIN #define AT45DBX_SPI_MISO_FUNCTION AVR32_SPI1_MISO_0_0_FUNCTION #define AT45DBX_SPI_MOSI_PIN AVR32_SPI1_MOSI_0_0_PIN #define AT45DBX_SPI_MOSI_FUNCTION AVR32_SPI1_MOSI_0_0_FUNCTION #define AT45DBX_SPI_NPCS2_PIN AVR32_SPI1_NPCS_2_0_PIN #define AT45DBX_SPI_NPCS2_FUNCTION AVR32_SPI1_NPCS_2_0_FUNCTION #define AT45DBX_CHIP_RESET AVR32_PIN_PA02 //! @} /*! \name GPIO and SPI Connections of the SD/MMC Connector */ //! @{ //#define SD_MMC_CARD_DETECT_PIN AVR32_PIN_PA02 //#define SD_MMC_WRITE_PROTECT_PIN AVR32_PIN_PA07 #define SD_MMC_SPI (&AVR32_SPI1) #define SD_MMC_SPI_NPCS 1 #define SD_MMC_SPI_SCK_PIN AVR32_SPI1_SCK_0_0_PIN #define SD_MMC_SPI_SCK_FUNCTION AVR32_SPI1_SCK_0_0_FUNCTION #define SD_MMC_SPI_MISO_PIN AVR32_SPI1_MISO_0_0_PIN #define SD_MMC_SPI_MISO_FUNCTION AVR32_SPI1_MISO_0_0_FUNCTION #define SD_MMC_SPI_MOSI_PIN AVR32_SPI1_MOSI_0_0_PIN #define SD_MMC_SPI_MOSI_FUNCTION AVR32_SPI1_MOSI_0_0_FUNCTION #define SD_MMC_SPI_NPCS_PIN AVR32_SPI1_NPCS_1_0_PIN #define SD_MMC_SPI_NPCS_FUNCTION AVR32_SPI1_NPCS_1_0_FUNCTION //! @} /* Timer Counter to generate clock for WiFi chip*/ # define WIFI_TC (&AVR32_TC) # define WIFI_TC_CHANNEL_ID 0 # define WIFI_TC_CHANNEL_PIN AVR32_TC_A0_0_0_PIN # define WIFI_TC_CHANNEL_FUNCTION AVR32_TC_A0_0_0_FUNCTION // Note that TC_A0_0_0 pin is pin 6 (PB23) on AT32UC3A1512 QFP100. /* Pin related to WiFi chip communication */ #ifndef USE_POLL #define USE_POLL #endif #define SPI_CS 0 #define AVR32_SPI AVR32_SPI1 #define GPIO_IRQ_PIN AVR32_PIN_PA03 #define GPIO_IRQ AVR32_GPIO_IRQ_7 #define GPIO_W_RESET_PIN AVR32_PIN_PA07 #define GPIO_W_SHUTDOWN_PIN AVR32_PIN_PA09 /* Pin related to shield communication */ #define ARDUINO_HANDSHAKE_PIN AVR32_PIN_PA25 #define AVR32_PDCA_PID_TX AVR32_PDCA_PID_SPI1_TX #define AVR32_PDCA_PID_RX AVR32_PDCA_PID_SPI1_RX #if 0 /*! \name TWI Connections of the Spare TWI Connector */ //! @{ #define SPARE_TWI (&AVR32_TWI) #define SPARE_TWI_SCL_PIN AVR32_TWI_SCL_0_0_PIN #define SPARE_TWI_SCL_FUNCTION AVR32_TWI_SCL_0_0_FUNCTION #define SPARE_TWI_SDA_PIN AVR32_TWI_SDA_0_0_PIN #define SPARE_TWI_SDA_FUNCTION AVR32_TWI_SDA_0_0_FUNCTION //! @} /*! \name SPI Connections of the Spare SPI Connector */ //! @{ #define SPARE_SPI (&AVR32_SPI0) #define SPARE_SPI_NPCS 0 #define SPARE_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN #define SPARE_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION #define SPARE_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN #define SPARE_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION #define SPARE_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN #define SPARE_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION #define SPARE_SPI_NPCS_PIN AVR32_SPI0_NPCS_0_0_PIN #define SPARE_SPI_NPCS_FUNCTION AVR32_SPI0_NPCS_0_0_FUNCTION //! @} #endif #endif // _ARDUINO_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief AT32UC3A EVK1100 board LEDs support package. * * This file contains definitions and services related to the LED features of * the EVK1100 board. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 AT32UC3A devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include #include "preprocessor.h" #include "compiler.h" #include "arduino.h" #include "led.h" //! Structure describing LED hardware connections. typedef const struct { struct { U32 PORT; //!< LED GPIO port. U32 PIN_MASK; //!< Bit-mask of LED pin in GPIO port. } GPIO; //!< LED GPIO descriptor. struct { S32 CHANNEL; //!< LED PWM channel (< 0 if N/A). S32 FUNCTION; //!< LED pin PWM function (< 0 if N/A). } PWM; //!< LED PWM descriptor. } tLED_DESCRIPTOR; //! Hardware descriptors of all LEDs. static tLED_DESCRIPTOR LED_DESCRIPTOR[LED_COUNT] = { #define INSERT_LED_DESCRIPTOR(LED_NO, unused) \ { \ {LED##LED_NO##_GPIO / 32, 1 << (LED##LED_NO##_GPIO % 32)},\ {LED##LED_NO##_PWM, LED##LED_NO##_PWM_FUNCTION } \ }, MREPEAT(LED_COUNT, INSERT_LED_DESCRIPTOR, ~) #undef INSERT_LED_DESCRIPTOR }; //! Saved state of all LEDs. static volatile U32 LED_State = (1 << LED_COUNT) - 1; U32 LED_Read_Display(void) { return LED_State; } void LED_Display(U32 leds) { // Use the LED descriptors to get the connections of a given LED to the MCU. tLED_DESCRIPTOR *led_descriptor; volatile avr32_gpio_port_t *led_gpio_port; // Make sure only existing LEDs are specified. leds &= (1 << LED_COUNT) - 1; // Update the saved state of all LEDs with the requested changes. LED_State = leds; // For all LEDs... for (led_descriptor = &LED_DESCRIPTOR[0]; led_descriptor < LED_DESCRIPTOR + LED_COUNT; led_descriptor++) { // Set the LED to the requested state. led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; if (leds & 1) { led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK; } else { led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK; } led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; leds >>= 1; } } U32 LED_Read_Display_Mask(U32 mask) { return Rd_bits(LED_State, mask); } void LED_Display_Mask(U32 mask, U32 leds) { // Use the LED descriptors to get the connections of a given LED to the MCU. tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; volatile avr32_gpio_port_t *led_gpio_port; U8 led_shift; // Make sure only existing LEDs are specified. mask &= (1 << LED_COUNT) - 1; // Update the saved state of all LEDs with the requested changes. Wr_bits(LED_State, mask, leds); // While there are specified LEDs left to manage... while (mask) { // Select the next specified LED and set it to the requested state. led_shift = 1 + ctz(mask); led_descriptor += led_shift; led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; leds >>= led_shift - 1; if (leds & 1) { led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK; } else { led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK; } led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; leds >>= 1; mask >>= led_shift; } } Bool LED_Test(U32 leds) { return Tst_bits(LED_State, leds); } void LED_Off(U32 leds) { // Use the LED descriptors to get the connections of a given LED to the MCU. tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; volatile avr32_gpio_port_t *led_gpio_port; U8 led_shift; // Make sure only existing LEDs are specified. leds &= (1 << LED_COUNT) - 1; // Update the saved state of all LEDs with the requested changes. Clr_bits(LED_State, leds); // While there are specified LEDs left to manage... while (leds) { // Select the next specified LED and turn it off. led_shift = 1 + ctz(leds); led_descriptor += led_shift; led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK; led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; leds >>= led_shift; } } void LED_On(U32 leds) { // Use the LED descriptors to get the connections of a given LED to the MCU. tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; volatile avr32_gpio_port_t *led_gpio_port; U8 led_shift; // Make sure only existing LEDs are specified. leds &= (1 << LED_COUNT) - 1; // Update the saved state of all LEDs with the requested changes. Set_bits(LED_State, leds); // While there are specified LEDs left to manage... while (leds) { // Select the next specified LED and turn it on. led_shift = 1 + ctz(leds); led_descriptor += led_shift; led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK; led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; leds >>= led_shift; } } void LED_Toggle(U32 leds) { // Use the LED descriptors to get the connections of a given LED to the MCU. tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; volatile avr32_gpio_port_t *led_gpio_port; U8 led_shift; // Make sure only existing LEDs are specified. leds &= (1 << LED_COUNT) - 1; // Update the saved state of all LEDs with the requested changes. Tgl_bits(LED_State, leds); // While there are specified LEDs left to manage... while (leds) { // Select the next specified LED and toggle it. led_shift = 1 + ctz(leds); led_descriptor += led_shift; led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; led_gpio_port->ovrt = led_descriptor->GPIO.PIN_MASK; led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; leds >>= led_shift; } } U32 LED_Read_Display_Field(U32 field) { return Rd_bitfield(LED_State, field); } void LED_Display_Field(U32 field, U32 leds) { // Move the bit-field to the appropriate position for the bit-mask. LED_Display_Mask(field, leds << ctz(field)); } U8 LED_Get_Intensity(U32 led) { tLED_DESCRIPTOR *led_descriptor; // Check that the argument value is valid. led = ctz(led); led_descriptor = &LED_DESCRIPTOR[led]; if (led >= LED_COUNT || led_descriptor->PWM.CHANNEL < 0) return 0; // Return the duty cycle value if the LED PWM channel is enabled, else 0. return (AVR32_PWM.sr & (1 << led_descriptor->PWM.CHANNEL)) ? AVR32_PWM.channel[led_descriptor->PWM.CHANNEL].cdty : 0; } void LED_Set_Intensity(U32 leds, U8 intensity) { tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; volatile avr32_pwm_channel_t *led_pwm_channel; volatile avr32_gpio_port_t *led_gpio_port; U8 led_shift; // For each specified LED... for (leds &= (1 << LED_COUNT) - 1; leds; leds >>= led_shift) { // Select the next specified LED and check that it has a PWM channel. led_shift = 1 + ctz(leds); led_descriptor += led_shift; if (led_descriptor->PWM.CHANNEL < 0) continue; // Initialize or update the LED PWM channel. led_pwm_channel = &AVR32_PWM.channel[led_descriptor->PWM.CHANNEL]; if (!(AVR32_PWM.sr & (1 << led_descriptor->PWM.CHANNEL))) { led_pwm_channel->cmr = (AVR32_PWM_CPRE_MCK << AVR32_PWM_CPRE_OFFSET) & ~(AVR32_PWM_CALG_MASK | AVR32_PWM_CPOL_MASK | AVR32_PWM_CPD_MASK); led_pwm_channel->cprd = 0x000000FF; led_pwm_channel->cdty = intensity; AVR32_PWM.ena = 1 << led_descriptor->PWM.CHANNEL; } else { AVR32_PWM.isr; while (!(AVR32_PWM.isr & (1 << led_descriptor->PWM.CHANNEL))); led_pwm_channel->cupd = intensity; } // Switch the LED pin to its PWM function. led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; if (led_descriptor->PWM.FUNCTION & 0x1) { led_gpio_port->pmr0s = led_descriptor->GPIO.PIN_MASK; } else { led_gpio_port->pmr0c = led_descriptor->GPIO.PIN_MASK; } if (led_descriptor->PWM.FUNCTION & 0x2) { led_gpio_port->pmr1s = led_descriptor->GPIO.PIN_MASK; } else { led_gpio_port->pmr1c = led_descriptor->GPIO.PIN_MASK; } led_gpio_port->gperc = led_descriptor->GPIO.PIN_MASK; } } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief AT32UC3A EVK1100 board LEDs support package. * * This file contains definitions and services related to the LED features of * the EVK1100 board. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 AT32UC3A devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _LED_H_ #define _LED_H_ #include "compiler.h" /*! \name Identifiers of LEDs to Use with LED Functions */ //! @{ #define LED0 0x01 #define LED1 0x02 #define LED2 0x04 #define LED3 0x08 #define LED4 0x10 #define LED5 0x20 #define LED6 0x40 #define LED7 0x80 //! @} /*! \brief Gets the last state of all LEDs set through the LED API. * * \return State of all LEDs (1 bit per LED). * * \note The GPIO pin configuration of all LEDs is left unchanged. */ extern U32 LED_Read_Display(void); /*! \brief Sets the state of all LEDs. * * \param leds New state of all LEDs (1 bit per LED). * * \note The pins of all LEDs are set to GPIO output mode. */ extern void LED_Display(U32 leds); /*! \brief Gets the last state of the specified LEDs set through the LED API. * * \param mask LEDs of which to get the state (1 bit per LED). * * \return State of the specified LEDs (1 bit per LED). * * \note The GPIO pin configuration of all LEDs is left unchanged. */ extern U32 LED_Read_Display_Mask(U32 mask); /*! \brief Sets the state of the specified LEDs. * * \param mask LEDs of which to set the state (1 bit per LED). * * \param leds New state of the specified LEDs (1 bit per LED). * * \note The pins of the specified LEDs are set to GPIO output mode. */ extern void LED_Display_Mask(U32 mask, U32 leds); /*! \brief Tests the last state of the specified LEDs set through the LED API. * * \param leds LEDs of which to test the state (1 bit per LED). * * \return \c TRUE if at least one of the specified LEDs has a state on, else * \c FALSE. * * \note The GPIO pin configuration of all LEDs is left unchanged. */ extern Bool LED_Test(U32 leds); /*! \brief Turns off the specified LEDs. * * \param leds LEDs to turn off (1 bit per LED). * * \note The pins of the specified LEDs are set to GPIO output mode. */ extern void LED_Off(U32 leds); /*! \brief Turns on the specified LEDs. * * \param leds LEDs to turn on (1 bit per LED). * * \note The pins of the specified LEDs are set to GPIO output mode. */ extern void LED_On(U32 leds); /*! \brief Toggles the specified LEDs. * * \param leds LEDs to toggle (1 bit per LED). * * \note The pins of the specified LEDs are set to GPIO output mode. */ extern void LED_Toggle(U32 leds); /*! \brief Gets as a bit-field the last state of the specified LEDs set through * the LED API. * * \param field LEDs of which to get the state (1 bit per LED). * * \return State of the specified LEDs (1 bit per LED, beginning with the first * specified LED). * * \note The GPIO pin configuration of all LEDs is left unchanged. */ extern U32 LED_Read_Display_Field(U32 field); /*! \brief Sets as a bit-field the state of the specified LEDs. * * \param field LEDs of which to set the state (1 bit per LED). * \param leds New state of the specified LEDs (1 bit per LED, beginning with * the first specified LED). * * \note The pins of the specified LEDs are set to GPIO output mode. */ extern void LED_Display_Field(U32 field, U32 leds); /*! \brief Gets the intensity of the specified LED. * * \param led LED of which to get the intensity (1 bit per LED; only the least * significant set bit is used). * * \return Intensity of the specified LED (0x00 to 0xFF). * * \warning The PWM channel of the specified LED is supposed to be used only by * this module. * * \note The GPIO pin configuration of all LEDs is left unchanged. */ extern U8 LED_Get_Intensity(U32 led); /*! \brief Sets the intensity of the specified LEDs. * * \param leds LEDs of which to set the intensity (1 bit per LED). * \param intensity New intensity of the specified LEDs (0x00 to 0xFF). * * \warning The PWM channels of the specified LEDs are supposed to be used only * by this module. * * \note The pins of the specified LEDs are set to PWM output mode. */ extern void LED_Set_Intensity(U32 leds, U8 intensity); #endif // _LED_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/evk1105.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief AT32UC3A EVK1105 board header file. * * This file contains definitions and services related to the features of the * EVK1105 board rev. B. * * To use this board, define BOARD=EVK1105. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 AT32UC3A devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _EVK1105_H_ #define _EVK1105_H_ #ifdef EVK1105_REV3 # include "evk1105_rev3.h" #else #include "compiler.h" #ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling. # include "led.h" #endif // __AVR32_ABI_COMPILER__ /*! \name Oscillator Definitions */ //! @{ // RCOsc has no custom calibration by default. Set the following definition to // the appropriate value if a custom RCOsc calibration has been applied to your // part. //#define FRCOSC AVR32_PM_RCOSC_FREQUENCY //!< RCOsc frequency: Hz. #define FOSC32 32768 //!< Osc32 frequency: Hz. #define OSC32_STARTUP AVR32_PM_OSCCTRL32_STARTUP_8192_RCOSC //!< Osc32 startup time: RCOsc periods. #define FOSC0 12000000 //!< Osc0 frequency: Hz. #define OSC0_STARTUP AVR32_PM_OSCCTRL0_STARTUP_2048_RCOSC //!< Osc0 startup time: RCOsc periods. #define FOSC1 11289600 //!< Osc1 frequency: Hz #define OSC1_STARTUP AVR32_PM_OSCCTRL1_STARTUP_2048_RCOSC //!< Osc1 startup time: RCOsc periods. //! @} /*! \name SDRAM Definitions */ //! @{ //! Part header file of used SDRAM(s). #define SDRAM_PART_HDR "MT48LC16M16A2TG7E/mt48lc16m16a2tg7e.h" //! Data bus width to use the SDRAM(s) with (16 or 32 bits; always 16 bits on //! UC3). #define SDRAM_DBW 16 //! @} /*! \name USB Definitions */ //! @{ //! Multiplexed pin used for USB_ID: AVR32_USBB_USB_ID_x_x. //! To be selected according to the AVR32_USBB_USB_ID_x_x_PIN and //! AVR32_USBB_USB_ID_x_x_FUNCTION definitions from . #define AVR32_USBB_USB_ID_0_2_PIN 21 #define AVR32_USBB_USB_ID_0_2_FUNCTION 2 #define USB_ID AVR32_USBB_USB_ID_0_2 //! Multiplexed pin used for USB_VBOF: AVR32_USBB_USB_VBOF_x_x. //! To be selected according to the AVR32_USBB_USB_VBOF_x_x_PIN and //! AVR32_USBB_USB_VBOF_x_x_FUNCTION definitions from . # define USB_VBOF AVR32_USBB_USB_VBOF_0_1 //! Active level of the USB_VBOF output pin. # define USB_VBOF_ACTIVE_LEVEL LOW //! USB overcurrent detection pin. # define USB_OVERCURRENT_DETECT_PIN AVR32_PIN_PX15 //! @} //! GPIO connection of the MAC PHY PWR_DOWN/INT signal. # define MACB_INTERRUPT_PIN AVR32_PIN_PA26 //! Number of LEDs. #define LED_COUNT 4 /*! \name GPIO Connections of LEDs */ //! @{ # define LED0_GPIO AVR32_PIN_PB27 # define LED1_GPIO AVR32_PIN_PB28 # define LED2_GPIO AVR32_PIN_PA05 # define LED3_GPIO AVR32_PIN_PA06 //! @} /*! \name Color Identifiers of LEDs to Use with LED Functions */ //! @{ #define LED_MONO0_GREEN LED0 #define LED_MONO1_GREEN LED1 #define LED_MONO2_GREEN LED2 #define LED_MONO3_GREEN LED3 //! @} /*! \name PWM Channels of LEDs */ //! @{ #define LED0_PWM 4 #define LED1_PWM 5 #define LED2_PWM (-1) #define LED3_PWM (-1) //! @} /*! \name PWM Functions of LEDs */ //! @{ /* TODO: Implement PWM functionality */ #define LED0_PWM_FUNCTION (-1)//AVR32_PWM_0_FUNCTION #define LED1_PWM_FUNCTION (-1)//AVR32_PWM_1_FUNCTION #define LED2_PWM_FUNCTION (-1) #define LED3_PWM_FUNCTION (-1) //! @} //! External interrupt connection of touch sensor. #define QT1081_EIC_EXTINT_PIN AVR32_EIC_EXTINT_1_PIN #define QT1081_EIC_EXTINT_FUNCTION AVR32_EIC_EXTINT_1_FUNCTION #define QT1081_EIC_EXTINT_IRQ AVR32_EIC_IRQ_1 #define QT1081_EIC_EXTINT_INT AVR32_EIC_INT1 /*! \name Touch sensor low power mode select */ #define QT1081_LP_MODE AVR32_PIN_PB29 /*! \name GPIO Connections of touch buttons */ //! @{ #define QT1081_TOUCH_SENSOR_0 AVR32_PIN_PB22 #define QT1081_TOUCH_SENSOR_0_PRESSED 1 #define QT1081_TOUCH_SENSOR_1 AVR32_PIN_PB23 #define QT1081_TOUCH_SENSOR_1_PRESSED 1 #define QT1081_TOUCH_SENSOR_2 AVR32_PIN_PB24 #define QT1081_TOUCH_SENSOR_2_PRESSED 1 #define QT1081_TOUCH_SENSOR_3 AVR32_PIN_PB25 #define QT1081_TOUCH_SENSOR_3_PRESSED 1 #define QT1081_TOUCH_SENSOR_4 AVR32_PIN_PB26 #define QT1081_TOUCH_SENSOR_4_PRESSED 1 #define QT1081_TOUCH_SENSOR_ENTER QT1081_TOUCH_SENSOR_4 #define QT1081_TOUCH_SENSOR_ENTER_PRESSED QT1081_TOUCH_SENSOR_4_PRESSED #define QT1081_TOUCH_SENSOR_LEFT QT1081_TOUCH_SENSOR_3 #define QT1081_TOUCH_SENSOR_LEFT_PRESSED QT1081_TOUCH_SENSOR_3_PRESSED #define QT1081_TOUCH_SENSOR_RIGHT QT1081_TOUCH_SENSOR_2 #define QT1081_TOUCH_SENSOR_RIGHT_PRESSED QT1081_TOUCH_SENSOR_2_PRESSED #define QT1081_TOUCH_SENSOR_UP QT1081_TOUCH_SENSOR_0 #define QT1081_TOUCH_SENSOR_UP_PRESSED QT1081_TOUCH_SENSOR_0_PRESSED #define QT1081_TOUCH_SENSOR_DOWN QT1081_TOUCH_SENSOR_1 #define QT1081_TOUCH_SENSOR_DOWN_PRESSED QT1081_TOUCH_SENSOR_1_PRESSED //! @} /*! \name SPI Connections of the AT45DBX Data Flash Memory */ //! @{ #define AT45DBX_SPI (&AVR32_SPI0) #define AT45DBX_SPI_NPCS 0 #define AT45DBX_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN #define AT45DBX_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION #define AT45DBX_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN #define AT45DBX_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION #define AT45DBX_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN #define AT45DBX_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION #define AT45DBX_SPI_NPCS0_PIN AVR32_SPI0_NPCS_0_0_PIN #define AT45DBX_SPI_NPCS0_FUNCTION AVR32_SPI0_NPCS_0_0_FUNCTION //! @} /*! \name GPIO and SPI Connections of the SD/MMC Connector */ //! @{ #define SD_MMC_CARD_DETECT_PIN AVR32_PIN_PA02 #define SD_MMC_WRITE_PROTECT_PIN AVR32_PIN_PA18 #define SD_MMC_SPI (&AVR32_SPI0) #define SD_MMC_SPI_NPCS 1 #define SD_MMC_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN #define SD_MMC_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION #define SD_MMC_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN #define SD_MMC_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION #define SD_MMC_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN #define SD_MMC_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION #define SD_MMC_SPI_NPCS_PIN AVR32_SPI0_NPCS_1_0_PIN #define SD_MMC_SPI_NPCS_FUNCTION AVR32_SPI0_NPCS_1_0_FUNCTION //! @} /*! \name TWI expansion */ //! @{ #define EXPANSION_TWI (&AVR32_TWI) #define EXPANSION_RESET AVR32_PIN_PX16 #define EXPANSION_TWI_SCL_PIN AVR32_TWI_SCL_0_0_PIN #define EXPANSION_TWI_SCL_FUNCTION AVR32_TWI_SCL_0_0_FUNCTION #define EXPANSION_TWI_SDA_PIN AVR32_TWI_SDA_0_0_PIN #define EXPANSION_TWI_SDA_FUNCTION AVR32_TWI_SDA_0_0_FUNCTION //! @} /*! \name Wireless expansion */ #define WEXPANSION_EXTINT_PIN AVR32_EIC_EXTINT_8_PIN #define WEXPANSION_EXTINT_FUNCTION AVR32_EIC_EXTINT_8_FUNCTION #define WEXPANSION_GPIO1 AVR32_PIN_PB30 #define WEXPANSION_GPIO2 AVR32_PIN_PB31 #define WEXPANSION_SPI (&AVR32_SPI0) #define WEXPANSION_SPI_NPCS 2 #define WEXPANSION_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN #define WEXPANSION_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION #define WEXPANSION_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN #define WEXPANSION_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION #define WEXPANSION_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN #define WEXPANSION_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION #define WEXPANSION_SPI_NPCS_PIN AVR32_SPI0_NPCS_2_0_PIN #define WEXPANSION_SPI_NPCS_FUNCTION AVR32_SPI0_NPCS_2_0_FUNCTION //! @} /*! \name ET024006DHU TFT display */ //! @{ #define ET024006DHU_TE_PIN AVR32_PIN_PX19 #define ET024006DHU_RESET_PIN AVR32_PIN_PX22 #define ET024006DHU_BL_PIN AVR32_PWM_6_PIN #define ET024006DHU_BL_FUNCTION AVR32_PWM_6_FUNCTION #define ET024006DHU_DNC_PIN AVR32_EBI_ADDR_21_1_PIN #define ET024006DHU_DNC_FUNCTION AVR32_EBI_ADDR_21_1_FUNCTION #define ET024006DHU_EBI_NCS_PIN AVR32_EBI_NCS_0_1_PIN #define ET024006DHU_EBI_NCS_FUNCTION AVR32_EBI_NCS_0_1_FUNCTION //! @} /*! \name Optional SPI connection to the TFT */ //! @{ #define ET024006DHU_SPI (&AVR32_SPI0) #define ET024006DHU_SPI_NPCS 3 #define ET024006DHU_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN #define ET024006DHU_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION #define ET024006DHU_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN #define ET024006DHU_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION #define ET024006DHU_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN #define ET024006DHU_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION #define ET024006DHU_SPI_NPCS_PIN AVR32_SPI1_NPCS_3_0_PIN #define ET024006DHU_SPI_NPCS_FUNCTION AVR32_SPI1_NPCS_3_0_FUNCTION //! @} /*! \name Audio amplifier connection to the DAC */ //! @{ #define TPA6130_ABDAC (&AVR32_ABDAC) #define TPA6130_DATA0_PIN AVR32_ABDAC_DATA_0_1_PIN #define TPA6130_DATA0_FUNCTION AVR32_ABDAC_DATA_0_1_FUNCTION #define TPA6130_DATAN0_PIN AVR32_ABDAC_DATAN_0_1_PIN #define TPA6130_DATAN0_FUNCTION AVR32_ABDAC_DATAN_0_1_FUNCTION #define TPA6130_DATA1_PIN AVR32_ABDAC_DATA_1_1_PIN #define TPA6130_DATA1_FUNCTION AVR32_ABDAC_DATA_1_1_FUNCTION #define TPA6130_DATAN1_PIN AVR32_ABDAC_DATAN_1_1_PIN #define TPA6130_DATAN1_FUNCTION AVR32_ABDAC_DATAN_1_1_FUNCTION #define TPA6130_ABDAC_PDCA_PID AVR32_PDCA_PID_ABDAC_TX #define TPA6130_ABDAC_PDCA_CHANNEL 0 #define TPA6130_ABDAC_PDCA_IRQ AVR32_PDCA_IRQ_0 #define TPA6130_ABDAC_PDCA_INT_LEVEL AVR32_INTC_INT3 #define TPA6130_TWI (&AVR32_TWI) #define TPA6130_TWI_SCL_PIN AVR32_TWI_SCL_0_0_PIN #define TPA6130_TWI_SCL_FUNCTION AVR32_TWI_SCL_0_0_FUNCTION #define TPA6130_TWI_SDA_PIN AVR32_TWI_SDA_0_0_PIN #define TPA6130_TWI_SDA_FUNCTION AVR32_TWI_SDA_0_0_FUNCTION //! }@ /*! \name TI TLV320AIC23B sound chip */ //! @{ #define TLV320_SSC (&AVR32_SSC) #define TLV320_SSC_TX_CLOCK_PIN AVR32_SSC_TX_CLOCK_0_PIN #define TLV320_SSC_TX_CLOCK_FUNCTION AVR32_SSC_TX_CLOCK_0_FUNCTION #define TLV320_SSC_TX_DATA_PIN AVR32_SSC_TX_DATA_0_PIN #define TLV320_SSC_TX_DATA_FUNCTION AVR32_SSC_TX_DATA_0_FUNCTION #define TLV320_SSC_TX_FRAME_SYNC_PIN AVR32_SSC_TX_FRAME_SYNC_0_PIN #define TLV320_SSC_TX_FRAME_SYNC_FUNCTION AVR32_SSC_TX_FRAME_SYNC_0_FUNCTION #define TLV320_TWI (&AVR32_TWI) #define TLV320_TWI_SCL_PIN AVR32_TWI_SCL_0_0_PIN #define TLV320_TWI_SCL_FUNCTION AVR32_TWI_SCL_0_0_FUNCTION #define TLV320_TWI_SDA_PIN AVR32_TWI_SDA_0_0_PIN #define TLV320_TWI_SDA_FUNCTION AVR32_TWI_SDA_0_0_FUNCTION #define TLV320_PM_GCLK_PIN AVR32_PM_GCLK_0_0_PIN #define TLV320_PM_GCLK_FUNCTION AVR32_PM_GCLK_0_0_FUNCTION //! @} ////! \name SPI: Apple Authentication Chip Hardware Connections ////! @{ #define IPOD_AUTH_CHIP_SPI (&AVR32_SPI0) #define IPOD_AUTH_CHIP_SPI_IRQ AVR32_SPI0_IRQ #define IPOD_AUTH_CHIP_SPI_NPCS 2 #define IPOD_AUTH_CHIP_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN #define IPOD_AUTH_CHIP_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION #define IPOD_AUTH_CHIP_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN #define IPOD_AUTH_CHIP_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION #define IPOD_AUTH_CHIP_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN #define IPOD_AUTH_CHIP_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION #define IPOD_AUTH_CHIP_SPI_NPCS_PIN AVR32_SPI0_NPCS_2_0_PIN #define IPOD_AUTH_CHIP_SPI_NPCS_FUNCTION AVR32_SPI0_NPCS_2_0_FUNCTION #define IPOD_AUTH_CHIP_SPI_N_RESET_PIN AVR32_PIN_PB30 #define IPOD_AUTH_CHIP_SPI_CP_READY_PIN AVR32_PIN_PB31 //! }@ /*! \name Connections of the iPOD Authentication Coprocessor */ //! @{ #define IPOD_AUTH_CHIP_TWI (&AVR32_TWI) #define IPOD_AUTH_CHIP_TWI_SCL_PIN AVR32_TWI_SCL_0_0_PIN #define IPOD_AUTH_CHIP_TWI_SCL_FUNCTION AVR32_TWI_SCL_0_0_FUNCTION #define IPOD_AUTH_CHIP_TWI_SDA_PIN AVR32_TWI_SDA_0_0_PIN #define IPOD_AUTH_CHIP_TWI_SDA_FUNCTION AVR32_TWI_SDA_0_0_FUNCTION #define IPOD_AUTH_CHIP_TWI_N_RESET_PIN AVR32_PIN_PX16 //! @} /*! \name USART connection to the UC3B board controller */ //! @{ #define USART0_RXD_PIN AVR32_USART0_RXD_0_0_PIN #define USART0_RXD_FUNCTION AVR32_USART0_RXD_0_0_FUNCTION #define USART0_TXD_PIN AVR32_USART0_TXD_0_0_PIN #define USART0_TXD_FUNCTION AVR32_USART0_TXD_0_0_FUNCTION #define USART0_RTS_PIN AVR32_USART0_RTS_0_0_PIN #define USART0_RTS_FUNCTION AVR32_USART0_RTS_0_0_FUNCTION #define USART0_CTS_PIN AVR32_USART0_CTS_0_0_PIN #define USART0_CTS_FUNCTION AVR32_USART0_CTS_0_0_FUNCTION //! @} #define ADC_VEXT_PIN AVR32_ADC_AD_7_PIN #define ADC_VEXT_FUNCTION AVR32_ADC_AD_7_FUNCTION /*! \name LCD Connections of the ET024006DHU display */ //! @{ #define ET024006DHU_SMC_USE_NCS 0 #define ET024006DHU_SMC_COMPONENT_CS "smc_et024006dhu.h" #define ET024006DHU_EBI_DATA_0 AVR32_EBI_DATA_0 #define ET024006DHU_EBI_DATA_1 AVR32_EBI_DATA_1 #define ET024006DHU_EBI_DATA_2 AVR32_EBI_DATA_2 #define ET024006DHU_EBI_DATA_3 AVR32_EBI_DATA_3 #define ET024006DHU_EBI_DATA_4 AVR32_EBI_DATA_4 #define ET024006DHU_EBI_DATA_5 AVR32_EBI_DATA_5 #define ET024006DHU_EBI_DATA_6 AVR32_EBI_DATA_6 #define ET024006DHU_EBI_DATA_7 AVR32_EBI_DATA_7 #define ET024006DHU_EBI_DATA_8 AVR32_EBI_DATA_8 #define ET024006DHU_EBI_DATA_9 AVR32_EBI_DATA_9 #define ET024006DHU_EBI_DATA_10 AVR32_EBI_DATA_10 #define ET024006DHU_EBI_DATA_11 AVR32_EBI_DATA_11 #define ET024006DHU_EBI_DATA_12 AVR32_EBI_DATA_12 #define ET024006DHU_EBI_DATA_13 AVR32_EBI_DATA_13 #define ET024006DHU_EBI_DATA_14 AVR32_EBI_DATA_14 #define ET024006DHU_EBI_DATA_15 AVR32_EBI_DATA_15 #define ET024006DHU_EBI_ADDR_21 AVR32_EBI_ADDR_21_1 #define ET024006DHU_EBI_NWE AVR32_EBI_NWE0_0 #define ET024006DHU_EBI_NRD AVR32_EBI_NRD_0 #define ET024006DHU_EBI_NCS AVR32_EBI_NCS_0_1 //! @} #endif // !EVK1105_REVA #endif // _EVK1105_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief AT32UC3A EVK1105 board LEDs support package. * * This file contains definitions and services related to the LED features of * the EVK1105 board. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 AT32UC3A devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include #include "preprocessor.h" #include "compiler.h" #include "evk1105.h" #include "led.h" //! Structure describing LED hardware connections. typedef const struct { struct { U32 PORT; //!< LED GPIO port. U32 PIN_MASK; //!< Bit-mask of LED pin in GPIO port. } GPIO; //!< LED GPIO descriptor. struct { S32 CHANNEL; //!< LED PWM channel (< 0 if N/A). S32 FUNCTION; //!< LED pin PWM function (< 0 if N/A). } PWM; //!< LED PWM descriptor. } tLED_DESCRIPTOR; //! Hardware descriptors of all LEDs. static tLED_DESCRIPTOR LED_DESCRIPTOR[LED_COUNT] = { #define INSERT_LED_DESCRIPTOR(LED_NO, unused) \ { \ {LED##LED_NO##_GPIO / 32, 1 << (LED##LED_NO##_GPIO % 32)},\ {LED##LED_NO##_PWM, LED##LED_NO##_PWM_FUNCTION } \ }, MREPEAT(LED_COUNT, INSERT_LED_DESCRIPTOR, ~) #undef INSERT_LED_DESCRIPTOR }; //! Saved state of all LEDs. static volatile U32 LED_State = (1 << LED_COUNT) - 1; U32 LED_Read_Display(void) { return LED_State; } void LED_Display(U32 leds) { // Use the LED descriptors to get the connections of a given LED to the MCU. tLED_DESCRIPTOR *led_descriptor; volatile avr32_gpio_port_t *led_gpio_port; // Make sure only existing LEDs are specified. leds &= (1 << LED_COUNT) - 1; // Update the saved state of all LEDs with the requested changes. LED_State = leds; // For all LEDs... for (led_descriptor = &LED_DESCRIPTOR[0]; led_descriptor < LED_DESCRIPTOR + LED_COUNT; led_descriptor++) { // Set the LED to the requested state. led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; if (leds & 1) { led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK; } else { led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK; } led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; leds >>= 1; } } U32 LED_Read_Display_Mask(U32 mask) { return Rd_bits(LED_State, mask); } void LED_Display_Mask(U32 mask, U32 leds) { // Use the LED descriptors to get the connections of a given LED to the MCU. tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; volatile avr32_gpio_port_t *led_gpio_port; U8 led_shift; // Make sure only existing LEDs are specified. mask &= (1 << LED_COUNT) - 1; // Update the saved state of all LEDs with the requested changes. Wr_bits(LED_State, mask, leds); // While there are specified LEDs left to manage... while (mask) { // Select the next specified LED and set it to the requested state. led_shift = 1 + ctz(mask); led_descriptor += led_shift; led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; leds >>= led_shift - 1; if (leds & 1) { led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK; } else { led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK; } led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; leds >>= 1; mask >>= led_shift; } } Bool LED_Test(U32 leds) { return Tst_bits(LED_State, leds); } void LED_Off(U32 leds) { // Use the LED descriptors to get the connections of a given LED to the MCU. tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; volatile avr32_gpio_port_t *led_gpio_port; U8 led_shift; // Make sure only existing LEDs are specified. leds &= (1 << LED_COUNT) - 1; // Update the saved state of all LEDs with the requested changes. Clr_bits(LED_State, leds); // While there are specified LEDs left to manage... while (leds) { // Select the next specified LED and turn it off. led_shift = 1 + ctz(leds); led_descriptor += led_shift; led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK; led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; leds >>= led_shift; } } void LED_On(U32 leds) { // Use the LED descriptors to get the connections of a given LED to the MCU. tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; volatile avr32_gpio_port_t *led_gpio_port; U8 led_shift; // Make sure only existing LEDs are specified. leds &= (1 << LED_COUNT) - 1; // Update the saved state of all LEDs with the requested changes. Set_bits(LED_State, leds); // While there are specified LEDs left to manage... while (leds) { // Select the next specified LED and turn it on. led_shift = 1 + ctz(leds); led_descriptor += led_shift; led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK; led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; leds >>= led_shift; } } void LED_Toggle(U32 leds) { // Use the LED descriptors to get the connections of a given LED to the MCU. tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; volatile avr32_gpio_port_t *led_gpio_port; U8 led_shift; // Make sure only existing LEDs are specified. leds &= (1 << LED_COUNT) - 1; // Update the saved state of all LEDs with the requested changes. Tgl_bits(LED_State, leds); // While there are specified LEDs left to manage... while (leds) { // Select the next specified LED and toggle it. led_shift = 1 + ctz(leds); led_descriptor += led_shift; led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; led_gpio_port->ovrt = led_descriptor->GPIO.PIN_MASK; led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; leds >>= led_shift; } } U32 LED_Read_Display_Field(U32 field) { return Rd_bitfield(LED_State, field); } void LED_Display_Field(U32 field, U32 leds) { // Move the bit-field to the appropriate position for the bit-mask. LED_Display_Mask(field, leds << ctz(field)); } U8 LED_Get_Intensity(U32 led) { tLED_DESCRIPTOR *led_descriptor; // Check that the argument value is valid. led = ctz(led); led_descriptor = &LED_DESCRIPTOR[led]; if (led >= LED_COUNT || led_descriptor->PWM.CHANNEL < 0) return 0; // Return the duty cycle value if the LED PWM channel is enabled, else 0. return (AVR32_PWM.sr & (1 << led_descriptor->PWM.CHANNEL)) ? AVR32_PWM.channel[led_descriptor->PWM.CHANNEL].cdty : 0; } void LED_Set_Intensity(U32 leds, U8 intensity) { tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; volatile avr32_pwm_channel_t *led_pwm_channel; volatile avr32_gpio_port_t *led_gpio_port; U8 led_shift; // For each specified LED... for (leds &= (1 << LED_COUNT) - 1; leds; leds >>= led_shift) { // Select the next specified LED and check that it has a PWM channel. led_shift = 1 + ctz(leds); led_descriptor += led_shift; if (led_descriptor->PWM.CHANNEL < 0) continue; // Initialize or update the LED PWM channel. led_pwm_channel = &AVR32_PWM.channel[led_descriptor->PWM.CHANNEL]; if (!(AVR32_PWM.sr & (1 << led_descriptor->PWM.CHANNEL))) { led_pwm_channel->cmr = (AVR32_PWM_CPRE_MCK << AVR32_PWM_CPRE_OFFSET) & ~(AVR32_PWM_CALG_MASK | AVR32_PWM_CPOL_MASK | AVR32_PWM_CPD_MASK); led_pwm_channel->cprd = 0x000000FF; led_pwm_channel->cdty = intensity; AVR32_PWM.ena = 1 << led_descriptor->PWM.CHANNEL; } else { AVR32_PWM.isr; while (!(AVR32_PWM.isr & (1 << led_descriptor->PWM.CHANNEL))); led_pwm_channel->cupd = intensity; } // Switch the LED pin to its PWM function. led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; if (led_descriptor->PWM.FUNCTION & 0x1) { led_gpio_port->pmr0s = led_descriptor->GPIO.PIN_MASK; } else { led_gpio_port->pmr0c = led_descriptor->GPIO.PIN_MASK; } if (led_descriptor->PWM.FUNCTION & 0x2) { led_gpio_port->pmr1s = led_descriptor->GPIO.PIN_MASK; } else { led_gpio_port->pmr1c = led_descriptor->GPIO.PIN_MASK; } led_gpio_port->gperc = led_descriptor->GPIO.PIN_MASK; } } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief AT32UC3A EVK1105 board LEDs support package. * * This file contains definitions and services related to the LED features of * the EVK1105 board. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 AT32UC3A devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _LED_H_ #define _LED_H_ #include "compiler.h" /*! \name Identifiers of LEDs to Use with LED Functions */ //! @{ #define LED0 0x01 #define LED1 0x02 #define LED2 0x04 #define LED3 0x08 //! @} /*! \brief Gets the last state of all LEDs set through the LED API. * * \return State of all LEDs (1 bit per LED). * * \note The GPIO pin configuration of all LEDs is left unchanged. */ extern U32 LED_Read_Display(void); /*! \brief Sets the state of all LEDs. * * \param leds New state of all LEDs (1 bit per LED). * * \note The pins of all LEDs are set to GPIO output mode. */ extern void LED_Display(U32 leds); /*! \brief Gets the last state of the specified LEDs set through the LED API. * * \param mask LEDs of which to get the state (1 bit per LED). * * \return State of the specified LEDs (1 bit per LED). * * \note The GPIO pin configuration of all LEDs is left unchanged. */ extern U32 LED_Read_Display_Mask(U32 mask); /*! \brief Sets the state of the specified LEDs. * * \param mask LEDs of which to set the state (1 bit per LED). * * \param leds New state of the specified LEDs (1 bit per LED). * * \note The pins of the specified LEDs are set to GPIO output mode. */ extern void LED_Display_Mask(U32 mask, U32 leds); /*! \brief Tests the last state of the specified LEDs set through the LED API. * * \param leds LEDs of which to test the state (1 bit per LED). * * \return \c TRUE if at least one of the specified LEDs has a state on, else * \c FALSE. * * \note The GPIO pin configuration of all LEDs is left unchanged. */ extern Bool LED_Test(U32 leds); /*! \brief Turns off the specified LEDs. * * \param leds LEDs to turn off (1 bit per LED). * * \note The pins of the specified LEDs are set to GPIO output mode. */ extern void LED_Off(U32 leds); /*! \brief Turns on the specified LEDs. * * \param leds LEDs to turn on (1 bit per LED). * * \note The pins of the specified LEDs are set to GPIO output mode. */ extern void LED_On(U32 leds); /*! \brief Toggles the specified LEDs. * * \param leds LEDs to toggle (1 bit per LED). * * \note The pins of the specified LEDs are set to GPIO output mode. */ extern void LED_Toggle(U32 leds); /*! \brief Gets as a bit-field the last state of the specified LEDs set through * the LED API. * * \param field LEDs of which to get the state (1 bit per LED). * * \return State of the specified LEDs (1 bit per LED, beginning with the first * specified LED). * * \note The GPIO pin configuration of all LEDs is left unchanged. */ extern U32 LED_Read_Display_Field(U32 field); /*! \brief Sets as a bit-field the state of the specified LEDs. * * \param field LEDs of which to set the state (1 bit per LED). * \param leds New state of the specified LEDs (1 bit per LED, beginning with * the first specified LED). * * \note The pins of the specified LEDs are set to GPIO output mode. */ extern void LED_Display_Field(U32 field, U32 leds); /*! \brief Gets the intensity of the specified LED. * * \param led LED of which to get the intensity (1 bit per LED; only the least * significant set bit is used). * * \return Intensity of the specified LED (0x00 to 0xFF). * * \warning The PWM channel of the specified LED is supposed to be used only by * this module. * * \note The GPIO pin configuration of all LEDs is left unchanged. */ extern U8 LED_Get_Intensity(U32 led); /*! \brief Sets the intensity of the specified LEDs. * * \param leds LEDs of which to set the intensity (1 bit per LED). * \param intensity New intensity of the specified LEDs (0x00 to 0xFF). * * \warning The PWM channels of the specified LEDs are supposed to be used only * by this module. * * \note The pins of the specified LEDs are set to PWM output mode. */ extern void LED_Set_Intensity(U32 leds, U8 intensity); #endif // _LED_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/board.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Standard board header file. * * This file includes the appropriate board header file according to the * defined board. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _BOARD_H_ #define _BOARD_H_ #include /*! \name Base Boards */ //! @{ #define EVK1100 1 //!< AT32UC3A EVK1100 board. #define EVK1101 2 //!< AT32UC3B EVK1101 board. #define UC3C_EK 3 //!< AT32UC3C UC3C_EK board. #define EVK1104 4 //!< AT32UC3A3 EVK1104 board. #define EVK1105 5 //!< AT32UC3A EVK1105 board. #define STK1000 6 //!< AT32AP7000 STK1000 board. #define NGW100 7 //!< AT32AP7000 NGW100 board. #define STK600_RCUC3L0 8 //!< STK600 RCUC3L0 board. #define UC3L_EK 9 //!< AT32UC3L-EK board. #define USER_BOARD 99 //!< User-reserved board (if any). //! @} /*! \name Extension Boards */ //! @{ #define EXT1102 1 //!< AT32UC3B EXT1102 board. #define MC300 2 //!< AT32UC3 MC300 board. #define USER_EXT_BOARD 99 //!< User-reserved extension board (if any). //! @} #if BOARD == EVK1100 #include "EVK1100/evk1100.h" #elif BOARD == EVK1101 #include "EVK1101/evk1101.h" #elif BOARD == UC3C_EK #include "UC3C_EK/uc3c_ek.h" #elif BOARD == EVK1104 #include "EVK1104/evk1104.h" #elif BOARD == EVK1105 #include "EVK1105/evk1105.h" #elif BOARD == STK1000 #include "STK1000/stk1000.h" #elif BOARD == NGW100 #include "NGW100/ngw100.h" #elif BOARD == STK600_RCUC3L0 #include "STK600/RCUC3L0/stk600_rcuc3l0.h" #elif BOARD == UC3L_EK #include "UC3L_EK/uc3l_ek.h" #elif BOARD == ARDUINO #include "ARDUINO/arduino.h" #else #error No known AVR32 board defined #endif #if (defined EXT_BOARD) #if EXT_BOARD == EXT1102 #include "EXT1102/ext1102.h" #elif EXT_BOARD == MC300 #include "MC300/mc300.h" #elif EXT_BOARD == USER_EXT_BOARD // User-reserved area: #include the header file of your extension board here // (if any). #endif #endif #ifndef FRCOSC #define FRCOSC AVR32_PM_RCOSC_FREQUENCY //!< Default RCOsc frequency. #endif #endif // _BOARD_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/board.h.ori ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Standard board header file. * * This file includes the appropriate board header file according to the * defined board. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _BOARD_H_ #define _BOARD_H_ #include /*! \name Base Boards */ //! @{ #define EVK1100 1 //!< AT32UC3A EVK1100 board. #define EVK1101 2 //!< AT32UC3B EVK1101 board. #define UC3C_EK 3 //!< AT32UC3C UC3C_EK board. #define EVK1104 4 //!< AT32UC3A3 EVK1104 board. #define EVK1105 5 //!< AT32UC3A EVK1105 board. #define STK1000 6 //!< AT32AP7000 STK1000 board. #define NGW100 7 //!< AT32AP7000 NGW100 board. #define STK600_RCUC3L0 8 //!< STK600 RCUC3L0 board. #define UC3L_EK 9 //!< AT32UC3L-EK board. #define USER_BOARD 99 //!< User-reserved board (if any). //! @} /*! \name Extension Boards */ //! @{ #define EXT1102 1 //!< AT32UC3B EXT1102 board. #define MC300 2 //!< AT32UC3 MC300 board. #define USER_EXT_BOARD 99 //!< User-reserved extension board (if any). //! @} #if BOARD == EVK1100 #include "EVK1100/evk1100.h" #elif BOARD == EVK1101 #include "EVK1101/evk1101.h" #elif BOARD == UC3C_EK #include "UC3C_EK/uc3c_ek.h" #elif BOARD == EVK1104 #include "EVK1104/evk1104.h" #elif BOARD == EVK1105 #include "EVK1105/evk1105.h" #elif BOARD == STK1000 #include "STK1000/stk1000.h" #elif BOARD == NGW100 #include "NGW100/ngw100.h" #elif BOARD == STK600_RCUC3L0 #include "STK600/RCUC3L0/stk600_rcuc3l0.h" #elif BOARD == UC3L_EK #include "UC3L_EK/uc3l_ek.h" #elif BOARD == USER_BOARD // User-reserved area: #include the header file of your board here (if any). #include "user_board.h" #else #error No known AVR32 board defined #endif #if (defined EXT_BOARD) #if EXT_BOARD == EXT1102 #include "EXT1102/ext1102.h" #elif EXT_BOARD == MC300 #include "MC300/mc300.h" #elif EXT_BOARD == USER_EXT_BOARD // User-reserved area: #include the header file of your extension board here // (if any). #endif #endif #ifndef FRCOSC #define FRCOSC AVR32_PM_RCOSC_FREQUENCY //!< Default RCOsc frequency. #endif #endif // _BOARD_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Management of the AT45DBX data flash controller through SPI. * * This file manages the accesses to the AT45DBX data flash components. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with an SPI module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ //_____ I N C L U D E S ___________________________________________________ #include "conf_access.h" #if AT45DBX_MEM == ENABLE #include "compiler.h" #include "board.h" #include "gpio.h" #include "spi.h" #include "conf_at45dbx.h" #include "at45dbx.h" #include "printf-stdarg.h" #if AT45DBX_MEM_CNT > 4 #error AT45DBX_MEM_CNT must not exceed 4 #endif //_____ D E F I N I T I O N S ______________________________________________ /*! \name AT45DBX Group A Commands */ //! @{ #define AT45DBX_CMDA_RD_PAGE 0xD2 //!< Main Memory Page Read (Serial/8-bit Mode). #define AT45DBX_CMDA_RD_ARRAY_LEG 0xE8 //!< Continuous Array Read, Legacy Command (Serial/8-bit Mode). #define AT45DBX_CMDA_RD_ARRAY_LF_SM 0x03 //!< Continuous Array Read, Low-Frequency Mode (Serial Mode). #define AT45DBX_CMDA_RD_ARRAY_AF_SM 0x0B //!< Continuous Array Read, Any-Frequency Mode (Serial Mode). #define AT45DBX_CMDA_RD_SECTOR_PROT_REG 0x32 //!< Read Sector Protection Register (Serial/8-bit Mode). #define AT45DBX_CMDA_RD_SECTOR_LKDN_REG 0x35 //!< Read Sector Lockdown Register (Serial/8-bit Mode). #define AT45DBX_CMDA_RD_SECURITY_REG 0x77 //!< Read Security Register (Serial/8-bit Mode). //! @} /*! \name AT45DBX Group B Commands */ //! @{ #define AT45DBX_CMDB_ER_PAGE 0x81 //!< Page Erase (Serial/8-bit Mode). #define AT45DBX_CMDB_ER_BLOCK 0x50 //!< Block Erase (Serial/8-bit Mode). #define AT45DBX_CMDB_ER_SECTOR 0x7C //!< Sector Erase (Serial/8-bit Mode). #define AT45DBX_CMDB_ER_CHIP 0xC794809A //!< Chip Erase (Serial/8-bit Mode). #define AT45DBX_CMDB_XFR_PAGE_TO_BUF1 0x53 //!< Main Memory Page to Buffer 1 Transfer (Serial/8-bit Mode). #define AT45DBX_CMDB_XFR_PAGE_TO_BUF2 0x55 //!< Main Memory Page to Buffer 2 Transfer (Serial/8-bit Mode). #define AT45DBX_CMDB_CMP_PAGE_TO_BUF1 0x60 //!< Main Memory Page to Buffer 1 Compare (Serial/8-bit Mode). #define AT45DBX_CMDB_CMP_PAGE_TO_BUF2 0x61 //!< Main Memory Page to Buffer 2 Compare (Serial/8-bit Mode). #define AT45DBX_CMDB_PR_BUF1_TO_PAGE_ER 0x83 //!< Buffer 1 to Main Memory Page Program with Built-in Erase (Serial/8-bit Mode). #define AT45DBX_CMDB_PR_BUF2_TO_PAGE_ER 0x86 //!< Buffer 2 to Main Memory Page Program with Built-in Erase (Serial/8-bit Mode). #define AT45DBX_CMDB_PR_BUF1_TO_PAGE 0x88 //!< Buffer 1 to Main Memory Page Program without Built-in Erase (Serial/8-bit Mode). #define AT45DBX_CMDB_PR_BUF2_TO_PAGE 0x89 //!< Buffer 2 to Main Memory Page Program without Built-in Erase (Serial/8-bit Mode). #define AT45DBX_CMDB_PR_PAGE_TH_BUF1 0x82 //!< Main Memory Page Program through Buffer 1 (Serial/8-bit Mode). #define AT45DBX_CMDB_PR_PAGE_TH_BUF2 0x85 //!< Main Memory Page Program through Buffer 2 (Serial/8-bit Mode). #define AT45DBX_CMDB_RWR_PAGE_TH_BUF1 0x58 //!< Auto Page Rewrite through Buffer 1 (Serial/8-bit Mode). #define AT45DBX_CMDB_RWR_PAGE_TH_BUF2 0x59 //!< Auto Page Rewrite through Buffer 2 (Serial/8-bit Mode). //! @} /*! \name AT45DBX Group C Commands */ //! @{ #define AT45DBX_CMDC_RD_BUF1_LF_SM 0xD1 //!< Buffer 1 Read, Low-Frequency Mode (Serial Mode). #define AT45DBX_CMDC_RD_BUF2_LF_SM 0xD3 //!< Buffer 2 Read, Low-Frequency Mode (Serial Mode). #define AT45DBX_CMDC_RD_BUF1_AF_SM 0xD4 //!< Buffer 1 Read, Any-Frequency Mode (Serial Mode). #define AT45DBX_CMDC_RD_BUF2_AF_SM 0xD6 //!< Buffer 2 Read, Any-Frequency Mode (Serial Mode). #define AT45DBX_CMDC_RD_BUF1_AF_8M 0x54 //!< Buffer 1 Read, Any-Frequency Mode (8-bit Mode). #define AT45DBX_CMDC_RD_BUF2_AF_8M 0x56 //!< Buffer 2 Read, Any-Frequency Mode (8-bit Mode). #define AT45DBX_CMDC_WR_BUF1 0x84 //!< Buffer 1 Write (Serial/8-bit Mode). #define AT45DBX_CMDC_WR_BUF2 0x87 //!< Buffer 2 Write (Serial/8-bit Mode). #define AT45DBX_CMDC_RD_STATUS_REG 0xD7 //!< Status Register Read (Serial/8-bit Mode). #define AT45DBX_CMDC_RD_MNFCT_DEV_ID_SM 0x9F //!< Manufacturer and Device ID Read (Serial Mode). //! @} /*! \name AT45DBX Group D Commands */ //! @{ #define AT45DBX_CMDD_EN_SECTOR_PROT 0x3D2A7FA9 //!< Enable Sector Protection (Serial/8-bit Mode). #define AT45DBX_CMDD_DIS_SECTOR_PROT 0x3D2A7F9A //!< Disable Sector Protection (Serial/8-bit Mode). #define AT45DBX_CMDD_ER_SECTOR_PROT_REG 0x3D2A7FCF //!< Erase Sector Protection Register (Serial/8-bit Mode). #define AT45DBX_CMDD_PR_SECTOR_PROT_REG 0x3D2A7FFC //!< Program Sector Protection Register (Serial/8-bit Mode). #define AT45DBX_CMDD_LKDN_SECTOR 0x3D2A7F30 //!< Sector Lockdown (Serial/8-bit Mode). #define AT45DBX_CMDD_PR_SECURITY_REG 0x9B000000 //!< Program Security Register (Serial/8-bit Mode). #define AT45DBX_CMDD_PR_CONF_REG 0x3D2A80A6 //!< Program Configuration Register (Serial/8-bit Mode). #define AT45DBX_CMDD_DEEP_PWR_DN 0xB9 //!< Deep Power-down (Serial/8-bit Mode). #define AT45DBX_CMDD_RSM_DEEP_PWR_DN 0xAB //!< Resume from Deep Power-down (Serial/8-bit Mode). //! @} /*! \name Bit-Masks and Values for the Status Register */ //! @{ #define AT45DBX_MSK_BUSY 0x80 //!< Busy status bit-mask. #define AT45DBX_BUSY 0x00 //!< Busy status value (0x00 when busy, 0x80 when ready). #define AT45DBX_MSK_DENSITY 0x3C //!< Device density bit-mask. //! @} #if AT45DBX_MEM_SIZE == AT45DBX_1MB /*! \name AT45DB081 Memories */ //! @{ #define AT45DB021D_DENSITY 0x14 //!< Device density value. #define AT45DBX_DENSITY 0x24 //!< Device density value. #define AT45DBX_BYTE_ADDR_BITS 9 //!< Address bits for byte position within buffer. //! @} #elif AT45DBX_MEM_SIZE == AT45DBX_2MB /*! \name AT45DB021D Memories */ //! @{ #define AT45DBX_DENSITY 0x21 //!< Device density value. #define AT45DBX_BYTE_ADDR_BITS 10 //!< Address bits for byte position within buffer. //! @} #if 0 /*! \name AT45DB161 Memories */ //! @{ #define AT45DBX_DENSITY 0x2C //!< Device density value. #define AT45DBX_BYTE_ADDR_BITS 10 //!< Address bits for byte position within buffer. //! @} #endif #elif AT45DBX_MEM_SIZE == AT45DBX_4MB /*! \name AT45DB321 Memories */ //! @{ #define AT45DBX_DENSITY 0x34 //!< Device density value. #define AT45DBX_BYTE_ADDR_BITS 10 //!< Address bits for byte position within buffer. //! @} #elif AT45DBX_MEM_SIZE == AT45DBX_8MB /*! \name AT45DB642 Memories */ //! @{ #define AT45DBX_DENSITY 0x3C //!< Device density value. #define AT45DBX_BYTE_ADDR_BITS 11 //!< Address bits for byte position within buffer. //! @} #else #error AT45DBX_MEM_SIZE is not defined to a supported value #endif //! Address bits for page selection. #define AT45DBX_PAGE_ADDR_BITS (AT45DBX_MEM_SIZE - AT45DBX_PAGE_BITS) //! Number of bits for addresses within pages. #define AT45DBX_PAGE_BITS (AT45DBX_BYTE_ADDR_BITS - 1) //! Page size in bytes. #define AT45DBX_PAGE_SIZE (1 << AT45DBX_PAGE_BITS) //! Bit-mask for byte position within buffer in \ref gl_ptr_mem. #define AT45DBX_MSK_PTR_BYTE ((1 << AT45DBX_PAGE_BITS) - 1) //! Bit-mask for page selection in \ref gl_ptr_mem. #define AT45DBX_MSK_PTR_PAGE (((1 << AT45DBX_PAGE_ADDR_BITS) - 1) << AT45DBX_PAGE_BITS) //! Bit-mask for byte position within sector in \ref gl_ptr_mem. #define AT45DBX_MSK_PTR_SECTOR ((1 << AT45DBX_SECTOR_BITS) - 1) /*! \brief Sends a dummy byte through SPI. */ #define spi_write_dummy() spi_write(AT45DBX_SPI, 0xFF) //! Boolean indicating whether memory is in busy state. static Bool at45dbx_busy; //! Memory data pointer. static U32 gl_ptr_mem; //! Sector buffer. static U8 sector_buf[AT45DBX_SECTOR_SIZE]; /*! \name Control Functions */ //! @{ Bool at45dbx_init(spi_options_t spiOptions, unsigned int pba_hz) { // Setup SPI registers according to spiOptions. for (spiOptions.reg = AT45DBX_SPI_FIRST_NPCS; spiOptions.reg < AT45DBX_SPI_FIRST_NPCS + AT45DBX_MEM_CNT; spiOptions.reg++) { if (spi_setupChipReg(AT45DBX_SPI, &spiOptions, pba_hz) != SPI_OK) return KO; } // Memory ready. at45dbx_busy = FALSE; return OK; } /*! \brief Selects or unselects a DF memory. * * \param memidx Memory ID of DF to select or unselect. * \param bSelect Boolean indicating whether the DF memory has to be selected. */ static void at45dbx_chipselect_df(U8 memidx, Bool bSelect) { if (bSelect) { // Select SPI chip. spi_selectChip(AT45DBX_SPI, AT45DBX_SPI_FIRST_NPCS + memidx); } else { // Unselect SPI chip. spi_unselectChip(AT45DBX_SPI, AT45DBX_SPI_FIRST_NPCS + memidx); } } Bool at45dbx_mem_check(void) { U8 df; U16 status = 0; // DF memory check. for (df = 0; df < AT45DBX_MEM_CNT; df++) { // Select the DF memory to check. at45dbx_chipselect_df(df, TRUE); // Send the Status Register Read command. spi_write(AT45DBX_SPI, AT45DBX_CMDC_RD_STATUS_REG); // Send a dummy byte to read the status register. spi_write_dummy(); spi_read(AT45DBX_SPI, &status); // Unselect the checked DF memory. at45dbx_chipselect_df(df, FALSE); // Unexpected device density value. if ((status & AT45DBX_MSK_DENSITY) < AT45DB021D_DENSITY) { printk("Unexpected device density value: %d (0x%x)\n", (status & AT45DBX_MSK_DENSITY), status); return KO; } } return OK; } /*! \brief Waits until the DF is ready. */ static void at45dbx_wait_ready(void) { U16 status; // Select the DF memory gl_ptr_mem points to. at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, TRUE); // Send the Status Register Read command. spi_write(AT45DBX_SPI, AT45DBX_CMDC_RD_STATUS_REG); // Read the status register until the DF is ready. do { // Send a dummy byte to read the status register. spi_write_dummy(); spi_read(AT45DBX_SPI, &status); } while ((status & AT45DBX_MSK_BUSY) == AT45DBX_BUSY); // Unselect the DF memory gl_ptr_mem points to. at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); } Bool at45dbx_read_open(U32 sector) { U32 addr; // Set the global memory pointer to a byte address. gl_ptr_mem = sector << AT45DBX_SECTOR_BITS; // gl_ptr_mem = sector * AT45DBX_SECTOR_SIZE. // If the DF memory is busy, wait until it's ready. if (at45dbx_busy) at45dbx_wait_ready(); at45dbx_busy = FALSE; // Select the DF memory gl_ptr_mem points to. at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, TRUE); // Initiate a page read at a given sector. // Send the Main Memory Page Read command. spi_write(AT45DBX_SPI, AT45DBX_CMDA_RD_PAGE); // Send the three address bytes, which comprise: // - (24 - (AT45DBX_PAGE_ADDR_BITS + AT45DBX_BYTE_ADDR_BITS)) reserved bits; // - then AT45DBX_PAGE_ADDR_BITS bits specifying the page in main memory to be read; // - then AT45DBX_BYTE_ADDR_BITS bits specifying the starting byte address within that page. // NOTE: The bits of gl_ptr_mem above the AT45DBX_MEM_SIZE bits are useless for the local // DF addressing. They are used for DF discrimination when there are several DFs. addr = (Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_PAGE) << AT45DBX_BYTE_ADDR_BITS) | Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE); spi_write(AT45DBX_SPI, LSB2W(addr)); spi_write(AT45DBX_SPI, LSB1W(addr)); spi_write(AT45DBX_SPI, LSB0W(addr)); // Send 32 don't care clock cycles to initialize the read operation. spi_write_dummy(); spi_write_dummy(); spi_write_dummy(); spi_write_dummy(); return OK; } void at45dbx_read_close(void) { // Unselect the DF memory gl_ptr_mem points to. at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); // Memory ready. at45dbx_busy = FALSE; } Bool at45dbx_write_open(U32 sector) { U32 addr; // Set the global memory pointer to a byte address. gl_ptr_mem = sector << AT45DBX_SECTOR_BITS; // gl_ptr_mem = sector * AT45DBX_SECTOR_SIZE. // If the DF memory is busy, wait until it's ready. if (at45dbx_busy) at45dbx_wait_ready(); at45dbx_busy = FALSE; #if AT45DBX_PAGE_SIZE > AT45DBX_SECTOR_SIZE // Select the DF memory gl_ptr_mem points to. at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, TRUE); // Transfer the content of the current page to buffer 1. // Send the Main Memory Page to Buffer 1 Transfer command. spi_write(AT45DBX_SPI, AT45DBX_CMDB_XFR_PAGE_TO_BUF1); // Send the three address bytes, which comprise: // - (24 - (AT45DBX_PAGE_ADDR_BITS + AT45DBX_BYTE_ADDR_BITS)) reserved bits; // - then AT45DBX_PAGE_ADDR_BITS bits specifying the page in main memory to be read; // - then AT45DBX_BYTE_ADDR_BITS don't care bits. // NOTE: The bits of gl_ptr_mem above the AT45DBX_MEM_SIZE bits are useless for the local // DF addressing. They are used for DF discrimination when there are several DFs. addr = Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_PAGE) << AT45DBX_BYTE_ADDR_BITS; spi_write(AT45DBX_SPI, LSB2W(addr)); spi_write(AT45DBX_SPI, LSB1W(addr)); spi_write(AT45DBX_SPI, LSB0W(addr)); // Unselect the DF memory gl_ptr_mem points to. at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); // Wait for end of page transfer. at45dbx_wait_ready(); #endif // Select the DF memory gl_ptr_mem points to. at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, TRUE); // Initiate a page write at a given sector. // Send the Main Memory Page Program through Buffer 1 command. spi_write(AT45DBX_SPI, AT45DBX_CMDB_PR_PAGE_TH_BUF1); // Send the three address bytes, which comprise: // - (24 - (AT45DBX_PAGE_ADDR_BITS + AT45DBX_BYTE_ADDR_BITS)) reserved bits; // - then AT45DBX_PAGE_ADDR_BITS bits specifying the page in main memory to be written; // - then AT45DBX_BYTE_ADDR_BITS bits specifying the starting byte address within that page. // NOTE: The bits of gl_ptr_mem above the AT45DBX_MEM_SIZE bits are useless for the local // DF addressing. They are used for DF discrimination when there are several DFs. addr = (Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_PAGE) << AT45DBX_BYTE_ADDR_BITS) | Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE); spi_write(AT45DBX_SPI, LSB2W(addr)); spi_write(AT45DBX_SPI, LSB1W(addr)); spi_write(AT45DBX_SPI, LSB0W(addr)); return OK; } void at45dbx_write_close(void) { // While end of logical sector not reached, zero-fill remaining memory bytes. while (Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_SECTOR)) { spi_write(AT45DBX_SPI, 0x00); gl_ptr_mem++; } // Unselect the DF memory gl_ptr_mem points to. at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); // Memory busy. at45dbx_busy = TRUE; } //! @} /*! \name Single-Byte Access Functions */ //! @{ U8 at45dbx_read_byte(void) { U16 data; // Memory busy. if (at45dbx_busy) { // Being here, we know that we previously finished a page read. // => We have to access the next page. // Memory ready. at45dbx_busy = FALSE; // Eventually select the next DF and open the next page. // NOTE: at45dbx_read_open input parameter is a sector. at45dbx_read_open(gl_ptr_mem >> AT45DBX_SECTOR_BITS); // gl_ptr_mem / AT45DBX_SECTOR_SIZE. } // Send a dummy byte to read the next data byte. spi_write_dummy(); spi_read(AT45DBX_SPI, &data); gl_ptr_mem++; // If end of page reached, if (!Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE)) { // unselect the DF memory gl_ptr_mem points to. at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); // Memory busy. at45dbx_busy = TRUE; } return data; } Bool at45dbx_write_byte(U8 b) { // Memory busy. if (at45dbx_busy) { // Being here, we know that we previously launched a page programming. // => We have to access the next page. // Eventually select the next DF and open the next page. // NOTE: at45dbx_write_open input parameter is a sector. at45dbx_write_open(gl_ptr_mem >> AT45DBX_SECTOR_BITS); // gl_ptr_mem / AT45DBX_SECTOR_SIZE. } // Write the next data byte. spi_write(AT45DBX_SPI, b); gl_ptr_mem++; // If end of page reached, if (!Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE)) { // unselect the DF memory gl_ptr_mem points to in order to program the page. at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); // Memory busy. at45dbx_busy = TRUE; } return OK; } //! @} /*! \name Multiple-Sector Access Functions */ //! @{ Bool at45dbx_read_multiple_sector(U16 nb_sector) { while (nb_sector--) { // Read the next sector. at45dbx_read_sector_2_ram(sector_buf); at45dbx_read_multiple_sector_callback(sector_buf); } return OK; } Bool at45dbx_write_multiple_sector(U16 nb_sector) { while (nb_sector--) { // Write the next sector. at45dbx_write_multiple_sector_callback(sector_buf); at45dbx_write_sector_from_ram(sector_buf); } return OK; } //! @} /*! \name Single-Sector Access Functions */ //! @{ Bool at45dbx_read_sector_2_ram(void *ram) { U8 *_ram = ram; U16 i; U16 data; // Memory busy. if (at45dbx_busy) { // Being here, we know that we previously finished a page read. // => We have to access the next page. // Memory ready. at45dbx_busy = FALSE; // Eventually select the next DF and open the next page. // NOTE: at45dbx_read_open input parameter is a sector. at45dbx_read_open(gl_ptr_mem >> AT45DBX_SECTOR_BITS); // gl_ptr_mem / AT45DBX_SECTOR_SIZE. } // Read the next sector. for (i = AT45DBX_SECTOR_SIZE; i; i--) { // Send a dummy byte to read the next data byte. spi_write_dummy(); spi_read(AT45DBX_SPI, &data); *_ram++ = data; } // Update the memory pointer. gl_ptr_mem += AT45DBX_SECTOR_SIZE; #if AT45DBX_PAGE_SIZE > AT45DBX_SECTOR_SIZE // If end of page reached, if (!Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE)) #endif { // unselect the DF memory gl_ptr_mem points to. at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); // Memory busy. at45dbx_busy = TRUE; } return OK; } Bool at45dbx_write_sector_from_ram(const void *ram) { const U8 *_ram = ram; U16 i; // Memory busy. if (at45dbx_busy) { // Being here, we know that we previously launched a page programming. // => We have to access the next page. // Eventually select the next DF and open the next page. // NOTE: at45dbx_write_open input parameter is a sector. at45dbx_write_open(gl_ptr_mem >> AT45DBX_SECTOR_BITS); // gl_ptr_mem / AT45DBX_SECTOR_SIZE. } // Write the next sector. for (i = AT45DBX_SECTOR_SIZE; i; i--) { // Write the next data byte. spi_write(AT45DBX_SPI, *_ram++); } // Update the memory pointer. gl_ptr_mem += AT45DBX_SECTOR_SIZE; #if AT45DBX_PAGE_SIZE > AT45DBX_SECTOR_SIZE // If end of page reached, if (!Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE)) #endif { // unselect the DF memory gl_ptr_mem points to in order to program the page. at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); // Memory busy. at45dbx_busy = TRUE; } return OK; } //! @} #endif // AT45DBX_MEM == ENABLE ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Management of the AT45DBX data flash controller through SPI. * * This file manages the accesses to the AT45DBX data flash components. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with an SPI module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _AT45DBX_H_ #define _AT45DBX_H_ #include "conf_access.h" #if AT45DBX_MEM == DISABLE #error at45dbx.h is #included although AT45DBX_MEM is disabled #endif #include "spi.h" //_____ D E F I N I T I O N S ______________________________________________ /*! \name Available AT45DBX Sizes * * Number of address bits of available AT45DBX data flash memories. * * \note Only memories with page sizes of at least 512 bytes (sector size) are * supported. */ //! @{ #define AT45DBX_1MB 20 #define AT45DBX_2MB 21 #define AT45DBX_4MB 22 #define AT45DBX_8MB 23 //! @} // AT45DBX_1MB #define AT45DBX_SECTOR_BITS 8 //! Number of bits for addresses within sectors. // AT45DBX_2MB AT45DBX_4MB AT45DBX_8MB //#define AT45DBX_SECTOR_BITS 9 //! Number of bits for addresses within sectors. //! Sector size in bytes. #define AT45DBX_SECTOR_SIZE (1 << AT45DBX_SECTOR_BITS) //_____ D E C L A R A T I O N S ____________________________________________ /*! \name Control Functions */ //! @{ /*! \brief Initializes the data flash controller and the SPI channel by which * the DF is controlled. * * \param spiOptions Initialization options of the DF SPI channel. * \param pba_hz SPI module input clock frequency (PBA clock, Hz). * * \retval OK Success. * \retval KO Failure. */ extern Bool at45dbx_init(spi_options_t spiOptions, unsigned int pba_hz); /*! \brief Performs a memory check on all DFs. * * \retval OK Success. * \retval KO Failure. */ extern Bool at45dbx_mem_check(void); /*! \brief Opens a DF memory in read mode at a given sector. * * \param sector Start sector. * * \retval OK Success. * \retval KO Failure. * * \note Sector may be page-unaligned (depending on the DF page size). */ extern Bool at45dbx_read_open(U32 sector); /*! \brief Unselects the current DF memory. */ extern void at45dbx_read_close(void); /*! \brief This function opens a DF memory in write mode at a given sector. * * \param sector Start sector. * * \retval OK Success. * \retval KO Failure. * * \note Sector may be page-unaligned (depending on the DF page size). * * \note If \ref AT45DBX_PAGE_SIZE > \ref AT45DBX_SECTOR_SIZE, page content is * first loaded in buffer to then be partially updated by write byte or * write sector functions. */ extern Bool at45dbx_write_open(U32 sector); /*! \brief Fills the end of the current logical sector and launches page programming. */ extern void at45dbx_write_close(void); //! @} /*! \name Single-Byte Access Functions */ //! @{ /*! \brief Performs a single byte read from DF memory. * * \return The read byte. * * \note First call must be preceded by a call to the \ref at45dbx_read_open * function. */ extern U8 at45dbx_read_byte(void); /*! \brief Performs a single byte write to DF memory. * * \param b The byte to write. * * \retval OK Success. * \retval KO Failure. * * \note First call must be preceded by a call to the \ref at45dbx_write_open * function. */ extern Bool at45dbx_write_byte(U8 b); //! @} /*! \name Multiple-Sector Access Functions */ //! @{ /*! \brief Reads \a nb_sector sectors from DF memory. * * Data flow is: DF -> callback. * * \param nb_sector Number of contiguous sectors to read. * * \retval OK Success. * \retval KO Failure. * * \note First call must be preceded by a call to the \ref at45dbx_read_open * function. * * \note As \ref AT45DBX_PAGE_SIZE is always a multiple of * \ref AT45DBX_SECTOR_SIZE, there is no need to check page end for each * byte. */ extern Bool at45dbx_read_multiple_sector(U16 nb_sector); /*! \brief Callback function invoked after each sector read during * \ref at45dbx_read_multiple_sector. * * \param psector Pointer to read sector. */ extern void at45dbx_read_multiple_sector_callback(const void *psector); /*! \brief Writes \a nb_sector sectors to DF memory. * * Data flow is: callback -> DF. * * \param nb_sector Number of contiguous sectors to write. * * \retval OK Success. * \retval KO Failure. * * \note First call must be preceded by a call to the \ref at45dbx_write_open * function. * * \note As \ref AT45DBX_PAGE_SIZE is always a multiple of * \ref AT45DBX_SECTOR_SIZE, there is no need to check page end for each * byte. */ extern Bool at45dbx_write_multiple_sector(U16 nb_sector); /*! \brief Callback function invoked before each sector write during * \ref at45dbx_write_multiple_sector. * * \param psector Pointer to sector to write. */ extern void at45dbx_write_multiple_sector_callback(void *psector); //! @} /*! \name Single-Sector Access Functions */ //! @{ /*! \brief Reads 1 DF sector to a RAM buffer. * * Data flow is: DF -> RAM. * * \param ram Pointer to RAM buffer. * * \retval OK Success. * \retval KO Failure. * * \note First call must be preceded by a call to the \ref at45dbx_read_open * function. */ extern Bool at45dbx_read_sector_2_ram(void *ram); /*! \brief Writes 1 DF sector from a RAM buffer. * * Data flow is: RAM -> DF. * * \param ram Pointer to RAM buffer. * * \retval OK Success. * \retval KO Failure. * * \note First call must be preceded by a call to the \ref at45dbx_write_open * function. */ extern Bool at45dbx_write_sector_from_ram(const void *ram); //! @} #endif // _AT45DBX_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief CTRL_ACCESS interface for the AT45DBX data flash controller. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with an SPI module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ //_____ I N C L U D E S ___________________________________________________ #include "conf_access.h" #if AT45DBX_MEM == ENABLE #include "conf_at45dbx.h" #include "at45dbx.h" #include "at45dbx_mem.h" //_____ D E F I N I T I O N S ______________________________________________ //! Whether to detect write accesses to the memory. #define AT45DBX_MEM_TEST_CHANGE_STATE ENABLED #if (ACCESS_USB == ENABLED || ACCESS_MEM_TO_RAM == ENABLED) && AT45DBX_MEM_TEST_CHANGE_STATE == ENABLED //! Memory data modified flag. static volatile Bool s_b_data_modify = FALSE; #endif /*! \name Control Interface */ //! @{ Ctrl_status at45dbx_test_unit_ready(void) { return (at45dbx_mem_check() == OK) ? CTRL_GOOD : CTRL_NO_PRESENT; } Ctrl_status at45dbx_read_capacity(U32 *u32_nb_sector) { *u32_nb_sector = (AT45DBX_MEM_CNT << (AT45DBX_MEM_SIZE - AT45DBX_SECTOR_BITS)) - 1; return CTRL_GOOD; } Bool at45dbx_wr_protect(void) { return FALSE; } Bool at45dbx_removal(void) { return FALSE; } //! @} #if ACCESS_USB == ENABLED #include "usb_drv.h" #include "scsi_decoder.h" /*! \name MEM <-> USB Interface */ //! @{ Ctrl_status at45dbx_usb_read_10(U32 addr, U16 nb_sector) { if (addr + nb_sector > AT45DBX_MEM_CNT << (AT45DBX_MEM_SIZE - AT45DBX_SECTOR_BITS)) return CTRL_FAIL; at45dbx_read_open(addr); at45dbx_read_multiple_sector(nb_sector); at45dbx_read_close(); return CTRL_GOOD; } void at45dbx_read_multiple_sector_callback(const void *psector) { U16 data_to_transfer = AT45DBX_SECTOR_SIZE; // Transfer read sector to the USB interface. while (data_to_transfer) { while (!Is_usb_in_ready(g_scsi_ep_ms_in)) { if(!Is_usb_endpoint_enabled(g_scsi_ep_ms_in)) return; // USB Reset } Usb_reset_endpoint_fifo_access(g_scsi_ep_ms_in); data_to_transfer = usb_write_ep_txpacket(g_scsi_ep_ms_in, psector, data_to_transfer, &psector); Usb_ack_in_ready_send(g_scsi_ep_ms_in); } } Ctrl_status at45dbx_usb_write_10(U32 addr, U16 nb_sector) { if (addr + nb_sector > AT45DBX_MEM_CNT << (AT45DBX_MEM_SIZE - AT45DBX_SECTOR_BITS)) return CTRL_FAIL; #if AT45DBX_MEM_TEST_CHANGE_STATE == ENABLED if (nb_sector) s_b_data_modify = TRUE; #endif at45dbx_write_open(addr); at45dbx_write_multiple_sector(nb_sector); at45dbx_write_close(); return CTRL_GOOD; } void at45dbx_write_multiple_sector_callback(void *psector) { U16 data_to_transfer = AT45DBX_SECTOR_SIZE; // Transfer sector to write from the USB interface. while (data_to_transfer) { while (!Is_usb_out_received(g_scsi_ep_ms_out)) { if(!Is_usb_endpoint_enabled(g_scsi_ep_ms_out)) return; // USB Reset } Usb_reset_endpoint_fifo_access(g_scsi_ep_ms_out); data_to_transfer = usb_read_ep_rxpacket(g_scsi_ep_ms_out, psector, data_to_transfer, &psector); Usb_ack_out_received_free(g_scsi_ep_ms_out); } } //! @} #endif // ACCESS_USB == ENABLED #if ACCESS_MEM_TO_RAM == ENABLED /*! \name MEM <-> RAM Interface */ //! @{ Ctrl_status at45dbx_df_2_ram(U32 addr, void *ram) { if (addr + 1 > AT45DBX_MEM_CNT << (AT45DBX_MEM_SIZE - AT45DBX_SECTOR_BITS)) return CTRL_FAIL; at45dbx_read_open(addr); at45dbx_read_sector_2_ram(ram); at45dbx_read_close(); return CTRL_GOOD; } Ctrl_status at45dbx_ram_2_df(U32 addr, const void *ram) { if (addr + 1 > AT45DBX_MEM_CNT << (AT45DBX_MEM_SIZE - AT45DBX_SECTOR_BITS)) return CTRL_FAIL; #if AT45DBX_MEM_TEST_CHANGE_STATE == ENABLED s_b_data_modify = TRUE; #endif at45dbx_write_open(addr); at45dbx_write_sector_from_ram(ram); at45dbx_write_close(); return CTRL_GOOD; } //! @} #endif // ACCESS_MEM_TO_RAM == ENABLED #endif // AT45DBX_MEM == ENABLE ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief CTRL_ACCESS interface for the AT45DBX data flash controller. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with an SPI module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _AT45DBX_MEM_H_ #define _AT45DBX_MEM_H_ #include "conf_access.h" #if AT45DBX_MEM == DISABLE #error at45dbx_mem.h is #included although AT45DBX_MEM is disabled #endif #include "ctrl_access.h" //_____ D E C L A R A T I O N S ____________________________________________ /*! \name Control Interface */ //! @{ /*! \brief Tests the memory state and initializes the memory if required. * * The TEST UNIT READY SCSI primary command allows an application client to poll * a LUN until it is ready without having to allocate memory for returned data. * * This command may be used to check the media status of LUNs with removable * media. * * \return Status. */ extern Ctrl_status at45dbx_test_unit_ready(void); /*! \brief Returns the address of the last valid sector in the memory. * * \param u32_nb_sector Pointer to the address of the last valid sector. * * \return Status. */ extern Ctrl_status at45dbx_read_capacity(U32 *u32_nb_sector); /*! \brief Returns the write-protection state of the memory. * * \return \c TRUE if the memory is write-protected, else \c FALSE. * * \note Only used by removable memories with hardware-specific write * protection. */ extern Bool at45dbx_wr_protect(void); /*! \brief Tells whether the memory is removable. * * \return \c TRUE if the memory is removable, else \c FALSE. */ extern Bool at45dbx_removal(void); //! @} #if ACCESS_USB == ENABLED /*! \name MEM <-> USB Interface */ //! @{ /*! \brief Tranfers data from the memory to USB. * * \param addr Address of first memory sector to read. * \param nb_sector Number of sectors to transfer. * * \return Status. */ extern Ctrl_status at45dbx_usb_read_10(U32 addr, U16 nb_sector); /*! \brief Tranfers data from USB to the memory. * * \param addr Address of first memory sector to write. * \param nb_sector Number of sectors to transfer. * * \return Status. */ extern Ctrl_status at45dbx_usb_write_10(U32 addr, U16 nb_sector); //! @} #endif #if ACCESS_MEM_TO_RAM == ENABLED /*! \name MEM <-> RAM Interface */ //! @{ /*! \brief Copies 1 data sector from the memory to RAM. * * \param addr Address of first memory sector to read. * \param ram Pointer to RAM buffer to write. * * \return Status. */ extern Ctrl_status at45dbx_df_2_ram(U32 addr, void *ram); /*! \brief Copies 1 data sector from RAM to the memory. * * \param addr Address of first memory sector to write. * \param ram Pointer to RAM buffer to read. * * \return Status. */ extern Ctrl_status at45dbx_ram_2_df(U32 addr, const void *ram); //! @} #endif #endif // _AT45DBX_MEM_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC/flashc.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief FLASHC driver for AVR32 UC3. * * AVR32 Flash Controller driver module. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a FLASHC module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include #include #include "compiler.h" #include "flashc.h" /*! \name FLASHC Writable Bit-Field Registers */ //! @{ typedef union { unsigned long fcr; avr32_flashc_fcr_t FCR; } u_avr32_flashc_fcr_t; typedef union { unsigned long fcmd; avr32_flashc_fcmd_t FCMD; } u_avr32_flashc_fcmd_t; //! @} /*! \name Flash Properties */ //! @{ unsigned int flashc_get_flash_size(void) { #if (defined AVR32_FLASHC_300_H_INCLUDED) static const unsigned int FLASH_SIZE[1 << AVR32_FLASHC_PR_FSZ_SIZE] = { 32 << 10, 64 << 10, 128 << 10, 256 << 10, 384 << 10, 512 << 10, 768 << 10, 1024 << 10 }; return FLASH_SIZE[(AVR32_FLASHC.pr & AVR32_FLASHC_PR_FSZ_MASK) >> AVR32_FLASHC_PR_FSZ_OFFSET]; #else static const unsigned int FLASH_SIZE[1 << AVR32_FLASHC_FSR_FSZ_SIZE] = { 32 << 10, 64 << 10, 128 << 10, 256 << 10, 384 << 10, 512 << 10, 768 << 10, 1024 << 10 }; return FLASH_SIZE[(AVR32_FLASHC.fsr & AVR32_FLASHC_FSR_FSZ_MASK) >> AVR32_FLASHC_FSR_FSZ_OFFSET]; #endif } unsigned int flashc_get_page_count(void) { return flashc_get_flash_size() / AVR32_FLASHC_PAGE_SIZE; } unsigned int flashc_get_page_count_per_region(void) { return flashc_get_page_count() / AVR32_FLASHC_REGIONS; } unsigned int flashc_get_page_region(int page_number) { return ((page_number >= 0) ? page_number : flashc_get_page_number()) / flashc_get_page_count_per_region(); } unsigned int flashc_get_region_first_page_number(unsigned int region) { return region * flashc_get_page_count_per_region(); } //! @} /*! \name FLASHC Control */ //! @{ unsigned int flashc_get_wait_state(void) { return (AVR32_FLASHC.fcr & AVR32_FLASHC_FCR_FWS_MASK) >> AVR32_FLASHC_FCR_FWS_OFFSET; } void flashc_set_wait_state(unsigned int wait_state) { u_avr32_flashc_fcr_t u_avr32_flashc_fcr = {AVR32_FLASHC.fcr}; u_avr32_flashc_fcr.FCR.fws = wait_state; AVR32_FLASHC.fcr = u_avr32_flashc_fcr.fcr; } Bool flashc_is_ready_int_enabled(void) { return ((AVR32_FLASHC.fcr & AVR32_FLASHC_FCR_FRDY_MASK) != 0); } void flashc_enable_ready_int(Bool enable) { u_avr32_flashc_fcr_t u_avr32_flashc_fcr = {AVR32_FLASHC.fcr}; u_avr32_flashc_fcr.FCR.frdy = (enable != FALSE); AVR32_FLASHC.fcr = u_avr32_flashc_fcr.fcr; } Bool flashc_is_lock_error_int_enabled(void) { return ((AVR32_FLASHC.fcr & AVR32_FLASHC_FCR_LOCKE_MASK) != 0); } void flashc_enable_lock_error_int(Bool enable) { u_avr32_flashc_fcr_t u_avr32_flashc_fcr = {AVR32_FLASHC.fcr}; u_avr32_flashc_fcr.FCR.locke = (enable != FALSE); AVR32_FLASHC.fcr = u_avr32_flashc_fcr.fcr; } Bool flashc_is_prog_error_int_enabled(void) { return ((AVR32_FLASHC.fcr & AVR32_FLASHC_FCR_PROGE_MASK) != 0); } void flashc_enable_prog_error_int(Bool enable) { u_avr32_flashc_fcr_t u_avr32_flashc_fcr = {AVR32_FLASHC.fcr}; u_avr32_flashc_fcr.FCR.proge = (enable != FALSE); AVR32_FLASHC.fcr = u_avr32_flashc_fcr.fcr; } //! @} /*! \name FLASHC Status */ //! @{ Bool flashc_is_ready(void) { return ((AVR32_FLASHC.fsr & AVR32_FLASHC_FSR_FRDY_MASK) != 0); } void flashc_default_wait_until_ready(void) { while (!flashc_is_ready()); } void (*volatile flashc_wait_until_ready)(void) = flashc_default_wait_until_ready; /*! \brief Gets the error status of the FLASHC. * * \return The error status of the FLASHC built up from * \c AVR32_FLASHC_FSR_LOCKE_MASK and \c AVR32_FLASHC_FSR_PROGE_MASK. * * \warning This hardware error status is cleared by all functions reading the * Flash Status Register (FSR). This function is therefore not part of * the driver's API which instead presents \ref flashc_is_lock_error * and \ref flashc_is_programming_error. */ static unsigned int flashc_get_error_status(void) { return AVR32_FLASHC.fsr & (AVR32_FLASHC_FSR_LOCKE_MASK | AVR32_FLASHC_FSR_PROGE_MASK); } //! Sticky error status of the FLASHC. //! This variable is updated by functions that issue FLASHC commands. It //! contains the cumulated FLASHC error status of all the FLASHC commands issued //! by a function. static unsigned int flashc_error_status = 0; Bool flashc_is_lock_error(void) { return ((flashc_error_status & AVR32_FLASHC_FSR_LOCKE_MASK) != 0); } Bool flashc_is_programming_error(void) { return ((flashc_error_status & AVR32_FLASHC_FSR_PROGE_MASK) != 0); } //! @} /*! \name FLASHC Command Control */ //! @{ unsigned int flashc_get_command(void) { return (AVR32_FLASHC.fcmd & AVR32_FLASHC_FCMD_CMD_MASK) >> AVR32_FLASHC_FCMD_CMD_OFFSET; } unsigned int flashc_get_page_number(void) { return (AVR32_FLASHC.fcmd & AVR32_FLASHC_FCMD_PAGEN_MASK) >> AVR32_FLASHC_FCMD_PAGEN_OFFSET; } void flashc_issue_command(unsigned int command, int page_number) { u_avr32_flashc_fcmd_t u_avr32_flashc_fcmd; flashc_wait_until_ready(); u_avr32_flashc_fcmd.fcmd = AVR32_FLASHC.fcmd; u_avr32_flashc_fcmd.FCMD.cmd = command; if (page_number >= 0) u_avr32_flashc_fcmd.FCMD.pagen = page_number; u_avr32_flashc_fcmd.FCMD.key = AVR32_FLASHC_FCMD_KEY_KEY; AVR32_FLASHC.fcmd = u_avr32_flashc_fcmd.fcmd; flashc_error_status = flashc_get_error_status(); flashc_wait_until_ready(); } //! @} /*! \name FLASHC Global Commands */ //! @{ void flashc_no_operation(void) { flashc_issue_command(AVR32_FLASHC_FCMD_CMD_NOP, -1); } void flashc_erase_all(void) { flashc_issue_command(AVR32_FLASHC_FCMD_CMD_EA, -1); } //! @} /*! \name FLASHC Protection Mechanisms */ //! @{ Bool flashc_is_security_bit_active(void) { return ((AVR32_FLASHC.fsr & AVR32_FLASHC_FSR_SECURITY_MASK) != 0); } void flashc_activate_security_bit(void) { flashc_issue_command(AVR32_FLASHC_FCMD_CMD_SSB, -1); } unsigned int flashc_get_bootloader_protected_size(void) { unsigned int bootprot = (1 << AVR32_FLASHC_FGPFRLO_BOOTPROT_SIZE) - 1 - flashc_read_gp_fuse_bitfield(AVR32_FLASHC_FGPFRLO_BOOTPROT_OFFSET, AVR32_FLASHC_FGPFRLO_BOOTPROT_SIZE); return (bootprot) ? AVR32_FLASHC_PAGE_SIZE << bootprot : 0; } unsigned int flashc_set_bootloader_protected_size(unsigned int bootprot_size) { flashc_set_gp_fuse_bitfield(AVR32_FLASHC_FGPFRLO_BOOTPROT_OFFSET, AVR32_FLASHC_FGPFRLO_BOOTPROT_SIZE, (1 << AVR32_FLASHC_FGPFRLO_BOOTPROT_SIZE) - 1 - ((bootprot_size) ? 32 - clz((((min(max(bootprot_size, AVR32_FLASHC_PAGE_SIZE << 1), AVR32_FLASHC_PAGE_SIZE << ((1 << AVR32_FLASHC_FGPFRLO_BOOTPROT_SIZE) - 1)) + AVR32_FLASHC_PAGE_SIZE - 1) / AVR32_FLASHC_PAGE_SIZE) << 1) - 1) - 1 : 0)); return flashc_get_bootloader_protected_size(); } Bool flashc_is_external_privileged_fetch_locked(void) { return (!flashc_read_gp_fuse_bit(AVR32_FLASHC_FGPFRLO_EPFL_OFFSET)); } void flashc_lock_external_privileged_fetch(Bool lock) { flashc_set_gp_fuse_bit(AVR32_FLASHC_FGPFRLO_EPFL_OFFSET, !lock); } Bool flashc_is_page_region_locked(int page_number) { return flashc_is_region_locked(flashc_get_page_region(page_number)); } Bool flashc_is_region_locked(unsigned int region) { return ((AVR32_FLASHC.fsr & AVR32_FLASHC_FSR_LOCK0_MASK << (region & (AVR32_FLASHC_REGIONS - 1))) != 0); } void flashc_lock_page_region(int page_number, Bool lock) { flashc_issue_command((lock) ? AVR32_FLASHC_FCMD_CMD_LP : AVR32_FLASHC_FCMD_CMD_UP, page_number); } void flashc_lock_region(unsigned int region, Bool lock) { flashc_lock_page_region(flashc_get_region_first_page_number(region), lock); } void flashc_lock_all_regions(Bool lock) { unsigned int error_status = 0; unsigned int region = AVR32_FLASHC_REGIONS; while (region) { flashc_lock_region(--region, lock); error_status |= flashc_error_status; } flashc_error_status = error_status; } //! @} /*! \name Access to General-Purpose Fuses */ //! @{ Bool flashc_read_gp_fuse_bit(unsigned int gp_fuse_bit) { return ((flashc_read_all_gp_fuses() & 1ULL << (gp_fuse_bit & 0x3F)) != 0); } U64 flashc_read_gp_fuse_bitfield(unsigned int pos, unsigned int width) { return flashc_read_all_gp_fuses() >> (pos & 0x3F) & ((1ULL << min(width, 64)) - 1); } U8 flashc_read_gp_fuse_byte(unsigned int gp_fuse_byte) { return flashc_read_all_gp_fuses() >> ((gp_fuse_byte & 0x07) << 3); } U64 flashc_read_all_gp_fuses(void) { return AVR32_FLASHC.fgpfrlo | (U64)AVR32_FLASHC.fgpfrhi << 32; } Bool flashc_erase_gp_fuse_bit(unsigned int gp_fuse_bit, Bool check) { flashc_issue_command(AVR32_FLASHC_FCMD_CMD_EGPB, gp_fuse_bit & 0x3F); return (check) ? flashc_read_gp_fuse_bit(gp_fuse_bit) : TRUE; } Bool flashc_erase_gp_fuse_bitfield(unsigned int pos, unsigned int width, Bool check) { unsigned int error_status = 0; unsigned int gp_fuse_bit; pos &= 0x3F; width = min(width, 64); for (gp_fuse_bit = pos; gp_fuse_bit < pos + width; gp_fuse_bit++) { flashc_erase_gp_fuse_bit(gp_fuse_bit, FALSE); error_status |= flashc_error_status; } flashc_error_status = error_status; return (check) ? (flashc_read_gp_fuse_bitfield(pos, width) == (1ULL << width) - 1) : TRUE; } Bool flashc_erase_gp_fuse_byte(unsigned int gp_fuse_byte, Bool check) { unsigned int error_status; unsigned int current_gp_fuse_byte; U64 value = flashc_read_all_gp_fuses(); flashc_erase_all_gp_fuses(FALSE); error_status = flashc_error_status; for (current_gp_fuse_byte = 0; current_gp_fuse_byte < 8; current_gp_fuse_byte++, value >>= 8) { if (current_gp_fuse_byte != gp_fuse_byte) { flashc_write_gp_fuse_byte(current_gp_fuse_byte, value); error_status |= flashc_error_status; } } flashc_error_status = error_status; return (check) ? (flashc_read_gp_fuse_byte(gp_fuse_byte) == 0xFF) : TRUE; } Bool flashc_erase_all_gp_fuses(Bool check) { flashc_issue_command(AVR32_FLASHC_FCMD_CMD_EAGPF, -1); return (check) ? (flashc_read_all_gp_fuses() == 0xFFFFFFFFFFFFFFFFULL) : TRUE; } void flashc_write_gp_fuse_bit(unsigned int gp_fuse_bit, Bool value) { if (!value) flashc_issue_command(AVR32_FLASHC_FCMD_CMD_WGPB, gp_fuse_bit & 0x3F); } void flashc_write_gp_fuse_bitfield(unsigned int pos, unsigned int width, U64 value) { unsigned int error_status = 0; unsigned int gp_fuse_bit; pos &= 0x3F; width = min(width, 64); for (gp_fuse_bit = pos; gp_fuse_bit < pos + width; gp_fuse_bit++, value >>= 1) { flashc_write_gp_fuse_bit(gp_fuse_bit, value & 0x01); error_status |= flashc_error_status; } flashc_error_status = error_status; } void flashc_write_gp_fuse_byte(unsigned int gp_fuse_byte, U8 value) { flashc_issue_command(AVR32_FLASHC_FCMD_CMD_PGPFB, (gp_fuse_byte & 0x07) | value << 3); } void flashc_write_all_gp_fuses(U64 value) { unsigned int error_status = 0; unsigned int gp_fuse_byte; for (gp_fuse_byte = 0; gp_fuse_byte < 8; gp_fuse_byte++, value >>= 8) { flashc_write_gp_fuse_byte(gp_fuse_byte, value); error_status |= flashc_error_status; } flashc_error_status = error_status; } void flashc_set_gp_fuse_bit(unsigned int gp_fuse_bit, Bool value) { if (value) flashc_erase_gp_fuse_bit(gp_fuse_bit, FALSE); else flashc_write_gp_fuse_bit(gp_fuse_bit, FALSE); } void flashc_set_gp_fuse_bitfield(unsigned int pos, unsigned int width, U64 value) { unsigned int error_status = 0; unsigned int gp_fuse_bit; pos &= 0x3F; width = min(width, 64); for (gp_fuse_bit = pos; gp_fuse_bit < pos + width; gp_fuse_bit++, value >>= 1) { flashc_set_gp_fuse_bit(gp_fuse_bit, value & 0x01); error_status |= flashc_error_status; } flashc_error_status = error_status; } void flashc_set_gp_fuse_byte(unsigned int gp_fuse_byte, U8 value) { unsigned int error_status; switch (value) { case 0xFF: flashc_erase_gp_fuse_byte(gp_fuse_byte, FALSE); break; case 0x00: flashc_write_gp_fuse_byte(gp_fuse_byte, 0x00); break; default: flashc_erase_gp_fuse_byte(gp_fuse_byte, FALSE); error_status = flashc_error_status; flashc_write_gp_fuse_byte(gp_fuse_byte, value); flashc_error_status |= error_status; } } void flashc_set_all_gp_fuses(U64 value) { unsigned int error_status; switch (value) { case 0xFFFFFFFFFFFFFFFFULL: flashc_erase_all_gp_fuses(FALSE); break; case 0x0000000000000000ULL: flashc_write_all_gp_fuses(0x0000000000000000ULL); break; default: flashc_erase_all_gp_fuses(FALSE); error_status = flashc_error_status; flashc_write_all_gp_fuses(value); flashc_error_status |= error_status; } } //! @} /*! \name Access to Flash Pages */ //! @{ void flashc_clear_page_buffer(void) { flashc_issue_command(AVR32_FLASHC_FCMD_CMD_CPB, -1); } Bool flashc_is_page_erased(void) { return ((AVR32_FLASHC.fsr & AVR32_FLASHC_FSR_QPRR_MASK) != 0); } Bool flashc_quick_page_read(int page_number) { flashc_issue_command(AVR32_FLASHC_FCMD_CMD_QPR, page_number); return flashc_is_page_erased(); } Bool flashc_erase_page(int page_number, Bool check) { Bool page_erased = TRUE; flashc_issue_command(AVR32_FLASHC_FCMD_CMD_EP, page_number); if (check) { unsigned int error_status = flashc_error_status; page_erased = flashc_quick_page_read(-1); flashc_error_status |= error_status; } return page_erased; } Bool flashc_erase_all_pages(Bool check) { Bool all_pages_erased = TRUE; unsigned int error_status = 0; unsigned int page_number = flashc_get_page_count(); while (page_number) { all_pages_erased &= flashc_erase_page(--page_number, check); error_status |= flashc_error_status; } flashc_error_status = error_status; return all_pages_erased; } void flashc_write_page(int page_number) { flashc_issue_command(AVR32_FLASHC_FCMD_CMD_WP, page_number); } Bool flashc_quick_user_page_read(void) { flashc_issue_command(AVR32_FLASHC_FCMD_CMD_QPRUP, -1); return flashc_is_page_erased(); } Bool flashc_erase_user_page(Bool check) { flashc_issue_command(AVR32_FLASHC_FCMD_CMD_EUP, -1); return (check) ? flashc_quick_user_page_read() : TRUE; } void flashc_write_user_page(void) { flashc_issue_command(AVR32_FLASHC_FCMD_CMD_WUP, -1); } volatile void *flashc_memset8(volatile void *dst, U8 src, size_t nbytes, Bool erase) { return flashc_memset16(dst, src | (U16)src << 8, nbytes, erase); } volatile void *flashc_memset16(volatile void *dst, U16 src, size_t nbytes, Bool erase) { return flashc_memset32(dst, src | (U32)src << 16, nbytes, erase); } volatile void *flashc_memset32(volatile void *dst, U32 src, size_t nbytes, Bool erase) { return flashc_memset64(dst, src | (U64)src << 32, nbytes, erase); } volatile void *flashc_memset64(volatile void *dst, U64 src, size_t nbytes, Bool erase) { // Use aggregated pointers to have several alignments available for a same address. UnionCVPtr flash_array_end; UnionVPtr dest; Union64 source = {0}; StructCVPtr dest_end; UnionCVPtr flash_page_source_end; Bool incomplete_flash_page_end; Union64 flash_dword; UnionVPtr tmp; unsigned int error_status = 0; unsigned int i; // Reformat arguments. flash_array_end.u8ptr = AVR32_FLASH + flashc_get_flash_size(); dest.u8ptr = dst; for (i = (Get_align((U32)dest.u8ptr, sizeof(U64)) - 1) & (sizeof(U64) - 1); src; i = (i - 1) & (sizeof(U64) - 1)) { source.u8[i] = src; src >>= 8; } dest_end.u8ptr = dest.u8ptr + nbytes; // If destination is outside flash, go to next flash page if any. if (dest.u8ptr < AVR32_FLASH) { dest.u8ptr = AVR32_FLASH; } else if (flash_array_end.u8ptr <= dest.u8ptr && dest.u8ptr < AVR32_FLASHC_USER_PAGE) { dest.u8ptr = AVR32_FLASHC_USER_PAGE; } // If end of destination is outside flash, move it to the end of the previous flash page if any. if (dest_end.u8ptr > AVR32_FLASHC_USER_PAGE + AVR32_FLASHC_USER_PAGE_SIZE) { dest_end.u8ptr = AVR32_FLASHC_USER_PAGE + AVR32_FLASHC_USER_PAGE_SIZE; } else if (AVR32_FLASHC_USER_PAGE >= dest_end.u8ptr && dest_end.u8ptr > flash_array_end.u8ptr) { dest_end.u8ptr = flash_array_end.u8ptr; } // Align each end of destination pointer with its natural boundary. dest_end.u16ptr = (U16 *)Align_down((U32)dest_end.u8ptr, sizeof(U16)); dest_end.u32ptr = (U32 *)Align_down((U32)dest_end.u16ptr, sizeof(U32)); dest_end.u64ptr = (U64 *)Align_down((U32)dest_end.u32ptr, sizeof(U64)); // While end of destination is not reached... while (dest.u8ptr < dest_end.u8ptr) { // Clear the page buffer in order to prepare data for a flash page write. flashc_clear_page_buffer(); error_status |= flashc_error_status; // Determine where the source data will end in the current flash page. flash_page_source_end.u64ptr = (U64 *)min((U32)dest_end.u64ptr, Align_down((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE) + AVR32_FLASHC_PAGE_SIZE); // Determine if the current destination page has an incomplete end. incomplete_flash_page_end = (Align_down((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE) >= Align_down((U32)dest_end.u8ptr, AVR32_FLASHC_PAGE_SIZE)); // Use a flash double-word buffer to manage unaligned accesses. flash_dword.u64 = source.u64; // If destination does not point to the beginning of the current flash page... if (!Test_align((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE)) { // Fill the beginning of the page buffer with the current flash page data. // This is required by the hardware, even if page erase is not requested, // in order to be able to write successfully to erased parts of flash // pages that have already been written to. for (tmp.u8ptr = (U8 *)Align_down((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE); tmp.u64ptr < (U64 *)Align_down((U32)dest.u8ptr, sizeof(U64)); tmp.u64ptr++) *tmp.u64ptr = *tmp.u64ptr; // If destination is not 64-bit aligned... if (!Test_align((U32)dest.u8ptr, sizeof(U64))) { // Fill the beginning of the flash double-word buffer with the current // flash page data. // This is required by the hardware, even if page erase is not // requested, in order to be able to write successfully to erased parts // of flash pages that have already been written to. for (i = 0; i < Get_align((U32)dest.u8ptr, sizeof(U64)); i++) flash_dword.u8[i] = *tmp.u8ptr++; // Align the destination pointer with its 64-bit boundary. dest.u64ptr = (U64 *)Align_down((U32)dest.u8ptr, sizeof(U64)); // If the current destination double-word is not the last one... if (dest.u64ptr < dest_end.u64ptr) { // Write the flash double-word buffer to the page buffer and reinitialize it. *dest.u64ptr++ = flash_dword.u64; flash_dword.u64 = source.u64; } } } // Write the source data to the page buffer with 64-bit alignment. for (i = flash_page_source_end.u64ptr - dest.u64ptr; i; i--) *dest.u64ptr++ = source.u64; // If the current destination page has an incomplete end... if (incomplete_flash_page_end) { // This is required by the hardware, even if page erase is not requested, // in order to be able to write successfully to erased parts of flash // pages that have already been written to. { tmp.u8ptr = (volatile U8 *)dest_end.u8ptr; // If end of destination is not 64-bit aligned... if (!Test_align((U32)dest_end.u8ptr, sizeof(U64))) { // Fill the end of the flash double-word buffer with the current flash page data. for (i = Get_align((U32)dest_end.u8ptr, sizeof(U64)); i < sizeof(U64); i++) flash_dword.u8[i] = *tmp.u8ptr++; // Write the flash double-word buffer to the page buffer. *dest.u64ptr++ = flash_dword.u64; } // Fill the end of the page buffer with the current flash page data. for (; !Test_align((U32)tmp.u64ptr, AVR32_FLASHC_PAGE_SIZE); tmp.u64ptr++) *tmp.u64ptr = *tmp.u64ptr; } } // If the current flash page is in the flash array... if (dest.u8ptr <= AVR32_FLASHC_USER_PAGE) { // Erase the current page if requested and write it from the page buffer. if (erase) { flashc_erase_page(-1, FALSE); error_status |= flashc_error_status; } flashc_write_page(-1); error_status |= flashc_error_status; // If the end of the flash array is reached, go to the User page. if (dest.u8ptr >= flash_array_end.u8ptr) dest.u8ptr = AVR32_FLASHC_USER_PAGE; } // If the current flash page is the User page... else { // Erase the User page if requested and write it from the page buffer. if (erase) { flashc_erase_user_page(FALSE); error_status |= flashc_error_status; } flashc_write_user_page(); error_status |= flashc_error_status; } } // Update the FLASHC error status. flashc_error_status = error_status; // Return the initial destination pointer as the standard memset function does. return dst; } volatile void *flashc_memcpy(volatile void *dst, const void *src, size_t nbytes, Bool erase) { // Use aggregated pointers to have several alignments available for a same address. UnionCVPtr flash_array_end; UnionVPtr dest; UnionCPtr source; StructCVPtr dest_end; UnionCVPtr flash_page_source_end; Bool incomplete_flash_page_end; Union64 flash_dword; Bool flash_dword_pending = FALSE; UnionVPtr tmp; unsigned int error_status = 0; unsigned int i, j; // Reformat arguments. flash_array_end.u8ptr = AVR32_FLASH + flashc_get_flash_size(); dest.u8ptr = dst; source.u8ptr = src; dest_end.u8ptr = dest.u8ptr + nbytes; // If destination is outside flash, go to next flash page if any. if (dest.u8ptr < AVR32_FLASH) { source.u8ptr += AVR32_FLASH - dest.u8ptr; dest.u8ptr = AVR32_FLASH; } else if (flash_array_end.u8ptr <= dest.u8ptr && dest.u8ptr < AVR32_FLASHC_USER_PAGE) { source.u8ptr += AVR32_FLASHC_USER_PAGE - dest.u8ptr; dest.u8ptr = AVR32_FLASHC_USER_PAGE; } // If end of destination is outside flash, move it to the end of the previous flash page if any. if (dest_end.u8ptr > AVR32_FLASHC_USER_PAGE + AVR32_FLASHC_USER_PAGE_SIZE) { dest_end.u8ptr = AVR32_FLASHC_USER_PAGE + AVR32_FLASHC_USER_PAGE_SIZE; } else if (AVR32_FLASHC_USER_PAGE >= dest_end.u8ptr && dest_end.u8ptr > flash_array_end.u8ptr) { dest_end.u8ptr = flash_array_end.u8ptr; } // Align each end of destination pointer with its natural boundary. dest_end.u16ptr = (U16 *)Align_down((U32)dest_end.u8ptr, sizeof(U16)); dest_end.u32ptr = (U32 *)Align_down((U32)dest_end.u16ptr, sizeof(U32)); dest_end.u64ptr = (U64 *)Align_down((U32)dest_end.u32ptr, sizeof(U64)); // While end of destination is not reached... while (dest.u8ptr < dest_end.u8ptr) { // Clear the page buffer in order to prepare data for a flash page write. flashc_clear_page_buffer(); error_status |= flashc_error_status; // Determine where the source data will end in the current flash page. flash_page_source_end.u64ptr = (U64 *)min((U32)dest_end.u64ptr, Align_down((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE) + AVR32_FLASHC_PAGE_SIZE); // Determine if the current destination page has an incomplete end. incomplete_flash_page_end = (Align_down((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE) >= Align_down((U32)dest_end.u8ptr, AVR32_FLASHC_PAGE_SIZE)); // If destination does not point to the beginning of the current flash page... if (!Test_align((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE)) { // Fill the beginning of the page buffer with the current flash page data. // This is required by the hardware, even if page erase is not requested, // in order to be able to write successfully to erased parts of flash // pages that have already been written to. for (tmp.u8ptr = (U8 *)Align_down((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE); tmp.u64ptr < (U64 *)Align_down((U32)dest.u8ptr, sizeof(U64)); tmp.u64ptr++) *tmp.u64ptr = *tmp.u64ptr; // If destination is not 64-bit aligned... if (!Test_align((U32)dest.u8ptr, sizeof(U64))) { // Fill the beginning of the flash double-word buffer with the current // flash page data. // This is required by the hardware, even if page erase is not // requested, in order to be able to write successfully to erased parts // of flash pages that have already been written to. for (i = 0; i < Get_align((U32)dest.u8ptr, sizeof(U64)); i++) flash_dword.u8[i] = *tmp.u8ptr++; // Fill the end of the flash double-word buffer with the source data. for (; i < sizeof(U64); i++) flash_dword.u8[i] = *source.u8ptr++; // Align the destination pointer with its 64-bit boundary. dest.u64ptr = (U64 *)Align_down((U32)dest.u8ptr, sizeof(U64)); // If the current destination double-word is not the last one... if (dest.u64ptr < dest_end.u64ptr) { // Write the flash double-word buffer to the page buffer. *dest.u64ptr++ = flash_dword.u64; } // If the current destination double-word is the last one, the flash // double-word buffer must be kept for later. else flash_dword_pending = TRUE; } } // Read the source data with the maximal possible alignment and write it to // the page buffer with 64-bit alignment. switch (Get_align((U32)source.u8ptr, sizeof(U32))) { case 0: for (i = flash_page_source_end.u64ptr - dest.u64ptr; i; i--) *dest.u64ptr++ = *source.u64ptr++; break; case sizeof(U16): for (i = flash_page_source_end.u64ptr - dest.u64ptr; i; i--) { for (j = 0; j < sizeof(U64) / sizeof(U16); j++) flash_dword.u16[j] = *source.u16ptr++; *dest.u64ptr++ = flash_dword.u64; } break; default: for (i = flash_page_source_end.u64ptr - dest.u64ptr; i; i--) { for (j = 0; j < sizeof(U64); j++) flash_dword.u8[j] = *source.u8ptr++; *dest.u64ptr++ = flash_dword.u64; } } // If the current destination page has an incomplete end... if (incomplete_flash_page_end) { // If the flash double-word buffer is in use, do not initialize it. if (flash_dword_pending) i = Get_align((U32)dest_end.u8ptr, sizeof(U64)); // If the flash double-word buffer is free... else { // Fill the beginning of the flash double-word buffer with the source data. for (i = 0; i < Get_align((U32)dest_end.u8ptr, sizeof(U64)); i++) flash_dword.u8[i] = *source.u8ptr++; } // This is required by the hardware, even if page erase is not requested, // in order to be able to write successfully to erased parts of flash // pages that have already been written to. { tmp.u8ptr = (volatile U8 *)dest_end.u8ptr; // If end of destination is not 64-bit aligned... if (!Test_align((U32)dest_end.u8ptr, sizeof(U64))) { // Fill the end of the flash double-word buffer with the current flash page data. for (; i < sizeof(U64); i++) flash_dword.u8[i] = *tmp.u8ptr++; // Write the flash double-word buffer to the page buffer. *dest.u64ptr++ = flash_dword.u64; } // Fill the end of the page buffer with the current flash page data. for (; !Test_align((U32)tmp.u64ptr, AVR32_FLASHC_PAGE_SIZE); tmp.u64ptr++) *tmp.u64ptr = *tmp.u64ptr; } } // If the current flash page is in the flash array... if (dest.u8ptr <= AVR32_FLASHC_USER_PAGE) { // Erase the current page if requested and write it from the page buffer. if (erase) { flashc_erase_page(-1, FALSE); error_status |= flashc_error_status; } flashc_write_page(-1); error_status |= flashc_error_status; // If the end of the flash array is reached, go to the User page. if (dest.u8ptr >= flash_array_end.u8ptr) { source.u8ptr += AVR32_FLASHC_USER_PAGE - dest.u8ptr; dest.u8ptr = AVR32_FLASHC_USER_PAGE; } } // If the current flash page is the User page... else { // Erase the User page if requested and write it from the page buffer. if (erase) { flashc_erase_user_page(FALSE); error_status |= flashc_error_status; } flashc_write_user_page(); error_status |= flashc_error_status; } } // Update the FLASHC error status. flashc_error_status = error_status; // Return the initial destination pointer as the standard memcpy function does. return dst; } #if UC3C void flashc_set_flash_waitstate_and_readmode(unsigned long cpu_f_hz) { //! Device-specific data #undef AVR32_FLASHC_FWS_0_MAX_FREQ #undef AVR32_FLASHC_FWS_1_MAX_FREQ #undef AVR32_FLASHC_HSEN_FWS_0_MAX_FREQ #undef AVR32_FLASHC_HSEN_FWS_1_MAX_FREQ #define AVR32_FLASHC_FWS_0_MAX_FREQ 33000000 #define AVR32_FLASHC_FWS_1_MAX_FREQ 66000000 #define AVR32_FLASHC_HSEN_FWS_0_MAX_FREQ 33000000 #define AVR32_FLASHC_HSEN_FWS_1_MAX_FREQ 72000000 // These defines are missing from or wrong in the toolchain header files uc3cxxx.h // Put a Bugzilla if(cpu_f_hz > AVR32_FLASHC_HSEN_FWS_0_MAX_FREQ) // > 33MHz { // Set a wait-state flashc_set_wait_state(1); if(cpu_f_hz <= AVR32_FLASHC_FWS_1_MAX_FREQ) // <= 66MHz and >33Mhz { // Disable the high-speed read mode. flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSDIS, -1); } else // > 66Mhz { // Enable the high-speed read mode. flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSEN, -1); } } else // <= 33 MHz { // Disable wait-state flashc_set_wait_state(0); // Disable the high-speed read mode. flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSDIS, -1); } } #endif // UC3C device-specific implementation //! @} ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC/flashc.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief FLASHC driver for AVR32 UC3. * * AVR32 Flash Controller driver module. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a FLASHC module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _FLASHC_H_ #define _FLASHC_H_ #include #include #include "compiler.h" //! Number of flash regions defined by the FLASHC. #define AVR32_FLASHC_REGIONS (AVR32_FLASHC_FLASH_SIZE /\ (AVR32_FLASHC_PAGES_PR_REGION * AVR32_FLASHC_PAGE_SIZE)) /*! \name Flash Properties */ //! @{ /*! \brief Gets the size of the whole flash array. * * \return The size of the whole flash array in bytes. */ extern unsigned int flashc_get_flash_size(void); /*! \brief Gets the total number of pages in the flash array. * * \return The total number of pages in the flash array. */ extern unsigned int flashc_get_page_count(void); /*! \brief Gets the number of pages in each flash region. * * \return The number of pages in each flash region. */ extern unsigned int flashc_get_page_count_per_region(void); /*! \brief Gets the region number of a page. * * \param page_number The page number: * \arg \c 0 to (flashc_get_page_count() - 1): a page number within * the flash array; * \arg < 0: the current page number. * * \return The region number of the specified page. */ extern unsigned int flashc_get_page_region(int page_number); /*! \brief Gets the number of the first page of a region. * * \param region The region number: \c 0 to (AVR32_FLASHC_REGIONS - 1). * * \return The number of the first page of the specified region. */ extern unsigned int flashc_get_region_first_page_number(unsigned int region); //! @} /*! \name FLASHC Control */ //! @{ /*! \brief Gets the number of wait states of flash read accesses. * * \return The number of wait states of flash read accesses. */ extern unsigned int flashc_get_wait_state(void); /*! \brief Sets the number of wait states of flash read accesses. * * \param wait_state The number of wait states of flash read accesses: \c 0 to * \c 1. */ extern void flashc_set_wait_state(unsigned int wait_state); /*! \brief Tells whether the Flash Ready interrupt is enabled. * * \return Whether the Flash Ready interrupt is enabled. */ extern Bool flashc_is_ready_int_enabled(void); /*! \brief Enables or disables the Flash Ready interrupt. * * \param enable Whether to enable the Flash Ready interrupt: \c TRUE or * \c FALSE. */ extern void flashc_enable_ready_int(Bool enable); /*! \brief Tells whether the Lock Error interrupt is enabled. * * \return Whether the Lock Error interrupt is enabled. */ extern Bool flashc_is_lock_error_int_enabled(void); /*! \brief Enables or disables the Lock Error interrupt. * * \param enable Whether to enable the Lock Error interrupt: \c TRUE or * \c FALSE. */ extern void flashc_enable_lock_error_int(Bool enable); /*! \brief Tells whether the Programming Error interrupt is enabled. * * \return Whether the Programming Error interrupt is enabled. */ extern Bool flashc_is_prog_error_int_enabled(void); /*! \brief Enables or disables the Programming Error interrupt. * * \param enable Whether to enable the Programming Error interrupt: \c TRUE or * \c FALSE. */ extern void flashc_enable_prog_error_int(Bool enable); //! @} /*! \name FLASHC Status */ //! @{ /*! \brief Tells whether the FLASHC is ready to run a new command. * * \return Whether the FLASHC is ready to run a new command. */ extern Bool flashc_is_ready(void); /*! \brief Waits actively until the FLASHC is ready to run a new command. * * This is the default function assigned to \ref flashc_wait_until_ready. */ extern void flashc_default_wait_until_ready(void); //! Pointer to the function used by the driver when it needs to wait until the //! FLASHC is ready to run a new command. //! The default function is \ref flashc_default_wait_until_ready. //! The user may change this pointer to use another implementation. extern void (*volatile flashc_wait_until_ready)(void); /*! \brief Tells whether a Lock Error has occurred during the last function * called that issued one or more FLASHC commands. * * \return Whether a Lock Error has occurred during the last function called * that issued one or more FLASHC commands. */ extern Bool flashc_is_lock_error(void); /*! \brief Tells whether a Programming Error has occurred during the last * function called that issued one or more FLASHC commands. * * \return Whether a Programming Error has occurred during the last function * called that issued one or more FLASHC commands. */ extern Bool flashc_is_programming_error(void); //! @} /*! \name FLASHC Command Control */ //! @{ /*! \brief Gets the last issued FLASHC command. * * \return The last issued FLASHC command. */ extern unsigned int flashc_get_command(void); /*! \brief Gets the current FLASHC page number. * * \return The current FLASHC page number. */ extern unsigned int flashc_get_page_number(void); /*! \brief Issues a FLASHC command. * * \param command The command: \c AVR32_FLASHC_FCMD_CMD_x. * \param page_number The page number to apply the command to: * \arg \c 0 to (flashc_get_page_count() - 1): a page number within * the flash array; * \arg < 0: use this to apply the command to the current page number * or if the command does not apply to any page number; * \arg this argument may have other meanings according to the command. See * the FLASHC chapter of the MCU datasheet. * * \warning A Lock Error is issued if the command violates the protection * mechanism. * * \warning A Programming Error is issued if the command is invalid. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern void flashc_issue_command(unsigned int command, int page_number); //! @} /*! \name FLASHC Global Commands */ //! @{ /*! \brief Issues a No Operation command to the FLASHC. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern void flashc_no_operation(void); /*! \brief Issues an Erase All command to the FLASHC. * * This command erases all bits in the flash array, the general-purpose fuse * bits and the Security bit. The User page is not erased. * * This command also ensures that all volatile memories, such as register file * and RAMs, are erased before the Security bit is erased, i.e. deactivated. * * \warning A Lock Error is issued if at least one region is locked or the * bootloader protection is active. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note An erase operation can only set bits. */ extern void flashc_erase_all(void); //! @} /*! \name FLASHC Protection Mechanisms */ //! @{ /*! \brief Tells whether the Security bit is active. * * \return Whether the Security bit is active. */ extern Bool flashc_is_security_bit_active(void); /*! \brief Activates the Security bit. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern void flashc_activate_security_bit(void); /*! \brief Gets the bootloader protected size. * * \return The bootloader protected size in bytes. */ extern unsigned int flashc_get_bootloader_protected_size(void); /*! \brief Sets the bootloader protected size. * * \param bootprot_size The wanted bootloader protected size in bytes. If this * size is not supported, the actual size will be the * nearest greater available size or the maximal possible * size if the requested size is too large. * * \return The actual bootloader protected size in bytes. * * \warning A Lock Error is issued if the Security bit is active. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern unsigned int flashc_set_bootloader_protected_size(unsigned int bootprot_size); /*! \brief Tells whether external privileged fetch is locked. * * \return Whether external privileged fetch is locked. */ extern Bool flashc_is_external_privileged_fetch_locked(void); /*! \brief Locks or unlocks external privileged fetch. * * \param lock Whether to lock external privileged fetch: \c TRUE or \c FALSE. * * \warning A Lock Error is issued if the Security bit is active. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern void flashc_lock_external_privileged_fetch(Bool lock); /*! \brief Tells whether the region of a page is locked. * * \param page_number The page number: * \arg \c 0 to (flashc_get_page_count() - 1): a page number within * the flash array; * \arg < 0: the current page number. * * \return Whether the region of the specified page is locked. */ extern Bool flashc_is_page_region_locked(int page_number); /*! \brief Tells whether a region is locked. * * \param region The region number: \c 0 to (AVR32_FLASHC_REGIONS - 1). * * \return Whether the specified region is locked. */ extern Bool flashc_is_region_locked(unsigned int region); /*! \brief Locks or unlocks the region of a page. * * \param page_number The page number: * \arg \c 0 to (flashc_get_page_count() - 1): a page number within * the flash array; * \arg < 0: the current page number. * \param lock Whether to lock the region of the specified page: \c TRUE or * \c FALSE. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern void flashc_lock_page_region(int page_number, Bool lock); /*! \brief Locks or unlocks a region. * * \param region The region number: \c 0 to (AVR32_FLASHC_REGIONS - 1). * \param lock Whether to lock the specified region: \c TRUE or \c FALSE. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern void flashc_lock_region(unsigned int region, Bool lock); /*! \brief Locks or unlocks all regions. * * \param lock Whether to lock the regions: \c TRUE or \c FALSE. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern void flashc_lock_all_regions(Bool lock); //! @} /*! \name Access to General-Purpose Fuses */ //! @{ /*! \brief Reads a general-purpose fuse bit. * * \param gp_fuse_bit The general-purpose fuse bit: \c 0 to \c 63. * * \return The value of the specified general-purpose fuse bit. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern Bool flashc_read_gp_fuse_bit(unsigned int gp_fuse_bit); /*! \brief Reads a general-purpose fuse bit-field. * * \param pos The bit-position of the general-purpose fuse bit-field: \c 0 to * \c 63. * \param width The bit-width of the general-purpose fuse bit-field: \c 0 to * \c 64. * * \return The value of the specified general-purpose fuse bit-field. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern U64 flashc_read_gp_fuse_bitfield(unsigned int pos, unsigned int width); /*! \brief Reads a general-purpose fuse byte. * * \param gp_fuse_byte The general-purpose fuse byte: \c 0 to \c 7. * * \return The value of the specified general-purpose fuse byte. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern U8 flashc_read_gp_fuse_byte(unsigned int gp_fuse_byte); /*! \brief Reads all general-purpose fuses. * * \return The value of all general-purpose fuses as a word. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern U64 flashc_read_all_gp_fuses(void); /*! \brief Erases a general-purpose fuse bit. * * \param gp_fuse_bit The general-purpose fuse bit: \c 0 to \c 63. * \param check Whether to check erase: \c TRUE or \c FALSE. * * \return Whether the erase succeeded or always \c TRUE if erase check was not * requested. * * \warning A Lock Error is issued if the Security bit is active and the command * is applied to BOOTPROT or EPFL fuses. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note An erase operation can only set bits. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern Bool flashc_erase_gp_fuse_bit(unsigned int gp_fuse_bit, Bool check); /*! \brief Erases a general-purpose fuse bit-field. * * \param pos The bit-position of the general-purpose fuse bit-field: \c 0 to * \c 63. * \param width The bit-width of the general-purpose fuse bit-field: \c 0 to * \c 64. * \param check Whether to check erase: \c TRUE or \c FALSE. * * \return Whether the erase succeeded or always \c TRUE if erase check was not * requested. * * \warning A Lock Error is issued if the Security bit is active and the command * is applied to BOOTPROT or EPFL fuses. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note An erase operation can only set bits. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern Bool flashc_erase_gp_fuse_bitfield(unsigned int pos, unsigned int width, Bool check); /*! \brief Erases a general-purpose fuse byte. * * \param gp_fuse_byte The general-purpose fuse byte: \c 0 to \c 7. * \param check Whether to check erase: \c TRUE or \c FALSE. * * \return Whether the erase succeeded or always \c TRUE if erase check was not * requested. * * \warning A Lock Error is issued if the Security bit is active. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note An erase operation can only set bits. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern Bool flashc_erase_gp_fuse_byte(unsigned int gp_fuse_byte, Bool check); /*! \brief Erases all general-purpose fuses. * * \param check Whether to check erase: \c TRUE or \c FALSE. * * \return Whether the erase succeeded or always \c TRUE if erase check was not * requested. * * \warning A Lock Error is issued if the Security bit is active. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note An erase operation can only set bits. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern Bool flashc_erase_all_gp_fuses(Bool check); /*! \brief Writes a general-purpose fuse bit. * * \param gp_fuse_bit The general-purpose fuse bit: \c 0 to \c 63. * \param value The value of the specified general-purpose fuse bit. * * \warning A Lock Error is issued if the Security bit is active and the command * is applied to BOOTPROT or EPFL fuses. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note A write operation can only clear bits. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern void flashc_write_gp_fuse_bit(unsigned int gp_fuse_bit, Bool value); /*! \brief Writes a general-purpose fuse bit-field. * * \param pos The bit-position of the general-purpose fuse bit-field: \c 0 to * \c 63. * \param width The bit-width of the general-purpose fuse bit-field: \c 0 to * \c 64. * \param value The value of the specified general-purpose fuse bit-field. * * \warning A Lock Error is issued if the Security bit is active and the command * is applied to BOOTPROT or EPFL fuses. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note A write operation can only clear bits. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern void flashc_write_gp_fuse_bitfield(unsigned int pos, unsigned int width, U64 value); /*! \brief Writes a general-purpose fuse byte. * * \param gp_fuse_byte The general-purpose fuse byte: \c 0 to \c 7. * \param value The value of the specified general-purpose fuse byte. * * \warning A Lock Error is issued if the Security bit is active. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note A write operation can only clear bits. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern void flashc_write_gp_fuse_byte(unsigned int gp_fuse_byte, U8 value); /*! \brief Writes all general-purpose fuses. * * \param value The value of all general-purpose fuses as a word. * * \warning A Lock Error is issued if the Security bit is active. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note A write operation can only clear bits. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern void flashc_write_all_gp_fuses(U64 value); /*! \brief Sets a general-purpose fuse bit with the appropriate erase and write * operations. * * \param gp_fuse_bit The general-purpose fuse bit: \c 0 to \c 63. * \param value The value of the specified general-purpose fuse bit. * * \warning A Lock Error is issued if the Security bit is active and the command * is applied to BOOTPROT or EPFL fuses. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern void flashc_set_gp_fuse_bit(unsigned int gp_fuse_bit, Bool value); /*! \brief Sets a general-purpose fuse bit-field with the appropriate erase and * write operations. * * \param pos The bit-position of the general-purpose fuse bit-field: \c 0 to * \c 63. * \param width The bit-width of the general-purpose fuse bit-field: \c 0 to * \c 64. * \param value The value of the specified general-purpose fuse bit-field. * * \warning A Lock Error is issued if the Security bit is active and the command * is applied to BOOTPROT or EPFL fuses. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern void flashc_set_gp_fuse_bitfield(unsigned int pos, unsigned int width, U64 value); /*! \brief Sets a general-purpose fuse byte with the appropriate erase and write * operations. * * \param gp_fuse_byte The general-purpose fuse byte: \c 0 to \c 7. * \param value The value of the specified general-purpose fuse byte. * * \warning A Lock Error is issued if the Security bit is active. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern void flashc_set_gp_fuse_byte(unsigned int gp_fuse_byte, U8 value); /*! \brief Sets all general-purpose fuses with the appropriate erase and write * operations. * * \param value The value of all general-purpose fuses as a word. * * \warning A Lock Error is issued if the Security bit is active. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note The actual number of general-purpose fuse bits implemented by hardware * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are * fixed at 1 by hardware. */ extern void flashc_set_all_gp_fuses(U64 value); //! @} /*! \name Access to Flash Pages */ //! @{ /*! \brief Clears the page buffer. * * This command resets all bits in the page buffer to one. Write accesses to the * page buffer can only change page buffer bits from one to zero. * * \warning The page buffer is not automatically reset after a page write. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern void flashc_clear_page_buffer(void); /*! \brief Tells whether the page to which the last Quick Page Read or Quick * Page Read User Page command was applied was erased. * * \return Whether the page to which the last Quick Page Read or Quick Page Read * User Page command was applied was erased. */ extern Bool flashc_is_page_erased(void); /*! \brief Applies the Quick Page Read command to a page. * * \param page_number The page number: * \arg \c 0 to (flashc_get_page_count() - 1): a page number within * the flash array; * \arg < 0: the current page number. * * \return Whether the specified page is erased. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern Bool flashc_quick_page_read(int page_number); /*! \brief Erases a page. * * \param page_number The page number: * \arg \c 0 to (flashc_get_page_count() - 1): a page number within * the flash array; * \arg < 0: the current page number. * \param check Whether to check erase: \c TRUE or \c FALSE. * * \return Whether the erase succeeded or always \c TRUE if erase check was not * requested. * * \warning A Lock Error is issued if the command is applied to a page belonging * to a locked region or to the bootloader protected area. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note An erase operation can only set bits. */ extern Bool flashc_erase_page(int page_number, Bool check); /*! \brief Erases all pages within the flash array. * * \param check Whether to check erase: \c TRUE or \c FALSE. * * \return Whether the erase succeeded or always \c TRUE if erase check was not * requested. * * \warning A Lock Error is issued if at least one region is locked or the * bootloader protection is active. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note An erase operation can only set bits. */ extern Bool flashc_erase_all_pages(Bool check); /*! \brief Writes a page from the page buffer. * * \param page_number The page number: * \arg \c 0 to (flashc_get_page_count() - 1): a page number within * the flash array; * \arg < 0: the current page number. * * \warning A Lock Error is issued if the command is applied to a page belonging * to a locked region or to the bootloader protected area. * * \warning The page buffer is not automatically reset after a page write. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note A write operation can only clear bits. */ extern void flashc_write_page(int page_number); /*! \brief Issues a Quick Page Read User Page command to the FLASHC. * * \return Whether the User page is erased. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern Bool flashc_quick_user_page_read(void); /*! \brief Erases the User page. * * \param check Whether to check erase: \c TRUE or \c FALSE. * * \return Whether the erase succeeded or always \c TRUE if erase check was not * requested. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note An erase operation can only set bits. */ extern Bool flashc_erase_user_page(Bool check); /*! \brief Writes the User page from the page buffer. * * \warning The page buffer is not automatically reset after a page write. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. * * \note A write operation can only clear bits. */ extern void flashc_write_user_page(void); /*! \brief Copies \a nbytes bytes to the flash destination pointed to by \a dst * from the repeated \a src source byte. * * The destination areas that are not within the flash array or the User page * are ignored. * * All pointer and size alignments are supported. * * \param dst Pointer to flash destination. * \param src Source byte. * \param nbytes Number of bytes to set. * \param erase Whether to erase before writing: \c TRUE or \c FALSE. * * \return The value of \a dst. * * \warning This function may be called with \a erase set to \c FALSE only if * the destination consists only of erased words, i.e. this function * can not be used to write only one bit of a previously written word. * E.g., if \c 0x00000001 then \c 0xFFFFFFFE are written to a word, the * resulting value in flash may be different from \c 0x00000000. * * \warning A Lock Error is issued if the command is applied to pages belonging * to a locked region or to the bootloader protected area. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern volatile void *flashc_memset8(volatile void *dst, U8 src, size_t nbytes, Bool erase); /*! \brief Copies \a nbytes bytes to the flash destination pointed to by \a dst * from the repeated \a src big-endian source half-word. * * The destination areas that are not within the flash array or the User page * are ignored. * * All pointer and size alignments are supported. * * \param dst Pointer to flash destination. * \param src Source half-word. * \param nbytes Number of bytes to set. * \param erase Whether to erase before writing: \c TRUE or \c FALSE. * * \return The value of \a dst. * * \warning This function may be called with \a erase set to \c FALSE only if * the destination consists only of erased words, i.e. this function * can not be used to write only one bit of a previously written word. * E.g., if \c 0x00000001 then \c 0xFFFFFFFE are written to a word, the * resulting value in flash may be different from \c 0x00000000. * * \warning A Lock Error is issued if the command is applied to pages belonging * to a locked region or to the bootloader protected area. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern volatile void *flashc_memset16(volatile void *dst, U16 src, size_t nbytes, Bool erase); /*! \brief Copies \a nbytes bytes to the flash destination pointed to by \a dst * from the repeated \a src big-endian source word. * * The destination areas that are not within the flash array or the User page * are ignored. * * All pointer and size alignments are supported. * * \param dst Pointer to flash destination. * \param src Source word. * \param nbytes Number of bytes to set. * \param erase Whether to erase before writing: \c TRUE or \c FALSE. * * \return The value of \a dst. * * \warning This function may be called with \a erase set to \c FALSE only if * the destination consists only of erased words, i.e. this function * can not be used to write only one bit of a previously written word. * E.g., if \c 0x00000001 then \c 0xFFFFFFFE are written to a word, the * resulting value in flash may be different from \c 0x00000000. * * \warning A Lock Error is issued if the command is applied to pages belonging * to a locked region or to the bootloader protected area. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern volatile void *flashc_memset32(volatile void *dst, U32 src, size_t nbytes, Bool erase); /*! \brief Copies \a nbytes bytes to the flash destination pointed to by \a dst * from the repeated \a src big-endian source double-word. * * The destination areas that are not within the flash array or the User page * are ignored. * * All pointer and size alignments are supported. * * \param dst Pointer to flash destination. * \param src Source double-word. * \param nbytes Number of bytes to set. * \param erase Whether to erase before writing: \c TRUE or \c FALSE. * * \return The value of \a dst. * * \warning This function may be called with \a erase set to \c FALSE only if * the destination consists only of erased words, i.e. this function * can not be used to write only one bit of a previously written word. * E.g., if \c 0x00000001 then \c 0xFFFFFFFE are written to a word, the * resulting value in flash may be different from \c 0x00000000. * * \warning A Lock Error is issued if the command is applied to pages belonging * to a locked region or to the bootloader protected area. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern volatile void *flashc_memset64(volatile void *dst, U64 src, size_t nbytes, Bool erase); /*! \brief Copies \a nbytes bytes to the flash destination pointed to by \a dst * from the repeated \a src big-endian source pattern. * * The destination areas that are not within the flash array or the User page * are ignored. * * All pointer and size alignments are supported. * * \param dst Pointer to flash destination. * \param src Source double-word. * \param src_width \a src width in bits: 8, 16, 32 or 64. * \param nbytes Number of bytes to set. * \param erase Whether to erase before writing: \c TRUE or \c FALSE. * * \return The value of \a dst. * * \warning This function may be called with \a erase set to \c FALSE only if * the destination consists only of erased words, i.e. this function * can not be used to write only one bit of a previously written word. * E.g., if \c 0x00000001 then \c 0xFFFFFFFE are written to a word, the * resulting value in flash may be different from \c 0x00000000. * * \warning A Lock Error is issued if the command is applied to pages belonging * to a locked region or to the bootloader protected area. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ #define flashc_memset(dst, src, src_width, nbytes, erase) \ TPASTE2(flashc_memset, src_width)((dst), (src), (nbytes), (erase)) /*! \brief Copies \a nbytes bytes to the flash destination pointed to by \a dst * from the source pointed to by \a src. * * The destination areas that are not within the flash array or the User page * are ignored. * * All pointer and size alignments are supported. * * \param dst Pointer to flash destination. * \param src Pointer to source data. * \param nbytes Number of bytes to copy. * \param erase Whether to erase before writing: \c TRUE or \c FALSE. * * \return The value of \a dst. * * \warning If copying takes place between areas that overlap, the behavior is * undefined. * * \warning This function may be called with \a erase set to \c FALSE only if * the destination consists only of erased words, i.e. this function * can not be used to write only one bit of a previously written word. * E.g., if \c 0x00000001 then \c 0xFFFFFFFE are written to a word, the * resulting value in flash may be different from \c 0x00000000. * * \warning A Lock Error is issued if the command is applied to pages belonging * to a locked region or to the bootloader protected area. * * \note The FLASHC error status returned by \ref flashc_is_lock_error and * \ref flashc_is_programming_error is updated. */ extern volatile void *flashc_memcpy(volatile void *dst, const void *src, size_t nbytes, Bool erase); #if UC3C /*! \brief Depednding to the CPU frequency, set the wait states of flash read * accesses and enable or disable the High speed read mode. * * \param cpu_f_hz The CPU frequency */ void flashc_set_flash_waitstate_and_readmode(unsigned long cpu_f_hz); #endif // UC3C device-specific implementation //! @} #endif // _FLASHC_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file has been prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief GPIO driver for AVR32 UC3. * * This file defines a useful set of functions for the GPIO. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a GPIO module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * *****************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "gpio.h" //! GPIO module instance. #define GPIO AVR32_GPIO /*! \name Peripheral Bus Interface */ //! @{ int gpio_enable_module(const gpio_map_t gpiomap, unsigned int size) { int status = GPIO_SUCCESS; unsigned int i; for (i = 0; i < size; i++) { status |= gpio_enable_module_pin(gpiomap->pin, gpiomap->function); gpiomap++; } return status; } int gpio_enable_module_pin(unsigned int pin, unsigned int function) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; // Enable the correct function. switch (function) { case 0: // A function. gpio_port->pmr0c = 1 << (pin & 0x1F); gpio_port->pmr1c = 1 << (pin & 0x1F); #if defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) gpio_port->pmr2c = 1 << (pin & 0x1F); #endif break; case 1: // B function. gpio_port->pmr0s = 1 << (pin & 0x1F); gpio_port->pmr1c = 1 << (pin & 0x1F); #if defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) gpio_port->pmr2c = 1 << (pin & 0x1F); #endif break; case 2: // C function. gpio_port->pmr0c = 1 << (pin & 0x1F); gpio_port->pmr1s = 1 << (pin & 0x1F); #if defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) gpio_port->pmr2c = 1 << (pin & 0x1F); #endif break; case 3: // D function. gpio_port->pmr0s = 1 << (pin & 0x1F); gpio_port->pmr1s = 1 << (pin & 0x1F); #if defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) gpio_port->pmr2c = 1 << (pin & 0x1F); #endif break; #if defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) case 4: // E function. gpio_port->pmr0c = 1 << (pin & 0x1F); gpio_port->pmr1c = 1 << (pin & 0x1F); gpio_port->pmr2s = 1 << (pin & 0x1F); break; case 5: // F function. gpio_port->pmr0s = 1 << (pin & 0x1F); gpio_port->pmr1c = 1 << (pin & 0x1F); gpio_port->pmr2s = 1 << (pin & 0x1F); break; case 6: // G function. gpio_port->pmr0c = 1 << (pin & 0x1F); gpio_port->pmr1s = 1 << (pin & 0x1F); gpio_port->pmr2s = 1 << (pin & 0x1F); break; case 7: // H function. gpio_port->pmr0s = 1 << (pin & 0x1F); gpio_port->pmr1s = 1 << (pin & 0x1F); gpio_port->pmr2s = 1 << (pin & 0x1F); break; #endif default: return GPIO_INVALID_ARGUMENT; } // Disable GPIO control. gpio_port->gperc = 1 << (pin & 0x1F); return GPIO_SUCCESS; } void gpio_enable_gpio(const gpio_map_t gpiomap, unsigned int size) { unsigned int i; for (i = 0; i < size; i++) { gpio_enable_gpio_pin(gpiomap->pin); gpiomap++; } } void gpio_enable_gpio_pin(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->oderc = 1 << (pin & 0x1F); gpio_port->gpers = 1 << (pin & 0x1F); } // The open-drain mode is not synthesized on the current AVR32 products. // If one day some AVR32 products have this feature, the corresponding part // numbers should be listed in the #if below. // Note that other functions are available in this driver to use pins with open // drain in GPIO mode. The advantage of the open-drain mode functions over these // other functions is that they can be used not only in GPIO mode but also in // module mode. #if 0 void gpio_enable_pin_open_drain(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->odmers = 1 << (pin & 0x1F); } void gpio_disable_pin_open_drain(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->odmerc = 1 << (pin & 0x1F); } #endif void gpio_enable_pin_pull_up(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->puers = 1 << (pin & 0x1F); #if defined(AVR32_GPIO_200_H_INCLUDED) || defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) gpio_port->pderc = 1 << (pin & 0x1F); #endif } void gpio_disable_pin_pull_up(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->puerc = 1 << (pin & 0x1F); } #if defined(AVR32_GPIO_200_H_INCLUDED) || defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) // Added support of Pull-up Resistor, Pull-down Resistor and Buskeeper Control. /*! \brief Enables the pull-down resistor of a pin. * * \param pin The pin number. */ void gpio_enable_pin_pull_down(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->puerc = 1 << (pin & 0x1F); gpio_port->pders = 1 << (pin & 0x1F); } /*! \brief Disables the pull-down resistor of a pin. * * \param pin The pin number. */ void gpio_disable_pin_pull_down(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->pderc = 1 << (pin & 0x1F); } /*! \brief Enables the buskeeper functionality on a pin. * * \param pin The pin number. */ void gpio_enable_pin_buskeeper(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->puers = 1 << (pin & 0x1F); gpio_port->pders = 1 << (pin & 0x1F); } /*! \brief Disables the buskeeper functionality on a pin. * * \param pin The pin number. */ void gpio_disable_pin_buskeeper(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->puerc = 1 << (pin & 0x1F); gpio_port->pderc = 1 << (pin & 0x1F); } #endif int gpio_get_pin_value(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; return (gpio_port->pvr >> (pin & 0x1F)) & 1; } int gpio_get_gpio_pin_output_value(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; return (gpio_port->ovr >> (pin & 0x1F)) & 1; } int gpio_get_gpio_open_drain_pin_output_value(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; return ((gpio_port->oder >> (pin & 0x1F)) & 1) ^ 1; } void gpio_set_gpio_pin(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->ovrs = 1 << (pin & 0x1F); // Value to be driven on the I/O line: 1. gpio_port->oders = 1 << (pin & 0x1F); // The GPIO output driver is enabled for that pin. gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin. } void gpio_clr_gpio_pin(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->ovrc = 1 << (pin & 0x1F); // Value to be driven on the I/O line: 0. gpio_port->oders = 1 << (pin & 0x1F); // The GPIO output driver is enabled for that pin. gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin. } void gpio_tgl_gpio_pin(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->ovrt = 1 << (pin & 0x1F); // Toggle the I/O line. gpio_port->oders = 1 << (pin & 0x1F); // The GPIO output driver is enabled for that pin. gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin. } void gpio_set_gpio_open_drain_pin(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->oderc = 1 << (pin & 0x1F); // The GPIO output driver is disabled for that pin. gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin. } void gpio_clr_gpio_open_drain_pin(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->ovrc = 1 << (pin & 0x1F); // Value to be driven on the I/O line: 0. gpio_port->oders = 1 << (pin & 0x1F); // The GPIO output driver is enabled for that pin. gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin. } void gpio_tgl_gpio_open_drain_pin(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->ovrc = 1 << (pin & 0x1F); // Value to be driven on the I/O line if the GPIO output driver is enabled: 0. gpio_port->odert = 1 << (pin & 0x1F); // The GPIO output driver is toggled for that pin. gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin. } void gpio_enable_pin_glitch_filter(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->gfers = 1 << (pin & 0x1F); } void gpio_disable_pin_glitch_filter(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->gferc = 1 << (pin & 0x1F); } /*! \brief Configure the edge detector of an input pin * * \param pin The pin number. * \param mode The edge detection mode (\ref GPIO_PIN_CHANGE, \ref GPIO_RISING_EDGE * or \ref GPIO_FALLING_EDGE). * * \return \ref GPIO_SUCCESS or \ref GPIO_INVALID_ARGUMENT. */ static int gpio_configure_edge_detector(unsigned int pin, unsigned int mode) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; // Configure the edge detector. switch (mode) { case GPIO_PIN_CHANGE: gpio_port->imr0c = 1 << (pin & 0x1F); gpio_port->imr1c = 1 << (pin & 0x1F); break; case GPIO_RISING_EDGE: gpio_port->imr0s = 1 << (pin & 0x1F); gpio_port->imr1c = 1 << (pin & 0x1F); break; case GPIO_FALLING_EDGE: gpio_port->imr0c = 1 << (pin & 0x1F); gpio_port->imr1s = 1 << (pin & 0x1F); break; default: return GPIO_INVALID_ARGUMENT; } return GPIO_SUCCESS; } int gpio_enable_pin_interrupt(unsigned int pin, unsigned int mode) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; // Enable the glitch filter. gpio_port->gfers = 1 << (pin & 0x1F); // Configure the edge detector. if(GPIO_INVALID_ARGUMENT == gpio_configure_edge_detector(pin, mode)) return(GPIO_INVALID_ARGUMENT); // Enable interrupt. gpio_port->iers = 1 << (pin & 0x1F); return GPIO_SUCCESS; } void gpio_disable_pin_interrupt(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->ierc = 1 << (pin & 0x1F); } int gpio_get_pin_interrupt_flag(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; return (gpio_port->ifr >> (pin & 0x1F)) & 1; } void gpio_clear_pin_interrupt_flag(unsigned int pin) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; gpio_port->ifrc = 1 << (pin & 0x1F); } //# //# Peripheral Event System Support. //# #if UC3L int gpio_configure_pin_periph_event_mode(unsigned int pin, unsigned int mode, unsigned int use_igf) { volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; if(TRUE == use_igf) { // Enable the glitch filter. gpio_port->gfers = 1 << (pin & 0x1F); } else { // Disable the glitch filter. gpio_port->gferc = 1 << (pin & 0x1F); } // Configure the edge detector. return(gpio_configure_edge_detector(pin, mode)); } #endif //! @} ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file has been prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief GPIO header for AVR32 UC3. * * This file contains basic GPIO driver functions. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a GPIO module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * *****************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _GPIO_H_ #define _GPIO_H_ #include #include "compiler.h" /*! \name Return Values of the GPIO API */ //! @{ #define GPIO_SUCCESS 0 //!< Function successfully completed. #define GPIO_INVALID_ARGUMENT 1 //!< Input parameters are out of range. //! @} /*! \name Interrupt Trigger Modes */ //! @{ #define GPIO_PIN_CHANGE 0 //!< Interrupt triggered upon pin change. #define GPIO_RISING_EDGE 1 //!< Interrupt triggered upon rising edge. #define GPIO_FALLING_EDGE 2 //!< Interrupt triggered upon falling edge. //! @} //! A type definition of pins and modules connectivity. typedef struct { unsigned char pin; //!< Module pin. unsigned char function; //!< Module function. } gpio_map_t[]; /*! \name Peripheral Bus Interface * * Low-speed interface with a non-deterministic number of clock cycles per * access. * * This interface operates with lower clock frequencies (fPB <= fCPU), and its * timing is not deterministic since it needs to access a shared bus which may * be heavily loaded. * * \note This interface is immediately available without initialization. */ //! @{ /*! \brief Enables specific module modes for a set of pins. * * \param gpiomap The pin map. * \param size The number of pins in \a gpiomap. * * \return \ref GPIO_SUCCESS or \ref GPIO_INVALID_ARGUMENT. */ extern int gpio_enable_module(const gpio_map_t gpiomap, unsigned int size); /*! \brief Enables a specific module mode for a pin. * * \param pin The pin number.\n * Refer to the product header file `uc3x.h' (where x is the part * number; e.g. x = a0512) for module pins. E.g., to enable a PWM * channel output, the pin number can be AVR32_PWM_3_PIN for PWM * channel 3. * \param function The pin function.\n * Refer to the product header file `uc3x.h' (where x is the * part number; e.g. x = a0512) for module pin functions. E.g., * to enable a PWM channel output, the pin function can be * AVR32_PWM_3_FUNCTION for PWM channel 3. * * \return \ref GPIO_SUCCESS or \ref GPIO_INVALID_ARGUMENT. */ extern int gpio_enable_module_pin(unsigned int pin, unsigned int function); /*! \brief Enables the GPIO mode of a set of pins. * * \param gpiomap The pin map. * \param size The number of pins in \a gpiomap. */ extern void gpio_enable_gpio(const gpio_map_t gpiomap, unsigned int size); /*! \brief Enables the GPIO mode of a pin. * * \param pin The pin number.\n * Refer to the product header file `uc3x.h' (where x is the part * number; e.g. x = a0512) for pin definitions. E.g., to enable the * GPIO mode of PX21, AVR32_PIN_PX21 can be used. Module pins such as * AVR32_PWM_3_PIN for PWM channel 3 can also be used to release * module pins for GPIO. */ extern void gpio_enable_gpio_pin(unsigned int pin); // The open-drain mode is not synthesized on the current AVR32 products. // If one day some AVR32 products have this feature, the corresponding part // numbers should be listed in the #if below. // Note that other functions are available in this driver to use pins with open // drain in GPIO mode. The advantage of the open-drain mode functions over these // other functions is that they can be used not only in GPIO mode but also in // module mode. #if 0 /*! \brief Enables the open-drain mode of a pin. * * \param pin The pin number. */ extern void gpio_enable_pin_open_drain(unsigned int pin); /*! \brief Disables the open-drain mode of a pin. * * \param pin The pin number. */ extern void gpio_disable_pin_open_drain(unsigned int pin); #endif /*! \brief Enables the pull-up resistor of a pin. * * \param pin The pin number. */ extern void gpio_enable_pin_pull_up(unsigned int pin); /*! \brief Disables the pull-up resistor of a pin. * * \param pin The pin number. */ extern void gpio_disable_pin_pull_up(unsigned int pin); #if defined(AVR32_GPIO_200_H_INCLUDED) || defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) // Added support of Pull-up Resistor, Pull-down Resistor and Buskeeper Control. /*! \brief Enables the pull-down resistor of a pin. * * \param pin The pin number. */ extern void gpio_enable_pin_pull_down(unsigned int pin); /*! \brief Disables the pull-down resistor of a pin. * * \param pin The pin number. */ extern void gpio_disable_pin_pull_down(unsigned int pin); /*! \brief Enables the buskeeper functionality on a pin. * * \param pin The pin number. */ extern void gpio_enable_pin_buskeeper(unsigned int pin); /*! \brief Disables the buskeeper functionality on a pin. * * \param pin The pin number. */ extern void gpio_disable_pin_buskeeper(unsigned int pin); #endif /*! \brief Returns the value of a pin. * * \param pin The pin number. * * \return The pin value. */ extern int gpio_get_pin_value(unsigned int pin); /*! \brief Returns the output value set for a GPIO pin. * * \param pin The pin number. * * \return The pin output value. * * \note This function must be used in conjunction with \ref gpio_set_gpio_pin, * \ref gpio_clr_gpio_pin and \ref gpio_tgl_gpio_pin. */ extern int gpio_get_gpio_pin_output_value(unsigned int pin); /*! \brief Returns the output value set for a GPIO pin using open drain. * * \param pin The pin number. * * \return The pin output value. * * \note This function must be used in conjunction with * \ref gpio_set_gpio_open_drain_pin, \ref gpio_clr_gpio_open_drain_pin * and \ref gpio_tgl_gpio_open_drain_pin. */ extern int gpio_get_gpio_open_drain_pin_output_value(unsigned int pin); /*! \brief Drives a GPIO pin to 1. * * \param pin The pin number. */ extern void gpio_set_gpio_pin(unsigned int pin); /*! \brief Drives a GPIO pin to 0. * * \param pin The pin number. */ extern void gpio_clr_gpio_pin(unsigned int pin); /*! \brief Toggles a GPIO pin. * * \param pin The pin number. */ extern void gpio_tgl_gpio_pin(unsigned int pin); /*! \brief Drives a GPIO pin to 1 using open drain. * * \param pin The pin number. */ extern void gpio_set_gpio_open_drain_pin(unsigned int pin); /*! \brief Drives a GPIO pin to 0 using open drain. * * \param pin The pin number. */ extern void gpio_clr_gpio_open_drain_pin(unsigned int pin); /*! \brief Toggles a GPIO pin using open drain. * * \param pin The pin number. */ extern void gpio_tgl_gpio_open_drain_pin(unsigned int pin); /*! \brief Enables the glitch filter of a pin. * * When the glitch filter is enabled, a glitch with duration of less than 1 * clock cycle is automatically rejected, while a pulse with duration of 2 clock * cycles or more is accepted. For pulse durations between 1 clock cycle and 2 * clock cycles, the pulse may or may not be taken into account, depending on * the precise timing of its occurrence. Thus for a pulse to be guaranteed * visible it must exceed 2 clock cycles, whereas for a glitch to be reliably * filtered out, its duration must not exceed 1 clock cycle. The filter * introduces 2 clock cycles latency. * * \param pin The pin number. */ extern void gpio_enable_pin_glitch_filter(unsigned int pin); /*! \brief Disables the glitch filter of a pin. * * \param pin The pin number. */ extern void gpio_disable_pin_glitch_filter(unsigned int pin); /*! \brief Enables the interrupt of a pin with the specified settings. * * \param pin The pin number. * \param mode The trigger mode (\ref GPIO_PIN_CHANGE, \ref GPIO_RISING_EDGE or * \ref GPIO_FALLING_EDGE). * * \return \ref GPIO_SUCCESS or \ref GPIO_INVALID_ARGUMENT. */ extern int gpio_enable_pin_interrupt(unsigned int pin, unsigned int mode); /*! \brief Disables the interrupt of a pin. * * \param pin The pin number. */ extern void gpio_disable_pin_interrupt(unsigned int pin); /*! \brief Gets the interrupt flag of a pin. * * \param pin The pin number. * * \return The pin interrupt flag. */ extern int gpio_get_pin_interrupt_flag(unsigned int pin); /*! \brief Clears the interrupt flag of a pin. * * \param pin The pin number. */ extern void gpio_clear_pin_interrupt_flag(unsigned int pin); //! @} #if (defined AVR32_GPIO_LOCAL_ADDRESS) /*! \name Local Bus Interface * * High-speed interface with only one clock cycle per access. * * This interface operates with high clock frequency (fCPU), and its timing is * deterministic since it does not need to access a shared bus which may be * heavily loaded. * * \warning To use this interface, the clock frequency of the peripheral bus on * which the GPIO peripheral is connected must be set to the CPU clock * frequency (fPB = fCPU). * * \note This interface has to be initialized in order to be available. */ //! @{ /*! \brief Enables the local bus interface for GPIO. * * \note This function must have been called at least once before using other * functions in this interface. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void gpio_local_init(void) { Set_system_register(AVR32_CPUCR, Get_system_register(AVR32_CPUCR) | AVR32_CPUCR_LOCEN_MASK); } /*! \brief Enables the output driver of a pin. * * \param pin The pin number. * * \note \ref gpio_local_init must have been called beforehand. * * \note This function does not enable the GPIO mode of the pin. * \ref gpio_enable_gpio_pin can be called for this purpose. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void gpio_local_enable_pin_output_driver(unsigned int pin) { AVR32_GPIO_LOCAL.port[pin >> 5].oders = 1 << (pin & 0x1F); } /*! \brief Disables the output driver of a pin. * * \param pin The pin number. * * \note \ref gpio_local_init must have been called beforehand. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void gpio_local_disable_pin_output_driver(unsigned int pin) { AVR32_GPIO_LOCAL.port[pin >> 5].oderc = 1 << (pin & 0x1F); } /*! \brief Returns the value of a pin. * * \param pin The pin number. * * \return The pin value. * * \note \ref gpio_local_init must have been called beforehand. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ int gpio_local_get_pin_value(unsigned int pin) { return (AVR32_GPIO_LOCAL.port[pin >> 5].pvr >> (pin & 0x1F)) & 1; } /*! \brief Drives a GPIO pin to 1. * * \param pin The pin number. * * \note \ref gpio_local_init must have been called beforehand. * * \note This function does not enable the GPIO mode of the pin nor its output * driver. \ref gpio_enable_gpio_pin and * \ref gpio_local_enable_pin_output_driver can be called for this * purpose. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void gpio_local_set_gpio_pin(unsigned int pin) { AVR32_GPIO_LOCAL.port[pin >> 5].ovrs = 1 << (pin & 0x1F); } /*! \brief Drives a GPIO pin to 0. * * \param pin The pin number. * * \note \ref gpio_local_init must have been called beforehand. * * \note This function does not enable the GPIO mode of the pin nor its output * driver. \ref gpio_enable_gpio_pin and * \ref gpio_local_enable_pin_output_driver can be called for this * purpose. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void gpio_local_clr_gpio_pin(unsigned int pin) { AVR32_GPIO_LOCAL.port[pin >> 5].ovrc = 1 << (pin & 0x1F); } /*! \brief Toggles a GPIO pin. * * \param pin The pin number. * * \note \ref gpio_local_init must have been called beforehand. * * \note This function does not enable the GPIO mode of the pin nor its output * driver. \ref gpio_enable_gpio_pin and * \ref gpio_local_enable_pin_output_driver can be called for this * purpose. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void gpio_local_tgl_gpio_pin(unsigned int pin) { AVR32_GPIO_LOCAL.port[pin >> 5].ovrt = 1 << (pin & 0x1F); } /*! \brief Initializes the configuration of a GPIO pin so that it can be used * with GPIO open-drain functions. * * \note This function must have been called at least once before using * \ref gpio_local_set_gpio_open_drain_pin, * \ref gpio_local_clr_gpio_open_drain_pin or * \ref gpio_local_tgl_gpio_open_drain_pin. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void gpio_local_init_gpio_open_drain_pin(unsigned int pin) { AVR32_GPIO_LOCAL.port[pin >> 5].ovrc = 1 << (pin & 0x1F); } /*! \brief Drives a GPIO pin to 1 using open drain. * * \param pin The pin number. * * \note \ref gpio_local_init and \ref gpio_local_init_gpio_open_drain_pin must * have been called beforehand. * * \note This function does not enable the GPIO mode of the pin. * \ref gpio_enable_gpio_pin can be called for this purpose. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void gpio_local_set_gpio_open_drain_pin(unsigned int pin) { AVR32_GPIO_LOCAL.port[pin >> 5].oderc = 1 << (pin & 0x1F); } /*! \brief Drives a GPIO pin to 0 using open drain. * * \param pin The pin number. * * \note \ref gpio_local_init and \ref gpio_local_init_gpio_open_drain_pin must * have been called beforehand. * * \note This function does not enable the GPIO mode of the pin. * \ref gpio_enable_gpio_pin can be called for this purpose. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void gpio_local_clr_gpio_open_drain_pin(unsigned int pin) { AVR32_GPIO_LOCAL.port[pin >> 5].oders = 1 << (pin & 0x1F); } /*! \brief Toggles a GPIO pin using open drain. * * \param pin The pin number. * * \note \ref gpio_local_init and \ref gpio_local_init_gpio_open_drain_pin must * have been called beforehand. * * \note This function does not enable the GPIO mode of the pin. * \ref gpio_enable_gpio_pin can be called for this purpose. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void gpio_local_tgl_gpio_open_drain_pin(unsigned int pin) { AVR32_GPIO_LOCAL.port[pin >> 5].odert = 1 << (pin & 0x1F); } //! @} #endif // AVR32_GPIO_LOCAL_ADDRESS #if UC3L //! @{ /*! \name Peripheral Event System support * * The GPIO can be programmed to output peripheral events whenever an interrupt * condition is detected, such as pin value change, or only when a rising or * falling edge is detected. * */ /*! \brief Enables the peripheral event generation of a pin. * * \param pin The pin number. * */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void gpio_enable_pin_periph_event(unsigned int pin) { AVR32_GPIO.port[pin >> 5].oderc = 1 << (pin & 0x1F); // The GPIO output driver is disabled for that pin. AVR32_GPIO.port[pin >> 5].evers = 1 << (pin & 0x1F); } /*! \brief Disables the peripheral event generation of a pin. * * \param pin The pin number. * */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void gpio_disable_pin_periph_event(unsigned int pin) { AVR32_GPIO.port[pin >> 5].everc = 1 << (pin & 0x1F); } /*! \brief Configure the peripheral event trigger mode of a pin * * \param pin The pin number. * \param mode The trigger mode (\ref GPIO_PIN_CHANGE, \ref GPIO_RISING_EDGE or * \ref GPIO_FALLING_EDGE). * \param use_igf use the Input Glitch Filter (TRUE) or not (FALSE). * * \return \ref GPIO_SUCCESS or \ref GPIO_INVALID_ARGUMENT. */ extern int gpio_configure_pin_periph_event_mode(unsigned int pin, unsigned int mode, unsigned int use_igf); //! @} #endif #endif // _GPIO_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/exception.x ================================================ /* This file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Exception and interrupt vectors. * * This file maps all events supported by an AVR32. * * - Compiler: GNU GCC for AVR32 * - Supported devices: All AVR32 devices with an INTC module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #if !__AVR32_UC__ && !__AVR32_AP__ #error Implementation of the AVR32 architecture not supported by the INTC driver. #endif #include //! @{ //! \verbatim .section .exception, "ax", @progbits // Start of Exception Vector Table. // EVBA must be aligned with a power of two strictly greater than the EVBA- // relative offset of the last vector. .balign 0x200 // Export symbol. .global _evba .type _evba, @function _evba: .org 0x000 // Unrecoverable Exception. _handle_Unrecoverable_Exception: rjmp $ .org 0x004 // TLB Multiple Hit. _handle_TLB_Multiple_Hit: rjmp $ .org 0x008 // Bus Error Data Fetch. _handle_Bus_Error_Data_Fetch: rjmp $ .org 0x00C // Bus Error Instruction Fetch. _handle_Bus_Error_Instruction_Fetch: rjmp $ .org 0x010 // NMI. _handle_NMI: rjmp $ .org 0x014 // Instruction Address. _handle_Instruction_Address: rjmp $ .org 0x018 // ITLB Protection. _handle_ITLB_Protection: rjmp $ .org 0x01C // Breakpoint. _handle_Breakpoint: rjmp $ .org 0x020 // Illegal Opcode. _handle_Illegal_Opcode: rjmp $ .org 0x024 // Unimplemented Instruction. _handle_Unimplemented_Instruction: rjmp $ .org 0x028 // Privilege Violation. _handle_Privilege_Violation: rjmp $ .org 0x02C // Floating-Point: UNUSED IN AVR32UC and AVR32AP. _handle_Floating_Point: rjmp $ .org 0x030 // Coprocessor Absent: UNUSED IN AVR32UC. _handle_Coprocessor_Absent: rjmp $ .org 0x034 // Data Address (Read). _handle_Data_Address_Read: rjmp $ .org 0x038 // Data Address (Write). _handle_Data_Address_Write: rjmp $ .org 0x03C // DTLB Protection (Read). _handle_DTLB_Protection_Read: rjmp $ .org 0x040 // DTLB Protection (Write). _handle_DTLB_Protection_Write: rjmp $ .org 0x044 // DTLB Modified: UNUSED IN AVR32UC. _handle_DTLB_Modified: rjmp $ .org 0x050 // ITLB Miss. _handle_ITLB_Miss: rjmp $ .org 0x060 // DTLB Miss (Read). _handle_DTLB_Miss_Read: rjmp $ .org 0x070 // DTLB Miss (Write). _handle_DTLB_Miss_Write: rjmp $ .org 0x100 // Supervisor Call. _handle_Supervisor_Call: rjmp $ // Interrupt support. // The interrupt controller must provide the offset address relative to EVBA. // Important note: // All interrupts call a C function named _get_interrupt_handler. // This function will read group and interrupt line number to then return in // R12 a pointer to a user-provided interrupt handler. .balign 4 .irp priority, 0, 1, 2, 3 _int\priority: #if __AVR32_UC__ // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the // CPU upon interrupt entry. No other register is saved by hardware. #elif __AVR32_AP__ // PC and SR are automatically saved in respectively RAR_INTx and RSR_INTx by // the CPU upon interrupt entry. No other register is saved by hardware. pushm r8-r12, lr #endif mov r12, \priority // Pass the int_level parameter to the _get_interrupt_handler function. call _get_interrupt_handler cp.w r12, 0 // Get the pointer to the interrupt handler returned by the function. #if __AVR32_UC__ movne pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler. #elif __AVR32_AP__ breq spint\priority // If this was a spurious interrupt (R12 == NULL), branch. st.w --sp, r12 // Push the pointer to the interrupt handler onto the system stack since no register may be altered. popm r8-r12, lr, pc // Restore registers and jump to the handler. spint\priority: popm r8-r12, lr #endif rete // If this was a spurious interrupt (R12 == NULL), return from event handler. .endr // Constant data area. .balign 4 // Values to store in the interrupt priority registers for the various interrupt priority levels. // The interrupt priority registers contain the interrupt priority level and // the EVBA-relative interrupt vector offset. .global ipr_val .type ipr_val, @object ipr_val: .word (AVR32_INTC_INT0 << AVR32_INTC_IPR_INTLEVEL_OFFSET) | (_int0 - _evba),\ (AVR32_INTC_INT1 << AVR32_INTC_IPR_INTLEVEL_OFFSET) | (_int1 - _evba),\ (AVR32_INTC_INT2 << AVR32_INTC_IPR_INTLEVEL_OFFSET) | (_int2 - _evba),\ (AVR32_INTC_INT3 << AVR32_INTC_IPR_INTLEVEL_OFFSET) | (_int3 - _evba) //! \endverbatim //! @} ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief INTC driver for AVR32 UC3. * * AVR32 Interrupt Controller driver module. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with an INTC module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include #include "compiler.h" #include "preprocessor.h" #include "intc.h" // define _evba from exception.S extern void _evba; //! Values to store in the interrupt priority registers for the various interrupt priority levels. extern const unsigned int ipr_val[AVR32_INTC_NUM_INT_LEVELS]; //! Creates a table of interrupt line handlers per interrupt group in order to optimize RAM space. //! Each line handler table contains a set of pointers to interrupt handlers. #if (defined __GNUC__) #define DECL_INT_LINE_HANDLER_TABLE(GRP, unused) \ static volatile __int_handler _int_line_handler_table_##GRP[Max(AVR32_INTC_NUM_IRQS_PER_GRP##GRP, 1)]; #elif (defined __ICCAVR32__) #define DECL_INT_LINE_HANDLER_TABLE(GRP, unused) \ static volatile __no_init __int_handler _int_line_handler_table_##GRP[Max(AVR32_INTC_NUM_IRQS_PER_GRP##GRP, 1)]; #endif MREPEAT(AVR32_INTC_NUM_INT_GRPS, DECL_INT_LINE_HANDLER_TABLE, ~); #undef DECL_INT_LINE_HANDLER_TABLE //! Table containing for each interrupt group the number of interrupt request //! lines and a pointer to the table of interrupt line handlers. static const struct { unsigned int num_irqs; volatile __int_handler *_int_line_handler_table; } _int_handler_table[AVR32_INTC_NUM_INT_GRPS] = { #define INSERT_INT_LINE_HANDLER_TABLE(GRP, unused) \ {AVR32_INTC_NUM_IRQS_PER_GRP##GRP, _int_line_handler_table_##GRP}, MREPEAT(AVR32_INTC_NUM_INT_GRPS, INSERT_INT_LINE_HANDLER_TABLE, ~) #undef INSERT_INT_LINE_HANDLER_TABLE }; /*! \brief Default interrupt handler. * * \note Taken and adapted from Newlib. */ #if (defined __GNUC__) __attribute__((__interrupt__)) #elif (defined __ICCAVR32__) __interrupt #endif static void _unhandled_interrupt(void) { // Catch unregistered interrupts. while (TRUE); } /*! \brief Gets the interrupt handler of the current event at the \a int_level * interrupt priority level (called from exception.S). * * \param int_level Interrupt priority level to handle. * * \return Interrupt handler to execute. * * \note Taken and adapted from Newlib. */ __int_handler _get_interrupt_handler(unsigned int int_level) { // ICR3 is mapped first, ICR0 last. // Code in exception.S puts int_level in R12 which is used by AVR32-GCC to // pass a single argument to a function. unsigned int int_grp = AVR32_INTC.icr[AVR32_INTC_INT3 - int_level]; unsigned int int_req = AVR32_INTC.irr[int_grp]; // As an interrupt may disappear while it is being fetched by the CPU // (spurious interrupt caused by a delayed response from an MCU peripheral to // an interrupt flag clear or interrupt disable instruction), check if there // are remaining interrupt lines to process. // If a spurious interrupt occurs, the status register (SR) contains an // execution mode and interrupt level masks corresponding to a level 0 // interrupt, whatever the interrupt priority level causing the spurious // event. This behavior has been chosen because a spurious interrupt has not // to be a priority one and because it may not cause any trouble to other // interrupts. // However, these spurious interrupts place the hardware in an unstable state // and could give problems in other/future versions of the CPU, so the // software has to be written so that they never occur. The only safe way of // achieving this is to always clear or disable peripheral interrupts with the // following sequence: // 1: Mask the interrupt in the CPU by setting GM (or IxM) in SR. // 2: Perform the bus access to the peripheral register that clears or // disables the interrupt. // 3: Wait until the interrupt has actually been cleared or disabled by the // peripheral. This is usually performed by reading from a register in the // same peripheral (it DOES NOT have to be the same register that was // accessed in step 2, but it MUST be in the same peripheral), what takes // bus system latencies into account, but peripheral internal latencies // (generally 0 cycle) also have to be considered. // 4: Unmask the interrupt in the CPU by clearing GM (or IxM) in SR. // Note that steps 1 and 4 are useless inside interrupt handlers as the // corresponding interrupt level is automatically masked by IxM (unless IxM is // explicitly cleared by the software). // // Get the right IRQ handler. // // If several interrupt lines are active in the group, the interrupt line with // the highest number is selected. This is to be coherent with the // prioritization of interrupt groups performed by the hardware interrupt // controller. // // If no handler has been registered for the pending interrupt, // _unhandled_interrupt will be selected thanks to the initialization of // _int_line_handler_table_x by INTC_init_interrupts. // // exception.S will provide the interrupt handler with a clean interrupt stack // frame, with nothing more pushed onto the stack. The interrupt handler must // manage the `rete' instruction, what can be done thanks to pure assembly, // inline assembly or the `__attribute__((__interrupt__))' C function // attribute. return (int_req) ? _int_handler_table[int_grp]._int_line_handler_table[32 - clz(int_req) - 1] : NULL; } //! Init EVBA address. This sequence might also be done in the UTILS/STARTUP/GCC/crt0.S static __inline__ void INTC_init_evba(void) { Set_system_register(AVR32_EVBA, (int)&_evba ); } void INTC_init_interrupts(void) { unsigned int int_grp, int_req; INTC_init_evba(); // For all interrupt groups, for (int_grp = 0; int_grp < AVR32_INTC_NUM_INT_GRPS; int_grp++) { // For all interrupt request lines of each group, for (int_req = 0; int_req < _int_handler_table[int_grp].num_irqs; int_req++) { // Assign _unhandled_interrupt as default interrupt handler. _int_handler_table[int_grp]._int_line_handler_table[int_req] = &_unhandled_interrupt; } // Set the interrupt group priority register to its default value. // By default, all interrupt groups are linked to the interrupt priority // level 0 and to the interrupt vector _int0. AVR32_INTC.ipr[int_grp] = ipr_val[AVR32_INTC_INT0]; } } void INTC_register_interrupt(__int_handler handler, unsigned int irq, unsigned int int_level) { // Determine the group of the IRQ. unsigned int int_grp = irq / AVR32_INTC_MAX_NUM_IRQS_PER_GRP; // Store in _int_line_handler_table_x the pointer to the interrupt handler, so // that _get_interrupt_handler can retrieve it when the interrupt is vectored. _int_handler_table[int_grp]._int_line_handler_table[irq % AVR32_INTC_MAX_NUM_IRQS_PER_GRP] = handler; // Program the corresponding IPRX register to set the interrupt priority level // and the interrupt vector offset that will be fetched by the core interrupt // system. // NOTE: The _intx functions are intermediate assembly functions between the // core interrupt system and the user interrupt handler. AVR32_INTC.ipr[int_grp] = ipr_val[int_level & (AVR32_INTC_IPR_INTLEVEL_MASK >> AVR32_INTC_IPR_INTLEVEL_OFFSET)]; } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief INTC driver for AVR32 UC3. * * AVR32 Interrupt Controller driver module. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with an INTC module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _INTC_H_ #define _INTC_H_ #include "compiler.h" //! Maximal number of interrupt request lines per group. #define AVR32_INTC_MAX_NUM_IRQS_PER_GRP 32 //! Number of interrupt priority levels. #define AVR32_INTC_NUM_INT_LEVELS (1 << AVR32_INTC_IPR_INTLEVEL_SIZE) #ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling. //! Pointer to interrupt handler. #if (defined __GNUC__) typedef void (*__int_handler)(void); #elif (defined __ICCAVR32__) typedef void (__interrupt *__int_handler)(void); #endif /*! \brief Initializes the hardware interrupt controller driver. * * \note Taken and adapted from Newlib. */ extern void INTC_init_interrupts(void); /*! \brief Registers an interrupt handler. * * \param handler Interrupt handler to register. * \param irq IRQ of the interrupt handler to register. * \param int_level Interrupt priority level to assign to the group of this IRQ. * * \warning The interrupt handler must manage the `rete' instruction, what can * be done thanks to pure assembly, inline assembly or the * `__attribute__((__interrupt__))' C function attribute. * * \warning If several interrupt handlers of a same group are registered with * different priority levels, only the latest priority level set will * be effective. * * \note Taken and adapted from Newlib. */ extern void INTC_register_interrupt(__int_handler handler, unsigned int irq, unsigned int int_level); #endif // __AVR32_ABI_COMPILER__ #endif // _INTC_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file has been prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Power Manager driver. * * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * *****************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "compiler.h" #include "pm.h" /*! \name PM Writable Bit-Field Registers */ //! @{ typedef union { unsigned long mcctrl; avr32_pm_mcctrl_t MCCTRL; } u_avr32_pm_mcctrl_t; typedef union { unsigned long cksel; avr32_pm_cksel_t CKSEL; } u_avr32_pm_cksel_t; typedef union { unsigned long pll; avr32_pm_pll_t PLL; } u_avr32_pm_pll_t; typedef union { unsigned long oscctrl0; avr32_pm_oscctrl0_t OSCCTRL0; } u_avr32_pm_oscctrl0_t; typedef union { unsigned long oscctrl1; avr32_pm_oscctrl1_t OSCCTRL1; } u_avr32_pm_oscctrl1_t; typedef union { unsigned long oscctrl32; avr32_pm_oscctrl32_t OSCCTRL32; } u_avr32_pm_oscctrl32_t; typedef union { unsigned long ier; avr32_pm_ier_t IER; } u_avr32_pm_ier_t; typedef union { unsigned long idr; avr32_pm_idr_t IDR; } u_avr32_pm_idr_t; typedef union { unsigned long icr; avr32_pm_icr_t ICR; } u_avr32_pm_icr_t; typedef union { unsigned long gcctrl; avr32_pm_gcctrl_t GCCTRL; } u_avr32_pm_gcctrl_t; typedef union { unsigned long rccr; avr32_pm_rccr_t RCCR; } u_avr32_pm_rccr_t; typedef union { unsigned long bgcr; avr32_pm_bgcr_t BGCR; } u_avr32_pm_bgcr_t; typedef union { unsigned long vregcr; avr32_pm_vregcr_t VREGCR; } u_avr32_pm_vregcr_t; typedef union { unsigned long bod; avr32_pm_bod_t BOD; } u_avr32_pm_bod_t; //! @} /*! \brief Sets the mode of the oscillator 0. * * \param pm Base address of the Power Manager (i.e. &AVR32_PM). * \param mode Oscillator 0 mode (i.e. AVR32_PM_OSCCTRL0_MODE_x). */ static void pm_set_osc0_mode(volatile avr32_pm_t *pm, unsigned int mode) { // Read u_avr32_pm_oscctrl0_t u_avr32_pm_oscctrl0 = {pm->oscctrl0}; // Modify u_avr32_pm_oscctrl0.OSCCTRL0.mode = mode; // Write pm->oscctrl0 = u_avr32_pm_oscctrl0.oscctrl0; } void pm_enable_osc0_ext_clock(volatile avr32_pm_t *pm) { pm_set_osc0_mode(pm, AVR32_PM_OSCCTRL0_MODE_EXT_CLOCK); } void pm_enable_osc0_crystal(volatile avr32_pm_t *pm, unsigned int fosc0) { pm_set_osc0_mode(pm, (fosc0 < 900000) ? AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G0 : (fosc0 < 3000000) ? AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G1 : (fosc0 < 8000000) ? AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G2 : AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G3); } void pm_enable_clk0(volatile avr32_pm_t *pm, unsigned int startup) { pm_enable_clk0_no_wait(pm, startup); pm_wait_for_clk0_ready(pm); } void pm_disable_clk0(volatile avr32_pm_t *pm) { pm->mcctrl &= ~AVR32_PM_MCCTRL_OSC0EN_MASK; } void pm_enable_clk0_no_wait(volatile avr32_pm_t *pm, unsigned int startup) { // Read register u_avr32_pm_oscctrl0_t u_avr32_pm_oscctrl0 = {pm->oscctrl0}; // Modify u_avr32_pm_oscctrl0.OSCCTRL0.startup = startup; // Write back pm->oscctrl0 = u_avr32_pm_oscctrl0.oscctrl0; pm->mcctrl |= AVR32_PM_MCCTRL_OSC0EN_MASK; } void pm_wait_for_clk0_ready(volatile avr32_pm_t *pm) { while (!(pm->poscsr & AVR32_PM_POSCSR_OSC0RDY_MASK)); } /*! \brief Sets the mode of the oscillator 1. * * \param pm Base address of the Power Manager (i.e. &AVR32_PM). * \param mode Oscillator 1 mode (i.e. AVR32_PM_OSCCTRL1_MODE_x). */ static void pm_set_osc1_mode(volatile avr32_pm_t *pm, unsigned int mode) { // Read u_avr32_pm_oscctrl1_t u_avr32_pm_oscctrl1 = {pm->oscctrl1}; // Modify u_avr32_pm_oscctrl1.OSCCTRL1.mode = mode; // Write pm->oscctrl1 = u_avr32_pm_oscctrl1.oscctrl1; } void pm_enable_osc1_ext_clock(volatile avr32_pm_t *pm) { pm_set_osc1_mode(pm, AVR32_PM_OSCCTRL1_MODE_EXT_CLOCK); } void pm_enable_osc1_crystal(volatile avr32_pm_t *pm, unsigned int fosc1) { pm_set_osc1_mode(pm, (fosc1 < 900000) ? AVR32_PM_OSCCTRL1_MODE_CRYSTAL_G0 : (fosc1 < 3000000) ? AVR32_PM_OSCCTRL1_MODE_CRYSTAL_G1 : (fosc1 < 8000000) ? AVR32_PM_OSCCTRL1_MODE_CRYSTAL_G2 : AVR32_PM_OSCCTRL1_MODE_CRYSTAL_G3); } void pm_enable_clk1(volatile avr32_pm_t *pm, unsigned int startup) { pm_enable_clk1_no_wait(pm, startup); pm_wait_for_clk1_ready(pm); } void pm_disable_clk1(volatile avr32_pm_t *pm) { pm->mcctrl &= ~AVR32_PM_MCCTRL_OSC1EN_MASK; } void pm_enable_clk1_no_wait(volatile avr32_pm_t *pm, unsigned int startup) { // Read register u_avr32_pm_oscctrl1_t u_avr32_pm_oscctrl1 = {pm->oscctrl1}; // Modify u_avr32_pm_oscctrl1.OSCCTRL1.startup = startup; // Write back pm->oscctrl1 = u_avr32_pm_oscctrl1.oscctrl1; pm->mcctrl |= AVR32_PM_MCCTRL_OSC1EN_MASK; } void pm_wait_for_clk1_ready(volatile avr32_pm_t *pm) { while (!(pm->poscsr & AVR32_PM_POSCSR_OSC1RDY_MASK)); } /*! \brief Sets the mode of the 32-kHz oscillator. * * \param pm Base address of the Power Manager (i.e. &AVR32_PM). * \param mode 32-kHz oscillator mode (i.e. AVR32_PM_OSCCTRL32_MODE_x). */ static void pm_set_osc32_mode(volatile avr32_pm_t *pm, unsigned int mode) { // Read u_avr32_pm_oscctrl32_t u_avr32_pm_oscctrl32 = {pm->oscctrl32}; // Modify u_avr32_pm_oscctrl32.OSCCTRL32.mode = mode; // Write pm->oscctrl32 = u_avr32_pm_oscctrl32.oscctrl32; } void pm_enable_osc32_ext_clock(volatile avr32_pm_t *pm) { pm_set_osc32_mode(pm, AVR32_PM_OSCCTRL32_MODE_EXT_CLOCK); } void pm_enable_osc32_crystal(volatile avr32_pm_t *pm) { pm_set_osc32_mode(pm, AVR32_PM_OSCCTRL32_MODE_CRYSTAL); } void pm_enable_clk32(volatile avr32_pm_t *pm, unsigned int startup) { pm_enable_clk32_no_wait(pm, startup); pm_wait_for_clk32_ready(pm); } void pm_disable_clk32(volatile avr32_pm_t *pm) { pm->oscctrl32 &= ~AVR32_PM_OSCCTRL32_OSC32EN_MASK; } void pm_enable_clk32_no_wait(volatile avr32_pm_t *pm, unsigned int startup) { // Read register u_avr32_pm_oscctrl32_t u_avr32_pm_oscctrl32 = {pm->oscctrl32}; // Modify u_avr32_pm_oscctrl32.OSCCTRL32.osc32en = 1; u_avr32_pm_oscctrl32.OSCCTRL32.startup = startup; // Write back pm->oscctrl32 = u_avr32_pm_oscctrl32.oscctrl32; } void pm_wait_for_clk32_ready(volatile avr32_pm_t *pm) { while (!(pm->poscsr & AVR32_PM_POSCSR_OSC32RDY_MASK)); } void pm_cksel(volatile avr32_pm_t *pm, unsigned int pbadiv, unsigned int pbasel, unsigned int pbbdiv, unsigned int pbbsel, unsigned int hsbdiv, unsigned int hsbsel) { u_avr32_pm_cksel_t u_avr32_pm_cksel = {0}; u_avr32_pm_cksel.CKSEL.cpusel = hsbsel; u_avr32_pm_cksel.CKSEL.cpudiv = hsbdiv; u_avr32_pm_cksel.CKSEL.hsbsel = hsbsel; u_avr32_pm_cksel.CKSEL.hsbdiv = hsbdiv; u_avr32_pm_cksel.CKSEL.pbasel = pbasel; u_avr32_pm_cksel.CKSEL.pbadiv = pbadiv; u_avr32_pm_cksel.CKSEL.pbbsel = pbbsel; u_avr32_pm_cksel.CKSEL.pbbdiv = pbbdiv; pm->cksel = u_avr32_pm_cksel.cksel; // Wait for ckrdy bit and then clear it while (!(pm->poscsr & AVR32_PM_POSCSR_CKRDY_MASK)); } void pm_gc_setup(volatile avr32_pm_t *pm, unsigned int gc, unsigned int osc_or_pll, // Use Osc (=0) or PLL (=1) unsigned int pll_osc, // Sel Osc0/PLL0 or Osc1/PLL1 unsigned int diven, unsigned int div) { u_avr32_pm_gcctrl_t u_avr32_pm_gcctrl = {0}; u_avr32_pm_gcctrl.GCCTRL.oscsel = pll_osc; u_avr32_pm_gcctrl.GCCTRL.pllsel = osc_or_pll; u_avr32_pm_gcctrl.GCCTRL.diven = diven; u_avr32_pm_gcctrl.GCCTRL.div = div; pm->gcctrl[gc] = u_avr32_pm_gcctrl.gcctrl; } void pm_gc_enable(volatile avr32_pm_t *pm, unsigned int gc) { pm->gcctrl[gc] |= AVR32_PM_GCCTRL_CEN_MASK; } void pm_gc_disable(volatile avr32_pm_t *pm, unsigned int gc) { pm->gcctrl[gc] &= ~AVR32_PM_GCCTRL_CEN_MASK; } void pm_pll_setup(volatile avr32_pm_t *pm, unsigned int pll, unsigned int mul, unsigned int div, unsigned int osc, unsigned int lockcount) { u_avr32_pm_pll_t u_avr32_pm_pll = {0}; u_avr32_pm_pll.PLL.pllosc = osc; u_avr32_pm_pll.PLL.plldiv = div; u_avr32_pm_pll.PLL.pllmul = mul; u_avr32_pm_pll.PLL.pllcount = lockcount; pm->pll[pll] = u_avr32_pm_pll.pll; } void pm_pll_set_option(volatile avr32_pm_t *pm, unsigned int pll, unsigned int pll_freq, unsigned int pll_div2, unsigned int pll_wbwdisable) { u_avr32_pm_pll_t u_avr32_pm_pll = {pm->pll[pll]}; u_avr32_pm_pll.PLL.pllopt = pll_freq | (pll_div2 << 1) | (pll_wbwdisable << 2); pm->pll[pll] = u_avr32_pm_pll.pll; } unsigned int pm_pll_get_option(volatile avr32_pm_t *pm, unsigned int pll) { return (pm->pll[pll] & AVR32_PM_PLLOPT_MASK) >> AVR32_PM_PLLOPT_OFFSET; } void pm_pll_enable(volatile avr32_pm_t *pm, unsigned int pll) { pm->pll[pll] |= AVR32_PM_PLLEN_MASK; } void pm_pll_disable(volatile avr32_pm_t *pm, unsigned int pll) { pm->pll[pll] &= ~AVR32_PM_PLLEN_MASK; } void pm_wait_for_pll0_locked(volatile avr32_pm_t *pm) { while (!(pm->poscsr & AVR32_PM_POSCSR_LOCK0_MASK)); } void pm_wait_for_pll1_locked(volatile avr32_pm_t *pm) { while (!(pm->poscsr & AVR32_PM_POSCSR_LOCK1_MASK)); } void pm_switch_to_clock(volatile avr32_pm_t *pm, unsigned long clock) { // Read u_avr32_pm_mcctrl_t u_avr32_pm_mcctrl = {pm->mcctrl}; // Modify u_avr32_pm_mcctrl.MCCTRL.mcsel = clock; // Write back pm->mcctrl = u_avr32_pm_mcctrl.mcctrl; } void pm_switch_to_osc0(volatile avr32_pm_t *pm, unsigned int fosc0, unsigned int startup) { pm_enable_osc0_crystal(pm, fosc0); // Enable the Osc0 in crystal mode pm_enable_clk0(pm, startup); // Crystal startup time - This parameter is critical and depends on the characteristics of the crystal pm_switch_to_clock(pm, AVR32_PM_MCSEL_OSC0); // Then switch main clock to Osc0 } void pm_bod_enable_irq(volatile avr32_pm_t *pm) { pm->ier = AVR32_PM_IER_BODDET_MASK; } void pm_bod_disable_irq(volatile avr32_pm_t *pm) { Bool global_interrupt_enabled = Is_global_interrupt_enabled(); if (global_interrupt_enabled) Disable_global_interrupt(); pm->idr = AVR32_PM_IDR_BODDET_MASK; pm->isr; if (global_interrupt_enabled) Enable_global_interrupt(); } void pm_bod_clear_irq(volatile avr32_pm_t *pm) { pm->icr = AVR32_PM_ICR_BODDET_MASK; } unsigned long pm_bod_get_irq_status(volatile avr32_pm_t *pm) { return ((pm->isr & AVR32_PM_ISR_BODDET_MASK) != 0); } unsigned long pm_bod_get_irq_enable_bit(volatile avr32_pm_t *pm) { return ((pm->imr & AVR32_PM_IMR_BODDET_MASK) != 0); } unsigned long pm_bod_get_level(volatile avr32_pm_t *pm) { return (pm->bod & AVR32_PM_BOD_LEVEL_MASK) >> AVR32_PM_BOD_LEVEL_OFFSET; } unsigned long pm_read_gplp(volatile avr32_pm_t *pm, unsigned long gplp) { return pm->gplp[gplp]; } void pm_write_gplp(volatile avr32_pm_t *pm, unsigned long gplp, unsigned long value) { pm->gplp[gplp] = value; } long pm_enable_module(volatile avr32_pm_t *pm, unsigned long module) { unsigned long domain = module>>5; unsigned long *regptr = (unsigned long*)(&(pm->cpumask) + domain); // Implementation-specific shortcut: the ckMASK registers are contiguous and // memory-mapped in that order: CPUMASK, HSBMASK, PBAMASK, PBBMASK. *regptr |= (1<<(module%32)); return PASS; } long pm_disable_module(volatile avr32_pm_t *pm, unsigned long module) { unsigned long domain = module>>5; unsigned long *regptr = (unsigned long*)(&(pm->cpumask) + domain); // Implementation-specific shortcut: the ckMASK registers are contiguous and // memory-mapped in that order: CPUMASK, HSBMASK, PBAMASK, PBBMASK. *regptr &= ~(1<<(module%32)); return PASS; } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file has been prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Power Manager driver. * * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * *****************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _PM_H_ #define _PM_H_ #include #include "compiler.h" #include "preprocessor.h" /*! \brief Sets the MCU in the specified sleep mode. * * \param mode Sleep mode: * \arg \c AVR32_PM_SMODE_IDLE: Idle; * \arg \c AVR32_PM_SMODE_FROZEN: Frozen; * \arg \c AVR32_PM_SMODE_STANDBY: Standby; * \arg \c AVR32_PM_SMODE_STOP: Stop; * \arg \c AVR32_PM_SMODE_DEEP_STOP: DeepStop; * \arg \c AVR32_PM_SMODE_STATIC: Static. */ #define SLEEP(mode) {__asm__ __volatile__ ("sleep "STRINGZ(mode));} //! Input and output parameters when initializing PM clocks using pm_configure_clocks(). typedef struct { //! CPU frequency (input/output argument). unsigned long cpu_f; //! PBA frequency (input/output argument). unsigned long pba_f; //! Oscillator 0's external crystal(or external clock) frequency (board dependant) (input argument). unsigned long osc0_f; //! Oscillator 0's external crystal(or external clock) startup time: AVR32_PM_OSCCTRL0_STARTUP_x_RCOSC (input argument). unsigned long osc0_startup; } pm_freq_param_t; #define PM_FREQ_STATUS_FAIL (-1) #define PM_FREQ_STATUS_OK (0) /*! \brief Gets the MCU reset cause. * * \param pm Base address of the Power Manager instance (i.e. &AVR32_PM). * * \return The MCU reset cause which can be masked with the * \c AVR32_PM_RCAUSE_x_MASK bit-masks to isolate specific causes. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ unsigned int pm_get_reset_cause(volatile avr32_pm_t *pm) { return pm->rcause; } /*! * \brief This function will enable the external clock mode of the oscillator 0. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) */ extern void pm_enable_osc0_ext_clock(volatile avr32_pm_t *pm); /*! * \brief This function will enable the crystal mode of the oscillator 0. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param fosc0 Oscillator 0 crystal frequency (Hz) */ extern void pm_enable_osc0_crystal(volatile avr32_pm_t *pm, unsigned int fosc0); /*! * \brief This function will enable the oscillator 0 to be used with a startup time. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param startup Clock 0 startup time. AVR32_PM_OSCCTRL0_STARTUP_x_RCOSC. */ extern void pm_enable_clk0(volatile avr32_pm_t *pm, unsigned int startup); /*! * \brief This function will disable the oscillator 0. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) */ extern void pm_disable_clk0(volatile avr32_pm_t *pm); /*! * \brief This function will enable the oscillator 0 to be used with no startup time. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param startup Clock 0 startup time, for which the function does not wait. AVR32_PM_OSCCTRL0_STARTUP_x_RCOSC. */ extern void pm_enable_clk0_no_wait(volatile avr32_pm_t *pm, unsigned int startup); /*! * \brief This function will wait until the Osc0 clock is ready. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) */ extern void pm_wait_for_clk0_ready(volatile avr32_pm_t *pm); /*! * \brief This function will enable the external clock mode of the oscillator 1. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) */ extern void pm_enable_osc1_ext_clock(volatile avr32_pm_t *pm); /*! * \brief This function will enable the crystal mode of the oscillator 1. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param fosc1 Oscillator 1 crystal frequency (Hz) */ extern void pm_enable_osc1_crystal(volatile avr32_pm_t *pm, unsigned int fosc1); /*! * \brief This function will enable the oscillator 1 to be used with a startup time. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param startup Clock 1 startup time. AVR32_PM_OSCCTRL1_STARTUP_x_RCOSC. */ extern void pm_enable_clk1(volatile avr32_pm_t *pm, unsigned int startup); /*! * \brief This function will disable the oscillator 1. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) */ extern void pm_disable_clk1(volatile avr32_pm_t *pm); /*! * \brief This function will enable the oscillator 1 to be used with no startup time. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param startup Clock 1 startup time, for which the function does not wait. AVR32_PM_OSCCTRL1_STARTUP_x_RCOSC. */ extern void pm_enable_clk1_no_wait(volatile avr32_pm_t *pm, unsigned int startup); /*! * \brief This function will wait until the Osc1 clock is ready. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) */ extern void pm_wait_for_clk1_ready(volatile avr32_pm_t *pm); /*! * \brief This function will enable the external clock mode of the 32-kHz oscillator. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) */ extern void pm_enable_osc32_ext_clock(volatile avr32_pm_t *pm); /*! * \brief This function will enable the crystal mode of the 32-kHz oscillator. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) */ extern void pm_enable_osc32_crystal(volatile avr32_pm_t *pm); /*! * \brief This function will enable the oscillator 32 to be used with a startup time. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param startup Clock 32 kHz startup time. AVR32_PM_OSCCTRL32_STARTUP_x_RCOSC. */ extern void pm_enable_clk32(volatile avr32_pm_t *pm, unsigned int startup); /*! * \brief This function will disable the oscillator 32. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) */ extern void pm_disable_clk32(volatile avr32_pm_t *pm); /*! * \brief This function will enable the oscillator 32 to be used with no startup time. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param startup Clock 32 kHz startup time, for which the function does not wait. AVR32_PM_OSCCTRL32_STARTUP_x_RCOSC. */ extern void pm_enable_clk32_no_wait(volatile avr32_pm_t *pm, unsigned int startup); /*! * \brief This function will wait until the osc32 clock is ready. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) */ extern void pm_wait_for_clk32_ready(volatile avr32_pm_t *pm); /*! * \brief This function will select all the power manager clocks. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param pbadiv Peripheral Bus A clock divisor enable * \param pbasel Peripheral Bus A select * \param pbbdiv Peripheral Bus B clock divisor enable * \param pbbsel Peripheral Bus B select * \param hsbdiv High Speed Bus clock divisor enable (CPU clock = HSB clock) * \param hsbsel High Speed Bus select (CPU clock = HSB clock ) */ extern void pm_cksel(volatile avr32_pm_t *pm, unsigned int pbadiv, unsigned int pbasel, unsigned int pbbdiv, unsigned int pbbsel, unsigned int hsbdiv, unsigned int hsbsel); /*! * \brief This function will setup a generic clock. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param gc generic clock number (0 for gc0...) * \param osc_or_pll Use OSC (=0) or PLL (=1) * \param pll_osc Select Osc0/PLL0 or Osc1/PLL1 * \param diven Generic clock divisor enable * \param div Generic clock divisor */ extern void pm_gc_setup(volatile avr32_pm_t *pm, unsigned int gc, unsigned int osc_or_pll, unsigned int pll_osc, unsigned int diven, unsigned int div); /*! * \brief This function will enable a generic clock. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param gc generic clock number (0 for gc0...) */ extern void pm_gc_enable(volatile avr32_pm_t *pm, unsigned int gc); /*! * \brief This function will disable a generic clock. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param gc generic clock number (0 for gc0...) */ extern void pm_gc_disable(volatile avr32_pm_t *pm, unsigned int gc); /*! * \brief This function will setup a PLL. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param pll PLL number(0 for PLL0, 1 for PLL1) * \param mul PLL MUL in the PLL formula * \param div PLL DIV in the PLL formula * \param osc OSC number (0 for osc0, 1 for osc1) * \param lockcount PLL lockount */ extern void pm_pll_setup(volatile avr32_pm_t *pm, unsigned int pll, unsigned int mul, unsigned int div, unsigned int osc, unsigned int lockcount); /*! * \brief This function will set a PLL option. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param pll PLL number(0 for PLL0, 1 for PLL1) * \param pll_freq Set to 1 for VCO frequency range 80-180MHz, set to 0 for VCO frequency range 160-240Mhz. * \param pll_div2 Divide the PLL output frequency by 2 (this settings does not change the FVCO value) * \param pll_wbwdisable 1 Disable the Wide-Bandith Mode (Wide-Bandwith mode allow a faster startup time and out-of-lock time). 0 to enable the Wide-Bandith Mode. */ extern void pm_pll_set_option(volatile avr32_pm_t *pm, unsigned int pll, unsigned int pll_freq, unsigned int pll_div2, unsigned int pll_wbwdisable); /*! * \brief This function will get a PLL option. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param pll PLL number(0 for PLL0, 1 for PLL1) * \return Option */ extern unsigned int pm_pll_get_option(volatile avr32_pm_t *pm, unsigned int pll); /*! * \brief This function will enable a PLL. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param pll PLL number(0 for PLL0, 1 for PLL1) */ extern void pm_pll_enable(volatile avr32_pm_t *pm, unsigned int pll); /*! * \brief This function will disable a PLL. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param pll PLL number(0 for PLL0, 1 for PLL1) */ extern void pm_pll_disable(volatile avr32_pm_t *pm, unsigned int pll); /*! * \brief This function will wait for PLL0 locked * \param pm Base address of the Power Manager (i.e. &AVR32_PM) */ extern void pm_wait_for_pll0_locked(volatile avr32_pm_t *pm); /*! * \brief This function will wait for PLL1 locked * \param pm Base address of the Power Manager (i.e. &AVR32_PM) */ extern void pm_wait_for_pll1_locked(volatile avr32_pm_t *pm); /*! * \brief This function will switch the power manager main clock. * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param clock Clock to be switched on. AVR32_PM_MCSEL_SLOW for RCOsc, AVR32_PM_MCSEL_OSC0 for Osc0, AVR32_PM_MCSEL_PLL0 for PLL0. */ extern void pm_switch_to_clock(volatile avr32_pm_t *pm, unsigned long clock); /*! * \brief Switch main clock to clock Osc0 (crystal mode) * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param fosc0 Oscillator 0 crystal frequency (Hz) * \param startup Crystal 0 startup time. AVR32_PM_OSCCTRL0_STARTUP_x_RCOSC. */ extern void pm_switch_to_osc0(volatile avr32_pm_t *pm, unsigned int fosc0, unsigned int startup); /*! \brief Enables the Brown-Out Detector interrupt. * * \param pm Base address of the Power Manager (i.e. &AVR32_PM). */ extern void pm_bod_enable_irq(volatile avr32_pm_t *pm); /*! \brief Disables the Brown-Out Detector interrupt. * * \param pm Base address of the Power Manager (i.e. &AVR32_PM). */ extern void pm_bod_disable_irq(volatile avr32_pm_t *pm); /*! \brief Clears the Brown-Out Detector interrupt flag. * * \param pm Base address of the Power Manager (i.e. &AVR32_PM). */ extern void pm_bod_clear_irq(volatile avr32_pm_t *pm); /*! \brief Gets the Brown-Out Detector interrupt flag. * * \param pm Base address of the Power Manager (i.e. &AVR32_PM). * * \retval 0 No BOD interrupt. * \retval 1 BOD interrupt pending. */ extern unsigned long pm_bod_get_irq_status(volatile avr32_pm_t *pm); /*! \brief Gets the Brown-Out Detector interrupt enable status. * * \param pm Base address of the Power Manager (i.e. &AVR32_PM). * * \retval 0 BOD interrupt disabled. * \retval 1 BOD interrupt enabled. */ extern unsigned long pm_bod_get_irq_enable_bit(volatile avr32_pm_t *pm); /*! \brief Gets the triggering threshold of the Brown-Out Detector. * * \param pm Base address of the Power Manager (i.e. &AVR32_PM). * * \return Triggering threshold of the BOD. See the electrical characteristics * in the part datasheet for actual voltage levels. */ extern unsigned long pm_bod_get_level(volatile avr32_pm_t *pm); /*! * \brief Read the content of the PM GPLP registers * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param gplp GPLP register index (0,1,... depending on the number of GPLP registers for a given part) * * \return The content of the chosen GPLP register. */ extern unsigned long pm_read_gplp(volatile avr32_pm_t *pm, unsigned long gplp); /*! * \brief Write into the PM GPLP registers * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param gplp GPLP register index (0,1,... depending on the number of GPLP registers for a given part) * \param value Value to write */ extern void pm_write_gplp(volatile avr32_pm_t *pm, unsigned long gplp, unsigned long value); /*! \brief Enable the clock of a module. * * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param module The module to clock (use one of the defines in the part-specific * header file under "toolchain folder"/avr32/inc(lude)/avr32/; depending on the * clock domain, look for the sections "CPU clocks", "HSB clocks", "PBx clocks") * * \return Status. * \retval 0 Success. * \retval <0 An error occured. */ extern long pm_enable_module(volatile avr32_pm_t *pm, unsigned long module); /*! \brief Disable the clock of a module. * * \param pm Base address of the Power Manager (i.e. &AVR32_PM) * \param module The module to shut down (use one of the defines in the part-specific * header file under "toolchain folder"/avr32/inc(lude)/avr32/; depending on the * clock domain, look for the sections "CPU clocks", "HSB clocks", "PBx clocks") * * \return Status. * \retval 0 Success. * \retval <0 An error occured. */ extern long pm_disable_module(volatile avr32_pm_t *pm, unsigned long module); /*! \brief Automatically configure the CPU, PBA, PBB, and HSB clocks * according to the user wishes. * * This function needs some parameters stored in a pm_freq_param_t structure: * - cpu_f and pba_f are the wanted frequencies, * - osc0_f is the oscillator 0 on-board frequency (e.g. FOSC0), * - osc0_startup is the oscillator 0 startup time (e.g. OSC0_STARTUP). * * The function will then configure the clocks using the following rules: * - It first try to find a valid PLL frequency (the highest possible value to avoid jitter) in order * to satisfy the CPU frequency, * - It optimizes the configuration depending the various divide stages, * - Then, the PBA frequency is configured from the CPU freq. * - Note that HSB and PBB are configured with the same frequency as CPU. * - Note also that the number of wait states of the flash read accesses is automatically set-up depending * the CPU frequency. As a consequence, the application needs the FLASHC driver to compile. * * The CPU, HSB and PBA frequencies programmed after configuration are stored back into cpu_f and pba_f. * * \param param pointer on the configuration structure. * * \retval PM_FREQ_STATUS_OK Mode successfully initialized. * \retval PM_FREQ_STATUS_FAIL The configuration can not be done. */ extern int pm_configure_clocks(pm_freq_param_t *param); /*! \brief Automatically configure the USB clock. * * USB clock is configured to 48MHz, using the PLL1 from the Oscillator0, assuming * a 12 MHz crystal is connected to it. */ extern void pm_configure_usb_clock(void); #endif // _PM_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm_conf_clocks.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file has been prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Power Manager clocks configuration helper. * * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * *****************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include #include "compiler.h" #include "pm.h" extern void flashc_set_wait_state(unsigned int wait_state); #if (defined AVR32_FLASHC_210_H_INCLUDED) extern void flashc_issue_command(unsigned int command, int page_number); #endif #define PM_MAX_MUL ((1 << AVR32_PM_PLL0_PLLMUL_SIZE) - 1) int pm_configure_clocks(pm_freq_param_t *param) { // Supported frequencies: // Fosc0 mul div PLL div2_en cpu_f pba_f Comment // 12 15 1 192 1 12 12 // 12 9 3 40 1 20 20 PLL out of spec // 12 15 1 192 1 24 12 // 12 9 1 120 1 30 15 // 12 9 3 40 0 40 20 PLL out of spec // 12 15 1 192 1 48 12 // 12 15 1 192 1 48 24 // 12 8 1 108 1 54 27 // 12 9 1 120 1 60 15 // 12 9 1 120 1 60 30 // 12 10 1 132 1 66 16.5 // unsigned long in_cpu_f = param->cpu_f; unsigned long in_osc0_f = param->osc0_f; unsigned long mul, div, div2_en = 0, div2_cpu = 0, div2_pba = 0; unsigned long pll_freq, rest; Bool b_div2_pba, b_div2_cpu; // Switch to external Oscillator 0 pm_switch_to_osc0(&AVR32_PM, in_osc0_f, param->osc0_startup); // Start with CPU freq config if (in_cpu_f == in_osc0_f) { param->cpu_f = in_osc0_f; param->pba_f = in_osc0_f; return PM_FREQ_STATUS_OK; } else if (in_cpu_f < in_osc0_f) { // TBD } rest = in_cpu_f % in_osc0_f; for (div = 1; div < 32; div++) { if ((div * rest) % in_osc0_f == 0) break; } if (div == 32) return PM_FREQ_STATUS_FAIL; mul = (in_cpu_f * div) / in_osc0_f; if (mul > PM_MAX_MUL) return PM_FREQ_STATUS_FAIL; // export 2power from PLL div to div2_cpu while (!(div % 2)) { div /= 2; div2_cpu++; } // Here we know the mul and div parameter of the PLL config. // . Check out if the PLL has a valid in_cpu_f. // . Try to have for the PLL frequency (VCO output) the highest possible value // to reduce jitter. while (in_osc0_f * 2 * mul / div < AVR32_PM_PLL_VCO_RANGE0_MAX_FREQ) { if (2 * mul > PM_MAX_MUL) break; mul *= 2; div2_cpu++; } if (div2_cpu != 0) { div2_cpu--; div2_en = 1; } pll_freq = in_osc0_f * mul / (div * (1 << div2_en)); // Update real CPU Frequency param->cpu_f = pll_freq / (1 << div2_cpu); mul--; pm_pll_setup(&AVR32_PM , 0 // pll , mul // mul , div // div , 0 // osc , 16 // lockcount ); pm_pll_set_option(&AVR32_PM , 0 // pll // PLL clock is lower than 160MHz: need to set pllopt. , (pll_freq < AVR32_PM_PLL_VCO_RANGE0_MIN_FREQ) ? 1 : 0 // pll_freq , div2_en // pll_div2 , 0 // pll_wbwdisable ); rest = pll_freq; while (rest > AVR32_PM_PBA_MAX_FREQ || rest != param->pba_f) { div2_pba++; rest = pll_freq / (1 << div2_pba); if (rest < param->pba_f) break; } // Update real PBA Frequency param->pba_f = pll_freq / (1 << div2_pba); // Enable PLL0 pm_pll_enable(&AVR32_PM, 0); // Wait for PLL0 locked pm_wait_for_pll0_locked(&AVR32_PM); if (div2_cpu) { b_div2_cpu = TRUE; div2_cpu--; } else b_div2_cpu = FALSE; if (div2_pba) { b_div2_pba = TRUE; div2_pba--; } else b_div2_pba = FALSE; pm_cksel(&AVR32_PM , b_div2_pba, div2_pba // PBA , b_div2_cpu, div2_cpu // PBB , b_div2_cpu, div2_cpu // HSB ); if (param->cpu_f > AVR32_FLASHC_FWS_0_MAX_FREQ) { flashc_set_wait_state(1); #if (defined AVR32_FLASHC_210_H_INCLUDED) if (param->cpu_f > AVR32_FLASHC_HSEN_FWS_1_MAX_FREQ) flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSEN, -1); else flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSDIS, -1); #endif } else { flashc_set_wait_state(0); #if (defined AVR32_FLASHC_210_H_INCLUDED) if (param->cpu_f > AVR32_FLASHC_HSEN_FWS_0_MAX_FREQ) flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSEN, -1); else flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSDIS, -1); #endif } pm_switch_to_clock(&AVR32_PM, AVR32_PM_MCCTRL_MCSEL_PLL0); return PM_FREQ_STATUS_OK; } void pm_configure_usb_clock(void) { #if UC3A3 // Setup USB GCLK. pm_gc_setup(&AVR32_PM, AVR32_PM_GCLK_USBB, // gc 0, // osc_or_pll: use Osc (if 0) or PLL (if 1) 0, // pll_osc: select Osc0/PLL0 or Osc1/PLL1 0, // diven 0); // div // Enable USB GCLK. pm_gc_enable(&AVR32_PM, AVR32_PM_GCLK_USBB); #else // Use 12MHz from OSC0 and generate 96 MHz pm_pll_setup(&AVR32_PM, 1, // pll. 7, // mul. 1, // div. 0, // osc. 16); // lockcount. pm_pll_set_option(&AVR32_PM, 1, // pll. 1, // pll_freq: choose the range 80-180MHz. 1, // pll_div2. 0); // pll_wbwdisable. // start PLL1 and wait forl lock pm_pll_enable(&AVR32_PM, 1); // Wait for PLL1 locked. pm_wait_for_pll1_locked(&AVR32_PM); pm_gc_setup(&AVR32_PM, AVR32_PM_GCLK_USBB, // gc. 1, // osc_or_pll: use Osc (if 0) or PLL (if 1). 1, // pll_osc: select Osc0/PLL0 or Osc1/PLL1. 0, // diven. 0); // div. pm_gc_enable(&AVR32_PM, AVR32_PM_GCLK_USBB); #endif } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/power_clocks_lib.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file has been prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief High-level library abstracting features such as oscillators/pll/dfll * configuration, clock configuration, System-sensible parameters * configuration, buses clocks configuration, sleep mode, reset. * * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * *****************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "power_clocks_lib.h" //! Device-specific data #if UC3L static long int pcl_configure_clocks_uc3l(pcl_freq_param_t *param); // FORWARD declaration #endif #if UC3C static long int pcl_configure_clocks_uc3c(pcl_freq_param_t *param); // FORWARD declaration #endif long int pcl_configure_clocks(pcl_freq_param_t *param) { #ifndef AVR32_PM_VERSION_RESETVALUE // Implementation for UC3A, UC3A3, UC3B parts. return(pm_configure_clocks(param)); #else #ifdef AVR32_PM_410_H_INCLUDED // Implementation for UC3C parts. return(pcl_configure_clocks_uc3c(param)); #else // Implementation for UC3L parts. return(pcl_configure_clocks_uc3l(param)); #endif #endif } //! Device-specific implementation #if UC3L // FORWARD declaration static long int pcl_configure_synchronous_clocks( pm_clk_src_t main_clk_src, unsigned long main_clock_freq_hz, pcl_freq_param_t *param); long int pcl_configure_clocks_rcsys(pcl_freq_param_t *param) { // Supported main clock sources: PCL_MC_RCSYS // Supported synchronous clocks frequencies if RCSYS is the main clock source: // 115200Hz, 57600Hz, 28800Hz, 14400Hz, 7200Hz, 3600Hz, 1800Hz, 900Hz, 450Hz. // NOTE: by default, this implementation doesn't perform thorough checks on the // input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. #ifdef AVR32SFW_INPUT_CHECK // Verify that fCPU >= fPBx if((param->cpu_f < param->pba_f) || (param->cpu_f < param->pbb_f)) return(-1); #endif #ifdef AVR32SFW_INPUT_CHECK // Verify that the target frequencies are reachable. if((param->cpu_f > SCIF_SLOWCLOCK_FREQ_HZ) || (param->pba_f > SCIF_SLOWCLOCK_FREQ_HZ) || (param->pbb_f > SCIF_SLOWCLOCK_FREQ_HZ)) return(-1); #endif return(pcl_configure_synchronous_clocks(PM_CLK_SRC_SLOW, SCIF_SLOWCLOCK_FREQ_HZ, param)); } long int pcl_configure_clocks_rc120m(pcl_freq_param_t *param) { // Supported main clock sources: PCL_MC_RC120M // Supported synchronous clocks frequencies if RC120M is the main clock source: // 30MHz, 15MHz, 7.5MHz, 3.75MHz, 1.875MHz, 937.5kHz, 468.75kHz. // NOTE: by default, this implementation doesn't perform thorough checks on the // input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. #ifdef AVR32SFW_INPUT_CHECK // Verify that fCPU >= fPBx if((param->cpu_f < param->pba_f) || (param->cpu_f < param->pbb_f)) return(-1); #endif #ifdef AVR32SFW_INPUT_CHECK // Verify that the target frequencies are reachable. if((param->cpu_f > SCIF_RC120M_FREQ_HZ) || (param->pba_f > SCIF_RC120M_FREQ_HZ) || (param->pbb_f > SCIF_RC120M_FREQ_HZ)) return(-1); #endif // Start the 120MHz internal RCosc (RC120M) clock scif_start_rc120M(); return(pcl_configure_synchronous_clocks(PM_CLK_SRC_RC120M, SCIF_RC120M_FREQ_HZ, param)); } long int pcl_configure_clocks_osc0(pcl_freq_param_t *param) { // Supported main clock sources: PCL_MC_OSC0 // Supported synchronous clocks frequencies if OSC0 is the main clock source: // (these obviously depend on the OSC0 frequency; we'll take 16MHz as an example) // 16MHz, 8MHz, 4MHz, 2MHz, 1MHz, 500kHz, 250kHz, 125kHz, 62.5kHz. // NOTE: by default, this implementation doesn't perform thorough checks on the // input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. unsigned long main_clock_freq; #ifdef AVR32SFW_INPUT_CHECK // Verify that fCPU >= fPBx if((param->cpu_f < param->pba_f) || (param->cpu_f < param->pbb_f)) return(-1); #endif main_clock_freq = param->osc0_f; #ifdef AVR32SFW_INPUT_CHECK // Verify that the target frequencies are reachable. if((param->cpu_f > main_clock_freq) || (param->pba_f > main_clock_freq) || (param->pbb_f > main_clock_freq)) return(-1); #endif // Configure OSC0 in crystal mode, external crystal with a fcrystal Hz frequency. scif_configure_osc_crystalmode(SCIF_OSC0, main_clock_freq); // Enable the OSC0 scif_enable_osc(SCIF_OSC0, param->osc0_startup, true); return(pcl_configure_synchronous_clocks(PM_CLK_SRC_OSC0, main_clock_freq, param)); } long int pcl_configure_clocks_dfll0(pcl_freq_param_t *param) { // Supported main clock sources: PCL_MC_DFLL // Supported synchronous clocks frequencies if DFLL is the main clock source: // (these obviously depend on the DFLL target frequency; we'll take 100MHz as an example) // 50MHz, 25MHz, 12.5MHz, 6.25MHz, 3.125MHz, 1562.5kHz, 781.25kHz, 390.625kHz. // NOTE: by default, this implementation doesn't perform thorough checks on the // input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. unsigned long main_clock_freq; scif_gclk_opt_t *pgc_dfllif_ref_opt; #ifdef AVR32SFW_INPUT_CHECK // Verify that fCPU >= fPBx if((param->cpu_f < param->pba_f) || (param->cpu_f < param->pbb_f)) return(-1); #endif main_clock_freq = param->dfll_f; #ifdef AVR32SFW_INPUT_CHECK // Verify that the target DFLL output frequency is in the correct range. if((main_clock_freq > SCIF_DFLL_MAXFREQ_HZ) || (main_clock_freq < SCIF_DFLL_MINFREQ_HZ)) return(-1); // Verify that the target frequencies are reachable. if((param->cpu_f > main_clock_freq) || (param->pba_f > main_clock_freq) || (param->pbb_f > main_clock_freq)) return(-1); #endif pgc_dfllif_ref_opt = (scif_gclk_opt_t *)param->pextra_params; // Implementation note: this implementation configures the DFLL in closed-loop // mode (because it gives the best accuracy) which enables the generic clock CLK_DFLLIF_REF // as a reference (RCSYS being used as the generic clock source, undivided). scif_dfll0_closedloop_configure_and_start(pgc_dfllif_ref_opt, main_clock_freq, TRUE); return(pcl_configure_synchronous_clocks(PM_CLK_SRC_DFLL0, main_clock_freq, param)); } static long int pcl_configure_clocks_uc3l(pcl_freq_param_t *param) { // Supported main clock sources: PCL_MC_RCSYS, PCL_MC_OSC0, PCL_MC_DFLL0, PCL_MC_RC120M // Supported synchronous clocks frequencies if RCSYS is the main clock source: // 115200Hz, 57600Hz, 28800Hz, 14400Hz, 7200Hz, 3600Hz, 1800Hz, 900Hz, 450Hz. // Supported synchronous clocks frequencies if RC120M is the main clock source: // 30MHz, 15MHz, 7.5MHz, 3.75MHz, 1.875MHz, 937.5kHz, 468.75kHz. // Supported synchronous clocks frequencies if OSC0 is the main clock source: // (these obviously depend on the OSC0 frequency; we'll take 16MHz as an example) // 16MHz, 8MHz, 4MHz, 2MHz, 1MHz, 500kHz, 250kHz, 125kHz, 62.5kHz. // Supported synchronous clocks frequencies if DFLL is the main clock source: // (these obviously depend on the DFLL target frequency; we'll take 100MHz as an example) // 50MHz, 25MHz, 12.5MHz, 6.25MHz, 3.125MHz, 1562.5kHz, 781.25kHz, 390.625kHz. // NOTE: by default, this implementation doesn't perform thorough checks on the // input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. #ifdef AVR32SFW_INPUT_CHECK // Verify that fCPU >= fPBx if((param->cpu_f < param->pba_f) || (param->cpu_f < param->pbb_f)) return(-1); #endif if(PCL_MC_RCSYS == param->main_clk_src) { return(pcl_configure_clocks_rcsys(param)); } else if(PCL_MC_RC120M == param->main_clk_src) { return(pcl_configure_clocks_rc120m(param)); } else if(PCL_MC_OSC0 == param->main_clk_src) { return(pcl_configure_clocks_osc0(param)); } else // PCL_MC_DFLL0 == param->main_clk_src { return(pcl_configure_clocks_dfll0(param)); } } static long int pcl_configure_synchronous_clocks(pm_clk_src_t main_clk_src, unsigned long main_clock_freq_hz, pcl_freq_param_t *param) { //# //# Set the Synchronous clock division ratio for each clock domain //# pm_set_all_cksel(main_clock_freq_hz, param->cpu_f, param->pba_f, param->pbb_f); //# //# Set the Flash wait state and the speed read mode (depending on the target CPU frequency). //# #if UC3L flashcdw_set_flash_waitstate_and_readmode(param->cpu_f); #elif UC3C flashc_set_flash_waitstate_and_readmode(param->cpu_f); #endif //# //# Switch the main clock source to the selected clock. //# pm_set_mclk_source(main_clk_src); return PASS; } #endif // UC3L device-specific implementation //! UC3C Device-specific implementation #if UC3C static long int pcl_configure_clocks_uc3c(pcl_freq_param_t *param) { #define PM_MAX_MUL ((1 << AVR32_SCIF_PLLMUL_SIZE) - 1) #define AVR32_PM_PBA_MAX_FREQ 66000000 #define AVR32_PM_PLL_VCO_RANGE0_MAX_FREQ 240000000 #define AVR32_PM_PLL_VCO_RANGE0_MIN_FREQ 160000000 // Implementation for UC3C parts. // Supported frequencies: // Fosc0 mul div PLL div2_en cpu_f pba_f Comment // 12 15 1 192 1 12 12 // 12 9 3 40 1 20 20 PLL out of spec // 12 15 1 192 1 24 12 // 12 9 1 120 1 30 15 // 12 9 3 40 0 40 20 PLL out of spec // 12 15 1 192 1 48 12 // 12 15 1 192 1 48 24 // 12 8 1 108 1 54 27 // 12 9 1 120 1 60 15 // 12 9 1 120 1 60 30 // 12 10 1 132 1 66 16.5 // unsigned long in_cpu_f = param->cpu_f; unsigned long in_osc0_f = param->osc0_f; unsigned long mul, div, div2_en = 0, div2_cpu = 0, div2_pba = 0; unsigned long pll_freq, rest; Bool b_div2_pba, b_div2_cpu; // Configure OSC0 in crystal mode, external crystal with a FOSC0 Hz frequency. scif_configure_osc_crystalmode(SCIF_OSC0, in_osc0_f); // Enable the OSC0 scif_enable_osc(SCIF_OSC0, param->osc0_startup, true); // Set the main clock source as being OSC0. pm_set_mclk_source(PM_CLK_SRC_OSC0); // Start with CPU freq config if (in_cpu_f == in_osc0_f) { param->cpu_f = in_osc0_f; param->pba_f = in_osc0_f; return PASS; } else if (in_cpu_f < in_osc0_f) { // TBD } rest = in_cpu_f % in_osc0_f; for (div = 1; div < 32; div++) { if ((div * rest) % in_osc0_f == 0) break; } if (div == 32) return FAIL; mul = (in_cpu_f * div) / in_osc0_f; if (mul > PM_MAX_MUL) return FAIL; // export 2power from PLL div to div2_cpu while (!(div % 2)) { div /= 2; div2_cpu++; } // Here we know the mul and div parameter of the PLL config. // . Check out if the PLL has a valid in_cpu_f. // . Try to have for the PLL frequency (VCO output) the highest possible value // to reduce jitter. while (in_osc0_f * 2 * mul / div < AVR32_PM_PLL_VCO_RANGE0_MAX_FREQ) { if (2 * mul > PM_MAX_MUL) break; mul *= 2; div2_cpu++; } if (div2_cpu != 0) { div2_cpu--; div2_en = 1; } pll_freq = in_osc0_f * mul / (div * (1 << div2_en)); // Update real CPU Frequency param->cpu_f = pll_freq / (1 << div2_cpu); mul--; scif_pll_opt_t opt; opt.osc = SCIF_OSC0, // Sel Osc0 or Osc1 opt.lockcount = 16, // lockcount in main clock for the PLL wait lock opt.div = div, // DIV=1 in the formula opt.mul = mul, // MUL=7 in the formula opt.pll_div2 = div2_en, // pll_div2 Divide the PLL output frequency by 2 (this settings does not change the FVCO value) opt.pll_wbwdisable = 0, //pll_wbwdisable 1 Disable the Wide-Bandith Mode (Wide-Bandwith mode allow a faster startup time and out-of-lock time). 0 to enable the Wide-Bandith Mode. opt.pll_freq = (pll_freq < AVR32_PM_PLL_VCO_RANGE0_MIN_FREQ) ? 1 : 0, // Set to 1 for VCO frequency range 80-180MHz, set to 0 for VCO frequency range 160-240Mhz. scif_pll_setup(SCIF_PLL0, opt); // lockcount in main clock for the PLL wait lock /* Enable PLL0 */ scif_pll_enable(SCIF_PLL0); /* Wait for PLL0 locked */ scif_wait_for_pll_locked(SCIF_PLL0) ; rest = pll_freq; while (rest > AVR32_PM_PBA_MAX_FREQ || rest != param->pba_f) { div2_pba++; rest = pll_freq / (1 << div2_pba); if (rest < param->pba_f) break; } // Update real PBA Frequency param->pba_f = pll_freq / (1 << div2_pba); if (div2_cpu) { b_div2_cpu = TRUE; div2_cpu--; } else b_div2_cpu = FALSE; if (div2_pba) { b_div2_pba = TRUE; div2_pba--; } else b_div2_pba = FALSE; if (b_div2_cpu == TRUE ) { pm_set_clk_domain_div(PM_CLK_DOMAIN_0, (pm_divratio_t) div2_cpu); // CPU pm_set_clk_domain_div(PM_CLK_DOMAIN_1, (pm_divratio_t) div2_cpu); // HSB pm_set_clk_domain_div(PM_CLK_DOMAIN_3, (pm_divratio_t) div2_cpu); // PBB } if (b_div2_pba == TRUE ) { pm_set_clk_domain_div(PM_CLK_DOMAIN_2, (pm_divratio_t) div2_pba); // PBA pm_set_clk_domain_div(PM_CLK_DOMAIN_4, (pm_divratio_t) div2_pba); // PBC } // Set Flashc Wait State flashc_set_flash_waitstate_and_readmode(param->cpu_f); // Set the main clock source as being PLL0. pm_set_mclk_source(PM_CLK_SRC_PLL0); return PASS; } #endif // UC3C device-specific implementation long int pcl_switch_to_osc(pcl_osc_t osc, unsigned int fcrystal, unsigned int startup) { #ifndef AVR32_PM_VERSION_RESETVALUE // Implementation for UC3A, UC3A3, UC3B parts. if(PCL_OSC0 == osc) { // Configure OSC0 in crystal mode, external crystal with a FOSC0 Hz frequency, // enable the OSC0, set the main clock source as being OSC0. pm_switch_to_osc0(&AVR32_PM, fcrystal, startup); } else { return PCL_NOT_SUPPORTED; } #else // Implementation for UC3C, UC3L parts. #if AVR32_PM_VERSION_RESETVALUE < 0x400 return PCL_NOT_SUPPORTED; #else if(PCL_OSC0 == osc) { // Configure OSC0 in crystal mode, external crystal with a fcrystal Hz frequency. scif_configure_osc_crystalmode(SCIF_OSC0, fcrystal); // Enable the OSC0 scif_enable_osc(SCIF_OSC0, startup, true); // Set the Flash wait state and the speed read mode (depending on the target CPU frequency). #if UC3L flashcdw_set_flash_waitstate_and_readmode(fcrystal); #elif UC3C flashc_set_flash_waitstate_and_readmode(fcrystal); #endif // Set the main clock source as being OSC0. pm_set_mclk_source(PM_CLK_SRC_OSC0); } else { return PCL_NOT_SUPPORTED; } #endif #endif return PASS; } long int pcl_configure_usb_clock(void) { #ifndef AVR32_PM_VERSION_RESETVALUE // Implementation for UC3A, UC3A3, UC3B parts. pm_configure_usb_clock(); return PASS; #else #ifdef AVR32_PM_410_H_INCLUDED const scif_pll_opt_t opt = { .osc = SCIF_OSC0, // Sel Osc0 or Osc1 .lockcount = 16, // lockcount in main clock for the PLL wait lock .div = 1, // DIV=1 in the formula .mul = 5, // MUL=7 in the formula .pll_div2 = 1, // pll_div2 Divide the PLL output frequency by 2 (this settings does not change the FVCO value) .pll_wbwdisable = 0, //pll_wbwdisable 1 Disable the Wide-Bandith Mode (Wide-Bandwith mode allow a faster startup time and out-of-lock time). 0 to enable the Wide-Bandith Mode. .pll_freq = 1, // Set to 1 for VCO frequency range 80-180MHz, set to 0 for VCO frequency range 160-240Mhz. }; /* Setup PLL1 on Osc0, mul=7 ,no divisor, lockcount=16, ie. 16Mhzx6 = 96MHz output */ scif_pll_setup(SCIF_PLL1, opt); // lockcount in main clock for the PLL wait lock /* Enable PLL1 */ scif_pll_enable(SCIF_PLL1); /* Wait for PLL1 locked */ scif_wait_for_pll_locked(SCIF_PLL1) ; // Implementation for UC3C parts. // Setup the generic clock for USB scif_gc_setup(AVR32_SCIF_GCLK_USB, SCIF_GCCTRL_PLL1, AVR32_SCIF_GC_NO_DIV_CLOCK, 0); // Now enable the generic clock scif_gc_enable(AVR32_SCIF_GCLK_USB); return PASS; #else return PCL_NOT_SUPPORTED; #endif #endif } #if UC3L #else void pcl_write_gplp(unsigned long gplp, unsigned long value) { #ifndef AVR32_PM_VERSION_RESETVALUE // Implementation for UC3A, UC3A3, UC3B parts. pm_write_gplp(&AVR32_PM,gplp,value); #else scif_write_gplp(gplp,value); #endif } unsigned long pcl_read_gplp(unsigned long gplp) { #ifndef AVR32_PM_VERSION_RESETVALUE // Implementation for UC3A, UC3A3, UC3B parts. return pm_read_gplp(&AVR32_PM,gplp); #else return scif_read_gplp(gplp); #endif } #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/power_clocks_lib.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file has been prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief High-level library abstracting features such as oscillators/pll/dfll * configuration, clock configuration, System-sensible parameters * configuration, buses clocks configuration, sleep mode, reset. * * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * *****************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _POWER_CLOCKS_LIB_H_ #define _POWER_CLOCKS_LIB_H_ #ifdef __cplusplus extern "C" { #endif #include #include "compiler.h" #ifndef AVR32_PM_VERSION_RESETVALUE // Support for UC3A, UC3A3, UC3B parts. #include "pm.h" #else //! Device-specific data #if UC3L #include "pm_uc3l.h" #include "scif_uc3l.h" #include "flashcdw.h" #elif UC3C #include "pm_uc3c.h" #include "scif_uc3c.h" #include "flashc.h" #endif #endif /*! \name Clocks Management */ //! @{ //! The different oscillators typedef enum { PCL_OSC0 = 0, PCL_OSC1 = 1 } pcl_osc_t; //! The different DFLLs typedef enum { PCL_DFLL0 = 0, PCL_DFLL1 = 1 } pcl_dfll_t; //! Possible Main Clock Sources typedef enum { PCL_MC_RCSYS, // Default main clock source, supported by all (aka Slow Clock) PCL_MC_OSC0, // Supported by all PCL_MC_OSC1, // Supported by UC3C only PCL_MC_OSC0_PLL0, // Supported by UC3A, UC3B, UC3A3, UC3C (the main clock source is PLL0 with OSC0 as reference) PCL_MC_OSC1_PLL0, // Supported by UC3A, UC3B, UC3A3, UC3C (the main clock source is PLL0 with OSC1 as reference) PCL_MC_OSC0_PLL1, // Supported by UC3C (the main clock source is PLL1 with OSC0 as reference) PCL_MC_OSC1_PLL1, // Supported by UC3C (the main clock source is PLL1 with OSC1 as reference) PCL_MC_DFLL0, // Supported by UC3L PCL_MC_DFLL1, // Not supported yet PCL_MC_RC120M, // Supported by UC3L, UC3C PCL_MC_RC8M, // Supported by UC3C PCL_MC_CRIPOSC // Supported by UC3C } pcl_mainclk_t; //! Input and output parameters to configure clocks with pcl_configure_clocks(). // NOTE: regarding the frequency settings, always abide by the datasheet rules and min & max supported frequencies. #ifndef AVR32_PM_VERSION_RESETVALUE // Support for UC3A, UC3A3, UC3B parts. #define pcl_freq_param_t pm_freq_param_t // See pm.h #else // Support for UC3C, UC3L parts. typedef struct { //! Main clock source selection (input argument). pcl_mainclk_t main_clk_src; //! Target CPU frequency (input/output argument). unsigned long cpu_f; //! Target PBA frequency (input/output argument). unsigned long pba_f; //! Target PBB frequency (input/output argument). unsigned long pbb_f; //! Target PBC frequency (input/output argument). unsigned long pbc_f; //! Oscillator 0's external crystal(or external clock) frequency (board dependant) (input argument). unsigned long osc0_f; //! Oscillator 0's external crystal(or external clock) startup time: AVR32_PM_OSCCTRL0_STARTUP_x_RCOSC (input argument). unsigned long osc0_startup; //! DFLL target frequency (input/output argument) (NOTE: the bigger, the most stable the frequency) unsigned long dfll_f; //! Other parameters that might be necessary depending on the device (implementation-dependent). // For the UC3L DFLL setup, this parameter should be pointing to a structure of // type (scif_gclk_opt_t *). void *pextra_params; } pcl_freq_param_t; #endif //! Define "not supported" for the lib. #define PCL_NOT_SUPPORTED (-10000) /*! \brief Automatically configure the CPU, PBA, PBB, and HSB clocks * * This function needs some parameters stored in a pcl_freq_param_t structure: * - main_clk_src is the id of the main clock source to use, * - cpu_f and pba_f and pbb_f are the wanted frequencies, * - osc0_f is the oscillator 0's external crystal (or external clock) on-board frequency (e.g. FOSC0), * - osc0_startup is the oscillator 0's external crystal (or external clock) startup time (e.g. OSC0_STARTUP). * - dfll_f is the target DFLL frequency to set-up if main_clk_src is the dfll. * * The CPU, HSB and PBA frequencies programmed after configuration are stored back into cpu_f and pba_f. * * \note: since it is dynamically computing the appropriate field values of the * configuration registers from the parameters structure, this function is not * optimal in terms of code size. For a code size optimal solution, it is better * to create a new function from pcl_configure_clocks() and modify it to use * preprocessor computation from pre-defined target frequencies. * * \param param pointer on the configuration structure. * * \retval 0 Success. * \retval <0 The configuration cannot be performed. */ extern long int pcl_configure_clocks(pcl_freq_param_t *param); /*! \brief Automatically configure the CPU, PBA, PBB, and HSB clocks using the RCSYS osc as main source clock. * * This function needs some parameters stored in a pcl_freq_param_t structure: * - cpu_f and pba_f and pbb_f are the wanted frequencies * * Supported main clock sources: PCL_MC_RCSYS * * Supported synchronous clocks frequencies: * 115200Hz, 57600Hz, 28800Hz, 14400Hz, 7200Hz, 3600Hz, 1800Hz, 900Hz, 450Hz. * * \note: by default, this implementation doesn't perform thorough checks on the * input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. * * \note: since it is dynamically computing the appropriate field values of the * configuration registers from the parameters structure, this function is not * optimal in terms of code size. For a code size optimal solution, it is better * to create a new function from pcl_configure_clocks_rcsys() and modify it to use * preprocessor computation from pre-defined target frequencies. * * \param param pointer on the configuration structure. * * \retval 0 Success. * \retval <0 The configuration cannot be performed. */ extern long int pcl_configure_clocks_rcsys(pcl_freq_param_t *param); /*! \brief Automatically configure the CPU, PBA, PBB, and HSB clocks using the RC120M osc as main source clock. * * This function needs some parameters stored in a pcl_freq_param_t structure: * - cpu_f and pba_f and pbb_f are the wanted frequencies * * Supported main clock sources: PCL_MC_RC120M * * Supported synchronous clocks frequencies: * 30MHz, 15MHz, 7.5MHz, 3.75MHz, 1.875MHz, 937.5kHz, 468.75kHz. * * \note: by default, this implementation doesn't perform thorough checks on the * input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. * * \note: since it is dynamically computing the appropriate field values of the * configuration registers from the parameters structure, this function is not * optimal in terms of code size. For a code size optimal solution, it is better * to create a new function from pcl_configure_clocks_rc120m() and modify it to * use preprocessor computation from pre-defined target frequencies. * * \param param pointer on the configuration structure. * * \retval 0 Success. * \retval <0 The configuration cannot be performed. */ extern long int pcl_configure_clocks_rc120m(pcl_freq_param_t *param); /*! \brief Automatically configure the CPU, PBA, PBB, and HSB clocks using the OSC0 osc as main source clock * * This function needs some parameters stored in a pcl_freq_param_t structure: * - cpu_f and pba_f and pbb_f are the wanted frequencies, * - osc0_f is the oscillator 0's external crystal (or external clock) on-board frequency (e.g. FOSC0), * - osc0_startup is the oscillator 0's external crystal (or external clock) startup time (e.g. OSC0_STARTUP). * * Supported main clock sources: PCL_MC_OSC0 * * Supported synchronous clocks frequencies: * (these obviously depend on the OSC0 frequency; we'll take 16MHz as an example) * 16MHz, 8MHz, 4MHz, 2MHz, 1MHz, 500kHz, 250kHz, 125kHz, 62.5kHz. * * \note: by default, this implementation doesn't perform thorough checks on the * input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. * * \note: since it is dynamically computing the appropriate field values of the * configuration registers from the parameters structure, this function is not * optimal in terms of code size. For a code size optimal solution, it is better * to create a new function from pcl_configure_clocks_osc0() and modify it to use * preprocessor computation from pre-defined target frequencies. * * \param param pointer on the configuration structure. * * \retval 0 Success. * \retval <0 The configuration cannot be performed. */ extern long int pcl_configure_clocks_osc0(pcl_freq_param_t *param); /*! \brief Automatically configure the CPU, PBA, PBB, and HSB clocks using the DFLL0 as main source clock * * This function needs some parameters stored in a pcl_freq_param_t structure: * - cpu_f and pba_f and pbb_f are the wanted frequencies, * - dfll_f is the target DFLL frequency to set-up * * \note: when the DFLL0 is to be used as main source clock for the synchronous clocks, * the target frequency of the DFLL should be chosen to be as high as possible * within the specification range (for stability reasons); the target cpu and pbx * frequencies will then be reached by appropriate division ratio. * * Supported main clock sources: PCL_MC_DFLL0 * * Supported synchronous clocks frequencies: * (these obviously depend on the DFLL target frequency; we'll take 100MHz as an example) * 50MHz, 25MHz, 12.5MHz, 6.25MHz, 3.125MHz, 1562.5kHz, 781.25kHz, 390.625kHz. * * \note: by default, this implementation doesn't perform thorough checks on the * input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. * * \note: since it is dynamically computing the appropriate field values of the * configuration registers from the parameters structure, this function is not * optimal in terms of code size. For a code size optimal solution, it is better * to create a new function from pcl_configure_clocks_dfll0() and modify it to * use preprocessor computation from pre-defined target frequencies. * * \param param pointer on the configuration structure. * * \retval 0 Success. * \retval <0 The configuration cannot be performed. */ extern long int pcl_configure_clocks_dfll0(pcl_freq_param_t *param); /*! \brief Switch the main clock source to Osc0 configured in crystal mode * * \param osc The oscillator to enable and switch to. * \param fcrystal Oscillator external crystal frequency (Hz) * \param startup Oscillator startup time. * * \return Status. * \retval 0 Success. * \retval <0 An error occured. */ extern long int pcl_switch_to_osc(pcl_osc_t osc, unsigned int fcrystal, unsigned int startup); /*! \brief Enable the clock of a module. * * \param module The module to clock (use one of the defines in the part-specific * header file under "toolchain folder"/avr32/inc(lude)/avr32/; depending on the * clock domain, look for the sections "CPU clocks", "HSB clocks", "PBx clocks" * or look in the module section). * * \return Status. * \retval 0 Success. * \retval <0 An error occured. */ #ifndef AVR32_PM_VERSION_RESETVALUE // Implementation for UC3A, UC3A3, UC3B parts. #define pcl_enable_module(module) pm_enable_module(&AVR32_PM, module) #else // Implementation for UC3C, UC3L parts. #define pcl_enable_module(module) pm_enable_module(module) #endif /*! \brief Disable the clock of a module. * * \param module The module to shut down (use one of the defines in the part-specific * header file under "toolchain folder"/avr32/inc(lude)/avr32/; depending on the * clock domain, look for the sections "CPU clocks", "HSB clocks", "PBx clocks" * or look in the module section). * * \return Status. * \retval 0 Success. * \retval <0 An error occured. */ #ifndef AVR32_PM_VERSION_RESETVALUE // Implementation for UC3A, UC3A3, UC3B parts. #define pcl_disable_module(module) pm_disable_module(&AVR32_PM, module) #else // Implementation for UC3C, UC3L parts. #define pcl_disable_module(module) pm_disable_module(module) #endif /*! \brief Configure the USB Clock * * * \return Status. * \retval 0 Success. * \retval <0 An error occured. */ extern long int pcl_configure_usb_clock(void); //! @} /*! \name Power Management */ //! @{ /*! * \brief Read the content of the GPLP registers * \param gplp GPLP register index (0,1,... depending on the number of GPLP registers for a given part) * * \return The content of the chosen GPLP register. */ extern unsigned long pcl_read_gplp(unsigned long gplp); /*! * \brief Write into the GPLP registers * \param gplp GPLP register index (0,1,... depending on the number of GPLP registers for a given part) * \param value Value to write */ extern void pcl_write_gplp(unsigned long gplp, unsigned long value); //! @} #ifdef __cplusplus } #endif #endif // _POWER_CLOCKS_LIB_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief SPI driver for AVR32 UC3. * * This file defines a useful set of functions for the SPI interface on AVR32 * devices. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with an SPI module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "spi.h" #ifdef FREERTOS_USED #include "FreeRTOS.h" #include "semphr.h" #endif /*! \name SPI Writable Bit-Field Registers */ //! @{ typedef union { unsigned long cr; avr32_spi_cr_t CR; } u_avr32_spi_cr_t; typedef union { unsigned long mr; avr32_spi_mr_t MR; } u_avr32_spi_mr_t; typedef union { unsigned long tdr; avr32_spi_tdr_t TDR; } u_avr32_spi_tdr_t; typedef union { unsigned long ier; avr32_spi_ier_t IER; } u_avr32_spi_ier_t; typedef union { unsigned long idr; avr32_spi_idr_t IDR; } u_avr32_spi_idr_t; typedef union { unsigned long csr; avr32_spi_csr0_t CSR; } u_avr32_spi_csr_t; //! @} #ifdef FREERTOS_USED //! The SPI mutex. static xSemaphoreHandle xSPIMutex; #endif /*! \brief Calculates the baudrate divider. * * \param options Pointer to a structure containing initialization options for * an SPI channel. * \param pba_hz SPI module input clock frequency (PBA clock, Hz). * * \return Divider or error code. * \retval >=0 Success. * \retval <0 Error. */ static int getBaudDiv(const spi_options_t *options, unsigned int pba_hz) { int baudDiv = (pba_hz + options->baudrate / 2) / options->baudrate; if (baudDiv <= 0 || baudDiv > 255) { return -1; } return baudDiv; } void spi_reset(volatile avr32_spi_t *spi) { spi->cr = AVR32_SPI_CR_SWRST_MASK; } spi_status_t spi_initSlave(volatile avr32_spi_t *spi, unsigned char bits, unsigned char spi_mode) { if (spi_mode > 3 || bits < 8 || bits > 16) { return SPI_ERROR_ARGUMENT; } // Reset. spi->cr = AVR32_SPI_CR_SWRST_MASK; // Will use CSR0 offsets; these are the same for CSR0 to CSR3. spi->csr0 = ((spi_mode >> 1) << AVR32_SPI_CSR0_CPOL_OFFSET) | (((spi_mode & 0x1) ^ 0x1) << AVR32_SPI_CSR0_NCPHA_OFFSET) | ((bits - 8) << AVR32_SPI_CSR0_BITS_OFFSET); return SPI_OK; } spi_status_t spi_initTest(volatile avr32_spi_t *spi) { // Reset. spi->cr = AVR32_SPI_CR_SWRST_MASK; spi->mr |= AVR32_SPI_MR_MSTR_MASK | // Master Mode. AVR32_SPI_MR_LLB_MASK; // Local Loopback. return SPI_OK; } spi_status_t spi_initMaster(volatile avr32_spi_t *spi, const spi_options_t *options) { u_avr32_spi_mr_t u_avr32_spi_mr; if (options->modfdis > 1) { return SPI_ERROR_ARGUMENT; } // Reset. spi->cr = AVR32_SPI_CR_SWRST_MASK; // Master Mode. u_avr32_spi_mr.mr = spi->mr; u_avr32_spi_mr.MR.mstr = 1; u_avr32_spi_mr.MR.modfdis = options->modfdis; u_avr32_spi_mr.MR.llb = 0; u_avr32_spi_mr.MR.pcs = (1 << AVR32_SPI_MR_PCS_SIZE) - 1; spi->mr = u_avr32_spi_mr.mr; return SPI_OK; } spi_status_t spi_selectionMode(volatile avr32_spi_t *spi, unsigned char variable_ps, unsigned char pcs_decode, unsigned char delay) { u_avr32_spi_mr_t u_avr32_spi_mr; if (variable_ps > 1 || pcs_decode > 1) { return SPI_ERROR_ARGUMENT; } u_avr32_spi_mr.mr = spi->mr; u_avr32_spi_mr.MR.ps = variable_ps; u_avr32_spi_mr.MR.pcsdec = pcs_decode; u_avr32_spi_mr.MR.dlybcs = delay; spi->mr = u_avr32_spi_mr.mr; return SPI_OK; } spi_status_t spi_selectChip(volatile avr32_spi_t *spi, unsigned char chip) { #ifdef FREERTOS_USED while (pdFALSE == xSemaphoreTake(xSPIMutex, 20)); #endif // Assert all lines; no peripheral is selected. spi->mr |= AVR32_SPI_MR_PCS_MASK; if (spi->mr & AVR32_SPI_MR_PCSDEC_MASK) { // The signal is decoded; allow up to 15 chips. if (chip > 14) { return SPI_ERROR_ARGUMENT; } spi->mr &= ~AVR32_SPI_MR_PCS_MASK | (chip << AVR32_SPI_MR_PCS_OFFSET); } else { if (chip > 3) { return SPI_ERROR_ARGUMENT; } spi->mr &= ~(1 << (AVR32_SPI_MR_PCS_OFFSET + chip)); } return SPI_OK; } spi_status_t spi_unselectChip(volatile avr32_spi_t *spi, unsigned char chip) { unsigned int timeout = SPI_TIMEOUT; while (!(spi->sr & AVR32_SPI_SR_TXEMPTY_MASK)) { if (!timeout--) { return SPI_ERROR_TIMEOUT; } } // Assert all lines; no peripheral is selected. spi->mr |= AVR32_SPI_MR_PCS_MASK; // Last transfer, so deassert the current NPCS if CSAAT is set. spi->cr = AVR32_SPI_CR_LASTXFER_MASK; #ifdef FREERTOS_USED xSemaphoreGive(xSPIMutex); #endif return SPI_OK; } spi_status_t spi_setupChipReg(volatile avr32_spi_t *spi, const spi_options_t *options, unsigned int pba_hz) { u_avr32_spi_csr_t u_avr32_spi_csr; if (options->spi_mode > 3 || options->stay_act > 1 || options->bits < 8 || options->bits > 16) { return SPI_ERROR_ARGUMENT; } int baudDiv = getBaudDiv(options, pba_hz); if (baudDiv < 0) { return SPI_ERROR_ARGUMENT; } // Will use CSR0 offsets; these are the same for CSR0 to CSR3. u_avr32_spi_csr.csr = 0; u_avr32_spi_csr.CSR.cpol = options->spi_mode >> 1; u_avr32_spi_csr.CSR.ncpha = (options->spi_mode & 0x1) ^ 0x1; u_avr32_spi_csr.CSR.csaat = options->stay_act; u_avr32_spi_csr.CSR.bits = options->bits - 8; u_avr32_spi_csr.CSR.scbr = baudDiv; u_avr32_spi_csr.CSR.dlybs = options->spck_delay; u_avr32_spi_csr.CSR.dlybct = options->trans_delay; switch(options->reg) { case 0: spi->csr0 = u_avr32_spi_csr.csr; break; case 1: spi->csr1 = u_avr32_spi_csr.csr; break; case 2: spi->csr2 = u_avr32_spi_csr.csr; break; case 3: spi->csr3 = u_avr32_spi_csr.csr; break; default: return SPI_ERROR_ARGUMENT; } #ifdef FREERTOS_USED if (!xSPIMutex) { // Create the SPI mutex. vSemaphoreCreateBinary(xSPIMutex); if (!xSPIMutex) { while(1); } } #endif return SPI_OK; } void spi_enable(volatile avr32_spi_t *spi) { spi->cr = AVR32_SPI_CR_SPIEN_MASK; } void spi_disable(volatile avr32_spi_t *spi) { spi->cr = AVR32_SPI_CR_SPIDIS_MASK; } int spi_is_enabled(volatile avr32_spi_t *spi) { return (spi->sr & AVR32_SPI_SR_SPIENS_MASK) != 0; } unsigned char spi_writeRegisterEmptyCheck(volatile avr32_spi_t *spi) { return ((spi->sr & AVR32_SPI_SR_TDRE_MASK) != 0); } spi_status_t spi_write(volatile avr32_spi_t *spi, unsigned short data) { unsigned int timeout = SPI_TIMEOUT; while (!(spi->sr & AVR32_SPI_SR_TDRE_MASK)) { if (!timeout--) { return SPI_ERROR_TIMEOUT; } } spi->tdr = data << AVR32_SPI_TDR_TD_OFFSET; return SPI_OK; } spi_status_t spi_variableSlaveWrite(volatile avr32_spi_t *spi, unsigned short data, unsigned char pcs, unsigned char lastxfer) { unsigned int timeout = SPI_TIMEOUT; if (pcs > 14 || lastxfer > 1) { return SPI_ERROR_ARGUMENT; } while (!(spi->sr & AVR32_SPI_SR_TDRE_MASK)) { if (!timeout--) { return SPI_ERROR_TIMEOUT; } } spi->tdr = (data << AVR32_SPI_TDR_TD_OFFSET) | (pcs << AVR32_SPI_TDR_PCS_OFFSET) | (lastxfer << AVR32_SPI_TDR_LASTXFER_OFFSET); return SPI_OK; } unsigned char spi_writeEndCheck(volatile avr32_spi_t *spi) { return ((spi->sr & AVR32_SPI_SR_TXEMPTY_MASK) != 0); } unsigned char spi_readRegisterFullCheck(volatile avr32_spi_t *spi) { return ((spi->sr & AVR32_SPI_SR_RDRF_MASK) != 0); } spi_status_t spi_read(volatile avr32_spi_t *spi, unsigned short *data) { unsigned int timeout = SPI_TIMEOUT; while ((spi->sr & (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) != (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) { if (!timeout--) { return SPI_ERROR_TIMEOUT; } } *data = spi->rdr >> AVR32_SPI_RDR_RD_OFFSET; return SPI_OK; } unsigned char spi_getStatus(volatile avr32_spi_t *spi) { spi_status_t ret = SPI_OK; unsigned long sr = spi->sr; if (sr & AVR32_SPI_SR_OVRES_MASK) { ret = SPI_ERROR_OVERRUN; } if (sr & AVR32_SPI_SR_MODF_MASK) { ret += SPI_ERROR_MODE_FAULT; } if (ret == (SPI_ERROR_OVERRUN + SPI_ERROR_MODE_FAULT)) { return SPI_ERROR_OVERRUN_AND_MODE_FAULT; } else if (ret > 0) { return ret; } else { return SPI_OK; } } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief SPI driver for AVR32 UC3. * * This file defines a useful set of functions for the SPI interface on AVR32 * devices. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with an SPI module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _SPI_H_ #define _SPI_H_ #include //! Time-out value (number of attempts). #define SPI_TIMEOUT 10000 //! Status codes used by the SPI driver. typedef enum { SPI_ERROR = -1, SPI_OK = 0, SPI_ERROR_TIMEOUT = 1, SPI_ERROR_ARGUMENT, SPI_ERROR_OVERRUN, SPI_ERROR_MODE_FAULT, SPI_ERROR_OVERRUN_AND_MODE_FAULT } spi_status_t; //! Option structure for SPI channels. typedef struct { //! The SPI channel to set up. unsigned char reg; //! Preferred baudrate for the SPI. unsigned int baudrate; //! Number of bits in each character (8 to 16). unsigned char bits; //! Delay before first clock pulse after selecting slave (in PBA clock periods). unsigned char spck_delay; //! Delay between each transfer/character (in PBA clock periods). unsigned char trans_delay; //! Sets this chip to stay active after last transfer to it. unsigned char stay_act; //! Which SPI mode to use when transmitting. unsigned char spi_mode; //! Disables the mode fault detection. //! With this bit cleared, the SPI master mode will disable itself if another //! master tries to address it. unsigned char modfdis; } spi_options_t; /*! \brief Resets the SPI controller. * * \param spi Base address of the SPI instance. */ extern void spi_reset(volatile avr32_spi_t *spi); /*! \brief Initializes the SPI in slave mode. * * \param spi Base address of the SPI instance. * \param bits Number of bits in each transmitted character (8 to 16). * \param spi_mode Clock polarity and phase. * * \return Status. * \retval SPI_OK Success. * \retval SPI_ERROR_ARGUMENT Invalid argument(s) passed. */ extern spi_status_t spi_initSlave(volatile avr32_spi_t *spi, unsigned char bits, unsigned char spi_mode); /*! \brief Sets up the SPI in a test mode where the transmitter is connected to * the receiver (local loopback). * * \param spi Base address of the SPI instance. * * \return Status. * \retval SPI_OK Success. */ extern spi_status_t spi_initTest(volatile avr32_spi_t *spi); /*! \brief Initializes the SPI in master mode. * * \param spi Base address of the SPI instance. * \param options Pointer to a structure containing initialization options. * * \return Status. * \retval SPI_OK Success. * \retval SPI_ERROR_ARGUMENT Invalid argument(s) passed. */ extern spi_status_t spi_initMaster(volatile avr32_spi_t *spi, const spi_options_t *options); /*! \brief Sets up how and when the slave chips are selected (master mode only). * * \param spi Base address of the SPI instance. * \param variable_ps Target slave is selected in transfer register for every * character to transmit. * \param pcs_decode The four chip select lines are decoded externally. Values * 0 to 14 can be given to \ref spi_selectChip. * \param delay Delay in PBA periods between chip selects. * * \return Status. * \retval SPI_OK Success. * \retval SPI_ERROR_ARGUMENT Invalid argument(s) passed. */ extern spi_status_t spi_selectionMode(volatile avr32_spi_t *spi, unsigned char variable_ps, unsigned char pcs_decode, unsigned char delay); /*! \brief Selects slave chip. * * \param spi Base address of the SPI instance. * \param chip Slave chip number (normal: 0 to 3, extarnally decoded signal: 0 * to 14). * * \return Status. * \retval SPI_OK Success. * \retval SPI_ERROR_ARGUMENT Invalid argument(s) passed. */ extern spi_status_t spi_selectChip(volatile avr32_spi_t *spi, unsigned char chip); /*! \brief Unselects slave chip. * * \param spi Base address of the SPI instance. * \param chip Slave chip number (normal: 0 to 3, extarnally decoded signal: 0 * to 14). * * \return Status. * \retval SPI_OK Success. * \retval SPI_ERROR_TIMEOUT Time-out. * * \note Will block program execution until time-out occurs if last transmission * is not complete. Invoke \ref spi_writeEndCheck beforehand if needed. */ extern spi_status_t spi_unselectChip(volatile avr32_spi_t *spi, unsigned char chip); /*! \brief Sets options for a specific slave chip. * * The baudrate field has to be written before transfer in master mode. Four * similar registers exist, one for each slave. When using encoded slave * addressing, reg=0 sets options for slaves 0 to 3, reg=1 for slaves 4 to 7 and * so on. * * \param spi Base address of the SPI instance. * \param options Pointer to a structure containing initialization options for * an SPI channel. * \param pba_hz SPI module input clock frequency (PBA clock, Hz). * * \return Status. * \retval SPI_OK Success. * \retval SPI_ERROR_ARGUMENT Invalid argument(s) passed. */ extern spi_status_t spi_setupChipReg(volatile avr32_spi_t *spi, const spi_options_t *options, unsigned int pba_hz); /*! \brief Enables the SPI. * * \param spi Base address of the SPI instance. */ extern void spi_enable(volatile avr32_spi_t *spi); /*! \brief Disables the SPI. * * Ensures that nothing is transferred while setting up buffers. * * \param spi Base address of the SPI instance. * * \warning This may cause data loss if used on a slave SPI. */ extern void spi_disable(volatile avr32_spi_t *spi); /*! \brief Tests if the SPI is enabled. * * \param spi Base address of the SPI instance. * * \return \c 1 if the SPI is enabled, otherwise \c 0. */ extern int spi_is_enabled(volatile avr32_spi_t *spi); /*! \brief Checks if there is no data in the transmit register. * * \param spi Base address of the SPI instance. * * \return Status. * \retval 1 No data in TDR. * \retval 0 Some data in TDR. */ extern unsigned char spi_writeRegisterEmptyCheck(volatile avr32_spi_t *spi); /*! \brief Writes one data word in master fixed peripheral select mode or in * slave mode. * * \param spi Base address of the SPI instance. * \param data The data word to write. * * \return Status. * \retval SPI_OK Success. * \retval SPI_ERROR_TIMEOUT Time-out. * * \note Will block program execution until time-out occurs if transmitter is * busy and transmit buffer is full. Invoke * \ref spi_writeRegisterEmptyCheck beforehand if needed. * * \note Once the data has been written to the transmit buffer, the end of * transmission is not waited for. Invoke \ref spi_writeEndCheck if * needed. */ extern spi_status_t spi_write(volatile avr32_spi_t *spi, unsigned short data); /*! \brief Selects a slave in master variable peripheral select mode and writes * one data word to it. * * \param spi Base address of the SPI instance. * \param data The data word to write. * \param pcs Slave selector (bit 0 -> nCS line 0, bit 1 -> nCS line 1, * etc.). * \param lastxfer Boolean indicating whether this is the last data word * transfer. * * \return Status. * \retval SPI_OK Success. * \retval SPI_ERROR_TIMEOUT Time-out. * \retval SPI_ERROR_ARGUMENT Invalid argument(s) passed. * * \note Will block program execution until time-out occurs if transmitter is * busy and transmit buffer is full. Invoke * \ref spi_writeRegisterEmptyCheck beforehand if needed. * * \note Once the data has been written to the transmit buffer, the end of * transmission is not waited for. Invoke \ref spi_writeEndCheck if * needed. */ extern spi_status_t spi_variableSlaveWrite(volatile avr32_spi_t *spi, unsigned short data, unsigned char pcs, unsigned char lastxfer); /*! \brief Checks if all transmissions are complete. * * \param spi Base address of the SPI instance. * * \return Status. * \retval 1 All transmissions complete. * \retval 0 Transmissions not complete. */ extern unsigned char spi_writeEndCheck(volatile avr32_spi_t *spi); /*! \brief Checks if there is data in the receive register. * * \param spi Base address of the SPI instance. * * \return Status. * \retval 1 Some data in RDR. * \retval 0 No data in RDR. */ extern unsigned char spi_readRegisterFullCheck(volatile avr32_spi_t *spi); /*! \brief Reads one data word in master mode or in slave mode. * * \param spi Base address of the SPI instance. * \param data Pointer to the location where to store the received data word. * * \return Status. * \retval SPI_OK Success. * \retval SPI_ERROR_TIMEOUT Time-out. * * \note Will block program execution until time-out occurs if no data is * received or last transmission is not complete. Invoke * \ref spi_writeEndCheck or \ref spi_readRegisterFullCheck beforehand if * needed. */ extern spi_status_t spi_read(volatile avr32_spi_t *spi, unsigned short *data); /*! \brief Gets status information from the SPI. * * \param spi Base address of the SPI instance. * * \return Status. * \retval SPI_OK Success. * \retval SPI_ERROR_OVERRUN Overrun error. * \retval SPI_ERROR_MODE_FAULT Mode fault (SPI addressed as slave * while in master mode). * \retval SPI_ERROR_OVERRUN_AND_MODE_FAULT Overrun error and mode fault. */ extern unsigned char spi_getStatus(volatile avr32_spi_t *spi); #endif // _SPI_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/USART/usart.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief USART driver for AVR32 UC3. * * This file contains basic functions for the AVR32 USART, with support for all * modes, settings and clock speeds. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a USART module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "compiler.h" #include "usart.h" //------------------------------------------------------------------------------ /*! \name Private Functions */ //! @{ /*! \brief Checks if the USART is in multidrop mode. * * \param usart Base address of the USART instance. * * \return \c 1 if the USART is in multidrop mode, otherwise \c 0. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif static __inline__ int usart_mode_is_multidrop(volatile avr32_usart_t *usart) { return ((usart->mr >> AVR32_USART_MR_PAR_OFFSET) & AVR32_USART_MR_PAR_MULTI) == AVR32_USART_MR_PAR_MULTI; } /*! \brief Calculates a clock divider (\e CD) and a fractional part (\e FP) for * the USART asynchronous modes to generate a baud rate as close as * possible to the baud rate set point. * * Baud rate calculation: * \f$ Baudrate = \frac{SelectedClock}{Over \times (CD + \frac{FP}{8})} \f$, \e Over being 16 or 8. * The maximal oversampling is selected if it allows to generate a baud rate close to the set point. * * \param usart Base address of the USART instance. * \param baudrate Baud rate set point. * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS Baud rate successfully initialized. * \retval USART_INVALID_INPUT Baud rate set point is out of range for the given input clock frequency. */ static int usart_set_async_baudrate(volatile avr32_usart_t *usart, unsigned int baudrate, unsigned long pba_hz) { unsigned int over = (pba_hz >= 16 * baudrate) ? 16 : 8; unsigned int cd_fp = ((1 << AVR32_USART_BRGR_FP_SIZE) * pba_hz + (over * baudrate) / 2) / (over * baudrate); unsigned int cd = cd_fp >> AVR32_USART_BRGR_FP_SIZE; unsigned int fp = cd_fp & ((1 << AVR32_USART_BRGR_FP_SIZE) - 1); if (cd < 1 || cd > (1 << AVR32_USART_BRGR_CD_SIZE) - 1) return USART_INVALID_INPUT; usart->mr = (usart->mr & ~(AVR32_USART_MR_USCLKS_MASK | AVR32_USART_MR_SYNC_MASK | AVR32_USART_MR_OVER_MASK)) | AVR32_USART_MR_USCLKS_MCK << AVR32_USART_MR_USCLKS_OFFSET | ((over == 16) ? AVR32_USART_MR_OVER_X16 : AVR32_USART_MR_OVER_X8) << AVR32_USART_MR_OVER_OFFSET; usart->brgr = cd << AVR32_USART_BRGR_CD_OFFSET | fp << AVR32_USART_BRGR_FP_OFFSET; return USART_SUCCESS; } /*! \brief Calculates a clock divider (\e CD) for the USART synchronous master * modes to generate a baud rate as close as possible to the baud rate * set point. * * Baud rate calculation: * \f$ Baudrate = \frac{SelectedClock}{CD} \f$. * * \param usart Base address of the USART instance. * \param baudrate Baud rate set point. * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS Baud rate successfully initialized. * \retval USART_INVALID_INPUT Baud rate set point is out of range for the given input clock frequency. */ static int usart_set_sync_master_baudrate(volatile avr32_usart_t *usart, unsigned int baudrate, unsigned long pba_hz) { unsigned int cd = (pba_hz + baudrate / 2) / baudrate; if (cd < 1 || cd > (1 << AVR32_USART_BRGR_CD_SIZE) - 1) return USART_INVALID_INPUT; usart->mr = (usart->mr & ~AVR32_USART_MR_USCLKS_MASK) | AVR32_USART_MR_USCLKS_MCK << AVR32_USART_MR_USCLKS_OFFSET | AVR32_USART_MR_SYNC_MASK; usart->brgr = cd << AVR32_USART_BRGR_CD_OFFSET; return USART_SUCCESS; } /*! \brief Selects the SCK pin as the source of baud rate for the USART * synchronous slave modes. * * \param usart Base address of the USART instance. * * \retval USART_SUCCESS Baud rate successfully initialized. */ static int usart_set_sync_slave_baudrate(volatile avr32_usart_t *usart) { usart->mr = (usart->mr & ~AVR32_USART_MR_USCLKS_MASK) | AVR32_USART_MR_USCLKS_SCK << AVR32_USART_MR_USCLKS_OFFSET | AVR32_USART_MR_SYNC_MASK; return USART_SUCCESS; } /*! \brief Calculates a clock divider (\e CD) for the USART ISO7816 mode to * generate an ISO7816 clock as close as possible to the clock set point. * * ISO7816 clock calculation: * \f$ Clock = \frac{SelectedClock}{CD} \f$. * * \param usart Base address of the USART instance. * \param clock ISO7816 clock set point. * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS ISO7816 clock successfully initialized. * \retval USART_INVALID_INPUT ISO7816 clock set point is out of range for the given input clock frequency. */ static int usart_set_iso7816_clock(volatile avr32_usart_t *usart, unsigned int clock, unsigned long pba_hz) { unsigned int cd = (pba_hz + clock / 2) / clock; if (cd < 1 || cd > (1 << AVR32_USART_BRGR_CD_SIZE) - 1) return USART_INVALID_INPUT; usart->mr = (usart->mr & ~(AVR32_USART_MR_USCLKS_MASK | AVR32_USART_MR_SYNC_MASK | AVR32_USART_MR_OVER_MASK)) | AVR32_USART_MR_USCLKS_MCK << AVR32_USART_MR_USCLKS_OFFSET | AVR32_USART_MR_OVER_X16 << AVR32_USART_MR_OVER_OFFSET; usart->brgr = cd << AVR32_USART_BRGR_CD_OFFSET; return USART_SUCCESS; } #if defined(AVR32_USART_400_H_INCLUDED) || \ defined(AVR32_USART_410_H_INCLUDED) || \ defined(AVR32_USART_420_H_INCLUDED) || \ defined(AVR32_USART_440_H_INCLUDED) || \ defined(AVR32_USART_602_H_INCLUDED) /*! \brief Calculates a clock divider (\e CD) for the USART SPI master mode to * generate a baud rate as close as possible to the baud rate set point. * * Baud rate calculation: * \f$ Baudrate = \frac{SelectedClock}{CD} \f$. * * \param usart Base address of the USART instance. * \param baudrate Baud rate set point. * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS Baud rate successfully initialized. * \retval USART_INVALID_INPUT Baud rate set point is out of range for the given input clock frequency. */ static int usart_set_spi_master_baudrate(volatile avr32_usart_t *usart, unsigned int baudrate, unsigned long pba_hz) { unsigned int cd = (pba_hz + baudrate / 2) / baudrate; if (cd < 4 || cd > (1 << AVR32_USART_BRGR_CD_SIZE) - 1) return USART_INVALID_INPUT; usart->mr = (usart->mr & ~AVR32_USART_MR_USCLKS_MASK) | AVR32_USART_MR_USCLKS_MCK << AVR32_USART_MR_USCLKS_OFFSET; usart->brgr = cd << AVR32_USART_BRGR_CD_OFFSET; return USART_SUCCESS; } /*! \brief Selects the SCK pin as the source of baud rate for the USART SPI * slave mode. * * \param usart Base address of the USART instance. * * \retval USART_SUCCESS Baud rate successfully initialized. */ static int usart_set_spi_slave_baudrate(volatile avr32_usart_t *usart) { usart->mr = (usart->mr & ~AVR32_USART_MR_USCLKS_MASK) | AVR32_USART_MR_USCLKS_SCK << AVR32_USART_MR_USCLKS_OFFSET; return USART_SUCCESS; } #endif // USART rev. >= 4.0.0 //! @} //------------------------------------------------------------------------------ /*! \name Initialization Functions */ //! @{ void usart_reset(volatile avr32_usart_t *usart) { Bool global_interrupt_enabled = Is_global_interrupt_enabled(); // Disable all USART interrupts. // Interrupts needed should be set explicitly on every reset. if (global_interrupt_enabled) Disable_global_interrupt(); usart->idr = 0xFFFFFFFF; usart->csr; if (global_interrupt_enabled) Enable_global_interrupt(); // Reset mode and other registers that could cause unpredictable behavior after reset. usart->mr = 0; usart->rtor = 0; usart->ttgr = 0; // Shutdown TX and RX (will be re-enabled when setup has successfully completed), // reset status bits and turn off DTR and RTS. usart->cr = AVR32_USART_CR_RSTRX_MASK | AVR32_USART_CR_RSTTX_MASK | AVR32_USART_CR_RSTSTA_MASK | AVR32_USART_CR_RSTIT_MASK | AVR32_USART_CR_RSTNACK_MASK | #ifndef AVR32_USART_440_H_INCLUDED // Note: Modem Signal Management DTR-DSR-DCD-RI are not included in USART rev.440. AVR32_USART_CR_DTRDIS_MASK | #endif AVR32_USART_CR_RTSDIS_MASK; } int usart_init_rs232(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) { // Reset the USART and shutdown TX and RX. usart_reset(usart); // Check input values. if (!opt || // Null pointer. opt->charlength < 5 || opt->charlength > 9 || opt->paritytype > 7 || opt->stopbits > 2 + 255 || opt->channelmode > 3 || usart_set_async_baudrate(usart, opt->baudrate, pba_hz) == USART_INVALID_INPUT) return USART_INVALID_INPUT; if (opt->charlength == 9) { // Character length set to 9 bits. MODE9 dominates CHRL. usart->mr |= AVR32_USART_MR_MODE9_MASK; } else { // CHRL gives the character length (- 5) when MODE9 = 0. usart->mr |= (opt->charlength - 5) << AVR32_USART_MR_CHRL_OFFSET; } usart->mr |= opt->paritytype << AVR32_USART_MR_PAR_OFFSET | opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET; if (opt->stopbits > USART_2_STOPBITS) { // Set two stop bits usart->mr |= AVR32_USART_MR_NBSTOP_2 << AVR32_USART_MR_NBSTOP_OFFSET; // and a timeguard period gives the rest. usart->ttgr = opt->stopbits - USART_2_STOPBITS; } else // Insert 1, 1.5 or 2 stop bits. usart->mr |= opt->stopbits << AVR32_USART_MR_NBSTOP_OFFSET; // Set normal mode. usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | AVR32_USART_MR_MODE_NORMAL << AVR32_USART_MR_MODE_OFFSET; // Setup complete; enable communication. // Enable input and output. usart->cr = AVR32_USART_CR_RXEN_MASK | AVR32_USART_CR_TXEN_MASK; return USART_SUCCESS; } int usart_init_rs232_tx_only(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) { // Reset the USART and shutdown TX and RX. usart_reset(usart); // Check input values. if (!opt || // Null pointer. opt->charlength < 5 || opt->charlength > 9 || opt->paritytype > 7 || opt->stopbits == 1 || opt->stopbits > 2 + 255 || opt->channelmode > 3 || usart_set_sync_master_baudrate(usart, opt->baudrate, pba_hz) == USART_INVALID_INPUT) return USART_INVALID_INPUT; if (opt->charlength == 9) { // Character length set to 9 bits. MODE9 dominates CHRL. usart->mr |= AVR32_USART_MR_MODE9_MASK; } else { // CHRL gives the character length (- 5) when MODE9 = 0. usart->mr |= (opt->charlength - 5) << AVR32_USART_MR_CHRL_OFFSET; } usart->mr |= opt->paritytype << AVR32_USART_MR_PAR_OFFSET | opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET; if (opt->stopbits > USART_2_STOPBITS) { // Set two stop bits usart->mr |= AVR32_USART_MR_NBSTOP_2 << AVR32_USART_MR_NBSTOP_OFFSET; // and a timeguard period gives the rest. usart->ttgr = opt->stopbits - USART_2_STOPBITS; } else // Insert 1 or 2 stop bits. usart->mr |= opt->stopbits << AVR32_USART_MR_NBSTOP_OFFSET; // Set normal mode. usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | AVR32_USART_MR_MODE_NORMAL << AVR32_USART_MR_MODE_OFFSET; // Setup complete; enable communication. // Enable only output as input is not possible in synchronous mode without // transferring clock. usart->cr = AVR32_USART_CR_TXEN_MASK; return USART_SUCCESS; } int usart_init_hw_handshaking(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) { // First: Setup standard RS232. if (usart_init_rs232(usart, opt, pba_hz) == USART_INVALID_INPUT) return USART_INVALID_INPUT; // Set hardware handshaking mode. usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | AVR32_USART_MR_MODE_HARDWARE << AVR32_USART_MR_MODE_OFFSET; return USART_SUCCESS; } int usart_init_modem(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) { // First: Setup standard RS232. if (usart_init_rs232(usart, opt, pba_hz) == USART_INVALID_INPUT) return USART_INVALID_INPUT; // Set modem mode. usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | AVR32_USART_MR_MODE_MODEM << AVR32_USART_MR_MODE_OFFSET; return USART_SUCCESS; } int usart_init_sync_master(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) { // Reset the USART and shutdown TX and RX. usart_reset(usart); // Check input values. if (!opt || // Null pointer. opt->charlength < 5 || opt->charlength > 9 || opt->paritytype > 7 || opt->stopbits == 1 || opt->stopbits > 2 + 255 || opt->channelmode > 3 || usart_set_sync_master_baudrate(usart, opt->baudrate, pba_hz) == USART_INVALID_INPUT) return USART_INVALID_INPUT; if (opt->charlength == 9) { // Character length set to 9 bits. MODE9 dominates CHRL. usart->mr |= AVR32_USART_MR_MODE9_MASK; } else { // CHRL gives the character length (- 5) when MODE9 = 0. usart->mr |= (opt->charlength - 5) << AVR32_USART_MR_CHRL_OFFSET; } usart->mr |= opt->paritytype << AVR32_USART_MR_PAR_OFFSET | opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET; if (opt->stopbits > USART_2_STOPBITS) { // Set two stop bits usart->mr |= AVR32_USART_MR_NBSTOP_2 << AVR32_USART_MR_NBSTOP_OFFSET; // and a timeguard period gives the rest. usart->ttgr = opt->stopbits - USART_2_STOPBITS; } else // Insert 1 or 2 stop bits. usart->mr |= opt->stopbits << AVR32_USART_MR_NBSTOP_OFFSET; // Set normal mode. usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | AVR32_USART_MR_MODE_NORMAL << AVR32_USART_MR_MODE_OFFSET | AVR32_USART_MR_CLKO_MASK; // Setup complete; enable communication. // Enable input and output. usart->cr = AVR32_USART_CR_RXEN_MASK | AVR32_USART_CR_TXEN_MASK; return USART_SUCCESS; } int usart_init_sync_slave(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) { // Reset the USART and shutdown TX and RX. usart_reset(usart); // Check input values. if (!opt || // Null pointer. opt->charlength < 5 || opt->charlength > 9 || opt->paritytype > 7 || opt->stopbits == 1 || opt->stopbits > 2 + 255 || opt->channelmode > 3 || usart_set_sync_slave_baudrate(usart) == USART_INVALID_INPUT) return USART_INVALID_INPUT; if (opt->charlength == 9) { // Character length set to 9 bits. MODE9 dominates CHRL. usart->mr |= AVR32_USART_MR_MODE9_MASK; } else { // CHRL gives the character length (- 5) when MODE9 = 0. usart->mr |= (opt->charlength - 5) << AVR32_USART_MR_CHRL_OFFSET; } usart->mr |= opt->paritytype << AVR32_USART_MR_PAR_OFFSET | opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET; if (opt->stopbits > USART_2_STOPBITS) { // Set two stop bits usart->mr |= AVR32_USART_MR_NBSTOP_2 << AVR32_USART_MR_NBSTOP_OFFSET; // and a timeguard period gives the rest. usart->ttgr = opt->stopbits - USART_2_STOPBITS; } else // Insert 1 or 2 stop bits. usart->mr |= opt->stopbits << AVR32_USART_MR_NBSTOP_OFFSET; // Set normal mode. usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | AVR32_USART_MR_MODE_NORMAL << AVR32_USART_MR_MODE_OFFSET; // Setup complete; enable communication. // Enable input and output. usart->cr = AVR32_USART_CR_RXEN_MASK | AVR32_USART_CR_TXEN_MASK; return USART_SUCCESS; } int usart_init_rs485(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) { // First: Setup standard RS232. if (usart_init_rs232(usart, opt, pba_hz) == USART_INVALID_INPUT) return USART_INVALID_INPUT; // Set RS485 mode. usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | AVR32_USART_MR_MODE_RS485 << AVR32_USART_MR_MODE_OFFSET; return USART_SUCCESS; } int usart_init_IrDA(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz, unsigned char irda_filter) { // First: Setup standard RS232. if (usart_init_rs232(usart, opt, pba_hz) == USART_INVALID_INPUT) return USART_INVALID_INPUT; // Set IrDA filter. usart->ifr = irda_filter; // Set IrDA mode and activate filtering of input. usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | AVR32_USART_MODE_IRDA << AVR32_USART_MR_MODE_OFFSET | AVR32_USART_MR_FILTER_MASK; return USART_SUCCESS; } int usart_init_iso7816(volatile avr32_usart_t *usart, const usart_iso7816_options_t *opt, int t, long pba_hz) { // Reset the USART and shutdown TX and RX. usart_reset(usart); // Check input values. if (!opt || // Null pointer. opt->paritytype > 1) return USART_INVALID_INPUT; if (t == 0) { // Set USART mode to ISO7816, T=0. // The T=0 protocol always uses 2 stop bits. usart->mr = AVR32_USART_MR_MODE_ISO7816_T0 << AVR32_USART_MR_MODE_OFFSET | AVR32_USART_MR_NBSTOP_2 << AVR32_USART_MR_NBSTOP_OFFSET | opt->bit_order << AVR32_USART_MR_MSBF_OFFSET; // Allow MSBF in T=0. } else if (t == 1) { // Only LSB first in the T=1 protocol. // max_iterations field is only used in T=0 mode. if (opt->bit_order != 0 || opt->max_iterations != 0) return USART_INVALID_INPUT; // Set USART mode to ISO7816, T=1. // The T=1 protocol always uses 1 stop bit. usart->mr = AVR32_USART_MR_MODE_ISO7816_T1 << AVR32_USART_MR_MODE_OFFSET | AVR32_USART_MR_NBSTOP_1 << AVR32_USART_MR_NBSTOP_OFFSET; } else return USART_INVALID_INPUT; if (usart_set_iso7816_clock(usart, opt->iso7816_hz, pba_hz) == USART_INVALID_INPUT) return USART_INVALID_INPUT; // Set FIDI register: bit rate = selected clock/FI_DI_ratio/16. usart->fidi = opt->fidi_ratio; // Set ISO7816 spesific options in the MODE register. usart->mr |= opt->paritytype << AVR32_USART_MR_PAR_OFFSET | AVR32_USART_MR_CLKO_MASK | // Enable clock output. opt->inhibit_nack << AVR32_USART_MR_INACK_OFFSET | opt->dis_suc_nack << AVR32_USART_MR_DSNACK_OFFSET | opt->max_iterations << AVR32_USART_MR_MAX_ITERATION_OFFSET; // Setup complete; enable the receiver by default. usart_iso7816_enable_receiver(usart); return USART_SUCCESS; } #if defined(AVR32_USART_400_H_INCLUDED) || \ defined(AVR32_USART_410_H_INCLUDED) || \ defined(AVR32_USART_420_H_INCLUDED) || \ defined(AVR32_USART_440_H_INCLUDED) || \ defined(AVR32_USART_602_H_INCLUDED) int usart_init_lin_master(volatile avr32_usart_t *usart, unsigned long baudrate, long pba_hz) { // Reset the USART and shutdown TX and RX. usart_reset(usart); // Check input values. if (usart_set_async_baudrate(usart, baudrate, pba_hz) == USART_INVALID_INPUT) return USART_INVALID_INPUT; usart->mr |= AVR32_USART_MR_MODE_LIN_MASTER << AVR32_USART_MR_MODE_OFFSET; // LIN master mode. // Setup complete; enable communication. // Enable input and output. usart->cr = AVR32_USART_CR_RXEN_MASK | AVR32_USART_CR_TXEN_MASK; return USART_SUCCESS; } int usart_init_lin_slave(volatile avr32_usart_t *usart, unsigned long baudrate, long pba_hz) { // Reset the USART and shutdown TX and RX. usart_reset(usart); // Check input values. if (usart_set_async_baudrate(usart, baudrate, pba_hz) == USART_INVALID_INPUT) return USART_INVALID_INPUT; usart->mr |= AVR32_USART_MR_MODE_LIN_SLAVE << AVR32_USART_MR_MODE_OFFSET; // LIN slave mode. // Setup complete; enable communication. // Enable input and output. usart->cr = AVR32_USART_CR_RXEN_MASK | AVR32_USART_CR_TXEN_MASK; return USART_SUCCESS; } int usart_init_spi_master(volatile avr32_usart_t *usart, const usart_spi_options_t *opt, long pba_hz) { // Reset the USART and shutdown TX and RX. usart_reset(usart); // Check input values. if (!opt || // Null pointer. opt->charlength < 5 || opt->charlength > 9 || opt->spimode > 3 || opt->channelmode > 3 || usart_set_spi_master_baudrate(usart, opt->baudrate, pba_hz) == USART_INVALID_INPUT) return USART_INVALID_INPUT; if (opt->charlength == 9) { // Character length set to 9 bits. MODE9 dominates CHRL. usart->mr |= AVR32_USART_MR_MODE9_MASK; } else { // CHRL gives the character length (- 5) when MODE9 = 0. usart->mr |= (opt->charlength - 5) << AVR32_USART_MR_CHRL_OFFSET; } usart->mr |= AVR32_USART_MR_MODE_SPI_MASTER << AVR32_USART_MR_MODE_OFFSET | // SPI master mode. ((opt->spimode & 0x1) ^ 0x1) << AVR32_USART_MR_SYNC_OFFSET | // SPI clock phase. opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET | // Channel mode. (opt->spimode >> 1) << AVR32_USART_MR_MSBF_OFFSET | // SPI clock polarity. AVR32_USART_MR_CLKO_MASK; // Drive SCK pin. // Setup complete; enable communication. // Enable input and output. usart->cr = AVR32_USART_CR_RXEN_MASK | AVR32_USART_CR_TXEN_MASK; return USART_SUCCESS; } int usart_init_spi_slave(volatile avr32_usart_t *usart, const usart_spi_options_t *opt, long pba_hz) { // Reset the USART and shutdown TX and RX. usart_reset(usart); // Check input values. if (!opt || // Null pointer. opt->charlength < 5 || opt->charlength > 9 || opt->spimode > 3 || opt->channelmode > 3 || usart_set_spi_slave_baudrate(usart) == USART_INVALID_INPUT) return USART_INVALID_INPUT; if (opt->charlength == 9) { // Character length set to 9 bits. MODE9 dominates CHRL. usart->mr |= AVR32_USART_MR_MODE9_MASK; } else { // CHRL gives the character length (- 5) when MODE9 = 0. usart->mr |= (opt->charlength - 5) << AVR32_USART_MR_CHRL_OFFSET; } usart->mr |= AVR32_USART_MR_MODE_SPI_SLAVE << AVR32_USART_MR_MODE_OFFSET | // SPI slave mode. ((opt->spimode & 0x1) ^ 0x1) << AVR32_USART_MR_SYNC_OFFSET | // SPI clock phase. opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET | // Channel mode. (opt->spimode >> 1) << AVR32_USART_MR_MSBF_OFFSET; // SPI clock polarity. // Setup complete; enable communication. // Enable input and output. usart->cr = AVR32_USART_CR_RXEN_MASK | AVR32_USART_CR_TXEN_MASK; return USART_SUCCESS; } #endif // USART rev. >= 4.0.0 //! @} //------------------------------------------------------------------------------ #if defined(AVR32_USART_400_H_INCLUDED) || \ defined(AVR32_USART_410_H_INCLUDED) || \ defined(AVR32_USART_420_H_INCLUDED) || \ defined(AVR32_USART_440_H_INCLUDED) || \ defined(AVR32_USART_602_H_INCLUDED) /*! \name SPI Control Functions */ //! @{ int usart_spi_selectChip(volatile avr32_usart_t *usart) { // Force the SPI chip select. usart->cr = AVR32_USART_CR_RTSEN_MASK; return USART_SUCCESS; } int usart_spi_unselectChip(volatile avr32_usart_t *usart) { int timeout = USART_DEFAULT_TIMEOUT; do { if (!timeout--) return USART_FAILURE; } while (!usart_tx_empty(usart)); // Release the SPI chip select. usart->cr = AVR32_USART_CR_RTSDIS_MASK; return USART_SUCCESS; } //! @} #endif // USART rev. >= 4.0.0 //------------------------------------------------------------------------------ /*! \name Transmit/Receive Functions */ //! @{ int usart_send_address(volatile avr32_usart_t *usart, int address) { // Check if USART is in multidrop / RS485 mode. if (!usart_mode_is_multidrop(usart)) return USART_MODE_FAULT; // Prepare to send an address. usart->cr = AVR32_USART_CR_SENDA_MASK; // Write the address to TX. usart_bw_write_char(usart, address); return USART_SUCCESS; } int usart_write_char(volatile avr32_usart_t *usart, int c) { if (usart_tx_ready(usart)) { usart->thr = (c << AVR32_USART_THR_TXCHR_OFFSET) & AVR32_USART_THR_TXCHR_MASK; return USART_SUCCESS; } else return USART_TX_BUSY; } int usart_putchar(volatile avr32_usart_t *usart, int c) { int timeout = USART_DEFAULT_TIMEOUT; if (c == '\n') { do { if (!timeout--) return USART_FAILURE; } while (usart_write_char(usart, '\r') != USART_SUCCESS); timeout = USART_DEFAULT_TIMEOUT; } do { if (!timeout--) return USART_FAILURE; } while (usart_write_char(usart, c) != USART_SUCCESS); return USART_SUCCESS; } int usart_read_char(volatile avr32_usart_t *usart, int *c) { // Check for errors: frame, parity and overrun. In RS485 mode, a parity error // would mean that an address char has been received. if (usart->csr & (AVR32_USART_CSR_OVRE_MASK | AVR32_USART_CSR_FRAME_MASK | AVR32_USART_CSR_PARE_MASK)) return USART_RX_ERROR; // No error; if we really did receive a char, read it and return SUCCESS. if (usart_test_hit(usart)) { *c = (usart->rhr & AVR32_USART_RHR_RXCHR_MASK) >> AVR32_USART_RHR_RXCHR_OFFSET; return USART_SUCCESS; } else return USART_RX_EMPTY; } int usart_getchar(volatile avr32_usart_t *usart) { int c, ret; while ((ret = usart_read_char(usart, &c)) == USART_RX_EMPTY); if (ret == USART_RX_ERROR) return USART_FAILURE; return c; } void usart_write_line(volatile avr32_usart_t *usart, const char *string) { while (*string != '\0') usart_putchar(usart, *string++); } int usart_get_echo_line(volatile avr32_usart_t *usart) { int rx_char; int retval = USART_SUCCESS; while (1) { rx_char = usart_getchar(usart); if (rx_char == USART_FAILURE) { usart_write_line(usart, "Error!!!\n"); retval = USART_FAILURE; break; } if (rx_char == '\x03') { retval = USART_FAILURE; break; } usart_putchar(usart, rx_char); if (rx_char == '\r') { usart_putchar(usart, '\n'); break; } } return retval; } //! @} ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/USART/usart.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief USART driver for AVR32 UC3. * * This file contains basic functions for the AVR32 USART, with support for all * modes, settings and clock speeds. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a USART module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _USART_H_ #define _USART_H_ #include #include "compiler.h" /*! \name Return Values */ //! @{ #define USART_SUCCESS 0 //!< Successful completion. #define USART_FAILURE -1 //!< Failure because of some unspecified reason. #define USART_INVALID_INPUT 1 //!< Input value out of range. #define USART_INVALID_ARGUMENT -1 //!< Argument value out of range. #define USART_TX_BUSY 2 //!< Transmitter was busy. #define USART_RX_EMPTY 3 //!< Nothing was received. #define USART_RX_ERROR 4 //!< Transmission error occurred. #define USART_MODE_FAULT 5 //!< USART not in the appropriate mode. //! @} //! Default time-out value (number of attempts). #define USART_DEFAULT_TIMEOUT 10000 /*! \name Parity Settings */ //! @{ #define USART_EVEN_PARITY AVR32_USART_MR_PAR_EVEN //!< Use even parity on character transmission. #define USART_ODD_PARITY AVR32_USART_MR_PAR_ODD //!< Use odd parity on character transmission. #define USART_SPACE_PARITY AVR32_USART_MR_PAR_SPACE //!< Use a space as parity bit. #define USART_MARK_PARITY AVR32_USART_MR_PAR_MARK //!< Use a mark as parity bit. #define USART_NO_PARITY AVR32_USART_MR_PAR_NONE //!< Don't use a parity bit. #define USART_MULTIDROP_PARITY AVR32_USART_MR_PAR_MULTI //!< Parity bit is used to flag address characters. //! @} /*! \name Stop Bits Settings */ //! @{ #define USART_1_STOPBIT AVR32_USART_MR_NBSTOP_1 //!< Use 1 stop bit. #define USART_1_5_STOPBITS AVR32_USART_MR_NBSTOP_1_5 //!< Use 1.5 stop bits. #define USART_2_STOPBITS AVR32_USART_MR_NBSTOP_2 //!< Use 2 stop bits (for more, just give the number of bits). //! @} /*! \name Channel Modes */ //! @{ #define USART_NORMAL_CHMODE AVR32_USART_MR_CHMODE_NORMAL //!< Normal communication. #define USART_AUTO_ECHO AVR32_USART_MR_CHMODE_ECHO //!< Echo data. #define USART_LOCAL_LOOPBACK AVR32_USART_MR_CHMODE_LOCAL_LOOP //!< Local loopback. #define USART_REMOTE_LOOPBACK AVR32_USART_MR_CHMODE_REMOTE_LOOP //!< Remote loopback. //! @} #if defined(AVR32_USART_400_H_INCLUDED) || \ defined(AVR32_USART_410_H_INCLUDED) || \ defined(AVR32_USART_420_H_INCLUDED) || \ defined(AVR32_USART_440_H_INCLUDED) || \ defined(AVR32_USART_602_H_INCLUDED) /*! \name LIN Node Actions */ //! @{ #define USART_LIN_PUBLISH_ACTION AVR32_USART_LINMR_NACT_PUBLISH //!< The USART transmits the response. #define USART_LIN_SUBSCRIBE_ACTION AVR32_USART_LINMR_NACT_SUBSCRIBE //!< The USART receives the response. #define USART_LIN_IGNORE_ACTION AVR32_USART_LINMR_NACT_IGNORE //!< The USART does not transmit and does not receive the reponse. //! @} /*! \name LIN Checksum Types */ //! @{ #define USART_LIN_ENHANCED_CHECKSUM 0 //!< LIN 2.0 "enhanced" checksum. #define USART_LIN_CLASSIC_CHECKSUM 1 //!< LIN 1.3 "classic" checksum. //! @} #endif // USART rev. >= 4.0.0 //! Input parameters when initializing RS232 and similar modes. typedef struct { //! Set baud rate of the USART (unused in slave modes). unsigned long baudrate; //! Number of bits to transmit as a character (5 to 9). unsigned char charlength; //! How to calculate the parity bit: \ref USART_EVEN_PARITY, \ref USART_ODD_PARITY, //! \ref USART_SPACE_PARITY, \ref USART_MARK_PARITY, \ref USART_NO_PARITY or //! \ref USART_MULTIDROP_PARITY. unsigned char paritytype; //! Number of stop bits between two characters: \ref USART_1_STOPBIT, //! \ref USART_1_5_STOPBITS, \ref USART_2_STOPBITS or any number from 3 to 257 //! which will result in a time guard period of that length between characters. //! \note \ref USART_1_5_STOPBITS is supported in asynchronous modes only. unsigned short stopbits; //! Run the channel in testmode: \ref USART_NORMAL_CHMODE, \ref USART_AUTO_ECHO, //! \ref USART_LOCAL_LOOPBACK or \ref USART_REMOTE_LOOPBACK. unsigned char channelmode; } usart_options_t; //! Input parameters when initializing ISO7816 mode. typedef struct { //! Set the frequency of the ISO7816 clock. unsigned long iso7816_hz; //! The number of ISO7816 clock ticks in every bit period (1 to 2047, 0 = disable clock). //! Bit rate = \ref iso7816_hz / \ref fidi_ratio. unsigned short fidi_ratio; //! How to calculate the parity bit: \ref USART_EVEN_PARITY for normal mode or //! \ref USART_ODD_PARITY for inverse mode. unsigned char paritytype; //! Inhibit Non Acknowledge:\n //! - 0: the NACK is generated;\n //! - 1: the NACK is not generated. //! //! \note This bit will be used only in ISO7816 mode, protocol T = 0 receiver. int inhibit_nack; //! Disable successive NACKs. //! Successive parity errors are counted up to the value in the \ref max_iterations field. //! These parity errors generate a NACK on the ISO line. As soon as this value is reached, //! no addititional NACK is sent on the ISO line. The ITERATION flag is asserted. int dis_suc_nack; //! Max number of repetitions (0 to 7). unsigned char max_iterations; //! Bit order in transmitted characters:\n //! - 0: LSB first;\n //! - 1: MSB first. int bit_order; } usart_iso7816_options_t; #if defined(AVR32_USART_400_H_INCLUDED) || \ defined(AVR32_USART_410_H_INCLUDED) || \ defined(AVR32_USART_420_H_INCLUDED) || \ defined(AVR32_USART_440_H_INCLUDED) || \ defined(AVR32_USART_602_H_INCLUDED) //! Input parameters when initializing SPI mode. typedef struct { //! Set the frequency of the SPI clock (unused in slave mode). unsigned long baudrate; //! Number of bits to transmit as a character (5 to 9). unsigned char charlength; //! Which SPI mode to use. unsigned char spimode; //! Run the channel in testmode: \ref USART_NORMAL_CHMODE, \ref USART_AUTO_ECHO, //! \ref USART_LOCAL_LOOPBACK or \ref USART_REMOTE_LOOPBACK. unsigned char channelmode; } usart_spi_options_t; #endif // USART rev. >= 4.0.0 //------------------------------------------------------------------------------ /*! \name Initialization Functions */ //! @{ /*! \brief Resets the USART and disables TX and RX. * * \param usart Base address of the USART instance. */ extern void usart_reset(volatile avr32_usart_t *usart); /*! \brief Sets up the USART to use the standard RS232 protocol. * * \param usart Base address of the USART instance. * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS Mode successfully initialized. * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. */ extern int usart_init_rs232(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); /*! \brief Sets up the USART to use the standard RS232 protocol in TX-only mode. * * Compared to \ref usart_init_rs232, this function allows very high baud rates * (up to \a pba_hz instead of \a pba_hz / \c 8) at the expense of full duplex. * * \param usart Base address of the USART instance. * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS Mode successfully initialized. * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. * * \note The \c 1.5 stop bit is not supported in this mode. */ extern int usart_init_rs232_tx_only(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); /*! \brief Sets up the USART to use hardware handshaking. * * \param usart Base address of the USART instance. * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS Mode successfully initialized. * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. * * \note \ref usart_init_rs232 does not need to be invoked before this function. */ extern int usart_init_hw_handshaking(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); /*! \brief Sets up the USART to use the modem protocol, activating dedicated inputs/outputs. * * \param usart Base address of the USART instance. * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS Mode successfully initialized. * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. */ extern int usart_init_modem(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); /*! \brief Sets up the USART to use a synchronous RS232-like protocol in master mode. * * \param usart Base address of the USART instance. * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS Mode successfully initialized. * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. */ extern int usart_init_sync_master(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); /*! \brief Sets up the USART to use a synchronous RS232-like protocol in slave mode. * * \param usart Base address of the USART instance. * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS Mode successfully initialized. * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. */ extern int usart_init_sync_slave(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); /*! \brief Sets up the USART to use the RS485 protocol. * * \param usart Base address of the USART instance. * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS Mode successfully initialized. * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. */ extern int usart_init_rs485(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); /*! \brief Sets up the USART to use the IrDA protocol. * * \param usart Base address of the USART instance. * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). * \param pba_hz USART module input clock frequency (PBA clock, Hz). * \param irda_filter Counter used to distinguish received ones from zeros. * * \retval USART_SUCCESS Mode successfully initialized. * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. */ extern int usart_init_IrDA(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz, unsigned char irda_filter); /*! \brief Sets up the USART to use the ISO7816 T=0 or T=1 smartcard protocols. * * The receiver is enabled by default. \ref usart_iso7816_enable_receiver and * \ref usart_iso7816_enable_transmitter can be called to change the half-duplex * communication direction. * * \param usart Base address of the USART instance. * \param opt Options needed to set up ISO7816 communication (see \ref usart_iso7816_options_t). * \param t ISO7816 mode to use (T=0 or T=1). * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS Mode successfully initialized. * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. */ extern int usart_init_iso7816(volatile avr32_usart_t *usart, const usart_iso7816_options_t *opt, int t, long pba_hz); #if defined(AVR32_USART_400_H_INCLUDED) || \ defined(AVR32_USART_410_H_INCLUDED) || \ defined(AVR32_USART_420_H_INCLUDED) || \ defined(AVR32_USART_440_H_INCLUDED) || \ defined(AVR32_USART_602_H_INCLUDED) /*! \brief Sets up the USART to use the LIN master mode. * * \param usart Base address of the USART instance. * \param baudrate Baud rate. * \param pba_hz USART module input clock frequency (PBA clock, Hz). * */ extern int usart_init_lin_master(volatile avr32_usart_t *usart, unsigned long baudrate, long pba_hz); /*! \brief Sets up the USART to use the LIN slave mode. * * \param usart Base address of the USART instance. * \param baudrate Baud rate. * \param pba_hz USART module input clock frequency (PBA clock, Hz). * */ extern int usart_init_lin_slave(volatile avr32_usart_t *usart, unsigned long baudrate, long pba_hz); /*! \brief Sets up the USART to use the SPI master mode. * * \ref usart_spi_selectChip and \ref usart_spi_unselectChip can be called to * select or unselect the SPI slave chip. * * \param usart Base address of the USART instance. * \param opt Options needed to set up SPI mode (see \ref usart_spi_options_t). * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS Mode successfully initialized. * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. */ extern int usart_init_spi_master(volatile avr32_usart_t *usart, const usart_spi_options_t *opt, long pba_hz); /*! \brief Sets up the USART to use the SPI slave mode. * * \param usart Base address of the USART instance. * \param opt Options needed to set up SPI mode (see \ref usart_spi_options_t). * \param pba_hz USART module input clock frequency (PBA clock, Hz). * * \retval USART_SUCCESS Mode successfully initialized. * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. */ extern int usart_init_spi_slave(volatile avr32_usart_t *usart, const usart_spi_options_t *opt, long pba_hz); #endif // USART rev. >= 4.0.0 //! @} //------------------------------------------------------------------------------ /*! \name Read and Reset Error Status Bits */ //! @{ /*! \brief Resets the error status. * * This function resets the status bits indicating that a parity error, * framing error or overrun has occurred. The RXBRK bit, indicating * a start/end of break condition on the RX line, is also reset. * * \param usart Base address of the USART instance. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void usart_reset_status(volatile avr32_usart_t *usart) { usart->cr = AVR32_USART_CR_RSTSTA_MASK; } /*! \brief Checks if a parity error has occurred since last status reset. * * \param usart Base address of the USART instance. * * \return \c 1 if a parity error has been detected, otherwise \c 0. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ int usart_parity_error(volatile avr32_usart_t *usart) { return (usart->csr & AVR32_USART_CSR_PARE_MASK) != 0; } /*! \brief Checks if a framing error has occurred since last status reset. * * \param usart Base address of the USART instance. * * \return \c 1 if a framing error has been detected, otherwise \c 0. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ int usart_framing_error(volatile avr32_usart_t *usart) { return (usart->csr & AVR32_USART_CSR_FRAME_MASK) != 0; } /*! \brief Checks if an overrun error has occurred since last status reset. * * \param usart Base address of the USART instance. * * \return \c 1 if a overrun error has been detected, otherwise \c 0. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ int usart_overrun_error(volatile avr32_usart_t *usart) { return (usart->csr & AVR32_USART_CSR_OVRE_MASK) != 0; } #if defined(AVR32_USART_400_H_INCLUDED) || \ defined(AVR32_USART_410_H_INCLUDED) || \ defined(AVR32_USART_420_H_INCLUDED) || \ defined(AVR32_USART_440_H_INCLUDED) || \ defined(AVR32_USART_602_H_INCLUDED) /*! \brief Get LIN Error Status * * \param usart Base address of the USART instance. * * \retval The binary value of the error field. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ int usart_lin_get_error(volatile avr32_usart_t *usart) { return (usart->csr & (AVR32_USART_CSR_LINSNRE_MASK | AVR32_USART_CSR_LINCE_MASK | AVR32_USART_CSR_LINIPE_MASK | AVR32_USART_CSR_LINISFE_MASK | AVR32_USART_CSR_LINBE_MASK)) >> AVR32_USART_CSR_LINBE_OFFSET; } #endif // USART rev. >= 4.0.0 //! @} //------------------------------------------------------------------------------ /*! \name ISO7816 Control Functions */ //! @{ /*! \brief Enables the ISO7816 receiver. * * The ISO7816 transmitter is disabled. * * \param usart Base address of the USART instance. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void usart_iso7816_enable_receiver(volatile avr32_usart_t *usart) { usart->cr = AVR32_USART_CR_TXDIS_MASK | AVR32_USART_CR_RXEN_MASK; } /*! \brief Enables the ISO7816 transmitter. * * The ISO7816 receiver is disabled. * * \param usart Base address of the USART instance. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void usart_iso7816_enable_transmitter(volatile avr32_usart_t *usart) { usart->cr = AVR32_USART_CR_RXDIS_MASK | AVR32_USART_CR_TXEN_MASK; } //! @} //------------------------------------------------------------------------------ #if defined(AVR32_USART_400_H_INCLUDED) || \ defined(AVR32_USART_410_H_INCLUDED) || \ defined(AVR32_USART_420_H_INCLUDED) || \ defined(AVR32_USART_440_H_INCLUDED) || \ defined(AVR32_USART_602_H_INCLUDED) /*! \name LIN Control Functions */ //! @{ /*! \brief Sets the node action. * * \param usart Base address of the USART instance. * \param action The node action: \ref USART_LIN_PUBLISH_ACTION, * \ref USART_LIN_SUBSCRIBE_ACTION or * \ref USART_LIN_IGNORE_ACTION. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void usart_lin_set_node_action(volatile avr32_usart_t *usart, unsigned char action) { usart->linmr = (usart->linmr & ~AVR32_USART_LINMR_NACT_MASK) | action << AVR32_USART_LINMR_NACT_OFFSET; } /*! \brief Enables or disables the Identifier parity. * * \param usart Base address of the USART instance. * \param parity Whether to enable the Identifier parity: \c TRUE or \c FALSE. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void usart_lin_enable_parity(volatile avr32_usart_t *usart, unsigned char parity) { usart->linmr = (usart->linmr & ~AVR32_USART_LINMR_PARDIS_MASK) | !parity << AVR32_USART_LINMR_PARDIS_OFFSET; } /*! \brief Enables or disables the checksum. * * \param usart Base address of the USART instance. * \param parity Whether to enable the checksum: \c TRUE or \c FALSE. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void usart_lin_enable_checksum(volatile avr32_usart_t *usart, unsigned char checksum) { usart->linmr = (usart->linmr & ~AVR32_USART_LINMR_CHKDIS_MASK) | !checksum << AVR32_USART_LINMR_CHKDIS_OFFSET; } /*! \brief Sets the checksum type. * * \param usart Base address of the USART instance. * \param chktyp The checksum type: \ref USART_LIN_ENHANCED_CHEKSUM or * \ref USART_LIN_CLASSIC_CHECKSUM. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void usart_lin_set_checksum(volatile avr32_usart_t *usart, unsigned char chktyp) { usart->linmr = (usart->linmr & ~AVR32_USART_LINMR_CHKTYP_MASK) | chktyp << AVR32_USART_LINMR_CHKTYP_OFFSET; } /*! \brief Gets the response data length. * * \param usart Base address of the USART instance. * * \return The response data length. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ unsigned char usart_lin_get_data_length(volatile avr32_usart_t *usart) { if (usart->linmr & AVR32_USART_LINMR_DLM_MASK) { unsigned char data_length = 1 << ((usart->linir >> (AVR32_USART_LINIR_IDCHR_OFFSET + 4)) & 0x03); if (data_length == 1) data_length = 2; return data_length; } else return ((usart->linmr & AVR32_USART_LINMR_DLC_MASK) >> AVR32_USART_LINMR_DLC_OFFSET) + 1; } /*! \brief Sets the response data length for LIN 1.x. * * \param usart Base address of the USART instance. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void usart_lin_set_data_length_lin1x(volatile avr32_usart_t *usart) { usart->linmr |= AVR32_USART_LINMR_DLM_MASK; } /*! \brief Sets the response data length for LIN 2.x. * * \param usart Base address of the USART instance. * \param data_length The response data length. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void usart_lin_set_data_length_lin2x(volatile avr32_usart_t *usart, unsigned char data_length) { usart->linmr = (usart->linmr & ~(AVR32_USART_LINMR_DLC_MASK | AVR32_USART_LINMR_DLM_MASK)) | (data_length - 1) << AVR32_USART_LINMR_DLC_OFFSET; } /*! \brief Enables or disables the frame slot mode. * * \param usart Base address of the USART instance. * \param frameslot Whether to enable the frame slot mode: \c TRUE or * \c FALSE. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void usart_lin_enable_frameslot(volatile avr32_usart_t *usart, unsigned char frameslot) { usart->linmr = (usart->linmr & ~AVR32_USART_LINMR_FSDIS_MASK) | !frameslot << AVR32_USART_LINMR_FSDIS_OFFSET; } /*! \brief Gets the Identifier character. * * \param usart Base address of the USART instance. * * \return The Identifier character. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ unsigned char usart_lin_get_id_char(volatile avr32_usart_t *usart) { return (usart->linir & AVR32_USART_LINIR_IDCHR_MASK) >> AVR32_USART_LINIR_IDCHR_OFFSET; } /*! \brief Sets the Identifier character. * * \param usart Base address of the USART instance. * \param id_char The Identifier character. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void usart_lin_set_id_char(volatile avr32_usart_t *usart, unsigned char id_char) { usart->linir = (usart->linir & ~AVR32_USART_LINIR_IDCHR_MASK) | id_char << AVR32_USART_LINIR_IDCHR_OFFSET; } //! @} #endif // USART rev. >= 4.0.0 //------------------------------------------------------------------------------ #if defined(AVR32_USART_400_H_INCLUDED) || \ defined(AVR32_USART_410_H_INCLUDED) || \ defined(AVR32_USART_420_H_INCLUDED) || \ defined(AVR32_USART_440_H_INCLUDED) || \ defined(AVR32_USART_602_H_INCLUDED) /*! \name SPI Control Functions */ //! @{ /*! \brief Selects SPI slave chip. * * \param usart Base address of the USART instance. * * \retval USART_SUCCESS Success. */ extern int usart_spi_selectChip(volatile avr32_usart_t *usart); /*! \brief Unselects SPI slave chip. * * \param usart Base address of the USART instance. * * \retval USART_SUCCESS Success. * \retval USART_FAILURE Time-out. */ extern int usart_spi_unselectChip(volatile avr32_usart_t *usart); //! @} #endif // USART rev. >= 4.0.0 //------------------------------------------------------------------------------ /*! \name Transmit/Receive Functions */ //! @{ /*! \brief Addresses a receiver. * * While in RS485 mode, receivers only accept data addressed to them. * A packet/char with the address tag set has to precede any data. * This function is used to address a receiver. This receiver should read * all the following data, until an address packet addresses another receiver. * * \param usart Base address of the USART instance. * \param address Address of the target device. * * \retval USART_SUCCESS Address successfully sent (if current mode is RS485). * \retval USART_MODE_FAULT Wrong operating mode. */ extern int usart_send_address(volatile avr32_usart_t *usart, int address); /*! \brief Tests if the USART is ready to transmit a character. * * \param usart Base address of the USART instance. * * \return \c 1 if the USART Transmit Holding Register is free, otherwise \c 0. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ int usart_tx_ready(volatile avr32_usart_t *usart) { return (usart->csr & AVR32_USART_CSR_TXRDY_MASK) != 0; } /*! \brief Writes the given character to the TX buffer if the transmitter is ready. * * \param usart Base address of the USART instance. * \param c The character (up to 9 bits) to transmit. * * \retval USART_SUCCESS The transmitter was ready. * \retval USART_TX_BUSY The transmitter was busy. */ extern int usart_write_char(volatile avr32_usart_t *usart, int c); /*! \brief An active wait writing a character to the USART. * * \param usart Base address of the USART instance. * \param c The character (up to 9 bits) to transmit. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void usart_bw_write_char(volatile avr32_usart_t *usart, int c) { while (usart_write_char(usart, c) != USART_SUCCESS); } /*! \brief Sends a character with the USART. * * \param usart Base address of the USART instance. * \param c Character to write. * * \retval USART_SUCCESS The character was written. * \retval USART_FAILURE The function timed out before the USART transmitter became ready to send. */ extern int usart_putchar(volatile avr32_usart_t *usart, int c); /*! \brief Tests if all requested USART transmissions are over. * * \param usart Base address of the USART instance. * * \return \c 1 if the USART Transmit Shift Register and the USART Transmit * Holding Register are free, otherwise \c 0. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ int usart_tx_empty(volatile avr32_usart_t *usart) { return (usart->csr & AVR32_USART_CSR_TXEMPTY_MASK) != 0; } /*! \brief Tests if the USART contains a received character. * * \param usart Base address of the USART instance. * * \return \c 1 if the USART Receive Holding Register is full, otherwise \c 0. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ int usart_test_hit(volatile avr32_usart_t *usart) { return (usart->csr & AVR32_USART_CSR_RXRDY_MASK) != 0; } /*! \brief Checks the RX buffer for a received character, and stores it at the * given memory location. * * \param usart Base address of the USART instance. * \param c Pointer to the where the read character should be stored * (must be at least short in order to accept 9-bit characters). * * \retval USART_SUCCESS The character was read successfully. * \retval USART_RX_EMPTY The RX buffer was empty. * \retval USART_RX_ERROR An error was deteceted. */ extern int usart_read_char(volatile avr32_usart_t *usart, int *c); /*! \brief Waits until a character is received, and returns it. * * \param usart Base address of the USART instance. * * \return The received character, or \ref USART_FAILURE upon error. */ extern int usart_getchar(volatile avr32_usart_t *usart); /*! \brief Writes one character string to the USART. * * \param usart Base address of the USART instance. * \param string String to be written. */ extern void usart_write_line(volatile avr32_usart_t *usart, const char *string); /*! \brief Gets and echoes characters until end of line. * * \param usart Base address of the USART instance. * * \retval USART_SUCCESS Success. * \retval USART_FAILURE Low-level error detected or ETX character received. */ extern int usart_get_echo_line(volatile avr32_usart_t *usart); #if defined(AVR32_USART_400_H_INCLUDED) || \ defined(AVR32_USART_410_H_INCLUDED) || \ defined(AVR32_USART_420_H_INCLUDED) || \ defined(AVR32_USART_440_H_INCLUDED) || \ defined(AVR32_USART_602_H_INCLUDED) /*! \brief Abort LIN transmission. * * \param usart Base address of the USART instance. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ void usart_lin_abort(volatile avr32_usart_t *usart) { usart->cr = AVR32_USART_LINABT_MASK; } /*! \brief Tests if a LIN transfer has been completed. * * \param usart Base address of the USART instance. * * \return \c 1 if a LIN transfer has been completed, otherwise \c 0. */ #if (defined __GNUC__) __attribute__((__always_inline__)) #endif extern __inline__ int usart_lin_transfer_completed(volatile avr32_usart_t *usart) { return (usart->csr & AVR32_USART_CSR_LINTC_MASK) != 0; } #endif // USART rev. >= 4.0.0 //! @} #endif // _USART_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Abstraction layer for memory interfaces. * * This module contains the interfaces: * - MEM <-> USB; * - MEM <-> RAM; * - MEM <-> MEM. * * This module may be configured and expanded to support the following features: * - write-protected globals; * - password-protected data; * - specific features; * - etc. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ //_____ I N C L U D E S ____________________________________________________ #include "compiler.h" #include "preprocessor.h" #ifdef FREERTOS_USED #include "FreeRTOS.h" #include "semphr.h" #endif #include "ctrl_access.h" //_____ D E F I N I T I O N S ______________________________________________ #ifdef FREERTOS_USED /*! \name LUN Access Protection Macros */ //! @{ /*! \brief Locks accesses to LUNs. * * \return \c TRUE if the access was successfully locked, else \c FALSE. */ #define Ctrl_access_lock() ctrl_access_lock() /*! \brief Unlocks accesses to LUNs. */ #define Ctrl_access_unlock() xSemaphoreGive(ctrl_access_semphr) //! @} //! Handle to the semaphore protecting accesses to LUNs. static xSemaphoreHandle ctrl_access_semphr = NULL; #else /*! \name LUN Access Protection Macros */ //! @{ /*! \brief Locks accesses to LUNs. * * \return \c TRUE if the access was successfully locked, else \c FALSE. */ #define Ctrl_access_lock() TRUE /*! \brief Unlocks accesses to LUNs. */ #define Ctrl_access_unlock() //! @} #endif // FREERTOS_USED #if MAX_LUN /*! \brief Initializes an entry of the LUN descriptor table. * * \param lun Logical Unit Number. * * \return LUN descriptor table entry initializer. */ #if ACCESS_USB == ENABLED && ACCESS_MEM_TO_RAM == ENABLED #define Lun_desc_entry(lun) \ {\ TPASTE3(Lun_, lun, _test_unit_ready),\ TPASTE3(Lun_, lun, _read_capacity),\ TPASTE3(Lun_, lun, _wr_protect),\ TPASTE3(Lun_, lun, _removal),\ TPASTE3(Lun_, lun, _usb_read_10),\ TPASTE3(Lun_, lun, _usb_write_10),\ TPASTE3(Lun_, lun, _mem_2_ram),\ TPASTE3(Lun_, lun, _ram_2_mem),\ TPASTE3(LUN_, lun, _NAME)\ } #elif ACCESS_USB == ENABLED #define Lun_desc_entry(lun) \ {\ TPASTE3(Lun_, lun, _test_unit_ready),\ TPASTE3(Lun_, lun, _read_capacity),\ TPASTE3(Lun_, lun, _wr_protect),\ TPASTE3(Lun_, lun, _removal),\ TPASTE3(Lun_, lun, _usb_read_10),\ TPASTE3(Lun_, lun, _usb_write_10),\ TPASTE3(LUN_, lun, _NAME)\ } #elif ACCESS_MEM_TO_RAM == ENABLED #define Lun_desc_entry(lun) \ {\ TPASTE3(Lun_, lun, _test_unit_ready),\ TPASTE3(Lun_, lun, _read_capacity),\ TPASTE3(Lun_, lun, _wr_protect),\ TPASTE3(Lun_, lun, _removal),\ TPASTE3(Lun_, lun, _mem_2_ram),\ TPASTE3(Lun_, lun, _ram_2_mem),\ TPASTE3(LUN_, lun, _NAME)\ } #else #define Lun_desc_entry(lun) \ {\ TPASTE3(Lun_, lun, _test_unit_ready),\ TPASTE3(Lun_, lun, _read_capacity),\ TPASTE3(Lun_, lun, _wr_protect),\ TPASTE3(Lun_, lun, _removal),\ TPASTE3(LUN_, lun, _NAME)\ } #endif //! LUN descriptor table. static const struct { Ctrl_status (*test_unit_ready)(void); Ctrl_status (*read_capacity)(U32 *); Bool (*wr_protect)(void); Bool (*removal)(void); #if ACCESS_USB == ENABLED Ctrl_status (*usb_read_10)(U32, U16); Ctrl_status (*usb_write_10)(U32, U16); #endif #if ACCESS_MEM_TO_RAM == ENABLED Ctrl_status (*mem_2_ram)(U32, void *); Ctrl_status (*ram_2_mem)(U32, const void *); #endif const char *name; } lun_desc[MAX_LUN] = { #if LUN_0 == ENABLE Lun_desc_entry(0), #endif #if LUN_1 == ENABLE Lun_desc_entry(1), #endif #if LUN_2 == ENABLE Lun_desc_entry(2), #endif #if LUN_3 == ENABLE Lun_desc_entry(3), #endif #if LUN_4 == ENABLE Lun_desc_entry(4), #endif #if LUN_5 == ENABLE Lun_desc_entry(5), #endif #if LUN_6 == ENABLE Lun_desc_entry(6), #endif #if LUN_7 == ENABLE Lun_desc_entry(7) #endif }; #endif #if GLOBAL_WR_PROTECT == ENABLED Bool g_wr_protect; #endif /*! \name Control Interface */ //! @{ #ifdef FREERTOS_USED Bool ctrl_access_init(void) { // If the handle to the protecting semaphore is not valid, if (!ctrl_access_semphr) { // try to create the semaphore. vSemaphoreCreateBinary(ctrl_access_semphr); // If the semaphore could not be created, there is no backup solution. if (!ctrl_access_semphr) return FALSE; } return TRUE; } /*! \brief Locks accesses to LUNs. * * \return \c TRUE if the access was successfully locked, else \c FALSE. */ static Bool ctrl_access_lock(void) { // If the semaphore could not be created, there is no backup solution. if (!ctrl_access_semphr) return FALSE; // Wait for the semaphore. while (!xSemaphoreTake(ctrl_access_semphr, portMAX_DELAY)); return TRUE; } #endif // FREERTOS_USED U8 get_nb_lun(void) { #if MEM_USB == ENABLE U8 nb_lun; if (!Ctrl_access_lock()) return MAX_LUN; nb_lun = MAX_LUN + host_get_lun(); Ctrl_access_unlock(); return nb_lun; #else return MAX_LUN; #endif } U8 get_cur_lun(void) { return LUN_ID_0; } Ctrl_status mem_test_unit_ready(U8 lun) { Ctrl_status status; if (!Ctrl_access_lock()) return CTRL_FAIL; status = #if MAX_LUN (lun < MAX_LUN) ? lun_desc[lun].test_unit_ready() : #endif #if LUN_USB == ENABLE Lun_usb_test_unit_ready(lun - LUN_ID_USB); #else CTRL_FAIL; #endif Ctrl_access_unlock(); return status; } Ctrl_status mem_read_capacity(U8 lun, U32 *u32_nb_sector) { Ctrl_status status; if (!Ctrl_access_lock()) return CTRL_FAIL; status = #if MAX_LUN (lun < MAX_LUN) ? lun_desc[lun].read_capacity(u32_nb_sector) : #endif #if LUN_USB == ENABLE Lun_usb_read_capacity(lun - LUN_ID_USB, u32_nb_sector); #else CTRL_FAIL; #endif Ctrl_access_unlock(); return status; } U8 mem_sector_size(U8 lun) { U8 sector_size; if (!Ctrl_access_lock()) return 0; sector_size = #if MAX_LUN (lun < MAX_LUN) ? 1 : #endif #if LUN_USB == ENABLE Lun_usb_read_sector_size(lun - LUN_ID_USB); #else 0; #endif Ctrl_access_unlock(); return sector_size; } Bool mem_wr_protect(U8 lun) { Bool wr_protect; if (!Ctrl_access_lock()) return TRUE; wr_protect = #if MAX_LUN (lun < MAX_LUN) ? lun_desc[lun].wr_protect() : #endif #if LUN_USB == ENABLE Lun_usb_wr_protect(lun - LUN_ID_USB); #else TRUE; #endif Ctrl_access_unlock(); return wr_protect; } Bool mem_removal(U8 lun) { Bool removal; if (!Ctrl_access_lock()) return TRUE; removal = #if MAX_LUN (lun < MAX_LUN) ? lun_desc[lun].removal() : #endif #if LUN_USB == ENABLE Lun_usb_removal(); #else TRUE; #endif Ctrl_access_unlock(); return removal; } const char *mem_name(U8 lun) { return #if MAX_LUN (lun < MAX_LUN) ? lun_desc[lun].name : #endif #if LUN_USB == ENABLE LUN_USB_NAME; #else NULL; #endif } //! @} #if ACCESS_USB == ENABLED /*! \name MEM <-> USB Interface */ //! @{ Ctrl_status memory_2_usb(U8 lun, U32 addr, U16 nb_sector) { Ctrl_status status; if (!Ctrl_access_lock()) return CTRL_FAIL; memory_start_read_action(nb_sector); status = #if MAX_LUN (lun < MAX_LUN) ? lun_desc[lun].usb_read_10(addr, nb_sector) : #endif CTRL_FAIL; memory_stop_read_action(); Ctrl_access_unlock(); return status; } Ctrl_status usb_2_memory(U8 lun, U32 addr, U16 nb_sector) { Ctrl_status status; if (!Ctrl_access_lock()) return CTRL_FAIL; memory_start_write_action(nb_sector); status = #if MAX_LUN (lun < MAX_LUN) ? lun_desc[lun].usb_write_10(addr, nb_sector) : #endif CTRL_FAIL; memory_stop_write_action(); Ctrl_access_unlock(); return status; } //! @} #endif // ACCESS_USB == ENABLED #if ACCESS_MEM_TO_RAM == ENABLED /*! \name MEM <-> RAM Interface */ //! @{ Ctrl_status memory_2_ram(U8 lun, U32 addr, void *ram) { Ctrl_status status; if (!Ctrl_access_lock()) return CTRL_FAIL; memory_start_read_action(1); status = #if MAX_LUN (lun < MAX_LUN) ? lun_desc[lun].mem_2_ram(addr, ram) : #endif #if LUN_USB == ENABLE Lun_usb_mem_2_ram(addr, ram); #else CTRL_FAIL; #endif memory_stop_read_action(); Ctrl_access_unlock(); return status; } Ctrl_status ram_2_memory(U8 lun, U32 addr, const void *ram) { Ctrl_status status; if (!Ctrl_access_lock()) return CTRL_FAIL; memory_start_write_action(1); status = #if MAX_LUN (lun < MAX_LUN) ? lun_desc[lun].ram_2_mem(addr, ram) : #endif #if LUN_USB == ENABLE Lun_usb_ram_2_mem(addr, ram); #else CTRL_FAIL; #endif memory_stop_write_action(); Ctrl_access_unlock(); return status; } //! @} #endif // ACCESS_MEM_TO_RAM == ENABLED #if ACCESS_STREAM == ENABLED /*! \name Streaming MEM <-> MEM Interface */ //! @{ #if ACCESS_MEM_TO_MEM == ENABLED #include "fat.h" Ctrl_status stream_mem_to_mem(U8 src_lun, U32 src_addr, U8 dest_lun, U32 dest_addr, U16 nb_sector) { #if (defined __GNUC__) && (defined __AVR32__) __attribute__((__aligned__(4))) #elif (defined __ICCAVR32__) #pragma data_alignment = 4 #endif static U8 sector_buf[FS_512B]; Ctrl_status status = CTRL_GOOD; while (nb_sector--) { if ((status = memory_2_ram(src_lun, src_addr++, sector_buf)) != CTRL_GOOD) break; if ((status = ram_2_memory(dest_lun, dest_addr++, sector_buf)) != CTRL_GOOD) break; } return status; } #endif // ACCESS_MEM_TO_MEM == ENABLED Ctrl_status stream_state(U8 id) { return CTRL_GOOD; } U16 stream_stop(U8 id) { return 0; } //! @} #endif // ACCESS_STREAM == ENABLED ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Abstraction layer for memory interfaces. * * This module contains the interfaces: * - MEM <-> USB; * - MEM <-> RAM; * - MEM <-> MEM. * * This module may be configured and expanded to support the following features: * - write-protected globals; * - password-protected data; * - specific features; * - etc. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _CTRL_ACCESS_H_ #define _CTRL_ACCESS_H_ #include "compiler.h" #include "conf_access.h" //! Status returned by CTRL_ACCESS interfaces. typedef enum { CTRL_GOOD = PASS, //!< Success, memory ready. CTRL_FAIL = FAIL, //!< An error occurred. CTRL_NO_PRESENT = FAIL + 1, //!< Memory unplugged. CTRL_BUSY = FAIL + 2 //!< Memory not initialized or changed. } Ctrl_status; // FYI: Each Logical Unit Number (LUN) corresponds to a memory. // Check LUN defines. #ifndef LUN_0 #error LUN_0 must be defined as ENABLE or DISABLE in conf_access.h #endif #ifndef LUN_1 #error LUN_1 must be defined as ENABLE or DISABLE in conf_access.h #endif #ifndef LUN_2 #error LUN_2 must be defined as ENABLE or DISABLE in conf_access.h #endif #ifndef LUN_3 #error LUN_3 must be defined as ENABLE or DISABLE in conf_access.h #endif #ifndef LUN_4 #error LUN_4 must be defined as ENABLE or DISABLE in conf_access.h #endif #ifndef LUN_5 #error LUN_5 must be defined as ENABLE or DISABLE in conf_access.h #endif #ifndef LUN_6 #error LUN_6 must be defined as ENABLE or DISABLE in conf_access.h #endif #ifndef LUN_7 #error LUN_7 must be defined as ENABLE or DISABLE in conf_access.h #endif #ifndef LUN_USB #error LUN_USB must be defined as ENABLE or DISABLE in conf_access.h #endif /*! \name LUN IDs */ //! @{ #define LUN_ID_0 (0) //!< First static LUN. #define LUN_ID_1 (LUN_ID_0 + LUN_0) #define LUN_ID_2 (LUN_ID_1 + LUN_1) #define LUN_ID_3 (LUN_ID_2 + LUN_2) #define LUN_ID_4 (LUN_ID_3 + LUN_3) #define LUN_ID_5 (LUN_ID_4 + LUN_4) #define LUN_ID_6 (LUN_ID_5 + LUN_5) #define LUN_ID_7 (LUN_ID_6 + LUN_6) #define MAX_LUN (LUN_ID_7 + LUN_7) //!< Number of static LUNs. #define LUN_ID_USB (MAX_LUN) //!< First dynamic LUN (USB host mass storage). //! @} // Include LUN header files. #if LUN_0 == ENABLE #include LUN_0_INCLUDE #endif #if LUN_1 == ENABLE #include LUN_1_INCLUDE #endif #if LUN_2 == ENABLE #include LUN_2_INCLUDE #endif #if LUN_3 == ENABLE #include LUN_3_INCLUDE #endif #if LUN_4 == ENABLE #include LUN_4_INCLUDE #endif #if LUN_5 == ENABLE #include LUN_5_INCLUDE #endif #if LUN_6 == ENABLE #include LUN_6_INCLUDE #endif #if LUN_7 == ENABLE #include LUN_7_INCLUDE #endif #if LUN_USB == ENABLE #include LUN_USB_INCLUDE #endif // Check the configuration of write protection in conf_access.h. #ifndef GLOBAL_WR_PROTECT #error GLOBAL_WR_PROTECT must be defined as ENABLED or DISABLED in conf_access.h #endif #if GLOBAL_WR_PROTECT == ENABLED //! Write protect. extern Bool g_wr_protect; #endif /*! \name Control Interface */ //! @{ #ifdef FREERTOS_USED /*! \brief Initializes the LUN access locker. * * \return \c TRUE if the locker was successfully initialized, else \c FALSE. */ extern Bool ctrl_access_init(void); #endif // FREERTOS_USED /*! \brief Returns the number of LUNs. * * \return Number of LUNs in the system. */ extern U8 get_nb_lun(void); /*! \brief Returns the current LUN. * * \return Current LUN. * * \todo Implement. */ extern U8 get_cur_lun(void); /*! \brief Tests the memory state and initializes the memory if required. * * The TEST UNIT READY SCSI primary command allows an application client to poll * a LUN until it is ready without having to allocate memory for returned data. * * This command may be used to check the media status of LUNs with removable * media. * * \param lun Logical Unit Number. * * \return Status. */ extern Ctrl_status mem_test_unit_ready(U8 lun); /*! \brief Returns the address of the last valid sector (512 bytes) in the * memory. * * \param lun Logical Unit Number. * \param u32_nb_sector Pointer to the address of the last valid sector. * * \return Status. */ extern Ctrl_status mem_read_capacity(U8 lun, U32 *u32_nb_sector); /*! \brief Returns the size of the physical sector. * * \param lun Logical Unit Number. * * \return Sector size (unit: 512 bytes). */ extern U8 mem_sector_size(U8 lun); /*! \brief Returns the write-protection state of the memory. * * \param lun Logical Unit Number. * * \return \c TRUE if the memory is write-protected, else \c FALSE. * * \note Only used by removable memories with hardware-specific write * protection. */ extern Bool mem_wr_protect(U8 lun); /*! \brief Tells whether the memory is removable. * * \param lun Logical Unit Number. * * \return \c TRUE if the memory is removable, else \c FALSE. */ extern Bool mem_removal(U8 lun); /*! \brief Returns a pointer to the LUN name. * * \param lun Logical Unit Number. * * \return Pointer to the LUN name string. */ extern const char *mem_name(U8 lun); //! @} #if ACCESS_USB == ENABLED /*! \name MEM <-> USB Interface */ //! @{ /*! \brief Tranfers data from the memory to USB. * * \param lun Logical Unit Number. * \param addr Address of first memory sector to read. * \param nb_sector Number of sectors to transfer. * * \return Status. */ extern Ctrl_status memory_2_usb(U8 lun, U32 addr, U16 nb_sector); /*! \brief Tranfers data from USB to the memory. * * \param lun Logical Unit Number. * \param addr Address of first memory sector to write. * \param nb_sector Number of sectors to transfer. * * \return Status. */ extern Ctrl_status usb_2_memory(U8 lun, U32 addr, U16 nb_sector); //! @} #endif // ACCESS_USB == ENABLED #if ACCESS_MEM_TO_RAM == ENABLED /*! \name MEM <-> RAM Interface */ //! @{ /*! \brief Copies 1 data sector from the memory to RAM. * * \param lun Logical Unit Number. * \param addr Address of first memory sector to read. * \param ram Pointer to RAM buffer to write. * * \return Status. */ extern Ctrl_status memory_2_ram(U8 lun, U32 addr, void *ram); /*! \brief Copies 1 data sector from RAM to the memory. * * \param lun Logical Unit Number. * \param addr Address of first memory sector to write. * \param ram Pointer to RAM buffer to read. * * \return Status. */ extern Ctrl_status ram_2_memory(U8 lun, U32 addr, const void *ram); //! @} #endif // ACCESS_MEM_TO_RAM == ENABLED #if ACCESS_STREAM == ENABLED /*! \name Streaming MEM <-> MEM Interface */ //! @{ //! Erroneous streaming data transfer ID. #define ID_STREAM_ERR 0xFF #if ACCESS_MEM_TO_MEM == ENABLED /*! \brief Copies data from one memory to another. * * \param src_lun Source Logical Unit Number. * \param src_addr Source address of first memory sector to read. * \param dest_lun Destination Logical Unit Number. * \param dest_addr Destination address of first memory sector to write. * \param nb_sector Number of sectors to copy. * * \return Status. */ extern Ctrl_status stream_mem_to_mem(U8 src_lun, U32 src_addr, U8 dest_lun, U32 dest_addr, U16 nb_sector); #endif // ACCESS_MEM_TO_MEM == ENABLED /*! \brief Returns the state of a streaming data transfer. * * \param id Transfer ID. * * \return Status. * * \todo Implement. */ extern Ctrl_status stream_state(U8 id); /*! \brief Stops a streaming data transfer. * * \param id Transfer ID. * * \return Number of remaining sectors. * * \todo Implement. */ extern U16 stream_stop(U8 id); //! @} #endif // ACCESS_STREAM == ENABLED #endif // _CTRL_ACCESS_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Macros and functions dedicated to debug purposes. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a USART module can be used. * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "compiler.h" #include "debug.h" #if (defined __GNUC__) # include "malloc.h" U32 get_heap_curr_used_size( void ) { struct mallinfo my_info=mallinfo(); return my_info.uordblks; } U32 get_heap_total_used_size( void ) { struct mallinfo my_info=mallinfo(); return my_info.arena; } #endif U32 get_heap_free_size( void ) { U32 high_mark= AVR32_SRAM_SIZE; U32 low_mark = 0; U32 size ; void* p_mem; size = (high_mark + low_mark)/2; do { p_mem = malloc(size); if( p_mem != NULL) { // Can allocate memory free(p_mem); low_mark = size; } else { // Can not allocate memory high_mark = size; } size = (high_mark + low_mark)/2; } while( (high_mark-low_mark) >1 ); return size; } static void* round_trace_pbuf; static U32 round_trace_size; void uc3_round_trace_init(void* buf, U32 size) { round_trace_pbuf = buf; (*(U32*)round_trace_pbuf)=(U32)buf+4; round_trace_size = size; } void uc3_round_trace(U32 val) { //Disable_global_interrupt(); U32* p_wr = (U32*)(*(U32*)round_trace_pbuf); *p_wr = val; p_wr++; if( ((U32)p_wr % round_trace_size) ==0 ) p_wr= (U32*)round_trace_pbuf+1; *p_wr = 0xdeadbeef; *(U32*)round_trace_pbuf = (U32)p_wr; //Enable_global_interrupt(); } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Macros and functions dedicated to debug purposes. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a USART module can be used. * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _DEBUG_H_ #define _DEBUG_H_ #include "stringz.h" /*! \brief These macros are used to add traces memory. * * First, initialise the trace with Uc3_trace_init(pointer), giving the start address * of the memory location where will be stored the trace. * Use Uc3_trace(something) to store "something" into the memory. The end of the trace * is signaled by the "0xdeadbeef" pattern. */ #define Uc3_trace_init(debug_addr) \ *(U32*)(debug_addr)=debug_addr+4 #define Uc3_trace(debug_addr, x) \ *(U32*)(*(U32*)(debug_addr) ) = (U32)(x) ;\ *(U32*)(*(U32*)(debug_addr)+4) = 0xdeadbeef ;\ *(U32*)(debug_addr ) = *(U32*)(debug_addr)+4 /*! \brief This macro is used to insert labels into assembly output. * */ #define Insert_label(name) \ __asm__ __volatile__ (STRINGZ(name)":"); #if (defined __GNUC__) /*! \brief Returns the number of total of used bytes allocated from the HEAP. * * \retval total number of used bytes. */ U32 get_heap_total_used_size( void ); /*! \brief Returns the number of bytes currently used from the HEAP. * * \retval total number of used bytes. */ U32 get_heap_curr_used_size( void ); #endif /*! \brief Returns the number of free bytes in the HEAP. * * This funtion tries to allocate the maximum number of bytes by dichotomical method. * * \retval number of free bytes. */ extern U32 get_heap_free_size( void ); /*! \name Traces function using a round buffer */ //! @{ /*! \brief Initialize the trace using a round buffer. * * \param buf Base address of the buffer used for the trace. * \param size Size of the round buffer. Must be a power of 2. */ void uc3_round_trace_init(void* buf, U32 size); /*! \brief Trace a data in the round buffer. * * The end of the trace is signaled by the "0xdeadbeef" pattern. * \param val Data to trace; */ void uc3_round_trace(U32 val); //! @} #endif // _DEBUG_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/print_funcs.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Strings and integers print module for debug purposes. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a USART module can be used. * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "compiler.h" #include "gpio.h" #include "usart.h" #include "print_funcs.h" //! ASCII representation of hexadecimal digits. static const char HEX_DIGITS[16] = "0123456789ABCDEF"; void init_dbg_rs232(long pba_hz) { init_dbg_rs232_ex(DBG_USART_BAUDRATE, pba_hz); } void init_dbg_rs232_ex(unsigned long baudrate, long pba_hz) { static const gpio_map_t DBG_USART_GPIO_MAP = { {DBG_USART_RX_PIN, DBG_USART_RX_FUNCTION}, {DBG_USART_TX_PIN, DBG_USART_TX_FUNCTION} }; // Options for debug USART. usart_options_t dbg_usart_options = { .baudrate = baudrate, .charlength = 8, .paritytype = USART_NO_PARITY, .stopbits = USART_1_STOPBIT, .channelmode = USART_NORMAL_CHMODE }; // Setup GPIO for debug USART. gpio_enable_module(DBG_USART_GPIO_MAP, sizeof(DBG_USART_GPIO_MAP) / sizeof(DBG_USART_GPIO_MAP[0])); // Initialize it in RS232 mode. usart_init_rs232(DBG_USART, &dbg_usart_options, pba_hz); } void print_dbg(const char *str) { // Redirection to the debug USART. print(DBG_USART, str); } void print_dbg_char(int c) { // Redirection to the debug USART. print_char(DBG_USART, c); } void print_dbg_ulong(unsigned long n) { // Redirection to the debug USART. print_ulong(DBG_USART, n); } void print_dbg_char_hex(unsigned char n) { // Redirection to the debug USART. print_char_hex(DBG_USART, n); } void print_dbg_short_hex(unsigned short n) { // Redirection to the debug USART. print_short_hex(DBG_USART, n); } void print_dbg_hex(unsigned long n) { // Redirection to the debug USART. print_hex(DBG_USART, n); } void print(volatile avr32_usart_t *usart, const char *str) { // Invoke the USART driver to transmit the input string with the given USART. usart_write_line(usart, str); } void print_char(volatile avr32_usart_t *usart, int c) { // Invoke the USART driver to transmit the input character with the given USART. usart_putchar(usart, c); } void print_ulong(volatile avr32_usart_t *usart, unsigned long n) { char tmp[11]; int i = sizeof(tmp) - 1; // Convert the given number to an ASCII decimal representation. tmp[i] = '\0'; do { tmp[--i] = '0' + n % 10; n /= 10; } while (n); // Transmit the resulting string with the given USART. print(usart, tmp + i); } void print_char_hex(volatile avr32_usart_t *usart, unsigned char n) { char tmp[3]; int i; // Convert the given number to an ASCII hexadecimal representation. tmp[2] = '\0'; for (i = 1; i >= 0; i--) { tmp[i] = HEX_DIGITS[n & 0xF]; n >>= 4; } // Transmit the resulting string with the given USART. print(usart, tmp); } void print_short_hex(volatile avr32_usart_t *usart, unsigned short n) { char tmp[5]; int i; // Convert the given number to an ASCII hexadecimal representation. tmp[4] = '\0'; for (i = 3; i >= 0; i--) { tmp[i] = HEX_DIGITS[n & 0xF]; n >>= 4; } // Transmit the resulting string with the given USART. print(usart, tmp); } void print_hex(volatile avr32_usart_t *usart, unsigned long n) { char tmp[9]; int i; // Convert the given number to an ASCII hexadecimal representation. tmp[8] = '\0'; for (i = 7; i >= 0; i--) { tmp[i] = HEX_DIGITS[n & 0xF]; n >>= 4; } // Transmit the resulting string with the given USART. print(usart, tmp); } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/print_funcs.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Strings and integers print module for debug purposes. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a USART module can be used. * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _PRINT_FUNCS_H_ #define _PRINT_FUNCS_H_ #include #include "board.h" /*! \name USART Settings for the Debug Module */ //! @{ #if BOARD == EVK1100 # define DBG_USART (&AVR32_USART1) # define DBG_USART_RX_PIN AVR32_USART1_RXD_0_0_PIN # define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_0_FUNCTION # define DBG_USART_TX_PIN AVR32_USART1_TXD_0_0_PIN # define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_0_FUNCTION # define DBG_USART_BAUDRATE 57600 #elif BOARD == EVK1101 # define DBG_USART (&AVR32_USART1) # define DBG_USART_RX_PIN AVR32_USART1_RXD_0_0_PIN # define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_0_FUNCTION # define DBG_USART_TX_PIN AVR32_USART1_TXD_0_0_PIN # define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_0_FUNCTION # define DBG_USART_BAUDRATE 57600 #elif BOARD == UC3C_EK # define DBG_USART (&AVR32_USART2) # define DBG_USART_RX_PIN AVR32_USART2_RXD_0_1_PIN # define DBG_USART_RX_FUNCTION AVR32_USART2_RXD_0_1_FUNCTION # define DBG_USART_TX_PIN AVR32_USART2_TXD_0_1_PIN # define DBG_USART_TX_FUNCTION AVR32_USART2_TXD_0_1_FUNCTION # define DBG_USART_BAUDRATE 57600 #elif BOARD == EVK1104 # define DBG_USART (&AVR32_USART1) # define DBG_USART_RX_PIN AVR32_USART1_RXD_0_0_PIN # define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_0_FUNCTION # define DBG_USART_TX_PIN AVR32_USART1_TXD_0_0_PIN # define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_0_FUNCTION # define DBG_USART_BAUDRATE 57600 #elif BOARD == EVK1105 # define DBG_USART (&AVR32_USART0) # define DBG_USART_RX_PIN AVR32_USART0_RXD_0_0_PIN # define DBG_USART_RX_FUNCTION AVR32_USART0_RXD_0_0_FUNCTION # define DBG_USART_TX_PIN AVR32_USART0_TXD_0_0_PIN # define DBG_USART_TX_FUNCTION AVR32_USART0_TXD_0_0_FUNCTION # define DBG_USART_BAUDRATE 57600 #elif BOARD == STK1000 # define DBG_USART (&AVR32_USART1) # define DBG_USART_RX_PIN AVR32_USART1_RXD_0_PIN # define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_FUNCTION # define DBG_USART_TX_PIN AVR32_USART1_TXD_0_PIN # define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_FUNCTION # define DBG_USART_BAUDRATE 115200 #elif BOARD == NGW100 # define DBG_USART (&AVR32_USART1) # define DBG_USART_RX_PIN AVR32_USART1_RXD_0_PIN # define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_FUNCTION # define DBG_USART_TX_PIN AVR32_USART1_TXD_0_PIN # define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_FUNCTION # define DBG_USART_BAUDRATE 115200 #elif BOARD == STK600_RCUC3L0 # define DBG_USART (&AVR32_USART1) # define DBG_USART_RX_PIN AVR32_USART1_RXD_0_1_PIN # define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_1_FUNCTION // For the RX pin, connect STK600.PORTE.PE3 to STK600.RS232 SPARE.RXD # define DBG_USART_TX_PIN AVR32_USART1_TXD_0_1_PIN # define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_1_FUNCTION // For the TX pin, connect STK600.PORTE.PE2 to STK600.RS232 SPARE.TXD # define DBG_USART_BAUDRATE 57600 # define DBG_USART_CLOCK_MASK AVR32_USART1_CLK_PBA #elif BOARD == UC3L_EK # define DBG_USART (&AVR32_USART3) # define DBG_USART_RX_PIN AVR32_USART3_RXD_0_0_PIN # define DBG_USART_RX_FUNCTION AVR32_USART3_RXD_0_0_FUNCTION # define DBG_USART_TX_PIN AVR32_USART3_TXD_0_0_PIN # define DBG_USART_TX_FUNCTION AVR32_USART3_TXD_0_0_FUNCTION # define DBG_USART_BAUDRATE 57600 # define DBG_USART_CLOCK_MASK AVR32_USART3_CLK_PBA #elif BOARD == ARDUINO # define DBG_USART (&AVR32_USART1) # define DBG_USART_RX_PIN AVR32_USART1_RXD_0_0_PIN # define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_0_FUNCTION # define DBG_USART_TX_PIN AVR32_USART1_TXD_0_0_PIN # define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_0_FUNCTION # define DBG_USART_BAUDRATE 57600 # define DBG_USART_CLOCK_MASK AVR32_USART1_CLK_PBA #endif #if !defined(DBG_USART) || \ !defined(DBG_USART_RX_PIN) || \ !defined(DBG_USART_RX_FUNCTION) || \ !defined(DBG_USART_TX_PIN) || \ !defined(DBG_USART_TX_FUNCTION) || \ !defined(DBG_USART_BAUDRATE) # error The USART configuration to use for debug on your board is missing #endif //! @} /*! \name VT100 Common Commands */ //! @{ #define CLEARSCR "\x1B[2J\x1B[;H" //!< Clear screen. #define CLEAREOL "\x1B[K" //!< Clear end of line. #define CLEAREOS "\x1B[J" //!< Clear end of screen. #define CLEARLCR "\x1B[0K" //!< Clear line cursor right. #define CLEARLCL "\x1B[1K" //!< Clear line cursor left. #define CLEARELN "\x1B[2K" //!< Clear entire line. #define CLEARCDW "\x1B[0J" //!< Clear cursor down. #define CLEARCUP "\x1B[1J" //!< Clear cursor up. #define GOTOYX "\x1B[%.2d;%.2dH" //!< Set cursor to (y, x). #define INSERTMOD "\x1B[4h" //!< Insert mode. #define OVERWRITEMOD "\x1B[4l" //!< Overwrite mode. #define DELAFCURSOR "\x1B[K" //!< Erase from cursor to end of line. #define CRLF "\r\n" //!< Carriage Return + Line Feed. //! @} /*! \name VT100 Cursor Commands */ //! @{ #define CURSON "\x1B[?25h" //!< Show cursor. #define CURSOFF "\x1B[?25l" //!< Hide cursor. //! @} /*! \name VT100 Character Commands */ //! @{ #define NORMAL "\x1B[0m" //!< Normal. #define BOLD "\x1B[1m" //!< Bold. #define UNDERLINE "\x1B[4m" //!< Underline. #define BLINKING "\x1B[5m" //!< Blink. #define INVVIDEO "\x1B[7m" //!< Inverse video. //! @} /*! \name VT100 Color Commands */ //! @{ #define CL_BLACK "\033[22;30m" //!< Black. #define CL_RED "\033[22;31m" //!< Red. #define CL_GREEN "\033[22;32m" //!< Green. #define CL_BROWN "\033[22;33m" //!< Brown. #define CL_BLUE "\033[22;34m" //!< Blue. #define CL_MAGENTA "\033[22;35m" //!< Magenta. #define CL_CYAN "\033[22;36m" //!< Cyan. #define CL_GRAY "\033[22;37m" //!< Gray. #define CL_DARKGRAY "\033[01;30m" //!< Dark gray. #define CL_LIGHTRED "\033[01;31m" //!< Light red. #define CL_LIGHTGREEN "\033[01;32m" //!< Light green. #define CL_YELLOW "\033[01;33m" //!< Yellow. #define CL_LIGHTBLUE "\033[01;34m" //!< Light blue. #define CL_LIGHTMAGENTA "\033[01;35m" //!< Light magenta. #define CL_LIGHTCYAN "\033[01;36m" //!< Light cyan. #define CL_WHITE "\033[01;37m" //!< White. //! @} /*! \brief Sets up DBG_USART with 8N1 at DBG_USART_BAUDRATE. * * \param pba_hz PBA clock frequency (Hz). */ extern void init_dbg_rs232(long pba_hz); /*! \brief Sets up DBG_USART with 8N1 at a given baud rate. * * \param baudrate Baud rate to set DBG_USART to. * \param pba_hz PBA clock frequency (Hz). */ extern void init_dbg_rs232_ex(unsigned long baudrate, long pba_hz); /*! \brief Prints a string of characters to DBG_USART. * * \param str The string of characters to print. */ extern void print_dbg(const char *str); /*! \brief Prints a character to DBG_USART. * * \param c The character to print. */ extern void print_dbg_char(int c); /*! \brief Prints an integer to DBG_USART in a decimal representation. * * \param n The integer to print. */ extern void print_dbg_ulong(unsigned long n); /*! \brief Prints a char to DBG_USART in an hexadecimal representation. * * \param n The char to print. */ extern void print_dbg_char_hex(unsigned char n); /*! \brief Prints a short integer to DBG_USART in an hexadecimal representation. * * \param n The short integer to print. */ extern void print_dbg_short_hex(unsigned short n); /*! \brief Prints an integer to DBG_USART in an hexadecimal representation. * * \param n The integer to print. */ extern void print_dbg_hex(unsigned long n); /*! \brief Prints a string of characters to a given USART. * * \param usart Base address of the USART instance to print to. * \param str The string of characters to print. */ extern void print(volatile avr32_usart_t *usart, const char *str); /*! \brief Prints a character to a given USART. * * \param usart Base address of the USART instance to print to. * \param c The character to print. */ extern void print_char(volatile avr32_usart_t *usart, int c); /*! \brief Prints an integer to a given USART in a decimal representation. * * \param usart Base address of the USART instance to print to. * \param n The integer to print. */ extern void print_ulong(volatile avr32_usart_t *usart, unsigned long n); /*! \brief Prints a char to a given USART in an hexadecimal representation. * * \param usart Base address of the USART instance to print to. * \param n The char to print. */ extern void print_char_hex(volatile avr32_usart_t *usart, unsigned char n); /*! \brief Prints a short integer to a given USART in an hexadecimal * representation. * * \param usart Base address of the USART instance to print to. * \param n The short integer to print. */ extern void print_short_hex(volatile avr32_usart_t *usart, unsigned short n); /*! \brief Prints an integer to a given USART in an hexadecimal representation. * * \param usart Base address of the USART instance to print to. * \param n The integer to print. */ extern void print_hex(volatile avr32_usart_t *usart, unsigned long n); #endif // _PRINT_FUNCS_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_cpu.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief NEWLIB_ADDONS CPU include file for AVR32. * * - Compiler: GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef __AVR32_NEWLIB_ADDONS_CPU_H__ #define __AVR32_NEWLIB_ADDONS_CPU_H__ #include <_ansi.h> _BEGIN_STD_C #define CPU_HZ get_cpu_hz() void udelay(unsigned long usec); void set_cpu_hz(unsigned int clk_hz); unsigned int get_cpu_hz(); _END_STD_C #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_exceptions.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief NEWLIB_ADDONS exceptions include file for AVR32. * * - Compiler: GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef __AVR32_NEWLIB_ADDONS_EXCEPTIONS_H__ #define __AVR32_NEWLIB_ADDONS_EXCEPTIONS_H__ #include <_ansi.h> _BEGIN_STD_C /* Exception vector offsets */ #define EVBA_UNRECOVERABLE 0x000 #define EVBA_TLB_MULTIPLE 0x004 #define EVBA_BUS_ERROR_DATA 0x008 #define EVBA_BUS_ERROR_INSTR 0x00C #define EVBA_NMI 0x010 #define EVBA_INSTR_ADDR 0x014 #define EVBA_ITLB_MISS 0x050 #define EVBA_ITLB_PROT 0x018 #define EVBA_BREAKPOINT 0x01C #define EVBA_ILLEGAL_OPCODE 0x020 #define EVBA_UNIMPLEMENTED 0x024 #define EVBA_PRIVILEGE_VIOL 0x028 #define EVBA_FLOATING_POINT 0x02C #define EVBA_COP_ABSENT 0x030 #define EVBA_SCALL 0x100 #define EVBA_DATA_ADDR_R 0x034 #define EVBA_DATA_ADDR_W 0x038 #define EVBA_DTLB_MISS_R 0x060 #define EVBA_DTLB_MISS_W 0x070 #define EVBA_DTLB_PROT_R 0x03C #define EVBA_DTLB_PROT_W 0x040 #define EVBA_DTLB_MODIFIED 0x044 /* Define the form of the function used when registering exceptions. The function should return the address which the exception should return to after the exception processing. */ typedef unsigned int (*__exception_handler)(int /*evba_offset*/, int /*return address*/); /* Define the form of the function used when registering a scall handler. */ typedef void (*__scall_handler)(int /*code*/, int /*p1*/, int /*p2*/ , int /*p3*/, int /*p4*/); /* Function for registering an exception handler for the exception with offset given by evba_offset. */ void _register_exception_handler(__exception_handler handler, int evba_offset); /* Function for registering a scall handler which can be a arbirary function which uses r8-r12 for parameters. */ void _register_scall_handler(__scall_handler handler); /* Initialize exceptions. Must be called before registering exception handlers and needed to enable exceptions. 'evba' is the pointer to the exception vector. 'handler_table' is a pointer to an array where the pointers to the exception handlers are stored. This array must be at least 0x104 bytes and word aligned. */ void init_exceptions(void *evba, void *handler_table); _END_STD_C #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_interrupts.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief NEWLIB_ADDONS interrupts include file for AVR32. * * - Compiler: GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef __AVR32_NEWLIB_ADDONS_INTERRUPTS_H__ #define __AVR32_NEWLIB_ADDONS_INTERRUPTS_H__ #include <_ansi.h> _BEGIN_STD_C #define INT_GRPS 64 #define INT_LINES 32 #define INTPR_BASE (__intc_base__ + 0x0000) #define INTREQ_BASE (__intc_base__ + 64*4) #define INTCAUSE_BASE (__intc_base__ + 2*64*4) //Register offsets #define INTLEVEL 30 #define AUTOVECTOR 0 #define AUTOVECTOR_BITS 14 //Priorities #define INT0 0 #define INT1 1 #define INT2 2 #define INT3 3 typedef void (*__newlib_int_handler)(int /* int_grp*/, void */*user_handle*/); __newlib_int_handler register_interrupt(__newlib_int_handler handler, int int_grp, int line, int priority, .../* void *user_handle*/); void init_interrupts(); void set_interrupts_base(void *base); _END_STD_C #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_io.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief NEWLIB_ADDONS miscellaneous macros include file for AVR32. * * - Compiler: GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef __AVR32_NEWLIB_ADDONS_IO_H__ #define __AVR32_NEWLIB_ADDONS_IO_H__ #include <_ansi.h> _BEGIN_STD_C typedef char u8; typedef unsigned int u32; #define __raw_writeb(v,a) (*(volatile unsigned char *)(a) = (v)) #define __raw_writew(v,a) (*(volatile unsigned short *)(a) = (v)) #define __raw_writel(v,a) (*(volatile unsigned int *)(a) = (v)) #define __raw_readb(a) (*(volatile unsigned char *)(a)) #define __raw_readw(a) (*(volatile unsigned short *)(a)) #define __raw_readl(a) (*(volatile unsigned int *)(a)) /* As long as I/O is only performed in P4 (or possibly P3), we're safe */ #define writeb(v,a) __raw_writeb(v,a) #define writew(v,a) __raw_writew(v,a) #define writel(v,a) __raw_writel(v,a) #define readb(a) __raw_readb(a) #define readw(a) __raw_readw(a) #define readl(a) __raw_readl(a) /* Memory segments when segmentation is enabled */ #define P0SEG 0x00000000 #define P1SEG 0x80000000 #define P2SEG 0xa0000000 #define P3SEG 0xc0000000 #define P4SEG 0xe0000000 /* Returns the privileged segment base of a given address */ #define PXSEG(a) (((unsigned long)(a)) & 0xe0000000) /* Returns the physical address of a PnSEG (n=1,2) address */ #define PHYSADDR(a) (((unsigned long)(a)) & 0x1fffffff) /* * Map an address to a certain privileged segment */ #define P1SEGADDR(a) ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P1SEG)) #define P2SEGADDR(a) ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P2SEG)) #define P3SEGADDR(a) ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P3SEG)) #define P4SEGADDR(a) ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P4SEG)) #define cached(addr) P1SEGADDR(addr) #define uncached(addr) P2SEGADDR(addr) #define physaddr(addr) PHYSADDR(addr) #define BF(field, value) \ ({ union { \ struct { \ unsigned : 32 - field ## _OFFSET - field ## _SIZE ; \ unsigned long __val: field ## _SIZE ; \ }; \ unsigned long __ul; \ } __tmp; \ __tmp.__ul = 0; \ __tmp.__val = value; \ __tmp.__ul;}) #define BF_D(field, value) \ ({ union { \ struct { \ unsigned long long : 64 - field ## _OFFSET - field ## _SIZE ; \ unsigned long long __val: field ## _SIZE ; \ }; \ unsigned long long __ul; \ } __tmp; \ __tmp.__ul = 0; \ __tmp.__val = value; \ __tmp.__ul;}) #define BFINS(var, field, value) \ { union {\ struct { \ unsigned : 32 - field ## _OFFSET - field ## _SIZE ; \ unsigned long __val: field ## _SIZE ; \ }; \ unsigned long __ul; \ } __tmp; \ __tmp.__ul = var; \ __tmp.__val = value; \ var = __tmp.__ul;} #define BFEXT(var, field) \ ({ union {\ struct { \ unsigned : 32 - field ## _OFFSET - field ## _SIZE ; \ unsigned long __val: field ## _SIZE ; \ }; \ unsigned long __ul; \ } __tmp; \ __tmp.__ul = var; \ __tmp.__val; }) #define BFINS_D(var, field, value) \ { union {\ struct { \ unsigned long long : 64 - field ## _OFFSET - field ## _SIZE ; \ unsigned long long __val: field ## _SIZE ; \ }; \ unsigned long long __ul; \ } __tmp; \ __tmp.__ul = var; \ __tmp.__val = value; \ var = __tmp.__ul;} #define BFEXT_D(var, field) \ ({ union {\ struct { \ unsigned long long : 64 - field ## _OFFSET - field ## _SIZE ; \ unsigned long long __val: field ## _SIZE ; \ }; \ unsigned long long __ul; \ } __tmp; \ __tmp.__ul = var; \ __tmp.__val; }) _END_STD_C #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_usart.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief NEWLIB_ADDONS USART include file for AVR32. * * - Compiler: GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef __AVR32_NEWLIB_ADDONS_USART_H__ #define __AVR32_NEWLIB_ADDONS_USART_H__ #include <_ansi.h> #include "nlao_io.h" _BEGIN_STD_C struct usart3 { volatile u32 us_cr; volatile u32 us_mr; volatile u32 us_ier; volatile u32 us_idr; volatile u32 us_imr; volatile u32 us_csr; volatile u32 us_rhr; volatile u32 us_thr; volatile u32 us_brgr; volatile u32 us_rtor; volatile u32 us_ttgr; volatile u32 us_reserved[5]; volatile u32 us_fidi; volatile u32 us_ner; volatile u32 us_xxr; volatile u32 us_if; }; /* Register offsets */ #define US_CR 0x0000 #define US_MR 0x0004 #define US_IER 0x0008 #define US_IDR 0x000c #define US_IMR 0x0010 #define US_CSR 0x0014 #define US_RHR 0x0018 #define US_THR 0x001c #define US_BRGR 0x0020 #define US_RTOR 0x0024 #define US_TTGR 0x0028 #define US_FIDI 0x0040 #define US_NER 0x0044 #define US_XXR 0x0048 #define US_IF 0x004c #define US_RPR 0x0100 #define US_RCR 0x0104 #define US_TPR 0x0108 #define US_TCR 0x010c #define US_RNPR 0x0110 #define US_RNCR 0x0114 #define US_TNPR 0x0118 #define US_TNCR 0x011c #define US_PTCR 0x0120 #define US_PTSR 0x0124 /* USART3 Control Register */ #define US_CR_RSTRX (1 << 2) #define US_CR_RSTTX (1 << 3) #define US_CR_RXEN (1 << 4) #define US_CR_RXDIS (1 << 5) #define US_CR_TXEN (1 << 6) #define US_CR_TXDIS (1 << 7) #define US_CR_RSTSTA (1 << 8) #define US_CR_STTBRK (1 << 9) #define US_CR_STPBRK (1 << 10) #define US_CR_DTREN (1 << 16) #define US_CR_DTRDIS (1 << 17) #define US_CR_RTSEN (1 << 18) #define US_CR_RTSDIS (1 << 19) /* USART3 Mode Register */ #define US_MR_MODE (15 << 0) #define US_MR_MODE_NORMAL ( 0 << 0) #define US_MR_MODE_HWFLOW ( 2 << 0) #define US_MR_CLKS ( 3 << 4) #define US_MR_CLKS_CLOCK ( 0 << 4) #define US_MR_CLKS_FDIV1 ( 1 << 4) #define US_MR_CLKS_SLOW ( 2 << 4) #define US_MR_CLKS_EXT ( 3 << 4) #define US_MR_CHRL_5BITS ( 0 << 6) #define US_MR_CHRL_6BITS ( 1 << 6) #define US_MR_CHRL_7BITS ( 2 << 6) #define US_MR_CHRL_8BITS ( 3 << 6) #define US_MR_SYNC ( 1 << 8) #define US_MR_PAR_EVEN ( 0 << 9) #define US_MR_PAR_ODD ( 1 << 9) #define US_MR_PAR_SPACE ( 2 << 9) #define US_MR_PAR_MARK ( 3 << 9) #define US_MR_PAR_NONE ( 4 << 9) #define US_MR_PAR_MDROP ( 6 << 9) #define US_MR_NBSTOP_1BIT ( 0 << 12) #define US_MR_NBSTOP_1_5BIT ( 1 << 12) #define US_MR_NBSTOP_2BITS ( 2 << 12) #define US_MR_OVER ( 1 << 19) #define US_MR_OVER_X16 ( 0 << 19) #define US_MR_OVER_X8 ( 1 << 19) /* USART3 Channel Status Register */ #define US_CSR_RXRDY (1 << 0) #define US_CSR_TXRDY (1 << 1) #define US_CSR_RXBRK (1 << 2) #define US_CSR_ENDRX (1 << 3) #define US_CSR_ENDTX (1 << 4) #define US_CSR_OVRE (1 << 5) #define US_CSR_FRAME (1 << 6) #define US_CSR_PARE (1 << 7) #define US_CSR_TXEMPTY (1 << 9) #define US_CSR_TXBUFE (1 << 11) #define US_CSR_RXBUFF (1 << 12) #define US_CSR_RIIC (1 << 16) #define US_CSR_DSRIC (1 << 17) #define US_CSR_DCDIC (1 << 18) #define US_CSR_CTSIC (1 << 19) #define US_CSR_RI (1 << 20) #define US_CSR_DSR (1 << 21) #define US_CSR_DCD (1 << 22) #define US_CSR_CTS (1 << 23) /* USART3 Baud Rate Generator Register */ #define US_BRGR_CD_OFFSET 0 #define US_BRGR_FP_OFFSET 16 #define US_BRGR_CD_SIZE 16 #define US_BRGR_FP_SIZE 3 #define US_BRGR_CD (0xFFFF << 0) #define US_BRGR_FP ( 7 << 16) /*USART3 PDC Transfer Control Register */ #define US_PTCR_RXTEN (1 << 0) #define US_PTCR_RXTDIS (1 << 1) #define US_PTCR_TXTEN (1 << 8) #define US_PTCR_TXTDIS (1 << 9) /*USART3 PDC Transfer Status Register */ #define US_PTSR_RXTEN (1 << 0) #define US_PTSR_TXTEN (1 << 8) int usart_init(int baudrate); void usart_putc(char c); void usart_puts(const char *s); int usart_getc(void); int usart_tstc(void); void usart_setbrg(int baudrate, int cpu_clock); void set_usart_base(void *usart_base); _END_STD_C #endif /* MERLIN_USART3_H */ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LINKER_SCRIPTS/AT32UC3A/0512/GCC/link_uc3a0512.lds ================================================ /****************************************************************************** * AVR32 AT32UC3A0512 GNU LD script file. * * - Compiler: GNU GCC for AVR32 * - Supported devices: AVR32 AT32UC3A0512 * * - author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ OUTPUT_FORMAT("elf32-avr32", "elf32-avr32", "elf32-avr32") OUTPUT_ARCH(avr32:uc) ENTRY(_start) MEMORY { FLASH (rxai!w) : ORIGIN = 0x80000000, LENGTH = 0x00080000 INTRAM (wxa!ri) : ORIGIN = 0x00000004, LENGTH = 0x0000FFFC USERPAGE : ORIGIN = 0x80800000, LENGTH = 0x00000200 } PHDRS { FLASH PT_LOAD; INTRAM_ALIGN PT_NULL; INTRAM_AT_FLASH PT_LOAD; INTRAM PT_NULL; USERPAGE PT_LOAD; } SECTIONS { /* If this heap size is selected, all the INTRAM space from the end of the data area to the beginning of the stack will be allocated for the heap. */ __max_heap_size__ = -1; /* Use a default heap size if heap size was not defined. */ __heap_size__ = DEFINED(__heap_size__) ? __heap_size__ : __max_heap_size__; /* Use a default stack size if stack size was not defined. */ __stack_size__ = DEFINED(__stack_size__) ? __stack_size__ : 4K; /* Read-only sections, merged into text segment: */ PROVIDE (__executable_start = 0x80000000); . = 0x80000000; .interp : { *(.interp) } >FLASH AT>FLASH :FLASH .reset : { *(.reset) } >FLASH AT>FLASH :FLASH .hash : { *(.hash) } >FLASH AT>FLASH :FLASH .dynsym : { *(.dynsym) } >FLASH AT>FLASH :FLASH .dynstr : { *(.dynstr) } >FLASH AT>FLASH :FLASH .gnu.version : { *(.gnu.version) } >FLASH AT>FLASH :FLASH .gnu.version_d : { *(.gnu.version_d) } >FLASH AT>FLASH :FLASH .gnu.version_r : { *(.gnu.version_r) } >FLASH AT>FLASH :FLASH .rel.init : { *(.rel.init) } >FLASH AT>FLASH :FLASH .rela.init : { *(.rela.init) } >FLASH AT>FLASH :FLASH .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } >FLASH AT>FLASH :FLASH .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } >FLASH AT>FLASH :FLASH .rel.fini : { *(.rel.fini) } >FLASH AT>FLASH :FLASH .rela.fini : { *(.rela.fini) } >FLASH AT>FLASH :FLASH .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH .rel.data.rel.ro : { *(.rel.data.rel.ro*) } >FLASH AT>FLASH :FLASH .rela.data.rel.ro : { *(.rel.data.rel.ro*) } >FLASH AT>FLASH :FLASH .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } >FLASH AT>FLASH :FLASH .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } >FLASH AT>FLASH :FLASH .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } >FLASH AT>FLASH :FLASH .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } >FLASH AT>FLASH :FLASH .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } >FLASH AT>FLASH :FLASH .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } >FLASH AT>FLASH :FLASH .rel.ctors : { *(.rel.ctors) } >FLASH AT>FLASH :FLASH .rela.ctors : { *(.rela.ctors) } >FLASH AT>FLASH :FLASH .rel.dtors : { *(.rel.dtors) } >FLASH AT>FLASH :FLASH .rela.dtors : { *(.rela.dtors) } >FLASH AT>FLASH :FLASH .rel.got : { *(.rel.got) } >FLASH AT>FLASH :FLASH .rela.got : { *(.rela.got) } >FLASH AT>FLASH :FLASH .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } >FLASH AT>FLASH :FLASH .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } >FLASH AT>FLASH :FLASH .rel.plt : { *(.rel.plt) } >FLASH AT>FLASH :FLASH .rela.plt : { *(.rela.plt) } >FLASH AT>FLASH :FLASH .init : { KEEP (*(.init)) } >FLASH AT>FLASH :FLASH =0xd703d703 .plt : { *(.plt) } >FLASH AT>FLASH :FLASH .text : { *(.text .stub .text.* .gnu.linkonce.t.*) KEEP (*(.text.*personality*)) /* .gnu.warning sections are handled specially by elf32.em. */ *(.gnu.warning) } >FLASH AT>FLASH :FLASH =0xd703d703 .fini : { KEEP (*(.fini)) } >FLASH AT>FLASH :FLASH =0xd703d703 PROVIDE (__etext = .); PROVIDE (_etext = .); PROVIDE (etext = .); .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH .rodata1 : { *(.rodata1) } >FLASH AT>FLASH :FLASH .eh_frame_hdr : { *(.eh_frame_hdr) } >FLASH AT>FLASH :FLASH .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } >FLASH AT>FLASH :FLASH .gcc_except_table : ONLY_IF_RO { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) } >FLASH AT>FLASH :FLASH .lalign : { . = ALIGN(8); PROVIDE(_data_lma = .); } >FLASH AT>FLASH :FLASH . = ORIGIN(INTRAM); .dalign : { . = ALIGN(8); PROVIDE(_data = .); } >INTRAM AT>INTRAM :INTRAM_ALIGN /* Exception handling */ .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .gcc_except_table : ONLY_IF_RW { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH /* Thread Local Storage sections */ .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } >INTRAM AT>FLASH :INTRAM_AT_FLASH /* Ensure the __preinit_array_start label is properly aligned. We could instead move the label definition inside the section, but the linker would then create the section even if it turns out to be empty, which isn't pretty. */ PROVIDE (__preinit_array_start = ALIGN(32 / 8)); .preinit_array : { KEEP (*(.preinit_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH PROVIDE (__preinit_array_end = .); PROVIDE (__init_array_start = .); .init_array : { KEEP (*(.init_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH PROVIDE (__init_array_end = .); PROVIDE (__fini_array_start = .); .fini_array : { KEEP (*(.fini_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH PROVIDE (__fini_array_end = .); .ctors : { /* gcc uses crtbegin.o to find the start of the constructors, so we make sure it is first. Because this is a wildcard, it doesn't matter if the user does not actually link against crtbegin.o; the linker won't look for a file to match a wildcard. The wildcard also means that it doesn't matter which directory crtbegin.o is in. */ KEEP (*crtbegin*.o(.ctors)) /* We don't want to include the .ctor section from from the crtend.o file until after the sorted ctors. The .ctor section from the crtend file contains the end of ctors marker and it must be last */ KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors)) KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .dtors : { KEEP (*crtbegin*.o(.dtors)) KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors)) KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .jcr : { KEEP (*(.jcr)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .data.rel.ro : { *(.data.rel.ro.local) *(.data.rel.ro*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .dynamic : { *(.dynamic) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .got : { *(.got.plt) *(.got) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .ramtext : { *(.ramtext .ramtext.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .ddalign : { . = ALIGN(8); } >INTRAM AT>FLASH :INTRAM_AT_FLASH .data : { *(.data .data.* .gnu.linkonce.d.*) KEEP (*(.gnu.linkonce.d.*personality*)) SORT(CONSTRUCTORS) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .data1 : { *(.data1) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .balign : { . = ALIGN(8); PROVIDE(_edata = .); } >INTRAM AT>FLASH :INTRAM_AT_FLASH PROVIDE (edata = .); __bss_start = .; .bss : { *(.dynbss) *(.bss .bss.* .gnu.linkonce.b.*) *(COMMON) /* Align here to ensure that the .bss section occupies space up to _end. Align after .bss to ensure correct alignment even if the .bss section disappears because there are no input sections. */ . = ALIGN(8); } >INTRAM AT>INTRAM :INTRAM . = ALIGN(8); _end = .; PROVIDE (end = .); __heap_start__ = ALIGN(8); .heap : { *(.heap) . = (__heap_size__ == __max_heap_size__) ? ORIGIN(INTRAM) + LENGTH(INTRAM) - __stack_size__ - ABSOLUTE(.) : __heap_size__; } >INTRAM AT>INTRAM :INTRAM __heap_end__ = .; /* Stabs debugging sections. */ .stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } .stab.excl 0 : { *(.stab.excl) } .stab.exclstr 0 : { *(.stab.exclstr) } .stab.index 0 : { *(.stab.index) } .stab.indexstr 0 : { *(.stab.indexstr) } .comment 0 : { *(.comment) } /* DWARF debug sections. Symbols in the DWARF debugging sections are relative to the beginning of the section so we begin them at 0. */ /* DWARF 1 */ .debug 0 : { *(.debug) } .line 0 : { *(.line) } /* GNU DWARF 1 extensions */ .debug_srcinfo 0 : { *(.debug_srcinfo) } .debug_sfnames 0 : { *(.debug_sfnames) } /* DWARF 1.1 and DWARF 2 */ .debug_aranges 0 : { *(.debug_aranges) } .debug_pubnames 0 : { *(.debug_pubnames) } /* DWARF 2 */ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } .debug_abbrev 0 : { *(.debug_abbrev) } .debug_line 0 : { *(.debug_line) } .debug_frame 0 : { *(.debug_frame) } .debug_str 0 : { *(.debug_str) } .debug_loc 0 : { *(.debug_loc) } .debug_macinfo 0 : { *(.debug_macinfo) } /* SGI/MIPS DWARF 2 extensions */ .debug_weaknames 0 : { *(.debug_weaknames) } .debug_funcnames 0 : { *(.debug_funcnames) } .debug_typenames 0 : { *(.debug_typenames) } .debug_varnames 0 : { *(.debug_varnames) } .stack ORIGIN(INTRAM) + LENGTH(INTRAM) - __stack_size__ : { _stack = .; *(.stack) . = __stack_size__; _estack = .; } >INTRAM AT>INTRAM :INTRAM .userpage : { *(.userpage .userpage.*) } >USERPAGE AT>USERPAGE :USERPAGE /DISCARD/ : { *(.note.GNU-stack) } } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LINKER_SCRIPTS/AT32UC3A/1256/GCC/link_uc3a1256.lds ================================================ /****************************************************************************** * AVR32 AT32UC3A1256 GNU LD script file. * * - Compiler: GNU GCC for AVR32 * - Supported devices: AVR32 AT32UC3A1256 * * - author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ OUTPUT_FORMAT("elf32-avr32", "elf32-avr32", "elf32-avr32") OUTPUT_ARCH(avr32:uc) ENTRY(_start) MEMORY { FLASH (rxai!w) : ORIGIN = 0x80000000, LENGTH = 0x00040000 INTRAM (wxa!ri) : ORIGIN = 0x00000004, LENGTH = 0x0000FFFC USERPAGE : ORIGIN = 0x80800000, LENGTH = 0x00000200 } PHDRS { FLASH PT_LOAD; INTRAM_ALIGN PT_NULL; INTRAM_AT_FLASH PT_LOAD; INTRAM PT_NULL; USERPAGE PT_LOAD; } SECTIONS { /* If this heap size is selected, all the INTRAM space from the end of the data area to the beginning of the stack will be allocated for the heap. */ __max_heap_size__ = -1; /* Use a default heap size if heap size was not defined. */ __heap_size__ = DEFINED(__heap_size__) ? __heap_size__ : __max_heap_size__; /* Use a default stack size if stack size was not defined. */ __stack_size__ = DEFINED(__stack_size__) ? __stack_size__ : 4K; /* Read-only sections, merged into text segment: */ PROVIDE (__executable_start = 0x80000000); . = 0x80000000; .interp : { *(.interp) } >FLASH AT>FLASH :FLASH .reset : { *(.reset) } >FLASH AT>FLASH :FLASH .hash : { *(.hash) } >FLASH AT>FLASH :FLASH .dynsym : { *(.dynsym) } >FLASH AT>FLASH :FLASH .dynstr : { *(.dynstr) } >FLASH AT>FLASH :FLASH .gnu.version : { *(.gnu.version) } >FLASH AT>FLASH :FLASH .gnu.version_d : { *(.gnu.version_d) } >FLASH AT>FLASH :FLASH .gnu.version_r : { *(.gnu.version_r) } >FLASH AT>FLASH :FLASH .rel.init : { *(.rel.init) } >FLASH AT>FLASH :FLASH .rela.init : { *(.rela.init) } >FLASH AT>FLASH :FLASH .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } >FLASH AT>FLASH :FLASH .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } >FLASH AT>FLASH :FLASH .rel.fini : { *(.rel.fini) } >FLASH AT>FLASH :FLASH .rela.fini : { *(.rela.fini) } >FLASH AT>FLASH :FLASH .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH .rel.data.rel.ro : { *(.rel.data.rel.ro*) } >FLASH AT>FLASH :FLASH .rela.data.rel.ro : { *(.rel.data.rel.ro*) } >FLASH AT>FLASH :FLASH .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } >FLASH AT>FLASH :FLASH .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } >FLASH AT>FLASH :FLASH .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } >FLASH AT>FLASH :FLASH .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } >FLASH AT>FLASH :FLASH .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } >FLASH AT>FLASH :FLASH .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } >FLASH AT>FLASH :FLASH .rel.ctors : { *(.rel.ctors) } >FLASH AT>FLASH :FLASH .rela.ctors : { *(.rela.ctors) } >FLASH AT>FLASH :FLASH .rel.dtors : { *(.rel.dtors) } >FLASH AT>FLASH :FLASH .rela.dtors : { *(.rela.dtors) } >FLASH AT>FLASH :FLASH .rel.got : { *(.rel.got) } >FLASH AT>FLASH :FLASH .rela.got : { *(.rela.got) } >FLASH AT>FLASH :FLASH .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } >FLASH AT>FLASH :FLASH .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } >FLASH AT>FLASH :FLASH .rel.plt : { *(.rel.plt) } >FLASH AT>FLASH :FLASH .rela.plt : { *(.rela.plt) } >FLASH AT>FLASH :FLASH .init : { KEEP (*(.init)) } >FLASH AT>FLASH :FLASH =0xd703d703 .plt : { *(.plt) } >FLASH AT>FLASH :FLASH .text : { *(.text .stub .text.* .gnu.linkonce.t.*) KEEP (*(.text.*personality*)) /* .gnu.warning sections are handled specially by elf32.em. */ *(.gnu.warning) } >FLASH AT>FLASH :FLASH =0xd703d703 .fini : { KEEP (*(.fini)) } >FLASH AT>FLASH :FLASH =0xd703d703 PROVIDE (__etext = .); PROVIDE (_etext = .); PROVIDE (etext = .); .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH .rodata1 : { *(.rodata1) } >FLASH AT>FLASH :FLASH .eh_frame_hdr : { *(.eh_frame_hdr) } >FLASH AT>FLASH :FLASH .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } >FLASH AT>FLASH :FLASH .gcc_except_table : ONLY_IF_RO { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) } >FLASH AT>FLASH :FLASH .lalign : { . = ALIGN(8); PROVIDE(_data_lma = .); } >FLASH AT>FLASH :FLASH . = ORIGIN(INTRAM); .dalign : { . = ALIGN(8); PROVIDE(_data = .); } >INTRAM AT>INTRAM :INTRAM_ALIGN /* Exception handling */ .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .gcc_except_table : ONLY_IF_RW { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH /* Thread Local Storage sections */ .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } >INTRAM AT>FLASH :INTRAM_AT_FLASH /* Ensure the __preinit_array_start label is properly aligned. We could instead move the label definition inside the section, but the linker would then create the section even if it turns out to be empty, which isn't pretty. */ PROVIDE (__preinit_array_start = ALIGN(32 / 8)); .preinit_array : { KEEP (*(.preinit_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH PROVIDE (__preinit_array_end = .); PROVIDE (__init_array_start = .); .init_array : { KEEP (*(.init_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH PROVIDE (__init_array_end = .); PROVIDE (__fini_array_start = .); .fini_array : { KEEP (*(.fini_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH PROVIDE (__fini_array_end = .); .ctors : { /* gcc uses crtbegin.o to find the start of the constructors, so we make sure it is first. Because this is a wildcard, it doesn't matter if the user does not actually link against crtbegin.o; the linker won't look for a file to match a wildcard. The wildcard also means that it doesn't matter which directory crtbegin.o is in. */ KEEP (*crtbegin*.o(.ctors)) /* We don't want to include the .ctor section from from the crtend.o file until after the sorted ctors. The .ctor section from the crtend file contains the end of ctors marker and it must be last */ KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors)) KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .dtors : { KEEP (*crtbegin*.o(.dtors)) KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors)) KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .jcr : { KEEP (*(.jcr)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .data.rel.ro : { *(.data.rel.ro.local) *(.data.rel.ro*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .dynamic : { *(.dynamic) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .got : { *(.got.plt) *(.got) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .ramtext : { *(.ramtext .ramtext.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .ddalign : { . = ALIGN(8); } >INTRAM AT>FLASH :INTRAM_AT_FLASH .data : { *(.data .data.* .gnu.linkonce.d.*) KEEP (*(.gnu.linkonce.d.*personality*)) SORT(CONSTRUCTORS) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .data1 : { *(.data1) } >INTRAM AT>FLASH :INTRAM_AT_FLASH .balign : { . = ALIGN(8); PROVIDE(_edata = .); } >INTRAM AT>FLASH :INTRAM_AT_FLASH PROVIDE (edata = .); __bss_start = .; .bss : { *(.dynbss) *(.bss .bss.* .gnu.linkonce.b.*) *(COMMON) /* Align here to ensure that the .bss section occupies space up to _end. Align after .bss to ensure correct alignment even if the .bss section disappears because there are no input sections. */ . = ALIGN(8); } >INTRAM AT>INTRAM :INTRAM . = ALIGN(8); _end = .; PROVIDE (end = .); __heap_start__ = ALIGN(8); .heap : { *(.heap) . = (__heap_size__ == __max_heap_size__) ? ORIGIN(INTRAM) + LENGTH(INTRAM) - __stack_size__ - ABSOLUTE(.) : __heap_size__; } >INTRAM AT>INTRAM :INTRAM __heap_end__ = .; /* Stabs debugging sections. */ .stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } .stab.excl 0 : { *(.stab.excl) } .stab.exclstr 0 : { *(.stab.exclstr) } .stab.index 0 : { *(.stab.index) } .stab.indexstr 0 : { *(.stab.indexstr) } .comment 0 : { *(.comment) } /* DWARF debug sections. Symbols in the DWARF debugging sections are relative to the beginning of the section so we begin them at 0. */ /* DWARF 1 */ .debug 0 : { *(.debug) } .line 0 : { *(.line) } /* GNU DWARF 1 extensions */ .debug_srcinfo 0 : { *(.debug_srcinfo) } .debug_sfnames 0 : { *(.debug_sfnames) } /* DWARF 1.1 and DWARF 2 */ .debug_aranges 0 : { *(.debug_aranges) } .debug_pubnames 0 : { *(.debug_pubnames) } /* DWARF 2 */ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } .debug_abbrev 0 : { *(.debug_abbrev) } .debug_line 0 : { *(.debug_line) } .debug_frame 0 : { *(.debug_frame) } .debug_str 0 : { *(.debug_str) } .debug_loc 0 : { *(.debug_loc) } .debug_macinfo 0 : { *(.debug_macinfo) } /* SGI/MIPS DWARF 2 extensions */ .debug_weaknames 0 : { *(.debug_weaknames) } .debug_funcnames 0 : { *(.debug_funcnames) } .debug_typenames 0 : { *(.debug_typenames) } .debug_varnames 0 : { *(.debug_varnames) } .stack ORIGIN(INTRAM) + LENGTH(INTRAM) - __stack_size__ : { _stack = .; *(.stack) . = __stack_size__; _estack = .; } >INTRAM AT>INTRAM :INTRAM .userpage : { *(.userpage .userpage.*) } >USERPAGE AT>USERPAGE :USERPAGE /DISCARD/ : { *(.note.GNU-stack) } } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/mrepeat.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Preprocessor macro repeating utils. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _MREPEAT_H_ #define _MREPEAT_H_ #include "preprocessor.h" //! Maximal number of repetitions supported by MREPEAT. #define MREPEAT_LIMIT 256 /*! \brief Macro repeat. * * This macro represents a horizontal repetition construct. * * \param count The number of repetitious calls to macro. Valid values range from 0 to MREPEAT_LIMIT. * \param macro A binary operation of the form macro(n, data). This macro is expanded by MREPEAT with * the current repetition number and the auxiliary data argument. * \param data Auxiliary data passed to macro. * * \return macro(0, data) macro(1, data) ... macro(count - 1, data) */ #define MREPEAT(count, macro, data) TPASTE2(MREPEAT, count)(macro, data) #define MREPEAT0( macro, data) #define MREPEAT1( macro, data) MREPEAT0( macro, data) macro( 0, data) #define MREPEAT2( macro, data) MREPEAT1( macro, data) macro( 1, data) #define MREPEAT3( macro, data) MREPEAT2( macro, data) macro( 2, data) #define MREPEAT4( macro, data) MREPEAT3( macro, data) macro( 3, data) #define MREPEAT5( macro, data) MREPEAT4( macro, data) macro( 4, data) #define MREPEAT6( macro, data) MREPEAT5( macro, data) macro( 5, data) #define MREPEAT7( macro, data) MREPEAT6( macro, data) macro( 6, data) #define MREPEAT8( macro, data) MREPEAT7( macro, data) macro( 7, data) #define MREPEAT9( macro, data) MREPEAT8( macro, data) macro( 8, data) #define MREPEAT10( macro, data) MREPEAT9( macro, data) macro( 9, data) #define MREPEAT11( macro, data) MREPEAT10( macro, data) macro( 10, data) #define MREPEAT12( macro, data) MREPEAT11( macro, data) macro( 11, data) #define MREPEAT13( macro, data) MREPEAT12( macro, data) macro( 12, data) #define MREPEAT14( macro, data) MREPEAT13( macro, data) macro( 13, data) #define MREPEAT15( macro, data) MREPEAT14( macro, data) macro( 14, data) #define MREPEAT16( macro, data) MREPEAT15( macro, data) macro( 15, data) #define MREPEAT17( macro, data) MREPEAT16( macro, data) macro( 16, data) #define MREPEAT18( macro, data) MREPEAT17( macro, data) macro( 17, data) #define MREPEAT19( macro, data) MREPEAT18( macro, data) macro( 18, data) #define MREPEAT20( macro, data) MREPEAT19( macro, data) macro( 19, data) #define MREPEAT21( macro, data) MREPEAT20( macro, data) macro( 20, data) #define MREPEAT22( macro, data) MREPEAT21( macro, data) macro( 21, data) #define MREPEAT23( macro, data) MREPEAT22( macro, data) macro( 22, data) #define MREPEAT24( macro, data) MREPEAT23( macro, data) macro( 23, data) #define MREPEAT25( macro, data) MREPEAT24( macro, data) macro( 24, data) #define MREPEAT26( macro, data) MREPEAT25( macro, data) macro( 25, data) #define MREPEAT27( macro, data) MREPEAT26( macro, data) macro( 26, data) #define MREPEAT28( macro, data) MREPEAT27( macro, data) macro( 27, data) #define MREPEAT29( macro, data) MREPEAT28( macro, data) macro( 28, data) #define MREPEAT30( macro, data) MREPEAT29( macro, data) macro( 29, data) #define MREPEAT31( macro, data) MREPEAT30( macro, data) macro( 30, data) #define MREPEAT32( macro, data) MREPEAT31( macro, data) macro( 31, data) #define MREPEAT33( macro, data) MREPEAT32( macro, data) macro( 32, data) #define MREPEAT34( macro, data) MREPEAT33( macro, data) macro( 33, data) #define MREPEAT35( macro, data) MREPEAT34( macro, data) macro( 34, data) #define MREPEAT36( macro, data) MREPEAT35( macro, data) macro( 35, data) #define MREPEAT37( macro, data) MREPEAT36( macro, data) macro( 36, data) #define MREPEAT38( macro, data) MREPEAT37( macro, data) macro( 37, data) #define MREPEAT39( macro, data) MREPEAT38( macro, data) macro( 38, data) #define MREPEAT40( macro, data) MREPEAT39( macro, data) macro( 39, data) #define MREPEAT41( macro, data) MREPEAT40( macro, data) macro( 40, data) #define MREPEAT42( macro, data) MREPEAT41( macro, data) macro( 41, data) #define MREPEAT43( macro, data) MREPEAT42( macro, data) macro( 42, data) #define MREPEAT44( macro, data) MREPEAT43( macro, data) macro( 43, data) #define MREPEAT45( macro, data) MREPEAT44( macro, data) macro( 44, data) #define MREPEAT46( macro, data) MREPEAT45( macro, data) macro( 45, data) #define MREPEAT47( macro, data) MREPEAT46( macro, data) macro( 46, data) #define MREPEAT48( macro, data) MREPEAT47( macro, data) macro( 47, data) #define MREPEAT49( macro, data) MREPEAT48( macro, data) macro( 48, data) #define MREPEAT50( macro, data) MREPEAT49( macro, data) macro( 49, data) #define MREPEAT51( macro, data) MREPEAT50( macro, data) macro( 50, data) #define MREPEAT52( macro, data) MREPEAT51( macro, data) macro( 51, data) #define MREPEAT53( macro, data) MREPEAT52( macro, data) macro( 52, data) #define MREPEAT54( macro, data) MREPEAT53( macro, data) macro( 53, data) #define MREPEAT55( macro, data) MREPEAT54( macro, data) macro( 54, data) #define MREPEAT56( macro, data) MREPEAT55( macro, data) macro( 55, data) #define MREPEAT57( macro, data) MREPEAT56( macro, data) macro( 56, data) #define MREPEAT58( macro, data) MREPEAT57( macro, data) macro( 57, data) #define MREPEAT59( macro, data) MREPEAT58( macro, data) macro( 58, data) #define MREPEAT60( macro, data) MREPEAT59( macro, data) macro( 59, data) #define MREPEAT61( macro, data) MREPEAT60( macro, data) macro( 60, data) #define MREPEAT62( macro, data) MREPEAT61( macro, data) macro( 61, data) #define MREPEAT63( macro, data) MREPEAT62( macro, data) macro( 62, data) #define MREPEAT64( macro, data) MREPEAT63( macro, data) macro( 63, data) #define MREPEAT65( macro, data) MREPEAT64( macro, data) macro( 64, data) #define MREPEAT66( macro, data) MREPEAT65( macro, data) macro( 65, data) #define MREPEAT67( macro, data) MREPEAT66( macro, data) macro( 66, data) #define MREPEAT68( macro, data) MREPEAT67( macro, data) macro( 67, data) #define MREPEAT69( macro, data) MREPEAT68( macro, data) macro( 68, data) #define MREPEAT70( macro, data) MREPEAT69( macro, data) macro( 69, data) #define MREPEAT71( macro, data) MREPEAT70( macro, data) macro( 70, data) #define MREPEAT72( macro, data) MREPEAT71( macro, data) macro( 71, data) #define MREPEAT73( macro, data) MREPEAT72( macro, data) macro( 72, data) #define MREPEAT74( macro, data) MREPEAT73( macro, data) macro( 73, data) #define MREPEAT75( macro, data) MREPEAT74( macro, data) macro( 74, data) #define MREPEAT76( macro, data) MREPEAT75( macro, data) macro( 75, data) #define MREPEAT77( macro, data) MREPEAT76( macro, data) macro( 76, data) #define MREPEAT78( macro, data) MREPEAT77( macro, data) macro( 77, data) #define MREPEAT79( macro, data) MREPEAT78( macro, data) macro( 78, data) #define MREPEAT80( macro, data) MREPEAT79( macro, data) macro( 79, data) #define MREPEAT81( macro, data) MREPEAT80( macro, data) macro( 80, data) #define MREPEAT82( macro, data) MREPEAT81( macro, data) macro( 81, data) #define MREPEAT83( macro, data) MREPEAT82( macro, data) macro( 82, data) #define MREPEAT84( macro, data) MREPEAT83( macro, data) macro( 83, data) #define MREPEAT85( macro, data) MREPEAT84( macro, data) macro( 84, data) #define MREPEAT86( macro, data) MREPEAT85( macro, data) macro( 85, data) #define MREPEAT87( macro, data) MREPEAT86( macro, data) macro( 86, data) #define MREPEAT88( macro, data) MREPEAT87( macro, data) macro( 87, data) #define MREPEAT89( macro, data) MREPEAT88( macro, data) macro( 88, data) #define MREPEAT90( macro, data) MREPEAT89( macro, data) macro( 89, data) #define MREPEAT91( macro, data) MREPEAT90( macro, data) macro( 90, data) #define MREPEAT92( macro, data) MREPEAT91( macro, data) macro( 91, data) #define MREPEAT93( macro, data) MREPEAT92( macro, data) macro( 92, data) #define MREPEAT94( macro, data) MREPEAT93( macro, data) macro( 93, data) #define MREPEAT95( macro, data) MREPEAT94( macro, data) macro( 94, data) #define MREPEAT96( macro, data) MREPEAT95( macro, data) macro( 95, data) #define MREPEAT97( macro, data) MREPEAT96( macro, data) macro( 96, data) #define MREPEAT98( macro, data) MREPEAT97( macro, data) macro( 97, data) #define MREPEAT99( macro, data) MREPEAT98( macro, data) macro( 98, data) #define MREPEAT100(macro, data) MREPEAT99( macro, data) macro( 99, data) #define MREPEAT101(macro, data) MREPEAT100(macro, data) macro(100, data) #define MREPEAT102(macro, data) MREPEAT101(macro, data) macro(101, data) #define MREPEAT103(macro, data) MREPEAT102(macro, data) macro(102, data) #define MREPEAT104(macro, data) MREPEAT103(macro, data) macro(103, data) #define MREPEAT105(macro, data) MREPEAT104(macro, data) macro(104, data) #define MREPEAT106(macro, data) MREPEAT105(macro, data) macro(105, data) #define MREPEAT107(macro, data) MREPEAT106(macro, data) macro(106, data) #define MREPEAT108(macro, data) MREPEAT107(macro, data) macro(107, data) #define MREPEAT109(macro, data) MREPEAT108(macro, data) macro(108, data) #define MREPEAT110(macro, data) MREPEAT109(macro, data) macro(109, data) #define MREPEAT111(macro, data) MREPEAT110(macro, data) macro(110, data) #define MREPEAT112(macro, data) MREPEAT111(macro, data) macro(111, data) #define MREPEAT113(macro, data) MREPEAT112(macro, data) macro(112, data) #define MREPEAT114(macro, data) MREPEAT113(macro, data) macro(113, data) #define MREPEAT115(macro, data) MREPEAT114(macro, data) macro(114, data) #define MREPEAT116(macro, data) MREPEAT115(macro, data) macro(115, data) #define MREPEAT117(macro, data) MREPEAT116(macro, data) macro(116, data) #define MREPEAT118(macro, data) MREPEAT117(macro, data) macro(117, data) #define MREPEAT119(macro, data) MREPEAT118(macro, data) macro(118, data) #define MREPEAT120(macro, data) MREPEAT119(macro, data) macro(119, data) #define MREPEAT121(macro, data) MREPEAT120(macro, data) macro(120, data) #define MREPEAT122(macro, data) MREPEAT121(macro, data) macro(121, data) #define MREPEAT123(macro, data) MREPEAT122(macro, data) macro(122, data) #define MREPEAT124(macro, data) MREPEAT123(macro, data) macro(123, data) #define MREPEAT125(macro, data) MREPEAT124(macro, data) macro(124, data) #define MREPEAT126(macro, data) MREPEAT125(macro, data) macro(125, data) #define MREPEAT127(macro, data) MREPEAT126(macro, data) macro(126, data) #define MREPEAT128(macro, data) MREPEAT127(macro, data) macro(127, data) #define MREPEAT129(macro, data) MREPEAT128(macro, data) macro(128, data) #define MREPEAT130(macro, data) MREPEAT129(macro, data) macro(129, data) #define MREPEAT131(macro, data) MREPEAT130(macro, data) macro(130, data) #define MREPEAT132(macro, data) MREPEAT131(macro, data) macro(131, data) #define MREPEAT133(macro, data) MREPEAT132(macro, data) macro(132, data) #define MREPEAT134(macro, data) MREPEAT133(macro, data) macro(133, data) #define MREPEAT135(macro, data) MREPEAT134(macro, data) macro(134, data) #define MREPEAT136(macro, data) MREPEAT135(macro, data) macro(135, data) #define MREPEAT137(macro, data) MREPEAT136(macro, data) macro(136, data) #define MREPEAT138(macro, data) MREPEAT137(macro, data) macro(137, data) #define MREPEAT139(macro, data) MREPEAT138(macro, data) macro(138, data) #define MREPEAT140(macro, data) MREPEAT139(macro, data) macro(139, data) #define MREPEAT141(macro, data) MREPEAT140(macro, data) macro(140, data) #define MREPEAT142(macro, data) MREPEAT141(macro, data) macro(141, data) #define MREPEAT143(macro, data) MREPEAT142(macro, data) macro(142, data) #define MREPEAT144(macro, data) MREPEAT143(macro, data) macro(143, data) #define MREPEAT145(macro, data) MREPEAT144(macro, data) macro(144, data) #define MREPEAT146(macro, data) MREPEAT145(macro, data) macro(145, data) #define MREPEAT147(macro, data) MREPEAT146(macro, data) macro(146, data) #define MREPEAT148(macro, data) MREPEAT147(macro, data) macro(147, data) #define MREPEAT149(macro, data) MREPEAT148(macro, data) macro(148, data) #define MREPEAT150(macro, data) MREPEAT149(macro, data) macro(149, data) #define MREPEAT151(macro, data) MREPEAT150(macro, data) macro(150, data) #define MREPEAT152(macro, data) MREPEAT151(macro, data) macro(151, data) #define MREPEAT153(macro, data) MREPEAT152(macro, data) macro(152, data) #define MREPEAT154(macro, data) MREPEAT153(macro, data) macro(153, data) #define MREPEAT155(macro, data) MREPEAT154(macro, data) macro(154, data) #define MREPEAT156(macro, data) MREPEAT155(macro, data) macro(155, data) #define MREPEAT157(macro, data) MREPEAT156(macro, data) macro(156, data) #define MREPEAT158(macro, data) MREPEAT157(macro, data) macro(157, data) #define MREPEAT159(macro, data) MREPEAT158(macro, data) macro(158, data) #define MREPEAT160(macro, data) MREPEAT159(macro, data) macro(159, data) #define MREPEAT161(macro, data) MREPEAT160(macro, data) macro(160, data) #define MREPEAT162(macro, data) MREPEAT161(macro, data) macro(161, data) #define MREPEAT163(macro, data) MREPEAT162(macro, data) macro(162, data) #define MREPEAT164(macro, data) MREPEAT163(macro, data) macro(163, data) #define MREPEAT165(macro, data) MREPEAT164(macro, data) macro(164, data) #define MREPEAT166(macro, data) MREPEAT165(macro, data) macro(165, data) #define MREPEAT167(macro, data) MREPEAT166(macro, data) macro(166, data) #define MREPEAT168(macro, data) MREPEAT167(macro, data) macro(167, data) #define MREPEAT169(macro, data) MREPEAT168(macro, data) macro(168, data) #define MREPEAT170(macro, data) MREPEAT169(macro, data) macro(169, data) #define MREPEAT171(macro, data) MREPEAT170(macro, data) macro(170, data) #define MREPEAT172(macro, data) MREPEAT171(macro, data) macro(171, data) #define MREPEAT173(macro, data) MREPEAT172(macro, data) macro(172, data) #define MREPEAT174(macro, data) MREPEAT173(macro, data) macro(173, data) #define MREPEAT175(macro, data) MREPEAT174(macro, data) macro(174, data) #define MREPEAT176(macro, data) MREPEAT175(macro, data) macro(175, data) #define MREPEAT177(macro, data) MREPEAT176(macro, data) macro(176, data) #define MREPEAT178(macro, data) MREPEAT177(macro, data) macro(177, data) #define MREPEAT179(macro, data) MREPEAT178(macro, data) macro(178, data) #define MREPEAT180(macro, data) MREPEAT179(macro, data) macro(179, data) #define MREPEAT181(macro, data) MREPEAT180(macro, data) macro(180, data) #define MREPEAT182(macro, data) MREPEAT181(macro, data) macro(181, data) #define MREPEAT183(macro, data) MREPEAT182(macro, data) macro(182, data) #define MREPEAT184(macro, data) MREPEAT183(macro, data) macro(183, data) #define MREPEAT185(macro, data) MREPEAT184(macro, data) macro(184, data) #define MREPEAT186(macro, data) MREPEAT185(macro, data) macro(185, data) #define MREPEAT187(macro, data) MREPEAT186(macro, data) macro(186, data) #define MREPEAT188(macro, data) MREPEAT187(macro, data) macro(187, data) #define MREPEAT189(macro, data) MREPEAT188(macro, data) macro(188, data) #define MREPEAT190(macro, data) MREPEAT189(macro, data) macro(189, data) #define MREPEAT191(macro, data) MREPEAT190(macro, data) macro(190, data) #define MREPEAT192(macro, data) MREPEAT191(macro, data) macro(191, data) #define MREPEAT193(macro, data) MREPEAT192(macro, data) macro(192, data) #define MREPEAT194(macro, data) MREPEAT193(macro, data) macro(193, data) #define MREPEAT195(macro, data) MREPEAT194(macro, data) macro(194, data) #define MREPEAT196(macro, data) MREPEAT195(macro, data) macro(195, data) #define MREPEAT197(macro, data) MREPEAT196(macro, data) macro(196, data) #define MREPEAT198(macro, data) MREPEAT197(macro, data) macro(197, data) #define MREPEAT199(macro, data) MREPEAT198(macro, data) macro(198, data) #define MREPEAT200(macro, data) MREPEAT199(macro, data) macro(199, data) #define MREPEAT201(macro, data) MREPEAT200(macro, data) macro(200, data) #define MREPEAT202(macro, data) MREPEAT201(macro, data) macro(201, data) #define MREPEAT203(macro, data) MREPEAT202(macro, data) macro(202, data) #define MREPEAT204(macro, data) MREPEAT203(macro, data) macro(203, data) #define MREPEAT205(macro, data) MREPEAT204(macro, data) macro(204, data) #define MREPEAT206(macro, data) MREPEAT205(macro, data) macro(205, data) #define MREPEAT207(macro, data) MREPEAT206(macro, data) macro(206, data) #define MREPEAT208(macro, data) MREPEAT207(macro, data) macro(207, data) #define MREPEAT209(macro, data) MREPEAT208(macro, data) macro(208, data) #define MREPEAT210(macro, data) MREPEAT209(macro, data) macro(209, data) #define MREPEAT211(macro, data) MREPEAT210(macro, data) macro(210, data) #define MREPEAT212(macro, data) MREPEAT211(macro, data) macro(211, data) #define MREPEAT213(macro, data) MREPEAT212(macro, data) macro(212, data) #define MREPEAT214(macro, data) MREPEAT213(macro, data) macro(213, data) #define MREPEAT215(macro, data) MREPEAT214(macro, data) macro(214, data) #define MREPEAT216(macro, data) MREPEAT215(macro, data) macro(215, data) #define MREPEAT217(macro, data) MREPEAT216(macro, data) macro(216, data) #define MREPEAT218(macro, data) MREPEAT217(macro, data) macro(217, data) #define MREPEAT219(macro, data) MREPEAT218(macro, data) macro(218, data) #define MREPEAT220(macro, data) MREPEAT219(macro, data) macro(219, data) #define MREPEAT221(macro, data) MREPEAT220(macro, data) macro(220, data) #define MREPEAT222(macro, data) MREPEAT221(macro, data) macro(221, data) #define MREPEAT223(macro, data) MREPEAT222(macro, data) macro(222, data) #define MREPEAT224(macro, data) MREPEAT223(macro, data) macro(223, data) #define MREPEAT225(macro, data) MREPEAT224(macro, data) macro(224, data) #define MREPEAT226(macro, data) MREPEAT225(macro, data) macro(225, data) #define MREPEAT227(macro, data) MREPEAT226(macro, data) macro(226, data) #define MREPEAT228(macro, data) MREPEAT227(macro, data) macro(227, data) #define MREPEAT229(macro, data) MREPEAT228(macro, data) macro(228, data) #define MREPEAT230(macro, data) MREPEAT229(macro, data) macro(229, data) #define MREPEAT231(macro, data) MREPEAT230(macro, data) macro(230, data) #define MREPEAT232(macro, data) MREPEAT231(macro, data) macro(231, data) #define MREPEAT233(macro, data) MREPEAT232(macro, data) macro(232, data) #define MREPEAT234(macro, data) MREPEAT233(macro, data) macro(233, data) #define MREPEAT235(macro, data) MREPEAT234(macro, data) macro(234, data) #define MREPEAT236(macro, data) MREPEAT235(macro, data) macro(235, data) #define MREPEAT237(macro, data) MREPEAT236(macro, data) macro(236, data) #define MREPEAT238(macro, data) MREPEAT237(macro, data) macro(237, data) #define MREPEAT239(macro, data) MREPEAT238(macro, data) macro(238, data) #define MREPEAT240(macro, data) MREPEAT239(macro, data) macro(239, data) #define MREPEAT241(macro, data) MREPEAT240(macro, data) macro(240, data) #define MREPEAT242(macro, data) MREPEAT241(macro, data) macro(241, data) #define MREPEAT243(macro, data) MREPEAT242(macro, data) macro(242, data) #define MREPEAT244(macro, data) MREPEAT243(macro, data) macro(243, data) #define MREPEAT245(macro, data) MREPEAT244(macro, data) macro(244, data) #define MREPEAT246(macro, data) MREPEAT245(macro, data) macro(245, data) #define MREPEAT247(macro, data) MREPEAT246(macro, data) macro(246, data) #define MREPEAT248(macro, data) MREPEAT247(macro, data) macro(247, data) #define MREPEAT249(macro, data) MREPEAT248(macro, data) macro(248, data) #define MREPEAT250(macro, data) MREPEAT249(macro, data) macro(249, data) #define MREPEAT251(macro, data) MREPEAT250(macro, data) macro(250, data) #define MREPEAT252(macro, data) MREPEAT251(macro, data) macro(251, data) #define MREPEAT253(macro, data) MREPEAT252(macro, data) macro(252, data) #define MREPEAT254(macro, data) MREPEAT253(macro, data) macro(253, data) #define MREPEAT255(macro, data) MREPEAT254(macro, data) macro(254, data) #define MREPEAT256(macro, data) MREPEAT255(macro, data) macro(255, data) #endif // _MREPEAT_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/preprocessor.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Preprocessor utils. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _PREPROCESSOR_H_ #define _PREPROCESSOR_H_ #include "tpaste.h" #include "stringz.h" #include "mrepeat.h" #endif // _PREPROCESSOR_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/stringz.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Preprocessor stringizing utils. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _STRINGZ_H_ #define _STRINGZ_H_ /*! \brief Stringize. * * Stringize a preprocessing token, this token being allowed to be \#defined. * * May be used only within macros with the token passed as an argument if the token is \#defined. * * For example, writing STRINGZ(PIN) within a macro \#defined by PIN_NAME(PIN) * and invoked as PIN_NAME(PIN0) with PIN0 \#defined as A0 is equivalent to * writing "A0". */ #define STRINGZ(x) #x /*! \brief Absolute stringize. * * Stringize a preprocessing token, this token being allowed to be \#defined. * * No restriction of use if the token is \#defined. * * For example, writing ASTRINGZ(PIN0) anywhere with PIN0 \#defined as A0 is * equivalent to writing "A0". */ #define ASTRINGZ(x) STRINGZ(x) #endif // _STRINGZ_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/tpaste.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Preprocessor token pasting utils. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _TPASTE_H_ #define _TPASTE_H_ /*! \name Token Paste * * Paste N preprocessing tokens together, these tokens being allowed to be \#defined. * * May be used only within macros with the tokens passed as arguments if the tokens are \#defined. * * For example, writing TPASTE2(U, WIDTH) within a macro \#defined by * UTYPE(WIDTH) and invoked as UTYPE(UL_WIDTH) with UL_WIDTH \#defined as 32 is * equivalent to writing U32. */ //! @{ #define TPASTE2( a, b) a##b #define TPASTE3( a, b, c) a##b##c #define TPASTE4( a, b, c, d) a##b##c##d #define TPASTE5( a, b, c, d, e) a##b##c##d##e #define TPASTE6( a, b, c, d, e, f) a##b##c##d##e##f #define TPASTE7( a, b, c, d, e, f, g) a##b##c##d##e##f##g #define TPASTE8( a, b, c, d, e, f, g, h) a##b##c##d##e##f##g##h #define TPASTE9( a, b, c, d, e, f, g, h, i) a##b##c##d##e##f##g##h##i #define TPASTE10(a, b, c, d, e, f, g, h, i, j) a##b##c##d##e##f##g##h##i##j //! @} /*! \name Absolute Token Paste * * Paste N preprocessing tokens together, these tokens being allowed to be \#defined. * * No restriction of use if the tokens are \#defined. * * For example, writing ATPASTE2(U, UL_WIDTH) anywhere with UL_WIDTH \#defined * as 32 is equivalent to writing U32. */ //! @{ #define ATPASTE2( a, b) TPASTE2( a, b) #define ATPASTE3( a, b, c) TPASTE3( a, b, c) #define ATPASTE4( a, b, c, d) TPASTE4( a, b, c, d) #define ATPASTE5( a, b, c, d, e) TPASTE5( a, b, c, d, e) #define ATPASTE6( a, b, c, d, e, f) TPASTE6( a, b, c, d, e, f) #define ATPASTE7( a, b, c, d, e, f, g) TPASTE7( a, b, c, d, e, f, g) #define ATPASTE8( a, b, c, d, e, f, g, h) TPASTE8( a, b, c, d, e, f, g, h) #define ATPASTE9( a, b, c, d, e, f, g, h, i) TPASTE9( a, b, c, d, e, f, g, h, i) #define ATPASTE10(a, b, c, d, e, f, g, h, i, j) TPASTE10(a, b, c, d, e, f, g, h, i, j) //! @} #endif // _TPASTE_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/STARTUP_FILES/GCC/crt0.x ================================================ /* This file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief AVR32UC C runtime startup file. * * This file has been built from the Newlib crt0.S. * * - Compiler: GNU GCC for AVR32 * - Supported devices: All AVR32UC devices can be used. * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #include //! @{ //! \verbatim // This must be linked @ 0x80000000 if it is to be run upon reset. .section .reset, "ax", @progbits .global _start .type _start, @function _start: // Jump to the C runtime startup routine. lda.w pc, _stext // _stext is placed outside the .reset section so that the program entry point // can be changed without affecting the C runtime startup. .section .text._stext, "ax", @progbits .global _stext .type _stext, @function _stext: // Set initial stack pointer. lda.w sp, _estack // Set up EVBA so interrupts can be enabled. lda.w r0, _evba mtsr AVR32_EVBA, r0 // Enable the exception processing. csrf AVR32_SR_EM_OFFSET // Load initialized data having a global lifetime from the data LMA. lda.w r0, _data lda.w r1, _edata cp r0, r1 brhs idata_load_loop_end lda.w r2, _data_lma idata_load_loop: ld.d r4, r2++ st.d r0++, r4 cp r0, r1 brlo idata_load_loop idata_load_loop_end: // Clear uninitialized data having a global lifetime in the blank static storage section. lda.w r0, __bss_start lda.w r1, _end cp r0, r1 brhs udata_clear_loop_end mov r2, 0 mov r3, 0 udata_clear_loop: st.d r0++, r2 cp r0, r1 brlo udata_clear_loop udata_clear_loop_end: #ifdef CONFIG_FRAME_POINTER // Safety: Set the default "return" @ to the exit routine address. lda.w lr, exit #endif // Start the show. lda.w pc, main //! \endverbatim //! @} ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/compiler.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Compiler file for AVR32. * * This file defines commonly used types and macros. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _COMPILER_H_ #define _COMPILER_H_ #if ((defined __GNUC__) && (defined __AVR32__)) || (defined __ICCAVR32__ || defined __AAVR32__) # include #endif #if (defined __ICCAVR32__) # include #endif #include "preprocessor.h" #include "parts.h" //_____ D E C L A R A T I O N S ____________________________________________ #ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling. #include #include #if (defined __ICCAVR32__) /*! \name Compiler Keywords * * Port of some keywords from GNU GCC for AVR32 to IAR Embedded Workbench for Atmel AVR32. */ //! @{ #define __asm__ asm #define __inline__ inline #define __volatile__ //! @} #endif /*! \name Usual Types */ //! @{ typedef unsigned char Bool; //!< Boolean. #ifndef __cplusplus #if !defined(__bool_true_false_are_defined) typedef unsigned char bool; //!< Boolean. #endif #endif typedef signed char S8 ; //!< 8-bit signed integer. typedef unsigned char U8 ; //!< 8-bit unsigned integer. typedef signed short int S16; //!< 16-bit signed integer. typedef unsigned short int U16; //!< 16-bit unsigned integer. typedef signed long int S32; //!< 32-bit signed integer. typedef unsigned long int U32; //!< 32-bit unsigned integer. typedef signed long long int S64; //!< 64-bit signed integer. typedef unsigned long long int U64; //!< 64-bit unsigned integer. typedef float F32; //!< 32-bit floating-point number. typedef double F64; //!< 64-bit floating-point number. //! @} /*! \name Status Types */ //! @{ typedef Bool Status_bool_t; //!< Boolean status. typedef U8 Status_t; //!< 8-bit-coded status. //! @} /*! \name Aliasing Aggregate Types */ //! @{ //! 16-bit union. typedef union { S16 s16 ; U16 u16 ; S8 s8 [2]; U8 u8 [2]; } Union16; //! 32-bit union. typedef union { S32 s32 ; U32 u32 ; S16 s16[2]; U16 u16[2]; S8 s8 [4]; U8 u8 [4]; } Union32; //! 64-bit union. typedef union { S64 s64 ; U64 u64 ; S32 s32[2]; U32 u32[2]; S16 s16[4]; U16 u16[4]; S8 s8 [8]; U8 u8 [8]; } Union64; //! Union of pointers to 64-, 32-, 16- and 8-bit unsigned integers. typedef union { S64 *s64ptr; U64 *u64ptr; S32 *s32ptr; U32 *u32ptr; S16 *s16ptr; U16 *u16ptr; S8 *s8ptr ; U8 *u8ptr ; } UnionPtr; //! Union of pointers to volatile 64-, 32-, 16- and 8-bit unsigned integers. typedef union { volatile S64 *s64ptr; volatile U64 *u64ptr; volatile S32 *s32ptr; volatile U32 *u32ptr; volatile S16 *s16ptr; volatile U16 *u16ptr; volatile S8 *s8ptr ; volatile U8 *u8ptr ; } UnionVPtr; //! Union of pointers to constant 64-, 32-, 16- and 8-bit unsigned integers. typedef union { const S64 *s64ptr; const U64 *u64ptr; const S32 *s32ptr; const U32 *u32ptr; const S16 *s16ptr; const U16 *u16ptr; const S8 *s8ptr ; const U8 *u8ptr ; } UnionCPtr; //! Union of pointers to constant volatile 64-, 32-, 16- and 8-bit unsigned integers. typedef union { const volatile S64 *s64ptr; const volatile U64 *u64ptr; const volatile S32 *s32ptr; const volatile U32 *u32ptr; const volatile S16 *s16ptr; const volatile U16 *u16ptr; const volatile S8 *s8ptr ; const volatile U8 *u8ptr ; } UnionCVPtr; //! Structure of pointers to 64-, 32-, 16- and 8-bit unsigned integers. typedef struct { S64 *s64ptr; U64 *u64ptr; S32 *s32ptr; U32 *u32ptr; S16 *s16ptr; U16 *u16ptr; S8 *s8ptr ; U8 *u8ptr ; } StructPtr; //! Structure of pointers to volatile 64-, 32-, 16- and 8-bit unsigned integers. typedef struct { volatile S64 *s64ptr; volatile U64 *u64ptr; volatile S32 *s32ptr; volatile U32 *u32ptr; volatile S16 *s16ptr; volatile U16 *u16ptr; volatile S8 *s8ptr ; volatile U8 *u8ptr ; } StructVPtr; //! Structure of pointers to constant 64-, 32-, 16- and 8-bit unsigned integers. typedef struct { const S64 *s64ptr; const U64 *u64ptr; const S32 *s32ptr; const U32 *u32ptr; const S16 *s16ptr; const U16 *u16ptr; const S8 *s8ptr ; const U8 *u8ptr ; } StructCPtr; //! Structure of pointers to constant volatile 64-, 32-, 16- and 8-bit unsigned integers. typedef struct { const volatile S64 *s64ptr; const volatile U64 *u64ptr; const volatile S32 *s32ptr; const volatile U32 *u32ptr; const volatile S16 *s16ptr; const volatile U16 *u16ptr; const volatile S8 *s8ptr ; const volatile U8 *u8ptr ; } StructCVPtr; //! @} #endif // __AVR32_ABI_COMPILER__ //_____ M A C R O S ________________________________________________________ /*! \name Usual Constants */ //! @{ #define DISABLE 0 #define ENABLE 1 #define DISABLED 0 #define ENABLED 1 #define OFF 0 #define ON 1 #define FALSE 0 #define TRUE 1 #ifndef __cplusplus #if !defined(__bool_true_false_are_defined) #define false FALSE #define true TRUE #endif #endif #define KO 0 #define OK 1 #define PASS 0 #define FAIL 1 #define LOW 0 #define HIGH 1 #define CLR 0 #define SET 1 //! @} #ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling. /*! \name Bit-Field Handling */ //! @{ /*! \brief Reads the bits of a value specified by a given bit-mask. * * \param value Value to read bits from. * \param mask Bit-mask indicating bits to read. * * \return Read bits. */ #define Rd_bits( value, mask) ((value) & (mask)) /*! \brief Writes the bits of a C lvalue specified by a given bit-mask. * * \param lvalue C lvalue to write bits to. * \param mask Bit-mask indicating bits to write. * \param bits Bits to write. * * \return Resulting value with written bits. */ #define Wr_bits(lvalue, mask, bits) ((lvalue) = ((lvalue) & ~(mask)) |\ ((bits ) & (mask))) /*! \brief Tests the bits of a value specified by a given bit-mask. * * \param value Value of which to test bits. * \param mask Bit-mask indicating bits to test. * * \return \c 1 if at least one of the tested bits is set, else \c 0. */ #define Tst_bits( value, mask) (Rd_bits(value, mask) != 0) /*! \brief Clears the bits of a C lvalue specified by a given bit-mask. * * \param lvalue C lvalue of which to clear bits. * \param mask Bit-mask indicating bits to clear. * * \return Resulting value with cleared bits. */ #define Clr_bits(lvalue, mask) ((lvalue) &= ~(mask)) /*! \brief Sets the bits of a C lvalue specified by a given bit-mask. * * \param lvalue C lvalue of which to set bits. * \param mask Bit-mask indicating bits to set. * * \return Resulting value with set bits. */ #define Set_bits(lvalue, mask) ((lvalue) |= (mask)) /*! \brief Toggles the bits of a C lvalue specified by a given bit-mask. * * \param lvalue C lvalue of which to toggle bits. * \param mask Bit-mask indicating bits to toggle. * * \return Resulting value with toggled bits. */ #define Tgl_bits(lvalue, mask) ((lvalue) ^= (mask)) /*! \brief Reads the bit-field of a value specified by a given bit-mask. * * \param value Value to read a bit-field from. * \param mask Bit-mask indicating the bit-field to read. * * \return Read bit-field. */ #define Rd_bitfield( value, mask) (Rd_bits( value, mask) >> ctz(mask)) /*! \brief Writes the bit-field of a C lvalue specified by a given bit-mask. * * \param lvalue C lvalue to write a bit-field to. * \param mask Bit-mask indicating the bit-field to write. * \param bitfield Bit-field to write. * * \return Resulting value with written bit-field. */ #define Wr_bitfield(lvalue, mask, bitfield) (Wr_bits(lvalue, mask, (U32)(bitfield) << ctz(mask))) //! @} /*! \brief This macro is used to test fatal errors. * * The macro tests if the expression is FALSE. If it is, a fatal error is * detected and the application hangs up. * * \param expr Expression to evaluate and supposed to be nonzero. */ #ifdef _ASSERT_ENABLE_ #define Assert(expr) \ {\ if (!(expr)) while (TRUE);\ } #else #define Assert(expr) #endif /*! \name Zero-Bit Counting * * Under AVR32-GCC, __builtin_clz and __builtin_ctz behave like macros when * applied to constant expressions (values known at compile time), so they are * more optimized than the use of the corresponding assembly instructions and * they can be used as constant expressions e.g. to initialize objects having * static storage duration, and like the corresponding assembly instructions * when applied to non-constant expressions (values unknown at compile time), so * they are more optimized than an assembly periphrasis. Hence, clz and ctz * ensure a possible and optimized behavior for both constant and non-constant * expressions. */ //! @{ /*! \brief Counts the leading zero bits of the given value considered as a 32-bit integer. * * \param u Value of which to count the leading zero bits. * * \return The count of leading zero bits in \a u. */ #if (defined __GNUC__) #define clz(u) __builtin_clz(u) #elif (defined __ICCAVR32__) #define clz(u) __count_leading_zeros(u) #endif /*! \brief Counts the trailing zero bits of the given value considered as a 32-bit integer. * * \param u Value of which to count the trailing zero bits. * * \return The count of trailing zero bits in \a u. */ #if (defined __GNUC__) #define ctz(u) __builtin_ctz(u) #elif (defined __ICCAVR32__) #define ctz(u) __count_trailing_zeros(u) #endif //! @} /*! \name Bit Reversing */ //! @{ /*! \brief Reverses the bits of \a u8. * * \param u8 U8 of which to reverse the bits. * * \return Value resulting from \a u8 with reversed bits. */ #define bit_reverse8(u8) ((U8)(bit_reverse32((U8)(u8)) >> 24)) /*! \brief Reverses the bits of \a u16. * * \param u16 U16 of which to reverse the bits. * * \return Value resulting from \a u16 with reversed bits. */ #define bit_reverse16(u16) ((U16)(bit_reverse32((U16)(u16)) >> 16)) /*! \brief Reverses the bits of \a u32. * * \param u32 U32 of which to reverse the bits. * * \return Value resulting from \a u32 with reversed bits. */ #if (defined __GNUC__) #define bit_reverse32(u32) \ (\ {\ unsigned int __value = (U32)(u32);\ __asm__ ("brev\t%0" : "+r" (__value) : : "cc");\ (U32)__value;\ }\ ) #elif (defined __ICCAVR32__) #define bit_reverse32(u32) ((U32)__bit_reverse((U32)(u32))) #endif /*! \brief Reverses the bits of \a u64. * * \param u64 U64 of which to reverse the bits. * * \return Value resulting from \a u64 with reversed bits. */ #define bit_reverse64(u64) ((U64)(((U64)bit_reverse32((U64)(u64) >> 32)) |\ ((U64)bit_reverse32((U64)(u64)) << 32))) //! @} /*! \name Alignment */ //! @{ /*! \brief Tests alignment of the number \a val with the \a n boundary. * * \param val Input value. * \param n Boundary. * * \return \c 1 if the number \a val is aligned with the \a n boundary, else \c 0. */ #define Test_align(val, n ) (!Tst_bits( val, (n) - 1 ) ) /*! \brief Gets alignment of the number \a val with respect to the \a n boundary. * * \param val Input value. * \param n Boundary. * * \return Alignment of the number \a val with respect to the \a n boundary. */ #define Get_align( val, n ) ( Rd_bits( val, (n) - 1 ) ) /*! \brief Sets alignment of the lvalue number \a lval to \a alg with respect to the \a n boundary. * * \param lval Input/output lvalue. * \param n Boundary. * \param alg Alignment. * * \return New value of \a lval resulting from its alignment set to \a alg with respect to the \a n boundary. */ #define Set_align(lval, n, alg) ( Wr_bits(lval, (n) - 1, alg) ) /*! \brief Aligns the number \a val with the upper \a n boundary. * * \param val Input value. * \param n Boundary. * * \return Value resulting from the number \a val aligned with the upper \a n boundary. */ #define Align_up( val, n ) (((val) + ((n) - 1)) & ~((n) - 1)) /*! \brief Aligns the number \a val with the lower \a n boundary. * * \param val Input value. * \param n Boundary. * * \return Value resulting from the number \a val aligned with the lower \a n boundary. */ #define Align_down(val, n ) ( (val) & ~((n) - 1)) //! @} /*! \name Mathematics * * The same considerations as for clz and ctz apply here but AVR32-GCC does not * provide built-in functions to access the assembly instructions abs, min and * max and it does not produce them by itself in most cases, so two sets of * macros are defined here: * - Abs, Min and Max to apply to constant expressions (values known at * compile time); * - abs, min and max to apply to non-constant expressions (values unknown at * compile time). */ //! @{ /*! \brief Takes the absolute value of \a a. * * \param a Input value. * * \return Absolute value of \a a. * * \note More optimized if only used with values known at compile time. */ #define Abs(a) (((a) < 0 ) ? -(a) : (a)) /*! \brief Takes the minimal value of \a a and \a b. * * \param a Input value. * \param b Input value. * * \return Minimal value of \a a and \a b. * * \note More optimized if only used with values known at compile time. */ #define Min(a, b) (((a) < (b)) ? (a) : (b)) /*! \brief Takes the maximal value of \a a and \a b. * * \param a Input value. * \param b Input value. * * \return Maximal value of \a a and \a b. * * \note More optimized if only used with values known at compile time. */ #define Max(a, b) (((a) > (b)) ? (a) : (b)) /*! \brief Takes the absolute value of \a a. * * \param a Input value. * * \return Absolute value of \a a. * * \note More optimized if only used with values unknown at compile time. */ #if (defined __GNUC__) #define abs(a) \ (\ {\ int __value = (a);\ __asm__ ("abs\t%0" : "+r" (__value) : : "cc");\ __value;\ }\ ) #elif (defined __ICCAVR32__) #define abs(a) Abs(a) #endif /*! \brief Takes the minimal value of \a a and \a b. * * \param a Input value. * \param b Input value. * * \return Minimal value of \a a and \a b. * * \note More optimized if only used with values unknown at compile time. */ #if (defined __GNUC__) #define min(a, b) \ (\ {\ int __value, __arg_a = (a), __arg_b = (b);\ __asm__ ("min\t%0, %1, %2" : "=r" (__value) : "r" (__arg_a), "r" (__arg_b));\ __value;\ }\ ) #elif (defined __ICCAVR32__) #define min(a, b) __min(a, b) #endif /*! \brief Takes the maximal value of \a a and \a b. * * \param a Input value. * \param b Input value. * * \return Maximal value of \a a and \a b. * * \note More optimized if only used with values unknown at compile time. */ #if (defined __GNUC__) #define max(a, b) \ (\ {\ int __value, __arg_a = (a), __arg_b = (b);\ __asm__ ("max\t%0, %1, %2" : "=r" (__value) : "r" (__arg_a), "r" (__arg_b));\ __value;\ }\ ) #elif (defined __ICCAVR32__) #define max(a, b) __max(a, b) #endif //! @} /*! \brief Calls the routine at address \a addr. * * It generates a long call opcode. * * For example, `Long_call(0x80000000)' generates a software reset on a UC3 if * it is invoked from the CPU supervisor mode. * * \param addr Address of the routine to call. * * \note It may be used as a long jump opcode in some special cases. */ #define Long_call(addr) ((*(void (*)(void))(addr))()) /*! \brief Resets the CPU by software. * * \warning It shall not be called from the CPU application mode. */ #if (defined __GNUC__) #define Reset_CPU() \ (\ {\ __asm__ __volatile__ (\ "lddpc r9, 3f\n\t"\ "mfsr r8, %[SR]\n\t"\ "bfextu r8, r8, %[SR_M_OFFSET], %[SR_M_SIZE]\n\t"\ "cp.w r8, 0b001\n\t"\ "breq 0f\n\t"\ "sub r8, pc, $ - 1f\n\t"\ "pushm r8-r9\n\t"\ "rete\n"\ "0:\n\t"\ "mtsr %[SR], r9\n"\ "1:\n\t"\ "mov r0, 0\n\t"\ "mov r1, 0\n\t"\ "mov r2, 0\n\t"\ "mov r3, 0\n\t"\ "mov r4, 0\n\t"\ "mov r5, 0\n\t"\ "mov r6, 0\n\t"\ "mov r7, 0\n\t"\ "mov r8, 0\n\t"\ "mov r9, 0\n\t"\ "mov r10, 0\n\t"\ "mov r11, 0\n\t"\ "mov r12, 0\n\t"\ "mov sp, 0\n\t"\ "stdsp sp[0], sp\n\t"\ "ldmts sp, sp\n\t"\ "mov lr, 0\n\t"\ "lddpc pc, 2f\n\t"\ ".balign 4\n"\ "2:\n\t"\ ".word _start\n"\ "3:\n\t"\ ".word %[RESET_SR]"\ :\ : [SR] "i" (AVR32_SR),\ [SR_M_OFFSET] "i" (AVR32_SR_M_OFFSET),\ [SR_M_SIZE] "i" (AVR32_SR_M_SIZE),\ [RESET_SR] "i" (AVR32_SR_GM_MASK | AVR32_SR_EM_MASK | (AVR32_SR_M_SUP << AVR32_SR_M_OFFSET))\ );\ }\ ) #elif (defined __ICCAVR32__) #define Reset_CPU() \ {\ extern void *volatile __program_start;\ __asm__ __volatile__ (\ "mov r7, LWRD(__program_start)\n\t"\ "orh r7, HWRD(__program_start)\n\t"\ "mov r9, LWRD("ASTRINGZ(AVR32_SR_GM_MASK | AVR32_SR_EM_MASK | (AVR32_SR_M_SUP << AVR32_SR_M_OFFSET))")\n\t"\ "orh r9, HWRD("ASTRINGZ(AVR32_SR_GM_MASK | AVR32_SR_EM_MASK | (AVR32_SR_M_SUP << AVR32_SR_M_OFFSET))")\n\t"\ "mfsr r8, "ASTRINGZ(AVR32_SR)"\n\t"\ "bfextu r8, r8, "ASTRINGZ(AVR32_SR_M_OFFSET)", "ASTRINGZ(AVR32_SR_M_SIZE)"\n\t"\ "cp.w r8, 001b\n\t"\ "breq $ + 10\n\t"\ "sub r8, pc, -12\n\t"\ "pushm r8-r9\n\t"\ "rete\n\t"\ "mtsr "ASTRINGZ(AVR32_SR)", r9\n\t"\ "mov r0, 0\n\t"\ "mov r1, 0\n\t"\ "mov r2, 0\n\t"\ "mov r3, 0\n\t"\ "mov r4, 0\n\t"\ "mov r5, 0\n\t"\ "mov r6, 0\n\t"\ "st.w r0[4], r7\n\t"\ "mov r7, 0\n\t"\ "mov r8, 0\n\t"\ "mov r9, 0\n\t"\ "mov r10, 0\n\t"\ "mov r11, 0\n\t"\ "mov r12, 0\n\t"\ "mov sp, 0\n\t"\ "stdsp sp[0], sp\n\t"\ "ldmts sp, sp\n\t"\ "mov lr, 0\n\t"\ "ld.w pc, lr[4]"\ );\ __program_start;\ } #endif /*! \name System Register Access */ //! @{ /*! \brief Gets the value of the \a sysreg system register. * * \param sysreg Address of the system register of which to get the value. * * \return Value of the \a sysreg system register. */ #if (defined __GNUC__) #define Get_system_register(sysreg) __builtin_mfsr(sysreg) #elif (defined __ICCAVR32__) #define Get_system_register(sysreg) __get_system_register(sysreg) #endif /*! \brief Sets the value of the \a sysreg system register to \a value. * * \param sysreg Address of the system register of which to set the value. * \param value Value to set the \a sysreg system register to. */ #if (defined __GNUC__) #define Set_system_register(sysreg, value) __builtin_mtsr(sysreg, value) #elif (defined __ICCAVR32__) #define Set_system_register(sysreg, value) __set_system_register(sysreg, value) #endif //! @} /*! \name CPU Status Register Access */ //! @{ /*! \brief Tells whether exceptions are globally enabled. * * \return \c 1 if exceptions are globally enabled, else \c 0. */ #define Is_global_exception_enabled() (!Tst_bits(Get_system_register(AVR32_SR), AVR32_SR_EM_MASK)) /*! \brief Disables exceptions globally. */ #if (defined __GNUC__) #define Disable_global_exception() ({__asm__ __volatile__ ("ssrf\t%0" : : "i" (AVR32_SR_EM_OFFSET));}) #elif (defined __ICCAVR32__) #define Disable_global_exception() (__set_status_flag(AVR32_SR_EM_OFFSET)) #endif /*! \brief Enables exceptions globally. */ #if (defined __GNUC__) #define Enable_global_exception() ({__asm__ __volatile__ ("csrf\t%0" : : "i" (AVR32_SR_EM_OFFSET));}) #elif (defined __ICCAVR32__) #define Enable_global_exception() (__clear_status_flag(AVR32_SR_EM_OFFSET)) #endif /*! \brief Tells whether interrupts are globally enabled. * * \return \c 1 if interrupts are globally enabled, else \c 0. */ #define Is_global_interrupt_enabled() (!Tst_bits(Get_system_register(AVR32_SR), AVR32_SR_GM_MASK)) /*! \brief Disables interrupts globally. */ #if (defined __GNUC__) #define Disable_global_interrupt() ({__asm__ __volatile__ ("ssrf\t%0" : : "i" (AVR32_SR_GM_OFFSET));}) #elif (defined __ICCAVR32__) #define Disable_global_interrupt() (__disable_interrupt()) #endif /*! \brief Enables interrupts globally. */ #if (defined __GNUC__) #define Enable_global_interrupt() ({__asm__ __volatile__ ("csrf\t%0" : : "i" (AVR32_SR_GM_OFFSET));}) #elif (defined __ICCAVR32__) #define Enable_global_interrupt() (__enable_interrupt()) #endif /*! \brief Tells whether interrupt level \a int_level is enabled. * * \param int_level Interrupt level (0 to 3). * * \return \c 1 if interrupt level \a int_level is enabled, else \c 0. */ #define Is_interrupt_level_enabled(int_level) (!Tst_bits(Get_system_register(AVR32_SR), TPASTE3(AVR32_SR_I, int_level, M_MASK))) /*! \brief Disables interrupt level \a int_level. * * \param int_level Interrupt level to disable (0 to 3). */ #if (defined __GNUC__) #define Disable_interrupt_level(int_level) ({__asm__ __volatile__ ("ssrf\t%0" : : "i" (TPASTE3(AVR32_SR_I, int_level, M_OFFSET)));}) #elif (defined __ICCAVR32__) #define Disable_interrupt_level(int_level) (__set_status_flag(TPASTE3(AVR32_SR_I, int_level, M_OFFSET))) #endif /*! \brief Enables interrupt level \a int_level. * * \param int_level Interrupt level to enable (0 to 3). */ #if (defined __GNUC__) #define Enable_interrupt_level(int_level) ({__asm__ __volatile__ ("csrf\t%0" : : "i" (TPASTE3(AVR32_SR_I, int_level, M_OFFSET)));}) #elif (defined __ICCAVR32__) #define Enable_interrupt_level(int_level) (__clear_status_flag(TPASTE3(AVR32_SR_I, int_level, M_OFFSET))) #endif /*! \brief Protects subsequent code from interrupts. */ #define AVR32_ENTER_CRITICAL_REGION( ) \ { \ Bool global_interrupt_enabled = Is_global_interrupt_enabled(); \ Disable_global_interrupt(); // Disable the appropriate interrupts. /*! \brief This macro must always be used in conjunction with AVR32_ENTER_CRITICAL_REGION * so that interrupts are enabled again. */ #define AVR32_LEAVE_CRITICAL_REGION( ) \ if (global_interrupt_enabled) Enable_global_interrupt(); \ } //! @} /*! \name Debug Register Access */ //! @{ /*! \brief Gets the value of the \a dbgreg debug register. * * \param dbgreg Address of the debug register of which to get the value. * * \return Value of the \a dbgreg debug register. */ #if (defined __GNUC__) #define Get_debug_register(dbgreg) __builtin_mfdr(dbgreg) #elif (defined __ICCAVR32__) #define Get_debug_register(dbgreg) __get_debug_register(dbgreg) #endif /*! \brief Sets the value of the \a dbgreg debug register to \a value. * * \param dbgreg Address of the debug register of which to set the value. * \param value Value to set the \a dbgreg debug register to. */ #if (defined __GNUC__) #define Set_debug_register(dbgreg, value) __builtin_mtdr(dbgreg, value) #elif (defined __ICCAVR32__) #define Set_debug_register(dbgreg, value) __set_debug_register(dbgreg, value) #endif //! @} #endif // __AVR32_ABI_COMPILER__ //! Boolean evaluating MCU little endianism. #if ((defined __GNUC__) && (defined __AVR32__)) || ((defined __ICCAVR32__) || (defined __AAVR32__)) #define LITTLE_ENDIAN_MCU FALSE #else #error If you are here, you should check what is exactly the processor you are using... #define LITTLE_ENDIAN_MCU FALSE #endif // Check that MCU endianism is correctly defined. #ifndef LITTLE_ENDIAN_MCU #error YOU MUST define the MCU endianism with LITTLE_ENDIAN_MCU: either FALSE or TRUE #endif //! Boolean evaluating MCU big endianism. #define BIG_ENDIAN_MCU (!LITTLE_ENDIAN_MCU) #ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling. /*! \name MCU Endianism Handling */ //! @{ #if (LITTLE_ENDIAN_MCU==TRUE) #define LSB(u16) (((U8 *)&(u16))[0]) //!< Least significant byte of \a u16. #define MSB(u16) (((U8 *)&(u16))[1]) //!< Most significant byte of \a u16. #define LSH(u32) (((U16 *)&(u32))[0]) //!< Least significant half-word of \a u32. #define MSH(u32) (((U16 *)&(u32))[1]) //!< Most significant half-word of \a u32. #define LSB0W(u32) (((U8 *)&(u32))[0]) //!< Least significant byte of 1st rank of \a u32. #define LSB1W(u32) (((U8 *)&(u32))[1]) //!< Least significant byte of 2nd rank of \a u32. #define LSB2W(u32) (((U8 *)&(u32))[2]) //!< Least significant byte of 3rd rank of \a u32. #define LSB3W(u32) (((U8 *)&(u32))[3]) //!< Least significant byte of 4th rank of \a u32. #define MSB3W(u32) LSB0W(u32) //!< Most significant byte of 4th rank of \a u32. #define MSB2W(u32) LSB1W(u32) //!< Most significant byte of 3rd rank of \a u32. #define MSB1W(u32) LSB2W(u32) //!< Most significant byte of 2nd rank of \a u32. #define MSB0W(u32) LSB3W(u32) //!< Most significant byte of 1st rank of \a u32. #define LSW(u64) (((U32 *)&(u64))[0]) //!< Least significant word of \a u64. #define MSW(u64) (((U32 *)&(u64))[1]) //!< Most significant word of \a u64. #define LSH0(u64) (((U16 *)&(u64))[0]) //!< Least significant half-word of 1st rank of \a u64. #define LSH1(u64) (((U16 *)&(u64))[1]) //!< Least significant half-word of 2nd rank of \a u64. #define LSH2(u64) (((U16 *)&(u64))[2]) //!< Least significant half-word of 3rd rank of \a u64. #define LSH3(u64) (((U16 *)&(u64))[3]) //!< Least significant half-word of 4th rank of \a u64. #define MSH3(u64) LSH0(u64) //!< Most significant half-word of 4th rank of \a u64. #define MSH2(u64) LSH1(u64) //!< Most significant half-word of 3rd rank of \a u64. #define MSH1(u64) LSH2(u64) //!< Most significant half-word of 2nd rank of \a u64. #define MSH0(u64) LSH3(u64) //!< Most significant half-word of 1st rank of \a u64. #define LSB0D(u64) (((U8 *)&(u64))[0]) //!< Least significant byte of 1st rank of \a u64. #define LSB1D(u64) (((U8 *)&(u64))[1]) //!< Least significant byte of 2nd rank of \a u64. #define LSB2D(u64) (((U8 *)&(u64))[2]) //!< Least significant byte of 3rd rank of \a u64. #define LSB3D(u64) (((U8 *)&(u64))[3]) //!< Least significant byte of 4th rank of \a u64. #define LSB4D(u64) (((U8 *)&(u64))[4]) //!< Least significant byte of 5th rank of \a u64. #define LSB5D(u64) (((U8 *)&(u64))[5]) //!< Least significant byte of 6th rank of \a u64. #define LSB6D(u64) (((U8 *)&(u64))[6]) //!< Least significant byte of 7th rank of \a u64. #define LSB7D(u64) (((U8 *)&(u64))[7]) //!< Least significant byte of 8th rank of \a u64. #define MSB7D(u64) LSB0D(u64) //!< Most significant byte of 8th rank of \a u64. #define MSB6D(u64) LSB1D(u64) //!< Most significant byte of 7th rank of \a u64. #define MSB5D(u64) LSB2D(u64) //!< Most significant byte of 6th rank of \a u64. #define MSB4D(u64) LSB3D(u64) //!< Most significant byte of 5th rank of \a u64. #define MSB3D(u64) LSB4D(u64) //!< Most significant byte of 4th rank of \a u64. #define MSB2D(u64) LSB5D(u64) //!< Most significant byte of 3rd rank of \a u64. #define MSB1D(u64) LSB6D(u64) //!< Most significant byte of 2nd rank of \a u64. #define MSB0D(u64) LSB7D(u64) //!< Most significant byte of 1st rank of \a u64. #elif (BIG_ENDIAN_MCU==TRUE) #define MSB(u16) (((U8 *)&(u16))[0]) //!< Most significant byte of \a u16. #define LSB(u16) (((U8 *)&(u16))[1]) //!< Least significant byte of \a u16. #define MSH(u32) (((U16 *)&(u32))[0]) //!< Most significant half-word of \a u32. #define LSH(u32) (((U16 *)&(u32))[1]) //!< Least significant half-word of \a u32. #define MSB0W(u32) (((U8 *)&(u32))[0]) //!< Most significant byte of 1st rank of \a u32. #define MSB1W(u32) (((U8 *)&(u32))[1]) //!< Most significant byte of 2nd rank of \a u32. #define MSB2W(u32) (((U8 *)&(u32))[2]) //!< Most significant byte of 3rd rank of \a u32. #define MSB3W(u32) (((U8 *)&(u32))[3]) //!< Most significant byte of 4th rank of \a u32. #define LSB3W(u32) MSB0W(u32) //!< Least significant byte of 4th rank of \a u32. #define LSB2W(u32) MSB1W(u32) //!< Least significant byte of 3rd rank of \a u32. #define LSB1W(u32) MSB2W(u32) //!< Least significant byte of 2nd rank of \a u32. #define LSB0W(u32) MSB3W(u32) //!< Least significant byte of 1st rank of \a u32. #define MSW(u64) (((U32 *)&(u64))[0]) //!< Most significant word of \a u64. #define LSW(u64) (((U32 *)&(u64))[1]) //!< Least significant word of \a u64. #define MSH0(u64) (((U16 *)&(u64))[0]) //!< Most significant half-word of 1st rank of \a u64. #define MSH1(u64) (((U16 *)&(u64))[1]) //!< Most significant half-word of 2nd rank of \a u64. #define MSH2(u64) (((U16 *)&(u64))[2]) //!< Most significant half-word of 3rd rank of \a u64. #define MSH3(u64) (((U16 *)&(u64))[3]) //!< Most significant half-word of 4th rank of \a u64. #define LSH3(u64) MSH0(u64) //!< Least significant half-word of 4th rank of \a u64. #define LSH2(u64) MSH1(u64) //!< Least significant half-word of 3rd rank of \a u64. #define LSH1(u64) MSH2(u64) //!< Least significant half-word of 2nd rank of \a u64. #define LSH0(u64) MSH3(u64) //!< Least significant half-word of 1st rank of \a u64. #define MSB0D(u64) (((U8 *)&(u64))[0]) //!< Most significant byte of 1st rank of \a u64. #define MSB1D(u64) (((U8 *)&(u64))[1]) //!< Most significant byte of 2nd rank of \a u64. #define MSB2D(u64) (((U8 *)&(u64))[2]) //!< Most significant byte of 3rd rank of \a u64. #define MSB3D(u64) (((U8 *)&(u64))[3]) //!< Most significant byte of 4th rank of \a u64. #define MSB4D(u64) (((U8 *)&(u64))[4]) //!< Most significant byte of 5th rank of \a u64. #define MSB5D(u64) (((U8 *)&(u64))[5]) //!< Most significant byte of 6th rank of \a u64. #define MSB6D(u64) (((U8 *)&(u64))[6]) //!< Most significant byte of 7th rank of \a u64. #define MSB7D(u64) (((U8 *)&(u64))[7]) //!< Most significant byte of 8th rank of \a u64. #define LSB7D(u64) MSB0D(u64) //!< Least significant byte of 8th rank of \a u64. #define LSB6D(u64) MSB1D(u64) //!< Least significant byte of 7th rank of \a u64. #define LSB5D(u64) MSB2D(u64) //!< Least significant byte of 6th rank of \a u64. #define LSB4D(u64) MSB3D(u64) //!< Least significant byte of 5th rank of \a u64. #define LSB3D(u64) MSB4D(u64) //!< Least significant byte of 4th rank of \a u64. #define LSB2D(u64) MSB5D(u64) //!< Least significant byte of 3rd rank of \a u64. #define LSB1D(u64) MSB6D(u64) //!< Least significant byte of 2nd rank of \a u64. #define LSB0D(u64) MSB7D(u64) //!< Least significant byte of 1st rank of \a u64. #else #error Unknown endianism. #endif //! @} /*! \name Endianism Conversion * * The same considerations as for clz and ctz apply here but AVR32-GCC's * __builtin_bswap_16 and __builtin_bswap_32 do not behave like macros when * applied to constant expressions, so two sets of macros are defined here: * - Swap16, Swap32 and Swap64 to apply to constant expressions (values known * at compile time); * - swap16, swap32 and swap64 to apply to non-constant expressions (values * unknown at compile time). */ //! @{ /*! \brief Toggles the endianism of \a u16 (by swapping its bytes). * * \param u16 U16 of which to toggle the endianism. * * \return Value resulting from \a u16 with toggled endianism. * * \note More optimized if only used with values known at compile time. */ #define Swap16(u16) ((U16)(((U16)(u16) >> 8) |\ ((U16)(u16) << 8))) /*! \brief Toggles the endianism of \a u32 (by swapping its bytes). * * \param u32 U32 of which to toggle the endianism. * * \return Value resulting from \a u32 with toggled endianism. * * \note More optimized if only used with values known at compile time. */ #define Swap32(u32) ((U32)(((U32)Swap16((U32)(u32) >> 16)) |\ ((U32)Swap16((U32)(u32)) << 16))) /*! \brief Toggles the endianism of \a u64 (by swapping its bytes). * * \param u64 U64 of which to toggle the endianism. * * \return Value resulting from \a u64 with toggled endianism. * * \note More optimized if only used with values known at compile time. */ #define Swap64(u64) ((U64)(((U64)Swap32((U64)(u64) >> 32)) |\ ((U64)Swap32((U64)(u64)) << 32))) /*! \brief Toggles the endianism of \a u16 (by swapping its bytes). * * \param u16 U16 of which to toggle the endianism. * * \return Value resulting from \a u16 with toggled endianism. * * \note More optimized if only used with values unknown at compile time. */ #if (defined __GNUC__) #define swap16(u16) ((U16)__builtin_bswap_16((U16)(u16))) #elif (defined __ICCAVR32__) #define swap16(u16) ((U16)__swap_bytes_in_halfwords((U16)(u16))) #endif /*! \brief Toggles the endianism of \a u32 (by swapping its bytes). * * \param u32 U32 of which to toggle the endianism. * * \return Value resulting from \a u32 with toggled endianism. * * \note More optimized if only used with values unknown at compile time. */ #if (defined __GNUC__) #define swap32(u32) ((U32)__builtin_bswap_32((U32)(u32))) #elif (defined __ICCAVR32__) #define swap32(u32) ((U32)__swap_bytes((U32)(u32))) #endif /*! \brief Toggles the endianism of \a u64 (by swapping its bytes). * * \param u64 U64 of which to toggle the endianism. * * \return Value resulting from \a u64 with toggled endianism. * * \note More optimized if only used with values unknown at compile time. */ #define swap64(u64) ((U64)(((U64)swap32((U64)(u64) >> 32)) |\ ((U64)swap32((U64)(u64)) << 32))) //! @} /*! \name Target Abstraction */ //! @{ #define _GLOBEXT_ extern //!< extern storage-class specifier. #define _CONST_TYPE_ const //!< const type qualifier. #define _MEM_TYPE_SLOW_ //!< Slow memory type. #define _MEM_TYPE_MEDFAST_ //!< Fairly fast memory type. #define _MEM_TYPE_FAST_ //!< Fast memory type. typedef U8 Byte; //!< 8-bit unsigned integer. #define memcmp_ram2ram memcmp //!< Target-specific memcmp of RAM to RAM. #define memcmp_code2ram memcmp //!< Target-specific memcmp of RAM to NVRAM. #define memcpy_ram2ram memcpy //!< Target-specific memcpy from RAM to RAM. #define memcpy_code2ram memcpy //!< Target-specific memcpy from NVRAM to RAM. #define LSB0(u32) LSB0W(u32) //!< Least significant byte of 1st rank of \a u32. #define LSB1(u32) LSB1W(u32) //!< Least significant byte of 2nd rank of \a u32. #define LSB2(u32) LSB2W(u32) //!< Least significant byte of 3rd rank of \a u32. #define LSB3(u32) LSB3W(u32) //!< Least significant byte of 4th rank of \a u32. #define MSB3(u32) MSB3W(u32) //!< Most significant byte of 4th rank of \a u32. #define MSB2(u32) MSB2W(u32) //!< Most significant byte of 3rd rank of \a u32. #define MSB1(u32) MSB1W(u32) //!< Most significant byte of 2nd rank of \a u32. #define MSB0(u32) MSB0W(u32) //!< Most significant byte of 1st rank of \a u32. //! @} #endif // __AVR32_ABI_COMPILER__ #endif // _COMPILER_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/conf_isp.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ****************************************************************** * * \brief ISP configuration file. * * This file contains the possible external configuration of the ISP. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices with a USB module can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ***************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _CONF_ISP_H_ #define _CONF_ISP_H_ #include #include "compiler.h" //_____ D E F I N I T I O N S ______________________________________________ #define PRODUCT_MANUFACTURER_ID 0x58 #define PRODUCT_FAMILY_ID 0x20 #define ISP_VERSION 0x10 #define ISP_ID0 0x00 #define ISP_ID1 0x00 #define ISP_CFG1 (*(volatile U32 *)ISP_CFG1_ADDRESS) #define ISP_CFG1_ADDRESS (AVR32_FLASHC_USER_PAGE_ADDRESS + ISP_CFG1_OFFSET) #define ISP_CFG1_OFFSET 0x000001FC #define ISP_CFG1_SIZE 4 #define ISP_CFG1_BOOT_KEY1 16 #define ISP_CFG1_BOOT_KEY1_MASK 0xFFFF0000 #define ISP_CFG1_BOOT_KEY1_OFFSET 16 #define ISP_CFG1_BOOT_KEY1_SIZE 16 #define ISP_CFG1_BOOT_KEY1_VALUE 0xE11E #define ISP_CFG1_FORCE 9 #define ISP_CFG1_FORCE_MASK 0x00000200 #define ISP_CFG1_FORCE_OFFSET 9 #define ISP_CFG1_FORCE_SIZE 1 #define ISP_CFG1_IO_COND_EN 8 #define ISP_CFG1_IO_COND_EN_MASK 0x00000100 #define ISP_CFG1_IO_COND_EN_OFFSET 8 #define ISP_CFG1_IO_COND_EN_SIZE 1 #define ISP_CFG1_CRC8 0 #define ISP_CFG1_CRC8_MASK 0x000000FF #define ISP_CFG1_CRC8_OFFSET 0 #define ISP_CFG1_CRC8_SIZE 8 #define ISP_CFG1_CRC8_POLYNOMIAL 0x107 #define ISP_CFG2 (*(volatile U32 *)ISP_CFG2_ADDRESS) #define ISP_CFG2_ADDRESS (AVR32_FLASHC_USER_PAGE_ADDRESS + ISP_CFG2_OFFSET) #define ISP_CFG2_OFFSET 0x000001F8 #define ISP_CFG2_SIZE 4 #define ISP_CFG2_BOOT_KEY 17 #define ISP_CFG2_BOOT_KEY_MASK 0xFFFE0000 #define ISP_CFG2_BOOT_KEY_OFFSET 17 #define ISP_CFG2_BOOT_KEY_SIZE 15 #define ISP_CFG2_BOOT_KEY_VALUE 0x494F #define ISP_CFG2_IO_COND_LEVEL 16 #define ISP_CFG2_IO_COND_LEVEL_MASK 0x00010000 #define ISP_CFG2_IO_COND_LEVEL_OFFSET 16 #define ISP_CFG2_IO_COND_LEVEL_SIZE 1 #define ISP_CFG2_IO_COND_PIN 8 #define ISP_CFG2_IO_COND_PIN_MASK 0x0000FF00 #define ISP_CFG2_IO_COND_PIN_OFFSET 8 #define ISP_CFG2_IO_COND_PIN_SIZE 8 #define ISP_CFG2_CRC8 0 #define ISP_CFG2_CRC8_MASK 0x000000FF #define ISP_CFG2_CRC8_OFFSET 0 #define ISP_CFG2_CRC8_SIZE 8 #define ISP_CFG2_CRC8_POLYNOMIAL 0x107 #define ISP_KEY (*(volatile U32 *)ISP_KEY_ADDRESS) #define ISP_KEY_ADDRESS (AVR32_SRAM_ADDRESS + ISP_KEY_OFFSET) #define ISP_KEY_OFFSET 0x00000000 #define ISP_KEY_SIZE 4 #define ISP_KEY_VALUE ('I' << 24 | 'S' << 16 | 'P' << 8 | 'K') #ifndef ISP_OSC #define ISP_OSC 0 #endif #define DFU_FRAME_LENGTH 2048 #define PROGRAM_START_ADDRESS (AVR32_FLASH_ADDRESS + PROGRAM_START_OFFSET) #define PROGRAM_START_OFFSET 0x00002000 #endif // _CONF_ISP_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/parts.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*This file is prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief Arch file for AVR32. * * This file defines common AVR32 UC3 series. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * ******************************************************************************/ /* Copyright (c) 2009 Atmel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an Atmel * AVR product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _ARCH_H_ #define _ARCH_H_ // UC3 A Series #define UC3A0 ( defined (__GNUC__) && \ ( defined (__AVR32_UC3A0128__) || \ defined (__AVR32_UC3A0256__) || \ defined (__AVR32_UC3A0512__) || \ defined (__AVR32_UC3A0512ES__))) \ ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ ( defined (__AT32UC3A0128__) || \ defined (__AT32UC3A0256__) || \ defined (__AT32UC3A0512__) || \ defined (__AT32UC3A0512ES__))) #define UC3A1 ( defined (__GNUC__) && \ ( defined (__AVR32_UC3A1128__) || \ defined (__AVR32_UC3A1256__) || \ defined (__AVR32_UC3A1512__) || \ defined (__AVR32_UC3A1512ES__))) \ ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ ( defined (__AT32UC3A1128__) || \ defined (__AT32UC3A1256__) || \ defined (__AT32UC3A1512__) || \ defined (__AT32UC3A1512ES__))) #define UC3A3 ( defined (__GNUC__) && \ ( defined (__AVR32_UC3A364__) || \ defined (__AVR32_UC3A364S__) || \ defined (__AVR32_UC3A3128__) || \ defined (__AVR32_UC3A3128S__) || \ defined (__AVR32_UC3A3256__) || \ defined (__AVR32_UC3A3256S__))) \ ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ ( defined (__AT32UC3A364__) || \ defined (__AT32UC3A364S__) || \ defined (__AT32UC3A3128__) || \ defined (__AT32UC3A3128S__) || \ defined (__AT32UC3A3256__) || \ defined (__AT32UC3A3256S__))) #define UC3A (UC3A0 || UC3A1 || UC3A3) // UC3 B Series #define UC3B0 ( defined (__GNUC__) && \ ( defined (__AVR32_UC3B064__) || \ defined (__AVR32_UC3B0128__) || \ defined (__AVR32_UC3B0256__) || \ defined (__AVR32_UC3B0256ES__) || \ defined (__AVR32_UC3B0512__) || \ defined (__AVR32_UC3B0512REVC_))) \ ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ ( defined (__AT32UC3B064__) || \ defined (__AT32UC3B0128__) || \ defined (__AT32UC3B0256__) || \ defined (__AT32UC3B0256ES__) || \ defined (__AT32UC3B0512__) || \ defined (__AT32UC3B0512REVC__))) #define UC3B1 ( defined (__GNUC__) && \ ( defined (__AVR32_UC3B164__) || \ defined (__AVR32_UC3B1128__) || \ defined (__AVR32_UC3B1256__) || \ defined (__AVR32_UC3B1256ES__) || \ defined (__AVR32_UC3B1512__) || \ defined (__AVR32_UC3B1512ES__))) \ ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ ( defined (__AT32UC3B164__) || \ defined (__AT32UC3B1128__) || \ defined (__AT32UC3B1256__) || \ defined (__AT32UC3B1256ES__) || \ defined (__AT32UC3B1512__) || \ defined (__AT32UC3B1512REVC__))) #define UC3B (UC3B0 || UC3B1 ) // UC3 C Series #define UC3C0 ( defined (__GNUC__) && \ ( defined (__AVR32_UC3C064C__) || \ defined (__AVR32_UC3C0128C__) || \ defined (__AVR32_UC3C0256C__) || \ defined (__AVR32_UC3C0512CREVC__))) \ ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ ( defined (__AT32UC3C064C__) || \ defined (__AT32UC3C0128C__) || \ defined (__AT32UC3C0256C__) || \ defined (__AT32UC3C0512C__))) #define UC3C1 ( defined (__GNUC__) && \ ( defined (__AVR32_UC3C164C__) || \ defined (__AVR32_UC3C1128C__) || \ defined (__AVR32_UC3C1256C__) || \ defined (__AVR32_UC3C1512CREVC__))) \ ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ ( defined (__AT32UC3C164C__) || \ defined (__AT32UC3C1128C__) || \ defined (__AT32UC3C1256C__) || \ defined (__AT32UC3C1512C__))) #define UC3C2 ( defined (__GNUC__) && \ ( defined (__AVR32_UC3C264C__) || \ defined (__AVR32_UC3C2128C__) || \ defined (__AVR32_UC3C2256C__) || \ defined (__AVR32_UC3C2512CREVC__))) \ ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ ( defined (__AT32UC3C264C__) || \ defined (__AT32UC3C2128C__) || \ defined (__AT32UC3C2256C__) || \ defined (__AT32UC3C2512C__))) #define UC3C (UC3C0 || UC3C1 || UC3C2) // UC3 L Device series #define UC3L0 ( defined (__GNUC__) && \ ( defined (__AVR32_UC3L016__) || \ defined (__AVR32_UC3L032__) || \ defined (__AVR32_UC3L064__) || \ defined (__AVR32_UC3L064REVB__))) \ ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ ( defined (__AT32UC3L016__) || \ defined (__AT32UC3L032__) || \ defined (__AT32UC3L064__) || \ defined (__AT32UC3L064REVB__))) #define UC3L1 ( defined (__GNUC__) && \ ( defined (__AVR32_UC3L116__) || \ defined (__AVR32_UC3L132__) || \ defined (__AVR32_UC3L164__))) \ ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ ( defined (__AT32UC3L116__) || \ defined (__AT32UC3L132__) || \ defined (__AT32UC3L164__))) #define UC3L2 ( defined (__GNUC__) && \ ( defined (__AVR32_UC3L216__) || \ defined (__AVR32_UC3L232__) || \ defined (__AVR32_UC3L264__))) \ ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ ( defined (__AT32UC3L216__) || \ defined (__AT32UC3L232__) || \ defined (__AT32UC3L264__))) #define UC3L3 ( defined (__GNUC__) && \ ( defined (__AVR32_UC3L316__) || \ defined (__AVR32_UC3L332__) || \ defined (__AVR32_UC3L364__))) \ ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ ( defined (__AT32UC3L316__) || \ defined (__AT32UC3L332__) || \ defined (__AT32UC3L364__))) #define UC3L (UC3L0 || UC3L1 || UC3L2 || UC3L3) #endif // _ARCH_H_ ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/clocks.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include "board.h" #include "clocks.h" #include "pm.h" #include "flashc.h" #include "gpio.h" /** * Initializes the MCU system clocks. */ void init_sys_clocks(void) { /* switch to OSC0 to speed up the booting */ pm_switch_to_osc0(&AVR32_PM, FOSC0, OSC0_STARTUP); #ifndef USE_PLL return; #endif /* For audio, ee have to use OSC1 on to generate the correct clockrate * for the SSC */ #if OSC == 1 /* start oscillator1 */ pm_enable_osc1_crystal(&AVR32_PM, FOSC1); pm_enable_clk1(&AVR32_PM, OSC1_STARTUP); #endif /* configure pll multipliers */ pm_pll_setup(&AVR32_PM, 0, /* pll */ PLL_MUL, /* mul */ 1, /* div */ OSC, /* osc */ 16); /* lockcount */ /* set PLL operating range and divider (fpll = fvco/2) * this gives PLL output = 66 MHz (62.0928 MHz for EVK1105/OSC1) */ pm_pll_set_option(&AVR32_PM, 0, /* pll */ 1, /* pll_freq */ 1, /* pll_div2 */ 0); /* pll_wbwdisable. */ /* start PLL0 and wait for the lock */ pm_pll_enable(&AVR32_PM, 0); pm_wait_for_pll0_locked(&AVR32_PM); /* Set all peripheral clocks torun at master clock rate */ pm_cksel(&AVR32_PM, 0, /* pbadiv */ 0, /* pbasel */ 0, /* pbbdiv */ 0, /* pbbsel */ 0, /* hsbdiv */ 0); /* hsbsel */ /* Set one waitstate for the flash */ flashc_set_wait_state(1); /* Switch to PLL0 as the master clock */ pm_switch_to_clock(&AVR32_PM, AVR32_PM_MCCTRL_MCSEL_PLL0); #if OSC == 1 pm_configure_usb_clock(); #endif } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/clocks.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef CLOCKS_H #define CLOCKS_H #include "board.h" #if BOARD == EVK1100 # define USE_PLL # define OSC 0 # define PLL_MUL 10 #elif BOARD == EVK1101 # define USE_PLL # define OSC 0 # define PLL_MUL 9 #elif BOARD == EVK1104 # define USE_PLL # define OSC 0 # define PLL_MUL 9 /* for some reason we cant use 66 MHz */ #elif BOARD == EVK1105 # define USE_PLL # define OSC 1 # define PLL_MUL 10 #elif BOARD == ARDUINO # define USE_PLL # define OSC 0 # define PLL_MUL 8 #endif #if OSC == 0 # define FOSC FOSC0 /* 12 MHz */ #else # define FOSC FOSC1 /* 11.2896 MHz */ #endif #ifdef USE_PLL # define FMCK_HZ ((FOSC * (PLL_MUL + 1)) / 2) #else # define FMCK_HZ FOSC #endif #define FCPU_HZ FMCK_HZ #define FHSB_HZ FCPU_HZ #define FPBB_HZ FMCK_HZ #define FPBA_HZ FMCK_HZ void init_sys_clocks(void); #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/flash_fw.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include "printf-stdarg.h" #include "wl_fw.h" #include "startup.h" #include "nor_flash.h" #include "gpio.h" #define GREEN_OFF() gpio_set_gpio_pin(LED0_GPIO) #define GREEN_ON() gpio_clr_gpio_pin(LED0_GPIO) #define GREEN_BLINK() gpio_tgl_gpio_pin(LED0_GPIO) #define RED_OFF() gpio_set_gpio_pin(LED1_GPIO) #define RED_ON() gpio_clr_gpio_pin(LED1_GPIO) #define RED_BLINK() gpio_tgl_gpio_pin(LED1_GPIO) #define BLUE_OFF() gpio_set_gpio_pin(LED2_GPIO) #define BLUE_ON() gpio_clr_gpio_pin(LED2_GPIO) #define BLUE_BLINK() gpio_tgl_gpio_pin(LED2_GPIO) /** * */ void led_init(void) { gpio_enable_gpio_pin(LED0_GPIO); gpio_enable_gpio_pin(LED1_GPIO); gpio_enable_gpio_pin(LED2_GPIO); GREEN_OFF(); RED_OFF(); BLUE_OFF(); } int main(void) { U32 pos, len; startup_init(); printk("*** HD chip firmware upgrade ver 2.7 ***\n"); led_init(); flash_init(); GREEN_ON(); if (at45dbx_mem_check() == OK) { printk("Memory check... [ OK ]\n"); } else { RED_ON(); GREEN_OFF(); printk("Memory check... [FAIL]\n"); return 0; } printk("Writing firmware data to flash\n"); pos = 0; while (pos < fw_len) { if (fw_len - pos > SECTOR_SIZE) len = SECTOR_SIZE; else len = fw_len - pos; flash_write(pos, fw_buf + pos, len); pos += len; } printk("Verifying firmware data\n"); pos = 0; while (pos < fw_len) { static U8 page_buf[SECTOR_SIZE]; U32 i; if (fw_len - pos > SECTOR_SIZE) len = SECTOR_SIZE; else len = fw_len - pos; flash_read(pos, page_buf, len); for (i = 0; i < len; i++) if (*(page_buf + i) != *(fw_buf + pos + i)) { RED_ON(); GREEN_OFF(); printk("Verify failed at byte %d, 0x%02x != 0x%02x\n", pos + i, *(page_buf + i), *(fw_buf + pos + i)); return 0; } pos += len; } GREEN_OFF(); BLUE_ON(); printk("Firmware successfully stored in flash!\n"); return 0; } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/license.txt ================================================ Copyright (C) 2009, H&D Wireless AB All rights reserved. The license to use this software in whole and in part and to redistribute it in any form follows with the WiFi HW module from H&D Wireless and is granted under the following restrictions: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of H&D Wireless AB may not be used to endorse or promote products derived from this software without specific prior written permission. 4. The software may only be used together with hardware from H&D Wireless all other use is prohibited. 5. The license to use and redistribute the software is granted together with the purchase of a hardware platform on a one to one basis 6. The binary code may not be reversed engineered or by other means copied to circumvent this license. THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL HD WIRELESS AB BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. For more information regarding this software license Contact H&D Wireless AB (support@hd-wireless.se). ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/nor_flash.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include "compiler.h" #include "preprocessor.h" #include "board.h" #include "power_clocks_lib.h" #include "gpio.h" #include "spi.h" #include "conf_at45dbx.h" #include "at45dbx.h" #include "clocks.h" void flash_init(void) { static const gpio_map_t AT45DBX_SPI_GPIO_MAP = { { AT45DBX_SPI_SCK_PIN, AT45DBX_SPI_SCK_FUNCTION }, { AT45DBX_SPI_MISO_PIN, AT45DBX_SPI_MISO_FUNCTION }, { AT45DBX_SPI_MOSI_PIN, AT45DBX_SPI_MOSI_FUNCTION }, { AT45DBX_SPI_NPCS2_PIN, AT45DBX_SPI_NPCS2_FUNCTION }, }; spi_options_t spiOptions = { .reg = AT45DBX_SPI_FIRST_NPCS, .baudrate = AT45DBX_SPI_MASTER_SPEED, .bits = AT45DBX_SPI_BITS, .spck_delay = 0, .trans_delay = 0, .stay_act = 1, .spi_mode = 0, .modfdis = 1 }; gpio_enable_module(AT45DBX_SPI_GPIO_MAP, sizeof(AT45DBX_SPI_GPIO_MAP) / sizeof(AT45DBX_SPI_GPIO_MAP[0])); spi_initMaster(AT45DBX_SPI, &spiOptions); spi_selectionMode(AT45DBX_SPI, 0, 0, 0); spi_enable(AT45DBX_SPI); /* put up flash reset pin */ gpio_set_gpio_pin(AT45DBX_CHIP_RESET); at45dbx_init(spiOptions, FPBA_HZ); } void flash_write(U32 addr, const U8* buf, U32 len) { U32 sector = addr / AT45DBX_SECTOR_SIZE; U32 i; Assert(addr % AT45DBX_SECTOR_SIZE == 0); at45dbx_write_open(sector); for (i = 0; i < len; i++) at45dbx_write_byte(buf[i]); at45dbx_write_close(); } void flash_read(U32 addr, U8* buf, U32 len) { U32 sector = addr / AT45DBX_SECTOR_SIZE; U32 i; Assert(addr % AT45DBX_SECTOR_SIZE == 0); at45dbx_read_open(sector); for (i = 0; i < len; i++) buf[i] = at45dbx_read_byte(); at45dbx_read_close(); } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/nor_flash.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef NOR_FLASH_H #define NOR_FLASH_H #include "at45dbx.h" #define SECTOR_SIZE AT45DBX_SECTOR_SIZE void flash_init(void); void flash_write(U32 addr, const U8* buf, U32 len); void flash_read(U32 addr, U8* buf, U32 len); #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/printf-stdarg.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /* This source file is part of the ATMEL AVR32-SoftwareFramework-AT32UC3A-1.4.0 Release */ /*This file has been prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief sprintf functions to replace newlib for AVR32 UC3. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * *****************************************************************************/ /* Copyright (C) 2006-2008, Atmel Corporation All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of ATMEL may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Copyright 2001, 2002 Georges Menie (www.menie.org) stdarg version contributed by Christian Ettinger This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* putchar is the only external dependency for this file, if you have a working putchar, leave it commented out. If not, uncomment the define below and replace outbyte(c) by your own function call. */ #include #include #define putchar(c) print_dbg_char(c) static void printchar(char **str, int c) { extern int putchar(int c); if (str) { **str = c; ++(*str); } else (void)putchar(c); } #define PAD_RIGHT 1 #define PAD_ZERO 2 static int prints(char **out, const char *string, int width, int pad) { register int pc = 0, padchar = ' '; if (width > 0) { register int len = 0; register const char *ptr; for (ptr = string; *ptr; ++ptr) ++len; if (len >= width) width = 0; else width -= len; if (pad & PAD_ZERO) padchar = '0'; } if (!(pad & PAD_RIGHT)) { for ( ; width > 0; --width) { printchar (out, padchar); ++pc; } } for ( ; *string ; ++string) { printchar (out, *string); ++pc; } for ( ; width > 0; --width) { printchar (out, padchar); ++pc; } return pc; } /* the following should be enough for 32 bit int */ #define PRINT_BUF_LEN 12 static int printi(char **out, int i, int b, int sg, int width, int pad, int letbase) { char print_buf[PRINT_BUF_LEN]; register char *s; register int t, neg = 0, pc = 0; register unsigned int u = i; if (i == 0) { print_buf[0] = '0'; print_buf[1] = '\0'; return prints (out, print_buf, width, pad); } if (sg && b == 10 && i < 0) { neg = 1; u = -i; } s = print_buf + PRINT_BUF_LEN-1; *s = '\0'; while (u) { t = u % b; if( t >= 10 ) t += letbase - '0' - 10; *--s = t + '0'; u /= b; } if (neg) { if( width && (pad & PAD_ZERO) ) { printchar (out, '-'); ++pc; --width; } else { *--s = '-'; } } return pc + prints (out, s, width, pad); } int fprintf(__FILE *stream, const char *format, ...) { return 0; } int printk_va(char **out, const char *format, va_list args ) { register int width, pad; register int pc = 0; char scr[2]; for (; *format != 0; ++format) { if (*format == '%') { ++format; width = pad = 0; if (*format == '\0') break; if (*format == '%') goto out; if (*format == '-') { ++format; pad = PAD_RIGHT; } while (*format == '0') { ++format; pad |= PAD_ZERO; } for ( ; *format >= '0' && *format <= '9'; ++format) { width *= 10; width += *format - '0'; } if( *format == 's' ) { register char *s = (char *)va_arg( args, int ); pc += prints (out, s?s:"(null)", width, pad); continue; } if( *format == 'd' ) { pc += printi (out, va_arg( args, int ), 10, 1, width, pad, 'a'); continue; } if( *format == 'p' ) { pad = 8; pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'a'); continue; } if( *format == 'x' ) { pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'a'); continue; } if( *format == 'X' ) { pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'A'); continue; } if( *format == 'u' ) { pc += printi (out, va_arg( args, int ), 10, 0, width, pad, 'a'); continue; } if( *format == 'c' ) { /* char are converted to int then pushed on the stack */ scr[0] = (char)va_arg( args, int ); scr[1] = '\0'; pc += prints (out, scr, width, pad); continue; } } else { out: printchar (out, *format); ++pc; } } if (out) **out = '\0'; va_end( args ); return pc; } int printk(const char *format, ...) { va_list args; va_start( args, format ); return printk_va( 0, format, args ); } int sprintf(char *out, const char *format, ...) { va_list args; va_start( args, format ); return printk_va( &out, format, args ); } #ifdef TEST_PRINTF int main(void) { char *ptr = "Hello world!"; char *np = 0; int i = 5; unsigned int bs = sizeof(int)*8; int mi; char buf[80]; mi = (1 << (bs-1)) + 1; printf("%s\n", ptr); printf("printf test\n"); printf("%s is null pointer\n", np); printf("%d = 5\n", i); printf("%d = - max int\n", mi); printf("char %c = 'a'\n", 'a'); printf("hex %x = ff\n", 0xff); printf("hex %02x = 00\n", 0); printf("signed %d = unsigned %u = hex %x\n", -3, -3, -3); printf("%d %s(s)%", 0, "message"); printf("\n"); printf("%d %s(s) with %%\n", 0, "message"); sprintf(buf, "justif: \"%-10s\"\n", "left"); printf("%s", buf); sprintf(buf, "justif: \"%10s\"\n", "right"); printf("%s", buf); sprintf(buf, " 3: %04d zero padded\n", 3); printf("%s", buf); sprintf(buf, " 3: %-4d left justif.\n", 3); printf("%s", buf); sprintf(buf, " 3: %4d right justif.\n", 3); printf("%s", buf); sprintf(buf, "-3: %04d zero padded\n", -3); printf("%s", buf); sprintf(buf, "-3: %-4d left justif.\n", -3); printf("%s", buf); sprintf(buf, "-3: %4d right justif.\n", -3); printf("%s", buf); return 0; } /* * if you compile this file with * gcc -Wall $(YOUR_C_OPTIONS) -DTEST_PRINTF -c printf.c * you will get a normal warning: * printf.c:214: warning: spurious trailing `%' in format * this line is testing an invalid % at the end of the format string. * * this should display (on 32bit int machine) : * * Hello world! * printf test * (null) is null pointer * 5 = 5 * -2147483647 = - max int * char a = 'a' * hex ff = ff * hex 00 = 00 * signed -3 = unsigned 4294967293 = hex fffffffd * 0 message(s) * 0 message(s) with % * justif: "left " * justif: " right" * 3: 0003 zero padded * 3: 3 left justif. * 3: 3 right justif. * -3: -003 zero padded * -3: -3 left justif. * -3: -3 right justif. */ #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/printf-stdarg.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef PRINTF_STDARG_H #define PRINTF_STDARG_H #include int printk(const char *format, ...); int printk_va(char **out, const char *format, va_list args ); #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/startup.c ================================================ /* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "startup.h" #include "pm.h" #include "intc.h" #include "board.h" #include "print_funcs.h" #include "clocks.h" static void init_exceptions(void) { extern void _evba; Set_system_register(AVR32_EVBA, (int)&_evba); Enable_global_exception(); } static void init_hmatrix(void) { union { unsigned long scfg; avr32_hmatrix_scfg_t SCFG; } u_avr32_hmatrix_scfg = { AVR32_HMATRIX.scfg[AVR32_HMATRIX_SLAVE_FLASH] }; u_avr32_hmatrix_scfg.SCFG.defmstr_type = AVR32_HMATRIX_DEFMSTR_TYPE_LAST_DEFAULT; AVR32_HMATRIX.scfg[AVR32_HMATRIX_SLAVE_FLASH] = u_avr32_hmatrix_scfg.scfg; } static void init_interrupts(void) { INTC_init_interrupts(); //initExtInt(); Enable_global_interrupt(); } void startup_init(void) { init_exceptions(); init_hmatrix(); init_sys_clocks(); init_interrupts(); init_dbg_rs232(FPBA_HZ); } ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/startup.h ================================================ /* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ /*! \page License * Copyright (C) 2009, H&D Wireless AB All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef STARTUP_H #define STARTUP_H void startup_init(void); #endif ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/src/wl_fw.h ================================================ /* * Programming interface for wl_api. * Copyright (C) 2010 HD Wireless AB * * You should have received a copy of the license along with this library. */ #ifndef WITHOUT_STDINT #include #endif const uint8_t fw_buf[154188] = { 0x10, 0x61, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x10, 0x61, 0x04, 0x00, 0x38, 0x61, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x61, 0x04, 0x00, 0x30, 0x61, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x30, 0x61, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x61, 0x04, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0xee, 0xee, 0xee, 0x18, 0xf0, 0x9f, 0xe5, 0x18, 0xf0, 0x9f, 0xe5, 0x18, 0xf0, 0x9f, 0xe5, 0x18, 0xf0, 0x9f, 0xe5, 0x00, 0x00, 0xa0, 0xe1, 0x18, 0xf0, 0x9f, 0xe5, 0x18, 0xf0, 0x9f, 0xe5, 0x44, 0x00, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x08, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe1, 0x1f, 0x00, 0xc0, 0xe3, 0x13, 0x00, 0x80, 0xe3, 0xc0, 0x00, 0x80, 0xe3, 0x00, 0xf0, 0x2f, 0xe1, 0x1c, 0xf0, 0x9f, 0xe5, 0x3d, 0x02, 0x00, 0xeb, 0x5a, 0x02, 0x00, 0xeb, 0x8d, 0x02, 0x00, 0xeb, 0x01, 0x00, 0x8f, 0xe2, 0x10, 0xff, 0x2f, 0xe1, 0x41, 0xf0, 0xde, 0xfb, 0x01, 0xf0, 0xdc, 0xfd, 0x3c, 0x00, 0x78, 0x00, 0x00, 0x00, 0xfe, 0xe7, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x78, 0x47, 0xc0, 0x46, 0x01, 0x00, 0x00, 0xea, 0x78, 0x47, 0xc0, 0x46, 0x17, 0x00, 0x00, 0xea, 0x8c, 0x11, 0x9f, 0xe5, 0x00, 0x20, 0x91, 0xe5, 0x00, 0x30, 0x0f, 0xe1, 0x84, 0x11, 0x9f, 0xe5, 0xfd, 0x20, 0xa1, 0xe8, 0x80, 0x01, 0x9f, 0xe5, 0x80, 0x21, 0x9f, 0xe5, 0x01, 0x20, 0x42, 0xe0, 0x0d, 0x00, 0x40, 0xe0, 0x3c, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x02, 0x00, 0x50, 0xe1, 0x28, 0x00, 0x00, 0xaa, 0x68, 0x01, 0x9f, 0xe5, 0x0d, 0x00, 0x50, 0xe1, 0x02, 0x00, 0x00, 0xba, 0x04, 0x20, 0x10, 0xe4, 0x04, 0x20, 0x81, 0xe4, 0xfa, 0xff, 0xff, 0xea, 0x58, 0x11, 0x9f, 0xe5, 0x58, 0x01, 0x9f, 0xe5, 0x00, 0x00, 0x81, 0xe5, 0x3c, 0x11, 0x9f, 0xe5, 0x50, 0x01, 0x9f, 0xe5, 0x00, 0x00, 0x81, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, 0x3c, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x48, 0x11, 0x9f, 0xe5, 0x00, 0x00, 0x91, 0xe5, 0x24, 0x11, 0x9f, 0xe5, 0x00, 0x00, 0x81, 0xe5, 0x2c, 0x11, 0x9f, 0xe5, 0x38, 0x01, 0x9f, 0xe5, 0x00, 0x00, 0x81, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, 0x74, 0x02, 0x00, 0xeb, 0x10, 0x01, 0x9f, 0xe5, 0x28, 0x11, 0x9f, 0xe5, 0x04, 0x20, 0x91, 0xe4, 0x04, 0x20, 0x00, 0xe4, 0x04, 0x21, 0x9f, 0xe5, 0x02, 0x00, 0x51, 0xe1, 0x3c, 0x00, 0x2c, 0x01, 0x00, 0x00, 0xfa, 0xff, 0xff, 0x1a, 0xf0, 0x10, 0x9f, 0xe5, 0xfd, 0x20, 0xb1, 0xe8, 0x03, 0xf0, 0x2f, 0xe1, 0xe0, 0x10, 0x9f, 0xe5, 0x00, 0x20, 0x81, 0xe5, 0xe8, 0x10, 0x9f, 0xe5, 0xf4, 0x20, 0x9f, 0xe5, 0x00, 0x20, 0x81, 0xe5, 0x02, 0x10, 0x80, 0xe2, 0x00, 0x00, 0x20, 0xe0, 0x01, 0x00, 0x40, 0xe2, 0x11, 0xff, 0x2f, 0xe1, 0x01, 0x00, 0x8f, 0xe2, 0x10, 0xff, 0x2f, 0xe1, 0x3c, 0x00, 0x68, 0x01, 0x00, 0x00, 0x01, 0xf0, 0x9c, 0xf8, 0x78, 0x47, 0x00, 0x00, 0x01, 0x00, 0x8f, 0xe2, 0x10, 0xff, 0x2f, 0xe1, 0x01, 0xf0, 0x94, 0xf8, 0x78, 0x47, 0x00, 0x00, 0x03, 0x00, 0x2d, 0xe9, 0x00, 0x10, 0x0f, 0xe1, 0x00, 0x10, 0x80, 0xe5, 0xb8, 0x10, 0x9f, 0xe5, 0x04, 0x10, 0x80, 0xe5, 0x00, 0x10, 0xa0, 0xe1, 0x10, 0x00, 0x80, 0xe2, 0xfc, 0x1f, 0xa0, 0xe8, 0x00, 0x20, 0xa0, 0xe1, 0x3c, 0x00, 0xa4, 0x01, 0x00, 0x00, 0x01, 0x30, 0xa0, 0xe1, 0x03, 0x00, 0xbd, 0xe8, 0x08, 0x00, 0x83, 0xe5, 0x0c, 0x10, 0x83, 0xe5, 0xd3, 0x00, 0xa0, 0xe3, 0x00, 0xf0, 0x21, 0xe1, 0x00, 0x60, 0xa2, 0xe8, 0x00, 0x10, 0x4f, 0xe1, 0x04, 0x10, 0x82, 0xe4, 0xd2, 0x00, 0xa0, 0xe3, 0x00, 0xf0, 0x21, 0xe1, 0x00, 0x60, 0xa2, 0xe8, 0x00, 0x10, 0x4f, 0xe1, 0x04, 0x10, 0x82, 0xe4, 0xd1, 0x00, 0xa0, 0xe3, 0x3c, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0xf0, 0x21, 0xe1, 0x00, 0x7f, 0xa2, 0xe8, 0x00, 0x10, 0x4f, 0xe1, 0x04, 0x10, 0x82, 0xe4, 0xd7, 0x00, 0xa0, 0xe3, 0x00, 0xf0, 0x21, 0xe1, 0x00, 0x60, 0xa2, 0xe8, 0x00, 0x10, 0x4f, 0xe1, 0x04, 0x10, 0x82, 0xe4, 0xdb, 0x00, 0xa0, 0xe3, 0x00, 0xf0, 0x21, 0xe1, 0x00, 0x60, 0xa2, 0xe8, 0x00, 0x10, 0x4f, 0xe1, 0x00, 0x10, 0x82, 0xe5, 0x00, 0x00, 0x93, 0xe5, 0x3c, 0x00, 0x1c, 0x02, 0x00, 0x00, 0x00, 0xf0, 0x2f, 0xe1, 0x1e, 0xff, 0x2f, 0xe1, 0x20, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0x20, 0xee, 0x01, 0x00, 0xd8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf0, 0x9f, 0xe5, 0x10, 0x01, 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, 0xee, 0xee, 0xee, 0xee, 0x24, 0x03, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x63, 0x1c, 0x0b, 0x4d, 0x3c, 0x00, 0x58, 0x02, 0x00, 0x00, 0x01, 0xd1, 0x6c, 0x69, 0x10, 0xe0, 0x00, 0xf0, 0x6c, 0xfb, 0x09, 0x48, 0xff, 0xf7, 0x0c, 0xff, 0xec, 0x60, 0x08, 0x4a, 0x51, 0x68, 0x50, 0x68, 0x88, 0x42, 0xfc, 0xd0, 0x02, 0x20, 0x28, 0x70, 0x01, 0x21, 0x8a, 0x20, 0x01, 0xf0, 0x12, 0xf8, 0x20, 0x1c, 0xb0, 0xbd, 0x30, 0x00, 0x07, 0x00, 0x51, 0x02, 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, 0xb0, 0xb5, 0x05, 0x1c, 0x3c, 0x00, 0x94, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0xf0, 0x50, 0xfb, 0x14, 0x48, 0xff, 0xf7, 0xf0, 0xfe, 0x13, 0x49, 0x14, 0x48, 0xc1, 0x60, 0x01, 0x21, 0x13, 0x4a, 0x49, 0x03, 0x91, 0x60, 0x13, 0x49, 0xca, 0x78, 0x08, 0x23, 0x9a, 0x43, 0xca, 0x70, 0xca, 0x78, 0x04, 0x23, 0x1a, 0x43, 0xca, 0x70, 0x6b, 0x1c, 0x0d, 0xd0, 0x0e, 0x4b, 0x5a, 0x68, 0x59, 0x68, 0x91, 0x42, 0xfc, 0xd0, 0xbe, 0x21, 0x3c, 0x00, 0xd0, 0x02, 0x00, 0x00, 0x19, 0x73, 0x19, 0x7a, 0x11, 0x22, 0x91, 0x43, 0x19, 0x72, 0x19, 0x7a, 0xc9, 0x07, 0xfc, 0xd4, 0x02, 0x21, 0x01, 0x70, 0xff, 0xf7, 0xd0, 0xfe, 0x20, 0x1c, 0xb0, 0xbd, 0x91, 0x02, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x30, 0x00, 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x84, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x08, 0x47, 0x10, 0x47, 0x18, 0x47, 0x20, 0x47, 0x28, 0x47, 0x30, 0x47, 0x38, 0x47, 0x10, 0xb5, 0x04, 0x1c, 0x10, 0x1c, 0x00, 0xf0, 0x23, 0xf9, 0x03, 0xc4, 0x10, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x3c, 0x00, 0xfc, 0x03, 0x00, 0x00, 0x10, 0xb4, 0x04, 0x2a, 0x0e, 0xd3, 0x03, 0x1c, 0x0b, 0x43, 0x9b, 0x07, 0x0a, 0xd1, 0x08, 0xc8, 0x10, 0xc9, 0xa3, 0x42, 0x02, 0xd1, 0x04, 0x3a, 0x04, 0x2a, 0xf8, 0xd2, 0xa3, 0x42, 0x01, 0xd0, 0x04, 0x38, 0x04, 0x39, 0x00, 0x2a, 0x02, 0xd1, 0x00, 0x20, 0x10, 0xbc, 0x70, 0x47, 0xd3, 0x07, 0x01, 0xd5, 0x01, 0x32, 0x05, 0xe0, 0x03, 0x78, 0x0c, 0x78, 0x01, 0x31, 0x3c, 0x00, 0x38, 0x04, 0x00, 0x00, 0x01, 0x30, 0xa3, 0x42, 0x07, 0xd1, 0x03, 0x78, 0x0c, 0x78, 0x01, 0x31, 0x01, 0x30, 0xa3, 0x42, 0x01, 0xd1, 0x02, 0x3a, 0xf1, 0xd1, 0x18, 0x1b, 0xe9, 0xe7, 0x00, 0x00, 0x78, 0x47, 0x00, 0x00, 0x00, 0x20, 0xa0, 0xe3, 0x04, 0x00, 0x51, 0xe3, 0x08, 0x00, 0x00, 0x3a, 0x03, 0xc0, 0x10, 0xe2, 0x0d, 0x00, 0x00, 0x0a, 0x04, 0xc0, 0x6c, 0xe2, 0x02, 0x00, 0x5c, 0xe3, 0x3c, 0x00, 0x74, 0x04, 0x00, 0x00, 0x01, 0x20, 0xc0, 0xe4, 0x01, 0x20, 0xc0, 0xa4, 0x01, 0x20, 0xc0, 0xc4, 0x0c, 0x10, 0x41, 0xe0, 0x06, 0x00, 0x00, 0xea, 0x81, 0xcf, 0xb0, 0xe1, 0x01, 0x20, 0xc0, 0x24, 0x01, 0x20, 0xc0, 0x24, 0x01, 0x20, 0xc0, 0x44, 0x1e, 0xff, 0x2f, 0xe1, 0x78, 0x47, 0x00, 0x00, 0x00, 0x20, 0xa0, 0xe3, 0x00, 0x40, 0x2d, 0xe9, 0x02, 0x30, 0xa0, 0xe1, 0x02, 0xc0, 0xa0, 0xe1, 0x3c, 0x00, 0xb0, 0x04, 0x00, 0x00, 0x02, 0xe0, 0xa0, 0xe1, 0x20, 0x10, 0x51, 0xe2, 0x0c, 0x50, 0xa0, 0x28, 0x0c, 0x50, 0xa0, 0x28, 0x20, 0x10, 0x51, 0x22, 0xfb, 0xff, 0xff, 0x2a, 0x01, 0x1e, 0xb0, 0xe1, 0x0c, 0x50, 0xa0, 0x28, 0x0c, 0x00, 0xa0, 0x48, 0x00, 0x40, 0xbd, 0xe8, 0x01, 0x11, 0xb0, 0xe1, 0x04, 0x20, 0x80, 0x24, 0x1e, 0xff, 0x2f, 0x01, 0x01, 0x20, 0xc0, 0x44, 0x01, 0x20, 0xc0, 0x44, 0x3c, 0x00, 0xec, 0x04, 0x00, 0x00, 0x40, 0x04, 0x11, 0xe3, 0x01, 0x20, 0xc0, 0x14, 0x1e, 0xff, 0x2f, 0xe1, 0x78, 0x47, 0x00, 0x00, 0x03, 0x00, 0x52, 0xe3, 0x3e, 0x00, 0x00, 0x9a, 0x03, 0xc0, 0x10, 0xe2, 0x08, 0x00, 0x00, 0x0a, 0x01, 0x30, 0xd1, 0xe4, 0x02, 0x00, 0x5c, 0xe3, 0x0c, 0x20, 0x82, 0xe0, 0x01, 0xc0, 0xd1, 0x94, 0x01, 0x30, 0xc0, 0xe4, 0x01, 0x30, 0xd1, 0x34, 0x04, 0x20, 0x42, 0xe2, 0x3c, 0x00, 0x28, 0x05, 0x00, 0x00, 0x01, 0xc0, 0xc0, 0x94, 0x01, 0x30, 0xc0, 0x34, 0x03, 0x30, 0x11, 0xe2, 0x1e, 0x00, 0x00, 0x0a, 0x04, 0x20, 0x52, 0xe2, 0x2f, 0x00, 0x00, 0x3a, 0x03, 0xc0, 0x31, 0xe7, 0x02, 0x00, 0x53, 0xe3, 0x08, 0x00, 0x00, 0x0a, 0x0f, 0x00, 0x00, 0x8a, 0x2c, 0x34, 0xa0, 0xe1, 0x04, 0xc0, 0xb1, 0xe5, 0x04, 0x20, 0x52, 0xe2, 0x0c, 0x3c, 0x83, 0xe1, 0x04, 0x30, 0x80, 0xe4, 0x3c, 0x00, 0x64, 0x05, 0x00, 0x00, 0xf9, 0xff, 0xff, 0x2a, 0x01, 0x10, 0x81, 0xe2, 0x23, 0x00, 0x00, 0xea, 0x2c, 0x38, 0xa0, 0xe1, 0x04, 0xc0, 0xb1, 0xe5, 0x04, 0x20, 0x52, 0xe2, 0x0c, 0x38, 0x83, 0xe1, 0x04, 0x30, 0x80, 0xe4, 0xf9, 0xff, 0xff, 0x2a, 0x02, 0x10, 0x81, 0xe2, 0x1b, 0x00, 0x00, 0xea, 0x2c, 0x3c, 0xa0, 0xe1, 0x04, 0xc0, 0xb1, 0xe5, 0x04, 0x20, 0x52, 0xe2, 0x0c, 0x34, 0x83, 0xe1, 0x3c, 0x00, 0xa0, 0x05, 0x00, 0x00, 0x04, 0x30, 0x80, 0xe4, 0xf9, 0xff, 0xff, 0x2a, 0x03, 0x10, 0x81, 0xe2, 0x13, 0x00, 0x00, 0xea, 0x78, 0x47, 0x00, 0x00, 0x10, 0x40, 0x2d, 0xe9, 0x20, 0x20, 0x52, 0xe2, 0x05, 0x00, 0x00, 0x3a, 0x18, 0x50, 0xb1, 0x28, 0x18, 0x50, 0xa0, 0x28, 0x18, 0x50, 0xb1, 0x28, 0x18, 0x50, 0xa0, 0x28, 0x20, 0x20, 0x52, 0x22, 0xf9, 0xff, 0xff, 0x2a, 0x02, 0xce, 0xb0, 0xe1, 0x3c, 0x00, 0xdc, 0x05, 0x00, 0x00, 0x18, 0x50, 0xb1, 0x28, 0x18, 0x50, 0xa0, 0x28, 0x18, 0x00, 0xb1, 0x48, 0x18, 0x00, 0xa0, 0x48, 0x10, 0x40, 0xbd, 0xe8, 0x02, 0xcf, 0xb0, 0xe1, 0x04, 0x30, 0x91, 0x24, 0x04, 0x30, 0x80, 0x24, 0x1e, 0xff, 0x2f, 0x01, 0x82, 0x2f, 0xb0, 0xe1, 0x01, 0x20, 0xd1, 0x44, 0x01, 0x30, 0xd1, 0x24, 0x01, 0xc0, 0xd1, 0x24, 0x01, 0x20, 0xc0, 0x44, 0x01, 0x30, 0xc0, 0x24, 0x3c, 0x00, 0x18, 0x06, 0x00, 0x00, 0x01, 0xc0, 0xc0, 0x24, 0x1e, 0xff, 0x2f, 0xe1, 0x78, 0x47, 0x00, 0x00, 0xff, 0x30, 0x01, 0xe2, 0x02, 0x10, 0xa0, 0xe1, 0x03, 0x24, 0x83, 0xe1, 0x02, 0x28, 0x82, 0xe1, 0x88, 0xff, 0xff, 0xea, 0x78, 0x47, 0x00, 0x00, 0x80, 0x24, 0x10, 0xe2, 0x00, 0x00, 0x60, 0x42, 0x41, 0x30, 0x32, 0xe0, 0x00, 0x10, 0x61, 0x22, 0xa1, 0xc1, 0x70, 0xe0, 0x20, 0x00, 0x00, 0x3a, 0x3c, 0x00, 0x54, 0x06, 0x00, 0x00, 0x21, 0xc4, 0x70, 0xe0, 0x0f, 0x00, 0x00, 0x3a, 0x00, 0x04, 0xa0, 0xe1, 0xff, 0x24, 0x82, 0xe3, 0x21, 0xc2, 0x70, 0xe0, 0x17, 0x00, 0x00, 0x3a, 0x21, 0xc4, 0x70, 0xe0, 0x09, 0x00, 0x00, 0x3a, 0x00, 0x04, 0xa0, 0xe1, 0xff, 0x28, 0x82, 0xe3, 0x21, 0xc4, 0x70, 0xe0, 0x00, 0x04, 0xa0, 0x21, 0xff, 0x2c, 0x82, 0x23, 0x21, 0xc2, 0x70, 0xe0, 0x0e, 0x00, 0x00, 0x3a, 0x3c, 0x00, 0x90, 0x06, 0x00, 0x00, 0x00, 0xc0, 0x70, 0xe2, 0x83, 0x00, 0x00, 0x2a, 0x20, 0x04, 0xa0, 0x21, 0xa1, 0xc3, 0x70, 0xe0, 0x80, 0x13, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x21, 0xc3, 0x70, 0xe0, 0x00, 0x13, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0xa1, 0xc2, 0x70, 0xe0, 0x80, 0x12, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x21, 0xc2, 0x70, 0xe0, 0x00, 0x12, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x3c, 0x00, 0xcc, 0x06, 0x00, 0x00, 0xa1, 0xc1, 0x70, 0xe0, 0x80, 0x11, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x21, 0xc1, 0x70, 0xe0, 0x00, 0x11, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0xa1, 0xc0, 0x70, 0xe0, 0x80, 0x10, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x01, 0xc0, 0x70, 0xe0, 0x00, 0x10, 0x41, 0x20, 0x02, 0x20, 0xb2, 0xe0, 0xe5, 0xff, 0xff, 0x2a, 0xc3, 0x0f, 0x32, 0xe0, 0xa3, 0x0f, 0x80, 0xe0, 0x3c, 0x00, 0x08, 0x07, 0x00, 0x00, 0x00, 0x10, 0x61, 0x22, 0x1e, 0xff, 0x2f, 0xe1, 0x78, 0x47, 0x00, 0x00, 0x00, 0x20, 0xa0, 0xe3, 0xa1, 0xc1, 0x70, 0xe0, 0x20, 0x00, 0x00, 0x3a, 0x21, 0xc4, 0x70, 0xe0, 0x0f, 0x00, 0x00, 0x3a, 0x00, 0x04, 0xa0, 0xe1, 0xff, 0x24, 0x82, 0xe3, 0x21, 0xc2, 0x70, 0xe0, 0x17, 0x00, 0x00, 0x3a, 0x21, 0xc4, 0x70, 0xe0, 0x09, 0x00, 0x00, 0x3a, 0x00, 0x04, 0xa0, 0xe1, 0x3c, 0x00, 0x44, 0x07, 0x00, 0x00, 0xff, 0x28, 0x82, 0xe3, 0x21, 0xc4, 0x70, 0xe0, 0x00, 0x04, 0xa0, 0x21, 0xff, 0x2c, 0x82, 0x23, 0x21, 0xc2, 0x70, 0xe0, 0x0e, 0x00, 0x00, 0x3a, 0x00, 0xc0, 0x70, 0xe2, 0x50, 0x00, 0x00, 0x2a, 0x20, 0x04, 0xa0, 0x21, 0xa1, 0xc3, 0x70, 0xe0, 0x80, 0x13, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x21, 0xc3, 0x70, 0xe0, 0x00, 0x13, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x3c, 0x00, 0x80, 0x07, 0x00, 0x00, 0xa1, 0xc2, 0x70, 0xe0, 0x80, 0x12, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x21, 0xc2, 0x70, 0xe0, 0x00, 0x12, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0xa1, 0xc1, 0x70, 0xe0, 0x80, 0x11, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x21, 0xc1, 0x70, 0xe0, 0x00, 0x11, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0xa1, 0xc0, 0x70, 0xe0, 0x80, 0x10, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x3c, 0x00, 0xbc, 0x07, 0x00, 0x00, 0x01, 0xc0, 0x70, 0xe0, 0x00, 0x10, 0x41, 0x20, 0x02, 0x20, 0xb2, 0xe0, 0xe5, 0xff, 0xff, 0x2a, 0x02, 0x00, 0xa0, 0xe1, 0x1e, 0xff, 0x2f, 0xe1, 0x78, 0x47, 0x00, 0x00, 0x0a, 0x10, 0x40, 0xe2, 0x20, 0x01, 0x40, 0xe0, 0x20, 0x02, 0x80, 0xe0, 0x20, 0x04, 0x80, 0xe0, 0x20, 0x08, 0x80, 0xe0, 0xa0, 0x01, 0xa0, 0xe1, 0x00, 0x21, 0x80, 0xe0, 0x82, 0x10, 0x51, 0xe0, 0x3c, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x01, 0x00, 0x80, 0x52, 0x0a, 0x10, 0x81, 0x42, 0x1e, 0xff, 0x2f, 0xe1, 0x30, 0xb4, 0x44, 0x1c, 0x81, 0x07, 0x08, 0xd0, 0x01, 0x78, 0x01, 0x30, 0x00, 0x29, 0x02, 0xd1, 0x00, 0x1b, 0x30, 0xbc, 0x70, 0x47, 0x81, 0x07, 0xf6, 0xd1, 0x0b, 0x4a, 0xd5, 0x01, 0x02, 0xc8, 0x8b, 0x1a, 0x8b, 0x43, 0x2b, 0x40, 0xfa, 0xd0, 0x00, 0x1b, 0x0a, 0x06, 0x01, 0xd1, 0x03, 0x38, 0x3c, 0x00, 0x34, 0x08, 0x00, 0x00, 0xef, 0xe7, 0x0a, 0x04, 0x12, 0x0e, 0x01, 0xd1, 0x02, 0x38, 0xea, 0xe7, 0x09, 0x02, 0x09, 0x0e, 0xe7, 0xd1, 0x01, 0x38, 0xe5, 0xe7, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0xf0, 0xb4, 0x03, 0x1c, 0x04, 0x1c, 0x0c, 0x43, 0xa4, 0x07, 0x0c, 0xd1, 0x10, 0x4d, 0xef, 0x01, 0x02, 0xe0, 0x04, 0x31, 0x04, 0x3a, 0x10, 0xc3, 0x04, 0x2a, 0x04, 0xd3, 0x0c, 0x68, 0x66, 0x1b, 0x3c, 0x00, 0x70, 0x08, 0x00, 0x00, 0xa6, 0x43, 0x3e, 0x40, 0xf5, 0xd0, 0x00, 0x2a, 0x07, 0xd0, 0x0c, 0x78, 0x01, 0x31, 0x1c, 0x70, 0x01, 0x33, 0x00, 0x2c, 0x03, 0xd0, 0x01, 0x3a, 0xf7, 0xd1, 0xf0, 0xbc, 0x70, 0x47, 0x01, 0x2a, 0xfb, 0xd9, 0x51, 0x1e, 0x00, 0x22, 0x1a, 0x70, 0x01, 0x33, 0x01, 0x39, 0xfb, 0xd1, 0xf4, 0xe7, 0x01, 0x01, 0x01, 0x01, 0x78, 0x47, 0x00, 0x00, 0x02, 0x00, 0xa0, 0xe3, 0x3c, 0x00, 0xac, 0x08, 0x00, 0x00, 0x02, 0x10, 0xa0, 0xe3, 0x2e, 0xfe, 0xff, 0xea, 0x1f, 0x40, 0x2d, 0xe9, 0x00, 0x00, 0x0f, 0xe1, 0xc0, 0x00, 0x80, 0xe3, 0x00, 0xf0, 0x2f, 0xe1, 0x81, 0x00, 0xa0, 0xe3, 0x02, 0x10, 0xa0, 0xe3, 0x01, 0x20, 0x8f, 0xe2, 0x12, 0xff, 0x2f, 0xe1, 0x00, 0xf0, 0xe6, 0xfc, 0x78, 0x47, 0x00, 0x00, 0x1f, 0x40, 0xbd, 0xe8, 0xfe, 0xff, 0xff, 0xea, 0x1f, 0x50, 0x2d, 0xe9, 0x3c, 0x00, 0xe8, 0x08, 0x00, 0x00, 0x01, 0x00, 0x8f, 0xe2, 0x10, 0xff, 0x2f, 0xe1, 0x00, 0xf0, 0x40, 0xfb, 0x78, 0x47, 0x00, 0x00, 0x1f, 0x50, 0xbd, 0xe8, 0x04, 0xf0, 0x5e, 0xe2, 0x1f, 0x50, 0x2d, 0xe9, 0x01, 0x00, 0x8f, 0xe2, 0x10, 0xff, 0x2f, 0xe1, 0x00, 0xf0, 0x18, 0xfb, 0x78, 0x47, 0x00, 0x00, 0x1f, 0x50, 0xbd, 0xe8, 0x04, 0xf0, 0x5e, 0xe2, 0x00, 0xbd, 0x01, 0xb5, 0x00, 0xa0, 0x00, 0x47, 0x3c, 0x00, 0x24, 0x09, 0x00, 0x00, 0x00, 0x30, 0x0f, 0xe1, 0xc0, 0x30, 0xc3, 0xe3, 0x03, 0xf0, 0x21, 0xe1, 0x01, 0x00, 0x8f, 0xe2, 0x10, 0xff, 0x2f, 0xe1, 0x01, 0xbd, 0x01, 0xb5, 0x00, 0xa0, 0x00, 0x47, 0x00, 0x30, 0x0f, 0xe1, 0xc0, 0x30, 0x83, 0xe3, 0x03, 0xf0, 0x21, 0xe1, 0x01, 0x00, 0x8f, 0xe2, 0x10, 0xff, 0x2f, 0xe1, 0x01, 0xbd, 0x00, 0x00, 0x18, 0x00, 0x9f, 0xe5, 0x04, 0x10, 0x90, 0xe4, 0x3c, 0x00, 0x60, 0x09, 0x00, 0x00, 0x00, 0x00, 0x51, 0xe3, 0x02, 0x00, 0x00, 0x0a, 0x04, 0x20, 0x90, 0xe4, 0x00, 0x20, 0x81, 0xe5, 0xf9, 0xff, 0xff, 0xea, 0x0e, 0xf0, 0xa0, 0xe1, 0x7c, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0xd8, 0x03, 0x00, 0x00, 0xd8, 0x03, 0x00, 0x00, 0xd8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x09, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x10, 0x8e, 0x01, 0x00, 0x10, 0x8e, 0x01, 0x00, 0x88, 0xf8, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0xc4, 0x33, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x50, 0xa0, 0xe1, 0x58, 0x40, 0x9f, 0xe5, 0x3c, 0x00, 0xd8, 0x09, 0x00, 0x00, 0x04, 0x00, 0x94, 0xe4, 0x01, 0x00, 0x50, 0xe3, 0x05, 0xf0, 0xa0, 0x01, 0x04, 0x10, 0x94, 0xe4, 0x04, 0x20, 0x94, 0xe4, 0x03, 0x00, 0x00, 0xeb, 0x04, 0x00, 0x94, 0xe4, 0x04, 0x10, 0x94, 0xe4, 0x07, 0x00, 0x00, 0xeb, 0xf5, 0xff, 0xff, 0xea, 0x01, 0x00, 0x50, 0xe1, 0x0e, 0xf0, 0xa0, 0x01, 0x02, 0x00, 0x51, 0xe1, 0x04, 0x30, 0x90, 0x14, 0x04, 0x30, 0x81, 0x14, 0x3c, 0x00, 0x14, 0x0a, 0x00, 0x00, 0xfb, 0xff, 0xff, 0x1a, 0x0e, 0xf0, 0xa0, 0xe1, 0x14, 0x20, 0x9f, 0xe5, 0x00, 0x20, 0x92, 0xe5, 0x01, 0x00, 0x50, 0xe1, 0x04, 0x20, 0x80, 0x14, 0xfc, 0xff, 0xff, 0x1a, 0x0e, 0xf0, 0xa0, 0xe1, 0x80, 0x09, 0x00, 0x00, 0xcc, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0xe6, 0x01, 0x00, 0x13, 0x00, 0x00, 0x00, 0x53, 0x56, 0x43, 0x5f, 0x00, 0x04, 0x00, 0x00, 0x3c, 0x00, 0x50, 0x0a, 0x00, 0x00, 0x20, 0xee, 0x01, 0x00, 0x12, 0x00, 0x00, 0x00, 0x49, 0x52, 0x51, 0x5f, 0x00, 0x02, 0x00, 0x00, 0x20, 0xf2, 0x01, 0x00, 0x11, 0x00, 0x00, 0x00, 0x46, 0x49, 0x51, 0x5f, 0x80, 0x00, 0x00, 0x00, 0x20, 0xf4, 0x01, 0x00, 0x17, 0x00, 0x00, 0x00, 0x41, 0x42, 0x54, 0x5f, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xf4, 0x01, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x55, 0x4e, 0x44, 0x5f, 0x3c, 0x00, 0x8c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xf4, 0x01, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x55, 0x53, 0x52, 0x5f, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x50, 0xa0, 0xe1, 0x00, 0x60, 0x0f, 0xe1, 0x8c, 0x40, 0x9f, 0xe5, 0x04, 0x10, 0x94, 0xe4, 0x01, 0x00, 0x51, 0xe3, 0x09, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x94, 0xe4, 0x01, 0x10, 0x80, 0xe0, 0x03, 0x10, 0xc1, 0xe3, 0x04, 0x20, 0x94, 0xe4, 0x3c, 0x00, 0xc8, 0x0a, 0x00, 0x00, 0xc0, 0x20, 0x82, 0xe3, 0x02, 0xf0, 0x2f, 0xe1, 0x04, 0xd0, 0x41, 0xe2, 0x04, 0x20, 0x94, 0xe4, 0x13, 0x00, 0x00, 0xeb, 0xf2, 0xff, 0xff, 0xea, 0x06, 0xf0, 0x2f, 0xe1, 0x05, 0xf0, 0xa0, 0xe1, 0x0e, 0x50, 0xa0, 0xe1, 0x00, 0x60, 0x0f, 0xe1, 0x44, 0x40, 0x9f, 0xe5, 0x04, 0x10, 0x94, 0xe4, 0x01, 0x00, 0x51, 0xe3, 0x08, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x94, 0xe4, 0x3c, 0x00, 0x04, 0x0b, 0x00, 0x00, 0x01, 0x10, 0x80, 0xe0, 0x03, 0x10, 0xc1, 0xe3, 0x04, 0x20, 0x94, 0xe4, 0xc0, 0x20, 0x82, 0xe3, 0x02, 0xf0, 0x2f, 0xe1, 0x04, 0xd0, 0x41, 0xe2, 0x04, 0x20, 0x94, 0xe4, 0xf3, 0xff, 0xff, 0xea, 0x06, 0xf0, 0x2f, 0xe1, 0x05, 0xf0, 0xa0, 0xe1, 0x01, 0x00, 0x50, 0xe1, 0x04, 0x20, 0x80, 0x14, 0xfc, 0xff, 0xff, 0x1a, 0x0e, 0xf0, 0xa0, 0xe1, 0x3c, 0x0a, 0x00, 0x00, 0x3c, 0x00, 0x40, 0x0b, 0x00, 0x00, 0x01, 0x60, 0xc0, 0x46, 0xc0, 0x46, 0xc0, 0x46, 0x70, 0x47, 0x00, 0x00, 0x10, 0x1e, 0x10, 0xee, 0x02, 0x00, 0x11, 0xe3, 0xfc, 0xff, 0xff, 0x1a, 0x10, 0x0e, 0x01, 0xee, 0x10, 0x1e, 0x10, 0xee, 0x02, 0x00, 0x11, 0xe3, 0xfc, 0xff, 0xff, 0x1a, 0x1e, 0xff, 0x2f, 0xe1, 0x10, 0x1e, 0x10, 0xee, 0x01, 0x00, 0x11, 0xe3, 0x03, 0x00, 0x00, 0x0a, 0x10, 0x1e, 0x11, 0xee, 0x3c, 0x00, 0x7c, 0x0b, 0x00, 0x00, 0x00, 0x10, 0x80, 0xe5, 0x01, 0x00, 0xa0, 0xe3, 0x1e, 0xff, 0x2f, 0xe1, 0x00, 0x00, 0x20, 0xe0, 0x1e, 0xff, 0x2f, 0xe1, 0x8d, 0x46, 0x97, 0x46, 0x78, 0x47, 0xc0, 0x46, 0x78, 0xfd, 0xff, 0xea, 0x10, 0xb5, 0x04, 0x1c, 0x03, 0x28, 0x01, 0xd9, 0x00, 0xf0, 0xac, 0xfb, 0x0c, 0x48, 0x40, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x03, 0x24, 0x0b, 0x48, 0x01, 0x68, 0x09, 0x48, 0x3c, 0x00, 0xb8, 0x0b, 0x00, 0x00, 0x12, 0x30, 0x00, 0x29, 0x05, 0xd0, 0x06, 0x21, 0x61, 0x43, 0x40, 0x5c, 0xc3, 0x00, 0x18, 0x18, 0x04, 0xe0, 0x06, 0x21, 0x61, 0x43, 0x40, 0x5c, 0x14, 0x23, 0x58, 0x43, 0x0a, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x10, 0xbd, 0xd4, 0x7a, 0x01, 0x00, 0xa8, 0x69, 0x01, 0x00, 0x80, 0xb5, 0x09, 0x4a, 0x09, 0x49, 0x03, 0x20, 0x00, 0xf0, 0xf2, 0xf9, 0x08, 0x49, 0x08, 0x20, 0x3c, 0x00, 0xf4, 0x0b, 0x00, 0x00, 0x08, 0x60, 0x48, 0x60, 0x07, 0x49, 0x1d, 0x20, 0x01, 0xf0, 0xb2, 0xfc, 0x06, 0x49, 0x1e, 0x20, 0x01, 0xf0, 0xae, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x6c, 0x01, 0x00, 0x31, 0x27, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x29, 0x25, 0x00, 0x00, 0x31, 0x25, 0x00, 0x00, 0x05, 0x49, 0x80, 0xb5, 0x08, 0x20, 0x88, 0x60, 0x1d, 0x20, 0x01, 0xf0, 0xbf, 0xfc, 0x1e, 0x20, 0x3c, 0x00, 0x30, 0x0c, 0x00, 0x00, 0x01, 0xf0, 0xbc, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x02, 0x1c, 0x08, 0x1c, 0xd1, 0x2a, 0x80, 0xb5, 0x01, 0xd1, 0x05, 0xf0, 0x19, 0xfc, 0x80, 0xbd, 0x03, 0x49, 0x80, 0xb5, 0x00, 0x20, 0x08, 0x80, 0x05, 0x20, 0x05, 0xf0, 0xd5, 0xfb, 0x80, 0xbd, 0xb0, 0x74, 0x01, 0x00, 0x80, 0xb5, 0x54, 0x28, 0x01, 0xd1, 0x06, 0xf0, 0xcd, 0xf8, 0x80, 0xbd, 0x3c, 0x00, 0x6c, 0x0c, 0x00, 0x00, 0xb0, 0xb5, 0x10, 0x4d, 0x02, 0x1c, 0x01, 0x24, 0x01, 0x2a, 0x0d, 0x48, 0x29, 0x68, 0x06, 0xd0, 0xc4, 0x2a, 0x03, 0xd1, 0x6a, 0x68, 0x00, 0x2a, 0x05, 0xd0, 0xac, 0x60, 0xb0, 0xbd, 0x0e, 0xf0, 0x89, 0xfb, 0x6c, 0x60, 0x08, 0xe0, 0x00, 0x22, 0xaa, 0x60, 0x6c, 0x60, 0x0e, 0xf0, 0x82, 0xfb, 0x00, 0x21, 0x04, 0x20, 0x12, 0xf0, 0xc8, 0xfc, 0x06, 0xf0, 0xd8, 0xf8, 0x3c, 0x00, 0xa8, 0x0c, 0x00, 0x00, 0xb0, 0xbd, 0x00, 0x00, 0xc4, 0x60, 0x01, 0x00, 0xbc, 0x74, 0x01, 0x00, 0x05, 0x4a, 0x51, 0x69, 0x08, 0x1a, 0x11, 0x69, 0x09, 0x68, 0x10, 0x31, 0x81, 0x42, 0x01, 0xd8, 0x50, 0x61, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x8c, 0x6e, 0x01, 0x00, 0x01, 0x49, 0x49, 0x68, 0x40, 0x1a, 0x70, 0x47, 0x8c, 0x6e, 0x01, 0x00, 0x01, 0x48, 0x40, 0x69, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0x0c, 0x00, 0x00, 0x8c, 0x6e, 0x01, 0x00, 0x02, 0x4a, 0x51, 0x69, 0x08, 0x18, 0x50, 0x61, 0x70, 0x47, 0x00, 0x00, 0x8c, 0x6e, 0x01, 0x00, 0x0e, 0x49, 0x0f, 0x48, 0x10, 0xb5, 0x19, 0x22, 0x92, 0x01, 0x41, 0x60, 0x89, 0x18, 0xc1, 0x60, 0x0b, 0x49, 0x00, 0x22, 0x0c, 0x31, 0x01, 0x60, 0x0a, 0x49, 0x82, 0x60, 0x09, 0x68, 0x01, 0x23, 0xdb, 0x03, 0xc9, 0x18, 0x08, 0x4c, 0x41, 0x61, 0x3c, 0x00, 0x20, 0x0d, 0x00, 0x00, 0x21, 0x68, 0x00, 0x29, 0x02, 0xd0, 0x07, 0x49, 0x01, 0x61, 0x01, 0xe0, 0x00, 0xf0, 0x0c, 0xf8, 0x22, 0x60, 0x10, 0xbd, 0x44, 0xdc, 0x01, 0x00, 0x8c, 0x6e, 0x01, 0x00, 0xc8, 0x09, 0x00, 0x00, 0x34, 0x58, 0x01, 0x00, 0xc4, 0x09, 0x00, 0x00, 0x01, 0x48, 0x02, 0x49, 0x08, 0x61, 0x70, 0x47, 0xc8, 0x09, 0x00, 0x00, 0x8c, 0x6e, 0x01, 0x00, 0x08, 0x28, 0x05, 0xd2, 0x3c, 0x00, 0x5c, 0x0d, 0x00, 0x00, 0x03, 0x4b, 0x80, 0x00, 0x19, 0x50, 0x02, 0x49, 0x20, 0x31, 0x0a, 0x50, 0x70, 0x47, 0x00, 0x00, 0x64, 0x6d, 0x01, 0x00, 0x70, 0xb5, 0x06, 0x1c, 0x0d, 0x48, 0x0d, 0x1c, 0x00, 0x68, 0x14, 0x1c, 0x00, 0x28, 0x03, 0xd1, 0x20, 0x1c, 0x00, 0xf0, 0x09, 0xfc, 0x70, 0xbd, 0x28, 0x06, 0x01, 0xd5, 0x00, 0xf0, 0x22, 0xfe, 0x22, 0x1c, 0x29, 0x1c, 0x30, 0x1c, 0x08, 0xf0, 0x3c, 0x00, 0x98, 0x0d, 0x00, 0x00, 0xdd, 0xfd, 0x01, 0x1c, 0x03, 0x48, 0x54, 0x30, 0x43, 0x69, 0x32, 0x1c, 0xff, 0xf7, 0x1b, 0xfb, 0x70, 0xbd, 0x00, 0x00, 0x50, 0x6d, 0x01, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x0d, 0x48, 0x1f, 0x1c, 0x00, 0x68, 0x15, 0x1c, 0x0c, 0x1c, 0x00, 0x28, 0x02, 0xd1, 0x28, 0x1c, 0x00, 0xf0, 0xe8, 0xfb, 0x20, 0x06, 0x01, 0xd5, 0x00, 0xf0, 0x02, 0xfe, 0x2a, 0x1c, 0x21, 0x1c, 0x3c, 0x00, 0xd4, 0x0d, 0x00, 0x00, 0x30, 0x1c, 0x08, 0xf0, 0xbd, 0xfd, 0x01, 0x1c, 0x03, 0x48, 0x54, 0x30, 0x43, 0x69, 0x3a, 0x1c, 0xff, 0xf7, 0xfb, 0xfa, 0xf8, 0xbd, 0x00, 0x00, 0x50, 0x6d, 0x01, 0x00, 0xf8, 0xb5, 0xf1, 0x28, 0x4e, 0xd1, 0x2a, 0x48, 0x69, 0x46, 0x82, 0x69, 0xff, 0xf7, 0xee, 0xfa, 0x27, 0x49, 0x00, 0x26, 0x54, 0x39, 0xc8, 0x68, 0x8b, 0x68, 0xc2, 0x00, 0x01, 0x30, 0xd5, 0x18, 0x3c, 0x00, 0x10, 0x0e, 0x00, 0x00, 0x07, 0x28, 0xc8, 0x60, 0x00, 0xd1, 0xce, 0x60, 0x22, 0x48, 0x6c, 0x68, 0x00, 0x68, 0x00, 0x28, 0x03, 0xd0, 0x00, 0x21, 0x20, 0x1c, 0x08, 0xf0, 0x3b, 0xfb, 0x6e, 0x60, 0x25, 0x68, 0x20, 0x89, 0xa9, 0x78, 0x02, 0x39, 0x40, 0x1a, 0xe9, 0x78, 0x40, 0x1a, 0x20, 0x81, 0xa8, 0x78, 0x28, 0x18, 0x02, 0x38, 0x20, 0x60, 0x6e, 0x78, 0x28, 0x78, 0x08, 0x28, 0x17, 0xd2, 0x3c, 0x00, 0x4c, 0x0e, 0x00, 0x00, 0x30, 0x06, 0x07, 0xd5, 0x27, 0x1c, 0x20, 0x1c, 0x00, 0xf0, 0x7a, 0xfc, 0x04, 0x1c, 0x38, 0x1c, 0x00, 0xf0, 0x9c, 0xfb, 0x28, 0x78, 0x0f, 0x49, 0x40, 0x39, 0x80, 0x00, 0x0a, 0x58, 0x00, 0x2a, 0x04, 0xd0, 0x31, 0x1c, 0x20, 0x1c, 0xff, 0xf7, 0xb3, 0xfa, 0x08, 0xe0, 0x05, 0x21, 0x00, 0xe0, 0x04, 0x21, 0x06, 0x20, 0x00, 0xf0, 0x10, 0xfa, 0x20, 0x1c, 0x00, 0xf0, 0x3c, 0x00, 0x88, 0x0e, 0x00, 0x00, 0x87, 0xfb, 0x30, 0x06, 0x01, 0xd5, 0x00, 0xf0, 0xa1, 0xfd, 0xf8, 0xbd, 0x01, 0x21, 0x06, 0x20, 0x00, 0xf0, 0x04, 0xfa, 0xf9, 0xe7, 0x00, 0x00, 0xa4, 0x6d, 0x01, 0x00, 0xcc, 0x5c, 0x01, 0x00, 0xf8, 0xb5, 0x1a, 0x4d, 0x19, 0x4f, 0x01, 0x24, 0x54, 0x35, 0x29, 0x1c, 0x03, 0x20, 0x7c, 0x60, 0x17, 0x4b, 0x18, 0x4a, 0x05, 0xf0, 0xf4, 0xfb, 0x00, 0x28, 0x02, 0xd0, 0x3c, 0x00, 0xc4, 0x0e, 0x00, 0x00, 0x00, 0x20, 0x38, 0x60, 0x1f, 0xe0, 0x3c, 0x60, 0x07, 0x21, 0x28, 0x1c, 0xea, 0x69, 0xff, 0xf7, 0x83, 0xfa, 0x38, 0x20, 0x00, 0xf0, 0x80, 0xfc, 0x00, 0x24, 0xb8, 0x60, 0xb8, 0x68, 0xe6, 0x00, 0x35, 0x18, 0x68, 0x46, 0x02, 0x21, 0x00, 0xf0, 0x75, 0xfb, 0x28, 0x60, 0x28, 0x1c, 0x00, 0xf0, 0xa5, 0xfd, 0xb8, 0x68, 0x81, 0x59, 0x06, 0x48, 0x54, 0x30, 0x02, 0x6a, 0x3c, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xff, 0xf7, 0x6c, 0xfa, 0x01, 0x34, 0x07, 0x2c, 0xea, 0xdb, 0x00, 0x20, 0xf8, 0x60, 0x38, 0x61, 0xf8, 0xbd, 0x00, 0x00, 0x50, 0x6d, 0x01, 0x00, 0x81, 0x9a, 0x00, 0x00, 0x61, 0x9a, 0x00, 0x00, 0x05, 0x48, 0x80, 0xb5, 0x00, 0x68, 0x00, 0x28, 0x05, 0xd0, 0x03, 0x48, 0x54, 0x30, 0x42, 0x6a, 0x00, 0x21, 0xff, 0xf7, 0x53, 0xfa, 0x80, 0xbd, 0x50, 0x6d, 0x01, 0x00, 0x3c, 0x00, 0x3c, 0x0f, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0xb5, 0x0a, 0x4e, 0x09, 0x4d, 0x08, 0x4c, 0x08, 0x3e, 0xa1, 0x69, 0x00, 0x29, 0x07, 0xd0, 0x30, 0x68, 0x41, 0x60, 0x00, 0x7b, 0x81, 0x00, 0x69, 0x58, 0xff, 0xf7, 0x3e, 0xfa, 0xf4, 0xe7, 0x03, 0x49, 0x02, 0x20, 0x08, 0x70, 0x70, 0xbd, 0x00, 0x10, 0x07, 0x00, 0xe0, 0x7e, 0x01, 0x00, 0x00, 0x02, 0x07, 0x00, 0x70, 0xb5, 0x0a, 0x4e, 0x3c, 0x00, 0x78, 0x0f, 0x00, 0x00, 0x09, 0x4d, 0x08, 0x4c, 0x08, 0x3e, 0xe1, 0x69, 0x00, 0x29, 0x07, 0xd0, 0x70, 0x68, 0x41, 0x60, 0x00, 0x7b, 0x81, 0x00, 0x69, 0x58, 0xff, 0xf7, 0x24, 0xfa, 0xf4, 0xe7, 0x03, 0x49, 0x02, 0x20, 0x08, 0x70, 0x70, 0xbd, 0x00, 0x10, 0x07, 0x00, 0xe0, 0x7e, 0x01, 0x00, 0x00, 0x02, 0x07, 0x00, 0xb0, 0xb5, 0x09, 0x4d, 0x04, 0x1c, 0x28, 0x1c, 0x20, 0x22, 0x40, 0x30, 0x3c, 0x00, 0xb4, 0x0f, 0x00, 0x00, 0x05, 0x49, 0xff, 0xf7, 0x9f, 0xfa, 0xe0, 0x68, 0xe8, 0x60, 0x20, 0x69, 0x28, 0x61, 0xa0, 0x6a, 0xa8, 0x62, 0x60, 0x68, 0x68, 0x60, 0xb0, 0xbd, 0x70, 0x52, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, 0xf8, 0xb5, 0x00, 0x24, 0x00, 0x23, 0x20, 0x28, 0x01, 0xdb, 0x01, 0x24, 0x07, 0xe0, 0x08, 0x4e, 0x80, 0x00, 0x35, 0x58, 0x07, 0x4f, 0xbd, 0x42, 0x00, 0xd0, 0x2b, 0x1c, 0x3c, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x31, 0x50, 0x13, 0x60, 0x00, 0x2c, 0x03, 0xd0, 0x21, 0x1c, 0x82, 0x20, 0x00, 0xf0, 0x52, 0xf9, 0x20, 0x1c, 0xf8, 0xbd, 0xe0, 0x7e, 0x01, 0x00, 0x75, 0x75, 0x00, 0x00, 0xb0, 0xb5, 0x0b, 0x4d, 0x04, 0x1c, 0x28, 0x68, 0x00, 0x28, 0x0f, 0xd0, 0x20, 0x1c, 0x12, 0xf0, 0xb7, 0xfd, 0x00, 0x28, 0x0a, 0xd0, 0x21, 0x7a, 0x28, 0x7a, 0x0a, 0x07, 0x00, 0x07, 0x00, 0x0f, 0x3c, 0x00, 0x2c, 0x10, 0x00, 0x00, 0x12, 0x0f, 0x90, 0x42, 0x29, 0x72, 0x01, 0xd0, 0x01, 0x20, 0xb0, 0xbd, 0x00, 0x20, 0xb0, 0xbd, 0x70, 0x78, 0x01, 0x00, 0xf0, 0xb5, 0x42, 0x4e, 0x05, 0x1c, 0x30, 0x68, 0x85, 0xb0, 0x00, 0x28, 0x63, 0xd0, 0x00, 0x24, 0x00, 0x20, 0x00, 0x2d, 0x06, 0xd0, 0x69, 0x78, 0x18, 0x29, 0x03, 0xd1, 0xe9, 0x79, 0x01, 0x29, 0x00, 0xd1, 0x01, 0x20, 0x00, 0x28, 0x45, 0xd0, 0x3c, 0x00, 0x68, 0x10, 0x00, 0x00, 0x00, 0x20, 0xb0, 0x72, 0x81, 0x00, 0x4a, 0x19, 0x93, 0x7a, 0x59, 0x06, 0x89, 0x0f, 0xdb, 0x06, 0x04, 0xd5, 0xb3, 0x7a, 0x01, 0x27, 0x8f, 0x40, 0x3b, 0x43, 0xb3, 0x72, 0xd2, 0x7a, 0x13, 0x09, 0x12, 0x07, 0x12, 0x0f, 0x93, 0x42, 0x05, 0xd3, 0x01, 0x22, 0x8a, 0x40, 0x14, 0x43, 0x01, 0xaa, 0x89, 0x00, 0x50, 0x50, 0x01, 0x30, 0x04, 0x28, 0xe4, 0xdb, 0xb0, 0x7a, 0x3c, 0x00, 0xa4, 0x10, 0x00, 0x00, 0x20, 0x40, 0x01, 0x07, 0x0d, 0xd5, 0x41, 0x07, 0x09, 0xd5, 0xc1, 0x07, 0x05, 0xd5, 0x81, 0x07, 0x01, 0xd5, 0x00, 0x24, 0x05, 0xe0, 0x02, 0x99, 0x02, 0xe0, 0x01, 0x99, 0x00, 0xe0, 0x03, 0x99, 0x04, 0x91, 0x41, 0x07, 0x09, 0xd5, 0xc1, 0x07, 0x05, 0xd5, 0x81, 0x07, 0x01, 0xd5, 0x00, 0x24, 0x03, 0xe0, 0x02, 0x99, 0x00, 0xe0, 0x01, 0x99, 0x03, 0x91, 0xc1, 0x07, 0x3c, 0x00, 0xe0, 0x10, 0x00, 0x00, 0x05, 0xd5, 0x81, 0x07, 0x01, 0xd5, 0x00, 0x24, 0x01, 0xe0, 0x02, 0x99, 0x01, 0x91, 0x80, 0x07, 0x01, 0xd5, 0x00, 0x24, 0x22, 0xe0, 0x0f, 0x2c, 0x20, 0xd1, 0x70, 0x68, 0x00, 0x28, 0x0b, 0xd0, 0x04, 0x9a, 0x02, 0xab, 0x00, 0x92, 0x0a, 0xcb, 0x01, 0x9a, 0x28, 0x1c, 0x0b, 0xf0, 0x8a, 0xfb, 0x00, 0x20, 0x70, 0x60, 0x10, 0xe0, 0x17, 0xe0, 0x30, 0x7a, 0x29, 0x7a, 0x3c, 0x00, 0x1c, 0x11, 0x00, 0x00, 0x00, 0x07, 0x09, 0x07, 0x09, 0x0f, 0x00, 0x0f, 0x88, 0x42, 0x07, 0xd0, 0x04, 0x9a, 0x02, 0xab, 0x00, 0x92, 0x0a, 0xcb, 0x01, 0x9a, 0x28, 0x1c, 0x0b, 0xf0, 0x76, 0xfb, 0x28, 0x7a, 0x30, 0x72, 0x01, 0x20, 0x0f, 0x2c, 0x00, 0xd0, 0x00, 0x20, 0x05, 0xb0, 0xf0, 0xbd, 0x01, 0x20, 0xfb, 0xe7, 0x70, 0x78, 0x01, 0x00, 0x0d, 0x4a, 0x70, 0xb5, 0x11, 0x68, 0x00, 0x20, 0x3c, 0x00, 0x58, 0x11, 0x00, 0x00, 0x00, 0x29, 0x0e, 0xd0, 0x11, 0x7a, 0x09, 0x06, 0x0b, 0xd5, 0x53, 0x7a, 0x94, 0x7a, 0x03, 0x21, 0x01, 0x25, 0x2a, 0x1c, 0x8a, 0x40, 0x1e, 0x1c, 0x16, 0x40, 0x03, 0xd0, 0x22, 0x40, 0x01, 0xd1, 0x01, 0x20, 0x70, 0xbd, 0xff, 0x31, 0x09, 0x06, 0x09, 0x16, 0xf2, 0xd5, 0x70, 0xbd, 0x00, 0x00, 0x70, 0x78, 0x01, 0x00, 0x10, 0xb5, 0x08, 0x4c, 0x20, 0x68, 0x00, 0x28, 0x3c, 0x00, 0x94, 0x11, 0x00, 0x00, 0x04, 0xd0, 0x60, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x0b, 0xf0, 0xc0, 0xfb, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x07, 0xc4, 0x0c, 0x3c, 0x01, 0x20, 0x60, 0x60, 0x10, 0xbd, 0x70, 0x78, 0x01, 0x00, 0x01, 0x49, 0x01, 0x20, 0x08, 0x60, 0x70, 0x47, 0x70, 0x78, 0x01, 0x00, 0xf8, 0xb5, 0x0e, 0x4d, 0x04, 0x1c, 0x00, 0x20, 0x68, 0x72, 0x20, 0x1c, 0x12, 0xf0, 0xde, 0xfc, 0x3c, 0x00, 0xd0, 0x11, 0x00, 0x00, 0x00, 0x28, 0x12, 0xd0, 0x00, 0x20, 0x03, 0x21, 0x01, 0x22, 0x0f, 0x1a, 0x16, 0x1c, 0x23, 0x7a, 0xbe, 0x40, 0x33, 0x40, 0x04, 0xd0, 0x6b, 0x7a, 0x16, 0x1c, 0x86, 0x40, 0x33, 0x43, 0x6b, 0x72, 0x01, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x03, 0x28, 0xef, 0xd9, 0xf8, 0xbd, 0x70, 0x78, 0x01, 0x00, 0x92, 0x00, 0x51, 0x18, 0x8a, 0x7a, 0x12, 0x07, 0x12, 0x0f, 0x02, 0x70, 0x3c, 0x00, 0x0c, 0x12, 0x00, 0x00, 0xca, 0x7a, 0x12, 0x07, 0x12, 0x0f, 0x42, 0x70, 0xca, 0x7a, 0x12, 0x09, 0x82, 0x70, 0x09, 0x7b, 0x81, 0x80, 0x70, 0x47, 0x03, 0x4a, 0x0f, 0x21, 0x52, 0x7a, 0x01, 0x20, 0x91, 0x43, 0x00, 0xd0, 0x00, 0x20, 0x70, 0x47, 0x70, 0x78, 0x01, 0x00, 0x40, 0x07, 0x05, 0x49, 0x40, 0x0f, 0x05, 0x4a, 0x09, 0x56, 0x52, 0x7a, 0x01, 0x20, 0x0a, 0x40, 0x00, 0xd1, 0x00, 0x20, 0x3c, 0x00, 0x48, 0x12, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x5e, 0x46, 0x01, 0x00, 0x70, 0x78, 0x01, 0x00, 0x12, 0x4a, 0x70, 0xb5, 0x53, 0x7a, 0x94, 0x7a, 0xff, 0x20, 0x03, 0x21, 0x01, 0x25, 0x2a, 0x1c, 0x8a, 0x40, 0x1e, 0x1c, 0x16, 0x40, 0x14, 0xd0, 0x22, 0x40, 0x12, 0xd1, 0x08, 0x06, 0x00, 0x0e, 0x07, 0xd0, 0x01, 0x28, 0x07, 0xd0, 0x02, 0x28, 0x07, 0xd0, 0x03, 0x28, 0x07, 0xd1, 0x07, 0x20, 0x3c, 0x00, 0x84, 0x12, 0x00, 0x00, 0x70, 0xbd, 0x03, 0x20, 0x70, 0xbd, 0x01, 0x20, 0x70, 0xbd, 0x05, 0x20, 0x70, 0xbd, 0xff, 0x20, 0x70, 0xbd, 0xff, 0x31, 0x09, 0x06, 0x09, 0x16, 0xe1, 0xd5, 0x70, 0xbd, 0x70, 0x78, 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0x13, 0x48, 0x0d, 0x1c, 0x81, 0x68, 0x00, 0x29, 0x05, 0xd0, 0x01, 0x7b, 0x00, 0x29, 0x01, 0xd1, 0x04, 0x73, 0x45, 0x73, 0xf8, 0xbd, 0x0f, 0x4e, 0x3c, 0x00, 0xc0, 0x12, 0x00, 0x00, 0x31, 0x1c, 0x20, 0x31, 0x8a, 0x79, 0x00, 0xab, 0x1a, 0x70, 0xc9, 0x79, 0x59, 0x70, 0x42, 0x68, 0x00, 0x2a, 0x07, 0xd0, 0x20, 0x02, 0x28, 0x43, 0x01, 0x1c, 0x00, 0x20, 0xff, 0xf7, 0x7e, 0xf8, 0x00, 0x28, 0x04, 0xd1, 0x2a, 0x1c, 0x21, 0x1c, 0x00, 0x20, 0x11, 0xf0, 0x0f, 0xf8, 0x00, 0xab, 0x18, 0x88, 0xf0, 0x84, 0xe2, 0xe7, 0x00, 0x00, 0x88, 0x5a, 0x01, 0x00, 0x3c, 0x00, 0xfc, 0x12, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x80, 0xb5, 0x01, 0x21, 0x81, 0x20, 0xff, 0xf7, 0xcd, 0xff, 0x80, 0xbd, 0x01, 0x49, 0x01, 0x20, 0x88, 0x60, 0x70, 0x47, 0x88, 0x5a, 0x01, 0x00, 0x05, 0x49, 0x80, 0xb5, 0x00, 0x20, 0x88, 0x60, 0x08, 0x7b, 0x00, 0x28, 0x02, 0xd0, 0x49, 0x7b, 0xff, 0xf7, 0xbc, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x88, 0x5a, 0x01, 0x00, 0x02, 0x4a, 0x01, 0x1c, 0x3c, 0x00, 0x38, 0x13, 0x00, 0x00, 0x50, 0x68, 0x51, 0x60, 0x70, 0x47, 0x00, 0x00, 0x88, 0x5a, 0x01, 0x00, 0x10, 0xb5, 0x0c, 0x1c, 0x07, 0xf0, 0x64, 0xfa, 0x04, 0x61, 0x00, 0x20, 0x10, 0xbd, 0x00, 0x00, 0xff, 0xb5, 0x0e, 0x1c, 0x1f, 0x1c, 0x38, 0x20, 0x81, 0xb0, 0x00, 0xf0, 0x3d, 0xfa, 0x1d, 0x49, 0x04, 0x1c, 0x48, 0x69, 0x00, 0x28, 0x01, 0xd1, 0x4c, 0x61, 0x00, 0xe0, 0x04, 0x60, 0x30, 0x01, 0x3c, 0x00, 0x74, 0x13, 0x00, 0x00, 0x00, 0x90, 0x00, 0x04, 0x00, 0x0c, 0x00, 0xf0, 0x15, 0xfa, 0x05, 0x1c, 0x00, 0x99, 0xff, 0xf7, 0x8b, 0xf8, 0x00, 0x20, 0x73, 0x1e, 0x04, 0xe0, 0x01, 0x01, 0x4a, 0x19, 0x10, 0x32, 0x6a, 0x50, 0x01, 0x30, 0x98, 0x42, 0xf8, 0xd3, 0x00, 0x01, 0x2d, 0x50, 0x38, 0x21, 0x20, 0x1c, 0xff, 0xf7, 0x7b, 0xf8, 0xa5, 0x60, 0x65, 0x60, 0xe6, 0x85, 0x0c, 0x20, 0x60, 0x86, 0x3c, 0x00, 0xb0, 0x13, 0x00, 0x00, 0xaf, 0x20, 0x80, 0x01, 0xe0, 0x61, 0x0e, 0x20, 0xe0, 0x86, 0x00, 0x20, 0x20, 0x60, 0x01, 0x98, 0xe0, 0x60, 0x38, 0x68, 0x60, 0x61, 0x03, 0x99, 0x04, 0x48, 0x08, 0x60, 0x04, 0x48, 0x38, 0x60, 0x05, 0xb0, 0x00, 0x20, 0xf0, 0xbd, 0x00, 0x00, 0xfc, 0x5a, 0x01, 0x00, 0xdd, 0x15, 0x01, 0x00, 0xfd, 0x16, 0x01, 0x00, 0x02, 0x1c, 0x08, 0x1c, 0xf0, 0x2a, 0x80, 0xb5, 0x3c, 0x00, 0xec, 0x13, 0x00, 0x00, 0x04, 0xd0, 0xf1, 0x2a, 0x07, 0xd1, 0x06, 0xf0, 0x09, 0xfb, 0x80, 0xbd, 0x07, 0xf0, 0x0c, 0xfa, 0x0d, 0xf0, 0xa8, 0xfa, 0x80, 0xbd, 0x01, 0x21, 0x02, 0x20, 0xff, 0xf7, 0x4d, 0xff, 0x80, 0xbd, 0x01, 0x49, 0x00, 0x20, 0x48, 0x61, 0x70, 0x47, 0xfc, 0x5a, 0x01, 0x00, 0x00, 0x28, 0x02, 0xd0, 0x00, 0x29, 0x00, 0xd0, 0xc1, 0x60, 0x70, 0x47, 0xf8, 0xb5, 0x17, 0x1c, 0x3c, 0x00, 0x28, 0x14, 0x00, 0x00, 0x0e, 0x1c, 0x05, 0x1c, 0x1c, 0x1c, 0x1c, 0x30, 0x07, 0xf0, 0xc8, 0xf8, 0x01, 0x69, 0x42, 0x69, 0x80, 0x68, 0x89, 0x19, 0x89, 0x1a, 0x81, 0x42, 0x06, 0xd2, 0x23, 0x1c, 0x3a, 0x1c, 0x31, 0x1c, 0x28, 0x1c, 0x00, 0xf0, 0x05, 0xf8, 0xf8, 0xbd, 0x00, 0x20, 0x38, 0x60, 0x20, 0x60, 0xfa, 0xe7, 0xff, 0xb5, 0x85, 0xb0, 0x05, 0x98, 0x01, 0x27, 0x0e, 0x1c, 0x1c, 0x30, 0x3c, 0x00, 0x64, 0x14, 0x00, 0x00, 0x07, 0xf0, 0xae, 0xf8, 0x04, 0x1c, 0x80, 0x88, 0x04, 0x30, 0x03, 0x90, 0x2c, 0x48, 0x04, 0x90, 0x80, 0x79, 0x02, 0x90, 0xa0, 0x69, 0xb0, 0x42, 0x17, 0xd2, 0x35, 0x1a, 0x11, 0xe0, 0x03, 0x98, 0xff, 0xf7, 0x16, 0xfc, 0x00, 0x28, 0x06, 0xd1, 0x01, 0x21, 0x8e, 0x20, 0xff, 0xf7, 0x08, 0xff, 0x00, 0x25, 0x00, 0x27, 0x05, 0xe0, 0x21, 0x68, 0x01, 0x60, 0x20, 0x60, 0x3c, 0x00, 0xa0, 0x14, 0x00, 0x00, 0xa0, 0x69, 0x01, 0x30, 0xa0, 0x61, 0x01, 0x3d, 0xeb, 0xd2, 0x00, 0x2f, 0x35, 0xd0, 0xa0, 0x69, 0x80, 0x1b, 0xa0, 0x61, 0x20, 0x69, 0x80, 0x19, 0x20, 0x61, 0x61, 0x69, 0x40, 0x1a, 0xe1, 0x68, 0x88, 0x42, 0x03, 0xd9, 0x07, 0x21, 0x8e, 0x20, 0xff, 0xf7, 0xec, 0xfe, 0x25, 0x68, 0x2f, 0x1c, 0x70, 0x1e, 0x01, 0x95, 0x00, 0xe0, 0x3f, 0x68, 0x01, 0x38, 0xfc, 0xd2, 0x3c, 0x00, 0xdc, 0x14, 0x00, 0x00, 0x38, 0x68, 0x20, 0x60, 0x02, 0x98, 0x04, 0x99, 0x88, 0x71, 0x2e, 0x68, 0x2c, 0x60, 0x32, 0x1d, 0x00, 0x92, 0x29, 0x1c, 0x20, 0x31, 0x01, 0x22, 0x28, 0x1d, 0x05, 0x9b, 0x08, 0xf0, 0x7a, 0xfc, 0xbd, 0x42, 0x01, 0xd0, 0x35, 0x1c, 0xf0, 0xe7, 0x00, 0x20, 0x38, 0x61, 0x01, 0x98, 0x07, 0x99, 0x04, 0x30, 0x08, 0x60, 0x08, 0x98, 0x04, 0x37, 0x07, 0x60, 0x09, 0xb0, 0x3c, 0x00, 0x18, 0x15, 0x00, 0x00, 0xf0, 0xbd, 0x02, 0x98, 0x04, 0x99, 0x88, 0x71, 0xf9, 0xe7, 0x00, 0x00, 0x20, 0x10, 0x07, 0x00, 0x38, 0xb5, 0x04, 0x1c, 0x15, 0x1c, 0x00, 0x20, 0x0c, 0x60, 0x09, 0xe0, 0xe2, 0x68, 0x20, 0x1c, 0x00, 0x92, 0xa3, 0x8a, 0x21, 0x68, 0xa2, 0x69, 0x08, 0xf0, 0x56, 0xfc, 0x20, 0x1c, 0xe4, 0x68, 0x00, 0x2c, 0xf3, 0xd1, 0x28, 0x60, 0x38, 0xbd, 0x80, 0xb5, 0x0c, 0xe0, 0x3c, 0x00, 0x54, 0x15, 0x00, 0x00, 0xc2, 0x68, 0x8a, 0x42, 0x08, 0xd1, 0x00, 0x21, 0xc1, 0x60, 0x00, 0x28, 0x03, 0xd1, 0x06, 0x21, 0x8e, 0x20, 0xff, 0xf7, 0x9d, 0xfe, 0x80, 0xbd, 0x10, 0x1c, 0x00, 0x28, 0xf7, 0xd0, 0xef, 0xe7, 0x10, 0xb5, 0x04, 0x1c, 0x0c, 0xd0, 0xa0, 0x69, 0x00, 0x28, 0x06, 0xd1, 0x20, 0x69, 0x00, 0x28, 0x03, 0xd0, 0x06, 0xf0, 0xf7, 0xfd, 0x00, 0x20, 0x20, 0x61, 0x20, 0x1c, 0x3c, 0x00, 0x90, 0x15, 0x00, 0x00, 0x06, 0xf0, 0xf2, 0xfd, 0x10, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x00, 0x28, 0x09, 0xd0, 0xc4, 0x68, 0x03, 0xe0, 0xff, 0xf7, 0xe7, 0xff, 0x20, 0x1c, 0xf9, 0xe7, 0x00, 0x2c, 0xf9, 0xd1, 0xff, 0xf7, 0xe1, 0xff, 0x10, 0xbd, 0x01, 0x1c, 0x00, 0x20, 0x04, 0xe0, 0x0a, 0x89, 0xc9, 0x68, 0x10, 0x18, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x29, 0xf8, 0xd1, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0xcc, 0x15, 0x00, 0x00, 0x00, 0xe0, 0x08, 0x1c, 0xc1, 0x68, 0x00, 0x29, 0xfb, 0xd1, 0x70, 0x47, 0xf8, 0xb5, 0x06, 0x1c, 0x0c, 0x1c, 0x1c, 0x20, 0x00, 0xf0, 0x68, 0xfa, 0x05, 0x1c, 0x00, 0x2e, 0x01, 0xd1, 0x00, 0x2c, 0x02, 0xd1, 0x30, 0x1c, 0x01, 0x21, 0x03, 0xe0, 0x20, 0x1c, 0x00, 0xf0, 0x5d, 0xfa, 0x00, 0x21, 0x00, 0x22, 0x00, 0x92, 0x0a, 0x1c, 0x01, 0x1c, 0x23, 0x1c, 0x28, 0x1c, 0x3c, 0x00, 0x08, 0x16, 0x00, 0x00, 0x08, 0xf0, 0xf2, 0xfb, 0x28, 0x1c, 0xf8, 0xbd, 0xb0, 0xb5, 0x03, 0x32, 0x92, 0x08, 0x92, 0x00, 0x14, 0x04, 0x24, 0x0c, 0x09, 0x19, 0x1d, 0x1c, 0xc9, 0x18, 0x09, 0x04, 0x09, 0x0c, 0xff, 0xf7, 0xd7, 0xff, 0x01, 0x89, 0x02, 0x68, 0x12, 0x19, 0x09, 0x1b, 0x49, 0x1b, 0x02, 0x60, 0x01, 0x81, 0xb0, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x0a, 0x4c, 0xa0, 0x21, 0x20, 0x1c, 0x3c, 0x00, 0x44, 0x16, 0x00, 0x00, 0xfe, 0xf7, 0x2a, 0xff, 0x00, 0x20, 0x26, 0x1c, 0xa0, 0x36, 0x07, 0x4d, 0x07, 0xe0, 0x0c, 0x21, 0x41, 0x43, 0x49, 0x19, 0x0e, 0xc9, 0x27, 0x1d, 0x0e, 0xc7, 0x20, 0x34, 0x01, 0x30, 0xa6, 0x42, 0xf5, 0xd1, 0xf8, 0xbd, 0xd0, 0x5c, 0x01, 0x00, 0xc8, 0x3f, 0x01, 0x00, 0xf7, 0xb5, 0xc4, 0x68, 0x06, 0x1c, 0x00, 0x25, 0x00, 0x2c, 0x82, 0xb0, 0x23, 0xd0, 0x20, 0x89, 0x3c, 0x00, 0x80, 0x16, 0x00, 0x00, 0x90, 0x42, 0x20, 0xd3, 0xe1, 0x68, 0x87, 0x1a, 0x01, 0x91, 0x00, 0x21, 0xe1, 0x60, 0x03, 0x99, 0x00, 0x20, 0xff, 0xf7, 0xa1, 0xff, 0x05, 0x1c, 0x20, 0x89, 0xc0, 0x1b, 0x20, 0x81, 0x2a, 0x68, 0x03, 0x99, 0x30, 0x1c, 0x00, 0xf0, 0x16, 0xf8, 0x20, 0x89, 0xc0, 0x19, 0x20, 0x81, 0x01, 0x99, 0x20, 0x1c, 0xff, 0xf7, 0xb1, 0xfe, 0x21, 0x1c, 0x28, 0x1c, 0xff, 0xf7, 0x3c, 0x00, 0xbc, 0x16, 0x00, 0x00, 0xad, 0xfe, 0x29, 0x1c, 0x30, 0x1c, 0xff, 0xf7, 0xa9, 0xfe, 0x01, 0x20, 0x00, 0x2d, 0x00, 0xd1, 0x00, 0x20, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xf7, 0xb5, 0x04, 0x1c, 0x0e, 0x1c, 0x00, 0x20, 0x01, 0xe0, 0x20, 0x1c, 0x0c, 0x1c, 0xe1, 0x68, 0x00, 0x29, 0xfa, 0xd1, 0x27, 0x89, 0xb7, 0x42, 0x0a, 0xd3, 0xb8, 0x1b, 0x00, 0x04, 0x00, 0x0c, 0x20, 0x81, 0x21, 0x68, 0x3c, 0x00, 0xf8, 0x16, 0x00, 0x00, 0x09, 0x18, 0x02, 0x98, 0x32, 0x1c, 0xfe, 0xf7, 0xfb, 0xfe, 0xfe, 0xbd, 0xf1, 0x1b, 0x0d, 0x04, 0x2d, 0x0c, 0x00, 0x28, 0x19, 0xd0, 0x01, 0x89, 0xa9, 0x42, 0x16, 0xd3, 0x49, 0x1b, 0x09, 0x04, 0x09, 0x0c, 0x01, 0x81, 0x00, 0x68, 0x41, 0x18, 0x02, 0x98, 0x2a, 0x1c, 0xfe, 0xf7, 0xe8, 0xfe, 0x21, 0x68, 0x02, 0x98, 0x72, 0x1b, 0x40, 0x19, 0xfe, 0xf7, 0xe2, 0xfe, 0x3c, 0x00, 0x34, 0x17, 0x00, 0x00, 0x20, 0x89, 0xc0, 0x1b, 0x20, 0x81, 0x20, 0x68, 0xc0, 0x19, 0x20, 0x60, 0xdf, 0xe7, 0x03, 0x21, 0x8e, 0x20, 0xff, 0xf7, 0xad, 0xfd, 0xda, 0xe7, 0xf8, 0xb5, 0x04, 0x1c, 0x00, 0x26, 0x13, 0xe0, 0x21, 0x89, 0x00, 0x20, 0xff, 0xf7, 0x3e, 0xff, 0x05, 0x1c, 0x22, 0x89, 0x21, 0x68, 0x00, 0x68, 0xfe, 0xf7, 0xc8, 0xfe, 0x00, 0x2e, 0x01, 0xd1, 0x2e, 0x1c, 0x03, 0xe0, 0x3c, 0x00, 0x70, 0x17, 0x00, 0x00, 0x29, 0x1c, 0x38, 0x1c, 0xff, 0xf7, 0x50, 0xfe, 0xe4, 0x68, 0x2f, 0x1c, 0x00, 0x2c, 0xe9, 0xd1, 0x30, 0x1c, 0xf8, 0xbd, 0xb0, 0xb5, 0x04, 0x1c, 0x00, 0x89, 0x40, 0x1a, 0x05, 0x04, 0x20, 0x68, 0x2d, 0x0c, 0x40, 0x18, 0x29, 0x1c, 0xff, 0xf7, 0x1f, 0xff, 0x21, 0x89, 0x49, 0x1b, 0x21, 0x81, 0xe1, 0x68, 0xc1, 0x60, 0xe0, 0x60, 0xb0, 0xbd, 0x10, 0xb5, 0x03, 0x30, 0x3c, 0x00, 0xac, 0x17, 0x00, 0x00, 0x09, 0x4a, 0x81, 0x08, 0x10, 0x68, 0x3d, 0x24, 0x08, 0x4b, 0x64, 0x01, 0x89, 0x00, 0x09, 0x18, 0x1b, 0x19, 0x99, 0x42, 0x01, 0xd8, 0x11, 0x60, 0x10, 0xbd, 0x0f, 0x21, 0x80, 0x20, 0xff, 0xf7, 0x6b, 0xfd, 0x00, 0x20, 0x10, 0xbd, 0x00, 0x00, 0xb4, 0xcf, 0x01, 0x00, 0x14, 0xc8, 0x01, 0x00, 0x10, 0xb5, 0x11, 0xf0, 0x61, 0xff, 0x04, 0x1c, 0x03, 0xd1, 0x0d, 0x21, 0x3c, 0x00, 0xe8, 0x17, 0x00, 0x00, 0x80, 0x20, 0xff, 0xf7, 0x5b, 0xfd, 0x20, 0x1c, 0x10, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x01, 0x1f, 0x0b, 0x68, 0x0d, 0x48, 0x00, 0x22, 0x83, 0x42, 0x04, 0xd0, 0x01, 0x32, 0x10, 0x30, 0x03, 0x2a, 0xf9, 0xd3, 0x01, 0xe0, 0x03, 0x2a, 0x06, 0xd3, 0x09, 0x24, 0x21, 0x1c, 0x80, 0x20, 0xff, 0xf7, 0x45, 0xfd, 0x20, 0x1c, 0xb0, 0xbd, 0x05, 0x4b, 0x00, 0x24, 0x9a, 0x79, 0x3c, 0x00, 0x24, 0x18, 0x00, 0x00, 0x85, 0x68, 0x0d, 0x60, 0x81, 0x60, 0x9a, 0x71, 0xf5, 0xe7, 0x00, 0x00, 0x20, 0x57, 0x01, 0x00, 0x20, 0x10, 0x07, 0x00, 0xb0, 0xb5, 0x00, 0x21, 0x10, 0x4a, 0x00, 0x23, 0xd4, 0x68, 0x84, 0x42, 0x04, 0xd2, 0x01, 0x33, 0x10, 0x32, 0x03, 0x2b, 0xf8, 0xd3, 0x01, 0xe0, 0x03, 0x2b, 0x01, 0xd3, 0x04, 0x21, 0x0e, 0xe0, 0x0a, 0x4c, 0xa3, 0x79, 0x90, 0x68, 0x00, 0x28, 0x3c, 0x00, 0x60, 0x18, 0x00, 0x00, 0x02, 0xd1, 0xa3, 0x71, 0x03, 0x21, 0x06, 0xe0, 0x05, 0x68, 0x95, 0x60, 0xa3, 0x71, 0x00, 0x29, 0x01, 0xd1, 0x04, 0xc0, 0xb0, 0xbd, 0x80, 0x20, 0xff, 0xf7, 0x14, 0xfd, 0x00, 0x20, 0xb0, 0xbd, 0x20, 0x57, 0x01, 0x00, 0x20, 0x10, 0x07, 0x00, 0xa0, 0x30, 0x00, 0x8a, 0x40, 0x07, 0x40, 0x0f, 0x08, 0x28, 0x0f, 0xd2, 0x01, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x3c, 0x00, 0x9c, 0x18, 0x00, 0x00, 0x05, 0x03, 0x03, 0x05, 0x07, 0x07, 0x09, 0x09, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x02, 0x20, 0x70, 0x47, 0x03, 0x20, 0x70, 0x47, 0x04, 0x20, 0x70, 0x47, 0xb0, 0xb5, 0x10, 0x4d, 0x68, 0x69, 0x00, 0x28, 0x07, 0xd0, 0x0e, 0x49, 0x00, 0x22, 0x2c, 0x31, 0x03, 0xc9, 0x01, 0x43, 0x03, 0x20, 0x06, 0xf0, 0xcf, 0xff, 0x0b, 0x4c, 0x00, 0x22, 0x03, 0xcc, 0x3c, 0x00, 0xd8, 0x18, 0x00, 0x00, 0x08, 0x3c, 0x01, 0x43, 0x03, 0x20, 0x06, 0xf0, 0xaf, 0xff, 0x03, 0xcc, 0x08, 0x43, 0x07, 0x49, 0x4a, 0x68, 0x02, 0x43, 0x4a, 0x60, 0x8a, 0x68, 0x10, 0x43, 0x88, 0x60, 0x01, 0x20, 0x68, 0x61, 0xb0, 0xbd, 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, 0xb0, 0x58, 0x01, 0x00, 0x10, 0x00, 0x07, 0x00, 0xb0, 0xb5, 0x0c, 0x1c, 0x0f, 0xf0, 0xa8, 0xfa, 0x05, 0x4d, 0xe8, 0x6a, 0x3c, 0x00, 0x14, 0x19, 0x00, 0x00, 0x00, 0x28, 0x06, 0xd1, 0x00, 0x2c, 0x04, 0xd0, 0x20, 0x1c, 0x0f, 0xf0, 0xb7, 0xfd, 0x01, 0x20, 0x28, 0x70, 0xb0, 0xbd, 0xf4, 0x6e, 0x01, 0x00, 0x05, 0x49, 0x80, 0xb5, 0x88, 0x6a, 0x00, 0x28, 0x04, 0xda, 0x00, 0x20, 0x88, 0x62, 0x01, 0x21, 0x0d, 0xf0, 0x42, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0xac, 0x7e, 0x01, 0x00, 0xf8, 0xb5, 0x1e, 0x4d, 0x04, 0x1c, 0x00, 0x20, 0x3c, 0x00, 0x50, 0x19, 0x00, 0x00, 0x68, 0x62, 0xa8, 0x70, 0x1c, 0x48, 0x00, 0x78, 0xc0, 0x07, 0x22, 0xd5, 0xb8, 0x20, 0x03, 0x59, 0x1a, 0x48, 0x00, 0x78, 0x0e, 0x28, 0x09, 0xd1, 0x0a, 0x1c, 0x80, 0x32, 0x06, 0xd0, 0x18, 0x4e, 0x0d, 0x20, 0x32, 0x5c, 0x8a, 0x42, 0x01, 0xdd, 0x01, 0x38, 0xfa, 0xd1, 0x59, 0x1e, 0x0b, 0x06, 0x1b, 0x0e, 0xab, 0x70, 0xab, 0x62, 0x0e, 0x28, 0x0b, 0xd2, 0x08, 0xe0, 0x3c, 0x00, 0x8c, 0x19, 0x00, 0x00, 0x62, 0x18, 0xb0, 0x32, 0x12, 0x7b, 0x82, 0x42, 0x02, 0xd8, 0x58, 0x1a, 0xa8, 0x62, 0x02, 0xe0, 0x01, 0x39, 0x00, 0x29, 0xf4, 0xda, 0x0e, 0xf0, 0x35, 0xf9, 0x00, 0x90, 0x00, 0xab, 0x18, 0x78, 0x59, 0x78, 0x81, 0x42, 0x00, 0xd9, 0x58, 0x78, 0xed, 0x30, 0xe8, 0x70, 0x01, 0x21, 0x20, 0x1c, 0x0d, 0xf0, 0x02, 0xfd, 0xf8, 0xbd, 0x00, 0x00, 0xac, 0x7e, 0x01, 0x00, 0x3c, 0x00, 0xc8, 0x19, 0x00, 0x00, 0x1d, 0x75, 0x01, 0x00, 0x11, 0x67, 0x01, 0x00, 0xc7, 0x52, 0x01, 0x00, 0x0e, 0x49, 0x10, 0xb5, 0x08, 0x69, 0x8b, 0x68, 0xc2, 0x00, 0xd4, 0x18, 0x62, 0x68, 0x00, 0x2a, 0x0f, 0xd1, 0x01, 0x30, 0x08, 0x61, 0x07, 0x28, 0x01, 0xd1, 0x00, 0x20, 0x08, 0x61, 0x20, 0x1c, 0x00, 0xf0, 0x24, 0xf8, 0x05, 0x48, 0x21, 0x68, 0x54, 0x30, 0x02, 0x6a, 0xfe, 0xf7, 0xec, 0xfc, 0x3c, 0x00, 0x04, 0x1a, 0x00, 0x00, 0x10, 0xbd, 0x06, 0x21, 0x06, 0x20, 0xff, 0xf7, 0x4b, 0xfc, 0x10, 0xbd, 0x50, 0x6d, 0x01, 0x00, 0x08, 0x49, 0x09, 0x79, 0xc9, 0x07, 0x08, 0x4a, 0x08, 0xd4, 0x00, 0xe0, 0x08, 0x1c, 0xc1, 0x68, 0x00, 0x29, 0xfb, 0xd1, 0x01, 0x89, 0x04, 0x31, 0x01, 0x81, 0x00, 0xe0, 0x00, 0x20, 0xd0, 0x62, 0x70, 0x47, 0x00, 0x00, 0x60, 0x80, 0x07, 0x00, 0x04, 0x6c, 0x01, 0x00, 0x3c, 0x00, 0x40, 0x1a, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x19, 0x21, 0x89, 0x01, 0x00, 0x20, 0xff, 0xf7, 0xc5, 0xfd, 0x01, 0x1c, 0x60, 0x60, 0x20, 0x68, 0xff, 0xf7, 0xe0, 0xfc, 0x60, 0x68, 0x21, 0x68, 0x08, 0x30, 0x08, 0x60, 0x10, 0xbd, 0x00, 0x00, 0x0a, 0x28, 0x01, 0xda, 0x04, 0x20, 0x04, 0xe0, 0x50, 0x28, 0x01, 0xda, 0x05, 0x20, 0x00, 0xe0, 0x07, 0x20, 0x04, 0x4a, 0x11, 0x78, 0x38, 0x23, 0x3c, 0x00, 0x7c, 0x1a, 0x00, 0x00, 0xc0, 0x00, 0x18, 0x40, 0x99, 0x43, 0x08, 0x43, 0x10, 0x70, 0x70, 0x47, 0x88, 0x00, 0x07, 0x00, 0xb0, 0xb5, 0x05, 0x1c, 0x07, 0x48, 0x40, 0x68, 0x08, 0xe0, 0x01, 0x69, 0xa9, 0x42, 0x04, 0xd1, 0x44, 0x68, 0x05, 0xf0, 0xc7, 0xfd, 0x20, 0x1c, 0x00, 0xe0, 0x40, 0x68, 0x00, 0x28, 0xf4, 0xd1, 0xb0, 0xbd, 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, 0xf8, 0xb5, 0x00, 0x25, 0x3c, 0x00, 0xb8, 0x1a, 0x00, 0x00, 0x06, 0xf0, 0x84, 0xfd, 0x11, 0x4f, 0x04, 0x1c, 0xbe, 0x79, 0x20, 0x68, 0x00, 0x28, 0x07, 0xd1, 0xa0, 0x88, 0x04, 0x30, 0xff, 0xf7, 0xf2, 0xf8, 0x00, 0x28, 0x06, 0xd1, 0x01, 0x21, 0x0f, 0xe0, 0x01, 0x68, 0x21, 0x60, 0xa1, 0x69, 0x01, 0x39, 0xa1, 0x61, 0x10, 0xc0, 0x05, 0x1c, 0x20, 0x69, 0x01, 0x30, 0x20, 0x61, 0x61, 0x69, 0x40, 0x1a, 0xe1, 0x68, 0x88, 0x42, 0x3c, 0x00, 0xf4, 0x1a, 0x00, 0x00, 0x03, 0xd9, 0x07, 0x21, 0x8e, 0x20, 0xff, 0xf7, 0xd3, 0xfb, 0xbe, 0x71, 0x28, 0x1c, 0xf8, 0xbd, 0x20, 0x10, 0x07, 0x00, 0xb0, 0xb5, 0x09, 0xf0, 0xbb, 0xff, 0x2f, 0x4c, 0x00, 0x28, 0x20, 0x74, 0x03, 0xd0, 0x01, 0x21, 0x01, 0x20, 0x0a, 0xf0, 0x71, 0xfc, 0x2b, 0x4d, 0x14, 0x35, 0x28, 0x68, 0x00, 0x28, 0x4d, 0xd0, 0x01, 0x21, 0x0f, 0x20, 0x11, 0xf0, 0x82, 0xfd, 0x3c, 0x00, 0x30, 0x1b, 0x00, 0x00, 0x28, 0x89, 0x08, 0xf0, 0xfb, 0xff, 0x01, 0x1c, 0x01, 0x22, 0x0f, 0x20, 0x11, 0xf0, 0x40, 0xfd, 0xe0, 0x78, 0x01, 0x25, 0x02, 0x28, 0x36, 0xd1, 0x0a, 0xf0, 0xc6, 0xf8, 0x00, 0x28, 0x0a, 0xd0, 0x0b, 0xf0, 0x92, 0xfb, 0x1e, 0x49, 0x09, 0x68, 0x40, 0x18, 0x11, 0xf0, 0x5f, 0xf8, 0x00, 0x28, 0x01, 0xd1, 0x02, 0x20, 0x2f, 0xe0, 0xe0, 0x78, 0x02, 0x28, 0x24, 0xd1, 0x3c, 0x00, 0x6c, 0x1b, 0x00, 0x00, 0x60, 0x70, 0x25, 0x70, 0x60, 0x68, 0x01, 0x28, 0x1c, 0xd0, 0x15, 0x48, 0x10, 0x38, 0x81, 0x7b, 0x00, 0x29, 0x04, 0xd1, 0x85, 0x73, 0x0f, 0x20, 0x13, 0x49, 0x10, 0xf0, 0x01, 0xfc, 0x08, 0xf0, 0x4f, 0xfe, 0x00, 0x28, 0x07, 0xd0, 0x0e, 0x48, 0x01, 0x21, 0x98, 0x38, 0x00, 0x69, 0x01, 0xf0, 0xb7, 0xfd, 0x00, 0x28, 0x05, 0xd0, 0x01, 0x20, 0x0e, 0xf0, 0x0c, 0xfd, 0x3c, 0x00, 0xa8, 0x1b, 0x00, 0x00, 0x01, 0x20, 0x0e, 0xf0, 0x1d, 0xfc, 0xb0, 0xbd, 0x05, 0xf0, 0xdc, 0xfe, 0xb0, 0xbd, 0xe0, 0x78, 0x00, 0x28, 0x01, 0xd1, 0x25, 0x70, 0xf7, 0xe7, 0x03, 0x20, 0x00, 0xe0, 0x04, 0x20, 0x0d, 0xf0, 0x8d, 0xfa, 0xb0, 0xbd, 0x84, 0x66, 0x01, 0x00, 0x6c, 0x57, 0x01, 0x00, 0xe9, 0x03, 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x00, 0x21, 0x00, 0x20, 0x0a, 0x4d, 0x00, 0xe0, 0x3c, 0x00, 0xe4, 0x1b, 0x00, 0x00, 0x01, 0x31, 0xcb, 0x00, 0x5a, 0x19, 0x16, 0x79, 0x01, 0x2e, 0x02, 0xd0, 0x52, 0x79, 0xa2, 0x42, 0x02, 0xd0, 0x0b, 0x29, 0xf4, 0xd3, 0x70, 0xbd, 0x0b, 0x29, 0xfc, 0xd2, 0xc8, 0x00, 0x01, 0x21, 0x5a, 0x19, 0x28, 0x58, 0x11, 0x71, 0x70, 0xbd, 0x38, 0x58, 0x01, 0x00, 0x05, 0x48, 0x80, 0xb5, 0x00, 0x7f, 0x24, 0x23, 0x04, 0x49, 0x58, 0x43, 0x40, 0x18, 0x00, 0x6a, 0x3c, 0x00, 0x20, 0x1c, 0x00, 0x00, 0xfe, 0xf7, 0xda, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x94, 0x46, 0x01, 0x00, 0x80, 0xb5, 0x04, 0xf0, 0x37, 0xff, 0x00, 0x20, 0x11, 0xf0, 0x84, 0xfc, 0x00, 0x20, 0x80, 0xbd, 0xb0, 0xb5, 0x05, 0x4c, 0x05, 0x1c, 0x20, 0x6b, 0xe1, 0x6a, 0x02, 0xf0, 0xe3, 0xfd, 0x29, 0x1c, 0xa0, 0x6a, 0x02, 0xf0, 0x11, 0xfb, 0xb0, 0xbd, 0xa4, 0x6c, 0x01, 0x00, 0x3c, 0x00, 0x5c, 0x1c, 0x00, 0x00, 0xb0, 0xb5, 0x03, 0x1c, 0x08, 0x1c, 0x14, 0x1c, 0x00, 0x2b, 0x0c, 0x4d, 0x09, 0xd0, 0x69, 0x69, 0x89, 0x00, 0x01, 0x31, 0x0a, 0x04, 0x12, 0x0c, 0x22, 0x80, 0x29, 0x1c, 0xfe, 0xf7, 0x3e, 0xfc, 0x0a, 0xe0, 0x01, 0x1c, 0x28, 0x1c, 0x22, 0x88, 0xfe, 0xf7, 0x38, 0xfc, 0x20, 0x88, 0x01, 0x28, 0x02, 0xd9, 0x80, 0x08, 0x01, 0x38, 0x68, 0x61, 0x01, 0x20, 0xb0, 0xbd, 0x3c, 0x00, 0x98, 0x1c, 0x00, 0x00, 0x20, 0x6e, 0x01, 0x00, 0xf1, 0xb5, 0x00, 0x98, 0x00, 0x26, 0xc1, 0x68, 0x08, 0x68, 0x09, 0x89, 0x1c, 0x29, 0x34, 0xd3, 0xc1, 0x88, 0xff, 0x23, 0x01, 0x33, 0x99, 0x42, 0x2f, 0xd1, 0x01, 0x88, 0xc9, 0x1a, 0x2c, 0xd1, 0x41, 0x88, 0x08, 0x29, 0x29, 0xd1, 0x01, 0x79, 0x06, 0x29, 0x26, 0xd1, 0x41, 0x79, 0x04, 0x29, 0x23, 0xd1, 0x00, 0x25, 0x00, 0x24, 0x07, 0x1c, 0x3c, 0x00, 0xd4, 0x1c, 0x00, 0x00, 0x18, 0x37, 0x0b, 0xe0, 0xa0, 0x00, 0x41, 0x18, 0x04, 0x31, 0x04, 0x22, 0x38, 0x1c, 0xfe, 0xf7, 0x8b, 0xfb, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x25, 0x04, 0xe0, 0x01, 0x34, 0x0a, 0x49, 0x48, 0x69, 0xa0, 0x42, 0xef, 0xd8, 0x08, 0x49, 0x08, 0x78, 0x00, 0x28, 0x0a, 0xd0, 0x01, 0x28, 0x01, 0xd0, 0x02, 0x28, 0x06, 0xd1, 0x00, 0x2d, 0x04, 0xd1, 0x00, 0x98, 0xc0, 0x68, 0x3c, 0x00, 0x10, 0x1d, 0x00, 0x00, 0xff, 0xf7, 0x42, 0xfc, 0x01, 0x26, 0x30, 0x1c, 0xf8, 0xbd, 0x00, 0x00, 0x20, 0x6e, 0x01, 0x00, 0x01, 0x48, 0x40, 0x68, 0x70, 0x47, 0x00, 0x00, 0x20, 0x6e, 0x01, 0x00, 0x02, 0x49, 0x48, 0x60, 0x01, 0x20, 0x48, 0x61, 0x70, 0x47, 0x00, 0x00, 0x20, 0x6e, 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x01, 0x26, 0x03, 0xf0, 0xef, 0xfa, 0x25, 0x1c, 0x10, 0x35, 0x00, 0x28, 0x3c, 0x00, 0x4c, 0x1d, 0x00, 0x00, 0x04, 0xd0, 0x00, 0x20, 0x20, 0x77, 0x03, 0xf0, 0xf1, 0xfb, 0x07, 0xe0, 0x03, 0xf0, 0x38, 0xfd, 0x00, 0x28, 0x09, 0xd0, 0x01, 0x20, 0x20, 0x77, 0x03, 0xf0, 0xce, 0xfc, 0x01, 0x1c, 0x06, 0x22, 0x28, 0x1c, 0xfe, 0xf7, 0xc3, 0xfb, 0x02, 0xe0, 0x02, 0x20, 0x20, 0x77, 0x00, 0x26, 0x30, 0x1c, 0x70, 0xbd, 0x00, 0x00, 0x03, 0x48, 0x80, 0x7a, 0xc0, 0x07, 0x03, 0x49, 0x3c, 0x00, 0x88, 0x1d, 0x00, 0x00, 0xc0, 0x0f, 0x88, 0x62, 0x70, 0x47, 0x00, 0x00, 0x40, 0x90, 0x07, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x01, 0x49, 0x01, 0x20, 0x88, 0x62, 0x70, 0x47, 0xa4, 0x6c, 0x01, 0x00, 0x06, 0x48, 0x80, 0x7a, 0xc1, 0x07, 0x06, 0x4a, 0xc9, 0x0f, 0x91, 0x62, 0x20, 0x21, 0x80, 0x07, 0x00, 0xd4, 0x00, 0x21, 0xa0, 0x32, 0x11, 0x70, 0x70, 0x47, 0x00, 0x00, 0x40, 0x90, 0x07, 0x00, 0x3c, 0x00, 0xc4, 0x1d, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x07, 0x4a, 0x12, 0x68, 0x07, 0x4b, 0x9b, 0x69, 0x1a, 0x40, 0x01, 0xd0, 0x01, 0x22, 0x00, 0xe0, 0x00, 0x22, 0x0a, 0x60, 0x01, 0x21, 0x00, 0x2a, 0x00, 0xd0, 0x00, 0x21, 0x01, 0x60, 0x70, 0x47, 0x10, 0x00, 0x07, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x01, 0x22, 0x02, 0x60, 0x0a, 0x60, 0x70, 0x47, 0xb0, 0xb5, 0x0d, 0x1c, 0x01, 0x1c, 0x58, 0x31, 0x3c, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x04, 0x1c, 0x06, 0x22, 0x28, 0x1d, 0xfe, 0xf7, 0x77, 0xfb, 0x21, 0x1c, 0x5e, 0x31, 0x06, 0x22, 0x28, 0x1c, 0x0a, 0x30, 0xfe, 0xf7, 0x70, 0xfb, 0x21, 0x1c, 0x64, 0x31, 0x06, 0x22, 0x28, 0x1c, 0x10, 0x30, 0xfe, 0xf7, 0x69, 0xfb, 0xb0, 0xbd, 0xfe, 0xb5, 0x00, 0x25, 0x1d, 0x72, 0x17, 0x1c, 0x0e, 0x1c, 0xb2, 0x6d, 0x00, 0x21, 0x92, 0x19, 0x50, 0x32, 0xd2, 0x7a, 0x3c, 0x00, 0x3c, 0x1e, 0x00, 0x00, 0x1c, 0x1c, 0x5a, 0x72, 0x00, 0x78, 0x32, 0x1c, 0x80, 0x32, 0xc0, 0x07, 0xc0, 0x17, 0x01, 0x30, 0x01, 0x90, 0x08, 0x98, 0x02, 0x92, 0x00, 0x28, 0x01, 0xd1, 0x30, 0x7f, 0x2b, 0xe0, 0x37, 0x48, 0x00, 0x68, 0x00, 0x28, 0x00, 0xdd, 0x01, 0x1c, 0x01, 0x98, 0x00, 0x28, 0x02, 0xd0, 0x08, 0x98, 0x01, 0x28, 0x10, 0xd1, 0x02, 0x9a, 0x90, 0x6b, 0x00, 0x28, 0x06, 0xd0, 0x3c, 0x00, 0x78, 0x1e, 0x00, 0x00, 0x88, 0x42, 0x01, 0xd9, 0x45, 0x1a, 0x01, 0x3d, 0x70, 0x19, 0xb0, 0x30, 0x03, 0xe0, 0xb5, 0x6d, 0x01, 0x3d, 0x70, 0x19, 0x50, 0x30, 0x00, 0x7b, 0x0f, 0xe0, 0x02, 0x9a, 0x10, 0x6a, 0x00, 0x28, 0x07, 0xd0, 0x88, 0x42, 0x01, 0xd9, 0x45, 0x1a, 0x01, 0x3d, 0x70, 0x19, 0xa0, 0x30, 0x00, 0x79, 0x03, 0xe0, 0xbd, 0x69, 0x01, 0x3d, 0x78, 0x19, 0x00, 0x7f, 0xa0, 0x72, 0x3c, 0x00, 0xb4, 0x1e, 0x00, 0x00, 0x0e, 0xf0, 0x0c, 0xf8, 0x0e, 0x28, 0x11, 0xd1, 0xa0, 0x7a, 0x08, 0xf0, 0x67, 0xff, 0x00, 0x28, 0x0c, 0xd0, 0x78, 0x68, 0x00, 0x28, 0x05, 0xd1, 0x1b, 0x48, 0x00, 0x25, 0x00, 0x78, 0x08, 0xf0, 0x4b, 0xff, 0x02, 0xe0, 0x45, 0x1e, 0x78, 0x19, 0x00, 0x7a, 0xa0, 0x72, 0x02, 0x9a, 0x50, 0x69, 0x00, 0x28, 0x17, 0xd0, 0x08, 0x98, 0x01, 0x28, 0x14, 0xd0, 0xa0, 0x7a, 0x3c, 0x00, 0xf0, 0x1e, 0x00, 0x00, 0x08, 0xf0, 0x4e, 0xff, 0x00, 0x28, 0x0f, 0xd0, 0x01, 0x98, 0x00, 0x28, 0x07, 0xd0, 0x02, 0x20, 0x20, 0x72, 0x70, 0x6c, 0x80, 0x19, 0x40, 0x30, 0xc0, 0x79, 0x60, 0x72, 0x04, 0xe0, 0x7d, 0x68, 0x01, 0x3d, 0x78, 0x19, 0x00, 0x7a, 0xa0, 0x72, 0x02, 0x9a, 0xa0, 0x7a, 0x91, 0x69, 0x08, 0xf0, 0x51, 0xff, 0x20, 0x60, 0x02, 0x9a, 0x60, 0x7a, 0x91, 0x69, 0x08, 0xf0, 0x3c, 0x00, 0x2c, 0x1f, 0x00, 0x00, 0x4b, 0xff, 0x60, 0x60, 0xa0, 0x7a, 0xe0, 0x72, 0x25, 0x73, 0xfe, 0xbd, 0xd4, 0x7e, 0x01, 0x00, 0x90, 0x57, 0x01, 0x00, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x2a, 0x8c, 0xb5, 0x01, 0xd0, 0x8a, 0x22, 0x00, 0xe0, 0x88, 0x22, 0x00, 0xab, 0x1a, 0x80, 0x0c, 0xf0, 0xc2, 0xf8, 0x01, 0x90, 0x68, 0x46, 0x0b, 0xf0, 0xbc, 0xfa, 0x8c, 0xbd, 0x00, 0x00, 0x01, 0x1c, 0x08, 0x48, 0x3c, 0x00, 0x68, 0x1f, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x68, 0x00, 0x28, 0x09, 0xd0, 0x49, 0x68, 0x02, 0x20, 0x00, 0x29, 0x00, 0xd1, 0x01, 0x20, 0x01, 0x06, 0x09, 0x0e, 0x00, 0x20, 0x06, 0xf0, 0xd8, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x20, 0x67, 0x01, 0x00, 0x1c, 0xb5, 0x01, 0x90, 0x04, 0x1c, 0x44, 0x30, 0x01, 0xaa, 0x69, 0x46, 0x11, 0xf0, 0xb8, 0xfd, 0x00, 0x28, 0x0b, 0xd0, 0xa0, 0x69, 0x00, 0x21, 0x3c, 0x00, 0xa4, 0x1f, 0x00, 0x00, 0xc2, 0x07, 0xd2, 0x0f, 0x02, 0x20, 0xff, 0xf7, 0xc9, 0xff, 0x00, 0x21, 0x20, 0x1c, 0x0f, 0xf0, 0xd9, 0xfe, 0x1c, 0xbd, 0x04, 0x21, 0x98, 0x20, 0xff, 0xf7, 0x72, 0xf9, 0xf9, 0xe7, 0x00, 0x00, 0x8c, 0xb5, 0x00, 0xab, 0x84, 0x21, 0x19, 0x80, 0x05, 0x4b, 0x02, 0x1c, 0x18, 0x1c, 0x99, 0x8a, 0x0c, 0xf0, 0x8e, 0xf8, 0x01, 0x90, 0x68, 0x46, 0x0b, 0xf0, 0x7c, 0xfa, 0x3c, 0x00, 0xe0, 0x1f, 0x00, 0x00, 0x8c, 0xbd, 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x06, 0x49, 0x80, 0xb5, 0xc9, 0x68, 0x14, 0x23, 0x40, 0x31, 0x89, 0x7a, 0x04, 0x4a, 0x59, 0x43, 0x89, 0x18, 0x80, 0x00, 0x08, 0x58, 0xfe, 0xf7, 0xe9, 0xf9, 0x80, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x54, 0x47, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x20, 0xff, 0xf7, 0xd6, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0x20, 0x00, 0x00, 0x80, 0xb5, 0x12, 0x48, 0x11, 0x49, 0x80, 0x8a, 0x0a, 0x8b, 0x00, 0x21, 0x00, 0x28, 0xc2, 0xb0, 0x0c, 0xd1, 0x01, 0x2a, 0x05, 0xd0, 0x02, 0x2a, 0x15, 0xd0, 0x00, 0xab, 0x5a, 0x80, 0x0e, 0x22, 0x07, 0xe0, 0x02, 0x22, 0x00, 0xab, 0x5a, 0x80, 0x99, 0x80, 0x04, 0xe0, 0x00, 0xab, 0x5a, 0x80, 0x0d, 0x22, 0x00, 0xab, 0x9a, 0x80, 0x00, 0xab, 0x18, 0x80, 0xff, 0x20, 0x3c, 0x00, 0x58, 0x20, 0x00, 0x00, 0x98, 0x71, 0xd9, 0x71, 0x68, 0x46, 0x00, 0xf0, 0xd1, 0xf9, 0x42, 0xb0, 0x80, 0xbd, 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x10, 0xb5, 0x09, 0xf0, 0x5f, 0xfc, 0x00, 0x20, 0x05, 0xf0, 0x2a, 0xf9, 0x03, 0x4c, 0xe0, 0x8a, 0x05, 0xf0, 0x36, 0xf9, 0x20, 0x1c, 0x0f, 0xf0, 0xb3, 0xfe, 0x10, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x1c, 0xb5, 0x09, 0xf0, 0x4f, 0xfc, 0x07, 0x20, 0x3c, 0x00, 0x94, 0x20, 0x00, 0x00, 0x00, 0xab, 0x07, 0x4c, 0x18, 0x80, 0xe1, 0x8a, 0x20, 0x1c, 0x0c, 0xf0, 0x0b, 0xf8, 0x01, 0x90, 0x68, 0x46, 0x0b, 0xf0, 0x17, 0xfa, 0x20, 0x1c, 0x0f, 0xf0, 0x9e, 0xfe, 0x1c, 0xbd, 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x98, 0x20, 0xff, 0xf7, 0xf1, 0xf8, 0x80, 0xbd, 0x10, 0xb5, 0x15, 0x4c, 0xc2, 0xb0, 0xa0, 0x8a, 0x00, 0x28, 0x03, 0xd0, 0x3c, 0x00, 0xd0, 0x20, 0x00, 0x00, 0x01, 0x28, 0x1e, 0xd1, 0x02, 0x20, 0x00, 0xe0, 0x01, 0x20, 0xe1, 0x68, 0x40, 0x31, 0x88, 0x72, 0x20, 0x69, 0x08, 0xf0, 0x23, 0xfd, 0x02, 0x1c, 0x0c, 0x48, 0x18, 0x38, 0x80, 0x88, 0xe1, 0x68, 0x0f, 0xf0, 0xa4, 0xfe, 0xa0, 0x8a, 0x00, 0xab, 0x18, 0x80, 0x01, 0x20, 0x58, 0x80, 0x00, 0x20, 0x98, 0x80, 0xff, 0x21, 0x99, 0x71, 0xd8, 0x71, 0x68, 0x46, 0x00, 0xf0, 0x3c, 0x00, 0x0c, 0x21, 0x00, 0x00, 0x7b, 0xf9, 0x42, 0xb0, 0x10, 0xbd, 0x03, 0x21, 0x98, 0x20, 0xff, 0xf7, 0xc5, 0xf8, 0xf8, 0xe7, 0x70, 0x7c, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x03, 0x48, 0x0f, 0xf0, 0x60, 0xfe, 0x00, 0x20, 0x05, 0xf0, 0xcd, 0xf8, 0x80, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x48, 0x0f, 0xf0, 0x56, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x3c, 0x00, 0x48, 0x21, 0x00, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x98, 0x20, 0xff, 0xf7, 0xa9, 0xf8, 0x80, 0xbd, 0x80, 0xb5, 0x03, 0x20, 0xff, 0xf7, 0x34, 0xff, 0x80, 0xbd, 0x00, 0x00, 0xf0, 0xb5, 0x21, 0x4e, 0x00, 0x27, 0xb1, 0x8a, 0x30, 0x1c, 0x00, 0x25, 0x04, 0x24, 0x00, 0x29, 0x00, 0x8b, 0xc3, 0xb0, 0x1e, 0xd1, 0x01, 0x28, 0x07, 0xd0, 0x31, 0x1c, 0x49, 0x8b, 0x02, 0x28, 0x12, 0xd1, 0x00, 0x29, 0x3c, 0x00, 0x84, 0x21, 0x00, 0x00, 0x07, 0xd1, 0x00, 0x24, 0x05, 0xe0, 0x00, 0x24, 0x01, 0x25, 0x02, 0x20, 0x00, 0xab, 0xd8, 0x80, 0x1f, 0x81, 0x0f, 0xf0, 0x7f, 0xff, 0x00, 0x2c, 0x10, 0xd1, 0xf1, 0x68, 0x05, 0x20, 0x40, 0x31, 0x88, 0x72, 0x0e, 0xe0, 0x00, 0x29, 0x1a, 0xd1, 0x00, 0xab, 0xd8, 0x80, 0x0e, 0x20, 0x02, 0xe0, 0x00, 0xab, 0xd8, 0x80, 0x0d, 0x20, 0x00, 0xab, 0x18, 0x81, 0x07, 0xe0, 0x3c, 0x00, 0xc0, 0x21, 0x00, 0x00, 0x30, 0x1c, 0x0f, 0xf0, 0x13, 0xfe, 0x20, 0x1c, 0xff, 0xf7, 0xfc, 0xfe, 0x00, 0x2d, 0x08, 0xd0, 0xb0, 0x8a, 0x00, 0xab, 0x98, 0x80, 0xff, 0x20, 0x98, 0x72, 0xdf, 0x72, 0x01, 0xa8, 0x00, 0xf0, 0x11, 0xf9, 0x43, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x10, 0xb5, 0x00, 0x20, 0x05, 0xf0, 0x6c, 0xf8, 0x04, 0x4c, 0xe0, 0x8a, 0x05, 0xf0, 0x78, 0xf8, 0x3c, 0x00, 0xfc, 0x21, 0x00, 0x00, 0x0f, 0xf0, 0x4c, 0xff, 0x20, 0x1c, 0x0f, 0xf0, 0xf3, 0xfd, 0x10, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x04, 0x20, 0xff, 0xf7, 0xd8, 0xfe, 0x01, 0x48, 0x0f, 0xf0, 0xe9, 0xfd, 0x80, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x20, 0xff, 0xf7, 0xce, 0xfe, 0x01, 0x20, 0x05, 0xf0, 0x5f, 0xf8, 0x02, 0x48, 0x0f, 0xf0, 0xdc, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x22, 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x03, 0x20, 0xff, 0xf7, 0xc0, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x1d, 0x4d, 0xc2, 0xb0, 0x28, 0x8b, 0x00, 0xab, 0xff, 0x21, 0x58, 0x80, 0x99, 0x71, 0x00, 0x21, 0xd9, 0x71, 0xaa, 0x8a, 0x00, 0x24, 0x01, 0x2a, 0x18, 0xd1, 0x2a, 0x1c, 0x52, 0x8b, 0x02, 0x28, 0x0f, 0xd1, 0x00, 0x2a, 0x16, 0xd1, 0x03, 0x20, 0x58, 0x80, 0x3c, 0x00, 0x74, 0x22, 0x00, 0x00, 0x99, 0x80, 0x2c, 0x1c, 0xff, 0x22, 0x98, 0x1d, 0xe9, 0x69, 0xfe, 0xf7, 0x3b, 0xf9, 0xe1, 0x68, 0x04, 0x20, 0x40, 0x31, 0x88, 0x72, 0x10, 0xe0, 0x00, 0x2a, 0x06, 0xd1, 0x01, 0x24, 0x0e, 0x20, 0x01, 0xe0, 0x01, 0x24, 0x0d, 0x20, 0x00, 0xab, 0x98, 0x80, 0x28, 0x1c, 0x0f, 0xf0, 0xa4, 0xfd, 0x04, 0x20, 0xff, 0xf7, 0x8d, 0xfe, 0x00, 0x2c, 0x05, 0xd0, 0xa8, 0x8a, 0x3c, 0x00, 0xb0, 0x22, 0x00, 0x00, 0x00, 0xab, 0x18, 0x80, 0x68, 0x46, 0x00, 0xf0, 0xa5, 0xf8, 0x42, 0xb0, 0xb0, 0xbd, 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x10, 0xb5, 0x00, 0x20, 0x05, 0xf0, 0x00, 0xf8, 0x03, 0x4c, 0xe0, 0x8a, 0x05, 0xf0, 0x0c, 0xf8, 0x20, 0x1c, 0x0f, 0xf0, 0x89, 0xfd, 0x10, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x04, 0x20, 0xff, 0xf7, 0x6e, 0xfe, 0x01, 0x48, 0x0f, 0xf0, 0x3c, 0x00, 0xec, 0x22, 0x00, 0x00, 0x7f, 0xfd, 0x80, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x20, 0xff, 0xf7, 0x64, 0xfe, 0x01, 0x20, 0x04, 0xf0, 0xf5, 0xff, 0x02, 0x48, 0x0f, 0xf0, 0x72, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x03, 0x20, 0xff, 0xf7, 0x56, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x19, 0x4d, 0x04, 0x24, 0xa9, 0x8a, 0x28, 0x1c, 0x02, 0x8b, 0x3c, 0x00, 0x28, 0x23, 0x00, 0x00, 0xc2, 0xb0, 0x01, 0x29, 0x14, 0xd1, 0x40, 0x8b, 0x04, 0x2a, 0x0b, 0xd1, 0x00, 0x28, 0x00, 0xd1, 0x00, 0x24, 0x0f, 0xf0, 0xad, 0xfe, 0x00, 0x2c, 0x19, 0xd1, 0xe9, 0x68, 0x05, 0x20, 0x40, 0x31, 0x88, 0x72, 0x17, 0xe0, 0x00, 0x28, 0x10, 0xd1, 0x00, 0xab, 0x5a, 0x80, 0x0e, 0x20, 0x02, 0xe0, 0x00, 0xab, 0x5a, 0x80, 0x0d, 0x20, 0x00, 0xab, 0x98, 0x80, 0x19, 0x80, 0x3c, 0x00, 0x64, 0x23, 0x00, 0x00, 0xff, 0x20, 0x98, 0x71, 0x00, 0x20, 0xd8, 0x71, 0x68, 0x46, 0x00, 0xf0, 0x49, 0xf8, 0x42, 0xb0, 0xb0, 0xbd, 0x28, 0x1c, 0x0f, 0xf0, 0x38, 0xfd, 0x20, 0x1c, 0xff, 0xf7, 0x21, 0xfe, 0xf6, 0xe7, 0x70, 0x7c, 0x01, 0x00, 0x10, 0xb5, 0x00, 0x20, 0x04, 0xf0, 0x9e, 0xff, 0x03, 0x4c, 0xe0, 0x8a, 0x04, 0xf0, 0xaa, 0xff, 0x20, 0x1c, 0x0f, 0xf0, 0x27, 0xfd, 0x10, 0xbd, 0x3c, 0x00, 0xa0, 0x23, 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x04, 0x20, 0xff, 0xf7, 0x0c, 0xfe, 0x01, 0x48, 0x0f, 0xf0, 0x1d, 0xfd, 0x80, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x20, 0xff, 0xf7, 0x02, 0xfe, 0x01, 0x20, 0x04, 0xf0, 0x93, 0xff, 0x02, 0x48, 0x0f, 0xf0, 0x10, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0xb0, 0xb5, 0x0a, 0x4d, 0x01, 0x1c, 0x44, 0x31, 0x3c, 0x00, 0xdc, 0x23, 0x00, 0x00, 0x04, 0x1c, 0x06, 0x22, 0x28, 0x1c, 0xfe, 0xf7, 0x89, 0xf8, 0xec, 0x60, 0x20, 0x69, 0x03, 0xf0, 0x97, 0xf8, 0x01, 0x1c, 0x06, 0x22, 0xa8, 0x18, 0xfe, 0xf7, 0x80, 0xf8, 0x04, 0x20, 0xff, 0xf7, 0xf7, 0xfd, 0xb0, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x90, 0xb5, 0x04, 0x1c, 0x80, 0x88, 0x93, 0xb0, 0x00, 0x28, 0x06, 0xd0, 0x15, 0x49, 0x06, 0x22, 0x48, 0x80, 0x18, 0x31, 0x3c, 0x00, 0x18, 0x24, 0x00, 0x00, 0x88, 0x1f, 0xfe, 0xf7, 0x6d, 0xf8, 0x68, 0x46, 0x0c, 0xf0, 0x14, 0xf8, 0x20, 0x88, 0x01, 0x28, 0x08, 0xd1, 0x60, 0x88, 0x03, 0x28, 0x05, 0xd1, 0xa0, 0x88, 0x00, 0x28, 0x02, 0xd1, 0x06, 0x20, 0x0c, 0xa9, 0x08, 0x70, 0xa0, 0x79, 0x06, 0x21, 0xff, 0x28, 0x04, 0xd0, 0xe0, 0x79, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x1c, 0x08, 0x31, 0x0b, 0x20, 0x08, 0xaa, 0x50, 0x72, 0x3c, 0x00, 0x54, 0x24, 0x00, 0x00, 0x20, 0x1c, 0x08, 0xf0, 0x3b, 0xff, 0x03, 0x90, 0x68, 0x46, 0x0b, 0xf0, 0x31, 0xf8, 0x13, 0xb0, 0x90, 0xbd, 0x00, 0x00, 0x58, 0x7c, 0x01, 0x00, 0x07, 0x4b, 0x1a, 0x78, 0x82, 0x42, 0x01, 0xd0, 0x00, 0x29, 0x07, 0xd0, 0xff, 0x20, 0x18, 0x70, 0x04, 0x48, 0x01, 0x88, 0x01, 0x22, 0x52, 0x03, 0x91, 0x43, 0x01, 0x80, 0x70, 0x47, 0x00, 0x00, 0x4c, 0x7b, 0x01, 0x00, 0x3c, 0x00, 0x90, 0x24, 0x00, 0x00, 0x32, 0x80, 0x07, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x0c, 0x23, 0x07, 0x49, 0x58, 0x43, 0x40, 0x18, 0x00, 0x79, 0x0a, 0xf0, 0x4f, 0xf9, 0x01, 0x20, 0x03, 0x49, 0xa0, 0x40, 0x08, 0x39, 0x0a, 0x78, 0x10, 0x43, 0x08, 0x70, 0x10, 0xbd, 0x00, 0x00, 0x74, 0x7a, 0x01, 0x00, 0x03, 0x4a, 0x00, 0x21, 0x11, 0x54, 0x80, 0x00, 0x30, 0x32, 0x10, 0x58, 0x01, 0x70, 0x70, 0x47, 0x3c, 0x00, 0xcc, 0x24, 0x00, 0x00, 0xe0, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x05, 0x28, 0x01, 0xd3, 0xfe, 0xf7, 0x12, 0xff, 0x20, 0x1c, 0xff, 0xf7, 0xed, 0xff, 0x00, 0x21, 0x20, 0x1c, 0x0e, 0xf0, 0x89, 0xfb, 0x10, 0xbd, 0x05, 0x49, 0x80, 0xb5, 0x88, 0x60, 0x08, 0x7f, 0x24, 0x23, 0x04, 0x49, 0x58, 0x43, 0x08, 0x58, 0xfd, 0xf7, 0x6c, 0xff, 0x80, 0xbd, 0x00, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x3c, 0x00, 0x08, 0x25, 0x00, 0x00, 0x94, 0x46, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x21, 0x91, 0x20, 0xfe, 0xf7, 0xc7, 0xfe, 0x80, 0xbd, 0x02, 0x4a, 0x11, 0x68, 0x81, 0x43, 0x11, 0x60, 0x70, 0x47, 0x00, 0x00, 0x78, 0x6e, 0x01, 0x00, 0x80, 0xb5, 0xfe, 0xf7, 0xe9, 0xfe, 0x80, 0xbd, 0x80, 0xb5, 0xfe, 0xf7, 0xe5, 0xfe, 0x80, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x31, 0xfa, 0x80, 0xbd, 0x03, 0x49, 0x80, 0xb5, 0x3c, 0x00, 0x44, 0x25, 0x00, 0x00, 0x04, 0x20, 0x88, 0x60, 0x00, 0xf0, 0xd0, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x30, 0x07, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x99, 0xfa, 0x80, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x99, 0xfb, 0x80, 0xbd, 0x38, 0xb5, 0x20, 0x28, 0x15, 0xd2, 0x0d, 0x4c, 0x22, 0x1c, 0x20, 0x32, 0x95, 0x79, 0x00, 0xab, 0x1d, 0x70, 0xd2, 0x79, 0x5a, 0x70, 0x0a, 0x4b, 0x82, 0x00, 0x99, 0x50, 0x3c, 0x00, 0x80, 0x25, 0x00, 0x00, 0x01, 0x21, 0x81, 0x40, 0x08, 0x48, 0x01, 0x60, 0x42, 0x68, 0x11, 0x43, 0x41, 0x60, 0x00, 0xab, 0x18, 0x88, 0xe0, 0x84, 0x38, 0xbd, 0x01, 0x21, 0xff, 0x20, 0xfe, 0xf7, 0x83, 0xfe, 0xf9, 0xe7, 0x00, 0x10, 0x07, 0x00, 0x30, 0x74, 0x01, 0x00, 0x00, 0x40, 0x07, 0x00, 0x20, 0x28, 0x09, 0xd2, 0x05, 0x49, 0x06, 0x4b, 0x82, 0x00, 0x99, 0x50, 0x05, 0x4a, 0x51, 0x68, 0x3c, 0x00, 0xbc, 0x25, 0x00, 0x00, 0x01, 0x23, 0x83, 0x40, 0x99, 0x43, 0x51, 0x60, 0x70, 0x47, 0x00, 0x00, 0xa9, 0x75, 0x00, 0x00, 0x30, 0x74, 0x01, 0x00, 0x00, 0x40, 0x07, 0x00, 0x02, 0x4a, 0x11, 0x68, 0x08, 0x43, 0x10, 0x60, 0x70, 0x47, 0x00, 0x00, 0x78, 0x6e, 0x01, 0x00, 0x0b, 0x48, 0x01, 0x68, 0x03, 0x22, 0x12, 0x04, 0x11, 0x43, 0x01, 0x60, 0x01, 0x68, 0x07, 0x22, 0x12, 0x06, 0x91, 0x43, 0x3c, 0x00, 0xf8, 0x25, 0x00, 0x00, 0x01, 0x22, 0x52, 0x06, 0x89, 0x18, 0x01, 0x60, 0x01, 0x68, 0x12, 0x0c, 0x11, 0x43, 0x01, 0x60, 0x01, 0x68, 0x52, 0x08, 0x11, 0x43, 0x01, 0x60, 0x70, 0x47, 0x00, 0x00, 0x80, 0x00, 0x07, 0x00, 0xfe, 0xb5, 0x1c, 0x4e, 0x05, 0x1c, 0xb0, 0x8a, 0xf2, 0x68, 0x12, 0xd0, 0x01, 0x24, 0x00, 0x29, 0x09, 0xd1, 0x11, 0x6d, 0x02, 0xaa, 0x01, 0xab, 0xfe, 0xf7, 0xf8, 0xfe, 0x3c, 0x00, 0x34, 0x26, 0x00, 0x00, 0x02, 0x98, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x24, 0x0b, 0xe0, 0x01, 0xaa, 0x02, 0xa9, 0x28, 0x1c, 0xfe, 0xf7, 0x70, 0xff, 0x05, 0xe0, 0x11, 0x6d, 0x02, 0xaa, 0x00, 0x24, 0x01, 0xab, 0xfe, 0xf7, 0x01, 0xff, 0x0e, 0x49, 0x08, 0x1c, 0x20, 0x30, 0x82, 0x79, 0x00, 0xab, 0x1a, 0x70, 0xc0, 0x79, 0x58, 0x70, 0x30, 0x68, 0x00, 0x28, 0x02, 0xd1, 0x02, 0x98, 0x30, 0x60, 0x3c, 0x00, 0x70, 0x26, 0x00, 0x00, 0x02, 0xe0, 0x02, 0x98, 0x72, 0x68, 0xd0, 0x60, 0x01, 0x98, 0x00, 0xab, 0x70, 0x60, 0x18, 0x88, 0xc8, 0x84, 0xf0, 0x68, 0xc0, 0x6c, 0xf0, 0x60, 0x20, 0x1c, 0xfe, 0xbd, 0x24, 0x7e, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0x54, 0x27, 0x1d, 0x4e, 0x00, 0x20, 0x30, 0x60, 0x70, 0x60, 0x67, 0x43, 0x38, 0x04, 0x15, 0x1c, 0x00, 0x0c, 0xb1, 0x82, 0x3c, 0x00, 0xac, 0x26, 0x00, 0x00, 0xff, 0xf7, 0x96, 0xf8, 0x08, 0x21, 0x30, 0x61, 0x00, 0x26, 0x17, 0x4a, 0x14, 0xe0, 0x03, 0x1c, 0x24, 0x33, 0x42, 0x61, 0x03, 0x61, 0xc6, 0x61, 0x01, 0x83, 0x08, 0x33, 0x03, 0x60, 0xb1, 0x23, 0x43, 0x60, 0x03, 0x1c, 0x64, 0x33, 0xc3, 0x60, 0x0c, 0x23, 0x03, 0x81, 0x03, 0x1c, 0x54, 0x33, 0x4c, 0x30, 0x28, 0xc0, 0x01, 0x3c, 0x18, 0x1c, 0x00, 0x2c, 0xe8, 0xd1, 0x3c, 0x00, 0xe8, 0x26, 0x00, 0x00, 0x09, 0x4e, 0x07, 0x22, 0x30, 0x69, 0xd2, 0x43, 0xc1, 0x19, 0x50, 0x50, 0x02, 0x1c, 0x10, 0x32, 0x80, 0x39, 0x8a, 0x63, 0xf0, 0x60, 0xb0, 0x60, 0x00, 0x21, 0x00, 0x20, 0xff, 0xf7, 0x88, 0xff, 0x30, 0x69, 0xf0, 0x60, 0xb0, 0x60, 0xf8, 0xbd, 0x24, 0x7e, 0x01, 0x00, 0x91, 0x00, 0x05, 0x00, 0x01, 0x48, 0x40, 0x6a, 0x70, 0x47, 0x00, 0x00, 0xe8, 0x7d, 0x01, 0x00, 0x3c, 0x00, 0x24, 0x27, 0x00, 0x00, 0x01, 0x48, 0x00, 0x88, 0x70, 0x47, 0x00, 0x00, 0xfc, 0x6b, 0x01, 0x00, 0x06, 0x49, 0x80, 0xb5, 0x08, 0x88, 0x01, 0x30, 0x08, 0x80, 0x05, 0x49, 0x08, 0x20, 0x08, 0x60, 0x04, 0x49, 0x88, 0x69, 0x88, 0x61, 0x00, 0xf0, 0x21, 0xf8, 0x80, 0xbd, 0xfc, 0x6b, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, 0x03, 0x4a, 0x01, 0x20, 0x12, 0x1d, 0x06, 0xca, 0x3c, 0x00, 0x60, 0x27, 0x00, 0x00, 0x91, 0x42, 0x00, 0xd1, 0x00, 0x20, 0x70, 0x47, 0xe8, 0x7d, 0x01, 0x00, 0x06, 0x48, 0x00, 0xb5, 0xc0, 0x7c, 0x00, 0x28, 0x03, 0xd1, 0xff, 0xf7, 0xef, 0xff, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x20, 0x00, 0xbd, 0x00, 0x20, 0x00, 0xbd, 0x00, 0x00, 0xa0, 0x80, 0x07, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x80, 0x07, 0x02, 0xd5, 0x06, 0xf0, 0x3e, 0xfd, 0x03, 0xe0, 0xe0, 0x07, 0x3c, 0x00, 0x9c, 0x27, 0x00, 0x00, 0x01, 0xd5, 0x06, 0xf0, 0xe3, 0xfd, 0x60, 0x07, 0x01, 0xd5, 0xfe, 0xf7, 0xab, 0xfd, 0x10, 0xbd, 0x02, 0x4a, 0x01, 0x1c, 0x10, 0x68, 0x11, 0x60, 0x70, 0x47, 0x00, 0x00, 0xe8, 0x7d, 0x01, 0x00, 0x38, 0xb5, 0x20, 0x4d, 0x2c, 0x1c, 0x20, 0x34, 0xa0, 0x79, 0x00, 0xab, 0x18, 0x70, 0xe0, 0x79, 0x58, 0x70, 0xfe, 0xf7, 0x27, 0xfa, 0x00, 0xab, 0x18, 0x88, 0xe8, 0x84, 0x3c, 0x00, 0xd8, 0x27, 0x00, 0x00, 0x1a, 0x48, 0x81, 0x78, 0x08, 0x22, 0x91, 0x43, 0x81, 0x70, 0x81, 0x78, 0x11, 0x43, 0x81, 0x70, 0x17, 0x48, 0x41, 0x68, 0x80, 0x22, 0x91, 0x43, 0x41, 0x60, 0x01, 0x68, 0x11, 0x43, 0x01, 0x60, 0x00, 0x20, 0x01, 0x30, 0x64, 0x28, 0xfc, 0xd3, 0xa0, 0x79, 0x0f, 0x4d, 0x00, 0xab, 0x18, 0x70, 0xe0, 0x79, 0x10, 0x4c, 0x58, 0x70, 0x20, 0x1c, 0x10, 0x30, 0x00, 0xf0, 0x3c, 0x00, 0x14, 0x28, 0x00, 0x00, 0xdf, 0xfb, 0x00, 0x20, 0xc0, 0x43, 0xa0, 0x61, 0xff, 0xf7, 0x9c, 0xff, 0x00, 0x28, 0x09, 0xd0, 0x0a, 0x49, 0x08, 0x69, 0x01, 0x30, 0x08, 0x61, 0x00, 0x20, 0x3c, 0x31, 0x89, 0x68, 0x48, 0x63, 0x06, 0xf0, 0xee, 0xfc, 0x00, 0xab, 0x18, 0x88, 0xe8, 0x84, 0x38, 0xbd, 0x00, 0x10, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0xf4, 0x00, 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, 0x3c, 0x00, 0x50, 0x28, 0x00, 0x00, 0xe8, 0x7d, 0x01, 0x00, 0x0a, 0x48, 0x80, 0xb5, 0x00, 0x6a, 0x00, 0x28, 0x01, 0xd0, 0xfe, 0xf7, 0xc1, 0xf9, 0x07, 0x48, 0x07, 0x49, 0x3c, 0x30, 0x80, 0x68, 0x10, 0x30, 0x48, 0x61, 0x01, 0x20, 0x08, 0x61, 0x05, 0x49, 0x08, 0x68, 0x80, 0x22, 0x90, 0x43, 0x08, 0x60, 0x80, 0xbd, 0x00, 0x00, 0xe8, 0x7d, 0x01, 0x00, 0x00, 0x30, 0x07, 0x00, 0xf4, 0x00, 0x07, 0x00, 0x3c, 0x00, 0x8c, 0x28, 0x00, 0x00, 0x80, 0xb5, 0x0c, 0xf0, 0xcb, 0xfe, 0x06, 0xf0, 0xbf, 0xfc, 0x80, 0xbd, 0x01, 0x49, 0xc8, 0x62, 0x70, 0x47, 0x00, 0x00, 0xe8, 0x7d, 0x01, 0x00, 0x02, 0x4a, 0x91, 0x6a, 0x08, 0x43, 0x90, 0x62, 0x70, 0x47, 0x00, 0x00, 0xe8, 0x7d, 0x01, 0x00, 0x18, 0x23, 0x06, 0x49, 0x58, 0x43, 0x40, 0x18, 0x00, 0x21, 0x02, 0x79, 0x03, 0x68, 0x1a, 0x70, 0x01, 0x31, 0x08, 0x30, 0x3c, 0x00, 0xc8, 0x28, 0x00, 0x00, 0x03, 0x29, 0xf8, 0xd3, 0x70, 0x47, 0x00, 0x00, 0x28, 0x52, 0x01, 0x00, 0x03, 0x49, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x02, 0x48, 0x81, 0x62, 0x70, 0x47, 0x00, 0x00, 0x85, 0x75, 0x00, 0x00, 0x04, 0x6c, 0x01, 0x00, 0xf8, 0xb5, 0xff, 0xf7, 0x33, 0xff, 0x28, 0x4f, 0x00, 0x28, 0x04, 0xd0, 0xff, 0xf7, 0xc8, 0xff, 0x38, 0x6a, 0x01, 0x30, 0x38, 0x62, 0xf8, 0x6a, 0x3c, 0x00, 0x04, 0x29, 0x00, 0x00, 0x00, 0x28, 0x02, 0xd0, 0x01, 0x89, 0x04, 0x39, 0x01, 0x81, 0x38, 0x6b, 0x00, 0x25, 0x00, 0x28, 0x08, 0xd0, 0x0b, 0x20, 0x3d, 0x63, 0x10, 0xf0, 0xe5, 0xfa, 0x1e, 0x49, 0x08, 0x68, 0x21, 0x22, 0x90, 0x43, 0x08, 0x60, 0x38, 0x78, 0x3c, 0x21, 0x1b, 0x4a, 0x41, 0x43, 0x8c, 0x18, 0xff, 0x22, 0x79, 0x6a, 0x3a, 0x70, 0x00, 0x29, 0x0c, 0xd0, 0xb9, 0x69, 0x01, 0x31, 0x3c, 0x00, 0x40, 0x29, 0x00, 0x00, 0xb9, 0x61, 0x7d, 0x62, 0xbd, 0x68, 0x00, 0x2d, 0x04, 0xd0, 0x63, 0x6b, 0x7a, 0x6b, 0x00, 0x21, 0xfd, 0xf7, 0x47, 0xfd, 0xf8, 0xbd, 0x04, 0x28, 0x03, 0xd3, 0x01, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0xa1, 0xfc, 0x38, 0x69, 0x26, 0x1c, 0x01, 0x30, 0x38, 0x61, 0x20, 0x36, 0x30, 0x78, 0x02, 0x28, 0x03, 0xd0, 0x0c, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0x95, 0xfc, 0x35, 0x70, 0x3c, 0x00, 0x7c, 0x29, 0x00, 0x00, 0xa1, 0x69, 0x00, 0x29, 0xe8, 0xd0, 0x63, 0x6b, 0x30, 0x34, 0x20, 0x78, 0x0c, 0x1c, 0x00, 0x21, 0x7a, 0x6b, 0xfd, 0xf7, 0x27, 0xfd, 0xdf, 0xe7, 0x04, 0x6c, 0x01, 0x00, 0xf4, 0x00, 0x07, 0x00, 0x18, 0xdb, 0x01, 0x00, 0x10, 0xb5, 0x0b, 0x4c, 0x60, 0x6a, 0x00, 0x28, 0x0e, 0xd0, 0x0a, 0x48, 0x00, 0xf0, 0x12, 0xfb, 0x00, 0x20, 0x60, 0x62, 0xa4, 0x68, 0x00, 0x2c, 0x3c, 0x00, 0xb8, 0x29, 0x00, 0x00, 0x05, 0xd0, 0x7e, 0x23, 0xdb, 0x43, 0x00, 0x22, 0x01, 0x21, 0xfd, 0xf7, 0x0d, 0xfd, 0x10, 0xbd, 0xe0, 0x69, 0x01, 0x30, 0xe0, 0x61, 0x10, 0xbd, 0x04, 0x6c, 0x01, 0x00, 0x00, 0x30, 0x07, 0x00, 0x09, 0x48, 0x41, 0x68, 0x3f, 0x22, 0x12, 0x04, 0x91, 0x43, 0x0d, 0x22, 0x12, 0x04, 0x89, 0x18, 0x41, 0x60, 0x41, 0x68, 0x01, 0x22, 0x52, 0x02, 0x91, 0x43, 0x41, 0x60, 0x3c, 0x00, 0xf4, 0x29, 0x00, 0x00, 0x03, 0x48, 0x81, 0x78, 0x81, 0x70, 0x81, 0x78, 0x81, 0x70, 0x70, 0x47, 0x80, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0xf0, 0xb5, 0x01, 0x25, 0x08, 0x24, 0x00, 0x20, 0x0e, 0x4a, 0x0f, 0x49, 0x00, 0x26, 0x3c, 0x23, 0x43, 0x43, 0xd1, 0x52, 0x9b, 0x18, 0x5d, 0x71, 0x9b, 0x60, 0x5e, 0x61, 0x1c, 0x82, 0xc0, 0x27, 0xdf, 0x60, 0x20, 0x27, 0xfe, 0x54, 0x9e, 0x61, 0x3c, 0x00, 0x30, 0x2a, 0x00, 0x00, 0x30, 0x27, 0xfe, 0x54, 0x07, 0x4f, 0x3f, 0x18, 0x20, 0x37, 0x01, 0x30, 0x05, 0x28, 0x9f, 0x63, 0xe9, 0xd3, 0x05, 0x48, 0xff, 0x32, 0x01, 0x32, 0x90, 0x62, 0xf0, 0xbd, 0x18, 0xdb, 0x01, 0x00, 0xbe, 0xba, 0x00, 0x00, 0x30, 0x80, 0x07, 0x00, 0x06, 0x6c, 0x01, 0x00, 0x01, 0x49, 0x48, 0x60, 0x70, 0x47, 0x00, 0x00, 0x04, 0x6c, 0x01, 0x00, 0x05, 0x49, 0x08, 0x5c, 0x3c, 0x00, 0x6c, 0x2a, 0x00, 0x00, 0x05, 0x49, 0x49, 0x68, 0x40, 0x18, 0xc0, 0x06, 0xc0, 0x0e, 0x04, 0x49, 0x20, 0x30, 0x48, 0x72, 0x70, 0x47, 0x00, 0x00, 0xa0, 0x57, 0x01, 0x00, 0x04, 0x6c, 0x01, 0x00, 0x00, 0x80, 0x07, 0x00, 0x80, 0xb5, 0x15, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0x07, 0xfc, 0x80, 0xbd, 0xf8, 0xb5, 0x43, 0x48, 0x84, 0x68, 0x03, 0x34, 0x42, 0x4d, 0x04, 0xe0, 0x20, 0x1c, 0x10, 0xf0, 0x3c, 0x00, 0xa8, 0x2a, 0x00, 0x00, 0xb9, 0xf8, 0x00, 0x28, 0x71, 0xd1, 0x28, 0x69, 0xc0, 0x07, 0xf7, 0xd5, 0x3e, 0x48, 0x28, 0x60, 0x3e, 0x4a, 0x14, 0x1c, 0x20, 0x34, 0x20, 0x79, 0x00, 0x90, 0x3c, 0x23, 0x3c, 0x49, 0x58, 0x43, 0x45, 0x18, 0x28, 0x79, 0xff, 0xf7, 0xcc, 0xff, 0x28, 0x1c, 0x3a, 0x49, 0x08, 0x30, 0x48, 0x60, 0x01, 0x26, 0x08, 0x1c, 0x06, 0x60, 0x68, 0x6a, 0x00, 0x28, 0x0d, 0xd0, 0x3c, 0x00, 0xe4, 0x2a, 0x00, 0x00, 0xa9, 0x6a, 0x92, 0x6a, 0x35, 0x4b, 0x9f, 0x68, 0xd7, 0x1b, 0x1a, 0x68, 0x51, 0x18, 0x79, 0x18, 0x8a, 0x42, 0x5a, 0x68, 0x00, 0xd8, 0x00, 0xe0, 0x01, 0x32, 0x06, 0xc0, 0xe8, 0x6a, 0xfe, 0xf7, 0x87, 0xff, 0x2d, 0x49, 0xe8, 0x6a, 0x48, 0x60, 0x30, 0x1c, 0x0e, 0x60, 0x66, 0x79, 0x1f, 0xe0, 0x2b, 0x48, 0x46, 0x61, 0x04, 0x7f, 0x29, 0x49, 0x20, 0x1c, 0x50, 0x39, 0x3c, 0x00, 0x20, 0x2b, 0x00, 0x00, 0x89, 0x6a, 0xfd, 0xf7, 0x5a, 0xfc, 0x00, 0x98, 0x84, 0x42, 0x10, 0xd0, 0x3c, 0x20, 0x22, 0x49, 0x60, 0x43, 0x40, 0x18, 0x87, 0x69, 0x00, 0x2f, 0x09, 0xd0, 0x00, 0x21, 0x20, 0x30, 0x01, 0x70, 0x7e, 0x23, 0xdb, 0x43, 0x02, 0x21, 0x00, 0x22, 0x20, 0x1c, 0xfd, 0xf7, 0x4c, 0xfc, 0x01, 0x20, 0xa0, 0x40, 0x86, 0x43, 0x00, 0x2e, 0xdd, 0xd1, 0xe9, 0x69, 0x00, 0x29, 0x3c, 0x00, 0x5c, 0x2b, 0x00, 0x00, 0x03, 0xd0, 0x30, 0x20, 0x40, 0x5d, 0xfd, 0xf7, 0x3a, 0xfc, 0x16, 0x4c, 0x50, 0x3c, 0x60, 0x6a, 0x00, 0x28, 0x03, 0xd0, 0x0a, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0x96, 0xfb, 0x20, 0x35, 0x28, 0x78, 0x01, 0x28, 0x03, 0xd0, 0x0b, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0x8e, 0xfb, 0x02, 0x20, 0x28, 0x70, 0xe0, 0x68, 0x01, 0x30, 0x00, 0xe0, 0x07, 0xe0, 0xe0, 0x60, 0x00, 0x98, 0x3c, 0x00, 0x98, 0x2b, 0x00, 0x00, 0x20, 0x70, 0x00, 0x98, 0x60, 0x70, 0x0a, 0x48, 0x00, 0x68, 0x60, 0x63, 0xf8, 0xbd, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x40, 0x07, 0x00, 0x01, 0x00, 0x00, 0x01, 0x30, 0x80, 0x07, 0x00, 0x18, 0xdb, 0x01, 0x00, 0x00, 0x30, 0x07, 0x00, 0x54, 0x6c, 0x01, 0x00, 0x00, 0xa0, 0x07, 0x00, 0x78, 0x6e, 0x01, 0x00, 0x3c, 0x22, 0x3c, 0x23, 0x4a, 0x43, 0x09, 0x49, 0x3c, 0x00, 0xd4, 0x2b, 0x00, 0x00, 0xb0, 0xb5, 0x54, 0x18, 0x58, 0x43, 0x45, 0x18, 0x21, 0x1c, 0x38, 0x22, 0x28, 0x1c, 0xfd, 0xf7, 0xe5, 0xfc, 0xa0, 0x6b, 0x00, 0x78, 0xa9, 0x6b, 0x08, 0x70, 0x00, 0x20, 0x20, 0x34, 0x20, 0x70, 0xb0, 0xbd, 0x00, 0x00, 0x18, 0xdb, 0x01, 0x00, 0x3c, 0x23, 0x07, 0x49, 0x58, 0x43, 0x10, 0xb5, 0x44, 0x18, 0x20, 0x34, 0x20, 0x78, 0x02, 0x28, 0x03, 0xd1, 0x0d, 0x21, 0x3c, 0x00, 0x10, 0x2c, 0x00, 0x00, 0x84, 0x20, 0xfe, 0xf7, 0x47, 0xfb, 0x00, 0x20, 0x20, 0x70, 0x10, 0xbd, 0x18, 0xdb, 0x01, 0x00, 0xff, 0xb5, 0x3c, 0x20, 0x48, 0x43, 0x1a, 0x49, 0x81, 0xb0, 0x44, 0x18, 0x26, 0x1c, 0x20, 0x36, 0x30, 0x78, 0x15, 0x1c, 0x0f, 0x9f, 0x02, 0x28, 0x03, 0xd1, 0x04, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0x31, 0xfb, 0x01, 0x20, 0x30, 0x70, 0x25, 0x71, 0x0b, 0x99, 0x30, 0x22, 0x3c, 0x00, 0x4c, 0x2c, 0x00, 0x00, 0x61, 0x80, 0x0a, 0x99, 0xe1, 0x62, 0x0d, 0x99, 0xa1, 0x61, 0x0c, 0x99, 0xe1, 0x61, 0x0e, 0x99, 0x61, 0x62, 0xa7, 0x62, 0x01, 0x99, 0x11, 0x55, 0x7e, 0x21, 0xc9, 0x43, 0x61, 0x63, 0x04, 0x99, 0x00, 0x29, 0x00, 0xd1, 0x00, 0x20, 0x06, 0x1c, 0x28, 0x1c, 0x08, 0xf0, 0x8b, 0xf8, 0x00, 0x28, 0x01, 0xd0, 0x02, 0x20, 0x00, 0xe0, 0x00, 0x20, 0xa1, 0x6b, 0x30, 0x43, 0x3c, 0x00, 0x88, 0x2c, 0x00, 0x00, 0x08, 0x70, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0x18, 0xdb, 0x01, 0x00, 0x80, 0xb5, 0x14, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0x03, 0xfb, 0x80, 0xbd, 0x01, 0x48, 0x40, 0x78, 0x70, 0x47, 0x00, 0x00, 0x04, 0x6c, 0x01, 0x00, 0x02, 0x48, 0x00, 0x69, 0xc0, 0x07, 0xc0, 0x0f, 0x70, 0x47, 0x00, 0x00, 0x00, 0x40, 0x07, 0x00, 0x01, 0x1c, 0x3c, 0x23, 0x04, 0x4a, 0x59, 0x43, 0x3c, 0x00, 0xc4, 0x2c, 0x00, 0x00, 0x89, 0x18, 0x20, 0x31, 0x09, 0x78, 0x01, 0x20, 0x00, 0x29, 0x00, 0xd0, 0x00, 0x20, 0x70, 0x47, 0x18, 0xdb, 0x01, 0x00, 0x08, 0x48, 0x40, 0x6a, 0x00, 0x28, 0x0a, 0xd1, 0x07, 0x4a, 0x00, 0x21, 0x20, 0x23, 0x9b, 0x5c, 0x02, 0x2b, 0x04, 0xd0, 0x01, 0x31, 0x3c, 0x32, 0x05, 0x29, 0xf7, 0xd3, 0x70, 0x47, 0x01, 0x20, 0x70, 0x47, 0x00, 0x00, 0x04, 0x6c, 0x01, 0x00, 0x3c, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x18, 0xdb, 0x01, 0x00, 0xf8, 0xb5, 0x0e, 0x1c, 0x04, 0x1c, 0x17, 0x1c, 0xfe, 0xf7, 0x82, 0xfe, 0x20, 0x1c, 0x11, 0x4c, 0x60, 0x60, 0x01, 0x20, 0x20, 0x60, 0x10, 0x4d, 0x68, 0x69, 0x01, 0x30, 0x68, 0x61, 0x68, 0x6a, 0x00, 0x28, 0x03, 0xd0, 0x07, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0xba, 0xfa, 0xa0, 0x68, 0x40, 0x07, 0x03, 0xd5, 0x06, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0x3c, 0x00, 0x3c, 0x2d, 0x00, 0x00, 0xb3, 0xfa, 0x08, 0x48, 0x00, 0x69, 0x00, 0x28, 0x03, 0xda, 0xaa, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0xab, 0xfa, 0x02, 0x20, 0x68, 0x62, 0xae, 0x60, 0x2f, 0x70, 0xf8, 0xbd, 0x00, 0x30, 0x07, 0x00, 0x04, 0x6c, 0x01, 0x00, 0x00, 0x40, 0x07, 0x00, 0x04, 0x4a, 0x51, 0x80, 0x10, 0x71, 0x03, 0x48, 0x03, 0x49, 0x08, 0x30, 0x48, 0x60, 0x01, 0x20, 0x08, 0x60, 0x70, 0x47, 0x3c, 0x00, 0x78, 0x2d, 0x00, 0x00, 0x3c, 0x6c, 0x01, 0x00, 0x00, 0x30, 0x07, 0x00, 0x00, 0x21, 0x00, 0x23, 0x05, 0xe0, 0x02, 0x89, 0x43, 0x60, 0xc0, 0x68, 0x51, 0x18, 0x09, 0x04, 0x09, 0x0c, 0x00, 0x28, 0xf7, 0xd1, 0x04, 0x31, 0x08, 0x04, 0x00, 0x0c, 0x70, 0x47, 0x00, 0x00, 0x02, 0x4a, 0x51, 0x6b, 0x08, 0x43, 0x50, 0x63, 0x70, 0x47, 0x00, 0x00, 0x04, 0x6c, 0x01, 0x00, 0x38, 0xb5, 0x0a, 0x4c, 0x3c, 0x00, 0xb4, 0x2d, 0x00, 0x00, 0x22, 0x1c, 0x20, 0x32, 0x95, 0x79, 0x00, 0xab, 0x1d, 0x70, 0xd2, 0x79, 0x5a, 0x70, 0x03, 0x68, 0x40, 0x68, 0x06, 0x4a, 0x50, 0x65, 0x05, 0x48, 0x13, 0x65, 0x50, 0x30, 0x81, 0x60, 0x00, 0xab, 0x18, 0x88, 0xe0, 0x84, 0x38, 0xbd, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x04, 0x6c, 0x01, 0x00, 0x98, 0xb5, 0x0d, 0x4c, 0x20, 0x1c, 0x20, 0x30, 0x81, 0x79, 0x00, 0xab, 0x3c, 0x00, 0xf0, 0x2d, 0x00, 0x00, 0x19, 0x70, 0xc0, 0x79, 0x58, 0x70, 0x0a, 0x48, 0x00, 0xf0, 0xec, 0xf8, 0x09, 0x49, 0x00, 0x20, 0x48, 0x62, 0xff, 0xf7, 0x69, 0xff, 0x00, 0x28, 0x03, 0xd0, 0x12, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0x49, 0xfa, 0x00, 0xab, 0x18, 0x88, 0xe0, 0x84, 0x98, 0xbd, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, 0x04, 0x6c, 0x01, 0x00, 0x03, 0x48, 0x01, 0x7a, 0x3c, 0x00, 0x2c, 0x2e, 0x00, 0x00, 0xfe, 0x22, 0x91, 0x43, 0x0a, 0x31, 0x01, 0x72, 0x70, 0x47, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x90, 0xb5, 0x0e, 0x4c, 0x85, 0xb0, 0xa0, 0x78, 0x02, 0x28, 0x14, 0xd1, 0x03, 0x20, 0xa0, 0x70, 0x0b, 0x49, 0x00, 0x20, 0x00, 0x22, 0x04, 0x92, 0x02, 0x90, 0x03, 0x91, 0xe1, 0x88, 0x01, 0x22, 0x01, 0x92, 0x00, 0x91, 0x61, 0x78, 0x20, 0x78, 0x22, 0x69, 0xe3, 0x68, 0x3c, 0x00, 0x68, 0x2e, 0x00, 0x00, 0x08, 0xf0, 0x94, 0xfd, 0x04, 0x48, 0x09, 0xf0, 0x7f, 0xf9, 0x05, 0xb0, 0x90, 0xbd, 0x00, 0x00, 0xb4, 0x79, 0x01, 0x00, 0xad, 0xb6, 0x00, 0x00, 0x71, 0xb6, 0x00, 0x00, 0xb0, 0xb5, 0x0c, 0x4d, 0xac, 0x79, 0x0c, 0x49, 0x09, 0x78, 0x00, 0x29, 0x03, 0xd0, 0x01, 0x29, 0x0e, 0xd0, 0x02, 0x29, 0x08, 0xd1, 0xc2, 0x88, 0x00, 0x2a, 0x09, 0xd0, 0x01, 0x23, 0x81, 0x68, 0x3c, 0x00, 0xa4, 0x2e, 0x00, 0x00, 0x02, 0x20, 0x0f, 0xf0, 0xc1, 0xf8, 0x03, 0xe0, 0x02, 0x21, 0x86, 0x20, 0xfe, 0xf7, 0xf8, 0xf9, 0xac, 0x71, 0xb0, 0xbd, 0x20, 0x10, 0x07, 0x00, 0xa0, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x68, 0x07, 0x49, 0x4a, 0x60, 0x03, 0x79, 0xca, 0x78, 0xcb, 0x70, 0x00, 0x79, 0x90, 0x42, 0x06, 0xd0, 0x03, 0x48, 0x14, 0x30, 0x00, 0x89, 0x07, 0xf0, 0x27, 0xfe, 0x06, 0xf0, 0x3c, 0x00, 0xe0, 0x2e, 0x00, 0x00, 0xab, 0xfa, 0x80, 0xbd, 0x84, 0x66, 0x01, 0x00, 0x70, 0xb5, 0x16, 0x4c, 0x15, 0x4d, 0xa0, 0x78, 0x00, 0x26, 0x98, 0x3d, 0x01, 0x28, 0x03, 0xd1, 0x28, 0x69, 0x08, 0xf0, 0xfb, 0xfc, 0xa6, 0x70, 0x60, 0x68, 0x01, 0x28, 0x03, 0xd0, 0x00, 0x21, 0x28, 0x69, 0x00, 0xf0, 0xff, 0xfb, 0x0e, 0x48, 0x29, 0x69, 0x0c, 0xf0, 0x31, 0xfa, 0x01, 0x20, 0x0c, 0xf0, 0xe4, 0xf8, 0x3c, 0x00, 0x1c, 0x2f, 0x00, 0x00, 0xe0, 0x78, 0x01, 0x28, 0x02, 0xd0, 0x01, 0x20, 0x60, 0x70, 0x00, 0xe0, 0x66, 0x70, 0x06, 0x48, 0x14, 0x30, 0x41, 0x68, 0x01, 0x29, 0x06, 0xd1, 0x06, 0x60, 0x41, 0x6f, 0x00, 0x29, 0x02, 0xd0, 0x00, 0x20, 0xfd, 0xf7, 0x4c, 0xfa, 0x70, 0xbd, 0x84, 0x66, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x30, 0xb5, 0x00, 0x22, 0x00, 0x23, 0x01, 0x25, 0x2c, 0x1c, 0x94, 0x40, 0x3c, 0x00, 0x58, 0x2f, 0x00, 0x00, 0x04, 0x40, 0x01, 0xd0, 0xca, 0x54, 0x01, 0x33, 0x01, 0x32, 0x0e, 0x2a, 0xf6, 0xdb, 0x18, 0x1c, 0x30, 0xbd, 0x00, 0x00, 0xff, 0xb5, 0x01, 0x27, 0x00, 0x26, 0x05, 0x1c, 0x02, 0x20, 0x81, 0xb0, 0x00, 0x90, 0x00, 0x2d, 0x18, 0xd0, 0x28, 0x78, 0xff, 0x28, 0x15, 0xd0, 0x00, 0x24, 0x10, 0xe0, 0x28, 0x19, 0x80, 0x78, 0x0a, 0x99, 0x00, 0x29, 0x01, 0xd0, 0x01, 0x06, 0x3c, 0x00, 0x94, 0x2f, 0x00, 0x00, 0x08, 0xd5, 0x07, 0xf0, 0xe9, 0xfe, 0x0e, 0x28, 0x03, 0xd0, 0x01, 0x21, 0x81, 0x40, 0x0e, 0x43, 0x00, 0xe0, 0x00, 0x27, 0x01, 0x34, 0x68, 0x78, 0xa0, 0x42, 0xeb, 0xdc, 0x00, 0x98, 0x02, 0x9d, 0x01, 0x38, 0x00, 0x90, 0xdf, 0xd1, 0x03, 0x98, 0x31, 0x1c, 0x81, 0x43, 0x02, 0xd0, 0x03, 0x98, 0x06, 0x40, 0x00, 0x27, 0x04, 0x98, 0x06, 0x60, 0x05, 0xb0, 0x38, 0x1c, 0x3c, 0x00, 0xd0, 0x2f, 0x00, 0x00, 0xf0, 0xbd, 0x00, 0x00, 0x02, 0x21, 0x01, 0x60, 0x64, 0x21, 0x01, 0xe0, 0x01, 0x39, 0x02, 0xd0, 0x02, 0x68, 0x92, 0x07, 0xfa, 0xd4, 0x01, 0x20, 0x00, 0x29, 0x00, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x10, 0xb5, 0x00, 0x20, 0xc4, 0x43, 0x05, 0x4b, 0x02, 0x22, 0x01, 0x01, 0x5a, 0x50, 0xc9, 0x18, 0x8c, 0x60, 0x01, 0x30, 0x08, 0x28, 0xf8, 0xdb, 0x10, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x30, 0x07, 0x00, 0xf0, 0xb5, 0x05, 0x1c, 0x60, 0x35, 0xc7, 0x6a, 0x04, 0x1c, 0x28, 0x7b, 0x00, 0x2f, 0x8b, 0xb0, 0x15, 0xd0, 0x08, 0x28, 0x15, 0xd2, 0x02, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x00, 0x07, 0x04, 0x04, 0x07, 0x09, 0x09, 0x0c, 0x0c, 0x01, 0x26, 0x00, 0x21, 0x09, 0xe0, 0x00, 0x26, 0x06, 0xe0, 0x02, 0x26, 0x02, 0x21, 0x04, 0xe0, 0x3c, 0x00, 0x48, 0x30, 0x00, 0x00, 0x03, 0x26, 0x03, 0x21, 0x01, 0xe0, 0x04, 0x26, 0x01, 0x21, 0x8c, 0x22, 0x12, 0x59, 0x07, 0x91, 0x26, 0x49, 0x06, 0x90, 0x04, 0x91, 0x00, 0x20, 0x03, 0x90, 0x05, 0x97, 0x08, 0x92, 0xe0, 0x69, 0x22, 0x69, 0x21, 0x1c, 0x70, 0x31, 0x01, 0x91, 0x21, 0x49, 0x00, 0x90, 0x70, 0x00, 0x40, 0x18, 0x60, 0x30, 0x02, 0x92, 0x03, 0x88, 0x59, 0x1c, 0x01, 0x80, 0x1e, 0x48, 0x3c, 0x00, 0x84, 0x30, 0x00, 0x00, 0x02, 0x88, 0xa1, 0x68, 0x0a, 0xa8, 0x09, 0xf0, 0xe1, 0xff, 0x60, 0x60, 0xe8, 0x7a, 0xa1, 0x6a, 0xc9, 0x07, 0x00, 0x07, 0x00, 0x0e, 0xc9, 0x0d, 0x08, 0x43, 0x61, 0x6a, 0x22, 0x69, 0xc9, 0x07, 0x89, 0x0d, 0x01, 0x43, 0x01, 0x20, 0x00, 0x2a, 0x00, 0xd1, 0x00, 0x20, 0x80, 0x03, 0x08, 0x43, 0x21, 0x6a, 0xc9, 0x03, 0x08, 0x43, 0x08, 0x21, 0x08, 0x43, 0x0a, 0x99, 0x3c, 0x00, 0xc0, 0x30, 0x00, 0x00, 0x08, 0x80, 0x20, 0x1c, 0xfe, 0xf7, 0x98, 0xfe, 0x20, 0x69, 0x00, 0x28, 0x04, 0xd1, 0x20, 0x1c, 0x0a, 0xf0, 0x82, 0xf9, 0x0b, 0xb0, 0xf0, 0xbd, 0x80, 0x79, 0x06, 0x28, 0x01, 0xd9, 0xfe, 0xf7, 0x0f, 0xf9, 0x20, 0x69, 0x06, 0x49, 0x80, 0x79, 0x80, 0x00, 0x09, 0x58, 0x20, 0x1c, 0xfd, 0xf7, 0x74, 0xf9, 0xef, 0xe7, 0x79, 0x2f, 0x01, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x3c, 0x00, 0xfc, 0x30, 0x00, 0x00, 0x08, 0x61, 0x01, 0x00, 0x74, 0x57, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x58, 0x30, 0x8a, 0xb0, 0x0e, 0xf0, 0x7c, 0xfe, 0x22, 0x1c, 0x80, 0x32, 0x51, 0x68, 0x00, 0x29, 0x01, 0xd0, 0x11, 0x7a, 0x07, 0xe0, 0x00, 0x28, 0x04, 0xd0, 0x80, 0x69, 0x80, 0x07, 0x01, 0xd5, 0x03, 0x21, 0x00, 0xe0, 0x01, 0x21, 0xd2, 0x68, 0x07, 0x91, 0x22, 0x49, 0x00, 0x20, 0x08, 0x92, 0x3c, 0x00, 0x38, 0x31, 0x00, 0x00, 0x04, 0x91, 0x00, 0x22, 0x05, 0x92, 0x06, 0x90, 0x03, 0x90, 0xe0, 0x69, 0x22, 0x69, 0x00, 0x90, 0x21, 0x1c, 0x70, 0x31, 0x1c, 0x48, 0x01, 0x91, 0x02, 0x92, 0x03, 0x89, 0x59, 0x1c, 0x01, 0x81, 0x1a, 0x48, 0x02, 0x88, 0xa1, 0x68, 0x09, 0xa8, 0x09, 0xf0, 0x76, 0xff, 0x60, 0x60, 0x6b, 0x20, 0x00, 0x5d, 0xa1, 0x6a, 0x22, 0x69, 0xc9, 0x07, 0x00, 0x07, 0x00, 0x0e, 0x3c, 0x00, 0x74, 0x31, 0x00, 0x00, 0xc9, 0x0d, 0x01, 0x43, 0x01, 0x20, 0x00, 0x2a, 0x00, 0xd1, 0x00, 0x20, 0x80, 0x03, 0x08, 0x43, 0x09, 0x99, 0x08, 0x80, 0x20, 0x1c, 0xfe, 0xf7, 0x35, 0xfe, 0x20, 0x69, 0x00, 0x28, 0x04, 0xd1, 0x20, 0x1c, 0x0a, 0xf0, 0x1f, 0xf9, 0x0a, 0xb0, 0x10, 0xbd, 0x80, 0x79, 0x06, 0x28, 0x01, 0xd9, 0xfe, 0xf7, 0xac, 0xf8, 0x20, 0x69, 0x07, 0x49, 0x80, 0x79, 0x80, 0x00, 0x3c, 0x00, 0xb0, 0x31, 0x00, 0x00, 0x09, 0x58, 0x20, 0x1c, 0xfd, 0xf7, 0x11, 0xf9, 0xef, 0xe7, 0x00, 0x00, 0xbd, 0x2f, 0x01, 0x00, 0x24, 0x6a, 0x01, 0x00, 0x08, 0x61, 0x01, 0x00, 0x74, 0x57, 0x01, 0x00, 0x3e, 0xb5, 0x05, 0x1c, 0x00, 0x69, 0x04, 0x21, 0x07, 0xf0, 0xd2, 0xfa, 0x00, 0x28, 0x09, 0xd0, 0x42, 0x78, 0x02, 0x32, 0x01, 0x1c, 0x68, 0x46, 0xfd, 0xf7, 0x88, 0xf9, 0xe8, 0x6a, 0x6c, 0x46, 0x3c, 0x00, 0xec, 0x31, 0x00, 0x00, 0x02, 0x90, 0x00, 0xe0, 0x00, 0x24, 0x28, 0x1c, 0x14, 0x30, 0x02, 0xf0, 0x03, 0xfb, 0x00, 0x28, 0x04, 0xd0, 0x21, 0x1c, 0x28, 0x1c, 0x05, 0xf0, 0xa5, 0xfe, 0x3e, 0xbd, 0x00, 0x2c, 0xfc, 0xd0, 0x02, 0x49, 0x20, 0x1c, 0x49, 0x69, 0xfd, 0xf7, 0xe2, 0xf8, 0xf6, 0xe7, 0x44, 0x7d, 0x01, 0x00, 0x70, 0xb5, 0x1e, 0x1c, 0x18, 0x23, 0x58, 0x43, 0x06, 0x4b, 0x04, 0x9d, 0x3c, 0x00, 0x28, 0x32, 0x00, 0x00, 0x19, 0x50, 0xc4, 0x18, 0x00, 0x20, 0x60, 0x61, 0x62, 0x60, 0xa6, 0x60, 0xe5, 0x60, 0x0f, 0xf0, 0xb9, 0xfd, 0x20, 0x61, 0x70, 0xbd, 0x00, 0x00, 0xb8, 0x7d, 0x01, 0x00, 0x02, 0x4a, 0x01, 0x1c, 0x90, 0x69, 0x91, 0x61, 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x01, 0x48, 0x40, 0x6b, 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x04, 0x49, 0x04, 0x4b, 0x3c, 0x00, 0x64, 0x32, 0x00, 0x00, 0xca, 0x68, 0x09, 0x69, 0x5c, 0x3b, 0x5b, 0x68, 0xc9, 0x1a, 0x41, 0x43, 0x50, 0x18, 0x70, 0x47, 0xa0, 0x7d, 0x01, 0x00, 0x01, 0x48, 0x00, 0x78, 0x70, 0x47, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x80, 0xb5, 0x06, 0x22, 0x01, 0x49, 0xfd, 0xf7, 0x35, 0xf9, 0x80, 0xbd, 0xfe, 0x67, 0x01, 0x00, 0xf0, 0xb5, 0x89, 0xb0, 0x00, 0x93, 0x16, 0x4f, 0x13, 0x1c, 0x0e, 0x1c, 0x3c, 0x00, 0xa0, 0x32, 0x00, 0x00, 0x04, 0x1c, 0x3a, 0x1c, 0x01, 0xf0, 0x62, 0xff, 0x01, 0xa9, 0x06, 0xa8, 0xa2, 0x68, 0x02, 0xf0, 0x0b, 0xf9, 0x01, 0xaa, 0x06, 0xa9, 0x38, 0x1c, 0x63, 0x6a, 0x02, 0xf0, 0x81, 0xfc, 0x05, 0x1c, 0x01, 0x28, 0x14, 0xd1, 0x0c, 0x48, 0xfc, 0x21, 0xc8, 0x51, 0x38, 0x1c, 0x02, 0xf0, 0x0c, 0xf8, 0x03, 0x21, 0x30, 0x1c, 0x07, 0xf0, 0x52, 0xfa, 0x00, 0x28, 0x07, 0xd0, 0x3c, 0x00, 0xdc, 0x32, 0x00, 0x00, 0x80, 0x78, 0x00, 0xf0, 0x33, 0xfc, 0x20, 0x1c, 0x10, 0x30, 0x0e, 0xf0, 0x47, 0xfd, 0x00, 0xe0, 0x00, 0x25, 0x28, 0x1c, 0x09, 0xb0, 0xf0, 0xbd, 0xf4, 0x67, 0x01, 0x00, 0xc1, 0x38, 0x00, 0x00, 0x10, 0xb5, 0x07, 0x4c, 0x06, 0x48, 0x06, 0x22, 0x21, 0x1d, 0x08, 0x38, 0xfd, 0xf7, 0xf6, 0xf8, 0x01, 0xf0, 0xfc, 0xff, 0x00, 0xf0, 0x42, 0xfc, 0x20, 0x1c, 0x02, 0xf0, 0x3c, 0x00, 0x18, 0x33, 0x00, 0x00, 0x27, 0xfc, 0x10, 0xbd, 0xf4, 0x67, 0x01, 0x00, 0x08, 0x49, 0xc9, 0x68, 0x00, 0x29, 0x0a, 0xd0, 0x06, 0x4a, 0x01, 0x32, 0x51, 0x78, 0x12, 0x78, 0x48, 0x43, 0x00, 0x2a, 0x01, 0xd1, 0x08, 0x18, 0x70, 0x47, 0x10, 0x18, 0x70, 0x47, 0x01, 0x30, 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x04, 0x4b, 0x05, 0x49, 0x00, 0x28, 0x5a, 0x69, 0x00, 0xd0, 0x01, 0x1c, 0x3c, 0x00, 0x54, 0x33, 0x00, 0x00, 0x10, 0x1c, 0x59, 0x61, 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0xb9, 0x75, 0x00, 0x00, 0x07, 0x49, 0x00, 0x20, 0x0a, 0x78, 0x02, 0x2a, 0x09, 0xd1, 0x0a, 0x7c, 0x00, 0x2a, 0x05, 0xd1, 0xca, 0x68, 0x00, 0x2a, 0x03, 0xd0, 0x49, 0x69, 0x00, 0x29, 0x00, 0xd0, 0x01, 0x20, 0x70, 0x47, 0x78, 0x69, 0x01, 0x00, 0x0c, 0x4a, 0x80, 0xb5, 0x01, 0x21, 0x51, 0x60, 0x3c, 0x00, 0x90, 0x33, 0x00, 0x00, 0x09, 0xf0, 0x6a, 0xf8, 0x09, 0x48, 0x1c, 0x30, 0x81, 0x69, 0x00, 0x29, 0x07, 0xd0, 0x00, 0x23, 0x83, 0x61, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, 0xf0, 0xd2, 0xf8, 0x80, 0xbd, 0x00, 0x22, 0x00, 0x21, 0x03, 0x48, 0x00, 0xf0, 0x5c, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x5c, 0x69, 0x01, 0x00, 0x51, 0x35, 0x00, 0x00, 0xb0, 0xb5, 0x0c, 0x1c, 0x01, 0x28, 0x16, 0xd1, 0x3c, 0x00, 0xcc, 0x33, 0x00, 0x00, 0x0e, 0x4d, 0x02, 0x2c, 0x09, 0xd1, 0x00, 0xf0, 0x2b, 0xfa, 0x00, 0x28, 0x0e, 0xd0, 0x68, 0x69, 0x00, 0x28, 0x0b, 0xd1, 0x21, 0x1c, 0x13, 0x20, 0x0c, 0xe0, 0x03, 0x2c, 0xfa, 0xd1, 0x00, 0xf0, 0xf9, 0xf9, 0x00, 0x28, 0x02, 0xd0, 0x28, 0x7c, 0x00, 0x28, 0xf3, 0xd0, 0xb0, 0xbd, 0x21, 0x1c, 0x00, 0x06, 0x00, 0x0e, 0x04, 0xf0, 0x62, 0xfc, 0xb0, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x08, 0x34, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0xb0, 0xb5, 0x0c, 0x4c, 0x00, 0x25, 0x25, 0x74, 0x65, 0x61, 0xe5, 0x60, 0x00, 0xf0, 0x3c, 0xfa, 0x00, 0xf0, 0x34, 0xfa, 0x07, 0x48, 0x1c, 0x38, 0x05, 0x61, 0x09, 0xf0, 0x33, 0xff, 0x20, 0x78, 0x00, 0x28, 0x02, 0xd1, 0x04, 0xf0, 0x6e, 0xfa, 0xb0, 0xbd, 0x02, 0x28, 0xfc, 0xd1, 0x04, 0xf0, 0xa5, 0xfb, 0xb0, 0xbd, 0x78, 0x69, 0x01, 0x00, 0x3c, 0x00, 0x44, 0x34, 0x00, 0x00, 0x0c, 0x48, 0x80, 0xb5, 0x01, 0x78, 0x00, 0x29, 0x12, 0xd0, 0xc0, 0x68, 0x00, 0x28, 0x0f, 0xd1, 0x08, 0x48, 0x1c, 0x38, 0x40, 0x69, 0x00, 0x28, 0x0a, 0xd1, 0x07, 0x48, 0x00, 0x68, 0x00, 0x28, 0x06, 0xd0, 0x00, 0x22, 0x07, 0x21, 0x10, 0x20, 0x10, 0xf0, 0xa0, 0xf9, 0x02, 0xf0, 0x2c, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0xd4, 0x67, 0x01, 0x00, 0x3c, 0x00, 0x80, 0x34, 0x00, 0x00, 0xf8, 0xb5, 0x1d, 0x4e, 0x1c, 0x4d, 0x04, 0x1c, 0xf0, 0x68, 0x02, 0x27, 0x1c, 0x3d, 0x00, 0x28, 0x07, 0xd0, 0xe8, 0x68, 0x00, 0x28, 0x04, 0xd0, 0xfd, 0xf7, 0xc2, 0xfe, 0x00, 0x28, 0x00, 0xd0, 0xbc, 0x43, 0x00, 0x2c, 0x14, 0xd0, 0x37, 0x70, 0xf0, 0x68, 0x14, 0x4f, 0x00, 0x28, 0x10, 0xd0, 0xe0, 0x07, 0x17, 0xd4, 0xfd, 0xf7, 0xb4, 0xfe, 0x00, 0x28, 0x13, 0xd0, 0x3c, 0x00, 0xbc, 0x34, 0x00, 0x00, 0x70, 0x69, 0x00, 0x28, 0x06, 0xd1, 0xe8, 0x68, 0x00, 0x28, 0x01, 0xd0, 0xfd, 0xf7, 0x1a, 0xff, 0x0d, 0xf0, 0x0a, 0xfa, 0xf8, 0xbd, 0x68, 0x69, 0x00, 0x28, 0x05, 0xd1, 0x09, 0x48, 0x00, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x2c, 0x04, 0xd1, 0x39, 0x1c, 0x20, 0x1c, 0x0e, 0xf0, 0x52, 0xfd, 0xf0, 0xe7, 0x04, 0xf0, 0x1d, 0xfb, 0x02, 0xf0, 0xeb, 0xfb, 0xeb, 0xe7, 0x3c, 0x00, 0xf8, 0x34, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x50, 0xc3, 0x00, 0x00, 0xd4, 0x67, 0x01, 0x00, 0x05, 0x48, 0x41, 0x69, 0x00, 0x29, 0x04, 0xd0, 0x40, 0x6a, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x06, 0x49, 0x00, 0x20, 0x48, 0x60, 0x08, 0x60, 0x88, 0x60, 0x08, 0xf0, 0x9b, 0xff, 0x07, 0x21, 0x3c, 0x00, 0x34, 0x35, 0x00, 0x00, 0x12, 0x20, 0x22, 0x79, 0x10, 0xf0, 0x3a, 0xf9, 0x10, 0xbd, 0x00, 0x00, 0x5c, 0x69, 0x01, 0x00, 0x01, 0x49, 0x01, 0x20, 0x08, 0x60, 0x70, 0x47, 0xe8, 0x67, 0x01, 0x00, 0xf8, 0xb5, 0x07, 0x1c, 0x0e, 0x1c, 0x08, 0xf0, 0xa3, 0xfa, 0x13, 0x4d, 0x04, 0x1c, 0x68, 0x68, 0x00, 0x28, 0x17, 0xd0, 0x00, 0x2f, 0x02, 0xd0, 0xa8, 0x68, 0x03, 0x28, 0x13, 0xd3, 0x00, 0x20, 0x3c, 0x00, 0x70, 0x35, 0x00, 0x00, 0xa8, 0x60, 0x68, 0x60, 0x21, 0x1c, 0x0f, 0x20, 0x0e, 0xf0, 0xf0, 0xfe, 0x28, 0x68, 0x00, 0x28, 0x03, 0xd0, 0x00, 0x2c, 0x06, 0xd1, 0x01, 0x20, 0x02, 0xe0, 0x01, 0x2c, 0x02, 0xd1, 0x00, 0x20, 0xff, 0xf7, 0xfa, 0xfe, 0xf8, 0xbd, 0x72, 0x1c, 0x00, 0x21, 0x04, 0x48, 0x00, 0xf0, 0x68, 0xf8, 0xa8, 0x68, 0x01, 0x30, 0xa8, 0x60, 0xf5, 0xe7, 0x5c, 0x69, 0x01, 0x00, 0x3c, 0x00, 0xac, 0x35, 0x00, 0x00, 0x51, 0x35, 0x00, 0x00, 0x0a, 0x49, 0x80, 0xb5, 0xca, 0x68, 0x00, 0x2a, 0x0b, 0xd0, 0x42, 0x68, 0x00, 0x2a, 0x09, 0xd0, 0x00, 0x22, 0x4a, 0x62, 0x02, 0x68, 0x0a, 0x62, 0x02, 0x68, 0x07, 0x21, 0x17, 0x20, 0x10, 0xf0, 0xef, 0xf8, 0x80, 0xbd, 0x01, 0x20, 0x48, 0x62, 0x80, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x70, 0xb5, 0x14, 0x4d, 0x84, 0x6c, 0xe9, 0x68, 0x3c, 0x00, 0xe8, 0x35, 0x00, 0x00, 0x00, 0x29, 0x17, 0xd0, 0x40, 0x30, 0xec, 0x61, 0x40, 0x78, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x68, 0x62, 0x28, 0x6a, 0x0e, 0x4e, 0x00, 0x1b, 0xb0, 0x42, 0x0c, 0xd2, 0x08, 0xf0, 0x3a, 0xfe, 0x29, 0x6a, 0x40, 0x1a, 0xb0, 0x42, 0x03, 0xd2, 0x02, 0x22, 0x07, 0x21, 0x13, 0x20, 0x09, 0xe0, 0x04, 0xf0, 0xb6, 0xfa, 0x70, 0xbd, 0x07, 0x48, 0xa9, 0x68, 0x0b, 0xf0, 0x3c, 0x00, 0x24, 0x36, 0x00, 0x00, 0xbd, 0xfe, 0x22, 0x1c, 0x07, 0x21, 0x16, 0x20, 0x10, 0xf0, 0xc0, 0xf8, 0x70, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0xa0, 0x86, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x0a, 0x49, 0x80, 0xb5, 0x00, 0x20, 0x88, 0x61, 0x08, 0x69, 0x00, 0x28, 0x0c, 0xd0, 0x07, 0x48, 0x1c, 0x30, 0x00, 0x78, 0x00, 0x28, 0x07, 0xd0, 0x01, 0xf0, 0xd2, 0xff, 0x02, 0x28, 0x03, 0xd1, 0x3c, 0x00, 0x60, 0x36, 0x00, 0x00, 0x00, 0xf0, 0x12, 0xf9, 0x00, 0xf0, 0xbc, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x5c, 0x69, 0x01, 0x00, 0xf0, 0xb5, 0x06, 0x1c, 0x0c, 0x1c, 0x15, 0x1c, 0x91, 0xb0, 0x01, 0xa8, 0x40, 0x21, 0xfc, 0xf7, 0x0d, 0xff, 0x00, 0x21, 0x68, 0x46, 0xfd, 0xf7, 0xa7, 0xff, 0x04, 0x90, 0x01, 0xa8, 0x06, 0x22, 0x08, 0x49, 0xfc, 0xf7, 0x31, 0xff, 0x06, 0x22, 0x02, 0xa8, 0x02, 0x30, 0x3c, 0x00, 0x9c, 0x36, 0x00, 0x00, 0x06, 0x49, 0xfc, 0xf7, 0x2b, 0xff, 0x00, 0xab, 0xdc, 0x76, 0x0c, 0x95, 0x31, 0x1c, 0x01, 0xa8, 0x07, 0xf0, 0x4e, 0xf8, 0x11, 0xb0, 0xf0, 0xbd, 0x12, 0x61, 0x01, 0x00, 0xf8, 0x67, 0x01, 0x00, 0x03, 0x1c, 0x08, 0x1c, 0x19, 0x1c, 0x11, 0x4b, 0x80, 0xb5, 0x06, 0xd0, 0x04, 0x21, 0x11, 0x80, 0x04, 0x22, 0x19, 0x1c, 0xfc, 0xf7, 0x12, 0xff, 0x16, 0xe0, 0x04, 0x22, 0x3c, 0x00, 0xd8, 0x36, 0x00, 0x00, 0x01, 0x1c, 0x18, 0x1c, 0xfc, 0xf7, 0x0c, 0xff, 0x09, 0x48, 0x10, 0x38, 0x00, 0x69, 0x00, 0x28, 0x0c, 0xd0, 0x07, 0x48, 0x0c, 0x30, 0x00, 0x78, 0x00, 0x28, 0x07, 0xd0, 0x01, 0xf0, 0x84, 0xff, 0x02, 0x28, 0x03, 0xd1, 0x00, 0xf0, 0xc4, 0xf8, 0x00, 0xf0, 0x6e, 0xf8, 0x01, 0x20, 0x80, 0xbd, 0x6c, 0x69, 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0x0f, 0x1c, 0x00, 0x25, 0x3c, 0x00, 0x14, 0x37, 0x00, 0x00, 0x00, 0x26, 0x01, 0xf0, 0x73, 0xff, 0x02, 0x28, 0x2f, 0xd1, 0x19, 0x49, 0x01, 0x2f, 0x08, 0x68, 0x07, 0xd1, 0x02, 0x1c, 0x22, 0x40, 0x0a, 0xd1, 0x20, 0x43, 0x08, 0x60, 0xa0, 0x42, 0x06, 0xd1, 0x04, 0xe0, 0x00, 0x28, 0x03, 0xd0, 0xa0, 0x43, 0x08, 0x60, 0x00, 0xd1, 0x01, 0x25, 0x48, 0x68, 0x00, 0x28, 0x1a, 0xd1, 0x00, 0x2d, 0x17, 0xd0, 0x01, 0x20, 0x48, 0x60, 0x3c, 0x00, 0x50, 0x37, 0x00, 0x00, 0x38, 0x1c, 0x08, 0xf0, 0x89, 0xfe, 0x0b, 0x48, 0x1c, 0x30, 0x81, 0x69, 0x00, 0x29, 0x07, 0xd0, 0x00, 0x23, 0x83, 0x61, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0xff, 0xf7, 0xf1, 0xfe, 0x06, 0xe0, 0x00, 0x22, 0x00, 0x21, 0x04, 0x48, 0xff, 0xf7, 0x7b, 0xff, 0x00, 0xe0, 0x01, 0x26, 0x30, 0x1c, 0xf8, 0xbd, 0x00, 0x00, 0x5c, 0x69, 0x01, 0x00, 0x51, 0x35, 0x00, 0x00, 0x3c, 0x00, 0x8c, 0x37, 0x00, 0x00, 0x03, 0x1c, 0x08, 0x1c, 0x19, 0x1c, 0x12, 0x4b, 0x80, 0xb5, 0x06, 0xd0, 0x04, 0x21, 0x11, 0x80, 0x04, 0x22, 0x19, 0x1c, 0xfc, 0xf7, 0xaa, 0xfe, 0x18, 0xe0, 0x04, 0x22, 0x01, 0x1c, 0x18, 0x1c, 0xfc, 0xf7, 0xa4, 0xfe, 0x0a, 0x48, 0x10, 0x30, 0xc1, 0x68, 0x00, 0x29, 0x0e, 0xd0, 0x00, 0x78, 0x00, 0x28, 0x0b, 0xd0, 0x01, 0xf0, 0x1e, 0xff, 0x02, 0x28, 0x07, 0xd1, 0x3c, 0x00, 0xc8, 0x37, 0x00, 0x00, 0x00, 0xf0, 0x64, 0xf8, 0x00, 0xf0, 0x2e, 0xf8, 0x00, 0x28, 0x01, 0xd1, 0x09, 0xf0, 0x7a, 0xfd, 0x01, 0x20, 0x80, 0xbd, 0x68, 0x69, 0x01, 0x00, 0x10, 0xb5, 0x0a, 0x4c, 0x20, 0x69, 0x00, 0x28, 0x09, 0xd0, 0xa1, 0x69, 0x00, 0x29, 0x06, 0xd1, 0x7d, 0x21, 0xc9, 0x00, 0x41, 0x43, 0x03, 0x22, 0x07, 0x20, 0x0f, 0xf0, 0xe1, 0xfe, 0x21, 0x69, 0x01, 0x20, 0x00, 0x29, 0x3c, 0x00, 0x04, 0x38, 0x00, 0x00, 0x00, 0xd1, 0x00, 0x20, 0x10, 0xbd, 0x00, 0x00, 0x5c, 0x69, 0x01, 0x00, 0x10, 0xb5, 0x05, 0x4c, 0x00, 0x28, 0x03, 0xd0, 0xfd, 0xf7, 0x9a, 0xfc, 0xe0, 0x60, 0x10, 0xbd, 0x01, 0x20, 0x00, 0x21, 0xe1, 0x60, 0x10, 0xbd, 0x78, 0x69, 0x01, 0x00, 0x0a, 0x48, 0x0a, 0x49, 0x10, 0xb5, 0xc0, 0x68, 0x1c, 0x39, 0xc9, 0x68, 0x00, 0x28, 0x03, 0xd0, 0x00, 0x29, 0x01, 0xd0, 0x3c, 0x00, 0x40, 0x38, 0x00, 0x00, 0x01, 0x24, 0x00, 0xe0, 0x00, 0x24, 0x00, 0x2c, 0x03, 0xd0, 0x02, 0x22, 0x07, 0x20, 0x0f, 0xf0, 0xb7, 0xfe, 0x20, 0x1c, 0x10, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x10, 0xb5, 0x09, 0x4c, 0x00, 0x20, 0x21, 0x69, 0x00, 0x29, 0x0c, 0xd0, 0x06, 0x49, 0x1c, 0x31, 0x09, 0x78, 0x00, 0x29, 0x07, 0xd0, 0x00, 0xf0, 0x09, 0xf8, 0x01, 0x20, 0xa0, 0x61, 0x20, 0x69, 0x3c, 0x00, 0x7c, 0x38, 0x00, 0x00, 0x7d, 0x23, 0xdb, 0x00, 0x58, 0x43, 0x10, 0xbd, 0x5c, 0x69, 0x01, 0x00, 0x80, 0xb5, 0x03, 0x21, 0x07, 0x20, 0x0f, 0xf0, 0xd1, 0xfe, 0x80, 0xbd, 0x80, 0xb5, 0x02, 0x21, 0x07, 0x20, 0x0f, 0xf0, 0xcb, 0xfe, 0x80, 0xbd, 0x06, 0x48, 0x80, 0xb5, 0x00, 0x78, 0x00, 0x28, 0x01, 0xd0, 0xfd, 0xf7, 0x29, 0xfd, 0x00, 0x22, 0x07, 0x21, 0x11, 0x20, 0x0f, 0xf0, 0x7c, 0xff, 0x3c, 0x00, 0xb8, 0x38, 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x10, 0x1c, 0x06, 0x4a, 0x51, 0x61, 0x00, 0xf0, 0xa3, 0xf8, 0x10, 0x20, 0x00, 0x2c, 0x00, 0xd1, 0x11, 0x20, 0x00, 0x22, 0x07, 0x21, 0x0f, 0xf0, 0x69, 0xff, 0x10, 0xbd, 0x5c, 0x69, 0x01, 0x00, 0x01, 0x49, 0x48, 0x62, 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x10, 0xb5, 0x09, 0x4c, 0x3c, 0x00, 0xf4, 0x38, 0x00, 0x00, 0xe0, 0x69, 0x00, 0x28, 0x0c, 0xd1, 0xe0, 0x62, 0x01, 0x20, 0xe0, 0x61, 0x0b, 0xf0, 0x08, 0xfd, 0x0b, 0xf0, 0x74, 0xfe, 0x01, 0x20, 0x00, 0xf0, 0xb5, 0xf8, 0x0f, 0xf0, 0x4d, 0xfa, 0x60, 0x63, 0x10, 0xbd, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x05, 0x49, 0x80, 0xb5, 0x00, 0x20, 0xc8, 0x61, 0x88, 0x63, 0x00, 0xf0, 0x89, 0xf8, 0x00, 0xf0, 0x01, 0xf9, 0x02, 0xf0, 0x3c, 0x00, 0x30, 0x39, 0x00, 0x00, 0x91, 0xfb, 0x80, 0xbd, 0x44, 0x7d, 0x01, 0x00, 0x10, 0xb5, 0x01, 0x28, 0x38, 0xd1, 0x08, 0x06, 0x00, 0x0e, 0x05, 0x28, 0x32, 0xd1, 0x1d, 0x4c, 0x20, 0x78, 0x01, 0x28, 0x09, 0xd0, 0x02, 0x28, 0x1b, 0xd0, 0x03, 0x28, 0x2a, 0xd1, 0x02, 0xf0, 0x7d, 0xfb, 0x00, 0xf0, 0x6f, 0xf8, 0x01, 0x20, 0x10, 0xe0, 0x17, 0x48, 0x21, 0x6b, 0x0b, 0xf0, 0x1b, 0xfd, 0x0b, 0xf0, 0x3c, 0x00, 0x6c, 0x39, 0x00, 0x00, 0x41, 0xfe, 0x15, 0x48, 0x00, 0x69, 0x03, 0x28, 0x01, 0xd3, 0xc0, 0x07, 0x03, 0xd5, 0x01, 0x21, 0x20, 0x6b, 0x07, 0xf0, 0x19, 0xff, 0x02, 0x20, 0x00, 0xf0, 0x78, 0xf8, 0x10, 0xbd, 0x0f, 0x48, 0x00, 0x68, 0x20, 0x64, 0x0a, 0x48, 0x5c, 0x30, 0xc1, 0x68, 0x02, 0x69, 0x89, 0x18, 0xc1, 0x60, 0x03, 0xf0, 0xcc, 0xfc, 0x03, 0x20, 0x00, 0xf0, 0x69, 0xf8, 0x01, 0x20, 0x3c, 0x00, 0xa8, 0x39, 0x00, 0x00, 0xe0, 0x62, 0x10, 0xbd, 0x09, 0x21, 0x00, 0xe0, 0x08, 0x21, 0x09, 0x20, 0xfd, 0xf7, 0x76, 0xfc, 0x10, 0xbd, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0xf4, 0x68, 0x01, 0x00, 0x78, 0x6e, 0x01, 0x00, 0xb0, 0xb5, 0x0f, 0x4c, 0x20, 0x78, 0x65, 0x1e, 0x01, 0x28, 0x0f, 0xd1, 0x00, 0x20, 0xff, 0xf7, 0xa1, 0xfc, 0x0c, 0x49, 0x09, 0x88, 0x49, 0x08, 0x3c, 0x00, 0xe4, 0x39, 0x00, 0x00, 0x40, 0x1a, 0x0f, 0xf0, 0x19, 0xf9, 0x00, 0x28, 0x04, 0xd0, 0x28, 0x78, 0x01, 0x28, 0x07, 0xd0, 0x02, 0x28, 0x05, 0xd0, 0x20, 0x78, 0x00, 0x28, 0x04, 0xd1, 0x28, 0x78, 0x03, 0x28, 0x01, 0xd1, 0x01, 0x20, 0xb0, 0xbd, 0x00, 0x20, 0xb0, 0xbd, 0x45, 0x7d, 0x01, 0x00, 0xf4, 0x67, 0x01, 0x00, 0x01, 0x49, 0xc8, 0x64, 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x3c, 0x00, 0x20, 0x3a, 0x00, 0x00, 0x04, 0x49, 0x05, 0x4a, 0x89, 0x68, 0x12, 0x6d, 0x01, 0x20, 0x91, 0x42, 0x00, 0xd3, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0xf4, 0x68, 0x01, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x10, 0xb5, 0x06, 0x4c, 0x20, 0x6b, 0x07, 0xf0, 0xf9, 0xfe, 0xa0, 0x6b, 0x00, 0x28, 0x03, 0xd1, 0x03, 0x48, 0x21, 0x6b, 0x0b, 0xf0, 0x92, 0xfc, 0x10, 0xbd, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x3c, 0x00, 0x5c, 0x3a, 0x00, 0x00, 0x34, 0x63, 0x01, 0x00, 0x04, 0x48, 0x00, 0x78, 0x02, 0x28, 0x01, 0xd0, 0x03, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x44, 0x7d, 0x01, 0x00, 0xf8, 0xb5, 0x07, 0x1c, 0xff, 0xf7, 0xd0, 0xff, 0x06, 0x1c, 0x01, 0x2f, 0x26, 0x4d, 0x1f, 0xd0, 0x02, 0x2f, 0x45, 0xd0, 0x03, 0x2f, 0x12, 0xd1, 0x24, 0x48, 0x25, 0x4b, 0x00, 0x69, 0x6a, 0x69, 0x3c, 0x00, 0x98, 0x3a, 0x00, 0x00, 0x41, 0x08, 0x5a, 0x43, 0x23, 0x4b, 0xd4, 0x18, 0x8c, 0x42, 0x00, 0xd9, 0x0c, 0x1c, 0x00, 0x2e, 0x05, 0xd0, 0x1e, 0x49, 0x5b, 0x39, 0x09, 0x78, 0x00, 0x29, 0x00, 0xd1, 0x04, 0x1c, 0x05, 0x22, 0x21, 0x1c, 0x09, 0x20, 0x0f, 0xf0, 0x80, 0xfd, 0x18, 0x4a, 0x5c, 0x3a, 0x17, 0x70, 0xf8, 0xbd, 0xff, 0xf7, 0xd6, 0xfb, 0x00, 0x28, 0x02, 0xd0, 0x28, 0x69, 0x00, 0x28, 0x3c, 0x00, 0xd4, 0x3a, 0x00, 0x00, 0x0e, 0xd0, 0x04, 0xf0, 0xcf, 0xfb, 0x13, 0x4b, 0x69, 0x69, 0x11, 0x4a, 0x59, 0x43, 0x5c, 0x3a, 0xd2, 0x6b, 0x89, 0x18, 0x88, 0x42, 0x01, 0xd9, 0x44, 0x1a, 0x04, 0xe0, 0x00, 0x24, 0x02, 0xe0, 0x04, 0xf0, 0xae, 0xfd, 0x04, 0x1c, 0x00, 0x2e, 0xdb, 0xd0, 0x09, 0x48, 0x5b, 0x38, 0x00, 0x78, 0x01, 0x28, 0xd6, 0xd1, 0x08, 0x4b, 0x9c, 0x42, 0x02, 0xd9, 0x58, 0x42, 0x3c, 0x00, 0x10, 0x3b, 0x00, 0x00, 0x24, 0x18, 0xd0, 0xe7, 0x00, 0x24, 0xce, 0xe7, 0x04, 0xf0, 0xae, 0xfb, 0xca, 0xe7, 0x00, 0x00, 0xf4, 0x68, 0x01, 0x00, 0xa0, 0x7d, 0x01, 0x00, 0x98, 0x3a, 0x00, 0x00, 0x88, 0x13, 0x00, 0x00, 0x80, 0xb5, 0x05, 0x21, 0x09, 0x20, 0x0f, 0xf0, 0x7d, 0xfd, 0x02, 0x49, 0x00, 0x20, 0x08, 0x70, 0x80, 0xbd, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x70, 0xb5, 0x06, 0x1c, 0x3c, 0x00, 0x4c, 0x3b, 0x00, 0x00, 0x0d, 0xf0, 0xbc, 0xfa, 0xff, 0xf7, 0xce, 0xfe, 0x09, 0x4c, 0x0a, 0x48, 0x21, 0x6b, 0x0b, 0xf0, 0x21, 0xfc, 0x01, 0x25, 0x01, 0x21, 0x30, 0x06, 0x00, 0x0e, 0xa5, 0x63, 0x07, 0xf0, 0x3a, 0xfe, 0x05, 0x48, 0x29, 0x02, 0x09, 0x58, 0x00, 0x29, 0x00, 0xd1, 0x05, 0x61, 0x70, 0xbd, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0xf4, 0x67, 0x01, 0x00, 0x3c, 0x00, 0x88, 0x3b, 0x00, 0x00, 0x02, 0x4a, 0x11, 0x6c, 0x08, 0x43, 0x10, 0x64, 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x80, 0xb5, 0xff, 0xf7, 0xbf, 0xfe, 0x0b, 0xf0, 0xa1, 0xfb, 0x80, 0xbd, 0x02, 0x4a, 0x01, 0x1c, 0x10, 0x69, 0x11, 0x61, 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0xf3, 0xb5, 0x06, 0x1c, 0x00, 0x20, 0x89, 0xb0, 0xf8, 0x4c, 0x08, 0x90, 0xe2, 0x69, 0x08, 0x25, 0x3c, 0x00, 0xc4, 0x3b, 0x00, 0x00, 0x00, 0x2a, 0x03, 0xd0, 0x06, 0xa9, 0x07, 0xa8, 0xfc, 0xf7, 0x06, 0xfc, 0x30, 0x1c, 0xf3, 0x4e, 0x00, 0x27, 0x20, 0x36, 0x82, 0x28, 0x6f, 0xd0, 0x15, 0xdc, 0x01, 0x28, 0x18, 0xd0, 0x80, 0x28, 0x6b, 0xd1, 0xee, 0x4d, 0x80, 0x3d, 0xa8, 0x68, 0x01, 0x28, 0x67, 0xd1, 0x68, 0x68, 0x0f, 0xf0, 0x1b, 0xf8, 0x00, 0x28, 0x63, 0xd1, 0x01, 0x21, 0x01, 0x20, 0x0d, 0xf0, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x9d, 0xf8, 0x08, 0xf0, 0xdb, 0xfd, 0x0b, 0xb0, 0xf0, 0xbd, 0x83, 0x28, 0x6d, 0xd0, 0x84, 0x28, 0x55, 0xd1, 0xe7, 0xe0, 0x0a, 0x98, 0x0a, 0x28, 0x04, 0xd2, 0x03, 0xa3, 0x1b, 0x18, 0x1b, 0x5a, 0x5b, 0x00, 0x9f, 0x44, 0xf6, 0xe0, 0x00, 0x00, 0xee, 0x00, 0x0b, 0x00, 0xf7, 0x00, 0xf7, 0x00, 0xf7, 0x00, 0xf7, 0x00, 0x2f, 0x00, 0x88, 0x00, 0x8b, 0x00, 0xad, 0x00, 0x3c, 0x00, 0x3c, 0x3c, 0x00, 0x00, 0x00, 0xf0, 0x56, 0xfe, 0x00, 0x28, 0x17, 0xd0, 0xd6, 0x4a, 0x80, 0x3a, 0xd1, 0x6a, 0x06, 0x98, 0x81, 0x42, 0x16, 0xd0, 0x06, 0x21, 0x00, 0x28, 0x00, 0xd1, 0x07, 0x21, 0x0d, 0x06, 0x2d, 0x0e, 0x00, 0x28, 0x0e, 0xd0, 0xcf, 0x4a, 0x01, 0x20, 0x80, 0x3a, 0x50, 0x65, 0x0f, 0xf0, 0xa0, 0xf8, 0xcc, 0x4a, 0x80, 0x3a, 0x50, 0x66, 0x04, 0xe0, 0x00, 0x21, 0x16, 0x20, 0x3c, 0x00, 0x78, 0x3c, 0x00, 0x00, 0x0f, 0xf0, 0xdc, 0xfc, 0x01, 0x25, 0x02, 0x20, 0x05, 0x90, 0x2e, 0xe2, 0xc6, 0x48, 0x80, 0x38, 0x40, 0x6d, 0x00, 0x28, 0x2e, 0xd0, 0xc6, 0x49, 0x20, 0x69, 0xc4, 0x4d, 0x40, 0x18, 0x0e, 0xf0, 0xc1, 0xff, 0x00, 0x28, 0x12, 0xd0, 0x0f, 0xf0, 0x85, 0xf8, 0xc1, 0x49, 0x49, 0x42, 0x40, 0x18, 0xbd, 0x49, 0x20, 0x61, 0x80, 0x39, 0x48, 0x6e, 0x40, 0x19, 0x0e, 0xf0, 0x3c, 0x00, 0xb4, 0x3c, 0x00, 0x00, 0xbb, 0xff, 0x00, 0x28, 0x11, 0xd0, 0x0a, 0xe0, 0xf7, 0xe0, 0x17, 0xe2, 0xb2, 0xe0, 0xb0, 0xe0, 0xb6, 0x49, 0x20, 0x69, 0x80, 0x39, 0x49, 0x6e, 0x40, 0x1a, 0xa8, 0x42, 0x05, 0xdb, 0xb3, 0x49, 0xb5, 0x4d, 0x80, 0x39, 0x4f, 0x65, 0x03, 0xf0, 0x27, 0xfb, 0x06, 0x22, 0x29, 0x1c, 0x16, 0x20, 0x0f, 0xf0, 0x72, 0xfc, 0x47, 0xe0, 0x95, 0xe0, 0x00, 0xf0, 0xfe, 0xfd, 0x3c, 0x00, 0xf0, 0x3c, 0x00, 0x00, 0x00, 0x28, 0x42, 0xd1, 0xaa, 0x4d, 0xc4, 0x3d, 0xef, 0x60, 0x08, 0xf0, 0x19, 0xfd, 0x03, 0xf0, 0x15, 0xfb, 0xa8, 0x6a, 0x00, 0x28, 0x02, 0xd0, 0xff, 0xf7, 0x4c, 0xff, 0xaf, 0x62, 0xa4, 0x48, 0x80, 0x38, 0x00, 0x68, 0x00, 0x21, 0xff, 0xf7, 0xf9, 0xfc, 0x08, 0xf0, 0x3f, 0xf9, 0x09, 0x21, 0x16, 0x20, 0x0f, 0xf0, 0x87, 0xfc, 0x00, 0x22, 0x16, 0x21, 0x83, 0x20, 0x3c, 0x00, 0x2c, 0x3d, 0x00, 0x00, 0x0f, 0xf0, 0x40, 0xfd, 0xff, 0xf7, 0x86, 0xfc, 0x21, 0xe0, 0x00, 0xf0, 0x1b, 0xfe, 0x1e, 0xe0, 0x06, 0xf0, 0x54, 0xfa, 0x97, 0x4d, 0x80, 0x3d, 0xa9, 0x6f, 0x40, 0x1a, 0x04, 0x90, 0x06, 0x98, 0x00, 0x28, 0x01, 0xd0, 0xaf, 0x65, 0x02, 0xe0, 0xa8, 0x6d, 0x00, 0x28, 0x08, 0xd1, 0x91, 0x48, 0xc4, 0x38, 0x00, 0x78, 0x80, 0x07, 0x03, 0xd5, 0x92, 0x48, 0x47, 0x60, 0x3c, 0x00, 0x68, 0x3d, 0x00, 0x00, 0x00, 0xf0, 0x02, 0xfe, 0x04, 0x98, 0xff, 0x38, 0x23, 0x38, 0x14, 0x28, 0x02, 0xd2, 0x01, 0x20, 0xe8, 0x63, 0x53, 0xe0, 0xef, 0x63, 0x51, 0xe0, 0x87, 0x4a, 0xb5, 0x7a, 0x80, 0x3a, 0x00, 0x2d, 0x4c, 0xd0, 0x0d, 0xf0, 0x71, 0xff, 0x00, 0xf0, 0xad, 0xfd, 0x07, 0x1c, 0x82, 0x48, 0x80, 0x38, 0x40, 0x6f, 0xff, 0x30, 0x5f, 0x30, 0x0e, 0xf0, 0x3d, 0xff, 0x02, 0x1c, 0x3c, 0x00, 0xa4, 0x3d, 0x00, 0x00, 0x7e, 0x48, 0x80, 0x38, 0x40, 0x6d, 0x00, 0x28, 0x1a, 0xd1, 0x00, 0xf0, 0xf1, 0xfd, 0x00, 0x28, 0x16, 0xd1, 0x04, 0x2d, 0x02, 0xd1, 0x00, 0x2f, 0x12, 0xd1, 0x1b, 0xe0, 0x00, 0x2f, 0x06, 0xd0, 0x02, 0x2d, 0x14, 0xd0, 0x79, 0x48, 0x40, 0x68, 0x00, 0x28, 0x09, 0xd0, 0x12, 0xe0, 0x00, 0x2a, 0x10, 0xd1, 0x4b, 0x21, 0xc9, 0x00, 0x01, 0x23, 0x09, 0x22, 0x16, 0x20, 0x3c, 0x00, 0xe0, 0x3d, 0x00, 0x00, 0x0f, 0xf0, 0xd6, 0xfc, 0x6e, 0x4a, 0x73, 0x48, 0x80, 0x3a, 0x11, 0x68, 0x0b, 0xf0, 0xd8, 0xfa, 0x18, 0xe0, 0x01, 0x21, 0x00, 0x20, 0x01, 0xe0, 0x01, 0x21, 0x01, 0x20, 0x00, 0xf0, 0x2a, 0xfe, 0x10, 0xe0, 0x67, 0x4a, 0x6c, 0x49, 0x80, 0x3a, 0x90, 0x6e, 0x40, 0x18, 0x90, 0x66, 0x01, 0x25, 0x08, 0x95, 0x8b, 0xe1, 0x04, 0x21, 0x6c, 0xe1, 0x61, 0x4a, 0x66, 0x48, 0x3c, 0x00, 0x1c, 0x3e, 0x00, 0x00, 0x80, 0x3a, 0x11, 0x68, 0x0b, 0xf0, 0xaa, 0xfa, 0x88, 0xe1, 0xaf, 0x60, 0xa8, 0x6f, 0xe8, 0x67, 0x63, 0x48, 0x01, 0x6d, 0xa9, 0x67, 0x07, 0x9a, 0x14, 0x20, 0x00, 0x2a, 0x00, 0xd1, 0x00, 0x20, 0x08, 0x18, 0x12, 0x30, 0xa8, 0x66, 0x70, 0x78, 0xb0, 0x70, 0x30, 0x78, 0x70, 0x70, 0x02, 0x20, 0x30, 0x70, 0xa0, 0x69, 0xfc, 0xf7, 0xc2, 0xfa, 0xef, 0x64, 0xa8, 0x6f, 0x3c, 0x00, 0x58, 0x3e, 0x00, 0x00, 0xe9, 0x6f, 0x59, 0x4b, 0x40, 0x1a, 0x98, 0x42, 0x12, 0xd2, 0x68, 0x6d, 0x06, 0x99, 0x88, 0x42, 0x0e, 0xd0, 0x30, 0x78, 0x02, 0x28, 0x0b, 0xd8, 0x0e, 0xf0, 0x9c, 0xff, 0xa9, 0x6f, 0x08, 0x22, 0x40, 0x1a, 0x52, 0x49, 0x09, 0x1a, 0x3b, 0x1c, 0x16, 0x20, 0x0f, 0xf0, 0x85, 0xfc, 0x00, 0xe0, 0xaf, 0x65, 0x01, 0x20, 0x05, 0x90, 0x08, 0x90, 0x43, 0x48, 0x02, 0x25, 0x3c, 0x00, 0x94, 0x3e, 0x00, 0x00, 0xc4, 0x38, 0xc1, 0x68, 0x00, 0x29, 0x72, 0xd1, 0x01, 0x21, 0xc1, 0x60, 0x49, 0x48, 0x00, 0x6b, 0x00, 0x28, 0x6c, 0xd0, 0x08, 0xf0, 0x66, 0xfc, 0x69, 0xe0, 0x3c, 0x48, 0x00, 0x22, 0x01, 0x92, 0x80, 0x38, 0x80, 0x68, 0x01, 0x28, 0x04, 0xd1, 0x38, 0x48, 0x80, 0x38, 0x87, 0x60, 0x01, 0x20, 0x48, 0xe1, 0x3a, 0x48, 0x01, 0x23, 0x43, 0x60, 0x34, 0x48, 0xc4, 0x38, 0x3c, 0x00, 0xd0, 0x3e, 0x00, 0x00, 0x00, 0x78, 0x00, 0x28, 0x0a, 0xd1, 0x00, 0xf0, 0x25, 0xfe, 0x00, 0x28, 0x06, 0xd0, 0xff, 0x21, 0x91, 0x31, 0x01, 0x23, 0x09, 0x22, 0x16, 0x20, 0x0f, 0xf0, 0x52, 0xfc, 0x2c, 0x49, 0x80, 0x39, 0x48, 0x6f, 0x89, 0x6f, 0x42, 0x1a, 0x03, 0x92, 0x06, 0xf0, 0x76, 0xf9, 0x28, 0x49, 0x80, 0x39, 0x89, 0x6f, 0x03, 0x9a, 0x40, 0x1a, 0x02, 0x90, 0x37, 0x20, 0x00, 0x01, 0x3c, 0x00, 0x0c, 0x3f, 0x00, 0x00, 0x10, 0x1a, 0x50, 0x28, 0x0d, 0xd2, 0x23, 0x48, 0x80, 0x38, 0x40, 0x6d, 0x00, 0x28, 0x04, 0xd1, 0x02, 0x98, 0xff, 0x38, 0x55, 0x38, 0x14, 0x28, 0x01, 0xd2, 0x01, 0x22, 0x00, 0xe0, 0x00, 0x22, 0x01, 0x92, 0x03, 0x9a, 0x01, 0x20, 0xff, 0x3a, 0x0b, 0x3a, 0x50, 0x2a, 0x00, 0xd3, 0x00, 0x20, 0x04, 0x90, 0x00, 0x28, 0x0a, 0xd0, 0x17, 0x48, 0x80, 0x38, 0xc0, 0x6f, 0x3c, 0x00, 0x48, 0x3f, 0x00, 0x00, 0x08, 0x1a, 0x9b, 0x21, 0xc9, 0x00, 0x40, 0x1a, 0x14, 0x28, 0x01, 0xd2, 0x01, 0x22, 0x00, 0xe0, 0x00, 0x22, 0x00, 0x92, 0x00, 0x2a, 0x11, 0xd0, 0x0f, 0x4d, 0x01, 0x20, 0x80, 0x3d, 0x68, 0x65, 0x0e, 0xf0, 0x20, 0xff, 0x68, 0x66, 0x01, 0x25, 0x01, 0x21, 0x16, 0x20, 0x0f, 0xf0, 0x5e, 0xfb, 0x00, 0x21, 0x16, 0x20, 0x0f, 0xf0, 0x5a, 0xfb, 0x00, 0xe0, 0xba, 0xe0, 0x3c, 0x00, 0x84, 0x3f, 0x00, 0x00, 0xf0, 0x79, 0x02, 0x28, 0x3c, 0xd8, 0x05, 0x4a, 0x80, 0x3a, 0x51, 0x6c, 0x00, 0x29, 0x37, 0xd1, 0x13, 0x6c, 0x11, 0x1c, 0x00, 0x2b, 0x33, 0xd1, 0x16, 0xe0, 0x00, 0x00, 0x24, 0x6d, 0x01, 0x00, 0x50, 0xc3, 0x00, 0x00, 0xc0, 0x5c, 0x15, 0x00, 0x70, 0x99, 0x14, 0x00, 0xb0, 0x57, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0xe2, 0x04, 0x00, 0x00, 0x00, 0x90, 0x07, 0x00, 0x3c, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x53, 0x07, 0x00, 0x00, 0x1e, 0x02, 0x00, 0x00, 0xc8, 0x57, 0x01, 0x00, 0x4a, 0x6d, 0x00, 0x2a, 0x02, 0xd0, 0xb2, 0x7a, 0x02, 0x2a, 0x15, 0xd1, 0x00, 0x9a, 0x00, 0x2a, 0x03, 0xd0, 0xca, 0x6d, 0x01, 0x32, 0xca, 0x65, 0x00, 0xe0, 0xcf, 0x65, 0x01, 0x9a, 0x00, 0x2a, 0x0b, 0xd0, 0x8a, 0x6f, 0xcb, 0x6f, 0xd2, 0x1a, 0x5a, 0x4b, 0x9a, 0x42, 0x02, 0xd2, 0x8a, 0x6d, 0x3c, 0x00, 0xfc, 0x3f, 0x00, 0x00, 0x01, 0x32, 0x00, 0xe0, 0x01, 0x22, 0x8a, 0x65, 0x00, 0xe0, 0x8f, 0x65, 0x04, 0x99, 0x00, 0x29, 0x01, 0xd1, 0x02, 0x28, 0x0b, 0xd9, 0x54, 0x4a, 0x02, 0x28, 0x1e, 0xd9, 0xd0, 0x6f, 0x61, 0x68, 0x88, 0x42, 0x1a, 0xd1, 0x91, 0x6f, 0x08, 0x1a, 0x50, 0x49, 0x88, 0x42, 0x15, 0xdd, 0x4e, 0x4b, 0x98, 0x6f, 0xe1, 0x68, 0x40, 0x1a, 0x7d, 0x21, 0xc9, 0x00, 0x88, 0x42, 0x3c, 0x00, 0x38, 0x40, 0x00, 0x00, 0x0b, 0xdd, 0x61, 0x69, 0x40, 0x1a, 0x00, 0x28, 0x04, 0xdd, 0x02, 0x11, 0x40, 0x11, 0x10, 0x18, 0x40, 0x18, 0x01, 0xe0, 0x80, 0x10, 0x08, 0x18, 0x60, 0x61, 0x58, 0x6f, 0xe0, 0x60, 0x03, 0x98, 0xff, 0x38, 0x23, 0x38, 0x14, 0x28, 0x09, 0xd2, 0x02, 0x98, 0xff, 0x38, 0x23, 0x38, 0x14, 0x28, 0x04, 0xd2, 0x3e, 0x4a, 0x90, 0x6f, 0x50, 0x64, 0x90, 0x6a, 0x90, 0x64, 0x3c, 0x00, 0x74, 0x40, 0x00, 0x00, 0x0e, 0xf0, 0x9a, 0xfe, 0x3a, 0x49, 0x49, 0x6c, 0x40, 0x1a, 0x3b, 0x49, 0x88, 0x42, 0x01, 0xd9, 0x37, 0x49, 0x4f, 0x64, 0x39, 0x49, 0x03, 0x98, 0x40, 0x18, 0x14, 0x28, 0x07, 0xd2, 0x34, 0x49, 0xc8, 0x6b, 0x00, 0x28, 0x03, 0xd0, 0x88, 0x6f, 0x08, 0x64, 0x88, 0x6a, 0x88, 0x64, 0x0e, 0xf0, 0x83, 0xfe, 0x2f, 0x49, 0x09, 0x6c, 0x40, 0x1a, 0x31, 0x49, 0x88, 0x42, 0x3c, 0x00, 0xb0, 0x40, 0x00, 0x00, 0x01, 0xd9, 0x2c, 0x48, 0x07, 0x64, 0x04, 0x20, 0x05, 0x90, 0x08, 0x21, 0x16, 0x20, 0x0f, 0xf0, 0xb9, 0xfa, 0x28, 0x48, 0x40, 0x6d, 0x00, 0x28, 0x02, 0xd0, 0x04, 0x99, 0x00, 0x29, 0x08, 0xd0, 0x29, 0x49, 0x00, 0x28, 0x00, 0xd1, 0x29, 0x49, 0x3b, 0x1c, 0x06, 0x22, 0x16, 0x20, 0x0f, 0xf0, 0x57, 0xfb, 0x02, 0x2d, 0x09, 0xd0, 0x06, 0x2d, 0x0a, 0xd0, 0x07, 0x2d, 0x3c, 0x00, 0xec, 0x40, 0x00, 0x00, 0x13, 0xd1, 0x07, 0xe0, 0x01, 0x21, 0x16, 0x20, 0xfd, 0xf7, 0xd6, 0xf8, 0x1e, 0xe0, 0x1a, 0x4a, 0x57, 0x63, 0x97, 0x63, 0x18, 0x4a, 0x06, 0x98, 0xd0, 0x62, 0x07, 0x99, 0x11, 0x63, 0x53, 0x6b, 0x18, 0x43, 0x50, 0x63, 0x90, 0x6b, 0x08, 0x43, 0x90, 0x63, 0x05, 0x98, 0x00, 0x28, 0x05, 0xd0, 0x05, 0x98, 0x0c, 0xf0, 0x5f, 0xfa, 0x05, 0x98, 0x0c, 0xf0, 0xd2, 0xf9, 0x3c, 0x00, 0x28, 0x41, 0x00, 0x00, 0x08, 0x2d, 0x05, 0xd0, 0x0d, 0x48, 0x44, 0x38, 0x85, 0x70, 0x28, 0x1c, 0x03, 0xf0, 0xdc, 0xfd, 0x11, 0x49, 0xe0, 0x69, 0x88, 0x42, 0x00, 0xd1, 0x61, 0xe5, 0x08, 0x98, 0x00, 0x28, 0xfb, 0xd0, 0xb0, 0x7a, 0x02, 0x28, 0xf8, 0xd1, 0x01, 0x21, 0x16, 0x20, 0x0f, 0xf0, 0x6f, 0xfa, 0x02, 0x20, 0x0d, 0xf0, 0xe8, 0xfe, 0x53, 0xe5, 0x00, 0x00, 0x53, 0x07, 0x00, 0x00, 0x3c, 0x00, 0x64, 0x41, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x20, 0xa1, 0x07, 0x00, 0x20, 0x4e, 0x00, 0x00, 0x3f, 0xfb, 0xff, 0xff, 0xa0, 0x86, 0x01, 0x00, 0x50, 0xc3, 0x00, 0x00, 0xc0, 0x5c, 0x15, 0x00, 0xf1, 0x1d, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0xf8, 0xb5, 0x21, 0x48, 0x00, 0x68, 0x21, 0x4d, 0x69, 0x69, 0x08, 0x40, 0x01, 0xd1, 0x01, 0x27, 0x00, 0xe0, 0x00, 0x27, 0x3c, 0x00, 0xa0, 0x41, 0x00, 0x00, 0x1d, 0x4d, 0x01, 0x26, 0x69, 0x6a, 0x00, 0x29, 0x00, 0xd0, 0x00, 0x26, 0x1b, 0x4d, 0x1a, 0x48, 0x2c, 0x1c, 0xa0, 0x30, 0x02, 0x7a, 0x28, 0x1c, 0x40, 0x30, 0x80, 0x34, 0x10, 0x23, 0xb7, 0x42, 0x10, 0xd1, 0x01, 0x25, 0xc5, 0x80, 0x00, 0x29, 0x00, 0xd0, 0x00, 0x23, 0x1a, 0x43, 0x11, 0x1c, 0x01, 0x73, 0x01, 0x20, 0x0e, 0xf0, 0x88, 0xfe, 0x08, 0x20, 0x20, 0x70, 0x3c, 0x00, 0xdc, 0x41, 0x00, 0x00, 0x00, 0x22, 0x16, 0x21, 0x80, 0x20, 0x13, 0xe0, 0x11, 0x27, 0xc7, 0x80, 0x2e, 0x1c, 0x0b, 0x4d, 0x00, 0x29, 0x00, 0xd1, 0x00, 0x23, 0x1a, 0x43, 0x11, 0x1c, 0x01, 0x73, 0x01, 0x20, 0x0e, 0xf0, 0x75, 0xfe, 0x08, 0x20, 0x20, 0x70, 0x30, 0x6d, 0x00, 0x22, 0x16, 0x21, 0x68, 0x67, 0x82, 0x20, 0x0f, 0xf0, 0xd0, 0xfa, 0xf8, 0xbd, 0x00, 0x00, 0x10, 0x00, 0x07, 0x00, 0x3c, 0x00, 0x18, 0x42, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x00, 0x90, 0x07, 0x00, 0xb0, 0xb5, 0x0f, 0x4d, 0x04, 0x1c, 0xaa, 0x7a, 0x01, 0x21, 0x08, 0x1c, 0x00, 0x2a, 0x00, 0xd0, 0x00, 0x20, 0x00, 0x2c, 0x00, 0xd0, 0x00, 0x21, 0x88, 0x42, 0x0a, 0xd0, 0x00, 0x2c, 0x04, 0xd1, 0x00, 0xf0, 0x42, 0xfb, 0x00, 0xf0, 0xd6, 0xfa, 0x03, 0xe0, 0x00, 0xf0, 0xd9, 0xfa, 0x00, 0xf0, 0x09, 0xf8, 0xa8, 0x7a, 0x3c, 0x00, 0x54, 0x42, 0x00, 0x00, 0x02, 0x49, 0xe4, 0x39, 0x48, 0x71, 0xac, 0x72, 0xb0, 0xbd, 0x00, 0x00, 0x44, 0x6d, 0x01, 0x00, 0x80, 0xb5, 0x3e, 0xf0, 0x55, 0xf8, 0x02, 0x49, 0x01, 0x20, 0x08, 0x70, 0x80, 0xbd, 0x00, 0x00, 0x68, 0x7e, 0x01, 0x00, 0xf3, 0xb5, 0x01, 0x20, 0x8d, 0xb0, 0x0f, 0x1c, 0x01, 0x24, 0x08, 0x90, 0x0e, 0xf0, 0x92, 0xfd, 0x06, 0x1c, 0x00, 0xf0, 0xb5, 0xfa, 0x09, 0x90, 0x3c, 0x00, 0x90, 0x42, 0x00, 0x00, 0x00, 0xf0, 0x80, 0xfb, 0x07, 0x90, 0xfe, 0xf7, 0x3f, 0xfa, 0x05, 0x1c, 0x00, 0x21, 0x0c, 0x91, 0x08, 0xf0, 0xf0, 0xfb, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x0a, 0x90, 0xfe, 0xf7, 0x12, 0xfd, 0x05, 0xf0, 0xe0, 0xfe, 0x0b, 0x90, 0x00, 0x2d, 0x23, 0xd0, 0x28, 0x88, 0x41, 0x07, 0x20, 0xd4, 0x29, 0x1d, 0x04, 0x91, 0x0a, 0x35, 0x00, 0x06, 0x3c, 0x00, 0xcc, 0x42, 0x00, 0x00, 0x80, 0x0e, 0x01, 0x21, 0x20, 0x28, 0x03, 0x95, 0x00, 0xd0, 0x00, 0x21, 0x0d, 0x1c, 0x04, 0x98, 0x06, 0xf0, 0x38, 0xfd, 0x0c, 0x90, 0x04, 0x98, 0x06, 0xf0, 0x10, 0xfd, 0x00, 0x28, 0x08, 0xd0, 0x03, 0x98, 0x01, 0xf0, 0x87, 0xfa, 0x00, 0x28, 0x03, 0xd0, 0x00, 0x2d, 0x01, 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x0c, 0x99, 0x01, 0x43, 0x0c, 0x91, 0xfc, 0xf7, 0x3c, 0x00, 0x08, 0x43, 0x00, 0x00, 0x23, 0xff, 0x00, 0x28, 0x2f, 0xd0, 0x07, 0xf0, 0x99, 0xff, 0x05, 0x1c, 0x07, 0xf0, 0xb2, 0xff, 0x04, 0x90, 0xff, 0xf7, 0xf3, 0xf8, 0x0c, 0x99, 0x01, 0x43, 0x00, 0x2d, 0x06, 0xd0, 0x04, 0x98, 0xf0, 0x4a, 0x30, 0x1a, 0x90, 0x42, 0x01, 0xd2, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x08, 0x43, 0x0c, 0x90, 0x0b, 0x98, 0x0a, 0x9b, 0x18, 0x43, 0x01, 0x1c, 0x0b, 0x91, 0x3c, 0x00, 0x44, 0x43, 0x00, 0x00, 0x05, 0xf0, 0xce, 0xfe, 0x00, 0x28, 0x1a, 0xd1, 0x00, 0x2d, 0x06, 0xd0, 0x04, 0x98, 0xe7, 0x49, 0x30, 0x1a, 0x88, 0x42, 0x01, 0xd2, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x0c, 0x99, 0x08, 0x43, 0x05, 0x1c, 0x00, 0xf0, 0x1f, 0xfb, 0x28, 0x43, 0x03, 0xe0, 0x00, 0xf0, 0x1b, 0xfb, 0x0c, 0x99, 0x08, 0x43, 0x0c, 0x90, 0x00, 0xf0, 0xd4, 0xfb, 0x0b, 0x99, 0x01, 0x43, 0x3c, 0x00, 0x80, 0x43, 0x00, 0x00, 0x0b, 0x91, 0xdc, 0x49, 0xc8, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x38, 0xc8, 0x60, 0x08, 0xf0, 0xe7, 0xfb, 0x06, 0x90, 0x08, 0xf0, 0x90, 0xfd, 0x31, 0x1a, 0x05, 0x91, 0x06, 0x99, 0xd6, 0x48, 0x81, 0x42, 0x08, 0xd8, 0x00, 0x2f, 0x08, 0xd1, 0x05, 0x99, 0x40, 0x08, 0x81, 0x42, 0x04, 0xd9, 0x06, 0x99, 0x81, 0x42, 0x01, 0xd9, 0x00, 0x24, 0x8b, 0xe0, 0xd0, 0x48, 0x3c, 0x00, 0xbc, 0x43, 0x00, 0x00, 0x05, 0x99, 0xd0, 0x4d, 0x81, 0x42, 0x26, 0xd2, 0xe8, 0x79, 0x10, 0x28, 0x06, 0xd2, 0x00, 0x2f, 0x21, 0xd1, 0xcc, 0x48, 0xa0, 0x38, 0x80, 0x6a, 0x00, 0x28, 0x1c, 0xd1, 0x09, 0xf0, 0x62, 0xff, 0x04, 0x90, 0x00, 0x28, 0x02, 0xd1, 0x00, 0x20, 0xc3, 0x49, 0x13, 0xe0, 0x09, 0xf0, 0x10, 0xfe, 0x00, 0x28, 0x03, 0xd0, 0xc4, 0x48, 0xc0, 0x69, 0x00, 0x28, 0xf4, 0xd0, 0x3c, 0x00, 0xf8, 0x43, 0x00, 0x00, 0x04, 0x98, 0x05, 0x28, 0x03, 0xd0, 0xc1, 0x48, 0x00, 0x6a, 0x00, 0x28, 0x65, 0xd1, 0xbb, 0x49, 0x48, 0x6a, 0x00, 0x28, 0x23, 0xd0, 0x01, 0x38, 0x48, 0x62, 0x00, 0xf0, 0x87, 0xff, 0x00, 0x28, 0x11, 0xd0, 0xbb, 0x48, 0x05, 0x99, 0x81, 0x42, 0x0d, 0xd2, 0x01, 0xf0, 0x9b, 0xf8, 0x04, 0x30, 0x0d, 0xf0, 0xee, 0xfc, 0x40, 0x30, 0xc1, 0x7a, 0x01, 0x29, 0x4e, 0xd0, 0x3c, 0x00, 0x34, 0x44, 0x00, 0x00, 0x80, 0x7a, 0x00, 0x28, 0x01, 0xd0, 0x05, 0x28, 0x49, 0xd3, 0x01, 0xf0, 0xdf, 0xf8, 0x02, 0x28, 0x10, 0xd0, 0x00, 0x2f, 0x02, 0xd1, 0x06, 0x98, 0x00, 0x28, 0x40, 0xd1, 0x00, 0x20, 0x08, 0x90, 0x82, 0xe1, 0xaa, 0x48, 0xa0, 0x38, 0xc0, 0x68, 0x00, 0x28, 0x38, 0xd0, 0xa8, 0x48, 0x80, 0x69, 0x48, 0x62, 0x34, 0xe0, 0x0a, 0xa9, 0x03, 0xc9, 0x08, 0x43, 0x45, 0xd0, 0x3c, 0x00, 0x70, 0x44, 0x00, 0x00, 0xa3, 0x48, 0x29, 0x78, 0xa0, 0x38, 0x02, 0x29, 0x40, 0xd8, 0x40, 0x6d, 0x00, 0x28, 0x0a, 0xd0, 0x9f, 0x48, 0xa2, 0x49, 0x20, 0x38, 0xc0, 0x68, 0x40, 0x18, 0x0e, 0xf0, 0xc7, 0xfb, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0x96, 0x4a, 0x90, 0x6a, 0x00, 0x28, 0x02, 0xda, 0x64, 0x08, 0x64, 0x00, 0x2a, 0xe0, 0x00, 0x29, 0x09, 0xd1, 0x95, 0x4b, 0x3c, 0x00, 0xac, 0x44, 0x00, 0x00, 0xa0, 0x3b, 0x5b, 0x6d, 0x00, 0x2b, 0x02, 0xd0, 0x05, 0x28, 0x0d, 0xdb, 0x01, 0xe0, 0x07, 0x28, 0x0a, 0xdb, 0x01, 0x20, 0xc0, 0x43, 0x90, 0x62, 0x64, 0x08, 0x8e, 0x49, 0x64, 0x00, 0x00, 0x20, 0xa0, 0x39, 0x88, 0x65, 0x14, 0xe0, 0xd1, 0xe0, 0x39, 0x43, 0x11, 0xd1, 0x89, 0x49, 0xa0, 0x39, 0xcb, 0x6d, 0x00, 0x2b, 0x02, 0xd1, 0x89, 0x6d, 0x01, 0x29, 0x09, 0xd9, 0x3c, 0x00, 0xe8, 0x44, 0x00, 0x00, 0x07, 0x9b, 0x00, 0x2b, 0x01, 0xd1, 0x07, 0x28, 0x01, 0xdb, 0x64, 0x08, 0x64, 0x00, 0x01, 0x30, 0x90, 0x62, 0xbd, 0xe0, 0x7d, 0x49, 0x88, 0x69, 0x04, 0x90, 0x00, 0x20, 0x88, 0x61, 0x0c, 0x98, 0x00, 0x28, 0x2c, 0xd0, 0x07, 0xf0, 0x66, 0xfc, 0x00, 0x28, 0x02, 0xd0, 0x02, 0x20, 0x04, 0x43, 0x25, 0xe0, 0x7a, 0x48, 0xc0, 0x6a, 0x00, 0x28, 0x04, 0xd1, 0x77, 0x48, 0x3c, 0x00, 0x24, 0x45, 0x00, 0x00, 0xa0, 0x38, 0xc0, 0x68, 0x00, 0x28, 0x1c, 0xd1, 0x04, 0x98, 0x00, 0x28, 0x0d, 0xd1, 0x28, 0x78, 0x10, 0x28, 0x02, 0xd3, 0xe8, 0x78, 0x02, 0x28, 0x02, 0xd9, 0x28, 0x79, 0x10, 0x28, 0x04, 0xd3, 0x04, 0x24, 0x6b, 0x49, 0x01, 0x22, 0x8a, 0x61, 0x94, 0xe0, 0x6c, 0x48, 0xa0, 0x38, 0x40, 0x6d, 0x00, 0x28, 0x71, 0xd0, 0x05, 0xf0, 0xa2, 0xfd, 0x00, 0x28, 0x6d, 0xd0, 0x3c, 0x00, 0x60, 0x45, 0x00, 0x00, 0x64, 0x08, 0x64, 0x00, 0x88, 0xe0, 0xff, 0xf7, 0x5b, 0xfa, 0x00, 0x28, 0x1a, 0xd0, 0x68, 0x48, 0x00, 0x78, 0x02, 0x28, 0x01, 0xd1, 0x00, 0x2f, 0x14, 0xd1, 0x00, 0x20, 0xfe, 0xf7, 0x70, 0xfe, 0x30, 0x1a, 0x04, 0x90, 0xff, 0xf7, 0x6c, 0xfa, 0x00, 0x28, 0x07, 0xd0, 0xff, 0xf7, 0x1e, 0xfa, 0x00, 0x28, 0x03, 0xd0, 0x5d, 0x49, 0x04, 0x98, 0x88, 0x42, 0x4f, 0xd3, 0x3c, 0x00, 0x9c, 0x45, 0x00, 0x00, 0x05, 0xf0, 0x6c, 0xfd, 0x00, 0x28, 0x4b, 0xd1, 0x53, 0x49, 0x08, 0x78, 0x03, 0x28, 0x08, 0xd1, 0x88, 0x68, 0x01, 0x22, 0xd2, 0x07, 0x30, 0x1a, 0x90, 0x42, 0x41, 0xd2, 0x01, 0x22, 0x0a, 0x70, 0x57, 0xe0, 0x54, 0x48, 0x00, 0x78, 0x02, 0x28, 0x01, 0xd1, 0x00, 0x2f, 0x51, 0xd1, 0x4a, 0x49, 0x88, 0x68, 0x51, 0x49, 0x80, 0x1b, 0x88, 0x42, 0x07, 0xd9, 0x01, 0x20, 0x3c, 0x00, 0xd8, 0x45, 0x00, 0x00, 0xfe, 0xf7, 0x42, 0xfe, 0x7d, 0x21, 0x09, 0x01, 0x40, 0x18, 0x44, 0x49, 0x88, 0x60, 0x4a, 0x48, 0x00, 0x78, 0x02, 0x28, 0x04, 0xd1, 0x07, 0x9b, 0x00, 0x2b, 0x01, 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x47, 0x4b, 0x47, 0x49, 0x58, 0x43, 0x40, 0x18, 0x3c, 0x49, 0x89, 0x68, 0x89, 0x1b, 0x88, 0x42, 0x30, 0xd9, 0x07, 0x9b, 0x00, 0x20, 0x03, 0x93, 0x00, 0xf0, 0x3c, 0x00, 0x14, 0x46, 0x00, 0x00, 0x79, 0xff, 0x02, 0x90, 0xff, 0xf7, 0xd8, 0xf9, 0x04, 0x90, 0x01, 0xf0, 0x57, 0xf8, 0x04, 0x99, 0x02, 0x9a, 0x51, 0x43, 0x48, 0x43, 0x01, 0x90, 0x00, 0xf0, 0xdc, 0xff, 0x41, 0x1c, 0x01, 0x98, 0x01, 0x22, 0x48, 0x43, 0x11, 0x1c, 0x00, 0xe0, 0x1b, 0xe0, 0x31, 0x4b, 0x5b, 0x6a, 0x83, 0x42, 0x00, 0xd3, 0x00, 0x21, 0x03, 0x9b, 0x01, 0x22, 0x00, 0x2b, 0x00, 0xd0, 0x3c, 0x00, 0x50, 0x46, 0x00, 0x00, 0x00, 0x22, 0x2c, 0x4b, 0x51, 0x43, 0x9b, 0x6a, 0x01, 0x22, 0x83, 0x42, 0x00, 0xd3, 0x00, 0x22, 0x50, 0x00, 0x08, 0x18, 0x03, 0xd0, 0x23, 0x49, 0x03, 0x20, 0x08, 0x70, 0x03, 0xe0, 0x09, 0x98, 0xc0, 0x68, 0x06, 0x28, 0x08, 0xd9, 0x02, 0x24, 0x08, 0x98, 0x00, 0x28, 0x6e, 0xd0, 0x1d, 0x49, 0x00, 0x20, 0xc8, 0x61, 0x48, 0x61, 0xa5, 0xe0, 0x1a, 0x49, 0x48, 0x69, 0x3c, 0x00, 0x8c, 0x46, 0x00, 0x00, 0x00, 0x28, 0x0a, 0xd1, 0x00, 0x2f, 0x05, 0xd0, 0x01, 0x22, 0x4a, 0x61, 0xc8, 0x69, 0x80, 0x18, 0xc8, 0x61, 0x0a, 0xe0, 0x00, 0x20, 0xc8, 0x61, 0x03, 0xe0, 0x00, 0x2f, 0x05, 0xd1, 0x00, 0x20, 0x48, 0x61, 0x0d, 0x98, 0x00, 0x28, 0x00, 0xd1, 0xc8, 0x68, 0x00, 0x20, 0x08, 0x90, 0x08, 0x78, 0x01, 0x28, 0x2f, 0xd0, 0x02, 0x28, 0x4b, 0xd1, 0x00, 0x2f, 0x08, 0xd1, 0x3c, 0x00, 0xc8, 0x46, 0x00, 0x00, 0xe8, 0x78, 0x00, 0x28, 0x02, 0xd1, 0x28, 0x78, 0x10, 0x28, 0x43, 0xd2, 0x28, 0x79, 0x10, 0x28, 0x40, 0xd2, 0x48, 0x68, 0x0a, 0x69, 0x30, 0x1a, 0x90, 0x42, 0x67, 0xd3, 0x01, 0x22, 0x0a, 0x70, 0x38, 0xe0, 0x00, 0x00, 0xe2, 0x04, 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0x68, 0x7e, 0x01, 0x00, 0xa0, 0x86, 0x01, 0x00, 0x88, 0x13, 0x00, 0x00, 0x44, 0x6d, 0x01, 0x00, 0x3c, 0x00, 0x04, 0x47, 0x00, 0x00, 0xc8, 0x57, 0x01, 0x00, 0x50, 0xc3, 0x00, 0x00, 0x98, 0x3a, 0x00, 0x00, 0xc0, 0x57, 0x01, 0x00, 0x40, 0x0d, 0x03, 0x00, 0xc4, 0x09, 0x00, 0x00, 0xb2, 0x0c, 0x00, 0x00, 0x00, 0x20, 0x0b, 0x9a, 0x0a, 0x9b, 0xc0, 0x43, 0x1a, 0x43, 0x37, 0xd0, 0x00, 0x2f, 0x35, 0xd1, 0x07, 0x9b, 0x00, 0x2b, 0x08, 0xd0, 0x6a, 0x78, 0x02, 0x2a, 0x2f, 0xd9, 0x2a, 0x78, 0x10, 0x2a, 0x3c, 0x00, 0x40, 0x47, 0x00, 0x00, 0x2c, 0xd2, 0x2a, 0x79, 0x10, 0x2a, 0x29, 0xd2, 0x25, 0x4b, 0x1a, 0x6c, 0x00, 0x2a, 0x06, 0xd0, 0x9a, 0x6a, 0x9f, 0x6c, 0xba, 0x42, 0x02, 0xd1, 0x1f, 0x20, 0x1f, 0xe0, 0x2e, 0xe0, 0x20, 0x4b, 0x5a, 0x6c, 0x00, 0x2a, 0x03, 0xd0, 0x1f, 0x4f, 0xb3, 0x1a, 0xbb, 0x42, 0x16, 0xd3, 0x1c, 0x4b, 0x00, 0x2a, 0x05, 0xd0, 0x9a, 0x6a, 0x9f, 0x6c, 0xba, 0x42, 0x01, 0xd1, 0x3c, 0x00, 0x7c, 0x47, 0x00, 0x00, 0x0f, 0x20, 0x0d, 0xe0, 0x07, 0x9a, 0x00, 0x2a, 0x04, 0xd0, 0xea, 0x79, 0x20, 0x2a, 0x01, 0xd1, 0x00, 0x20, 0x05, 0xe0, 0xea, 0x79, 0x10, 0x2a, 0x01, 0xd3, 0x03, 0x20, 0x00, 0xe0, 0x9a, 0x6a, 0x12, 0x4a, 0x12, 0x68, 0x02, 0x40, 0x0b, 0xd1, 0x01, 0x20, 0x08, 0x90, 0x02, 0x20, 0x08, 0x70, 0x0f, 0x48, 0x08, 0x61, 0x4e, 0x60, 0x64, 0xe7, 0xff, 0xe7, 0x01, 0x20, 0x3c, 0x00, 0xb8, 0x47, 0x00, 0x00, 0x08, 0x90, 0x60, 0xe7, 0x0c, 0x49, 0x88, 0x6a, 0x00, 0x28, 0x01, 0xda, 0x01, 0x30, 0x02, 0xe0, 0x00, 0x28, 0x01, 0xdd, 0x00, 0x20, 0x88, 0x62, 0x00, 0x20, 0x08, 0x62, 0x08, 0x99, 0x20, 0x04, 0x08, 0x43, 0x0f, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x71, 0x02, 0x00, 0x00, 0x08, 0x20, 0x07, 0x00, 0x53, 0x07, 0x00, 0x00, 0x68, 0x7e, 0x01, 0x00, 0x3c, 0x00, 0xf4, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x00, 0x48, 0x70, 0x47, 0x50, 0x7e, 0x01, 0x00, 0x80, 0xb5, 0x3d, 0xf0, 0x7f, 0xfd, 0x02, 0x49, 0x01, 0x20, 0x08, 0x70, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x7e, 0x01, 0x00, 0xf8, 0xb5, 0x0d, 0x1c, 0x0e, 0xf0, 0xc8, 0xfa, 0x26, 0x49, 0x04, 0x1c, 0x88, 0x6a, 0x26, 0x4e, 0x00, 0x28, 0x01, 0xd0, 0x04, 0x20, 0x03, 0xe0, 0x70, 0x6a, 0x00, 0x28, 0x3c, 0x00, 0x30, 0x48, 0x00, 0x00, 0x01, 0xd0, 0x01, 0x38, 0x70, 0x62, 0x00, 0x27, 0x00, 0x2d, 0x02, 0xd0, 0xb7, 0x61, 0xf7, 0x61, 0x0a, 0xe0, 0xb0, 0x69, 0x1c, 0x49, 0x01, 0x30, 0xb0, 0x61, 0x49, 0x6d, 0x00, 0x29, 0x03, 0xd0, 0x03, 0x28, 0x01, 0xd9, 0x01, 0x20, 0xf0, 0x61, 0xb4, 0x60, 0xf1, 0x68, 0x00, 0x91, 0x08, 0xf0, 0xf7, 0xfc, 0xf0, 0x60, 0x00, 0x99, 0x88, 0x42, 0x02, 0xd0, 0x30, 0x62, 0x3c, 0x00, 0x6c, 0x48, 0x00, 0x00, 0x34, 0x61, 0x0b, 0xe0, 0x00, 0xf0, 0x90, 0xf8, 0x00, 0x28, 0x01, 0xd0, 0x11, 0x48, 0x00, 0xe0, 0x11, 0x48, 0x31, 0x69, 0x61, 0x1a, 0x81, 0x42, 0x00, 0xd9, 0x37, 0x62, 0x0b, 0x4a, 0x0c, 0x48, 0xd1, 0x6c, 0x20, 0x30, 0x00, 0x29, 0x01, 0xd0, 0x0a, 0x21, 0x03, 0xe0, 0x01, 0x7a, 0x00, 0x29, 0x01, 0xd0, 0xff, 0x31, 0x01, 0x72, 0x00, 0x2d, 0x03, 0xd1, 0x01, 0x7a, 0x3c, 0x00, 0xa8, 0x48, 0x00, 0x00, 0x00, 0x29, 0x00, 0xd0, 0x91, 0x6a, 0x00, 0x7a, 0x00, 0x28, 0x00, 0xd1, 0x17, 0x65, 0xf8, 0xbd, 0xa4, 0x6c, 0x01, 0x00, 0x3c, 0x7e, 0x01, 0x00, 0xa6, 0x0e, 0x00, 0x00, 0xa8, 0x61, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x06, 0x49, 0x80, 0xb5, 0x89, 0x68, 0x00, 0x29, 0x07, 0xd0, 0x05, 0x21, 0x00, 0x28, 0x00, 0xd1, 0x04, 0x21, 0x08, 0x06, 0x00, 0x0e, 0x03, 0xf0, 0x3c, 0x00, 0xe4, 0x48, 0x00, 0x00, 0x05, 0xfa, 0x80, 0xbd, 0x60, 0x6c, 0x01, 0x00, 0x07, 0x48, 0x00, 0x68, 0x07, 0x49, 0x4a, 0x69, 0x10, 0x40, 0x01, 0xd0, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x49, 0x6a, 0x88, 0x42, 0x01, 0xd1, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x10, 0x00, 0x07, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x70, 0xb5, 0x0e, 0xf0, 0x49, 0xfa, 0x02, 0x1c, 0x00, 0xf0, 0x3a, 0xf8, 0x3c, 0x00, 0x20, 0x49, 0x00, 0x00, 0x10, 0x49, 0x00, 0x28, 0x0e, 0xd0, 0x08, 0x1c, 0xa0, 0x31, 0x0e, 0x78, 0x0e, 0x4b, 0x10, 0x2e, 0x01, 0xd3, 0x80, 0x6f, 0x03, 0xe0, 0x49, 0x78, 0x10, 0x29, 0x0e, 0xd3, 0xc0, 0x6f, 0xc0, 0x18, 0x84, 0x1a, 0x0a, 0xe0, 0x08, 0x1c, 0x80, 0x30, 0x45, 0x69, 0x08, 0x49, 0x8d, 0x42, 0x01, 0xd9, 0x0c, 0x1c, 0x05, 0xe0, 0xc0, 0x68, 0x10, 0x1a, 0x2c, 0x1a, 0x00, 0x2c, 0x3c, 0x00, 0x5c, 0x49, 0x00, 0x00, 0x00, 0xda, 0x64, 0x19, 0x20, 0x1c, 0x70, 0xbd, 0xa4, 0x6c, 0x01, 0x00, 0xa6, 0x0e, 0x00, 0x00, 0x50, 0xc3, 0x00, 0x00, 0x80, 0xb5, 0x05, 0xf0, 0xb7, 0xfb, 0x00, 0x28, 0x02, 0xd0, 0x07, 0xf0, 0x1f, 0xff, 0x80, 0xbd, 0x03, 0x48, 0x00, 0x78, 0x00, 0x28, 0xfa, 0xd0, 0x07, 0xf0, 0x70, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, 0x03, 0x49, 0x01, 0x20, 0x3c, 0x00, 0x98, 0x49, 0x00, 0x00, 0x49, 0x69, 0x03, 0x29, 0x00, 0xd8, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, 0xb0, 0xb5, 0x0a, 0x4d, 0x00, 0x24, 0x28, 0x78, 0x01, 0x28, 0x03, 0xd0, 0x05, 0xf0, 0x6a, 0xfb, 0x04, 0x06, 0x24, 0x0e, 0xfe, 0xf7, 0xd2, 0xfc, 0x00, 0x02, 0x20, 0x43, 0x02, 0xd1, 0x68, 0x6a, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0xb0, 0xbd, 0x00, 0x20, 0xb0, 0xbd, 0x3c, 0x00, 0xd4, 0x49, 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, 0x01, 0x21, 0x01, 0x28, 0x00, 0xd0, 0x00, 0x21, 0x01, 0x48, 0x41, 0x62, 0x70, 0x47, 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, 0x15, 0x48, 0x10, 0xb5, 0x04, 0x68, 0x15, 0x48, 0x00, 0x6a, 0x00, 0x28, 0x14, 0xd0, 0xff, 0xf7, 0xcb, 0xff, 0x00, 0x28, 0x0e, 0xd1, 0x11, 0x48, 0x11, 0x49, 0xc4, 0x30, 0x40, 0x69, 0x88, 0x42, 0x08, 0xd2, 0xcc, 0x08, 0x3c, 0x00, 0x10, 0x4a, 0x00, 0x00, 0xa0, 0x42, 0x05, 0xd3, 0xff, 0xf7, 0x7e, 0xff, 0xa0, 0x42, 0x01, 0xda, 0x0c, 0x4c, 0x01, 0xe0, 0xff, 0x24, 0x91, 0x34, 0x7d, 0x20, 0x00, 0x01, 0x84, 0x42, 0x04, 0xd9, 0x00, 0x22, 0x16, 0x21, 0x83, 0x20, 0x0e, 0xf0, 0xbd, 0xfe, 0x01, 0x23, 0x09, 0x22, 0x21, 0x1c, 0x16, 0x20, 0x0e, 0xf0, 0xa7, 0xfe, 0x10, 0xbd, 0xb0, 0x57, 0x01, 0x00, 0x60, 0x6c, 0x01, 0x00, 0x3c, 0x00, 0x4c, 0x4a, 0x00, 0x00, 0xc0, 0x5d, 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0x70, 0xb5, 0x05, 0x1c, 0x0e, 0x1c, 0x00, 0xf0, 0x43, 0xf8, 0x00, 0x28, 0x0f, 0xd0, 0x08, 0x4c, 0x20, 0x78, 0xc0, 0x07, 0x03, 0xd4, 0x05, 0xf0, 0xab, 0xf9, 0x09, 0xf0, 0x31, 0xfe, 0x00, 0x2d, 0x05, 0xd0, 0x20, 0x78, 0x80, 0x07, 0x02, 0xd4, 0x30, 0x1c, 0x02, 0xf0, 0xfd, 0xfe, 0x70, 0xbd, 0x60, 0x6c, 0x01, 0x00, 0x3c, 0x00, 0x88, 0x4a, 0x00, 0x00, 0xb0, 0xb5, 0x00, 0x28, 0x18, 0xd0, 0x11, 0x48, 0x81, 0x42, 0x15, 0xd2, 0x10, 0x48, 0x0c, 0x1c, 0x0d, 0x18, 0x07, 0xf0, 0xdf, 0xfa, 0x81, 0x00, 0x09, 0x18, 0xa1, 0x42, 0x01, 0xd2, 0x40, 0x00, 0x03, 0xe0, 0x41, 0x00, 0x09, 0x18, 0xa1, 0x42, 0x01, 0xd2, 0x24, 0x1a, 0x06, 0xe0, 0x41, 0x00, 0xa1, 0x42, 0x03, 0xd2, 0x40, 0x08, 0xf8, 0xe7, 0x06, 0x4d, 0x07, 0x4c, 0x3c, 0x00, 0xc4, 0x4a, 0x00, 0x00, 0x0e, 0xf0, 0x72, 0xf9, 0x00, 0x19, 0x29, 0x1c, 0x07, 0xf0, 0xdc, 0xfa, 0xb0, 0xbd, 0x00, 0x00, 0x80, 0xb9, 0x2a, 0x00, 0x53, 0x07, 0x00, 0x00, 0x4c, 0x1d, 0x00, 0x00, 0x88, 0x13, 0x00, 0x00, 0xb0, 0xb5, 0x05, 0xf0, 0xfd, 0xfa, 0x00, 0x28, 0x13, 0xd1, 0xfe, 0xf7, 0xb5, 0xfe, 0x0a, 0x4c, 0x0a, 0x4d, 0x00, 0x28, 0x60, 0x63, 0x00, 0xd0, 0x28, 0x60, 0x0e, 0xf0, 0x3c, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x55, 0xf9, 0x21, 0x6a, 0x00, 0x29, 0x04, 0xd1, 0xe1, 0x69, 0x40, 0x1a, 0x29, 0x68, 0x88, 0x42, 0x01, 0xd9, 0x01, 0x20, 0xb0, 0xbd, 0x00, 0x20, 0xb0, 0xbd, 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, 0xb0, 0x57, 0x01, 0x00, 0x80, 0xb5, 0xff, 0xf7, 0xdd, 0xff, 0x00, 0x28, 0x05, 0xd0, 0x05, 0xf0, 0xb7, 0xfa, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x80, 0xbd, 0x00, 0x20, 0x3c, 0x00, 0x3c, 0x4b, 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x0a, 0x4c, 0x00, 0x21, 0xa2, 0x68, 0x00, 0x2a, 0x03, 0xd0, 0xa1, 0x60, 0x02, 0xf0, 0x83, 0xf9, 0x10, 0xbd, 0x61, 0x60, 0x01, 0x1c, 0x00, 0x22, 0x04, 0x20, 0x0e, 0xf0, 0x36, 0xfd, 0x03, 0x48, 0x21, 0x68, 0x0a, 0xf0, 0x08, 0xfc, 0x10, 0xbd, 0x00, 0x00, 0xbc, 0x74, 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, 0x70, 0xb5, 0x05, 0x1c, 0x3c, 0x00, 0x78, 0x4b, 0x00, 0x00, 0x01, 0xd1, 0xfc, 0xf7, 0xc1, 0xfb, 0x20, 0x4c, 0xe0, 0x6a, 0x00, 0x28, 0x15, 0xd0, 0x1f, 0x4b, 0xa0, 0x69, 0x58, 0x43, 0xc6, 0x0b, 0x20, 0x88, 0x46, 0x43, 0xf0, 0x00, 0x80, 0x19, 0xe6, 0x60, 0xfb, 0xf7, 0x1c, 0xfe, 0xa8, 0x42, 0x05, 0xd8, 0x30, 0x1c, 0xfb, 0xf7, 0x17, 0xfe, 0x80, 0x19, 0xa8, 0x42, 0x02, 0xd2, 0x00, 0x20, 0xe0, 0x60, 0x20, 0xe0, 0xe5, 0x60, 0x3c, 0x00, 0xb4, 0x4b, 0x00, 0x00, 0x00, 0x2d, 0x1d, 0xd0, 0x26, 0x88, 0xa0, 0x69, 0x70, 0x43, 0xc1, 0x03, 0x28, 0x1c, 0xfb, 0xf7, 0xa5, 0xfd, 0x60, 0x61, 0x0d, 0x48, 0x32, 0x1c, 0x29, 0x1c, 0x30, 0x30, 0xfb, 0xf7, 0x0a, 0xfc, 0x0c, 0x4b, 0x60, 0x69, 0x58, 0x43, 0xc0, 0x0b, 0x60, 0x62, 0x01, 0xf0, 0xb7, 0xfd, 0xa0, 0x62, 0xe0, 0x68, 0x00, 0x28, 0x04, 0xd0, 0x20, 0x69, 0xa1, 0x68, 0xfb, 0xf7, 0x3c, 0x00, 0xf0, 0x4b, 0x00, 0x00, 0xf4, 0xfb, 0x70, 0xbd, 0x05, 0x48, 0xa1, 0x68, 0xfb, 0xf7, 0xef, 0xfb, 0x70, 0xbd, 0x00, 0x00, 0xc8, 0x74, 0x01, 0x00, 0x40, 0x42, 0x0f, 0x00, 0xc0, 0xc6, 0x2d, 0x00, 0x88, 0x13, 0x00, 0x00, 0xf1, 0xb5, 0x3e, 0x48, 0x00, 0xab, 0x81, 0x78, 0xc0, 0x78, 0x3e, 0x4f, 0x0a, 0x07, 0x04, 0x07, 0x58, 0x78, 0x3b, 0x49, 0x12, 0x0f, 0x08, 0x5c, 0x14, 0x39, 0x24, 0x0f, 0x3c, 0x00, 0x2c, 0x4c, 0x00, 0x00, 0x80, 0x18, 0x78, 0x60, 0x01, 0x30, 0xb8, 0x60, 0x18, 0x78, 0x35, 0x4d, 0x08, 0x5c, 0x00, 0x19, 0xb8, 0x61, 0x01, 0x30, 0xf8, 0x61, 0xeb, 0x78, 0x33, 0x48, 0x1e, 0x09, 0x33, 0x4b, 0x18, 0x38, 0x81, 0x78, 0x5e, 0x43, 0xab, 0x78, 0x1d, 0x09, 0xc8, 0x23, 0x6b, 0x43, 0x00, 0x29, 0x08, 0xd1, 0x2b, 0x4d, 0x2d, 0x78, 0x3d, 0x60, 0xc5, 0x60, 0x7d, 0x25, 0xed, 0x00, 0x3c, 0x00, 0x68, 0x4c, 0x00, 0x00, 0x5d, 0x1b, 0x2c, 0x4b, 0x07, 0xe0, 0x27, 0x4d, 0x6d, 0x78, 0x3d, 0x60, 0xc5, 0x60, 0x4b, 0x25, 0x2d, 0x01, 0x5d, 0x1b, 0x28, 0x4b, 0xf6, 0x18, 0x02, 0x20, 0x00, 0xf0, 0x57, 0xf8, 0x28, 0x1a, 0xf8, 0x60, 0x22, 0x48, 0x22, 0x1c, 0x18, 0x38, 0x81, 0x78, 0x03, 0x20, 0x00, 0xf0, 0x4e, 0xf8, 0x30, 0x1a, 0x38, 0x62, 0x39, 0x68, 0x00, 0xab, 0x79, 0x61, 0x5a, 0x78, 0x3c, 0x00, 0xa4, 0x4c, 0x00, 0x00, 0x56, 0x23, 0xf9, 0x68, 0x5a, 0x43, 0x89, 0x1a, 0xf9, 0x60, 0xc8, 0x31, 0x39, 0x61, 0x18, 0x49, 0x18, 0x39, 0x89, 0x78, 0x00, 0x29, 0xb9, 0x69, 0x11, 0xd1, 0x00, 0xab, 0x1a, 0x78, 0x13, 0x4b, 0x14, 0x3b, 0x9a, 0x5c, 0x53, 0x1c, 0x59, 0x43, 0x0a, 0x23, 0x59, 0x43, 0x14, 0x4b, 0x59, 0x1a, 0x51, 0x43, 0x0a, 0x23, 0x59, 0x43, 0x40, 0x1a, 0x38, 0x62, 0x12, 0x49, 0x3c, 0x00, 0xe0, 0x4c, 0x00, 0x00, 0x10, 0xe0, 0x00, 0xab, 0x1a, 0x78, 0x0a, 0x4b, 0x14, 0x3b, 0x9a, 0x5c, 0x53, 0x1c, 0x59, 0x43, 0x0a, 0x23, 0x59, 0x43, 0x0d, 0x4b, 0x59, 0x1a, 0x51, 0x43, 0x0a, 0x23, 0x59, 0x43, 0x40, 0x1a, 0x0b, 0x49, 0x38, 0x62, 0x40, 0x18, 0x78, 0x62, 0xf8, 0xbd, 0x00, 0x00, 0x0c, 0x5a, 0x01, 0x00, 0x66, 0x5a, 0x01, 0x00, 0x94, 0x78, 0x01, 0x00, 0xa0, 0x86, 0x01, 0x00, 0x3c, 0x00, 0x1c, 0x4d, 0x00, 0x00, 0x00, 0x48, 0x71, 0x00, 0xb0, 0xd6, 0x8c, 0x00, 0x88, 0x10, 0x00, 0x00, 0x80, 0x38, 0x01, 0x00, 0x58, 0x12, 0x00, 0x00, 0x70, 0x11, 0x01, 0x00, 0x30, 0xb5, 0x19, 0x4b, 0x02, 0x28, 0xdd, 0x68, 0x06, 0xd1, 0x00, 0x29, 0x04, 0xd1, 0x2b, 0x1c, 0x0c, 0x33, 0x9c, 0x1a, 0x64, 0x23, 0x5c, 0x43, 0x02, 0x28, 0x09, 0xd1, 0x01, 0x29, 0x07, 0xd1, 0x64, 0x23, 0x7d, 0x24, 0x3c, 0x00, 0x58, 0x4d, 0x00, 0x00, 0xe4, 0x00, 0x6b, 0x43, 0x1c, 0x19, 0xa0, 0x23, 0x53, 0x43, 0xe4, 0x1a, 0x0a, 0x23, 0x5a, 0x43, 0x03, 0x28, 0x09, 0xd1, 0x00, 0x29, 0x07, 0xd1, 0x13, 0x23, 0xff, 0x24, 0xe4, 0x00, 0x6b, 0x43, 0x1b, 0x19, 0x9b, 0x1a, 0x1c, 0x1c, 0x5c, 0x43, 0x03, 0x28, 0x08, 0xd1, 0x01, 0x29, 0x06, 0xd1, 0x0e, 0x20, 0x05, 0x49, 0x68, 0x43, 0x40, 0x18, 0x80, 0x1a, 0x04, 0x1c, 0x3c, 0x00, 0x94, 0x4d, 0x00, 0x00, 0x44, 0x43, 0x20, 0x1c, 0x30, 0xbd, 0x00, 0x00, 0x7c, 0x78, 0x01, 0x00, 0x84, 0x08, 0x00, 0x00, 0x10, 0xb5, 0x07, 0x4c, 0x0c, 0x23, 0x60, 0x78, 0x05, 0x49, 0x14, 0x31, 0x58, 0x43, 0x40, 0x18, 0x40, 0x68, 0x01, 0xf0, 0x4f, 0xfc, 0x00, 0x21, 0x60, 0x78, 0x02, 0xf0, 0x4b, 0xff, 0x10, 0xbd, 0x4c, 0x7b, 0x01, 0x00, 0x0c, 0x48, 0xf8, 0xb5, 0x40, 0x78, 0x0c, 0x23, 0x3c, 0x00, 0xd0, 0x4d, 0x00, 0x00, 0x0a, 0x49, 0x58, 0x43, 0x14, 0x31, 0x44, 0x18, 0x26, 0x1d, 0x60, 0xce, 0x30, 0x1c, 0x0b, 0xf0, 0x0b, 0xfd, 0x00, 0x27, 0x41, 0x20, 0x47, 0x55, 0x05, 0x48, 0x29, 0x1c, 0x02, 0xf0, 0xf0, 0xfe, 0x28, 0x1c, 0x01, 0xf0, 0x31, 0xfc, 0x04, 0x34, 0xc0, 0xc4, 0xf8, 0xbd, 0x4c, 0x7b, 0x01, 0x00, 0x55, 0x80, 0x00, 0x00, 0xb0, 0xb5, 0x0a, 0x4d, 0x4c, 0x21, 0x28, 0x78, 0x3c, 0x00, 0x0c, 0x4e, 0x00, 0x00, 0x09, 0x4a, 0x41, 0x43, 0x8c, 0x18, 0x22, 0x68, 0x01, 0x21, 0xfb, 0xf7, 0xe1, 0xfa, 0x28, 0x78, 0x01, 0xf0, 0xfa, 0xfb, 0x3c, 0x23, 0xe0, 0x56, 0x41, 0x1e, 0x01, 0x20, 0x07, 0xf0, 0x34, 0xfb, 0xb0, 0xbd, 0x00, 0x00, 0x3c, 0x7c, 0x01, 0x00, 0x58, 0xe3, 0x01, 0x00, 0x0c, 0x23, 0x07, 0x49, 0x58, 0x43, 0x40, 0x18, 0x80, 0xb5, 0x40, 0x68, 0x41, 0x6b, 0x00, 0x29, 0x3c, 0x00, 0x48, 0x4e, 0x00, 0x00, 0x02, 0xd0, 0x0b, 0xf0, 0xfb, 0xfd, 0x80, 0xbd, 0x0b, 0xf0, 0x2c, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0x38, 0x22, 0x0a, 0x4b, 0x42, 0x43, 0xd2, 0x18, 0x00, 0x29, 0x80, 0xb5, 0x04, 0xd0, 0x02, 0x29, 0x07, 0xd1, 0x0b, 0xf0, 0xfb, 0xfc, 0x80, 0xbd, 0xd2, 0x6a, 0x01, 0x21, 0xfb, 0xf7, 0xb0, 0xfa, 0x80, 0xbd, 0x03, 0x21, 0x86, 0x20, 0xfc, 0xf7, 0x3c, 0x00, 0x84, 0x4e, 0x00, 0x00, 0x0f, 0xfa, 0x80, 0xbd, 0xd4, 0xe4, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x06, 0x24, 0x0e, 0x0c, 0x20, 0x0e, 0x49, 0x60, 0x43, 0x40, 0x18, 0x45, 0x68, 0xa8, 0x6b, 0x00, 0x28, 0x03, 0xd1, 0x00, 0x21, 0x20, 0x1c, 0xfd, 0xf7, 0xe1, 0xfa, 0x20, 0x1c, 0x07, 0xf0, 0xf2, 0xff, 0x00, 0x28, 0x08, 0xd0, 0x28, 0x1c, 0x60, 0x30, 0xc1, 0x79, 0x01, 0x29, 0x03, 0xd9, 0xff, 0x31, 0x3c, 0x00, 0xc0, 0x4e, 0x00, 0x00, 0xc1, 0x71, 0xff, 0x31, 0x81, 0x71, 0x01, 0x21, 0x20, 0x1c, 0x02, 0xf0, 0xc5, 0xfe, 0xb0, 0xbd, 0x60, 0x7b, 0x01, 0x00, 0x70, 0xb5, 0x00, 0x06, 0x00, 0x0e, 0x05, 0x1c, 0x4c, 0x23, 0x0a, 0x49, 0x58, 0x43, 0x44, 0x18, 0x3c, 0x20, 0x00, 0x5d, 0xff, 0x30, 0x06, 0x06, 0x36, 0x16, 0x28, 0x1c, 0x01, 0xf0, 0x90, 0xfb, 0x00, 0x21, 0x28, 0x1c, 0x22, 0x68, 0xfb, 0xf7, 0x3c, 0x00, 0xfc, 0x4e, 0x00, 0x00, 0x6f, 0xfa, 0x31, 0x1c, 0x00, 0x20, 0x07, 0xf0, 0xc7, 0xfa, 0x70, 0xbd, 0x58, 0xe3, 0x01, 0x00, 0x0c, 0x22, 0x0f, 0x4b, 0x42, 0x43, 0xd2, 0x18, 0x10, 0xb5, 0x54, 0x68, 0x00, 0x29, 0x0d, 0xd0, 0x02, 0x29, 0x0f, 0xd1, 0x2c, 0x20, 0x00, 0x5d, 0x00, 0x28, 0x03, 0xd0, 0x07, 0x21, 0x0c, 0x20, 0xfc, 0xf7, 0xba, 0xf9, 0x20, 0x1c, 0x0b, 0xf0, 0xbb, 0xfc, 0x10, 0xbd, 0x3c, 0x00, 0x38, 0x4f, 0x00, 0x00, 0x00, 0x21, 0x02, 0xf0, 0x8d, 0xfe, 0x10, 0xbd, 0x04, 0x21, 0x0c, 0x20, 0xfc, 0xf7, 0xae, 0xf9, 0x10, 0xbd, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x29, 0x07, 0xd0, 0x0c, 0x23, 0x05, 0x49, 0x58, 0x43, 0x40, 0x18, 0x40, 0x68, 0x0b, 0xf0, 0x4a, 0xfc, 0x80, 0xbd, 0x01, 0x21, 0x02, 0xf0, 0x76, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0x3c, 0x00, 0x74, 0x4f, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x00, 0x29, 0x05, 0xd0, 0x02, 0x29, 0x1a, 0xd1, 0x20, 0x1c, 0x0b, 0xf0, 0xeb, 0xfc, 0x10, 0xbd, 0x0d, 0x48, 0x04, 0x70, 0x0d, 0x48, 0x07, 0xf0, 0x07, 0xf9, 0x0d, 0x48, 0x01, 0x88, 0x01, 0x22, 0x12, 0x03, 0x11, 0x43, 0x01, 0x80, 0x4c, 0x20, 0x0a, 0x49, 0x60, 0x43, 0x40, 0x18, 0x40, 0x30, 0x00, 0x78, 0xfd, 0xf7, 0x5d, 0xfd, 0x20, 0x1c, 0x3c, 0x00, 0xb0, 0x4f, 0x00, 0x00, 0x0a, 0xf0, 0xd4, 0xf8, 0x10, 0xbd, 0x03, 0x21, 0x86, 0x20, 0xfc, 0xf7, 0x73, 0xf9, 0x10, 0xbd, 0x3c, 0x7c, 0x01, 0x00, 0x05, 0x4e, 0x00, 0x00, 0x32, 0x80, 0x07, 0x00, 0x58, 0xe3, 0x01, 0x00, 0xff, 0xb5, 0x05, 0x1c, 0x01, 0x20, 0x83, 0xb0, 0x01, 0x90, 0x0c, 0x20, 0x5d, 0x4a, 0x68, 0x43, 0x86, 0x18, 0x01, 0x27, 0x00, 0x29, 0x74, 0x68, 0x0e, 0xd0, 0x02, 0x29, 0x3c, 0x00, 0xec, 0x4f, 0x00, 0x00, 0x6a, 0xd1, 0x2c, 0x20, 0x00, 0x5d, 0x00, 0x28, 0x03, 0xd0, 0x06, 0x21, 0x0c, 0x20, 0xfc, 0xf7, 0x53, 0xf9, 0x20, 0x1c, 0x0b, 0xf0, 0x20, 0xfd, 0x07, 0xb0, 0xf0, 0xbd, 0x52, 0x48, 0x14, 0x38, 0x45, 0x70, 0xa0, 0x6b, 0x00, 0x28, 0x07, 0xd0, 0x50, 0x48, 0x07, 0xf0, 0x7f, 0xf8, 0x01, 0x21, 0x28, 0x1c, 0xfd, 0xf7, 0x25, 0xfa, 0x1c, 0xe0, 0x4d, 0x48, 0x07, 0xf0, 0x3c, 0x00, 0x28, 0x50, 0x00, 0x00, 0x77, 0xf8, 0x4a, 0x48, 0x14, 0x38, 0x05, 0x70, 0x4b, 0x48, 0x01, 0x88, 0x01, 0x22, 0x52, 0x03, 0x11, 0x43, 0x01, 0x80, 0x40, 0x20, 0x00, 0x5d, 0xfd, 0xf7, 0x12, 0xfd, 0xb0, 0x68, 0x00, 0x28, 0x09, 0xd1, 0x28, 0x1c, 0x07, 0xf0, 0x64, 0xff, 0xb0, 0x60, 0x00, 0x28, 0x03, 0xd1, 0x09, 0x21, 0x0c, 0x20, 0xfc, 0xf7, 0x23, 0xf9, 0x05, 0x98, 0x00, 0x28, 0x03, 0xd0, 0x3c, 0x00, 0x64, 0x50, 0x00, 0x00, 0xe0, 0x6c, 0x01, 0x30, 0xe0, 0x64, 0x0e, 0xe0, 0x67, 0x20, 0x00, 0x5d, 0x00, 0x28, 0x07, 0xd1, 0xe0, 0x6c, 0x00, 0x28, 0x04, 0xd1, 0x39, 0x48, 0x02, 0x38, 0xc0, 0x6a, 0xa0, 0x64, 0x09, 0xe0, 0x20, 0x6d, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x27, 0x04, 0xe0, 0x28, 0x1c, 0x07, 0xf0, 0x00, 0xff, 0x00, 0x28, 0xe5, 0xd1, 0x05, 0x98, 0x20, 0x65, 0x20, 0x1c, 0x20, 0x30, 0x3c, 0x00, 0xa0, 0x50, 0x00, 0x00, 0x62, 0x6a, 0x02, 0x90, 0x81, 0x7b, 0x28, 0x1c, 0x07, 0xf0, 0x78, 0xff, 0x00, 0x2f, 0x19, 0xd0, 0x20, 0x1c, 0x60, 0x30, 0xc1, 0x79, 0x4a, 0x1c, 0xc2, 0x71, 0x80, 0x79, 0x81, 0x42, 0x02, 0xd2, 0x01, 0x20, 0x01, 0xe0, 0x40, 0xe0, 0x00, 0x20, 0x01, 0x90, 0x00, 0x28, 0x0a, 0xd0, 0x25, 0x48, 0x00, 0x78, 0x80, 0x07, 0x06, 0xd5, 0x00, 0xf0, 0x0d, 0xfb, 0x01, 0x1c, 0x3c, 0x00, 0xdc, 0x50, 0x00, 0x00, 0x20, 0x1c, 0x0b, 0xf0, 0x15, 0xfd, 0x01, 0x90, 0x01, 0x98, 0x00, 0x28, 0x0f, 0xd0, 0x02, 0x98, 0x00, 0x7b, 0x02, 0x28, 0x03, 0xd1, 0x20, 0x1c, 0x04, 0xf0, 0xd0, 0xfe, 0x84, 0xe7, 0x01, 0x28, 0x00, 0xd0, 0x7e, 0xe7, 0x21, 0x1c, 0x30, 0x1c, 0x04, 0xf0, 0xe2, 0xfe, 0x7c, 0xe7, 0x25, 0x1c, 0x60, 0x35, 0xe8, 0x79, 0xff, 0x30, 0xa8, 0x71, 0x68, 0x7a, 0x06, 0xf0, 0x3c, 0x00, 0x18, 0x51, 0x00, 0x00, 0x9d, 0xfc, 0x0d, 0xf0, 0x47, 0xfe, 0x07, 0x1c, 0x05, 0xf0, 0x12, 0xff, 0x3f, 0x18, 0x02, 0x98, 0x81, 0x7b, 0x20, 0x69, 0x04, 0x30, 0x00, 0xf0, 0x35, 0xfa, 0x61, 0x6a, 0x05, 0xf0, 0xea, 0xfe, 0x39, 0x18, 0x6b, 0x7a, 0x30, 0x88, 0x80, 0x31, 0x09, 0x4a, 0x0d, 0xf0, 0x91, 0xfe, 0x5d, 0xe7, 0x03, 0x21, 0x0c, 0x20, 0xfc, 0xf7, 0xaa, 0xf8, 0x58, 0xe7, 0x00, 0x00, 0x3c, 0x00, 0x54, 0x51, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0xa5, 0x4d, 0x00, 0x00, 0xc9, 0x4d, 0x00, 0x00, 0x32, 0x80, 0x07, 0x00, 0x1d, 0x75, 0x01, 0x00, 0x8d, 0x4e, 0x00, 0x00, 0xff, 0xb5, 0x81, 0xb0, 0x1f, 0x1c, 0x05, 0x1c, 0x14, 0x1c, 0x10, 0x1c, 0x0a, 0x9e, 0x00, 0xf0, 0xf5, 0xfc, 0x29, 0x1c, 0x10, 0x31, 0x20, 0x1d, 0x06, 0x22, 0xfb, 0xf7, 0xb7, 0xf9, 0xa8, 0x8e, 0x20, 0x80, 0xe8, 0x8e, 0x3c, 0x00, 0x90, 0x51, 0x00, 0x00, 0x60, 0x80, 0x02, 0x99, 0x20, 0x1c, 0x00, 0xf0, 0x07, 0xf9, 0xff, 0x34, 0x01, 0x34, 0x66, 0x60, 0x27, 0x60, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x0f, 0x1c, 0x1e, 0x1c, 0x05, 0x1c, 0x14, 0x1c, 0x10, 0x1c, 0x00, 0xf0, 0xd8, 0xfc, 0xa8, 0x88, 0x39, 0x1c, 0x20, 0x80, 0x28, 0x89, 0x60, 0x80, 0x20, 0x1c, 0x00, 0xf0, 0xf0, 0xf8, 0xff, 0x34, 0x01, 0x34, 0x3c, 0x00, 0xcc, 0x51, 0x00, 0x00, 0x66, 0x60, 0xf8, 0xbd, 0x70, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0x05, 0x68, 0x20, 0x1c, 0x14, 0x30, 0x06, 0x1c, 0x00, 0xf0, 0x0f, 0xfb, 0x00, 0x28, 0x16, 0xd0, 0x01, 0x22, 0x02, 0x21, 0x20, 0x69, 0x05, 0xf0, 0xf8, 0xfa, 0x00, 0x28, 0x01, 0xd0, 0xfb, 0xf7, 0x24, 0xff, 0x00, 0x22, 0x02, 0x21, 0x20, 0x69, 0x05, 0xf0, 0xef, 0xfa, 0x00, 0x28, 0x06, 0xd0, 0xfb, 0xf7, 0x3c, 0x00, 0x08, 0x52, 0x00, 0x00, 0x01, 0xff, 0x00, 0x28, 0x02, 0xd0, 0x30, 0x1c, 0x0b, 0xf0, 0x7c, 0xfb, 0x68, 0x89, 0x80, 0x07, 0xc0, 0x0f, 0x03, 0xf0, 0xa7, 0xf8, 0x18, 0x23, 0x04, 0x49, 0x58, 0x43, 0x40, 0x18, 0xc1, 0x68, 0x00, 0x29, 0x02, 0xd0, 0x20, 0x1c, 0xfb, 0xf7, 0xd4, 0xf8, 0x70, 0xbd, 0x94, 0x67, 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0x10, 0x1c, 0x0d, 0x1c, 0x19, 0x1c, 0xff, 0x22, 0x3c, 0x00, 0x44, 0x52, 0x00, 0x00, 0x00, 0x27, 0xff, 0x2d, 0x25, 0xd0, 0x00, 0x29, 0x05, 0xd0, 0x4b, 0x88, 0x00, 0x2b, 0x02, 0xd0, 0x00, 0xf0, 0x50, 0xfc, 0x15, 0xe0, 0x00, 0x21, 0x10, 0x4e, 0x4b, 0x00, 0x9e, 0x19, 0x02, 0x23, 0xf6, 0x5e, 0x86, 0x42, 0x01, 0xdd, 0x0a, 0x1c, 0x04, 0xe0, 0x01, 0x31, 0x09, 0x06, 0x09, 0x0e, 0x26, 0x29, 0xf1, 0xd3, 0x09, 0x4e, 0x50, 0x00, 0x80, 0x19, 0x4e, 0x23, 0x3c, 0x00, 0x80, 0x52, 0x00, 0x00, 0xc0, 0x5e, 0x27, 0x2a, 0x07, 0xd2, 0x06, 0x49, 0x20, 0x39, 0x49, 0x57, 0x47, 0x31, 0x40, 0x1a, 0x20, 0x60, 0x01, 0x27, 0x02, 0xe0, 0x7e, 0x20, 0xc0, 0x43, 0x20, 0x60, 0x38, 0x1c, 0xf8, 0xbd, 0xfa, 0x47, 0x01, 0x00, 0xb0, 0xb5, 0x0c, 0x1c, 0x7e, 0x21, 0x05, 0x1c, 0x00, 0x20, 0xc9, 0x43, 0x00, 0x2c, 0x0f, 0xd0, 0x10, 0x1c, 0x05, 0xf0, 0x6b, 0xfd, 0x00, 0x28, 0x3c, 0x00, 0xbc, 0x52, 0x00, 0x00, 0x02, 0xd0, 0x21, 0x1c, 0xc9, 0x39, 0x01, 0xe0, 0x21, 0x1c, 0x86, 0x39, 0x02, 0x20, 0xc0, 0x43, 0xfb, 0xf7, 0xb4, 0xf9, 0x01, 0x1c, 0x01, 0x20, 0x29, 0x60, 0xb0, 0xbd, 0x98, 0xb5, 0x14, 0x1c, 0x00, 0x22, 0x00, 0x92, 0x22, 0x1c, 0xfd, 0xf7, 0x43, 0xfe, 0x98, 0xbd, 0x05, 0x49, 0x80, 0xb5, 0x08, 0x60, 0x05, 0x49, 0x01, 0x20, 0xc8, 0x61, 0x01, 0x21, 0x00, 0x20, 0x3c, 0x00, 0xf8, 0x52, 0x00, 0x00, 0x03, 0xf0, 0x1c, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x20, 0x67, 0x01, 0x00, 0xac, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x21, 0x00, 0x20, 0x03, 0xf0, 0x11, 0xfe, 0x06, 0xf0, 0x0d, 0xfb, 0x02, 0x49, 0x00, 0x20, 0x08, 0x60, 0x80, 0xbd, 0x00, 0x00, 0x20, 0x67, 0x01, 0x00, 0x03, 0x49, 0x01, 0x20, 0x09, 0x69, 0x00, 0x29, 0x00, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0x34, 0x53, 0x00, 0x00, 0x10, 0x67, 0x01, 0x00, 0x03, 0x48, 0x00, 0x69, 0x00, 0x28, 0x01, 0xd0, 0x40, 0x69, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x10, 0x67, 0x01, 0x00, 0x70, 0xb5, 0x16, 0x1c, 0x0d, 0x1c, 0x04, 0x1c, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x2c, 0x07, 0xd1, 0x00, 0xf0, 0x36, 0xfa, 0x00, 0x28, 0x05, 0xd0, 0x13, 0xf0, 0xca, 0xf9, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x70, 0xbd, 0x3c, 0x00, 0x70, 0x53, 0x00, 0x00, 0x01, 0x20, 0x00, 0x2c, 0x00, 0xd0, 0x00, 0x20, 0x0a, 0x4c, 0x04, 0x34, 0x61, 0xc4, 0x10, 0x3c, 0x00, 0xf0, 0x24, 0xfa, 0x00, 0x28, 0x02, 0xd0, 0x00, 0xf0, 0xc6, 0xf9, 0x01, 0xe0, 0x00, 0xf0, 0xe5, 0xf8, 0xc0, 0x30, 0xc3, 0x6b, 0x22, 0x1d, 0x07, 0xca, 0xfb, 0xf7, 0x20, 0xf8, 0x00, 0x20, 0x70, 0xbd, 0x00, 0x00, 0xd4, 0x67, 0x01, 0x00, 0xf8, 0xb5, 0x0d, 0x1c, 0x3c, 0x00, 0xac, 0x53, 0x00, 0x00, 0x00, 0x21, 0x04, 0x1c, 0x28, 0x1c, 0x05, 0xf0, 0xe3, 0xf9, 0x23, 0x1c, 0xff, 0x33, 0x21, 0x33, 0xff, 0x27, 0x00, 0x28, 0x05, 0xd0, 0x22, 0x22, 0x01, 0x1c, 0x18, 0x1c, 0xfb, 0xf7, 0x96, 0xf8, 0x00, 0xe0, 0x1f, 0x70, 0x03, 0x21, 0x28, 0x1c, 0x05, 0xf0, 0xd2, 0xf9, 0x26, 0x1c, 0xff, 0x36, 0x41, 0x36, 0x00, 0x28, 0x05, 0xd0, 0x03, 0x22, 0x01, 0x1c, 0xb0, 0x1c, 0x3c, 0x00, 0xe8, 0x53, 0x00, 0x00, 0xfb, 0xf7, 0x86, 0xf8, 0x00, 0xe0, 0xb7, 0x70, 0x01, 0x21, 0x28, 0x1c, 0x05, 0xf0, 0xc2, 0xf9, 0x00, 0x28, 0x07, 0xd0, 0x01, 0x1c, 0x20, 0x1c, 0xff, 0x30, 0x0a, 0x22, 0x46, 0x30, 0xfb, 0xf7, 0x77, 0xf8, 0x00, 0xe0, 0x77, 0x71, 0x32, 0x21, 0x28, 0x1c, 0x05, 0xf0, 0xb3, 0xf9, 0x00, 0x28, 0x07, 0xd0, 0x01, 0x1c, 0x20, 0x1c, 0xff, 0x30, 0x12, 0x22, 0x50, 0x30, 0x3c, 0x00, 0x24, 0x54, 0x00, 0x00, 0xfb, 0xf7, 0x68, 0xf8, 0x00, 0xe0, 0xf7, 0x73, 0x06, 0x21, 0x28, 0x1c, 0x05, 0xf0, 0xa4, 0xf9, 0x00, 0x28, 0x07, 0xd0, 0x01, 0x1c, 0x20, 0x1c, 0xff, 0x30, 0x04, 0x22, 0x63, 0x30, 0xfb, 0xf7, 0x59, 0xf8, 0xf8, 0xbd, 0xff, 0x34, 0x61, 0x34, 0xa7, 0x70, 0xfa, 0xe7, 0x08, 0x49, 0x80, 0xb5, 0x09, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x07, 0x48, 0x01, 0x68, 0x08, 0x1c, 0x3c, 0x00, 0x60, 0x54, 0x00, 0x00, 0x05, 0xd1, 0x03, 0x21, 0x90, 0x20, 0xfb, 0xf7, 0x1d, 0xff, 0x00, 0x20, 0x80, 0xbd, 0x01, 0xf0, 0xd7, 0xfb, 0x80, 0xbd, 0x1c, 0x67, 0x01, 0x00, 0x20, 0x67, 0x01, 0x00, 0x80, 0xb5, 0xff, 0xf7, 0xe7, 0xff, 0x80, 0xbd, 0xf0, 0xb5, 0x00, 0x24, 0x84, 0x46, 0x00, 0x20, 0x0b, 0xe0, 0x87, 0x40, 0x17, 0x40, 0x07, 0xd0, 0x14, 0x23, 0x0b, 0x4d, 0x43, 0x43, 0x5b, 0x19, 0x3c, 0x00, 0x9c, 0x54, 0x00, 0x00, 0x1b, 0x7c, 0x65, 0x46, 0x2b, 0x55, 0x01, 0x34, 0x01, 0x30, 0x01, 0x27, 0x3b, 0x1c, 0x0e, 0x28, 0x00, 0xd3, 0x00, 0x23, 0x0e, 0x88, 0x3d, 0x1c, 0xa6, 0x42, 0x00, 0xdc, 0x00, 0x25, 0x2b, 0x40, 0xe7, 0xd1, 0x0c, 0x80, 0xf0, 0xbd, 0x00, 0x00, 0x74, 0x40, 0x01, 0x00, 0x78, 0xb5, 0x04, 0x1c, 0x01, 0x20, 0x20, 0x70, 0x08, 0x20, 0x00, 0xab, 0x0d, 0x1c, 0x18, 0x80, 0x3c, 0x00, 0xd8, 0x54, 0x00, 0x00, 0x16, 0x1c, 0xa0, 0x1c, 0x69, 0x46, 0xff, 0xf7, 0xd1, 0xff, 0x00, 0xab, 0x00, 0x22, 0xd2, 0x43, 0x19, 0x88, 0x82, 0x40, 0x61, 0x70, 0x32, 0x20, 0x28, 0x70, 0x10, 0x20, 0x18, 0x80, 0x32, 0x40, 0xa8, 0x1c, 0x69, 0x46, 0xff, 0xf7, 0xc2, 0xff, 0x00, 0xab, 0x18, 0x88, 0x68, 0x70, 0x78, 0xbd, 0x80, 0xb5, 0x02, 0xf0, 0x35, 0xff, 0x00, 0x21, 0x00, 0x28, 0x00, 0xd0, 0x3c, 0x00, 0x14, 0x55, 0x00, 0x00, 0x01, 0x69, 0x08, 0x1c, 0x80, 0xbd, 0x00, 0x00, 0x05, 0x49, 0x00, 0x28, 0x01, 0xd0, 0xc8, 0x68, 0x00, 0xe0, 0x08, 0x69, 0x00, 0x28, 0x01, 0xd0, 0x04, 0x30, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x10, 0x67, 0x01, 0x00, 0x03, 0x48, 0x00, 0x69, 0x00, 0x28, 0x01, 0xd0, 0x04, 0x30, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x10, 0x67, 0x01, 0x00, 0x02, 0x48, 0x00, 0x69, 0x3c, 0x00, 0x50, 0x55, 0x00, 0x00, 0x00, 0x28, 0xff, 0xd1, 0x70, 0x47, 0x00, 0x00, 0x10, 0x67, 0x01, 0x00, 0x10, 0xb5, 0x05, 0x4c, 0x20, 0x69, 0x00, 0x28, 0x03, 0xd1, 0x04, 0x21, 0x90, 0x20, 0xfb, 0xf7, 0x9b, 0xfe, 0x20, 0x69, 0x10, 0xbd, 0x00, 0x00, 0x10, 0x67, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x00, 0xf0, 0x40, 0xf9, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x20, 0x10, 0xbd, 0x20, 0x1c, 0x00, 0xf0, 0x3c, 0x00, 0x8c, 0x55, 0x00, 0x00, 0x57, 0xf9, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x20, 0x10, 0xbd, 0x02, 0x20, 0x10, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x0f, 0x4e, 0x04, 0x1c, 0x30, 0x68, 0x0d, 0x1c, 0x00, 0x28, 0x07, 0xd0, 0x21, 0x1c, 0x04, 0x30, 0x05, 0xf0, 0xc1, 0xfb, 0x00, 0x28, 0x01, 0xd0, 0x30, 0x68, 0x0b, 0xe0, 0x09, 0x4a, 0x10, 0x68, 0x00, 0x28, 0x09, 0xd0, 0x21, 0x1c, 0x14, 0x1c, 0x04, 0x30, 0x3c, 0x00, 0xc8, 0x55, 0x00, 0x00, 0x05, 0xf0, 0xb4, 0xfb, 0x00, 0x28, 0x02, 0xd0, 0x20, 0x68, 0x9c, 0x30, 0x00, 0xe0, 0x03, 0x48, 0x40, 0x5d, 0x70, 0xbd, 0x20, 0x67, 0x01, 0x00, 0x1c, 0x67, 0x01, 0x00, 0xcc, 0x47, 0x01, 0x00, 0x04, 0x49, 0x00, 0x20, 0x09, 0x69, 0x00, 0x29, 0x02, 0xd0, 0xff, 0x31, 0x01, 0x31, 0x88, 0x69, 0x70, 0x47, 0x00, 0x00, 0x10, 0x67, 0x01, 0x00, 0x01, 0x48, 0x00, 0x7a, 0x3c, 0x00, 0x04, 0x56, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0xac, 0x7c, 0x01, 0x00, 0xfe, 0xb5, 0x06, 0x1c, 0x00, 0x20, 0x1f, 0x1c, 0x14, 0x1c, 0x00, 0x29, 0x02, 0x90, 0x19, 0xd0, 0x01, 0x29, 0x26, 0xd0, 0x02, 0x29, 0x47, 0xd1, 0x26, 0x48, 0x00, 0x78, 0x05, 0xf0, 0xa0, 0xfb, 0xa0, 0x72, 0x0a, 0xf0, 0x4f, 0xfc, 0x0e, 0x28, 0x09, 0xd1, 0xa0, 0x7a, 0x05, 0xf0, 0xaa, 0xfb, 0x00, 0x28, 0x04, 0xd0, 0x3c, 0x00, 0x40, 0x56, 0x00, 0x00, 0x20, 0x48, 0x00, 0x78, 0x05, 0xf0, 0x92, 0xfb, 0xa0, 0x72, 0x00, 0x20, 0x20, 0x72, 0x2f, 0xe0, 0x1d, 0x4d, 0x28, 0x68, 0x00, 0x28, 0x01, 0xd1, 0xfb, 0xf7, 0x52, 0xfe, 0x00, 0x97, 0x2a, 0x68, 0x23, 0x1c, 0x18, 0x32, 0x11, 0x1c, 0x30, 0x1c, 0xfc, 0xf7, 0xde, 0xfb, 0x26, 0xe0, 0x30, 0x1c, 0x0c, 0xf0, 0xca, 0xfb, 0x05, 0x1c, 0x02, 0xd0, 0xa8, 0x68, 0x00, 0x28, 0x3c, 0x00, 0x7c, 0x56, 0x00, 0x00, 0x08, 0xd1, 0x13, 0x48, 0x00, 0x68, 0x00, 0x28, 0x01, 0xd1, 0xfb, 0xf7, 0x3b, 0xfe, 0x10, 0x48, 0x00, 0x68, 0x18, 0x30, 0x02, 0x1c, 0x0e, 0x48, 0x00, 0x97, 0x01, 0x68, 0x23, 0x1c, 0x18, 0x31, 0x30, 0x1c, 0xfc, 0xf7, 0xc3, 0xfb, 0x00, 0x2d, 0x0a, 0xd0, 0x40, 0x35, 0x28, 0x88, 0x80, 0x06, 0x06, 0xd4, 0x00, 0x20, 0x20, 0x60, 0x03, 0xe0, 0x01, 0x21, 0x90, 0x20, 0x3c, 0x00, 0xb8, 0x56, 0x00, 0x00, 0xfb, 0xf7, 0xf4, 0xfd, 0x02, 0x98, 0xfe, 0xbd, 0xb0, 0x69, 0x01, 0x00, 0x90, 0x57, 0x01, 0x00, 0x20, 0x67, 0x01, 0x00, 0x1c, 0x67, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x20, 0x02, 0xf0, 0x4a, 0xfe, 0x18, 0x23, 0x05, 0x4a, 0x58, 0x43, 0x80, 0x18, 0x40, 0x69, 0x01, 0x21, 0x00, 0x28, 0x00, 0xd0, 0x41, 0x78, 0x08, 0x1c, 0x80, 0xbd, 0x00, 0x00, 0x94, 0x67, 0x01, 0x00, 0x3c, 0x00, 0xf4, 0x56, 0x00, 0x00, 0x02, 0x49, 0x08, 0x69, 0x00, 0x28, 0x00, 0xd1, 0xc8, 0x68, 0x70, 0x47, 0x10, 0x67, 0x01, 0x00, 0x03, 0x48, 0xc0, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x04, 0x30, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x10, 0x67, 0x01, 0x00, 0x10, 0xb5, 0x05, 0x4c, 0xe0, 0x68, 0x00, 0x28, 0x03, 0xd1, 0x05, 0x21, 0x90, 0x20, 0xfb, 0xf7, 0xbd, 0xfd, 0xe0, 0x68, 0x10, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x30, 0x57, 0x00, 0x00, 0x10, 0x67, 0x01, 0x00, 0xf8, 0xb5, 0x0d, 0x1c, 0x00, 0x2a, 0x03, 0xd0, 0x11, 0x49, 0x12, 0x4f, 0x0e, 0x78, 0x01, 0xe0, 0x11, 0x4f, 0x0c, 0x26, 0x08, 0x2e, 0x01, 0xd2, 0x34, 0x1c, 0x00, 0xe0, 0x08, 0x24, 0x01, 0x21, 0x01, 0x70, 0x44, 0x70, 0x39, 0x1c, 0x22, 0x1c, 0x02, 0x30, 0xfa, 0xf7, 0xcb, 0xfe, 0x32, 0x1b, 0x00, 0x2a, 0x07, 0xdd, 0x32, 0x20, 0x28, 0x70, 0x3c, 0x00, 0x6c, 0x57, 0x00, 0x00, 0x39, 0x19, 0xa8, 0x1c, 0x6a, 0x70, 0xfa, 0xf7, 0xc1, 0xfe, 0xf8, 0xbd, 0xff, 0x20, 0x28, 0x70, 0x00, 0x20, 0x68, 0x70, 0xf9, 0xe7, 0x00, 0x00, 0xa4, 0x69, 0x01, 0x00, 0xb0, 0x69, 0x01, 0x00, 0x90, 0x57, 0x01, 0x00, 0x01, 0x49, 0x48, 0x62, 0x70, 0x47, 0x00, 0x00, 0x94, 0x67, 0x01, 0x00, 0x03, 0x49, 0x80, 0xb5, 0x08, 0x60, 0x01, 0x21, 0x01, 0x20, 0x03, 0xf0, 0x3c, 0x00, 0xa8, 0x57, 0x00, 0x00, 0xc5, 0xfb, 0x80, 0xbd, 0x1c, 0x67, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x21, 0x01, 0x20, 0x03, 0xf0, 0xbd, 0xfb, 0x06, 0xf0, 0xb9, 0xf8, 0x02, 0x49, 0x00, 0x20, 0x08, 0x60, 0x80, 0xbd, 0x00, 0x00, 0x1c, 0x67, 0x01, 0x00, 0x03, 0x49, 0x01, 0x20, 0xc9, 0x68, 0x00, 0x29, 0x00, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x10, 0x67, 0x01, 0x00, 0x03, 0x48, 0xc0, 0x68, 0x3c, 0x00, 0xe4, 0x57, 0x00, 0x00, 0x00, 0x28, 0x01, 0xd0, 0x40, 0x69, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x10, 0x67, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x01, 0x20, 0x03, 0xf0, 0x9b, 0xfb, 0x80, 0xbd, 0x05, 0x4a, 0x80, 0xb5, 0x12, 0x69, 0x00, 0x21, 0x00, 0x2a, 0x03, 0xd0, 0x11, 0x1d, 0x05, 0xf0, 0x91, 0xfa, 0x01, 0x1c, 0x08, 0x1c, 0x80, 0xbd, 0x10, 0x67, 0x01, 0x00, 0x06, 0x4a, 0x80, 0xb5, 0x3c, 0x00, 0x20, 0x58, 0x00, 0x00, 0x12, 0x69, 0x00, 0x21, 0x00, 0x2a, 0x05, 0xd0, 0x11, 0x1c, 0xff, 0x31, 0x21, 0x31, 0x05, 0xf0, 0x8b, 0xfa, 0x01, 0x1c, 0x08, 0x1c, 0x80, 0xbd, 0x10, 0x67, 0x01, 0x00, 0x05, 0x4a, 0x80, 0xb5, 0xd2, 0x68, 0x00, 0x21, 0x00, 0x2a, 0x03, 0xd0, 0x11, 0x1d, 0x05, 0xf0, 0x73, 0xfa, 0x01, 0x1c, 0x08, 0x1c, 0x80, 0xbd, 0x10, 0x67, 0x01, 0x00, 0x06, 0x4a, 0x80, 0xb5, 0x3c, 0x00, 0x5c, 0x58, 0x00, 0x00, 0xd2, 0x68, 0x00, 0x21, 0x00, 0x2a, 0x05, 0xd0, 0x11, 0x1c, 0xff, 0x31, 0x21, 0x31, 0x05, 0xf0, 0x6d, 0xfa, 0x01, 0x1c, 0x08, 0x1c, 0x80, 0xbd, 0x10, 0x67, 0x01, 0x00, 0xff, 0xb5, 0x0d, 0x1c, 0x1f, 0x1c, 0x87, 0xb0, 0x10, 0x9e, 0x00, 0x24, 0x02, 0xf0, 0x72, 0xfd, 0x18, 0x23, 0x13, 0x49, 0x58, 0x43, 0x08, 0x58, 0x00, 0x28, 0x19, 0xd0, 0x04, 0x1c, 0x33, 0x1c, 0x3c, 0x00, 0x98, 0x58, 0x00, 0x00, 0x3a, 0x1c, 0x28, 0x1c, 0x09, 0x99, 0xfa, 0xf7, 0x9f, 0xfd, 0x04, 0x1c, 0x14, 0xd0, 0x18, 0x20, 0x00, 0xab, 0x18, 0x80, 0xaa, 0x68, 0x01, 0xa8, 0x69, 0x46, 0xff, 0xf7, 0xe7, 0xfd, 0x6a, 0x46, 0x01, 0xa9, 0x00, 0x20, 0x07, 0xf0, 0x44, 0xfe, 0x00, 0x28, 0x05, 0xd1, 0x0a, 0x21, 0x00, 0xe0, 0x0f, 0x21, 0x90, 0x20, 0xfb, 0xf7, 0xea, 0xfc, 0x20, 0x1c, 0x0b, 0xb0, 0x3c, 0x00, 0xd4, 0x58, 0x00, 0x00, 0xf0, 0xbd, 0x00, 0x00, 0x94, 0x67, 0x01, 0x00, 0x10, 0xb5, 0x00, 0x24, 0x02, 0xf0, 0x44, 0xfd, 0x18, 0x23, 0x05, 0x49, 0x58, 0x43, 0x40, 0x18, 0x80, 0x68, 0x00, 0x28, 0x02, 0xd0, 0xfa, 0xf7, 0x71, 0xfd, 0x01, 0x24, 0x20, 0x1c, 0x10, 0xbd, 0x94, 0x67, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x4b, 0x00, 0xf0, 0x4e, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x10, 0x67, 0x01, 0x00, 0x3c, 0x00, 0x10, 0x59, 0x00, 0x00, 0x80, 0xb5, 0x02, 0x4b, 0x00, 0xf0, 0x46, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x11, 0x67, 0x01, 0x00, 0xf8, 0xb5, 0x0e, 0x1c, 0x15, 0x1c, 0x00, 0x28, 0x1c, 0x49, 0x10, 0xd0, 0x48, 0x68, 0x1c, 0x4a, 0x28, 0x80, 0x00, 0x20, 0x07, 0xe0, 0x0b, 0x18, 0x1c, 0x7a, 0x14, 0x23, 0x63, 0x43, 0x9b, 0x18, 0x1b, 0x7c, 0x33, 0x54, 0x01, 0x30, 0x2b, 0x88, 0x83, 0x42, 0xf4, 0xdc, 0x3c, 0x00, 0x4c, 0x59, 0x00, 0x00, 0x24, 0xe0, 0x00, 0x20, 0x0f, 0x1c, 0x00, 0x24, 0x08, 0x60, 0x0f, 0xe0, 0x30, 0x5d, 0x05, 0xf0, 0x07, 0xfa, 0x0e, 0x28, 0x01, 0xd1, 0x00, 0x20, 0xf8, 0xbd, 0x39, 0x19, 0x08, 0x72, 0x01, 0x22, 0x39, 0x68, 0x82, 0x40, 0x11, 0x43, 0x08, 0x1c, 0x38, 0x60, 0x01, 0x34, 0x28, 0x88, 0xa0, 0x42, 0xec, 0xdc, 0x28, 0x88, 0x78, 0x60, 0xff, 0xf7, 0xb7, 0xfe, 0x00, 0x28, 0x3c, 0x00, 0x88, 0x59, 0x00, 0x00, 0x06, 0xd0, 0x01, 0x69, 0x00, 0x29, 0x03, 0xd0, 0x7f, 0x21, 0xc9, 0x43, 0x0b, 0xf0, 0x52, 0xfb, 0x01, 0x20, 0xe3, 0xe7, 0x2c, 0x7d, 0x01, 0x00, 0x74, 0x40, 0x01, 0x00, 0x10, 0xb5, 0x1c, 0x1c, 0x00, 0x28, 0x0b, 0xd0, 0x20, 0x78, 0x0e, 0x28, 0x05, 0xd2, 0x14, 0x23, 0x0c, 0x4a, 0x58, 0x43, 0x80, 0x18, 0x00, 0x7c, 0x00, 0xe0, 0x00, 0x20, 0x08, 0x70, 0x0e, 0xe0, 0x3c, 0x00, 0xc4, 0x59, 0x00, 0x00, 0x08, 0x78, 0x05, 0xf0, 0xd1, 0xf9, 0x20, 0x70, 0xff, 0xf7, 0x92, 0xfe, 0x00, 0x28, 0x06, 0xd0, 0x01, 0x69, 0x00, 0x29, 0x03, 0xd0, 0x7f, 0x21, 0xc9, 0x43, 0x0b, 0xf0, 0x2d, 0xfb, 0x01, 0x20, 0x10, 0xbd, 0x00, 0x00, 0x74, 0x40, 0x01, 0x00, 0x80, 0xb5, 0x27, 0x20, 0xc0, 0x43, 0x09, 0xf0, 0x31, 0xfc, 0x80, 0xbd, 0x80, 0xb5, 0x27, 0x20, 0xc0, 0x43, 0x09, 0xf0, 0x3c, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x39, 0xfc, 0x80, 0xbd, 0x80, 0xb5, 0x28, 0x20, 0x09, 0xf0, 0x42, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x28, 0x20, 0x09, 0xf0, 0x4a, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x01, 0x28, 0x28, 0xd1, 0x01, 0x29, 0x01, 0xd0, 0xfb, 0xf7, 0x6b, 0xfc, 0xff, 0xf7, 0xe9, 0xfd, 0x02, 0x28, 0x1a, 0xd1, 0x07, 0xf0, 0x13, 0xfc, 0x12, 0x4c, 0x21, 0x69, 0x88, 0x42, 0x3c, 0x00, 0x3c, 0x5a, 0x00, 0x00, 0x15, 0xd0, 0x07, 0xf0, 0x0d, 0xfc, 0x20, 0x61, 0x20, 0x68, 0x7d, 0x24, 0xe4, 0x00, 0x44, 0x43, 0x0d, 0xf0, 0xae, 0xf9, 0x05, 0x1c, 0x07, 0xf0, 0x0b, 0xfc, 0x28, 0x1a, 0x84, 0x42, 0x00, 0xd9, 0x24, 0x1a, 0x01, 0x22, 0x21, 0x1c, 0x0a, 0x20, 0x0d, 0xf0, 0xb2, 0xfd, 0xb0, 0xbd, 0x00, 0x21, 0x09, 0x20, 0x0c, 0xf0, 0x75, 0xfc, 0xb0, 0xbd, 0x07, 0x21, 0x0a, 0x20, 0x3c, 0x00, 0x78, 0x5a, 0x00, 0x00, 0xfb, 0xf7, 0x14, 0xfc, 0xb0, 0xbd, 0x00, 0x00, 0xd4, 0x67, 0x01, 0x00, 0x7d, 0x20, 0x02, 0x49, 0x00, 0x01, 0x08, 0x60, 0x70, 0x47, 0x00, 0x00, 0xd4, 0x67, 0x01, 0x00, 0x10, 0xb5, 0x81, 0x6d, 0x04, 0x1c, 0xff, 0x30, 0x46, 0x30, 0x0c, 0xf0, 0xd1, 0xfc, 0x20, 0x1c, 0xff, 0x30, 0x50, 0x30, 0xa1, 0x6d, 0x0c, 0xf0, 0xcb, 0xfc, 0x10, 0xbd, 0xb0, 0xb5, 0x04, 0x1c, 0x3c, 0x00, 0xb4, 0x5a, 0x00, 0x00, 0x0d, 0x1c, 0x02, 0xf0, 0x59, 0xfc, 0x20, 0x1c, 0x02, 0xf0, 0x56, 0xfc, 0x18, 0x23, 0x04, 0x49, 0x58, 0x43, 0x40, 0x18, 0x18, 0x22, 0x29, 0x1c, 0xfa, 0xf7, 0x70, 0xfd, 0xb0, 0xbd, 0x00, 0x00, 0x94, 0x67, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x09, 0xf0, 0xbc, 0xfb, 0x20, 0x1c, 0x09, 0xf0, 0xc7, 0xfb, 0x10, 0xbd, 0x10, 0xb5, 0x04, 0x1c, 0x09, 0xf0, 0xd0, 0xfb, 0x3c, 0x00, 0xf0, 0x5a, 0x00, 0x00, 0x20, 0x1c, 0x09, 0xf0, 0xdb, 0xfb, 0x10, 0xbd, 0x70, 0xb5, 0x0c, 0x78, 0x06, 0x1c, 0x48, 0x88, 0x4d, 0x78, 0xe2, 0x00, 0x80, 0x1a, 0xe9, 0x00, 0x40, 0x1a, 0x01, 0x1c, 0x41, 0x43, 0x12, 0x31, 0x24, 0x20, 0xfa, 0xf7, 0x91, 0xfd, 0x21, 0x1c, 0x61, 0x43, 0xc9, 0x00, 0x40, 0x18, 0x29, 0x1c, 0x69, 0x43, 0xc9, 0x00, 0x42, 0x18, 0x0c, 0x49, 0x88, 0x79, 0x0c, 0x4b, 0x3c, 0x00, 0x2c, 0x5b, 0x00, 0x00, 0x53, 0x43, 0x0c, 0x4a, 0x13, 0x60, 0x53, 0x7b, 0x34, 0x02, 0x14, 0x60, 0x52, 0x7b, 0x88, 0x71, 0x01, 0x33, 0x58, 0x10, 0x08, 0x4b, 0x80, 0x1a, 0x01, 0x21, 0x49, 0x02, 0x58, 0x43, 0x00, 0x28, 0x00, 0xda, 0x49, 0x42, 0x08, 0x18, 0x80, 0x12, 0x21, 0x38, 0x70, 0xbd, 0x20, 0x10, 0x07, 0x00, 0xec, 0x04, 0x00, 0x00, 0x00, 0xa0, 0x07, 0x00, 0x03, 0x03, 0x00, 0x00, 0x3c, 0x00, 0x68, 0x5b, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x06, 0x21, 0x04, 0x30, 0xfa, 0xf7, 0x70, 0xfc, 0xff, 0x20, 0x21, 0x30, 0xff, 0x21, 0x01, 0x55, 0x20, 0x1c, 0xff, 0x30, 0x41, 0x30, 0x81, 0x70, 0x41, 0x71, 0xc1, 0x73, 0xff, 0x20, 0x63, 0x30, 0x01, 0x55, 0x00, 0x20, 0x20, 0x61, 0x60, 0x61, 0xff, 0x34, 0x01, 0x34, 0xa0, 0x60, 0xe0, 0x60, 0x10, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x06, 0x1c, 0x3c, 0x00, 0xa4, 0x5b, 0x00, 0x00, 0x08, 0x1c, 0x58, 0x60, 0x9a, 0x60, 0x1c, 0x1c, 0x1e, 0x60, 0x15, 0x1c, 0x9b, 0x8a, 0xe2, 0x8a, 0x31, 0x1c, 0x02, 0xf0, 0xa1, 0xfc, 0x28, 0x1a, 0xe0, 0x60, 0x70, 0xbd, 0x70, 0xb5, 0x04, 0x1c, 0x08, 0x1c, 0x11, 0x1c, 0x1e, 0x1c, 0x00, 0x25, 0xeb, 0x43, 0x22, 0x1c, 0x18, 0x32, 0x0b, 0xf0, 0xf7, 0xfb, 0x22, 0x1c, 0xff, 0x32, 0x50, 0x32, 0x11, 0x1c, 0x0a, 0x39, 0x3c, 0x00, 0xe0, 0x5b, 0x00, 0x00, 0x01, 0x23, 0x20, 0x1c, 0x00, 0xf0, 0xc6, 0xf8, 0x0c, 0x28, 0x10, 0xd0, 0x01, 0x25, 0x20, 0x1c, 0x0b, 0xf0, 0xac, 0xfa, 0x20, 0x1c, 0x00, 0xf0, 0x19, 0xf8, 0x20, 0x1c, 0x00, 0xf0, 0x0a, 0xf8, 0x20, 0x1c, 0x00, 0xf0, 0x29, 0xf8, 0x31, 0x1c, 0x20, 0x1c, 0x0b, 0xf0, 0x17, 0xfa, 0x28, 0x1c, 0x70, 0xbd, 0x00, 0x00, 0xff, 0x21, 0x1d, 0x31, 0x09, 0x58, 0x80, 0x30, 0x3c, 0x00, 0x1c, 0x5c, 0x00, 0x00, 0x89, 0x07, 0x00, 0x29, 0x01, 0xda, 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0xc1, 0x62, 0x70, 0x47, 0x01, 0x1c, 0x80, 0x31, 0x00, 0x22, 0x0a, 0x63, 0x07, 0x4a, 0x12, 0x68, 0x00, 0x2a, 0x09, 0xd0, 0x42, 0x88, 0x92, 0x06, 0x06, 0xd5, 0xff, 0x30, 0x01, 0x30, 0xc0, 0x69, 0x40, 0x07, 0x01, 0xd4, 0x01, 0x20, 0x08, 0x63, 0x70, 0x47, 0x00, 0x00, 0xac, 0x69, 0x01, 0x00, 0x3c, 0x00, 0x58, 0x5c, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x1c, 0x4a, 0x88, 0x00, 0x20, 0x52, 0x05, 0x05, 0xd5, 0xff, 0x31, 0x01, 0x31, 0xc9, 0x69, 0x49, 0x07, 0x00, 0xd4, 0x01, 0x20, 0x06, 0xf0, 0xec, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x05, 0x1c, 0x98, 0x68, 0x17, 0x1c, 0x0e, 0x1c, 0x1c, 0x1c, 0x00, 0x28, 0x02, 0xd1, 0x20, 0x1c, 0x0c, 0xf0, 0x31, 0xf8, 0xab, 0x69, 0x39, 0x1c, 0x30, 0x1c, 0x3c, 0x00, 0x94, 0x5c, 0x00, 0x00, 0xa2, 0x68, 0x0b, 0xf0, 0x95, 0xfb, 0xf8, 0xbd, 0xf8, 0xb5, 0x16, 0x1c, 0x0d, 0x1c, 0x1f, 0x1c, 0x00, 0x24, 0x02, 0xf0, 0x61, 0xfb, 0x18, 0x23, 0x06, 0x49, 0x58, 0x43, 0x40, 0x18, 0x43, 0x68, 0x00, 0x2b, 0x05, 0xd0, 0x3a, 0x1c, 0x31, 0x1c, 0x28, 0x1c, 0xfa, 0xf7, 0x8e, 0xfb, 0x01, 0x24, 0x20, 0x1c, 0xf8, 0xbd, 0x94, 0x67, 0x01, 0x00, 0x80, 0xb5, 0x07, 0xf0, 0x3c, 0x00, 0xd0, 0x5c, 0x00, 0x00, 0xc5, 0xfa, 0x09, 0x49, 0x08, 0x61, 0x08, 0x68, 0x00, 0x28, 0x02, 0xd1, 0x7d, 0x20, 0x00, 0x01, 0x08, 0x60, 0x08, 0x68, 0x7d, 0x21, 0xc9, 0x00, 0x41, 0x43, 0x00, 0x23, 0x01, 0x22, 0x0a, 0x20, 0x0d, 0xf0, 0x4e, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0xd4, 0x67, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x21, 0x0a, 0x20, 0x0d, 0xf0, 0x97, 0xfc, 0x80, 0xbd, 0xf8, 0xb5, 0x0e, 0x1c, 0x3c, 0x00, 0x0c, 0x5d, 0x00, 0x00, 0x51, 0x68, 0x14, 0x1c, 0x12, 0x68, 0xa5, 0x68, 0x0b, 0x1c, 0x75, 0x1b, 0x57, 0x19, 0x97, 0x42, 0x00, 0xd2, 0x01, 0x31, 0x42, 0x68, 0x00, 0x25, 0x8a, 0x42, 0x02, 0xdd, 0x01, 0x25, 0x62, 0x60, 0x05, 0xe0, 0x9a, 0x42, 0x03, 0xd1, 0x01, 0x68, 0xb9, 0x42, 0x00, 0xd9, 0x01, 0x25, 0x00, 0x2d, 0x09, 0xd0, 0x01, 0x68, 0x21, 0x60, 0xa6, 0x60, 0xa3, 0x8a, 0xe2, 0x8a, 0x3c, 0x00, 0x48, 0x5d, 0x00, 0x00, 0x60, 0x68, 0x02, 0xf0, 0xd7, 0xfb, 0x30, 0x1a, 0xe0, 0x60, 0x28, 0x1c, 0xf8, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x02, 0xf0, 0x07, 0xfb, 0x18, 0x23, 0x03, 0x49, 0x58, 0x43, 0x40, 0x18, 0x18, 0x21, 0xfa, 0xf7, 0x98, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x94, 0x67, 0x01, 0x00, 0xfe, 0xb5, 0x04, 0x1c, 0x08, 0x1c, 0x11, 0x1c, 0x1e, 0x1c, 0x0c, 0x25, 0x01, 0x22, 0x00, 0x92, 0x3c, 0x00, 0x84, 0x5d, 0x00, 0x00, 0xa2, 0x69, 0x02, 0xab, 0xfd, 0xf7, 0xf0, 0xf8, 0x00, 0x28, 0x45, 0xd0, 0x02, 0x98, 0x27, 0x21, 0x02, 0x1c, 0x0a, 0x40, 0x01, 0xd1, 0x08, 0x43, 0x02, 0x90, 0x21, 0x49, 0xa0, 0x69, 0x08, 0x40, 0x06, 0xd0, 0x02, 0x98, 0x01, 0x40, 0x03, 0xd1, 0x49, 0x21, 0xc9, 0x00, 0x08, 0x43, 0x02, 0x90, 0xa0, 0x6d, 0x02, 0x99, 0x88, 0x42, 0x30, 0xd0, 0x00, 0x2e, 0x2d, 0xd0, 0x3c, 0x00, 0xc0, 0x5d, 0x00, 0x00, 0x40, 0x21, 0x20, 0x1c, 0x58, 0x30, 0xfa, 0xf7, 0x69, 0xfb, 0x02, 0x98, 0x00, 0x25, 0x00, 0x26, 0x37, 0x1c, 0xa0, 0x65, 0x19, 0xe0, 0xc0, 0x07, 0x11, 0xd5, 0xf0, 0x19, 0x00, 0x19, 0x70, 0x30, 0x05, 0x71, 0x28, 0x1c, 0x04, 0xf0, 0xd4, 0xff, 0x00, 0x28, 0x04, 0xd0, 0xa0, 0x19, 0x80, 0x30, 0x05, 0x72, 0x01, 0x36, 0x03, 0xe0, 0xe0, 0x19, 0x60, 0x30, 0x05, 0x70, 0x3c, 0x00, 0xfc, 0x5d, 0x00, 0x00, 0x01, 0x37, 0x01, 0x35, 0x2d, 0x06, 0x02, 0x98, 0x2d, 0x0e, 0x40, 0x08, 0x02, 0x90, 0x02, 0x98, 0x00, 0x28, 0xe2, 0xd1, 0x84, 0x20, 0x06, 0x51, 0xf0, 0x19, 0x20, 0x67, 0xe7, 0x65, 0x00, 0x25, 0x00, 0xe0, 0x0b, 0x25, 0x28, 0x1c, 0xfe, 0xbd, 0xd8, 0x3a, 0x00, 0x00, 0x38, 0xb5, 0x05, 0x1c, 0x08, 0x1c, 0x11, 0x1c, 0x00, 0x24, 0xe2, 0x43, 0x6b, 0x46, 0xff, 0xf7, 0x3c, 0x00, 0x38, 0x5e, 0x00, 0x00, 0x4f, 0xfa, 0x00, 0x28, 0x05, 0xd0, 0xa8, 0x69, 0x00, 0x99, 0x01, 0x40, 0x81, 0x42, 0x00, 0xd1, 0x01, 0x24, 0x20, 0x1c, 0x38, 0xbd, 0x00, 0x00, 0x7c, 0xb5, 0x05, 0x6a, 0x86, 0x69, 0x04, 0x1c, 0xc0, 0x68, 0xfb, 0xf7, 0xb7, 0xfb, 0xe1, 0x69, 0xfb, 0xf7, 0xda, 0xfa, 0x20, 0x1c, 0xe2, 0x69, 0x40, 0x30, 0xc1, 0x8b, 0x12, 0x89, 0x89, 0x18, 0xc1, 0x83, 0x06, 0x49, 0x3c, 0x00, 0x74, 0x5e, 0x00, 0x00, 0x01, 0x94, 0x00, 0x91, 0x28, 0x69, 0x33, 0x1c, 0x82, 0x88, 0x01, 0x68, 0xe0, 0x68, 0xc0, 0x68, 0x00, 0xf0, 0xf2, 0xf9, 0x7c, 0xbd, 0x00, 0x00, 0x91, 0x5e, 0x00, 0x00, 0xb0, 0xb5, 0xd1, 0x68, 0x55, 0x69, 0xc8, 0x68, 0x14, 0x1c, 0x14, 0x4b, 0x0c, 0xe0, 0x02, 0x68, 0x9a, 0x42, 0x07, 0xd1, 0xc2, 0x68, 0xca, 0x60, 0x00, 0x21, 0xc1, 0x60, 0x01, 0x60, 0xfb, 0xf7, 0x3c, 0x00, 0xb0, 0x5e, 0x00, 0x00, 0x73, 0xfb, 0x03, 0xe0, 0x01, 0x1c, 0xc0, 0x68, 0x00, 0x28, 0xf0, 0xd1, 0xe0, 0x68, 0xc0, 0x68, 0xe8, 0x60, 0xe0, 0x68, 0xc5, 0x60, 0x20, 0x1c, 0x40, 0x30, 0xc1, 0x8b, 0x2a, 0x89, 0x89, 0x18, 0xc1, 0x83, 0x20, 0x68, 0x00, 0x28, 0x02, 0xd0, 0xff, 0xf7, 0xba, 0xff, 0xb0, 0xbd, 0x04, 0x48, 0x04, 0xf0, 0x4e, 0xf9, 0x00, 0x6a, 0x07, 0xf0, 0x77, 0xfa, 0xb0, 0xbd, 0x3c, 0x00, 0xec, 0x5e, 0x00, 0x00, 0xa0, 0x7e, 0x01, 0x00, 0xa0, 0x6a, 0x01, 0x00, 0xf1, 0xb5, 0x82, 0xb0, 0x02, 0x98, 0x06, 0x69, 0x01, 0x1c, 0x08, 0x36, 0x60, 0x31, 0x45, 0x68, 0x01, 0x91, 0x82, 0xe0, 0x10, 0x21, 0x00, 0x20, 0x2f, 0x69, 0xfb, 0xf7, 0x63, 0xfb, 0x68, 0x61, 0x01, 0x89, 0x08, 0x39, 0x09, 0x04, 0x09, 0x0c, 0x01, 0x81, 0x68, 0x69, 0x00, 0x68, 0x40, 0x18, 0x08, 0x21, 0xfb, 0xf7, 0x3c, 0x00, 0x28, 0x5f, 0x00, 0x00, 0x57, 0xfb, 0xe8, 0x61, 0x68, 0x69, 0x71, 0x88, 0x00, 0x68, 0x20, 0x22, 0x01, 0x80, 0x71, 0x68, 0x41, 0x60, 0x01, 0x99, 0x49, 0x7b, 0x89, 0x01, 0x11, 0x43, 0xc1, 0x70, 0x00, 0x21, 0x81, 0x70, 0x28, 0x20, 0xfb, 0xf7, 0x75, 0xfc, 0x39, 0x88, 0x04, 0x1c, 0xc1, 0x81, 0xa8, 0x6b, 0x00, 0x28, 0x03, 0xd1, 0x01, 0x20, 0x80, 0x02, 0x08, 0x43, 0xe0, 0x81, 0x06, 0x22, 0x3c, 0x00, 0x64, 0x5f, 0x00, 0x00, 0x39, 0x1d, 0x20, 0x1c, 0x10, 0x30, 0xfa, 0xf7, 0xc5, 0xfa, 0x39, 0x1c, 0x0a, 0x31, 0x06, 0x22, 0x20, 0x1c, 0x16, 0x30, 0x00, 0x90, 0xfa, 0xf7, 0xbd, 0xfa, 0x39, 0x1c, 0x10, 0x31, 0x06, 0x22, 0x20, 0x1c, 0x1c, 0x30, 0xfa, 0xf7, 0xb6, 0xfa, 0xe1, 0x89, 0x25, 0x4a, 0x5c, 0x20, 0x11, 0x40, 0x01, 0x22, 0x92, 0x03, 0x11, 0x43, 0x40, 0x5b, 0xe1, 0x81, 0x0f, 0x21, 0x3c, 0x00, 0xa0, 0x5f, 0x00, 0x00, 0x08, 0x40, 0x60, 0x84, 0x20, 0x1c, 0x20, 0x30, 0x16, 0x21, 0x81, 0x71, 0x00, 0x21, 0x21, 0x70, 0xe9, 0x6b, 0x00, 0x29, 0x07, 0xd0, 0x29, 0x69, 0x09, 0x8b, 0x09, 0x07, 0x09, 0x0f, 0x21, 0x70, 0xa1, 0x84, 0x18, 0x21, 0x81, 0x71, 0x06, 0x22, 0x60, 0x1c, 0x00, 0x99, 0xfa, 0xf7, 0x94, 0xfa, 0x70, 0x68, 0x00, 0x0e, 0xe0, 0x71, 0x70, 0x68, 0x00, 0x02, 0x00, 0x0e, 0x3c, 0x00, 0xdc, 0x5f, 0x00, 0x00, 0x20, 0x72, 0x70, 0x68, 0x00, 0x04, 0x00, 0x0e, 0x60, 0x72, 0x70, 0x68, 0xa0, 0x72, 0x70, 0x88, 0x00, 0x0a, 0xe0, 0x72, 0x70, 0x88, 0x20, 0x73, 0x70, 0x88, 0x01, 0x30, 0x00, 0x04, 0x00, 0x0c, 0x70, 0x80, 0x02, 0xd1, 0x70, 0x68, 0x01, 0x30, 0x70, 0x60, 0xac, 0x61, 0x02, 0x98, 0x28, 0x62, 0x2d, 0x68, 0x00, 0x2d, 0x00, 0xd0, 0x79, 0xe7, 0x02, 0x98, 0x04, 0x49, 0x3c, 0x00, 0x18, 0x60, 0x00, 0x00, 0x42, 0x68, 0x04, 0x48, 0x04, 0xf0, 0x74, 0xf8, 0xfe, 0xbd, 0x00, 0x00, 0x8f, 0xc7, 0xff, 0xff, 0x3d, 0xda, 0x00, 0x00, 0xa0, 0x6a, 0x01, 0x00, 0xb0, 0xb5, 0x07, 0x4d, 0x28, 0x78, 0x03, 0x28, 0x08, 0xd0, 0x00, 0x24, 0x2c, 0x70, 0x69, 0x68, 0x00, 0x29, 0x03, 0xd0, 0x01, 0x20, 0xfa, 0xf7, 0xc8, 0xf9, 0x6c, 0x60, 0xb0, 0xbd, 0x00, 0x00, 0x9c, 0x73, 0x01, 0x00, 0x3c, 0x00, 0x54, 0x60, 0x00, 0x00, 0xf8, 0xb5, 0x2b, 0x4b, 0xd8, 0x6a, 0x00, 0x28, 0x50, 0xd0, 0x2a, 0x48, 0x01, 0x1c, 0xff, 0x31, 0x01, 0x31, 0xca, 0x68, 0x01, 0x32, 0xca, 0x60, 0x1a, 0x6c, 0x00, 0x2a, 0x02, 0xd1, 0x4a, 0x69, 0x01, 0x32, 0x4a, 0x61, 0x0a, 0x69, 0x01, 0x32, 0x0a, 0x61, 0xda, 0x68, 0x00, 0x2a, 0x04, 0xd0, 0x1f, 0x4a, 0x01, 0x32, 0x12, 0x78, 0x00, 0x2a, 0x02, 0xd1, 0x8a, 0x69, 0x3c, 0x00, 0x90, 0x60, 0x00, 0x00, 0x01, 0x32, 0x8a, 0x61, 0x00, 0x25, 0x07, 0x1d, 0x18, 0x26, 0x1a, 0x4a, 0x6e, 0x43, 0x74, 0x32, 0x90, 0x59, 0x00, 0x28, 0x29, 0xd0, 0xb4, 0x18, 0x60, 0x69, 0x00, 0x28, 0x25, 0xd1, 0x60, 0x68, 0x00, 0x28, 0x02, 0xd0, 0x01, 0x68, 0x00, 0x29, 0x05, 0xd1, 0xa1, 0x68, 0x00, 0x29, 0x1c, 0xd0, 0x09, 0x68, 0x00, 0x29, 0x19, 0xd0, 0x00, 0x28, 0x05, 0xd0, 0xe1, 0x68, 0x3c, 0x00, 0xcc, 0x60, 0x00, 0x00, 0x01, 0x31, 0xe1, 0x60, 0x00, 0x68, 0x81, 0x42, 0x11, 0xd3, 0xa0, 0x68, 0x00, 0x28, 0x06, 0xd0, 0x21, 0x69, 0x00, 0x68, 0x08, 0x18, 0x0c, 0xf0, 0xa3, 0xfd, 0x00, 0x28, 0x07, 0xd0, 0x06, 0x4a, 0x01, 0x20, 0x60, 0x61, 0x74, 0x32, 0x91, 0x59, 0x38, 0x1c, 0xfa, 0xf7, 0x70, 0xf9, 0x01, 0x35, 0x02, 0x2d, 0xcb, 0xdb, 0xf8, 0xbd, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x3c, 0x00, 0x08, 0x61, 0x00, 0x00, 0xf4, 0x67, 0x01, 0x00, 0xf8, 0xb5, 0x0f, 0x1c, 0x00, 0x25, 0x04, 0x1c, 0x00, 0x28, 0x25, 0xd0, 0x20, 0x1c, 0x04, 0xf0, 0x03, 0xfe, 0x00, 0x28, 0x06, 0xd0, 0xff, 0xf7, 0xff, 0xf8, 0x04, 0x1c, 0xff, 0xf7, 0x50, 0xfb, 0x06, 0x1c, 0x07, 0xe0, 0x20, 0x1c, 0xff, 0xf7, 0x91, 0xfb, 0x06, 0x1c, 0x20, 0x1c, 0xff, 0xf7, 0x6f, 0xfb, 0x04, 0x1c, 0x00, 0x2e, 0x06, 0xd0, 0x3c, 0x00, 0x44, 0x61, 0x00, 0x00, 0xff, 0xf7, 0x4c, 0xfb, 0x00, 0x28, 0x02, 0xd0, 0x01, 0x25, 0x01, 0x20, 0x07, 0xe0, 0x00, 0x2c, 0x06, 0xd0, 0xff, 0xf7, 0xef, 0xf8, 0x00, 0x28, 0x02, 0xd0, 0x01, 0x25, 0x00, 0x20, 0x38, 0x60, 0x28, 0x1c, 0xf8, 0xbd, 0xb0, 0xb5, 0xc5, 0x68, 0x04, 0x1c, 0x0d, 0xf0, 0x8f, 0xfc, 0x20, 0x7e, 0xc1, 0x07, 0x08, 0xd5, 0xe1, 0x68, 0xa9, 0x42, 0x05, 0xd9, 0x22, 0x69, 0x3c, 0x00, 0x80, 0x61, 0x00, 0x00, 0x91, 0x42, 0x02, 0xd3, 0xe1, 0x8a, 0x01, 0x31, 0xe1, 0x82, 0x81, 0x07, 0x08, 0xd5, 0xe1, 0x68, 0xa9, 0x42, 0x05, 0xd2, 0x22, 0x69, 0x91, 0x42, 0x02, 0xd8, 0xe1, 0x8a, 0x01, 0x31, 0xe1, 0x82, 0x40, 0x07, 0x06, 0xd5, 0xe0, 0x68, 0x21, 0x69, 0x88, 0x42, 0x02, 0xd1, 0xe0, 0x8a, 0x01, 0x30, 0xe0, 0x82, 0xe0, 0x8a, 0xa1, 0x8a, 0x88, 0x42, 0x0d, 0xd3, 0x60, 0x7e, 0x3c, 0x00, 0xbc, 0x61, 0x00, 0x00, 0x02, 0x28, 0x0b, 0xd0, 0x20, 0x68, 0xe1, 0x68, 0x04, 0x22, 0x07, 0xf0, 0x65, 0xfb, 0x60, 0x7e, 0x00, 0x28, 0x03, 0xd1, 0x20, 0x68, 0x08, 0xf0, 0xab, 0xff, 0xb0, 0xbd, 0x00, 0x20, 0xe0, 0x82, 0xb0, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x06, 0x1c, 0x0c, 0x23, 0x20, 0x49, 0x58, 0x43, 0x45, 0x18, 0x00, 0x20, 0xa8, 0x60, 0x30, 0x1c, 0x06, 0xf0, 0x91, 0xfe, 0x04, 0x1c, 0x3c, 0x00, 0xf8, 0x61, 0x00, 0x00, 0x68, 0x60, 0x33, 0xd0, 0x01, 0x20, 0xa8, 0x70, 0x2c, 0x20, 0x00, 0x5d, 0x02, 0x28, 0x03, 0xd1, 0x20, 0x1c, 0x03, 0xf0, 0x45, 0xfe, 0x10, 0xe0, 0x61, 0x6b, 0x00, 0x29, 0x0a, 0xd0, 0x01, 0x28, 0x04, 0xd1, 0x21, 0x1c, 0x28, 0x1c, 0x03, 0xf0, 0x55, 0xfe, 0x06, 0xe0, 0x20, 0x1c, 0x0a, 0xf0, 0x0d, 0xfc, 0x02, 0xe0, 0x20, 0x1c, 0x0a, 0xf0, 0x3d, 0xfb, 0x0d, 0x48, 0x3c, 0x00, 0x34, 0x62, 0x00, 0x00, 0x14, 0x38, 0x41, 0x68, 0x00, 0x29, 0x10, 0xd0, 0x20, 0x1c, 0x40, 0x30, 0x02, 0x8b, 0x12, 0x07, 0x92, 0x0f, 0x01, 0x2a, 0x09, 0xd0, 0x80, 0x8b, 0x32, 0x02, 0x00, 0x09, 0x00, 0x04, 0x10, 0x43, 0x81, 0x22, 0x02, 0x43, 0x0c, 0x20, 0x0d, 0xf0, 0xb7, 0xf9, 0x0c, 0xf0, 0xa5, 0xfd, 0x60, 0x64, 0x70, 0xbd, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0xff, 0xb5, 0x08, 0x1c, 0x3c, 0x00, 0x70, 0x62, 0x00, 0x00, 0x11, 0x1c, 0x0c, 0x32, 0x20, 0x24, 0x14, 0x43, 0x0c, 0x4a, 0x83, 0xb0, 0x0c, 0xae, 0x52, 0x68, 0x60, 0xce, 0x94, 0x70, 0x00, 0x24, 0xd4, 0x70, 0x93, 0x63, 0x0d, 0x23, 0x40, 0x27, 0xbb, 0x52, 0x94, 0x61, 0x14, 0x84, 0x01, 0x22, 0x02, 0x92, 0x32, 0x1c, 0x00, 0x90, 0x01, 0x91, 0x23, 0x1c, 0x29, 0x1c, 0x03, 0x98, 0x00, 0xf0, 0x66, 0xf9, 0x07, 0xb0, 0xf0, 0xbd, 0x3c, 0x00, 0xac, 0x62, 0x00, 0x00, 0xa0, 0x7e, 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0x00, 0x27, 0x11, 0x4e, 0x1d, 0xe0, 0xe0, 0x68, 0x00, 0x28, 0x70, 0x68, 0x0c, 0xd1, 0x80, 0x88, 0x00, 0x07, 0x0d, 0xd1, 0x01, 0x21, 0x0c, 0x48, 0xfb, 0xf7, 0x84, 0xf9, 0xc4, 0x60, 0xe8, 0x60, 0x70, 0x68, 0x81, 0x88, 0x01, 0x31, 0x02, 0xe0, 0x81, 0x88, 0x22, 0x89, 0x89, 0x18, 0x81, 0x80, 0xe0, 0x68, 0x39, 0x1c, 0x3c, 0x00, 0xe8, 0x62, 0x00, 0x00, 0x00, 0x28, 0x01, 0xd1, 0x71, 0x68, 0xc9, 0x6d, 0x25, 0x1c, 0x61, 0x60, 0x04, 0x1c, 0x00, 0x2c, 0xdf, 0xd1, 0xf8, 0xbd, 0xa0, 0x7e, 0x01, 0x00, 0x06, 0x49, 0x10, 0xb5, 0x49, 0x68, 0x00, 0x23, 0x05, 0xe0, 0x8a, 0x88, 0x04, 0x89, 0x12, 0x19, 0x8a, 0x80, 0x43, 0x60, 0xc0, 0x68, 0x00, 0x28, 0xf7, 0xd1, 0x10, 0xbd, 0xa0, 0x7e, 0x01, 0x00, 0x10, 0xb5, 0x09, 0x49, 0x3c, 0x00, 0x24, 0x63, 0x00, 0x00, 0x00, 0x24, 0x49, 0x68, 0x0a, 0xe0, 0x8a, 0x88, 0x03, 0x89, 0xd2, 0x18, 0x8a, 0x80, 0xc3, 0x68, 0x22, 0x1c, 0x00, 0x2b, 0x00, 0xd1, 0xca, 0x6d, 0x42, 0x60, 0x18, 0x1c, 0x00, 0x28, 0xf2, 0xd1, 0x10, 0xbd, 0x00, 0x00, 0xa0, 0x7e, 0x01, 0x00, 0x01, 0x1c, 0x13, 0x48, 0x10, 0xb5, 0x40, 0x68, 0x00, 0x23, 0x09, 0xe0, 0x82, 0x88, 0x0c, 0x89, 0x12, 0x19, 0x82, 0x80, 0x3c, 0x00, 0x60, 0x63, 0x00, 0x00, 0x4b, 0x60, 0xca, 0x68, 0x00, 0x2a, 0x00, 0xd1, 0x41, 0x66, 0xc9, 0x68, 0x00, 0x29, 0xf3, 0xd1, 0x01, 0x1c, 0x68, 0x31, 0x81, 0x64, 0xc3, 0x64, 0x43, 0x65, 0x82, 0x88, 0x08, 0x23, 0x11, 0x1c, 0x08, 0x31, 0x89, 0x07, 0x89, 0x0f, 0x59, 0x1a, 0x50, 0x23, 0x19, 0x52, 0x51, 0x18, 0x81, 0x80, 0x01, 0x1c, 0x40, 0x6e, 0x48, 0x31, 0xc1, 0x60, 0x10, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x63, 0x00, 0x00, 0xa0, 0x7e, 0x01, 0x00, 0x10, 0xb5, 0x07, 0x49, 0x00, 0x24, 0x4b, 0x68, 0x06, 0xe0, 0xc2, 0x68, 0x21, 0x1c, 0x00, 0x2a, 0x00, 0xd1, 0xd9, 0x6d, 0x41, 0x60, 0x10, 0x1c, 0x00, 0x28, 0xf6, 0xd1, 0x10, 0xbd, 0x00, 0x00, 0xa0, 0x7e, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0xfe, 0xb5, 0x06, 0x1c, 0x0c, 0x48, 0x0c, 0x1c, 0x40, 0x68, 0x80, 0x21, 0x81, 0x70, 0x00, 0x21, 0x3c, 0x00, 0xd8, 0x63, 0x00, 0x00, 0xc1, 0x70, 0x15, 0x1c, 0x40, 0x22, 0x81, 0x63, 0x11, 0x52, 0x81, 0x61, 0x01, 0x84, 0x00, 0x20, 0x04, 0x22, 0x02, 0x92, 0x00, 0x90, 0x01, 0x91, 0x29, 0x1c, 0x20, 0x1c, 0x1a, 0x1c, 0x33, 0x1c, 0x00, 0xf0, 0xbc, 0xf8, 0xfe, 0xbd, 0x00, 0x00, 0xa0, 0x7e, 0x01, 0x00, 0x70, 0xb5, 0x06, 0x1c, 0x17, 0x48, 0x80, 0x78, 0x02, 0x21, 0x16, 0x4a, 0x88, 0x43, 0x90, 0x70, 0x3c, 0x00, 0x14, 0x64, 0x00, 0x00, 0x10, 0x1c, 0x80, 0x78, 0x08, 0x43, 0x11, 0x1c, 0x88, 0x70, 0x13, 0x48, 0x00, 0x24, 0xc4, 0x70, 0x70, 0x20, 0xfb, 0xf7, 0xd9, 0xf9, 0x11, 0x4d, 0x70, 0x21, 0x68, 0x60, 0xfa, 0xf7, 0x34, 0xf8, 0x30, 0x07, 0x00, 0x0f, 0x69, 0x68, 0x90, 0x30, 0xc8, 0x65, 0x0d, 0x48, 0x68, 0x22, 0x08, 0x80, 0x08, 0x1c, 0x28, 0x30, 0x89, 0x60, 0x48, 0x61, 0x08, 0x20, 0x08, 0x82, 0x3c, 0x00, 0x50, 0x64, 0x00, 0x00, 0x08, 0x1c, 0x38, 0x30, 0x48, 0x63, 0x20, 0x38, 0x48, 0x64, 0x5a, 0x20, 0x50, 0x54, 0x06, 0x48, 0x08, 0x31, 0x41, 0x64, 0x44, 0x65, 0x70, 0xbd, 0x00, 0x00, 0x07, 0x00, 0x58, 0x00, 0x07, 0x00, 0xa0, 0x7e, 0x01, 0x00, 0xde, 0xc0, 0x00, 0x00, 0x00, 0x30, 0x07, 0x00, 0x0a, 0x4b, 0x10, 0xb5, 0x58, 0x6d, 0x0a, 0x49, 0x00, 0x22, 0x49, 0x68, 0x00, 0x24, 0x4a, 0x62, 0x3c, 0x00, 0x8c, 0x64, 0x00, 0x00, 0x5c, 0x65, 0x4b, 0x6e, 0x00, 0x2b, 0x01, 0xd0, 0xda, 0x60, 0x4a, 0x66, 0x8b, 0x6d, 0x00, 0x2b, 0x03, 0xd0, 0x0a, 0x6e, 0x00, 0x21, 0xf9, 0xf7, 0x9c, 0xff, 0x10, 0xbd, 0x00, 0x30, 0x07, 0x00, 0xa0, 0x7e, 0x01, 0x00, 0x09, 0x49, 0x10, 0xb5, 0x08, 0x88, 0x01, 0x30, 0x08, 0x80, 0x01, 0x20, 0x07, 0x49, 0x80, 0x02, 0x08, 0x60, 0x07, 0x4c, 0xa2, 0x6d, 0x00, 0x2a, 0x3c, 0x00, 0xc8, 0x64, 0x00, 0x00, 0x05, 0xd0, 0x05, 0x21, 0xd1, 0x20, 0x0d, 0xf0, 0x6f, 0xf9, 0x01, 0x20, 0xa0, 0x65, 0x10, 0xbd, 0xb0, 0x74, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, 0xff, 0xb5, 0x83, 0xb0, 0x0c, 0xae, 0x86, 0x46, 0x8c, 0x46, 0x0e, 0x4a, 0x43, 0xce, 0x0f, 0xad, 0x0f, 0x1c, 0x52, 0x68, 0x0c, 0x37, 0x30, 0xcd, 0x97, 0x70, 0xd3, 0x70, 0x96, 0x63, 0x0d, 0x26, 0x3c, 0x00, 0x04, 0x65, 0x00, 0x00, 0x40, 0x27, 0xbe, 0x52, 0x05, 0x9e, 0x96, 0x61, 0x13, 0x84, 0x00, 0x22, 0x02, 0x92, 0x2a, 0x1c, 0x00, 0x90, 0x01, 0x91, 0x21, 0x1c, 0x60, 0x46, 0x73, 0x46, 0x00, 0xf0, 0x29, 0xf8, 0x07, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xa0, 0x7e, 0x01, 0x00, 0xff, 0xb5, 0x10, 0x1c, 0x1a, 0x1c, 0x0c, 0x1c, 0x19, 0x1c, 0x60, 0x23, 0xff, 0x32, 0x13, 0x43, 0x0c, 0x4a, 0x83, 0xb0, 0x3c, 0x00, 0x40, 0x65, 0x00, 0x00, 0x0c, 0xae, 0x52, 0x68, 0x60, 0xce, 0x93, 0x70, 0x00, 0x23, 0xd3, 0x70, 0x93, 0x63, 0x40, 0x27, 0xbb, 0x52, 0x93, 0x61, 0x13, 0x84, 0x03, 0x22, 0x02, 0x92, 0x01, 0x91, 0x29, 0x1c, 0x32, 0x1c, 0x00, 0x90, 0x20, 0x1c, 0x03, 0x9b, 0x00, 0xf0, 0x05, 0xf8, 0x07, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xa0, 0x7e, 0x01, 0x00, 0xf8, 0xb5, 0x05, 0x1c, 0x11, 0x48, 0x1c, 0x1c, 0x3c, 0x00, 0x7c, 0x65, 0x00, 0x00, 0x08, 0x9b, 0x07, 0x9f, 0x40, 0x68, 0xde, 0x00, 0x81, 0x65, 0x02, 0x66, 0x00, 0x21, 0x81, 0x80, 0x0d, 0x48, 0x81, 0x59, 0x20, 0x1c, 0xf9, 0xf7, 0x22, 0xff, 0x0b, 0x48, 0x30, 0x18, 0x41, 0x68, 0x28, 0x1c, 0xf9, 0xf7, 0x1c, 0xff, 0x07, 0x49, 0x06, 0x98, 0x49, 0x68, 0x00, 0x2c, 0x88, 0x62, 0x0f, 0x86, 0x00, 0xd1, 0x2c, 0x1c, 0x05, 0x48, 0x4c, 0x62, 0x45, 0x65, 0x3c, 0x00, 0xb8, 0x65, 0x00, 0x00, 0x01, 0x21, 0x01, 0x65, 0x01, 0x64, 0xf8, 0xbd, 0xa0, 0x7e, 0x01, 0x00, 0x90, 0x52, 0x01, 0x00, 0x00, 0x30, 0x07, 0x00, 0xff, 0xb5, 0x83, 0xb0, 0x0d, 0xae, 0x60, 0xce, 0x0c, 0x9f, 0x08, 0x1c, 0x11, 0x1c, 0xd2, 0x19, 0xff, 0x32, 0x40, 0x24, 0x14, 0x43, 0x0b, 0x4a, 0x52, 0x68, 0x94, 0x70, 0x00, 0x24, 0xd4, 0x70, 0x93, 0x63, 0x40, 0x23, 0x9f, 0x52, 0x94, 0x61, 0x3c, 0x00, 0xf4, 0x65, 0x00, 0x00, 0x14, 0x84, 0x02, 0x22, 0x02, 0x92, 0x32, 0x1c, 0x00, 0x90, 0x01, 0x91, 0x23, 0x1c, 0x29, 0x1c, 0x03, 0x98, 0xff, 0xf7, 0xb5, 0xff, 0x07, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xa0, 0x7e, 0x01, 0x00, 0x4c, 0x21, 0x0d, 0x4a, 0x41, 0x43, 0x10, 0xb5, 0x8c, 0x18, 0x0c, 0x49, 0x09, 0x78, 0x88, 0x42, 0x07, 0xd1, 0x05, 0xf0, 0xc7, 0xfd, 0x0a, 0x48, 0x01, 0x88, 0x01, 0x22, 0x3c, 0x00, 0x30, 0x66, 0x00, 0x00, 0x12, 0x03, 0x91, 0x43, 0x01, 0x80, 0x20, 0x1c, 0x30, 0x30, 0x0c, 0x23, 0xc1, 0x56, 0x40, 0x7b, 0x81, 0x42, 0x02, 0xdd, 0x20, 0x8d, 0x0c, 0xf0, 0xe5, 0xfb, 0x10, 0xbd, 0x58, 0xe3, 0x01, 0x00, 0x3c, 0x7c, 0x01, 0x00, 0x32, 0x80, 0x07, 0x00, 0x01, 0x1c, 0x60, 0x31, 0x80, 0xb5, 0xca, 0x79, 0x8b, 0x79, 0x9a, 0x42, 0x07, 0xd9, 0x48, 0x7a, 0x0c, 0x23, 0x07, 0x49, 0x3c, 0x00, 0x6c, 0x66, 0x00, 0x00, 0x58, 0x43, 0x08, 0x5a, 0x0c, 0xf0, 0xd0, 0xfb, 0x80, 0xbd, 0x20, 0x30, 0x00, 0x7b, 0x01, 0x28, 0xfa, 0xd1, 0x48, 0x7a, 0x05, 0xf0, 0x40, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x1c, 0x21, 0xf9, 0xf7, 0x03, 0xff, 0x03, 0x48, 0xa0, 0x80, 0xe0, 0x80, 0x20, 0x81, 0x60, 0x81, 0xa0, 0x81, 0x10, 0xbd, 0xff, 0xff, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0x66, 0x00, 0x00, 0xff, 0xb5, 0x04, 0x1c, 0x00, 0x20, 0x83, 0xb0, 0x0d, 0x1c, 0x06, 0x2c, 0x02, 0x90, 0x38, 0xd2, 0x1f, 0x4a, 0xff, 0x26, 0xc1, 0x00, 0x89, 0x18, 0x89, 0x78, 0xa1, 0x42, 0x03, 0xd1, 0xc0, 0x00, 0x80, 0x18, 0x46, 0x78, 0x04, 0xe0, 0x01, 0x30, 0x00, 0x06, 0x00, 0x16, 0x06, 0x28, 0xf1, 0xdb, 0xff, 0x2e, 0x24, 0xd0, 0x01, 0x93, 0x20, 0x1c, 0x0d, 0xf0, 0xe8, 0xf9, 0x3c, 0x00, 0xe4, 0x66, 0x00, 0x00, 0x00, 0x28, 0x05, 0xd0, 0x24, 0x21, 0x28, 0x1c, 0x01, 0xab, 0x02, 0xaa, 0xfa, 0xf7, 0x30, 0xfe, 0x10, 0x49, 0xf0, 0x00, 0x30, 0x39, 0x0f, 0x58, 0x31, 0x06, 0x09, 0x16, 0x28, 0x1c, 0x05, 0x9a, 0x01, 0x9b, 0xf9, 0xf7, 0x6e, 0xfe, 0x06, 0x1c, 0x10, 0xd1, 0x20, 0x1c, 0x0d, 0xf0, 0xd0, 0xf9, 0x00, 0x28, 0x0b, 0xd0, 0x28, 0x1c, 0x69, 0x69, 0xfa, 0xf7, 0x12, 0xfe, 0x3c, 0x00, 0x20, 0x67, 0x00, 0x00, 0x02, 0x98, 0x68, 0x61, 0x04, 0xe0, 0x06, 0x2c, 0x01, 0xd3, 0x07, 0x26, 0x00, 0xe0, 0x08, 0x26, 0x30, 0x1c, 0x07, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xcc, 0x5a, 0x01, 0x00, 0x10, 0xb5, 0x0c, 0x1c, 0x09, 0xf0, 0x86, 0xf8, 0x00, 0x28, 0x02, 0xd0, 0x20, 0x1c, 0x09, 0xf0, 0xb5, 0xf8, 0x10, 0xbd, 0xfe, 0xb5, 0x13, 0x4d, 0x04, 0x1c, 0xae, 0x69, 0x00, 0x2e, 0x1c, 0xd0, 0x3c, 0x00, 0x5c, 0x67, 0x00, 0x00, 0x10, 0x4f, 0x30, 0x37, 0x78, 0x68, 0x60, 0x43, 0x01, 0x1c, 0x28, 0x88, 0xf9, 0xf7, 0xd2, 0xff, 0x39, 0x68, 0x61, 0x43, 0x41, 0x18, 0x01, 0xa8, 0x32, 0x1c, 0xf9, 0xf7, 0x37, 0xfe, 0x02, 0x98, 0x29, 0x6a, 0x40, 0x18, 0x28, 0x62, 0x0b, 0xd4, 0xe9, 0x69, 0x88, 0x42, 0x08, 0xd9, 0xa9, 0x69, 0x40, 0x1a, 0x28, 0x62, 0x01, 0x98, 0x01, 0x30, 0x01, 0xe0, 0x00, 0x20, 0x3c, 0x00, 0x98, 0x67, 0x00, 0x00, 0x02, 0x90, 0x01, 0x90, 0x01, 0x98, 0xfe, 0xbd, 0xc8, 0x74, 0x01, 0x00, 0xf8, 0xb5, 0x00, 0x28, 0x28, 0xd0, 0x00, 0x24, 0x14, 0x4d, 0x00, 0xe0, 0x01, 0x34, 0x61, 0x00, 0x09, 0x19, 0x49, 0x19, 0x49, 0x78, 0x00, 0x29, 0xf8, 0xd1, 0x63, 0x00, 0x1b, 0x19, 0x03, 0x33, 0x07, 0x22, 0x69, 0x46, 0x03, 0xf0, 0xd4, 0xfb, 0x00, 0x2c, 0x0f, 0xd0, 0x00, 0x20, 0x00, 0x99, 0x3c, 0x00, 0xd4, 0x67, 0x00, 0x00, 0x0a, 0xe0, 0x42, 0x00, 0x12, 0x18, 0xae, 0x5c, 0x53, 0x18, 0x52, 0x19, 0x5e, 0x71, 0x56, 0x78, 0x01, 0x30, 0x9e, 0x71, 0x92, 0x78, 0xda, 0x71, 0xa0, 0x42, 0xf2, 0xdb, 0x00, 0x98, 0x03, 0x22, 0x02, 0x30, 0x03, 0x49, 0xf9, 0xf7, 0x7e, 0xfe, 0xf8, 0xbd, 0x00, 0x00, 0xeb, 0x62, 0x01, 0x00, 0xe8, 0x62, 0x01, 0x00, 0xb0, 0xb5, 0x05, 0x1c, 0x08, 0x1c, 0xfa, 0xf7, 0x3c, 0x00, 0x10, 0x68, 0x00, 0x00, 0x9d, 0xff, 0x04, 0x1c, 0x28, 0x1c, 0xfa, 0xf7, 0xd9, 0xfe, 0x21, 0x1c, 0xfa, 0xf7, 0xfc, 0xfd, 0x20, 0x1c, 0xb0, 0xbd, 0xf3, 0xb5, 0x44, 0x48, 0x0c, 0x1c, 0x00, 0x78, 0x81, 0xb0, 0x01, 0x28, 0x72, 0xd1, 0xfa, 0xf7, 0x82, 0xf8, 0x41, 0x4d, 0xe8, 0x6a, 0x41, 0x49, 0x08, 0x60, 0xe8, 0x6b, 0x48, 0x60, 0x40, 0x48, 0xfa, 0xf7, 0xa6, 0xf9, 0xe8, 0x6a, 0x00, 0x28, 0x3c, 0x00, 0x4c, 0x68, 0x00, 0x00, 0xfc, 0xda, 0x22, 0x1c, 0x0f, 0x20, 0x01, 0x99, 0x0a, 0xf0, 0xa4, 0xf8, 0x38, 0x4d, 0x02, 0x27, 0x2f, 0x63, 0x38, 0x4a, 0x64, 0x26, 0x00, 0x20, 0xaa, 0x21, 0x08, 0x32, 0x13, 0x18, 0x01, 0x30, 0x00, 0x04, 0x00, 0x0c, 0x64, 0x28, 0x19, 0x74, 0xf8, 0xd3, 0x16, 0x81, 0x00, 0x20, 0x50, 0x60, 0x10, 0x1c, 0x10, 0x30, 0x10, 0x60, 0x00, 0x25, 0x17, 0x1c, 0xd2, 0x60, 0x3c, 0x00, 0x88, 0x68, 0x00, 0x00, 0x08, 0xe0, 0x28, 0x1c, 0xf9, 0xf7, 0xa2, 0xff, 0x41, 0x31, 0x78, 0x19, 0x01, 0x35, 0x2d, 0x04, 0x2d, 0x0c, 0x01, 0x74, 0xb5, 0x42, 0xf4, 0xd3, 0x26, 0x4d, 0x6f, 0x63, 0x01, 0x20, 0x28, 0x63, 0x24, 0x4d, 0xe8, 0x6a, 0x00, 0x28, 0xfb, 0xda, 0x0b, 0x22, 0x3b, 0x1c, 0x24, 0x4e, 0x03, 0xe0, 0x01, 0x32, 0x64, 0x2a, 0x00, 0xd1, 0x00, 0x22, 0x10, 0x1c, 0x0c, 0x21, 0x3c, 0x00, 0xc4, 0x68, 0x00, 0x00, 0x01, 0x39, 0x75, 0x5c, 0x1f, 0x18, 0x3f, 0x7c, 0xbd, 0x42, 0xf3, 0xd1, 0x01, 0x38, 0x00, 0xd5, 0x63, 0x20, 0x00, 0x29, 0xf4, 0xd1, 0x18, 0x4e, 0x50, 0x1c, 0xf1, 0x6b, 0x1a, 0x4a, 0x10, 0x1c, 0x01, 0x38, 0xfd, 0xd1, 0xf0, 0x6b, 0x88, 0x42, 0x01, 0xd0, 0x01, 0x1c, 0xf7, 0xe7, 0x02, 0x27, 0x37, 0x63, 0x16, 0x4d, 0x90, 0x21, 0x28, 0x1c, 0xf9, 0xf7, 0xce, 0xfd, 0x3c, 0x00, 0x00, 0x69, 0x00, 0x00, 0x28, 0x1c, 0x28, 0x30, 0x28, 0x60, 0x28, 0x1c, 0x10, 0x30, 0x2f, 0x81, 0xe8, 0x60, 0x28, 0x1c, 0x20, 0x30, 0x28, 0x61, 0x04, 0x21, 0x00, 0xe0, 0x0c, 0xe0, 0x29, 0x83, 0xe8, 0x61, 0xed, 0x62, 0x75, 0x63, 0x01, 0x20, 0x30, 0x63, 0x22, 0x1c, 0x89, 0x20, 0x01, 0x99, 0x0a, 0xf0, 0x38, 0xf8, 0x00, 0x20, 0x28, 0x63, 0xfe, 0xbd, 0x00, 0x00, 0x08, 0x57, 0x01, 0x00, 0x3c, 0x00, 0x3c, 0x69, 0x00, 0x00, 0x00, 0x30, 0x07, 0x00, 0x10, 0x8e, 0x01, 0x00, 0x74, 0xff, 0x01, 0x00, 0x09, 0x57, 0x01, 0x00, 0x20, 0x4e, 0x00, 0x00, 0xe4, 0xfe, 0x01, 0x00, 0x80, 0xb5, 0x13, 0x28, 0x1e, 0xd0, 0xf0, 0x28, 0x16, 0xd1, 0x09, 0xf0, 0xb5, 0xf9, 0x00, 0x28, 0x13, 0xd1, 0x0d, 0xf0, 0xbf, 0xfa, 0x11, 0xf0, 0x0d, 0xfc, 0x00, 0x22, 0x04, 0x21, 0xc4, 0x20, 0x0c, 0xf0, 0x1c, 0xff, 0x3c, 0x00, 0x78, 0x69, 0x00, 0x00, 0x09, 0x48, 0x00, 0x21, 0x00, 0x78, 0x05, 0xf0, 0x3f, 0xfd, 0x05, 0xf0, 0x93, 0xf8, 0x07, 0x49, 0x01, 0x20, 0x08, 0x60, 0x80, 0xbd, 0x01, 0x1c, 0x01, 0x20, 0xfa, 0xf7, 0x87, 0xfc, 0x80, 0xbd, 0x00, 0xf0, 0x32, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x6a, 0x57, 0x01, 0x00, 0x3c, 0xd9, 0x01, 0x00, 0xb0, 0xb5, 0x0c, 0xf0, 0xff, 0xf9, 0x0b, 0x49, 0x02, 0x24, 0x48, 0x60, 0x3c, 0x00, 0xb4, 0x69, 0x00, 0x00, 0x0a, 0x48, 0x04, 0x61, 0x01, 0x20, 0x77, 0x21, 0x09, 0x03, 0x08, 0x61, 0x08, 0x4d, 0x68, 0x68, 0x80, 0x07, 0x02, 0xd4, 0x68, 0x68, 0x20, 0x43, 0x68, 0x60, 0x09, 0xf0, 0xc7, 0xf9, 0x68, 0x68, 0xa0, 0x43, 0x68, 0x60, 0x00, 0x20, 0xb0, 0xbd, 0xe0, 0x60, 0x01, 0x00, 0x00, 0x30, 0x07, 0x00, 0x00, 0x01, 0x07, 0x00, 0x80, 0xb5, 0x01, 0x23, 0x03, 0x22, 0x00, 0x21, 0x3c, 0x00, 0xf0, 0x69, 0x00, 0x00, 0x02, 0x20, 0x3c, 0xf0, 0xf1, 0xfa, 0x00, 0x28, 0x01, 0xd0, 0xfa, 0xf7, 0x81, 0xfc, 0x80, 0xbd, 0x1c, 0xb5, 0xfc, 0xf7, 0xf5, 0xfa, 0xfa, 0xf7, 0x19, 0xfe, 0x01, 0xf0, 0x03, 0xf9, 0x00, 0x24, 0x21, 0x1c, 0x68, 0x46, 0x01, 0xf0, 0xe2, 0xfb, 0x00, 0xab, 0x18, 0x78, 0x01, 0x28, 0x03, 0xd0, 0x02, 0x28, 0x01, 0xd0, 0x03, 0x28, 0x01, 0xd1, 0x0c, 0xf0, 0xb2, 0xfc, 0x3c, 0x00, 0x2c, 0x6a, 0x00, 0x00, 0x01, 0x34, 0x24, 0x06, 0x24, 0x16, 0x06, 0x2c, 0xec, 0xdb, 0xfa, 0xf7, 0x09, 0xf9, 0xfa, 0xf7, 0xe7, 0xfc, 0xfa, 0xf7, 0x33, 0xfa, 0xfa, 0xf7, 0x6d, 0xfa, 0xfb, 0xf7, 0xdf, 0xff, 0x05, 0xf0, 0x4d, 0xfb, 0x06, 0xf0, 0x81, 0xfc, 0x0b, 0xf0, 0x7d, 0xf9, 0x07, 0xf0, 0x29, 0xfc, 0x11, 0x48, 0x10, 0x21, 0x01, 0x60, 0x09, 0x01, 0x01, 0x60, 0xc9, 0x02, 0x01, 0x60, 0x3c, 0x00, 0x68, 0x6a, 0x00, 0x00, 0x89, 0x00, 0x01, 0x60, 0x20, 0x21, 0x01, 0x60, 0x04, 0x21, 0x01, 0x60, 0x08, 0x21, 0x01, 0x60, 0x40, 0x21, 0x01, 0x60, 0x80, 0x21, 0x01, 0x60, 0x89, 0x00, 0x01, 0x60, 0x49, 0x00, 0x01, 0x60, 0x49, 0x00, 0x01, 0x60, 0x49, 0x00, 0x01, 0x60, 0xc9, 0x03, 0x01, 0x60, 0x89, 0x0b, 0x01, 0x60, 0xf9, 0xf7, 0x41, 0xff, 0x1c, 0xbd, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x3c, 0x00, 0xa4, 0x6a, 0x00, 0x00, 0x80, 0xb5, 0x3b, 0xf0, 0x4f, 0xf8, 0x3b, 0xf0, 0x7d, 0xf9, 0xfa, 0xf7, 0x4b, 0xf9, 0x80, 0xbd, 0xf8, 0xb5, 0x00, 0x25, 0x00, 0x24, 0x00, 0x22, 0x00, 0x28, 0x71, 0xd0, 0x43, 0x4f, 0xb9, 0x68, 0x0b, 0x1a, 0xbb, 0x60, 0xf8, 0x68, 0x39, 0x1c, 0x01, 0x30, 0xf8, 0x60, 0x89, 0x6a, 0x00, 0x2b, 0x1e, 0xdc, 0x02, 0x24, 0x00, 0x29, 0x06, 0xda, 0xfb, 0x69, 0x98, 0x42, 0x3c, 0x00, 0xe0, 0x6a, 0x00, 0x00, 0x06, 0xdd, 0x3b, 0x69, 0x98, 0x42, 0x09, 0xdd, 0x07, 0xe0, 0xbb, 0x69, 0x98, 0x42, 0x01, 0xdc, 0x01, 0x24, 0x03, 0xe0, 0x7b, 0x69, 0x98, 0x42, 0x00, 0xdd, 0x03, 0x24, 0x78, 0x6a, 0x00, 0x28, 0x08, 0xd0, 0x00, 0x20, 0x78, 0x62, 0x03, 0x2c, 0x01, 0xd1, 0x02, 0x24, 0x02, 0xe0, 0x02, 0x2c, 0x00, 0xd1, 0x01, 0x24, 0x2e, 0x48, 0x01, 0x2c, 0x00, 0x79, 0x18, 0xd1, 0x3c, 0x00, 0x1c, 0x6b, 0x00, 0x00, 0xbb, 0x78, 0x99, 0x42, 0x15, 0xda, 0x3b, 0x78, 0x7b, 0x70, 0x39, 0x70, 0x01, 0x31, 0xb9, 0x62, 0x01, 0xd5, 0x01, 0x31, 0xb9, 0x62, 0xb9, 0x6a, 0x01, 0x25, 0x99, 0x42, 0x03, 0xd1, 0x04, 0x28, 0x04, 0xd2, 0x01, 0x30, 0x00, 0xe0, 0x00, 0x20, 0x38, 0x71, 0x01, 0x22, 0x00, 0x29, 0x33, 0xda, 0x27, 0xe0, 0x03, 0x2c, 0x35, 0xd1, 0x00, 0x26, 0x00, 0x28, 0x07, 0xd0, 0x3c, 0x00, 0x58, 0x6b, 0x00, 0x00, 0x1e, 0x49, 0x81, 0x40, 0x38, 0x6a, 0x08, 0x18, 0x0c, 0xf0, 0x5c, 0xf8, 0x00, 0x28, 0x2c, 0xd0, 0x1b, 0x48, 0x00, 0x78, 0x40, 0x07, 0x05, 0xd5, 0xf8, 0x68, 0x39, 0x69, 0x88, 0x42, 0x01, 0xdb, 0x03, 0x23, 0xfe, 0x56, 0xb8, 0x6a, 0xb0, 0x42, 0x12, 0xdd, 0x01, 0x21, 0x79, 0x62, 0x39, 0x78, 0x01, 0x25, 0x79, 0x70, 0x38, 0x70, 0x01, 0x38, 0xb8, 0x62, 0x88, 0x42, 0x3c, 0x00, 0x94, 0x6b, 0x00, 0x00, 0x01, 0xd0, 0x00, 0x21, 0x39, 0x71, 0x00, 0x28, 0x0c, 0xda, 0x07, 0x20, 0x38, 0x71, 0x00, 0xe0, 0x12, 0xe0, 0x07, 0xe0, 0x38, 0x79, 0x00, 0x28, 0x09, 0xd0, 0xff, 0x30, 0x38, 0x71, 0x06, 0xe0, 0x00, 0x2a, 0x02, 0xd0, 0x0c, 0xf0, 0xf8, 0xf8, 0x38, 0x62, 0x00, 0x2c, 0x04, 0xd0, 0xfe, 0xf7, 0x97, 0xfd, 0x29, 0x1c, 0x08, 0xf0, 0xfc, 0xfb, 0xf8, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0xd0, 0x6b, 0x00, 0x00, 0xac, 0x7e, 0x01, 0x00, 0x50, 0xc3, 0x00, 0x00, 0x1d, 0x75, 0x01, 0x00, 0x80, 0xb5, 0x10, 0x68, 0x00, 0x28, 0x02, 0xd0, 0x00, 0xf0, 0x0a, 0xf8, 0x80, 0xbd, 0x03, 0x48, 0xc0, 0x69, 0x80, 0x68, 0x08, 0xf0, 0xb2, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x84, 0x6a, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0xc0, 0x68, 0x00, 0x28, 0x01, 0xd1, 0xfa, 0xf7, 0x7a, 0xfb, 0x3c, 0x00, 0x0c, 0x6c, 0x00, 0x00, 0xe0, 0x68, 0xe1, 0x69, 0xc0, 0x68, 0x23, 0x1c, 0x01, 0x4a, 0xff, 0xf7, 0xd7, 0xfb, 0x10, 0xbd, 0xdd, 0x6b, 0x00, 0x00, 0xb0, 0xb5, 0x05, 0x1c, 0x0c, 0x21, 0x00, 0x20, 0xfa, 0xf7, 0xd6, 0xfc, 0x04, 0x1c, 0x00, 0x68, 0x00, 0x21, 0x41, 0x60, 0x01, 0x60, 0x29, 0x88, 0x01, 0x81, 0x69, 0x88, 0x41, 0x81, 0x29, 0x1c, 0xff, 0x31, 0x21, 0x31, 0x20, 0x1c, 0x03, 0xf0, 0x3c, 0x00, 0x48, 0x6c, 0x00, 0x00, 0x77, 0xf9, 0x29, 0x1c, 0xff, 0x31, 0x46, 0x31, 0x20, 0x1c, 0x03, 0xf0, 0x71, 0xf9, 0x29, 0x1c, 0xff, 0x31, 0x50, 0x31, 0x20, 0x1c, 0x03, 0xf0, 0x6b, 0xf9, 0x29, 0x1c, 0xff, 0x31, 0x43, 0x31, 0x20, 0x1c, 0x03, 0xf0, 0x65, 0xf9, 0x29, 0x1c, 0xff, 0x31, 0x63, 0x31, 0x20, 0x1c, 0x03, 0xf0, 0x5f, 0xf9, 0x04, 0x48, 0x00, 0x68, 0x00, 0x28, 0x02, 0xd0, 0x20, 0x1c, 0x3c, 0x00, 0x84, 0x6c, 0x00, 0x00, 0xff, 0xf7, 0x8e, 0xfd, 0x20, 0x1c, 0xb0, 0xbd, 0xe4, 0x62, 0x01, 0x00, 0xf8, 0xb5, 0x05, 0x1c, 0x0c, 0x1c, 0x04, 0xd1, 0x05, 0x21, 0x18, 0x20, 0xfa, 0xf7, 0x02, 0xfb, 0x4d, 0xe0, 0x29, 0x1c, 0x12, 0x31, 0x06, 0x22, 0x60, 0x1c, 0xf9, 0xf7, 0x25, 0xfc, 0x22, 0x1c, 0x30, 0x32, 0x00, 0x26, 0x00, 0x21, 0x00, 0x20, 0x16, 0x70, 0x34, 0x4b, 0x1b, 0x5c, 0x2f, 0x8a, 0x3c, 0x00, 0xc0, 0x6c, 0x00, 0x00, 0xdf, 0x40, 0xff, 0x07, 0x07, 0xd5, 0x17, 0x78, 0x01, 0x33, 0x01, 0x37, 0x17, 0x70, 0x67, 0x18, 0x30, 0x37, 0x7b, 0x70, 0x01, 0x31, 0x01, 0x30, 0x0e, 0x28, 0xee, 0xdb, 0xa8, 0x7b, 0x60, 0x72, 0x10, 0x78, 0x00, 0x28, 0x2b, 0xd0, 0x2a, 0x48, 0x1e, 0x21, 0x09, 0x5c, 0x27, 0x1c, 0x10, 0x37, 0x21, 0x72, 0x01, 0x68, 0x61, 0x81, 0xc1, 0x89, 0x21, 0x77, 0x81, 0x89, 0x3c, 0x00, 0xfc, 0x6c, 0x00, 0x00, 0x79, 0x73, 0xc1, 0x8a, 0xa1, 0x81, 0x01, 0x8b, 0xe1, 0x81, 0x42, 0x8a, 0x21, 0x1c, 0x60, 0x31, 0x4a, 0x80, 0x82, 0x8a, 0x8a, 0x80, 0x1f, 0x49, 0x2c, 0x31, 0x09, 0x7a, 0x00, 0x29, 0x09, 0xd0, 0x02, 0x29, 0x0a, 0xd1, 0x01, 0x22, 0x62, 0x62, 0x62, 0x72, 0x42, 0x8b, 0xa2, 0x81, 0x80, 0x8b, 0xe0, 0x81, 0x03, 0xe0, 0x01, 0x21, 0x66, 0x62, 0x00, 0xe0, 0x00, 0x21, 0x3c, 0x00, 0x38, 0x6d, 0x00, 0x00, 0xe8, 0x7b, 0x08, 0x40, 0x01, 0xd1, 0x00, 0x20, 0xf8, 0xbd, 0xa8, 0x68, 0x43, 0x1c, 0x09, 0xd0, 0x22, 0x1c, 0x12, 0x32, 0x00, 0x92, 0x93, 0x1d, 0x02, 0x32, 0x21, 0x1c, 0x01, 0xf0, 0x9c, 0xfa, 0xa0, 0x62, 0x00, 0xe0, 0xa6, 0x62, 0x68, 0x7b, 0x29, 0x1c, 0x1d, 0x31, 0x20, 0x74, 0x0b, 0x48, 0x20, 0x22, 0x20, 0x62, 0x20, 0x1c, 0x42, 0x30, 0xbe, 0x73, 0xf9, 0xf7, 0x3c, 0x00, 0x74, 0x6d, 0x00, 0x00, 0xc1, 0xfb, 0x40, 0x34, 0x26, 0x70, 0x68, 0x7e, 0x04, 0x49, 0x60, 0x70, 0x68, 0x68, 0x2c, 0x31, 0x48, 0x60, 0x01, 0x20, 0xda, 0xe7, 0x00, 0x00, 0x90, 0x58, 0x01, 0x00, 0xc8, 0x6e, 0x01, 0x00, 0x91, 0x02, 0x01, 0x00, 0x70, 0xb5, 0x16, 0x1c, 0x0d, 0x1c, 0x04, 0x1c, 0x00, 0x28, 0x06, 0xd0, 0x0c, 0x20, 0xfa, 0xf7, 0x47, 0xfd, 0x30, 0xc0, 0x08, 0x38, 0x06, 0x72, 0x3c, 0x00, 0xb0, 0x6d, 0x00, 0x00, 0x70, 0xbd, 0x00, 0x20, 0x70, 0xbd, 0x00, 0x00, 0x01, 0x1c, 0x05, 0x48, 0x80, 0xb5, 0x00, 0x68, 0x01, 0xd0, 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0xfc, 0xf7, 0xa0, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x0c, 0x79, 0x01, 0x00, 0x70, 0xb5, 0x0e, 0x1c, 0x04, 0x1c, 0x00, 0x28, 0x01, 0xd1, 0xfa, 0xf7, 0x8f, 0xfa, 0x06, 0x4d, 0x28, 0x68, 0x00, 0x28, 0x01, 0xd0, 0xfa, 0xf7, 0x3c, 0x00, 0xec, 0x6d, 0x00, 0x00, 0x89, 0xfa, 0x04, 0x48, 0x2e, 0x60, 0xc4, 0x60, 0x01, 0x21, 0x01, 0x70, 0x70, 0xbd, 0x00, 0x00, 0xa8, 0x7e, 0x01, 0x00, 0x30, 0x00, 0x07, 0x00, 0x10, 0xb5, 0x07, 0x4c, 0x20, 0x68, 0x00, 0x28, 0x01, 0xd1, 0xfa, 0xf7, 0x77, 0xfa, 0x05, 0x48, 0x00, 0x69, 0x21, 0x68, 0xf9, 0xf7, 0xdf, 0xfa, 0x00, 0x20, 0x20, 0x60, 0x10, 0xbd, 0x00, 0x00, 0xa8, 0x7e, 0x01, 0x00, 0x3c, 0x00, 0x28, 0x6e, 0x00, 0x00, 0x30, 0x00, 0x07, 0x00, 0x01, 0x20, 0x05, 0x49, 0xc0, 0x06, 0x80, 0xb5, 0x08, 0x60, 0x00, 0x22, 0x03, 0x21, 0x54, 0x20, 0x0c, 0xf0, 0xb8, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x04, 0x21, 0xc4, 0x20, 0x0c, 0xf0, 0xae, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x04, 0x48, 0x80, 0xb5, 0x00, 0x88, 0x02, 0x49, 0xff, 0xf7, 0xb8, 0xff, 0x3c, 0x00, 0x64, 0x6e, 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x75, 0x4b, 0x00, 0x00, 0xc8, 0x74, 0x01, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x31, 0x48, 0x00, 0x25, 0xc0, 0x68, 0x0c, 0x1c, 0x00, 0x28, 0x30, 0xd0, 0x2e, 0x48, 0x2f, 0x4f, 0x04, 0x30, 0x00, 0x78, 0x38, 0x76, 0x2c, 0x48, 0x04, 0x30, 0x40, 0x78, 0x38, 0x81, 0x00, 0x2a, 0x0b, 0xd0, 0xf9, 0xf7, 0xa5, 0xfa, 0x1f, 0x20, 0xb8, 0x76, 0x20, 0x1c, 0x3c, 0x00, 0xa0, 0x6e, 0x00, 0x00, 0xf9, 0xf7, 0xf6, 0xf9, 0x25, 0x48, 0x04, 0x30, 0x80, 0x78, 0xb8, 0x76, 0x43, 0xe0, 0x25, 0x48, 0x22, 0x49, 0x84, 0x42, 0x4d, 0x69, 0x02, 0xd2, 0x6c, 0x43, 0xe4, 0x0b, 0x0f, 0xe0, 0x1f, 0x48, 0x21, 0x1c, 0x80, 0x6a, 0x00, 0x90, 0xf9, 0xf7, 0x23, 0xfc, 0x00, 0x99, 0x02, 0x1c, 0x4a, 0x43, 0xa1, 0x1a, 0x1a, 0x4a, 0x69, 0x43, 0x52, 0x6a, 0xc9, 0x0b, 0x50, 0x43, 0x3c, 0x00, 0xdc, 0x6e, 0x00, 0x00, 0x44, 0x18, 0x02, 0x2c, 0x01, 0xd8, 0x00, 0x20, 0xf8, 0xbd, 0xf9, 0xf7, 0x7d, 0xfa, 0x1f, 0x20, 0xb8, 0x76, 0x20, 0x1c, 0xf9, 0xf7, 0xae, 0xf9, 0x04, 0x1c, 0x11, 0x48, 0x04, 0x30, 0x80, 0x78, 0xb8, 0x76, 0x0f, 0x4f, 0x7d, 0x6a, 0xac, 0x42, 0x04, 0xd2, 0x20, 0x1c, 0xff, 0xf7, 0x22, 0xfc, 0x05, 0x1c, 0x12, 0xe0, 0x21, 0x1c, 0x28, 0x1c, 0xf9, 0xf7, 0xfc, 0xfb, 0x3c, 0x00, 0x18, 0x6f, 0x00, 0x00, 0x06, 0x1c, 0x68, 0x43, 0x20, 0x1a, 0xff, 0xf7, 0x17, 0xfc, 0x05, 0x1c, 0x00, 0x24, 0x04, 0xe0, 0x78, 0x6a, 0xff, 0xf7, 0x11, 0xfc, 0x45, 0x19, 0x01, 0x34, 0xb4, 0x42, 0xf8, 0xd3, 0x28, 0x1c, 0xd4, 0xe7, 0x00, 0x00, 0xc8, 0x74, 0x01, 0x00, 0x30, 0x00, 0x07, 0x00, 0xc0, 0xc6, 0x2d, 0x00, 0x01, 0x1c, 0x7d, 0x20, 0x80, 0xb5, 0xc0, 0x00, 0xf9, 0xf7, 0x72, 0xfb, 0x3c, 0x00, 0x54, 0x6f, 0x00, 0x00, 0x02, 0x49, 0x88, 0x61, 0x40, 0x08, 0xc8, 0x61, 0x80, 0xbd, 0x00, 0x00, 0xc8, 0x74, 0x01, 0x00, 0x10, 0xb5, 0x06, 0x4c, 0x21, 0x1c, 0x00, 0x20, 0x0b, 0xf0, 0x42, 0xfa, 0x21, 0x1c, 0x00, 0x20, 0x0b, 0xf0, 0x0a, 0xfa, 0x00, 0xf0, 0x68, 0xfe, 0x10, 0xbd, 0x00, 0x00, 0x85, 0x6f, 0x00, 0x00, 0x30, 0xb5, 0x0f, 0x4d, 0x2a, 0x78, 0x04, 0x2a, 0x19, 0xd8, 0x00, 0x2a, 0x3c, 0x00, 0x90, 0x6f, 0x00, 0x00, 0x17, 0xd0, 0x00, 0x21, 0x07, 0xe0, 0x4b, 0x00, 0x5b, 0x18, 0x5c, 0x19, 0x01, 0x23, 0xe4, 0x56, 0x84, 0x42, 0x02, 0xda, 0x01, 0x31, 0x8a, 0x42, 0xf5, 0xdc, 0x8a, 0x42, 0x00, 0xd1, 0x01, 0x39, 0x48, 0x00, 0x40, 0x18, 0x40, 0x19, 0x81, 0x78, 0x02, 0x4a, 0x34, 0x3a, 0x11, 0x70, 0xc0, 0x78, 0x50, 0x70, 0x30, 0xbd, 0x00, 0x75, 0x01, 0x00, 0x30, 0xb5, 0x11, 0x1c, 0x3c, 0x00, 0xcc, 0x6f, 0x00, 0x00, 0x38, 0x31, 0x85, 0xb0, 0x91, 0x62, 0x08, 0x21, 0x11, 0x86, 0x00, 0x23, 0x14, 0x1c, 0x01, 0x1c, 0x53, 0x63, 0xc0, 0x68, 0x15, 0x4d, 0x0b, 0xe0, 0x02, 0x68, 0xaa, 0x42, 0x06, 0xd1, 0xc2, 0x68, 0xca, 0x60, 0xc3, 0x60, 0x03, 0x60, 0xfa, 0xf7, 0xd1, 0xfa, 0x03, 0xe0, 0x01, 0x1c, 0xc0, 0x68, 0x00, 0x28, 0xf1, 0xd1, 0x22, 0x1c, 0x40, 0x32, 0x08, 0x21, 0x20, 0x68, 0x3c, 0x00, 0x08, 0x70, 0x00, 0x00, 0xfa, 0xf7, 0x64, 0xfb, 0x0b, 0x49, 0x20, 0x1c, 0x48, 0x30, 0x02, 0x90, 0x04, 0x94, 0x03, 0x91, 0xe0, 0x69, 0x82, 0x88, 0x01, 0x68, 0x6e, 0x20, 0x01, 0x92, 0x00, 0x91, 0x22, 0x1c, 0x56, 0x32, 0x03, 0x5d, 0x21, 0x1c, 0x28, 0x31, 0x20, 0x68, 0xff, 0xf7, 0x58, 0xfa, 0x05, 0xb0, 0x30, 0xbd, 0xa0, 0x7e, 0x01, 0x00, 0xd5, 0x70, 0x00, 0x00, 0x1c, 0xb5, 0x07, 0x49, 0x3c, 0x00, 0x44, 0x70, 0x00, 0x00, 0x02, 0x1c, 0x01, 0x90, 0x00, 0x91, 0xc0, 0x69, 0x13, 0x1c, 0x84, 0x88, 0x01, 0x68, 0x10, 0x68, 0x48, 0x33, 0x22, 0x1c, 0xff, 0xf7, 0x08, 0xf9, 0x1c, 0xbd, 0x00, 0x00, 0xc9, 0x6f, 0x00, 0x00, 0x10, 0xb5, 0x14, 0x1c, 0x18, 0x48, 0x03, 0xf0, 0x89, 0xf8, 0xa0, 0x42, 0x01, 0xd0, 0xfa, 0xf7, 0x45, 0xf9, 0x04, 0x22, 0x20, 0x1c, 0x40, 0x30, 0xa1, 0x6a, 0xf9, 0xf7, 0x3c, 0x00, 0x80, 0x70, 0x00, 0x00, 0xbd, 0xf9, 0x00, 0x28, 0x02, 0xd1, 0x01, 0x20, 0x20, 0x62, 0x05, 0xe0, 0x00, 0x20, 0x20, 0x62, 0x84, 0x20, 0x00, 0x5d, 0x00, 0x28, 0x03, 0xd1, 0x20, 0x1c, 0x09, 0xf0, 0x23, 0xfb, 0x05, 0xe0, 0x20, 0x68, 0xfa, 0xf7, 0x79, 0xfa, 0x20, 0x1c, 0xfa, 0xf7, 0xa4, 0xfb, 0xe0, 0x69, 0x80, 0x79, 0x06, 0x28, 0x06, 0xd1, 0x20, 0x6a, 0x06, 0x49, 0x00, 0x28, 0x03, 0xd0, 0x3c, 0x00, 0xbc, 0x70, 0x00, 0x00, 0x08, 0x69, 0x01, 0x30, 0x08, 0x61, 0x10, 0xbd, 0x48, 0x69, 0x01, 0x30, 0x48, 0x61, 0x10, 0xbd, 0xa0, 0x6a, 0x01, 0x00, 0x28, 0x61, 0x01, 0x00, 0x1c, 0xb5, 0x14, 0x1c, 0x15, 0x48, 0x03, 0xf0, 0x51, 0xf8, 0xa0, 0x42, 0x01, 0xd0, 0xfa, 0xf7, 0x0d, 0xf9, 0x20, 0x1c, 0x4f, 0x30, 0x02, 0x79, 0x41, 0x79, 0x00, 0xab, 0x12, 0x02, 0x11, 0x43, 0xc2, 0x78, 0x12, 0x04, 0x3c, 0x00, 0xf8, 0x70, 0x00, 0x00, 0x11, 0x43, 0x82, 0x78, 0x12, 0x06, 0x11, 0x43, 0x00, 0x91, 0x01, 0x78, 0x40, 0x78, 0x09, 0x02, 0x08, 0x43, 0x98, 0x80, 0x20, 0x1c, 0x69, 0x46, 0x06, 0xf0, 0x3c, 0xf9, 0x00, 0x28, 0x03, 0xd1, 0x20, 0x1c, 0x09, 0xf0, 0xe3, 0xfa, 0x1c, 0xbd, 0x20, 0x68, 0xfa, 0xf7, 0x39, 0xfa, 0x20, 0x1c, 0xfa, 0xf7, 0x64, 0xfb, 0xf7, 0xe7, 0x00, 0x00, 0xa0, 0x6a, 0x01, 0x00, 0x3c, 0x00, 0x34, 0x71, 0x00, 0x00, 0xbc, 0xb5, 0x1f, 0x4d, 0x14, 0x1c, 0x28, 0x1c, 0xdc, 0x30, 0x03, 0xf0, 0x1f, 0xf8, 0xa0, 0x42, 0x01, 0xd0, 0xfa, 0xf7, 0xdb, 0xf8, 0xa0, 0x6c, 0x00, 0xab, 0x02, 0x78, 0x81, 0x78, 0x12, 0x02, 0x11, 0x43, 0x02, 0x79, 0x12, 0x04, 0x11, 0x43, 0x42, 0x79, 0x12, 0x06, 0x11, 0x43, 0x00, 0x91, 0x81, 0x79, 0xc0, 0x79, 0x00, 0x02, 0x08, 0x43, 0x98, 0x80, 0x20, 0x1c, 0x3c, 0x00, 0x70, 0x71, 0x00, 0x00, 0x69, 0x46, 0x06, 0xf0, 0x0b, 0xf9, 0x00, 0x28, 0x17, 0xd0, 0x01, 0x28, 0x0e, 0xd1, 0xed, 0x6c, 0x00, 0x2d, 0x0b, 0xd0, 0x80, 0x20, 0x02, 0x5d, 0xe0, 0x6c, 0x01, 0x21, 0x00, 0x28, 0x00, 0xd1, 0x00, 0x21, 0x60, 0x68, 0x6b, 0x46, 0x0a, 0x30, 0xf9, 0xf7, 0x23, 0xf9, 0x20, 0x68, 0xfa, 0xf7, 0xfb, 0xf9, 0x20, 0x1c, 0xfa, 0xf7, 0x26, 0xfb, 0xbc, 0xbd, 0x20, 0x1c, 0x3c, 0x00, 0xac, 0x71, 0x00, 0x00, 0x00, 0xf0, 0x8e, 0xfe, 0xfa, 0xe7, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0xbc, 0xb5, 0x04, 0x1c, 0x40, 0x6a, 0x00, 0x25, 0x00, 0x28, 0x03, 0xd0, 0x60, 0x68, 0x00, 0x8b, 0x05, 0x07, 0x2d, 0x0f, 0x22, 0x1c, 0x40, 0x32, 0x08, 0x21, 0x20, 0x68, 0xfa, 0xf7, 0x7e, 0xfa, 0xa1, 0x68, 0x01, 0x95, 0x00, 0x91, 0x21, 0x1c, 0x22, 0x1c, 0x60, 0x32, 0x20, 0x68, 0x50, 0x31, 0x3c, 0x00, 0xe8, 0x71, 0x00, 0x00, 0x0d, 0x1c, 0xe3, 0x68, 0x09, 0xf0, 0xe2, 0xff, 0xe0, 0x69, 0x80, 0x6b, 0x00, 0x28, 0x03, 0xd1, 0xfe, 0xf7, 0xe8, 0xfa, 0x00, 0x28, 0x01, 0xd0, 0x18, 0x20, 0x00, 0xe0, 0x10, 0x20, 0x06, 0x49, 0x01, 0x94, 0x00, 0x91, 0xe1, 0x69, 0x08, 0x23, 0x09, 0x68, 0x0a, 0x18, 0x21, 0x1c, 0x28, 0x31, 0x28, 0x1c, 0xff, 0xf7, 0x87, 0xf9, 0xbc, 0xbd, 0x35, 0x71, 0x00, 0x00, 0x3c, 0x00, 0x24, 0x72, 0x00, 0x00, 0x10, 0xb5, 0x10, 0x1c, 0x38, 0x30, 0x90, 0x62, 0x04, 0x20, 0x10, 0x86, 0x00, 0x20, 0x50, 0x63, 0x10, 0x68, 0x14, 0x1c, 0x40, 0x32, 0x04, 0x21, 0xfa, 0xf7, 0x4a, 0xfa, 0x23, 0x1c, 0x21, 0x1c, 0x28, 0x31, 0x02, 0x4a, 0x20, 0x68, 0xff, 0xf7, 0xbd, 0xf8, 0x10, 0xbd, 0x65, 0x70, 0x00, 0x00, 0x0e, 0xb5, 0xc3, 0x69, 0x02, 0x1c, 0x98, 0x88, 0x05, 0x49, 0x02, 0x92, 0x3c, 0x00, 0x60, 0x72, 0x00, 0x00, 0x01, 0x91, 0x00, 0x90, 0x1b, 0x68, 0x10, 0x68, 0x91, 0x69, 0x03, 0x22, 0xff, 0xf7, 0xae, 0xf9, 0x0e, 0xbd, 0x00, 0x00, 0x25, 0x72, 0x00, 0x00, 0x0e, 0xb5, 0x02, 0x1c, 0x06, 0x49, 0x10, 0x20, 0x00, 0x90, 0x02, 0x92, 0x13, 0x1c, 0x01, 0x91, 0x10, 0x68, 0x00, 0x22, 0x70, 0x33, 0x00, 0x21, 0xff, 0xf7, 0x9c, 0xf9, 0x0e, 0xbd, 0x00, 0x00, 0x25, 0x72, 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x72, 0x00, 0x00, 0x10, 0xb5, 0x03, 0x1c, 0x00, 0x21, 0x00, 0x20, 0x08, 0x4c, 0x00, 0xe0, 0x01, 0x31, 0xca, 0x00, 0xa2, 0x58, 0x9a, 0x42, 0x02, 0xd0, 0x0b, 0x29, 0xf8, 0xd3, 0x10, 0xbd, 0x0b, 0x29, 0xfc, 0xd2, 0xc9, 0x00, 0x09, 0x19, 0x00, 0x20, 0x08, 0x71, 0x01, 0x20, 0x10, 0xbd, 0x38, 0x58, 0x01, 0x00, 0x8c, 0xb5, 0x00, 0xab, 0x86, 0x21, 0x19, 0x80, 0x01, 0x1c, 0x04, 0x48, 0x3c, 0x00, 0xd8, 0x72, 0x00, 0x00, 0x06, 0xf0, 0xee, 0xfe, 0x01, 0x90, 0x68, 0x46, 0x06, 0xf0, 0xfa, 0xf8, 0x8c, 0xbd, 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x0d, 0x48, 0x0d, 0x49, 0x94, 0xb0, 0x04, 0x80, 0x06, 0x22, 0x18, 0x31, 0x0c, 0x30, 0xf9, 0xf7, 0xfb, 0xf8, 0x01, 0xa8, 0x07, 0xf0, 0xa2, 0xf8, 0x0c, 0x20, 0x09, 0xa9, 0x48, 0x72, 0x00, 0xab, 0x1c, 0x80, 0x02, 0x21, 0x3c, 0x00, 0x14, 0x73, 0x00, 0x00, 0x68, 0x46, 0x03, 0xf0, 0xdb, 0xff, 0x04, 0x90, 0x01, 0xa8, 0x06, 0xf0, 0xd1, 0xf8, 0x14, 0xb0, 0x10, 0xbd, 0x00, 0x00, 0x58, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x04, 0xf0, 0x45, 0xfe, 0x05, 0xf0, 0x53, 0xfa, 0x80, 0xbd, 0x10, 0xb5, 0x19, 0x4c, 0xe0, 0x68, 0x00, 0x28, 0x06, 0xd0, 0x61, 0x1c, 0x08, 0x78, 0x00, 0x28, 0x03, 0xd1, 0x48, 0x78, 0xff, 0x30, 0x08, 0x70, 0x3c, 0x00, 0x50, 0x73, 0x00, 0x00, 0x10, 0xbd, 0xff, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x08, 0x70, 0xa1, 0x68, 0x00, 0x29, 0xf7, 0xd0, 0x00, 0x28, 0xf5, 0xd1, 0x0e, 0x48, 0x54, 0x30, 0x81, 0x78, 0x00, 0x29, 0x03, 0xd1, 0xc1, 0x78, 0xff, 0x31, 0x81, 0x70, 0x10, 0xbd, 0xff, 0x31, 0x09, 0x06, 0x09, 0x0e, 0x81, 0x70, 0xf9, 0xd1, 0xa1, 0x69, 0x00, 0x29, 0xf6, 0xd0, 0x80, 0x88, 0x03, 0xf0, 0xd0, 0xfb, 0x3c, 0x00, 0x8c, 0x73, 0x00, 0x00, 0x04, 0x4a, 0x01, 0x1c, 0x5c, 0x32, 0x0c, 0x32, 0x05, 0xca, 0x80, 0x1a, 0xa2, 0x69, 0xf9, 0xf7, 0x1f, 0xf8, 0x10, 0xbd, 0x44, 0x7d, 0x01, 0x00, 0xf0, 0xb5, 0x04, 0x1c, 0x40, 0x68, 0x00, 0x25, 0x01, 0x79, 0x00, 0x22, 0x85, 0xb0, 0xc9, 0x07, 0xcb, 0x17, 0x69, 0x49, 0x01, 0x33, 0x89, 0x6a, 0x10, 0x29, 0x05, 0xd3, 0x66, 0x49, 0xc0, 0x39, 0x08, 0x6b, 0x01, 0x30, 0x3c, 0x00, 0xc8, 0x73, 0x00, 0x00, 0x08, 0x63, 0x8e, 0xe0, 0x21, 0x68, 0x0e, 0x68, 0xf6, 0x78, 0xb7, 0x06, 0xff, 0x0f, 0xb6, 0x09, 0x00, 0x2b, 0x04, 0x97, 0x06, 0xd0, 0x63, 0x69, 0x1f, 0x1c, 0x1b, 0x6a, 0x50, 0x37, 0x9f, 0x42, 0x00, 0xd1, 0x01, 0x25, 0x00, 0x2d, 0x02, 0xd0, 0x63, 0x69, 0x1b, 0x6a, 0x04, 0xe0, 0x3c, 0x23, 0x59, 0x4f, 0x73, 0x43, 0xdb, 0x19, 0x04, 0x33, 0xe3, 0x61, 0x9f, 0x88, 0x3c, 0x00, 0x04, 0x74, 0x00, 0x00, 0x00, 0x2f, 0x70, 0xd0, 0x9b, 0x79, 0x02, 0x2b, 0x6e, 0xd0, 0x04, 0x2b, 0x17, 0xd0, 0x06, 0x2b, 0x69, 0xd1, 0x08, 0x68, 0xa0, 0x61, 0x08, 0x89, 0x04, 0x38, 0x08, 0x81, 0x20, 0x68, 0x01, 0x68, 0x04, 0x31, 0x01, 0x60, 0x4e, 0x49, 0x00, 0x29, 0x5d, 0xd0, 0x04, 0x9f, 0xba, 0x42, 0x5a, 0xd1, 0x49, 0x48, 0x22, 0x1c, 0x1c, 0x30, 0x02, 0xf0, 0x65, 0xfe, 0x05, 0xb0, 0x3c, 0x00, 0x40, 0x74, 0x00, 0x00, 0xf0, 0xbd, 0x09, 0x68, 0x25, 0x1c, 0xca, 0x79, 0x40, 0x35, 0x26, 0x1c, 0xea, 0x73, 0x8b, 0x79, 0x22, 0x1c, 0x50, 0x32, 0x13, 0x70, 0x4b, 0x79, 0x60, 0x36, 0x53, 0x70, 0x0b, 0x79, 0x93, 0x70, 0x4b, 0x78, 0xd3, 0x70, 0x09, 0x78, 0x11, 0x71, 0x00, 0x21, 0x29, 0x72, 0x16, 0x21, 0xb1, 0x73, 0x61, 0x6a, 0x00, 0x29, 0x06, 0xd0, 0x01, 0x8b, 0x09, 0x07, 0x09, 0x0f, 0x3c, 0x00, 0x7c, 0x74, 0x00, 0x00, 0x29, 0x72, 0xb1, 0x81, 0x18, 0x21, 0xb1, 0x73, 0x01, 0x1c, 0x0a, 0x31, 0x20, 0x1c, 0x06, 0x22, 0x49, 0x30, 0xf9, 0xf7, 0x33, 0xf8, 0x60, 0x68, 0x14, 0x22, 0x01, 0x88, 0xe9, 0x82, 0x01, 0x1d, 0x20, 0x1c, 0x58, 0x30, 0xf9, 0xf7, 0x2a, 0xf8, 0xe8, 0x8a, 0x30, 0x49, 0x08, 0x40, 0x01, 0x21, 0x89, 0x03, 0x08, 0x43, 0xe8, 0x82, 0x70, 0x89, 0x0f, 0x21, 0x08, 0x40, 0x3c, 0x00, 0xb8, 0x74, 0x00, 0x00, 0x70, 0x81, 0x20, 0x68, 0x01, 0x89, 0x08, 0x39, 0x01, 0x81, 0x20, 0x68, 0x01, 0x68, 0x08, 0x31, 0x01, 0x60, 0x08, 0x21, 0x00, 0x20, 0xfa, 0xf7, 0x83, 0xf8, 0x05, 0x1c, 0x02, 0x68, 0x20, 0x68, 0x08, 0x21, 0xfa, 0xf7, 0xfb, 0xf8, 0x20, 0x68, 0xfa, 0xf7, 0x74, 0xf8, 0x21, 0x49, 0xc5, 0x60, 0x2f, 0xe0, 0x30, 0xe0, 0xff, 0xe7, 0x21, 0x68, 0x60, 0x68, 0x0a, 0x68, 0x3c, 0x00, 0xf4, 0x74, 0x00, 0x00, 0x80, 0x23, 0xa2, 0x64, 0x1e, 0x55, 0xe5, 0x64, 0x55, 0x79, 0x13, 0x79, 0x2d, 0x02, 0x5b, 0x19, 0x95, 0x79, 0x2d, 0x04, 0x5b, 0x19, 0xd5, 0x79, 0x2d, 0x06, 0x5b, 0x19, 0x95, 0x78, 0x12, 0x78, 0x12, 0x02, 0xaa, 0x18, 0x15, 0x04, 0x0a, 0x89, 0x2d, 0x0c, 0x08, 0x3a, 0x0a, 0x81, 0x21, 0x68, 0x0a, 0x68, 0x08, 0x32, 0x0a, 0x60, 0xe1, 0x69, 0x02, 0x1c, 0x0a, 0x32, 0x3c, 0x00, 0x30, 0x75, 0x00, 0x00, 0x01, 0xa8, 0x09, 0x68, 0x0b, 0xf0, 0x3e, 0xf9, 0xe0, 0x69, 0x2b, 0x1c, 0x01, 0x68, 0x20, 0x1c, 0x70, 0x30, 0x01, 0xaa, 0x0b, 0xf0, 0x86, 0xf9, 0x09, 0x49, 0x01, 0x22, 0x6d, 0xe7, 0x20, 0x68, 0xfa, 0xf7, 0x22, 0xf8, 0x20, 0x1c, 0xfa, 0xf7, 0x4d, 0xf9, 0x70, 0xe7, 0x84, 0x6a, 0x01, 0x00, 0x68, 0x61, 0x01, 0x00, 0x55, 0x72, 0x00, 0x00, 0x8f, 0xc7, 0xff, 0xff, 0x3c, 0x00, 0x6c, 0x75, 0x00, 0x00, 0x41, 0x70, 0x00, 0x00, 0x79, 0x72, 0x00, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x82, 0x20, 0xf9, 0xf7, 0x93, 0xfe, 0x80, 0xbd, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0xc0, 0x68, 0xf9, 0xf7, 0xfa, 0xff, 0x01, 0x20, 0x80, 0xbd, 0x3c, 0x00, 0xa8, 0x75, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x21, 0xff, 0x20, 0xf9, 0xf7, 0x79, 0xfe, 0x80, 0xbd, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x01, 0x20, 0x70, 0x47, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x06, 0x21, 0x99, 0x20, 0xf9, 0xf7, 0x65, 0xfe, 0x80, 0xbd, 0xb0, 0xb5, 0x00, 0x25, 0x01, 0x29, 0x12, 0x4c, 0x3c, 0x00, 0xe4, 0x75, 0x00, 0x00, 0x0f, 0xd1, 0x0a, 0xf0, 0x0f, 0xfc, 0x00, 0x28, 0x1d, 0xd0, 0x61, 0x78, 0x3c, 0x23, 0x59, 0x43, 0x09, 0x19, 0x04, 0x31, 0x01, 0x62, 0x61, 0x1c, 0x41, 0x62, 0x84, 0x62, 0x04, 0x1c, 0x50, 0x34, 0x06, 0xe0, 0x00, 0x29, 0x0f, 0xd1, 0x3c, 0x20, 0x50, 0x43, 0x25, 0x70, 0x04, 0x19, 0x04, 0x34, 0x00, 0x2c, 0x08, 0xd0, 0x20, 0x68, 0x00, 0x28, 0x02, 0xd0, 0x20, 0x21, 0x3c, 0x00, 0x20, 0x76, 0x00, 0x00, 0xf8, 0xf7, 0x18, 0xff, 0xa5, 0x80, 0x07, 0x20, 0xa0, 0x71, 0xb0, 0xbd, 0x68, 0x61, 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x00, 0x21, 0x01, 0xf0, 0x41, 0xfc, 0x60, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x21, 0x68, 0x01, 0x60, 0x20, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x61, 0x68, 0x41, 0x60, 0x12, 0x4e, 0x70, 0x68, 0xa0, 0x42, 0x01, 0xd1, 0x60, 0x68, 0x70, 0x60, 0xe0, 0x68, 0x3c, 0x00, 0x5c, 0x76, 0x00, 0x00, 0x00, 0x28, 0x0b, 0xd0, 0x00, 0x25, 0x06, 0xe0, 0xe0, 0x68, 0xe9, 0x00, 0x41, 0x18, 0x14, 0x20, 0x0b, 0xf0, 0xe2, 0xff, 0x01, 0x35, 0x30, 0x88, 0x85, 0x42, 0xf5, 0xdb, 0x06, 0x21, 0x20, 0x1c, 0x44, 0x30, 0xf8, 0xf7, 0xe9, 0xfe, 0x20, 0x6b, 0x00, 0x28, 0x01, 0xd0, 0xf9, 0xf7, 0x86, 0xff, 0xe0, 0x69, 0x00, 0x28, 0x01, 0xd0, 0xfa, 0xf7, 0xaf, 0xf8, 0x70, 0xbd, 0x3c, 0x00, 0x98, 0x76, 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, 0xf0, 0xb5, 0x1d, 0x4f, 0x05, 0x9d, 0x3f, 0x68, 0x01, 0x26, 0x1c, 0x1c, 0x33, 0x1c, 0x00, 0x2f, 0x00, 0xd0, 0x2b, 0x1c, 0x1d, 0x06, 0x2d, 0x0e, 0x00, 0x29, 0x06, 0xd0, 0x11, 0x78, 0x0e, 0x23, 0x16, 0x4f, 0x09, 0x18, 0x09, 0x7a, 0x6b, 0x43, 0x10, 0xe0, 0x21, 0x78, 0x00, 0x29, 0x13, 0xd0, 0xff, 0x31, 0x0d, 0xe0, 0x01, 0x29, 0x01, 0xd9, 0x3c, 0x00, 0xd4, 0x76, 0x00, 0x00, 0x01, 0x31, 0x11, 0x70, 0x11, 0x78, 0x0e, 0x23, 0x0f, 0x4f, 0x49, 0x08, 0x11, 0x70, 0x09, 0x18, 0x09, 0x7a, 0x6b, 0x43, 0xdb, 0x19, 0x59, 0x5c, 0x21, 0x70, 0x21, 0x78, 0x00, 0x29, 0x02, 0xd1, 0x11, 0x78, 0x00, 0x29, 0xea, 0xd1, 0x09, 0x48, 0xc0, 0x68, 0x00, 0x28, 0x05, 0xd0, 0x21, 0x78, 0x30, 0x1c, 0x00, 0x29, 0x00, 0xd1, 0x00, 0x20, 0xf0, 0xbd, 0x01, 0x20, 0x3c, 0x00, 0x10, 0x77, 0x00, 0x00, 0xf0, 0xbd, 0x00, 0x00, 0x18, 0x67, 0x01, 0x00, 0x24, 0x67, 0x01, 0x00, 0x5c, 0x67, 0x01, 0x00, 0xac, 0x7c, 0x01, 0x00, 0x84, 0x46, 0x00, 0x20, 0xf0, 0xb5, 0x00, 0x29, 0x09, 0xd0, 0x11, 0x78, 0x1a, 0x4e, 0xb1, 0x70, 0x19, 0x4e, 0xb1, 0x78, 0x71, 0x70, 0x31, 0x70, 0x01, 0x21, 0x31, 0x61, 0x27, 0xe0, 0x16, 0x4e, 0x01, 0x23, 0xf1, 0x56, 0x63, 0x46, 0x5f, 0x68, 0x3c, 0x00, 0x4c, 0x77, 0x00, 0x00, 0x00, 0x23, 0xf6, 0x56, 0x01, 0x25, 0xcc, 0x0f, 0xb7, 0x42, 0x00, 0xd9, 0x00, 0x25, 0x00, 0x2c, 0x01, 0xd0, 0x00, 0x2d, 0xe8, 0xd1, 0x0e, 0x4f, 0x3b, 0x69, 0x00, 0x2b, 0x03, 0xd0, 0x00, 0x2d, 0x01, 0xd1, 0x16, 0x70, 0x02, 0xe0, 0x1c, 0x43, 0x01, 0xd1, 0x11, 0x70, 0x01, 0x20, 0x01, 0x24, 0x00, 0x2b, 0x00, 0xd0, 0x00, 0x24, 0x3c, 0x61, 0x00, 0x2c, 0x02, 0xd0, 0x3c, 0x00, 0x88, 0x77, 0x00, 0x00, 0x71, 0x1c, 0x39, 0x70, 0x01, 0xe0, 0xff, 0x31, 0x79, 0x70, 0x00, 0x28, 0xd5, 0xd0, 0x01, 0x20, 0xf0, 0xbd, 0x00, 0x00, 0xac, 0x7c, 0x01, 0x00, 0x90, 0xb5, 0x0a, 0x4c, 0x00, 0x20, 0x93, 0xb0, 0x20, 0x61, 0x03, 0x90, 0x68, 0x46, 0x00, 0x21, 0x08, 0xf0, 0x84, 0xfd, 0x20, 0x7a, 0x02, 0x28, 0x01, 0xd1, 0xe0, 0x6b, 0x00, 0xe0, 0x20, 0x6c, 0xe0, 0x61, 0x01, 0x20, 0x3c, 0x00, 0xc4, 0x77, 0x00, 0x00, 0x08, 0xf0, 0x8a, 0xfd, 0x13, 0xb0, 0x90, 0xbd, 0xf4, 0x6e, 0x01, 0x00, 0xf7, 0xb5, 0x05, 0x1c, 0x88, 0x88, 0x0c, 0x1c, 0x82, 0xb0, 0x1f, 0x4f, 0x00, 0x28, 0x00, 0xd1, 0x00, 0x27, 0x04, 0x98, 0x00, 0x28, 0x01, 0xd1, 0xf9, 0xf7, 0x8a, 0xfd, 0x1b, 0x48, 0x3b, 0x1c, 0x00, 0x68, 0x21, 0x1c, 0x02, 0x68, 0x28, 0x1c, 0x00, 0x92, 0x04, 0x9a, 0xfe, 0xf7, 0x3c, 0xf8, 0x3c, 0x00, 0x00, 0x78, 0x00, 0x00, 0x06, 0x1c, 0x22, 0xd0, 0x03, 0x21, 0x04, 0x98, 0x02, 0xf0, 0xb8, 0xff, 0x00, 0x28, 0x1b, 0xd0, 0x80, 0x78, 0x01, 0x21, 0x03, 0xf0, 0xe4, 0xff, 0xa0, 0x88, 0xa1, 0x8e, 0x48, 0x43, 0x00, 0x04, 0x0f, 0x49, 0x00, 0x0c, 0x08, 0x80, 0x03, 0xf0, 0x81, 0xf9, 0x01, 0x22, 0x00, 0x2d, 0x00, 0xd1, 0x00, 0x22, 0x01, 0x1c, 0x0e, 0x20, 0x0b, 0xf0, 0xc9, 0xfe, 0x00, 0x2f, 0x3c, 0x00, 0x3c, 0x78, 0x00, 0x00, 0x08, 0xd1, 0x00, 0x21, 0x28, 0x1c, 0x02, 0xf0, 0xbd, 0xfc, 0x03, 0xe0, 0x00, 0x26, 0x28, 0x1c, 0x00, 0xf0, 0x0a, 0xf8, 0x30, 0x1c, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xc1, 0xa1, 0x00, 0x00, 0xe4, 0x65, 0x01, 0x00, 0xa8, 0x7c, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0xfe, 0xf7, 0x38, 0xf8, 0x01, 0x21, 0x00, 0x2c, 0x00, 0xd1, 0x00, 0x21, 0x0e, 0x20, 0x0b, 0xf0, 0x3c, 0x00, 0x78, 0x78, 0x00, 0x00, 0xdd, 0xfe, 0x10, 0xbd, 0xf8, 0xb5, 0x07, 0x1c, 0x0b, 0xf0, 0x94, 0xfa, 0xfd, 0xf7, 0xbc, 0xfe, 0x00, 0x26, 0x02, 0x28, 0x1e, 0x4d, 0x01, 0xd0, 0x2e, 0x70, 0xf8, 0xbd, 0xfd, 0xf7, 0x3e, 0xf8, 0x04, 0x1c, 0xf9, 0xf7, 0x59, 0xfc, 0x00, 0x28, 0x14, 0xd0, 0xfd, 0xf7, 0x77, 0xf8, 0x00, 0x28, 0x10, 0xd0, 0x02, 0xf0, 0xf9, 0xfb, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x24, 0x3c, 0x00, 0xb4, 0x78, 0x00, 0x00, 0x00, 0xe0, 0x15, 0x4c, 0x33, 0x1c, 0x21, 0x1c, 0x07, 0x22, 0x16, 0x20, 0x0b, 0xf0, 0x66, 0xff, 0x68, 0x78, 0x80, 0x21, 0x08, 0x43, 0x68, 0x70, 0x02, 0xf0, 0x0a, 0xfc, 0x00, 0x28, 0xde, 0xd1, 0x28, 0x78, 0x80, 0x07, 0xdb, 0xd4, 0xfd, 0xf7, 0x23, 0xf9, 0x00, 0x28, 0x05, 0xd1, 0x28, 0x78, 0xc0, 0x07, 0x02, 0xd5, 0xfd, 0xf7, 0x42, 0xf8, 0xd1, 0xe7, 0x02, 0xf0, 0x3c, 0x00, 0xf0, 0x78, 0x00, 0x00, 0xcd, 0xfb, 0x00, 0x28, 0xcd, 0xd0, 0x28, 0x78, 0x02, 0x21, 0x08, 0x43, 0x28, 0x70, 0x21, 0x1c, 0x38, 0x1c, 0xfd, 0xf7, 0xc1, 0xf8, 0xc4, 0xe7, 0x60, 0x6c, 0x01, 0x00, 0x71, 0x02, 0x00, 0x00, 0x10, 0xb5, 0x12, 0x4c, 0x01, 0x20, 0x20, 0x70, 0xfe, 0xf7, 0xf0, 0xf9, 0x01, 0x21, 0xa0, 0x68, 0xfb, 0xf7, 0xf4, 0xfe, 0xa0, 0x68, 0x03, 0xf0, 0x87, 0xff, 0x0d, 0x48, 0x3c, 0x00, 0x2c, 0x79, 0x00, 0x00, 0xa1, 0x68, 0x07, 0xf0, 0x23, 0xfd, 0xfb, 0xf7, 0x55, 0xff, 0xe0, 0x68, 0x00, 0x28, 0x0d, 0xd0, 0x09, 0x49, 0x06, 0x20, 0x0a, 0xf0, 0x24, 0xfd, 0x08, 0x49, 0x05, 0x20, 0x0a, 0xf0, 0x20, 0xfd, 0xfb, 0xf7, 0x6e, 0xff, 0x00, 0x28, 0x01, 0xd0, 0x05, 0xf0, 0xf8, 0xfc, 0x10, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0xe1, 0x35, 0x00, 0x00, 0x3c, 0x00, 0x68, 0x79, 0x00, 0x00, 0xb1, 0x35, 0x00, 0x00, 0xf0, 0xb5, 0x24, 0x4d, 0x23, 0x4c, 0x68, 0x7c, 0x20, 0x3c, 0x9b, 0xb0, 0x00, 0x28, 0x08, 0xd0, 0x02, 0x28, 0x03, 0xd8, 0x20, 0x89, 0x01, 0x38, 0x20, 0x81, 0x37, 0xe0, 0x00, 0x27, 0x6f, 0x74, 0x34, 0xe0, 0x1c, 0x4e, 0x68, 0x22, 0x14, 0x36, 0x31, 0x1c, 0x0c, 0x31, 0x01, 0xa8, 0xf8, 0xf7, 0x09, 0xfe, 0x18, 0x48, 0x33, 0x89, 0x01, 0x21, 0x3c, 0x00, 0xa4, 0x79, 0x00, 0x00, 0x44, 0x30, 0x0a, 0x1c, 0x00, 0x2b, 0x00, 0x7b, 0x00, 0xd1, 0x02, 0x1c, 0x12, 0x06, 0x12, 0x0e, 0x0d, 0xaf, 0x3a, 0x70, 0x94, 0x46, 0xaa, 0x7b, 0x93, 0x19, 0x30, 0x33, 0x5b, 0x7b, 0x7b, 0x70, 0xea, 0x73, 0x01, 0x32, 0x12, 0x06, 0x12, 0x0e, 0x00, 0x27, 0x82, 0x42, 0xaa, 0x73, 0x01, 0xd3, 0xaf, 0x73, 0x04, 0xe0, 0x62, 0x46, 0x01, 0x2a, 0x01, 0xd1, 0x77, 0x60, 0x3c, 0x00, 0xe0, 0x79, 0x00, 0x00, 0x00, 0xe0, 0x71, 0x60, 0x06, 0x48, 0x07, 0x4a, 0x80, 0x38, 0x81, 0x67, 0x42, 0x67, 0x68, 0x22, 0x01, 0xa9, 0xf8, 0xf7, 0xdd, 0xfd, 0x27, 0x81, 0x08, 0xf0, 0x12, 0xfd, 0x1b, 0xb0, 0xf0, 0xbd, 0x84, 0x66, 0x01, 0x00, 0xe9, 0x2e, 0x00, 0x00, 0xf1, 0xb5, 0x86, 0xb0, 0x06, 0x99, 0x00, 0x20, 0x88, 0x61, 0x06, 0x98, 0x84, 0x68, 0x80, 0x8d, 0x65, 0x68, 0x01, 0x28, 0x3c, 0x00, 0x1c, 0x7a, 0x00, 0x00, 0x4c, 0xd9, 0x35, 0x49, 0x49, 0x68, 0x05, 0x91, 0x00, 0x29, 0x47, 0xd0, 0x00, 0x22, 0x00, 0x21, 0x00, 0x23, 0x03, 0x90, 0x28, 0x1c, 0x96, 0x46, 0x94, 0x46, 0x06, 0x68, 0x04, 0x96, 0xf2, 0x78, 0x80, 0x26, 0xb2, 0x43, 0x3f, 0x2a, 0x2e, 0xd8, 0xd7, 0x06, 0xff, 0x0e, 0x01, 0x26, 0xbe, 0x40, 0x37, 0x1c, 0x04, 0x9e, 0x52, 0x09, 0xb6, 0x78, 0x76, 0x00, 0xb2, 0x18, 0x3c, 0x00, 0x58, 0x7a, 0x00, 0x00, 0x26, 0x4e, 0x92, 0x00, 0x1c, 0x36, 0xb2, 0x58, 0x3a, 0x40, 0x1e, 0xd0, 0x03, 0xe0, 0x02, 0x90, 0x02, 0x89, 0xc0, 0x68, 0x51, 0x18, 0x00, 0x28, 0xf9, 0xd1, 0x05, 0x98, 0x81, 0x42, 0x14, 0xd8, 0x70, 0x46, 0x01, 0x30, 0x86, 0x46, 0x00, 0x2b, 0x04, 0xd0, 0x60, 0x46, 0xd8, 0x60, 0x01, 0x98, 0x62, 0x46, 0xd0, 0x60, 0x03, 0x98, 0x01, 0x38, 0x03, 0x90, 0x06, 0xd0, 0x3c, 0x00, 0x94, 0x7a, 0x00, 0x00, 0x23, 0x1c, 0x24, 0x68, 0x60, 0x68, 0x02, 0x9a, 0x01, 0x90, 0x94, 0x46, 0xc9, 0xe7, 0x70, 0x46, 0x01, 0x28, 0x07, 0xd9, 0x2a, 0x1c, 0x00, 0x21, 0x3f, 0x20, 0x01, 0xf0, 0x51, 0xff, 0x05, 0x1c, 0x06, 0x98, 0x85, 0x61, 0x28, 0x1c, 0x01, 0xf0, 0xb3, 0xff, 0x0e, 0x48, 0x00, 0x68, 0x00, 0x28, 0x07, 0xd0, 0x28, 0x68, 0x01, 0x88, 0x40, 0x79, 0x02, 0x31, 0x09, 0x1a, 0x3c, 0x00, 0xd0, 0x7a, 0x00, 0x00, 0x28, 0x1c, 0x01, 0xf0, 0xe5, 0xfc, 0xa2, 0x68, 0x06, 0x98, 0xc0, 0x68, 0x06, 0x99, 0x0b, 0x69, 0x29, 0x1c, 0xf8, 0xf7, 0x7c, 0xfc, 0x03, 0x49, 0x08, 0x69, 0x01, 0x30, 0x08, 0x61, 0x07, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xfc, 0x5a, 0x01, 0x00, 0xcc, 0x5c, 0x01, 0x00, 0x10, 0xb5, 0x09, 0x4a, 0x80, 0x00, 0x12, 0x58, 0xd0, 0x06, 0xc0, 0x0e, 0x01, 0x30, 0x07, 0x4b, 0x3c, 0x00, 0x0c, 0x7b, 0x00, 0x00, 0x1c, 0x68, 0x00, 0x2c, 0xfc, 0xdb, 0x5a, 0x60, 0x20, 0x22, 0x12, 0x1a, 0x91, 0x40, 0x19, 0x60, 0x19, 0x68, 0x00, 0x29, 0xfc, 0xdb, 0x10, 0xbd, 0xe8, 0x60, 0x01, 0x00, 0x30, 0x20, 0x07, 0x00, 0xb0, 0xb5, 0x12, 0x4c, 0x00, 0x25, 0x25, 0x70, 0xa1, 0x68, 0x11, 0x48, 0x07, 0xf0, 0x32, 0xfc, 0x65, 0x61, 0xfb, 0xf7, 0xa3, 0xfe, 0xe0, 0x68, 0x00, 0x28, 0x0d, 0xd0, 0x3c, 0x00, 0x48, 0x7b, 0x00, 0x00, 0xfb, 0xf7, 0xa4, 0xfe, 0x01, 0x21, 0x07, 0x20, 0x0b, 0xf0, 0x70, 0xfd, 0x0a, 0x49, 0x06, 0x20, 0x0a, 0xf0, 0x4c, 0xfc, 0x09, 0x49, 0x05, 0x20, 0x0a, 0xf0, 0x48, 0xfc, 0xa0, 0x68, 0x03, 0xf0, 0x67, 0xfe, 0x00, 0x21, 0xa0, 0x68, 0xfb, 0xf7, 0xcd, 0xfd, 0x05, 0xf0, 0xab, 0xfb, 0xb0, 0xbd, 0x78, 0x69, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0xe1, 0x35, 0x00, 0x00, 0x3c, 0x00, 0x84, 0x7b, 0x00, 0x00, 0xb1, 0x35, 0x00, 0x00, 0x10, 0xb5, 0x0f, 0x4c, 0x20, 0x7c, 0x00, 0x28, 0x19, 0xd1, 0x60, 0x69, 0x00, 0x28, 0x16, 0xd1, 0xe0, 0x68, 0x00, 0x28, 0x06, 0xd0, 0x0a, 0x48, 0x1c, 0x38, 0xc0, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x05, 0xf0, 0xce, 0xfb, 0x01, 0x21, 0x07, 0x20, 0x0b, 0xf0, 0x40, 0xfd, 0xa0, 0x68, 0x03, 0xf0, 0x3f, 0xfe, 0x04, 0x48, 0xa1, 0x68, 0x07, 0xf0, 0x3c, 0x00, 0xc0, 0x7b, 0x00, 0x00, 0xdb, 0xfb, 0x01, 0x20, 0x20, 0x70, 0x10, 0xbd, 0x78, 0x69, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x70, 0xb5, 0x0e, 0x4c, 0x01, 0x22, 0xa3, 0x68, 0xe5, 0x68, 0x26, 0x8a, 0x5d, 0x1b, 0xb5, 0x42, 0x01, 0xd1, 0x00, 0x22, 0x06, 0xe0, 0x25, 0x68, 0x01, 0x33, 0x2e, 0x68, 0xa3, 0x60, 0x26, 0x60, 0x04, 0x35, 0x03, 0xc5, 0x00, 0x2a, 0x04, 0xd1, 0x01, 0x21, 0x9d, 0x20, 0x3c, 0x00, 0xfc, 0x7b, 0x00, 0x00, 0xf9, 0xf7, 0x52, 0xfb, 0x70, 0xbd, 0x03, 0x49, 0x02, 0x20, 0x08, 0x60, 0x70, 0xbd, 0x00, 0x00, 0x44, 0xe3, 0x01, 0x00, 0x40, 0x20, 0x07, 0x00, 0x80, 0xb5, 0x02, 0xf0, 0xb9, 0xf8, 0x80, 0xbd, 0x80, 0xb5, 0x02, 0x21, 0x2d, 0x20, 0xf9, 0xf7, 0x3f, 0xfb, 0x00, 0x20, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x2a, 0x20, 0xf9, 0xf7, 0x37, 0xfb, 0x00, 0x20, 0x3c, 0x00, 0x38, 0x7c, 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x21, 0x2b, 0x20, 0xf9, 0xf7, 0x2f, 0xfb, 0x02, 0x20, 0x80, 0xbd, 0x00, 0x00, 0x01, 0x49, 0x01, 0x20, 0x08, 0x61, 0x70, 0x47, 0x7c, 0x78, 0x01, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x0c, 0x23, 0x0f, 0x1c, 0x17, 0x49, 0x58, 0x43, 0x45, 0x18, 0x6c, 0x68, 0x30, 0x1c, 0x0b, 0xf0, 0x3f, 0xfe, 0x00, 0x2f, 0x09, 0xd1, 0x30, 0x1c, 0x3c, 0x00, 0x74, 0x7c, 0x00, 0x00, 0x03, 0xf0, 0xee, 0xfe, 0x41, 0x20, 0x07, 0x55, 0x11, 0x48, 0x21, 0x1c, 0xff, 0xf7, 0xa6, 0xff, 0xf8, 0xbd, 0x41, 0x20, 0x07, 0x55, 0xa0, 0x6b, 0x00, 0x28, 0x03, 0xd0, 0x20, 0x1c, 0x00, 0xf0, 0xdf, 0xf9, 0xf5, 0xe7, 0x20, 0x1c, 0x00, 0xf0, 0xdb, 0xf9, 0xac, 0x68, 0x00, 0x2c, 0x02, 0xd0, 0x00, 0x20, 0xa8, 0x60, 0xed, 0xe7, 0x30, 0x1c, 0x05, 0xf0, 0x34, 0xf9, 0x3c, 0x00, 0xb0, 0x7c, 0x00, 0x00, 0x04, 0x1c, 0xe8, 0xd1, 0x08, 0x21, 0x0c, 0x20, 0xf9, 0xf7, 0xf4, 0xfa, 0xe3, 0xe7, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0x55, 0x80, 0x00, 0x00, 0x07, 0x4a, 0x80, 0xb5, 0x50, 0x70, 0x51, 0x60, 0x12, 0x78, 0x06, 0x4b, 0x80, 0x00, 0x52, 0x01, 0xd2, 0x18, 0x10, 0x18, 0x40, 0x38, 0x02, 0x68, 0x08, 0x1c, 0xf8, 0xf7, 0x7b, 0xfb, 0x80, 0xbd, 0x78, 0x69, 0x01, 0x00, 0x3c, 0x00, 0xec, 0x7c, 0x00, 0x00, 0xfc, 0x42, 0x01, 0x00, 0xb0, 0xb5, 0x0a, 0x49, 0x04, 0x1c, 0xc8, 0x70, 0x08, 0x4d, 0xe4, 0x35, 0xa8, 0x7a, 0x08, 0x71, 0x08, 0x2c, 0x01, 0xd3, 0xf9, 0xf7, 0xfc, 0xfa, 0xa8, 0x7a, 0x05, 0x49, 0x40, 0x01, 0x40, 0x18, 0xa1, 0x00, 0x40, 0x58, 0xf8, 0xf7, 0x60, 0xfb, 0xb0, 0xbd, 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, 0x80, 0x43, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x28, 0x3c, 0x00, 0x28, 0x7d, 0x00, 0x00, 0x01, 0xd0, 0x09, 0xf0, 0x1d, 0xf9, 0x80, 0xbd, 0xb0, 0xb5, 0x05, 0x1c, 0x0c, 0x1c, 0x00, 0x20, 0x08, 0x60, 0x68, 0x68, 0x09, 0xf0, 0x36, 0xfb, 0x6c, 0x60, 0xb0, 0xbd, 0x10, 0xb5, 0x04, 0x1c, 0x09, 0xf0, 0x34, 0xfb, 0x21, 0x68, 0x00, 0x29, 0x00, 0xd1, 0x64, 0x60, 0x10, 0xbd, 0x00, 0x00, 0x00, 0x21, 0x01, 0x60, 0x40, 0x60, 0x70, 0x47, 0xf8, 0xb5, 0x46, 0x68, 0x3c, 0x00, 0x64, 0x7d, 0x00, 0x00, 0x04, 0x1c, 0x40, 0x6a, 0x35, 0x1c, 0x0a, 0x35, 0x00, 0x28, 0x04, 0xd0, 0x20, 0x1c, 0xf9, 0xf7, 0x89, 0xfd, 0x07, 0x1c, 0x00, 0xe0, 0x04, 0x27, 0x29, 0x1c, 0x60, 0x69, 0x00, 0xf0, 0xf6, 0xfc, 0x79, 0x00, 0x0f, 0x18, 0xba, 0x88, 0xf1, 0x8a, 0x05, 0x1c, 0x8a, 0x42, 0x05, 0xd1, 0x30, 0x88, 0x00, 0x05, 0x02, 0xd5, 0x04, 0xf0, 0xbe, 0xfb, 0x3c, 0xe0, 0x28, 0x68, 0x3c, 0x00, 0xa0, 0x7d, 0x00, 0x00, 0x00, 0x28, 0x0f, 0xd0, 0x01, 0x32, 0x8a, 0x42, 0x04, 0xd1, 0xf9, 0xf7, 0x0f, 0xfc, 0x21, 0x68, 0xc1, 0x60, 0x0b, 0xe0, 0xf9, 0xf7, 0xf0, 0xfb, 0xf0, 0x8a, 0x00, 0x07, 0x04, 0xd0, 0x00, 0x21, 0x29, 0x60, 0x29, 0xe0, 0x08, 0x07, 0x27, 0xd1, 0x20, 0x68, 0x28, 0x60, 0xf0, 0x8a, 0xb8, 0x80, 0x13, 0x48, 0x01, 0x68, 0x01, 0x31, 0x01, 0x60, 0x31, 0x88, 0x49, 0x05, 0x3c, 0x00, 0xdc, 0x7d, 0x00, 0x00, 0x18, 0xd4, 0x29, 0x68, 0x21, 0x60, 0x00, 0x21, 0x29, 0x60, 0xe1, 0x69, 0x00, 0x29, 0x0d, 0xd0, 0x89, 0x79, 0x02, 0x29, 0x0a, 0xd1, 0x08, 0x21, 0x21, 0x86, 0x21, 0x1c, 0x38, 0x31, 0xa1, 0x62, 0x22, 0x1c, 0xdc, 0x30, 0x08, 0x49, 0x02, 0xf0, 0x81, 0xf9, 0xf8, 0xbd, 0x20, 0x1c, 0x00, 0xf0, 0x5f, 0xf8, 0xfa, 0xe7, 0x20, 0x1c, 0xf9, 0xf7, 0xef, 0xfc, 0xf6, 0xe7, 0x3c, 0x00, 0x18, 0x7e, 0x00, 0x00, 0x20, 0x68, 0xf9, 0xf7, 0xbd, 0xfb, 0xf7, 0xe7, 0xc4, 0x69, 0x01, 0x00, 0xb9, 0x71, 0x00, 0x00, 0xf8, 0xb5, 0x0f, 0x1c, 0x09, 0x78, 0x01, 0x24, 0xc9, 0x07, 0x21, 0xd5, 0x02, 0xf0, 0x8c, 0xff, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x24, 0x1b, 0xe0, 0x0e, 0x4e, 0x75, 0x6e, 0x00, 0x2d, 0x17, 0xd0, 0x34, 0x6e, 0x06, 0x22, 0x31, 0x1c, 0x38, 0x1c, 0xf8, 0xf7, 0xd4, 0xfa, 0x3c, 0x00, 0x54, 0x7e, 0x00, 0x00, 0x00, 0x28, 0x05, 0xd1, 0x01, 0x20, 0x00, 0x2c, 0x00, 0xd0, 0x00, 0x20, 0x04, 0x1c, 0x03, 0xe0, 0x01, 0x3d, 0x06, 0x36, 0x00, 0x2d, 0xee, 0xd1, 0x00, 0x2c, 0x03, 0xd1, 0x02, 0x4e, 0xb0, 0x6e, 0x01, 0x30, 0xb0, 0x66, 0x20, 0x1c, 0xf8, 0xbd, 0x10, 0x79, 0x01, 0x00, 0x30, 0xb5, 0x05, 0x1c, 0x00, 0x20, 0x06, 0x49, 0x00, 0x22, 0x1c, 0x23, 0xcc, 0x56, 0xac, 0x42, 0x3c, 0x00, 0x90, 0x7e, 0x00, 0x00, 0x01, 0xd1, 0x08, 0x1c, 0x30, 0xbd, 0x01, 0x32, 0x48, 0x31, 0x01, 0x2a, 0xf5, 0xd3, 0x30, 0xbd, 0xcc, 0x6d, 0x01, 0x00, 0x10, 0xb5, 0x08, 0x4c, 0x00, 0x22, 0x1c, 0x23, 0x53, 0x43, 0xe3, 0x58, 0x83, 0x42, 0x04, 0xd1, 0x1c, 0x20, 0x50, 0x43, 0x00, 0x19, 0x0a, 0x60, 0x10, 0xbd, 0x01, 0x32, 0x0e, 0x2a, 0xf2, 0xd3, 0x00, 0x20, 0x10, 0xbd, 0xdc, 0x71, 0x01, 0x00, 0x3c, 0x00, 0xcc, 0x7e, 0x00, 0x00, 0xf0, 0xb5, 0x41, 0x68, 0x95, 0xb0, 0x07, 0x1c, 0x90, 0x37, 0x13, 0x91, 0x04, 0x1c, 0xf8, 0x78, 0x25, 0x1c, 0x80, 0x35, 0xc6, 0x07, 0x28, 0x79, 0xf6, 0x0f, 0x4a, 0x49, 0x02, 0x28, 0x4d, 0xd1, 0x0a, 0x6d, 0x00, 0x2a, 0x4a, 0xd0, 0x48, 0x68, 0x01, 0x30, 0x48, 0x60, 0x0a, 0xf0, 0x58, 0xff, 0x44, 0x49, 0x08, 0x61, 0x48, 0x61, 0x13, 0x99, 0x09, 0x79, 0xc9, 0x07, 0x3c, 0x00, 0x08, 0x7f, 0x00, 0x00, 0x01, 0xd4, 0x41, 0x49, 0x88, 0x61, 0x20, 0x68, 0x06, 0x22, 0x06, 0x90, 0xa1, 0x68, 0x03, 0xa8, 0xf8, 0xf7, 0xee, 0xfa, 0x06, 0x22, 0x04, 0xa8, 0x02, 0x30, 0xe1, 0x68, 0xf8, 0xf7, 0xe8, 0xfa, 0x07, 0xa8, 0x06, 0x22, 0x21, 0x69, 0xf8, 0xf7, 0xe3, 0xfa, 0xb8, 0x78, 0x08, 0xab, 0x00, 0x21, 0x98, 0x70, 0x0c, 0x96, 0x63, 0x6a, 0x20, 0x1c, 0xa0, 0x30, 0x0a, 0x1c, 0x3c, 0x00, 0x44, 0x7f, 0x00, 0x00, 0x00, 0x2b, 0x02, 0xd0, 0x02, 0x8a, 0x52, 0x07, 0x52, 0x0f, 0x08, 0xab, 0xda, 0x70, 0x00, 0xab, 0x99, 0x84, 0x13, 0x99, 0x09, 0x88, 0xc9, 0x0b, 0xd9, 0x84, 0x69, 0x6b, 0x10, 0xab, 0x10, 0x91, 0xa9, 0x6b, 0x11, 0x91, 0x80, 0x8b, 0x29, 0x49, 0x18, 0x81, 0x09, 0x6d, 0x03, 0xa8, 0xf8, 0xf7, 0x32, 0xfa, 0x29, 0x79, 0x68, 0x6b, 0x0b, 0xf0, 0x4d, 0xfd, 0x29, 0x79, 0x3c, 0x00, 0x80, 0x7f, 0x00, 0x00, 0xa8, 0x6b, 0x0b, 0xf0, 0x67, 0xfd, 0x3d, 0xe0, 0x00, 0x28, 0x38, 0xd1, 0x48, 0x6d, 0x14, 0x90, 0x00, 0x28, 0x34, 0xd0, 0x20, 0x68, 0x06, 0x22, 0x03, 0x90, 0xa1, 0x68, 0x68, 0x46, 0xf8, 0xf7, 0xab, 0xfa, 0x06, 0x22, 0x68, 0x46, 0x80, 0x18, 0xe1, 0x68, 0xf8, 0xf7, 0xa5, 0xfa, 0x05, 0xa8, 0x06, 0x22, 0x21, 0x69, 0xf8, 0xf7, 0xa0, 0xfa, 0x00, 0x21, 0x04, 0x91, 0x3c, 0x00, 0xbc, 0x7f, 0x00, 0x00, 0xb9, 0x78, 0x08, 0xa8, 0x10, 0xab, 0x01, 0x72, 0x08, 0x96, 0xe9, 0x68, 0x0b, 0x91, 0x69, 0x79, 0x41, 0x72, 0x68, 0x6b, 0x0e, 0x90, 0xa8, 0x6b, 0x10, 0x90, 0x28, 0x8d, 0xd8, 0x80, 0x68, 0x8d, 0x18, 0x81, 0xe1, 0x69, 0x0c, 0xa8, 0x00, 0x29, 0x04, 0xd0, 0x89, 0x79, 0x01, 0x70, 0x20, 0x6a, 0x0d, 0x90, 0x01, 0xe0, 0x07, 0x21, 0x01, 0x70, 0x68, 0x46, 0x14, 0x99, 0x3c, 0x00, 0xf8, 0x7f, 0x00, 0x00, 0xf8, 0xf7, 0xef, 0xf9, 0x02, 0xe0, 0x20, 0x68, 0xf9, 0xf7, 0xca, 0xfa, 0x20, 0x1c, 0xf9, 0xf7, 0xf5, 0xfb, 0x15, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0x06, 0x22, 0x01, 0x89, 0x0c, 0x31, 0x01, 0x81, 0x05, 0x68, 0x21, 0x1c, 0x0c, 0x3d, 0x05, 0x60, 0xa8, 0x18, 0xf8, 0xf7, 0x64, 0xfa, 0x06, 0x22, 0xa1, 0x18, 0x3c, 0x00, 0x34, 0x80, 0x00, 0x00, 0x28, 0x1c, 0xf8, 0xf7, 0x5f, 0xfa, 0xa0, 0x8f, 0x00, 0x09, 0xe0, 0x62, 0x20, 0x63, 0x03, 0x48, 0x01, 0x69, 0x20, 0x1c, 0xf8, 0xf7, 0xc7, 0xf9, 0xb0, 0xbd, 0x00, 0x00, 0x7c, 0x79, 0x01, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x60, 0x36, 0x05, 0x1c, 0x70, 0x7a, 0x0c, 0x23, 0x25, 0x49, 0x58, 0x43, 0x44, 0x18, 0xa8, 0x6b, 0x00, 0x27, 0x00, 0x28, 0x06, 0xd0, 0xa0, 0x78, 0x3c, 0x00, 0x70, 0x80, 0x00, 0x00, 0x01, 0x28, 0x03, 0xd1, 0xa7, 0x70, 0x70, 0x7a, 0x0a, 0xf0, 0xb6, 0xfd, 0x2a, 0x1c, 0x0c, 0x21, 0x80, 0x20, 0x0b, 0xf0, 0x95, 0xfb, 0xa8, 0x6b, 0x00, 0x28, 0x33, 0xd0, 0xa0, 0x78, 0x02, 0x28, 0x0b, 0xd0, 0x04, 0x28, 0x22, 0xd1, 0xa7, 0x70, 0x2f, 0x1c, 0x40, 0x37, 0x78, 0x78, 0x02, 0x28, 0x0c, 0xd1, 0x70, 0x7a, 0x0a, 0xf0, 0xa0, 0xfd, 0x18, 0xe0, 0x03, 0x20, 0x3c, 0x00, 0xac, 0x80, 0x00, 0x00, 0xa0, 0x70, 0x12, 0x49, 0x00, 0x20, 0x14, 0x39, 0x09, 0x69, 0xf8, 0xf7, 0x90, 0xf9, 0x0f, 0xe0, 0x2c, 0x1c, 0x07, 0xe0, 0x78, 0x78, 0x41, 0x21, 0x22, 0x1c, 0x08, 0x55, 0x0c, 0x21, 0x80, 0x20, 0x0b, 0xf0, 0x70, 0xfb, 0x60, 0x34, 0x60, 0x7a, 0x04, 0xf0, 0x20, 0xff, 0x04, 0x1c, 0xf1, 0xd1, 0x70, 0x7a, 0x40, 0x35, 0xa9, 0x8b, 0x00, 0x02, 0x09, 0x09, 0x09, 0x04, 0x3c, 0x00, 0xe8, 0x80, 0x00, 0x00, 0x08, 0x43, 0x81, 0x21, 0x01, 0x43, 0x0c, 0x20, 0x0b, 0xf0, 0xa0, 0xfa, 0xf8, 0xbd, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0xf8, 0xb5, 0x1c, 0x49, 0x05, 0x1c, 0x88, 0x6a, 0x01, 0x30, 0x88, 0x62, 0x28, 0x1c, 0x0b, 0xf0, 0x7d, 0xfd, 0x04, 0x1c, 0x11, 0xd0, 0x2b, 0x1c, 0x20, 0x33, 0x1e, 0x1c, 0x5a, 0x79, 0x20, 0x1c, 0xb4, 0x30, 0x19, 0x79, 0x14, 0x4f, 0xfd, 0xf7, 0x3c, 0x00, 0x24, 0x81, 0x00, 0x00, 0x89, 0xf8, 0xaa, 0x7a, 0x20, 0x1c, 0xb8, 0x30, 0xb1, 0x79, 0xfd, 0xf7, 0xb9, 0xf8, 0x00, 0x2f, 0x04, 0xd1, 0x01, 0x21, 0x28, 0x68, 0xfa, 0xf7, 0x6d, 0xfa, 0xf8, 0xbd, 0x60, 0x68, 0xbc, 0x21, 0xc0, 0x8a, 0x08, 0x53, 0x28, 0x68, 0x00, 0x21, 0xfa, 0xf7, 0x64, 0xfa, 0x00, 0x28, 0x09, 0xd0, 0x06, 0x49, 0xc8, 0x6a, 0x01, 0x30, 0xc8, 0x62, 0x00, 0x2c, 0xee, 0xd0, 0x3c, 0x00, 0x60, 0x81, 0x00, 0x00, 0x20, 0x1c, 0xf9, 0xf7, 0x47, 0xfb, 0xea, 0xe7, 0x20, 0x1c, 0xf8, 0xf7, 0x3c, 0xf9, 0xe6, 0xe7, 0xc4, 0x69, 0x01, 0x00, 0xa1, 0xff, 0x00, 0x00, 0xf8, 0xb5, 0x16, 0x4c, 0x05, 0x1f, 0x00, 0x22, 0x21, 0x1c, 0xa0, 0x31, 0x03, 0xe0, 0x28, 0x68, 0xa0, 0x42, 0x09, 0xd0, 0x20, 0x34, 0xa1, 0x42, 0xf9, 0xd1, 0x00, 0x2a, 0x04, 0xd1, 0x02, 0x21, 0x8e, 0x20, 0xf9, 0xf7, 0x3c, 0x00, 0x9c, 0x81, 0x00, 0x00, 0x83, 0xf8, 0xf8, 0xbd, 0x0d, 0x4f, 0xbe, 0x79, 0x60, 0x69, 0x01, 0x30, 0x60, 0x61, 0xf8, 0xf7, 0x97, 0xfd, 0xa8, 0x42, 0x07, 0xd1, 0xa0, 0x88, 0x04, 0x30, 0xf8, 0xf7, 0x97, 0xfd, 0xe0, 0x69, 0x01, 0x30, 0xe0, 0x61, 0x05, 0xe0, 0x20, 0x68, 0x28, 0x60, 0x25, 0x60, 0xa0, 0x69, 0x01, 0x30, 0xa0, 0x61, 0xbe, 0x71, 0xe5, 0xe7, 0x00, 0x00, 0xd0, 0x5c, 0x01, 0x00, 0x3c, 0x00, 0xd8, 0x81, 0x00, 0x00, 0x20, 0x10, 0x07, 0x00, 0x00, 0x29, 0x01, 0xdb, 0x06, 0x29, 0x01, 0xdb, 0x02, 0x20, 0x70, 0x47, 0x06, 0x4b, 0xc9, 0x00, 0x5a, 0x5c, 0xc9, 0x18, 0x02, 0x70, 0x4a, 0x78, 0x42, 0x70, 0x8a, 0x78, 0x82, 0x70, 0x49, 0x68, 0x41, 0x60, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0xcc, 0x5a, 0x01, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x05, 0x28, 0x01, 0xd3, 0xf9, 0xf7, 0x3c, 0x00, 0x14, 0x82, 0x00, 0x00, 0x75, 0xf8, 0x10, 0x48, 0x40, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x03, 0x24, 0x10, 0x2d, 0x00, 0xd3, 0x0f, 0x25, 0x06, 0x20, 0x0b, 0x49, 0x60, 0x43, 0x12, 0x31, 0x40, 0x18, 0x41, 0x78, 0x80, 0x78, 0x49, 0x19, 0x09, 0x06, 0x09, 0x0e, 0x88, 0x42, 0x00, 0xd2, 0x01, 0x1c, 0x01, 0x20, 0x88, 0x40, 0x05, 0x49, 0x01, 0x38, 0x09, 0x68, 0x08, 0x40, 0x00, 0x04, 0x00, 0x0c, 0x3c, 0x00, 0x50, 0x82, 0x00, 0x00, 0x02, 0xf0, 0x44, 0xfe, 0xb0, 0xbd, 0x00, 0x00, 0xd4, 0x7a, 0x01, 0x00, 0x08, 0x20, 0x07, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, 0x09, 0xf0, 0xcf, 0xfd, 0x00, 0x28, 0x03, 0xd1, 0x20, 0x1c, 0x09, 0xf0, 0x82, 0xfd, 0x05, 0x61, 0xb0, 0xbd, 0x80, 0xb5, 0x0a, 0xf0, 0x97, 0xfd, 0x03, 0x4a, 0x0c, 0x32, 0x06, 0xca, 0x89, 0x18, 0x08, 0x1a, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x8c, 0x82, 0x00, 0x00, 0xa0, 0x7d, 0x01, 0x00, 0x70, 0xb5, 0x0b, 0x4c, 0x04, 0x9e, 0x64, 0x68, 0x0d, 0xe0, 0x65, 0x68, 0x85, 0x42, 0x09, 0xd1, 0x20, 0x7a, 0x08, 0x70, 0xe0, 0x68, 0x10, 0x60, 0x20, 0x69, 0x18, 0x60, 0x20, 0x7d, 0x30, 0x80, 0x01, 0x20, 0x70, 0xbd, 0x24, 0x68, 0x00, 0x2c, 0xef, 0xd1, 0x00, 0x20, 0x70, 0xbd, 0x00, 0x00, 0xa4, 0x6e, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x3c, 0x00, 0xc8, 0x82, 0x00, 0x00, 0x20, 0x30, 0x81, 0x7b, 0x20, 0x69, 0x04, 0x30, 0xfd, 0xf7, 0x64, 0xf9, 0x01, 0x1c, 0x62, 0x20, 0x02, 0x5b, 0x63, 0x6a, 0x40, 0x34, 0x20, 0x78, 0x02, 0xf0, 0xce, 0xfd, 0x10, 0xbd, 0x00, 0x00, 0x0b, 0x49, 0x10, 0xb5, 0x08, 0x88, 0x8a, 0x69, 0x0a, 0x23, 0x50, 0x43, 0x58, 0x43, 0x0e, 0xd0, 0x08, 0x4a, 0x53, 0x89, 0x94, 0x88, 0xd2, 0x88, 0x1b, 0x19, 0x52, 0x04, 0x3c, 0x00, 0x04, 0x83, 0x00, 0x00, 0x52, 0x0c, 0x9a, 0x18, 0xc9, 0x68, 0x06, 0x32, 0x4a, 0x43, 0x0a, 0x21, 0x51, 0x43, 0xf8, 0xf7, 0xfd, 0xf9, 0x10, 0xbd, 0xc8, 0x74, 0x01, 0x00, 0x30, 0x00, 0x07, 0x00, 0x10, 0xb5, 0x43, 0x1c, 0x01, 0xd1, 0x10, 0x48, 0x10, 0xbd, 0x0f, 0x4a, 0x0e, 0x4b, 0x94, 0x3a, 0x12, 0x68, 0x44, 0x3b, 0x1b, 0x7a, 0x10, 0xe0, 0x54, 0x68, 0x84, 0x42, 0x0c, 0xd1, 0x00, 0x29, 0x3c, 0x00, 0x40, 0x83, 0x00, 0x00, 0x0f, 0xd1, 0x02, 0x2b, 0x03, 0xd1, 0xd4, 0x7b, 0x02, 0x2c, 0x0a, 0xd2, 0x04, 0xe0, 0x00, 0x2b, 0x05, 0xd1, 0xd4, 0x7b, 0xe4, 0x07, 0x04, 0xd4, 0x12, 0x68, 0x00, 0x2a, 0xec, 0xd1, 0x00, 0x20, 0x10, 0xbd, 0x10, 0x1c, 0x10, 0xbd, 0x00, 0x00, 0x38, 0x6f, 0x01, 0x00, 0x01, 0x1c, 0x01, 0x20, 0x01, 0x29, 0x00, 0xd0, 0x00, 0x20, 0x70, 0x47, 0x00, 0xb5, 0x02, 0x1c, 0x3c, 0x00, 0x7c, 0x83, 0x00, 0x00, 0xfd, 0xf7, 0xce, 0xf8, 0x00, 0x28, 0x08, 0xd0, 0x10, 0x1c, 0xff, 0xf7, 0xf1, 0xff, 0x18, 0x23, 0x03, 0x49, 0x58, 0x43, 0x40, 0x18, 0x00, 0x69, 0x00, 0xbd, 0x00, 0x20, 0x00, 0xbd, 0x00, 0x00, 0x94, 0x67, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x28, 0x00, 0xd1, 0x08, 0x48, 0x07, 0x49, 0x00, 0x68, 0x50, 0x31, 0x09, 0x7a, 0x00, 0x29, 0x02, 0xd0, 0x02, 0x29, 0x04, 0xd1, 0x3c, 0x00, 0xb8, 0x83, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x21, 0x00, 0xf0, 0x06, 0xf8, 0x80, 0xbd, 0x00, 0x20, 0x80, 0xbd, 0x00, 0x00, 0xa4, 0x6e, 0x01, 0x00, 0x12, 0x4a, 0x12, 0x4b, 0x12, 0x7a, 0x2c, 0x3b, 0x00, 0x2a, 0x03, 0xd1, 0x5a, 0x68, 0x00, 0x2a, 0x18, 0xd1, 0x04, 0xe0, 0x02, 0x2a, 0x02, 0xd1, 0x9a, 0x68, 0x00, 0x2a, 0x12, 0xd1, 0x00, 0x20, 0x70, 0x47, 0xc2, 0x7b, 0x8a, 0x42, 0x01, 0xd0, 0x3c, 0x00, 0xf4, 0x83, 0x00, 0x00, 0x03, 0x2a, 0x0a, 0xd1, 0x82, 0x7e, 0x01, 0x2a, 0x07, 0xd1, 0x02, 0x7f, 0x01, 0x32, 0x12, 0x06, 0x12, 0x0e, 0x02, 0x77, 0xc3, 0x7e, 0x9a, 0x42, 0xee, 0xd2, 0x00, 0x68, 0x00, 0x28, 0xec, 0xd1, 0x70, 0x47, 0x00, 0x00, 0xf4, 0x6e, 0x01, 0x00, 0xf7, 0xb5, 0x84, 0x46, 0x00, 0x20, 0x01, 0x27, 0x00, 0x24, 0x00, 0x25, 0x88, 0xb0, 0x07, 0xe0, 0x62, 0x46, 0x52, 0x5d, 0x3c, 0x00, 0x30, 0x84, 0x00, 0x00, 0x00, 0x2a, 0x05, 0xd0, 0xab, 0x00, 0x6e, 0x46, 0xf2, 0x50, 0x01, 0x35, 0x8d, 0x42, 0xf5, 0xd3, 0x00, 0x2d, 0x00, 0xd0, 0x01, 0x20, 0x00, 0x28, 0x28, 0xd0, 0x00, 0x27, 0x16, 0x4c, 0x6e, 0x46, 0x22, 0xe0, 0x20, 0x1c, 0x00, 0xf0, 0x30, 0xf8, 0x01, 0x28, 0x01, 0xd0, 0x07, 0x28, 0x06, 0xd1, 0x00, 0x21, 0x20, 0x1c, 0x00, 0xf0, 0x34, 0xf8, 0x31, 0x68, 0x88, 0x42, 0x3c, 0x00, 0x6c, 0x84, 0x00, 0x00, 0x01, 0xd2, 0x02, 0x27, 0x14, 0xe0, 0x20, 0x68, 0xc9, 0x00, 0x0c, 0x18, 0x08, 0x3c, 0x20, 0x1c, 0x00, 0xf0, 0x1c, 0xf8, 0x07, 0x28, 0x07, 0xd1, 0x01, 0x20, 0x01, 0x2d, 0x00, 0xd0, 0x00, 0x20, 0x24, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x08, 0x34, 0x01, 0x3d, 0x04, 0x36, 0x00, 0x2d, 0xda, 0xd1, 0x0a, 0x98, 0x04, 0x60, 0x0b, 0xb0, 0x38, 0x1c, 0xf0, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0x84, 0x00, 0x00, 0x20, 0x52, 0x01, 0x00, 0x00, 0x68, 0x00, 0x29, 0x01, 0xd0, 0x80, 0x02, 0x80, 0x0a, 0x70, 0x47, 0x10, 0xb5, 0x40, 0x68, 0x80, 0x00, 0x44, 0x0f, 0x08, 0x2c, 0x03, 0xd3, 0x02, 0x21, 0x87, 0x20, 0xf8, 0xf7, 0xec, 0xfe, 0x20, 0x1c, 0x10, 0xbd, 0x00, 0x29, 0x02, 0xd0, 0x00, 0x68, 0x80, 0x0d, 0x70, 0x47, 0x40, 0x68, 0x80, 0x05, 0x80, 0x0d, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0x84, 0x00, 0x00, 0x10, 0xb5, 0x40, 0x68, 0x40, 0x01, 0x44, 0x0f, 0x05, 0x2c, 0x03, 0xd3, 0x05, 0x21, 0x87, 0x20, 0xf8, 0xf7, 0xd6, 0xfe, 0x20, 0x1c, 0x10, 0xbd, 0xf8, 0xb5, 0x05, 0x1c, 0x88, 0x0a, 0x00, 0x90, 0x1c, 0x48, 0x8e, 0x05, 0xc0, 0x69, 0xb6, 0x0d, 0x17, 0x1c, 0x1c, 0x1c, 0x00, 0x28, 0x05, 0xd1, 0x18, 0x48, 0x81, 0x69, 0x8d, 0x42, 0x1d, 0xd0, 0x85, 0x61, 0x11, 0xe0, 0x3c, 0x00, 0x20, 0x85, 0x00, 0x00, 0xfd, 0xf7, 0xe8, 0xf8, 0x15, 0x49, 0x09, 0x78, 0x0e, 0x29, 0x07, 0xd1, 0x00, 0x28, 0x05, 0xd0, 0x11, 0x49, 0x50, 0x31, 0x06, 0x23, 0xc9, 0x56, 0xf9, 0xf7, 0x06, 0xfa, 0x0e, 0x49, 0x00, 0x20, 0xc8, 0x61, 0x8d, 0x61, 0x29, 0x1c, 0x20, 0x1c, 0xf8, 0xf7, 0xe2, 0xf8, 0x79, 0x43, 0x20, 0x1c, 0xf8, 0xf7, 0xde, 0xf8, 0x08, 0x48, 0x41, 0x61, 0x20, 0x1c, 0x00, 0x99, 0x3c, 0x00, 0x5c, 0x85, 0x00, 0x00, 0xf8, 0xf7, 0xd8, 0xf8, 0x05, 0x48, 0x40, 0x69, 0x0a, 0x18, 0xa2, 0x42, 0x01, 0xd2, 0x40, 0x18, 0x01, 0xe0, 0x40, 0x18, 0x00, 0x1b, 0x80, 0x02, 0x80, 0x19, 0xf8, 0xbd, 0xac, 0x7c, 0x01, 0x00, 0x11, 0x67, 0x01, 0x00, 0xf8, 0xb5, 0x0f, 0x1c, 0x06, 0x1c, 0x14, 0x1c, 0x1d, 0x1c, 0x07, 0xf0, 0xa1, 0xfc, 0x0e, 0x28, 0x09, 0xd1, 0x20, 0x1c, 0x02, 0xf0, 0xfc, 0xfb, 0x3c, 0x00, 0x98, 0x85, 0x00, 0x00, 0x00, 0x28, 0x04, 0xd0, 0x08, 0x48, 0x00, 0x78, 0x02, 0xf0, 0xe4, 0xfb, 0x04, 0x1c, 0x01, 0x21, 0x00, 0x2e, 0xac, 0x72, 0x00, 0xd0, 0x39, 0x1c, 0x20, 0x1c, 0x02, 0xf0, 0x07, 0xfc, 0x28, 0x60, 0x00, 0x20, 0x28, 0x72, 0x6c, 0x72, 0xf8, 0xbd, 0x90, 0x57, 0x01, 0x00, 0x03, 0x1c, 0x0a, 0x48, 0x10, 0xb5, 0x00, 0x24, 0x02, 0x1c, 0xa0, 0x32, 0x03, 0xe0, 0x81, 0x88, 0x3c, 0x00, 0xd4, 0x85, 0x00, 0x00, 0x99, 0x42, 0x09, 0xd2, 0x20, 0x30, 0x82, 0x42, 0xf9, 0xd1, 0x00, 0x2c, 0x04, 0xd1, 0x02, 0x21, 0x8e, 0x20, 0xf8, 0xf7, 0x5d, 0xfe, 0x00, 0x20, 0x10, 0xbd, 0x00, 0x00, 0xd0, 0x5c, 0x01, 0x00, 0xff, 0xb5, 0x06, 0x1c, 0x00, 0x20, 0x81, 0xb0, 0x10, 0x60, 0x1f, 0x1c, 0x01, 0x25, 0x14, 0x1c, 0x30, 0x1c, 0xff, 0xf7, 0x6d, 0xff, 0x05, 0x28, 0x12, 0xd2, 0x02, 0xa3, 0x3c, 0x00, 0x10, 0x86, 0x00, 0x00, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x08, 0x00, 0x39, 0x1c, 0x30, 0x1c, 0xff, 0xf7, 0x55, 0xff, 0x03, 0xe0, 0x02, 0x98, 0xf8, 0xf7, 0xeb, 0xf8, 0x01, 0x30, 0x20, 0x60, 0x04, 0xe0, 0x05, 0x21, 0x87, 0x20, 0xf8, 0xf7, 0x34, 0xfe, 0x00, 0x25, 0x20, 0x68, 0x80, 0x28, 0x04, 0xd9, 0x06, 0x21, 0x87, 0x20, 0xf8, 0xf7, 0x2c, 0xfe, 0x3c, 0x00, 0x4c, 0x86, 0x00, 0x00, 0x00, 0x25, 0x28, 0x1c, 0x05, 0xb0, 0xf0, 0xbd, 0x70, 0xb5, 0x17, 0x4c, 0x60, 0x6c, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x20, 0x1d, 0xe0, 0x16, 0x4e, 0x14, 0x4d, 0x31, 0x88, 0xa0, 0x6c, 0x00, 0x28, 0x08, 0xd0, 0x28, 0x78, 0x81, 0x42, 0x05, 0xd9, 0xf8, 0xf7, 0x4c, 0xf8, 0x01, 0x38, 0xfa, 0xf7, 0x51, 0xfe, 0x0e, 0xe0, 0xe0, 0x6c, 0x00, 0x28, 0x0a, 0xd0, 0x00, 0x20, 0x3c, 0x00, 0x88, 0x86, 0x00, 0x00, 0xfa, 0xf7, 0x4a, 0xfe, 0x29, 0x78, 0x32, 0x88, 0x91, 0x42, 0x04, 0xd9, 0x90, 0x42, 0x02, 0xd9, 0x10, 0x1c, 0x00, 0xe0, 0x08, 0x1c, 0xfa, 0xf7, 0xdf, 0xfd, 0xe1, 0x6b, 0x44, 0x1a, 0x0a, 0xf0, 0x81, 0xfb, 0x20, 0x1a, 0x00, 0xd5, 0x00, 0x20, 0x70, 0xbd, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0xf8, 0x60, 0x01, 0x00, 0xfc, 0x60, 0x01, 0x00, 0xff, 0xb5, 0x27, 0x4e, 0x3c, 0x00, 0xc4, 0x86, 0x00, 0x00, 0x04, 0x1c, 0xb0, 0x79, 0x0f, 0x1c, 0x15, 0x1c, 0x81, 0xb0, 0x00, 0x90, 0x0a, 0xf0, 0x6c, 0xfb, 0xc1, 0x19, 0x23, 0x48, 0x07, 0x68, 0x00, 0x2f, 0x05, 0xd1, 0x0a, 0x21, 0x80, 0x20, 0xf8, 0xf7, 0xdf, 0xfd, 0x05, 0xb0, 0xf0, 0xbd, 0x1e, 0x48, 0x40, 0x68, 0x84, 0x46, 0x00, 0x28, 0x01, 0xd1, 0x00, 0x22, 0x0e, 0xe0, 0x82, 0x68, 0x03, 0x68, 0xab, 0x42, 0x07, 0xd1, 0x3c, 0x00, 0x00, 0x87, 0x00, 0x00, 0x03, 0x79, 0xa3, 0x42, 0x04, 0xd1, 0x0b, 0x21, 0x80, 0x20, 0xf8, 0xf7, 0xcb, 0xfd, 0x23, 0xe0, 0xc0, 0x68, 0x00, 0x28, 0xf1, 0xd1, 0x13, 0x4b, 0xf8, 0x68, 0x18, 0x60, 0x3d, 0x60, 0x3c, 0x71, 0xb9, 0x60, 0x04, 0x98, 0x8d, 0x1a, 0x38, 0x61, 0x60, 0x46, 0x00, 0x23, 0x05, 0xe0, 0x84, 0x68, 0xa4, 0x1a, 0xac, 0x42, 0x03, 0xda, 0x03, 0x1c, 0xc0, 0x68, 0x00, 0x28, 0x3c, 0x00, 0x3c, 0x87, 0x00, 0x00, 0xf7, 0xd1, 0xf8, 0x60, 0x00, 0x2b, 0x08, 0xd1, 0x07, 0x48, 0x3b, 0x1c, 0x47, 0x60, 0x08, 0x48, 0x06, 0x4a, 0x00, 0x88, 0x0a, 0xf0, 0x8a, 0xfb, 0x00, 0xe0, 0xdf, 0x60, 0x00, 0x98, 0xb0, 0x71, 0xc3, 0xe7, 0x00, 0x00, 0x20, 0x10, 0x07, 0x00, 0x7c, 0x5d, 0x01, 0x00, 0x21, 0x38, 0x01, 0x00, 0x2c, 0x74, 0x01, 0x00, 0xf3, 0xb5, 0x83, 0xb0, 0x04, 0x1c, 0x09, 0xd0, 0x3c, 0x00, 0x78, 0x87, 0x00, 0x00, 0x20, 0x1c, 0x04, 0x99, 0x09, 0xf0, 0x8e, 0xfb, 0x00, 0x28, 0x03, 0xd0, 0x20, 0x1c, 0x30, 0x30, 0x05, 0xb0, 0xf0, 0xbd, 0x0a, 0xf0, 0x0e, 0xfb, 0x1e, 0x4a, 0x00, 0x26, 0x04, 0x9f, 0x01, 0x96, 0x00, 0x90, 0x02, 0x92, 0x02, 0x9c, 0x00, 0x25, 0x39, 0x1c, 0x20, 0x1c, 0x14, 0x30, 0x02, 0xf0, 0xc5, 0xfa, 0x00, 0x28, 0x01, 0xd0, 0x26, 0x1c, 0x03, 0xe0, 0x01, 0x35, 0x3c, 0x00, 0xb4, 0x87, 0x00, 0x00, 0x1c, 0x34, 0x04, 0x2d, 0xf2, 0xd3, 0x00, 0x2e, 0x22, 0xd1, 0x01, 0x98, 0x13, 0x4f, 0x01, 0x30, 0x01, 0x90, 0x02, 0x28, 0xe8, 0xd3, 0x01, 0x21, 0xc9, 0x06, 0x02, 0x9a, 0x00, 0x20, 0x13, 0x69, 0x00, 0x9c, 0xe3, 0x1a, 0x8b, 0x42, 0x01, 0xdd, 0x19, 0x1c, 0x16, 0x1c, 0x01, 0x30, 0x1c, 0x32, 0x04, 0x28, 0xf4, 0xd3, 0x30, 0x68, 0x00, 0x28, 0x01, 0xd0, 0xf8, 0xf7, 0x3c, 0x00, 0xf0, 0x87, 0x00, 0x00, 0xd3, 0xfe, 0x30, 0x1c, 0xfd, 0xf7, 0x4a, 0xff, 0x30, 0x1c, 0x14, 0x30, 0x06, 0x22, 0x04, 0x99, 0xf7, 0xf7, 0x7a, 0xfe, 0x00, 0x9c, 0x30, 0x1c, 0x34, 0x61, 0xbd, 0xe7, 0x30, 0x6a, 0x01, 0x00, 0x34, 0x42, 0x01, 0x00, 0x09, 0x49, 0x10, 0xb5, 0x4c, 0x69, 0x03, 0xe0, 0xe1, 0x68, 0x81, 0x42, 0x03, 0xd0, 0x24, 0x68, 0x00, 0x2c, 0xf9, 0xd1, 0x01, 0xe0, 0x00, 0x2c, 0x3c, 0x00, 0x2c, 0x88, 0x00, 0x00, 0x03, 0xd1, 0x02, 0x21, 0x02, 0x20, 0xf8, 0xf7, 0x37, 0xfd, 0x20, 0x1c, 0x10, 0xbd, 0x00, 0x00, 0xfc, 0x5a, 0x01, 0x00, 0x10, 0xb5, 0xc3, 0x07, 0x06, 0xd5, 0x08, 0x4b, 0x5c, 0x69, 0x0c, 0x43, 0x5c, 0x61, 0x1c, 0x7e, 0x14, 0x43, 0x1c, 0x76, 0x80, 0x07, 0x06, 0xd5, 0x04, 0x48, 0x43, 0x69, 0x19, 0x43, 0x41, 0x61, 0x01, 0x7e, 0x11, 0x43, 0x01, 0x76, 0x10, 0xbd, 0x3c, 0x00, 0x68, 0x88, 0x00, 0x00, 0xfc, 0x57, 0x01, 0x00, 0x18, 0x58, 0x01, 0x00, 0x70, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x16, 0x1c, 0x00, 0xf0, 0x08, 0xf8, 0xa0, 0x07, 0xc0, 0x17, 0x01, 0x30, 0x32, 0x1c, 0x29, 0x1c, 0x00, 0xf0, 0x21, 0xf8, 0x70, 0xbd, 0x10, 0xb5, 0xc3, 0x07, 0x06, 0xd5, 0x08, 0x4b, 0x5c, 0x69, 0x8c, 0x43, 0x5c, 0x61, 0x1c, 0x7e, 0x94, 0x43, 0x1c, 0x76, 0x80, 0x07, 0x06, 0xd5, 0x3c, 0x00, 0xa4, 0x88, 0x00, 0x00, 0x04, 0x48, 0x43, 0x69, 0x8b, 0x43, 0x43, 0x61, 0x01, 0x7e, 0x91, 0x43, 0x01, 0x76, 0x10, 0xbd, 0xfc, 0x57, 0x01, 0x00, 0x18, 0x58, 0x01, 0x00, 0x03, 0x22, 0x11, 0x1f, 0x80, 0xb5, 0x01, 0x20, 0x00, 0xf0, 0x02, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x30, 0xb5, 0x15, 0x1c, 0x0c, 0x1c, 0x00, 0x28, 0x87, 0xb0, 0x02, 0xd0, 0x1c, 0x22, 0x22, 0x49, 0x01, 0xe0, 0x22, 0x49, 0x3c, 0x00, 0xe0, 0x88, 0x00, 0x00, 0x1c, 0x22, 0x68, 0x46, 0xf7, 0xf7, 0x64, 0xfe, 0x05, 0x99, 0x00, 0xab, 0x1a, 0x7e, 0x8c, 0x43, 0x20, 0x1c, 0x95, 0x43, 0x02, 0x9a, 0x29, 0x1c, 0x02, 0x40, 0x02, 0x92, 0x01, 0x9a, 0x02, 0x40, 0x01, 0x92, 0x00, 0x9a, 0x02, 0x40, 0x00, 0x92, 0x03, 0x9a, 0x02, 0x40, 0x03, 0x92, 0x98, 0x7c, 0x08, 0x40, 0x98, 0x74, 0x58, 0x7c, 0x08, 0x40, 0x58, 0x74, 0x18, 0x7c, 0x3c, 0x00, 0x1c, 0x89, 0x00, 0x00, 0x08, 0x40, 0x18, 0x74, 0xd8, 0x7c, 0x08, 0x40, 0xd8, 0x74, 0x02, 0x99, 0x10, 0x48, 0x41, 0x61, 0x01, 0xaa, 0x06, 0xca, 0x91, 0x43, 0x81, 0x61, 0x81, 0x68, 0x01, 0x9a, 0x11, 0x43, 0x81, 0x60, 0x81, 0x68, 0x00, 0x9a, 0x91, 0x43, 0x81, 0x60, 0x00, 0xaa, 0x06, 0xca, 0x11, 0x43, 0x42, 0x68, 0x11, 0x43, 0x41, 0x60, 0x41, 0x68, 0x03, 0x9a, 0x91, 0x43, 0x41, 0x60, 0x3c, 0x00, 0x58, 0x89, 0x00, 0x00, 0x04, 0xa8, 0x0b, 0xf0, 0x01, 0xf8, 0x07, 0xb0, 0x30, 0xbd, 0x00, 0x00, 0xfc, 0x57, 0x01, 0x00, 0x18, 0x58, 0x01, 0x00, 0x10, 0x00, 0x07, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x01, 0x1c, 0x01, 0x20, 0x08, 0xf0, 0xe0, 0xf9, 0x00, 0x2c, 0x02, 0xd0, 0x03, 0xf0, 0x1c, 0xff, 0x10, 0xbd, 0xfe, 0xf7, 0xd1, 0xfc, 0x10, 0xbd, 0xf0, 0xb5, 0x0c, 0x1c, 0x01, 0x0e, 0x01, 0x23, 0x3c, 0x00, 0x94, 0x89, 0x00, 0x00, 0x1b, 0x06, 0x09, 0x06, 0x99, 0x42, 0x9f, 0xb0, 0x28, 0xd1, 0x17, 0x49, 0x08, 0x40, 0x00, 0x21, 0x1a, 0x28, 0x00, 0xd3, 0x02, 0x21, 0x00, 0x29, 0x19, 0xd1, 0xc5, 0x00, 0x13, 0x4f, 0x10, 0xa8, 0xee, 0x19, 0xb2, 0x88, 0x21, 0x68, 0xf7, 0xf7, 0x9d, 0xfd, 0x20, 0x1c, 0xf8, 0xf7, 0xea, 0xfd, 0x7a, 0x59, 0x01, 0xa9, 0x10, 0xa8, 0xf7, 0xf7, 0x07, 0xfd, 0x00, 0x28, 0x3c, 0x00, 0xd0, 0x89, 0x00, 0x00, 0x05, 0xd0, 0x10, 0x98, 0x01, 0xa9, 0x01, 0x90, 0xb0, 0x79, 0x00, 0xf0, 0x9d, 0xf8, 0x1f, 0xb0, 0xf0, 0xbd, 0x2a, 0x20, 0xf8, 0xf7, 0x5e, 0xfc, 0x20, 0x1c, 0xf8, 0xf7, 0xd5, 0xfd, 0xf6, 0xe7, 0x03, 0x21, 0x2a, 0x20, 0xf8, 0xf7, 0x56, 0xfc, 0xf1, 0xe7, 0x00, 0x00, 0x7f, 0xff, 0xff, 0x00, 0x24, 0x45, 0x01, 0x00, 0x10, 0xb5, 0x0c, 0x1c, 0x80, 0x28, 0x02, 0xd0, 0x3c, 0x00, 0x0c, 0x8a, 0x00, 0x00, 0x81, 0x28, 0x08, 0xd1, 0x03, 0xe0, 0x20, 0x1c, 0x00, 0xf0, 0x06, 0xf9, 0x10, 0xbd, 0x20, 0x1c, 0xf8, 0xf7, 0xbc, 0xfd, 0x10, 0xbd, 0x03, 0x21, 0x2c, 0x20, 0xf8, 0xf7, 0x3d, 0xfc, 0xf6, 0xe7, 0xf0, 0xb5, 0x0c, 0x1c, 0x00, 0x21, 0x8b, 0xb0, 0x0a, 0x91, 0x01, 0x0e, 0x01, 0x23, 0x1b, 0x06, 0x09, 0x06, 0x99, 0x42, 0x2a, 0xd1, 0x18, 0x49, 0x08, 0x40, 0x06, 0x1c, 0x3c, 0x00, 0x48, 0x8a, 0x00, 0x00, 0x06, 0x2e, 0x01, 0xd3, 0x07, 0x21, 0x24, 0xe0, 0x20, 0x89, 0xf8, 0xf7, 0xf1, 0xfe, 0x22, 0x89, 0x21, 0x68, 0x05, 0x1c, 0xf7, 0xf7, 0x4c, 0xfd, 0x20, 0x1c, 0xf8, 0xf7, 0x99, 0xfd, 0xf4, 0x00, 0x0f, 0x4e, 0x28, 0x1c, 0x0a, 0xaa, 0x69, 0x46, 0x33, 0x59, 0xf7, 0xf7, 0xb4, 0xfc, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x28, 0x07, 0xd1, 0x28, 0x68, 0x69, 0x46, 0x00, 0x90, 0x3c, 0x00, 0x84, 0x8a, 0x00, 0x00, 0xa0, 0x19, 0x00, 0x79, 0x0a, 0x9a, 0x00, 0xf0, 0x09, 0xf9, 0x28, 0x1c, 0xf8, 0xf7, 0xb0, 0xfe, 0x0b, 0xb0, 0xf0, 0xbd, 0x01, 0x21, 0x2b, 0x20, 0xf8, 0xf7, 0x02, 0xfc, 0xf8, 0xe7, 0x00, 0x00, 0x7f, 0xff, 0xff, 0x00, 0x28, 0x46, 0x01, 0x00, 0x0a, 0x1c, 0x01, 0x0e, 0x01, 0x23, 0x1b, 0x06, 0x09, 0x06, 0x99, 0x42, 0x80, 0xb5, 0x08, 0xd0, 0x5b, 0x00, 0x99, 0x42, 0x3c, 0x00, 0xc0, 0x8a, 0x00, 0x00, 0x0b, 0xd1, 0x00, 0x06, 0x00, 0x0e, 0x11, 0x1c, 0x00, 0xf0, 0x0e, 0xf9, 0x80, 0xbd, 0x05, 0x49, 0x01, 0x40, 0x10, 0x1c, 0x05, 0xf0, 0xa2, 0xf9, 0x80, 0xbd, 0x01, 0x21, 0x2d, 0x20, 0xf8, 0xf7, 0xe1, 0xfb, 0x80, 0xbd, 0x7f, 0xff, 0xff, 0x00, 0x80, 0xb5, 0x01, 0x1c, 0x0f, 0x20, 0x00, 0xf0, 0x13, 0xf8, 0x80, 0xbd, 0x80, 0xb5, 0x01, 0x1c, 0x04, 0x20, 0x00, 0xf0, 0x3c, 0x00, 0xfc, 0x8a, 0x00, 0x00, 0x0d, 0xf8, 0x80, 0xbd, 0x80, 0xb5, 0x01, 0x1c, 0x17, 0x20, 0x00, 0xf0, 0x07, 0xf8, 0x80, 0xbd, 0x80, 0xb5, 0x01, 0x1c, 0x01, 0x20, 0x00, 0xf0, 0x01, 0xf8, 0x80, 0xbd, 0xf8, 0xb5, 0x04, 0x1c, 0x06, 0x1c, 0x80, 0x20, 0x84, 0x43, 0x0f, 0x1c, 0x19, 0x2c, 0x01, 0xd3, 0xf8, 0xf7, 0xea, 0xfb, 0x08, 0x48, 0x04, 0x5d, 0x21, 0x1c, 0x00, 0x20, 0xf8, 0xf7, 0x50, 0xfd, 0x3c, 0x00, 0x38, 0x8b, 0x00, 0x00, 0x05, 0x1c, 0x22, 0x1c, 0x39, 0x1c, 0x00, 0x68, 0xf7, 0xf7, 0xda, 0xfc, 0x2a, 0x1c, 0x31, 0x1c, 0x07, 0x20, 0xf8, 0xf7, 0x11, 0xf9, 0xf8, 0xbd, 0xf4, 0x45, 0x01, 0x00, 0xf8, 0xb5, 0x0d, 0x1c, 0x16, 0x1c, 0x04, 0x1c, 0x1f, 0x1c, 0x08, 0x21, 0x00, 0x20, 0xf8, 0xf7, 0x39, 0xfd, 0x14, 0x22, 0x01, 0x68, 0x0e, 0x4b, 0x72, 0x43, 0xd2, 0x18, 0x0c, 0x71, 0x12, 0x7c, 0x3c, 0x00, 0x74, 0x8b, 0x00, 0x00, 0x4a, 0x71, 0x0d, 0x60, 0x0b, 0x4a, 0x8f, 0x71, 0x12, 0x68, 0x7f, 0x2a, 0x03, 0xd9, 0x52, 0x05, 0x52, 0x0e, 0x80, 0x23, 0x1a, 0x43, 0xca, 0x71, 0x07, 0x4a, 0x00, 0x23, 0x51, 0x68, 0x01, 0x31, 0x51, 0x60, 0x02, 0x1c, 0x81, 0x21, 0x00, 0x20, 0xf8, 0xf7, 0x08, 0xf9, 0xf8, 0xbd, 0x00, 0x00, 0x74, 0x40, 0x01, 0x00, 0xfc, 0x5a, 0x01, 0x00, 0x80, 0x6e, 0x01, 0x00, 0x3c, 0x00, 0xb0, 0x8b, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x08, 0x21, 0x00, 0x20, 0xf8, 0xf7, 0x0e, 0xfd, 0x21, 0x8b, 0xe2, 0x7d, 0x05, 0x1c, 0x09, 0x05, 0x52, 0x07, 0x52, 0x0f, 0x49, 0x0c, 0x00, 0x68, 0x11, 0x43, 0x81, 0x80, 0xa1, 0x7d, 0x14, 0x23, 0x0e, 0x4a, 0x59, 0x43, 0x89, 0x18, 0x09, 0x7c, 0xc1, 0x71, 0xe1, 0x6a, 0x01, 0x60, 0xe1, 0x68, 0x28, 0x1c, 0xf8, 0xf7, 0x17, 0xfc, 0x0a, 0x48, 0x3c, 0x00, 0xec, 0x8b, 0x00, 0x00, 0x00, 0x68, 0x00, 0x28, 0x01, 0xd0, 0xf7, 0xf7, 0xf1, 0xfb, 0x07, 0x49, 0x04, 0x31, 0x88, 0x68, 0x01, 0x30, 0x88, 0x60, 0x00, 0x21, 0x2a, 0x1c, 0x00, 0x20, 0x23, 0x6b, 0xf8, 0xf7, 0xd2, 0xf8, 0x01, 0x20, 0xb0, 0xbd, 0x74, 0x40, 0x01, 0x00, 0x7c, 0x6e, 0x01, 0x00, 0x01, 0x48, 0x80, 0x68, 0x70, 0x47, 0x00, 0x00, 0x80, 0x6e, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x3c, 0x00, 0x28, 0x8c, 0x00, 0x00, 0x92, 0xb0, 0x01, 0x68, 0x68, 0x46, 0x08, 0x22, 0xf7, 0xf7, 0x62, 0xfc, 0x00, 0xab, 0x98, 0x88, 0x40, 0x07, 0x40, 0x0f, 0xd8, 0x77, 0x98, 0x88, 0x40, 0x04, 0x00, 0x0d, 0x18, 0x84, 0xd8, 0x88, 0x58, 0x84, 0x00, 0x98, 0x0d, 0x90, 0x05, 0x94, 0x20, 0x89, 0x08, 0x38, 0x20, 0x81, 0x05, 0x98, 0x01, 0x68, 0x08, 0x31, 0x01, 0x60, 0x00, 0x20, 0x0a, 0x90, 0x0c, 0x90, 0x3c, 0x00, 0x64, 0x8c, 0x00, 0x00, 0x00, 0x21, 0x11, 0x20, 0x09, 0xf0, 0x78, 0xfb, 0x05, 0x49, 0x06, 0x4a, 0x08, 0x68, 0x01, 0x30, 0x08, 0x60, 0x02, 0x21, 0x02, 0xa8, 0x01, 0xf0, 0xcd, 0xfc, 0x12, 0xb0, 0x10, 0xbd, 0x00, 0x00, 0x80, 0x6e, 0x01, 0x00, 0x55, 0x8b, 0x00, 0x00, 0x02, 0x1c, 0x01, 0x20, 0x00, 0x06, 0x08, 0x43, 0x80, 0xb5, 0x2b, 0x21, 0x0a, 0xf0, 0x8a, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0xa0, 0x8c, 0x00, 0x00, 0xf7, 0xb5, 0x04, 0x1c, 0x06, 0x1c, 0x80, 0x20, 0x84, 0x43, 0x17, 0x1c, 0x06, 0x2c, 0x01, 0xd3, 0xf8, 0xf7, 0x26, 0xfb, 0x0b, 0x48, 0x05, 0x5d, 0x29, 0x1c, 0x00, 0x20, 0xf8, 0xf7, 0x8c, 0xfc, 0x04, 0x1c, 0x00, 0x68, 0x01, 0x99, 0x2a, 0x1c, 0xf7, 0xf7, 0x16, 0xfc, 0x39, 0x1c, 0x20, 0x1c, 0xf8, 0xf7, 0xa2, 0xfb, 0x22, 0x1c, 0x31, 0x1c, 0x00, 0x23, 0x02, 0x20, 0x3c, 0x00, 0xdc, 0x8c, 0x00, 0x00, 0xf8, 0xf7, 0x68, 0xf8, 0xfe, 0xbd, 0x00, 0x00, 0x20, 0x46, 0x01, 0x00, 0x0a, 0x1c, 0x01, 0x1c, 0x80, 0xb5, 0x00, 0x23, 0x01, 0x20, 0xf8, 0xf7, 0x5d, 0xf8, 0x80, 0xbd, 0xff, 0xb5, 0x9f, 0xb0, 0x1f, 0x1c, 0x05, 0x1c, 0x0a, 0x30, 0x1e, 0x90, 0x1c, 0xaa, 0x1d, 0xa9, 0x0a, 0xf0, 0x00, 0xff, 0x00, 0x28, 0x71, 0xd0, 0x00, 0x2f, 0x09, 0xd0, 0x0a, 0x21, 0x00, 0x20, 0x3c, 0x00, 0x18, 0x8d, 0x00, 0x00, 0xf8, 0xf7, 0x5e, 0xfc, 0x06, 0x68, 0x04, 0x1c, 0x30, 0x1d, 0xfa, 0xf7, 0xaf, 0xfa, 0x05, 0xe0, 0x04, 0x21, 0x00, 0x20, 0xf8, 0xf7, 0x54, 0xfc, 0x06, 0x68, 0x04, 0x1c, 0x28, 0x89, 0x36, 0x49, 0x01, 0x22, 0x08, 0x80, 0x70, 0x80, 0xe8, 0x88, 0x14, 0xa9, 0x30, 0x80, 0x19, 0xa8, 0xfc, 0xf7, 0xf5, 0xfc, 0xfc, 0xf7, 0xff, 0xfb, 0x01, 0x1c, 0xff, 0x31, 0x21, 0x31, 0x3c, 0x00, 0x54, 0x8d, 0x00, 0x00, 0x20, 0x1c, 0x01, 0xf0, 0xef, 0xf8, 0x19, 0xa9, 0x20, 0x1c, 0x01, 0xf0, 0xeb, 0xf8, 0x14, 0xa9, 0x20, 0x1c, 0x01, 0xf0, 0xe7, 0xf8, 0x20, 0x1c, 0x20, 0x99, 0xfd, 0xf7, 0x4b, 0xfd, 0x00, 0x22, 0x02, 0x21, 0x01, 0xf0, 0x33, 0xfd, 0x06, 0x1c, 0x1c, 0x99, 0x00, 0x20, 0x88, 0x61, 0x30, 0x1c, 0xf8, 0xf7, 0x1c, 0xfa, 0x00, 0x2e, 0x0b, 0xd0, 0x30, 0x7a, 0x00, 0x28, 0x3c, 0x00, 0x90, 0x8d, 0x00, 0x00, 0x02, 0xd0, 0x40, 0x21, 0x08, 0x43, 0x30, 0x72, 0x1c, 0x98, 0x02, 0x22, 0x81, 0x69, 0x11, 0x43, 0x81, 0x61, 0x04, 0xe0, 0x1c, 0x99, 0x02, 0x22, 0x88, 0x69, 0x90, 0x43, 0x88, 0x61, 0x1d, 0xaa, 0x06, 0xca, 0x01, 0xa8, 0x05, 0xf0, 0x58, 0xfb, 0x09, 0xa8, 0x00, 0x2f, 0x02, 0xd0, 0x02, 0x22, 0x42, 0x72, 0x01, 0xe0, 0x00, 0x21, 0x41, 0x72, 0x04, 0x94, 0x01, 0xa8, 0x3c, 0x00, 0xcc, 0x8d, 0x00, 0x00, 0x04, 0xf0, 0x7a, 0xfb, 0x01, 0x21, 0x1c, 0x98, 0x08, 0xf0, 0xc8, 0xff, 0x00, 0x2f, 0x04, 0xd0, 0x1c, 0x98, 0x01, 0x22, 0x81, 0x69, 0x11, 0x43, 0x81, 0x61, 0xa8, 0x88, 0x1c, 0x9c, 0x01, 0xf0, 0x9f, 0xfe, 0x02, 0x1c, 0x21, 0x1c, 0x00, 0xe0, 0x04, 0xe0, 0x07, 0x48, 0x40, 0x88, 0x09, 0xf0, 0x1f, 0xf8, 0x04, 0xe0, 0x3a, 0x1c, 0x00, 0x21, 0x05, 0x20, 0xf9, 0xf7, 0x3c, 0x00, 0x08, 0x8e, 0x00, 0x00, 0x9b, 0xf8, 0x00, 0x20, 0x23, 0xb0, 0xf0, 0xbd, 0xfc, 0x60, 0x01, 0x00, 0x98, 0x7c, 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0x05, 0x68, 0xa0, 0x1d, 0x01, 0xf0, 0x95, 0xff, 0x00, 0x28, 0x45, 0xd0, 0x21, 0x1c, 0x14, 0x31, 0x20, 0x1c, 0x6a, 0x46, 0x0a, 0xf0, 0x55, 0xfe, 0x00, 0x28, 0x3d, 0xd0, 0xfc, 0xf7, 0x7d, 0xfa, 0x00, 0x28, 0x39, 0xd1, 0x00, 0x98, 0x3c, 0x00, 0x44, 0x8e, 0x00, 0x00, 0x4b, 0x21, 0x09, 0x5c, 0x01, 0x29, 0x34, 0xd1, 0x04, 0x26, 0x09, 0xf0, 0x19, 0xf9, 0x68, 0x88, 0x00, 0x28, 0x1b, 0xd1, 0xa8, 0x88, 0x03, 0x21, 0x89, 0x03, 0x88, 0x43, 0x15, 0x49, 0x00, 0x26, 0x08, 0x80, 0x01, 0x22, 0x02, 0x21, 0x20, 0x69, 0x01, 0xf0, 0xb8, 0xfc, 0x04, 0x1c, 0x14, 0xd0, 0x00, 0x98, 0x80, 0x69, 0x80, 0x07, 0x10, 0xd5, 0xf8, 0xf7, 0x9a, 0xf9, 0x3c, 0x00, 0x80, 0x8e, 0x00, 0x00, 0x20, 0x1c, 0xf8, 0xf7, 0xdd, 0xf8, 0x00, 0x28, 0x09, 0xd1, 0xf8, 0xf7, 0x7f, 0xf9, 0x01, 0x26, 0x00, 0x98, 0x02, 0x22, 0x81, 0x69, 0x91, 0x43, 0x81, 0x61, 0x00, 0x21, 0x01, 0xe0, 0x00, 0x98, 0x02, 0x21, 0x08, 0xf0, 0x61, 0xff, 0x00, 0x98, 0x80, 0x69, 0xa9, 0x88, 0xc2, 0x07, 0xd2, 0x0f, 0x30, 0x1c, 0xf9, 0xf7, 0x45, 0xf8, 0xf8, 0xbd, 0xfa, 0x60, 0x01, 0x00, 0x3c, 0x00, 0xbc, 0x8e, 0x00, 0x00, 0x1c, 0xb5, 0x04, 0x69, 0x00, 0x23, 0x00, 0x22, 0x00, 0x2c, 0x13, 0xd1, 0x4b, 0x24, 0x24, 0x5c, 0x02, 0x2c, 0x03, 0xd1, 0x02, 0x29, 0x05, 0xd0, 0x01, 0x22, 0x03, 0xe0, 0x02, 0x29, 0x01, 0xd1, 0x01, 0x22, 0x01, 0x23, 0x00, 0x2a, 0x05, 0xd0, 0x00, 0x90, 0x04, 0x20, 0x01, 0x93, 0x69, 0x46, 0x09, 0xf0, 0x36, 0xfa, 0x1c, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x3c, 0x00, 0xf8, 0x8e, 0x00, 0x00, 0xf2, 0x21, 0x0f, 0x20, 0x0c, 0x4d, 0x0a, 0xf0, 0x99, 0xfb, 0x28, 0x78, 0x08, 0x28, 0x0b, 0xd2, 0x01, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x07, 0x03, 0x03, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x2c, 0x01, 0xd1, 0x05, 0xf0, 0xbc, 0xfb, 0xb0, 0xbd, 0x01, 0x2c, 0xfc, 0xd1, 0xff, 0x20, 0x07, 0xf0, 0x38, 0xfa, 0xb0, 0xbd, 0x00, 0x00, 0x74, 0x66, 0x01, 0x00, 0x3c, 0x00, 0x34, 0x8f, 0x00, 0x00, 0x8c, 0xb5, 0x05, 0x4a, 0x00, 0xab, 0x11, 0x72, 0x00, 0x90, 0x19, 0x71, 0x69, 0x46, 0x08, 0x20, 0x09, 0xf0, 0x0a, 0xfa, 0x8c, 0xbd, 0x00, 0x00, 0xac, 0x7c, 0x01, 0x00, 0xf3, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0x06, 0x27, 0x85, 0xb0, 0x06, 0x68, 0x09, 0xf0, 0x26, 0xff, 0x98, 0x49, 0x48, 0x63, 0x20, 0x69, 0x03, 0x21, 0x01, 0xf0, 0x08, 0xfc, 0x96, 0x4d, 0x00, 0x28, 0x3c, 0x00, 0x70, 0x8f, 0x00, 0x00, 0x4d, 0xd0, 0x95, 0x49, 0x40, 0x31, 0x09, 0x79, 0x80, 0x78, 0x81, 0x42, 0x47, 0xd1, 0x01, 0x21, 0x20, 0x69, 0x01, 0xf0, 0xfb, 0xfb, 0x02, 0x90, 0x20, 0x69, 0x32, 0x21, 0x01, 0xf0, 0xf6, 0xfb, 0x01, 0x90, 0x02, 0x1c, 0x8d, 0x48, 0x02, 0x99, 0xfc, 0xf7, 0x46, 0xff, 0x00, 0x28, 0x36, 0xd0, 0x00, 0x23, 0x8a, 0x48, 0x02, 0x99, 0x01, 0x9a, 0xfc, 0xf7, 0xe4, 0xfe, 0x3c, 0x00, 0xac, 0x8f, 0x00, 0x00, 0x0b, 0x28, 0x2e, 0xd1, 0x86, 0x4a, 0x51, 0x88, 0x70, 0x89, 0x41, 0x40, 0x03, 0x91, 0x0b, 0x1c, 0x84, 0x49, 0x0b, 0x40, 0x25, 0xd1, 0x50, 0x80, 0x03, 0x99, 0x17, 0x1c, 0x00, 0x29, 0x0b, 0xd0, 0x03, 0x99, 0x48, 0x05, 0x02, 0xd5, 0x38, 0x1c, 0xfc, 0xf7, 0x40, 0xfe, 0x03, 0x99, 0x88, 0x06, 0x02, 0xd5, 0x38, 0x1c, 0xfc, 0xf7, 0x24, 0xfe, 0x2a, 0x21, 0x20, 0x69, 0x3c, 0x00, 0xe8, 0x8f, 0x00, 0x00, 0x01, 0xf0, 0xc8, 0xfb, 0x00, 0x28, 0x0d, 0xd0, 0x80, 0x78, 0xe9, 0x69, 0x81, 0x42, 0x09, 0xd0, 0xe8, 0x61, 0x38, 0x1c, 0xfc, 0xf7, 0x16, 0xfe, 0x38, 0x1c, 0xfc, 0xf7, 0x07, 0xfe, 0x38, 0x1c, 0xfc, 0xf7, 0x26, 0xfe, 0x00, 0x27, 0x20, 0x1c, 0x20, 0x30, 0x04, 0x90, 0x40, 0x7a, 0x08, 0x28, 0x71, 0xd1, 0x0a, 0xf0, 0xd1, 0xfc, 0x00, 0x20, 0x68, 0x61, 0x00, 0x23, 0x3c, 0x00, 0x24, 0x90, 0x00, 0x00, 0x2b, 0x61, 0xa8, 0x68, 0x66, 0x49, 0x01, 0x30, 0xa8, 0x60, 0x30, 0x89, 0x5c, 0x31, 0x88, 0x82, 0x01, 0xf0, 0x7a, 0xfd, 0x62, 0x49, 0x5c, 0x31, 0x08, 0x61, 0x22, 0x6a, 0x04, 0x98, 0x18, 0x21, 0x00, 0x7a, 0x01, 0xf0, 0x33, 0xfe, 0xe1, 0x6a, 0x40, 0x18, 0x03, 0x90, 0x5c, 0x48, 0x00, 0x6a, 0x00, 0x28, 0x0d, 0xd0, 0x00, 0x2f, 0x0b, 0xd1, 0x59, 0x48, 0x01, 0x23, 0x3c, 0x00, 0x60, 0x90, 0x00, 0x00, 0x5c, 0x30, 0x01, 0x68, 0x1b, 0x07, 0x00, 0x22, 0x30, 0x68, 0x09, 0xf0, 0x49, 0xff, 0x00, 0x28, 0x00, 0xd1, 0x05, 0x27, 0x00, 0x21, 0xa0, 0x6b, 0x0a, 0xf0, 0xce, 0xfc, 0x00, 0x21, 0x20, 0x6c, 0x0a, 0xf0, 0xe8, 0xfc, 0x4f, 0x4b, 0x03, 0xce, 0x03, 0x9a, 0x5c, 0x33, 0xfc, 0xf7, 0x88, 0xfd, 0x00, 0x20, 0x4c, 0x4e, 0x05, 0x21, 0xb0, 0x63, 0x20, 0x69, 0x01, 0xf0, 0x3c, 0x00, 0x9c, 0x90, 0x00, 0x00, 0x6f, 0xfb, 0x01, 0x1c, 0x01, 0xd1, 0xf0, 0x60, 0x1c, 0xe0, 0x01, 0x20, 0xf0, 0x60, 0x88, 0x78, 0x45, 0x4a, 0x01, 0x32, 0x10, 0x70, 0xc8, 0x78, 0x50, 0x70, 0x47, 0x4a, 0x10, 0x70, 0x30, 0x69, 0x00, 0x28, 0x0a, 0xd0, 0x4a, 0x78, 0x08, 0x79, 0x05, 0x31, 0x09, 0xf0, 0xdd, 0xfa, 0x31, 0x69, 0xf7, 0xf7, 0x85, 0xf9, 0xf0, 0x68, 0x00, 0x28, 0x04, 0xd0, 0x3b, 0x4a, 0x3c, 0x00, 0xd8, 0x90, 0x00, 0x00, 0x01, 0x32, 0x10, 0x78, 0x00, 0x28, 0x08, 0xd1, 0x00, 0x20, 0xa8, 0x61, 0x71, 0x6a, 0x00, 0x29, 0x03, 0xd0, 0x20, 0x1c, 0x14, 0x30, 0xf7, 0xf7, 0x74, 0xf9, 0x34, 0x4a, 0x5c, 0x32, 0x10, 0x69, 0x31, 0x6a, 0x41, 0x18, 0x00, 0xe0, 0x20, 0xe0, 0x0a, 0x23, 0xd0, 0x68, 0x0a, 0x22, 0x09, 0xf0, 0xfb, 0xfe, 0x00, 0x28, 0x07, 0xd0, 0x2d, 0x4a, 0x31, 0x6a, 0x5c, 0x32, 0x3c, 0x00, 0x14, 0x91, 0x00, 0x00, 0xd0, 0x68, 0x40, 0x1a, 0x11, 0x69, 0x40, 0x1a, 0x70, 0x60, 0x29, 0x4a, 0x5c, 0x32, 0xd0, 0x68, 0x30, 0x62, 0xf0, 0x69, 0x00, 0x28, 0x04, 0xd0, 0xfa, 0xf7, 0x00, 0xfd, 0x01, 0x20, 0xfa, 0xf7, 0xa1, 0xfc, 0xfa, 0xf7, 0x81, 0xfc, 0x27, 0x48, 0x00, 0x68, 0x03, 0xf0, 0x07, 0xf9, 0x06, 0x98, 0x00, 0x28, 0x03, 0xd1, 0x1e, 0x4e, 0x00, 0x23, 0xb3, 0x60, 0x16, 0xe0, 0x3c, 0x00, 0x50, 0x91, 0x00, 0x00, 0x1c, 0x4e, 0x01, 0x20, 0xb0, 0x60, 0x06, 0x98, 0x01, 0x68, 0x40, 0x68, 0xb0, 0x65, 0x19, 0x48, 0x71, 0x65, 0x54, 0x30, 0xc0, 0x88, 0x00, 0x28, 0x09, 0xd0, 0xb1, 0x69, 0x00, 0x29, 0x06, 0xd0, 0x01, 0xf0, 0xdc, 0xfc, 0x01, 0x1c, 0xe0, 0x6a, 0xb2, 0x69, 0xf7, 0xf7, 0x2f, 0xf9, 0x00, 0x2f, 0x15, 0xd1, 0x12, 0x48, 0x01, 0x69, 0x00, 0x29, 0x08, 0xd1, 0x01, 0x21, 0x3c, 0x00, 0x8c, 0x91, 0x00, 0x00, 0x01, 0x61, 0x2a, 0x68, 0x00, 0x2a, 0x03, 0xd0, 0x00, 0x21, 0x00, 0x20, 0xf7, 0xf7, 0x20, 0xf9, 0x09, 0x49, 0x00, 0x23, 0xcb, 0x62, 0x2b, 0x61, 0x6b, 0x61, 0x06, 0xf0, 0xb5, 0xf8, 0x07, 0xb0, 0xf0, 0xbd, 0x6b, 0x68, 0x06, 0x48, 0x00, 0x2b, 0xf9, 0xd0, 0x02, 0x1d, 0x11, 0x1c, 0x38, 0x1c, 0xf7, 0xf7, 0x0f, 0xf9, 0xf3, 0xe7, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x3c, 0x00, 0xc8, 0x91, 0x00, 0x00, 0xf4, 0x68, 0x01, 0x00, 0xf4, 0x67, 0x01, 0x00, 0x03, 0x08, 0x00, 0x00, 0xf8, 0x60, 0x01, 0x00, 0xc4, 0x67, 0x01, 0x00, 0x08, 0xb5, 0xf8, 0xf7, 0x2f, 0xfd, 0x00, 0x90, 0x00, 0xab, 0x18, 0x88, 0x00, 0x28, 0x0c, 0xd0, 0x05, 0xf0, 0x50, 0xff, 0x00, 0xab, 0x59, 0x88, 0x18, 0x88, 0x05, 0xf0, 0x6d, 0xf9, 0xfe, 0xf7, 0x97, 0xf8, 0x03, 0x20, 0xfb, 0xf7, 0x0e, 0xf8, 0x3c, 0x00, 0x04, 0x92, 0x00, 0x00, 0x08, 0xbd, 0x01, 0x20, 0xff, 0xf7, 0xb2, 0xfb, 0x00, 0x20, 0x08, 0xf0, 0x8d, 0xfe, 0xf7, 0xe7, 0xf8, 0xb5, 0x4f, 0x49, 0x8c, 0x68, 0x20, 0x6a, 0x00, 0x68, 0x05, 0x78, 0xfc, 0xf7, 0x68, 0xfa, 0x00, 0x28, 0x12, 0xd0, 0x2a, 0x07, 0x92, 0x0f, 0x01, 0x21, 0x01, 0x2a, 0x00, 0xd0, 0x00, 0x21, 0x00, 0x29, 0x03, 0xd0, 0x29, 0x06, 0x09, 0x0f, 0x0b, 0x29, 0x06, 0xd1, 0x3c, 0x00, 0x40, 0x92, 0x00, 0x00, 0x2a, 0x21, 0x09, 0x5d, 0x08, 0x18, 0x90, 0x30, 0x00, 0x7b, 0xf9, 0xf7, 0x0d, 0xfc, 0x41, 0x4f, 0x3c, 0x3f, 0xb8, 0x6b, 0x79, 0x6b, 0xf7, 0xf7, 0xc0, 0xf8, 0xa0, 0x6c, 0x00, 0x26, 0xc6, 0x60, 0x60, 0x6b, 0x80, 0x08, 0x04, 0xd0, 0xb8, 0x69, 0x01, 0x30, 0xb8, 0x61, 0x06, 0xf0, 0xdc, 0xf9, 0x39, 0x4d, 0x28, 0x69, 0x80, 0x05, 0x80, 0x0f, 0x08, 0xd1, 0x78, 0x69, 0x3c, 0x00, 0x7c, 0x92, 0x00, 0x00, 0x04, 0x21, 0x01, 0x30, 0x78, 0x61, 0x60, 0x6b, 0x40, 0x08, 0x40, 0x00, 0x08, 0x43, 0x60, 0x63, 0xb8, 0x6a, 0x00, 0x28, 0x03, 0xd0, 0x60, 0x6b, 0x08, 0x21, 0x08, 0x43, 0x60, 0x63, 0x20, 0x1c, 0x20, 0x30, 0x00, 0x90, 0x39, 0x68, 0xf7, 0xf7, 0x9a, 0xf8, 0x03, 0x20, 0x00, 0x02, 0x28, 0x60, 0x2b, 0x49, 0x88, 0x68, 0xa0, 0x63, 0xc8, 0x68, 0xe0, 0x63, 0x08, 0x79, 0x3c, 0x00, 0xb8, 0x92, 0x00, 0x00, 0xc0, 0x06, 0xc0, 0x0e, 0x25, 0x1c, 0x40, 0x35, 0x28, 0x71, 0x48, 0x79, 0x68, 0x71, 0x23, 0x48, 0x3c, 0x38, 0x46, 0x62, 0x00, 0x98, 0x80, 0x7a, 0x01, 0xf0, 0x5e, 0xfd, 0x00, 0x21, 0x00, 0x28, 0x21, 0x4a, 0x01, 0xd0, 0x11, 0x78, 0x03, 0xe0, 0x93, 0x78, 0xdb, 0x07, 0x00, 0xd5, 0x51, 0x78, 0xa9, 0x71, 0x00, 0x28, 0x04, 0xd0, 0x1b, 0x49, 0x14, 0x31, 0x08, 0x68, 0x3c, 0x00, 0xf4, 0x92, 0x00, 0x00, 0x20, 0x64, 0x00, 0xe0, 0x6e, 0x80, 0xb8, 0x6a, 0xc0, 0x07, 0x02, 0xd5, 0xff, 0x20, 0x28, 0x71, 0xae, 0x71, 0xe6, 0x61, 0xb8, 0x68, 0x01, 0x30, 0xb8, 0x60, 0x79, 0x68, 0x88, 0x42, 0x03, 0xd0, 0x0b, 0x21, 0x85, 0x20, 0xf7, 0xf7, 0xc4, 0xff, 0x0d, 0x49, 0x88, 0x68, 0xc0, 0x6c, 0x88, 0x60, 0xfb, 0x6a, 0x00, 0x2b, 0x0c, 0xd0, 0x0e, 0x4a, 0xd4, 0x7b, 0x00, 0x2b, 0x3c, 0x00, 0x30, 0x93, 0x00, 0x00, 0x02, 0xdd, 0x7f, 0x2c, 0x05, 0xd2, 0x01, 0xe0, 0x00, 0x2c, 0x02, 0xd0, 0xd4, 0x7b, 0xe3, 0x18, 0xd3, 0x73, 0xfe, 0x62, 0xc9, 0x68, 0x88, 0x42, 0x03, 0xd1, 0x05, 0x21, 0x85, 0x20, 0xf7, 0xf7, 0xa9, 0xff, 0xf8, 0xbd, 0x24, 0x7e, 0x01, 0x00, 0x00, 0x40, 0x07, 0x00, 0xa0, 0x80, 0x07, 0x00, 0xe8, 0x80, 0x07, 0x00, 0x40, 0x00, 0x07, 0x00, 0xfe, 0xb5, 0x30, 0x4c, 0x3c, 0x00, 0x6c, 0x93, 0x00, 0x00, 0xa0, 0x6b, 0x21, 0x6b, 0xf7, 0xf7, 0x33, 0xf8, 0x2d, 0x49, 0x3c, 0x31, 0x8e, 0x68, 0x70, 0x8b, 0x06, 0x28, 0x04, 0xd2, 0xe0, 0x69, 0x01, 0x30, 0xe0, 0x61, 0x0e, 0x20, 0x30, 0x85, 0x28, 0x49, 0x3c, 0x31, 0x0d, 0x68, 0x00, 0x2d, 0x03, 0xd1, 0x03, 0x21, 0x85, 0x20, 0xf7, 0xf7, 0x84, 0xff, 0x24, 0x48, 0x45, 0x61, 0x35, 0x62, 0x31, 0x8d, 0xef, 0x68, 0x04, 0x39, 0x3c, 0x00, 0xa8, 0x93, 0x00, 0x00, 0x0c, 0x04, 0x01, 0x21, 0x02, 0x91, 0x24, 0x0c, 0x00, 0x21, 0x01, 0x91, 0x1d, 0x48, 0x3c, 0x30, 0x80, 0x8a, 0xa0, 0x42, 0x03, 0xd3, 0x2c, 0x81, 0xee, 0x60, 0x00, 0x24, 0x0b, 0xe0, 0x00, 0x2f, 0x04, 0xd1, 0x03, 0x21, 0x85, 0x20, 0xf7, 0xf7, 0x69, 0xff, 0x04, 0xe0, 0x3d, 0x1c, 0x20, 0x1a, 0x04, 0x04, 0xff, 0x68, 0x24, 0x0c, 0x02, 0x98, 0x00, 0x28, 0x04, 0xd0, 0x3c, 0x00, 0xe4, 0x93, 0x00, 0x00, 0x12, 0x49, 0x01, 0x20, 0x08, 0x61, 0x00, 0x20, 0x02, 0x90, 0x01, 0x98, 0x01, 0x30, 0x01, 0x90, 0x00, 0x2c, 0xdd, 0xd1, 0x0c, 0x48, 0x0c, 0x4c, 0x3c, 0x30, 0x07, 0x60, 0x01, 0x98, 0x30, 0x65, 0xb5, 0x64, 0x30, 0x6a, 0x00, 0x68, 0x60, 0x62, 0x60, 0x68, 0x01, 0x30, 0x60, 0x60, 0xa1, 0x68, 0x01, 0x31, 0x88, 0x42, 0x03, 0xd0, 0x0a, 0x21, 0x85, 0x20, 0xf7, 0xf7, 0x3c, 0x00, 0x20, 0x94, 0x00, 0x00, 0x41, 0xff, 0x04, 0x48, 0x00, 0x68, 0xa0, 0x62, 0xfe, 0xbd, 0x00, 0x00, 0xe8, 0x7d, 0x01, 0x00, 0x00, 0x30, 0x07, 0x00, 0x78, 0x6e, 0x01, 0x00, 0xb0, 0xb5, 0x05, 0x1c, 0x01, 0x21, 0x0f, 0x20, 0x0a, 0xf0, 0xf8, 0xf8, 0xf2, 0x21, 0x0f, 0x20, 0x0a, 0xf0, 0xf4, 0xf8, 0x0c, 0x48, 0x0c, 0x4c, 0x00, 0x68, 0x14, 0x3c, 0x00, 0x28, 0x0c, 0xd0, 0xe0, 0x78, 0x01, 0x28, 0x3c, 0x00, 0x5c, 0x94, 0x00, 0x00, 0x09, 0xd0, 0x01, 0x22, 0x29, 0x1c, 0x0f, 0x20, 0x0a, 0xf0, 0xac, 0xf8, 0x60, 0x78, 0x02, 0x28, 0x06, 0xd0, 0x01, 0x20, 0x03, 0xe0, 0x60, 0x78, 0x02, 0x28, 0x01, 0xd0, 0x00, 0x20, 0x60, 0x70, 0xb0, 0xbd, 0x00, 0x00, 0x98, 0x66, 0x01, 0x00, 0x02, 0x22, 0x00, 0x28, 0x80, 0xb5, 0x00, 0xd1, 0x03, 0x22, 0x03, 0x49, 0x0e, 0x20, 0x0a, 0xf0, 0x9b, 0xf8, 0x00, 0x20, 0x3c, 0x00, 0x98, 0x94, 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x50, 0xc3, 0x00, 0x00, 0xf8, 0xb5, 0x00, 0x23, 0x00, 0x22, 0x00, 0x28, 0x2e, 0xd0, 0x06, 0x89, 0x04, 0x68, 0x75, 0x1e, 0x2d, 0x04, 0xb6, 0x1a, 0xf6, 0x07, 0x2d, 0x0c, 0xf6, 0x0f, 0xb4, 0x46, 0x0e, 0xe0, 0xa7, 0x5c, 0xa6, 0x18, 0x02, 0x33, 0x00, 0x97, 0x77, 0x78, 0xa7, 0x54, 0x02, 0x32, 0x12, 0x04, 0x00, 0x9f, 0x12, 0x0c, 0x00, 0x29, 0x3c, 0x00, 0xd4, 0x94, 0x00, 0x00, 0x77, 0x70, 0x01, 0xdd, 0x8b, 0x42, 0x15, 0xda, 0xaa, 0x42, 0xee, 0xd3, 0xc0, 0x68, 0x00, 0x28, 0x10, 0xd0, 0x02, 0x89, 0x00, 0x2a, 0xf9, 0xd0, 0x62, 0x46, 0x00, 0x2a, 0x0b, 0xd0, 0x02, 0x68, 0x66, 0x5d, 0x17, 0x78, 0x02, 0x33, 0x67, 0x55, 0x16, 0x70, 0x01, 0x22, 0x00, 0x29, 0xd2, 0xdd, 0x8b, 0x42, 0xd0, 0xdb, 0xf8, 0xbd, 0x00, 0x22, 0xcd, 0xe7, 0x00, 0x00, 0x3c, 0x00, 0x10, 0x95, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, 0x01, 0x20, 0xf8, 0xf7, 0x5e, 0xfb, 0x0d, 0x49, 0x00, 0x28, 0xc8, 0x61, 0x14, 0xd0, 0x62, 0x68, 0x42, 0x60, 0xa2, 0x7c, 0x02, 0x72, 0xa2, 0x68, 0xc2, 0x60, 0xe2, 0x68, 0x02, 0x61, 0x22, 0x8a, 0x02, 0x75, 0x0a, 0x1d, 0x0a, 0x62, 0x12, 0x68, 0x00, 0x2a, 0xff, 0xd1, 0x02, 0x60, 0x48, 0x60, 0x00, 0x20, 0xa8, 0x60, 0x01, 0x20, 0x3c, 0x00, 0x4c, 0x95, 0x00, 0x00, 0xb0, 0xbd, 0x01, 0x20, 0xfa, 0xe7, 0x00, 0x00, 0xa4, 0x6e, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x40, 0x68, 0x0d, 0x1c, 0x43, 0x1c, 0x02, 0xd1, 0x21, 0x1c, 0x09, 0x48, 0x08, 0xe0, 0x00, 0x20, 0xf8, 0xf7, 0x34, 0xfb, 0x06, 0x49, 0x94, 0x39, 0x08, 0x61, 0x00, 0x28, 0x03, 0xd0, 0x21, 0x1c, 0x00, 0xf0, 0x48, 0xfe, 0x00, 0xe0, 0x01, 0x20, 0xa8, 0x60, 0x01, 0x20, 0x3c, 0x00, 0x88, 0x95, 0x00, 0x00, 0xb0, 0xbd, 0x00, 0x00, 0x38, 0x6f, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x21, 0x97, 0x20, 0xf7, 0xf7, 0x85, 0xfe, 0x00, 0x20, 0x80, 0xbd, 0x00, 0x00, 0x38, 0xb5, 0x0a, 0x1c, 0x14, 0x32, 0x00, 0x92, 0x13, 0x1f, 0x05, 0x1c, 0x08, 0x3a, 0x0c, 0x1c, 0x16, 0x31, 0x40, 0x68, 0xfe, 0xf7, 0x6c, 0xfe, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x20, 0x00, 0xe0, 0x01, 0x20, 0x69, 0x68, 0x3c, 0x00, 0xc4, 0x95, 0x00, 0x00, 0xa0, 0x60, 0x61, 0x60, 0x01, 0x20, 0x38, 0xbd, 0x10, 0xb5, 0x0c, 0x1c, 0x01, 0x7a, 0x00, 0x29, 0x0f, 0xd0, 0x01, 0x29, 0x09, 0xd0, 0x02, 0x29, 0x03, 0xd1, 0x00, 0x21, 0x00, 0x20, 0x0a, 0xf0, 0x73, 0xfc, 0x00, 0x20, 0x20, 0x71, 0x01, 0x20, 0x10, 0xbd, 0x41, 0x68, 0x01, 0x20, 0x0a, 0xf0, 0x6b, 0xfc, 0x00, 0xf0, 0x0d, 0xf9, 0xf4, 0xe7, 0x80, 0xb5, 0x04, 0x49, 0x3c, 0x00, 0x00, 0x96, 0x00, 0x00, 0x48, 0x68, 0x01, 0x38, 0x48, 0x60, 0x01, 0xd1, 0x07, 0xf0, 0x6e, 0xfb, 0x00, 0x20, 0x80, 0xbd, 0xac, 0x79, 0x01, 0x00, 0xb0, 0xb5, 0x05, 0x1c, 0x0c, 0x1c, 0x00, 0xf0, 0x4f, 0xfe, 0xa0, 0x60, 0x68, 0x68, 0x60, 0x60, 0x01, 0x20, 0xb0, 0xbd, 0xb0, 0xb5, 0x05, 0x1c, 0x0c, 0x1c, 0x00, 0xf0, 0x6f, 0xfe, 0xa0, 0x60, 0x68, 0x68, 0x60, 0x60, 0x01, 0x20, 0xb0, 0xbd, 0x3c, 0x00, 0x3c, 0x96, 0x00, 0x00, 0x08, 0x1c, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x0e, 0xc0, 0x08, 0xc0, 0x01, 0x20, 0x70, 0x47, 0xf8, 0xb5, 0x0f, 0x1c, 0x04, 0x1c, 0x20, 0x79, 0x20, 0x28, 0x01, 0xd2, 0x20, 0x20, 0x20, 0x71, 0x66, 0x79, 0x00, 0x2e, 0x02, 0xd1, 0x25, 0x79, 0x00, 0x22, 0x0d, 0xe0, 0x25, 0x79, 0x29, 0x1c, 0x30, 0x1c, 0xf7, 0xf7, 0x4f, 0xf8, 0x00, 0x29, 0x01, 0xd1, 0x32, 0x1c, 0x3c, 0x00, 0x78, 0x96, 0x00, 0x00, 0x04, 0xe0, 0x70, 0x43, 0x80, 0x19, 0x05, 0x06, 0x2d, 0x0e, 0x32, 0x1c, 0xe0, 0x79, 0x29, 0x1c, 0x00, 0xf0, 0xf2, 0xf9, 0x20, 0x7a, 0x2f, 0x49, 0xc0, 0x07, 0xc0, 0x0f, 0x08, 0x60, 0x2e, 0x48, 0x00, 0x78, 0xc0, 0x07, 0x43, 0xd5, 0xa1, 0x79, 0x2c, 0x4a, 0xc8, 0x07, 0x48, 0xd4, 0x2c, 0x4e, 0x16, 0x60, 0x8b, 0x07, 0x2b, 0x48, 0x08, 0xd5, 0xcc, 0x08, 0x01, 0x23, 0x3c, 0x00, 0xb4, 0x96, 0x00, 0x00, 0xa3, 0x40, 0x03, 0x60, 0x49, 0x07, 0x04, 0xd5, 0x28, 0x49, 0x11, 0x60, 0x01, 0xe0, 0x40, 0x21, 0x01, 0x60, 0x13, 0x68, 0x26, 0x4a, 0xb3, 0x42, 0x10, 0xd1, 0x54, 0x68, 0x01, 0x68, 0x0c, 0x43, 0x54, 0x60, 0x14, 0x68, 0x0c, 0x40, 0x01, 0xd0, 0x51, 0x61, 0x00, 0xe0, 0x91, 0x61, 0x54, 0x68, 0x0c, 0x43, 0x54, 0x60, 0x94, 0x68, 0x21, 0x43, 0x91, 0x60, 0x13, 0xe0, 0x3c, 0x00, 0xf0, 0x96, 0x00, 0x00, 0x54, 0x7c, 0x01, 0x68, 0x0c, 0x43, 0x54, 0x74, 0x14, 0x7c, 0x0c, 0x40, 0x03, 0xd0, 0x14, 0x7c, 0x0c, 0x43, 0x14, 0x74, 0x02, 0xe0, 0x14, 0x7c, 0x8c, 0x43, 0x14, 0x74, 0x54, 0x7c, 0x0c, 0x43, 0x54, 0x74, 0x94, 0x7c, 0x21, 0x43, 0x91, 0x74, 0xb3, 0x42, 0x05, 0xd1, 0x00, 0x22, 0x01, 0x68, 0x03, 0x20, 0xff, 0xf7, 0x8d, 0xf8, 0x09, 0xe0, 0x00, 0x68, 0x00, 0x21, 0x3c, 0x00, 0x2c, 0x97, 0x00, 0x00, 0x02, 0x06, 0x12, 0x0e, 0x03, 0x20, 0xff, 0xf7, 0x85, 0xf8, 0x01, 0xe0, 0x0b, 0x48, 0x10, 0x60, 0x00, 0x20, 0x38, 0x71, 0x7d, 0x71, 0xf7, 0xf7, 0xe9, 0xfd, 0x01, 0x20, 0xf8, 0xbd, 0x00, 0x00, 0xcc, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x07, 0x00, 0x5c, 0x5b, 0x01, 0x00, 0xb9, 0x9b, 0x00, 0x00, 0x58, 0x5b, 0x01, 0x00, 0x95, 0x9b, 0x00, 0x00, 0x10, 0x00, 0x07, 0x00, 0x3c, 0x00, 0x68, 0x97, 0x00, 0x00, 0x55, 0x9b, 0x00, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x04, 0x30, 0x00, 0x24, 0xfe, 0xf7, 0xd6, 0xfa, 0x01, 0x20, 0x6c, 0x60, 0xb0, 0xbd, 0x00, 0x00, 0xf0, 0xb5, 0x07, 0x7a, 0x43, 0x68, 0x04, 0x1c, 0x0e, 0x48, 0x0e, 0x1c, 0x00, 0x68, 0x01, 0x25, 0x01, 0x1c, 0x9b, 0xb0, 0x06, 0xe0, 0x4a, 0x68, 0x9a, 0x42, 0x02, 0xd1, 0x8f, 0x76, 0x00, 0x25, 0x02, 0xe0, 0x09, 0x68, 0x3c, 0x00, 0xa4, 0x97, 0x00, 0x00, 0x00, 0x29, 0xf6, 0xd1, 0x00, 0x2d, 0x05, 0xd1, 0x21, 0x7a, 0x01, 0x29, 0x02, 0xd1, 0x01, 0xa9, 0xf8, 0xf7, 0xa8, 0xf8, 0x60, 0x68, 0x04, 0x36, 0x21, 0xc6, 0x1b, 0xb0, 0x01, 0x20, 0xf0, 0xbd, 0xa4, 0x6e, 0x01, 0x00, 0x10, 0xb5, 0x0c, 0x1c, 0x08, 0xf0, 0xae, 0xfc, 0x60, 0x60, 0x01, 0x20, 0x10, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x0c, 0x1c, 0x07, 0xf0, 0x84, 0xfa, 0x3c, 0x00, 0xe0, 0x97, 0x00, 0x00, 0x04, 0xf0, 0x54, 0xff, 0x00, 0x20, 0x60, 0x60, 0x01, 0x20, 0x10, 0xbd, 0x00, 0x20, 0xc0, 0x43, 0x48, 0x60, 0x01, 0x20, 0x70, 0x47, 0x00, 0x00, 0x10, 0xb5, 0x0c, 0x1c, 0x00, 0x79, 0xfa, 0xf7, 0x07, 0xf8, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x20, 0x00, 0xe0, 0x02, 0x20, 0x60, 0x60, 0x01, 0x20, 0x10, 0xbd, 0x00, 0x00, 0x1c, 0xb5, 0x06, 0x4c, 0x20, 0x68, 0x00, 0x28, 0x3c, 0x00, 0x1c, 0x98, 0x00, 0x00, 0x07, 0xd0, 0x09, 0xf0, 0xc5, 0xfa, 0x01, 0x90, 0x20, 0x68, 0x41, 0x68, 0x68, 0x46, 0xf6, 0xf7, 0xd6, 0xfd, 0x1c, 0xbd, 0xac, 0x79, 0x01, 0x00, 0x01, 0x49, 0x08, 0x60, 0x70, 0x47, 0x00, 0x00, 0xac, 0x79, 0x01, 0x00, 0x0e, 0xb5, 0x06, 0x4b, 0x1b, 0x68, 0x00, 0x2b, 0x06, 0xd0, 0x02, 0x90, 0x00, 0x91, 0x01, 0x92, 0x68, 0x46, 0xd9, 0x68, 0xf6, 0xf7, 0xc1, 0xfd, 0x3c, 0x00, 0x58, 0x98, 0x00, 0x00, 0x0e, 0xbd, 0x00, 0x00, 0xac, 0x79, 0x01, 0x00, 0x1c, 0xb5, 0x04, 0x1c, 0x07, 0xf0, 0x4c, 0xfa, 0x06, 0x48, 0x41, 0x68, 0x01, 0x31, 0x41, 0x60, 0x00, 0x94, 0x00, 0x21, 0x01, 0x91, 0x00, 0x68, 0x01, 0x68, 0x68, 0x46, 0xf6, 0xf7, 0xad, 0xfd, 0x1c, 0xbd, 0x00, 0x00, 0xac, 0x79, 0x01, 0x00, 0x80, 0xb5, 0xf8, 0xf7, 0xa3, 0xf8, 0x80, 0xbd, 0x80, 0xb5, 0x02, 0x1c, 0x3c, 0x00, 0x94, 0x98, 0x00, 0x00, 0x80, 0x21, 0x03, 0x20, 0x00, 0xf0, 0x5c, 0xf8, 0x01, 0x1c, 0x03, 0x48, 0x00, 0x22, 0x43, 0x69, 0xf6, 0xf7, 0x9b, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0xa4, 0x6d, 0x01, 0x00, 0xf8, 0xb5, 0x0c, 0x1c, 0x13, 0x49, 0x05, 0x1c, 0x08, 0x68, 0x16, 0x1c, 0x01, 0x30, 0x08, 0x60, 0x00, 0x20, 0x20, 0x61, 0x22, 0x1c, 0x10, 0x32, 0x28, 0x1d, 0x00, 0x21, 0x07, 0x1c, 0x00, 0x92, 0x3c, 0x00, 0xd0, 0x98, 0x00, 0x00, 0x03, 0xf0, 0xde, 0xfe, 0x20, 0x71, 0x20, 0x69, 0x00, 0x28, 0x10, 0xd0, 0x01, 0x04, 0x09, 0x0c, 0x00, 0x20, 0xf7, 0xf7, 0x79, 0xfe, 0x30, 0x60, 0x29, 0x1d, 0x03, 0xc9, 0xa0, 0x60, 0xe1, 0x60, 0x30, 0x68, 0x01, 0x68, 0x00, 0x9a, 0x38, 0x1c, 0x03, 0xf0, 0xca, 0xfe, 0x20, 0x71, 0x01, 0x20, 0xf8, 0xbd, 0x00, 0x00, 0x10, 0x75, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x1c, 0x3c, 0x00, 0x0c, 0x99, 0x00, 0x00, 0x08, 0x21, 0x04, 0x20, 0x09, 0xf0, 0x4e, 0xff, 0x03, 0x20, 0x80, 0xbd, 0x10, 0xb5, 0x07, 0x4a, 0x0c, 0x1c, 0x51, 0x68, 0x01, 0x31, 0x51, 0x60, 0x01, 0x1c, 0x10, 0x31, 0xc2, 0x68, 0x04, 0x30, 0x03, 0xf0, 0xf0, 0xfe, 0x20, 0x71, 0x00, 0x20, 0x10, 0xbd, 0x00, 0x00, 0x10, 0x75, 0x01, 0x00, 0x04, 0x49, 0x80, 0xb5, 0x81, 0x61, 0x08, 0x21, 0x02, 0x1c, 0x03, 0x20, 0x3c, 0x00, 0x48, 0x99, 0x00, 0x00, 0x09, 0xf0, 0x32, 0xff, 0x03, 0x20, 0x80, 0xbd, 0x95, 0xd8, 0x00, 0x00, 0xf7, 0xb5, 0x07, 0x1c, 0x16, 0x1c, 0x06, 0x21, 0x00, 0x20, 0x82, 0xb0, 0xf7, 0xf7, 0x3a, 0xfe, 0x05, 0x1c, 0x20, 0x48, 0x00, 0x78, 0x06, 0x28, 0x00, 0xd9, 0x28, 0x81, 0x2c, 0x68, 0x00, 0x20, 0xa7, 0x70, 0x03, 0x99, 0xe1, 0x70, 0x31, 0x1c, 0x03, 0xe0, 0x0a, 0x89, 0x10, 0x18, 0x0f, 0x1c, 0x3c, 0x00, 0x84, 0x99, 0x00, 0x00, 0xc9, 0x68, 0x00, 0x29, 0xf9, 0xd1, 0x6b, 0x46, 0x01, 0xaa, 0x21, 0x1d, 0x00, 0xf0, 0x34, 0xf8, 0x00, 0xab, 0x18, 0x78, 0x60, 0x71, 0x18, 0x78, 0x00, 0x28, 0x17, 0xd0, 0x11, 0x48, 0x40, 0x68, 0x00, 0x28, 0x08, 0xd0, 0x19, 0x78, 0x00, 0x20, 0xf7, 0xf7, 0x14, 0xfe, 0x01, 0x1c, 0x38, 0x1c, 0xf7, 0xf7, 0x30, 0xfd, 0x0a, 0xe0, 0x38, 0x68, 0x00, 0x28, 0x02, 0xd1, 0x3c, 0x00, 0xc0, 0x99, 0x00, 0x00, 0x3f, 0x60, 0x01, 0x20, 0xb8, 0x61, 0x00, 0xab, 0x19, 0x78, 0x38, 0x89, 0x40, 0x18, 0x38, 0x81, 0x00, 0xab, 0x98, 0x88, 0x31, 0x1c, 0x02, 0x38, 0x20, 0x80, 0x28, 0x1c, 0xf7, 0xf7, 0x1c, 0xfd, 0x28, 0x1c, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xc8, 0x5c, 0x01, 0x00, 0x01, 0x79, 0x42, 0x79, 0x00, 0x88, 0x89, 0x18, 0x02, 0x39, 0x40, 0x1a, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0xfc, 0x99, 0x00, 0x00, 0x70, 0xb5, 0x08, 0x4d, 0x2c, 0x78, 0xad, 0x78, 0x20, 0x18, 0x06, 0x1c, 0x00, 0x2d, 0x03, 0xd0, 0x70, 0x19, 0x01, 0x38, 0x01, 0x3d, 0xa8, 0x43, 0x10, 0x80, 0x80, 0x1b, 0x18, 0x70, 0x0c, 0x70, 0x70, 0xbd, 0x00, 0x00, 0xc8, 0x5c, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x68, 0x0c, 0x4a, 0x21, 0x88, 0x52, 0x78, 0x02, 0x31, 0x91, 0x42, 0x11, 0xd2, 0x55, 0x1a, 0xf7, 0xf7, 0x3c, 0x00, 0x38, 0x9a, 0x00, 0x00, 0xc9, 0xfd, 0x01, 0x68, 0x00, 0x29, 0x02, 0xd1, 0x00, 0x60, 0x01, 0x21, 0x81, 0x61, 0x01, 0x89, 0x49, 0x19, 0x01, 0x81, 0x20, 0x88, 0x40, 0x19, 0x20, 0x80, 0x60, 0x79, 0x40, 0x19, 0x60, 0x71, 0xb0, 0xbd, 0x00, 0x00, 0xc8, 0x5c, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x06, 0x21, 0xf1, 0x20, 0x09, 0xf0, 0xa2, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x03, 0x1c, 0x02, 0x48, 0x3c, 0x00, 0x74, 0x9a, 0x00, 0x00, 0x03, 0x70, 0x41, 0x70, 0x82, 0x70, 0x70, 0x47, 0xc8, 0x5c, 0x01, 0x00, 0xb0, 0xb5, 0x08, 0x1c, 0x09, 0x68, 0x15, 0x1c, 0x8c, 0x78, 0xf7, 0xf7, 0x85, 0xfd, 0x04, 0x49, 0xa0, 0x00, 0x09, 0x58, 0x00, 0x29, 0x02, 0xd0, 0x28, 0x1c, 0xf6, 0xf7, 0x9e, 0xfc, 0xb0, 0xbd, 0x84, 0x6d, 0x01, 0x00, 0xfe, 0xb5, 0x04, 0x1c, 0xc0, 0x7a, 0xa1, 0x7a, 0xc6, 0x07, 0xf6, 0x0f, 0x3c, 0x00, 0xb0, 0x9a, 0x00, 0x00, 0x32, 0x1c, 0x20, 0x1d, 0x01, 0xf0, 0x3c, 0xf8, 0x60, 0x69, 0x25, 0x4f, 0xc1, 0x07, 0x37, 0xd5, 0xb8, 0x69, 0x00, 0x28, 0x01, 0xd0, 0xf6, 0xf7, 0x87, 0xfc, 0x20, 0x68, 0x05, 0x68, 0x28, 0x88, 0x80, 0x07, 0x34, 0xd1, 0x01, 0xaa, 0x02, 0xa9, 0x28, 0x1c, 0x01, 0xf0, 0x0b, 0xfc, 0x28, 0x1c, 0x01, 0xf0, 0x12, 0xfc, 0x00, 0x78, 0xc0, 0x07, 0x0a, 0xd4, 0x60, 0x69, 0x3c, 0x00, 0xec, 0x9a, 0x00, 0x00, 0x80, 0x07, 0x26, 0xd4, 0x33, 0x1c, 0x29, 0x1c, 0xa2, 0x7a, 0x20, 0x69, 0x7d, 0x69, 0xf6, 0xf7, 0x72, 0xfc, 0x1e, 0xe0, 0x00, 0xab, 0x18, 0x7a, 0x00, 0x28, 0x03, 0xd0, 0x01, 0x28, 0x06, 0xd0, 0x02, 0x28, 0x16, 0xd1, 0x28, 0x1c, 0x79, 0x6a, 0xf6, 0xf7, 0x61, 0xfc, 0x11, 0xe0, 0x00, 0xab, 0x18, 0x79, 0x0e, 0x28, 0x01, 0xd0, 0x0f, 0x28, 0x0b, 0xd1, 0x28, 0x1c, 0x3c, 0x00, 0x28, 0x9b, 0x00, 0x00, 0x39, 0x6a, 0xf6, 0xf7, 0x56, 0xfc, 0x06, 0xe0, 0x00, 0x07, 0x80, 0x0f, 0x03, 0xd1, 0x20, 0x69, 0xf9, 0x69, 0xf6, 0xf7, 0x4e, 0xfc, 0x78, 0x6b, 0x21, 0x21, 0x01, 0x30, 0x78, 0x63, 0x22, 0x1c, 0x80, 0x20, 0x09, 0xf0, 0x31, 0xfe, 0xfe, 0xbd, 0x28, 0x7a, 0x01, 0x00, 0x0b, 0x49, 0x18, 0xb5, 0x08, 0x78, 0xc0, 0x07, 0x11, 0xd5, 0x0a, 0x4a, 0x10, 0x1c, 0x20, 0x30, 0x3c, 0x00, 0x64, 0x9b, 0x00, 0x00, 0x84, 0x79, 0x00, 0xab, 0x1c, 0x70, 0xc0, 0x79, 0x58, 0x70, 0x08, 0x78, 0x40, 0x23, 0x18, 0x43, 0x08, 0x70, 0x05, 0x48, 0x00, 0x78, 0x08, 0x70, 0x00, 0xab, 0x18, 0x88, 0xd0, 0x84, 0x18, 0xbd, 0x04, 0x00, 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0xe0, 0x60, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x05, 0x49, 0x10, 0xb5, 0x88, 0x79, 0x05, 0x4b, 0x1a, 0x7c, 0x05, 0x4c, 0x3c, 0x00, 0xa0, 0x9b, 0x00, 0x00, 0x24, 0x68, 0x62, 0x40, 0x1a, 0x74, 0x88, 0x71, 0x10, 0xbd, 0x00, 0x00, 0x20, 0x10, 0x07, 0x00, 0x10, 0x00, 0x07, 0x00, 0x58, 0x5b, 0x01, 0x00, 0x04, 0x49, 0x0a, 0x68, 0x04, 0x48, 0x00, 0x68, 0x02, 0x40, 0x01, 0xd0, 0x88, 0x61, 0x70, 0x47, 0x48, 0x61, 0x70, 0x47, 0x10, 0x00, 0x07, 0x00, 0x58, 0x5b, 0x01, 0x00, 0x02, 0x1c, 0x01, 0x20, 0x00, 0x06, 0x08, 0x43, 0x3c, 0x00, 0xdc, 0x9b, 0x00, 0x00, 0x80, 0xb5, 0x2a, 0x21, 0x09, 0xf0, 0xe6, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x00, 0x29, 0x03, 0xd0, 0x81, 0x29, 0x07, 0xd1, 0x81, 0x20, 0x00, 0xe0, 0x80, 0x20, 0x22, 0x1c, 0x2c, 0x21, 0x09, 0xf0, 0xd7, 0xfd, 0x10, 0xbd, 0x02, 0x21, 0x2c, 0x20, 0xf7, 0xf7, 0x4c, 0xfb, 0x20, 0x1c, 0xf7, 0xf7, 0xc3, 0xfc, 0x10, 0xbd, 0x80, 0xb5, 0xb4, 0xb0, 0x3c, 0x00, 0x18, 0x9c, 0x00, 0x00, 0x01, 0x28, 0x06, 0xd0, 0x82, 0x28, 0x1c, 0xd1, 0x1a, 0xa8, 0x07, 0xf0, 0x35, 0xfc, 0x34, 0xb0, 0x80, 0xbd, 0x81, 0x29, 0x13, 0xd1, 0x0d, 0x48, 0x0c, 0x4a, 0x81, 0x69, 0x00, 0x68, 0x50, 0x32, 0x81, 0x42, 0x02, 0xd0, 0xd1, 0x6a, 0x01, 0x29, 0x02, 0xd0, 0x11, 0x78, 0x02, 0x29, 0x02, 0xd1, 0x07, 0xf0, 0x0a, 0xf9, 0xeb, 0xe7, 0x69, 0x46, 0xf7, 0xf7, 0x5a, 0xfe, 0x3c, 0x00, 0x54, 0x9c, 0x00, 0x00, 0xe7, 0xe7, 0x01, 0x21, 0x00, 0xe0, 0x02, 0x21, 0x18, 0x20, 0xf7, 0xf7, 0x21, 0xfb, 0xe0, 0xe7, 0xa4, 0x6e, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x00, 0x68, 0x17, 0x4d, 0x9a, 0xb0, 0x68, 0x63, 0x08, 0xf0, 0x3e, 0xfa, 0x20, 0x79, 0x14, 0x49, 0x13, 0x4a, 0x50, 0x39, 0x2c, 0x3a, 0x02, 0x28, 0x0a, 0xd1, 0x90, 0x68, 0x80, 0x02, 0xa8, 0x61, 0xc8, 0x68, 0xe8, 0x61, 0x3c, 0x00, 0x90, 0x9c, 0x00, 0x00, 0x02, 0x20, 0x28, 0x72, 0x07, 0xf0, 0xe4, 0xf8, 0x1a, 0xb0, 0xb0, 0xbd, 0x03, 0x1c, 0x00, 0x20, 0x00, 0x2b, 0x0b, 0xd1, 0x52, 0x68, 0x92, 0x02, 0xaa, 0x61, 0x0a, 0x1c, 0x89, 0x68, 0xe9, 0x61, 0x28, 0x72, 0x10, 0x68, 0x69, 0x46, 0xf7, 0xf7, 0x27, 0xfe, 0xed, 0xe7, 0xa8, 0x61, 0x01, 0x20, 0x28, 0x72, 0x28, 0x70, 0x00, 0x20, 0x06, 0xf0, 0x7d, 0xfa, 0xe5, 0xe7, 0x3c, 0x00, 0xcc, 0x9c, 0x00, 0x00, 0xf4, 0x6e, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x21, 0x07, 0x20, 0xf7, 0xf7, 0xe1, 0xfa, 0x80, 0xbd, 0x70, 0x47, 0x00, 0x00, 0xf8, 0xb5, 0x00, 0x24, 0x19, 0x4a, 0x00, 0x26, 0xd5, 0x68, 0x11, 0x68, 0x04, 0x35, 0x08, 0x1c, 0x91, 0x60, 0x02, 0xe0, 0x01, 0x1c, 0x40, 0x19, 0x08, 0x60, 0x53, 0x68, 0x83, 0x42, 0xf9, 0xd8, 0x3c, 0x00, 0x08, 0x9d, 0x00, 0x00, 0x01, 0x34, 0x10, 0x32, 0x03, 0x2c, 0x0e, 0x60, 0xee, 0xd3, 0xf6, 0xf7, 0xf1, 0xff, 0x10, 0x48, 0x10, 0x49, 0x12, 0x4c, 0x08, 0x60, 0x10, 0x49, 0x00, 0x20, 0x01, 0x22, 0x19, 0x23, 0x5b, 0x01, 0x0c, 0x25, 0x43, 0x43, 0x1b, 0x19, 0x45, 0x43, 0x4a, 0x51, 0x1f, 0x1c, 0x6d, 0x18, 0xab, 0x60, 0x6b, 0x60, 0x00, 0x25, 0x1e, 0x1c, 0x14, 0x36, 0x9e, 0x60, 0x33, 0x1c, 0x3c, 0x00, 0x44, 0x9d, 0x00, 0x00, 0x01, 0x35, 0x27, 0x2d, 0xf8, 0xdb, 0x01, 0x30, 0x03, 0x28, 0x9f, 0x60, 0xe8, 0xdb, 0xf8, 0xbd, 0x20, 0x57, 0x01, 0x00, 0x14, 0xc8, 0x01, 0x00, 0xb4, 0xcf, 0x01, 0x00, 0x18, 0xd9, 0x01, 0x00, 0xb8, 0xcf, 0x01, 0x00, 0xb0, 0xb5, 0x07, 0x4c, 0x25, 0x1c, 0xc0, 0x35, 0x28, 0x6b, 0x1e, 0x21, 0x00, 0xf0, 0xf2, 0xf9, 0xa2, 0x6b, 0x20, 0x1c, 0xdc, 0x30, 0x29, 0x6b, 0x3c, 0x00, 0x80, 0x9d, 0x00, 0x00, 0x00, 0xf0, 0xb6, 0xf9, 0xb0, 0xbd, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x00, 0x20, 0x10, 0x22, 0x10, 0xb5, 0x0a, 0x49, 0x05, 0xe0, 0x0c, 0x23, 0x43, 0x43, 0x5c, 0x18, 0x0c, 0x34, 0xcc, 0x50, 0x01, 0x30, 0x0f, 0x28, 0xf7, 0xd3, 0x0c, 0x23, 0x58, 0x43, 0x09, 0x50, 0x04, 0x48, 0x41, 0x60, 0x01, 0x60, 0x02, 0x82, 0x00, 0x21, 0x81, 0x60, 0xc1, 0x60, 0x10, 0xbd, 0x3c, 0x00, 0xbc, 0x9d, 0x00, 0x00, 0x84, 0xe2, 0x01, 0x00, 0x44, 0xe3, 0x01, 0x00, 0x10, 0xb5, 0x08, 0x4c, 0xa0, 0x6a, 0x00, 0x28, 0x03, 0xd1, 0x07, 0x48, 0xf9, 0xf7, 0xe8, 0xfe, 0xa0, 0x62, 0x04, 0x48, 0x44, 0x30, 0x00, 0x68, 0x01, 0x21, 0xf9, 0xf7, 0x95, 0xfc, 0x60, 0x62, 0x10, 0xbd, 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, 0xcd, 0x26, 0x01, 0x00, 0xff, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x1e, 0x1c, 0x3c, 0x00, 0xf8, 0x9d, 0x00, 0x00, 0x81, 0xb0, 0x0a, 0x9f, 0x1c, 0x21, 0xf6, 0xf7, 0x4d, 0xfb, 0x03, 0x98, 0xa0, 0x61, 0x25, 0x60, 0x25, 0x61, 0x26, 0x81, 0xa6, 0x82, 0xe7, 0x60, 0x05, 0xb0, 0xf0, 0xbd, 0x70, 0xb5, 0x0d, 0x1c, 0xa4, 0x21, 0x04, 0x1c, 0x08, 0x30, 0xf6, 0xf7, 0x3d, 0xfb, 0x20, 0x1c, 0x44, 0x30, 0x06, 0x22, 0x29, 0x1c, 0xf6, 0xf7, 0x65, 0xfb, 0x18, 0x48, 0x3c, 0x23, 0x41, 0x1c, 0x3c, 0x00, 0x34, 0x9e, 0x00, 0x00, 0x61, 0x62, 0x41, 0x78, 0x59, 0x43, 0x09, 0x18, 0x89, 0x7a, 0x06, 0x29, 0x01, 0xd1, 0xa0, 0x62, 0x02, 0xe0, 0x21, 0x1c, 0x4d, 0x31, 0xa1, 0x62, 0x41, 0x78, 0x3c, 0x23, 0x59, 0x43, 0x08, 0x18, 0x04, 0x30, 0x0f, 0x49, 0x20, 0x62, 0x0b, 0x88, 0x00, 0x2b, 0x15, 0xd0, 0xac, 0x20, 0x00, 0x5d, 0x0b, 0x4a, 0x18, 0x32, 0x00, 0x02, 0x80, 0x18, 0xb0, 0x30, 0xe0, 0x60, 0x3c, 0x00, 0x70, 0x9e, 0x00, 0x00, 0x8d, 0x68, 0x00, 0x20, 0x08, 0xe0, 0xe2, 0x68, 0xc1, 0x00, 0x54, 0x50, 0xe6, 0x68, 0x82, 0x00, 0x52, 0x19, 0x71, 0x18, 0x4a, 0x60, 0x01, 0x30, 0x98, 0x42, 0xf4, 0xdb, 0x70, 0xbd, 0x00, 0x00, 0x68, 0x61, 0x01, 0x00, 0x58, 0x75, 0x01, 0x00, 0x1f, 0xb5, 0x04, 0x1c, 0x60, 0x34, 0x61, 0x7a, 0x03, 0x1c, 0x80, 0x6a, 0x08, 0x4a, 0x02, 0x91, 0x01, 0x90, 0x03, 0x92, 0x3c, 0x00, 0xac, 0x9e, 0x00, 0x00, 0xe2, 0x79, 0x18, 0x1c, 0x20, 0x30, 0x00, 0x92, 0x44, 0x7b, 0x82, 0x7b, 0x5e, 0x20, 0xc1, 0x5a, 0x18, 0x69, 0x04, 0x30, 0x23, 0x1c, 0x02, 0xf0, 0x7f, 0xfe, 0x1f, 0xbd, 0x39, 0x4e, 0x00, 0x00, 0xb0, 0xb5, 0x0b, 0x1c, 0x01, 0x88, 0x69, 0x20, 0xc0, 0x5c, 0x86, 0xb0, 0x0e, 0x4a, 0x04, 0x91, 0x03, 0x90, 0x05, 0x92, 0x0d, 0x4d, 0x59, 0x6a, 0x9a, 0x6a, 0x2d, 0x68, 0x3c, 0x00, 0xe8, 0x9e, 0x00, 0x00, 0x01, 0x24, 0x00, 0x2d, 0x00, 0xd0, 0x04, 0x1c, 0x0a, 0x48, 0x00, 0x5d, 0x01, 0x91, 0x02, 0x92, 0x00, 0x90, 0x18, 0x1c, 0x20, 0x30, 0x44, 0x7b, 0x82, 0x7b, 0x5e, 0x20, 0xc1, 0x5a, 0x18, 0x69, 0x04, 0x30, 0x23, 0x1c, 0x02, 0xf0, 0xa4, 0xfe, 0x06, 0xb0, 0xb0, 0xbd, 0x51, 0x4f, 0x00, 0x00, 0x18, 0x67, 0x01, 0x00, 0x0a, 0x61, 0x01, 0x00, 0x01, 0x89, 0x8a, 0x1c, 0x3c, 0x00, 0x24, 0x9f, 0x00, 0x00, 0x02, 0x81, 0x02, 0x68, 0x02, 0x3a, 0x02, 0x60, 0x08, 0x0a, 0x09, 0x02, 0x08, 0x43, 0x10, 0x80, 0x70, 0x47, 0x00, 0x00, 0x70, 0xb5, 0x05, 0x1c, 0x08, 0x78, 0x0e, 0x1c, 0xff, 0x28, 0x14, 0xd0, 0x71, 0x78, 0x02, 0x31, 0x00, 0x20, 0xf7, 0xf7, 0x45, 0xfb, 0x04, 0x1c, 0x02, 0x89, 0x00, 0x68, 0x31, 0x1c, 0xf6, 0xf7, 0xcf, 0xfa, 0x00, 0x2d, 0x06, 0xd0, 0x28, 0x1c, 0x3c, 0x00, 0x60, 0x9f, 0x00, 0x00, 0xf7, 0xf7, 0x34, 0xfb, 0x21, 0x1c, 0xf7, 0xf7, 0x57, 0xfa, 0x00, 0xe0, 0x25, 0x1c, 0x28, 0x1c, 0x70, 0xbd, 0x00, 0x00, 0xff, 0xb5, 0x0f, 0x1c, 0x1e, 0x1c, 0x04, 0x1c, 0x98, 0x1c, 0x01, 0x04, 0x09, 0x0c, 0x00, 0x20, 0x81, 0xb0, 0xf7, 0xf7, 0x27, 0xfb, 0x05, 0x1c, 0x00, 0x68, 0x00, 0x2c, 0x38, 0x60, 0x03, 0x99, 0x01, 0x70, 0x38, 0x68, 0x46, 0x70, 0x06, 0xd0, 0x3c, 0x00, 0x9c, 0x9f, 0x00, 0x00, 0x20, 0x1c, 0xf7, 0xf7, 0x15, 0xfb, 0x29, 0x1c, 0xf7, 0xf7, 0x38, 0xfa, 0x00, 0xe0, 0x2c, 0x1c, 0x20, 0x1c, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x10, 0x48, 0x04, 0x68, 0x04, 0x60, 0x0f, 0x49, 0x20, 0x20, 0x08, 0x60, 0xa0, 0x05, 0x0e, 0x4e, 0x02, 0xd5, 0x70, 0x6a, 0xf6, 0xf7, 0x05, 0xfa, 0xe0, 0x01, 0x02, 0xd5, 0x30, 0x6e, 0xf6, 0xf7, 0x00, 0xfa, 0x3c, 0x00, 0xd8, 0x9f, 0x00, 0x00, 0x0a, 0x48, 0x04, 0x40, 0x00, 0x25, 0x07, 0xe0, 0xe0, 0x07, 0x03, 0xd5, 0xa8, 0x00, 0x30, 0x58, 0xf6, 0xf7, 0xf6, 0xf9, 0x01, 0x35, 0x64, 0x08, 0x00, 0x2c, 0xf5, 0xd1, 0x70, 0xbd, 0x00, 0x00, 0x00, 0x40, 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0x30, 0x74, 0x01, 0x00, 0xff, 0xfd, 0xff, 0xfe, 0x80, 0xb5, 0x07, 0x21, 0x80, 0x20, 0xf7, 0xf7, 0x49, 0xf9, 0x80, 0xbd, 0x3c, 0x00, 0x14, 0xa0, 0x00, 0x00, 0xf8, 0xb5, 0x14, 0x4b, 0x82, 0x00, 0x9c, 0x58, 0xca, 0x06, 0x01, 0x27, 0x39, 0x1c, 0xd2, 0x0e, 0x91, 0x40, 0x11, 0x4a, 0x11, 0x60, 0x11, 0x4e, 0x40, 0x00, 0x85, 0x19, 0x15, 0xe0, 0x60, 0x60, 0x20, 0x7b, 0xc1, 0x00, 0x89, 0x19, 0x10, 0x31, 0x0a, 0x78, 0x0d, 0x23, 0x9a, 0x43, 0x0a, 0x70, 0x39, 0x1c, 0x81, 0x40, 0x31, 0x73, 0x07, 0x49, 0x00, 0x01, 0x08, 0x31, 0x3c, 0x00, 0x50, 0xa0, 0x00, 0x00, 0x40, 0x18, 0x08, 0x4a, 0x41, 0x68, 0x42, 0x60, 0x80, 0x68, 0xf6, 0xf7, 0xbe, 0xf9, 0x28, 0x7b, 0x00, 0x28, 0xe6, 0xd1, 0xf8, 0xbd, 0x00, 0x00, 0xa4, 0x73, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, 0x00, 0x60, 0x07, 0x00, 0xd1, 0x75, 0x00, 0x00, 0x03, 0x49, 0x01, 0x20, 0x09, 0x7a, 0x00, 0x29, 0x00, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x04, 0x7a, 0x01, 0x00, 0x3c, 0x00, 0x8c, 0xa0, 0x00, 0x00, 0x03, 0x49, 0x01, 0x20, 0x89, 0x7a, 0x00, 0x29, 0x00, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, 0xb0, 0xb5, 0x00, 0x24, 0xfa, 0xf7, 0x76, 0xfc, 0x00, 0x28, 0x14, 0xd0, 0x01, 0x24, 0x08, 0xf0, 0x7d, 0xfe, 0x0a, 0x4d, 0x0a, 0x4b, 0x00, 0x21, 0x5a, 0x18, 0xa0, 0x32, 0x12, 0x78, 0x10, 0x2a, 0x06, 0xd3, 0x8a, 0x00, 0xd2, 0x18, 0x92, 0x6f, 0x3c, 0x00, 0xc8, 0xa0, 0x00, 0x00, 0x82, 0x1a, 0xaa, 0x42, 0x00, 0xd2, 0x00, 0x24, 0x01, 0x31, 0x03, 0x29, 0xf0, 0xd3, 0x20, 0x1c, 0xb0, 0xbd, 0x00, 0x00, 0x8b, 0x08, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x01, 0x48, 0xc0, 0x68, 0x70, 0x47, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x70, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x16, 0x1c, 0xfd, 0xf7, 0x2e, 0xfe, 0x00, 0x20, 0xe0, 0x60, 0x26, 0x61, 0xa5, 0x60, 0x3c, 0x00, 0x04, 0xa1, 0x00, 0x00, 0x70, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x17, 0x1c, 0x0e, 0x1c, 0x04, 0x1c, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x2e, 0x01, 0xd1, 0xf7, 0xf7, 0xf2, 0xf8, 0xa0, 0x68, 0x07, 0xf0, 0x49, 0xf9, 0x05, 0x1c, 0x01, 0xd1, 0xf7, 0xf7, 0xeb, 0xf8, 0x29, 0x1c, 0x6e, 0x60, 0xaf, 0x60, 0x20, 0x1c, 0xfd, 0xf7, 0xfd, 0xfd, 0xe0, 0x68, 0x41, 0x1c, 0xe1, 0x60, 0x00, 0x28, 0x03, 0xd1, 0x3c, 0x00, 0x40, 0xa1, 0x00, 0x00, 0x05, 0x48, 0x21, 0x69, 0x05, 0xf0, 0x2c, 0xf9, 0x20, 0x68, 0xa8, 0x42, 0x02, 0xd1, 0x38, 0x1c, 0xf6, 0xf7, 0x48, 0xf9, 0xf8, 0xbd, 0x00, 0x00, 0xc4, 0x60, 0x01, 0x00, 0x00, 0x22, 0x01, 0x39, 0x10, 0xb5, 0x05, 0xe0, 0x0c, 0x23, 0x53, 0x43, 0x1c, 0x18, 0x0c, 0x34, 0xc4, 0x50, 0x01, 0x32, 0x8a, 0x42, 0xf7, 0xd3, 0x00, 0x21, 0x0c, 0x23, 0x5a, 0x43, 0x81, 0x50, 0x3c, 0x00, 0x7c, 0xa1, 0x00, 0x00, 0x10, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x01, 0xd1, 0xf7, 0xf7, 0xbb, 0xf8, 0x20, 0x1c, 0xfd, 0xf7, 0xda, 0xfd, 0x01, 0x1c, 0x85, 0x68, 0xa0, 0x68, 0x07, 0xf0, 0x09, 0xf9, 0xe0, 0x68, 0x01, 0x38, 0xe0, 0x60, 0x03, 0xd1, 0x06, 0x48, 0x21, 0x69, 0x05, 0xf0, 0xe7, 0xf8, 0x21, 0x68, 0x00, 0x29, 0x03, 0xd0, 0x88, 0x68, 0x49, 0x68, 0xf6, 0xf7, 0x11, 0xf9, 0x3c, 0x00, 0xb8, 0xa1, 0x00, 0x00, 0x28, 0x1c, 0xb0, 0xbd, 0xc4, 0x60, 0x01, 0x00, 0x01, 0x21, 0x00, 0x28, 0x8c, 0xb5, 0x00, 0xd1, 0x00, 0x21, 0x0e, 0x20, 0x09, 0xf0, 0x32, 0xfa, 0x83, 0x20, 0x00, 0xab, 0x18, 0x80, 0x00, 0x20, 0x04, 0xf0, 0x0c, 0xf8, 0x01, 0x90, 0x68, 0x46, 0x03, 0xf0, 0x7a, 0xf9, 0x8c, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x08, 0xf0, 0xdf, 0xfd, 0x06, 0x49, 0x0a, 0x89, 0x06, 0x49, 0x3c, 0x00, 0xf4, 0xa1, 0x00, 0x00, 0x09, 0x6e, 0x41, 0x1a, 0x0b, 0x0c, 0x59, 0x18, 0x89, 0x1a, 0x09, 0x04, 0x09, 0x0c, 0x40, 0x1a, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x90, 0x07, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x88, 0x7e, 0x0d, 0x1c, 0x20, 0x28, 0x03, 0xd9, 0x03, 0x21, 0x18, 0x20, 0xf7, 0xf7, 0x40, 0xf8, 0x00, 0x26, 0x26, 0x76, 0xa8, 0x7e, 0x29, 0x1c, 0x1b, 0x31, 0x60, 0x76, 0x3c, 0x00, 0x30, 0xa2, 0x00, 0x00, 0x20, 0x1c, 0x1d, 0x30, 0xaa, 0x7e, 0xf6, 0xf7, 0x5f, 0xf9, 0x68, 0x68, 0x29, 0x1c, 0x60, 0x60, 0xa8, 0x68, 0x13, 0x31, 0xa0, 0x60, 0xa8, 0x7b, 0x06, 0x22, 0x20, 0x73, 0xe8, 0x7b, 0x60, 0x73, 0x28, 0x7c, 0xa0, 0x73, 0x68, 0x7c, 0xe0, 0x73, 0xa8, 0x89, 0x20, 0x82, 0xa8, 0x7c, 0xe0, 0x76, 0x26, 0x77, 0x20, 0x1c, 0x12, 0x30, 0xa6, 0x76, 0xf6, 0xf7, 0x46, 0xf9, 0x3c, 0x00, 0x6c, 0xa2, 0x00, 0x00, 0x60, 0x68, 0x43, 0x1c, 0x1d, 0xd0, 0x11, 0x4d, 0x6d, 0x61, 0x28, 0x68, 0x00, 0x28, 0x1a, 0xd0, 0x22, 0x7b, 0x01, 0x1c, 0x0b, 0x7b, 0x9a, 0x42, 0x01, 0xd3, 0x20, 0x60, 0x14, 0xe0, 0x0b, 0x1c, 0x09, 0x68, 0x00, 0x29, 0x0b, 0xd0, 0x0e, 0x7b, 0xb2, 0x42, 0x08, 0xd2, 0x0b, 0x68, 0x00, 0x2b, 0xf0, 0xd0, 0x1e, 0x7b, 0xb2, 0x42, 0xed, 0xd3, 0x23, 0x60, 0x0c, 0x60, 0x3c, 0x00, 0xa8, 0xa2, 0x00, 0x00, 0x01, 0xe0, 0x21, 0x60, 0x1c, 0x60, 0x00, 0x20, 0x70, 0xbd, 0x26, 0x60, 0x2c, 0x60, 0xfa, 0xe7, 0xa4, 0x6e, 0x01, 0x00, 0x13, 0x4a, 0xb0, 0xb5, 0x51, 0x68, 0x01, 0x24, 0x00, 0x29, 0x1e, 0xd0, 0x13, 0x1d, 0xd1, 0x61, 0x13, 0x62, 0x43, 0x68, 0x04, 0xe0, 0x10, 0x62, 0x00, 0x68, 0xd0, 0x61, 0x00, 0x28, 0x14, 0xd0, 0xd0, 0x69, 0x45, 0x68, 0x9d, 0x42, 0xf6, 0xd1, 0x3c, 0x00, 0xe4, 0xa2, 0x00, 0x00, 0x10, 0x6a, 0x81, 0x42, 0x04, 0xd1, 0x51, 0x60, 0xd0, 0x69, 0x00, 0x68, 0x08, 0x60, 0x02, 0xe0, 0xd1, 0x69, 0x09, 0x68, 0x01, 0x60, 0xd0, 0x69, 0xfc, 0xf7, 0xce, 0xff, 0x00, 0x28, 0x00, 0xd0, 0x00, 0x24, 0x20, 0x1c, 0xb0, 0xbd, 0x00, 0x00, 0xa4, 0x6e, 0x01, 0x00, 0xb0, 0xb5, 0x17, 0x4d, 0x01, 0x24, 0x29, 0x68, 0x00, 0x29, 0x27, 0xd0, 0x6d, 0x61, 0x29, 0x61, 0x3c, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x43, 0x68, 0x04, 0xe0, 0x68, 0x61, 0x00, 0x68, 0x28, 0x61, 0x00, 0x28, 0x1d, 0xd0, 0x28, 0x69, 0x42, 0x68, 0x9a, 0x42, 0xf6, 0xd1, 0xaa, 0x69, 0x2b, 0x69, 0x9a, 0x42, 0x00, 0xd1, 0xa9, 0x61, 0x6a, 0x69, 0x91, 0x42, 0x03, 0xd1, 0x29, 0x60, 0x00, 0x68, 0x08, 0x60, 0x06, 0xe0, 0x00, 0x68, 0x10, 0x60, 0x28, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x07, 0xf0, 0xcc, 0xfe, 0x3c, 0x00, 0x5c, 0xa3, 0x00, 0x00, 0x28, 0x69, 0xfc, 0xf7, 0x9d, 0xff, 0x00, 0x28, 0x02, 0xd0, 0x00, 0x24, 0x00, 0xe0, 0x01, 0x24, 0x20, 0x1c, 0xb0, 0xbd, 0xa4, 0x6e, 0x01, 0x00, 0xb0, 0xb5, 0x05, 0x1c, 0x07, 0x48, 0x44, 0x68, 0x07, 0xe0, 0x21, 0x1c, 0x44, 0x31, 0x28, 0x1c, 0x00, 0xf0, 0xd6, 0xfc, 0x00, 0x28, 0x02, 0xd1, 0x64, 0x68, 0x00, 0x2c, 0xf5, 0xd1, 0x20, 0x1c, 0xb0, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xa3, 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, 0x70, 0xb5, 0x0d, 0x1c, 0x14, 0x1c, 0x00, 0x28, 0x0b, 0x4e, 0x08, 0xd0, 0x70, 0x6e, 0x06, 0x23, 0x58, 0x43, 0x02, 0x04, 0x12, 0x0c, 0x31, 0x1c, 0x28, 0x1c, 0x22, 0x80, 0x07, 0xe0, 0x21, 0x88, 0x06, 0x20, 0xf6, 0xf7, 0xa7, 0xf9, 0x70, 0x66, 0x22, 0x88, 0x29, 0x1c, 0x30, 0x1c, 0xf6, 0xf7, 0x95, 0xf8, 0x01, 0x20, 0x70, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0xd4, 0xa3, 0x00, 0x00, 0x10, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x03, 0x28, 0x03, 0xd8, 0x04, 0x4a, 0xc0, 0x00, 0x11, 0x50, 0x80, 0xbd, 0x01, 0x21, 0x26, 0x20, 0xf6, 0xf7, 0x5b, 0xff, 0x80, 0xbd, 0x7c, 0x79, 0x01, 0x00, 0xb0, 0xb5, 0x05, 0x1c, 0xc0, 0x68, 0x01, 0x89, 0x39, 0x29, 0x39, 0xd3, 0x04, 0x68, 0xa0, 0x79, 0x88, 0x28, 0x35, 0xd1, 0xe0, 0x79, 0x8e, 0x28, 0x32, 0xd1, 0x20, 0x7a, 0x3c, 0x00, 0x10, 0xa4, 0x00, 0x00, 0x01, 0x28, 0x2f, 0xd1, 0x60, 0x7a, 0x03, 0x28, 0x2c, 0xd1, 0x20, 0x7b, 0x02, 0x28, 0x01, 0xd0, 0xfe, 0x28, 0x27, 0xd1, 0x60, 0x7b, 0x1d, 0x21, 0x08, 0x40, 0x01, 0x28, 0x22, 0xd1, 0xa0, 0x7b, 0xc8, 0x21, 0x08, 0x40, 0x08, 0x28, 0x1d, 0xd1, 0xa8, 0x1d, 0xfb, 0xf7, 0xe1, 0xf9, 0x00, 0x28, 0x18, 0xd0, 0x19, 0x20, 0x21, 0x5c, 0x00, 0x29, 0x14, 0xd1, 0x01, 0x30, 0x3c, 0x00, 0x4c, 0xa4, 0x00, 0x00, 0x39, 0x28, 0xf9, 0xdb, 0x68, 0x8b, 0x04, 0x21, 0x08, 0x43, 0x68, 0x83, 0x03, 0xf0, 0xd6, 0xfe, 0x00, 0x28, 0x09, 0xd1, 0x00, 0x23, 0x00, 0x22, 0x26, 0x20, 0x04, 0x49, 0x09, 0xf0, 0x92, 0xf9, 0x03, 0x48, 0x00, 0x68, 0x01, 0xf0, 0x84, 0xf9, 0xb0, 0xbd, 0x00, 0x00, 0x50, 0xc3, 0x00, 0x00, 0x0c, 0x79, 0x01, 0x00, 0xb0, 0xb5, 0x08, 0x4c, 0xa3, 0x68, 0x01, 0x33, 0x3c, 0x00, 0x88, 0xa4, 0x00, 0x00, 0xa3, 0x60, 0x0c, 0x1c, 0x09, 0xd0, 0x25, 0x68, 0x00, 0x2d, 0x03, 0xd0, 0x23, 0x7a, 0x61, 0x68, 0xf5, 0xf7, 0xa3, 0xff, 0x20, 0x1c, 0xf7, 0xf7, 0xa9, 0xf9, 0xb0, 0xbd, 0x94, 0x79, 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0x01, 0x89, 0x05, 0x68, 0x08, 0x29, 0x53, 0xd3, 0x06, 0x22, 0x28, 0x1c, 0x55, 0x49, 0xf5, 0xf7, 0x9e, 0xff, 0x00, 0x28, 0x37, 0xd1, 0x3c, 0x00, 0xc4, 0xa4, 0x00, 0x00, 0xe9, 0x88, 0x52, 0x4e, 0x04, 0x3e, 0x81, 0x29, 0x24, 0xd1, 0xe5, 0x68, 0x29, 0x68, 0x08, 0x7a, 0x4a, 0x7a, 0x00, 0x02, 0x80, 0x18, 0x00, 0x04, 0x00, 0x0c, 0x42, 0x0b, 0x00, 0x05, 0x00, 0x0d, 0xe2, 0x75, 0x20, 0x83, 0x4b, 0x89, 0x00, 0x20, 0x42, 0x00, 0xb2, 0x5a, 0x9a, 0x42, 0x06, 0xd1, 0x28, 0x89, 0x0c, 0x38, 0x02, 0x0a, 0x00, 0x02, 0x10, 0x43, 0x48, 0x81, 0x3c, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x02, 0xe0, 0x01, 0x30, 0x02, 0x28, 0xf1, 0xd3, 0xe0, 0x68, 0x01, 0x89, 0x0a, 0x39, 0x01, 0x81, 0xe0, 0x68, 0x01, 0x68, 0x0a, 0x31, 0x1c, 0xe0, 0x00, 0x22, 0x00, 0x20, 0x43, 0x00, 0xf3, 0x5a, 0x8b, 0x42, 0x01, 0xd1, 0x01, 0x22, 0x02, 0xe0, 0x01, 0x30, 0x02, 0x28, 0xf6, 0xd3, 0x00, 0x2a, 0x11, 0xd1, 0x07, 0xe0, 0x36, 0x49, 0x06, 0x22, 0x06, 0x31, 0x28, 0x1c, 0x3c, 0x00, 0x3c, 0xa5, 0x00, 0x00, 0xf5, 0xf7, 0x5e, 0xff, 0x00, 0x28, 0x08, 0xd1, 0xe0, 0x68, 0x01, 0x89, 0x06, 0x39, 0x01, 0x81, 0xe0, 0x68, 0x01, 0x68, 0x06, 0x31, 0x01, 0x60, 0x10, 0xe0, 0xe0, 0x68, 0xff, 0xf7, 0xe2, 0xfc, 0x0c, 0xe0, 0x02, 0x31, 0x01, 0x81, 0xe0, 0x68, 0x01, 0x68, 0x02, 0x39, 0x01, 0x60, 0xe0, 0x68, 0x00, 0x89, 0x02, 0x38, 0x02, 0x0a, 0x00, 0x02, 0x10, 0x43, 0x08, 0x80, 0x3c, 0x00, 0x78, 0xa5, 0x00, 0x00, 0xe0, 0x68, 0x03, 0x25, 0x02, 0x89, 0x01, 0x68, 0x24, 0x4e, 0x02, 0x2a, 0x10, 0xd9, 0x09, 0x88, 0x08, 0x29, 0x05, 0xd0, 0xc1, 0x23, 0xdb, 0x00, 0x99, 0x42, 0x03, 0xd1, 0x01, 0x25, 0x02, 0xe0, 0x00, 0x25, 0x00, 0xe0, 0x02, 0x25, 0xe9, 0x00, 0x71, 0x58, 0x00, 0x29, 0x00, 0xd1, 0x02, 0x25, 0xf7, 0xf7, 0x04, 0xf8, 0xe9, 0x00, 0x89, 0x19, 0x89, 0x88, 0x88, 0x42, 0x3c, 0x00, 0xb4, 0xa5, 0x00, 0x00, 0x00, 0xd9, 0x03, 0x25, 0xa1, 0x1d, 0x20, 0x1c, 0xfd, 0xf7, 0x34, 0xfc, 0x00, 0x28, 0x00, 0xd1, 0x03, 0x25, 0x02, 0x2d, 0x05, 0xd0, 0x03, 0x2d, 0x07, 0xd1, 0xe0, 0x68, 0xf6, 0xf7, 0xe2, 0xff, 0x70, 0xbd, 0x20, 0x1c, 0xfd, 0xf7, 0x1c, 0xfd, 0x70, 0xbd, 0xe0, 0x68, 0x01, 0x89, 0x02, 0x39, 0x01, 0x81, 0xe0, 0x68, 0x01, 0x68, 0x02, 0x31, 0x01, 0x60, 0xe8, 0x00, 0x3c, 0x00, 0xf0, 0xa5, 0x00, 0x00, 0x31, 0x58, 0x20, 0x1c, 0xf5, 0xf7, 0xf1, 0xfe, 0x00, 0x28, 0xef, 0xd1, 0xe0, 0x68, 0x01, 0x89, 0x02, 0x31, 0x01, 0x81, 0xe0, 0x68, 0x01, 0x68, 0x02, 0x39, 0x01, 0x60, 0xe3, 0xe7, 0x00, 0x00, 0x6a, 0x46, 0x01, 0x00, 0x7c, 0x79, 0x01, 0x00, 0x70, 0xb5, 0x0e, 0x1c, 0x04, 0x1c, 0x15, 0x1c, 0xf7, 0xf7, 0x8c, 0xfb, 0x00, 0x28, 0x2a, 0xd0, 0x1b, 0x49, 0x08, 0x68, 0x3c, 0x00, 0x2c, 0xa6, 0x00, 0x00, 0x01, 0x30, 0x08, 0x60, 0x00, 0x2e, 0x0a, 0xd0, 0x01, 0x2e, 0x0b, 0xd0, 0x02, 0x2e, 0x0f, 0xd1, 0x20, 0x1c, 0x04, 0xf0, 0xcd, 0xf8, 0x20, 0x1c, 0xff, 0xf7, 0xd6, 0xfe, 0x0c, 0xe0, 0x08, 0x21, 0xe0, 0x68, 0x02, 0xe0, 0xc1, 0x21, 0xe0, 0x68, 0xc9, 0x00, 0x04, 0xf0, 0x35, 0xf9, 0x03, 0xe0, 0x02, 0x21, 0x26, 0x20, 0xf6, 0xf7, 0x20, 0xfe, 0xe2, 0x7d, 0xe1, 0x6a, 0x3c, 0x00, 0x68, 0xa6, 0x00, 0x00, 0x28, 0x1c, 0xfc, 0xf7, 0x95, 0xfb, 0x20, 0x63, 0x00, 0x20, 0x20, 0x62, 0xa0, 0x62, 0x20, 0x1c, 0x00, 0xf0, 0x6c, 0xfe, 0x70, 0xbd, 0xe0, 0x68, 0xf6, 0xf7, 0x8a, 0xff, 0x00, 0x2d, 0xf9, 0xd0, 0xe3, 0x7d, 0x00, 0x22, 0x01, 0x20, 0xe1, 0x6a, 0xf5, 0xf7, 0xa7, 0xfe, 0x70, 0xbd, 0x00, 0x00, 0x94, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x28, 0x04, 0xd1, 0x05, 0x48, 0x3c, 0x00, 0xa4, 0xa6, 0x00, 0x00, 0x00, 0x68, 0x01, 0xf0, 0x09, 0xf9, 0x80, 0xbd, 0x03, 0x21, 0x26, 0x20, 0xf6, 0xf7, 0xf8, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0x0c, 0x79, 0x01, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x80, 0x79, 0x00, 0x24, 0xc0, 0x07, 0x2d, 0xd5, 0xf0, 0x68, 0x00, 0x68, 0x41, 0x7a, 0x11, 0x29, 0x28, 0xd1, 0xc1, 0x88, 0x0a, 0x0a, 0x09, 0x02, 0x11, 0x43, 0xc9, 0x04, 0x22, 0xd1, 0x01, 0x78, 0x3c, 0x00, 0xe0, 0xa6, 0x00, 0x00, 0x11, 0x4f, 0x09, 0x07, 0x89, 0x0e, 0x08, 0x18, 0x41, 0x88, 0x0a, 0x0a, 0x09, 0x02, 0x11, 0x43, 0x0d, 0x04, 0x2d, 0x0c, 0x43, 0x2d, 0x39, 0x68, 0x01, 0xd1, 0xca, 0x07, 0x0e, 0xd4, 0x44, 0x2d, 0x06, 0xd1, 0xc9, 0x07, 0x04, 0xd5, 0x24, 0x30, 0x00, 0xf0, 0x22, 0xfb, 0x00, 0x28, 0x05, 0xd0, 0x06, 0x48, 0x85, 0x42, 0x06, 0xd1, 0x38, 0x68, 0x80, 0x07, 0x03, 0xd5, 0x3c, 0x00, 0x1c, 0xa7, 0x00, 0x00, 0x01, 0x24, 0xf0, 0x68, 0xf6, 0xf7, 0x3a, 0xff, 0x20, 0x1c, 0xf8, 0xbd, 0x7c, 0x5a, 0x01, 0x00, 0x6c, 0x07, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x28, 0x07, 0xd0, 0x00, 0x21, 0x26, 0x20, 0x08, 0xf0, 0x7b, 0xff, 0x02, 0x48, 0x00, 0x68, 0x01, 0xf0, 0xbb, 0xf8, 0x80, 0xbd, 0x0c, 0x79, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x09, 0x4a, 0x08, 0x1c, 0x51, 0x68, 0x01, 0x31, 0x3c, 0x00, 0x58, 0xa7, 0x00, 0x00, 0x51, 0x60, 0x00, 0x21, 0x21, 0x62, 0xa1, 0x62, 0xe2, 0x7d, 0xe1, 0x6a, 0xfc, 0xf7, 0x18, 0xfb, 0x20, 0x63, 0x20, 0x1c, 0xf7, 0xf7, 0xe6, 0xfa, 0x20, 0x1c, 0x00, 0xf0, 0xef, 0xfd, 0x10, 0xbd, 0x94, 0x79, 0x01, 0x00, 0x0c, 0xb5, 0x02, 0x1c, 0x08, 0x1c, 0x00, 0x21, 0x01, 0x91, 0x00, 0x92, 0x6a, 0x46, 0x01, 0xa9, 0x00, 0xf0, 0x02, 0xf8, 0x0c, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x94, 0xa7, 0x00, 0x00, 0x70, 0xb5, 0x13, 0x68, 0x00, 0x2b, 0x1e, 0xd0, 0x00, 0x26, 0x0b, 0x68, 0x00, 0x2b, 0x02, 0xd1, 0x13, 0x68, 0x1b, 0x68, 0x0b, 0x60, 0x13, 0x68, 0x1c, 0x68, 0x1b, 0x89, 0xe5, 0x18, 0x08, 0xe0, 0x5c, 0x78, 0x1c, 0x19, 0x02, 0x34, 0x0c, 0x60, 0x1c, 0x78, 0x84, 0x42, 0x01, 0xd1, 0x18, 0x1c, 0x70, 0xbd, 0x0b, 0x68, 0xab, 0x42, 0xf3, 0xd3, 0x13, 0x68, 0xdb, 0x68, 0x3c, 0x00, 0xd0, 0xa7, 0x00, 0x00, 0x13, 0x60, 0x0e, 0x60, 0x13, 0x68, 0x00, 0x2b, 0xe1, 0xd1, 0x00, 0x20, 0x70, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x03, 0x1c, 0x20, 0xd0, 0x18, 0x68, 0x1e, 0x89, 0x05, 0x1c, 0x16, 0xe0, 0x04, 0x78, 0xdd, 0x2c, 0x10, 0xd1, 0x84, 0x78, 0x00, 0x2c, 0x0d, 0xd1, 0xc4, 0x78, 0x50, 0x2c, 0x0a, 0xd1, 0x04, 0x79, 0xf2, 0x2c, 0x07, 0xd1, 0x44, 0x79, 0x8c, 0x42, 0x04, 0xd1, 0x3c, 0x00, 0x0c, 0xa8, 0x00, 0x00, 0x02, 0x29, 0x0c, 0xd1, 0x84, 0x79, 0x94, 0x42, 0x09, 0xd0, 0x44, 0x78, 0x20, 0x18, 0x02, 0x30, 0x44, 0x1b, 0xb4, 0x42, 0xe5, 0xdb, 0xdb, 0x68, 0x00, 0x2b, 0xde, 0xd1, 0x00, 0x20, 0x70, 0xbd, 0x04, 0x49, 0x80, 0xb5, 0x0a, 0x78, 0x0a, 0x20, 0x00, 0x2a, 0x00, 0xd0, 0x48, 0x6a, 0x00, 0xf0, 0xd1, 0xf8, 0x80, 0xbd, 0x1c, 0x75, 0x01, 0x00, 0xb0, 0xb5, 0x17, 0x4c, 0x3c, 0x00, 0x48, 0xa8, 0x00, 0x00, 0x20, 0x68, 0x00, 0x28, 0x29, 0xd0, 0x16, 0x4d, 0xe8, 0x69, 0x00, 0x28, 0x25, 0xd1, 0x01, 0xf0, 0x3f, 0xfa, 0x00, 0x28, 0x21, 0xd1, 0xff, 0xf7, 0x41, 0xfc, 0x00, 0x28, 0x1d, 0xd1, 0x20, 0x68, 0xa9, 0x69, 0x40, 0x18, 0x08, 0xf0, 0xd6, 0xf9, 0x00, 0x28, 0x16, 0xd0, 0x02, 0xf0, 0x06, 0xfd, 0x21, 0x68, 0x40, 0x18, 0x08, 0xf0, 0xce, 0xf9, 0x00, 0x28, 0x0e, 0xd0, 0x3c, 0x00, 0x84, 0xa8, 0x00, 0x00, 0x01, 0x20, 0xe8, 0x61, 0x00, 0x22, 0x25, 0x21, 0x80, 0x20, 0x08, 0xf0, 0x8f, 0xff, 0x06, 0x48, 0x29, 0x6a, 0x04, 0xf0, 0x83, 0xfd, 0x01, 0x21, 0x28, 0x6a, 0x00, 0xf0, 0x89, 0xff, 0xb0, 0xbd, 0xe8, 0x59, 0x01, 0x00, 0x1c, 0x75, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x70, 0xb5, 0x05, 0x1c, 0x00, 0x24, 0xfa, 0xf7, 0x0b, 0xff, 0x18, 0x4e, 0x71, 0x6a, 0x40, 0x18, 0x3c, 0x00, 0xc0, 0xa8, 0x00, 0x00, 0x00, 0xf0, 0x8e, 0xf8, 0x00, 0x28, 0x0b, 0xd1, 0x04, 0xf0, 0xfe, 0xfb, 0x00, 0x21, 0x25, 0x20, 0x08, 0xf0, 0xb0, 0xfe, 0x03, 0x22, 0x29, 0x1c, 0x28, 0x1c, 0x00, 0xf0, 0xaf, 0xf8, 0x18, 0xe0, 0x70, 0x6a, 0x44, 0x1e, 0x00, 0xf0, 0x7c, 0xf8, 0x00, 0x28, 0x12, 0xd1, 0x0c, 0x48, 0x31, 0x6a, 0x04, 0xf0, 0x56, 0xfd, 0x01, 0x21, 0x30, 0x6a, 0x00, 0xf0, 0x5c, 0xff, 0x3c, 0x00, 0xfc, 0xa8, 0x00, 0x00, 0x00, 0x20, 0xfa, 0xf7, 0x0d, 0xfe, 0x06, 0xf0, 0x03, 0xf8, 0x00, 0x23, 0x00, 0x22, 0x25, 0x20, 0x05, 0x49, 0x08, 0xf0, 0x3f, 0xff, 0x20, 0x1c, 0x07, 0xf0, 0xfc, 0xfa, 0x70, 0xbd, 0x00, 0x00, 0x1c, 0x75, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x10, 0x27, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x28, 0x07, 0xd0, 0x80, 0x28, 0x0d, 0xd1, 0x00, 0x22, 0x00, 0x21, 0x08, 0x48, 0x3c, 0x00, 0x38, 0xa9, 0x00, 0x00, 0xf8, 0xf7, 0x9a, 0xfe, 0x80, 0xbd, 0x01, 0x29, 0x02, 0xd1, 0x06, 0x49, 0x00, 0x20, 0xc8, 0x61, 0x04, 0xf0, 0xbe, 0xfb, 0x80, 0xbd, 0x05, 0x21, 0x25, 0x20, 0xf6, 0xf7, 0xa7, 0xfc, 0x80, 0xbd, 0x61, 0xa9, 0x00, 0x00, 0x1c, 0x75, 0x01, 0x00, 0x00, 0x21, 0x00, 0x28, 0x80, 0xb5, 0x01, 0xd1, 0x03, 0x48, 0x41, 0x68, 0x01, 0x22, 0x25, 0x20, 0x08, 0xf0, 0x2c, 0xfe, 0x3c, 0x00, 0x74, 0xa9, 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, 0xe8, 0x59, 0x01, 0x00, 0x02, 0x49, 0xc8, 0x68, 0x01, 0x38, 0x48, 0x62, 0x70, 0x47, 0x00, 0x00, 0x1c, 0x75, 0x01, 0x00, 0x38, 0xb5, 0x03, 0x1c, 0x08, 0x1c, 0x19, 0x1c, 0x11, 0x4b, 0x06, 0xd0, 0x01, 0x21, 0x11, 0x80, 0x0a, 0x1c, 0x19, 0x1c, 0xf5, 0xf7, 0xaa, 0xfd, 0x17, 0xe0, 0x0d, 0x4d, 0x01, 0x1c, 0x2c, 0x78, 0x12, 0x88, 0x18, 0x1c, 0x3c, 0x00, 0xb0, 0xa9, 0x00, 0x00, 0xf5, 0xf7, 0xa2, 0xfd, 0x28, 0x78, 0x84, 0x42, 0x0d, 0xd0, 0x00, 0x23, 0x6b, 0x61, 0x00, 0x28, 0x03, 0xd0, 0x00, 0x20, 0x07, 0xf0, 0xa4, 0xfa, 0x05, 0xe0, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, 0x92, 0xf8, 0xf7, 0x23, 0xfc, 0x01, 0x20, 0x38, 0xbd, 0x00, 0x00, 0x1c, 0x75, 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x01, 0x26, 0x08, 0xf0, 0xe1, 0xf9, 0x05, 0x1c, 0x3c, 0x00, 0xec, 0xa9, 0x00, 0x00, 0x00, 0x20, 0xfa, 0xf7, 0x8b, 0xfd, 0x44, 0x43, 0x02, 0xf0, 0x40, 0xfc, 0x02, 0xf0, 0x3e, 0xfc, 0x01, 0x1c, 0x23, 0x1c, 0x00, 0x22, 0x28, 0x1c, 0x08, 0xf0, 0x7c, 0xfa, 0x00, 0x28, 0x13, 0xd1, 0x0a, 0x48, 0x23, 0x1c, 0x00, 0x22, 0x81, 0x69, 0x28, 0x1c, 0x08, 0xf0, 0x73, 0xfa, 0x00, 0x28, 0x0a, 0xd1, 0xf8, 0xf7, 0x19, 0xfc, 0x01, 0x1c, 0x23, 0x1c, 0x00, 0x22, 0x3c, 0x00, 0x28, 0xaa, 0x00, 0x00, 0x28, 0x1c, 0x08, 0xf0, 0x69, 0xfa, 0x00, 0x28, 0x00, 0xd1, 0x00, 0x26, 0x30, 0x1c, 0x70, 0xbd, 0x1c, 0x75, 0x01, 0x00, 0x70, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x16, 0x1c, 0x07, 0xf0, 0x76, 0xf9, 0x00, 0x28, 0x0d, 0xd0, 0xfa, 0xf7, 0x52, 0xfe, 0x00, 0x28, 0x09, 0xd0, 0xff, 0x30, 0x01, 0x30, 0x43, 0x68, 0x00, 0x2b, 0x04, 0xd0, 0x22, 0x1c, 0x29, 0x1c, 0x30, 0x1c, 0x3c, 0x00, 0x64, 0xaa, 0x00, 0x00, 0xf5, 0xf7, 0xbb, 0xfc, 0x70, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x21, 0x1d, 0x20, 0x08, 0xf0, 0xdf, 0xfd, 0x07, 0x4a, 0x07, 0x48, 0x11, 0x69, 0x01, 0x60, 0x51, 0x69, 0x41, 0x60, 0x06, 0x49, 0x49, 0x68, 0x81, 0x60, 0x00, 0x21, 0xc1, 0x60, 0x03, 0xf0, 0x74, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x28, 0x61, 0x01, 0x00, 0x48, 0x75, 0x01, 0x00, 0x90, 0x5c, 0x01, 0x00, 0x3c, 0x00, 0xa0, 0xaa, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x40, 0x6b, 0x00, 0x28, 0x35, 0xd0, 0x1d, 0x4d, 0x00, 0x26, 0x28, 0x78, 0x00, 0x28, 0x24, 0xd0, 0x41, 0x20, 0x00, 0x5d, 0x00, 0x28, 0x03, 0xd1, 0x08, 0xf0, 0x76, 0xf9, 0xa8, 0x61, 0x1b, 0xe0, 0x69, 0x69, 0x01, 0x31, 0x69, 0x61, 0xa8, 0x68, 0x00, 0x28, 0x08, 0xd0, 0x81, 0x42, 0x06, 0xd1, 0x20, 0x69, 0x01, 0x1c, 0x10, 0x31, 0x04, 0x30, 0x3c, 0x00, 0xdc, 0xaa, 0x00, 0x00, 0x82, 0x22, 0xff, 0xf7, 0xad, 0xff, 0x68, 0x68, 0x00, 0x28, 0x0a, 0xd0, 0x69, 0x69, 0x81, 0x42, 0x07, 0xd1, 0x20, 0x69, 0x01, 0x1c, 0x10, 0x31, 0x04, 0x30, 0x02, 0x22, 0xff, 0xf7, 0xa0, 0xff, 0x6e, 0x61, 0x68, 0x78, 0x05, 0x21, 0x08, 0x40, 0x08, 0xd0, 0x07, 0x48, 0x00, 0x78, 0x0e, 0x28, 0x03, 0xd3, 0x60, 0x34, 0xe0, 0x79, 0xfb, 0xf7, 0xcf, 0xff, 0x70, 0xbd, 0x3c, 0x00, 0x18, 0xab, 0x00, 0x00, 0x03, 0x48, 0x06, 0x60, 0x70, 0xbd, 0x00, 0x00, 0x1c, 0x75, 0x01, 0x00, 0x10, 0x67, 0x01, 0x00, 0xd4, 0x7e, 0x01, 0x00, 0x80, 0x02, 0x70, 0x47, 0x14, 0x23, 0x30, 0xb5, 0x09, 0x4d, 0x4b, 0x43, 0x5b, 0x19, 0x5b, 0x68, 0x08, 0x24, 0x00, 0x2b, 0x00, 0xd1, 0x02, 0x24, 0x38, 0x23, 0x5a, 0x43, 0x05, 0x4b, 0x89, 0x00, 0xd2, 0x18, 0x51, 0x5a, 0x02, 0x68, 0x09, 0x19, 0x3c, 0x00, 0x54, 0xab, 0x00, 0x00, 0x51, 0x1a, 0x01, 0x60, 0x30, 0xbd, 0x00, 0x00, 0x74, 0x40, 0x01, 0x00, 0x8c, 0x41, 0x01, 0x00, 0xf8, 0xb5, 0x07, 0x1c, 0x2c, 0x48, 0x14, 0x1c, 0x2c, 0x4a, 0x48, 0x43, 0x86, 0x46, 0x80, 0x18, 0x80, 0x0d, 0x84, 0x46, 0x2b, 0x48, 0x2a, 0x4a, 0x06, 0x26, 0x1d, 0x1c, 0x48, 0x43, 0x4a, 0x43, 0x0e, 0x2f, 0x40, 0xd2, 0x01, 0xa3, 0xdb, 0x5d, 0x5b, 0x00, 0x9f, 0x44, 0x3c, 0x00, 0x90, 0xab, 0x00, 0x00, 0x06, 0x08, 0x0a, 0x0f, 0x14, 0x18, 0x1d, 0x20, 0x27, 0x24, 0x27, 0x2b, 0x2f, 0x31, 0xc8, 0x00, 0x1f, 0xe0, 0x88, 0x00, 0x1d, 0xe0, 0x21, 0x49, 0x70, 0x46, 0x40, 0x18, 0x00, 0x0d, 0x18, 0xe0, 0x1f, 0x4a, 0x80, 0x18, 0x80, 0x0d, 0x40, 0x18, 0x21, 0xe0, 0x1e, 0x48, 0x10, 0x18, 0x00, 0x0d, 0x1d, 0xe0, 0x1d, 0x49, 0x70, 0x46, 0x40, 0x18, 0x40, 0x0d, 0x0a, 0xe0, 0x3c, 0x00, 0xcc, 0xab, 0x00, 0x00, 0x1b, 0x49, 0x40, 0x18, 0x01, 0xe0, 0x1b, 0x48, 0x10, 0x18, 0x40, 0x0d, 0x11, 0xe0, 0x1a, 0x49, 0x40, 0x18, 0x05, 0xe0, 0x60, 0x46, 0x20, 0x80, 0x00, 0x20, 0x16, 0xe0, 0x17, 0x48, 0x10, 0x18, 0x80, 0x0d, 0x06, 0xe0, 0x16, 0x49, 0x02, 0xe0, 0x16, 0x48, 0x48, 0x43, 0x16, 0x49, 0x40, 0x18, 0xc0, 0x0d, 0x03, 0x30, 0x80, 0x08, 0x80, 0x00, 0x20, 0x80, 0x2e, 0x80, 0x3c, 0x00, 0x08, 0xac, 0x00, 0x00, 0xf8, 0xbd, 0xff, 0x21, 0xff, 0x20, 0xf6, 0xf7, 0x49, 0xfb, 0x00, 0x20, 0x20, 0x80, 0x28, 0x80, 0xf6, 0xe7, 0x00, 0x00, 0xd1, 0x45, 0x17, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xe3, 0x38, 0x0e, 0x00, 0x55, 0x55, 0x15, 0x00, 0xff, 0xff, 0x0f, 0x00, 0xa9, 0xaa, 0x2a, 0x01, 0x70, 0x1c, 0x37, 0x00, 0xff, 0xff, 0x1f, 0x00, 0xcb, 0xcc, 0x4c, 0x00, 0x70, 0x1c, 0x47, 0x00, 0x3c, 0x00, 0x44, 0xac, 0x00, 0x00, 0xa9, 0xaa, 0x7a, 0x00, 0x70, 0x1c, 0x67, 0x00, 0xa9, 0xaa, 0xba, 0x00, 0x84, 0xf6, 0x12, 0x00, 0xec, 0x25, 0xb4, 0x00, 0x04, 0x49, 0x00, 0x28, 0x01, 0xd0, 0x09, 0x22, 0x00, 0xe0, 0x14, 0x22, 0x4a, 0x80, 0x48, 0x60, 0x70, 0x47, 0x00, 0x00, 0xa4, 0x69, 0x01, 0x00, 0x80, 0xb5, 0x06, 0x22, 0xf5, 0xf7, 0x40, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0xbc, 0xb5, 0x15, 0x1c, 0x3c, 0x00, 0x80, 0xac, 0x00, 0x00, 0x04, 0x1c, 0x04, 0x31, 0x09, 0x04, 0x09, 0x0c, 0x01, 0xaa, 0x6b, 0x46, 0xff, 0xf7, 0x6a, 0xff, 0x38, 0x20, 0x06, 0x49, 0x68, 0x43, 0x40, 0x18, 0xa1, 0x00, 0x40, 0x5a, 0x00, 0xab, 0x99, 0x88, 0x40, 0x18, 0x19, 0x88, 0x40, 0x18, 0x00, 0x04, 0x00, 0x0c, 0xbc, 0xbd, 0x8c, 0x41, 0x01, 0x00, 0xbc, 0xb5, 0x04, 0x1c, 0x15, 0x1c, 0x01, 0xaa, 0x6b, 0x46, 0xff, 0xf7, 0x3c, 0x00, 0xbc, 0xac, 0x00, 0x00, 0x53, 0xff, 0x38, 0x20, 0x05, 0x49, 0x68, 0x43, 0x40, 0x18, 0xa1, 0x00, 0x40, 0x5a, 0x00, 0xab, 0x99, 0x88, 0x40, 0x18, 0x00, 0x04, 0x00, 0x0c, 0xbc, 0xbd, 0x00, 0x00, 0x8c, 0x41, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x28, 0x0f, 0xd0, 0x00, 0x29, 0x0d, 0xd0, 0x02, 0x78, 0x0b, 0x78, 0x9a, 0x42, 0x09, 0xd1, 0xff, 0x2a, 0x05, 0xd0, 0x42, 0x78, 0x02, 0x32, 0xf5, 0xf7, 0x3c, 0x00, 0xf8, 0xac, 0x00, 0x00, 0x81, 0xfb, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x80, 0xbd, 0x00, 0x20, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x06, 0x22, 0x04, 0x49, 0xf5, 0xf7, 0x75, 0xfb, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x80, 0xbd, 0x00, 0x20, 0x80, 0xbd, 0x00, 0x00, 0x5e, 0x40, 0x01, 0x00, 0x01, 0x1c, 0x49, 0x78, 0x01, 0x20, 0x00, 0x29, 0x00, 0xd0, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0x34, 0xad, 0x00, 0x00, 0x80, 0xb5, 0x06, 0x22, 0xf5, 0xf7, 0x60, 0xfb, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x80, 0xbd, 0x00, 0x20, 0x80, 0xbd, 0x80, 0xb5, 0xff, 0xf7, 0xc7, 0xff, 0x80, 0xbd, 0x80, 0xb5, 0x06, 0x22, 0x04, 0x49, 0xf5, 0xf7, 0x51, 0xfb, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x80, 0xbd, 0x00, 0x20, 0x80, 0xbd, 0x00, 0x00, 0x12, 0x61, 0x01, 0x00, 0x01, 0x1c, 0x80, 0x20, 0x3c, 0x00, 0x70, 0xad, 0x00, 0x00, 0x81, 0x43, 0x8a, 0x08, 0x0e, 0x20, 0x1c, 0x2a, 0x10, 0xb5, 0x06, 0xd2, 0x03, 0x4c, 0x52, 0x00, 0xa3, 0x5c, 0x8b, 0x42, 0x01, 0xd1, 0x10, 0x19, 0x40, 0x78, 0x10, 0xbd, 0xfc, 0x41, 0x01, 0x00, 0x14, 0x23, 0x02, 0x49, 0x58, 0x43, 0x40, 0x18, 0x40, 0x68, 0x70, 0x47, 0x74, 0x40, 0x01, 0x00, 0x20, 0x22, 0x01, 0x1c, 0x80, 0xb5, 0x02, 0x48, 0xf5, 0xf7, 0x52, 0xfd, 0x3c, 0x00, 0xac, 0xad, 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x48, 0x61, 0x01, 0x00, 0x08, 0x06, 0x00, 0x0e, 0x02, 0x28, 0x01, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x01, 0x20, 0x70, 0x47, 0x00, 0x29, 0x0c, 0xd0, 0x07, 0x49, 0x09, 0x68, 0x00, 0x29, 0x08, 0xd0, 0x14, 0x23, 0x06, 0x49, 0x58, 0x43, 0x40, 0x18, 0xc0, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xad, 0x00, 0x00, 0xac, 0x69, 0x01, 0x00, 0x74, 0x40, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x06, 0x22, 0x01, 0x1c, 0x04, 0x48, 0xf5, 0xf7, 0x7d, 0xfb, 0x06, 0x22, 0x21, 0x1c, 0x03, 0x48, 0xf5, 0xf7, 0x78, 0xfb, 0x10, 0xbd, 0x00, 0x00, 0x12, 0x61, 0x01, 0x00, 0x40, 0x80, 0x07, 0x00, 0x00, 0x29, 0x01, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x38, 0x23, 0x5a, 0x43, 0x07, 0x4b, 0xd2, 0x18, 0x3c, 0x00, 0x24, 0xae, 0x00, 0x00, 0x83, 0x00, 0xd2, 0x5a, 0x14, 0x23, 0x58, 0x43, 0x05, 0x4b, 0xc0, 0x18, 0x40, 0x88, 0x10, 0x18, 0x08, 0x1a, 0x0a, 0x38, 0x00, 0x04, 0x00, 0x0c, 0x70, 0x47, 0x00, 0x00, 0x8c, 0x41, 0x01, 0x00, 0x74, 0x40, 0x01, 0x00, 0xf8, 0xb5, 0x07, 0x1c, 0x08, 0x1c, 0x16, 0x1c, 0x1c, 0x1c, 0x19, 0x1c, 0x00, 0xf0, 0x5a, 0xf8, 0x05, 0x1c, 0x14, 0x35, 0x22, 0x1c, 0x31, 0x1c, 0x3c, 0x00, 0x60, 0xae, 0x00, 0x00, 0x38, 0x1c, 0xff, 0xf7, 0x0b, 0xff, 0x28, 0x18, 0x00, 0x04, 0x00, 0x0c, 0xf8, 0xbd, 0x00, 0x00, 0x00, 0xb5, 0x00, 0xf0, 0x4b, 0xf8, 0x0a, 0x30, 0x00, 0x04, 0x00, 0x0c, 0x00, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x07, 0x1c, 0x08, 0x1c, 0x16, 0x1c, 0x1c, 0x1c, 0x19, 0x1c, 0x00, 0xf0, 0x3e, 0xf8, 0x45, 0x00, 0x1e, 0x35, 0x22, 0x1c, 0x31, 0x1c, 0x38, 0x1c, 0xff, 0xf7, 0x3c, 0x00, 0x9c, 0xae, 0x00, 0x00, 0xef, 0xfe, 0x28, 0x18, 0x00, 0x04, 0x00, 0x0c, 0xf8, 0xbd, 0x00, 0x00, 0xff, 0xb5, 0x0f, 0x1c, 0x81, 0xb0, 0x0a, 0xa9, 0x14, 0x1c, 0x1e, 0x1c, 0x03, 0xc9, 0x00, 0xf0, 0x29, 0xf8, 0x05, 0x1c, 0x1e, 0x35, 0x21, 0x1c, 0x30, 0x1c, 0x00, 0xf0, 0x23, 0xf8, 0x2d, 0x18, 0x22, 0x1c, 0x39, 0x1c, 0x01, 0x98, 0xff, 0xf7, 0xd5, 0xfe, 0x28, 0x18, 0x00, 0x04, 0x00, 0x0c, 0x3c, 0x00, 0xd8, 0xae, 0x00, 0x00, 0x05, 0xb0, 0xf0, 0xbd, 0x0a, 0x49, 0x80, 0xb5, 0x09, 0x88, 0x09, 0x29, 0x04, 0xd0, 0x14, 0x29, 0x07, 0xd1, 0x01, 0x01, 0x80, 0x00, 0x00, 0xe0, 0xc1, 0x00, 0x08, 0x18, 0x00, 0x04, 0x00, 0x0c, 0x80, 0xbd, 0xff, 0x21, 0xff, 0x20, 0xf6, 0xf7, 0xd1, 0xf9, 0x00, 0x20, 0x80, 0xbd, 0x00, 0x00, 0xa6, 0x69, 0x01, 0x00, 0x38, 0x23, 0x59, 0x43, 0x06, 0x4a, 0x14, 0x23, 0x3c, 0x00, 0x14, 0xaf, 0x00, 0x00, 0x89, 0x18, 0x82, 0x00, 0x89, 0x5a, 0x05, 0x4a, 0x58, 0x43, 0x80, 0x18, 0x40, 0x88, 0x08, 0x18, 0x00, 0x04, 0x00, 0x0c, 0x70, 0x47, 0x00, 0x00, 0x8c, 0x41, 0x01, 0x00, 0x74, 0x40, 0x01, 0x00, 0x02, 0x48, 0x03, 0x49, 0x00, 0x68, 0x40, 0x00, 0x08, 0x5a, 0x70, 0x47, 0xa8, 0x69, 0x01, 0x00, 0x54, 0x40, 0x01, 0x00, 0x0a, 0x20, 0x70, 0x47, 0x10, 0xb5, 0x04, 0x1c, 0x3c, 0x00, 0x50, 0xaf, 0x00, 0x00, 0xfd, 0xf7, 0x62, 0xff, 0x20, 0x1c, 0x10, 0xbd, 0xb0, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0x05, 0x68, 0xa0, 0x1d, 0xff, 0xf7, 0xf5, 0xfe, 0x00, 0x28, 0x18, 0xd0, 0x21, 0x1c, 0x14, 0x31, 0x20, 0x1c, 0x08, 0xf0, 0xe2, 0xfd, 0x00, 0x28, 0x11, 0xd0, 0x29, 0x88, 0x09, 0x48, 0x20, 0x22, 0x81, 0x82, 0x69, 0x88, 0x01, 0x83, 0xa9, 0x88, 0x06, 0x35, 0x41, 0x83, 0xc5, 0x61, 0x3c, 0x00, 0x8c, 0xaf, 0x00, 0x00, 0x30, 0x21, 0x09, 0x5d, 0x11, 0x54, 0x61, 0x6b, 0x41, 0x62, 0x01, 0x20, 0xf7, 0xf7, 0x28, 0xf8, 0x20, 0x1c, 0xb0, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0x21, 0x1c, 0x14, 0x31, 0x05, 0x68, 0x20, 0x1c, 0x08, 0xf0, 0xc1, 0xfd, 0x00, 0x28, 0x08, 0xd0, 0x05, 0x4e, 0xf0, 0x68, 0x02, 0xf0, 0xcf, 0xfd, 0x28, 0x88, 0xf0, 0x82, 0x03, 0x20, 0x3c, 0x00, 0xc8, 0xaf, 0x00, 0x00, 0xf7, 0xf7, 0x10, 0xf8, 0x20, 0x1c, 0x70, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x3e, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0x05, 0x68, 0xa0, 0x1d, 0xff, 0xf7, 0xb7, 0xfe, 0x00, 0x28, 0x21, 0xd0, 0x21, 0x1c, 0x14, 0x31, 0x20, 0x1c, 0x02, 0xaa, 0x08, 0xf0, 0x77, 0xfd, 0x00, 0x28, 0x19, 0xd0, 0x02, 0x98, 0x4b, 0x21, 0x09, 0x5c, 0x00, 0x29, 0x10, 0xd0, 0x01, 0x29, 0x14, 0xd0, 0x3c, 0x00, 0x04, 0xb0, 0x00, 0x00, 0x02, 0x29, 0x0c, 0xd1, 0x29, 0x88, 0x0d, 0x20, 0x00, 0xab, 0x18, 0x80, 0x20, 0x1c, 0x03, 0xf0, 0x51, 0xf8, 0x01, 0x90, 0x68, 0x46, 0x02, 0xf0, 0x5d, 0xfa, 0xf6, 0xf7, 0xb5, 0xf8, 0x00, 0x21, 0x02, 0x98, 0x06, 0xf0, 0x9f, 0xfe, 0x20, 0x1c, 0x3e, 0xbd, 0x07, 0xf0, 0x29, 0xf8, 0x02, 0x98, 0x00, 0x21, 0x80, 0x69, 0xc2, 0x07, 0xd2, 0x0f, 0x04, 0x20, 0xf6, 0xf7, 0x3c, 0x00, 0x40, 0xb0, 0x00, 0x00, 0x7f, 0xff, 0xee, 0xe7, 0x10, 0xb5, 0x04, 0x1c, 0xfd, 0xf7, 0xe6, 0xfe, 0x20, 0x1c, 0x10, 0xbd, 0x3e, 0xb5, 0x05, 0x1c, 0x00, 0xf0, 0x40, 0xfe, 0x00, 0x28, 0x15, 0xd1, 0x28, 0x1c, 0x14, 0x30, 0xfa, 0xf7, 0xce, 0xfb, 0x00, 0x28, 0x0f, 0xd0, 0x05, 0x21, 0x28, 0x69, 0xff, 0xf7, 0x86, 0xfb, 0x04, 0x1c, 0x09, 0xd0, 0x05, 0x22, 0x21, 0x1c, 0x68, 0x46, 0xf5, 0xf7, 0x3c, 0x00, 0x7c, 0xb0, 0x00, 0x00, 0x3d, 0xfa, 0x05, 0x34, 0x02, 0x94, 0x68, 0x46, 0x03, 0xf0, 0x1a, 0xfb, 0x2a, 0x1c, 0x0d, 0x21, 0x8f, 0x20, 0x08, 0xf0, 0x8f, 0xfb, 0x00, 0x20, 0x3e, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0xfa, 0xf7, 0x98, 0xf8, 0x20, 0x1c, 0x05, 0xf0, 0xe5, 0xf8, 0x20, 0x1c, 0x10, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x00, 0x69, 0x00, 0x21, 0x94, 0xb0, 0xff, 0xf7, 0x3c, 0x00, 0xb8, 0xb0, 0x00, 0x00, 0x61, 0xfb, 0x69, 0x46, 0xfb, 0xf7, 0x26, 0xf8, 0x00, 0x28, 0x1e, 0xd0, 0x00, 0x98, 0xfa, 0xf7, 0x29, 0xfa, 0x01, 0x1c, 0x01, 0xa8, 0x02, 0xf0, 0xd7, 0xf9, 0x00, 0x98, 0xfa, 0xf7, 0xd2, 0xf9, 0x04, 0x90, 0x05, 0x20, 0x09, 0xad, 0x68, 0x72, 0x02, 0xa8, 0x21, 0x1c, 0x06, 0x22, 0x02, 0x30, 0xf5, 0xf7, 0x06, 0xfa, 0x01, 0x20, 0x08, 0x90, 0x21, 0x6a, 0x0a, 0x90, 0x3c, 0x00, 0xf4, 0xb0, 0x00, 0x00, 0x28, 0x20, 0x09, 0x91, 0x00, 0x5d, 0x28, 0x72, 0x01, 0xa8, 0x00, 0xf0, 0x69, 0xf8, 0x20, 0x1c, 0x14, 0xb0, 0xb0, 0xbd, 0xff, 0xb5, 0x16, 0x1c, 0x1f, 0x1c, 0x81, 0xb0, 0x0a, 0x9d, 0x4c, 0x20, 0xf6, 0xf7, 0x90, 0xfb, 0x04, 0x1c, 0x14, 0x30, 0x06, 0x22, 0x02, 0x99, 0xf5, 0xf7, 0xea, 0xf9, 0x20, 0x1c, 0x06, 0x22, 0x01, 0x99, 0xf5, 0xf7, 0xe5, 0xf9, 0x28, 0x20, 0x3c, 0x00, 0x30, 0xb1, 0x00, 0x00, 0x00, 0x21, 0x06, 0x55, 0xe1, 0x60, 0x27, 0x62, 0x00, 0x2d, 0x01, 0xd0, 0x8e, 0x20, 0x00, 0xe0, 0x8d, 0x20, 0x22, 0x1c, 0x0d, 0x21, 0x08, 0xf0, 0x33, 0xfb, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x05, 0x1c, 0x4c, 0x20, 0xf6, 0xf7, 0x6f, 0xfb, 0x04, 0x1c, 0x4c, 0x22, 0x29, 0x1c, 0xf5, 0xf7, 0x26, 0xfa, 0x29, 0x20, 0x40, 0x5d, 0x0d, 0x28, 0x2c, 0xd2, 0x3c, 0x00, 0x6c, 0xb1, 0x00, 0x00, 0x01, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x28, 0x1a, 0x28, 0x1e, 0x06, 0x0a, 0x28, 0x28, 0x0e, 0x28, 0x22, 0x12, 0x16, 0x00, 0x22, 0x1c, 0x0d, 0x21, 0x8c, 0x20, 0x1a, 0xe0, 0x22, 0x1c, 0x0d, 0x21, 0x83, 0x20, 0x16, 0xe0, 0x22, 0x1c, 0x0d, 0x21, 0x84, 0x20, 0x12, 0xe0, 0x22, 0x1c, 0x0d, 0x21, 0x85, 0x20, 0x0e, 0xe0, 0x22, 0x1c, 0x0d, 0x21, 0x86, 0x20, 0x3c, 0x00, 0xa8, 0xb1, 0x00, 0x00, 0x0a, 0xe0, 0x22, 0x1c, 0x0d, 0x21, 0x87, 0x20, 0x06, 0xe0, 0x22, 0x1c, 0x0d, 0x21, 0x89, 0x20, 0x02, 0xe0, 0x22, 0x1c, 0x0d, 0x21, 0x8b, 0x20, 0x08, 0xf0, 0xf6, 0xfa, 0xb0, 0xbd, 0xe8, 0x68, 0xf6, 0xf7, 0xe6, 0xf9, 0x20, 0x1c, 0xf6, 0xf7, 0x11, 0xfb, 0xb0, 0xbd, 0xfe, 0xb5, 0x05, 0x1c, 0x90, 0x20, 0xf6, 0xf7, 0x2d, 0xfb, 0x04, 0x1c, 0x90, 0x21, 0xf5, 0xf7, 0x3c, 0x00, 0xe4, 0xb1, 0x00, 0x00, 0x5b, 0xf9, 0x37, 0x4e, 0x01, 0x27, 0xf0, 0x69, 0x04, 0x28, 0x03, 0xd9, 0x70, 0x6b, 0x01, 0x30, 0x70, 0x63, 0x4d, 0xe0, 0x33, 0x48, 0xb1, 0x6b, 0x04, 0xf0, 0xd0, 0xf8, 0x01, 0x20, 0x20, 0x62, 0xa8, 0x7e, 0x21, 0x1c, 0x80, 0x31, 0x02, 0x91, 0x08, 0x70, 0x22, 0x1c, 0x60, 0x32, 0x01, 0x92, 0x00, 0x20, 0x2f, 0x1c, 0x20, 0x37, 0x90, 0x72, 0x78, 0x7a, 0x2b, 0x1c, 0x3c, 0x00, 0x20, 0xb2, 0x00, 0x00, 0x14, 0x33, 0xd0, 0x72, 0xe8, 0x68, 0xaa, 0x1d, 0xa0, 0x60, 0xe8, 0x6b, 0x48, 0x60, 0x44, 0x20, 0x40, 0x5d, 0x08, 0x72, 0x29, 0x1c, 0x20, 0x1c, 0x05, 0xf0, 0xaa, 0xfc, 0x68, 0x6a, 0x00, 0x28, 0x0a, 0xd1, 0x01, 0x9a, 0x20, 0x1c, 0x93, 0x7a, 0x02, 0x99, 0x22, 0x1c, 0x70, 0x32, 0x58, 0x30, 0x09, 0x78, 0xfa, 0xf7, 0xdb, 0xf9, 0x06, 0xe0, 0x3a, 0x7a, 0x23, 0x1c, 0x3c, 0x00, 0x5c, 0xb2, 0x00, 0x00, 0xe8, 0x69, 0x29, 0x6a, 0x70, 0x33, 0xfd, 0xf7, 0x8d, 0xf9, 0x30, 0x20, 0x40, 0x5d, 0x18, 0x49, 0x07, 0x28, 0x0b, 0xd1, 0x58, 0x20, 0x00, 0x5d, 0xc0, 0x07, 0xc0, 0x17, 0x01, 0x30, 0xe0, 0x61, 0x00, 0x20, 0x20, 0x61, 0x20, 0x1c, 0xf7, 0xf7, 0x3f, 0xff, 0x18, 0xe0, 0x01, 0x22, 0x20, 0x1c, 0x05, 0xf0, 0xac, 0xff, 0x07, 0x1c, 0x12, 0xd0, 0x03, 0xf0, 0x06, 0xff, 0x3c, 0x00, 0x98, 0xb2, 0x00, 0x00, 0xf3, 0x6d, 0x00, 0x2b, 0x06, 0xd0, 0x60, 0x68, 0x20, 0x30, 0x82, 0x7b, 0x61, 0x6b, 0x38, 0x1c, 0xf5, 0xf7, 0x99, 0xf8, 0xe8, 0x68, 0xf6, 0xf7, 0x73, 0xf9, 0x20, 0x1c, 0xf6, 0xf7, 0x9e, 0xfa, 0xfe, 0xbd, 0xf0, 0x69, 0x01, 0x30, 0xf0, 0x61, 0xfa, 0xe7, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x05, 0x31, 0x00, 0x00, 0x70, 0xb5, 0x06, 0x1c, 0x3c, 0x00, 0xd4, 0xb2, 0x00, 0x00, 0x0d, 0x1c, 0x09, 0x04, 0x09, 0x0c, 0x00, 0x20, 0xf6, 0xf7, 0x7c, 0xf9, 0x04, 0x1c, 0x2a, 0x1c, 0x31, 0x1c, 0x00, 0x68, 0xf5, 0xf7, 0x06, 0xf9, 0x20, 0x1c, 0x70, 0xbd, 0x40, 0x88, 0x70, 0x47, 0x03, 0x78, 0x1b, 0x07, 0x9b, 0x0f, 0x0b, 0x70, 0x00, 0x78, 0x00, 0x09, 0x10, 0x70, 0x70, 0x47, 0x04, 0x30, 0x70, 0x47, 0x04, 0x30, 0x70, 0x47, 0xd4, 0x21, 0x01, 0x70, 0x3c, 0x00, 0x10, 0xb3, 0x00, 0x00, 0x00, 0x21, 0x41, 0x70, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x21, 0x01, 0x70, 0x00, 0x21, 0x41, 0x70, 0x70, 0x47, 0x00, 0x00, 0xb4, 0x21, 0x01, 0x70, 0x00, 0x21, 0x41, 0x70, 0x70, 0x47, 0x00, 0x00, 0x01, 0x49, 0x48, 0x65, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x01, 0x49, 0x08, 0x65, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x01, 0x49, 0x88, 0x65, 0x3c, 0x00, 0x4c, 0xb3, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0xf8, 0xb5, 0x5f, 0x4f, 0x05, 0x1c, 0xb8, 0x68, 0x01, 0x30, 0xb8, 0x60, 0x07, 0xf0, 0x24, 0xfd, 0x38, 0x61, 0x90, 0x20, 0xf6, 0xf7, 0x66, 0xfa, 0x04, 0x1c, 0x90, 0x21, 0xf5, 0xf7, 0x94, 0xf8, 0x28, 0x6b, 0x27, 0x1c, 0x60, 0x63, 0x68, 0x8b, 0x80, 0x37, 0x26, 0x1c, 0xc0, 0x07, 0xc0, 0x0f, 0x20, 0x62, 0x68, 0x8b, 0x3c, 0x00, 0x88, 0xb3, 0x00, 0x00, 0x60, 0x36, 0x02, 0x21, 0x40, 0x07, 0xc0, 0x0f, 0x20, 0x63, 0x68, 0x8b, 0x80, 0x07, 0xc0, 0x0f, 0xf8, 0x60, 0x28, 0x7f, 0x38, 0x70, 0xb1, 0x72, 0x00, 0x28, 0x08, 0xd1, 0xf9, 0xf7, 0xc8, 0xff, 0x00, 0x28, 0x02, 0xd0, 0x01, 0x20, 0x60, 0x62, 0x01, 0xe0, 0x01, 0x20, 0xa0, 0x62, 0xf8, 0x68, 0x00, 0x28, 0x03, 0xd0, 0x00, 0x21, 0x02, 0x20, 0x06, 0xf0, 0xcc, 0xff, 0x3c, 0x00, 0xc4, 0xb3, 0x00, 0x00, 0x2b, 0x1c, 0x10, 0x33, 0xaa, 0x1d, 0x29, 0x1c, 0x20, 0x1c, 0x05, 0xf0, 0xdf, 0xfb, 0xa8, 0x6a, 0x00, 0x28, 0x0c, 0xd1, 0x39, 0x78, 0x02, 0x29, 0x07, 0xd0, 0x22, 0x1c, 0x70, 0x32, 0x20, 0x1c, 0x58, 0x30, 0xb3, 0x7a, 0xfa, 0xf7, 0x10, 0xf9, 0x08, 0xe0, 0x01, 0x26, 0x5e, 0xe0, 0xaa, 0x7d, 0x23, 0x1c, 0x28, 0x6a, 0x69, 0x6a, 0x70, 0x33, 0xfd, 0xf7, 0xc0, 0xf8, 0x3c, 0x00, 0x00, 0xb4, 0x00, 0x00, 0xe9, 0x68, 0x00, 0x20, 0x09, 0x89, 0x00, 0x29, 0x00, 0xd1, 0x04, 0x20, 0xf0, 0x72, 0x38, 0x78, 0x01, 0x28, 0x14, 0xd1, 0x00, 0x27, 0x00, 0x90, 0x00, 0x20, 0x06, 0xe0, 0x29, 0x69, 0x01, 0x29, 0x03, 0xd1, 0xa9, 0x69, 0x01, 0x27, 0x89, 0x07, 0x1a, 0xd5, 0x06, 0xf0, 0x79, 0xfc, 0x00, 0x28, 0xf4, 0xd1, 0x01, 0x2f, 0x14, 0xd1, 0x00, 0x98, 0x01, 0x28, 0x11, 0xd1, 0x3c, 0x00, 0x3c, 0xb4, 0x00, 0x00, 0x08, 0xe0, 0x20, 0x1c, 0x58, 0x30, 0x06, 0xf0, 0xe1, 0xfc, 0x00, 0x28, 0x0a, 0xd0, 0x80, 0x69, 0x80, 0x07, 0x07, 0xd5, 0xf0, 0x7a, 0x08, 0x21, 0x08, 0x43, 0xf0, 0x72, 0x01, 0x20, 0xe0, 0x62, 0xe8, 0x7d, 0x30, 0x73, 0xe8, 0x68, 0xa0, 0x60, 0xe0, 0x6a, 0x00, 0x28, 0x12, 0xd0, 0x1a, 0x4f, 0xf8, 0x6b, 0x00, 0x28, 0x0e, 0xd0, 0x30, 0x7b, 0xf5, 0xf7, 0xde, 0xfe, 0x3c, 0x00, 0x78, 0xb4, 0x00, 0x00, 0x00, 0x28, 0x09, 0xd0, 0x21, 0x1c, 0x38, 0x1c, 0x40, 0x30, 0xfc, 0xf7, 0x55, 0xfc, 0x14, 0x48, 0xb9, 0x6b, 0x03, 0xf0, 0x89, 0xff, 0xf8, 0xbd, 0x10, 0x4f, 0x12, 0x48, 0xb9, 0x6b, 0x03, 0xf0, 0x83, 0xff, 0x00, 0x22, 0x20, 0x1c, 0x10, 0x49, 0x05, 0xf0, 0xa2, 0xfe, 0x06, 0x1c, 0x03, 0xd1, 0x38, 0x6a, 0x01, 0x30, 0x38, 0x62, 0xee, 0xe7, 0x20, 0x1c, 0xf6, 0xf7, 0x3c, 0x00, 0xb4, 0xb4, 0x00, 0x00, 0x9f, 0xf9, 0xe8, 0x68, 0xf6, 0xf7, 0x6e, 0xf8, 0x03, 0xf0, 0xf2, 0xfd, 0x04, 0x48, 0x83, 0x6d, 0x00, 0x2b, 0xe2, 0xd0, 0x00, 0x22, 0x30, 0x1c, 0x29, 0x6b, 0xf4, 0xf7, 0x86, 0xff, 0xdc, 0xe7, 0xc4, 0x69, 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x11, 0x30, 0x00, 0x00, 0x10, 0xb5, 0x0a, 0x20, 0x07, 0xf0, 0xfe, 0xfc, 0x07, 0xf0, 0x5e, 0xfc, 0x3c, 0x00, 0xf0, 0xb4, 0x00, 0x00, 0x0b, 0x49, 0x44, 0x18, 0x0c, 0xe0, 0x20, 0x1c, 0x07, 0xf0, 0x90, 0xfb, 0x00, 0x28, 0x07, 0xd0, 0xf7, 0xf7, 0x34, 0xf9, 0x00, 0x28, 0x03, 0xd0, 0x12, 0x21, 0x86, 0x20, 0xf5, 0xf7, 0xca, 0xfe, 0xf7, 0xf7, 0x2c, 0xf9, 0x00, 0x28, 0xee, 0xd1, 0x01, 0xf0, 0x80, 0xfd, 0x10, 0xbd, 0x00, 0x00, 0x40, 0x9c, 0x00, 0x00, 0x10, 0xb5, 0x0c, 0x1c, 0x01, 0x1c, 0x17, 0x4a, 0x3c, 0x00, 0x2c, 0xb5, 0x00, 0x00, 0x01, 0x29, 0x50, 0x69, 0x04, 0xd0, 0x80, 0x29, 0x1d, 0xd0, 0x81, 0x29, 0x21, 0xd1, 0x1c, 0xe0, 0x91, 0x78, 0x01, 0x29, 0x15, 0xd1, 0x02, 0x21, 0x91, 0x70, 0x14, 0x1c, 0x01, 0x1c, 0x10, 0x48, 0x03, 0xf0, 0x28, 0xff, 0x01, 0x21, 0x60, 0x69, 0x00, 0xf0, 0x2e, 0xf9, 0x60, 0x69, 0x01, 0xf0, 0x5f, 0xfc, 0x20, 0x70, 0xa0, 0x88, 0xa1, 0x69, 0x00, 0x23, 0x0a, 0x4a, 0x3c, 0x00, 0x68, 0xb5, 0x00, 0x00, 0x07, 0xf0, 0x7e, 0xfc, 0x10, 0xbd, 0x22, 0x21, 0x06, 0xe0, 0x01, 0xf0, 0x1d, 0xfc, 0x20, 0x1c, 0x00, 0xf0, 0x4a, 0xf8, 0x10, 0xbd, 0x1c, 0x21, 0x20, 0x20, 0xf5, 0xf7, 0x8f, 0xfe, 0x10, 0xbd, 0xb4, 0x79, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x3d, 0x2e, 0x00, 0x00, 0x70, 0xb5, 0x1c, 0x4c, 0xa0, 0x78, 0x00, 0x28, 0x32, 0xd0, 0x05, 0x28, 0x30, 0xd0, 0x60, 0x69, 0x3c, 0x00, 0xa4, 0xb5, 0x00, 0x00, 0x00, 0xf0, 0xea, 0xf8, 0x18, 0x4e, 0xb5, 0x79, 0xa0, 0x78, 0x01, 0x28, 0x0b, 0xd0, 0x02, 0x28, 0x0e, 0xd0, 0x03, 0x28, 0x10, 0xd0, 0x04, 0x28, 0x17, 0xd1, 0x42, 0x1f, 0x80, 0x21, 0x20, 0x20, 0x08, 0xf0, 0x08, 0xf8, 0x0e, 0xe0, 0x00, 0x21, 0x20, 0x20, 0x08, 0xf0, 0x31, 0xf8, 0x0c, 0xe0, 0xa0, 0x88, 0x07, 0xf0, 0x1d, 0xfc, 0x05, 0xe0, 0x20, 0x78, 0x00, 0xf0, 0x3c, 0x00, 0xe0, 0xb5, 0x00, 0x00, 0x39, 0xfa, 0x00, 0x20, 0x00, 0xf0, 0xc4, 0xfd, 0x60, 0x69, 0x01, 0xf0, 0xe1, 0xfb, 0x05, 0x20, 0xa0, 0x70, 0xb5, 0x71, 0x60, 0x69, 0x00, 0xf0, 0x61, 0xf9, 0x00, 0x22, 0x20, 0x21, 0x81, 0x20, 0x08, 0xf0, 0xd6, 0xf8, 0x70, 0xbd, 0x00, 0x00, 0xb4, 0x79, 0x01, 0x00, 0x20, 0x10, 0x07, 0x00, 0xb0, 0xb5, 0x0d, 0x4d, 0x04, 0x1c, 0xa8, 0x78, 0x00, 0x28, 0x14, 0xd0, 0x3c, 0x00, 0x1c, 0xb6, 0x00, 0x00, 0x68, 0x69, 0x00, 0xf0, 0x0b, 0xf9, 0x0a, 0x48, 0x69, 0x69, 0x03, 0xf0, 0xa7, 0xfe, 0xa8, 0x88, 0x07, 0xf0, 0x9e, 0xfb, 0x00, 0x2c, 0x02, 0xd0, 0x68, 0x78, 0x00, 0xf0, 0x79, 0xff, 0x00, 0x20, 0xa8, 0x70, 0xa9, 0x68, 0x20, 0x1c, 0xf4, 0xf7, 0xca, 0xfe, 0xb0, 0xbd, 0xb4, 0x79, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x06, 0x4b, 0x80, 0xb5, 0x99, 0x78, 0x03, 0x29, 0x3c, 0x00, 0x58, 0xb6, 0x00, 0x00, 0x06, 0xd1, 0x04, 0x21, 0x99, 0x70, 0x20, 0x21, 0x02, 0x1c, 0x80, 0x20, 0x08, 0xf0, 0xa4, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0xb4, 0x79, 0x01, 0x00, 0x10, 0xb5, 0x0c, 0x4c, 0xa1, 0x78, 0x03, 0x29, 0x0f, 0xd1, 0x10, 0x30, 0xfa, 0xf7, 0xde, 0xf8, 0x00, 0x28, 0x09, 0xd0, 0x20, 0x78, 0x00, 0xf0, 0xe5, 0xf9, 0x00, 0x20, 0x00, 0xf0, 0x70, 0xfd, 0x00, 0x21, 0x05, 0x48, 0x3c, 0x00, 0x94, 0xb6, 0x00, 0x00, 0xfc, 0xf7, 0x9c, 0xfa, 0x10, 0xbd, 0x1b, 0x21, 0x20, 0x20, 0xf5, 0xf7, 0x01, 0xfe, 0x10, 0xbd, 0xb4, 0x79, 0x01, 0x00, 0x51, 0xb6, 0x00, 0x00, 0x09, 0x49, 0x80, 0xb5, 0x89, 0x78, 0x03, 0x29, 0x09, 0xd1, 0x00, 0xf0, 0xcd, 0xf9, 0x00, 0x20, 0x00, 0xf0, 0x58, 0xfd, 0x01, 0x21, 0x05, 0x48, 0xfc, 0xf7, 0x84, 0xfa, 0x80, 0xbd, 0x17, 0x21, 0x20, 0x20, 0xf5, 0xf7, 0x3c, 0x00, 0xd0, 0xb6, 0x00, 0x00, 0xe9, 0xfd, 0x80, 0xbd, 0xb4, 0x79, 0x01, 0x00, 0x51, 0xb6, 0x00, 0x00, 0x70, 0xb5, 0x10, 0x4c, 0x1d, 0x1c, 0xa3, 0x78, 0x06, 0x1c, 0x04, 0x98, 0x00, 0x2b, 0x18, 0xd1, 0x01, 0x23, 0xa3, 0x70, 0x22, 0x61, 0xe6, 0x60, 0x61, 0x70, 0xa0, 0x60, 0xa5, 0x61, 0x00, 0x20, 0x07, 0xf0, 0xac, 0xfa, 0xa0, 0x80, 0x30, 0x1c, 0xf7, 0xf7, 0x3c, 0xfb, 0xe0, 0x80, 0x07, 0xf0, 0x3c, 0x00, 0x0c, 0xb7, 0x00, 0x00, 0x4f, 0xfb, 0xc7, 0x21, 0xc9, 0x00, 0x28, 0x1a, 0x41, 0x1a, 0x00, 0x22, 0x20, 0x20, 0x07, 0xf0, 0x57, 0xff, 0x70, 0xbd, 0xb4, 0x79, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, 0x00, 0xf0, 0x09, 0xf8, 0x20, 0x1c, 0x00, 0xf0, 0x24, 0xf8, 0x00, 0x2d, 0x01, 0xd0, 0xff, 0xf7, 0xd4, 0xfe, 0xb0, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x0c, 0x4c, 0x05, 0x1c, 0xa0, 0x68, 0x3c, 0x00, 0x48, 0xb7, 0x00, 0x00, 0x00, 0x28, 0x0f, 0xd1, 0x0a, 0x48, 0x01, 0x7e, 0x02, 0x22, 0x11, 0x40, 0x61, 0x60, 0x01, 0x7e, 0x11, 0x43, 0x01, 0x76, 0x07, 0x20, 0x03, 0xf0, 0x49, 0xfc, 0x20, 0x60, 0x03, 0xf0, 0x98, 0xff, 0x03, 0xf0, 0xee, 0xff, 0xa0, 0x68, 0x28, 0x43, 0xa0, 0x60, 0xb0, 0xbd, 0x40, 0x7c, 0x01, 0x00, 0x0c, 0x80, 0x07, 0x00, 0x0a, 0x49, 0x38, 0xb5, 0x0a, 0x1c, 0x20, 0x32, 0x3c, 0x00, 0x84, 0xb7, 0x00, 0x00, 0x94, 0x79, 0x00, 0xab, 0x1c, 0x70, 0xd2, 0x79, 0x07, 0x4c, 0x5a, 0x70, 0xe2, 0x68, 0x00, 0x2a, 0x02, 0xd1, 0x06, 0x4d, 0x01, 0x23, 0x6b, 0x70, 0x10, 0x43, 0xe0, 0x60, 0x00, 0xab, 0x18, 0x88, 0xc8, 0x84, 0x38, 0xbd, 0x00, 0x10, 0x07, 0x00, 0x40, 0x7c, 0x01, 0x00, 0x00, 0x50, 0x07, 0x00, 0xb0, 0xb5, 0x05, 0x1c, 0x00, 0x29, 0x01, 0xd0, 0x00, 0xf0, 0x28, 0xf8, 0x3c, 0x00, 0xc0, 0xb7, 0x00, 0x00, 0x06, 0x4c, 0x60, 0x78, 0x21, 0x69, 0x08, 0x43, 0x03, 0xd1, 0x01, 0x21, 0x0e, 0x20, 0x06, 0xf0, 0xc5, 0xfd, 0x20, 0x69, 0x28, 0x43, 0x20, 0x61, 0xb0, 0xbd, 0x00, 0x00, 0x18, 0x63, 0x01, 0x00, 0xb0, 0xb5, 0x0a, 0x4c, 0x05, 0x1c, 0x22, 0x69, 0x00, 0x20, 0x00, 0x2a, 0x0c, 0xd1, 0x00, 0x29, 0x00, 0xd0, 0x04, 0xe0, 0x60, 0x78, 0x00, 0x28, 0x02, 0xd1, 0x04, 0xf0, 0x3c, 0x00, 0xfc, 0xb7, 0x00, 0x00, 0x69, 0xfb, 0x60, 0x70, 0x28, 0x1c, 0x06, 0xf0, 0xef, 0xfc, 0x01, 0x20, 0xb0, 0xbd, 0x00, 0x00, 0x18, 0x63, 0x01, 0x00, 0x10, 0xb5, 0x08, 0x4c, 0x60, 0x78, 0x00, 0x28, 0x0a, 0xd0, 0x06, 0xf0, 0xe3, 0xfc, 0x00, 0x20, 0x60, 0x70, 0x20, 0x69, 0x00, 0x28, 0x03, 0xd0, 0x01, 0x21, 0x0e, 0x20, 0x06, 0xf0, 0x96, 0xfd, 0x10, 0xbd, 0x00, 0x00, 0x18, 0x63, 0x01, 0x00, 0x3c, 0x00, 0x38, 0xb8, 0x00, 0x00, 0x09, 0x49, 0x80, 0xb5, 0x0b, 0x69, 0x83, 0x42, 0x04, 0xd1, 0x4a, 0x78, 0x00, 0x2a, 0x01, 0xd1, 0x01, 0x22, 0x00, 0xe0, 0x00, 0x22, 0x83, 0x43, 0x0b, 0x61, 0x00, 0x2a, 0x03, 0xd0, 0x00, 0x21, 0x0e, 0x20, 0x06, 0xf0, 0x7f, 0xfd, 0x80, 0xbd, 0x18, 0x63, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x20, 0xf6, 0xf7, 0x56, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x3c, 0x00, 0x74, 0xb8, 0x00, 0x00, 0x00, 0xf0, 0x04, 0xf8, 0x20, 0x1c, 0x00, 0xf0, 0x1f, 0xf8, 0x10, 0xbd, 0xb0, 0xb5, 0x0c, 0x4d, 0x04, 0x1c, 0xa8, 0x68, 0xa0, 0x42, 0x0f, 0xd1, 0x07, 0x20, 0x29, 0x68, 0x08, 0xf0, 0x8c, 0xfb, 0x68, 0x68, 0x02, 0x22, 0x07, 0x49, 0x00, 0x28, 0x08, 0x7e, 0x01, 0xd0, 0x10, 0x43, 0x00, 0xe0, 0x90, 0x43, 0x08, 0x76, 0x04, 0xf0, 0xc4, 0xf8, 0xa8, 0x68, 0xa0, 0x43, 0x3c, 0x00, 0xb0, 0xb8, 0x00, 0x00, 0xa8, 0x60, 0xb0, 0xbd, 0x40, 0x7c, 0x01, 0x00, 0x0c, 0x80, 0x07, 0x00, 0x0a, 0x49, 0x38, 0xb5, 0x0a, 0x1c, 0x20, 0x32, 0x94, 0x79, 0x00, 0xab, 0x1c, 0x70, 0xd2, 0x79, 0x07, 0x4c, 0x5a, 0x70, 0xe2, 0x68, 0x82, 0x42, 0x02, 0xd1, 0x06, 0x4d, 0x00, 0x23, 0x6b, 0x70, 0x82, 0x43, 0xe2, 0x60, 0x00, 0xab, 0x18, 0x88, 0xc8, 0x84, 0x38, 0xbd, 0x00, 0x10, 0x07, 0x00, 0x3c, 0x00, 0xec, 0xb8, 0x00, 0x00, 0x40, 0x7c, 0x01, 0x00, 0x00, 0x50, 0x07, 0x00, 0xb0, 0xb5, 0x05, 0x1c, 0x0a, 0x4c, 0x00, 0x21, 0x60, 0x69, 0xff, 0xf7, 0x11, 0xff, 0x04, 0x20, 0x01, 0xf0, 0x46, 0xf9, 0x01, 0xf0, 0x88, 0xfb, 0x00, 0x22, 0x04, 0x21, 0x04, 0x20, 0x01, 0xf0, 0x8b, 0xf8, 0x28, 0x1c, 0x01, 0xf0, 0x4a, 0xfa, 0x60, 0x69, 0xff, 0xf7, 0xa7, 0xff, 0xb0, 0xbd, 0x40, 0x7c, 0x01, 0x00, 0x3c, 0x00, 0x28, 0xb9, 0x00, 0x00, 0x80, 0xb5, 0x01, 0xf0, 0x77, 0xfa, 0x80, 0xbd, 0xb0, 0xb5, 0x0d, 0x4d, 0x01, 0x21, 0x28, 0x69, 0xff, 0xf7, 0xf4, 0xfe, 0xff, 0xf7, 0x2a, 0xfe, 0x00, 0xf0, 0x2c, 0xfb, 0x00, 0xf0, 0x84, 0xfa, 0x00, 0x24, 0x00, 0x22, 0x04, 0x21, 0x20, 0x1c, 0x01, 0xf0, 0x6c, 0xf8, 0x01, 0x34, 0x24, 0x06, 0x24, 0x0e, 0x04, 0x2c, 0xf5, 0xd3, 0x28, 0x69, 0xff, 0xf7, 0x86, 0xff, 0x3c, 0x00, 0x64, 0xb9, 0x00, 0x00, 0xb0, 0xbd, 0x00, 0x00, 0x40, 0x7c, 0x01, 0x00, 0xf8, 0xb5, 0x05, 0x1c, 0x0e, 0x1c, 0x07, 0x4c, 0x17, 0x1c, 0x01, 0x21, 0x20, 0x69, 0xff, 0xf7, 0xd3, 0xfe, 0x3a, 0x1c, 0x31, 0x1c, 0x28, 0x1c, 0x01, 0xf0, 0x52, 0xf8, 0x20, 0x69, 0xff, 0xf7, 0x71, 0xff, 0xf8, 0xbd, 0x40, 0x7c, 0x01, 0x00, 0xff, 0xb5, 0x89, 0xb0, 0x06, 0x1c, 0x16, 0x98, 0x1d, 0x1c, 0x00, 0x28, 0x3c, 0x00, 0xa0, 0xb9, 0x00, 0x00, 0x01, 0xd0, 0x29, 0x48, 0x14, 0x90, 0x28, 0x68, 0x00, 0x88, 0x00, 0x06, 0x80, 0x0e, 0x20, 0x28, 0x01, 0xd0, 0x14, 0x28, 0x17, 0xd1, 0x0a, 0xaa, 0x18, 0x24, 0x18, 0x21, 0x05, 0xca, 0xff, 0xf7, 0x77, 0xf9, 0x07, 0x1c, 0x28, 0x1c, 0x01, 0x89, 0xa1, 0x42, 0x02, 0xdd, 0x00, 0x68, 0x01, 0x19, 0x0b, 0xe0, 0xc0, 0x68, 0x64, 0x1a, 0x00, 0x28, 0xf5, 0xd1, 0x0f, 0x21, 0x3c, 0x00, 0xdc, 0xb9, 0x00, 0x00, 0x86, 0x20, 0xf5, 0xf7, 0x61, 0xfc, 0x00, 0x21, 0x01, 0xe0, 0x00, 0x21, 0x00, 0x27, 0x18, 0x48, 0x08, 0x90, 0x80, 0x79, 0x07, 0x90, 0x0c, 0x20, 0x16, 0x4a, 0x70, 0x43, 0x80, 0x18, 0x04, 0x79, 0x04, 0x91, 0x12, 0x99, 0x15, 0x98, 0x14, 0x9a, 0x01, 0x91, 0x03, 0x90, 0x05, 0x97, 0x00, 0x95, 0x0a, 0xab, 0x02, 0x92, 0x21, 0x1c, 0x30, 0x1c, 0x0c, 0xcb, 0xf7, 0xf7, 0x3c, 0x00, 0x18, 0xba, 0x00, 0x00, 0x03, 0xf9, 0x01, 0x25, 0xb5, 0x40, 0x0c, 0x4e, 0x08, 0x3e, 0x30, 0x78, 0x28, 0x40, 0x06, 0xd0, 0x20, 0x1c, 0x00, 0xf0, 0xc9, 0xfd, 0x30, 0x78, 0xa8, 0x43, 0x30, 0x70, 0x03, 0xe0, 0x20, 0x1c, 0x13, 0x99, 0x00, 0xf0, 0x43, 0xff, 0x07, 0xa9, 0x03, 0xc9, 0x88, 0x71, 0x0d, 0xb0, 0xf0, 0xbd, 0x95, 0x24, 0x00, 0x00, 0x20, 0x10, 0x07, 0x00, 0x74, 0x7a, 0x01, 0x00, 0x3c, 0x00, 0x54, 0xba, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0c, 0x23, 0x09, 0x49, 0x58, 0x43, 0x40, 0x18, 0x00, 0x79, 0x05, 0x1c, 0x00, 0xf0, 0x92, 0xfe, 0x28, 0x1c, 0xf7, 0xf7, 0xc7, 0xf8, 0x01, 0x20, 0x03, 0x4a, 0xa0, 0x40, 0x08, 0x3a, 0x11, 0x78, 0x81, 0x43, 0x11, 0x70, 0xb0, 0xbd, 0x00, 0x00, 0x74, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0x05, 0x4c, 0x20, 0x78, 0x00, 0x28, 0x03, 0xd1, 0x1a, 0x21, 0x3c, 0x00, 0x90, 0xba, 0x00, 0x00, 0x86, 0x20, 0xf5, 0xf7, 0x07, 0xfc, 0x20, 0x78, 0x10, 0xbd, 0x00, 0x00, 0x18, 0x63, 0x01, 0x00, 0x01, 0x48, 0x40, 0x78, 0x70, 0x47, 0x00, 0x00, 0x2c, 0x63, 0x01, 0x00, 0x80, 0xb5, 0xf6, 0xf7, 0xd1, 0xfe, 0x00, 0xf0, 0x1b, 0xf9, 0x80, 0xbd, 0xfe, 0xb5, 0x01, 0x68, 0x05, 0x1c, 0x0c, 0x68, 0x0e, 0x1c, 0x21, 0x78, 0x88, 0x07, 0x71, 0xd1, 0x68, 0x69, 0xc2, 0x07, 0x3c, 0x00, 0xcc, 0xba, 0x00, 0x00, 0x6e, 0xd5, 0x80, 0x07, 0x6d, 0xd5, 0xe8, 0x7a, 0xc2, 0x07, 0x08, 0x07, 0x09, 0x09, 0x02, 0x91, 0x45, 0x49, 0x80, 0x0f, 0xd2, 0x0f, 0x00, 0x28, 0x4f, 0x68, 0x05, 0xd0, 0x01, 0x28, 0x09, 0xd0, 0x02, 0x28, 0x21, 0xd0, 0x03, 0x28, 0x5b, 0xd1, 0xff, 0x23, 0x20, 0x1c, 0xa9, 0x7a, 0xf4, 0xf7, 0x74, 0xfc, 0x55, 0xe0, 0x02, 0x98, 0x0b, 0x28, 0x0a, 0xd0, 0x0c, 0x28, 0x3c, 0x00, 0x08, 0xbb, 0x00, 0x00, 0x0f, 0xd0, 0x0d, 0x28, 0x4e, 0xd1, 0x39, 0x4f, 0xf8, 0x68, 0xf4, 0xf7, 0x61, 0xfc, 0x00, 0x20, 0xc0, 0x43, 0x5a, 0xe0, 0x35, 0x4f, 0xa9, 0x7a, 0xbb, 0x68, 0x20, 0x1c, 0xf4, 0xf7, 0x5b, 0xfc, 0x40, 0xe0, 0x32, 0x4f, 0x38, 0x69, 0xf4, 0xf7, 0x53, 0xfc, 0x3b, 0xe0, 0x00, 0x21, 0x01, 0x91, 0x02, 0x99, 0x00, 0x20, 0xff, 0x23, 0x09, 0x07, 0x01, 0xd4, 0x01, 0x20, 0x3c, 0x00, 0x44, 0xbb, 0x00, 0x00, 0x13, 0xe0, 0x31, 0x89, 0x19, 0x29, 0x01, 0xd3, 0x26, 0x7e, 0x07, 0xe0, 0x15, 0x29, 0x04, 0xd3, 0x18, 0x26, 0x71, 0x1a, 0x49, 0x19, 0x0e, 0x7b, 0x00, 0xe0, 0x00, 0x26, 0xb1, 0x06, 0x02, 0xd4, 0x01, 0x20, 0x73, 0x07, 0x5b, 0x0f, 0x01, 0x21, 0x01, 0x91, 0x00, 0x28, 0x03, 0xd0, 0xa9, 0x7a, 0x20, 0x1c, 0xf4, 0xf7, 0x36, 0xfc, 0x01, 0x99, 0x01, 0x29, 0x15, 0xd1, 0x3c, 0x00, 0x80, 0xbb, 0x00, 0x00, 0xf0, 0x06, 0xc6, 0x0f, 0x20, 0x88, 0x1b, 0x4f, 0xe4, 0x8a, 0xf9, 0x6b, 0x00, 0x05, 0xc0, 0x0f, 0x00, 0x29, 0x1a, 0xd0, 0x4b, 0x1c, 0x18, 0xd0, 0x00, 0x2e, 0x0a, 0xd0, 0x00, 0x28, 0x08, 0xd0, 0x38, 0x88, 0x84, 0x42, 0x13, 0xd0, 0x02, 0x98, 0x0c, 0x28, 0x01, 0xe0, 0x1d, 0xe0, 0x12, 0xe0, 0x0d, 0xd0, 0x08, 0x1c, 0x01, 0xf0, 0x76, 0xf9, 0x00, 0x28, 0x03, 0xd1, 0x3c, 0x00, 0xbc, 0xbb, 0x00, 0x00, 0x00, 0xf0, 0xa6, 0xfa, 0xf4, 0xf7, 0x0a, 0xfc, 0x00, 0x20, 0xc0, 0x43, 0xf8, 0x63, 0x00, 0x2e, 0x0d, 0xd0, 0x3c, 0x80, 0x00, 0x20, 0xf8, 0x63, 0x09, 0xe0, 0x20, 0x88, 0x00, 0x06, 0x80, 0x0e, 0x20, 0x28, 0x04, 0xd1, 0x04, 0x4f, 0x20, 0x1c, 0xb9, 0x6a, 0xf4, 0xf7, 0xf8, 0xfb, 0x29, 0x1c, 0x02, 0x48, 0xfb, 0xf7, 0xef, 0xff, 0xfe, 0xbd, 0x28, 0x7a, 0x01, 0x00, 0x3c, 0x00, 0xf8, 0xbb, 0x00, 0x00, 0xa5, 0x9a, 0x00, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x00, 0x78, 0x00, 0x21, 0x00, 0xf0, 0xfc, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x18, 0x63, 0x01, 0x00, 0x04, 0x4b, 0x05, 0x49, 0x00, 0x28, 0x1a, 0x68, 0x00, 0xd0, 0x01, 0x1c, 0x10, 0x1c, 0x19, 0x60, 0x70, 0x47, 0x00, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x95, 0x75, 0x00, 0x00, 0x05, 0x48, 0x80, 0xb5, 0x00, 0x7f, 0x24, 0x23, 0x3c, 0x00, 0x34, 0xbc, 0x00, 0x00, 0x04, 0x49, 0x58, 0x43, 0x40, 0x18, 0xc0, 0x69, 0xf4, 0xf7, 0xcc, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x94, 0x46, 0x01, 0x00, 0x02, 0x1c, 0x06, 0x48, 0x80, 0xb5, 0x81, 0x62, 0x82, 0x60, 0x00, 0x7f, 0x24, 0x23, 0x04, 0x49, 0x58, 0x43, 0x40, 0x18, 0x80, 0x69, 0xf4, 0xf7, 0xb9, 0xfb, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x94, 0x46, 0x01, 0x00, 0x3c, 0x00, 0x70, 0xbc, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x20, 0x00, 0xf0, 0x3c, 0xfb, 0x00, 0x20, 0x00, 0xf0, 0x6d, 0xfa, 0x00, 0xf0, 0x65, 0xfa, 0x04, 0x49, 0xc8, 0x6a, 0x01, 0x30, 0xc8, 0x62, 0x08, 0x1f, 0x00, 0x88, 0x07, 0xf0, 0xc1, 0xf8, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x06, 0x48, 0x80, 0xb5, 0x00, 0x21, 0x01, 0x77, 0xc1, 0x6a, 0x01, 0x31, 0xc1, 0x62, 0x04, 0x38, 0x00, 0x88, 0x07, 0xf0, 0x3c, 0x00, 0xac, 0xbc, 0x00, 0x00, 0xb3, 0xf8, 0x03, 0xf0, 0xd1, 0xf9, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x05, 0xf0, 0xe9, 0xfa, 0x80, 0xbd, 0x80, 0xb5, 0x00, 0x28, 0x03, 0xd1, 0x01, 0x20, 0x04, 0xf0, 0x22, 0xfa, 0x80, 0xbd, 0x01, 0x20, 0x03, 0xf0, 0xe6, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x03, 0x49, 0x01, 0x20, 0x49, 0x78, 0x00, 0x29, 0x00, 0xd0, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xbc, 0x00, 0x00, 0x2c, 0x63, 0x01, 0x00, 0x70, 0xb5, 0x13, 0x4d, 0x28, 0x78, 0x00, 0x28, 0x20, 0xd1, 0x01, 0x21, 0x2e, 0x1c, 0x70, 0x68, 0xff, 0xf7, 0x12, 0xfd, 0x00, 0x21, 0x07, 0x20, 0x06, 0xf0, 0x2a, 0xfb, 0x0d, 0x48, 0x00, 0x24, 0x04, 0x71, 0x04, 0xf0, 0xed, 0xf8, 0x06, 0xf0, 0xd5, 0xf9, 0x01, 0x20, 0x28, 0x70, 0x0a, 0x48, 0x04, 0x60, 0x44, 0x60, 0xf6, 0xf7, 0x4c, 0xfd, 0x3c, 0x00, 0x24, 0xbd, 0x00, 0x00, 0xf7, 0xf7, 0x5e, 0xf8, 0xff, 0xf7, 0xa2, 0xff, 0x00, 0xf0, 0xa8, 0xfd, 0x05, 0x48, 0x71, 0x68, 0x03, 0xf0, 0x20, 0xfb, 0x01, 0x20, 0x70, 0xbd, 0x2c, 0x63, 0x01, 0x00, 0x50, 0x00, 0x07, 0x00, 0x80, 0x00, 0x07, 0x00, 0xc4, 0x60, 0x01, 0x00, 0xb0, 0xb5, 0x1e, 0x4c, 0x20, 0x78, 0x01, 0x28, 0x35, 0xd1, 0x25, 0x1c, 0x69, 0x68, 0x1c, 0x48, 0x03, 0xf0, 0x20, 0xfb, 0x3c, 0x00, 0x60, 0xbd, 0x00, 0x00, 0x04, 0xf0, 0xf0, 0xf8, 0x1a, 0x48, 0x01, 0x68, 0x49, 0x08, 0x49, 0x00, 0x01, 0x60, 0x01, 0x68, 0x01, 0x22, 0x11, 0x43, 0x01, 0x60, 0x00, 0xf0, 0x2b, 0xfe, 0x00, 0xf0, 0x1b, 0xfc, 0x06, 0xf0, 0x99, 0xf8, 0xf6, 0xf7, 0x29, 0xfe, 0xf6, 0xf7, 0x2d, 0xfc, 0x00, 0x20, 0x20, 0x70, 0xff, 0xf7, 0x83, 0xff, 0x00, 0xf0, 0x8b, 0xfd, 0x0f, 0x48, 0x81, 0x78, 0x08, 0x22, 0x3c, 0x00, 0x9c, 0xbd, 0x00, 0x00, 0x91, 0x43, 0x81, 0x70, 0x81, 0x78, 0x11, 0x43, 0x81, 0x70, 0x0c, 0x49, 0x10, 0x20, 0x08, 0x71, 0x68, 0x68, 0xff, 0xf7, 0x5f, 0xfd, 0xf7, 0xf7, 0x39, 0xf8, 0xf6, 0xf7, 0x4d, 0xfd, 0x01, 0x21, 0x07, 0x20, 0x06, 0xf0, 0xcd, 0xfa, 0x01, 0x20, 0xb0, 0xbd, 0x00, 0x00, 0x2c, 0x63, 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, 0xf0, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x3c, 0x00, 0xd8, 0xbd, 0x00, 0x00, 0x50, 0x00, 0x07, 0x00, 0x03, 0x49, 0x01, 0x20, 0x89, 0x7a, 0x01, 0x29, 0x00, 0xd0, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, 0xb0, 0xb5, 0x15, 0x4d, 0x04, 0x1c, 0x28, 0x7a, 0x00, 0x28, 0x20, 0xd1, 0xf9, 0xf7, 0x00, 0xfc, 0x02, 0x28, 0x1c, 0xd1, 0x01, 0x20, 0x28, 0x72, 0xe8, 0x68, 0x00, 0x28, 0x10, 0xd0, 0x20, 0x68, 0x29, 0x68, 0x08, 0x60, 0x3c, 0x00, 0x14, 0xbe, 0x00, 0x00, 0x69, 0x68, 0x0d, 0x48, 0x03, 0xf0, 0xc2, 0xfa, 0x01, 0x21, 0x68, 0x68, 0xff, 0xf7, 0xc8, 0xfc, 0x00, 0x22, 0x24, 0x20, 0x61, 0x68, 0x07, 0xf0, 0xcf, 0xfb, 0xb0, 0xbd, 0x00, 0x20, 0x28, 0x72, 0x21, 0x68, 0x01, 0x20, 0xf4, 0xf7, 0xcf, 0xfa, 0xb0, 0xbd, 0x00, 0x20, 0x21, 0x68, 0xf4, 0xf7, 0xca, 0xfa, 0xb0, 0xbd, 0x04, 0x7a, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x3c, 0x00, 0x50, 0xbe, 0x00, 0x00, 0x04, 0x48, 0x80, 0xb5, 0x00, 0x7a, 0x01, 0x28, 0x02, 0xd1, 0x00, 0x20, 0x02, 0xf0, 0xf0, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x04, 0x7a, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x28, 0x07, 0xd0, 0x80, 0x28, 0x09, 0xd1, 0x07, 0x48, 0x00, 0x7a, 0x00, 0x28, 0x04, 0xd0, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x02, 0xf0, 0xde, 0xfe, 0x80, 0xbd, 0x0e, 0x21, 0x24, 0x20, 0xf5, 0xf7, 0x3c, 0x00, 0x8c, 0xbe, 0x00, 0x00, 0x0b, 0xfa, 0x80, 0xbd, 0x04, 0x7a, 0x01, 0x00, 0xf8, 0xb5, 0x3a, 0x4e, 0x05, 0x1c, 0xb0, 0x7a, 0x00, 0x28, 0x69, 0xd1, 0xf9, 0xf7, 0xae, 0xfb, 0x02, 0x28, 0x65, 0xd1, 0x36, 0x48, 0x00, 0x68, 0x00, 0x28, 0x61, 0xd0, 0x35, 0x48, 0x71, 0x68, 0x03, 0xf0, 0x74, 0xfa, 0x01, 0x21, 0x70, 0x68, 0xff, 0xf7, 0x7a, 0xfc, 0x6c, 0x20, 0xf5, 0xf7, 0xb9, 0xfc, 0x04, 0x1c, 0x3c, 0x00, 0xc8, 0xbe, 0x00, 0x00, 0x6c, 0x21, 0xf4, 0xf7, 0xe7, 0xfa, 0x30, 0x68, 0x2c, 0x22, 0x04, 0x60, 0x29, 0x68, 0x81, 0x60, 0x69, 0x68, 0xc1, 0x60, 0x00, 0x21, 0x11, 0x54, 0x81, 0x62, 0xa9, 0x68, 0x00, 0x29, 0x02, 0xd0, 0xe9, 0x68, 0x01, 0x61, 0x05, 0xe0, 0x06, 0xf0, 0x5d, 0xff, 0x69, 0x68, 0x40, 0x18, 0x31, 0x68, 0x08, 0x61, 0x70, 0x68, 0xff, 0xf7, 0x14, 0xfd, 0x69, 0x21, 0x08, 0x55, 0x3c, 0x00, 0x04, 0xbf, 0x00, 0x00, 0x00, 0x20, 0xf9, 0xf7, 0x09, 0xfb, 0x01, 0x27, 0x3b, 0x1c, 0x06, 0x1c, 0x22, 0x1c, 0x24, 0x32, 0x00, 0x21, 0xf9, 0xf7, 0x79, 0xfb, 0x1c, 0x48, 0x03, 0x21, 0x00, 0x88, 0x89, 0x03, 0x08, 0x43, 0x21, 0x1c, 0x40, 0x31, 0x00, 0x91, 0x48, 0x83, 0x18, 0x48, 0x10, 0x21, 0x60, 0x60, 0x18, 0x48, 0xa0, 0x60, 0xa7, 0x63, 0x67, 0x63, 0x00, 0x20, 0xf5, 0xf7, 0x4c, 0xfb, 0x3c, 0x00, 0x40, 0xbf, 0x00, 0x00, 0xe0, 0x60, 0x02, 0x89, 0x00, 0x99, 0xca, 0x83, 0x07, 0x68, 0x31, 0x1c, 0x38, 0x1d, 0x27, 0x61, 0xfe, 0xf7, 0x8e, 0xfe, 0x38, 0x1c, 0x0a, 0x30, 0x0f, 0x49, 0xfe, 0xf7, 0x89, 0xfe, 0xa4, 0x20, 0x38, 0x80, 0x00, 0x20, 0x04, 0xf0, 0xde, 0xfb, 0x00, 0x22, 0x1f, 0x20, 0x69, 0x68, 0x07, 0xf0, 0x2d, 0xfb, 0xf8, 0xbd, 0xff, 0xe7, 0x00, 0x20, 0x29, 0x68, 0xf4, 0xf7, 0x3c, 0x00, 0x7c, 0xbf, 0x00, 0x00, 0x2e, 0xfa, 0xf8, 0xe7, 0x14, 0x7a, 0x01, 0x00, 0x80, 0x5a, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0xfa, 0x60, 0x01, 0x00, 0x99, 0xec, 0x00, 0x00, 0x15, 0xed, 0x00, 0x00, 0x12, 0x61, 0x01, 0x00, 0x06, 0x48, 0x80, 0xb5, 0x81, 0x7a, 0x00, 0x29, 0x07, 0xd0, 0x00, 0x68, 0x04, 0x22, 0x20, 0x30, 0x01, 0x7b, 0x11, 0x43, 0x01, 0x73, 0x02, 0xf0, 0x6b, 0xfd, 0x80, 0xbd, 0x3c, 0x00, 0xb8, 0xbf, 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x4c, 0xa0, 0x7a, 0x01, 0x28, 0x03, 0xd1, 0x06, 0xf0, 0xf1, 0xfe, 0x21, 0x68, 0x88, 0x61, 0x10, 0xbd, 0x14, 0x7a, 0x01, 0x00, 0x03, 0x1c, 0x08, 0x1c, 0x1f, 0x49, 0x70, 0xb5, 0x0a, 0x68, 0x01, 0x2b, 0x1c, 0xd0, 0x80, 0x2b, 0x05, 0xd0, 0x83, 0x2b, 0x30, 0xd1, 0x88, 0x7a, 0x00, 0x28, 0x14, 0xd0, 0x29, 0xe0, 0x53, 0x69, 0x3c, 0x00, 0xf4, 0xbf, 0x00, 0x00, 0x00, 0x2b, 0x0e, 0xd0, 0x94, 0x69, 0xd5, 0x69, 0x2e, 0x1b, 0x0c, 0x69, 0x5d, 0x1b, 0x36, 0x1b, 0xb6, 0x10, 0xa4, 0x19, 0x0c, 0x61, 0xcc, 0x68, 0x2d, 0x1b, 0xad, 0x10, 0x64, 0x19, 0xcc, 0x60, 0x93, 0x61, 0x02, 0xf0, 0x81, 0xfd, 0x70, 0xbd, 0x02, 0x28, 0x12, 0xd1, 0x90, 0x6a, 0x0c, 0x1c, 0x00, 0x28, 0xf8, 0xd0, 0x07, 0xf0, 0x0e, 0xfa, 0xa0, 0x7a, 0x01, 0x28, 0x3c, 0x00, 0x30, 0xc0, 0x00, 0x00, 0xf3, 0xd1, 0x20, 0x68, 0x81, 0x6a, 0x00, 0x29, 0xef, 0xd1, 0x20, 0x30, 0x01, 0x7b, 0x08, 0x22, 0x11, 0x43, 0x01, 0x73, 0x70, 0xbd, 0x02, 0xf0, 0x21, 0xfd, 0x70, 0xbd, 0x0e, 0x21, 0x1f, 0x20, 0xf5, 0xf7, 0x28, 0xf9, 0x70, 0xbd, 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, 0x02, 0x49, 0x0c, 0x31, 0x03, 0xc9, 0x40, 0x18, 0x70, 0x47, 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, 0x3c, 0x00, 0x6c, 0xc0, 0x00, 0x00, 0x05, 0x48, 0x80, 0xb5, 0x00, 0x68, 0x04, 0x22, 0x20, 0x30, 0x01, 0x7b, 0x11, 0x43, 0x01, 0x73, 0x07, 0xf0, 0xe4, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, 0x70, 0xb5, 0x16, 0x4c, 0x0e, 0x1c, 0xa1, 0x7a, 0x00, 0x29, 0x1c, 0xd0, 0x21, 0x68, 0x08, 0x61, 0x07, 0xf0, 0x32, 0xfa, 0x00, 0x28, 0x17, 0xd0, 0x20, 0x68, 0x00, 0x25, 0x05, 0x62, 0x00, 0x22, 0x3c, 0x00, 0xa8, 0xc0, 0x00, 0x00, 0x83, 0x21, 0x1f, 0x20, 0x07, 0xf0, 0x94, 0xfa, 0x60, 0x68, 0xff, 0xf7, 0x03, 0xfc, 0x21, 0x68, 0x04, 0x22, 0x20, 0x31, 0x08, 0x7b, 0x2b, 0x1c, 0x90, 0x43, 0x08, 0x73, 0x31, 0x1c, 0x00, 0x22, 0x1f, 0x20, 0x07, 0xf0, 0x61, 0xfb, 0x70, 0xbd, 0x20, 0x68, 0x08, 0x22, 0x20, 0x30, 0x01, 0x7b, 0x11, 0x43, 0x01, 0x73, 0x02, 0xf0, 0xd6, 0xfc, 0x70, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0xc0, 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x77, 0xfc, 0x00, 0xf0, 0x6f, 0xfc, 0x00, 0xf0, 0x29, 0xff, 0x00, 0xf0, 0x5d, 0xfa, 0x00, 0xf0, 0xc5, 0xf8, 0x00, 0xf0, 0x85, 0xff, 0x80, 0xbd, 0x80, 0xb5, 0xfa, 0xf7, 0x85, 0xfa, 0x80, 0xbd, 0x01, 0x48, 0xc0, 0x68, 0x70, 0x47, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x3c, 0x00, 0x20, 0xc1, 0x00, 0x00, 0x02, 0x48, 0xc1, 0x60, 0x70, 0x47, 0x00, 0x00, 0x81, 0x75, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x01, 0x48, 0x02, 0x49, 0xc8, 0x60, 0x70, 0x47, 0x81, 0x75, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x01, 0x49, 0x88, 0x61, 0x70, 0x47, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x01, 0x49, 0x00, 0x20, 0x88, 0x61, 0x70, 0x47, 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x00, 0x28, 0x3c, 0x00, 0x5c, 0xc1, 0x00, 0x00, 0x00, 0xd0, 0x01, 0x1c, 0x02, 0x48, 0xc1, 0x61, 0x70, 0x47, 0x00, 0x00, 0x89, 0x75, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x02, 0x48, 0x81, 0x62, 0x70, 0x47, 0x00, 0x00, 0x8d, 0x75, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x02, 0x48, 0x01, 0x62, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xc1, 0x00, 0x00, 0x91, 0x75, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x02, 0x48, 0x01, 0x61, 0x70, 0x47, 0x00, 0x00, 0x99, 0x75, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x01, 0x48, 0x02, 0x49, 0x08, 0x61, 0x70, 0x47, 0x81, 0x75, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x02, 0x1c, 0x08, 0x1c, 0x80, 0x2a, 0x80, 0xb5, 0x02, 0xd1, 0x00, 0xf0, 0x3c, 0x00, 0xd4, 0xc1, 0x00, 0x00, 0x07, 0xf8, 0x80, 0xbd, 0x1e, 0x21, 0x21, 0x20, 0xf5, 0xf7, 0x62, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x10, 0x4d, 0x04, 0x1c, 0xa8, 0x6b, 0x01, 0x30, 0xa8, 0x63, 0x69, 0x6b, 0x09, 0x1a, 0x28, 0x1c, 0x00, 0x6b, 0x0c, 0x29, 0x03, 0xd9, 0x00, 0x21, 0xff, 0xf7, 0x91, 0xfa, 0x03, 0xe0, 0x08, 0x29, 0x01, 0xd1, 0xff, 0xf7, 0x32, 0xfb, 0x20, 0x1c, 0x00, 0xf0, 0x3c, 0x00, 0x10, 0xc2, 0x00, 0x00, 0x4d, 0xf9, 0x60, 0x69, 0x40, 0x07, 0x01, 0xd5, 0x03, 0xf0, 0x0c, 0xfc, 0x20, 0x1c, 0xe9, 0x6a, 0xf4, 0xf7, 0xdb, 0xf8, 0xb0, 0xbd, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x02, 0x48, 0x41, 0x62, 0x70, 0x47, 0x00, 0x00, 0xb5, 0x75, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x01, 0x20, 0x09, 0x6c, 0x00, 0x29, 0x3c, 0x00, 0x4c, 0xc2, 0x00, 0x00, 0x00, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0x07, 0x4c, 0xe1, 0x6b, 0x00, 0x29, 0x01, 0xd1, 0xe0, 0x63, 0x04, 0xe0, 0x81, 0x42, 0x02, 0xd0, 0x00, 0x20, 0xc0, 0x43, 0xf8, 0xe7, 0x06, 0xf0, 0x9c, 0xfd, 0x20, 0x64, 0x10, 0xbd, 0x28, 0x7a, 0x01, 0x00, 0x01, 0x48, 0x00, 0x6c, 0x70, 0x47, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x3c, 0x00, 0x88, 0xc2, 0x00, 0x00, 0x05, 0x49, 0x80, 0xb5, 0x00, 0x20, 0x48, 0x63, 0x88, 0x63, 0xff, 0x21, 0x09, 0x31, 0x15, 0x22, 0x10, 0x20, 0xf6, 0xf7, 0xfb, 0xf9, 0x80, 0xbd, 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x02, 0x48, 0x81, 0x60, 0x70, 0x47, 0x00, 0x00, 0xc1, 0x75, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x3c, 0x00, 0xc4, 0xc2, 0x00, 0x00, 0x02, 0x48, 0xc1, 0x62, 0x70, 0x47, 0x00, 0x00, 0xc5, 0x75, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x04, 0x4b, 0x05, 0x49, 0x00, 0x28, 0x5a, 0x68, 0x00, 0xd0, 0x01, 0x1c, 0x10, 0x1c, 0x59, 0x60, 0x70, 0x47, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0xc9, 0x75, 0x00, 0x00, 0x03, 0x49, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x02, 0x48, 0x41, 0x61, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xc3, 0x00, 0x00, 0xcd, 0x75, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x0f, 0x4b, 0x10, 0xb5, 0xd9, 0x68, 0x00, 0x29, 0x19, 0xd0, 0x0e, 0x4c, 0x00, 0x21, 0xca, 0x00, 0x12, 0x19, 0x40, 0x3a, 0xd2, 0x6b, 0x82, 0x42, 0x02, 0xda, 0x01, 0x31, 0x03, 0x29, 0xf6, 0xd3, 0x48, 0x1c, 0x1a, 0x78, 0x00, 0x06, 0x00, 0x0e, 0x90, 0x42, 0x08, 0xd0, 0x18, 0x70, 0x08, 0x06, 0x00, 0x0e, 0x04, 0x1c, 0x3c, 0x00, 0x3c, 0xc3, 0x00, 0x00, 0xf6, 0xf7, 0xba, 0xfa, 0x20, 0x1c, 0x03, 0xf0, 0x1b, 0xfd, 0x10, 0xbd, 0x18, 0x63, 0x01, 0x00, 0x3c, 0x42, 0x01, 0x00, 0x10, 0xb5, 0x14, 0x4c, 0xe1, 0x68, 0x00, 0x29, 0x22, 0xd0, 0x21, 0x78, 0x12, 0x4b, 0xca, 0x00, 0xd2, 0x18, 0x40, 0x3a, 0xd3, 0x6b, 0x83, 0x42, 0x02, 0xda, 0x48, 0x1c, 0x20, 0x70, 0x0b, 0xe0, 0x92, 0x6b, 0x82, 0x42, 0x14, 0xdd, 0xff, 0x31, 0x3c, 0x00, 0x78, 0xc3, 0x00, 0x00, 0x08, 0x06, 0x00, 0x0e, 0x20, 0x70, 0x03, 0xd1, 0x19, 0x21, 0x86, 0x20, 0xf4, 0xf7, 0x8e, 0xff, 0x20, 0x78, 0xff, 0x30, 0x00, 0x06, 0x00, 0x0e, 0xf6, 0xf7, 0x90, 0xfa, 0x20, 0x78, 0xff, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x03, 0xf0, 0xee, 0xfc, 0x10, 0xbd, 0x00, 0x00, 0x18, 0x63, 0x01, 0x00, 0x3c, 0x42, 0x01, 0x00, 0x09, 0x48, 0x00, 0x21, 0x01, 0x81, 0x41, 0x81, 0x3c, 0x00, 0xb4, 0xc3, 0x00, 0x00, 0x81, 0x81, 0xc1, 0x81, 0x07, 0x4a, 0x02, 0x80, 0x01, 0x23, 0xdb, 0x02, 0x43, 0x80, 0x82, 0x80, 0xc2, 0x80, 0x41, 0x76, 0x31, 0x21, 0x81, 0x76, 0x01, 0x21, 0x01, 0x76, 0x70, 0x47, 0x00, 0x00, 0x30, 0x80, 0x07, 0x00, 0xff, 0xff, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x20, 0xf6, 0xf7, 0xf8, 0xf8, 0x01, 0x20, 0xf6, 0xf7, 0xdb, 0xfc, 0x01, 0x20, 0xf6, 0xf7, 0x5a, 0xfa, 0x3c, 0x00, 0xf0, 0xc3, 0x00, 0x00, 0x01, 0x20, 0x00, 0xf0, 0xf1, 0xfd, 0x01, 0x20, 0xf7, 0xf7, 0xc6, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x11, 0x4c, 0x00, 0x29, 0x07, 0xd1, 0x00, 0x28, 0x02, 0xd1, 0x01, 0x20, 0xe0, 0x60, 0x06, 0xe0, 0x00, 0x21, 0xe1, 0x60, 0x03, 0xe0, 0x01, 0x29, 0x07, 0xd1, 0x00, 0x28, 0x01, 0xd0, 0x20, 0x70, 0x03, 0xe0, 0x18, 0x21, 0x86, 0x20, 0xf4, 0xf7, 0x3c, 0xff, 0x3c, 0x00, 0x2c, 0xc4, 0x00, 0x00, 0x20, 0x78, 0xff, 0x30, 0x00, 0x06, 0x00, 0x0e, 0xf6, 0xf7, 0x3e, 0xfa, 0x20, 0x78, 0xff, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x03, 0xf0, 0x9c, 0xfc, 0x10, 0xbd, 0x00, 0x00, 0x18, 0x63, 0x01, 0x00, 0x05, 0x49, 0x80, 0xb5, 0x09, 0x68, 0x88, 0x42, 0x05, 0xd0, 0xfe, 0xf7, 0xff, 0xfb, 0x00, 0xf0, 0x87, 0xfa, 0xff, 0xf7, 0x2b, 0xfc, 0x80, 0xbd, 0xa8, 0x69, 0x01, 0x00, 0x3c, 0x00, 0x68, 0xc4, 0x00, 0x00, 0x01, 0x49, 0x48, 0x70, 0x70, 0x47, 0x00, 0x00, 0x2c, 0x63, 0x01, 0x00, 0x01, 0x49, 0xc8, 0x60, 0x70, 0x47, 0x00, 0x00, 0x4c, 0x7b, 0x01, 0x00, 0x03, 0x49, 0x01, 0x20, 0x09, 0x78, 0x00, 0x29, 0x00, 0xd0, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x2c, 0x63, 0x01, 0x00, 0x04, 0x4a, 0x00, 0x28, 0x02, 0xd0, 0x90, 0x69, 0x01, 0x30, 0x90, 0x61, 0xd0, 0x69, 0x40, 0x18, 0x3c, 0x00, 0xa4, 0xc4, 0x00, 0x00, 0xd0, 0x61, 0x70, 0x47, 0x90, 0x5c, 0x01, 0x00, 0xfe, 0xb5, 0x04, 0x1c, 0x00, 0x68, 0x05, 0x68, 0x28, 0x1c, 0xfe, 0xf7, 0x27, 0xff, 0x07, 0x1c, 0x60, 0x69, 0x15, 0x4e, 0xc0, 0x07, 0xc0, 0x0f, 0x21, 0xd0, 0x01, 0xaa, 0x02, 0xa9, 0x28, 0x1c, 0xfe, 0xf7, 0x12, 0xff, 0x38, 0x78, 0xc0, 0x07, 0x0c, 0xd4, 0x60, 0x69, 0x80, 0x07, 0x08, 0xd5, 0x00, 0xab, 0x18, 0x7a, 0x3c, 0x00, 0xe0, 0xc4, 0x00, 0x00, 0x00, 0x28, 0x01, 0xd0, 0x02, 0x28, 0x02, 0xd1, 0x70, 0x6a, 0x01, 0x30, 0x70, 0x62, 0xfe, 0xbd, 0x00, 0xab, 0x18, 0x7a, 0x00, 0x28, 0x01, 0xd0, 0x02, 0x28, 0xf8, 0xd1, 0x70, 0x6a, 0x01, 0x30, 0x70, 0x62, 0xb0, 0x6a, 0x01, 0x30, 0xb0, 0x62, 0xf1, 0xe7, 0xf0, 0x6a, 0x01, 0x30, 0xf0, 0x62, 0xed, 0xe7, 0x00, 0x00, 0x90, 0x5c, 0x01, 0x00, 0x02, 0x49, 0x48, 0x69, 0x3c, 0x00, 0x1c, 0xc5, 0x00, 0x00, 0x01, 0x30, 0x48, 0x61, 0x70, 0x47, 0x00, 0x00, 0x90, 0x5c, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x01, 0x1c, 0x40, 0x31, 0x10, 0xb5, 0x0a, 0x8b, 0x12, 0x07, 0x92, 0x0f, 0x01, 0x2a, 0x33, 0xd0, 0x4a, 0x78, 0x1a, 0x49, 0x04, 0x1c, 0x60, 0x34, 0x00, 0x2a, 0x0b, 0x6a, 0x22, 0xd1, 0xe2, 0x79, 0x01, 0x2a, 0x02, 0xd9, 0xcc, 0x68, 0x01, 0x34, 0x3c, 0x00, 0x58, 0xc5, 0x00, 0x00, 0xcc, 0x60, 0x02, 0x2a, 0x02, 0xd9, 0x0c, 0x69, 0x01, 0x34, 0x0c, 0x61, 0x0c, 0x68, 0x01, 0x34, 0x0c, 0x60, 0x44, 0x6b, 0x00, 0x2c, 0x03, 0xd0, 0x04, 0x69, 0x24, 0x7c, 0xe4, 0x07, 0x02, 0xd5, 0x4c, 0x68, 0x01, 0x34, 0x4c, 0x60, 0x80, 0x6b, 0x00, 0x28, 0x02, 0xd0, 0x08, 0x6b, 0x01, 0x30, 0x08, 0x63, 0x00, 0x2a, 0x0c, 0xd0, 0x98, 0x18, 0x01, 0x38, 0x08, 0xe0, 0x3c, 0x00, 0x94, 0xc5, 0x00, 0x00, 0x01, 0x2a, 0x01, 0xd0, 0x02, 0x2a, 0x02, 0xd1, 0x88, 0x68, 0x01, 0x30, 0x88, 0x60, 0xe0, 0x79, 0x18, 0x18, 0x08, 0x62, 0x10, 0xbd, 0x00, 0x00, 0x90, 0x5c, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x01, 0x49, 0x0a, 0x20, 0x08, 0x81, 0x70, 0x47, 0xc4, 0x7a, 0x01, 0x00, 0xf0, 0xb5, 0x32, 0x4f, 0x04, 0x1c, 0x78, 0x78, 0x85, 0xb0, 0xc0, 0x07, 0xc0, 0x0f, 0x03, 0x90, 0x3c, 0x00, 0xd0, 0xc5, 0x00, 0x00, 0xb8, 0x78, 0x02, 0x90, 0x01, 0x20, 0xa0, 0x40, 0x04, 0x90, 0x39, 0x1c, 0x88, 0x70, 0x2c, 0x48, 0x00, 0x88, 0x06, 0xf0, 0x0b, 0xfc, 0x01, 0x90, 0xfe, 0xf7, 0xae, 0xfc, 0x04, 0x30, 0x29, 0x4e, 0xa5, 0x00, 0x71, 0x59, 0x09, 0x79, 0x88, 0x42, 0x06, 0xd0, 0xfe, 0xf7, 0xa5, 0xfc, 0x71, 0x59, 0x04, 0x30, 0x08, 0x71, 0x01, 0x20, 0x78, 0x70, 0x00, 0x20, 0x78, 0x70, 0x3c, 0x00, 0x0c, 0xc6, 0x00, 0x00, 0x21, 0x48, 0x01, 0x21, 0x20, 0x4e, 0x30, 0x38, 0x01, 0x55, 0x71, 0x59, 0x03, 0x20, 0x08, 0x70, 0x06, 0xf0, 0xc6, 0xfb, 0x06, 0x1c, 0xfe, 0xf7, 0x91, 0xfc, 0x36, 0x18, 0x0e, 0x36, 0x09, 0xe0, 0x30, 0x1c, 0x06, 0xf0, 0xf5, 0xfa, 0x00, 0x28, 0x04, 0xd0, 0x23, 0x21, 0x86, 0x20, 0xf4, 0xf7, 0x33, 0xfe, 0x03, 0xe0, 0xf6, 0xf7, 0x34, 0xfb, 0x00, 0x28, 0xf1, 0xd0, 0x3c, 0x00, 0x48, 0xc6, 0x00, 0x00, 0x12, 0x48, 0x13, 0x49, 0x3c, 0x38, 0x00, 0x78, 0x08, 0x72, 0x20, 0x1c, 0xf4, 0xf7, 0xa2, 0xfa, 0x0e, 0x4e, 0x71, 0x59, 0x08, 0x71, 0x03, 0x98, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x21, 0x79, 0x70, 0x09, 0x48, 0x00, 0x88, 0x01, 0x99, 0x06, 0xf0, 0xbd, 0xfb, 0x02, 0x98, 0xb8, 0x70, 0x09, 0x49, 0x49, 0x79, 0x04, 0x98, 0x88, 0x42, 0x03, 0xd0, 0x24, 0x21, 0x86, 0x20, 0x3c, 0x00, 0x84, 0xc6, 0x00, 0x00, 0xf4, 0xf7, 0x0e, 0xfe, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x50, 0x07, 0x00, 0xd0, 0x79, 0x01, 0x00, 0x10, 0x7b, 0x01, 0x00, 0x80, 0x80, 0x07, 0x00, 0x50, 0x80, 0x07, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x05, 0x28, 0x01, 0xd3, 0xf4, 0xf7, 0x29, 0xfe, 0x05, 0x2d, 0x01, 0xd3, 0xf4, 0xf7, 0x25, 0xfe, 0x0b, 0x4a, 0xa8, 0x00, 0x11, 0x58, 0xa0, 0x00, 0x10, 0x58, 0x3c, 0x00, 0xc0, 0xc6, 0x00, 0x00, 0x0e, 0xc9, 0x0e, 0xc0, 0x06, 0x21, 0x06, 0x22, 0x06, 0x48, 0x69, 0x43, 0x2a, 0x38, 0x09, 0x18, 0x62, 0x43, 0x10, 0x18, 0x06, 0x22, 0xf3, 0xf7, 0x0f, 0xff, 0x02, 0x48, 0x30, 0x38, 0x41, 0x5d, 0x01, 0x55, 0xb0, 0xbd, 0x10, 0x7b, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0e, 0x48, 0x0d, 0x1c, 0x80, 0x78, 0x01, 0x21, 0xa1, 0x40, 0x08, 0x40, 0x03, 0xd0, 0x01, 0x21, 0x3c, 0x00, 0xfc, 0xc6, 0x00, 0x00, 0x86, 0x20, 0xf4, 0xf7, 0xd1, 0xfd, 0x06, 0x21, 0x06, 0x22, 0x09, 0x48, 0x69, 0x43, 0x09, 0x18, 0x62, 0x43, 0x10, 0x18, 0x06, 0x22, 0xf3, 0xf7, 0xf1, 0xfe, 0x20, 0x1c, 0xf4, 0xf7, 0x40, 0xfa, 0x03, 0x4a, 0xa1, 0x00, 0x2a, 0x32, 0x51, 0x58, 0x08, 0x71, 0xb0, 0xbd, 0x00, 0x50, 0x07, 0x00, 0xe6, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x80, 0xb5, 0x00, 0x20, 0x48, 0x60, 0x3c, 0x00, 0x38, 0xc7, 0x00, 0x00, 0x07, 0xf0, 0x32, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0xd4, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x05, 0x28, 0x01, 0xd3, 0xf4, 0xf7, 0xd8, 0xfd, 0x07, 0x49, 0x08, 0x7a, 0x07, 0x4a, 0x10, 0x70, 0x01, 0x20, 0x08, 0x72, 0xfe, 0xf7, 0xf4, 0xfb, 0x04, 0x4a, 0x04, 0x30, 0xa1, 0x00, 0x3c, 0x32, 0x51, 0x58, 0x08, 0x71, 0x10, 0xbd, 0x00, 0x00, 0x80, 0x80, 0x07, 0x00, 0x3c, 0x00, 0x74, 0xc7, 0x00, 0x00, 0xd4, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x80, 0xb5, 0x01, 0x20, 0x48, 0x60, 0x07, 0xf0, 0x0e, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0xd4, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x05, 0x28, 0x01, 0xd3, 0xf4, 0xf7, 0xb4, 0xfd, 0x20, 0x1c, 0xf5, 0xf7, 0x8f, 0xfe, 0x00, 0x21, 0x20, 0x1c, 0xfb, 0xf7, 0x31, 0xfd, 0x01, 0x21, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x09, 0x04, 0x3c, 0x00, 0xb0, 0xc7, 0x00, 0x00, 0x09, 0x0c, 0x20, 0x1c, 0x04, 0xf0, 0x22, 0xfa, 0x10, 0xbd, 0x00, 0x00, 0x06, 0x49, 0x01, 0x20, 0x05, 0x4b, 0x88, 0x60, 0x00, 0x20, 0x3c, 0x33, 0x00, 0x21, 0x82, 0x00, 0x9a, 0x58, 0x11, 0x70, 0x01, 0x30, 0x05, 0x28, 0xf9, 0xdb, 0x70, 0x47, 0xd4, 0x7a, 0x01, 0x00, 0x0f, 0x49, 0x38, 0xb5, 0x00, 0x20, 0x88, 0x60, 0x0e, 0x48, 0x01, 0x1c, 0x20, 0x31, 0x8a, 0x79, 0x3c, 0x00, 0xec, 0xc7, 0x00, 0x00, 0x00, 0xab, 0x1a, 0x70, 0xc9, 0x79, 0x0a, 0x4c, 0x09, 0x4d, 0x59, 0x70, 0x0c, 0x34, 0x3c, 0x35, 0x00, 0x21, 0x03, 0x22, 0x63, 0x5c, 0x00, 0x2b, 0x02, 0xd0, 0x8b, 0x00, 0xeb, 0x58, 0x1a, 0x70, 0x01, 0x31, 0x05, 0x29, 0xf6, 0xdb, 0x00, 0xab, 0x19, 0x88, 0xc1, 0x84, 0x38, 0xbd, 0x00, 0x00, 0xd4, 0x7a, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, 0xff, 0xb5, 0x14, 0x4f, 0x3c, 0x00, 0x28, 0xc8, 0x00, 0x00, 0x04, 0x1c, 0xbe, 0x79, 0x0d, 0x1c, 0x81, 0xb0, 0x0f, 0x20, 0x00, 0xf0, 0xb9, 0xf8, 0x2a, 0x1c, 0x10, 0x4d, 0x00, 0x90, 0x21, 0x1c, 0x28, 0x1c, 0xf4, 0xf7, 0xde, 0xfc, 0x21, 0x1c, 0xa8, 0x1d, 0x03, 0x9a, 0xf4, 0xf7, 0xd9, 0xfc, 0x21, 0x1c, 0x28, 0x1c, 0x0c, 0x30, 0x04, 0x9a, 0xf4, 0xf7, 0xd3, 0xfc, 0x21, 0x1c, 0x28, 0x1c, 0x12, 0x30, 0x0a, 0x9a, 0xf4, 0xf7, 0x3c, 0x00, 0x64, 0xc8, 0x00, 0x00, 0xcd, 0xfc, 0x07, 0xf0, 0x9b, 0xf8, 0x00, 0x98, 0x00, 0xf0, 0x76, 0xf8, 0xbe, 0x71, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0x20, 0x10, 0x07, 0x00, 0xe6, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0x00, 0x20, 0xf6, 0xf7, 0x26, 0xf8, 0x07, 0x49, 0x88, 0x78, 0x00, 0x09, 0x00, 0x01, 0x88, 0x70, 0x00, 0x24, 0x20, 0x1c, 0xf5, 0xf7, 0x11, 0xfe, 0x01, 0x34, 0x24, 0x06, 0x24, 0x0e, 0x3c, 0x00, 0xa0, 0xc8, 0x00, 0x00, 0x04, 0x2c, 0xf7, 0xd3, 0x10, 0xbd, 0x00, 0x00, 0x00, 0x50, 0x07, 0x00, 0x80, 0xb5, 0x02, 0xf0, 0xe3, 0xfb, 0x03, 0x48, 0x81, 0x78, 0x0f, 0x22, 0x11, 0x43, 0x81, 0x70, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x50, 0x07, 0x00, 0xf8, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x05, 0x28, 0x01, 0xd3, 0xf4, 0xf7, 0x17, 0xfd, 0xa6, 0x00, 0x00, 0x2d, 0x11, 0x4f, 0x07, 0xd1, 0xb8, 0x59, 0x3c, 0x00, 0xdc, 0xc8, 0x00, 0x00, 0x81, 0x68, 0x00, 0x29, 0x0e, 0xd1, 0x40, 0x78, 0x00, 0x28, 0x0b, 0xd0, 0x02, 0xe0, 0xff, 0x35, 0x2d, 0x06, 0x2d, 0x0e, 0x29, 0x1c, 0x20, 0x1c, 0xfb, 0xf7, 0x88, 0xfc, 0x01, 0x1c, 0x20, 0x1c, 0x04, 0xf0, 0x7e, 0xf9, 0x06, 0x49, 0x01, 0x20, 0x30, 0x39, 0x08, 0x55, 0x04, 0x48, 0x3c, 0x38, 0x80, 0x68, 0x00, 0x28, 0x02, 0xd1, 0xb9, 0x59, 0x03, 0x20, 0x08, 0x70, 0x3c, 0x00, 0x18, 0xc9, 0x00, 0x00, 0xf8, 0xbd, 0x00, 0x00, 0x10, 0x7b, 0x01, 0x00, 0x80, 0xb5, 0x04, 0xf0, 0xcd, 0xf9, 0x80, 0xbd, 0x10, 0xb5, 0x04, 0x1c, 0x05, 0x28, 0x01, 0xd3, 0xf4, 0xf7, 0xe6, 0xfc, 0x20, 0x1c, 0xf5, 0xf7, 0xc1, 0xfd, 0x00, 0x20, 0x05, 0x4a, 0xa1, 0x00, 0x51, 0x58, 0x88, 0x60, 0x04, 0x49, 0x88, 0x78, 0x01, 0x22, 0xa2, 0x40, 0x10, 0x43, 0x88, 0x70, 0x10, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x54, 0xc9, 0x00, 0x00, 0x10, 0x7b, 0x01, 0x00, 0x00, 0x50, 0x07, 0x00, 0x02, 0x4a, 0x91, 0x78, 0x08, 0x43, 0x90, 0x70, 0x70, 0x47, 0x00, 0x00, 0x00, 0x50, 0x07, 0x00, 0xf8, 0xb5, 0x0c, 0x4f, 0xbe, 0x79, 0x0f, 0x20, 0x00, 0xf0, 0x18, 0xf8, 0x05, 0x1c, 0x00, 0x24, 0x20, 0x1c, 0xf4, 0xf7, 0x0d, 0xf9, 0x08, 0x4a, 0xa1, 0x00, 0x51, 0x58, 0x08, 0x71, 0x01, 0x34, 0x24, 0x06, 0x24, 0x0e, 0x3c, 0x00, 0x90, 0xc9, 0x00, 0x00, 0x04, 0x2c, 0xf3, 0xd3, 0x28, 0x1c, 0xff, 0xf7, 0xe1, 0xff, 0xbe, 0x71, 0xf8, 0xbd, 0x00, 0x00, 0x20, 0x10, 0x07, 0x00, 0x10, 0x7b, 0x01, 0x00, 0xb0, 0xb5, 0x08, 0x49, 0x8d, 0x78, 0x8a, 0x78, 0x05, 0x40, 0x82, 0x43, 0x8a, 0x70, 0x06, 0xf0, 0xf9, 0xf9, 0x04, 0x1c, 0x0a, 0x34, 0x20, 0x1c, 0x06, 0xf0, 0x34, 0xf9, 0x00, 0x28, 0xfa, 0xd0, 0x28, 0x1c, 0xb0, 0xbd, 0x3c, 0x00, 0xcc, 0xc9, 0x00, 0x00, 0x00, 0x50, 0x07, 0x00, 0x01, 0x49, 0x0a, 0x20, 0x08, 0x81, 0x70, 0x47, 0x38, 0x7b, 0x01, 0x00, 0xf8, 0xb5, 0x10, 0x48, 0x04, 0x26, 0x04, 0x1c, 0xe0, 0x34, 0x05, 0x1c, 0x38, 0x3d, 0x00, 0x27, 0x20, 0x1c, 0x1c, 0x30, 0xe4, 0x60, 0xa0, 0x61, 0x27, 0x61, 0x0b, 0x48, 0xa6, 0x82, 0xe0, 0x61, 0x27, 0x62, 0xa7, 0x62, 0x06, 0x20, 0xa0, 0x84, 0x20, 0x1c, 0xfe, 0xf7, 0x3c, 0x00, 0x08, 0xca, 0x00, 0x00, 0x87, 0xfc, 0x20, 0x1c, 0x0c, 0x30, 0xf6, 0xf7, 0xb7, 0xf9, 0x05, 0x49, 0x38, 0x3c, 0xac, 0x42, 0x08, 0x80, 0xe7, 0xd1, 0xf8, 0xbd, 0x00, 0x00, 0xd4, 0xe4, 0x01, 0x00, 0x12, 0x61, 0x01, 0x00, 0x48, 0x7b, 0x01, 0x00, 0xf7, 0xb5, 0x05, 0x1c, 0x0c, 0x23, 0x0f, 0x1c, 0x12, 0x49, 0x58, 0x43, 0x44, 0x18, 0x20, 0x88, 0x06, 0xf0, 0xea, 0xf9, 0xa0, 0x78, 0x01, 0x28, 0x3c, 0x00, 0x44, 0xca, 0x00, 0x00, 0x1a, 0xd1, 0x66, 0x68, 0x02, 0x2f, 0x05, 0xd1, 0x5c, 0x20, 0x80, 0x5b, 0x02, 0x99, 0x00, 0x09, 0x88, 0x42, 0x11, 0xd1, 0x28, 0x1c, 0xfe, 0xf7, 0xfb, 0xff, 0x30, 0x1c, 0xf9, 0xf7, 0xfa, 0xfd, 0x04, 0x20, 0xa0, 0x70, 0x39, 0x1c, 0x28, 0x1c, 0xfb, 0xf7, 0xf4, 0xf8, 0x03, 0x4a, 0xe8, 0x00, 0x3c, 0x32, 0x11, 0x58, 0x01, 0x31, 0x11, 0x50, 0xfe, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x80, 0xca, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0x01, 0x20, 0x06, 0x4a, 0x00, 0x21, 0x0c, 0x23, 0x4b, 0x43, 0x9b, 0x18, 0x9b, 0x78, 0x00, 0x2b, 0x00, 0xd0, 0x00, 0x20, 0x01, 0x31, 0x04, 0x29, 0xf5, 0xdb, 0x70, 0x47, 0x60, 0x7b, 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0xff, 0xf7, 0xea, 0xfc, 0x00, 0x28, 0x03, 0xd1, 0x20, 0x21, 0x0c, 0x20, 0xf4, 0xf7, 0xf6, 0xfb, 0x26, 0x1c, 0x60, 0x36, 0x3c, 0x00, 0xbc, 0xca, 0x00, 0x00, 0x00, 0x21, 0xf1, 0x71, 0xe1, 0x64, 0x60, 0x6b, 0x25, 0x1c, 0x40, 0x35, 0x00, 0x28, 0x31, 0xd0, 0xff, 0xf7, 0x04, 0xf9, 0x01, 0x22, 0x12, 0x03, 0x00, 0x28, 0x20, 0x69, 0x01, 0x88, 0x01, 0xd0, 0x91, 0x43, 0x00, 0xe0, 0x11, 0x43, 0x01, 0x80, 0x20, 0x69, 0x01, 0x22, 0x00, 0x88, 0xd2, 0x02, 0x28, 0x83, 0x20, 0x1c, 0x58, 0x30, 0x01, 0x88, 0x91, 0x43, 0x01, 0x80, 0x3c, 0x00, 0xf8, 0xca, 0x00, 0x00, 0xa3, 0x6b, 0x52, 0x08, 0x00, 0x2b, 0x10, 0xd0, 0x91, 0x43, 0x01, 0x80, 0x28, 0x8b, 0x00, 0x07, 0x80, 0x0f, 0x01, 0x28, 0x15, 0xd0, 0x2e, 0x20, 0x01, 0x5d, 0x20, 0x69, 0x04, 0x30, 0xf8, 0xf7, 0x41, 0xfd, 0x61, 0x6a, 0xfe, 0xf7, 0xa8, 0xf9, 0x04, 0xe0, 0x11, 0x43, 0x01, 0x80, 0x20, 0x1c, 0xfb, 0xf7, 0xcc, 0xfb, 0x68, 0x83, 0x04, 0xe0, 0x20, 0x69, 0x41, 0x80, 0x3c, 0x00, 0x34, 0xcb, 0x00, 0x00, 0xa8, 0x8b, 0x21, 0x69, 0xc8, 0x82, 0xe0, 0x68, 0xf6, 0xf7, 0x20, 0xf9, 0x30, 0x80, 0x60, 0x6d, 0x00, 0x28, 0x04, 0xd0, 0x00, 0x22, 0x03, 0x21, 0x70, 0x7a, 0xfe, 0xf7, 0x0d, 0xff, 0x20, 0x1c, 0x00, 0xf0, 0xb6, 0xf9, 0x70, 0x7a, 0x06, 0xf0, 0x45, 0xf8, 0x70, 0xbd, 0xb0, 0xb5, 0x00, 0x24, 0x06, 0xf0, 0x22, 0xf9, 0x09, 0x4a, 0x00, 0x21, 0x0c, 0x23, 0x4b, 0x43, 0x3c, 0x00, 0x70, 0xcb, 0x00, 0x00, 0x9d, 0x18, 0x6b, 0x68, 0x5b, 0x6c, 0xad, 0x78, 0xc3, 0x1a, 0x01, 0x2d, 0x02, 0xd1, 0xa3, 0x42, 0x00, 0xdd, 0x1c, 0x1c, 0x01, 0x31, 0x05, 0x29, 0xf0, 0xd3, 0x20, 0x1c, 0xb0, 0xbd, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x06, 0xf0, 0xa8, 0xfe, 0x0c, 0x20, 0x08, 0x49, 0x60, 0x43, 0x45, 0x18, 0x28, 0x88, 0x06, 0xf0, 0x35, 0xf9, 0x68, 0x68, 0x3c, 0x00, 0xac, 0xcb, 0x00, 0x00, 0x00, 0x28, 0x06, 0xd0, 0x20, 0x30, 0x00, 0x7b, 0x01, 0x28, 0x02, 0xd1, 0x20, 0x1c, 0xff, 0xf7, 0xa3, 0xfa, 0xb0, 0xbd, 0x60, 0x7b, 0x01, 0x00, 0xff, 0xb5, 0x85, 0xb0, 0x0f, 0xae, 0x60, 0xce, 0x38, 0x20, 0x1e, 0x49, 0x70, 0x43, 0x17, 0x1c, 0x44, 0x18, 0xff, 0xf7, 0x7f, 0xf8, 0x01, 0x22, 0x12, 0x03, 0x00, 0x28, 0x03, 0xd0, 0x20, 0x88, 0x90, 0x43, 0x20, 0x80, 0x3c, 0x00, 0xe8, 0xcb, 0x00, 0x00, 0x02, 0xe0, 0x21, 0x88, 0x11, 0x43, 0x21, 0x80, 0x11, 0x98, 0x39, 0x1c, 0xe0, 0x62, 0x05, 0x98, 0xf8, 0xf7, 0xd0, 0xfc, 0x01, 0x1c, 0x2b, 0x1c, 0x38, 0x1c, 0x06, 0x9a, 0xfe, 0xf7, 0x20, 0xf9, 0x60, 0x80, 0x06, 0x22, 0x20, 0x1d, 0x0f, 0x49, 0xf3, 0xf7, 0x72, 0xfc, 0x23, 0x1c, 0x08, 0x98, 0x30, 0x33, 0x18, 0x70, 0x0e, 0x98, 0x0c, 0x49, 0x58, 0x70, 0x65, 0x63, 0x3c, 0x00, 0x24, 0xcc, 0x00, 0x00, 0x00, 0x20, 0x02, 0x90, 0x01, 0x22, 0x04, 0x92, 0x09, 0x48, 0x03, 0x91, 0x5a, 0x78, 0x01, 0x88, 0x01, 0x92, 0x00, 0x91, 0x19, 0x78, 0x24, 0x3b, 0x30, 0x1c, 0x62, 0x6b, 0xfe, 0xf7, 0xa8, 0xfe, 0x09, 0xb0, 0xf0, 0xbd, 0xd4, 0xe4, 0x01, 0x00, 0x12, 0x61, 0x01, 0x00, 0x5d, 0x4e, 0x00, 0x00, 0x48, 0x7b, 0x01, 0x00, 0xff, 0xb5, 0x87, 0xb0, 0x10, 0x98, 0x12, 0xaf, 0x3c, 0x00, 0x60, 0xcc, 0x00, 0x00, 0x8c, 0x46, 0xa2, 0xcf, 0x4c, 0x23, 0x30, 0x4c, 0x6b, 0x43, 0x1c, 0x19, 0x16, 0x1c, 0x15, 0x9a, 0x27, 0x85, 0x27, 0x1c, 0x30, 0x37, 0x06, 0x97, 0x05, 0x97, 0x00, 0x23, 0x3b, 0x73, 0x05, 0x9f, 0x78, 0x73, 0x11, 0x98, 0x27, 0x1c, 0x60, 0x64, 0x61, 0x60, 0x22, 0x60, 0x40, 0x37, 0x3e, 0x70, 0x61, 0x46, 0x61, 0x87, 0x07, 0x98, 0x31, 0x1c, 0xf8, 0xf7, 0x80, 0xfc, 0x3c, 0x00, 0x9c, 0xcc, 0x00, 0x00, 0x05, 0x99, 0xc8, 0x73, 0x0a, 0x98, 0x78, 0x70, 0x30, 0x1c, 0xfe, 0xf7, 0x73, 0xf8, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x41, 0x00, 0x02, 0x20, 0x01, 0x40, 0x11, 0x9a, 0x01, 0x20, 0x00, 0x2a, 0x00, 0xd1, 0x00, 0x20, 0x08, 0x43, 0x38, 0x72, 0x20, 0x1c, 0x2e, 0x30, 0x07, 0x99, 0xfd, 0xf7, 0xcf, 0xff, 0x28, 0x1c, 0x04, 0xf0, 0xae, 0xf8, 0x3c, 0x00, 0xd8, 0xcc, 0x00, 0x00, 0xfe, 0xf7, 0xfe, 0xff, 0x4c, 0x22, 0x12, 0x4b, 0x6a, 0x43, 0xd2, 0x18, 0x01, 0x21, 0x09, 0x03, 0x2a, 0x32, 0x00, 0x28, 0x04, 0xd0, 0x10, 0x1c, 0x12, 0x88, 0x8a, 0x43, 0x02, 0x80, 0x02, 0xe0, 0x10, 0x88, 0x08, 0x43, 0x10, 0x80, 0x0b, 0x49, 0x00, 0x20, 0x03, 0x91, 0x06, 0x99, 0x02, 0x90, 0x00, 0x22, 0x04, 0x92, 0x08, 0x48, 0x0a, 0x7b, 0x41, 0x88, 0x23, 0x1c, 0x3c, 0x00, 0x14, 0xcd, 0x00, 0x00, 0x01, 0x92, 0x00, 0x91, 0x79, 0x78, 0x08, 0x33, 0x28, 0x1c, 0x62, 0x68, 0xfe, 0xf7, 0x38, 0xfe, 0x0b, 0xb0, 0xf0, 0xbd, 0x58, 0xe3, 0x01, 0x00, 0x75, 0x4f, 0x00, 0x00, 0x3c, 0x7c, 0x01, 0x00, 0xb0, 0xb5, 0x0c, 0x1c, 0x01, 0x28, 0x27, 0xd0, 0x80, 0x28, 0x30, 0xd1, 0xe0, 0x6c, 0x00, 0x28, 0x08, 0xd0, 0x69, 0x20, 0x00, 0x5d, 0x18, 0x49, 0xc0, 0x00, 0x40, 0x18, 0x3c, 0x00, 0x50, 0xcd, 0x00, 0x00, 0x04, 0x30, 0x01, 0x68, 0x01, 0x31, 0x01, 0x60, 0x20, 0x1c, 0xff, 0xf7, 0xe9, 0xfb, 0x13, 0x4d, 0x50, 0x3d, 0xe8, 0x68, 0x00, 0x28, 0x05, 0xd0, 0x2e, 0x20, 0x00, 0x5d, 0xfe, 0xf7, 0x10, 0xf8, 0x02, 0xf0, 0x42, 0xfe, 0x20, 0x1c, 0x61, 0x68, 0xf3, 0xf7, 0x2f, 0xfb, 0x40, 0x34, 0x60, 0x78, 0x00, 0x28, 0x02, 0xd1, 0x06, 0xf0, 0x12, 0xf8, 0xa8, 0x60, 0xb0, 0xbd, 0x3c, 0x00, 0x8c, 0xcd, 0x00, 0x00, 0x20, 0x06, 0x00, 0x0e, 0x81, 0x28, 0xfa, 0xd1, 0x22, 0x0c, 0x20, 0x04, 0x00, 0x0e, 0x02, 0x21, 0xfe, 0xf7, 0xe6, 0xfd, 0xb0, 0xbd, 0x0a, 0x21, 0x0c, 0x20, 0xf4, 0xf7, 0x7d, 0xfa, 0xb0, 0xbd, 0x9c, 0x7b, 0x01, 0x00, 0xf8, 0xb5, 0x18, 0x4e, 0x18, 0x4f, 0x05, 0x1c, 0x34, 0x79, 0xb8, 0x79, 0x00, 0x90, 0x20, 0x1c, 0xf5, 0xf7, 0x7c, 0xff, 0x00, 0x28, 0x06, 0xd0, 0x3c, 0x00, 0xc8, 0xcd, 0x00, 0x00, 0x12, 0x48, 0x38, 0x38, 0x40, 0x68, 0x85, 0x42, 0x01, 0xd1, 0x00, 0x2d, 0x03, 0xd1, 0x10, 0x21, 0x86, 0x20, 0xf4, 0xf7, 0x63, 0xfa, 0x0d, 0x49, 0x00, 0x20, 0x38, 0x39, 0x48, 0x60, 0x04, 0x21, 0x20, 0x1c, 0xff, 0xf7, 0x59, 0xfc, 0x04, 0x21, 0x20, 0x1c, 0xf5, 0xf7, 0xeb, 0xfe, 0x0c, 0x21, 0x06, 0x4a, 0x61, 0x43, 0x30, 0x3a, 0x89, 0x18, 0x0c, 0x71, 0x04, 0x20, 0x3c, 0x00, 0x04, 0xce, 0x00, 0x00, 0x30, 0x71, 0x00, 0x98, 0xb8, 0x71, 0x0f, 0x20, 0xff, 0xf7, 0xa6, 0xfd, 0xf8, 0xbd, 0x00, 0x00, 0xa4, 0x7a, 0x01, 0x00, 0x20, 0x10, 0x07, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0x0f, 0x20, 0xff, 0xf7, 0xc1, 0xfd, 0xf5, 0xf7, 0x3b, 0xff, 0x01, 0x25, 0x00, 0x28, 0x00, 0xd0, 0x00, 0x25, 0x16, 0x4e, 0xb0, 0x79, 0x16, 0x4f, 0x00, 0x90, 0x38, 0x79, 0x04, 0x28, 0x01, 0xd1, 0x3c, 0x00, 0x40, 0xce, 0x00, 0x00, 0x00, 0x2c, 0x03, 0xd1, 0x11, 0x21, 0x86, 0x20, 0xf4, 0xf7, 0x2c, 0xfa, 0x10, 0x48, 0x29, 0x06, 0x38, 0x38, 0x44, 0x60, 0x09, 0x0e, 0x0c, 0x1c, 0x04, 0x20, 0xff, 0xf7, 0x21, 0xfc, 0x03, 0x21, 0x20, 0x1c, 0xff, 0xf7, 0x41, 0xfc, 0x21, 0x1c, 0x04, 0x20, 0xf5, 0xf7, 0xaf, 0xfe, 0x0c, 0x21, 0x07, 0x4a, 0x69, 0x43, 0x04, 0x20, 0x30, 0x3a, 0x89, 0x18, 0x08, 0x71, 0x3c, 0x00, 0x7c, 0xce, 0x00, 0x00, 0x3c, 0x71, 0x00, 0x98, 0xb0, 0x71, 0x20, 0x1c, 0xff, 0xf7, 0x50, 0xfd, 0x04, 0x20, 0xf8, 0xbd, 0x20, 0x10, 0x07, 0x00, 0xa4, 0x7a, 0x01, 0x00, 0x0c, 0x23, 0x02, 0x49, 0x58, 0x43, 0x40, 0x18, 0x80, 0x68, 0x70, 0x47, 0x74, 0x7a, 0x01, 0x00, 0x60, 0x30, 0xc1, 0x79, 0x80, 0x79, 0x81, 0x42, 0x01, 0xd9, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xce, 0x00, 0x00, 0x01, 0x48, 0x80, 0x68, 0x70, 0x47, 0x00, 0x00, 0x4c, 0x7b, 0x01, 0x00, 0x38, 0xb5, 0x69, 0x21, 0x09, 0x5c, 0x18, 0x23, 0x10, 0x4a, 0x59, 0x43, 0x89, 0x18, 0x8a, 0x68, 0x01, 0x32, 0x8a, 0x60, 0x4b, 0x69, 0xd2, 0x1a, 0xcb, 0x68, 0x93, 0x42, 0x00, 0xd2, 0xca, 0x60, 0x00, 0x22, 0x0b, 0x4c, 0x02, 0x60, 0x22, 0x1c, 0x20, 0x32, 0x95, 0x79, 0x00, 0xab, 0x1d, 0x70, 0x3c, 0x00, 0xf4, 0xce, 0x00, 0x00, 0xd2, 0x79, 0x5a, 0x70, 0x0a, 0x68, 0x00, 0x2a, 0x01, 0xd1, 0x48, 0x60, 0x00, 0xe0, 0x10, 0x60, 0x00, 0xab, 0x08, 0x60, 0x18, 0x88, 0xe0, 0x84, 0x38, 0xbd, 0x00, 0x00, 0xc4, 0x7b, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, 0x18, 0x23, 0x0a, 0x49, 0x58, 0x43, 0x41, 0x18, 0x08, 0x69, 0x01, 0x30, 0x08, 0x61, 0x48, 0x68, 0x00, 0x28, 0x09, 0xd0, 0x48, 0x69, 0x01, 0x30, 0x3c, 0x00, 0x30, 0xcf, 0x00, 0x00, 0x48, 0x61, 0x48, 0x68, 0x02, 0x68, 0x4a, 0x60, 0x00, 0x2a, 0x00, 0xd1, 0x0a, 0x60, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0xc4, 0x7b, 0x01, 0x00, 0xf8, 0xb5, 0x12, 0x4e, 0x10, 0x4d, 0x0f, 0x4c, 0x0a, 0x27, 0x21, 0x1c, 0x00, 0x20, 0xe0, 0x60, 0x2a, 0x31, 0x22, 0x1c, 0x18, 0x32, 0xa1, 0x60, 0x62, 0x61, 0x27, 0x82, 0x0c, 0x4a, 0xe0, 0x61, 0xa2, 0x61, 0x60, 0x62, 0x3c, 0x00, 0x6c, 0xcf, 0x00, 0x00, 0x06, 0x20, 0x20, 0x84, 0x08, 0x1c, 0xfe, 0xf7, 0xd7, 0xf9, 0x20, 0x1c, 0x08, 0x30, 0xf5, 0xf7, 0x01, 0xff, 0x4c, 0x3c, 0xac, 0x42, 0x70, 0x80, 0xe5, 0xd1, 0xff, 0x20, 0x30, 0x70, 0xf8, 0xbd, 0x88, 0xe4, 0x01, 0x00, 0x0c, 0xe3, 0x01, 0x00, 0x3c, 0x7c, 0x01, 0x00, 0x12, 0x61, 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0x0b, 0x48, 0x0e, 0x1c, 0x17, 0x1c, 0x44, 0x70, 0x3c, 0x00, 0xa8, 0xcf, 0x00, 0x00, 0x05, 0xf0, 0x00, 0xff, 0x05, 0x1c, 0x39, 0x1c, 0x30, 0x1c, 0xfd, 0xf7, 0xab, 0xff, 0x0c, 0x21, 0x05, 0x4a, 0x28, 0x18, 0x0a, 0x30, 0x61, 0x43, 0x08, 0x32, 0x50, 0x50, 0x03, 0x48, 0x89, 0x18, 0x00, 0x68, 0x88, 0x60, 0xf8, 0xbd, 0x00, 0x00, 0x6c, 0x7a, 0x01, 0x00, 0x78, 0x6e, 0x01, 0x00, 0x70, 0xb5, 0x0b, 0x4e, 0x05, 0x1c, 0x70, 0x78, 0xff, 0x28, 0x0f, 0xd0, 0x3c, 0x00, 0xe4, 0xcf, 0x00, 0x00, 0x0c, 0x23, 0x08, 0x4c, 0x58, 0x43, 0x08, 0x34, 0x20, 0x58, 0x05, 0xf0, 0x1d, 0xfe, 0x00, 0x28, 0x06, 0xd1, 0x70, 0x78, 0x0c, 0x23, 0x58, 0x43, 0x00, 0x19, 0x81, 0x68, 0x29, 0x43, 0x81, 0x60, 0x70, 0xbd, 0x00, 0x00, 0x6c, 0x7a, 0x01, 0x00, 0x80, 0xb5, 0x30, 0x21, 0x01, 0x48, 0xf3, 0xf7, 0x43, 0xfa, 0x80, 0xbd, 0xec, 0xe5, 0x01, 0x00, 0x10, 0xb5, 0x05, 0xf0, 0x3c, 0x00, 0x20, 0xd0, 0x00, 0x00, 0xc5, 0xfe, 0x0a, 0x49, 0x44, 0x18, 0x0c, 0xe0, 0x20, 0x1c, 0x05, 0xf0, 0xf7, 0xfd, 0x00, 0x28, 0x07, 0xd0, 0xf5, 0xf7, 0x51, 0xfe, 0x00, 0x28, 0x03, 0xd0, 0x13, 0x21, 0x86, 0x20, 0xf4, 0xf7, 0x31, 0xf9, 0xf5, 0xf7, 0x49, 0xfe, 0x00, 0x28, 0xee, 0xd1, 0x10, 0xbd, 0xb0, 0x36, 0x00, 0x00, 0xff, 0xb5, 0x8b, 0xb0, 0x19, 0x9b, 0x0d, 0x1c, 0x04, 0x1c, 0x1a, 0x20, 0x3c, 0x00, 0x5c, 0xd0, 0x00, 0x00, 0x00, 0x2b, 0x16, 0x99, 0x00, 0xd1, 0x18, 0x20, 0x01, 0x90, 0x14, 0x98, 0x00, 0x28, 0x27, 0xd0, 0xff, 0x20, 0x19, 0x9b, 0x01, 0x30, 0x00, 0x2b, 0x01, 0xd1, 0x18, 0x23, 0x00, 0xe0, 0x1a, 0x23, 0x04, 0x33, 0x82, 0x42, 0x04, 0xd3, 0xd0, 0x1a, 0x40, 0x08, 0x40, 0x00, 0x00, 0x04, 0x00, 0x0c, 0x0d, 0x90, 0x6a, 0x48, 0x00, 0x88, 0xc2, 0x1a, 0x12, 0x04, 0x12, 0x0c, 0x3c, 0x00, 0x98, 0xd0, 0x00, 0x00, 0x04, 0x92, 0x00, 0x29, 0x08, 0xd0, 0x89, 0x79, 0x66, 0x4a, 0x49, 0x00, 0x51, 0x5a, 0x04, 0x9a, 0x51, 0x1a, 0x0a, 0x04, 0x12, 0x0c, 0x04, 0x92, 0x04, 0x9a, 0x82, 0x42, 0x05, 0xd9, 0x00, 0x20, 0x04, 0x90, 0x02, 0xe0, 0x60, 0x48, 0x04, 0x90, 0x0d, 0x90, 0x01, 0x98, 0x01, 0x04, 0x09, 0x0c, 0x0a, 0x91, 0x00, 0x20, 0xf4, 0xf7, 0x84, 0xfa, 0x00, 0x90, 0x00, 0x68, 0x3c, 0x00, 0xd4, 0xd0, 0x00, 0x00, 0x00, 0x26, 0x06, 0x90, 0x20, 0x60, 0x00, 0x20, 0x05, 0x90, 0x0e, 0x98, 0x00, 0x24, 0x00, 0x05, 0x00, 0x0c, 0x09, 0x90, 0x1a, 0x98, 0x0d, 0x9f, 0x40, 0x07, 0x40, 0x0f, 0x08, 0x90, 0x07, 0x94, 0x03, 0x95, 0x00, 0x2d, 0x0d, 0xd0, 0x28, 0x89, 0xb8, 0x42, 0x04, 0xd8, 0x36, 0x18, 0x3f, 0x1a, 0x07, 0xd0, 0xed, 0x68, 0xf5, 0xe7, 0x39, 0x04, 0x09, 0x0c, 0x28, 0x1c, 0x3c, 0x00, 0x10, 0xd1, 0x00, 0x00, 0xf4, 0xf7, 0x38, 0xfb, 0xef, 0xe7, 0x00, 0x2e, 0x02, 0xd1, 0x07, 0x99, 0x00, 0x29, 0x71, 0xd1, 0x27, 0x1c, 0x6c, 0x20, 0xf4, 0xf7, 0x88, 0xfb, 0x07, 0x99, 0x04, 0x1c, 0x00, 0x29, 0x20, 0xd1, 0x07, 0x94, 0x00, 0x20, 0xa0, 0x61, 0x18, 0x98, 0x27, 0x1c, 0x60, 0x60, 0x17, 0x98, 0x24, 0x37, 0xa0, 0x60, 0x06, 0x98, 0x20, 0x61, 0x15, 0x98, 0x0f, 0xc8, 0x0f, 0xc7, 0x3c, 0x00, 0x4c, 0xd1, 0x00, 0x00, 0x14, 0x98, 0x5c, 0x21, 0x60, 0x63, 0x09, 0x98, 0x08, 0x53, 0x19, 0x98, 0x69, 0x21, 0xe0, 0x63, 0x1b, 0x98, 0x08, 0x55, 0x1c, 0x98, 0x60, 0x65, 0x19, 0x98, 0x00, 0x28, 0x23, 0xd0, 0x08, 0x98, 0x06, 0x99, 0x08, 0x83, 0x1f, 0xe0, 0x6c, 0x22, 0x20, 0x1c, 0x07, 0x99, 0xf3, 0xf7, 0x1a, 0xfa, 0x3c, 0x60, 0x01, 0x98, 0x62, 0x21, 0x30, 0x18, 0xc8, 0x53, 0x15, 0x98, 0x3c, 0x00, 0x88, 0xd1, 0x00, 0x00, 0x40, 0x21, 0x80, 0x7a, 0xc8, 0x55, 0x00, 0x20, 0xb8, 0x63, 0x06, 0x98, 0x0a, 0x99, 0xf4, 0xf7, 0x1f, 0xfa, 0xf8, 0x60, 0x02, 0x99, 0xf4, 0xf7, 0x3b, 0xf9, 0x20, 0x1c, 0x40, 0x30, 0x81, 0x8b, 0x05, 0x9a, 0x12, 0x07, 0x12, 0x0f, 0x11, 0x43, 0x81, 0x83, 0x03, 0x98, 0x5e, 0x21, 0x02, 0x90, 0x01, 0x98, 0x22, 0x4a, 0x30, 0x18, 0x08, 0x53, 0x12, 0x68, 0x01, 0x21, 0x3c, 0x00, 0xc4, 0xd1, 0x00, 0x00, 0x08, 0x1c, 0x00, 0x2a, 0x00, 0xd0, 0x1b, 0x98, 0x00, 0x06, 0x04, 0x9a, 0x00, 0x0e, 0x96, 0x42, 0x03, 0xd9, 0x2c, 0x22, 0x11, 0x55, 0x1b, 0x49, 0x04, 0xe0, 0x15, 0x99, 0x2c, 0x22, 0x09, 0x7a, 0x11, 0x55, 0x19, 0x49, 0x08, 0x5c, 0x66, 0x21, 0x08, 0x55, 0x1c, 0x98, 0x00, 0x28, 0x01, 0xd0, 0x1f, 0x20, 0x08, 0x55, 0x00, 0x2d, 0x03, 0xd0, 0xe8, 0x68, 0x03, 0x90, 0x3c, 0x00, 0x00, 0xd2, 0x00, 0x00, 0x00, 0x20, 0x00, 0xe0, 0x09, 0xe0, 0xe8, 0x60, 0x05, 0x98, 0x00, 0x26, 0x01, 0x30, 0x00, 0x04, 0x00, 0x0c, 0x0d, 0x9f, 0x05, 0x90, 0x03, 0x9d, 0x6d, 0xe7, 0x00, 0x98, 0xe0, 0x60, 0x02, 0x99, 0xf4, 0xf7, 0xfa, 0xf8, 0x00, 0x20, 0x20, 0x60, 0x01, 0x21, 0xa1, 0x63, 0x60, 0x34, 0x60, 0x80, 0x07, 0x98, 0x0f, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0x06, 0x61, 0x01, 0x00, 0x3c, 0x00, 0x3c, 0xd2, 0x00, 0x00, 0x5c, 0x43, 0x01, 0x00, 0x38, 0x09, 0x00, 0x00, 0x18, 0x67, 0x01, 0x00, 0x0e, 0x61, 0x01, 0x00, 0x0a, 0x61, 0x01, 0x00, 0x01, 0x48, 0x00, 0x68, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x6a, 0x01, 0x00, 0x02, 0x49, 0x09, 0x1d, 0x03, 0xc9, 0x40, 0x18, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x01, 0x48, 0x00, 0x69, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x3c, 0x00, 0x78, 0xd2, 0x00, 0x00, 0x01, 0x48, 0x40, 0x69, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x01, 0x48, 0x80, 0x69, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x70, 0xb5, 0x0d, 0x4e, 0x00, 0x20, 0x35, 0x1c, 0x40, 0x35, 0xf0, 0x63, 0x0d, 0xe0, 0xa0, 0x68, 0xf4, 0xf7, 0x7a, 0xf9, 0xb3, 0x6d, 0x00, 0x2b, 0x04, 0xd0, 0x00, 0x22, 0x01, 0x20, 0x61, 0x6b, 0xf3, 0xf7, 0x95, 0xf8, 0x3c, 0x00, 0xb4, 0xd2, 0x00, 0x00, 0x20, 0x1c, 0xf4, 0xf7, 0x9d, 0xfa, 0x28, 0x1c, 0xfa, 0xf7, 0x42, 0xfd, 0x04, 0x1c, 0xec, 0xd1, 0x70, 0xbd, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0xf8, 0xb5, 0x1a, 0x4f, 0x00, 0x26, 0xf8, 0x6b, 0x00, 0x28, 0x2c, 0xd0, 0x38, 0x1c, 0x40, 0x30, 0x00, 0x90, 0x1d, 0xe0, 0x16, 0x48, 0xb9, 0x6b, 0x02, 0xf0, 0x5c, 0xf8, 0x00, 0x22, 0x20, 0x1c, 0x14, 0x49, 0x03, 0xf0, 0x3c, 0x00, 0xf0, 0xd2, 0x00, 0x00, 0x7b, 0xff, 0x05, 0x1c, 0x04, 0xd1, 0x38, 0x6a, 0x01, 0x30, 0x38, 0x62, 0x01, 0x36, 0x0d, 0xe0, 0xa0, 0x68, 0xf4, 0xf7, 0x49, 0xf9, 0xbb, 0x6d, 0x00, 0x2b, 0x04, 0xd0, 0x00, 0x22, 0x28, 0x1c, 0x61, 0x6b, 0xf3, 0xf7, 0x64, 0xf8, 0x20, 0x1c, 0xf4, 0xf7, 0x6c, 0xfa, 0x00, 0x98, 0xfa, 0xf7, 0x11, 0xfd, 0x04, 0x1c, 0xdc, 0xd1, 0x07, 0x48, 0xb9, 0x6b, 0x02, 0xf0, 0x3c, 0x00, 0x2c, 0xd3, 0x00, 0x00, 0x25, 0xf8, 0x00, 0x20, 0xf8, 0x63, 0x30, 0x1c, 0xf8, 0xbd, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x11, 0x30, 0x00, 0x00, 0xc4, 0x60, 0x01, 0x00, 0x01, 0x49, 0x01, 0x20, 0xc8, 0x63, 0x70, 0x47, 0xc4, 0x69, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x20, 0x05, 0x4a, 0x00, 0x21, 0x1c, 0x23, 0x43, 0x43, 0x9b, 0x18, 0x01, 0x30, 0x04, 0x28, 0xd9, 0x66, 0x3c, 0x00, 0x68, 0xd3, 0x00, 0x00, 0xf8, 0xdb, 0xfc, 0xf7, 0xfd, 0xfc, 0x80, 0xbd, 0xc4, 0x69, 0x01, 0x00, 0x01, 0x49, 0xc8, 0x64, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x01, 0x49, 0x88, 0x64, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, 0x21, 0x1c, 0x02, 0x8e, 0x80, 0x6a, 0x40, 0x31, 0xf3, 0xf7, 0x2f, 0xf8, 0x00, 0x28, 0x16, 0xd1, 0x02, 0x21, 0x3c, 0x00, 0xa4, 0xd3, 0x00, 0x00, 0x20, 0x1c, 0xf4, 0xf7, 0x6f, 0xfa, 0xe2, 0x69, 0xc0, 0x00, 0x10, 0x18, 0x82, 0x8b, 0xab, 0x88, 0x9a, 0x42, 0x04, 0xd1, 0x82, 0x69, 0x2b, 0x68, 0x9a, 0x42, 0x08, 0xd2, 0x01, 0xe0, 0x9a, 0x42, 0x05, 0xd2, 0x00, 0x21, 0x18, 0x30, 0x0c, 0xcd, 0x0c, 0xc0, 0x00, 0xe0, 0x01, 0x21, 0x08, 0x1c, 0xb0, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x00, 0x27, 0x44, 0x68, 0x3c, 0x00, 0xe0, 0xd3, 0x00, 0x00, 0x0f, 0xe0, 0x09, 0x49, 0x48, 0x6a, 0x01, 0x30, 0x48, 0x62, 0xa0, 0x69, 0x00, 0x28, 0x02, 0xd0, 0xf4, 0xf7, 0x00, 0xfa, 0xa7, 0x61, 0x26, 0x62, 0x25, 0x68, 0x20, 0x1c, 0xff, 0xf7, 0x52, 0xfb, 0x2c, 0x1c, 0x00, 0x2c, 0xed, 0xd1, 0xf8, 0xbd, 0xc4, 0x69, 0x01, 0x00, 0x03, 0x30, 0x07, 0x4a, 0x81, 0x08, 0x13, 0x68, 0x50, 0x68, 0x1b, 0x68, 0x89, 0x00, 0x09, 0x18, 0x3c, 0x00, 0x1c, 0xd4, 0x00, 0x00, 0x8b, 0x42, 0x01, 0xd3, 0x51, 0x60, 0x00, 0xe0, 0x00, 0x20, 0x90, 0x60, 0x70, 0x47, 0x00, 0x00, 0x8c, 0x6e, 0x01, 0x00, 0x70, 0xb5, 0x12, 0x4e, 0x80, 0x38, 0xc5, 0x00, 0x70, 0x59, 0x0c, 0x1c, 0x00, 0x28, 0x04, 0xd1, 0x01, 0x21, 0x0d, 0x20, 0xf3, 0xf7, 0x2e, 0xff, 0x0d, 0xe0, 0x20, 0x69, 0x00, 0x28, 0x05, 0xd1, 0xa8, 0x19, 0x81, 0x88, 0xe0, 0x68, 0x01, 0xf0, 0x3c, 0x00, 0x58, 0xd4, 0x00, 0x00, 0x47, 0xfa, 0x20, 0x61, 0x71, 0x59, 0x20, 0x1c, 0xf2, 0xf7, 0xbb, 0xff, 0x04, 0x1c, 0x00, 0x2c, 0x07, 0xd0, 0xe0, 0x68, 0x00, 0x28, 0x01, 0xd0, 0xf4, 0xf7, 0x92, 0xf8, 0x20, 0x1c, 0xf4, 0xf7, 0xbd, 0xf9, 0x70, 0xbd, 0x54, 0x42, 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, 0x0e, 0x49, 0x06, 0x22, 0xf3, 0xf7, 0x35, 0xf8, 0x00, 0x26, 0xe6, 0x61, 0x66, 0x62, 0x3c, 0x00, 0x94, 0xd4, 0x00, 0x00, 0x07, 0x20, 0x30, 0x21, 0x08, 0x55, 0xe6, 0x63, 0x28, 0x1c, 0xf8, 0xf7, 0x6b, 0xf8, 0xa0, 0x76, 0x20, 0x1c, 0x14, 0x30, 0x06, 0x22, 0x29, 0x1c, 0xf3, 0xf7, 0x24, 0xf8, 0x06, 0x22, 0x29, 0x1c, 0xa0, 0x18, 0xf3, 0xf7, 0x1f, 0xf8, 0x26, 0x61, 0x70, 0xbd, 0x00, 0x00, 0x12, 0x61, 0x01, 0x00, 0x80, 0xb5, 0xfd, 0xf7, 0x85, 0xfe, 0x80, 0xbd, 0x01, 0x49, 0x48, 0x60, 0x3c, 0x00, 0xd0, 0xd4, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0xe4, 0x65, 0x01, 0x00, 0x02, 0x49, 0x80, 0xb5, 0x49, 0x68, 0xf2, 0xf7, 0x7c, 0xff, 0x80, 0xbd, 0xe4, 0x65, 0x01, 0x00, 0x80, 0xb5, 0xf4, 0xf7, 0xe5, 0xf9, 0x07, 0x49, 0x07, 0x48, 0x0e, 0xc9, 0x0e, 0xc0, 0x18, 0x38, 0x00, 0x68, 0x00, 0x28, 0x02, 0xd0, 0x02, 0xf0, 0xb7, 0xfa, 0x80, 0xbd, 0x02, 0xf0, 0x9e, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xd5, 0x00, 0x00, 0xb0, 0x58, 0x01, 0x00, 0x90, 0x73, 0x01, 0x00, 0x05, 0x49, 0x80, 0xb5, 0x89, 0x68, 0x00, 0x20, 0x00, 0x29, 0x00, 0xd1, 0x03, 0x20, 0x00, 0x06, 0x00, 0x0e, 0xfa, 0xf7, 0xe3, 0xfb, 0x80, 0xbd, 0x60, 0x6c, 0x01, 0x00, 0x80, 0xb5, 0x03, 0x48, 0x06, 0x22, 0x03, 0x49, 0xf2, 0xf7, 0xde, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x40, 0x80, 0x07, 0x00, 0x12, 0x61, 0x01, 0x00, 0x3c, 0x00, 0x48, 0xd5, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0c, 0x4d, 0x0b, 0x1c, 0x21, 0x1c, 0x00, 0x20, 0x0c, 0x3d, 0x00, 0x29, 0x09, 0x4c, 0x05, 0xd0, 0x28, 0x78, 0x21, 0x1c, 0x10, 0x80, 0x02, 0x1c, 0x18, 0x1c, 0x07, 0xe0, 0x11, 0x88, 0x0e, 0x29, 0x07, 0xd8, 0x0a, 0x06, 0x12, 0x0e, 0x19, 0x1c, 0x20, 0x1c, 0x2a, 0x70, 0xf2, 0xf7, 0xbe, 0xff, 0x01, 0x20, 0xb0, 0xbd, 0xb0, 0x69, 0x01, 0x00, 0x3c, 0x00, 0x84, 0xd5, 0x00, 0x00, 0x10, 0xb5, 0x00, 0x20, 0x0a, 0x4a, 0x01, 0x21, 0x11, 0x60, 0x0a, 0x4c, 0x0a, 0xe0, 0x02, 0x1c, 0x01, 0x6a, 0x50, 0x32, 0x91, 0x42, 0x05, 0xd0, 0x61, 0x78, 0x3c, 0x23, 0x59, 0x43, 0x09, 0x19, 0x04, 0x31, 0x01, 0x62, 0x04, 0xf0, 0xba, 0xfb, 0x00, 0x28, 0xf0, 0xd1, 0x10, 0xbd, 0x00, 0x00, 0xdc, 0x62, 0x01, 0x00, 0x68, 0x61, 0x01, 0x00, 0x04, 0x48, 0x80, 0xb5, 0x3c, 0x00, 0xc0, 0xd5, 0x00, 0x00, 0x00, 0x68, 0x00, 0x28, 0x03, 0xd0, 0x01, 0x1c, 0x10, 0x20, 0x04, 0xf0, 0xc7, 0xfe, 0x80, 0xbd, 0x28, 0x61, 0x01, 0x00, 0x03, 0x22, 0x11, 0x1f, 0x80, 0xb5, 0x00, 0x20, 0xfb, 0xf7, 0x76, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x0b, 0xf0, 0xb9, 0xfa, 0x80, 0xbd, 0xff, 0xb5, 0x83, 0xb0, 0x16, 0x1c, 0x00, 0x21, 0x01, 0x91, 0x1f, 0x1c, 0x08, 0x21, 0x02, 0xaa, 0x3c, 0x00, 0xfc, 0xd5, 0x00, 0x00, 0xfa, 0xf7, 0x0e, 0xff, 0x04, 0x1c, 0x2a, 0xd1, 0x02, 0x98, 0x41, 0x68, 0x49, 0x00, 0x01, 0xd4, 0x09, 0x24, 0x24, 0xe0, 0xfa, 0xf7, 0x52, 0xff, 0x38, 0x60, 0x02, 0x98, 0x41, 0x68, 0x49, 0x02, 0xcd, 0x0f, 0x29, 0x1c, 0xfa, 0xf7, 0x44, 0xff, 0x01, 0x1c, 0x30, 0x60, 0x38, 0x68, 0x00, 0x06, 0x00, 0x0e, 0x00, 0xf0, 0x1b, 0xf8, 0x00, 0x28, 0x01, 0xd1, 0x0a, 0x24, 0x3c, 0x00, 0x38, 0xd6, 0x00, 0x00, 0x0f, 0xe0, 0x31, 0x68, 0x02, 0x98, 0x2b, 0x1c, 0x01, 0xaa, 0xfa, 0xf7, 0xd7, 0xff, 0x00, 0x28, 0x06, 0xd0, 0x01, 0x98, 0x00, 0x28, 0x04, 0xd0, 0x04, 0x99, 0x09, 0x68, 0x81, 0x42, 0x00, 0xd2, 0x03, 0x24, 0x01, 0x98, 0x04, 0x99, 0x08, 0x60, 0x07, 0xb0, 0x20, 0x1c, 0xf0, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x05, 0x1c, 0x0e, 0x1c, 0x01, 0x24, 0x00, 0xf0, 0x84, 0xff, 0x3c, 0x00, 0x74, 0xd6, 0x00, 0x00, 0x00, 0x28, 0x08, 0xd0, 0x03, 0x2d, 0x01, 0xd0, 0x04, 0x2d, 0x04, 0xd1, 0x03, 0x20, 0xc0, 0x03, 0x86, 0x42, 0x00, 0xd3, 0x00, 0x24, 0x20, 0x1c, 0x70, 0xbd, 0x00, 0x00, 0x7c, 0xb5, 0x15, 0x1c, 0x06, 0x1c, 0x0c, 0x1c, 0x29, 0x1c, 0x6a, 0x46, 0x01, 0xab, 0xff, 0xf7, 0xa5, 0xff, 0x00, 0x28, 0x02, 0xd1, 0x00, 0x2c, 0x01, 0xd1, 0x03, 0x20, 0x7c, 0xbd, 0x17, 0x48, 0x3c, 0x00, 0xb0, 0xd6, 0x00, 0x00, 0x00, 0xab, 0x06, 0x60, 0x18, 0x79, 0x07, 0x28, 0x21, 0xd2, 0x02, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x00, 0x1d, 0x04, 0x04, 0x06, 0x10, 0x17, 0x13, 0x00, 0x04, 0x20, 0xed, 0xe7, 0x2a, 0x1c, 0x21, 0x1c, 0x01, 0x20, 0x00, 0x9b, 0xf2, 0xf7, 0x81, 0xfe, 0x00, 0x28, 0x12, 0xd1, 0x06, 0x20, 0xe3, 0xe7, 0x2a, 0x68, 0x00, 0x99, 0x05, 0xe0, 0x00, 0x98, 0x3c, 0x00, 0xec, 0xd6, 0x00, 0x00, 0x42, 0x78, 0x81, 0x1c, 0x01, 0xe0, 0x2a, 0x68, 0x69, 0x46, 0x20, 0x1c, 0xf2, 0xf7, 0xfe, 0xfe, 0x03, 0xe0, 0x04, 0x21, 0x87, 0x20, 0xf3, 0xf7, 0xcf, 0xfd, 0x00, 0x20, 0xd0, 0xe7, 0x00, 0x00, 0xf8, 0x6b, 0x01, 0x00, 0xf7, 0xb5, 0x86, 0xb0, 0x0e, 0x1c, 0x08, 0x21, 0x05, 0xaa, 0x06, 0x98, 0xfa, 0xf7, 0x7e, 0xfe, 0x04, 0x1c, 0x45, 0xd1, 0x05, 0x98, 0x41, 0x68, 0x3c, 0x00, 0x28, 0xd7, 0x00, 0x00, 0x02, 0x90, 0x49, 0x02, 0xc9, 0x0f, 0x00, 0x25, 0x04, 0x95, 0x03, 0x91, 0x08, 0x9f, 0xfa, 0xf7, 0xd5, 0xfe, 0x01, 0x90, 0x02, 0xa9, 0x03, 0xc9, 0xfa, 0xf7, 0xc6, 0xfe, 0x01, 0x99, 0x05, 0x29, 0x14, 0xd2, 0x02, 0xa3, 0x5b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x00, 0x0e, 0x03, 0x06, 0x0c, 0x03, 0x00, 0x87, 0x42, 0x0e, 0xd8, 0x07, 0xe0, 0x87, 0x42, 0x0b, 0xd8, 0x3c, 0x00, 0x64, 0xd7, 0x00, 0x00, 0x01, 0x25, 0xc0, 0x1b, 0x04, 0x90, 0x07, 0xe0, 0x87, 0x42, 0x05, 0xd1, 0x01, 0x25, 0x03, 0xe0, 0x05, 0x21, 0x87, 0x20, 0xf3, 0xf7, 0x94, 0xfd, 0x00, 0x2d, 0x01, 0xd1, 0x03, 0x24, 0x15, 0xe0, 0x05, 0x98, 0x41, 0x68, 0x00, 0x29, 0x69, 0xda, 0x3a, 0x4a, 0x06, 0x99, 0x11, 0x60, 0xfa, 0xf7, 0x91, 0xfe, 0x07, 0x1c, 0x05, 0x98, 0x03, 0x99, 0xfa, 0xf7, 0x86, 0xfe, 0x3c, 0x00, 0xa0, 0xd7, 0x00, 0x00, 0x05, 0x1c, 0x01, 0x1c, 0x38, 0x1c, 0xff, 0xf7, 0x5f, 0xff, 0x00, 0x28, 0x01, 0xd1, 0x0a, 0x24, 0x5e, 0xe0, 0x07, 0x2f, 0x57, 0xd2, 0x02, 0xa3, 0xdb, 0x5d, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x00, 0x53, 0x04, 0x04, 0x06, 0x2e, 0x50, 0x48, 0x00, 0x04, 0x24, 0x51, 0xe0, 0x04, 0x98, 0x00, 0x28, 0x01, 0xd1, 0x00, 0x27, 0x14, 0xe0, 0x08, 0x99, 0x08, 0x18, 0x00, 0x04, 0x3c, 0x00, 0xdc, 0xd7, 0x00, 0x00, 0x00, 0x0c, 0xf4, 0xf7, 0x2b, 0xf8, 0x07, 0x1c, 0x31, 0x1c, 0x08, 0x9a, 0xf2, 0xf7, 0x86, 0xfe, 0x08, 0x98, 0x04, 0x99, 0x38, 0x18, 0xf2, 0xf7, 0x2f, 0xfe, 0x08, 0x98, 0x04, 0x99, 0x3e, 0x1c, 0x40, 0x18, 0x08, 0x90, 0x31, 0x1c, 0x00, 0x20, 0x08, 0xaa, 0xf2, 0xf7, 0xec, 0xfd, 0x00, 0x28, 0x00, 0xd1, 0x05, 0x24, 0x00, 0x2f, 0x2d, 0xd0, 0x38, 0x1c, 0xf3, 0xf7, 0x3c, 0x00, 0x18, 0xd8, 0x00, 0x00, 0xed, 0xff, 0x29, 0xe0, 0x03, 0x99, 0x00, 0x29, 0x04, 0xd0, 0x05, 0x98, 0x40, 0x68, 0x87, 0x02, 0xbf, 0x0a, 0x00, 0xe0, 0x00, 0x27, 0x31, 0x1c, 0x28, 0x1c, 0x08, 0x9a, 0xf2, 0xf7, 0x60, 0xfe, 0x04, 0x99, 0x00, 0x29, 0x03, 0xd0, 0x08, 0x98, 0x28, 0x18, 0xf2, 0xf7, 0x07, 0xfe, 0x00, 0x2f, 0x12, 0xd0, 0xf2, 0xf7, 0xcc, 0xfd, 0x0f, 0xe0, 0x31, 0x1c, 0xa8, 0x1c, 0x3c, 0x00, 0x54, 0xd8, 0x00, 0x00, 0x08, 0x9a, 0xf2, 0xf7, 0x4f, 0xfe, 0x08, 0x98, 0x68, 0x70, 0x07, 0xe0, 0xff, 0xe7, 0x07, 0x24, 0x04, 0xe0, 0x08, 0x24, 0x03, 0x21, 0x87, 0x20, 0xf3, 0xf7, 0x1a, 0xfd, 0x20, 0x1c, 0x09, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xf8, 0x6b, 0x01, 0x00, 0x9e, 0xb5, 0x1c, 0x1c, 0x00, 0xab, 0x19, 0x72, 0x00, 0x92, 0x00, 0x22, 0x01, 0x94, 0x69, 0x46, 0xfb, 0xf7, 0x08, 0xfa, 0x3c, 0x00, 0x90, 0xd8, 0x00, 0x00, 0x9e, 0xbd, 0x00, 0x00, 0x8f, 0xb5, 0x02, 0x92, 0x00, 0x22, 0x00, 0x90, 0x01, 0x90, 0x03, 0x91, 0x69, 0x46, 0x04, 0x20, 0xfb, 0xf7, 0xfc, 0xf9, 0x8f, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x0c, 0x1c, 0x01, 0x28, 0x0a, 0xd0, 0x03, 0x28, 0x19, 0xd0, 0x04, 0x28, 0x2c, 0xd1, 0x60, 0x68, 0x01, 0xf0, 0x35, 0xfc, 0x01, 0x1c, 0x83, 0x20, 0x0c, 0xcc, 0x22, 0xe0, 0x1c, 0x20, 0x3c, 0x00, 0xcc, 0xd8, 0x00, 0x00, 0x14, 0x49, 0x60, 0x43, 0x40, 0x18, 0x14, 0x49, 0x45, 0x18, 0x28, 0x1c, 0xf8, 0xf7, 0x46, 0xfc, 0xa9, 0x68, 0x00, 0x29, 0x03, 0xd0, 0x22, 0x1c, 0x08, 0x20, 0x05, 0xf0, 0x71, 0xfe, 0xb0, 0xbd, 0x20, 0x8c, 0xc8, 0x28, 0x01, 0xd3, 0x04, 0x20, 0x04, 0xe0, 0x65, 0x28, 0x01, 0xd3, 0x02, 0x20, 0x00, 0xe0, 0x01, 0x20, 0x20, 0x84, 0x20, 0x1c, 0x03, 0xf0, 0xdc, 0xfa, 0x3c, 0x00, 0x08, 0xd9, 0x00, 0x00, 0x22, 0x68, 0xe3, 0x68, 0x01, 0x1c, 0x82, 0x20, 0xff, 0xf7, 0xb4, 0xff, 0xb0, 0xbd, 0xa0, 0x21, 0x08, 0x20, 0xf3, 0xf7, 0xc3, 0xfc, 0xb0, 0xbd, 0xdc, 0x71, 0x01, 0x00, 0x64, 0xee, 0xff, 0xff, 0x03, 0x48, 0x04, 0x4a, 0x81, 0x68, 0x51, 0x61, 0xc0, 0x68, 0x90, 0x61, 0x70, 0x47, 0x00, 0x00, 0xf4, 0x68, 0x01, 0x00, 0xc0, 0x71, 0x01, 0x00, 0x03, 0x49, 0x04, 0x4a, 0x3c, 0x00, 0x44, 0xd9, 0x00, 0x00, 0x08, 0x6b, 0x90, 0x60, 0x88, 0x68, 0xd0, 0x60, 0x70, 0x47, 0x00, 0x00, 0x90, 0x5c, 0x01, 0x00, 0xc0, 0x71, 0x01, 0x00, 0x00, 0xb5, 0xff, 0xf7, 0xf1, 0xff, 0xff, 0xf7, 0xe3, 0xff, 0x00, 0xbd, 0xb0, 0xb5, 0x0d, 0x1c, 0x00, 0x28, 0x14, 0xd0, 0x0b, 0x49, 0x0c, 0x4c, 0x88, 0x68, 0x62, 0x69, 0xc9, 0x68, 0x80, 0x1a, 0xa2, 0x69, 0x89, 0x1a, 0x40, 0x18, 0x04, 0xd0, 0x3c, 0x00, 0x80, 0xd9, 0x00, 0x00, 0x64, 0x23, 0x59, 0x43, 0xf2, 0xf7, 0xc4, 0xfe, 0x20, 0x61, 0xff, 0xf7, 0xcd, 0xff, 0x20, 0x69, 0x28, 0x60, 0x01, 0x20, 0xb0, 0xbd, 0x00, 0x20, 0xb0, 0xbd, 0x00, 0x00, 0xf4, 0x68, 0x01, 0x00, 0xc0, 0x71, 0x01, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x00, 0x28, 0x17, 0xd0, 0x0c, 0x49, 0x0d, 0x4c, 0x08, 0x6b, 0xa2, 0x68, 0x89, 0x68, 0x80, 0x1a, 0xe2, 0x68, 0x89, 0x1a, 0x3c, 0x00, 0xbc, 0xd9, 0x00, 0x00, 0x40, 0x18, 0x07, 0xd0, 0x22, 0x88, 0x90, 0x42, 0x04, 0xd9, 0x64, 0x23, 0x59, 0x43, 0xf2, 0xf7, 0xa1, 0xfe, 0x60, 0x60, 0xff, 0xf7, 0xb6, 0xff, 0x60, 0x68, 0x28, 0x60, 0x01, 0x20, 0xb0, 0xbd, 0x00, 0x20, 0xb0, 0xbd, 0x90, 0x5c, 0x01, 0x00, 0xc0, 0x71, 0x01, 0x00, 0x7c, 0xb5, 0x10, 0x68, 0x00, 0x28, 0x02, 0xd0, 0x00, 0xf0, 0x24, 0xf8, 0x7c, 0xbd, 0x0f, 0x48, 0x3c, 0x00, 0xf8, 0xd9, 0x00, 0x00, 0xc0, 0x69, 0x84, 0x68, 0xe0, 0x68, 0x25, 0x6a, 0xa6, 0x69, 0xf3, 0xf7, 0xe3, 0xfd, 0xe1, 0x69, 0xf3, 0xf7, 0x06, 0xfd, 0x20, 0x1c, 0xe2, 0x69, 0x40, 0x30, 0xc1, 0x8b, 0x12, 0x89, 0x89, 0x18, 0xc1, 0x83, 0x07, 0x49, 0x01, 0x94, 0x00, 0x91, 0x28, 0x69, 0x33, 0x1c, 0x82, 0x88, 0x01, 0x68, 0xe0, 0x68, 0xc0, 0x68, 0xf8, 0xf7, 0x1e, 0xfc, 0xe0, 0xe7, 0x00, 0x00, 0x3c, 0x00, 0x34, 0xda, 0x00, 0x00, 0x84, 0x6a, 0x01, 0x00, 0x91, 0x5e, 0x00, 0x00, 0xf0, 0xb5, 0x85, 0x69, 0x06, 0x6a, 0x04, 0x1c, 0xc0, 0x68, 0x85, 0xb0, 0xc0, 0x68, 0x00, 0x28, 0x01, 0xd1, 0xf3, 0xf7, 0x57, 0xfc, 0x0a, 0x49, 0x02, 0x95, 0x04, 0x94, 0x03, 0x91, 0x30, 0x69, 0x82, 0x88, 0x01, 0x68, 0x26, 0x20, 0x01, 0x92, 0x00, 0x91, 0x43, 0x5d, 0xe0, 0x68, 0xe1, 0x69, 0x2a, 0x1c, 0x0e, 0x32, 0x3c, 0x00, 0x70, 0xda, 0x00, 0x00, 0xc0, 0x68, 0xf8, 0xf7, 0x37, 0xfd, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xe9, 0xd9, 0x00, 0x00, 0x10, 0xb5, 0x14, 0x1c, 0x05, 0x48, 0xfc, 0xf7, 0x7b, 0xfb, 0xa0, 0x68, 0xf3, 0xf7, 0x9e, 0xfd, 0xe1, 0x68, 0xc1, 0x60, 0x20, 0x1c, 0xf5, 0xf7, 0xbb, 0xfa, 0x10, 0xbd, 0xa0, 0x6a, 0x01, 0x00, 0x7c, 0xb5, 0x04, 0x1c, 0x60, 0x30, 0x02, 0x7b, 0xa1, 0x69, 0x00, 0x91, 0x3c, 0x00, 0xac, 0xda, 0x00, 0x00, 0x01, 0x92, 0x22, 0x1c, 0x21, 0x1c, 0x38, 0x31, 0xa0, 0x68, 0x48, 0x32, 0x0d, 0x1c, 0x63, 0x69, 0x03, 0xf0, 0x7a, 0xfb, 0x08, 0x21, 0x00, 0x20, 0xf3, 0xf7, 0x88, 0xfd, 0xe0, 0x60, 0x26, 0x69, 0xb1, 0x6b, 0x00, 0x29, 0x01, 0xd0, 0x10, 0x23, 0x00, 0xe0, 0x18, 0x23, 0x05, 0x49, 0x01, 0x94, 0x00, 0x91, 0x31, 0x68, 0xca, 0x18, 0x08, 0x23, 0x01, 0x1c, 0x28, 0x1c, 0x3c, 0x00, 0xe8, 0xda, 0x00, 0x00, 0xf8, 0xf7, 0x20, 0xfd, 0x7c, 0xbd, 0x00, 0x00, 0x81, 0xda, 0x00, 0x00, 0xf0, 0xb5, 0x46, 0x68, 0x17, 0x1c, 0x04, 0x1c, 0x01, 0x21, 0x30, 0x1c, 0x9b, 0xb0, 0xfa, 0xf7, 0x0d, 0xfc, 0x00, 0x25, 0x00, 0x28, 0x03, 0xd0, 0x13, 0x49, 0x0a, 0x7a, 0x01, 0x2a, 0x01, 0xd1, 0x01, 0x25, 0x1c, 0xe0, 0x88, 0x62, 0x4e, 0x61, 0x20, 0x89, 0xc8, 0x61, 0x60, 0x89, 0x00, 0x28, 0x3c, 0x00, 0x24, 0xdb, 0x00, 0x00, 0x03, 0xd0, 0x00, 0x20, 0x08, 0x84, 0x48, 0x84, 0x04, 0xe0, 0xe0, 0x68, 0x08, 0x84, 0x20, 0x8a, 0x48, 0x84, 0x60, 0x8a, 0x88, 0x84, 0x08, 0x6b, 0x00, 0x28, 0x03, 0xd1, 0x01, 0xa8, 0x03, 0xf0, 0x77, 0xfc, 0x04, 0xe0, 0x01, 0x20, 0x08, 0x61, 0x00, 0x20, 0x02, 0xf0, 0x39, 0xfb, 0x3d, 0x71, 0x1b, 0xb0, 0x01, 0x20, 0xf0, 0xbd, 0x00, 0x00, 0xf4, 0x6e, 0x01, 0x00, 0x3c, 0x00, 0x60, 0xdb, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0xf7, 0xf7, 0xe8, 0xfb, 0x00, 0x28, 0x11, 0xd1, 0x4b, 0x20, 0x00, 0x5d, 0x01, 0x28, 0x0d, 0xd1, 0x20, 0x1c, 0x04, 0xf0, 0x85, 0xfa, 0x00, 0x21, 0x20, 0x1c, 0x04, 0xf0, 0xf3, 0xf8, 0xa0, 0x69, 0x00, 0x21, 0xc2, 0x07, 0xd2, 0x0f, 0x04, 0x20, 0xf4, 0xf7, 0xd8, 0xf9, 0x10, 0xbd, 0x00, 0x00, 0x38, 0xb5, 0x04, 0x1c, 0x04, 0xf0, 0x36, 0xf9, 0x3c, 0x00, 0x9c, 0xdb, 0x00, 0x00, 0x00, 0x28, 0x03, 0xd0, 0x40, 0x30, 0x80, 0x7a, 0x00, 0x28, 0x25, 0xd1, 0x0c, 0x20, 0x29, 0x21, 0x08, 0x55, 0x21, 0x1c, 0x06, 0x22, 0xa0, 0x18, 0xf2, 0xf7, 0xa0, 0xfc, 0x20, 0x1c, 0x06, 0x22, 0x0e, 0x49, 0xf2, 0xf7, 0x9b, 0xfc, 0x01, 0x20, 0xe0, 0x61, 0x60, 0x62, 0x07, 0x20, 0x30, 0x21, 0x08, 0x55, 0x00, 0x25, 0xe5, 0x63, 0x06, 0x20, 0x00, 0xab, 0x18, 0x80, 0x3c, 0x00, 0xd8, 0xdb, 0x00, 0x00, 0xe0, 0x68, 0x00, 0x28, 0x01, 0xd0, 0xf3, 0xf7, 0xdb, 0xfc, 0x02, 0x21, 0x68, 0x46, 0xfd, 0xf7, 0x73, 0xfb, 0xe0, 0x60, 0x20, 0x1c, 0xff, 0xf7, 0x69, 0xfc, 0xe5, 0x60, 0x20, 0x1c, 0x38, 0xbd, 0x12, 0x61, 0x01, 0x00, 0xfe, 0xb5, 0x05, 0x1c, 0x0e, 0x1c, 0x15, 0x20, 0x00, 0xab, 0x98, 0x80, 0x14, 0x21, 0x17, 0x1c, 0x00, 0x20, 0xf3, 0xf7, 0xe3, 0xfc, 0x02, 0x90, 0x3c, 0x00, 0x14, 0xdc, 0x00, 0x00, 0x04, 0x68, 0x06, 0x22, 0x31, 0x1c, 0x60, 0x1d, 0x25, 0x71, 0xf2, 0xf7, 0x6b, 0xfc, 0x06, 0x22, 0x39, 0x1c, 0x20, 0x1c, 0x0b, 0x30, 0xf2, 0xf7, 0x65, 0xfc, 0x01, 0xa8, 0xff, 0xf7, 0x52, 0xfc, 0xfe, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x23, 0xfb, 0xf7, 0x5c, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x05, 0x1c, 0x08, 0x35, 0x0f, 0x4e, 0x29, 0x1c, 0x04, 0x1c, 0x3c, 0x00, 0x50, 0xdc, 0x00, 0x00, 0x06, 0x22, 0x30, 0x1c, 0xf2, 0xf7, 0x50, 0xfc, 0xa0, 0x88, 0xb0, 0x82, 0x28, 0x1c, 0x05, 0xf0, 0xa1, 0xff, 0x00, 0x28, 0x0b, 0xd0, 0xe0, 0x88, 0x30, 0x61, 0x28, 0x1c, 0x04, 0xf0, 0xcc, 0xf8, 0xa1, 0x88, 0x40, 0x30, 0x41, 0x80, 0x00, 0x20, 0xf4, 0xf7, 0xb8, 0xf9, 0x02, 0xe0, 0x04, 0x20, 0xf4, 0xf7, 0xa0, 0xf9, 0x00, 0x20, 0x70, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x3c, 0x00, 0x8c, 0xdc, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x20, 0xfb, 0xf7, 0xf8, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x04, 0x30, 0x05, 0x1c, 0xfd, 0xf7, 0x32, 0xf8, 0x00, 0x28, 0x09, 0xd0, 0x00, 0x20, 0xf7, 0xf7, 0x37, 0xfc, 0x00, 0x28, 0x04, 0xd0, 0x06, 0x22, 0x01, 0x1c, 0x28, 0x1c, 0xf2, 0xf7, 0x1e, 0xfc, 0x0a, 0x4e, 0x06, 0x22, 0x29, 0x1c, 0x30, 0x1c, 0xf2, 0xf7, 0x18, 0xfc, 0x3c, 0x00, 0xc8, 0xdc, 0x00, 0x00, 0x60, 0x89, 0xf0, 0x82, 0x28, 0x1c, 0x05, 0xf0, 0x69, 0xff, 0x00, 0x28, 0x03, 0xd0, 0x02, 0x20, 0xf4, 0xf7, 0x88, 0xf9, 0x02, 0xe0, 0x05, 0x20, 0xf9, 0xf7, 0xf4, 0xfa, 0x00, 0x20, 0x70, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x00, 0x79, 0x04, 0x28, 0x1c, 0xd2, 0x60, 0x79, 0x01, 0x28, 0x01, 0xd0, 0x03, 0x28, 0x04, 0xd1, 0x00, 0x22, 0x01, 0x21, 0x3c, 0x00, 0x04, 0xdd, 0x00, 0x00, 0xa0, 0x1d, 0xf9, 0xf7, 0x69, 0xfc, 0x60, 0x79, 0x00, 0x28, 0x04, 0xd1, 0x22, 0x79, 0x00, 0x21, 0xf9, 0xf7, 0x62, 0xfc, 0x0a, 0xe0, 0x03, 0x28, 0x08, 0xd1, 0x00, 0x24, 0x22, 0x1c, 0x00, 0x21, 0x00, 0x20, 0xf9, 0xf7, 0x59, 0xfc, 0x01, 0x34, 0x04, 0x2c, 0xf7, 0xdb, 0x01, 0x20, 0x10, 0xbd, 0xf0, 0xb5, 0x97, 0xb0, 0x17, 0x1c, 0x05, 0x1c, 0x04, 0x30, 0x04, 0x1c, 0x3c, 0x00, 0x40, 0xdd, 0x00, 0x00, 0x15, 0xaa, 0x16, 0xa9, 0x05, 0xf0, 0xe2, 0xfe, 0x00, 0x28, 0x2e, 0xd0, 0x15, 0x98, 0x4b, 0x21, 0x09, 0x5c, 0x00, 0x29, 0x23, 0xd0, 0x01, 0x29, 0x02, 0xd0, 0x02, 0x29, 0x1f, 0xd1, 0x01, 0xe0, 0x04, 0xf0, 0x90, 0xf9, 0xad, 0x7a, 0x13, 0x48, 0x16, 0x9e, 0x05, 0x80, 0x06, 0x22, 0x21, 0x1c, 0x08, 0x30, 0xf2, 0xf7, 0xc1, 0xfb, 0x22, 0x1c, 0x31, 0x1c, 0x02, 0xa8, 0x3c, 0x00, 0x7c, 0xdd, 0x00, 0x00, 0x00, 0xf0, 0x74, 0xfb, 0x0a, 0x20, 0x0a, 0xa9, 0x48, 0x72, 0x00, 0xab, 0x9d, 0x80, 0x02, 0x21, 0x01, 0xa8, 0xfd, 0xf7, 0x9f, 0xfa, 0x05, 0x90, 0x02, 0xa8, 0xff, 0xf7, 0x95, 0xfb, 0xf3, 0xf7, 0xf7, 0xf9, 0x00, 0x21, 0x15, 0x98, 0x03, 0xf0, 0xe1, 0xff, 0x00, 0x20, 0x00, 0xe0, 0x01, 0x20, 0x38, 0x71, 0x17, 0xb0, 0x01, 0x20, 0xf0, 0xbd, 0x98, 0x7c, 0x01, 0x00, 0x3c, 0x00, 0xb8, 0xdd, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x20, 0xfb, 0xf7, 0x62, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x80, 0x7d, 0x15, 0x1c, 0x0a, 0x1c, 0xc0, 0x07, 0xc0, 0x17, 0x01, 0x30, 0x21, 0x1c, 0xf9, 0xf7, 0xfb, 0xfc, 0x00, 0x28, 0x03, 0xd1, 0x04, 0x20, 0x28, 0x71, 0x01, 0x20, 0xb0, 0xbd, 0x20, 0x6a, 0xf7, 0xf7, 0x76, 0xfe, 0x60, 0x6a, 0xf7, 0xf7, 0x7b, 0xfe, 0x20, 0x6a, 0x3c, 0x00, 0xf4, 0xdd, 0x00, 0x00, 0xfe, 0xf7, 0x88, 0xfa, 0x00, 0x20, 0xb0, 0xbd, 0x10, 0xb5, 0x14, 0x1c, 0xc2, 0x79, 0x81, 0x79, 0x80, 0x88, 0xf7, 0xf7, 0xa1, 0xfa, 0x20, 0x71, 0x01, 0x20, 0x10, 0xbd, 0x80, 0xb5, 0x01, 0x23, 0xfa, 0xf7, 0x70, 0xff, 0x80, 0xbd, 0x00, 0x00, 0xf0, 0xb5, 0x04, 0x1c, 0x08, 0x1c, 0x00, 0x21, 0x0f, 0x28, 0x91, 0xb0, 0x00, 0xd3, 0x02, 0x21, 0x00, 0x29, 0x41, 0xd1, 0x3c, 0x00, 0x30, 0xde, 0x00, 0x00, 0xc0, 0x00, 0x24, 0x4f, 0x10, 0x90, 0xc6, 0x19, 0xb2, 0x88, 0x21, 0x68, 0x02, 0xa8, 0xf2, 0xf7, 0x5b, 0xfb, 0x21, 0x89, 0xb0, 0x88, 0x09, 0x1a, 0x00, 0x29, 0x07, 0xdd, 0x09, 0x04, 0x22, 0x68, 0x09, 0x0c, 0x10, 0x18, 0xf3, 0xf7, 0xc0, 0xfb, 0x05, 0x1c, 0x00, 0xe0, 0x00, 0x25, 0xb0, 0x79, 0x80, 0x21, 0x88, 0x43, 0x17, 0x49, 0x78, 0x31, 0x09, 0x5c, 0x00, 0x20, 0x3c, 0x00, 0x6c, 0xde, 0x00, 0x00, 0xf3, 0xf7, 0xb4, 0xfb, 0x07, 0x1c, 0x00, 0x68, 0x13, 0x49, 0x01, 0x90, 0x10, 0x98, 0x0b, 0x58, 0x01, 0x9a, 0x29, 0x1c, 0x02, 0xa8, 0xf2, 0xf7, 0xac, 0xfa, 0x00, 0x90, 0x28, 0x1c, 0xf3, 0xf7, 0x73, 0xfb, 0x20, 0x1c, 0xf3, 0xf7, 0x82, 0xfb, 0x00, 0x98, 0x00, 0x28, 0x08, 0xd0, 0x02, 0x98, 0x01, 0x99, 0x08, 0x60, 0xb0, 0x79, 0x39, 0x1c, 0xfa, 0xf7, 0x20, 0xff, 0x3c, 0x00, 0xa8, 0xde, 0x00, 0x00, 0x11, 0xb0, 0xf0, 0xbd, 0x38, 0x1c, 0xf3, 0xf7, 0x61, 0xfb, 0xf9, 0xe7, 0x2d, 0x20, 0xf3, 0xf7, 0xf5, 0xf9, 0x20, 0x1c, 0xf3, 0xf7, 0x6c, 0xfb, 0xf2, 0xe7, 0x00, 0x00, 0x24, 0x44, 0x01, 0x00, 0x70, 0xb5, 0x05, 0x1c, 0x20, 0x35, 0x06, 0x1c, 0xa8, 0x79, 0x04, 0x28, 0x48, 0xd2, 0xe9, 0x79, 0x01, 0x29, 0x13, 0xd1, 0x30, 0x1c, 0x28, 0x30, 0x03, 0xf0, 0x92, 0xff, 0x3c, 0x00, 0xe4, 0xde, 0x00, 0x00, 0x00, 0x28, 0x3f, 0xd0, 0x01, 0x1c, 0x8c, 0x31, 0x01, 0x65, 0xa9, 0x79, 0x4c, 0x22, 0x04, 0x1c, 0x11, 0x54, 0x81, 0x18, 0x41, 0x62, 0x50, 0x34, 0x04, 0x62, 0xe1, 0x1e, 0x81, 0x62, 0x0b, 0xe0, 0x00, 0x29, 0x2f, 0xd1, 0x3c, 0x22, 0x18, 0x49, 0x42, 0x43, 0x54, 0x18, 0x17, 0x4a, 0x04, 0x34, 0x12, 0x68, 0x00, 0x2a, 0x00, 0xd1, 0x48, 0x70, 0x00, 0x2c, 0x23, 0xd0, 0x3c, 0x00, 0x20, 0xdf, 0x00, 0x00, 0x35, 0x1c, 0x30, 0x35, 0xe8, 0x79, 0x01, 0x28, 0x01, 0xd0, 0x05, 0x28, 0x01, 0xd1, 0x06, 0x20, 0xe8, 0x71, 0x20, 0x22, 0x31, 0x1d, 0x20, 0x68, 0xf2, 0xf7, 0xde, 0xfa, 0xb0, 0x8c, 0xa0, 0x80, 0xe8, 0x79, 0xa0, 0x71, 0xa8, 0x79, 0x00, 0x25, 0xa0, 0x63, 0x01, 0x20, 0x60, 0x81, 0x00, 0x20, 0xe0, 0x60, 0x2e, 0x36, 0xe8, 0x00, 0x00, 0x19, 0x18, 0x30, 0x08, 0x22, 0x3c, 0x00, 0x5c, 0xdf, 0x00, 0x00, 0x31, 0x1c, 0xf2, 0xf7, 0xcb, 0xfa, 0x01, 0x35, 0x04, 0x2d, 0xf5, 0xd3, 0x01, 0x20, 0x70, 0xbd, 0x68, 0x61, 0x01, 0x00, 0xdc, 0x62, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0xc0, 0x7a, 0x01, 0x28, 0x01, 0xd0, 0x03, 0x28, 0x07, 0xd1, 0x20, 0x1d, 0x03, 0xf0, 0x40, 0xff, 0x00, 0x28, 0x02, 0xd0, 0xa1, 0x7a, 0x40, 0x30, 0x41, 0x73, 0xe0, 0x7a, 0x00, 0x28, 0x01, 0xd0, 0x3c, 0x00, 0x98, 0xdf, 0x00, 0x00, 0x03, 0x28, 0x02, 0xd1, 0xa0, 0x7a, 0x02, 0x49, 0x08, 0x70, 0x01, 0x20, 0x10, 0xbd, 0x00, 0x00, 0x68, 0x61, 0x01, 0x00, 0x70, 0xb5, 0x0e, 0x1c, 0x03, 0x21, 0x04, 0x1c, 0x30, 0x1c, 0xfc, 0xf7, 0xe1, 0xfb, 0x00, 0x28, 0x01, 0xd0, 0x85, 0x78, 0x00, 0xe0, 0x00, 0x25, 0x0b, 0x48, 0x32, 0x1c, 0x00, 0x68, 0x03, 0x68, 0x20, 0x7c, 0x80, 0x07, 0xc0, 0x0f, 0x21, 0x1c, 0x3c, 0x00, 0xd4, 0xdf, 0x00, 0x00, 0xf7, 0xf7, 0x62, 0xfe, 0x00, 0x28, 0x05, 0xd0, 0x01, 0x21, 0x28, 0x1c, 0xfd, 0xf7, 0xfe, 0xfb, 0x00, 0x20, 0x00, 0xe0, 0x08, 0x20, 0x03, 0xf0, 0xc5, 0xff, 0x00, 0x20, 0x70, 0xbd, 0x00, 0x00, 0xe4, 0x65, 0x01, 0x00, 0x80, 0xb5, 0x42, 0x68, 0x00, 0x88, 0x01, 0x21, 0x49, 0x06, 0x08, 0x43, 0x2d, 0x21, 0x05, 0xf0, 0xd3, 0xfb, 0x80, 0xbd, 0x03, 0x49, 0x01, 0x20, 0x3c, 0x00, 0x10, 0xe0, 0x00, 0x00, 0x49, 0x78, 0x02, 0x29, 0x00, 0xd0, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x84, 0x66, 0x01, 0x00, 0x8c, 0xb5, 0x01, 0x28, 0x1f, 0xd1, 0x00, 0x29, 0x0d, 0xd0, 0x01, 0x29, 0x0b, 0xd0, 0x02, 0x29, 0x01, 0xd0, 0x03, 0x29, 0x16, 0xd1, 0x00, 0x20, 0xf9, 0xf7, 0x14, 0xfc, 0x93, 0x20, 0x00, 0xab, 0x18, 0x80, 0x00, 0x20, 0x08, 0xe0, 0x01, 0x29, 0x00, 0xd0, 0x00, 0x20, 0x3c, 0x00, 0x4c, 0xe0, 0x00, 0x00, 0xf9, 0xf7, 0x0a, 0xfc, 0x83, 0x20, 0x00, 0xab, 0x18, 0x80, 0x02, 0x20, 0x00, 0xf0, 0xcc, 0xf8, 0x01, 0x90, 0x68, 0x46, 0xff, 0xf7, 0x3a, 0xfa, 0x8c, 0xbd, 0x01, 0x21, 0x0e, 0x20, 0xf3, 0xf7, 0x1b, 0xf9, 0xf9, 0xe7, 0xff, 0xb5, 0x17, 0x1c, 0x1e, 0x1c, 0x14, 0x21, 0x00, 0x20, 0x83, 0xb0, 0xf3, 0xf7, 0xac, 0xfa, 0x05, 0x1c, 0x04, 0x68, 0x12, 0x20, 0x00, 0xab, 0x3c, 0x00, 0x88, 0xe0, 0x00, 0x00, 0x98, 0x80, 0x06, 0x22, 0x60, 0x1d, 0x03, 0x99, 0xf2, 0xf7, 0x32, 0xfa, 0x00, 0x20, 0x20, 0x71, 0x27, 0x73, 0x04, 0x99, 0x20, 0x1c, 0xe1, 0x72, 0x31, 0x1c, 0x06, 0x22, 0x0d, 0x30, 0xf2, 0xf7, 0x27, 0xfa, 0x02, 0x95, 0x01, 0xa8, 0xff, 0xf7, 0x13, 0xfa, 0x07, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x0f, 0x1c, 0x0c, 0x21, 0x00, 0x20, 0xf3, 0xf7, 0x3c, 0x00, 0xc4, 0xe0, 0x00, 0x00, 0x89, 0xfa, 0x05, 0x68, 0x04, 0x1c, 0x28, 0x1d, 0x06, 0x22, 0x31, 0x1c, 0xf2, 0xf7, 0x12, 0xfa, 0x6f, 0x81, 0x20, 0x1c, 0xf8, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, 0x08, 0x21, 0x00, 0x20, 0xf3, 0xf7, 0x77, 0xfa, 0x01, 0x68, 0x8c, 0x71, 0x8d, 0x80, 0xb0, 0xbd, 0x00, 0x00, 0xf7, 0xb5, 0x0e, 0x1c, 0x10, 0x21, 0x17, 0x1c, 0x00, 0x20, 0xf3, 0xf7, 0x3c, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x6b, 0xfa, 0x04, 0x68, 0x05, 0x1c, 0x20, 0x1d, 0x06, 0x22, 0x00, 0x99, 0xf2, 0xf7, 0xf4, 0xf9, 0x66, 0x81, 0xa7, 0x81, 0x28, 0x1c, 0xfe, 0xbd, 0xf3, 0xb5, 0x0c, 0x1c, 0x08, 0x21, 0x00, 0x20, 0x85, 0xb0, 0xf3, 0xf7, 0x59, 0xfa, 0x06, 0x1c, 0x07, 0x68, 0xe0, 0x68, 0x00, 0x28, 0x02, 0xd0, 0x05, 0x99, 0x01, 0x29, 0x04, 0xd1, 0x05, 0x98, 0x38, 0x71, 0x00, 0x20, 0x3c, 0x00, 0x3c, 0xe1, 0x00, 0x00, 0x78, 0x71, 0x56, 0xe0, 0x03, 0x68, 0x01, 0x21, 0x03, 0x93, 0x20, 0x69, 0x02, 0x90, 0xfc, 0xf7, 0x17, 0xfb, 0x05, 0x1c, 0x02, 0x98, 0x32, 0x21, 0xfc, 0xf7, 0x12, 0xfb, 0x00, 0x22, 0xd2, 0x43, 0x01, 0x1c, 0x28, 0x1c, 0x04, 0xab, 0xf7, 0xf7, 0xb9, 0xf8, 0x00, 0x28, 0x04, 0xd1, 0x30, 0x1c, 0xf3, 0xf7, 0x02, 0xfa, 0x00, 0x26, 0x3c, 0xe0, 0x00, 0x2d, 0x05, 0xd0, 0x3c, 0x00, 0x78, 0xe1, 0x00, 0x00, 0x68, 0x78, 0x09, 0x38, 0x07, 0x28, 0x01, 0xd8, 0x32, 0x20, 0x28, 0x70, 0x1c, 0x21, 0x00, 0x20, 0xf3, 0xf7, 0x26, 0xfa, 0x01, 0x90, 0x05, 0x68, 0x01, 0x1c, 0x30, 0x1c, 0xf3, 0xf7, 0x40, 0xf9, 0xe0, 0x68, 0xf3, 0xf7, 0x0b, 0xfa, 0xa8, 0x61, 0xe1, 0x68, 0x01, 0x98, 0xf3, 0xf7, 0x38, 0xf9, 0x00, 0x20, 0xe0, 0x60, 0x05, 0x98, 0x80, 0x21, 0x08, 0x43, 0x38, 0x71, 0x3c, 0x00, 0xb4, 0xe1, 0x00, 0x00, 0x01, 0x20, 0x21, 0x1c, 0x14, 0x31, 0x78, 0x71, 0x28, 0x1c, 0x06, 0x22, 0xf2, 0xf7, 0x9a, 0xf9, 0x02, 0x9a, 0x29, 0x20, 0x00, 0x92, 0x00, 0x5d, 0x01, 0x21, 0xe2, 0x6a, 0x08, 0x28, 0x00, 0xd0, 0x00, 0x21, 0x28, 0x1c, 0x03, 0x9b, 0x02, 0xf0, 0x9d, 0xff, 0xa0, 0x6b, 0x28, 0x61, 0x20, 0x6c, 0x68, 0x61, 0x7f, 0x30, 0x01, 0xd1, 0x0f, 0x20, 0x68, 0x61, 0x30, 0x1c, 0x3c, 0x00, 0xf0, 0xe1, 0x00, 0x00, 0x07, 0xb0, 0xf0, 0xbd, 0x10, 0xb5, 0x04, 0x1c, 0x08, 0x21, 0x00, 0x20, 0xf3, 0xf7, 0xec, 0xf9, 0x01, 0x68, 0x0c, 0x71, 0x10, 0xbd, 0x00, 0x00, 0x01, 0x48, 0x00, 0x68, 0x70, 0x47, 0x00, 0x00, 0x28, 0x61, 0x01, 0x00, 0x01, 0x49, 0x08, 0x60, 0x70, 0x47, 0x00, 0x00, 0xe4, 0x65, 0x01, 0x00, 0x02, 0x1c, 0x01, 0x20, 0x00, 0x06, 0x08, 0x43, 0x80, 0xb5, 0x2d, 0x21, 0x3c, 0x00, 0x2c, 0xe2, 0x00, 0x00, 0x05, 0xf0, 0xc0, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x28, 0x07, 0xd0, 0xf1, 0x28, 0x25, 0xd0, 0xf3, 0x28, 0x27, 0xd1, 0x02, 0x20, 0x02, 0xf0, 0xbc, 0xf9, 0x80, 0xbd, 0x00, 0x29, 0x1a, 0xd0, 0x01, 0x29, 0x03, 0xd0, 0xf2, 0x29, 0xf8, 0xd1, 0x88, 0x21, 0x1c, 0xe0, 0x10, 0x48, 0x01, 0x78, 0x00, 0x29, 0x05, 0xd1, 0x40, 0x78, 0x01, 0x28, 0xef, 0xd1, 0x3c, 0x00, 0x68, 0xe2, 0x00, 0x00, 0x00, 0xf0, 0x16, 0xfa, 0x80, 0xbd, 0x0b, 0x48, 0x14, 0x30, 0x00, 0x89, 0xfc, 0xf7, 0x5a, 0xfc, 0x01, 0x1c, 0x01, 0x22, 0x0f, 0x20, 0x05, 0xf0, 0x9f, 0xf9, 0x80, 0xbd, 0x04, 0xf0, 0x52, 0xfa, 0x80, 0xbd, 0x00, 0x20, 0xfa, 0xf7, 0x32, 0xfe, 0x80, 0xbd, 0x02, 0x21, 0x0f, 0x20, 0xf3, 0xf7, 0x05, 0xf8, 0x80, 0xbd, 0x84, 0x66, 0x01, 0x00, 0x01, 0x48, 0x00, 0x78, 0x3c, 0x00, 0xa4, 0xe2, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x74, 0x66, 0x01, 0x00, 0x01, 0x49, 0x00, 0x20, 0x48, 0x60, 0x70, 0x47, 0xec, 0x65, 0x01, 0x00, 0xf8, 0xb5, 0x0e, 0x1c, 0x13, 0x4d, 0x01, 0x1c, 0x14, 0x1c, 0x68, 0x22, 0x28, 0x1c, 0x1f, 0x1c, 0x0c, 0x30, 0xf2, 0xf7, 0x71, 0xf9, 0x0f, 0x49, 0x00, 0x20, 0xac, 0x39, 0x48, 0x60, 0x01, 0x21, 0x29, 0x60, 0x19, 0x21, 0x19, 0x2c, 0x6e, 0x67, 0x3c, 0x00, 0xe0, 0xe2, 0x00, 0x00, 0x00, 0xd3, 0x21, 0x1c, 0x29, 0x81, 0x09, 0x49, 0x14, 0x39, 0x88, 0x73, 0x8f, 0x74, 0xc8, 0x78, 0x01, 0x28, 0x08, 0xd0, 0x01, 0x21, 0x0f, 0x20, 0x05, 0xf0, 0x9c, 0xf9, 0x19, 0x20, 0xfc, 0xf7, 0x15, 0xfc, 0xfb, 0xf7, 0x99, 0xf8, 0x01, 0x20, 0xf8, 0xbd, 0x00, 0x00, 0x98, 0x66, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x28, 0x02, 0xd1, 0x00, 0xf0, 0x2f, 0xf8, 0x80, 0xbd, 0x3c, 0x00, 0x1c, 0xe3, 0x00, 0x00, 0x01, 0x21, 0x1d, 0x20, 0xf2, 0xf7, 0xc0, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x01, 0x20, 0x07, 0x49, 0x00, 0x05, 0x80, 0xb5, 0x88, 0x60, 0x00, 0x22, 0x80, 0x21, 0x16, 0x20, 0x05, 0xf0, 0x4c, 0xf9, 0x04, 0xf0, 0x34, 0xfd, 0x02, 0x49, 0x08, 0x61, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x24, 0x6d, 0x01, 0x00, 0x06, 0x4a, 0x80, 0xb5, 0x3c, 0x00, 0x58, 0xe3, 0x00, 0x00, 0xd1, 0x6a, 0x81, 0x42, 0x07, 0xd1, 0x10, 0x7f, 0x24, 0x23, 0x04, 0x49, 0x58, 0x43, 0x40, 0x18, 0xc0, 0x68, 0xf2, 0xf7, 0x35, 0xf8, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x94, 0x46, 0x01, 0x00, 0x1d, 0x48, 0x1c, 0xb5, 0x00, 0x78, 0x00, 0x28, 0x2d, 0xd0, 0x1c, 0x48, 0x00, 0x68, 0x00, 0x28, 0x29, 0xd0, 0x1a, 0x4a, 0x1a, 0x4b, 0x04, 0x32, 0x11, 0x68, 0x1c, 0x69, 0x3c, 0x00, 0x94, 0xe3, 0x00, 0x00, 0xa1, 0x42, 0x22, 0xd1, 0x51, 0x68, 0x5b, 0x69, 0x99, 0x42, 0x1f, 0xd1, 0x16, 0x49, 0x49, 0x68, 0x93, 0x68, 0xc9, 0x1a, 0x81, 0x42, 0x19, 0xd2, 0xd0, 0x68, 0x14, 0x49, 0x01, 0x30, 0xd0, 0x60, 0x09, 0x68, 0x88, 0x42, 0x0c, 0xd9, 0x06, 0x22, 0xff, 0x21, 0x68, 0x46, 0xf2, 0xf7, 0x2e, 0xf9, 0xf3, 0xf7, 0xac, 0xfc, 0x01, 0x1c, 0x00, 0x23, 0x00, 0x22, 0x68, 0x46, 0x3c, 0x00, 0xd0, 0xe3, 0x00, 0x00, 0x02, 0xf0, 0xce, 0xf9, 0x01, 0x22, 0x1d, 0x20, 0x0a, 0x49, 0x05, 0xf0, 0xf7, 0xf8, 0x1c, 0xbd, 0xf7, 0xf7, 0x88, 0xf9, 0x04, 0x22, 0x81, 0x18, 0x08, 0x1c, 0xfc, 0xf7, 0x27, 0xfb, 0xf6, 0xe7, 0x1c, 0x75, 0x01, 0x00, 0x44, 0x75, 0x01, 0x00, 0x28, 0x61, 0x01, 0x00, 0x90, 0x5c, 0x01, 0x00, 0xf0, 0x59, 0x01, 0x00, 0xa0, 0x86, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x68, 0x3c, 0x00, 0x0c, 0xe4, 0x00, 0x00, 0x00, 0x29, 0x15, 0xd1, 0x00, 0x79, 0x02, 0x28, 0x12, 0xd1, 0x08, 0x1c, 0xf7, 0xf7, 0x80, 0xf8, 0x00, 0x28, 0x0d, 0xd0, 0x03, 0xf0, 0xf2, 0xfc, 0x08, 0x30, 0x41, 0x8f, 0x00, 0x29, 0x07, 0xd1, 0x80, 0x69, 0x00, 0x28, 0x04, 0xd0, 0x80, 0x79, 0x06, 0x28, 0x01, 0xd1, 0xfc, 0xf7, 0x18, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x01, 0x49, 0x00, 0x20, 0x88, 0x62, 0x70, 0x47, 0x3c, 0x00, 0x48, 0xe4, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0xb0, 0xb5, 0x05, 0x4d, 0x04, 0x1c, 0xa9, 0x1d, 0xff, 0xf7, 0x14, 0xf8, 0x06, 0x22, 0x29, 0x1c, 0xa0, 0x18, 0xf2, 0xf7, 0x4b, 0xf8, 0xb0, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x15, 0x1c, 0xff, 0xf7, 0x07, 0xf8, 0x06, 0x22, 0x29, 0x1c, 0xa0, 0x18, 0xf2, 0xf7, 0x3e, 0xf8, 0xb0, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x0a, 0x30, 0x3c, 0x00, 0x84, 0xe4, 0x00, 0x00, 0xf7, 0xf7, 0xbc, 0xf9, 0x01, 0x23, 0x00, 0x28, 0x03, 0xd0, 0x05, 0x48, 0x00, 0x78, 0x01, 0x28, 0x04, 0xd1, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x03, 0xf0, 0xc6, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0xa0, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x23, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x03, 0xf0, 0xbb, 0xfd, 0x80, 0xbd, 0xb0, 0xb5, 0x05, 0x4d, 0xac, 0x79, 0x0a, 0x1c, 0x3c, 0x00, 0xc0, 0xe4, 0x00, 0x00, 0x01, 0x1c, 0x01, 0x23, 0x01, 0x20, 0x03, 0xf0, 0xb1, 0xfd, 0xac, 0x71, 0xb0, 0xbd, 0x00, 0x00, 0x20, 0x10, 0x07, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x0c, 0x1c, 0x88, 0x07, 0x02, 0xd5, 0xf6, 0xf7, 0x47, 0xfa, 0x10, 0xe0, 0x60, 0x07, 0x0e, 0xd5, 0x17, 0x4f, 0xa3, 0x20, 0xc0, 0x5d, 0x15, 0x4d, 0x10, 0x28, 0x00, 0xd3, 0x15, 0x4d, 0x04, 0xf0, 0x59, 0xfc, 0xb9, 0x6f, 0x3c, 0x00, 0xfc, 0xe4, 0x00, 0x00, 0x40, 0x1a, 0x29, 0x1a, 0x01, 0x20, 0xf6, 0xf7, 0xc1, 0xfa, 0xe0, 0x07, 0x11, 0x49, 0xc0, 0x0f, 0x48, 0x60, 0x0c, 0xd0, 0x0d, 0x4c, 0x44, 0x3c, 0x20, 0x78, 0x03, 0x28, 0x0f, 0xd1, 0x00, 0x2e, 0x06, 0xd0, 0xf6, 0xf7, 0xf9, 0xf9, 0x01, 0x1c, 0x01, 0x20, 0xf6, 0xf7, 0xaf, 0xfa, 0xf8, 0xbd, 0x09, 0x49, 0x01, 0x20, 0xf6, 0xf7, 0xaa, 0xfa, 0x01, 0x20, 0x20, 0x70, 0x3c, 0x00, 0x38, 0xe5, 0x00, 0x00, 0xf7, 0xe7, 0x01, 0x21, 0x30, 0x1c, 0xf6, 0xf7, 0x89, 0xfa, 0xf2, 0xe7, 0xa6, 0x0e, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0xc4, 0x09, 0x00, 0x00, 0xb0, 0x57, 0x01, 0x00, 0x40, 0x42, 0x0f, 0x00, 0x80, 0xb5, 0x06, 0x28, 0x04, 0xdb, 0x05, 0x21, 0xff, 0x20, 0xf2, 0xf7, 0x9f, 0xfe, 0x80, 0xbd, 0x03, 0x4a, 0xc0, 0x00, 0x11, 0x50, 0x01, 0x21, 0x80, 0x18, 0x01, 0x71, 0x3c, 0x00, 0x74, 0xe5, 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x9c, 0x5a, 0x01, 0x00, 0x01, 0x48, 0x80, 0x68, 0x70, 0x47, 0x00, 0x00, 0xd0, 0x60, 0x01, 0x00, 0xb0, 0xb5, 0x08, 0x4c, 0x25, 0x1d, 0x28, 0x1c, 0x21, 0x68, 0x00, 0xf0, 0xf1, 0xfe, 0x00, 0x28, 0x03, 0xd1, 0x01, 0x21, 0x04, 0x48, 0xf2, 0xf7, 0xcf, 0xfa, 0x28, 0x1c, 0x21, 0x68, 0x00, 0xf0, 0xfb, 0xfe, 0xb0, 0xbd, 0xc0, 0x60, 0x01, 0x00, 0x3c, 0x00, 0xb0, 0xe5, 0x00, 0x00, 0x2c, 0x10, 0x07, 0x00, 0xb0, 0xb5, 0x10, 0x4d, 0x0c, 0x1c, 0xa8, 0x68, 0x00, 0x28, 0x02, 0xd1, 0x04, 0xf0, 0xf4, 0xfb, 0x28, 0x60, 0x20, 0x1c, 0x04, 0xf0, 0x38, 0xfb, 0x01, 0x21, 0x03, 0x20, 0x03, 0xf0, 0xc4, 0xfe, 0x04, 0xf0, 0xf0, 0xfb, 0xa8, 0x68, 0x00, 0x28, 0x0b, 0xd1, 0x04, 0xf0, 0xe5, 0xfb, 0x29, 0x68, 0x00, 0x1b, 0x40, 0x1a, 0x69, 0x68, 0x40, 0x18, 0x3c, 0x00, 0xec, 0xe5, 0x00, 0x00, 0x41, 0x08, 0x40, 0x18, 0x28, 0x60, 0x01, 0x20, 0xa8, 0x60, 0xb0, 0xbd, 0xd0, 0x60, 0x01, 0x00, 0xf8, 0xb5, 0x1f, 0x4e, 0x00, 0x24, 0xb0, 0x68, 0x00, 0x28, 0x02, 0xd1, 0x04, 0xf0, 0xd0, 0xfb, 0x70, 0x60, 0x05, 0xf0, 0x61, 0xf8, 0x04, 0xf0, 0x8f, 0xfb, 0x05, 0x1c, 0xf9, 0xf7, 0x66, 0xfe, 0x31, 0x68, 0x18, 0x4a, 0x41, 0x18, 0x12, 0x68, 0xe8, 0x0b, 0x00, 0x2a, 0x3c, 0x00, 0x28, 0xe6, 0x00, 0x00, 0x00, 0xd1, 0xa8, 0x0a, 0x40, 0x18, 0x85, 0x42, 0x1f, 0xd9, 0x14, 0x4f, 0x2d, 0x1a, 0x38, 0x1c, 0x20, 0x30, 0x81, 0x79, 0x00, 0xab, 0x19, 0x70, 0xc0, 0x79, 0x58, 0x70, 0x05, 0xf0, 0x6e, 0xf8, 0x00, 0x28, 0x03, 0xd1, 0x02, 0x21, 0x8f, 0x20, 0xf2, 0xf7, 0x28, 0xfe, 0x29, 0x1c, 0x0c, 0x48, 0xf2, 0x68, 0xf8, 0xf7, 0x09, 0xfc, 0x00, 0x28, 0x04, 0xd0, 0x01, 0x1c, 0x3c, 0x00, 0x64, 0xe6, 0x00, 0x00, 0x28, 0x1c, 0xff, 0xf7, 0xa5, 0xff, 0x01, 0x24, 0x00, 0xab, 0x18, 0x88, 0xf8, 0x84, 0x05, 0xf0, 0x47, 0xf8, 0x20, 0x1c, 0xf8, 0xbd, 0x00, 0x00, 0xd0, 0x60, 0x01, 0x00, 0xf4, 0x74, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, 0x89, 0x13, 0x01, 0x00, 0x01, 0x49, 0x01, 0x20, 0xc8, 0x60, 0x70, 0x47, 0xd0, 0x60, 0x01, 0x00, 0x06, 0x48, 0x80, 0xb5, 0x00, 0x68, 0x01, 0x28, 0x3c, 0x00, 0xa0, 0xe6, 0x00, 0x00, 0x07, 0xd1, 0x04, 0x48, 0xac, 0x38, 0x01, 0x69, 0x03, 0x48, 0x00, 0xf0, 0x79, 0xfe, 0xf3, 0xf7, 0x2b, 0xfa, 0x80, 0xbd, 0x98, 0x66, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x80, 0xb5, 0x42, 0x78, 0x81, 0x68, 0x00, 0x79, 0x03, 0xf0, 0xde, 0xff, 0x00, 0x28, 0x01, 0xd1, 0xf5, 0xf7, 0xb6, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x1f, 0xb5, 0x04, 0xf0, 0x69, 0xfb, 0xf6, 0xf7, 0x3c, 0x00, 0xdc, 0xe6, 0x00, 0x00, 0x91, 0xff, 0x16, 0x4c, 0x02, 0x28, 0x03, 0xd1, 0xff, 0xf7, 0xdc, 0xfd, 0x04, 0x28, 0x02, 0xd3, 0x00, 0x20, 0x20, 0x70, 0x1f, 0xbd, 0xfb, 0xf7, 0xf7, 0xfc, 0x00, 0x28, 0xfa, 0xd1, 0x60, 0x6a, 0x00, 0x28, 0xf7, 0xd0, 0x20, 0x78, 0x80, 0x07, 0xf4, 0xd4, 0x09, 0x21, 0x16, 0x20, 0x04, 0xf0, 0x93, 0xff, 0x01, 0x20, 0x20, 0x70, 0x0b, 0x4c, 0x09, 0x49, 0x02, 0x90, 0x3c, 0x00, 0x18, 0xe7, 0x00, 0x00, 0x01, 0x94, 0x00, 0x91, 0x04, 0xf0, 0x46, 0xfb, 0x00, 0x19, 0x03, 0x90, 0x68, 0x46, 0xfd, 0xf7, 0xb5, 0xfb, 0x00, 0x22, 0x16, 0x21, 0x84, 0x20, 0x05, 0xf0, 0x3e, 0xf8, 0xdc, 0xe7, 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, 0x61, 0xed, 0x00, 0x00, 0x40, 0x42, 0x0f, 0x00, 0x23, 0x48, 0x70, 0xb5, 0x80, 0x78, 0x9c, 0xb0, 0x01, 0x28, 0x3e, 0xd1, 0x20, 0x4c, 0x09, 0xa8, 0x3c, 0x00, 0x54, 0xe7, 0x00, 0x00, 0x80, 0x3c, 0x61, 0x1c, 0xfe, 0xf7, 0x92, 0xfe, 0x04, 0x20, 0x11, 0xad, 0x68, 0x72, 0xa0, 0x6f, 0x19, 0xa9, 0x18, 0x90, 0x7c, 0x20, 0x00, 0x5d, 0x01, 0x26, 0x08, 0x71, 0x1d, 0x20, 0x00, 0x5d, 0x00, 0x28, 0x06, 0xd0, 0x10, 0x96, 0x12, 0x96, 0xfc, 0xf7, 0xf6, 0xfa, 0x28, 0x72, 0x20, 0x7a, 0x11, 0x90, 0xf3, 0xf7, 0xcd, 0xff, 0x6a, 0x21, 0x08, 0x53, 0x40, 0x34, 0x3c, 0x00, 0x90, 0xe7, 0x00, 0x00, 0x00, 0x22, 0x01, 0xa9, 0x06, 0xa8, 0xf6, 0xf7, 0xcd, 0xff, 0x21, 0x1c, 0x00, 0x20, 0xfb, 0xf7, 0xcb, 0xfb, 0x06, 0xa9, 0xfb, 0xf7, 0xc8, 0xfb, 0x01, 0xa9, 0xfb, 0xf7, 0xc5, 0xfb, 0x0a, 0x49, 0x09, 0x68, 0x00, 0x29, 0x07, 0xd0, 0x33, 0x1c, 0x0a, 0x22, 0x69, 0x46, 0xfb, 0xf7, 0xda, 0xfb, 0x00, 0x9a, 0x07, 0x21, 0x91, 0x70, 0x0c, 0x90, 0x09, 0xa8, 0xfe, 0xf7, 0x3c, 0x00, 0xcc, 0xe7, 0x00, 0x00, 0x7b, 0xfe, 0x1c, 0xb0, 0x70, 0xbd, 0x00, 0x00, 0x84, 0x66, 0x01, 0x00, 0xe4, 0x62, 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0xff, 0x22, 0x01, 0x68, 0x12, 0x02, 0x0e, 0x1c, 0x08, 0x7b, 0x49, 0x7b, 0x09, 0x02, 0x11, 0x40, 0x08, 0x43, 0x05, 0x1c, 0x31, 0x1c, 0x06, 0x22, 0xa0, 0x18, 0xf1, 0xf7, 0x7c, 0xfe, 0x06, 0x22, 0xb1, 0x18, 0x20, 0x1c, 0xf1, 0xf7, 0x3c, 0x00, 0x08, 0xe8, 0x00, 0x00, 0x77, 0xfe, 0x28, 0x0a, 0x29, 0x02, 0x08, 0x43, 0x00, 0x04, 0x03, 0x21, 0x49, 0x02, 0x00, 0x0c, 0x88, 0x42, 0x08, 0xd2, 0xe0, 0x68, 0x01, 0x89, 0x0e, 0x39, 0x01, 0x81, 0xe0, 0x68, 0x01, 0x68, 0x0e, 0x31, 0x01, 0x60, 0xf8, 0xbd, 0x00, 0x26, 0x20, 0x1c, 0x10, 0x30, 0x03, 0xf0, 0xe8, 0xfa, 0x21, 0x8b, 0x00, 0x29, 0x05, 0xd1, 0xe1, 0x7d, 0x00, 0x29, 0x0b, 0xd0, 0x3c, 0x00, 0x44, 0xe8, 0x00, 0x00, 0x80, 0x69, 0x80, 0x07, 0x08, 0xd4, 0xe0, 0x68, 0x01, 0x26, 0x01, 0x89, 0x02, 0x39, 0x01, 0x81, 0xe0, 0x68, 0x01, 0x68, 0x02, 0x31, 0x06, 0xe0, 0xe0, 0x68, 0x01, 0x89, 0x06, 0x39, 0x01, 0x81, 0xe0, 0x68, 0x01, 0x68, 0x06, 0x31, 0x01, 0x60, 0x14, 0x49, 0x00, 0x20, 0x0b, 0x1f, 0x42, 0x00, 0x9a, 0x5a, 0xaa, 0x42, 0x02, 0xd1, 0x11, 0x49, 0x06, 0x31, 0x02, 0xe0, 0x3c, 0x00, 0x80, 0xe8, 0x00, 0x00, 0x01, 0x30, 0x02, 0x28, 0xf5, 0xd3, 0xe0, 0x68, 0x06, 0x22, 0x00, 0x68, 0xf1, 0xf7, 0x34, 0xfe, 0x01, 0x2e, 0xcb, 0xd1, 0x81, 0x20, 0x00, 0xab, 0x18, 0x80, 0xe1, 0x7d, 0x20, 0x8b, 0x49, 0x03, 0x08, 0x43, 0x31, 0x03, 0x08, 0x43, 0x00, 0x04, 0x00, 0x0c, 0x01, 0x0a, 0x00, 0x02, 0x08, 0x43, 0x58, 0x80, 0xe0, 0x68, 0x19, 0x88, 0x00, 0x68, 0xc1, 0x80, 0x59, 0x88, 0x3c, 0x00, 0xbc, 0xe8, 0x00, 0x00, 0x01, 0x81, 0xb5, 0xe7, 0x6a, 0x46, 0x01, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x01, 0x89, 0x06, 0x22, 0x08, 0x31, 0x01, 0x81, 0x04, 0x68, 0x04, 0x49, 0x08, 0x3c, 0x04, 0x60, 0x20, 0x1c, 0xf1, 0xf7, 0x0d, 0xfe, 0xe5, 0x80, 0xb0, 0xbd, 0x00, 0x00, 0x6a, 0x46, 0x01, 0x00, 0xf8, 0xb5, 0x00, 0x29, 0x01, 0xd0, 0x00, 0x28, 0x01, 0xd1, 0x00, 0x20, 0xf8, 0xbd, 0x09, 0x04, 0x3c, 0x00, 0xf8, 0xe8, 0x00, 0x00, 0x09, 0x0c, 0xf2, 0xf7, 0x43, 0xff, 0x06, 0x1c, 0x05, 0x1c, 0x00, 0x27, 0x20, 0xe0, 0x2c, 0x89, 0x29, 0x68, 0x02, 0x2c, 0x01, 0xd2, 0x02, 0x20, 0x01, 0xe0, 0x48, 0x78, 0x02, 0x30, 0x84, 0x42, 0x02, 0xdd, 0x24, 0x1a, 0x09, 0x18, 0xf4, 0xe7, 0x84, 0x42, 0x10, 0xd0, 0x01, 0x1b, 0x0a, 0x04, 0x01, 0x04, 0x09, 0x0c, 0x12, 0x0c, 0x28, 0x1c, 0xf2, 0xf7, 0x9e, 0xfe, 0x3c, 0x00, 0x34, 0xe9, 0x00, 0x00, 0x00, 0x28, 0x06, 0xd1, 0xe8, 0x68, 0xf2, 0xf7, 0x2d, 0xfe, 0xef, 0x60, 0x28, 0x89, 0x00, 0x1b, 0x28, 0x81, 0xed, 0x68, 0x00, 0x2d, 0xdc, 0xd1, 0x30, 0x1c, 0xd1, 0xe7, 0xf8, 0xb5, 0x85, 0x68, 0x04, 0x1c, 0x80, 0x69, 0x2e, 0x1c, 0x00, 0x28, 0x0d, 0xd0, 0x71, 0x68, 0xf2, 0xf7, 0xf6, 0xfd, 0xa0, 0x69, 0xf2, 0xf7, 0x17, 0xfe, 0x06, 0xe0, 0x00, 0x21, 0xc1, 0x60, 0x3c, 0x00, 0x70, 0xe9, 0x00, 0x00, 0xf1, 0x60, 0xa0, 0x8d, 0x36, 0x68, 0x01, 0x38, 0xa0, 0x85, 0xf0, 0x68, 0x00, 0x28, 0xf5, 0xd1, 0x30, 0x68, 0xa0, 0x60, 0xa0, 0x8d, 0x01, 0x38, 0x00, 0x04, 0x00, 0x0c, 0xa0, 0x85, 0x02, 0xd0, 0x20, 0x1c, 0xf9, 0xf7, 0x39, 0xf8, 0x2a, 0x4f, 0x2a, 0x48, 0x00, 0x68, 0x00, 0x28, 0x03, 0xd0, 0x06, 0x21, 0x68, 0x68, 0xfa, 0xf7, 0x7c, 0xfd, 0x68, 0x68, 0x00, 0x68, 0x3c, 0x00, 0xac, 0xe9, 0x00, 0x00, 0x81, 0x78, 0x00, 0x29, 0x2b, 0xd1, 0xc1, 0x78, 0x00, 0x29, 0x30, 0xd1, 0x21, 0x8e, 0x01, 0x39, 0x21, 0x86, 0xfb, 0xf7, 0x15, 0xf8, 0xa1, 0x6a, 0x08, 0x1a, 0xa0, 0x62, 0xe1, 0x69, 0x88, 0x42, 0x03, 0xd9, 0x04, 0x21, 0x02, 0x20, 0xf2, 0xf7, 0x67, 0xfc, 0xb8, 0x68, 0x00, 0x28, 0x1e, 0xd0, 0x1a, 0x49, 0x20, 0x8e, 0x49, 0x68, 0x0c, 0x22, 0x52, 0x1a, 0x90, 0x42, 0x3c, 0x00, 0xe8, 0xe9, 0x00, 0x00, 0x08, 0xd3, 0x19, 0x23, 0x9b, 0x01, 0xaf, 0x22, 0x92, 0x01, 0x59, 0x43, 0xa0, 0x6a, 0x51, 0x1a, 0x88, 0x42, 0x0e, 0xd2, 0x00, 0x21, 0x0c, 0x20, 0x03, 0xf0, 0xac, 0xfc, 0x00, 0x20, 0xb8, 0x60, 0x07, 0xe0, 0x01, 0x29, 0x05, 0xd1, 0xc0, 0x78, 0x17, 0x28, 0x02, 0xd1, 0xa0, 0x8e, 0x01, 0x38, 0xa0, 0x86, 0x2a, 0x1d, 0x06, 0xca, 0xe0, 0x68, 0x63, 0x69, 0xf1, 0xf7, 0x3c, 0x00, 0x24, 0xea, 0x00, 0x00, 0xdc, 0xfc, 0xb5, 0x42, 0x01, 0xd0, 0x2d, 0x68, 0xb4, 0xe7, 0xa0, 0x8d, 0x00, 0x28, 0x03, 0xd1, 0x05, 0x48, 0xb9, 0x69, 0x00, 0xf0, 0x9e, 0xfc, 0xf8, 0xbd, 0x00, 0x00, 0xfc, 0x5a, 0x01, 0x00, 0xcc, 0x5c, 0x01, 0x00, 0x18, 0x57, 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, 0x89, 0x07, 0x07, 0x4b, 0xca, 0x0f, 0x80, 0xb5, 0x19, 0x7c, 0x00, 0x29, 0x06, 0xd0, 0x81, 0x43, 0x3c, 0x00, 0x60, 0xea, 0x00, 0x00, 0x19, 0x74, 0x03, 0xd1, 0x07, 0x21, 0x15, 0x20, 0x04, 0xf0, 0xa2, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x1c, 0x01, 0x20, 0xff, 0xf7, 0xe9, 0xff, 0x80, 0xbd, 0x80, 0xb5, 0x01, 0x1c, 0x02, 0x20, 0xff, 0xf7, 0xe3, 0xff, 0x80, 0xbd, 0xb0, 0xb5, 0x1b, 0x4c, 0x60, 0x68, 0xfc, 0xf7, 0x2f, 0xff, 0x20, 0x68, 0x00, 0x25, 0x40, 0x68, 0x3c, 0x00, 0x9c, 0xea, 0x00, 0x00, 0x00, 0x28, 0x03, 0xd0, 0xfd, 0xf7, 0x18, 0xfc, 0x20, 0x68, 0x45, 0x60, 0x60, 0x68, 0xfc, 0xf7, 0xc5, 0xfe, 0x14, 0x48, 0x61, 0x68, 0x00, 0xf0, 0x61, 0xfc, 0xa0, 0x7a, 0x01, 0x28, 0x05, 0xd0, 0x02, 0x28, 0x03, 0xd0, 0x20, 0x68, 0x00, 0x68, 0x00, 0xf0, 0xde, 0xf8, 0x01, 0x21, 0x1f, 0x20, 0x04, 0xf0, 0xb2, 0xfd, 0x00, 0x21, 0x1f, 0x20, 0x04, 0xf0, 0xae, 0xfd, 0x3c, 0x00, 0xd8, 0xea, 0x00, 0x00, 0x02, 0x21, 0x1f, 0x20, 0x04, 0xf0, 0xaa, 0xfd, 0xa5, 0x72, 0x21, 0x68, 0x2c, 0x20, 0x40, 0x5c, 0x89, 0x68, 0xf1, 0xf7, 0x76, 0xfc, 0x60, 0x68, 0xfc, 0xf7, 0xe4, 0xfe, 0x20, 0x68, 0x05, 0x62, 0xb0, 0xbd, 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x04, 0x49, 0x0a, 0x68, 0xc8, 0x68, 0x92, 0x6a, 0x00, 0x2a, 0x01, 0xd0, 0x09, 0x69, 0x08, 0x18, 0x3c, 0x00, 0x14, 0xeb, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, 0xb0, 0xb5, 0x13, 0x4c, 0x05, 0x1c, 0xa0, 0x7a, 0x01, 0x38, 0x02, 0x28, 0x19, 0xd8, 0x01, 0x21, 0x1f, 0x20, 0x04, 0xf0, 0x81, 0xfd, 0x20, 0x68, 0xfc, 0x23, 0x01, 0x1c, 0x20, 0x30, 0x02, 0x7b, 0x1a, 0x40, 0x02, 0x73, 0x00, 0x2d, 0x0f, 0xd0, 0x01, 0x23, 0x1a, 0x43, 0x02, 0x73, 0xa0, 0x7a, 0x03, 0x28, 0x07, 0xd1, 0x3c, 0x00, 0x50, 0xeb, 0x00, 0x00, 0x01, 0x20, 0x01, 0xf0, 0xe7, 0xfd, 0x00, 0x28, 0x01, 0xd1, 0xff, 0xf7, 0x97, 0xff, 0xb0, 0xbd, 0x4b, 0x62, 0xb0, 0xbd, 0x02, 0x21, 0x11, 0x43, 0x01, 0x73, 0xf6, 0xe7, 0x14, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x0a, 0x30, 0xf6, 0xf7, 0x43, 0xfe, 0x00, 0x28, 0x0c, 0xd0, 0x22, 0x88, 0x0a, 0x49, 0x0b, 0x7a, 0x90, 0x04, 0xc0, 0x0f, 0x00, 0x2b, 0x06, 0xd1, 0x3c, 0x00, 0x8c, 0xeb, 0x00, 0x00, 0x12, 0x06, 0x92, 0x0e, 0x20, 0x2a, 0x00, 0xd1, 0x01, 0x20, 0xc8, 0x60, 0x10, 0xbd, 0x00, 0x28, 0xfc, 0xd1, 0x00, 0x22, 0x24, 0x21, 0x80, 0x20, 0x04, 0xf0, 0x04, 0xfe, 0x10, 0xbd, 0x00, 0x00, 0x04, 0x7a, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x1c, 0x1f, 0x21, 0x80, 0x20, 0x04, 0xf0, 0xfa, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x1d, 0x4e, 0x04, 0x1c, 0x30, 0x68, 0x3c, 0x00, 0xc8, 0xeb, 0x00, 0x00, 0x1d, 0x1c, 0x47, 0x68, 0x20, 0x1c, 0xf1, 0xf7, 0x0a, 0xfc, 0xfb, 0xf7, 0x87, 0xfa, 0x00, 0x28, 0x04, 0xd0, 0x28, 0x1c, 0xf2, 0xf7, 0x2a, 0xfb, 0x00, 0x28, 0x28, 0xd1, 0x20, 0x88, 0x40, 0x05, 0x25, 0xd4, 0x30, 0x68, 0x00, 0x68, 0xfe, 0xf7, 0x59, 0xf9, 0x00, 0x28, 0x03, 0xd1, 0xfd, 0xf7, 0x89, 0xfa, 0xf1, 0xf7, 0xed, 0xfb, 0x30, 0x68, 0x00, 0x25, 0x40, 0x68, 0x3c, 0x00, 0x04, 0xec, 0x00, 0x00, 0x00, 0x28, 0x03, 0xd0, 0xfd, 0xf7, 0x64, 0xfb, 0x30, 0x68, 0x45, 0x60, 0x20, 0x88, 0x00, 0x09, 0x00, 0x07, 0x03, 0xd1, 0x04, 0xf0, 0xc8, 0xf8, 0x61, 0x88, 0x45, 0x18, 0x30, 0x68, 0x45, 0x61, 0x81, 0x6a, 0x01, 0x31, 0x81, 0x62, 0x20, 0x88, 0x80, 0x04, 0xc1, 0x0f, 0x02, 0x48, 0xf8, 0xf7, 0xcd, 0xff, 0xf8, 0xbd, 0x14, 0x7a, 0x01, 0x00, 0xb1, 0xeb, 0x00, 0x00, 0x3c, 0x00, 0x40, 0xec, 0x00, 0x00, 0xb0, 0xb5, 0x0e, 0x4c, 0x05, 0x1c, 0x60, 0x68, 0xfc, 0xf7, 0xf6, 0xfd, 0x0c, 0x48, 0x61, 0x68, 0x00, 0xf0, 0x92, 0xfb, 0x00, 0x21, 0x24, 0x20, 0x04, 0xf0, 0xec, 0xfc, 0x00, 0x22, 0xd2, 0x43, 0x80, 0x21, 0x24, 0x20, 0x04, 0xf0, 0xb8, 0xfc, 0x00, 0x20, 0xe0, 0x60, 0x20, 0x72, 0x20, 0x68, 0x01, 0x68, 0x28, 0x06, 0x00, 0x0e, 0xf1, 0xf7, 0xb0, 0xfb, 0xb0, 0xbd, 0x3c, 0x00, 0x7c, 0xec, 0x00, 0x00, 0x04, 0x7a, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0xf2, 0xf7, 0x85, 0xfc, 0x20, 0x1c, 0xf2, 0xf7, 0xb0, 0xfd, 0x10, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x1c, 0x4e, 0x05, 0x1c, 0xb0, 0x7a, 0x2c, 0x1c, 0x40, 0x34, 0x02, 0x28, 0x26, 0xd1, 0xa0, 0x8b, 0x31, 0x89, 0x88, 0x42, 0x22, 0xd1, 0x30, 0x68, 0x41, 0x6a, 0x00, 0x29, 0x08, 0xd0, 0x3c, 0x00, 0xb8, 0xec, 0x00, 0x00, 0x20, 0x30, 0x00, 0x7b, 0xc0, 0x07, 0x04, 0xd5, 0x01, 0x20, 0x01, 0xf0, 0x2f, 0xfd, 0x00, 0x28, 0x18, 0xd1, 0x60, 0x78, 0x00, 0x28, 0x09, 0xd1, 0x30, 0x68, 0x02, 0x23, 0x20, 0x30, 0x02, 0x7b, 0x0d, 0x49, 0x52, 0x08, 0x52, 0x00, 0x1a, 0x43, 0x02, 0x73, 0x01, 0xe0, 0xff, 0x21, 0xf5, 0x31, 0x01, 0x22, 0x1f, 0x20, 0x04, 0xf0, 0x6e, 0xfc, 0x03, 0x20, 0xb0, 0x72, 0x3c, 0x00, 0xf4, 0xec, 0x00, 0x00, 0x02, 0xe0, 0x28, 0x1c, 0xff, 0xf7, 0xc4, 0xff, 0x60, 0x78, 0x00, 0x28, 0x03, 0xd1, 0x29, 0x1c, 0x01, 0x20, 0x03, 0xf0, 0x29, 0xfb, 0x70, 0xbd, 0x14, 0x7a, 0x01, 0x00, 0x50, 0xc3, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x60, 0x34, 0xe0, 0x79, 0x0e, 0x4d, 0x00, 0x28, 0x0a, 0xd1, 0x02, 0x20, 0xa8, 0x72, 0x28, 0x68, 0x40, 0x68, 0x00, 0x28, 0x04, 0xd1, 0x0b, 0x48, 0x3c, 0x00, 0x30, 0xed, 0x00, 0x00, 0xfd, 0xf7, 0xd0, 0xfa, 0x29, 0x68, 0x48, 0x60, 0x04, 0xf0, 0x38, 0xf8, 0x29, 0x68, 0xc8, 0x61, 0xff, 0xf7, 0xe0, 0xfe, 0x29, 0x68, 0x09, 0x69, 0x08, 0x1a, 0x03, 0xf0, 0x6f, 0xff, 0x00, 0x28, 0x01, 0xd0, 0xe0, 0x79, 0xa0, 0x71, 0xb0, 0xbd, 0x14, 0x7a, 0x01, 0x00, 0xc1, 0xeb, 0x00, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0x00, 0x26, 0x04, 0xf0, 0x21, 0xf8, 0x05, 0x1c, 0x3c, 0x00, 0x6c, 0xed, 0x00, 0x00, 0x22, 0x48, 0x00, 0x27, 0x07, 0x70, 0xa1, 0x07, 0x04, 0xd0, 0xe1, 0x07, 0xc9, 0x0f, 0x01, 0x62, 0xc5, 0x61, 0x01, 0x26, 0x41, 0x6b, 0x00, 0x29, 0x34, 0xd1, 0x00, 0x2e, 0x32, 0xd0, 0x06, 0x1c, 0xf9, 0xf7, 0x44, 0xff, 0x31, 0x6b, 0x1a, 0x4b, 0x41, 0x1a, 0xa2, 0x07, 0x12, 0xd5, 0xda, 0x68, 0x00, 0x2a, 0x08, 0xdd, 0x91, 0x42, 0x1a, 0x68, 0x02, 0xda, 0x14, 0x09, 0x3c, 0x00, 0xa8, 0xed, 0x00, 0x00, 0xa2, 0x18, 0x06, 0xe0, 0x14, 0x09, 0x12, 0x1b, 0x03, 0xe0, 0x0a, 0x43, 0x02, 0xd1, 0x1a, 0x68, 0x52, 0x00, 0x1a, 0x60, 0xb7, 0x63, 0x0a, 0xe0, 0xb2, 0x6b, 0x01, 0x32, 0xb2, 0x63, 0x02, 0x2a, 0x1a, 0x68, 0x01, 0xdd, 0x94, 0x08, 0x00, 0xe0, 0x14, 0x09, 0x12, 0x1b, 0x1a, 0x60, 0xd9, 0x60, 0x30, 0x63, 0xf5, 0x62, 0x18, 0x68, 0x08, 0x49, 0x88, 0x42, 0x01, 0xd9, 0x3c, 0x00, 0xe4, 0xed, 0x00, 0x00, 0x19, 0x60, 0x03, 0xe0, 0x64, 0x28, 0x01, 0xd2, 0x64, 0x20, 0x18, 0x60, 0xf5, 0xf7, 0xfc, 0xfd, 0xf8, 0xbd, 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, 0xb0, 0x57, 0x01, 0x00, 0x20, 0xa1, 0x07, 0x00, 0xfe, 0xb5, 0x04, 0x1c, 0x00, 0x20, 0x50, 0x4d, 0x00, 0x21, 0x68, 0x61, 0x20, 0x69, 0xfb, 0xf7, 0xb3, 0xfc, 0x07, 0x1c, 0x20, 0x69, 0x03, 0x21, 0xfb, 0xf7, 0xae, 0xfc, 0x3c, 0x00, 0x20, 0xee, 0x00, 0x00, 0x00, 0x28, 0x03, 0xd0, 0x80, 0x78, 0x29, 0x78, 0x88, 0x42, 0x63, 0xd1, 0x47, 0x4d, 0x20, 0x1c, 0x14, 0x30, 0x39, 0x1c, 0x06, 0x1c, 0x2a, 0x78, 0x02, 0xf0, 0x5a, 0xfa, 0x00, 0x28, 0x59, 0xd1, 0xe0, 0x68, 0x05, 0x68, 0x41, 0x48, 0x01, 0x95, 0x58, 0x30, 0x02, 0x90, 0xfb, 0xf7, 0x6a, 0xff, 0x3e, 0x4d, 0x19, 0x35, 0x00, 0x28, 0x0b, 0xd0, 0x28, 0x1c, 0xfb, 0xf7, 0x3c, 0x00, 0x5c, 0xee, 0x00, 0x00, 0x55, 0xff, 0x00, 0x28, 0x1e, 0xd1, 0x31, 0x1c, 0x28, 0x1c, 0xfb, 0xf7, 0x65, 0xff, 0x00, 0x28, 0x42, 0xd0, 0x17, 0xe0, 0x28, 0x1c, 0xfb, 0xf7, 0x49, 0xff, 0x00, 0x28, 0x06, 0xd0, 0x39, 0x1c, 0x02, 0x98, 0xfb, 0xf7, 0x63, 0xff, 0x00, 0x28, 0x36, 0xd0, 0x0b, 0xe0, 0x39, 0x1c, 0x02, 0x98, 0xfb, 0xf7, 0x5c, 0xff, 0x00, 0x28, 0x2f, 0xd0, 0x31, 0x1c, 0x28, 0x1c, 0x3c, 0x00, 0x98, 0xee, 0x00, 0x00, 0xfb, 0xf7, 0x4c, 0xff, 0x00, 0x28, 0x29, 0xd0, 0x30, 0x1c, 0xf6, 0xf7, 0xad, 0xfc, 0x29, 0x4a, 0x18, 0x32, 0x11, 0x7c, 0x00, 0x29, 0x04, 0xd0, 0x51, 0x6a, 0x00, 0x29, 0x01, 0xd0, 0x00, 0x28, 0x1c, 0xd1, 0x90, 0x6a, 0x00, 0x28, 0x3b, 0xd0, 0x13, 0x78, 0x01, 0x9d, 0x01, 0x21, 0x6d, 0x89, 0x01, 0x20, 0x2b, 0x40, 0x9b, 0x07, 0x11, 0xd0, 0xa3, 0x6b, 0x1e, 0x4e, 0x3c, 0x00, 0xd4, 0xee, 0x00, 0x00, 0x1d, 0x1c, 0x7f, 0x35, 0x98, 0x36, 0x00, 0x2d, 0x14, 0xd0, 0x55, 0x8a, 0x00, 0x2d, 0x08, 0xd1, 0x55, 0x69, 0xab, 0x42, 0x0f, 0xda, 0x00, 0x20, 0x17, 0x4d, 0x01, 0x23, 0x6b, 0x61, 0x0a, 0xe0, 0x29, 0xe0, 0xf5, 0x78, 0x02, 0x2d, 0x06, 0xd1, 0x14, 0x4f, 0x55, 0x69, 0x3f, 0x68, 0xed, 0x19, 0xab, 0x42, 0x00, 0xda, 0x00, 0x20, 0x23, 0x6c, 0x1d, 0x1c, 0x7f, 0x35, 0x3c, 0x00, 0x10, 0xef, 0x00, 0x00, 0x10, 0xd0, 0x55, 0x8a, 0x00, 0x2d, 0x03, 0xd1, 0x95, 0x69, 0xab, 0x42, 0x0a, 0xd2, 0x08, 0xe0, 0xf5, 0x78, 0x02, 0x2d, 0x06, 0xd1, 0x0b, 0x4e, 0x95, 0x69, 0x36, 0x68, 0xad, 0x19, 0xab, 0x42, 0x00, 0xd2, 0x00, 0x21, 0x08, 0x43, 0x08, 0xd0, 0x10, 0x6a, 0x00, 0x28, 0x01, 0xd0, 0xf1, 0xf7, 0x4b, 0xfa, 0x00, 0x21, 0x20, 0x1c, 0x01, 0xf0, 0xb9, 0xf9, 0xfe, 0xbd, 0x3c, 0x00, 0x4c, 0xef, 0x00, 0x00, 0xec, 0x65, 0x01, 0x00, 0xc4, 0x67, 0x01, 0x00, 0xcc, 0x67, 0x01, 0x00, 0x3e, 0xb5, 0x05, 0x6a, 0x04, 0x1c, 0xc0, 0x68, 0xf2, 0xf7, 0x34, 0xfb, 0xe1, 0x69, 0xf2, 0xf7, 0x57, 0xfa, 0x20, 0x1c, 0x40, 0x30, 0xc1, 0x8b, 0x04, 0x31, 0xc1, 0x83, 0x2b, 0x69, 0x10, 0x49, 0x98, 0x79, 0x06, 0x28, 0x0a, 0xd1, 0x98, 0x88, 0x01, 0x91, 0x02, 0x94, 0x00, 0x90, 0x60, 0x69, 0x3c, 0x00, 0x88, 0xef, 0x00, 0x00, 0x1b, 0x68, 0x01, 0x68, 0xe0, 0x68, 0x03, 0x22, 0xc0, 0x68, 0x0a, 0xe0, 0x02, 0x28, 0x0b, 0xd1, 0x10, 0x20, 0x00, 0x90, 0x01, 0x91, 0x02, 0x94, 0xe0, 0x68, 0xa3, 0x69, 0xc0, 0x68, 0x00, 0x22, 0x00, 0x21, 0xf7, 0xf7, 0x0f, 0xfb, 0x3e, 0xbd, 0xf2, 0xf7, 0xa6, 0xf9, 0xfb, 0xe7, 0x00, 0x00, 0xbd, 0xef, 0x00, 0x00, 0x80, 0xb5, 0xd1, 0x68, 0x50, 0x69, 0xc9, 0x68, 0x3c, 0x00, 0xc4, 0xef, 0x00, 0x00, 0xc1, 0x60, 0xd1, 0x68, 0xc8, 0x60, 0x11, 0x1c, 0x40, 0x31, 0xcb, 0x8b, 0x00, 0x89, 0x18, 0x18, 0xc8, 0x83, 0x10, 0x68, 0x00, 0x28, 0x02, 0xd0, 0xff, 0xf7, 0xbc, 0xff, 0x80, 0xbd, 0x03, 0x48, 0xfb, 0xf7, 0xcc, 0xf8, 0x00, 0x6a, 0xfe, 0xf7, 0xf5, 0xf9, 0x80, 0xbd, 0xa0, 0x6a, 0x01, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x0a, 0x24, 0x30, 0x07, 0x01, 0x09, 0xa0, 0x07, 0x3c, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x43, 0x0f, 0x1c, 0x0a, 0x4d, 0x2f, 0x60, 0x04, 0xf0, 0xfa, 0xfe, 0xad, 0x68, 0x28, 0x01, 0x00, 0x0f, 0xb0, 0x42, 0x05, 0xd0, 0x01, 0x3c, 0xf4, 0xd2, 0x01, 0x21, 0x9b, 0x20, 0xf2, 0xf7, 0x41, 0xf9, 0x28, 0x02, 0x00, 0x0a, 0x08, 0x2e, 0x01, 0xd1, 0x31, 0x05, 0x08, 0x43, 0xf8, 0xbd, 0x60, 0x00, 0x07, 0x00, 0x01, 0x22, 0xd2, 0x05, 0x80, 0xb5, 0x00, 0x21, 0x3c, 0x00, 0x3c, 0xf0, 0x00, 0x00, 0x04, 0x20, 0x04, 0xf0, 0xdd, 0xfc, 0x0f, 0x20, 0xff, 0xf7, 0xd6, 0xff, 0x0f, 0x21, 0x09, 0x04, 0x08, 0x40, 0x00, 0x0c, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x05, 0x48, 0xfd, 0xf7, 0x4a, 0xf9, 0x04, 0x48, 0xfd, 0xf7, 0x7b, 0xf8, 0x04, 0x48, 0xfd, 0xf7, 0x6c, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x89, 0x34, 0x01, 0x00, 0xed, 0x24, 0x00, 0x00, 0x11, 0x1c, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xf0, 0x00, 0x00, 0x80, 0xb5, 0x02, 0x48, 0xf3, 0xf7, 0x2a, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0xd1, 0x24, 0x00, 0x00, 0x80, 0xb5, 0xf2, 0xf7, 0x53, 0xf9, 0x80, 0xbd, 0x80, 0xb5, 0x00, 0x21, 0x00, 0x20, 0x01, 0xf0, 0x51, 0xfe, 0x03, 0x20, 0x02, 0xf0, 0x46, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x06, 0x48, 0x80, 0xb5, 0xc1, 0x69, 0x00, 0x29, 0x06, 0xd1, 0x01, 0x6a, 0x00, 0x29, 0x03, 0xd1, 0x3c, 0x00, 0xb4, 0xf0, 0x00, 0x00, 0x81, 0x6b, 0x03, 0x48, 0x00, 0xf0, 0x5e, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x4c, 0x20, 0x6a, 0xfc, 0xf7, 0xb3, 0xfb, 0x03, 0x48, 0x21, 0x6a, 0x00, 0xf0, 0x4f, 0xf9, 0x10, 0xbd, 0x1c, 0x75, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0xb0, 0xb5, 0x0d, 0x4c, 0x20, 0x7c, 0x00, 0x28, 0x02, 0xd0, 0x01, 0x21, 0x3c, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xfd, 0xf7, 0x86, 0xf9, 0x00, 0x25, 0x25, 0x70, 0xa0, 0x68, 0x01, 0x28, 0x03, 0xd1, 0x00, 0x20, 0xa5, 0x60, 0x01, 0xf0, 0x8f, 0xf8, 0xa0, 0x78, 0x01, 0x28, 0x05, 0xd1, 0x03, 0x48, 0x98, 0x38, 0x00, 0x69, 0xfc, 0xf7, 0xef, 0xfb, 0xa5, 0x70, 0xb0, 0xbd, 0x00, 0x00, 0x84, 0x66, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x21, 0x01, 0x20, 0x01, 0xf0, 0x09, 0xfe, 0x80, 0xbd, 0x3c, 0x00, 0x2c, 0xf1, 0x00, 0x00, 0x38, 0xb5, 0x69, 0x46, 0x00, 0x25, 0xf8, 0xf7, 0xb7, 0xfe, 0x04, 0x1c, 0x01, 0xd1, 0x01, 0x20, 0x38, 0xbd, 0xa0, 0x68, 0x00, 0x28, 0x04, 0xd0, 0x00, 0x99, 0xa1, 0x31, 0x08, 0x20, 0x04, 0xf0, 0x73, 0xfa, 0x1c, 0x21, 0x20, 0x1c, 0xf1, 0xf7, 0xa3, 0xf9, 0x28, 0x1c, 0xf0, 0xe7, 0x00, 0x00, 0xfe, 0xb5, 0x07, 0x1c, 0x4c, 0x23, 0x39, 0x49, 0x58, 0x43, 0x44, 0x18, 0x3c, 0x00, 0x68, 0xf1, 0x00, 0x00, 0x25, 0x1c, 0x40, 0x35, 0x28, 0x7a, 0x37, 0x49, 0x48, 0x76, 0x21, 0x1c, 0x30, 0x31, 0x02, 0x91, 0x0c, 0x23, 0xc8, 0x56, 0x42, 0x1c, 0x0a, 0x73, 0x49, 0x7b, 0x88, 0x42, 0x46, 0xda, 0x32, 0x48, 0x00, 0x78, 0x80, 0x07, 0x3e, 0xd5, 0x00, 0x20, 0x01, 0x90, 0xf6, 0xf7, 0xaf, 0xfa, 0x00, 0x28, 0x2e, 0xd0, 0xac, 0x21, 0x09, 0x58, 0x00, 0x29, 0x01, 0xd0, 0xe4, 0x30, 0x3c, 0x00, 0xa4, 0xf1, 0x00, 0x00, 0x00, 0xe0, 0xcc, 0x30, 0x06, 0x1c, 0x40, 0x68, 0x00, 0x28, 0x25, 0xd0, 0x02, 0x99, 0x08, 0x7b, 0x01, 0x28, 0x11, 0xd1, 0x20, 0x1c, 0x2e, 0x30, 0x29, 0x78, 0xf6, 0xf7, 0xed, 0xf9, 0x71, 0x68, 0x03, 0xe0, 0x72, 0x18, 0x12, 0x7a, 0x82, 0x42, 0x03, 0xd9, 0xff, 0x31, 0x09, 0x06, 0x09, 0x0e, 0xf7, 0xd1, 0xa9, 0x70, 0x01, 0x20, 0x01, 0x90, 0x23, 0x1c, 0x3e, 0x33, 0x3c, 0x00, 0xe0, 0xf1, 0x00, 0x00, 0x1a, 0x1d, 0x30, 0x1c, 0x00, 0x97, 0x01, 0x99, 0xf8, 0xf7, 0x58, 0xfa, 0x00, 0x28, 0x11, 0xd0, 0xa8, 0x78, 0x80, 0x19, 0x00, 0x7a, 0x00, 0xe0, 0x00, 0x20, 0x68, 0x70, 0x68, 0x78, 0x01, 0x21, 0xfb, 0xf7, 0xe0, 0xfd, 0x60, 0x60, 0x38, 0x1c, 0x01, 0xf0, 0x14, 0xfe, 0x38, 0x1c, 0x01, 0xf0, 0xa5, 0xfb, 0xfe, 0xbd, 0x02, 0x99, 0x08, 0x7b, 0xff, 0x30, 0x48, 0x73, 0x3c, 0x00, 0x1c, 0xf2, 0x00, 0x00, 0x38, 0x1c, 0xfc, 0xf7, 0x19, 0xfc, 0x03, 0xf0, 0xc3, 0xfd, 0x06, 0x1c, 0xfb, 0xf7, 0x8e, 0xfe, 0x41, 0x00, 0x76, 0x18, 0x68, 0x78, 0x61, 0x68, 0xfb, 0xf7, 0x6a, 0xfe, 0x31, 0x18, 0x20, 0x8d, 0x3b, 0x1c, 0x05, 0x4a, 0x03, 0xf0, 0x12, 0xfe, 0xe5, 0xe7, 0x00, 0x00, 0x58, 0xe3, 0x01, 0x00, 0x30, 0x80, 0x07, 0x00, 0x1d, 0x75, 0x01, 0x00, 0xd5, 0x4e, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xf2, 0x00, 0x00, 0x03, 0x1c, 0x04, 0x48, 0x80, 0xb5, 0x02, 0x79, 0x20, 0x30, 0x03, 0x49, 0x00, 0xf0, 0x30, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0xac, 0x7c, 0x01, 0x00, 0xc4, 0x67, 0x01, 0x00, 0x03, 0x1c, 0x04, 0x48, 0x80, 0xb5, 0xc2, 0x78, 0x38, 0x30, 0x03, 0x49, 0x00, 0xf0, 0x22, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0xac, 0x7c, 0x01, 0x00, 0xc8, 0x67, 0x01, 0x00, 0x03, 0x1c, 0x04, 0x48, 0x3c, 0x00, 0x94, 0xf2, 0x00, 0x00, 0x80, 0xb5, 0x82, 0x79, 0x50, 0x30, 0x03, 0x49, 0x00, 0xf0, 0x14, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0xac, 0x7c, 0x01, 0x00, 0xcc, 0x67, 0x01, 0x00, 0x03, 0x1c, 0x04, 0x48, 0x80, 0xb5, 0x42, 0x79, 0x68, 0x30, 0x03, 0x49, 0x00, 0xf0, 0x06, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0xac, 0x7c, 0x01, 0x00, 0xd0, 0x67, 0x01, 0x00, 0x10, 0xb5, 0x00, 0x24, 0x84, 0x80, 0x0b, 0x60, 0x3c, 0x00, 0xd0, 0xf2, 0x00, 0x00, 0x19, 0x1c, 0x51, 0x43, 0x01, 0x60, 0x19, 0x06, 0x09, 0x16, 0x10, 0x22, 0x06, 0x30, 0xf1, 0xf7, 0x9f, 0xf9, 0x10, 0xbd, 0xb0, 0xb5, 0x06, 0x4d, 0x00, 0x24, 0xac, 0x60, 0xec, 0x60, 0xec, 0x61, 0x2c, 0x62, 0x02, 0xf0, 0xf1, 0xfc, 0x00, 0xf0, 0x0d, 0xf8, 0xec, 0x62, 0x2c, 0x70, 0xb0, 0xbd, 0x44, 0x7d, 0x01, 0x00, 0x80, 0xb5, 0x80, 0x21, 0x01, 0x48, 0xf1, 0xf7, 0x3c, 0x00, 0x0c, 0xf3, 0x00, 0x00, 0xc7, 0xf8, 0x80, 0xbd, 0x04, 0x66, 0x01, 0x00, 0xf8, 0xb5, 0x07, 0x4f, 0x00, 0x24, 0x00, 0x26, 0x18, 0x20, 0x60, 0x43, 0xc5, 0x19, 0xee, 0x60, 0x03, 0xf0, 0x42, 0xfd, 0x10, 0x35, 0x01, 0x34, 0x02, 0x2c, 0x41, 0xc5, 0xf4, 0xdb, 0xf8, 0xbd, 0xb8, 0x7d, 0x01, 0x00, 0x00, 0x23, 0x03, 0x60, 0x04, 0x4b, 0x00, 0x29, 0x00, 0xd1, 0x19, 0x1c, 0x41, 0x60, 0x00, 0x2a, 0x3c, 0x00, 0x48, 0xf3, 0x00, 0x00, 0x00, 0xd1, 0x1a, 0x1c, 0x82, 0x60, 0x70, 0x47, 0xbd, 0x75, 0x00, 0x00, 0x10, 0xb5, 0x07, 0x4c, 0x20, 0x68, 0x01, 0x30, 0x20, 0x60, 0x20, 0x28, 0x03, 0xd9, 0x58, 0x21, 0x58, 0x20, 0xf1, 0xf7, 0x9d, 0xff, 0x21, 0x68, 0x01, 0x20, 0x01, 0x39, 0x88, 0x40, 0x10, 0xbd, 0x60, 0x5b, 0x01, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x21, 0x68, 0x00, 0x20, 0x00, 0x29, 0x3c, 0x00, 0x84, 0xf3, 0x00, 0x00, 0x0a, 0xd0, 0xa9, 0x43, 0x21, 0x60, 0x07, 0xd1, 0xa0, 0x68, 0xf1, 0xf7, 0x23, 0xf8, 0x00, 0x28, 0x02, 0xd1, 0x21, 0x68, 0x29, 0x43, 0x21, 0x60, 0xb0, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x21, 0x68, 0x00, 0x20, 0x29, 0x43, 0x21, 0x60, 0xa9, 0x42, 0x07, 0xd1, 0x60, 0x68, 0xf1, 0xf7, 0x10, 0xf8, 0x00, 0x28, 0x02, 0xd1, 0x21, 0x68, 0xa9, 0x43, 0x3c, 0x00, 0xc0, 0xf3, 0x00, 0x00, 0x21, 0x60, 0xb0, 0xbd, 0x1a, 0x4b, 0xb0, 0xb5, 0x9a, 0x6a, 0x00, 0x28, 0x0b, 0xd0, 0x00, 0x2a, 0x07, 0xdb, 0xb8, 0x24, 0x24, 0x58, 0x01, 0x3c, 0xa4, 0x1a, 0x00, 0x19, 0xb0, 0x30, 0x00, 0x7b, 0x02, 0xe0, 0x0e, 0x20, 0x00, 0xe0, 0x0d, 0x20, 0x5d, 0x6a, 0x12, 0x4c, 0x00, 0x2d, 0x01, 0xd0, 0x20, 0x78, 0x00, 0xe0, 0x20, 0x5c, 0xff, 0x24, 0xa8, 0x34, 0xc4, 0x40, 0x3c, 0x00, 0xfc, 0xf3, 0x00, 0x00, 0x9c, 0x60, 0xf5, 0x24, 0xc4, 0x40, 0x9c, 0x61, 0xfd, 0x24, 0xc4, 0x40, 0xdc, 0x61, 0xff, 0x24, 0x29, 0x34, 0xc4, 0x40, 0x5c, 0x61, 0xff, 0x24, 0x53, 0x34, 0xc4, 0x40, 0x00, 0x20, 0x0c, 0x33, 0x11, 0xc3, 0x00, 0x29, 0x05, 0xd0, 0x00, 0x2a, 0x03, 0xdc, 0x02, 0x21, 0x50, 0x42, 0x00, 0xf0, 0x65, 0xfb, 0xb0, 0xbd, 0xac, 0x7e, 0x01, 0x00, 0xb8, 0x52, 0x01, 0x00, 0x3c, 0x00, 0x38, 0xf4, 0x00, 0x00, 0x10, 0xb5, 0x13, 0x4c, 0x13, 0x48, 0x21, 0x1c, 0xff, 0x31, 0x69, 0x31, 0x0e, 0xc9, 0x0e, 0xc0, 0x21, 0x1c, 0xff, 0x31, 0x24, 0x22, 0x75, 0x31, 0x0f, 0x48, 0xf1, 0xf7, 0x51, 0xf8, 0x21, 0x1c, 0xff, 0x31, 0x3c, 0x22, 0x99, 0x31, 0x0d, 0x48, 0xf1, 0xf7, 0xa6, 0xf8, 0xfc, 0xf7, 0xa2, 0xff, 0x21, 0x1c, 0xff, 0x31, 0x10, 0x22, 0xd5, 0x31, 0x09, 0x48, 0xf1, 0xf7, 0x3c, 0x00, 0x74, 0xf4, 0x00, 0x00, 0x41, 0xf8, 0x21, 0x1c, 0xff, 0x31, 0x28, 0x22, 0xe5, 0x31, 0x07, 0x48, 0xf1, 0xf7, 0x96, 0xf8, 0x10, 0xbd, 0x00, 0x00, 0x40, 0x63, 0x01, 0x00, 0x00, 0x80, 0x07, 0x00, 0x0c, 0x80, 0x07, 0x00, 0x30, 0x80, 0x07, 0x00, 0x80, 0x80, 0x07, 0x00, 0xa0, 0x80, 0x07, 0x00, 0xf8, 0xb5, 0x00, 0x28, 0x59, 0xd0, 0x04, 0xf0, 0x4b, 0xf9, 0xf8, 0xf7, 0xb3, 0xfb, 0x00, 0x22, 0x3c, 0x00, 0xb0, 0xf4, 0x00, 0x00, 0x01, 0x21, 0x13, 0x20, 0x04, 0xf0, 0x7c, 0xf9, 0x2a, 0x49, 0x29, 0x48, 0x49, 0x6c, 0x01, 0x60, 0x00, 0x21, 0x29, 0x48, 0xc9, 0x43, 0x41, 0x60, 0x26, 0x4c, 0x14, 0x34, 0x61, 0x6c, 0x81, 0x60, 0xa1, 0x6c, 0xc1, 0x60, 0x00, 0x20, 0x25, 0x4d, 0x02, 0x26, 0x01, 0x01, 0x6e, 0x50, 0x0a, 0x19, 0x4f, 0x19, 0x50, 0x32, 0x04, 0x37, 0x0e, 0xca, 0x01, 0x30, 0x08, 0x28, 0x3c, 0x00, 0xec, 0xf4, 0x00, 0x00, 0x0e, 0xc7, 0xf4, 0xdb, 0x14, 0x22, 0x21, 0x1c, 0xcc, 0x31, 0x1e, 0x48, 0xf1, 0xf7, 0x5a, 0xf8, 0x1d, 0x48, 0x81, 0x78, 0x09, 0x09, 0x09, 0x01, 0x81, 0x70, 0x00, 0x21, 0xc1, 0x70, 0x41, 0x70, 0x21, 0x1c, 0xe0, 0x31, 0x0a, 0x78, 0x02, 0x70, 0x49, 0x78, 0x41, 0x70, 0x21, 0x1c, 0xe8, 0x31, 0x30, 0x22, 0x08, 0x30, 0xf1, 0xf7, 0x46, 0xf8, 0x21, 0x1c, 0xff, 0x31, 0x3c, 0x00, 0x28, 0xf5, 0x00, 0x00, 0x50, 0x22, 0x19, 0x31, 0x12, 0x48, 0xf1, 0xf7, 0x3f, 0xf8, 0x83, 0x20, 0x80, 0x00, 0x14, 0x22, 0x21, 0x18, 0x10, 0x48, 0xf1, 0xf7, 0x38, 0xf8, 0x11, 0x20, 0x40, 0x01, 0x84, 0x22, 0x21, 0x18, 0x0d, 0x48, 0xf1, 0xf7, 0x31, 0xf8, 0xff, 0xf7, 0x73, 0xff, 0x20, 0x1c, 0xf1, 0xf7, 0x28, 0xfd, 0xf8, 0xbd, 0xff, 0xf7, 0x6d, 0xff, 0xfb, 0xe7, 0x08, 0x20, 0x07, 0x00, 0x3c, 0x00, 0x64, 0xf5, 0x00, 0x00, 0x2c, 0x63, 0x01, 0x00, 0x40, 0x20, 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, 0x00, 0x40, 0x07, 0x00, 0x00, 0x50, 0x07, 0x00, 0x00, 0x60, 0x07, 0x00, 0x10, 0x00, 0x07, 0x00, 0x00, 0x90, 0x07, 0x00, 0xf8, 0xb5, 0x05, 0x1c, 0x18, 0x48, 0xc0, 0x68, 0x00, 0x28, 0x25, 0xd0, 0x16, 0x4e, 0x01, 0x36, 0x74, 0x78, 0x30, 0x78, 0x27, 0x1a, 0x79, 0x19, 0x20, 0x1c, 0xf1, 0xf7, 0x3c, 0x00, 0xa0, 0xf5, 0x00, 0x00, 0x4b, 0xf8, 0x00, 0x90, 0x29, 0x1c, 0x20, 0x1c, 0xf1, 0xf7, 0xb2, 0xf8, 0xc1, 0x19, 0x20, 0x1c, 0xf1, 0xf7, 0x42, 0xf8, 0x60, 0x1a, 0x30, 0x70, 0x70, 0x1e, 0x80, 0x68, 0x00, 0x28, 0x0d, 0xd0, 0x53, 0x36, 0xf4, 0x78, 0x00, 0x99, 0x20, 0x1c, 0xf1, 0xf7, 0xa2, 0xf8, 0xb1, 0x78, 0x61, 0x1a, 0x41, 0x18, 0x20, 0x1c, 0xf1, 0xf7, 0x9c, 0xf8, 0x60, 0x1a, 0xb0, 0x70, 0x3c, 0x00, 0xdc, 0xf5, 0x00, 0x00, 0x03, 0x48, 0x5c, 0x30, 0x01, 0x69, 0xc2, 0x68, 0x69, 0x43, 0x51, 0x18, 0xc1, 0x60, 0xf8, 0xbd, 0x44, 0x7d, 0x01, 0x00, 0xb0, 0xb5, 0x0c, 0x4d, 0xe8, 0x68, 0x29, 0x69, 0x40, 0x18, 0x7d, 0x21, 0x09, 0x01, 0x44, 0x18, 0x20, 0x1c, 0x03, 0xf0, 0x0b, 0xfb, 0x00, 0x28, 0x0a, 0xd0, 0x03, 0xf0, 0xcf, 0xfb, 0x01, 0x1b, 0x28, 0x69, 0xf1, 0xf7, 0x7d, 0xf8, 0x01, 0x30, 0x3c, 0x00, 0x18, 0xf6, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0c, 0xff, 0xf7, 0xb2, 0xff, 0xb0, 0xbd, 0x00, 0x00, 0xa0, 0x7d, 0x01, 0x00, 0x70, 0xb5, 0x10, 0x4c, 0x60, 0x68, 0x80, 0x25, 0xa8, 0x43, 0x60, 0x60, 0x20, 0x68, 0x28, 0x43, 0x20, 0x60, 0x0d, 0x4e, 0x30, 0x1c, 0x10, 0x30, 0xf3, 0xf7, 0xc8, 0xfc, 0x00, 0x28, 0x03, 0xd1, 0x07, 0x21, 0x85, 0x20, 0xf1, 0xf7, 0x2a, 0xfe, 0x08, 0x48, 0x00, 0x21, 0x3c, 0x00, 0x54, 0xf6, 0x00, 0x00, 0x80, 0x68, 0x41, 0x63, 0xc0, 0x6c, 0x10, 0x30, 0x70, 0x61, 0x01, 0x20, 0x30, 0x61, 0x20, 0x68, 0xa8, 0x43, 0x20, 0x60, 0x70, 0xbd, 0x00, 0x00, 0xf4, 0x00, 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, 0x24, 0x7e, 0x01, 0x00, 0x01, 0x1c, 0x00, 0x20, 0x05, 0x29, 0x80, 0xb5, 0x09, 0xd2, 0x02, 0xa3, 0x5b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x3c, 0x00, 0x90, 0xf6, 0x00, 0x00, 0x03, 0x00, 0xff, 0xf7, 0xcf, 0xfc, 0x80, 0xbd, 0x01, 0x22, 0x92, 0x02, 0x80, 0xb5, 0x00, 0x21, 0x07, 0x20, 0x04, 0xf0, 0xab, 0xf9, 0x80, 0xbd, 0x80, 0xb5, 0x40, 0x22, 0x00, 0x21, 0x00, 0x20, 0x04, 0xf0, 0xa4, 0xf9, 0x03, 0x22, 0x00, 0x21, 0x00, 0x20, 0x04, 0xf0, 0x9f, 0xf9, 0x80, 0xbd, 0x70, 0xb5, 0x0e, 0x1c, 0x05, 0x1c, 0x14, 0x1c, 0x08, 0x28, 0x0e, 0xd1, 0x3c, 0x00, 0xcc, 0xf6, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xfc, 0x0e, 0x28, 0x01, 0xd1, 0x14, 0x20, 0x00, 0xe0, 0x10, 0x20, 0xe1, 0x03, 0x00, 0xd5, 0x01, 0x38, 0xc0, 0x06, 0x0a, 0x49, 0xc0, 0x0e, 0x88, 0x71, 0x08, 0xe0, 0x09, 0x2d, 0x06, 0xd1, 0xa0, 0x04, 0x01, 0xd5, 0x00, 0x20, 0x00, 0xe0, 0x01, 0x20, 0xf3, 0xf7, 0xb0, 0xf9, 0x34, 0x40, 0x21, 0x1c, 0x32, 0x1c, 0x28, 0x1c, 0x04, 0xf0, 0x7a, 0xf9, 0x3c, 0x00, 0x08, 0xf7, 0x00, 0x00, 0x70, 0xbd, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x70, 0xb5, 0x00, 0x24, 0x13, 0x29, 0x11, 0xd8, 0x00, 0x28, 0x01, 0xd1, 0x08, 0x4e, 0x08, 0x25, 0x01, 0x28, 0x01, 0xd1, 0x07, 0x4e, 0x09, 0x25, 0x00, 0xf0, 0x78, 0xfa, 0x00, 0x28, 0x05, 0xd0, 0x02, 0x1c, 0x31, 0x1c, 0x28, 0x1c, 0xff, 0xf7, 0xc3, 0xff, 0x01, 0x24, 0x20, 0x1c, 0x70, 0xbd, 0xf8, 0xff, 0x07, 0x00, 0x3c, 0x00, 0x44, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x01, 0x22, 0xd2, 0x02, 0x80, 0xb5, 0x00, 0x21, 0x07, 0x20, 0x04, 0xf0, 0x53, 0xf9, 0x80, 0xbd, 0x0f, 0x22, 0x12, 0x04, 0x07, 0x21, 0x49, 0x04, 0x80, 0xb5, 0x09, 0x20, 0x04, 0xf0, 0x4a, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x21, 0x04, 0x20, 0x04, 0xf0, 0x1b, 0xfc, 0x40, 0x21, 0x00, 0x20, 0x04, 0xf0, 0x17, 0xfc, 0x04, 0x49, 0x3c, 0x00, 0x80, 0xf7, 0x00, 0x00, 0x00, 0x20, 0x88, 0x60, 0x02, 0x48, 0x09, 0x69, 0x20, 0x30, 0xff, 0xf7, 0x09, 0xfe, 0x80, 0xbd, 0x64, 0x73, 0x01, 0x00, 0xb0, 0xb5, 0x60, 0x21, 0x00, 0x20, 0x04, 0xf0, 0x07, 0xfc, 0x11, 0x4d, 0x00, 0x24, 0x00, 0x22, 0x04, 0x20, 0x29, 0x5d, 0x04, 0xf0, 0x28, 0xf9, 0x0c, 0x20, 0x03, 0xf0, 0x9b, 0xfb, 0x01, 0x34, 0x24, 0x06, 0x24, 0x0e, 0x05, 0x2c, 0xf2, 0xd3, 0x3c, 0x00, 0xbc, 0xf7, 0x00, 0x00, 0x0f, 0x22, 0x00, 0x21, 0x0a, 0x20, 0x04, 0xf0, 0x1b, 0xf9, 0x61, 0x21, 0x00, 0x20, 0x04, 0xf0, 0xef, 0xfb, 0x06, 0x49, 0x01, 0x20, 0x88, 0x60, 0x04, 0x48, 0x09, 0x69, 0x20, 0x30, 0xff, 0xf7, 0xcd, 0xfd, 0xff, 0x20, 0x2d, 0x30, 0xb0, 0xbd, 0xa8, 0x58, 0x01, 0x00, 0x64, 0x73, 0x01, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x12, 0x48, 0xc6, 0x70, 0x01, 0x20, 0xff, 0xf7, 0x3c, 0x00, 0xf8, 0xf7, 0x00, 0x00, 0xfd, 0xfb, 0x01, 0x27, 0xbf, 0x02, 0x04, 0x1c, 0xb8, 0x43, 0x01, 0x1c, 0x01, 0x20, 0x04, 0xf0, 0xd1, 0xfb, 0x03, 0x20, 0xff, 0xf7, 0xf2, 0xfb, 0x05, 0x1c, 0xb8, 0x43, 0x01, 0x1c, 0x03, 0x20, 0x04, 0xf0, 0xc8, 0xfb, 0x30, 0x1c, 0x00, 0xf0, 0x9f, 0xf9, 0x00, 0xf0, 0x57, 0xf8, 0x21, 0x1c, 0x01, 0x20, 0x04, 0xf0, 0xbf, 0xfb, 0x29, 0x1c, 0x03, 0x20, 0x04, 0xf0, 0x3c, 0x00, 0x34, 0xf8, 0x00, 0x00, 0xbb, 0xfb, 0x00, 0x20, 0xf8, 0xbd, 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x40, 0x21, 0x00, 0x20, 0x04, 0xf0, 0xd8, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x05, 0x1c, 0x01, 0x24, 0x09, 0x20, 0xff, 0xf7, 0xcc, 0xfb, 0x0f, 0x21, 0x09, 0x04, 0x88, 0x43, 0x03, 0x21, 0x89, 0x04, 0xe2, 0x04, 0x05, 0x2d, 0x12, 0x4e, 0x20, 0xd2, 0x02, 0xa3, 0x3c, 0x00, 0x70, 0xf8, 0x00, 0x00, 0x5b, 0x5d, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x00, 0x06, 0x09, 0x0c, 0x10, 0x03, 0x00, 0x03, 0x21, 0x09, 0x04, 0x0c, 0xe0, 0x01, 0x21, 0x09, 0x04, 0x09, 0xe0, 0x01, 0x21, 0x49, 0x04, 0x06, 0xe0, 0xf3, 0x68, 0x04, 0x2b, 0x05, 0xd9, 0x02, 0xe0, 0xf3, 0x68, 0x04, 0x2b, 0x01, 0xd8, 0x01, 0x43, 0x01, 0xe0, 0x10, 0x43, 0x01, 0x1c, 0x09, 0x20, 0x04, 0xf0, 0x80, 0xfb, 0x3c, 0x00, 0xac, 0xf8, 0x00, 0x00, 0x20, 0x1c, 0x70, 0xbd, 0x00, 0x24, 0xfb, 0xe7, 0x64, 0x73, 0x01, 0x00, 0x01, 0x21, 0xc9, 0x05, 0x00, 0x28, 0x80, 0xb5, 0x02, 0xd0, 0x0a, 0x1c, 0x00, 0x21, 0x00, 0xe0, 0x00, 0x22, 0x04, 0x20, 0x04, 0xf0, 0x96, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0xf0, 0xb5, 0x91, 0xb0, 0x00, 0x26, 0x40, 0x21, 0x01, 0xa8, 0xf0, 0xf7, 0xdd, 0xfd, 0x2a, 0x4f, 0xb8, 0x79, 0x01, 0x22, 0x3c, 0x00, 0xe8, 0xf8, 0x00, 0x00, 0x52, 0x03, 0x00, 0x90, 0x00, 0x21, 0x06, 0x20, 0x04, 0xf0, 0x84, 0xf8, 0x60, 0x21, 0x00, 0x20, 0x04, 0xf0, 0x58, 0xfb, 0x61, 0x21, 0x00, 0x20, 0x04, 0xf0, 0x54, 0xfb, 0x08, 0x20, 0x03, 0xf0, 0xef, 0xfa, 0x00, 0x24, 0x0f, 0x20, 0xff, 0xf7, 0x71, 0xfb, 0x40, 0x05, 0x05, 0x0f, 0xa8, 0x00, 0x01, 0xa9, 0x09, 0x58, 0x01, 0xaa, 0x01, 0x31, 0x01, 0x34, 0x0c, 0x2c, 0x3c, 0x00, 0x24, 0xf9, 0x00, 0x00, 0x11, 0x50, 0xf1, 0xd3, 0x00, 0x20, 0x81, 0x00, 0x01, 0xaa, 0x51, 0x58, 0xb1, 0x42, 0x01, 0xd9, 0x0e, 0x1c, 0x05, 0x1c, 0x01, 0x30, 0x10, 0x28, 0xf5, 0xd3, 0x06, 0x20, 0xff, 0xf7, 0x58, 0xfb, 0x0f, 0x21, 0x49, 0x02, 0x88, 0x43, 0x69, 0x02, 0x08, 0x43, 0x01, 0x21, 0x49, 0x03, 0x01, 0x43, 0x06, 0x20, 0x04, 0xf0, 0x29, 0xfb, 0x0d, 0x48, 0x84, 0x68, 0x64, 0x34, 0x3c, 0x00, 0x60, 0xf9, 0x00, 0x00, 0x08, 0xe0, 0x20, 0x1c, 0x03, 0xf0, 0x5a, 0xf9, 0x00, 0x28, 0x03, 0xd0, 0x01, 0x21, 0x95, 0x20, 0xf1, 0xf7, 0x98, 0xfc, 0x0f, 0x20, 0xff, 0xf7, 0x3d, 0xfb, 0x00, 0x04, 0xf1, 0xd5, 0x87, 0x20, 0x03, 0xf0, 0xb2, 0xfa, 0x00, 0x98, 0xb8, 0x71, 0x11, 0xb0, 0xf0, 0xbd, 0x20, 0x10, 0x07, 0x00, 0x00, 0x01, 0x07, 0x00, 0x10, 0xb5, 0x17, 0x4c, 0x61, 0x69, 0x00, 0x29, 0x3c, 0x00, 0x9c, 0xf9, 0x00, 0x00, 0x04, 0xd0, 0x0a, 0x21, 0x13, 0x20, 0x03, 0xf0, 0x47, 0xfe, 0x10, 0xbd, 0x01, 0x1c, 0x12, 0x48, 0x01, 0x29, 0x00, 0x78, 0x0c, 0xd0, 0x11, 0x29, 0xf7, 0xd1, 0x05, 0x28, 0x03, 0xd1, 0x01, 0x21, 0x13, 0x20, 0xf1, 0xf7, 0x71, 0xfc, 0x20, 0x78, 0x07, 0x28, 0xee, 0xd1, 0x02, 0x21, 0x0a, 0xe0, 0x05, 0x28, 0x07, 0xd0, 0x06, 0x28, 0x0a, 0xd0, 0x07, 0x28, 0xf7, 0xd0, 0x3c, 0x00, 0xd8, 0xf9, 0x00, 0x00, 0x08, 0x28, 0xe4, 0xd1, 0x00, 0x20, 0x05, 0xe0, 0x01, 0x21, 0x13, 0x20, 0xf1, 0xf7, 0x5e, 0xfc, 0x10, 0xbd, 0x01, 0x20, 0x02, 0xf0, 0x6c, 0xfd, 0x10, 0xbd, 0x00, 0x00, 0x7c, 0x78, 0x01, 0x00, 0x0d, 0x49, 0x80, 0xb5, 0x09, 0x78, 0x03, 0x29, 0x01, 0xd1, 0x00, 0x28, 0x0b, 0xd0, 0x07, 0x29, 0x01, 0xd1, 0x00, 0x28, 0x07, 0xd0, 0x02, 0x29, 0x01, 0xd1, 0x00, 0x28, 0x3c, 0x00, 0x14, 0xfa, 0x00, 0x00, 0x03, 0xd1, 0x05, 0x29, 0x09, 0xd1, 0x00, 0x28, 0x07, 0xd0, 0x00, 0x20, 0xfc, 0xf7, 0x28, 0xfd, 0x00, 0x22, 0x13, 0x21, 0x11, 0x20, 0x03, 0xf0, 0xc1, 0xfe, 0x80, 0xbd, 0x7c, 0x78, 0x01, 0x00, 0x80, 0xb5, 0x06, 0x22, 0x08, 0x21, 0x00, 0x20, 0x03, 0xf0, 0xde, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x07, 0x48, 0x80, 0xb5, 0x40, 0x69, 0x00, 0x28, 0x01, 0xd1, 0xf1, 0xf7, 0x3c, 0x00, 0x50, 0xfa, 0x00, 0x00, 0x33, 0xff, 0x05, 0x49, 0x05, 0x4a, 0x08, 0x68, 0x50, 0x61, 0x48, 0x68, 0x90, 0x61, 0x01, 0x20, 0x80, 0xbd, 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, 0xb0, 0x58, 0x01, 0x00, 0x10, 0x00, 0x07, 0x00, 0x07, 0x48, 0x80, 0xb5, 0x40, 0x69, 0x00, 0x28, 0x01, 0xd1, 0xf1, 0xf7, 0x1d, 0xff, 0x05, 0x49, 0x05, 0x4a, 0x08, 0x68, 0x90, 0x61, 0x48, 0x68, 0x50, 0x61, 0x01, 0x20, 0x3c, 0x00, 0x8c, 0xfa, 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, 0xb0, 0x58, 0x01, 0x00, 0x10, 0x00, 0x07, 0x00, 0x11, 0xb5, 0x00, 0xab, 0x59, 0x78, 0x14, 0x48, 0x01, 0x23, 0xc0, 0x56, 0x00, 0x22, 0x09, 0x18, 0x0b, 0x06, 0x1b, 0x16, 0x13, 0x21, 0x13, 0x2b, 0x02, 0xdd, 0x00, 0xab, 0x59, 0x70, 0x07, 0xe0, 0x00, 0x2b, 0x02, 0xda, 0x00, 0xab, 0x5a, 0x70, 0x02, 0xe0, 0x1c, 0x1c, 0x3c, 0x00, 0xc8, 0xfa, 0x00, 0x00, 0x00, 0xab, 0x5c, 0x70, 0x00, 0xab, 0x1b, 0x78, 0x18, 0x18, 0x00, 0x06, 0x00, 0x16, 0x13, 0x28, 0x02, 0xdd, 0x00, 0xab, 0x19, 0x70, 0x06, 0xe0, 0x00, 0x28, 0x02, 0xda, 0x00, 0xab, 0x1a, 0x70, 0x01, 0xe0, 0x00, 0xab, 0x18, 0x70, 0x00, 0x98, 0x18, 0xbd, 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, 0x38, 0xb5, 0x0c, 0x1c, 0x15, 0x49, 0x00, 0xab, 0x49, 0x68, 0x13, 0x25, 0x3c, 0x00, 0x04, 0xfb, 0x00, 0x00, 0x00, 0x91, 0x59, 0x78, 0x09, 0x18, 0x59, 0x70, 0x19, 0x78, 0x08, 0x18, 0x18, 0x70, 0x19, 0x88, 0x10, 0x48, 0x02, 0x2c, 0xc1, 0x80, 0x01, 0xd0, 0x00, 0x2c, 0x0b, 0xd1, 0x00, 0xab, 0x18, 0x78, 0x13, 0x28, 0x00, 0xd9, 0x1d, 0x70, 0x00, 0xab, 0x19, 0x78, 0x00, 0x20, 0xff, 0xf7, 0xee, 0xfd, 0x02, 0x2c, 0x01, 0xd0, 0x01, 0x2c, 0x09, 0xd1, 0x00, 0xab, 0x58, 0x78, 0x3c, 0x00, 0x40, 0xfb, 0x00, 0x00, 0x13, 0x28, 0x00, 0xd9, 0x5d, 0x70, 0x00, 0xab, 0x59, 0x78, 0x01, 0x20, 0xff, 0xf7, 0xe0, 0xfd, 0x38, 0xbd, 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, 0xa0, 0x58, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0e, 0x28, 0x13, 0x4d, 0x04, 0xd0, 0x12, 0x49, 0xa0, 0x00, 0x00, 0x19, 0x4d, 0x39, 0x45, 0x18, 0x06, 0x20, 0xff, 0xf7, 0x3d, 0xfa, 0x0f, 0x49, 0x3c, 0x00, 0x7c, 0xfb, 0x00, 0x00, 0xe0, 0x22, 0x09, 0x19, 0x10, 0x39, 0xc9, 0x7b, 0x90, 0x43, 0x49, 0x01, 0x11, 0x40, 0x01, 0x43, 0x06, 0x20, 0x04, 0xf0, 0x0d, 0xfa, 0x29, 0x1c, 0x05, 0x20, 0x09, 0x4a, 0x03, 0xf0, 0x30, 0xff, 0x08, 0x48, 0x1f, 0x22, 0x00, 0x19, 0x10, 0x38, 0xc0, 0x7b, 0xc1, 0x04, 0xd2, 0x04, 0x08, 0x20, 0x03, 0xf0, 0x26, 0xff, 0xb0, 0xbd, 0x00, 0x00, 0xb4, 0x09, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xfb, 0x00, 0x00, 0x14, 0x45, 0x01, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xc0, 0x58, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x06, 0x49, 0x00, 0x28, 0x01, 0xd1, 0x08, 0x68, 0x80, 0xbd, 0x01, 0x28, 0x01, 0xd1, 0x48, 0x68, 0x80, 0xbd, 0xf1, 0xf7, 0x90, 0xfb, 0x00, 0x20, 0x80, 0xbd, 0x7c, 0x73, 0x01, 0x00, 0x01, 0x48, 0x40, 0x68, 0x70, 0x47, 0x00, 0x00, 0xa0, 0x58, 0x01, 0x00, 0x3c, 0x00, 0xf4, 0xfb, 0x00, 0x00, 0x04, 0x48, 0x01, 0x23, 0x04, 0x49, 0xc0, 0x56, 0xc9, 0x56, 0x40, 0x18, 0x00, 0x04, 0x00, 0x0c, 0x70, 0x47, 0x00, 0x00, 0xa0, 0x58, 0x01, 0x00, 0xa2, 0x58, 0x01, 0x00, 0x01, 0x48, 0x40, 0x68, 0x70, 0x47, 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, 0xf8, 0xb5, 0x05, 0x1c, 0x0e, 0x1c, 0x00, 0xf0, 0x55, 0xf9, 0x04, 0x1c, 0x00, 0xf0, 0x58, 0xf9, 0x00, 0x28, 0x2c, 0xd0, 0x3c, 0x00, 0x30, 0xfc, 0x00, 0x00, 0xb3, 0x00, 0x60, 0x1e, 0x00, 0x2d, 0x1c, 0x4e, 0x19, 0x49, 0x1a, 0x4a, 0x06, 0xd1, 0x0b, 0x25, 0x0e, 0x2c, 0x00, 0xd1, 0x19, 0x4a, 0xd2, 0x58, 0x08, 0x56, 0x08, 0xe0, 0x01, 0x2d, 0x1c, 0xd1, 0x9a, 0x18, 0x04, 0x36, 0x08, 0x18, 0x08, 0x25, 0x0e, 0x23, 0x12, 0x6d, 0xc0, 0x56, 0x07, 0x1c, 0x47, 0x43, 0xfb, 0x00, 0xdf, 0x19, 0x12, 0x4b, 0x3f, 0x21, 0x58, 0x43, 0x3c, 0x00, 0x6c, 0xfc, 0x00, 0x00, 0x11, 0x4b, 0xa9, 0x40, 0x0c, 0x1c, 0x38, 0x18, 0xc0, 0x18, 0x14, 0x40, 0xec, 0x40, 0xc0, 0x11, 0x60, 0x43, 0x1b, 0x0a, 0xc0, 0x18, 0x80, 0x12, 0x03, 0xd1, 0x01, 0x20, 0x04, 0xe0, 0x00, 0x20, 0xf8, 0xbd, 0x3f, 0x28, 0x00, 0xdd, 0x3f, 0x20, 0x30, 0x60, 0xa8, 0x40, 0x08, 0x40, 0x8a, 0x43, 0x10, 0x43, 0xf5, 0xe7, 0xcc, 0x59, 0x01, 0x00, 0xdc, 0x58, 0x01, 0x00, 0x3c, 0x00, 0xa8, 0xfc, 0x00, 0x00, 0x7c, 0x73, 0x01, 0x00, 0x7c, 0x59, 0x01, 0x00, 0x06, 0x06, 0x00, 0x00, 0x26, 0x00, 0x02, 0x00, 0x03, 0x48, 0x08, 0xb5, 0xc0, 0x88, 0x00, 0xab, 0x18, 0x80, 0x00, 0x98, 0x08, 0xbd, 0x00, 0x00, 0xa0, 0x58, 0x01, 0x00, 0xb0, 0xb5, 0x0b, 0x4d, 0x09, 0x4c, 0x0e, 0x20, 0x6c, 0x60, 0xff, 0xf7, 0x8d, 0xf9, 0x09, 0x49, 0x02, 0x1c, 0xc8, 0x60, 0x01, 0x06, 0x09, 0x0e, 0x3c, 0x00, 0xe4, 0xfc, 0x00, 0x00, 0x13, 0x3a, 0x02, 0x2a, 0x02, 0xd9, 0x17, 0x38, 0x04, 0x28, 0x00, 0xd8, 0x00, 0x21, 0x08, 0x1c, 0x6c, 0x60, 0xb0, 0xbd, 0x04, 0x18, 0x02, 0x00, 0x60, 0x00, 0x07, 0x00, 0x64, 0x73, 0x01, 0x00, 0x0a, 0x48, 0x98, 0xb5, 0x02, 0x78, 0x13, 0x21, 0x14, 0x2a, 0x00, 0xd3, 0x01, 0x70, 0x42, 0x78, 0x14, 0x2a, 0x00, 0xd3, 0x41, 0x70, 0x06, 0x4c, 0x60, 0x68, 0xff, 0xf7, 0x3c, 0x00, 0x20, 0xfd, 0x00, 0x00, 0xbd, 0xfe, 0x00, 0x90, 0x00, 0xab, 0x18, 0x88, 0xe0, 0x80, 0x00, 0xf0, 0x75, 0xff, 0x98, 0xbd, 0xa4, 0x58, 0x01, 0x00, 0xa0, 0x58, 0x01, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x41, 0x78, 0x01, 0x20, 0xff, 0xf7, 0xe6, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0xa6, 0x58, 0x01, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x01, 0x78, 0x00, 0x20, 0xff, 0xf7, 0xdc, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xfd, 0x00, 0x00, 0xa6, 0x58, 0x01, 0x00, 0xb0, 0xb5, 0x05, 0x4d, 0x00, 0x24, 0x20, 0x1c, 0xff, 0xf7, 0x44, 0xf9, 0x01, 0x34, 0x10, 0x2c, 0x01, 0xc5, 0xf8, 0xd3, 0xb0, 0xbd, 0x00, 0x00, 0xd4, 0x44, 0x01, 0x00, 0x04, 0x49, 0x80, 0xb5, 0x88, 0x70, 0x04, 0x49, 0x80, 0x00, 0x09, 0x58, 0x07, 0x20, 0x04, 0xf0, 0x0f, 0xf9, 0x80, 0xbd, 0x64, 0x73, 0x01, 0x00, 0xd0, 0x58, 0x01, 0x00, 0x3c, 0x00, 0x98, 0xfd, 0x00, 0x00, 0xb0, 0xb5, 0x3f, 0x24, 0x02, 0x1c, 0x00, 0x2a, 0x01, 0xd1, 0x08, 0x20, 0x0b, 0x23, 0x01, 0x2a, 0x01, 0xd1, 0x09, 0x20, 0x08, 0x23, 0x25, 0x1c, 0x9d, 0x40, 0x00, 0x29, 0x00, 0xd1, 0x01, 0x21, 0x3f, 0x29, 0x00, 0xd9, 0x21, 0x1c, 0x99, 0x40, 0x0a, 0x1c, 0x29, 0x1c, 0xff, 0xf7, 0x7c, 0xfc, 0xb0, 0xbd, 0x00, 0x00, 0x91, 0xb5, 0x12, 0x49, 0x00, 0xab, 0x1a, 0x78, 0x3c, 0x00, 0xd4, 0xfd, 0x00, 0x00, 0x08, 0x78, 0x11, 0x4c, 0x80, 0x18, 0x00, 0x06, 0x00, 0x0e, 0x20, 0x70, 0x49, 0x78, 0x5a, 0x78, 0x89, 0x18, 0x09, 0x06, 0x09, 0x0e, 0x13, 0x22, 0x13, 0x28, 0x61, 0x70, 0x00, 0xd9, 0x22, 0x70, 0x13, 0x29, 0x00, 0xd9, 0x62, 0x70, 0x08, 0x49, 0x08, 0x48, 0x06, 0x39, 0xc9, 0x88, 0x81, 0x80, 0x21, 0x78, 0x00, 0x20, 0xff, 0xf7, 0x82, 0xfc, 0x61, 0x78, 0x01, 0x20, 0x3c, 0x00, 0x10, 0xfe, 0x00, 0x00, 0xff, 0xf7, 0x7e, 0xfc, 0x98, 0xbd, 0x00, 0x00, 0xa4, 0x58, 0x01, 0x00, 0xa6, 0x58, 0x01, 0x00, 0x64, 0x73, 0x01, 0x00, 0x70, 0xb5, 0x1d, 0x4d, 0x04, 0x1c, 0x28, 0x78, 0x0e, 0x1c, 0x03, 0x28, 0x03, 0xd1, 0x02, 0x21, 0x11, 0x20, 0xf1, 0xf7, 0x35, 0xfa, 0x20, 0x1c, 0x00, 0xf0, 0x4e, 0xf8, 0x00, 0x28, 0x25, 0xd0, 0x28, 0x78, 0x01, 0x28, 0x0a, 0xd1, 0x68, 0x68, 0x3c, 0x00, 0x4c, 0xfe, 0x00, 0x00, 0x00, 0x28, 0x07, 0xd0, 0x01, 0x21, 0x11, 0x20, 0x03, 0xf0, 0xee, 0xfb, 0x01, 0x20, 0x69, 0x68, 0xf0, 0xf7, 0xbd, 0xfa, 0x6c, 0x70, 0x6e, 0x60, 0x20, 0x1c, 0xff, 0xf7, 0xc1, 0xfc, 0x04, 0x1c, 0x00, 0xf0, 0xd4, 0xfe, 0x00, 0x2c, 0x02, 0xd0, 0x68, 0x68, 0x00, 0x28, 0x02, 0xd1, 0xf6, 0xf7, 0xd9, 0xf8, 0x70, 0xbd, 0x01, 0x20, 0x28, 0x70, 0x01, 0x22, 0x21, 0x1c, 0x3c, 0x00, 0x88, 0xfe, 0x00, 0x00, 0x11, 0x20, 0x03, 0xf0, 0x9f, 0xfb, 0x70, 0xbd, 0x02, 0x21, 0x11, 0x20, 0xf1, 0xf7, 0x06, 0xfa, 0x70, 0xbd, 0x00, 0x00, 0x9c, 0x73, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x28, 0x05, 0xd1, 0x00, 0x29, 0x04, 0xd0, 0x01, 0x29, 0x01, 0xd1, 0xf6, 0xf7, 0xbf, 0xf8, 0x80, 0xbd, 0x05, 0x49, 0x08, 0x78, 0x03, 0x28, 0x02, 0xd0, 0x00, 0x20, 0x08, 0x70, 0x80, 0xbd, 0x03, 0x21, 0x3c, 0x00, 0xc4, 0xfe, 0x00, 0x00, 0x11, 0x20, 0xf1, 0xf7, 0xed, 0xf9, 0x80, 0xbd, 0x9c, 0x73, 0x01, 0x00, 0x01, 0x48, 0x40, 0x78, 0x70, 0x47, 0x00, 0x00, 0x9c, 0x73, 0x01, 0x00, 0x01, 0x1c, 0x01, 0x39, 0x01, 0x20, 0x0e, 0x29, 0x00, 0xd3, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x10, 0xb5, 0x13, 0x4c, 0x20, 0x78, 0x01, 0x28, 0x0e, 0xd1, 0x60, 0x68, 0x00, 0x28, 0x0d, 0xd0, 0x01, 0x21, 0x11, 0x20, 0x3c, 0x00, 0x00, 0xff, 0x00, 0x00, 0x03, 0xf0, 0x98, 0xfb, 0x01, 0x20, 0x61, 0x68, 0xf0, 0xf7, 0x67, 0xfa, 0x00, 0x20, 0x60, 0x60, 0x20, 0x70, 0x01, 0xe0, 0x03, 0x28, 0x0e, 0xd0, 0x00, 0x21, 0x11, 0x20, 0x03, 0xf0, 0x8a, 0xfb, 0xff, 0xf7, 0x24, 0xfc, 0xff, 0xf7, 0xc0, 0xfb, 0x05, 0x49, 0x08, 0x7b, 0x40, 0x08, 0x40, 0x00, 0x08, 0x73, 0x03, 0x20, 0x20, 0x70, 0x01, 0x20, 0x10, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xff, 0x00, 0x00, 0x9c, 0x73, 0x01, 0x00, 0x88, 0x00, 0x07, 0x00, 0x10, 0xb5, 0x0d, 0x4c, 0x20, 0x78, 0x03, 0x28, 0x13, 0xd1, 0x00, 0x20, 0x20, 0x70, 0x0b, 0x48, 0x01, 0x7b, 0x01, 0x22, 0x11, 0x43, 0x01, 0x73, 0xff, 0xf7, 0x70, 0xfc, 0xff, 0xf7, 0x18, 0xfc, 0x00, 0x28, 0x06, 0xd0, 0x02, 0x21, 0x21, 0x70, 0x01, 0x1c, 0x00, 0x22, 0x11, 0x20, 0x03, 0xf0, 0x2b, 0xfb, 0x01, 0x20, 0x3c, 0x00, 0x78, 0xff, 0x00, 0x00, 0x10, 0xbd, 0x00, 0x00, 0x9c, 0x73, 0x01, 0x00, 0x88, 0x00, 0x07, 0x00, 0x80, 0xb5, 0x05, 0x49, 0x00, 0x28, 0x04, 0xd0, 0x00, 0x20, 0x08, 0x60, 0x03, 0xf0, 0x5a, 0xfa, 0x80, 0xbd, 0x01, 0x20, 0x08, 0x60, 0x80, 0xbd, 0x80, 0x5a, 0x01, 0x00, 0xfe, 0xb5, 0x05, 0x1c, 0x80, 0x35, 0x04, 0x1c, 0xa8, 0x68, 0x29, 0x79, 0x06, 0x68, 0x20, 0x1c, 0xa0, 0x30, 0x02, 0x29, 0x3c, 0x00, 0xb4, 0xff, 0x00, 0x00, 0x1c, 0xd1, 0x69, 0x79, 0x08, 0x29, 0x01, 0xd0, 0x0c, 0x29, 0x17, 0xd1, 0x01, 0x21, 0x61, 0x62, 0xa9, 0x68, 0x09, 0x68, 0x09, 0x8b, 0x01, 0x82, 0xa9, 0x69, 0x01, 0x91, 0x00, 0x8a, 0xc0, 0x06, 0x05, 0xd5, 0x60, 0x68, 0x00, 0x88, 0x40, 0x05, 0x01, 0xd4, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x02, 0x90, 0x05, 0x20, 0x01, 0xa9, 0x02, 0xf0, 0xb7, 0xf9, 0x02, 0xe0, 0x3c, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x21, 0x61, 0x62, 0x01, 0x82, 0xa9, 0x68, 0x1a, 0x23, 0x0a, 0x89, 0x67, 0x6a, 0x18, 0x1c, 0x00, 0x2f, 0x00, 0xd1, 0x18, 0x20, 0x10, 0x1a, 0x08, 0x81, 0xa8, 0x68, 0x01, 0x68, 0x62, 0x6a, 0x00, 0x2a, 0x00, 0xd1, 0x18, 0x23, 0xc9, 0x18, 0x01, 0x60, 0xa8, 0x68, 0x41, 0xc4, 0x30, 0x88, 0x08, 0x3c, 0x40, 0x04, 0x03, 0xd5, 0x20, 0x1c, 0xf7, 0xf7, 0xbc, 0xf9, 0x3c, 0x00, 0x2c, 0x00, 0x01, 0x00, 0xfe, 0xbd, 0x00, 0x21, 0xe1, 0x61, 0x30, 0x79, 0xc0, 0x07, 0x03, 0xd4, 0x20, 0x1c, 0xf7, 0xf7, 0x91, 0xfe, 0xf5, 0xe7, 0x20, 0x1c, 0xf7, 0xf7, 0x43, 0xff, 0xf1, 0xe7, 0xf7, 0xb5, 0x05, 0x1c, 0x0a, 0x30, 0x06, 0x1c, 0xf5, 0xf7, 0xa4, 0xfa, 0x14, 0x4f, 0x04, 0x1c, 0x39, 0x88, 0xf2, 0xf7, 0x83, 0xfe, 0x32, 0x88, 0x78, 0x68, 0x02, 0x80, 0x72, 0x88, 0x02, 0x30, 0x3c, 0x00, 0x68, 0x00, 0x01, 0x00, 0x02, 0x80, 0xb1, 0x88, 0x41, 0x80, 0x69, 0x88, 0x02, 0x9a, 0x20, 0x1c, 0xfa, 0xf7, 0xce, 0xfe, 0x0b, 0x4d, 0x08, 0x35, 0x68, 0x80, 0xfb, 0xf7, 0x2b, 0xfe, 0x01, 0x21, 0x09, 0x03, 0x00, 0x28, 0x28, 0x88, 0x01, 0xd0, 0x88, 0x43, 0x00, 0xe0, 0x08, 0x43, 0x28, 0x80, 0x04, 0x48, 0x00, 0x22, 0x00, 0x21, 0x14, 0x30, 0xf2, 0xf7, 0x32, 0xfe, 0x20, 0x1c, 0xfc, 0xf7, 0x3c, 0x00, 0xa4, 0x00, 0x01, 0x00, 0x85, 0xfa, 0xfe, 0xbd, 0x24, 0x7b, 0x01, 0x00, 0x10, 0xb5, 0x13, 0x4c, 0x11, 0x49, 0x20, 0x1c, 0xff, 0x30, 0x69, 0x30, 0x0e, 0xc9, 0x0e, 0xc0, 0x20, 0x1c, 0xff, 0x30, 0x24, 0x22, 0x75, 0x30, 0x0e, 0x49, 0xf0, 0xf7, 0x17, 0xfa, 0x20, 0x1c, 0xff, 0x30, 0x3c, 0x22, 0x99, 0x30, 0x0c, 0x49, 0xf0, 0xf7, 0x6c, 0xfa, 0x20, 0x1c, 0xff, 0x30, 0x10, 0x22, 0xd5, 0x30, 0x3c, 0x00, 0xe0, 0x00, 0x01, 0x00, 0x09, 0x49, 0xf0, 0xf7, 0x09, 0xfa, 0x20, 0x1c, 0xff, 0x30, 0x28, 0x22, 0xe5, 0x30, 0x07, 0x49, 0xf0, 0xf7, 0x5e, 0xfa, 0x10, 0xbd, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x40, 0x63, 0x01, 0x00, 0x0c, 0x80, 0x07, 0x00, 0x30, 0x80, 0x07, 0x00, 0x80, 0x80, 0x07, 0x00, 0xa0, 0x80, 0x07, 0x00, 0xb0, 0xb5, 0x00, 0x28, 0x3f, 0xd0, 0x21, 0x48, 0x41, 0x68, 0x21, 0x4c, 0x3c, 0x00, 0x1c, 0x01, 0x01, 0x00, 0x61, 0x60, 0xc1, 0x68, 0xe1, 0x60, 0x01, 0x69, 0x21, 0x61, 0x80, 0x6a, 0xa0, 0x62, 0x1e, 0x49, 0x1c, 0x48, 0x09, 0x68, 0x14, 0x38, 0x41, 0x64, 0x1c, 0x48, 0x25, 0x1c, 0x3c, 0x35, 0x0f, 0xc8, 0x0f, 0xc5, 0x20, 0x1c, 0x80, 0x22, 0x4c, 0x30, 0x19, 0x49, 0xf0, 0xf7, 0x33, 0xfa, 0x14, 0x22, 0x20, 0x1c, 0xcc, 0x30, 0x17, 0x49, 0xf0, 0xf7, 0x2d, 0xfa, 0x38, 0x22, 0x3c, 0x00, 0x58, 0x01, 0x01, 0x00, 0x20, 0x1c, 0xe0, 0x30, 0x15, 0x49, 0xf0, 0xf7, 0x27, 0xfa, 0x20, 0x1c, 0xff, 0x30, 0x50, 0x22, 0x19, 0x30, 0x13, 0x49, 0xf0, 0xf7, 0x20, 0xfa, 0x83, 0x20, 0x80, 0x00, 0x14, 0x22, 0x20, 0x18, 0x10, 0x49, 0xf0, 0xf7, 0x19, 0xfa, 0x11, 0x20, 0x40, 0x01, 0x84, 0x22, 0x20, 0x18, 0x0e, 0x49, 0xf0, 0xf7, 0x12, 0xfa, 0xff, 0xf7, 0x8e, 0xff, 0xf8, 0xf7, 0x94, 0xfb, 0x3c, 0x00, 0x94, 0x01, 0x01, 0x00, 0xb0, 0xbd, 0xff, 0xf7, 0x89, 0xff, 0xb0, 0xbd, 0x00, 0x10, 0x07, 0x00, 0x40, 0x63, 0x01, 0x00, 0x08, 0x20, 0x07, 0x00, 0x40, 0x20, 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, 0x00, 0x40, 0x07, 0x00, 0x00, 0x50, 0x07, 0x00, 0x00, 0x60, 0x07, 0x00, 0x10, 0x00, 0x07, 0x00, 0x00, 0x90, 0x07, 0x00, 0x0c, 0x49, 0x80, 0xb5, 0x01, 0x20, 0x48, 0x60, 0x0a, 0x48, 0x14, 0x38, 0x3c, 0x00, 0xd0, 0x01, 0x01, 0x00, 0x00, 0x78, 0x01, 0x28, 0x04, 0xd0, 0x08, 0x48, 0x94, 0x38, 0x40, 0x6f, 0x00, 0x28, 0x03, 0xd0, 0x00, 0x20, 0x00, 0xf0, 0x1f, 0xf8, 0x80, 0xbd, 0x08, 0x68, 0x00, 0x28, 0xfb, 0xd0, 0x03, 0x48, 0xf2, 0xf7, 0x7a, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x98, 0x66, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x28, 0x09, 0xd1, 0xf2, 0x21, 0x0f, 0x20, 0x03, 0xf0, 0x3c, 0x00, 0x0c, 0x02, 0x01, 0x00, 0x13, 0xfa, 0x00, 0x22, 0x0f, 0x21, 0xf1, 0x20, 0x03, 0xf0, 0xcc, 0xfa, 0x80, 0xbd, 0x01, 0x20, 0xf8, 0xf7, 0x6a, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x03, 0x20, 0x00, 0xf0, 0xc9, 0xf9, 0x00, 0x21, 0x0f, 0x20, 0x03, 0xf0, 0xff, 0xf9, 0xff, 0xf7, 0x65, 0xf8, 0x0b, 0x49, 0x00, 0x20, 0x48, 0x74, 0xfb, 0xf7, 0xe6, 0xfa, 0x09, 0x48, 0x00, 0x68, 0x3c, 0x00, 0x48, 0x02, 0x01, 0x00, 0x00, 0x28, 0x03, 0xdc, 0x02, 0x21, 0x40, 0x42, 0xff, 0xf7, 0x52, 0xfc, 0x04, 0x48, 0x14, 0x30, 0x00, 0x68, 0x00, 0x28, 0x02, 0xd0, 0x20, 0x1c, 0xf2, 0xf7, 0x42, 0xfe, 0x10, 0xbd, 0x00, 0x00, 0x84, 0x66, 0x01, 0x00, 0xd4, 0x7e, 0x01, 0x00, 0x06, 0x49, 0x80, 0xb5, 0x09, 0x78, 0x04, 0x29, 0x05, 0xd0, 0x05, 0x29, 0x03, 0xd0, 0x06, 0x29, 0x01, 0xd0, 0x07, 0x29, 0x3c, 0x00, 0x84, 0x02, 0x01, 0x00, 0x01, 0xd1, 0xfe, 0xf7, 0xbd, 0xfd, 0x80, 0xbd, 0x74, 0x66, 0x01, 0x00, 0x10, 0xb5, 0x09, 0x4c, 0xe0, 0x68, 0x00, 0x28, 0x0b, 0xd1, 0x07, 0x48, 0x2c, 0x38, 0x00, 0x8a, 0xc0, 0x07, 0x04, 0xd5, 0x00, 0x21, 0x01, 0x20, 0x62, 0x68, 0xf9, 0xf7, 0xc9, 0xfa, 0x01, 0x20, 0xe0, 0x60, 0x01, 0x20, 0x10, 0xbd, 0x00, 0x00, 0xf4, 0x6e, 0x01, 0x00, 0x8c, 0xb5, 0x02, 0x1c, 0x3c, 0x00, 0xc0, 0x02, 0x01, 0x00, 0x08, 0x1c, 0x11, 0x1c, 0xfd, 0xf7, 0x28, 0xff, 0x01, 0x90, 0x00, 0x28, 0x05, 0xd0, 0x17, 0x20, 0x00, 0xab, 0x18, 0x80, 0x68, 0x46, 0xfd, 0xf7, 0xff, 0xf8, 0x8c, 0xbd, 0xf1, 0xb5, 0x2e, 0x4c, 0xae, 0xb0, 0x00, 0x25, 0x25, 0x63, 0x20, 0x69, 0x01, 0x28, 0x03, 0xd1, 0x01, 0xa8, 0x01, 0xf0, 0xa1, 0xf8, 0x4e, 0xe0, 0x01, 0x26, 0x28, 0x4f, 0x26, 0x70, 0x50, 0x3f, 0x3c, 0x00, 0xfc, 0x02, 0x01, 0x00, 0xb8, 0x69, 0xf8, 0xf7, 0x4f, 0xf8, 0x25, 0x49, 0x2c, 0x39, 0x00, 0x28, 0x1d, 0xd0, 0xe0, 0x6a, 0x01, 0x28, 0x1a, 0xd1, 0x08, 0x8a, 0x0f, 0x1c, 0x80, 0x07, 0x04, 0xd5, 0x00, 0x21, 0x02, 0x20, 0x62, 0x68, 0xf9, 0xf7, 0x8f, 0xfa, 0x38, 0x8a, 0x00, 0x07, 0x07, 0xd5, 0xe0, 0x68, 0x01, 0x28, 0x04, 0xd1, 0x00, 0x21, 0x08, 0x20, 0x62, 0x68, 0xf9, 0xf7, 0x84, 0xfa, 0x3c, 0x00, 0x38, 0x03, 0x01, 0x00, 0x00, 0x22, 0x18, 0x21, 0x82, 0x20, 0x26, 0x63, 0x03, 0xf0, 0x36, 0xfa, 0x25, 0xe0, 0x08, 0x8a, 0x0e, 0x1c, 0x80, 0x07, 0x04, 0xd5, 0x00, 0x21, 0x02, 0x20, 0x62, 0x68, 0xf9, 0xf7, 0x74, 0xfa, 0x30, 0x8a, 0x00, 0x07, 0x07, 0xd5, 0xe0, 0x68, 0x01, 0x28, 0x04, 0xd1, 0x00, 0x21, 0x08, 0x20, 0x62, 0x68, 0xf9, 0xf7, 0x69, 0xfa, 0x30, 0x8a, 0x40, 0x07, 0x04, 0xd5, 0x3c, 0x00, 0x74, 0x03, 0x01, 0x00, 0x00, 0x22, 0x00, 0x21, 0x04, 0x20, 0xf9, 0xf7, 0x61, 0xfa, 0x2e, 0x98, 0x01, 0x28, 0x04, 0xd0, 0x1e, 0x95, 0x09, 0x21, 0x1b, 0xa8, 0xff, 0xf7, 0x97, 0xff, 0xe5, 0x62, 0xbd, 0x61, 0xe5, 0x60, 0x2f, 0xb0, 0xf0, 0xbd, 0xf4, 0x6e, 0x01, 0x00, 0x80, 0xb5, 0x07, 0x20, 0xfe, 0xf7, 0xa0, 0xfe, 0x00, 0x21, 0x0f, 0x20, 0x03, 0xf0, 0x44, 0xf9, 0x0c, 0x48, 0x01, 0x78, 0x3c, 0x00, 0xb0, 0x03, 0x01, 0x00, 0x00, 0x29, 0x0f, 0xd0, 0x02, 0x21, 0x01, 0x70, 0x88, 0x38, 0x00, 0x78, 0x00, 0x28, 0x04, 0xd0, 0x07, 0x49, 0x10, 0x31, 0x48, 0x7c, 0x01, 0x30, 0x48, 0x74, 0xf2, 0x22, 0x0f, 0x20, 0x05, 0x49, 0x03, 0xf0, 0xfc, 0xf8, 0x00, 0x22, 0x0f, 0x21, 0xf3, 0x20, 0x03, 0xf0, 0xe9, 0xf9, 0x80, 0xbd, 0x74, 0x66, 0x01, 0x00, 0x80, 0x84, 0x1e, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x3c, 0x00, 0xec, 0x03, 0x01, 0x00, 0xf2, 0x21, 0x0f, 0x20, 0x03, 0xf0, 0x20, 0xf9, 0x01, 0x2c, 0x0a, 0xd1, 0x08, 0x48, 0x08, 0x49, 0x00, 0x68, 0x14, 0x39, 0x00, 0x28, 0x05, 0xd0, 0xc8, 0x78, 0x02, 0x28, 0x02, 0xd1, 0xf7, 0xf7, 0xaf, 0xfa, 0x10, 0xbd, 0x00, 0x20, 0x48, 0x70, 0x05, 0x20, 0xfe, 0xf7, 0x65, 0xfe, 0x10, 0xbd, 0x98, 0x66, 0x01, 0x00, 0xf8, 0xb5, 0x28, 0x4e, 0x30, 0x21, 0x35, 0x1c, 0x3c, 0x00, 0x28, 0x04, 0x01, 0x00, 0x60, 0x35, 0x28, 0x89, 0x89, 0x5d, 0x88, 0x42, 0x03, 0xd1, 0x00, 0x20, 0xff, 0xf7, 0xf6, 0xfe, 0xf8, 0xbd, 0x34, 0x1c, 0x70, 0x34, 0x01, 0x21, 0x21, 0x70, 0x41, 0x18, 0x80, 0x19, 0x30, 0x30, 0x29, 0x81, 0x40, 0x78, 0x1d, 0x4f, 0x18, 0x3f, 0x38, 0x70, 0x00, 0x28, 0x08, 0xd0, 0x00, 0x21, 0xfb, 0xf7, 0xc2, 0xf9, 0x00, 0x28, 0x07, 0xd1, 0x20, 0x78, 0xff, 0xf7, 0x3c, 0x00, 0x64, 0x04, 0x01, 0x00, 0x9b, 0xff, 0xe7, 0xe7, 0x01, 0x21, 0x0f, 0x20, 0xf0, 0xf7, 0x1a, 0xff, 0x14, 0x48, 0x01, 0x21, 0x80, 0x30, 0x81, 0x70, 0x38, 0x69, 0xfb, 0xf7, 0x55, 0xfa, 0x20, 0x73, 0x00, 0x21, 0x0f, 0x20, 0x03, 0xf0, 0xd6, 0xf8, 0x70, 0x7a, 0x01, 0x28, 0x0e, 0xd1, 0x0e, 0x48, 0x00, 0x68, 0x00, 0x28, 0x04, 0xd0, 0x38, 0x78, 0x02, 0xf0, 0xda, 0xfa, 0x00, 0x28, 0x05, 0xd0, 0x3c, 0x00, 0xa0, 0x04, 0x01, 0x00, 0x30, 0x7f, 0x60, 0x73, 0x03, 0x20, 0x20, 0x70, 0x71, 0x89, 0x05, 0xe0, 0x05, 0x20, 0x20, 0x70, 0xa8, 0x88, 0xfa, 0xf7, 0x3b, 0xfb, 0x01, 0x1c, 0x00, 0x22, 0x0f, 0x20, 0x03, 0xf0, 0x86, 0xf8, 0xba, 0xe7, 0x00, 0x00, 0x04, 0x66, 0x01, 0x00, 0xe4, 0x62, 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x02, 0xf0, 0x6c, 0xfc, 0x36, 0x4b, 0x19, 0x1c, 0xa0, 0x31, 0x0a, 0x78, 0x3c, 0x00, 0xdc, 0x04, 0x01, 0x00, 0x10, 0x2a, 0x02, 0xd2, 0x0a, 0x79, 0x10, 0x2a, 0x01, 0xd3, 0x01, 0x25, 0x00, 0xe0, 0x00, 0x25, 0x30, 0x4e, 0xca, 0x79, 0x80, 0x36, 0x01, 0x2c, 0x12, 0xd0, 0x00, 0x25, 0x02, 0x2c, 0x2e, 0xd0, 0x04, 0x2c, 0x3c, 0xd1, 0x5c, 0x6b, 0x00, 0x2c, 0x39, 0xd1, 0x9c, 0x6f, 0x00, 0x1b, 0x2a, 0x4c, 0xa0, 0x42, 0x34, 0xd9, 0xb2, 0x68, 0x98, 0x6a, 0x82, 0x42, 0x31, 0xd0, 0x3c, 0x00, 0x18, 0x05, 0x01, 0x00, 0x4d, 0x72, 0x34, 0xe0, 0xb0, 0x68, 0x9c, 0x6a, 0x02, 0x22, 0xa0, 0x42, 0x21, 0xd1, 0x58, 0x6b, 0x00, 0x28, 0x1e, 0xd1, 0x00, 0x2d, 0x1c, 0xd1, 0x48, 0x7a, 0x19, 0x28, 0x20, 0xd0, 0x34, 0x68, 0x98, 0x6f, 0x64, 0x00, 0x00, 0x1b, 0x74, 0x68, 0x00, 0x19, 0xff, 0x30, 0x1c, 0x4c, 0x39, 0x30, 0xa0, 0x42, 0x16, 0xd2, 0x48, 0x79, 0x8c, 0x79, 0x00, 0x19, 0x30, 0x28, 0x3c, 0x00, 0x54, 0x05, 0x01, 0x00, 0x11, 0xd3, 0x10, 0x22, 0x0f, 0xe0, 0x5c, 0x6b, 0x01, 0x2c, 0x06, 0xd1, 0xb0, 0x68, 0x9a, 0x6a, 0x90, 0x42, 0x00, 0xd1, 0x4d, 0x72, 0x00, 0x22, 0x05, 0xe0, 0x9c, 0x6f, 0x00, 0x1b, 0x12, 0x4c, 0xa0, 0x42, 0x00, 0xd3, 0x20, 0x22, 0x06, 0xe0, 0x4a, 0x7a, 0x19, 0x2a, 0x01, 0xd2, 0x01, 0x32, 0x4a, 0x72, 0x20, 0x22, 0xb0, 0x60, 0x30, 0x68, 0x9b, 0x6f, 0x98, 0x42, 0x3c, 0x00, 0x90, 0x05, 0x01, 0x00, 0x04, 0xd1, 0x00, 0x2a, 0x00, 0xd1, 0x48, 0x79, 0x4a, 0x71, 0x06, 0xe0, 0x10, 0x2a, 0x04, 0xd3, 0x70, 0x60, 0x33, 0x60, 0x48, 0x79, 0x88, 0x71, 0xf6, 0xe7, 0xca, 0x71, 0x70, 0xbd, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0xa3, 0x04, 0x00, 0x00, 0x71, 0x02, 0x00, 0x00, 0x35, 0x0c, 0x00, 0x00, 0x05, 0x48, 0x80, 0xb5, 0x81, 0x7b, 0x00, 0x29, 0x05, 0xd0, 0x00, 0x21, 0x3c, 0x00, 0xcc, 0x05, 0x01, 0x00, 0x81, 0x73, 0x03, 0x49, 0x0f, 0x20, 0x01, 0xf0, 0x0f, 0xff, 0x80, 0xbd, 0x74, 0x66, 0x01, 0x00, 0xe9, 0x03, 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0x02, 0xf0, 0xe2, 0xfb, 0x05, 0x1c, 0x38, 0x4e, 0x20, 0x1c, 0x37, 0x49, 0x34, 0x1c, 0xa0, 0x34, 0x10, 0x22, 0x44, 0x39, 0x01, 0x28, 0x2c, 0xd0, 0x04, 0x28, 0x4e, 0xd1, 0x37, 0x1c, 0x74, 0x36, 0x09, 0xce, 0x26, 0x78, 0x3c, 0x00, 0x08, 0x06, 0x01, 0x00, 0xc0, 0x1a, 0x20, 0x2e, 0x04, 0xd1, 0x30, 0x4e, 0xb0, 0x42, 0x01, 0xd9, 0x00, 0x26, 0x4e, 0x61, 0x3e, 0x1c, 0x3f, 0x6c, 0x00, 0x2f, 0x48, 0xd1, 0x77, 0x6c, 0x00, 0x2f, 0x45, 0xd1, 0xb7, 0x6a, 0x00, 0x2f, 0x3d, 0xd0, 0x77, 0x6b, 0x00, 0x2f, 0x3a, 0xd0, 0x27, 0x4f, 0xb8, 0x42, 0x37, 0xd2, 0x60, 0x78, 0x10, 0x28, 0x06, 0xd3, 0xf0, 0x6f, 0x18, 0x1a, 0x24, 0x4b, 0x3c, 0x00, 0x44, 0x06, 0x01, 0x00, 0x98, 0x42, 0x01, 0xd2, 0xe2, 0x70, 0xf5, 0x66, 0x48, 0x69, 0x06, 0x28, 0x2f, 0xd2, 0x01, 0x30, 0x2c, 0xe0, 0x20, 0x78, 0x20, 0x28, 0x01, 0xd1, 0x06, 0x23, 0x4b, 0x61, 0x02, 0x23, 0x23, 0x71, 0xb3, 0x6a, 0x00, 0x2b, 0x19, 0xd0, 0x49, 0x69, 0x03, 0x29, 0x16, 0xd9, 0x71, 0x6b, 0x73, 0x6d, 0x59, 0x40, 0x12, 0xd0, 0xe1, 0x78, 0x10, 0x29, 0x10, 0xd3, 0x61, 0x78, 0x3c, 0x00, 0x80, 0x06, 0x01, 0x00, 0x33, 0x1c, 0x10, 0x29, 0x0c, 0xd3, 0xd9, 0x6f, 0x69, 0x1a, 0x13, 0x4d, 0xa9, 0x42, 0x07, 0xd2, 0x58, 0x6c, 0x00, 0x28, 0x02, 0xd0, 0x98, 0x6c, 0x00, 0x28, 0x00, 0xd1, 0x22, 0x71, 0xf8, 0xbd, 0x02, 0x28, 0xfc, 0xd1, 0x22, 0x70, 0xfa, 0xe7, 0x48, 0x69, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x38, 0x48, 0x61, 0x0a, 0x49, 0xf0, 0x6e, 0x40, 0x18, 0x02, 0xf0, 0xb0, 0xfa, 0x3c, 0x00, 0xbc, 0x06, 0x01, 0x00, 0x00, 0x28, 0xee, 0xd0, 0x01, 0x20, 0xe0, 0x70, 0x06, 0x48, 0x28, 0x18, 0xf0, 0x66, 0xe8, 0xe7, 0xa4, 0x6c, 0x01, 0x00, 0xe2, 0x04, 0x00, 0x00, 0x1a, 0x06, 0x00, 0x00, 0x53, 0x07, 0x00, 0x00, 0x00, 0x2d, 0x31, 0x01, 0x00, 0x5a, 0x62, 0x02, 0x80, 0xb5, 0x41, 0x68, 0x09, 0x79, 0xc9, 0x07, 0x13, 0xd5, 0xc1, 0x69, 0x00, 0x29, 0x0d, 0xd0, 0x89, 0x79, 0x02, 0x29, 0x3c, 0x00, 0xf8, 0x06, 0x01, 0x00, 0x0a, 0xd1, 0x08, 0x21, 0x01, 0x86, 0x01, 0x1c, 0x38, 0x31, 0x81, 0x62, 0x02, 0x1c, 0x06, 0x48, 0x04, 0x49, 0xf9, 0xf7, 0xfd, 0xfc, 0x80, 0xbd, 0xf7, 0xf7, 0xdc, 0xfb, 0x80, 0xbd, 0xf7, 0xf7, 0x23, 0xfb, 0x80, 0xbd, 0xb9, 0x71, 0x00, 0x00, 0xa0, 0x6a, 0x01, 0x00, 0x10, 0xb5, 0x00, 0x24, 0x00, 0x28, 0x03, 0xd0, 0x02, 0xf0, 0xe8, 0xfe, 0x00, 0x28, 0x17, 0xd0, 0x3c, 0x00, 0x34, 0x07, 0x01, 0x00, 0x0c, 0x4c, 0x01, 0x20, 0xa0, 0x72, 0x20, 0x68, 0x00, 0x21, 0x41, 0x62, 0x0a, 0x49, 0x02, 0x68, 0xc9, 0x78, 0x60, 0x32, 0x91, 0x71, 0x21, 0x89, 0x01, 0x31, 0x21, 0x81, 0x00, 0x68, 0x40, 0x30, 0x81, 0x83, 0xfb, 0xf7, 0x31, 0xfc, 0x20, 0x68, 0x00, 0x68, 0xfc, 0xf7, 0xa1, 0xf9, 0x01, 0x24, 0x20, 0x1c, 0x10, 0xbd, 0x14, 0x7a, 0x01, 0x00, 0x0e, 0x61, 0x01, 0x00, 0x3c, 0x00, 0x70, 0x07, 0x01, 0x00, 0x7f, 0xb5, 0x06, 0x1c, 0x1e, 0x48, 0x1d, 0x1c, 0x43, 0x88, 0x02, 0x88, 0x1c, 0x21, 0x00, 0x20, 0x90, 0xb0, 0xf0, 0xf7, 0x45, 0xff, 0x03, 0x90, 0x04, 0x68, 0xff, 0x21, 0x01, 0x31, 0x21, 0x80, 0x08, 0x20, 0x60, 0x80, 0x06, 0x20, 0x20, 0x71, 0x04, 0x20, 0x60, 0x71, 0xc0, 0x01, 0x00, 0x2d, 0x00, 0xd1, 0x08, 0x1c, 0xe0, 0x80, 0x01, 0xa8, 0x02, 0x30, 0x31, 0x1c, 0x3c, 0x00, 0xac, 0x07, 0x01, 0x00, 0x05, 0x1c, 0xfa, 0xf7, 0x5f, 0xfa, 0x10, 0x49, 0x68, 0x46, 0xfa, 0xf7, 0x5b, 0xfa, 0x20, 0x1c, 0x08, 0x30, 0x69, 0x46, 0xfa, 0xf7, 0x56, 0xfa, 0x29, 0x1c, 0x20, 0x1c, 0x12, 0x30, 0xfa, 0xf7, 0x51, 0xfa, 0x10, 0xab, 0x98, 0x88, 0x00, 0x22, 0x01, 0x21, 0x20, 0x83, 0xd8, 0x88, 0x60, 0x83, 0x18, 0x89, 0xe0, 0x81, 0x58, 0x89, 0x20, 0x82, 0x68, 0x46, 0xf9, 0xf7, 0x3c, 0x00, 0xe8, 0x07, 0x01, 0x00, 0x17, 0xff, 0x14, 0xb0, 0x70, 0xbd, 0x00, 0x00, 0x14, 0x6e, 0x01, 0x00, 0x12, 0x61, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x18, 0x48, 0x25, 0x1c, 0x00, 0x78, 0x60, 0x35, 0x80, 0x07, 0x00, 0x28, 0x08, 0xda, 0xe8, 0x79, 0x00, 0x28, 0x05, 0xd0, 0xf4, 0xf7, 0x70, 0xff, 0x01, 0x1c, 0x20, 0x1c, 0x00, 0xf0, 0x78, 0xf9, 0x29, 0x88, 0x2e, 0x20, 0x00, 0x5d, 0xf2, 0xf7, 0x3c, 0x00, 0x24, 0x08, 0x01, 0x00, 0x9f, 0xfa, 0xe8, 0x79, 0x00, 0x28, 0x0b, 0xd1, 0x20, 0x1c, 0x40, 0x30, 0x01, 0x8b, 0x22, 0x69, 0x11, 0x80, 0x41, 0x8b, 0x22, 0x69, 0x51, 0x80, 0x80, 0x8b, 0x21, 0x69, 0xc8, 0x82, 0x07, 0xe0, 0x01, 0x28, 0x05, 0xd1, 0x20, 0x69, 0x01, 0x22, 0x01, 0x88, 0xd2, 0x02, 0x11, 0x43, 0x01, 0x80, 0x6a, 0x7a, 0xe0, 0x68, 0x02, 0x49, 0xf2, 0xf7, 0x53, 0xfa, 0xb0, 0xbd, 0x3c, 0x00, 0x60, 0x08, 0x01, 0x00, 0x1d, 0x75, 0x01, 0x00, 0xd1, 0x4f, 0x00, 0x00, 0x90, 0xb5, 0x04, 0x1c, 0x38, 0x23, 0x0c, 0x49, 0x58, 0x43, 0x43, 0x18, 0x85, 0xb0, 0x00, 0x20, 0x0a, 0x49, 0x02, 0x90, 0x18, 0x1c, 0x01, 0x22, 0x03, 0x91, 0x09, 0x49, 0x04, 0x92, 0x30, 0x30, 0x42, 0x78, 0x09, 0x88, 0x01, 0x92, 0x00, 0x91, 0x01, 0x78, 0x5a, 0x6b, 0x0c, 0x33, 0x20, 0x1c, 0xfb, 0xf7, 0x7c, 0xf8, 0x3c, 0x00, 0x9c, 0x08, 0x01, 0x00, 0x05, 0xb0, 0x90, 0xbd, 0xd4, 0xe4, 0x01, 0x00, 0x5d, 0x4e, 0x00, 0x00, 0x48, 0x7b, 0x01, 0x00, 0x90, 0xb5, 0x85, 0xb0, 0x03, 0x1c, 0x00, 0x20, 0x02, 0x90, 0x0a, 0x49, 0x18, 0x1c, 0x00, 0x22, 0x04, 0x92, 0x60, 0x30, 0x03, 0x91, 0xc2, 0x79, 0x01, 0x88, 0x01, 0x92, 0x00, 0x91, 0x5a, 0x6a, 0xdc, 0x68, 0x20, 0x33, 0x99, 0x7b, 0x40, 0x7a, 0x23, 0x1c, 0xfb, 0xf7, 0x3c, 0x00, 0xd8, 0x08, 0x01, 0x00, 0x5d, 0xf8, 0x05, 0xb0, 0x90, 0xbd, 0x00, 0x00, 0x0d, 0x4f, 0x00, 0x00, 0x07, 0x49, 0x80, 0xb5, 0x88, 0x6a, 0x00, 0x28, 0x08, 0xd1, 0x01, 0x20, 0x88, 0x62, 0xf0, 0xf7, 0xaf, 0xfc, 0x01, 0x1c, 0x03, 0x48, 0x00, 0x22, 0xf2, 0xf7, 0xb8, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x41, 0xe4, 0x00, 0x00, 0xf0, 0xb5, 0x9b, 0xb0, 0x00, 0x28, 0x20, 0xd0, 0x3c, 0x00, 0x14, 0x09, 0x01, 0x00, 0x01, 0x1c, 0x08, 0xa8, 0xfc, 0xf7, 0xb2, 0xfd, 0x01, 0x20, 0x11, 0x90, 0x03, 0x20, 0x10, 0xad, 0x28, 0x72, 0x04, 0x20, 0x68, 0x72, 0x05, 0xa8, 0x00, 0x22, 0x69, 0x46, 0xf4, 0xf7, 0x00, 0xff, 0x00, 0x24, 0x00, 0x26, 0x05, 0xa9, 0x00, 0x20, 0xf9, 0xf7, 0xfc, 0xfa, 0x69, 0x46, 0xf9, 0xf7, 0xf9, 0xfa, 0x0b, 0x90, 0x08, 0xa8, 0xfc, 0xf7, 0xbb, 0xfd, 0x01, 0x34, 0x3c, 0x00, 0x50, 0x09, 0x01, 0x00, 0x02, 0x2c, 0x2e, 0x72, 0xf0, 0xdb, 0x1b, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0x90, 0xb5, 0x04, 0x1c, 0x4c, 0x23, 0x0c, 0x49, 0x58, 0x43, 0x43, 0x18, 0x85, 0xb0, 0x00, 0x20, 0x0a, 0x49, 0x02, 0x90, 0x00, 0x22, 0x04, 0x92, 0x3c, 0x20, 0x03, 0x91, 0xc2, 0x5c, 0x08, 0x48, 0x41, 0x88, 0x01, 0x92, 0x41, 0x20, 0x00, 0x91, 0xc1, 0x5c, 0x5a, 0x68, 0x08, 0x33, 0x20, 0x1c, 0x3c, 0x00, 0x8c, 0x09, 0x01, 0x00, 0xfb, 0xf7, 0x02, 0xf8, 0x05, 0xb0, 0x90, 0xbd, 0x58, 0xe3, 0x01, 0x00, 0x75, 0x4f, 0x00, 0x00, 0x3c, 0x7c, 0x01, 0x00, 0xf8, 0xb5, 0x0e, 0x1c, 0x22, 0x4c, 0x38, 0x21, 0x17, 0x1c, 0x05, 0x1c, 0x20, 0x1c, 0xef, 0xf7, 0x75, 0xfd, 0x23, 0x1c, 0x25, 0x33, 0x21, 0x1c, 0x24, 0x31, 0x10, 0x20, 0x6a, 0x46, 0xf9, 0xf7, 0x1d, 0xf8, 0x00, 0xab, 0x18, 0x88, 0x07, 0x21, 0x3c, 0x00, 0xc8, 0x09, 0x01, 0x00, 0x1a, 0x4a, 0x02, 0x38, 0x20, 0x84, 0x20, 0x1c, 0x20, 0x30, 0x81, 0x70, 0xc5, 0x70, 0x11, 0x1c, 0x06, 0x73, 0x47, 0x73, 0x34, 0x31, 0x21, 0x63, 0x30, 0x32, 0x62, 0x63, 0x01, 0x79, 0x25, 0x1c, 0x10, 0x35, 0x21, 0x81, 0x20, 0x60, 0xe5, 0x60, 0x18, 0x88, 0x40, 0x1a, 0x20, 0x83, 0x20, 0x1c, 0x28, 0x30, 0x20, 0x61, 0x20, 0x1c, 0xf9, 0xf7, 0x11, 0xf8, 0x0d, 0x48, 0x3c, 0x00, 0x04, 0x0a, 0x01, 0x00, 0x00, 0x68, 0x00, 0x28, 0x07, 0xd0, 0x06, 0x21, 0x20, 0x1c, 0xf8, 0xf7, 0x47, 0xfd, 0x10, 0x21, 0x28, 0x1c, 0xf8, 0xf7, 0x43, 0xfd, 0x08, 0x48, 0x02, 0x21, 0x01, 0x62, 0x44, 0x62, 0x01, 0x21, 0x01, 0x62, 0x06, 0x48, 0x00, 0x68, 0xef, 0xf7, 0xd5, 0xfc, 0xf8, 0xbd, 0x8c, 0x8e, 0x01, 0x00, 0xe4, 0xfe, 0x01, 0x00, 0xcc, 0x5c, 0x01, 0x00, 0x00, 0x30, 0x07, 0x00, 0x3c, 0x00, 0x40, 0x0a, 0x01, 0x00, 0x5c, 0x5b, 0x01, 0x00, 0xf0, 0xb5, 0x06, 0x1c, 0x40, 0x36, 0x31, 0x8b, 0x04, 0x1c, 0x25, 0x1c, 0x08, 0x07, 0x80, 0x0f, 0x60, 0x35, 0x01, 0x28, 0x85, 0xb0, 0x3b, 0xd0, 0xe8, 0x79, 0x00, 0x28, 0x05, 0xd1, 0x20, 0x69, 0x01, 0x80, 0xb0, 0x8b, 0x21, 0x69, 0xc8, 0x82, 0x07, 0xe0, 0x01, 0x28, 0x05, 0xd1, 0x20, 0x69, 0x01, 0x22, 0x01, 0x88, 0xd2, 0x02, 0x11, 0x43, 0x3c, 0x00, 0x7c, 0x0a, 0x01, 0x00, 0x01, 0x80, 0x20, 0x48, 0x00, 0x78, 0x80, 0x07, 0x26, 0xd5, 0xe8, 0x79, 0x00, 0x28, 0x23, 0xd0, 0xa0, 0x6b, 0x00, 0x28, 0x1c, 0xd0, 0xf4, 0xf7, 0x2f, 0xfe, 0x00, 0x28, 0x09, 0xd0, 0xb8, 0x21, 0x09, 0x58, 0x00, 0x29, 0x05, 0xd0, 0x30, 0x21, 0x09, 0x5d, 0xb4, 0x30, 0x08, 0x18, 0x07, 0x7a, 0x00, 0xe0, 0x00, 0x27, 0x01, 0x21, 0x38, 0x1c, 0xfa, 0xf7, 0x86, 0xf9, 0x3c, 0x00, 0xb8, 0x0a, 0x01, 0x00, 0x04, 0x90, 0x20, 0x69, 0x04, 0x30, 0x39, 0x1c, 0xf4, 0xf7, 0x6c, 0xfd, 0x04, 0x99, 0xfa, 0xf7, 0xd3, 0xf9, 0x02, 0xe0, 0x20, 0x1c, 0xf7, 0xf7, 0xf9, 0xfb, 0x70, 0x83, 0x70, 0x8b, 0x21, 0x69, 0x00, 0x22, 0x48, 0x80, 0x09, 0x49, 0x0a, 0x48, 0x04, 0x92, 0x03, 0x91, 0x02, 0x90, 0xea, 0x79, 0x29, 0x88, 0x01, 0x92, 0x00, 0x91, 0x62, 0x6a, 0xe3, 0x68, 0x20, 0x34, 0x3c, 0x00, 0xf4, 0x0a, 0x01, 0x00, 0xa1, 0x7b, 0x68, 0x7a, 0xfa, 0xf7, 0x4c, 0xff, 0x05, 0xb0, 0xf0, 0xbd, 0x1d, 0x75, 0x01, 0x00, 0xd1, 0x4f, 0x00, 0x00, 0xdd, 0x2f, 0x01, 0x00, 0xfe, 0xb5, 0x04, 0x1c, 0x26, 0x1c, 0x01, 0x20, 0x20, 0x36, 0x00, 0x29, 0x02, 0x90, 0x2e, 0xd0, 0x58, 0x20, 0x00, 0x5b, 0x00, 0x07, 0x80, 0x0f, 0x01, 0x28, 0x01, 0xd1, 0xcc, 0x31, 0x00, 0xe0, 0xb4, 0x31, 0x48, 0x68, 0x3c, 0x00, 0x30, 0x0b, 0x01, 0x00, 0x0d, 0x1c, 0x00, 0x28, 0x24, 0xd0, 0x20, 0x1c, 0x60, 0x30, 0xc2, 0x79, 0x01, 0x21, 0x01, 0x2a, 0x00, 0xd0, 0x00, 0x21, 0x27, 0x1c, 0x62, 0x6d, 0x30, 0x37, 0x00, 0x2a, 0x04, 0xd0, 0x3a, 0x1c, 0x28, 0x1c, 0xf6, 0xf7, 0xe7, 0xfd, 0x07, 0xe0, 0x42, 0x7a, 0x23, 0x1c, 0x68, 0x33, 0x00, 0x92, 0x3a, 0x1c, 0x28, 0x1c, 0xf6, 0xf7, 0x9a, 0xfd, 0x02, 0x90, 0x38, 0x78, 0x3c, 0x00, 0x6c, 0x0b, 0x01, 0x00, 0x40, 0x19, 0x00, 0x7a, 0x01, 0x21, 0xb0, 0x73, 0xfa, 0xf7, 0x26, 0xf9, 0x01, 0xe0, 0x00, 0x20, 0xb0, 0x73, 0x60, 0x62, 0xb0, 0x7b, 0x0d, 0x28, 0x01, 0xd9, 0xf0, 0xf7, 0xbb, 0xfb, 0x02, 0x98, 0xfe, 0xbd, 0x00, 0x00, 0xff, 0xb5, 0x04, 0x1c, 0x80, 0x30, 0x25, 0x1c, 0x5e, 0x35, 0x00, 0x78, 0xae, 0x1d, 0xaf, 0x1f, 0x00, 0x28, 0x83, 0xb0, 0x12, 0xd1, 0xf4, 0xf7, 0x3c, 0x00, 0xa8, 0x0b, 0x01, 0x00, 0xc7, 0xfb, 0x00, 0x28, 0x07, 0xd0, 0x06, 0x98, 0x05, 0x99, 0x02, 0x90, 0x04, 0x98, 0x01, 0x90, 0xa6, 0x61, 0x67, 0x61, 0x0d, 0xe0, 0x04, 0x98, 0x06, 0x99, 0x02, 0x90, 0x05, 0x98, 0x01, 0x90, 0x66, 0x61, 0x05, 0xe0, 0x04, 0xa9, 0x03, 0xc9, 0x02, 0x90, 0x06, 0x98, 0x01, 0x90, 0x67, 0x61, 0xa5, 0x61, 0x06, 0x22, 0x38, 0x1c, 0xef, 0xf7, 0x8b, 0xfc, 0x06, 0x22, 0x3c, 0x00, 0xe4, 0x0b, 0x01, 0x00, 0x28, 0x1c, 0x02, 0x99, 0xef, 0xf7, 0x86, 0xfc, 0x06, 0x22, 0x30, 0x1c, 0x01, 0x99, 0xef, 0xf7, 0x81, 0xfc, 0x07, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x05, 0x28, 0x01, 0xd3, 0xf0, 0xf7, 0x7b, 0xfb, 0x02, 0x49, 0xa0, 0x00, 0x08, 0x58, 0x85, 0x60, 0xb0, 0xbd, 0x10, 0x7b, 0x01, 0x00, 0xf8, 0xb5, 0xff, 0xf7, 0x59, 0xf9, 0x05, 0x1c, 0x3c, 0x00, 0x20, 0x0c, 0x01, 0x00, 0xfe, 0xf7, 0xe8, 0xff, 0x04, 0x1c, 0x28, 0x1c, 0xff, 0xf7, 0x58, 0xf9, 0x00, 0x28, 0x42, 0xd0, 0x69, 0x1e, 0x21, 0x4d, 0x4a, 0x00, 0x20, 0x4b, 0x1c, 0x3d, 0xae, 0x5c, 0x98, 0x5c, 0x30, 0x40, 0xd6, 0x18, 0x01, 0x23, 0xf6, 0x56, 0x52, 0x19, 0xd2, 0x56, 0x96, 0x42, 0x01, 0xdd, 0x15, 0x1c, 0x00, 0xe0, 0x35, 0x1c, 0x18, 0x4b, 0x2a, 0x3b, 0x59, 0x56, 0x51, 0x18, 0x3c, 0x00, 0x5c, 0x0c, 0x01, 0x00, 0xb1, 0x42, 0x00, 0xdb, 0x31, 0x1c, 0x0e, 0x1c, 0x00, 0x28, 0x26, 0xd0, 0xfe, 0xf7, 0xbe, 0xff, 0x00, 0x90, 0x00, 0xab, 0x18, 0x78, 0x12, 0x49, 0x00, 0x23, 0xc9, 0x56, 0x00, 0xab, 0x15, 0x22, 0x10, 0x1a, 0x5b, 0x78, 0x00, 0x1b, 0x40, 0x18, 0xd2, 0x1a, 0x12, 0x1b, 0x51, 0x18, 0x00, 0x22, 0x85, 0x42, 0x02, 0xdb, 0x00, 0xab, 0x1a, 0x70, 0x02, 0xe0, 0x40, 0x1b, 0x3c, 0x00, 0x98, 0x0c, 0x01, 0x00, 0x00, 0xab, 0x18, 0x70, 0x8e, 0x42, 0x02, 0xdb, 0x00, 0xab, 0x5a, 0x70, 0x02, 0xe0, 0x88, 0x1b, 0x00, 0xab, 0x58, 0x70, 0x00, 0x98, 0xff, 0xf7, 0x8d, 0xf8, 0x01, 0xf0, 0xff, 0xf8, 0xf8, 0xbd, 0xe6, 0x78, 0x01, 0x00, 0x65, 0x73, 0x01, 0x00, 0x70, 0xb5, 0x08, 0x4e, 0x06, 0x4d, 0x00, 0x24, 0x06, 0x20, 0x60, 0x43, 0x80, 0x19, 0x06, 0x22, 0x29, 0x1c, 0xef, 0xf7, 0x3c, 0x00, 0xd4, 0x0c, 0x01, 0x00, 0x11, 0xfc, 0x01, 0x34, 0x05, 0x2c, 0xf5, 0xdb, 0x70, 0xbd, 0x00, 0x00, 0x4e, 0x47, 0x01, 0x00, 0xe6, 0x7a, 0x01, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x01, 0x68, 0x03, 0x48, 0xfe, 0xf7, 0x42, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xa8, 0x79, 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x01, 0x68, 0x03, 0x48, 0xfe, 0xf7, 0x4a, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x10, 0x0d, 0x01, 0x00, 0xa8, 0x79, 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, 0x10, 0xb5, 0x00, 0x28, 0x0a, 0xd0, 0x06, 0x4c, 0xa1, 0x69, 0x00, 0x29, 0x01, 0xd1, 0x00, 0x20, 0x00, 0xe0, 0x09, 0x68, 0xf7, 0xf7, 0x38, 0xfb, 0xa0, 0x61, 0x10, 0xbd, 0x00, 0x20, 0x10, 0xbd, 0xa4, 0x6e, 0x01, 0x00, 0xf3, 0xb5, 0x37, 0x48, 0x83, 0xb0, 0x02, 0x90, 0x80, 0x79, 0x0e, 0x1c, 0x00, 0x27, 0x01, 0x90, 0x3c, 0x00, 0x4c, 0x0d, 0x01, 0x00, 0x34, 0x48, 0x35, 0x4a, 0x01, 0x6a, 0x03, 0x9c, 0x03, 0x1c, 0x1b, 0x69, 0xa1, 0x42, 0x01, 0xd0, 0x93, 0x61, 0x00, 0xe0, 0x53, 0x61, 0x31, 0x49, 0x8a, 0x68, 0x96, 0x42, 0x3f, 0xd0, 0x2d, 0x48, 0x8e, 0x60, 0xc1, 0x68, 0x00, 0x24, 0x25, 0x1c, 0x00, 0x29, 0x2d, 0x48, 0x09, 0xd0, 0x00, 0x2e, 0x0b, 0xd0, 0x28, 0x48, 0x01, 0x24, 0xc0, 0x6a, 0x24, 0x03, 0x00, 0x28, 0x3c, 0x00, 0x88, 0x0d, 0x01, 0x00, 0x06, 0xd0, 0x01, 0x27, 0x04, 0xe0, 0x00, 0x2e, 0x01, 0xd0, 0x05, 0x1c, 0xf9, 0xe7, 0x04, 0x1c, 0x00, 0x2f, 0x06, 0xd0, 0xfb, 0xf7, 0x1e, 0xfb, 0x1f, 0x48, 0x01, 0x68, 0x22, 0x48, 0xfe, 0xf7, 0xfb, 0xfa, 0x20, 0x1c, 0x28, 0x43, 0x0e, 0xd0, 0x2a, 0x1c, 0x21, 0x1c, 0x01, 0x20, 0x02, 0xf0, 0x21, 0xfe, 0x2a, 0x1c, 0x21, 0x1c, 0x02, 0x20, 0x02, 0xf0, 0x1c, 0xfe, 0x3c, 0x00, 0xc4, 0x0d, 0x01, 0x00, 0x2a, 0x1c, 0x21, 0x1c, 0x03, 0x20, 0x02, 0xf0, 0x17, 0xfe, 0x00, 0x2f, 0x06, 0xd1, 0x13, 0x48, 0x01, 0x68, 0x16, 0x48, 0xfe, 0xf7, 0xce, 0xfa, 0xfa, 0xf7, 0x42, 0xfd, 0x03, 0x9c, 0x00, 0x2c, 0x01, 0xd1, 0x01, 0xf0, 0xe1, 0xff, 0x01, 0xa9, 0x03, 0xc9, 0x88, 0x71, 0x01, 0xf0, 0xdc, 0xff, 0x0a, 0x4c, 0x0a, 0x4b, 0x44, 0x3c, 0xa1, 0x69, 0x22, 0x69, 0x08, 0x3b, 0x3c, 0x00, 0x00, 0x0e, 0x01, 0x00, 0x41, 0x1a, 0x00, 0x2a, 0x03, 0xd0, 0x1a, 0x68, 0x51, 0x18, 0x19, 0x60, 0x02, 0xe0, 0x5a, 0x68, 0x51, 0x18, 0x59, 0x60, 0xa0, 0x61, 0x26, 0x61, 0x05, 0xb0, 0xf0, 0xbd, 0x20, 0x10, 0x07, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x10, 0x00, 0x07, 0x00, 0xb0, 0x57, 0x01, 0x00, 0x00, 0x10, 0x60, 0x00, 0x84, 0x73, 0x01, 0x00, 0x1c, 0xb5, 0x4c, 0x23, 0x08, 0x49, 0x58, 0x43, 0x3c, 0x00, 0x3c, 0x0e, 0x01, 0x00, 0x44, 0x18, 0x20, 0x1c, 0x40, 0x30, 0x41, 0x78, 0x62, 0x68, 0x00, 0x91, 0x01, 0x92, 0x3f, 0x21, 0x0b, 0x5d, 0x61, 0x8f, 0x00, 0x78, 0x62, 0x6c, 0xfa, 0xf7, 0x28, 0xf8, 0xa0, 0x85, 0x1c, 0xbd, 0x58, 0xe3, 0x01, 0x00, 0xb0, 0xb5, 0x16, 0x4d, 0xa9, 0x69, 0x00, 0x29, 0x25, 0xd0, 0x2c, 0x1c, 0x30, 0x34, 0x20, 0x7a, 0x00, 0x28, 0x20, 0xd0, 0x00, 0x23, 0x81, 0x22, 0x3c, 0x00, 0x78, 0x0e, 0x01, 0x00, 0x18, 0x20, 0x02, 0xf0, 0x89, 0xfc, 0x20, 0x7a, 0xff, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x20, 0x72, 0x12, 0xd1, 0x0c, 0x48, 0x28, 0x21, 0x2c, 0x38, 0x09, 0x5c, 0x21, 0x72, 0x29, 0x7a, 0x00, 0x29, 0x01, 0xd1, 0x00, 0x6a, 0x00, 0xe0, 0x40, 0x6a, 0xa9, 0x69, 0x80, 0x02, 0x81, 0x42, 0x03, 0xd2, 0x49, 0x00, 0x81, 0x42, 0x01, 0xd2, 0xa9, 0x61, 0xb0, 0xbd, 0xa8, 0x61, 0x3c, 0x00, 0xb4, 0x0e, 0x01, 0x00, 0xb0, 0xbd, 0x01, 0xf0, 0x1d, 0xf9, 0xb0, 0xbd, 0xf4, 0x6e, 0x01, 0x00, 0x7f, 0xb5, 0x05, 0x1c, 0x04, 0x20, 0x6b, 0x46, 0x1b, 0x18, 0x02, 0x90, 0x00, 0x26, 0x28, 0x18, 0x6a, 0x46, 0x02, 0xa9, 0xfc, 0xf7, 0x8a, 0xfb, 0x00, 0x28, 0x06, 0xd1, 0x00, 0xab, 0x18, 0x79, 0x04, 0x28, 0x08, 0xd0, 0x18, 0x79, 0x03, 0x28, 0x05, 0xd0, 0x00, 0xab, 0x18, 0x79, 0x10, 0x21, 0x3c, 0x00, 0xf0, 0x0e, 0x01, 0x00, 0x08, 0x43, 0x04, 0xb0, 0x70, 0xbd, 0x03, 0xa9, 0xe8, 0x68, 0xf6, 0xf7, 0xd3, 0xff, 0x00, 0x28, 0x05, 0xd0, 0x03, 0x98, 0x20, 0x21, 0x08, 0x43, 0x00, 0x06, 0x00, 0x0e, 0xf1, 0xe7, 0x03, 0xa9, 0x00, 0x20, 0xf6, 0xf7, 0xc7, 0xff, 0x04, 0x1c, 0x01, 0xd1, 0x02, 0x20, 0xe9, 0xe7, 0xe8, 0x68, 0x00, 0xab, 0x20, 0x60, 0x00, 0x98, 0x60, 0x60, 0x18, 0x79, 0xa0, 0x76, 0x3c, 0x00, 0x2c, 0x0f, 0x01, 0x00, 0xa8, 0x8c, 0x60, 0x76, 0xe8, 0x69, 0x20, 0x61, 0x68, 0x8c, 0xa0, 0x82, 0x28, 0x8c, 0x20, 0x76, 0x69, 0x69, 0x09, 0x48, 0x81, 0x42, 0x00, 0xd9, 0x08, 0x1c, 0xa0, 0x60, 0x20, 0x1c, 0x02, 0xf0, 0xa1, 0xfd, 0xa1, 0x68, 0x00, 0x29, 0x04, 0xd0, 0x03, 0x9a, 0xa1, 0x32, 0x08, 0x20, 0x02, 0xf0, 0x37, 0xfb, 0x30, 0x1c, 0xc7, 0xe7, 0x00, 0x00, 0xa0, 0x86, 0x01, 0x00, 0x3c, 0x00, 0x68, 0x0f, 0x01, 0x00, 0xfe, 0xb5, 0x06, 0x1c, 0x40, 0x78, 0x01, 0x24, 0x06, 0x28, 0x50, 0xd3, 0xc1, 0x1e, 0x03, 0x20, 0xef, 0xf7, 0x5e, 0xfb, 0x00, 0x90, 0x0e, 0x28, 0x49, 0xd8, 0x00, 0x20, 0x0a, 0xe0, 0x41, 0x00, 0x09, 0x18, 0x89, 0x19, 0x4a, 0x79, 0x89, 0x79, 0x51, 0x18, 0x01, 0x39, 0x0e, 0x29, 0x00, 0xd9, 0x00, 0x24, 0x01, 0x30, 0x00, 0x99, 0x88, 0x42, 0xf1, 0xdb, 0x00, 0x2c, 0x3c, 0x00, 0xa4, 0x0f, 0x01, 0x00, 0x37, 0xd0, 0x03, 0x22, 0xb1, 0x1c, 0x1b, 0x48, 0xef, 0xf7, 0xa4, 0xfa, 0x1a, 0x4c, 0x1c, 0x21, 0x20, 0x1c, 0xef, 0xf7, 0x4d, 0xfa, 0x00, 0x25, 0x28, 0xe0, 0x69, 0x00, 0x49, 0x19, 0x02, 0x91, 0x8a, 0x19, 0x53, 0x79, 0x15, 0x48, 0x43, 0x54, 0x93, 0x79, 0x0f, 0x18, 0x7b, 0x70, 0xd3, 0x79, 0xbb, 0x70, 0x07, 0x23, 0xd2, 0x56, 0x01, 0x92, 0x44, 0x5c, 0x0f, 0xe0, 0x3c, 0x00, 0xe0, 0x0f, 0x01, 0x00, 0x20, 0x1c, 0xfe, 0xf7, 0x7b, 0xff, 0x00, 0x28, 0x07, 0xd0, 0x0c, 0x4a, 0x60, 0x00, 0x80, 0x18, 0x01, 0x21, 0x10, 0x38, 0x81, 0x73, 0x01, 0x99, 0xc1, 0x73, 0x01, 0x34, 0x24, 0x06, 0x24, 0x0e, 0x07, 0x48, 0x02, 0x99, 0x40, 0x5c, 0x79, 0x78, 0x40, 0x18, 0xa0, 0x42, 0xe8, 0xd8, 0x01, 0x35, 0x00, 0x98, 0x85, 0x42, 0xd3, 0xdb, 0xfe, 0xbd, 0xe8, 0x62, 0x01, 0x00, 0x3c, 0x00, 0x1c, 0x10, 0x01, 0x00, 0xe6, 0x78, 0x01, 0x00, 0xeb, 0x62, 0x01, 0x00, 0x01, 0x68, 0x0f, 0x29, 0x01, 0xdd, 0x0f, 0x21, 0x01, 0x60, 0x01, 0x68, 0x00, 0x29, 0x01, 0xda, 0x00, 0x21, 0x01, 0x60, 0x70, 0x47, 0x00, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0x1e, 0x48, 0x22, 0x1d, 0x05, 0x68, 0x00, 0x92, 0x16, 0x1c, 0x23, 0x1c, 0x0f, 0x1c, 0xcc, 0x33, 0x2a, 0x1c, 0x20, 0x1c, 0x70, 0x30, 0xa1, 0x6d, 0x3c, 0x00, 0x58, 0x10, 0x01, 0x00, 0x00, 0xf0, 0x3e, 0xf9, 0x00, 0x96, 0xa1, 0x6d, 0x27, 0x20, 0x01, 0x40, 0x23, 0x1c, 0xe4, 0x33, 0x20, 0x1c, 0x2a, 0x1c, 0x5c, 0x30, 0x00, 0xf0, 0x33, 0xf9, 0x13, 0x48, 0x00, 0x78, 0x0e, 0x28, 0x01, 0xd2, 0x01, 0x25, 0x85, 0x40, 0x11, 0x48, 0xa1, 0x69, 0x00, 0x78, 0x29, 0x40, 0x00, 0x07, 0x0b, 0xd4, 0x48, 0x07, 0x03, 0xd5, 0x08, 0x07, 0x01, 0xd5, 0x04, 0x20, 0x3c, 0x00, 0x94, 0x10, 0x01, 0x00, 0x81, 0x43, 0x88, 0x06, 0x03, 0xd5, 0x48, 0x06, 0x01, 0xd5, 0x20, 0x20, 0x81, 0x43, 0x23, 0x1c, 0xb4, 0x33, 0x2a, 0x1c, 0x20, 0x1c, 0x30, 0x30, 0x00, 0x96, 0x00, 0xf0, 0x13, 0xf9, 0x39, 0x1c, 0x20, 0x1c, 0xf0, 0xf7, 0x47, 0xfc, 0xf8, 0xbd, 0x2c, 0x7d, 0x01, 0x00, 0x10, 0x67, 0x01, 0x00, 0x1d, 0x75, 0x01, 0x00, 0xb0, 0xb5, 0xf2, 0xf7, 0x27, 0xfc, 0xfe, 0xf7, 0x3c, 0x00, 0xd0, 0x10, 0x01, 0x00, 0x09, 0xf9, 0x0f, 0x48, 0x00, 0x25, 0x45, 0x70, 0x0e, 0x48, 0x0d, 0x4c, 0x00, 0x88, 0x5b, 0x34, 0xa0, 0x82, 0xf9, 0xf7, 0x23, 0xfd, 0x20, 0x61, 0xa0, 0x8a, 0x00, 0x28, 0x04, 0xd0, 0x01, 0x21, 0x89, 0x05, 0xef, 0xf7, 0x0d, 0xfb, 0xe1, 0x82, 0x05, 0x48, 0x01, 0x38, 0x45, 0x60, 0x01, 0xf0, 0x55, 0xfe, 0x02, 0x1c, 0x23, 0x1c, 0x00, 0x21, 0x00, 0x20, 0xf4, 0xf7, 0x3c, 0x00, 0x0c, 0x11, 0x01, 0x00, 0x49, 0xfd, 0xb0, 0xbd, 0x45, 0x7d, 0x01, 0x00, 0xf4, 0x67, 0x01, 0x00, 0x70, 0xb5, 0x16, 0x1c, 0x5a, 0x89, 0x04, 0x1c, 0x04, 0x98, 0x92, 0x07, 0x92, 0x0f, 0x00, 0x25, 0x00, 0x29, 0xa2, 0x71, 0x09, 0xd0, 0x05, 0x21, 0xf9, 0xf7, 0x24, 0xfb, 0x00, 0x28, 0x01, 0xd0, 0xc0, 0x78, 0x00, 0xe0, 0x01, 0x20, 0xe0, 0x71, 0x00, 0xe0, 0xe5, 0x71, 0xe5, 0x60, 0xa6, 0x60, 0x3c, 0x00, 0x48, 0x11, 0x01, 0x00, 0x70, 0xbd, 0x00, 0x00, 0xfe, 0xb5, 0x05, 0x1c, 0x0e, 0x22, 0x9c, 0x30, 0x16, 0x49, 0xef, 0xf7, 0xcf, 0xf9, 0x29, 0x1c, 0x28, 0x1c, 0x80, 0x30, 0x88, 0x31, 0x00, 0x24, 0x2f, 0x1c, 0x60, 0x37, 0x02, 0x91, 0x01, 0x90, 0x20, 0x06, 0x00, 0x0e, 0x06, 0x1c, 0xf9, 0xf7, 0x0d, 0xfe, 0x00, 0x28, 0x03, 0xd0, 0x01, 0x98, 0x42, 0x68, 0x02, 0x99, 0x01, 0xe0, 0xea, 0x6d, 0x3c, 0x00, 0x84, 0x11, 0x01, 0x00, 0x39, 0x1c, 0x00, 0x2a, 0x0d, 0xd0, 0x00, 0x20, 0x03, 0xe0, 0x0b, 0x5c, 0xb3, 0x42, 0x02, 0xd8, 0x01, 0x30, 0x90, 0x42, 0xf9, 0xdb, 0x08, 0x18, 0x10, 0x38, 0xc0, 0x7b, 0x29, 0x19, 0x90, 0x31, 0x08, 0x73, 0x01, 0x34, 0x0e, 0x2c, 0xdf, 0xd3, 0xfe, 0xbd, 0x00, 0x00, 0xcc, 0x47, 0x01, 0x00, 0xff, 0xb5, 0x81, 0xb0, 0x14, 0x1c, 0x10, 0x1c, 0x06, 0x22, 0x0d, 0x1c, 0x3c, 0x00, 0xc0, 0x11, 0x01, 0x00, 0x19, 0x1c, 0x0b, 0x9e, 0x0a, 0x9f, 0xef, 0xf7, 0x97, 0xf9, 0x06, 0x22, 0x39, 0x1c, 0xa0, 0x18, 0xef, 0xf7, 0x92, 0xf9, 0xe6, 0x60, 0x2c, 0x60, 0x10, 0x20, 0x28, 0x81, 0x6e, 0x60, 0x01, 0x98, 0xe8, 0x60, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x00, 0x20, 0x20, 0x61, 0x58, 0x20, 0x00, 0x5d, 0x0e, 0x1c, 0x15, 0x1c, 0xc0, 0x07, 0xc0, 0x17, 0x3c, 0x00, 0xfc, 0x11, 0x01, 0x00, 0x01, 0x30, 0xe0, 0x61, 0x21, 0x6b, 0x00, 0x29, 0x36, 0xd1, 0x1e, 0x49, 0x09, 0x68, 0x29, 0x43, 0x32, 0xd0, 0xa1, 0x68, 0x89, 0x8a, 0x00, 0x29, 0x2e, 0xd0, 0x00, 0x28, 0x0b, 0xd0, 0x20, 0x1c, 0x58, 0x30, 0x00, 0xf0, 0xf3, 0xfd, 0x00, 0x28, 0x1b, 0xd0, 0x81, 0x6a, 0x02, 0x6a, 0x40, 0x6a, 0x09, 0x78, 0x00, 0x78, 0x06, 0xe0, 0x14, 0x4a, 0x3c, 0x23, 0x11, 0x78, 0x3c, 0x00, 0x38, 0x12, 0x01, 0x00, 0x50, 0x78, 0x43, 0x43, 0x9a, 0x18, 0x04, 0x32, 0x00, 0x2d, 0x03, 0xd1, 0x02, 0x29, 0x01, 0xd0, 0x03, 0x29, 0x02, 0xd1, 0x6d, 0x21, 0x22, 0x61, 0x08, 0x55, 0x20, 0x69, 0x00, 0x28, 0x0d, 0xd0, 0x81, 0x88, 0x00, 0x29, 0x01, 0xd1, 0x01, 0x20, 0x70, 0xbd, 0x80, 0x79, 0x02, 0x28, 0x05, 0xd1, 0x22, 0x1c, 0x07, 0x49, 0x07, 0x48, 0xf8, 0xf7, 0x4b, 0xff, 0x02, 0xe0, 0x3c, 0x00, 0x74, 0x12, 0x01, 0x00, 0x20, 0x1c, 0xef, 0xf7, 0xb5, 0xf8, 0x00, 0x20, 0x70, 0xbd, 0x00, 0x00, 0x28, 0x61, 0x01, 0x00, 0x68, 0x61, 0x01, 0x00, 0xa1, 0xda, 0x00, 0x00, 0xa0, 0x6a, 0x01, 0x00, 0x10, 0xb5, 0x00, 0x21, 0x00, 0x20, 0xf9, 0xf7, 0x39, 0xfe, 0xc4, 0x00, 0xf9, 0xf7, 0x54, 0xfe, 0x24, 0x18, 0xf9, 0xf7, 0x47, 0xfe, 0x08, 0x49, 0x20, 0x18, 0x09, 0x88, 0x08, 0x4c, 0x40, 0x18, 0x3c, 0x00, 0xb0, 0x12, 0x01, 0x00, 0x06, 0x49, 0x09, 0x88, 0x40, 0x18, 0x60, 0x61, 0xf9, 0xf7, 0x46, 0xfe, 0x05, 0x49, 0x09, 0x88, 0x40, 0x18, 0x40, 0x00, 0xa0, 0x61, 0x10, 0xbd, 0x02, 0x61, 0x01, 0x00, 0x04, 0x61, 0x01, 0x00, 0xd4, 0x79, 0x01, 0x00, 0xa6, 0x69, 0x01, 0x00, 0x11, 0x40, 0x08, 0x1c, 0x10, 0xb5, 0x1c, 0x1c, 0x19, 0x1c, 0x08, 0x31, 0x18, 0x60, 0xf1, 0xf7, 0x31, 0xfe, 0x60, 0x60, 0x3c, 0x00, 0xec, 0x12, 0x01, 0x00, 0x10, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x22, 0x48, 0x0f, 0x1c, 0x41, 0x68, 0x91, 0x42, 0x03, 0xd0, 0x00, 0x21, 0x81, 0x60, 0xc1, 0x60, 0x42, 0x60, 0xc4, 0x68, 0x15, 0xe0, 0x28, 0x20, 0x1d, 0x49, 0x60, 0x43, 0x40, 0x18, 0x05, 0x1c, 0x06, 0x22, 0x31, 0x1c, 0xef, 0xf7, 0x70, 0xf8, 0x00, 0x28, 0x07, 0xd1, 0xa8, 0x1d, 0x39, 0x1c, 0xf9, 0xf7, 0x10, 0xfd, 0x3c, 0x00, 0x28, 0x13, 0x01, 0x00, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x20, 0xf8, 0xbd, 0x01, 0x34, 0x24, 0x07, 0x24, 0x0f, 0x12, 0x48, 0x80, 0x68, 0x84, 0x42, 0xe5, 0xd1, 0x10, 0x4c, 0x28, 0x23, 0xa0, 0x68, 0x0f, 0x4d, 0x58, 0x43, 0x40, 0x19, 0x06, 0x22, 0x31, 0x1c, 0xef, 0xf7, 0xd3, 0xf8, 0xa0, 0x68, 0x28, 0x23, 0x58, 0x43, 0x40, 0x19, 0x06, 0x30, 0x22, 0x22, 0x39, 0x1c, 0xef, 0xf7, 0xca, 0xf8, 0x3c, 0x00, 0x64, 0x13, 0x01, 0x00, 0xa0, 0x68, 0x01, 0x30, 0x00, 0x07, 0x00, 0x0f, 0xa0, 0x60, 0xe1, 0x68, 0x81, 0x42, 0x03, 0xd1, 0x01, 0x31, 0x08, 0x07, 0x00, 0x0f, 0xe0, 0x60, 0x00, 0x20, 0xd6, 0xe7, 0xec, 0x65, 0x01, 0x00, 0xa0, 0xf4, 0x01, 0x00, 0x10, 0xb5, 0x00, 0x21, 0x03, 0x20, 0x00, 0xf0, 0xe5, 0xff, 0x05, 0x4c, 0xa0, 0x68, 0x00, 0x28, 0x04, 0xd1, 0x01, 0xf0, 0x07, 0xfd, 0x61, 0x68, 0x3c, 0x00, 0xa0, 0x13, 0x01, 0x00, 0x40, 0x1a, 0x60, 0x60, 0x10, 0xbd, 0x00, 0x00, 0xd0, 0x60, 0x01, 0x00, 0x02, 0x68, 0x0a, 0x60, 0x01, 0x60, 0x70, 0x47, 0x01, 0x1c, 0x00, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x02, 0x68, 0x0a, 0x60, 0x70, 0x47, 0x00, 0x00, 0xfe, 0xb5, 0x14, 0x1c, 0x1d, 0x1c, 0x00, 0x22, 0xd2, 0x43, 0x01, 0xab, 0xf3, 0xf7, 0x82, 0xff, 0x01, 0x98, 0x00, 0x26, 0x28, 0x40, 0x01, 0x90, 0x3c, 0x00, 0xdc, 0x13, 0x01, 0x00, 0x00, 0x25, 0x00, 0x27, 0x20, 0x60, 0x1e, 0xe0, 0x01, 0x21, 0xb9, 0x40, 0x0a, 0x1c, 0x02, 0x40, 0x18, 0xd0, 0x88, 0x43, 0x01, 0x90, 0x39, 0x06, 0x09, 0x0e, 0x70, 0x19, 0x00, 0x19, 0x02, 0x91, 0x01, 0x77, 0x08, 0x1c, 0xf9, 0xf7, 0xc6, 0xfc, 0x00, 0x28, 0x06, 0xd0, 0x30, 0x1c, 0x00, 0x19, 0x01, 0x36, 0x02, 0x99, 0x30, 0x30, 0x01, 0x70, 0x04, 0xe0, 0x28, 0x1c, 0x3c, 0x00, 0x18, 0x14, 0x01, 0x00, 0x01, 0x35, 0x02, 0x99, 0x00, 0x19, 0x01, 0x72, 0x01, 0x37, 0x01, 0x98, 0x00, 0x28, 0xdd, 0xd1, 0x70, 0x19, 0xa0, 0x61, 0x65, 0x60, 0xe6, 0x62, 0xfe, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x14, 0x4d, 0x04, 0x1c, 0x28, 0x7a, 0x01, 0x28, 0x02, 0xd1, 0x04, 0x20, 0xf6, 0xf7, 0xad, 0xf9, 0x21, 0x1c, 0xa8, 0x6a, 0xf5, 0xf7, 0x21, 0xfc, 0x00, 0x28, 0x03, 0xd1, 0x04, 0x20, 0x3c, 0x00, 0x54, 0x14, 0x01, 0x00, 0xf6, 0xf7, 0xa4, 0xf9, 0xb0, 0xbd, 0x02, 0x20, 0x28, 0x70, 0x28, 0x8c, 0x00, 0x28, 0x00, 0xd0, 0x60, 0x81, 0x68, 0x8c, 0x00, 0x28, 0x00, 0xd0, 0xa0, 0x81, 0xa8, 0x8c, 0x00, 0x28, 0x00, 0xd0, 0xe0, 0x81, 0xe8, 0x69, 0x01, 0x23, 0x02, 0x04, 0x12, 0x0c, 0x20, 0x1c, 0x02, 0x49, 0xfc, 0xf7, 0x19, 0xff, 0xb0, 0xbd, 0xf4, 0x6e, 0x01, 0x00, 0xa1, 0x77, 0x00, 0x00, 0x3c, 0x00, 0x90, 0x14, 0x01, 0x00, 0xf8, 0xb5, 0x19, 0x4e, 0x05, 0x1c, 0xb0, 0x69, 0x00, 0x28, 0x00, 0xd1, 0x30, 0x68, 0xff, 0xf7, 0x3b, 0xfc, 0x15, 0x4f, 0x04, 0x1c, 0x50, 0x37, 0x00, 0x28, 0x0b, 0xd0, 0x60, 0x68, 0x29, 0x1c, 0x78, 0x60, 0x01, 0x20, 0x38, 0x63, 0x20, 0x1c, 0xf5, 0xf7, 0xea, 0xfb, 0x00, 0x28, 0x04, 0xd1, 0x00, 0x20, 0xf8, 0xbd, 0x00, 0x23, 0xfb, 0x62, 0xfa, 0xe7, 0x00, 0x23, 0x3c, 0x00, 0xcc, 0x14, 0x01, 0x00, 0x23, 0x77, 0xf8, 0x6a, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0xf8, 0x62, 0x38, 0x7a, 0x01, 0x28, 0x07, 0xd0, 0xf8, 0x69, 0x06, 0x49, 0x02, 0x04, 0x12, 0x0c, 0x28, 0x1c, 0xfc, 0xf7, 0xe6, 0xfe, 0x01, 0xe0, 0xfb, 0x62, 0xb3, 0x61, 0x01, 0x20, 0xe5, 0xe7, 0x00, 0x00, 0xa4, 0x6e, 0x01, 0x00, 0xdd, 0x02, 0x01, 0x00, 0x70, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x16, 0x1c, 0x3c, 0x00, 0x08, 0x15, 0x01, 0x00, 0x04, 0x2c, 0x1b, 0xd2, 0x10, 0x48, 0x83, 0x42, 0x07, 0xd2, 0x58, 0x00, 0x0f, 0x49, 0xef, 0xf7, 0xfb, 0xf8, 0xff, 0x30, 0x00, 0x0a, 0x01, 0x38, 0x00, 0xe0, 0x00, 0x20, 0x1f, 0x35, 0xea, 0x06, 0x61, 0x07, 0x09, 0x0e, 0xd2, 0x0e, 0x11, 0x43, 0x72, 0x07, 0x52, 0x0d, 0x11, 0x43, 0x00, 0x06, 0x00, 0x0a, 0x08, 0x43, 0x06, 0x4a, 0xa1, 0x00, 0x50, 0x50, 0x70, 0xbd, 0x3c, 0x00, 0x44, 0x15, 0x01, 0x00, 0x01, 0x21, 0x8d, 0x20, 0xef, 0xf7, 0xac, 0xfe, 0x70, 0xbd, 0x00, 0x00, 0x40, 0x9c, 0x00, 0x00, 0x00, 0x80, 0x38, 0x01, 0xe8, 0x60, 0x01, 0x00, 0x09, 0x4a, 0x80, 0x00, 0x10, 0x58, 0x40, 0x09, 0x40, 0x01, 0x07, 0x22, 0x02, 0x43, 0x07, 0x48, 0x03, 0x68, 0x00, 0x2b, 0xfc, 0xdb, 0x42, 0x60, 0x09, 0x06, 0x01, 0x60, 0x01, 0x68, 0x00, 0x29, 0xfc, 0xdb, 0x08, 0x20, 0x3c, 0x00, 0x80, 0x15, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0xe8, 0x60, 0x01, 0x00, 0x30, 0x20, 0x07, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, 0x07, 0x49, 0xa0, 0x00, 0x08, 0x58, 0x00, 0x28, 0x03, 0xd1, 0x02, 0x21, 0x8d, 0x20, 0xef, 0xf7, 0x80, 0xfe, 0x29, 0x1c, 0x20, 0x1c, 0xf6, 0xf7, 0xa8, 0xfa, 0xb0, 0xbd, 0x00, 0x00, 0xe8, 0x60, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, 0x07, 0x49, 0x3c, 0x00, 0xbc, 0x15, 0x01, 0x00, 0xa0, 0x00, 0x08, 0x58, 0x00, 0x28, 0x03, 0xd1, 0x02, 0x21, 0x8d, 0x20, 0xef, 0xf7, 0x6c, 0xfe, 0x29, 0x1c, 0x20, 0x1c, 0xff, 0xf7, 0xc4, 0xff, 0xb0, 0xbd, 0x00, 0x00, 0xe8, 0x60, 0x01, 0x00, 0xf8, 0xb5, 0x0d, 0x1c, 0x16, 0x1c, 0xf7, 0xf7, 0x17, 0xf9, 0x04, 0x1c, 0x28, 0x68, 0x40, 0x4f, 0x81, 0x78, 0x00, 0x29, 0x3b, 0xd1, 0xc1, 0x78, 0x00, 0x29, 0x58, 0xd1, 0x3c, 0x00, 0xf8, 0x15, 0x01, 0x00, 0xf8, 0xf7, 0xf8, 0xf9, 0x22, 0x8e, 0x61, 0x8e, 0x8a, 0x42, 0x04, 0xd0, 0xa1, 0x6a, 0x09, 0x18, 0xe0, 0x69, 0x81, 0x42, 0x10, 0xd9, 0x38, 0x49, 0x32, 0x1c, 0x48, 0x6b, 0x01, 0x30, 0x48, 0x63, 0x20, 0x6a, 0x01, 0x30, 0x20, 0x62, 0x38, 0x68, 0x01, 0x30, 0x38, 0x60, 0xe0, 0x68, 0x63, 0x69, 0x29, 0x1c, 0xee, 0xf7, 0xd8, 0xfe, 0xf8, 0xbd, 0x01, 0x32, 0x12, 0x04, 0x3c, 0x00, 0x34, 0x16, 0x01, 0x00, 0x12, 0x0c, 0x22, 0x86, 0xa1, 0x62, 0xb8, 0x68, 0x00, 0x28, 0x34, 0xd1, 0x2c, 0x48, 0x0c, 0x23, 0x00, 0x68, 0x1b, 0x1a, 0x9a, 0x42, 0x07, 0xd2, 0x19, 0x23, 0x9b, 0x01, 0xaf, 0x22, 0x92, 0x01, 0x58, 0x43, 0x10, 0x1a, 0x81, 0x42, 0x26, 0xd3, 0x01, 0x20, 0xb8, 0x60, 0x01, 0x21, 0x0c, 0x20, 0x00, 0xf0, 0x7a, 0xfe, 0x1f, 0xe0, 0x01, 0x29, 0x1d, 0xd1, 0xc0, 0x78, 0x3c, 0x00, 0x70, 0x16, 0x01, 0x00, 0x17, 0x28, 0x1a, 0xd1, 0xa0, 0x8e, 0xe1, 0x8e, 0x88, 0x42, 0x14, 0xd3, 0xe9, 0x68, 0x09, 0x68, 0x09, 0x79, 0x09, 0x06, 0x0f, 0xd5, 0x60, 0x6a, 0x32, 0x1c, 0x01, 0x30, 0x60, 0x62, 0xe0, 0x68, 0x63, 0x69, 0x29, 0x1c, 0xee, 0xf7, 0xa3, 0xfe, 0xe8, 0x68, 0x01, 0x68, 0x08, 0x31, 0x0b, 0x20, 0x00, 0xf0, 0x5c, 0xfe, 0xc3, 0xe7, 0x01, 0x30, 0xa0, 0x86, 0xa0, 0x8d, 0x3c, 0x00, 0xac, 0x16, 0x01, 0x00, 0xe1, 0x8d, 0x88, 0x42, 0x04, 0xd1, 0x03, 0x21, 0x02, 0x20, 0xef, 0xf7, 0xf5, 0xfd, 0xb8, 0xe7, 0x60, 0x68, 0x45, 0x60, 0x86, 0x60, 0x00, 0x68, 0x60, 0x60, 0xf8, 0x68, 0x01, 0x30, 0xf8, 0x60, 0xa0, 0x8d, 0x41, 0x1c, 0xa1, 0x85, 0x00, 0x28, 0xab, 0xd1, 0x08, 0x48, 0xb9, 0x69, 0xfd, 0xf7, 0x61, 0xfe, 0x22, 0x1c, 0x02, 0x21, 0xf1, 0x20, 0x02, 0xf0, 0x64, 0xf8, 0x3c, 0x00, 0xe8, 0x16, 0x01, 0x00, 0xa1, 0xe7, 0x00, 0x00, 0xfc, 0x5a, 0x01, 0x00, 0x90, 0x5c, 0x01, 0x00, 0x18, 0x57, 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x1c, 0x02, 0x21, 0xf0, 0x20, 0x02, 0xf0, 0x54, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x28, 0x03, 0xd1, 0x02, 0x48, 0x41, 0x78, 0xc9, 0x07, 0xfc, 0xd5, 0x70, 0x47, 0x00, 0x00, 0x04, 0x00, 0x07, 0x00, 0x80, 0xb5, 0x00, 0x06, 0x3c, 0x00, 0x24, 0x17, 0x01, 0x00, 0x01, 0xd1, 0xf1, 0xf7, 0x71, 0xfe, 0x80, 0xbd, 0x80, 0xb5, 0xf4, 0xf7, 0xe5, 0xfa, 0x80, 0xbd, 0x80, 0xb5, 0xf6, 0xf7, 0xeb, 0xf8, 0x80, 0xbd, 0x01, 0x49, 0x00, 0x20, 0x08, 0x74, 0x70, 0x47, 0x78, 0x69, 0x01, 0x00, 0x80, 0xb5, 0xc0, 0x07, 0x03, 0xd5, 0x02, 0x49, 0x01, 0x20, 0x00, 0xf0, 0x1d, 0xfc, 0x80, 0xbd, 0x50, 0xc3, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0e, 0x3c, 0x00, 0x60, 0x17, 0x01, 0x00, 0x01, 0x28, 0x80, 0xb5, 0x02, 0xd1, 0xf6, 0xf7, 0xe1, 0xf9, 0x80, 0xbd, 0x00, 0x28, 0xfc, 0xd1, 0xf1, 0xf7, 0x4c, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0xf6, 0xf7, 0xd7, 0xf9, 0x80, 0xbd, 0x03, 0x49, 0x80, 0xb5, 0x00, 0x20, 0x08, 0x74, 0xf6, 0xf7, 0xfe, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x06, 0x00, 0x0e, 0xf1, 0xf7, 0x3c, 0x00, 0x9c, 0x17, 0x01, 0x00, 0x71, 0xfe, 0x80, 0xbd, 0x10, 0xb5, 0x01, 0x28, 0x08, 0xd0, 0x02, 0x28, 0x03, 0xd0, 0x03, 0x28, 0x01, 0xd0, 0xef, 0xf7, 0xa7, 0xfd, 0xf6, 0xf7, 0xe9, 0xf9, 0x10, 0xbd, 0x01, 0xf0, 0xf8, 0xfa, 0x04, 0x1c, 0xfa, 0xf7, 0x5d, 0xfd, 0x24, 0x1a, 0xfa, 0xf7, 0x3e, 0xfd, 0x08, 0x49, 0x00, 0x28, 0x0b, 0xd0, 0x48, 0x6a, 0x00, 0x28, 0x08, 0xd0, 0x06, 0x48, 0x84, 0x42, 0x3c, 0x00, 0xd8, 0x17, 0x01, 0x00, 0x05, 0xd2, 0x01, 0x1b, 0x01, 0x22, 0x07, 0x20, 0x01, 0xf0, 0xf4, 0xfe, 0xe5, 0xe7, 0x00, 0x20, 0x48, 0x61, 0xe2, 0xe7, 0x78, 0x69, 0x01, 0x00, 0x50, 0xc3, 0x00, 0x00, 0x09, 0x49, 0x80, 0xb5, 0x48, 0x69, 0x00, 0x28, 0x0c, 0xd0, 0x08, 0x6a, 0xca, 0x69, 0x80, 0x1a, 0x00, 0x28, 0x07, 0xdd, 0x00, 0x20, 0x48, 0x61, 0x01, 0x21, 0x07, 0x20, 0x01, 0xf0, 0x10, 0xff, 0x3c, 0x00, 0x14, 0x18, 0x01, 0x00, 0xf6, 0xf7, 0xb8, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0xe7, 0xfb, 0x80, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x3f, 0xfc, 0x00, 0x20, 0xf7, 0xf7, 0xd4, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x37, 0xfc, 0xfd, 0xf7, 0x6f, 0xfc, 0xf5, 0xf7, 0x73, 0xfd, 0x30, 0xf0, 0x47, 0xfb, 0x80, 0xbd, 0x04, 0x48, 0x80, 0xb5, 0x3c, 0x00, 0x50, 0x18, 0x01, 0x00, 0xc1, 0x6a, 0x00, 0x6b, 0xf2, 0xf7, 0xde, 0xff, 0x01, 0x20, 0xf7, 0xf7, 0x89, 0xf8, 0x80, 0xbd, 0xa4, 0x6c, 0x01, 0x00, 0x10, 0xb5, 0xf3, 0xf7, 0x41, 0xf8, 0x0d, 0x4c, 0x00, 0x28, 0x04, 0xd0, 0x01, 0x20, 0xe0, 0x64, 0xf7, 0xf7, 0xb2, 0xfc, 0x10, 0xbd, 0x01, 0x21, 0x01, 0x20, 0xf3, 0xf7, 0xe9, 0xf8, 0xfd, 0xf7, 0x4d, 0xfc, 0x60, 0x6d, 0x00, 0x28, 0x03, 0xd0, 0x3c, 0x00, 0x8c, 0x18, 0x01, 0x00, 0xf3, 0xf7, 0x82, 0xf8, 0x00, 0x28, 0x01, 0xd0, 0xf5, 0xf7, 0x4a, 0xfd, 0x01, 0x20, 0xf2, 0xf7, 0xc1, 0xfc, 0x10, 0xbd, 0xa4, 0x6c, 0x01, 0x00, 0x04, 0x48, 0x80, 0xb5, 0xc1, 0x6a, 0x00, 0x6b, 0xf2, 0xf7, 0xb2, 0xff, 0x01, 0x20, 0xf7, 0xf7, 0x5d, 0xf8, 0x80, 0xbd, 0xa4, 0x6c, 0x01, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0xf5, 0xfb, 0xf5, 0xf7, 0x33, 0xfd, 0xfc, 0xf7, 0x3c, 0x00, 0xc8, 0x18, 0x01, 0x00, 0x31, 0xfd, 0xf9, 0xf7, 0xcb, 0xff, 0x04, 0x20, 0xf2, 0xf7, 0xa6, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x03, 0x48, 0x80, 0xb5, 0xc1, 0x6a, 0x00, 0x6b, 0xf2, 0xf7, 0x98, 0xff, 0x80, 0xbd, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0xdd, 0xfb, 0x00, 0x20, 0xf7, 0xf7, 0x3c, 0xf8, 0x30, 0xf0, 0xee, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x21, 0x3c, 0x00, 0x04, 0x19, 0x01, 0x00, 0x01, 0x20, 0xff, 0xf7, 0x19, 0xfa, 0x01, 0x20, 0xf2, 0xf7, 0x88, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0xc9, 0xfb, 0xfc, 0xf7, 0x07, 0xfd, 0x01, 0x21, 0x01, 0x20, 0xff, 0xf7, 0x0b, 0xfa, 0x04, 0x20, 0xf2, 0xf7, 0x7a, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, 0xf0, 0x8a, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x40, 0x19, 0x01, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x82, 0x6a, 0x01, 0x21, 0x04, 0x20, 0x00, 0xf0, 0x81, 0xfb, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x00, 0x21, 0x03, 0x20, 0x00, 0xf0, 0x78, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x82, 0x6a, 0x01, 0x21, 0x04, 0x20, 0x00, 0xf0, 0x6f, 0xfb, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x3c, 0x00, 0x7c, 0x19, 0x01, 0x00, 0x00, 0x21, 0x03, 0x20, 0x00, 0xf0, 0x66, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x06, 0x48, 0x80, 0xb5, 0x81, 0x68, 0x42, 0x69, 0x00, 0x69, 0x51, 0x18, 0x81, 0x42, 0x03, 0xd9, 0x01, 0x21, 0x01, 0x20, 0x00, 0xf0, 0x58, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x06, 0x48, 0x80, 0xb5, 0x82, 0x88, 0x81, 0x68, 0x00, 0x69, 0x51, 0x18, 0x81, 0x42, 0x03, 0xd9, 0x3c, 0x00, 0xb8, 0x19, 0x01, 0x00, 0x01, 0x21, 0x02, 0x20, 0x00, 0xf0, 0x48, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x10, 0xb5, 0x08, 0x4c, 0x20, 0x7b, 0x21, 0x6a, 0xf9, 0xf7, 0x9c, 0xfa, 0xa1, 0x69, 0x42, 0x18, 0xa0, 0x68, 0x21, 0x69, 0x80, 0x18, 0x88, 0x42, 0x03, 0xd9, 0x01, 0x21, 0x02, 0x20, 0x00, 0xf0, 0x33, 0xfb, 0x10, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x3c, 0x00, 0xf4, 0x19, 0x01, 0x00, 0x00, 0x21, 0x00, 0x20, 0x00, 0xf0, 0x2a, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0e, 0x01, 0x28, 0x80, 0xb5, 0x02, 0xd1, 0xf6, 0xf7, 0x8f, 0xf8, 0x80, 0xbd, 0x00, 0x28, 0xfc, 0xd1, 0xf1, 0xf7, 0xfa, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0xf6, 0xf7, 0x85, 0xf8, 0x80, 0xbd, 0x80, 0xb5, 0x00, 0x06, 0x00, 0x0e, 0xf1, 0xf7, 0x29, 0xfd, 0x80, 0xbd, 0x3c, 0x00, 0x30, 0x1a, 0x01, 0x00, 0xb0, 0xb5, 0x02, 0x25, 0x02, 0x28, 0x10, 0x4c, 0x0b, 0xd1, 0xfb, 0xf7, 0x47, 0xfc, 0x00, 0x28, 0x01, 0xd1, 0xfe, 0xf7, 0x4f, 0xff, 0x25, 0x70, 0xa1, 0x68, 0x0c, 0x48, 0xfd, 0xf7, 0xa8, 0xfc, 0xb0, 0xbd, 0x03, 0x28, 0x0d, 0xd1, 0x08, 0x48, 0x7d, 0x23, 0x1c, 0x38, 0x00, 0x69, 0xdb, 0x00, 0x58, 0x43, 0x19, 0x1c, 0x40, 0x18, 0x41, 0x08, 0x02, 0x20, 0x00, 0xf0, 0x3c, 0x00, 0x6c, 0x1a, 0x01, 0x00, 0x91, 0xfa, 0x25, 0x70, 0xb0, 0xbd, 0xf8, 0xf7, 0x31, 0xf9, 0xb0, 0xbd, 0x78, 0x69, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x10, 0xb5, 0x05, 0x4c, 0xe0, 0x68, 0x00, 0x28, 0x01, 0xd1, 0xef, 0xf7, 0x39, 0xfc, 0x02, 0x20, 0x20, 0x70, 0x00, 0xf0, 0xaf, 0xfa, 0x10, 0xbd, 0x78, 0x69, 0x01, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x82, 0x6a, 0x01, 0x21, 0x04, 0x20, 0x00, 0xf0, 0x3c, 0x00, 0xa8, 0x1a, 0x01, 0x00, 0xd3, 0xfa, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x00, 0x21, 0x03, 0x20, 0x00, 0xf0, 0xca, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, 0xf0, 0xc2, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x42, 0x69, 0x01, 0x21, 0x01, 0x20, 0x00, 0xf0, 0xb9, 0xfa, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x3c, 0x00, 0xe4, 0x1a, 0x01, 0x00, 0x06, 0x48, 0x80, 0xb5, 0x82, 0x88, 0x00, 0x2a, 0x02, 0xd0, 0x01, 0x21, 0x02, 0x20, 0x02, 0xe0, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, 0xf0, 0xa9, 0xfa, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x10, 0xb5, 0x06, 0x4c, 0x20, 0x7b, 0x21, 0x6a, 0xf9, 0xf7, 0xfe, 0xf9, 0xa1, 0x69, 0x42, 0x18, 0x01, 0x21, 0x02, 0x20, 0x00, 0xf0, 0x9a, 0xfa, 0x10, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x20, 0x1b, 0x01, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, 0xf0, 0x90, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x38, 0xb5, 0xfa, 0xf7, 0x41, 0xfe, 0x00, 0x20, 0xf0, 0xf7, 0x80, 0xf8, 0x00, 0x90, 0x00, 0xab, 0x1c, 0x88, 0x5d, 0x88, 0xf8, 0xf7, 0x3c, 0xf9, 0x00, 0x2c, 0x02, 0xd0, 0xfd, 0xf7, 0x9e, 0xfa, 0x02, 0xe0, 0x01, 0x20, 0xf6, 0xf7, 0x0a, 0xff, 0x3c, 0x00, 0x5c, 0x1b, 0x01, 0x00, 0x29, 0x1c, 0x20, 0x1c, 0xfc, 0xf7, 0xb8, 0xfc, 0x00, 0x2c, 0x02, 0xd0, 0xf5, 0xf7, 0xe0, 0xfb, 0x02, 0xe0, 0x00, 0x20, 0x00, 0xf0, 0xdc, 0xf9, 0x03, 0x20, 0x00, 0x2c, 0x00, 0xd1, 0x02, 0x20, 0x00, 0x06, 0x00, 0x0e, 0xf2, 0xf7, 0x4e, 0xfb, 0x38, 0xbd, 0x00, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x82, 0x6a, 0x01, 0x21, 0x04, 0x20, 0x00, 0xf0, 0x5d, 0xfa, 0x80, 0xbd, 0x3c, 0x00, 0x98, 0x1b, 0x01, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x30, 0xf0, 0x9b, 0xf9, 0x80, 0xbd, 0x80, 0xb5, 0x00, 0x22, 0x00, 0x21, 0x03, 0x20, 0x00, 0xf0, 0x50, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x42, 0x69, 0x01, 0x21, 0x01, 0x20, 0x00, 0xf0, 0x47, 0xfa, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x04, 0x48, 0x80, 0xb5, 0x82, 0x88, 0x00, 0x2a, 0x03, 0xd0, 0x01, 0x21, 0x3c, 0x00, 0xd4, 0x1b, 0x01, 0x00, 0x02, 0x20, 0x00, 0xf0, 0x3b, 0xfa, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x10, 0xb5, 0x06, 0x4c, 0x20, 0x7b, 0x21, 0x6a, 0xf9, 0xf7, 0x90, 0xf9, 0xa1, 0x69, 0x42, 0x18, 0x01, 0x21, 0x02, 0x20, 0x00, 0xf0, 0x2c, 0xfa, 0x10, 0xbd, 0x00, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x80, 0xb5, 0xfc, 0xf7, 0x93, 0xfb, 0x01, 0x21, 0x01, 0x20, 0xff, 0xf7, 0x97, 0xf8, 0x04, 0x20, 0x3c, 0x00, 0x10, 0x1c, 0x01, 0x00, 0xf2, 0xf7, 0x06, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x2f, 0xf0, 0x6b, 0xfb, 0x00, 0x28, 0x0a, 0xd0, 0x01, 0x20, 0xf2, 0xf7, 0xfc, 0xfa, 0xfa, 0xf7, 0x2a, 0xfc, 0x00, 0x28, 0x02, 0xd1, 0x04, 0x20, 0xf6, 0xf7, 0x5d, 0xf8, 0x80, 0xbd, 0x03, 0x21, 0x16, 0x20, 0xef, 0xf7, 0x32, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x02, 0x48, 0x80, 0xb5, 0x00, 0x68, 0xee, 0xf7, 0x3c, 0x00, 0x4c, 0x1c, 0x01, 0x00, 0xc5, 0xfb, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x42, 0x69, 0x01, 0x21, 0x01, 0x20, 0x00, 0xf0, 0xf7, 0xf9, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x30, 0xf0, 0x35, 0xf9, 0x80, 0xbd, 0xb0, 0xb5, 0x18, 0x4c, 0xaa, 0x20, 0x00, 0x5d, 0x04, 0x28, 0x19, 0xd1, 0x01, 0x25, 0xe5, 0x62, 0x25, 0x63, 0x01, 0xf0, 0x93, 0xf8, 0xa0, 0x66, 0x3c, 0x00, 0x88, 0x1c, 0x01, 0x00, 0x01, 0xf0, 0xfc, 0xfd, 0xf2, 0xf7, 0x2e, 0xfe, 0x00, 0x28, 0x0e, 0xd0, 0x02, 0x20, 0xf2, 0xf7, 0xc3, 0xfa, 0xa5, 0x60, 0x01, 0xf0, 0x86, 0xf8, 0x64, 0x30, 0x60, 0x60, 0xfa, 0xf7, 0x8a, 0xfd, 0x01, 0x21, 0x01, 0x20, 0xff, 0xf7, 0x46, 0xf8, 0xb0, 0xbd, 0x01, 0x20, 0xf2, 0xf7, 0xb4, 0xfa, 0x00, 0x20, 0xa0, 0x60, 0x00, 0x21, 0x01, 0x20, 0xff, 0xf7, 0x3c, 0xf8, 0x3c, 0x00, 0xc4, 0x1c, 0x01, 0x00, 0xf2, 0xf7, 0x66, 0xfe, 0x00, 0x28, 0xf1, 0xd0, 0xfa, 0xf7, 0x76, 0xfd, 0xb0, 0xbd, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x20, 0xef, 0xf7, 0xd6, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x20, 0xef, 0xf7, 0xd0, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0xac, 0x21, 0x09, 0x5c, 0x02, 0x4a, 0x09, 0x02, 0x89, 0x18, 0xc0, 0x31, 0x81, 0x60, 0x70, 0x47, 0x3c, 0x00, 0x00, 0x1d, 0x01, 0x00, 0x70, 0x75, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x28, 0x04, 0xd1, 0x03, 0xc9, 0x09, 0x68, 0xee, 0xf7, 0x64, 0xfb, 0x80, 0xbd, 0x01, 0x21, 0x14, 0x20, 0xef, 0xf7, 0xc4, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x28, 0x02, 0xd1, 0x02, 0x48, 0x40, 0x68, 0x70, 0x47, 0x40, 0x68, 0x70, 0x47, 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, 0x10, 0xb5, 0x00, 0x24, 0xf8, 0xf7, 0x1c, 0xfb, 0x3c, 0x00, 0x3c, 0x1d, 0x01, 0x00, 0x00, 0x28, 0x04, 0xd0, 0x40, 0x30, 0x80, 0x7a, 0x05, 0x28, 0x00, 0xd1, 0x01, 0x24, 0x20, 0x1c, 0x10, 0xbd, 0x00, 0x00, 0x04, 0x48, 0x00, 0x21, 0x40, 0x68, 0x01, 0xe0, 0x01, 0x63, 0x40, 0x68, 0x00, 0x28, 0xfb, 0xd1, 0x70, 0x47, 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, 0xf7, 0xf7, 0xa5, 0xf8, 0x40, 0x34, 0xe5, 0x72, 0xb0, 0xbd, 0x3c, 0x00, 0x78, 0x1d, 0x01, 0x00, 0xf8, 0xb5, 0x07, 0x1c, 0xf8, 0xf7, 0xfa, 0xfa, 0x04, 0x1c, 0x04, 0xd0, 0x05, 0x21, 0x14, 0x20, 0xef, 0xf7, 0x8c, 0xfa, 0x28, 0xe0, 0x00, 0x25, 0x14, 0x49, 0x28, 0x02, 0x46, 0x18, 0x30, 0x1c, 0x44, 0x30, 0x06, 0x22, 0x12, 0x49, 0xee, 0xf7, 0x2d, 0xfb, 0x00, 0x28, 0x02, 0xd1, 0xac, 0x20, 0x85, 0x55, 0x34, 0x1c, 0x01, 0x35, 0x03, 0x2d, 0xee, 0xd3, 0x00, 0x2c, 0x3c, 0x00, 0xb4, 0x1d, 0x01, 0x00, 0x14, 0xd0, 0x39, 0x1c, 0x20, 0x1c, 0xf8, 0xf7, 0x2b, 0xf8, 0x09, 0x49, 0x00, 0x20, 0x20, 0x60, 0x18, 0x39, 0x48, 0x68, 0x60, 0x60, 0x00, 0x28, 0x00, 0xd0, 0x04, 0x60, 0x4c, 0x60, 0xca, 0x68, 0x00, 0x2a, 0x03, 0xd0, 0x01, 0x21, 0x20, 0x1c, 0xee, 0xf7, 0xfe, 0xfa, 0x20, 0x1c, 0xf8, 0xbd, 0x70, 0x75, 0x01, 0x00, 0x58, 0x46, 0x01, 0x00, 0x80, 0xb5, 0xf8, 0xf7, 0x3c, 0x00, 0xf0, 0x1d, 0x01, 0x00, 0xc1, 0xfa, 0x00, 0x28, 0x04, 0xd1, 0x06, 0x21, 0x14, 0x20, 0xef, 0xf7, 0x53, 0xfa, 0x80, 0xbd, 0xf5, 0xf7, 0x16, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0xf8, 0xf7, 0xb3, 0xfa, 0x80, 0xbd, 0x10, 0xb5, 0x09, 0x4c, 0x21, 0x88, 0x02, 0x29, 0x03, 0xd1, 0x14, 0x20, 0xef, 0xf7, 0x42, 0xfa, 0x04, 0xe0, 0xa3, 0x68, 0x8a, 0x00, 0x98, 0x50, 0x48, 0x1c, 0x20, 0x80, 0x3c, 0x00, 0x2c, 0x1e, 0x01, 0x00, 0x20, 0x88, 0x01, 0x38, 0x00, 0x04, 0x00, 0x0c, 0x10, 0xbd, 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, 0x0b, 0x1c, 0x11, 0x1c, 0x08, 0x4a, 0x80, 0xb5, 0x12, 0x88, 0x90, 0x42, 0x06, 0xd2, 0xda, 0x68, 0xc0, 0x00, 0x12, 0x18, 0x14, 0x20, 0x01, 0xf0, 0xbb, 0xfb, 0x80, 0xbd, 0x03, 0x21, 0x14, 0x20, 0xef, 0xf7, 0x22, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, 0x3c, 0x00, 0x68, 0x1e, 0x01, 0x00, 0x08, 0x4a, 0x80, 0xb5, 0x12, 0x88, 0x90, 0x42, 0x06, 0xd2, 0xc9, 0x68, 0xc0, 0x00, 0x09, 0x18, 0x14, 0x20, 0x01, 0xf0, 0xdb, 0xfb, 0x80, 0xbd, 0x04, 0x21, 0x14, 0x20, 0xef, 0xf7, 0x0e, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, 0x01, 0x49, 0xc8, 0x60, 0x70, 0x47, 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, 0x80, 0xb5, 0x06, 0x22, 0x44, 0x30, 0xee, 0xf7, 0x3c, 0x00, 0xa4, 0x1e, 0x01, 0x00, 0xab, 0xfa, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x80, 0xbd, 0x00, 0x20, 0x80, 0xbd, 0x00, 0x00, 0x1c, 0xb5, 0x14, 0x4c, 0x20, 0x69, 0x00, 0x28, 0x23, 0xd0, 0x20, 0x78, 0x0a, 0x28, 0x01, 0xd0, 0x00, 0xf0, 0xfc, 0xf8, 0x00, 0x20, 0x60, 0x61, 0x0f, 0x48, 0x40, 0x79, 0xa0, 0x70, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x28, 0x15, 0xd1, 0xfd, 0xf7, 0xed, 0xfe, 0x01, 0x90, 0x3c, 0x00, 0xe0, 0x1e, 0x01, 0x00, 0xfd, 0xf7, 0x82, 0xfe, 0x00, 0x90, 0x00, 0xab, 0x18, 0x79, 0x19, 0x78, 0x40, 0x1a, 0x18, 0x71, 0x58, 0x79, 0x59, 0x78, 0x40, 0x1a, 0x58, 0x71, 0x01, 0x98, 0xf2, 0xf7, 0x89, 0xfe, 0x05, 0x20, 0x20, 0x70, 0x00, 0xf0, 0xbf, 0xf9, 0x1c, 0xbd, 0x7c, 0x78, 0x01, 0x00, 0x0c, 0x5a, 0x01, 0x00, 0x08, 0xb5, 0x04, 0x4a, 0x00, 0x90, 0x14, 0x32, 0x00, 0x20, 0x02, 0x4b, 0x3c, 0x00, 0x1c, 0x1f, 0x01, 0x00, 0x02, 0x49, 0xf1, 0xf7, 0x7d, 0xf9, 0x08, 0xbd, 0x2c, 0x75, 0x01, 0x00, 0xb1, 0xa8, 0x00, 0x00, 0xb0, 0xb5, 0x00, 0x28, 0x06, 0xd0, 0x01, 0x28, 0x06, 0xd0, 0x02, 0x28, 0x07, 0xd1, 0x0c, 0x4c, 0x01, 0x25, 0x07, 0xe0, 0x0b, 0x4c, 0x04, 0xe0, 0x0a, 0x4c, 0x2a, 0x3c, 0x01, 0xe0, 0x08, 0x4c, 0xb6, 0x34, 0x00, 0x25, 0x00, 0xf0, 0x2c, 0xff, 0x07, 0x49, 0x89, 0x6e, 0x3c, 0x00, 0x58, 0x1f, 0x01, 0x00, 0x09, 0x19, 0x09, 0x1a, 0xa1, 0x42, 0x00, 0xd9, 0x00, 0x21, 0x2a, 0x1c, 0x16, 0x20, 0x01, 0xf0, 0x31, 0xfb, 0xb0, 0xbd, 0x71, 0x02, 0x00, 0x00, 0x0c, 0x05, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x8c, 0xb5, 0x00, 0xab, 0x8e, 0x21, 0x19, 0x80, 0xfc, 0xf7, 0x38, 0xf9, 0x01, 0x90, 0x68, 0x46, 0xfb, 0xf7, 0xa6, 0xfa, 0x8c, 0xbd, 0x00, 0x00, 0xbf, 0xb5, 0x13, 0x4a, 0x3c, 0x00, 0x94, 0x1f, 0x01, 0x00, 0x01, 0x91, 0x0d, 0x1c, 0x11, 0x7c, 0x88, 0x43, 0x04, 0x1c, 0x21, 0x43, 0x08, 0x1c, 0x10, 0x74, 0xa0, 0x07, 0x0b, 0xd5, 0x0e, 0x48, 0x00, 0x90, 0x01, 0x20, 0x02, 0x90, 0x00, 0xf0, 0xfc, 0xfe, 0x0c, 0x49, 0x40, 0x18, 0x03, 0x90, 0x68, 0x46, 0xf9, 0xf7, 0x6a, 0xff, 0xe0, 0x07, 0x0c, 0xd5, 0xf1, 0xf7, 0x2c, 0xfd, 0x00, 0x28, 0x03, 0xd0, 0x07, 0x48, 0x85, 0x42, 0x3c, 0x00, 0xd0, 0x1f, 0x01, 0x00, 0x00, 0xd2, 0x01, 0x90, 0x06, 0x48, 0x00, 0x90, 0x68, 0x46, 0xf9, 0xf7, 0x09, 0xff, 0xbf, 0xbd, 0x78, 0x69, 0x01, 0x00, 0x81, 0xea, 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0xa0, 0x86, 0x01, 0x00, 0x75, 0xea, 0x00, 0x00, 0x10, 0xb5, 0x0a, 0x4c, 0x60, 0x69, 0x00, 0x28, 0x0e, 0xd1, 0x01, 0x20, 0x60, 0x61, 0xa1, 0x68, 0x07, 0x48, 0xfd, 0xf7, 0xcb, 0xf9, 0x00, 0x21, 0x3c, 0x00, 0x0c, 0x20, 0x01, 0x00, 0xa0, 0x68, 0xf9, 0xf7, 0xd1, 0xfb, 0x01, 0x22, 0x07, 0x20, 0x04, 0x49, 0x01, 0xf0, 0xd8, 0xfa, 0x10, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x98, 0x3a, 0x00, 0x00, 0x10, 0xb5, 0x0c, 0x1c, 0x11, 0x1c, 0x06, 0x4a, 0x00, 0x2b, 0x10, 0x70, 0x03, 0xd0, 0x00, 0x28, 0x02, 0xd1, 0xf9, 0xf7, 0xf5, 0xfd, 0x10, 0xbd, 0x20, 0x1c, 0xf9, 0xf7, 0x3c, 0x00, 0x48, 0x20, 0x01, 0x00, 0x01, 0xfe, 0x10, 0xbd, 0xa0, 0x79, 0x01, 0x00, 0xb0, 0xb5, 0x0a, 0x4c, 0x05, 0x1c, 0xe3, 0x6a, 0x20, 0x1f, 0x01, 0x33, 0xe3, 0x62, 0x00, 0x88, 0x00, 0x29, 0x06, 0xd0, 0xa1, 0x68, 0x89, 0x18, 0x21, 0x61, 0x05, 0x4a, 0x00, 0xf0, 0xfc, 0xfe, 0x01, 0xe0, 0x00, 0xf0, 0xcf, 0xfe, 0x25, 0x77, 0xb0, 0xbd, 0x00, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x55, 0xe3, 0x00, 0x00, 0x3c, 0x00, 0x84, 0x20, 0x01, 0x00, 0x01, 0x1c, 0x03, 0x48, 0x80, 0xb5, 0x40, 0x88, 0xff, 0xf7, 0xec, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x98, 0x7c, 0x01, 0x00, 0x03, 0x48, 0x80, 0xb5, 0xc1, 0x68, 0x18, 0x38, 0x80, 0x88, 0xff, 0xf7, 0xe1, 0xfe, 0x80, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x21, 0x16, 0x20, 0x01, 0xf0, 0xbf, 0xfa, 0x01, 0x21, 0x16, 0x20, 0x01, 0xf0, 0xbb, 0xfa, 0x80, 0xbd, 0x3c, 0x00, 0xc0, 0x20, 0x01, 0x00, 0x10, 0xb5, 0x0b, 0x4c, 0x20, 0x78, 0x0a, 0x28, 0x10, 0xd0, 0x01, 0x20, 0x60, 0x61, 0x0a, 0x21, 0x13, 0x20, 0x01, 0xf0, 0xaf, 0xfa, 0x0a, 0x20, 0x60, 0x70, 0x20, 0x70, 0xfd, 0xf7, 0x3c, 0xfb, 0x01, 0x20, 0xfd, 0xf7, 0xe9, 0xfb, 0x00, 0x20, 0xfa, 0xf7, 0xc4, 0xf9, 0x10, 0xbd, 0x00, 0x00, 0x7c, 0x78, 0x01, 0x00, 0x10, 0xb5, 0x0c, 0x4c, 0x00, 0x20, 0x0b, 0x49, 0x3c, 0x00, 0xfc, 0x20, 0x01, 0x00, 0x20, 0x63, 0xe0, 0x62, 0x50, 0x39, 0x88, 0x61, 0x20, 0x70, 0x08, 0x48, 0x38, 0x21, 0x0c, 0x38, 0x00, 0x7a, 0x08, 0x55, 0x81, 0x21, 0x18, 0x20, 0x01, 0xf0, 0x8e, 0xfa, 0x20, 0x69, 0x01, 0x28, 0x02, 0xd1, 0x00, 0x20, 0xf5, 0xf7, 0x3e, 0xfb, 0x10, 0xbd, 0x00, 0x00, 0xf4, 0x6e, 0x01, 0x00, 0xb0, 0xb5, 0x1c, 0x4c, 0x00, 0x25, 0x2c, 0x22, 0x01, 0x1d, 0x20, 0x1c, 0x3c, 0x00, 0x38, 0x21, 0x01, 0x00, 0x9a, 0xb0, 0xee, 0xf7, 0x39, 0xfa, 0x18, 0x49, 0x2c, 0x31, 0x08, 0x1c, 0x00, 0x7a, 0x8a, 0x69, 0x00, 0x2a, 0x13, 0xd1, 0x02, 0x28, 0x03, 0xd1, 0xa0, 0x68, 0x00, 0x28, 0x20, 0xd0, 0x04, 0xe0, 0x00, 0x28, 0x1d, 0xd1, 0x60, 0x68, 0x00, 0x28, 0x1a, 0xd0, 0x80, 0x02, 0x88, 0x61, 0x0e, 0x48, 0x69, 0x46, 0x24, 0x38, 0x00, 0x68, 0xef, 0xf7, 0xcb, 0xfb, 0x11, 0xe0, 0x3c, 0x00, 0x74, 0x21, 0x01, 0x00, 0x00, 0x22, 0x02, 0x28, 0x03, 0xd1, 0xa0, 0x68, 0x00, 0x28, 0x09, 0xd1, 0x04, 0xe0, 0x00, 0x28, 0x08, 0xd1, 0x60, 0x68, 0x00, 0x28, 0x03, 0xd1, 0x8a, 0x61, 0xff, 0xf7, 0xb1, 0xff, 0x01, 0xe0, 0x80, 0x02, 0x88, 0x61, 0x28, 0x1c, 0x1a, 0xb0, 0xb0, 0xbd, 0x00, 0x00, 0xc8, 0x6e, 0x01, 0x00, 0xf8, 0xb5, 0x0c, 0x49, 0x02, 0x20, 0x48, 0x60, 0x0b, 0x49, 0x00, 0x05, 0x3c, 0x00, 0xb0, 0x21, 0x01, 0x00, 0x08, 0x60, 0x0b, 0x4f, 0xb8, 0x68, 0xf9, 0x68, 0x7c, 0x68, 0x45, 0x1a, 0x2e, 0x1c, 0x04, 0xe0, 0xa0, 0x68, 0x61, 0x68, 0xee, 0xf7, 0x09, 0xf9, 0x24, 0x68, 0x01, 0x3d, 0xf8, 0xd2, 0x7c, 0x60, 0xf8, 0x68, 0x80, 0x19, 0xf8, 0x60, 0xf8, 0xbd, 0x40, 0x20, 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0x44, 0xe3, 0x01, 0x00, 0xf8, 0xb5, 0x1f, 0x4e, 0x04, 0x1c, 0x30, 0x69, 0x3c, 0x00, 0xec, 0x21, 0x01, 0x00, 0x01, 0x21, 0xf9, 0xf7, 0x99, 0xfa, 0x1d, 0x49, 0x60, 0x00, 0x40, 0x18, 0x10, 0x38, 0x81, 0x7b, 0x1b, 0x4a, 0x51, 0x72, 0xc0, 0x7b, 0x10, 0x74, 0x1a, 0x4f, 0x1b, 0x4d, 0x0e, 0x2c, 0x0a, 0xd1, 0x01, 0x22, 0x02, 0x21, 0x08, 0x20, 0x01, 0xf0, 0xf3, 0xfb, 0x03, 0x20, 0xff, 0x21, 0x41, 0x31, 0x39, 0x86, 0x14, 0x21, 0x08, 0xe0, 0x02, 0x22, 0x01, 0x21, 0x08, 0x20, 0x3c, 0x00, 0x28, 0x22, 0x01, 0x00, 0x01, 0xf0, 0xe8, 0xfb, 0x12, 0x49, 0x02, 0x20, 0x39, 0x86, 0x10, 0x21, 0xa9, 0x71, 0xe8, 0x71, 0x10, 0x48, 0x11, 0x4a, 0x00, 0x19, 0x10, 0x38, 0xc0, 0x7b, 0x00, 0x28, 0x03, 0xd0, 0x01, 0x21, 0x51, 0x73, 0x10, 0x73, 0x01, 0xe0, 0x00, 0x20, 0x50, 0x73, 0x00, 0x21, 0x20, 0x1c, 0xfd, 0xf7, 0xe5, 0xfd, 0x30, 0x69, 0xf9, 0xf7, 0x08, 0xfb, 0xf8, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x64, 0x22, 0x01, 0x00, 0x40, 0x7c, 0x01, 0x00, 0x76, 0x46, 0x01, 0x00, 0x0c, 0x80, 0x07, 0x00, 0x30, 0x80, 0x07, 0x00, 0x00, 0x80, 0x07, 0x00, 0xff, 0x01, 0x00, 0x00, 0x5c, 0x57, 0x01, 0x00, 0xd0, 0x80, 0x07, 0x00, 0x10, 0xb5, 0x15, 0x4c, 0x14, 0x4a, 0x21, 0x78, 0x00, 0x20, 0x18, 0x32, 0x05, 0x29, 0x1d, 0xd0, 0x06, 0x29, 0x1b, 0xd0, 0x07, 0x29, 0x01, 0xd0, 0x08, 0x29, 0x06, 0xd1, 0x3c, 0x00, 0xa0, 0x22, 0x01, 0x00, 0x91, 0x68, 0x05, 0x20, 0x10, 0x29, 0x00, 0xdb, 0x06, 0x20, 0x20, 0x70, 0x01, 0x20, 0xa1, 0x78, 0x00, 0x28, 0x61, 0x70, 0x0b, 0xd0, 0x00, 0x20, 0xfa, 0xf7, 0xdc, 0xf8, 0x00, 0x21, 0x60, 0x78, 0xf4, 0xf7, 0x3c, 0xfa, 0x0a, 0x22, 0x1e, 0x21, 0x13, 0x20, 0x01, 0xf0, 0x7f, 0xf9, 0x10, 0xbd, 0xd1, 0x69, 0x07, 0x20, 0x10, 0x29, 0xe8, 0xdb, 0x08, 0x20, 0xe6, 0xe7, 0x3c, 0x00, 0xdc, 0x22, 0x01, 0x00, 0x7c, 0x78, 0x01, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x01, 0x1c, 0x04, 0x1c, 0x44, 0x31, 0x00, 0x20, 0xf6, 0xf7, 0x40, 0xfa, 0x30, 0x34, 0x00, 0x2d, 0x07, 0xd0, 0x0e, 0xc8, 0x0e, 0xc4, 0x08, 0xc8, 0x10, 0x38, 0x08, 0xc4, 0xf4, 0xf7, 0xc4, 0xf9, 0xb0, 0xbd, 0x1e, 0xcc, 0x1e, 0xc0, 0xb0, 0xbd, 0xf8, 0xb5, 0x08, 0x1c, 0x11, 0x1c, 0xf4, 0xf7, 0x87, 0xfa, 0x08, 0x4c, 0x3c, 0x00, 0x18, 0x23, 0x01, 0x00, 0x00, 0x25, 0x08, 0x4e, 0x08, 0x4f, 0x06, 0xe0, 0x30, 0x6b, 0x00, 0x28, 0x03, 0xd0, 0x35, 0x63, 0x20, 0x68, 0xee, 0xf7, 0x55, 0xf8, 0x38, 0x68, 0x00, 0x28, 0xf5, 0xd0, 0xf8, 0xbd, 0x00, 0x00, 0x5c, 0x5b, 0x01, 0x00, 0xe4, 0xfe, 0x01, 0x00, 0x84, 0x5a, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x06, 0x00, 0x0e, 0x00, 0xf0, 0x07, 0xf8, 0x80, 0xbd, 0x80, 0xb5, 0x0a, 0x1c, 0x3c, 0x00, 0x54, 0x23, 0x01, 0x00, 0x23, 0x21, 0x01, 0xf0, 0x2b, 0xfa, 0x80, 0xbd, 0xb0, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x12, 0x28, 0x03, 0xd3, 0x01, 0x21, 0x23, 0x20, 0xee, 0xf7, 0x9b, 0xff, 0x06, 0x49, 0xa0, 0x00, 0x08, 0x58, 0x04, 0xe0, 0x12, 0xc8, 0x28, 0x1c, 0xee, 0xf7, 0x2e, 0xf8, 0x20, 0x1c, 0x00, 0x28, 0xf8, 0xd1, 0xb0, 0xbd, 0x00, 0x00, 0x68, 0x5b, 0x01, 0x00, 0xf8, 0xb5, 0x0e, 0x1c, 0x3c, 0x00, 0x90, 0x23, 0x01, 0x00, 0x00, 0x25, 0x04, 0x1c, 0x12, 0x28, 0x03, 0xd3, 0x01, 0x21, 0x23, 0x20, 0xee, 0xf7, 0x82, 0xff, 0x13, 0x48, 0xa7, 0x00, 0xc4, 0x59, 0x08, 0xe0, 0x20, 0x68, 0xb0, 0x42, 0x03, 0xd1, 0x03, 0x21, 0x23, 0x20, 0xee, 0xf7, 0x77, 0xff, 0x25, 0x1c, 0x64, 0x68, 0x00, 0x2c, 0xf4, 0xd1, 0x0c, 0x4a, 0x04, 0x3a, 0x10, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x41, 0x68, 0x11, 0x60, 0x3c, 0x00, 0xcc, 0x23, 0x01, 0x00, 0x00, 0x28, 0x04, 0xd1, 0x02, 0x21, 0x23, 0x20, 0xee, 0xf7, 0x66, 0xff, 0xf8, 0xbd, 0x00, 0x21, 0x41, 0x60, 0x06, 0x60, 0x00, 0x2d, 0x01, 0xd0, 0x68, 0x60, 0xf7, 0xe7, 0x01, 0x49, 0xc8, 0x51, 0xf4, 0xe7, 0x00, 0x00, 0x68, 0x5b, 0x01, 0x00, 0x70, 0xb5, 0x0e, 0x1c, 0x05, 0x1c, 0x00, 0x24, 0x12, 0x28, 0x03, 0xd3, 0x01, 0x21, 0x23, 0x20, 0xee, 0xf7, 0x4e, 0xff, 0x3c, 0x00, 0x08, 0x24, 0x01, 0x00, 0x0d, 0x4b, 0xaa, 0x00, 0x98, 0x58, 0x04, 0xe0, 0x01, 0x68, 0xb1, 0x42, 0x04, 0xd0, 0x04, 0x1c, 0x40, 0x68, 0x00, 0x28, 0xf8, 0xd1, 0x70, 0xbd, 0x00, 0x28, 0xfc, 0xd0, 0x00, 0x2c, 0x41, 0x68, 0x01, 0xd1, 0x99, 0x50, 0x00, 0xe0, 0x61, 0x60, 0x00, 0x21, 0x03, 0x4a, 0x01, 0x60, 0x04, 0x3a, 0x11, 0x68, 0x41, 0x60, 0x10, 0x60, 0x70, 0xbd, 0x68, 0x5b, 0x01, 0x00, 0x3c, 0x00, 0x44, 0x24, 0x01, 0x00, 0xf3, 0xb5, 0x81, 0xb0, 0x00, 0x28, 0x17, 0xd0, 0x01, 0x78, 0xff, 0x29, 0x14, 0xd0, 0x45, 0x78, 0x44, 0x19, 0x02, 0x34, 0x80, 0x27, 0x01, 0x3c, 0x26, 0x78, 0x01, 0x3d, 0xbe, 0x43, 0x30, 0x1c, 0xf8, 0xf7, 0x82, 0xfc, 0x01, 0x21, 0x81, 0x40, 0x02, 0x98, 0x01, 0x40, 0x02, 0xd0, 0x3e, 0x43, 0x30, 0x1c, 0x20, 0x70, 0x00, 0x2d, 0xee, 0xd1, 0xfe, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x80, 0x24, 0x01, 0x00, 0x10, 0x4b, 0x10, 0xb5, 0x59, 0x68, 0x41, 0x1a, 0x0f, 0x29, 0x0d, 0xdc, 0x0e, 0x22, 0xd2, 0x43, 0x91, 0x42, 0x09, 0xdb, 0x1a, 0x1c, 0x92, 0x68, 0x00, 0x29, 0x01, 0xdd, 0x00, 0x2a, 0x03, 0xda, 0x00, 0x29, 0x0d, 0xda, 0x00, 0x2a, 0x0b, 0xdc, 0x04, 0x33, 0x03, 0xc3, 0xfd, 0xf7, 0x10, 0xfd, 0x04, 0x1c, 0xfd, 0xf7, 0x13, 0xfd, 0x00, 0x28, 0x02, 0xd0, 0x20, 0x1c, 0x3c, 0x00, 0xbc, 0x24, 0x01, 0x00, 0xff, 0xf7, 0x92, 0xfe, 0x10, 0xbd, 0x00, 0x00, 0x18, 0x63, 0x01, 0x00, 0xf8, 0xb5, 0x64, 0x4c, 0x07, 0x1c, 0x60, 0x78, 0xa1, 0x78, 0x88, 0x42, 0x0f, 0xd1, 0x08, 0x1c, 0xfd, 0xf7, 0xce, 0xf8, 0xe0, 0x60, 0x04, 0x20, 0x60, 0x70, 0x0a, 0x22, 0x1e, 0x21, 0x13, 0x20, 0x01, 0xf0, 0x70, 0xf8, 0x00, 0x21, 0x60, 0x78, 0xf4, 0xf7, 0x24, 0xf9, 0xf8, 0xbd, 0x04, 0x28, 0x3c, 0x00, 0xf8, 0x24, 0x01, 0x00, 0x6e, 0xd1, 0x58, 0x4e, 0xfd, 0xf7, 0xbc, 0xf8, 0x00, 0x90, 0x71, 0x78, 0x04, 0x1c, 0x00, 0x20, 0x05, 0x29, 0x21, 0xd2, 0x01, 0xa3, 0x5b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x0b, 0x0f, 0x14, 0x1a, 0x02, 0x00, 0x51, 0x48, 0x51, 0x49, 0x60, 0x43, 0x41, 0x18, 0x7d, 0x20, 0xc0, 0x00, 0xee, 0xf7, 0x87, 0xf8, 0x11, 0xe0, 0x87, 0x20, 0x60, 0x43, 0x4d, 0x49, 0x02, 0xe0, 0x3c, 0x00, 0x34, 0x25, 0x01, 0x00, 0x45, 0x20, 0x4d, 0x49, 0x60, 0x43, 0x40, 0x18, 0x08, 0xe0, 0x4c, 0x48, 0xcd, 0x21, 0x09, 0x01, 0x60, 0x43, 0x40, 0x1a, 0x02, 0xe0, 0x46, 0x20, 0x60, 0x43, 0x82, 0x38, 0x06, 0x06, 0x48, 0x48, 0x07, 0x21, 0x00, 0x79, 0x36, 0x16, 0x08, 0x1a, 0x00, 0x19, 0x00, 0x90, 0x68, 0x46, 0xfe, 0xf7, 0x5f, 0xfd, 0x38, 0x1c, 0xfd, 0xf7, 0x2e, 0xfb, 0x00, 0x99, 0x42, 0x4a, 0x3c, 0x00, 0x70, 0x25, 0x01, 0x00, 0x49, 0x00, 0x51, 0x5a, 0x48, 0x43, 0x39, 0x49, 0x04, 0x1c, 0x88, 0x78, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x28, 0x1e, 0xd1, 0x35, 0x49, 0x00, 0x28, 0x03, 0xd1, 0x3a, 0x48, 0x05, 0x78, 0x04, 0x20, 0x02, 0xe0, 0x38, 0x48, 0x45, 0x78, 0x0c, 0x20, 0x30, 0x49, 0xc9, 0x68, 0x49, 0x1b, 0x08, 0x18, 0x00, 0x90, 0x68, 0x46, 0xfe, 0xf7, 0x3e, 0xfd, 0x00, 0x98, 0x33, 0x49, 0x3c, 0x00, 0xac, 0x25, 0x01, 0x00, 0x40, 0x00, 0x20, 0x31, 0x08, 0x5a, 0x2a, 0x49, 0x44, 0x43, 0xc8, 0x68, 0xa8, 0x42, 0x01, 0xd9, 0x01, 0x25, 0x00, 0xe0, 0x00, 0x25, 0x2e, 0x48, 0x21, 0x18, 0x40, 0x00, 0xee, 0xf7, 0xa2, 0xf8, 0x04, 0x1c, 0x00, 0x2d, 0x03, 0xd0, 0xfd, 0xf7, 0xc3, 0xfa, 0x02, 0xe0, 0x3d, 0xe0, 0xfd, 0xf7, 0xf3, 0xfa, 0x00, 0x2f, 0x02, 0xd1, 0x25, 0x48, 0x0e, 0x38, 0x01, 0xe0, 0x3c, 0x00, 0xe8, 0x25, 0x01, 0x00, 0x23, 0x48, 0x0a, 0x38, 0x01, 0x68, 0x61, 0x1a, 0xcb, 0x1c, 0x01, 0xdb, 0x03, 0x29, 0x00, 0xdd, 0x04, 0x60, 0x01, 0x68, 0xa1, 0x42, 0x01, 0xd2, 0x01, 0x31, 0x04, 0xe0, 0xa1, 0x42, 0x03, 0xd9, 0x00, 0x29, 0x01, 0xd0, 0x01, 0x39, 0x01, 0x60, 0x01, 0x68, 0x38, 0x1c, 0xfd, 0xf7, 0xc0, 0xfb, 0x10, 0x4c, 0x0a, 0x20, 0x60, 0x70, 0x0a, 0x22, 0x13, 0x20, 0xa1, 0x68, 0x3c, 0x00, 0x24, 0x26, 0x01, 0x00, 0x00, 0xf0, 0xd2, 0xff, 0x60, 0x68, 0x00, 0xf0, 0xf7, 0xfa, 0x00, 0x28, 0x00, 0xd1, 0x5f, 0xe7, 0x00, 0xf0, 0xba, 0xfb, 0x11, 0x49, 0x00, 0x23, 0x40, 0x18, 0x0e, 0x49, 0x60, 0x60, 0x1e, 0x39, 0xc8, 0x56, 0xb0, 0x42, 0xf3, 0xd0, 0x0e, 0x70, 0x31, 0x1c, 0x00, 0x20, 0xff, 0xf7, 0x84, 0xfe, 0x4e, 0xe7, 0xff, 0xf7, 0x15, 0xfe, 0x4b, 0xe7, 0x7c, 0x78, 0x01, 0x00, 0x3c, 0x00, 0x60, 0x26, 0x01, 0x00, 0x60, 0xd7, 0xff, 0xff, 0x60, 0x8f, 0x01, 0x00, 0x54, 0x0b, 0x00, 0x00, 0xc9, 0x09, 0x00, 0x00, 0x8e, 0xfe, 0xff, 0xff, 0x0c, 0x5a, 0x01, 0x00, 0x12, 0x5a, 0x01, 0x00, 0x20, 0xa1, 0x07, 0x00, 0x40, 0x42, 0x0f, 0x00, 0x30, 0xb5, 0x0c, 0x4b, 0xfe, 0x24, 0x1b, 0x88, 0x04, 0x40, 0xc0, 0x07, 0x5d, 0x07, 0x6d, 0x0f, 0xdb, 0x08, 0xc0, 0x0f, 0x9c, 0x42, 0x0b, 0xd8, 0x3c, 0x00, 0x9c, 0x26, 0x01, 0x00, 0xa2, 0x18, 0x04, 0x3a, 0x9a, 0x42, 0x07, 0xd3, 0x1a, 0x1b, 0x89, 0x5c, 0x01, 0x22, 0xaa, 0x40, 0x11, 0x40, 0x01, 0xd0, 0x02, 0x21, 0x08, 0x43, 0x30, 0xbd, 0x00, 0x00, 0xfa, 0x60, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x28, 0x03, 0xd0, 0x01, 0x1c, 0x14, 0x20, 0xf5, 0xf7, 0xff, 0xfa, 0x80, 0xbd, 0xb0, 0xb5, 0x04, 0x1c, 0xf7, 0xf7, 0x08, 0xfd, 0x13, 0x4d, 0x00, 0x28, 0x3c, 0x00, 0xd8, 0x26, 0x01, 0x00, 0x1d, 0xd1, 0xa0, 0x07, 0x16, 0xd5, 0x02, 0x20, 0x84, 0x43, 0x11, 0x48, 0x01, 0x22, 0x2a, 0x62, 0x40, 0x68, 0x00, 0x28, 0x13, 0xd0, 0xf2, 0xf7, 0x51, 0xf9, 0x00, 0x28, 0x0f, 0xd1, 0x0b, 0x48, 0xe4, 0x30, 0x80, 0x7a, 0x01, 0x28, 0x00, 0xd0, 0x00, 0x22, 0x11, 0x1c, 0x01, 0x20, 0xf2, 0xf7, 0xa5, 0xf9, 0x04, 0xe0, 0x00, 0xf0, 0x4e, 0xfb, 0xe8, 0x61, 0xf2, 0xf7, 0x3c, 0x00, 0x14, 0x27, 0x01, 0x00, 0x6b, 0xf9, 0xa9, 0x6a, 0x00, 0x29, 0x02, 0xd0, 0x20, 0x1c, 0xed, 0xf7, 0x5c, 0xfe, 0xb0, 0xbd, 0x60, 0x6c, 0x01, 0x00, 0xb0, 0x57, 0x01, 0x00, 0x20, 0x48, 0xb0, 0xb5, 0x81, 0x68, 0x01, 0x29, 0x04, 0xd1, 0x00, 0x78, 0x00, 0x28, 0x01, 0xd1, 0xfd, 0xf7, 0x72, 0xfd, 0x1b, 0x4d, 0x80, 0x3d, 0x2c, 0x1c, 0x70, 0x34, 0x20, 0x78, 0x03, 0x38, 0x05, 0x28, 0x18, 0xd2, 0x3c, 0x00, 0x50, 0x27, 0x01, 0x00, 0x01, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x04, 0x15, 0x27, 0x27, 0x27, 0x00, 0xfb, 0xf7, 0xf1, 0xff, 0x60, 0x7b, 0x01, 0x1c, 0xff, 0x31, 0x61, 0x73, 0x00, 0x28, 0xf7, 0xd1, 0x04, 0x20, 0x20, 0x70, 0xa8, 0x89, 0xf8, 0xf7, 0xda, 0xf9, 0x01, 0x1c, 0x00, 0x22, 0x0f, 0x20, 0x00, 0xf0, 0x25, 0xff, 0xb0, 0xbd, 0xef, 0xf7, 0xce, 0xff, 0x6a, 0x21, 0x49, 0x5b, 0x3c, 0x00, 0x8c, 0x27, 0x01, 0x00, 0x88, 0x42, 0x0b, 0xd0, 0xe8, 0x89, 0xf8, 0xf7, 0xcb, 0xf9, 0x01, 0x1c, 0x00, 0x23, 0x00, 0x22, 0x0f, 0x20, 0x00, 0xf0, 0xf7, 0xff, 0x07, 0x20, 0x20, 0x70, 0xb0, 0xbd, 0xfd, 0xf7, 0x3a, 0xfe, 0xb0, 0xbd, 0x00, 0x00, 0x84, 0x66, 0x01, 0x00, 0xf0, 0xb5, 0x85, 0xb0, 0x04, 0x1c, 0x03, 0x80, 0x18, 0x0c, 0x60, 0x80, 0x0d, 0x1c, 0x51, 0x78, 0x10, 0x78, 0x09, 0x02, 0x3c, 0x00, 0xc8, 0x27, 0x01, 0x00, 0x48, 0x40, 0xa0, 0x80, 0xd1, 0x78, 0x90, 0x78, 0x09, 0x02, 0x48, 0x40, 0xe0, 0x80, 0x51, 0x79, 0x10, 0x79, 0x09, 0x02, 0x48, 0x40, 0x20, 0x81, 0x68, 0x46, 0x1a, 0x49, 0x14, 0x22, 0xed, 0xf7, 0xe3, 0xfe, 0x00, 0x23, 0x00, 0x20, 0xd9, 0x07, 0xc9, 0x0f, 0x8c, 0x46, 0x42, 0x00, 0x56, 0x07, 0x76, 0x0f, 0x61, 0x46, 0x89, 0x19, 0x49, 0x00, 0x6e, 0x5c, 0x49, 0x19, 0x3c, 0x00, 0x04, 0x28, 0x01, 0x00, 0x49, 0x78, 0x6f, 0x46, 0x09, 0x02, 0x4e, 0x40, 0x81, 0x00, 0x79, 0x58, 0x0f, 0x4f, 0x49, 0x00, 0x61, 0x5a, 0x01, 0x30, 0x4e, 0x40, 0x31, 0x06, 0x36, 0x0a, 0x76, 0x00, 0xc9, 0x0d, 0x79, 0x5a, 0xf6, 0x19, 0x01, 0x27, 0x7f, 0x02, 0xf6, 0x19, 0x36, 0x88, 0x71, 0x40, 0xa6, 0x5a, 0x89, 0x19, 0xa1, 0x52, 0x05, 0x28, 0xdc, 0xdb, 0x20, 0x89, 0xc0, 0x18, 0x01, 0x33, 0x3c, 0x00, 0x40, 0x28, 0x01, 0x00, 0x08, 0x2b, 0x20, 0x81, 0xd2, 0xdb, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xd8, 0x56, 0x01, 0x00, 0xd8, 0x52, 0x01, 0x00, 0xf0, 0xb5, 0x05, 0x1c, 0x0c, 0x1c, 0x1e, 0x1c, 0x00, 0x20, 0x89, 0xb0, 0x41, 0x00, 0x53, 0x5a, 0x01, 0x30, 0x06, 0xaf, 0x7b, 0x52, 0x05, 0x28, 0xf8, 0xdb, 0x10, 0x89, 0x00, 0xab, 0x3a, 0x49, 0x80, 0x19, 0x58, 0x84, 0x68, 0x46, 0x18, 0x22, 0x3c, 0x00, 0x7c, 0x28, 0x01, 0x00, 0xed, 0xf7, 0x98, 0xfe, 0x00, 0x20, 0x41, 0x00, 0x0a, 0x19, 0x52, 0x78, 0x63, 0x5c, 0x6f, 0x46, 0x12, 0x02, 0x53, 0x40, 0x82, 0x00, 0xba, 0x58, 0x06, 0xaf, 0x52, 0x00, 0xba, 0x5a, 0x31, 0x4f, 0x01, 0x30, 0x53, 0x40, 0x1a, 0x06, 0x1b, 0x0a, 0x5b, 0x00, 0xd2, 0x0d, 0xba, 0x5a, 0xdb, 0x19, 0x01, 0x27, 0x7f, 0x02, 0xdb, 0x19, 0x1b, 0x88, 0x5a, 0x40, 0x06, 0xab, 0x3c, 0x00, 0xb8, 0x28, 0x01, 0x00, 0x5b, 0x5a, 0xd2, 0x18, 0x06, 0xab, 0x5a, 0x52, 0x06, 0x28, 0xde, 0xdb, 0x61, 0x7b, 0x20, 0x7b, 0x00, 0xab, 0x09, 0x02, 0x48, 0x40, 0x59, 0x8c, 0x48, 0x40, 0x41, 0x08, 0xc0, 0x03, 0x48, 0x40, 0x19, 0x8b, 0x40, 0x18, 0x18, 0x83, 0xe1, 0x7b, 0xa0, 0x7b, 0x09, 0x02, 0x48, 0x40, 0x19, 0x8b, 0x48, 0x40, 0x41, 0x08, 0xc0, 0x03, 0x48, 0x40, 0x59, 0x8b, 0x40, 0x18, 0x3c, 0x00, 0xf4, 0x28, 0x01, 0x00, 0x58, 0x83, 0x02, 0x20, 0x41, 0x00, 0x06, 0xaa, 0x8a, 0x18, 0x20, 0x3a, 0xd2, 0x8b, 0x01, 0x30, 0x53, 0x08, 0xd2, 0x03, 0x5a, 0x40, 0x06, 0xab, 0x5b, 0x5a, 0xd2, 0x18, 0x06, 0xab, 0x5a, 0x52, 0x06, 0x28, 0xef, 0xdb, 0x30, 0x0a, 0x28, 0x70, 0x70, 0x04, 0x40, 0x0e, 0x20, 0x21, 0x08, 0x43, 0x68, 0x70, 0xae, 0x70, 0x61, 0x78, 0x20, 0x78, 0x00, 0xab, 0x09, 0x02, 0x3c, 0x00, 0x30, 0x29, 0x01, 0x00, 0x48, 0x40, 0x59, 0x8c, 0x48, 0x40, 0xc0, 0x05, 0x00, 0x0e, 0xe8, 0x70, 0x00, 0x20, 0x41, 0x00, 0x06, 0xaa, 0x53, 0x5a, 0x4a, 0x19, 0x01, 0x30, 0x13, 0x71, 0x06, 0xab, 0x59, 0x5a, 0x09, 0x0a, 0x51, 0x71, 0x06, 0x28, 0xf3, 0xdb, 0x09, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xec, 0x56, 0x01, 0x00, 0xd8, 0x52, 0x01, 0x00, 0xf0, 0xb5, 0x46, 0x68, 0x05, 0x1c, 0x60, 0x30, 0x3c, 0x00, 0x6c, 0x29, 0x01, 0x00, 0x85, 0xb0, 0x04, 0x90, 0x60, 0xe0, 0x68, 0x68, 0x0c, 0x21, 0x07, 0x69, 0x00, 0x20, 0xee, 0xf7, 0x2d, 0xfe, 0x70, 0x61, 0x01, 0x89, 0x04, 0x39, 0x09, 0x04, 0x09, 0x0c, 0x01, 0x81, 0x70, 0x69, 0x00, 0x68, 0x40, 0x18, 0x04, 0x21, 0xee, 0xf7, 0x21, 0xfe, 0xf0, 0x61, 0x70, 0x69, 0x20, 0x21, 0x04, 0x68, 0x04, 0x98, 0x04, 0x22, 0x40, 0x7b, 0x80, 0x01, 0x08, 0x43, 0x3c, 0x00, 0xa8, 0x29, 0x01, 0x00, 0xe0, 0x70, 0x28, 0x69, 0x40, 0x89, 0xa0, 0x70, 0x28, 0x69, 0x40, 0x89, 0x00, 0x0a, 0x20, 0x70, 0x29, 0x69, 0x0c, 0x31, 0xa0, 0x18, 0xed, 0xf7, 0x9b, 0xfd, 0x20, 0x78, 0x20, 0x21, 0x40, 0x06, 0x40, 0x0e, 0x08, 0x43, 0x60, 0x70, 0x28, 0x69, 0x0a, 0x30, 0x01, 0x88, 0x01, 0x31, 0x09, 0x04, 0x09, 0x0c, 0x01, 0x80, 0x04, 0xd1, 0x28, 0x69, 0x0c, 0x30, 0x01, 0x68, 0x3c, 0x00, 0xe4, 0x29, 0x01, 0x00, 0x01, 0x31, 0x01, 0x60, 0x35, 0x62, 0x61, 0x79, 0x20, 0x79, 0x09, 0x02, 0x40, 0x18, 0xa1, 0x79, 0x09, 0x04, 0x40, 0x18, 0xe1, 0x79, 0x09, 0x06, 0x43, 0x18, 0x00, 0x93, 0xa0, 0x78, 0x21, 0x78, 0x09, 0x02, 0x40, 0x18, 0x04, 0x04, 0x24, 0x0c, 0x10, 0x20, 0xee, 0xf7, 0x13, 0xff, 0xb0, 0x61, 0x28, 0x69, 0x3a, 0x1c, 0x01, 0x68, 0x00, 0x9b, 0x01, 0xa8, 0x0a, 0x32, 0x3c, 0x00, 0x20, 0x2a, 0x01, 0x00, 0xff, 0xf7, 0xc8, 0xfe, 0x28, 0x69, 0x23, 0x1c, 0x01, 0x68, 0xb0, 0x69, 0x01, 0xaa, 0xff, 0xf7, 0x11, 0xff, 0x36, 0x68, 0x00, 0x2e, 0x9c, 0xd1, 0x03, 0x49, 0x04, 0x48, 0x6a, 0x68, 0xf7, 0xf7, 0x63, 0xfb, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xfd, 0x6b, 0x00, 0x00, 0xa0, 0x6a, 0x01, 0x00, 0x01, 0x38, 0x07, 0x49, 0x40, 0x00, 0x09, 0x5c, 0x00, 0x29, 0x06, 0xd0, 0x3c, 0x00, 0x5c, 0x2a, 0x01, 0x00, 0x04, 0x49, 0x1c, 0x39, 0x08, 0x5c, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0xe6, 0x78, 0x01, 0x00, 0xfe, 0xb5, 0x05, 0x1c, 0x00, 0x20, 0x02, 0x90, 0x13, 0x48, 0x17, 0x1c, 0x00, 0x68, 0x0c, 0x1c, 0x86, 0x78, 0x30, 0x1c, 0xfd, 0xf7, 0x28, 0xfa, 0x00, 0x28, 0x01, 0xd1, 0x02, 0x98, 0xfe, 0xbd, 0x00, 0x2d, 0x08, 0xd1, 0x3c, 0x00, 0x98, 0x2a, 0x01, 0x00, 0x20, 0x68, 0x00, 0xab, 0x18, 0x71, 0x60, 0x68, 0x58, 0x71, 0xa0, 0x68, 0x98, 0x71, 0x03, 0x20, 0x38, 0x80, 0x29, 0x1c, 0x30, 0x1c, 0x01, 0xaa, 0x00, 0xf0, 0x0e, 0xf8, 0x00, 0x2d, 0xec, 0xd0, 0x00, 0xab, 0x19, 0x79, 0x21, 0x60, 0x59, 0x79, 0x61, 0x60, 0x99, 0x79, 0xa1, 0x60, 0x0c, 0x21, 0x39, 0x80, 0xe2, 0xe7, 0xf8, 0x6b, 0x01, 0x00, 0xf8, 0xb5, 0x15, 0x1c, 0x3c, 0x00, 0xd4, 0x2a, 0x01, 0x00, 0x42, 0x1e, 0x01, 0x38, 0x47, 0x00, 0x3f, 0x18, 0x1f, 0x48, 0x3e, 0x18, 0x00, 0x29, 0x06, 0xd0, 0x01, 0x24, 0x03, 0x22, 0x31, 0x1c, 0x28, 0x1c, 0xed, 0xf7, 0x04, 0xfd, 0x32, 0xe0, 0x68, 0x78, 0x01, 0x24, 0x00, 0x28, 0x05, 0xd0, 0x29, 0x78, 0x08, 0x18, 0x01, 0x38, 0x0e, 0x28, 0x00, 0xd9, 0x00, 0x24, 0x00, 0x2c, 0x26, 0xd0, 0x00, 0x2a, 0x07, 0xd1, 0x2a, 0x21, 0x3c, 0x00, 0x10, 0x2b, 0x01, 0x00, 0x12, 0x48, 0xed, 0xf7, 0x9f, 0xfc, 0x1c, 0x21, 0x11, 0x48, 0xed, 0xf7, 0x9b, 0xfc, 0x0f, 0x48, 0x03, 0x22, 0x29, 0x1c, 0x30, 0x1c, 0xed, 0xf7, 0xe7, 0xfc, 0x0c, 0x48, 0x71, 0x78, 0xc0, 0x5d, 0xb2, 0x78, 0x00, 0x29, 0x0e, 0xd0, 0x00, 0x2a, 0x0c, 0xd0, 0x01, 0x22, 0x43, 0x18, 0x08, 0x4d, 0x06, 0xe0, 0x41, 0x00, 0x49, 0x19, 0x10, 0x39, 0x8a, 0x73, 0xb7, 0x78, 0x3c, 0x00, 0x4c, 0x2b, 0x01, 0x00, 0x01, 0x30, 0xcf, 0x73, 0x83, 0x42, 0xf6, 0xd8, 0xfe, 0xf7, 0x60, 0xf8, 0x20, 0x1c, 0xf8, 0xbd, 0xeb, 0x62, 0x01, 0x00, 0xca, 0x78, 0x01, 0x00, 0x70, 0xb5, 0x05, 0x1c, 0x1c, 0x48, 0x00, 0x23, 0xc0, 0x56, 0x43, 0x1c, 0x32, 0xd1, 0xa8, 0x7a, 0xf8, 0xf7, 0x0c, 0xf9, 0x00, 0x26, 0x00, 0x28, 0x18, 0x4c, 0x08, 0xd0, 0xe8, 0x69, 0xe1, 0x6b, 0x00, 0x29, 0x0b, 0xd1, 0x3c, 0x00, 0x88, 0x2b, 0x01, 0x00, 0x66, 0x63, 0x01, 0x21, 0xe1, 0x63, 0xa6, 0x63, 0x06, 0xe0, 0xa8, 0x69, 0xe1, 0x6b, 0x00, 0x29, 0x02, 0xd0, 0x66, 0x63, 0xa6, 0x63, 0xe6, 0x63, 0xa1, 0x6b, 0x01, 0x31, 0xa1, 0x63, 0x82, 0x03, 0x01, 0xd5, 0x0e, 0x4a, 0x10, 0x43, 0xe2, 0x6b, 0x00, 0x2a, 0x00, 0xd0, 0x40, 0x42, 0x62, 0x6b, 0x10, 0x18, 0x60, 0x63, 0x08, 0x29, 0x0b, 0xd1, 0x00, 0x28, 0x01, 0xdd, 0x3c, 0x00, 0xc4, 0x2b, 0x01, 0x00, 0x01, 0x20, 0x03, 0xe0, 0x00, 0x28, 0x03, 0xda, 0x00, 0x20, 0xc0, 0x43, 0xef, 0xf7, 0x62, 0xfe, 0x66, 0x63, 0xa6, 0x63, 0x70, 0xbd, 0x00, 0x00, 0xf4, 0x6b, 0x01, 0x00, 0x84, 0x6a, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x0c, 0x21, 0x05, 0x4a, 0x41, 0x43, 0x89, 0x18, 0x80, 0xb5, 0x89, 0x78, 0x00, 0x29, 0x01, 0xd1, 0xf3, 0xf7, 0xf2, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x60, 0x7b, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x1c, 0x00, 0x20, 0xf7, 0xf7, 0x03, 0xfa, 0x80, 0xbd, 0x80, 0xb5, 0x01, 0x1c, 0x01, 0x20, 0xf7, 0xf7, 0xfd, 0xf9, 0x80, 0xbd, 0x02, 0x49, 0x89, 0x68, 0x40, 0x1a, 0xc0, 0x0f, 0x70, 0x47, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x02, 0x49, 0x89, 0x68, 0x08, 0x1a, 0xc0, 0x17, 0x01, 0x30, 0x70, 0x47, 0x00, 0x01, 0x07, 0x00, 0x3c, 0x00, 0x3c, 0x2c, 0x01, 0x00, 0x05, 0x49, 0x4a, 0x68, 0x01, 0x23, 0x1a, 0x43, 0x4a, 0x60, 0x8a, 0x68, 0x10, 0x18, 0x88, 0x60, 0x48, 0x68, 0x98, 0x43, 0x48, 0x60, 0x70, 0x47, 0x00, 0x01, 0x07, 0x00, 0x10, 0xb5, 0x15, 0x4b, 0x00, 0x21, 0x0a, 0x01, 0x9a, 0x58, 0x00, 0x2a, 0x17, 0xd1, 0x01, 0x24, 0x0a, 0x01, 0x9c, 0x50, 0xd2, 0x18, 0x10, 0x73, 0x00, 0x23, 0x53, 0x73, 0x02, 0x23, 0x01, 0x28, 0x3c, 0x00, 0x78, 0x2c, 0x01, 0x00, 0x0e, 0x4a, 0x05, 0xd1, 0xc8, 0x00, 0x80, 0x18, 0x10, 0x30, 0x02, 0x78, 0x9a, 0x43, 0x04, 0xe0, 0xc8, 0x00, 0x80, 0x18, 0x10, 0x30, 0x02, 0x78, 0x1a, 0x43, 0x02, 0x70, 0x02, 0xe0, 0x01, 0x31, 0x08, 0x29, 0xe0, 0xdb, 0x08, 0x29, 0x04, 0xd1, 0x01, 0x21, 0x99, 0x20, 0xee, 0xf7, 0xfe, 0xfa, 0x03, 0x49, 0x08, 0x04, 0x00, 0x0c, 0x10, 0xbd, 0xac, 0x73, 0x01, 0x00, 0x3c, 0x00, 0xb4, 0x2c, 0x01, 0x00, 0x00, 0x60, 0x07, 0x00, 0xff, 0xff, 0x00, 0x00, 0xf7, 0xb5, 0x19, 0x4f, 0x19, 0x4e, 0x0c, 0x1c, 0xc1, 0x00, 0xc9, 0x19, 0xb2, 0x68, 0x10, 0x31, 0x81, 0xb0, 0x01, 0x3a, 0x4a, 0x60, 0x0b, 0x78, 0x1d, 0x1c, 0x0d, 0x22, 0x93, 0x43, 0x0b, 0x70, 0x01, 0x22, 0x82, 0x40, 0x3a, 0x73, 0x12, 0x4b, 0x00, 0x01, 0x03, 0x9a, 0xc0, 0x18, 0x82, 0x60, 0x10, 0x4a, 0x10, 0x1c, 0x3c, 0x00, 0xf0, 0x2c, 0x01, 0x00, 0x20, 0x30, 0x87, 0x79, 0x00, 0xab, 0x1f, 0x70, 0xc0, 0x79, 0x58, 0x70, 0xb0, 0x68, 0x03, 0x30, 0x00, 0x23, 0x26, 0x1a, 0x01, 0xd5, 0x04, 0x1c, 0x01, 0x23, 0x4c, 0x60, 0x0d, 0x70, 0x00, 0x2b, 0x04, 0xd0, 0x20, 0x1c, 0xff, 0xf7, 0x8a, 0xff, 0x00, 0x28, 0xfa, 0xd0, 0x00, 0xab, 0x18, 0x88, 0xd0, 0x84, 0xff, 0xbd, 0x00, 0x60, 0x07, 0x00, 0x00, 0x01, 0x07, 0x00, 0x3c, 0x00, 0x2c, 0x2d, 0x01, 0x00, 0xac, 0x73, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, 0x30, 0xb5, 0x00, 0x20, 0xc0, 0x43, 0x0b, 0x4c, 0x09, 0x4b, 0x00, 0x22, 0xd1, 0x00, 0x09, 0x19, 0x0d, 0x7c, 0xed, 0x07, 0x07, 0xd5, 0x49, 0x69, 0x9d, 0x68, 0x49, 0x1b, 0x00, 0xd5, 0x00, 0x21, 0x81, 0x42, 0x00, 0xd2, 0x08, 0x1c, 0x01, 0x32, 0x08, 0x2a, 0xef, 0xdb, 0x30, 0xbd, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x3c, 0x00, 0x68, 0x2d, 0x01, 0x00, 0x00, 0x60, 0x07, 0x00, 0xb0, 0xb5, 0x08, 0x28, 0x0b, 0xd2, 0x08, 0x4d, 0x04, 0x01, 0x29, 0x59, 0x00, 0x29, 0x04, 0xd0, 0x00, 0xf0, 0x4a, 0xf8, 0x00, 0x20, 0x28, 0x51, 0xb0, 0xbd, 0x02, 0x21, 0x00, 0xe0, 0x03, 0x21, 0x99, 0x20, 0xee, 0xf7, 0x89, 0xfa, 0xb0, 0xbd, 0xac, 0x73, 0x01, 0x00, 0x03, 0x49, 0x00, 0x01, 0x40, 0x18, 0x41, 0x7b, 0x08, 0x22, 0x11, 0x43, 0x3c, 0x00, 0xa4, 0x2d, 0x01, 0x00, 0x41, 0x73, 0x70, 0x47, 0xac, 0x73, 0x01, 0x00, 0x01, 0x48, 0x80, 0x68, 0x70, 0x47, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x70, 0xb5, 0x0b, 0x4e, 0x09, 0x4d, 0x00, 0x22, 0xd0, 0x00, 0x84, 0x19, 0x20, 0x7c, 0xc0, 0x07, 0x07, 0xd5, 0x60, 0x69, 0xff, 0xf7, 0x26, 0xff, 0x00, 0x28, 0x02, 0xd0, 0xa8, 0x68, 0x32, 0x30, 0x60, 0x61, 0x01, 0x32, 0x08, 0x2a, 0xef, 0xdb, 0x3c, 0x00, 0xe0, 0x2d, 0x01, 0x00, 0x70, 0xbd, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x60, 0x07, 0x00, 0x02, 0x4a, 0xc0, 0x00, 0x80, 0x18, 0x01, 0x74, 0x70, 0x47, 0x00, 0x00, 0x00, 0x60, 0x07, 0x00, 0x04, 0x49, 0xc0, 0x00, 0x41, 0x18, 0x08, 0x7c, 0x08, 0x23, 0x02, 0x1c, 0x9a, 0x43, 0x0a, 0x74, 0x70, 0x47, 0x00, 0x00, 0x00, 0x60, 0x07, 0x00, 0x70, 0xb5, 0x08, 0x28, 0x17, 0xd2, 0x0e, 0x49, 0x3c, 0x00, 0x1c, 0x2e, 0x01, 0x00, 0x8a, 0x68, 0x0e, 0x4d, 0x01, 0x3a, 0xc1, 0x00, 0x49, 0x19, 0x4a, 0x61, 0x0c, 0x4b, 0x9a, 0x79, 0x10, 0x31, 0x0c, 0x78, 0x0d, 0x26, 0xb4, 0x43, 0x0c, 0x70, 0x01, 0x21, 0x81, 0x40, 0x29, 0x73, 0x9a, 0x71, 0x09, 0x4a, 0x07, 0x49, 0x00, 0x01, 0x80, 0x18, 0x41, 0x60, 0x70, 0xbd, 0x05, 0x21, 0x99, 0x20, 0xee, 0xf7, 0x29, 0xfa, 0x70, 0xbd, 0x00, 0x01, 0x07, 0x00, 0x3c, 0x00, 0x58, 0x2e, 0x01, 0x00, 0x00, 0x60, 0x07, 0x00, 0x20, 0x10, 0x07, 0x00, 0xd1, 0x75, 0x00, 0x00, 0xac, 0x73, 0x01, 0x00, 0xf8, 0xb5, 0x9e, 0x46, 0x1a, 0x4b, 0x94, 0x46, 0x9b, 0x68, 0x1a, 0x4c, 0xc2, 0x00, 0x12, 0x19, 0x01, 0x3b, 0x53, 0x61, 0x15, 0x1c, 0x18, 0x4c, 0xa6, 0x79, 0x2a, 0x1c, 0x10, 0x32, 0x13, 0x78, 0x0d, 0x27, 0xbb, 0x43, 0x13, 0x70, 0x01, 0x27, 0x12, 0x4b, 0x87, 0x40, 0x3c, 0x00, 0x94, 0x2e, 0x01, 0x00, 0x1f, 0x73, 0xa6, 0x71, 0x12, 0x4e, 0x00, 0x01, 0x80, 0x19, 0x63, 0x46, 0x43, 0x60, 0x73, 0x46, 0x83, 0x60, 0x13, 0x78, 0x40, 0x7b, 0xa6, 0x79, 0x01, 0x27, 0x18, 0x43, 0x38, 0x43, 0x14, 0x35, 0x00, 0xab, 0x1e, 0x70, 0xe4, 0x79, 0x5c, 0x70, 0x06, 0x4b, 0x9b, 0x68, 0x03, 0x33, 0xcc, 0x1a, 0x00, 0xd5, 0x19, 0x1c, 0x29, 0x60, 0x10, 0x70, 0x00, 0xab, 0x18, 0x88, 0x3c, 0x00, 0xd0, 0x2e, 0x01, 0x00, 0x03, 0x4c, 0x20, 0x3c, 0xe0, 0x84, 0xf8, 0xbd, 0x00, 0x01, 0x07, 0x00, 0x00, 0x60, 0x07, 0x00, 0x20, 0x10, 0x07, 0x00, 0xac, 0x73, 0x01, 0x00, 0x00, 0xb5, 0x01, 0x1c, 0xff, 0xf7, 0x5e, 0xff, 0x42, 0x18, 0x10, 0x1c, 0xff, 0xf7, 0x92, 0xfe, 0x00, 0x28, 0xfa, 0xd0, 0x00, 0xbd, 0x00, 0x00, 0x89, 0x1a, 0x40, 0x1a, 0x99, 0x18, 0x88, 0x42, 0x01, 0xd8, 0x01, 0x20, 0x3c, 0x00, 0x0c, 0x2f, 0x01, 0x00, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0xf8, 0xb5, 0x0f, 0x1c, 0x04, 0x1c, 0x00, 0x28, 0x01, 0xd1, 0xee, 0xf7, 0xef, 0xf9, 0x21, 0x1c, 0x01, 0x20, 0xff, 0xf7, 0x19, 0xfa, 0x41, 0x20, 0x00, 0x5d, 0x00, 0x28, 0x01, 0xd1, 0x00, 0x25, 0x04, 0xe0, 0x02, 0x28, 0x01, 0xd1, 0x05, 0x25, 0x00, 0xe0, 0x01, 0x25, 0xe0, 0x68, 0xee, 0xf7, 0x29, 0xfb, 0xa6, 0x6b, 0x3c, 0x00, 0x48, 0x2f, 0x01, 0x00, 0x00, 0x2e, 0x10, 0xd0, 0x00, 0x2f, 0x06, 0xd0, 0x2f, 0x20, 0x02, 0x5d, 0x20, 0x6a, 0x41, 0x6b, 0x28, 0x1c, 0xed, 0xf7, 0x44, 0xfa, 0xa0, 0x69, 0x00, 0x28, 0x01, 0xd0, 0xee, 0xf7, 0x46, 0xfc, 0x20, 0x6a, 0xee, 0xf7, 0x43, 0xfc, 0x20, 0x1c, 0xee, 0xf7, 0x40, 0xfc, 0x30, 0x1c, 0xf8, 0xbd, 0xb0, 0xb5, 0x04, 0x1c, 0xc0, 0x6b, 0x00, 0x28, 0x09, 0xd0, 0x20, 0x69, 0x3c, 0x00, 0x84, 0x2f, 0x01, 0x00, 0x00, 0x8b, 0xee, 0xf7, 0x55, 0xf9, 0x00, 0x28, 0x03, 0xd0, 0x21, 0x1c, 0x06, 0x20, 0xff, 0xf7, 0xe3, 0xf9, 0x08, 0x4d, 0x20, 0x1c, 0xa9, 0x6d, 0xff, 0xf7, 0xba, 0xff, 0x00, 0x28, 0x07, 0xd0, 0xe8, 0x68, 0x01, 0x30, 0xe8, 0x60, 0x28, 0x6a, 0x01, 0x38, 0x28, 0x62, 0xfc, 0xf7, 0x78, 0xf8, 0xb0, 0xbd, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x10, 0xb5, 0x06, 0x4c, 0x3c, 0x00, 0xc0, 0x2f, 0x01, 0x00, 0xe1, 0x6d, 0xff, 0xf7, 0xa7, 0xff, 0x00, 0x28, 0x04, 0xd0, 0xe0, 0x69, 0x01, 0x38, 0xe0, 0x61, 0xfc, 0xf7, 0x68, 0xf8, 0x10, 0xbd, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x0c, 0x23, 0x0c, 0x49, 0x58, 0x43, 0x40, 0x18, 0x10, 0xb5, 0x44, 0x68, 0xa1, 0x68, 0x00, 0x29, 0x02, 0xd0, 0x20, 0x1c, 0xed, 0xf7, 0xf3, 0xf9, 0xe0, 0x6b, 0x00, 0x28, 0x08, 0xd0, 0x20, 0x69, 0x3c, 0x00, 0xfc, 0x2f, 0x01, 0x00, 0x00, 0x8b, 0xee, 0xf7, 0x19, 0xf9, 0x00, 0x28, 0x02, 0xd0, 0x20, 0x1c, 0xf9, 0xf7, 0x26, 0xf9, 0x10, 0xbd, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0xf8, 0xb5, 0x22, 0x49, 0x48, 0x68, 0x80, 0x00, 0x06, 0xd4, 0x01, 0x20, 0x40, 0x07, 0x08, 0x60, 0x4a, 0x69, 0x92, 0x00, 0x00, 0xd4, 0x48, 0x60, 0x1d, 0x4f, 0x78, 0x7e, 0xc3, 0x06, 0x01, 0x20, 0x02, 0x1c, 0xdb, 0x0e, 0x3c, 0x00, 0x38, 0x30, 0x01, 0x00, 0x9a, 0x40, 0x0a, 0x60, 0x79, 0x69, 0x8c, 0x68, 0x8c, 0x60, 0x21, 0x07, 0x89, 0x0f, 0x09, 0xd0, 0x21, 0x07, 0x04, 0xd5, 0x0b, 0x21, 0x9e, 0x20, 0xee, 0xf7, 0x28, 0xf9, 0x00, 0xe0, 0x78, 0x64, 0x0c, 0x20, 0x84, 0x43, 0x12, 0x48, 0x3d, 0x68, 0x06, 0x5d, 0x6c, 0x68, 0x2c, 0x34, 0x06, 0xe0, 0xa0, 0x68, 0x00, 0x68, 0xa0, 0x60, 0xe9, 0x68, 0x28, 0x1c, 0xed, 0xf7, 0x3c, 0x00, 0x74, 0x30, 0x01, 0x00, 0xb2, 0xf9, 0x01, 0x3e, 0xf6, 0xd2, 0xa0, 0x68, 0x80, 0x68, 0x00, 0x28, 0x0d, 0xd0, 0x40, 0x89, 0x00, 0x28, 0x0a, 0xd0, 0x78, 0x6c, 0x00, 0x28, 0x07, 0xd1, 0x78, 0x69, 0x80, 0x68, 0x80, 0x07, 0x03, 0xd1, 0x0c, 0x21, 0x9e, 0x20, 0xee, 0xf7, 0x03, 0xf9, 0xf8, 0xbd, 0x00, 0x10, 0x07, 0x00, 0xcc, 0x6d, 0x01, 0x00, 0xb4, 0x44, 0x01, 0x00, 0x09, 0x49, 0x80, 0xb5, 0x3c, 0x00, 0xb0, 0x30, 0x01, 0x00, 0x08, 0x7e, 0xc2, 0x06, 0xd2, 0x0e, 0x01, 0x20, 0x90, 0x40, 0x07, 0x4a, 0x10, 0x60, 0x00, 0x20, 0x0a, 0x69, 0xc0, 0x43, 0x90, 0x60, 0x08, 0x68, 0x24, 0x31, 0x06, 0xc9, 0x03, 0x69, 0xed, 0xf7, 0x86, 0xf9, 0x80, 0xbd, 0xcc, 0x6d, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, 0xf8, 0xb5, 0x44, 0x68, 0x06, 0x1c, 0x2c, 0x34, 0x20, 0x68, 0x0d, 0x1c, 0x80, 0x68, 0x00, 0x90, 0x3c, 0x00, 0xec, 0x30, 0x01, 0x00, 0x00, 0x28, 0x00, 0xd0, 0xc5, 0x60, 0x20, 0x68, 0x00, 0x68, 0x20, 0x60, 0x40, 0x68, 0x00, 0x28, 0x03, 0xd0, 0x0a, 0x21, 0x9e, 0x20, 0xee, 0xf7, 0xcf, 0xf8, 0x20, 0x68, 0x45, 0x60, 0x28, 0x1c, 0x02, 0xe0, 0x00, 0x22, 0x42, 0x60, 0x08, 0x1c, 0xc1, 0x68, 0x00, 0x29, 0xf9, 0xd1, 0x71, 0x68, 0x60, 0x27, 0x0b, 0x1c, 0x40, 0x33, 0x9c, 0x46, 0x9b, 0x78, 0xca, 0x7e, 0x3c, 0x00, 0x28, 0x31, 0x01, 0x00, 0x5b, 0x01, 0x12, 0x07, 0x12, 0x0f, 0x3b, 0x40, 0x1a, 0x43, 0x8b, 0x8f, 0xff, 0x27, 0x3f, 0x04, 0x1b, 0x04, 0x3b, 0x40, 0x1a, 0x43, 0x90, 0x23, 0x1a, 0x43, 0x42, 0x60, 0x63, 0x46, 0x9a, 0x78, 0x01, 0x32, 0xd2, 0x07, 0xd2, 0x0f, 0x9a, 0x70, 0x89, 0x6b, 0xc1, 0x60, 0x21, 0x68, 0x88, 0x60, 0x00, 0x98, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x98, 0xc5, 0x60, 0x0a, 0x4f, 0x3c, 0x00, 0x64, 0x31, 0x01, 0x00, 0xbd, 0x79, 0xa0, 0x69, 0x00, 0x28, 0x0c, 0xd0, 0x00, 0x22, 0xa2, 0x61, 0x74, 0x68, 0x60, 0x69, 0xef, 0xf7, 0x2e, 0xff, 0xe0, 0x6a, 0x61, 0x69, 0x40, 0x68, 0x48, 0x60, 0x61, 0x69, 0x01, 0x20, 0x08, 0x60, 0xbd, 0x71, 0xf8, 0xbd, 0x00, 0x00, 0x20, 0x10, 0x07, 0x00, 0xfe, 0xb5, 0x44, 0x68, 0x0f, 0x1c, 0x01, 0x94, 0x2c, 0x34, 0x20, 0x1c, 0x12, 0x30, 0x02, 0x90, 0x3c, 0x00, 0xa0, 0x31, 0x01, 0x00, 0x2c, 0xe0, 0x0c, 0x20, 0xee, 0xf7, 0x00, 0xfb, 0x05, 0x1c, 0x60, 0x68, 0x00, 0x28, 0x1d, 0xd1, 0x02, 0x98, 0x00, 0x21, 0x00, 0x90, 0x00, 0x20, 0xee, 0xf7, 0x0e, 0xfa, 0x06, 0x1c, 0x00, 0x98, 0x04, 0x21, 0xee, 0xf7, 0x09, 0xfa, 0x01, 0x1c, 0x01, 0x98, 0xc0, 0x7e, 0x00, 0x07, 0x00, 0x0f, 0xd0, 0x30, 0x70, 0x60, 0x01, 0x98, 0xc0, 0x7e, 0x00, 0x07, 0x00, 0x0f, 0x3c, 0x00, 0xdc, 0x31, 0x01, 0x00, 0xf0, 0x30, 0x48, 0x60, 0x30, 0x1c, 0xee, 0xf7, 0x19, 0xf9, 0x65, 0x60, 0xe6, 0x60, 0x01, 0xe0, 0x20, 0x68, 0x05, 0x60, 0x60, 0x68, 0x28, 0x60, 0x25, 0x60, 0x00, 0x20, 0x68, 0x60, 0xa8, 0x60, 0x38, 0x1c, 0xff, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x39, 0x1c, 0x07, 0x1c, 0x00, 0x29, 0xca, 0xd1, 0x60, 0x68, 0xa0, 0x60, 0xfe, 0xbd, 0x00, 0x00, 0xff, 0xb5, 0x05, 0x1c, 0x3c, 0x00, 0x18, 0x32, 0x01, 0x00, 0x08, 0x1c, 0x00, 0x26, 0x81, 0xb0, 0xf4, 0xf7, 0x2f, 0xfe, 0x04, 0x1c, 0x02, 0xd0, 0x60, 0x68, 0xff, 0x28, 0x01, 0xd1, 0x06, 0x26, 0x28, 0xe0, 0x21, 0x1c, 0x20, 0x31, 0x0a, 0x78, 0x01, 0x2a, 0x01, 0xd1, 0x03, 0x26, 0x21, 0xe0, 0x01, 0x27, 0x25, 0x60, 0x0f, 0x70, 0x11, 0xc5, 0x1d, 0x48, 0x08, 0x3d, 0x68, 0x61, 0x03, 0x98, 0x6a, 0x46, 0xe8, 0x60, 0x04, 0x98, 0x3c, 0x00, 0x54, 0x32, 0x01, 0x00, 0x28, 0x61, 0x1a, 0x48, 0xa8, 0x61, 0x1a, 0x48, 0xe8, 0x61, 0x1a, 0x48, 0x28, 0x62, 0x1a, 0x48, 0x68, 0x62, 0x20, 0x7e, 0xa1, 0x68, 0xed, 0xf7, 0xb3, 0xfe, 0x00, 0x28, 0x06, 0xd1, 0x60, 0x7e, 0xe1, 0x68, 0x6a, 0x46, 0xed, 0xf7, 0xac, 0xfe, 0x00, 0x28, 0x07, 0xd0, 0x04, 0x26, 0x31, 0x1c, 0x9e, 0x20, 0xee, 0xf7, 0x0d, 0xf8, 0x30, 0x1c, 0x05, 0xb0, 0xf0, 0xbd, 0x3c, 0x00, 0x90, 0x32, 0x01, 0x00, 0x6a, 0x46, 0x0f, 0x49, 0x1d, 0x20, 0xed, 0xf7, 0x9d, 0xfe, 0x01, 0x21, 0x0d, 0x48, 0x49, 0x07, 0x01, 0x60, 0x22, 0x7e, 0x3b, 0x1c, 0xd2, 0x06, 0xd2, 0x0e, 0x93, 0x40, 0x43, 0x60, 0x62, 0x7e, 0xd2, 0x06, 0xd2, 0x0e, 0x97, 0x40, 0x47, 0x60, 0x41, 0x60, 0xe6, 0xe7, 0x31, 0x33, 0x01, 0x00, 0xd9, 0x32, 0x01, 0x00, 0x91, 0x31, 0x01, 0x00, 0xdd, 0x30, 0x01, 0x00, 0x3c, 0x00, 0xcc, 0x32, 0x01, 0x00, 0xfd, 0x32, 0x01, 0x00, 0x71, 0x33, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, 0x42, 0x68, 0x2c, 0x32, 0x50, 0x68, 0x43, 0x68, 0x0b, 0x60, 0x81, 0x68, 0x4b, 0x89, 0x0b, 0x81, 0x83, 0x68, 0x00, 0x21, 0xd9, 0x60, 0x41, 0x60, 0x81, 0x60, 0x00, 0x68, 0x50, 0x60, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x70, 0xb5, 0x42, 0x68, 0xff, 0x26, 0x91, 0x87, 0x10, 0x6b, 0x0c, 0x04, 0x3c, 0x00, 0x08, 0x33, 0x01, 0x00, 0x05, 0x1c, 0x36, 0x04, 0x34, 0x40, 0x43, 0x68, 0x59, 0x68, 0xb1, 0x43, 0x21, 0x43, 0x59, 0x60, 0x00, 0x68, 0xa8, 0x42, 0xf7, 0xd1, 0x10, 0x6b, 0x51, 0x69, 0x40, 0x68, 0x48, 0x60, 0x51, 0x69, 0x01, 0x20, 0x08, 0x60, 0x70, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x43, 0x68, 0x08, 0x1c, 0x59, 0x62, 0x9a, 0x62, 0x00, 0x25, 0x0a, 0xe0, 0x45, 0x81, 0xc4, 0x68, 0x2a, 0x1c, 0x3c, 0x00, 0x44, 0x33, 0x01, 0x00, 0x00, 0x2c, 0x03, 0xd1, 0x9a, 0x7e, 0x12, 0x07, 0x12, 0x0f, 0x10, 0x32, 0x42, 0x60, 0x20, 0x1c, 0x00, 0x28, 0xf2, 0xd1, 0x18, 0x69, 0x41, 0x60, 0x19, 0x69, 0x01, 0x20, 0x08, 0x60, 0x02, 0x48, 0x00, 0x68, 0xed, 0xf7, 0x37, 0xf8, 0xb0, 0xbd, 0x5c, 0x5b, 0x01, 0x00, 0x01, 0x20, 0x05, 0x49, 0x40, 0x07, 0x80, 0xb5, 0x88, 0x60, 0x04, 0x48, 0x01, 0x68, 0x0d, 0x20, 0x3c, 0x00, 0x80, 0x33, 0x01, 0x00, 0xfe, 0xf7, 0xe6, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0xc4, 0x60, 0x01, 0x00, 0xf8, 0xb5, 0x0e, 0x4f, 0x0c, 0x4e, 0x00, 0x24, 0x48, 0x20, 0x60, 0x43, 0xc5, 0x19, 0x48, 0x21, 0x28, 0x1c, 0xed, 0xf7, 0x7b, 0xf8, 0x1c, 0x20, 0x60, 0x43, 0x81, 0x19, 0x28, 0x1d, 0x1c, 0x22, 0xed, 0xf7, 0xfe, 0xf8, 0x1c, 0x23, 0xe8, 0x56, 0x05, 0x49, 0xfb, 0xf7, 0x3c, 0x00, 0xbc, 0x33, 0x01, 0x00, 0xcd, 0xf8, 0x01, 0x34, 0x01, 0x2c, 0xe9, 0xd3, 0xf8, 0xbd, 0x00, 0x00, 0xb8, 0x44, 0x01, 0x00, 0xcc, 0x6d, 0x01, 0x00, 0x15, 0x32, 0x01, 0x00, 0xff, 0xb5, 0x05, 0x1c, 0x0a, 0x30, 0x06, 0x1c, 0x81, 0xb0, 0xf2, 0xf7, 0xdd, 0xf8, 0x18, 0x4f, 0x04, 0x1c, 0x39, 0x88, 0xef, 0xf7, 0xbc, 0xfc, 0x32, 0x88, 0x78, 0x68, 0x02, 0x80, 0x72, 0x88, 0x02, 0x30, 0x02, 0x80, 0x3c, 0x00, 0xf8, 0x33, 0x01, 0x00, 0xb1, 0x88, 0x12, 0x4e, 0x41, 0x80, 0x28, 0x88, 0x08, 0x36, 0x40, 0x05, 0x00, 0x28, 0x05, 0xda, 0x69, 0x88, 0x03, 0x9a, 0x20, 0x1c, 0xf7, 0xf7, 0x01, 0xfd, 0x00, 0xe0, 0x00, 0x20, 0x70, 0x80, 0xf8, 0xf7, 0x5e, 0xfc, 0x01, 0x21, 0x09, 0x03, 0x00, 0x28, 0x30, 0x88, 0x01, 0xd0, 0x88, 0x43, 0x00, 0xe0, 0x08, 0x43, 0x30, 0x80, 0x05, 0x48, 0x00, 0x22, 0x00, 0x21, 0x3c, 0x00, 0x34, 0x34, 0x01, 0x00, 0x14, 0x30, 0xef, 0xf7, 0x65, 0xfc, 0x20, 0x1c, 0xf9, 0xf7, 0x74, 0xf8, 0x05, 0xb0, 0xf0, 0xbd, 0xb0, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0x0e, 0x4c, 0x60, 0x68, 0xf8, 0xf7, 0x95, 0xf9, 0x20, 0x68, 0x00, 0x6a, 0x00, 0x28, 0x13, 0xd1, 0xf8, 0xf7, 0xbf, 0xfc, 0x00, 0x28, 0x08, 0xd0, 0x21, 0x68, 0x01, 0x20, 0x08, 0x62, 0x1f, 0x21, 0x00, 0x22, 0x83, 0x20, 0x00, 0xf0, 0x3c, 0x00, 0x70, 0x34, 0x01, 0x00, 0x9f, 0xf9, 0x02, 0xe0, 0x60, 0x68, 0xf8, 0xf7, 0x21, 0xfa, 0xff, 0xf7, 0x97, 0xfc, 0x21, 0x68, 0x08, 0x61, 0x10, 0xbd, 0x14, 0x7a, 0x01, 0x00, 0xfe, 0xb5, 0x1b, 0x4e, 0x0f, 0x1c, 0x1d, 0x1c, 0x14, 0x1c, 0xb0, 0x60, 0x08, 0x1c, 0xf7, 0xf7, 0x2b, 0xff, 0xb0, 0x80, 0x34, 0x73, 0x35, 0x62, 0x38, 0x1c, 0x01, 0xaa, 0x02, 0xa9, 0xf7, 0xf7, 0x25, 0xff, 0x00, 0xab, 0x3c, 0x00, 0xac, 0x34, 0x01, 0x00, 0x18, 0x7a, 0x01, 0x28, 0x18, 0xd1, 0x18, 0x79, 0x0b, 0x28, 0x08, 0xd1, 0x30, 0x7f, 0x24, 0x23, 0x0f, 0x49, 0x58, 0x43, 0x40, 0x18, 0x80, 0x68, 0xec, 0xf7, 0x88, 0xff, 0xfe, 0xbd, 0x00, 0xab, 0x18, 0x79, 0x0a, 0x28, 0x08, 0xd1, 0xf7, 0xf7, 0x39, 0xfd, 0x07, 0x1c, 0x29, 0x1c, 0x20, 0x1c, 0xf7, 0xf7, 0x16, 0xfd, 0x38, 0x18, 0xb0, 0x80, 0x30, 0x7f, 0x24, 0x23, 0x3c, 0x00, 0xe8, 0x34, 0x01, 0x00, 0x04, 0x49, 0x58, 0x43, 0x40, 0x18, 0x40, 0x68, 0xec, 0xf7, 0x72, 0xff, 0xe8, 0xe7, 0x00, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x94, 0x46, 0x01, 0x00, 0xb0, 0xb5, 0xff, 0xf7, 0x53, 0xfc, 0x04, 0x1c, 0xfb, 0xf7, 0xfc, 0xfa, 0x0c, 0x4d, 0x29, 0x68, 0x09, 0x69, 0x09, 0x1b, 0x0c, 0x1a, 0x02, 0x21, 0x1f, 0x20, 0x00, 0xf0, 0x8b, 0xf8, 0x14, 0x2c, 0x06, 0xdd, 0x02, 0x22, 0x3c, 0x00, 0x24, 0x35, 0x01, 0x00, 0x21, 0x1c, 0x1f, 0x20, 0x00, 0xf0, 0x50, 0xf8, 0x01, 0x20, 0xb0, 0xbd, 0x29, 0x68, 0x01, 0x20, 0x89, 0x6a, 0x00, 0x29, 0xf9, 0xd0, 0x00, 0x20, 0xb0, 0xbd, 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, 0xf8, 0xb5, 0x1a, 0x4d, 0x07, 0x1c, 0xae, 0x79, 0x01, 0x21, 0x19, 0x4c, 0x00, 0x20, 0x22, 0x68, 0x00, 0x2a, 0x14, 0xd1, 0xae, 0x71, 0xa2, 0x68, 0xd0, 0x68, 0x06, 0xca, 0x3c, 0x00, 0x60, 0x35, 0x01, 0x00, 0xec, 0xf7, 0x3c, 0xff, 0xae, 0x79, 0x00, 0x21, 0x13, 0x4a, 0x50, 0x69, 0x01, 0x30, 0x50, 0x61, 0xa0, 0x68, 0x80, 0x68, 0xa0, 0x60, 0x62, 0x68, 0x90, 0x42, 0x06, 0xd1, 0x01, 0x20, 0x20, 0x60, 0x03, 0xe0, 0x01, 0x30, 0x0c, 0x34, 0x03, 0x28, 0xe3, 0xdb, 0x00, 0x2f, 0x08, 0xd1, 0x00, 0x29, 0x0a, 0xd0, 0x0a, 0x48, 0x40, 0x68, 0x00, 0x28, 0x06, 0xd0, 0xfa, 0xf7, 0x3c, 0x00, 0x9c, 0x35, 0x01, 0x00, 0xf5, 0xff, 0x03, 0xe0, 0x01, 0x2f, 0x03, 0xd0, 0x00, 0x29, 0x01, 0xd1, 0xae, 0x71, 0xce, 0xe7, 0xae, 0x71, 0xf8, 0xbd, 0x20, 0x10, 0x07, 0x00, 0x18, 0xd9, 0x01, 0x00, 0xa8, 0x60, 0x01, 0x00, 0x70, 0x5d, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x23, 0xf5, 0xf7, 0x7c, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x23, 0xf5, 0xf7, 0x76, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0x35, 0x01, 0x00, 0xf8, 0xb5, 0x13, 0x4b, 0x00, 0x24, 0x1b, 0x88, 0x98, 0x42, 0x1b, 0xd2, 0x11, 0x4b, 0xc0, 0x00, 0xc0, 0x18, 0x45, 0x68, 0x06, 0x68, 0x28, 0x68, 0x00, 0x28, 0x17, 0xd1, 0x0e, 0x4f, 0xa8, 0x68, 0x43, 0x68, 0xb3, 0x42, 0x09, 0xd1, 0xc3, 0x68, 0x8b, 0x42, 0x06, 0xd1, 0x03, 0x68, 0x93, 0x42, 0x01, 0xd0, 0x53, 0x1c, 0x01, 0xd1, 0x01, 0x24, 0x47, 0x60, 0x80, 0x68, 0x3c, 0x00, 0x14, 0x36, 0x01, 0x00, 0x6b, 0x68, 0x83, 0x42, 0xee, 0xd1, 0x03, 0xe0, 0x01, 0x21, 0x80, 0x20, 0xed, 0xf7, 0x40, 0xfe, 0x20, 0x1c, 0xf8, 0xbd, 0x56, 0x57, 0x01, 0x00, 0x84, 0x5d, 0x01, 0x00, 0x29, 0xe3, 0x00, 0x00, 0xf8, 0xb5, 0x17, 0x4f, 0x0a, 0x1c, 0xbe, 0x79, 0x16, 0x4d, 0x00, 0x23, 0x6c, 0x68, 0x07, 0xe0, 0x21, 0x68, 0x91, 0x42, 0x02, 0xd1, 0x21, 0x79, 0x81, 0x42, 0x04, 0xd0, 0x3c, 0x00, 0x50, 0x36, 0x01, 0x00, 0x23, 0x1c, 0xe4, 0x68, 0x00, 0x2c, 0xf5, 0xd1, 0x17, 0xe0, 0x00, 0x2c, 0x15, 0xd0, 0x00, 0x2b, 0x0d, 0xd1, 0xe3, 0x68, 0x0d, 0x48, 0x6b, 0x60, 0x00, 0x88, 0x00, 0x2b, 0x02, 0xd1, 0xff, 0xf7, 0xd1, 0xfb, 0x06, 0xe0, 0x0a, 0x4a, 0x99, 0x68, 0xff, 0xf7, 0xf6, 0xfb, 0x01, 0xe0, 0xe0, 0x68, 0xd8, 0x60, 0x28, 0x68, 0xe0, 0x60, 0x2c, 0x60, 0x02, 0xe0, 0x01, 0x21, 0x3c, 0x00, 0x8c, 0x36, 0x01, 0x00, 0xff, 0xf7, 0xa4, 0xff, 0xbe, 0x71, 0xf8, 0xbd, 0x20, 0x10, 0x07, 0x00, 0x7c, 0x5d, 0x01, 0x00, 0x2c, 0x74, 0x01, 0x00, 0x21, 0x38, 0x01, 0x00, 0x70, 0xb5, 0x09, 0x4e, 0xb5, 0x79, 0xf9, 0xf7, 0xaf, 0xfe, 0x04, 0x1c, 0x09, 0xd0, 0x20, 0x1c, 0xed, 0xf7, 0x0c, 0xfb, 0x05, 0x49, 0x8a, 0x68, 0x80, 0x18, 0x88, 0x60, 0x08, 0x68, 0x01, 0x30, 0x08, 0x60, 0xb5, 0x71, 0x3c, 0x00, 0xc8, 0x36, 0x01, 0x00, 0x20, 0x1c, 0x70, 0xbd, 0x20, 0x10, 0x07, 0x00, 0xa8, 0x60, 0x01, 0x00, 0x09, 0x48, 0x80, 0xb5, 0x40, 0x68, 0x02, 0x1c, 0x0b, 0xe0, 0x01, 0x69, 0x00, 0x29, 0x07, 0xd0, 0x82, 0x42, 0x04, 0xd0, 0x81, 0x68, 0x05, 0x48, 0x00, 0x88, 0xff, 0xf7, 0xe5, 0xfa, 0x80, 0xbd, 0xc0, 0x68, 0x00, 0x28, 0xf1, 0xd1, 0x80, 0xbd, 0x7c, 0x5d, 0x01, 0x00, 0x2c, 0x74, 0x01, 0x00, 0x3c, 0x00, 0x04, 0x37, 0x01, 0x00, 0x05, 0x48, 0x80, 0xb5, 0x42, 0x68, 0x00, 0x2a, 0x04, 0xd0, 0x04, 0x48, 0x00, 0x88, 0x91, 0x68, 0xff, 0xf7, 0xd2, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x7c, 0x5d, 0x01, 0x00, 0x2c, 0x74, 0x01, 0x00, 0x05, 0x48, 0x01, 0x68, 0x00, 0x29, 0x04, 0xd0, 0xc0, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x18, 0xd9, 0x01, 0x00, 0x3c, 0x00, 0x40, 0x37, 0x01, 0x00, 0x80, 0xb5, 0xf6, 0xf7, 0xd1, 0xfa, 0x80, 0xbd, 0x13, 0x1c, 0x0d, 0x4a, 0xb0, 0xb5, 0x12, 0x88, 0x90, 0x42, 0x0f, 0xd2, 0x03, 0x29, 0x0d, 0xd2, 0x0a, 0x4a, 0xc0, 0x00, 0x14, 0x58, 0x0a, 0x4d, 0xac, 0x42, 0x07, 0xd1, 0x13, 0x50, 0x0c, 0x23, 0x59, 0x43, 0x08, 0x4b, 0xc9, 0x18, 0x80, 0x18, 0x41, 0x60, 0xb0, 0xbd, 0x02, 0x21, 0x80, 0x20, 0xed, 0xf7, 0x94, 0xfd, 0x3c, 0x00, 0x7c, 0x37, 0x01, 0x00, 0xb0, 0xbd, 0x00, 0x00, 0x56, 0x57, 0x01, 0x00, 0x84, 0x5d, 0x01, 0x00, 0x09, 0xa0, 0x00, 0x00, 0x18, 0xd9, 0x01, 0x00, 0xf8, 0xb5, 0x0f, 0x1c, 0x1e, 0x1c, 0x15, 0x1c, 0x04, 0x1c, 0x11, 0x1c, 0xff, 0xf7, 0x4a, 0xff, 0x33, 0x1c, 0x2a, 0x1c, 0x39, 0x1c, 0x20, 0x1c, 0xf4, 0xf7, 0x8a, 0xff, 0xf8, 0xbd, 0x00, 0x00, 0xf7, 0xb5, 0x94, 0x46, 0xff, 0x29, 0x21, 0xd0, 0x3c, 0x00, 0xb8, 0x37, 0x01, 0x00, 0x15, 0x48, 0x00, 0x88, 0x81, 0x42, 0x21, 0xd2, 0x14, 0x4a, 0x15, 0x4e, 0xc8, 0x00, 0x85, 0x18, 0xb4, 0x79, 0x68, 0x68, 0x02, 0x68, 0x00, 0x2a, 0x03, 0xd1, 0x03, 0x1d, 0x0c, 0xcb, 0x9a, 0x42, 0x11, 0xd0, 0x43, 0x68, 0x9a, 0x68, 0x42, 0x60, 0x0e, 0x4a, 0x17, 0x69, 0x01, 0x37, 0x17, 0x61, 0xb4, 0x71, 0x00, 0x22, 0x02, 0x60, 0x00, 0x98, 0xd8, 0x60, 0x60, 0x46, 0x3c, 0x00, 0xf4, 0x37, 0x01, 0x00, 0x18, 0x60, 0x19, 0x74, 0x28, 0x68, 0x58, 0x60, 0xfe, 0xbd, 0xb4, 0x71, 0x06, 0x21, 0x00, 0xe0, 0x07, 0x21, 0x80, 0x20, 0xed, 0xf7, 0x4c, 0xfd, 0xf6, 0xe7, 0x00, 0x00, 0x56, 0x57, 0x01, 0x00, 0x84, 0x5d, 0x01, 0x00, 0x20, 0x10, 0x07, 0x00, 0xa8, 0x60, 0x01, 0x00, 0xb0, 0xb5, 0x14, 0x4d, 0x6c, 0x68, 0x00, 0x2c, 0x01, 0xd0, 0x84, 0x42, 0x04, 0xd0, 0x0c, 0x21, 0x3c, 0x00, 0x30, 0x38, 0x01, 0x00, 0x80, 0x20, 0xed, 0xf7, 0x37, 0xfd, 0xb0, 0xbd, 0xff, 0xf7, 0xb8, 0xfa, 0xa1, 0x68, 0x40, 0x1a, 0x0d, 0x49, 0x88, 0x42, 0x03, 0xda, 0x10, 0x21, 0x80, 0x20, 0xed, 0xf7, 0x2b, 0xfd, 0x21, 0x79, 0x22, 0x68, 0x01, 0x20, 0xff, 0xf7, 0xac, 0xff, 0xe3, 0x68, 0x6b, 0x60, 0x00, 0x2b, 0x05, 0xd0, 0x07, 0x48, 0x06, 0x4a, 0x00, 0x88, 0x99, 0x68, 0xff, 0xf7, 0xfe, 0xfa, 0x3c, 0x00, 0x6c, 0x38, 0x01, 0x00, 0x28, 0x68, 0xe0, 0x60, 0x2c, 0x60, 0xb0, 0xbd, 0x7c, 0x5d, 0x01, 0x00, 0x18, 0xfc, 0xff, 0xff, 0x21, 0x38, 0x01, 0x00, 0x2c, 0x74, 0x01, 0x00, 0xb0, 0xb5, 0x15, 0x4c, 0x08, 0x20, 0x21, 0x1c, 0x80, 0x31, 0x08, 0x70, 0x13, 0x4a, 0x41, 0x04, 0x11, 0x60, 0x13, 0x48, 0x00, 0x68, 0x13, 0x4d, 0x6b, 0x69, 0x18, 0x40, 0x01, 0xd1, 0x10, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x3c, 0x00, 0xa8, 0x38, 0x01, 0x00, 0xa8, 0x23, 0x5b, 0x5d, 0x18, 0x43, 0x23, 0x1c, 0x40, 0x33, 0x18, 0x73, 0x51, 0x60, 0x20, 0x78, 0x80, 0x08, 0x80, 0x00, 0x20, 0x70, 0x00, 0x20, 0xff, 0xf7, 0x12, 0xfb, 0xff, 0xf7, 0x72, 0xfa, 0x64, 0x30, 0x28, 0x66, 0x01, 0x38, 0xa0, 0x61, 0x20, 0x78, 0x03, 0x21, 0x08, 0x43, 0x20, 0x70, 0xb0, 0xbd, 0x00, 0x00, 0x00, 0x90, 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0x3c, 0x00, 0xe4, 0x38, 0x01, 0x00, 0x10, 0x00, 0x07, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x38, 0xb5, 0x0a, 0x4c, 0x21, 0x1c, 0x20, 0x31, 0x8a, 0x79, 0x00, 0xab, 0x1a, 0x70, 0xc9, 0x79, 0x07, 0x4d, 0x59, 0x70, 0x69, 0x78, 0x88, 0x42, 0x03, 0xd1, 0xf8, 0xf7, 0x13, 0xfc, 0xff, 0x20, 0x68, 0x70, 0x00, 0xab, 0x18, 0x88, 0xe0, 0x84, 0x38, 0xbd, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x4c, 0x7b, 0x01, 0x00, 0x3c, 0x00, 0x20, 0x39, 0x01, 0x00, 0xf8, 0xb5, 0x0b, 0x1c, 0x06, 0x1c, 0x04, 0x1d, 0x7f, 0x33, 0x14, 0xd0, 0x33, 0x68, 0x5d, 0x18, 0x35, 0x60, 0x23, 0x88, 0x1f, 0x18, 0x06, 0x23, 0xff, 0x56, 0xeb, 0x1b, 0x33, 0x60, 0x23, 0x88, 0x18, 0x18, 0x81, 0x71, 0x20, 0x88, 0x01, 0x30, 0x00, 0x04, 0x00, 0x0c, 0x20, 0x80, 0x90, 0x42, 0x01, 0xd3, 0x00, 0x20, 0x20, 0x80, 0x10, 0x1c, 0x31, 0x68, 0xec, 0xf7, 0x3c, 0x00, 0x5c, 0x39, 0x01, 0x00, 0x6d, 0xfe, 0xf8, 0xbd, 0x0e, 0x49, 0x0a, 0x7c, 0x83, 0x78, 0x1a, 0x43, 0x0a, 0x74, 0x42, 0x78, 0x83, 0x78, 0x9a, 0x43, 0x0b, 0x7c, 0x93, 0x43, 0x0b, 0x74, 0x8a, 0x7c, 0x43, 0x78, 0x1a, 0x43, 0x8a, 0x74, 0x8a, 0x7c, 0x03, 0x78, 0x9a, 0x43, 0x8a, 0x74, 0x02, 0x78, 0x43, 0x78, 0x1a, 0x43, 0x4b, 0x7c, 0x1a, 0x43, 0x4a, 0x74, 0x4a, 0x7c, 0xc0, 0x78, 0x82, 0x43, 0x3c, 0x00, 0x98, 0x39, 0x01, 0x00, 0x4a, 0x74, 0x70, 0x47, 0x10, 0x00, 0x07, 0x00, 0xb0, 0xb5, 0x06, 0x4d, 0x00, 0x24, 0x20, 0x06, 0x00, 0x0e, 0xed, 0xf7, 0xf7, 0xf8, 0xa1, 0x00, 0x69, 0x58, 0x08, 0x71, 0x01, 0x34, 0x04, 0x2c, 0xf5, 0xdb, 0xb0, 0xbd, 0x10, 0x7b, 0x01, 0x00, 0x0b, 0x48, 0x0c, 0x49, 0x7d, 0x23, 0x42, 0x69, 0xdb, 0x00, 0x00, 0x2a, 0xc8, 0x6b, 0x07, 0xd0, 0xc0, 0x18, 0x1a, 0x01, 0x3c, 0x00, 0xd4, 0x39, 0x01, 0x00, 0x90, 0x42, 0xc8, 0x63, 0x01, 0xd9, 0x07, 0x48, 0xc8, 0x63, 0x70, 0x47, 0xff, 0x38, 0xf5, 0x38, 0xc8, 0x63, 0x98, 0x42, 0xf9, 0xd2, 0xcb, 0x63, 0x70, 0x47, 0x00, 0x00, 0xf4, 0x68, 0x01, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x70, 0x17, 0x00, 0x00, 0x70, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x16, 0x1c, 0xfb, 0xf7, 0xf6, 0xfa, 0xb0, 0x43, 0x28, 0x43, 0x01, 0x1c, 0x20, 0x1c, 0x3c, 0x00, 0x10, 0x3a, 0x01, 0x00, 0x00, 0xf0, 0xcc, 0xfa, 0x70, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x0b, 0x4a, 0x00, 0x29, 0x09, 0xd0, 0x02, 0x29, 0x0f, 0xd1, 0x01, 0x1c, 0x08, 0x48, 0xd2, 0x78, 0x38, 0x30, 0xff, 0xf7, 0x78, 0xff, 0x06, 0x49, 0x06, 0xe0, 0x01, 0x1c, 0x04, 0x48, 0x12, 0x79, 0x20, 0x30, 0xff, 0xf7, 0x70, 0xff, 0x03, 0x49, 0x08, 0x60, 0x80, 0xbd, 0x00, 0x00, 0xac, 0x7c, 0x01, 0x00, 0x3c, 0x00, 0x4c, 0x3a, 0x01, 0x00, 0xc8, 0x67, 0x01, 0x00, 0xc4, 0x67, 0x01, 0x00, 0x80, 0xb5, 0x0b, 0x4a, 0x00, 0x29, 0x09, 0xd0, 0x02, 0x29, 0x0f, 0xd1, 0x01, 0x1c, 0x08, 0x48, 0x52, 0x79, 0x68, 0x30, 0xff, 0xf7, 0x5a, 0xff, 0x06, 0x49, 0x06, 0xe0, 0x01, 0x1c, 0x04, 0x48, 0x92, 0x79, 0x50, 0x30, 0xff, 0xf7, 0x52, 0xff, 0x03, 0x49, 0x08, 0x60, 0x80, 0xbd, 0x00, 0x00, 0xac, 0x7c, 0x01, 0x00, 0x3c, 0x00, 0x88, 0x3a, 0x01, 0x00, 0xd0, 0x67, 0x01, 0x00, 0xcc, 0x67, 0x01, 0x00, 0x08, 0xb5, 0x04, 0x21, 0x00, 0x91, 0x81, 0x7e, 0x43, 0x68, 0x03, 0x29, 0x06, 0xd1, 0x01, 0x1c, 0x0c, 0x31, 0x01, 0x20, 0x6a, 0x46, 0xec, 0xf7, 0x9a, 0xfc, 0x08, 0xbd, 0x19, 0x68, 0xc1, 0x60, 0xfb, 0xe7, 0x00, 0x00, 0x10, 0xb5, 0x03, 0x1c, 0x00, 0x20, 0x08, 0x4c, 0x00, 0x21, 0xca, 0x00, 0x12, 0x19, 0x92, 0x78, 0x3c, 0x00, 0xc4, 0x3a, 0x01, 0x00, 0x9a, 0x42, 0x03, 0xd1, 0xc8, 0x00, 0x00, 0x19, 0x40, 0x68, 0x10, 0xbd, 0x01, 0x31, 0x09, 0x06, 0x09, 0x16, 0x06, 0x29, 0xf1, 0xdb, 0x10, 0xbd, 0xcc, 0x5a, 0x01, 0x00, 0xf8, 0xb5, 0x0f, 0x1c, 0x16, 0x1c, 0x00, 0x25, 0xfe, 0xf7, 0x8e, 0xf9, 0x04, 0x1c, 0x0a, 0xd0, 0x4a, 0x20, 0x00, 0x5d, 0x05, 0x28, 0x06, 0xd1, 0x38, 0x1c, 0xf1, 0xf7, 0x81, 0xfe, 0x00, 0x28, 0x3c, 0x00, 0x00, 0x3b, 0x01, 0x00, 0x01, 0xd0, 0x01, 0x25, 0x34, 0x60, 0x28, 0x1c, 0xf8, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x0d, 0x1c, 0x16, 0x1c, 0x00, 0x24, 0xfe, 0xf7, 0x78, 0xf9, 0x00, 0x28, 0x0b, 0xd0, 0x4a, 0x21, 0x09, 0x5c, 0x05, 0x29, 0x07, 0xd1, 0x01, 0x69, 0x00, 0x29, 0x04, 0xd1, 0x30, 0x60, 0xf1, 0xf7, 0x04, 0xfd, 0x01, 0x24, 0x28, 0x60, 0x20, 0x1c, 0x70, 0xbd, 0xf8, 0xb5, 0x06, 0x1c, 0x3c, 0x00, 0x3c, 0x3b, 0x01, 0x00, 0x00, 0x25, 0x0c, 0x1c, 0x08, 0x1c, 0xf1, 0xf7, 0x5d, 0xfe, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x21, 0x05, 0xe0, 0x20, 0x1c, 0xf1, 0xf7, 0x74, 0xfe, 0x00, 0x28, 0x14, 0xd0, 0x01, 0x21, 0x30, 0x1c, 0xf4, 0xf7, 0x80, 0xfb, 0x00, 0x90, 0x00, 0x28, 0x0d, 0xd0, 0x08, 0x4f, 0x01, 0x25, 0x06, 0x22, 0x31, 0x1c, 0x38, 0x1c, 0xec, 0xf7, 0xc2, 0xfc, 0x06, 0x22, 0x21, 0x1c, 0x3c, 0x00, 0x78, 0x3b, 0x01, 0x00, 0xb8, 0x18, 0xec, 0xf7, 0xbd, 0xfc, 0x00, 0x98, 0xf8, 0x60, 0x28, 0x1c, 0xf8, 0xbd, 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x00, 0x21, 0x00, 0x28, 0x06, 0xd0, 0x42, 0x78, 0x07, 0x2a, 0x03, 0xd1, 0xc0, 0x79, 0x01, 0x28, 0x00, 0xd1, 0x01, 0x21, 0x08, 0x1c, 0x70, 0x47, 0xf8, 0xb5, 0x05, 0x1c, 0x00, 0x27, 0x16, 0x4e, 0xf1, 0xf7, 0x28, 0xfe, 0x00, 0x28, 0x07, 0xd0, 0x3c, 0x00, 0xb4, 0x3b, 0x01, 0x00, 0xf1, 0xf7, 0xc0, 0xfb, 0x00, 0x28, 0x10, 0xd1, 0x00, 0x24, 0xf1, 0xf7, 0xbb, 0xfc, 0x06, 0xe0, 0xf1, 0xf7, 0x02, 0xfe, 0x00, 0x28, 0x08, 0xd0, 0x01, 0x24, 0xf1, 0xf7, 0x99, 0xfd, 0x01, 0x1c, 0x06, 0x22, 0x30, 0x1c, 0xec, 0xf7, 0x8e, 0xfc, 0x01, 0x27, 0x00, 0x2f, 0x0d, 0xd0, 0x21, 0x1c, 0x28, 0x1c, 0xf4, 0xf7, 0x3b, 0xfb, 0x01, 0x1c, 0x05, 0x48, 0x06, 0x22, 0x3c, 0x00, 0xf0, 0x3b, 0x01, 0x00, 0x06, 0x38, 0xc1, 0x60, 0x29, 0x1c, 0xec, 0xf7, 0x7f, 0xfc, 0x01, 0x20, 0xf8, 0xbd, 0x00, 0x20, 0xfc, 0xe7, 0x00, 0x00, 0x76, 0x7c, 0x01, 0x00, 0xf0, 0xb5, 0x07, 0x1c, 0x00, 0x68, 0x02, 0x21, 0x04, 0x68, 0x78, 0x69, 0x87, 0xb0, 0x01, 0x40, 0x00, 0x25, 0x00, 0x29, 0x05, 0x91, 0x74, 0x4e, 0x12, 0xd0, 0x22, 0x88, 0x01, 0x21, 0x13, 0x05, 0x02, 0xd4, 0xc0, 0x07, 0x3c, 0x00, 0x2c, 0x3c, 0x01, 0x00, 0xc1, 0x17, 0x01, 0x31, 0x6f, 0x48, 0x00, 0x29, 0x00, 0x68, 0x01, 0xd0, 0x01, 0x30, 0x04, 0xe0, 0x11, 0x06, 0x89, 0x0e, 0x2d, 0x29, 0x01, 0xd1, 0x03, 0x30, 0x30, 0x60, 0x20, 0x88, 0x80, 0x07, 0x67, 0xd1, 0x78, 0x69, 0xc0, 0x07, 0x64, 0xd5, 0x03, 0xaa, 0x04, 0xa9, 0x20, 0x1c, 0xf7, 0xf7, 0x4b, 0xfb, 0x00, 0xab, 0x18, 0x7c, 0x00, 0x28, 0x07, 0xd0, 0x18, 0x7c, 0x3c, 0x00, 0x68, 0x3c, 0x01, 0x00, 0x02, 0x28, 0x58, 0xd1, 0x18, 0x7b, 0x40, 0x07, 0x40, 0x0f, 0x04, 0x28, 0x53, 0xd8, 0x20, 0x79, 0x05, 0x99, 0xc0, 0x07, 0xc0, 0x17, 0x01, 0x30, 0x02, 0x90, 0x00, 0x29, 0x02, 0xd1, 0x02, 0x98, 0x00, 0x28, 0x48, 0xd1, 0x05, 0x99, 0x00, 0x29, 0x04, 0xd0, 0x20, 0x88, 0x00, 0x05, 0x01, 0xd4, 0x00, 0x20, 0x30, 0x60, 0xc0, 0x20, 0xed, 0xf7, 0xcb, 0xfd, 0x05, 0x1c, 0x3c, 0x00, 0xa4, 0x3c, 0x01, 0x00, 0x20, 0x1c, 0x0a, 0x30, 0x06, 0x90, 0xfe, 0xf7, 0xad, 0xf8, 0x06, 0x1c, 0x28, 0x1c, 0x08, 0x30, 0x23, 0x88, 0x02, 0x1d, 0x11, 0x1d, 0xdb, 0x05, 0x06, 0xd5, 0x06, 0x9b, 0x03, 0x60, 0x20, 0x1c, 0x10, 0x30, 0x10, 0x60, 0x20, 0x1d, 0x0e, 0xe0, 0x23, 0x1d, 0x13, 0x60, 0x22, 0x88, 0x92, 0x05, 0x05, 0xd5, 0x22, 0x1c, 0x10, 0x32, 0x02, 0x60, 0x06, 0x9b, 0x0b, 0x60, 0x3c, 0x00, 0xe0, 0x3c, 0x01, 0x00, 0x04, 0xe0, 0x06, 0x9b, 0x03, 0x60, 0x20, 0x1c, 0x10, 0x30, 0x08, 0x60, 0x28, 0x69, 0xf1, 0xf7, 0x43, 0xfc, 0x00, 0x28, 0x08, 0xd0, 0x01, 0x28, 0x12, 0xd0, 0x02, 0x28, 0x58, 0xd1, 0x00, 0xab, 0x18, 0x7c, 0x00, 0x28, 0x54, 0xd1, 0x12, 0xe0, 0x00, 0xab, 0x18, 0x7c, 0x02, 0x28, 0x0b, 0xd1, 0x00, 0x2e, 0x4d, 0xd0, 0x4b, 0x20, 0x80, 0x5d, 0x02, 0x28, 0x49, 0xd1, 0x3c, 0x00, 0x1c, 0x3d, 0x01, 0x00, 0x07, 0xe0, 0x63, 0xe0, 0x00, 0xab, 0x18, 0x7c, 0x00, 0x28, 0x02, 0xd1, 0x38, 0x1c, 0xfe, 0xf7, 0x1b, 0xff, 0x20, 0x88, 0x41, 0x04, 0x30, 0x48, 0x11, 0xd5, 0x00, 0x2e, 0x52, 0xd0, 0x00, 0xab, 0x19, 0x7c, 0x00, 0x29, 0x26, 0xd0, 0x02, 0x99, 0x00, 0x29, 0x02, 0xd0, 0xb0, 0x6a, 0x00, 0x78, 0x00, 0xe0, 0x00, 0x78, 0x01, 0x28, 0x1d, 0xd0, 0x03, 0x28, 0x43, 0xd1, 0x3c, 0x00, 0x58, 0x3d, 0x01, 0x00, 0x1a, 0xe0, 0x00, 0xab, 0x19, 0x7c, 0x02, 0x29, 0x16, 0xd1, 0x19, 0x7b, 0x04, 0x29, 0x13, 0xd0, 0x19, 0x7b, 0x0c, 0x29, 0x10, 0xd0, 0x22, 0x49, 0x09, 0x68, 0x00, 0x29, 0x0c, 0xd0, 0x00, 0x2e, 0x0a, 0xd0, 0x02, 0x99, 0x00, 0x29, 0x02, 0xd0, 0xb0, 0x6a, 0x00, 0x78, 0x00, 0xe0, 0x00, 0x78, 0x01, 0x28, 0x29, 0xd0, 0x03, 0x28, 0x27, 0xd0, 0x28, 0x22, 0x39, 0x1c, 0x3c, 0x00, 0x94, 0x3d, 0x01, 0x00, 0x28, 0x1c, 0x88, 0x30, 0xec, 0xf7, 0x0a, 0xfc, 0x00, 0xab, 0x19, 0x7c, 0x28, 0x1c, 0x80, 0x30, 0x01, 0x71, 0x19, 0x7b, 0x41, 0x71, 0x6c, 0x60, 0x6e, 0x61, 0x1b, 0xe0, 0x05, 0x99, 0x00, 0x29, 0x14, 0xd0, 0x11, 0x48, 0x84, 0x6c, 0x00, 0x2c, 0x10, 0xd0, 0x00, 0x22, 0x00, 0x2e, 0x04, 0xd0, 0x40, 0x36, 0xb0, 0x7a, 0x05, 0x28, 0x00, 0xd1, 0x01, 0x22, 0x00, 0x92, 0x3c, 0x00, 0xd0, 0x3d, 0x01, 0x00, 0xf8, 0x7a, 0xba, 0x7a, 0x29, 0x69, 0xc3, 0x07, 0xdb, 0x0f, 0x06, 0x98, 0xec, 0xf7, 0x00, 0xfb, 0x28, 0x1c, 0xed, 0xf7, 0x07, 0xfd, 0x00, 0x25, 0x28, 0x1c, 0x07, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xc4, 0x6a, 0x01, 0x00, 0x68, 0x61, 0x01, 0x00, 0x28, 0x61, 0x01, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x20, 0xff, 0xf7, 0x70, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x3e, 0x01, 0x00, 0xb0, 0xb5, 0x1d, 0x4d, 0x01, 0x28, 0x17, 0xd0, 0xa2, 0x28, 0x06, 0xd0, 0xa3, 0x28, 0x03, 0xd1, 0x01, 0x21, 0x15, 0x20, 0xff, 0xf7, 0x08, 0xfc, 0xb0, 0xbd, 0x00, 0x29, 0x01, 0xd1, 0x17, 0x48, 0x02, 0xe0, 0x7d, 0x20, 0xc0, 0x00, 0x48, 0x43, 0x00, 0x23, 0x01, 0x22, 0x01, 0x1c, 0x28, 0x60, 0x15, 0x20, 0xff, 0xf7, 0xa7, 0xfc, 0xb0, 0xbd, 0x01, 0x29, 0x04, 0xd0, 0x3c, 0x00, 0x48, 0x3e, 0x01, 0x00, 0x02, 0x29, 0xfa, 0xd1, 0x00, 0xf0, 0x2a, 0xf8, 0xb0, 0xbd, 0x6c, 0x68, 0xf5, 0xf7, 0xde, 0xfc, 0xfe, 0xf7, 0xa8, 0xff, 0x68, 0x60, 0x00, 0x2c, 0x09, 0xd0, 0x29, 0x68, 0x0a, 0x23, 0x59, 0x43, 0x00, 0x1b, 0x88, 0x42, 0x03, 0xd9, 0x01, 0x21, 0x15, 0x20, 0xed, 0xf7, 0x17, 0xfa, 0x01, 0x22, 0x15, 0x20, 0x29, 0x68, 0xff, 0xf7, 0xa6, 0xfb, 0xb0, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x84, 0x3e, 0x01, 0x00, 0x04, 0x79, 0x01, 0x00, 0x00, 0x87, 0x93, 0x03, 0x01, 0x20, 0x04, 0x49, 0x40, 0x03, 0x80, 0xb5, 0x08, 0x60, 0x03, 0x21, 0x15, 0x20, 0xed, 0xf7, 0x03, 0xfa, 0x80, 0xbd, 0x00, 0x10, 0x07, 0x00, 0x07, 0x48, 0x80, 0xb5, 0xbe, 0x21, 0x01, 0x73, 0x01, 0x7a, 0x10, 0x22, 0x11, 0x43, 0x01, 0x72, 0x00, 0x23, 0x02, 0x22, 0x15, 0x20, 0x03, 0x49, 0xff, 0xf7, 0x68, 0xfc, 0x3c, 0x00, 0xc0, 0x3e, 0x01, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, 0x80, 0x9f, 0xd5, 0x00, 0x80, 0xb5, 0x00, 0x28, 0x03, 0xd0, 0x0a, 0x1c, 0x15, 0x21, 0xa2, 0x20, 0x02, 0xe0, 0x00, 0x22, 0x15, 0x21, 0xa3, 0x20, 0xff, 0xf7, 0x66, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x00, 0xf0, 0x19, 0xf8, 0x0a, 0x48, 0xbe, 0x21, 0x01, 0x73, 0x03, 0x7a, 0x10, 0x22, 0x93, 0x43, 0x01, 0x24, 0x3c, 0x00, 0xfc, 0x3e, 0x01, 0x00, 0x23, 0x43, 0x03, 0x72, 0x01, 0x73, 0x01, 0x7a, 0x91, 0x43, 0x20, 0x22, 0x11, 0x43, 0x01, 0x72, 0x02, 0x22, 0x15, 0x20, 0x02, 0x49, 0xff, 0xf7, 0x5b, 0xfb, 0x10, 0xbd, 0x00, 0x03, 0x07, 0x00, 0x80, 0x9f, 0xd5, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x15, 0x20, 0xff, 0xf7, 0x85, 0xfb, 0x04, 0x48, 0xbe, 0x21, 0x01, 0x73, 0x01, 0x7a, 0x11, 0x22, 0x91, 0x43, 0x01, 0x72, 0x3c, 0x00, 0x38, 0x3f, 0x01, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x05, 0x1c, 0x60, 0x36, 0x00, 0x27, 0x44, 0x68, 0x22, 0xe0, 0x08, 0x21, 0x00, 0x20, 0xed, 0xf7, 0x41, 0xfb, 0x60, 0x61, 0x01, 0x89, 0x04, 0x39, 0x09, 0x04, 0x09, 0x0c, 0x01, 0x81, 0x60, 0x69, 0x00, 0x68, 0x40, 0x18, 0x04, 0x21, 0xed, 0xf7, 0x35, 0xfb, 0xe0, 0x61, 0x60, 0x69, 0x71, 0x7b, 0x3c, 0x00, 0x74, 0x3f, 0x01, 0x00, 0x00, 0x68, 0x89, 0x01, 0xc1, 0x70, 0x29, 0x69, 0x0c, 0x31, 0x03, 0x22, 0xec, 0xf7, 0xba, 0xfa, 0x28, 0x69, 0x0c, 0x30, 0x01, 0x68, 0x01, 0x31, 0x01, 0x60, 0x25, 0x62, 0xa7, 0x61, 0x24, 0x68, 0x00, 0x2c, 0xda, 0xd1, 0x02, 0x49, 0x03, 0x48, 0x6a, 0x68, 0xf6, 0xf7, 0xb3, 0xf8, 0xf8, 0xbd, 0xfd, 0x6b, 0x00, 0x00, 0xa0, 0x6a, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x07, 0x3c, 0x00, 0xb0, 0x3f, 0x01, 0x00, 0x00, 0x09, 0x09, 0x02, 0x09, 0x0a, 0x08, 0x43, 0x02, 0x49, 0x08, 0x60, 0xff, 0xf7, 0x20, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x60, 0x00, 0x07, 0x00, 0x08, 0x00, 0x14, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x10, 0x00, 0x14, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x1c, 0x00, 0x14, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x3c, 0x00, 0xec, 0x3f, 0x01, 0x00, 0x24, 0x01, 0x07, 0x00, 0x32, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x40, 0x06, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x41, 0x6e, 0x62, 0x69, 0x7e, 0x64, 0x61, 0x6f, 0x6f, 0x00, 0x00, 0x00, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x36, 0x5f, 0x37, 0x5f, 0x31, 0x35, 0x20, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x32, 0x3a, 0x35, 0x3c, 0x00, 0x28, 0x40, 0x01, 0x00, 0x32, 0x39, 0x38, 0x20, 0x53, 0x65, 0x70, 0x20, 0x30, 0x34, 0x20, 0x32, 0x30, 0x30, 0x39, 0x20, 0x31, 0x37, 0x3a, 0x31, 0x33, 0x3a, 0x32, 0x30, 0x20, 0x28, 0x48, 0x57, 0x3d, 0x34, 0x3a, 0x33, 0x2c, 0x42, 0x54, 0x43, 0x4f, 0x45, 0x58, 0x29, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x1c, 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3c, 0x00, 0x64, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xd0, 0x07, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x7c, 0x15, 0x15, 0x00, 0x3c, 0x00, 0xa0, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x70, 0x17, 0x1e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x28, 0x23, 0x16, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xf8, 0x2a, 0x0b, 0x00, 0x3c, 0x00, 0xdc, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0xe0, 0x2e, 0x12, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x50, 0x46, 0x0e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0xf0, 0x55, 0x08, 0x00, 0x3c, 0x00, 0x18, 0x41, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0xc0, 0x5d, 0x0e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xe8, 0x80, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x3c, 0x00, 0x54, 0x41, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x80, 0xbb, 0x0a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0xf0, 0xd2, 0x0a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x90, 0x00, 0x3c, 0x00, 0x90, 0x41, 0x01, 0x00, 0xc0, 0x00, 0x90, 0x00, 0xc0, 0x00, 0x90, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0xc0, 0x00, 0x90, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0xc0, 0x00, 0x90, 0x00, 0x14, 0x00, 0x10, 0x00, 0xc0, 0x00, 0x90, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0xc0, 0x00, 0x90, 0x00, 0x60, 0x00, 0x48, 0x00, 0x3c, 0x00, 0xcc, 0x41, 0x01, 0x00, 0x60, 0x00, 0x48, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0x60, 0x00, 0x48, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0x60, 0x00, 0x48, 0x00, 0x14, 0x00, 0x10, 0x00, 0x60, 0x00, 0x48, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0x02, 0x00, 0x04, 0x01, 0x0b, 0x02, 0x0c, 0x03, 0x12, 0x04, 0x16, 0x05, 0x3c, 0x00, 0x08, 0x42, 0x01, 0x00, 0x18, 0x06, 0x00, 0x0e, 0x00, 0x0e, 0x24, 0x07, 0x00, 0x0e, 0x2c, 0x08, 0x30, 0x09, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x42, 0x0a, 0x00, 0x0e, 0x48, 0x0b, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x60, 0x0c, 0x00, 0x0e, 0x00, 0x0e, 0x6c, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xff, 0xff, 0xff, 0x3c, 0x00, 0x44, 0x42, 0x01, 0x00, 0xb6, 0xff, 0xff, 0xff, 0xd3, 0xff, 0xff, 0xff, 0xc9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0xb0, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x51, 0xb0, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x59, 0xaf, 0x00, 0x00, 0x3c, 0x00, 0x80, 0x42, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0xaf, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xb0, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xbc, 0x42, 0x01, 0x00, 0x95, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0xb0, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x42, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x17, 0x01, 0x00, 0x35, 0x17, 0x01, 0x00, 0x21, 0x17, 0x01, 0x00, 0xd9, 0x9c, 0x00, 0x00, 0x49, 0x17, 0x01, 0x00, 0x3d, 0x17, 0x01, 0x00, 0xd1, 0x9c, 0x00, 0x00, 0xd1, 0x9c, 0x00, 0x00, 0x1d, 0x1a, 0x01, 0x00, 0xd1, 0x9c, 0x00, 0x00, 0x01, 0x1a, 0x01, 0x00, 0x31, 0x1a, 0x01, 0x00, 0x25, 0x1a, 0x01, 0x00, 0x3d, 0x17, 0x01, 0x00, 0x3c, 0x00, 0x34, 0x43, 0x01, 0x00, 0x81, 0x1a, 0x01, 0x00, 0xd1, 0x9c, 0x00, 0x00, 0x79, 0x17, 0x01, 0x00, 0xd9, 0x9c, 0x00, 0x00, 0x5d, 0x17, 0x01, 0x00, 0xa1, 0x17, 0x01, 0x00, 0x95, 0x17, 0x01, 0x00, 0x81, 0x17, 0x01, 0x00, 0x21, 0x18, 0x01, 0x00, 0xf5, 0x17, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x70, 0x43, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x19, 0x1c, 0x01, 0x00, 0x89, 0x41, 0x00, 0x00, 0x89, 0x41, 0x00, 0x00, 0x85, 0x41, 0x00, 0x00, 0x85, 0x41, 0x00, 0x00, 0x85, 0x41, 0x00, 0x00, 0x85, 0x41, 0x00, 0x00, 0x89, 0x41, 0x00, 0x00, 0x85, 0x41, 0x00, 0x00, 0x85, 0x41, 0x00, 0x00, 0x35, 0x1b, 0x01, 0x00, 0x3c, 0x00, 0xac, 0x43, 0x01, 0x00, 0x9d, 0x1b, 0x01, 0x00, 0x01, 0x1c, 0x01, 0x00, 0x89, 0x41, 0x00, 0x00, 0x89, 0x41, 0x00, 0x00, 0x89, 0x41, 0x00, 0x00, 0x85, 0x41, 0x00, 0x00, 0x65, 0x18, 0x01, 0x00, 0x29, 0x18, 0x01, 0x00, 0x39, 0x18, 0x01, 0x00, 0xbd, 0x18, 0x01, 0x00, 0x89, 0x41, 0x00, 0x00, 0x4d, 0x18, 0x01, 0x00, 0xa5, 0x18, 0x01, 0x00, 0x85, 0x41, 0x00, 0x00, 0x01, 0x19, 0x01, 0x00, 0x3c, 0x00, 0xe8, 0x43, 0x01, 0x00, 0xd9, 0x18, 0x01, 0x00, 0xed, 0x18, 0x01, 0x00, 0x15, 0x19, 0x01, 0x00, 0x89, 0x41, 0x00, 0x00, 0x89, 0x41, 0x00, 0x00, 0x89, 0x41, 0x00, 0x00, 0x85, 0x41, 0x00, 0x00, 0x89, 0x41, 0x00, 0x00, 0x89, 0x41, 0x00, 0x00, 0x69, 0x1c, 0x01, 0x00, 0x89, 0x41, 0x00, 0x00, 0x71, 0x1c, 0x01, 0x00, 0x89, 0x41, 0x00, 0x00, 0x89, 0x41, 0x00, 0x00, 0xfd, 0xdb, 0x00, 0x00, 0x3c, 0x00, 0x24, 0x44, 0x01, 0x00, 0x1d, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xf5, 0xda, 0x00, 0x00, 0x14, 0x00, 0x81, 0x00, 0xfd, 0xdd, 0x00, 0x00, 0x08, 0x00, 0x82, 0x00, 0xc5, 0xdd, 0x00, 0x00, 0x38, 0x00, 0x83, 0x00, 0x45, 0xdc, 0x00, 0x00, 0x10, 0x00, 0x84, 0x00, 0x99, 0xdc, 0x00, 0x00, 0x0c, 0x00, 0x86, 0x00, 0x39, 0xdc, 0x00, 0x00, 0x10, 0x00, 0x88, 0x00, 0x11, 0xde, 0x00, 0x00, 0x3c, 0x00, 0x60, 0x44, 0x01, 0x00, 0x10, 0x00, 0x8a, 0x00, 0x35, 0xdd, 0x00, 0x00, 0x0c, 0x00, 0x8c, 0x00, 0xad, 0xdf, 0x00, 0x00, 0x1c, 0x00, 0x8e, 0x00, 0xc9, 0xde, 0x00, 0x00, 0x38, 0x00, 0x8f, 0x00, 0xed, 0xdc, 0x00, 0x00, 0x38, 0x00, 0x90, 0x00, 0x75, 0xdf, 0x00, 0x00, 0x0c, 0x00, 0x91, 0x00, 0x8d, 0xdc, 0x00, 0x00, 0x0c, 0x00, 0x93, 0x00, 0xb9, 0xdd, 0x00, 0x00, 0x0c, 0x00, 0x94, 0x00, 0x3c, 0x00, 0x9c, 0x44, 0x01, 0x00, 0x00, 0x08, 0x08, 0x08, 0x10, 0x0c, 0x0c, 0x0c, 0x08, 0x0c, 0x08, 0x0c, 0x08, 0x0c, 0x08, 0x08, 0x08, 0x08, 0x14, 0x08, 0x08, 0x14, 0x00, 0x30, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0xad, 0x30, 0x01, 0x00, 0x15, 0x30, 0x01, 0x00, 0x20, 0x30, 0x07, 0x00, 0x30, 0x30, 0x07, 0x00, 0x06, 0x07, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0x44, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc9, 0x02, 0x00, 0x94, 0x3f, 0x03, 0x00, 0xe0, 0x8b, 0x5a, 0x00, 0x05, 0x3a, 0x85, 0x00, 0xc8, 0xf2, 0x06, 0x00, 0xf8, 0x4c, 0x56, 0x00, 0x20, 0xa7, 0x3d, 0x00, 0xb7, 0x4a, 0x00, 0x00, 0xb7, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x14, 0x45, 0x01, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x06, 0x00, 0x00, 0x2d, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xfd, 0x95, 0x00, 0x00, 0x08, 0x00, 0xff, 0x00, 0xed, 0x97, 0x00, 0x00, 0x08, 0x00, 0x82, 0x00, 0xcd, 0x95, 0x00, 0x00, 0x0c, 0x00, 0x83, 0x00, 0x4d, 0x96, 0x00, 0x00, 0x0c, 0x00, 0x85, 0x00, 0x2d, 0x7c, 0x00, 0x00, 0x3c, 0x00, 0x50, 0x45, 0x01, 0x00, 0x00, 0x00, 0xff, 0x00, 0x2d, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x2d, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x3d, 0x96, 0x00, 0x00, 0x0c, 0x00, 0x89, 0x00, 0xd9, 0x97, 0x00, 0x00, 0x08, 0x00, 0x8a, 0x00, 0x91, 0x95, 0x00, 0x00, 0x08, 0x00, 0xff, 0x00, 0x2d, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x2d, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x3c, 0x00, 0x8c, 0x45, 0x01, 0x00, 0xf9, 0x97, 0x00, 0x00, 0x08, 0x00, 0x8d, 0x00, 0x2d, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x2d, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xc9, 0x97, 0x00, 0x00, 0x30, 0x00, 0x90, 0x00, 0x11, 0x95, 0x00, 0x00, 0x18, 0x00, 0x91, 0x00, 0x15, 0x96, 0x00, 0x00, 0x08, 0x00, 0x92, 0x00, 0x59, 0x95, 0x00, 0x00, 0x3c, 0x00, 0x93, 0x00, 0x29, 0x96, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0x45, 0x01, 0x00, 0x08, 0x00, 0x94, 0x00, 0xa1, 0x95, 0x00, 0x00, 0x08, 0x00, 0x95, 0x00, 0x81, 0x97, 0x00, 0x00, 0x0c, 0x00, 0x96, 0x00, 0x6d, 0x97, 0x00, 0x00, 0x10, 0x00, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x08, 0x00, 0x10, 0x3c, 0x00, 0x04, 0x46, 0x01, 0x00, 0x08, 0x0c, 0x0c, 0x0c, 0x0c, 0x1c, 0x0c, 0x0c, 0x08, 0x00, 0x00, 0x00, 0x0d, 0x8b, 0x00, 0x00, 0xf5, 0x8a, 0x00, 0x00, 0xe9, 0x8a, 0x00, 0x00, 0x01, 0x8b, 0x00, 0x00, 0x14, 0x08, 0x0c, 0x0c, 0x10, 0x0c, 0x00, 0x00, 0xb1, 0x98, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x19, 0x99, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x3d, 0x7c, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x40, 0x46, 0x01, 0x00, 0x3d, 0x99, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x09, 0x99, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x3d, 0x7c, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x01, 0x04, 0x04, 0x08, 0x08, 0x81, 0x37, 0x80, 0xf3, 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8, 0x6d, 0xa9, 0x6d, 0xa9, 0x6e, 0xa9, 0x3c, 0x00, 0x7c, 0x46, 0x01, 0x00, 0x6e, 0xa8, 0x6e, 0xa8, 0x6e, 0xa8, 0x6f, 0xa7, 0x6f, 0xa7, 0x6f, 0xa7, 0x6f, 0xa6, 0x6f, 0xa6, 0x70, 0xa6, 0x70, 0xa5, 0x70, 0xa4, 0x00, 0x00, 0xb5, 0x1b, 0x01, 0x00, 0xc9, 0x1b, 0x01, 0x00, 0xe1, 0x1b, 0x01, 0x00, 0xe5, 0x9c, 0x00, 0x00, 0xa5, 0x1b, 0x01, 0x00, 0xe5, 0x9c, 0x00, 0x00, 0x89, 0x1b, 0x01, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0x46, 0x01, 0x00, 0xd1, 0x1a, 0x01, 0x00, 0xe5, 0x1a, 0x01, 0x00, 0x05, 0x1b, 0x01, 0x00, 0x25, 0x1b, 0x01, 0x00, 0xb1, 0x1a, 0x01, 0x00, 0xe5, 0x9c, 0x00, 0x00, 0x9d, 0x1a, 0x01, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0xc1, 0x1a, 0x01, 0x00, 0x89, 0x19, 0x01, 0x00, 0xa9, 0x19, 0x01, 0x00, 0xc9, 0x19, 0x01, 0x00, 0xf1, 0x19, 0x01, 0x00, 0x79, 0x19, 0x01, 0x00, 0xe5, 0x9c, 0x00, 0x00, 0x3c, 0x00, 0xf4, 0x46, 0x01, 0x00, 0x65, 0x19, 0x01, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0x55, 0x1c, 0x01, 0x00, 0x45, 0x1c, 0x01, 0x00, 0x45, 0x1c, 0x01, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0x3c, 0x00, 0x30, 0x47, 0x01, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0x55, 0x19, 0x01, 0x00, 0xe5, 0x9c, 0x00, 0x00, 0x41, 0x19, 0x01, 0x00, 0x31, 0x19, 0x01, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0x02, 0x05, 0x0a, 0x00, 0x00, 0x00, 0x02, 0x04, 0x0a, 0x00, 0x00, 0x00, 0xc5, 0x20, 0x00, 0x00, 0x21, 0x21, 0x00, 0x00, 0x25, 0x21, 0x00, 0x00, 0x39, 0x21, 0x00, 0x00, 0x49, 0x21, 0x00, 0x00, 0x55, 0x21, 0x00, 0x00, 0x3c, 0x00, 0x6c, 0x47, 0x01, 0x00, 0x61, 0x21, 0x00, 0x00, 0xed, 0x21, 0x00, 0x00, 0x0d, 0x22, 0x00, 0x00, 0x21, 0x22, 0x00, 0x00, 0x3d, 0x22, 0x00, 0x00, 0x49, 0x22, 0x00, 0x00, 0xc5, 0x22, 0x00, 0x00, 0xe1, 0x22, 0x00, 0x00, 0xf5, 0x22, 0x00, 0x00, 0xe9, 0x1f, 0x00, 0x00, 0xe9, 0x1f, 0x00, 0x00, 0xe9, 0x1f, 0x00, 0x00, 0xe9, 0x1f, 0x00, 0x00, 0xe9, 0x1f, 0x00, 0x00, 0x11, 0x23, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0x47, 0x01, 0x00, 0x1d, 0x23, 0x00, 0x00, 0x89, 0x23, 0x00, 0x00, 0xa5, 0x23, 0x00, 0x00, 0xb9, 0x23, 0x00, 0x00, 0x11, 0x20, 0x00, 0x00, 0x1d, 0x20, 0x00, 0x00, 0x6d, 0x20, 0x00, 0x00, 0x8d, 0x20, 0x00, 0x00, 0xb9, 0x20, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x03, 0x05, 0x06, 0x06, 0x08, 0x09, 0x08, 0x09, 0x09, 0x09, 0xc4, 0x80, 0xca, 0x80, 0x80, 0x80, 0x80, 0x80, 0xd0, 0x80, 0x3c, 0x00, 0xe4, 0x47, 0x01, 0x00, 0xd6, 0xd9, 0xdc, 0xdf, 0xe2, 0x80, 0x80, 0x80, 0xe5, 0xe8, 0x80, 0x80, 0x80, 0x80, 0xeb, 0xee, 0xf1, 0xf4, 0xf7, 0xfa, 0xfd, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x10, 0x00, 0x11, 0x00, 0x13, 0x00, 0x16, 0x00, 0x18, 0x00, 0x1b, 0x00, 0x3c, 0x00, 0x20, 0x48, 0x01, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x26, 0x00, 0x2b, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3c, 0x00, 0x44, 0x00, 0x4c, 0x00, 0x55, 0x00, 0x5f, 0x00, 0x6b, 0x00, 0x78, 0x00, 0x86, 0x00, 0x97, 0x00, 0xa9, 0x00, 0xbe, 0x00, 0xd5, 0x00, 0xef, 0x00, 0xff, 0x7f, 0x0c, 0x00, 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xf8, 0xff, 0x3c, 0x00, 0x5c, 0x48, 0x01, 0x00, 0xf7, 0xff, 0xf6, 0xff, 0xf5, 0xff, 0xf4, 0xff, 0xf3, 0xff, 0xf2, 0xff, 0xf1, 0xff, 0xf0, 0xff, 0xef, 0xff, 0xee, 0xff, 0xed, 0xff, 0xec, 0xff, 0xeb, 0xff, 0xea, 0xff, 0xe9, 0xff, 0xe8, 0xff, 0xe7, 0xff, 0xe6, 0xff, 0xe5, 0xff, 0xe4, 0xff, 0xe3, 0xff, 0xe2, 0xff, 0xe1, 0xff, 0xe0, 0xff, 0xdf, 0xff, 0xde, 0xff, 0xdd, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0x00, 0x00, 0x3c, 0x00, 0x98, 0x48, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb1, 0x7c, 0x41, 0x00, 0x11, 0x5a, 0x40, 0xe2, 0xb2, 0x7c, 0x41, 0x00, 0x05, 0x5a, 0x40, 0xe2, 0xaf, 0x7c, 0x41, 0x00, 0xf9, 0x59, 0x40, 0xe2, 0xb0, 0x7c, 0x41, 0x00, 0xed, 0x59, 0x40, 0xe2, 0x24, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x5c, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x0a, 0x61, 0x01, 0x00, 0x3c, 0x00, 0xd4, 0x48, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0x0e, 0x61, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0x32, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x6a, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x0b, 0x61, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0x0f, 0x61, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0x40, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x78, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x3c, 0x00, 0x10, 0x49, 0x01, 0x00, 0x0c, 0x61, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0x10, 0x61, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0x4e, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x86, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x0d, 0x61, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0x11, 0x61, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0xc0, 0x48, 0x01, 0x00, 0x04, 0x00, 0x00, 0x0a, 0xe0, 0x48, 0x01, 0x00, 0x3c, 0x00, 0x4c, 0x49, 0x01, 0x00, 0x04, 0x00, 0x00, 0x0a, 0x00, 0x49, 0x01, 0x00, 0x04, 0x00, 0x00, 0x0a, 0x20, 0x49, 0x01, 0x00, 0x04, 0x00, 0x00, 0x0a, 0x18, 0x67, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x28, 0x75, 0x01, 0x01, 0x7d, 0xa9, 0x40, 0xe2, 0x2c, 0x75, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x20, 0x75, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x44, 0x75, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x3c, 0x00, 0x88, 0x49, 0x01, 0x00, 0xf0, 0x59, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x75, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xb8, 0x7c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x8d, 0xa9, 0x00, 0x00, 0x01, 0x00, 0x00, 0xda, 0x1d, 0x75, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe2, 0xc4, 0x67, 0x01, 0x00, 0x3c, 0x00, 0xc4, 0x49, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x59, 0x00, 0x00, 0x0e, 0x00, 0x00, 0xd9, 0xc8, 0x67, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xcc, 0x67, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xd0, 0x67, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x65, 0xd9, 0x00, 0x00, 0x04, 0x00, 0x00, 0xda, 0xa5, 0xd9, 0x00, 0x00, 0x04, 0x00, 0x00, 0xda, 0x3c, 0x00, 0x00, 0x4a, 0x01, 0x00, 0x01, 0x59, 0x00, 0x00, 0x01, 0x00, 0x00, 0xda, 0x32, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x6a, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x11, 0x59, 0x00, 0x00, 0x01, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x48, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0xa0, 0x48, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x40, 0x49, 0x01, 0x00, 0x3c, 0x00, 0x3c, 0x4a, 0x01, 0x00, 0x05, 0x00, 0x00, 0x0a, 0x68, 0x49, 0x01, 0x00, 0x09, 0x00, 0x00, 0x0a, 0x6c, 0x57, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x38, 0x61, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x6e, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xb0, 0x6e, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x70, 0x57, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x3c, 0x00, 0x78, 0x4a, 0x01, 0x00, 0xe8, 0x59, 0x01, 0x00, 0x08, 0x00, 0x00, 0xe3, 0xdc, 0x58, 0x01, 0x14, 0x4d, 0xfd, 0x40, 0xe3, 0x2c, 0x59, 0x01, 0x14, 0x39, 0xfd, 0x40, 0xe3, 0xc0, 0x58, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x73, 0x41, 0x00, 0x3d, 0x2e, 0x44, 0xe2, 0x7c, 0x59, 0x01, 0x14, 0x3c, 0x00, 0xb4, 0x4a, 0x01, 0x00, 0x9d, 0x2f, 0x44, 0xe3, 0x5c, 0x57, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe2, 0x79, 0x2e, 0x04, 0x00, 0x01, 0x00, 0x00, 0xdb, 0xa0, 0x58, 0x01, 0x00, 0x02, 0x00, 0x00, 0xe3, 0xa2, 0x58, 0x01, 0x00, 0x02, 0x00, 0x00, 0xe3, 0xa0, 0x57, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0xd1, 0x88, 0x01, 0x00, 0x01, 0x00, 0x00, 0xda, 0x1d, 0x89, 0x01, 0x00, 0x04, 0x00, 0x00, 0xda, 0x3c, 0x00, 0xf0, 0x4a, 0x01, 0x00, 0x95, 0x88, 0x01, 0x00, 0x04, 0x00, 0x00, 0xdb, 0x31, 0x2f, 0x04, 0x00, 0x0e, 0x00, 0x00, 0xd9, 0xc5, 0x2e, 0x04, 0x00, 0x0e, 0x00, 0x00, 0xd9, 0x68, 0x6c, 0x01, 0x01, 0x15, 0xd5, 0x40, 0xe2, 0xc0, 0x57, 0x01, 0x00, 0x08, 0x00, 0x00, 0xe3, 0xc8, 0x57, 0x01, 0x00, 0x34, 0x00, 0x00, 0xe3, 0x9c, 0x6c, 0x01, 0x00, 0x08, 0x00, 0x00, 0xe3, 0xb0, 0x58, 0x01, 0x03, 0x3c, 0x00, 0x2c, 0x4b, 0x01, 0x00, 0xe9, 0xd4, 0x40, 0xe2, 0xbc, 0x58, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x9d, 0xa3, 0x00, 0x00, 0x60, 0x00, 0x00, 0xd9, 0x70, 0x79, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x78, 0x79, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x7c, 0x5a, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x5d, 0x1c, 0x00, 0x00, 0x11, 0x00, 0x00, 0xd9, 0x24, 0x6e, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x3c, 0x00, 0x68, 0x4b, 0x01, 0x00, 0x18, 0x58, 0x01, 0x05, 0xd5, 0xd5, 0x40, 0xe3, 0xfc, 0x57, 0x01, 0x00, 0x14, 0x00, 0x00, 0xe3, 0x04, 0x8e, 0x01, 0x03, 0xe5, 0xd5, 0x40, 0xe3, 0x00, 0x5b, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x18, 0x5b, 0x01, 0x00, 0x40, 0x00, 0x00, 0xe2, 0xd4, 0x67, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x8d, 0x37, 0x00, 0x00, 0x04, 0x00, 0x00, 0xdb, 0xbd, 0x36, 0x00, 0x00, 0x3c, 0x00, 0xa4, 0x4b, 0x01, 0x00, 0x04, 0x00, 0x00, 0xdb, 0xfc, 0x60, 0x01, 0x00, 0x02, 0x00, 0x00, 0xe2, 0x90, 0x7d, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x70, 0x69, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x49, 0x01, 0x00, 0x1a, 0x00, 0x00, 0x0a, 0x90, 0x4b, 0x01, 0x00, 0x06, 0x00, 0x00, 0x0a, 0xa4, 0x58, 0x81, 0x00, 0x05, 0xfd, 0x40, 0xe3, 0x3c, 0x00, 0xe0, 0x4b, 0x01, 0x00, 0x80, 0x4a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x0a, 0x0c, 0x5a, 0x81, 0x01, 0x25, 0x2d, 0x44, 0xe3, 0xe0, 0x4a, 0x01, 0x00, 0x03, 0x00, 0x00, 0x0a, 0x18, 0x63, 0x41, 0x00, 0xfd, 0xbb, 0x40, 0xe2, 0x08, 0x57, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe2, 0x9c, 0x48, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x4a, 0x01, 0x00, 0x3c, 0x00, 0x1c, 0x4c, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0xcc, 0x74, 0x01, 0x00, 0x03, 0x00, 0x00, 0xe3, 0x65, 0x73, 0x41, 0x00, 0xa9, 0x2e, 0x44, 0xe2, 0xf6, 0x59, 0x01, 0x01, 0xd1, 0x2c, 0x44, 0xe3, 0x08, 0x4b, 0x01, 0x00, 0x04, 0x00, 0x00, 0x0a, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x6a, 0x28, 0x4b, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x88, 0x7d, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x3c, 0x00, 0x58, 0x4c, 0x01, 0x00, 0x00, 0x75, 0x01, 0x04, 0x65, 0x6f, 0x40, 0xe3, 0xbc, 0x78, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x38, 0x4b, 0x01, 0x00, 0x04, 0x00, 0x00, 0x0a, 0x04, 0x57, 0x01, 0x00, 0x04, 0x00, 0x00, 0x62, 0x58, 0x4b, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x80, 0x4b, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x68, 0x4b, 0x01, 0x00, 0x03, 0x00, 0x00, 0x0a, 0x8c, 0x7d, 0x01, 0x00, 0x3c, 0x00, 0x94, 0x4c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x39, 0x2d, 0x04, 0x00, 0x04, 0x00, 0x00, 0xdb, 0x94, 0x7d, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x64, 0xa8, 0x4c, 0x01, 0x00, 0x04, 0x00, 0x00, 0x0a, 0x3c, 0x00, 0xd0, 0x4c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x4c, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0a, 0xd0, 0x4c, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x7a, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe2, 0xe8, 0x7a, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x7a, 0x01, 0x00, 0x3c, 0x00, 0x0c, 0x4d, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe2, 0xee, 0x7a, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf3, 0x7a, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe2, 0xf4, 0x7a, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x7a, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe2, 0xfa, 0x7a, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe2, 0x3c, 0x00, 0x48, 0x4d, 0x01, 0x00, 0xe8, 0x4c, 0x01, 0x00, 0x03, 0x00, 0x00, 0x0a, 0x00, 0x4d, 0x01, 0x00, 0x03, 0x00, 0x00, 0x0a, 0x18, 0x4d, 0x01, 0x00, 0x03, 0x00, 0x00, 0x0a, 0x30, 0x4d, 0x01, 0x00, 0x03, 0x00, 0x00, 0x0a, 0x90, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x94, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x98, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x9c, 0x5c, 0x01, 0x00, 0x3c, 0x00, 0x84, 0x4d, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xa0, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xa4, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xa8, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xac, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xb0, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xb4, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xb8, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x3c, 0x00, 0xc0, 0x4d, 0x01, 0x00, 0xbc, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xc0, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xc4, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x90, 0x5c, 0x01, 0x00, 0x38, 0x00, 0x00, 0xe3, 0x68, 0x4d, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x0a, 0xd8, 0x4d, 0x01, 0x00, 0x02, 0x00, 0x00, 0xfa, 0x12, 0x61, 0x81, 0x01, 0x31, 0xd5, 0x40, 0xe3, 0x06, 0x61, 0x01, 0x00, 0x3c, 0x00, 0xfc, 0x4d, 0x01, 0x00, 0x02, 0x00, 0x00, 0xe2, 0x0b, 0x61, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0x0f, 0x61, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0x08, 0x61, 0x01, 0x00, 0x02, 0x00, 0x00, 0xe2, 0x50, 0x7b, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x4e, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x64, 0x9c, 0x57, 0x01, 0x01, 0x91, 0x88, 0x41, 0xe3, 0x3c, 0x00, 0x38, 0x4e, 0x01, 0x00, 0x6e, 0x41, 0x67, 0x6f, 0xe2, 0x65, 0x60, 0x69, 0x6f, 0x20, 0x41, 0x42, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x4d, 0x01, 0x00, 0x09, 0x00, 0x00, 0x0a, 0x48, 0x4e, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0a, 0xe8, 0x4d, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x4d, 0x01, 0x00, 0x04, 0x00, 0x00, 0x0a, 0x28, 0x61, 0x01, 0x01, 0x3c, 0x00, 0x74, 0x4e, 0x01, 0x00, 0xbd, 0xd5, 0x40, 0xe2, 0x69, 0x61, 0x41, 0x00, 0x85, 0xd5, 0x40, 0xe2, 0x30, 0x61, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x34, 0x61, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x3c, 0x61, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x34, 0x61, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x44, 0x61, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x3c, 0x00, 0xb0, 0x4e, 0x01, 0x00, 0x70, 0x4e, 0x01, 0x00, 0x08, 0x00, 0x00, 0x0a, 0x18, 0x61, 0x01, 0x00, 0x02, 0x00, 0x00, 0xe2, 0x1c, 0x61, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x20, 0x61, 0x01, 0x00, 0x02, 0x00, 0x00, 0xe2, 0x24, 0x61, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xb8, 0x4e, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0xc8, 0x4e, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0xd8, 0x4e, 0x01, 0x00, 0x3c, 0x00, 0xec, 0x4e, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x96, 0x48, 0x01, 0x00, 0x06, 0x00, 0x00, 0xe3, 0xe0, 0x62, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x9b, 0x7d, 0x01, 0x00, 0x01, 0x00, 0x00, 0x62, 0x9c, 0x7d, 0x01, 0x00, 0x02, 0x00, 0x00, 0x62, 0x60, 0x7c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x3c, 0x00, 0x28, 0x4f, 0x01, 0x00, 0x2d, 0x63, 0x01, 0x00, 0x01, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xd5, 0x00, 0x00, 0x0e, 0x00, 0x00, 0xd9, 0xf4, 0x67, 0x01, 0x00, 0x02, 0x00, 0x00, 0x62, 0x46, 0x7d, 0x01, 0x00, 0x01, 0x00, 0x00, 0x62, 0x9c, 0x7c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x98, 0x7c, 0x01, 0x00, 0x3c, 0x00, 0x64, 0x4f, 0x01, 0x00, 0x02, 0x00, 0x00, 0x62, 0xa0, 0x7c, 0x01, 0x00, 0x06, 0x00, 0x00, 0x62, 0x58, 0x7c, 0x01, 0x00, 0x02, 0x00, 0x00, 0x62, 0x64, 0x7c, 0x01, 0x00, 0x06, 0x00, 0x00, 0x62, 0x5a, 0x7c, 0x01, 0x00, 0x02, 0x00, 0x00, 0x62, 0x6a, 0x7c, 0x01, 0x00, 0x06, 0x00, 0x00, 0x62, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0xe4, 0x62, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x3c, 0x00, 0xa0, 0x4f, 0x01, 0x00, 0xe8, 0x62, 0x01, 0x00, 0x03, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xdc, 0x4f, 0x01, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x3c, 0x00, 0x18, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0xf0, 0x4e, 0x01, 0x00, 0x2a, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x3c, 0x00, 0x54, 0x50, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x3c, 0x00, 0x90, 0x50, 0x01, 0x00, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x07, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x09, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xcc, 0x50, 0x01, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x0a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x0b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x3c, 0x00, 0x08, 0x51, 0x01, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x0e, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x48, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x58, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x68, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x78, 0x50, 0x01, 0x00, 0x3c, 0x00, 0x44, 0x51, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x88, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x98, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0xa8, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0xb8, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0xc8, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0xd8, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0xe8, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x3c, 0x00, 0x80, 0x51, 0x01, 0x00, 0xf8, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x08, 0x51, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x18, 0x51, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x40, 0x50, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0a, 0xe8, 0x4e, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x4e, 0x01, 0x00, 0x3c, 0x00, 0xbc, 0x51, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x51, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x51, 0x01, 0x00, 0x98, 0x51, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x0a, 0x50, 0x4e, 0x01, 0x00, 0x04, 0x00, 0x00, 0x0a, 0xe0, 0x4c, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x4b, 0x01, 0x00, 0x1d, 0x00, 0x00, 0x0a, 0xf8, 0x51, 0x01, 0x00, 0x05, 0x00, 0x00, 0x0a, 0x24, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x80, 0x07, 0x00, 0x3c, 0x00, 0x34, 0x52, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x2a, 0x80, 0x07, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x24, 0x80, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1d, 0x80, 0x07, 0x00, 0x20, 0x00, 0x00, 0x00, 0x2a, 0x80, 0x07, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x24, 0x80, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1d, 0x80, 0x07, 0x00, 0x20, 0x00, 0x00, 0x00, 0x2a, 0x80, 0x07, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x70, 0x52, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x01, 0x63, 0x00, 0x00, 0xa1, 0x63, 0x00, 0x00, 0xc5, 0x63, 0x00, 0x00, 0xb1, 0x62, 0x00, 0x00, 0xc5, 0x63, 0x00, 0x00, 0x21, 0x63, 0x00, 0x00, 0x4d, 0x63, 0x00, 0x00, 0x3c, 0x00, 0xac, 0x52, 0x01, 0x00, 0xa1, 0x63, 0x00, 0x00, 0x01, 0x63, 0x00, 0x00, 0xa1, 0x63, 0x00, 0x00, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x03, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0a, 0x0c, 0x0d, 0x0e, 0x0f, 0x0f, 0x10, 0x11, 0x00, 0x00, 0x00, 0xa5, 0xc6, 0x84, 0xf8, 0x99, 0xee, 0x8d, 0xf6, 0x0d, 0xff, 0xbd, 0xd6, 0xb1, 0xde, 0x54, 0x91, 0x3c, 0x00, 0xe8, 0x52, 0x01, 0x00, 0x50, 0x60, 0x03, 0x02, 0xa9, 0xce, 0x7d, 0x56, 0x19, 0xe7, 0x62, 0xb5, 0xe6, 0x4d, 0x9a, 0xec, 0x45, 0x8f, 0x9d, 0x1f, 0x40, 0x89, 0x87, 0xfa, 0x15, 0xef, 0xeb, 0xb2, 0xc9, 0x8e, 0x0b, 0xfb, 0xec, 0x41, 0x67, 0xb3, 0xfd, 0x5f, 0xea, 0x45, 0xbf, 0x23, 0xf7, 0x53, 0x96, 0xe4, 0x5b, 0x9b, 0xc2, 0x75, 0x1c, 0xe1, 0xae, 0x3d, 0x6a, 0x4c, 0x5a, 0x6c, 0x41, 0x7e, 0x3c, 0x00, 0x24, 0x53, 0x01, 0x00, 0x02, 0xf5, 0x4f, 0x83, 0x5c, 0x68, 0xf4, 0x51, 0x34, 0xd1, 0x08, 0xf9, 0x93, 0xe2, 0x73, 0xab, 0x53, 0x62, 0x3f, 0x2a, 0x0c, 0x08, 0x52, 0x95, 0x65, 0x46, 0x5e, 0x9d, 0x28, 0x30, 0xa1, 0x37, 0x0f, 0x0a, 0xb5, 0x2f, 0x09, 0x0e, 0x36, 0x24, 0x9b, 0x1b, 0x3d, 0xdf, 0x26, 0xcd, 0x69, 0x4e, 0xcd, 0x7f, 0x9f, 0xea, 0x1b, 0x12, 0x9e, 0x1d, 0x74, 0x58, 0x2e, 0x34, 0x3c, 0x00, 0x60, 0x53, 0x01, 0x00, 0x2d, 0x36, 0xb2, 0xdc, 0xee, 0xb4, 0xfb, 0x5b, 0xf6, 0xa4, 0x4d, 0x76, 0x61, 0xb7, 0xce, 0x7d, 0x7b, 0x52, 0x3e, 0xdd, 0x71, 0x5e, 0x97, 0x13, 0xf5, 0xa6, 0x68, 0xb9, 0x00, 0x00, 0x2c, 0xc1, 0x60, 0x40, 0x1f, 0xe3, 0xc8, 0x79, 0xed, 0xb6, 0xbe, 0xd4, 0x46, 0x8d, 0xd9, 0x67, 0x4b, 0x72, 0xde, 0x94, 0xd4, 0x98, 0xe8, 0xb0, 0x4a, 0x85, 0x6b, 0xbb, 0x2a, 0xc5, 0x3c, 0x00, 0x9c, 0x53, 0x01, 0x00, 0xe5, 0x4f, 0x16, 0xed, 0xc5, 0x86, 0xd7, 0x9a, 0x55, 0x66, 0x94, 0x11, 0xcf, 0x8a, 0x10, 0xe9, 0x06, 0x04, 0x81, 0xfe, 0xf0, 0xa0, 0x44, 0x78, 0xba, 0x25, 0xe3, 0x4b, 0xf3, 0xa2, 0xfe, 0x5d, 0xc0, 0x80, 0x8a, 0x05, 0xad, 0x3f, 0xbc, 0x21, 0x48, 0x70, 0x04, 0xf1, 0xdf, 0x63, 0xc1, 0x77, 0x75, 0xaf, 0x63, 0x42, 0x30, 0x20, 0x1a, 0xe5, 0x0e, 0xfd, 0x6d, 0xbf, 0x3c, 0x00, 0xd8, 0x53, 0x01, 0x00, 0x4c, 0x81, 0x14, 0x18, 0x35, 0x26, 0x2f, 0xc3, 0xe1, 0xbe, 0xa2, 0x35, 0xcc, 0x88, 0x39, 0x2e, 0x57, 0x93, 0xf2, 0x55, 0x82, 0xfc, 0x47, 0x7a, 0xac, 0xc8, 0xe7, 0xba, 0x2b, 0x32, 0x95, 0xe6, 0xa0, 0xc0, 0x98, 0x19, 0xd1, 0x9e, 0x7f, 0xa3, 0x66, 0x44, 0x7e, 0x54, 0xab, 0x3b, 0x83, 0x0b, 0xca, 0x8c, 0x29, 0xc7, 0xd3, 0x6b, 0x3c, 0x28, 0x79, 0xa7, 0xe2, 0xbc, 0x3c, 0x00, 0x14, 0x54, 0x01, 0x00, 0x1d, 0x16, 0x76, 0xad, 0x3b, 0xdb, 0x56, 0x64, 0x4e, 0x74, 0x1e, 0x14, 0xdb, 0x92, 0x0a, 0x0c, 0x6c, 0x48, 0xe4, 0xb8, 0x5d, 0x9f, 0x6e, 0xbd, 0xef, 0x43, 0xa6, 0xc4, 0xa8, 0x39, 0xa4, 0x31, 0x37, 0xd3, 0x8b, 0xf2, 0x32, 0xd5, 0x43, 0x8b, 0x59, 0x6e, 0xb7, 0xda, 0x8c, 0x01, 0x64, 0xb1, 0xd2, 0x9c, 0xe0, 0x49, 0xb4, 0xd8, 0xfa, 0xac, 0x07, 0xf3, 0x25, 0xcf, 0x3c, 0x00, 0x50, 0x54, 0x01, 0x00, 0xaf, 0xca, 0x8e, 0xf4, 0xe9, 0x47, 0x18, 0x10, 0xd5, 0x6f, 0x88, 0xf0, 0x6f, 0x4a, 0x72, 0x5c, 0x24, 0x38, 0xf1, 0x57, 0xc7, 0x73, 0x51, 0x97, 0x23, 0xcb, 0x7c, 0xa1, 0x9c, 0xe8, 0x21, 0x3e, 0xdd, 0x96, 0xdc, 0x61, 0x86, 0x0d, 0x85, 0x0f, 0x90, 0xe0, 0x42, 0x7c, 0xc4, 0x71, 0xaa, 0xcc, 0xd8, 0x90, 0x05, 0x06, 0x01, 0xf7, 0x12, 0x1c, 0xa3, 0xc2, 0x5f, 0x6a, 0x3c, 0x00, 0x8c, 0x54, 0x01, 0x00, 0xf9, 0xae, 0xd0, 0x69, 0x91, 0x17, 0x58, 0x99, 0x27, 0x3a, 0xb9, 0x27, 0x38, 0xd9, 0x13, 0xeb, 0xb3, 0x2b, 0x33, 0x22, 0xbb, 0xd2, 0x70, 0xa9, 0x89, 0x07, 0xa7, 0x33, 0xb6, 0x2d, 0x22, 0x3c, 0x92, 0x15, 0x20, 0xc9, 0x49, 0x87, 0xff, 0xaa, 0x78, 0x50, 0x7a, 0xa5, 0x8f, 0x03, 0xf8, 0x59, 0x80, 0x09, 0x17, 0x1a, 0xda, 0x65, 0x31, 0xd7, 0xc6, 0x84, 0xb8, 0xd0, 0x3c, 0x00, 0xc8, 0x54, 0x01, 0x00, 0xc3, 0x82, 0xb0, 0x29, 0x77, 0x5a, 0x11, 0x1e, 0xcb, 0x7b, 0xfc, 0xa8, 0xd6, 0x6d, 0x3a, 0x2c, 0xc6, 0xa5, 0xf8, 0x84, 0xee, 0x99, 0xf6, 0x8d, 0xff, 0x0d, 0xd6, 0xbd, 0xde, 0xb1, 0x91, 0x54, 0x60, 0x50, 0x02, 0x03, 0xce, 0xa9, 0x56, 0x7d, 0xe7, 0x19, 0xb5, 0x62, 0x4d, 0xe6, 0xec, 0x9a, 0x8f, 0x45, 0x1f, 0x9d, 0x89, 0x40, 0xfa, 0x87, 0xef, 0x15, 0xb2, 0xeb, 0x3c, 0x00, 0x04, 0x55, 0x01, 0x00, 0x8e, 0xc9, 0xfb, 0x0b, 0x41, 0xec, 0xb3, 0x67, 0x5f, 0xfd, 0x45, 0xea, 0x23, 0xbf, 0x53, 0xf7, 0xe4, 0x96, 0x9b, 0x5b, 0x75, 0xc2, 0xe1, 0x1c, 0x3d, 0xae, 0x4c, 0x6a, 0x6c, 0x5a, 0x7e, 0x41, 0xf5, 0x02, 0x83, 0x4f, 0x68, 0x5c, 0x51, 0xf4, 0xd1, 0x34, 0xf9, 0x08, 0xe2, 0x93, 0xab, 0x73, 0x62, 0x53, 0x2a, 0x3f, 0x08, 0x0c, 0x95, 0x52, 0x46, 0x65, 0x9d, 0x5e, 0x3c, 0x00, 0x40, 0x55, 0x01, 0x00, 0x30, 0x28, 0x37, 0xa1, 0x0a, 0x0f, 0x2f, 0xb5, 0x0e, 0x09, 0x24, 0x36, 0x1b, 0x9b, 0xdf, 0x3d, 0xcd, 0x26, 0x4e, 0x69, 0x7f, 0xcd, 0xea, 0x9f, 0x12, 0x1b, 0x1d, 0x9e, 0x58, 0x74, 0x34, 0x2e, 0x36, 0x2d, 0xdc, 0xb2, 0xb4, 0xee, 0x5b, 0xfb, 0xa4, 0xf6, 0x76, 0x4d, 0xb7, 0x61, 0x7d, 0xce, 0x52, 0x7b, 0xdd, 0x3e, 0x5e, 0x71, 0x13, 0x97, 0xa6, 0xf5, 0xb9, 0x68, 0x3c, 0x00, 0x7c, 0x55, 0x01, 0x00, 0x00, 0x00, 0xc1, 0x2c, 0x40, 0x60, 0xe3, 0x1f, 0x79, 0xc8, 0xb6, 0xed, 0xd4, 0xbe, 0x8d, 0x46, 0x67, 0xd9, 0x72, 0x4b, 0x94, 0xde, 0x98, 0xd4, 0xb0, 0xe8, 0x85, 0x4a, 0xbb, 0x6b, 0xc5, 0x2a, 0x4f, 0xe5, 0xed, 0x16, 0x86, 0xc5, 0x9a, 0xd7, 0x66, 0x55, 0x11, 0x94, 0x8a, 0xcf, 0xe9, 0x10, 0x04, 0x06, 0xfe, 0x81, 0xa0, 0xf0, 0x78, 0x44, 0x25, 0xba, 0x4b, 0xe3, 0x3c, 0x00, 0xb8, 0x55, 0x01, 0x00, 0xa2, 0xf3, 0x5d, 0xfe, 0x80, 0xc0, 0x05, 0x8a, 0x3f, 0xad, 0x21, 0xbc, 0x70, 0x48, 0xf1, 0x04, 0x63, 0xdf, 0x77, 0xc1, 0xaf, 0x75, 0x42, 0x63, 0x20, 0x30, 0xe5, 0x1a, 0xfd, 0x0e, 0xbf, 0x6d, 0x81, 0x4c, 0x18, 0x14, 0x26, 0x35, 0xc3, 0x2f, 0xbe, 0xe1, 0x35, 0xa2, 0x88, 0xcc, 0x2e, 0x39, 0x93, 0x57, 0x55, 0xf2, 0xfc, 0x82, 0x7a, 0x47, 0xc8, 0xac, 0xba, 0xe7, 0x3c, 0x00, 0xf4, 0x55, 0x01, 0x00, 0x32, 0x2b, 0xe6, 0x95, 0xc0, 0xa0, 0x19, 0x98, 0x9e, 0xd1, 0xa3, 0x7f, 0x44, 0x66, 0x54, 0x7e, 0x3b, 0xab, 0x0b, 0x83, 0x8c, 0xca, 0xc7, 0x29, 0x6b, 0xd3, 0x28, 0x3c, 0xa7, 0x79, 0xbc, 0xe2, 0x16, 0x1d, 0xad, 0x76, 0xdb, 0x3b, 0x64, 0x56, 0x74, 0x4e, 0x14, 0x1e, 0x92, 0xdb, 0x0c, 0x0a, 0x48, 0x6c, 0xb8, 0xe4, 0x9f, 0x5d, 0xbd, 0x6e, 0x43, 0xef, 0xc4, 0xa6, 0x3c, 0x00, 0x30, 0x56, 0x01, 0x00, 0x39, 0xa8, 0x31, 0xa4, 0xd3, 0x37, 0xf2, 0x8b, 0xd5, 0x32, 0x8b, 0x43, 0x6e, 0x59, 0xda, 0xb7, 0x01, 0x8c, 0xb1, 0x64, 0x9c, 0xd2, 0x49, 0xe0, 0xd8, 0xb4, 0xac, 0xfa, 0xf3, 0x07, 0xcf, 0x25, 0xca, 0xaf, 0xf4, 0x8e, 0x47, 0xe9, 0x10, 0x18, 0x6f, 0xd5, 0xf0, 0x88, 0x4a, 0x6f, 0x5c, 0x72, 0x38, 0x24, 0x57, 0xf1, 0x73, 0xc7, 0x97, 0x51, 0xcb, 0x23, 0xa1, 0x7c, 0x3c, 0x00, 0x6c, 0x56, 0x01, 0x00, 0xe8, 0x9c, 0x3e, 0x21, 0x96, 0xdd, 0x61, 0xdc, 0x0d, 0x86, 0x0f, 0x85, 0xe0, 0x90, 0x7c, 0x42, 0x71, 0xc4, 0xcc, 0xaa, 0x90, 0xd8, 0x06, 0x05, 0xf7, 0x01, 0x1c, 0x12, 0xc2, 0xa3, 0x6a, 0x5f, 0xae, 0xf9, 0x69, 0xd0, 0x17, 0x91, 0x99, 0x58, 0x3a, 0x27, 0x27, 0xb9, 0xd9, 0x38, 0xeb, 0x13, 0x2b, 0xb3, 0x22, 0x33, 0xd2, 0xbb, 0xa9, 0x70, 0x07, 0x89, 0x33, 0xa7, 0x3c, 0x00, 0xa8, 0x56, 0x01, 0x00, 0x2d, 0xb6, 0x3c, 0x22, 0x15, 0x92, 0xc9, 0x20, 0x87, 0x49, 0xaa, 0xff, 0x50, 0x78, 0xa5, 0x7a, 0x03, 0x8f, 0x59, 0xf8, 0x09, 0x80, 0x1a, 0x17, 0x65, 0xda, 0xd7, 0x31, 0x84, 0xc6, 0xd0, 0xb8, 0x82, 0xc3, 0x29, 0xb0, 0x5a, 0x77, 0x1e, 0x11, 0x7b, 0xcb, 0xa8, 0xfc, 0x6d, 0xd6, 0x2c, 0x3a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0x56, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x72, 0x65, 0x71, 0x45, 0x72, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x20, 0x57, 0x01, 0x00, 0xc4, 0x8e, 0x01, 0x00, 0x24, 0x9a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x24, 0x9a, 0x01, 0x00, 0xa4, 0xb2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0xa4, 0xb2, 0x01, 0x00, 0x14, 0xc8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0xbb, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x5c, 0x57, 0x01, 0x00, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, 0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2b, 0x2c, 0x01, 0x00, 0x70, 0x17, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0d, 0x25, 0x00, 0x00, 0x41, 0x3f, 0x01, 0x00, 0x65, 0x29, 0x01, 0x00, 0x0d, 0x25, 0x00, 0x00, 0xf5, 0x5e, 0x00, 0x00, 0x41, 0x3f, 0x01, 0x00, 0x41, 0x3f, 0x01, 0x00, 0x02, 0x04, 0x0b, 0x0c, 0x12, 0x16, 0x18, 0x24, 0x3c, 0x00, 0x98, 0x57, 0x01, 0x00, 0x30, 0x48, 0x60, 0x6c, 0x01, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x12, 0x11, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd4, 0x57, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x93, 0x04, 0x00, 0x40, 0x42, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xdf, 0x40, 0xcf, 0xfd, 0x00, 0x40, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x3c, 0x00, 0x10, 0x58, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x80, 0x81, 0x00, 0x00, 0x80, 0x00, 0xbf, 0xff, 0x7f, 0x7e, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x78, 0x6f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x6f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x6f, 0x01, 0x00, 0x3c, 0x00, 0x4c, 0x58, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x71, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x71, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x90, 0x71, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x3c, 0x00, 0x88, 0x58, 0x01, 0x00, 0xa8, 0x71, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x0a, 0x01, 0x06, 0x0b, 0x02, 0x07, 0x0c, 0x03, 0x08, 0x0d, 0x04, 0x09, 0x00, 0x00, 0x03, 0x03, 0x01, 0x01, 0x00, 0x04, 0x00, 0x04, 0x04, 0x06, 0x16, 0x1e, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0xc4, 0x58, 0x01, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x61, 0x8b, 0x4a, 0x00, 0x61, 0x8f, 0x4a, 0x00, 0x61, 0x8b, 0x4a, 0x00, 0x05, 0xe3, 0xc0, 0x00, 0x05, 0xcb, 0xc0, 0x00, 0x05, 0xbb, 0xc0, 0x00, 0x85, 0xba, 0xc0, 0x00, 0x85, 0xa2, 0xc0, 0x00, 0x85, 0x92, 0xc0, 0x00, 0x85, 0x8a, 0xc0, 0x00, 0x85, 0x7a, 0xc0, 0x00, 0x45, 0x89, 0xc0, 0x00, 0x3c, 0x00, 0x00, 0x59, 0x01, 0x00, 0x45, 0x71, 0xc0, 0x00, 0x45, 0x69, 0xc0, 0x00, 0x45, 0x61, 0xc0, 0x00, 0x45, 0x59, 0xc0, 0x00, 0x45, 0x51, 0xc0, 0x00, 0x45, 0x49, 0xc0, 0x00, 0x45, 0x41, 0xc0, 0x00, 0x45, 0x39, 0xc0, 0x00, 0x45, 0x31, 0xc0, 0x00, 0x45, 0x29, 0xc0, 0x00, 0x45, 0x21, 0xc0, 0x00, 0x60, 0x2d, 0x06, 0x00, 0x60, 0x2d, 0x06, 0x00, 0x60, 0x2d, 0x06, 0x00, 0x60, 0x2d, 0x06, 0x00, 0x3c, 0x00, 0x3c, 0x59, 0x01, 0x00, 0x60, 0x2d, 0x06, 0x00, 0x60, 0x28, 0x06, 0x00, 0x50, 0x26, 0x06, 0x00, 0x50, 0x21, 0x06, 0x00, 0x50, 0x1f, 0x06, 0x00, 0x50, 0x1c, 0x06, 0x00, 0x50, 0x1a, 0x06, 0x00, 0x50, 0x18, 0x06, 0x00, 0x50, 0x16, 0x06, 0x00, 0x50, 0x14, 0x06, 0x00, 0x50, 0x12, 0x06, 0x00, 0x50, 0x10, 0x06, 0x00, 0x50, 0x0e, 0x06, 0x00, 0x50, 0x0c, 0x06, 0x00, 0x50, 0x0a, 0x06, 0x00, 0x3c, 0x00, 0x78, 0x59, 0x01, 0x00, 0x2b, 0x0b, 0x06, 0x00, 0x1d, 0x75, 0xc0, 0x00, 0x1d, 0x75, 0xc0, 0x00, 0x1d, 0x75, 0xc0, 0x00, 0x1d, 0x75, 0xc0, 0x00, 0x1d, 0x75, 0xc0, 0x00, 0x1d, 0x75, 0xc0, 0x00, 0x1d, 0x6d, 0xc0, 0x00, 0xdd, 0x5b, 0xc0, 0x00, 0xdd, 0x4b, 0xc0, 0x00, 0xdd, 0x43, 0xc0, 0x00, 0xdd, 0x3b, 0xc0, 0x00, 0xdd, 0x33, 0xc0, 0x00, 0xdd, 0x2b, 0xc0, 0x00, 0xdd, 0x23, 0xc0, 0x00, 0x3c, 0x00, 0xb4, 0x59, 0x01, 0x00, 0xdd, 0x1b, 0xc0, 0x00, 0xdd, 0x13, 0xc0, 0x00, 0xdd, 0x13, 0xc0, 0x00, 0xdd, 0x13, 0xc0, 0x00, 0xdd, 0x13, 0xc0, 0x00, 0xdd, 0x13, 0xc0, 0x00, 0x05, 0x05, 0x05, 0x04, 0x04, 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x05, 0x05, 0x05, 0x04, 0x04, 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x13, 0x00, 0x00, 0x3c, 0x00, 0xf0, 0x59, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x80, 0x00, 0x5b, 0x00, 0x40, 0x02, 0xe0, 0xfd, 0xf2, 0x00, 0xb8, 0xfc, 0xa4, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x03, 0x0b, 0x9f, 0x5f, 0x07, 0x01, 0x2a, 0x04, 0x21, 0x04, 0x17, 0x04, 0x0e, 0x04, 0x04, 0x04, 0xfb, 0x03, 0xf1, 0x03, 0xe8, 0x03, 0xc9, 0x03, 0xaa, 0x03, 0x8a, 0x03, 0x6b, 0x03, 0x4c, 0x03, 0x3c, 0x00, 0x2c, 0x5a, 0x01, 0x00, 0x2d, 0x03, 0x0e, 0x03, 0xee, 0x02, 0xec, 0x02, 0x01, 0x03, 0x16, 0x03, 0x2b, 0x03, 0x40, 0x03, 0x55, 0x03, 0x6a, 0x03, 0x7f, 0x03, 0x94, 0x03, 0xa9, 0x03, 0xbe, 0x03, 0xd3, 0x03, 0xe8, 0x03, 0xbe, 0x03, 0x94, 0x03, 0x6a, 0x03, 0x00, 0x02, 0x04, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x03, 0x3c, 0x00, 0x68, 0x5a, 0x01, 0x00, 0x05, 0x08, 0x0b, 0x0e, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa4, 0x5a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe0, 0x5a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0x5b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0x5b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x94, 0x5b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd0, 0x5b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x5c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0x5c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x84, 0x5c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0x5c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xfc, 0x5c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x5d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x74, 0x5d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb0, 0x5d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xec, 0x5d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0x5e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x64, 0x5e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa0, 0x5e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xdc, 0x5e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0x5f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x54, 0x5f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x90, 0x5f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xcc, 0x5f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0x60, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x44, 0x60, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x80, 0x60, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xbc, 0x60, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x60, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x34, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x70, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xac, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x24, 0x62, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x60, 0x62, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x62, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0x62, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x14, 0x63, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x50, 0x63, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x8c, 0x63, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0x63, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x04, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x40, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x7c, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf4, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x30, 0x65, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x6c, 0x65, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0x65, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0x65, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x20, 0x66, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x5c, 0x66, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0x66, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd4, 0x66, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x10, 0x67, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x4c, 0x67, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0x67, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc4, 0x67, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x68, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0x68, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0x68, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb4, 0x68, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf0, 0x68, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x2c, 0x69, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0x69, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa4, 0x69, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe0, 0x69, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x94, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd0, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x6b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0x6b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x84, 0x6b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0x6b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xfc, 0x6b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x6c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x74, 0x6c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb0, 0x6c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xec, 0x6c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x64, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa0, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xdc, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0x6e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x54, 0x6e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x90, 0x6e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xcc, 0x6e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0x6f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x44, 0x6f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x80, 0x6f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xbc, 0x6f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x6f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x34, 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x70, 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xac, 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x24, 0x71, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x60, 0x71, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x71, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0x71, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x14, 0x72, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x50, 0x72, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x8c, 0x72, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0x72, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x04, 0x73, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x40, 0x73, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x7c, 0x73, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0x73, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf4, 0x73, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x30, 0x74, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x6c, 0x74, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0x74, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0x74, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x20, 0x75, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x5c, 0x75, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0x75, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd4, 0x75, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x10, 0x76, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x4c, 0x76, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0x76, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc4, 0x76, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x77, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0x77, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0x77, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb4, 0x77, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf0, 0x77, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x2c, 0x78, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0x78, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa4, 0x78, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe0, 0x78, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0x79, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0x79, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x94, 0x79, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd0, 0x79, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x7a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0x7a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x84, 0x7a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0x7a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xfc, 0x7a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x7b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x74, 0x7b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb0, 0x7b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xec, 0x7b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0x7c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x64, 0x7c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa0, 0x7c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xdc, 0x7c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0x7d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x54, 0x7d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x90, 0x7d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xcc, 0x7d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0x7e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x44, 0x7e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x80, 0x7e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xbc, 0x7e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x7e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x34, 0x7f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x70, 0x7f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xac, 0x7f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0x7f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x01, 0x25, 0x07, 0x4e, 0xad, 0x03, 0x75, 0x61, 0x0a, 0x20, 0xfa, 0xf7, 0x6c, 0xff, 0x30, 0x68, 0x80, 0x03, 0xc4, 0x0f, 0xb5, 0x61, 0x0a, 0x20, 0xfa, 0xf7, 0x65, 0xff, 0x20, 0x1c, 0x70, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x24, 0x80, 0x01, 0x00, 0x10, 0x00, 0x07, 0x00, 0x70, 0xb5, 0x01, 0x25, 0x6d, 0x04, 0x00, 0x28, 0x10, 0x4c, 0x01, 0xd0, 0x65, 0x61, 0x00, 0xe0, 0xa5, 0x61, 0x60, 0x68, 0x28, 0x43, 0x60, 0x60, 0xa0, 0x68, 0x28, 0x43, 0xa0, 0x60, 0x0a, 0x20, 0xfa, 0xf7, 0x4e, 0xff, 0x01, 0x26, 0xb6, 0x03, 0x66, 0x61, 0x0a, 0x20, 0xfa, 0xf7, 0x48, 0xff, 0xa6, 0x61, 0x01, 0x20, 0xfa, 0xf7, 0x44, 0xff, 0x3c, 0x00, 0x60, 0x80, 0x01, 0x00, 0xa0, 0x68, 0xa8, 0x43, 0xa0, 0x60, 0x60, 0x68, 0x28, 0x43, 0x60, 0x60, 0x0a, 0x20, 0xfa, 0xf7, 0x3b, 0xff, 0x70, 0xbd, 0x10, 0x00, 0x07, 0x00, 0x70, 0xb5, 0x01, 0x25, 0x10, 0x4c, 0x6d, 0x04, 0x65, 0x61, 0x60, 0x68, 0x28, 0x43, 0x60, 0x60, 0xa0, 0x68, 0x28, 0x43, 0xa0, 0x60, 0xee, 0x08, 0xa6, 0x61, 0x0a, 0x20, 0xfa, 0xf7, 0x28, 0xff, 0x66, 0x61, 0x0a, 0x20, 0x3c, 0x00, 0x9c, 0x80, 0x01, 0x00, 0xfa, 0xf7, 0x24, 0xff, 0xa5, 0x61, 0x0a, 0x20, 0xfa, 0xf7, 0x20, 0xff, 0xa6, 0x61, 0x0a, 0x20, 0xfa, 0xf7, 0x1c, 0xff, 0xa0, 0x68, 0xa8, 0x43, 0xa0, 0x60, 0x60, 0x68, 0x28, 0x43, 0x60, 0x60, 0x70, 0xbd, 0x00, 0x00, 0x10, 0x00, 0x07, 0x00, 0x70, 0xb5, 0x01, 0x25, 0x0e, 0x4c, 0x6d, 0x04, 0xa5, 0x61, 0x60, 0x68, 0x28, 0x43, 0x60, 0x60, 0xa0, 0x68, 0x28, 0x43, 0x3c, 0x00, 0xd8, 0x80, 0x01, 0x00, 0xa0, 0x60, 0xee, 0x08, 0x66, 0x61, 0x0a, 0x20, 0xfa, 0xf7, 0x02, 0xff, 0x65, 0x61, 0x0a, 0x20, 0xfa, 0xf7, 0xfe, 0xfe, 0xa6, 0x61, 0x0a, 0x20, 0xfa, 0xf7, 0xfa, 0xfe, 0xa0, 0x68, 0xa8, 0x43, 0xa0, 0x60, 0x60, 0x68, 0x28, 0x43, 0x60, 0x60, 0x70, 0xbd, 0x00, 0x00, 0x10, 0x00, 0x07, 0x00, 0x70, 0xb5, 0x05, 0x1c, 0x00, 0x24, 0x80, 0x26, 0x28, 0x1c, 0x30, 0x40, 0x3c, 0x00, 0x14, 0x81, 0x01, 0x00, 0xff, 0xf7, 0x88, 0xff, 0x68, 0x06, 0x05, 0x0e, 0x01, 0x34, 0x08, 0x2c, 0xf6, 0xdb, 0xff, 0xf7, 0x6d, 0xff, 0x70, 0xbd, 0x80, 0xb5, 0x02, 0x1c, 0x0b, 0x21, 0x80, 0x20, 0xfb, 0xf7, 0x3e, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x12, 0x48, 0x00, 0x25, 0x07, 0x1c, 0xff, 0x37, 0x06, 0x1d, 0x01, 0x37, 0x28, 0x1c, 0xf9, 0xf7, 0xea, 0xfd, 0x04, 0x1c, 0x17, 0xd0, 0x3c, 0x00, 0x50, 0x81, 0x01, 0x00, 0x20, 0x69, 0x00, 0x28, 0x04, 0xd0, 0xe0, 0x6a, 0x00, 0x28, 0x03, 0xd0, 0x00, 0x20, 0xe0, 0x62, 0x25, 0x1c, 0xf0, 0xe7, 0x7b, 0x68, 0x00, 0x2b, 0x05, 0xd0, 0x32, 0x1c, 0x21, 0x1c, 0x44, 0x31, 0x01, 0x20, 0xe8, 0xf7, 0x34, 0xf9, 0x20, 0x1c, 0x44, 0x30, 0xf9, 0xf7, 0x37, 0xfe, 0xe2, 0xe7, 0xf8, 0xbd, 0x00, 0x00, 0x20, 0xf7, 0x01, 0x00, 0x11, 0x48, 0x70, 0xb5, 0x3c, 0x00, 0x8c, 0x81, 0x01, 0x00, 0x00, 0x68, 0xff, 0x28, 0x1d, 0xd1, 0xff, 0x20, 0x32, 0x30, 0xfa, 0xf7, 0xa7, 0xfe, 0x0e, 0x4d, 0x6c, 0x68, 0x0e, 0x48, 0xfa, 0xf7, 0xa2, 0xfe, 0x68, 0x68, 0x24, 0x1a, 0x01, 0x20, 0x00, 0xf0, 0x95, 0xfd, 0x6e, 0x68, 0x09, 0x48, 0xfa, 0xf7, 0x99, 0xfe, 0x68, 0x68, 0x21, 0x1c, 0x0a, 0x39, 0x30, 0x1a, 0x88, 0x42, 0x02, 0xd3, 0x0a, 0x34, 0xa0, 0x42, 0x02, 0xd9, 0x3c, 0x00, 0xc8, 0x81, 0x01, 0x00, 0x00, 0x20, 0x00, 0xf0, 0x85, 0xfd, 0x70, 0xbd, 0xf4, 0x74, 0x01, 0x00, 0x00, 0x03, 0x07, 0x00, 0x93, 0x03, 0x00, 0x00, 0x70, 0xb5, 0x00, 0xf0, 0x4d, 0xf8, 0x01, 0x20, 0xed, 0xf7, 0x34, 0xf9, 0x11, 0x4d, 0x18, 0x21, 0x68, 0x60, 0x00, 0x20, 0xe9, 0xf7, 0xf2, 0xf9, 0x28, 0x60, 0x04, 0x68, 0x80, 0x20, 0x20, 0x80, 0x00, 0x26, 0x06, 0x22, 0xff, 0x21, 0x20, 0x1d, 0x3c, 0x00, 0x04, 0x82, 0x01, 0x00, 0x66, 0x80, 0xe8, 0xf7, 0x0b, 0xfa, 0x20, 0x1c, 0x0a, 0x30, 0x09, 0x49, 0xf2, 0xf7, 0x2e, 0xfd, 0x20, 0x1c, 0x10, 0x30, 0x07, 0x49, 0xf2, 0xf7, 0x29, 0xfd, 0xe6, 0x82, 0x03, 0xcd, 0xe9, 0xf7, 0xf9, 0xf8, 0x02, 0x49, 0x01, 0x20, 0x14, 0x39, 0x88, 0x60, 0x70, 0xbd, 0x90, 0xd9, 0x01, 0x00, 0x12, 0x61, 0x01, 0x00, 0x24, 0xf7, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0x40, 0x82, 0x01, 0x00, 0x10, 0xb5, 0x06, 0x4c, 0x00, 0x22, 0x02, 0x20, 0xe1, 0x68, 0xf0, 0xf7, 0x11, 0xfb, 0x60, 0x78, 0x02, 0x28, 0x01, 0xd1, 0x00, 0xf0, 0x1a, 0xf9, 0x10, 0xbd, 0x00, 0x00, 0x40, 0xd9, 0x01, 0x00, 0x80, 0xb5, 0xa1, 0x20, 0xff, 0xf7, 0x50, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x40, 0x00, 0x0e, 0x21, 0x08, 0x40, 0x80, 0xb5, 0xa0, 0x30, 0xff, 0xf7, 0x47, 0xff, 0x80, 0xbd, 0x3c, 0x00, 0x7c, 0x82, 0x01, 0x00, 0x10, 0xb5, 0x05, 0x4c, 0x20, 0x68, 0x00, 0x28, 0x04, 0xd0, 0xe9, 0xf7, 0x87, 0xf9, 0x00, 0x20, 0x20, 0x60, 0x60, 0x60, 0x10, 0xbd, 0x00, 0x00, 0x90, 0xd9, 0x01, 0x00, 0x10, 0xb5, 0x07, 0x4c, 0x01, 0x21, 0x07, 0x4a, 0x21, 0x61, 0x02, 0x20, 0x10, 0x70, 0x61, 0x61, 0x00, 0xf0, 0xd6, 0xfc, 0x00, 0xf0, 0xc8, 0xfb, 0x20, 0x1c, 0xed, 0xf7, 0x9f, 0xfa, 0x10, 0xbd, 0x3c, 0x00, 0xb8, 0x82, 0x01, 0x00, 0x20, 0xf7, 0x01, 0x00, 0x7c, 0xd9, 0x01, 0x00, 0x70, 0xb5, 0x02, 0x1c, 0x08, 0x1c, 0x02, 0x25, 0x00, 0x2a, 0x13, 0x4e, 0x14, 0xd0, 0x00, 0xf0, 0x11, 0xfc, 0x30, 0x78, 0x01, 0x21, 0x08, 0x43, 0x30, 0x70, 0x30, 0x78, 0x28, 0x43, 0x30, 0x70, 0x00, 0x20, 0x7d, 0x21, 0x49, 0x01, 0xb2, 0x79, 0x92, 0x07, 0x00, 0xd5, 0x01, 0x34, 0x01, 0x30, 0x88, 0x42, 0xf8, 0xdb, 0x3c, 0x00, 0xf4, 0x82, 0x01, 0x00, 0x20, 0x1c, 0x70, 0xbd, 0x30, 0x78, 0xa8, 0x43, 0x30, 0x70, 0x30, 0x78, 0x40, 0x08, 0x40, 0x00, 0x30, 0x70, 0x05, 0x49, 0x48, 0x68, 0x01, 0x22, 0x12, 0x04, 0x90, 0x43, 0x48, 0x60, 0x01, 0x20, 0x70, 0xbd, 0x00, 0x00, 0x88, 0x00, 0x07, 0x00, 0x6c, 0x00, 0x07, 0x00, 0xff, 0xb5, 0x09, 0xae, 0x00, 0x20, 0x60, 0xce, 0x28, 0x60, 0x00, 0x23, 0x9c, 0x46, 0x30, 0x60, 0x3c, 0x00, 0x30, 0x83, 0x01, 0x00, 0x69, 0x46, 0x01, 0xaa, 0x17, 0xe0, 0xdb, 0x07, 0x0e, 0xd5, 0x12, 0x4b, 0x1c, 0x56, 0x63, 0x1c, 0x0a, 0xd0, 0x01, 0x27, 0x2b, 0x68, 0xa7, 0x40, 0x3b, 0x43, 0x2b, 0x60, 0x13, 0x68, 0xdb, 0x07, 0x02, 0xd5, 0x33, 0x68, 0x3b, 0x43, 0x33, 0x60, 0x0b, 0x68, 0x5b, 0x08, 0x0b, 0x60, 0x13, 0x68, 0x5b, 0x08, 0x13, 0x60, 0x01, 0x30, 0x0b, 0x68, 0x00, 0x2b, 0x01, 0xd0, 0x3c, 0x00, 0x6c, 0x83, 0x01, 0x00, 0x22, 0x28, 0xe2, 0xd3, 0x63, 0x46, 0x01, 0x33, 0x20, 0x20, 0x02, 0x2b, 0x9c, 0x46, 0x02, 0xa9, 0x03, 0xaa, 0xf2, 0xdb, 0xff, 0xbd, 0x00, 0x00, 0xb4, 0x8d, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, 0x1e, 0x21, 0x00, 0x22, 0x03, 0x20, 0x05, 0x4b, 0xf9, 0xf7, 0xb3, 0xf8, 0x21, 0x1c, 0x03, 0x20, 0xf9, 0xf7, 0xf5, 0xf8, 0x29, 0x1c, 0x03, 0x20, 0xf9, 0xf7, 0x3c, 0x00, 0xa8, 0x83, 0x01, 0x00, 0xf1, 0xf8, 0xb0, 0xbd, 0x80, 0x38, 0x01, 0x00, 0xb0, 0xb5, 0x1c, 0x4c, 0x1c, 0x4d, 0x21, 0x78, 0x02, 0x29, 0x09, 0xd0, 0x03, 0x29, 0x19, 0xd0, 0x04, 0x29, 0x1f, 0xd0, 0x05, 0x29, 0x23, 0xd1, 0x00, 0x20, 0x00, 0xf0, 0x17, 0xfb, 0x23, 0xe0, 0x68, 0x61, 0x14, 0x48, 0x1c, 0x30, 0xc1, 0x68, 0x02, 0x69, 0x89, 0x18, 0xc1, 0x60, 0x00, 0xf0, 0x2f, 0xfb, 0xe0, 0x68, 0x3c, 0x00, 0xe4, 0x83, 0x01, 0x00, 0x01, 0x38, 0xe0, 0x60, 0x16, 0xd1, 0x32, 0x20, 0xe0, 0x60, 0xff, 0xf7, 0xa3, 0xfe, 0x11, 0xe0, 0x00, 0x20, 0x00, 0xf0, 0x01, 0xfb, 0x00, 0xf0, 0x2d, 0xfc, 0x01, 0x20, 0x20, 0x70, 0x09, 0xe0, 0x00, 0x20, 0x00, 0xf0, 0xf9, 0xfa, 0xff, 0xf7, 0x45, 0xff, 0x03, 0xe0, 0x05, 0x21, 0x0b, 0x20, 0xe8, 0xf7, 0x46, 0xff, 0x68, 0x69, 0x61, 0x68, 0xe7, 0xf7, 0xdd, 0xff, 0x3c, 0x00, 0x20, 0x84, 0x01, 0x00, 0xb0, 0xbd, 0x00, 0x00, 0x7c, 0xd9, 0x01, 0x00, 0x20, 0xf7, 0x01, 0x00, 0xf7, 0xb5, 0x04, 0x1c, 0x17, 0x1c, 0xff, 0xf7, 0x21, 0xfe, 0x20, 0x0a, 0xff, 0xf7, 0x18, 0xff, 0x20, 0x06, 0x00, 0x0e, 0xff, 0xf7, 0x62, 0xfe, 0xff, 0xf7, 0x18, 0xfe, 0xa1, 0x20, 0xff, 0xf7, 0x5d, 0xfe, 0x00, 0x25, 0x16, 0xe0, 0x00, 0x20, 0x00, 0x24, 0x40, 0x06, 0x06, 0x0e, 0xff, 0xf7, 0x3c, 0x00, 0x5c, 0x84, 0x01, 0x00, 0xd1, 0xfd, 0x00, 0x06, 0x00, 0x0e, 0x30, 0x43, 0x01, 0x34, 0x08, 0x2c, 0xf5, 0xdb, 0x29, 0x1c, 0x01, 0x9a, 0x01, 0x35, 0xbd, 0x42, 0x50, 0x54, 0x01, 0xda, 0x00, 0x20, 0x00, 0xe0, 0x01, 0x20, 0xff, 0xf7, 0xd4, 0xfd, 0xbd, 0x42, 0xe6, 0xdb, 0xff, 0xf7, 0x1e, 0xfe, 0xfe, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0xff, 0xf7, 0x19, 0xfe, 0x09, 0x21, 0x89, 0x03, 0x00, 0x22, 0x3c, 0x00, 0x98, 0x84, 0x01, 0x00, 0x02, 0x20, 0xf0, 0xf7, 0xe9, 0xf9, 0x80, 0xbd, 0x09, 0x21, 0x89, 0x03, 0x80, 0xb5, 0x00, 0x22, 0x02, 0x20, 0xf0, 0xf7, 0xc9, 0xf9, 0x01, 0x21, 0x09, 0x48, 0x89, 0x03, 0x81, 0x61, 0x42, 0x68, 0x0a, 0x43, 0x42, 0x60, 0x82, 0x68, 0x11, 0x43, 0x81, 0x60, 0x01, 0x21, 0x49, 0x04, 0x81, 0x61, 0x82, 0x68, 0x8a, 0x43, 0x82, 0x60, 0x42, 0x68, 0x11, 0x43, 0x41, 0x60, 0x3c, 0x00, 0xd4, 0x84, 0x01, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x10, 0x00, 0x07, 0x00, 0xf0, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0x7b, 0x4e, 0x05, 0x68, 0x30, 0x78, 0x85, 0xb0, 0x01, 0x28, 0x01, 0xd0, 0x02, 0x28, 0x72, 0xd1, 0x00, 0x21, 0x20, 0x69, 0xf2, 0xf7, 0x41, 0xf9, 0x76, 0x49, 0xf2, 0xf7, 0x24, 0xfc, 0x00, 0x28, 0x69, 0xd0, 0x20, 0x1c, 0x20, 0x30, 0x41, 0x7a, 0x08, 0x29, 0x02, 0xd1, 0x72, 0x4a, 0x3c, 0x00, 0x10, 0x85, 0x01, 0x00, 0x00, 0x21, 0x51, 0x61, 0x00, 0x7a, 0x22, 0x6a, 0x18, 0x21, 0xf2, 0xf7, 0xc9, 0xfb, 0xe1, 0x6a, 0x37, 0x1c, 0x40, 0x18, 0x6c, 0x49, 0x02, 0x90, 0x30, 0x78, 0x0e, 0x1c, 0xff, 0x36, 0x0a, 0x1d, 0x01, 0x36, 0x01, 0x28, 0x04, 0x92, 0x07, 0xd0, 0x65, 0x4a, 0x02, 0x99, 0x1c, 0x32, 0x28, 0x1c, 0xed, 0xf7, 0xe2, 0xfb, 0x00, 0x28, 0x6b, 0xd0, 0x32, 0x21, 0x20, 0x69, 0x3c, 0x00, 0x4c, 0x85, 0x01, 0x00, 0xf2, 0xf7, 0x16, 0xf9, 0x01, 0x90, 0x20, 0x69, 0x01, 0x21, 0xf2, 0xf7, 0x11, 0xf9, 0x01, 0x1c, 0x5e, 0x48, 0x01, 0x23, 0x01, 0x9a, 0xed, 0xf7, 0x07, 0xfc, 0x00, 0x28, 0x04, 0xd1, 0x5b, 0x48, 0xed, 0xf7, 0x92, 0xfa, 0x00, 0x21, 0xb9, 0x60, 0x56, 0x48, 0x1c, 0x30, 0x81, 0x68, 0xea, 0xf7, 0x19, 0xfc, 0x20, 0x1c, 0x14, 0x30, 0x03, 0x90, 0x04, 0x99, 0xf2, 0xf7, 0x3c, 0x00, 0x88, 0x85, 0x01, 0x00, 0xd5, 0xfb, 0x00, 0x28, 0x05, 0xd1, 0x00, 0x22, 0xba, 0x60, 0x04, 0x98, 0x03, 0x99, 0xf2, 0xf7, 0x6b, 0xfb, 0x4f, 0x49, 0x28, 0x89, 0x09, 0x88, 0x88, 0x42, 0x03, 0xd0, 0x00, 0x22, 0x4c, 0x49, 0xba, 0x60, 0x08, 0x80, 0x03, 0x21, 0x20, 0x69, 0xf2, 0xf7, 0xe4, 0xf8, 0x00, 0x28, 0x10, 0xd0, 0x46, 0x49, 0x82, 0x78, 0x20, 0x31, 0x0b, 0x79, 0x94, 0x46, 0x9a, 0x42, 0x3c, 0x00, 0xc4, 0x85, 0x01, 0x00, 0x09, 0xd0, 0x00, 0x22, 0xba, 0x60, 0x62, 0x46, 0x0a, 0x71, 0x80, 0x78, 0x01, 0x21, 0xf3, 0xf7, 0x05, 0xf9, 0x00, 0xe0, 0x77, 0xe0, 0x06, 0x21, 0x20, 0x69, 0xf2, 0xf7, 0xcd, 0xf8, 0x00, 0x28, 0x08, 0xd0, 0x81, 0x78, 0x3a, 0x48, 0x40, 0x30, 0x82, 0x88, 0x91, 0x42, 0x02, 0xd0, 0x00, 0x22, 0xba, 0x60, 0x81, 0x80, 0x2a, 0x21, 0x20, 0x69, 0xf2, 0xf7, 0xbe, 0xf8, 0x3c, 0x00, 0x00, 0x86, 0x01, 0x00, 0x00, 0x28, 0x0d, 0xd0, 0x80, 0x78, 0xf1, 0x69, 0x33, 0x4a, 0x81, 0x42, 0x08, 0xd0, 0x00, 0x21, 0xb9, 0x60, 0xf0, 0x61, 0x10, 0x1c, 0xed, 0xf7, 0x09, 0xfb, 0x2f, 0x48, 0xed, 0xf7, 0xfa, 0xfa, 0x38, 0x78, 0x3b, 0x1c, 0x01, 0x28, 0x17, 0xd1, 0x02, 0x20, 0x18, 0x70, 0x2a, 0x4f, 0x01, 0x23, 0x3b, 0x61, 0x27, 0x4b, 0x03, 0xcd, 0x1c, 0x33, 0x08, 0x3d, 0x02, 0x9a, 0x3c, 0x00, 0x3c, 0x86, 0x01, 0x00, 0xed, 0xf7, 0xb0, 0xfa, 0x38, 0x1c, 0xed, 0xf7, 0xd7, 0xf8, 0x32, 0x68, 0x00, 0x2a, 0x03, 0xd0, 0x00, 0x21, 0x01, 0x20, 0xe7, 0xf7, 0xc4, 0xfe, 0x00, 0xf0, 0xf4, 0xf9, 0x20, 0x1c, 0xf9, 0xf7, 0xd5, 0xfb, 0x07, 0x1c, 0x11, 0xd1, 0x20, 0x1c, 0xf9, 0xf7, 0x88, 0xfb, 0x07, 0x1c, 0x2e, 0xd0, 0x01, 0x23, 0x3b, 0x61, 0x68, 0x89, 0x40, 0x21, 0xc8, 0x53, 0x73, 0x68, 0x3c, 0x00, 0x78, 0x86, 0x01, 0x00, 0x00, 0x2b, 0x04, 0xd0, 0x21, 0x1c, 0x00, 0x20, 0x04, 0x9a, 0xe7, 0xf7, 0xac, 0xfe, 0x01, 0x23, 0xfb, 0x62, 0x20, 0x69, 0x32, 0x21, 0xf2, 0xf7, 0x75, 0xf8, 0x05, 0x1c, 0x20, 0x69, 0x01, 0x21, 0xf2, 0xf7, 0x70, 0xf8, 0x0e, 0x4e, 0x01, 0x1c, 0x2a, 0x1c, 0x30, 0x1c, 0xed, 0xf7, 0xc0, 0xfb, 0x00, 0x28, 0x0e, 0xd1, 0x32, 0x21, 0x20, 0x69, 0xf2, 0xf7, 0x64, 0xf8, 0x3c, 0x00, 0xb4, 0x86, 0x01, 0x00, 0x05, 0x1c, 0x20, 0x69, 0x01, 0x21, 0xf2, 0xf7, 0x5f, 0xf8, 0x01, 0x1c, 0x3b, 0x1c, 0x2a, 0x1c, 0x30, 0x1c, 0xed, 0xf7, 0xd7, 0xfa, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0x7c, 0xd9, 0x01, 0x00, 0x40, 0xf8, 0x01, 0x00, 0x20, 0xf7, 0x01, 0x00, 0x02, 0x1c, 0x08, 0x1c, 0x80, 0x2a, 0x80, 0xb5, 0x06, 0xd0, 0x81, 0x2a, 0x03, 0xd0, 0x04, 0x21, 0x0b, 0x20, 0xe8, 0xf7, 0x3c, 0x00, 0xf0, 0x86, 0x01, 0x00, 0xd9, 0xfd, 0x80, 0xbd, 0xff, 0xf7, 0x5c, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x03, 0x48, 0x81, 0x78, 0xff, 0x29, 0x01, 0xd0, 0x00, 0x79, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x80, 0xf8, 0x01, 0x00, 0x30, 0xb5, 0x89, 0xb0, 0x00, 0x93, 0x0e, 0x4d, 0x13, 0x1c, 0x04, 0x1c, 0x2a, 0x1c, 0xec, 0xf7, 0x25, 0xfd, 0x01, 0xa9, 0x06, 0xa8, 0xa2, 0x68, 0xec, 0xf7, 0xce, 0xfe, 0x3c, 0x00, 0x2c, 0x87, 0x01, 0x00, 0x01, 0xaa, 0x06, 0xa9, 0x28, 0x1c, 0x63, 0x6a, 0xed, 0xf7, 0x44, 0xfa, 0x04, 0x1c, 0x01, 0x28, 0x04, 0xd1, 0x28, 0x1c, 0xed, 0xf7, 0x2c, 0xf8, 0x00, 0xf0, 0x4a, 0xf8, 0x20, 0x1c, 0x09, 0xb0, 0x30, 0xbd, 0x00, 0x00, 0x20, 0xf7, 0x01, 0x00, 0x80, 0xb5, 0xed, 0xf7, 0x2b, 0xf8, 0x00, 0xf0, 0x7d, 0xf8, 0x02, 0x48, 0xed, 0xf7, 0x02, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x68, 0x87, 0x01, 0x00, 0x20, 0xf7, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x28, 0x0b, 0xd1, 0x06, 0x48, 0xed, 0xf7, 0xf8, 0xf9, 0x00, 0xf0, 0x6e, 0xf8, 0x01, 0x20, 0xed, 0xf7, 0xeb, 0xfa, 0x03, 0x49, 0x03, 0x20, 0xf9, 0xf7, 0x35, 0xfe, 0x80, 0xbd, 0x20, 0xf7, 0x01, 0x00, 0x6d, 0x87, 0x01, 0x00, 0xb0, 0xb5, 0x10, 0x4d, 0x04, 0x1c, 0x13, 0x1c, 0x2a, 0x1c, 0x88, 0xb0, 0xec, 0xf7, 0x02, 0xfd, 0x3c, 0x00, 0xa4, 0x87, 0x01, 0x00, 0x21, 0x1c, 0x0a, 0x31, 0x06, 0x22, 0x28, 0x1d, 0xe7, 0xf7, 0xa4, 0xfe, 0x69, 0x46, 0x05, 0xa8, 0x62, 0x69, 0xec, 0xf7, 0x87, 0xfe, 0x28, 0x1c, 0xec, 0xf7, 0xee, 0xff, 0x7f, 0x23, 0xdb, 0x43, 0x28, 0x1c, 0x6a, 0x46, 0x05, 0xa9, 0xed, 0xf7, 0xf9, 0xf9, 0x00, 0xf0, 0x1d, 0xf8, 0x08, 0xb0, 0xb0, 0xbd, 0x00, 0x00, 0x20, 0xf7, 0x01, 0x00, 0x0a, 0x48, 0x80, 0xb5, 0x3c, 0x00, 0xe0, 0x87, 0x01, 0x00, 0x01, 0x78, 0x00, 0x29, 0x06, 0xd0, 0x02, 0x29, 0x01, 0xd0, 0x05, 0x29, 0x07, 0xd1, 0x03, 0x21, 0x01, 0x70, 0x80, 0xbd, 0x01, 0x21, 0x01, 0x70, 0x00, 0xf0, 0x2e, 0xfa, 0x80, 0xbd, 0x03, 0x21, 0x0b, 0x20, 0xe8, 0xf7, 0x4f, 0xfd, 0x80, 0xbd, 0x7c, 0xd9, 0x01, 0x00, 0x09, 0x49, 0x80, 0xb5, 0x08, 0x78, 0x00, 0x28, 0x06, 0xd0, 0x02, 0x28, 0x01, 0xd0, 0x05, 0x28, 0x3c, 0x00, 0x1c, 0x88, 0x01, 0x00, 0x05, 0xd1, 0x04, 0x20, 0x08, 0x70, 0x80, 0xbd, 0xff, 0xf7, 0x38, 0xfd, 0x80, 0xbd, 0x02, 0x21, 0x0b, 0x20, 0xe8, 0xf7, 0x39, 0xfd, 0x80, 0xbd, 0x7c, 0xd9, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x0b, 0x20, 0x04, 0x4a, 0xfa, 0xf7, 0x82, 0xff, 0xf6, 0xf7, 0x86, 0xfd, 0x02, 0x49, 0x08, 0x61, 0x80, 0xbd, 0x00, 0x00, 0xdd, 0x86, 0x01, 0x00, 0x7c, 0xd9, 0x01, 0x00, 0x3c, 0x00, 0x58, 0x88, 0x01, 0x00, 0x0c, 0x48, 0x80, 0xb5, 0x01, 0x78, 0x06, 0x29, 0x0e, 0xd2, 0x02, 0xa3, 0x5b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x00, 0x06, 0x03, 0x07, 0x07, 0x07, 0x06, 0x00, 0x20, 0x00, 0xf0, 0xc2, 0xf8, 0x80, 0xbd, 0x05, 0x21, 0x01, 0x70, 0x80, 0xbd, 0x04, 0x21, 0x0b, 0x20, 0xe8, 0xf7, 0x0e, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0x7c, 0xd9, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0x94, 0x88, 0x01, 0x00, 0x10, 0xb5, 0x0d, 0x4b, 0x04, 0x1c, 0x18, 0x1c, 0x10, 0x30, 0x00, 0x2c, 0x08, 0xd0, 0xdb, 0x88, 0x5b, 0x04, 0x5b, 0x0c, 0x0b, 0x80, 0x80, 0x7b, 0x48, 0x80, 0x04, 0x20, 0x10, 0x80, 0x08, 0xe0, 0xda, 0x88, 0x01, 0x24, 0xe4, 0x03, 0x22, 0x40, 0x0c, 0x88, 0x22, 0x43, 0xda, 0x80, 0x49, 0x88, 0x81, 0x73, 0x01, 0x20, 0x10, 0xbd, 0x00, 0x00, 0x30, 0x00, 0x07, 0x00, 0x3c, 0x00, 0xd0, 0x88, 0x01, 0x00, 0x70, 0xb5, 0x10, 0x4e, 0x02, 0x1c, 0x00, 0x23, 0xf0, 0x56, 0x00, 0x2a, 0x02, 0xd0, 0x08, 0x70, 0x01, 0x24, 0x15, 0xe0, 0x00, 0x23, 0xcd, 0x56, 0x85, 0x42, 0x01, 0xd1, 0x01, 0x20, 0x70, 0xbd, 0x28, 0x1c, 0x00, 0xf0, 0x5f, 0xf9, 0x04, 0x1c, 0x0a, 0xd0, 0x07, 0x48, 0x35, 0x70, 0x00, 0x68, 0x00, 0x28, 0x03, 0xd0, 0x00, 0x21, 0x0a, 0x20, 0xf9, 0xf7, 0x28, 0xfd, 0x3c, 0x00, 0x0c, 0x89, 0x01, 0x00, 0x00, 0xf0, 0x16, 0xfa, 0x20, 0x1c, 0x70, 0xbd, 0xf4, 0x6b, 0x01, 0x00, 0x3c, 0xd9, 0x01, 0x00, 0x03, 0x1c, 0x08, 0x1c, 0x00, 0x2b, 0x80, 0xb5, 0x06, 0xd0, 0x04, 0x21, 0x11, 0x80, 0x04, 0x22, 0x04, 0x49, 0xe7, 0xf7, 0xe3, 0xfd, 0x02, 0xe0, 0x00, 0x68, 0x00, 0xf0, 0xcf, 0xf9, 0x01, 0x20, 0x80, 0xbd, 0x00, 0x00, 0xf4, 0x74, 0x01, 0x00, 0x10, 0xb5, 0xff, 0xf7, 0x3c, 0x00, 0x48, 0x89, 0x01, 0x00, 0x97, 0xfb, 0xff, 0xf7, 0x89, 0xfc, 0x04, 0x1c, 0xff, 0xf7, 0xb8, 0xfb, 0xff, 0xf7, 0x84, 0xfc, 0x00, 0x2c, 0x02, 0xd1, 0x01, 0x28, 0x00, 0xd1, 0x10, 0xbd, 0x00, 0x20, 0x10, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x20, 0x4f, 0x04, 0x1c, 0x78, 0x78, 0x0e, 0x1c, 0x02, 0x28, 0x2e, 0xd0, 0x1e, 0x4a, 0xf9, 0x68, 0x91, 0x61, 0x14, 0x23, 0x1d, 0x49, 0x58, 0x43, 0x40, 0x18, 0x3c, 0x00, 0x84, 0x89, 0x01, 0x00, 0x41, 0x7b, 0xb8, 0x78, 0xf8, 0xf7, 0x14, 0xfe, 0x00, 0xf0, 0x8a, 0xf9, 0x00, 0x25, 0x04, 0xe0, 0x00, 0x21, 0xb8, 0x78, 0xf8, 0xf7, 0x0c, 0xfe, 0x01, 0x35, 0x78, 0x78, 0x14, 0x23, 0x14, 0x49, 0x58, 0x43, 0x40, 0x18, 0x80, 0x7a, 0xa8, 0x42, 0xf2, 0xdc, 0x00, 0x25, 0x08, 0xe0, 0x00, 0x21, 0xb8, 0x78, 0xf8, 0xf7, 0xfd, 0xfd, 0x0f, 0x48, 0x00, 0x68, 0x20, 0x70, 0x3c, 0x00, 0xc0, 0x89, 0x01, 0x00, 0x01, 0x34, 0x01, 0x35, 0xb5, 0x42, 0xf4, 0xdb, 0x09, 0x4a, 0xf8, 0x68, 0x50, 0x61, 0x78, 0x78, 0x02, 0x28, 0x06, 0xd1, 0xb8, 0x68, 0x32, 0x1c, 0x21, 0x1c, 0x00, 0x04, 0x00, 0x0c, 0xff, 0xf7, 0x25, 0xfd, 0xb8, 0x68, 0x80, 0x19, 0xb8, 0x60, 0xf8, 0xbd, 0x00, 0x00, 0x40, 0xd9, 0x01, 0x00, 0x10, 0x00, 0x07, 0x00, 0x64, 0x8d, 0x01, 0x00, 0x30, 0x20, 0x07, 0x00, 0x3c, 0x00, 0xfc, 0x89, 0x01, 0x00, 0x70, 0xb5, 0x06, 0x1c, 0x0c, 0x4d, 0x00, 0x24, 0x2c, 0x70, 0xff, 0xf7, 0x39, 0xfc, 0x0a, 0x48, 0x18, 0x21, 0x1c, 0x30, 0xac, 0x60, 0xe7, 0xf7, 0x43, 0xfd, 0x08, 0x48, 0x44, 0x61, 0xf9, 0xf7, 0x63, 0xf9, 0x00, 0x2e, 0x06, 0xd1, 0x06, 0x48, 0x29, 0x69, 0xf6, 0xf7, 0xa7, 0xfc, 0x00, 0x20, 0xec, 0xf7, 0xb0, 0xfe, 0x70, 0xbd, 0x00, 0x00, 0x7c, 0xd9, 0x01, 0x00, 0x3c, 0x00, 0x38, 0x8a, 0x01, 0x00, 0x20, 0xf7, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x30, 0xb5, 0x12, 0x4c, 0x85, 0xb0, 0x20, 0x68, 0x00, 0x28, 0x1c, 0xd0, 0x0f, 0x48, 0x14, 0x38, 0x80, 0x68, 0x00, 0x28, 0x01, 0xd1, 0xff, 0xf7, 0xc1, 0xfb, 0x20, 0x68, 0x00, 0x23, 0x00, 0x68, 0x01, 0xaa, 0x04, 0x30, 0x01, 0x21, 0xec, 0xf7, 0xd1, 0xfd, 0x08, 0x49, 0x08, 0x4a, 0x08, 0x31, 0x0c, 0x31, 0x00, 0x92, 0x3c, 0x00, 0x74, 0x8a, 0x01, 0x00, 0x03, 0xc9, 0x00, 0xab, 0x45, 0x18, 0x99, 0x7b, 0x01, 0x9a, 0x20, 0x68, 0x2b, 0x1c, 0xf2, 0xf7, 0x2b, 0xfe, 0x05, 0xb0, 0x30, 0xbd, 0x00, 0x00, 0x90, 0xd9, 0x01, 0x00, 0x29, 0x81, 0x01, 0x00, 0x10, 0xb5, 0x13, 0x4c, 0x14, 0x23, 0x60, 0x70, 0x58, 0x43, 0x12, 0x4b, 0xc1, 0x18, 0x8a, 0x88, 0xe2, 0x80, 0x18, 0x58, 0xe0, 0x60, 0x08, 0x7a, 0xa0, 0x70, 0xff, 0x28, 0x3c, 0x00, 0xb0, 0x8a, 0x01, 0x00, 0x12, 0xd0, 0x00, 0x22, 0x08, 0x21, 0x0d, 0x4b, 0xf8, 0xf7, 0x22, 0xfd, 0x00, 0x22, 0x02, 0x20, 0xe1, 0x68, 0xef, 0xf7, 0xbd, 0xfe, 0x0a, 0x49, 0xe0, 0x68, 0x48, 0x61, 0x4a, 0x68, 0x02, 0x43, 0x4a, 0x60, 0x8a, 0x68, 0x10, 0x43, 0x88, 0x60, 0x60, 0x78, 0x02, 0x28, 0x01, 0xd1, 0xff, 0xf7, 0xdf, 0xfc, 0x10, 0xbd, 0x40, 0xd9, 0x01, 0x00, 0x64, 0x8d, 0x01, 0x00, 0x3c, 0x00, 0xec, 0x8a, 0x01, 0x00, 0xb8, 0x0b, 0x00, 0x00, 0x10, 0x00, 0x07, 0x00, 0xfe, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x06, 0x21, 0x15, 0x4b, 0x41, 0x43, 0x58, 0x5c, 0x82, 0x06, 0x14, 0x48, 0x92, 0x0e, 0x42, 0x71, 0xc9, 0x18, 0x4a, 0x78, 0xd2, 0x06, 0xd2, 0x0e, 0x02, 0x71, 0x42, 0x78, 0x0c, 0x23, 0x1a, 0x43, 0x42, 0x70, 0x42, 0x78, 0x8b, 0x78, 0x92, 0x08, 0x92, 0x00, 0x9b, 0x07, 0x9b, 0x0f, 0x3c, 0x00, 0x28, 0x8b, 0x01, 0x00, 0x1a, 0x43, 0x42, 0x70, 0x02, 0x78, 0xc0, 0x23, 0x9a, 0x43, 0x40, 0x32, 0x02, 0x70, 0x02, 0x78, 0x38, 0x23, 0x1a, 0x43, 0x02, 0x70, 0x02, 0x78, 0xc9, 0x78, 0x04, 0x23, 0x9a, 0x43, 0x89, 0x00, 0x19, 0x40, 0x11, 0x43, 0x01, 0x70, 0x01, 0x20, 0x70, 0x47, 0x00, 0x00, 0xd8, 0x8d, 0x01, 0x00, 0x88, 0x00, 0x07, 0x00, 0x8f, 0xb5, 0x00, 0x20, 0x02, 0x90, 0x03, 0x90, 0x3c, 0x00, 0x64, 0x8b, 0x01, 0x00, 0x07, 0x48, 0x02, 0xaa, 0x03, 0xa9, 0x00, 0x91, 0x01, 0x92, 0x43, 0x89, 0x02, 0x89, 0x03, 0xc8, 0xff, 0xf7, 0xd4, 0xfb, 0x03, 0x98, 0x02, 0x99, 0xff, 0xf7, 0x04, 0xfc, 0x8f, 0xbd, 0x00, 0x00, 0x04, 0x8e, 0x01, 0x00, 0x08, 0x49, 0x4a, 0x78, 0x00, 0x2a, 0x03, 0xd1, 0x88, 0x80, 0x00, 0x20, 0x88, 0x60, 0x70, 0x47, 0x14, 0x23, 0x5a, 0x43, 0x04, 0x4b, 0xd2, 0x18, 0x3c, 0x00, 0xa0, 0x8b, 0x01, 0x00, 0xd2, 0x88, 0x42, 0x43, 0xc8, 0x88, 0x42, 0x43, 0x8a, 0x60, 0x70, 0x47, 0x40, 0xd9, 0x01, 0x00, 0x64, 0x8d, 0x01, 0x00, 0xf8, 0xb5, 0x25, 0x4e, 0x04, 0x1c, 0x30, 0x7a, 0x40, 0x08, 0x40, 0x00, 0x30, 0x72, 0xb0, 0x7a, 0x00, 0x20, 0xb0, 0x72, 0x01, 0x27, 0x01, 0x2c, 0x20, 0x4d, 0x01, 0xd0, 0xfc, 0x42, 0x13, 0xd1, 0x30, 0x7b, 0x38, 0x43, 0x30, 0x73, 0x00, 0x22, 0x3c, 0x00, 0xdc, 0x8b, 0x01, 0x00, 0x21, 0x1c, 0x00, 0x20, 0xff, 0xf7, 0x6e, 0xfb, 0x63, 0x1c, 0x01, 0xd1, 0x3f, 0x21, 0xe9, 0x73, 0xb1, 0x7a, 0xa0, 0x22, 0x11, 0x43, 0xb1, 0x72, 0x31, 0x7a, 0x39, 0x43, 0x31, 0x72, 0xf8, 0xbd, 0x30, 0x7b, 0x40, 0x08, 0x40, 0x00, 0x30, 0x73, 0x01, 0x22, 0x21, 0x1c, 0x01, 0x20, 0xff, 0xf7, 0x59, 0xfb, 0x01, 0x20, 0x00, 0x21, 0xe9, 0x73, 0xb1, 0x7a, 0x02, 0x22, 0x3c, 0x00, 0x18, 0x8c, 0x01, 0x00, 0x11, 0x43, 0xb1, 0x72, 0xb1, 0x7a, 0x04, 0x22, 0x11, 0x43, 0xb1, 0x72, 0xb1, 0x7a, 0x30, 0x22, 0x11, 0x43, 0xb1, 0x72, 0x31, 0x7a, 0x39, 0x43, 0x31, 0x72, 0x08, 0x49, 0x4a, 0x68, 0x80, 0x23, 0x9a, 0x43, 0x4a, 0x60, 0x0a, 0x68, 0x1a, 0x43, 0x0a, 0x60, 0x31, 0x7b, 0x39, 0x43, 0x31, 0x73, 0xd7, 0xe7, 0x00, 0x00, 0x88, 0x00, 0x07, 0x00, 0x40, 0x00, 0x07, 0x00, 0x3c, 0x00, 0x54, 0x8c, 0x01, 0x00, 0x6c, 0x00, 0x07, 0x00, 0xb0, 0xb5, 0x0e, 0x4d, 0x0e, 0x48, 0x29, 0x69, 0xf6, 0xf7, 0x9e, 0xfb, 0x0d, 0x48, 0xec, 0xf7, 0x93, 0xfd, 0x0d, 0x48, 0x09, 0x4c, 0x00, 0x88, 0x1c, 0x34, 0xa0, 0x82, 0xf1, 0xf7, 0x5a, 0xff, 0x20, 0x61, 0xfa, 0xf7, 0x97, 0xf8, 0x02, 0x1c, 0x23, 0x1c, 0x00, 0x21, 0x00, 0x20, 0xec, 0xf7, 0x8b, 0xff, 0x32, 0x20, 0xe8, 0x60, 0xff, 0xf7, 0x3c, 0x00, 0x90, 0x8c, 0x01, 0x00, 0xa5, 0xfa, 0xb0, 0xbd, 0x7c, 0xd9, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0xdd, 0x84, 0x01, 0x00, 0x20, 0xf7, 0x01, 0x00, 0xb0, 0xb5, 0x0a, 0x4d, 0x68, 0x78, 0x00, 0x28, 0x0e, 0xd0, 0x14, 0x23, 0x08, 0x49, 0x58, 0x43, 0x40, 0x18, 0x44, 0x7a, 0x06, 0xe0, 0xa8, 0x68, 0xe0, 0x40, 0x01, 0x06, 0x09, 0x0e, 0xa8, 0x78, 0xf8, 0xf7, 0x76, 0xfc, 0x08, 0x3c, 0xf6, 0xd5, 0x3c, 0x00, 0xcc, 0x8c, 0x01, 0x00, 0xb0, 0xbd, 0x00, 0x00, 0x40, 0xd9, 0x01, 0x00, 0x64, 0x8d, 0x01, 0x00, 0x01, 0x1c, 0x14, 0x48, 0xb0, 0xb5, 0x01, 0x60, 0x13, 0x48, 0x02, 0x7f, 0x02, 0x23, 0x9a, 0x43, 0x02, 0x77, 0x02, 0x7f, 0x01, 0x24, 0x22, 0x43, 0x02, 0x77, 0x10, 0x4d, 0x00, 0x29, 0x0c, 0xd0, 0x01, 0x22, 0x00, 0x21, 0x03, 0x20, 0xef, 0xf7, 0x9f, 0xfd, 0x0d, 0x49, 0x48, 0x7c, 0xa0, 0x43, 0x3c, 0x00, 0x08, 0x8d, 0x01, 0x00, 0x48, 0x74, 0x68, 0x7a, 0x20, 0x43, 0x68, 0x72, 0xb0, 0xbd, 0x01, 0x7f, 0x21, 0x43, 0x01, 0x77, 0x68, 0x7a, 0x40, 0x08, 0x40, 0x00, 0x68, 0x72, 0x01, 0x22, 0x00, 0x21, 0x03, 0x20, 0xef, 0xf7, 0xb1, 0xfd, 0xb0, 0xbd, 0xf4, 0x74, 0x01, 0x00, 0x30, 0x00, 0x07, 0x00, 0x88, 0x00, 0x07, 0x00, 0x10, 0x00, 0x07, 0x00, 0x10, 0xb5, 0x07, 0x4c, 0x21, 0x1c, 0x00, 0x20, 0x3c, 0x00, 0x44, 0x8d, 0x01, 0x00, 0xf9, 0xf7, 0x56, 0xfb, 0x05, 0x48, 0x00, 0x23, 0xc0, 0x56, 0x01, 0x28, 0x03, 0xdd, 0x21, 0x1c, 0x00, 0x20, 0xf9, 0xf7, 0x19, 0xfb, 0x10, 0xbd, 0x65, 0x1a, 0x00, 0x00, 0xf4, 0x6b, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x01, 0x01, 0x00, 0x02, 0x18, 0x04, 0xff, 0x82, 0xe8, 0xd7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x3c, 0x00, 0x80, 0x8d, 0x01, 0x00, 0x00, 0x18, 0x00, 0x06, 0x02, 0x03, 0x05, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0xff, 0x10, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x00, 0x01, 0x00, 0x02, 0x10, 0x00, 0x06, 0x02, 0x03, 0x05, 0x01, 0x01, 0x00, 0x00, 0x00, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0c, 0x0d, 0x0e, 0x3c, 0x00, 0xbc, 0x8d, 0x01, 0x00, 0xff, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0xff, 0x1a, 0x11, 0x13, 0x12, 0x0f, 0x10, 0xff, 0x02, 0x00, 0xff, 0x01, 0x03, 0x09, 0x0a, 0x0b, 0x00, 0x00, 0x30, 0x0d, 0x02, 0x00, 0x00, 0x00, 0x28, 0x0e, 0x03, 0x00, 0x00, 0x00, 0x1e, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0d, 0x02, 0x01, 0x00, 0x00, 0x1e, 0x0c, 0x00, 0x01, 0x00, 0x00, 0x23, 0x0d, 0x3c, 0x00, 0xf8, 0x8d, 0x01, 0x00, 0x02, 0x01, 0x00, 0x00, 0x1d, 0x0d, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0xfb, 0x6d, 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x34, 0x8e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x70, 0x8e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xac, 0x8e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0x8e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x24, 0x8f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x60, 0x8f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x8f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0x8f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x14, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x50, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x8c, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x04, 0x91, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x40, 0x91, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x7c, 0x91, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0x91, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf4, 0x91, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x30, 0x92, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x6c, 0x92, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0x92, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0x92, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x20, 0x93, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x5c, 0x93, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0x93, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd4, 0x93, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x10, 0x94, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x4c, 0x94, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0x94, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc4, 0x94, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x95, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0x95, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0x95, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb4, 0x95, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf0, 0x95, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x2c, 0x96, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0x96, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa4, 0x96, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe0, 0x96, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0x97, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0x97, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x94, 0x97, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd0, 0x97, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x98, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0x98, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x84, 0x98, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0x98, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xfc, 0x98, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x99, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x74, 0x99, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb0, 0x99, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xec, 0x99, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0x9a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x64, 0x9a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa0, 0x9a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xdc, 0x9a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0x9b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x54, 0x9b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x90, 0x9b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xcc, 0x9b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0x9c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x44, 0x9c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x80, 0x9c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xbc, 0x9c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x9c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x34, 0x9d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x70, 0x9d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xac, 0x9d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0x9d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x24, 0x9e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x60, 0x9e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x9e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0x9e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x14, 0x9f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x50, 0x9f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x8c, 0x9f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0x9f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x04, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x40, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf4, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x30, 0xa1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xa1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xa1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0xa1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x20, 0xa2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xa2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xa2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd4, 0xa2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x10, 0xa3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xa3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xa3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc4, 0xa3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xa4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xa4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xa4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb4, 0xa4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf0, 0xa4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xa5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0xa5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa4, 0xa5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe0, 0xa5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0xa6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xa6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x94, 0xa6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd0, 0xa6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xa7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0xa7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x84, 0xa7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0xa7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xfc, 0xa7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0xa8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x74, 0xa8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb0, 0xa8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xec, 0xa8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0xa9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x64, 0xa9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa0, 0xa9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xdc, 0xa9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0xaa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x54, 0xaa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x90, 0xaa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xcc, 0xaa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0xab, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x44, 0xab, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x80, 0xab, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xbc, 0xab, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0xab, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x34, 0xac, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x70, 0xac, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xac, 0xac, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xac, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x24, 0xad, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x60, 0xad, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x9c, 0xad, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0xad, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x14, 0xae, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x50, 0xae, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x8c, 0xae, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0xae, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x04, 0xaf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x40, 0xaf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xaf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xaf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf4, 0xaf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x30, 0xb0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xb0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xb0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0xb0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x20, 0xb1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xb1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xb1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd4, 0xb1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x10, 0xb2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xb2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xb2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc4, 0xb2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xb3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xb3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xb3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb4, 0xb3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf0, 0xb3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xb4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0xb4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa4, 0xb4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe0, 0xb4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0xb5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xb5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x94, 0xb5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd0, 0xb5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xb6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0xb6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x84, 0xb6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0xb6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xfc, 0xb6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0xb7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x74, 0xb7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb0, 0xb7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xec, 0xb7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0xb8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x64, 0xb8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa0, 0xb8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xdc, 0xb8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0xb9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x54, 0xb9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x90, 0xb9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xcc, 0xb9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0xba, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x44, 0xba, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x80, 0xba, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xbc, 0xba, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0xba, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x34, 0xbb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x70, 0xbb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xac, 0xbb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xbb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x24, 0xbc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x60, 0xbc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x9c, 0xbc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0xbc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x14, 0xbd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x50, 0xbd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x8c, 0xbd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0xbd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x04, 0xbe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x40, 0xbe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xbe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xbe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf4, 0xbe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x30, 0xbf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xbf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xbf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0xbf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x20, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd4, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x10, 0xc1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xc1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xc1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc4, 0xc1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb4, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf0, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xc3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0xc3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa4, 0xc3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe0, 0xc3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0xc4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xc4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x94, 0xc4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd0, 0xc4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xc5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0xc5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x84, 0xc5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0xc5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xfc, 0xc5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0xc6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x74, 0xc6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb0, 0xc6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xec, 0xc6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0xc7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x64, 0xc7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa0, 0xc7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xdc, 0xc7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0xc8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x54, 0xc8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x90, 0xc8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xcc, 0xc8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0xc9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x44, 0xc9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x80, 0xc9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xbc, 0xc9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0xc9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x34, 0xca, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x70, 0xca, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xac, 0xca, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xca, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x24, 0xcb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x60, 0xcb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x9c, 0xcb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0xcb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x14, 0xcc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x50, 0xcc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x8c, 0xcc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0xcc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x04, 0xcd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x40, 0xcd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xcd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xcd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf4, 0xcd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x30, 0xce, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xce, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xce, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0xce, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x20, 0xcf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xcf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xcf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd4, 0xcf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x10, 0xd0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xd0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xd0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc4, 0xd0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xd1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xd1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xd1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb4, 0xd1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf0, 0xd1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xd2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0xd2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa4, 0xd2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe0, 0xd2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0xd3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xd3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x94, 0xd3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd0, 0xd3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x84, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xfc, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x74, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb0, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xec, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0xd6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x64, 0xd6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa0, 0xd6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xdc, 0xd6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0xd7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x54, 0xd7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x90, 0xd7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xcc, 0xd7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0xd8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x44, 0xd8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x80, 0xd8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xbc, 0xd8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0xd8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x34, 0xd9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x70, 0xd9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xac, 0xd9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xd9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x24, 0xda, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x60, 0xda, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x9c, 0xda, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0xda, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x14, 0xdb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x50, 0xdb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x8c, 0xdb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0xdb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x04, 0xdc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x40, 0xdc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xdc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xdc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf4, 0xdc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x30, 0xdd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xdd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xdd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0xdd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x20, 0xde, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xde, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xde, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd4, 0xde, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x10, 0xdf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xdf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xdf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc4, 0xdf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb4, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf0, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xe1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0xe1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa4, 0xe1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe0, 0xe1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0xe2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xe2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x94, 0xe2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd0, 0xe2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xe3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0xe3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x84, 0xe3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0xe3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xfc, 0xe3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0xe4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x74, 0xe4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb0, 0xe4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xec, 0xe4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0xe5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x64, 0xe5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa0, 0xe5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xdc, 0xe5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0xe6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x54, 0xe6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x90, 0xe6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xcc, 0xe6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0xe7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x44, 0xe7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x80, 0xe7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xbc, 0xe7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0xe7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x34, 0xe8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x70, 0xe8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xac, 0xe8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xe8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x24, 0xe9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x60, 0xe9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x9c, 0xe9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0xe9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x14, 0xea, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x50, 0xea, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x8c, 0xea, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0xea, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x04, 0xeb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x40, 0xeb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xeb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xeb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf4, 0xeb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x30, 0xec, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xec, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xec, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0xec, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x20, 0xed, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xed, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xed, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd4, 0xed, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x10, 0xee, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xee, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xee, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc4, 0xee, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xef, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xef, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xef, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb4, 0xef, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf0, 0xef, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa4, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe0, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x1c, 0xf1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xf1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x94, 0xf1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd0, 0xf1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xf2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0xf2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x84, 0xf2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0xf2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xfc, 0xf2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0xf3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x74, 0xf3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb0, 0xf3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xec, 0xf3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0xf4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x64, 0xf4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa0, 0xf4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xdc, 0xf4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0xf5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x54, 0xf5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x90, 0xf5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xcc, 0xf5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0xf6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x44, 0xf6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x80, 0xf6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xbc, 0xf6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0xf6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x34, 0xf7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x70, 0xf7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xac, 0xf7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xf7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x24, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x60, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x9c, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x14, 0xf9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x50, 0xf9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x8c, 0xf9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0xf9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x04, 0xfa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x40, 0xfa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xfa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xfa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf4, 0xfa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x30, 0xfb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xfb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xfb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe4, 0xfb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x20, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd4, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x10, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc4, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb4, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf0, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x68, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x10, 0x04, 0x00, 0x70, 0xb5, 0x2b, 0x48, 0x06, 0x21, 0x81, 0x75, 0xc1, 0x75, 0x01, 0x7e, 0x49, 0x08, 0x49, 0x00, 0x01, 0x76, 0x01, 0x7e, 0x02, 0x22, 0x91, 0x43, 0x01, 0x76, 0x26, 0x49, 0x0b, 0x78, 0x5b, 0x08, 0x5b, 0x00, 0x0b, 0x70, 0x04, 0x23, 0x8b, 0x70, 0x0c, 0x23, 0x43, 0x76, 0x20, 0x23, 0x03, 0x75, 0x1a, 0x24, 0x44, 0x75, 0x24, 0x24, 0x84, 0x76, 0x10, 0x24, 0xc4, 0x76, 0x3c, 0x00, 0x3c, 0x10, 0x04, 0x00, 0x2a, 0x25, 0x4d, 0x70, 0x05, 0x7a, 0x30, 0x26, 0xb5, 0x43, 0x20, 0x35, 0x05, 0x72, 0x85, 0x7a, 0x6d, 0x08, 0x6d, 0x00, 0x85, 0x72, 0x85, 0x7a, 0x95, 0x43, 0x85, 0x72, 0x85, 0x7a, 0x04, 0x26, 0x35, 0x43, 0x85, 0x72, 0x85, 0x7a, 0x08, 0x26, 0x35, 0x43, 0x85, 0x72, 0x85, 0x7a, 0xa5, 0x43, 0x85, 0x72, 0x05, 0x7b, 0x2c, 0x43, 0x04, 0x73, 0x04, 0x7b, 0x1c, 0x43, 0x3c, 0x00, 0x78, 0x10, 0x04, 0x00, 0x04, 0x73, 0x04, 0x7b, 0x40, 0x25, 0x2c, 0x43, 0x04, 0x73, 0x84, 0x7a, 0x23, 0x43, 0x83, 0x72, 0x83, 0x7a, 0xab, 0x43, 0x83, 0x72, 0x03, 0x7b, 0x80, 0x24, 0x23, 0x43, 0x03, 0x73, 0x08, 0x78, 0x90, 0x43, 0x08, 0x70, 0x08, 0x78, 0x01, 0x22, 0x10, 0x43, 0x08, 0x70, 0x08, 0x78, 0x04, 0x22, 0x90, 0x43, 0x08, 0x70, 0x70, 0xbd, 0x00, 0x00, 0x0c, 0x80, 0x07, 0x00, 0x3c, 0x00, 0xb4, 0x10, 0x04, 0x00, 0x80, 0x80, 0x07, 0x00, 0x01, 0x49, 0x04, 0x20, 0x48, 0x73, 0x70, 0x47, 0x40, 0x80, 0x07, 0x00, 0x03, 0x49, 0x80, 0xb5, 0x00, 0x20, 0x08, 0x80, 0x00, 0xf0, 0x0a, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xfc, 0x6b, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x67, 0xfb, 0x80, 0xbd, 0x80, 0xb5, 0x0a, 0x49, 0x18, 0x20, 0xc1, 0xf7, 0x3b, 0xfa, 0x09, 0x49, 0x3c, 0x00, 0xf0, 0x10, 0x04, 0x00, 0x02, 0x20, 0xc1, 0xf7, 0x37, 0xfa, 0x08, 0x49, 0x1f, 0x20, 0xc1, 0xf7, 0x33, 0xfa, 0x07, 0x49, 0x1c, 0x20, 0xc1, 0xf7, 0x2f, 0xfa, 0x06, 0x49, 0x03, 0x20, 0xc1, 0xf7, 0x2b, 0xfa, 0x80, 0xbd, 0x99, 0x2a, 0x00, 0x00, 0x41, 0x25, 0x00, 0x00, 0x55, 0x25, 0x00, 0x00, 0x5d, 0x25, 0x00, 0x00, 0x39, 0x25, 0x00, 0x00, 0x80, 0xb5, 0xbf, 0xf7, 0x91, 0xfd, 0x80, 0xbd, 0x3c, 0x00, 0x2c, 0x11, 0x04, 0x00, 0x80, 0xb5, 0x05, 0x4a, 0x05, 0x49, 0x0a, 0x20, 0xbf, 0xf7, 0x4e, 0xff, 0x01, 0x20, 0x04, 0x49, 0x80, 0x02, 0x08, 0x60, 0x48, 0x60, 0x80, 0xbd, 0xb4, 0x74, 0x01, 0x00, 0xb1, 0x64, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x91, 0xfe, 0x80, 0xbd, 0x80, 0xb5, 0x05, 0x4a, 0x05, 0x49, 0x1b, 0x20, 0xbf, 0xf7, 0x38, 0xff, 0x01, 0x20, 0x04, 0x49, 0x3c, 0x00, 0x68, 0x11, 0x04, 0x00, 0xc0, 0x06, 0x08, 0x60, 0x48, 0x60, 0x80, 0xbd, 0xb8, 0x74, 0x01, 0x00, 0x2d, 0x6e, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x80, 0xb5, 0x04, 0x48, 0x00, 0xf0, 0x80, 0xfe, 0x03, 0x49, 0x00, 0x20, 0x48, 0x60, 0x88, 0x60, 0x80, 0xbd, 0x00, 0x00, 0x41, 0x4b, 0x00, 0x00, 0xbc, 0x74, 0x01, 0x00, 0x80, 0xb5, 0xc5, 0xf7, 0xd5, 0xfe, 0xce, 0xf7, 0xd9, 0xf8, 0x03, 0x49, 0x3c, 0x00, 0xa4, 0x11, 0x04, 0x00, 0x08, 0x60, 0x03, 0x49, 0x0a, 0x20, 0xd1, 0xf7, 0xef, 0xf8, 0x80, 0xbd, 0xbc, 0x74, 0x01, 0x00, 0x49, 0x6e, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x22, 0x20, 0x21, 0x06, 0x20, 0xc8, 0xf7, 0x56, 0xfc, 0xbf, 0xf7, 0x70, 0xfe, 0x03, 0x49, 0x00, 0x20, 0x08, 0x60, 0x20, 0x21, 0x02, 0x48, 0xbf, 0xf7, 0x63, 0xf9, 0x80, 0xbd, 0xcc, 0x5c, 0x01, 0x00, 0x64, 0x6d, 0x01, 0x00, 0x3c, 0x00, 0xe0, 0x11, 0x04, 0x00, 0x08, 0x48, 0x80, 0xb5, 0x00, 0x68, 0x00, 0x28, 0x05, 0xd0, 0x06, 0x48, 0x54, 0x30, 0x42, 0x6a, 0x00, 0x21, 0xbf, 0xf7, 0xf3, 0xf8, 0x04, 0x4a, 0x04, 0x49, 0x03, 0x20, 0xbf, 0xf7, 0xac, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0x50, 0x6d, 0x01, 0x00, 0x89, 0x98, 0x00, 0x00, 0x91, 0x98, 0x00, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x03, 0xf8, 0x00, 0xf0, 0x19, 0xf8, 0x80, 0xbd, 0x3c, 0x00, 0x1c, 0x12, 0x04, 0x00, 0x10, 0xb5, 0x09, 0x4c, 0x60, 0x21, 0x20, 0x1c, 0xbf, 0xf7, 0x3a, 0xf9, 0x00, 0x20, 0xc0, 0x43, 0xa0, 0x60, 0x20, 0x60, 0xff, 0x20, 0x02, 0x30, 0xe0, 0x84, 0x20, 0x22, 0x20, 0x1c, 0x40, 0x30, 0x02, 0x49, 0xbf, 0xf7, 0x5b, 0xf9, 0x10, 0xbd, 0x00, 0x10, 0x07, 0x00, 0x70, 0x52, 0x01, 0x00, 0x00, 0x20, 0x0a, 0x49, 0xc0, 0x43, 0x88, 0x60, 0x09, 0x4b, 0x0a, 0x49, 0x3c, 0x00, 0x58, 0x12, 0x04, 0x00, 0x00, 0x20, 0x82, 0x00, 0x01, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x20, 0x28, 0x99, 0x50, 0xf8, 0xd3, 0x06, 0x49, 0x04, 0x4a, 0x08, 0x1c, 0x10, 0x30, 0x08, 0x3a, 0x03, 0xc2, 0x70, 0x47, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0xe0, 0x7e, 0x01, 0x00, 0x75, 0x75, 0x00, 0x00, 0x00, 0xa0, 0x07, 0x00, 0x04, 0x48, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x0e, 0xc0, 0x0c, 0x38, 0x3c, 0x00, 0x94, 0x12, 0x04, 0x00, 0x01, 0x21, 0x41, 0x60, 0x70, 0x47, 0x00, 0x00, 0x70, 0x78, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x03, 0x48, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x0e, 0xc0, 0x08, 0xc0, 0x70, 0x47, 0x00, 0x00, 0x88, 0x5a, 0x01, 0x00, 0x04, 0x49, 0x80, 0xb5, 0x00, 0x20, 0x48, 0x61, 0x02, 0x48, 0x40, 0x21, 0x1c, 0x30, 0xbf, 0xf7, 0xe9, 0xf8, 0x80, 0xbd, 0xfc, 0x5a, 0x01, 0x00, 0x3c, 0x00, 0xd0, 0x12, 0x04, 0x00, 0x80, 0xb5, 0xce, 0xf7, 0x3f, 0xf8, 0x03, 0x49, 0x88, 0x61, 0x03, 0x49, 0x03, 0x20, 0xd1, 0xf7, 0x55, 0xf8, 0x80, 0xbd, 0xfc, 0x5a, 0x01, 0x00, 0x0d, 0x17, 0x01, 0x00, 0x80, 0xb5, 0xc0, 0xf7, 0xa5, 0xf9, 0x80, 0xbd, 0xfe, 0xb5, 0x6c, 0x49, 0x00, 0x20, 0x00, 0x90, 0xc8, 0x78, 0x6b, 0x4c, 0x6b, 0x4f, 0x43, 0x07, 0xc0, 0x06, 0xc0, 0x17, 0xdb, 0x0e, 0xe3, 0x58, 0x3c, 0x00, 0x0c, 0x13, 0x04, 0x00, 0x01, 0x30, 0x38, 0x62, 0x3b, 0x61, 0x08, 0x1c, 0x80, 0x78, 0x66, 0x4e, 0x03, 0x22, 0x41, 0x07, 0xa0, 0x36, 0x02, 0x96, 0x49, 0x0f, 0x31, 0x72, 0x89, 0x00, 0x61, 0x58, 0x3c, 0x1c, 0x61, 0x61, 0x01, 0x91, 0xc0, 0x06, 0xc0, 0x0f, 0x78, 0x62, 0x20, 0x1c, 0x00, 0x27, 0x87, 0x61, 0x00, 0x20, 0x21, 0x1c, 0xc8, 0x61, 0x59, 0x48, 0x59, 0x49, 0x00, 0x78, 0x09, 0x79, 0x3c, 0x00, 0x48, 0x13, 0x04, 0x00, 0x5a, 0x4c, 0x4e, 0x07, 0x76, 0x0f, 0x71, 0x1c, 0x8c, 0x46, 0xb1, 0x00, 0x8e, 0x46, 0x56, 0x49, 0x80, 0x31, 0x00, 0x28, 0x24, 0xd0, 0x52, 0x4f, 0x01, 0x28, 0x7f, 0x78, 0x1a, 0xd0, 0x02, 0x28, 0x71, 0xd1, 0x4f, 0x48, 0x00, 0x2f, 0x0c, 0xd0, 0x01, 0x2f, 0x6c, 0xd1, 0x40, 0x79, 0x4d, 0x4d, 0x40, 0x07, 0x40, 0x0f, 0x82, 0x00, 0xaa, 0x58, 0x4b, 0x4d, 0x01, 0x30, 0x3c, 0x00, 0x84, 0x13, 0x04, 0x00, 0xea, 0x61, 0xa0, 0x73, 0x04, 0x22, 0x4b, 0x48, 0x48, 0x4d, 0xc8, 0x61, 0x4a, 0x48, 0x00, 0x2f, 0x00, 0xd0, 0x4a, 0x48, 0x2f, 0x1c, 0x11, 0xe0, 0x42, 0x48, 0x00, 0x2f, 0x55, 0xd1, 0x07, 0x70, 0x02, 0x27, 0x47, 0x70, 0x3f, 0x48, 0x40, 0x78, 0x00, 0x28, 0x10, 0xd0, 0x01, 0x28, 0x01, 0xd0, 0x02, 0x28, 0x4a, 0xd1, 0x3f, 0x48, 0x3d, 0x4f, 0xc8, 0x61, 0x3f, 0x48, 0x3c, 0x00, 0xc0, 0x13, 0x04, 0x00, 0x88, 0x61, 0x3a, 0x49, 0x70, 0x46, 0x08, 0x58, 0x35, 0x1c, 0xb8, 0x61, 0x60, 0x46, 0x60, 0x73, 0x04, 0xe0, 0x3c, 0x48, 0x02, 0x22, 0x88, 0x61, 0x3b, 0x48, 0xc8, 0x61, 0x00, 0x20, 0x32, 0x49, 0x06, 0xe0, 0x0e, 0x18, 0xb6, 0x78, 0x76, 0x07, 0x76, 0x0f, 0x04, 0x2e, 0x2f, 0xd8, 0x01, 0x30, 0x90, 0x42, 0xf6, 0xd3, 0xc8, 0x79, 0x2e, 0x4f, 0xc0, 0x07, 0xc0, 0x0f, 0x3c, 0x00, 0xfc, 0x13, 0x04, 0x00, 0xf8, 0x60, 0x33, 0x48, 0x41, 0x68, 0x19, 0x43, 0x41, 0x60, 0x81, 0x68, 0x19, 0x43, 0x81, 0x60, 0x01, 0x9a, 0xb9, 0x69, 0x8c, 0x46, 0x11, 0x43, 0xfa, 0x69, 0x86, 0x68, 0x11, 0x43, 0x8e, 0x43, 0x86, 0x60, 0x46, 0x68, 0x31, 0x43, 0x41, 0x60, 0x01, 0x99, 0x0b, 0x43, 0x18, 0x1c, 0x61, 0x46, 0x08, 0x43, 0x10, 0x43, 0x01, 0x1c, 0x00, 0x22, 0x02, 0x20, 0xc7, 0xf7, 0x3c, 0x00, 0x38, 0x14, 0x04, 0x00, 0x03, 0xfa, 0x1e, 0x4e, 0x40, 0x3e, 0x70, 0x78, 0xc0, 0x08, 0xc0, 0x00, 0x28, 0x43, 0x70, 0x70, 0x70, 0x1c, 0x01, 0x78, 0x00, 0xe0, 0x29, 0xe0, 0x08, 0x25, 0xa9, 0x43, 0x01, 0x70, 0x01, 0x20, 0xc0, 0x43, 0xb0, 0x80, 0x00, 0x21, 0x01, 0x20, 0xcf, 0xf7, 0x6c, 0xfc, 0x30, 0x1c, 0x80, 0x30, 0x81, 0x78, 0x09, 0x09, 0x09, 0x01, 0x81, 0x70, 0x0f, 0x21, 0x01, 0x70, 0x3c, 0x00, 0x74, 0x14, 0x04, 0x00, 0x16, 0x4a, 0x69, 0x04, 0x11, 0x60, 0x51, 0x60, 0x02, 0x9e, 0x10, 0x21, 0x32, 0x7a, 0x7b, 0x6a, 0x00, 0x2b, 0x00, 0xd1, 0x00, 0x21, 0x11, 0x43, 0x21, 0x73, 0x81, 0x78, 0x29, 0x43, 0x81, 0x70, 0xe0, 0x78, 0x01, 0x21, 0x08, 0x43, 0xe0, 0x70, 0xd2, 0xf7, 0xf2, 0xf9, 0x01, 0x20, 0x00, 0x90, 0x00, 0x98, 0xfe, 0xbd, 0xc0, 0x57, 0x01, 0x00, 0x6c, 0x43, 0x01, 0x00, 0x3c, 0x00, 0xb0, 0x14, 0x04, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x40, 0x90, 0x07, 0x00, 0xc9, 0x1d, 0x00, 0x00, 0x81, 0x1d, 0x00, 0x00, 0xa5, 0x1d, 0x00, 0x00, 0x99, 0x1d, 0x00, 0x00, 0xf1, 0x1d, 0x00, 0x00, 0x10, 0x00, 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0x03, 0x49, 0x00, 0x20, 0x88, 0x62, 0x08, 0x70, 0x48, 0x70, 0x08, 0x71, 0x08, 0x62, 0x70, 0x47, 0xac, 0x7e, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x21, 0x3c, 0x00, 0xec, 0x14, 0x04, 0x00, 0x00, 0x20, 0xcd, 0xf7, 0x69, 0xff, 0x80, 0xbd, 0xb0, 0xb5, 0x0f, 0x48, 0xc0, 0xf7, 0x18, 0xfc, 0x0e, 0x4d, 0x03, 0x20, 0x28, 0x70, 0x0d, 0x49, 0x0d, 0x48, 0x0c, 0x39, 0x48, 0x60, 0x0d, 0x48, 0x0a, 0x4c, 0x88, 0x60, 0x40, 0x21, 0x18, 0x34, 0x20, 0x1c, 0xbe, 0xf7, 0xc1, 0xff, 0xff, 0x21, 0x68, 0x68, 0x09, 0x06, 0x08, 0x43, 0x20, 0x60, 0xff, 0x21, 0x06, 0x22, 0x3c, 0x00, 0x28, 0x15, 0x04, 0x00, 0x20, 0x1d, 0xbf, 0xf7, 0x79, 0xf8, 0x01, 0x20, 0xe0, 0x60, 0xb0, 0xbd, 0xc0, 0xa8, 0x13, 0x0a, 0x20, 0x6e, 0x01, 0x00, 0xc0, 0xa8, 0x13, 0x01, 0xff, 0xff, 0xff, 0x00, 0x80, 0xb5, 0x02, 0x49, 0x01, 0x20, 0xc8, 0xf7, 0x45, 0xff, 0x80, 0xbd, 0x9d, 0x1c, 0x00, 0x00, 0x98, 0xb5, 0x0c, 0x4c, 0x00, 0x20, 0x60, 0x60, 0xe0, 0x60, 0x0b, 0x4b, 0x0b, 0x49, 0x82, 0x00, 0x3c, 0x00, 0x64, 0x15, 0x04, 0x00, 0x01, 0x30, 0x20, 0x28, 0x99, 0x50, 0xfa, 0xdb, 0x6a, 0x46, 0x09, 0x49, 0x05, 0x20, 0xbf, 0xf7, 0x2f, 0xfd, 0x00, 0x20, 0xc0, 0x43, 0x20, 0x60, 0x06, 0x49, 0x20, 0x20, 0x08, 0x60, 0x48, 0x60, 0x98, 0xbd, 0x00, 0x00, 0x00, 0x40, 0x07, 0x00, 0x30, 0x74, 0x01, 0x00, 0xa9, 0x75, 0x00, 0x00, 0xb5, 0x9f, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x05, 0x49, 0x00, 0x20, 0x3c, 0x00, 0xa0, 0x15, 0x04, 0x00, 0x08, 0x60, 0x05, 0x48, 0x81, 0x78, 0x28, 0x22, 0x91, 0x43, 0x81, 0x70, 0x81, 0x78, 0x11, 0x43, 0x81, 0x70, 0x70, 0x47, 0x78, 0x6e, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x70, 0x47, 0x00, 0x00, 0x41, 0x48, 0x10, 0xb5, 0x00, 0x68, 0x02, 0x21, 0x88, 0x43, 0x3f, 0x49, 0x08, 0x60, 0x08, 0x1c, 0x00, 0x68, 0x02, 0x21, 0x08, 0x43, 0x3c, 0x49, 0x08, 0x60, 0x3c, 0x48, 0x3c, 0x00, 0xdc, 0x15, 0x04, 0x00, 0x40, 0x68, 0x80, 0x21, 0x88, 0x43, 0x3a, 0x49, 0x48, 0x60, 0x08, 0x1c, 0x00, 0x68, 0x80, 0x21, 0x08, 0x43, 0x37, 0x49, 0x08, 0x60, 0x37, 0x48, 0x01, 0x7a, 0x01, 0x24, 0x21, 0x43, 0x01, 0x72, 0x01, 0x7a, 0x02, 0x22, 0x11, 0x43, 0x01, 0x72, 0x01, 0x7a, 0x04, 0x22, 0x91, 0x43, 0x01, 0x72, 0x01, 0x7a, 0x08, 0x22, 0x11, 0x43, 0x01, 0x72, 0x01, 0x7b, 0x21, 0x43, 0x3c, 0x00, 0x18, 0x16, 0x04, 0x00, 0x01, 0x73, 0x01, 0x7b, 0x02, 0x22, 0x11, 0x43, 0x01, 0x73, 0x01, 0x7b, 0x04, 0x22, 0x11, 0x43, 0x01, 0x73, 0x01, 0x7b, 0x08, 0x22, 0x11, 0x43, 0x01, 0x73, 0x2e, 0x21, 0x41, 0x73, 0x81, 0x7b, 0x38, 0x22, 0x91, 0x43, 0x28, 0x31, 0x81, 0x73, 0x20, 0x21, 0x41, 0x74, 0x81, 0x7b, 0xc9, 0x08, 0xc9, 0x00, 0x03, 0x31, 0x81, 0x73, 0x22, 0x21, 0xc1, 0x73, 0x20, 0x49, 0x3c, 0x00, 0x54, 0x16, 0x04, 0x00, 0x09, 0x7a, 0x41, 0x72, 0x1e, 0x49, 0x49, 0x7a, 0x01, 0x74, 0x3c, 0x22, 0x02, 0x77, 0x01, 0x1c, 0x10, 0x31, 0x4a, 0x73, 0x50, 0x23, 0x8b, 0x73, 0x5a, 0x23, 0xcb, 0x73, 0x0d, 0x23, 0x01, 0x1c, 0x20, 0x31, 0x0b, 0x70, 0x17, 0x4b, 0x43, 0x84, 0x0e, 0x23, 0x4b, 0x70, 0x00, 0x21, 0x41, 0x82, 0x30, 0x21, 0x01, 0x70, 0x05, 0x21, 0x41, 0x70, 0x04, 0x21, 0x41, 0x71, 0x3c, 0x00, 0x90, 0x16, 0x04, 0x00, 0x84, 0x71, 0xc4, 0x71, 0x0c, 0x21, 0x01, 0x71, 0xf8, 0x21, 0x41, 0x80, 0x0f, 0x49, 0xca, 0x72, 0x8a, 0x72, 0x03, 0x22, 0x0a, 0x72, 0x09, 0x22, 0x4a, 0x72, 0x08, 0x22, 0x0a, 0x73, 0x02, 0x7a, 0x40, 0x23, 0x1a, 0x43, 0x02, 0x72, 0x4c, 0x73, 0xff, 0xf7, 0xa2, 0xfc, 0x08, 0x48, 0x01, 0x78, 0x21, 0x43, 0x01, 0x70, 0x10, 0xbd, 0x00, 0x00, 0xf0, 0x00, 0x07, 0x00, 0x3c, 0x00, 0xcc, 0x16, 0x04, 0x00, 0xf4, 0x00, 0x07, 0x00, 0x0c, 0x80, 0x07, 0x00, 0x76, 0x46, 0x01, 0x00, 0x24, 0x09, 0x00, 0x00, 0x80, 0x80, 0x07, 0x00, 0xa0, 0x80, 0x07, 0x00, 0x80, 0xb5, 0x18, 0x21, 0x09, 0x48, 0xbe, 0xf7, 0xd7, 0xfe, 0x08, 0x48, 0x00, 0x21, 0x3c, 0x38, 0x41, 0x60, 0x81, 0x60, 0xc1, 0x60, 0x01, 0x61, 0x41, 0x61, 0x81, 0x61, 0x01, 0x21, 0x01, 0x62, 0xff, 0xf7, 0x5c, 0xff, 0x3c, 0x00, 0x08, 0x17, 0x04, 0x00, 0xc0, 0xf7, 0x6c, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x24, 0x7e, 0x01, 0x00, 0xb0, 0xb5, 0x21, 0x48, 0x00, 0x68, 0x40, 0x08, 0x1f, 0x49, 0x40, 0x00, 0x08, 0x60, 0x08, 0x1c, 0x00, 0x68, 0x01, 0x21, 0x08, 0x43, 0x1c, 0x49, 0x08, 0x60, 0x1c, 0x4a, 0x10, 0x79, 0x01, 0x21, 0x08, 0x43, 0x10, 0x71, 0x10, 0x79, 0x02, 0x21, 0x88, 0x43, 0x10, 0x71, 0x00, 0xf0, 0x6c, 0xf8, 0x3c, 0x00, 0x44, 0x17, 0x04, 0x00, 0x10, 0x7a, 0x01, 0x21, 0x08, 0x43, 0x10, 0x72, 0x10, 0x7a, 0xfe, 0x21, 0x88, 0x43, 0x0a, 0x30, 0x10, 0x72, 0x28, 0x20, 0x90, 0x72, 0x5a, 0x20, 0xd0, 0x72, 0x11, 0x4d, 0x14, 0x20, 0x28, 0x77, 0x2c, 0x1c, 0x10, 0x34, 0xa0, 0x73, 0x16, 0x20, 0xa8, 0x75, 0x18, 0x20, 0xe8, 0x75, 0xff, 0xf7, 0xa1, 0xfc, 0x0c, 0x48, 0x68, 0x86, 0xe0, 0x7b, 0x40, 0x06, 0x40, 0x0e, 0x3c, 0x00, 0x80, 0x17, 0x04, 0x00, 0x0e, 0x21, 0x08, 0x43, 0xe0, 0x73, 0xe0, 0x7b, 0x80, 0x21, 0x08, 0x43, 0xe0, 0x73, 0x07, 0x48, 0x41, 0x79, 0x04, 0x22, 0x11, 0x43, 0x41, 0x71, 0xb0, 0xbd, 0x00, 0x00, 0xf0, 0x00, 0x07, 0x00, 0x00, 0x80, 0x07, 0x00, 0x30, 0x80, 0x07, 0x00, 0xff, 0x01, 0x00, 0x00, 0x50, 0x00, 0x07, 0x00, 0x80, 0xb5, 0xff, 0xf7, 0xaf, 0xff, 0x00, 0x20, 0x14, 0x49, 0xc0, 0x43, 0x3c, 0x00, 0xbc, 0x17, 0x04, 0x00, 0x88, 0x60, 0xc1, 0xf7, 0x0b, 0xf9, 0x13, 0x49, 0x00, 0x20, 0x48, 0x62, 0xc8, 0x60, 0x48, 0x61, 0x08, 0x61, 0x88, 0x61, 0xc8, 0x61, 0x0f, 0x4b, 0x08, 0x62, 0x0f, 0x4a, 0x08, 0x63, 0x38, 0x33, 0x1a, 0x80, 0x01, 0x22, 0x5a, 0x71, 0x0b, 0x4a, 0x40, 0x32, 0xd0, 0x60, 0x13, 0x60, 0x08, 0x23, 0x13, 0x81, 0x50, 0x60, 0x09, 0x4a, 0x8a, 0x62, 0xff, 0x22, 0x0a, 0x70, 0x3c, 0x00, 0xf8, 0x17, 0x04, 0x00, 0x48, 0x70, 0x05, 0x48, 0x00, 0x21, 0x00, 0x22, 0x50, 0x30, 0x00, 0x23, 0x0e, 0xc0, 0xc1, 0xf7, 0xff, 0xf8, 0x80, 0xbd, 0x00, 0x30, 0x07, 0x00, 0x04, 0x6c, 0x01, 0x00, 0xbe, 0xba, 0x00, 0x00, 0x85, 0x75, 0x00, 0x00, 0x03, 0x48, 0x10, 0x21, 0x81, 0x71, 0x02, 0x21, 0xc1, 0x71, 0x30, 0x21, 0x41, 0x72, 0x70, 0x47, 0x00, 0x80, 0x07, 0x00, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0x34, 0x18, 0x04, 0x00, 0x00, 0xb5, 0xc1, 0xf7, 0xdb, 0xfb, 0x00, 0xbd, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0xcd, 0xf7, 0x87, 0xfd, 0x01, 0x49, 0x88, 0x60, 0x80, 0xbd, 0x50, 0xd9, 0x01, 0x00, 0x80, 0xb5, 0x06, 0x21, 0x05, 0x48, 0xbe, 0xf7, 0xfd, 0xfd, 0x04, 0x49, 0x00, 0x20, 0x04, 0x39, 0x08, 0x60, 0x00, 0xf0, 0x67, 0xf8, 0x00, 0xf0, 0x03, 0xf8, 0x80, 0xbd, 0xec, 0x67, 0x01, 0x00, 0x3c, 0x00, 0x70, 0x18, 0x04, 0x00, 0x10, 0xb5, 0x07, 0x4c, 0x2c, 0x21, 0x20, 0x1c, 0xbe, 0xf7, 0x10, 0xfe, 0x01, 0x20, 0x20, 0x70, 0x03, 0x49, 0x00, 0x20, 0x1c, 0x39, 0xc8, 0x60, 0x08, 0x61, 0x88, 0x61, 0x10, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x80, 0xb5, 0xcd, 0xf7, 0x5d, 0xfd, 0x09, 0x49, 0x88, 0x60, 0x09, 0x49, 0x08, 0x20, 0xd0, 0xf7, 0x73, 0xfd, 0x08, 0x49, 0x09, 0x20, 0xd0, 0xf7, 0x3c, 0x00, 0xac, 0x18, 0x04, 0x00, 0x6f, 0xfd, 0x07, 0x49, 0x11, 0x20, 0xd0, 0xf7, 0x6b, 0xfd, 0x06, 0x48, 0xc2, 0xf7, 0x74, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x21, 0x35, 0x00, 0x00, 0xa1, 0x38, 0x00, 0x00, 0x45, 0x34, 0x00, 0x00, 0xbd, 0x26, 0x01, 0x00, 0x80, 0xb5, 0x86, 0xb0, 0x0f, 0x48, 0xc4, 0xf7, 0x45, 0xf9, 0x00, 0xf0, 0x45, 0xf8, 0xff, 0xf7, 0xd7, 0xff, 0xff, 0xf7, 0x3c, 0x00, 0xe8, 0x18, 0x04, 0x00, 0xab, 0xff, 0x0c, 0x49, 0x03, 0x20, 0xd0, 0xf7, 0x4d, 0xfd, 0x0b, 0x48, 0x69, 0x46, 0x00, 0x90, 0x00, 0x20, 0x01, 0x90, 0x09, 0x48, 0x04, 0x90, 0x09, 0x48, 0x02, 0x90, 0x09, 0x48, 0x03, 0x90, 0x09, 0x48, 0x05, 0x90, 0x00, 0x20, 0xc4, 0xf7, 0xcf, 0xf8, 0x06, 0xb0, 0x80, 0xbd, 0x00, 0x00, 0xf4, 0x67, 0x01, 0x00, 0x45, 0x35, 0x00, 0x00, 0x95, 0x32, 0x00, 0x00, 0x3c, 0x00, 0x24, 0x19, 0x04, 0x00, 0xa0, 0x7d, 0x01, 0x00, 0xfd, 0x32, 0x00, 0x00, 0xcd, 0x31, 0x00, 0x00, 0x45, 0x7d, 0x01, 0x00, 0x10, 0xb5, 0xcd, 0xf7, 0xd5, 0xfc, 0x09, 0x48, 0x09, 0x4c, 0x30, 0x21, 0x60, 0x61, 0x08, 0x48, 0x74, 0x30, 0xbe, 0xf7, 0xa9, 0xfd, 0x00, 0x20, 0xa0, 0x62, 0x06, 0x49, 0x20, 0x61, 0xe1, 0x63, 0x60, 0x64, 0xa0, 0x64, 0x14, 0x21, 0x21, 0x65, 0x60, 0x62, 0x10, 0xbd, 0x3c, 0x00, 0x60, 0x19, 0x04, 0x00, 0xb9, 0x75, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x70, 0x17, 0x00, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x09, 0x20, 0x04, 0x4a, 0xd1, 0xf7, 0xe8, 0xfe, 0xcd, 0xf7, 0xec, 0xfc, 0x02, 0x49, 0x08, 0x63, 0x80, 0xbd, 0x00, 0x00, 0x39, 0x39, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x80, 0xb5, 0xac, 0x21, 0x03, 0x48, 0xbe, 0xf7, 0x83, 0xfd, 0x00, 0xf0, 0x51, 0xf8, 0x00, 0xf0, 0x3c, 0x00, 0x9c, 0x19, 0x04, 0x00, 0x49, 0xf8, 0x80, 0xbd, 0xa4, 0x6c, 0x01, 0x00, 0x08, 0xb5, 0x00, 0xf0, 0x4d, 0xf8, 0x00, 0xf0, 0x45, 0xf8, 0x00, 0x21, 0x16, 0x20, 0x18, 0x4a, 0xd1, 0xf7, 0xc8, 0xfe, 0x17, 0x4a, 0x04, 0x21, 0x10, 0x1c, 0x40, 0x30, 0x01, 0x70, 0x00, 0x21, 0x81, 0x70, 0x11, 0x21, 0xc1, 0x80, 0x14, 0x49, 0x01, 0x81, 0x10, 0x1c, 0x80, 0x30, 0xc1, 0x78, 0x08, 0x22, 0x91, 0x43, 0x3c, 0x00, 0xd8, 0x19, 0x04, 0x00, 0xc1, 0x70, 0xc1, 0x78, 0x11, 0x43, 0xc1, 0x70, 0x6a, 0x46, 0x0f, 0x49, 0x14, 0x20, 0xbf, 0xf7, 0xf5, 0xfa, 0x0e, 0x49, 0x07, 0x20, 0xd0, 0xf7, 0xcd, 0xfc, 0x0d, 0x49, 0x0f, 0x20, 0xd0, 0xf7, 0xc9, 0xfc, 0xcd, 0xf7, 0xab, 0xfc, 0x0b, 0x49, 0x08, 0x60, 0x0a, 0x48, 0x44, 0x38, 0x80, 0x68, 0x00, 0x28, 0x02, 0xd0, 0x00, 0x20, 0xc6, 0xf7, 0x6f, 0xf9, 0x08, 0xbd, 0x3c, 0x00, 0x14, 0x1a, 0x04, 0x00, 0xb5, 0x3b, 0x00, 0x00, 0x00, 0x90, 0x07, 0x00, 0xe7, 0xfd, 0x00, 0x00, 0x8d, 0x41, 0x00, 0x00, 0xcd, 0x48, 0x00, 0x00, 0xd9, 0x49, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x6f, 0xfc, 0x80, 0xbd, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x61, 0xfc, 0x80, 0xbd, 0x70, 0x47, 0x00, 0x00, 0xb0, 0xb5, 0x30, 0x21, 0x0c, 0x48, 0xbe, 0xf7, 0x3c, 0x00, 0x50, 0x1a, 0x04, 0x00, 0x25, 0xfd, 0x0b, 0x4c, 0x00, 0x25, 0x0a, 0x48, 0x84, 0x3c, 0x38, 0x22, 0x03, 0x21, 0x70, 0x38, 0x65, 0x60, 0xbe, 0xf7, 0xdd, 0xfd, 0x06, 0x48, 0x38, 0x22, 0x01, 0x21, 0x38, 0x38, 0xbe, 0xf7, 0xd7, 0xfd, 0x0e, 0x20, 0xa5, 0x60, 0x60, 0x70, 0x20, 0x70, 0x00, 0xf0, 0x1d, 0xf8, 0xb0, 0xbd, 0x94, 0x67, 0x01, 0x00, 0x04, 0x49, 0x00, 0xb5, 0x01, 0x20, 0x48, 0x60, 0x3c, 0x00, 0x8c, 0x1a, 0x04, 0x00, 0x88, 0x60, 0xc8, 0x60, 0xc3, 0xf7, 0xf8, 0xff, 0x00, 0xbd, 0x00, 0x00, 0xd4, 0x67, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x0a, 0x20, 0x02, 0x4a, 0xd1, 0xf7, 0x50, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x1d, 0x5a, 0x00, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x05, 0xf8, 0x80, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0xfd, 0xfb, 0x80, 0xbd, 0x80, 0xb5, 0x02, 0x49, 0x04, 0x20, 0xd0, 0xf7, 0x3c, 0x00, 0xc8, 0x1a, 0x04, 0x00, 0x61, 0xfc, 0x80, 0xbd, 0x65, 0x1f, 0x00, 0x00, 0x00, 0x21, 0x17, 0x48, 0xc9, 0x43, 0x80, 0xb5, 0x16, 0x4b, 0x01, 0x70, 0x18, 0x1c, 0x10, 0x22, 0x20, 0x30, 0x02, 0x71, 0x00, 0x22, 0x10, 0x33, 0x9a, 0x73, 0x42, 0x79, 0x04, 0x23, 0x1a, 0x43, 0x42, 0x71, 0x42, 0x79, 0x18, 0x23, 0x9a, 0x43, 0x08, 0x32, 0x42, 0x71, 0x08, 0x1c, 0xd7, 0xf7, 0x59, 0xf8, 0x00, 0x28, 0x3c, 0x00, 0x04, 0x1b, 0x04, 0x00, 0x03, 0xd1, 0x01, 0x21, 0x9a, 0x20, 0xbf, 0xf7, 0xcb, 0xfb, 0x50, 0x20, 0x09, 0x49, 0x50, 0x22, 0x0a, 0x60, 0xc8, 0x60, 0x88, 0x60, 0x48, 0x60, 0x08, 0x61, 0x01, 0x20, 0x48, 0x61, 0x00, 0x20, 0xd7, 0xf7, 0xd8, 0xf8, 0x04, 0x49, 0xff, 0x20, 0x08, 0x60, 0x80, 0xbd, 0xf4, 0x6b, 0x01, 0x00, 0x30, 0x00, 0x07, 0x00, 0x04, 0x02, 0x07, 0x00, 0xf4, 0x74, 0x01, 0x00, 0x3c, 0x00, 0x40, 0x1b, 0x04, 0x00, 0x80, 0xb5, 0xd7, 0xf7, 0xfb, 0xf8, 0x80, 0xbd, 0x10, 0xb5, 0xff, 0xf7, 0xab, 0xfb, 0xbf, 0xf7, 0xdd, 0xfb, 0x81, 0x48, 0xcd, 0xf7, 0x98, 0xfa, 0x00, 0x24, 0x23, 0x1c, 0x04, 0x22, 0x04, 0x21, 0x00, 0x20, 0x01, 0xf0, 0x39, 0xfa, 0x00, 0x28, 0x01, 0xd0, 0xbf, 0xf7, 0xc9, 0xfb, 0x23, 0x1c, 0x00, 0x22, 0xff, 0x21, 0x00, 0x20, 0x01, 0xf0, 0x2f, 0xfa, 0x00, 0x28, 0x3c, 0x00, 0x7c, 0x1b, 0x04, 0x00, 0x01, 0xd0, 0xbf, 0xf7, 0xbf, 0xfb, 0x23, 0x1c, 0x00, 0x22, 0xff, 0x21, 0x00, 0x20, 0x01, 0xf0, 0x25, 0xfa, 0x00, 0x28, 0x01, 0xd0, 0xbf, 0xf7, 0xb5, 0xfb, 0xc4, 0xf7, 0x27, 0xff, 0x70, 0x48, 0x84, 0x70, 0x6f, 0x49, 0x7f, 0x20, 0x88, 0x70, 0x6e, 0x49, 0x0c, 0x60, 0x03, 0x20, 0x08, 0x60, 0x6b, 0x48, 0x44, 0x70, 0x6c, 0x48, 0x04, 0x80, 0x69, 0x48, 0xc0, 0x78, 0x3c, 0x00, 0xb8, 0x1b, 0x04, 0x00, 0x08, 0x21, 0x08, 0x43, 0x67, 0x49, 0xc8, 0x70, 0x08, 0x1c, 0xc0, 0x78, 0x04, 0x21, 0x08, 0x43, 0x64, 0x49, 0xc8, 0x70, 0x01, 0xf0, 0x7e, 0xfa, 0xff, 0xf7, 0x7e, 0xff, 0xff, 0xf7, 0x2c, 0xfe, 0x01, 0xf0, 0x46, 0xfb, 0xff, 0xf7, 0x18, 0xfb, 0x01, 0xf0, 0x52, 0xfa, 0xff, 0xf7, 0x82, 0xfb, 0x5f, 0x48, 0xc1, 0x68, 0x10, 0x22, 0x91, 0x43, 0xc1, 0x60, 0x01, 0x69, 0x3c, 0x00, 0xf4, 0x1b, 0x04, 0x00, 0x5d, 0x4a, 0x11, 0x43, 0x01, 0x61, 0x01, 0x69, 0xd2, 0x0a, 0x91, 0x43, 0x01, 0x61, 0xc1, 0x68, 0x5a, 0x4a, 0x11, 0x43, 0xc1, 0x60, 0x81, 0x6a, 0x59, 0x4a, 0x11, 0x43, 0x81, 0x62, 0x00, 0xf0, 0x77, 0xf9, 0x01, 0xf0, 0x1f, 0xf8, 0x00, 0xf0, 0x93, 0xfa, 0x01, 0xf0, 0x99, 0xfb, 0x00, 0xf0, 0xf1, 0xff, 0x00, 0xf0, 0x99, 0xfc, 0x00, 0xf0, 0xdd, 0xfc, 0x00, 0xf0, 0x3c, 0x00, 0x30, 0x1c, 0x04, 0x00, 0x83, 0xfc, 0xff, 0xf7, 0xb3, 0xfc, 0x01, 0xf0, 0x31, 0xfa, 0x01, 0xf0, 0x71, 0xfa, 0xff, 0xf7, 0x87, 0xfa, 0xff, 0xf7, 0x9b, 0xfa, 0x01, 0x21, 0x01, 0x20, 0x4b, 0x4a, 0xd1, 0xf7, 0x7c, 0xfd, 0x01, 0x21, 0x02, 0x20, 0x49, 0x4a, 0xd1, 0xf7, 0x77, 0xfd, 0x02, 0x21, 0x03, 0x20, 0x48, 0x4a, 0xd1, 0xf7, 0x72, 0xfd, 0x02, 0x21, 0x04, 0x20, 0x46, 0x4a, 0xd1, 0xf7, 0x3c, 0x00, 0x6c, 0x1c, 0x04, 0x00, 0x6d, 0xfd, 0x02, 0x21, 0x05, 0x20, 0x45, 0x4a, 0xd1, 0xf7, 0x68, 0xfd, 0x02, 0x21, 0x06, 0x20, 0x43, 0x4a, 0xd1, 0xf7, 0x63, 0xfd, 0x01, 0x21, 0x07, 0x20, 0x42, 0x4a, 0xd1, 0xf7, 0x5e, 0xfd, 0x02, 0x21, 0x17, 0x20, 0x40, 0x4a, 0xd1, 0xf7, 0x59, 0xfd, 0x02, 0x21, 0x08, 0x20, 0x3f, 0x4a, 0xd1, 0xf7, 0x54, 0xfd, 0xff, 0xf7, 0xc8, 0xfd, 0x3d, 0x48, 0x04, 0x60, 0x3c, 0x00, 0xa8, 0x1c, 0x04, 0x00, 0x44, 0x60, 0xff, 0xf7, 0x17, 0xfa, 0xff, 0xf7, 0x09, 0xfa, 0xff, 0xf7, 0x4f, 0xfc, 0x00, 0xf0, 0x43, 0xf9, 0xff, 0xf7, 0x33, 0xfa, 0xff, 0xf7, 0xfb, 0xfa, 0x01, 0xf0, 0x85, 0xf8, 0x01, 0xf0, 0xeb, 0xf9, 0x01, 0xf0, 0x23, 0xfa, 0x01, 0xf0, 0x71, 0xf9, 0x00, 0xf0, 0xe3, 0xff, 0xff, 0xf7, 0x6f, 0xfa, 0x00, 0xf0, 0xaf, 0xf9, 0x00, 0xf0, 0xbd, 0xf9, 0x00, 0xf0, 0x3c, 0x00, 0xe4, 0x1c, 0x04, 0x00, 0xad, 0xfc, 0x00, 0xf0, 0x9b, 0xfe, 0xff, 0xf7, 0xcd, 0xfa, 0xff, 0xf7, 0xab, 0xfe, 0x00, 0xf0, 0xc3, 0xf9, 0xff, 0xf7, 0xab, 0xfd, 0x00, 0xf0, 0x8d, 0xff, 0x00, 0xf0, 0x21, 0xff, 0x00, 0xf0, 0x65, 0xf9, 0x00, 0xf0, 0x97, 0xf9, 0x00, 0xf0, 0xfd, 0xfe, 0x00, 0xf0, 0xe5, 0xfe, 0x00, 0xf0, 0x3f, 0xf9, 0x00, 0xf0, 0x73, 0xf9, 0xff, 0xf7, 0x37, 0xfe, 0x00, 0xf0, 0x3c, 0x00, 0x20, 0x1d, 0x04, 0x00, 0x21, 0xf9, 0x00, 0xf0, 0x73, 0xfb, 0xff, 0xf7, 0xe5, 0xfb, 0x00, 0xf0, 0xd3, 0xfb, 0xff, 0xf7, 0xa9, 0xfe, 0x00, 0xf0, 0xbb, 0xfb, 0x00, 0xf0, 0x09, 0xff, 0x00, 0xf0, 0xdb, 0xf9, 0x18, 0x48, 0xc9, 0xf7, 0x56, 0xf8, 0x17, 0x48, 0xc9, 0xf7, 0x2b, 0xf8, 0x00, 0x22, 0x01, 0x21, 0xf0, 0x20, 0xd1, 0xf7, 0x2e, 0xfd, 0x00, 0x20, 0x10, 0xbd, 0xa9, 0x69, 0x00, 0x00, 0x3c, 0x00, 0x5c, 0x1d, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0xf0, 0x00, 0x07, 0x00, 0x2c, 0x00, 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0x3c, 0x00, 0x08, 0x00, 0xc0, 0x3f, 0x74, 0x38, 0xfc, 0xdf, 0x7f, 0x38, 0x55, 0x69, 0x00, 0x00, 0xe5, 0x13, 0x00, 0x00, 0x61, 0x0c, 0x00, 0x00, 0x6d, 0x0c, 0x00, 0x00, 0x3d, 0x0c, 0x00, 0x00, 0xf1, 0x0d, 0x00, 0x00, 0xc5, 0x33, 0x00, 0x00, 0x3d, 0x0f, 0x00, 0x00, 0x3c, 0x00, 0x98, 0x1d, 0x04, 0x00, 0xad, 0xd8, 0x00, 0x00, 0x80, 0x00, 0x07, 0x00, 0x50, 0x57, 0x01, 0x00, 0x04, 0x40, 0x01, 0x00, 0x80, 0xb5, 0x01, 0xf0, 0xa9, 0xf9, 0x00, 0xf0, 0xc9, 0xf8, 0xff, 0xf7, 0xc5, 0xfe, 0x01, 0xf0, 0x03, 0xfb, 0x01, 0xf0, 0x93, 0xfa, 0xff, 0xf7, 0xcb, 0xf9, 0x2c, 0x48, 0xff, 0xf7, 0xe8, 0xf9, 0x00, 0xf0, 0xaa, 0xf8, 0x00, 0xf0, 0x58, 0xff, 0xff, 0xf7, 0x34, 0xfd, 0x3c, 0x00, 0xd4, 0x1d, 0x04, 0x00, 0xff, 0xf7, 0xf2, 0xfb, 0xff, 0xf7, 0x7a, 0xfa, 0xff, 0xf7, 0x00, 0xfa, 0x00, 0xf0, 0x34, 0xf9, 0x00, 0xf0, 0x3c, 0xf9, 0x01, 0xf0, 0xe2, 0xf8, 0xff, 0xf7, 0x7a, 0xf9, 0xff, 0xf7, 0x72, 0xf9, 0xff, 0xf7, 0x9a, 0xf9, 0x01, 0xf0, 0x66, 0xf9, 0x01, 0xf0, 0x8e, 0xf9, 0x01, 0xf0, 0xe0, 0xf8, 0x00, 0xf0, 0x06, 0xff, 0x00, 0xf0, 0xf0, 0xfb, 0x00, 0xf0, 0x46, 0xfb, 0x3c, 0x00, 0x10, 0x1e, 0x04, 0x00, 0x00, 0xf0, 0xbc, 0xff, 0x00, 0xf0, 0xe4, 0xfc, 0x00, 0xf0, 0x20, 0xfe, 0xff, 0xf7, 0x40, 0xfa, 0xff, 0xf7, 0x46, 0xfe, 0xff, 0xf7, 0x56, 0xfd, 0x00, 0xf0, 0x2c, 0xf9, 0x00, 0xf0, 0xfa, 0xfe, 0x00, 0xf0, 0x8a, 0xfe, 0x00, 0xf0, 0xd4, 0xf8, 0x00, 0xf0, 0xb4, 0xf8, 0x00, 0xf0, 0x78, 0xfe, 0x00, 0xf0, 0x4e, 0xfe, 0x00, 0xf0, 0xde, 0xf8, 0xff, 0xf7, 0xac, 0xfd, 0x3c, 0x00, 0x4c, 0x1e, 0x04, 0x00, 0x00, 0xf0, 0x8c, 0xf8, 0x00, 0xf0, 0xf8, 0xfa, 0xff, 0xf7, 0x76, 0xfb, 0xff, 0xf7, 0x20, 0xfe, 0x01, 0xf0, 0xa6, 0xfa, 0x00, 0xf0, 0x48, 0xfb, 0x00, 0xf0, 0x7c, 0xfe, 0x00, 0xf0, 0x5c, 0xf9, 0xbe, 0xf7, 0x57, 0xfd, 0x00, 0x20, 0x80, 0xbd, 0x80, 0x38, 0x01, 0x00, 0x01, 0x49, 0x00, 0x20, 0x08, 0x60, 0x70, 0x47, 0xa8, 0x7e, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x3c, 0x00, 0x88, 0x1e, 0x04, 0x00, 0x01, 0xd1, 0xbf, 0xf7, 0x39, 0xfa, 0x0f, 0x48, 0x7d, 0x21, 0xc9, 0x00, 0x84, 0x60, 0x01, 0x80, 0x0d, 0x49, 0x01, 0x61, 0x80, 0x21, 0x41, 0x80, 0x00, 0x21, 0xc1, 0x60, 0x01, 0x62, 0x0b, 0x48, 0x41, 0x80, 0x14, 0x21, 0x81, 0x80, 0x07, 0x21, 0x41, 0x81, 0x06, 0x4a, 0x46, 0x23, 0x04, 0x32, 0x05, 0x24, 0x13, 0x70, 0x54, 0x70, 0x0a, 0x21, 0x91, 0x70, 0x81, 0x76, 0x3c, 0x00, 0xc4, 0x1e, 0x04, 0x00, 0x03, 0x76, 0x04, 0x81, 0x10, 0xbd, 0x00, 0x00, 0xc8, 0x74, 0x01, 0x00, 0x00, 0x87, 0x93, 0x03, 0x30, 0x00, 0x07, 0x00, 0x09, 0x48, 0x80, 0xb5, 0x01, 0x69, 0x42, 0x69, 0x11, 0x43, 0x82, 0x69, 0xc0, 0x69, 0x11, 0x43, 0x01, 0x43, 0x00, 0x22, 0x03, 0x20, 0xc6, 0xf7, 0xbf, 0xfc, 0xcc, 0xf7, 0x1b, 0xfa, 0x00, 0x20, 0xc2, 0xf7, 0x92, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x1f, 0x04, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x05, 0x48, 0x80, 0xb5, 0x00, 0x21, 0x81, 0x60, 0x02, 0x21, 0xc1, 0x60, 0x03, 0x39, 0x41, 0x60, 0xc7, 0xf7, 0x3a, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x40, 0x20, 0x07, 0x00, 0x08, 0xb5, 0x6a, 0x46, 0x04, 0x49, 0x15, 0x20, 0xbf, 0xf7, 0x54, 0xf8, 0x01, 0x20, 0x03, 0x49, 0x40, 0x05, 0x08, 0x60, 0x48, 0x60, 0x08, 0xbd, 0xa5, 0x21, 0x01, 0x00, 0x3c, 0x00, 0x3c, 0x1f, 0x04, 0x00, 0x00, 0x10, 0x07, 0x00, 0x70, 0x47, 0x00, 0x00, 0x06, 0x48, 0x80, 0xb5, 0x80, 0x68, 0xc0, 0x01, 0x80, 0x0f, 0x05, 0xd1, 0x03, 0x22, 0xc1, 0x43, 0xc6, 0xf7, 0xba, 0xfc, 0xd6, 0xf7, 0x00, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x10, 0x00, 0x07, 0x00, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x2a, 0x20, 0x06, 0x4a, 0xd1, 0xf7, 0xea, 0xfb, 0x00, 0x22, 0x07, 0x20, 0x3c, 0x00, 0x78, 0x1f, 0x04, 0x00, 0x04, 0x49, 0xbe, 0xf7, 0xed, 0xfe, 0x04, 0x48, 0xc7, 0xf7, 0x58, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x8d, 0x89, 0x00, 0x00, 0xd5, 0x9b, 0x00, 0x00, 0x10, 0x46, 0x01, 0x00, 0x02, 0x48, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x0e, 0xc0, 0x70, 0x47, 0x80, 0x6e, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x2c, 0x20, 0x06, 0x4a, 0xd1, 0xf7, 0xcc, 0xfb, 0x00, 0x22, 0x00, 0x20, 0x3c, 0x00, 0xb4, 0x1f, 0x04, 0x00, 0x04, 0x49, 0xbe, 0xf7, 0xcf, 0xfe, 0x04, 0x49, 0x02, 0x20, 0xc8, 0xf7, 0x0b, 0xfa, 0x80, 0xbd, 0x05, 0x8a, 0x00, 0x00, 0xe9, 0x9b, 0x00, 0x00, 0xb1, 0x8b, 0x00, 0x00, 0x02, 0x48, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x0e, 0xc0, 0x70, 0x47, 0x10, 0x75, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x2b, 0x20, 0x04, 0x4a, 0xd1, 0xf7, 0xae, 0xfb, 0x00, 0x22, 0x02, 0x20, 0x3c, 0x00, 0xf0, 0x1f, 0x04, 0x00, 0x02, 0x49, 0xbe, 0xf7, 0xb1, 0xfe, 0x80, 0xbd, 0x2d, 0x8a, 0x00, 0x00, 0x8d, 0x8c, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x2d, 0x20, 0x07, 0x4a, 0xd1, 0xf7, 0x9c, 0xfb, 0x00, 0x22, 0x01, 0x20, 0x05, 0x49, 0xbe, 0xf7, 0x9f, 0xfe, 0x05, 0x48, 0xcb, 0xf7, 0x56, 0xfa, 0x04, 0x48, 0xcc, 0xf7, 0xf7, 0xf8, 0x80, 0xbd, 0xad, 0x8a, 0x00, 0x00, 0x3c, 0x00, 0x2c, 0x20, 0x04, 0x00, 0x21, 0xe2, 0x00, 0x00, 0xf9, 0xdf, 0x00, 0x00, 0x20, 0x44, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x02, 0x49, 0x00, 0x20, 0x08, 0x60, 0x01, 0x20, 0x48, 0x60, 0x70, 0x47, 0xac, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x49, 0x0d, 0x20, 0xd0, 0xf7, 0x9b, 0xf9, 0x80, 0xbd, 0x61, 0x98, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0xcd, 0xf7, 0x77, 0xf9, 0x03, 0x49, 0x3c, 0x00, 0x68, 0x20, 0x04, 0x00, 0x08, 0x60, 0x01, 0x1c, 0x02, 0x48, 0xcd, 0xf7, 0x97, 0xf9, 0x80, 0xbd, 0xa8, 0x79, 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x29, 0xf8, 0x80, 0xbd, 0x80, 0xb5, 0x86, 0xb0, 0x0c, 0x48, 0xc3, 0xf7, 0x6d, 0xfd, 0xd6, 0xf7, 0xd3, 0xfb, 0x0b, 0x48, 0x0d, 0x49, 0x00, 0x90, 0x0a, 0x48, 0x04, 0x91, 0x01, 0x90, 0x0a, 0x48, 0x69, 0x46, 0x02, 0x90, 0x3c, 0x00, 0xa4, 0x20, 0x04, 0x00, 0x00, 0x20, 0x03, 0x90, 0x05, 0x90, 0x01, 0x20, 0xc3, 0xf7, 0x00, 0xfd, 0x07, 0x49, 0x03, 0x20, 0xd0, 0xf7, 0x6a, 0xf9, 0x06, 0xb0, 0x80, 0xbd, 0x20, 0xf7, 0x01, 0x00, 0x11, 0x87, 0x01, 0x00, 0x95, 0x87, 0x01, 0x00, 0x55, 0x87, 0x01, 0x00, 0x98, 0xd9, 0x01, 0x00, 0x6d, 0x87, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x20, 0xd6, 0xf7, 0x90, 0xfc, 0x03, 0x49, 0x00, 0x20, 0x3c, 0x00, 0xe0, 0x20, 0x04, 0x00, 0x08, 0x60, 0x48, 0x60, 0x02, 0x48, 0x14, 0x39, 0x48, 0x60, 0x80, 0xbd, 0x90, 0xd9, 0x01, 0x00, 0x3d, 0x82, 0x01, 0x00, 0x70, 0xb5, 0x00, 0x26, 0x09, 0x4c, 0x09, 0x4d, 0x26, 0x60, 0x66, 0x60, 0x44, 0x21, 0x50, 0x35, 0x28, 0x1c, 0xa6, 0x61, 0xbe, 0xf7, 0xc8, 0xf9, 0x14, 0x20, 0xe0, 0x60, 0xe8, 0x63, 0x28, 0x20, 0xe8, 0x61, 0xa0, 0x60, 0x28, 0x64, 0x2e, 0x70, 0x3c, 0x00, 0x1c, 0x21, 0x04, 0x00, 0x70, 0xbd, 0x00, 0x00, 0xa4, 0x6e, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x18, 0x20, 0x04, 0x4a, 0xd1, 0xf7, 0x0c, 0xfb, 0x03, 0x49, 0x08, 0x20, 0xd0, 0xf7, 0x2a, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x15, 0x9c, 0x00, 0x00, 0x69, 0x9c, 0x00, 0x00, 0xfe, 0xb5, 0x26, 0x4d, 0x28, 0x78, 0xc0, 0x07, 0x0c, 0xd4, 0x25, 0x49, 0x00, 0x20, 0x08, 0x70, 0x28, 0x70, 0x24, 0x48, 0x3c, 0x00, 0x58, 0x21, 0x04, 0x00, 0x81, 0x78, 0x49, 0x08, 0x49, 0x00, 0x81, 0x70, 0x81, 0x78, 0x01, 0x22, 0x11, 0x43, 0x81, 0x70, 0x00, 0x24, 0xff, 0x26, 0x1f, 0x4f, 0x01, 0x36, 0x21, 0x1c, 0x01, 0xa8, 0xc6, 0xf7, 0x32, 0xf8, 0x00, 0xab, 0x18, 0x79, 0x01, 0x28, 0x1f, 0xd0, 0x02, 0x28, 0x19, 0xd0, 0x03, 0x28, 0x1e, 0xd1, 0xb8, 0x68, 0x00, 0x21, 0xb0, 0x43, 0xb8, 0x60, 0x78, 0x68, 0x30, 0x43, 0x3c, 0x00, 0x94, 0x21, 0x04, 0x00, 0x78, 0x60, 0x3a, 0x68, 0x32, 0x40, 0xa0, 0x20, 0x05, 0xe0, 0x3b, 0x68, 0x33, 0x40, 0x93, 0x42, 0x01, 0xd0, 0x01, 0x21, 0x01, 0xe0, 0x01, 0x38, 0xf7, 0xd2, 0x78, 0x68, 0xb0, 0x43, 0x78, 0x60, 0x00, 0x29, 0x03, 0xd0, 0x01, 0xa8, 0x00, 0xf0, 0x27, 0xff, 0x02, 0xe0, 0x01, 0xa8, 0x00, 0xf0, 0x45, 0xff, 0x01, 0x34, 0x24, 0x06, 0x24, 0x16, 0x06, 0x2c, 0xcf, 0xdb, 0x3c, 0x00, 0xd0, 0x21, 0x04, 0x00, 0x04, 0x49, 0x02, 0x22, 0x08, 0x78, 0x10, 0x43, 0x08, 0x70, 0x28, 0x70, 0xfe, 0xbd, 0x00, 0x00, 0x04, 0x00, 0x07, 0x00, 0xe0, 0x60, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x10, 0x00, 0x07, 0x00, 0xb0, 0xb5, 0x00, 0x20, 0x15, 0x23, 0x14, 0x49, 0x01, 0x25, 0x42, 0x00, 0x8d, 0x54, 0x52, 0x18, 0x01, 0x30, 0x0e, 0x28, 0x53, 0x70, 0xf8, 0xd3, 0x0f, 0x48, 0x1c, 0x22, 0x3c, 0x00, 0x0c, 0x22, 0x04, 0x00, 0x1c, 0x38, 0xbe, 0xf7, 0x73, 0xf9, 0x0d, 0x48, 0x0e, 0x21, 0x2a, 0x38, 0xbe, 0xf7, 0x1c, 0xf9, 0x0b, 0x49, 0x00, 0x20, 0x08, 0x60, 0x0b, 0x4c, 0x2a, 0x21, 0x20, 0x1c, 0xbe, 0xf7, 0x14, 0xf9, 0x25, 0x70, 0x0e, 0x20, 0x60, 0x70, 0x17, 0x20, 0xa0, 0x70, 0x07, 0x48, 0x53, 0x21, 0x01, 0x70, 0x45, 0x21, 0x41, 0x70, 0x20, 0x21, 0x81, 0x70, 0xb0, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x48, 0x22, 0x04, 0x00, 0xe6, 0x78, 0x01, 0x00, 0xe4, 0x62, 0x01, 0x00, 0xeb, 0x62, 0x01, 0x00, 0xe8, 0x62, 0x01, 0x00, 0x0c, 0x49, 0x0d, 0x48, 0x00, 0x22, 0x41, 0x60, 0x0c, 0x49, 0x81, 0x60, 0x0c, 0x49, 0xc1, 0x60, 0x0c, 0x49, 0x01, 0x61, 0x0c, 0x49, 0x41, 0x61, 0x0c, 0x49, 0x82, 0x61, 0xc1, 0x61, 0x0c, 0x49, 0x01, 0x62, 0x0c, 0x49, 0x41, 0x62, 0x0c, 0x49, 0x81, 0x62, 0x0c, 0x49, 0x3c, 0x00, 0x84, 0x22, 0x04, 0x00, 0xc1, 0x62, 0xc2, 0x63, 0x70, 0x47, 0x00, 0x00, 0xc9, 0x75, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0xc1, 0x75, 0x00, 0x00, 0x81, 0x75, 0x00, 0x00, 0x99, 0x75, 0x00, 0x00, 0xcd, 0x75, 0x00, 0x00, 0x89, 0x75, 0x00, 0x00, 0x91, 0x75, 0x00, 0x00, 0xb5, 0x75, 0x00, 0x00, 0x8d, 0x75, 0x00, 0x00, 0xc5, 0x75, 0x00, 0x00, 0xb0, 0xb5, 0x0e, 0x48, 0x0e, 0x49, 0x08, 0x60, 0x3c, 0x00, 0xc0, 0x22, 0x04, 0x00, 0x08, 0x31, 0xc0, 0xf7, 0x43, 0xfe, 0x0c, 0x49, 0x00, 0x25, 0x48, 0x60, 0x0b, 0x48, 0x0a, 0x4c, 0x05, 0x60, 0x0b, 0x48, 0x80, 0x3c, 0x05, 0x60, 0x10, 0x20, 0x20, 0x71, 0xe0, 0x70, 0xa0, 0x71, 0x60, 0x71, 0x27, 0x20, 0xc0, 0x43, 0xc3, 0xf7, 0xf7, 0xfb, 0x28, 0x20, 0xc3, 0xf7, 0xfc, 0xfb, 0x25, 0x72, 0xb0, 0xbd, 0xff, 0x3f, 0x00, 0x00, 0x2c, 0x7d, 0x01, 0x00, 0x3c, 0x00, 0xfc, 0x22, 0x04, 0x00, 0x1c, 0x67, 0x01, 0x00, 0x20, 0x67, 0x01, 0x00, 0x80, 0xb5, 0x2c, 0x21, 0x01, 0x48, 0xbe, 0xf7, 0xc7, 0xf8, 0x80, 0xbd, 0x3c, 0x7e, 0x01, 0x00, 0x80, 0xb5, 0x38, 0x21, 0x01, 0x48, 0xbe, 0xf7, 0xbf, 0xf8, 0x80, 0xbd, 0x68, 0x7e, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x0e, 0x20, 0x02, 0x4a, 0xd1, 0xf7, 0x0c, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x21, 0xe0, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x23, 0x04, 0x00, 0x70, 0x47, 0x00, 0x00, 0xf0, 0xb5, 0x85, 0xb0, 0x00, 0x27, 0x00, 0xab, 0x2f, 0x4e, 0x1f, 0x81, 0x00, 0x25, 0x00, 0x24, 0x28, 0x1c, 0xd6, 0xf7, 0xa1, 0xfb, 0x02, 0x2d, 0x03, 0xd1, 0xd6, 0xf7, 0xf5, 0xfa, 0x00, 0x28, 0x0c, 0xd0, 0x01, 0x24, 0x01, 0x2d, 0x03, 0xd1, 0x07, 0x20, 0x00, 0xab, 0x18, 0x71, 0x01, 0xe0, 0x00, 0xab, 0x1f, 0x71, 0x00, 0xab, 0x18, 0x79, 0x3c, 0x00, 0x74, 0x23, 0x04, 0x00, 0xd6, 0xf7, 0x08, 0xfc, 0x00, 0x2c, 0x39, 0xd0, 0x08, 0x21, 0x03, 0xa8, 0xd6, 0xf7, 0xf2, 0xfa, 0x00, 0xab, 0x18, 0x7b, 0xfe, 0x28, 0x31, 0xd1, 0x58, 0x7b, 0x01, 0x28, 0x2a, 0xd1, 0x02, 0x21, 0x02, 0xa8, 0xd6, 0xf7, 0xe7, 0xfa, 0x00, 0xab, 0x18, 0x89, 0x00, 0x28, 0x26, 0xd0, 0x18, 0x89, 0x18, 0x49, 0x88, 0x42, 0x22, 0xd0, 0x19, 0x89, 0x00, 0x20, 0xbf, 0xf7, 0x3c, 0x00, 0xb0, 0x23, 0x04, 0x00, 0x13, 0xf9, 0x04, 0x1c, 0x00, 0x69, 0x00, 0xab, 0x19, 0x89, 0xd6, 0xf7, 0xd5, 0xfa, 0x20, 0x68, 0x00, 0xab, 0x1a, 0x89, 0x01, 0x1c, 0x08, 0x31, 0x08, 0x3a, 0xcb, 0xf7, 0xa1, 0xf9, 0x00, 0x28, 0x06, 0xd0, 0x02, 0x28, 0x04, 0xd0, 0x02, 0x21, 0x94, 0x20, 0x37, 0x60, 0xbe, 0xf7, 0x62, 0xff, 0x20, 0x1c, 0xbf, 0xf7, 0xc7, 0xf8, 0xd4, 0xe7, 0x01, 0x21, 0x94, 0x20, 0x3c, 0x00, 0xec, 0x23, 0x04, 0x00, 0xbe, 0xf7, 0x5a, 0xff, 0xd5, 0xf7, 0x26, 0xff, 0x01, 0x35, 0x2d, 0x06, 0x2d, 0x0e, 0x04, 0x2d, 0xa5, 0xd3, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0x58, 0x57, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x0a, 0x48, 0x00, 0x21, 0x02, 0x1c, 0x18, 0x32, 0x80, 0xb5, 0x09, 0x4b, 0x02, 0xe0, 0x01, 0x60, 0x83, 0x80, 0x08, 0x30, 0x82, 0x42, 0xfa, 0xd1, 0x04, 0x48, 0x6c, 0x21, 0x3c, 0x00, 0x28, 0x24, 0x04, 0x00, 0x6c, 0x38, 0xbe, 0xf7, 0x37, 0xf8, 0x04, 0x49, 0x02, 0x20, 0xc7, 0xf7, 0xd1, 0xff, 0x80, 0xbd, 0x7c, 0x79, 0x01, 0x00, 0xfc, 0x05, 0x00, 0x00, 0x9d, 0x75, 0x00, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x26, 0x20, 0x0d, 0x4a, 0xd1, 0xf7, 0x7c, 0xf9, 0x0c, 0x48, 0xc8, 0xf7, 0x73, 0xff, 0x0c, 0x48, 0xc8, 0xf7, 0x76, 0xff, 0x0b, 0x49, 0x10, 0x20, 0xcf, 0xf7, 0x94, 0xff, 0x3c, 0x00, 0x64, 0x24, 0x04, 0x00, 0x0a, 0x49, 0x0c, 0x20, 0xcf, 0xf7, 0x90, 0xff, 0x09, 0x49, 0x00, 0x20, 0xc7, 0xf7, 0xb2, 0xff, 0xcc, 0xf7, 0x6e, 0xff, 0x07, 0x49, 0x08, 0x60, 0x80, 0xbd, 0x00, 0x00, 0x9d, 0xa6, 0x00, 0x00, 0xa9, 0xa4, 0x00, 0x00, 0x81, 0xa4, 0x00, 0x00, 0x31, 0xa7, 0x00, 0x00, 0xb9, 0x6d, 0x00, 0x00, 0xbd, 0xa6, 0x00, 0x00, 0x0c, 0x79, 0x01, 0x00, 0x02, 0x49, 0x08, 0x78, 0x3c, 0x00, 0xa0, 0x24, 0x04, 0x00, 0x40, 0x08, 0x40, 0x00, 0x08, 0x70, 0x70, 0x47, 0x58, 0x00, 0x07, 0x00, 0x00, 0x21, 0x08, 0x48, 0x80, 0xb5, 0x41, 0x61, 0x81, 0x61, 0x01, 0x70, 0x41, 0x70, 0x41, 0x60, 0x81, 0x60, 0x14, 0x22, 0xc2, 0x60, 0x01, 0x61, 0x42, 0x62, 0xc1, 0x61, 0xff, 0xf7, 0x04, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x1c, 0x75, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x1d, 0x20, 0x04, 0x4a, 0x3c, 0x00, 0xdc, 0x24, 0x04, 0x00, 0xd1, 0xf7, 0x34, 0xf9, 0x03, 0x49, 0x08, 0x20, 0xcf, 0xf7, 0x52, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x11, 0xe3, 0x00, 0x00, 0x09, 0xe4, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x21, 0x25, 0x20, 0x0a, 0x4a, 0xd1, 0xf7, 0x24, 0xf9, 0xcc, 0xf7, 0x28, 0xff, 0x08, 0x49, 0x08, 0x62, 0x08, 0x49, 0x01, 0x20, 0xcf, 0xf7, 0x3e, 0xff, 0x07, 0x49, 0x02, 0x20, 0xcf, 0xf7, 0x3a, 0xff, 0x3c, 0x00, 0x18, 0x25, 0x04, 0x00, 0xfe, 0xf7, 0xe6, 0xff, 0x05, 0x48, 0xc1, 0xf7, 0xe1, 0xf9, 0x80, 0xbd, 0x29, 0xa9, 0x00, 0x00, 0x1c, 0x75, 0x01, 0x00, 0xa1, 0xaa, 0x00, 0x00, 0x2d, 0x19, 0x00, 0x00, 0x45, 0xa8, 0x00, 0x00, 0x10, 0xb5, 0x06, 0x4c, 0x0c, 0x22, 0x22, 0x70, 0xa0, 0x18, 0x05, 0x49, 0xbd, 0xf7, 0xd8, 0xff, 0x00, 0x20, 0xc8, 0xf7, 0x85, 0xfb, 0x01, 0x20, 0xa0, 0x60, 0x10, 0xbd, 0x3c, 0x00, 0x54, 0x25, 0x04, 0x00, 0xa4, 0x69, 0x01, 0x00, 0x90, 0x57, 0x01, 0x00, 0xb0, 0xb5, 0x1f, 0x4c, 0x00, 0x25, 0x65, 0x80, 0x01, 0x20, 0x20, 0x70, 0x0a, 0x20, 0xa0, 0x80, 0x90, 0x20, 0xe0, 0x80, 0x30, 0x20, 0x20, 0x81, 0x90, 0x20, 0x60, 0x81, 0x30, 0x20, 0xa0, 0x81, 0x17, 0x48, 0x04, 0x22, 0x07, 0x21, 0x12, 0x30, 0xbe, 0xf7, 0x4c, 0xf8, 0x14, 0x48, 0x04, 0x22, 0x05, 0x21, 0x16, 0x30, 0x3c, 0x00, 0x90, 0x25, 0x04, 0x00, 0xbe, 0xf7, 0x46, 0xf8, 0x12, 0x48, 0x11, 0x4a, 0xe0, 0x81, 0x20, 0x82, 0x70, 0x32, 0x15, 0x70, 0x55, 0x70, 0x00, 0x20, 0x3c, 0x23, 0x41, 0x01, 0x43, 0x43, 0x89, 0x18, 0xf4, 0x31, 0x9b, 0x18, 0x01, 0x30, 0x04, 0x28, 0x59, 0x60, 0xf5, 0xdb, 0x08, 0x48, 0x06, 0x22, 0x1a, 0x30, 0x09, 0x49, 0xbd, 0xf7, 0x9a, 0xff, 0x07, 0x48, 0x05, 0x4c, 0x0c, 0x30, 0x0f, 0xc8, 0x3c, 0x00, 0xcc, 0x25, 0x04, 0x00, 0x20, 0x34, 0x0f, 0xc4, 0x20, 0x21, 0x20, 0x1c, 0xbd, 0xf7, 0x62, 0xff, 0xb0, 0xbd, 0x00, 0x00, 0xf8, 0x60, 0x01, 0x00, 0x2c, 0x09, 0x00, 0x00, 0x58, 0x40, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x07, 0x48, 0x10, 0xb5, 0x00, 0x68, 0x00, 0x28, 0x08, 0xd0, 0x06, 0x48, 0xbe, 0xf7, 0x9c, 0xfe, 0x04, 0x1c, 0xff, 0xf7, 0x9d, 0xfe, 0x20, 0x1c, 0xbe, 0xf7, 0x96, 0xfe, 0x3c, 0x00, 0x08, 0x26, 0x04, 0x00, 0x10, 0xbd, 0x00, 0x00, 0x58, 0x57, 0x01, 0x00, 0xb5, 0xad, 0x00, 0x00, 0x04, 0x49, 0x80, 0xb5, 0x00, 0x20, 0x88, 0x70, 0x02, 0x21, 0x20, 0x20, 0x02, 0x4a, 0xd1, 0xf7, 0x91, 0xf8, 0x80, 0xbd, 0xb4, 0x79, 0x01, 0x00, 0x25, 0xb5, 0x00, 0x00, 0x80, 0xb5, 0xcc, 0xf7, 0x8f, 0xfe, 0x01, 0x49, 0x48, 0x61, 0x80, 0xbd, 0xb4, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x18, 0x21, 0x3c, 0x00, 0x44, 0x26, 0x04, 0x00, 0x14, 0x48, 0xbd, 0xf7, 0x29, 0xff, 0x14, 0x48, 0x01, 0x21, 0x01, 0x70, 0x00, 0x21, 0xc1, 0x60, 0x41, 0x70, 0x01, 0x61, 0x00, 0xf0, 0x02, 0xf9, 0x00, 0xf0, 0xaa, 0xf8, 0x00, 0xf0, 0x1e, 0xf8, 0x00, 0xf0, 0xba, 0xf9, 0x00, 0xf0, 0xcc, 0xf9, 0x00, 0xf0, 0x20, 0xf9, 0x00, 0xf0, 0x64, 0xf9, 0x00, 0xf0, 0xce, 0xf9, 0x00, 0xf0, 0xfc, 0xf8, 0x00, 0xf0, 0x82, 0xf9, 0x3c, 0x00, 0x80, 0x26, 0x04, 0x00, 0x00, 0xf0, 0x28, 0xf8, 0x00, 0xf0, 0x6e, 0xf8, 0x00, 0xf0, 0x4a, 0xf8, 0xff, 0xf7, 0xc2, 0xff, 0x00, 0xf0, 0x72, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x40, 0x7c, 0x01, 0x00, 0x18, 0x63, 0x01, 0x00, 0xb0, 0xb5, 0x08, 0x4c, 0x00, 0x25, 0x08, 0x48, 0x25, 0x77, 0x20, 0x60, 0xce, 0xf7, 0xf0, 0xfd, 0x00, 0x20, 0xe5, 0x62, 0xd0, 0xf7, 0xd0, 0xfa, 0x21, 0x1f, 0x08, 0x80, 0x3c, 0x00, 0xbc, 0x26, 0x04, 0x00, 0xd0, 0xf7, 0x6c, 0xfb, 0xb0, 0xbd, 0x00, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x95, 0x75, 0x00, 0x00, 0x80, 0xb5, 0xcc, 0xf7, 0xc1, 0xfc, 0x80, 0xbd, 0x05, 0x49, 0x80, 0xb5, 0x00, 0x20, 0x08, 0x70, 0x48, 0x70, 0x03, 0x48, 0x04, 0x49, 0x03, 0x4a, 0x08, 0x30, 0xcc, 0xf7, 0x27, 0xfe, 0x80, 0xbd, 0x2c, 0x63, 0x01, 0x00, 0xed, 0xbc, 0x00, 0x00, 0x4d, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x26, 0x04, 0x00, 0x80, 0xb5, 0xcc, 0xf7, 0x2b, 0xfe, 0x05, 0x49, 0x48, 0x60, 0x01, 0x1c, 0x04, 0x48, 0xcc, 0xf7, 0x4b, 0xfe, 0x04, 0x49, 0x03, 0x20, 0xcf, 0xf7, 0x3d, 0xfe, 0x80, 0xbd, 0x2c, 0x63, 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, 0xc1, 0xbc, 0x00, 0x00, 0x04, 0x48, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x0e, 0xc0, 0x08, 0xc0, 0x02, 0x49, 0x10, 0x38, 0x01, 0x60, 0x70, 0x47, 0x3c, 0x00, 0x34, 0x27, 0x04, 0x00, 0x04, 0x7a, 0x01, 0x00, 0x1c, 0xe6, 0x01, 0x00, 0x80, 0xb5, 0xcc, 0xf7, 0x09, 0xfe, 0x05, 0x49, 0x05, 0x4a, 0x48, 0x60, 0x02, 0x21, 0x24, 0x20, 0xd0, 0xf7, 0xfc, 0xff, 0x03, 0x48, 0xc9, 0xf7, 0x6b, 0xfd, 0x80, 0xbd, 0x04, 0x7a, 0x01, 0x00, 0x69, 0xbe, 0x00, 0x00, 0x71, 0xeb, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x4c, 0x14, 0x21, 0x20, 0x1c, 0xbd, 0xf7, 0x96, 0xfe, 0x3c, 0x00, 0x70, 0x27, 0x04, 0x00, 0x02, 0x48, 0x20, 0x60, 0x10, 0xbd, 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, 0xec, 0xe5, 0x01, 0x00, 0x80, 0xb5, 0xcc, 0xf7, 0xe7, 0xfd, 0x07, 0x49, 0x07, 0x4a, 0x48, 0x60, 0x02, 0x21, 0x1f, 0x20, 0xd0, 0xf7, 0xda, 0xff, 0x05, 0x49, 0x01, 0x20, 0x08, 0x60, 0x05, 0x49, 0x0c, 0x20, 0xcf, 0xf7, 0xf5, 0xfd, 0x80, 0xbd, 0x14, 0x7a, 0x01, 0x00, 0xd5, 0xbf, 0x00, 0x00, 0x3c, 0x00, 0xac, 0x27, 0x04, 0x00, 0x80, 0x5a, 0x01, 0x00, 0x85, 0xff, 0x00, 0x00, 0x80, 0xb5, 0xff, 0xf7, 0x4f, 0xfd, 0x01, 0x21, 0x21, 0x20, 0x02, 0x4a, 0xd0, 0xf7, 0xc2, 0xff, 0x80, 0xbd, 0x00, 0x00, 0xc9, 0xc1, 0x00, 0x00, 0x80, 0xb5, 0xcc, 0xf7, 0xc1, 0xfd, 0x02, 0x49, 0x08, 0x63, 0xc9, 0xf7, 0x57, 0xfd, 0x80, 0xbd, 0x28, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0xcc, 0xf7, 0xb7, 0xfd, 0x16, 0x4c, 0x3c, 0x00, 0xe8, 0x27, 0x04, 0x00, 0x20, 0x61, 0xcc, 0xf7, 0xb3, 0xfd, 0x60, 0x61, 0x14, 0x48, 0x15, 0x49, 0x08, 0x60, 0x16, 0x49, 0x14, 0x48, 0x08, 0x60, 0xcc, 0xf7, 0xaa, 0xfd, 0x14, 0x49, 0x08, 0x60, 0x00, 0xf0, 0x34, 0xf8, 0xff, 0xf7, 0xe0, 0xff, 0xff, 0xf7, 0x5e, 0xff, 0x00, 0xf0, 0x04, 0xf9, 0x00, 0xf0, 0x8e, 0xf8, 0xff, 0xf7, 0x6e, 0xff, 0xff, 0xf7, 0xb0, 0xff, 0xff, 0xf7, 0x8c, 0xff, 0x3c, 0x00, 0x24, 0x28, 0x04, 0x00, 0xff, 0xf7, 0x04, 0xff, 0x00, 0xf0, 0xaa, 0xf8, 0x0a, 0x48, 0xbf, 0xf7, 0xbd, 0xff, 0xc9, 0xf7, 0xbb, 0xfd, 0x09, 0x49, 0x00, 0x20, 0xcf, 0xf7, 0xa7, 0xfd, 0x10, 0xbd, 0x40, 0x7c, 0x01, 0x00, 0x7d, 0xb7, 0x00, 0x00, 0x18, 0x7e, 0x01, 0x00, 0xbd, 0xb8, 0x00, 0x00, 0x1c, 0x7e, 0x01, 0x00, 0x20, 0x7e, 0x01, 0x00, 0xb9, 0xba, 0x00, 0x00, 0x81, 0x24, 0x01, 0x00, 0x3c, 0x00, 0x60, 0x28, 0x04, 0x00, 0x80, 0xb5, 0x38, 0x21, 0x01, 0x48, 0xbd, 0xf7, 0x19, 0xfe, 0x80, 0xbd, 0x90, 0x5c, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0xb0, 0xb5, 0x0c, 0x4c, 0x0b, 0x4d, 0x00, 0x20, 0x0c, 0x34, 0x60, 0x60, 0x25, 0x60, 0xe0, 0x60, 0x0a, 0x20, 0x20, 0x81, 0x28, 0x1c, 0xc8, 0xf7, 0x3f, 0xfd, 0x28, 0x1c, 0xc8, 0xf7, 0x3a, 0xfd, 0x08, 0x3d, 0x68, 0x60, 0x04, 0x48, 0xc9, 0xf7, 0x3c, 0x00, 0x9c, 0x28, 0x04, 0x00, 0x1b, 0xfd, 0x20, 0x1c, 0xc0, 0xf7, 0x6e, 0xfa, 0x28, 0x80, 0xb0, 0xbd, 0xb8, 0x7a, 0x01, 0x00, 0xd5, 0x33, 0x01, 0x00, 0xf8, 0xb5, 0x1f, 0x4e, 0x1d, 0x4c, 0x00, 0x20, 0x0c, 0x21, 0x41, 0x43, 0x82, 0x00, 0x01, 0x30, 0x09, 0x19, 0x08, 0x31, 0x00, 0x06, 0x00, 0x0e, 0x04, 0x28, 0xb1, 0x50, 0xf4, 0xd3, 0x18, 0x48, 0x0c, 0x38, 0x30, 0x61, 0xce, 0xf7, 0xf4, 0xf9, 0x3c, 0x00, 0xd8, 0x28, 0x04, 0x00, 0x14, 0x4c, 0xa0, 0x78, 0x00, 0x09, 0x00, 0x01, 0xa0, 0x70, 0x00, 0x27, 0xe7, 0x70, 0x67, 0x70, 0x00, 0x24, 0xa5, 0x00, 0x70, 0x59, 0x07, 0x70, 0x20, 0x1c, 0xbe, 0xf7, 0x53, 0xf9, 0x71, 0x59, 0x08, 0x71, 0x00, 0x21, 0x20, 0x1c, 0xce, 0xf7, 0x7d, 0xf9, 0x01, 0x34, 0x24, 0x06, 0x24, 0x0e, 0x04, 0x2c, 0xee, 0xd3, 0x07, 0x4c, 0x20, 0x78, 0x00, 0x09, 0x00, 0x01, 0x3c, 0x00, 0x14, 0x29, 0x04, 0x00, 0x0a, 0x30, 0x20, 0x70, 0x20, 0x78, 0xf0, 0x21, 0x88, 0x43, 0x30, 0x30, 0x20, 0x70, 0xa0, 0x78, 0x0f, 0x21, 0x08, 0x43, 0xa0, 0x70, 0xf8, 0xbd, 0x00, 0x50, 0x07, 0x00, 0x10, 0x7b, 0x01, 0x00, 0x80, 0xb5, 0xcc, 0xf7, 0x9f, 0xfb, 0x80, 0xbd, 0xb0, 0xb5, 0x0c, 0x4c, 0x0b, 0x4d, 0x00, 0x20, 0x0c, 0x34, 0x60, 0x60, 0x25, 0x60, 0xe0, 0x60, 0x0a, 0x20, 0x20, 0x81, 0x3c, 0x00, 0x50, 0x29, 0x04, 0x00, 0x28, 0x1c, 0xc8, 0xf7, 0xe1, 0xfc, 0x28, 0x1c, 0xc8, 0xf7, 0xd4, 0xfc, 0x08, 0x3d, 0x68, 0x60, 0x20, 0x1c, 0xc0, 0xf7, 0x0d, 0xfa, 0x28, 0x80, 0x02, 0x48, 0xc9, 0xf7, 0x9b, 0xfc, 0xb0, 0xbd, 0x2c, 0x7b, 0x01, 0x00, 0x49, 0x00, 0x01, 0x00, 0x80, 0xb5, 0xca, 0xf7, 0x2f, 0xf8, 0x80, 0xbd, 0x70, 0x47, 0x00, 0x00, 0xb0, 0xb5, 0x12, 0x4d, 0x3c, 0x21, 0x28, 0x1c, 0x3c, 0x00, 0x8c, 0x29, 0x04, 0x00, 0xbd, 0xf7, 0x86, 0xfd, 0x0f, 0x48, 0x28, 0x21, 0x3c, 0x30, 0xbd, 0xf7, 0x81, 0xfd, 0x0d, 0x48, 0x00, 0x21, 0x14, 0x38, 0x01, 0x61, 0xc1, 0x60, 0xff, 0x21, 0x01, 0x70, 0x41, 0x70, 0x0a, 0x49, 0x0a, 0x4a, 0x41, 0x60, 0x01, 0x21, 0x0c, 0x20, 0xd0, 0xf7, 0xc8, 0xfe, 0x2c, 0x1c, 0x30, 0x34, 0x0c, 0x3d, 0x00, 0x20, 0xd0, 0xf7, 0x4a, 0xf9, 0x20, 0x80, 0x0c, 0x3c, 0x3c, 0x00, 0xc8, 0x29, 0x04, 0x00, 0xac, 0x42, 0xf8, 0xd1, 0xb0, 0xbd, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0x20, 0xa1, 0x07, 0x00, 0x35, 0xcd, 0x00, 0x00, 0x08, 0x49, 0x00, 0x20, 0x0c, 0x22, 0x42, 0x43, 0x52, 0x18, 0x10, 0x71, 0x01, 0x30, 0x05, 0x28, 0xf8, 0xdb, 0x04, 0x48, 0x00, 0x21, 0x08, 0x38, 0x01, 0x70, 0x41, 0x60, 0xff, 0x21, 0x41, 0x70, 0x70, 0x47, 0x00, 0x00, 0x74, 0x7a, 0x01, 0x00, 0x3c, 0x00, 0x04, 0x2a, 0x04, 0x00, 0x80, 0xb5, 0x78, 0x21, 0x01, 0x48, 0xbd, 0xf7, 0x47, 0xfd, 0x80, 0xbd, 0xc4, 0x7b, 0x01, 0x00, 0x80, 0xb5, 0xca, 0xf7, 0x97, 0xfa, 0x80, 0xbd, 0x70, 0x47, 0x00, 0x00, 0x10, 0xb5, 0x0b, 0x4c, 0xff, 0x21, 0x05, 0x31, 0x20, 0x1c, 0xbd, 0xf7, 0x37, 0xfd, 0x09, 0x48, 0xf0, 0x21, 0x08, 0x51, 0x20, 0x1c, 0x40, 0x30, 0xc5, 0xf7, 0x8e, 0xf9, 0x6c, 0x21, 0x06, 0x48, 0x3c, 0x00, 0x40, 0x2a, 0x04, 0x00, 0xbd, 0xf7, 0x2c, 0xfd, 0x04, 0x48, 0xc0, 0x21, 0x6c, 0x30, 0xbd, 0xf7, 0x27, 0xfd, 0x10, 0xbd, 0xc4, 0x69, 0x01, 0x00, 0xb0, 0xd9, 0x01, 0x00, 0xc8, 0x6a, 0x01, 0x00, 0xb0, 0xb5, 0x0b, 0x4d, 0x00, 0x24, 0x1c, 0x20, 0x60, 0x43, 0x40, 0x19, 0x6c, 0x30, 0xc3, 0xf7, 0x0f, 0xfe, 0x01, 0x34, 0x04, 0x2c, 0xf6, 0xdb, 0xcc, 0xf7, 0x6e, 0xfc, 0xa8, 0x63, 0xc7, 0xf7, 0x3c, 0x00, 0x7c, 0x2a, 0x04, 0x00, 0x75, 0xf9, 0x04, 0x48, 0xc9, 0xf7, 0x1c, 0xfc, 0x03, 0x48, 0xcf, 0xf7, 0x03, 0xfa, 0xb0, 0xbd, 0xc4, 0x69, 0x01, 0x00, 0xfd, 0x80, 0x00, 0x00, 0xe1, 0x22, 0x01, 0x00, 0x10, 0xb5, 0x05, 0x4c, 0x00, 0x20, 0x20, 0x80, 0x03, 0x48, 0x06, 0x21, 0x08, 0x30, 0xbd, 0xf7, 0xd5, 0xfc, 0x14, 0x20, 0x60, 0x60, 0x10, 0xbd, 0x98, 0x7c, 0x01, 0x00, 0x10, 0xb5, 0x08, 0x4c, 0x3c, 0x00, 0xb8, 0x2a, 0x04, 0x00, 0x00, 0x20, 0x20, 0x80, 0x60, 0x80, 0x06, 0x48, 0x06, 0x21, 0x0c, 0x30, 0xbd, 0xf7, 0xc6, 0xfc, 0x03, 0x48, 0x06, 0x21, 0x12, 0x30, 0xbd, 0xf7, 0xc1, 0xfc, 0x14, 0x20, 0xa0, 0x60, 0x10, 0xbd, 0x58, 0x7c, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x0d, 0x20, 0x05, 0x4a, 0xd0, 0xf7, 0x2e, 0xfe, 0x04, 0x48, 0xc8, 0xf7, 0x1f, 0xfc, 0x04, 0x48, 0x3c, 0x00, 0xf4, 0x2a, 0x04, 0x00, 0xca, 0xf7, 0x44, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x31, 0xd4, 0x00, 0x00, 0x51, 0xb1, 0x00, 0x00, 0x09, 0xb1, 0x00, 0x00, 0x08, 0x49, 0x80, 0xb5, 0x00, 0x20, 0x08, 0x60, 0xff, 0xf7, 0xd0, 0xff, 0xff, 0xf7, 0xc0, 0xff, 0xff, 0xf7, 0x04, 0xfc, 0x00, 0xf0, 0x4a, 0xf8, 0xff, 0xf7, 0x0a, 0xfc, 0x00, 0xf0, 0x3c, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0xe4, 0x65, 0x01, 0x00, 0x3c, 0x00, 0x30, 0x2b, 0x04, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x29, 0xf8, 0x00, 0xf0, 0x1b, 0xf8, 0x00, 0xf0, 0x51, 0xf8, 0x00, 0xf0, 0x31, 0xf8, 0x80, 0xbd, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0xff, 0x21, 0x89, 0x31, 0x02, 0x48, 0xbd, 0xf7, 0xa2, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0xdc, 0x71, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x49, 0x08, 0x20, 0xcf, 0xf7, 0x11, 0xfc, 0x80, 0xbd, 0x3c, 0x00, 0x6c, 0x2b, 0x04, 0x00, 0x59, 0xd9, 0x00, 0x00, 0x80, 0xb5, 0x03, 0x48, 0xcf, 0xf7, 0x4c, 0xf9, 0x02, 0x49, 0x48, 0x80, 0x80, 0xbd, 0x00, 0x00, 0x8d, 0x1f, 0x00, 0x00, 0x98, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x03, 0x48, 0xcf, 0xf7, 0x40, 0xf9, 0x02, 0x49, 0x88, 0x80, 0x80, 0xbd, 0x00, 0x00, 0xd5, 0x23, 0x00, 0x00, 0x58, 0x7c, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x02, 0x48, 0x3c, 0x00, 0xa8, 0x2b, 0x04, 0x00, 0xca, 0xf7, 0xe4, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x71, 0xe0, 0x00, 0x00, 0x80, 0xb5, 0xcc, 0xf7, 0xa5, 0xfb, 0x02, 0x21, 0x0f, 0x20, 0x06, 0x4a, 0xd0, 0xf7, 0xc2, 0xfd, 0x14, 0x21, 0x05, 0x48, 0xbd, 0xf7, 0x68, 0xfc, 0x03, 0x48, 0x78, 0x21, 0x14, 0x30, 0xbd, 0xf7, 0x63, 0xfc, 0x80, 0xbd, 0x35, 0xe2, 0x00, 0x00, 0x84, 0x66, 0x01, 0x00, 0x80, 0xb5, 0xcc, 0xf7, 0x3c, 0x00, 0xe4, 0x2b, 0x04, 0x00, 0xb7, 0xfb, 0x05, 0x49, 0x08, 0x61, 0x05, 0x49, 0x0e, 0x20, 0xcf, 0xf7, 0xcd, 0xfb, 0x04, 0x49, 0x08, 0x20, 0xcf, 0xf7, 0xc9, 0xfb, 0x80, 0xbd, 0xec, 0x65, 0x01, 0x00, 0x01, 0x02, 0x01, 0x00, 0xc1, 0x2e, 0x00, 0x00, 0x01, 0x49, 0x00, 0x20, 0x08, 0x70, 0x70, 0x47, 0x40, 0xd9, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x01, 0x49, 0x00, 0x20, 0x08, 0x70, 0x70, 0x47, 0x3c, 0x00, 0x20, 0x2c, 0x04, 0x00, 0xa0, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x07, 0x48, 0xc8, 0xf7, 0xf2, 0xff, 0x06, 0x49, 0x48, 0x60, 0x06, 0x48, 0xc0, 0xf7, 0x07, 0xfb, 0x06, 0x48, 0xc0, 0xf7, 0x86, 0xfb, 0x05, 0x48, 0xc9, 0xf7, 0xa3, 0xfa, 0x80, 0xbd, 0xa9, 0xe4, 0x00, 0x00, 0xa0, 0x79, 0x01, 0x00, 0xb9, 0xe4, 0x00, 0x00, 0x85, 0x2e, 0x00, 0x00, 0x81, 0xe4, 0x00, 0x00, 0x07, 0x48, 0x80, 0xb5, 0x3c, 0x00, 0x5c, 0x2c, 0x04, 0x00, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x0e, 0xc0, 0x08, 0xc0, 0x10, 0x38, 0xc8, 0x21, 0x01, 0x60, 0x00, 0x21, 0x0c, 0x38, 0x02, 0x4a, 0xcc, 0xf7, 0x61, 0xfb, 0x80, 0xbd, 0xd0, 0x60, 0x01, 0x00, 0xfd, 0xe5, 0x00, 0x00, 0x80, 0xb5, 0xcc, 0xf7, 0x67, 0xfb, 0x04, 0x49, 0x08, 0x60, 0x01, 0x1c, 0x02, 0x48, 0x04, 0x30, 0xcc, 0xf7, 0x86, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x98, 0x2c, 0x04, 0x00, 0xc0, 0x60, 0x01, 0x00, 0x09, 0x48, 0x80, 0xb5, 0x0a, 0x21, 0x01, 0x70, 0x41, 0x70, 0x08, 0x49, 0x08, 0x4a, 0x81, 0x60, 0x00, 0x21, 0xc1, 0x60, 0x52, 0x79, 0x82, 0x70, 0x01, 0x61, 0x41, 0x61, 0x28, 0x21, 0x18, 0x30, 0xbd, 0xf7, 0xee, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x7c, 0x78, 0x01, 0x00, 0xa0, 0x86, 0x01, 0x00, 0x0c, 0x5a, 0x01, 0x00, 0xf8, 0xb5, 0x0f, 0x49, 0x3c, 0x00, 0xd4, 0x2c, 0x04, 0x00, 0x0f, 0x48, 0x0d, 0x88, 0x4f, 0x88, 0x06, 0x79, 0x00, 0x24, 0x30, 0x1b, 0x68, 0x43, 0x68, 0x23, 0x0c, 0x49, 0x58, 0x43, 0x41, 0x18, 0x7d, 0x20, 0xc0, 0x00, 0xbd, 0xf7, 0x0f, 0xfd, 0x61, 0x00, 0x09, 0x4a, 0xa6, 0x42, 0x50, 0x52, 0x00, 0xd1, 0x3d, 0x1c, 0x01, 0x34, 0x24, 0x06, 0x24, 0x0e, 0x10, 0x2c, 0xea, 0xd3, 0x05, 0x49, 0x01, 0x20, 0x08, 0x61, 0xf8, 0xbd, 0x3c, 0x00, 0x10, 0x2d, 0x04, 0x00, 0xf6, 0x59, 0x01, 0x00, 0x0c, 0x5a, 0x01, 0x00, 0x34, 0x44, 0x0f, 0x00, 0x12, 0x5a, 0x01, 0x00, 0x7c, 0x78, 0x01, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0xe7, 0xfa, 0x02, 0x49, 0x01, 0x20, 0x08, 0x61, 0x80, 0xbd, 0x00, 0x00, 0x7c, 0x78, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x08, 0x1c, 0x0f, 0x49, 0x49, 0x79, 0x00, 0x29, 0x01, 0xd1, 0x0e, 0x4b, 0x00, 0xe0, 0x0e, 0x4b, 0x3c, 0x00, 0x4c, 0x2d, 0x04, 0x00, 0x00, 0x2c, 0x07, 0xd0, 0x04, 0x21, 0x11, 0x80, 0x0a, 0x1c, 0x01, 0x24, 0x19, 0x1c, 0xbd, 0xf7, 0xcd, 0xfb, 0x0a, 0xe0, 0x01, 0x24, 0x01, 0x1c, 0x18, 0x1c, 0x12, 0x88, 0xbd, 0xf7, 0xc6, 0xfb, 0x00, 0xf0, 0xc4, 0xfa, 0x05, 0x49, 0x01, 0x20, 0x08, 0x61, 0x20, 0x1c, 0x10, 0xbd, 0x00, 0x00, 0x0c, 0x5a, 0x01, 0x00, 0xfe, 0x59, 0x01, 0x00, 0xfa, 0x59, 0x01, 0x00, 0x3c, 0x00, 0x88, 0x2d, 0x04, 0x00, 0x7c, 0x78, 0x01, 0x00, 0x0d, 0x48, 0x8c, 0xb5, 0xc1, 0x88, 0x00, 0xab, 0x0c, 0x4a, 0x99, 0x80, 0x01, 0x89, 0x04, 0x20, 0xd9, 0x80, 0x18, 0x80, 0x02, 0x21, 0x13, 0x20, 0xd0, 0xf7, 0xd0, 0xfc, 0x00, 0xf0, 0xa6, 0xfa, 0x07, 0x49, 0x01, 0x20, 0x08, 0x61, 0xff, 0xf7, 0x8d, 0xff, 0x6a, 0x46, 0x01, 0xa9, 0x00, 0x20, 0xff, 0xf7, 0xbc, 0xff, 0x8c, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0xc4, 0x2d, 0x04, 0x00, 0xf4, 0x59, 0x01, 0x00, 0x95, 0xf9, 0x00, 0x00, 0x7c, 0x78, 0x01, 0x00, 0xf8, 0xb5, 0x13, 0x4e, 0x01, 0x25, 0xb5, 0x70, 0x05, 0x20, 0xf0, 0x70, 0x11, 0x49, 0x10, 0x48, 0x0e, 0xc9, 0x2c, 0x30, 0x0e, 0xc0, 0x00, 0x20, 0x70, 0x61, 0x0f, 0x48, 0x0f, 0x49, 0x10, 0x4f, 0x00, 0x24, 0x48, 0x60, 0xa0, 0x00, 0x39, 0x58, 0x20, 0x1c, 0xd1, 0xf7, 0xd7, 0xf8, 0x01, 0x34, 0x3c, 0x00, 0x00, 0x2e, 0x04, 0x00, 0x10, 0x2c, 0xf7, 0xd3, 0x06, 0x4c, 0x0b, 0x4a, 0x20, 0x34, 0x20, 0x1c, 0x0a, 0x49, 0xb5, 0x60, 0xcc, 0xf7, 0x92, 0xfa, 0xcc, 0xf7, 0x9e, 0xfa, 0x30, 0x61, 0x20, 0x60, 0xf8, 0xbd, 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, 0xb0, 0x58, 0x01, 0x00, 0x04, 0x18, 0x02, 0x00, 0x60, 0x00, 0x07, 0x00, 0xd4, 0x44, 0x01, 0x00, 0x45, 0xfa, 0x00, 0x00, 0x71, 0xfa, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0x2e, 0x04, 0x00, 0x0c, 0x49, 0x30, 0xb5, 0x00, 0x23, 0xcc, 0x56, 0x0b, 0x4b, 0x00, 0x20, 0xf0, 0x25, 0x1a, 0x5c, 0x11, 0x07, 0x09, 0x0f, 0x09, 0x19, 0x0f, 0x29, 0x01, 0xdd, 0x0f, 0x21, 0x02, 0xe0, 0x00, 0x29, 0x00, 0xda, 0x00, 0x21, 0x2a, 0x40, 0x51, 0x18, 0x19, 0x54, 0x01, 0x30, 0x0e, 0x28, 0xee, 0xdb, 0x30, 0xbd, 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, 0xc0, 0x58, 0x01, 0x00, 0x3c, 0x00, 0x78, 0x2e, 0x04, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x00, 0x28, 0x08, 0xd0, 0x01, 0x24, 0x14, 0x80, 0x05, 0x20, 0xcc, 0xf7, 0xb5, 0xf8, 0x80, 0x03, 0xc0, 0x0f, 0x28, 0x70, 0x07, 0xe0, 0x28, 0x78, 0x01, 0x22, 0x41, 0x04, 0x52, 0x04, 0x05, 0x20, 0xd0, 0xf7, 0xae, 0xfd, 0x01, 0x24, 0x20, 0x1c, 0xb0, 0xbd, 0x00, 0x00, 0x98, 0xb5, 0x05, 0x4c, 0x60, 0x68, 0xcc, 0xf7, 0xf5, 0xfd, 0x00, 0x90, 0x3c, 0x00, 0xb4, 0x2e, 0x04, 0x00, 0x00, 0xab, 0x18, 0x88, 0xe0, 0x80, 0xce, 0xf7, 0xfb, 0xff, 0x98, 0xbd, 0xa0, 0x58, 0x01, 0x00, 0x38, 0xb5, 0x03, 0x1c, 0x08, 0x1c, 0x00, 0x24, 0x00, 0x2b, 0x17, 0x4d, 0x07, 0xd0, 0x0e, 0x21, 0x11, 0x80, 0x0a, 0x1c, 0x01, 0x24, 0x29, 0x1c, 0xbd, 0xf7, 0x0c, 0xfb, 0x22, 0xe0, 0x11, 0x88, 0x04, 0x29, 0x17, 0xd1, 0x01, 0x1c, 0x68, 0x46, 0x12, 0x88, 0xbd, 0xf7, 0x3c, 0x00, 0xf0, 0x2e, 0x04, 0x00, 0x03, 0xfb, 0x00, 0x98, 0x00, 0x28, 0x01, 0xdb, 0x32, 0x30, 0x00, 0xe0, 0x32, 0x38, 0x00, 0x90, 0x01, 0x1c, 0x64, 0x20, 0xbd, 0xf7, 0x98, 0xfb, 0x01, 0x06, 0x09, 0x16, 0x00, 0x90, 0x0e, 0x22, 0x28, 0x1c, 0xbd, 0xf7, 0x85, 0xfb, 0x06, 0xe0, 0x0e, 0x29, 0x05, 0xd1, 0x0a, 0x1c, 0x01, 0x1c, 0x28, 0x1c, 0xbd, 0xf7, 0xe9, 0xfa, 0x01, 0x24, 0x20, 0x1c, 0x38, 0xbd, 0x3c, 0x00, 0x2c, 0x2f, 0x04, 0x00, 0xda, 0x59, 0x01, 0x00, 0x38, 0xb5, 0x03, 0x1c, 0x08, 0x1c, 0x00, 0x24, 0x00, 0x2b, 0x17, 0x4d, 0x07, 0xd0, 0x0e, 0x21, 0x11, 0x80, 0x0a, 0x1c, 0x01, 0x24, 0x29, 0x1c, 0xbd, 0xf7, 0xd6, 0xfa, 0x22, 0xe0, 0x11, 0x88, 0x04, 0x29, 0x17, 0xd1, 0x01, 0x1c, 0x68, 0x46, 0x12, 0x88, 0xbd, 0xf7, 0xcd, 0xfa, 0x00, 0x98, 0x00, 0x28, 0x01, 0xdb, 0x32, 0x30, 0x00, 0xe0, 0x3c, 0x00, 0x68, 0x2f, 0x04, 0x00, 0x32, 0x38, 0x00, 0x90, 0x01, 0x1c, 0x64, 0x20, 0xbd, 0xf7, 0x62, 0xfb, 0x01, 0x06, 0x09, 0x16, 0x00, 0x90, 0x0e, 0x22, 0x28, 0x1c, 0xbd, 0xf7, 0x4f, 0xfb, 0x06, 0xe0, 0x0e, 0x29, 0x05, 0xd1, 0x0a, 0x1c, 0x01, 0x1c, 0x28, 0x1c, 0xbd, 0xf7, 0xb3, 0xfa, 0x01, 0x24, 0x20, 0x1c, 0x38, 0xbd, 0xcc, 0x59, 0x01, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x01, 0x78, 0x00, 0x20, 0x3c, 0x00, 0xa4, 0x2f, 0x04, 0x00, 0xcc, 0xf7, 0xb4, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xa6, 0x58, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x02, 0x49, 0x03, 0x20, 0x08, 0x70, 0x00, 0x20, 0x48, 0x70, 0x70, 0x47, 0x9c, 0x73, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x11, 0x20, 0x02, 0x4a, 0xd0, 0xf7, 0xbc, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xa1, 0xfe, 0x00, 0x00, 0xf0, 0xb5, 0x0b, 0x4f, 0x1c, 0x1c, 0x00, 0x23, 0x3c, 0x00, 0xe0, 0x2f, 0x04, 0x00, 0xfd, 0x56, 0x2b, 0x1c, 0x06, 0x2d, 0x01, 0xd1, 0x01, 0x20, 0xf0, 0xbd, 0x06, 0x4e, 0x05, 0x1c, 0xd8, 0x00, 0x34, 0x36, 0x35, 0x54, 0x80, 0x19, 0x41, 0x70, 0x82, 0x70, 0x44, 0x60, 0x58, 0x1c, 0x38, 0x70, 0x00, 0x20, 0xf0, 0xbd, 0x00, 0x00, 0x98, 0x5a, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x0c, 0x48, 0x00, 0xf0, 0x21, 0xf9, 0x60, 0x78, 0xff, 0x28, 0x04, 0xd0, 0x3c, 0x00, 0x1c, 0x30, 0x04, 0x00, 0x01, 0x23, 0xe0, 0x56, 0x06, 0x21, 0x00, 0xf0, 0xcd, 0xf8, 0x08, 0x4a, 0x01, 0x21, 0x10, 0x78, 0x08, 0x43, 0x07, 0x49, 0x08, 0x70, 0x20, 0x23, 0x18, 0x43, 0x08, 0x70, 0x80, 0x23, 0x18, 0x43, 0x10, 0x70, 0x08, 0x70, 0x10, 0xbd, 0x00, 0x00, 0x91, 0x9b, 0x00, 0x00, 0xe0, 0x60, 0x01, 0x00, 0x04, 0x00, 0x07, 0x00, 0x10, 0xb5, 0x0a, 0x49, 0x04, 0x1c, 0x08, 0x78, 0x3c, 0x00, 0x58, 0x30, 0x04, 0x00, 0x40, 0x08, 0x40, 0x00, 0x08, 0x70, 0x08, 0x49, 0x08, 0x70, 0x08, 0x48, 0x00, 0xf0, 0xf8, 0xf8, 0x60, 0x78, 0xff, 0x28, 0x04, 0xd0, 0x01, 0x23, 0xe0, 0x56, 0x05, 0x21, 0x00, 0xf0, 0xa4, 0xf8, 0x10, 0xbd, 0x00, 0x00, 0xe0, 0x60, 0x01, 0x00, 0x04, 0x00, 0x07, 0x00, 0x91, 0x9b, 0x00, 0x00, 0x03, 0x48, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x0e, 0xc0, 0x08, 0xc0, 0x3c, 0x00, 0x94, 0x30, 0x04, 0x00, 0x70, 0x47, 0x00, 0x00, 0xe8, 0x60, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x10, 0xb5, 0x07, 0x4c, 0x00, 0x20, 0x60, 0x60, 0x20, 0x80, 0xe0, 0x60, 0x02, 0x21, 0x14, 0x20, 0x04, 0x4a, 0xd0, 0xf7, 0x49, 0xfb, 0x02, 0x48, 0x10, 0x30, 0xa0, 0x60, 0x10, 0xbd, 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, 0x05, 0x1d, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x10, 0xb5, 0x48, 0x21, 0x3c, 0x00, 0xd0, 0x30, 0x04, 0x00, 0x0a, 0x48, 0xbd, 0xf7, 0xe3, 0xf9, 0x09, 0x4c, 0xe0, 0x21, 0x48, 0x34, 0x20, 0x1c, 0xbd, 0xf7, 0xdd, 0xf9, 0x00, 0x20, 0xc1, 0x00, 0x09, 0x19, 0x0a, 0x1c, 0x08, 0x32, 0x01, 0x30, 0x1b, 0x28, 0x4a, 0x60, 0xf7, 0xd3, 0x01, 0x48, 0x04, 0x38, 0x04, 0x60, 0x10, 0xbd, 0x68, 0x5b, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x23, 0x20, 0x02, 0x4a, 0xd0, 0xf7, 0x1e, 0xfb, 0x3c, 0x00, 0x0c, 0x31, 0x04, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x45, 0x23, 0x01, 0x00, 0x80, 0xb5, 0xff, 0xf7, 0x6b, 0xf8, 0x80, 0xbd, 0x70, 0x47, 0x00, 0x00, 0xf8, 0xb5, 0x01, 0x20, 0x1d, 0x49, 0xc0, 0x07, 0x48, 0x60, 0x1d, 0x49, 0xff, 0x20, 0x08, 0x73, 0x1c, 0x4e, 0x10, 0x20, 0x30, 0x60, 0x05, 0x01, 0x35, 0x60, 0x1b, 0x4c, 0x80, 0x21, 0x20, 0x1c, 0xbd, 0xf7, 0xac, 0xf9, 0x00, 0x21, 0x19, 0x4a, 0x3c, 0x00, 0x48, 0x31, 0x04, 0x00, 0x15, 0x4f, 0x00, 0x20, 0x0b, 0x01, 0x1b, 0x19, 0x5a, 0x60, 0xcb, 0x00, 0xdb, 0x19, 0x18, 0x74, 0x01, 0x31, 0x08, 0x29, 0xf6, 0xdb, 0x0f, 0x4c, 0xfa, 0x21, 0x21, 0x80, 0x12, 0x49, 0x61, 0x80, 0xa0, 0x60, 0x6a, 0x46, 0x11, 0x49, 0x04, 0x20, 0xbd, 0xf7, 0x30, 0xff, 0x6a, 0x46, 0x10, 0x49, 0x08, 0x20, 0xbd, 0xf7, 0x2b, 0xff, 0x10, 0x20, 0x70, 0x60, 0x75, 0x60, 0x3c, 0x00, 0x84, 0x31, 0x04, 0x00, 0x60, 0x68, 0x02, 0x21, 0x08, 0x43, 0x60, 0x60, 0x0b, 0x49, 0x06, 0x4a, 0x08, 0x1c, 0x10, 0x30, 0x08, 0x3a, 0x03, 0xc2, 0xf8, 0xbd, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x60, 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0xac, 0x73, 0x01, 0x00, 0xd1, 0x75, 0x00, 0x00, 0x20, 0x4e, 0x00, 0x00, 0x05, 0x2c, 0x01, 0x00, 0x11, 0x2c, 0x01, 0x00, 0x00, 0xa0, 0x07, 0x00, 0x3c, 0x00, 0xc0, 0x31, 0x04, 0x00, 0x70, 0xb5, 0x0e, 0x1c, 0x00, 0x24, 0xc4, 0xf7, 0x5b, 0xfe, 0x00, 0x28, 0x3b, 0xd0, 0x45, 0x68, 0xff, 0x2d, 0x38, 0xd0, 0x0c, 0x2e, 0x28, 0xd2, 0x01, 0xa3, 0x9b, 0x5d, 0x5b, 0x00, 0x9f, 0x44, 0x05, 0x07, 0x09, 0x0b, 0x0d, 0x10, 0x13, 0x16, 0x18, 0x1b, 0x1e, 0x21, 0x18, 0x24, 0x20, 0xe0, 0x30, 0x24, 0x1e, 0xe0, 0x60, 0x24, 0x1c, 0xe0, 0xc0, 0x24, 0x1a, 0xe0, 0x3c, 0x00, 0xfc, 0x31, 0x04, 0x00, 0xff, 0x24, 0x81, 0x34, 0x17, 0xe0, 0x09, 0x24, 0xa4, 0x01, 0x14, 0xe0, 0x09, 0x24, 0xe4, 0x01, 0x11, 0xe0, 0x0f, 0x4c, 0x0f, 0xe0, 0x09, 0x24, 0x24, 0x02, 0x0c, 0xe0, 0x09, 0x24, 0x64, 0x02, 0x09, 0xe0, 0x03, 0x24, 0xe4, 0x02, 0x06, 0xe0, 0x09, 0x24, 0xa4, 0x02, 0x03, 0xe0, 0x09, 0x21, 0x9e, 0x20, 0xbe, 0xf7, 0x39, 0xf8, 0x60, 0x00, 0x00, 0x19, 0x40, 0x08, 0x3c, 0x00, 0x38, 0x32, 0x04, 0x00, 0x05, 0x49, 0x80, 0x04, 0x40, 0x18, 0x05, 0x4a, 0xa9, 0x00, 0x89, 0x18, 0x48, 0x60, 0x64, 0x20, 0x60, 0x43, 0x70, 0xbd, 0xdc, 0x07, 0x00, 0x00, 0x80, 0x38, 0x01, 0x00, 0x04, 0x00, 0x07, 0x00, 0x02, 0x49, 0x80, 0xb5, 0x08, 0x60, 0xd0, 0xf7, 0x97, 0xf8, 0x80, 0xbd, 0x5c, 0x5b, 0x01, 0x00, 0xf8, 0xb5, 0x00, 0x26, 0x17, 0x4c, 0x17, 0x4b, 0x19, 0x49, 0x26, 0x70, 0x3c, 0x00, 0x74, 0x32, 0x04, 0x00, 0x00, 0x20, 0x14, 0x33, 0x0d, 0x88, 0x15, 0x4e, 0x15, 0x4a, 0x04, 0xe0, 0xc1, 0x00, 0xcf, 0x18, 0x7a, 0x60, 0x5e, 0x50, 0x01, 0x30, 0xa8, 0x42, 0xf8, 0xdb, 0xc6, 0xf7, 0x2b, 0xfd, 0xff, 0x21, 0x11, 0x4d, 0xa5, 0x31, 0x28, 0x1c, 0xbd, 0xf7, 0xff, 0xf8, 0x00, 0x21, 0x28, 0x1c, 0x02, 0x1c, 0x14, 0x32, 0xc2, 0x60, 0x10, 0x1c, 0x01, 0x31, 0x14, 0x29, 0xf8, 0xdb, 0x3c, 0x00, 0xb0, 0x32, 0x04, 0x00, 0x00, 0x26, 0xc6, 0x60, 0x05, 0x48, 0x0c, 0x30, 0x60, 0xc0, 0x09, 0x48, 0x18, 0x21, 0xbd, 0xf7, 0xed, 0xf8, 0x01, 0x20, 0x04, 0x34, 0x41, 0xc4, 0x00, 0x20, 0xf8, 0xbd, 0x70, 0x5d, 0x01, 0x00, 0x09, 0xa0, 0x00, 0x00, 0x30, 0xd9, 0x01, 0x00, 0x56, 0x57, 0x01, 0x00, 0x04, 0x5f, 0x01, 0x00, 0xa8, 0x60, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x20, 0xcf, 0xf7, 0xb6, 0xfc, 0x3c, 0x00, 0xec, 0x32, 0x04, 0x00, 0x01, 0x49, 0x08, 0x80, 0x80, 0xbd, 0x00, 0x00, 0x2c, 0x74, 0x01, 0x00, 0x11, 0x48, 0xf8, 0xb5, 0x41, 0x79, 0x00, 0x29, 0x02, 0xd1, 0x05, 0x78, 0x0f, 0x4e, 0x01, 0xe0, 0x45, 0x78, 0x0f, 0x4e, 0x02, 0x23, 0xf7, 0x5e, 0x00, 0x24, 0x60, 0x1b, 0x78, 0x43, 0x64, 0x23, 0x0c, 0x49, 0x58, 0x43, 0x41, 0x18, 0x7d, 0x20, 0xc0, 0x00, 0xbd, 0xf7, 0xf5, 0xf9, 0x61, 0x00, 0x3c, 0x00, 0x28, 0x33, 0x04, 0x00, 0x09, 0x4a, 0xac, 0x42, 0x50, 0x52, 0x01, 0xd1, 0x00, 0x23, 0xf7, 0x5e, 0x01, 0x34, 0x24, 0x06, 0x24, 0x0e, 0x10, 0x2c, 0xe9, 0xd3, 0xf8, 0xbd, 0x0c, 0x5a, 0x01, 0x00, 0xfe, 0x59, 0x01, 0x00, 0xfa, 0x59, 0x01, 0x00, 0x34, 0x44, 0x0f, 0x00, 0x32, 0x5a, 0x01, 0x00, 0x38, 0xb5, 0x10, 0x4c, 0xbe, 0x25, 0x25, 0x73, 0x20, 0x7a, 0x18, 0x21, 0x88, 0x43, 0x20, 0x72, 0x3c, 0x00, 0x64, 0x33, 0x04, 0x00, 0x6a, 0x46, 0x0d, 0x49, 0x0d, 0x20, 0xbd, 0xf7, 0x33, 0xfe, 0x01, 0x20, 0x0b, 0x49, 0x40, 0x03, 0x08, 0x60, 0x48, 0x60, 0x25, 0x73, 0x2d, 0x20, 0xc0, 0x03, 0x20, 0x60, 0x25, 0x73, 0x20, 0x7a, 0x10, 0x21, 0x08, 0x43, 0x20, 0x72, 0x06, 0x48, 0x06, 0x49, 0x08, 0x60, 0x00, 0x20, 0x48, 0x60, 0x38, 0xbd, 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, 0x8d, 0x3e, 0x01, 0x00, 0x24, 0x00, 0xa0, 0x33, 0x04, 0x00, 0x00, 0x10, 0x07, 0x00, 0x00, 0x87, 0x93, 0x03, 0x04, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x15, 0x20, 0x02, 0x4a, 0xd0, 0xf7, 0xc8, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x0d, 0x3e, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x04, 0x00, 0x00, 0x60, 0x04, 0x00, 0x44, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x20, 0x07, 0x00, 0xff, 0xff, 0xff, 0xff, }; const uint32_t fw_len = sizeof(fw_buf) / sizeof(fw_buf[0]); ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifi_dnld/wifi_dnld.cproj ================================================  2.0 6.0 com.Atmel.AVRGCC32 eb9606bc-de32-4edd-9cda-ae3bf36977a2 wifi_dnld AT32uc3a1256 none Importer Executable C wifi_dnld .elf $(MSBuildProjectDirectory)\$(Configuration) Native true false 0 3.5.0 True True True True false false BOARD=ARDUINO ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS ../src/CONFIG ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR ../src/SOFTWARE_FRAMEWORK/UTILS ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC ../src/SOFTWARE_FRAMEWORK/BOARDS ../src -fdata-sections true false false false false true false false false false false false true false false false false -c -fmessage-length=0 false true false false false false newlib_addons-at32ucr2-speed_opt ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS ../src/SOFTWARE_FRAMEWORK/BOARDS true false false false false true true ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS ../src/CONFIG ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR ../src/SOFTWARE_FRAMEWORK/UTILS ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC ../src/SOFTWARE_FRAMEWORK/BOARDS false -Wa,-g ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS ../src/CONFIG ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR ../src/SOFTWARE_FRAMEWORK/UTILS ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC ../src/SOFTWARE_FRAMEWORK/BOARDS false false True True True True false false BOARD=ARDUINO ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS ../src/CONFIG ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR ../src/SOFTWARE_FRAMEWORK/UTILS ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC ../src/SOFTWARE_FRAMEWORK/BOARDS ../src -fdata-sections true false false false false true false false false false Maximum (-g3) false false true false false false false -c -fmessage-length=0 false true false false false false newlib_addons-at32ucr2-speed_opt ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS ../src/SOFTWARE_FRAMEWORK/BOARDS true false false false false true true ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS ../src/CONFIG ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR ../src/SOFTWARE_FRAMEWORK/UTILS ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC ../src/SOFTWARE_FRAMEWORK/BOARDS false Default (-g) -Wa,-g ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS ../src/CONFIG ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR ../src/SOFTWARE_FRAMEWORK/UTILS ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC ../src/SOFTWARE_FRAMEWORK/BOARDS false false Default (-Wa,-g) compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile compile ================================================ FILE: external/arduino/avr/firmwares/wifishield/wifishield.atsln ================================================  Microsoft Visual Studio Solution File, Format Version 11.00 # Atmel Studio Solution File, Format Version 11.00 Project("{54F91283-7BC4-4236-8FF9-10F437C3AD48}") = "wifi_dnld", "wifi_dnld\wifi_dnld.cproj", "{EB9606BC-DE32-4EDD-9CDA-AE3BF36977A2}" EndProject Project("{54F91283-7BC4-4236-8FF9-10F437C3AD48}") = "wifiHD", "wifiHD\wifiHD.cproj", "{417E15DB-488A-4B56-8D4E-FBE832B2B649}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug_512|AVR = Debug_512|AVR Debug|AVR = Debug|AVR Release_512|AVR = Release_512|AVR Release|AVR = Release|AVR EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {EB9606BC-DE32-4EDD-9CDA-AE3BF36977A2}.Debug_512|AVR.ActiveCfg = Debug|AVR {EB9606BC-DE32-4EDD-9CDA-AE3BF36977A2}.Debug_512|AVR.Build.0 = Debug|AVR {EB9606BC-DE32-4EDD-9CDA-AE3BF36977A2}.Debug|AVR.ActiveCfg = Debug|AVR {EB9606BC-DE32-4EDD-9CDA-AE3BF36977A2}.Debug|AVR.Build.0 = Debug|AVR {EB9606BC-DE32-4EDD-9CDA-AE3BF36977A2}.Release_512|AVR.ActiveCfg = Release|AVR {EB9606BC-DE32-4EDD-9CDA-AE3BF36977A2}.Release_512|AVR.Build.0 = Release|AVR {EB9606BC-DE32-4EDD-9CDA-AE3BF36977A2}.Release|AVR.ActiveCfg = Release|AVR {EB9606BC-DE32-4EDD-9CDA-AE3BF36977A2}.Release|AVR.Build.0 = Release|AVR {417E15DB-488A-4B56-8D4E-FBE832B2B649}.Debug_512|AVR.ActiveCfg = Debug_512|AVR {417E15DB-488A-4B56-8D4E-FBE832B2B649}.Debug_512|AVR.Build.0 = Debug_512|AVR {417E15DB-488A-4B56-8D4E-FBE832B2B649}.Debug|AVR.ActiveCfg = Debug|AVR {417E15DB-488A-4B56-8D4E-FBE832B2B649}.Debug|AVR.Build.0 = Debug|AVR {417E15DB-488A-4B56-8D4E-FBE832B2B649}.Release_512|AVR.ActiveCfg = Release_512|AVR {417E15DB-488A-4B56-8D4E-FBE832B2B649}.Release_512|AVR.Build.0 = Release_512|AVR {417E15DB-488A-4B56-8D4E-FBE832B2B649}.Release|AVR.ActiveCfg = Release|AVR {417E15DB-488A-4B56-8D4E-FBE832B2B649}.Release|AVR.Build.0 = Release|AVR EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal ================================================ FILE: external/arduino/avr/libraries/EEPROM/README.md ================================================ ## **EEPROM Library V2.0** for Arduino **Written by:** _Christopher Andrews_. ### **What is the EEPROM library.** Th EEPROM library provides an easy to use interface to interact with the internal non-volatile storage found in AVR based Arduino boards. This library will work on many AVR devices like ATtiny and ATmega chips. ### **How to use it** The EEPROM library is included in your IDE download. To add its functionality to your sketch you'll need to reference the library header file. You do this by adding an include directive to the top of your sketch. ```Arduino #include void setup(){ } void loop(){ } ``` The library provides a global variable named `EEPROM`, you use this variable to access the library functions. The methods provided in the EEPROM class are listed below. You can view all the examples [here](examples/). ### **Library functions** #### **`EEPROM.read( address )`** [[_example_]](examples/eeprom_read/eeprom_read.ino) This function allows you to read a single byte of data from the eeprom. Its only parameter is an `int` which should be set to the address you wish to read. The function returns an `unsigned char` containing the value read. #### **`EEPROM.write( address, value )`** [[_example_]](examples/eeprom_write/eeprom_write.ino) The `write()` method allows you to write a single byte of data to the EEPROM. Two parameters are needed. The first is an `int` containing the address that is to be written, and the second is a the data to be written (`unsigned char`). This function does not return any value. #### **`EEPROM.update( address, value )`** [[_example_]](examples/eeprom_update/eeprom_update.ino) This function is similar to `EEPROM.write()` however this method will only write data if the cell contents pointed to by `address` is different to `value`. This method can help prevent unnecessary wear on the EEPROM cells. This function does not return any value. #### **`EEPROM.get( address, object )`** [[_example_]](examples/eeprom_get/eeprom_get.ino) This function will retrieve any object from the EEPROM. Two parameters are needed to call this function. The first is an `int` containing the address that is to be written, and the second is the object you would like to read. This function returns a reference to the `object` passed in. It does not need to be used and is only returned for conveience. #### **`EEPROM.put( address, object )`** [[_example_]](examples/eeprom_put/eeprom_put.ino) This function will write any object to the EEPROM. Two parameters are needed to call this function. The first is an `int` containing the address that is to be written, and the second is the object you would like to write. This function uses the _update_ method to write its data, and therefore only rewrites changed cells. This function returns a reference to the `object` passed in. It does not need to be used and is only returned for conveience. #### **Subscript operator: `EEPROM[address]`** [[_example_]](examples/eeprom_crc/eeprom_crc.ino) This operator allows using the identifier `EEPROM` like an array. EEPROM cells can be read _and_ **_written_** directly using this method. This operator returns a reference to the EEPROM cell. ```c++ unsigned char val; //Read first EEPROM cell. val = EEPROM[ 0 ]; //Write first EEPROM cell. EEPROM[ 0 ] = val; //Compare contents if( val == EEPROM[ 0 ] ){ //Do something... } ``` #### **`EEPROM.length()`** This function returns an `unsigned int` containing the number of cells in the EEPROM. --- ### **Advanced features** This library uses a component based approach to provide its functionality. This means you can also use these components to design a customized approach. Two background classes are available for use: `EERef` & `EEPtr`. #### **`EERef` class** This object references an EEPROM cell. Its purpose is to mimic a typical byte of RAM, however its storage is the EEPROM. This class has an overhead of two bytes, similar to storing a pointer to an EEPROM cell. ```C++ EERef ref = EEPROM[ 10 ]; //Create a reference to 11th cell. ref = 4; //write to EEPROM cell. unsigned char val = ref; //Read referenced cell. ``` #### **`EEPtr` class** This object is a bidirectional pointer to EEPROM cells represented by `EERef` objects. Just like a normal pointer type, this type can be dereferenced and repositioned using increment/decrement operators. ```C++ EEPtr ptr = 10; //Create a pointer to 11th cell. *ptr = 4; //dereference and write to EEPROM cell. unsigned char val = *ptr; //dereference and read. ptr++; //Move to next EEPROM cell. ``` #### **`EEPROM.begin()`** This function returns an `EEPtr` pointing to the first cell in the EEPROM. This is useful for STL objects, custom iteration and C++11 style ranged for loops. #### **`EEPROM.end()`** This function returns an `EEPtr` pointing at the location after the last EEPROM cell. Used with `begin()` to provide custom iteration. **Note:** The `EEPtr` returned is invalid as it is out of range. Infact the hardware causes wrapping of the address (overflow) and `EEPROM.end()` actually references the first EEPROM cell. ================================================ FILE: external/arduino/avr/libraries/EEPROM/examples/eeprom_clear/eeprom_clear.ino ================================================ /* * EEPROM Clear * * Sets all of the bytes of the EEPROM to 0. * Please see eeprom_iteration for a more in depth * look at how to traverse the EEPROM. * * This example code is in the public domain. */ #include void setup() { // initialize the LED pin as an output. pinMode(13, OUTPUT); /*** Iterate through each byte of the EEPROM storage. Larger AVR processors have larger EEPROM sizes, E.g: - Arduno Duemilanove: 512b EEPROM storage. - Arduino Uno: 1kb EEPROM storage. - Arduino Mega: 4kb EEPROM storage. Rather than hard-coding the length, you should use the pre-provided length function. This will make your code portable to all AVR processors. ***/ for (int i = 0 ; i < EEPROM.length() ; i++) { EEPROM.write(i, 0); } // turn the LED on when we're done digitalWrite(13, HIGH); } void loop() { /** Empty loop. **/ } ================================================ FILE: external/arduino/avr/libraries/EEPROM/examples/eeprom_crc/eeprom_crc.ino ================================================ /*** Written by Christopher Andrews. CRC algorithm generated by pycrc, MIT licence ( https://github.com/tpircher/pycrc ). A CRC is a simple way of checking whether data has changed or become corrupted. This example calculates a CRC value directly on the EEPROM values. The purpose of this example is to highlight how the EEPROM object can be used just like an array. ***/ #include #include void setup() { //Start serial Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } //Print length of data to run CRC on. Serial.print("EEPROM length: "); Serial.println(EEPROM.length()); //Print the result of calling eeprom_crc() Serial.print("CRC32 of EEPROM data: 0x"); Serial.println(eeprom_crc(), HEX); Serial.print("\n\nDone!"); } void loop() { /* Empty loop */ } unsigned long eeprom_crc(void) { const unsigned long crc_table[16] = { 0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c, 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c }; unsigned long crc = ~0L; for (int index = 0 ; index < EEPROM.length() ; ++index) { crc = crc_table[(crc ^ EEPROM[index]) & 0x0f] ^ (crc >> 4); crc = crc_table[(crc ^ (EEPROM[index] >> 4)) & 0x0f] ^ (crc >> 4); crc = ~crc; } return crc; } ================================================ FILE: external/arduino/avr/libraries/EEPROM/examples/eeprom_get/eeprom_get.ino ================================================ /*** eeprom_get example. This shows how to use the EEPROM.get() method. To pre-set the EEPROM data, run the example sketch eeprom_put. This sketch will run without it, however, the values shown will be shown from what ever is already on the EEPROM. This may cause the serial object to print out a large string of garbage if there is no null character inside one of the strings loaded. Written by Christopher Andrews 2015 Released under MIT licence. ***/ #include void setup() { float f = 0.00f; //Variable to store data read from EEPROM. int eeAddress = 0; //EEPROM address to start reading from Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } Serial.print("Read float from EEPROM: "); //Get the float data from the EEPROM at position 'eeAddress' EEPROM.get(eeAddress, f); Serial.println(f, 3); //This may print 'ovf, nan' if the data inside the EEPROM is not a valid float. /*** As get also returns a reference to 'f', you can use it inline. E.g: Serial.print( EEPROM.get( eeAddress, f ) ); ***/ /*** Get can be used with custom structures too. I have separated this into an extra function. ***/ secondTest(); //Run the next test. } struct MyObject { float field1; byte field2; char name[10]; }; void secondTest() { int eeAddress = sizeof(float); //Move address to the next byte after float 'f'. MyObject customVar; //Variable to store custom object read from EEPROM. EEPROM.get(eeAddress, customVar); Serial.println("Read custom object from EEPROM: "); Serial.println(customVar.field1); Serial.println(customVar.field2); Serial.println(customVar.name); } void loop() { /* Empty loop */ } ================================================ FILE: external/arduino/avr/libraries/EEPROM/examples/eeprom_iteration/eeprom_iteration.ino ================================================ /*** eeprom_iteration example. A set of example snippets highlighting the simplest methods for traversing the EEPROM. Running this sketch is not necessary, this is simply highlighting certain programming methods. Written by Christopher Andrews 2015 Released under MIT licence. ***/ #include void setup() { /*** Iterate the EEPROM using a for loop. ***/ for (int index = 0 ; index < EEPROM.length() ; index++) { //Add one to each cell in the EEPROM EEPROM[ index ] += 1; } /*** Iterate the EEPROM using a while loop. ***/ int index = 0; while (index < EEPROM.length()) { //Add one to each cell in the EEPROM EEPROM[ index ] += 1; index++; } /*** Iterate the EEPROM using a do-while loop. ***/ int idx = 0; //Used 'idx' to avoid name conflict with 'index' above. do { //Add one to each cell in the EEPROM EEPROM[ idx ] += 1; idx++; } while (idx < EEPROM.length()); } //End of setup function. void loop() {} ================================================ FILE: external/arduino/avr/libraries/EEPROM/examples/eeprom_put/eeprom_put.ino ================================================ /*** eeprom_put example. This shows how to use the EEPROM.put() method. Also, this sketch will pre-set the EEPROM data for the example sketch eeprom_get. Note, unlike the single byte version EEPROM.write(), the put method will use update semantics. As in a byte will only be written to the EEPROM if the data is actually different. Written by Christopher Andrews 2015 Released under MIT licence. ***/ #include struct MyObject { float field1; byte field2; char name[10]; }; void setup() { Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } float f = 123.456f; //Variable to store in EEPROM. int eeAddress = 0; //Location we want the data to be put. //One simple call, with the address first and the object second. EEPROM.put(eeAddress, f); Serial.println("Written float data type!"); /** Put is designed for use with custom structures also. **/ //Data to store. MyObject customVar = { 3.14f, 65, "Working!" }; eeAddress += sizeof(float); //Move address to the next byte after float 'f'. EEPROM.put(eeAddress, customVar); Serial.print("Written custom data type! \n\nView the example sketch eeprom_get to see how you can retrieve the values!"); } void loop() { /* Empty loop */ } ================================================ FILE: external/arduino/avr/libraries/EEPROM/examples/eeprom_read/eeprom_read.ino ================================================ /* * EEPROM Read * * Reads the value of each byte of the EEPROM and prints it * to the computer. * This example code is in the public domain. */ #include // start reading from the first byte (address 0) of the EEPROM int address = 0; byte value; void setup() { // initialize serial and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } } void loop() { // read a byte from the current address of the EEPROM value = EEPROM.read(address); Serial.print(address); Serial.print("\t"); Serial.print(value, DEC); Serial.println(); /*** Advance to the next address, when at the end restart at the beginning. Larger AVR processors have larger EEPROM sizes, E.g: - Arduno Duemilanove: 512b EEPROM storage. - Arduino Uno: 1kb EEPROM storage. - Arduino Mega: 4kb EEPROM storage. Rather than hard-coding the length, you should use the pre-provided length function. This will make your code portable to all AVR processors. ***/ address = address + 1; if (address == EEPROM.length()) { address = 0; } /*** As the EEPROM sizes are powers of two, wrapping (preventing overflow) of an EEPROM address is also doable by a bitwise and of the length - 1. ++address &= EEPROM.length() - 1; ***/ delay(500); } ================================================ FILE: external/arduino/avr/libraries/EEPROM/examples/eeprom_update/eeprom_update.ino ================================================ /*** EEPROM Update method Stores values read from analog input 0 into the EEPROM. These values will stay in the EEPROM when the board is turned off and may be retrieved later by another sketch. If a value has not changed in the EEPROM, it is not overwritten which would reduce the life span of the EEPROM unnecessarily. Released using MIT licence. ***/ #include /** the current address in the EEPROM (i.e. which byte we're going to write to next) **/ int address = 0; void setup() { /** EMpty setup **/ } void loop() { /*** need to divide by 4 because analog inputs range from 0 to 1023 and each byte of the EEPROM can only hold a value from 0 to 255. ***/ int val = analogRead(0) / 4; /*** Update the particular EEPROM cell. these values will remain there when the board is turned off. ***/ EEPROM.update(address, val); /*** The function EEPROM.update(address, val) is equivalent to the following: if( EEPROM.read(address) != val ){ EEPROM.write(address, val); } ***/ /*** Advance to the next address, when at the end restart at the beginning. Larger AVR processors have larger EEPROM sizes, E.g: - Arduno Duemilanove: 512b EEPROM storage. - Arduino Uno: 1kb EEPROM storage. - Arduino Mega: 4kb EEPROM storage. Rather than hard-coding the length, you should use the pre-provided length function. This will make your code portable to all AVR processors. ***/ address = address + 1; if (address == EEPROM.length()) { address = 0; } /*** As the EEPROM sizes are powers of two, wrapping (preventing overflow) of an EEPROM address is also doable by a bitwise and of the length - 1. ++address &= EEPROM.length() - 1; ***/ delay(100); } ================================================ FILE: external/arduino/avr/libraries/EEPROM/examples/eeprom_write/eeprom_write.ino ================================================ /* * EEPROM Write * * Stores values read from analog input 0 into the EEPROM. * These values will stay in the EEPROM when the board is * turned off and may be retrieved later by another sketch. */ #include /** the current address in the EEPROM (i.e. which byte we're going to write to next) **/ int addr = 0; void setup() { /** Empty setup. **/ } void loop() { /*** Need to divide by 4 because analog inputs range from 0 to 1023 and each byte of the EEPROM can only hold a value from 0 to 255. ***/ int val = analogRead(0) / 4; /*** Write the value to the appropriate byte of the EEPROM. these values will remain there when the board is turned off. ***/ EEPROM.write(addr, val); /*** Advance to the next address, when at the end restart at the beginning. Larger AVR processors have larger EEPROM sizes, E.g: - Arduno Duemilanove: 512b EEPROM storage. - Arduino Uno: 1kb EEPROM storage. - Arduino Mega: 4kb EEPROM storage. Rather than hard-coding the length, you should use the pre-provided length function. This will make your code portable to all AVR processors. ***/ addr = addr + 1; if (addr == EEPROM.length()) { addr = 0; } /*** As the EEPROM sizes are powers of two, wrapping (preventing overflow) of an EEPROM address is also doable by a bitwise and of the length - 1. ++addr &= EEPROM.length() - 1; ***/ delay(100); } ================================================ FILE: external/arduino/avr/libraries/EEPROM/keywords.txt ================================================ ####################################### # Syntax Coloring Map For EEPROM ####################################### ####################################### # Datatypes (KEYWORD1) ####################################### EEPROM KEYWORD1 EERef KEYWORD1 EEPtr KEYWORD2 ####################################### # Methods and Functions (KEYWORD2) ####################################### update KEYWORD2 ####################################### # Constants (LITERAL1) ####################################### ================================================ FILE: external/arduino/avr/libraries/EEPROM/library.properties ================================================ name=EEPROM version=2.0 author=Arduino, Christopher Andrews maintainer=Arduino sentence=Enables reading and writing to the permanent board storage. paragraph=This library allows to read and write data in a memory type, the EEPROM, that keeps its content also when the board is powered off. The amount of EEPROM available depends on the microcontroller type. category=Data Storage url=http://www.arduino.cc/en/Reference/EEPROM architectures=avr ================================================ FILE: external/arduino/avr/libraries/EEPROM/src/EEPROM.h ================================================ /* EEPROM.h - EEPROM library Original Copyright (c) 2006 David A. Mellis. All right reserved. New version by Christopher Andrews 2015. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef EEPROM_h #define EEPROM_h #include #include #include /*** EERef class. This object references an EEPROM cell. Its purpose is to mimic a typical byte of RAM, however its storage is the EEPROM. This class has an overhead of two bytes, similar to storing a pointer to an EEPROM cell. ***/ struct EERef{ EERef( const int index ) : index( index ) {} //Access/read members. uint8_t operator*() const { return eeprom_read_byte( (uint8_t*) index ); } operator uint8_t() const { return **this; } //Assignment/write members. EERef &operator=( const EERef &ref ) { return *this = *ref; } EERef &operator=( uint8_t in ) { return eeprom_write_byte( (uint8_t*) index, in ), *this; } EERef &operator +=( uint8_t in ) { return *this = **this + in; } EERef &operator -=( uint8_t in ) { return *this = **this - in; } EERef &operator *=( uint8_t in ) { return *this = **this * in; } EERef &operator /=( uint8_t in ) { return *this = **this / in; } EERef &operator ^=( uint8_t in ) { return *this = **this ^ in; } EERef &operator %=( uint8_t in ) { return *this = **this % in; } EERef &operator &=( uint8_t in ) { return *this = **this & in; } EERef &operator |=( uint8_t in ) { return *this = **this | in; } EERef &operator <<=( uint8_t in ) { return *this = **this << in; } EERef &operator >>=( uint8_t in ) { return *this = **this >> in; } EERef &update( uint8_t in ) { return in != *this ? *this = in : *this; } /** Prefix increment/decrement **/ EERef& operator++() { return *this += 1; } EERef& operator--() { return *this -= 1; } /** Postfix increment/decrement **/ uint8_t operator++ (int){ uint8_t ret = **this; return ++(*this), ret; } uint8_t operator-- (int){ uint8_t ret = **this; return --(*this), ret; } int index; //Index of current EEPROM cell. }; /*** EEPtr class. This object is a bidirectional pointer to EEPROM cells represented by EERef objects. Just like a normal pointer type, this can be dereferenced and repositioned using increment/decrement operators. ***/ struct EEPtr{ EEPtr( const int index ) : index( index ) {} operator int() const { return index; } EEPtr &operator=( int in ) { return index = in, *this; } //Iterator functionality. bool operator!=( const EEPtr &ptr ) { return index != ptr.index; } EERef operator*() { return index; } /** Prefix & Postfix increment/decrement **/ EEPtr& operator++() { return ++index, *this; } EEPtr& operator--() { return --index, *this; } EEPtr operator++ (int) { return index++; } EEPtr operator-- (int) { return index--; } int index; //Index of current EEPROM cell. }; /*** EEPROMClass class. This object represents the entire EEPROM space. It wraps the functionality of EEPtr and EERef into a basic interface. This class is also 100% backwards compatible with earlier Arduino core releases. ***/ struct EEPROMClass{ //Basic user access methods. EERef operator[]( const int idx ) { return idx; } uint8_t read( int idx ) { return EERef( idx ); } void write( int idx, uint8_t val ) { (EERef( idx )) = val; } void update( int idx, uint8_t val ) { EERef( idx ).update( val ); } //STL and C++11 iteration capability. EEPtr begin() { return 0x00; } EEPtr end() { return length(); } //Standards requires this to be the item after the last valid entry. The returned pointer is invalid. uint16_t length() { return E2END + 1; } //Functionality to 'get' and 'put' objects to and from EEPROM. template< typename T > T &get( int idx, T &t ){ EEPtr e = idx; uint8_t *ptr = (uint8_t*) &t; for( int count = sizeof(T) ; count ; --count, ++e ) *ptr++ = *e; return t; } template< typename T > const T &put( int idx, const T &t ){ EEPtr e = idx; const uint8_t *ptr = (const uint8_t*) &t; for( int count = sizeof(T) ; count ; --count, ++e ) (*e).update( *ptr++ ); return t; } }; static EEPROMClass EEPROM; #endif ================================================ FILE: external/arduino/avr/libraries/HID/keywords.txt ================================================ ####################################### # Syntax Coloring Map HID ####################################### ####################################### # Datatypes (KEYWORD1) ####################################### HID KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) ####################################### begin KEYWORD2 SendReport KEYWORD2 AppendDescriptor KEYWORD2 ####################################### # Constants (LITERAL1) ####################################### HID_TX LITERAL1 ================================================ FILE: external/arduino/avr/libraries/HID/library.properties ================================================ name=HID version=1.0 author=Arduino maintainer=Arduino sentence=Module for PluggableUSB infrastructure. Exposes an API for devices like Keyboards, Mice and Gamepads. paragraph= category=Communication url=http://www.arduino.cc/en/Reference/HID architectures=avr ================================================ FILE: external/arduino/avr/libraries/HID/src/HID.cpp ================================================ /* Copyright (c) 2015, Arduino LLC Original code (pre-library): Copyright (c) 2011, Peter Barrett Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "HID.h" #if defined(USBCON) HID_& HID() { static HID_ obj; return obj; } int HID_::getInterface(uint8_t* interfaceCount) { *interfaceCount += 1; // uses 1 HIDDescriptor hidInterface = { D_INTERFACE(pluggedInterface, 1, USB_DEVICE_CLASS_HUMAN_INTERFACE, HID_SUBCLASS_NONE, HID_PROTOCOL_NONE), D_HIDREPORT(descriptorSize), D_ENDPOINT(USB_ENDPOINT_IN(pluggedEndpoint), USB_ENDPOINT_TYPE_INTERRUPT, USB_EP_SIZE, 0x01) }; return USB_SendControl(0, &hidInterface, sizeof(hidInterface)); } int HID_::getDescriptor(USBSetup& setup) { // Check if this is a HID Class Descriptor request if (setup.bmRequestType != REQUEST_DEVICETOHOST_STANDARD_INTERFACE) { return 0; } if (setup.wValueH != HID_REPORT_DESCRIPTOR_TYPE) { return 0; } // In a HID Class Descriptor wIndex cointains the interface number if (setup.wIndex != pluggedInterface) { return 0; } int total = 0; HIDSubDescriptor* node; for (node = rootNode; node; node = node->next) { int res = USB_SendControl(TRANSFER_PGM, node->data, node->length); if (res == -1) return -1; total += res; } // Reset the protocol on reenumeration. Normally the host should not assume the state of the protocol // due to the USB specs, but Windows and Linux just assumes its in report mode. protocol = HID_REPORT_PROTOCOL; return total; } uint8_t HID_::getShortName(char *name) { name[0] = 'H'; name[1] = 'I'; name[2] = 'D'; name[3] = 'A' + (descriptorSize & 0x0F); name[4] = 'A' + ((descriptorSize >> 4) & 0x0F); return 5; } void HID_::AppendDescriptor(HIDSubDescriptor *node) { if (!rootNode) { rootNode = node; } else { HIDSubDescriptor *current = rootNode; while (current->next) { current = current->next; } current->next = node; } descriptorSize += node->length; } int HID_::SendReport(uint8_t id, const void* data, int len) { auto ret = USB_Send(pluggedEndpoint, &id, 1); if (ret < 0) return ret; auto ret2 = USB_Send(pluggedEndpoint | TRANSFER_RELEASE, data, len); if (ret2 < 0) return ret2; return ret + ret2; } bool HID_::setup(USBSetup& setup) { if (pluggedInterface != setup.wIndex) { return false; } uint8_t request = setup.bRequest; uint8_t requestType = setup.bmRequestType; if (requestType == REQUEST_DEVICETOHOST_CLASS_INTERFACE) { if (request == HID_GET_REPORT) { // TODO: HID_GetReport(); return true; } if (request == HID_GET_PROTOCOL) { // TODO: Send8(protocol); return true; } if (request == HID_GET_IDLE) { // TODO: Send8(idle); } } if (requestType == REQUEST_HOSTTODEVICE_CLASS_INTERFACE) { if (request == HID_SET_PROTOCOL) { // The USB Host tells us if we are in boot or report mode. // This only works with a real boot compatible device. protocol = setup.wValueL; return true; } if (request == HID_SET_IDLE) { idle = setup.wValueL; return true; } if (request == HID_SET_REPORT) { //uint8_t reportID = setup.wValueL; //uint16_t length = setup.wLength; //uint8_t data[length]; // Make sure to not read more data than USB_EP_SIZE. // You can read multiple times through a loop. // The first byte (may!) contain the reportID on a multreport. //USB_RecvControl(data, length); } } return false; } HID_::HID_(void) : PluggableUSBModule(1, 1, epType), rootNode(NULL), descriptorSize(0), protocol(HID_REPORT_PROTOCOL), idle(1) { epType[0] = EP_TYPE_INTERRUPT_IN; PluggableUSB().plug(this); } int HID_::begin(void) { return 0; } #endif /* if defined(USBCON) */ ================================================ FILE: external/arduino/avr/libraries/HID/src/HID.h ================================================ /* Copyright (c) 2015, Arduino LLC Original code (pre-library): Copyright (c) 2011, Peter Barrett Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef HID_h #define HID_h #include #include #include "PluggableUSB.h" #if defined(USBCON) #define _USING_HID // HID 'Driver' // ------------ #define HID_GET_REPORT 0x01 #define HID_GET_IDLE 0x02 #define HID_GET_PROTOCOL 0x03 #define HID_SET_REPORT 0x09 #define HID_SET_IDLE 0x0A #define HID_SET_PROTOCOL 0x0B #define HID_HID_DESCRIPTOR_TYPE 0x21 #define HID_REPORT_DESCRIPTOR_TYPE 0x22 #define HID_PHYSICAL_DESCRIPTOR_TYPE 0x23 // HID subclass HID1.11 Page 8 4.2 Subclass #define HID_SUBCLASS_NONE 0 #define HID_SUBCLASS_BOOT_INTERFACE 1 // HID Keyboard/Mouse bios compatible protocols HID1.11 Page 9 4.3 Protocols #define HID_PROTOCOL_NONE 0 #define HID_PROTOCOL_KEYBOARD 1 #define HID_PROTOCOL_MOUSE 2 // Normal or bios protocol (Keyboard/Mouse) HID1.11 Page 54 7.2.5 Get_Protocol Request // "protocol" variable is used for this purpose. #define HID_BOOT_PROTOCOL 0 #define HID_REPORT_PROTOCOL 1 // HID Request Type HID1.11 Page 51 7.2.1 Get_Report Request #define HID_REPORT_TYPE_INPUT 1 #define HID_REPORT_TYPE_OUTPUT 2 #define HID_REPORT_TYPE_FEATURE 3 typedef struct { uint8_t len; // 9 uint8_t dtype; // 0x21 uint8_t addr; uint8_t versionL; // 0x101 uint8_t versionH; // 0x101 uint8_t country; uint8_t desctype; // 0x22 report uint8_t descLenL; uint8_t descLenH; } HIDDescDescriptor; typedef struct { InterfaceDescriptor hid; HIDDescDescriptor desc; EndpointDescriptor in; } HIDDescriptor; class HIDSubDescriptor { public: HIDSubDescriptor *next = NULL; HIDSubDescriptor(const void *d, const uint16_t l) : data(d), length(l) { } const void* data; const uint16_t length; }; class HID_ : public PluggableUSBModule { public: HID_(void); int begin(void); int SendReport(uint8_t id, const void* data, int len); void AppendDescriptor(HIDSubDescriptor* node); protected: // Implementation of the PluggableUSBModule int getInterface(uint8_t* interfaceCount); int getDescriptor(USBSetup& setup); bool setup(USBSetup& setup); uint8_t getShortName(char* name); private: uint8_t epType[1]; HIDSubDescriptor* rootNode; uint16_t descriptorSize; uint8_t protocol; uint8_t idle; }; // Replacement for global singleton. // This function prevents static-initialization-order-fiasco // https://isocpp.org/wiki/faq/ctors#static-init-order-on-first-use HID_& HID(); #define D_HIDREPORT(length) { 9, 0x21, 0x01, 0x01, 0, 1, 0x22, lowByte(length), highByte(length) } #endif // USBCON #endif // HID_h ================================================ FILE: external/arduino/avr/libraries/SPI/examples/BarometricPressureSensor/BarometricPressureSensor.ino ================================================ /* SCP1000 Barometric Pressure Sensor Display Shows the output of a Barometric Pressure Sensor on a Uses the SPI library. For details on the sensor, see: http://www.sparkfun.com/commerce/product_info.php?products_id=8161 http://www.vti.fi/en/support/obsolete_products/pressure_sensors/ This sketch adapted from Nathan Seidle's SCP1000 example for PIC: http://www.sparkfun.com/datasheets/Sensors/SCP1000-Testing.zip Circuit: SCP1000 sensor attached to pins 6, 7, 10 - 13: DRDY: pin 6 CSB: pin 7 MOSI: pin 11 MISO: pin 12 SCK: pin 13 created 31 July 2010 modified 14 August 2010 by Tom Igoe */ // the sensor communicates using SPI, so include the library: #include //Sensor's memory register addresses: const int PRESSURE = 0x1F; //3 most significant bits of pressure const int PRESSURE_LSB = 0x20; //16 least significant bits of pressure const int TEMPERATURE = 0x21; //16 bit temperature reading const byte READ = 0b11111100; // SCP1000's read command const byte WRITE = 0b00000010; // SCP1000's write command // pins used for the connection with the sensor // the other you need are controlled by the SPI library): const int dataReadyPin = 6; const int chipSelectPin = 7; void setup() { Serial.begin(9600); // start the SPI library: SPI.begin(); // initalize the data ready and chip select pins: pinMode(dataReadyPin, INPUT); pinMode(chipSelectPin, OUTPUT); //Configure SCP1000 for low noise configuration: writeRegister(0x02, 0x2D); writeRegister(0x01, 0x03); writeRegister(0x03, 0x02); // give the sensor time to set up: delay(100); } void loop() { //Select High Resolution Mode writeRegister(0x03, 0x0A); // don't do anything until the data ready pin is high: if (digitalRead(dataReadyPin) == HIGH) { //Read the temperature data int tempData = readRegister(0x21, 2); // convert the temperature to celsius and display it: float realTemp = (float)tempData / 20.0; Serial.print("Temp[C]="); Serial.print(realTemp); //Read the pressure data highest 3 bits: byte pressure_data_high = readRegister(0x1F, 1); pressure_data_high &= 0b00000111; //you only needs bits 2 to 0 //Read the pressure data lower 16 bits: unsigned int pressure_data_low = readRegister(0x20, 2); //combine the two parts into one 19-bit number: long pressure = ((pressure_data_high << 16) | pressure_data_low) / 4; // display the temperature: Serial.println("\tPressure [Pa]=" + String(pressure)); } } //Read from or write to register from the SCP1000: unsigned int readRegister(byte thisRegister, int bytesToRead) { byte inByte = 0; // incoming byte from the SPI unsigned int result = 0; // result to return Serial.print(thisRegister, BIN); Serial.print("\t"); // SCP1000 expects the register name in the upper 6 bits // of the byte. So shift the bits left by two bits: thisRegister = thisRegister << 2; // now combine the address and the command into one byte byte dataToSend = thisRegister & READ; Serial.println(thisRegister, BIN); // take the chip select low to select the device: digitalWrite(chipSelectPin, LOW); // send the device the register you want to read: SPI.transfer(dataToSend); // send a value of 0 to read the first byte returned: result = SPI.transfer(0x00); // decrement the number of bytes left to read: bytesToRead--; // if you still have another byte to read: if (bytesToRead > 0) { // shift the first byte left, then get the second byte: result = result << 8; inByte = SPI.transfer(0x00); // combine the byte you just got with the previous one: result = result | inByte; // decrement the number of bytes left to read: bytesToRead--; } // take the chip select high to de-select: digitalWrite(chipSelectPin, HIGH); // return the result: return (result); } //Sends a write command to SCP1000 void writeRegister(byte thisRegister, byte thisValue) { // SCP1000 expects the register address in the upper 6 bits // of the byte. So shift the bits left by two bits: thisRegister = thisRegister << 2; // now combine the register address and the command into one byte: byte dataToSend = thisRegister | WRITE; // take the chip select low to select the device: digitalWrite(chipSelectPin, LOW); SPI.transfer(dataToSend); //Send register location SPI.transfer(thisValue); //Send value to record into register // take the chip select high to de-select: digitalWrite(chipSelectPin, HIGH); } ================================================ FILE: external/arduino/avr/libraries/SPI/examples/DigitalPotControl/DigitalPotControl.ino ================================================ /* Digital Pot Control This example controls an Analog Devices AD5206 digital potentiometer. The AD5206 has 6 potentiometer channels. Each channel's pins are labeled A - connect this to voltage W - this is the pot's wiper, which changes when you set it B - connect this to ground. The AD5206 is SPI-compatible,and to command it, you send two bytes, one with the channel number (0 - 5) and one with the resistance value for the channel (0 - 255). The circuit: * All A pins of AD5206 connected to +5V * All B pins of AD5206 connected to ground * An LED and a 220-ohm resisor in series connected from each W pin to ground * CS - to digital pin 10 (SS pin) * SDI - to digital pin 11 (MOSI pin) * CLK - to digital pin 13 (SCK pin) created 10 Aug 2010 by Tom Igoe Thanks to Heather Dewey-Hagborg for the original tutorial, 2005 */ // inslude the SPI library: #include // set pin 10 as the slave select for the digital pot: const int slaveSelectPin = 10; void setup() { // set the slaveSelectPin as an output: pinMode(slaveSelectPin, OUTPUT); // initialize SPI: SPI.begin(); } void loop() { // go through the six channels of the digital pot: for (int channel = 0; channel < 6; channel++) { // change the resistance on this channel from min to max: for (int level = 0; level < 255; level++) { digitalPotWrite(channel, level); delay(10); } // wait a second at the top: delay(100); // change the resistance on this channel from max to min: for (int level = 0; level < 255; level++) { digitalPotWrite(channel, 255 - level); delay(10); } } } void digitalPotWrite(int address, int value) { // take the SS pin low to select the chip: digitalWrite(slaveSelectPin, LOW); delay(100); // send in the address and value via SPI: SPI.transfer(address); SPI.transfer(value); delay(100); // take the SS pin high to de-select the chip: digitalWrite(slaveSelectPin, HIGH); } ================================================ FILE: external/arduino/avr/libraries/SPI/keywords.txt ================================================ ####################################### # Syntax Coloring Map SPI ####################################### ####################################### # Datatypes (KEYWORD1) ####################################### SPI KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) ####################################### begin KEYWORD2 end KEYWORD2 transfer KEYWORD2 setBitOrder KEYWORD2 setDataMode KEYWORD2 setClockDivider KEYWORD2 ####################################### # Constants (LITERAL1) ####################################### SPI_CLOCK_DIV4 LITERAL1 SPI_CLOCK_DIV16 LITERAL1 SPI_CLOCK_DIV64 LITERAL1 SPI_CLOCK_DIV128 LITERAL1 SPI_CLOCK_DIV2 LITERAL1 SPI_CLOCK_DIV8 LITERAL1 SPI_CLOCK_DIV32 LITERAL1 SPI_CLOCK_DIV64 LITERAL1 SPI_MODE0 LITERAL1 SPI_MODE1 LITERAL1 SPI_MODE2 LITERAL1 SPI_MODE3 LITERAL1 ================================================ FILE: external/arduino/avr/libraries/SPI/library.properties ================================================ name=SPI version=1.0 author=Arduino maintainer=Arduino sentence=Enables the communication with devices that use the Serial Peripheral Interface (SPI) Bus. paragraph=SPI is a synchronous serial data protocol used by microcontrollers for communicating with one or more peripheral devices quickly over short distances. It uses three lines common to all devices (MISO, MOSI and SCK) and one specific for each device. category=Communication url=http://www.arduino.cc/en/Reference/SPI architectures=avr ================================================ FILE: external/arduino/avr/libraries/SPI/src/SPI.cpp ================================================ /* * Copyright (c) 2010 by Cristian Maglie * Copyright (c) 2014 by Paul Stoffregen (Transaction API) * Copyright (c) 2014 by Matthijs Kooijman (SPISettings AVR) * Copyright (c) 2014 by Andrew J. Kroll (atomicity fixes) * SPI Master library for arduino. * * This file is free software; you can redistribute it and/or modify * it under the terms of either the GNU General Public License version 2 * or the GNU Lesser General Public License version 2.1, both as * published by the Free Software Foundation. */ #include "SPI.h" SPIClass SPI; uint8_t SPIClass::initialized = 0; uint8_t SPIClass::interruptMode = 0; uint8_t SPIClass::interruptMask = 0; uint8_t SPIClass::interruptSave = 0; #ifdef SPI_TRANSACTION_MISMATCH_LED uint8_t SPIClass::inTransactionFlag = 0; #endif void SPIClass::begin() { uint8_t sreg = SREG; noInterrupts(); // Protect from a scheduler and prevent transactionBegin if (!initialized) { // Set SS to high so a connected chip will be "deselected" by default uint8_t port = digitalPinToPort(SS); uint8_t bit = digitalPinToBitMask(SS); volatile uint8_t *reg = portModeRegister(port); // if the SS pin is not already configured as an output // then set it high (to enable the internal pull-up resistor) if(!(*reg & bit)){ digitalWrite(SS, HIGH); } // When the SS pin is set as OUTPUT, it can be used as // a general purpose output port (it doesn't influence // SPI operations). pinMode(SS, OUTPUT); // Warning: if the SS pin ever becomes a LOW INPUT then SPI // automatically switches to Slave, so the data direction of // the SS pin MUST be kept as OUTPUT. SPCR |= _BV(MSTR); SPCR |= _BV(SPE); // Set direction register for SCK and MOSI pin. // MISO pin automatically overrides to INPUT. // By doing this AFTER enabling SPI, we avoid accidentally // clocking in a single bit since the lines go directly // from "input" to SPI control. // http://code.google.com/p/arduino/issues/detail?id=888 pinMode(SCK, OUTPUT); pinMode(MOSI, OUTPUT); } initialized++; // reference count SREG = sreg; } void SPIClass::end() { uint8_t sreg = SREG; noInterrupts(); // Protect from a scheduler and prevent transactionBegin // Decrease the reference counter if (initialized) initialized--; // If there are no more references disable SPI if (!initialized) { SPCR &= ~_BV(SPE); interruptMode = 0; #ifdef SPI_TRANSACTION_MISMATCH_LED inTransactionFlag = 0; #endif } SREG = sreg; } // mapping of interrupt numbers to bits within SPI_AVR_EIMSK #if defined(__AVR_ATmega32U4__) #define SPI_INT0_MASK (1< * Copyright (c) 2014 by Paul Stoffregen (Transaction API) * Copyright (c) 2014 by Matthijs Kooijman (SPISettings AVR) * Copyright (c) 2014 by Andrew J. Kroll (atomicity fixes) * SPI Master library for arduino. * * This file is free software; you can redistribute it and/or modify * it under the terms of either the GNU General Public License version 2 * or the GNU Lesser General Public License version 2.1, both as * published by the Free Software Foundation. */ #ifndef _SPI_H_INCLUDED #define _SPI_H_INCLUDED #include // SPI_HAS_TRANSACTION means SPI has beginTransaction(), endTransaction(), // usingInterrupt(), and SPISetting(clock, bitOrder, dataMode) #define SPI_HAS_TRANSACTION 1 // SPI_HAS_NOTUSINGINTERRUPT means that SPI has notUsingInterrupt() method #define SPI_HAS_NOTUSINGINTERRUPT 1 // SPI_ATOMIC_VERSION means that SPI has atomicity fixes and what version. // This way when there is a bug fix you can check this define to alert users // of your code if it uses better version of this library. // This also implies everything that SPI_HAS_TRANSACTION as documented above is // available too. #define SPI_ATOMIC_VERSION 1 // Uncomment this line to add detection of mismatched begin/end transactions. // A mismatch occurs if other libraries fail to use SPI.endTransaction() for // each SPI.beginTransaction(). Connect an LED to this pin. The LED will turn // on if any mismatch is ever detected. //#define SPI_TRANSACTION_MISMATCH_LED 5 #ifndef LSBFIRST #define LSBFIRST 0 #endif #ifndef MSBFIRST #define MSBFIRST 1 #endif #define SPI_CLOCK_DIV4 0x00 #define SPI_CLOCK_DIV16 0x01 #define SPI_CLOCK_DIV64 0x02 #define SPI_CLOCK_DIV128 0x03 #define SPI_CLOCK_DIV2 0x04 #define SPI_CLOCK_DIV8 0x05 #define SPI_CLOCK_DIV32 0x06 #define SPI_MODE0 0x00 #define SPI_MODE1 0x04 #define SPI_MODE2 0x08 #define SPI_MODE3 0x0C #define SPI_MODE_MASK 0x0C // CPOL = bit 3, CPHA = bit 2 on SPCR #define SPI_CLOCK_MASK 0x03 // SPR1 = bit 1, SPR0 = bit 0 on SPCR #define SPI_2XCLOCK_MASK 0x01 // SPI2X = bit 0 on SPSR // define SPI_AVR_EIMSK for AVR boards with external interrupt pins #if defined(EIMSK) #define SPI_AVR_EIMSK EIMSK #elif defined(GICR) #define SPI_AVR_EIMSK GICR #elif defined(GIMSK) #define SPI_AVR_EIMSK GIMSK #endif class SPISettings { public: SPISettings(uint32_t clock, uint8_t bitOrder, uint8_t dataMode) { if (__builtin_constant_p(clock)) { init_AlwaysInline(clock, bitOrder, dataMode); } else { init_MightInline(clock, bitOrder, dataMode); } } SPISettings() { init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0); } private: void init_MightInline(uint32_t clock, uint8_t bitOrder, uint8_t dataMode) { init_AlwaysInline(clock, bitOrder, dataMode); } void init_AlwaysInline(uint32_t clock, uint8_t bitOrder, uint8_t dataMode) __attribute__((__always_inline__)) { // Clock settings are defined as follows. Note that this shows SPI2X // inverted, so the bits form increasing numbers. Also note that // fosc/64 appears twice // SPR1 SPR0 ~SPI2X Freq // 0 0 0 fosc/2 // 0 0 1 fosc/4 // 0 1 0 fosc/8 // 0 1 1 fosc/16 // 1 0 0 fosc/32 // 1 0 1 fosc/64 // 1 1 0 fosc/64 // 1 1 1 fosc/128 // We find the fastest clock that is less than or equal to the // given clock rate. The clock divider that results in clock_setting // is 2 ^^ (clock_div + 1). If nothing is slow enough, we'll use the // slowest (128 == 2 ^^ 7, so clock_div = 6). uint8_t clockDiv; // When the clock is known at compiletime, use this if-then-else // cascade, which the compiler knows how to completely optimize // away. When clock is not known, use a loop instead, which generates // shorter code. if (__builtin_constant_p(clock)) { if (clock >= F_CPU / 2) { clockDiv = 0; } else if (clock >= F_CPU / 4) { clockDiv = 1; } else if (clock >= F_CPU / 8) { clockDiv = 2; } else if (clock >= F_CPU / 16) { clockDiv = 3; } else if (clock >= F_CPU / 32) { clockDiv = 4; } else if (clock >= F_CPU / 64) { clockDiv = 5; } else { clockDiv = 6; } } else { uint32_t clockSetting = F_CPU / 2; clockDiv = 0; while (clockDiv < 6 && clock < clockSetting) { clockSetting /= 2; clockDiv++; } } // Compensate for the duplicate fosc/64 if (clockDiv == 6) clockDiv = 7; // Invert the SPI2X bit clockDiv ^= 0x1; // Pack into the SPISettings class spcr = _BV(SPE) | _BV(MSTR) | ((bitOrder == LSBFIRST) ? _BV(DORD) : 0) | (dataMode & SPI_MODE_MASK) | ((clockDiv >> 1) & SPI_CLOCK_MASK); spsr = clockDiv & SPI_2XCLOCK_MASK; } uint8_t spcr; uint8_t spsr; friend class SPIClass; }; class SPIClass { public: // Initialize the SPI library static void begin(); // If SPI is used from within an interrupt, this function registers // that interrupt with the SPI library, so beginTransaction() can // prevent conflicts. The input interruptNumber is the number used // with attachInterrupt. If SPI is used from a different interrupt // (eg, a timer), interruptNumber should be 255. static void usingInterrupt(uint8_t interruptNumber); // And this does the opposite. static void notUsingInterrupt(uint8_t interruptNumber); // Note: the usingInterrupt and notUsingInterrupt functions should // not to be called from ISR context or inside a transaction. // For details see: // https://github.com/arduino/Arduino/pull/2381 // https://github.com/arduino/Arduino/pull/2449 // Before using SPI.transfer() or asserting chip select pins, // this function is used to gain exclusive access to the SPI bus // and configure the correct settings. inline static void beginTransaction(SPISettings settings) { if (interruptMode > 0) { uint8_t sreg = SREG; noInterrupts(); #ifdef SPI_AVR_EIMSK if (interruptMode == 1) { interruptSave = SPI_AVR_EIMSK; SPI_AVR_EIMSK &= ~interruptMask; SREG = sreg; } else #endif { interruptSave = sreg; } } #ifdef SPI_TRANSACTION_MISMATCH_LED if (inTransactionFlag) { pinMode(SPI_TRANSACTION_MISMATCH_LED, OUTPUT); digitalWrite(SPI_TRANSACTION_MISMATCH_LED, HIGH); } inTransactionFlag = 1; #endif SPCR = settings.spcr; SPSR = settings.spsr; } // Write to the SPI bus (MOSI pin) and also receive (MISO pin) inline static uint8_t transfer(uint8_t data) { SPDR = data; /* * The following NOP introduces a small delay that can prevent the wait * loop form iterating when running at the maximum speed. This gives * about 10% more speed, even if it seems counter-intuitive. At lower * speeds it is unnoticed. */ asm volatile("nop"); while (!(SPSR & _BV(SPIF))) ; // wait return SPDR; } inline static uint16_t transfer16(uint16_t data) { union { uint16_t val; struct { uint8_t lsb; uint8_t msb; }; } in, out; in.val = data; if (!(SPCR & _BV(DORD))) { SPDR = in.msb; asm volatile("nop"); // See transfer(uint8_t) function while (!(SPSR & _BV(SPIF))) ; out.msb = SPDR; SPDR = in.lsb; asm volatile("nop"); while (!(SPSR & _BV(SPIF))) ; out.lsb = SPDR; } else { SPDR = in.lsb; asm volatile("nop"); while (!(SPSR & _BV(SPIF))) ; out.lsb = SPDR; SPDR = in.msb; asm volatile("nop"); while (!(SPSR & _BV(SPIF))) ; out.msb = SPDR; } return out.val; } inline static void transfer(void *buf, size_t count) { if (count == 0) return; uint8_t *p = (uint8_t *)buf; SPDR = *p; while (--count > 0) { uint8_t out = *(p + 1); while (!(SPSR & _BV(SPIF))) ; uint8_t in = SPDR; SPDR = out; *p++ = in; } while (!(SPSR & _BV(SPIF))) ; *p = SPDR; } // After performing a group of transfers and releasing the chip select // signal, this function allows others to access the SPI bus inline static void endTransaction(void) { #ifdef SPI_TRANSACTION_MISMATCH_LED if (!inTransactionFlag) { pinMode(SPI_TRANSACTION_MISMATCH_LED, OUTPUT); digitalWrite(SPI_TRANSACTION_MISMATCH_LED, HIGH); } inTransactionFlag = 0; #endif if (interruptMode > 0) { #ifdef SPI_AVR_EIMSK uint8_t sreg = SREG; #endif noInterrupts(); #ifdef SPI_AVR_EIMSK if (interruptMode == 1) { SPI_AVR_EIMSK = interruptSave; SREG = sreg; } else #endif { SREG = interruptSave; } } } // Disable the SPI bus static void end(); // This function is deprecated. New applications should use // beginTransaction() to configure SPI settings. inline static void setBitOrder(uint8_t bitOrder) { if (bitOrder == LSBFIRST) SPCR |= _BV(DORD); else SPCR &= ~(_BV(DORD)); } // This function is deprecated. New applications should use // beginTransaction() to configure SPI settings. inline static void setDataMode(uint8_t dataMode) { SPCR = (SPCR & ~SPI_MODE_MASK) | dataMode; } // This function is deprecated. New applications should use // beginTransaction() to configure SPI settings. inline static void setClockDivider(uint8_t clockDiv) { SPCR = (SPCR & ~SPI_CLOCK_MASK) | (clockDiv & SPI_CLOCK_MASK); SPSR = (SPSR & ~SPI_2XCLOCK_MASK) | ((clockDiv >> 2) & SPI_2XCLOCK_MASK); } // These undocumented functions should not be used. SPI.transfer() // polls the hardware flag which is automatically cleared as the // AVR responds to SPI's interrupt inline static void attachInterrupt() { SPCR |= _BV(SPIE); } inline static void detachInterrupt() { SPCR &= ~_BV(SPIE); } private: static uint8_t initialized; static uint8_t interruptMode; // 0=none, 1=mask, 2=global static uint8_t interruptMask; // which interrupts to mask static uint8_t interruptSave; // temp storage, to restore state #ifdef SPI_TRANSACTION_MISMATCH_LED static uint8_t inTransactionFlag; #endif }; extern SPIClass SPI; #endif ================================================ FILE: external/arduino/avr/libraries/SoftwareSerial/examples/SoftwareSerialExample/SoftwareSerialExample.ino ================================================ /* Software serial multple serial test Receives from the hardware serial, sends to software serial. Receives from software serial, sends to hardware serial. The circuit: * RX is digital pin 10 (connect to TX of other device) * TX is digital pin 11 (connect to RX of other device) Note: Not all pins on the Mega and Mega 2560 support change interrupts, so only the following can be used for RX: 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69 Not all pins on the Leonardo and Micro support change interrupts, so only the following can be used for RX: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI). created back in the mists of time modified 25 May 2012 by Tom Igoe based on Mikal Hart's example This example code is in the public domain. */ #include SoftwareSerial mySerial(10, 11); // RX, TX void setup() { // Open serial communications and wait for port to open: Serial.begin(57600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } Serial.println("Goodnight moon!"); // set the data rate for the SoftwareSerial port mySerial.begin(4800); mySerial.println("Hello, world?"); } void loop() { // run over and over if (mySerial.available()) { Serial.write(mySerial.read()); } if (Serial.available()) { mySerial.write(Serial.read()); } } ================================================ FILE: external/arduino/avr/libraries/SoftwareSerial/examples/TwoPortReceive/TwoPortReceive.ino ================================================ /* Software serial multple serial test Receives from the two software serial ports, sends to the hardware serial port. In order to listen on a software port, you call port.listen(). When using two software serial ports, you have to switch ports by listen()ing on each one in turn. Pick a logical time to switch ports, like the end of an expected transmission, or when the buffer is empty. This example switches ports when there is nothing more to read from a port The circuit: Two devices which communicate serially are needed. * First serial device's TX attached to digital pin 10(RX), RX to pin 11(TX) * Second serial device's TX attached to digital pin 8(RX), RX to pin 9(TX) Note: Not all pins on the Mega and Mega 2560 support change interrupts, so only the following can be used for RX: 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69 Not all pins on the Leonardo support change interrupts, so only the following can be used for RX: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI). created 18 Apr. 2011 modified 19 March 2016 by Tom Igoe based on Mikal Hart's twoPortRXExample This example code is in the public domain. */ #include // software serial #1: RX = digital pin 10, TX = digital pin 11 SoftwareSerial portOne(10, 11); // software serial #2: RX = digital pin 8, TX = digital pin 9 // on the Mega, use other pins instead, since 8 and 9 don't work on the Mega SoftwareSerial portTwo(8, 9); void setup() { // Open serial communications and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } // Start each software serial port portOne.begin(9600); portTwo.begin(9600); } void loop() { // By default, the last intialized port is listening. // when you want to listen on a port, explicitly select it: portOne.listen(); Serial.println("Data from port one:"); // while there is data coming in, read it // and send to the hardware serial port: while (portOne.available() > 0) { char inByte = portOne.read(); Serial.write(inByte); } // blank line to separate data from the two ports: Serial.println(); // Now listen on the second port portTwo.listen(); // while there is data coming in, read it // and send to the hardware serial port: Serial.println("Data from port two:"); while (portTwo.available() > 0) { char inByte = portTwo.read(); Serial.write(inByte); } // blank line to separate data from the two ports: Serial.println(); } ================================================ FILE: external/arduino/avr/libraries/SoftwareSerial/keywords.txt ================================================ ####################################### # Syntax Coloring Map for SoftwareSerial # (formerly NewSoftSerial) ####################################### ####################################### # Datatypes (KEYWORD1) ####################################### SoftwareSerial KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) ####################################### begin KEYWORD2 end KEYWORD2 read KEYWORD2 write KEYWORD2 available KEYWORD2 isListening KEYWORD2 overflow KEYWORD2 flush KEYWORD2 listen KEYWORD2 peek KEYWORD2 ####################################### # Constants (LITERAL1) ####################################### ================================================ FILE: external/arduino/avr/libraries/SoftwareSerial/library.properties ================================================ name=SoftwareSerial version=1.0 author=Arduino maintainer=Arduino sentence=Enables serial communication on any digital pin. paragraph=The SoftwareSerial library has been developed to allow serial communication on any digital pin of the board, using software to replicate the functionality of the hardware UART. It is possible to have multiple software serial ports with speeds up to 115200 bps. category=Communication url=http://www.arduino.cc/en/Reference/SoftwareSerial architectures=avr ================================================ FILE: external/arduino/avr/libraries/SoftwareSerial/src/SoftwareSerial.cpp ================================================ /* SoftwareSerial.cpp (formerly NewSoftSerial.cpp) - Multi-instance software serial library for Arduino/Wiring -- Interrupt-driven receive and other improvements by ladyada (http://ladyada.net) -- Tuning, circular buffer, derivation from class Print/Stream, multi-instance support, porting to 8MHz processors, various optimizations, PROGMEM delay tables, inverse logic and direct port writing by Mikal Hart (http://www.arduiniana.org) -- Pin change interrupt macros by Paul Stoffregen (http://www.pjrc.com) -- 20MHz processor support by Garrett Mace (http://www.macetech.com) -- ATmega1280/2560 support by Brett Hagman (http://www.roguerobotics.com/) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA The latest version of this library can always be found at http://arduiniana.org. */ // When set, _DEBUG co-opts pins 11 and 13 for debugging with an // oscilloscope or logic analyzer. Beware: it also slightly modifies // the bit times, so don't rely on it too much at high baud rates #define _DEBUG 0 #define _DEBUG_PIN1 11 #define _DEBUG_PIN2 13 // // Includes // #include #include #include #include #include // // Statics // SoftwareSerial *SoftwareSerial::active_object = 0; uint8_t SoftwareSerial::_receive_buffer[_SS_MAX_RX_BUFF]; volatile uint8_t SoftwareSerial::_receive_buffer_tail = 0; volatile uint8_t SoftwareSerial::_receive_buffer_head = 0; // // Debugging // // This function generates a brief pulse // for debugging or measuring on an oscilloscope. #if _DEBUG inline void DebugPulse(uint8_t pin, uint8_t count) { volatile uint8_t *pport = portOutputRegister(digitalPinToPort(pin)); uint8_t val = *pport; while (count--) { *pport = val | digitalPinToBitMask(pin); *pport = val; } } #else inline void DebugPulse(uint8_t, uint8_t) {} #endif // // Private methods // /* static */ inline void SoftwareSerial::tunedDelay(uint16_t delay) { _delay_loop_2(delay); } // This function sets the current object as the "listening" // one and returns true if it replaces another bool SoftwareSerial::listen() { if (!_rx_delay_stopbit) return false; if (active_object != this) { if (active_object) active_object->stopListening(); _buffer_overflow = false; _receive_buffer_head = _receive_buffer_tail = 0; active_object = this; setRxIntMsk(true); return true; } return false; } // Stop listening. Returns true if we were actually listening. bool SoftwareSerial::stopListening() { if (active_object == this) { setRxIntMsk(false); active_object = NULL; return true; } return false; } // // The receive routine called by the interrupt handler // void SoftwareSerial::recv() { #if GCC_VERSION < 40302 // Work-around for avr-gcc 4.3.0 OSX version bug // Preserve the registers that the compiler misses // (courtesy of Arduino forum user *etracer*) asm volatile( "push r18 \n\t" "push r19 \n\t" "push r20 \n\t" "push r21 \n\t" "push r22 \n\t" "push r23 \n\t" "push r26 \n\t" "push r27 \n\t" ::); #endif uint8_t d = 0; // If RX line is high, then we don't see any start bit // so interrupt is probably not for us if (_inverse_logic ? rx_pin_read() : !rx_pin_read()) { // Disable further interrupts during reception, this prevents // triggering another interrupt directly after we return, which can // cause problems at higher baudrates. setRxIntMsk(false); // Wait approximately 1/2 of a bit width to "center" the sample tunedDelay(_rx_delay_centering); DebugPulse(_DEBUG_PIN2, 1); // Read each of the 8 bits for (uint8_t i=8; i > 0; --i) { tunedDelay(_rx_delay_intrabit); d >>= 1; DebugPulse(_DEBUG_PIN2, 1); if (rx_pin_read()) d |= 0x80; } if (_inverse_logic) d = ~d; // if buffer full, set the overflow flag and return uint8_t next = (_receive_buffer_tail + 1) % _SS_MAX_RX_BUFF; if (next != _receive_buffer_head) { // save new data in buffer: tail points to where byte goes _receive_buffer[_receive_buffer_tail] = d; // save new byte _receive_buffer_tail = next; } else { DebugPulse(_DEBUG_PIN1, 1); _buffer_overflow = true; } // skip the stop bit tunedDelay(_rx_delay_stopbit); DebugPulse(_DEBUG_PIN1, 1); // Re-enable interrupts when we're sure to be inside the stop bit setRxIntMsk(true); } #if GCC_VERSION < 40302 // Work-around for avr-gcc 4.3.0 OSX version bug // Restore the registers that the compiler misses asm volatile( "pop r27 \n\t" "pop r26 \n\t" "pop r23 \n\t" "pop r22 \n\t" "pop r21 \n\t" "pop r20 \n\t" "pop r19 \n\t" "pop r18 \n\t" ::); #endif } uint8_t SoftwareSerial::rx_pin_read() { return *_receivePortRegister & _receiveBitMask; } // // Interrupt handling // /* static */ inline void SoftwareSerial::handle_interrupt() { if (active_object) { active_object->recv(); } } #if defined(PCINT0_vect) ISR(PCINT0_vect) { SoftwareSerial::handle_interrupt(); } #endif #if defined(PCINT1_vect) ISR(PCINT1_vect, ISR_ALIASOF(PCINT0_vect)); #endif #if defined(PCINT2_vect) ISR(PCINT2_vect, ISR_ALIASOF(PCINT0_vect)); #endif #if defined(PCINT3_vect) ISR(PCINT3_vect, ISR_ALIASOF(PCINT0_vect)); #endif // // Constructor // SoftwareSerial::SoftwareSerial(uint8_t receivePin, uint8_t transmitPin, bool inverse_logic /* = false */) : _rx_delay_centering(0), _rx_delay_intrabit(0), _rx_delay_stopbit(0), _tx_delay(0), _buffer_overflow(false), _inverse_logic(inverse_logic) { setTX(transmitPin); setRX(receivePin); } // // Destructor // SoftwareSerial::~SoftwareSerial() { end(); } void SoftwareSerial::setTX(uint8_t tx) { // First write, then set output. If we do this the other way around, // the pin would be output low for a short while before switching to // output high. Now, it is input with pullup for a short while, which // is fine. With inverse logic, either order is fine. digitalWrite(tx, _inverse_logic ? LOW : HIGH); pinMode(tx, OUTPUT); _transmitBitMask = digitalPinToBitMask(tx); uint8_t port = digitalPinToPort(tx); _transmitPortRegister = portOutputRegister(port); } void SoftwareSerial::setRX(uint8_t rx) { pinMode(rx, INPUT); if (!_inverse_logic) digitalWrite(rx, HIGH); // pullup for normal logic! _receivePin = rx; _receiveBitMask = digitalPinToBitMask(rx); uint8_t port = digitalPinToPort(rx); _receivePortRegister = portInputRegister(port); } uint16_t SoftwareSerial::subtract_cap(uint16_t num, uint16_t sub) { if (num > sub) return num - sub; else return 1; } // // Public methods // void SoftwareSerial::begin(long speed) { _rx_delay_centering = _rx_delay_intrabit = _rx_delay_stopbit = _tx_delay = 0; // Precalculate the various delays, in number of 4-cycle delays uint16_t bit_delay = (F_CPU / speed) / 4; // 12 (gcc 4.8.2) or 13 (gcc 4.3.2) cycles from start bit to first bit, // 15 (gcc 4.8.2) or 16 (gcc 4.3.2) cycles between bits, // 12 (gcc 4.8.2) or 14 (gcc 4.3.2) cycles from last bit to stop bit // These are all close enough to just use 15 cycles, since the inter-bit // timings are the most critical (deviations stack 8 times) _tx_delay = subtract_cap(bit_delay, 15 / 4); // Only setup rx when we have a valid PCINT for this pin if (digitalPinToPCICR((int8_t)_receivePin)) { #if GCC_VERSION > 40800 // Timings counted from gcc 4.8.2 output. This works up to 115200 on // 16Mhz and 57600 on 8Mhz. // // When the start bit occurs, there are 3 or 4 cycles before the // interrupt flag is set, 4 cycles before the PC is set to the right // interrupt vector address and the old PC is pushed on the stack, // and then 75 cycles of instructions (including the RJMP in the // ISR vector table) until the first delay. After the delay, there // are 17 more cycles until the pin value is read (excluding the // delay in the loop). // We want to have a total delay of 1.5 bit time. Inside the loop, // we already wait for 1 bit time - 23 cycles, so here we wait for // 0.5 bit time - (71 + 18 - 22) cycles. _rx_delay_centering = subtract_cap(bit_delay / 2, (4 + 4 + 75 + 17 - 23) / 4); // There are 23 cycles in each loop iteration (excluding the delay) _rx_delay_intrabit = subtract_cap(bit_delay, 23 / 4); // There are 37 cycles from the last bit read to the start of // stopbit delay and 11 cycles from the delay until the interrupt // mask is enabled again (which _must_ happen during the stopbit). // This delay aims at 3/4 of a bit time, meaning the end of the // delay will be at 1/4th of the stopbit. This allows some extra // time for ISR cleanup, which makes 115200 baud at 16Mhz work more // reliably _rx_delay_stopbit = subtract_cap(bit_delay * 3 / 4, (37 + 11) / 4); #else // Timings counted from gcc 4.3.2 output // Note that this code is a _lot_ slower, mostly due to bad register // allocation choices of gcc. This works up to 57600 on 16Mhz and // 38400 on 8Mhz. _rx_delay_centering = subtract_cap(bit_delay / 2, (4 + 4 + 97 + 29 - 11) / 4); _rx_delay_intrabit = subtract_cap(bit_delay, 11 / 4); _rx_delay_stopbit = subtract_cap(bit_delay * 3 / 4, (44 + 17) / 4); #endif // Enable the PCINT for the entire port here, but never disable it // (others might also need it, so we disable the interrupt by using // the per-pin PCMSK register). *digitalPinToPCICR((int8_t)_receivePin) |= _BV(digitalPinToPCICRbit(_receivePin)); // Precalculate the pcint mask register and value, so setRxIntMask // can be used inside the ISR without costing too much time. _pcint_maskreg = digitalPinToPCMSK(_receivePin); _pcint_maskvalue = _BV(digitalPinToPCMSKbit(_receivePin)); tunedDelay(_tx_delay); // if we were low this establishes the end } #if _DEBUG pinMode(_DEBUG_PIN1, OUTPUT); pinMode(_DEBUG_PIN2, OUTPUT); #endif listen(); } void SoftwareSerial::setRxIntMsk(bool enable) { if (enable) *_pcint_maskreg |= _pcint_maskvalue; else *_pcint_maskreg &= ~_pcint_maskvalue; } void SoftwareSerial::end() { stopListening(); } // Read data from buffer int SoftwareSerial::read() { if (!isListening()) return -1; // Empty buffer? if (_receive_buffer_head == _receive_buffer_tail) return -1; // Read from "head" uint8_t d = _receive_buffer[_receive_buffer_head]; // grab next byte _receive_buffer_head = (_receive_buffer_head + 1) % _SS_MAX_RX_BUFF; return d; } int SoftwareSerial::available() { if (!isListening()) return 0; return (_receive_buffer_tail + _SS_MAX_RX_BUFF - _receive_buffer_head) % _SS_MAX_RX_BUFF; } size_t SoftwareSerial::write(uint8_t b) { if (_tx_delay == 0) { setWriteError(); return 0; } // By declaring these as local variables, the compiler will put them // in registers _before_ disabling interrupts and entering the // critical timing sections below, which makes it a lot easier to // verify the cycle timings volatile uint8_t *reg = _transmitPortRegister; uint8_t reg_mask = _transmitBitMask; uint8_t inv_mask = ~_transmitBitMask; uint8_t oldSREG = SREG; bool inv = _inverse_logic; uint16_t delay = _tx_delay; if (inv) b = ~b; cli(); // turn off interrupts for a clean txmit // Write the start bit if (inv) *reg |= reg_mask; else *reg &= inv_mask; tunedDelay(delay); // Write each of the 8 bits for (uint8_t i = 8; i > 0; --i) { if (b & 1) // choose bit *reg |= reg_mask; // send 1 else *reg &= inv_mask; // send 0 tunedDelay(delay); b >>= 1; } // restore pin to natural state if (inv) *reg &= inv_mask; else *reg |= reg_mask; SREG = oldSREG; // turn interrupts back on tunedDelay(_tx_delay); return 1; } void SoftwareSerial::flush() { // There is no tx buffering, simply return } int SoftwareSerial::peek() { if (!isListening()) return -1; // Empty buffer? if (_receive_buffer_head == _receive_buffer_tail) return -1; // Read from "head" return _receive_buffer[_receive_buffer_head]; } ================================================ FILE: external/arduino/avr/libraries/SoftwareSerial/src/SoftwareSerial.h ================================================ /* SoftwareSerial.h (formerly NewSoftSerial.h) - Multi-instance software serial library for Arduino/Wiring -- Interrupt-driven receive and other improvements by ladyada (http://ladyada.net) -- Tuning, circular buffer, derivation from class Print/Stream, multi-instance support, porting to 8MHz processors, various optimizations, PROGMEM delay tables, inverse logic and direct port writing by Mikal Hart (http://www.arduiniana.org) -- Pin change interrupt macros by Paul Stoffregen (http://www.pjrc.com) -- 20MHz processor support by Garrett Mace (http://www.macetech.com) -- ATmega1280/2560 support by Brett Hagman (http://www.roguerobotics.com/) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA The latest version of this library can always be found at http://arduiniana.org. */ #ifndef SoftwareSerial_h #define SoftwareSerial_h #include #include /****************************************************************************** * Definitions ******************************************************************************/ #ifndef _SS_MAX_RX_BUFF #define _SS_MAX_RX_BUFF 64 // RX buffer size #endif #ifndef GCC_VERSION #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) #endif class SoftwareSerial : public Stream { private: // per object data uint8_t _receivePin; uint8_t _receiveBitMask; volatile uint8_t *_receivePortRegister; uint8_t _transmitBitMask; volatile uint8_t *_transmitPortRegister; volatile uint8_t *_pcint_maskreg; uint8_t _pcint_maskvalue; // Expressed as 4-cycle delays (must never be 0!) uint16_t _rx_delay_centering; uint16_t _rx_delay_intrabit; uint16_t _rx_delay_stopbit; uint16_t _tx_delay; uint16_t _buffer_overflow:1; uint16_t _inverse_logic:1; // static data static uint8_t _receive_buffer[_SS_MAX_RX_BUFF]; static volatile uint8_t _receive_buffer_tail; static volatile uint8_t _receive_buffer_head; static SoftwareSerial *active_object; // private methods inline void recv() __attribute__((__always_inline__)); uint8_t rx_pin_read(); void setTX(uint8_t transmitPin); void setRX(uint8_t receivePin); inline void setRxIntMsk(bool enable) __attribute__((__always_inline__)); // Return num - sub, or 1 if the result would be < 1 static uint16_t subtract_cap(uint16_t num, uint16_t sub); // private static method for timing static inline void tunedDelay(uint16_t delay); public: // public methods SoftwareSerial(uint8_t receivePin, uint8_t transmitPin, bool inverse_logic = false); ~SoftwareSerial(); void begin(long speed); bool listen(); void end(); bool isListening() { return this == active_object; } bool stopListening(); bool overflow() { bool ret = _buffer_overflow; if (ret) _buffer_overflow = false; return ret; } int peek(); virtual size_t write(uint8_t byte); virtual int read(); virtual int available(); virtual void flush(); operator bool() { return true; } using Print::write; // public only for easy access by interrupt handlers static inline void handle_interrupt() __attribute__((__always_inline__)); }; #endif ================================================ FILE: external/arduino/avr/libraries/Wire/examples/SFRRanger_reader/SFRRanger_reader.ino ================================================ // I2C SRF10 or SRF08 Devantech Ultrasonic Ranger Finder // by Nicholas Zambetti // and James Tichenor // Demonstrates use of the Wire library reading data from the // Devantech Utrasonic Rangers SFR08 and SFR10 // Created 29 April 2006 // This example code is in the public domain. #include void setup() { Wire.begin(); // join i2c bus (address optional for master) Serial.begin(9600); // start serial communication at 9600bps } int reading = 0; void loop() { // step 1: instruct sensor to read echoes Wire.beginTransmission(112); // transmit to device #112 (0x70) // the address specified in the datasheet is 224 (0xE0) // but i2c adressing uses the high 7 bits so it's 112 Wire.write(byte(0x00)); // sets register pointer to the command register (0x00) Wire.write(byte(0x50)); // command sensor to measure in "inches" (0x50) // use 0x51 for centimeters // use 0x52 for ping microseconds Wire.endTransmission(); // stop transmitting // step 2: wait for readings to happen delay(70); // datasheet suggests at least 65 milliseconds // step 3: instruct sensor to return a particular echo reading Wire.beginTransmission(112); // transmit to device #112 Wire.write(byte(0x02)); // sets register pointer to echo #1 register (0x02) Wire.endTransmission(); // stop transmitting // step 4: request reading from sensor Wire.requestFrom(112, 2); // request 2 bytes from slave device #112 // step 5: receive reading from sensor if (2 <= Wire.available()) { // if two bytes were received reading = Wire.read(); // receive high byte (overwrites previous reading) reading = reading << 8; // shift high byte to be high 8 bits reading |= Wire.read(); // receive low byte as lower 8 bits Serial.println(reading); // print the reading } delay(250); // wait a bit since people have to read the output :) } /* // The following code changes the address of a Devantech Ultrasonic Range Finder (SRF10 or SRF08) // usage: changeAddress(0x70, 0xE6); void changeAddress(byte oldAddress, byte newAddress) { Wire.beginTransmission(oldAddress); Wire.write(byte(0x00)); Wire.write(byte(0xA0)); Wire.endTransmission(); Wire.beginTransmission(oldAddress); Wire.write(byte(0x00)); Wire.write(byte(0xAA)); Wire.endTransmission(); Wire.beginTransmission(oldAddress); Wire.write(byte(0x00)); Wire.write(byte(0xA5)); Wire.endTransmission(); Wire.beginTransmission(oldAddress); Wire.write(byte(0x00)); Wire.write(newAddress); Wire.endTransmission(); } */ ================================================ FILE: external/arduino/avr/libraries/Wire/examples/digital_potentiometer/digital_potentiometer.ino ================================================ // I2C Digital Potentiometer // by Nicholas Zambetti // and Shawn Bonkowski // Demonstrates use of the Wire library // Controls AD5171 digital potentiometer via I2C/TWI // Created 31 March 2006 // This example code is in the public domain. #include void setup() { Wire.begin(); // join i2c bus (address optional for master) } byte val = 0; void loop() { Wire.beginTransmission(44); // transmit to device #44 (0x2c) // device address is specified in datasheet Wire.write(byte(0x00)); // sends instruction byte Wire.write(val); // sends potentiometer value byte Wire.endTransmission(); // stop transmitting val++; // increment value if (val == 64) { // if reached 64th position (max) val = 0; // start over from lowest value } delay(500); } ================================================ FILE: external/arduino/avr/libraries/Wire/examples/i2c_scanner/i2c_scanner.ino ================================================ // -------------------------------------- // i2c_scanner // // Version 1 // This program (or code that looks like it) // can be found in many places. // For example on the Arduino.cc forum. // The original author is not know. // Version 2, Juni 2012, Using Arduino 1.0.1 // Adapted to be as simple as possible by Arduino.cc user Krodal // Version 3, Feb 26 2013 // V3 by louarnold // Version 4, March 3, 2013, Using Arduino 1.0.3 // by Arduino.cc user Krodal. // Changes by louarnold removed. // Scanning addresses changed from 0...127 to 1...119, // according to the i2c scanner by Nick Gammon // https://www.gammon.com.au/forum/?id=10896 // Version 5, March 28, 2013 // As version 4, but address scans now to 127. // A sensor seems to use address 120. // Version 6, November 27, 2015. // Added waiting for the Leonardo serial communication. // // // This sketch tests the standard 7-bit addresses // Devices with higher bit address might not be seen properly. // #include void setup() { Wire.begin(); Serial.begin(9600); while (!Serial); // Leonardo: wait for serial monitor Serial.println("\nI2C Scanner"); } void loop() { int nDevices = 0; Serial.println("Scanning..."); for (byte address = 1; address < 127; ++address) { // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire.beginTransmission(address); byte error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address < 16) { Serial.print("0"); } Serial.print(address, HEX); Serial.println(" !"); ++nDevices; } else if (error == 4) { Serial.print("Unknown error at address 0x"); if (address < 16) { Serial.print("0"); } Serial.println(address, HEX); } } if (nDevices == 0) { Serial.println("No I2C devices found\n"); } else { Serial.println("done\n"); } delay(5000); // Wait 5 seconds for next scan } ================================================ FILE: external/arduino/avr/libraries/Wire/examples/master_reader/master_reader.ino ================================================ // Wire Master Reader // by Nicholas Zambetti // Demonstrates use of the Wire library // Reads data from an I2C/TWI slave device // Refer to the "Wire Slave Sender" example for use with this // Created 29 March 2006 // This example code is in the public domain. #include void setup() { Wire.begin(); // join i2c bus (address optional for master) Serial.begin(9600); // start serial for output } void loop() { Wire.requestFrom(8, 6); // request 6 bytes from slave device #8 while (Wire.available()) { // slave may send less than requested char c = Wire.read(); // receive a byte as character Serial.print(c); // print the character } delay(500); } ================================================ FILE: external/arduino/avr/libraries/Wire/examples/master_writer/master_writer.ino ================================================ // Wire Master Writer // by Nicholas Zambetti // Demonstrates use of the Wire library // Writes data to an I2C/TWI slave device // Refer to the "Wire Slave Receiver" example for use with this // Created 29 March 2006 // This example code is in the public domain. #include void setup() { Wire.begin(); // join i2c bus (address optional for master) } byte x = 0; void loop() { Wire.beginTransmission(8); // transmit to device #8 Wire.write("x is "); // sends five bytes Wire.write(x); // sends one byte Wire.endTransmission(); // stop transmitting x++; delay(500); } ================================================ FILE: external/arduino/avr/libraries/Wire/examples/slave_receiver/slave_receiver.ino ================================================ // Wire Slave Receiver // by Nicholas Zambetti // Demonstrates use of the Wire library // Receives data as an I2C/TWI slave device // Refer to the "Wire Master Writer" example for use with this // Created 29 March 2006 // This example code is in the public domain. #include void setup() { Wire.begin(8); // join i2c bus with address #8 Wire.onReceive(receiveEvent); // register event Serial.begin(9600); // start serial for output } void loop() { delay(100); } // function that executes whenever data is received from master // this function is registered as an event, see setup() void receiveEvent(int howMany) { while (1 < Wire.available()) { // loop through all but the last char c = Wire.read(); // receive byte as a character Serial.print(c); // print the character } int x = Wire.read(); // receive byte as an integer Serial.println(x); // print the integer } ================================================ FILE: external/arduino/avr/libraries/Wire/examples/slave_sender/slave_sender.ino ================================================ // Wire Slave Sender // by Nicholas Zambetti // Demonstrates use of the Wire library // Sends data as an I2C/TWI slave device // Refer to the "Wire Master Reader" example for use with this // Created 29 March 2006 // This example code is in the public domain. #include void setup() { Wire.begin(8); // join i2c bus with address #8 Wire.onRequest(requestEvent); // register event } void loop() { delay(100); } // function that executes whenever data is requested by master // this function is registered as an event, see setup() void requestEvent() { Wire.write("hello "); // respond with message of 6 bytes // as expected by master } ================================================ FILE: external/arduino/avr/libraries/Wire/keywords.txt ================================================ ####################################### # Syntax Coloring Map For Wire ####################################### ####################################### # Datatypes (KEYWORD1) ####################################### ####################################### # Methods and Functions (KEYWORD2) ####################################### begin KEYWORD2 setClock KEYWORD2 beginTransmission KEYWORD2 endTransmission KEYWORD2 requestFrom KEYWORD2 onReceive KEYWORD2 onRequest KEYWORD2 ####################################### # Instances (KEYWORD2) ####################################### Wire KEYWORD2 ####################################### # Constants (LITERAL1) ####################################### ================================================ FILE: external/arduino/avr/libraries/Wire/library.properties ================================================ name=Wire version=1.0 author=Arduino maintainer=Arduino sentence=This library allows you to communicate with I2C and Two Wire Interface devices. paragraph=It allows the communication with I2C devices like temperature sensors, realtime clocks and many others using SDA (Data Line) and SCL (Clock Line). category=Communication url=http://www.arduino.cc/en/Reference/Wire architectures=avr ================================================ FILE: external/arduino/avr/libraries/Wire/src/Wire.cpp ================================================ /* TwoWire.cpp - TWI/I2C library for Wiring & Arduino Copyright (c) 2006 Nicholas Zambetti. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Modified 2012 by Todd Krein (todd@krein.org) to implement repeated starts Modified 2017 by Chuck Todd (ctodd@cableone.net) to correct Unconfigured Slave Mode reboot */ extern "C" { #include #include #include #include "utility/twi.h" } #include "Wire.h" // Initialize Class Variables ////////////////////////////////////////////////// uint8_t TwoWire::rxBuffer[BUFFER_LENGTH]; uint8_t TwoWire::rxBufferIndex = 0; uint8_t TwoWire::rxBufferLength = 0; uint8_t TwoWire::txAddress = 0; uint8_t TwoWire::txBuffer[BUFFER_LENGTH]; uint8_t TwoWire::txBufferIndex = 0; uint8_t TwoWire::txBufferLength = 0; uint8_t TwoWire::transmitting = 0; void (*TwoWire::user_onRequest)(void); void (*TwoWire::user_onReceive)(int); // Constructors //////////////////////////////////////////////////////////////// TwoWire::TwoWire() { } // Public Methods ////////////////////////////////////////////////////////////// void TwoWire::begin(void) { rxBufferIndex = 0; rxBufferLength = 0; txBufferIndex = 0; txBufferLength = 0; twi_init(); twi_attachSlaveTxEvent(onRequestService); // default callback must exist twi_attachSlaveRxEvent(onReceiveService); // default callback must exist } void TwoWire::begin(uint8_t address) { begin(); twi_setAddress(address); } void TwoWire::begin(int address) { begin((uint8_t)address); } void TwoWire::end(void) { twi_disable(); } void TwoWire::setClock(uint32_t clock) { twi_setFrequency(clock); } uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint32_t iaddress, uint8_t isize, uint8_t sendStop) { if (isize > 0) { // send internal address; this mode allows sending a repeated start to access // some devices' internal registers. This function is executed by the hardware // TWI module on other processors (for example Due's TWI_IADR and TWI_MMR registers) beginTransmission(address); // the maximum size of internal address is 3 bytes if (isize > 3){ isize = 3; } // write internal register address - most significant byte first while (isize-- > 0) write((uint8_t)(iaddress >> (isize*8))); endTransmission(false); } // clamp to buffer length if(quantity > BUFFER_LENGTH){ quantity = BUFFER_LENGTH; } // perform blocking read into buffer uint8_t read = twi_readFrom(address, rxBuffer, quantity, sendStop); // set rx buffer iterator vars rxBufferIndex = 0; rxBufferLength = read; return read; } uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint8_t sendStop) { return requestFrom((uint8_t)address, (uint8_t)quantity, (uint32_t)0, (uint8_t)0, (uint8_t)sendStop); } uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity) { return requestFrom((uint8_t)address, (uint8_t)quantity, (uint8_t)true); } uint8_t TwoWire::requestFrom(int address, int quantity) { return requestFrom((uint8_t)address, (uint8_t)quantity, (uint8_t)true); } uint8_t TwoWire::requestFrom(int address, int quantity, int sendStop) { return requestFrom((uint8_t)address, (uint8_t)quantity, (uint8_t)sendStop); } void TwoWire::beginTransmission(uint8_t address) { // indicate that we are transmitting transmitting = 1; // set address of targeted slave txAddress = address; // reset tx buffer iterator vars txBufferIndex = 0; txBufferLength = 0; } void TwoWire::beginTransmission(int address) { beginTransmission((uint8_t)address); } // // Originally, 'endTransmission' was an f(void) function. // It has been modified to take one parameter indicating // whether or not a STOP should be performed on the bus. // Calling endTransmission(false) allows a sketch to // perform a repeated start. // // WARNING: Nothing in the library keeps track of whether // the bus tenure has been properly ended with a STOP. It // is very possible to leave the bus in a hung state if // no call to endTransmission(true) is made. Some I2C // devices will behave oddly if they do not see a STOP. // uint8_t TwoWire::endTransmission(uint8_t sendStop) { // transmit buffer (blocking) uint8_t ret = twi_writeTo(txAddress, txBuffer, txBufferLength, 1, sendStop); // reset tx buffer iterator vars txBufferIndex = 0; txBufferLength = 0; // indicate that we are done transmitting transmitting = 0; return ret; } // This provides backwards compatibility with the original // definition, and expected behaviour, of endTransmission // uint8_t TwoWire::endTransmission(void) { return endTransmission(true); } // must be called in: // slave tx event callback // or after beginTransmission(address) size_t TwoWire::write(uint8_t data) { if(transmitting){ // in master transmitter mode // don't bother if buffer is full if(txBufferLength >= BUFFER_LENGTH){ setWriteError(); return 0; } // put byte in tx buffer txBuffer[txBufferIndex] = data; ++txBufferIndex; // update amount in buffer txBufferLength = txBufferIndex; }else{ // in slave send mode // reply to master twi_transmit(&data, 1); } return 1; } // must be called in: // slave tx event callback // or after beginTransmission(address) size_t TwoWire::write(const uint8_t *data, size_t quantity) { if(transmitting){ // in master transmitter mode for(size_t i = 0; i < quantity; ++i){ write(data[i]); } }else{ // in slave send mode // reply to master twi_transmit(data, quantity); } return quantity; } // must be called in: // slave rx event callback // or after requestFrom(address, numBytes) int TwoWire::available(void) { return rxBufferLength - rxBufferIndex; } // must be called in: // slave rx event callback // or after requestFrom(address, numBytes) int TwoWire::read(void) { int value = -1; // get each successive byte on each call if(rxBufferIndex < rxBufferLength){ value = rxBuffer[rxBufferIndex]; ++rxBufferIndex; } return value; } // must be called in: // slave rx event callback // or after requestFrom(address, numBytes) int TwoWire::peek(void) { int value = -1; if(rxBufferIndex < rxBufferLength){ value = rxBuffer[rxBufferIndex]; } return value; } void TwoWire::flush(void) { // XXX: to be implemented. } // behind the scenes function that is called when data is received void TwoWire::onReceiveService(uint8_t* inBytes, int numBytes) { // don't bother if user hasn't registered a callback if(!user_onReceive){ return; } // don't bother if rx buffer is in use by a master requestFrom() op // i know this drops data, but it allows for slight stupidity // meaning, they may not have read all the master requestFrom() data yet if(rxBufferIndex < rxBufferLength){ return; } // copy twi rx buffer into local read buffer // this enables new reads to happen in parallel for(uint8_t i = 0; i < numBytes; ++i){ rxBuffer[i] = inBytes[i]; } // set rx iterator vars rxBufferIndex = 0; rxBufferLength = numBytes; // alert user program user_onReceive(numBytes); } // behind the scenes function that is called when data is requested void TwoWire::onRequestService(void) { // don't bother if user hasn't registered a callback if(!user_onRequest){ return; } // reset tx buffer iterator vars // !!! this will kill any pending pre-master sendTo() activity txBufferIndex = 0; txBufferLength = 0; // alert user program user_onRequest(); } // sets function called on slave write void TwoWire::onReceive( void (*function)(int) ) { user_onReceive = function; } // sets function called on slave read void TwoWire::onRequest( void (*function)(void) ) { user_onRequest = function; } // Preinstantiate Objects ////////////////////////////////////////////////////// TwoWire Wire = TwoWire(); ================================================ FILE: external/arduino/avr/libraries/Wire/src/Wire.h ================================================ /* TwoWire.h - TWI/I2C library for Arduino & Wiring Copyright (c) 2006 Nicholas Zambetti. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Modified 2012 by Todd Krein (todd@krein.org) to implement repeated starts */ #ifndef TwoWire_h #define TwoWire_h #include #include "Stream.h" #define BUFFER_LENGTH 32 // WIRE_HAS_END means Wire has end() #define WIRE_HAS_END 1 class TwoWire : public Stream { private: static uint8_t rxBuffer[]; static uint8_t rxBufferIndex; static uint8_t rxBufferLength; static uint8_t txAddress; static uint8_t txBuffer[]; static uint8_t txBufferIndex; static uint8_t txBufferLength; static uint8_t transmitting; static void (*user_onRequest)(void); static void (*user_onReceive)(int); static void onRequestService(void); static void onReceiveService(uint8_t*, int); public: TwoWire(); void begin(); void begin(uint8_t); void begin(int); void end(); void setClock(uint32_t); void beginTransmission(uint8_t); void beginTransmission(int); uint8_t endTransmission(void); uint8_t endTransmission(uint8_t); uint8_t requestFrom(uint8_t, uint8_t); uint8_t requestFrom(uint8_t, uint8_t, uint8_t); uint8_t requestFrom(uint8_t, uint8_t, uint32_t, uint8_t, uint8_t); uint8_t requestFrom(int, int); uint8_t requestFrom(int, int, int); virtual size_t write(uint8_t); virtual size_t write(const uint8_t *, size_t); virtual int available(void); virtual int read(void); virtual int peek(void); virtual void flush(void); void onReceive( void (*)(int) ); void onRequest( void (*)(void) ); inline size_t write(unsigned long n) { return write((uint8_t)n); } inline size_t write(long n) { return write((uint8_t)n); } inline size_t write(unsigned int n) { return write((uint8_t)n); } inline size_t write(int n) { return write((uint8_t)n); } using Print::write; }; extern TwoWire Wire; #endif ================================================ FILE: external/arduino/avr/libraries/Wire/src/utility/twi.c ================================================ /* twi.c - TWI/I2C library for Wiring & Arduino Copyright (c) 2006 Nicholas Zambetti. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Modified 2012 by Todd Krein (todd@krein.org) to implement repeated starts */ #include #include #include #include #include #include #include "Arduino.h" // for digitalWrite #ifndef cbi #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) #endif #ifndef sbi #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) #endif #include "pins_arduino.h" #include "twi.h" static volatile uint8_t twi_state; static volatile uint8_t twi_slarw; static volatile uint8_t twi_sendStop; // should the transaction end with a stop static volatile uint8_t twi_inRepStart; // in the middle of a repeated start static void (*twi_onSlaveTransmit)(void); static void (*twi_onSlaveReceive)(uint8_t*, int); static uint8_t twi_masterBuffer[TWI_BUFFER_LENGTH]; static volatile uint8_t twi_masterBufferIndex; static volatile uint8_t twi_masterBufferLength; static uint8_t twi_txBuffer[TWI_BUFFER_LENGTH]; static volatile uint8_t twi_txBufferIndex; static volatile uint8_t twi_txBufferLength; static uint8_t twi_rxBuffer[TWI_BUFFER_LENGTH]; static volatile uint8_t twi_rxBufferIndex; static volatile uint8_t twi_error; /* * Function twi_init * Desc readys twi pins and sets twi bitrate * Input none * Output none */ void twi_init(void) { // initialize state twi_state = TWI_READY; twi_sendStop = true; // default value twi_inRepStart = false; // activate internal pullups for twi. digitalWrite(SDA, 1); digitalWrite(SCL, 1); // initialize twi prescaler and bit rate cbi(TWSR, TWPS0); cbi(TWSR, TWPS1); TWBR = ((F_CPU / TWI_FREQ) - 16) / 2; /* twi bit rate formula from atmega128 manual pg 204 SCL Frequency = CPU Clock Frequency / (16 + (2 * TWBR)) note: TWBR should be 10 or higher for master mode It is 72 for a 16mhz Wiring board with 100kHz TWI */ // enable twi module, acks, and twi interrupt TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA); } /* * Function twi_disable * Desc disables twi pins * Input none * Output none */ void twi_disable(void) { // disable twi module, acks, and twi interrupt TWCR &= ~(_BV(TWEN) | _BV(TWIE) | _BV(TWEA)); // deactivate internal pullups for twi. digitalWrite(SDA, 0); digitalWrite(SCL, 0); } /* * Function twi_slaveInit * Desc sets slave address and enables interrupt * Input none * Output none */ void twi_setAddress(uint8_t address) { // set twi slave address (skip over TWGCE bit) TWAR = address << 1; } /* * Function twi_setClock * Desc sets twi bit rate * Input Clock Frequency * Output none */ void twi_setFrequency(uint32_t frequency) { TWBR = ((F_CPU / frequency) - 16) / 2; /* twi bit rate formula from atmega128 manual pg 204 SCL Frequency = CPU Clock Frequency / (16 + (2 * TWBR)) note: TWBR should be 10 or higher for master mode It is 72 for a 16mhz Wiring board with 100kHz TWI */ } /* * Function twi_readFrom * Desc attempts to become twi bus master and read a * series of bytes from a device on the bus * Input address: 7bit i2c device address * data: pointer to byte array * length: number of bytes to read into array * sendStop: Boolean indicating whether to send a stop at the end * Output number of bytes read */ uint8_t twi_readFrom(uint8_t address, uint8_t* data, uint8_t length, uint8_t sendStop) { uint8_t i; // ensure data will fit into buffer if(TWI_BUFFER_LENGTH < length){ return 0; } // wait until twi is ready, become master receiver while(TWI_READY != twi_state){ continue; } twi_state = TWI_MRX; twi_sendStop = sendStop; // reset error state (0xFF.. no error occured) twi_error = 0xFF; // initialize buffer iteration vars twi_masterBufferIndex = 0; twi_masterBufferLength = length-1; // This is not intuitive, read on... // On receive, the previously configured ACK/NACK setting is transmitted in // response to the received byte before the interrupt is signalled. // Therefor we must actually set NACK when the _next_ to last byte is // received, causing that NACK to be sent in response to receiving the last // expected byte of data. // build sla+w, slave device address + w bit twi_slarw = TW_READ; twi_slarw |= address << 1; if (true == twi_inRepStart) { // if we're in the repeated start state, then we've already sent the start, // (@@@ we hope), and the TWI statemachine is just waiting for the address byte. // We need to remove ourselves from the repeated start state before we enable interrupts, // since the ISR is ASYNC, and we could get confused if we hit the ISR before cleaning // up. Also, don't enable the START interrupt. There may be one pending from the // repeated start that we sent ourselves, and that would really confuse things. twi_inRepStart = false; // remember, we're dealing with an ASYNC ISR do { TWDR = twi_slarw; } while(TWCR & _BV(TWWC)); TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN) | _BV(TWIE); // enable INTs, but not START } else // send start condition TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA); // wait for read operation to complete while(TWI_MRX == twi_state){ continue; } if (twi_masterBufferIndex < length) length = twi_masterBufferIndex; // copy twi buffer to data for(i = 0; i < length; ++i){ data[i] = twi_masterBuffer[i]; } return length; } /* * Function twi_writeTo * Desc attempts to become twi bus master and write a * series of bytes to a device on the bus * Input address: 7bit i2c device address * data: pointer to byte array * length: number of bytes in array * wait: boolean indicating to wait for write or not * sendStop: boolean indicating whether or not to send a stop at the end * Output 0 .. success * 1 .. length to long for buffer * 2 .. address send, NACK received * 3 .. data send, NACK received * 4 .. other twi error (lost bus arbitration, bus error, ..) */ uint8_t twi_writeTo(uint8_t address, uint8_t* data, uint8_t length, uint8_t wait, uint8_t sendStop) { uint8_t i; // ensure data will fit into buffer if(TWI_BUFFER_LENGTH < length){ return 1; } // wait until twi is ready, become master transmitter while(TWI_READY != twi_state){ continue; } twi_state = TWI_MTX; twi_sendStop = sendStop; // reset error state (0xFF.. no error occured) twi_error = 0xFF; // initialize buffer iteration vars twi_masterBufferIndex = 0; twi_masterBufferLength = length; // copy data to twi buffer for(i = 0; i < length; ++i){ twi_masterBuffer[i] = data[i]; } // build sla+w, slave device address + w bit twi_slarw = TW_WRITE; twi_slarw |= address << 1; // if we're in a repeated start, then we've already sent the START // in the ISR. Don't do it again. // if (true == twi_inRepStart) { // if we're in the repeated start state, then we've already sent the start, // (@@@ we hope), and the TWI statemachine is just waiting for the address byte. // We need to remove ourselves from the repeated start state before we enable interrupts, // since the ISR is ASYNC, and we could get confused if we hit the ISR before cleaning // up. Also, don't enable the START interrupt. There may be one pending from the // repeated start that we sent outselves, and that would really confuse things. twi_inRepStart = false; // remember, we're dealing with an ASYNC ISR do { TWDR = twi_slarw; } while(TWCR & _BV(TWWC)); TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN) | _BV(TWIE); // enable INTs, but not START } else // send start condition TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA); // enable INTs // wait for write operation to complete while(wait && (TWI_MTX == twi_state)){ continue; } if (twi_error == 0xFF) return 0; // success else if (twi_error == TW_MT_SLA_NACK) return 2; // error: address send, nack received else if (twi_error == TW_MT_DATA_NACK) return 3; // error: data send, nack received else return 4; // other twi error } /* * Function twi_transmit * Desc fills slave tx buffer with data * must be called in slave tx event callback * Input data: pointer to byte array * length: number of bytes in array * Output 1 length too long for buffer * 2 not slave transmitter * 0 ok */ uint8_t twi_transmit(const uint8_t* data, uint8_t length) { uint8_t i; // ensure data will fit into buffer if(TWI_BUFFER_LENGTH < (twi_txBufferLength+length)){ return 1; } // ensure we are currently a slave transmitter if(TWI_STX != twi_state){ return 2; } // set length and copy data into tx buffer for(i = 0; i < length; ++i){ twi_txBuffer[twi_txBufferLength+i] = data[i]; } twi_txBufferLength += length; return 0; } /* * Function twi_attachSlaveRxEvent * Desc sets function called before a slave read operation * Input function: callback function to use * Output none */ void twi_attachSlaveRxEvent( void (*function)(uint8_t*, int) ) { twi_onSlaveReceive = function; } /* * Function twi_attachSlaveTxEvent * Desc sets function called before a slave write operation * Input function: callback function to use * Output none */ void twi_attachSlaveTxEvent( void (*function)(void) ) { twi_onSlaveTransmit = function; } /* * Function twi_reply * Desc sends byte or readys receive line * Input ack: byte indicating to ack or to nack * Output none */ void twi_reply(uint8_t ack) { // transmit master read ready signal, with or without ack if(ack){ TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWINT) | _BV(TWEA); }else{ TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWINT); } } /* * Function twi_stop * Desc relinquishes bus master status * Input none * Output none */ void twi_stop(void) { // send stop condition TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTO); // wait for stop condition to be exectued on bus // TWINT is not set after a stop condition! while(TWCR & _BV(TWSTO)){ continue; } // update twi state twi_state = TWI_READY; } /* * Function twi_releaseBus * Desc releases bus control * Input none * Output none */ void twi_releaseBus(void) { // release bus TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT); // update twi state twi_state = TWI_READY; } ISR(TWI_vect) { switch(TW_STATUS){ // All Master case TW_START: // sent start condition case TW_REP_START: // sent repeated start condition // copy device address and r/w bit to output register and ack TWDR = twi_slarw; twi_reply(1); break; // Master Transmitter case TW_MT_SLA_ACK: // slave receiver acked address case TW_MT_DATA_ACK: // slave receiver acked data // if there is data to send, send it, otherwise stop if(twi_masterBufferIndex < twi_masterBufferLength){ // copy data to output register and ack TWDR = twi_masterBuffer[twi_masterBufferIndex++]; twi_reply(1); }else{ if (twi_sendStop) twi_stop(); else { twi_inRepStart = true; // we're gonna send the START // don't enable the interrupt. We'll generate the start, but we // avoid handling the interrupt until we're in the next transaction, // at the point where we would normally issue the start. TWCR = _BV(TWINT) | _BV(TWSTA)| _BV(TWEN) ; twi_state = TWI_READY; } } break; case TW_MT_SLA_NACK: // address sent, nack received twi_error = TW_MT_SLA_NACK; twi_stop(); break; case TW_MT_DATA_NACK: // data sent, nack received twi_error = TW_MT_DATA_NACK; twi_stop(); break; case TW_MT_ARB_LOST: // lost bus arbitration twi_error = TW_MT_ARB_LOST; twi_releaseBus(); break; // Master Receiver case TW_MR_DATA_ACK: // data received, ack sent // put byte into buffer twi_masterBuffer[twi_masterBufferIndex++] = TWDR; __attribute__ ((fallthrough)); case TW_MR_SLA_ACK: // address sent, ack received // ack if more bytes are expected, otherwise nack if(twi_masterBufferIndex < twi_masterBufferLength){ twi_reply(1); }else{ twi_reply(0); } break; case TW_MR_DATA_NACK: // data received, nack sent // put final byte into buffer twi_masterBuffer[twi_masterBufferIndex++] = TWDR; if (twi_sendStop) twi_stop(); else { twi_inRepStart = true; // we're gonna send the START // don't enable the interrupt. We'll generate the start, but we // avoid handling the interrupt until we're in the next transaction, // at the point where we would normally issue the start. TWCR = _BV(TWINT) | _BV(TWSTA)| _BV(TWEN) ; twi_state = TWI_READY; } break; case TW_MR_SLA_NACK: // address sent, nack received twi_stop(); break; // TW_MR_ARB_LOST handled by TW_MT_ARB_LOST case // Slave Receiver case TW_SR_SLA_ACK: // addressed, returned ack case TW_SR_GCALL_ACK: // addressed generally, returned ack case TW_SR_ARB_LOST_SLA_ACK: // lost arbitration, returned ack case TW_SR_ARB_LOST_GCALL_ACK: // lost arbitration, returned ack // enter slave receiver mode twi_state = TWI_SRX; // indicate that rx buffer can be overwritten and ack twi_rxBufferIndex = 0; twi_reply(1); break; case TW_SR_DATA_ACK: // data received, returned ack case TW_SR_GCALL_DATA_ACK: // data received generally, returned ack // if there is still room in the rx buffer if(twi_rxBufferIndex < TWI_BUFFER_LENGTH){ // put byte in buffer and ack twi_rxBuffer[twi_rxBufferIndex++] = TWDR; twi_reply(1); }else{ // otherwise nack twi_reply(0); } break; case TW_SR_STOP: // stop or repeated start condition received // ack future responses and leave slave receiver state twi_releaseBus(); // put a null char after data if there's room if(twi_rxBufferIndex < TWI_BUFFER_LENGTH){ twi_rxBuffer[twi_rxBufferIndex] = '\0'; } // callback to user defined callback twi_onSlaveReceive(twi_rxBuffer, twi_rxBufferIndex); // since we submit rx buffer to "wire" library, we can reset it twi_rxBufferIndex = 0; break; case TW_SR_DATA_NACK: // data received, returned nack case TW_SR_GCALL_DATA_NACK: // data received generally, returned nack // nack back at master twi_reply(0); break; // Slave Transmitter case TW_ST_SLA_ACK: // addressed, returned ack case TW_ST_ARB_LOST_SLA_ACK: // arbitration lost, returned ack // enter slave transmitter mode twi_state = TWI_STX; // ready the tx buffer index for iteration twi_txBufferIndex = 0; // set tx buffer length to be zero, to verify if user changes it twi_txBufferLength = 0; // request for txBuffer to be filled and length to be set // note: user must call twi_transmit(bytes, length) to do this twi_onSlaveTransmit(); // if they didn't change buffer & length, initialize it if(0 == twi_txBufferLength){ twi_txBufferLength = 1; twi_txBuffer[0] = 0x00; } __attribute__ ((fallthrough)); // transmit first byte from buffer, fall case TW_ST_DATA_ACK: // byte sent, ack returned // copy data to output register TWDR = twi_txBuffer[twi_txBufferIndex++]; // if there is more to send, ack, otherwise nack if(twi_txBufferIndex < twi_txBufferLength){ twi_reply(1); }else{ twi_reply(0); } break; case TW_ST_DATA_NACK: // received nack, we are done case TW_ST_LAST_DATA: // received ack, but we are done already! // ack future responses twi_reply(1); // leave slave receiver state twi_state = TWI_READY; break; // All case TW_NO_INFO: // no state information break; case TW_BUS_ERROR: // bus error, illegal stop/start twi_error = TW_BUS_ERROR; twi_stop(); break; } } ================================================ FILE: external/arduino/avr/libraries/Wire/src/utility/twi.h ================================================ /* twi.h - TWI/I2C library for Wiring & Arduino Copyright (c) 2006 Nicholas Zambetti. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef twi_h #define twi_h #include //#define ATMEGA8 #ifndef TWI_FREQ #define TWI_FREQ 100000L #endif #ifndef TWI_BUFFER_LENGTH #define TWI_BUFFER_LENGTH 32 #endif #define TWI_READY 0 #define TWI_MRX 1 #define TWI_MTX 2 #define TWI_SRX 3 #define TWI_STX 4 void twi_init(void); void twi_disable(void); void twi_setAddress(uint8_t); void twi_setFrequency(uint32_t); uint8_t twi_readFrom(uint8_t, uint8_t*, uint8_t, uint8_t); uint8_t twi_writeTo(uint8_t, uint8_t*, uint8_t, uint8_t, uint8_t); uint8_t twi_transmit(const uint8_t*, uint8_t); void twi_attachSlaveRxEvent( void (*)(uint8_t*, int) ); void twi_attachSlaveTxEvent( void (*)(void) ); void twi_reply(uint8_t); void twi_stop(void); void twi_releaseBus(void); #endif ================================================ FILE: external/arduino/avr/platform.txt ================================================ # Arduino AVR Core and platform. # ------------------------------ # # For more info: # https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5-3rd-party-Hardware-specification name=Arduino AVR Boards version=1.8.2 # AVR compile variables # --------------------- compiler.warning_flags=-w compiler.warning_flags.none=-w compiler.warning_flags.default= compiler.warning_flags.more=-Wall compiler.warning_flags.all=-Wall -Wextra # Default "compiler.path" is correct, change only if you want to override the initial value compiler.path={runtime.tools.avr-gcc.path}/bin/ compiler.c.cmd=avr-gcc compiler.c.flags=-c -g -Os {compiler.warning_flags} -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects compiler.c.elf.flags={compiler.warning_flags} -Os -g -flto -fuse-linker-plugin -Wl,--gc-sections compiler.c.elf.cmd=avr-gcc compiler.S.flags=-c -g -x assembler-with-cpp -flto -MMD compiler.cpp.cmd=avr-g++ compiler.cpp.flags=-c -g -Os {compiler.warning_flags} -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto compiler.ar.cmd=avr-gcc-ar compiler.ar.flags=rcs compiler.objcopy.cmd=avr-objcopy compiler.objcopy.eep.flags=-O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 compiler.elf2hex.flags=-O ihex -R .eeprom compiler.elf2hex.cmd=avr-objcopy compiler.ldflags= compiler.size.cmd=avr-size # This can be overridden in boards.txt build.extra_flags= # These can be overridden in platform.local.txt compiler.c.extra_flags= compiler.c.elf.extra_flags= compiler.S.extra_flags= compiler.cpp.extra_flags= compiler.ar.extra_flags= compiler.objcopy.eep.extra_flags= compiler.elf2hex.extra_flags= # AVR compile patterns # -------------------- ## Compile c files recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.c.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}" ## Compile c++ files recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}" ## Compile S files recipe.S.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.S.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.S.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}" ## Create archives # archive_file_path is needed for backwards compatibility with IDE 1.6.5 or older, IDE 1.6.6 or newer overrides this value archive_file_path={build.path}/{archive_file} recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{archive_file_path}" "{object_file}" ## Combine gc-sections, archives, and objects recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} -mmcu={build.mcu} {compiler.c.elf.extra_flags} -o "{build.path}/{build.project_name}.elf" {object_files} "{build.path}/{archive_file}" "-L{build.path}" -lm ## Create output files (.eep and .hex) recipe.objcopy.eep.pattern="{compiler.path}{compiler.objcopy.cmd}" {compiler.objcopy.eep.flags} {compiler.objcopy.eep.extra_flags} "{build.path}/{build.project_name}.elf" "{build.path}/{build.project_name}.eep" recipe.objcopy.hex.pattern="{compiler.path}{compiler.elf2hex.cmd}" {compiler.elf2hex.flags} {compiler.elf2hex.extra_flags} "{build.path}/{build.project_name}.elf" "{build.path}/{build.project_name}.hex" ## Save hex recipe.output.tmp_file={build.project_name}.hex recipe.output.save_file={build.project_name}.{build.variant}.hex ## Compute size recipe.size.pattern="{compiler.path}{compiler.size.cmd}" -A "{build.path}/{build.project_name}.elf" recipe.size.regex=^(?:\.text|\.data|\.bootloader)\s+([0-9]+).* recipe.size.regex.data=^(?:\.data|\.bss|\.noinit)\s+([0-9]+).* recipe.size.regex.eeprom=^(?:\.eeprom)\s+([0-9]+).* ## Preprocessor preproc.includes.flags=-w -x c++ -M -MG -MP recipe.preproc.includes="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} {preproc.includes.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {includes} "{source_file}" preproc.macros.flags=-w -x c++ -E -CC recipe.preproc.macros="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} {preproc.macros.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{preprocessed_file_path}" # AVR Uploader/Programmers tools # ------------------------------ tools.avrdude.path={runtime.tools.avrdude.path} tools.avrdude.cmd.path={path}/bin/avrdude tools.avrdude.config.path={path}/etc/avrdude.conf tools.avrdude.network_cmd={runtime.tools.arduinoOTA.path}/bin/arduinoOTA tools.avrdude.upload.params.verbose=-v tools.avrdude.upload.params.quiet=-q -q # tools.avrdude.upload.verify is needed for backwards compatibility with IDE 1.6.8 or older, IDE 1.6.9 or newer overrides this value tools.avrdude.upload.verify= tools.avrdude.upload.params.noverify=-V tools.avrdude.upload.pattern="{cmd.path}" "-C{config.path}" {upload.verbose} {upload.verify} -p{build.mcu} -c{upload.protocol} "-P{serial.port}" -b{upload.speed} -D "-Uflash:w:{build.path}/{build.project_name}.hex:i" tools.avrdude.program.params.verbose=-v tools.avrdude.program.params.quiet=-q -q # tools.avrdude.program.verify is needed for backwards compatibility with IDE 1.6.8 or older, IDE 1.6.9 or newer overrides this value tools.avrdude.program.verify= tools.avrdude.program.params.noverify=-V tools.avrdude.program.pattern="{cmd.path}" "-C{config.path}" {program.verbose} {program.verify} -p{build.mcu} -c{protocol} {program.extra_params} "-Uflash:w:{build.path}/{build.project_name}.hex:i" tools.avrdude.erase.params.verbose=-v tools.avrdude.erase.params.quiet=-q -q tools.avrdude.erase.pattern="{cmd.path}" "-C{config.path}" {erase.verbose} -p{build.mcu} -c{protocol} {program.extra_params} -e -Ulock:w:{bootloader.unlock_bits}:m -Uefuse:w:{bootloader.extended_fuses}:m -Uhfuse:w:{bootloader.high_fuses}:m -Ulfuse:w:{bootloader.low_fuses}:m tools.avrdude.bootloader.params.verbose=-v tools.avrdude.bootloader.params.quiet=-q -q tools.avrdude.bootloader.pattern="{cmd.path}" "-C{config.path}" {bootloader.verbose} -p{build.mcu} -c{protocol} {program.extra_params} "-Uflash:w:{runtime.platform.path}/bootloaders/{bootloader.file}:i" -Ulock:w:{bootloader.lock_bits}:m tools.avrdude_remote.upload.pattern=/usr/bin/run-avrdude /tmp/sketch.hex {upload.verbose} -p{build.mcu} tools.avrdude.upload.network_pattern="{network_cmd}" -address {serial.port} -port {upload.network.port} -sketch "{build.path}/{build.project_name}.hex" -upload {upload.network.endpoint_upload} -sync {upload.network.endpoint_sync} -reset {upload.network.endpoint_reset} -sync_exp {upload.network.sync_return} # USB Default Flags # Default blank usb manufacturer will be filled in at compile time # - from numeric vendor ID, set to Unknown otherwise build.usb_manufacturer="Unknown" build.usb_flags=-DUSB_VID={build.vid} -DUSB_PID={build.pid} '-DUSB_MANUFACTURER={build.usb_manufacturer}' '-DUSB_PRODUCT={build.usb_product}' ================================================ FILE: external/arduino/avr/programmers.txt ================================================ avrisp.name=AVR ISP avrisp.communication=serial avrisp.protocol=stk500v1 avrisp.program.protocol=stk500v1 avrisp.program.tool=avrdude avrisp.program.extra_params=-P{serial.port} avrispmkii.name=AVRISP mkII avrispmkii.communication=usb avrispmkii.protocol=stk500v2 avrispmkii.program.protocol=stk500v2 avrispmkii.program.tool=avrdude avrispmkii.program.extra_params=-Pusb usbtinyisp.name=USBtinyISP usbtinyisp.protocol=usbtiny usbtinyisp.program.tool=avrdude usbtinyisp.program.extra_params= arduinoisp.name=ArduinoISP arduinoisp.protocol=arduinoisp arduinoisp.program.tool=avrdude arduinoisp.program.extra_params= arduinoisporg.name=ArduinoISP.org arduinoisporg.protocol=arduinoisporg arduinoisporg.program.tool=avrdude arduinoisporg.program.extra_params= usbasp.name=USBasp usbasp.communication=usb usbasp.protocol=usbasp usbasp.program.protocol=usbasp usbasp.program.tool=avrdude usbasp.program.extra_params=-Pusb parallel.name=Parallel Programmer parallel.protocol=dapa parallel.force=true # parallel.delay=200 parallel.program.tool=avrdude parallel.program.extra_params=-F arduinoasisp.name=Arduino as ISP arduinoasisp.communication=serial arduinoasisp.protocol=stk500v1 arduinoasisp.speed=19200 arduinoasisp.program.protocol=stk500v1 arduinoasisp.program.speed=19200 arduinoasisp.program.tool=avrdude arduinoasisp.program.extra_params=-P{serial.port} -b{program.speed} arduinoasispatmega32u4.name=Arduino as ISP (ATmega32U4) arduinoasispatmega32u4.communication=serial arduinoasispatmega32u4.protocol=arduino arduinoasispatmega32u4.speed=19200 arduinoasispatmega32u4.program.protocol=arduino arduinoasispatmega32u4.program.speed=19200 arduinoasispatmega32u4.program.tool=avrdude arduinoasispatmega32u4.program.extra_params=-P{serial.port} -b{program.speed} usbGemma.name=Arduino Gemma usbGemma.protocol=arduinogemma usbGemma.program.tool=avrdude usbGemma.program.extra_params= usbGemma.config.path={runtime.platform.path}/bootloaders/gemma/avrdude.conf ## Notes about Dangerous Prototypes Bus Pirate as ISP ## Bus Pirate V3 need Firmware v5.10 or later ## Bus Pirate V4 need Firmware v6.3-r2151 or later ## Could happen that BP does not have enough current to power an Arduino board ## through the ICSP connector. In this case disconnect the +Vcc from ICSP connector ## and power Arduino board in the normal way. buspirate.name=BusPirate as ISP buspirate.communication=serial buspirate.protocol=buspirate buspirate.program.protocol=buspirate buspirate.program.tool=avrdude buspirate.program.extra_params=-P{serial.port} # STK500 firmware version v1 and v2 use different serial protocols. # Using the 'stk500' protocol tells avrdude to try and autodetect the # firmware version. If this leads to problems, we might need to add # stk500v1 and stk500v2 entries to allow explicitely selecting the # firmware version. stk500.name=Atmel STK500 development board stk500.communication=serial stk500.protocol=stk500 stk500.program.protocol=stk500 stk500.program.tool=avrdude stk500.program.extra_params=-P{serial.port} jtag3isp.name=Atmel JTAGICE3 (ISP mode) jtag3isp.communication=usb jtag3isp.protocol=jtag3isp jtag3isp.program.protocol=jtag3isp jtag3isp.program.tool=avrdude jtag3isp.program.extra_params= jtag3.name=Atmel JTAGICE3 (JTAG mode) jtag3.communication=usb jtag3.protocol=jtag3 jtag3.program.protocol=jtag3 jtag3.program.tool=avrdude # Set a bitclock of 0.1us (the fastest supported value). This should # work regardless of the crystal used, since JTAG doesn't use the MCU # clock but dictates its own clock. jtag3.program.extra_params=-B0.1 atmel_ice.name=Atmel-ICE (AVR) atmel_ice.communication=usb atmel_ice.protocol=atmelice_isp atmel_ice.program.protocol=atmelice_isp atmel_ice.program.tool=avrdude atmel_ice.program.extra_params=-Pusb ================================================ FILE: external/arduino/avr/variants/circuitplay32u4/pins_arduino.h ================================================ /* pins_arduino.h - Pin definition functions for Arduino Part of Arduino - http://www.arduino.cc/ Copyright (c) 2007 David A. Mellis This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA $Id: wiring.h 249 2007-02-03 16:52:51Z mellis $ */ #ifndef Pins_Arduino_h #define Pins_Arduino_h #include // Workaround for wrong definitions in "iom32u4.h". // This should be fixed in the AVR toolchain. #undef UHCON #undef UHINT #undef UHIEN #undef UHADDR #undef UHFNUM #undef UHFNUML #undef UHFNUMH #undef UHFLEN #undef UPINRQX #undef UPINTX #undef UPNUM #undef UPRST #undef UPCONX #undef UPCFG0X #undef UPCFG1X #undef UPSTAX #undef UPCFG2X #undef UPIENX #undef UPDATX #undef TCCR2A #undef WGM20 #undef WGM21 #undef COM2B0 #undef COM2B1 #undef COM2A0 #undef COM2A1 #undef TCCR2B #undef CS20 #undef CS21 #undef CS22 #undef WGM22 #undef FOC2B #undef FOC2A #undef TCNT2 #undef TCNT2_0 #undef TCNT2_1 #undef TCNT2_2 #undef TCNT2_3 #undef TCNT2_4 #undef TCNT2_5 #undef TCNT2_6 #undef TCNT2_7 #undef OCR2A #undef OCR2_0 #undef OCR2_1 #undef OCR2_2 #undef OCR2_3 #undef OCR2_4 #undef OCR2_5 #undef OCR2_6 #undef OCR2_7 #undef OCR2B #undef OCR2_0 #undef OCR2_1 #undef OCR2_2 #undef OCR2_3 #undef OCR2_4 #undef OCR2_5 #undef OCR2_6 #undef OCR2_7 #define NUM_DIGITAL_PINS 31 #define NUM_ANALOG_INPUTS 12 #define TXLED0 0 #define TXLED1 0 #define RXLED0 0 #define RXLED1 0 #define TX_RX_LED_INIT 0 static const uint8_t SDA = 2; static const uint8_t SCL = 3; #define LED_BUILTIN 13 // Map SPI port to 'new' pins D14..D17 static const uint8_t SS = 17; static const uint8_t MOSI = 16; static const uint8_t MISO = 14; static const uint8_t SCK = 15; // Mapping of analog pins as digital I/O // A6-A11 share with digital pins static const uint8_t A0 = 18; static const uint8_t A1 = 19; static const uint8_t A2 = 20; static const uint8_t A3 = 21; static const uint8_t A4 = 22; static const uint8_t A5 = 23; static const uint8_t A6 = 24; // D4 static const uint8_t A7 = 25; // D6 static const uint8_t A8 = 26; // D8 static const uint8_t A9 = 27; // D9 static const uint8_t A10 = 28; // D10 static const uint8_t A11 = 29; // D12 #define digitalPinToPCICR(p) ((((p) >= 8 && (p) <= 11) || ((p) >= 14 && (p) <= 17) || ((p) >= A8 && (p) <= A10)) ? (&PCICR) : ((uint8_t *)0)) #define digitalPinToPCICRbit(p) 0 #define digitalPinToPCMSK(p) ((((p) >= 8 && (p) <= 11) || ((p) >= 14 && (p) <= 17) || ((p) >= A8 && (p) <= A10)) ? (&PCMSK0) : ((uint8_t *)0)) #define digitalPinToPCMSKbit(p) ( ((p) >= 8 && (p) <= 11) ? (p) - 4 : ((p) == 14 ? 3 : ((p) == 15 ? 1 : ((p) == 16 ? 2 : ((p) == 17 ? 0 : (p - A8 + 4)))))) // __AVR_ATmega32U4__ has an unusual mapping of pins to channels extern const uint8_t PROGMEM analog_pin_to_channel_PGM[]; #define analogPinToChannel(P) ( pgm_read_byte( analog_pin_to_channel_PGM + (P) ) ) #define digitalPinHasPWM(p) ((p) == 3 || (p) == 5 || (p) == 6 || (p) == 9 || (p) == 10 || (p) == 11 || (p) == 13) #define digitalPinToInterrupt(p) ((p) == 0 ? 2 : ((p) == 1 ? 3 : ((p) == 2 ? 1 : ((p) == 3 ? 0 : ((p) == 7 ? 4 : NOT_AN_INTERRUPT))))) #ifdef ARDUINO_MAIN // On the Arduino board, digital pins are also used // for the analog output (software PWM). Analog input // pins are a separate set. // ATMEL ATMEGA32U4 / ARDUINO LEONARDO / Flora // // D0 PD2 RXD1/INT2 // D1 PD3 TXD1/INT3 // D2 PD1 SDA SDA/INT1 // D3# PD0 PWM8/SCL OC0B/SCL/INT0 // D4 A6 PD4 ADC8 // D5# PC6 ??? OC3A/#OC4A // D6# A7 PD7 FastPWM #OC4D/ADC10 // D7 PE6 INT6/AIN0 // // D8 A8 PB4 ADC11/PCINT4 // D9# A9 PB5 PWM16 OC1A/#OC4B/ADC12/PCINT5 // D10# A10 PB6 PWM16 OC1B/0c4B/ADC13/PCINT6 // D11# PB7 PWM8/16 0C0A/OC1C/#RTS/PCINT7 // D12 A11 PD6 T1/#OC4D/ADC9 // D13# PC7 PWM10 CLK0/OC4A // // A0 D18 PF7 ADC7 // A1 D19 PF6 ADC6 // A2 D20 PF5 ADC5 // A3 D21 PF4 ADC4 // A4 D22 PF1 ADC1 // A5 D23 PF0 ADC0 // // New pins D14..D17 to map SPI port to digital pins // // MISO D14 PB3 MISO,PCINT3 // SCK D15 PB1 SCK,PCINT1 // MOSI D16 PB2 MOSI,PCINT2 // SS D17 PB0 RXLED,SS/PCINT0 // // TXLED D30 PD5 // RXLED PB0 // HWB PE2 HWB // these arrays map port names (e.g. port B) to the // appropriate addresses for various functions (e.g. reading // and writing) const uint16_t PROGMEM port_to_mode_PGM[] = { NOT_A_PORT, NOT_A_PORT, (uint16_t) &DDRB, (uint16_t) &DDRC, (uint16_t) &DDRD, (uint16_t) &DDRE, (uint16_t) &DDRF, }; const uint16_t PROGMEM port_to_output_PGM[] = { NOT_A_PORT, NOT_A_PORT, (uint16_t) &PORTB, (uint16_t) &PORTC, (uint16_t) &PORTD, (uint16_t) &PORTE, (uint16_t) &PORTF, }; const uint16_t PROGMEM port_to_input_PGM[] = { NOT_A_PORT, NOT_A_PORT, (uint16_t) &PINB, (uint16_t) &PINC, (uint16_t) &PIND, (uint16_t) &PINE, (uint16_t) &PINF, }; const uint8_t PROGMEM digital_pin_to_port_PGM[] = { PD, // D0 - PD2 PD, // D1 - PD3 PD, // D2 - PD1 PD, // D3 - PD0 PD, // D4 - PD4 PC, // D5 - PC6 PD, // D6 - PD7 PE, // D7 - PE6 PB, // D8 - PB4 PB, // D9 - PB5 PB, // D10 - PB6 PB, // D11 - PB7 PD, // D12 - PD6 PC, // D13 - PC7 PB, // D14 - MISO - PB3 PB, // D15 - SCK - PB1 PB, // D16 - MOSI - PB2 PB, // D17 - SS - PB0 PF, // D18 - A0 - PF7 PF, // D19 - A1 - PF6 PF, // D20 - A2 - PF5 PF, // D21 - A3 - PF4 PF, // D22 - A4 - PF1 PF, // D23 - A5 - PF0 PD, // D24 / D4 - A6 - PD4 PD, // D25 / D6 - A7 - PD7 PB, // D26 / D8 - A8 - PB4 PB, // D27 / D9 - A9 - PB5 PB, // D28 / D10 - A10 - PB6 PD, // D29 / D12 - A11 - PD6 PD, // D30 - PD5 }; const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { _BV(2), // D0 - PD2 _BV(3), // D1 - PD3 _BV(1), // D2 - PD1 _BV(0), // D3 - PD0 _BV(4), // D4 - PD4 _BV(6), // D5 - PC6 _BV(7), // D6 - PD7 _BV(6), // D7 - PE6 _BV(4), // D8 - PB4 _BV(5), // D9 - PB5 _BV(6), // D10 - PB6 _BV(7), // D11 - PB7 _BV(6), // D12 - PD6 _BV(7), // D13 - PC7 _BV(3), // D14 - MISO - PB3 _BV(1), // D15 - SCK - PB1 _BV(2), // D16 - MOSI - PB2 _BV(0), // D17 - SS - PB0 _BV(7), // D18 - A0 - PF7 _BV(6), // D19 - A1 - PF6 _BV(5), // D20 - A2 - PF5 _BV(4), // D21 - A3 - PF4 _BV(1), // D22 - A4 - PF1 _BV(0), // D23 - A5 - PF0 _BV(4), // D24 / D4 - A6 - PD4 _BV(7), // D25 / D6 - A7 - PD7 _BV(4), // D26 / D8 - A8 - PB4 _BV(5), // D27 / D9 - A9 - PB5 _BV(6), // D28 / D10 - A10 - PB6 _BV(6), // D29 / D12 - A11 - PD6 _BV(5), // D30 - PD5 }; const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, TIMER0B, /* 3 */ NOT_ON_TIMER, TIMER3A, /* 5 */ TIMER4D, /* 6 */ NOT_ON_TIMER, NOT_ON_TIMER, TIMER1A, /* 9 */ TIMER1B, /* 10 */ TIMER0A, /* 11 */ NOT_ON_TIMER, TIMER4A, /* 13 */ NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, }; const uint8_t PROGMEM analog_pin_to_channel_PGM[] = { 7, // A0 PF7 ADC7 6, // A1 PF6 ADC6 5, // A2 PF5 ADC5 4, // A3 PF4 ADC4 1, // A4 PF1 ADC1 0, // A5 PF0 ADC0 8, // A6 D4 PD4 ADC8 10, // A7 D6 PD7 ADC10 11, // A8 D8 PB4 ADC11 12, // A9 D9 PB5 ADC12 13, // A10 D10 PB6 ADC13 9 // A11 D12 PD6 ADC9 }; #endif /* ARDUINO_MAIN */ // These serial port names are intended to allow libraries and architecture-neutral // sketches to automatically default to the correct port name for a particular type // of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, // the first hardware serial port whose RX/TX pins are not dedicated to another use. // // SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor // // SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial // // SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library // // SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. // // SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX // pins are NOT connected to anything by default. #define SERIAL_PORT_MONITOR Serial #define SERIAL_PORT_USBVIRTUAL Serial #define SERIAL_PORT_HARDWARE Serial1 #define SERIAL_PORT_HARDWARE_OPEN Serial1 // Alias SerialUSB to Serial #define SerialUSB SERIAL_PORT_USBVIRTUAL // Bootloader related fields // Old Caterina bootloader places the MAGIC key into unsafe RAM locations (it can be rewritten // by the running sketch before to actual reboot). // Newer bootloaders, recognizable by the LUFA "signature" at the end of the flash, can handle both // the usafe and the safe location. Check once (in USBCore.cpp) if the bootloader in new, then set the global // _updatedLUFAbootloader variable to true/false and place the magic key consequently #ifndef MAGIC_KEY #define MAGIC_KEY 0x7777 #endif #ifndef MAGIC_KEY_POS #define MAGIC_KEY_POS 0x0800 #endif #ifndef NEW_LUFA_SIGNATURE #define NEW_LUFA_SIGNATURE 0xDCFB #endif #endif /* Pins_Arduino_h */ ================================================ FILE: external/arduino/avr/variants/eightanaloginputs/pins_arduino.h ================================================ /* pins_arduino.h - Pin definition functions for Arduino Part of Arduino - http://www.arduino.cc/ Copyright (c) 2007 David A. Mellis This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "../standard/pins_arduino.h" #undef NUM_ANALOG_INPUTS #define NUM_ANALOG_INPUTS 8 ================================================ FILE: external/arduino/avr/variants/ethernet/pins_arduino.h ================================================ /* pins_arduino.h - Pin definition functions for Arduino Part of Arduino - http://www.arduino.cc/ Copyright (c) 2007 David A. Mellis This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef Pins_Arduino_h #define Pins_Arduino_h #include #define NUM_DIGITAL_PINS 20 #define NUM_ANALOG_INPUTS 6 #define analogInputToDigitalPin(p) ((p < 6) ? (p) + 14 : -1) #if defined(__AVR_ATmega8__) #define digitalPinHasPWM(p) ((p) == 9 || (p) == 10 || (p) == 11) #else #define digitalPinHasPWM(p) ((p) == 3 || (p) == 5 || (p) == 6 || (p) == 9 || (p) == 10 || (p) == 11) #endif #define PIN_SPI_SS (10) #define PIN_SPI_MOSI (11) #define PIN_SPI_MISO (12) #define PIN_SPI_SCK (13) static const uint8_t SS = PIN_SPI_SS; static const uint8_t MOSI = PIN_SPI_MOSI; static const uint8_t MISO = PIN_SPI_MISO; static const uint8_t SCK = PIN_SPI_SCK; #define PIN_WIRE_SDA (18) #define PIN_WIRE_SCL (19) static const uint8_t SDA = PIN_WIRE_SDA; static const uint8_t SCL = PIN_WIRE_SCL; #define LED_BUILTIN 9 #define PIN_A0 (14) #define PIN_A1 (15) #define PIN_A2 (16) #define PIN_A3 (17) #define PIN_A4 (18) #define PIN_A5 (19) #define PIN_A6 (20) #define PIN_A7 (21) static const uint8_t A0 = PIN_A0; static const uint8_t A1 = PIN_A1; static const uint8_t A2 = PIN_A2; static const uint8_t A3 = PIN_A3; static const uint8_t A4 = PIN_A4; static const uint8_t A5 = PIN_A5; static const uint8_t A6 = PIN_A6; static const uint8_t A7 = PIN_A7; #define digitalPinToPCICR(p) (((p) >= 0 && (p) <= 21) ? (&PCICR) : ((uint8_t *)0)) #define digitalPinToPCICRbit(p) (((p) <= 7) ? 2 : (((p) <= 13) ? 0 : 1)) #define digitalPinToPCMSK(p) (((p) <= 7) ? (&PCMSK2) : (((p) <= 13) ? (&PCMSK0) : (((p) <= 21) ? (&PCMSK1) : ((uint8_t *)0)))) #define digitalPinToPCMSKbit(p) (((p) <= 7) ? (p) : (((p) <= 13) ? ((p) - 8) : ((p) - 14))) #define digitalPinToInterrupt(p) ((p) == 2 ? 0 : ((p) == 3 ? 1 : NOT_AN_INTERRUPT)) #ifdef ARDUINO_MAIN // On the Arduino board, digital pins are also used // for the analog output (software PWM). Analog input // pins are a separate set. // ATMEL ATMEGA8 & 168 / ARDUINO // // +-\/-+ // PC6 1| |28 PC5 (AI 5) // (D 0) PD0 2| |27 PC4 (AI 4) // (D 1) PD1 3| |26 PC3 (AI 3) // (D 2) PD2 4| |25 PC2 (AI 2) // PWM+ (D 3) PD3 5| |24 PC1 (AI 1) // (D 4) PD4 6| |23 PC0 (AI 0) // VCC 7| |22 GND // GND 8| |21 AREF // PB6 9| |20 AVCC // PB7 10| |19 PB5 (D 13) // PWM+ (D 5) PD5 11| |18 PB4 (D 12) // PWM+ (D 6) PD6 12| |17 PB3 (D 11) PWM // (D 7) PD7 13| |16 PB2 (D 10) PWM // (D 8) PB0 14| |15 PB1 (D 9) PWM // +----+ // // (PWM+ indicates the additional PWM pins on the ATmega168.) // ATMEL ATMEGA1280 / ARDUINO // // 0-7 PE0-PE7 works // 8-13 PB0-PB5 works // 14-21 PA0-PA7 works // 22-29 PH0-PH7 works // 30-35 PG5-PG0 works // 36-43 PC7-PC0 works // 44-51 PJ7-PJ0 works // 52-59 PL7-PL0 works // 60-67 PD7-PD0 works // A0-A7 PF0-PF7 // A8-A15 PK0-PK7 // these arrays map port names (e.g. port B) to the // appropriate addresses for various functions (e.g. reading // and writing) const uint16_t PROGMEM port_to_mode_PGM[] = { NOT_A_PORT, NOT_A_PORT, (uint16_t) &DDRB, (uint16_t) &DDRC, (uint16_t) &DDRD, }; const uint16_t PROGMEM port_to_output_PGM[] = { NOT_A_PORT, NOT_A_PORT, (uint16_t) &PORTB, (uint16_t) &PORTC, (uint16_t) &PORTD, }; const uint16_t PROGMEM port_to_input_PGM[] = { NOT_A_PORT, NOT_A_PORT, (uint16_t) &PINB, (uint16_t) &PINC, (uint16_t) &PIND, }; const uint8_t PROGMEM digital_pin_to_port_PGM[] = { PD, /* 0 */ PD, PD, PD, PD, PD, PD, PD, PB, /* 8 */ PB, PB, PB, PB, PB, PC, /* 14 */ PC, PC, PC, PC, PC, }; const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { _BV(0), /* 0, port D */ _BV(1), _BV(2), _BV(3), _BV(4), _BV(5), _BV(6), _BV(7), _BV(0), /* 8, port B */ _BV(1), _BV(2), _BV(3), _BV(4), _BV(5), _BV(0), /* 14, port C */ _BV(1), _BV(2), _BV(3), _BV(4), _BV(5), }; const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { NOT_ON_TIMER, /* 0 - port D */ NOT_ON_TIMER, NOT_ON_TIMER, // on the ATmega168, digital pin 3 has hardware pwm #if defined(__AVR_ATmega8__) NOT_ON_TIMER, #else TIMER2B, #endif NOT_ON_TIMER, // on the ATmega168, digital pins 5 and 6 have hardware pwm #if defined(__AVR_ATmega8__) NOT_ON_TIMER, NOT_ON_TIMER, #else TIMER0B, TIMER0A, #endif NOT_ON_TIMER, NOT_ON_TIMER, /* 8 - port B */ TIMER1A, TIMER1B, #if defined(__AVR_ATmega8__) TIMER2, #else TIMER2A, #endif NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, /* 14 - port C */ NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, }; #endif // These serial port names are intended to allow libraries and architecture-neutral // sketches to automatically default to the correct port name for a particular type // of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, // the first hardware serial port whose RX/TX pins are not dedicated to another use. // // SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor // // SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial // // SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library // // SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. // // SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX // pins are NOT connected to anything by default. #define SERIAL_PORT_HARDWARE Serial #define SERIAL_PORT_HARDWARE_OPEN Serial #define SERIAL_PORT_MONITOR Serial #endif ================================================ FILE: external/arduino/avr/variants/gemma/pins_arduino.h ================================================ /* pins_arduino.c - pin definitions for the Arduino board Part of Arduino / Wiring Lite Copyright (c) 2005 David A. Mellis This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Modified 28-08-2009 for attiny84 R.Wiersma Modified 09-10-2009 for attiny45 A.Saporetti */ #ifndef Pins_Arduino_h #define Pins_Arduino_h #include // Defines to make D4 support PWM // See for more info: http://forums.adafruit.com/viewtopic.php?f=52&t=43951 //#define TCCR1A GTCCR //#define WGM10 PWM1B // ATMEL ATTINY45 / ARDUINO // // +-\/-+ // Ain0 (D 5) PB5 1| |8 Vcc // Ain3 (D 3) PB3 2| |7 PB2 (D 2) Ain1 // Ain2 (D 4) PB4 3| |6 PB1 (D 1) pwm1 // GND 4| |5 PB0 (D 0) pwm0 // +----+ #define NUM_DIGITAL_PINS 3 #define NUM_ANALOG_INPUTS 1 #define LED_BUILTIN 1 #define PIN_A0 (6) #define PIN_A1 (7) #define PIN_A2 (8) #define PIN_A3 (9) static const uint8_t A0 = PIN_A0; static const uint8_t A1 = PIN_A1; static const uint8_t A2 = PIN_A2; static const uint8_t A3 = PIN_A3; #define digitalPinToPCICR(p) ( ((p) >= 0 && (p) <= 4) ? (&GIMSK) : ((uint8_t *)0) ) #define digitalPinToPCICRbit(p) ( PCIE ) #define digitalPinToPCMSK(p) ( ((p) <= 4) ? (&PCMSK) : ((uint8_t *)0) ) #define digitalPinToPCMSKbit(p) ( (p) ) #define digitalPinToInterrupt(p) ((p) == 2 ? 0 : NOT_AN_INTERRUPT) #define analogPinToChannel(p) ( (p) < 6 ? (p) : (p) - 6 ) #define TCCR1A GTCCR #ifdef ARDUINO_MAIN void initVariant() { GTCCR |= (1 << PWM1B); } // these arrays map port names (e.g. port B) to the // appropriate addresses for various functions (e.g. reading // and writing) tiny45 only port B const uint16_t PROGMEM port_to_mode_PGM[] = { NOT_A_PORT, NOT_A_PORT, (uint16_t) &DDRB, }; const uint16_t PROGMEM port_to_output_PGM[] = { NOT_A_PORT, NOT_A_PORT, (uint16_t) &PORTB, }; const uint16_t PROGMEM port_to_input_PGM[] = { NOT_A_PIN, NOT_A_PIN, (uint16_t) &PINB, }; const uint8_t PROGMEM digital_pin_to_port_PGM[] = { PB, /* 0 */ PB, PB, PB, PB, PB, // 5 PB, // A0 PB, PB, PB, // A4 }; const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { _BV(0), /* 0, port B */ _BV(1), _BV(2), _BV(3), /* 3 port B */ _BV(4), _BV(5), _BV(5), _BV(2), _BV(4), _BV(3), }; const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { TIMER0A, /* OC0A */ TIMER0B, NOT_ON_TIMER, NOT_ON_TIMER, TIMER1B, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, }; #endif #endif ================================================ FILE: external/arduino/avr/variants/leonardo/pins_arduino.h ================================================ /* pins_arduino.h - Pin definition functions for Arduino Part of Arduino - http://www.arduino.cc/ Copyright (c) 2007 David A. Mellis This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef Pins_Arduino_h #define Pins_Arduino_h #include // Workaround for wrong definitions in "iom32u4.h". // This should be fixed in the AVR toolchain. #undef UHCON #undef UHINT #undef UHIEN #undef UHADDR #undef UHFNUM #undef UHFNUML #undef UHFNUMH #undef UHFLEN #undef UPINRQX #undef UPINTX #undef UPNUM #undef UPRST #undef UPCONX #undef UPCFG0X #undef UPCFG1X #undef UPSTAX #undef UPCFG2X #undef UPIENX #undef UPDATX #undef TCCR2A #undef WGM20 #undef WGM21 #undef COM2B0 #undef COM2B1 #undef COM2A0 #undef COM2A1 #undef TCCR2B #undef CS20 #undef CS21 #undef CS22 #undef WGM22 #undef FOC2B #undef FOC2A #undef TCNT2 #undef TCNT2_0 #undef TCNT2_1 #undef TCNT2_2 #undef TCNT2_3 #undef TCNT2_4 #undef TCNT2_5 #undef TCNT2_6 #undef TCNT2_7 #undef OCR2A #undef OCR2_0 #undef OCR2_1 #undef OCR2_2 #undef OCR2_3 #undef OCR2_4 #undef OCR2_5 #undef OCR2_6 #undef OCR2_7 #undef OCR2B #undef OCR2_0 #undef OCR2_1 #undef OCR2_2 #undef OCR2_3 #undef OCR2_4 #undef OCR2_5 #undef OCR2_6 #undef OCR2_7 #define NUM_DIGITAL_PINS 31 #define NUM_ANALOG_INPUTS 12 #define TX_RX_LED_INIT DDRD |= (1<<5), DDRB |= (1<<0) #define TXLED0 PORTD |= (1<<5) #define TXLED1 PORTD &= ~(1<<5) #define RXLED0 PORTB |= (1<<0) #define RXLED1 PORTB &= ~(1<<0) #define PIN_WIRE_SDA (2) #define PIN_WIRE_SCL (3) static const uint8_t SDA = PIN_WIRE_SDA; static const uint8_t SCL = PIN_WIRE_SCL; #define LED_BUILTIN 13 #define LED_BUILTIN_RX 17 #define LED_BUILTIN_TX 30 // Map SPI port to 'new' pins D14..D17 #define PIN_SPI_SS (17) #define PIN_SPI_MOSI (16) #define PIN_SPI_MISO (14) #define PIN_SPI_SCK (15) static const uint8_t SS = PIN_SPI_SS; static const uint8_t MOSI = PIN_SPI_MOSI; static const uint8_t MISO = PIN_SPI_MISO; static const uint8_t SCK = PIN_SPI_SCK; // Mapping of analog pins as digital I/O // A6-A11 share with digital pins #define PIN_A0 (18) #define PIN_A1 (19) #define PIN_A2 (20) #define PIN_A3 (21) #define PIN_A4 (22) #define PIN_A5 (23) #define PIN_A6 (24) #define PIN_A7 (25) #define PIN_A8 (26) #define PIN_A9 (27) #define PIN_A10 (28) #define PIN_A11 (29) static const uint8_t A0 = PIN_A0; static const uint8_t A1 = PIN_A1; static const uint8_t A2 = PIN_A2; static const uint8_t A3 = PIN_A3; static const uint8_t A4 = PIN_A4; static const uint8_t A5 = PIN_A5; static const uint8_t A6 = PIN_A6; // D4 static const uint8_t A7 = PIN_A7; // D6 static const uint8_t A8 = PIN_A8; // D8 static const uint8_t A9 = PIN_A9; // D9 static const uint8_t A10 = PIN_A10; // D10 static const uint8_t A11 = PIN_A11; // D12 #define digitalPinToPCICR(p) ((((p) >= 8 && (p) <= 11) || ((p) >= 14 && (p) <= 17) || ((p) >= A8 && (p) <= A10)) ? (&PCICR) : ((uint8_t *)0)) #define digitalPinToPCICRbit(p) 0 #define digitalPinToPCMSK(p) ((((p) >= 8 && (p) <= 11) || ((p) >= 14 && (p) <= 17) || ((p) >= A8 && (p) <= A10)) ? (&PCMSK0) : ((uint8_t *)0)) #define digitalPinToPCMSKbit(p) ( ((p) >= 8 && (p) <= 11) ? (p) - 4 : ((p) == 14 ? 3 : ((p) == 15 ? 1 : ((p) == 16 ? 2 : ((p) == 17 ? 0 : (p - A8 + 4)))))) // __AVR_ATmega32U4__ has an unusual mapping of pins to channels extern const uint8_t PROGMEM analog_pin_to_channel_PGM[]; #define analogPinToChannel(P) ( pgm_read_byte( analog_pin_to_channel_PGM + (P) ) ) #define digitalPinHasPWM(p) ((p) == 3 || (p) == 5 || (p) == 6 || (p) == 9 || (p) == 10 || (p) == 11 || (p) == 13) #define digitalPinToInterrupt(p) ((p) == 0 ? 2 : ((p) == 1 ? 3 : ((p) == 2 ? 1 : ((p) == 3 ? 0 : ((p) == 7 ? 4 : NOT_AN_INTERRUPT))))) #ifdef ARDUINO_MAIN // On the Arduino board, digital pins are also used // for the analog output (software PWM). Analog input // pins are a separate set. // ATMEL ATMEGA32U4 / ARDUINO LEONARDO // // D0 PD2 RXD1/INT2 // D1 PD3 TXD1/INT3 // D2 PD1 SDA SDA/INT1 // D3# PD0 PWM8/SCL OC0B/SCL/INT0 // D4 A6 PD4 ADC8 // D5# PC6 ??? OC3A/#OC4A // D6# A7 PD7 FastPWM #OC4D/ADC10 // D7 PE6 INT6/AIN0 // // D8 A8 PB4 ADC11/PCINT4 // D9# A9 PB5 PWM16 OC1A/#OC4B/ADC12/PCINT5 // D10# A10 PB6 PWM16 OC1B/0c4B/ADC13/PCINT6 // D11# PB7 PWM8/16 0C0A/OC1C/#RTS/PCINT7 // D12 A11 PD6 T1/#OC4D/ADC9 // D13# PC7 PWM10 CLK0/OC4A // // A0 D18 PF7 ADC7 // A1 D19 PF6 ADC6 // A2 D20 PF5 ADC5 // A3 D21 PF4 ADC4 // A4 D22 PF1 ADC1 // A5 D23 PF0 ADC0 // // New pins D14..D17 to map SPI port to digital pins // // MISO D14 PB3 MISO,PCINT3 // SCK D15 PB1 SCK,PCINT1 // MOSI D16 PB2 MOSI,PCINT2 // SS D17 PB0 RXLED,SS/PCINT0 // // TXLED D30 PD5 XCK1 // RXLED D17 PB0 // HWB PE2 HWB // these arrays map port names (e.g. port B) to the // appropriate addresses for various functions (e.g. reading // and writing) const uint16_t PROGMEM port_to_mode_PGM[] = { NOT_A_PORT, NOT_A_PORT, (uint16_t) &DDRB, (uint16_t) &DDRC, (uint16_t) &DDRD, (uint16_t) &DDRE, (uint16_t) &DDRF, }; const uint16_t PROGMEM port_to_output_PGM[] = { NOT_A_PORT, NOT_A_PORT, (uint16_t) &PORTB, (uint16_t) &PORTC, (uint16_t) &PORTD, (uint16_t) &PORTE, (uint16_t) &PORTF, }; const uint16_t PROGMEM port_to_input_PGM[] = { NOT_A_PORT, NOT_A_PORT, (uint16_t) &PINB, (uint16_t) &PINC, (uint16_t) &PIND, (uint16_t) &PINE, (uint16_t) &PINF, }; const uint8_t PROGMEM digital_pin_to_port_PGM[] = { PD, // D0 - PD2 PD, // D1 - PD3 PD, // D2 - PD1 PD, // D3 - PD0 PD, // D4 - PD4 PC, // D5 - PC6 PD, // D6 - PD7 PE, // D7 - PE6 PB, // D8 - PB4 PB, // D9 - PB5 PB, // D10 - PB6 PB, // D11 - PB7 PD, // D12 - PD6 PC, // D13 - PC7 PB, // D14 - MISO - PB3 PB, // D15 - SCK - PB1 PB, // D16 - MOSI - PB2 PB, // D17 - SS - PB0 PF, // D18 - A0 - PF7 PF, // D19 - A1 - PF6 PF, // D20 - A2 - PF5 PF, // D21 - A3 - PF4 PF, // D22 - A4 - PF1 PF, // D23 - A5 - PF0 PD, // D24 / D4 - A6 - PD4 PD, // D25 / D6 - A7 - PD7 PB, // D26 / D8 - A8 - PB4 PB, // D27 / D9 - A9 - PB5 PB, // D28 / D10 - A10 - PB6 PD, // D29 / D12 - A11 - PD6 PD, // D30 / TX Led - PD5 }; const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { _BV(2), // D0 - PD2 _BV(3), // D1 - PD3 _BV(1), // D2 - PD1 _BV(0), // D3 - PD0 _BV(4), // D4 - PD4 _BV(6), // D5 - PC6 _BV(7), // D6 - PD7 _BV(6), // D7 - PE6 _BV(4), // D8 - PB4 _BV(5), // D9 - PB5 _BV(6), // D10 - PB6 _BV(7), // D11 - PB7 _BV(6), // D12 - PD6 _BV(7), // D13 - PC7 _BV(3), // D14 - MISO - PB3 _BV(1), // D15 - SCK - PB1 _BV(2), // D16 - MOSI - PB2 _BV(0), // D17 - SS - PB0 _BV(7), // D18 - A0 - PF7 _BV(6), // D19 - A1 - PF6 _BV(5), // D20 - A2 - PF5 _BV(4), // D21 - A3 - PF4 _BV(1), // D22 - A4 - PF1 _BV(0), // D23 - A5 - PF0 _BV(4), // D24 / D4 - A6 - PD4 _BV(7), // D25 / D6 - A7 - PD7 _BV(4), // D26 / D8 - A8 - PB4 _BV(5), // D27 / D9 - A9 - PB5 _BV(6), // D28 / D10 - A10 - PB6 _BV(6), // D29 / D12 - A11 - PD6 _BV(5), // D30 / TX Led - PD5 }; const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, TIMER0B, /* 3 */ NOT_ON_TIMER, TIMER3A, /* 5 */ TIMER4D, /* 6 */ NOT_ON_TIMER, NOT_ON_TIMER, TIMER1A, /* 9 */ TIMER1B, /* 10 */ TIMER0A, /* 11 */ NOT_ON_TIMER, TIMER4A, /* 13 */ NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, }; const uint8_t PROGMEM analog_pin_to_channel_PGM[] = { 7, // A0 PF7 ADC7 6, // A1 PF6 ADC6 5, // A2 PF5 ADC5 4, // A3 PF4 ADC4 1, // A4 PF1 ADC1 0, // A5 PF0 ADC0 8, // A6 D4 PD4 ADC8 10, // A7 D6 PD7 ADC10 11, // A8 D8 PB4 ADC11 12, // A9 D9 PB5 ADC12 13, // A10 D10 PB6 ADC13 9 // A11 D12 PD6 ADC9 }; #endif /* ARDUINO_MAIN */ // These serial port names are intended to allow libraries and architecture-neutral // sketches to automatically default to the correct port name for a particular type // of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, // the first hardware serial port whose RX/TX pins are not dedicated to another use. // // SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor // // SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial // // SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library // // SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. // // SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX // pins are NOT connected to anything by default. #define SERIAL_PORT_MONITOR Serial #define SERIAL_PORT_USBVIRTUAL Serial #define SERIAL_PORT_HARDWARE Serial1 #define SERIAL_PORT_HARDWARE_OPEN Serial1 // Alias SerialUSB to Serial #define SerialUSB SERIAL_PORT_USBVIRTUAL #endif /* Pins_Arduino_h */ ================================================ FILE: external/arduino/avr/variants/mega/pins_arduino.h ================================================ /* pins_arduino.h - Pin definition functions for Arduino Part of Arduino - http://www.arduino.cc/ Copyright (c) 2007 David A. Mellis This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef Pins_Arduino_h #define Pins_Arduino_h #include #define NUM_DIGITAL_PINS 70 #define NUM_ANALOG_INPUTS 16 #define analogInputToDigitalPin(p) ((p < 16) ? (p) + 54 : -1) #define digitalPinHasPWM(p) (((p) >= 2 && (p) <= 13) || ((p) >= 44 && (p)<= 46)) #define PIN_SPI_SS (53) #define PIN_SPI_MOSI (51) #define PIN_SPI_MISO (50) #define PIN_SPI_SCK (52) static const uint8_t SS = PIN_SPI_SS; static const uint8_t MOSI = PIN_SPI_MOSI; static const uint8_t MISO = PIN_SPI_MISO; static const uint8_t SCK = PIN_SPI_SCK; #define PIN_WIRE_SDA (20) #define PIN_WIRE_SCL (21) static const uint8_t SDA = PIN_WIRE_SDA; static const uint8_t SCL = PIN_WIRE_SCL; #define LED_BUILTIN 13 #define PIN_A0 (54) #define PIN_A1 (55) #define PIN_A2 (56) #define PIN_A3 (57) #define PIN_A4 (58) #define PIN_A5 (59) #define PIN_A6 (60) #define PIN_A7 (61) #define PIN_A8 (62) #define PIN_A9 (63) #define PIN_A10 (64) #define PIN_A11 (65) #define PIN_A12 (66) #define PIN_A13 (67) #define PIN_A14 (68) #define PIN_A15 (69) static const uint8_t A0 = PIN_A0; static const uint8_t A1 = PIN_A1; static const uint8_t A2 = PIN_A2; static const uint8_t A3 = PIN_A3; static const uint8_t A4 = PIN_A4; static const uint8_t A5 = PIN_A5; static const uint8_t A6 = PIN_A6; static const uint8_t A7 = PIN_A7; static const uint8_t A8 = PIN_A8; static const uint8_t A9 = PIN_A9; static const uint8_t A10 = PIN_A10; static const uint8_t A11 = PIN_A11; static const uint8_t A12 = PIN_A12; static const uint8_t A13 = PIN_A13; static const uint8_t A14 = PIN_A14; static const uint8_t A15 = PIN_A15; // A majority of the pins are NOT PCINTs, SO BE WARNED (i.e. you cannot use them as receive pins) // Only pins available for RECEIVE (TRANSMIT can be on any pin): // (I've deliberately left out pin mapping to the Hardware USARTs - seems senseless to me) // Pins: 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69 #define digitalPinToPCICR(p) ( (((p) >= 10) && ((p) <= 13)) || \ (((p) >= 50) && ((p) <= 53)) || \ (((p) >= 62) && ((p) <= 69)) ? (&PCICR) : ((uint8_t *)0) ) #define digitalPinToPCICRbit(p) ( (((p) >= 10) && ((p) <= 13)) || (((p) >= 50) && ((p) <= 53)) ? 0 : \ ( (((p) >= 62) && ((p) <= 69)) ? 2 : \ 0 ) ) #define digitalPinToPCMSK(p) ( (((p) >= 10) && ((p) <= 13)) || (((p) >= 50) && ((p) <= 53)) ? (&PCMSK0) : \ ( (((p) >= 62) && ((p) <= 69)) ? (&PCMSK2) : \ ((uint8_t *)0) ) ) #define digitalPinToPCMSKbit(p) ( (((p) >= 10) && ((p) <= 13)) ? ((p) - 6) : \ ( ((p) == 50) ? 3 : \ ( ((p) == 51) ? 2 : \ ( ((p) == 52) ? 1 : \ ( ((p) == 53) ? 0 : \ ( (((p) >= 62) && ((p) <= 69)) ? ((p) - 62) : \ 0 ) ) ) ) ) ) #define digitalPinToInterrupt(p) ((p) == 2 ? 0 : ((p) == 3 ? 1 : ((p) >= 18 && (p) <= 21 ? 23 - (p) : NOT_AN_INTERRUPT))) #ifdef ARDUINO_MAIN const uint16_t PROGMEM port_to_mode_PGM[] = { NOT_A_PORT, (uint16_t) &DDRA, (uint16_t) &DDRB, (uint16_t) &DDRC, (uint16_t) &DDRD, (uint16_t) &DDRE, (uint16_t) &DDRF, (uint16_t) &DDRG, (uint16_t) &DDRH, NOT_A_PORT, (uint16_t) &DDRJ, (uint16_t) &DDRK, (uint16_t) &DDRL, }; const uint16_t PROGMEM port_to_output_PGM[] = { NOT_A_PORT, (uint16_t) &PORTA, (uint16_t) &PORTB, (uint16_t) &PORTC, (uint16_t) &PORTD, (uint16_t) &PORTE, (uint16_t) &PORTF, (uint16_t) &PORTG, (uint16_t) &PORTH, NOT_A_PORT, (uint16_t) &PORTJ, (uint16_t) &PORTK, (uint16_t) &PORTL, }; const uint16_t PROGMEM port_to_input_PGM[] = { NOT_A_PIN, (uint16_t) &PINA, (uint16_t) &PINB, (uint16_t) &PINC, (uint16_t) &PIND, (uint16_t) &PINE, (uint16_t) &PINF, (uint16_t) &PING, (uint16_t) &PINH, NOT_A_PIN, (uint16_t) &PINJ, (uint16_t) &PINK, (uint16_t) &PINL, }; const uint8_t PROGMEM digital_pin_to_port_PGM[] = { // PORTLIST // ------------------------------------------- PE , // PE 0 ** 0 ** USART0_RX PE , // PE 1 ** 1 ** USART0_TX PE , // PE 4 ** 2 ** PWM2 PE , // PE 5 ** 3 ** PWM3 PG , // PG 5 ** 4 ** PWM4 PE , // PE 3 ** 5 ** PWM5 PH , // PH 3 ** 6 ** PWM6 PH , // PH 4 ** 7 ** PWM7 PH , // PH 5 ** 8 ** PWM8 PH , // PH 6 ** 9 ** PWM9 PB , // PB 4 ** 10 ** PWM10 PB , // PB 5 ** 11 ** PWM11 PB , // PB 6 ** 12 ** PWM12 PB , // PB 7 ** 13 ** PWM13 PJ , // PJ 1 ** 14 ** USART3_TX PJ , // PJ 0 ** 15 ** USART3_RX PH , // PH 1 ** 16 ** USART2_TX PH , // PH 0 ** 17 ** USART2_RX PD , // PD 3 ** 18 ** USART1_TX PD , // PD 2 ** 19 ** USART1_RX PD , // PD 1 ** 20 ** I2C_SDA PD , // PD 0 ** 21 ** I2C_SCL PA , // PA 0 ** 22 ** D22 PA , // PA 1 ** 23 ** D23 PA , // PA 2 ** 24 ** D24 PA , // PA 3 ** 25 ** D25 PA , // PA 4 ** 26 ** D26 PA , // PA 5 ** 27 ** D27 PA , // PA 6 ** 28 ** D28 PA , // PA 7 ** 29 ** D29 PC , // PC 7 ** 30 ** D30 PC , // PC 6 ** 31 ** D31 PC , // PC 5 ** 32 ** D32 PC , // PC 4 ** 33 ** D33 PC , // PC 3 ** 34 ** D34 PC , // PC 2 ** 35 ** D35 PC , // PC 1 ** 36 ** D36 PC , // PC 0 ** 37 ** D37 PD , // PD 7 ** 38 ** D38 PG , // PG 2 ** 39 ** D39 PG , // PG 1 ** 40 ** D40 PG , // PG 0 ** 41 ** D41 PL , // PL 7 ** 42 ** D42 PL , // PL 6 ** 43 ** D43 PL , // PL 5 ** 44 ** D44 PL , // PL 4 ** 45 ** D45 PL , // PL 3 ** 46 ** D46 PL , // PL 2 ** 47 ** D47 PL , // PL 1 ** 48 ** D48 PL , // PL 0 ** 49 ** D49 PB , // PB 3 ** 50 ** SPI_MISO PB , // PB 2 ** 51 ** SPI_MOSI PB , // PB 1 ** 52 ** SPI_SCK PB , // PB 0 ** 53 ** SPI_SS PF , // PF 0 ** 54 ** A0 PF , // PF 1 ** 55 ** A1 PF , // PF 2 ** 56 ** A2 PF , // PF 3 ** 57 ** A3 PF , // PF 4 ** 58 ** A4 PF , // PF 5 ** 59 ** A5 PF , // PF 6 ** 60 ** A6 PF , // PF 7 ** 61 ** A7 PK , // PK 0 ** 62 ** A8 PK , // PK 1 ** 63 ** A9 PK , // PK 2 ** 64 ** A10 PK , // PK 3 ** 65 ** A11 PK , // PK 4 ** 66 ** A12 PK , // PK 5 ** 67 ** A13 PK , // PK 6 ** 68 ** A14 PK , // PK 7 ** 69 ** A15 }; const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { // PIN IN PORT // ------------------------------------------- _BV( 0 ) , // PE 0 ** 0 ** USART0_RX _BV( 1 ) , // PE 1 ** 1 ** USART0_TX _BV( 4 ) , // PE 4 ** 2 ** PWM2 _BV( 5 ) , // PE 5 ** 3 ** PWM3 _BV( 5 ) , // PG 5 ** 4 ** PWM4 _BV( 3 ) , // PE 3 ** 5 ** PWM5 _BV( 3 ) , // PH 3 ** 6 ** PWM6 _BV( 4 ) , // PH 4 ** 7 ** PWM7 _BV( 5 ) , // PH 5 ** 8 ** PWM8 _BV( 6 ) , // PH 6 ** 9 ** PWM9 _BV( 4 ) , // PB 4 ** 10 ** PWM10 _BV( 5 ) , // PB 5 ** 11 ** PWM11 _BV( 6 ) , // PB 6 ** 12 ** PWM12 _BV( 7 ) , // PB 7 ** 13 ** PWM13 _BV( 1 ) , // PJ 1 ** 14 ** USART3_TX _BV( 0 ) , // PJ 0 ** 15 ** USART3_RX _BV( 1 ) , // PH 1 ** 16 ** USART2_TX _BV( 0 ) , // PH 0 ** 17 ** USART2_RX _BV( 3 ) , // PD 3 ** 18 ** USART1_TX _BV( 2 ) , // PD 2 ** 19 ** USART1_RX _BV( 1 ) , // PD 1 ** 20 ** I2C_SDA _BV( 0 ) , // PD 0 ** 21 ** I2C_SCL _BV( 0 ) , // PA 0 ** 22 ** D22 _BV( 1 ) , // PA 1 ** 23 ** D23 _BV( 2 ) , // PA 2 ** 24 ** D24 _BV( 3 ) , // PA 3 ** 25 ** D25 _BV( 4 ) , // PA 4 ** 26 ** D26 _BV( 5 ) , // PA 5 ** 27 ** D27 _BV( 6 ) , // PA 6 ** 28 ** D28 _BV( 7 ) , // PA 7 ** 29 ** D29 _BV( 7 ) , // PC 7 ** 30 ** D30 _BV( 6 ) , // PC 6 ** 31 ** D31 _BV( 5 ) , // PC 5 ** 32 ** D32 _BV( 4 ) , // PC 4 ** 33 ** D33 _BV( 3 ) , // PC 3 ** 34 ** D34 _BV( 2 ) , // PC 2 ** 35 ** D35 _BV( 1 ) , // PC 1 ** 36 ** D36 _BV( 0 ) , // PC 0 ** 37 ** D37 _BV( 7 ) , // PD 7 ** 38 ** D38 _BV( 2 ) , // PG 2 ** 39 ** D39 _BV( 1 ) , // PG 1 ** 40 ** D40 _BV( 0 ) , // PG 0 ** 41 ** D41 _BV( 7 ) , // PL 7 ** 42 ** D42 _BV( 6 ) , // PL 6 ** 43 ** D43 _BV( 5 ) , // PL 5 ** 44 ** D44 _BV( 4 ) , // PL 4 ** 45 ** D45 _BV( 3 ) , // PL 3 ** 46 ** D46 _BV( 2 ) , // PL 2 ** 47 ** D47 _BV( 1 ) , // PL 1 ** 48 ** D48 _BV( 0 ) , // PL 0 ** 49 ** D49 _BV( 3 ) , // PB 3 ** 50 ** SPI_MISO _BV( 2 ) , // PB 2 ** 51 ** SPI_MOSI _BV( 1 ) , // PB 1 ** 52 ** SPI_SCK _BV( 0 ) , // PB 0 ** 53 ** SPI_SS _BV( 0 ) , // PF 0 ** 54 ** A0 _BV( 1 ) , // PF 1 ** 55 ** A1 _BV( 2 ) , // PF 2 ** 56 ** A2 _BV( 3 ) , // PF 3 ** 57 ** A3 _BV( 4 ) , // PF 4 ** 58 ** A4 _BV( 5 ) , // PF 5 ** 59 ** A5 _BV( 6 ) , // PF 6 ** 60 ** A6 _BV( 7 ) , // PF 7 ** 61 ** A7 _BV( 0 ) , // PK 0 ** 62 ** A8 _BV( 1 ) , // PK 1 ** 63 ** A9 _BV( 2 ) , // PK 2 ** 64 ** A10 _BV( 3 ) , // PK 3 ** 65 ** A11 _BV( 4 ) , // PK 4 ** 66 ** A12 _BV( 5 ) , // PK 5 ** 67 ** A13 _BV( 6 ) , // PK 6 ** 68 ** A14 _BV( 7 ) , // PK 7 ** 69 ** A15 }; const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { // TIMERS // ------------------------------------------- NOT_ON_TIMER , // PE 0 ** 0 ** USART0_RX NOT_ON_TIMER , // PE 1 ** 1 ** USART0_TX TIMER3B , // PE 4 ** 2 ** PWM2 TIMER3C , // PE 5 ** 3 ** PWM3 TIMER0B , // PG 5 ** 4 ** PWM4 TIMER3A , // PE 3 ** 5 ** PWM5 TIMER4A , // PH 3 ** 6 ** PWM6 TIMER4B , // PH 4 ** 7 ** PWM7 TIMER4C , // PH 5 ** 8 ** PWM8 TIMER2B , // PH 6 ** 9 ** PWM9 TIMER2A , // PB 4 ** 10 ** PWM10 TIMER1A , // PB 5 ** 11 ** PWM11 TIMER1B , // PB 6 ** 12 ** PWM12 TIMER0A , // PB 7 ** 13 ** PWM13 NOT_ON_TIMER , // PJ 1 ** 14 ** USART3_TX NOT_ON_TIMER , // PJ 0 ** 15 ** USART3_RX NOT_ON_TIMER , // PH 1 ** 16 ** USART2_TX NOT_ON_TIMER , // PH 0 ** 17 ** USART2_RX NOT_ON_TIMER , // PD 3 ** 18 ** USART1_TX NOT_ON_TIMER , // PD 2 ** 19 ** USART1_RX NOT_ON_TIMER , // PD 1 ** 20 ** I2C_SDA NOT_ON_TIMER , // PD 0 ** 21 ** I2C_SCL NOT_ON_TIMER , // PA 0 ** 22 ** D22 NOT_ON_TIMER , // PA 1 ** 23 ** D23 NOT_ON_TIMER , // PA 2 ** 24 ** D24 NOT_ON_TIMER , // PA 3 ** 25 ** D25 NOT_ON_TIMER , // PA 4 ** 26 ** D26 NOT_ON_TIMER , // PA 5 ** 27 ** D27 NOT_ON_TIMER , // PA 6 ** 28 ** D28 NOT_ON_TIMER , // PA 7 ** 29 ** D29 NOT_ON_TIMER , // PC 7 ** 30 ** D30 NOT_ON_TIMER , // PC 6 ** 31 ** D31 NOT_ON_TIMER , // PC 5 ** 32 ** D32 NOT_ON_TIMER , // PC 4 ** 33 ** D33 NOT_ON_TIMER , // PC 3 ** 34 ** D34 NOT_ON_TIMER , // PC 2 ** 35 ** D35 NOT_ON_TIMER , // PC 1 ** 36 ** D36 NOT_ON_TIMER , // PC 0 ** 37 ** D37 NOT_ON_TIMER , // PD 7 ** 38 ** D38 NOT_ON_TIMER , // PG 2 ** 39 ** D39 NOT_ON_TIMER , // PG 1 ** 40 ** D40 NOT_ON_TIMER , // PG 0 ** 41 ** D41 NOT_ON_TIMER , // PL 7 ** 42 ** D42 NOT_ON_TIMER , // PL 6 ** 43 ** D43 TIMER5C , // PL 5 ** 44 ** D44 TIMER5B , // PL 4 ** 45 ** D45 TIMER5A , // PL 3 ** 46 ** D46 NOT_ON_TIMER , // PL 2 ** 47 ** D47 NOT_ON_TIMER , // PL 1 ** 48 ** D48 NOT_ON_TIMER , // PL 0 ** 49 ** D49 NOT_ON_TIMER , // PB 3 ** 50 ** SPI_MISO NOT_ON_TIMER , // PB 2 ** 51 ** SPI_MOSI NOT_ON_TIMER , // PB 1 ** 52 ** SPI_SCK NOT_ON_TIMER , // PB 0 ** 53 ** SPI_SS NOT_ON_TIMER , // PF 0 ** 54 ** A0 NOT_ON_TIMER , // PF 1 ** 55 ** A1 NOT_ON_TIMER , // PF 2 ** 56 ** A2 NOT_ON_TIMER , // PF 3 ** 57 ** A3 NOT_ON_TIMER , // PF 4 ** 58 ** A4 NOT_ON_TIMER , // PF 5 ** 59 ** A5 NOT_ON_TIMER , // PF 6 ** 60 ** A6 NOT_ON_TIMER , // PF 7 ** 61 ** A7 NOT_ON_TIMER , // PK 0 ** 62 ** A8 NOT_ON_TIMER , // PK 1 ** 63 ** A9 NOT_ON_TIMER , // PK 2 ** 64 ** A10 NOT_ON_TIMER , // PK 3 ** 65 ** A11 NOT_ON_TIMER , // PK 4 ** 66 ** A12 NOT_ON_TIMER , // PK 5 ** 67 ** A13 NOT_ON_TIMER , // PK 6 ** 68 ** A14 NOT_ON_TIMER , // PK 7 ** 69 ** A15 }; #endif // These serial port names are intended to allow libraries and architecture-neutral // sketches to automatically default to the correct port name for a particular type // of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, // the first hardware serial port whose RX/TX pins are not dedicated to another use. // // SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor // // SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial // // SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library // // SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. // // SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX // pins are NOT connected to anything by default. #define SERIAL_PORT_MONITOR Serial #define SERIAL_PORT_HARDWARE Serial #define SERIAL_PORT_HARDWARE1 Serial1 #define SERIAL_PORT_HARDWARE2 Serial2 #define SERIAL_PORT_HARDWARE3 Serial3 #define SERIAL_PORT_HARDWARE_OPEN Serial1 #define SERIAL_PORT_HARDWARE_OPEN1 Serial2 #define SERIAL_PORT_HARDWARE_OPEN2 Serial3 #endif ================================================ FILE: external/arduino/avr/variants/micro/pins_arduino.h ================================================ /* pins_arduino.h - Pin definition functions for Arduino Part of Arduino - http://www.arduino.cc/ Copyright (c) 2007 David A. Mellis This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "../leonardo/pins_arduino.h" #undef TXLED0 #undef TXLED1 #undef RXLED0 #undef RXLED1 #undef TX_RX_LED_INIT #define TXLED0 PORTD &= ~(1<<5) #define TXLED1 PORTD |= (1<<5) #define RXLED0 PORTB &= ~(1<<0) #define RXLED1 PORTB |= (1<<0) #define TX_RX_LED_INIT DDRD |= (1<<5), DDRB |= (1<<0), TXLED0, RXLED0 ================================================ FILE: external/arduino/avr/variants/robot_control/pins_arduino.h ================================================ /* pins_arduino.h - Pin definition functions for Arduino Robot Control Board Part of Arduino - http://www.arduino.cc/ Copyright (c) 2913 D. Cuartielles, X. Yang (Arduino Verkstad) Copyright (c) 2012 D. Cuartielles, N. de la Riva, I. Gallego, E. Gallego This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef Pins_Arduino_h #define Pins_Arduino_h #include #define ARDUINO_MODEL_USB_PID 0x0038 #define TX_RX_LED_INIT DDRD |= (1<<5), DDRB |= (1<<0) #define TXLED0 PORTD |= (1<<5) #define TXLED1 PORTD &= ~(1<<5) #define RXLED0 PORTB |= (1<<0) #define RXLED1 PORTB &= ~(1<<0) #define D0 TKD0 #define D1 TKD1 #define D2 TKD2 #define D3 TKD3 #define D4 TKD4 #define D5 TKD5 #define PIN_SERIAL_RX (0) #define PIN_SERIAL_TX (1) static const uint8_t RX = PIN_SERIAL_RX; static const uint8_t TX = PIN_SERIAL_TX; #define PIN_WIRE_SDA (2) #define PIN_WIRE_SCL (3) static const uint8_t SDA = PIN_WIRE_SDA; static const uint8_t SCL = PIN_WIRE_SCL; // Map SPI port to 'new' pins D14..D17 #define PIN_SPI_SS (17) #define PIN_SPI_MOSI (16) #define PIN_SPI_MISO (14) #define PIN_SPI_SCK (15) static const uint8_t SS = PIN_SPI_SS; static const uint8_t MOSI = PIN_SPI_MOSI; static const uint8_t MISO = PIN_SPI_MISO; static const uint8_t SCK = PIN_SPI_SCK; // Mapping of analog pins as digital I/O // A6-A11 share with digital pins #define PIN_A0 (18) #define PIN_A1 (19) #define PIN_A2 (20) #define PIN_A3 (21) #define PIN_A4 (22) #define PIN_A5 (23) #define PIN_A6 (24) #define PIN_A7 (25) #define PIN_A8 (26) #define PIN_A9 (27) #define PIN_A10 (28) #define PIN_A11 (29) static const uint8_t A0 = PIN_A0; static const uint8_t A1 = PIN_A1; static const uint8_t A2 = PIN_A2; static const uint8_t A3 = PIN_A3; static const uint8_t A4 = PIN_A4; static const uint8_t A5 = PIN_A5; static const uint8_t A6 = PIN_A6; // D4 static const uint8_t A7 = PIN_A7; // D6 static const uint8_t A8 = PIN_A8; // D8 static const uint8_t A9 = PIN_A9; // D9 static const uint8_t A10 = PIN_A10; // D10 static const uint8_t A11 = PIN_A11; // D12 // Specific Mapping for the Control Board static const uint8_t KEY = 18; // AD0 static const uint8_t MUX_IN = 24; // ADC8 - A6 static const uint8_t MUXA = 6; // D5 - TKD4 static const uint8_t MUXB = 11; // D11 static const uint8_t MUXC = 12; // D12 - TKD5 static const uint8_t MUXD = 13; // D13 static const uint8_t BUZZ = 5; // D5 static const uint8_t POT = 23; // AD5 static const uint8_t DC_LCD = 10; // D10 static const uint8_t LCD_CS = 9; // D9 static const uint8_t RST_LCD = 7; // D6 static const uint8_t CARD_CS = 8; // D8 static const uint8_t TKD0 = 19; // ADC6 - A1 static const uint8_t TKD1 = 20; // ADC5 - A2 static const uint8_t TKD2 = 21; // ADC4 - A3 static const uint8_t TKD3 = 22; // ADC1 - A4 static const uint8_t TKD4 = 6; // D5 - MUXA static const uint8_t TKD5 = 12; // D12 - MUXC static const uint8_t LED1 = 17; // D17 - RX_Led // __AVR_ATmega32U4__ has an unusual mapping of pins to channels extern const uint8_t PROGMEM analog_pin_to_channel_PGM[]; #define analogPinToChannel(P) ( pgm_read_byte( analog_pin_to_channel_PGM + (P) ) ) #define digitalPinToInterrupt(p) ((p) == 0 ? 2 : ((p) == 1 ? 3 : ((p) == 2 ? 1 : ((p) == 3 ? 0 : ((p) == 7 ? 4 : NOT_AN_INTERRUPT))))) #ifdef ARDUINO_MAIN // On the Arduino board, digital pins are also used // for the analog output (software PWM). Analog input // pins are a separate set. // ARDUINO LEONARDO / ARDUINO ROBOT CONTROL / ATMEGA 32U4 / FUNCTION / REGISTER // // D0 RX PD2 RX RXD1/INT2 // D1 TX PD3 TX TXD1/INT3 // D2 SDA PD1 SDA SDA/INT1 // D3# SCL PD0 PWM8/SCL OC0B/SCL/INT0 // D4 MUX_IN A6 PD4 ADC8 // D5# BUZZ PC6 ??? OC3A/#OC4A // D6# MUXA/TKD4 A7 PD7 FastPWM #OC4D/ADC10 // D7 RST_LCD PE6 INT6/AIN0 // // D8 CARD_CS A8 PB4 ADC11/PCINT4 // D9# LCD_CS A9 PB5 PWM16 OC1A/#OC4B/ADC12/PCINT5 // D10# DC_LCD A10 PB6 PWM16 OC1B/0c4B/ADC13/PCINT6 // D11# MUXB PB7 PWM8/16 0C0A/OC1C/#RTS/PCINT7 // D12 MUXC/TKD5 A11 PD6 T1/#OC4D/ADC9 // D13# MUXD PC7 PWM10 CLK0/OC4A // // A0 KEY D18 PF7 ADC7 // A1 TKD0 D19 PF6 ADC6 // A2 TKD1 D20 PF5 ADC5 // A3 TKD2 D21 PF4 ADC4 // A4 TKD3 D22 PF1 ADC1 // A5 POT D23 PF0 ADC0 // // MISO MISO D14 PB3 MISO,PCINT3 // SCK SCK D15 PB1 SCK,PCINT1 // MOSI MOSI D16 PB2 MOSI,PCINT2 // SS RX_LED D17 PB0 RXLED,SS/PCINT0 // // TXLED TX_LED PD5 // HWB PE2 HWB // these arrays map port names (e.g. port B) to the // appropriate addresses for various functions (e.g. reading // and writing) const uint16_t PROGMEM port_to_mode_PGM[] = { NOT_A_PORT, NOT_A_PORT, (uint16_t) &DDRB, (uint16_t) &DDRC, (uint16_t) &DDRD, (uint16_t) &DDRE, (uint16_t) &DDRF, }; const uint16_t PROGMEM port_to_output_PGM[] = { NOT_A_PORT, NOT_A_PORT, (uint16_t) &PORTB, (uint16_t) &PORTC, (uint16_t) &PORTD, (uint16_t) &PORTE, (uint16_t) &PORTF, }; const uint16_t PROGMEM port_to_input_PGM[] = { NOT_A_PORT, NOT_A_PORT, (uint16_t) &PINB, (uint16_t) &PINC, (uint16_t) &PIND, (uint16_t) &PINE, (uint16_t) &PINF, }; const uint8_t PROGMEM digital_pin_to_port_PGM[30] = { PD, // D0 - PD2 PD, // D1 - PD3 PD, // D2 - PD1 PD, // D3 - PD0 PD, // D4 - PD4 PC, // D5 - PC6 PD, // D6 - PD7 PE, // D7 - PE6 PB, // D8 - PB4 PB, // D9 - PB5 PB, // D10 - PB6 PB, // D11 - PB7 PD, // D12 - PD6 PC, // D13 - PC7 PB, // D14 - MISO - PB3 PB, // D15 - SCK - PB1 PB, // D16 - MOSI - PB2 PB, // D17 - SS - PB0 PF, // D18 - A0 - PF7 PF, // D19 - A1 - PF6 PF, // D20 - A2 - PF5 PF, // D21 - A3 - PF4 PF, // D22 - A4 - PF1 PF, // D23 - A5 - PF0 PD, // D24 / D4 - A6 - PD4 PD, // D25 / D6 - A7 - PD7 PB, // D26 / D8 - A8 - PB4 PB, // D27 / D9 - A9 - PB5 PB, // D28 / D10 - A10 - PB6 PD, // D29 / D12 - A11 - PD6 }; const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[30] = { _BV(2), // D0 - PD2 _BV(3), // D1 - PD3 _BV(1), // D2 - PD1 _BV(0), // D3 - PD0 _BV(4), // D4 - PD4 _BV(6), // D5 - PC6 _BV(7), // D6 - PD7 _BV(6), // D7 - PE6 _BV(4), // D8 - PB4 _BV(5), // D9 - PB5 _BV(6), // D10 - PB6 _BV(7), // D11 - PB7 _BV(6), // D12 - PD6 _BV(7), // D13 - PC7 _BV(3), // D14 - MISO - PB3 _BV(1), // D15 - SCK - PB1 _BV(2), // D16 - MOSI - PB2 _BV(0), // D17 - SS - PB0 _BV(7), // D18 - A0 - PF7 _BV(6), // D19 - A1 - PF6 _BV(5), // D20 - A2 - PF5 _BV(4), // D21 - A3 - PF4 _BV(1), // D22 - A4 - PF1 _BV(0), // D23 - A5 - PF0 _BV(4), // D24 / D4 - A6 - PD4 _BV(7), // D25 / D6 - A7 - PD7 _BV(4), // D26 / D8 - A8 - PB4 _BV(5), // D27 / D9 - A9 - PB5 _BV(6), // D28 / D10 - A10 - PB6 _BV(6), // D29 / D12 - A11 - PD6 }; const uint8_t PROGMEM digital_pin_to_timer_PGM[18] = { NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, TIMER0B, /* 3 */ NOT_ON_TIMER, TIMER3A, /* 5 */ TIMER4D, /* 6 */ NOT_ON_TIMER, NOT_ON_TIMER, TIMER1A, /* 9 */ TIMER1B, /* 10 */ TIMER0A, /* 11 */ NOT_ON_TIMER, TIMER4A, /* 13 */ NOT_ON_TIMER, NOT_ON_TIMER, }; const uint8_t PROGMEM analog_pin_to_channel_PGM[12] = { 7, // A0 PF7 ADC7 6, // A1 PF6 ADC6 5, // A2 PF5 ADC5 4, // A3 PF4 ADC4 1, // A4 PF1 ADC1 0, // A5 PF0 ADC0 8, // A6 D4 PD4 ADC8 10, // A7 D6 PD7 ADC10 11, // A8 D8 PB4 ADC11 12, // A9 D9 PB5 ADC12 13, // A10 D10 PB6 ADC13 9 // A11 D12 PD6 ADC9 }; #endif /* ARDUINO_MAIN */ // These serial port names are intended to allow libraries and architecture-neutral // sketches to automatically default to the correct port name for a particular type // of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, // the first hardware serial port whose RX/TX pins are not dedicated to another use. // // SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor // // SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial // // SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library // // SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. // // SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX // pins are NOT connected to anything by default. #define SERIAL_PORT_MONITOR Serial #define SERIAL_PORT_USBVIRTUAL Serial #define SERIAL_PORT_HARDWARE Serial1 #endif /* Pins_Arduino_h */ ================================================ FILE: external/arduino/avr/variants/robot_motor/pins_arduino.h ================================================ /* pins_arduino.h - Pin definition functions for Arduino Robot Control Board Part of Arduino - http://www.arduino.cc/ Copyright (c) 2913 D. Cuartielles, X. Yang (Arduino Verkstad) Copyright (c) 2012 D. Cuartielles, N. de la Riva, I. Gallego, E. Gallego This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef Pins_Arduino_h #define Pins_Arduino_h #include #define ARDUINO_MODEL_USB_PID 0x0039 #define TX_RX_LED_INIT DDRD |= (1<<5), DDRB |= (1<<0) #define TXLED0 PORTD |= (1<<5) #define TXLED1 PORTD &= ~(1<<5) #define RXLED0 PORTB |= (1<<0) #define RXLED1 PORTB &= ~(1<<0) #define D10 TK1 #define D9 TK2 #define D8 TK4 #define D7 TK3 #define PIN_SERIAL_RX (0) #define PIN_SERIAL_TX (1) static const uint8_t RX = PIN_SERIAL_RX; static const uint8_t TX = PIN_SERIAL_TX; #define PIN_WIRE_SDA (2) #define PIN_WIRE_SCL (3) static const uint8_t SDA = PIN_WIRE_SDA; static const uint8_t SCL = PIN_WIRE_SCL; // Map SPI port to 'new' pins D14..D17 #define PIN_SPI_SS (17) #define PIN_SPI_MOSI (16) #define PIN_SPI_MISO (14) #define PIN_SPI_SCK (15) static const uint8_t SS = PIN_SPI_SS; static const uint8_t MOSI = PIN_SPI_MOSI; static const uint8_t MISO = PIN_SPI_MISO; static const uint8_t SCK = PIN_SPI_SCK; // Mapping of analog pins as digital I/O // A6-A11 share with digital pins #define PIN_A0 (18) #define PIN_A1 (19) #define PIN_A2 (20) #define PIN_A3 (21) #define PIN_A4 (22) #define PIN_A5 (23) #define PIN_A6 (24) #define PIN_A7 (25) #define PIN_A8 (26) #define PIN_A9 (27) #define PIN_A10 (28) #define PIN_A11 (29) static const uint8_t A0 = PIN_A0; static const uint8_t A1 = PIN_A1; static const uint8_t A2 = PIN_A2; static const uint8_t A3 = PIN_A3; static const uint8_t A4 = PIN_A4; static const uint8_t A5 = PIN_A5; static const uint8_t A6 = PIN_A6; // D4 static const uint8_t A7 = PIN_A7; // D6 static const uint8_t A8 = PIN_A8; // D8 static const uint8_t A9 = PIN_A9; // D9 static const uint8_t A10 = PIN_A10; // D10 static const uint8_t A11 = PIN_A11; // D12 // Specific Mapping for the Motor Board static const uint8_t MUX_IN = 20; // A2 static const uint8_t MUXA = 7; // D7 static const uint8_t MUXB = 8; // D8 static const uint8_t MUXC = 11; // D11 static const uint8_t MUXI = 13; // D13 static const uint8_t TRIM = 21; // A3 static const uint8_t SENSE_A = 22; // A4 static const uint8_t SENSE_B = 23; // A5 static const uint8_t IN_A1 = 6; // D6 - A7 static const uint8_t IN_A2 = 5; // D5 static const uint8_t IN_B1 = 10; // D10 static const uint8_t IN_B2 = 9; // D9 static const uint8_t TK1 = 18; // A0 static const uint8_t TK2 = 19; // A1 static const uint8_t TK3 = 4; // A6 static const uint8_t TK4 = 12; // A11 // __AVR_ATmega32U4__ has an unusual mapping of pins to channels extern const uint8_t PROGMEM analog_pin_to_channel_PGM[]; #define analogPinToChannel(P) ( pgm_read_byte( analog_pin_to_channel_PGM + (P) ) ) #define digitalPinToInterrupt(p) ((p) == 0 ? 2 : ((p) == 1 ? 3 : ((p) == 2 ? 1 : ((p) == 3 ? 0 : ((p) == 7 ? 4 : NOT_AN_INTERRUPT))))) #ifdef ARDUINO_MAIN // On the Arduino board, digital pins are also used // for the analog output (software PWM). Analog input // pins are a separate set. // ARDUINO LEONARDO / ARDUINO ROBOT CONTROL / ATMEGA 32U4 / FUNCTION / REGISTER // // D0 RX PD2 RX RXD1/INT2 // D1 TX PD3 TX TXD1/INT3 // D2 SDA PD1 SDA SDA/INT1 // D3# SCL PD0 PWM8/SCL OC0B/SCL/INT0 // D4 TK3 A6 PD4 ADC8 // D5# INA2 PC6 ??? OC3A/#OC4A // D6# INA1 A7 PD7 FastPWM #OC4D/ADC10 // D7 MUXA PE6 INT6/AIN0 // // D8 MUXB A8 PB4 ADC11/PCINT4 // D9# INB2 A9 PB5 PWM16 OC1A/#OC4B/ADC12/PCINT5 // D10# INB1 A10 PB6 PWM16 OC1B/0c4B/ADC13/PCINT6 // D11# MUXC PB7 PWM8/16 0C0A/OC1C/#RTS/PCINT7 // D12 TK4 A11 PD6 T1/#OC4D/ADC9 // D13# MUXI PC7 PWM10 CLK0/OC4A // // A0 TK1 D18 PF7 ADC7 // A1 TK2 D19 PF6 ADC6 // A2 MUX_IN D20 PF5 ADC5 // A3 TRIM D21 PF4 ADC4 // A4 SENSE_A D22 PF1 ADC1 // A5 SENSE_B D23 PF0 ADC0 // // MISO MISO D14 PB3 MISO,PCINT3 // SCK SCK D15 PB1 SCK,PCINT1 // MOSI MOSI D16 PB2 MOSI,PCINT2 // SS RX_LED D17 PB0 RXLED,SS/PCINT0 // // TXLED TX_LED PD5 // HWB PE2 HWB // these arrays map port names (e.g. port B) to the // appropriate addresses for various functions (e.g. reading // and writing) const uint16_t PROGMEM port_to_mode_PGM[] = { NOT_A_PORT, NOT_A_PORT, (uint16_t) &DDRB, (uint16_t) &DDRC, (uint16_t) &DDRD, (uint16_t) &DDRE, (uint16_t) &DDRF, }; const uint16_t PROGMEM port_to_output_PGM[] = { NOT_A_PORT, NOT_A_PORT, (uint16_t) &PORTB, (uint16_t) &PORTC, (uint16_t) &PORTD, (uint16_t) &PORTE, (uint16_t) &PORTF, }; const uint16_t PROGMEM port_to_input_PGM[] = { NOT_A_PORT, NOT_A_PORT, (uint16_t) &PINB, (uint16_t) &PINC, (uint16_t) &PIND, (uint16_t) &PINE, (uint16_t) &PINF, }; const uint8_t PROGMEM digital_pin_to_port_PGM[30] = { PD, // D0 - PD2 PD, // D1 - PD3 PD, // D2 - PD1 PD, // D3 - PD0 PD, // D4 - PD4 PC, // D5 - PC6 PD, // D6 - PD7 PE, // D7 - PE6 PB, // D8 - PB4 PB, // D9 - PB5 PB, // D10 - PB6 PB, // D11 - PB7 PD, // D12 - PD6 PC, // D13 - PC7 PB, // D14 - MISO - PB3 PB, // D15 - SCK - PB1 PB, // D16 - MOSI - PB2 PB, // D17 - SS - PB0 PF, // D18 - A0 - PF7 PF, // D19 - A1 - PF6 PF, // D20 - A2 - PF5 PF, // D21 - A3 - PF4 PF, // D22 - A4 - PF1 PF, // D23 - A5 - PF0 PD, // D24 / D4 - A6 - PD4 PD, // D25 / D6 - A7 - PD7 PB, // D26 / D8 - A8 - PB4 PB, // D27 / D9 - A9 - PB5 PB, // D28 / D10 - A10 - PB6 PD, // D29 / D12 - A11 - PD6 }; const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[30] = { _BV(2), // D0 - PD2 _BV(3), // D1 - PD3 _BV(1), // D2 - PD1 _BV(0), // D3 - PD0 _BV(4), // D4 - PD4 _BV(6), // D5 - PC6 _BV(7), // D6 - PD7 _BV(6), // D7 - PE6 _BV(4), // D8 - PB4 _BV(5), // D9 - PB5 _BV(6), // D10 - PB6 _BV(7), // D11 - PB7 _BV(6), // D12 - PD6 _BV(7), // D13 - PC7 _BV(3), // D14 - MISO - PB3 _BV(1), // D15 - SCK - PB1 _BV(2), // D16 - MOSI - PB2 _BV(0), // D17 - SS - PB0 _BV(7), // D18 - A0 - PF7 _BV(6), // D19 - A1 - PF6 _BV(5), // D20 - A2 - PF5 _BV(4), // D21 - A3 - PF4 _BV(1), // D22 - A4 - PF1 _BV(0), // D23 - A5 - PF0 _BV(4), // D24 / D4 - A6 - PD4 _BV(7), // D25 / D6 - A7 - PD7 _BV(4), // D26 / D8 - A8 - PB4 _BV(5), // D27 / D9 - A9 - PB5 _BV(6), // D28 / D10 - A10 - PB6 _BV(6), // D29 / D12 - A11 - PD6 }; const uint8_t PROGMEM digital_pin_to_timer_PGM[18] = { NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, TIMER0B, /* 3 */ NOT_ON_TIMER, TIMER3A, /* 5 */ TIMER4D, /* 6 */ NOT_ON_TIMER, NOT_ON_TIMER, TIMER1A, /* 9 */ TIMER1B, /* 10 */ TIMER0A, /* 11 */ NOT_ON_TIMER, TIMER4A, /* 13 */ NOT_ON_TIMER, NOT_ON_TIMER, }; const uint8_t PROGMEM analog_pin_to_channel_PGM[12] = { 7, // A0 PF7 ADC7 6, // A1 PF6 ADC6 5, // A2 PF5 ADC5 4, // A3 PF4 ADC4 1, // A4 PF1 ADC1 0, // A5 PF0 ADC0 8, // A6 D4 PD4 ADC8 10, // A7 D6 PD7 ADC10 11, // A8 D8 PB4 ADC11 12, // A9 D9 PB5 ADC12 13, // A10 D10 PB6 ADC13 9 // A11 D12 PD6 ADC9 }; #endif /* ARDUINO_MAIN */ // These serial port names are intended to allow libraries and architecture-neutral // sketches to automatically default to the correct port name for a particular type // of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, // the first hardware serial port whose RX/TX pins are not dedicated to another use. // // SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor // // SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial // // SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library // // SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. // // SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX // pins are NOT connected to anything by default. #define SERIAL_PORT_MONITOR Serial #define SERIAL_PORT_USBVIRTUAL Serial #define SERIAL_PORT_HARDWARE Serial1 #endif /* Pins_Arduino_h */ ================================================ FILE: external/arduino/avr/variants/standard/pins_arduino.h ================================================ /* pins_arduino.h - Pin definition functions for Arduino Part of Arduino - http://www.arduino.cc/ Copyright (c) 2007 David A. Mellis This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef Pins_Arduino_h #define Pins_Arduino_h #include #define NUM_DIGITAL_PINS 20 #define NUM_ANALOG_INPUTS 6 #define analogInputToDigitalPin(p) ((p < 6) ? (p) + 14 : -1) #if defined(__AVR_ATmega8__) #define digitalPinHasPWM(p) ((p) == 9 || (p) == 10 || (p) == 11) #else #define digitalPinHasPWM(p) ((p) == 3 || (p) == 5 || (p) == 6 || (p) == 9 || (p) == 10 || (p) == 11) #endif #define PIN_SPI_SS (10) #define PIN_SPI_MOSI (11) #define PIN_SPI_MISO (12) #define PIN_SPI_SCK (13) static const uint8_t SS = PIN_SPI_SS; static const uint8_t MOSI = PIN_SPI_MOSI; static const uint8_t MISO = PIN_SPI_MISO; static const uint8_t SCK = PIN_SPI_SCK; #define PIN_WIRE_SDA (18) #define PIN_WIRE_SCL (19) static const uint8_t SDA = PIN_WIRE_SDA; static const uint8_t SCL = PIN_WIRE_SCL; #define LED_BUILTIN 13 #define PIN_A0 (14) #define PIN_A1 (15) #define PIN_A2 (16) #define PIN_A3 (17) #define PIN_A4 (18) #define PIN_A5 (19) #define PIN_A6 (20) #define PIN_A7 (21) static const uint8_t A0 = PIN_A0; static const uint8_t A1 = PIN_A1; static const uint8_t A2 = PIN_A2; static const uint8_t A3 = PIN_A3; static const uint8_t A4 = PIN_A4; static const uint8_t A5 = PIN_A5; static const uint8_t A6 = PIN_A6; static const uint8_t A7 = PIN_A7; #define digitalPinToPCICR(p) (((p) >= 0 && (p) <= 21) ? (&PCICR) : ((uint8_t *)0)) #define digitalPinToPCICRbit(p) (((p) <= 7) ? 2 : (((p) <= 13) ? 0 : 1)) #define digitalPinToPCMSK(p) (((p) <= 7) ? (&PCMSK2) : (((p) <= 13) ? (&PCMSK0) : (((p) <= 21) ? (&PCMSK1) : ((uint8_t *)0)))) #define digitalPinToPCMSKbit(p) (((p) <= 7) ? (p) : (((p) <= 13) ? ((p) - 8) : ((p) - 14))) #define digitalPinToInterrupt(p) ((p) == 2 ? 0 : ((p) == 3 ? 1 : NOT_AN_INTERRUPT)) #ifdef ARDUINO_MAIN // On the Arduino board, digital pins are also used // for the analog output (software PWM). Analog input // pins are a separate set. // ATMEL ATMEGA8 & 168 / ARDUINO // // +-\/-+ // PC6 1| |28 PC5 (AI 5) // (D 0) PD0 2| |27 PC4 (AI 4) // (D 1) PD1 3| |26 PC3 (AI 3) // (D 2) PD2 4| |25 PC2 (AI 2) // PWM+ (D 3) PD3 5| |24 PC1 (AI 1) // (D 4) PD4 6| |23 PC0 (AI 0) // VCC 7| |22 GND // GND 8| |21 AREF // PB6 9| |20 AVCC // PB7 10| |19 PB5 (D 13) // PWM+ (D 5) PD5 11| |18 PB4 (D 12) // PWM+ (D 6) PD6 12| |17 PB3 (D 11) PWM // (D 7) PD7 13| |16 PB2 (D 10) PWM // (D 8) PB0 14| |15 PB1 (D 9) PWM // +----+ // // (PWM+ indicates the additional PWM pins on the ATmega168.) // ATMEL ATMEGA1280 / ARDUINO // // 0-7 PE0-PE7 works // 8-13 PB0-PB5 works // 14-21 PA0-PA7 works // 22-29 PH0-PH7 works // 30-35 PG5-PG0 works // 36-43 PC7-PC0 works // 44-51 PJ7-PJ0 works // 52-59 PL7-PL0 works // 60-67 PD7-PD0 works // A0-A7 PF0-PF7 // A8-A15 PK0-PK7 // these arrays map port names (e.g. port B) to the // appropriate addresses for various functions (e.g. reading // and writing) const uint16_t PROGMEM port_to_mode_PGM[] = { NOT_A_PORT, NOT_A_PORT, (uint16_t) &DDRB, (uint16_t) &DDRC, (uint16_t) &DDRD, }; const uint16_t PROGMEM port_to_output_PGM[] = { NOT_A_PORT, NOT_A_PORT, (uint16_t) &PORTB, (uint16_t) &PORTC, (uint16_t) &PORTD, }; const uint16_t PROGMEM port_to_input_PGM[] = { NOT_A_PORT, NOT_A_PORT, (uint16_t) &PINB, (uint16_t) &PINC, (uint16_t) &PIND, }; const uint8_t PROGMEM digital_pin_to_port_PGM[] = { PD, /* 0 */ PD, PD, PD, PD, PD, PD, PD, PB, /* 8 */ PB, PB, PB, PB, PB, PC, /* 14 */ PC, PC, PC, PC, PC, }; const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { _BV(0), /* 0, port D */ _BV(1), _BV(2), _BV(3), _BV(4), _BV(5), _BV(6), _BV(7), _BV(0), /* 8, port B */ _BV(1), _BV(2), _BV(3), _BV(4), _BV(5), _BV(0), /* 14, port C */ _BV(1), _BV(2), _BV(3), _BV(4), _BV(5), }; const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { NOT_ON_TIMER, /* 0 - port D */ NOT_ON_TIMER, NOT_ON_TIMER, // on the ATmega168, digital pin 3 has hardware pwm #if defined(__AVR_ATmega8__) NOT_ON_TIMER, #else TIMER2B, #endif NOT_ON_TIMER, // on the ATmega168, digital pins 5 and 6 have hardware pwm #if defined(__AVR_ATmega8__) NOT_ON_TIMER, NOT_ON_TIMER, #else TIMER0B, TIMER0A, #endif NOT_ON_TIMER, NOT_ON_TIMER, /* 8 - port B */ TIMER1A, TIMER1B, #if defined(__AVR_ATmega8__) TIMER2, #else TIMER2A, #endif NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, /* 14 - port C */ NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, }; #endif // These serial port names are intended to allow libraries and architecture-neutral // sketches to automatically default to the correct port name for a particular type // of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, // the first hardware serial port whose RX/TX pins are not dedicated to another use. // // SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor // // SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial // // SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library // // SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. // // SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX // pins are NOT connected to anything by default. #define SERIAL_PORT_MONITOR Serial #define SERIAL_PORT_HARDWARE Serial #endif ================================================ FILE: external/arduino/avr/variants/yun/pins_arduino.h ================================================ /* pins_arduino.h - Pin definition functions for Arduino Part of Arduino - http://www.arduino.cc/ Copyright (c) 2013 Arduino LLC This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "../leonardo/pins_arduino.h" // These serial port names are intended to allow libraries and architecture-neutral // sketches to automatically default to the correct port name for a particular type // of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, // the first hardware serial port whose RX/TX pins are not dedicated to another use. // // SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor // // SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial // // SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library // // SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. // // SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX // pins are NOT connected to anything by default. #define SERIAL_PORT_LINUXBRIDGE Serial1 // defined in the Leonardo variant #undef SERIAL_PORT_HARDWARE_OPEN ================================================ FILE: external/arduino/stlarduino/ArduinoSTL.cpp ================================================ #include #include // // Configuration Help // // If you're using a serial port that's statically declared somewhere in // Arduino (e.g. Serial1 on Leonardo) // 1. Set ARDUINOSTL_SERIAL_DEVICE to your device // 2. Uncomment the ARDUINOSTL_DEFAULT_CIN_COUT flag. // // If you're using a sofware serial port: // 1. Set ARDUINOSTL_DEFAULT_SERIAL to NULL // 2. Comment out ARDUINOSTL_DEFAULT_CIN_COUT // Your sketch must contain delarations of cin and cout, and a call to // ArduinoSTL_serial.connect(). // #define ARDUINOSTL_DEFAULT_SERIAL Serial #define ARDUINOSTL_DEFAULT_CIN_COUT using namespace std; #ifdef ARDUINOSTL_DEFAULT_CIN_COUT // Create cout and cin.. there doesn't seem to be a way // to control what serial device at runtime. Grr. namespace std { ohserialstream cout(ARDUINOSTL_DEFAULT_SERIAL); ihserialstream cin(ARDUINOSTL_DEFAULT_SERIAL); } #endif // ARDUINOSTL_DEFAULT_CIN_COUT /* * Implementation of printf() is highly libc dependent. * * This implementation is tested on: * * ARDUINO_ARCH_AVR (Classic Arduinos) - Working * TEENSYDUINO (ARM-based Teensy) - cin/cout work, printf doesn't * ARDUINO_ARCH_* - ARMs are probably the same as above. */ #if defined(ARDUINO_ARCH_AVR) ArduinoSTL_STDIO ArduinoSTL_Serial(ARDUINOSTL_DEFAULT_SERIAL); // arduino_putchar(char, FILE*) // Output a single character to the serial port. // returns: 0 on success, 1 on error // note: // To maintain serial port compatibility this function // automatically addes a \r when it sees a \n // static int arduino_putchar(char c, FILE* f) { Stream *uart = ArduinoSTL_Serial.getUart(); if (c == '\n') uart->write('\r'); return uart->write(c) == 1? 0 : 1; } // arduino_getchar(FILE*) // Take a character from the serial port. This function // must block until a character is ready. // returns: The character or -1 on a read error // static int arduino_getchar(FILE *f) { Stream *uart = ArduinoSTL_Serial.getUart(); while (! uart->available()) { /* wait */ } return uart->read(); } void ArduinoSTL_STDIO::connect(Stream *u) { if (file != NULL) free (file); uart = u; file = fdevopen(arduino_putchar, arduino_getchar); } #else #warning "printf() will not be functional on this platform." #endif ================================================ FILE: external/arduino/stlarduino/ArduinoSTL.h ================================================ /*--------------------- * * ArduinoSTL Core Library * * This header has some glue to make STL and Streams work from a sketch. * */ #ifndef ARDUINOSTL_M_H #define ARDUINOSTL_M_H #include // Create cout and cin.. there doesn't seem to be a way // to control what serial device at runtime. Grr. namespace std { extern ohserialstream cout; extern ihserialstream cin; } #if defined(ARDUINO_ARCH_AVR) class ArduinoSTL_STDIO { public: // Initialize STDIO using a pointer to whatever Serial is. // Serial.begin() must be called at some point. ArduinoSTL_STDIO(Stream *u) : file(NULL) { connect(u); } ArduinoSTL_STDIO(Stream &u) : file(NULL) { connect(u); } Stream *getUart() { return uart; } void connect(Stream *u); inline void connect(Stream &u) { connect(static_cast(&u)); } private: Stream *uart; FILE *file; }; extern ArduinoSTL_STDIO ArduinoSTL_Serial; #endif // ARDUINO_ARCH_AVR #endif // ARDUINOSTL_M_H ================================================ FILE: external/arduino/stlarduino/LICENSE ================================================ GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. (This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.) Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. {description} Copyright (C) {year} {fullname} This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. {signature of Ty Coon}, 1 April 1990 Ty Coon, President of Vice That's all there is to it! ================================================ FILE: external/arduino/stlarduino/abi/abi.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc C++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this library; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include /* This file implements a number of the language support features * needed to deal with the C++ abi, as originally documented in the * Itanium C++ ABI, though now industry standard */ extern "C" { #if defined(ARDUINO) /* Arduino defines some of these. * There can be link issues if they're redefined */ #else /* This function is called in the event that a non-overidden * pure virtual function is called. The compiler should never * let that happen. We get to choose what to do - we will abort */ void __cxa_pure_virtual (){ abort(); } #endif } ================================================ FILE: external/arduino/stlarduino/abi/libgcc_eh/Makefile ================================================ top_srcdir=../../../ top_builddir=../../../ include $(top_srcdir)Rules.mak include Makefile.in ================================================ FILE: external/arduino/stlarduino/abi/libgcc_eh/Makefile.in ================================================ LIBGCC_EH_OUT := $(top_builddir)src/abi/libgcc_eh/ OBJS = $(call list-archive-members,$(LIBGCC_EH)) libgcc_eh-$(IMPORT_LIBGCC_EH) := $(OBJS) LIBGCC_EH_VAR := $(call variablify,$(LIBGCC_EH)) LIBGCC_EH_DEP := $(LIBGCC_EH_OUT).$(LIBGCC_EH_VAR).dep ifeq ($(filter $(noconfig_targets),$(MAKECMDGOALS)),) -include $(LIBGCC_EH_DEP) endif ifneq ($(libgcc_eh-y),) $(libgcc_eh-y): $(LIBGCC_EH) endif $(LIBGCC_EH_DEP): $(LIBGCC_EH) $(Q)$(RM) $(LIBGCC_EH_OUT).*dep $(LIBGCC_EH_OUT)*.o $(Q)$(if $(LIBGCC_EH),(cd $(LIBGCC_EH_OUT) && $(AR) x $(LIBGCC_EH))) $(Q)echo "libgcc_eh-y := \$$(addprefix \$$(LIBGCC_EH_OUT),$(libgcc_eh-y))" > $@ CLEAN_src/abi/libgcc_eh: ; DISTCLEAN_src/abi/libgcc_eh: $(do_rm) $(addprefix $(LIBGCC_EH_OUT),.*dep *.o) ================================================ FILE: external/arduino/stlarduino/abi/libsupc/Makefile ================================================ top_srcdir=../../../ top_builddir=../../../ include $(top_srcdir)Rules.mak include Makefile.in ================================================ FILE: external/arduino/stlarduino/abi/libsupc/Makefile.in ================================================ LIBSUPC_OUT := $(top_builddir)src/abi/libsupc/ OBJS = $(call list-archive-members,$(LIBSUP)) OBJS-OMIT = $(filter new_op%.o del_op%.o pure.o new_handler.o eh_alloc.o eh_globals.o,$(OBJS)) libsupc-$(IMPORT_LIBSUP) := $(filter-out $(OBJS-OMIT),$(OBJS)) LIBSUP_VAR := $(call variablify,$(LIBSUP)) LIBSUP_DEP :=$(LIBSUPC_OUT).$(LIBSUP_VAR).dep ifeq ($(filter $(noconfig_targets),$(MAKECMDGOALS)),) -include $(LIBSUP_DEP) endif ifneq ($(libsupc-y),) $(libsupc-y): $(LIBSUP) endif $(LIBSUP_DEP): $(LIBSUP) $(LIBSUPC_OUT)Makefile.in $(Q)$(RM) $(LIBSUPC_OUT).*dep $(LIBSUPC_OUT)*.o $(Q)$(if $(LIBSUP),(cd $(LIBSUPC_OUT) && $(AR) x $(LIBSUP) && $(RM) $(OBJS-OMIT))) $(Q)echo "libsupc-y := \$$(addprefix \$$(LIBSUPC_OUT),$(libsupc-y))" > $@ CLEAN_src/abi/libsupc: ; DISTCLEAN_src/abi/libsupc: $(do_rm) $(addprefix $(LIBSUPC_OUT), .*dep *.o) ================================================ FILE: external/arduino/stlarduino/algorithm ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #ifndef __STD_HEADER_ALGORITHM #define __STD_HEADER_ALGORITHM 1 //Elliminate any previously defined macro #undef min #undef max #pragma GCC visibility push(default) namespace std{ // subclause _lib.alg.nonmodifying_, non-modifying sequence operations: template _UCXXEXPORT Function for_each(InputIterator first, InputIterator last, Function f) { while(first !=last){ f(*first); ++first; } return f; } template _UCXXEXPORT InputIterator find(InputIterator first, InputIterator last, const T& value) { while(first !=last && *first != value){ ++first; } return first; } template _UCXXEXPORT InputIterator find_if(InputIterator first, InputIterator last, Predicate pred) { while(first !=last && !pred(*first)){ ++first; } return first; } template _UCXXEXPORT ForwardIterator1 find_end(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2) { ForwardIterator1 retval = last1; while(first1 !=last1){ ForwardIterator1 temp1(first1); ForwardIterator2 temp2(first2); while(temp2!=last2 && temp1!= last1){ if(*temp1 != *temp2){ break; //Exit while loop } ++temp1; ++temp2; if(temp2 == last2){ //Have successfully checked the whole sequence retval = first1; } } } return retval; } template _UCXXEXPORT ForwardIterator1 find_end(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred) { ForwardIterator1 retval = last1; while(first1 !=last1){ ForwardIterator1 temp1(first1); ForwardIterator2 temp2(first2); while(temp2!=last2 && temp1!= last1){ if( ! pred(*temp1, *temp2)){ break; //Exit while loop } ++temp1; ++temp2; if(temp2 == last2){ //Have successfully checked the whole sequence retval = first1; } } } return retval; } template _UCXXEXPORT ForwardIterator1 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2) { while(first1 != last1){ ForwardIterator2 temp2(first2); while(temp2 != last2 ){ if(*temp2 == first1){ return first1; } ++temp2; } } return last1; } template _UCXXEXPORT ForwardIterator1 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred) { while(first1 != last1){ ForwardIterator2 temp2(first2); while(temp2 != last2 ){ if(*temp2 == first1){ return first1; } ++temp2; } } return last1; } template _UCXXEXPORT ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last) { ForwardIterator temp; while(first != last){ temp = first; ++temp; if(*temp == *first){ return first; } ++first; } return first; } template _UCXXEXPORT ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate pred) { ForwardIterator temp; while(first != last){ temp = first; ++temp; if( pred(*temp, *first)){ return first; } ++first; } return first; } template _UCXXEXPORT typename iterator_traits::difference_type count(InputIterator first, InputIterator last, const T& value) { typename iterator_traits::difference_type i = 0; while(first!=last){ if(*first == value){ ++i; } ++first; } return i; } template _UCXXEXPORT typename iterator_traits::difference_type count_if(InputIterator first, InputIterator last, Predicate pred) { typename iterator_traits::difference_type i = 0; while(first!=last){ if( pred(*first) ){ ++i; } ++first; } return i; } template _UCXXEXPORT pair mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2) { while(first1 != last1){ if(*first1 != *first2){ break; } ++first1; ++first2; } pair retval; retval.first = first1; retval.second = first2; return retval; } template _UCXXEXPORT pair mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate pred) { while(first1 != last1){ if( !pred(*first1, *first2) ){ break; } ++first1; ++first2; } pair retval; retval.first = first1; retval.second = first2; return retval; } template _UCXXEXPORT bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2) { while(first1 !=last1){ if(*first1 != *first2){ return false; } ++first1; ++first2; } return true; } template _UCXXEXPORT bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate pred) { while(first1 !=last1){ if( !pred(*first1, *first2) ){ return false; } ++first1; ++first2; } return true; } template _UCXXEXPORT ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2) { equal_to::value_type> c; return search(first1, last1, first2, last2, c); } template _UCXXEXPORT ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred) { while(first1 != last1){ ForwardIterator1 temp1(first1); ForwardIterator2 temp2(first2); while(temp2 != last2 && temp1 != last1){ if( !pred(*temp2, *temp1) ){ break; } ++temp1; ++temp2; if(temp2 == last2){ return first1; } } ++first1; } return last1; } template _UCXXEXPORT ForwardIterator search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value) { while( first != last ){ if(*first == value){ ForwardIterator temp(first); Size i = 1; ++first; //Avoid doing the same comparison over again while(i < count && *temp == value){ ++first; ++i; } if(i == count){ return first; } } ++first; } return first; } template _UCXXEXPORT ForwardIterator search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value, BinaryPredicate pred) { while( first != last ){ if( pred(*first, value) ){ ForwardIterator temp(first); Size i = 1; ++first; //Avoid doing the same comparison over again while(i < count && pred(*temp, value) ){ ++first; ++i; } if(i == count){ return first; } } ++first; } return first; } // subclause _lib.alg.modifying.operations_, modifying sequence operations: template _UCXXEXPORT OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result) { while(first != last){ *result = *first; ++first; ++result; } return result; } template _UCXXEXPORT BidirectionalIterator2 copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last, BidirectionalIterator2 result) { while(first !=last ){ --result; --last; *result = *last; } return result; } template _UCXXEXPORT void swap(T& a, T& b){ T temp(a); a = b; b = temp; } template _UCXXEXPORT void iter_swap(ForwardIterator1 a, ForwardIterator2 b) { typename iterator_traits::value_type temp(*a); *a = *b; *b = temp; } template _UCXXEXPORT ForwardIterator2 swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2) { while(first1 != last1){ iter_swap(first1, first2); ++first1; ++first2; } return first2; } template _UCXXEXPORT OutputIterator transform(InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op) { while(first != last){ *result = op(*first); ++first; ++result; } return result; } template _UCXXEXPORT OutputIterator transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryOperation binary_op) { while(first1 != last1){ *result = binary_op(*first1, *first2); ++first1; ++first2; ++result; } return result; } template _UCXXEXPORT void replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value) { while(first != last){ if(*first == old_value){ *first = new_value; } ++first; } } template _UCXXEXPORT void replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value) { while(first != last){ if( pred(*first) ){ *first = new_value; } ++first; } } template _UCXXEXPORT OutputIterator replace_copy(InputIterator first, InputIterator last, OutputIterator result, const T& old_value, const T& new_value) { while(first != last){ if(*first == old_value){ *result = new_value; }else{ *result = *first; } ++first; ++result; } return result; } template _UCXXEXPORT OutputIterator replace_copy_if(Iterator first, Iterator last, OutputIterator result, Predicate pred, const T& new_value) { while(first != last){ if( pred(*first) ){ *result = new_value; }else{ *result = *first; } ++first; ++result; } return result; } template _UCXXEXPORT void fill(ForwardIterator first, ForwardIterator last, const T& value) { while(first != last){ *first = value; ++first; } } template _UCXXEXPORT void fill_n(OutputIterator first, Size n, const T& value) { while(n != 0){ *first = value; --n; ++first; } } template _UCXXEXPORT void generate(ForwardIterator first, ForwardIterator last, Generator gen) { while(first != last){ *first = gen(); ++first; } } template _UCXXEXPORT void generate_n(OutputIterator first, Size n, Generator gen) { while(n !=0){ *first = gen(); --n; ++first; } } template _UCXXEXPORT ForwardIterator remove(ForwardIterator first, ForwardIterator last, const T& value) { ForwardIterator temp(first); while(temp !=last){ if(*temp == value){ }else{ *first = *temp; ++first; } ++temp; } return first; } template _UCXXEXPORT ForwardIterator remove_if(ForwardIterator first, ForwardIterator last, Predicate pred) { ForwardIterator temp(first); while(temp !=last){ if( pred(*temp) ){ }else{ *first = *temp; ++first; } ++temp; } return first; } template _UCXXEXPORT OutputIterator remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value) { while(first !=last){ if(*first != value){ *result = *first; ++result; } ++first; } return result; } template _UCXXEXPORT OutputIterator remove_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred) { while(first !=last){ if( !pred(*first) ){ *result = *first; ++result; } ++first; } return result; } template _UCXXEXPORT ForwardIterator unique(ForwardIterator first, ForwardIterator last) { ForwardIterator new_val(first); ForwardIterator old_val(first); while(new_val !=last){ if(*new_val == *old_val && new_val != old_val){ }else{ *first = *new_val; old_val = new_val; ++first; } ++new_val; } return first; } template _UCXXEXPORT ForwardIterator unique(ForwardIterator first, ForwardIterator last, BinaryPredicate pred) { ForwardIterator new_val(first); ForwardIterator old_val(first); while(new_val !=last){ if( pred(*new_val, *old_val) && new_val != old_val){ }else{ *first = *new_val; old_val = new_val; ++first; } ++new_val; } return first; } template _UCXXEXPORT OutputIterator unique_copy(InputIterator first, InputIterator last, OutputIterator result) { InputIterator temp(first); while(first !=last ){ if(*first == *temp && first != temp){ }else{ *result = *first; temp = first; ++result; } ++first; } return result; } template _UCXXEXPORT OutputIterator unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate pred) { InputIterator temp(first); while(first !=last ){ if( pred(*first, *temp) && first != temp){ }else{ *result = *first; temp = first; ++result; } ++first; } return result; } template _UCXXEXPORT void reverse(BidirectionalIterator first, BidirectionalIterator last) { --last; //Don't work with one past the end element while(first < last){ iter_swap(first, last); ++first; --last; } } template _UCXXEXPORT OutputIterator reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result) { while(last > first){ --last; *result = *last; ++result; } return result; } template _UCXXEXPORT void rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last) { if ((first == middle) || (last == middle)){ return; } ForwardIterator first2 = middle; do { swap(*first, *first2); first++; first2++; if(first == middle){ middle = first2; } } while(first2 != last); first2 = middle; while (first2 != last) { swap(*first, *first2); first++; first2++; if (first == middle){ middle = first2; }else if (first2 == last){ first2 = middle; } } } template _UCXXEXPORT OutputIterator rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result) { ForwardIterator temp(middle); while(temp !=last){ *result = *temp; ++temp; ++result; } while(first != middle){ *result = *first; ++first; ++result; } return result; } template _UCXXEXPORT void random_shuffle(RandomAccessIterator first, RandomAccessIterator last) { --last; while(first != last){ iter_swap(first, (first + (rand() % (last - first) ) ) ); ++first; } } template _UCXXEXPORT void random_shuffle(RandomAccessIterator first, RandomAccessIterator last, RandomNumberGenerator& rand) { --last; while(first != last){ iter_swap(first, (first + (rand(last - first) ) ) ); ++first; } } // _lib.alg.partitions_, partitions: template _UCXXEXPORT BidirectionalIterator partition(BidirectionalIterator first, BidirectionalIterator last, Predicate pred) { return stable_partition(first, last, pred); } template _UCXXEXPORT BidirectionalIterator stable_partition(BidirectionalIterator first, BidirectionalIterator last, Predicate pred) { //first now points to the first non-desired element while( first != last && pred(*first) ){ ++first; } BidirectionalIterator tempb; BidirectionalIterator tempe = first; while( tempe != last ){ //Find the next desired element while( !pred(*tempe) ){ ++tempe; //See if we should exit if(tempe == last){ return first; } } //Rotate the element back to the begining tempb = tempe; while(tempb != first){ iter_swap(tempb, tempb-1 ); --tempb; } //First now has a desired element ++first; } return first; } template _UCXXEXPORT void sort(RandomAccessIterator first, RandomAccessIterator last) { less::value_type> c; sort(first, last, c ); } template _UCXXEXPORT void stable_sort(RandomAccessIterator first, RandomAccessIterator last) { less::value_type> c; stable_sort(first, last, c); } template _UCXXEXPORT void stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp) { //FIXME - bubble sort RandomAccessIterator temp; --last; while(last - first > 0){ temp = last; while(temp != first){ if( comp( *temp, *(temp-1) ) ){ iter_swap( temp-1, temp); } --temp; } ++first; } } template _UCXXEXPORT void sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp) { stable_sort(first, last, comp); } template _UCXXEXPORT void partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last) { less::value_type> c; partial_sort(first, middle, last, c); } template _UCXXEXPORT void partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp) { //Fixme - partial bubble sort RandomAccessIterator temp; --last; while(first < middle){ temp = last; while(temp != first){ if( comp(*temp, *(temp -1 ) ) ) { iter_swap( temp-1, temp); } --temp; } ++first; } } template _UCXXEXPORT RandomAccessIterator partial_sort_copy(InputIterator first, InputIterator last, RandomAccessIterator result_first, RandomAccessIterator result_last) { less::value_type> c; return partial_sort_copy(first, last, result_first, result_last, c); } template _UCXXEXPORT RandomAccessIterator partial_sort_copy(InputIterator first, InputIterator last, RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp) { size_t output_size = last-first; size_t temp_size = result_last - result_first; if(temp_size < output_size){ output_size = temp_size; } RandomAccessIterator middle = result_first + output_size; RandomAccessIterator temp = result_first; while(temp != middle){ *temp = *first; ++temp; ++first; } sort(result_first, middle, comp); while( first != last){ if( comp( *first, *(middle-1) ) ){ *(middle-1) = *first; sort(result_first, middle, comp); } ++first; } return middle; } template _UCXXEXPORT void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last) { less::value_type> c; nth_element(first, nth, last, c); } template _UCXXEXPORT void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp) { partial_sort(first, nth, last, comp); } template _UCXXEXPORT ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const T& value) { less::value_type> c; return lower_bound(first, last, value, c); } template _UCXXEXPORT ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp) { if(first == last){ return last; } //If below or equal to the first element if( comp(*first, value) == false){ return first; } ForwardIterator middle; //If greater than the top element middle = first; advance(middle, distance(first, last) - 1); if( comp(*middle, value) ){ return last; } //Now begin the actual search for the begining while( distance(first, last) > 1 ){ //Find middle middle = first; advance(middle, (distance(first, last)/2) ); if( !comp(*middle, value) ){ last = middle; }else{ first = middle; } } if( !comp(*first, value) ){ return first; } return last; } template _UCXXEXPORT ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last, const T& value) { less::value_type> c; return upper_bound(first, last, value, c); } template _UCXXEXPORT ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp) { if(first == last){ return last; } //If below the first element if( comp(value, *first) == true){ return first; } ForwardIterator middle; //If greater than the top element middle = first; advance(middle, distance(first, last) - 1); if( comp(*middle, value) ){ return last; } //Now begin the actual search for the end while( distance(first, last) > 1 ){ //Find middle middle = first; advance(middle, (distance(first, last)/2) ); if( comp(value, *middle) ){ last = middle; }else{ first = middle; } } if( comp(value, *first) ){ return first; } return last; } template _UCXXEXPORT pair equal_range(ForwardIterator first, ForwardIterator last, const T& value) { less::value_type> c; return equal_range(first, last, value, c); } template _UCXXEXPORT pair equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp) { pair retval; retval.first = lower_bound(first, last, value, comp); //Reuse retval.first in order to (possibly) save a few comparisons retval.second = upper_bound(retval.first, last, value, comp); return retval; } template _UCXXEXPORT bool binary_search(ForwardIterator first, ForwardIterator last, const T& value) { less::value_type> c; return binary_search(first, last, value, c); } template _UCXXEXPORT bool binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp) { if( distance(first, last) == 0){ return false; } ForwardIterator middle; while( distance(first, last) > 1 ){ //Set middle between first and last middle = first; advance(middle, distance(first, last)/2 ); if( comp(*middle, value ) == true){ first = middle; }else{ last = middle; } } if( !comp(*first, value) && !comp(value, *first) ){ return true; } if( !comp(*last, value) && !comp(value, *last) ){ return true; } return false; } // _lib.alg.merge_, merge: template _UCXXEXPORT OutputIterator merge(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) { less::value_type> c; return merge(first1, last1, first2, last2, result, c); } template _UCXXEXPORT OutputIterator merge(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp) { while( first1 != last1 && first2 != last2){ //If in this order so first1 elements which are equal come first if( comp(*first2, *first1) ){ *result = *first2; ++first2; }else{ *result = *first1; ++first1; } ++result; } //Clean up remaining elements while(first1 != last1){ *result = *first1; ++first1; ++result; } while(first2 != last2){ *result = *first2; ++first2; ++result; } return result; } template _UCXXEXPORT void inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last) { less::value_type> c; inplace_merge(first, middle, last, c); } template _UCXXEXPORT void inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp) { //FIXME - using a bubble exchange method while(first != middle && middle !=last){ if( comp(*middle, *first) ){ BidirectionalIterator temp(middle); while( temp != first){ iter_swap(temp, temp-1); --temp; } ++middle; } ++first; } } // _lib.alg.set.operations_, set operations: template _UCXXEXPORT bool includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2) { less::value_type> c; return includes(first1, last1, first2, last2, c ); } template _UCXXEXPORT bool includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp) { while(first2 != last2){ //Advance the large set until no longer smaller than the element we are looking for while( comp(*first1, *first2) ){ ++first1; //If we are at the end of the list, we don't have the desired element if(first1 == last1){ return false; } } //If we are past the element we want, it isn't here if( comp(*first2, *first1) ){ return false; } ++first2; //Move to next element } return true; } template _UCXXEXPORT OutputIterator set_union(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) { less::value_type> c; return set_union(first1, last1, first2, last2, result, c); } template _UCXXEXPORT OutputIterator set_union(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp) { while( first1 != last1 && first2 != last2){ if( comp(*first2, *first1) ){ *result = *first2; //Elliminate duplicates InputIterator2 temp = first2; while( first1 != last1 && !comp( *temp, *first1) ){ ++first1; } while( first2 != last2 && !comp( *temp, *first2) ){ ++first2; } }else{ *result = *first1; //Elliminate duplicates InputIterator1 temp = first1; while( first1 != last1 && !comp( *temp, *first1) ){ ++first1; } while( first2 != last2 && !comp( *temp, *first2) ){ ++first2; } } ++result; } //Clean up remaining elements while(first1 != last1){ *result = *first1; ++result; InputIterator1 temp = first1; while( first1 != last1 && !comp( *temp, *first1) ){ ++first1; } } while(first2 != last2){ *result = *first2; ++result; InputIterator2 temp = first2; while( first2 != last2 && !comp( *temp, *first2) ){ ++first2; } } return result; } template _UCXXEXPORT OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) { less::value_type> c; return set_intersection(first1, last1, first2, last2, result, c); } template _UCXXEXPORT OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp) { while( first1 != last1 && first2 != last2){ if( comp(*first2, *first1) ){ ++first2; }else if( comp(*first1, *first2) ) { ++first1; }else{ *result = *first1; ++result; InputIterator1 temp = first1; while( first1 != last1 && !comp( *temp, *first1) ){ ++first1; } ++first2; } } return result; } template _UCXXEXPORT OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) { less::value_type> c; return set_difference(first1, last1, first2, last2, result, c); } template _UCXXEXPORT OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp) { while( first1 != last1 && first2 != last2){ if( comp(*first1, *first2) ){ *result = *first1; ++result; //Elliminate duplicates InputIterator1 temp = first1; while( first1 != last1 && !comp( *temp, *first1) ){ ++first1; } }else if( comp(*first2, *first1) ){ //Elliminate duplicates InputIterator2 temp = first2; while( first2 != last2 && !comp( *temp, *first2) ){ ++first2; } }else{ //They are identical - skip //Elliminate duplicates InputIterator1 temp = first1; while( first1 != last1 && !comp( *temp, *first1) ){ ++first1; } while( first2 != last2 && !comp( *temp, *first2) ){ ++first2; } } } //Clean up remaining elements while(first1 != last1){ *result = *first1; ++result; InputIterator1 temp = first1; while( first1 != last1 && !comp( *temp, *first1) ){ ++first1; } } return result; } template _UCXXEXPORT OutputIterator set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) { less::value_type> c; return set_symmetric_difference(first1, last1, first2, last2, result, c); } template _UCXXEXPORT OutputIterator set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp) { while( first1 != last1 && first2 != last2){ if( comp(*first1, *first2) ){ *result = *first1; ++result; //Elliminate duplicates InputIterator1 temp = first1; while( first1 != last1 && !comp( *temp, *first1) ){ ++first1; } }else if( comp(*first2, *first1) ){ *result = *first2; ++result; //Elliminate duplicates InputIterator2 temp = first2; while( first2 != last2 && !comp( *temp, *first2) ){ ++first2; } }else{ //They are identical - skip //Elliminate duplicates InputIterator1 temp = first1; while( first1 != last1 && !comp( *temp, *first1) ){ ++first1; } while( first2 != last2 && !comp( *temp, *first2) ){ ++first2; } } } //Clean up remaining elements while(first1 != last1){ *result = *first1; ++result; InputIterator1 temp = first1; while( first1 != last1 && !comp( *temp, *first1) ){ ++first1; } } while(first2 != last2){ *result = *first2; ++result; InputIterator2 temp = first2; while( first2 != last2 && !comp( *temp, *first2) ){ ++first2; } } return result; } // _lib.alg.heap.operations_, heap operations: template _UCXXEXPORT void push_heap(RandomAccessIterator first, RandomAccessIterator last) { less::value_type> c; push_heap(first, last, c); } template _UCXXEXPORT void push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp) { // *(last - 1) is the last element RandomAccessIterator begin, middle, end; begin = first; end = last - 2; if(last - first < 2){ //Empty heap return; } if ( comp(*(last-1), *end) ){ //Belongs past the end - already in place return; } while(end - begin > 1){ middle = begin + ((end - begin)/2); if( comp(*middle, *(last-1) ) ){ end = middle; }else{ begin = middle; } } if( comp(*begin, *(last-1)) ){ middle = begin; }else{ middle = end; } //Now all we do is swap the elements up to the begining --last; while(last > middle){ iter_swap(last, last-1); --last; } } template _UCXXEXPORT void pop_heap(RandomAccessIterator first, RandomAccessIterator last) { less::value_type> c; pop_heap(first, last, c); } template _UCXXEXPORT void pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare) { --last; while(first < last){ iter_swap( first, first+1); ++first; } } template _UCXXEXPORT void make_heap(RandomAccessIterator first, RandomAccessIterator last) { less::value_type> c; make_heap(first, last, c); } template _UCXXEXPORT void make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp) { sort( reverse_iterator(last), reverse_iterator(first), comp); } template _UCXXEXPORT void sort_heap(RandomAccessIterator first, RandomAccessIterator last) { less::value_type> c; sort_heap(first, last, c); } template _UCXXEXPORT void sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp) { sort( first, last, comp); } // _lib.alg.min.max_, minimum and maximum: template _UCXXEXPORT const T& min(const T& a, const T& b) { if(b < a){ return b; } return a; } template _UCXXEXPORT const T& min(const T& a, const T& b, Compare comp) { if( comp(b, a) == true){ return b; } return a; } template _UCXXEXPORT const T& max(const T& a, const T& b) { if( a < b){ return b; } return a; } template _UCXXEXPORT const T& max(const T& a, const T& b, Compare comp) { if( comp(a, b) ){ return b; } return a; } template _UCXXEXPORT ForwardIterator min_element(ForwardIterator first, ForwardIterator last) { less::value_type> c; return min_element(first, last, c); } template _UCXXEXPORT ForwardIterator min_element(ForwardIterator first, ForwardIterator last, Compare comp) { ForwardIterator retval = first; ++first; while(first != last){ if( comp( *first, *retval) ){ retval = first; } ++first; } return retval; } template _UCXXEXPORT ForwardIterator max_element(ForwardIterator first, ForwardIterator last) { less::value_type> c; return max_element(first, last, c); } template _UCXXEXPORT ForwardIterator max_element(ForwardIterator first, ForwardIterator last, Compare comp) { ForwardIterator retval = first; ++first; while(first != last){ if( comp( *retval, *first ) ){ retval = first; } ++first; } return retval; } template _UCXXEXPORT bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2) { less::value_type> c; return lexicographical_compare(first1, last1, first2, last2, c); } template _UCXXEXPORT bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp) { while(first1 != last1 && first2 != last2){ if( comp(*first1, *first2) ){ return true; } if( comp(*first2, *first1) ){ return false; } ++first1; ++first2; } return first1==last1 && first2 != last2; } // _lib.alg.permutation.generators_, permutations template _UCXXEXPORT bool next_permutation(BidirectionalIterator first, BidirectionalIterator last) { less::value_type> c; return next_permutation(first, last, c); } template _UCXXEXPORT bool next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp) { if(first == last){ return false; // No data } BidirectionalIterator i = last; --i; if(i == first){ return false; //Only one element } BidirectionalIterator ii = i; --ii; //If the last two items are in order, swap them and call it done if( comp(*ii, *i) ){ iter_swap(ii, i); return true; } //This part of the algorithm copied from G++ header files ver. 3.4.2 i = last; --i; for(;;){ ii = i; --i; if ( comp(*i, *ii) ){ BidirectionalIterator j = last; --j; while ( !comp(*i, *j)){ --j; } iter_swap(i, j); reverse(ii, last); return true; } if (i == first){ reverse(first, last); return false; } } } template _UCXXEXPORT bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last) { less::value_type> c; return prev_permutation(first, last, c); } template _UCXXEXPORT bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp) { if(first == last){ return false; // No data } BidirectionalIterator i = last; --i; if(i == first){ return false; //Only one element } BidirectionalIterator ii = i; --ii; //If the last two items are in reverse order, swap them and call it done if( comp(*i, *ii) ){ iter_swap(ii, i); return true; } //Copied from GNU GCC header files version 3.4.2 i = last; --i; for(;;){ ii = i; --i; if ( comp(*ii, *i)){ BidirectionalIterator j = last; --j; while ( !comp(*j, *i)){ --j; } iter_swap(i, j); reverse(ii, last); return true; } if (i == first){ reverse(first, last); return false; } } } } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/algorithm.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include namespace std{ } ================================================ FILE: external/arduino/stlarduino/associative_base ================================================ /* Copyright (C) 2007 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #ifndef __STD_HEADER_ASSOCIATIVE_BASE #define __STD_HEADER_ASSOCIATIVE_BASE #pragma GCC visibility push(default) namespace std{ /* * The basic premise here is that most of the code used by map, multimap, set and * multiset is really common. There are a number of interface additions, and * considerations about how to address multiple entries with the same key. * The goal is that the tree/storage code should be here, and managing * single or multiple counts will be left to subclasses. * Yes, inheritence for the purpose of code sharing is usually a bad idea. * However, since our goal is to reduce the total amount of code written * and the overall binary size, this seems to be the best approach possible. */ template, class Allocator = allocator > class __base_associative; template class _associative_iter; template class _associative_citer; template, class Allocator = allocator > class __single_associative; template, class Allocator = allocator > class __multi_associative; template class _UCXXEXPORT __base_associative{ protected: public: typedef Key key_type; typedef ValueType value_type; typedef Compare key_compare; typedef Allocator allocator_type; typedef typename Allocator::reference reference; typedef typename Allocator::const_reference const_reference; typedef typename Allocator::size_type size_type; typedef typename Allocator::difference_type difference_type; typedef typename Allocator::pointer pointer; typedef typename Allocator::const_pointer const_pointer; typedef __base_associative associative_type; typedef _associative_iter iterator; typedef _associative_citer const_iterator; typedef typename std::reverse_iterator reverse_iterator; typedef typename std::reverse_iterator const_reverse_iterator; explicit __base_associative(const Compare& comp, const Allocator& A, const key_type (*v_to_k)(const value_type)) : c(comp), value_to_key(v_to_k) { } protected: __base_associative(const associative_type& x) : c(x.c), backing(x.backing), value_to_key(x.value_to_key) { } public: ~__base_associative(){ } bool empty() const{ return backing.empty(); } size_type size() const{ return backing.size(); } size_type max_size() const{ return backing.max_size(); } iterator begin(){ return iterator(backing.begin()); } const_iterator begin() const{ return const_iterator(backing.begin()); } iterator end() { return iterator(backing.end()); } const_iterator end() const{ return const_iterator(backing.end()); } reverse_iterator rbegin(){ return reverse_iterator(end()); } const_reverse_iterator rbegin() const{ return const_reverse_iterator(end()); } reverse_iterator rend(){ return reverse_iterator(begin()); } const_reverse_iterator rend() const{ return const_reverse_iterator(begin()); } iterator lower_bound(const key_type &x); const_iterator lower_bound(const key_type &x) const; iterator upper_bound(const key_type &x); const_iterator upper_bound(const key_type &x) const; pair equal_range(const key_type& x){ pair retval; retval.first = lower_bound(x); retval.second = retval.first; while(retval.second != end() && !c(x, value_to_key(*retval.second))){ ++retval.second; } return retval; } pair equal_range(const key_type& x) const{ pair retval; retval.first = lower_bound(x); retval.second = retval.first; while(retval.second != end() && !c(x, value_to_key(*retval.second))){ ++retval.second; } return retval; } iterator find(const key_type& x){ iterator retval = lower_bound(x); if(retval == end()){ return retval; } if(c(x, value_to_key(*retval))){ return end(); } return retval; } const_iterator find(const key_type& x) const{ const_iterator retval = lower_bound(x); if(retval == end()){ return retval; } if(c(x, value_to_key(*retval))){ return end(); } return retval; } size_type count(const key_type& x) const{ size_type retval(0); const_iterator first = lower_bound(x); while(first != end() && !c(x, value_to_key(*first))){ ++retval; ++first; } return retval; } void clear(){ backing.clear(); } void erase(iterator pos){ backing.erase(pos.base_iterator()); } size_type erase(const key_type& x){ size_type count(0); iterator start = lower_bound(x); iterator end = upper_bound(x); while(start != end){ start = backing.erase(start.base_iterator()); ++count; } return count; } void erase(iterator first, iterator last){ while(first != last){ backing.erase(first.base_iterator()); ++first; } } key_compare key_comp() const{ return c; } __base_associative &operator=(const __base_associative & x){ c = x.c; backing = x.backing; value_to_key = x.value_to_key; return *this; } bool operator==(const __base_associative & x){ return x.backing == backing; } bool operator!=(const __base_associative & x){ return !(x.backing == backing); } protected: void swap(__base_associative & x); Compare c; std::list backing; const key_type (*value_to_key)(const value_type); }; /* * Tree iterators for the base associative class */ template class _associative_citer : public std::iterator< bidirectional_iterator_tag, ValueType, typename Allocator::difference_type, ValueType*, ValueType& > { protected: typedef std::list listtype; typename listtype::const_iterator base_iter; friend class _associative_iter; public: _associative_citer() { } _associative_citer(const _associative_citer & m) : base_iter(m.base_iter) { } _associative_citer(const typename listtype::const_iterator & m) : base_iter(m) { } ~_associative_citer() { } ValueType operator*() const{ return *base_iter; } const ValueType * operator->() const{ return &(*base_iter); } _associative_citer & operator=(const _associative_citer & m){ base_iter = m.base_iter; return *this; } bool operator==(const _associative_citer & m) const{ return m.base_iter == base_iter; } bool operator!=(const _associative_citer & m) const{ return m.base_iter != base_iter; } _associative_citer & operator++(){ ++base_iter; return *this; } _associative_citer operator++(int){ //The following approach ensures that we only need to //provide code for ++ in one place (above) _associative_citer temp(base_iter); ++base_iter; return temp; } _associative_citer & operator--(){ --base_iter; return *this; } _associative_citer operator--(int){ //The following approach ensures that we only need to //provide code for -- in one place (above) _associative_citer temp(base_iter); --base_iter; return temp; } //This is an implementation-defined function designed to make internals work correctly typename listtype::const_iterator base_iterator(){ return base_iter; } }; template class _associative_iter : public std::iterator< bidirectional_iterator_tag, ValueType, typename Allocator::difference_type, ValueType*, ValueType& > { protected: typedef std::list listtype; typename listtype::iterator base_iter; typedef _associative_citer __associative_citer; public: _associative_iter() { } _associative_iter(const _associative_iter & m) : base_iter(m.base_iter) { } _associative_iter(const typename listtype::iterator & m) : base_iter(m) { } ~_associative_iter() { } const ValueType & operator*() const{ return *base_iter; } ValueType & operator*(){ return *base_iter; } ValueType * operator->(){ return &(*base_iter); } const ValueType * operator->() const{ return &(*base_iter); } _associative_iter & operator=(const _associative_iter & m){ base_iter = m.base_iter; return *this; } bool operator==(const _associative_iter & m) const{ return m.base_iter == base_iter; } bool operator==(const __associative_citer & m) const{ return m.base_iter == base_iter; } bool operator!=(const _associative_iter & m) const{ return m.base_iter != base_iter; } bool operator!=(const __associative_citer & m) const{ return m.base_iter != base_iter; } _associative_iter & operator++(){ ++base_iter; return *this; } _associative_iter operator++(int){ //The following approach ensures that we only need to //provide code for ++ in one place (above) _associative_iter temp(base_iter); ++base_iter; return temp; } _associative_iter & operator--(){ --base_iter; return *this; } _associative_iter operator--(int){ //The following approach ensures that we only need to //provide code for -- in one place (above) _associative_iter temp(base_iter); --base_iter; return temp; } operator __associative_citer() const{ return __associative_citer(base_iter); } typename listtype::iterator base_iterator(){ return base_iter; } const typename listtype::iterator base_iterator() const{ return base_iter; } }; // The lower_bound code is really crappy linear search. However, it is a dead // simple implementation (easy to audit). It can also be easily replaced. template typename __base_associative::iterator __base_associative::lower_bound(const key_type &x) { iterator retval = begin(); while(retval != end() && c(value_to_key(*retval), x)){ ++retval; } return retval; } template typename __base_associative::const_iterator __base_associative::lower_bound(const key_type &x) const { const_iterator retval = begin(); while(retval != end() && c(value_to_key(*retval), x)){ ++retval; } return retval; } // Upper bound search is linear from the point of lower_bound. This is likely the best solution // in all but the most pathological of cases. template typename __base_associative::iterator __base_associative::upper_bound(const key_type &x) { iterator retval = lower_bound(x); while(retval != end() && !c(x, value_to_key(*retval))){ ++retval; } return retval; } template typename __base_associative::const_iterator __base_associative::upper_bound(const key_type &x) const { const_iterator retval = begin(); while(retval != end() && !c(x, value_to_key(*retval))){ ++retval; } return retval; } template void __base_associative::swap(__base_associative& m) { Compare n = c; c = m.c; m.c = n; m.backing.swap(backing); } template class _UCXXEXPORT __single_associative : public __base_associative { protected: typedef __base_associative base; using base::backing; using base::c; public: typedef typename base::key_type key_type; typedef typename base::value_type value_type; typedef typename base::key_compare key_compare; typedef typename base::allocator_type allocator_type; typedef typename base::reference reference; typedef typename base::const_reference const_reference; typedef typename base::iterator iterator; typedef typename base::const_iterator const_iterator; typedef typename base::size_type size_type; typedef typename base::difference_type difference_type; typedef typename base::pointer pointer; typedef typename base::const_pointer const_pointer; typedef typename base::reverse_iterator reverse_iterator; typedef typename base::const_reverse_iterator const_reverse_iterator; using base::begin; using base::end; using base::rbegin; using base::rend; using base::empty; using base::size; using base::max_size; using base::find; using base::count; using base::lower_bound; using base::upper_bound; using base::equal_range; using base::operator=; using base::operator==; using base::operator!=; explicit __single_associative(const Compare& comp, const Allocator& A, const key_type (*v_to_k)(const value_type)) : base(comp, A, v_to_k) { } template __single_associative( InputIterator first, InputIterator last, const Compare& comp, const Allocator& A, const key_type (*v_to_k)(const value_type) ) : base(comp, A, v_to_k) { insert(first, last); } pair insert(const value_type& x){ pair retval; iterator location = lower_bound(this->value_to_key(x)); retval.second = true; //Empty list or need to insert at end if(end() == location){ backing.push_back(x); retval.first = --(end()); return retval; } //Something in the list if(c(this->value_to_key(x), this->value_to_key(*location))){ location = backing.insert(location.base_iterator(), x); retval.first = location; }else{ retval.second = false; retval.first = location; } return retval; } iterator insert(iterator position, const value_type& x){ // FIXME - this is cheating and probably should be more efficient since we are // now log(n) to find for inserts return insert(x).first; } template void insert(InputIterator first, InputIterator last){ while(first != last){ insert(*first); ++first; } } }; template class _UCXXEXPORT __multi_associative : public __base_associative { protected: typedef __base_associative base; using base::backing; using base::c; public: typedef typename base::key_type key_type; typedef typename base::value_type value_type; typedef typename base::key_compare key_compare; typedef typename base::allocator_type allocator_type; typedef typename base::reference reference; typedef typename base::const_reference const_reference; typedef typename base::iterator iterator; typedef typename base::const_iterator const_iterator; typedef typename base::size_type size_type; typedef typename base::difference_type difference_type; typedef typename base::pointer pointer; typedef typename base::const_pointer const_pointer; typedef typename base::reverse_iterator reverse_iterator; typedef typename base::const_reverse_iterator const_reverse_iterator; using base::begin; using base::end; using base::rbegin; using base::rend; using base::empty; using base::size; using base::max_size; using base::find; using base::count; using base::lower_bound; using base::upper_bound; using base::equal_range; using base::operator=; using base::operator==; explicit __multi_associative(const Compare& comp, const Allocator& A, const key_type (*v_to_k)(const value_type)) : base(comp, A, v_to_k) { } template __multi_associative( InputIterator first, InputIterator last, const Compare& comp, const Allocator& A, const key_type (*v_to_k)(const value_type) ) : base(comp, A, v_to_k) { insert(first, last); } iterator insert(const value_type& x){ iterator location = lower_bound(this->value_to_key(x)); if(location == begin()){ backing.push_front(x); location = begin(); }else{ location = backing.insert(location.base_iterator(), x); } return location; } iterator insert(iterator position, const value_type& x){ // FIXME - this is cheating and probably should be more efficient since we are // now log(n) to find for inserts return insert(x); } template void insert(InputIterator first, InputIterator last){ while(first != last){ insert(*first); ++first; } } }; } #pragma GCC visibility pop #endif //__STD_HEADER_ASSOCIATIVE_BASE ================================================ FILE: external/arduino/stlarduino/associative_base.cpp ================================================ /* Copyright (C) 2007 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include namespace std{ } ================================================ FILE: external/arduino/stlarduino/basic_definitions ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef __BASIC_DEFINITIONS #define __BASIC_DEFINITIONS 1 #include #pragma GCC visibility push(default) //The following is used to support GCC symbol visibility patch #ifdef GCC_HASCLASSVISIBILITY #define _UCXXEXPORT __attribute__ ((visibility("default"))) #define _UCXXLOCAL __attribute__ ((visibility("hidden"))) #else #define _UCXXEXPORT #define _UCXXLOCAL #endif #ifdef __GCC__ #define __UCLIBCXX_NORETURN __attribute__ ((__noreturn__)) #else #define __UCLIBCXX_NORETURN #endif #ifdef __UCLIBCXX_HAS_TLS__ #define __UCLIBCXX_TLS __thread #else #define __UCLIBCXX_TLS #endif //Testing purposes #define __STRING_MAX_UNITS 65535 namespace std{ typedef signed long int streamsize; } #pragma GCC visibility pop # ifdef __DODEBUG__ #define UCLIBCXX_DEBUG 1 # else #define UCLIBCXX_DEBUG 0 # endif #endif ================================================ FILE: external/arduino/stlarduino/bitset ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #ifndef __STD_BITSET_HEADER #define __STD_BITSET_HEADER 1 #pragma GCC visibility push(default) namespace std{ template class bitset; template bitset operator&(const bitset&, const bitset&); template bitset operator|(const bitset&, const bitset&); template bitset operator^(const bitset&, const bitset&); template basic_istream& operator>>(basic_istream& is, bitset& x); template basic_ostream& operator<<(basic_ostream& os, const bitset& x); //Actual Code template class _UCXXEXPORT bitset { private: //Number of characters allocated to hold the bits static const size_t WORD_SIZE = CHAR_BIT; //Use int maybe? static const size_t num_bytes = (N + WORD_SIZE - 1) / WORD_SIZE; //From the bit number, figure out which byte we are working with size_t byte_num(size_t bit_num) const{ if(WORD_SIZE == 8){ return (bit_num >> 3); } if(WORD_SIZE == 16){ return (bit_num >> 4); } if(WORD_SIZE == 32){ return (bit_num >> 5); } if(WORD_SIZE == 64){ return (bit_num >> 6); } return bit_num / WORD_SIZE; } //From the bit number, figure out which bit inside the byte we need size_t bit_num(const size_t bit_num) const{ return bit_num % WORD_SIZE; } //Point to the actual data char data[num_bytes]; public: class _UCXXEXPORT reference { friend class bitset; reference() : bit_num(0), parent(0) { } size_t bit_num; bitset * parent; public: ~reference() { } reference& operator=(bool x){ // for b[i] = x; parent->set(bit_num, x); return *this; } reference& operator=(const reference& x){ // for b[i] = b[j]; parent->set(bit_num, x); return *this; } bool operator~() const{ // flips the bit return !parent->test(bit_num); } operator bool() const{ // for x = b[i]; return parent->test(bit_num); } reference& flip(){ // for b[i].flip(); parent->flip(bit_num); return *this; } }; bitset(){ reset(); } bitset(unsigned long val){ reset(); size_t count = sizeof(val) * CHAR_BIT; if(count > N){ count = N; } for(size_t i = 0; i < count; ++i){ set(i, ((val >> i) & 1)); } } bitset(const bitset & val){ for(size_t i = 0; i < num_bytes; ++i){ data[i] = val.data[i]; } } template _UCXXEXPORT explicit bitset( const basic_string& str, typename basic_string::size_type pos = 0, typename basic_string::size_type n = basic_string::npos ){ reset(); if(n > str.length()){ n = str.length(); } size_t width = n; if (width + pos > str.length()){ width = str.length() - pos; } for(size_t i = 0; i < width; ++i){ switch(str[pos + width - i - 1]){ case '0': break; case '1': set(i); break; default: __throw_invalid_argument(); } } } bitset& operator&=(const bitset& rhs){ for(size_t i =0; i < num_bytes; ++i){ data[i] &= rhs.data[i]; } return *this; } bitset& operator|=(const bitset& rhs){ for(size_t i =0; i < num_bytes; ++i){ data[i] |= rhs.data[i]; } return *this; } bitset& operator^=(const bitset& rhs){ for(size_t i=0; i < num_bytes; ++i){ data[i] ^= rhs.data[i]; } return *this; } bitset& operator<<=(size_t pos){ for(size_t i = N-1; i >=pos; --i){ set(i, test(i - pos)); } for(size_t i = 0; i < pos; ++i){ reset(i); } return *this; } bitset& operator>>=(size_t pos){ for(size_t i = 0; i < (N - pos); ++i){ set(i, test(i + pos)); } for(size_t i = pos; i > 0; --i){ reset(N - i); } return *this; } bitset& set(){ size_t i; for(i = 0; i < N ; ++i){ data[byte_num(i)] |= (1<& set(size_t pos, int val = true){ if(val == true){ data[byte_num(pos)] |= (1<& reset(){ for(size_t i = 0; i < num_bytes; ++i){ data[i] = 0; } return *this; } bitset& reset(size_t pos){ data[byte_num(pos)] &= ~(1< operator~() const{ bitset retval(*this); retval.flip(); return retval; } bitset& flip(){ for(size_t i = 0; i < num_bytes; ++i){ data[i] = ~data[i]; } return *this; } bitset& flip(size_t pos){ char temp = data[byte_num(pos)] & (1 << bit_num(pos)); if(temp == 0){ //Bit was 0 data[byte_num(pos)] |= (1 << bit_num(pos)); }else{ //Bit was 1 data[byte_num(pos)] &= ~(1< sizeof(unsigned long) * CHAR_BIT){ __throw_overflow_error(); } unsigned long retval = 0; size_t count = N; for(size_t i = count; i > 0; --i){ if(test(i)){ retval +=1; } retval<<=1; } if(test(0)){ retval +=1; } return retval; } template basic_string to_string() const { basic_string retval; retval.reserve(N); for(size_t i = N ; i > 0; --i){ if(test(i-1) == true){ retval.append("1"); }else{ retval.append("0"); } } return retval; } size_t count() const{ size_t retval = 0; for(size_t i =0; i < N; ++i){ if(test(i)){ ++retval; } } return retval; } size_t size() const{ return N; } bitset& operator=(const bitset & rhs){ if(&rhs == this){ return *this; } for(size_t i = 0; i <= byte_num(N); ++i){ data[i] = rhs.data[i]; } return *this; } bool operator==(const bitset& rhs) const{ for(size_t i =0; i< N; ++i){ if(test(i) != rhs.test(i)){ return false; } } return true; } bool operator!=(const bitset& rhs) const{ for(size_t i =0; i< N; ++i){ if(test(i) != rhs.test(i)){ return true; } } return false; } bool test(size_t pos) const{ return (data[byte_num(pos)] & (1< operator<<(size_t pos) const{ bitset retval(*this); retval<<=pos; return retval; } bitset operator>>(size_t pos) const{ bitset retval(*this); retval>>=pos; return retval; } }; //Non-member functions template _UCXXEXPORT bitset operator&(const bitset& lhs, const bitset& rhs){ bitset retval(lhs); retval &= rhs; return retval; } template _UCXXEXPORT bitset operator|(const bitset& lhs, const bitset& rhs){ bitset retval(lhs); retval |= rhs; return retval; } template _UCXXEXPORT bitset operator^(const bitset& lhs, const bitset& rhs){ bitset retval(lhs); retval ^= rhs; return retval; } template _UCXXEXPORT basic_istream& operator>>(basic_istream& is, bitset& x) { string s; charT c; for(size_t i = 0; i < N; ++i){ is.get(c); if(!is.good()){ break; } if(c != '1' && c !='0'){ is.putback(c); break; } s+=c; } bitset temp(s); x = temp; return is; } template _UCXXEXPORT basic_ostream& operator<<(basic_ostream& os, const bitset& x) { for(size_t i = N ; i > 0; --i){ if(x.test(i-1) == true){ os << "1"; }else{ os << "0"; } } return os; } } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/bitset.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include namespace std{ } ================================================ FILE: external/arduino/stlarduino/cassert ================================================ /* Copyright (C) 2005 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include ================================================ FILE: external/arduino/stlarduino/cctype ================================================ /* Copyright (C) 2006 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include namespace std{ using ::isalnum; using ::isalpha; using ::iscntrl; using ::isdigit; using ::isgraph; using ::islower; using ::isprint; using ::ispunct; using ::isspace; using ::isupper; using ::isxdigit; using ::tolower; using ::toupper; } ================================================ FILE: external/arduino/stlarduino/cerrno ================================================ /* Copyright (C) 2005 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include ================================================ FILE: external/arduino/stlarduino/cfloat ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #ifndef __STD_HEADER_CFLOAT #define __STD_HEADER_CFLOAT 1 #include #endif ================================================ FILE: external/arduino/stlarduino/char_traits ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #ifdef __UCLIBCXX_HAS_WCHAR__ #include #include #endif #ifndef __HEADER_CHAR_TRAITS #define __HEADER_CHAR_TRAITS 1 namespace std{ /* Inlining all wrapped function calls to shrink the amount of code generated*/ //Typedefs to use for stuff typedef signed int char_traits_off_type; //Generic char_traits template struct _UCXXEXPORT char_traits { }; //Specialize for char template<> struct _UCXXEXPORT char_traits { typedef char char_type; typedef short int int_type; typedef char_traits_off_type off_type; typedef char_traits_off_type pos_type; typedef char state_type; inline static void assign(char_type & c, const char_type & d) { c = d; } static bool eq(const char_type& c1, const char_type& c2); static char_type to_char_type(const int_type & i); inline static int_type to_int_type(const char_type & c){ return (short int)(unsigned char)c; } inline static bool eq_int_type(const int_type & a, const int_type & b){ if(a==b){ return true; } return false; } inline static bool lt(const char_type& c1, const char_type& c2){ if(strncmp(&c1, &c2, 1) < 0){ return true; } return false; } inline static char_type* move(char_type* s1, const char_type* s2, size_t n){ return (char*) memmove(s1, s2, n); } inline static char_type* copy(char_type* s1, const char_type* s2, size_t n){ for(unsigned long int i=0; i< n; ++i){ assign(s1[i], s2[i]); } return s1 + n; } inline static char_type* assign(char_type* s, size_t n, char_type a){ return (char *)memset(s, a, n); } inline static int compare(const char_type* s1, const char_type* s2, size_t n){ return strncmp(s1, s2, n); } inline static size_t length(const char_type* s){ return strlen(s); } static const char_type* find(const char_type* s, int n, const char_type& a); inline static char_type eos() { return 0; } inline static int_type eof() { return -1; } inline static int_type not_eof(const int_type & i) { if(i == -1){ return 0; } else { return i; } } static state_type get_state(pos_type p){ p = p; state_type a; return a; } }; #ifdef __UCLIBCXX_HAS_WCHAR__ template<> struct _UCXXEXPORT char_traits { typedef wchar_t char_type; typedef wint_t int_type; typedef char_traits_off_type off_type; typedef char_traits_off_type pos_type; typedef mbstate_t state_type; static void assign(char_type & c, const char_type & d){ c=d; } static char_type to_char_type(const int_type & i){ return i; } static int_type to_int_type(const char_type & c){ return c; } inline static bool eq_int_type(const int_type & a, const int_type & b){ if(a==b){ return true; } return false; } inline static bool eq(const char_type& c1, const char_type& c2){ if(wcsncmp(&c1, &c2, 1) == 0){ return true; } return false; } inline static bool lt(const char_type& c1, const char_type& c2){ if(wcsncmp(&c1, &c2, 1) < 0){ return true; } return false; } inline static char_type* move(char_type* s1, const char_type* s2, size_t n){ return (char_type*) memmove(s1, s2, n * sizeof(char_type)); } inline static char_type* copy(char_type* s1, const char_type* s2, size_t n){ for(unsigned long int i=0; i< n; ++i){ assign(s1[i], s2[i]); } return s1 + n; } inline static char_type* assign(char_type* s, size_t n, char_type a){ return (char_type *)memset(s, a, n); /*FIXME*/ } inline static int compare(const char_type* s1, const char_type* s2, size_t n){ return wcsncmp(s1, s2, n); } inline static size_t length(const char_type* s){ return wcslen(s); } static const char_type* find(const char_type* s, int n, const char_type& a); inline static char_type eos() { return 0; } inline static int_type eof() { return WEOF; } inline static int_type not_eof(const int_type & i) { if(i == WEOF){ return (int_type)0; } else { return i; } } static state_type get_state(pos_type){ state_type a; return a; } }; #endif } #endif ================================================ FILE: external/arduino/stlarduino/char_traits.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define __UCLIBCXX_COMPILE_CHAR_TRAITS__ 1 #include #include namespace std{ _UCXXEXPORT const char_traits::char_type* char_traits::find(const char_type* s, int n, const char_type& a){ for(int i=0; i < n; i++){ if(eq(s[i], a)){ return (s+i); } } return 0; } _UCXXEXPORT bool char_traits::eq(const char_type& c1, const char_type& c2){ if(strncmp(&c1, &c2, 1) == 0){ return true; } return false; } _UCXXEXPORT char_traits::char_type char_traits::to_char_type(const int_type & i){ if(i > 0 && i <= 255){ return (char)(unsigned char)i; } //Out of range return 0; } #ifdef __UCLIBCXX_HAS_WCHAR__ _UCXXEXPORT const char_traits::char_type* char_traits::find(const char_type* s, int n, const char_type& a){ for(int i=0; i < n; i++){ if(eq(s[i], a)){ return (s+i); } } return 0; } #endif } ================================================ FILE: external/arduino/stlarduino/climits ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef __STD_HEADER_CLIMITS #define __STD_HEADER_CLIMITS 1 #include #endif ================================================ FILE: external/arduino/stlarduino/clocale ================================================ /* Copyright (C) 2005 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef __STD_HEADER_CLOCALE #define __STD_HEADER_CLOCALE 1 #include namespace std { using ::lconv; using ::setlocale; using ::localeconv; } #endif // __STD_HEADER_CLOCALE ================================================ FILE: external/arduino/stlarduino/cmath ================================================ /* Copyright (C) 2006 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #ifndef __STD_HEADER_CMATH #define __STD_HEADER_CMATH 1 #undef abs #undef acos #undef asin #undef atan #undef atan2 #undef ceil #undef cos #undef cosh #undef exp #undef fabs #undef floor #undef fmod #undef frexp #undef ldexp #undef log #undef log10 #undef modf #undef pow #undef sin #undef sinh #undef sqrt #undef tan #undef tanh namespace std { using ::acos; using ::asin; using ::atan; using ::atan2; using ::ceil; using ::cos; using ::cosh; using ::exp; using ::fabs; using ::floor; using ::fmod; using ::frexp; using ::ldexp; using ::log; using ::log10; using ::modf; using ::pow; using ::sin; using ::sinh; using ::sqrt; using ::tan; using ::tanh; #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO inline float abs (float x){ return fabsf(x); } inline float acos (float x){ return acosf(x); } inline float asin (float x){ return asinf(x); } inline float atan (float x){ return atanf(x); } inline float atan2(float y, float x){ return atan2f(y, x); } inline float ceil (float x){ return ceilf(x); } inline float cos (float x){ return cosf(x); } inline float cosh (float x){ return coshf(x); } inline float exp (float x){ return expf(x); } inline float fabs (float x){ return fabsf(x); } inline float floor(float x){ return floorf(x); } inline float fmod (float x, float y){ return fmodf(x, y); } inline float frexp(float x, int* exp){ return frexpf(x, exp); } inline float ldexp(float x, int exp){ return ldexpf(x, exp); } inline float log (float x){ return logf(x); } inline float log10(float x){ return log10f(x); } inline float modf (float x, float* inptr){ return modff(x, inptr); } inline float pow (float x, float y){ return powf(x, y); } #if 1 // DR 550 removed this inline float pow (float x, int y){ return pow((double)x, (double)y); } #endif inline float sin (float x){ return sinf(x); } inline float sinh (float x){ return sinhf(x); } inline float sqrt (float x){ return sqrtf(x); } inline float tan (float x){ return tanf(x); } inline float tanh (float x){ return tanhf(x); } inline double abs(double x){ return fabs(x); } inline double pow(double x, int y){ return pow((double)x, (double)y); } # ifdef __UCLIBCXX_HAS_LONG_DOUBLE__ inline long double abs (long double x){ return fabsl(x); } inline long double acos (long double x){ return acosl(x); } inline long double asin (long double x){ return asinl(x); } inline long double atan (long double x){ return atanl(x); } inline long double atan2(long double y, long double x){ return atan2l(y, x); } inline long double ceil (long double x){ return ceill(x); } inline long double cos (long double x){ return cosl(x); } inline long double cosh (long double x){ return coshl(x); } inline long double exp (long double x){ return expl(x); } inline long double fabs (long double x){ return fabsl(x); } inline long double floor(long double x){ return floorl(x); } inline long double frexp(long double x, int* exp){ return frexpl(x, exp); } inline long double fmod (long double x, long double y){ return fmodl(x, y); } inline long double ldexp(long double x, int y){ return ldexpl(x, y); } inline long double log (long double x){ return logl(x); } inline long double log10(long double x){ return log10l(x); } inline long double modf (long double x, long double* iptr){ return modfl(x, iptr); } inline long double pow (long double x, long double y){ return powl(x, y); } inline long double pow (long double x, int y){ return powl(x, (long double)y ); } inline long double sin (long double x){ return sinl(x); } inline long double sinh (long double x){ return sinhl(x); } inline long double sqrt (long double x){ return sqrtl(x); } inline long double tan (long double x){ return tanl(x); } inline long double tanh (long double x){ return tanhl(x); } # endif // __UCLIBCXX_HAS_LONG_DOUBLE__ #endif // __CORRECT_ISO_CPP_MATH_H_PROTO } #endif //__STD_HEADER_CMATH ================================================ FILE: external/arduino/stlarduino/complex ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #ifndef __STD_HEADER_COMPLEX #define __STD_HEADER_COMPLEX 1 namespace std { // class complex; // class complex; // class complex; template class _UCXXEXPORT complex{ public: typedef T value_type; complex(const T& re = T(), const T& im = T()) : r(re), i(im) { } complex(const complex& c): r(c.r), i(c.i){ } template complex(const complex& c): r(c.r), i(c.i){ } inline T real() const{ return r; } inline T imag() const{ return i; } complex& operator= (const T& v){ r = v; i = 0; return *this; } complex& operator+=(const T& v){ r +=v; return *this; } complex& operator-=(const T& v){ r -=v; return *this; } complex& operator*=(const T& v){ r*=v; i*=v; return *this; } complex& operator/=(const T& v){ r/=v; i/=v; return *this; } complex& operator=(const complex& v){ if(&v != this){ r = v.r; i = v.i; } return *this; } template complex& operator= (const complex& v){ r = v.r; i = v.i; return *this; } template complex& operator+=(const complex& v){ r+=v.r; i+=v.i; return *this; } template complex& operator-=(const complex& v){ r-=v.r; i-=v.i; return *this; } template complex& operator*=(const complex& v){ T tempr = r*v.r - i*v.i; T tempi = r*v.i + i*v.r; r = tempr; i = tempi; return *this; } template complex& operator/=(const complex& v){ T tempr = (r*v.r + i*v.i) / (v.r*v.r + v.i*v.i); T tempi = (i*v.r - r*v.i) / (v.r*v.r + v.i*v.i); r = tempr; i = tempi; return *this; } private: T r; T i; }; template _UCXXEXPORT complex operator+(const complex& ls, const complex& rs){ complex retval(ls); retval += rs; return retval; } template _UCXXEXPORT complex operator+(const complex& ls, const T& rs){ complex retval(ls); ls += rs; return retval; } template _UCXXEXPORT inline complex operator+(const T& ls, const complex& rs){ return rs + ls; } template _UCXXEXPORT complex operator-(const complex& ls, const complex& rs){ complex retval(ls); retval -= rs; return retval; } template _UCXXEXPORT complex operator-(const complex& ls, const T& rs){ complex retval(ls); retval -= rs; return retval; } template _UCXXEXPORT complex operator-(const T& ls, const complex& rs){ complex retval(ls); retval -= rs; return retval; } template _UCXXEXPORT complex operator*(const complex& ls, const complex& rs){ complex retval(ls); retval *= rs; return retval; } template _UCXXEXPORT complex operator*(const complex& ls, const T& rs){ complex retval(ls); retval *= rs; return retval; } template _UCXXEXPORT complex operator*(const T& ls, const complex& rs){ complex retval(ls); retval *=rs; return retval; } template _UCXXEXPORT complex operator/(const complex& ls, const complex& rs){ complex retval(ls); retval/=rs; return retval; } template _UCXXEXPORT complex operator/(const complex& ls, const T& rs){ complex retval(ls); retval/=rs; return retval; } template _UCXXEXPORT complex operator/(const T& ls, const complex& rs){ complex retval(ls); retval/=rs; return retval; } template _UCXXEXPORT complex operator+(const complex& v){ return v; } template _UCXXEXPORT complex operator-(const complex& v){ return complex (-v.real(), -v.imag()); } template _UCXXEXPORT bool operator==(const complex& ls, const complex& rs){ if( ls.real() == rs.real() && ls.imag() == rs.image()){ return true; } return false; } template _UCXXEXPORT bool operator==(const complex& ls, const T& rs){ if(ls.real() == rs && ls.imag() == T()){ return true; } return false; } template _UCXXEXPORT bool operator==(const T& ls, const complex& rs){ if(ls == rs.real() && rs.imag() == T()){ return true; } return false; } template _UCXXEXPORT bool operator!=(const complex& ls, const complex& rs){ if(ls == rs){ return false; } return true; } template _UCXXEXPORT bool operator!=(const complex& ls, const T& rs){ if(ls == rs){ return false; } return true; } template _UCXXEXPORT bool operator!=(const T& ls, const complex& rs){ if(ls == rs){ return false; } return true; } template _UCXXEXPORT basic_istream& operator>>(basic_istream& is, complex& v) { T tempr; T tempi; is >> tempr; is.get(); is >> tempi; v = complex(tempr, tempi); return is; } template _UCXXEXPORT basic_ostream& operator<<(basic_ostream& os, const complex&v) { os << v.real() << ", " << v.imag(); return os; } template _UCXXEXPORT T real(const complex& v){ return v.real(); } template _UCXXEXPORT T imag(const complex& v){ return v.imag(); } template _UCXXEXPORT T norm(const complex& v){ return (v.real() * v.real() + v.imag() * v.imag()); } template _UCXXEXPORT complex conj(const complex& v){ return complex(v.real(), -v.imag()); } #ifdef __UCLIBCXX_SUPPORT_MATH__ //Can we link with libm? template _UCXXEXPORT T abs(const complex& v){ return sqrt(v.real() * v.real() + v.imag() * v.imag()); } template _UCXXEXPORT T arg(const complex& v){ return atan2(v.imag(), v.real()); } template _UCXXEXPORT complex polar(const T& rho, const T& theta){ return complex(rho * cos(theta), rho * sin(theta)); } template _UCXXEXPORT complex cos (const complex& v){ return complex(cos(v.real()) * cosh(v.imag()), -sin(v.real()) * sinh(v.imag())); } template _UCXXEXPORT complex cosh (const complex& v){ return complex(cosh(v.real()) * cos(v.imag()), sinh(v.real()) * sin(v.imag())); } template _UCXXEXPORT complex exp (const complex& v){ return polar(exp(v.real()), v.imag()); } template _UCXXEXPORT complex log (const complex& v){ return complex(log(abs(v)), arg(v)); } template _UCXXEXPORT complex log10(const complex& v){ return (log(v) / log(T(10.0))); } template _UCXXEXPORT complex pow(const complex& v, int p){ T rho = pow(abs(v), p); T theta = arg(v); return complex(rho * cos(p * theta), rho * sin(p * theta) ); } template _UCXXEXPORT complex pow(const complex& v, const T& p){ return polar( pow(abs(v),p), arg(v)*p ); } template _UCXXEXPORT complex pow(const complex& v, const complex& p){ if(v == T()){ //We are using "0" as the value return T(); } return exp(p * log(v)); } template _UCXXEXPORT complex pow(const T& v, const complex& p){ if(v == T()){ return T(); } return polar(pow(v,p.real()), p.imag() * log(x) ); } template _UCXXEXPORT complex sin (const complex& v){ return complex(sin(v.real()) * cosh(v.imag()), cosh(v.real()) * sin(v.imag())); } template _UCXXEXPORT complex sinh (const complex& v){ return complex(sinh(v.real()) * cos(v.imag()), cosh(v.real()) * sin(v.imag()) ); } template _UCXXEXPORT complex sqrt (const complex&); template _UCXXEXPORT complex tan (const complex& v){ return sin(v) / cos(v); } template _UCXXEXPORT complex tanh (const complex& v){ return sinh(v) / cosh(v); } #endif } #endif ================================================ FILE: external/arduino/stlarduino/complex.cpp ================================================ /* Copyright (C) 2005 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include namespace std{ template class _UCXXEXPORT complex; } ================================================ FILE: external/arduino/stlarduino/csetjmp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #ifndef __STD_HEADER_CSETJMP #define __STD_HEADER_CSETJMP 1 //From GCC Header files #undef longjmp // Adhere to section 17.4.1.2 clause 5 of ISO 14882:1998 #ifndef setjmp #define setjmp(env) setjmp (env) #endif //Mine again namespace std{ using ::longjmp; using ::jmp_buf; } #endif ================================================ FILE: external/arduino/stlarduino/csignal ================================================ // -*- C++ -*- forwarding header. // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 2, or (at your option) // any later version. // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License along // with this library; see the file COPYING. If not, write to the Free // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, // USA. // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // ISO C++ 14882: 20.4.6 C library // /** @file csignal * This is a Standard C++ Library file. You should @c #include this file * in your programs, rather than any of the "*.h" implementation files. * * This is the C++ version of the Standard C Library header @c signal.h, * and its contents are (mostly) the same as that header, but are all * contained in the namespace @c std. */ #ifndef _CPP_CSIGNAL #define _CPP_CSIGNAL 1 #pragma GCC system_header #include // Get rid of those macros defined in in lieu of real functions. #undef raise namespace std { using ::sig_atomic_t; using ::signal; using ::raise; } #endif ================================================ FILE: external/arduino/stlarduino/cstdarg ================================================ // -*- C++ -*- forwarding header. // Copyright (C) 1997, 1998, 1999, 2000, 2002 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 2, or (at your option) // any later version. // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License along // with this library; see the file COPYING. If not, write to the Free // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, // USA. // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // ISO C++ 14882: 20.4.6 C library // /** @file cstdarg * This is a Standard C++ Library file. You should @c #include this file * in your programs, rather than any of the "*.h" implementation files. * * This is the C++ version of the Standard C Library header @c stdarg.h, * and its contents are (mostly) the same as that header, but are all * contained in the namespace @c std. */ #ifndef _CPP_CSTDARG #define _CPP_CSTDARG 1 #pragma GCC system_header #include // Adhere to section 17.4.1.2 clause 5 of ISO 14882:1998 #ifndef va_end #define va_end(ap) va_end (ap) #endif namespace std { using ::va_list; } #endif ================================================ FILE: external/arduino/stlarduino/cstddef ================================================ // -*- C++ -*- forwarding header. // Copyright (C) 1997, 1998, 1999, 2000, 2002 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 2, or (at your option) // any later version. // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License along // with this library; see the file COPYING. If not, write to the Free // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, // USA. // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // ISO C++ 14882: 18.1 Types // /** @file cstddef * This is a Standard C++ Library file. You should @c #include this file * in your programs, rather than any of the "*.h" implementation files. * * This is the C++ version of the Standard C Library header @c stddef.h, * and its contents are (mostly) the same as that header, but are all * contained in the namespace @c std. */ #ifndef _CPP_CSTDDEF #define _CPP_CSTDDEF 1 #ifdef __GCC__ #pragma GCC system_header #endif #include namespace std { using ::ptrdiff_t; using ::size_t; } #endif ================================================ FILE: external/arduino/stlarduino/cstdio ================================================ /* Copyright (C) 2006 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation version 2.1 This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #ifndef __HEADER_CSTDIO #define __HEADER_CSTDIO 1 namespace std{ using ::FILE; using ::fpos_t; using ::clearerr; using ::fclose; using ::feof; using ::ferror; using ::fflush; using ::fgetc; using ::fgetpos; using ::fgets; using ::fopen; using ::fprintf; using ::fputc; using ::fputs; using ::fread; using ::freopen; using ::fscanf; using ::fseek; using ::fsetpos; using ::ftell; using ::fwrite; using ::getc; using ::getchar; #if __cplusplus <= 201103L using ::gets; #endif using ::perror; using ::printf; using ::putc; using ::putchar; using ::puts; using ::remove; using ::rename; using ::rewind; using ::scanf; using ::setbuf; using ::setvbuf; using ::sprintf; using ::sscanf; using ::tmpfile; using ::tmpnam; using ::ungetc; using ::vfprintf; using ::vprintf; using ::vsprintf; } #endif ================================================ FILE: external/arduino/stlarduino/cstdlib ================================================ /* Copyright (C) 2005 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #ifndef __HEADER_CSTDLIB #define __HEADER_CSTDLIB 1 namespace std{ using ::abort; using ::abs; using ::atexit; using ::atol; using ::atof; using ::atoi; using ::bsearch; using ::calloc; using ::div; using ::exit; using ::free; using ::getenv; using ::labs; using ::ldiv; using ::malloc; using ::qsort; using ::rand; using ::realloc; using ::srand; using ::strtod; using ::strtol; using ::strtoul; using ::system; #ifdef __UCLIBCXX_HAS_WCHAR__ using ::mblen; using ::mbstowcs; using ::mbtowc; using ::wctomb; using ::wcstombs; #endif /* Defined in Arduino inline long abs(long i){ return labs(i); } */ inline ldiv_t div(long i, long j){ return ldiv(i, j); } } #endif ================================================ FILE: external/arduino/stlarduino/cstring ================================================ /* Copyright (C) 2005 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #ifndef __HEADER_CSTRING #define __HEADER_CSTRING 1 namespace std{ using ::memchr; using ::memcmp; using ::memcpy; using ::memmove; using ::memset; using ::strcat; using ::strchr; using ::strcmp; using ::strcoll; using ::strcpy; using ::strcspn; using ::strerror; using ::strlen; using ::strncat; using ::strncmp; using ::strncpy; using ::strpbrk; using ::strrchr; using ::strspn; using ::strstr; using ::strtok; using ::strxfrm; #ifndef __CORRECT_ISO_CPP_STRING_H_PROTO //Extra definitions required in c++ spec inline void* memchr(void* s, int c, size_t n){ return memchr(const_cast(s), c, n); } inline char* strchr(char* s, int c){ return strchr(const_cast(s), c); } inline char* strpbrk(char* s1, const char* s2){ return strpbrk(const_cast(s1), s2); } inline char* strrchr(char* s, int c){ return strrchr(const_cast(s), c); } inline char* strstr(char* s1, const char* s2){ return strstr(const_cast(s1), s2); } #endif } #endif ================================================ FILE: external/arduino/stlarduino/ctime ================================================ // -*- C++ -*- forwarding header. // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 2, or (at your option) // any later version. // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License along // with this library; see the file COPYING. If not, write to the Free // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, // USA. // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // ISO C++ 14882: 20.5 Date and time // /** @file ctime * This is a Standard C++ Library file. You should @c #include this file * in your programs, rather than any of the "*.h" implementation files. * * This is the C++ version of the Standard C Library header @c time.h, * and its contents are (mostly) the same as that header, but are all * contained in the namespace @c std. */ #ifndef _CPP_CTIME #define _CPP_CTIME 1 #pragma GCC system_header #include #include // Get rid of those macros defined in in lieu of real functions. #undef clock #undef difftime #undef mktime #undef time #undef asctime #undef ctime #undef gmtime #undef localtime #undef strftime namespace std { using ::clock_t; using ::time_t; using ::tm; using ::clock; using ::difftime; using ::mktime; using ::time; using ::asctime; using ::ctime; using ::gmtime; using ::localtime; using ::strftime; } #endif ================================================ FILE: external/arduino/stlarduino/cwchar ================================================ /* Copyright (C) 2006 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation version 2.1 This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #ifndef __HEADER_CWCHAR #define __HEADER_CWCHAR 1 namespace std{ using ::mbstate_t; using ::wint_t; using ::btowc; using ::fgetwc; using ::fgetws; using ::fputwc; using ::fputws; using ::fwide; using ::fwprintf; using ::fwscanf; using ::getwc; using ::getwchar; using ::mbrlen; using ::mbrtowc; using ::mbsinit; using ::mbsrtowcs; using ::putwc; using ::putwchar; using ::swprintf; using ::swscanf; using ::ungetwc; using ::vfwprintf; using ::vswprintf; using ::vwprintf; using ::wcrtomb; using ::wcscat; using ::wcschr; using ::wcscmp; using ::wcscoll; using ::wcscpy; using ::wcscspn; using ::wcsftime; using ::wcslen; using ::wcsncat; using ::wcsncmp; using ::wcsncpy; using ::wcspbrk; using ::wcsrchr; using ::wcsrtombs; using ::wcsspn; using ::wcsstr; using ::wcstod; using ::wcstok; using ::wcstol; using ::wcstoul; using ::wcsxfrm; using ::wctob; using ::wmemchr; using ::wmemcmp; using ::wmemcpy; using ::wmemmove; using ::wmemset; using ::wprintf; using ::wscanf; } #endif ================================================ FILE: external/arduino/stlarduino/cwctype ================================================ // -*- C++ -*- forwarding header. // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 2, or (at your option) // any later version. // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License along // with this library; see the file COPYING. If not, write to the Free // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, // USA. // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // ISO C++ 14882: // /** @file cwctype * This is a Standard C++ Library file. You should @c #include this file * in your programs, rather than any of the "*.h" implementation files. * * This is the C++ version of the Standard C Library header @c wctype.h, * and its contents are (mostly) the same as that header, but are all * contained in the namespace @c std. */ #ifndef _CPP_CWCTYPE #define _CPP_CWCTYPE 1 #pragma GCC system_header //#include #ifdef __UCLIBCXX_HAS_WCHAR__ #include #endif // Get rid of those macros defined in in lieu of real functions. #undef iswalnum #undef iswalpha #undef iswblank #undef iswcntrl #undef iswdigit #undef iswgraph #undef iswlower #undef iswprint #undef iswprint #undef iswpunct #undef iswspace #undef iswupper #undef iswxdigit #undef iswctype #undef towlower #undef towupper #undef towctrans #undef wctrans #undef wctype #if __UCLIBCXX_HAS_WCHAR__ namespace std { using ::wint_t; // cwchar using ::wctype_t; using ::wctrans_t; using ::iswalnum; using ::iswalpha; using ::iswblank; using ::iswcntrl; using ::iswdigit; using ::iswgraph; using ::iswlower; using ::iswprint; using ::iswprint; using ::iswpunct; using ::iswspace; using ::iswupper; using ::iswxdigit; using ::iswctype; using ::towlower; using ::towupper; using ::towctrans; using ::wctrans; using ::wctype; } #endif //__ULIBCXX_HAS_WCHAR__ #endif ================================================ FILE: external/arduino/stlarduino/del_op.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ // Arduino 1.0 contains an implementation for this. #if ARDUINO < 100 #include #include #include _UCXXEXPORT void operator delete(void* ptr) throw(){ free(ptr); } #endif ================================================ FILE: external/arduino/stlarduino/del_opnt.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #ifndef NO_NOTHROW _UCXXEXPORT void operator delete(void* ptr, const std::nothrow_t& ) throw() { free(ptr); } #endif ================================================ FILE: external/arduino/stlarduino/del_ops.cpp ================================================ /* Copyright (C) 2015 Bernhard Reutner-Fischer This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* C++14 sized deallocation */ #include #include #include _UCXXEXPORT void operator delete(void* ptr, std::size_t) throw(){ ::operator delete (ptr); } ================================================ FILE: external/arduino/stlarduino/del_opv.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ // Arduino 1.0 contains an implementation for this. #if ARDUINO < 100 #include #include #include _UCXXEXPORT void operator delete[](void * ptr) throw(){ free(ptr); } #endif ================================================ FILE: external/arduino/stlarduino/del_opvnt.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #ifndef NO_NOTHROW _UCXXEXPORT void operator delete[](void* ptr, const std::nothrow_t& ) throw(){ free(ptr); } #endif ================================================ FILE: external/arduino/stlarduino/del_opvs.cpp ================================================ /* Copyright (C) 2015 Bernhard Reutner-Fischer This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* C++14 sized deallocation */ #include #include #include _UCXXEXPORT void operator delete[](void * ptr, std::size_t) throw(){ ::operator delete[] (ptr); } ================================================ FILE: external/arduino/stlarduino/deque ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #pragma GCC visibility push(default) #ifndef __STD_HEADER_DEQUE #define __STD_HEADER_DEQUE namespace std{ template > class deque; template bool operator==(const deque& x, const deque& y); template bool operator< (const deque& x, const deque& y); template bool operator!=(const deque& x, const deque& y); template bool operator> (const deque& x, const deque& y); template bool operator>=(const deque& x, const deque& y); template bool operator<=(const deque& x, const deque& y); template void swap(deque& x, deque& y); template class _UCXXEXPORT deque { public: friend bool operator==<>(const deque& x, const deque& y); friend class deque_iter; friend class deque_citer; class deque_iter; class deque_citer; typedef typename Allocator::reference reference; typedef typename Allocator::const_reference const_reference; typedef deque_iter iterator; typedef deque_citer const_iterator; typedef typename Allocator::size_type size_type; typedef typename Allocator::difference_type difference_type; typedef T value_type; typedef Allocator allocator_type; typedef typename Allocator::pointer pointer; typedef typename Allocator::const_pointer const_pointer; typedef std::reverse_iterator reverse_iterator; typedef std::reverse_iterator const_reverse_iterator; explicit deque(const Allocator& al = Allocator()); explicit deque(size_type n, const T& value = T(), const Allocator& al = Allocator()); template deque(InputIterator first, InputIterator last, const Allocator& = Allocator()); deque(const deque& x); ~deque(); deque& operator=(const deque& x); template void assign(InputIterator first, InputIterator last); template void assign(Size n, const U& u = U()); allocator_type get_allocator() const; iterator begin(); const_iterator begin() const; iterator end(); const_iterator end() const; reverse_iterator rbegin(); const_reverse_iterator rbegin() const; reverse_iterator rend(); const_reverse_iterator rend() const; size_type size() const; size_type max_size() const; void resize(size_type sz, T c = T()); bool empty() const; reference operator[](size_type n); const_reference operator[](size_type n) const; reference at(size_type n); const_reference at(size_type n) const; reference front(); const_reference front() const; reference back(); const_reference back() const; void push_front(const T& x); void push_back(const T& x); iterator insert(iterator position, const T& x = T()); void insert(iterator position, size_type n, const T& x); template void insert (iterator position, InputIterator first, InputIterator last); void pop_front(); void pop_back(); iterator erase(iterator position); iterator erase(iterator first, iterator last); void swap(deque&); void clear(); protected: void reserve(size_type n); inline size_type array_element(size_type deque_element) const{ if(deque_element < (data_size - first_element)){ return first_element + deque_element; } return deque_element - (data_size - first_element); } inline size_type first_subtract(size_type sub_size) const{ if(sub_size > first_element){ return (data_size - first_element) - sub_size; } return first_element - sub_size; } T * data; size_type data_size; //Physical size of array size_type elements; //Elements in array size_type first_element; //Element number of array 0..n size_type last_element; //Element number of array 0..n Allocator a; }; template class _UCXXEXPORT deque::deque_iter : public std::iterator< random_access_iterator_tag, T, typename Allocator::difference_type, typename Allocator::pointer, typename Allocator::reference > { friend class deque; protected: deque * container; typename Allocator::size_type element; public: deque_iter() : container(0), element(0) { } deque_iter(const deque_iter & d) : container (d.container), element(d.element) { } deque_iter(deque * c, typename Allocator::size_type e) : container(c), element(e) { return; } ~deque_iter() { } deque_iter & operator=(const deque_iter & d){ container = d.container; element = d.element; return *this; } T & operator*(){ return container->data[container->array_element(element)]; } T * operator->(){ return container->data + container->array_element(element); } const T & operator*() const{ return container->data[container->array_element(element)]; } const T * operator->() const{ return container->data + container->array_element(element); } bool operator==(const deque_iter & d) const{ if(container == d.container && element == d.element){ return true; } return false; } bool operator==(const deque_citer & d) const{ if(container == d.container && element == d.element){ return true; } return false; } bool operator!=(const deque_iter & d) const{ if(container != d.container || element != d.element){ return true; } return false; } bool operator!=(const deque_citer & d) const{ if(container != d.container || element != d.element){ return true; } return false; } bool operator<(const deque_iter & d) const{ if(element < d.element){ return true; } return false; } bool operator<(const deque_citer & d) const{ if(element < d.element){ return true; } return false; } bool operator<=(const deque_iter & d) const{ if(element <= d.element){ return true; } return false; } bool operator<=(const deque_citer & d) const{ if(element <= d.element){ return true; } return false; } bool operator>(const deque_iter & d) const{ if(element > d.element){ return true; } return false; } bool operator>(const deque_citer & d) const{ if(element > d.element){ return true; } return false; } bool operator>=(const deque_iter & d) const{ if(element >= d.element){ return true; } return false; } bool operator>=(const deque_citer & d) const{ if(element >= d.element){ return true; } return false; } deque_iter & operator++(){ ++element; return *this; } deque_iter operator++(int){ deque_iter temp(container, element); ++element; return temp; } deque_iter operator+(typename Allocator::size_type n){ deque_iter temp(container, element + n); return temp; } deque_iter & operator+=(typename Allocator::size_type n){ element += n; return *this; } deque_iter & operator--(){ --element; return *this; } deque_iter operator--(int){ deque_iter temp(container, element); --element; return temp; } deque_iter operator-(typename Allocator::size_type n){ deque_iter temp(container, element - n); return temp; } deque_iter & operator-=(typename Allocator::size_type n){ element -= n; return *this; } typename Allocator::size_type operator-(const deque_iter & d){ return element - d.element; } }; template class _UCXXEXPORT deque::deque_citer : public std::iterator< random_access_iterator_tag, T, typename Allocator::difference_type, typename Allocator::const_pointer, typename Allocator::const_reference > { friend class deque; protected: const deque * container; typename Allocator::size_type element; public: deque_citer() : container(0), element(0) { } deque_citer(const deque_citer & d) : container (d.container), element(d.element) { } deque_citer(const deque_iter & d) : container (d.container), element(d.element) { } deque_citer(const deque * c, typename Allocator::size_type e) : container(c), element(e) { return; } ~deque_citer() { } deque_citer & operator=(const deque_iter & d){ container = d.container; element = d.element; return *this; } const T & operator*() const{ return container->data[container->array_element(element)]; } const T * operator->() const{ return container->data + container->array_element(element); } bool operator==(const deque_citer & d) const{ if(container == d.container && element == d.element){ return true; } return false; } bool operator==(const deque_iter & d) const{ if(container == d.container && element == d.element){ return true; } return false; } bool operator!=(const deque_citer & d) const{ if(container != d.container || element != d.element){ return true; } return false; } bool operator!=(const deque_iter & d) const{ if(container != d.container || element != d.element){ return true; } return false; } bool operator<(const deque_citer & d) const{ if(element < d.element){ return true; } return false; } bool operator<(const deque_iter & d) const{ if(element < d.element){ return true; } return false; } bool operator<=(const deque_citer & d) const{ if(element <= d.element){ return true; } return false; } bool operator<=(const deque_iter & d) const{ if(element <= d.element){ return true; } return false; } bool operator>(const deque_citer & d) const{ if(element > d.element){ return true; } return false; } bool operator>(const deque_iter & d) const{ if(element > d.element){ return true; } return false; } bool operator>=(const deque_citer & d){ if(element >= d.element){ return true; } return false; } bool operator>=(const deque_iter & d){ if(element >= d.element){ return true; } return false; } deque_citer & operator++(){ ++element; return *this; } deque_citer operator++(int){ deque_citer temp(container, element); ++element; return temp; } deque_citer operator+(typename Allocator::size_type n){ deque_citer temp(container, element + n); return temp; } deque_citer & operator+=(typename Allocator::size_type n){ element += n; return *this; } deque_citer & operator--(){ --element; return *this; } deque_citer operator--(int){ deque_citer temp(container, element); --element; return temp; } deque_citer operator-(typename Allocator::size_type n){ deque_citer temp(container, element - n); return temp; } deque_citer & operator-=(typename Allocator::size_type n){ element -= n; return *this; } typename Allocator::size_type operator-(const deque_citer & d){ return element - d.element; } }; template deque::deque(const Allocator& al) : data(0), data_size(0), elements(0), first_element(0), last_element(0), a(al) { data_size = __UCLIBCXX_STL_BUFFER_SIZE__; data = a.allocate(data_size); first_element = data_size /2; last_element = first_element; } template deque::deque( size_type n, const T& value, const Allocator& al) : data(0), elements(n), first_element(0), last_element(0), a(al) { data_size = elements + __UCLIBCXX_STL_BUFFER_SIZE__; data = a.allocate(data_size); first_element = (data_size - elements) / 2; last_element = first_element; for(n=first_element ; n < last_element; ++n ){ a.construct(data+n, value); } } template template deque::deque(InputIterator first, InputIterator last, const Allocator& al) : data(0), data_size(0), elements(0), first_element(0), last_element(0), a(al) { data_size = __UCLIBCXX_STL_BUFFER_SIZE__; data = a.allocate(data_size); first_element = data_size / 4; //Note sure how big, but let's add a little space... last_element = first_element; while(first != last){ push_back(*first); ++first; } } template deque::deque(const deque& x) : data(0), elements(0), first_element(0), last_element(0), a(x.a) { data_size = x.elements + __UCLIBCXX_STL_BUFFER_SIZE__; data = a.allocate(data_size); first_element = (data_size - x.elements) / 2; last_element = first_element; for(size_type i=0; i < x.elements; ++i){ push_back(x[i]); } } template deque::~deque(){ clear(); a.deallocate(data, data_size); } template deque& deque:: operator=(const deque& x) { if(&x == this){ return *this; } resize(x.elements); for(size_t i = 0; i < elements; ++i){ data[array_element(i)] = x[i]; } return *this; } template template void deque::assign(InputIterator first, InputIterator last) { clear(); while(first !=last){ push_back(*first); ++first; } } template template void deque::assign(Size n, const U& u) { if(&u == this){ return; } clear(); for(size_type i = 0; i < n; ++i){ push_back(u); } } template typename deque::allocator_type deque::get_allocator() const { return a; } template typename deque::iterator deque::begin() { return deque_iter(this, 0); } template typename deque::const_iterator deque::begin() const { return deque_citer(this, 0); } template typename deque::iterator deque::end() { return deque_iter(this, elements); } template typename deque::const_iterator deque::end() const { return deque_citer(this, elements); } template typename deque::reverse_iterator deque::rbegin() { return reverse_iterator(end()); } template typename deque::const_reverse_iterator deque::rbegin() const { return const_reverse_iterator(end()); } template typename deque::reverse_iterator deque::rend() { return reverse_iterator(begin()); } template typename deque::const_reverse_iterator deque::rend() const { return const_reverse_iterator(begin()); } template typename deque::size_type deque::size() const { return elements; } template typename deque::size_type deque::max_size() const { return ((size_type)(-1)) / sizeof(T); } template void deque::resize(size_type sz, T c){ reserve(sz); while(sz > size()){ push_back(c); } while(sz < size()){ pop_back(); } } template bool deque::empty() const{ return (elements == 0); } template typename deque::reference deque::operator[](size_type n) { return data[array_element(n)]; } template typename deque::const_reference deque::operator[](size_type n) const { return data[array_element(n)]; } template typename deque::reference deque::at(size_type n) { if(n > elements){ __throw_out_of_range("Out of deque range"); } return data[array_element(n)]; } template typename deque::const_reference deque::at(size_type n) const { if(n > elements){ __throw_out_of_range("Out of deque range"); } return data[array_element(n)]; } template typename deque::reference deque::front() { return data[first_element]; } template typename deque::const_reference deque::front() const { return data[first_element]; } template typename deque::reference deque::back() { return data[array_element(elements-1)]; } template typename deque::const_reference deque::back() const { return data[array_element(elements-1)]; } template void deque::push_front(const T& x){ reserve(elements + 1); first_element = first_subtract(1); a.construct(data + first_element, x); ++elements; } template void deque::push_back(const T& x){ reserve(elements + 1); a.construct(data + last_element, x); ++elements; last_element = array_element(elements); } template typename deque::iterator deque::insert(iterator position, const T& x) { reserve(elements+1); if(position.element > (elements/2)){ //Push all elements back 1 push_back(x); for(size_type i = elements-1; i > position.element; --i){ at(i) = at(i-1); } }else{ //Push all elements forward 1 push_front(x); for(size_type i = 0; i < position.element; ++i){ at(i) = at(i+1); } } at(position.element) = x; return deque_iter(this, position.element); } template void deque:: insert(typename deque::iterator position, size_type n, const T& x) { reserve(elements + n); for(size_t i =0; i < n; ++i){ position = insert(position, x); } } template template void deque::insert (iterator position, InputIterator first, InputIterator last) { while(first != last){ position = insert(position, *first); ++first; } } template void deque::pop_front(){ if(elements == 0){ __throw_out_of_range("deque pop_front"); } a.destroy(data + first_element); first_element = array_element(1); --elements; } template void deque::pop_back(){ last_element = array_element(elements - 1); a.destroy(data + last_element); --elements; } template typename deque::iterator deque::erase(typename deque::iterator position) { if(position.element > (elements /2)){ for(size_type i = position.element; i < elements - 1; ++i){ at(i) = at(i+1); } pop_back(); }else{ for(size_type i = position.element; i > 0; --i){ at(i) = at(i-1); } pop_front(); } return deque_iter(this, position.element); } template typename deque::iterator deque:: erase(typename deque::iterator first, typename deque::iterator last) { //Shift backwards size_type num_move = last.element - first.element; if( first.element > (elements - last.element) ){ for(size_type i = last.element; i < elements ; ++i){ at(i-num_move) = at(i); } for(size_type i = 0; i < num_move ; ++i){ pop_back(); } }else{ for(size_type i = 0; i < first.element ; ++i){ at(last.element - i - 1) = at(first.element - i - 1); } for(size_type i = 0; i < num_move ; ++i){ pop_front(); } } return deque_iter(this, first.element); } template void deque::swap(deque& x) { T * temp_data; typename deque::size_type temp_size; //Swap data pointers temp_data = x.data; x.data = data; data = temp_data; //Swap array sizes temp_size = x.data_size; x.data_size = data_size; data_size = temp_size; //Swap num array elements temp_size = x.elements; x.elements = elements; elements = temp_size; //Swap first_pointer temp_size = x.first_element; x.first_element = first_element; first_element = temp_size; //Swap last_pointer temp_size = x.last_element; x.last_element = last_element; last_element = temp_size; } template void deque::clear() { while(elements > 0 ){ pop_back(); } } template void deque::reserve(typename deque::size_type n) { if(data_size >= n){ return; } size_type size_temp; size_type first_temp; T * data_temp; size_temp = n + __UCLIBCXX_STL_BUFFER_SIZE__; //Reserve extra 'cause we can data_temp = a.allocate(size_temp); first_temp = (size_temp - elements) / 2; for(size_type i = 0; i < elements; ++i){ a.construct(data_temp + first_temp + i, data[array_element(i)]); a.destroy(data + array_element(i)); } //Now shuffle pointers a.deallocate(data, data_size); data = data_temp; data_size = size_temp; first_element = first_temp; last_element = first_element + elements; } template _UCXXEXPORT bool operator==(const deque& x, const deque& y) { if(x.elements != y.elements){ return false; } for(typename deque::size_type i = 0; i < x.elements; ++i){ if(x[i] < y[i] || y[i] < x[i]){ return false; } } return true; } template bool operator< (const deque& x, const deque& y); template _UCXXEXPORT bool operator!=(const deque& x, const deque& y) { if(x == y){ return false; } return true; } template bool operator> (const deque& x, const deque& y); template bool operator>=(const deque& x, const deque& y); template bool operator<=(const deque& x, const deque& y); template _UCXXEXPORT void swap(deque& x, deque& y){ x.swap(y); } } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/deque.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include namespace std{ } ================================================ FILE: external/arduino/stlarduino/eh_alloc.cpp ================================================ /* Copyright (C) 2006 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 2.1 of the License. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include //This is a system-specific header which does all of the error-handling management #include namespace __cxxabiv1 { extern "C" void * __cxa_allocate_exception(std::size_t thrown_size) throw(){ void *e; // The sizeof crap is required by Itanium ABI because we need to // provide space for accounting information which is implementation // (gcc) defined. e = malloc (thrown_size + sizeof(__cxa_refcounted_exception)); if (0 == e){ std::terminate(); } memset (e, 0, sizeof(__cxa_refcounted_exception)); return (void *)((unsigned char *)e + sizeof(__cxa_refcounted_exception)); } extern "C" void __cxa_free_exception(void *vptr) throw(){ free( (char *)(vptr) - sizeof(__cxa_refcounted_exception) ); } extern "C" __cxa_dependent_exception * __cxa_allocate_dependent_exception() throw(){ __cxa_dependent_exception *retval; // The sizeof crap is required by Itanium ABI because we need to // provide space for accounting information which is implementation // (gcc) defined. retval = static_cast<__cxa_dependent_exception*>(malloc (sizeof(__cxa_dependent_exception))); if (0 == retval){ std::terminate(); } memset (retval, 0, sizeof(__cxa_dependent_exception)); return retval; } extern "C" void __cxa_free_dependent_exception(__cxa_dependent_exception *vptr) throw(){ free( (char *)(vptr) ); } } /* namespace __cxxabiv1 */ ================================================ FILE: external/arduino/stlarduino/eh_globals.cpp ================================================ /* Copyright (C) 2006 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 2.1 of the License. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include //This is a system-specific header which does all of the error-handling management #include //The following functionality is derived from reading of the GNU libstdc++ code and making it...simple namespace __cxxabiv1{ static __UCLIBCXX_TLS __cxa_eh_globals eh_globals; extern "C" __cxa_eh_globals* __cxa_get_globals() throw(){ return &eh_globals; } extern "C" __cxa_eh_globals* __cxa_get_globals_fast() throw(){ return &eh_globals; } } ================================================ FILE: external/arduino/stlarduino/exception ================================================ // Exception Handling support header for -*- C++ -*- // Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001, 2002 // Free Software Foundation // // This file is part of GNU CC. // // GNU CC is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2, or (at your option) // any later version. // // GNU CC is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with GNU CC; see the file COPYING. If not, write to // the Free Software Foundation, 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. /** @file exception * This header defines several types and functions relating to the * handling of exceptions in a C++ program. */ #ifndef __EXCEPTION__ #define __EXCEPTION__ #include extern "C++" { namespace std { /** * @brief Base class for all library exceptions. * * This is the base class for all exceptions thrown by the standard * library, and by certain language expressions. You are free to derive * your own %exception classes, or use a different hierarchy, or to * throw non-class data (e.g., fundamental types). */ class exception { public: exception() throw() { } virtual ~exception() throw(); /** Returns a C-style character string describing the general cause * of the current error. */ virtual const char* what() const throw(); }; /** If an %exception is thrown which is not listed in a function's * %exception specification, one of these may be thrown. */ class bad_exception : public exception { public: bad_exception() throw() { } // This declaration is not useless: // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118 virtual ~bad_exception() throw(); }; /// If you write a replacement %terminate handler, it must be of this type. typedef void (*terminate_handler) (); /// If you write a replacement %unexpected handler, it must be of this type. typedef void (*unexpected_handler) (); /// Takes a new handler function as an argument, returns the old function. terminate_handler set_terminate(terminate_handler) throw(); /** The runtime will call this function if %exception handling must be * abandoned for any reason. */ void terminate() __UCLIBCXX_NORETURN; /// Takes a new handler function as an argument, returns the old function. unexpected_handler set_unexpected(unexpected_handler) throw(); /** The runtime will call this function if an %exception is thrown which * violates the function's %exception specification. */ void unexpected() __UCLIBCXX_NORETURN; /** [18.6.4]/1: "Returns true after completing evaluation of a * throw-expression until either completing initialization of the * exception-declaration in the matching handler or entering @c unexpected() * due to the throw; or after entering @c terminate() for any reason * other than an explicit call to @c terminate(). [Note: This includes * stack unwinding [15.2]. end note]" * * 2: "When @c uncaught_exception() is true, throwing an %exception can * result in a call of @c terminate() (15.5.1)." */ bool uncaught_exception() throw(); } // namespace std namespace __gnu_cxx { /** A replacement for the standard terminate_handler which prints more information about the terminating exception (if any) on stderr. Call @code std::set_terminate (__gnu_cxx::__verbose_terminate_handler) @endcode to use. For more info, see http://gcc.gnu.org/onlinedocs/libstdc++/19_diagnostics/howto.html#4 */ void __verbose_terminate_handler (); } // namespace __gnu_cxx } // extern "C++" #endif ================================================ FILE: external/arduino/stlarduino/exception.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include //We can't do this yet because gcc is too stupid to be able to handle //different implementations of exception class. #undef __UCLIBCXX_EXCEPTION_SUPPORT__ #ifdef __UCLIBCXX_EXCEPTION_SUPPORT__ namespace std{ _UCXXEXPORT static char * __std_exception_what_value = "exception"; //We are providing our own versions to be sneaky _UCXXEXPORT exception::~exception() throw(){ //Empty function } _UCXXEXPORT const char* exception::what() const throw(){ return __std_exception_what_value; } _UCXXEXPORT bad_exception::~bad_exception() throw(){ } } #endif ================================================ FILE: external/arduino/stlarduino/func_exception ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #ifndef HEADER_IMPLEMENTATION_FUNC_EXCEPTION #define HEADER_IMPLEMENTATION_FUNC_EXCEPTION #pragma GCC visibility push(default) namespace std{ _UCXXEXPORT void __throw_bad_alloc(); _UCXXEXPORT void __throw_out_of_range(const char * message = 0); _UCXXEXPORT void __throw_overflow_error(const char * message = 0); _UCXXEXPORT void __throw_length_error(const char * message = 0); _UCXXEXPORT void __throw_invalid_argument(const char * message = 0); } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/func_exception.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include namespace std{ #ifdef __UCLIBCXX_EXCEPTION_SUPPORT__ _UCXXEXPORT void __throw_bad_alloc(){ throw bad_alloc(); } _UCXXEXPORT void __throw_out_of_range( const char * message){ if(message == 0){ throw out_of_range(); } throw out_of_range(message); } _UCXXEXPORT void __throw_overflow_error( const char * message){ if(message == 0){ throw overflow_error(); } throw overflow_error(message); } _UCXXEXPORT void __throw_length_error(const char * message){ if(message == 0){ throw length_error(); } throw length_error(message); } _UCXXEXPORT void __throw_invalid_argument(const char * message){ if(message == 0){ throw invalid_argument(); } throw invalid_argument(message); } #else _UCXXEXPORT void __throw_bad_alloc(){ abort(); } _UCXXEXPORT void __throw_out_of_range( const char * ){ abort(); } _UCXXEXPORT void __throw_overflow_error( const char * ){ abort(); } _UCXXEXPORT void __throw_length_error(const char * ){ abort(); } _UCXXEXPORT void __throw_invalid_argument(const char *){ abort(); } #endif } ================================================ FILE: external/arduino/stlarduino/functional ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef __STD_HEADER_FUNCTIONAL #define __STD_HEADER_FUNCTIONAL 1 #include #pragma GCC visibility push(default) namespace std{ template struct unary_function; template struct binary_function; template struct plus; template struct minus; template struct multiplies; template struct divides; template struct modulus; template struct negate; template struct equal_to; template struct not_equal_to; template struct greater; template struct less; template struct greater_equal; template struct less_equal; template struct logical_and; template struct logical_or; template struct logical_not; template struct unary_negate; template unary_negate not1(const Predicate&); template struct binary_negate; template binary_negate not2(const Predicate&); template class binder1st; template binder1st bind1st(const Operation&, const T&); template class binder2nd; template binder2nd bind2nd(const Operation&, const T&); template class pointer_to_unary_function; template pointer_to_unary_function ptr_fun(Result (*)(Arg)); template class pointer_to_binary_function; template pointer_to_binary_function ptr_fun(Result (*)(Arg1,Arg2)); template class mem_fun_t; template class mem_fun1_t; template class const_mem_fun_t; template class const_mem_fun1_t; template mem_fun_t mem_fun(S (T::*f)()); template mem_fun1_t mem_fun(S (T::*f)(A)); template class mem_fun_ref_t; template class mem_fun1_ref_t; template mem_fun_ref_t mem_fun_ref(S (T::*f)()); template mem_fun1_ref_t mem_fun1_ref(S (T::*f)(A)); //Implementation template struct _UCXXEXPORT unary_function{ typedef Arg argument_type; typedef Result result_type; }; template struct _UCXXEXPORT binary_function{ typedef Arg1 first_argument_type; typedef Arg2 second_argument_type; typedef Result result_type; }; template struct _UCXXEXPORT plus : binary_function{ T operator()(const T& x, const T& y) const{ return x + y; } }; template struct _UCXXEXPORT minus : binary_function{ T operator()(const T& x, const T& y) const{ return x - y; } }; template struct _UCXXEXPORT multiplies : binary_function{ T operator()(const T& x, const T& y) const{ return x * y; } }; template struct _UCXXEXPORT divides : binary_function{ T operator()(const T& x, const T& y) const{ return x / y; } }; template struct _UCXXEXPORT modulus : binary_function{ T operator()(const T& x, const T& y) const{ return x % y; } }; template struct _UCXXEXPORT negate : unary_function{ T operator()(const T& x) const{ return -x; } }; template struct _UCXXEXPORT equal_to : binary_function{ bool operator()(const T& x, const T& y) const{ return (x == y); } }; template struct _UCXXEXPORT not_equal_to : binary_function{ bool operator()(const T& x, const T& y) const{ return (x != y); } }; template struct _UCXXEXPORT greater : binary_function{ bool operator()(const T& x, const T& y) const{ return (x > y); } }; template struct _UCXXEXPORT less : binary_function{ bool operator()(const T& x, const T& y) const{ return (x < y); } }; template struct _UCXXEXPORT greater_equal : binary_function{ bool operator()(const T& x, const T& y) const{ return (x >= y); } }; template struct _UCXXEXPORT less_equal : binary_function{ bool operator()(const T& x, const T& y) const{ return (x <= y); } }; template struct _UCXXEXPORT logical_and : binary_function { bool operator()(const T& x, const T& y) const{ return (x && y); } }; template struct _UCXXEXPORT logical_or : binary_function { bool operator()(const T& x, const T& y) const{ return (x || y); } }; template struct _UCXXEXPORT logical_not : unary_function { bool operator()(const T& x) const{ return !x; } }; template class _UCXXEXPORT unary_negate : public unary_function { public: explicit unary_negate(const Predicate& pred) : p(pred) { } bool operator()(const typename Predicate::argument_type& x) const{ return !p(x); } private: Predicate p; }; template _UCXXEXPORT unary_negate not1(const Predicate& pred){ return unary_negate(pred); } template class _UCXXEXPORT binary_negate : public binary_function { public: explicit binary_negate(const Predicate& pred) : p(pred) { } bool operator()(const typename Predicate::first_argument_type& x, const typename Predicate::second_argument_type& y) const { return !p(x, y); } private: Predicate p; }; template _UCXXEXPORT binary_negate not2(const Predicate& pred){ return binary_negate(pred); } template class _UCXXEXPORT binder1st : public unary_function { protected: Operation op; typename Operation::first_argument_type value; public: binder1st(const Operation& x, const typename Operation::first_argument_type& y) : op(x), value(y){ } typename Operation::result_type operator()(const typename Operation::second_argument_type& x) const{ return op(value,x); } }; template _UCXXEXPORT binder1st bind1st(const Operation& op, const T& x){ return binder1st(op, typename Operation::first_argument_type(x)); } template class _UCXXEXPORT binder2nd : public unary_function { protected: Operation op; typename Operation::second_argument_type value; public: binder2nd(const Operation& x, const typename Operation::second_argument_type& y) : op(x), value(y) { } typename Operation::result_type operator()(const typename Operation::first_argument_type& x) const{ return op(x,value); } }; template _UCXXEXPORT binder2nd bind2nd(const Operation& op, const T& x) { return binder2nd(op, typename Operation::second_argument_type(x)); } template class _UCXXEXPORT pointer_to_unary_function : public unary_function { protected: Result (*func)(Arg); public: explicit pointer_to_unary_function(Result (*f)(Arg)) : func(f) { } Result operator()(Arg x) const{ return func(x); } }; template _UCXXEXPORT pointer_to_unary_function ptr_fun(Result (*f)(Arg)){ return pointer_to_unary_function(f); } template class _UCXXEXPORT pointer_to_binary_function : public binary_function { protected: Result (*func)(Arg1, Arg2); public: explicit pointer_to_binary_function(Result (*f)(Arg1, Arg2)) : func(f) { } Result operator()(Arg1 x, Arg2 y) const{ return func(x, y); } }; template _UCXXEXPORT pointer_to_binary_function ptr_fun(Result (*f)(Arg1, Arg2)) { return pointer_to_binary_function(f); } template class _UCXXEXPORT mem_fun_t : public unary_function { public: explicit mem_fun_t(S (T::*p)()) : m(p) { } S operator()(T* p) const { return (p->*m)(); } private: S (T::*m)(); }; template class _UCXXEXPORT mem_fun1_t : public binary_function { public: explicit mem_fun1_t(S (T::*p)(A)) : m(p) { } S operator()(T* p, A x) const { return (p->*m)(x); } private: S (T::*m)(A); }; template class _UCXXEXPORT const_mem_fun_t : public unary_function { public: explicit const_mem_fun_t(S (T::*p)() const) : m(p) { } S operator()(const T* p) const { return (p->*m)(); } private: S (T::*m)() const; }; template class _UCXXEXPORT const_mem_fun1_t : public binary_function { public: explicit const_mem_fun1_t(S (T::*p)(A) const) : m(p) { } S operator()(const T* p, A x) const { return (p->*m)(x); } private: S (T::*m)(A) const; }; template _UCXXEXPORT mem_fun_t mem_fun(S (T::*f)()){ return mem_fun_t(f); } template _UCXXEXPORT const_mem_fun_t mem_fun(S (T::*f)() const){ return const_mem_fun_t(f); } template _UCXXEXPORT mem_fun1_t mem_fun(S (T::*f)(A)){ return mem_fun1_t(f); } template _UCXXEXPORT const_mem_fun1_t mem_fun(S (T::*f)(A) const){ return const_mem_fun1_t(f); } template class _UCXXEXPORT mem_fun_ref_t : public unary_function { public: explicit mem_fun_ref_t(S (T::*p)()) : mf(p) { } S operator()(T& p) { return (p.*mf)(); } private: S (T::*mf)(); }; template class _UCXXEXPORT mem_fun1_ref_t : public binary_function { public: explicit mem_fun1_ref_t(S (T::*p)(A)) : mf(p) { } S operator()(T& p, A x) { return (p.*mf)(x); } private: S (T::*mf)(A); }; template _UCXXEXPORT mem_fun_ref_t mem_fun_ref(S (T::*f)()){ return mem_fun_ref_t(f); } template _UCXXEXPORT mem_fun1_ref_t mem_fun1_ref(S (T::*f)(A)){ return mem_fun1_ref_t(f); } } //These are SGI extensions which are checked for by some conformance checks. They // are *NOT* part of the C++ standard, however template class _UCXXEXPORT unary_compose : public std::unary_function { protected: Op1 mf1; Op2 mf2; public: unary_compose(const Op1& x, const Op2& y) : mf1(x), mf2(y) { } typename Op1::result_type operator()(const typename Op2::argument_type& x) const { return mf1(mf2(x)); } }; template _UCXXEXPORT inline unary_compose compose1(const Op1& fn1, const Op2& fn2){ return unary_compose(fn1, fn2); } template class _UCXXEXPORT binary_compose : public std::unary_function { protected: Op1 mf1; Op2 mf2; Op3 mf3; public: binary_compose(const Op1 & x, const Op2 & y, const Op3 & z) : mf1(x), mf2(y), mf3(z){ } typename Op1::result_type operator()(const typename Op2::argument_type & x) const { return mf1(mf2(x), mf3(x)); } }; template inline _UCXXEXPORT binary_compose compose2(const Op1 & fn1, const Op2 & fn2, const Op3 & fn3){ return binary_compose(fn1, fn2, fn3); } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/initializer_list ================================================ /* Copyright (C) 2016 Michael Matera This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef __STD_HEADER_INITIALIZER_LIST #define __STD_HEADER_INITIALIZER_LIST #pragma GCC visibility push(default) namespace std { template class initializer_list { private: const T* array; size_t len; // Initialize from a { ... } construct initializer_list(const T *a, size_t l): array(a), len(l) { } public: // default constructor initializer_list() : array(NULL), len(0) {} size_t size() const { return len; } const T *begin() { return array; } const T *end() { return array + len; } }; } #endif ================================================ FILE: external/arduino/stlarduino/iomanip ================================================ /* Copyright (C) 2005 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #ifndef __STD_IOMANIP #define __STD_IOMANIP 1 #pragma GCC visibility push(default) namespace std{ // These are the helper classes which we are going to be using to // hold the required data class _UCXXEXPORT __resetiosflags{ public: ios_base::fmtflags m; _UCXXEXPORT __resetiosflags(ios_base::fmtflags mask) : m(mask){ } }; class _UCXXEXPORT __setiosflags{ public: ios_base::fmtflags m; _UCXXEXPORT __setiosflags(ios_base::fmtflags mask) : m(mask){ } }; class _UCXXEXPORT __setbase{ public: int base; _UCXXEXPORT __setbase(int b) : base(b){ } }; class _UCXXEXPORT __setfill{ public: int character; _UCXXEXPORT __setfill(int c): character(c){ } }; class _UCXXEXPORT __setprecision{ public: int digits; _UCXXEXPORT __setprecision(int n): digits(n) { } }; class _UCXXEXPORT __setw{ public: int width; _UCXXEXPORT __setw(int n): width(n) { } }; //Actual manipulator functions inline __resetiosflags resetiosflags(ios_base::fmtflags mask){ return __resetiosflags(mask); } inline __setiosflags setiosflags(ios_base::fmtflags mask){ return __setiosflags(mask); } inline __setbase setbase(int b){ return __setbase(b); } inline __setfill setfill(int c){ return __setfill(c); } inline __setprecision setprecision(int n){ return __setprecision(n); } inline __setw setw(int n){ return __setw(n); } //How to handle interaction with [i|o]stream classes template _UCXXEXPORT basic_ostream& operator<<(basic_ostream& os, const __resetiosflags s) { os.setf(ios_base::fmtflags(0),s.m); return os; } template _UCXXEXPORT basic_istream& operator>>(basic_istream& is, const __resetiosflags s) { is.setf(ios_base::fmtflags(0),s.m); return is; } template _UCXXEXPORT basic_ostream& operator<<(basic_ostream& os, const __setiosflags s) { os.setf(s.m); return os; } template _UCXXEXPORT basic_ostream& operator<<(basic_ostream& os, const __setbase s) { ios_base::fmtflags f(0); switch(s.base){ case 8: f = ios_base::oct; break; case 10: f = ios_base::dec; break; case 16: f = ios_base::hex; break; default: break; } os.setf(f, ios_base::basefield); return os; } template _UCXXEXPORT basic_ostream& operator<<(basic_ostream& os, const __setfill s) { os.fill(s.character); return os; } template _UCXXEXPORT basic_ostream& operator<<(basic_ostream& os, const __setprecision s) { os.precision(s.digits); return os; } template _UCXXEXPORT basic_ostream& operator<<(basic_ostream& os, const __setw s) { os.width(s.width); return os; } } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/iomanip.cpp ================================================ /* Copyright (C) 2005 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include namespace std{ } ================================================ FILE: external/arduino/stlarduino/ios ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #ifndef __HEADER_STD_IOS #define __HEADER_STD_IOS 1 #pragma GCC visibility push(default) namespace std{ typedef signed long int streamoff; template class fpos; class _UCXXEXPORT ios_base { public: class failure; #ifdef __UCLIBCXX_EXCEPTION_SUPPORT__ class failure : public exception { public: explicit failure(const std::string&) { } explicit failure() { } virtual const char* what() const throw() { return "std::ios_base failure exception"; } }; #endif #ifdef __UCLIBCXX_SUPPORT_CDIR__ class _UCXXLOCAL Init{ public: _UCXXEXPORT Init(); _UCXXEXPORT ~Init(); private: static int init_cnt; }; #endif public: typedef unsigned short int fmtflags; static const fmtflags skipws = 0x0001; static const fmtflags left = 0x0002; static const fmtflags right = 0x0004; static const fmtflags internal = 0x0008; static const fmtflags boolalpha = 0x0010; static const fmtflags dec = 0x0020; static const fmtflags oct = 0x0040; static const fmtflags hex = 0x0080; static const fmtflags scientific = 0x0100; static const fmtflags fixed = 0x0200; static const fmtflags showbase = 0x0400; static const fmtflags showpoint = 0x0800; static const fmtflags showpos = 0x1000; static const fmtflags uppercase = 0x2000; static const fmtflags adjustfield = left | right | internal; static const fmtflags basefield = dec | oct | hex; static const fmtflags floatfield = fixed | scientific; static const fmtflags unitbuf = 0x4000; typedef unsigned char iostate; static const iostate goodbit = 0x00; static const iostate badbit = 0x01; static const iostate eofbit = 0x02; static const iostate failbit = 0x04; typedef unsigned char openmode; static const openmode app = 0x01; static const openmode ate = 0x02; static const openmode binary = 0x04; static const openmode in = 0x08; static const openmode out = 0x10; static const openmode trunc = 0x20; typedef unsigned char seekdir; static const seekdir beg = 0x01; static const seekdir cur = 0x02; static const seekdir end = 0x04; _UCXXEXPORT fmtflags flags() const{ return mformat; } _UCXXEXPORT fmtflags flags(fmtflags fmtfl); fmtflags setf(fmtflags fmtfl); fmtflags setf(fmtflags fmtfl, fmtflags mask ); _UCXXEXPORT void unsetf(fmtflags mask){ mformat&= ~mask; } _UCXXEXPORT streamsize precision() const{ return mprecision; } _UCXXEXPORT streamsize precision(streamsize prec); _UCXXEXPORT streamsize width() const{ return mwidth; } _UCXXEXPORT streamsize width(streamsize wide); _UCXXEXPORT locale imbue(const locale& loc); _UCXXEXPORT locale getloc() const{ return mLocale; } // FIXME - These need to be implemented // static int xalloc(); // long& iword(int index); // void*& pword(int index); _UCXXEXPORT ~ios_base() { } enum event { erase_event, imbue_event, copyfmt_event }; typedef void (*event_callback)(event, ios_base&, int index); // void register_callback(event_call_back fn, int index); //We are going to wrap stdio so we don't need implementation of the following: inline static bool sync_with_stdio(bool = true) { return true; } protected: _UCXXEXPORT ios_base() : mLocale(), mformat(dec | skipws ), mstate(goodbit), mmode(), mdir(), mprecision(6), mwidth(0) #ifdef __UCLIBCXX_SUPPORT_CDIR__ ,mInit() #endif { } locale mLocale; fmtflags mformat; iostate mstate; openmode mmode; seekdir mdir; streamsize mprecision; streamsize mwidth; #ifdef __UCLIBCXX_SUPPORT_CDIR__ Init mInit; #endif }; //ios_base manipulators inline ios_base& boolalpha (ios_base& str){ str.setf(ios_base::boolalpha); return str; } inline ios_base& noboolalpha(ios_base& str){ str.unsetf(ios_base::boolalpha); return str; } inline ios_base& showbase (ios_base& str){ str.setf(ios_base::showbase); return str; } inline ios_base& noshowbase (ios_base& str){ str.unsetf(ios_base::showbase); return str; } inline ios_base& showpoint (ios_base& str){ str.setf(ios_base::showpoint); return str; } inline ios_base& noshowpoint(ios_base& str){ str.unsetf(ios_base::showpoint); return str; } inline ios_base& showpos (ios_base& str){ str.setf(ios_base::showpos); return str; } inline ios_base& noshowpos (ios_base& str){ str.unsetf(ios_base::showpos); return str; } inline ios_base& skipws (ios_base& str){ str.setf(ios_base::skipws); return str; } inline ios_base& noskipws (ios_base& str){ str.unsetf(ios_base::skipws); return str; } inline ios_base& uppercase (ios_base& str){ str.setf(ios_base::uppercase); return str; } inline ios_base& nouppercase(ios_base& str){ str.unsetf(ios_base::uppercase); return str; } inline ios_base& unitbuf (ios_base& str){ str.setf(ios_base::unitbuf); return str; } inline ios_base& nounitbuf (ios_base& str){ str.unsetf(ios_base::unitbuf); return str; } inline ios_base& internal (ios_base& str){ str.setf(ios_base::internal, ios_base::adjustfield); return str; } inline ios_base& left (ios_base& str){ str.setf(ios_base::left, ios_base::adjustfield); return str; } inline ios_base& right (ios_base& str){ str.setf(ios_base::right, ios_base::adjustfield); return str; } inline ios_base& dec (ios_base& str){ str.setf(ios_base::dec, ios_base::basefield); return str; } inline ios_base& hex (ios_base& str){ str.setf(ios_base::hex, ios_base::basefield); return str; } inline ios_base& oct (ios_base& str){ str.setf(ios_base::oct, ios_base::basefield); return str; } inline ios_base& fixed (ios_base& str){ str.setf(ios_base::fixed, ios_base::floatfield); return str; } inline ios_base& scientific (ios_base& str){ str.setf(ios_base::scientific, ios_base::floatfield); return str; } //basic_ios class definition template class _UCXXEXPORT basic_ios : public ios_base { public: // Types: typedef charT char_type; typedef typename traits::int_type int_type; typedef typename traits::pos_type pos_type; typedef typename traits::off_type off_type; typedef traits traits_type; _UCXXEXPORT operator void*() const{ if(fail() ){ return 0; } return (void *)(1); //Must return a non-NULL pointer (though it can be *any* pointer) } _UCXXEXPORT bool operator!() const{ return fail(); } _UCXXEXPORT iostate rdstate() const{ return mstate; } _UCXXEXPORT void clear(iostate state = goodbit){ if(rdbuf()!=0){ mstate = state; }else{ mstate = state|ios_base::badbit; } } _UCXXEXPORT void setstate(iostate state) { clear(rdstate() | state); #ifdef __UCLIBCXX_EXCEPTION_SUPPORT__ if(rdstate() & throw_mask){ throw failure(); } #endif } _UCXXEXPORT bool good() const{ return (rdstate() == 0); } _UCXXEXPORT bool eof() const{ if(rdstate() & eofbit){ return true; } return false; } _UCXXEXPORT bool fail() const{ if( mstate & (failbit | badbit) ){ return true; } return false; } _UCXXEXPORT bool bad() const{ if(mstate & badbit){ return true; } return false; } _UCXXEXPORT iostate exceptions() const{ return throw_mask; } _UCXXEXPORT void exceptions(iostate except){ throw_mask = except; } explicit _UCXXEXPORT basic_ios(basic_streambuf* sb) : fill_char(' '), mtied(0), mstreambuf(0){ init(sb); } basic_ios() : mtied(0), mstreambuf(0){ } virtual _UCXXEXPORT ~basic_ios(){ } _UCXXEXPORT basic_ostream* tie() const{ return mtied; } _UCXXEXPORT basic_ostream* tie(basic_ostream* tiestr){ basic_ostream* retval= mtied; mtied = tiestr; return retval; } _UCXXEXPORT basic_streambuf* rdbuf() const{ return mstreambuf; } _UCXXEXPORT basic_streambuf* rdbuf(basic_streambuf* sb){ basic_streambuf* retval = mstreambuf; mstreambuf = sb; return retval; } _UCXXEXPORT basic_ios& copyfmt(const basic_ios& rhs); _UCXXEXPORT char_type fill() const{ return fill_char; } _UCXXEXPORT char_type fill(char_type ch){ char_type temp = fill_char; fill_char = ch; return temp; } _UCXXEXPORT locale imbue(const locale& loc){ return ios_base::imbue(loc); } _UCXXEXPORT char narrow(char_type c, char dfault) const; _UCXXEXPORT char_type widen(char c) const; protected: char_type fill_char; basic_ostream* mtied; basic_streambuf* mstreambuf; iostate throw_mask; _UCXXEXPORT basic_ios(const basic_ios &){ } _UCXXEXPORT basic_ios & operator=(const basic_ios &){ return *this; } _UCXXEXPORT void init(basic_streambuf* sb){ ios_base::mformat = skipws|dec; mstreambuf = sb; mstate = goodbit; throw_mask = goodbit; } }; #ifdef __UCLIBCXX_EXPAND_IOS_CHAR__ #ifndef __UCLIBCXX_COMPILE_IOS__ template <> _UCXXEXPORT void basic_ios >::clear(iostate state); template <> _UCXXEXPORT void basic_ios >::setstate(iostate state); #endif #endif template inline char basic_ios::narrow(char_type c, char dfault) const { return dfault; } template <> inline char basic_ios >::narrow(char_type c, char) const { return c; } #ifdef __UCLIBCXX_HAS_WCHAR__ template <> inline char basic_ios >::narrow(char_type c, char dfault) const { char retval = wctob (c); if(retval == EOF){ retval = dfault; } return retval; } #endif //__UCLIBCXX_HAS_WCHAR__ template inline typename basic_ios::char_type basic_ios::widen(char c) const { return c; } template <> inline basic_ios >::char_type basic_ios >::widen(char c) const { return c; } #ifdef __UCLIBCXX_HAS_WCHAR__ template <> inline basic_ios >::char_type basic_ios >::widen(char c) const { return btowc(c); } #endif //__UCLIBCXX_HAS_WCHAR__ template class _UCXXEXPORT fpos{ public: _UCXXEXPORT fpos(stateT s){ st = s; } _UCXXEXPORT stateT state() const{ return st; } _UCXXEXPORT void state(stateT s){ st = s; } _UCXXEXPORT bool operator==(const fpos &rhs){ return st == rhs.st; } _UCXXEXPORT bool operator!=(const fpos &rhs){ return st != rhs.st; } _UCXXEXPORT fpos & operator+(const streamoff & o){ st += o; return *this; } _UCXXEXPORT fpos & operator-(const streamoff & o){ st -= o; return *this; } _UCXXEXPORT streamoff operator-(const fpos & rhs){ return st - rhs.st; } private: stateT st; }; } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/ios.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define __UCLIBCXX_COMPILE_IOS__ 1 #include #include #include #include namespace std{ #ifdef __UCLIBCXX_SUPPORT_CDIR__ _UCXXLOCAL int ios_base::Init::init_cnt = 0; //Needed to ensure the static value is created //Create buffers first #ifdef __UCLIBCXX_SUPPORT_COUT__ _UCXXEXPORT filebuf _cout_filebuf; #endif #ifdef __UCLIBCXX_SUPPORT_CIN__ _UCXXEXPORT filebuf _cin_filebuf; #endif #ifdef __UCLIBCXX_SUPPORT_CERR__ _UCXXEXPORT filebuf _cerr_filebuf; #endif #ifdef __UCLIBCXX_SUPPORT_CLOG__ _UCXXEXPORT filebuf _clog_filebuf; #endif #ifdef __UCLIBCXX_SUPPORT_WCOUT__ _UCXXEXPORT wfilebuf _wcout_filebuf; #endif #ifdef __UCLIBCXX_SUPPORT_WCIN__ _UCXXEXPORT wfilebuf _wcin_filebuf; #endif #ifdef __UCLIBCXX_SUPPORT_WCERR__ _UCXXEXPORT wfilebuf _wcerr_filebuf; #endif #ifdef __UCLIBCXX_SUPPORT_WCLOG__ _UCXXEXPORT wfilebuf _wclog_filebuf; #endif //Then create streams #ifdef __UCLIBCXX_SUPPORT_COUT__ _UCXXEXPORT ostream cout(&_cout_filebuf); #endif #ifdef __UCLIBCXX_SUPPORT_CIN__ _UCXXEXPORT istream cin(&_cin_filebuf); #endif #ifdef __UCLIBCXX_SUPPORT_CERR__ _UCXXEXPORT ostream cerr(&_cerr_filebuf); #endif #ifdef __UCLIBCXX_SUPPORT_CLOG__ _UCXXEXPORT ostream clog(&_clog_filebuf); #endif #ifdef __UCLIBCXX_SUPPORT_WCOUT__ _UCXXEXPORT wostream wcout(&_wcout_filebuf); #endif #ifdef __UCLIBCXX_SUPPORT_WCIN__ _UCXXEXPORT wistream wcin(&_wcin_filebuf); #endif #ifdef __UCLIBCXX_SUPPORT_WCERR__ _UCXXEXPORT wostream wcerr(&_wcerr_filebuf); #endif #ifdef __UCLIBCXX_SUPPORT_WCLOG__ _UCXXEXPORT wostream wclog(&_wclog_filebuf); #endif _UCXXEXPORT ios_base::Init::Init(){ if(init_cnt == 0){ //Need to construct cout et al #ifdef __UCLIBCXX_SUPPORT_COUT__ _cout_filebuf.fp = stdout; _cout_filebuf.openedFor = ios_base::out; #endif #ifdef __UCLIBCXX_SUPPORT_CERR__ _cerr_filebuf.fp = stderr; _cerr_filebuf.openedFor = ios_base::out; cerr.mformat |= ios_base::unitbuf; #endif #ifdef __UCLIBCXX_SUPPORT_CLOG__ _clog_filebuf.fp = stderr; _clog_filebuf.openedFor = ios_base::out; #endif #ifdef __UCLIBCXX_SUPPORT_CIN__ _cin_filebuf.fp = stdin; _cin_filebuf.openedFor = ios_base::in; #ifdef __UCLIBCXX_SUPPORT_COUT__ cin.tie(&cout); #endif #endif #ifdef __UCLIBCXX_SUPPORT_WCOUT__ _wcout_filebuf.fp = stdout; _wcout_filebuf.openedFor = ios_base::out; #endif #ifdef __UCLIBCXX_SUPPORT_WCERR__ _wcerr_filebuf.fp = stderr; _wcerr_filebuf.openedFor = ios_base::out; wcerr.mformat |= ios_base::unitbuf; #endif #ifdef __UCLIBCXX_SUPPORT_WCLOG__ _wclog_filebuf.fp = stderr; _wclog_filebuf.openedFor = ios_base::out; #endif #ifdef __UCLIBCXX_SUPPORT_WCIN__ _wcin_filebuf.fp = stdin; _wcin_filebuf.openedFor = ios_base::in; #ifdef __UCLIBCXX_SUPPORT_WCOUT__ wcin.tie(&wcout); #endif #endif } init_cnt++; } _UCXXEXPORT ios_base::Init::~Init(){ --init_cnt; if(init_cnt==0){ } } #endif #ifdef __UCLIBCXX_EXPAND_IOS_CHAR__ template _UCXXEXPORT void basic_ios >::clear(iostate state); template _UCXXEXPORT void basic_ios >::setstate(iostate state); #endif _UCXXEXPORT ios_base::fmtflags ios_base::flags(fmtflags fmtfl){ fmtflags temp = mformat; mformat = fmtfl; return temp; } _UCXXEXPORT ios_base::fmtflags ios_base::setf(fmtflags fmtfl){ return flags(flags() | fmtfl); } _UCXXEXPORT ios_base::fmtflags ios_base::setf(fmtflags fmtfl, fmtflags mask ){ return flags( (flags()& ~mask) | (fmtfl & mask)); } _UCXXEXPORT streamsize ios_base::precision(streamsize prec){ streamsize temp = mprecision; mprecision = prec; return temp; } _UCXXEXPORT streamsize ios_base::width(streamsize wide){ streamsize temp = mwidth; mwidth = wide; return temp; } _UCXXEXPORT locale ios_base::imbue(const locale& loc){ locale retval = mLocale; mLocale = loc; return retval; } } ================================================ FILE: external/arduino/stlarduino/iosfwd ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #ifndef __HEADER_STD_IOSFWD #define __HEADER_STD_IOSFWD 1 #pragma GCC visibility push(default) namespace std { class ios_base; template<> class char_traits; #ifdef __UCLIBCXX_HAS_WCHAR__ template<> class char_traits; #endif template > class basic_ios; template > class basic_streambuf; template > class basic_istream; template > class basic_ostream; template > class basic_iostream; template , class Allocator = allocator > class basic_stringbuf; template , class Allocator = allocator > class basic_istringstream; template , class Allocator = allocator > class basic_ostringstream; template , class Allocator = allocator > class basic_stringstream; template > class basic_filebuf; template > class basic_ifstream; template > class basic_ofstream; template > class basic_fstream; template > class basic_istreambuf_iterator; template > class basic_ostreambuf_iterator; typedef basic_ios ios; #ifdef __UCLIBCXX_HAS_WCHAR__ typedef basic_ios wios; #endif typedef basic_streambuf streambuf; typedef basic_istream istream; typedef basic_ostream ostream; typedef basic_iostream iostream; typedef basic_stringbuf stringbuf; typedef basic_istringstream istringstream; typedef basic_ostringstream ostringstream; typedef basic_stringstream stringstream; typedef basic_filebuf filebuf; typedef basic_ifstream ifstream; typedef basic_ofstream ofstream; typedef basic_fstream fstream; #ifdef __UCLIBCXX_HAS_WCHAR__ typedef basic_streambuf wstreambuf; typedef basic_istream wistream; typedef basic_ostream wostream; typedef basic_iostream wiostream; typedef basic_stringbuf wstringbuf; typedef basic_istringstream wistringstream; typedef basic_ostringstream wostringstream; typedef basic_stringstream wstringstream; typedef basic_filebuf wfilebuf; typedef basic_ifstream wifstream; typedef basic_ofstream wofstream; typedef basic_fstream wfstream; #endif template class fpos; typedef fpos::state_type> streampos; #ifdef __UCLIBCXX_HAS_WCHAR__ typedef fpos::state_type> wstreampos; #endif } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/iostream ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #ifndef __HEADER_STD_IOSTREAM #define __HEADER_STD_IOSTREAM 1 #include #include #include #include #include #pragma GCC visibility push(default) namespace std{ #ifdef __UCLIBCXX_SUPPORT_CIN__ extern istream cin; #endif #ifdef __UCLIBCXX_SUPPORT_COUT__ extern ostream cout; #endif #ifdef __UCLIBCXX_SUPPORT_CERR__ extern ostream cerr; #endif #ifdef __UCLIBCXX_SUPPORT_CLOG__ extern ostream clog; #endif #ifdef __UCLIBCXX_SUPPORT_WCIN__ extern wistream wcin; #endif #ifdef __UCLIBCXX_SUPPORT_WCOUT__ extern wostream wcout; #endif #ifdef __UCLIBCXX_SUPPORT_WCERR__ extern wostream wcerr; #endif #ifdef __UCLIBCXX_SUPPORT_WCLOG__ extern wostream wclog; #endif template class _UCXXEXPORT basic_iostream : public basic_istream, public basic_ostream { public: // constructor/destructor explicit _UCXXEXPORT basic_iostream(basic_streambuf* sb); virtual _UCXXEXPORT ~basic_iostream(); //Below }; template _UCXXEXPORT basic_iostream:: basic_iostream(basic_streambuf* sb) : basic_ios(sb), basic_istream(sb), basic_ostream(sb) { return; } template _UCXXEXPORT basic_iostream::~basic_iostream(){ return; } #ifdef __UCLIBCXX_EXPAND_OSTREAM_CHAR__ #ifdef __UCLIBCXX_EXPAND_ISTREAM_CHAR__ #ifndef __UCLIBCXX_COMPILE_IOSTREAM__ template <> _UCXXEXPORT basic_iostream >:: basic_iostream(basic_streambuf >* sb); template <> _UCXXEXPORT basic_iostream >::~basic_iostream(); #endif #endif #endif } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/iostream.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define __UCLIBCXX_COMPILE_IOSTREAM__ 1 #include namespace std{ #ifdef __UCLIBCXX_EXPAND_OSTREAM_CHAR__ #ifdef __UCLIBCXX_EXPAND_ISTREAM_CHAR__ template _UCXXEXPORT basic_iostream >:: basic_iostream(basic_streambuf >* sb); template _UCXXEXPORT basic_iostream >::~basic_iostream(); #endif #endif } ================================================ FILE: external/arduino/stlarduino/istream ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc C++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this library; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #ifndef __STD_HEADER_ISTREAM #define __STD_HEADER_ISTREAM 1 #pragma GCC visibility push(default) namespace std{ typedef basic_istream istream; #ifdef __UCLIBCXX_HAS_WCHAR__ typedef basic_istream wistream; #endif template basic_istream& ws(basic_istream& is); template class _UCXXEXPORT basic_istream : virtual public basic_ios { public: typedef charT char_type; typedef typename traits::int_type int_type; typedef typename traits::pos_type pos_type; typedef typename traits::off_type off_type; typedef basic_streambuf streambuf_type; typedef traits traits_type; explicit basic_istream(basic_streambuf* sb) : basic_ios(sb), count_last_ufmt_input(0) { basic_ios::init(sb); } virtual ~basic_istream() { } class sentry; basic_istream& operator>>(basic_istream& (*pf)(basic_istream&)); basic_istream& operator>>(basic_ios& (*pf)(basic_ios&)); basic_istream& operator>>(ios_base& (*pf)(ios_base&)); basic_istream& operator>>(bool& n); basic_istream& operator>>(short& n); basic_istream& operator>>(unsigned short& n); basic_istream& operator>>(int& n); basic_istream& operator>>(unsigned int& n); basic_istream& operator>>(long& n); basic_istream& operator>>(unsigned long& n); basic_istream& operator>>(void*& p); basic_istream& operator>>(basic_streambuf* sb); #ifdef __UCLIBCXX_HAS_FLOATS__ basic_istream& operator>>(float& f); basic_istream& operator>>(double& f); basic_istream& operator>>(long double& f); #endif _UCXXEXPORT streamsize gcount() const{ return count_last_ufmt_input; } _UCXXEXPORT int_type get(); //below _UCXXEXPORT basic_istream& get(char_type& c); //Below _UCXXEXPORT basic_istream& get(char_type* s, streamsize n){ return get(s, n, basic_ios::widen('\n')); } _UCXXEXPORT basic_istream& get(char_type* s, streamsize n, char_type delim){ sentry(*this, true); streamsize i = 0; int_type c; for(i=0;i::mstreambuf->sgetc(); basic_ios::mstreambuf->sbumpc(); if(c == traits::eof() ){ if(i==0){ basic_ios::setstate(ios_base::failbit); }else{ basic_ios::setstate(ios_base::eofbit); } break; } if(c == delim){ if(i==0){ basic_ios::setstate(ios_base::failbit); } basic_ios::mstreambuf->sputbackc(c); break; } s[i] = c; } s[i] = traits::eos(); count_last_ufmt_input = i; return *this; } _UCXXEXPORT basic_istream& get(basic_streambuf& sb){ return get(sb, basic_ios::widen('\n')); } _UCXXEXPORT basic_istream& get(basic_streambuf& sb, char_type delim){ sentry(*this, true); streamsize i = 0; int_type c; while(1){ //We will exit internally based upon error conditions c = basic_ios::mstreambuf->sgetc(); if(c == traits::eof()){ if(i==0){ basic_ios::setstate(ios_base::failbit); }else{ basic_ios::setstate(ios_base::eofbit); } count_last_ufmt_input = i; return *this; } if(c == delim){ if(i==0){ basic_ios::setstate(ios_base::failbit); } count_last_ufmt_input = i; return *this; } if(sb.sputc(c) != c){ //Error doing output count_last_ufmt_input = i; return *this; } ++i; basic_ios::mstreambuf->sbumpc(); } } _UCXXEXPORT basic_istream& getline(char_type* s, streamsize n){ return getline(s, n, basic_ios::widen('\n')); } _UCXXEXPORT basic_istream& getline(char_type* s, streamsize n, char_type delim){ sentry(*this, true); streamsize i = 0; int_type c; for(i=0;i::mstreambuf->sgetc(); if(c == traits::eof() ){ if( basic_ios::eof() ){ basic_ios::setstate(ios_base::failbit); }else{ basic_ios::setstate(ios_base::eofbit); } count_last_ufmt_input = i; s[i] = traits::eos(); return *this; } if(basic_ios::mstreambuf->sbumpc()==traits::eof() ){ basic_ios::setstate(ios_base::eofbit); } if(c == delim){ count_last_ufmt_input = i+1; s[i] = traits::eos(); return *this; } s[i] = c; } s[n-1] = traits::eos(); return *this; } _UCXXEXPORT basic_istream& ignore (streamsize n = 1, int_type delim = traits::eof()){ sentry(*this, true); streamsize i; int_type c; for(i=0;i::mstreambuf->sgetc(); if(c == traits::eof()){ basic_ios::setstate(ios_base::eofbit); return *this; } basic_ios::mstreambuf->sbumpc(); if(c == delim){ return *this; } } return *this; } _UCXXEXPORT int_type peek(){ if(basic_ios::good() == false){ return traits::eof(); }else{ int_type c = basic_ios::mstreambuf->sgetc(); if(c == traits::eof()){ basic_ios::setstate(ios_base::eofbit); } return basic_ios::mstreambuf->sgetc(); } } _UCXXEXPORT basic_istream& read (char_type* s, streamsize n){ sentry(*this, true); streamsize i; int_type c; for(i=0;i::mstreambuf->sgetc(); if(c == traits::eof()){ basic_ios::setstate(ios_base::failbit); basic_ios::setstate(ios_base::eofbit); count_last_ufmt_input = i; return *this; } basic_ios::mstreambuf->sbumpc(); s[i] = c; } count_last_ufmt_input = n; return *this; } _UCXXEXPORT streamsize readsome(char_type* s, streamsize n){ sentry(*this, true); if(!basic_ios::good()){ count_last_ufmt_input = 0; basic_ios::setstate(ios_base::failbit); return 0; } if( basic_ios::mstreambuf->in_avail() == -1){ count_last_ufmt_input=0; basic_ios::setstate(ios_base::eofbit); return 0; } if(n > basic_ios::mstreambuf->in_avail() ){ n = basic_ios::mstreambuf->in_avail(); } streamsize i; int_type c; for(i=0;i::mstreambuf->sgetc(); basic_ios::mstreambuf->sbumpc(); s[i] = c; } count_last_ufmt_input = n; return n; } _UCXXEXPORT basic_istream& putback(char_type c){ sentry(*this, true); if(!basic_ios::good()){ basic_ios::setstate(ios_base::failbit); return *this; } if(basic_ios::mstreambuf == 0){ basic_ios::setstate(ios_base::badbit); return *this; } if(basic_ios::mstreambuf->sputbackc(c) == traits::eof()){ basic_ios::setstate(ios_base::badbit); return *this; } return *this; } _UCXXEXPORT basic_istream& unget(){ sentry(*this, true); if(!basic_ios::good()){ basic_ios::setstate(ios_base::failbit); return *this; } if(basic_ios::mstreambuf == 0){ basic_ios::setstate(ios_base::failbit); return *this; } if(basic_ios::mstreambuf->sungetc() == traits::eof()){ basic_ios::setstate(ios_base::failbit); } return *this; } _UCXXEXPORT int sync(){ sentry(*this, true); if(basic_ios::mstreambuf == 0){ return -1; } if(basic_ios::mstreambuf->pubsync() == -1){ basic_ios::setstate(ios_base::badbit); return traits::eof(); } return 0; } _UCXXEXPORT pos_type tellg(){ if(basic_ios::fail() !=false){ return pos_type(-1); } return basic_ios::mstreambuf->pubseekoff(0, ios_base::cur, ios_base::in); } _UCXXEXPORT basic_istream& seekg(pos_type pos){ if(basic_ios::fail() !=true){ basic_ios::mstreambuf->pubseekpos(pos); } return *this; } _UCXXEXPORT basic_istream& seekg(off_type off, ios_base::seekdir dir){ if(basic_ios::fail() !=true){ basic_ios::mstreambuf->pubseekoff(off, dir); } return *this; } protected: _UCXXEXPORT basic_istream(const basic_istream &): basic_ios() { } _UCXXEXPORT basic_istream & operator=(const basic_istream &){ return *this; } streamsize count_last_ufmt_input; }; template class _UCXXEXPORT basic_istream::sentry { bool ok; public: explicit _UCXXEXPORT sentry(basic_istream& os, bool noskipws = false){ if(os.good() !=0){ //Prepare for output } //Flush any tied buffer if(os.tie() != 0){ os.tie()->flush(); } if(!noskipws){ __skipws(os); } ok = true; } _UCXXEXPORT ~sentry() { } _UCXXEXPORT operator bool() { return ok; } }; //Template implementations of basic_istream functions which may be partially specialized //For code reduction template _UCXXEXPORT typename basic_istream::int_type basic_istream::get(){ sentry(*this, true); int_type retval = basic_ios::mstreambuf->sgetc(); if(retval == traits::eof()){ count_last_ufmt_input = 0; basic_ios::setstate(ios_base::eofbit); }else{ count_last_ufmt_input = 1; basic_ios::mstreambuf->sbumpc(); } return retval; } template _UCXXEXPORT basic_istream& basic_istream::get(char_type& c){ sentry(*this, true); int_type retval = basic_ios::mstreambuf->sgetc(); if(retval == traits::eof()){ count_last_ufmt_input = 0; basic_ios::setstate(ios_base::eofbit); basic_ios::setstate(ios_base::failbit); }else{ count_last_ufmt_input = 1; c = traits::to_char_type(retval); basic_ios::mstreambuf->sbumpc(); } return *this; } template _UCXXEXPORT basic_istream& basic_istream::operator>>(bool& n) { sentry(*this); __istream_readin::readin(*this, n); return *this; } template _UCXXEXPORT basic_istream& basic_istream::operator>>(short& n) { sentry(*this); __istream_readin::readin(*this, n); return *this; } template _UCXXEXPORT basic_istream& basic_istream::operator>>(unsigned short& n) { sentry(*this); __istream_readin::readin(*this, n); return *this; } template _UCXXEXPORT basic_istream& basic_istream::operator>>(int& n){ sentry(*this); __istream_readin::readin(*this, n); return *this; } template _UCXXEXPORT basic_istream& basic_istream::operator>>(unsigned int& n){ sentry(*this); __istream_readin::readin(*this, n); return *this; } template _UCXXEXPORT basic_istream& basic_istream::operator>>(long int& n){ sentry(*this); __istream_readin::readin(*this, n); return *this; } template _UCXXEXPORT basic_istream& basic_istream::operator>>(unsigned long int& n) { sentry(*this); __istream_readin::readin(*this, n); return *this; } #ifdef __UCLIBCXX_HAS_FLOATS__ template _UCXXEXPORT basic_istream& basic_istream::operator>>(float& n) { sentry(*this); __istream_readin::readin(*this, n); return *this; } template _UCXXEXPORT basic_istream& basic_istream::operator>>(double& n) { sentry(*this); __istream_readin::readin(*this, n); return *this; } template _UCXXEXPORT basic_istream& basic_istream::operator>>(long double& n) { sentry(*this); __istream_readin::readin(*this, n); return *this; } #endif template _UCXXEXPORT basic_istream& basic_istream::operator>>(void *& n) { sentry(*this); __istream_readin::readin(*this, n); return *this; } template _UCXXEXPORT basic_istream& operator>>(basic_istream& is, charT& c) { typename basic_istream::sentry s(is); is.get(c); return is; } template _UCXXEXPORT basic_istream& operator>>(basic_istream& is, unsigned char& c) { typename basic_istream::sentry s(is); char b; is.get(b); c = b; return is; } template _UCXXEXPORT basic_istream& operator>>(basic_istream& is, signed char& c) { typename basic_istream::sentry s(is); is.get(c); return is; } template _UCXXEXPORT basic_istream& operator>>(basic_istream& is, charT* c) { typename basic_istream::sentry s(is); int n = is.width(); if(n == 0){ n = __STRING_MAX_UNITS; } is.get(c, n); return is; } template _UCXXEXPORT basic_istream& operator>>(basic_istream& is, unsigned char* c) { typename basic_istream::sentry s(is); int n = is.width(); if(n == 0){ n = __STRING_MAX_UNITS; } is.get(c, n); return is; } template _UCXXEXPORT basic_istream& operator>>(basic_istream& is, signed char* c) { typename basic_istream::sentry s(is); int n = is.width(); if(n == 0){ n = __STRING_MAX_UNITS; } is.get(c, n); return is; } template _UCXXEXPORT basic_istream& basic_istream::operator>>(basic_istream& (*pf)(basic_istream&)) { sentry(*this); pf(*this); return *this; } template _UCXXEXPORT basic_istream& basic_istream::operator>>(basic_ios& (*pf)(basic_ios&)) { sentry(*this); pf(*this); return *this; } template _UCXXEXPORT basic_istream& basic_istream::operator>>(ios_base& (*pf)(ios_base&)) { sentry(*this); pf(*this); return *this; } template _UCXXEXPORT basic_istream& ws(basic_istream& is) { __skipws(is); return is; } #ifdef __UCLIBCXX_EXPAND_ISTREAM_CHAR__ #ifndef __UCLIBCXX_COMPILE_ISTREAM__ template <> _UCXXEXPORT istream & basic_istream >::get(char & c); template <> _UCXXEXPORT istream::int_type basic_istream >::get(); template <> _UCXXEXPORT istream & istream::operator>>(bool &n); template <> _UCXXEXPORT istream & istream::operator>>(short &n); template <> _UCXXEXPORT istream & istream::operator>>(unsigned short &n); template <> _UCXXEXPORT istream & istream::operator>>(int &n); template <> _UCXXEXPORT istream & istream::operator>>(unsigned int &n); template <> _UCXXEXPORT istream & istream::operator>>(long unsigned &n); template <> _UCXXEXPORT istream & istream::operator>>(long int &n); template <> _UCXXEXPORT istream & istream::operator>>(void *& p); #ifdef __UCLIBCXX_HAS_FLOATS__ template <> _UCXXEXPORT istream & istream::operator>>(float &f); template <> _UCXXEXPORT istream & istream::operator>>(double &f); template <> _UCXXEXPORT istream & istream::operator>>(long double &f); #endif template <> _UCXXEXPORT istream & operator>>(istream & is, char & c); template <> _UCXXEXPORT void __skipws(basic_istream >& is); #endif #endif } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/istream.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define __UCLIBCXX_COMPILE_ISTREAM__ 1 #include namespace std{ #ifdef __UCLIBCXX_EXPAND_ISTREAM_CHAR__ template <> _UCXXEXPORT string _readToken >(istream & stream) { string temp; char_traits::int_type c; while(true){ c = stream.rdbuf()->sgetc(); if(c != char_traits::eof() && isspace(c) == false){ stream.rdbuf()->sbumpc(); temp.append(1, char_traits::to_char_type(c)); }else{ break; } } if (temp.size() == 0) stream.setstate(ios_base::eofbit|ios_base::failbit); return temp; } template _UCXXEXPORT istream::int_type istream::get(); template _UCXXEXPORT istream & istream::get(char &c); template _UCXXEXPORT istream & istream::operator>>(bool &n); template _UCXXEXPORT istream & istream::operator>>(short &n); template _UCXXEXPORT istream & istream::operator>>(unsigned short &n); template _UCXXEXPORT istream & istream::operator>>(int &n); template _UCXXEXPORT istream & istream::operator>>(unsigned int &n); template _UCXXEXPORT istream & istream::operator>>(long unsigned &n); template _UCXXEXPORT istream & istream::operator>>(long int &n); template _UCXXEXPORT istream & istream::operator>>(void *& p); template _UCXXEXPORT istream & operator>>(istream & is, char & c); #ifdef __UCLIBCXX_HAS_FLOATS__ template _UCXXEXPORT istream & istream::operator>>(float &f); template _UCXXEXPORT istream & istream::operator>>(double &f); template _UCXXEXPORT istream & istream::operator>>(long double &f); #endif template _UCXXEXPORT void __skipws(basic_istream >& is); #endif } ================================================ FILE: external/arduino/stlarduino/istream_helpers ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #ifndef __STD_HEADER_ISTREAM_HELPERS #define __STD_HEADER_ISTREAM_HELPERS 1 #pragma GCC visibility push(default) namespace std{ /* We are making the following template class for serveral reasons. Firstly, * we want to keep the main istream code neat and tidy. Secondly, we want it * to be easy to do partial specialization of the istream code so that it can * be expanded and put into the library. This will allow us to make application * code smaller at the expense of increased library size. This is a fair * trade-off when there are multiple applications being compiled. Also, this * feature will be used optionally via configuration options. It will also * allow us to keep the code bases in sync, dramatically simplifying the * maintenance required. We specialized for char because wchar and others * require different scanf functions */ template _UCXXEXPORT basic_string _readToken(basic_istream& stream) { basic_string temp; typename traits::int_type c; while(true){ c = stream.rdbuf()->sgetc(); if(c != traits::eof() && isspace(c) == false){ stream.rdbuf()->sbumpc(); temp.append(1, traits::to_char_type(c)); }else{ break; } } if (temp.size() == 0) stream.setstate(ios_base::eofbit|ios_base::failbit); return temp; } template _UCXXEXPORT basic_string _readTokenDecimal(basic_istream& stream) { basic_string temp; typename traits::int_type c; while(true){ c = stream.rdbuf()->sgetc(); if(c != traits::eof() && isspace(c) == false && ( isdigit(c) || c == '.' || c == ',' || ((c == '-' || c == '+') && temp.size() == 0) ) ){ stream.rdbuf()->sbumpc(); temp.append(1, traits::to_char_type(c)); }else{ break; } } if (temp.size() == 0) stream.setstate(ios_base::eofbit|ios_base::failbit); return temp; } #ifdef __UCLIBCXX_EXPAND_ISTREAM_CHAR__ template <> _UCXXEXPORT string _readToken >(istream & stream); #endif template class _UCXXEXPORT __istream_readin{ public: static void readin(basic_istream& stream, dataType & var); }; template class _UCXXEXPORT __istream_readin{ public: inline static void readin(basic_istream& stream, bool & var) { /* 22.4.2.1.2.4 */ basic_string temp; temp = _readToken( stream); if (stream.flags() & ios_base::boolalpha) { if (temp == "true") // truename() var = true; else { var = false; if (temp != "false") // falsename() stream.setstate(ios_base::failbit); } } else { long int i = 0; int ret; if (stream.flags() & ios_base::dec) { ret = sscanf(temp.c_str(), "%ld", &i ); } else { if (stream.flags() & ios_base::oct) { ret = sscanf(temp.c_str(), "%lo", (unsigned long int *)(&i)); } else if (stream.flags() & ios_base::hex) { if (stream.flags() & ios_base::uppercase) { ret = sscanf(temp.c_str(), "%lX", (unsigned long int *)(&i)); } else { ret = sscanf(temp.c_str(), "%lx", (unsigned long int *)(&i)); } } else { ret = sscanf(temp.c_str(), "%li", &i); } } if (ret != 1 || i >> 1) stream.setstate(ios_base::failbit); var = ret == 1 && bool(i); } } }; template class _UCXXEXPORT __istream_readin{ public: inline static void readin(basic_istream& stream, short & var) { basic_string temp; if(stream.flags() & ios_base::dec){ temp = _readTokenDecimal( stream); sscanf(temp.c_str(), "%hd", &var ); }else{ temp = _readToken( stream); if( stream.flags() & ios_base::oct){ sscanf(temp.c_str(), "%ho", (unsigned short int *)(&var) ); }else if(stream.flags() & ios_base::hex){ if(stream.flags() & ios_base::uppercase){ sscanf(temp.c_str(), "%hX", (unsigned short int *)(&var) ); }else{ sscanf(temp.c_str(), "%hx", (unsigned short int *)(&var) ); } }else{ sscanf(temp.c_str(), "%hi", &var); } } } }; template class _UCXXEXPORT __istream_readin{ public: inline static void readin(basic_istream& stream, unsigned short & var) { basic_string temp; if(stream.flags() & ios_base::dec){ temp = _readTokenDecimal( stream); sscanf(temp.c_str(), "%hu", &var ); }else{ temp = _readToken( stream); if( stream.flags() & ios_base::oct){ sscanf(temp.c_str(), "%ho", &var); }else if(stream.flags() & ios_base::hex){ if(stream.flags() & ios_base::uppercase){ sscanf(temp.c_str(), "%hX", &var ); }else{ sscanf(temp.c_str(), "%hx", &var); } }else{ sscanf(temp.c_str(), "%hi", (signed short int*)(&var) ); } } } }; template class _UCXXEXPORT __istream_readin{ public: inline static void readin(basic_istream& stream, int & var) { basic_string temp; if(stream.flags() & ios_base::dec){ temp = _readTokenDecimal( stream); sscanf(temp.c_str(), "%d", &var ); }else{ temp = _readToken( stream); if( stream.flags() & ios_base::oct){ sscanf(temp.c_str(), "%o", (unsigned int *)(&var) ); }else if(stream.flags() & ios_base::hex){ if(stream.flags() & ios_base::uppercase){ sscanf(temp.c_str(), "%X", (unsigned int *)(&var) ); }else{ sscanf(temp.c_str(), "%x", (unsigned int *)(&var) ); } }else{ sscanf(temp.c_str(), "%i", &var); } } } }; template class _UCXXEXPORT __istream_readin{ public: inline static void readin(basic_istream& stream, unsigned int & var) { basic_string temp; if(stream.flags() & ios_base::dec){ temp = _readTokenDecimal( stream); sscanf(temp.c_str(), "%u", &var ); }else{ temp = _readToken( stream); if( stream.flags() & ios_base::oct){ sscanf(temp.c_str(), "%o", (unsigned int *)(&var) ); }else if(stream.flags() & ios_base::hex){ if(stream.flags() & ios_base::uppercase){ sscanf(temp.c_str(), "%X", (unsigned int *)(&var) ); }else{ sscanf(temp.c_str(), "%x", (unsigned int *)(&var) ); } }else{ sscanf(temp.c_str(), "%i", (int *)(&var) ); } } } }; template class _UCXXEXPORT __istream_readin{ public: inline static void readin(basic_istream& stream, long int & var) { basic_string temp; if(stream.flags() & ios_base::dec){ temp = _readTokenDecimal( stream); sscanf(temp.c_str(), "%ld", &var ); }else{ temp = _readToken( stream); if( stream.flags() & ios_base::oct){ sscanf(temp.c_str(), "%lo", (unsigned long int *)(&var) ); }else if(stream.flags() & ios_base::hex){ if(stream.flags() & ios_base::uppercase){ sscanf(temp.c_str(), "%lX", (unsigned long int *)(&var) ); }else{ sscanf(temp.c_str(), "%lx", (unsigned long int *)(&var) ); } }else{ sscanf(temp.c_str(), "%li", (long int *)(&var) ); } } } }; template class _UCXXEXPORT __istream_readin{ public: inline static void readin(basic_istream& stream, unsigned long int & var) { basic_string temp; if(stream.flags() & ios_base::dec){ temp = _readTokenDecimal( stream); sscanf(temp.c_str(), "%lu", &var ); }else{ temp = _readToken( stream); if( stream.flags() & ios_base::oct){ sscanf(temp.c_str(), "%lo", &var ); }else if(stream.flags() & ios_base::hex){ if(stream.flags() & ios_base::uppercase){ sscanf(temp.c_str(), "%lX", &var ); }else{ sscanf(temp.c_str(), "%lx", &var); } }else{ sscanf(temp.c_str(), "%li", (long int *)(&var) ); } } } }; #ifdef __UCLIBCXX_HAS_FLOATS__ // NB: The Arduino AVR compiler contains an implementation of printf() and scanf() // that lacks support for floating point numbers. Also, the AVR C library doesn't // support the double datatype. In AVR it's the same as float. template class _UCXXEXPORT __istream_readin{ public: inline static void readin(basic_istream& stream, float & var) { basic_string temp; temp = _readTokenDecimal(stream); bool isneg=false; if (temp[0] == '-') { isneg=true; temp.erase(0,1); }else if (temp[0] == '+') { isneg=false; temp.erase(0,1); } unsigned int dec = temp.find('.', 0); if (dec == string::npos) { var = atol(temp.c_str()); }else{ var = atol(temp.substr(0,dec).c_str()); var += ((double) atoi(temp.substr(dec+1).c_str())) / pow(10.0,temp.size()-dec-1); } if (isneg) var = -var; } }; template class _UCXXEXPORT __istream_readin{ public: inline static void readin(basic_istream& stream, double & var) { basic_string temp; temp = _readTokenDecimal(stream); bool isneg=false; if (temp[0] == '-') { isneg=true; temp.erase(0,1); }else if (temp[0] == '+') { isneg=false; temp.erase(0,1); } unsigned int dec = temp.find('.', 0); if (dec == string::npos) { var = atol(temp.c_str()); }else{ var = atol(temp.substr(0,dec).c_str()); var += ((double) atoi(temp.substr(dec+1).c_str())) / pow(10.0,temp.size()-dec-1); } if (isneg) var = -var; } }; template class _UCXXEXPORT __istream_readin{ public: inline static void readin(basic_istream& stream, long double & var) { basic_string temp; temp = _readTokenDecimal( stream); sscanf(temp.c_str(), "%Lg", &var); } }; #endif // ifdef __UCLIBCXX_HAS_FLOATS__ template class _UCXXEXPORT __istream_readin{ public: inline static void readin(basic_istream& stream, void* & var) { basic_string temp; temp = _readToken( stream); sscanf(temp.c_str(), "%p", &var); } }; template void __skipws(basic_istream& is){ const typename basic_istream::int_type eof = traits::eof(); typename basic_istream::int_type c; //While the next character normally read doesn't equal eof //and that character is a space, advance to the next read position //Thus itterating through all whitespace until we get to the meaty stuff while ( !traits::eq_int_type((c = is.rdbuf()->sgetc()), eof) && isspace(c) ) { is.rdbuf()->sbumpc(); } if(traits::eq_int_type(c, eof)){ is.setstate(ios_base::eofbit); } } } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/iterator ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #ifndef __STD_HEADER_ITERATOR #define __STD_HEADER_ITERATOR 1 #pragma GCC visibility push(default) namespace std{ // subclause _lib.stream.iterators_, stream iterators: template , class Distance = ptrdiff_t> class istream_iterator; template bool operator==(const istream_iterator& x, const istream_iterator& y); template bool operator!=(const istream_iterator& x, const istream_iterator& y); template > class ostream_iterator; template > class istreambuf_iterator; template bool operator==(const istreambuf_iterator& a, const istreambuf_iterator& b); template bool operator!=(const istreambuf_iterator& a, const istreambuf_iterator& b); template > class ostreambuf_iterator; template < class T, class charT, class traits, class Distance > class _UCXXEXPORT istream_iterator : public iterator { public: typedef charT char_type; typedef traits traits_type; typedef basic_istream istream_type; istream_iterator() : in_stream(0), value(0) {} istream_iterator(istream_type& s) : in_stream(&s), value() { *in_stream >> value; } istream_iterator(const istream_iterator& x) : in_stream(x.in_stream), value(x.value) { } ~istream_iterator() { } const T& operator*() const{ return value; } const T* operator->() const{ return &value; } istream_iterator& operator++() { *in_stream >> value; return *this; } istream_iterator operator++(int){ istream_iterator tmp = *this; *in_stream >> value; return (tmp); } bool m_equal(const istream_iterator& x) const{ return (in_stream == x.in_stream); } private: basic_istream* in_stream; T value; }; template _UCXXEXPORT bool operator==(const istream_iterator& x, const istream_iterator& y) { return x.m_equal(y); } template _UCXXEXPORT bool operator!=(const istream_iterator& x, const istream_iterator& y) { return !(x == y); } template class _UCXXEXPORT ostream_iterator : public iterator { public: typedef charT char_type; typedef traits traits_type; typedef basic_ostream ostream_type; ostream_iterator(ostream_type& s) : out_stream(&s), delim(0) { } ostream_iterator(ostream_type& s, const charT* delimiter) : out_stream(&s), delim(delimiter) { } ostream_iterator(const ostream_iterator& x) : out_stream(x.out_stream), delim(x.delim) { } ~ostream_iterator() { } ostream_iterator& operator=(const T& value){ *out_stream << value; if(delim != 0){ *out_stream << delim; } return (*this); } ostream_iterator& operator*(){ return *this; } ostream_iterator& operator++() { return *this; } ostream_iterator operator++(int) { return *this; } private: basic_ostream* out_stream; const char* delim; }; template class _UCXXEXPORT istreambuf_iterator : public iterator { public: typedef charT char_type; typedef traits traits_type; typedef typename traits::int_type int_type; typedef basic_streambuf streambuf_type; typedef basic_istream istream_type; class _UCXXEXPORT proxy{ charT val; basic_streambuf * buf; proxy(charT v, basic_streambuf * b) : val(v), buf(b) { } public: charT operator*() { return val; } }; istreambuf_iterator() throw() : sbuf(0) { } istreambuf_iterator(istream_type& s) throw() : sbuf(s.rdbuf()) { } istreambuf_iterator(streambuf_type* s) throw() : sbuf(s) { } istreambuf_iterator(const proxy& p) throw() : sbuf(&p.buf) { } charT operator*() const{ return sbuf->sgetc(); } istreambuf_iterator& operator++(){ sbuf->sbumpc(); return *this; } proxy operator++(int){ istreambuf_iterator tmp = *this; sbuf->sbumpc(); return(tmp); } bool equal(const istreambuf_iterator& b) const{ return sbuf == b.sbuf || is_eof() && b.is_eof(); } private: streambuf_type* sbuf; inline bool is_eof() const{ return sbuf == 0 || sbuf->sgetc() == traits_type::eof(); } }; template _UCXXEXPORT bool operator==(const istreambuf_iterator& a, const istreambuf_iterator& b) { return a.equal(b); } template bool _UCXXEXPORT operator!=(const istreambuf_iterator& a, const istreambuf_iterator& b) { return !a.equal(b); } template class _UCXXEXPORT ostreambuf_iterator : iterator { public: typedef charT char_type; typedef traits traits_type; typedef basic_streambuf streambuf_type; typedef basic_ostream ostream_type; public: ostreambuf_iterator(ostream_type& s) throw() : sbuf(s.rdbuf()), f(false) { } ostreambuf_iterator(streambuf_type* s) throw() : sbuf(s), f(false) { } ostreambuf_iterator& operator=(charT c){ if(failed() == false){ if(sbuf->sputc(c) == traits::eof()){ f = true; } } return *this; } ostreambuf_iterator& operator*(){ return *this; } ostreambuf_iterator& operator++() { return *this; } ostreambuf_iterator operator++(int) { return *this; } bool failed() const throw(){ return f; } private: streambuf_type* sbuf; bool f; }; } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/iterator.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include namespace std{ } ================================================ FILE: external/arduino/stlarduino/iterator_base ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #ifndef __STD_HEADER_ITERATOR_BASE #define __STD_HEADER_ITERATOR_BASE 1 #pragma GCC visibility push(default) namespace std{ template struct iterator_traits; template struct iterator_traits; template struct iterator; struct _UCXXEXPORT input_iterator_tag {}; struct _UCXXEXPORT output_iterator_tag {}; struct _UCXXEXPORT forward_iterator_tag: public input_iterator_tag {}; struct _UCXXEXPORT bidirectional_iterator_tag: public forward_iterator_tag {}; struct _UCXXEXPORT random_access_iterator_tag: public bidirectional_iterator_tag {}; template _UCXXEXPORT void advance(InputIterator& i, Distance n){ while(n > 0){ --n; ++i; } } template _UCXXEXPORT typename iterator_traits::difference_type distance(InputIterator first, InputIterator last) { typename iterator_traits::difference_type d = 0; while(first++ !=last){ d++; } return d; } // subclause _lib.predef.iterators_, predefined iterators: template class reverse_iterator; template bool operator==(const reverse_iterator& x, const reverse_iterator& y); template bool operator<(const reverse_iterator& x, const reverse_iterator& y); template bool operator!=(const reverse_iterator& x, const reverse_iterator& y); template bool operator>(const reverse_iterator& x, const reverse_iterator& y); template bool operator>=(const reverse_iterator& x, const reverse_iterator& y); template bool operator<=(const reverse_iterator& x, const reverse_iterator& y); template typename reverse_iterator::difference_type operator-( const reverse_iterator& x, const reverse_iterator& y); template reverse_iterator operator+( typename reverse_iterator::difference_type n, const reverse_iterator& x); template class back_insert_iterator; template back_insert_iterator back_inserter(Container& x); template class front_insert_iterator; template front_insert_iterator front_inserter(Container& x); template class insert_iterator; template insert_iterator inserter(Container& x, Iterator i); //Actual Template definitions template struct _UCXXEXPORT iterator_traits { typedef typename Iterator::difference_type difference_type; typedef typename Iterator::value_type value_type; typedef typename Iterator::pointer pointer; typedef typename Iterator::reference reference; typedef typename Iterator::iterator_category iterator_category; }; //Pointer specialization - required by standard template struct _UCXXEXPORT iterator_traits { typedef ptrdiff_t difference_type; typedef T value_type; typedef T* pointer; typedef T& reference; typedef random_access_iterator_tag iterator_category; }; //Specialization recomended by standard /* template struct _UCXXEXPORT iterator_traits { typedef long difference_type; typedef T value_type; typedef T __far* pointer; typedef T __far& reference; typedef random_access_iterator_tag iterator_category; };*/ /* template _UCXXEXPORT void reverse(BidirectionalIterator first, BidirectionalIterator last) { typename iterator_traits::difference_type n = distance(first, last); --n; while(n > 0){ typename iterator_traits::value_type tmp = *first; *first++ = * --last; *last = tmp; n -= 2; } };*/ template struct _UCXXEXPORT iterator { typedef T value_type; typedef Distance difference_type; typedef Pointer pointer; typedef Reference reference; typedef Category iterator_category; }; template class _UCXXEXPORT reverse_iterator : public iterator::iterator_category, typename iterator_traits::value_type, typename iterator_traits::difference_type, typename iterator_traits::pointer, typename iterator_traits::reference> { protected: Iterator current; friend bool operator== (const reverse_iterator& x, const reverse_iterator& y); friend bool operator< (const reverse_iterator& x, const reverse_iterator& y); public: typedef Iterator iterator_type; reverse_iterator() : current(){}; explicit reverse_iterator(Iterator x) : current(x) { } template reverse_iterator(const reverse_iterator &x) : current(x.base()){} Iterator base() const { return current; } // explicit typename iterator_traits::reference operator*() const { Iterator tmp = current; return *--tmp; } typename iterator_traits::pointer operator->() const { return &(operator*()); } typename iterator_traits::reference operator[](typename iterator_traits::difference_type n) const{ return current[-n-1]; } reverse_iterator& operator++(){ --current; return *this; } reverse_iterator operator++(int) {reverse_iterator tmp = *this; --current; return tmp; } reverse_iterator& operator--() { ++ current; return *this; } reverse_iterator operator--(int) {reverse_iterator tmp = *this; ++current; return tmp; } reverse_iterator operator+ (typename iterator_traits::difference_type n) const{ reverse_iterator retval( *this ); retval+=n; return retval; } reverse_iterator& operator+=(typename iterator_traits::difference_type n){ current -= n; return *this; } reverse_iterator operator- (typename iterator_traits::difference_type n) const{ reverse_iterator retval( *this ); retval-=n; return retval; } reverse_iterator& operator-=(typename iterator_traits::difference_type n){ current += n; return *this; } }; template _UCXXEXPORT bool operator==(const reverse_iterator& x, const reverse_iterator& y) { return x.base() == y.base(); } template _UCXXEXPORT bool operator<(const reverse_iterator& x, const reverse_iterator& y) { return x.base() < y.base(); } template _UCXXEXPORT bool operator!=(const reverse_iterator& x, const reverse_iterator& y) { return x.base() != y.base(); } template _UCXXEXPORT bool operator>(const reverse_iterator& x, const reverse_iterator& y) { return x.base() > y.base(); } template _UCXXEXPORT bool operator>=(const reverse_iterator& x, const reverse_iterator& y) { return x.base() >= y.base(); } template _UCXXEXPORT bool operator<=(const reverse_iterator& x, const reverse_iterator& y) { return x.base() <= y.base(); } template _UCXXEXPORT typename reverse_iterator::difference_type operator-( const reverse_iterator& x, const reverse_iterator& y) { return y.base() - x.base(); } template _UCXXEXPORT reverse_iterator operator+(typename reverse_iterator::difference_type n, const reverse_iterator& x) { return reverse_iterator (x.base() - n); } template class _UCXXEXPORT back_insert_iterator : public iterator { protected: Container& container; public: typedef Container container_type; explicit back_insert_iterator(Container& x):container(x) {}; back_insert_iterator& operator=(const typename Container::value_type& value){ container.push_back(value); return *this; } back_insert_iterator& operator*(){ return *this; } back_insert_iterator& operator++(){ return *this; } back_insert_iterator operator++(int){ return *this; } }; template _UCXXEXPORT back_insert_iterator back_inserter(Container& x) { return back_insert_iterator(x); } template class _UCXXEXPORT front_insert_iterator : public iterator { protected: Container& container; public: typedef Container container_type; explicit front_insert_iterator(Container& x): container(x) {} front_insert_iterator& operator=(const typename Container::value_type& value){ container.push_front(value); return *this; } front_insert_iterator& operator*() { return *this; } front_insert_iterator& operator++() { return *this; } front_insert_iterator operator++(int) { return *this; } }; template _UCXXEXPORT front_insert_iterator front_inserter(Container& x) { return front_insert_iterator(x); } template class _UCXXEXPORT insert_iterator : public iterator { protected: Container& container; typename Container::iterator iter; public: typedef Container container_type; insert_iterator(Container& x, typename Container::iterator i) : container(x), iter(i) {} insert_iterator& operator=(const typename Container::value_type& value){ iter = container.insert(iter, value); ++iter; return *this; } insert_iterator& operator*() { return *this; } insert_iterator& operator++() { return *this; } insert_iterator operator++(int) { return *this; } }; template _UCXXEXPORT insert_iterator inserter(Container& x, Iterator i) { return insert_iterator(x,typename Container::iterator(i)); } } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/limits ================================================ /* Copyright (C) 2006 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #ifndef __STD_HEADER_LIMITS #define __STD_HEADER_LIMITS 1 #warning limits header is nowhere complete or accurate #pragma GCC visibility push(default) namespace std{ enum float_round_style{ round_indeterminate =-1, round_toward_zero = 0, round_to_nearest = 1, round_toward_infinity = 2, round_toward_neg_infinity = 3 }; template struct __bits_to_base_10{ static const int size = -1; }; template <> struct __bits_to_base_10<7>{ static const int size = 2; }; template <> struct __bits_to_base_10<8>{ static const int size = 2; }; template <> struct __bits_to_base_10<9>{ static const int size = 2; }; template <> struct __bits_to_base_10<10>{ static const int size = 3; }; template <> struct __bits_to_base_10<15>{ static const int size = 4; }; template <> struct __bits_to_base_10<16>{ static const int size = 4; }; template <> struct __bits_to_base_10<17>{ static const int size = 5; }; template <> struct __bits_to_base_10<18>{ static const int size = 5; }; template <> struct __bits_to_base_10<31>{ static const int size = 9; }; template <> struct __bits_to_base_10<32>{ static const int size = 9; }; template <> struct __bits_to_base_10<35>{ static const int size = 10; }; template <> struct __bits_to_base_10<36>{ static const int size = 10; }; template <> struct __bits_to_base_10<63>{ static const int size = 18; }; template <> struct __bits_to_base_10<64>{ static const int size = 19; }; template <> struct __bits_to_base_10<71>{ static const int size = 21; }; template <> struct __bits_to_base_10<72>{ static const int size = 21; }; template <> struct __bits_to_base_10<79>{ static const int size = 23; }; template <> struct __bits_to_base_10<80>{ static const int size = 24; }; template <> struct __bits_to_base_10<127>{ static const int size = 38; }; template <> struct __bits_to_base_10<128>{ static const int size = 38; }; template class numeric_limits { public: // General -- meaningful for all specializations. static const bool is_specialized = false; static T min(); static T max(); static const int radix; static const int digits; static const int digits10; static const bool is_signed; static const bool is_integer; static const bool is_exact; static const bool traps; static const bool is_modulo; static const bool is_bounded; // Floating point specific. static T epsilon(); static T round_error(); static const int min_exponent10; static const int max_exponent10; static const int min_exponent; static const int max_exponent; static const bool has_infinity; static const bool has_quiet_NaN; static const bool has_signaling_NaN; static const bool is_iec559; static const bool has_denorm; static const bool tinyness_before; static const float_round_style round_style; static T denorm_min(); static T infinity(); static T quiet_NaN(); static T signaling_NaN(); }; template <> class numeric_limits { public: typedef bool T; // General -- meaningful for all specializations. static const bool is_specialized = true; static T min(){ return false; } static T max(){ return true; } static const int radix = 2; static const int digits = 1; static const int digits10 = 0; static const bool is_signed = false; static const bool is_integer = true; static const bool is_exact = true; static const bool traps = false; static const bool is_modulo = false; static const bool is_bounded = true; // Floating point specific. static T epsilon(){ return 0; } static T round_error(){ return 0; } static const int min_exponent10 = 0; static const int max_exponent10 = 0; static const int min_exponent = 0; static const int max_exponent = 0; static const bool has_infinity = false; static const bool has_quiet_NaN = false; static const bool has_signaling_NaN = false; static const bool is_iec559 = false; static const bool has_denorm = false; static const bool tinyness_before = false; static const float_round_style round_style = round_indeterminate; static T denorm_min(); static T infinity(); static T quiet_NaN(); static T signaling_NaN(); }; template <> class numeric_limits { public: typedef unsigned char T; // General -- meaningful for all specializations. static const bool is_specialized = true; static T min(){ return 0; } static T max(){ return UCHAR_MAX; } static const int radix = 2; static const int digits = CHAR_BIT; static const int digits10 = __bits_to_base_10::size; static const bool is_signed = false; static const bool is_integer = true; static const bool is_exact = true; static const bool traps = false; static const bool is_modulo = true; static const bool is_bounded = true; // Floating point specific. static T epsilon(){ return 0; } static T round_error(){ return 0; } static const int min_exponent10 = 0; static const int max_exponent10 = 0; static const int min_exponent = 0; static const int max_exponent = 0; static const bool has_infinity = false; static const bool has_quiet_NaN = false; static const bool has_signaling_NaN = false; static const bool is_iec559 = false; static const bool has_denorm = false; static const bool tinyness_before = false; static const float_round_style round_style = round_indeterminate; static T denorm_min(); static T infinity(); static T quiet_NaN(); static T signaling_NaN(); }; template <> class numeric_limits { public: typedef signed char T; // General -- meaningful for all specializations. static const bool is_specialized = true; static T min(){ return SCHAR_MIN; } static T max(){ return SCHAR_MAX; } static const int radix = 2; static const int digits = CHAR_BIT - 1; static const int digits10 = __bits_to_base_10::size; static const bool is_signed = true; static const bool is_integer = true; static const bool is_exact = true; static const bool traps = false; static const bool is_modulo = true; static const bool is_bounded = true; // Floating point specific. static T epsilon(){ return 0; } static T round_error(){ return 0; } static const int min_exponent10 = 0; static const int max_exponent10 = 0; static const int min_exponent = 0; static const int max_exponent = 0; static const bool has_infinity = false; static const bool has_quiet_NaN = false; static const bool has_signaling_NaN = false; static const bool is_iec559 = false; static const bool has_denorm = false; static const bool tinyness_before = false; static const float_round_style round_style = round_indeterminate; static T denorm_min(); static T infinity(); static T quiet_NaN(); static T signaling_NaN(); }; template <> class numeric_limits { public: typedef char T; // General -- meaningful for all specializations. static const bool is_specialized = true; static T min(){ return CHAR_MIN; } static T max(){ return CHAR_MAX; } static const int radix = 2; static const int digits = (CHAR_MIN != 0) ? CHAR_BIT - 1 : CHAR_BIT; static const int digits10 = __bits_to_base_10::size; static const bool is_signed = (CHAR_MIN != 0); static const bool is_integer = true; static const bool is_exact = true; static const bool traps = false; static const bool is_modulo = true; static const bool is_bounded = true; // Floating point specific. static T epsilon(){ return 0; } static T round_error(){ return 0; } static const int min_exponent10 = 0; static const int max_exponent10 = 0; static const int min_exponent = 0; static const int max_exponent = 0; static const bool has_infinity = false; static const bool has_quiet_NaN = false; static const bool has_signaling_NaN = false; static const bool is_iec559 = false; static const bool has_denorm = false; static const bool tinyness_before = false; static const float_round_style round_style = round_indeterminate; static T denorm_min(); static T infinity(); static T quiet_NaN(); static T signaling_NaN(); }; template <> class numeric_limits { public: typedef unsigned short T; // General -- meaningful for all specializations. static const bool is_specialized = true; static T min(){ return 0; } static T max(){ return USHRT_MAX; } static const int radix = 2; static const int digits = CHAR_BIT * sizeof(T); static const int digits10 = __bits_to_base_10::size; static const bool is_signed = false; static const bool is_integer = true; static const bool is_exact = true; static const bool traps = false; static const bool is_modulo = true; static const bool is_bounded = true; // Floating point specific. static T epsilon(){ return 0; } static T round_error(){ return 0; } static const int min_exponent10 = 0; static const int max_exponent10 = 0; static const int min_exponent = 0; static const int max_exponent = 0; static const bool has_infinity = false; static const bool has_quiet_NaN = false; static const bool has_signaling_NaN = false; static const bool is_iec559 = false; static const bool has_denorm = false; static const bool tinyness_before = false; static const float_round_style round_style = round_indeterminate; static T denorm_min(); static T infinity(); static T quiet_NaN(); static T signaling_NaN(); }; template <> class numeric_limits { public: typedef signed short T; // General -- meaningful for all specializations. static const bool is_specialized = true; static T min(){ return SHRT_MIN; } static T max(){ return SHRT_MAX; } static const int radix = 2; static const int digits = CHAR_BIT * sizeof(T); static const int digits10 = __bits_to_base_10::size; static const bool is_signed = true; static const bool is_integer = true; static const bool is_exact = true; static const bool traps = false; static const bool is_modulo = true; static const bool is_bounded = true; // Floating point specific. static T epsilon(){ return 0; } static T round_error(){ return 0; } static const int min_exponent10 = 0; static const int max_exponent10 = 0; static const int min_exponent = 0; static const int max_exponent = 0; static const bool has_infinity = false; static const bool has_quiet_NaN = false; static const bool has_signaling_NaN = false; static const bool is_iec559 = false; static const bool has_denorm = false; static const bool tinyness_before = false; static const float_round_style round_style = round_indeterminate; static T denorm_min(); static T infinity(); static T quiet_NaN(); static T signaling_NaN(); }; template <> class numeric_limits { public: typedef unsigned int T; // General -- meaningful for all specializations. static const bool is_specialized = true; static T min(){ return 0; } static T max(){ return UINT_MAX; } static const int radix = 2; static const int digits = CHAR_BIT * sizeof(T); static const int digits10 = __bits_to_base_10::size; static const bool is_signed = false; static const bool is_integer = true; static const bool is_exact = true; static const bool traps = false; static const bool is_modulo = true; static const bool is_bounded = true; // Floating point specific. static T epsilon(){ return 0; } static T round_error(){ return 0; } static const int min_exponent10 = 0; static const int max_exponent10 = 0; static const int min_exponent = 0; static const int max_exponent = 0; static const bool has_infinity = false; static const bool has_quiet_NaN = false; static const bool has_signaling_NaN = false; static const bool is_iec559 = false; static const bool has_denorm = false; static const bool tinyness_before = false; static const float_round_style round_style = round_indeterminate; static T denorm_min(); static T infinity(); static T quiet_NaN(); static T signaling_NaN(); }; template <> class numeric_limits { public: typedef signed int T; // General -- meaningful for all specializations. static const bool is_specialized = true; static T min(){ return INT_MIN; } static T max(){ return INT_MAX; } static const int radix = 2; static const int digits = CHAR_BIT * sizeof(T); static const int digits10 = __bits_to_base_10::size; static const bool is_signed = true; static const bool is_integer = true; static const bool is_exact = true; static const bool traps = false; static const bool is_modulo = true; static const bool is_bounded = true; // Floating point specific. static T epsilon(){ return 0; } static T round_error(){ return 0; } static const int min_exponent10 = 0; static const int max_exponent10 = 0; static const int min_exponent = 0; static const int max_exponent = 0; static const bool has_infinity = false; static const bool has_quiet_NaN = false; static const bool has_signaling_NaN = false; static const bool is_iec559 = false; static const bool has_denorm = false; static const bool tinyness_before = false; static const float_round_style round_style = round_indeterminate; static T denorm_min(); static T infinity(); static T quiet_NaN(); static T signaling_NaN(); }; template <> class numeric_limits { public: typedef unsigned long int T; // General -- meaningful for all specializations. static const bool is_specialized = true; static T min(){ return 0; } static T max(){ return ULONG_MAX; } static const int radix = 2; static const int digits = CHAR_BIT * sizeof(T); static const int digits10 = __bits_to_base_10::size; static const bool is_signed = false; static const bool is_integer = true; static const bool is_exact = true; static const bool traps = false; static const bool is_modulo = true; static const bool is_bounded = true; // Floating point specific. static T epsilon(){ return 0; } static T round_error(){ return 0; } static const int min_exponent10 = 0; static const int max_exponent10 = 0; static const int min_exponent = 0; static const int max_exponent = 0; static const bool has_infinity = false; static const bool has_quiet_NaN = false; static const bool has_signaling_NaN = false; static const bool is_iec559 = false; static const bool has_denorm = false; static const bool tinyness_before = false; static const float_round_style round_style = round_indeterminate; static T denorm_min(); static T infinity(); static T quiet_NaN(); static T signaling_NaN(); }; template <> class numeric_limits { public: typedef signed long int T; // General -- meaningful for all specializations. static const bool is_specialized = true; static T min(){ return LONG_MIN; } static T max(){ return LONG_MAX; } static const int radix = 2; static const int digits = CHAR_BIT * sizeof(T); static const int digits10 = __bits_to_base_10::size; static const bool is_signed = true; static const bool is_integer = true; static const bool is_exact = true; static const bool traps = false; static const bool is_modulo = true; static const bool is_bounded = true; // Floating point specific. static T epsilon(){ return 0; } static T round_error(){ return 0; } static const int min_exponent10 = 0; static const int max_exponent10 = 0; static const int min_exponent = 0; static const int max_exponent = 0; static const bool has_infinity = false; static const bool has_quiet_NaN = false; static const bool has_signaling_NaN = false; static const bool is_iec559 = false; static const bool has_denorm = false; static const bool tinyness_before = false; static const float_round_style round_style = round_indeterminate; static T denorm_min(); static T infinity(); static T quiet_NaN(); static T signaling_NaN(); }; template <> class numeric_limits { public: typedef double numeric_type; static const bool is_specialized = true; static numeric_type min () { return __DBL_MIN__; } static numeric_type max () { return __DBL_MAX__; } static const int radix = __FLT_RADIX__; static const int digits = __DBL_MANT_DIG__; static const int digits10 = __DBL_DIG__; static const bool is_signed = true; static const bool is_integer = false; static const bool is_exact = false; static const bool traps = false; // this is a guess static const bool is_modulo = false; static const bool is_bounded = true; // Floating point specific. static numeric_type epsilon () { return __DBL_EPSILON__; } static numeric_type round_error () { return 0.5; } static const int min_exponent10 = -1; //How do I properly get this? static const int max_exponent10 = -1; //How do I properly get this? static const int min_exponent = -1; //How do I properly get this? static const int max_exponent = -1; //How do I properly get this? static const bool has_infinity = false; //I don't know, so until I can find out, I'm saying no static const bool has_quiet_NaN = false; //I don't know, so until I can find out, I'm saying no static const bool has_signaling_NaN = false; //I don't know, so until I can find out, I'm saying no static const bool has_denorm = false; //I don't know, so until I can find out, I'm saying no static const bool is_iec559 = false; //I don't know, so until I can find out, I'm saying no static const bool tinyness_before = false; // more questions static const float_round_style round_style = round_to_nearest; // more questions static numeric_type denorm_min () { return -1; } //How do I properly get this? static numeric_type infinity () { return -1; } //How do I properly get this? static numeric_type quiet_NaN () { return -1; } //How do I properly get this? static numeric_type signaling_NaN () { return -1; } //How do I properly get this? }; } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/limits.cpp ================================================ /* Copyright (C) 2006 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include namespace std{ } ================================================ FILE: external/arduino/stlarduino/list ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #ifndef __STD_HEADER_LIST #define __STD_HEADER_LIST 1 #pragma GCC visibility push(default) namespace std{ template > class _UCXXEXPORT list { public: typedef typename Allocator::reference reference; typedef typename Allocator::const_reference const_reference; typedef typename Allocator::size_type size_type; typedef typename Allocator::difference_type difference_type; typedef T value_type; typedef Allocator allocator_type; typedef typename Allocator::pointer pointer; typedef typename Allocator::const_pointer const_pointer; protected: class node; class iter_list; node * list_start; node * list_end; size_type elements; Allocator a; public: typedef iter_list iterator; typedef iter_list const_iterator; typedef std::reverse_iterator reverse_iterator; typedef std::reverse_iterator const_reverse_iterator; explicit list(const Allocator& = Allocator()); explicit list(size_type n, const T& value = T(), const Allocator& = Allocator()); template list(InputIterator first, InputIterator last, const Allocator& al= Allocator()); list(const list& x); ~list(); list& operator=(const list& x){ if(&x == this){ return *this; } clear(); iterator i = x.begin(); while(i != x.end()){ push_back(*i); ++i; } return *this; } template void assign(InputIterator first, InputIterator last); template void assign(Size n, const U& u = U()); allocator_type get_allocator() const; iterator begin(); const_iterator begin() const; iterator end(); const_iterator end() const; reverse_iterator rbegin(); const_reverse_iterator rbegin() const; reverse_iterator rend(); const_reverse_iterator rend() const; bool empty() const; size_type size() const; size_type max_size() const; void resize(size_type sz, T c = T()); reference front(); const_reference front() const; reference back(); const_reference back() const; void push_front(const T& x); void pop_front(); void push_back(const T& x); void pop_back(); iterator insert(iterator position, const T& x = T()); void insert(iterator position, size_type n, const T& x); template void insert(iterator position, InputIterator first, InputIterator last); iterator erase(iterator position); iterator erase(iterator position, iterator last); void swap(list&); void clear(); void splice(iterator position, list& x); void splice(iterator position, list& x, iterator i); void splice(iterator position, list& x, iterator first, iterator last); void remove(const T& value); template void remove_if(Predicate pred); void unique(); template void unique(BinaryPredicate binary_pred); void merge(list& x); template void merge(list& x, Compare comp); void sort(); template void sort(Compare comp); void reverse(); protected: void swap_nodes(node * x, node * y); }; //Implementations of List //List node template class _UCXXEXPORT list::node{ public: node * previous; node * next; T * val; node(): previous(0), next(0), val(0){ } node(const T & t ): previous(0), next(0), val(0) { val = new T(t); //FIXME use allocator somehow but only call constructor once } node(const T & t, node * p, node * n): previous(p), next(n), val(0) { val = new T(t); } ~node(){ } }; //List iterator template class _UCXXEXPORT list::iter_list : public std::iterator< bidirectional_iterator_tag, T, typename Allocator::difference_type, typename Allocator::pointer, typename Allocator::reference > { private: node * current; public: iter_list():current(0) { } iter_list( typename list::node * n): current(n) { } iter_list(const list::iter_list & l): current(l.current) { } ~iter_list(){ } iter_list & operator=(const list::iter_list & right ){ current = right.current; return *this; } T & operator*(){ return *(current->val); } T * operator->(){ return current->val; } const T & operator*() const{ return *current->val; } const T * operator->() const{ return current->val; } bool operator==(const list::iter_list & right) const { return (current == right.current); } bool operator!=(const list::iter_list & right) const { return (current != right.current); } iter_list & operator++(){ current = current->next; return *this; } iter_list operator++(int){ iter_list temp(current); current = current->next; return temp; } iter_list & operator--(){ current = current->previous; return *this; } iter_list operator--(int){ iter_list temp(current); current = current->previous; return temp; } node * link_struct(){ return current; } iter_list & operator+=(unsigned int n){ for(unsigned int i = 0; i < n; ++i){ current = current->next; } return *this; } iter_list & operator-=(unsigned int n){ for(unsigned int i = 0; i < n; ++i){ current = current->previous; } return *this; } }; template list::list(const Allocator& al) :list_start(0), list_end(0), elements(0), a(al) { //End node list_start = new node(); list_end = list_start; return; } template list::list (typename Allocator::size_type n, const T& value, const Allocator& al) :list_start(0), list_end(0), elements(0), a(al) { //End node list_start = new node(); list_end = list_start; for(typename Allocator::size_type i = 0; i < n ; ++i){ push_back(value); } } template template list::list (InputIterator first, InputIterator last, const Allocator& al) : list_start(0), list_end(0), elements(0), a(al) { list_start = new node(); list_end = list_start; while(first != last){ push_back(*first); ++first; } } template list::list(const list& x) : list_start(0), list_end(0), elements(0), a(x.a) { list_start = new node(); list_end = list_start; iterator i = x.begin(); while(i != x.end()){ push_back( *i); ++i; } } template list::~list(){ while(elements > 0){ pop_front(); } delete list_start->val; #if UCLIBCXX_DEBUG list_start->val = 0; #endif delete list_start; #if UCLIBCXX_DEBUG list_start = 0; list_end = 0; #endif } template void list::swap_nodes(node * x, node * y){ T * v = x->val; x->val = y->val; y->val = v; } template typename list::iterator list::begin() { return iterator(list_start); } template typename list::const_iterator list::begin() const { return const_iterator(list_start); } template typename list::iterator list::end() { return iterator(list_end); } template typename list::const_iterator list::end() const { return const_iterator(list_end); } template typename list::reverse_iterator list::rbegin() { return reverse_iterator(end()); } template typename list::const_reverse_iterator list::rbegin() const { return const_reverse_iterator(end()); } template typename list::reverse_iterator list::rend() { return reverse_iterator(begin()); } template typename list::const_reverse_iterator list::rend() const { return const_reverse_iterator(begin()); } template bool list::empty() const{ return (elements == 0); } template typename list::size_type list::size() const{ return elements; } template typename list::size_type list::max_size() const{ return ((size_type)(-1)) / (sizeof(T) + sizeof(node)); } template void list::resize(typename Allocator::size_type sz, T c){ // if(sz > elements){ for(typename Allocator::size_type i = elements; i < sz; ++i){ push_back(c); } // } // if(sz < elements){ for(typename Allocator::size_type i = elements; i > sz; --i){ pop_back(); } // } } template typename list::reference list::front(){ return *(list_start->val); } template typename list::const_reference list::front() const{ return *(list_start->val); } template typename list::reference list::back(){ return *(list_end->previous->val); } template typename list::const_reference list::back() const{ return *(list_end->previous->val); } template void list::push_front(const T& x){ node * temp = new node(x); list_start->previous = temp; temp->previous = 0; temp->next = list_start; list_start = temp; ++elements; } template void list::pop_front(){ if(elements > 0){ list_start = list_start->next; delete list_start->previous->val; #if UCLIBCXX_DEBUG list_start->previous->val = 0; list_start->previous->next = 0; list_start->previous->previous = 0; #endif delete list_start->previous; list_start->previous = 0; --elements; } } template void list::push_back(const T& x){ if(elements == 0){ //The list is completely empty list_start = new node(x); list_end->previous = list_start; list_start->previous = 0; list_start->next = list_end; elements = 1; }else{ node * temp = new node(x); temp->previous = list_end->previous; temp->next = list_end; list_end->previous->next = temp; list_end->previous = temp; ++elements; } } template void list::pop_back(){ if(elements > 0){ node * temp = list_end->previous; if(temp == list_start){ list_end->previous = 0; list_start = list_end; }else{ temp->previous->next = temp->next; list_end->previous = temp->previous; } delete temp->val; #if UCLIBCXX_DEBUG temp->val = 0; temp->next = 0; temp->previous = 0; #endif delete temp; #if UCLIBCXX_DEBUG temp = 0; #endif --elements; } } template typename list::iterator list::insert(iterator position, const T& x) { node * temp = new node(x); temp->previous = position.link_struct()->previous; temp->next = position.link_struct(); if(temp->previous == 0){ list_start = temp; }else{ position.link_struct()->previous->next = temp; } position.link_struct()->previous = temp; ++elements; --position; return position; } template void list::insert(iterator position, size_type n, const T& x){ for(typename list::size_type i = 0; i < n; ++i){ position = insert(position, x); } } template template void list::insert(iterator position, InputIterator first, InputIterator last) { while(first !=last){ insert(position, *first); ++first; } } template typename list::iterator list::erase(iterator position) { if(position != end() ){ node * temp = position.link_struct(); if(temp == list_start){ ++position; temp->next->previous = 0; list_start = temp->next; }else{ --position; temp->next->previous = temp->previous; temp->previous->next = temp->next; ++position; } delete temp->val; #if UCLIBCXX_DEBUG temp->next = 0; temp->previous = 0; temp->val = 0; #endif delete temp; #if UCLIBCXX_DEBUG temp = 0; #endif --elements; } return position; } template typename list::iterator list::erase(iterator position, iterator last) { iterator temp = position; while(position !=last){ position = erase(position); } return position; } template void list::swap(list& l){ node * temp; size_type tempel; temp = list_start; list_start = l.list_start; l.list_start = temp; temp = list_end; list_end = l.list_end; l.list_end = temp; tempel = elements; elements = l.elements; l.elements = tempel; } template void list::clear(){ while(elements > 0){ pop_front(); } } template void list::splice(iterator position, list& x) { //Can't add non-existant elements if(x.elements == 0){ return; } elements += x.elements; x.elements = 0; //Chaining to the begining if(position == begin()){ x.list_end->previous->next = list_start; list_start->previous = x.list_end->previous; list_start = x.list_start; x.list_start = x.list_end; x.list_end->previous = 0; return; } //Link everything we need x.list_start->previous = position.link_struct()->previous; position.link_struct()->previous->next = x.list_start; position.link_struct()->previous = x.list_end->previous; x.list_end->previous->next = position.link_struct(); //Clean up the other list x.list_start = x.list_end; x.list_end->previous=0; } template void list::splice(iterator position, list& x, iterator i) { //Invalid conditions if( x.elements == 0 || i == position || position.link_struct() == i.link_struct()->next ){ return; } //Do we need to adjust the begining pointer? if(i == x.begin()){ x.list_start = x.list_start->next; x.list_start->previous = 0; } //Insert at begining special case if(position == begin()){ i.link_struct()->previous->next = i.link_struct()->next; i.link_struct()->next->previous = i.link_struct()->previous; i.link_struct()->previous = 0; i.link_struct()->next = position.link_struct(); position.link_struct()->previous = i.link_struct(); list_start = i.link_struct(); --x.elements; ++elements; return; } if( i.link_struct()->previous != 0){ i.link_struct()->previous->next = i.link_struct()->next; i.link_struct()->next->previous = i.link_struct()->previous; }else{ i.link_struct()->next->previous = 0; x.list_start = i.link_struct()->next; } i.link_struct()->previous = position.link_struct()->previous; position.link_struct()->previous->next = i.link_struct(); i.link_struct()->next = position.link_struct(); position.link_struct()->previous = i.link_struct(); --x.elements; ++elements; } template void list::splice(iterator position, list& x, iterator first, iterator last) { if(x.elements == 0){ return; } iterator temp; while(first != last){ temp = first; ++first; splice(position, x, temp); } } template void list::remove(const T& value){ iterator temp = begin(); while( temp != end() ){ if(*temp == value){ temp = erase(temp); }else{ ++temp; } } } template template void list::remove_if(Predicate pred){ iterator temp = begin(); while( temp != end() ){ if( pred(*temp) ){ temp = erase(temp); }else{ ++temp; } } } template void list::unique(){ equal_to::value_type> p; unique(p); } template template void list::unique(BinaryPredicate binary_pred) { iterator temp1 = begin(); iterator temp2; ++temp1; while( temp1 != end() ){ temp2 = temp1; --temp2; if( binary_pred(*temp1, *temp2) ){ erase(temp1); temp1 = temp2; } ++temp1; } } template void list::merge(list& x){ less::iterator>::value_type> c; merge(x, c); } template template void list::merge(list& x, Compare comp) { iterator source = x.begin(); iterator temp; iterator dest = begin(); while(source != x.end()){ while( dest != end() && comp (*dest, *source) ){ ++dest; } ++elements; --x.elements; temp = source; ++temp; if(dest == begin()){ dest.link_struct()->previous = source.link_struct(); source.link_struct()->next = dest.link_struct(); source.link_struct()->previous = 0; list_start = source.link_struct(); }else{ source.link_struct()->previous = dest.link_struct()->previous; dest.link_struct()->previous->next = source.link_struct(); source.link_struct()->next = dest.link_struct(); dest.link_struct()->previous = source.link_struct(); } source = temp; } //Fix up x; x.list_start = x.list_end; x.list_start->previous = 0; } template void list::sort(){ less::iterator>::value_type> c; sort(c); } template template void list::sort(Compare comp) { typename list::iterator i, j, k; //FIXME - bubble sort if(elements == 0){ return; } i = end(); --i; while(i != begin()){ j = begin(); k = j; ++k; while(j != i){ if( comp(*k, *j) ){ swap_nodes(k.link_struct(), j.link_struct()); } ++j; ++k; } --i; } } template void list::reverse(){ if(elements == 0){ return; } node * current; node * following; node * temp; //Need to move the list_end element to the begining temp = list_end; list_end = temp->previous; list_end->next = 0; list_start->previous = temp; temp->previous = 0; temp->next = list_start; list_start = temp; current = list_start; while( current != list_end ){ following = current->next; //Swap the values pointed to/at with the current node temp = current->next; current->next = current->previous; current->previous = temp; current = following; } //Swap pointers on the end node temp = list_end->next; list_end->next = list_end->previous; list_end->previous = temp; //Swap the fixed pointers temp = list_start; list_start = list_end; list_end = temp; } template bool operator==(const list& x, const list& y){ if(x.size() != y.size()){ return false; } typename list::const_iterator i = x.begin(); typename list::const_iterator j = y.begin(); while(i != x.end()){ if( *i != *j){ return false; } ++i; ++j; } return true; } template bool operator< (const list& x, const list& y){ typename list::const_iterator i = x.begin(); typename list::const_iterator j = y.begin(); while(i != x.end() && j != y.end()){ if( *i < *j){ return true; } if(*j < *i){ return false; } ++i; ++j; } return (i == x.end() && j != y.end()); } template bool operator!=(const list& x, const list& y){ return !(x == y); } template bool operator> (const list& x, const list& y){ typename list::const_iterator i = x.begin(); typename list::const_iterator j = y.begin(); while(i != x.end() && j != y.end()){ if( *i > *j){ return true; } if( *j > *i){ return false; } ++i; ++j; } return (i != x.end() && j == y.end()); } template bool operator>=(const list& x, const list& y){ typename list::const_iterator i = x.begin(); typename list::const_iterator j = y.begin(); while(i != x.end() && j != y.end()){ if( *i >= *j){ return true; } if(*j >= *i){ return false; } ++i; ++j; } return (i != x.end() && j == y.end()); } template bool operator<=(const list& x, const list& y){ typename list::const_iterator i = x.begin(); typename list::const_iterator j = y.begin(); while(i != x.end() && j != y.end()){ if( *i <= *j){ return true; } if(*j <= *i){ return false; } ++i; ++j; } return (i == x.end()); } template void swap(list& x, list& y){ x.swap(y); } } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/list.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include namespace std{ } ================================================ FILE: external/arduino/stlarduino/locale ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #ifndef __HEADER_STD_LOCALE #define __HEADER_STD_LOCALE 1 #pragma GCC visibility push(default) namespace std{ class _UCXXEXPORT locale { public: // types: class facet; class id; typedef unsigned char category; static const category none = 0, collate = 0x01, ctype = 0x02, monetary = 0x04, numeric = 0x08, time = 0x10, messages = 0x20, all = collate | ctype | monetary | numeric | time | messages; // construct/copy/destroy: locale() throw(){ return; } locale(const locale& other) throw(){ (void)other; return; } locale(const char *) throw(){ return; } ~locale() throw(){ return; } const locale& operator=(const locale&) throw(){ return *this; } std::string name() const { return "C"; } }; class _UCXXEXPORT locale::facet { friend class locale; explicit facet(size_t = 0){ return; } virtual ~facet(){ return; } }; class _UCXXEXPORT locale::id { id(){ } }; } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/locale.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include namespace std{ } ================================================ FILE: external/arduino/stlarduino/map ================================================ /* Copyright (C) 2004-2007 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #ifndef __STD_HEADER_MAP #define __STD_HEADER_MAP #pragma GCC visibility push(default) namespace std{ template, class Allocator = allocator > class map; template, class Allocator = allocator > class multimap; //Compare the keys of the two items /* template class _UCXXEXPORT __base_map::value_compare : public binary_function< typename map::value_type, typename map::value_type, bool> { friend class __base_map; protected: Compare comp; value_compare(Compare c) : comp(c) { } ~value_compare() { } public: bool operator()(const value_type& x, const value_type& y) const { return comp(x.first, y.first); } }; */ // value_compare value_comp() const; /* This is the implementation for the map container. As noted above, it deviates * from ISO spec by deriving from a base class in order to reduce code redundancy. * More code could be reduced by convirting to virtual functions (thus allowing * much of the erase and insert code to be duplicated), but that would deviate from * the specifications too much to be worth the risk. */ //Implementation of map template class _UCXXEXPORT map : public __single_associative, Compare, Allocator> { //Default value of allocator does not meet C++ standard specs, but it works for this library //Deal with it public: typedef __single_associative, Compare, Allocator> base; typedef T mapped_type; typedef typename base::key_type key_type; typedef typename base::value_type value_type; typedef typename base::key_compare key_compare; typedef typename base::allocator_type allocator_type; typedef typename base::reference reference; typedef typename base::const_reference const_reference; typedef typename base::iterator iterator; typedef typename base::const_iterator const_iterator; typedef typename base::size_type size_type; typedef typename base::difference_type difference_type; typedef typename base::pointer pointer; typedef typename base::const_pointer const_pointer; typedef typename base::reverse_iterator reverse_iterator; typedef typename base::const_reverse_iterator const_reverse_iterator; static const key_type v_t_k(const value_type v){ return v.first; } // using base::value_compare; explicit map(const Compare& comp = Compare(), const Allocator& al = Allocator()) : base(comp, al, v_t_k) { } template map(InputIterator first, InputIterator last, const Compare& comp = Compare(), const Allocator& al = Allocator()) : base(first, last, comp, al, v_t_k) { } map(initializer_list> in, const Compare& comp = Compare(), const Allocator& al = Allocator()) : base(in.begin(), in.end(), comp, al, v_t_k) { } map(const map& x) : base(x) { } ~map() { } using base::operator=; using base::operator==; using base::operator!=; using base::insert; using base::erase; using base::begin; using base::end; using base::rbegin; using base::rend; using base::empty; using base::size; using base::max_size; using base::find; using base::count; using base::lower_bound; using base::upper_bound; using base::equal_range; using base::swap; reference operator[](const key_type& k){ iterator i = lower_bound(k); if (i == end() || base::c(k, i->first)) { i = insert(make_pair(k, T())).first; } return i->second; } protected: using base::backing; }; //Implementation of multimap template class _UCXXEXPORT multimap : public __multi_associative, Compare, Allocator> { //Default value of allocator does not meet C++ standard specs, but it works for this library //Deal with it public: typedef __multi_associative, Compare, Allocator> base; typedef T mapped_type; typedef typename base::key_type key_type; typedef typename base::value_type value_type; typedef typename base::key_compare key_compare; typedef typename base::allocator_type allocator_type; typedef typename base::reference reference; typedef typename base::const_reference const_reference; typedef typename base::iterator iterator; typedef typename base::const_iterator const_iterator; typedef typename base::size_type size_type; typedef typename base::difference_type difference_type; typedef typename base::pointer pointer; typedef typename base::const_pointer const_pointer; typedef typename base::reverse_iterator reverse_iterator; typedef typename base::const_reverse_iterator const_reverse_iterator; static const key_type v_t_k(const value_type v){ return v.first; } explicit multimap(const Compare& comp = Compare(), const Allocator& al = Allocator()) : base(comp, al, v_t_k) { } template multimap(InputIterator first, InputIterator last, const Compare& comp = Compare(), const Allocator& al = Allocator()) : base(first, last, comp, al, v_t_k) { } multimap(const multimap& x) : base(x) { } ~multimap() { } using base::operator=; using base::operator==; using base::operator!=; using base::insert; using base::erase; using base::begin; using base::end; using base::rbegin; using base::rend; using base::empty; using base::size; using base::max_size; using base::find; using base::count; using base::lower_bound; using base::upper_bound; using base::equal_range; using base::swap; protected: using base::c; }; /* Non-member functions. These are at the end because they are not associated with any particular class. These will be implemented as I figure out exactly what all of them are supposed to do, and I have time. */ template _UCXXEXPORT bool operator< (const map& x, const map& y); template _UCXXEXPORT bool operator!= (const map& x, const map& y); template _UCXXEXPORT bool operator> (const map& x, const map& y); template _UCXXEXPORT bool operator>= (const map& x, const map& y); template _UCXXEXPORT bool operator<= (const map& x, const map& y); template _UCXXEXPORT void swap (map& x, map& y); template _UCXXEXPORT bool operator== (const multimap& x, const multimap& y); template _UCXXEXPORT bool operator< (const multimap& x, const multimap& y); template _UCXXEXPORT bool operator!= (const multimap& x, const multimap& y); template _UCXXEXPORT bool operator> (const multimap& x, const multimap& y); template _UCXXEXPORT bool operator>= (const multimap& x, const multimap& y); template _UCXXEXPORT bool operator<= (const multimap& x, const multimap& y); template _UCXXEXPORT void swap (multimap& x, multimap& y); } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/map.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include namespace std{ } ================================================ FILE: external/arduino/stlarduino/memory ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #ifndef HEADER_STD_MEMORY #define HEADER_STD_MEMORY 1 #pragma GCC visibility push(default) namespace std{ template class allocator; // Specialize for void: template <> class _UCXXEXPORT allocator { public: typedef void* pointer; typedef const void* const_pointer; typedef void value_type; template struct rebind { typedef allocator other; }; }; template class _UCXXEXPORT allocator{ public: typedef T value_type; typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T* pointer; typedef const T* const_pointer; typedef T& reference; typedef const T& const_reference; pointer address(reference r) const { return &r; } const_pointer address(const_reference r) const { return &r; } allocator() throw(){} template allocator(const allocator& ) throw(); ~allocator() throw(){} //Space for n Ts pointer allocate(size_type n, typename allocator::const_pointer = 0){ return (T*)(::operator new( n * sizeof(T) )); } void deallocate(pointer p, size_type){ ::operator delete(p); } //Use placement new to engage the constructor void construct(pointer p, const T& val) { new((void*)p) T(val); } void destroy(pointer p){ ((T*)p)->~T(); } //Call destructor size_type max_size() const throw(); template struct rebind { typedef allocator other; }; }; template class _UCXXEXPORT raw_storage_iterator : public iterator { Out p; public: explicit raw_storage_iterator(Out pp) : p (pp) { } raw_storage_iterator & operator*() { return *this; } raw_storage_iterator & operator=(const T& val) { T* pp = &*p; new(pp) T(val); return *this; } raw_storage_iterator & operator++() { ++p; return *this; } raw_storage_iterator operator++(int) { raw_storage_iterator t = *this; ++p; return t; } }; template _UCXXEXPORT pair get_temporary_buffer(ptrdiff_t n){ pair retval; retval.first = static_cast(malloc(n * sizeof(T))); if(retval.first == 0){ retval.second = 0; }else{ retval.second = n; } return retval; } template _UCXXEXPORT void return_temporary_buffer(T* p){ free(p); } template class _UCXXEXPORT auto_ptr{ private: T * object; template struct auto_ptr_ref{ Y * p; }; public: typedef T element_type; explicit auto_ptr(T* p =0) throw() : object(p){ } auto_ptr(auto_ptr& p) throw() : object(p.release()){ } auto_ptr(auto_ptr_ref r) throw() : object(r.p){ r.p = 0; } template auto_ptr(auto_ptr& p) throw() : object(p.release()){ } auto_ptr& operator=(auto_ptr& p) throw(){ if(&p == this){ return *this; } delete object; object = p.release(); return *this; } template auto_ptr& operator=(auto_ptr& p) throw(){ if(&p == this){ return *this; } delete object; object = p.release(); return *this; } ~auto_ptr(){ delete object; } T& operator*() const throw(){ return *object; } T* operator->() const throw(){ return object; } T* get() const throw(){ return object; } T* release() throw(){ T * temp(object); object = 0; return temp; } void reset(T * p=0) throw(){ if(p != object){ delete object; object = p; } } template operator auto_ptr_ref() throw(){ auto_ptr_ref retval; retval.p = object; object = 0; return retval; } template operator auto_ptr() throw(){ auto_ptr retval(object); object = 0; return retval; } }; } //namespace std #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/new ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define throw(...) #include #include #include #ifndef __STD_NEW_OPERATOR #define __STD_NEW_OPERATOR 1 #pragma GCC visibility push(default) namespace std{ class _UCXXEXPORT bad_alloc : public exception {}; struct _UCXXEXPORT nothrow_t {}; extern const nothrow_t nothrow; typedef void (*new_handler)(); _UCXXEXPORT new_handler set_new_handler(new_handler new_p) throw(); } _UCXXEXPORT void* operator new(std::size_t numBytes) throw(std::bad_alloc); _UCXXEXPORT void operator delete(void* ptr) throw(); #if __cpp_sized_deallocation _UCXXEXPORT void operator delete(void* ptr, std::size_t) throw(); #endif _UCXXEXPORT void* operator new[](std::size_t numBytes) throw(std::bad_alloc); _UCXXEXPORT void operator delete[](void * ptr) throw(); #if __cpp_sized_deallocation _UCXXEXPORT void operator delete[](void * ptr, std::size_t) throw(); #endif #ifndef NO_NOTHROW _UCXXEXPORT void* operator new(std::size_t numBytes, const std::nothrow_t& ) throw(); _UCXXEXPORT void operator delete(void* ptr, const std::nothrow_t& ) throw(); _UCXXEXPORT void* operator new[](std::size_t numBytes, const std::nothrow_t& ) throw(); _UCXXEXPORT void operator delete[](void* ptr, const std::nothrow_t& ) throw(); #endif /* Placement operators */ inline void* operator new(std::size_t, void* ptr) throw() {return ptr; } inline void operator delete(void* , void *) throw() { } inline void* operator new[](std::size_t, void *p) throw() { return p; } inline void operator delete[](void* , void *) throw() {} #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/new_handler.cpp ================================================ /* Copyright (C) 2005 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include const std::nothrow_t std::nothrow = { }; //Name selected to be compatable with g++ code std::new_handler __new_handler; _UCXXEXPORT std::new_handler std::set_new_handler(std::new_handler new_p) throw(){ std::new_handler retval = __new_handler; __new_handler = new_p; return retval; } ================================================ FILE: external/arduino/stlarduino/new_op.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ // Arduino 1.0 contains an implementation for this. #if ARDUINO < 100 #include #include #include _UCXXEXPORT void* operator new(std::size_t numBytes) throw(std::bad_alloc){ //C++ stardard 5.3.4.8 requires that a valid pointer be returned for //a call to new(0). Thus: if(numBytes == 0){ numBytes = 1; } void * p = malloc(numBytes); if(p == 0){ std::__throw_bad_alloc(); } return p; } #endif ================================================ FILE: external/arduino/stlarduino/new_opnt.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #ifndef NO_NOTHROW _UCXXEXPORT void* operator new(std::size_t numBytes, const std::nothrow_t& ) throw(){ return malloc(numBytes); } #endif ================================================ FILE: external/arduino/stlarduino/new_opv.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ // Arduino 1.0 contains an implementation for this. #if ARDUINO < 100 #include #include #include _UCXXEXPORT void* operator new[](std::size_t numBytes) throw(std::bad_alloc){ //C++ stardard 5.3.4.8 requires that a valid pointer be returned for //a call to new(0). Thus: if(numBytes == 0){ numBytes = 1; } void * p = malloc(numBytes); if(p == 0){ std::__throw_bad_alloc(); } return p; } #endif ================================================ FILE: external/arduino/stlarduino/new_opvnt.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #ifndef NO_NOTHROW _UCXXEXPORT void* operator new[](std::size_t numBytes, const std::nothrow_t& ) throw(){ return malloc(numBytes); } #endif ================================================ FILE: external/arduino/stlarduino/nonstd-function.h ================================================ #pragma once #ifdef __AVR__ #include //extern void * operator new(size_t size, void * ptr); namespace std{ templatestruct tag{using type=T;}; templateusing type_t=typename Tag::type; using size_t=decltype(sizeof(int)); //move template T&& move(T&t){return static_cast(t);} //forward template struct remove_reference:tag{}; template struct remove_reference:tag{}; templateusing remove_reference_t=type_t>; template T&& forward( remove_reference_t& t ) { return static_cast(t); } template T&& forward( remove_reference_t&& t ) { return static_cast(t); } //decay template struct remove_const:tag{}; template struct remove_const:tag{}; template struct remove_volatile:tag{}; template struct remove_volatile:tag{}; template struct remove_cv:remove_const>>{}; template struct decay3:remove_cv{}; template struct decay3:tag{}; template struct decay2:decay3{}; template struct decay2:tag{}; template struct decay:decay2>{}; template using decay_t=type_t>; //is_convertible template T declval(); // no implementation template struct integral_constant{ static constexpr T value=t; constexpr integral_constant() {}; constexpr operator T()const{ return value; } constexpr T operator()()const{ return value; } }; template using bool_t=integral_constant; using true_type=bool_t; using false_type=bool_t; templatestruct voider:tag{}; templateusing void_t=type_t>; namespace details { templateclass Z, class, class...Ts> struct can_apply:false_type{}; templateclass Z, class...Ts> struct can_apply>, Ts...>:true_type{}; } templateclass Z, class...Ts> using can_apply = details::can_apply; namespace details { template using try_convert = decltype( To{declval()} ); } template struct is_convertible : can_apply< details::try_convert, From, To > {}; template<> struct is_convertible:true_type{}; //enable_if template struct enable_if {}; template struct enable_if:tag{}; template using enable_if_t=type_t>; //res_of namespace details { template using invoke_t = decltype( declval()(declval()...) ); template struct res_of {}; template struct res_of>>: tag> {}; } template using res_of = details::res_of; template using res_of_t=type_t>; //aligned_storage template struct alignas(align) aligned_storage_t { char buff[size]; }; //is_same template struct is_same:false_type{}; template struct is_same:true_type{}; template struct small_task; template struct small_task{ struct vtable_t { void(*mover)(void* src, void* dest); void(*destroyer)(void*); R(*invoke)(void * t, Args&&...args); template static vtable_t * get() { static vtable_t table = { [](void* src, void*dest) { new(dest) T(move(*static_cast(src))); }, [](void* t){ static_cast(t)->~T(); }, [](void * t, Args&&...args)->R { return (*static_cast(t))(forward(args)...); } }; return &table; } }; vtable_t * table = nullptr; aligned_storage_t data; template, enable_if_t{}>* = nullptr, enable_if_t, R >{}>* = nullptr > small_task( F&& f ): table( vtable_t::template get() ) { static_assert( sizeof(dF) <= sz, "object too large" ); static_assert( alignof(dF) <= algn, "object too aligned" ); new(&data) dF(forward(f)); } ~small_task() { if (table) table->destroyer(&data); } small_task(const small_task& o): table(o.table) { data = o.data; } small_task(small_task&& o): table(o.table) { if (table) table->mover(&o.data, &data); } small_task(){} small_task& operator=(const small_task& o){ this->~small_task(); new(this) small_task( move(o) ); return *this; } small_task& operator=(small_task&& o){ this->~small_task(); new(this) small_task( move(o) ); return *this; } explicit operator bool(){return table;} R operator()(Args...args){ return table->invoke(&data, forward(args)...); } }; template inline bool operator==(const small_task& __f, nullptr_t) { return !static_cast(__f); } /// @overload template inline bool operator==(nullptr_t, const small_task& __f) { return !static_cast(__f); } template inline bool operator!=(const small_task& __f, nullptr_t) { return static_cast(__f); } /// @overload template inline bool operator!=(nullptr_t, const small_task& __f) { return static_cast(__f); } template using function = small_task; } #endif ================================================ FILE: external/arduino/stlarduino/numeric ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #ifndef __STD_NUMERIC_HEADER #define __STD_NUMERIC_HEADER 1 #pragma GCC visibility push(default) namespace std{ template _UCXXEXPORT T accumulate(InputIterator first, InputIterator last, T init) { while(first != last){ init = init + *first; ++first; } return init; } template _UCXXEXPORT T accumulate(InputIterator first, InputIterator last, T init, BinaryOperation binary_op) { while(first != last){ init = binary_op(init, *first); ++first; } return init; } template _UCXXEXPORT T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init) { while(first1 != last1){ init = init + *first1 * *first2; ++first1; ++first2; } return init; } template _UCXXEXPORT T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init, BinaryOperation1 binary_op1, BinaryOperation2 binary_op2) { while(first1 != last1){ init = binary_op1(init, binary_op2(*first1, *first2)); ++first1; ++first2; } return init; } template _UCXXEXPORT OutputIterator partial_sum(InputIterator first, InputIterator last, OutputIterator result) { OutputIterator temp(result); *result = *first; ++first; ++result; while(first != last){ *result = *first + *temp; temp = result; ++first; ++result; } return result; } template _UCXXEXPORT OutputIterator partial_sum(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op) { OutputIterator temp(result); *result = *first; ++first; ++result; while(first != last){ *result = binary_op(*first, *temp); temp = result; ++first; ++result; } return result; } template _UCXXEXPORT OutputIterator adjacent_difference(InputIterator first, InputIterator last, OutputIterator result) { OutputIterator temp(first); *result = *first; ++first; ++result; while(first != last){ *result = *first - *temp; temp = first; ++first; ++result; } return result; } template _UCXXEXPORT OutputIterator adjacent_difference(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op) { OutputIterator temp(first); *result = *first; ++first; ++result; while(first != last){ *result = binary_op(*first, *temp); temp = first; ++first; ++result; } return result; } } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/numeric.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include namespace std{ } ================================================ FILE: external/arduino/stlarduino/ostream ================================================ /* Copyright (C) 2004-2008 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #ifndef STD_HEADER_OSTREAM #define STD_HEADER_OSTREAM 1 #include #include #include #include #pragma GCC visibility push(default) namespace std { template class basic_ostream; typedef basic_ostream ostream; #ifdef __UCLIBCXX_HAS_WCHAR__ typedef basic_ostream wostream; #endif template basic_ostream& endl(basic_ostream& os); template basic_ostream& ends(basic_ostream& os); template basic_ostream& flush(basic_ostream& os); template class _UCXXEXPORT basic_ostream : virtual public basic_ios { public: typedef charT char_type; typedef typename traits::int_type int_type; typedef typename traits::pos_type pos_type; typedef typename traits::off_type off_type; typedef traits traits_type; _UCXXEXPORT basic_ostream(basic_streambuf* sb) : basic_ios(sb) { basic_ios::init(sb); } virtual _UCXXEXPORT ~basic_ostream(); class sentry; _UCXXEXPORT basic_ostream& operator<<(basic_ostream& (*pf)(basic_ostream&)){ return pf(*this); } _UCXXEXPORT basic_ostream& operator<<(basic_ios& (*pf)(basic_ios&)){ pf(*this); return *this; } _UCXXEXPORT basic_ostream& operator<<(ios_base& (*pf)(ios_base&)){ pf(*this); return *this; } basic_ostream& operator<<(bool n); basic_ostream& operator<<(short n); basic_ostream& operator<<(unsigned short n); basic_ostream& operator<<(int n); basic_ostream& operator<<(unsigned int n); basic_ostream& operator<<(long n); basic_ostream& operator<<(unsigned long n); basic_ostream& operator<<(float f); basic_ostream& operator<<(double f); basic_ostream& operator<<(long double f); basic_ostream& operator<<(void* p); basic_ostream& operator<<(basic_streambuf* sb); _UCXXEXPORT basic_ostream& put(char_type c){ if(basic_ostream::traits_type::eq_int_type( basic_ios::mstreambuf->sputc(c), basic_ostream::traits_type::eof())) { basic_ios::setstate(ios_base::eofbit); } return *this; } _UCXXEXPORT basic_ostream& write(const char_type* s, streamsize n){ if(basic_ostream::traits_type::eq_int_type( basic_ios::mstreambuf->sputn(s, n), basic_ostream::traits_type::eof()) ){ basic_ios::setstate(ios_base::eofbit); } return *this; } _UCXXEXPORT basic_ostream& flush(){ if(basic_ios::mstreambuf->pubsync() == -1){ basic_ios::setstate(ios_base::badbit); } return *this; } _UCXXEXPORT pos_type tellp(){ if(basic_ios::fail() != false){ return pos_type(-1); } return basic_ios::rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out); } _UCXXEXPORT basic_ostream& seekp(pos_type pos){ if( basic_ios::fail() != true ){ basic_ios::rdbuf()->pubseekpos(pos); } return *this; } _UCXXEXPORT basic_ostream& seekp(off_type off, ios_base::seekdir dir){ if( basic_ios::fail() != true){ basic_ios::rdbuf()->pubseekoff(off, dir); } return *this; } _UCXXEXPORT void printout(const char_type* s, streamsize n){ streamsize extra = ios::width() - n; if ((ios::flags()&ios::adjustfield) == ios::right){ while (extra > 0) { --extra; put(ios::fill()); } } write(s, n); if ((ios::flags()&ios::adjustfield) == ios::left) { while (extra > 0) { --extra; put(ios::fill()); } } // Width value only applies for the next output operation. Reset to zero. ios::width(0); } protected: basic_ostream(const basic_ostream &){ } basic_ostream & operator=(const basic_ostream &){ return *this; } }; //Implementations of template functions. To allow for partial specialization template _UCXXEXPORT basic_ostream::~basic_ostream(){ } template _UCXXEXPORT basic_ostream& basic_ostream::operator<<(bool n){ sentry s(*this); if( basic_ios::flags() & ios_base::boolalpha){ if(n){ printout("true", 4); }else{ printout("false", 5); } }else{ if(n){ printout("1", 1); }else{ printout("0", 1); } } if(basic_ios::flags() & ios_base::unitbuf){ flush(); } return *this; } template _UCXXEXPORT basic_ostream& basic_ostream::operator<<(unsigned short n){ sentry s(*this); __ostream_printout::printout(*this, n); return *this; } template _UCXXEXPORT basic_ostream& basic_ostream::operator<<(short n){ sentry s(*this); __ostream_printout::printout(*this, n); return *this; } template _UCXXEXPORT basic_ostream& basic_ostream::operator<<(int n){ sentry s(*this); __ostream_printout::printout(*this, n); return *this; } template _UCXXEXPORT basic_ostream& basic_ostream::operator<<(unsigned int n){ sentry s(*this); __ostream_printout::printout(*this, n); return *this; } template _UCXXEXPORT basic_ostream& basic_ostream::operator<<(long n){ sentry s(*this); __ostream_printout::printout(*this, n); return *this; } template _UCXXEXPORT basic_ostream& basic_ostream::operator<<(unsigned long n) { sentry s(*this); __ostream_printout::printout(*this, n); return *this; } template _UCXXEXPORT basic_ostream& basic_ostream::operator<<(float f){ sentry s(*this); __ostream_printout::printout(*this, f); return *this; } template _UCXXEXPORT basic_ostream& basic_ostream::operator<<(double f){ sentry s(*this); __ostream_printout::printout(*this, f); return *this; } template _UCXXEXPORT basic_ostream& basic_ostream::operator<<(long double f){ sentry s(*this); __ostream_printout::printout(*this, f); return *this; } template _UCXXEXPORT basic_ostream& basic_ostream::operator<<(void* p){ sentry s(*this); char buffer[20]; printout(buffer, snprintf(buffer, 20, "%p", p) ); if(basic_ios::flags() & ios_base::unitbuf){ flush(); } return *this; } template _UCXXEXPORT basic_ostream& basic_ostream::operator<<(basic_streambuf* sb) { sentry s(*this); if(sb == 0){ basic_ios::setstate(ios_base::badbit); return *this; } typename traits::int_type c; while(basic_ios::good() && (c = sb->sbumpc()) != traits::eof() ){ put(c); } if(basic_ios::flags() & ios_base::unitbuf){ flush(); } return *this; } /*Template Specializations*/ #ifdef __UCLIBCXX_EXPAND_OSTREAM_CHAR__ #ifndef __UCLIBCXX_COMPILE_OSTREAM__ #ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ template <> _UCXXEXPORT ostream::~basic_ostream(); #endif // __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ template <> _UCXXEXPORT ostream & ostream::flush(); template <> _UCXXEXPORT ostream & ostream::operator<<(bool n); template <> _UCXXEXPORT ostream & ostream::operator<<(short int n); template <> _UCXXEXPORT ostream & ostream::operator<<(unsigned short int n); template <> _UCXXEXPORT ostream & ostream::operator<<(int n); template <> _UCXXEXPORT ostream & ostream::operator<<(unsigned int n); template <> _UCXXEXPORT ostream & ostream::operator<<(long n); template <> _UCXXEXPORT ostream & ostream::operator<<(unsigned long n); template <> _UCXXEXPORT ostream & ostream::operator<<(float f); template <> _UCXXEXPORT ostream & ostream::operator<<(double f); template <> _UCXXEXPORT ostream & ostream::operator<<(long double f); template <> _UCXXEXPORT ostream & ostream::operator<<(void* p); template <> _UCXXEXPORT ostream & ostream::operator<<(basic_streambuf >* sb); #endif #endif template class _UCXXEXPORT basic_ostream::sentry { bool ok; public: explicit _UCXXEXPORT sentry(basic_ostream& os): ok(true){ if(os.good() !=0){ //Prepare for output } //Flush any tied buffer if(os.tie() !=0 ){ os.tie()->flush(); } } _UCXXEXPORT ~sentry() { } _UCXXEXPORT operator bool() { return ok; } }; #ifdef __UCLIBCXX_EXPAND_OSTREAM_CHAR__ #ifndef __UCLIBCXX_COMPILE_OSTREAM__ #ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ template <> _UCXXEXPORT ostream::sentry::sentry(ostream & os); template <> _UCXXEXPORT ostream::sentry::~sentry(); #endif //__UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ #endif #endif //Non - class functions template _UCXXEXPORT basic_ostream& operator<<(basic_ostream& out, charT c) { typename basic_ostream::sentry s(out); out.put(c); return out; } template _UCXXEXPORT basic_ostream& operator<<(basic_ostream& out, char c) { typename basic_ostream::sentry s(out); out.put(c); return out; } template _UCXXEXPORT basic_ostream& operator<<(basic_ostream& out, char c) { typename basic_ostream::sentry s(out); out.put(c); return out; } // signed and unsigned template _UCXXEXPORT basic_ostream& operator<<(basic_ostream& out, signed char c) { typename basic_ostream::sentry s(out); out.put(c); return out; } template _UCXXEXPORT basic_ostream& operator<<(basic_ostream& out, unsigned char c) { typename basic_ostream::sentry s(out); out.put(c); return out; } template _UCXXEXPORT basic_ostream& operator<<(basic_ostream& out, const charT* c) { typename basic_ostream::sentry s(out); out.printout(c, traits::length(c) ); return out; } template _UCXXEXPORT basic_ostream& operator<<(basic_ostream& out, const char* c) { typename basic_ostream::sentry s(out); out.printout(c, char_traits::length(c) ); return out; } // partial specializations template _UCXXEXPORT basic_ostream& operator<<(basic_ostream& out, const char* c) { typename basic_ostream::sentry s(out); out.printout(c, traits::length(c)); return out; } #ifdef __UCLIBCXX_HAS_WCHAR__ template _UCXXEXPORT basic_ostream& operator<<(basic_ostream& out, const char* c) { typename basic_ostream::sentry s(out); size_t numChars = char_traits::length(c); wchar_t * temp = new wchar_t[numChars]; for(size_t i=0; i < numChars; ++i){ temp[i] = out.widen(c[i]); } out.printout(temp, numChars); return out; } #endif // signed and unsigned template _UCXXEXPORT basic_ostream& operator<<(basic_ostream& out, const signed char* c) { typename basic_ostream::sentry s(out); out.printout(reinterpret_cast(c), traits::length( reinterpret_cast(c))); return out; } template _UCXXEXPORT basic_ostream& operator<<(basic_ostream& out, const unsigned char* c) { typename basic_ostream::sentry s(out); out.printout(reinterpret_cast(c), traits::length( reinterpret_cast(c))); return out; } template _UCXXEXPORT basic_ostream& endl(basic_ostream& os) { typename basic_ostream::sentry s(os); os.put('\n'); os.flush(); return os; } template _UCXXEXPORT basic_ostream& ends(basic_ostream& os) { typename basic_ostream::sentry s(os); os.put(traits::eos()); return os; } template _UCXXEXPORT basic_ostream& flush(basic_ostream& os){ typename basic_ostream::sentry s(os); os.flush(); return os; } #ifdef __UCLIBCXX_EXPAND_OSTREAM_CHAR__ #ifndef __UCLIBCXX_COMPILE_OSTREAM__ template <> _UCXXEXPORT ostream & endl(ostream & os); template <> _UCXXEXPORT ostream & flush(ostream & os); template <> _UCXXEXPORT ostream & operator<<(ostream & out, char c); template <> _UCXXEXPORT ostream & operator<<(ostream & out, const char* c); template <> _UCXXEXPORT ostream & operator<<(ostream & out, unsigned char c); template <> _UCXXEXPORT ostream & operator<<(ostream & out, unsigned const char* c); #endif #endif #ifndef __STRICT_ANSI__ //Support for output of long long data types template _UCXXEXPORT basic_ostream& operator<<(basic_ostream& os, signed long long int i) { typename basic_ostream::sentry s(os); __ostream_printout::printout(os, i); return os; } template _UCXXEXPORT basic_ostream& operator<<(basic_ostream& os, unsigned long long int i) { typename basic_ostream::sentry s(os); __ostream_printout::printout(os, i); return os; } #endif //__STRICT_ANSI__ } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/ostream.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define __UCLIBCXX_COMPILE_OSTREAM__ 1 #include namespace std{ #ifdef __UCLIBCXX_EXPAND_OSTREAM_CHAR__ #ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ template _UCXXEXPORT ostream::~basic_ostream(); #endif //__UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ template _UCXXEXPORT ostream & ostream::flush(); template _UCXXEXPORT ostream & ostream::operator<<(bool n); template _UCXXEXPORT ostream & ostream::operator<<(short int n); template _UCXXEXPORT ostream & ostream::operator<<(unsigned short int n); template _UCXXEXPORT ostream & ostream::operator<<(int n); template _UCXXEXPORT ostream & ostream::operator<<(unsigned int n); template _UCXXEXPORT ostream & ostream::operator<<(long n); template _UCXXEXPORT ostream & ostream::operator<<(unsigned long n); template _UCXXEXPORT ostream & ostream::operator<<(float f); template _UCXXEXPORT ostream & ostream::operator<<(double f); template _UCXXEXPORT ostream & ostream::operator<<(long double f); template _UCXXEXPORT ostream & ostream::operator<<(void* p); template _UCXXEXPORT ostream & ostream::operator<<(basic_streambuf >* sb); #ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ template _UCXXEXPORT ostream::sentry::sentry(ostream & os); template _UCXXEXPORT ostream::sentry::~sentry(); #endif //__UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ template _UCXXEXPORT ostream & endl(ostream & os); template _UCXXEXPORT ostream & flush(ostream & os); template _UCXXEXPORT ostream & operator<<(ostream & out, char c); template _UCXXEXPORT ostream & operator<<(ostream & out, const char* c); template _UCXXEXPORT ostream & operator<<(ostream & out, unsigned char c); template _UCXXEXPORT ostream & operator<<(ostream & out, const unsigned char* c); #endif } ================================================ FILE: external/arduino/stlarduino/ostream_helpers ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include // for floor() #ifndef __STD_HEADER_OSTREAM_HELPERS #define __STD_HEADER_OSTREAM_HELPERS 1 #pragma GCC visibility push(default) namespace std{ int arduinoPrintFloat(double number, uint8_t digits, char *buffer, size_t buffer_size); /* We are making the following template class for serveral reasons. Firstly, * we want to keep the main ostream code neat and tidy. Secondly, we want it * to be easy to do partial specialization of the ostream code so that it can * be expanded and put into the library. This will allow us to make application * code smaller at the expense of increased library size. This is a fair * trade-off when there are multiple applications being compiled. Also, this * feature will be used optionally via configuration options. It will also * allow us to keep the code bases in sync, dramatically simplifying the * maintenance required. We specialized for char because wchar and others * require different scanf functions */ template class _UCXXEXPORT __ostream_printout{ public: static void printout(basic_ostream& stream, const dataType n); }; template class _UCXXEXPORT __ostream_printout{ public: static void printout(basic_ostream& stream, const signed long int n) { char buffer[20]; const char * c_ld = "%ld"; const char * c_lo = "%lo"; const char * c_lX = "%lX"; const char * c_lx = "%lx"; const char * c_hashlo = "%#lo"; const char * c_hashlX = "%#lX"; const char * c_hashlx = "%#lx"; const char * formatString=0; if( stream.flags() & ios_base::dec){ formatString = c_ld; }else if( stream.flags() & ios_base::oct){ if( stream.flags() & ios_base::showbase){ formatString = c_hashlo; }else{ formatString = c_lo; } }else if (stream.flags() & ios_base::hex){ if(stream.flags() & ios_base::showbase){ if(stream.flags() & ios_base::uppercase){ formatString = c_hashlX; }else{ formatString = c_hashlx; } }else{ if(stream.flags() & ios_base::uppercase){ formatString = c_lX; }else{ formatString = c_lx; } } } stream.printout(buffer, snprintf(buffer, 20, formatString, n) ); if(stream.flags() & ios_base::unitbuf){ stream.flush(); } } }; template class _UCXXEXPORT __ostream_printout{ public: static void printout(basic_ostream& stream, const unsigned long int n) { char buffer[20]; const char * c_lo = "%lo"; const char * c_lu = "%lu"; const char * c_lX = "%lX"; const char * c_lx = "%lx"; const char * c_hashlo = "%#lo"; const char * c_hashlX = "%#lX"; const char * c_hashlx = "%#lx"; const char * formatString=0; if( stream.flags() & ios_base::dec){ formatString = c_lu; }else if( stream.flags() & ios_base::oct){ if( stream.flags() & ios_base::showbase){ formatString = c_hashlo; }else{ formatString = c_lo; } }else if (stream.flags() & ios_base::hex){ if(stream.flags() & ios_base::showbase){ if(stream.flags() & ios_base::uppercase){ formatString = c_hashlX; }else{ formatString = c_hashlx; } }else{ if(stream.flags() & ios_base::uppercase){ formatString = c_lX; }else{ formatString = c_lx; } } } stream.printout(buffer, snprintf(buffer, 20, formatString, n)); if(stream.flags() & ios_base::unitbuf){ stream.flush(); } } }; #ifndef __STRICT_ANSI__ template class _UCXXEXPORT __ostream_printout{ public: static void printout(basic_ostream& stream, const signed long long int n) { char buffer[28]; const char * lld = "%lld"; const char * llo = "%llo"; const char * llX = "%llX"; const char * llx = "%llx"; const char * hashllo = "%#llo"; const char * hashllX = "%#llX"; const char * hashllx = "%#llx"; const char * formatString=0; if( stream.flags() & ios_base::dec){ formatString = lld; }else if( stream.flags() & ios_base::oct){ if( stream.flags() & ios_base::showbase){ formatString = hashllo; }else{ formatString = llo; } }else if (stream.flags() & ios_base::hex){ if(stream.flags() & ios_base::showbase){ if(stream.flags() & ios_base::uppercase){ formatString = hashllX; }else{ formatString = hashllx; } }else{ if(stream.flags() & ios_base::uppercase){ formatString = llX; }else{ formatString = llx; } } } stream.printout(buffer, snprintf(buffer, 27, formatString, n) ); if(stream.flags() & ios_base::unitbuf){ stream.flush(); } } }; template class _UCXXEXPORT __ostream_printout{ public: static void printout(basic_ostream& stream, const unsigned long long int n) { char buffer[28]; const char * llo = "%llo"; const char * llu = "%llu"; const char * llX = "%llX"; const char * llx = "%llx"; const char * hashllo = "%#llo"; const char * hashllX = "%#llX"; const char * hashllx = "%#llx"; const char * formatString=0; if( stream.flags() & ios_base::dec){ formatString = llu; }else if( stream.flags() & ios_base::oct){ if( stream.flags() & ios_base::showbase){ formatString = hashllo; }else{ formatString = llo; } }else if (stream.flags() & ios_base::hex){ if(stream.flags() & ios_base::showbase){ if(stream.flags() & ios_base::uppercase){ formatString = hashllX; }else{ formatString = hashllx; } }else{ if(stream.flags() & ios_base::uppercase){ formatString = llX; }else{ formatString = llx; } } } stream.printout(buffer, snprintf(buffer, 27, formatString, n) ); if(stream.flags() & ios_base::unitbuf){ stream.flush(); } } }; #endif //__STRICT_ANSI__ // FIXME: Improve printing of doubles and floats. template class _UCXXEXPORT __ostream_printout{ public: static void printout(basic_ostream& stream, const double f) { char buffer[32]; int length; length = arduinoPrintFloat(f, 2, &buffer[0], 32); /* if(stream.flags() & ios_base::scientific){ if(stream.flags() & ios_base::uppercase){ length = snprintf(buffer, 32, "%*.*E", static_cast(stream.width()),static_cast(stream.precision()), f); }else{ length = snprintf(buffer, 32, "%*.*e", static_cast(stream.width()),static_cast(stream.precision()), f); } } else if(stream.flags() & ios_base::fixed){ length = snprintf(buffer, 32, "%*.*f",static_cast(stream.width()),static_cast(stream.precision()), f); } else { length = snprintf(buffer, 32, "%*.*g",static_cast(stream.width()),static_cast(stream.precision()), f); } */ stream.printout(buffer, length); if(stream.flags() & ios_base::unitbuf){ stream.flush(); } } }; template class _UCXXEXPORT __ostream_printout{ public: static void printout(basic_ostream& stream, const float f) { char buffer[32]; int length; length = arduinoPrintFloat(f, 2, &buffer[0], 32); /* if(stream.flags() & ios_base::scientific){ if(stream.flags() & ios_base::uppercase){ length = snprintf(buffer, 32, "%*.*LE", static_cast(stream.width()), static_cast(stream.precision()), f); }else{ length = snprintf(buffer, 32, "%*.*Le", static_cast(stream.width()), static_cast(stream.precision()), f); } } else if(stream.flags() & ios_base::fixed){ length = snprintf(buffer, 32, "%*.*Lf", static_cast(stream.width()), static_cast(stream.precision()), f); } else { length = snprintf(buffer, 32, "%*.*Lg", static_cast(stream.width()), static_cast(stream.precision()), f); } */ stream.printout(buffer, length); if(stream.flags() & ios_base::unitbuf){ stream.flush(); } } }; #ifdef __UCLIBCXX_HAS_WCHAR__ template class _UCXXEXPORT __ostream_printout{ public: static void printout(basic_ostream& stream, const signed long int n) { wchar_t buffer[20]; if( stream.flags() & ios_base::dec){ stream.printout(buffer, swprintf(buffer, 20, L"%ld", n)); }else if( stream.flags() & ios_base::oct){ if( stream.flags() & ios_base::showbase){ stream.printout(buffer, swprintf(buffer, 20, L"%#lo", n)); }else{ stream.printout(buffer, swprintf(buffer, 20, L"%lo", n) ); } }else if (stream.flags() & ios_base::hex){ if(stream.flags() & ios_base::showbase){ if(stream.flags() & ios_base::uppercase){ stream.printout(buffer, swprintf(buffer, 20, L"%#lX", n) ); }else{ stream.printout(buffer, swprintf(buffer, 20, L"%#lx", n) ); } }else{ if(stream.flags() & ios_base::uppercase){ stream.printout(buffer, swprintf(buffer, 20, L"%lX", n) ); }else{ stream.printout(buffer, swprintf(buffer, 20, L"%lx", n) ); } } } if(stream.flags() & ios_base::unitbuf){ stream.flush(); } } }; template class _UCXXEXPORT __ostream_printout{ public: static void printout(basic_ostream& stream, const unsigned long int n) { wchar_t buffer[20]; if( stream.flags() & ios_base::dec){ stream.printout(buffer, swprintf(buffer, 20, L"%lu", n)); }else if( stream.flags() & ios_base::oct){ if( stream.flags() & ios_base::showbase){ stream.printout(buffer, swprintf(buffer, 20, L"%#lo", n)); }else{ stream.printout(buffer, swprintf(buffer, 20, L"%lo", n) ); } }else if (stream.flags() & ios_base::hex){ if(stream.flags() & ios_base::showbase){ if(stream.flags() & ios_base::uppercase){ stream.printout(buffer, swprintf(buffer, 20, L"%#lX", n) ); }else{ stream.printout(buffer, swprintf(buffer, 20, L"%#lx", n) ); } }else{ if(stream.flags() & ios_base::uppercase){ stream.printout(buffer, swprintf(buffer, 20, L"%lX", n) ); }else{ stream.printout(buffer, swprintf(buffer, 20, L"%lx", n) ); } } } if(stream.flags() & ios_base::unitbuf){ stream.flush(); } } }; #ifndef __STRICT_ANSI__ template class _UCXXEXPORT __ostream_printout{ public: static void printout(basic_ostream& stream, const signed long long int n) { wchar_t buffer[28]; if( stream.flags() & ios_base::dec){ stream.printout(buffer, swprintf(buffer, 27, L"%lld", n)); }else if( stream.flags() & ios_base::oct){ if( stream.flags() & ios_base::showbase){ stream.printout(buffer, swprintf(buffer, 27, L"%#llo", n)); }else{ stream.printout(buffer, swprintf(buffer, 27, L"%llo", n) ); } }else if (stream.flags() & ios_base::hex){ if(stream.flags() & ios_base::showbase){ if(stream.flags() & ios_base::uppercase){ stream.printout(buffer, swprintf(buffer, 27, L"%#llX", n) ); }else{ stream.printout(buffer, swprintf(buffer, 27, L"%#llx", n) ); } }else{ if(stream.flags() & ios_base::uppercase){ stream.printout(buffer, swprintf(buffer, 27, L"%llX", n) ); }else{ stream.printout(buffer, swprintf(buffer, 27, L"%llx", n) ); } } } if(stream.flags() & ios_base::unitbuf){ stream.flush(); } } }; template class _UCXXEXPORT __ostream_printout{ public: static void printout(basic_ostream& stream, const unsigned long long int n) { wchar_t buffer[28]; if( stream.flags() & ios_base::dec){ stream.printout(buffer, swprintf(buffer, 27, L"%llu", n)); }else if( stream.flags() & ios_base::oct){ if( stream.flags() & ios_base::showbase){ stream.printout(buffer, swprintf(buffer, 27, L"%#llo", n)); }else{ stream.printout(buffer, swprintf(buffer, 27, L"%llo", n) ); } }else if (stream.flags() & ios_base::hex){ if(stream.flags() & ios_base::showbase){ if(stream.flags() & ios_base::uppercase){ stream.printout(buffer, swprintf(buffer, 27, L"%#llX", n) ); }else{ stream.printout(buffer, swprintf(buffer, 27, L"%#llx", n) ); } }else{ if(stream.flags() & ios_base::uppercase){ stream.printout(buffer, swprintf(buffer, 27, L"%llX", n) ); }else{ stream.printout(buffer, swprintf(buffer, 27, L"%llx", n) ); } } } if(stream.flags() & ios_base::unitbuf){ stream.flush(); } } }; #endif //__STRICT_ANSI__ template class _UCXXEXPORT __ostream_printout{ public: static void printout(basic_ostream& stream, const double f) { wchar_t buffer[32]; wchar_t format_string[32]; if(stream.flags() & ios_base::scientific){ if(stream.flags() & ios_base::uppercase){ swprintf(format_string, 32, L"%%%u.%uE", static_cast(stream.width()), static_cast(stream.precision())); }else{ swprintf(format_string, 32, L"%%%u.%ue", static_cast(stream.width()), static_cast(stream.precision())); } } else if(stream.flags() & ios_base::fixed){ swprintf(format_string, 32, L"%%%u.%uf", static_cast(stream.width()), static_cast(stream.precision())); } else { swprintf(format_string, 32, L"%%%u.%ug", static_cast(stream.width()), static_cast(stream.precision())); } stream.printout(buffer, swprintf(buffer, 32, format_string, f) ); if(stream.flags() & ios_base::unitbuf){ stream.flush(); } } }; template class _UCXXEXPORT __ostream_printout{ public: static void printout(basic_ostream& stream, const long double f) { wchar_t buffer[32]; wchar_t format_string[32]; if(stream.flags() & ios_base::scientific){ if(stream.flags() & ios_base::uppercase){ swprintf(format_string, 32, L"%%%u.%uLE", static_cast(stream.width()), static_cast(stream.precision())); }else{ swprintf(format_string, 32, L"%%%u.%uLe", static_cast(stream.width()), static_cast(stream.precision())); } } else if(stream.flags() & ios_base::fixed){ swprintf(format_string, 32, L"%%%u.%uLf", static_cast(stream.width()), static_cast(stream.precision())); } else { swprintf(format_string, 32, L"%%%u.%uLg", static_cast(stream.width()), static_cast(stream.precision())); } stream.printout(buffer, swprintf(buffer, 32, format_string, f) ); if(stream.flags() & ios_base::unitbuf){ stream.flush(); } } }; #endif //__UCLIBCXX_HAS_WCHAR__ } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/ostream_helpers.cpp ================================================ /* * This code is taken from the Arduino Print class. * * printf() doesn't handle floating point types on AVR. * This code helps me hack that in. It's not here permanently. * */ #include #include namespace std { int arduinoPrintFloat(double number, uint8_t digits, char *buffer, size_t buffer_size) { size_t n = 0; if (buffer_size < 4) return 0; if (isnan(number)) return snprintf(buffer, buffer_size, "nan"); if (isinf(number)) return snprintf(buffer, buffer_size, "inf"); if (number > 4294967040.0) return snprintf(buffer, buffer_size, "ovf"); // constant determined empirically if (number <-4294967040.0) return snprintf(buffer, buffer_size, "ovf"); // constant determined empirically // Handle negative numbers if (number < 0.0) { n += snprintf(&buffer[n], buffer_size-n, "-"); number = -number; } // Round correctly so that print(1.999, 2) prints as "2.00" double rounding = 0.5; for (uint8_t i=0; i= buffer_size) return n; // Print the decimal point, but only if there are digits beyond if (digits > 0) { n += snprintf(&buffer[n], buffer_size-n, "."); if (n >= buffer_size) return n; } // Extract digits from the remainder one at a time while (digits-- > 0) { remainder *= 10.0; unsigned int toPrint = (unsigned int)(remainder); n += snprintf(&buffer[n], buffer_size-n, "%u", toPrint); if (n >= buffer_size) return n; remainder -= toPrint; } return n; } } ================================================ FILE: external/arduino/stlarduino/queue ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #ifndef __HEADER_STD_QUEUE #define __HEADER_STD_QUEUE 1 #pragma GCC visibility push(default) namespace std{ template > class _UCXXEXPORT queue{ protected: Container c; public: typedef typename Container::value_type value_type; typedef typename Container::size_type size_type; typedef Container container_type; explicit queue(const Container& a = Container()) : c(a) { } bool empty() const { return c.empty(); } size_type size() const { return c.size(); } value_type& front() { return c.front(); } const value_type& front() const { return c.front(); } value_type& back() { return c.back(); } const value_type& back() const { return c.back(); } void push(const value_type& x) { c.push_back(x); } void pop() { c.pop_front(); } }; template _UCXXEXPORT bool operator==(const queue& x, const queue& y) { return (x.c == y.c); } template _UCXXEXPORT bool operator< (const queue& x, const queue& y) { return (x.c < y.c); } template _UCXXEXPORT bool operator!=(const queue& x, const queue& y) { return (x.c != y.c); } template _UCXXEXPORT bool operator> (const queue& x, const queue& y) { return (x.c > y.c); } template _UCXXEXPORT bool operator>=(const queue& x, const queue& y) { return (x.c >= y.c); } template _UCXXEXPORT bool operator<=(const queue& x, const queue& y) { return (x.c <= y.c); } template , class Compare = less > class _UCXXEXPORT priority_queue { protected: Container c; Compare comp; public: typedef typename Container::value_type value_type; typedef typename Container::size_type size_type; typedef Container container_type; explicit priority_queue(const Compare& x = Compare(), const Container& a = Container()) : c(a), comp(x) { make_heap(c.begin(), c.end(), comp) ; } template priority_queue(InputIterator first, InputIterator last, const Compare& x = Compare(), const Container& y= Container()) : c(y), comp(c) { c.insert(c.end(), first, last); make_heap(c.begin(), c.end(), comp); } bool empty() const { return c.empty(); } size_type size() const { return c.size(); } const value_type& top() const { return c.front(); } void push(const value_type& x){ c.push_back(x); push_heap(c.begin(), c.end(), comp); } void pop(){ pop_heap(c.begin(), c.end(), comp); c.pop_back(); } }; } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/queue.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include namespace std{ } ================================================ FILE: external/arduino/stlarduino/serstream ================================================ /* * serstream * Implementation of input/output streams for the Arduino serial classes * * Created on: 2 Jan 2011 * Author: Andy Brown * Modfied: Mike Matera * * http://andybrown.me.uk/ws/terms-and-conditions */ #ifndef __810370EC_AD69_4ef7_91F5_B1AA16F14712 #define __810370EC_AD69_4ef7_91F5_B1AA16F14712 #include #include #include #include #include #include #include namespace std { /* * basic_serialbuf implements an unbuffered basic_streambuf as a backing buffer * for the IO classes */ template class basic_serialbuf : public basic_streambuf { public: /* * Types used here */ typedef charT char_type; typedef typename traits::int_type int_type; /* * constructor - wraps an existing Tserial class instance */ explicit basic_serialbuf(Tserial& serial_,ios_base::openmode which_ = ios_base::in | ios_base::out) : _serial(serial_) { basic_streambuf::openedFor = which_; } /* * Required to maintain the chain */ virtual ~basic_serialbuf() { } /* * Get a reference to the wrapped object */ Tserial& serial() { return _serial; } protected: /* * Get how many bytes available */ virtual int showmanyc(){ return _serial.available(); } /* * Read up to n chars */ virtual streamsize xsgetn(char_type* c, streamsize n) { streamsize i = 0; char_type data; while((data=_serial.read())!=-1 && i < n ) { c[i] = data; ++i; } return i; } /* * Write up to n chars */ virtual streamsize xsputn(const char_type* s, streamsize n){ //_serial.print("[PUT "); //_serial.print(n); //_serial.print("] "); for(streamsize i=0;i class basic_iserialstream : public basic_istream { public: /* * Types used here */ typedef charT char_type; /* * Constructor - default the serial object to #1 * Mega users can explicity initialise with one of * the others */ explicit basic_iserialstream(Tserial& serial_) : basic_ios(&sb), basic_istream(&sb), sb(serial_,ios_base::in) { } /* * Required to maintain the chain */ virtual ~basic_iserialstream() { } /* * Initialise the baud rate */ void begin(long speed_) { sb.serial().begin(speed_); sb.serial().println(__FUNCTION__); } /* * The wrapped object */ private: basic_serialbuf sb; }; /* * Output stream */ template class basic_oserialstream : public basic_ostream { public: /* * Types used here */ typedef charT char_type; /* * Constructor - default the serial object to #1 * Mega users can explicity initialise with one of * the others */ explicit basic_oserialstream(Tserial& serial_) : basic_ios(&sb), basic_ostream(&sb), sb(serial_,ios_base::out) { } /* * Required to maintain the chain */ virtual ~basic_oserialstream() { } /* * Initialise the baud rate */ void begin(long speed_) { sb.serial().begin(speed_); } /* * The wrapped object */ private: basic_serialbuf sb; }; /* * Input/output stream */ template class basic_ioserialstream : public basic_iostream { public: /* * Types used here */ typedef charT char_type; /* * Constructor - default the serial object to #1 * Mega users can explicity initialise with one of * the others */ explicit basic_ioserialstream(Tserial& serial_) : basic_ios(&sb), basic_iostream(&sb), sb(serial_,ios_base::in | ios_base::out) { } /* * Required to maintain the chain */ virtual ~basic_ioserialstream(){ } /* * Initialise the baud rate */ void begin(long speed_) { sb.serial().begin(speed_); } /* * The wrapped object */ private: basic_serialbuf sb; }; using ::Stream; template , class Tserial=Stream> class basic_serialbuf; template , class Tserial=Stream> class basic_iserialstream; template , class Tserial=Stream> class basic_oserialstream; typedef basic_iserialstream ihserialstream; typedef basic_oserialstream ohserialstream; } #endif ================================================ FILE: external/arduino/stlarduino/set ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #ifndef __STD_HEADER_SET #define __STD_HEADER_SET #pragma GCC visibility push(default) namespace std{ template, class Allocator = allocator > class set; template, class Allocator = allocator > class multiset; /* This is the implementation for the set container. As noted above, it deviates * from ISO spec by deriving from a base class in order to reduce code redundancy. * More code could be reduced by convirting to virtual functions (thus allowing * much of the erase and insert code to be duplicated), but that would deviate from * the specifications too much to be worth the risk. */ //Implementation of set template class _UCXXEXPORT set : public __single_associative { //Default value of allocator does not meet C++ standard specs, but it works for this library //Deal with it public: typedef __single_associative base; typedef typename base::key_type key_type; typedef typename base::value_type value_type; typedef typename base::key_compare key_compare; typedef typename base::allocator_type allocator_type; typedef typename base::reference reference; typedef typename base::const_reference const_reference; typedef typename base::iterator iterator; typedef typename base::const_iterator const_iterator; typedef typename base::size_type size_type; typedef typename base::difference_type difference_type; typedef typename base::pointer pointer; typedef typename base::const_pointer const_pointer; typedef typename base::reverse_iterator reverse_iterator; typedef typename base::const_reverse_iterator const_reverse_iterator; // using base::value_compare; static const key_type v_t_k(const value_type v){ return v; } explicit set(const Compare& comp = Compare(), const Allocator& al = Allocator()) : base(comp, al, v_t_k) { } template set(InputIterator first, InputIterator last, const Compare& comp = Compare(), const Allocator& al = Allocator()) : base(first, last, comp, al, v_t_k) { } set(const set& x) : base(x) { } ~set() { } using base::operator=; using base::operator==; using base::operator!=; using base::insert; using base::erase; using base::begin; using base::end; using base::rbegin; using base::rend; using base::empty; using base::size; using base::max_size; using base::find; using base::count; using base::lower_bound; using base::upper_bound; using base::equal_range; protected: }; //Implementation of multiset template class _UCXXEXPORT multiset : public __multi_associative { //Default value of allocator does not meet C++ standard specs, but it works for this library //Deal with it public: typedef __multi_associative base; typedef typename base::key_type key_type; typedef typename base::value_type value_type; typedef typename base::key_compare key_compare; typedef typename base::allocator_type allocator_type; typedef typename base::reference reference; typedef typename base::const_reference const_reference; typedef typename base::iterator iterator; typedef typename base::const_iterator const_iterator; typedef typename base::size_type size_type; typedef typename base::difference_type difference_type; typedef typename base::pointer pointer; typedef typename base::const_pointer const_pointer; typedef typename base::reverse_iterator reverse_iterator; typedef typename base::const_reverse_iterator const_reverse_iterator; static const key_type v_t_k(const value_type v){ return v; } explicit multiset(const Compare& comp = Compare(), const Allocator& al = Allocator()) : base(comp, al, v_t_k) { } template multiset(InputIterator first, InputIterator last, const Compare& comp = Compare(), const Allocator& al = Allocator()) : base(first, last, comp, al, v_t_k) { } multiset(const multiset& x) : base(x) { } ~multiset() { } using base::operator=; using base::operator==; using base::operator!=; using base::insert; using base::erase; using base::begin; using base::end; using base::rbegin; using base::rend; using base::empty; using base::size; using base::max_size; using base::find; using base::count; using base::lower_bound; using base::upper_bound; using base::equal_range; protected: }; /* Non-member functions. These are at the end because they are not associated with any particular class. These will be implemented as I figure out exactly what all of them are supposed to do, and I have time. */ template _UCXXEXPORT bool operator< (const set& x, const set& y) { typename set::const_iterator first1 = x.begin(); typename set::const_iterator first2 = y.begin(); typename set::const_iterator last1 = x.end(); typename set::const_iterator last2 = y.end(); while(first1 != last1 && first2 != last2){ if( *first1 < *first2 ){ return true; } if( *first2 < *first1 ){ return false; } ++first1; ++first2; } return first1==last1 && first2 != last2; } template _UCXXEXPORT bool operator> (const set& x, const set& y) { typename set::const_iterator first1 = x.begin(); typename set::const_iterator first2 = y.begin(); typename set::const_iterator last1 = x.end(); typename set::const_iterator last2 = y.end(); while(first1 != last1 && first2 != last2){ if( *first1 > *first2 ){ return true; } if( *first2 > *first1 ){ return false; } ++first1; ++first2; } return first1!=last1 && first2 == last2; } template _UCXXEXPORT bool operator>= (const set& x, const set& y) { typename set::const_iterator first1 = x.begin(); typename set::const_iterator first2 = y.begin(); typename set::const_iterator last1 = x.end(); typename set::const_iterator last2 = y.end(); while(first1 != last1 && first2 != last2){ if( *first1 > *first2 ){ return true; } if( *first2 > *first1 ){ return false; } ++first1; ++first2; } return first1!=last1; } template _UCXXEXPORT bool operator<= (const set& x, const set& y) { typename set::const_iterator first1 = x.begin(); typename set::const_iterator first2 = y.begin(); typename set::const_iterator last1 = x.end(); typename set::const_iterator last2 = y.end(); while(first1 != last1 && first2 != last2){ if( *first1 < *first2 ){ return true; } if( *first2 < *first1 ){ return false; } ++first1; ++first2; } return first2!=last2; } template _UCXXEXPORT void swap (set& x, set& y) { x.swap(y); } template _UCXXEXPORT bool operator== (const multiset& x, const multiset& y) { if(x.data == y.data){ return true; } return false; } template _UCXXEXPORT bool operator< (const multiset& x, const multiset& y) { typename multiset::const_iterator first1 = x.begin(); typename multiset::const_iterator first2 = y.begin(); typename multiset::const_iterator last1 = x.end(); typename multiset::const_iterator last2 = y.end(); while(first1 != last1 && first2 != last2){ if( *first1 < *first2 ){ return true; } if( *first2 < *first1 ){ return false; } ++first1; ++first2; } return first1==last1 && first2 != last2; } template _UCXXEXPORT bool operator!= (const multiset& x, const multiset& y) { typename multiset::const_iterator first1 = x.begin(); typename multiset::const_iterator first2 = y.begin(); typename multiset::const_iterator last1 = x.end(); typename multiset::const_iterator last2 = y.end(); while(first1 != last1 && first2 != last2){ if( *first1 != *first2 ){ return true; } ++first1; ++first2; } return first1!=last1 || first2 != last2; } template _UCXXEXPORT bool operator> (const multiset& x, const multiset& y) { typename multiset::const_iterator first1 = x.begin(); typename multiset::const_iterator first2 = y.begin(); typename multiset::const_iterator last1 = x.end(); typename multiset::const_iterator last2 = y.end(); while(first1 != last1 && first2 != last2){ if( *first1 > *first2 ){ return true; } if( *first2 > *first1 ){ return false; } ++first1; ++first2; } return first1!=last1 && first2 == last2; } template _UCXXEXPORT bool operator>= (const multiset& x, const multiset& y) { typename multiset::const_iterator first1 = x.begin(); typename multiset::const_iterator first2 = y.begin(); typename multiset::const_iterator last1 = x.end(); typename multiset::const_iterator last2 = y.end(); while(first1 != last1 && first2 != last2){ if( *first1 > *first2 ){ return true; } if( *first2 > *first1 ){ return false; } ++first1; ++first2; } return first1!=last1; } template _UCXXEXPORT bool operator<= (const multiset& x, const multiset& y) { typename multiset::const_iterator first1 = x.begin(); typename multiset::const_iterator first2 = y.begin(); typename multiset::const_iterator last1 = x.end(); typename multiset::const_iterator last2 = y.end(); while(first1 != last1 && first2 != last2){ if( *first1 < *first2 ){ return true; } if( *first2 < *first1 ){ return false; } ++first1; ++first2; } return first2!=last2; } template _UCXXEXPORT void swap (multiset& x, multiset& y) { x.swap(y); } } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/set.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include namespace std{ } ================================================ FILE: external/arduino/stlarduino/sstream ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #ifndef HEADER_STD_SSTREAM #define HEADER_STD_SSTREAM 1 #include #include #include #include #include #include #pragma GCC visibility push(default) namespace std{ template class _UCXXEXPORT basic_stringbuf : public basic_streambuf { public: typedef charT char_type; typedef typename traits::int_type int_type; typedef typename traits::pos_type pos_type; typedef typename traits::off_type off_type; typedef typename Allocator::size_type size_type; explicit _UCXXEXPORT basic_stringbuf(ios_base::openmode which = ios_base::in | ios_base::out) : data(), ielement(0), oelement(0) { basic_streambuf::openedFor = which; } explicit _UCXXEXPORT basic_stringbuf(const basic_string& str, ios_base::openmode which = ios_base::in | ios_base::out) : data(str), ielement(0), oelement(0) { if(which & ios_base::ate){ oelement = data.length(); } basic_streambuf::openedFor = which; } virtual _UCXXEXPORT ~basic_stringbuf() { } _UCXXEXPORT basic_string str() const{ return data; } _UCXXEXPORT void str(const basic_string& s){ data = s; ielement = 0; if(basic_streambuf::openedFor & ios_base::ate){ oelement = data.length(); }else{ oelement = 0; } } protected: virtual _UCXXEXPORT int sync(){ return 0; } virtual _UCXXEXPORT int_type underflow(){ if(ielement >= data.length()){ return traits::eof(); } return traits::to_int_type(data[ielement]); } virtual _UCXXEXPORT int_type uflow(){ int_type retval = underflow(); if(retval != traits::eof()){ ++ielement; } return retval; } virtual _UCXXEXPORT int_type pbackfail(int_type c = traits::eof()){ //Error possibilities if(ielement == 0){ return traits::eof(); } if(ielement > data.length()){ ielement = data.length(); return traits::eof(); } //eof passed in if(traits::eq_int_type(c,traits::eof())==true){ --ielement; return traits::not_eof(c); } if(traits::eq(traits::to_char_type(c),data[ielement-1]) == true){ --ielement; return c; } if(basic_streambuf::openedFor & ios_base::out){ --ielement; data[ielement] = c; return c; } return traits::eof(); } virtual _UCXXEXPORT int showmanyc(){ return data.length() - ielement; } virtual _UCXXEXPORT streamsize xsgetn(char_type* c, streamsize n){ streamsize i = 0; while(ielement < data.length() && i < n ){ c[i] = data[ielement]; ++i; ++ielement; } return i; } virtual _UCXXEXPORT int_type overflow (int_type c = traits::eof()){ //Nothing to do if(traits::eq_int_type(c,traits::eof())){ return traits::not_eof(c); } //Actually add character, if possible if(basic_streambuf::openedFor & ios_base::out){ if(oelement >= data.length()){ data.push_back(c); }else{ data[oelement] = c; } ++oelement; return c; } //Not possible return traits::eof(); } virtual _UCXXEXPORT basic_streambuf* setbuf(charT*, streamsize){ //This function does nothing return this; } virtual _UCXXEXPORT streamsize xsputn(const char_type* s, streamsize n){ data.replace(oelement, n, s, n); oelement += n; return n; } virtual _UCXXEXPORT pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) { //Test for invalid option if( (which & ios_base::in) && (which & ios_base::out) && (way == ios_base::cur)){ return -1; } //Calculate new location size_type newpos = 0; if(way == ios_base::beg){ newpos = off; }else if(way == ios_base::cur){ if(which & ios_base::out){ newpos = data.length() + off; } if(which & ios_base::in){ newpos = ielement + off; } }else{ newpos = data.length() + off; } //Test for error conditions if(newpos > data.length()){ return -1; } //Shuffle pointers if(which & ios_base::in){ ielement = newpos; } if(which & ios_base::out){ data.resize(newpos); if(ielement > data.length()){ ielement = data.length(); } } return newpos; } virtual _UCXXEXPORT pos_type seekpos(pos_type sp, ios_base::openmode which = ios_base::in | ios_base::out) { return seekoff(sp, ios_base::beg, which); } basic_string data; size_type ielement; size_type oelement; }; template class _UCXXEXPORT basic_istringstream : public basic_istream { public: typedef charT char_type; typedef typename traits::int_type int_type; typedef typename traits::pos_type pos_type; typedef typename traits::off_type off_type; explicit _UCXXEXPORT basic_istringstream(ios_base::openmode m = ios_base::in) : basic_ios(&sb), basic_istream(&sb), sb(m) { } explicit _UCXXEXPORT basic_istringstream( const basic_string& str, ios_base::openmode which = ios_base::in) : basic_ios(&sb), basic_istream(&sb), sb(str, which) { } virtual _UCXXEXPORT ~basic_istringstream() { } _UCXXEXPORT basic_stringbuf* rdbuf() const{ return &sb; } _UCXXEXPORT basic_string str() const{ return sb.str(); } _UCXXEXPORT void str(const basic_string& s){ sb.str(s); basic_istream::clear(); } private: basic_stringbuf sb; }; template class _UCXXEXPORT basic_ostringstream : public basic_ostream { public: typedef charT char_type; typedef typename traits::int_type int_type; typedef typename traits::pos_type pos_type; typedef typename traits::off_type off_type; explicit _UCXXEXPORT basic_ostringstream(ios_base::openmode m = ios_base::out) : basic_ios(&sb), basic_ostream(&sb), sb(m) { } explicit _UCXXEXPORT basic_ostringstream(const basic_string& str, ios_base::openmode which = ios_base::out) : basic_ios(&sb), basic_ostream(&sb), sb(str, which) { } virtual _UCXXEXPORT ~basic_ostringstream() { } _UCXXEXPORT basic_stringbuf* rdbuf() const{ return &sb; } _UCXXEXPORT basic_string str() const{ return sb.str(); } _UCXXEXPORT void str(const basic_string& s){ sb.str(s); basic_ostream::clear(); } private: basic_stringbuf sb; }; template class _UCXXEXPORT basic_stringstream : public basic_iostream { public: typedef charT char_type; typedef typename traits::int_type int_type; typedef typename traits::pos_type pos_type; typedef typename traits::off_type off_type; explicit _UCXXEXPORT basic_stringstream(ios_base::openmode which = ios_base::out|ios_base::in) : basic_ios(&sb), basic_iostream(&sb), sb(which) { } explicit _UCXXEXPORT basic_stringstream(const basic_string& str, ios_base::openmode which = ios_base::out|ios_base::in) : basic_ios(&sb), basic_iostream(&sb), sb(str, which) { } virtual _UCXXEXPORT ~basic_stringstream(){ } _UCXXEXPORT basic_stringbuf* rdbuf(){ return &sb; } _UCXXEXPORT basic_string str() const{ return sb.str(); } _UCXXEXPORT void str(const basic_string& s){ sb.str(s); basic_iostream::clear(); } private: basic_stringbuf sb; }; #ifdef __UCLIBCXX_EXPAND_SSTREAM_CHAR__ #ifndef __UCLIBCXX_COMPILE_SSTREAM__ #ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ template <> _UCXXEXPORT basic_stringbuf, allocator >:: basic_stringbuf(ios_base::openmode which); template <> _UCXXEXPORT basic_stringbuf, allocator >::~basic_stringbuf(); #endif // __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ template <> _UCXXEXPORT basic_string, allocator > basic_stringbuf, allocator >::str() const; template <> _UCXXEXPORT basic_stringbuf, allocator >::int_type basic_stringbuf, allocator >:: pbackfail(basic_stringbuf, allocator >::int_type c); template <> _UCXXEXPORT basic_stringbuf, allocator >::pos_type basic_stringbuf, allocator >:: seekoff (basic_stringbuf, allocator >::off_type off, ios_base::seekdir way, ios_base::openmode which ); template <> _UCXXEXPORT basic_stringbuf, allocator >::int_type basic_stringbuf, allocator >:: overflow (basic_stringbuf, allocator >::int_type c); template <> _UCXXEXPORT basic_stringbuf, allocator >::int_type basic_stringbuf, allocator >::underflow (); template <> _UCXXEXPORT streamsize basic_stringbuf, allocator >:: xsputn(const char* s, streamsize n); #ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ template <> _UCXXEXPORT basic_stringstream, allocator >:: basic_stringstream(ios_base::openmode which); template <> _UCXXEXPORT basic_stringstream, allocator >::~basic_stringstream(); template <> _UCXXEXPORT basic_istringstream, allocator >::~basic_istringstream(); template <> _UCXXEXPORT basic_ostringstream, allocator >::~basic_ostringstream(); #endif //__UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ #endif #endif #pragma GCC visibility pop } #endif ================================================ FILE: external/arduino/stlarduino/sstream.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define __UCLIBCXX_COMPILE_SSTREAM__ 1 #include namespace std{ #ifdef __UCLIBCXX_EXPAND_SSTREAM_CHAR__ typedef char_traits tr_ch; typedef basic_stringbuf > char_stringbuf; #ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ template _UCXXEXPORT char_stringbuf::basic_stringbuf(ios_base::openmode which); template _UCXXEXPORT char_stringbuf::~basic_stringbuf(); #endif //__UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ template _UCXXEXPORT basic_string, allocator > char_stringbuf::str() const; template _UCXXEXPORT char_stringbuf::int_type char_stringbuf::pbackfail(char_stringbuf::int_type c); template _UCXXEXPORT char_stringbuf::int_type char_stringbuf::overflow(char_stringbuf::int_type c); template _UCXXEXPORT char_stringbuf::pos_type char_stringbuf::seekoff(char_stringbuf::off_type, ios_base::seekdir, ios_base::openmode); template _UCXXEXPORT char_stringbuf::int_type char_stringbuf::underflow (); template _UCXXEXPORT streamsize char_stringbuf::xsputn(const char* s, streamsize n); #ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ template _UCXXEXPORT basic_stringstream >::basic_stringstream(ios_base::openmode which); template _UCXXEXPORT basic_istringstream >::~basic_istringstream(); template _UCXXEXPORT basic_ostringstream >::~basic_ostringstream(); template _UCXXEXPORT basic_stringstream >::~basic_stringstream(); #endif //__UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ #endif } ================================================ FILE: external/arduino/stlarduino/stack ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #ifndef __HEADER_STD_STACK #define __HEADER_STD_STACK 1 #pragma GCC visibility push(default) namespace std{ template > class _UCXXEXPORT stack{ protected: Container c; public: typedef typename Container::value_type value_type; typedef typename Container::size_type size_type; typedef Container container_type; explicit stack(const Container& a = Container()) : c(a) { }; bool empty() const { return c.empty(); } size_type size() const { return c.size(); } value_type& top() { return c.back(); } const value_type& top() const { return c.back(); } void push(const value_type& x) { c.push_back(x); } void pop() { c.pop_back(); } bool operator==(const stack &x) const{ return x.c == c; } }; template _UCXXEXPORT bool operator< (const stack& x, const stack& y) { return (x.c < y.c); } template _UCXXEXPORT bool operator!=(const stack& x, const stack& y) { return (x.c != y.c); } template _UCXXEXPORT bool operator> (const stack& x, const stack& y) { return (x.c > y.c); } template _UCXXEXPORT bool operator>=(const stack& x, const stack& y) { return (x.c >= y.c); } template _UCXXEXPORT bool operator<=(const stack& x, const stack& y) { return (x.c <= y.c); } } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/stack.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include namespace std{ } ================================================ FILE: external/arduino/stlarduino/stdexcept ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #ifndef HEADER_STD_EXCEPTIONS #define HEADER_STD_EXCEPTIONS 1 //Don't include support if not needed #ifdef __UCLIBCXX_EXCEPTION_SUPPORT__ #pragma GCC visibility push(default) namespace std{ //typedef basic_string string; class _UCXXEXPORT logic_error : public exception { protected: string mstring; public: logic_error() throw(); logic_error(const string& what_arg); virtual ~logic_error() throw() {} virtual const char * what() const throw(); }; class _UCXXEXPORT domain_error : public logic_error { public: domain_error() : logic_error() {} domain_error(const string& what_arg) : logic_error(what_arg) {} virtual ~domain_error() throw() {} }; class _UCXXEXPORT invalid_argument : public logic_error { public: invalid_argument() : logic_error(){} invalid_argument(const string& what_arg) : logic_error(what_arg){} virtual ~invalid_argument() throw() {} }; class _UCXXEXPORT length_error : public logic_error { public: length_error() : logic_error(){} length_error(const string& what_arg) : logic_error(what_arg){} virtual ~length_error() throw() {} }; class _UCXXEXPORT out_of_range : public logic_error{ public: out_of_range(); out_of_range(const string & what_arg); virtual ~out_of_range() throw() {} }; class _UCXXEXPORT runtime_error : public exception{ protected: string mstring; public: runtime_error(); runtime_error(const string& what_arg); virtual ~runtime_error() throw() {} virtual const char * what() const throw(); }; class _UCXXEXPORT range_error : public runtime_error{ public: range_error() : runtime_error(){} range_error(const string& what_arg) : runtime_error(what_arg) {} virtual ~range_error() throw(){ } }; class _UCXXEXPORT overflow_error : public runtime_error{ public: overflow_error() : runtime_error(){} overflow_error(const string& what_arg) : runtime_error(what_arg) {} virtual ~overflow_error() throw(){} }; class _UCXXEXPORT underflow_error : public runtime_error{ public: underflow_error() : runtime_error(){} underflow_error(const string& what_arg) : runtime_error(what_arg) {} virtual ~underflow_error() throw(){} }; } #pragma GCC visibility pop #endif #endif ================================================ FILE: external/arduino/stlarduino/stdexcept.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #ifdef __UCLIBCXX_EXCEPTION_SUPPORT__ namespace std{ _UCXXEXPORT logic_error::logic_error() throw() : mstring(){ } _UCXXEXPORT logic_error::logic_error(const string& what_arg) : mstring(what_arg){ } _UCXXEXPORT const char * logic_error::what() const throw(){ return mstring.c_str(); } _UCXXEXPORT out_of_range::out_of_range() : logic_error(){ } _UCXXEXPORT out_of_range::out_of_range(const string & what_arg) : logic_error(what_arg) { } _UCXXEXPORT runtime_error::runtime_error() : mstring(){ } _UCXXEXPORT runtime_error::runtime_error(const string& what_arg) : mstring(what_arg){ } _UCXXEXPORT const char * runtime_error::what() const throw(){ return mstring.c_str(); } } #endif ================================================ FILE: external/arduino/stlarduino/streambuf ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #ifndef HEADER_STD_STREAMBUF #define HEADER_STD_STREAMBUF 1 #include #pragma GCC visibility push(default) namespace std{ template class _UCXXEXPORT basic_streambuf{ public: #ifdef __UCLIBCXX_SUPPORT_CDIR__ friend ios_base::Init::Init(); #endif // Types: typedef charT char_type; typedef typename traits::int_type int_type; typedef typename traits::pos_type pos_type; typedef typename traits::off_type off_type; typedef traits traits_type; virtual ~basic_streambuf(); locale pubimbue(const locale &loc); locale getloc() const{ return myLocale; } basic_streambuf* pubsetbuf(char_type* s, streamsize n){ return setbuf(s,n); } pos_type pubseekoff(off_type off, typename ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out ) { return seekoff(off,way,which); } pos_type pubseekpos(pos_type sp, ios_base::openmode which = ios_base::in | ios_base::out){ return seekpos(sp,which); } int pubsync(){ return sync(); } streamsize in_avail(); int_type snextc(); int_type sbumpc(); int_type sgetc(); streamsize sgetn(char_type* s, streamsize n){ return xsgetn(s,n); } int_type sputbackc(char_type c); int_type sungetc(); int_type sputc(char_type c); streamsize sputn(const char_type* s, streamsize n){ if(openedFor & ios_base::app){ seekoff(0, ios_base::end, ios_base::out); } return xsputn(s, n); } protected: locale myLocale; //Pointers for the "get" buffers charT * mgbeg; charT * mgnext; charT * mgend; //Pointers for the "put" buffers charT * mpbeg; charT * mpnext; charT * mpend; //In the event of null buffers Lets us know what the buffer is opened for ios_base::openmode openedFor; basic_streambuf(); basic_streambuf(const basic_streambuf > &) : myLocale(), mgbeg(0), mgnext(0), mgend(0), mpbeg(0), mpnext(0), mpend(0), openedFor(0) { } basic_streambuf > & operator=(const basic_streambuf > &){ return *this; } char_type* eback() const{ return mgbeg; } char_type* gptr() const{ return mgnext; } char_type* egptr() const{ return mgend; } void gbump(int n){ mgnext+=n; } void setg(char_type* gbeg, char_type* gnext, char_type* gend){ mgbeg = gbeg; mgnext = gnext; mgend = gend; } char_type* pbase() const{ return mpbeg; } char_type* pptr() const{ return mpnext; } char_type* epptr() const{ return mpend; } void pbump(int n){ mpnext+=n; } void setp(char_type* pbeg, char_type* pend){ mpbeg = pbeg; mpnext = pbeg; mpend = pend; } virtual void imbue(const locale &loc){ myLocale = loc; } //Virtual functions which we will not implement virtual basic_streambuf* setbuf(char_type* , streamsize){ return 0; } virtual pos_type seekoff(off_type , ios_base::seekdir, ios_base::openmode = ios_base::in | ios_base::out) { return 0; } virtual pos_type seekpos(pos_type , ios_base::openmode = ios_base::in | ios_base::out){ return 0; } virtual int sync(){ return 0; } virtual int showmanyc(){ return 0; } virtual streamsize xsgetn(char_type* , streamsize ){ return 0; } virtual int_type underflow(){ return traits_type::eof(); } virtual int_type uflow(){ int_type ret = underflow(); if (!traits_type::eq_int_type(ret, traits_type::eof())) gbump(1); return ret; } virtual int_type pbackfail(int_type c = traits::eof()){ return c; } virtual streamsize xsputn(const char_type* c, streamsize n){ //This function is designed to be replaced by subclasses for(streamsize i = 0; i< n; ++i){ if(sputc(c[i]) == traits::eof()){ return i; } } return n; } virtual int_type overflow (int_type c = traits::eof()){ return c; } }; typedef basic_streambuf streambuf; #ifdef __UCLIBCXX_HAS_WCHAR__ typedef basic_streambuf wstreambuf; #endif //Definitions put below to allow for easy expansion of code template basic_streambuf::~basic_streambuf(){ } template locale basic_streambuf::pubimbue(const locale &loc){ locale temp = myLocale; myLocale = loc; return temp; } template streamsize basic_streambuf::in_avail(){ if(mgend !=0 && mgnext !=0){ return mgend - mgnext; } return showmanyc(); } template typename basic_streambuf::int_type basic_streambuf::sbumpc(){ if(mgbeg == 0 || mgnext == mgend){ return uflow(); } int_type retval = T::to_int_type(*gptr()); gbump(1); return retval; } template typename basic_streambuf::int_type basic_streambuf::snextc(){ if(sbumpc() == T::eof() ){ return T::eof() ; } return sgetc(); } template typename basic_streambuf::int_type basic_streambuf::sgetc(){ if(mgbeg == 0 || mgnext == mgend){ return underflow(); } return T::to_int_type(*gptr()); } template typename basic_streambuf::int_type basic_streambuf::sputbackc(char_type c){ if(mgbeg == 0 || mgnext == mgbeg || !T::eq(c, gptr()[-1] )){ return pbackfail(T::to_int_type(c)); } gbump(-1); return T::to_int_type(*gptr()); } template typename basic_streambuf::int_type basic_streambuf::sungetc(){ if(mgbeg == 0 || mgnext == mgbeg){ return ios_base::failbit; } gbump(-1); return T::to_int_type(*gptr()); } template typename basic_streambuf::int_type basic_streambuf::sputc(char_type c){ if(openedFor & ios_base::app){ seekoff(0, ios_base::end, ios_base::out); } if(mpnext < mpend){ *mpnext = c; ++mpnext; }else{ return overflow( T::to_int_type(c) ); } return T::to_int_type(c); } template basic_streambuf::basic_streambuf() : myLocale(), mgbeg(0), mgnext(0), mgend(0), mpbeg(0), mpnext(0), mpend(0), openedFor(0) { } #ifdef __UCLIBCXX_EXPAND_STREAMBUF_CHAR__ #ifndef __UCLIBCXX_COMPILE_STREAMBUF__ #ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ template <> _UCXXEXPORT streambuf::basic_streambuf(); template <> _UCXXEXPORT streambuf::~basic_streambuf(); #endif //__UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ template <> _UCXXEXPORT locale streambuf::pubimbue(const locale &loc); template <> _UCXXEXPORT streamsize streambuf::in_avail(); template <> _UCXXEXPORT streambuf::int_type streambuf::sbumpc(); template <> _UCXXEXPORT streambuf::int_type streambuf::snextc(); template <> _UCXXEXPORT streambuf::int_type streambuf::sgetc(); template <> _UCXXEXPORT streambuf::int_type streambuf::sputbackc(char_type c); template <> _UCXXEXPORT streambuf::int_type streambuf::sungetc(); template <> _UCXXEXPORT streambuf::int_type streambuf::sputc(char_type c); #endif #endif } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/streambuf.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define __UCLIBCXX_COMPILE_STREAMBUF__ 1 #include namespace std{ #ifdef __UCLIBCXX_EXPAND_STREAMBUF_CHAR__ #ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ template _UCXXEXPORT streambuf::basic_streambuf(); template _UCXXEXPORT streambuf::~basic_streambuf(); #endif template _UCXXEXPORT locale streambuf::pubimbue(const locale &loc); template _UCXXEXPORT streamsize streambuf::in_avail(); template _UCXXEXPORT streambuf::int_type streambuf::sbumpc(); template _UCXXEXPORT streambuf::int_type streambuf::snextc(); template _UCXXEXPORT streambuf::int_type streambuf::sgetc(); template _UCXXEXPORT streambuf::int_type streambuf::sputbackc(char_type c); template _UCXXEXPORT streambuf::int_type streambuf::sungetc(); template _UCXXEXPORT streambuf::int_type streambuf::sputc(char_type c); #endif } ================================================ FILE: external/arduino/stlarduino/string ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #ifdef __UCLIBCXX_HAS_WCHAR__ #include #include #endif #ifndef __HEADER_STD_STRING #define __HEADER_STD_STRING 1 #pragma GCC visibility push(default) namespace std{ //Basic basic_string template, class A = allocator > class basic_string; typedef basic_string string; #ifdef __UCLIBCXX_HAS_WCHAR__ typedef basic_string wstring; #endif //template, class A = allocator > class _UCXXEXPORT basic_string template class basic_string : public std::vector { public: typedef Tr traits_type; typedef typename Tr::char_type value_type; typedef A allocator_type; typedef typename A::size_type size_type; typedef typename A::difference_type difference_type; typedef typename A::reference reference; typedef typename A::const_reference const_reference; typedef typename A::pointer pointer; typedef typename A::const_pointer const_pointer; typedef typename vector::iterator iterator; typedef typename vector::const_iterator const_iterator; typedef typename vector::reverse_iterator reverse_iterator; typedef typename vector::const_reverse_iterator const_reverse_iterator; static const size_type npos = (size_type)-1; explicit _UCXXEXPORT basic_string(const A& al = A()) : vector(al){ return; } _UCXXEXPORT basic_string(const basic_string& str, size_type pos = 0, size_type n = npos, const A& al = A()); //Below _UCXXEXPORT basic_string(const Ch* s, size_type n, const A& al = A()) : vector(al) { if(n == npos){ __throw_out_of_range(); } if (*s > 0){ resize(n); Tr::copy(vector::data, s, vector::elements); } } _UCXXEXPORT basic_string(const Ch* s, const A& al = A()); //Below _UCXXEXPORT basic_string(size_type n, Ch c, const A& al = A()) : vector(n, c, al) { } template _UCXXEXPORT basic_string(InputIterator begin, InputIterator end, const A& a = A()) :vector(begin, end) { } _UCXXEXPORT ~basic_string() { return; } _UCXXEXPORT basic_string& operator=(const basic_string& str); //Below _UCXXEXPORT basic_string& operator=(const Ch* s){ vector::clear(); if(s!=0){ size_type len = Tr::length(s); resize(len); Tr::copy( vector::data, s, len); } return *this; } _UCXXEXPORT basic_string& operator=(Ch c){ vector::clear(); vector::push_back(c); return *this; } inline _UCXXEXPORT size_type length() const { return vector::size(); } void _UCXXEXPORT resize(size_type n, Ch c = Ch()){ vector::resize(n, c); } _UCXXEXPORT basic_string& operator+=(const basic_string& str){ return append(str); } _UCXXEXPORT basic_string& operator+=(const Ch * s){ return append(s); } _UCXXEXPORT basic_string& operator+=(Ch c){ vector::push_back(c); return *this; } _UCXXEXPORT basic_string& append(const basic_string& str){ size_t temp = vector::elements; resize(vector::elements + str.elements); Tr::copy( vector::data + temp, str.vector::data, str.elements); return *this; } _UCXXEXPORT basic_string& append(const basic_string& str, size_type pos, size_type n){ if(pos > str.size()){ __throw_out_of_range(); } size_type rlen = str.elements - pos; if(rlen > n){ rlen = n; } if(vector::elements > npos - rlen){ __throw_length_error(); } size_t temp = vector::elements; resize(vector::elements + rlen); Tr::copy( vector::data + temp, str.vector::data + pos, rlen); return *this; } _UCXXEXPORT basic_string& append(const Ch* s, size_type n){ size_t temp = vector::elements; resize(vector::elements + n); Tr::copy( vector::data + temp, s, n); return *this; } _UCXXEXPORT basic_string& append(const Ch* s){ size_type strLen = Tr::length(s); size_t temp = vector::elements; resize(vector::elements + strLen); Tr::copy( vector::data + temp, s, strLen); return *this; } _UCXXEXPORT basic_string& append(size_type n, Ch c){ vector::resize(vector::elements + n, c); return *this; } _UCXXEXPORT basic_string& assign(const basic_string& str){ operator=(str); return *this; } _UCXXEXPORT basic_string& assign(const basic_string& str, size_type pos, size_type n){ if(pos > str.elements){ __throw_out_of_range(); } size_type r = str.elements - pos; if(r > n){ r = n; } resize(r); Tr::copy(vector::data, str.vector::data + pos, r); return *this; } _UCXXEXPORT basic_string& assign(const Ch* s, size_type n){ resize(n); Tr::copy(vector::data, s, n); return *this; } _UCXXEXPORT basic_string& assign(const Ch* s){ size_type len = Tr::length(s); return assign(s, len); } _UCXXEXPORT basic_string& assign(size_type n, Ch c){ vector::clear(); vector::resize(n, c); return *this; } template _UCXXEXPORT basic_string& assign(InputIterator first, InputIterator last){ vector::resize(0, Ch()); while (first != last){ const Ch x = *first; append(&x); ++first; } return *this; } _UCXXEXPORT basic_string& insert(size_type pos1, const basic_string& str, size_type pos2=0, size_type n=npos){ if(pos1 > vector::elements || pos2 > str.elements){ __throw_out_of_range(); } size_type r = str.elements - pos2; if( r > n){ r = n; } if(vector::elements > npos - r){ __throw_length_error(); } size_type temp = vector::elements; resize(vector::elements + r); Tr::move(vector::data + pos1 + r, vector::data + pos1, temp - pos1); Tr::copy(vector::data + pos1, str.vector::data + pos2, r); return *this; } _UCXXEXPORT basic_string& insert(size_type pos, const Ch* s, size_type n){ if(pos > vector::elements){ __throw_out_of_range(); } if(vector::elements > npos - n){ __throw_length_error(); } size_type temp = vector::elements; resize(vector::elements + n); Tr::move(vector::data + pos + n, vector::data + pos, temp - pos); Tr::copy(vector::data + pos, s, n); return *this; } inline _UCXXEXPORT basic_string& insert(size_type pos, const Ch* s){ size_type len = Tr::length(s); return insert(pos, s, len); } _UCXXEXPORT basic_string& insert(size_type pos, size_type n, Ch c){ if(pos > vector::elements){ __throw_out_of_range(); } if(vector::elements > npos - n){ __throw_length_error(); } size_type temp = vector::elements; resize(vector::elements + n); Tr::move(vector::data + pos + n, vector::data + pos, temp - pos); Tr::assign(vector::data + pos, n, c); return *this; } using vector::insert; // void insert(iterator p, size_type n, charT c); // template void insert(iterator p, InputIterator first, InputIterator last); _UCXXEXPORT basic_string& erase(size_type pos = 0, size_type n = npos){ size_type xlen = vector::elements - pos; if(xlen > n){ xlen = n; } size_type temp = vector::elements; Tr::move(vector::data + pos, vector::data + pos + xlen, temp - pos - xlen); resize(temp - xlen); return *this; } _UCXXEXPORT iterator erase(iterator position){ if(position == vector::end()){ return position; } ++position; iterator temp = position; while(position != vector::end()){ *(position-1) = *position; ++position; } vector::pop_back(); return temp; } _UCXXEXPORT iterator erase(iterator first, iterator last){ size_t count = last - first; iterator temp = last; while(last != vector::end()){ *(last - count) = *last; ++last; } resize( vector::elements-count); return temp; } _UCXXEXPORT basic_string& replace(size_type pos1, size_type n1, const basic_string& str, size_type pos2=0, size_type n2=npos) { if(pos1 > vector::elements){ __throw_out_of_range(); } size_type xlen = vector::elements - pos1; if(xlen > n1){ xlen = n1; } size_type rlen = str.elements - pos2; if(rlen > n2){ rlen = n2; } if((vector::elements - xlen) >= (npos - rlen)){ __throw_length_error(); } size_t temp = vector::elements; if(rlen > xlen){ //Only if making larger resize(temp - xlen + rlen); } //Final length = vector::elements - xlen + rlen //Initial block is of size pos1 //Block 2 is of size len Tr::move(vector::data + pos1 + rlen, vector::data + pos1 + xlen, temp - pos1 - xlen); Tr::copy(vector::data + pos1, str.vector::data + pos2, rlen); resize(temp - xlen + rlen); return *this; } _UCXXEXPORT basic_string& replace(size_type pos, size_type n1, const Ch* s, size_type n2){ return replace(pos,n1,basic_string(s,n2)); } inline _UCXXEXPORT basic_string& replace(size_type pos, size_type n1, const Ch* s){ return replace(pos,n1,basic_string(s)); } _UCXXEXPORT basic_string& replace(size_type pos, size_type n1, size_type n2, Ch c){ return replace(pos,n1,basic_string(n2,c)); } // _UCXXEXPORT basic_string& replace(iterator i1, iterator i2, const basic_string& str); // _UCXXEXPORT basic_string& replace(iterator i1, iterator i2, const Ch* s, size_type n); // _UCXXEXPORT basic_string& replace(iterator i1, iterator i2, const Ch* s); // _UCXXEXPORT basic_string& replace(iterator i1, iterator i2, size_type n, Ch c); /* template _UCXXEXPORT basic_string& replace(iterator i1, iterator i2, InputIterator j1, InputIterator j2);*/ size_type _UCXXEXPORT copy(Ch* s, size_type n, size_type pos = 0) const{ if(pos > vector::elements){ __throw_out_of_range(); } size_type r = vector::elements - pos; if(r > n){ r = n; } Tr::copy(s, vector::data + pos, r); return r; } _UCXXEXPORT void swap(basic_string& s){ //Data pointers vector::swap(s); } _UCXXEXPORT const Ch* c_str() const{ const_cast *>(this)->reserve(vector::elements+1); vector::data[vector::elements] = 0; //Add 0 at the end return vector::data; } _UCXXEXPORT const Ch* data() const{ return vector::data; } _UCXXEXPORT allocator_type get_allocator() const{ return vector::a; } _UCXXEXPORT size_type find (const basic_string& str, size_type pos = 0) const; //Below _UCXXEXPORT size_type find (const Ch* s, size_type pos, size_type n) const{ return find(basic_string(s,n), pos); } _UCXXEXPORT size_type find (const Ch* s, size_type pos = 0) const{ return find(basic_string(s), pos); } _UCXXEXPORT size_type find (Ch c, size_type pos = 0) const{ for(size_type i = pos; i < length(); ++i){ if(this->operator[](i) == c){ return i; } } return npos; } _UCXXEXPORT size_type rfind(const basic_string& str, size_type pos = npos) const{ if(pos >= length()){ pos = length(); } for(size_type i = pos; i > 0; --i){ if(str == substr(i-1, str.length())){ return i-1; } } return npos; } _UCXXEXPORT size_type rfind(const Ch* s, size_type pos, size_type n) const{ return rfind(basic_string(s,n),pos); } _UCXXEXPORT size_type rfind(const Ch* s, size_type pos = npos) const{ return rfind(basic_string(s),pos); } _UCXXEXPORT size_type rfind(Ch c, size_type pos = npos) const{ return rfind(basic_string(1,c),pos); } _UCXXEXPORT size_type find_first_of(const basic_string& str, size_type pos = 0) const{ for(size_type i = pos; i < length(); ++i){ for(size_type j = 0; j < str.length() ; ++j){ if( Tr::eq(str[j], this->operator[](i)) ){ return i; } } } return npos; } _UCXXEXPORT size_type find_first_of(const Ch* s, size_type pos, size_type n) const{ return find_first_of(basic_string(s,n),pos); } _UCXXEXPORT size_type find_first_of(const Ch* s, size_type pos = 0) const{ return find_first_of(basic_string(s),pos); } _UCXXEXPORT size_type find_first_of(Ch c, size_type pos = 0) const{ for(size_type i = pos; i< length(); ++i){ if( Tr::eq(this->operator[](i), c) ){ return i; } } return npos; } _UCXXEXPORT size_type find_last_of (const basic_string& str, size_type pos = npos) const{ if(pos > length()){ pos = length(); } for(size_type i = pos; i >0 ; --i){ for(size_type j = 0 ; j < str.length(); ++j){ if( Tr::eq(this->operator[](i-1), str[j]) ){ return i-1; } } } return npos; } _UCXXEXPORT size_type find_last_of (const Ch* s, size_type pos, size_type n) const{ return find_last_of(basic_string(s,n),pos); } _UCXXEXPORT size_type find_last_of (const Ch* s, size_type pos = npos) const{ return find_last_of(basic_string(s),pos); } _UCXXEXPORT size_type find_last_of (Ch c, size_type pos = npos) const{ if(pos > length()){ pos = length(); } for(size_type i = pos; i >0 ; --i){ if( Tr::eq(this->operator[](i-1), c) ){ return i-1; } } return npos; } _UCXXEXPORT size_type find_first_not_of(const basic_string& str, size_type pos = 0) const{ bool foundCharacter; for(size_type i = pos; i < length(); ++i){ foundCharacter = false; for(size_type j = 0; j < str.length() ; ++j){ if( Tr::eq(str[j], this->operator[](i)) ){ foundCharacter = true; } } if(foundCharacter == false){ return i; } } return npos; } _UCXXEXPORT size_type find_first_not_of(const Ch* s, size_type pos, size_type n) const{ return find_first_not_of(basic_string(s,n),pos); } _UCXXEXPORT size_type find_first_not_of(const Ch* s, size_type pos = 0) const{ return find_first_not_of(basic_string(s),pos); } _UCXXEXPORT size_type find_first_not_of(Ch c, size_type pos = 0) const{ for(size_type i = pos; i < length() ; ++i){ if(this->operator[](i) != c){ return i; } } return npos; } _UCXXEXPORT size_type find_last_not_of (const basic_string& str, size_type pos = npos) const{ size_type xpos(length() - 1); if(xpos > pos){ xpos = pos; } while(xpos != npos && npos != str.find_first_of(this->at(xpos))){ --xpos; } return xpos; } _UCXXEXPORT size_type find_last_not_of (const Ch* s, size_type pos, size_type n) const{ return find_last_not_of(basic_string(s,n),pos); } _UCXXEXPORT size_type find_last_not_of (const Ch* s, size_type pos = npos) const{ return find_last_not_of(basic_string(s),pos); } _UCXXEXPORT size_type find_last_not_of (Ch c, size_type pos = npos) const{ size_type xpos(length() - 1); if(xpos > pos){ xpos = pos; } while(xpos != npos && Tr::eq(this->at(xpos), c)){ --xpos; } return xpos; } _UCXXEXPORT basic_string substr(size_type pos = 0, size_type n = npos) const; _UCXXEXPORT int compare(const basic_string& str) const{ size_type rlen = vector::elements; if(rlen > str.elements){ rlen = str.elements; } int retval = Tr::compare(vector::data, str.vector::data, rlen); if(retval == 0){ if(vector::elements < str.elements){ retval = -1; } if(vector::elements > str.elements){ retval = 1; } } return retval; } _UCXXEXPORT int compare(size_type pos1, size_type n1, const basic_string& str, size_type pos2=0, size_type n2=npos) const{ size_type len1 = vector::elements - pos1; if(len1 > n1){ len1 = n1; } size_type len2 = str.vector::elements - pos2; if(len2 > n2){ len2 = n2; } size_type rlen = len1; if(rlen > len2){ rlen = len2; } int retval = Tr::compare(vector::data + pos1, str.vector::data + pos2, rlen); if(retval == 0){ if(len1 < len2){ retval = -1; } if(len1 > len2){ retval = 1; } } return retval; } _UCXXEXPORT int compare(const Ch* s) const{ size_type slen = Tr::length(s); size_type rlen = slen; if(rlen > vector::elements){ rlen=vector::elements; } int retval = Tr::compare(vector::data, s, rlen); if(retval==0){ if(vector::elements < slen){ retval = -1; } if(vector::elements > slen){ retval = 1; } } return retval; } _UCXXEXPORT int compare(size_type pos1, size_type n1, const Ch* s, size_type n2 = npos) const{ size_type len1 = vector::elements - pos1; if(len1 > n1){ len1 = n1; } size_type slen = Tr::length(s); size_type len2 = slen; if(len2 > n2){ len2 = n2; } size_type rlen = len1; if(rlen > len2){ rlen = len2; } int retval = Tr::compare(vector::data + pos1, s, rlen); if(retval == 0){ if(len1 < len2){ retval = -1; } if(len1 > len2){ retval = 1; } } return retval; } }; //Functions template _UCXXEXPORT basic_string::basic_string(const Ch* s, const A& al) : vector(al) { if(s!=0){ size_type temp = Tr::length(s); append(s, temp); } } template _UCXXEXPORT basic_string:: basic_string(const basic_string& str, size_type pos, size_type n, const A& al) : vector(al) { if(pos>str.size()){ __throw_out_of_range(); } size_type rlen = str.size() - pos; if( rlen > n){ rlen = n; } resize(rlen); Tr::copy(vector::data, str.vector::data + pos, vector::elements); } template _UCXXEXPORT basic_string& basic_string::operator=(const basic_string & str) { if(&str == this){ //Check if we are doing a=a return *this; } vector::clear(); resize(str.elements); Tr::copy( vector::data, str.vector::data, str.elements); return *this; } template _UCXXEXPORT typename basic_string::size_type basic_string::find (const basic_string& str, size_type pos) const { if(str.length() > length()){ return npos; } size_type max_string_start = 1 + length() - str.length(); for(size_type i = pos; i < max_string_start; ++i){ if(str == substr(i, str.length())){ return i; } } return npos; } template _UCXXEXPORT basic_string basic_string::substr(size_type pos, size_type n) const { if(pos > vector::elements){ __throw_out_of_range(); } size_type rlen = vector::elements - pos; if(rlen > n){ rlen = n; } return basic_string(vector::data + pos,rlen); } #ifdef __UCLIBCXX_EXPAND_STRING_CHAR__ #ifndef __UCLIBCXX_COMPILE_STRING__ #ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ template <> _UCXXEXPORT string::basic_string(const allocator &); template <> _UCXXEXPORT string::basic_string(size_type n, char c, const allocator & ); template <> _UCXXEXPORT string::basic_string(const char* s, const allocator& al); template <> _UCXXEXPORT string::basic_string(const basic_string& str, size_type pos, size_type n, const allocator& al); template <> _UCXXEXPORT string::~basic_string(); #endif template <> _UCXXEXPORT string & string::append(const char * s, size_type n); template <> _UCXXEXPORT string::size_type string::find(const string & str, size_type pos) const; template <> _UCXXEXPORT string::size_type string::find(const char* s, size_type pos) const; template <> _UCXXEXPORT string::size_type string::find (char c, size_type pos) const; template <> _UCXXEXPORT string::size_type string::rfind(const string & str, size_type pos) const; template <> _UCXXEXPORT string::size_type string::rfind(char c, size_type pos) const; template <> _UCXXEXPORT string::size_type string::rfind(const char* s, size_type pos) const; template <> _UCXXEXPORT string::size_type string::find_first_of(const string &, size_type) const; template <> _UCXXEXPORT string::size_type string::find_first_of(const char *, size_type pos, size_type n) const; template <> _UCXXEXPORT string::size_type string::find_first_of(const char*, size_type pos) const; template <> _UCXXEXPORT string::size_type string::find_first_of(char c, size_type pos) const; template <> _UCXXEXPORT string::size_type string::find_last_of (const string & , size_type pos) const; template <> _UCXXEXPORT string::size_type string::find_last_of (const char* s, size_type pos, size_type n) const; template <> _UCXXEXPORT string::size_type string::find_last_of (const char* s, size_type pos) const; template <> _UCXXEXPORT string::size_type string::find_last_of (char c, size_type pos) const; template <> _UCXXEXPORT string::size_type string::find_first_not_of(const string &, size_type) const; template <> _UCXXEXPORT string::size_type string::find_first_not_of(const char*, size_type, size_type) const; template <> _UCXXEXPORT string::size_type string::find_first_not_of(const char*, size_type) const; template <> _UCXXEXPORT string::size_type string::find_first_not_of(char c, size_type) const; template <> _UCXXEXPORT int string::compare(const string & str) const; template <> _UCXXEXPORT int string::compare( size_type pos1, size_type n1, const string & str, size_type pos2, size_type n2) const; template <> _UCXXEXPORT string string::substr(size_type pos, size_type n) const; template <> _UCXXEXPORT string & string::operator=(const string & str); template <> _UCXXEXPORT string & string::operator=(const char * s); #endif #endif //typedef basic_string string; template _UCXXEXPORT basic_string operator+(const basic_string& lhs, const basic_string& rhs) { basic_string temp(lhs); temp.append(rhs); return temp; } template _UCXXEXPORT basic_string operator+(const charT* lhs, const basic_string& rhs) { basic_string temp(lhs); temp.append(rhs); return temp; } template _UCXXEXPORT basic_string operator+(charT lhs, const basic_string& rhs) { basic_string temp(1, lhs); temp.append(rhs); return temp; } template _UCXXEXPORT basic_string operator+(const basic_string& lhs, const charT* rhs) { basic_string temp(lhs); temp.append(rhs); return temp; } template _UCXXEXPORT basic_string operator+(const basic_string& lhs, charT rhs) { basic_string temp(lhs); temp+=rhs; return temp; } template _UCXXEXPORT bool operator==(const basic_string& lhs, const basic_string& rhs) { if(lhs.compare(rhs) == 0){ return true; } return false; } template _UCXXEXPORT bool operator==(const charT* lhs, const basic_string& rhs) { if(rhs.compare(lhs) == 0){ return true; } return false; } template _UCXXEXPORT bool operator==(const basic_string& lhs, const charT* rhs) { if(lhs.compare(rhs)==0){ return true; } return false; } template _UCXXEXPORT bool operator!=(const basic_string& lhs, const basic_string& rhs) { if(lhs.compare(rhs) !=0){ return true; } return false; } template _UCXXEXPORT bool operator!=(const charT* lhs, const basic_string& rhs) { basic_string temp(lhs); return (temp != rhs); } template _UCXXEXPORT bool operator!=(const basic_string& lhs, const charT* rhs) { basic_string temp(rhs); return (lhs != temp); } template _UCXXEXPORT bool operator< (const basic_string& lhs, const basic_string& rhs) { if(lhs.compare(rhs) < 0){ return true; } return false; } template _UCXXEXPORT bool operator< (const basic_string& lhs, const charT* rhs) { basic_string temp(rhs); if(lhs.compare(rhs) < 0){ return true; } return false; } template _UCXXEXPORT bool operator< (const charT* lhs, const basic_string& rhs) { basic_string temp(lhs); if(temp.compare(rhs) < 0){ return true; } return false; } template _UCXXEXPORT bool operator> (const basic_string& lhs, const basic_string& rhs) { if(lhs.compare(rhs) > 0){ return true; } return false; } template _UCXXEXPORT bool operator> (const basic_string& lhs, const charT* rhs) { basic_string temp(rhs); if(lhs.compare(rhs) > 0){ return true; } return false; } template _UCXXEXPORT bool operator> (const charT* lhs, const basic_string& rhs) { basic_string temp(lhs); if(temp.compare(rhs) > 0){ return true; } return false; } template _UCXXEXPORT bool operator<=(const basic_string& lhs, const basic_string& rhs) { if(lhs.compare(rhs) <=0){ return true; } return false; } template _UCXXEXPORT bool operator<=(const basic_string& lhs, const charT* rhs) { basic_string temp(rhs); if(lhs.compare(temp) <=0 ){ return true; } return false; } template _UCXXEXPORT bool operator<=(const charT* lhs, const basic_string& rhs) { basic_string temp(lhs); if(temp.compare(rhs) <= 0){ return true; } return false; } template _UCXXEXPORT bool operator>=(const basic_string& lhs, const basic_string& rhs) { if(lhs.compare(rhs) >=0){ return true; } return false; } template _UCXXEXPORT bool operator>=(const basic_string& lhs, const charT* rhs) { basic_string temp(rhs); if(lhs.compare(temp) >=0 ){ return true; } return false; } template _UCXXEXPORT bool operator>=(const charT* lhs, const basic_string& rhs) { basic_string temp(lhs); if(temp.compare(rhs) >=0 ){ return true; } return false; } template _UCXXEXPORT void swap(basic_string& lhs, basic_string& rhs) { lhs.swap(rhs); } /*template _UCXXEXPORT basic_ostream& operator<<(basic_ostream& os, const basic_string& str) { return os.write(str.data(), str.length()); }*/ #ifdef __UCLIBCXX_EXPAND_STRING_CHAR__ #ifndef __UCLIBCXX_COMPILE_STRING__ //Operators we can avoid duplication of template <> _UCXXEXPORT bool operator==(const string & lhs, const string & rhs); template <> _UCXXEXPORT bool operator==(const char * lhs, const string & rhs); template <> _UCXXEXPORT bool operator==(const string & lhs, const char * rhs); template <> _UCXXEXPORT bool operator!=(const string & lhs, const string & rhs); template <> _UCXXEXPORT bool operator!=(const char * lhs, const string & rhs); template <> _UCXXEXPORT bool operator!=(const string & lhs, const char * rhs); template <> _UCXXEXPORT string operator+(const string & lhs, const char* rhs); template <> _UCXXEXPORT string operator+(const char* lhs, const string & rhs); template <> _UCXXEXPORT string operator+(const string & lhs, const string & rhs); template <> _UCXXEXPORT bool operator> (const string & lhs, const string & rhs); template <> _UCXXEXPORT bool operator< (const string & lhs, const string & rhs); #endif #endif } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/string.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define __UCLIBCXX_COMPILE_STRING__ 1 #include #include #include #include #include #include namespace std{ #ifdef __UCLIBCXX_EXPAND_STRING_CHAR__ #ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ template _UCXXEXPORT string::basic_string(const allocator &); template _UCXXEXPORT string::basic_string(size_type n, char c, const allocator & ); template _UCXXEXPORT string::basic_string(const char* s, const allocator& al); template _UCXXEXPORT string::basic_string(const basic_string& str, size_type pos, size_type n, const allocator& al); template _UCXXEXPORT string::~basic_string(); #endif // __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ template _UCXXEXPORT string & string::append(const char * s, size_type n); template _UCXXEXPORT string::size_type string::find(const string & str, size_type pos) const; template _UCXXEXPORT string::size_type string::find(const char* s, size_type pos) const; template _UCXXEXPORT string::size_type string::find (char c, size_type pos) const; template _UCXXEXPORT string::size_type string::rfind(const string & str, size_type pos) const; template _UCXXEXPORT string::size_type string::rfind(char c, size_type pos) const; template _UCXXEXPORT string::size_type string::rfind(const char* s, size_type pos) const; template _UCXXEXPORT string::size_type string::find_first_of(const string &, size_type) const; template _UCXXEXPORT string::size_type string::find_first_of(const char *, size_type pos, size_type n) const; template _UCXXEXPORT string::size_type string::find_first_of(const char*, size_type pos) const; template _UCXXEXPORT string::size_type string::find_first_of(char c, size_type pos) const; template _UCXXEXPORT string::size_type string::find_last_of (const string & , size_type pos) const; template _UCXXEXPORT string::size_type string::find_last_of (const char* s, size_type pos, size_type n) const; template _UCXXEXPORT string::size_type string::find_last_of (const char* s, size_type pos) const; template _UCXXEXPORT string::size_type string::find_last_of (char c, size_type pos) const; template _UCXXEXPORT string::size_type string::find_first_not_of(const string &, size_type) const; template _UCXXEXPORT string::size_type string::find_first_not_of(const char*, size_type, size_type) const; template _UCXXEXPORT string::size_type string::find_first_not_of(const char*, size_type) const; template _UCXXEXPORT string::size_type string::find_first_not_of(char c, size_type) const; template _UCXXEXPORT int string::compare(const string & str) const; // template _UCXXEXPORT int string::compare(size_type pos1, size_type n1, const string & str) const; template _UCXXEXPORT int string::compare( size_type pos1, size_type n1, const string & str, size_type pos2, size_type n2) const; template _UCXXEXPORT string string::substr(size_type pos, size_type n) const; template _UCXXEXPORT string & string::operator=(const string & str); template _UCXXEXPORT string & string::operator=(const char * s); template _UCXXEXPORT bool operator==(const string & lhs, const string & rhs); template _UCXXEXPORT bool operator==(const char * lhs, const string & rhs); template _UCXXEXPORT bool operator==(const string & lhs, const char * rhs); template _UCXXEXPORT bool operator!=(const string & lhs, const string & rhs); template _UCXXEXPORT bool operator!=(const char * lhs, const string & rhs); template _UCXXEXPORT bool operator!=(const string & lhs, const char * rhs); template _UCXXEXPORT string operator+(const string & lhs, const char* rhs); template _UCXXEXPORT string operator+(const char* lhs, const string & rhs); template _UCXXEXPORT string operator+(const string & lhs, const string & rhs); template _UCXXEXPORT bool operator> (const string & lhs, const string & rhs); template _UCXXEXPORT bool operator< (const string & lhs, const string & rhs); //Functions dependent upon OSTREAM #ifdef __UCLIBCXX_EXPAND_OSTREAM_CHAR__ template _UCXXEXPORT ostream & operator<<(ostream & os, const string & str); #endif //Functions dependent upon ISTREAM #ifdef __UCLIBCXX_EXPAND_ISTREAM_CHAR__ template _UCXXEXPORT istream & operator>>(istream & is, string & str); #endif #endif } ================================================ FILE: external/arduino/stlarduino/string_iostream ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #ifdef __UCLIBCXX_HAS_WCHAR__ #include #include #endif #ifndef __HEADER_STD_STRING_IOSTREAM #define __HEADER_STD_STRING_IOSTREAM 1 #pragma GCC visibility push(default) namespace std{ template _UCXXEXPORT basic_ostream& operator<<(basic_ostream& os, const basic_string& str) { return os.write(str.data(), str.length()); } template _UCXXEXPORT basic_istream& operator>>(basic_istream& is, basic_string& str) { typename basic_istream::sentry s(is); if(s == false){ return is; } str.clear(); typename basic_istream::int_type c; typename Allocator::size_type n = is.width(); bool exitnow = false; if(n == 0){ n = str.max_size(); } // //Clear out preliminary spaces first // c = is.get(); // while(isspace(c)){ // c = is.get(); // } // // is.putback(c); do{ c = is.get(); if(c == traits::eof() || isspace(c) || n == 0){ is.putback(c); exitnow = true; }else{ str.append(1, traits::to_char_type(c) ); --n; } }while(exitnow == false); return is; } template _UCXXEXPORT basic_istream& getline(basic_istream& is, basic_string& str, charT delim) { typename basic_istream::sentry s(is, true); if(s == false){ return is; } str.erase(); streamsize i = 0; typename basic_istream::int_type c_i; charT c; unsigned int n = str.max_size(); for(i=0;i _UCXXEXPORT basic_istream& getline(basic_istream& is, basic_string& str) { return getline(is, str, '\n'); } #ifdef __UCLIBCXX_EXPAND_STRING_CHAR__ #ifndef __UCLIBCXX_COMPILE_STRING__ #ifdef __UCLIBCXX_EXPAND_ISTREAM_CHAR__ template<> _UCXXEXPORT basic_istream >& operator>>( basic_istream >& is, basic_string, allocator >& str); #endif #ifdef __UCLIBCXX_EXPAND_OSTREAM_CHAR__ template<> _UCXXEXPORT basic_ostream >& operator<<(basic_ostream >& os, const basic_string, std::allocator >& str); #endif #endif #endif } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/string_view ================================================ /** * \file string_view.hpp * * \brief This header contains the definition of the string_view type, as * described by the C++17 standard. * * \author Matthew Rodusek (matthew.rodusek@gmail.com) * \copyright Matthew Rodusek */ /* * The MIT License (MIT) * * Licensed under the MIT License . * Copyright (c) 2016 Matthew Rodusek * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifndef BPSTD_STRING_VIEW_HPP #define BPSTD_STRING_VIEW_HPP #include // std:: #include // std::char_traits #include // std::basic_ostream #include // std::size_t #include // std::allocator #include // std::out_of_range #include // std::out_of_range #include // std::reverse_iterator namespace std { // back-port std //////////////////////////////////////////////////////////////////////////// /// \brief A wrapper around non-owned strings. /// /// This is an implementation of the C++17 string_view proposal /// /// \ingroup core //////////////////////////////////////////////////////////////////////////// template< typename CharT, typename Traits = std::char_traits > class basic_string_view final { //------------------------------------------------------------------------ // Public Member Types //------------------------------------------------------------------------ public: using char_type = CharT; using traits_type = Traits; using size_type = std::size_t; using value_type = CharT; using reference = value_type&; using const_reference = const value_type&; using pointer = value_type*; using const_pointer = const value_type*; using iterator = const CharT*; using const_iterator = const CharT*; using reverse_iterator = std::reverse_iterator; using const_reverse_iterator = std::reverse_iterator; //------------------------------------------------------------------------ // Public Members //------------------------------------------------------------------------ public: static constexpr size_type npos = size_type(-1); //------------------------------------------------------------------------ // Constructors //------------------------------------------------------------------------ public: /// \brief Default constructs a basic_string_view without any content constexpr basic_string_view() noexcept; /// \brief Constructs a basic_string_view by copying another one /// /// \param other the string view being copied constexpr basic_string_view(const basic_string_view& other) noexcept = default; /// \brief Constructs a basic_string_view by moving anothe rone /// /// \param other the string view being moved constexpr basic_string_view(basic_string_view&& other) noexcept = default; /// \brief Constructs a basic_string_view from a std::basic_string /// /// \param str the string to view template basic_string_view(const std::basic_string& str) noexcept; /// \brief Constructs a basic_string_view from an ansi-string /// /// \param str the string to view constexpr basic_string_view(const char_type* str) noexcept; /// \brief Constructs a basic_string_view from an ansi string of a given size /// /// \param str the string to view /// \param count the size of the string constexpr basic_string_view(const char_type* str, size_type count) noexcept; //------------------------------------------------------------------------ // Assignment //------------------------------------------------------------------------ public: /// \brief Assigns a basic_string_view from an ansi-string /// /// \param view the string to view /// \return reference to \c (*this) basic_string_view& operator=(const basic_string_view& view) = default; //------------------------------------------------------------------------ // Capacity //------------------------------------------------------------------------ public: /// \brief Returns the length of the string, in terms of bytes /// /// \return the length of the string, in terms of bytes constexpr size_type size() const noexcept; /// \copydoc basic_string_view::size constexpr size_type length() const noexcept; /// \brief The largest possible number of char-like objects that can be /// referred to by a basic_string_view. /// \return Maximum number of characters constexpr size_type max_size() const noexcept; /// \brief Returns whether the basic_string_view is empty /// (i.e. whether its length is 0). /// /// \return whether the basic_string_view is empty constexpr bool empty() const noexcept; //------------------------------------------------------------------------ // Element Access //------------------------------------------------------------------------ public: /// \brief Gets the ansi-string of the current basic_string_view /// /// \return the ansi-string pointer constexpr const char_type* c_str() const noexcept; /// \brief Gets the data of the current basic_string_view /// /// \note This is an alias of #c_str /// /// \return the data this basic_string_view contains constexpr const char_type* data() const noexcept; /// \brief Accesses the element at index \p pos /// /// \param pos the index to access /// \return const reference to the character constexpr const_reference operator[](size_type pos) const noexcept; /// \brief Accesses the element at index \p pos /// /// \param pos the index to access /// \return const reference to the character constexpr const_reference at(size_type pos) const; /// \brief Access the first character of the string /// /// \note Undefined behavior if basic_string_view is empty /// /// \return reference to the first character of the string constexpr const_reference front() const noexcept; /// \brief References the last character of the string /// /// \note Undefined behavior if basic_string_view is empty /// /// \return reference to the last character of the string constexpr const_reference back() const noexcept; //------------------------------------------------------------------------ // Modifiers //------------------------------------------------------------------------ public: /// \brief Moves the start of the view forward by n characters. /// /// The behavior is undefined if n > size(). /// /// \param n number of characters to remove from the start of the view void remove_prefix(size_type n) noexcept; /// \brief Moves the end of the view back by n characters. /// /// The behavior is undefined if n > size(). /// /// \param n number of characters to remove from the end of the view void remove_suffix(size_type n) noexcept; /// \brief Exchanges the view with that of v. /// /// \param v view to swap with void swap(basic_string_view& v) noexcept; //------------------------------------------------------------------------ // Conversions //------------------------------------------------------------------------ public: /// \brief Creates a basic_string with a copy of the content of the current view. /// /// \tparam Allocator type used to allocate internal storage /// \param a Allocator instance to use for allocating the new string /// /// \return A basic_string containing a copy of the characters of the current view. template> constexpr std::basic_string to_string(const Allocator& a = Allocator()) const; /// \copydoc basic_string_view::to_string template explicit constexpr operator std::basic_string() const; //------------------------------------------------------------------------ // Operations //------------------------------------------------------------------------ public: /// \brief Copies the substring [pos, pos + rcount) to the character string pointed /// to by dest, where rcount is the smaller of count and size() - pos. /// /// \param dest pointer to the destination character string /// \param count requested substring length /// \param pos position of the first character size_type copy( char_type* dest, size_type count = npos, size_type pos = 0 ) const; /// \brief Returns a substring of this viewed string /// /// \param pos the position of the first character in the substring /// \param len the length of the substring /// \return the created substring basic_string_view substr(size_t pos = 0, size_t len = npos) const; //------------------------------------------------------------------------ /// \brief Compares two character sequences /// /// \param v view to compare /// \return negative value if this view is less than the other character /// sequence, zero if the both character sequences are equal, positive /// value if this view is greater than the other character sequence. int compare(basic_string_view v) const noexcept; /// \brief Compares two character sequences /// /// \param pos position of the first character in this view to compare /// \param count number of characters of this view to compare /// \param v view to compare /// \return negative value if this view is less than the other character /// sequence, zero if the both character sequences are equal, positive /// value if this view is greater than the other character sequence. int compare(size_type pos, size_type count, basic_string_view v) const; /// \brief Compares two character sequences /// /// \param pos1 position of the first character in this view to compare /// \param count1 number of characters of this view to compare /// \param v view to compare /// \param pos2 position of the second character in this view to compare /// \param count2 number of characters of the given view to compare /// \return negative value if this view is less than the other character /// sequence, zero if the both character sequences are equal, positive /// value if this view is greater than the other character sequence. int compare( size_type pos1, size_type count1, basic_string_view v, size_type pos2, size_type count2 ) const; /// \brief Compares two character sequences /// /// \param s pointer to the character string to compare to /// \return negative value if this view is less than the other character /// sequence, zero if the both character sequences are equal, positive /// value if this view is greater than the other character sequence. int compare(const char_type* s) const; /// \brief Compares two character sequences /// /// \param pos position of the first character in this view to compare /// \param count number of characters of this view to compare /// \param s pointer to the character string to compare to /// \return negative value if this view is less than the other character /// sequence, zero if the both character sequences are equal, positive /// value if this view is greater than the other character sequence. int compare(size_type pos, size_type count, const char_type* s) const; /// \brief Compares two character sequences /// /// \param pos position of the first character in this view to compare /// \param count1 number of characters of this view to compare /// \param s pointer to the character string to compare to /// \param count2 number of characters of the given view to compare /// \return negative value if this view is less than the other character /// sequence, zero if the both character sequences are equal, positive /// value if this view is greater than the other character sequence. int compare( size_type pos, size_type count1, const char_type* s, size_type count2 ) const; //------------------------------------------------------------------------ size_type find(basic_string_view v, size_type pos = 0) const; size_type find(char_type c, size_type pos = 0) const; size_type find(const char_type* s, size_type pos, size_type count) const; size_type find(const char_type* s, size_type pos = 0) const; //------------------------------------------------------------------------ size_type rfind(basic_string_view v, size_type pos = npos) const; size_type rfind(char_type c, size_type pos = npos) const; size_type rfind(const char_type* s, size_type pos, size_type count) const; size_type rfind(const char_type* s, size_type pos = npos) const; //------------------------------------------------------------------------ size_type find_first_of(basic_string_view v, size_type pos = 0) const; size_type find_first_of(char_type c, size_type pos = 0) const; size_type find_first_of(const char_type* s, size_type pos, size_type count) const; size_type find_first_of(const char_type* s, size_type pos = 0) const; //------------------------------------------------------------------------ size_type find_last_of(basic_string_view v, size_type pos = npos) const; size_type find_last_of(char_type c, size_type pos = npos) const; size_type find_last_of(const char_type* s, size_type pos, size_type count) const; size_type find_last_of(const char_type* s, size_type pos = npos) const; //------------------------------------------------------------------------ size_type find_first_not_of(basic_string_view v, size_type pos = 0) const; size_type find_first_not_of(char_type c, size_type pos = 0) const; size_type find_first_not_of(const char_type* s, size_type pos, size_type count) const; size_type find_first_not_of(const char_type* s, size_type pos = 0) const; //------------------------------------------------------------------------ size_type find_last_not_of(basic_string_view v, size_type pos = npos) const; size_type find_last_not_of(char_type c, size_type pos = npos) const; size_type find_last_not_of(const char_type* s, size_type pos, size_type count) const; size_type find_last_not_of(const char_type* s, size_type pos = npos) const; //------------------------------------------------------------------------ // Iterators //------------------------------------------------------------------------ public: /// \{ /// \brief Retrieves the begin iterator for this basic_string_view /// /// \return the begin iterator const_iterator begin() const noexcept; const_iterator cbegin() const noexcept; /// \} /// \{ /// \brief Retrieves the end iterator for this basic_string_view /// /// \return the end iterator const_iterator end() const noexcept; const_iterator cend() const noexcept; /// \} /// \{ /// \brief Retrieves the reverse begin iterator for this basic_string_view /// /// \return the reverse begin iterator const_reverse_iterator rbegin() const noexcept; const_reverse_iterator rend() const noexcept; /// \} /// \{ /// \brief Retrieves the reverse end iterator for this basic_string_view /// /// \return the reverse end iterator const_reverse_iterator crbegin() const noexcept; const_reverse_iterator crend() const noexcept; /// \} //------------------------------------------------------------------------ // Private Member //------------------------------------------------------------------------ private: const char_type* m_str; ///< The internal string type size_type m_size; ///< The size of this string /// \brief Checks whether \p c is one of the characters in \p str /// /// \param c the character to check /// \param str the characters to compare against /// \return true if \p c is one of the characters in \p str static bool is_one_of(CharT c, basic_string_view str); }; template const typename basic_string_view::size_type basic_string_view::npos; //-------------------------------------------------------------------------- // Public Functions //-------------------------------------------------------------------------- /// \brief Overload for ostream output of basic_string_view /// /// \param o The output stream to print to /// \param str the string to print /// \return reference to the output stream template std::basic_ostream& operator<<(std::basic_ostream& o, const basic_string_view& str); template void swap(basic_string_view& lhs, basic_string_view& rhs) noexcept; //-------------------------------------------------------------------------- // Comparison Functions //-------------------------------------------------------------------------- template bool operator==(const basic_string_view& lhs, const basic_string_view& rhs) noexcept; template bool operator!=(const basic_string_view& lhs, const basic_string_view& rhs) noexcept; template bool operator<(const basic_string_view& lhs, const basic_string_view& rhs) noexcept; template bool operator>(const basic_string_view& lhs, const basic_string_view& rhs) noexcept; template bool operator<=(const basic_string_view& lhs, const basic_string_view& rhs) noexcept; template bool operator>=(const basic_string_view& lhs, const basic_string_view& rhs) noexcept; //-------------------------------------------------------------------------- // Type Aliases //-------------------------------------------------------------------------- using string_view = basic_string_view; using wstring_view = basic_string_view; using u16string_view = basic_string_view; using u32string_view = basic_string_view; } // namespace std #ifndef BPSTD_DETAIL_STRING_VIEW_INL #define BPSTD_DETAIL_STRING_VIEW_INL namespace std { //-------------------------------------------------------------------------- // Constructor //-------------------------------------------------------------------------- template inline constexpr basic_string_view::basic_string_view() noexcept : m_str(nullptr), m_size(0) { } template template inline basic_string_view::basic_string_view(const std::basic_string& str) noexcept : m_str(str.c_str()), m_size(str.size()) { } template inline constexpr basic_string_view::basic_string_view(const char_type* str) noexcept : m_str(str), m_size(traits_type::length(str)) { } template inline constexpr basic_string_view::basic_string_view(const char_type* str, size_type count) noexcept : m_str(str), m_size(count) { } //-------------------------------------------------------------------------- // Capacity //-------------------------------------------------------------------------- template inline constexpr typename basic_string_view::size_type basic_string_view::size() const noexcept { return m_size; } template inline constexpr typename basic_string_view::size_type basic_string_view::length() const noexcept { return size(); } template inline constexpr typename basic_string_view::size_type basic_string_view::max_size() const noexcept { return npos - 1; } template inline constexpr bool basic_string_view::empty() const noexcept { return m_size == 0; } //-------------------------------------------------------------------------- // Element Access //-------------------------------------------------------------------------- template inline constexpr const typename basic_string_view::char_type* basic_string_view::c_str() const noexcept { return m_str; } template inline constexpr const typename basic_string_view::char_type* basic_string_view::data() const noexcept { return m_str; } template inline constexpr typename basic_string_view::const_reference basic_string_view::operator[](size_type pos) const noexcept { return m_str[pos]; } template inline constexpr typename basic_string_view::const_reference basic_string_view::at(size_type pos) const { return pos < m_size ? m_str[pos] : throw std::__throw_out_of_range("Input out of range in basic_string_view::at"), m_str[pos]; } template inline constexpr typename basic_string_view::const_reference basic_string_view::front( ) const noexcept { return *m_str; } template inline constexpr typename basic_string_view::const_reference basic_string_view::back( ) const noexcept { return m_str[m_size-1]; } //-------------------------------------------------------------------------- // Modifiers //-------------------------------------------------------------------------- template inline void basic_string_view::remove_prefix(size_type n) noexcept { m_str += n, m_size -= n; } template inline void basic_string_view::remove_suffix(size_type n) noexcept { m_size -= n; } template inline void basic_string_view::swap(basic_string_view& v) noexcept { using std::swap; swap(m_size,v.m_size); swap(m_str,v.m_str); } //-------------------------------------------------------------------------- // Conversions //-------------------------------------------------------------------------- template template inline constexpr std::basic_string basic_string_view::to_string(const Allocator& a) const { return std::basic_string(m_str, m_size, a); } template template inline constexpr basic_string_view::operator std::basic_string() const { return std::basic_string(m_str, m_size); } //-------------------------------------------------------------------------- // String Operations //-------------------------------------------------------------------------- template inline typename basic_string_view::size_type basic_string_view::copy(char_type* dest, size_type count, size_type pos) const { if(pos >= m_size) { throw std::__throw_out_of_range("Index out of range in basic_string_view::copy"); } const size_type rcount = min(m_size - pos,count+1); std::copy( m_str + pos, m_str + pos + rcount, dest); return rcount; } template inline basic_string_view basic_string_view::substr(size_type pos, size_type len) const { const size_type max_length = pos > m_size ? 0 : m_size - pos; if (pos > size()) { throw std::__throw_out_of_range("Index out of range in basic_string_view::substr"); } return basic_string_view(m_str + pos, min(len, max_length) ); } //-------------------------------------------------------------------------- template inline int basic_string_view::compare(basic_string_view v) const noexcept { const size_type rlen = min(m_size,v.m_size); const int compare = Traits::compare(m_str,v.m_str,rlen); return (compare ? compare : (m_size < v.m_size ? -1 : (m_size > v.m_size ? 1 : 0))); } template inline int basic_string_view::compare(size_type pos, size_type count, basic_string_view v) const { return substr(pos,count).compare(v); } template inline int basic_string_view::compare(size_type pos1, size_type count1, basic_string_view v, size_type pos2, size_type count2) const { return substr(pos1,count1).compare(v.substr(pos2,count2)); } template inline int basic_string_view::compare(const char_type* s) const { return compare(basic_string_view(s)); } template inline int basic_string_view::compare(size_type pos, size_type count, const char_type* s) const { return substr(pos, count).compare(basic_string_view(s)); } template inline int basic_string_view::compare(size_type pos, size_type count1, const char_type* s, size_type count2) const { return substr(pos, count1).compare(basic_string_view(s, count2)); } //-------------------------------------------------------------------------- template inline typename basic_string_view::size_type basic_string_view::find(basic_string_view v, size_type pos) const { // Can't find a substring if the substring is bigger than this if (pos > size()) { return npos; } if ((pos + v.size()) > size()) { return npos; } const auto offset = pos; const auto increments = size() - v.size() - offset; for (auto i = 0u; i <= increments; ++i) { const auto j = i + offset; if (substr(j, v.size()) == v) { return j; } } return npos; } template inline typename basic_string_view::size_type basic_string_view::find(char_type c, size_type pos) const { return find(basic_string_view(&c, 1), pos); } template inline typename basic_string_view::size_type basic_string_view::find(const char_type* s, size_type pos, size_type count) const { return find(basic_string_view(s, count), pos); } template inline typename basic_string_view::size_type basic_string_view::find(const char_type* s, size_type pos) const { return find(basic_string_view(s), pos); } //-------------------------------------------------------------------------- template inline typename basic_string_view::size_type basic_string_view::rfind(basic_string_view v, size_type pos) const { if (empty()) { return v.empty() ? 0u : npos; } if (v.empty()) { return min(size() - 1, pos); } if (v.size() > size()) { return npos; } auto i = min(pos, (size() - v.size())); while (i != npos) { if (substr(i, v.size()) == v) { return i; } --i; } return npos; } template inline typename basic_string_view::size_type basic_string_view::rfind(char_type c, size_type pos) const { return rfind(basic_string_view(&c, 1), pos); } template inline typename basic_string_view::size_type basic_string_view::rfind(const char_type* s, size_type pos, size_type count) const { return rfind(basic_string_view(s, count), pos); } template inline typename basic_string_view::size_type basic_string_view::rfind(const char_type* s, size_type pos) const { return rfind(basic_string_view(s), pos); } //-------------------------------------------------------------------------- template inline typename basic_string_view::size_type basic_string_view::find_first_of(basic_string_view v, size_type pos) const { const auto max_index = size(); for (auto i = pos; i < max_index; ++i) { if (is_one_of(m_str[i],v)) { return i; } } return npos; } template inline typename basic_string_view::size_type basic_string_view::find_first_of(char_type c, size_type pos) const { return find_first_of(basic_string_view(&c, 1), pos); } template inline typename basic_string_view::size_type basic_string_view::find_first_of(const char_type* s, size_type pos, size_type count) const { return find_first_of(basic_string_view(s, count), pos); } template inline typename basic_string_view::size_type basic_string_view::find_first_of(const char_type* s, size_type pos) const { return find_first_of(basic_string_view(s), pos); } //-------------------------------------------------------------------------- template inline typename basic_string_view::size_type basic_string_view::find_last_of(basic_string_view v, size_type pos) const { if (empty()) { return npos; } const auto max_index = min(size() - 1, pos); for (auto i = 0u; i <= max_index; ++i) { const auto j = max_index - i; if (is_one_of(m_str[j],v)) { return j; } } return npos; } template inline typename basic_string_view::size_type basic_string_view::find_last_of(char_type c, size_type pos) const { return find_last_of(basic_string_view(&c, 1), pos); } template inline typename basic_string_view::size_type basic_string_view::find_last_of(const char_type* s, size_type pos, size_type count) const { return find_last_of(basic_string_view(s, count), pos); } template inline typename basic_string_view::size_type basic_string_view::find_last_of(const char_type* s, size_type pos) const { return find_last_of(basic_string_view(s), pos); } //-------------------------------------------------------------------------- template inline typename basic_string_view::size_type basic_string_view::find_first_not_of(basic_string_view v, size_type pos) const { const auto max_index = size(); for (auto i = pos; i < max_index; ++i) { if (!is_one_of(m_str[i],v)) { return i; } } return npos; } template inline typename basic_string_view::size_type basic_string_view::find_first_not_of(char_type c, size_type pos) const { return find_first_not_of(basic_string_view(&c, 1), pos); } template inline typename basic_string_view::size_type basic_string_view::find_first_not_of(const char_type* s, size_type pos, size_type count) const { return find_first_not_of(basic_string_view(s, count), pos); } template inline typename basic_string_view::size_type basic_string_view::find_first_not_of(const char_type* s, size_type pos) const { return find_first_not_of(basic_string_view(s), pos); } //-------------------------------------------------------------------------- template inline typename basic_string_view::size_type basic_string_view::find_last_not_of(basic_string_view v, size_type pos) const { if (empty()) { return npos; } const auto max_index = min(size() - 1, pos); for (auto i = 0u; i <= max_index; ++i) { const auto j = max_index - i; if (!is_one_of(m_str[j],v)) { return j; } } return npos; } template inline typename basic_string_view::size_type basic_string_view::find_last_not_of(char_type c, size_type pos) const { return find_last_not_of(basic_string_view(&c, 1), pos); } template inline typename basic_string_view::size_type basic_string_view::find_last_not_of(const char_type* s, size_type pos, size_type count) const { return find_last_not_of(basic_string_view(s, count), pos); } template inline typename basic_string_view::size_type basic_string_view::find_last_not_of(const char_type* s, size_type pos) const { return find_last_not_of(basic_string_view(s), pos); } //-------------------------------------------------------------------------- // Iterator //-------------------------------------------------------------------------- template inline typename basic_string_view::const_iterator basic_string_view::begin() const noexcept { return m_str; } template inline typename basic_string_view::const_iterator basic_string_view::cbegin() const noexcept { return begin(); } template inline typename basic_string_view::const_iterator basic_string_view::end() const noexcept { return m_str + m_size; } template inline typename basic_string_view::const_iterator basic_string_view::cend() const noexcept { return cend(); } template inline typename basic_string_view::const_reverse_iterator basic_string_view::rbegin() const noexcept { return const_reverse_iterator{end()}; } template inline typename basic_string_view::const_reverse_iterator basic_string_view::crbegin() const noexcept { return rbegin(); } template inline typename basic_string_view::const_reverse_iterator basic_string_view::rend() const noexcept { return const_reverse_iterator{begin()}; } template inline typename basic_string_view::const_reverse_iterator basic_string_view::crend() const noexcept { return crend(); } template inline bool basic_string_view::is_one_of(CharT c, basic_string_view str) { for (auto s : str) { if (c == s) { return true; } } return false; } //-------------------------------------------------------------------------- // Public Functions //-------------------------------------------------------------------------- template std::basic_ostream& operator<<(std::basic_ostream& o, const basic_string_view& str) { o.write(str.data(),str.size()); return o; } template inline void swap(basic_string_view& lhs, basic_string_view& rhs) noexcept { lhs.swap(rhs); } //-------------------------------------------------------------------------- // Comparison Functions //-------------------------------------------------------------------------- template inline bool operator==(const basic_string_view& lhs, const basic_string_view& rhs) noexcept { return lhs.compare(rhs) == 0; } template inline bool operator==(basic_string_view lhs, const CharT* rhs) noexcept { return lhs == basic_string_view(rhs); } template inline bool operator==(const CharT* lhs, const basic_string_view& rhs) noexcept { return basic_string_view(lhs) == rhs; } template inline bool operator==(const std::basic_string& lhs, const basic_string_view& rhs) { return basic_string_view(lhs) == rhs; } template inline bool operator==(const basic_string_view& lhs, const std::basic_string& rhs) { return lhs == basic_string_view(rhs); } //-------------------------------------------------------------------------- template inline bool operator!=(const basic_string_view& lhs, const basic_string_view& rhs) noexcept { return lhs.compare(rhs) != 0; } template inline bool operator!=(const basic_string_view& lhs, const CharT* rhs) noexcept { return lhs != basic_string_view(rhs); } template inline bool operator!=(const CharT* lhs, const basic_string_view& rhs) noexcept { return basic_string_view(lhs) != rhs; } template inline bool operator!=(const std::basic_string& lhs, const basic_string_view& rhs) { return basic_string_view(lhs) != rhs; } template inline bool operator!=(const basic_string_view& lhs, const std::basic_string& rhs) { return lhs != basic_string_view(rhs); } //-------------------------------------------------------------------------- template inline bool operator<(const basic_string_view& lhs, const basic_string_view& rhs) noexcept { return lhs.compare(rhs) < 0; } template inline bool operator<(const basic_string_view& lhs, const CharT* rhs) noexcept { return lhs < basic_string_view(rhs); } template inline bool operator<(const CharT* lhs, const basic_string_view& rhs) noexcept { return basic_string_view(lhs) < rhs; } template inline bool operator<(const std::basic_string& lhs, const basic_string_view& rhs) { return basic_string_view(lhs) < rhs; } template inline bool operator<(const basic_string_view& lhs, const std::basic_string& rhs) { return lhs < basic_string_view(rhs); } //-------------------------------------------------------------------------- template inline bool operator>(const basic_string_view& lhs, const basic_string_view& rhs) noexcept { return lhs.compare(rhs) > 0; } template inline bool operator>(const basic_string_view& lhs, const CharT* rhs) noexcept { return lhs > basic_string_view(rhs); } template inline bool operator>(const CharT* lhs, const basic_string_view& rhs) noexcept { return basic_string_view(lhs) > rhs; } template inline bool operator>(const std::basic_string& lhs, const basic_string_view& rhs) { return basic_string_view(lhs) > rhs; } template inline bool operator>(const basic_string_view& lhs, const std::basic_string& rhs) { return lhs > basic_string_view(rhs); } //-------------------------------------------------------------------------- template inline bool operator<=(const basic_string_view& lhs, const basic_string_view& rhs) noexcept { return lhs.compare(rhs) <= 0; } template inline bool operator<=(const basic_string_view& lhs, const CharT* rhs) noexcept { return lhs <= basic_string_view(rhs); } template inline bool operator<=(const CharT* lhs, const basic_string_view& rhs) noexcept { return basic_string_view(lhs) <= rhs; } template inline bool operator<=(const std::basic_string& lhs, const basic_string_view& rhs) { return basic_string_view(lhs) <= rhs; } template inline bool operator<=(const basic_string_view& lhs, const std::basic_string& rhs) { return lhs <= basic_string_view(rhs); } //-------------------------------------------------------------------------- template inline bool operator>=(const basic_string_view& lhs, const basic_string_view& rhs) noexcept { return lhs.compare(rhs) >= 0; } template inline bool operator>=(const basic_string_view& lhs, const CharT* rhs) noexcept { return lhs >= basic_string_view(rhs); } template inline bool operator>=(const CharT* lhs, const basic_string_view& rhs) noexcept { return basic_string_view(lhs) >= rhs; } template inline bool operator>=(const std::basic_string& lhs, const basic_string_view& rhs) { return basic_string_view(lhs) >= rhs; } template inline bool operator>=(const basic_string_view& lhs, const std::basic_string& rhs) { return lhs >= basic_string_view(rhs); } } // namespace std #endif /* BPSTD_DETAIL_STRING_VIEW_INL */ #endif /* BPSTD_STRING_VIEW_HPP */ ================================================ FILE: external/arduino/stlarduino/support ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #ifndef HEADER_ULC_SUPPORT #define HEADER_ULC_SUPPORT 1 using namespace std; //From C++ ABI spec typedef enum { _URC_NO_REASON = 0, _URC_FOREIGN_EXCEPTION_CAUGHT = 1, _URC_FATAL_PHASE2_ERROR = 2, _URC_FATAL_PHASE1_ERROR = 3, _URC_NORMAL_STOP = 4, _URC_END_OF_STACK = 5, _URC_HANDLER_FOUND = 6, _URC_INSTALL_CONTEXT = 7, _URC_CONTINUE_UNWIND = 8 } _Unwind_Reason_Code; typedef void (*_Unwind_Exception_Cleanup_Fn) (_Unwind_Reason_Code reason, struct _Unwind_Exception *exc); //The following definitions were grabbed from the gcc implementation typedef unsigned _Unwind_Ptr __attribute__((__mode__(__pointer__))); typedef unsigned _Unwind_Word __attribute__((__mode__(__word__))); typedef signed _Unwind_Sword __attribute__((__mode__(__word__))); typedef unsigned _Unwind_Exception_Class __attribute__((__mode__(__DI__))); typedef void (*_Unwind_Exception_Cleanup_Fn) (_Unwind_Reason_Code, struct _Unwind_Exception *); typedef int _Unwind_Action; static const _Unwind_Action _UA_SEARCH_PHASE = 1; static const _Unwind_Action _UA_CLEANUP_PHASE = 2; static const _Unwind_Action _UA_HANDLER_FRAME = 4; static const _Unwind_Action _UA_FORCE_UNWIND = 8; const _Unwind_Exception_Class __uclibcxx_exception_class = (((((((( _Unwind_Exception_Class) 'u' << 8 | (_Unwind_Exception_Class) 'l') << 8 | (_Unwind_Exception_Class) 'i') << 8 | (_Unwind_Exception_Class) 'b') << 8 | (_Unwind_Exception_Class) 'C')<< 8 | (_Unwind_Exception_Class) '+') << 8 | (_Unwind_Exception_Class) '+') << 8 | (_Unwind_Exception_Class) '\0'); #define _UA_SEARCH_PHASE 1 #define _UA_CLEANUP_PHASE 2 #define _UA_HANDLER_FRAME 4 #define _UA_FORCE_UNWIND 8 #define _UA_END_OF_STACK 16 struct _Unwind_Exception{ _Unwind_Exception_Class exception_class; //Type of exception, eg ulibC++\0 _Unwind_Exception_Cleanup_Fn exception_cleanup; //Destructor if from diff runtime _Unwind_Word private_1; //Don't touch at all! _Unwind_Word private_2; //Don't touch at all! } __attribute__((__aligned__)); //The following structure is system-dependent and defined by the compiler //Thus it's definition was copied from the gcc 3.4.0 header files struct _Unwind_Context; //{ // void *reg[DWARF_FRAME_REGISTERS+1]; // void *cfa; // void *ra; // void *lsda; // struct dwarf_eh_bases bases; // _Unwind_Word args_size; //}; _Unwind_Reason_Code _Unwind_RaiseException ( struct _Unwind_Exception *exception_object ); //_Unwind_ForcedUnwind typedef _Unwind_Reason_Code (*_Unwind_Stop_Fn) (int version, _Unwind_Action actions, _Unwind_Exception_Class exceptionClass, struct _Unwind_Exception *exceptionObject, struct _Unwind_Context *context, void *stop_parameter ); _Unwind_Reason_Code _Unwind_ForcedUnwind ( struct _Unwind_Exception *exception_object, _Unwind_Stop_Fn stop, void *stop_parameter ); void _Unwind_Resume (struct _Unwind_Exception *exception_object); void _Unwind_DeleteException (struct _Unwind_Exception *exception_object); _Unwind_Word _Unwind_GetGR (struct _Unwind_Context *context, int index); void _Unwind_SetGR (struct _Unwind_Context *context, int index, _Unwind_Word); _Unwind_Ptr _Unwind_GetIP (struct _Unwind_Context *context); void _Unwind_SetIP (struct _Unwind_Context *context, _Unwind_Ptr new_value); _Unwind_Ptr _Unwind_GetLanguageSpecificData (struct _Unwind_Context *context); _Unwind_Ptr _Unwind_GetRegionStart (struct _Unwind_Context *context); _Unwind_Reason_Code (*__personality_routine) (int version, //Should be 1 _Unwind_Action actions, //Actions the routine will perform (bitmask) _Unwind_Exception_Class exceptionClass, //Type of exception - vendor is high 4 bytes struct _Unwind_Exception *exceptionObject, //Points to exception header struct _Unwind_Context *context); //Unwinder state information /*The following part is the Level II ABI which is required for compatability*/ //This might be the only stuff that *I* need to implement struct __cxa_exception { std::type_info *exceptionType; //Type of thrown exception void (*exceptionDestructor) (void *); //Pointer to the destructor unexpected_handler unexpectedHandler; //Unexpected handler to use terminate_handler terminateHandler; //Terminate handle to use __cxa_exception *nextException; //per thread linked list int handlerCount; //How many handlers have caught this int handlerSwitchValue; const char *actionRecord; const char *languageSpecificData; void *catchTemp; void *adjustedPtr; _Unwind_Exception unwindHeader; }; struct __cxa_eh_globals { __cxa_exception *caughtExceptions; unsigned int uncaughtExceptions; }; extern "C" __cxa_eh_globals *__cxa_get_globals(void); //Return ptr to the eh_globals object for current thread extern "C" __cxa_eh_globals *__cxa_get_globals_fast(void); //Same as above, assumes that above called at least once extern "C" void *__cxa_allocate_exception(size_t thrown_size); //Allocate space for exception plus header extern "C" void __cxa_free_exception(void *thrown_exception); //Free space allocated from the above extern "C" void __cxa_throw (void *thrown_exception, //This is the actual throw call // std::type_info *tinfo, //Type of object void * tinfo, //Type of object void (*dest) (void *) ); //Pointer to destructor destroy object #endif ================================================ FILE: external/arduino/stlarduino/support.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include /*extern "C" void *__cxa_allocate_exception(size_t thrown_size){ void * retval; /*The amount of data needed is the size of the object *PLUS* the size of the header. The header is of struct __cxa_exception The address needs to be adjusted because the pointer we return should not point to the start of the memory, but to the point where the object being thrown actually starts retval = malloc(thrown_size + sizeof(__cxa_exception)); // Check to see that we actuall allocated memory if(retval == 0){ std::terminate(); } //Need to do a typecast to char* otherwize we are doing math with //a void* which makes the compiler cranky (Like me) return ((char *)retval + sizeof(__cxa_exception)); } extern "C" void __cxa_free_exception(void *thrown_exception){ } extern "C" void __cxa_throw (void *thrown_exception, std::type_info *tinfo,void (*dest) (void *) ){ } */ ================================================ FILE: external/arduino/stlarduino/system_configuration.h ================================================ /* * Configuration for Arduino's compiler. * >>> This is a guess <<< */ /* * Version Number */ #define __UCLIBCXX_MAJOR__ 0 #define __UCLIBCXX_MINOR__ 2 #define __UCLIBCXX_SUBLEVEL__ 4 /* * Target Features and Options */ #define __UCLIBCXX_HAS_FLOATS__ #undef __UCLIBCXX_HAS_TLS__ #define __WARNINGS__ "-Wall" #define __BUILD_EXTRA_LIBRARIES__ "" #define __HAVE_DOT_CONFIG__ 1 /* * String and I/O Stream Support */ #undef __UCLIBCXX_HAS_WCHAR__ #define __UCLIBCXX_IOSTREAM_BUFSIZE__ 32 #undef __UCLIBCXX_HAS_LFS__ #undef __UCLIBCXX_SUPPORT_CDIR__ #undef __UCLIBCXX_SUPPORT_COUT__ #undef __UCLIBCXX_SUPPORT_CERR__ /* * STL and Code Expansion */ //#define __UCLIBCXX_STL_BUFFER_SIZE__ 32 #define __UCLIBCXX_STL_BUFFER_SIZE__ 8 #undef __UCLIBCXX_CODE_EXPANSION__ /* * Library Installation Options */ #define __UCLIBCXX_RUNTIME_PREFIX__ "/usr/uClibc++" #define __UCLIBCXX_RUNTIME_INCLUDE_SUBDIR__ "/include" #define __UCLIBCXX_RUNTIME_LIB_SUBDIR__ "/lib" #define __UCLIBCXX_RUNTIME_BIN_SUBDIR__ "/bin" #undef __UCLIBCXX_EXCEPTION_SUPPORT__ #define __BUILD_STATIC_LIB__ 1 #define __BUILD_ONLY_STATIC_LIB__ 1 #undef __DODEBUG__ ================================================ FILE: external/arduino/stlarduino/tuple ================================================ #ifndef ARDUINO_TUPLE_H #define ARDUINO_TUPLE_H namespace std { template struct microTupleGetHelper; template struct tuple { }; template struct seq {}; template struct gens : gens { }; template struct gens<0, S...>{ typedef seq type; }; template struct tuple { tuple(){}; tuple(const T& first, const Rest& ... rest) : first(first) , rest(rest...) {} T first; tuple rest; template auto get() -> decltype(microTupleGetHelper>::get(*this)) { return microTupleGetHelper>::get(*this); } }; template struct microTupleGetHelper<0, tuple> { static T get(tuple& data) { return data.first; } }; template struct microTupleGetHelper> { static auto get(tuple& data) -> decltype(microTupleGetHelper>::get(data.rest)) { return microTupleGetHelper>::get(data.rest); } }; template class ParamsPack { public: tuple params; operator bool() const { if (func) return true; return false; }; void (*func)(Args...); private: template auto callFunc(seq) -> decltype(this->func(this->params.template get() ...)) { return func(params.template get() ...); } public: auto getPack() -> decltype(this->callFunc(typename gens::type())) { return this->callFunc(typename gens::type()); // Item #1 } }; } #endif ================================================ FILE: external/arduino/stlarduino/type_traits ================================================ /* Copyright (C) 2005 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #ifndef __HEADER_TYPE_TRAITS #define __HEADER_TYPE_TRAITS 1 #pragma GCC visibility push(default) namespace std{ struct _UCXXEXPORT __true_type{}; struct _UCXXEXPORT __false_type{}; template class _UCXXEXPORT __is_integer{ public: typedef __false_type value; }; template <> class _UCXXEXPORT __is_integer { public: typedef __true_type value; }; template <> class _UCXXEXPORT __is_integer { public: typedef __true_type value; }; template <> class _UCXXEXPORT __is_integer { public: typedef __true_type value; }; template <> class _UCXXEXPORT __is_integer { public: typedef __true_type value; }; template <> class _UCXXEXPORT __is_integer { public: typedef __true_type value; }; template <> class _UCXXEXPORT __is_integer { public: typedef __true_type value; }; template <> class _UCXXEXPORT __is_integer { public: typedef __true_type value; }; template <> class _UCXXEXPORT __is_integer { public: typedef __true_type value; }; template <> class _UCXXEXPORT __is_integer { public: typedef __true_type value; }; } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/typeinfo ================================================ // RTTI support for -*- C++ -*- // Copyright (C) 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002 // Free Software Foundation // // This file is part of GNU CC. // // GNU CC is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2, or (at your option) // any later version. // // GNU CC is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with GNU CC; see the file COPYING. If not, write to // the Free Software Foundation, 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. /** @file typeinfo * This header provides RTTI support. */ #ifndef __TYPEINFO__ #define __TYPEINFO__ #include extern "C++" { namespace __cxxabiv1 { class __class_type_info; } // namespace __cxxabiv1 #if !__GXX_WEAK__ // If weak symbols are not supported, typeinfo names are not merged. #define __GXX_MERGED_TYPEINFO_NAMES 0 #else // On platforms that support weak symbols, typeinfo names are merged. #define __GXX_MERGED_TYPEINFO_NAMES 1 #endif namespace std { /** * @brief Part of RTTI. * * The @c type_info class describes type information generated by * an implementation. */ class type_info { public: /** Destructor. Being the first non-inline virtual function, this * controls in which translation unit the vtable is emitted. The * compiler makes use of that information to know where to emit * the runtime-mandated type_info structures in the new-abi. */ virtual ~type_info(); private: /// Assigning type_info is not supported. Made private. type_info& operator=(const type_info&); type_info(const type_info&); protected: const char *__name; protected: explicit type_info(const char *__n): __name(__n) { } public: // the public interface /** Returns an @e implementation-defined byte string; this is not * portable between compilers! */ const char* name() const { return __name; } #if !__GXX_MERGED_TYPEINFO_NAMES bool before(const type_info& __arg) const; // In old abi, or when weak symbols are not supported, there can // be multiple instances of a type_info object for one // type. Uniqueness must use the _name value, not object address. bool operator==(const type_info& __arg) const; #else /** Returns true if @c *this precedes @c __arg in the implementation's * collation order. */ // In new abi we can rely on type_info's NTBS being unique, // and therefore address comparisons are sufficient. bool before(const type_info& __arg) const { return __name < __arg.__name; } bool operator==(const type_info& __arg) const { return __name == __arg.__name; } #endif bool operator!=(const type_info& __arg) const { return !operator==(__arg); } // the internal interface public: // return true if this is a pointer type of some kind virtual bool __is_pointer_p() const; // return true if this is a function type virtual bool __is_function_p() const; // Try and catch a thrown type. Store an adjusted pointer to the // caught type in THR_OBJ. If THR_TYPE is not a pointer type, then // THR_OBJ points to the thrown object. If THR_TYPE is a pointer // type, then THR_OBJ is the pointer itself. OUTER indicates the // number of outer pointers, and whether they were const // qualified. virtual bool __do_catch(const type_info *__thr_type, void **__thr_obj, unsigned __outer) const; // internally used during catch matching virtual bool __do_upcast(const __cxxabiv1::__class_type_info *__target, void **__obj_ptr) const; }; /** * @brief Thrown during incorrect typecasting. * * If you attempt an invalid @c dynamic_cast expression, an instance of * this class (or something derived from this class) is thrown. */ class bad_cast : public exception { public: bad_cast() throw() { } // This declaration is not useless: // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118 virtual ~bad_cast() throw(); }; /** If you use a NULL pointer in a @c typeid expression, this is thrown. */ class bad_typeid : public exception { public: bad_typeid () throw() { } // This declaration is not useless: // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118 virtual ~bad_typeid() throw(); }; } // namespace std } // extern "C++" #endif ================================================ FILE: external/arduino/stlarduino/typeinfo.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include namespace std{ _UCXXEXPORT bad_cast::~bad_cast() throw(){ } _UCXXEXPORT bad_typeid::~bad_typeid() throw(){ } } ================================================ FILE: external/arduino/stlarduino/unwind-cxx.h ================================================ // -*- C++ -*- Exception handling and frame unwind runtime interface routines. // Copyright (C) 2001 Free Software Foundation, Inc. // // This file is part of GCC. // // GCC is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2, or (at your option) // any later version. // // GCC is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with GCC; see the file COPYING. If not, write to // the Free Software Foundation, 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // This is derived from the C++ ABI for IA-64. Where we diverge // for cross-architecture compatibility are noted with "@@@". #ifndef _UNWIND_CXX_H #define _UNWIND_CXX_H 1 // Level 2: C++ ABI #include #include #include #include "unwind.h" #ifdef __aarch64__ typedef long _Atomic_word; #elif defined __cris__ typedef int _Atomic_word __attribute__ ((__aligned__ (4))); #else typedef int _Atomic_word; #endif #pragma GCC visibility push(default) namespace __cxxabiv1 { // A primary C++ exception object consists of a header, which is a wrapper // around an unwind object header with additional C++ specific information, // followed by the exception object itself. struct __cxa_exception { // Manage the exception object itself. std::type_info *exceptionType; void (*exceptionDestructor)(void *); // The C++ standard has entertaining rules wrt calling set_terminate // and set_unexpected in the middle of the exception cleanup process. std::unexpected_handler unexpectedHandler; std::terminate_handler terminateHandler; // The caught exception stack threads through here. __cxa_exception *nextException; // How many nested handlers have caught this exception. A negated // value is a signal that this object has been rethrown. int handlerCount; // Cache parsed handler data from the personality routine Phase 1 // for Phase 2 and __cxa_call_unexpected. int handlerSwitchValue; const unsigned char *actionRecord; const unsigned char *languageSpecificData; _Unwind_Ptr catchTemp; void *adjustedPtr; // The generic exception header. Must be last. _Unwind_Exception unwindHeader; }; struct __cxa_refcounted_exception { // Manage this header. _Atomic_word referenceCount; // __cxa_exception must be last, and no padding can be after it. __cxa_exception exc; }; // A dependent C++ exception object consists of a header, which is a wrapper // around an unwind object header with additional C++ specific information, // followed by the exception object itself. struct __cxa_dependent_exception { // The primary exception void *primaryException; // The C++ standard has entertaining rules wrt calling set_terminate // and set_unexpected in the middle of the exception cleanup process. std::unexpected_handler unexpectedHandler; std::terminate_handler terminateHandler; // The caught exception stack threads through here. __cxa_exception *nextException; // How many nested handlers have caught this exception. A negated // value is a signal that this object has been rethrown. int handlerCount; // Cache parsed handler data from the personality routine Phase 1 // for Phase 2 and __cxa_call_unexpected. int handlerSwitchValue; const unsigned char *actionRecord; const unsigned char *languageSpecificData; _Unwind_Ptr catchTemp; void *adjustedPtr; // The generic exception header. Must be last. _Unwind_Exception unwindHeader; }; // Each thread in a C++ program has access to a __cxa_eh_globals object. struct __cxa_eh_globals { __cxa_exception *caughtExceptions; unsigned int uncaughtExceptions; }; // The __cxa_eh_globals for the current thread can be obtained by using // either of the following functions. The "fast" version assumes at least // one prior call of __cxa_get_globals has been made from the current // thread, so no initialization is necessary. extern "C" __cxa_eh_globals *__cxa_get_globals () throw(); extern "C" __cxa_eh_globals *__cxa_get_globals_fast () throw(); // Allocate memory for the primary exception plus the thrown object. extern "C" void *__cxa_allocate_exception(std::size_t thrown_size) throw(); // Allocate memory for dependent exception. extern "C" __cxa_dependent_exception *__cxa_allocate_dependent_exception() throw(); // Free the space allocated for the primary exception. extern "C" void __cxa_free_exception(void *thrown_exception) throw(); // Free the space allocated for the dependent exception. extern "C" void __cxa_free_dependent_exception(__cxa_dependent_exception *dependent_exception) throw(); // Throw the exception. extern "C" void __cxa_throw (void *thrown_exception, std::type_info *tinfo, void (*dest) (void *)) __attribute__((noreturn)); // Used to implement exception handlers. extern "C" void *__cxa_begin_catch (void *) throw(); extern "C" void __cxa_end_catch (); extern "C" void __cxa_rethrow () __attribute__((noreturn)); // These facilitate code generation for recurring situations. extern "C" void __cxa_bad_cast (); extern "C" void __cxa_bad_typeid (); // @@@ These are not directly specified by the IA-64 C++ ABI. // Handles re-checking the exception specification if unexpectedHandler // throws, and if bad_exception needs to be thrown. Called from the // compiler. extern "C" void __cxa_call_unexpected (void *) __attribute__((noreturn)); // Invokes given handler, dying appropriately if the user handler was // so inconsiderate as to return. extern void __terminate(std::terminate_handler) throw () __attribute__((noreturn)); extern void __unexpected(std::unexpected_handler) __attribute__((noreturn)); // The current installed user handlers. extern std::terminate_handler __terminate_handler; extern std::unexpected_handler __unexpected_handler; // These are explicitly GNU C++ specific. // This is the exception class we report -- "GNUCC++\0". const _Unwind_Exception_Class __gxx_exception_class #ifndef __ARM_EABI_UNWINDER__ = ((((((((_Unwind_Exception_Class) 'G' << 8 | (_Unwind_Exception_Class) 'N') << 8 | (_Unwind_Exception_Class) 'U') << 8 | (_Unwind_Exception_Class) 'C') << 8 | (_Unwind_Exception_Class) 'C') << 8 | (_Unwind_Exception_Class) '+') << 8 | (_Unwind_Exception_Class) '+') << 8 | (_Unwind_Exception_Class) '\0'); #else = "GNUCC++"; #endif // GNU C++ personality routine, Version 0. extern "C" _Unwind_Reason_Code __gxx_personality_v0 (int, _Unwind_Action, _Unwind_Exception_Class, struct _Unwind_Exception *, struct _Unwind_Context *); // GNU C++ sjlj personality routine, Version 0. extern "C" _Unwind_Reason_Code __gxx_personality_sj0 (int, _Unwind_Action, _Unwind_Exception_Class, struct _Unwind_Exception *, struct _Unwind_Context *); // Acquire the C++ exception header from the C++ object. static inline __cxa_exception * __get_exception_header_from_obj (void *ptr) { return reinterpret_cast<__cxa_exception *>(ptr) - 1; } // Acquire the C++ exception header from the generic exception header. static inline __cxa_exception * __get_exception_header_from_ue (_Unwind_Exception *exc) { return reinterpret_cast<__cxa_exception *>(exc + 1) - 1; } // Acquire the C++ refcounted exception header from the C++ object. static inline __cxa_refcounted_exception * __get_refcounted_exception_header_from_obj (void *ptr) { return reinterpret_cast<__cxa_refcounted_exception *>(ptr) - 1; } // Acquire the C++ refcounted exception header from the generic exception // header. static inline __cxa_refcounted_exception * __get_refcounted_exception_header_from_ue (_Unwind_Exception *exc) { return reinterpret_cast<__cxa_refcounted_exception *>(exc + 1) - 1; } } /* namespace __cxxabiv1 */ #pragma GCC visibility pop #endif // _UNWIND_CXX_H ================================================ FILE: external/arduino/stlarduino/utility ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #ifndef __STD_HEADER_UTILITY #define __STD_HEADER_UTILITY 1 #pragma GCC visibility push(default) namespace std{ namespace rel_ops { template inline bool operator!=(const T& x, const T& y){ return !(x == y); } template inline bool operator> (const T& x, const T& y){ return ( y < x); } template inline bool operator<=(const T& x, const T& y){ return !( y < x ); } template inline bool operator>=(const T& x, const T& y){ return !(x < y); } } template struct _UCXXEXPORT pair { typedef T1 first_type; typedef T2 second_type; T1 first; T2 second; pair() : first(), second() { } pair(const T1& x, const T2& y) : first(x), second(y) { } template pair(const pair &p) : first(p.first), second(p.second) { } }; template bool operator==(const pair& x, const pair& y){ using namespace rel_ops; return (x.first == y.first && x.second==y.second); } template bool operator< (const pair& x, const pair& y){ return x.first < y.first || (!(y.first < x.first) && x.second < y.second); } template bool operator!=(const pair& x, const pair& y){ return !(x == y); } template bool operator> (const pair& x, const pair& y){ return y < x; } template bool operator>=(const pair& x, const pair& y){ return !(x < y); } template bool operator<=(const pair& x, const pair& y){ return !(y < x); } template pair make_pair(const T1& x, const T2& y){ return pair(x, y); } } #pragma GCC visibility pop #endif //__STD_HEADER_UTILITY ================================================ FILE: external/arduino/stlarduino/utility.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include namespace std{ } ================================================ FILE: external/arduino/stlarduino/valarray ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #ifndef __HEADER_STD_VALARRAY #define __HEADER_STD_VALARRAY 1 #include #include #pragma GCC visibility push(default) namespace std{ template class valarray; class slice; template class slice_array; class gslice; template class gslice_array; template class mask_array; template class indirect_array; //Actual class definitions class _UCXXEXPORT slice { protected: size_t sta; size_t siz; size_t str; public: slice() : sta(0), siz(0), str(0){ } slice(size_t a, size_t b, size_t c) : sta(a), siz(b), str(c) { } slice(const slice& s) : sta(s.sta), siz(s.siz), str(s.str) { } ~slice() { } size_t start() const{ return sta; } size_t size() const{ return siz; } size_t stride() const{ return str; } }; template class _UCXXEXPORT valarray { friend class slice_array; protected: T * data; size_t length; public: typedef T value_type; valarray() : data(0), length(0) { } explicit valarray(size_t t) : data(0), length(t){ data = new T[length]; } valarray(const T& v, size_t t) : data(0), length(t){ data = new T[length]; for(size_t i = 0; i < length; ++i){ data[i] = v; } } valarray(const T* p, size_t t) : data(0), length(t) { data = new T[length]; for(size_t i = 0; i < length; ++i){ data[i] = p[i]; } } valarray(const valarray& v) : data(0), length(v.length){ data = new T[length]; for(size_t i = 0; i < length; ++i){ data[i] = v.data[i]; } } valarray(const slice_array & sa) : data(0), length(sa.s.size()){ data = new T[length]; for(unsigned int i = 0; i < length; ++i){ data[i] = sa.array->data[sa.s.start() + i * sa.s.stride()]; } } valarray(const gslice_array&); valarray(const mask_array&); valarray(const indirect_array&); ~valarray(){ delete [] data; data = 0; length = 0; } valarray& operator=(const valarray& v){ if (length != v.length) { // DR 630 delete [] data; length = v.length; data = new T[length]; } for (size_t i = 0; i < length; ++i) { data[i] = v.data[i]; } return *this; } valarray& operator=(const T& t){ for(size_t i = 0; i < length; ++i){ data[i] = t; } return *this; } valarray& operator=(const slice_array& sa){ for(size_t i =0; i < length; ++i){ data[i] = sa.data[sa.s.start() + i * sa.s.stride()]; } return *this; } valarray& operator=(const gslice_array&); valarray& operator=(const mask_array&); valarray& operator=(const indirect_array&); const T& operator[](size_t t) const{ return data[t]; } T& operator[](size_t t){ return data[t]; } valarray operator[](slice s) const{ valarray retval(s.size()); for(unsigned int i = 0; i< s.size(); ++i){ retval.data[i] = data[s.start() + i * s.stride()]; } return retval; } slice_array operator[](slice sl){ slice_array retval; retval.s = sl; retval.array = this; return retval; } valarray operator[](const gslice&) const; gslice_array operator[](const gslice&); valarray operator[](const valarray&) const; mask_array operator[](const valarray&); valarray operator[](const valarray&) const; indirect_array operator[](const valarray&); valarray operator+() const{ valarray retval(length); for(size_t i = 0; i< length ; ++i){ retval.data[i] = +data[i]; } return retval; } valarray operator-() const{ valarray retval(length); for(size_t i = 0; i< length; ++i){ retval.data[i] = -data[i]; } return retval; } valarray operator~() const{ valarray retval(length); for(size_t i = 0; i< length ; ++i){ retval.data[i] = ~data[i]; } return retval; } valarray operator!() const{ valarray retval(length); for (size_t i = 0; i < length ; ++i){ retval[i] = !data[i]; } return retval; } valarray& operator*= (const T& t){ for(size_t i=0;i& operator/= (const T& t){ for(size_t i=0;i& operator%= (const T& t){ for(size_t i=0;i& operator+= (const T& t){ for(size_t i=0;i& operator-= (const T& t){ for(size_t i=0;i& operator^= (const T& t){ for(size_t i=0;i& operator&= (const T& t){ for(size_t i=0;i& operator|= (const T& t){ for(size_t i=0;i& operator<<=(const T& t){ for(size_t i=0;i& operator>>=(const T& t){ for(size_t i=0;i>= t; } return *this; } valarray& operator*= (const valarray& a){ for(size_t i=0;i& operator/= (const valarray& a){ for(size_t i=0;i& operator%= (const valarray& a){ for(size_t i=0;i& operator+= (const valarray& a){ for(size_t i=0;i& operator-= (const valarray& a){ for(size_t i=0;i& operator^= (const valarray& a){ for(size_t i=0;i& operator|= (const valarray& a){ for(size_t i=0;i& operator&= (const valarray& a){ for(size_t i=0;i& operator<<=(const valarray& a){ for(size_t i=0;i& operator>>=(const valarray& a){ for(size_t i=0;i>= a.data[i]; } return *this; } #if 0 void swap(valarray& other) noexcept { std::swap(length, other.length); std::swap(data, other.data); } #endif size_t size() const{ return length; } T sum() const{ T retval(data[0]); for(size_t i = 1; i< length; ++i){ retval += data[i]; } return retval; } T min() const{ T retval(data[0]); for(size_t i = 1; i< length; ++i){ if(data[i] < retval){ retval = data[i]; } } return retval; } T max() const{ T retval(data[0]); for(size_t i = 1; i< length; ++i){ if(retval < data[i]){ retval = data[i]; } } return retval; } valarray shift (int n) const{ valarray retval(length); if (n < 0) { if (-size_t(n) > length) n = -int(length); } else { if (size_t(n) > length) n = int(length); } for (size_t i = 0; i < length ; ++i) { if ((n + i) < length) retval.data[i] = data[n + i]; } return retval; } valarray cshift(int n) const{ valarray retval(length); if (length == 0) return retval; if (n < 0) { if (-size_t(n) > length) n = -int(-size_t(n) % length); n = length + n; } else { if (size_t(n) > length) n = int(size_t(n) % length); } for (size_t i = 0; i < length ; ++i){ retval.data[i] = data[(n + i) % length]; } return retval; } valarray apply(T func(T) ) const{ valarray retval(length); for(size_t i = 0; i< length; ++i){ retval.data[i] = func(data[i]); } return retval; } valarray apply(T func(const T&)) const{ valarray retval(length); for(size_t i = 0; i< length; ++i){ retval.data[i] = func(data[i]); } return retval; } void resize(size_t sz, T c = T()){ delete [] data; data = 0; if(sz > 0){ data = new T[sz]; for(size_t i = 0; i < sz; ++i){ data[i] = c; } } length = sz; } }; template class _UCXXEXPORT slice_array { friend class valarray; public: typedef T value_type; void operator= (const valarray& v) const{ for(unsigned int i = 0; i < s.size(); ++i){ array->data[s.start() + i * s.stride()] = v[i]; } } void operator= (const T & v){ for(unsigned int i = 0; i < s.size(); ++i){ array->data[s.start() + i * s.stride()] = v; } } void fill(const T & v){ for(unsigned int i = 0; i < s.size(); ++i){ array->data[s.start() + i * s.stride()] = v; } } void operator*= (const valarray& v) const{ for(unsigned int i = 0; i < s.size(); ++i){ array->data[s.start() + i * s.stride()] *= v[i]; } } void operator/= (const valarray& v) const{ for(unsigned int i = 0; i < s.size(); ++i){ array->data[s.start() + i * s.stride()] /= v[i]; } } void operator%= (const valarray& v) const{ for(unsigned int i = 0; i < s.size(); ++i){ array->data[s.start() + i * s.stride()] %= v[i]; } } void operator+= (const valarray& v) const{ for(unsigned int i = 0; i < s.size(); ++i){ array->data[s.start() + i * s.stride()] += v[i]; } } void operator-= (const valarray& v) const{ for(unsigned int i = 0; i < s.size(); ++i){ array->data[s.start() + i * s.stride()] -= v[i]; } } void operator^= (const valarray& v) const{ for(unsigned int i = 0; i < s.size(); ++i){ array->data[s.start() + i * s.stride()] ^= v[i]; } } void operator&= (const valarray& v) const{ for(unsigned int i = 0; i < s.size(); ++i){ array->data[s.start() + i * s.stride()] &= v[i]; } } void operator|= (const valarray& v) const{ for(unsigned int i = 0; i < s.size(); ++i){ array->data[s.start() + i * s.stride()] |= v[i]; } } void operator<<=(const valarray& v) const{ for(unsigned int i = 0; i < s.size(); ++i){ array->data[s.start() + i * s.stride()] <<= v[i]; } } void operator>>=(const valarray& v) const{ for(unsigned int i = 0; i < s.size(); ++i){ array->data[s.start() + i * s.stride()] >>= v[i]; } } ~slice_array(){ array = 0; } private: slice_array() : array(0){ } public: slice_array(const slice_array& sa) : array(sa.array), s(sa.s){ } slice_array& operator=(const slice_array& sa){ array = sa.array; s = sa.s; return *this; } private: valarray * array; slice s; }; class _UCXXEXPORT gslice { private: size_t sta; valarray siz; valarray str; public: gslice() : sta(0), siz(), str() { } // DR 543 gslice(size_t s, const valarray& l, const valarray& d) : sta(s), siz(l), str(d) { } size_t start() const{ return sta; } valarray size() const{ return siz; } valarray stride() const{ return str; } }; template class gslice_array { private: friend class valarray; public: ~gslice_array(); void operator=(const valarray& array) const; void operator*=(const valarray& array) const; void operator/=(const valarray& array) const; void operator%=(const valarray& array) const; void operator+=(const valarray& array) const; void operator-=(const valarray& array) const; void operator^=(const valarray& array) const; void operator&=(const valarray& array) const; void operator|=(const valarray& array) const; void operator<<=(const valarray& array) const; void operator>>=(const valarray& array) const; void operator=(const T&); private: gslice_array(); gslice_array(const gslice_array&); gslice_array& operator= (const gslice_array& array); }; template valarray operator* (const valarray& lhs, const valarray& rhs){ valarray retval(lhs); retval *= rhs; return retval; } template valarray operator* (const valarray& lhs, const T& rhs){ valarray retval(lhs); retval *= rhs; return retval; } template valarray operator* (const T& lhs, const valarray& rhs){ valarray retval(rhs); retval *= lhs; return retval; } template valarray operator/ (const valarray& lhs, const valarray& rhs){ valarray retval(lhs); retval /= rhs; return retval; } template valarray operator/ (const valarray& lhs, const T& rhs){ valarray retval(lhs); retval /= rhs; return retval; } template valarray operator/ (const T& lhs, const valarray& rhs){ valarray retval(lhs, rhs.size()); retval /= rhs; return retval; } template valarray operator% (const valarray& lhs, const valarray& rhs){ valarray retval(lhs); retval %= rhs; return retval; } template valarray operator% (const valarray& lhs, const T& rhs){ valarray retval(lhs); retval %= rhs; return retval; } template valarray operator% (const T& lhs, const valarray& rhs){ valarray retval(lhs, rhs.size()); retval %= rhs; return retval; } template valarray operator+ (const valarray& lhs, const valarray& rhs){ valarray retval(lhs); retval += rhs; return retval; } template valarray operator+ (const valarray& lhs, const T& rhs){ valarray retval(lhs); retval += rhs; return retval; } template valarray operator+ (const T& lhs, const valarray& rhs){ valarray retval(lhs, rhs.size()); retval += rhs; return retval; } template valarray operator- (const valarray& lhs, const valarray& rhs){ valarray retval(lhs); retval -= rhs; return retval; } template valarray operator- (const valarray& lhs, const T& rhs){ valarray retval(lhs); retval -= rhs; return retval; } template valarray operator- (const T& lhs, const valarray& rhs){ valarray retval(lhs, rhs.size()); retval -= rhs; return retval; } template valarray operator^ (const valarray& lhs, const valarray& rhs){ valarray retval(lhs); retval ^= rhs; return retval; } template valarray operator^ (const valarray& lhs, const T& rhs){ valarray retval(lhs); retval ^= rhs; return retval; } template valarray operator^ (const T& lhs, const valarray& rhs){ valarray retval(lhs, rhs.size()); retval ^= rhs; return retval; } template valarray operator& (const valarray& lhs, const valarray& rhs){ valarray retval(lhs); retval &= rhs; return retval; } template valarray operator& (const valarray& lhs, const T& rhs){ valarray retval(lhs); retval &= rhs; return retval; } template valarray operator& (const T& lhs, const valarray& rhs){ valarray retval(lhs, rhs.size()); retval &= rhs; return retval; } template valarray operator| (const valarray& lhs, const valarray& rhs){ valarray retval(lhs); retval |= rhs; return retval; } template valarray operator| (const valarray& lhs, const T& rhs){ valarray retval(lhs); retval |= rhs; return retval; } template valarray operator| (const T& lhs, const valarray& rhs){ valarray retval(lhs, rhs.size()); retval |= rhs; return retval; } template valarray operator<<(const valarray& lhs, const valarray& rhs){ valarray retval(lhs); retval <<= rhs; return retval; } template valarray operator<<(const valarray& lhs, const T& rhs){ valarray retval(lhs); retval <<= rhs; return retval; } template valarray operator<<(const T& lhs, const valarray& rhs){ valarray retval(lhs, rhs.size()); retval <<= rhs; return retval; } template valarray operator>>(const valarray& lhs, const valarray& rhs){ valarray retval(lhs); retval >>= rhs; return retval; } template valarray operator>>(const valarray& lhs, const T& rhs){ valarray retval(lhs); retval >>= rhs; return retval; } template valarray operator>>(const T& lhs, const valarray& rhs){ valarray retval(lhs, rhs.size()); retval >>= rhs; return retval; } template valarray operator&&(const valarray& lhs, const valarray& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = lhs[i] && rhs[i]; } return retval; } template valarray operator&&(const valarray& lhs, const T& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i valarray operator&&(const T& lhs, const valarray& rhs){ valarray retval(rhs.size()); for(size_t i = 0; i valarray operator||(const valarray&lhs, const valarray& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i valarray operator||(const valarray& lhs, const T& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i valarray operator||(const T& lhs, const valarray& rhs){ valarray retval(rhs.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = lhs || rhs[i]; } return retval; } template valarray operator==(const valarray& lhs, const valarray& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i valarray operator==(const valarray& lhs, const T& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = lhs[i] == rhs; } return retval; } template valarray operator==(const T& lhs, const valarray& rhs){ valarray retval(rhs.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = lhs == rhs[i]; } return retval; } template valarray operator!=(const valarray& lhs, const valarray& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i valarray operator!=(const valarray& lhs, const T& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i valarray operator!=(const T& lhs, const valarray& rhs){ valarray retval(rhs.size()); for(size_t i = 0; i valarray operator< (const valarray& lhs, const valarray& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i valarray operator< (const valarray& lhs, const T& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i valarray operator< (const T& lhs, const valarray& rhs){ valarray retval(rhs.size()); for(size_t i = 0; i valarray operator> (const valarray& lhs, const valarray& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i rhs[i]; } return retval; } template valarray operator> (const valarray& lhs, const T& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i rhs; } return retval; } template valarray operator> (const T& lhs, const valarray& rhs){ valarray retval(rhs.size()); for(size_t i = 0; i rhs[i]; } return retval; } template valarray operator<=(const valarray& lhs, const valarray& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i valarray operator<=(const valarray& lhs, const T& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i valarray operator<=(const T& lhs, const valarray& rhs){ valarray retval(rhs.size()); for(size_t i = 0; i valarray operator>=(const valarray& lhs, const valarray& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i = rhs[i]; } return retval; } template valarray operator>=(const valarray& lhs, const T& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i = rhs; } return retval; } template valarray operator>=(const T& lhs, const valarray& rhs){ valarray retval(rhs.size()); for(size_t i = 0; i = rhs[i]; } return retval; } template T min(const valarray& x){ T retval(x[0]); for(size_t i = 1; i < x.size(); ++i){ if(x[i] < retval){ retval = x[i]; } } } template T max(const valarray& x){ T retval(x[0]); for(size_t i = 1; i < x.size(); ++i){ if(x[i] > retval){ retval = x[i]; } } } template valarray abs (const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = abs(x[i]); } return retval; } template valarray acos (const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = acos(x[i]); } return retval; } template valarray asin (const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = asin(x[i]); } return retval; } template valarray atan (const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = atan(x[i]); } return retval; } template valarray atan2(const valarray& y, const valarray& x){ valarray retval(y.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = atan2(y[i], x[i]); } return retval; } template valarray atan2(const valarray& y, const T& x){ valarray retval(y.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = atan2(y[i], x); } return retval; } template valarray atan2(const T& y, const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = atan2(y, x[i]); } return retval; } template valarray cos (const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = cos(x[i]); } return retval; } template valarray cosh (const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = cosh(x[i]); } return retval; } template valarray exp (const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = exp(x[i]); } return retval; } template valarray log (const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = log(x[i]); } return retval; } template valarray log10(const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = log10(x[i]); } return retval; } template valarray pow (const valarray& x, const valarray& y){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = pow(x[i], y[i]); } return retval; } template valarray pow (const valarray& x, const T& y){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = pow(x[i], y); } return retval; } template valarray pow (const T& x, const valarray& y){ valarray retval(y.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = pow(x, y[i]); } return retval; } template valarray sin (const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = sin(x[i]); } return retval; } template valarray sinh (const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = sinh(x[i]); } return retval; } template valarray sqrt (const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = sqrt(x[i]); } return retval; } template valarray tan (const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = tan(x[i]); } return retval; } template valarray tanh (const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = tanh(x[i]); } return retval; } } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/valarray.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include namespace std{ } ================================================ FILE: external/arduino/stlarduino/vector ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include #ifndef __STD_HEADER_VECTOR #define __STD_HEADER_VECTOR #pragma GCC visibility push(default) namespace std{ template > class vector; template bool operator==(const vector& x, const vector& y); template bool operator< (const vector& x, const vector& y); template bool operator!=(const vector& x, const vector& y); template bool operator> (const vector& x, const vector& y); template bool operator>=(const vector& x, const vector& y); template bool operator<=(const vector& x, const vector& y); template void swap(vector& x, vector& y); template class _UCXXEXPORT vector { public: typedef typename Allocator::reference reference; typedef typename Allocator::const_reference const_reference; typedef typename Allocator::size_type size_type; typedef typename Allocator::difference_type difference_type; typedef typename Allocator::pointer pointer; typedef typename Allocator::const_pointer const_pointer; typedef T* iterator; typedef const T* const_iterator; typedef T value_type; typedef Allocator allocator_type; typedef std::reverse_iterator reverse_iterator; typedef std::reverse_iterator const_reverse_iterator; explicit _UCXXEXPORT vector(const Allocator& al= Allocator()): data(0), //defaultValue(T()), data_size(__UCLIBCXX_STL_BUFFER_SIZE__), elements(0), a(al) { data = a.allocate(data_size); } explicit _UCXXEXPORT vector(size_type n, const T& value = T(), const Allocator& al= Allocator()) : data(0), data_size(0), elements(0), a(al) { data_size = n + __UCLIBCXX_STL_BUFFER_SIZE__; data = a.allocate(data_size); resize(n, value); } template _UCXXEXPORT vector(InputIterator first, InputIterator last, const Allocator& al = Allocator()): data(0), data_size(__UCLIBCXX_STL_BUFFER_SIZE__), elements(0), a(al) { data = a.allocate(data_size); assign(first, last); } _UCXXEXPORT vector(const vector& x){ a = x.a; elements = x.elements; data_size = elements + __UCLIBCXX_STL_BUFFER_SIZE__; data = a.allocate(data_size); for(size_type i = 0; i < elements; i++){ a.construct(data+i, x.data[i]); } } _UCXXEXPORT vector(initializer_list in, const Allocator & al=Allocator()) : a(al) { data_size = in.size() + __UCLIBCXX_STL_BUFFER_SIZE__; elements = in.size(); data = a.allocate(data_size); for(size_type i = 0; i < elements; i++) a.construct(data+i, *(in.begin()+i)); } _UCXXEXPORT ~vector(); //Below _UCXXEXPORT vector& operator=(const vector& x){ if(&x == this){ return *this; } reserve(x.elements); //Make sure that we have enough actual memory //Copy as many elements as possible size_t minElements = elements; if(minElements > x.elements){ minElements = x.elements; } for(size_t i = 0; i < minElements; ++i){ data[i] = x.data[i]; } //If we need to add new elements if(elements < x.elements){ for(size_t i = elements; i< x.elements; ++i){ a.construct(data+i, x.data[i]); ++elements; } } if(elements > x.elements){ downsize(x.elements); } return *this; } template _UCXXEXPORT void assign(InputIterator first, InputIterator last){ clear(); insert(begin(), first, last); } template _UCXXEXPORT void assign(Size n, const U& u = U()){ clear(); resize(n, u); } _UCXXEXPORT void assign(initializer_list in){ clear(); insert(begin(), in.begin(), in.end()); } inline allocator_type get_allocator() const{ return a; } inline iterator begin(){ return data; } inline const_iterator begin() const{ return data; } inline iterator end(){ return (data + elements); } inline const_iterator end() const{ return (data + elements); } inline reverse_iterator rbegin(){ return reverse_iterator(end()); } inline const_reverse_iterator rbegin() const{ return const_reverse_iterator(end()); } inline reverse_iterator rend(){ return reverse_iterator(begin()); } inline const_reverse_iterator rend() const{ return const_reverse_iterator(begin()); } inline size_type size() const{ return elements; } _UCXXEXPORT size_type max_size() const{ return ((size_type)(-1)) / sizeof(T); } void downsize(size_type sz); void resize(size_type sz, const T & c = T()); inline size_type capacity() const{ return data_size; } inline bool empty() const{ return (size() == 0); } void reserve(size_type n); inline reference operator[](size_type n){ return data[n]; } inline const_reference operator[](size_type n) const{ return data[n]; } _UCXXEXPORT const_reference at(size_type n) const{ if(n >= elements){ __throw_out_of_range("Invalid subscript"); } return data[n]; } _UCXXEXPORT reference at(size_type n){ if(n >= elements){ __throw_out_of_range("Invalid subscript"); } return data[n]; } inline reference front(){ return data[0]; } inline const_reference front() const{ return data[0]; } inline reference back(){ return data[ size() - 1]; } inline const_reference back() const{ return data[ size() - 1 ]; } inline void push_back(const T& x){ resize( size() + 1, x); } inline void pop_back(){ downsize(size() - 1); } _UCXXEXPORT iterator insert(iterator position, const T& x = T()){ size_type index = position - data; resize(size() + 1, x); for(size_type i = elements - 1; i > index; --i){ data[i] = data[i-1]; } data[index] = x; return (data + index); } _UCXXEXPORT void _insert_fill(iterator position, size_type n, const T & x){ size_type index = position - data; resize(size() + n, x); for(size_type i = elements -1; (i > (index+n-1)); --i){ data[i] = data[i-n]; } for(size_type i = 0; i < n; i++){ data[i + index] = x; } } template _UCXXEXPORT void _insert_from_iterator(iterator position, InputIterator first, InputIterator last) { T temp; while(first !=last){ temp = *first; position = insert(position, temp); ++position; ++first; } } template inline void _dispatch_insert(iterator position, InputIterator first, InputIterator last, __true_type) { _insert_fill(position, first, last); } template inline void _dispatch_insert(iterator position, InputIterator first, InputIterator last, __false_type) { _insert_from_iterator(position, first, last); } inline void insert(iterator position, size_type n, const T& x ){ _insert_fill(position, n, x); } template inline void insert(iterator position, InputIterator first, InputIterator last){ typedef typename __is_integer::value __some_type; _dispatch_insert(position, first, last, __some_type()); } _UCXXEXPORT iterator erase(iterator position){ size_type index = position - data; for(size_type i = index; i < (elements - 1); ++i){ data[i] = data[i+1]; } downsize(size() - 1); return (data + index); } _UCXXEXPORT iterator erase(iterator first, iterator last){ size_type index = first - data; size_type width = last - first; for(size_type i = index; i < (elements - width) ;++i){ data[i] = data[i+width]; } downsize(size() - width); return (data + index); } _UCXXEXPORT void swap(vector& v){ if(this == &v){ //Avoid dv.swap(v) return; } T* ptr; size_type temp; //Swap pointers first ptr = data; data = v.data; v.data = ptr; //Swap element counts temp = elements; elements = v.elements; v.elements = temp; //Swap data size temp = data_size; data_size = v.data_size; v.data_size = temp; } _UCXXEXPORT void clear(){ downsize(0); } protected: T* data; size_type data_size; size_type elements; Allocator a; }; //Here go template instantiations template _UCXXEXPORT vector::~vector(){ for(size_t i = 0; i < elements; ++i){ a.destroy(data + i); } a.deallocate(data, data_size); } template _UCXXEXPORT void vector::reserve(size_type n){ if(n > data_size){ //We never shrink... T * temp_ptr = data; size_type temp_size = data_size; data_size = n; data = a.allocate(data_size); for(size_type i = 0; i _UCXXEXPORT void vector::resize(size_type sz, const T & c){ if(sz > elements){ //Need to actually call constructor if(sz > data_size){ reserve(sz + __UCLIBCXX_STL_BUFFER_SIZE__); } for(size_type i = elements; i _UCXXEXPORT void vector::downsize(size_type sz){ if(sz < elements){ //Actually are downsizing for(size_t i = sz; i< elements; ++i){ a.destroy(data+i); } elements = sz; } } #ifndef __UCLIBCXX_COMPILE_VECTOR__ #ifdef __UCLIBCXX_EXPAND_VECTOR_BASIC__ #ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ template<> _UCXXEXPORT vector >::vector(const allocator& al); template<> _UCXXEXPORT vector >::vector(size_type n, const char & value, const allocator & al); template<> _UCXXEXPORT vector >::~vector(); template<> _UCXXEXPORT vector >::~vector(); #endif //__UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ template<> _UCXXEXPORT void vector >::reserve(size_type n); template<> _UCXXEXPORT void vector >::reserve(size_type n); template<> _UCXXEXPORT void vector >::reserve(size_type n); template<> _UCXXEXPORT void vector >::reserve(size_type n); template<> _UCXXEXPORT void vector >::reserve(size_type n); template<> _UCXXEXPORT void vector >::reserve(size_type n); template<> _UCXXEXPORT void vector >::reserve(size_type n); template<> _UCXXEXPORT void vector >::reserve(size_type n); template<> _UCXXEXPORT void vector >::reserve(size_type n); template<> _UCXXEXPORT void vector >::reserve(size_type n); template<> _UCXXEXPORT void vector >::reserve(size_type n); template<> _UCXXEXPORT void vector >::resize(size_type sz, const char & c); template<> _UCXXEXPORT void vector >::resize(size_type sz, const unsigned char & c); template<> _UCXXEXPORT void vector >::resize(size_type sz, const short & c); template<> _UCXXEXPORT void vector >::resize(size_type sz, const unsigned short int & c); template<> _UCXXEXPORT void vector >::resize(size_type sz, const int & c); template<> _UCXXEXPORT void vector >::resize(size_type sz, const unsigned int & c); template<> _UCXXEXPORT void vector >::resize(size_type sz, const long int & c); template<> _UCXXEXPORT void vector >::resize(size_type sz, const unsigned long int & c); template<> _UCXXEXPORT void vector >::resize(size_type sz, const float & c); template<> _UCXXEXPORT void vector >::resize(size_type sz, const double & c); template<> _UCXXEXPORT void vector >::resize(size_type sz, const bool & c); #elif defined __UCLIBCXX_EXPAND_STRING_CHAR__ #ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ template<> _UCXXEXPORT vector >::vector(const allocator& al); template<> _UCXXEXPORT vector >::vector(size_type n, const char & value, const allocator & al); template<> _UCXXEXPORT vector >::~vector(); #endif template<> _UCXXEXPORT void vector >::reserve(size_type n); template<> _UCXXEXPORT void vector >::resize(size_type sz, const char & c); #endif #endif template _UCXXEXPORT bool operator==(const vector& x, const vector& y) { if(x.size() !=y.size() ){ return false; } for(size_t i = 0; i < x.size(); ++i){ if(x[i] != y[i]){ return false; } } return true; } template _UCXXEXPORT bool operator< (const vector& x, const vector& y) { less::iterator >::value_type> c; return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end(), c); } template _UCXXEXPORT bool operator!=(const vector& x, const vector& y) { return !(x == y); } template _UCXXEXPORT bool operator> (const vector& x, const vector& y) { greater::iterator >::value_type> c; return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end(), c); } template _UCXXEXPORT bool operator>=(const vector& x, const vector& y) { greater_equal::iterator >::value_type> c; return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end(), c); } template _UCXXEXPORT bool operator<=(const vector& x, const vector& y) { less_equal::iterator >::value_type> c; return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end(), c); } template _UCXXEXPORT void swap(vector& x, vector& y){ x.swap(y); } } #pragma GCC visibility pop #endif ================================================ FILE: external/arduino/stlarduino/vector.cpp ================================================ /* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define __UCLIBCXX_COMPILE_VECTOR__ 1 #include namespace std{ #ifdef __UCLIBCXX_EXPAND_VECTOR_BASIC__ #ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ template _UCXXEXPORT vector >::vector(const allocator& al); template _UCXXEXPORT vector >::vector(size_type n, const char & value, const allocator & al); template _UCXXEXPORT vector >::~vector(); template _UCXXEXPORT vector >::~vector(); #endif //__UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ template _UCXXEXPORT void vector >::reserve(size_type n); template _UCXXEXPORT void vector >::reserve(size_type n); template _UCXXEXPORT void vector >::reserve(size_type n); template _UCXXEXPORT void vector >::reserve(size_type n); template _UCXXEXPORT void vector >::reserve(size_type n); template _UCXXEXPORT void vector >::reserve(size_type n); template _UCXXEXPORT void vector >::reserve(size_type n); template _UCXXEXPORT void vector >::reserve(size_type n); template _UCXXEXPORT void vector >::reserve(size_type n); template _UCXXEXPORT void vector >::reserve(size_type n); template _UCXXEXPORT void vector >::reserve(size_type n); template _UCXXEXPORT void vector >::resize(size_type sz, const char & c); template _UCXXEXPORT void vector >::resize(size_type sz, const unsigned char & c); template _UCXXEXPORT void vector >::resize(size_type sz, const short & c); template _UCXXEXPORT void vector > ::resize(size_type sz, const unsigned short int & c); template _UCXXEXPORT void vector >::resize(size_type sz, const int & c); template _UCXXEXPORT void vector >::resize(size_type sz, const unsigned int & c); template _UCXXEXPORT void vector >::resize(size_type sz, const long int & c); template _UCXXEXPORT void vector >:: resize(size_type sz, const unsigned long int & c); template _UCXXEXPORT void vector >::resize(size_type sz, const float & c); template _UCXXEXPORT void vector >::resize(size_type sz, const double & c); template _UCXXEXPORT void vector >::resize(size_type sz, const bool & c); #elif defined __UCLIBCXX_EXPAND_STRING_CHAR__ #ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ template _UCXXEXPORT vector >::vector(const allocator& al); template _UCXXEXPORT vector >::vector(size_type n, const char & value, const allocator & al); template _UCXXEXPORT vector >::~vector(); #endif // __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ template _UCXXEXPORT void vector >::reserve(size_type n); template _UCXXEXPORT void vector >::resize(size_type sz, const char & c); #endif } ================================================ FILE: external/libuv/LICENSE ================================================ libuv is licensed for use as follows: ==== Copyright (c) 2015-present libuv project contributors. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ==== This license applies to parts of libuv originating from the https://github.com/joyent/libuv repository: ==== Copyright Joyent, Inc. and other Node contributors. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ==== This license applies to all parts of libuv that are not externally maintained libraries. The externally maintained libraries used by libuv are: - tree.h (from FreeBSD), copyright Niels Provos. Two clause BSD license. - inet_pton and inet_ntop implementations, contained in src/inet.c, are copyright the Internet Systems Consortium, Inc., and licensed under the ISC license. - stdint-msvc2008.h (from msinttypes), copyright Alexander Chemeris. Three clause BSD license. - pthread-fixes.c, copyright Google Inc. and Sony Mobile Communications AB. Three clause BSD license. - android-ifaddrs.h, android-ifaddrs.c, copyright Berkeley Software Design Inc, Kenneth MacKay and Emergya (Cloud4all, FP7/2007-2013, grant agreement n° 289016). Three clause BSD license. ================================================ FILE: external/libuv/include/uv/aix.h ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #ifndef UV_AIX_H #define UV_AIX_H #define UV_PLATFORM_LOOP_FIELDS \ int fs_fd; \ #define UV_PLATFORM_FS_EVENT_FIELDS \ uv__io_t event_watcher; \ char *dir_filename; \ #endif /* UV_AIX_H */ ================================================ FILE: external/libuv/include/uv/android-ifaddrs.h ================================================ /* * Copyright (c) 1995, 1999 * Berkeley Software Design, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * THIS SOFTWARE IS PROVIDED BY Berkeley Software Design, Inc. ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * BSDI ifaddrs.h,v 2.5 2000/02/23 14:51:59 dab Exp */ #ifndef _IFADDRS_H_ #define _IFADDRS_H_ struct ifaddrs { struct ifaddrs *ifa_next; char *ifa_name; unsigned int ifa_flags; struct sockaddr *ifa_addr; struct sockaddr *ifa_netmask; struct sockaddr *ifa_dstaddr; void *ifa_data; }; /* * This may have been defined in . Note that if is * to be included it must be included before this header file. */ #ifndef ifa_broadaddr #define ifa_broadaddr ifa_dstaddr /* broadcast address interface */ #endif #include __BEGIN_DECLS extern int getifaddrs(struct ifaddrs **ifap); extern void freeifaddrs(struct ifaddrs *ifa); __END_DECLS #endif ================================================ FILE: external/libuv/include/uv/bsd.h ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #ifndef UV_BSD_H #define UV_BSD_H #define UV_PLATFORM_FS_EVENT_FIELDS \ uv__io_t event_watcher; \ #define UV_IO_PRIVATE_PLATFORM_FIELDS \ int rcount; \ int wcount; \ #define UV_HAVE_KQUEUE 1 #endif /* UV_BSD_H */ ================================================ FILE: external/libuv/include/uv/darwin.h ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #ifndef UV_DARWIN_H #define UV_DARWIN_H #if defined(__APPLE__) && defined(__MACH__) # include # include # include # include # define UV_PLATFORM_SEM_T semaphore_t #endif #define UV_IO_PRIVATE_PLATFORM_FIELDS \ int rcount; \ int wcount; \ #define UV_PLATFORM_LOOP_FIELDS \ uv_thread_t cf_thread; \ void* _cf_reserved; \ void* cf_state; \ uv_mutex_t cf_mutex; \ uv_sem_t cf_sem; \ void* cf_signals[2]; \ #define UV_PLATFORM_FS_EVENT_FIELDS \ uv__io_t event_watcher; \ char* realpath; \ int realpath_len; \ int cf_flags; \ uv_async_t* cf_cb; \ void* cf_events[2]; \ void* cf_member[2]; \ int cf_error; \ uv_mutex_t cf_mutex; \ #define UV_STREAM_PRIVATE_PLATFORM_FIELDS \ void* select; \ #define UV_HAVE_KQUEUE 1 #endif /* UV_DARWIN_H */ ================================================ FILE: external/libuv/include/uv/errno.h ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #ifndef UV_ERRNO_H_ #define UV_ERRNO_H_ #include #if EDOM > 0 # define UV__ERR(x) (-(x)) #else # define UV__ERR(x) (x) #endif #define UV__EOF (-4095) #define UV__UNKNOWN (-4094) #define UV__EAI_ADDRFAMILY (-3000) #define UV__EAI_AGAIN (-3001) #define UV__EAI_BADFLAGS (-3002) #define UV__EAI_CANCELED (-3003) #define UV__EAI_FAIL (-3004) #define UV__EAI_FAMILY (-3005) #define UV__EAI_MEMORY (-3006) #define UV__EAI_NODATA (-3007) #define UV__EAI_NONAME (-3008) #define UV__EAI_OVERFLOW (-3009) #define UV__EAI_SERVICE (-3010) #define UV__EAI_SOCKTYPE (-3011) #define UV__EAI_BADHINTS (-3013) #define UV__EAI_PROTOCOL (-3014) /* Only map to the system errno on non-Windows platforms. It's apparently * a fairly common practice for Windows programmers to redefine errno codes. */ #if defined(E2BIG) && !defined(_WIN32) # define UV__E2BIG UV__ERR(E2BIG) #else # define UV__E2BIG (-4093) #endif #if defined(EACCES) && !defined(_WIN32) # define UV__EACCES UV__ERR(EACCES) #else # define UV__EACCES (-4092) #endif #if defined(EADDRINUSE) && !defined(_WIN32) # define UV__EADDRINUSE UV__ERR(EADDRINUSE) #else # define UV__EADDRINUSE (-4091) #endif #if defined(EADDRNOTAVAIL) && !defined(_WIN32) # define UV__EADDRNOTAVAIL UV__ERR(EADDRNOTAVAIL) #else # define UV__EADDRNOTAVAIL (-4090) #endif #if defined(EAFNOSUPPORT) && !defined(_WIN32) # define UV__EAFNOSUPPORT UV__ERR(EAFNOSUPPORT) #else # define UV__EAFNOSUPPORT (-4089) #endif #if defined(EAGAIN) && !defined(_WIN32) # define UV__EAGAIN UV__ERR(EAGAIN) #else # define UV__EAGAIN (-4088) #endif #if defined(EALREADY) && !defined(_WIN32) # define UV__EALREADY UV__ERR(EALREADY) #else # define UV__EALREADY (-4084) #endif #if defined(EBADF) && !defined(_WIN32) # define UV__EBADF UV__ERR(EBADF) #else # define UV__EBADF (-4083) #endif #if defined(EBUSY) && !defined(_WIN32) # define UV__EBUSY UV__ERR(EBUSY) #else # define UV__EBUSY (-4082) #endif #if defined(ECANCELED) && !defined(_WIN32) # define UV__ECANCELED UV__ERR(ECANCELED) #else # define UV__ECANCELED (-4081) #endif #if defined(ECHARSET) && !defined(_WIN32) # define UV__ECHARSET UV__ERR(ECHARSET) #else # define UV__ECHARSET (-4080) #endif #if defined(ECONNABORTED) && !defined(_WIN32) # define UV__ECONNABORTED UV__ERR(ECONNABORTED) #else # define UV__ECONNABORTED (-4079) #endif #if defined(ECONNREFUSED) && !defined(_WIN32) # define UV__ECONNREFUSED UV__ERR(ECONNREFUSED) #else # define UV__ECONNREFUSED (-4078) #endif #if defined(ECONNRESET) && !defined(_WIN32) # define UV__ECONNRESET UV__ERR(ECONNRESET) #else # define UV__ECONNRESET (-4077) #endif #if defined(EDESTADDRREQ) && !defined(_WIN32) # define UV__EDESTADDRREQ UV__ERR(EDESTADDRREQ) #else # define UV__EDESTADDRREQ (-4076) #endif #if defined(EEXIST) && !defined(_WIN32) # define UV__EEXIST UV__ERR(EEXIST) #else # define UV__EEXIST (-4075) #endif #if defined(EFAULT) && !defined(_WIN32) # define UV__EFAULT UV__ERR(EFAULT) #else # define UV__EFAULT (-4074) #endif #if defined(EHOSTUNREACH) && !defined(_WIN32) # define UV__EHOSTUNREACH UV__ERR(EHOSTUNREACH) #else # define UV__EHOSTUNREACH (-4073) #endif #if defined(EINTR) && !defined(_WIN32) # define UV__EINTR UV__ERR(EINTR) #else # define UV__EINTR (-4072) #endif #if defined(EINVAL) && !defined(_WIN32) # define UV__EINVAL UV__ERR(EINVAL) #else # define UV__EINVAL (-4071) #endif #if defined(EIO) && !defined(_WIN32) # define UV__EIO UV__ERR(EIO) #else # define UV__EIO (-4070) #endif #if defined(EISCONN) && !defined(_WIN32) # define UV__EISCONN UV__ERR(EISCONN) #else # define UV__EISCONN (-4069) #endif #if defined(EISDIR) && !defined(_WIN32) # define UV__EISDIR UV__ERR(EISDIR) #else # define UV__EISDIR (-4068) #endif #if defined(ELOOP) && !defined(_WIN32) # define UV__ELOOP UV__ERR(ELOOP) #else # define UV__ELOOP (-4067) #endif #if defined(EMFILE) && !defined(_WIN32) # define UV__EMFILE UV__ERR(EMFILE) #else # define UV__EMFILE (-4066) #endif #if defined(EMSGSIZE) && !defined(_WIN32) # define UV__EMSGSIZE UV__ERR(EMSGSIZE) #else # define UV__EMSGSIZE (-4065) #endif #if defined(ENAMETOOLONG) && !defined(_WIN32) # define UV__ENAMETOOLONG UV__ERR(ENAMETOOLONG) #else # define UV__ENAMETOOLONG (-4064) #endif #if defined(ENETDOWN) && !defined(_WIN32) # define UV__ENETDOWN UV__ERR(ENETDOWN) #else # define UV__ENETDOWN (-4063) #endif #if defined(ENETUNREACH) && !defined(_WIN32) # define UV__ENETUNREACH UV__ERR(ENETUNREACH) #else # define UV__ENETUNREACH (-4062) #endif #if defined(ENFILE) && !defined(_WIN32) # define UV__ENFILE UV__ERR(ENFILE) #else # define UV__ENFILE (-4061) #endif #if defined(ENOBUFS) && !defined(_WIN32) # define UV__ENOBUFS UV__ERR(ENOBUFS) #else # define UV__ENOBUFS (-4060) #endif #if defined(ENODEV) && !defined(_WIN32) # define UV__ENODEV UV__ERR(ENODEV) #else # define UV__ENODEV (-4059) #endif #if defined(ENOENT) && !defined(_WIN32) # define UV__ENOENT UV__ERR(ENOENT) #else # define UV__ENOENT (-4058) #endif #if defined(ENOMEM) && !defined(_WIN32) # define UV__ENOMEM UV__ERR(ENOMEM) #else # define UV__ENOMEM (-4057) #endif #if defined(ENONET) && !defined(_WIN32) # define UV__ENONET UV__ERR(ENONET) #else # define UV__ENONET (-4056) #endif #if defined(ENOSPC) && !defined(_WIN32) # define UV__ENOSPC UV__ERR(ENOSPC) #else # define UV__ENOSPC (-4055) #endif #if defined(ENOSYS) && !defined(_WIN32) # define UV__ENOSYS UV__ERR(ENOSYS) #else # define UV__ENOSYS (-4054) #endif #if defined(ENOTCONN) && !defined(_WIN32) # define UV__ENOTCONN UV__ERR(ENOTCONN) #else # define UV__ENOTCONN (-4053) #endif #if defined(ENOTDIR) && !defined(_WIN32) # define UV__ENOTDIR UV__ERR(ENOTDIR) #else # define UV__ENOTDIR (-4052) #endif #if defined(ENOTEMPTY) && !defined(_WIN32) # define UV__ENOTEMPTY UV__ERR(ENOTEMPTY) #else # define UV__ENOTEMPTY (-4051) #endif #if defined(ENOTSOCK) && !defined(_WIN32) # define UV__ENOTSOCK UV__ERR(ENOTSOCK) #else # define UV__ENOTSOCK (-4050) #endif #if defined(ENOTSUP) && !defined(_WIN32) # define UV__ENOTSUP UV__ERR(ENOTSUP) #else # define UV__ENOTSUP (-4049) #endif #if defined(EPERM) && !defined(_WIN32) # define UV__EPERM UV__ERR(EPERM) #else # define UV__EPERM (-4048) #endif #if defined(EPIPE) && !defined(_WIN32) # define UV__EPIPE UV__ERR(EPIPE) #else # define UV__EPIPE (-4047) #endif #if defined(EPROTO) && !defined(_WIN32) # define UV__EPROTO UV__ERR(EPROTO) #else # define UV__EPROTO UV__ERR(4046) #endif #if defined(EPROTONOSUPPORT) && !defined(_WIN32) # define UV__EPROTONOSUPPORT UV__ERR(EPROTONOSUPPORT) #else # define UV__EPROTONOSUPPORT (-4045) #endif #if defined(EPROTOTYPE) && !defined(_WIN32) # define UV__EPROTOTYPE UV__ERR(EPROTOTYPE) #else # define UV__EPROTOTYPE (-4044) #endif #if defined(EROFS) && !defined(_WIN32) # define UV__EROFS UV__ERR(EROFS) #else # define UV__EROFS (-4043) #endif #if defined(ESHUTDOWN) && !defined(_WIN32) # define UV__ESHUTDOWN UV__ERR(ESHUTDOWN) #else # define UV__ESHUTDOWN (-4042) #endif #if defined(ESPIPE) && !defined(_WIN32) # define UV__ESPIPE UV__ERR(ESPIPE) #else # define UV__ESPIPE (-4041) #endif #if defined(ESRCH) && !defined(_WIN32) # define UV__ESRCH UV__ERR(ESRCH) #else # define UV__ESRCH (-4040) #endif #if defined(ETIMEDOUT) && !defined(_WIN32) # define UV__ETIMEDOUT UV__ERR(ETIMEDOUT) #else # define UV__ETIMEDOUT (-4039) #endif #if defined(ETXTBSY) && !defined(_WIN32) # define UV__ETXTBSY UV__ERR(ETXTBSY) #else # define UV__ETXTBSY (-4038) #endif #if defined(EXDEV) && !defined(_WIN32) # define UV__EXDEV UV__ERR(EXDEV) #else # define UV__EXDEV (-4037) #endif #if defined(EFBIG) && !defined(_WIN32) # define UV__EFBIG UV__ERR(EFBIG) #else # define UV__EFBIG (-4036) #endif #if defined(ENOPROTOOPT) && !defined(_WIN32) # define UV__ENOPROTOOPT UV__ERR(ENOPROTOOPT) #else # define UV__ENOPROTOOPT (-4035) #endif #if defined(ERANGE) && !defined(_WIN32) # define UV__ERANGE UV__ERR(ERANGE) #else # define UV__ERANGE (-4034) #endif #if defined(ENXIO) && !defined(_WIN32) # define UV__ENXIO UV__ERR(ENXIO) #else # define UV__ENXIO (-4033) #endif #if defined(EMLINK) && !defined(_WIN32) # define UV__EMLINK UV__ERR(EMLINK) #else # define UV__EMLINK (-4032) #endif /* EHOSTDOWN is not visible on BSD-like systems when _POSIX_C_SOURCE is * defined. Fortunately, its value is always 64 so it's possible albeit * icky to hard-code it. */ #if defined(EHOSTDOWN) && !defined(_WIN32) # define UV__EHOSTDOWN UV__ERR(EHOSTDOWN) #elif defined(__APPLE__) || \ defined(__DragonFly__) || \ defined(__FreeBSD__) || \ defined(__FreeBSD_kernel__) || \ defined(__NetBSD__) || \ defined(__OpenBSD__) # define UV__EHOSTDOWN (-64) #else # define UV__EHOSTDOWN (-4031) #endif #if defined(EREMOTEIO) && !defined(_WIN32) # define UV__EREMOTEIO UV__ERR(EREMOTEIO) #else # define UV__EREMOTEIO (-4030) #endif #if defined(ENOTTY) && !defined(_WIN32) # define UV__ENOTTY UV__ERR(ENOTTY) #else # define UV__ENOTTY (-4029) #endif #if defined(EFTYPE) && !defined(_WIN32) # define UV__EFTYPE UV__ERR(EFTYPE) #else # define UV__EFTYPE (-4028) #endif #if defined(EILSEQ) && !defined(_WIN32) # define UV__EILSEQ UV__ERR(EILSEQ) #else # define UV__EILSEQ (-4027) #endif #endif /* UV_ERRNO_H_ */ ================================================ FILE: external/libuv/include/uv/linux.h ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #ifndef UV_LINUX_H #define UV_LINUX_H #define UV_PLATFORM_LOOP_FIELDS \ uv__io_t inotify_read_watcher; \ void* inotify_watchers; \ int inotify_fd; \ #define UV_PLATFORM_FS_EVENT_FIELDS \ void* watchers[2]; \ int wd; \ #endif /* UV_LINUX_H */ ================================================ FILE: external/libuv/include/uv/os390.h ================================================ /* Copyright libuv project contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #ifndef UV_MVS_H #define UV_MVS_H #define UV_PLATFORM_SEM_T long #define UV_PLATFORM_LOOP_FIELDS \ void* ep; \ #define UV_PLATFORM_FS_EVENT_FIELDS \ char rfis_rftok[8]; \ #endif /* UV_MVS_H */ ================================================ FILE: external/libuv/include/uv/posix.h ================================================ /* Copyright libuv project contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #ifndef UV_POSIX_H #define UV_POSIX_H #define UV_PLATFORM_LOOP_FIELDS \ struct pollfd* poll_fds; \ size_t poll_fds_used; \ size_t poll_fds_size; \ unsigned char poll_fds_iterating; \ #endif /* UV_POSIX_H */ ================================================ FILE: external/libuv/include/uv/stdint-msvc2008.h ================================================ // ISO C9x compliant stdint.h for Microsoft Visual Studio // Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 // // Copyright (c) 2006-2008 Alexander Chemeris // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // 3. The name of the author may be used to endorse or promote products // derived from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////////// #ifndef _MSC_VER // [ #error "Use this header only with Microsoft Visual C++ compilers!" #endif // _MSC_VER ] #ifndef _MSC_STDINT_H_ // [ #define _MSC_STDINT_H_ #if _MSC_VER > 1000 #pragma once #endif #include // For Visual Studio 6 in C++ mode and for many Visual Studio versions when // compiling for ARM we should wrap include with 'extern "C++" {}' // or compiler give many errors like this: // error C2733: second C linkage of overloaded function 'wmemchr' not allowed #ifdef __cplusplus extern "C" { #endif # include #ifdef __cplusplus } #endif // Define _W64 macros to mark types changing their size, like intptr_t. #ifndef _W64 # if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 # define _W64 __w64 # else # define _W64 # endif #endif // 7.18.1 Integer types // 7.18.1.1 Exact-width integer types // Visual Studio 6 and Embedded Visual C++ 4 doesn't // realize that, e.g. char has the same size as __int8 // so we give up on __intX for them. #if (_MSC_VER < 1300) typedef signed char int8_t; typedef signed short int16_t; typedef signed int int32_t; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #else typedef signed __int8 int8_t; typedef signed __int16 int16_t; typedef signed __int32 int32_t; typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; #endif typedef signed __int64 int64_t; typedef unsigned __int64 uint64_t; // 7.18.1.2 Minimum-width integer types typedef int8_t int_least8_t; typedef int16_t int_least16_t; typedef int32_t int_least32_t; typedef int64_t int_least64_t; typedef uint8_t uint_least8_t; typedef uint16_t uint_least16_t; typedef uint32_t uint_least32_t; typedef uint64_t uint_least64_t; // 7.18.1.3 Fastest minimum-width integer types typedef int8_t int_fast8_t; typedef int16_t int_fast16_t; typedef int32_t int_fast32_t; typedef int64_t int_fast64_t; typedef uint8_t uint_fast8_t; typedef uint16_t uint_fast16_t; typedef uint32_t uint_fast32_t; typedef uint64_t uint_fast64_t; // 7.18.1.4 Integer types capable of holding object pointers #ifdef _WIN64 // [ typedef signed __int64 intptr_t; typedef unsigned __int64 uintptr_t; #else // _WIN64 ][ typedef _W64 signed int intptr_t; typedef _W64 unsigned int uintptr_t; #endif // _WIN64 ] // 7.18.1.5 Greatest-width integer types typedef int64_t intmax_t; typedef uint64_t uintmax_t; // 7.18.2 Limits of specified-width integer types #if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 // 7.18.2.1 Limits of exact-width integer types #define INT8_MIN ((int8_t)_I8_MIN) #define INT8_MAX _I8_MAX #define INT16_MIN ((int16_t)_I16_MIN) #define INT16_MAX _I16_MAX #define INT32_MIN ((int32_t)_I32_MIN) #define INT32_MAX _I32_MAX #define INT64_MIN ((int64_t)_I64_MIN) #define INT64_MAX _I64_MAX #define UINT8_MAX _UI8_MAX #define UINT16_MAX _UI16_MAX #define UINT32_MAX _UI32_MAX #define UINT64_MAX _UI64_MAX // 7.18.2.2 Limits of minimum-width integer types #define INT_LEAST8_MIN INT8_MIN #define INT_LEAST8_MAX INT8_MAX #define INT_LEAST16_MIN INT16_MIN #define INT_LEAST16_MAX INT16_MAX #define INT_LEAST32_MIN INT32_MIN #define INT_LEAST32_MAX INT32_MAX #define INT_LEAST64_MIN INT64_MIN #define INT_LEAST64_MAX INT64_MAX #define UINT_LEAST8_MAX UINT8_MAX #define UINT_LEAST16_MAX UINT16_MAX #define UINT_LEAST32_MAX UINT32_MAX #define UINT_LEAST64_MAX UINT64_MAX // 7.18.2.3 Limits of fastest minimum-width integer types #define INT_FAST8_MIN INT8_MIN #define INT_FAST8_MAX INT8_MAX #define INT_FAST16_MIN INT16_MIN #define INT_FAST16_MAX INT16_MAX #define INT_FAST32_MIN INT32_MIN #define INT_FAST32_MAX INT32_MAX #define INT_FAST64_MIN INT64_MIN #define INT_FAST64_MAX INT64_MAX #define UINT_FAST8_MAX UINT8_MAX #define UINT_FAST16_MAX UINT16_MAX #define UINT_FAST32_MAX UINT32_MAX #define UINT_FAST64_MAX UINT64_MAX // 7.18.2.4 Limits of integer types capable of holding object pointers #ifdef _WIN64 // [ # define INTPTR_MIN INT64_MIN # define INTPTR_MAX INT64_MAX # define UINTPTR_MAX UINT64_MAX #else // _WIN64 ][ # define INTPTR_MIN INT32_MIN # define INTPTR_MAX INT32_MAX # define UINTPTR_MAX UINT32_MAX #endif // _WIN64 ] // 7.18.2.5 Limits of greatest-width integer types #define INTMAX_MIN INT64_MIN #define INTMAX_MAX INT64_MAX #define UINTMAX_MAX UINT64_MAX // 7.18.3 Limits of other integer types #ifdef _WIN64 // [ # define PTRDIFF_MIN _I64_MIN # define PTRDIFF_MAX _I64_MAX #else // _WIN64 ][ # define PTRDIFF_MIN _I32_MIN # define PTRDIFF_MAX _I32_MAX #endif // _WIN64 ] #define SIG_ATOMIC_MIN INT_MIN #define SIG_ATOMIC_MAX INT_MAX #ifndef SIZE_MAX // [ # ifdef _WIN64 // [ # define SIZE_MAX _UI64_MAX # else // _WIN64 ][ # define SIZE_MAX _UI32_MAX # endif // _WIN64 ] #endif // SIZE_MAX ] // WCHAR_MIN and WCHAR_MAX are also defined in #ifndef WCHAR_MIN // [ # define WCHAR_MIN 0 #endif // WCHAR_MIN ] #ifndef WCHAR_MAX // [ # define WCHAR_MAX _UI16_MAX #endif // WCHAR_MAX ] #define WINT_MIN 0 #define WINT_MAX _UI16_MAX #endif // __STDC_LIMIT_MACROS ] // 7.18.4 Limits of other integer types #if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 // 7.18.4.1 Macros for minimum-width integer constants #define INT8_C(val) val##i8 #define INT16_C(val) val##i16 #define INT32_C(val) val##i32 #define INT64_C(val) val##i64 #define UINT8_C(val) val##ui8 #define UINT16_C(val) val##ui16 #define UINT32_C(val) val##ui32 #define UINT64_C(val) val##ui64 // 7.18.4.2 Macros for greatest-width integer constants #define INTMAX_C INT64_C #define UINTMAX_C UINT64_C #endif // __STDC_CONSTANT_MACROS ] #endif // _MSC_STDINT_H_ ] ================================================ FILE: external/libuv/include/uv/sunos.h ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #ifndef UV_SUNOS_H #define UV_SUNOS_H #include #include /* For the sake of convenience and reduced #ifdef-ery in src/unix/sunos.c, * add the fs_event fields even when this version of SunOS doesn't support * file watching. */ #define UV_PLATFORM_LOOP_FIELDS \ uv__io_t fs_event_watcher; \ int fs_fd; \ #if defined(PORT_SOURCE_FILE) # define UV_PLATFORM_FS_EVENT_FIELDS \ file_obj_t fo; \ int fd; \ #endif /* defined(PORT_SOURCE_FILE) */ #endif /* UV_SUNOS_H */ ================================================ FILE: external/libuv/include/uv/threadpool.h ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ /* * This file is private to libuv. It provides common functionality to both * Windows and Unix backends. */ #ifndef UV_THREADPOOL_H_ #define UV_THREADPOOL_H_ struct uv__work { void (*work)(struct uv__work *w); void (*done)(struct uv__work *w, int status); struct uv_loop_s* loop; void* wq[2]; }; #endif /* UV_THREADPOOL_H_ */ ================================================ FILE: external/libuv/include/uv/tree.h ================================================ /*- * Copyright 2002 Niels Provos * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef UV_TREE_H_ #define UV_TREE_H_ #ifndef UV__UNUSED # if __GNUC__ # define UV__UNUSED __attribute__((unused)) # else # define UV__UNUSED # endif #endif /* * This file defines data structures for different types of trees: * splay trees and red-black trees. * * A splay tree is a self-organizing data structure. Every operation * on the tree causes a splay to happen. The splay moves the requested * node to the root of the tree and partly rebalances it. * * This has the benefit that request locality causes faster lookups as * the requested nodes move to the top of the tree. On the other hand, * every lookup causes memory writes. * * The Balance Theorem bounds the total access time for m operations * and n inserts on an initially empty tree as O((m + n)lg n). The * amortized cost for a sequence of m accesses to a splay tree is O(lg n); * * A red-black tree is a binary search tree with the node color as an * extra attribute. It fulfills a set of conditions: * - every search path from the root to a leaf consists of the * same number of black nodes, * - each red node (except for the root) has a black parent, * - each leaf node is black. * * Every operation on a red-black tree is bounded as O(lg n). * The maximum height of a red-black tree is 2lg (n+1). */ #define SPLAY_HEAD(name, type) \ struct name { \ struct type *sph_root; /* root of the tree */ \ } #define SPLAY_INITIALIZER(root) \ { NULL } #define SPLAY_INIT(root) do { \ (root)->sph_root = NULL; \ } while (/*CONSTCOND*/ 0) #define SPLAY_ENTRY(type) \ struct { \ struct type *spe_left; /* left element */ \ struct type *spe_right; /* right element */ \ } #define SPLAY_LEFT(elm, field) (elm)->field.spe_left #define SPLAY_RIGHT(elm, field) (elm)->field.spe_right #define SPLAY_ROOT(head) (head)->sph_root #define SPLAY_EMPTY(head) (SPLAY_ROOT(head) == NULL) /* SPLAY_ROTATE_{LEFT,RIGHT} expect that tmp hold SPLAY_{RIGHT,LEFT} */ #define SPLAY_ROTATE_RIGHT(head, tmp, field) do { \ SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(tmp, field); \ SPLAY_RIGHT(tmp, field) = (head)->sph_root; \ (head)->sph_root = tmp; \ } while (/*CONSTCOND*/ 0) #define SPLAY_ROTATE_LEFT(head, tmp, field) do { \ SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(tmp, field); \ SPLAY_LEFT(tmp, field) = (head)->sph_root; \ (head)->sph_root = tmp; \ } while (/*CONSTCOND*/ 0) #define SPLAY_LINKLEFT(head, tmp, field) do { \ SPLAY_LEFT(tmp, field) = (head)->sph_root; \ tmp = (head)->sph_root; \ (head)->sph_root = SPLAY_LEFT((head)->sph_root, field); \ } while (/*CONSTCOND*/ 0) #define SPLAY_LINKRIGHT(head, tmp, field) do { \ SPLAY_RIGHT(tmp, field) = (head)->sph_root; \ tmp = (head)->sph_root; \ (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field); \ } while (/*CONSTCOND*/ 0) #define SPLAY_ASSEMBLE(head, node, left, right, field) do { \ SPLAY_RIGHT(left, field) = SPLAY_LEFT((head)->sph_root, field); \ SPLAY_LEFT(right, field) = SPLAY_RIGHT((head)->sph_root, field); \ SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(node, field); \ SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(node, field); \ } while (/*CONSTCOND*/ 0) /* Generates prototypes and inline functions */ #define SPLAY_PROTOTYPE(name, type, field, cmp) \ void name##_SPLAY(struct name *, struct type *); \ void name##_SPLAY_MINMAX(struct name *, int); \ struct type *name##_SPLAY_INSERT(struct name *, struct type *); \ struct type *name##_SPLAY_REMOVE(struct name *, struct type *); \ \ /* Finds the node with the same key as elm */ \ static __inline struct type * \ name##_SPLAY_FIND(struct name *head, struct type *elm) \ { \ if (SPLAY_EMPTY(head)) \ return(NULL); \ name##_SPLAY(head, elm); \ if ((cmp)(elm, (head)->sph_root) == 0) \ return (head->sph_root); \ return (NULL); \ } \ \ static __inline struct type * \ name##_SPLAY_NEXT(struct name *head, struct type *elm) \ { \ name##_SPLAY(head, elm); \ if (SPLAY_RIGHT(elm, field) != NULL) { \ elm = SPLAY_RIGHT(elm, field); \ while (SPLAY_LEFT(elm, field) != NULL) { \ elm = SPLAY_LEFT(elm, field); \ } \ } else \ elm = NULL; \ return (elm); \ } \ \ static __inline struct type * \ name##_SPLAY_MIN_MAX(struct name *head, int val) \ { \ name##_SPLAY_MINMAX(head, val); \ return (SPLAY_ROOT(head)); \ } /* Main splay operation. * Moves node close to the key of elm to top */ #define SPLAY_GENERATE(name, type, field, cmp) \ struct type * \ name##_SPLAY_INSERT(struct name *head, struct type *elm) \ { \ if (SPLAY_EMPTY(head)) { \ SPLAY_LEFT(elm, field) = SPLAY_RIGHT(elm, field) = NULL; \ } else { \ int __comp; \ name##_SPLAY(head, elm); \ __comp = (cmp)(elm, (head)->sph_root); \ if(__comp < 0) { \ SPLAY_LEFT(elm, field) = SPLAY_LEFT((head)->sph_root, field); \ SPLAY_RIGHT(elm, field) = (head)->sph_root; \ SPLAY_LEFT((head)->sph_root, field) = NULL; \ } else if (__comp > 0) { \ SPLAY_RIGHT(elm, field) = SPLAY_RIGHT((head)->sph_root, field); \ SPLAY_LEFT(elm, field) = (head)->sph_root; \ SPLAY_RIGHT((head)->sph_root, field) = NULL; \ } else \ return ((head)->sph_root); \ } \ (head)->sph_root = (elm); \ return (NULL); \ } \ \ struct type * \ name##_SPLAY_REMOVE(struct name *head, struct type *elm) \ { \ struct type *__tmp; \ if (SPLAY_EMPTY(head)) \ return (NULL); \ name##_SPLAY(head, elm); \ if ((cmp)(elm, (head)->sph_root) == 0) { \ if (SPLAY_LEFT((head)->sph_root, field) == NULL) { \ (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field); \ } else { \ __tmp = SPLAY_RIGHT((head)->sph_root, field); \ (head)->sph_root = SPLAY_LEFT((head)->sph_root, field); \ name##_SPLAY(head, elm); \ SPLAY_RIGHT((head)->sph_root, field) = __tmp; \ } \ return (elm); \ } \ return (NULL); \ } \ \ void \ name##_SPLAY(struct name *head, struct type *elm) \ { \ struct type __node, *__left, *__right, *__tmp; \ int __comp; \ \ SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL; \ __left = __right = &__node; \ \ while ((__comp = (cmp)(elm, (head)->sph_root)) != 0) { \ if (__comp < 0) { \ __tmp = SPLAY_LEFT((head)->sph_root, field); \ if (__tmp == NULL) \ break; \ if ((cmp)(elm, __tmp) < 0){ \ SPLAY_ROTATE_RIGHT(head, __tmp, field); \ if (SPLAY_LEFT((head)->sph_root, field) == NULL) \ break; \ } \ SPLAY_LINKLEFT(head, __right, field); \ } else if (__comp > 0) { \ __tmp = SPLAY_RIGHT((head)->sph_root, field); \ if (__tmp == NULL) \ break; \ if ((cmp)(elm, __tmp) > 0){ \ SPLAY_ROTATE_LEFT(head, __tmp, field); \ if (SPLAY_RIGHT((head)->sph_root, field) == NULL) \ break; \ } \ SPLAY_LINKRIGHT(head, __left, field); \ } \ } \ SPLAY_ASSEMBLE(head, &__node, __left, __right, field); \ } \ \ /* Splay with either the minimum or the maximum element \ * Used to find minimum or maximum element in tree. \ */ \ void name##_SPLAY_MINMAX(struct name *head, int __comp) \ { \ struct type __node, *__left, *__right, *__tmp; \ \ SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL; \ __left = __right = &__node; \ \ while (1) { \ if (__comp < 0) { \ __tmp = SPLAY_LEFT((head)->sph_root, field); \ if (__tmp == NULL) \ break; \ if (__comp < 0){ \ SPLAY_ROTATE_RIGHT(head, __tmp, field); \ if (SPLAY_LEFT((head)->sph_root, field) == NULL) \ break; \ } \ SPLAY_LINKLEFT(head, __right, field); \ } else if (__comp > 0) { \ __tmp = SPLAY_RIGHT((head)->sph_root, field); \ if (__tmp == NULL) \ break; \ if (__comp > 0) { \ SPLAY_ROTATE_LEFT(head, __tmp, field); \ if (SPLAY_RIGHT((head)->sph_root, field) == NULL) \ break; \ } \ SPLAY_LINKRIGHT(head, __left, field); \ } \ } \ SPLAY_ASSEMBLE(head, &__node, __left, __right, field); \ } #define SPLAY_NEGINF -1 #define SPLAY_INF 1 #define SPLAY_INSERT(name, x, y) name##_SPLAY_INSERT(x, y) #define SPLAY_REMOVE(name, x, y) name##_SPLAY_REMOVE(x, y) #define SPLAY_FIND(name, x, y) name##_SPLAY_FIND(x, y) #define SPLAY_NEXT(name, x, y) name##_SPLAY_NEXT(x, y) #define SPLAY_MIN(name, x) (SPLAY_EMPTY(x) ? NULL \ : name##_SPLAY_MIN_MAX(x, SPLAY_NEGINF)) #define SPLAY_MAX(name, x) (SPLAY_EMPTY(x) ? NULL \ : name##_SPLAY_MIN_MAX(x, SPLAY_INF)) #define SPLAY_FOREACH(x, name, head) \ for ((x) = SPLAY_MIN(name, head); \ (x) != NULL; \ (x) = SPLAY_NEXT(name, head, x)) /* Macros that define a red-black tree */ #define RB_HEAD(name, type) \ struct name { \ struct type *rbh_root; /* root of the tree */ \ } #define RB_INITIALIZER(root) \ { NULL } #define RB_INIT(root) do { \ (root)->rbh_root = NULL; \ } while (/*CONSTCOND*/ 0) #define RB_BLACK 0 #define RB_RED 1 #define RB_ENTRY(type) \ struct { \ struct type *rbe_left; /* left element */ \ struct type *rbe_right; /* right element */ \ struct type *rbe_parent; /* parent element */ \ int rbe_color; /* node color */ \ } #define RB_LEFT(elm, field) (elm)->field.rbe_left #define RB_RIGHT(elm, field) (elm)->field.rbe_right #define RB_PARENT(elm, field) (elm)->field.rbe_parent #define RB_COLOR(elm, field) (elm)->field.rbe_color #define RB_ROOT(head) (head)->rbh_root #define RB_EMPTY(head) (RB_ROOT(head) == NULL) #define RB_SET(elm, parent, field) do { \ RB_PARENT(elm, field) = parent; \ RB_LEFT(elm, field) = RB_RIGHT(elm, field) = NULL; \ RB_COLOR(elm, field) = RB_RED; \ } while (/*CONSTCOND*/ 0) #define RB_SET_BLACKRED(black, red, field) do { \ RB_COLOR(black, field) = RB_BLACK; \ RB_COLOR(red, field) = RB_RED; \ } while (/*CONSTCOND*/ 0) #ifndef RB_AUGMENT #define RB_AUGMENT(x) do {} while (0) #endif #define RB_ROTATE_LEFT(head, elm, tmp, field) do { \ (tmp) = RB_RIGHT(elm, field); \ if ((RB_RIGHT(elm, field) = RB_LEFT(tmp, field)) != NULL) { \ RB_PARENT(RB_LEFT(tmp, field), field) = (elm); \ } \ RB_AUGMENT(elm); \ if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != NULL) { \ if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \ RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \ else \ RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \ } else \ (head)->rbh_root = (tmp); \ RB_LEFT(tmp, field) = (elm); \ RB_PARENT(elm, field) = (tmp); \ RB_AUGMENT(tmp); \ if ((RB_PARENT(tmp, field))) \ RB_AUGMENT(RB_PARENT(tmp, field)); \ } while (/*CONSTCOND*/ 0) #define RB_ROTATE_RIGHT(head, elm, tmp, field) do { \ (tmp) = RB_LEFT(elm, field); \ if ((RB_LEFT(elm, field) = RB_RIGHT(tmp, field)) != NULL) { \ RB_PARENT(RB_RIGHT(tmp, field), field) = (elm); \ } \ RB_AUGMENT(elm); \ if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != NULL) { \ if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \ RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \ else \ RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \ } else \ (head)->rbh_root = (tmp); \ RB_RIGHT(tmp, field) = (elm); \ RB_PARENT(elm, field) = (tmp); \ RB_AUGMENT(tmp); \ if ((RB_PARENT(tmp, field))) \ RB_AUGMENT(RB_PARENT(tmp, field)); \ } while (/*CONSTCOND*/ 0) /* Generates prototypes and inline functions */ #define RB_PROTOTYPE(name, type, field, cmp) \ RB_PROTOTYPE_INTERNAL(name, type, field, cmp,) #define RB_PROTOTYPE_STATIC(name, type, field, cmp) \ RB_PROTOTYPE_INTERNAL(name, type, field, cmp, UV__UNUSED static) #define RB_PROTOTYPE_INTERNAL(name, type, field, cmp, attr) \ attr void name##_RB_INSERT_COLOR(struct name *, struct type *); \ attr void name##_RB_REMOVE_COLOR(struct name *, struct type *, struct type *);\ attr struct type *name##_RB_REMOVE(struct name *, struct type *); \ attr struct type *name##_RB_INSERT(struct name *, struct type *); \ attr struct type *name##_RB_FIND(struct name *, struct type *); \ attr struct type *name##_RB_NFIND(struct name *, struct type *); \ attr struct type *name##_RB_NEXT(struct type *); \ attr struct type *name##_RB_PREV(struct type *); \ attr struct type *name##_RB_MINMAX(struct name *, int); \ \ /* Main rb operation. * Moves node close to the key of elm to top */ #define RB_GENERATE(name, type, field, cmp) \ RB_GENERATE_INTERNAL(name, type, field, cmp,) #define RB_GENERATE_STATIC(name, type, field, cmp) \ RB_GENERATE_INTERNAL(name, type, field, cmp, UV__UNUSED static) #define RB_GENERATE_INTERNAL(name, type, field, cmp, attr) \ attr void \ name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \ { \ struct type *parent, *gparent, *tmp; \ while ((parent = RB_PARENT(elm, field)) != NULL && \ RB_COLOR(parent, field) == RB_RED) { \ gparent = RB_PARENT(parent, field); \ if (parent == RB_LEFT(gparent, field)) { \ tmp = RB_RIGHT(gparent, field); \ if (tmp && RB_COLOR(tmp, field) == RB_RED) { \ RB_COLOR(tmp, field) = RB_BLACK; \ RB_SET_BLACKRED(parent, gparent, field); \ elm = gparent; \ continue; \ } \ if (RB_RIGHT(parent, field) == elm) { \ RB_ROTATE_LEFT(head, parent, tmp, field); \ tmp = parent; \ parent = elm; \ elm = tmp; \ } \ RB_SET_BLACKRED(parent, gparent, field); \ RB_ROTATE_RIGHT(head, gparent, tmp, field); \ } else { \ tmp = RB_LEFT(gparent, field); \ if (tmp && RB_COLOR(tmp, field) == RB_RED) { \ RB_COLOR(tmp, field) = RB_BLACK; \ RB_SET_BLACKRED(parent, gparent, field); \ elm = gparent; \ continue; \ } \ if (RB_LEFT(parent, field) == elm) { \ RB_ROTATE_RIGHT(head, parent, tmp, field); \ tmp = parent; \ parent = elm; \ elm = tmp; \ } \ RB_SET_BLACKRED(parent, gparent, field); \ RB_ROTATE_LEFT(head, gparent, tmp, field); \ } \ } \ RB_COLOR(head->rbh_root, field) = RB_BLACK; \ } \ \ attr void \ name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, \ struct type *elm) \ { \ struct type *tmp; \ while ((elm == NULL || RB_COLOR(elm, field) == RB_BLACK) && \ elm != RB_ROOT(head)) { \ if (RB_LEFT(parent, field) == elm) { \ tmp = RB_RIGHT(parent, field); \ if (RB_COLOR(tmp, field) == RB_RED) { \ RB_SET_BLACKRED(tmp, parent, field); \ RB_ROTATE_LEFT(head, parent, tmp, field); \ tmp = RB_RIGHT(parent, field); \ } \ if ((RB_LEFT(tmp, field) == NULL || \ RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) && \ (RB_RIGHT(tmp, field) == NULL || \ RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) { \ RB_COLOR(tmp, field) = RB_RED; \ elm = parent; \ parent = RB_PARENT(elm, field); \ } else { \ if (RB_RIGHT(tmp, field) == NULL || \ RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK) { \ struct type *oleft; \ if ((oleft = RB_LEFT(tmp, field)) \ != NULL) \ RB_COLOR(oleft, field) = RB_BLACK; \ RB_COLOR(tmp, field) = RB_RED; \ RB_ROTATE_RIGHT(head, tmp, oleft, field); \ tmp = RB_RIGHT(parent, field); \ } \ RB_COLOR(tmp, field) = RB_COLOR(parent, field); \ RB_COLOR(parent, field) = RB_BLACK; \ if (RB_RIGHT(tmp, field)) \ RB_COLOR(RB_RIGHT(tmp, field), field) = RB_BLACK; \ RB_ROTATE_LEFT(head, parent, tmp, field); \ elm = RB_ROOT(head); \ break; \ } \ } else { \ tmp = RB_LEFT(parent, field); \ if (RB_COLOR(tmp, field) == RB_RED) { \ RB_SET_BLACKRED(tmp, parent, field); \ RB_ROTATE_RIGHT(head, parent, tmp, field); \ tmp = RB_LEFT(parent, field); \ } \ if ((RB_LEFT(tmp, field) == NULL || \ RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) && \ (RB_RIGHT(tmp, field) == NULL || \ RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) { \ RB_COLOR(tmp, field) = RB_RED; \ elm = parent; \ parent = RB_PARENT(elm, field); \ } else { \ if (RB_LEFT(tmp, field) == NULL || \ RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) { \ struct type *oright; \ if ((oright = RB_RIGHT(tmp, field)) \ != NULL) \ RB_COLOR(oright, field) = RB_BLACK; \ RB_COLOR(tmp, field) = RB_RED; \ RB_ROTATE_LEFT(head, tmp, oright, field); \ tmp = RB_LEFT(parent, field); \ } \ RB_COLOR(tmp, field) = RB_COLOR(parent, field); \ RB_COLOR(parent, field) = RB_BLACK; \ if (RB_LEFT(tmp, field)) \ RB_COLOR(RB_LEFT(tmp, field), field) = RB_BLACK; \ RB_ROTATE_RIGHT(head, parent, tmp, field); \ elm = RB_ROOT(head); \ break; \ } \ } \ } \ if (elm) \ RB_COLOR(elm, field) = RB_BLACK; \ } \ \ attr struct type * \ name##_RB_REMOVE(struct name *head, struct type *elm) \ { \ struct type *child, *parent, *old = elm; \ int color; \ if (RB_LEFT(elm, field) == NULL) \ child = RB_RIGHT(elm, field); \ else if (RB_RIGHT(elm, field) == NULL) \ child = RB_LEFT(elm, field); \ else { \ struct type *left; \ elm = RB_RIGHT(elm, field); \ while ((left = RB_LEFT(elm, field)) != NULL) \ elm = left; \ child = RB_RIGHT(elm, field); \ parent = RB_PARENT(elm, field); \ color = RB_COLOR(elm, field); \ if (child) \ RB_PARENT(child, field) = parent; \ if (parent) { \ if (RB_LEFT(parent, field) == elm) \ RB_LEFT(parent, field) = child; \ else \ RB_RIGHT(parent, field) = child; \ RB_AUGMENT(parent); \ } else \ RB_ROOT(head) = child; \ if (RB_PARENT(elm, field) == old) \ parent = elm; \ (elm)->field = (old)->field; \ if (RB_PARENT(old, field)) { \ if (RB_LEFT(RB_PARENT(old, field), field) == old) \ RB_LEFT(RB_PARENT(old, field), field) = elm; \ else \ RB_RIGHT(RB_PARENT(old, field), field) = elm; \ RB_AUGMENT(RB_PARENT(old, field)); \ } else \ RB_ROOT(head) = elm; \ RB_PARENT(RB_LEFT(old, field), field) = elm; \ if (RB_RIGHT(old, field)) \ RB_PARENT(RB_RIGHT(old, field), field) = elm; \ if (parent) { \ left = parent; \ do { \ RB_AUGMENT(left); \ } while ((left = RB_PARENT(left, field)) != NULL); \ } \ goto color; \ } \ parent = RB_PARENT(elm, field); \ color = RB_COLOR(elm, field); \ if (child) \ RB_PARENT(child, field) = parent; \ if (parent) { \ if (RB_LEFT(parent, field) == elm) \ RB_LEFT(parent, field) = child; \ else \ RB_RIGHT(parent, field) = child; \ RB_AUGMENT(parent); \ } else \ RB_ROOT(head) = child; \ color: \ if (color == RB_BLACK) \ name##_RB_REMOVE_COLOR(head, parent, child); \ return (old); \ } \ \ /* Inserts a node into the RB tree */ \ attr struct type * \ name##_RB_INSERT(struct name *head, struct type *elm) \ { \ struct type *tmp; \ struct type *parent = NULL; \ int comp = 0; \ tmp = RB_ROOT(head); \ while (tmp) { \ parent = tmp; \ comp = (cmp)(elm, parent); \ if (comp < 0) \ tmp = RB_LEFT(tmp, field); \ else if (comp > 0) \ tmp = RB_RIGHT(tmp, field); \ else \ return (tmp); \ } \ RB_SET(elm, parent, field); \ if (parent != NULL) { \ if (comp < 0) \ RB_LEFT(parent, field) = elm; \ else \ RB_RIGHT(parent, field) = elm; \ RB_AUGMENT(parent); \ } else \ RB_ROOT(head) = elm; \ name##_RB_INSERT_COLOR(head, elm); \ return (NULL); \ } \ \ /* Finds the node with the same key as elm */ \ attr struct type * \ name##_RB_FIND(struct name *head, struct type *elm) \ { \ struct type *tmp = RB_ROOT(head); \ int comp; \ while (tmp) { \ comp = cmp(elm, tmp); \ if (comp < 0) \ tmp = RB_LEFT(tmp, field); \ else if (comp > 0) \ tmp = RB_RIGHT(tmp, field); \ else \ return (tmp); \ } \ return (NULL); \ } \ \ /* Finds the first node greater than or equal to the search key */ \ attr struct type * \ name##_RB_NFIND(struct name *head, struct type *elm) \ { \ struct type *tmp = RB_ROOT(head); \ struct type *res = NULL; \ int comp; \ while (tmp) { \ comp = cmp(elm, tmp); \ if (comp < 0) { \ res = tmp; \ tmp = RB_LEFT(tmp, field); \ } \ else if (comp > 0) \ tmp = RB_RIGHT(tmp, field); \ else \ return (tmp); \ } \ return (res); \ } \ \ /* ARGSUSED */ \ attr struct type * \ name##_RB_NEXT(struct type *elm) \ { \ if (RB_RIGHT(elm, field)) { \ elm = RB_RIGHT(elm, field); \ while (RB_LEFT(elm, field)) \ elm = RB_LEFT(elm, field); \ } else { \ if (RB_PARENT(elm, field) && \ (elm == RB_LEFT(RB_PARENT(elm, field), field))) \ elm = RB_PARENT(elm, field); \ else { \ while (RB_PARENT(elm, field) && \ (elm == RB_RIGHT(RB_PARENT(elm, field), field))) \ elm = RB_PARENT(elm, field); \ elm = RB_PARENT(elm, field); \ } \ } \ return (elm); \ } \ \ /* ARGSUSED */ \ attr struct type * \ name##_RB_PREV(struct type *elm) \ { \ if (RB_LEFT(elm, field)) { \ elm = RB_LEFT(elm, field); \ while (RB_RIGHT(elm, field)) \ elm = RB_RIGHT(elm, field); \ } else { \ if (RB_PARENT(elm, field) && \ (elm == RB_RIGHT(RB_PARENT(elm, field), field))) \ elm = RB_PARENT(elm, field); \ else { \ while (RB_PARENT(elm, field) && \ (elm == RB_LEFT(RB_PARENT(elm, field), field))) \ elm = RB_PARENT(elm, field); \ elm = RB_PARENT(elm, field); \ } \ } \ return (elm); \ } \ \ attr struct type * \ name##_RB_MINMAX(struct name *head, int val) \ { \ struct type *tmp = RB_ROOT(head); \ struct type *parent = NULL; \ while (tmp) { \ parent = tmp; \ if (val < 0) \ tmp = RB_LEFT(tmp, field); \ else \ tmp = RB_RIGHT(tmp, field); \ } \ return (parent); \ } #define RB_NEGINF -1 #define RB_INF 1 #define RB_INSERT(name, x, y) name##_RB_INSERT(x, y) #define RB_REMOVE(name, x, y) name##_RB_REMOVE(x, y) #define RB_FIND(name, x, y) name##_RB_FIND(x, y) #define RB_NFIND(name, x, y) name##_RB_NFIND(x, y) #define RB_NEXT(name, x, y) name##_RB_NEXT(y) #define RB_PREV(name, x, y) name##_RB_PREV(y) #define RB_MIN(name, x) name##_RB_MINMAX(x, RB_NEGINF) #define RB_MAX(name, x) name##_RB_MINMAX(x, RB_INF) #define RB_FOREACH(x, name, head) \ for ((x) = RB_MIN(name, head); \ (x) != NULL; \ (x) = name##_RB_NEXT(x)) #define RB_FOREACH_FROM(x, name, y) \ for ((x) = (y); \ ((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \ (x) = (y)) #define RB_FOREACH_SAFE(x, name, head, y) \ for ((x) = RB_MIN(name, head); \ ((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \ (x) = (y)) #define RB_FOREACH_REVERSE(x, name, head) \ for ((x) = RB_MAX(name, head); \ (x) != NULL; \ (x) = name##_RB_PREV(x)) #define RB_FOREACH_REVERSE_FROM(x, name, y) \ for ((x) = (y); \ ((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \ (x) = (y)) #define RB_FOREACH_REVERSE_SAFE(x, name, head, y) \ for ((x) = RB_MAX(name, head); \ ((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \ (x) = (y)) #endif /* UV_TREE_H_ */ ================================================ FILE: external/libuv/include/uv/unix.h ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #ifndef UV_UNIX_H #define UV_UNIX_H #include #include #include #include #include #include #include #include #include /* MAXHOSTNAMELEN on Solaris */ #include #include #if !defined(__MVS__) #include #include /* MAXHOSTNAMELEN on Linux and the BSDs */ #endif #include #include #include "uv/threadpool.h" #if defined(__linux__) # include "uv/linux.h" #elif defined (__MVS__) # include "uv/os390.h" #elif defined(__PASE__) /* __PASE__ and _AIX are both defined on IBM i */ # include "uv/posix.h" /* IBM i needs uv/posix.h, not uv/aix.h */ #elif defined(_AIX) # include "uv/aix.h" #elif defined(__sun) # include "uv/sunos.h" #elif defined(__APPLE__) # include "uv/darwin.h" #elif defined(__DragonFly__) || \ defined(__FreeBSD__) || \ defined(__FreeBSD_kernel__) || \ defined(__OpenBSD__) || \ defined(__NetBSD__) # include "uv/bsd.h" #elif defined(__CYGWIN__) || \ defined(__MSYS__) || \ defined(__GNU__) # include "uv/posix.h" #elif defined(__HAIKU__) # include "uv/posix.h" #endif #ifndef NI_MAXHOST # define NI_MAXHOST 1025 #endif #ifndef NI_MAXSERV # define NI_MAXSERV 32 #endif #ifndef UV_IO_PRIVATE_PLATFORM_FIELDS # define UV_IO_PRIVATE_PLATFORM_FIELDS /* empty */ #endif struct uv__io_s; struct uv_loop_s; typedef void (*uv__io_cb)(struct uv_loop_s* loop, struct uv__io_s* w, unsigned int events); typedef struct uv__io_s uv__io_t; struct uv__io_s { uv__io_cb cb; void* pending_queue[2]; void* watcher_queue[2]; unsigned int pevents; /* Pending event mask i.e. mask at next tick. */ unsigned int events; /* Current event mask. */ int fd; UV_IO_PRIVATE_PLATFORM_FIELDS }; #ifndef UV_PLATFORM_SEM_T # define UV_PLATFORM_SEM_T sem_t #endif #ifndef UV_PLATFORM_LOOP_FIELDS # define UV_PLATFORM_LOOP_FIELDS /* empty */ #endif #ifndef UV_PLATFORM_FS_EVENT_FIELDS # define UV_PLATFORM_FS_EVENT_FIELDS /* empty */ #endif #ifndef UV_STREAM_PRIVATE_PLATFORM_FIELDS # define UV_STREAM_PRIVATE_PLATFORM_FIELDS /* empty */ #endif /* Note: May be cast to struct iovec. See writev(2). */ typedef struct uv_buf_t { char* base; size_t len; } uv_buf_t; typedef int uv_file; typedef int uv_os_sock_t; typedef int uv_os_fd_t; typedef pid_t uv_pid_t; #define UV_ONCE_INIT PTHREAD_ONCE_INIT typedef pthread_once_t uv_once_t; typedef pthread_t uv_thread_t; typedef pthread_mutex_t uv_mutex_t; typedef pthread_rwlock_t uv_rwlock_t; typedef UV_PLATFORM_SEM_T uv_sem_t; typedef pthread_cond_t uv_cond_t; typedef pthread_key_t uv_key_t; /* Note: guard clauses should match uv_barrier_init's in src/unix/thread.c. */ #if defined(_AIX) || \ defined(__OpenBSD__) || \ !defined(PTHREAD_BARRIER_SERIAL_THREAD) /* TODO(bnoordhuis) Merge into uv_barrier_t in v2. */ struct _uv_barrier { uv_mutex_t mutex; uv_cond_t cond; unsigned threshold; unsigned in; unsigned out; }; typedef struct { struct _uv_barrier* b; # if defined(PTHREAD_BARRIER_SERIAL_THREAD) /* TODO(bnoordhuis) Remove padding in v2. */ char pad[sizeof(pthread_barrier_t) - sizeof(struct _uv_barrier*)]; # endif } uv_barrier_t; #else typedef pthread_barrier_t uv_barrier_t; #endif /* Platform-specific definitions for uv_spawn support. */ typedef gid_t uv_gid_t; typedef uid_t uv_uid_t; typedef struct dirent uv__dirent_t; #define UV_DIR_PRIVATE_FIELDS \ DIR* dir; #if defined(DT_UNKNOWN) # define HAVE_DIRENT_TYPES # if defined(DT_REG) # define UV__DT_FILE DT_REG # else # define UV__DT_FILE -1 # endif # if defined(DT_DIR) # define UV__DT_DIR DT_DIR # else # define UV__DT_DIR -2 # endif # if defined(DT_LNK) # define UV__DT_LINK DT_LNK # else # define UV__DT_LINK -3 # endif # if defined(DT_FIFO) # define UV__DT_FIFO DT_FIFO # else # define UV__DT_FIFO -4 # endif # if defined(DT_SOCK) # define UV__DT_SOCKET DT_SOCK # else # define UV__DT_SOCKET -5 # endif # if defined(DT_CHR) # define UV__DT_CHAR DT_CHR # else # define UV__DT_CHAR -6 # endif # if defined(DT_BLK) # define UV__DT_BLOCK DT_BLK # else # define UV__DT_BLOCK -7 # endif #endif /* Platform-specific definitions for uv_dlopen support. */ #define UV_DYNAMIC /* empty */ typedef struct { void* handle; char* errmsg; } uv_lib_t; #define UV_LOOP_PRIVATE_FIELDS \ unsigned long flags; \ int backend_fd; \ void* pending_queue[2]; \ void* watcher_queue[2]; \ uv__io_t** watchers; \ unsigned int nwatchers; \ unsigned int nfds; \ void* wq[2]; \ uv_mutex_t wq_mutex; \ uv_async_t wq_async; \ uv_rwlock_t cloexec_lock; \ uv_handle_t* closing_handles; \ void* process_handles[2]; \ void* prepare_handles[2]; \ void* check_handles[2]; \ void* idle_handles[2]; \ void* async_handles[2]; \ void (*async_unused)(void); /* TODO(bnoordhuis) Remove in libuv v2. */ \ uv__io_t async_io_watcher; \ int async_wfd; \ struct { \ void* min; \ unsigned int nelts; \ } timer_heap; \ uint64_t timer_counter; \ uint64_t time; \ int signal_pipefd[2]; \ uv__io_t signal_io_watcher; \ uv_signal_t child_watcher; \ int emfile_fd; \ UV_PLATFORM_LOOP_FIELDS \ #define UV_REQ_TYPE_PRIVATE /* empty */ #define UV_REQ_PRIVATE_FIELDS /* empty */ #define UV_PRIVATE_REQ_TYPES /* empty */ #define UV_WRITE_PRIVATE_FIELDS \ void* queue[2]; \ unsigned int write_index; \ uv_buf_t* bufs; \ unsigned int nbufs; \ int error; \ uv_buf_t bufsml[4]; \ #define UV_CONNECT_PRIVATE_FIELDS \ void* queue[2]; \ #define UV_SHUTDOWN_PRIVATE_FIELDS /* empty */ #define UV_UDP_SEND_PRIVATE_FIELDS \ void* queue[2]; \ struct sockaddr_storage addr; \ unsigned int nbufs; \ uv_buf_t* bufs; \ ssize_t status; \ uv_udp_send_cb send_cb; \ uv_buf_t bufsml[4]; \ #define UV_HANDLE_PRIVATE_FIELDS \ uv_handle_t* next_closing; \ unsigned int flags; \ #define UV_STREAM_PRIVATE_FIELDS \ uv_connect_t *connect_req; \ uv_shutdown_t *shutdown_req; \ uv__io_t io_watcher; \ void* write_queue[2]; \ void* write_completed_queue[2]; \ uv_connection_cb connection_cb; \ int delayed_error; \ int accepted_fd; \ void* queued_fds; \ UV_STREAM_PRIVATE_PLATFORM_FIELDS \ #define UV_TCP_PRIVATE_FIELDS /* empty */ #define UV_UDP_PRIVATE_FIELDS \ uv_alloc_cb alloc_cb; \ uv_udp_recv_cb recv_cb; \ uv__io_t io_watcher; \ void* write_queue[2]; \ void* write_completed_queue[2]; \ #define UV_PIPE_PRIVATE_FIELDS \ const char* pipe_fname; /* strdup'ed */ #define UV_POLL_PRIVATE_FIELDS \ uv__io_t io_watcher; #define UV_PREPARE_PRIVATE_FIELDS \ uv_prepare_cb prepare_cb; \ void* queue[2]; \ #define UV_CHECK_PRIVATE_FIELDS \ uv_check_cb check_cb; \ void* queue[2]; \ #define UV_IDLE_PRIVATE_FIELDS \ uv_idle_cb idle_cb; \ void* queue[2]; \ #define UV_ASYNC_PRIVATE_FIELDS \ uv_async_cb async_cb; \ void* queue[2]; \ int pending; \ #define UV_TIMER_PRIVATE_FIELDS \ uv_timer_cb timer_cb; \ void* heap_node[3]; \ uint64_t timeout; \ uint64_t repeat; \ uint64_t start_id; #define UV_GETADDRINFO_PRIVATE_FIELDS \ struct uv__work work_req; \ uv_getaddrinfo_cb cb; \ struct addrinfo* hints; \ char* hostname; \ char* service; \ struct addrinfo* addrinfo; \ int retcode; #define UV_GETNAMEINFO_PRIVATE_FIELDS \ struct uv__work work_req; \ uv_getnameinfo_cb getnameinfo_cb; \ struct sockaddr_storage storage; \ int flags; \ char host[NI_MAXHOST]; \ char service[NI_MAXSERV]; \ int retcode; #define UV_PROCESS_PRIVATE_FIELDS \ void* queue[2]; \ int status; \ #define UV_FS_PRIVATE_FIELDS \ const char *new_path; \ uv_file file; \ int flags; \ mode_t mode; \ unsigned int nbufs; \ uv_buf_t* bufs; \ off_t off; \ uv_uid_t uid; \ uv_gid_t gid; \ double atime; \ double mtime; \ struct uv__work work_req; \ uv_buf_t bufsml[4]; \ #define UV_WORK_PRIVATE_FIELDS \ struct uv__work work_req; #define UV_TTY_PRIVATE_FIELDS \ struct termios orig_termios; \ int mode; #define UV_SIGNAL_PRIVATE_FIELDS \ /* RB_ENTRY(uv_signal_s) tree_entry; */ \ struct { \ struct uv_signal_s* rbe_left; \ struct uv_signal_s* rbe_right; \ struct uv_signal_s* rbe_parent; \ int rbe_color; \ } tree_entry; \ /* Use two counters here so we don have to fiddle with atomics. */ \ unsigned int caught_signals; \ unsigned int dispatched_signals; #define UV_FS_EVENT_PRIVATE_FIELDS \ uv_fs_event_cb cb; \ UV_PLATFORM_FS_EVENT_FIELDS \ /* fs open() flags supported on this platform: */ #if defined(O_APPEND) # define UV_FS_O_APPEND O_APPEND #else # define UV_FS_O_APPEND 0 #endif #if defined(O_CREAT) # define UV_FS_O_CREAT O_CREAT #else # define UV_FS_O_CREAT 0 #endif #if defined(__linux__) && defined(__arm__) # define UV_FS_O_DIRECT 0x10000 #elif defined(__linux__) && defined(__m68k__) # define UV_FS_O_DIRECT 0x10000 #elif defined(__linux__) && defined(__mips__) # define UV_FS_O_DIRECT 0x08000 #elif defined(__linux__) && defined(__powerpc__) # define UV_FS_O_DIRECT 0x20000 #elif defined(__linux__) && defined(__s390x__) # define UV_FS_O_DIRECT 0x04000 #elif defined(__linux__) && defined(__x86_64__) # define UV_FS_O_DIRECT 0x04000 #elif defined(O_DIRECT) # define UV_FS_O_DIRECT O_DIRECT #else # define UV_FS_O_DIRECT 0 #endif #if defined(O_DIRECTORY) # define UV_FS_O_DIRECTORY O_DIRECTORY #else # define UV_FS_O_DIRECTORY 0 #endif #if defined(O_DSYNC) # define UV_FS_O_DSYNC O_DSYNC #else # define UV_FS_O_DSYNC 0 #endif #if defined(O_EXCL) # define UV_FS_O_EXCL O_EXCL #else # define UV_FS_O_EXCL 0 #endif #if defined(O_EXLOCK) # define UV_FS_O_EXLOCK O_EXLOCK #else # define UV_FS_O_EXLOCK 0 #endif #if defined(O_NOATIME) # define UV_FS_O_NOATIME O_NOATIME #else # define UV_FS_O_NOATIME 0 #endif #if defined(O_NOCTTY) # define UV_FS_O_NOCTTY O_NOCTTY #else # define UV_FS_O_NOCTTY 0 #endif #if defined(O_NOFOLLOW) # define UV_FS_O_NOFOLLOW O_NOFOLLOW #else # define UV_FS_O_NOFOLLOW 0 #endif #if defined(O_NONBLOCK) # define UV_FS_O_NONBLOCK O_NONBLOCK #else # define UV_FS_O_NONBLOCK 0 #endif #if defined(O_RDONLY) # define UV_FS_O_RDONLY O_RDONLY #else # define UV_FS_O_RDONLY 0 #endif #if defined(O_RDWR) # define UV_FS_O_RDWR O_RDWR #else # define UV_FS_O_RDWR 0 #endif #if defined(O_SYMLINK) # define UV_FS_O_SYMLINK O_SYMLINK #else # define UV_FS_O_SYMLINK 0 #endif #if defined(O_SYNC) # define UV_FS_O_SYNC O_SYNC #else # define UV_FS_O_SYNC 0 #endif #if defined(O_TRUNC) # define UV_FS_O_TRUNC O_TRUNC #else # define UV_FS_O_TRUNC 0 #endif #if defined(O_WRONLY) # define UV_FS_O_WRONLY O_WRONLY #else # define UV_FS_O_WRONLY 0 #endif /* fs open() flags supported on other platforms: */ #define UV_FS_O_FILEMAP 0 #define UV_FS_O_RANDOM 0 #define UV_FS_O_SHORT_LIVED 0 #define UV_FS_O_SEQUENTIAL 0 #define UV_FS_O_TEMPORARY 0 #endif /* UV_UNIX_H */ ================================================ FILE: external/libuv/include/uv/version.h ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #ifndef UV_VERSION_H #define UV_VERSION_H /* * Versions with the same major number are ABI stable. API is allowed to * evolve between minor releases, but only in a backwards compatible way. * Make sure you update the -soname directives in configure.ac * whenever you bump UV_VERSION_MAJOR or UV_VERSION_MINOR (but * not UV_VERSION_PATCH.) */ #define UV_VERSION_MAJOR 1 #define UV_VERSION_MINOR 38 #define UV_VERSION_PATCH 0 #define UV_VERSION_IS_RELEASE 1 #define UV_VERSION_SUFFIX "" #define UV_VERSION_HEX ((UV_VERSION_MAJOR << 16) | \ (UV_VERSION_MINOR << 8) | \ (UV_VERSION_PATCH)) #endif /* UV_VERSION_H */ ================================================ FILE: external/libuv/include/uv/win.h ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #ifndef _WIN32_WINNT # define _WIN32_WINNT 0x0600 #endif #if !defined(_SSIZE_T_) && !defined(_SSIZE_T_DEFINED) typedef intptr_t ssize_t; # define SSIZE_MAX INTPTR_MAX # define _SSIZE_T_ # define _SSIZE_T_DEFINED #endif #include #if defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR) typedef struct pollfd { SOCKET fd; short events; short revents; } WSAPOLLFD, *PWSAPOLLFD, *LPWSAPOLLFD; #endif #ifndef LOCALE_INVARIANT # define LOCALE_INVARIANT 0x007f #endif #include #include #include #include #include #include #include #if defined(_MSC_VER) && _MSC_VER < 1600 # include "uv/stdint-msvc2008.h" #else # include #endif #include "uv/tree.h" #include "uv/threadpool.h" #define MAX_PIPENAME_LEN 256 #ifndef S_IFLNK # define S_IFLNK 0xA000 #endif /* Additional signals supported by uv_signal and or uv_kill. The CRT defines * the following signals already: * * #define SIGINT 2 * #define SIGILL 4 * #define SIGABRT_COMPAT 6 * #define SIGFPE 8 * #define SIGSEGV 11 * #define SIGTERM 15 * #define SIGBREAK 21 * #define SIGABRT 22 * * The additional signals have values that are common on other Unix * variants (Linux and Darwin) */ #define SIGHUP 1 #define SIGKILL 9 #define SIGWINCH 28 /* Redefine NSIG to take SIGWINCH into consideration */ #if defined(NSIG) && NSIG <= SIGWINCH # undef NSIG #endif #ifndef NSIG # define NSIG SIGWINCH + 1 #endif /* The CRT defines SIGABRT_COMPAT as 6, which equals SIGABRT on many unix-like * platforms. However MinGW doesn't define it, so we do. */ #ifndef SIGABRT_COMPAT # define SIGABRT_COMPAT 6 #endif /* * Guids and typedefs for winsock extension functions * Mingw32 doesn't have these :-( */ #ifndef WSAID_ACCEPTEX # define WSAID_ACCEPTEX \ {0xb5367df1, 0xcbac, 0x11cf, \ {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}} # define WSAID_CONNECTEX \ {0x25a207b9, 0xddf3, 0x4660, \ {0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e}} # define WSAID_GETACCEPTEXSOCKADDRS \ {0xb5367df2, 0xcbac, 0x11cf, \ {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}} # define WSAID_DISCONNECTEX \ {0x7fda2e11, 0x8630, 0x436f, \ {0xa0, 0x31, 0xf5, 0x36, 0xa6, 0xee, 0xc1, 0x57}} # define WSAID_TRANSMITFILE \ {0xb5367df0, 0xcbac, 0x11cf, \ {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}} typedef BOOL (PASCAL *LPFN_ACCEPTEX) (SOCKET sListenSocket, SOCKET sAcceptSocket, PVOID lpOutputBuffer, DWORD dwReceiveDataLength, DWORD dwLocalAddressLength, DWORD dwRemoteAddressLength, LPDWORD lpdwBytesReceived, LPOVERLAPPED lpOverlapped); typedef BOOL (PASCAL *LPFN_CONNECTEX) (SOCKET s, const struct sockaddr* name, int namelen, PVOID lpSendBuffer, DWORD dwSendDataLength, LPDWORD lpdwBytesSent, LPOVERLAPPED lpOverlapped); typedef void (PASCAL *LPFN_GETACCEPTEXSOCKADDRS) (PVOID lpOutputBuffer, DWORD dwReceiveDataLength, DWORD dwLocalAddressLength, DWORD dwRemoteAddressLength, LPSOCKADDR* LocalSockaddr, LPINT LocalSockaddrLength, LPSOCKADDR* RemoteSockaddr, LPINT RemoteSockaddrLength); typedef BOOL (PASCAL *LPFN_DISCONNECTEX) (SOCKET hSocket, LPOVERLAPPED lpOverlapped, DWORD dwFlags, DWORD reserved); typedef BOOL (PASCAL *LPFN_TRANSMITFILE) (SOCKET hSocket, HANDLE hFile, DWORD nNumberOfBytesToWrite, DWORD nNumberOfBytesPerSend, LPOVERLAPPED lpOverlapped, LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers, DWORD dwFlags); typedef PVOID RTL_SRWLOCK; typedef RTL_SRWLOCK SRWLOCK, *PSRWLOCK; #endif typedef int (WSAAPI* LPFN_WSARECV) (SOCKET socket, LPWSABUF buffers, DWORD buffer_count, LPDWORD bytes, LPDWORD flags, LPWSAOVERLAPPED overlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine); typedef int (WSAAPI* LPFN_WSARECVFROM) (SOCKET socket, LPWSABUF buffers, DWORD buffer_count, LPDWORD bytes, LPDWORD flags, struct sockaddr* addr, LPINT addr_len, LPWSAOVERLAPPED overlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine); #ifndef _NTDEF_ typedef LONG NTSTATUS; typedef NTSTATUS *PNTSTATUS; #endif #ifndef RTL_CONDITION_VARIABLE_INIT typedef PVOID CONDITION_VARIABLE, *PCONDITION_VARIABLE; #endif typedef struct _AFD_POLL_HANDLE_INFO { HANDLE Handle; ULONG Events; NTSTATUS Status; } AFD_POLL_HANDLE_INFO, *PAFD_POLL_HANDLE_INFO; typedef struct _AFD_POLL_INFO { LARGE_INTEGER Timeout; ULONG NumberOfHandles; ULONG Exclusive; AFD_POLL_HANDLE_INFO Handles[1]; } AFD_POLL_INFO, *PAFD_POLL_INFO; #define UV_MSAFD_PROVIDER_COUNT 3 /** * It should be possible to cast uv_buf_t[] to WSABUF[] * see http://msdn.microsoft.com/en-us/library/ms741542(v=vs.85).aspx */ typedef struct uv_buf_t { ULONG len; char* base; } uv_buf_t; typedef int uv_file; typedef SOCKET uv_os_sock_t; typedef HANDLE uv_os_fd_t; typedef int uv_pid_t; typedef HANDLE uv_thread_t; typedef HANDLE uv_sem_t; typedef CRITICAL_SECTION uv_mutex_t; /* This condition variable implementation is based on the SetEvent solution * (section 3.2) at http://www.cs.wustl.edu/~schmidt/win32-cv-1.html * We could not use the SignalObjectAndWait solution (section 3.4) because * it want the 2nd argument (type uv_mutex_t) of uv_cond_wait() and * uv_cond_timedwait() to be HANDLEs, but we use CRITICAL_SECTIONs. */ typedef union { CONDITION_VARIABLE cond_var; struct { unsigned int waiters_count; CRITICAL_SECTION waiters_count_lock; HANDLE signal_event; HANDLE broadcast_event; } unused_; /* TODO: retained for ABI compatibility; remove me in v2.x. */ } uv_cond_t; typedef union { struct { unsigned int num_readers_; CRITICAL_SECTION num_readers_lock_; HANDLE write_semaphore_; } state_; /* TODO: remove me in v2.x. */ struct { SRWLOCK unused_; } unused1_; /* TODO: remove me in v2.x. */ struct { uv_mutex_t unused1_; uv_mutex_t unused2_; } unused2_; } uv_rwlock_t; typedef struct { unsigned int n; unsigned int count; uv_mutex_t mutex; uv_sem_t turnstile1; uv_sem_t turnstile2; } uv_barrier_t; typedef struct { DWORD tls_index; } uv_key_t; #define UV_ONCE_INIT { 0, NULL } typedef struct uv_once_s { unsigned char ran; HANDLE event; } uv_once_t; /* Platform-specific definitions for uv_spawn support. */ typedef unsigned char uv_uid_t; typedef unsigned char uv_gid_t; typedef struct uv__dirent_s { int d_type; char d_name[1]; } uv__dirent_t; #define UV_DIR_PRIVATE_FIELDS \ HANDLE dir_handle; \ WIN32_FIND_DATAW find_data; \ BOOL need_find_call; #define HAVE_DIRENT_TYPES #define UV__DT_DIR UV_DIRENT_DIR #define UV__DT_FILE UV_DIRENT_FILE #define UV__DT_LINK UV_DIRENT_LINK #define UV__DT_FIFO UV_DIRENT_FIFO #define UV__DT_SOCKET UV_DIRENT_SOCKET #define UV__DT_CHAR UV_DIRENT_CHAR #define UV__DT_BLOCK UV_DIRENT_BLOCK /* Platform-specific definitions for uv_dlopen support. */ #define UV_DYNAMIC FAR WINAPI typedef struct { HMODULE handle; char* errmsg; } uv_lib_t; #define UV_LOOP_PRIVATE_FIELDS \ /* The loop's I/O completion port */ \ HANDLE iocp; \ /* The current time according to the event loop. in msecs. */ \ uint64_t time; \ /* Tail of a single-linked circular queue of pending reqs. If the queue */ \ /* is empty, tail_ is NULL. If there is only one item, */ \ /* tail_->next_req == tail_ */ \ uv_req_t* pending_reqs_tail; \ /* Head of a single-linked list of closed handles */ \ uv_handle_t* endgame_handles; \ /* TODO(bnoordhuis) Stop heap-allocating |timer_heap| in libuv v2.x. */ \ void* timer_heap; \ /* Lists of active loop (prepare / check / idle) watchers */ \ uv_prepare_t* prepare_handles; \ uv_check_t* check_handles; \ uv_idle_t* idle_handles; \ /* This pointer will refer to the prepare/check/idle handle whose */ \ /* callback is scheduled to be called next. This is needed to allow */ \ /* safe removal from one of the lists above while that list being */ \ /* iterated over. */ \ uv_prepare_t* next_prepare_handle; \ uv_check_t* next_check_handle; \ uv_idle_t* next_idle_handle; \ /* This handle holds the peer sockets for the fast variant of uv_poll_t */ \ SOCKET poll_peer_sockets[UV_MSAFD_PROVIDER_COUNT]; \ /* Counter to keep track of active tcp streams */ \ unsigned int active_tcp_streams; \ /* Counter to keep track of active udp streams */ \ unsigned int active_udp_streams; \ /* Counter to started timer */ \ uint64_t timer_counter; \ /* Threadpool */ \ void* wq[2]; \ uv_mutex_t wq_mutex; \ uv_async_t wq_async; #define UV_REQ_TYPE_PRIVATE \ /* TODO: remove the req suffix */ \ UV_ACCEPT, \ UV_FS_EVENT_REQ, \ UV_POLL_REQ, \ UV_PROCESS_EXIT, \ UV_READ, \ UV_UDP_RECV, \ UV_WAKEUP, \ UV_SIGNAL_REQ, #define UV_REQ_PRIVATE_FIELDS \ union { \ /* Used by I/O operations */ \ struct { \ OVERLAPPED overlapped; \ size_t queued_bytes; \ } io; \ } u; \ struct uv_req_s* next_req; #define UV_WRITE_PRIVATE_FIELDS \ int coalesced; \ uv_buf_t write_buffer; \ HANDLE event_handle; \ HANDLE wait_handle; #define UV_CONNECT_PRIVATE_FIELDS \ /* empty */ #define UV_SHUTDOWN_PRIVATE_FIELDS \ /* empty */ #define UV_UDP_SEND_PRIVATE_FIELDS \ /* empty */ #define UV_PRIVATE_REQ_TYPES \ typedef struct uv_pipe_accept_s { \ UV_REQ_FIELDS \ HANDLE pipeHandle; \ struct uv_pipe_accept_s* next_pending; \ } uv_pipe_accept_t; \ \ typedef struct uv_tcp_accept_s { \ UV_REQ_FIELDS \ SOCKET accept_socket; \ char accept_buffer[sizeof(struct sockaddr_storage) * 2 + 32]; \ HANDLE event_handle; \ HANDLE wait_handle; \ struct uv_tcp_accept_s* next_pending; \ } uv_tcp_accept_t; \ \ typedef struct uv_read_s { \ UV_REQ_FIELDS \ HANDLE event_handle; \ HANDLE wait_handle; \ } uv_read_t; #define uv_stream_connection_fields \ unsigned int write_reqs_pending; \ uv_shutdown_t* shutdown_req; #define uv_stream_server_fields \ uv_connection_cb connection_cb; #define UV_STREAM_PRIVATE_FIELDS \ unsigned int reqs_pending; \ int activecnt; \ uv_read_t read_req; \ union { \ struct { uv_stream_connection_fields } conn; \ struct { uv_stream_server_fields } serv; \ } stream; #define uv_tcp_server_fields \ uv_tcp_accept_t* accept_reqs; \ unsigned int processed_accepts; \ uv_tcp_accept_t* pending_accepts; \ LPFN_ACCEPTEX func_acceptex; #define uv_tcp_connection_fields \ uv_buf_t read_buffer; \ LPFN_CONNECTEX func_connectex; #define UV_TCP_PRIVATE_FIELDS \ SOCKET socket; \ int delayed_error; \ union { \ struct { uv_tcp_server_fields } serv; \ struct { uv_tcp_connection_fields } conn; \ } tcp; #define UV_UDP_PRIVATE_FIELDS \ SOCKET socket; \ unsigned int reqs_pending; \ int activecnt; \ uv_req_t recv_req; \ uv_buf_t recv_buffer; \ struct sockaddr_storage recv_from; \ int recv_from_len; \ uv_udp_recv_cb recv_cb; \ uv_alloc_cb alloc_cb; \ LPFN_WSARECV func_wsarecv; \ LPFN_WSARECVFROM func_wsarecvfrom; #define uv_pipe_server_fields \ int pending_instances; \ uv_pipe_accept_t* accept_reqs; \ uv_pipe_accept_t* pending_accepts; #define uv_pipe_connection_fields \ uv_timer_t* eof_timer; \ uv_write_t dummy; /* TODO: retained for ABI compat; remove this in v2.x. */ \ DWORD ipc_remote_pid; \ union { \ uint32_t payload_remaining; \ uint64_t dummy; /* TODO: retained for ABI compat; remove this in v2.x. */ \ } ipc_data_frame; \ void* ipc_xfer_queue[2]; \ int ipc_xfer_queue_length; \ uv_write_t* non_overlapped_writes_tail; \ CRITICAL_SECTION readfile_thread_lock; \ volatile HANDLE readfile_thread_handle; #define UV_PIPE_PRIVATE_FIELDS \ HANDLE handle; \ WCHAR* name; \ union { \ struct { uv_pipe_server_fields } serv; \ struct { uv_pipe_connection_fields } conn; \ } pipe; /* TODO: put the parser states in an union - TTY handles are always half-duplex * so read-state can safely overlap write-state. */ #define UV_TTY_PRIVATE_FIELDS \ HANDLE handle; \ union { \ struct { \ /* Used for readable TTY handles */ \ /* TODO: remove me in v2.x. */ \ HANDLE unused_; \ uv_buf_t read_line_buffer; \ HANDLE read_raw_wait; \ /* Fields used for translating win keystrokes into vt100 characters */ \ char last_key[8]; \ unsigned char last_key_offset; \ unsigned char last_key_len; \ WCHAR last_utf16_high_surrogate; \ INPUT_RECORD last_input_record; \ } rd; \ struct { \ /* Used for writable TTY handles */ \ /* utf8-to-utf16 conversion state */ \ unsigned int utf8_codepoint; \ unsigned char utf8_bytes_left; \ /* eol conversion state */ \ unsigned char previous_eol; \ /* ansi parser state */ \ unsigned short ansi_parser_state; \ unsigned char ansi_csi_argc; \ unsigned short ansi_csi_argv[4]; \ COORD saved_position; \ WORD saved_attributes; \ } wr; \ } tty; #define UV_POLL_PRIVATE_FIELDS \ SOCKET socket; \ /* Used in fast mode */ \ SOCKET peer_socket; \ AFD_POLL_INFO afd_poll_info_1; \ AFD_POLL_INFO afd_poll_info_2; \ /* Used in fast and slow mode. */ \ uv_req_t poll_req_1; \ uv_req_t poll_req_2; \ unsigned char submitted_events_1; \ unsigned char submitted_events_2; \ unsigned char mask_events_1; \ unsigned char mask_events_2; \ unsigned char events; #define UV_TIMER_PRIVATE_FIELDS \ void* heap_node[3]; \ int unused; \ uint64_t timeout; \ uint64_t repeat; \ uint64_t start_id; \ uv_timer_cb timer_cb; #define UV_ASYNC_PRIVATE_FIELDS \ struct uv_req_s async_req; \ uv_async_cb async_cb; \ /* char to avoid alignment issues */ \ char volatile async_sent; #define UV_PREPARE_PRIVATE_FIELDS \ uv_prepare_t* prepare_prev; \ uv_prepare_t* prepare_next; \ uv_prepare_cb prepare_cb; #define UV_CHECK_PRIVATE_FIELDS \ uv_check_t* check_prev; \ uv_check_t* check_next; \ uv_check_cb check_cb; #define UV_IDLE_PRIVATE_FIELDS \ uv_idle_t* idle_prev; \ uv_idle_t* idle_next; \ uv_idle_cb idle_cb; #define UV_HANDLE_PRIVATE_FIELDS \ uv_handle_t* endgame_next; \ unsigned int flags; #define UV_GETADDRINFO_PRIVATE_FIELDS \ struct uv__work work_req; \ uv_getaddrinfo_cb getaddrinfo_cb; \ void* alloc; \ WCHAR* node; \ WCHAR* service; \ /* The addrinfoW field is used to store a pointer to the hints, and */ \ /* later on to store the result of GetAddrInfoW. The final result will */ \ /* be converted to struct addrinfo* and stored in the addrinfo field. */ \ struct addrinfoW* addrinfow; \ struct addrinfo* addrinfo; \ int retcode; #define UV_GETNAMEINFO_PRIVATE_FIELDS \ struct uv__work work_req; \ uv_getnameinfo_cb getnameinfo_cb; \ struct sockaddr_storage storage; \ int flags; \ char host[NI_MAXHOST]; \ char service[NI_MAXSERV]; \ int retcode; #define UV_PROCESS_PRIVATE_FIELDS \ struct uv_process_exit_s { \ UV_REQ_FIELDS \ } exit_req; \ BYTE* child_stdio_buffer; \ int exit_signal; \ HANDLE wait_handle; \ HANDLE process_handle; \ volatile char exit_cb_pending; #define UV_FS_PRIVATE_FIELDS \ struct uv__work work_req; \ int flags; \ DWORD sys_errno_; \ union { \ /* TODO: remove me in 0.9. */ \ WCHAR* pathw; \ int fd; \ } file; \ union { \ struct { \ int mode; \ WCHAR* new_pathw; \ int file_flags; \ int fd_out; \ unsigned int nbufs; \ uv_buf_t* bufs; \ int64_t offset; \ uv_buf_t bufsml[4]; \ } info; \ struct { \ double atime; \ double mtime; \ } time; \ } fs; #define UV_WORK_PRIVATE_FIELDS \ struct uv__work work_req; #define UV_FS_EVENT_PRIVATE_FIELDS \ struct uv_fs_event_req_s { \ UV_REQ_FIELDS \ } req; \ HANDLE dir_handle; \ int req_pending; \ uv_fs_event_cb cb; \ WCHAR* filew; \ WCHAR* short_filew; \ WCHAR* dirw; \ char* buffer; #define UV_SIGNAL_PRIVATE_FIELDS \ RB_ENTRY(uv_signal_s) tree_entry; \ struct uv_req_s signal_req; \ unsigned long pending_signum; #ifndef F_OK #define F_OK 0 #endif #ifndef R_OK #define R_OK 4 #endif #ifndef W_OK #define W_OK 2 #endif #ifndef X_OK #define X_OK 1 #endif /* fs open() flags supported on this platform: */ #define UV_FS_O_APPEND _O_APPEND #define UV_FS_O_CREAT _O_CREAT #define UV_FS_O_EXCL _O_EXCL #define UV_FS_O_FILEMAP 0x20000000 #define UV_FS_O_RANDOM _O_RANDOM #define UV_FS_O_RDONLY _O_RDONLY #define UV_FS_O_RDWR _O_RDWR #define UV_FS_O_SEQUENTIAL _O_SEQUENTIAL #define UV_FS_O_SHORT_LIVED _O_SHORT_LIVED #define UV_FS_O_TEMPORARY _O_TEMPORARY #define UV_FS_O_TRUNC _O_TRUNC #define UV_FS_O_WRONLY _O_WRONLY /* fs open() flags supported on other platforms (or mapped on this platform): */ #define UV_FS_O_DIRECT 0x02000000 /* FILE_FLAG_NO_BUFFERING */ #define UV_FS_O_DIRECTORY 0 #define UV_FS_O_DSYNC 0x04000000 /* FILE_FLAG_WRITE_THROUGH */ #define UV_FS_O_EXLOCK 0x10000000 /* EXCLUSIVE SHARING MODE */ #define UV_FS_O_NOATIME 0 #define UV_FS_O_NOCTTY 0 #define UV_FS_O_NOFOLLOW 0 #define UV_FS_O_NONBLOCK 0 #define UV_FS_O_SYMLINK 0 #define UV_FS_O_SYNC 0x08000000 /* FILE_FLAG_WRITE_THROUGH */ ================================================ FILE: external/libuv/include/uv.h ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ /* See https://github.com/libuv/libuv#documentation for documentation. */ #ifndef UV_H #define UV_H #ifdef __cplusplus extern "C" { #endif #if defined(BUILDING_UV_SHARED) && defined(USING_UV_SHARED) #error "Define either BUILDING_UV_SHARED or USING_UV_SHARED, not both." #endif #ifdef _WIN32 /* Windows - set up dll import/export decorators. */ # if defined(BUILDING_UV_SHARED) /* Building shared library. */ # define UV_EXTERN __declspec(dllexport) # elif defined(USING_UV_SHARED) /* Using shared library. */ # define UV_EXTERN __declspec(dllimport) # else /* Building static library. */ # define UV_EXTERN /* nothing */ # endif #elif __GNUC__ >= 4 # define UV_EXTERN __attribute__((visibility("default"))) #else # define UV_EXTERN /* nothing */ #endif #include "uv/errno.h" #include "uv/version.h" #include #include #if defined(_MSC_VER) && _MSC_VER < 1600 # include "uv/stdint-msvc2008.h" #else # include #endif #if defined(_WIN32) # include "uv/win.h" #else # include "uv/unix.h" #endif /* Expand this list if necessary. */ #define UV_ERRNO_MAP(XX) \ XX(E2BIG, "argument list too long") \ XX(EACCES, "permission denied") \ XX(EADDRINUSE, "address already in use") \ XX(EADDRNOTAVAIL, "address not available") \ XX(EAFNOSUPPORT, "address family not supported") \ XX(EAGAIN, "resource temporarily unavailable") \ XX(EAI_ADDRFAMILY, "address family not supported") \ XX(EAI_AGAIN, "temporary failure") \ XX(EAI_BADFLAGS, "bad ai_flags value") \ XX(EAI_BADHINTS, "invalid value for hints") \ XX(EAI_CANCELED, "request canceled") \ XX(EAI_FAIL, "permanent failure") \ XX(EAI_FAMILY, "ai_family not supported") \ XX(EAI_MEMORY, "out of memory") \ XX(EAI_NODATA, "no address") \ XX(EAI_NONAME, "unknown node or service") \ XX(EAI_OVERFLOW, "argument buffer overflow") \ XX(EAI_PROTOCOL, "resolved protocol is unknown") \ XX(EAI_SERVICE, "service not available for socket type") \ XX(EAI_SOCKTYPE, "socket type not supported") \ XX(EALREADY, "connection already in progress") \ XX(EBADF, "bad file descriptor") \ XX(EBUSY, "resource busy or locked") \ XX(ECANCELED, "operation canceled") \ XX(ECHARSET, "invalid Unicode character") \ XX(ECONNABORTED, "software caused connection abort") \ XX(ECONNREFUSED, "connection refused") \ XX(ECONNRESET, "connection reset by peer") \ XX(EDESTADDRREQ, "destination address required") \ XX(EEXIST, "file already exists") \ XX(EFAULT, "bad address in system call argument") \ XX(EFBIG, "file too large") \ XX(EHOSTUNREACH, "host is unreachable") \ XX(EINTR, "interrupted system call") \ XX(EINVAL, "invalid argument") \ XX(EIO, "i/o error") \ XX(EISCONN, "socket is already connected") \ XX(EISDIR, "illegal operation on a directory") \ XX(ELOOP, "too many symbolic links encountered") \ XX(EMFILE, "too many open files") \ XX(EMSGSIZE, "message too long") \ XX(ENAMETOOLONG, "name too long") \ XX(ENETDOWN, "network is down") \ XX(ENETUNREACH, "network is unreachable") \ XX(ENFILE, "file table overflow") \ XX(ENOBUFS, "no buffer space available") \ XX(ENODEV, "no such device") \ XX(ENOENT, "no such file or directory") \ XX(ENOMEM, "not enough memory") \ XX(ENONET, "machine is not on the network") \ XX(ENOPROTOOPT, "protocol not available") \ XX(ENOSPC, "no space left on device") \ XX(ENOSYS, "function not implemented") \ XX(ENOTCONN, "socket is not connected") \ XX(ENOTDIR, "not a directory") \ XX(ENOTEMPTY, "directory not empty") \ XX(ENOTSOCK, "socket operation on non-socket") \ XX(ENOTSUP, "operation not supported on socket") \ XX(EPERM, "operation not permitted") \ XX(EPIPE, "broken pipe") \ XX(EPROTO, "protocol error") \ XX(EPROTONOSUPPORT, "protocol not supported") \ XX(EPROTOTYPE, "protocol wrong type for socket") \ XX(ERANGE, "result too large") \ XX(EROFS, "read-only file system") \ XX(ESHUTDOWN, "cannot send after transport endpoint shutdown") \ XX(ESPIPE, "invalid seek") \ XX(ESRCH, "no such process") \ XX(ETIMEDOUT, "connection timed out") \ XX(ETXTBSY, "text file is busy") \ XX(EXDEV, "cross-device link not permitted") \ XX(UNKNOWN, "unknown error") \ XX(EOF, "end of file") \ XX(ENXIO, "no such device or address") \ XX(EMLINK, "too many links") \ XX(EHOSTDOWN, "host is down") \ XX(EREMOTEIO, "remote I/O error") \ XX(ENOTTY, "inappropriate ioctl for device") \ XX(EFTYPE, "inappropriate file type or format") \ XX(EILSEQ, "illegal byte sequence") \ #define UV_HANDLE_TYPE_MAP(XX) \ XX(ASYNC, async) \ XX(CHECK, check) \ XX(FS_EVENT, fs_event) \ XX(FS_POLL, fs_poll) \ XX(HANDLE, handle) \ XX(IDLE, idle) \ XX(NAMED_PIPE, pipe) \ XX(POLL, poll) \ XX(PREPARE, prepare) \ XX(PROCESS, process) \ XX(STREAM, stream) \ XX(TCP, tcp) \ XX(TIMER, timer) \ XX(TTY, tty) \ XX(UDP, udp) \ XX(SIGNAL, signal) \ #define UV_REQ_TYPE_MAP(XX) \ XX(REQ, req) \ XX(CONNECT, connect) \ XX(WRITE, write) \ XX(SHUTDOWN, shutdown) \ XX(UDP_SEND, udp_send) \ XX(FS, fs) \ XX(WORK, work) \ XX(GETADDRINFO, getaddrinfo) \ XX(GETNAMEINFO, getnameinfo) \ XX(RANDOM, random) \ typedef enum { #define XX(code, _) UV_ ## code = UV__ ## code, UV_ERRNO_MAP(XX) #undef XX UV_ERRNO_MAX = UV__EOF - 1 } uv_errno_t; typedef enum { UV_UNKNOWN_HANDLE = 0, #define XX(uc, lc) UV_##uc, UV_HANDLE_TYPE_MAP(XX) #undef XX UV_FILE, UV_HANDLE_TYPE_MAX } uv_handle_type; typedef enum { UV_UNKNOWN_REQ = 0, #define XX(uc, lc) UV_##uc, UV_REQ_TYPE_MAP(XX) #undef XX UV_REQ_TYPE_PRIVATE UV_REQ_TYPE_MAX } uv_req_type; /* Handle types. */ typedef struct uv_loop_s uv_loop_t; typedef struct uv_handle_s uv_handle_t; typedef struct uv_dir_s uv_dir_t; typedef struct uv_stream_s uv_stream_t; typedef struct uv_tcp_s uv_tcp_t; typedef struct uv_udp_s uv_udp_t; typedef struct uv_pipe_s uv_pipe_t; typedef struct uv_tty_s uv_tty_t; typedef struct uv_poll_s uv_poll_t; typedef struct uv_timer_s uv_timer_t; typedef struct uv_prepare_s uv_prepare_t; typedef struct uv_check_s uv_check_t; typedef struct uv_idle_s uv_idle_t; typedef struct uv_async_s uv_async_t; typedef struct uv_process_s uv_process_t; typedef struct uv_fs_event_s uv_fs_event_t; typedef struct uv_fs_poll_s uv_fs_poll_t; typedef struct uv_signal_s uv_signal_t; /* Request types. */ typedef struct uv_req_s uv_req_t; typedef struct uv_getaddrinfo_s uv_getaddrinfo_t; typedef struct uv_getnameinfo_s uv_getnameinfo_t; typedef struct uv_shutdown_s uv_shutdown_t; typedef struct uv_write_s uv_write_t; typedef struct uv_connect_s uv_connect_t; typedef struct uv_udp_send_s uv_udp_send_t; typedef struct uv_fs_s uv_fs_t; typedef struct uv_work_s uv_work_t; typedef struct uv_random_s uv_random_t; /* None of the above. */ typedef struct uv_env_item_s uv_env_item_t; typedef struct uv_cpu_info_s uv_cpu_info_t; typedef struct uv_interface_address_s uv_interface_address_t; typedef struct uv_dirent_s uv_dirent_t; typedef struct uv_passwd_s uv_passwd_t; typedef struct uv_utsname_s uv_utsname_t; typedef struct uv_statfs_s uv_statfs_t; typedef enum { UV_LOOP_BLOCK_SIGNAL } uv_loop_option; typedef enum { UV_RUN_DEFAULT = 0, UV_RUN_ONCE, UV_RUN_NOWAIT } uv_run_mode; UV_EXTERN unsigned int uv_version(void); UV_EXTERN const char* uv_version_string(void); typedef void* (*uv_malloc_func)(size_t size); typedef void* (*uv_realloc_func)(void* ptr, size_t size); typedef void* (*uv_calloc_func)(size_t count, size_t size); typedef void (*uv_free_func)(void* ptr); UV_EXTERN void uv_library_shutdown(void); UV_EXTERN int uv_replace_allocator(uv_malloc_func malloc_func, uv_realloc_func realloc_func, uv_calloc_func calloc_func, uv_free_func free_func); UV_EXTERN uv_loop_t* uv_default_loop(void); UV_EXTERN int uv_loop_init(uv_loop_t* loop); UV_EXTERN int uv_loop_close(uv_loop_t* loop); /* * NOTE: * This function is DEPRECATED (to be removed after 0.12), users should * allocate the loop manually and use uv_loop_init instead. */ UV_EXTERN uv_loop_t* uv_loop_new(void); /* * NOTE: * This function is DEPRECATED (to be removed after 0.12). Users should use * uv_loop_close and free the memory manually instead. */ UV_EXTERN void uv_loop_delete(uv_loop_t*); UV_EXTERN size_t uv_loop_size(void); UV_EXTERN int uv_loop_alive(const uv_loop_t* loop); UV_EXTERN int uv_loop_configure(uv_loop_t* loop, uv_loop_option option, ...); UV_EXTERN int uv_loop_fork(uv_loop_t* loop); UV_EXTERN int uv_run(uv_loop_t*, uv_run_mode mode); UV_EXTERN void uv_stop(uv_loop_t*); UV_EXTERN void uv_ref(uv_handle_t*); UV_EXTERN void uv_unref(uv_handle_t*); UV_EXTERN int uv_has_ref(const uv_handle_t*); UV_EXTERN void uv_update_time(uv_loop_t*); UV_EXTERN uint64_t uv_now(const uv_loop_t*); UV_EXTERN int uv_backend_fd(const uv_loop_t*); UV_EXTERN int uv_backend_timeout(const uv_loop_t*); typedef void (*uv_alloc_cb)(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf); typedef void (*uv_read_cb)(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf); typedef void (*uv_write_cb)(uv_write_t* req, int status); typedef void (*uv_connect_cb)(uv_connect_t* req, int status); typedef void (*uv_shutdown_cb)(uv_shutdown_t* req, int status); typedef void (*uv_connection_cb)(uv_stream_t* server, int status); typedef void (*uv_close_cb)(uv_handle_t* handle); typedef void (*uv_poll_cb)(uv_poll_t* handle, int status, int events); typedef void (*uv_timer_cb)(uv_timer_t* handle); typedef void (*uv_async_cb)(uv_async_t* handle); typedef void (*uv_prepare_cb)(uv_prepare_t* handle); typedef void (*uv_check_cb)(uv_check_t* handle); typedef void (*uv_idle_cb)(uv_idle_t* handle); typedef void (*uv_exit_cb)(uv_process_t*, int64_t exit_status, int term_signal); typedef void (*uv_walk_cb)(uv_handle_t* handle, void* arg); typedef void (*uv_fs_cb)(uv_fs_t* req); typedef void (*uv_work_cb)(uv_work_t* req); typedef void (*uv_after_work_cb)(uv_work_t* req, int status); typedef void (*uv_getaddrinfo_cb)(uv_getaddrinfo_t* req, int status, struct addrinfo* res); typedef void (*uv_getnameinfo_cb)(uv_getnameinfo_t* req, int status, const char* hostname, const char* service); typedef void (*uv_random_cb)(uv_random_t* req, int status, void* buf, size_t buflen); typedef struct { long tv_sec; long tv_nsec; } uv_timespec_t; typedef struct { uint64_t st_dev; uint64_t st_mode; uint64_t st_nlink; uint64_t st_uid; uint64_t st_gid; uint64_t st_rdev; uint64_t st_ino; uint64_t st_size; uint64_t st_blksize; uint64_t st_blocks; uint64_t st_flags; uint64_t st_gen; uv_timespec_t st_atim; uv_timespec_t st_mtim; uv_timespec_t st_ctim; uv_timespec_t st_birthtim; } uv_stat_t; typedef void (*uv_fs_event_cb)(uv_fs_event_t* handle, const char* filename, int events, int status); typedef void (*uv_fs_poll_cb)(uv_fs_poll_t* handle, int status, const uv_stat_t* prev, const uv_stat_t* curr); typedef void (*uv_signal_cb)(uv_signal_t* handle, int signum); typedef enum { UV_LEAVE_GROUP = 0, UV_JOIN_GROUP } uv_membership; UV_EXTERN int uv_translate_sys_error(int sys_errno); UV_EXTERN const char* uv_strerror(int err); UV_EXTERN char* uv_strerror_r(int err, char* buf, size_t buflen); UV_EXTERN const char* uv_err_name(int err); UV_EXTERN char* uv_err_name_r(int err, char* buf, size_t buflen); #define UV_REQ_FIELDS \ /* public */ \ void* data; \ /* read-only */ \ uv_req_type type; \ /* private */ \ void* reserved[6]; \ UV_REQ_PRIVATE_FIELDS \ /* Abstract base class of all requests. */ struct uv_req_s { UV_REQ_FIELDS }; /* Platform-specific request types. */ UV_PRIVATE_REQ_TYPES UV_EXTERN int uv_shutdown(uv_shutdown_t* req, uv_stream_t* handle, uv_shutdown_cb cb); struct uv_shutdown_s { UV_REQ_FIELDS uv_stream_t* handle; uv_shutdown_cb cb; UV_SHUTDOWN_PRIVATE_FIELDS }; #define UV_HANDLE_FIELDS \ /* public */ \ void* data; \ /* read-only */ \ uv_loop_t* loop; \ uv_handle_type type; \ /* private */ \ uv_close_cb close_cb; \ void* handle_queue[2]; \ union { \ int fd; \ void* reserved[4]; \ } u; \ UV_HANDLE_PRIVATE_FIELDS \ /* The abstract base class of all handles. */ struct uv_handle_s { UV_HANDLE_FIELDS }; UV_EXTERN size_t uv_handle_size(uv_handle_type type); UV_EXTERN uv_handle_type uv_handle_get_type(const uv_handle_t* handle); UV_EXTERN const char* uv_handle_type_name(uv_handle_type type); UV_EXTERN void* uv_handle_get_data(const uv_handle_t* handle); UV_EXTERN uv_loop_t* uv_handle_get_loop(const uv_handle_t* handle); UV_EXTERN void uv_handle_set_data(uv_handle_t* handle, void* data); UV_EXTERN size_t uv_req_size(uv_req_type type); UV_EXTERN void* uv_req_get_data(const uv_req_t* req); UV_EXTERN void uv_req_set_data(uv_req_t* req, void* data); UV_EXTERN uv_req_type uv_req_get_type(const uv_req_t* req); UV_EXTERN const char* uv_req_type_name(uv_req_type type); UV_EXTERN int uv_is_active(const uv_handle_t* handle); UV_EXTERN void uv_walk(uv_loop_t* loop, uv_walk_cb walk_cb, void* arg); /* Helpers for ad hoc debugging, no API/ABI stability guaranteed. */ UV_EXTERN void uv_print_all_handles(uv_loop_t* loop, FILE* stream); UV_EXTERN void uv_print_active_handles(uv_loop_t* loop, FILE* stream); UV_EXTERN void uv_close(uv_handle_t* handle, uv_close_cb close_cb); UV_EXTERN int uv_send_buffer_size(uv_handle_t* handle, int* value); UV_EXTERN int uv_recv_buffer_size(uv_handle_t* handle, int* value); UV_EXTERN int uv_fileno(const uv_handle_t* handle, uv_os_fd_t* fd); UV_EXTERN uv_buf_t uv_buf_init(char* base, unsigned int len); #define UV_STREAM_FIELDS \ /* number of bytes queued for writing */ \ size_t write_queue_size; \ uv_alloc_cb alloc_cb; \ uv_read_cb read_cb; \ /* private */ \ UV_STREAM_PRIVATE_FIELDS /* * uv_stream_t is a subclass of uv_handle_t. * * uv_stream is an abstract class. * * uv_stream_t is the parent class of uv_tcp_t, uv_pipe_t and uv_tty_t. */ struct uv_stream_s { UV_HANDLE_FIELDS UV_STREAM_FIELDS }; UV_EXTERN size_t uv_stream_get_write_queue_size(const uv_stream_t* stream); UV_EXTERN int uv_listen(uv_stream_t* stream, int backlog, uv_connection_cb cb); UV_EXTERN int uv_accept(uv_stream_t* server, uv_stream_t* client); UV_EXTERN int uv_read_start(uv_stream_t*, uv_alloc_cb alloc_cb, uv_read_cb read_cb); UV_EXTERN int uv_read_stop(uv_stream_t*); UV_EXTERN int uv_write(uv_write_t* req, uv_stream_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb); UV_EXTERN int uv_write2(uv_write_t* req, uv_stream_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_stream_t* send_handle, uv_write_cb cb); UV_EXTERN int uv_try_write(uv_stream_t* handle, const uv_buf_t bufs[], unsigned int nbufs); /* uv_write_t is a subclass of uv_req_t. */ struct uv_write_s { UV_REQ_FIELDS uv_write_cb cb; uv_stream_t* send_handle; /* TODO: make private and unix-only in v2.x. */ uv_stream_t* handle; UV_WRITE_PRIVATE_FIELDS }; UV_EXTERN int uv_is_readable(const uv_stream_t* handle); UV_EXTERN int uv_is_writable(const uv_stream_t* handle); UV_EXTERN int uv_stream_set_blocking(uv_stream_t* handle, int blocking); UV_EXTERN int uv_is_closing(const uv_handle_t* handle); /* * uv_tcp_t is a subclass of uv_stream_t. * * Represents a TCP stream or TCP server. */ struct uv_tcp_s { UV_HANDLE_FIELDS UV_STREAM_FIELDS UV_TCP_PRIVATE_FIELDS }; UV_EXTERN int uv_tcp_init(uv_loop_t*, uv_tcp_t* handle); UV_EXTERN int uv_tcp_init_ex(uv_loop_t*, uv_tcp_t* handle, unsigned int flags); UV_EXTERN int uv_tcp_open(uv_tcp_t* handle, uv_os_sock_t sock); UV_EXTERN int uv_tcp_nodelay(uv_tcp_t* handle, int enable); UV_EXTERN int uv_tcp_keepalive(uv_tcp_t* handle, int enable, unsigned int delay); UV_EXTERN int uv_tcp_simultaneous_accepts(uv_tcp_t* handle, int enable); enum uv_tcp_flags { /* Used with uv_tcp_bind, when an IPv6 address is used. */ UV_TCP_IPV6ONLY = 1 }; UV_EXTERN int uv_tcp_bind(uv_tcp_t* handle, const struct sockaddr* addr, unsigned int flags); UV_EXTERN int uv_tcp_getsockname(const uv_tcp_t* handle, struct sockaddr* name, int* namelen); UV_EXTERN int uv_tcp_getpeername(const uv_tcp_t* handle, struct sockaddr* name, int* namelen); UV_EXTERN int uv_tcp_close_reset(uv_tcp_t* handle, uv_close_cb close_cb); UV_EXTERN int uv_tcp_connect(uv_connect_t* req, uv_tcp_t* handle, const struct sockaddr* addr, uv_connect_cb cb); /* uv_connect_t is a subclass of uv_req_t. */ struct uv_connect_s { UV_REQ_FIELDS uv_connect_cb cb; uv_stream_t* handle; UV_CONNECT_PRIVATE_FIELDS }; /* * UDP support. */ enum uv_udp_flags { /* Disables dual stack mode. */ UV_UDP_IPV6ONLY = 1, /* * Indicates message was truncated because read buffer was too small. The * remainder was discarded by the OS. Used in uv_udp_recv_cb. */ UV_UDP_PARTIAL = 2, /* * Indicates if SO_REUSEADDR will be set when binding the handle. * This sets the SO_REUSEPORT socket flag on the BSDs and OS X. On other * Unix platforms, it sets the SO_REUSEADDR flag. What that means is that * multiple threads or processes can bind to the same address without error * (provided they all set the flag) but only the last one to bind will receive * any traffic, in effect "stealing" the port from the previous listener. */ UV_UDP_REUSEADDR = 4, /* * Indicates that the message was received by recvmmsg, so the buffer provided * must not be freed by the recv_cb callback. */ UV_UDP_MMSG_CHUNK = 8, /* * Indicates that recvmmsg should be used, if available. */ UV_UDP_RECVMMSG = 256 }; typedef void (*uv_udp_send_cb)(uv_udp_send_t* req, int status); typedef void (*uv_udp_recv_cb)(uv_udp_t* handle, ssize_t nread, const uv_buf_t* buf, const struct sockaddr* addr, unsigned flags); /* uv_udp_t is a subclass of uv_handle_t. */ struct uv_udp_s { UV_HANDLE_FIELDS /* read-only */ /* * Number of bytes queued for sending. This field strictly shows how much * information is currently queued. */ size_t send_queue_size; /* * Number of send requests currently in the queue awaiting to be processed. */ size_t send_queue_count; UV_UDP_PRIVATE_FIELDS }; /* uv_udp_send_t is a subclass of uv_req_t. */ struct uv_udp_send_s { UV_REQ_FIELDS uv_udp_t* handle; uv_udp_send_cb cb; UV_UDP_SEND_PRIVATE_FIELDS }; UV_EXTERN int uv_udp_init(uv_loop_t*, uv_udp_t* handle); UV_EXTERN int uv_udp_init_ex(uv_loop_t*, uv_udp_t* handle, unsigned int flags); UV_EXTERN int uv_udp_open(uv_udp_t* handle, uv_os_sock_t sock); UV_EXTERN int uv_udp_bind(uv_udp_t* handle, const struct sockaddr* addr, unsigned int flags); UV_EXTERN int uv_udp_connect(uv_udp_t* handle, const struct sockaddr* addr); UV_EXTERN int uv_udp_getpeername(const uv_udp_t* handle, struct sockaddr* name, int* namelen); UV_EXTERN int uv_udp_getsockname(const uv_udp_t* handle, struct sockaddr* name, int* namelen); UV_EXTERN int uv_udp_set_membership(uv_udp_t* handle, const char* multicast_addr, const char* interface_addr, uv_membership membership); UV_EXTERN int uv_udp_set_source_membership(uv_udp_t* handle, const char* multicast_addr, const char* interface_addr, const char* source_addr, uv_membership membership); UV_EXTERN int uv_udp_set_multicast_loop(uv_udp_t* handle, int on); UV_EXTERN int uv_udp_set_multicast_ttl(uv_udp_t* handle, int ttl); UV_EXTERN int uv_udp_set_multicast_interface(uv_udp_t* handle, const char* interface_addr); UV_EXTERN int uv_udp_set_broadcast(uv_udp_t* handle, int on); UV_EXTERN int uv_udp_set_ttl(uv_udp_t* handle, int ttl); UV_EXTERN int uv_udp_send(uv_udp_send_t* req, uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr, uv_udp_send_cb send_cb); UV_EXTERN int uv_udp_try_send(uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr); UV_EXTERN int uv_udp_recv_start(uv_udp_t* handle, uv_alloc_cb alloc_cb, uv_udp_recv_cb recv_cb); UV_EXTERN int uv_udp_recv_stop(uv_udp_t* handle); UV_EXTERN size_t uv_udp_get_send_queue_size(const uv_udp_t* handle); UV_EXTERN size_t uv_udp_get_send_queue_count(const uv_udp_t* handle); /* * uv_tty_t is a subclass of uv_stream_t. * * Representing a stream for the console. */ struct uv_tty_s { UV_HANDLE_FIELDS UV_STREAM_FIELDS UV_TTY_PRIVATE_FIELDS }; typedef enum { /* Initial/normal terminal mode */ UV_TTY_MODE_NORMAL, /* Raw input mode (On Windows, ENABLE_WINDOW_INPUT is also enabled) */ UV_TTY_MODE_RAW, /* Binary-safe I/O mode for IPC (Unix-only) */ UV_TTY_MODE_IO } uv_tty_mode_t; typedef enum { /* * The console supports handling of virtual terminal sequences * (Windows10 new console, ConEmu) */ UV_TTY_SUPPORTED, /* The console cannot process the virtual terminal sequence. (Legacy * console) */ UV_TTY_UNSUPPORTED } uv_tty_vtermstate_t; UV_EXTERN int uv_tty_init(uv_loop_t*, uv_tty_t*, uv_file fd, int readable); UV_EXTERN int uv_tty_set_mode(uv_tty_t*, uv_tty_mode_t mode); UV_EXTERN int uv_tty_reset_mode(void); UV_EXTERN int uv_tty_get_winsize(uv_tty_t*, int* width, int* height); UV_EXTERN void uv_tty_set_vterm_state(uv_tty_vtermstate_t state); UV_EXTERN int uv_tty_get_vterm_state(uv_tty_vtermstate_t* state); #ifdef __cplusplus extern "C++" { inline int uv_tty_set_mode(uv_tty_t* handle, int mode) { return uv_tty_set_mode(handle, static_cast(mode)); } } #endif UV_EXTERN uv_handle_type uv_guess_handle(uv_file file); /* * uv_pipe_t is a subclass of uv_stream_t. * * Representing a pipe stream or pipe server. On Windows this is a Named * Pipe. On Unix this is a Unix domain socket. */ struct uv_pipe_s { UV_HANDLE_FIELDS UV_STREAM_FIELDS int ipc; /* non-zero if this pipe is used for passing handles */ UV_PIPE_PRIVATE_FIELDS }; UV_EXTERN int uv_pipe_init(uv_loop_t*, uv_pipe_t* handle, int ipc); UV_EXTERN int uv_pipe_open(uv_pipe_t*, uv_file file); UV_EXTERN int uv_pipe_bind(uv_pipe_t* handle, const char* name); UV_EXTERN void uv_pipe_connect(uv_connect_t* req, uv_pipe_t* handle, const char* name, uv_connect_cb cb); UV_EXTERN int uv_pipe_getsockname(const uv_pipe_t* handle, char* buffer, size_t* size); UV_EXTERN int uv_pipe_getpeername(const uv_pipe_t* handle, char* buffer, size_t* size); UV_EXTERN void uv_pipe_pending_instances(uv_pipe_t* handle, int count); UV_EXTERN int uv_pipe_pending_count(uv_pipe_t* handle); UV_EXTERN uv_handle_type uv_pipe_pending_type(uv_pipe_t* handle); UV_EXTERN int uv_pipe_chmod(uv_pipe_t* handle, int flags); struct uv_poll_s { UV_HANDLE_FIELDS uv_poll_cb poll_cb; UV_POLL_PRIVATE_FIELDS }; enum uv_poll_event { UV_READABLE = 1, UV_WRITABLE = 2, UV_DISCONNECT = 4, UV_PRIORITIZED = 8 }; UV_EXTERN int uv_poll_init(uv_loop_t* loop, uv_poll_t* handle, int fd); UV_EXTERN int uv_poll_init_socket(uv_loop_t* loop, uv_poll_t* handle, uv_os_sock_t socket); UV_EXTERN int uv_poll_start(uv_poll_t* handle, int events, uv_poll_cb cb); UV_EXTERN int uv_poll_stop(uv_poll_t* handle); struct uv_prepare_s { UV_HANDLE_FIELDS UV_PREPARE_PRIVATE_FIELDS }; UV_EXTERN int uv_prepare_init(uv_loop_t*, uv_prepare_t* prepare); UV_EXTERN int uv_prepare_start(uv_prepare_t* prepare, uv_prepare_cb cb); UV_EXTERN int uv_prepare_stop(uv_prepare_t* prepare); struct uv_check_s { UV_HANDLE_FIELDS UV_CHECK_PRIVATE_FIELDS }; UV_EXTERN int uv_check_init(uv_loop_t*, uv_check_t* check); UV_EXTERN int uv_check_start(uv_check_t* check, uv_check_cb cb); UV_EXTERN int uv_check_stop(uv_check_t* check); struct uv_idle_s { UV_HANDLE_FIELDS UV_IDLE_PRIVATE_FIELDS }; UV_EXTERN int uv_idle_init(uv_loop_t*, uv_idle_t* idle); UV_EXTERN int uv_idle_start(uv_idle_t* idle, uv_idle_cb cb); UV_EXTERN int uv_idle_stop(uv_idle_t* idle); struct uv_async_s { UV_HANDLE_FIELDS UV_ASYNC_PRIVATE_FIELDS }; UV_EXTERN int uv_async_init(uv_loop_t*, uv_async_t* async, uv_async_cb async_cb); UV_EXTERN int uv_async_send(uv_async_t* async); /* * uv_timer_t is a subclass of uv_handle_t. * * Used to get woken up at a specified time in the future. */ struct uv_timer_s { UV_HANDLE_FIELDS UV_TIMER_PRIVATE_FIELDS }; UV_EXTERN int uv_timer_init(uv_loop_t*, uv_timer_t* handle); UV_EXTERN int uv_timer_start(uv_timer_t* handle, uv_timer_cb cb, uint64_t timeout, uint64_t repeat); UV_EXTERN int uv_timer_stop(uv_timer_t* handle); UV_EXTERN int uv_timer_again(uv_timer_t* handle); UV_EXTERN void uv_timer_set_repeat(uv_timer_t* handle, uint64_t repeat); UV_EXTERN uint64_t uv_timer_get_repeat(const uv_timer_t* handle); /* * uv_getaddrinfo_t is a subclass of uv_req_t. * * Request object for uv_getaddrinfo. */ struct uv_getaddrinfo_s { UV_REQ_FIELDS /* read-only */ uv_loop_t* loop; /* struct addrinfo* addrinfo is marked as private, but it really isn't. */ UV_GETADDRINFO_PRIVATE_FIELDS }; UV_EXTERN int uv_getaddrinfo(uv_loop_t* loop, uv_getaddrinfo_t* req, uv_getaddrinfo_cb getaddrinfo_cb, const char* node, const char* service, const struct addrinfo* hints); UV_EXTERN void uv_freeaddrinfo(struct addrinfo* ai); /* * uv_getnameinfo_t is a subclass of uv_req_t. * * Request object for uv_getnameinfo. */ struct uv_getnameinfo_s { UV_REQ_FIELDS /* read-only */ uv_loop_t* loop; /* host and service are marked as private, but they really aren't. */ UV_GETNAMEINFO_PRIVATE_FIELDS }; UV_EXTERN int uv_getnameinfo(uv_loop_t* loop, uv_getnameinfo_t* req, uv_getnameinfo_cb getnameinfo_cb, const struct sockaddr* addr, int flags); /* uv_spawn() options. */ typedef enum { UV_IGNORE = 0x00, UV_CREATE_PIPE = 0x01, UV_INHERIT_FD = 0x02, UV_INHERIT_STREAM = 0x04, /* * When UV_CREATE_PIPE is specified, UV_READABLE_PIPE and UV_WRITABLE_PIPE * determine the direction of flow, from the child process' perspective. Both * flags may be specified to create a duplex data stream. */ UV_READABLE_PIPE = 0x10, UV_WRITABLE_PIPE = 0x20, /* * Open the child pipe handle in overlapped mode on Windows. * On Unix it is silently ignored. */ UV_OVERLAPPED_PIPE = 0x40 } uv_stdio_flags; typedef struct uv_stdio_container_s { uv_stdio_flags flags; union { uv_stream_t* stream; int fd; } data; } uv_stdio_container_t; typedef struct uv_process_options_s { uv_exit_cb exit_cb; /* Called after the process exits. */ const char* file; /* Path to program to execute. */ /* * Command line arguments. args[0] should be the path to the program. On * Windows this uses CreateProcess which concatenates the arguments into a * string this can cause some strange errors. See the note at * windows_verbatim_arguments. */ char** args; /* * This will be set as the environ variable in the subprocess. If this is * NULL then the parents environ will be used. */ char** env; /* * If non-null this represents a directory the subprocess should execute * in. Stands for current working directory. */ const char* cwd; /* * Various flags that control how uv_spawn() behaves. See the definition of * `enum uv_process_flags` below. */ unsigned int flags; /* * The `stdio` field points to an array of uv_stdio_container_t structs that * describe the file descriptors that will be made available to the child * process. The convention is that stdio[0] points to stdin, fd 1 is used for * stdout, and fd 2 is stderr. * * Note that on windows file descriptors greater than 2 are available to the * child process only if the child processes uses the MSVCRT runtime. */ int stdio_count; uv_stdio_container_t* stdio; /* * Libuv can change the child process' user/group id. This happens only when * the appropriate bits are set in the flags fields. This is not supported on * windows; uv_spawn() will fail and set the error to UV_ENOTSUP. */ uv_uid_t uid; uv_gid_t gid; } uv_process_options_t; /* * These are the flags that can be used for the uv_process_options.flags field. */ enum uv_process_flags { /* * Set the child process' user id. The user id is supplied in the `uid` field * of the options struct. This does not work on windows; setting this flag * will cause uv_spawn() to fail. */ UV_PROCESS_SETUID = (1 << 0), /* * Set the child process' group id. The user id is supplied in the `gid` * field of the options struct. This does not work on windows; setting this * flag will cause uv_spawn() to fail. */ UV_PROCESS_SETGID = (1 << 1), /* * Do not wrap any arguments in quotes, or perform any other escaping, when * converting the argument list into a command line string. This option is * only meaningful on Windows systems. On Unix it is silently ignored. */ UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS = (1 << 2), /* * Spawn the child process in a detached state - this will make it a process * group leader, and will effectively enable the child to keep running after * the parent exits. Note that the child process will still keep the * parent's event loop alive unless the parent process calls uv_unref() on * the child's process handle. */ UV_PROCESS_DETACHED = (1 << 3), /* * Hide the subprocess window that would normally be created. This option is * only meaningful on Windows systems. On Unix it is silently ignored. */ UV_PROCESS_WINDOWS_HIDE = (1 << 4), /* * Hide the subprocess console window that would normally be created. This * option is only meaningful on Windows systems. On Unix it is silently * ignored. */ UV_PROCESS_WINDOWS_HIDE_CONSOLE = (1 << 5), /* * Hide the subprocess GUI window that would normally be created. This * option is only meaningful on Windows systems. On Unix it is silently * ignored. */ UV_PROCESS_WINDOWS_HIDE_GUI = (1 << 6) }; /* * uv_process_t is a subclass of uv_handle_t. */ struct uv_process_s { UV_HANDLE_FIELDS uv_exit_cb exit_cb; int pid; UV_PROCESS_PRIVATE_FIELDS }; UV_EXTERN int uv_spawn(uv_loop_t* loop, uv_process_t* handle, const uv_process_options_t* options); UV_EXTERN int uv_process_kill(uv_process_t*, int signum); UV_EXTERN int uv_kill(int pid, int signum); UV_EXTERN uv_pid_t uv_process_get_pid(const uv_process_t*); /* * uv_work_t is a subclass of uv_req_t. */ struct uv_work_s { UV_REQ_FIELDS uv_loop_t* loop; uv_work_cb work_cb; uv_after_work_cb after_work_cb; UV_WORK_PRIVATE_FIELDS }; UV_EXTERN int uv_queue_work(uv_loop_t* loop, uv_work_t* req, uv_work_cb work_cb, uv_after_work_cb after_work_cb); UV_EXTERN int uv_cancel(uv_req_t* req); struct uv_cpu_times_s { uint64_t user; /* milliseconds */ uint64_t nice; /* milliseconds */ uint64_t sys; /* milliseconds */ uint64_t idle; /* milliseconds */ uint64_t irq; /* milliseconds */ }; struct uv_cpu_info_s { char* model; int speed; struct uv_cpu_times_s cpu_times; }; struct uv_interface_address_s { char* name; char phys_addr[6]; int is_internal; union { struct sockaddr_in address4; struct sockaddr_in6 address6; } address; union { struct sockaddr_in netmask4; struct sockaddr_in6 netmask6; } netmask; }; struct uv_passwd_s { char* username; long uid; long gid; char* shell; char* homedir; }; struct uv_utsname_s { char sysname[256]; char release[256]; char version[256]; char machine[256]; /* This struct does not contain the nodename and domainname fields present in the utsname type. domainname is a GNU extension. Both fields are referred to as meaningless in the docs. */ }; struct uv_statfs_s { uint64_t f_type; uint64_t f_bsize; uint64_t f_blocks; uint64_t f_bfree; uint64_t f_bavail; uint64_t f_files; uint64_t f_ffree; uint64_t f_spare[4]; }; typedef enum { UV_DIRENT_UNKNOWN, UV_DIRENT_FILE, UV_DIRENT_DIR, UV_DIRENT_LINK, UV_DIRENT_FIFO, UV_DIRENT_SOCKET, UV_DIRENT_CHAR, UV_DIRENT_BLOCK } uv_dirent_type_t; struct uv_dirent_s { const char* name; uv_dirent_type_t type; }; UV_EXTERN char** uv_setup_args(int argc, char** argv); UV_EXTERN int uv_get_process_title(char* buffer, size_t size); UV_EXTERN int uv_set_process_title(const char* title); UV_EXTERN int uv_resident_set_memory(size_t* rss); UV_EXTERN int uv_uptime(double* uptime); UV_EXTERN uv_os_fd_t uv_get_osfhandle(int fd); UV_EXTERN int uv_open_osfhandle(uv_os_fd_t os_fd); typedef struct { long tv_sec; long tv_usec; } uv_timeval_t; typedef struct { int64_t tv_sec; int32_t tv_usec; } uv_timeval64_t; typedef struct { uv_timeval_t ru_utime; /* user CPU time used */ uv_timeval_t ru_stime; /* system CPU time used */ uint64_t ru_maxrss; /* maximum resident set size */ uint64_t ru_ixrss; /* integral shared memory size */ uint64_t ru_idrss; /* integral unshared data size */ uint64_t ru_isrss; /* integral unshared stack size */ uint64_t ru_minflt; /* page reclaims (soft page faults) */ uint64_t ru_majflt; /* page faults (hard page faults) */ uint64_t ru_nswap; /* swaps */ uint64_t ru_inblock; /* block input operations */ uint64_t ru_oublock; /* block output operations */ uint64_t ru_msgsnd; /* IPC messages sent */ uint64_t ru_msgrcv; /* IPC messages received */ uint64_t ru_nsignals; /* signals received */ uint64_t ru_nvcsw; /* voluntary context switches */ uint64_t ru_nivcsw; /* involuntary context switches */ } uv_rusage_t; UV_EXTERN int uv_getrusage(uv_rusage_t* rusage); UV_EXTERN int uv_os_homedir(char* buffer, size_t* size); UV_EXTERN int uv_os_tmpdir(char* buffer, size_t* size); UV_EXTERN int uv_os_get_passwd(uv_passwd_t* pwd); UV_EXTERN void uv_os_free_passwd(uv_passwd_t* pwd); UV_EXTERN uv_pid_t uv_os_getpid(void); UV_EXTERN uv_pid_t uv_os_getppid(void); #if defined(__PASE__) /* On IBM i PASE, the highest process priority is -10 */ # define UV_PRIORITY_LOW 39 // RUNPTY(99) # define UV_PRIORITY_BELOW_NORMAL 15 // RUNPTY(50) # define UV_PRIORITY_NORMAL 0 // RUNPTY(20) # define UV_PRIORITY_ABOVE_NORMAL -4 // RUNTY(12) # define UV_PRIORITY_HIGH -7 // RUNPTY(6) # define UV_PRIORITY_HIGHEST -10 // RUNPTY(1) #else # define UV_PRIORITY_LOW 19 # define UV_PRIORITY_BELOW_NORMAL 10 # define UV_PRIORITY_NORMAL 0 # define UV_PRIORITY_ABOVE_NORMAL -7 # define UV_PRIORITY_HIGH -14 # define UV_PRIORITY_HIGHEST -20 #endif UV_EXTERN int uv_os_getpriority(uv_pid_t pid, int* priority); UV_EXTERN int uv_os_setpriority(uv_pid_t pid, int priority); UV_EXTERN int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count); UV_EXTERN void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count); UV_EXTERN int uv_interface_addresses(uv_interface_address_t** addresses, int* count); UV_EXTERN void uv_free_interface_addresses(uv_interface_address_t* addresses, int count); struct uv_env_item_s { char* name; char* value; }; UV_EXTERN int uv_os_environ(uv_env_item_t** envitems, int* count); UV_EXTERN void uv_os_free_environ(uv_env_item_t* envitems, int count); UV_EXTERN int uv_os_getenv(const char* name, char* buffer, size_t* size); UV_EXTERN int uv_os_setenv(const char* name, const char* value); UV_EXTERN int uv_os_unsetenv(const char* name); #ifdef MAXHOSTNAMELEN # define UV_MAXHOSTNAMESIZE (MAXHOSTNAMELEN + 1) #else /* Fallback for the maximum hostname size, including the null terminator. The Windows gethostname() documentation states that 256 bytes will always be large enough to hold the null-terminated hostname. */ # define UV_MAXHOSTNAMESIZE 256 #endif UV_EXTERN int uv_os_gethostname(char* buffer, size_t* size); UV_EXTERN int uv_os_uname(uv_utsname_t* buffer); typedef enum { UV_FS_UNKNOWN = -1, UV_FS_CUSTOM, UV_FS_OPEN, UV_FS_CLOSE, UV_FS_READ, UV_FS_WRITE, UV_FS_SENDFILE, UV_FS_STAT, UV_FS_LSTAT, UV_FS_FSTAT, UV_FS_FTRUNCATE, UV_FS_UTIME, UV_FS_FUTIME, UV_FS_ACCESS, UV_FS_CHMOD, UV_FS_FCHMOD, UV_FS_FSYNC, UV_FS_FDATASYNC, UV_FS_UNLINK, UV_FS_RMDIR, UV_FS_MKDIR, UV_FS_MKDTEMP, UV_FS_RENAME, UV_FS_SCANDIR, UV_FS_LINK, UV_FS_SYMLINK, UV_FS_READLINK, UV_FS_CHOWN, UV_FS_FCHOWN, UV_FS_REALPATH, UV_FS_COPYFILE, UV_FS_LCHOWN, UV_FS_OPENDIR, UV_FS_READDIR, UV_FS_CLOSEDIR, UV_FS_STATFS, UV_FS_MKSTEMP, UV_FS_LUTIME } uv_fs_type; struct uv_dir_s { uv_dirent_t* dirents; size_t nentries; void* reserved[4]; UV_DIR_PRIVATE_FIELDS }; /* uv_fs_t is a subclass of uv_req_t. */ struct uv_fs_s { UV_REQ_FIELDS uv_fs_type fs_type; uv_loop_t* loop; uv_fs_cb cb; ssize_t result; void* ptr; const char* path; uv_stat_t statbuf; /* Stores the result of uv_fs_stat() and uv_fs_fstat(). */ UV_FS_PRIVATE_FIELDS }; UV_EXTERN uv_fs_type uv_fs_get_type(const uv_fs_t*); UV_EXTERN ssize_t uv_fs_get_result(const uv_fs_t*); UV_EXTERN int uv_fs_get_system_error(const uv_fs_t*); UV_EXTERN void* uv_fs_get_ptr(const uv_fs_t*); UV_EXTERN const char* uv_fs_get_path(const uv_fs_t*); UV_EXTERN uv_stat_t* uv_fs_get_statbuf(uv_fs_t*); UV_EXTERN void uv_fs_req_cleanup(uv_fs_t* req); UV_EXTERN int uv_fs_close(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb); UV_EXTERN int uv_fs_open(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, int mode, uv_fs_cb cb); UV_EXTERN int uv_fs_read(uv_loop_t* loop, uv_fs_t* req, uv_file file, const uv_buf_t bufs[], unsigned int nbufs, int64_t offset, uv_fs_cb cb); UV_EXTERN int uv_fs_unlink(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb); UV_EXTERN int uv_fs_write(uv_loop_t* loop, uv_fs_t* req, uv_file file, const uv_buf_t bufs[], unsigned int nbufs, int64_t offset, uv_fs_cb cb); /* * This flag can be used with uv_fs_copyfile() to return an error if the * destination already exists. */ #define UV_FS_COPYFILE_EXCL 0x0001 /* * This flag can be used with uv_fs_copyfile() to attempt to create a reflink. * If copy-on-write is not supported, a fallback copy mechanism is used. */ #define UV_FS_COPYFILE_FICLONE 0x0002 /* * This flag can be used with uv_fs_copyfile() to attempt to create a reflink. * If copy-on-write is not supported, an error is returned. */ #define UV_FS_COPYFILE_FICLONE_FORCE 0x0004 UV_EXTERN int uv_fs_copyfile(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, int flags, uv_fs_cb cb); UV_EXTERN int uv_fs_mkdir(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, uv_fs_cb cb); UV_EXTERN int uv_fs_mkdtemp(uv_loop_t* loop, uv_fs_t* req, const char* tpl, uv_fs_cb cb); UV_EXTERN int uv_fs_mkstemp(uv_loop_t* loop, uv_fs_t* req, const char* tpl, uv_fs_cb cb); UV_EXTERN int uv_fs_rmdir(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb); UV_EXTERN int uv_fs_scandir(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, uv_fs_cb cb); UV_EXTERN int uv_fs_scandir_next(uv_fs_t* req, uv_dirent_t* ent); UV_EXTERN int uv_fs_opendir(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb); UV_EXTERN int uv_fs_readdir(uv_loop_t* loop, uv_fs_t* req, uv_dir_t* dir, uv_fs_cb cb); UV_EXTERN int uv_fs_closedir(uv_loop_t* loop, uv_fs_t* req, uv_dir_t* dir, uv_fs_cb cb); UV_EXTERN int uv_fs_stat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb); UV_EXTERN int uv_fs_fstat(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb); UV_EXTERN int uv_fs_rename(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, uv_fs_cb cb); UV_EXTERN int uv_fs_fsync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb); UV_EXTERN int uv_fs_fdatasync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb); UV_EXTERN int uv_fs_ftruncate(uv_loop_t* loop, uv_fs_t* req, uv_file file, int64_t offset, uv_fs_cb cb); UV_EXTERN int uv_fs_sendfile(uv_loop_t* loop, uv_fs_t* req, uv_file out_fd, uv_file in_fd, int64_t in_offset, size_t length, uv_fs_cb cb); UV_EXTERN int uv_fs_access(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, uv_fs_cb cb); UV_EXTERN int uv_fs_chmod(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, uv_fs_cb cb); UV_EXTERN int uv_fs_utime(uv_loop_t* loop, uv_fs_t* req, const char* path, double atime, double mtime, uv_fs_cb cb); UV_EXTERN int uv_fs_futime(uv_loop_t* loop, uv_fs_t* req, uv_file file, double atime, double mtime, uv_fs_cb cb); UV_EXTERN int uv_fs_lutime(uv_loop_t* loop, uv_fs_t* req, const char* path, double atime, double mtime, uv_fs_cb cb); UV_EXTERN int uv_fs_lstat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb); UV_EXTERN int uv_fs_link(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, uv_fs_cb cb); /* * This flag can be used with uv_fs_symlink() on Windows to specify whether * path argument points to a directory. */ #define UV_FS_SYMLINK_DIR 0x0001 /* * This flag can be used with uv_fs_symlink() on Windows to specify whether * the symlink is to be created using junction points. */ #define UV_FS_SYMLINK_JUNCTION 0x0002 UV_EXTERN int uv_fs_symlink(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, int flags, uv_fs_cb cb); UV_EXTERN int uv_fs_readlink(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb); UV_EXTERN int uv_fs_realpath(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb); UV_EXTERN int uv_fs_fchmod(uv_loop_t* loop, uv_fs_t* req, uv_file file, int mode, uv_fs_cb cb); UV_EXTERN int uv_fs_chown(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_uid_t uid, uv_gid_t gid, uv_fs_cb cb); UV_EXTERN int uv_fs_fchown(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_uid_t uid, uv_gid_t gid, uv_fs_cb cb); UV_EXTERN int uv_fs_lchown(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_uid_t uid, uv_gid_t gid, uv_fs_cb cb); UV_EXTERN int uv_fs_statfs(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb); enum uv_fs_event { UV_RENAME = 1, UV_CHANGE = 2 }; struct uv_fs_event_s { UV_HANDLE_FIELDS /* private */ char* path; UV_FS_EVENT_PRIVATE_FIELDS }; /* * uv_fs_stat() based polling file watcher. */ struct uv_fs_poll_s { UV_HANDLE_FIELDS /* Private, don't touch. */ void* poll_ctx; }; UV_EXTERN int uv_fs_poll_init(uv_loop_t* loop, uv_fs_poll_t* handle); UV_EXTERN int uv_fs_poll_start(uv_fs_poll_t* handle, uv_fs_poll_cb poll_cb, const char* path, unsigned int interval); UV_EXTERN int uv_fs_poll_stop(uv_fs_poll_t* handle); UV_EXTERN int uv_fs_poll_getpath(uv_fs_poll_t* handle, char* buffer, size_t* size); struct uv_signal_s { UV_HANDLE_FIELDS uv_signal_cb signal_cb; int signum; UV_SIGNAL_PRIVATE_FIELDS }; UV_EXTERN int uv_signal_init(uv_loop_t* loop, uv_signal_t* handle); UV_EXTERN int uv_signal_start(uv_signal_t* handle, uv_signal_cb signal_cb, int signum); UV_EXTERN int uv_signal_start_oneshot(uv_signal_t* handle, uv_signal_cb signal_cb, int signum); UV_EXTERN int uv_signal_stop(uv_signal_t* handle); UV_EXTERN void uv_loadavg(double avg[3]); /* * Flags to be passed to uv_fs_event_start(). */ enum uv_fs_event_flags { /* * By default, if the fs event watcher is given a directory name, we will * watch for all events in that directory. This flags overrides this behavior * and makes fs_event report only changes to the directory entry itself. This * flag does not affect individual files watched. * This flag is currently not implemented yet on any backend. */ UV_FS_EVENT_WATCH_ENTRY = 1, /* * By default uv_fs_event will try to use a kernel interface such as inotify * or kqueue to detect events. This may not work on remote filesystems such * as NFS mounts. This flag makes fs_event fall back to calling stat() on a * regular interval. * This flag is currently not implemented yet on any backend. */ UV_FS_EVENT_STAT = 2, /* * By default, event watcher, when watching directory, is not registering * (is ignoring) changes in it's subdirectories. * This flag will override this behaviour on platforms that support it. */ UV_FS_EVENT_RECURSIVE = 4 }; UV_EXTERN int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle); UV_EXTERN int uv_fs_event_start(uv_fs_event_t* handle, uv_fs_event_cb cb, const char* path, unsigned int flags); UV_EXTERN int uv_fs_event_stop(uv_fs_event_t* handle); UV_EXTERN int uv_fs_event_getpath(uv_fs_event_t* handle, char* buffer, size_t* size); UV_EXTERN int uv_ip4_addr(const char* ip, int port, struct sockaddr_in* addr); UV_EXTERN int uv_ip6_addr(const char* ip, int port, struct sockaddr_in6* addr); UV_EXTERN int uv_ip4_name(const struct sockaddr_in* src, char* dst, size_t size); UV_EXTERN int uv_ip6_name(const struct sockaddr_in6* src, char* dst, size_t size); UV_EXTERN int uv_inet_ntop(int af, const void* src, char* dst, size_t size); UV_EXTERN int uv_inet_pton(int af, const char* src, void* dst); struct uv_random_s { UV_REQ_FIELDS /* read-only */ uv_loop_t* loop; /* private */ int status; void* buf; size_t buflen; uv_random_cb cb; struct uv__work work_req; }; UV_EXTERN int uv_random(uv_loop_t* loop, uv_random_t* req, void *buf, size_t buflen, unsigned flags, /* For future extension; must be 0. */ uv_random_cb cb); #if defined(IF_NAMESIZE) # define UV_IF_NAMESIZE (IF_NAMESIZE + 1) #elif defined(IFNAMSIZ) # define UV_IF_NAMESIZE (IFNAMSIZ + 1) #else # define UV_IF_NAMESIZE (16 + 1) #endif UV_EXTERN int uv_if_indextoname(unsigned int ifindex, char* buffer, size_t* size); UV_EXTERN int uv_if_indextoiid(unsigned int ifindex, char* buffer, size_t* size); UV_EXTERN int uv_exepath(char* buffer, size_t* size); UV_EXTERN int uv_cwd(char* buffer, size_t* size); UV_EXTERN int uv_chdir(const char* dir); UV_EXTERN uint64_t uv_get_free_memory(void); UV_EXTERN uint64_t uv_get_total_memory(void); UV_EXTERN uint64_t uv_get_constrained_memory(void); UV_EXTERN uint64_t uv_hrtime(void); UV_EXTERN void uv_sleep(unsigned int msec); UV_EXTERN void uv_disable_stdio_inheritance(void); UV_EXTERN int uv_dlopen(const char* filename, uv_lib_t* lib); UV_EXTERN void uv_dlclose(uv_lib_t* lib); UV_EXTERN int uv_dlsym(uv_lib_t* lib, const char* name, void** ptr); UV_EXTERN const char* uv_dlerror(const uv_lib_t* lib); UV_EXTERN int uv_mutex_init(uv_mutex_t* handle); UV_EXTERN int uv_mutex_init_recursive(uv_mutex_t* handle); UV_EXTERN void uv_mutex_destroy(uv_mutex_t* handle); UV_EXTERN void uv_mutex_lock(uv_mutex_t* handle); UV_EXTERN int uv_mutex_trylock(uv_mutex_t* handle); UV_EXTERN void uv_mutex_unlock(uv_mutex_t* handle); UV_EXTERN int uv_rwlock_init(uv_rwlock_t* rwlock); UV_EXTERN void uv_rwlock_destroy(uv_rwlock_t* rwlock); UV_EXTERN void uv_rwlock_rdlock(uv_rwlock_t* rwlock); UV_EXTERN int uv_rwlock_tryrdlock(uv_rwlock_t* rwlock); UV_EXTERN void uv_rwlock_rdunlock(uv_rwlock_t* rwlock); UV_EXTERN void uv_rwlock_wrlock(uv_rwlock_t* rwlock); UV_EXTERN int uv_rwlock_trywrlock(uv_rwlock_t* rwlock); UV_EXTERN void uv_rwlock_wrunlock(uv_rwlock_t* rwlock); UV_EXTERN int uv_sem_init(uv_sem_t* sem, unsigned int value); UV_EXTERN void uv_sem_destroy(uv_sem_t* sem); UV_EXTERN void uv_sem_post(uv_sem_t* sem); UV_EXTERN void uv_sem_wait(uv_sem_t* sem); UV_EXTERN int uv_sem_trywait(uv_sem_t* sem); UV_EXTERN int uv_cond_init(uv_cond_t* cond); UV_EXTERN void uv_cond_destroy(uv_cond_t* cond); UV_EXTERN void uv_cond_signal(uv_cond_t* cond); UV_EXTERN void uv_cond_broadcast(uv_cond_t* cond); UV_EXTERN int uv_barrier_init(uv_barrier_t* barrier, unsigned int count); UV_EXTERN void uv_barrier_destroy(uv_barrier_t* barrier); UV_EXTERN int uv_barrier_wait(uv_barrier_t* barrier); UV_EXTERN void uv_cond_wait(uv_cond_t* cond, uv_mutex_t* mutex); UV_EXTERN int uv_cond_timedwait(uv_cond_t* cond, uv_mutex_t* mutex, uint64_t timeout); UV_EXTERN void uv_once(uv_once_t* guard, void (*callback)(void)); UV_EXTERN int uv_key_create(uv_key_t* key); UV_EXTERN void uv_key_delete(uv_key_t* key); UV_EXTERN void* uv_key_get(uv_key_t* key); UV_EXTERN void uv_key_set(uv_key_t* key, void* value); UV_EXTERN int uv_gettimeofday(uv_timeval64_t* tv); typedef void (*uv_thread_cb)(void* arg); UV_EXTERN int uv_thread_create(uv_thread_t* tid, uv_thread_cb entry, void* arg); typedef enum { UV_THREAD_NO_FLAGS = 0x00, UV_THREAD_HAS_STACK_SIZE = 0x01 } uv_thread_create_flags; struct uv_thread_options_s { unsigned int flags; size_t stack_size; /* More fields may be added at any time. */ }; typedef struct uv_thread_options_s uv_thread_options_t; UV_EXTERN int uv_thread_create_ex(uv_thread_t* tid, const uv_thread_options_t* params, uv_thread_cb entry, void* arg); UV_EXTERN uv_thread_t uv_thread_self(void); UV_EXTERN int uv_thread_join(uv_thread_t *tid); UV_EXTERN int uv_thread_equal(const uv_thread_t* t1, const uv_thread_t* t2); /* The presence of these unions force similar struct layout. */ #define XX(_, name) uv_ ## name ## _t name; union uv_any_handle { UV_HANDLE_TYPE_MAP(XX) }; union uv_any_req { UV_REQ_TYPE_MAP(XX) }; #undef XX struct uv_loop_s { /* User data - use this for whatever. */ void* data; /* Loop reference counting. */ unsigned int active_handles; void* handle_queue[2]; union { void* unused[2]; unsigned int count; } active_reqs; /* Internal flag to signal loop stop. */ unsigned int stop_flag; UV_LOOP_PRIVATE_FIELDS }; UV_EXTERN void* uv_loop_get_data(const uv_loop_t*); UV_EXTERN void uv_loop_set_data(uv_loop_t*, void* data); /* Don't export the private CPP symbols. */ #undef UV_HANDLE_TYPE_PRIVATE #undef UV_REQ_TYPE_PRIVATE #undef UV_REQ_PRIVATE_FIELDS #undef UV_STREAM_PRIVATE_FIELDS #undef UV_TCP_PRIVATE_FIELDS #undef UV_PREPARE_PRIVATE_FIELDS #undef UV_CHECK_PRIVATE_FIELDS #undef UV_IDLE_PRIVATE_FIELDS #undef UV_ASYNC_PRIVATE_FIELDS #undef UV_TIMER_PRIVATE_FIELDS #undef UV_GETADDRINFO_PRIVATE_FIELDS #undef UV_GETNAMEINFO_PRIVATE_FIELDS #undef UV_FS_REQ_PRIVATE_FIELDS #undef UV_WORK_PRIVATE_FIELDS #undef UV_FS_EVENT_PRIVATE_FIELDS #undef UV_SIGNAL_PRIVATE_FIELDS #undef UV_LOOP_PRIVATE_FIELDS #undef UV_LOOP_PRIVATE_PLATFORM_FIELDS #undef UV__ERR #ifdef __cplusplus } #endif #endif /* UV_H */ ================================================ FILE: external/libuv/src/fs-poll.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "uv-common.h" #ifdef _WIN32 #include "win/internal.h" #include "win/handle-inl.h" #define uv__make_close_pending(h) uv_want_endgame((h)->loop, (h)) #else #include "unix/internal.h" #endif #include #include #include struct poll_ctx { uv_fs_poll_t* parent_handle; int busy_polling; unsigned int interval; uint64_t start_time; uv_loop_t* loop; uv_fs_poll_cb poll_cb; uv_timer_t timer_handle; uv_fs_t fs_req; /* TODO(bnoordhuis) mark fs_req internal */ uv_stat_t statbuf; struct poll_ctx* previous; /* context from previous start()..stop() period */ char path[1]; /* variable length */ }; static int statbuf_eq(const uv_stat_t* a, const uv_stat_t* b); static void poll_cb(uv_fs_t* req); static void timer_cb(uv_timer_t* timer); static void timer_close_cb(uv_handle_t* handle); static uv_stat_t zero_statbuf; int uv_fs_poll_init(uv_loop_t* loop, uv_fs_poll_t* handle) { uv__handle_init(loop, (uv_handle_t*)handle, UV_FS_POLL); handle->poll_ctx = NULL; return 0; } int uv_fs_poll_start(uv_fs_poll_t* handle, uv_fs_poll_cb cb, const char* path, unsigned int interval) { struct poll_ctx* ctx; uv_loop_t* loop; size_t len; int err; if (uv_is_active((uv_handle_t*)handle)) return 0; loop = handle->loop; len = strlen(path); ctx = (struct poll_ctx *)uv__calloc(1, sizeof(*ctx) + len); if (ctx == NULL) return UV_ENOMEM; ctx->loop = loop; ctx->poll_cb = cb; ctx->interval = interval ? interval : 1; ctx->start_time = uv_now(loop); ctx->parent_handle = handle; memcpy(ctx->path, path, len + 1); err = uv_timer_init(loop, &ctx->timer_handle); if (err < 0) goto error; ctx->timer_handle.flags |= UV_HANDLE_INTERNAL; uv__handle_unref(&ctx->timer_handle); err = uv_fs_stat(loop, &ctx->fs_req, ctx->path, poll_cb); if (err < 0) goto error; if (handle->poll_ctx != NULL) ctx->previous = (struct poll_ctx *)handle->poll_ctx; handle->poll_ctx = ctx; uv__handle_start(handle); return 0; error: uv__free(ctx); return err; } int uv_fs_poll_stop(uv_fs_poll_t* handle) { struct poll_ctx* ctx; if (!uv_is_active((uv_handle_t*)handle)) return 0; ctx = (struct poll_ctx *)handle->poll_ctx; assert(ctx != NULL); assert(ctx->parent_handle == handle); /* Close the timer if it's active. If it's inactive, there's a stat request * in progress and poll_cb will take care of the cleanup. */ if (uv_is_active((uv_handle_t*)&ctx->timer_handle)) uv_close((uv_handle_t*)&ctx->timer_handle, timer_close_cb); uv__handle_stop(handle); return 0; } int uv_fs_poll_getpath(uv_fs_poll_t* handle, char* buffer, size_t* size) { struct poll_ctx* ctx; size_t required_len; if (!uv_is_active((uv_handle_t*)handle)) { *size = 0; return UV_EINVAL; } ctx = (struct poll_ctx *)handle->poll_ctx; assert(ctx != NULL); required_len = strlen(ctx->path); if (required_len >= *size) { *size = required_len + 1; return UV_ENOBUFS; } memcpy(buffer, ctx->path, required_len); *size = required_len; buffer[required_len] = '\0'; return 0; } void uv__fs_poll_close(uv_fs_poll_t* handle) { uv_fs_poll_stop(handle); if (handle->poll_ctx == NULL) uv__make_close_pending((uv_handle_t*)handle); } static void timer_cb(uv_timer_t* timer) { struct poll_ctx* ctx; ctx = container_of(timer, struct poll_ctx, timer_handle); assert(ctx->parent_handle != NULL); assert(ctx->parent_handle->poll_ctx == ctx); ctx->start_time = uv_now(ctx->loop); if (uv_fs_stat(ctx->loop, &ctx->fs_req, ctx->path, poll_cb)) abort(); } static void poll_cb(uv_fs_t* req) { uv_stat_t* statbuf; struct poll_ctx* ctx; uint64_t interval; uv_fs_poll_t* handle; ctx = container_of(req, struct poll_ctx, fs_req); handle = ctx->parent_handle; if (!uv_is_active((uv_handle_t*)handle) || uv__is_closing(handle)) goto out; if (req->result != 0) { if (ctx->busy_polling != req->result) { ctx->poll_cb(ctx->parent_handle, req->result, &ctx->statbuf, &zero_statbuf); ctx->busy_polling = req->result; } goto out; } statbuf = &req->statbuf; if (ctx->busy_polling != 0) if (ctx->busy_polling < 0 || !statbuf_eq(&ctx->statbuf, statbuf)) ctx->poll_cb(ctx->parent_handle, 0, &ctx->statbuf, statbuf); ctx->statbuf = *statbuf; ctx->busy_polling = 1; out: uv_fs_req_cleanup(req); if (!uv_is_active((uv_handle_t*)handle) || uv__is_closing(handle)) { uv_close((uv_handle_t*)&ctx->timer_handle, timer_close_cb); return; } /* Reschedule timer, subtract the delay from doing the stat(). */ interval = ctx->interval; interval -= (uv_now(ctx->loop) - ctx->start_time) % interval; if (uv_timer_start(&ctx->timer_handle, timer_cb, interval, 0)) abort(); } static void timer_close_cb(uv_handle_t* timer) { struct poll_ctx* ctx; struct poll_ctx* it; struct poll_ctx* last; uv_fs_poll_t* handle; ctx = container_of(timer, struct poll_ctx, timer_handle); handle = ctx->parent_handle; if (ctx == handle->poll_ctx) { handle->poll_ctx = ctx->previous; if (handle->poll_ctx == NULL && uv__is_closing(handle)) uv__make_close_pending((uv_handle_t*)handle); } else { for (last = (struct poll_ctx *)handle->poll_ctx, it = last->previous; it != ctx; last = it, it = it->previous) { assert(last->previous != NULL); } last->previous = ctx->previous; } uv__free(ctx); } static int statbuf_eq(const uv_stat_t* a, const uv_stat_t* b) { return a->st_ctim.tv_nsec == b->st_ctim.tv_nsec && a->st_mtim.tv_nsec == b->st_mtim.tv_nsec && a->st_birthtim.tv_nsec == b->st_birthtim.tv_nsec && a->st_ctim.tv_sec == b->st_ctim.tv_sec && a->st_mtim.tv_sec == b->st_mtim.tv_sec && a->st_birthtim.tv_sec == b->st_birthtim.tv_sec && a->st_size == b->st_size && a->st_mode == b->st_mode && a->st_uid == b->st_uid && a->st_gid == b->st_gid && a->st_ino == b->st_ino && a->st_dev == b->st_dev && a->st_flags == b->st_flags && a->st_gen == b->st_gen; } #if defined(_WIN32) #include "win/internal.h" #include "win/handle-inl.h" void uv__fs_poll_endgame(uv_loop_t* loop, uv_fs_poll_t* handle) { assert(handle->flags & UV_HANDLE_CLOSING); assert(!(handle->flags & UV_HANDLE_CLOSED)); uv__handle_close(handle); } #endif /* _WIN32 */ ================================================ FILE: external/libuv/src/heap-inl.h ================================================ /* Copyright (c) 2013, Ben Noordhuis * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef UV_SRC_HEAP_H_ #define UV_SRC_HEAP_H_ #include /* NULL */ #if defined(__GNUC__) # define HEAP_EXPORT(declaration) __attribute__((unused)) static declaration #else # define HEAP_EXPORT(declaration) static declaration #endif struct heap_node { struct heap_node* left; struct heap_node* right; struct heap_node* parent; }; /* A binary min heap. The usual properties hold: the root is the lowest * element in the set, the height of the tree is at most log2(nodes) and * it's always a complete binary tree. * * The heap function try hard to detect corrupted tree nodes at the cost * of a minor reduction in performance. Compile with -DNDEBUG to disable. */ struct heap { struct heap_node* min; unsigned int nelts; }; /* Return non-zero if a < b. */ typedef int (*heap_compare_fn)(const struct heap_node* a, const struct heap_node* b); /* Public functions. */ HEAP_EXPORT(void heap_init(struct heap* heap)); HEAP_EXPORT(struct heap_node* heap_min(const struct heap* heap)); HEAP_EXPORT(void heap_insert(struct heap* heap, struct heap_node* newnode, heap_compare_fn less_than)); HEAP_EXPORT(void heap_remove(struct heap* heap, struct heap_node* node, heap_compare_fn less_than)); HEAP_EXPORT(void heap_dequeue(struct heap* heap, heap_compare_fn less_than)); /* Implementation follows. */ HEAP_EXPORT(void heap_init(struct heap* heap)) { heap->min = NULL; heap->nelts = 0; } HEAP_EXPORT(struct heap_node* heap_min(const struct heap* heap)) { return heap->min; } /* Swap parent with child. Child moves closer to the root, parent moves away. */ static void heap_node_swap(struct heap* heap, struct heap_node* parent, struct heap_node* child) { struct heap_node* sibling; struct heap_node t; t = *parent; *parent = *child; *child = t; parent->parent = child; if (child->left == child) { child->left = parent; sibling = child->right; } else { child->right = parent; sibling = child->left; } if (sibling != NULL) sibling->parent = child; if (parent->left != NULL) parent->left->parent = parent; if (parent->right != NULL) parent->right->parent = parent; if (child->parent == NULL) heap->min = child; else if (child->parent->left == parent) child->parent->left = child; else child->parent->right = child; } HEAP_EXPORT(void heap_insert(struct heap* heap, struct heap_node* newnode, heap_compare_fn less_than)) { struct heap_node** parent; struct heap_node** child; unsigned int path; unsigned int n; unsigned int k; newnode->left = NULL; newnode->right = NULL; newnode->parent = NULL; /* Calculate the path from the root to the insertion point. This is a min * heap so we always insert at the left-most free node of the bottom row. */ path = 0; for (k = 0, n = 1 + heap->nelts; n >= 2; k += 1, n /= 2) path = (path << 1) | (n & 1); /* Now traverse the heap using the path we calculated in the previous step. */ parent = child = &heap->min; while (k > 0) { parent = child; if (path & 1) child = &(*child)->right; else child = &(*child)->left; path >>= 1; k -= 1; } /* Insert the new node. */ newnode->parent = *parent; *child = newnode; heap->nelts += 1; /* Walk up the tree and check at each node if the heap property holds. * It's a min heap so parent < child must be true. */ while (newnode->parent != NULL && less_than(newnode, newnode->parent)) heap_node_swap(heap, newnode->parent, newnode); } HEAP_EXPORT(void heap_remove(struct heap* heap, struct heap_node* node, heap_compare_fn less_than)) { struct heap_node* smallest; struct heap_node** max; struct heap_node* child; unsigned int path; unsigned int k; unsigned int n; if (heap->nelts == 0) return; /* Calculate the path from the min (the root) to the max, the left-most node * of the bottom row. */ path = 0; for (k = 0, n = heap->nelts; n >= 2; k += 1, n /= 2) path = (path << 1) | (n & 1); /* Now traverse the heap using the path we calculated in the previous step. */ max = &heap->min; while (k > 0) { if (path & 1) max = &(*max)->right; else max = &(*max)->left; path >>= 1; k -= 1; } heap->nelts -= 1; /* Unlink the max node. */ child = *max; *max = NULL; if (child == node) { /* We're removing either the max or the last node in the tree. */ if (child == heap->min) { heap->min = NULL; } return; } /* Replace the to be deleted node with the max node. */ child->left = node->left; child->right = node->right; child->parent = node->parent; if (child->left != NULL) { child->left->parent = child; } if (child->right != NULL) { child->right->parent = child; } if (node->parent == NULL) { heap->min = child; } else if (node->parent->left == node) { node->parent->left = child; } else { node->parent->right = child; } /* Walk down the subtree and check at each node if the heap property holds. * It's a min heap so parent < child must be true. If the parent is bigger, * swap it with the smallest child. */ for (;;) { smallest = child; if (child->left != NULL && less_than(child->left, smallest)) smallest = child->left; if (child->right != NULL && less_than(child->right, smallest)) smallest = child->right; if (smallest == child) break; heap_node_swap(heap, child, smallest); } /* Walk up the subtree and check that each parent is less than the node * this is required, because `max` node is not guaranteed to be the * actual maximum in tree */ while (child->parent != NULL && less_than(child, child->parent)) heap_node_swap(heap, child->parent, child); } HEAP_EXPORT(void heap_dequeue(struct heap* heap, heap_compare_fn less_than)) { heap_remove(heap, heap->min, less_than); } #undef HEAP_EXPORT #endif /* UV_SRC_HEAP_H_ */ ================================================ FILE: external/libuv/src/idna.c ================================================ /* Copyright (c) 2011, 2018 Ben Noordhuis * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* Derived from https://github.com/bnoordhuis/punycode * but updated to support IDNA 2008. */ #include "uv.h" #include "idna.h" #include static unsigned uv__utf8_decode1_slow(const char** p, const char* pe, unsigned a) { unsigned b; unsigned c; unsigned d; unsigned min; if (a > 0xF7) return -1; switch (*p - pe) { default: if (a > 0xEF) { min = 0x10000; a = a & 7; b = (unsigned char) *(*p)++; c = (unsigned char) *(*p)++; d = (unsigned char) *(*p)++; break; } /* Fall through. */ case 2: if (a > 0xDF) { min = 0x800; b = 0x80 | (a & 15); c = (unsigned char) *(*p)++; d = (unsigned char) *(*p)++; a = 0; break; } /* Fall through. */ case 1: if (a > 0xBF) { min = 0x80; b = 0x80; c = 0x80 | (a & 31); d = (unsigned char) *(*p)++; a = 0; break; } return -1; /* Invalid continuation byte. */ } if (0x80 != (0xC0 & (b ^ c ^ d))) return -1; /* Invalid sequence. */ b &= 63; c &= 63; d &= 63; a = (a << 18) | (b << 12) | (c << 6) | d; if (a < min) return -1; /* Overlong sequence. */ if (a > 0x10FFFF) return -1; /* Four-byte sequence > U+10FFFF. */ if (a >= 0xD800 && a <= 0xDFFF) return -1; /* Surrogate pair. */ return a; } unsigned uv__utf8_decode1(const char** p, const char* pe) { unsigned a; a = (unsigned char) *(*p)++; if (a < 128) return a; /* ASCII, common case. */ return uv__utf8_decode1_slow(p, pe, a); } #define foreach_codepoint(c, p, pe) \ for (; (void) (*p <= pe && (c = uv__utf8_decode1(p, pe))), *p <= pe;) static int uv__idna_toascii_label(const char* s, const char* se, char** d, char* de) { static const char alphabet[] = "abcdefghijklmnopqrstuvwxyz0123456789"; const char* ss; unsigned c; unsigned h; unsigned k; unsigned n; unsigned m; unsigned q; unsigned t; unsigned x; unsigned y; unsigned bias; unsigned delta; unsigned todo; int first; h = 0; ss = s; todo = 0; foreach_codepoint(c, &s, se) { if (c < 128) h++; else if (c == (unsigned) -1) return UV_EINVAL; else todo++; } if (todo > 0) { if (*d < de) *(*d)++ = 'x'; if (*d < de) *(*d)++ = 'n'; if (*d < de) *(*d)++ = '-'; if (*d < de) *(*d)++ = '-'; } x = 0; s = ss; foreach_codepoint(c, &s, se) { if (c > 127) continue; if (*d < de) *(*d)++ = c; if (++x == h) break; /* Visited all ASCII characters. */ } if (todo == 0) return h; /* Only write separator when we've written ASCII characters first. */ if (h > 0) if (*d < de) *(*d)++ = '-'; n = 128; bias = 72; delta = 0; first = 1; while (todo > 0) { m = -1; s = ss; foreach_codepoint(c, &s, se) if (c >= n) if (c < m) m = c; x = m - n; y = h + 1; if (x > ~delta / y) return UV_E2BIG; /* Overflow. */ delta += x * y; n = m; s = ss; foreach_codepoint(c, &s, se) { if (c < n) if (++delta == 0) return UV_E2BIG; /* Overflow. */ if (c != n) continue; for (k = 36, q = delta; /* empty */; k += 36) { t = 1; if (k > bias) t = k - bias; if (t > 26) t = 26; if (q < t) break; /* TODO(bnoordhuis) Since 1 <= t <= 26 and therefore * 10 <= y <= 35, we can optimize the long division * into a table-based reciprocal multiplication. */ x = q - t; y = 36 - t; /* 10 <= y <= 35 since 1 <= t <= 26. */ q = x / y; t = t + x % y; /* 1 <= t <= 35 because of y. */ if (*d < de) *(*d)++ = alphabet[t]; } if (*d < de) *(*d)++ = alphabet[q]; delta /= 2; if (first) { delta /= 350; first = 0; } /* No overflow check is needed because |delta| was just * divided by 2 and |delta+delta >= delta + delta/h|. */ h++; delta += delta / h; for (bias = 0; delta > 35 * 26 / 2; bias += 36) delta /= 35; bias += 36 * delta / (delta + 38); delta = 0; todo--; } delta++; n++; } return 0; } #undef foreach_codepoint long uv__idna_toascii(const char* s, const char* se, char* d, char* de) { const char* si; const char* st; unsigned c; char* ds; int rc; ds = d; for (si = s; si < se; /* empty */) { st = si; c = uv__utf8_decode1(&si, se); if (c != '.') if (c != 0x3002) /* 。 */ if (c != 0xFF0E) /* . */ if (c != 0xFF61) /* 。 */ continue; rc = uv__idna_toascii_label(s, st, &d, de); if (rc < 0) return rc; if (d < de) *d++ = '.'; s = si; } if (s < se) { rc = uv__idna_toascii_label(s, se, &d, de); if (rc < 0) return rc; } if (d < de) *d++ = '\0'; return d - ds; /* Number of bytes written. */ } ================================================ FILE: external/libuv/src/idna.h ================================================ /* Copyright (c) 2011, 2018 Ben Noordhuis * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef UV_SRC_IDNA_H_ #define UV_SRC_IDNA_H_ /* Decode a single codepoint. Returns the codepoint or UINT32_MAX on error. * |p| is updated on success _and_ error, i.e., bad multi-byte sequences are * skipped in their entirety, not just the first bad byte. */ unsigned uv__utf8_decode1(const char** p, const char* pe); /* Convert a UTF-8 domain name to IDNA 2008 / Punycode. A return value >= 0 * is the number of bytes written to |d|, including the trailing nul byte. * A return value < 0 is a libuv error code. |s| and |d| can not overlap. */ long uv__idna_toascii(const char* s, const char* se, char* d, char* de); #endif /* UV_SRC_IDNA_H_ */ ================================================ FILE: external/libuv/src/inet.c ================================================ /* * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") * Copyright (c) 1996-1999 by Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include #include #if defined(_MSC_VER) && _MSC_VER < 1600 # include "uv/stdint-msvc2008.h" #else # include #endif #include "uv.h" #include "uv-common.h" #define UV__INET_ADDRSTRLEN 16 #define UV__INET6_ADDRSTRLEN 46 static int inet_ntop4(const unsigned char *src, char *dst, size_t size); static int inet_ntop6(const unsigned char *src, char *dst, size_t size); static int inet_pton4(const char *src, unsigned char *dst); static int inet_pton6(const char *src, unsigned char *dst); int uv_inet_ntop(int af, const void* src, char* dst, size_t size) { switch (af) { case AF_INET: return (inet_ntop4((const unsigned char *)src, dst, size)); case AF_INET6: return (inet_ntop6((const unsigned char *)src, dst, size)); default: return UV_EAFNOSUPPORT; } /* NOTREACHED */ } static int inet_ntop4(const unsigned char *src, char *dst, size_t size) { static const char fmt[] = "%u.%u.%u.%u"; char tmp[UV__INET_ADDRSTRLEN]; int l; l = snprintf(tmp, sizeof(tmp), fmt, src[0], src[1], src[2], src[3]); if (l <= 0 || (size_t) l >= size) { return UV_ENOSPC; } uv__strscpy(dst, tmp, size); return 0; } static int inet_ntop6(const unsigned char *src, char *dst, size_t size) { /* * Note that int32_t and int16_t need only be "at least" large enough * to contain a value of the specified size. On some systems, like * Crays, there is no such thing as an integer variable with 16 bits. * Keep this in mind if you think this function should have been coded * to use pointer overlays. All the world's not a VAX. */ char tmp[UV__INET6_ADDRSTRLEN], *tp; struct { int base, len; } best, cur; unsigned int words[sizeof(struct in6_addr) / sizeof(uint16_t)]; int i; /* * Preprocess: * Copy the input (bytewise) array into a wordwise array. * Find the longest run of 0x00's in src[] for :: shorthanding. */ memset(words, '\0', sizeof words); for (i = 0; i < (int) sizeof(struct in6_addr); i++) words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3)); best.base = -1; best.len = 0; cur.base = -1; cur.len = 0; for (i = 0; i < (int) ARRAY_SIZE(words); i++) { if (words[i] == 0) { if (cur.base == -1) cur.base = i, cur.len = 1; else cur.len++; } else { if (cur.base != -1) { if (best.base == -1 || cur.len > best.len) best = cur; cur.base = -1; } } } if (cur.base != -1) { if (best.base == -1 || cur.len > best.len) best = cur; } if (best.base != -1 && best.len < 2) best.base = -1; /* * Format the result. */ tp = tmp; for (i = 0; i < (int) ARRAY_SIZE(words); i++) { /* Are we inside the best run of 0x00's? */ if (best.base != -1 && i >= best.base && i < (best.base + best.len)) { if (i == best.base) *tp++ = ':'; continue; } /* Are we following an initial run of 0x00s or any real hex? */ if (i != 0) *tp++ = ':'; /* Is this address an encapsulated IPv4? */ if (i == 6 && best.base == 0 && (best.len == 6 || (best.len == 7 && words[7] != 0x0001) || (best.len == 5 && words[5] == 0xffff))) { int err = inet_ntop4(src+12, tp, sizeof tmp - (tp - tmp)); if (err) return err; tp += strlen(tp); break; } tp += sprintf(tp, "%x", words[i]); } /* Was it a trailing run of 0x00's? */ if (best.base != -1 && (best.base + best.len) == ARRAY_SIZE(words)) *tp++ = ':'; *tp++ = '\0'; if (UV_E2BIG == uv__strscpy(dst, tmp, size)) return UV_ENOSPC; return 0; } int uv_inet_pton(int af, const char* src, void* dst) { if (src == NULL || dst == NULL) return UV_EINVAL; switch (af) { case AF_INET: return (inet_pton4(src, (unsigned char *)dst)); case AF_INET6: { int len; char tmp[UV__INET6_ADDRSTRLEN], *s, *p; s = (char*) src; p = strchr(src, '%'); if (p != NULL) { s = tmp; len = p - src; if (len > UV__INET6_ADDRSTRLEN-1) return UV_EINVAL; memcpy(s, src, len); s[len] = '\0'; } return inet_pton6(s, (unsigned char *)dst); } default: return UV_EAFNOSUPPORT; } /* NOTREACHED */ } static int inet_pton4(const char *src, unsigned char *dst) { static const char digits[] = "0123456789"; int saw_digit, octets, ch; unsigned char tmp[sizeof(struct in_addr)], *tp; saw_digit = 0; octets = 0; *(tp = tmp) = 0; while ((ch = *src++) != '\0') { const char *pch; if ((pch = strchr(digits, ch)) != NULL) { unsigned int nw = *tp * 10 + (pch - digits); if (saw_digit && *tp == 0) return UV_EINVAL; if (nw > 255) return UV_EINVAL; *tp = nw; if (!saw_digit) { if (++octets > 4) return UV_EINVAL; saw_digit = 1; } } else if (ch == '.' && saw_digit) { if (octets == 4) return UV_EINVAL; *++tp = 0; saw_digit = 0; } else return UV_EINVAL; } if (octets < 4) return UV_EINVAL; memcpy(dst, tmp, sizeof(struct in_addr)); return 0; } static int inet_pton6(const char *src, unsigned char *dst) { static const char xdigits_l[] = "0123456789abcdef", xdigits_u[] = "0123456789ABCDEF"; unsigned char tmp[sizeof(struct in6_addr)], *tp, *endp, *colonp; const char *xdigits, *curtok; int ch, seen_xdigits; unsigned int val; memset((tp = tmp), '\0', sizeof tmp); endp = tp + sizeof tmp; colonp = NULL; /* Leading :: requires some special handling. */ if (*src == ':') if (*++src != ':') return UV_EINVAL; curtok = src; seen_xdigits = 0; val = 0; while ((ch = *src++) != '\0') { const char *pch; if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL) pch = strchr((xdigits = xdigits_u), ch); if (pch != NULL) { val <<= 4; val |= (pch - xdigits); if (++seen_xdigits > 4) return UV_EINVAL; continue; } if (ch == ':') { curtok = src; if (!seen_xdigits) { if (colonp) return UV_EINVAL; colonp = tp; continue; } else if (*src == '\0') { return UV_EINVAL; } if (tp + sizeof(uint16_t) > endp) return UV_EINVAL; *tp++ = (unsigned char) (val >> 8) & 0xff; *tp++ = (unsigned char) val & 0xff; seen_xdigits = 0; val = 0; continue; } if (ch == '.' && ((tp + sizeof(struct in_addr)) <= endp)) { int err = inet_pton4(curtok, tp); if (err == 0) { tp += sizeof(struct in_addr); seen_xdigits = 0; break; /*%< '\\0' was seen by inet_pton4(). */ } } return UV_EINVAL; } if (seen_xdigits) { if (tp + sizeof(uint16_t) > endp) return UV_EINVAL; *tp++ = (unsigned char) (val >> 8) & 0xff; *tp++ = (unsigned char) val & 0xff; } if (colonp != NULL) { /* * Since some memmove()'s erroneously fail to handle * overlapping regions, we'll do the shift by hand. */ const int n = tp - colonp; int i; if (tp == endp) return UV_EINVAL; for (i = 1; i <= n; i++) { endp[- i] = colonp[n - i]; colonp[n - i] = 0; } tp = endp; } if (tp != endp) return UV_EINVAL; memcpy(dst, tmp, sizeof tmp); return 0; } ================================================ FILE: external/libuv/src/queue.h ================================================ /* Copyright (c) 2013, Ben Noordhuis * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef QUEUE_H_ #define QUEUE_H_ #include typedef void *QUEUE[2]; /* Private macros. */ #define QUEUE_NEXT(q) (*(QUEUE **) &((*(q))[0])) #define QUEUE_PREV(q) (*(QUEUE **) &((*(q))[1])) #define QUEUE_PREV_NEXT(q) (QUEUE_NEXT(QUEUE_PREV(q))) #define QUEUE_NEXT_PREV(q) (QUEUE_PREV(QUEUE_NEXT(q))) /* Public macros. */ #define QUEUE_DATA(ptr, type, field) \ ((type *) ((char *) (ptr) - offsetof(type, field))) /* Important note: mutating the list while QUEUE_FOREACH is * iterating over its elements results in undefined behavior. */ #define QUEUE_FOREACH(q, h) \ for ((q) = QUEUE_NEXT(h); (q) != (h); (q) = QUEUE_NEXT(q)) #define QUEUE_EMPTY(q) \ ((const QUEUE *) (q) == (const QUEUE *) QUEUE_NEXT(q)) #define QUEUE_HEAD(q) \ (QUEUE_NEXT(q)) #define QUEUE_INIT(q) \ do { \ QUEUE_NEXT(q) = (q); \ QUEUE_PREV(q) = (q); \ } \ while (0) #define QUEUE_ADD(h, n) \ do { \ QUEUE_PREV_NEXT(h) = QUEUE_NEXT(n); \ QUEUE_NEXT_PREV(n) = QUEUE_PREV(h); \ QUEUE_PREV(h) = QUEUE_PREV(n); \ QUEUE_PREV_NEXT(h) = (h); \ } \ while (0) #define QUEUE_SPLIT(h, q, n) \ do { \ QUEUE_PREV(n) = QUEUE_PREV(h); \ QUEUE_PREV_NEXT(n) = (n); \ QUEUE_NEXT(n) = (q); \ QUEUE_PREV(h) = QUEUE_PREV(q); \ QUEUE_PREV_NEXT(h) = (h); \ QUEUE_PREV(q) = (n); \ } \ while (0) #define QUEUE_MOVE(h, n) \ do { \ if (QUEUE_EMPTY(h)) \ QUEUE_INIT(n); \ else { \ QUEUE* q = QUEUE_HEAD(h); \ QUEUE_SPLIT(h, q, n); \ } \ } \ while (0) #define QUEUE_INSERT_HEAD(h, q) \ do { \ QUEUE_NEXT(q) = QUEUE_NEXT(h); \ QUEUE_PREV(q) = (h); \ QUEUE_NEXT_PREV(q) = (q); \ QUEUE_NEXT(h) = (q); \ } \ while (0) #define QUEUE_INSERT_TAIL(h, q) \ do { \ QUEUE_NEXT(q) = (h); \ QUEUE_PREV(q) = QUEUE_PREV(h); \ QUEUE_PREV_NEXT(q) = (q); \ QUEUE_PREV(h) = (q); \ } \ while (0) #define QUEUE_REMOVE(q) \ do { \ QUEUE_PREV_NEXT(q) = QUEUE_NEXT(q); \ QUEUE_NEXT_PREV(q) = QUEUE_PREV(q); \ } \ while (0) #endif /* QUEUE_H_ */ ================================================ FILE: external/libuv/src/random.c ================================================ /* Copyright libuv contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "uv-common.h" #ifdef _WIN32 # include "win/internal.h" #else # include "unix/internal.h" #endif static int uv__random(void* buf, size_t buflen) { int rc; #if defined(__PASE__) rc = uv__random_readpath("/dev/urandom", buf, buflen); #elif defined(_AIX) rc = uv__random_readpath("/dev/random", buf, buflen); #elif defined(__APPLE__) || defined(__OpenBSD__) || \ (defined(__ANDROID_API__) && __ANDROID_API__ >= 28) rc = uv__random_getentropy(buf, buflen); if (rc == UV_ENOSYS) rc = uv__random_devurandom(buf, buflen); #elif defined(__NetBSD__) rc = uv__random_sysctl(buf, buflen); #elif defined(__FreeBSD__) || defined(__linux__) rc = uv__random_getrandom(buf, buflen); if (rc == UV_ENOSYS) rc = uv__random_devurandom(buf, buflen); # if defined(__linux__) switch (rc) { case UV_EACCES: case UV_EIO: case UV_ELOOP: case UV_EMFILE: case UV_ENFILE: case UV_ENOENT: case UV_EPERM: rc = uv__random_sysctl(buf, buflen); break; } # endif #elif defined(_WIN32) uv__once_init(); rc = uv__random_rtlgenrandom(buf, buflen); #else rc = uv__random_devurandom(buf, buflen); #endif return rc; } static void uv__random_work(struct uv__work* w) { uv_random_t* req; req = container_of(w, uv_random_t, work_req); req->status = uv__random(req->buf, req->buflen); } static void uv__random_done(struct uv__work* w, int status) { uv_random_t* req; req = container_of(w, uv_random_t, work_req); uv__req_unregister(req->loop, req); if (status == 0) status = req->status; req->cb(req, status, req->buf, req->buflen); } int uv_random(uv_loop_t* loop, uv_random_t* req, void *buf, size_t buflen, unsigned flags, uv_random_cb cb) { if (buflen > 0x7FFFFFFFu) return UV_E2BIG; if (flags != 0) return UV_EINVAL; if (cb == NULL) return uv__random(buf, buflen); uv__req_init(loop, req, UV_RANDOM); req->loop = loop; req->status = 0; req->cb = cb; req->buf = buf; req->buflen = buflen; uv__work_submit(loop, &req->work_req, UV__WORK_CPU, uv__random_work, uv__random_done); return 0; } ================================================ FILE: external/libuv/src/strscpy.c ================================================ #include "strscpy.h" #include /* SSIZE_MAX */ ssize_t uv__strscpy(char* d, const char* s, size_t n) { size_t i; for (i = 0; i < n; i++) if ('\0' == (d[i] = s[i])) return i > SSIZE_MAX ? UV_E2BIG : (ssize_t) i; if (i == 0) return 0; d[--i] = '\0'; return UV_E2BIG; } ================================================ FILE: external/libuv/src/strscpy.h ================================================ #ifndef UV_STRSCPY_H_ #define UV_STRSCPY_H_ /* Include uv.h for its definitions of size_t and ssize_t. * size_t can be obtained directly from but ssize_t requires * some hoop jumping on Windows that I didn't want to duplicate here. */ #include "uv.h" /* Copies up to |n-1| bytes from |d| to |s| and always zero-terminates * the result, except when |n==0|. Returns the number of bytes copied * or UV_E2BIG if |d| is too small. * * See https://www.kernel.org/doc/htmldocs/kernel-api/API-strscpy.html */ ssize_t uv__strscpy(char* d, const char* s, size_t n); #endif /* UV_STRSCPY_H_ */ ================================================ FILE: external/libuv/src/threadpool.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv-common.h" #if !defined(_WIN32) # include "unix/internal.h" #endif #include #define MAX_THREADPOOL_SIZE 1024 static uv_once_t once = UV_ONCE_INIT; static uv_cond_t cond; static uv_mutex_t mutex; static unsigned int idle_threads; static unsigned int slow_io_work_running; static unsigned int nthreads; static uv_thread_t* threads; static uv_thread_t default_threads[4]; static QUEUE exit_message; static QUEUE wq; static QUEUE run_slow_work_message; static QUEUE slow_io_pending_wq; static unsigned int slow_work_thread_threshold(void) { return (nthreads + 1) / 2; } static void uv__cancelled(struct uv__work* w) { abort(); } /* To avoid deadlock with uv_cancel() it's crucial that the worker * never holds the global mutex and the loop-local mutex at the same time. */ static void worker(void* arg) { struct uv__work* w; QUEUE* q; int is_slow_work; uv_sem_post((uv_sem_t*) arg); arg = NULL; uv_mutex_lock(&mutex); for (;;) { /* `mutex` should always be locked at this point. */ /* Keep waiting while either no work is present or only slow I/O and we're at the threshold for that. */ while (QUEUE_EMPTY(&wq) || (QUEUE_HEAD(&wq) == &run_slow_work_message && QUEUE_NEXT(&run_slow_work_message) == &wq && slow_io_work_running >= slow_work_thread_threshold())) { idle_threads += 1; uv_cond_wait(&cond, &mutex); idle_threads -= 1; } q = QUEUE_HEAD(&wq); if (q == &exit_message) { uv_cond_signal(&cond); uv_mutex_unlock(&mutex); break; } QUEUE_REMOVE(q); QUEUE_INIT(q); /* Signal uv_cancel() that the work req is executing. */ is_slow_work = 0; if (q == &run_slow_work_message) { /* If we're at the slow I/O threshold, re-schedule until after all other work in the queue is done. */ if (slow_io_work_running >= slow_work_thread_threshold()) { QUEUE_INSERT_TAIL(&wq, q); continue; } /* If we encountered a request to run slow I/O work but there is none to run, that means it's cancelled => Start over. */ if (QUEUE_EMPTY(&slow_io_pending_wq)) continue; is_slow_work = 1; slow_io_work_running++; q = QUEUE_HEAD(&slow_io_pending_wq); QUEUE_REMOVE(q); QUEUE_INIT(q); /* If there is more slow I/O work, schedule it to be run as well. */ if (!QUEUE_EMPTY(&slow_io_pending_wq)) { QUEUE_INSERT_TAIL(&wq, &run_slow_work_message); if (idle_threads > 0) uv_cond_signal(&cond); } } uv_mutex_unlock(&mutex); w = QUEUE_DATA(q, struct uv__work, wq); w->work(w); uv_mutex_lock(&w->loop->wq_mutex); w->work = NULL; /* Signal uv_cancel() that the work req is done executing. */ QUEUE_INSERT_TAIL(&w->loop->wq, &w->wq); uv_async_send(&w->loop->wq_async); uv_mutex_unlock(&w->loop->wq_mutex); /* Lock `mutex` since that is expected at the start of the next * iteration. */ uv_mutex_lock(&mutex); if (is_slow_work) { /* `slow_io_work_running` is protected by `mutex`. */ slow_io_work_running--; } } } static void post(QUEUE* q, enum uv__work_kind kind) { uv_mutex_lock(&mutex); if (kind == UV__WORK_SLOW_IO) { /* Insert into a separate queue. */ QUEUE_INSERT_TAIL(&slow_io_pending_wq, q); if (!QUEUE_EMPTY(&run_slow_work_message)) { /* Running slow I/O tasks is already scheduled => Nothing to do here. The worker that runs said other task will schedule this one as well. */ uv_mutex_unlock(&mutex); return; } q = &run_slow_work_message; } QUEUE_INSERT_TAIL(&wq, q); if (idle_threads > 0) uv_cond_signal(&cond); uv_mutex_unlock(&mutex); } void uv__threadpool_cleanup(void) { #ifndef _WIN32 unsigned int i; if (nthreads == 0) return; post(&exit_message, UV__WORK_CPU); for (i = 0; i < nthreads; i++) if (uv_thread_join(threads + i)) abort(); if (threads != default_threads) uv__free(threads); uv_mutex_destroy(&mutex); uv_cond_destroy(&cond); threads = NULL; nthreads = 0; #endif } static void init_threads(void) { unsigned int i; const char* val; uv_sem_t sem; nthreads = ARRAY_SIZE(default_threads); val = getenv("UV_THREADPOOL_SIZE"); if (val != NULL) nthreads = atoi(val); if (nthreads == 0) nthreads = 1; if (nthreads > MAX_THREADPOOL_SIZE) nthreads = MAX_THREADPOOL_SIZE; threads = default_threads; if (nthreads > ARRAY_SIZE(default_threads)) { threads = (uv_thread_t *)uv__malloc(nthreads * sizeof(threads[0])); if (threads == NULL) { nthreads = ARRAY_SIZE(default_threads); threads = default_threads; } } if (uv_cond_init(&cond)) abort(); if (uv_mutex_init(&mutex)) abort(); QUEUE_INIT(&wq); QUEUE_INIT(&slow_io_pending_wq); QUEUE_INIT(&run_slow_work_message); if (uv_sem_init(&sem, 0)) abort(); for (i = 0; i < nthreads; i++) if (uv_thread_create(threads + i, worker, &sem)) abort(); for (i = 0; i < nthreads; i++) uv_sem_wait(&sem); uv_sem_destroy(&sem); } #ifndef _WIN32 static void reset_once(void) { uv_once_t child_once = UV_ONCE_INIT; memcpy(&once, &child_once, sizeof(child_once)); } #endif static void init_once(void) { #ifndef _WIN32 /* Re-initialize the threadpool after fork. * Note that this discards the global mutex and condition as well * as the work queue. */ if (pthread_atfork(NULL, NULL, &reset_once)) abort(); #endif init_threads(); } void uv__work_submit(uv_loop_t* loop, struct uv__work* w, enum uv__work_kind kind, void (*work)(struct uv__work* w), void (*done)(struct uv__work* w, int status)) { uv_once(&once, init_once); w->loop = loop; w->work = work; w->done = done; post(&w->wq, kind); } static int uv__work_cancel(uv_loop_t* loop, uv_req_t* req, struct uv__work* w) { int cancelled; uv_mutex_lock(&mutex); uv_mutex_lock(&w->loop->wq_mutex); cancelled = !QUEUE_EMPTY(&w->wq) && w->work != NULL; if (cancelled) QUEUE_REMOVE(&w->wq); uv_mutex_unlock(&w->loop->wq_mutex); uv_mutex_unlock(&mutex); if (!cancelled) return UV_EBUSY; w->work = uv__cancelled; uv_mutex_lock(&loop->wq_mutex); QUEUE_INSERT_TAIL(&loop->wq, &w->wq); uv_async_send(&loop->wq_async); uv_mutex_unlock(&loop->wq_mutex); return 0; } void uv__work_done(uv_async_t* handle) { struct uv__work* w; uv_loop_t* loop; QUEUE* q; QUEUE wq; int err; loop = container_of(handle, uv_loop_t, wq_async); uv_mutex_lock(&loop->wq_mutex); QUEUE_MOVE(&loop->wq, &wq); uv_mutex_unlock(&loop->wq_mutex); while (!QUEUE_EMPTY(&wq)) { q = QUEUE_HEAD(&wq); QUEUE_REMOVE(q); w = container_of(q, struct uv__work, wq); err = (w->work == uv__cancelled) ? UV_ECANCELED : 0; w->done(w, err); } } static void uv__queue_work(struct uv__work* w) { uv_work_t* req = container_of(w, uv_work_t, work_req); req->work_cb(req); } static void uv__queue_done(struct uv__work* w, int err) { uv_work_t* req; req = container_of(w, uv_work_t, work_req); uv__req_unregister(req->loop, req); if (req->after_work_cb == NULL) return; req->after_work_cb(req, err); } int uv_queue_work(uv_loop_t* loop, uv_work_t* req, uv_work_cb work_cb, uv_after_work_cb after_work_cb) { if (work_cb == NULL) return UV_EINVAL; uv__req_init(loop, req, UV_WORK); req->loop = loop; req->work_cb = work_cb; req->after_work_cb = after_work_cb; uv__work_submit(loop, &req->work_req, UV__WORK_CPU, uv__queue_work, uv__queue_done); return 0; } int uv_cancel(uv_req_t* req) { struct uv__work* wreq; uv_loop_t* loop; switch (req->type) { case UV_FS: loop = ((uv_fs_t*) req)->loop; wreq = &((uv_fs_t*) req)->work_req; break; case UV_GETADDRINFO: loop = ((uv_getaddrinfo_t*) req)->loop; wreq = &((uv_getaddrinfo_t*) req)->work_req; break; case UV_GETNAMEINFO: loop = ((uv_getnameinfo_t*) req)->loop; wreq = &((uv_getnameinfo_t*) req)->work_req; break; case UV_RANDOM: loop = ((uv_random_t*) req)->loop; wreq = &((uv_random_t*) req)->work_req; break; case UV_WORK: loop = ((uv_work_t*) req)->loop; wreq = &((uv_work_t*) req)->work_req; break; default: return UV_EINVAL; } return uv__work_cancel(loop, req, wreq); } ================================================ FILE: external/libuv/src/timer.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "uv-common.h" #include "heap-inl.h" #include #include static struct heap *timer_heap(const uv_loop_t* loop) { #ifdef _WIN32 return (struct heap*) loop->timer_heap; #else return (struct heap*) &loop->timer_heap; #endif } static int timer_less_than(const struct heap_node* ha, const struct heap_node* hb) { const uv_timer_t* a; const uv_timer_t* b; a = container_of(ha, uv_timer_t, heap_node); b = container_of(hb, uv_timer_t, heap_node); if (a->timeout < b->timeout) return 1; if (b->timeout < a->timeout) return 0; /* Compare start_id when both have the same timeout. start_id is * allocated with loop->timer_counter in uv_timer_start(). */ return a->start_id < b->start_id; } int uv_timer_init(uv_loop_t* loop, uv_timer_t* handle) { uv__handle_init(loop, (uv_handle_t*)handle, UV_TIMER); handle->timer_cb = NULL; handle->repeat = 0; return 0; } int uv_timer_start(uv_timer_t* handle, uv_timer_cb cb, uint64_t timeout, uint64_t repeat) { uint64_t clamped_timeout; if (uv__is_closing(handle) || cb == NULL) return UV_EINVAL; if (uv__is_active(handle)) uv_timer_stop(handle); clamped_timeout = handle->loop->time + timeout; if (clamped_timeout < timeout) clamped_timeout = (uint64_t) -1; handle->timer_cb = cb; handle->timeout = clamped_timeout; handle->repeat = repeat; /* start_id is the second index to be compared in timer_less_than() */ handle->start_id = handle->loop->timer_counter++; heap_insert(timer_heap(handle->loop), (struct heap_node*) &handle->heap_node, timer_less_than); uv__handle_start(handle); return 0; } int uv_timer_stop(uv_timer_t* handle) { if (!uv__is_active(handle)) return 0; heap_remove(timer_heap(handle->loop), (struct heap_node*) &handle->heap_node, timer_less_than); uv__handle_stop(handle); return 0; } int uv_timer_again(uv_timer_t* handle) { if (handle->timer_cb == NULL) return UV_EINVAL; if (handle->repeat) { uv_timer_stop(handle); uv_timer_start(handle, handle->timer_cb, handle->repeat, handle->repeat); } return 0; } void uv_timer_set_repeat(uv_timer_t* handle, uint64_t repeat) { handle->repeat = repeat; } uint64_t uv_timer_get_repeat(const uv_timer_t* handle) { return handle->repeat; } int uv__next_timeout(const uv_loop_t* loop) { const struct heap_node* heap_node; const uv_timer_t* handle; uint64_t diff; heap_node = heap_min(timer_heap(loop)); if (heap_node == NULL) return -1; /* block indefinitely */ handle = container_of(heap_node, uv_timer_t, heap_node); if (handle->timeout <= loop->time) return 0; diff = handle->timeout - loop->time; if (diff > INT_MAX) diff = INT_MAX; return (int) diff; } void uv__run_timers(uv_loop_t* loop) { struct heap_node* heap_node; uv_timer_t* handle; for (;;) { heap_node = heap_min(timer_heap(loop)); if (heap_node == NULL) break; handle = container_of(heap_node, uv_timer_t, heap_node); if (handle->timeout > loop->time) break; uv_timer_stop(handle); uv_timer_again(handle); handle->timer_cb(handle); } } void uv__timer_close(uv_timer_t* handle) { uv_timer_stop(handle); } ================================================ FILE: external/libuv/src/unix/aix-common.c ================================================ /* Copyright libuv project contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include uint64_t uv__hrtime(uv_clocktype_t type) { uint64_t G = 1000000000; timebasestruct_t t; read_wall_time(&t, TIMEBASE_SZ); time_base_to_time(&t, TIMEBASE_SZ); return (uint64_t) t.tb_high * G + t.tb_low; } /* * We could use a static buffer for the path manipulations that we need outside * of the function, but this function could be called by multiple consumers and * we don't want to potentially create a race condition in the use of snprintf. * There is no direct way of getting the exe path in AIX - either through /procfs * or through some libc APIs. The below approach is to parse the argv[0]'s pattern * and use it in conjunction with PATH environment variable to craft one. */ int uv_exepath(char* buffer, size_t* size) { int res; char args[PATH_MAX]; char abspath[PATH_MAX]; size_t abspath_size; struct procsinfo pi; if (buffer == NULL || size == NULL || *size == 0) return UV_EINVAL; pi.pi_pid = getpid(); res = getargs(&pi, sizeof(pi), args, sizeof(args)); if (res < 0) return UV_EINVAL; /* * Possibilities for args: * i) an absolute path such as: /home/user/myprojects/nodejs/node * ii) a relative path such as: ./node or ../myprojects/nodejs/node * iii) a bare filename such as "node", after exporting PATH variable * to its location. */ /* Case i) and ii) absolute or relative paths */ if (strchr(args, '/') != NULL) { if (realpath(args, abspath) != abspath) return UV__ERR(errno); abspath_size = strlen(abspath); *size -= 1; if (*size > abspath_size) *size = abspath_size; memcpy(buffer, abspath, *size); buffer[*size] = '\0'; return 0; } else { /* Case iii). Search PATH environment variable */ char trypath[PATH_MAX]; char *clonedpath = NULL; char *token = NULL; char *path = getenv("PATH"); if (path == NULL) return UV_EINVAL; clonedpath = uv__strdup(path); if (clonedpath == NULL) return UV_ENOMEM; token = strtok(clonedpath, ":"); while (token != NULL) { snprintf(trypath, sizeof(trypath) - 1, "%s/%s", token, args); if (realpath(trypath, abspath) == abspath) { /* Check the match is executable */ if (access(abspath, X_OK) == 0) { abspath_size = strlen(abspath); *size -= 1; if (*size > abspath_size) *size = abspath_size; memcpy(buffer, abspath, *size); buffer[*size] = '\0'; uv__free(clonedpath); return 0; } } token = strtok(NULL, ":"); } uv__free(clonedpath); /* Out of tokens (path entries), and no match found */ return UV_EINVAL; } } ================================================ FILE: external/libuv/src/unix/aix.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_SYS_AHAFS_EVPRODS_H #include #endif #include #include #include #include #include #define RDWR_BUF_SIZE 4096 #define EQ(a,b) (strcmp(a,b) == 0) static uv_mutex_t process_title_mutex; static uv_once_t process_title_mutex_once = UV_ONCE_INIT; static void* args_mem = NULL; static char** process_argv = NULL; static int process_argc = 0; static char* process_title_ptr = NULL; static void init_process_title_mutex_once(void) { uv_mutex_init(&process_title_mutex); } int uv__platform_loop_init(uv_loop_t* loop) { loop->fs_fd = -1; /* Passing maxfd of -1 should mean the limit is determined * by the user's ulimit or the global limit as per the doc */ loop->backend_fd = pollset_create(-1); if (loop->backend_fd == -1) return -1; return 0; } void uv__platform_loop_delete(uv_loop_t* loop) { if (loop->fs_fd != -1) { uv__close(loop->fs_fd); loop->fs_fd = -1; } if (loop->backend_fd != -1) { pollset_destroy(loop->backend_fd); loop->backend_fd = -1; } } int uv__io_fork(uv_loop_t* loop) { uv__platform_loop_delete(loop); return uv__platform_loop_init(loop); } int uv__io_check_fd(uv_loop_t* loop, int fd) { struct poll_ctl pc; pc.events = POLLIN; pc.cmd = PS_MOD; /* Equivalent to PS_ADD if the fd is not in the pollset. */ pc.fd = fd; if (pollset_ctl(loop->backend_fd, &pc, 1)) return UV__ERR(errno); pc.cmd = PS_DELETE; if (pollset_ctl(loop->backend_fd, &pc, 1)) abort(); return 0; } void uv__io_poll(uv_loop_t* loop, int timeout) { struct pollfd events[1024]; struct pollfd pqry; struct pollfd* pe; struct poll_ctl pc; QUEUE* q; uv__io_t* w; uint64_t base; uint64_t diff; int have_signals; int nevents; int count; int nfds; int i; int rc; int add_failed; if (loop->nfds == 0) { assert(QUEUE_EMPTY(&loop->watcher_queue)); return; } while (!QUEUE_EMPTY(&loop->watcher_queue)) { q = QUEUE_HEAD(&loop->watcher_queue); QUEUE_REMOVE(q); QUEUE_INIT(q); w = QUEUE_DATA(q, uv__io_t, watcher_queue); assert(w->pevents != 0); assert(w->fd >= 0); assert(w->fd < (int) loop->nwatchers); pc.events = w->pevents; pc.fd = w->fd; add_failed = 0; if (w->events == 0) { pc.cmd = PS_ADD; if (pollset_ctl(loop->backend_fd, &pc, 1)) { if (errno != EINVAL) { assert(0 && "Failed to add file descriptor (pc.fd) to pollset"); abort(); } /* Check if the fd is already in the pollset */ pqry.fd = pc.fd; rc = pollset_query(loop->backend_fd, &pqry); switch (rc) { case -1: assert(0 && "Failed to query pollset for file descriptor"); abort(); case 0: assert(0 && "Pollset does not contain file descriptor"); abort(); } /* If we got here then the pollset already contained the file descriptor even though * we didn't think it should. This probably shouldn't happen, but we can continue. */ add_failed = 1; } } if (w->events != 0 || add_failed) { /* Modify, potentially removing events -- need to delete then add. * Could maybe mod if we knew for sure no events are removed, but * content of w->events is handled above as not reliable (falls back) * so may require a pollset_query() which would have to be pretty cheap * compared to a PS_DELETE to be worth optimizing. Alternatively, could * lazily remove events, squelching them in the mean time. */ pc.cmd = PS_DELETE; if (pollset_ctl(loop->backend_fd, &pc, 1)) { assert(0 && "Failed to delete file descriptor (pc.fd) from pollset"); abort(); } pc.cmd = PS_ADD; if (pollset_ctl(loop->backend_fd, &pc, 1)) { assert(0 && "Failed to add file descriptor (pc.fd) to pollset"); abort(); } } w->events = w->pevents; } assert(timeout >= -1); base = loop->time; count = 48; /* Benchmarks suggest this gives the best throughput. */ for (;;) { nfds = pollset_poll(loop->backend_fd, events, ARRAY_SIZE(events), timeout); /* Update loop->time unconditionally. It's tempting to skip the update when * timeout == 0 (i.e. non-blocking poll) but there is no guarantee that the * operating system didn't reschedule our process while in the syscall. */ SAVE_ERRNO(uv__update_time(loop)); if (nfds == 0) { assert(timeout != -1); return; } if (nfds == -1) { if (errno != EINTR) { abort(); } if (timeout == -1) continue; if (timeout == 0) return; /* Interrupted by a signal. Update timeout and poll again. */ goto update_timeout; } have_signals = 0; nevents = 0; assert(loop->watchers != NULL); loop->watchers[loop->nwatchers] = (void*) events; loop->watchers[loop->nwatchers + 1] = (void*) (uintptr_t) nfds; for (i = 0; i < nfds; i++) { pe = events + i; pc.cmd = PS_DELETE; pc.fd = pe->fd; /* Skip invalidated events, see uv__platform_invalidate_fd */ if (pc.fd == -1) continue; assert(pc.fd >= 0); assert((unsigned) pc.fd < loop->nwatchers); w = loop->watchers[pc.fd]; if (w == NULL) { /* File descriptor that we've stopped watching, disarm it. * * Ignore all errors because we may be racing with another thread * when the file descriptor is closed. */ pollset_ctl(loop->backend_fd, &pc, 1); continue; } /* Run signal watchers last. This also affects child process watchers * because those are implemented in terms of signal watchers. */ if (w == &loop->signal_io_watcher) have_signals = 1; else w->cb(loop, w, pe->revents); nevents++; } if (have_signals != 0) loop->signal_io_watcher.cb(loop, &loop->signal_io_watcher, POLLIN); loop->watchers[loop->nwatchers] = NULL; loop->watchers[loop->nwatchers + 1] = NULL; if (have_signals != 0) return; /* Event loop should cycle now so don't poll again. */ if (nevents != 0) { if (nfds == ARRAY_SIZE(events) && --count != 0) { /* Poll for more events but don't block this time. */ timeout = 0; continue; } return; } if (timeout == 0) return; if (timeout == -1) continue; update_timeout: assert(timeout > 0); diff = loop->time - base; if (diff >= (uint64_t) timeout) return; timeout -= diff; } } uint64_t uv_get_free_memory(void) { perfstat_memory_total_t mem_total; int result = perfstat_memory_total(NULL, &mem_total, sizeof(mem_total), 1); if (result == -1) { return 0; } return mem_total.real_free * 4096; } uint64_t uv_get_total_memory(void) { perfstat_memory_total_t mem_total; int result = perfstat_memory_total(NULL, &mem_total, sizeof(mem_total), 1); if (result == -1) { return 0; } return mem_total.real_total * 4096; } uint64_t uv_get_constrained_memory(void) { return 0; /* Memory constraints are unknown. */ } void uv_loadavg(double avg[3]) { perfstat_cpu_total_t ps_total; int result = perfstat_cpu_total(NULL, &ps_total, sizeof(ps_total), 1); if (result == -1) { avg[0] = 0.; avg[1] = 0.; avg[2] = 0.; return; } avg[0] = ps_total.loadavg[0] / (double)(1 << SBITS); avg[1] = ps_total.loadavg[1] / (double)(1 << SBITS); avg[2] = ps_total.loadavg[2] / (double)(1 << SBITS); } #ifdef HAVE_SYS_AHAFS_EVPRODS_H static char* uv__rawname(const char* cp, char (*dst)[FILENAME_MAX+1]) { char* dp; dp = rindex(cp, '/'); if (dp == 0) return 0; snprintf(*dst, sizeof(*dst), "%.*s/r%s", (int) (dp - cp), cp, dp + 1); return *dst; } /* * Determine whether given pathname is a directory * Returns 0 if the path is a directory, -1 if not * * Note: Opportunity here for more detailed error information but * that requires changing callers of this function as well */ static int uv__path_is_a_directory(char* filename) { struct stat statbuf; if (stat(filename, &statbuf) < 0) return -1; /* failed: not a directory, assume it is a file */ if (statbuf.st_type == VDIR) return 0; return -1; } /* * Check whether AHAFS is mounted. * Returns 0 if AHAFS is mounted, or an error code < 0 on failure */ static int uv__is_ahafs_mounted(void){ char rawbuf[FILENAME_MAX+1]; int rv, i = 2; struct vmount *p; int size_multiplier = 10; size_t siz = sizeof(struct vmount)*size_multiplier; struct vmount *vmt; const char *dev = "/aha"; char *obj, *stub; p = uv__malloc(siz); if (p == NULL) return UV__ERR(errno); /* Retrieve all mounted filesystems */ rv = mntctl(MCTL_QUERY, siz, (char*)p); if (rv < 0) return UV__ERR(errno); if (rv == 0) { /* buffer was not large enough, reallocate to correct size */ siz = *(int*)p; uv__free(p); p = uv__malloc(siz); if (p == NULL) return UV__ERR(errno); rv = mntctl(MCTL_QUERY, siz, (char*)p); if (rv < 0) return UV__ERR(errno); } /* Look for dev in filesystems mount info */ for(vmt = p, i = 0; i < rv; i++) { obj = vmt2dataptr(vmt, VMT_OBJECT); /* device */ stub = vmt2dataptr(vmt, VMT_STUB); /* mount point */ if (EQ(obj, dev) || EQ(uv__rawname(obj, &rawbuf), dev) || EQ(stub, dev)) { uv__free(p); /* Found a match */ return 0; } vmt = (struct vmount *) ((char *) vmt + vmt->vmt_length); } /* /aha is required for monitoring filesystem changes */ return -1; } /* * Recursive call to mkdir() to create intermediate folders, if any * Returns code from mkdir call */ static int uv__makedir_p(const char *dir) { char tmp[256]; char *p = NULL; size_t len; int err; /* TODO(bnoordhuis) Check uv__strscpy() return value. */ uv__strscpy(tmp, dir, sizeof(tmp)); len = strlen(tmp); if (tmp[len - 1] == '/') tmp[len - 1] = 0; for (p = tmp + 1; *p; p++) { if (*p == '/') { *p = 0; err = mkdir(tmp, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); if (err != 0 && errno != EEXIST) return err; *p = '/'; } } return mkdir(tmp, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); } /* * Creates necessary subdirectories in the AIX Event Infrastructure * file system for monitoring the object specified. * Returns code from mkdir call */ static int uv__make_subdirs_p(const char *filename) { char cmd[2048]; char *p; int rc = 0; /* Strip off the monitor file name */ p = strrchr(filename, '/'); if (p == NULL) return 0; if (uv__path_is_a_directory((char*)filename) == 0) { sprintf(cmd, "/aha/fs/modDir.monFactory"); } else { sprintf(cmd, "/aha/fs/modFile.monFactory"); } strncat(cmd, filename, (p - filename)); rc = uv__makedir_p(cmd); if (rc == -1 && errno != EEXIST){ return UV__ERR(errno); } return rc; } /* * Checks if /aha is mounted, then proceeds to set up the monitoring * objects for the specified file. * Returns 0 on success, or an error code < 0 on failure */ static int uv__setup_ahafs(const char* filename, int *fd) { int rc = 0; char mon_file_write_string[RDWR_BUF_SIZE]; char mon_file[PATH_MAX]; int file_is_directory = 0; /* -1 == NO, 0 == YES */ /* Create monitor file name for object */ file_is_directory = uv__path_is_a_directory((char*)filename); if (file_is_directory == 0) sprintf(mon_file, "/aha/fs/modDir.monFactory"); else sprintf(mon_file, "/aha/fs/modFile.monFactory"); if ((strlen(mon_file) + strlen(filename) + 5) > PATH_MAX) return UV_ENAMETOOLONG; /* Make the necessary subdirectories for the monitor file */ rc = uv__make_subdirs_p(filename); if (rc == -1 && errno != EEXIST) return rc; strcat(mon_file, filename); strcat(mon_file, ".mon"); *fd = 0; errno = 0; /* Open the monitor file, creating it if necessary */ *fd = open(mon_file, O_CREAT|O_RDWR); if (*fd < 0) return UV__ERR(errno); /* Write out the monitoring specifications. * In this case, we are monitoring for a state change event type * CHANGED=YES * We will be waiting in select call, rather than a read: * WAIT_TYPE=WAIT_IN_SELECT * We only want minimal information for files: * INFO_LVL=1 * For directories, we want more information to track what file * caused the change * INFO_LVL=2 */ if (file_is_directory == 0) sprintf(mon_file_write_string, "CHANGED=YES;WAIT_TYPE=WAIT_IN_SELECT;INFO_LVL=2"); else sprintf(mon_file_write_string, "CHANGED=YES;WAIT_TYPE=WAIT_IN_SELECT;INFO_LVL=1"); rc = write(*fd, mon_file_write_string, strlen(mon_file_write_string)+1); if (rc < 0 && errno != EBUSY) return UV__ERR(errno); return 0; } /* * Skips a specified number of lines in the buffer passed in. * Walks the buffer pointed to by p and attempts to skip n lines. * Returns the total number of lines skipped */ static int uv__skip_lines(char **p, int n) { int lines = 0; while(n > 0) { *p = strchr(*p, '\n'); if (!p) return lines; (*p)++; n--; lines++; } return lines; } /* * Parse the event occurrence data to figure out what event just occurred * and take proper action. * * The buf is a pointer to the buffer containing the event occurrence data * Returns 0 on success, -1 if unrecoverable error in parsing * */ static int uv__parse_data(char *buf, int *events, uv_fs_event_t* handle) { int evp_rc, i; char *p; char filename[PATH_MAX]; /* To be used when handling directories */ p = buf; *events = 0; /* Clean the filename buffer*/ for(i = 0; i < PATH_MAX; i++) { filename[i] = 0; } i = 0; /* Check for BUF_WRAP */ if (strncmp(buf, "BUF_WRAP", strlen("BUF_WRAP")) == 0) { assert(0 && "Buffer wrap detected, Some event occurrences lost!"); return 0; } /* Since we are using the default buffer size (4K), and have specified * INFO_LVL=1, we won't see any EVENT_OVERFLOW conditions. Applications * should check for this keyword if they are using an INFO_LVL of 2 or * higher, and have a buffer size of <= 4K */ /* Skip to RC_FROM_EVPROD */ if (uv__skip_lines(&p, 9) != 9) return -1; if (sscanf(p, "RC_FROM_EVPROD=%d\nEND_EVENT_DATA", &evp_rc) == 1) { if (uv__path_is_a_directory(handle->path) == 0) { /* Directory */ if (evp_rc == AHAFS_MODDIR_UNMOUNT || evp_rc == AHAFS_MODDIR_REMOVE_SELF) { /* The directory is no longer available for monitoring */ *events = UV_RENAME; handle->dir_filename = NULL; } else { /* A file was added/removed inside the directory */ *events = UV_CHANGE; /* Get the EVPROD_INFO */ if (uv__skip_lines(&p, 1) != 1) return -1; /* Scan out the name of the file that triggered the event*/ if (sscanf(p, "BEGIN_EVPROD_INFO\n%sEND_EVPROD_INFO", filename) == 1) { handle->dir_filename = uv__strdup((const char*)&filename); } else return -1; } } else { /* Regular File */ if (evp_rc == AHAFS_MODFILE_RENAME) *events = UV_RENAME; else *events = UV_CHANGE; } } else return -1; return 0; } /* This is the internal callback */ static void uv__ahafs_event(uv_loop_t* loop, uv__io_t* event_watch, unsigned int fflags) { char result_data[RDWR_BUF_SIZE]; int bytes, rc = 0; uv_fs_event_t* handle; int events = 0; char fname[PATH_MAX]; char *p; handle = container_of(event_watch, uv_fs_event_t, event_watcher); /* At this point, we assume that polling has been done on the * file descriptor, so we can just read the AHAFS event occurrence * data and parse its results without having to block anything */ bytes = pread(event_watch->fd, result_data, RDWR_BUF_SIZE, 0); assert((bytes >= 0) && "uv__ahafs_event - Error reading monitor file"); /* In file / directory move cases, AIX Event infrastructure * produces a second event with no data. * Ignore it and return gracefully. */ if(bytes == 0) return; /* Parse the data */ if(bytes > 0) rc = uv__parse_data(result_data, &events, handle); /* Unrecoverable error */ if (rc == -1) return; /* For directory changes, the name of the files that triggered the change * are never absolute pathnames */ if (uv__path_is_a_directory(handle->path) == 0) { p = handle->dir_filename; } else { p = strrchr(handle->path, '/'); if (p == NULL) p = handle->path; else p++; } /* TODO(bnoordhuis) Check uv__strscpy() return value. */ uv__strscpy(fname, p, sizeof(fname)); handle->cb(handle, fname, events, 0); } #endif int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) { #ifdef HAVE_SYS_AHAFS_EVPRODS_H uv__handle_init(loop, (uv_handle_t*)handle, UV_FS_EVENT); return 0; #else return UV_ENOSYS; #endif } int uv_fs_event_start(uv_fs_event_t* handle, uv_fs_event_cb cb, const char* filename, unsigned int flags) { #ifdef HAVE_SYS_AHAFS_EVPRODS_H int fd, rc, str_offset = 0; char cwd[PATH_MAX]; char absolute_path[PATH_MAX]; char readlink_cwd[PATH_MAX]; struct timeval zt; fd_set pollfd; /* Figure out whether filename is absolute or not */ if (filename[0] == '\0') { /* Missing a pathname */ return UV_ENOENT; } else if (filename[0] == '/') { /* We have absolute pathname */ /* TODO(bnoordhuis) Check uv__strscpy() return value. */ uv__strscpy(absolute_path, filename, sizeof(absolute_path)); } else { /* We have a relative pathname, compose the absolute pathname */ snprintf(cwd, sizeof(cwd), "/proc/%lu/cwd", (unsigned long) getpid()); rc = readlink(cwd, readlink_cwd, sizeof(readlink_cwd) - 1); if (rc < 0) return rc; /* readlink does not null terminate our string */ readlink_cwd[rc] = '\0'; if (filename[0] == '.' && filename[1] == '/') str_offset = 2; snprintf(absolute_path, sizeof(absolute_path), "%s%s", readlink_cwd, filename + str_offset); } if (uv__is_ahafs_mounted() < 0) /* /aha checks failed */ return UV_ENOSYS; /* Setup ahafs */ rc = uv__setup_ahafs((const char *)absolute_path, &fd); if (rc != 0) return rc; /* Setup/Initialize all the libuv routines */ uv__handle_start(handle); uv__io_init(&handle->event_watcher, uv__ahafs_event, fd); handle->path = uv__strdup(filename); handle->cb = cb; handle->dir_filename = NULL; uv__io_start(handle->loop, &handle->event_watcher, POLLIN); /* AHAFS wants someone to poll for it to start mointoring. * so kick-start it so that we don't miss an event in the * eventuality of an event that occurs in the current loop. */ do { memset(&zt, 0, sizeof(zt)); FD_ZERO(&pollfd); FD_SET(fd, &pollfd); rc = select(fd + 1, &pollfd, NULL, NULL, &zt); } while (rc == -1 && errno == EINTR); return 0; #else return UV_ENOSYS; #endif } int uv_fs_event_stop(uv_fs_event_t* handle) { #ifdef HAVE_SYS_AHAFS_EVPRODS_H if (!uv__is_active(handle)) return 0; uv__io_close(handle->loop, &handle->event_watcher); uv__handle_stop(handle); if (uv__path_is_a_directory(handle->path) == 0) { uv__free(handle->dir_filename); handle->dir_filename = NULL; } uv__free(handle->path); handle->path = NULL; uv__close(handle->event_watcher.fd); handle->event_watcher.fd = -1; return 0; #else return UV_ENOSYS; #endif } void uv__fs_event_close(uv_fs_event_t* handle) { #ifdef HAVE_SYS_AHAFS_EVPRODS_H uv_fs_event_stop(handle); #else UNREACHABLE(); #endif } char** uv_setup_args(int argc, char** argv) { char** new_argv; size_t size; char* s; int i; if (argc <= 0) return argv; /* Save the original pointer to argv. * AIX uses argv to read the process name. * (Not the memory pointed to by argv[0..n] as on Linux.) */ process_argv = argv; process_argc = argc; /* Calculate how much memory we need for the argv strings. */ size = 0; for (i = 0; i < argc; i++) size += strlen(argv[i]) + 1; /* Add space for the argv pointers. */ size += (argc + 1) * sizeof(char*); new_argv = uv__malloc(size); if (new_argv == NULL) return argv; args_mem = new_argv; /* Copy over the strings and set up the pointer table. */ s = (char*) &new_argv[argc + 1]; for (i = 0; i < argc; i++) { size = strlen(argv[i]) + 1; memcpy(s, argv[i], size); new_argv[i] = s; s += size; } new_argv[i] = NULL; return new_argv; } int uv_set_process_title(const char* title) { char* new_title; /* We cannot free this pointer when libuv shuts down, * the process may still be using it. */ new_title = uv__strdup(title); if (new_title == NULL) return UV_ENOMEM; uv_once(&process_title_mutex_once, init_process_title_mutex_once); uv_mutex_lock(&process_title_mutex); /* If this is the first time this is set, * don't free and set argv[1] to NULL. */ if (process_title_ptr != NULL) uv__free(process_title_ptr); process_title_ptr = new_title; process_argv[0] = process_title_ptr; if (process_argc > 1) process_argv[1] = NULL; uv_mutex_unlock(&process_title_mutex); return 0; } int uv_get_process_title(char* buffer, size_t size) { size_t len; if (buffer == NULL || size == 0) return UV_EINVAL; uv_once(&process_title_mutex_once, init_process_title_mutex_once); uv_mutex_lock(&process_title_mutex); len = strlen(process_argv[0]); if (size <= len) { uv_mutex_unlock(&process_title_mutex); return UV_ENOBUFS; } memcpy(buffer, process_argv[0], len); buffer[len] = '\0'; uv_mutex_unlock(&process_title_mutex); return 0; } void uv__process_title_cleanup(void) { uv__free(args_mem); /* Keep valgrind happy. */ args_mem = NULL; } int uv_resident_set_memory(size_t* rss) { char pp[64]; psinfo_t psinfo; int err; int fd; snprintf(pp, sizeof(pp), "/proc/%lu/psinfo", (unsigned long) getpid()); fd = open(pp, O_RDONLY); if (fd == -1) return UV__ERR(errno); /* FIXME(bnoordhuis) Handle EINTR. */ err = UV_EINVAL; if (read(fd, &psinfo, sizeof(psinfo)) == sizeof(psinfo)) { *rss = (size_t)psinfo.pr_rssize * 1024; err = 0; } uv__close(fd); return err; } int uv_uptime(double* uptime) { struct utmp *utmp_buf; size_t entries = 0; time_t boot_time; boot_time = 0; utmpname(UTMP_FILE); setutent(); while ((utmp_buf = getutent()) != NULL) { if (utmp_buf->ut_user[0] && utmp_buf->ut_type == USER_PROCESS) ++entries; if (utmp_buf->ut_type == BOOT_TIME) boot_time = utmp_buf->ut_time; } endutent(); if (boot_time == 0) return UV_ENOSYS; *uptime = time(NULL) - boot_time; return 0; } int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { uv_cpu_info_t* cpu_info; perfstat_cpu_total_t ps_total; perfstat_cpu_t* ps_cpus; perfstat_id_t cpu_id; int result, ncpus, idx = 0; result = perfstat_cpu_total(NULL, &ps_total, sizeof(ps_total), 1); if (result == -1) { return UV_ENOSYS; } ncpus = result = perfstat_cpu(NULL, NULL, sizeof(perfstat_cpu_t), 0); if (result == -1) { return UV_ENOSYS; } ps_cpus = (perfstat_cpu_t*) uv__malloc(ncpus * sizeof(perfstat_cpu_t)); if (!ps_cpus) { return UV_ENOMEM; } /* TODO(bnoordhuis) Check uv__strscpy() return value. */ uv__strscpy(cpu_id.name, FIRST_CPU, sizeof(cpu_id.name)); result = perfstat_cpu(&cpu_id, ps_cpus, sizeof(perfstat_cpu_t), ncpus); if (result == -1) { uv__free(ps_cpus); return UV_ENOSYS; } *cpu_infos = (uv_cpu_info_t*) uv__malloc(ncpus * sizeof(uv_cpu_info_t)); if (!*cpu_infos) { uv__free(ps_cpus); return UV_ENOMEM; } *count = ncpus; cpu_info = *cpu_infos; while (idx < ncpus) { cpu_info->speed = (int)(ps_total.processorHZ / 1000000); cpu_info->model = uv__strdup(ps_total.description); cpu_info->cpu_times.user = ps_cpus[idx].user; cpu_info->cpu_times.sys = ps_cpus[idx].sys; cpu_info->cpu_times.idle = ps_cpus[idx].idle; cpu_info->cpu_times.irq = ps_cpus[idx].wait; cpu_info->cpu_times.nice = 0; cpu_info++; idx++; } uv__free(ps_cpus); return 0; } int uv_interface_addresses(uv_interface_address_t** addresses, int* count) { uv_interface_address_t* address; int sockfd, sock6fd, inet6, i, r, size = 1; struct ifconf ifc; struct ifreq *ifr, *p, flg; struct in6_ifreq if6; struct sockaddr_dl* sa_addr; ifc.ifc_req = NULL; sock6fd = -1; r = 0; *count = 0; *addresses = NULL; if (0 > (sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP))) { r = UV__ERR(errno); goto cleanup; } if (0 > (sock6fd = socket(AF_INET6, SOCK_DGRAM, IPPROTO_IP))) { r = UV__ERR(errno); goto cleanup; } if (ioctl(sockfd, SIOCGSIZIFCONF, &size) == -1) { r = UV__ERR(errno); goto cleanup; } ifc.ifc_req = (struct ifreq*)uv__malloc(size); if (ifc.ifc_req == NULL) { r = UV_ENOMEM; goto cleanup; } ifc.ifc_len = size; if (ioctl(sockfd, SIOCGIFCONF, &ifc) == -1) { r = UV__ERR(errno); goto cleanup; } #define ADDR_SIZE(p) MAX((p).sa_len, sizeof(p)) /* Count all up and running ipv4/ipv6 addresses */ ifr = ifc.ifc_req; while ((char*)ifr < (char*)ifc.ifc_req + ifc.ifc_len) { p = ifr; ifr = (struct ifreq*) ((char*)ifr + sizeof(ifr->ifr_name) + ADDR_SIZE(ifr->ifr_addr)); if (!(p->ifr_addr.sa_family == AF_INET6 || p->ifr_addr.sa_family == AF_INET)) continue; memcpy(flg.ifr_name, p->ifr_name, sizeof(flg.ifr_name)); if (ioctl(sockfd, SIOCGIFFLAGS, &flg) == -1) { r = UV__ERR(errno); goto cleanup; } if (!(flg.ifr_flags & IFF_UP && flg.ifr_flags & IFF_RUNNING)) continue; (*count)++; } if (*count == 0) goto cleanup; /* Alloc the return interface structs */ *addresses = uv__calloc(*count, sizeof(**addresses)); if (!(*addresses)) { r = UV_ENOMEM; goto cleanup; } address = *addresses; ifr = ifc.ifc_req; while ((char*)ifr < (char*)ifc.ifc_req + ifc.ifc_len) { p = ifr; ifr = (struct ifreq*) ((char*)ifr + sizeof(ifr->ifr_name) + ADDR_SIZE(ifr->ifr_addr)); if (!(p->ifr_addr.sa_family == AF_INET6 || p->ifr_addr.sa_family == AF_INET)) continue; inet6 = (p->ifr_addr.sa_family == AF_INET6); memcpy(flg.ifr_name, p->ifr_name, sizeof(flg.ifr_name)); if (ioctl(sockfd, SIOCGIFFLAGS, &flg) == -1) goto syserror; if (!(flg.ifr_flags & IFF_UP && flg.ifr_flags & IFF_RUNNING)) continue; /* All conditions above must match count loop */ address->name = uv__strdup(p->ifr_name); if (inet6) address->address.address6 = *((struct sockaddr_in6*) &p->ifr_addr); else address->address.address4 = *((struct sockaddr_in*) &p->ifr_addr); if (inet6) { memset(&if6, 0, sizeof(if6)); r = uv__strscpy(if6.ifr_name, p->ifr_name, sizeof(if6.ifr_name)); if (r == UV_E2BIG) goto cleanup; r = 0; memcpy(&if6.ifr_Addr, &p->ifr_addr, sizeof(if6.ifr_Addr)); if (ioctl(sock6fd, SIOCGIFNETMASK6, &if6) == -1) goto syserror; address->netmask.netmask6 = *((struct sockaddr_in6*) &if6.ifr_Addr); /* Explicitly set family as the ioctl call appears to return it as 0. */ address->netmask.netmask6.sin6_family = AF_INET6; } else { if (ioctl(sockfd, SIOCGIFNETMASK, p) == -1) goto syserror; address->netmask.netmask4 = *((struct sockaddr_in*) &p->ifr_addr); /* Explicitly set family as the ioctl call appears to return it as 0. */ address->netmask.netmask4.sin_family = AF_INET; } address->is_internal = flg.ifr_flags & IFF_LOOPBACK ? 1 : 0; address++; } /* Fill in physical addresses. */ ifr = ifc.ifc_req; while ((char*)ifr < (char*)ifc.ifc_req + ifc.ifc_len) { p = ifr; ifr = (struct ifreq*) ((char*)ifr + sizeof(ifr->ifr_name) + ADDR_SIZE(ifr->ifr_addr)); if (p->ifr_addr.sa_family != AF_LINK) continue; address = *addresses; for (i = 0; i < *count; i++) { if (strcmp(address->name, p->ifr_name) == 0) { sa_addr = (struct sockaddr_dl*) &p->ifr_addr; memcpy(address->phys_addr, LLADDR(sa_addr), sizeof(address->phys_addr)); } address++; } } #undef ADDR_SIZE goto cleanup; syserror: uv_free_interface_addresses(*addresses, *count); *addresses = NULL; *count = 0; r = UV_ENOSYS; cleanup: if (sockfd != -1) uv__close(sockfd); if (sock6fd != -1) uv__close(sock6fd); uv__free(ifc.ifc_req); return r; } void uv_free_interface_addresses(uv_interface_address_t* addresses, int count) { int i; for (i = 0; i < count; ++i) { uv__free(addresses[i].name); } uv__free(addresses); } void uv__platform_invalidate_fd(uv_loop_t* loop, int fd) { struct pollfd* events; uintptr_t i; uintptr_t nfds; struct poll_ctl pc; assert(loop->watchers != NULL); assert(fd >= 0); events = (struct pollfd*) loop->watchers[loop->nwatchers]; nfds = (uintptr_t) loop->watchers[loop->nwatchers + 1]; if (events != NULL) /* Invalidate events with same file descriptor */ for (i = 0; i < nfds; i++) if ((int) events[i].fd == fd) events[i].fd = -1; /* Remove the file descriptor from the poll set */ pc.events = 0; pc.cmd = PS_DELETE; pc.fd = fd; if(loop->backend_fd >= 0) pollset_ctl(loop->backend_fd, &pc, 1); } ================================================ FILE: external/libuv/src/unix/android-ifaddrs.c ================================================ /* Copyright (c) 2013, Kenneth MacKay Copyright (c) 2014, Emergya (Cloud4all, FP7/2007-2013 grant agreement #289016) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "uv/android-ifaddrs.h" #include "uv-common.h" #include #include #include #include #include #include #include #include #include #include typedef struct NetlinkList { struct NetlinkList *m_next; struct nlmsghdr *m_data; unsigned int m_size; } NetlinkList; static int netlink_socket(pid_t *p_pid) { struct sockaddr_nl l_addr; socklen_t l_len; int l_socket = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE); if(l_socket < 0) { return -1; } memset(&l_addr, 0, sizeof(l_addr)); l_addr.nl_family = AF_NETLINK; if(bind(l_socket, (struct sockaddr *)&l_addr, sizeof(l_addr)) < 0) { close(l_socket); return -1; } l_len = sizeof(l_addr); if(getsockname(l_socket, (struct sockaddr *)&l_addr, &l_len) < 0) { close(l_socket); return -1; } *p_pid = l_addr.nl_pid; return l_socket; } static int netlink_send(int p_socket, int p_request) { char l_buffer[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + NLMSG_ALIGN(sizeof(struct rtgenmsg))]; struct nlmsghdr *l_hdr; struct rtgenmsg *l_msg; struct sockaddr_nl l_addr; memset(l_buffer, 0, sizeof(l_buffer)); l_hdr = (struct nlmsghdr *)l_buffer; l_msg = (struct rtgenmsg *)NLMSG_DATA(l_hdr); l_hdr->nlmsg_len = NLMSG_LENGTH(sizeof(*l_msg)); l_hdr->nlmsg_type = p_request; l_hdr->nlmsg_flags = NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST; l_hdr->nlmsg_pid = 0; l_hdr->nlmsg_seq = p_socket; l_msg->rtgen_family = AF_UNSPEC; memset(&l_addr, 0, sizeof(l_addr)); l_addr.nl_family = AF_NETLINK; return (sendto(p_socket, l_hdr, l_hdr->nlmsg_len, 0, (struct sockaddr *)&l_addr, sizeof(l_addr))); } static int netlink_recv(int p_socket, void *p_buffer, size_t p_len) { struct sockaddr_nl l_addr; struct msghdr l_msg; struct iovec l_iov; l_iov.iov_base = p_buffer; l_iov.iov_len = p_len; for(;;) { int l_result; l_msg.msg_name = (void *)&l_addr; l_msg.msg_namelen = sizeof(l_addr); l_msg.msg_iov = &l_iov; l_msg.msg_iovlen = 1; l_msg.msg_control = NULL; l_msg.msg_controllen = 0; l_msg.msg_flags = 0; l_result = recvmsg(p_socket, &l_msg, 0); if(l_result < 0) { if(errno == EINTR) { continue; } return -2; } /* Buffer was too small */ if(l_msg.msg_flags & MSG_TRUNC) { return -1; } return l_result; } } static struct nlmsghdr *getNetlinkResponse(int p_socket, pid_t p_pid, int *p_size, int *p_done) { size_t l_size = 4096; void *l_buffer = NULL; for(;;) { int l_read; uv__free(l_buffer); l_buffer = uv__malloc(l_size); if (l_buffer == NULL) { return NULL; } l_read = netlink_recv(p_socket, l_buffer, l_size); *p_size = l_read; if(l_read == -2) { uv__free(l_buffer); return NULL; } if(l_read >= 0) { struct nlmsghdr *l_hdr; for(l_hdr = (struct nlmsghdr *)l_buffer; NLMSG_OK(l_hdr, (unsigned int)l_read); l_hdr = (struct nlmsghdr *)NLMSG_NEXT(l_hdr, l_read)) { if((pid_t)l_hdr->nlmsg_pid != p_pid || (int)l_hdr->nlmsg_seq != p_socket) { continue; } if(l_hdr->nlmsg_type == NLMSG_DONE) { *p_done = 1; break; } if(l_hdr->nlmsg_type == NLMSG_ERROR) { uv__free(l_buffer); return NULL; } } return l_buffer; } l_size *= 2; } } static NetlinkList *newListItem(struct nlmsghdr *p_data, unsigned int p_size) { NetlinkList *l_item = uv__malloc(sizeof(NetlinkList)); if (l_item == NULL) { return NULL; } l_item->m_next = NULL; l_item->m_data = p_data; l_item->m_size = p_size; return l_item; } static void freeResultList(NetlinkList *p_list) { NetlinkList *l_cur; while(p_list) { l_cur = p_list; p_list = p_list->m_next; uv__free(l_cur->m_data); uv__free(l_cur); } } static NetlinkList *getResultList(int p_socket, int p_request, pid_t p_pid) { int l_size; int l_done; NetlinkList *l_list; NetlinkList *l_end; if(netlink_send(p_socket, p_request) < 0) { return NULL; } l_list = NULL; l_end = NULL; l_done = 0; while(!l_done) { NetlinkList *l_item; struct nlmsghdr *l_hdr = getNetlinkResponse(p_socket, p_pid, &l_size, &l_done); /* Error */ if(!l_hdr) { freeResultList(l_list); return NULL; } l_item = newListItem(l_hdr, l_size); if (!l_item) { freeResultList(l_list); return NULL; } if(!l_list) { l_list = l_item; } else { l_end->m_next = l_item; } l_end = l_item; } return l_list; } static size_t maxSize(size_t a, size_t b) { return (a > b ? a : b); } static size_t calcAddrLen(sa_family_t p_family, int p_dataSize) { switch(p_family) { case AF_INET: return sizeof(struct sockaddr_in); case AF_INET6: return sizeof(struct sockaddr_in6); case AF_PACKET: return maxSize(sizeof(struct sockaddr_ll), offsetof(struct sockaddr_ll, sll_addr) + p_dataSize); default: return maxSize(sizeof(struct sockaddr), offsetof(struct sockaddr, sa_data) + p_dataSize); } } static void makeSockaddr(sa_family_t p_family, struct sockaddr *p_dest, void *p_data, size_t p_size) { switch(p_family) { case AF_INET: memcpy(&((struct sockaddr_in*)p_dest)->sin_addr, p_data, p_size); break; case AF_INET6: memcpy(&((struct sockaddr_in6*)p_dest)->sin6_addr, p_data, p_size); break; case AF_PACKET: memcpy(((struct sockaddr_ll*)p_dest)->sll_addr, p_data, p_size); ((struct sockaddr_ll*)p_dest)->sll_halen = p_size; break; default: memcpy(p_dest->sa_data, p_data, p_size); break; } p_dest->sa_family = p_family; } static void addToEnd(struct ifaddrs **p_resultList, struct ifaddrs *p_entry) { if(!*p_resultList) { *p_resultList = p_entry; } else { struct ifaddrs *l_cur = *p_resultList; while(l_cur->ifa_next) { l_cur = l_cur->ifa_next; } l_cur->ifa_next = p_entry; } } static int interpretLink(struct nlmsghdr *p_hdr, struct ifaddrs **p_resultList) { struct ifaddrs *l_entry; char *l_index; char *l_name; char *l_addr; char *l_data; struct ifinfomsg *l_info = (struct ifinfomsg *)NLMSG_DATA(p_hdr); size_t l_nameSize = 0; size_t l_addrSize = 0; size_t l_dataSize = 0; size_t l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifinfomsg)); struct rtattr *l_rta; for(l_rta = IFLA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize)) { size_t l_rtaDataSize = RTA_PAYLOAD(l_rta); switch(l_rta->rta_type) { case IFLA_ADDRESS: case IFLA_BROADCAST: l_addrSize += NLMSG_ALIGN(calcAddrLen(AF_PACKET, l_rtaDataSize)); break; case IFLA_IFNAME: l_nameSize += NLMSG_ALIGN(l_rtaSize + 1); break; case IFLA_STATS: l_dataSize += NLMSG_ALIGN(l_rtaSize); break; default: break; } } l_entry = uv__malloc(sizeof(struct ifaddrs) + sizeof(int) + l_nameSize + l_addrSize + l_dataSize); if (l_entry == NULL) { return -1; } memset(l_entry, 0, sizeof(struct ifaddrs)); l_entry->ifa_name = ""; l_index = ((char *)l_entry) + sizeof(struct ifaddrs); l_name = l_index + sizeof(int); l_addr = l_name + l_nameSize; l_data = l_addr + l_addrSize; /* Save the interface index so we can look it up when handling the * addresses. */ memcpy(l_index, &l_info->ifi_index, sizeof(int)); l_entry->ifa_flags = l_info->ifi_flags; l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifinfomsg)); for(l_rta = IFLA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize)) { void *l_rtaData = RTA_DATA(l_rta); size_t l_rtaDataSize = RTA_PAYLOAD(l_rta); switch(l_rta->rta_type) { case IFLA_ADDRESS: case IFLA_BROADCAST: { size_t l_addrLen = calcAddrLen(AF_PACKET, l_rtaDataSize); makeSockaddr(AF_PACKET, (struct sockaddr *)l_addr, l_rtaData, l_rtaDataSize); ((struct sockaddr_ll *)l_addr)->sll_ifindex = l_info->ifi_index; ((struct sockaddr_ll *)l_addr)->sll_hatype = l_info->ifi_type; if(l_rta->rta_type == IFLA_ADDRESS) { l_entry->ifa_addr = (struct sockaddr *)l_addr; } else { l_entry->ifa_broadaddr = (struct sockaddr *)l_addr; } l_addr += NLMSG_ALIGN(l_addrLen); break; } case IFLA_IFNAME: strncpy(l_name, l_rtaData, l_rtaDataSize); l_name[l_rtaDataSize] = '\0'; l_entry->ifa_name = l_name; break; case IFLA_STATS: memcpy(l_data, l_rtaData, l_rtaDataSize); l_entry->ifa_data = l_data; break; default: break; } } addToEnd(p_resultList, l_entry); return 0; } static struct ifaddrs *findInterface(int p_index, struct ifaddrs **p_links, int p_numLinks) { int l_num = 0; struct ifaddrs *l_cur = *p_links; while(l_cur && l_num < p_numLinks) { char *l_indexPtr = ((char *)l_cur) + sizeof(struct ifaddrs); int l_index; memcpy(&l_index, l_indexPtr, sizeof(int)); if(l_index == p_index) { return l_cur; } l_cur = l_cur->ifa_next; ++l_num; } return NULL; } static int interpretAddr(struct nlmsghdr *p_hdr, struct ifaddrs **p_resultList, int p_numLinks) { struct ifaddrmsg *l_info = (struct ifaddrmsg *)NLMSG_DATA(p_hdr); struct ifaddrs *l_interface = findInterface(l_info->ifa_index, p_resultList, p_numLinks); size_t l_nameSize = 0; size_t l_addrSize = 0; int l_addedNetmask = 0; size_t l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifaddrmsg)); struct rtattr *l_rta; struct ifaddrs *l_entry; char *l_name; char *l_addr; for(l_rta = IFA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize)) { size_t l_rtaDataSize = RTA_PAYLOAD(l_rta); if(l_info->ifa_family == AF_PACKET) { continue; } switch(l_rta->rta_type) { case IFA_ADDRESS: case IFA_LOCAL: l_addrSize += NLMSG_ALIGN(calcAddrLen(l_info->ifa_family, l_rtaDataSize)); if((l_info->ifa_family == AF_INET || l_info->ifa_family == AF_INET6) && !l_addedNetmask) { /* Make room for netmask */ l_addrSize += NLMSG_ALIGN(calcAddrLen(l_info->ifa_family, l_rtaDataSize)); l_addedNetmask = 1; } break; case IFA_BROADCAST: l_addrSize += NLMSG_ALIGN(calcAddrLen(l_info->ifa_family, l_rtaDataSize)); break; case IFA_LABEL: l_nameSize += NLMSG_ALIGN(l_rtaDataSize + 1); break; default: break; } } l_entry = uv__malloc(sizeof(struct ifaddrs) + l_nameSize + l_addrSize); if (l_entry == NULL) { return -1; } memset(l_entry, 0, sizeof(struct ifaddrs)); l_entry->ifa_name = (l_interface ? l_interface->ifa_name : ""); l_name = ((char *)l_entry) + sizeof(struct ifaddrs); l_addr = l_name + l_nameSize; l_entry->ifa_flags = l_info->ifa_flags; if(l_interface) { l_entry->ifa_flags |= l_interface->ifa_flags; } l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifaddrmsg)); for(l_rta = IFA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize)) { void *l_rtaData = RTA_DATA(l_rta); size_t l_rtaDataSize = RTA_PAYLOAD(l_rta); switch(l_rta->rta_type) { case IFA_ADDRESS: case IFA_BROADCAST: case IFA_LOCAL: { size_t l_addrLen = calcAddrLen(l_info->ifa_family, l_rtaDataSize); makeSockaddr(l_info->ifa_family, (struct sockaddr *)l_addr, l_rtaData, l_rtaDataSize); if(l_info->ifa_family == AF_INET6) { if(IN6_IS_ADDR_LINKLOCAL((struct in6_addr *)l_rtaData) || IN6_IS_ADDR_MC_LINKLOCAL((struct in6_addr *)l_rtaData)) { ((struct sockaddr_in6 *)l_addr)->sin6_scope_id = l_info->ifa_index; } } /* Apparently in a point-to-point network IFA_ADDRESS contains * the dest address and IFA_LOCAL contains the local address */ if(l_rta->rta_type == IFA_ADDRESS) { if(l_entry->ifa_addr) { l_entry->ifa_dstaddr = (struct sockaddr *)l_addr; } else { l_entry->ifa_addr = (struct sockaddr *)l_addr; } } else if(l_rta->rta_type == IFA_LOCAL) { if(l_entry->ifa_addr) { l_entry->ifa_dstaddr = l_entry->ifa_addr; } l_entry->ifa_addr = (struct sockaddr *)l_addr; } else { l_entry->ifa_broadaddr = (struct sockaddr *)l_addr; } l_addr += NLMSG_ALIGN(l_addrLen); break; } case IFA_LABEL: strncpy(l_name, l_rtaData, l_rtaDataSize); l_name[l_rtaDataSize] = '\0'; l_entry->ifa_name = l_name; break; default: break; } } if(l_entry->ifa_addr && (l_entry->ifa_addr->sa_family == AF_INET || l_entry->ifa_addr->sa_family == AF_INET6)) { unsigned l_maxPrefix = (l_entry->ifa_addr->sa_family == AF_INET ? 32 : 128); unsigned l_prefix = (l_info->ifa_prefixlen > l_maxPrefix ? l_maxPrefix : l_info->ifa_prefixlen); unsigned char l_mask[16] = {0}; unsigned i; for(i=0; i<(l_prefix/8); ++i) { l_mask[i] = 0xff; } if(l_prefix % 8) { l_mask[i] = 0xff << (8 - (l_prefix % 8)); } makeSockaddr(l_entry->ifa_addr->sa_family, (struct sockaddr *)l_addr, l_mask, l_maxPrefix / 8); l_entry->ifa_netmask = (struct sockaddr *)l_addr; } addToEnd(p_resultList, l_entry); return 0; } static int interpretLinks(int p_socket, pid_t p_pid, NetlinkList *p_netlinkList, struct ifaddrs **p_resultList) { int l_numLinks = 0; for(; p_netlinkList; p_netlinkList = p_netlinkList->m_next) { unsigned int l_nlsize = p_netlinkList->m_size; struct nlmsghdr *l_hdr; for(l_hdr = p_netlinkList->m_data; NLMSG_OK(l_hdr, l_nlsize); l_hdr = NLMSG_NEXT(l_hdr, l_nlsize)) { if((pid_t)l_hdr->nlmsg_pid != p_pid || (int)l_hdr->nlmsg_seq != p_socket) { continue; } if(l_hdr->nlmsg_type == NLMSG_DONE) { break; } if(l_hdr->nlmsg_type == RTM_NEWLINK) { if(interpretLink(l_hdr, p_resultList) == -1) { return -1; } ++l_numLinks; } } } return l_numLinks; } static int interpretAddrs(int p_socket, pid_t p_pid, NetlinkList *p_netlinkList, struct ifaddrs **p_resultList, int p_numLinks) { for(; p_netlinkList; p_netlinkList = p_netlinkList->m_next) { unsigned int l_nlsize = p_netlinkList->m_size; struct nlmsghdr *l_hdr; for(l_hdr = p_netlinkList->m_data; NLMSG_OK(l_hdr, l_nlsize); l_hdr = NLMSG_NEXT(l_hdr, l_nlsize)) { if((pid_t)l_hdr->nlmsg_pid != p_pid || (int)l_hdr->nlmsg_seq != p_socket) { continue; } if(l_hdr->nlmsg_type == NLMSG_DONE) { break; } if(l_hdr->nlmsg_type == RTM_NEWADDR) { if (interpretAddr(l_hdr, p_resultList, p_numLinks) == -1) { return -1; } } } } return 0; } int getifaddrs(struct ifaddrs **ifap) { int l_socket; int l_result; int l_numLinks; pid_t l_pid; NetlinkList *l_linkResults; NetlinkList *l_addrResults; if(!ifap) { return -1; } *ifap = NULL; l_socket = netlink_socket(&l_pid); if(l_socket < 0) { return -1; } l_linkResults = getResultList(l_socket, RTM_GETLINK, l_pid); if(!l_linkResults) { close(l_socket); return -1; } l_addrResults = getResultList(l_socket, RTM_GETADDR, l_pid); if(!l_addrResults) { close(l_socket); freeResultList(l_linkResults); return -1; } l_result = 0; l_numLinks = interpretLinks(l_socket, l_pid, l_linkResults, ifap); if(l_numLinks == -1 || interpretAddrs(l_socket, l_pid, l_addrResults, ifap, l_numLinks) == -1) { l_result = -1; } freeResultList(l_linkResults); freeResultList(l_addrResults); close(l_socket); return l_result; } void freeifaddrs(struct ifaddrs *ifa) { struct ifaddrs *l_cur; while(ifa) { l_cur = ifa; ifa = ifa->ifa_next; uv__free(l_cur); } } ================================================ FILE: external/libuv/src/unix/async.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ /* This file contains both the uv__async internal infrastructure and the * user-facing uv_async_t functions. */ #include "uv.h" #include "internal.h" #include "atomic-ops.h" #include #include /* snprintf() */ #include #include #include #include #include /* sched_yield() */ #ifdef __linux__ #include #endif static void uv__async_send(uv_loop_t* loop); static int uv__async_start(uv_loop_t* loop); int uv_async_init(uv_loop_t* loop, uv_async_t* handle, uv_async_cb async_cb) { int err; err = uv__async_start(loop); if (err) return err; uv__handle_init(loop, (uv_handle_t*)handle, UV_ASYNC); handle->async_cb = async_cb; handle->pending = 0; QUEUE_INSERT_TAIL(&loop->async_handles, &handle->queue); uv__handle_start(handle); return 0; } int uv_async_send(uv_async_t* handle) { /* Do a cheap read first. */ if (ACCESS_ONCE(int, handle->pending) != 0) return 0; /* Tell the other thread we're busy with the handle. */ if (cmpxchgi(&handle->pending, 0, 1) != 0) return 0; /* Wake up the other thread's event loop. */ uv__async_send(handle->loop); /* Tell the other thread we're done. */ if (cmpxchgi(&handle->pending, 1, 2) != 1) abort(); return 0; } /* Only call this from the event loop thread. */ static int uv__async_spin(uv_async_t* handle) { int i; int rc; for (;;) { /* 997 is not completely chosen at random. It's a prime number, acyclical * by nature, and should therefore hopefully dampen sympathetic resonance. */ for (i = 0; i < 997; i++) { /* rc=0 -- handle is not pending. * rc=1 -- handle is pending, other thread is still working with it. * rc=2 -- handle is pending, other thread is done. */ rc = cmpxchgi(&handle->pending, 2, 0); if (rc != 1) return rc; /* Other thread is busy with this handle, spin until it's done. */ cpu_relax(); } /* Yield the CPU. We may have preempted the other thread while it's * inside the critical section and if it's running on the same CPU * as us, we'll just burn CPU cycles until the end of our time slice. */ sched_yield(); } } void uv__async_close(uv_async_t* handle) { uv__async_spin(handle); QUEUE_REMOVE(&handle->queue); uv__handle_stop(handle); } static void uv__async_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) { char buf[1024]; ssize_t r; QUEUE queue; QUEUE* q; uv_async_t* h; assert(w == &loop->async_io_watcher); for (;;) { r = read(w->fd, buf, sizeof(buf)); if (r == sizeof(buf)) continue; if (r != -1) break; if (errno == EAGAIN || errno == EWOULDBLOCK) break; if (errno == EINTR) continue; abort(); } QUEUE_MOVE(&loop->async_handles, &queue); while (!QUEUE_EMPTY(&queue)) { q = QUEUE_HEAD(&queue); h = QUEUE_DATA(q, uv_async_t, queue); QUEUE_REMOVE(q); QUEUE_INSERT_TAIL(&loop->async_handles, q); if (0 == uv__async_spin(h)) continue; /* Not pending. */ if (h->async_cb == NULL) continue; h->async_cb(h); } } static void uv__async_send(uv_loop_t* loop) { const void* buf; ssize_t len; int fd; int r; buf = ""; len = 1; fd = loop->async_wfd; #if defined(__linux__) if (fd == -1) { static const uint64_t val = 1; buf = &val; len = sizeof(val); fd = loop->async_io_watcher.fd; /* eventfd */ } #endif do r = write(fd, buf, len); while (r == -1 && errno == EINTR); if (r == len) return; if (r == -1) if (errno == EAGAIN || errno == EWOULDBLOCK) return; abort(); } static int uv__async_start(uv_loop_t* loop) { int pipefd[2]; int err; if (loop->async_io_watcher.fd != -1) return 0; #ifdef __linux__ err = eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK); if (err < 0) return UV__ERR(errno); pipefd[0] = err; pipefd[1] = -1; #else err = uv__make_pipe(pipefd, UV__F_NONBLOCK); if (err < 0) return err; #endif uv__io_init(&loop->async_io_watcher, uv__async_io, pipefd[0]); uv__io_start(loop, &loop->async_io_watcher, POLLIN); loop->async_wfd = pipefd[1]; return 0; } int uv__async_fork(uv_loop_t* loop) { if (loop->async_io_watcher.fd == -1) /* never started */ return 0; uv__async_stop(loop); return uv__async_start(loop); } void uv__async_stop(uv_loop_t* loop) { if (loop->async_io_watcher.fd == -1) return; if (loop->async_wfd != -1) { if (loop->async_wfd != loop->async_io_watcher.fd) uv__close(loop->async_wfd); loop->async_wfd = -1; } uv__io_stop(loop, &loop->async_io_watcher, POLLIN); uv__close(loop->async_io_watcher.fd); loop->async_io_watcher.fd = -1; } ================================================ FILE: external/libuv/src/unix/atomic-ops.h ================================================ /* Copyright (c) 2013, Ben Noordhuis * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef UV_ATOMIC_OPS_H_ #define UV_ATOMIC_OPS_H_ #include "internal.h" /* UV_UNUSED */ #if defined(__SUNPRO_C) || defined(__SUNPRO_CC) #include #endif UV_UNUSED(static int cmpxchgi(int* ptr, int oldval, int newval)); UV_UNUSED(static void cpu_relax(void)); /* Prefer hand-rolled assembly over the gcc builtins because the latter also * issue full memory barriers. */ UV_UNUSED(static int cmpxchgi(int* ptr, int oldval, int newval)) { #if defined(__i386__) || defined(__x86_64__) int out; __asm__ __volatile__ ("lock; cmpxchg %2, %1;" : "=a" (out), "+m" (*(volatile int*) ptr) : "r" (newval), "0" (oldval) : "memory"); return out; #elif defined(__MVS__) unsigned int op4; if (__plo_CSST(ptr, (unsigned int*) &oldval, newval, (unsigned int*) ptr, *ptr, &op4)) return oldval; else return op4; #elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) return atomic_cas_uint((uint_t *)ptr, (uint_t)oldval, (uint_t)newval); #else return __sync_val_compare_and_swap(ptr, oldval, newval); #endif } UV_UNUSED(static void cpu_relax(void)) { #if defined(__i386__) || defined(__x86_64__) __asm__ __volatile__ ("rep; nop"); /* a.k.a. PAUSE */ #elif (defined(__arm__) && __ARM_ARCH >= 7) || defined(__aarch64__) __asm__ volatile("yield"); #endif } #endif /* UV_ATOMIC_OPS_H_ */ ================================================ FILE: external/libuv/src/unix/bsd-ifaddrs.c ================================================ /* Copyright libuv project contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #if !defined(__CYGWIN__) && !defined(__MSYS__) #include #endif #if defined(__HAIKU__) #define IFF_RUNNING IFF_LINK #endif static int uv__ifaddr_exclude(struct ifaddrs *ent, int exclude_type) { if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING))) return 1; if (ent->ifa_addr == NULL) return 1; #if !defined(__CYGWIN__) && !defined(__MSYS__) /* * If `exclude_type` is `UV__EXCLUDE_IFPHYS`, just see whether `sa_family` * equals to `AF_LINK` or not. Otherwise, the result depends on the operation * system with `AF_LINK` or `PF_INET`. */ if (exclude_type == UV__EXCLUDE_IFPHYS) return (ent->ifa_addr->sa_family != AF_LINK); #endif #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__DragonFly__) || \ defined(__HAIKU__) /* * On BSD getifaddrs returns information related to the raw underlying * devices. We're not interested in this information. */ if (ent->ifa_addr->sa_family == AF_LINK) return 1; #elif defined(__NetBSD__) || defined(__OpenBSD__) if (ent->ifa_addr->sa_family != PF_INET && ent->ifa_addr->sa_family != PF_INET6) return 1; #endif return 0; } int uv_interface_addresses(uv_interface_address_t** addresses, int* count) { struct ifaddrs* addrs; struct ifaddrs* ent; uv_interface_address_t* address; #if !(defined(__CYGWIN__) || defined(__MSYS__)) int i; #endif *count = 0; *addresses = NULL; if (getifaddrs(&addrs) != 0) return UV__ERR(errno); /* Count the number of interfaces */ for (ent = addrs; ent != NULL; ent = ent->ifa_next) { if (uv__ifaddr_exclude(ent, UV__EXCLUDE_IFADDR)) continue; (*count)++; } if (*count == 0) { freeifaddrs(addrs); return 0; } /* Make sure the memory is initiallized to zero using calloc() */ *addresses = uv__calloc(*count, sizeof(**addresses)); if (*addresses == NULL) { freeifaddrs(addrs); return UV_ENOMEM; } address = *addresses; for (ent = addrs; ent != NULL; ent = ent->ifa_next) { if (uv__ifaddr_exclude(ent, UV__EXCLUDE_IFADDR)) continue; address->name = uv__strdup(ent->ifa_name); if (ent->ifa_addr->sa_family == AF_INET6) { address->address.address6 = *((struct sockaddr_in6*) ent->ifa_addr); } else { address->address.address4 = *((struct sockaddr_in*) ent->ifa_addr); } if (ent->ifa_netmask->sa_family == AF_INET6) { address->netmask.netmask6 = *((struct sockaddr_in6*) ent->ifa_netmask); } else { address->netmask.netmask4 = *((struct sockaddr_in*) ent->ifa_netmask); } address->is_internal = !!(ent->ifa_flags & IFF_LOOPBACK); address++; } #if !(defined(__CYGWIN__) || defined(__MSYS__)) /* Fill in physical addresses for each interface */ for (ent = addrs; ent != NULL; ent = ent->ifa_next) { if (uv__ifaddr_exclude(ent, UV__EXCLUDE_IFPHYS)) continue; address = *addresses; for (i = 0; i < *count; i++) { if (strcmp(address->name, ent->ifa_name) == 0) { struct sockaddr_dl* sa_addr; sa_addr = (struct sockaddr_dl*)(ent->ifa_addr); memcpy(address->phys_addr, LLADDR(sa_addr), sizeof(address->phys_addr)); } address++; } } #endif freeifaddrs(addrs); return 0; } void uv_free_interface_addresses(uv_interface_address_t* addresses, int count) { int i; for (i = 0; i < count; i++) { uv__free(addresses[i].name); } uv__free(addresses); } ================================================ FILE: external/libuv/src/unix/bsd-proctitle.c ================================================ /* Copyright libuv project contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include static uv_mutex_t process_title_mutex; static uv_once_t process_title_mutex_once = UV_ONCE_INIT; static char* process_title; static void init_process_title_mutex_once(void) { if (uv_mutex_init(&process_title_mutex)) abort(); } void uv__process_title_cleanup(void) { /* TODO(bnoordhuis) uv_mutex_destroy(&process_title_mutex) * and reset process_title_mutex_once? */ } char** uv_setup_args(int argc, char** argv) { process_title = argc > 0 ? uv__strdup(argv[0]) : NULL; return argv; } int uv_set_process_title(const char* title) { char* new_title; new_title = uv__strdup(title); if (new_title == NULL) return UV_ENOMEM; uv_once(&process_title_mutex_once, init_process_title_mutex_once); uv_mutex_lock(&process_title_mutex); uv__free(process_title); process_title = new_title; setproctitle("%s", title); uv_mutex_unlock(&process_title_mutex); return 0; } int uv_get_process_title(char* buffer, size_t size) { size_t len; if (buffer == NULL || size == 0) return UV_EINVAL; uv_once(&process_title_mutex_once, init_process_title_mutex_once); uv_mutex_lock(&process_title_mutex); if (process_title != NULL) { len = strlen(process_title) + 1; if (size < len) { uv_mutex_unlock(&process_title_mutex); return UV_ENOBUFS; } memcpy(buffer, process_title, len); } else { len = 0; } uv_mutex_unlock(&process_title_mutex); buffer[len] = '\0'; return 0; } ================================================ FILE: external/libuv/src/unix/core.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include /* NULL */ #include /* printf */ #include #include /* strerror */ #include #include #include #include #include #include /* O_CLOEXEC */ #include #include #include #include #include #include /* INT_MAX, PATH_MAX, IOV_MAX */ #include /* writev */ #include /* getrusage */ #include #include #include #ifdef __sun # include # include # include #endif #if defined(__APPLE__) # include # endif /* defined(__APPLE__) */ #if defined(__APPLE__) && !TARGET_OS_IPHONE # include # include /* _NSGetExecutablePath */ # define environ (*_NSGetEnviron()) #else /* defined(__APPLE__) && !TARGET_OS_IPHONE */ extern char** environ; #endif /* !(defined(__APPLE__) && !TARGET_OS_IPHONE) */ #if defined(__DragonFly__) || \ defined(__FreeBSD__) || \ defined(__FreeBSD_kernel__) || \ defined(__NetBSD__) || \ defined(__OpenBSD__) # include # include # include # if defined(__FreeBSD__) # define uv__accept4 accept4 # endif # if defined(__NetBSD__) # define uv__accept4(a, b, c, d) paccept((a), (b), (c), NULL, (d)) # endif #endif #if defined(__ANDROID_API__) && __ANDROID_API__ < 21 # include /* for dlsym */ #endif #if defined(__MVS__) #include #endif #if defined(__linux__) # include # define uv__accept4 accept4 #endif static int uv__run_pending(uv_loop_t* loop); /* Verify that uv_buf_t is ABI-compatible with struct iovec. */ STATIC_ASSERT(sizeof(uv_buf_t) == sizeof(struct iovec)); STATIC_ASSERT(sizeof(&((uv_buf_t*) 0)->base) == sizeof(((struct iovec*) 0)->iov_base)); STATIC_ASSERT(sizeof(&((uv_buf_t*) 0)->len) == sizeof(((struct iovec*) 0)->iov_len)); STATIC_ASSERT(offsetof(uv_buf_t, base) == offsetof(struct iovec, iov_base)); STATIC_ASSERT(offsetof(uv_buf_t, len) == offsetof(struct iovec, iov_len)); uint64_t uv_hrtime(void) { return uv__hrtime(UV_CLOCK_PRECISE); } void uv_close(uv_handle_t* handle, uv_close_cb close_cb) { assert(!uv__is_closing(handle)); handle->flags |= UV_HANDLE_CLOSING; handle->close_cb = close_cb; switch (handle->type) { case UV_NAMED_PIPE: uv__pipe_close((uv_pipe_t*)handle); break; case UV_TTY: uv__stream_close((uv_stream_t*)handle); break; case UV_TCP: uv__tcp_close((uv_tcp_t*)handle); break; case UV_UDP: uv__udp_close((uv_udp_t*)handle); break; case UV_PREPARE: uv__prepare_close((uv_prepare_t*)handle); break; case UV_CHECK: uv__check_close((uv_check_t*)handle); break; case UV_IDLE: uv__idle_close((uv_idle_t*)handle); break; case UV_ASYNC: uv__async_close((uv_async_t*)handle); break; case UV_TIMER: uv__timer_close((uv_timer_t*)handle); break; case UV_PROCESS: uv__process_close((uv_process_t*)handle); break; case UV_FS_EVENT: uv__fs_event_close((uv_fs_event_t*)handle); break; case UV_POLL: uv__poll_close((uv_poll_t*)handle); break; case UV_FS_POLL: uv__fs_poll_close((uv_fs_poll_t*)handle); /* Poll handles use file system requests, and one of them may still be * running. The poll code will call uv__make_close_pending() for us. */ return; case UV_SIGNAL: uv__signal_close((uv_signal_t*) handle); break; default: assert(0); } uv__make_close_pending(handle); } int uv__socket_sockopt(uv_handle_t* handle, int optname, int* value) { int r; int fd; socklen_t len; if (handle == NULL || value == NULL) return UV_EINVAL; if (handle->type == UV_TCP || handle->type == UV_NAMED_PIPE) fd = uv__stream_fd((uv_stream_t*) handle); else if (handle->type == UV_UDP) fd = ((uv_udp_t *) handle)->io_watcher.fd; else return UV_ENOTSUP; len = sizeof(*value); if (*value == 0) r = getsockopt(fd, SOL_SOCKET, optname, value, &len); else r = setsockopt(fd, SOL_SOCKET, optname, (const void*) value, len); if (r < 0) return UV__ERR(errno); return 0; } void uv__make_close_pending(uv_handle_t* handle) { assert(handle->flags & UV_HANDLE_CLOSING); assert(!(handle->flags & UV_HANDLE_CLOSED)); handle->next_closing = handle->loop->closing_handles; handle->loop->closing_handles = handle; } int uv__getiovmax(void) { #if defined(IOV_MAX) return IOV_MAX; #elif defined(_SC_IOV_MAX) static int iovmax = -1; if (iovmax == -1) { iovmax = sysconf(_SC_IOV_MAX); /* On some embedded devices (arm-linux-uclibc based ip camera), * sysconf(_SC_IOV_MAX) can not get the correct value. The return * value is -1 and the errno is EINPROGRESS. Degrade the value to 1. */ if (iovmax == -1) iovmax = 1; } return iovmax; #else return 1024; #endif } static void uv__finish_close(uv_handle_t* handle) { uv_signal_t* sh; /* Note: while the handle is in the UV_HANDLE_CLOSING state now, it's still * possible for it to be active in the sense that uv__is_active() returns * true. * * A good example is when the user calls uv_shutdown(), immediately followed * by uv_close(). The handle is considered active at this point because the * completion of the shutdown req is still pending. */ assert(handle->flags & UV_HANDLE_CLOSING); assert(!(handle->flags & UV_HANDLE_CLOSED)); handle->flags |= UV_HANDLE_CLOSED; switch (handle->type) { case UV_PREPARE: case UV_CHECK: case UV_IDLE: case UV_ASYNC: case UV_TIMER: case UV_PROCESS: case UV_FS_EVENT: case UV_FS_POLL: case UV_POLL: break; case UV_SIGNAL: /* If there are any caught signals "trapped" in the signal pipe, * we can't call the close callback yet. Reinserting the handle * into the closing queue makes the event loop spin but that's * okay because we only need to deliver the pending events. */ sh = (uv_signal_t*) handle; if (sh->caught_signals > sh->dispatched_signals) { handle->flags ^= UV_HANDLE_CLOSED; uv__make_close_pending(handle); /* Back into the queue. */ return; } break; case UV_NAMED_PIPE: case UV_TCP: case UV_TTY: uv__stream_destroy((uv_stream_t*)handle); break; case UV_UDP: uv__udp_finish_close((uv_udp_t*)handle); break; default: assert(0); break; } uv__handle_unref(handle); QUEUE_REMOVE(&handle->handle_queue); if (handle->close_cb) { handle->close_cb(handle); } } static void uv__run_closing_handles(uv_loop_t* loop) { uv_handle_t* p; uv_handle_t* q; p = loop->closing_handles; loop->closing_handles = NULL; while (p) { q = p->next_closing; uv__finish_close(p); p = q; } } int uv_is_closing(const uv_handle_t* handle) { return uv__is_closing(handle); } int uv_backend_fd(const uv_loop_t* loop) { return loop->backend_fd; } int uv_backend_timeout(const uv_loop_t* loop) { if (loop->stop_flag != 0) return 0; if (!uv__has_active_handles(loop) && !uv__has_active_reqs(loop)) return 0; if (!QUEUE_EMPTY(&loop->idle_handles)) return 0; if (!QUEUE_EMPTY(&loop->pending_queue)) return 0; if (loop->closing_handles) return 0; return uv__next_timeout(loop); } static int uv__loop_alive(const uv_loop_t* loop) { return uv__has_active_handles(loop) || uv__has_active_reqs(loop) || loop->closing_handles != NULL; } int uv_loop_alive(const uv_loop_t* loop) { return uv__loop_alive(loop); } int uv_run(uv_loop_t* loop, uv_run_mode mode) { int timeout; int r; int ran_pending; r = uv__loop_alive(loop); if (!r) uv__update_time(loop); while (r != 0 && loop->stop_flag == 0) { uv__update_time(loop); uv__run_timers(loop); ran_pending = uv__run_pending(loop); uv__run_idle(loop); uv__run_prepare(loop); timeout = 0; if ((mode == UV_RUN_ONCE && !ran_pending) || mode == UV_RUN_DEFAULT) timeout = uv_backend_timeout(loop); uv__io_poll(loop, timeout); uv__run_check(loop); uv__run_closing_handles(loop); if (mode == UV_RUN_ONCE) { /* UV_RUN_ONCE implies forward progress: at least one callback must have * been invoked when it returns. uv__io_poll() can return without doing * I/O (meaning: no callbacks) when its timeout expires - which means we * have pending timers that satisfy the forward progress constraint. * * UV_RUN_NOWAIT makes no guarantees about progress so it's omitted from * the check. */ uv__update_time(loop); uv__run_timers(loop); } r = uv__loop_alive(loop); if (mode == UV_RUN_ONCE || mode == UV_RUN_NOWAIT) break; } /* The if statement lets gcc compile it to a conditional store. Avoids * dirtying a cache line. */ if (loop->stop_flag != 0) loop->stop_flag = 0; return r; } void uv_update_time(uv_loop_t* loop) { uv__update_time(loop); } int uv_is_active(const uv_handle_t* handle) { return uv__is_active(handle); } /* Open a socket in non-blocking close-on-exec mode, atomically if possible. */ int uv__socket(int domain, int type, int protocol) { int sockfd; int err; #if defined(SOCK_NONBLOCK) && defined(SOCK_CLOEXEC) sockfd = socket(domain, type | SOCK_NONBLOCK | SOCK_CLOEXEC, protocol); if (sockfd != -1) return sockfd; if (errno != EINVAL) return UV__ERR(errno); #endif sockfd = socket(domain, type, protocol); if (sockfd == -1) return UV__ERR(errno); err = uv__nonblock(sockfd, 1); if (err == 0) err = uv__cloexec(sockfd, 1); if (err) { uv__close(sockfd); return err; } #if defined(SO_NOSIGPIPE) { int on = 1; setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &on, sizeof(on)); } #endif return sockfd; } /* get a file pointer to a file in read-only and close-on-exec mode */ FILE* uv__open_file(const char* path) { int fd; FILE* fp; fd = uv__open_cloexec(path, O_RDONLY); if (fd < 0) return NULL; fp = fdopen(fd, "r"); if (fp == NULL) uv__close(fd); return fp; } int uv__accept(int sockfd) { int peerfd; int err; (void) &err; assert(sockfd >= 0); do #ifdef uv__accept4 peerfd = uv__accept4(sockfd, NULL, NULL, SOCK_NONBLOCK|SOCK_CLOEXEC); #else peerfd = accept(sockfd, NULL, NULL); #endif while (peerfd == -1 && errno == EINTR); if (peerfd == -1) return UV__ERR(errno); #ifndef uv__accept4 err = uv__cloexec(peerfd, 1); if (err == 0) err = uv__nonblock(peerfd, 1); if (err != 0) { uv__close(peerfd); return err; } #endif return peerfd; } /* close() on macos has the "interesting" quirk that it fails with EINTR * without closing the file descriptor when a thread is in the cancel state. * That's why libuv calls close$NOCANCEL() instead. * * glibc on linux has a similar issue: close() is a cancellation point and * will unwind the thread when it's in the cancel state. Work around that * by making the system call directly. Musl libc is unaffected. */ int uv__close_nocancel(int fd) { #if defined(__APPLE__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdollar-in-identifier-extension" #if defined(__LP64__) || TARGET_OS_IPHONE extern int close$NOCANCEL(int); return close$NOCANCEL(fd); #else extern int close$NOCANCEL$UNIX2003(int); return close$NOCANCEL$UNIX2003(fd); #endif #pragma GCC diagnostic pop #elif defined(__linux__) return syscall(SYS_close, fd); #else return close(fd); #endif } int uv__close_nocheckstdio(int fd) { int saved_errno; int rc; assert(fd > -1); /* Catch uninitialized io_watcher.fd bugs. */ saved_errno = errno; rc = uv__close_nocancel(fd); if (rc == -1) { rc = UV__ERR(errno); if (rc == UV_EINTR || rc == UV__ERR(EINPROGRESS)) rc = 0; /* The close is in progress, not an error. */ errno = saved_errno; } return rc; } int uv__close(int fd) { assert(fd > STDERR_FILENO); /* Catch stdio close bugs. */ #if defined(__MVS__) SAVE_ERRNO(epoll_file_close(fd)); #endif return uv__close_nocheckstdio(fd); } int uv__nonblock_ioctl(int fd, int set) { int r; do r = ioctl(fd, FIONBIO, &set); while (r == -1 && errno == EINTR); if (r) return UV__ERR(errno); return 0; } #if !defined(__CYGWIN__) && !defined(__MSYS__) && !defined(__HAIKU__) int uv__cloexec_ioctl(int fd, int set) { int r; do r = ioctl(fd, set ? FIOCLEX : FIONCLEX); while (r == -1 && errno == EINTR); if (r) return UV__ERR(errno); return 0; } #endif int uv__nonblock_fcntl(int fd, int set) { int flags; int r; do r = fcntl(fd, F_GETFL); while (r == -1 && errno == EINTR); if (r == -1) return UV__ERR(errno); /* Bail out now if already set/clear. */ if (!!(r & O_NONBLOCK) == !!set) return 0; if (set) flags = r | O_NONBLOCK; else flags = r & ~O_NONBLOCK; do r = fcntl(fd, F_SETFL, flags); while (r == -1 && errno == EINTR); if (r) return UV__ERR(errno); return 0; } int uv__cloexec_fcntl(int fd, int set) { int flags; int r; do r = fcntl(fd, F_GETFD); while (r == -1 && errno == EINTR); if (r == -1) return UV__ERR(errno); /* Bail out now if already set/clear. */ if (!!(r & FD_CLOEXEC) == !!set) return 0; if (set) flags = r | FD_CLOEXEC; else flags = r & ~FD_CLOEXEC; do r = fcntl(fd, F_SETFD, flags); while (r == -1 && errno == EINTR); if (r) return UV__ERR(errno); return 0; } ssize_t uv__recvmsg(int fd, struct msghdr* msg, int flags) { struct cmsghdr* cmsg; ssize_t rc; int* pfd; int* end; #if defined(__linux__) static int no_msg_cmsg_cloexec; if (no_msg_cmsg_cloexec == 0) { rc = recvmsg(fd, msg, flags | 0x40000000); /* MSG_CMSG_CLOEXEC */ if (rc != -1) return rc; if (errno != EINVAL) return UV__ERR(errno); rc = recvmsg(fd, msg, flags); if (rc == -1) return UV__ERR(errno); no_msg_cmsg_cloexec = 1; } else { rc = recvmsg(fd, msg, flags); } #else rc = recvmsg(fd, msg, flags); #endif if (rc == -1) return UV__ERR(errno); if (msg->msg_controllen == 0) return rc; for (cmsg = CMSG_FIRSTHDR(msg); cmsg != NULL; cmsg = CMSG_NXTHDR(msg, cmsg)) if (cmsg->cmsg_type == SCM_RIGHTS) for (pfd = (int*) CMSG_DATA(cmsg), end = (int*) ((char*) cmsg + cmsg->cmsg_len); pfd < end; pfd += 1) uv__cloexec(*pfd, 1); return rc; } int uv_cwd(char* buffer, size_t* size) { char scratch[1 + UV__PATH_MAX]; if (buffer == NULL || size == NULL) return UV_EINVAL; /* Try to read directly into the user's buffer first... */ if (getcwd(buffer, *size) != NULL) goto fixup; if (errno != ERANGE) return UV__ERR(errno); /* ...or into scratch space if the user's buffer is too small * so we can report how much space to provide on the next try. */ if (getcwd(scratch, sizeof(scratch)) == NULL) return UV__ERR(errno); buffer = scratch; fixup: *size = strlen(buffer); if (*size > 1 && buffer[*size - 1] == '/') { *size -= 1; buffer[*size] = '\0'; } if (buffer == scratch) { *size += 1; return UV_ENOBUFS; } return 0; } int uv_chdir(const char* dir) { if (chdir(dir)) return UV__ERR(errno); return 0; } void uv_disable_stdio_inheritance(void) { int fd; /* Set the CLOEXEC flag on all open descriptors. Unconditionally try the * first 16 file descriptors. After that, bail out after the first error. */ for (fd = 0; ; fd++) if (uv__cloexec(fd, 1) && fd > 15) break; } int uv_fileno(const uv_handle_t* handle, uv_os_fd_t* fd) { int fd_out; switch (handle->type) { case UV_TCP: case UV_NAMED_PIPE: case UV_TTY: fd_out = uv__stream_fd((uv_stream_t*) handle); break; case UV_UDP: fd_out = ((uv_udp_t *) handle)->io_watcher.fd; break; case UV_POLL: fd_out = ((uv_poll_t *) handle)->io_watcher.fd; break; default: return UV_EINVAL; } if (uv__is_closing(handle) || fd_out == -1) return UV_EBADF; *fd = fd_out; return 0; } static int uv__run_pending(uv_loop_t* loop) { QUEUE* q; QUEUE pq; uv__io_t* w; if (QUEUE_EMPTY(&loop->pending_queue)) return 0; QUEUE_MOVE(&loop->pending_queue, &pq); while (!QUEUE_EMPTY(&pq)) { q = QUEUE_HEAD(&pq); QUEUE_REMOVE(q); QUEUE_INIT(q); w = QUEUE_DATA(q, uv__io_t, pending_queue); w->cb(loop, w, POLLOUT); } return 1; } static unsigned int next_power_of_two(unsigned int val) { val -= 1; val |= val >> 1; val |= val >> 2; val |= val >> 4; val |= val >> 8; val |= val >> 16; val += 1; return val; } static void maybe_resize(uv_loop_t* loop, unsigned int len) { uv__io_t** watchers; void* fake_watcher_list; void* fake_watcher_count; unsigned int nwatchers; unsigned int i; if (len <= loop->nwatchers) return; /* Preserve fake watcher list and count at the end of the watchers */ if (loop->watchers != NULL) { fake_watcher_list = loop->watchers[loop->nwatchers]; fake_watcher_count = loop->watchers[loop->nwatchers + 1]; } else { fake_watcher_list = NULL; fake_watcher_count = NULL; } nwatchers = next_power_of_two(len + 2) - 2; watchers = uv__reallocf(loop->watchers, (nwatchers + 2) * sizeof(loop->watchers[0])); if (watchers == NULL) abort(); for (i = loop->nwatchers; i < nwatchers; i++) watchers[i] = NULL; watchers[nwatchers] = fake_watcher_list; watchers[nwatchers + 1] = fake_watcher_count; loop->watchers = watchers; loop->nwatchers = nwatchers; } void uv__io_init(uv__io_t* w, uv__io_cb cb, int fd) { assert(cb != NULL); assert(fd >= -1); QUEUE_INIT(&w->pending_queue); QUEUE_INIT(&w->watcher_queue); w->cb = cb; w->fd = fd; w->events = 0; w->pevents = 0; #if defined(UV_HAVE_KQUEUE) w->rcount = 0; w->wcount = 0; #endif /* defined(UV_HAVE_KQUEUE) */ } void uv__io_start(uv_loop_t* loop, uv__io_t* w, unsigned int events) { assert(0 == (events & ~(POLLIN | POLLOUT | UV__POLLRDHUP | UV__POLLPRI))); assert(0 != events); assert(w->fd >= 0); assert(w->fd < INT_MAX); w->pevents |= events; maybe_resize(loop, w->fd + 1); #if !defined(__sun) /* The event ports backend needs to rearm all file descriptors on each and * every tick of the event loop but the other backends allow us to * short-circuit here if the event mask is unchanged. */ if (w->events == w->pevents) return; #endif if (QUEUE_EMPTY(&w->watcher_queue)) QUEUE_INSERT_TAIL(&loop->watcher_queue, &w->watcher_queue); if (loop->watchers[w->fd] == NULL) { loop->watchers[w->fd] = w; loop->nfds++; } } void uv__io_stop(uv_loop_t* loop, uv__io_t* w, unsigned int events) { assert(0 == (events & ~(POLLIN | POLLOUT | UV__POLLRDHUP | UV__POLLPRI))); assert(0 != events); if (w->fd == -1) return; assert(w->fd >= 0); /* Happens when uv__io_stop() is called on a handle that was never started. */ if ((unsigned) w->fd >= loop->nwatchers) return; w->pevents &= ~events; if (w->pevents == 0) { QUEUE_REMOVE(&w->watcher_queue); QUEUE_INIT(&w->watcher_queue); if (loop->watchers[w->fd] != NULL) { assert(loop->watchers[w->fd] == w); assert(loop->nfds > 0); loop->watchers[w->fd] = NULL; loop->nfds--; w->events = 0; } } else if (QUEUE_EMPTY(&w->watcher_queue)) QUEUE_INSERT_TAIL(&loop->watcher_queue, &w->watcher_queue); } void uv__io_close(uv_loop_t* loop, uv__io_t* w) { uv__io_stop(loop, w, POLLIN | POLLOUT | UV__POLLRDHUP | UV__POLLPRI); QUEUE_REMOVE(&w->pending_queue); /* Remove stale events for this file descriptor */ if (w->fd != -1) uv__platform_invalidate_fd(loop, w->fd); } void uv__io_feed(uv_loop_t* loop, uv__io_t* w) { if (QUEUE_EMPTY(&w->pending_queue)) QUEUE_INSERT_TAIL(&loop->pending_queue, &w->pending_queue); } int uv__io_active(const uv__io_t* w, unsigned int events) { assert(0 == (events & ~(POLLIN | POLLOUT | UV__POLLRDHUP | UV__POLLPRI))); assert(0 != events); return 0 != (w->pevents & events); } int uv__fd_exists(uv_loop_t* loop, int fd) { return (unsigned) fd < loop->nwatchers && loop->watchers[fd] != NULL; } int uv_getrusage(uv_rusage_t* rusage) { struct rusage usage; if (getrusage(RUSAGE_SELF, &usage)) return UV__ERR(errno); rusage->ru_utime.tv_sec = usage.ru_utime.tv_sec; rusage->ru_utime.tv_usec = usage.ru_utime.tv_usec; rusage->ru_stime.tv_sec = usage.ru_stime.tv_sec; rusage->ru_stime.tv_usec = usage.ru_stime.tv_usec; #if !defined(__MVS__) && !defined(__HAIKU__) rusage->ru_maxrss = usage.ru_maxrss; rusage->ru_ixrss = usage.ru_ixrss; rusage->ru_idrss = usage.ru_idrss; rusage->ru_isrss = usage.ru_isrss; rusage->ru_minflt = usage.ru_minflt; rusage->ru_majflt = usage.ru_majflt; rusage->ru_nswap = usage.ru_nswap; rusage->ru_inblock = usage.ru_inblock; rusage->ru_oublock = usage.ru_oublock; rusage->ru_msgsnd = usage.ru_msgsnd; rusage->ru_msgrcv = usage.ru_msgrcv; rusage->ru_nsignals = usage.ru_nsignals; rusage->ru_nvcsw = usage.ru_nvcsw; rusage->ru_nivcsw = usage.ru_nivcsw; #endif return 0; } int uv__open_cloexec(const char* path, int flags) { #if defined(O_CLOEXEC) int fd; fd = open(path, flags | O_CLOEXEC); if (fd == -1) return UV__ERR(errno); return fd; #else /* O_CLOEXEC */ int err; int fd; fd = open(path, flags); if (fd == -1) return UV__ERR(errno); err = uv__cloexec(fd, 1); if (err) { uv__close(fd); return err; } return fd; #endif /* O_CLOEXEC */ } int uv__dup2_cloexec(int oldfd, int newfd) { #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__linux__) int r; r = dup3(oldfd, newfd, O_CLOEXEC); if (r == -1) return UV__ERR(errno); return r; #else int err; int r; r = dup2(oldfd, newfd); /* Never retry. */ if (r == -1) return UV__ERR(errno); err = uv__cloexec(newfd, 1); if (err != 0) { uv__close(newfd); return err; } return r; #endif } int uv_os_homedir(char* buffer, size_t* size) { uv_passwd_t pwd; size_t len; int r; /* Check if the HOME environment variable is set first. The task of performing input validation on buffer and size is taken care of by uv_os_getenv(). */ r = uv_os_getenv("HOME", buffer, size); if (r != UV_ENOENT) return r; /* HOME is not set, so call uv__getpwuid_r() */ r = uv__getpwuid_r(&pwd); if (r != 0) { return r; } len = strlen(pwd.homedir); if (len >= *size) { *size = len + 1; uv_os_free_passwd(&pwd); return UV_ENOBUFS; } memcpy(buffer, pwd.homedir, len + 1); *size = len; uv_os_free_passwd(&pwd); return 0; } int uv_os_tmpdir(char* buffer, size_t* size) { const char* buf; size_t len; if (buffer == NULL || size == NULL || *size == 0) return UV_EINVAL; #define CHECK_ENV_VAR(name) \ do { \ buf = getenv(name); \ if (buf != NULL) \ goto return_buffer; \ } \ while (0) /* Check the TMPDIR, TMP, TEMP, and TEMPDIR environment variables in order */ CHECK_ENV_VAR("TMPDIR"); CHECK_ENV_VAR("TMP"); CHECK_ENV_VAR("TEMP"); CHECK_ENV_VAR("TEMPDIR"); #undef CHECK_ENV_VAR /* No temp environment variables defined */ #if defined(__ANDROID__) buf = "/data/local/tmp"; #else buf = "/tmp"; #endif return_buffer: len = strlen(buf); if (len >= *size) { *size = len + 1; return UV_ENOBUFS; } /* The returned directory should not have a trailing slash. */ if (len > 1 && buf[len - 1] == '/') { len--; } memcpy(buffer, buf, len + 1); buffer[len] = '\0'; *size = len; return 0; } int uv__getpwuid_r(uv_passwd_t* pwd) { struct passwd pw; struct passwd* result; char* buf; uid_t uid; size_t bufsize; size_t name_size; size_t homedir_size; size_t shell_size; long initsize; int r; #if defined(__ANDROID_API__) && __ANDROID_API__ < 21 int (*getpwuid_r)(uid_t, struct passwd*, char*, size_t, struct passwd**); getpwuid_r = dlsym(RTLD_DEFAULT, "getpwuid_r"); if (getpwuid_r == NULL) return UV_ENOSYS; #endif if (pwd == NULL) return UV_EINVAL; initsize = sysconf(_SC_GETPW_R_SIZE_MAX); if (initsize <= 0) bufsize = 4096; else bufsize = (size_t) initsize; uid = geteuid(); buf = NULL; for (;;) { uv__free(buf); buf = uv__malloc(bufsize); if (buf == NULL) return UV_ENOMEM; r = getpwuid_r(uid, &pw, buf, bufsize, &result); if (r != ERANGE) break; bufsize *= 2; } if (r != 0) { uv__free(buf); return -r; } if (result == NULL) { uv__free(buf); return UV_ENOENT; } /* Allocate memory for the username, shell, and home directory */ name_size = strlen(pw.pw_name) + 1; homedir_size = strlen(pw.pw_dir) + 1; shell_size = strlen(pw.pw_shell) + 1; pwd->username = uv__malloc(name_size + homedir_size + shell_size); if (pwd->username == NULL) { uv__free(buf); return UV_ENOMEM; } /* Copy the username */ memcpy(pwd->username, pw.pw_name, name_size); /* Copy the home directory */ pwd->homedir = pwd->username + name_size; memcpy(pwd->homedir, pw.pw_dir, homedir_size); /* Copy the shell */ pwd->shell = pwd->homedir + homedir_size; memcpy(pwd->shell, pw.pw_shell, shell_size); /* Copy the uid and gid */ pwd->uid = pw.pw_uid; pwd->gid = pw.pw_gid; uv__free(buf); return 0; } void uv_os_free_passwd(uv_passwd_t* pwd) { if (pwd == NULL) return; /* The memory for name, shell, and homedir are allocated in a single uv__malloc() call. The base of the pointer is stored in pwd->username, so that is the field that needs to be freed. */ uv__free(pwd->username); pwd->username = NULL; pwd->shell = NULL; pwd->homedir = NULL; } int uv_os_get_passwd(uv_passwd_t* pwd) { return uv__getpwuid_r(pwd); } int uv_translate_sys_error(int sys_errno) { /* If < 0 then it's already a libuv error. */ return sys_errno <= 0 ? sys_errno : -sys_errno; } int uv_os_environ(uv_env_item_t** envitems, int* count) { int i, j, cnt; uv_env_item_t* envitem; *envitems = NULL; *count = 0; for (i = 0; environ[i] != NULL; i++); *envitems = uv__calloc(i, sizeof(**envitems)); if (*envitems == NULL) return UV_ENOMEM; for (j = 0, cnt = 0; j < i; j++) { char* buf; char* ptr; if (environ[j] == NULL) break; buf = uv__strdup(environ[j]); if (buf == NULL) goto fail; ptr = strchr(buf, '='); if (ptr == NULL) { uv__free(buf); continue; } *ptr = '\0'; envitem = &(*envitems)[cnt]; envitem->name = buf; envitem->value = ptr + 1; cnt++; } *count = cnt; return 0; fail: for (i = 0; i < cnt; i++) { envitem = &(*envitems)[cnt]; uv__free(envitem->name); } uv__free(*envitems); *envitems = NULL; *count = 0; return UV_ENOMEM; } int uv_os_getenv(const char* name, char* buffer, size_t* size) { char* var; size_t len; if (name == NULL || buffer == NULL || size == NULL || *size == 0) return UV_EINVAL; var = getenv(name); if (var == NULL) return UV_ENOENT; len = strlen(var); if (len >= *size) { *size = len + 1; return UV_ENOBUFS; } memcpy(buffer, var, len + 1); *size = len; return 0; } int uv_os_setenv(const char* name, const char* value) { if (name == NULL || value == NULL) return UV_EINVAL; if (setenv(name, value, 1) != 0) return UV__ERR(errno); return 0; } int uv_os_unsetenv(const char* name) { if (name == NULL) return UV_EINVAL; if (unsetenv(name) != 0) return UV__ERR(errno); return 0; } int uv_os_gethostname(char* buffer, size_t* size) { /* On some platforms, if the input buffer is not large enough, gethostname() succeeds, but truncates the result. libuv can detect this and return ENOBUFS instead by creating a large enough buffer and comparing the hostname length to the size input. */ char buf[UV_MAXHOSTNAMESIZE]; size_t len; if (buffer == NULL || size == NULL || *size == 0) return UV_EINVAL; if (gethostname(buf, sizeof(buf)) != 0) return UV__ERR(errno); buf[sizeof(buf) - 1] = '\0'; /* Null terminate, just to be safe. */ len = strlen(buf); if (len >= *size) { *size = len + 1; return UV_ENOBUFS; } memcpy(buffer, buf, len + 1); *size = len; return 0; } uv_os_fd_t uv_get_osfhandle(int fd) { return fd; } int uv_open_osfhandle(uv_os_fd_t os_fd) { return os_fd; } uv_pid_t uv_os_getpid(void) { return getpid(); } uv_pid_t uv_os_getppid(void) { return getppid(); } int uv_os_getpriority(uv_pid_t pid, int* priority) { int r; if (priority == NULL) return UV_EINVAL; errno = 0; r = getpriority(PRIO_PROCESS, (int) pid); if (r == -1 && errno != 0) return UV__ERR(errno); *priority = r; return 0; } int uv_os_setpriority(uv_pid_t pid, int priority) { if (priority < UV_PRIORITY_HIGHEST || priority > UV_PRIORITY_LOW) return UV_EINVAL; if (setpriority(PRIO_PROCESS, (int) pid, priority) != 0) return UV__ERR(errno); return 0; } int uv_os_uname(uv_utsname_t* buffer) { struct utsname buf; int r; if (buffer == NULL) return UV_EINVAL; if (uname(&buf) == -1) { r = UV__ERR(errno); goto error; } r = uv__strscpy(buffer->sysname, buf.sysname, sizeof(buffer->sysname)); if (r == UV_E2BIG) goto error; #ifdef _AIX r = snprintf(buffer->release, sizeof(buffer->release), "%s.%s", buf.version, buf.release); if (r >= sizeof(buffer->release)) { r = UV_E2BIG; goto error; } #else r = uv__strscpy(buffer->release, buf.release, sizeof(buffer->release)); if (r == UV_E2BIG) goto error; #endif r = uv__strscpy(buffer->version, buf.version, sizeof(buffer->version)); if (r == UV_E2BIG) goto error; #if defined(_AIX) || defined(__PASE__) r = uv__strscpy(buffer->machine, "ppc64", sizeof(buffer->machine)); #else r = uv__strscpy(buffer->machine, buf.machine, sizeof(buffer->machine)); #endif if (r == UV_E2BIG) goto error; return 0; error: buffer->sysname[0] = '\0'; buffer->release[0] = '\0'; buffer->version[0] = '\0'; buffer->machine[0] = '\0'; return r; } int uv__getsockpeername(const uv_handle_t* handle, uv__peersockfunc func, struct sockaddr* name, int* namelen) { socklen_t socklen; uv_os_fd_t fd; int r; r = uv_fileno(handle, &fd); if (r < 0) return r; /* sizeof(socklen_t) != sizeof(int) on some systems. */ socklen = (socklen_t) *namelen; if (func(fd, name, &socklen)) return UV__ERR(errno); *namelen = (int) socklen; return 0; } int uv_gettimeofday(uv_timeval64_t* tv) { struct timeval time; if (tv == NULL) return UV_EINVAL; if (gettimeofday(&time, NULL) != 0) return UV__ERR(errno); tv->tv_sec = (int64_t) time.tv_sec; tv->tv_usec = (int32_t) time.tv_usec; return 0; } void uv_sleep(unsigned int msec) { struct timespec timeout; int rc; timeout.tv_sec = msec / 1000; timeout.tv_nsec = (msec % 1000) * 1000 * 1000; do rc = nanosleep(&timeout, &timeout); while (rc == -1 && errno == EINTR); assert(rc == 0); } ================================================ FILE: external/libuv/src/unix/cygwin.c ================================================ /* Copyright libuv project contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include int uv_uptime(double* uptime) { struct sysinfo info; if (sysinfo(&info) < 0) return UV__ERR(errno); *uptime = info.uptime; return 0; } int uv_resident_set_memory(size_t* rss) { /* FIXME: read /proc/meminfo? */ *rss = 0; return 0; } int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { /* FIXME: read /proc/stat? */ *cpu_infos = NULL; *count = 0; return UV_ENOSYS; } uint64_t uv_get_constrained_memory(void) { return 0; /* Memory constraints are unknown. */ } ================================================ FILE: external/libuv/src/unix/darwin-proctitle.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include #if !TARGET_OS_IPHONE #include "darwin-stub.h" #endif static int uv__pthread_setname_np(const char* name) { char namebuf[64]; /* MAXTHREADNAMESIZE */ int err; strncpy(namebuf, name, sizeof(namebuf) - 1); namebuf[sizeof(namebuf) - 1] = '\0'; err = pthread_setname_np(namebuf); if (err) return UV__ERR(err); return 0; } int uv__set_process_title(const char* title) { #if TARGET_OS_IPHONE return uv__pthread_setname_np(title); #else CFStringRef (*pCFStringCreateWithCString)(CFAllocatorRef, const char*, CFStringEncoding); CFBundleRef (*pCFBundleGetBundleWithIdentifier)(CFStringRef); void *(*pCFBundleGetDataPointerForName)(CFBundleRef, CFStringRef); void *(*pCFBundleGetFunctionPointerForName)(CFBundleRef, CFStringRef); CFTypeRef (*pLSGetCurrentApplicationASN)(void); OSStatus (*pLSSetApplicationInformationItem)(int, CFTypeRef, CFStringRef, CFStringRef, CFDictionaryRef*); void* application_services_handle; void* core_foundation_handle; CFBundleRef launch_services_bundle; CFStringRef* display_name_key; CFDictionaryRef (*pCFBundleGetInfoDictionary)(CFBundleRef); CFBundleRef (*pCFBundleGetMainBundle)(void); CFDictionaryRef (*pLSApplicationCheckIn)(int, CFDictionaryRef); void (*pLSSetApplicationLaunchServicesServerConnectionStatus)(uint64_t, void*); CFTypeRef asn; int err; err = UV_ENOENT; application_services_handle = dlopen("/System/Library/Frameworks/" "ApplicationServices.framework/" "Versions/A/ApplicationServices", RTLD_LAZY | RTLD_LOCAL); core_foundation_handle = dlopen("/System/Library/Frameworks/" "CoreFoundation.framework/" "Versions/A/CoreFoundation", RTLD_LAZY | RTLD_LOCAL); if (application_services_handle == NULL || core_foundation_handle == NULL) goto out; *(void **)(&pCFStringCreateWithCString) = dlsym(core_foundation_handle, "CFStringCreateWithCString"); *(void **)(&pCFBundleGetBundleWithIdentifier) = dlsym(core_foundation_handle, "CFBundleGetBundleWithIdentifier"); *(void **)(&pCFBundleGetDataPointerForName) = dlsym(core_foundation_handle, "CFBundleGetDataPointerForName"); *(void **)(&pCFBundleGetFunctionPointerForName) = dlsym(core_foundation_handle, "CFBundleGetFunctionPointerForName"); if (pCFStringCreateWithCString == NULL || pCFBundleGetBundleWithIdentifier == NULL || pCFBundleGetDataPointerForName == NULL || pCFBundleGetFunctionPointerForName == NULL) { goto out; } #define S(s) pCFStringCreateWithCString(NULL, (s), kCFStringEncodingUTF8) launch_services_bundle = pCFBundleGetBundleWithIdentifier(S("com.apple.LaunchServices")); if (launch_services_bundle == NULL) goto out; *(void **)(&pLSGetCurrentApplicationASN) = pCFBundleGetFunctionPointerForName(launch_services_bundle, S("_LSGetCurrentApplicationASN")); if (pLSGetCurrentApplicationASN == NULL) goto out; *(void **)(&pLSSetApplicationInformationItem) = pCFBundleGetFunctionPointerForName(launch_services_bundle, S("_LSSetApplicationInformationItem")); if (pLSSetApplicationInformationItem == NULL) goto out; display_name_key = pCFBundleGetDataPointerForName(launch_services_bundle, S("_kLSDisplayNameKey")); if (display_name_key == NULL || *display_name_key == NULL) goto out; *(void **)(&pCFBundleGetInfoDictionary) = dlsym(core_foundation_handle, "CFBundleGetInfoDictionary"); *(void **)(&pCFBundleGetMainBundle) = dlsym(core_foundation_handle, "CFBundleGetMainBundle"); if (pCFBundleGetInfoDictionary == NULL || pCFBundleGetMainBundle == NULL) goto out; *(void **)(&pLSApplicationCheckIn) = pCFBundleGetFunctionPointerForName( launch_services_bundle, S("_LSApplicationCheckIn")); if (pLSApplicationCheckIn == NULL) goto out; *(void **)(&pLSSetApplicationLaunchServicesServerConnectionStatus) = pCFBundleGetFunctionPointerForName( launch_services_bundle, S("_LSSetApplicationLaunchServicesServerConnectionStatus")); if (pLSSetApplicationLaunchServicesServerConnectionStatus == NULL) goto out; pLSSetApplicationLaunchServicesServerConnectionStatus(0, NULL); /* Check into process manager?! */ pLSApplicationCheckIn(-2, pCFBundleGetInfoDictionary(pCFBundleGetMainBundle())); asn = pLSGetCurrentApplicationASN(); err = UV_EBUSY; if (asn == NULL) goto out; err = UV_EINVAL; if (pLSSetApplicationInformationItem(-2, /* Magic value. */ asn, *display_name_key, S(title), NULL) != noErr) { goto out; } uv__pthread_setname_np(title); /* Don't care if it fails. */ err = 0; out: if (core_foundation_handle != NULL) dlclose(core_foundation_handle); if (application_services_handle != NULL) dlclose(application_services_handle); return err; #endif /* !TARGET_OS_IPHONE */ } ================================================ FILE: external/libuv/src/unix/darwin-stub.h ================================================ /* Copyright libuv project contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #ifndef UV_DARWIN_STUB_H_ #define UV_DARWIN_STUB_H_ #include struct CFArrayCallBacks; struct CFRunLoopSourceContext; struct FSEventStreamContext; typedef double CFAbsoluteTime; typedef double CFTimeInterval; typedef int FSEventStreamEventFlags; typedef int OSStatus; typedef long CFIndex; typedef struct CFArrayCallBacks CFArrayCallBacks; typedef struct CFRunLoopSourceContext CFRunLoopSourceContext; typedef struct FSEventStreamContext FSEventStreamContext; typedef uint32_t FSEventStreamCreateFlags; typedef uint64_t FSEventStreamEventId; typedef unsigned CFStringEncoding; typedef void* CFAllocatorRef; typedef void* CFArrayRef; typedef void* CFBundleRef; typedef void* CFDictionaryRef; typedef void* CFRunLoopRef; typedef void* CFRunLoopSourceRef; typedef void* CFStringRef; typedef void* CFTypeRef; typedef void* FSEventStreamRef; typedef void (*FSEventStreamCallback)(const FSEventStreamRef, void*, size_t, void*, const FSEventStreamEventFlags*, const FSEventStreamEventId*); struct CFRunLoopSourceContext { CFIndex version; void* info; void* pad[7]; void (*perform)(void*); }; struct FSEventStreamContext { CFIndex version; void* info; void* pad[3]; }; static const CFStringEncoding kCFStringEncodingUTF8 = 0x8000100; static const OSStatus noErr = 0; static const FSEventStreamEventId kFSEventStreamEventIdSinceNow = -1; static const int kFSEventStreamCreateFlagNoDefer = 2; static const int kFSEventStreamCreateFlagFileEvents = 16; static const int kFSEventStreamEventFlagEventIdsWrapped = 8; static const int kFSEventStreamEventFlagHistoryDone = 16; static const int kFSEventStreamEventFlagItemChangeOwner = 0x4000; static const int kFSEventStreamEventFlagItemCreated = 0x100; static const int kFSEventStreamEventFlagItemFinderInfoMod = 0x2000; static const int kFSEventStreamEventFlagItemInodeMetaMod = 0x400; static const int kFSEventStreamEventFlagItemIsDir = 0x20000; static const int kFSEventStreamEventFlagItemModified = 0x1000; static const int kFSEventStreamEventFlagItemRemoved = 0x200; static const int kFSEventStreamEventFlagItemRenamed = 0x800; static const int kFSEventStreamEventFlagItemXattrMod = 0x8000; static const int kFSEventStreamEventFlagKernelDropped = 4; static const int kFSEventStreamEventFlagMount = 64; static const int kFSEventStreamEventFlagRootChanged = 32; static const int kFSEventStreamEventFlagUnmount = 128; static const int kFSEventStreamEventFlagUserDropped = 2; #endif /* UV_DARWIN_STUB_H_ */ ================================================ FILE: external/libuv/src/unix/darwin.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include /* _NSGetExecutablePath */ #include #include #include /* sysconf */ int uv__platform_loop_init(uv_loop_t* loop) { loop->cf_state = NULL; if (uv__kqueue_init(loop)) return UV__ERR(errno); return 0; } void uv__platform_loop_delete(uv_loop_t* loop) { uv__fsevents_loop_delete(loop); } uint64_t uv__hrtime(uv_clocktype_t type) { static mach_timebase_info_data_t info; if ((ACCESS_ONCE(uint32_t, info.numer) == 0 || ACCESS_ONCE(uint32_t, info.denom) == 0) && mach_timebase_info(&info) != KERN_SUCCESS) abort(); return mach_absolute_time() * info.numer / info.denom; } int uv_exepath(char* buffer, size_t* size) { /* realpath(exepath) may be > PATH_MAX so double it to be on the safe side. */ char abspath[PATH_MAX * 2 + 1]; char exepath[PATH_MAX + 1]; uint32_t exepath_size; size_t abspath_size; if (buffer == NULL || size == NULL || *size == 0) return UV_EINVAL; exepath_size = sizeof(exepath); if (_NSGetExecutablePath(exepath, &exepath_size)) return UV_EIO; if (realpath(exepath, abspath) != abspath) return UV__ERR(errno); abspath_size = strlen(abspath); if (abspath_size == 0) return UV_EIO; *size -= 1; if (*size > abspath_size) *size = abspath_size; memcpy(buffer, abspath, *size); buffer[*size] = '\0'; return 0; } uint64_t uv_get_free_memory(void) { vm_statistics_data_t info; mach_msg_type_number_t count = sizeof(info) / sizeof(integer_t); if (host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&info, &count) != KERN_SUCCESS) { return UV_EINVAL; /* FIXME(bnoordhuis) Translate error. */ } return (uint64_t) info.free_count * sysconf(_SC_PAGESIZE); } uint64_t uv_get_total_memory(void) { uint64_t info; int which[] = {CTL_HW, HW_MEMSIZE}; size_t size = sizeof(info); if (sysctl(which, ARRAY_SIZE(which), &info, &size, NULL, 0)) return UV__ERR(errno); return (uint64_t) info; } uint64_t uv_get_constrained_memory(void) { return 0; /* Memory constraints are unknown. */ } void uv_loadavg(double avg[3]) { struct loadavg info; size_t size = sizeof(info); int which[] = {CTL_VM, VM_LOADAVG}; if (sysctl(which, ARRAY_SIZE(which), &info, &size, NULL, 0) < 0) return; avg[0] = (double) info.ldavg[0] / info.fscale; avg[1] = (double) info.ldavg[1] / info.fscale; avg[2] = (double) info.ldavg[2] / info.fscale; } int uv_resident_set_memory(size_t* rss) { mach_msg_type_number_t count; task_basic_info_data_t info; kern_return_t err; count = TASK_BASIC_INFO_COUNT; err = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t) &info, &count); (void) &err; /* task_info(TASK_BASIC_INFO) cannot really fail. Anything other than * KERN_SUCCESS implies a libuv bug. */ assert(err == KERN_SUCCESS); *rss = info.resident_size; return 0; } int uv_uptime(double* uptime) { time_t now; struct timeval info; size_t size = sizeof(info); static int which[] = {CTL_KERN, KERN_BOOTTIME}; if (sysctl(which, ARRAY_SIZE(which), &info, &size, NULL, 0)) return UV__ERR(errno); now = time(NULL); *uptime = now - info.tv_sec; return 0; } int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { unsigned int ticks = (unsigned int)sysconf(_SC_CLK_TCK), multiplier = ((uint64_t)1000L / ticks); char model[512]; uint64_t cpuspeed; size_t size; unsigned int i; natural_t numcpus; mach_msg_type_number_t msg_type; processor_cpu_load_info_data_t *info; uv_cpu_info_t* cpu_info; size = sizeof(model); if (sysctlbyname("machdep.cpu.brand_string", &model, &size, NULL, 0) && sysctlbyname("hw.model", &model, &size, NULL, 0)) { return UV__ERR(errno); } size = sizeof(cpuspeed); if (sysctlbyname("hw.cpufrequency", &cpuspeed, &size, NULL, 0)) return UV__ERR(errno); if (host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &numcpus, (processor_info_array_t*)&info, &msg_type) != KERN_SUCCESS) { return UV_EINVAL; /* FIXME(bnoordhuis) Translate error. */ } *cpu_infos = uv__malloc(numcpus * sizeof(**cpu_infos)); if (!(*cpu_infos)) { vm_deallocate(mach_task_self(), (vm_address_t)info, msg_type); return UV_ENOMEM; } *count = numcpus; for (i = 0; i < numcpus; i++) { cpu_info = &(*cpu_infos)[i]; cpu_info->cpu_times.user = (uint64_t)(info[i].cpu_ticks[0]) * multiplier; cpu_info->cpu_times.nice = (uint64_t)(info[i].cpu_ticks[3]) * multiplier; cpu_info->cpu_times.sys = (uint64_t)(info[i].cpu_ticks[1]) * multiplier; cpu_info->cpu_times.idle = (uint64_t)(info[i].cpu_ticks[2]) * multiplier; cpu_info->cpu_times.irq = 0; cpu_info->model = uv__strdup(model); cpu_info->speed = cpuspeed/1000000; } vm_deallocate(mach_task_self(), (vm_address_t)info, msg_type); return 0; } ================================================ FILE: external/libuv/src/unix/dl.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include static int uv__dlerror(uv_lib_t* lib); int uv_dlopen(const char* filename, uv_lib_t* lib) { dlerror(); /* Reset error status. */ lib->errmsg = NULL; lib->handle = dlopen(filename, RTLD_LAZY); return lib->handle ? 0 : uv__dlerror(lib); } void uv_dlclose(uv_lib_t* lib) { uv__free(lib->errmsg); lib->errmsg = NULL; if (lib->handle) { /* Ignore errors. No good way to signal them without leaking memory. */ dlclose(lib->handle); lib->handle = NULL; } } int uv_dlsym(uv_lib_t* lib, const char* name, void** ptr) { dlerror(); /* Reset error status. */ *ptr = dlsym(lib->handle, name); return uv__dlerror(lib); } const char* uv_dlerror(const uv_lib_t* lib) { return lib->errmsg ? lib->errmsg : "no error"; } static int uv__dlerror(uv_lib_t* lib) { const char* errmsg; uv__free(lib->errmsg); errmsg = dlerror(); if (errmsg) { lib->errmsg = uv__strdup(errmsg); return -1; } else { lib->errmsg = NULL; return 0; } } ================================================ FILE: external/libuv/src/unix/freebsd.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include #include #include #include /* VM_LOADAVG */ #include #include #include /* sysconf */ #include #ifndef CPUSTATES # define CPUSTATES 5U #endif #ifndef CP_USER # define CP_USER 0 # define CP_NICE 1 # define CP_SYS 2 # define CP_IDLE 3 # define CP_INTR 4 #endif int uv__platform_loop_init(uv_loop_t* loop) { return uv__kqueue_init(loop); } void uv__platform_loop_delete(uv_loop_t* loop) { } #ifdef __DragonFly__ int uv_exepath(char* buffer, size_t* size) { char abspath[PATH_MAX * 2 + 1]; ssize_t abspath_size; if (buffer == NULL || size == NULL || *size == 0) return UV_EINVAL; abspath_size = readlink("/proc/curproc/file", abspath, sizeof(abspath)); if (abspath_size < 0) return UV__ERR(errno); assert(abspath_size > 0); *size -= 1; if (*size > abspath_size) *size = abspath_size; memcpy(buffer, abspath, *size); buffer[*size] = '\0'; return 0; } #else int uv_exepath(char* buffer, size_t* size) { char abspath[PATH_MAX * 2 + 1]; int mib[4]; size_t abspath_size; if (buffer == NULL || size == NULL || *size == 0) return UV_EINVAL; mib[0] = CTL_KERN; mib[1] = KERN_PROC; mib[2] = KERN_PROC_PATHNAME; mib[3] = -1; abspath_size = sizeof abspath; if (sysctl(mib, ARRAY_SIZE(mib), abspath, &abspath_size, NULL, 0)) return UV__ERR(errno); assert(abspath_size > 0); abspath_size -= 1; *size -= 1; if (*size > abspath_size) *size = abspath_size; memcpy(buffer, abspath, *size); buffer[*size] = '\0'; return 0; } #endif uint64_t uv_get_free_memory(void) { int freecount; size_t size = sizeof(freecount); if (sysctlbyname("vm.stats.vm.v_free_count", &freecount, &size, NULL, 0)) return UV__ERR(errno); return (uint64_t) freecount * sysconf(_SC_PAGESIZE); } uint64_t uv_get_total_memory(void) { unsigned long info; int which[] = {CTL_HW, HW_PHYSMEM}; size_t size = sizeof(info); if (sysctl(which, ARRAY_SIZE(which), &info, &size, NULL, 0)) return UV__ERR(errno); return (uint64_t) info; } uint64_t uv_get_constrained_memory(void) { return 0; /* Memory constraints are unknown. */ } void uv_loadavg(double avg[3]) { struct loadavg info; size_t size = sizeof(info); int which[] = {CTL_VM, VM_LOADAVG}; if (sysctl(which, ARRAY_SIZE(which), &info, &size, NULL, 0) < 0) return; avg[0] = (double) info.ldavg[0] / info.fscale; avg[1] = (double) info.ldavg[1] / info.fscale; avg[2] = (double) info.ldavg[2] / info.fscale; } int uv_resident_set_memory(size_t* rss) { struct kinfo_proc kinfo; size_t page_size; size_t kinfo_size; int mib[4]; mib[0] = CTL_KERN; mib[1] = KERN_PROC; mib[2] = KERN_PROC_PID; mib[3] = getpid(); kinfo_size = sizeof(kinfo); if (sysctl(mib, ARRAY_SIZE(mib), &kinfo, &kinfo_size, NULL, 0)) return UV__ERR(errno); page_size = getpagesize(); #ifdef __DragonFly__ *rss = kinfo.kp_vm_rssize * page_size; #else *rss = kinfo.ki_rssize * page_size; #endif return 0; } int uv_uptime(double* uptime) { int r; struct timespec sp; r = clock_gettime(CLOCK_MONOTONIC, &sp); if (r) return UV__ERR(errno); *uptime = sp.tv_sec; return 0; } int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { unsigned int ticks = (unsigned int)sysconf(_SC_CLK_TCK), multiplier = ((uint64_t)1000L / ticks), cpuspeed, maxcpus, cur = 0; uv_cpu_info_t* cpu_info; const char* maxcpus_key; const char* cptimes_key; const char* model_key; char model[512]; long* cp_times; int numcpus; size_t size; int i; #if defined(__DragonFly__) /* This is not quite correct but DragonFlyBSD doesn't seem to have anything * comparable to kern.smp.maxcpus or kern.cp_times (kern.cp_time is a total, * not per CPU). At least this stops uv_cpu_info() from failing completely. */ maxcpus_key = "hw.ncpu"; cptimes_key = "kern.cp_time"; #else maxcpus_key = "kern.smp.maxcpus"; cptimes_key = "kern.cp_times"; #endif #if defined(__arm__) || defined(__aarch64__) /* The key hw.model and hw.clockrate are not available on FreeBSD ARM. */ model_key = "hw.machine"; cpuspeed = 0; #else model_key = "hw.model"; size = sizeof(cpuspeed); if (sysctlbyname("hw.clockrate", &cpuspeed, &size, NULL, 0)) return -errno; #endif size = sizeof(model); if (sysctlbyname(model_key, &model, &size, NULL, 0)) return UV__ERR(errno); size = sizeof(numcpus); if (sysctlbyname("hw.ncpu", &numcpus, &size, NULL, 0)) return UV__ERR(errno); *cpu_infos = uv__malloc(numcpus * sizeof(**cpu_infos)); if (!(*cpu_infos)) return UV_ENOMEM; *count = numcpus; /* kern.cp_times on FreeBSD i386 gives an array up to maxcpus instead of * ncpu. */ size = sizeof(maxcpus); if (sysctlbyname(maxcpus_key, &maxcpus, &size, NULL, 0)) { uv__free(*cpu_infos); return UV__ERR(errno); } size = maxcpus * CPUSTATES * sizeof(long); cp_times = uv__malloc(size); if (cp_times == NULL) { uv__free(*cpu_infos); return UV_ENOMEM; } if (sysctlbyname(cptimes_key, cp_times, &size, NULL, 0)) { uv__free(cp_times); uv__free(*cpu_infos); return UV__ERR(errno); } for (i = 0; i < numcpus; i++) { cpu_info = &(*cpu_infos)[i]; cpu_info->cpu_times.user = (uint64_t)(cp_times[CP_USER+cur]) * multiplier; cpu_info->cpu_times.nice = (uint64_t)(cp_times[CP_NICE+cur]) * multiplier; cpu_info->cpu_times.sys = (uint64_t)(cp_times[CP_SYS+cur]) * multiplier; cpu_info->cpu_times.idle = (uint64_t)(cp_times[CP_IDLE+cur]) * multiplier; cpu_info->cpu_times.irq = (uint64_t)(cp_times[CP_INTR+cur]) * multiplier; cpu_info->model = uv__strdup(model); cpu_info->speed = cpuspeed; cur+=CPUSTATES; } uv__free(cp_times); return 0; } int uv__sendmmsg(int fd, struct uv__mmsghdr* mmsg, unsigned int vlen, unsigned int flags) { #if __FreeBSD__ >= 11 return sendmmsg(fd, mmsg, vlen, flags); #else return errno = ENOSYS, -1; #endif } int uv__recvmmsg(int fd, struct uv__mmsghdr* mmsg, unsigned int vlen, unsigned int flags, struct timespec* timeout) { #if __FreeBSD__ >= 11 return recvmmsg(fd, mmsg, vlen, flags, timeout); #else return errno = ENOSYS, -1; #endif } ================================================ FILE: external/libuv/src/unix/fs.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ /* Caveat emptor: this file deviates from the libuv convention of returning * negated errno codes. Most uv_fs_*() functions map directly to the system * call of the same name. For more complex wrappers, it's easier to just * return -1 with errno set. The dispatcher in uv__fs_work() takes care of * getting the errno to the right place (req->result or as the return value.) */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include /* PATH_MAX */ #include #include #include #include #include #include #include #include #include #if defined(__DragonFly__) || \ defined(__FreeBSD__) || \ defined(__FreeBSD_kernel__) || \ defined(__OpenBSD__) || \ defined(__NetBSD__) # define HAVE_PREADV 1 #else # define HAVE_PREADV 0 #endif #if defined(__linux__) || defined(__sun) # include #endif #if defined(__APPLE__) # include #elif defined(__linux__) && !defined(FICLONE) # include # define FICLONE _IOW(0x94, 9, int) #endif #if defined(_AIX) && !defined(_AIX71) # include #endif #if defined(__APPLE__) || \ defined(__DragonFly__) || \ defined(__FreeBSD__) || \ defined(__FreeBSD_kernel__) || \ defined(__OpenBSD__) || \ defined(__NetBSD__) # include # include #elif defined(__sun) || defined(__MVS__) || defined(__NetBSD__) || defined(__HAIKU__) # include #else # include #endif #if defined(_AIX) && _XOPEN_SOURCE <= 600 extern char *mkdtemp(char *template); /* See issue #740 on AIX < 7 */ #endif #define INIT(subtype) \ do { \ if (req == NULL) \ return UV_EINVAL; \ UV_REQ_INIT(req, UV_FS); \ req->fs_type = UV_FS_ ## subtype; \ req->result = 0; \ req->ptr = NULL; \ req->loop = loop; \ req->path = NULL; \ req->new_path = NULL; \ req->bufs = NULL; \ req->cb = cb; \ } \ while (0) #define PATH \ do { \ assert(path != NULL); \ if (cb == NULL) { \ req->path = path; \ } else { \ req->path = uv__strdup(path); \ if (req->path == NULL) \ return UV_ENOMEM; \ } \ } \ while (0) #define PATH2 \ do { \ if (cb == NULL) { \ req->path = path; \ req->new_path = new_path; \ } else { \ size_t path_len; \ size_t new_path_len; \ path_len = strlen(path) + 1; \ new_path_len = strlen(new_path) + 1; \ req->path = uv__malloc(path_len + new_path_len); \ if (req->path == NULL) \ return UV_ENOMEM; \ req->new_path = req->path + path_len; \ memcpy((void*) req->path, path, path_len); \ memcpy((void*) req->new_path, new_path, new_path_len); \ } \ } \ while (0) #define POST \ do { \ if (cb != NULL) { \ uv__req_register(loop, req); \ uv__work_submit(loop, \ &req->work_req, \ UV__WORK_FAST_IO, \ uv__fs_work, \ uv__fs_done); \ return 0; \ } \ else { \ uv__fs_work(&req->work_req); \ return req->result; \ } \ } \ while (0) static int uv__fs_close(int fd) { int rc; rc = uv__close_nocancel(fd); if (rc == -1) if (errno == EINTR || errno == EINPROGRESS) rc = 0; /* The close is in progress, not an error. */ return rc; } static ssize_t uv__fs_fsync(uv_fs_t* req) { #if defined(__APPLE__) /* Apple's fdatasync and fsync explicitly do NOT flush the drive write cache * to the drive platters. This is in contrast to Linux's fdatasync and fsync * which do, according to recent man pages. F_FULLFSYNC is Apple's equivalent * for flushing buffered data to permanent storage. If F_FULLFSYNC is not * supported by the file system we fall back to F_BARRIERFSYNC or fsync(). * This is the same approach taken by sqlite, except sqlite does not issue * an F_BARRIERFSYNC call. */ int r; r = fcntl(req->file, F_FULLFSYNC); if (r != 0) r = fcntl(req->file, 85 /* F_BARRIERFSYNC */); /* fsync + barrier */ if (r != 0) r = fsync(req->file); return r; #else return fsync(req->file); #endif } static ssize_t uv__fs_fdatasync(uv_fs_t* req) { #if defined(__linux__) || defined(__sun) || defined(__NetBSD__) return fdatasync(req->file); #elif defined(__APPLE__) /* See the comment in uv__fs_fsync. */ return uv__fs_fsync(req); #else return fsync(req->file); #endif } UV_UNUSED(static struct timespec uv__fs_to_timespec(double time)) { struct timespec ts; ts.tv_sec = time; ts.tv_nsec = (uint64_t)(time * 1000000) % 1000000 * 1000; return ts; } UV_UNUSED(static struct timeval uv__fs_to_timeval(double time)) { struct timeval tv; tv.tv_sec = time; tv.tv_usec = (uint64_t)(time * 1000000) % 1000000; return tv; } static ssize_t uv__fs_futime(uv_fs_t* req) { #if defined(__linux__) \ || defined(_AIX71) \ || defined(__HAIKU__) /* utimesat() has nanosecond resolution but we stick to microseconds * for the sake of consistency with other platforms. */ struct timespec ts[2]; ts[0] = uv__fs_to_timespec(req->atime); ts[1] = uv__fs_to_timespec(req->mtime); #if defined(__ANDROID_API__) && __ANDROID_API__ < 21 return utimensat(req->file, NULL, ts, 0); #else return futimens(req->file, ts); #endif #elif defined(__APPLE__) \ || defined(__DragonFly__) \ || defined(__FreeBSD__) \ || defined(__FreeBSD_kernel__) \ || defined(__NetBSD__) \ || defined(__OpenBSD__) \ || defined(__sun) struct timeval tv[2]; tv[0] = uv__fs_to_timeval(req->atime); tv[1] = uv__fs_to_timeval(req->mtime); # if defined(__sun) return futimesat(req->file, NULL, tv); # else return futimes(req->file, tv); # endif #elif defined(__MVS__) attrib_t atr; memset(&atr, 0, sizeof(atr)); atr.att_mtimechg = 1; atr.att_atimechg = 1; atr.att_mtime = req->mtime; atr.att_atime = req->atime; return __fchattr(req->file, &atr, sizeof(atr)); #else errno = ENOSYS; return -1; #endif } static ssize_t uv__fs_mkdtemp(uv_fs_t* req) { return mkdtemp((char*) req->path) ? 0 : -1; } static int (*uv__mkostemp)(char*, int); static void uv__mkostemp_initonce(void) { /* z/os doesn't have RTLD_DEFAULT but that's okay * because it doesn't have mkostemp(O_CLOEXEC) either. */ #ifdef RTLD_DEFAULT uv__mkostemp = (int (*)(char*, int)) dlsym(RTLD_DEFAULT, "mkostemp"); /* We don't care about errors, but we do want to clean them up. * If there has been no error, then dlerror() will just return * NULL. */ dlerror(); #endif /* RTLD_DEFAULT */ } static int uv__fs_mkstemp(uv_fs_t* req) { static uv_once_t once = UV_ONCE_INIT; int r; #ifdef O_CLOEXEC static int no_cloexec_support; #endif static const char pattern[] = "XXXXXX"; static const size_t pattern_size = sizeof(pattern) - 1; char* path; size_t path_length; path = (char*) req->path; path_length = strlen(path); /* EINVAL can be returned for 2 reasons: 1. The template's last 6 characters were not XXXXXX 2. open() didn't support O_CLOEXEC We want to avoid going to the fallback path in case of 1, so it's manually checked before. */ if (path_length < pattern_size || strcmp(path + path_length - pattern_size, pattern)) { errno = EINVAL; return -1; } uv_once(&once, uv__mkostemp_initonce); #ifdef O_CLOEXEC if (no_cloexec_support == 0 && uv__mkostemp != NULL) { r = uv__mkostemp(path, O_CLOEXEC); if (r >= 0) return r; /* If mkostemp() returns EINVAL, it means the kernel doesn't support O_CLOEXEC, so we just fallback to mkstemp() below. */ if (errno != EINVAL) return r; /* We set the static variable so that next calls don't even try to use mkostemp. */ no_cloexec_support = 1; } #endif /* O_CLOEXEC */ if (req->cb != NULL) uv_rwlock_rdlock(&req->loop->cloexec_lock); r = mkstemp(path); /* In case of failure `uv__cloexec` will leave error in `errno`, * so it is enough to just set `r` to `-1`. */ if (r >= 0 && uv__cloexec(r, 1) != 0) { r = uv__close(r); if (r != 0) abort(); r = -1; } if (req->cb != NULL) uv_rwlock_rdunlock(&req->loop->cloexec_lock); return r; } static ssize_t uv__fs_open(uv_fs_t* req) { #ifdef O_CLOEXEC return open(req->path, req->flags | O_CLOEXEC, req->mode); #else /* O_CLOEXEC */ int r; if (req->cb != NULL) uv_rwlock_rdlock(&req->loop->cloexec_lock); r = open(req->path, req->flags, req->mode); /* In case of failure `uv__cloexec` will leave error in `errno`, * so it is enough to just set `r` to `-1`. */ if (r >= 0 && uv__cloexec(r, 1) != 0) { r = uv__close(r); if (r != 0) abort(); r = -1; } if (req->cb != NULL) uv_rwlock_rdunlock(&req->loop->cloexec_lock); return r; #endif /* O_CLOEXEC */ } #if !HAVE_PREADV static ssize_t uv__fs_preadv(uv_file fd, uv_buf_t* bufs, unsigned int nbufs, off_t off) { uv_buf_t* buf; uv_buf_t* end; ssize_t result; ssize_t rc; size_t pos; assert(nbufs > 0); result = 0; pos = 0; buf = bufs + 0; end = bufs + nbufs; for (;;) { do rc = pread(fd, buf->base + pos, buf->len - pos, off + result); while (rc == -1 && errno == EINTR); if (rc == 0) break; if (rc == -1 && result == 0) return UV__ERR(errno); if (rc == -1) break; /* We read some data so return that, ignore the error. */ pos += rc; result += rc; if (pos < buf->len) continue; pos = 0; buf += 1; if (buf == end) break; } return result; } #endif static ssize_t uv__fs_read(uv_fs_t* req) { #if defined(__linux__) static int no_preadv; #endif unsigned int iovmax; ssize_t result; iovmax = uv__getiovmax(); if (req->nbufs > iovmax) req->nbufs = iovmax; if (req->off < 0) { if (req->nbufs == 1) result = read(req->file, req->bufs[0].base, req->bufs[0].len); else result = readv(req->file, (struct iovec*) req->bufs, req->nbufs); } else { if (req->nbufs == 1) { result = pread(req->file, req->bufs[0].base, req->bufs[0].len, req->off); goto done; } #if HAVE_PREADV result = preadv(req->file, (struct iovec*) req->bufs, req->nbufs, req->off); #else # if defined(__linux__) if (no_preadv) retry: # endif { result = uv__fs_preadv(req->file, req->bufs, req->nbufs, req->off); } # if defined(__linux__) else { result = uv__preadv(req->file, (struct iovec*)req->bufs, req->nbufs, req->off); if (result == -1 && errno == ENOSYS) { no_preadv = 1; goto retry; } } # endif #endif } done: /* Early cleanup of bufs allocation, since we're done with it. */ if (req->bufs != req->bufsml) uv__free(req->bufs); req->bufs = NULL; req->nbufs = 0; #ifdef __PASE__ /* PASE returns EOPNOTSUPP when reading a directory, convert to EISDIR */ if (result == -1 && errno == EOPNOTSUPP) { struct stat buf; ssize_t rc; rc = fstat(req->file, &buf); if (rc == 0 && S_ISDIR(buf.st_mode)) { errno = EISDIR; } } #endif return result; } #if defined(__APPLE__) && !defined(MAC_OS_X_VERSION_10_8) #define UV_CONST_DIRENT uv__dirent_t #else #define UV_CONST_DIRENT const uv__dirent_t #endif static int uv__fs_scandir_filter(UV_CONST_DIRENT* dent) { return strcmp(dent->d_name, ".") != 0 && strcmp(dent->d_name, "..") != 0; } static int uv__fs_scandir_sort(UV_CONST_DIRENT** a, UV_CONST_DIRENT** b) { return strcmp((*a)->d_name, (*b)->d_name); } static ssize_t uv__fs_scandir(uv_fs_t* req) { uv__dirent_t** dents; int n; dents = NULL; n = scandir(req->path, &dents, uv__fs_scandir_filter, uv__fs_scandir_sort); /* NOTE: We will use nbufs as an index field */ req->nbufs = 0; if (n == 0) { /* OS X still needs to deallocate some memory. * Memory was allocated using the system allocator, so use free() here. */ free(dents); dents = NULL; } else if (n == -1) { return n; } req->ptr = dents; return n; } static int uv__fs_opendir(uv_fs_t* req) { uv_dir_t* dir; dir = uv__malloc(sizeof(*dir)); if (dir == NULL) goto error; dir->dir = opendir(req->path); if (dir->dir == NULL) goto error; req->ptr = dir; return 0; error: uv__free(dir); req->ptr = NULL; return -1; } static int uv__fs_readdir(uv_fs_t* req) { uv_dir_t* dir; uv_dirent_t* dirent; struct dirent* res; unsigned int dirent_idx; unsigned int i; dir = req->ptr; dirent_idx = 0; while (dirent_idx < dir->nentries) { /* readdir() returns NULL on end of directory, as well as on error. errno is used to differentiate between the two conditions. */ errno = 0; res = readdir(dir->dir); if (res == NULL) { if (errno != 0) goto error; break; } if (strcmp(res->d_name, ".") == 0 || strcmp(res->d_name, "..") == 0) continue; dirent = &dir->dirents[dirent_idx]; dirent->name = uv__strdup(res->d_name); if (dirent->name == NULL) goto error; dirent->type = uv__fs_get_dirent_type(res); ++dirent_idx; } return dirent_idx; error: for (i = 0; i < dirent_idx; ++i) { uv__free((char*) dir->dirents[i].name); dir->dirents[i].name = NULL; } return -1; } static int uv__fs_closedir(uv_fs_t* req) { uv_dir_t* dir; dir = req->ptr; if (dir->dir != NULL) { closedir(dir->dir); dir->dir = NULL; } uv__free(req->ptr); req->ptr = NULL; return 0; } static int uv__fs_statfs(uv_fs_t* req) { uv_statfs_t* stat_fs; #if defined(__sun) || defined(__MVS__) || defined(__NetBSD__) || defined(__HAIKU__) struct statvfs buf; if (0 != statvfs(req->path, &buf)) #else struct statfs buf; if (0 != statfs(req->path, &buf)) #endif /* defined(__sun) */ return -1; stat_fs = uv__malloc(sizeof(*stat_fs)); if (stat_fs == NULL) { errno = ENOMEM; return -1; } #if defined(__sun) || defined(__MVS__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__) stat_fs->f_type = 0; /* f_type is not supported. */ #else stat_fs->f_type = buf.f_type; #endif stat_fs->f_bsize = buf.f_bsize; stat_fs->f_blocks = buf.f_blocks; stat_fs->f_bfree = buf.f_bfree; stat_fs->f_bavail = buf.f_bavail; stat_fs->f_files = buf.f_files; stat_fs->f_ffree = buf.f_ffree; req->ptr = stat_fs; return 0; } static ssize_t uv__fs_pathmax_size(const char* path) { ssize_t pathmax; pathmax = pathconf(path, _PC_PATH_MAX); if (pathmax == -1) pathmax = UV__PATH_MAX; return pathmax; } static ssize_t uv__fs_readlink(uv_fs_t* req) { ssize_t maxlen; ssize_t len; char* buf; #if defined(_POSIX_PATH_MAX) || defined(PATH_MAX) maxlen = uv__fs_pathmax_size(req->path); #else /* We may not have a real PATH_MAX. Read size of link. */ struct stat st; int ret; ret = lstat(req->path, &st); if (ret != 0) return -1; if (!S_ISLNK(st.st_mode)) { errno = EINVAL; return -1; } maxlen = st.st_size; /* According to readlink(2) lstat can report st_size == 0 for some symlinks, such as those in /proc or /sys. */ if (maxlen == 0) maxlen = uv__fs_pathmax_size(req->path); #endif buf = uv__malloc(maxlen); if (buf == NULL) { errno = ENOMEM; return -1; } #if defined(__MVS__) len = os390_readlink(req->path, buf, maxlen); #else len = readlink(req->path, buf, maxlen); #endif if (len == -1) { uv__free(buf); return -1; } /* Uncommon case: resize to make room for the trailing nul byte. */ if (len == maxlen) { buf = uv__reallocf(buf, len + 1); if (buf == NULL) return -1; } buf[len] = '\0'; req->ptr = buf; return 0; } static ssize_t uv__fs_realpath(uv_fs_t* req) { char* buf; #if defined(_POSIX_VERSION) && _POSIX_VERSION >= 200809L buf = realpath(req->path, NULL); if (buf == NULL) return -1; #else ssize_t len; len = uv__fs_pathmax_size(req->path); buf = uv__malloc(len + 1); if (buf == NULL) { errno = ENOMEM; return -1; } if (realpath(req->path, buf) == NULL) { uv__free(buf); return -1; } #endif req->ptr = buf; return 0; } static ssize_t uv__fs_sendfile_emul(uv_fs_t* req) { struct pollfd pfd; int use_pread; off_t offset; ssize_t nsent; ssize_t nread; ssize_t nwritten; size_t buflen; size_t len; ssize_t n; int in_fd; int out_fd; char buf[8192]; len = req->bufsml[0].len; in_fd = req->flags; out_fd = req->file; offset = req->off; use_pread = 1; /* Here are the rules regarding errors: * * 1. Read errors are reported only if nsent==0, otherwise we return nsent. * The user needs to know that some data has already been sent, to stop * them from sending it twice. * * 2. Write errors are always reported. Write errors are bad because they * mean data loss: we've read data but now we can't write it out. * * We try to use pread() and fall back to regular read() if the source fd * doesn't support positional reads, for example when it's a pipe fd. * * If we get EAGAIN when writing to the target fd, we poll() on it until * it becomes writable again. * * FIXME: If we get a write error when use_pread==1, it should be safe to * return the number of sent bytes instead of an error because pread() * is, in theory, idempotent. However, special files in /dev or /proc * may support pread() but not necessarily return the same data on * successive reads. * * FIXME: There is no way now to signal that we managed to send *some* data * before a write error. */ for (nsent = 0; (size_t) nsent < len; ) { buflen = len - nsent; if (buflen > sizeof(buf)) buflen = sizeof(buf); do if (use_pread) nread = pread(in_fd, buf, buflen, offset); else nread = read(in_fd, buf, buflen); while (nread == -1 && errno == EINTR); if (nread == 0) goto out; if (nread == -1) { if (use_pread && nsent == 0 && (errno == EIO || errno == ESPIPE)) { use_pread = 0; continue; } if (nsent == 0) nsent = -1; goto out; } for (nwritten = 0; nwritten < nread; ) { do n = write(out_fd, buf + nwritten, nread - nwritten); while (n == -1 && errno == EINTR); if (n != -1) { nwritten += n; continue; } if (errno != EAGAIN && errno != EWOULDBLOCK) { nsent = -1; goto out; } pfd.fd = out_fd; pfd.events = POLLOUT; pfd.revents = 0; do n = poll(&pfd, 1, -1); while (n == -1 && errno == EINTR); if (n == -1 || (pfd.revents & ~POLLOUT) != 0) { errno = EIO; nsent = -1; goto out; } } offset += nread; nsent += nread; } out: if (nsent != -1) req->off = offset; return nsent; } static ssize_t uv__fs_sendfile(uv_fs_t* req) { int in_fd; int out_fd; in_fd = req->flags; out_fd = req->file; #if defined(__linux__) || defined(__sun) { off_t off; ssize_t r; off = req->off; r = sendfile(out_fd, in_fd, &off, req->bufsml[0].len); /* sendfile() on SunOS returns EINVAL if the target fd is not a socket but * it still writes out data. Fortunately, we can detect it by checking if * the offset has been updated. */ if (r != -1 || off > req->off) { r = off - req->off; req->off = off; return r; } if (errno == EINVAL || errno == EIO || errno == ENOTSOCK || errno == EXDEV) { errno = 0; return uv__fs_sendfile_emul(req); } return -1; } #elif defined(__APPLE__) || \ defined(__DragonFly__) || \ defined(__FreeBSD__) || \ defined(__FreeBSD_kernel__) { off_t len; ssize_t r; /* sendfile() on FreeBSD and Darwin returns EAGAIN if the target fd is in * non-blocking mode and not all data could be written. If a non-zero * number of bytes have been sent, we don't consider it an error. */ #if defined(__FreeBSD__) || defined(__DragonFly__) len = 0; r = sendfile(in_fd, out_fd, req->off, req->bufsml[0].len, NULL, &len, 0); #elif defined(__FreeBSD_kernel__) len = 0; r = bsd_sendfile(in_fd, out_fd, req->off, req->bufsml[0].len, NULL, &len, 0); #else /* The darwin sendfile takes len as an input for the length to send, * so make sure to initialize it with the caller's value. */ len = req->bufsml[0].len; r = sendfile(in_fd, out_fd, req->off, &len, NULL, 0); #endif /* * The man page for sendfile(2) on DragonFly states that `len` contains * a meaningful value ONLY in case of EAGAIN and EINTR. * Nothing is said about it's value in case of other errors, so better * not depend on the potential wrong assumption that is was not modified * by the syscall. */ if (r == 0 || ((errno == EAGAIN || errno == EINTR) && len != 0)) { req->off += len; return (ssize_t) len; } if (errno == EINVAL || errno == EIO || errno == ENOTSOCK || errno == EXDEV) { errno = 0; return uv__fs_sendfile_emul(req); } return -1; } #else /* Squelch compiler warnings. */ (void) &in_fd; (void) &out_fd; return uv__fs_sendfile_emul(req); #endif } static ssize_t uv__fs_utime(uv_fs_t* req) { #if defined(__linux__) \ || defined(_AIX71) \ || defined(__sun) \ || defined(__HAIKU__) /* utimesat() has nanosecond resolution but we stick to microseconds * for the sake of consistency with other platforms. */ struct timespec ts[2]; ts[0] = uv__fs_to_timespec(req->atime); ts[1] = uv__fs_to_timespec(req->mtime); return utimensat(AT_FDCWD, req->path, ts, 0); #elif defined(__APPLE__) \ || defined(__DragonFly__) \ || defined(__FreeBSD__) \ || defined(__FreeBSD_kernel__) \ || defined(__NetBSD__) \ || defined(__OpenBSD__) struct timeval tv[2]; tv[0] = uv__fs_to_timeval(req->atime); tv[1] = uv__fs_to_timeval(req->mtime); return utimes(req->path, tv); #elif defined(_AIX) \ && !defined(_AIX71) struct utimbuf buf; buf.actime = req->atime; buf.modtime = req->mtime; return utime(req->path, &buf); #elif defined(__MVS__) attrib_t atr; memset(&atr, 0, sizeof(atr)); atr.att_mtimechg = 1; atr.att_atimechg = 1; atr.att_mtime = req->mtime; atr.att_atime = req->atime; return __lchattr((char*) req->path, &atr, sizeof(atr)); #else errno = ENOSYS; return -1; #endif } static ssize_t uv__fs_lutime(uv_fs_t* req) { #if defined(__linux__) || \ defined(_AIX71) || \ defined(__sun) || \ defined(__HAIKU__) struct timespec ts[2]; ts[0] = uv__fs_to_timespec(req->atime); ts[1] = uv__fs_to_timespec(req->mtime); return utimensat(AT_FDCWD, req->path, ts, AT_SYMLINK_NOFOLLOW); #elif defined(__APPLE__) || \ defined(__DragonFly__) || \ defined(__FreeBSD__) || \ defined(__FreeBSD_kernel__) || \ defined(__NetBSD__) struct timeval tv[2]; tv[0] = uv__fs_to_timeval(req->atime); tv[1] = uv__fs_to_timeval(req->mtime); return lutimes(req->path, tv); #else errno = ENOSYS; return -1; #endif } static ssize_t uv__fs_write(uv_fs_t* req) { #if defined(__linux__) static int no_pwritev; #endif ssize_t r; /* Serialize writes on OS X, concurrent write() and pwrite() calls result in * data loss. We can't use a per-file descriptor lock, the descriptor may be * a dup(). */ #if defined(__APPLE__) static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; if (pthread_mutex_lock(&lock)) abort(); #endif if (req->off < 0) { if (req->nbufs == 1) r = write(req->file, req->bufs[0].base, req->bufs[0].len); else r = writev(req->file, (struct iovec*) req->bufs, req->nbufs); } else { if (req->nbufs == 1) { r = pwrite(req->file, req->bufs[0].base, req->bufs[0].len, req->off); goto done; } #if HAVE_PREADV r = pwritev(req->file, (struct iovec*) req->bufs, req->nbufs, req->off); #else # if defined(__linux__) if (no_pwritev) retry: # endif { r = pwrite(req->file, req->bufs[0].base, req->bufs[0].len, req->off); } # if defined(__linux__) else { r = uv__pwritev(req->file, (struct iovec*) req->bufs, req->nbufs, req->off); if (r == -1 && errno == ENOSYS) { no_pwritev = 1; goto retry; } } # endif #endif } done: #if defined(__APPLE__) if (pthread_mutex_unlock(&lock)) abort(); #endif return r; } static ssize_t uv__fs_copyfile(uv_fs_t* req) { uv_fs_t fs_req; uv_file srcfd; uv_file dstfd; struct stat src_statsbuf; struct stat dst_statsbuf; int dst_flags; int result; int err; off_t bytes_to_send; off_t in_offset; off_t bytes_written; size_t bytes_chunk; dstfd = -1; err = 0; /* Open the source file. */ srcfd = uv_fs_open(NULL, &fs_req, req->path, O_RDONLY, 0, NULL); uv_fs_req_cleanup(&fs_req); if (srcfd < 0) return srcfd; /* Get the source file's mode. */ if (fstat(srcfd, &src_statsbuf)) { err = UV__ERR(errno); goto out; } dst_flags = O_WRONLY | O_CREAT | O_TRUNC; if (req->flags & UV_FS_COPYFILE_EXCL) dst_flags |= O_EXCL; /* Open the destination file. */ dstfd = uv_fs_open(NULL, &fs_req, req->new_path, dst_flags, src_statsbuf.st_mode, NULL); uv_fs_req_cleanup(&fs_req); if (dstfd < 0) { err = dstfd; goto out; } /* Get the destination file's mode. */ if (fstat(dstfd, &dst_statsbuf)) { err = UV__ERR(errno); goto out; } /* Check if srcfd and dstfd refer to the same file */ if (src_statsbuf.st_dev == dst_statsbuf.st_dev && src_statsbuf.st_ino == dst_statsbuf.st_ino) { goto out; } if (fchmod(dstfd, src_statsbuf.st_mode) == -1) { err = UV__ERR(errno); #ifdef __linux__ if (err != UV_EPERM) goto out; { struct statfs s; /* fchmod() on CIFS shares always fails with EPERM unless the share is * mounted with "noperm". As fchmod() is a meaningless operation on such * shares anyway, detect that condition and squelch the error. */ if (fstatfs(dstfd, &s) == -1) goto out; if (s.f_type != /* CIFS */ 0xFF534D42u) goto out; } err = 0; #else /* !__linux__ */ goto out; #endif /* !__linux__ */ } #ifdef FICLONE if (req->flags & UV_FS_COPYFILE_FICLONE || req->flags & UV_FS_COPYFILE_FICLONE_FORCE) { if (ioctl(dstfd, FICLONE, srcfd) == 0) { /* ioctl() with FICLONE succeeded. */ goto out; } /* If an error occurred and force was set, return the error to the caller; * fall back to sendfile() when force was not set. */ if (req->flags & UV_FS_COPYFILE_FICLONE_FORCE) { err = UV__ERR(errno); goto out; } } #else if (req->flags & UV_FS_COPYFILE_FICLONE_FORCE) { err = UV_ENOSYS; goto out; } #endif bytes_to_send = src_statsbuf.st_size; in_offset = 0; while (bytes_to_send != 0) { bytes_chunk = SSIZE_MAX; if (bytes_to_send < (off_t) bytes_chunk) bytes_chunk = bytes_to_send; uv_fs_sendfile(NULL, &fs_req, dstfd, srcfd, in_offset, bytes_chunk, NULL); bytes_written = fs_req.result; uv_fs_req_cleanup(&fs_req); if (bytes_written < 0) { err = bytes_written; break; } bytes_to_send -= bytes_written; in_offset += bytes_written; } out: if (err < 0) result = err; else result = 0; /* Close the source file. */ err = uv__close_nocheckstdio(srcfd); /* Don't overwrite any existing errors. */ if (err != 0 && result == 0) result = err; /* Close the destination file if it is open. */ if (dstfd >= 0) { err = uv__close_nocheckstdio(dstfd); /* Don't overwrite any existing errors. */ if (err != 0 && result == 0) result = err; /* Remove the destination file if something went wrong. */ if (result != 0) { uv_fs_unlink(NULL, &fs_req, req->new_path, NULL); /* Ignore the unlink return value, as an error already happened. */ uv_fs_req_cleanup(&fs_req); } } if (result == 0) return 0; errno = UV__ERR(result); return -1; } static void uv__to_stat(struct stat* src, uv_stat_t* dst) { dst->st_dev = src->st_dev; dst->st_mode = src->st_mode; dst->st_nlink = src->st_nlink; dst->st_uid = src->st_uid; dst->st_gid = src->st_gid; dst->st_rdev = src->st_rdev; dst->st_ino = src->st_ino; dst->st_size = src->st_size; dst->st_blksize = src->st_blksize; dst->st_blocks = src->st_blocks; #if defined(__APPLE__) dst->st_atim.tv_sec = src->st_atimespec.tv_sec; dst->st_atim.tv_nsec = src->st_atimespec.tv_nsec; dst->st_mtim.tv_sec = src->st_mtimespec.tv_sec; dst->st_mtim.tv_nsec = src->st_mtimespec.tv_nsec; dst->st_ctim.tv_sec = src->st_ctimespec.tv_sec; dst->st_ctim.tv_nsec = src->st_ctimespec.tv_nsec; dst->st_birthtim.tv_sec = src->st_birthtimespec.tv_sec; dst->st_birthtim.tv_nsec = src->st_birthtimespec.tv_nsec; dst->st_flags = src->st_flags; dst->st_gen = src->st_gen; #elif defined(__ANDROID__) dst->st_atim.tv_sec = src->st_atime; dst->st_atim.tv_nsec = src->st_atimensec; dst->st_mtim.tv_sec = src->st_mtime; dst->st_mtim.tv_nsec = src->st_mtimensec; dst->st_ctim.tv_sec = src->st_ctime; dst->st_ctim.tv_nsec = src->st_ctimensec; dst->st_birthtim.tv_sec = src->st_ctime; dst->st_birthtim.tv_nsec = src->st_ctimensec; dst->st_flags = 0; dst->st_gen = 0; #elif !defined(_AIX) && ( \ defined(__DragonFly__) || \ defined(__FreeBSD__) || \ defined(__OpenBSD__) || \ defined(__NetBSD__) || \ defined(_GNU_SOURCE) || \ defined(_BSD_SOURCE) || \ defined(_SVID_SOURCE) || \ defined(_XOPEN_SOURCE) || \ defined(_DEFAULT_SOURCE)) dst->st_atim.tv_sec = src->st_atim.tv_sec; dst->st_atim.tv_nsec = src->st_atim.tv_nsec; dst->st_mtim.tv_sec = src->st_mtim.tv_sec; dst->st_mtim.tv_nsec = src->st_mtim.tv_nsec; dst->st_ctim.tv_sec = src->st_ctim.tv_sec; dst->st_ctim.tv_nsec = src->st_ctim.tv_nsec; # if defined(__FreeBSD__) || \ defined(__NetBSD__) dst->st_birthtim.tv_sec = src->st_birthtim.tv_sec; dst->st_birthtim.tv_nsec = src->st_birthtim.tv_nsec; dst->st_flags = src->st_flags; dst->st_gen = src->st_gen; # else dst->st_birthtim.tv_sec = src->st_ctim.tv_sec; dst->st_birthtim.tv_nsec = src->st_ctim.tv_nsec; dst->st_flags = 0; dst->st_gen = 0; # endif #else dst->st_atim.tv_sec = src->st_atime; dst->st_atim.tv_nsec = 0; dst->st_mtim.tv_sec = src->st_mtime; dst->st_mtim.tv_nsec = 0; dst->st_ctim.tv_sec = src->st_ctime; dst->st_ctim.tv_nsec = 0; dst->st_birthtim.tv_sec = src->st_ctime; dst->st_birthtim.tv_nsec = 0; dst->st_flags = 0; dst->st_gen = 0; #endif } static int uv__fs_statx(int fd, const char* path, int is_fstat, int is_lstat, uv_stat_t* buf) { STATIC_ASSERT(UV_ENOSYS != -1); #ifdef __linux__ static int no_statx; struct uv__statx statxbuf; int dirfd; int flags; int mode; int rc; if (no_statx) return UV_ENOSYS; dirfd = AT_FDCWD; flags = 0; /* AT_STATX_SYNC_AS_STAT */ mode = 0xFFF; /* STATX_BASIC_STATS + STATX_BTIME */ if (is_fstat) { dirfd = fd; flags |= 0x1000; /* AT_EMPTY_PATH */ } if (is_lstat) flags |= AT_SYMLINK_NOFOLLOW; rc = uv__statx(dirfd, path, flags, mode, &statxbuf); switch (rc) { case 0: break; case -1: /* EPERM happens when a seccomp filter rejects the system call. * Has been observed with libseccomp < 2.3.3 and docker < 18.04. */ if (errno != EINVAL && errno != EPERM && errno != ENOSYS) return -1; /* Fall through. */ default: /* Normally on success, zero is returned and On error, -1 is returned. * Observed on S390 RHEL running in a docker container with statx not * implemented, rc might return 1 with 0 set as the error code in which * case we return ENOSYS. */ no_statx = 1; return UV_ENOSYS; } buf->st_dev = 256 * statxbuf.stx_dev_major + statxbuf.stx_dev_minor; buf->st_mode = statxbuf.stx_mode; buf->st_nlink = statxbuf.stx_nlink; buf->st_uid = statxbuf.stx_uid; buf->st_gid = statxbuf.stx_gid; buf->st_rdev = statxbuf.stx_rdev_major; buf->st_ino = statxbuf.stx_ino; buf->st_size = statxbuf.stx_size; buf->st_blksize = statxbuf.stx_blksize; buf->st_blocks = statxbuf.stx_blocks; buf->st_atim.tv_sec = statxbuf.stx_atime.tv_sec; buf->st_atim.tv_nsec = statxbuf.stx_atime.tv_nsec; buf->st_mtim.tv_sec = statxbuf.stx_mtime.tv_sec; buf->st_mtim.tv_nsec = statxbuf.stx_mtime.tv_nsec; buf->st_ctim.tv_sec = statxbuf.stx_ctime.tv_sec; buf->st_ctim.tv_nsec = statxbuf.stx_ctime.tv_nsec; buf->st_birthtim.tv_sec = statxbuf.stx_btime.tv_sec; buf->st_birthtim.tv_nsec = statxbuf.stx_btime.tv_nsec; buf->st_flags = 0; buf->st_gen = 0; return 0; #else return UV_ENOSYS; #endif /* __linux__ */ } static int uv__fs_stat(const char *path, uv_stat_t *buf) { struct stat pbuf; int ret; ret = uv__fs_statx(-1, path, /* is_fstat */ 0, /* is_lstat */ 0, buf); if (ret != UV_ENOSYS) return ret; ret = stat(path, &pbuf); if (ret == 0) uv__to_stat(&pbuf, buf); return ret; } static int uv__fs_lstat(const char *path, uv_stat_t *buf) { struct stat pbuf; int ret; ret = uv__fs_statx(-1, path, /* is_fstat */ 0, /* is_lstat */ 1, buf); if (ret != UV_ENOSYS) return ret; ret = lstat(path, &pbuf); if (ret == 0) uv__to_stat(&pbuf, buf); return ret; } static int uv__fs_fstat(int fd, uv_stat_t *buf) { struct stat pbuf; int ret; ret = uv__fs_statx(fd, "", /* is_fstat */ 1, /* is_lstat */ 0, buf); if (ret != UV_ENOSYS) return ret; ret = fstat(fd, &pbuf); if (ret == 0) uv__to_stat(&pbuf, buf); return ret; } static size_t uv__fs_buf_offset(uv_buf_t* bufs, size_t size) { size_t offset; /* Figure out which bufs are done */ for (offset = 0; size > 0 && bufs[offset].len <= size; ++offset) size -= bufs[offset].len; /* Fix a partial read/write */ if (size > 0) { bufs[offset].base += size; bufs[offset].len -= size; } return offset; } static ssize_t uv__fs_write_all(uv_fs_t* req) { unsigned int iovmax; unsigned int nbufs; uv_buf_t* bufs; ssize_t total; ssize_t result; iovmax = uv__getiovmax(); nbufs = req->nbufs; bufs = req->bufs; total = 0; while (nbufs > 0) { req->nbufs = nbufs; if (req->nbufs > iovmax) req->nbufs = iovmax; do result = uv__fs_write(req); while (result < 0 && errno == EINTR); if (result <= 0) { if (total == 0) total = result; break; } if (req->off >= 0) req->off += result; req->nbufs = uv__fs_buf_offset(req->bufs, result); req->bufs += req->nbufs; nbufs -= req->nbufs; total += result; } if (bufs != req->bufsml) uv__free(bufs); req->bufs = NULL; req->nbufs = 0; return total; } static void uv__fs_work(struct uv__work* w) { int retry_on_eintr; uv_fs_t* req; ssize_t r; req = container_of(w, uv_fs_t, work_req); retry_on_eintr = !(req->fs_type == UV_FS_CLOSE || req->fs_type == UV_FS_READ); do { errno = 0; #define X(type, action) \ case UV_FS_ ## type: \ r = action; \ break; switch (req->fs_type) { X(ACCESS, access(req->path, req->flags)); X(CHMOD, chmod(req->path, req->mode)); X(CHOWN, chown(req->path, req->uid, req->gid)); X(CLOSE, uv__fs_close(req->file)); X(COPYFILE, uv__fs_copyfile(req)); X(FCHMOD, fchmod(req->file, req->mode)); X(FCHOWN, fchown(req->file, req->uid, req->gid)); X(LCHOWN, lchown(req->path, req->uid, req->gid)); X(FDATASYNC, uv__fs_fdatasync(req)); X(FSTAT, uv__fs_fstat(req->file, &req->statbuf)); X(FSYNC, uv__fs_fsync(req)); X(FTRUNCATE, ftruncate(req->file, req->off)); X(FUTIME, uv__fs_futime(req)); X(LUTIME, uv__fs_lutime(req)); X(LSTAT, uv__fs_lstat(req->path, &req->statbuf)); X(LINK, link(req->path, req->new_path)); X(MKDIR, mkdir(req->path, req->mode)); X(MKDTEMP, uv__fs_mkdtemp(req)); X(MKSTEMP, uv__fs_mkstemp(req)); X(OPEN, uv__fs_open(req)); X(READ, uv__fs_read(req)); X(SCANDIR, uv__fs_scandir(req)); X(OPENDIR, uv__fs_opendir(req)); X(READDIR, uv__fs_readdir(req)); X(CLOSEDIR, uv__fs_closedir(req)); X(READLINK, uv__fs_readlink(req)); X(REALPATH, uv__fs_realpath(req)); X(RENAME, rename(req->path, req->new_path)); X(RMDIR, rmdir(req->path)); X(SENDFILE, uv__fs_sendfile(req)); X(STAT, uv__fs_stat(req->path, &req->statbuf)); X(STATFS, uv__fs_statfs(req)); X(SYMLINK, symlink(req->path, req->new_path)); X(UNLINK, unlink(req->path)); X(UTIME, uv__fs_utime(req)); X(WRITE, uv__fs_write_all(req)); default: abort(); } #undef X } while (r == -1 && errno == EINTR && retry_on_eintr); if (r == -1) req->result = UV__ERR(errno); else req->result = r; if (r == 0 && (req->fs_type == UV_FS_STAT || req->fs_type == UV_FS_FSTAT || req->fs_type == UV_FS_LSTAT)) { req->ptr = &req->statbuf; } } static void uv__fs_done(struct uv__work* w, int status) { uv_fs_t* req; req = container_of(w, uv_fs_t, work_req); uv__req_unregister(req->loop, req); if (status == UV_ECANCELED) { assert(req->result == 0); req->result = UV_ECANCELED; } req->cb(req); } int uv_fs_access(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, uv_fs_cb cb) { INIT(ACCESS); PATH; req->flags = flags; POST; } int uv_fs_chmod(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, uv_fs_cb cb) { INIT(CHMOD); PATH; req->mode = mode; POST; } int uv_fs_chown(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_uid_t uid, uv_gid_t gid, uv_fs_cb cb) { INIT(CHOWN); PATH; req->uid = uid; req->gid = gid; POST; } int uv_fs_close(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) { INIT(CLOSE); req->file = file; POST; } int uv_fs_fchmod(uv_loop_t* loop, uv_fs_t* req, uv_file file, int mode, uv_fs_cb cb) { INIT(FCHMOD); req->file = file; req->mode = mode; POST; } int uv_fs_fchown(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_uid_t uid, uv_gid_t gid, uv_fs_cb cb) { INIT(FCHOWN); req->file = file; req->uid = uid; req->gid = gid; POST; } int uv_fs_lchown(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_uid_t uid, uv_gid_t gid, uv_fs_cb cb) { INIT(LCHOWN); PATH; req->uid = uid; req->gid = gid; POST; } int uv_fs_fdatasync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) { INIT(FDATASYNC); req->file = file; POST; } int uv_fs_fstat(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) { INIT(FSTAT); req->file = file; POST; } int uv_fs_fsync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) { INIT(FSYNC); req->file = file; POST; } int uv_fs_ftruncate(uv_loop_t* loop, uv_fs_t* req, uv_file file, int64_t off, uv_fs_cb cb) { INIT(FTRUNCATE); req->file = file; req->off = off; POST; } int uv_fs_futime(uv_loop_t* loop, uv_fs_t* req, uv_file file, double atime, double mtime, uv_fs_cb cb) { INIT(FUTIME); req->file = file; req->atime = atime; req->mtime = mtime; POST; } int uv_fs_lutime(uv_loop_t* loop, uv_fs_t* req, const char* path, double atime, double mtime, uv_fs_cb cb) { INIT(LUTIME); PATH; req->atime = atime; req->mtime = mtime; POST; } int uv_fs_lstat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { INIT(LSTAT); PATH; POST; } int uv_fs_link(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, uv_fs_cb cb) { INIT(LINK); PATH2; POST; } int uv_fs_mkdir(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, uv_fs_cb cb) { INIT(MKDIR); PATH; req->mode = mode; POST; } int uv_fs_mkdtemp(uv_loop_t* loop, uv_fs_t* req, const char* tpl, uv_fs_cb cb) { INIT(MKDTEMP); req->path = uv__strdup(tpl); if (req->path == NULL) return UV_ENOMEM; POST; } int uv_fs_mkstemp(uv_loop_t* loop, uv_fs_t* req, const char* tpl, uv_fs_cb cb) { INIT(MKSTEMP); req->path = uv__strdup(tpl); if (req->path == NULL) return UV_ENOMEM; POST; } int uv_fs_open(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, int mode, uv_fs_cb cb) { INIT(OPEN); PATH; req->flags = flags; req->mode = mode; POST; } int uv_fs_read(uv_loop_t* loop, uv_fs_t* req, uv_file file, const uv_buf_t bufs[], unsigned int nbufs, int64_t off, uv_fs_cb cb) { INIT(READ); if (bufs == NULL || nbufs == 0) return UV_EINVAL; req->file = file; req->nbufs = nbufs; req->bufs = req->bufsml; if (nbufs > ARRAY_SIZE(req->bufsml)) req->bufs = uv__malloc(nbufs * sizeof(*bufs)); if (req->bufs == NULL) return UV_ENOMEM; memcpy(req->bufs, bufs, nbufs * sizeof(*bufs)); req->off = off; POST; } int uv_fs_scandir(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, uv_fs_cb cb) { INIT(SCANDIR); PATH; req->flags = flags; POST; } int uv_fs_opendir(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { INIT(OPENDIR); PATH; POST; } int uv_fs_readdir(uv_loop_t* loop, uv_fs_t* req, uv_dir_t* dir, uv_fs_cb cb) { INIT(READDIR); if (dir == NULL || dir->dir == NULL || dir->dirents == NULL) return UV_EINVAL; req->ptr = dir; POST; } int uv_fs_closedir(uv_loop_t* loop, uv_fs_t* req, uv_dir_t* dir, uv_fs_cb cb) { INIT(CLOSEDIR); if (dir == NULL) return UV_EINVAL; req->ptr = dir; POST; } int uv_fs_readlink(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { INIT(READLINK); PATH; POST; } int uv_fs_realpath(uv_loop_t* loop, uv_fs_t* req, const char * path, uv_fs_cb cb) { INIT(REALPATH); PATH; POST; } int uv_fs_rename(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, uv_fs_cb cb) { INIT(RENAME); PATH2; POST; } int uv_fs_rmdir(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { INIT(RMDIR); PATH; POST; } int uv_fs_sendfile(uv_loop_t* loop, uv_fs_t* req, uv_file out_fd, uv_file in_fd, int64_t off, size_t len, uv_fs_cb cb) { INIT(SENDFILE); req->flags = in_fd; /* hack */ req->file = out_fd; req->off = off; req->bufsml[0].len = len; POST; } int uv_fs_stat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { INIT(STAT); PATH; POST; } int uv_fs_symlink(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, int flags, uv_fs_cb cb) { INIT(SYMLINK); PATH2; req->flags = flags; POST; } int uv_fs_unlink(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { INIT(UNLINK); PATH; POST; } int uv_fs_utime(uv_loop_t* loop, uv_fs_t* req, const char* path, double atime, double mtime, uv_fs_cb cb) { INIT(UTIME); PATH; req->atime = atime; req->mtime = mtime; POST; } int uv_fs_write(uv_loop_t* loop, uv_fs_t* req, uv_file file, const uv_buf_t bufs[], unsigned int nbufs, int64_t off, uv_fs_cb cb) { INIT(WRITE); if (bufs == NULL || nbufs == 0) return UV_EINVAL; req->file = file; req->nbufs = nbufs; req->bufs = req->bufsml; if (nbufs > ARRAY_SIZE(req->bufsml)) req->bufs = uv__malloc(nbufs * sizeof(*bufs)); if (req->bufs == NULL) return UV_ENOMEM; memcpy(req->bufs, bufs, nbufs * sizeof(*bufs)); req->off = off; POST; } void uv_fs_req_cleanup(uv_fs_t* req) { if (req == NULL) return; /* Only necessary for asychronous requests, i.e., requests with a callback. * Synchronous ones don't copy their arguments and have req->path and * req->new_path pointing to user-owned memory. UV_FS_MKDTEMP and * UV_FS_MKSTEMP are the exception to the rule, they always allocate memory. */ if (req->path != NULL && (req->cb != NULL || req->fs_type == UV_FS_MKDTEMP || req->fs_type == UV_FS_MKSTEMP)) uv__free((void*) req->path); /* Memory is shared with req->new_path. */ req->path = NULL; req->new_path = NULL; if (req->fs_type == UV_FS_READDIR && req->ptr != NULL) uv__fs_readdir_cleanup(req); if (req->fs_type == UV_FS_SCANDIR && req->ptr != NULL) uv__fs_scandir_cleanup(req); if (req->bufs != req->bufsml) uv__free(req->bufs); req->bufs = NULL; if (req->fs_type != UV_FS_OPENDIR && req->ptr != &req->statbuf) uv__free(req->ptr); req->ptr = NULL; } int uv_fs_copyfile(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, int flags, uv_fs_cb cb) { INIT(COPYFILE); if (flags & ~(UV_FS_COPYFILE_EXCL | UV_FS_COPYFILE_FICLONE | UV_FS_COPYFILE_FICLONE_FORCE)) { return UV_EINVAL; } PATH2; req->flags = flags; POST; } int uv_fs_statfs(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { INIT(STATFS); PATH; POST; } int uv_fs_get_system_error(const uv_fs_t* req) { return -req->result; } ================================================ FILE: external/libuv/src/unix/fsevents.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #if TARGET_OS_IPHONE || MAC_OS_X_VERSION_MAX_ALLOWED < 1070 /* iOS (currently) doesn't provide the FSEvents-API (nor CoreServices) */ /* macOS prior to 10.7 doesn't provide the full FSEvents API so use kqueue */ int uv__fsevents_init(uv_fs_event_t* handle) { return 0; } int uv__fsevents_close(uv_fs_event_t* handle) { return 0; } void uv__fsevents_loop_delete(uv_loop_t* loop) { } #else /* TARGET_OS_IPHONE */ #include "darwin-stub.h" #include #include #include #include static const int kFSEventsModified = kFSEventStreamEventFlagItemChangeOwner | kFSEventStreamEventFlagItemFinderInfoMod | kFSEventStreamEventFlagItemInodeMetaMod | kFSEventStreamEventFlagItemModified | kFSEventStreamEventFlagItemXattrMod; static const int kFSEventsRenamed = kFSEventStreamEventFlagItemCreated | kFSEventStreamEventFlagItemRemoved | kFSEventStreamEventFlagItemRenamed; static const int kFSEventsSystem = kFSEventStreamEventFlagUserDropped | kFSEventStreamEventFlagKernelDropped | kFSEventStreamEventFlagEventIdsWrapped | kFSEventStreamEventFlagHistoryDone | kFSEventStreamEventFlagMount | kFSEventStreamEventFlagUnmount | kFSEventStreamEventFlagRootChanged; typedef struct uv__fsevents_event_s uv__fsevents_event_t; typedef struct uv__cf_loop_signal_s uv__cf_loop_signal_t; typedef struct uv__cf_loop_state_s uv__cf_loop_state_t; enum uv__cf_loop_signal_type_e { kUVCFLoopSignalRegular, kUVCFLoopSignalClosing }; typedef enum uv__cf_loop_signal_type_e uv__cf_loop_signal_type_t; struct uv__cf_loop_signal_s { QUEUE member; uv_fs_event_t* handle; uv__cf_loop_signal_type_t type; }; struct uv__fsevents_event_s { QUEUE member; int events; char path[1]; }; struct uv__cf_loop_state_s { CFRunLoopRef loop; CFRunLoopSourceRef signal_source; int fsevent_need_reschedule; FSEventStreamRef fsevent_stream; uv_sem_t fsevent_sem; uv_mutex_t fsevent_mutex; void* fsevent_handles[2]; unsigned int fsevent_handle_count; }; /* Forward declarations */ static void uv__cf_loop_cb(void* arg); static void* uv__cf_loop_runner(void* arg); static int uv__cf_loop_signal(uv_loop_t* loop, uv_fs_event_t* handle, uv__cf_loop_signal_type_t type); /* Lazy-loaded by uv__fsevents_global_init(). */ static CFArrayRef (*pCFArrayCreate)(CFAllocatorRef, const void**, CFIndex, const CFArrayCallBacks*); static void (*pCFRelease)(CFTypeRef); static void (*pCFRunLoopAddSource)(CFRunLoopRef, CFRunLoopSourceRef, CFStringRef); static CFRunLoopRef (*pCFRunLoopGetCurrent)(void); static void (*pCFRunLoopRemoveSource)(CFRunLoopRef, CFRunLoopSourceRef, CFStringRef); static void (*pCFRunLoopRun)(void); static CFRunLoopSourceRef (*pCFRunLoopSourceCreate)(CFAllocatorRef, CFIndex, CFRunLoopSourceContext*); static void (*pCFRunLoopSourceSignal)(CFRunLoopSourceRef); static void (*pCFRunLoopStop)(CFRunLoopRef); static void (*pCFRunLoopWakeUp)(CFRunLoopRef); static CFStringRef (*pCFStringCreateWithFileSystemRepresentation)( CFAllocatorRef, const char*); static CFStringEncoding (*pCFStringGetSystemEncoding)(void); static CFStringRef (*pkCFRunLoopDefaultMode); static FSEventStreamRef (*pFSEventStreamCreate)(CFAllocatorRef, FSEventStreamCallback, FSEventStreamContext*, CFArrayRef, FSEventStreamEventId, CFTimeInterval, FSEventStreamCreateFlags); static void (*pFSEventStreamFlushSync)(FSEventStreamRef); static void (*pFSEventStreamInvalidate)(FSEventStreamRef); static void (*pFSEventStreamRelease)(FSEventStreamRef); static void (*pFSEventStreamScheduleWithRunLoop)(FSEventStreamRef, CFRunLoopRef, CFStringRef); static int (*pFSEventStreamStart)(FSEventStreamRef); static void (*pFSEventStreamStop)(FSEventStreamRef); #define UV__FSEVENTS_PROCESS(handle, block) \ do { \ QUEUE events; \ QUEUE* q; \ uv__fsevents_event_t* event; \ int err; \ uv_mutex_lock(&(handle)->cf_mutex); \ /* Split-off all events and empty original queue */ \ QUEUE_MOVE(&(handle)->cf_events, &events); \ /* Get error (if any) and zero original one */ \ err = (handle)->cf_error; \ (handle)->cf_error = 0; \ uv_mutex_unlock(&(handle)->cf_mutex); \ /* Loop through events, deallocating each after processing */ \ while (!QUEUE_EMPTY(&events)) { \ q = QUEUE_HEAD(&events); \ event = QUEUE_DATA(q, uv__fsevents_event_t, member); \ QUEUE_REMOVE(q); \ /* NOTE: Checking uv__is_active() is required here, because handle \ * callback may close handle and invoking it after it will lead to \ * incorrect behaviour */ \ if (!uv__is_closing((handle)) && uv__is_active((handle))) \ block \ /* Free allocated data */ \ uv__free(event); \ } \ if (err != 0 && !uv__is_closing((handle)) && uv__is_active((handle))) \ (handle)->cb((handle), NULL, 0, err); \ } while (0) /* Runs in UV loop's thread, when there're events to report to handle */ static void uv__fsevents_cb(uv_async_t* cb) { uv_fs_event_t* handle; handle = cb->data; UV__FSEVENTS_PROCESS(handle, { handle->cb(handle, event->path[0] ? event->path : NULL, event->events, 0); }); } /* Runs in CF thread, pushed event into handle's event list */ static void uv__fsevents_push_event(uv_fs_event_t* handle, QUEUE* events, int err) { assert(events != NULL || err != 0); uv_mutex_lock(&handle->cf_mutex); /* Concatenate two queues */ if (events != NULL) QUEUE_ADD(&handle->cf_events, events); /* Propagate error */ if (err != 0) handle->cf_error = err; uv_mutex_unlock(&handle->cf_mutex); uv_async_send(handle->cf_cb); } /* Runs in CF thread, when there're events in FSEventStream */ static void uv__fsevents_event_cb(const FSEventStreamRef streamRef, void* info, size_t numEvents, void* eventPaths, const FSEventStreamEventFlags eventFlags[], const FSEventStreamEventId eventIds[]) { size_t i; int len; char** paths; char* path; char* pos; uv_fs_event_t* handle; QUEUE* q; uv_loop_t* loop; uv__cf_loop_state_t* state; uv__fsevents_event_t* event; FSEventStreamEventFlags flags; QUEUE head; loop = info; state = loop->cf_state; assert(state != NULL); paths = eventPaths; /* For each handle */ uv_mutex_lock(&state->fsevent_mutex); QUEUE_FOREACH(q, &state->fsevent_handles) { handle = QUEUE_DATA(q, uv_fs_event_t, cf_member); QUEUE_INIT(&head); /* Process and filter out events */ for (i = 0; i < numEvents; i++) { flags = eventFlags[i]; /* Ignore system events */ if (flags & kFSEventsSystem) continue; path = paths[i]; len = strlen(path); if (handle->realpath_len == 0) continue; /* This should be unreachable */ /* Filter out paths that are outside handle's request */ if (len < handle->realpath_len) continue; /* Make sure that realpath actually named a directory, * (unless watching root, which alone keeps a trailing slash on the realpath) * or that we matched the whole string */ if (handle->realpath_len != len && handle->realpath_len > 1 && path[handle->realpath_len] != '/') continue; if (memcmp(path, handle->realpath, handle->realpath_len) != 0) continue; if (!(handle->realpath_len == 1 && handle->realpath[0] == '/')) { /* Remove common prefix, unless the watched folder is "/" */ path += handle->realpath_len; len -= handle->realpath_len; /* Ignore events with path equal to directory itself */ if (len <= 1 && (flags & kFSEventStreamEventFlagItemIsDir)) continue; if (len == 0) { /* Since we're using fsevents to watch the file itself, * realpath == path, and we now need to get the basename of the file back * (for commonality with other codepaths and platforms). */ while (len < handle->realpath_len && path[-1] != '/') { path--; len++; } /* Created and Removed seem to be always set, but don't make sense */ flags &= ~kFSEventsRenamed; } else { /* Skip forward slash */ path++; len--; } } /* Do not emit events from subdirectories (without option set) */ if ((handle->cf_flags & UV_FS_EVENT_RECURSIVE) == 0 && *path != '\0') { pos = strchr(path + 1, '/'); if (pos != NULL) continue; } event = uv__malloc(sizeof(*event) + len); if (event == NULL) break; memset(event, 0, sizeof(*event)); memcpy(event->path, path, len + 1); event->events = UV_RENAME; if (0 == (flags & kFSEventsRenamed)) { if (0 != (flags & kFSEventsModified) || 0 == (flags & kFSEventStreamEventFlagItemIsDir)) event->events = UV_CHANGE; } QUEUE_INSERT_TAIL(&head, &event->member); } if (!QUEUE_EMPTY(&head)) uv__fsevents_push_event(handle, &head, 0); } uv_mutex_unlock(&state->fsevent_mutex); } /* Runs in CF thread */ static int uv__fsevents_create_stream(uv_loop_t* loop, CFArrayRef paths) { uv__cf_loop_state_t* state; FSEventStreamContext ctx; FSEventStreamRef ref; CFAbsoluteTime latency; FSEventStreamCreateFlags flags; /* Initialize context */ memset(&ctx, 0, sizeof(ctx)); ctx.info = loop; latency = 0.05; /* Explanation of selected flags: * 1. NoDefer - without this flag, events that are happening continuously * (i.e. each event is happening after time interval less than `latency`, * counted from previous event), will be deferred and passed to callback * once they'll either fill whole OS buffer, or when this continuous stream * will stop (i.e. there'll be delay between events, bigger than * `latency`). * Specifying this flag will invoke callback after `latency` time passed * since event. * 2. FileEvents - fire callback for file changes too (by default it is firing * it only for directory changes). */ flags = kFSEventStreamCreateFlagNoDefer | kFSEventStreamCreateFlagFileEvents; /* * NOTE: It might sound like a good idea to remember last seen StreamEventId, * but in reality one dir might have last StreamEventId less than, the other, * that is being watched now. Which will cause FSEventStream API to report * changes to files from the past. */ ref = pFSEventStreamCreate(NULL, &uv__fsevents_event_cb, &ctx, paths, kFSEventStreamEventIdSinceNow, latency, flags); assert(ref != NULL); state = loop->cf_state; pFSEventStreamScheduleWithRunLoop(ref, state->loop, *pkCFRunLoopDefaultMode); if (!pFSEventStreamStart(ref)) { pFSEventStreamInvalidate(ref); pFSEventStreamRelease(ref); return UV_EMFILE; } state->fsevent_stream = ref; return 0; } /* Runs in CF thread */ static void uv__fsevents_destroy_stream(uv_loop_t* loop) { uv__cf_loop_state_t* state; state = loop->cf_state; if (state->fsevent_stream == NULL) return; /* Stop emitting events */ pFSEventStreamStop(state->fsevent_stream); /* Release stream */ pFSEventStreamInvalidate(state->fsevent_stream); pFSEventStreamRelease(state->fsevent_stream); state->fsevent_stream = NULL; } /* Runs in CF thread, when there're new fsevent handles to add to stream */ static void uv__fsevents_reschedule(uv_fs_event_t* handle, uv__cf_loop_signal_type_t type) { uv__cf_loop_state_t* state; QUEUE* q; uv_fs_event_t* curr; CFArrayRef cf_paths; CFStringRef* paths; unsigned int i; int err; unsigned int path_count; state = handle->loop->cf_state; paths = NULL; cf_paths = NULL; err = 0; /* NOTE: `i` is used in deallocation loop below */ i = 0; /* Optimization to prevent O(n^2) time spent when starting to watch * many files simultaneously */ uv_mutex_lock(&state->fsevent_mutex); if (state->fsevent_need_reschedule == 0) { uv_mutex_unlock(&state->fsevent_mutex); goto final; } state->fsevent_need_reschedule = 0; uv_mutex_unlock(&state->fsevent_mutex); /* Destroy previous FSEventStream */ uv__fsevents_destroy_stream(handle->loop); /* Any failure below will be a memory failure */ err = UV_ENOMEM; /* Create list of all watched paths */ uv_mutex_lock(&state->fsevent_mutex); path_count = state->fsevent_handle_count; if (path_count != 0) { paths = uv__malloc(sizeof(*paths) * path_count); if (paths == NULL) { uv_mutex_unlock(&state->fsevent_mutex); goto final; } q = &state->fsevent_handles; for (; i < path_count; i++) { q = QUEUE_NEXT(q); assert(q != &state->fsevent_handles); curr = QUEUE_DATA(q, uv_fs_event_t, cf_member); assert(curr->realpath != NULL); paths[i] = pCFStringCreateWithFileSystemRepresentation(NULL, curr->realpath); if (paths[i] == NULL) { uv_mutex_unlock(&state->fsevent_mutex); goto final; } } } uv_mutex_unlock(&state->fsevent_mutex); err = 0; if (path_count != 0) { /* Create new FSEventStream */ cf_paths = pCFArrayCreate(NULL, (const void**) paths, path_count, NULL); if (cf_paths == NULL) { err = UV_ENOMEM; goto final; } err = uv__fsevents_create_stream(handle->loop, cf_paths); } final: /* Deallocate all paths in case of failure */ if (err != 0) { if (cf_paths == NULL) { while (i != 0) pCFRelease(paths[--i]); uv__free(paths); } else { /* CFArray takes ownership of both strings and original C-array */ pCFRelease(cf_paths); } /* Broadcast error to all handles */ uv_mutex_lock(&state->fsevent_mutex); QUEUE_FOREACH(q, &state->fsevent_handles) { curr = QUEUE_DATA(q, uv_fs_event_t, cf_member); uv__fsevents_push_event(curr, NULL, err); } uv_mutex_unlock(&state->fsevent_mutex); } /* * Main thread will block until the removal of handle from the list, * we must tell it when we're ready. * * NOTE: This is coupled with `uv_sem_wait()` in `uv__fsevents_close` */ if (type == kUVCFLoopSignalClosing) uv_sem_post(&state->fsevent_sem); } static int uv__fsevents_global_init(void) { static pthread_mutex_t global_init_mutex = PTHREAD_MUTEX_INITIALIZER; static void* core_foundation_handle; static void* core_services_handle; int err; err = 0; pthread_mutex_lock(&global_init_mutex); if (core_foundation_handle != NULL) goto out; /* The libraries are never unloaded because we currently don't have a good * mechanism for keeping a reference count. It's unlikely to be an issue * but if it ever becomes one, we can turn the dynamic library handles into * per-event loop properties and have the dynamic linker keep track for us. */ err = UV_ENOSYS; core_foundation_handle = dlopen("/System/Library/Frameworks/" "CoreFoundation.framework/" "Versions/A/CoreFoundation", RTLD_LAZY | RTLD_LOCAL); if (core_foundation_handle == NULL) goto out; core_services_handle = dlopen("/System/Library/Frameworks/" "CoreServices.framework/" "Versions/A/CoreServices", RTLD_LAZY | RTLD_LOCAL); if (core_services_handle == NULL) goto out; err = UV_ENOENT; #define V(handle, symbol) \ do { \ *(void **)(&p ## symbol) = dlsym((handle), #symbol); \ if (p ## symbol == NULL) \ goto out; \ } \ while (0) V(core_foundation_handle, CFArrayCreate); V(core_foundation_handle, CFRelease); V(core_foundation_handle, CFRunLoopAddSource); V(core_foundation_handle, CFRunLoopGetCurrent); V(core_foundation_handle, CFRunLoopRemoveSource); V(core_foundation_handle, CFRunLoopRun); V(core_foundation_handle, CFRunLoopSourceCreate); V(core_foundation_handle, CFRunLoopSourceSignal); V(core_foundation_handle, CFRunLoopStop); V(core_foundation_handle, CFRunLoopWakeUp); V(core_foundation_handle, CFStringCreateWithFileSystemRepresentation); V(core_foundation_handle, CFStringGetSystemEncoding); V(core_foundation_handle, kCFRunLoopDefaultMode); V(core_services_handle, FSEventStreamCreate); V(core_services_handle, FSEventStreamFlushSync); V(core_services_handle, FSEventStreamInvalidate); V(core_services_handle, FSEventStreamRelease); V(core_services_handle, FSEventStreamScheduleWithRunLoop); V(core_services_handle, FSEventStreamStart); V(core_services_handle, FSEventStreamStop); #undef V err = 0; out: if (err && core_services_handle != NULL) { dlclose(core_services_handle); core_services_handle = NULL; } if (err && core_foundation_handle != NULL) { dlclose(core_foundation_handle); core_foundation_handle = NULL; } pthread_mutex_unlock(&global_init_mutex); return err; } /* Runs in UV loop */ static int uv__fsevents_loop_init(uv_loop_t* loop) { CFRunLoopSourceContext ctx; uv__cf_loop_state_t* state; pthread_attr_t attr_storage; pthread_attr_t* attr; int err; if (loop->cf_state != NULL) return 0; err = uv__fsevents_global_init(); if (err) return err; state = uv__calloc(1, sizeof(*state)); if (state == NULL) return UV_ENOMEM; err = uv_mutex_init(&loop->cf_mutex); if (err) goto fail_mutex_init; err = uv_sem_init(&loop->cf_sem, 0); if (err) goto fail_sem_init; QUEUE_INIT(&loop->cf_signals); err = uv_sem_init(&state->fsevent_sem, 0); if (err) goto fail_fsevent_sem_init; err = uv_mutex_init(&state->fsevent_mutex); if (err) goto fail_fsevent_mutex_init; QUEUE_INIT(&state->fsevent_handles); state->fsevent_need_reschedule = 0; state->fsevent_handle_count = 0; memset(&ctx, 0, sizeof(ctx)); ctx.info = loop; ctx.perform = uv__cf_loop_cb; state->signal_source = pCFRunLoopSourceCreate(NULL, 0, &ctx); if (state->signal_source == NULL) { err = UV_ENOMEM; goto fail_signal_source_create; } /* In the unlikely event that pthread_attr_init() fails, create the thread * with the default stack size. We'll use a little more address space but * that in itself is not a fatal error. */ attr = &attr_storage; if (pthread_attr_init(attr)) attr = NULL; if (attr != NULL) if (pthread_attr_setstacksize(attr, 4 * PTHREAD_STACK_MIN)) abort(); loop->cf_state = state; /* uv_thread_t is an alias for pthread_t. */ err = UV__ERR(pthread_create(&loop->cf_thread, attr, uv__cf_loop_runner, loop)); if (attr != NULL) pthread_attr_destroy(attr); if (err) goto fail_thread_create; /* Synchronize threads */ uv_sem_wait(&loop->cf_sem); return 0; fail_thread_create: loop->cf_state = NULL; fail_signal_source_create: uv_mutex_destroy(&state->fsevent_mutex); fail_fsevent_mutex_init: uv_sem_destroy(&state->fsevent_sem); fail_fsevent_sem_init: uv_sem_destroy(&loop->cf_sem); fail_sem_init: uv_mutex_destroy(&loop->cf_mutex); fail_mutex_init: uv__free(state); return err; } /* Runs in UV loop */ void uv__fsevents_loop_delete(uv_loop_t* loop) { uv__cf_loop_signal_t* s; uv__cf_loop_state_t* state; QUEUE* q; if (loop->cf_state == NULL) return; if (uv__cf_loop_signal(loop, NULL, kUVCFLoopSignalRegular) != 0) abort(); uv_thread_join(&loop->cf_thread); uv_sem_destroy(&loop->cf_sem); uv_mutex_destroy(&loop->cf_mutex); /* Free any remaining data */ while (!QUEUE_EMPTY(&loop->cf_signals)) { q = QUEUE_HEAD(&loop->cf_signals); s = QUEUE_DATA(q, uv__cf_loop_signal_t, member); QUEUE_REMOVE(q); uv__free(s); } /* Destroy state */ state = loop->cf_state; uv_sem_destroy(&state->fsevent_sem); uv_mutex_destroy(&state->fsevent_mutex); pCFRelease(state->signal_source); uv__free(state); loop->cf_state = NULL; } /* Runs in CF thread. This is the CF loop's body */ static void* uv__cf_loop_runner(void* arg) { uv_loop_t* loop; uv__cf_loop_state_t* state; loop = arg; state = loop->cf_state; state->loop = pCFRunLoopGetCurrent(); pCFRunLoopAddSource(state->loop, state->signal_source, *pkCFRunLoopDefaultMode); uv_sem_post(&loop->cf_sem); pCFRunLoopRun(); pCFRunLoopRemoveSource(state->loop, state->signal_source, *pkCFRunLoopDefaultMode); state->loop = NULL; return NULL; } /* Runs in CF thread, executed after `uv__cf_loop_signal()` */ static void uv__cf_loop_cb(void* arg) { uv_loop_t* loop; uv__cf_loop_state_t* state; QUEUE* item; QUEUE split_head; uv__cf_loop_signal_t* s; loop = arg; state = loop->cf_state; uv_mutex_lock(&loop->cf_mutex); QUEUE_MOVE(&loop->cf_signals, &split_head); uv_mutex_unlock(&loop->cf_mutex); while (!QUEUE_EMPTY(&split_head)) { item = QUEUE_HEAD(&split_head); QUEUE_REMOVE(item); s = QUEUE_DATA(item, uv__cf_loop_signal_t, member); /* This was a termination signal */ if (s->handle == NULL) pCFRunLoopStop(state->loop); else uv__fsevents_reschedule(s->handle, s->type); uv__free(s); } } /* Runs in UV loop to notify CF thread */ int uv__cf_loop_signal(uv_loop_t* loop, uv_fs_event_t* handle, uv__cf_loop_signal_type_t type) { uv__cf_loop_signal_t* item; uv__cf_loop_state_t* state; item = uv__malloc(sizeof(*item)); if (item == NULL) return UV_ENOMEM; item->handle = handle; item->type = type; uv_mutex_lock(&loop->cf_mutex); QUEUE_INSERT_TAIL(&loop->cf_signals, &item->member); state = loop->cf_state; assert(state != NULL); pCFRunLoopSourceSignal(state->signal_source); pCFRunLoopWakeUp(state->loop); uv_mutex_unlock(&loop->cf_mutex); return 0; } /* Runs in UV loop to initialize handle */ int uv__fsevents_init(uv_fs_event_t* handle) { int err; uv__cf_loop_state_t* state; err = uv__fsevents_loop_init(handle->loop); if (err) return err; /* Get absolute path to file */ handle->realpath = realpath(handle->path, NULL); if (handle->realpath == NULL) return UV__ERR(errno); handle->realpath_len = strlen(handle->realpath); /* Initialize event queue */ QUEUE_INIT(&handle->cf_events); handle->cf_error = 0; /* * Events will occur in other thread. * Initialize callback for getting them back into event loop's thread */ handle->cf_cb = uv__malloc(sizeof(*handle->cf_cb)); if (handle->cf_cb == NULL) { err = UV_ENOMEM; goto fail_cf_cb_malloc; } handle->cf_cb->data = handle; uv_async_init(handle->loop, handle->cf_cb, uv__fsevents_cb); handle->cf_cb->flags |= UV_HANDLE_INTERNAL; uv_unref((uv_handle_t*) handle->cf_cb); err = uv_mutex_init(&handle->cf_mutex); if (err) goto fail_cf_mutex_init; /* Insert handle into the list */ state = handle->loop->cf_state; uv_mutex_lock(&state->fsevent_mutex); QUEUE_INSERT_TAIL(&state->fsevent_handles, &handle->cf_member); state->fsevent_handle_count++; state->fsevent_need_reschedule = 1; uv_mutex_unlock(&state->fsevent_mutex); /* Reschedule FSEventStream */ assert(handle != NULL); err = uv__cf_loop_signal(handle->loop, handle, kUVCFLoopSignalRegular); if (err) goto fail_loop_signal; return 0; fail_loop_signal: uv_mutex_destroy(&handle->cf_mutex); fail_cf_mutex_init: uv__free(handle->cf_cb); handle->cf_cb = NULL; fail_cf_cb_malloc: uv__free(handle->realpath); handle->realpath = NULL; handle->realpath_len = 0; return err; } /* Runs in UV loop to de-initialize handle */ int uv__fsevents_close(uv_fs_event_t* handle) { int err; uv__cf_loop_state_t* state; if (handle->cf_cb == NULL) return UV_EINVAL; /* Remove handle from the list */ state = handle->loop->cf_state; uv_mutex_lock(&state->fsevent_mutex); QUEUE_REMOVE(&handle->cf_member); state->fsevent_handle_count--; state->fsevent_need_reschedule = 1; uv_mutex_unlock(&state->fsevent_mutex); /* Reschedule FSEventStream */ assert(handle != NULL); err = uv__cf_loop_signal(handle->loop, handle, kUVCFLoopSignalClosing); if (err) return UV__ERR(err); /* Wait for deinitialization */ uv_sem_wait(&state->fsevent_sem); uv_close((uv_handle_t*) handle->cf_cb, (uv_close_cb) uv__free); handle->cf_cb = NULL; /* Free data in queue */ UV__FSEVENTS_PROCESS(handle, { /* NOP */ }); uv_mutex_destroy(&handle->cf_mutex); uv__free(handle->realpath); handle->realpath = NULL; handle->realpath_len = 0; return 0; } #endif /* TARGET_OS_IPHONE */ ================================================ FILE: external/libuv/src/unix/getaddrinfo.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ /* Expose glibc-specific EAI_* error codes. Needs to be defined before we * include any headers. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE #endif #include "uv.h" #include "internal.h" #include "idna.h" #include #include /* NULL */ #include #include #include /* if_indextoname() */ /* EAI_* constants. */ #include int uv__getaddrinfo_translate_error(int sys_err) { switch (sys_err) { case 0: return 0; #if defined(EAI_ADDRFAMILY) case EAI_ADDRFAMILY: return UV_EAI_ADDRFAMILY; #endif #if defined(EAI_AGAIN) case EAI_AGAIN: return UV_EAI_AGAIN; #endif #if defined(EAI_BADFLAGS) case EAI_BADFLAGS: return UV_EAI_BADFLAGS; #endif #if defined(EAI_BADHINTS) case EAI_BADHINTS: return UV_EAI_BADHINTS; #endif #if defined(EAI_CANCELED) case EAI_CANCELED: return UV_EAI_CANCELED; #endif #if defined(EAI_FAIL) case EAI_FAIL: return UV_EAI_FAIL; #endif #if defined(EAI_FAMILY) case EAI_FAMILY: return UV_EAI_FAMILY; #endif #if defined(EAI_MEMORY) case EAI_MEMORY: return UV_EAI_MEMORY; #endif #if defined(EAI_NODATA) case EAI_NODATA: return UV_EAI_NODATA; #endif #if defined(EAI_NONAME) # if !defined(EAI_NODATA) || EAI_NODATA != EAI_NONAME case EAI_NONAME: return UV_EAI_NONAME; # endif #endif #if defined(EAI_OVERFLOW) case EAI_OVERFLOW: return UV_EAI_OVERFLOW; #endif #if defined(EAI_PROTOCOL) case EAI_PROTOCOL: return UV_EAI_PROTOCOL; #endif #if defined(EAI_SERVICE) case EAI_SERVICE: return UV_EAI_SERVICE; #endif #if defined(EAI_SOCKTYPE) case EAI_SOCKTYPE: return UV_EAI_SOCKTYPE; #endif #if defined(EAI_SYSTEM) case EAI_SYSTEM: return UV__ERR(errno); #endif } assert(!"unknown EAI_* error code"); abort(); #ifndef __SUNPRO_C return 0; /* Pacify compiler. */ #endif } static void uv__getaddrinfo_work(struct uv__work* w) { uv_getaddrinfo_t* req; int err; req = container_of(w, uv_getaddrinfo_t, work_req); err = getaddrinfo(req->hostname, req->service, req->hints, &req->addrinfo); req->retcode = uv__getaddrinfo_translate_error(err); } static void uv__getaddrinfo_done(struct uv__work* w, int status) { uv_getaddrinfo_t* req; req = container_of(w, uv_getaddrinfo_t, work_req); uv__req_unregister(req->loop, req); /* See initialization in uv_getaddrinfo(). */ if (req->hints) uv__free(req->hints); else if (req->service) uv__free(req->service); else if (req->hostname) uv__free(req->hostname); else assert(0); req->hints = NULL; req->service = NULL; req->hostname = NULL; if (status == UV_ECANCELED) { assert(req->retcode == 0); req->retcode = UV_EAI_CANCELED; } if (req->cb) req->cb(req, req->retcode, req->addrinfo); } int uv_getaddrinfo(uv_loop_t* loop, uv_getaddrinfo_t* req, uv_getaddrinfo_cb cb, const char* hostname, const char* service, const struct addrinfo* hints) { char hostname_ascii[256]; size_t hostname_len; size_t service_len; size_t hints_len; size_t len; char* buf; long rc; if (req == NULL || (hostname == NULL && service == NULL)) return UV_EINVAL; /* FIXME(bnoordhuis) IDNA does not seem to work z/OS, * probably because it uses EBCDIC rather than ASCII. */ #ifdef __MVS__ (void) &hostname_ascii; #else if (hostname != NULL) { rc = uv__idna_toascii(hostname, hostname + strlen(hostname), hostname_ascii, hostname_ascii + sizeof(hostname_ascii)); if (rc < 0) return rc; hostname = hostname_ascii; } #endif hostname_len = hostname ? strlen(hostname) + 1 : 0; service_len = service ? strlen(service) + 1 : 0; hints_len = hints ? sizeof(*hints) : 0; buf = uv__malloc(hostname_len + service_len + hints_len); if (buf == NULL) return UV_ENOMEM; uv__req_init(loop, req, UV_GETADDRINFO); req->loop = loop; req->cb = cb; req->addrinfo = NULL; req->hints = NULL; req->service = NULL; req->hostname = NULL; req->retcode = 0; /* order matters, see uv_getaddrinfo_done() */ len = 0; if (hints) { req->hints = memcpy(buf + len, hints, sizeof(*hints)); len += sizeof(*hints); } if (service) { req->service = memcpy(buf + len, service, service_len); len += service_len; } if (hostname) req->hostname = memcpy(buf + len, hostname, hostname_len); if (cb) { uv__work_submit(loop, &req->work_req, UV__WORK_SLOW_IO, uv__getaddrinfo_work, uv__getaddrinfo_done); return 0; } else { uv__getaddrinfo_work(&req->work_req); uv__getaddrinfo_done(&req->work_req, 0); return req->retcode; } } void uv_freeaddrinfo(struct addrinfo* ai) { if (ai) freeaddrinfo(ai); } int uv_if_indextoname(unsigned int ifindex, char* buffer, size_t* size) { char ifname_buf[UV_IF_NAMESIZE]; size_t len; if (buffer == NULL || size == NULL || *size == 0) return UV_EINVAL; if (if_indextoname(ifindex, ifname_buf) == NULL) return UV__ERR(errno); len = strnlen(ifname_buf, sizeof(ifname_buf)); if (*size <= len) { *size = len + 1; return UV_ENOBUFS; } memcpy(buffer, ifname_buf, len); buffer[len] = '\0'; *size = len; return 0; } int uv_if_indextoiid(unsigned int ifindex, char* buffer, size_t* size) { return uv_if_indextoname(ifindex, buffer, size); } ================================================ FILE: external/libuv/src/unix/getnameinfo.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include #include "uv.h" #include "internal.h" static void uv__getnameinfo_work(struct uv__work* w) { uv_getnameinfo_t* req; int err; socklen_t salen; req = container_of(w, uv_getnameinfo_t, work_req); if (req->storage.ss_family == AF_INET) salen = sizeof(struct sockaddr_in); else if (req->storage.ss_family == AF_INET6) salen = sizeof(struct sockaddr_in6); else abort(); err = getnameinfo((struct sockaddr*) &req->storage, salen, req->host, sizeof(req->host), req->service, sizeof(req->service), req->flags); req->retcode = uv__getaddrinfo_translate_error(err); } static void uv__getnameinfo_done(struct uv__work* w, int status) { uv_getnameinfo_t* req; char* host; char* service; req = container_of(w, uv_getnameinfo_t, work_req); uv__req_unregister(req->loop, req); host = service = NULL; if (status == UV_ECANCELED) { assert(req->retcode == 0); req->retcode = UV_EAI_CANCELED; } else if (req->retcode == 0) { host = req->host; service = req->service; } if (req->getnameinfo_cb) req->getnameinfo_cb(req, req->retcode, host, service); } /* * Entry point for getnameinfo * return 0 if a callback will be made * return error code if validation fails */ int uv_getnameinfo(uv_loop_t* loop, uv_getnameinfo_t* req, uv_getnameinfo_cb getnameinfo_cb, const struct sockaddr* addr, int flags) { if (req == NULL || addr == NULL) return UV_EINVAL; if (addr->sa_family == AF_INET) { memcpy(&req->storage, addr, sizeof(struct sockaddr_in)); } else if (addr->sa_family == AF_INET6) { memcpy(&req->storage, addr, sizeof(struct sockaddr_in6)); } else { return UV_EINVAL; } uv__req_init(loop, (uv_req_t*)req, UV_GETNAMEINFO); req->getnameinfo_cb = getnameinfo_cb; req->flags = flags; req->type = UV_GETNAMEINFO; req->loop = loop; req->retcode = 0; if (getnameinfo_cb) { uv__work_submit(loop, &req->work_req, UV__WORK_SLOW_IO, uv__getnameinfo_work, uv__getnameinfo_done); return 0; } else { uv__getnameinfo_work(&req->work_req); uv__getnameinfo_done(&req->work_req, 0); return req->retcode; } } ================================================ FILE: external/libuv/src/unix/haiku.c ================================================ /* Copyright libuv project contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include /* find_path() */ #include void uv_loadavg(double avg[3]) { avg[0] = 0; avg[1] = 0; avg[2] = 0; } int uv_exepath(char* buffer, size_t* size) { char abspath[B_PATH_NAME_LENGTH]; status_t status; ssize_t abspath_len; if (buffer == NULL || size == NULL || *size == 0) return UV_EINVAL; status = find_path(B_APP_IMAGE_SYMBOL, B_FIND_PATH_IMAGE_PATH, NULL, abspath, sizeof(abspath)); if (status != B_OK) return UV__ERR(status); abspath_len = uv__strscpy(buffer, abspath, *size); *size -= 1; if (abspath_len >= 0 && *size > (size_t)abspath_len) *size = (size_t)abspath_len; return 0; } uint64_t uv_get_free_memory(void) { status_t status; system_info sinfo; status = get_system_info(&sinfo); if (status != B_OK) return 0; return (sinfo.max_pages - sinfo.used_pages) * B_PAGE_SIZE; } uint64_t uv_get_total_memory(void) { status_t status; system_info sinfo; status = get_system_info(&sinfo); if (status != B_OK) return 0; return sinfo.max_pages * B_PAGE_SIZE; } uint64_t uv_get_constrained_memory(void) { return 0; /* Memory constraints are unknown. */ } int uv_resident_set_memory(size_t* rss) { area_info area; ssize_t cookie; status_t status; thread_info thread; status = get_thread_info(find_thread(NULL), &thread); if (status != B_OK) return UV__ERR(status); cookie = 0; *rss = 0; while (get_next_area_info(thread.team, &cookie, &area) == B_OK) *rss += area.ram_size; return 0; } int uv_uptime(double* uptime) { /* system_time() returns time since booting in microseconds */ *uptime = (double)system_time() / 1000000; return 0; } int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { cpu_topology_node_info* topology_infos; int i; status_t status; system_info system; uint32_t topology_count; uint64_t cpuspeed; uv_cpu_info_t* cpu_info; if (cpu_infos == NULL || count == NULL) return UV_EINVAL; status = get_cpu_topology_info(NULL, &topology_count); if (status != B_OK) return UV__ERR(status); topology_infos = uv__malloc(topology_count * sizeof(*topology_infos)); if (topology_infos == NULL) return UV_ENOMEM; status = get_cpu_topology_info(topology_infos, &topology_count); if (status != B_OK) { uv__free(topology_infos); return UV__ERR(status); } cpuspeed = 0; for (i = 0; i < (int)topology_count; i++) { if (topology_infos[i].type == B_TOPOLOGY_CORE) { cpuspeed = topology_infos[i].data.core.default_frequency; break; } } uv__free(topology_infos); status = get_system_info(&system); if (status != B_OK) return UV__ERR(status); *cpu_infos = uv__calloc(system.cpu_count, sizeof(**cpu_infos)); if (*cpu_infos == NULL) return UV_ENOMEM; /* CPU time and model are not exposed by Haiku. */ cpu_info = *cpu_infos; for (i = 0; i < (int)system.cpu_count; i++) { cpu_info->model = uv__strdup("unknown"); cpu_info->speed = (int)(cpuspeed / 1000000); cpu_info++; } *count = system.cpu_count; return 0; } ================================================ FILE: external/libuv/src/unix/ibmi.c ================================================ /* Copyright libuv project contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include typedef struct { int bytes_available; int bytes_returned; char current_date_and_time[8]; char system_name[8]; char elapsed_time[6]; char restricted_state_flag; char reserved; int percent_processing_unit_used; int jobs_in_system; int percent_permanent_addresses; int percent_temporary_addresses; int system_asp; int percent_system_asp_used; int total_auxiliary_storage; int current_unprotected_storage_used; int maximum_unprotected_storage_used; int percent_db_capability; int main_storage_size; int number_of_partitions; int partition_identifier; int reserved1; int current_processing_capacity; char processor_sharing_attribute; char reserved2[3]; int number_of_processors; int active_jobs_in_system; int active_threads_in_system; int maximum_jobs_in_system; int percent_temporary_256mb_segments_used; int percent_temporary_4gb_segments_used; int percent_permanent_256mb_segments_used; int percent_permanent_4gb_segments_used; int percent_current_interactive_performance; int percent_uncapped_cpu_capacity_used; int percent_shared_processor_pool_used; long main_storage_size_long; } SSTS0200; typedef struct { char header[208]; unsigned char loca_adapter_address[12]; } LIND0500; typedef struct { int bytes_provided; int bytes_available; char msgid[7]; } errcode_s; static const unsigned char e2a[256] = { 0, 1, 2, 3, 156, 9, 134, 127, 151, 141, 142, 11, 12, 13, 14, 15, 16, 17, 18, 19, 157, 133, 8, 135, 24, 25, 146, 143, 28, 29, 30, 31, 128, 129, 130, 131, 132, 10, 23, 27, 136, 137, 138, 139, 140, 5, 6, 7, 144, 145, 22, 147, 148, 149, 150, 4, 152, 153, 154, 155, 20, 21, 158, 26, 32, 160, 161, 162, 163, 164, 165, 166, 167, 168, 91, 46, 60, 40, 43, 33, 38, 169, 170, 171, 172, 173, 174, 175, 176, 177, 93, 36, 42, 41, 59, 94, 45, 47, 178, 179, 180, 181, 182, 183, 184, 185, 124, 44, 37, 95, 62, 63, 186, 187, 188, 189, 190, 191, 192, 193, 194, 96, 58, 35, 64, 39, 61, 34, 195, 97, 98, 99, 100, 101, 102, 103, 104, 105, 196, 197, 198, 199, 200, 201, 202, 106, 107, 108, 109, 110, 111, 112, 113, 114, 203, 204, 205, 206, 207, 208, 209, 126, 115, 116, 117, 118, 119, 120, 121, 122, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 123, 65, 66, 67, 68, 69, 70, 71, 72, 73, 232, 233, 234, 235, 236, 237, 125, 74, 75, 76, 77, 78, 79, 80, 81, 82, 238, 239, 240, 241, 242, 243, 92, 159, 83, 84, 85, 86, 87, 88, 89, 90, 244, 245, 246, 247, 248, 249, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 250, 251, 252, 253, 254, 255}; static const unsigned char a2e[256] = { 0, 1, 2, 3, 55, 45, 46, 47, 22, 5, 37, 11, 12, 13, 14, 15, 16, 17, 18, 19, 60, 61, 50, 38, 24, 25, 63, 39, 28, 29, 30, 31, 64, 79, 127, 123, 91, 108, 80, 125, 77, 93, 92, 78, 107, 96, 75, 97, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 122, 94, 76, 126, 110, 111, 124, 193, 194, 195, 196, 197, 198, 199, 200, 201, 209, 210, 211, 212, 213, 214, 215, 216, 217, 226, 227, 228, 229, 230, 231, 232, 233, 74, 224, 90, 95, 109, 121, 129, 130, 131, 132, 133, 134, 135, 136, 137, 145, 146, 147, 148, 149, 150, 151, 152, 153, 162, 163, 164, 165, 166, 167, 168, 169, 192, 106, 208, 161, 7, 32, 33, 34, 35, 36, 21, 6, 23, 40, 41, 42, 43, 44, 9, 10, 27, 48, 49, 26, 51, 52, 53, 54, 8, 56, 57, 58, 59, 4, 20, 62, 225, 65, 66, 67, 68, 69, 70, 71, 72, 73, 81, 82, 83, 84, 85, 86, 87, 88, 89, 98, 99, 100, 101, 102, 103, 104, 105, 112, 113, 114, 115, 116, 117, 118, 119, 120, 128, 138, 139, 140, 141, 142, 143, 144, 154, 155, 156, 157, 158, 159, 160, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 202, 203, 204, 205, 206, 207, 218, 219, 220, 221, 222, 223, 234, 235, 236, 237, 238, 239, 250, 251, 252, 253, 254, 255}; static void iconv_e2a(unsigned char src[], unsigned char dst[], size_t length) { size_t i; for (i = 0; i < length; i++) dst[i] = e2a[src[i]]; } static void iconv_a2e(const char* src, unsigned char dst[], size_t length) { size_t srclen; size_t i; srclen = strlen(src); if (srclen > length) abort(); for (i = 0; i < srclen; i++) dst[i] = a2e[src[i]]; /* padding the remaining part with spaces */ for (; i < length; i++) dst[i] = a2e[' ']; } static int get_ibmi_system_status(SSTS0200* rcvr) { /* rcvrlen is input parameter 2 to QWCRSSTS */ unsigned int rcvrlen = sizeof(*rcvr); unsigned char format[8], reset_status[10]; /* format is input parameter 3 to QWCRSSTS */ iconv_a2e("SSTS0200", format, sizeof(format)); /* reset_status is input parameter 4 */ iconv_a2e("*NO", reset_status, sizeof(reset_status)); /* errcode is input parameter 5 to QWCRSSTS */ errcode_s errcode; /* qwcrssts_pointer is the 16-byte tagged system pointer to QWCRSSTS */ ILEpointer __attribute__((aligned(16))) qwcrssts_pointer; /* qwcrssts_argv is the array of argument pointers to QWCRSSTS */ void* qwcrssts_argv[6]; /* Set the IBM i pointer to the QSYS/QWCRSSTS *PGM object */ int rc = _RSLOBJ2(&qwcrssts_pointer, RSLOBJ_TS_PGM, "QWCRSSTS", "QSYS"); if (rc != 0) return rc; /* initialize the QWCRSSTS returned info structure */ memset(rcvr, 0, sizeof(*rcvr)); /* initialize the QWCRSSTS error code structure */ memset(&errcode, 0, sizeof(errcode)); errcode.bytes_provided = sizeof(errcode); /* initialize the array of argument pointers for the QWCRSSTS API */ qwcrssts_argv[0] = rcvr; qwcrssts_argv[1] = &rcvrlen; qwcrssts_argv[2] = &format; qwcrssts_argv[3] = &reset_status; qwcrssts_argv[4] = &errcode; qwcrssts_argv[5] = NULL; /* Call the IBM i QWCRSSTS API from PASE */ rc = _PGMCALL(&qwcrssts_pointer, qwcrssts_argv, 0); return rc; } uint64_t uv_get_free_memory(void) { SSTS0200 rcvr; if (get_ibmi_system_status(&rcvr)) return 0; return (uint64_t)rcvr.main_storage_size * 1024ULL; } uint64_t uv_get_total_memory(void) { SSTS0200 rcvr; if (get_ibmi_system_status(&rcvr)) return 0; return (uint64_t)rcvr.main_storage_size * 1024ULL; } uint64_t uv_get_constrained_memory(void) { return 0; /* Memory constraints are unknown. */ } void uv_loadavg(double avg[3]) { SSTS0200 rcvr; if (get_ibmi_system_status(&rcvr)) { avg[0] = avg[1] = avg[2] = 0; return; } /* The average (in tenths) of the elapsed time during which the processing * units were in use. For example, a value of 411 in binary would be 41.1%. * This percentage could be greater than 100% for an uncapped partition. */ double processing_unit_used_percent = rcvr.percent_processing_unit_used / 1000.0; avg[0] = avg[1] = avg[2] = processing_unit_used_percent; } int uv_resident_set_memory(size_t* rss) { *rss = 0; return 0; } int uv_uptime(double* uptime) { return UV_ENOSYS; } int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { unsigned int numcpus, idx = 0; uv_cpu_info_t* cpu_info; *cpu_infos = NULL; *count = 0; numcpus = sysconf(_SC_NPROCESSORS_ONLN); *cpu_infos = uv__malloc(numcpus * sizeof(uv_cpu_info_t)); if (!*cpu_infos) { return UV_ENOMEM; } cpu_info = *cpu_infos; for (idx = 0; idx < numcpus; idx++) { cpu_info->speed = 0; cpu_info->model = uv__strdup("unknown"); cpu_info->cpu_times.user = 0; cpu_info->cpu_times.sys = 0; cpu_info->cpu_times.idle = 0; cpu_info->cpu_times.irq = 0; cpu_info->cpu_times.nice = 0; cpu_info++; } *count = numcpus; return 0; } static int get_ibmi_physical_address(const char* line, char (*phys_addr)[6]) { LIND0500 rcvr; /* rcvrlen is input parameter 2 to QDCRLIND */ unsigned int rcvrlen = sizeof(rcvr); unsigned char format[8], line_name[10]; unsigned char mac_addr[sizeof(rcvr.loca_adapter_address)]; int c[6]; /* format is input parameter 3 to QDCRLIND */ iconv_a2e("LIND0500", format, sizeof(format)); /* line_name is input parameter 4 to QDCRLIND */ iconv_a2e(line, line_name, sizeof(line_name)); /* err is input parameter 5 to QDCRLIND */ errcode_s err; /* qwcrssts_pointer is the 16-byte tagged system pointer to QDCRLIND */ ILEpointer __attribute__((aligned(16))) qdcrlind_pointer; /* qwcrssts_argv is the array of argument pointers to QDCRLIND */ void* qdcrlind_argv[6]; /* Set the IBM i pointer to the QSYS/QDCRLIND *PGM object */ int rc = _RSLOBJ2(&qdcrlind_pointer, RSLOBJ_TS_PGM, "QDCRLIND", "QSYS"); if (rc != 0) return rc; /* initialize the QDCRLIND returned info structure */ memset(&rcvr, 0, sizeof(rcvr)); /* initialize the QDCRLIND error code structure */ memset(&err, 0, sizeof(err)); err.bytes_provided = sizeof(err); /* initialize the array of argument pointers for the QDCRLIND API */ qdcrlind_argv[0] = &rcvr; qdcrlind_argv[1] = &rcvrlen; qdcrlind_argv[2] = &format; qdcrlind_argv[3] = &line_name; qdcrlind_argv[4] = &err; qdcrlind_argv[5] = NULL; /* Call the IBM i QDCRLIND API from PASE */ rc = _PGMCALL(&qdcrlind_pointer, qdcrlind_argv, 0); if (rc != 0) return rc; /* convert ebcdic loca_adapter_address to ascii first */ iconv_e2a(rcvr.loca_adapter_address, mac_addr, sizeof(rcvr.loca_adapter_address)); /* convert loca_adapter_address(char[12]) to phys_addr(char[6]) */ int r = sscanf(mac_addr, "%02x%02x%02x%02x%02x%02x", &c[0], &c[1], &c[2], &c[3], &c[4], &c[5]); if (r == ARRAY_SIZE(c)) { (*phys_addr)[0] = c[0]; (*phys_addr)[1] = c[1]; (*phys_addr)[2] = c[2]; (*phys_addr)[3] = c[3]; (*phys_addr)[4] = c[4]; (*phys_addr)[5] = c[5]; } else { memset(*phys_addr, 0, sizeof(*phys_addr)); rc = -1; } return rc; } int uv_interface_addresses(uv_interface_address_t** addresses, int* count) { uv_interface_address_t* address; struct ifaddrs_pase *ifap = NULL, *cur; int inet6, r = 0; *count = 0; *addresses = NULL; if (Qp2getifaddrs(&ifap)) return UV_ENOSYS; /* The first loop to get the size of the array to be allocated */ for (cur = ifap; cur; cur = cur->ifa_next) { if (!(cur->ifa_addr->sa_family == AF_INET6 || cur->ifa_addr->sa_family == AF_INET)) continue; if (!(cur->ifa_flags & IFF_UP && cur->ifa_flags & IFF_RUNNING)) continue; (*count)++; } if (*count == 0) { Qp2freeifaddrs(ifap); return 0; } /* Alloc the return interface structs */ *addresses = uv__calloc(*count, sizeof(**addresses)); if (*addresses == NULL) { Qp2freeifaddrs(ifap); return UV_ENOMEM; } address = *addresses; /* The second loop to fill in the array */ for (cur = ifap; cur; cur = cur->ifa_next) { if (!(cur->ifa_addr->sa_family == AF_INET6 || cur->ifa_addr->sa_family == AF_INET)) continue; if (!(cur->ifa_flags & IFF_UP && cur->ifa_flags & IFF_RUNNING)) continue; address->name = uv__strdup(cur->ifa_name); inet6 = (cur->ifa_addr->sa_family == AF_INET6); if (inet6) { address->address.address6 = *((struct sockaddr_in6*)cur->ifa_addr); address->netmask.netmask6 = *((struct sockaddr_in6*)cur->ifa_netmask); address->netmask.netmask6.sin6_family = AF_INET6; } else { address->address.address4 = *((struct sockaddr_in*)cur->ifa_addr); address->netmask.netmask4 = *((struct sockaddr_in*)cur->ifa_netmask); address->netmask.netmask4.sin_family = AF_INET; } address->is_internal = cur->ifa_flags & IFF_LOOPBACK ? 1 : 0; if (!address->is_internal) { int rc = get_ibmi_physical_address(address->name, &address->phys_addr); if (rc != 0) r = rc; } address++; } Qp2freeifaddrs(ifap); return r; } void uv_free_interface_addresses(uv_interface_address_t* addresses, int count) { int i; for (i = 0; i < count; ++i) { uv__free(addresses[i].name); } uv__free(addresses); } ================================================ FILE: external/libuv/src/unix/internal.h ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #ifndef UV_UNIX_INTERNAL_H_ #define UV_UNIX_INTERNAL_H_ #include "uv-common.h" #include #include /* _POSIX_PATH_MAX, PATH_MAX */ #include /* abort */ #include /* strrchr */ #include /* O_CLOEXEC and O_NONBLOCK, if supported. */ #include #include #include #if defined(__STRICT_ANSI__) # define inline __inline #endif #if defined(__linux__) # include "linux-syscalls.h" #endif /* __linux__ */ #if defined(__MVS__) # include "os390-syscalls.h" #endif /* __MVS__ */ #if defined(__sun) # include # include #endif /* __sun */ #if defined(_AIX) # define reqevents events # define rtnevents revents # include #else # include #endif /* _AIX */ #if defined(__APPLE__) && !TARGET_OS_IPHONE # include #endif #if defined(_POSIX_PATH_MAX) # define UV__PATH_MAX _POSIX_PATH_MAX #elif defined(PATH_MAX) # define UV__PATH_MAX PATH_MAX #else # define UV__PATH_MAX 8192 #endif #if defined(__ANDROID__) int uv__pthread_sigmask(int how, const sigset_t* set, sigset_t* oset); # ifdef pthread_sigmask # undef pthread_sigmask # endif # define pthread_sigmask(how, set, oldset) uv__pthread_sigmask(how, set, oldset) #endif #define ACCESS_ONCE(type, var) \ (*(volatile type*) &(var)) #define ROUND_UP(a, b) \ ((a) % (b) ? ((a) + (b)) - ((a) % (b)) : (a)) #define UNREACHABLE() \ do { \ assert(0 && "unreachable code"); \ abort(); \ } \ while (0) #define SAVE_ERRNO(block) \ do { \ int _saved_errno = errno; \ do { block; } while (0); \ errno = _saved_errno; \ } \ while (0) /* The __clang__ and __INTEL_COMPILER checks are superfluous because they * define __GNUC__. They are here to convey to you, dear reader, that these * macros are enabled when compiling with clang or icc. */ #if defined(__clang__) || \ defined(__GNUC__) || \ defined(__INTEL_COMPILER) # define UV_UNUSED(declaration) __attribute__((unused)) declaration #else # define UV_UNUSED(declaration) declaration #endif /* Leans on the fact that, on Linux, POLLRDHUP == EPOLLRDHUP. */ #ifdef POLLRDHUP # define UV__POLLRDHUP POLLRDHUP #else # define UV__POLLRDHUP 0x2000 #endif #ifdef POLLPRI # define UV__POLLPRI POLLPRI #else # define UV__POLLPRI 0 #endif #if !defined(O_CLOEXEC) && defined(__FreeBSD__) /* * It may be that we are just missing `__POSIX_VISIBLE >= 200809`. * Try using fixed value const and give up, if it doesn't work */ # define O_CLOEXEC 0x00100000 #endif typedef struct uv__stream_queued_fds_s uv__stream_queued_fds_t; /* loop flags */ enum { UV_LOOP_BLOCK_SIGPROF = 1 }; /* flags of excluding ifaddr */ enum { UV__EXCLUDE_IFPHYS, UV__EXCLUDE_IFADDR }; typedef enum { UV_CLOCK_PRECISE = 0, /* Use the highest resolution clock available. */ UV_CLOCK_FAST = 1 /* Use the fastest clock with <= 1ms granularity. */ } uv_clocktype_t; struct uv__stream_queued_fds_s { unsigned int size; unsigned int offset; int fds[1]; }; #if defined(_AIX) || \ defined(__APPLE__) || \ defined(__DragonFly__) || \ defined(__FreeBSD__) || \ defined(__FreeBSD_kernel__) || \ defined(__linux__) || \ defined(__OpenBSD__) || \ defined(__NetBSD__) #define uv__cloexec uv__cloexec_ioctl #define uv__nonblock uv__nonblock_ioctl #else #define uv__cloexec uv__cloexec_fcntl #define uv__nonblock uv__nonblock_fcntl #endif /* On Linux, uv__nonblock_fcntl() and uv__nonblock_ioctl() do not commute * when O_NDELAY is not equal to O_NONBLOCK. Case in point: linux/sparc32 * and linux/sparc64, where O_NDELAY is O_NONBLOCK + another bit. * * Libuv uses uv__nonblock_fcntl() directly sometimes so ensure that it * commutes with uv__nonblock(). */ #if defined(__linux__) && O_NDELAY != O_NONBLOCK #undef uv__nonblock #define uv__nonblock uv__nonblock_fcntl #endif /* core */ int uv__cloexec_ioctl(int fd, int set); int uv__cloexec_fcntl(int fd, int set); int uv__nonblock_ioctl(int fd, int set); int uv__nonblock_fcntl(int fd, int set); int uv__close(int fd); /* preserves errno */ int uv__close_nocheckstdio(int fd); int uv__close_nocancel(int fd); int uv__socket(int domain, int type, int protocol); ssize_t uv__recvmsg(int fd, struct msghdr *msg, int flags); void uv__make_close_pending(uv_handle_t* handle); int uv__getiovmax(void); void uv__io_init(uv__io_t* w, uv__io_cb cb, int fd); void uv__io_start(uv_loop_t* loop, uv__io_t* w, unsigned int events); void uv__io_stop(uv_loop_t* loop, uv__io_t* w, unsigned int events); void uv__io_close(uv_loop_t* loop, uv__io_t* w); void uv__io_feed(uv_loop_t* loop, uv__io_t* w); int uv__io_active(const uv__io_t* w, unsigned int events); int uv__io_check_fd(uv_loop_t* loop, int fd); void uv__io_poll(uv_loop_t* loop, int timeout); /* in milliseconds or -1 */ int uv__io_fork(uv_loop_t* loop); int uv__fd_exists(uv_loop_t* loop, int fd); /* async */ void uv__async_stop(uv_loop_t* loop); int uv__async_fork(uv_loop_t* loop); /* loop */ void uv__run_idle(uv_loop_t* loop); void uv__run_check(uv_loop_t* loop); void uv__run_prepare(uv_loop_t* loop); /* stream */ void uv__stream_init(uv_loop_t* loop, uv_stream_t* stream, uv_handle_type type); int uv__stream_open(uv_stream_t*, int fd, int flags); void uv__stream_destroy(uv_stream_t* stream); #if defined(__APPLE__) int uv__stream_try_select(uv_stream_t* stream, int* fd); #endif /* defined(__APPLE__) */ void uv__server_io(uv_loop_t* loop, uv__io_t* w, unsigned int events); int uv__accept(int sockfd); int uv__dup2_cloexec(int oldfd, int newfd); int uv__open_cloexec(const char* path, int flags); /* tcp */ int uv_tcp_listen(uv_tcp_t* tcp, int backlog, uv_connection_cb cb); int uv__tcp_nodelay(int fd, int on); int uv__tcp_keepalive(int fd, int on, unsigned int delay); /* pipe */ int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb); /* signal */ void uv__signal_close(uv_signal_t* handle); void uv__signal_global_once_init(void); void uv__signal_loop_cleanup(uv_loop_t* loop); int uv__signal_loop_fork(uv_loop_t* loop); /* platform specific */ uint64_t uv__hrtime(uv_clocktype_t type); int uv__kqueue_init(uv_loop_t* loop); int uv__platform_loop_init(uv_loop_t* loop); void uv__platform_loop_delete(uv_loop_t* loop); void uv__platform_invalidate_fd(uv_loop_t* loop, int fd); /* various */ void uv__async_close(uv_async_t* handle); void uv__check_close(uv_check_t* handle); void uv__fs_event_close(uv_fs_event_t* handle); void uv__idle_close(uv_idle_t* handle); void uv__pipe_close(uv_pipe_t* handle); void uv__poll_close(uv_poll_t* handle); void uv__prepare_close(uv_prepare_t* handle); void uv__process_close(uv_process_t* handle); void uv__stream_close(uv_stream_t* handle); void uv__tcp_close(uv_tcp_t* handle); void uv__udp_close(uv_udp_t* handle); void uv__udp_finish_close(uv_udp_t* handle); uv_handle_type uv__handle_type(int fd); FILE* uv__open_file(const char* path); int uv__getpwuid_r(uv_passwd_t* pwd); /* random */ int uv__random_devurandom(void* buf, size_t buflen); int uv__random_getrandom(void* buf, size_t buflen); int uv__random_getentropy(void* buf, size_t buflen); int uv__random_readpath(const char* path, void* buf, size_t buflen); int uv__random_sysctl(void* buf, size_t buflen); #if defined(__APPLE__) int uv___stream_fd(const uv_stream_t* handle); #define uv__stream_fd(handle) (uv___stream_fd((const uv_stream_t*) (handle))) #else #define uv__stream_fd(handle) ((handle)->io_watcher.fd) #endif /* defined(__APPLE__) */ #ifdef O_NONBLOCK # define UV__F_NONBLOCK O_NONBLOCK #else # define UV__F_NONBLOCK 1 #endif int uv__make_pipe(int fds[2], int flags); #if defined(__APPLE__) int uv__fsevents_init(uv_fs_event_t* handle); int uv__fsevents_close(uv_fs_event_t* handle); void uv__fsevents_loop_delete(uv_loop_t* loop); #endif /* defined(__APPLE__) */ UV_UNUSED(static void uv__update_time(uv_loop_t* loop)) { /* Use a fast time source if available. We only need millisecond precision. */ loop->time = uv__hrtime(UV_CLOCK_FAST) / 1000000; } UV_UNUSED(static char* uv__basename_r(const char* path)) { char* s; s = strrchr(path, '/'); if (s == NULL) return (char*) path; return s + 1; } #if defined(__linux__) int uv__inotify_fork(uv_loop_t* loop, void* old_watchers); #endif typedef int (*uv__peersockfunc)(int, struct sockaddr*, socklen_t*); int uv__getsockpeername(const uv_handle_t* handle, uv__peersockfunc func, struct sockaddr* name, int* namelen); #if defined(__linux__) || \ defined(__FreeBSD__) || \ defined(__FreeBSD_kernel__) #define HAVE_MMSG 1 struct uv__mmsghdr { struct msghdr msg_hdr; unsigned int msg_len; }; int uv__recvmmsg(int fd, struct uv__mmsghdr* mmsg, unsigned int vlen, unsigned int flags, struct timespec* timeout); int uv__sendmmsg(int fd, struct uv__mmsghdr* mmsg, unsigned int vlen, unsigned int flags); #else #define HAVE_MMSG 0 #endif #endif /* UV_UNIX_INTERNAL_H_ */ ================================================ FILE: external/libuv/src/unix/kqueue.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include #include #include #include #include #include /* * Required on * - Until at least FreeBSD 11.0 * - Older versions of Mac OS X * * http://www.boost.org/doc/libs/1_61_0/boost/asio/detail/kqueue_reactor.hpp */ #ifndef EV_OOBAND #define EV_OOBAND EV_FLAG1 #endif static void uv__fs_event(uv_loop_t* loop, uv__io_t* w, unsigned int fflags); int uv__kqueue_init(uv_loop_t* loop) { loop->backend_fd = kqueue(); if (loop->backend_fd == -1) return UV__ERR(errno); uv__cloexec(loop->backend_fd, 1); return 0; } #if defined(__APPLE__) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 static int uv__has_forked_with_cfrunloop; #endif int uv__io_fork(uv_loop_t* loop) { int err; loop->backend_fd = -1; err = uv__kqueue_init(loop); if (err) return err; #if defined(__APPLE__) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 if (loop->cf_state != NULL) { /* We cannot start another CFRunloop and/or thread in the child process; CF aborts if you try or if you try to touch the thread at all to kill it. So the best we can do is ignore it from now on. This means we can't watch directories in the same way anymore (like other BSDs). It also means we cannot properly clean up the allocated resources; calling uv__fsevents_loop_delete from uv_loop_close will crash the process. So we sidestep the issue by pretending like we never started it in the first place. */ uv__has_forked_with_cfrunloop = 1; uv__free(loop->cf_state); loop->cf_state = NULL; } #endif /* #if defined(__APPLE__) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 */ return err; } int uv__io_check_fd(uv_loop_t* loop, int fd) { struct kevent ev; int rc; rc = 0; EV_SET(&ev, fd, EVFILT_READ, EV_ADD, 0, 0, 0); if (kevent(loop->backend_fd, &ev, 1, NULL, 0, NULL)) rc = UV__ERR(errno); EV_SET(&ev, fd, EVFILT_READ, EV_DELETE, 0, 0, 0); if (rc == 0) if (kevent(loop->backend_fd, &ev, 1, NULL, 0, NULL)) abort(); return rc; } void uv__io_poll(uv_loop_t* loop, int timeout) { struct kevent events[1024]; struct kevent* ev; struct timespec spec; unsigned int nevents; unsigned int revents; QUEUE* q; uv__io_t* w; sigset_t* pset; sigset_t set; uint64_t base; uint64_t diff; int have_signals; int filter; int fflags; int count; int nfds; int fd; int op; int i; if (loop->nfds == 0) { assert(QUEUE_EMPTY(&loop->watcher_queue)); return; } nevents = 0; while (!QUEUE_EMPTY(&loop->watcher_queue)) { q = QUEUE_HEAD(&loop->watcher_queue); QUEUE_REMOVE(q); QUEUE_INIT(q); w = QUEUE_DATA(q, uv__io_t, watcher_queue); assert(w->pevents != 0); assert(w->fd >= 0); assert(w->fd < (int) loop->nwatchers); if ((w->events & POLLIN) == 0 && (w->pevents & POLLIN) != 0) { filter = EVFILT_READ; fflags = 0; op = EV_ADD; if (w->cb == uv__fs_event) { filter = EVFILT_VNODE; fflags = NOTE_ATTRIB | NOTE_WRITE | NOTE_RENAME | NOTE_DELETE | NOTE_EXTEND | NOTE_REVOKE; op = EV_ADD | EV_ONESHOT; /* Stop the event from firing repeatedly. */ } EV_SET(events + nevents, w->fd, filter, op, fflags, 0, 0); if (++nevents == ARRAY_SIZE(events)) { if (kevent(loop->backend_fd, events, nevents, NULL, 0, NULL)) abort(); nevents = 0; } } if ((w->events & POLLOUT) == 0 && (w->pevents & POLLOUT) != 0) { EV_SET(events + nevents, w->fd, EVFILT_WRITE, EV_ADD, 0, 0, 0); if (++nevents == ARRAY_SIZE(events)) { if (kevent(loop->backend_fd, events, nevents, NULL, 0, NULL)) abort(); nevents = 0; } } if ((w->events & UV__POLLPRI) == 0 && (w->pevents & UV__POLLPRI) != 0) { EV_SET(events + nevents, w->fd, EV_OOBAND, EV_ADD, 0, 0, 0); if (++nevents == ARRAY_SIZE(events)) { if (kevent(loop->backend_fd, events, nevents, NULL, 0, NULL)) abort(); nevents = 0; } } w->events = w->pevents; } pset = NULL; if (loop->flags & UV_LOOP_BLOCK_SIGPROF) { pset = &set; sigemptyset(pset); sigaddset(pset, SIGPROF); } assert(timeout >= -1); base = loop->time; count = 48; /* Benchmarks suggest this gives the best throughput. */ for (;; nevents = 0) { if (timeout != -1) { spec.tv_sec = timeout / 1000; spec.tv_nsec = (timeout % 1000) * 1000000; } if (pset != NULL) pthread_sigmask(SIG_BLOCK, pset, NULL); nfds = kevent(loop->backend_fd, events, nevents, events, ARRAY_SIZE(events), timeout == -1 ? NULL : &spec); if (pset != NULL) pthread_sigmask(SIG_UNBLOCK, pset, NULL); /* Update loop->time unconditionally. It's tempting to skip the update when * timeout == 0 (i.e. non-blocking poll) but there is no guarantee that the * operating system didn't reschedule our process while in the syscall. */ SAVE_ERRNO(uv__update_time(loop)); if (nfds == 0) { assert(timeout != -1); return; } if (nfds == -1) { if (errno != EINTR) abort(); if (timeout == 0) return; if (timeout == -1) continue; /* Interrupted by a signal. Update timeout and poll again. */ goto update_timeout; } have_signals = 0; nevents = 0; assert(loop->watchers != NULL); loop->watchers[loop->nwatchers] = (void*) events; loop->watchers[loop->nwatchers + 1] = (void*) (uintptr_t) nfds; for (i = 0; i < nfds; i++) { ev = events + i; fd = ev->ident; /* Skip invalidated events, see uv__platform_invalidate_fd */ if (fd == -1) continue; w = loop->watchers[fd]; if (w == NULL) { /* File descriptor that we've stopped watching, disarm it. * TODO: batch up. */ struct kevent events[1]; EV_SET(events + 0, fd, ev->filter, EV_DELETE, 0, 0, 0); if (kevent(loop->backend_fd, events, 1, NULL, 0, NULL)) if (errno != EBADF && errno != ENOENT) abort(); continue; } if (ev->filter == EVFILT_VNODE) { assert(w->events == POLLIN); assert(w->pevents == POLLIN); w->cb(loop, w, ev->fflags); /* XXX always uv__fs_event() */ nevents++; continue; } revents = 0; if (ev->filter == EVFILT_READ) { if (w->pevents & POLLIN) { revents |= POLLIN; w->rcount = ev->data; } else { /* TODO batch up */ struct kevent events[1]; EV_SET(events + 0, fd, ev->filter, EV_DELETE, 0, 0, 0); if (kevent(loop->backend_fd, events, 1, NULL, 0, NULL)) if (errno != ENOENT) abort(); } } if (ev->filter == EV_OOBAND) { if (w->pevents & UV__POLLPRI) { revents |= UV__POLLPRI; w->rcount = ev->data; } else { /* TODO batch up */ struct kevent events[1]; EV_SET(events + 0, fd, ev->filter, EV_DELETE, 0, 0, 0); if (kevent(loop->backend_fd, events, 1, NULL, 0, NULL)) if (errno != ENOENT) abort(); } } if (ev->filter == EVFILT_WRITE) { if (w->pevents & POLLOUT) { revents |= POLLOUT; w->wcount = ev->data; } else { /* TODO batch up */ struct kevent events[1]; EV_SET(events + 0, fd, ev->filter, EV_DELETE, 0, 0, 0); if (kevent(loop->backend_fd, events, 1, NULL, 0, NULL)) if (errno != ENOENT) abort(); } } if (ev->flags & EV_ERROR) revents |= POLLERR; if ((ev->flags & EV_EOF) && (w->pevents & UV__POLLRDHUP)) revents |= UV__POLLRDHUP; if (revents == 0) continue; /* Run signal watchers last. This also affects child process watchers * because those are implemented in terms of signal watchers. */ if (w == &loop->signal_io_watcher) have_signals = 1; else w->cb(loop, w, revents); nevents++; } if (have_signals != 0) loop->signal_io_watcher.cb(loop, &loop->signal_io_watcher, POLLIN); loop->watchers[loop->nwatchers] = NULL; loop->watchers[loop->nwatchers + 1] = NULL; if (have_signals != 0) return; /* Event loop should cycle now so don't poll again. */ if (nevents != 0) { if (nfds == ARRAY_SIZE(events) && --count != 0) { /* Poll for more events but don't block this time. */ timeout = 0; continue; } return; } if (timeout == 0) return; if (timeout == -1) continue; update_timeout: assert(timeout > 0); diff = loop->time - base; if (diff >= (uint64_t) timeout) return; timeout -= diff; } } void uv__platform_invalidate_fd(uv_loop_t* loop, int fd) { struct kevent* events; uintptr_t i; uintptr_t nfds; assert(loop->watchers != NULL); assert(fd >= 0); events = (struct kevent*) loop->watchers[loop->nwatchers]; nfds = (uintptr_t) loop->watchers[loop->nwatchers + 1]; if (events == NULL) return; /* Invalidate events with same file descriptor */ for (i = 0; i < nfds; i++) if ((int) events[i].ident == fd) events[i].ident = -1; } static void uv__fs_event(uv_loop_t* loop, uv__io_t* w, unsigned int fflags) { uv_fs_event_t* handle; struct kevent ev; int events; const char* path; #if defined(F_GETPATH) /* MAXPATHLEN == PATH_MAX but the former is what XNU calls it internally. */ char pathbuf[MAXPATHLEN]; #endif handle = container_of(w, uv_fs_event_t, event_watcher); if (fflags & (NOTE_ATTRIB | NOTE_EXTEND)) events = UV_CHANGE; else events = UV_RENAME; path = NULL; #if defined(F_GETPATH) /* Also works when the file has been unlinked from the file system. Passing * in the path when the file has been deleted is arguably a little strange * but it's consistent with what the inotify backend does. */ if (fcntl(handle->event_watcher.fd, F_GETPATH, pathbuf) == 0) path = uv__basename_r(pathbuf); #endif handle->cb(handle, path, events, 0); if (handle->event_watcher.fd == -1) return; /* Watcher operates in one-shot mode, re-arm it. */ fflags = NOTE_ATTRIB | NOTE_WRITE | NOTE_RENAME | NOTE_DELETE | NOTE_EXTEND | NOTE_REVOKE; EV_SET(&ev, w->fd, EVFILT_VNODE, EV_ADD | EV_ONESHOT, fflags, 0, 0); if (kevent(loop->backend_fd, &ev, 1, NULL, 0, NULL)) abort(); } int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) { uv__handle_init(loop, (uv_handle_t*)handle, UV_FS_EVENT); return 0; } int uv_fs_event_start(uv_fs_event_t* handle, uv_fs_event_cb cb, const char* path, unsigned int flags) { int fd; #if defined(__APPLE__) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 struct stat statbuf; #endif if (uv__is_active(handle)) return UV_EINVAL; handle->cb = cb; handle->path = uv__strdup(path); if (handle->path == NULL) return UV_ENOMEM; /* TODO open asynchronously - but how do we report back errors? */ fd = open(handle->path, O_RDONLY); if (fd == -1) { uv__free(handle->path); handle->path = NULL; return UV__ERR(errno); } #if defined(__APPLE__) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 /* Nullify field to perform checks later */ handle->cf_cb = NULL; handle->realpath = NULL; handle->realpath_len = 0; handle->cf_flags = flags; if (fstat(fd, &statbuf)) goto fallback; /* FSEvents works only with directories */ if (!(statbuf.st_mode & S_IFDIR)) goto fallback; if (!uv__has_forked_with_cfrunloop) { int r; /* The fallback fd is no longer needed */ uv__close_nocheckstdio(fd); handle->event_watcher.fd = -1; r = uv__fsevents_init(handle); if (r == 0) { uv__handle_start(handle); } else { uv__free(handle->path); handle->path = NULL; } return r; } fallback: #endif /* #if defined(__APPLE__) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 */ uv__handle_start(handle); uv__io_init(&handle->event_watcher, uv__fs_event, fd); uv__io_start(handle->loop, &handle->event_watcher, POLLIN); return 0; } int uv_fs_event_stop(uv_fs_event_t* handle) { int r; r = 0; if (!uv__is_active(handle)) return 0; uv__handle_stop(handle); #if defined(__APPLE__) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 if (!uv__has_forked_with_cfrunloop && handle->cf_cb != NULL) r = uv__fsevents_close(handle); #endif if (handle->event_watcher.fd != -1) { uv__io_close(handle->loop, &handle->event_watcher); uv__close(handle->event_watcher.fd); handle->event_watcher.fd = -1; } uv__free(handle->path); handle->path = NULL; return r; } void uv__fs_event_close(uv_fs_event_t* handle) { uv_fs_event_stop(handle); } ================================================ FILE: external/libuv/src/unix/linux-core.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ /* We lean on the fact that POLL{IN,OUT,ERR,HUP} correspond with their * EPOLL* counterparts. We use the POLL* variants in this file because that * is what libuv uses elsewhere. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define HAVE_IFADDRS_H 1 #ifdef __UCLIBC__ # if __UCLIBC_MAJOR__ < 0 && __UCLIBC_MINOR__ < 9 && __UCLIBC_SUBLEVEL__ < 32 # undef HAVE_IFADDRS_H # endif #endif #ifdef HAVE_IFADDRS_H # if defined(__ANDROID__) # include "uv/android-ifaddrs.h" # else # include # endif # include # include # include #endif /* HAVE_IFADDRS_H */ /* Available from 2.6.32 onwards. */ #ifndef CLOCK_MONOTONIC_COARSE # define CLOCK_MONOTONIC_COARSE 6 #endif /* This is rather annoying: CLOCK_BOOTTIME lives in but we can't * include that file because it conflicts with . We'll just have to * define it ourselves. */ #ifndef CLOCK_BOOTTIME # define CLOCK_BOOTTIME 7 #endif static int read_models(unsigned int numcpus, uv_cpu_info_t* ci); static int read_times(FILE* statfile_fp, unsigned int numcpus, uv_cpu_info_t* ci); static void read_speeds(unsigned int numcpus, uv_cpu_info_t* ci); static uint64_t read_cpufreq(unsigned int cpunum); int uv__platform_loop_init(uv_loop_t* loop) { int fd; /* It was reported that EPOLL_CLOEXEC is not defined on Android API < 21, * a.k.a. Lollipop. Since EPOLL_CLOEXEC is an alias for O_CLOEXEC on all * architectures, we just use that instead. */ #if defined(__ANDROID_API__) && __ANDROID_API__ < 21 fd = -1; errno = ENOSYS; #else fd = epoll_create1(O_CLOEXEC); #endif /* epoll_create1() can fail either because it's not implemented (old kernel) * or because it doesn't understand the O_CLOEXEC flag. */ if (fd == -1 && (errno == ENOSYS || errno == EINVAL)) { fd = epoll_create(256); if (fd != -1) uv__cloexec(fd, 1); } loop->backend_fd = fd; loop->inotify_fd = -1; loop->inotify_watchers = NULL; if (fd == -1) return UV__ERR(errno); return 0; } int uv__io_fork(uv_loop_t* loop) { int err; void* old_watchers; old_watchers = loop->inotify_watchers; uv__close(loop->backend_fd); loop->backend_fd = -1; uv__platform_loop_delete(loop); err = uv__platform_loop_init(loop); if (err) return err; return uv__inotify_fork(loop, old_watchers); } void uv__platform_loop_delete(uv_loop_t* loop) { if (loop->inotify_fd == -1) return; uv__io_stop(loop, &loop->inotify_read_watcher, POLLIN); uv__close(loop->inotify_fd); loop->inotify_fd = -1; } void uv__platform_invalidate_fd(uv_loop_t* loop, int fd) { struct epoll_event* events; struct epoll_event dummy; uintptr_t i; uintptr_t nfds; assert(loop->watchers != NULL); assert(fd >= 0); events = (struct epoll_event*) loop->watchers[loop->nwatchers]; nfds = (uintptr_t) loop->watchers[loop->nwatchers + 1]; if (events != NULL) /* Invalidate events with same file descriptor */ for (i = 0; i < nfds; i++) if (events[i].data.fd == fd) events[i].data.fd = -1; /* Remove the file descriptor from the epoll. * This avoids a problem where the same file description remains open * in another process, causing repeated junk epoll events. * * We pass in a dummy epoll_event, to work around a bug in old kernels. */ if (loop->backend_fd >= 0) { /* Work around a bug in kernels 3.10 to 3.19 where passing a struct that * has the EPOLLWAKEUP flag set generates spurious audit syslog warnings. */ memset(&dummy, 0, sizeof(dummy)); epoll_ctl(loop->backend_fd, EPOLL_CTL_DEL, fd, &dummy); } } int uv__io_check_fd(uv_loop_t* loop, int fd) { struct epoll_event e; int rc; memset(&e, 0, sizeof(e)); e.events = POLLIN; e.data.fd = -1; rc = 0; if (epoll_ctl(loop->backend_fd, EPOLL_CTL_ADD, fd, &e)) if (errno != EEXIST) rc = UV__ERR(errno); if (rc == 0) if (epoll_ctl(loop->backend_fd, EPOLL_CTL_DEL, fd, &e)) abort(); return rc; } void uv__io_poll(uv_loop_t* loop, int timeout) { /* A bug in kernels < 2.6.37 makes timeouts larger than ~30 minutes * effectively infinite on 32 bits architectures. To avoid blocking * indefinitely, we cap the timeout and poll again if necessary. * * Note that "30 minutes" is a simplification because it depends on * the value of CONFIG_HZ. The magic constant assumes CONFIG_HZ=1200, * that being the largest value I have seen in the wild (and only once.) */ static const int max_safe_timeout = 1789569; static int no_epoll_pwait; static int no_epoll_wait; struct epoll_event events[1024]; struct epoll_event* pe; struct epoll_event e; int real_timeout; QUEUE* q; uv__io_t* w; sigset_t sigset; uint64_t sigmask; uint64_t base; int have_signals; int nevents; int count; int nfds; int fd; int op; int i; if (loop->nfds == 0) { assert(QUEUE_EMPTY(&loop->watcher_queue)); return; } memset(&e, 0, sizeof(e)); while (!QUEUE_EMPTY(&loop->watcher_queue)) { q = QUEUE_HEAD(&loop->watcher_queue); QUEUE_REMOVE(q); QUEUE_INIT(q); w = QUEUE_DATA(q, uv__io_t, watcher_queue); assert(w->pevents != 0); assert(w->fd >= 0); assert(w->fd < (int) loop->nwatchers); e.events = w->pevents; e.data.fd = w->fd; if (w->events == 0) op = EPOLL_CTL_ADD; else op = EPOLL_CTL_MOD; /* XXX Future optimization: do EPOLL_CTL_MOD lazily if we stop watching * events, skip the syscall and squelch the events after epoll_wait(). */ if (epoll_ctl(loop->backend_fd, op, w->fd, &e)) { if (errno != EEXIST) abort(); assert(op == EPOLL_CTL_ADD); /* We've reactivated a file descriptor that's been watched before. */ if (epoll_ctl(loop->backend_fd, EPOLL_CTL_MOD, w->fd, &e)) abort(); } w->events = w->pevents; } sigmask = 0; if (loop->flags & UV_LOOP_BLOCK_SIGPROF) { sigemptyset(&sigset); sigaddset(&sigset, SIGPROF); sigmask |= 1 << (SIGPROF - 1); } assert(timeout >= -1); base = loop->time; count = 48; /* Benchmarks suggest this gives the best throughput. */ real_timeout = timeout; for (;;) { /* See the comment for max_safe_timeout for an explanation of why * this is necessary. Executive summary: kernel bug workaround. */ if (sizeof(int32_t) == sizeof(long) && timeout >= max_safe_timeout) timeout = max_safe_timeout; if (sigmask != 0 && no_epoll_pwait != 0) if (pthread_sigmask(SIG_BLOCK, &sigset, NULL)) abort(); if (no_epoll_wait != 0 || (sigmask != 0 && no_epoll_pwait == 0)) { #if defined(__ANDROID_API__) && __ANDROID_API__ < 21 nfds = -1; errno = ENOSYS; #else nfds = epoll_pwait(loop->backend_fd, events, ARRAY_SIZE(events), timeout, &sigset); #endif if (nfds == -1 && errno == ENOSYS) no_epoll_pwait = 1; } else { nfds = epoll_wait(loop->backend_fd, events, ARRAY_SIZE(events), timeout); if (nfds == -1 && errno == ENOSYS) no_epoll_wait = 1; } if (sigmask != 0 && no_epoll_pwait != 0) if (pthread_sigmask(SIG_UNBLOCK, &sigset, NULL)) abort(); /* Update loop->time unconditionally. It's tempting to skip the update when * timeout == 0 (i.e. non-blocking poll) but there is no guarantee that the * operating system didn't reschedule our process while in the syscall. */ SAVE_ERRNO(uv__update_time(loop)); if (nfds == 0) { assert(timeout != -1); if (timeout == 0) return; /* We may have been inside the system call for longer than |timeout| * milliseconds so we need to update the timestamp to avoid drift. */ goto update_timeout; } if (nfds == -1) { if (errno == ENOSYS) { /* epoll_wait() or epoll_pwait() failed, try the other system call. */ assert(no_epoll_wait == 0 || no_epoll_pwait == 0); continue; } if (errno != EINTR) abort(); if (timeout == -1) continue; if (timeout == 0) return; /* Interrupted by a signal. Update timeout and poll again. */ goto update_timeout; } have_signals = 0; nevents = 0; { /* Squelch a -Waddress-of-packed-member warning with gcc >= 9. */ union { struct epoll_event* events; uv__io_t* watchers; } x; x.events = events; assert(loop->watchers != NULL); loop->watchers[loop->nwatchers] = x.watchers; loop->watchers[loop->nwatchers + 1] = (void*) (uintptr_t) nfds; } for (i = 0; i < nfds; i++) { pe = events + i; fd = pe->data.fd; /* Skip invalidated events, see uv__platform_invalidate_fd */ if (fd == -1) continue; assert(fd >= 0); assert((unsigned) fd < loop->nwatchers); w = loop->watchers[fd]; if (w == NULL) { /* File descriptor that we've stopped watching, disarm it. * * Ignore all errors because we may be racing with another thread * when the file descriptor is closed. */ epoll_ctl(loop->backend_fd, EPOLL_CTL_DEL, fd, pe); continue; } /* Give users only events they're interested in. Prevents spurious * callbacks when previous callback invocation in this loop has stopped * the current watcher. Also, filters out events that users has not * requested us to watch. */ pe->events &= w->pevents | POLLERR | POLLHUP; /* Work around an epoll quirk where it sometimes reports just the * EPOLLERR or EPOLLHUP event. In order to force the event loop to * move forward, we merge in the read/write events that the watcher * is interested in; uv__read() and uv__write() will then deal with * the error or hangup in the usual fashion. * * Note to self: happens when epoll reports EPOLLIN|EPOLLHUP, the user * reads the available data, calls uv_read_stop(), then sometime later * calls uv_read_start() again. By then, libuv has forgotten about the * hangup and the kernel won't report EPOLLIN again because there's * nothing left to read. If anything, libuv is to blame here. The * current hack is just a quick bandaid; to properly fix it, libuv * needs to remember the error/hangup event. We should get that for * free when we switch over to edge-triggered I/O. */ if (pe->events == POLLERR || pe->events == POLLHUP) pe->events |= w->pevents & (POLLIN | POLLOUT | UV__POLLRDHUP | UV__POLLPRI); if (pe->events != 0) { /* Run signal watchers last. This also affects child process watchers * because those are implemented in terms of signal watchers. */ if (w == &loop->signal_io_watcher) have_signals = 1; else w->cb(loop, w, pe->events); nevents++; } } if (have_signals != 0) loop->signal_io_watcher.cb(loop, &loop->signal_io_watcher, POLLIN); loop->watchers[loop->nwatchers] = NULL; loop->watchers[loop->nwatchers + 1] = NULL; if (have_signals != 0) return; /* Event loop should cycle now so don't poll again. */ if (nevents != 0) { if (nfds == ARRAY_SIZE(events) && --count != 0) { /* Poll for more events but don't block this time. */ timeout = 0; continue; } return; } if (timeout == 0) return; if (timeout == -1) continue; update_timeout: assert(timeout > 0); real_timeout -= (loop->time - base); if (real_timeout <= 0) return; timeout = real_timeout; } } uint64_t uv__hrtime(uv_clocktype_t type) { static clock_t fast_clock_id = -1; struct timespec t; clock_t clock_id; /* Prefer CLOCK_MONOTONIC_COARSE if available but only when it has * millisecond granularity or better. CLOCK_MONOTONIC_COARSE is * serviced entirely from the vDSO, whereas CLOCK_MONOTONIC may * decide to make a costly system call. */ /* TODO(bnoordhuis) Use CLOCK_MONOTONIC_COARSE for UV_CLOCK_PRECISE * when it has microsecond granularity or better (unlikely). */ if (type == UV_CLOCK_FAST && fast_clock_id == -1) { if (clock_getres(CLOCK_MONOTONIC_COARSE, &t) == 0 && t.tv_nsec <= 1 * 1000 * 1000) { fast_clock_id = CLOCK_MONOTONIC_COARSE; } else { fast_clock_id = CLOCK_MONOTONIC; } } clock_id = CLOCK_MONOTONIC; if (type == UV_CLOCK_FAST) clock_id = fast_clock_id; if (clock_gettime(clock_id, &t)) return 0; /* Not really possible. */ return t.tv_sec * (uint64_t) 1e9 + t.tv_nsec; } int uv_resident_set_memory(size_t* rss) { char buf[1024]; const char* s; ssize_t n; long val; int fd; int i; do fd = open("/proc/self/stat", O_RDONLY); while (fd == -1 && errno == EINTR); if (fd == -1) return UV__ERR(errno); do n = read(fd, buf, sizeof(buf) - 1); while (n == -1 && errno == EINTR); uv__close(fd); if (n == -1) return UV__ERR(errno); buf[n] = '\0'; s = strchr(buf, ' '); if (s == NULL) goto err; s += 1; if (*s != '(') goto err; s = strchr(s, ')'); if (s == NULL) goto err; for (i = 1; i <= 22; i++) { s = strchr(s + 1, ' '); if (s == NULL) goto err; } errno = 0; val = strtol(s, NULL, 10); if (errno != 0) goto err; if (val < 0) goto err; *rss = val * getpagesize(); return 0; err: return UV_EINVAL; } int uv_uptime(double* uptime) { static volatile int no_clock_boottime; struct timespec now; int r; /* Try CLOCK_BOOTTIME first, fall back to CLOCK_MONOTONIC if not available * (pre-2.6.39 kernels). CLOCK_MONOTONIC doesn't increase when the system * is suspended. */ if (no_clock_boottime) { retry: r = clock_gettime(CLOCK_MONOTONIC, &now); } else if ((r = clock_gettime(CLOCK_BOOTTIME, &now)) && errno == EINVAL) { no_clock_boottime = 1; goto retry; } if (r) return UV__ERR(errno); *uptime = now.tv_sec; return 0; } static int uv__cpu_num(FILE* statfile_fp, unsigned int* numcpus) { unsigned int num; char buf[1024]; if (!fgets(buf, sizeof(buf), statfile_fp)) return UV_EIO; num = 0; while (fgets(buf, sizeof(buf), statfile_fp)) { if (strncmp(buf, "cpu", 3)) break; num++; } if (num == 0) return UV_EIO; *numcpus = num; return 0; } int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { unsigned int numcpus; uv_cpu_info_t* ci; int err; FILE* statfile_fp; *cpu_infos = NULL; *count = 0; statfile_fp = uv__open_file("/proc/stat"); if (statfile_fp == NULL) return UV__ERR(errno); err = uv__cpu_num(statfile_fp, &numcpus); if (err < 0) goto out; err = UV_ENOMEM; ci = uv__calloc(numcpus, sizeof(*ci)); if (ci == NULL) goto out; err = read_models(numcpus, ci); if (err == 0) err = read_times(statfile_fp, numcpus, ci); if (err) { uv_free_cpu_info(ci, numcpus); goto out; } /* read_models() on x86 also reads the CPU speed from /proc/cpuinfo. * We don't check for errors here. Worst case, the field is left zero. */ if (ci[0].speed == 0) read_speeds(numcpus, ci); *cpu_infos = ci; *count = numcpus; err = 0; out: if (fclose(statfile_fp)) if (errno != EINTR && errno != EINPROGRESS) abort(); return err; } static void read_speeds(unsigned int numcpus, uv_cpu_info_t* ci) { unsigned int num; for (num = 0; num < numcpus; num++) ci[num].speed = read_cpufreq(num) / 1000; } /* Also reads the CPU frequency on x86. The other architectures only have * a BogoMIPS field, which may not be very accurate. * * Note: Simply returns on error, uv_cpu_info() takes care of the cleanup. */ static int read_models(unsigned int numcpus, uv_cpu_info_t* ci) { static const char model_marker[] = "model name\t: "; static const char speed_marker[] = "cpu MHz\t\t: "; const char* inferred_model; unsigned int model_idx; unsigned int speed_idx; char buf[1024]; char* model; FILE* fp; /* Most are unused on non-ARM, non-MIPS and non-x86 architectures. */ (void) &model_marker; (void) &speed_marker; (void) &speed_idx; (void) &model; (void) &buf; (void) &fp; model_idx = 0; speed_idx = 0; #if defined(__arm__) || \ defined(__i386__) || \ defined(__mips__) || \ defined(__x86_64__) fp = uv__open_file("/proc/cpuinfo"); if (fp == NULL) return UV__ERR(errno); while (fgets(buf, sizeof(buf), fp)) { if (model_idx < numcpus) { if (strncmp(buf, model_marker, sizeof(model_marker) - 1) == 0) { model = buf + sizeof(model_marker) - 1; model = uv__strndup(model, strlen(model) - 1); /* Strip newline. */ if (model == NULL) { fclose(fp); return UV_ENOMEM; } ci[model_idx++].model = model; continue; } } #if defined(__arm__) || defined(__mips__) if (model_idx < numcpus) { #if defined(__arm__) /* Fallback for pre-3.8 kernels. */ static const char model_marker[] = "Processor\t: "; #else /* defined(__mips__) */ static const char model_marker[] = "cpu model\t\t: "; #endif if (strncmp(buf, model_marker, sizeof(model_marker) - 1) == 0) { model = buf + sizeof(model_marker) - 1; model = uv__strndup(model, strlen(model) - 1); /* Strip newline. */ if (model == NULL) { fclose(fp); return UV_ENOMEM; } ci[model_idx++].model = model; continue; } } #else /* !__arm__ && !__mips__ */ if (speed_idx < numcpus) { if (strncmp(buf, speed_marker, sizeof(speed_marker) - 1) == 0) { ci[speed_idx++].speed = atoi(buf + sizeof(speed_marker) - 1); continue; } } #endif /* __arm__ || __mips__ */ } fclose(fp); #endif /* __arm__ || __i386__ || __mips__ || __x86_64__ */ /* Now we want to make sure that all the models contain *something* because * it's not safe to leave them as null. Copy the last entry unless there * isn't one, in that case we simply put "unknown" into everything. */ inferred_model = "unknown"; if (model_idx > 0) inferred_model = ci[model_idx - 1].model; while (model_idx < numcpus) { model = uv__strndup(inferred_model, strlen(inferred_model)); if (model == NULL) return UV_ENOMEM; ci[model_idx++].model = model; } return 0; } static int read_times(FILE* statfile_fp, unsigned int numcpus, uv_cpu_info_t* ci) { struct uv_cpu_times_s ts; unsigned int ticks; unsigned int multiplier; uint64_t user; uint64_t nice; uint64_t sys; uint64_t idle; uint64_t dummy; uint64_t irq; uint64_t num; uint64_t len; char buf[1024]; ticks = (unsigned int)sysconf(_SC_CLK_TCK); multiplier = ((uint64_t)1000L / ticks); assert(ticks != (unsigned int) -1); assert(ticks != 0); rewind(statfile_fp); if (!fgets(buf, sizeof(buf), statfile_fp)) abort(); num = 0; while (fgets(buf, sizeof(buf), statfile_fp)) { if (num >= numcpus) break; if (strncmp(buf, "cpu", 3)) break; /* skip "cpu " marker */ { unsigned int n; int r = sscanf(buf, "cpu%u ", &n); assert(r == 1); (void) r; /* silence build warning */ for (len = sizeof("cpu0"); n /= 10; len++); } /* Line contains user, nice, system, idle, iowait, irq, softirq, steal, * guest, guest_nice but we're only interested in the first four + irq. * * Don't use %*s to skip fields or %ll to read straight into the uint64_t * fields, they're not allowed in C89 mode. */ if (6 != sscanf(buf + len, "%" PRIu64 " %" PRIu64 " %" PRIu64 "%" PRIu64 " %" PRIu64 " %" PRIu64, &user, &nice, &sys, &idle, &dummy, &irq)) abort(); ts.user = user * multiplier; ts.nice = nice * multiplier; ts.sys = sys * multiplier; ts.idle = idle * multiplier; ts.irq = irq * multiplier; ci[num++].cpu_times = ts; } assert(num == numcpus); return 0; } static uint64_t read_cpufreq(unsigned int cpunum) { uint64_t val; char buf[1024]; FILE* fp; snprintf(buf, sizeof(buf), "/sys/devices/system/cpu/cpu%u/cpufreq/scaling_cur_freq", cpunum); fp = uv__open_file(buf); if (fp == NULL) return 0; if (fscanf(fp, "%" PRIu64, &val) != 1) val = 0; fclose(fp); return val; } static int uv__ifaddr_exclude(struct ifaddrs *ent, int exclude_type) { if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING))) return 1; if (ent->ifa_addr == NULL) return 1; /* * On Linux getifaddrs returns information related to the raw underlying * devices. We're not interested in this information yet. */ if (ent->ifa_addr->sa_family == PF_PACKET) return exclude_type; return !exclude_type; } int uv_interface_addresses(uv_interface_address_t** addresses, int* count) { #ifndef HAVE_IFADDRS_H *count = 0; *addresses = NULL; return UV_ENOSYS; #else struct ifaddrs *addrs, *ent; uv_interface_address_t* address; int i; struct sockaddr_ll *sll; *count = 0; *addresses = NULL; if (getifaddrs(&addrs)) return UV__ERR(errno); /* Count the number of interfaces */ for (ent = addrs; ent != NULL; ent = ent->ifa_next) { if (uv__ifaddr_exclude(ent, UV__EXCLUDE_IFADDR)) continue; (*count)++; } if (*count == 0) { freeifaddrs(addrs); return 0; } /* Make sure the memory is initiallized to zero using calloc() */ *addresses = uv__calloc(*count, sizeof(**addresses)); if (!(*addresses)) { freeifaddrs(addrs); return UV_ENOMEM; } address = *addresses; for (ent = addrs; ent != NULL; ent = ent->ifa_next) { if (uv__ifaddr_exclude(ent, UV__EXCLUDE_IFADDR)) continue; address->name = uv__strdup(ent->ifa_name); if (ent->ifa_addr->sa_family == AF_INET6) { address->address.address6 = *((struct sockaddr_in6*) ent->ifa_addr); } else { address->address.address4 = *((struct sockaddr_in*) ent->ifa_addr); } if (ent->ifa_netmask->sa_family == AF_INET6) { address->netmask.netmask6 = *((struct sockaddr_in6*) ent->ifa_netmask); } else { address->netmask.netmask4 = *((struct sockaddr_in*) ent->ifa_netmask); } address->is_internal = !!(ent->ifa_flags & IFF_LOOPBACK); address++; } /* Fill in physical addresses for each interface */ for (ent = addrs; ent != NULL; ent = ent->ifa_next) { if (uv__ifaddr_exclude(ent, UV__EXCLUDE_IFPHYS)) continue; address = *addresses; for (i = 0; i < (*count); i++) { size_t namelen = strlen(ent->ifa_name); /* Alias interface share the same physical address */ if (strncmp(address->name, ent->ifa_name, namelen) == 0 && (address->name[namelen] == 0 || address->name[namelen] == ':')) { sll = (struct sockaddr_ll*)ent->ifa_addr; memcpy(address->phys_addr, sll->sll_addr, sizeof(address->phys_addr)); } address++; } } freeifaddrs(addrs); return 0; #endif } void uv_free_interface_addresses(uv_interface_address_t* addresses, int count) { int i; for (i = 0; i < count; i++) { uv__free(addresses[i].name); } uv__free(addresses); } void uv__set_process_title(const char* title) { #if defined(PR_SET_NAME) prctl(PR_SET_NAME, title); /* Only copies first 16 characters. */ #endif } static uint64_t uv__read_proc_meminfo(const char* what) { uint64_t rc; ssize_t n; char* p; int fd; char buf[4096]; /* Large enough to hold all of /proc/meminfo. */ rc = 0; fd = uv__open_cloexec("/proc/meminfo", O_RDONLY); if (fd < 0) return 0; n = read(fd, buf, sizeof(buf) - 1); if (n <= 0) goto out; buf[n] = '\0'; p = strstr(buf, what); if (p == NULL) goto out; p += strlen(what); if (1 != sscanf(p, "%" PRIu64 " kB", &rc)) goto out; rc *= 1024; out: if (uv__close_nocheckstdio(fd)) abort(); return rc; } uint64_t uv_get_free_memory(void) { struct sysinfo info; uint64_t rc; rc = uv__read_proc_meminfo("MemFree:"); if (rc != 0) return rc; if (0 == sysinfo(&info)) return (uint64_t) info.freeram * info.mem_unit; return 0; } uint64_t uv_get_total_memory(void) { struct sysinfo info; uint64_t rc; rc = uv__read_proc_meminfo("MemTotal:"); if (rc != 0) return rc; if (0 == sysinfo(&info)) return (uint64_t) info.totalram * info.mem_unit; return 0; } static uint64_t uv__read_cgroups_uint64(const char* cgroup, const char* param) { char filename[256]; uint64_t rc; int fd; ssize_t n; char buf[32]; /* Large enough to hold an encoded uint64_t. */ snprintf(filename, 256, "/sys/fs/cgroup/%s/%s", cgroup, param); rc = 0; fd = uv__open_cloexec(filename, O_RDONLY); if (fd < 0) return 0; n = read(fd, buf, sizeof(buf) - 1); if (n > 0) { buf[n] = '\0'; sscanf(buf, "%" PRIu64, &rc); } if (uv__close_nocheckstdio(fd)) abort(); return rc; } uint64_t uv_get_constrained_memory(void) { /* * This might return 0 if there was a problem getting the memory limit from * cgroups. This is OK because a return value of 0 signifies that the memory * limit is unknown. */ return uv__read_cgroups_uint64("memory", "memory.limit_in_bytes"); } ================================================ FILE: external/libuv/src/unix/linux-inotify.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "uv/tree.h" #include "internal.h" #include #include #include #include #include #include #include #include #include struct watcher_list { RB_ENTRY(watcher_list) entry; QUEUE watchers; int iterating; char* path; int wd; }; struct watcher_root { struct watcher_list* rbh_root; }; #define CAST(p) ((struct watcher_root*)(p)) static int compare_watchers(const struct watcher_list* a, const struct watcher_list* b) { if (a->wd < b->wd) return -1; if (a->wd > b->wd) return 1; return 0; } RB_GENERATE_STATIC(watcher_root, watcher_list, entry, compare_watchers) static void uv__inotify_read(uv_loop_t* loop, uv__io_t* w, unsigned int revents); static void maybe_free_watcher_list(struct watcher_list* w, uv_loop_t* loop); static int init_inotify(uv_loop_t* loop) { int fd; if (loop->inotify_fd != -1) return 0; fd = inotify_init1(IN_NONBLOCK | IN_CLOEXEC); if (fd < 0) return UV__ERR(errno); loop->inotify_fd = fd; uv__io_init(&loop->inotify_read_watcher, uv__inotify_read, loop->inotify_fd); uv__io_start(loop, &loop->inotify_read_watcher, POLLIN); return 0; } int uv__inotify_fork(uv_loop_t* loop, void* old_watchers) { /* Open the inotify_fd, and re-arm all the inotify watchers. */ int err; struct watcher_list* tmp_watcher_list_iter; struct watcher_list* watcher_list; struct watcher_list tmp_watcher_list; QUEUE queue; QUEUE* q; uv_fs_event_t* handle; char* tmp_path; if (old_watchers != NULL) { /* We must restore the old watcher list to be able to close items * out of it. */ loop->inotify_watchers = old_watchers; QUEUE_INIT(&tmp_watcher_list.watchers); /* Note that the queue we use is shared with the start and stop() * functions, making QUEUE_FOREACH unsafe to use. So we use the * QUEUE_MOVE trick to safely iterate. Also don't free the watcher * list until we're done iterating. c.f. uv__inotify_read. */ RB_FOREACH_SAFE(watcher_list, watcher_root, CAST(&old_watchers), tmp_watcher_list_iter) { watcher_list->iterating = 1; QUEUE_MOVE(&watcher_list->watchers, &queue); while (!QUEUE_EMPTY(&queue)) { q = QUEUE_HEAD(&queue); handle = QUEUE_DATA(q, uv_fs_event_t, watchers); /* It's critical to keep a copy of path here, because it * will be set to NULL by stop() and then deallocated by * maybe_free_watcher_list */ tmp_path = uv__strdup(handle->path); assert(tmp_path != NULL); QUEUE_REMOVE(q); QUEUE_INSERT_TAIL(&watcher_list->watchers, q); uv_fs_event_stop(handle); QUEUE_INSERT_TAIL(&tmp_watcher_list.watchers, &handle->watchers); handle->path = tmp_path; } watcher_list->iterating = 0; maybe_free_watcher_list(watcher_list, loop); } QUEUE_MOVE(&tmp_watcher_list.watchers, &queue); while (!QUEUE_EMPTY(&queue)) { q = QUEUE_HEAD(&queue); QUEUE_REMOVE(q); handle = QUEUE_DATA(q, uv_fs_event_t, watchers); tmp_path = handle->path; handle->path = NULL; err = uv_fs_event_start(handle, handle->cb, tmp_path, 0); uv__free(tmp_path); if (err) return err; } } return 0; } static struct watcher_list* find_watcher(uv_loop_t* loop, int wd) { struct watcher_list w; w.wd = wd; return RB_FIND(watcher_root, CAST(&loop->inotify_watchers), &w); } static void maybe_free_watcher_list(struct watcher_list* w, uv_loop_t* loop) { /* if the watcher_list->watchers is being iterated over, we can't free it. */ if ((!w->iterating) && QUEUE_EMPTY(&w->watchers)) { /* No watchers left for this path. Clean up. */ RB_REMOVE(watcher_root, CAST(&loop->inotify_watchers), w); inotify_rm_watch(loop->inotify_fd, w->wd); uv__free(w); } } static void uv__inotify_read(uv_loop_t* loop, uv__io_t* dummy, unsigned int events) { const struct inotify_event* e; struct watcher_list* w; uv_fs_event_t* h; QUEUE queue; QUEUE* q; const char* path; ssize_t size; const char *p; /* needs to be large enough for sizeof(inotify_event) + strlen(path) */ char buf[4096]; while (1) { do size = read(loop->inotify_fd, buf, sizeof(buf)); while (size == -1 && errno == EINTR); if (size == -1) { assert(errno == EAGAIN || errno == EWOULDBLOCK); break; } assert(size > 0); /* pre-2.6.21 thing, size=0 == read buffer too small */ /* Now we have one or more inotify_event structs. */ for (p = buf; p < buf + size; p += sizeof(*e) + e->len) { e = (const struct inotify_event*) p; events = 0; if (e->mask & (IN_ATTRIB|IN_MODIFY)) events |= UV_CHANGE; if (e->mask & ~(IN_ATTRIB|IN_MODIFY)) events |= UV_RENAME; w = find_watcher(loop, e->wd); if (w == NULL) continue; /* Stale event, no watchers left. */ /* inotify does not return the filename when monitoring a single file * for modifications. Repurpose the filename for API compatibility. * I'm not convinced this is a good thing, maybe it should go. */ path = e->len ? (const char*) (e + 1) : uv__basename_r(w->path); /* We're about to iterate over the queue and call user's callbacks. * What can go wrong? * A callback could call uv_fs_event_stop() * and the queue can change under our feet. * So, we use QUEUE_MOVE() trick to safely iterate over the queue. * And we don't free the watcher_list until we're done iterating. * * First, * tell uv_fs_event_stop() (that could be called from a user's callback) * not to free watcher_list. */ w->iterating = 1; QUEUE_MOVE(&w->watchers, &queue); while (!QUEUE_EMPTY(&queue)) { q = QUEUE_HEAD(&queue); h = QUEUE_DATA(q, uv_fs_event_t, watchers); QUEUE_REMOVE(q); QUEUE_INSERT_TAIL(&w->watchers, q); h->cb(h, path, events, 0); } /* done iterating, time to (maybe) free empty watcher_list */ w->iterating = 0; maybe_free_watcher_list(w, loop); } } } int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) { uv__handle_init(loop, (uv_handle_t*)handle, UV_FS_EVENT); return 0; } int uv_fs_event_start(uv_fs_event_t* handle, uv_fs_event_cb cb, const char* path, unsigned int flags) { struct watcher_list* w; size_t len; int events; int err; int wd; if (uv__is_active(handle)) return UV_EINVAL; err = init_inotify(handle->loop); if (err) return err; events = IN_ATTRIB | IN_CREATE | IN_MODIFY | IN_DELETE | IN_DELETE_SELF | IN_MOVE_SELF | IN_MOVED_FROM | IN_MOVED_TO; wd = inotify_add_watch(handle->loop->inotify_fd, path, events); if (wd == -1) return UV__ERR(errno); w = find_watcher(handle->loop, wd); if (w) goto no_insert; len = strlen(path) + 1; w = uv__malloc(sizeof(*w) + len); if (w == NULL) return UV_ENOMEM; w->wd = wd; w->path = memcpy(w + 1, path, len); QUEUE_INIT(&w->watchers); w->iterating = 0; RB_INSERT(watcher_root, CAST(&handle->loop->inotify_watchers), w); no_insert: uv__handle_start(handle); QUEUE_INSERT_TAIL(&w->watchers, &handle->watchers); handle->path = w->path; handle->cb = cb; handle->wd = wd; return 0; } int uv_fs_event_stop(uv_fs_event_t* handle) { struct watcher_list* w; if (!uv__is_active(handle)) return 0; w = find_watcher(handle->loop, handle->wd); assert(w != NULL); handle->wd = -1; handle->path = NULL; uv__handle_stop(handle); QUEUE_REMOVE(&handle->watchers); maybe_free_watcher_list(w, handle->loop); return 0; } void uv__fs_event_close(uv_fs_event_t* handle) { uv_fs_event_stop(handle); } ================================================ FILE: external/libuv/src/unix/linux-syscalls.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "linux-syscalls.h" #include #include #include #include #include #if defined(__arm__) # if defined(__thumb__) || defined(__ARM_EABI__) # define UV_SYSCALL_BASE 0 # else # define UV_SYSCALL_BASE 0x900000 # endif #endif /* __arm__ */ #ifndef __NR_recvmmsg # if defined(__x86_64__) # define __NR_recvmmsg 299 # elif defined(__i386__) # define __NR_recvmmsg 337 # elif defined(__arm__) # define __NR_recvmmsg (UV_SYSCALL_BASE + 365) # endif #endif /* __NR_recvmsg */ #ifndef __NR_sendmmsg # if defined(__x86_64__) # define __NR_sendmmsg 307 # elif defined(__i386__) # define __NR_sendmmsg 345 # elif defined(__arm__) # define __NR_sendmmsg (UV_SYSCALL_BASE + 374) # endif #endif /* __NR_sendmmsg */ #ifndef __NR_utimensat # if defined(__x86_64__) # define __NR_utimensat 280 # elif defined(__i386__) # define __NR_utimensat 320 # elif defined(__arm__) # define __NR_utimensat (UV_SYSCALL_BASE + 348) # endif #endif /* __NR_utimensat */ #ifndef __NR_preadv # if defined(__x86_64__) # define __NR_preadv 295 # elif defined(__i386__) # define __NR_preadv 333 # elif defined(__arm__) # define __NR_preadv (UV_SYSCALL_BASE + 361) # endif #endif /* __NR_preadv */ #ifndef __NR_pwritev # if defined(__x86_64__) # define __NR_pwritev 296 # elif defined(__i386__) # define __NR_pwritev 334 # elif defined(__arm__) # define __NR_pwritev (UV_SYSCALL_BASE + 362) # endif #endif /* __NR_pwritev */ #ifndef __NR_dup3 # if defined(__x86_64__) # define __NR_dup3 292 # elif defined(__i386__) # define __NR_dup3 330 # elif defined(__arm__) # define __NR_dup3 (UV_SYSCALL_BASE + 358) # endif #endif /* __NR_pwritev */ #ifndef __NR_statx # if defined(__x86_64__) # define __NR_statx 332 # elif defined(__i386__) # define __NR_statx 383 # elif defined(__aarch64__) # define __NR_statx 397 # elif defined(__arm__) # define __NR_statx (UV_SYSCALL_BASE + 397) # elif defined(__ppc__) # define __NR_statx 383 # elif defined(__s390__) # define __NR_statx 379 # endif #endif /* __NR_statx */ #ifndef __NR_getrandom # if defined(__x86_64__) # define __NR_getrandom 318 # elif defined(__i386__) # define __NR_getrandom 355 # elif defined(__aarch64__) # define __NR_getrandom 384 # elif defined(__arm__) # define __NR_getrandom (UV_SYSCALL_BASE + 384) # elif defined(__ppc__) # define __NR_getrandom 359 # elif defined(__s390__) # define __NR_getrandom 349 # endif #endif /* __NR_getrandom */ struct uv__mmsghdr; int uv__sendmmsg(int fd, struct uv__mmsghdr* mmsg, unsigned int vlen, unsigned int flags) { #if defined(__NR_sendmmsg) return syscall(__NR_sendmmsg, fd, mmsg, vlen, flags); #else return errno = ENOSYS, -1; #endif } int uv__recvmmsg(int fd, struct uv__mmsghdr* mmsg, unsigned int vlen, unsigned int flags, struct timespec* timeout) { #if defined(__NR_recvmmsg) return syscall(__NR_recvmmsg, fd, mmsg, vlen, flags, timeout); #else return errno = ENOSYS, -1; #endif } ssize_t uv__preadv(int fd, const struct iovec *iov, int iovcnt, int64_t offset) { #if defined(__NR_preadv) return syscall(__NR_preadv, fd, iov, iovcnt, (long)offset, (long)(offset >> 32)); #else return errno = ENOSYS, -1; #endif } ssize_t uv__pwritev(int fd, const struct iovec *iov, int iovcnt, int64_t offset) { #if defined(__NR_pwritev) return syscall(__NR_pwritev, fd, iov, iovcnt, (long)offset, (long)(offset >> 32)); #else return errno = ENOSYS, -1; #endif } int uv__dup3(int oldfd, int newfd, int flags) { #if defined(__NR_dup3) return syscall(__NR_dup3, oldfd, newfd, flags); #else return errno = ENOSYS, -1; #endif } int uv__statx(int dirfd, const char* path, int flags, unsigned int mask, struct uv__statx* statxbuf) { /* __NR_statx make Android box killed by SIGSYS. * That looks like a seccomp2 sandbox filter rejecting the system call. */ #if defined(__NR_statx) && !defined(__ANDROID__) return syscall(__NR_statx, dirfd, path, flags, mask, statxbuf); #else return errno = ENOSYS, -1; #endif } ssize_t uv__getrandom(void* buf, size_t buflen, unsigned flags) { #if defined(__NR_getrandom) return syscall(__NR_getrandom, buf, buflen, flags); #else return errno = ENOSYS, -1; #endif } ================================================ FILE: external/libuv/src/unix/linux-syscalls.h ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #ifndef UV_LINUX_SYSCALL_H_ #define UV_LINUX_SYSCALL_H_ #undef _GNU_SOURCE #define _GNU_SOURCE #include #include #include #include #include struct uv__statx_timestamp { int64_t tv_sec; uint32_t tv_nsec; int32_t unused0; }; struct uv__statx { uint32_t stx_mask; uint32_t stx_blksize; uint64_t stx_attributes; uint32_t stx_nlink; uint32_t stx_uid; uint32_t stx_gid; uint16_t stx_mode; uint16_t unused0; uint64_t stx_ino; uint64_t stx_size; uint64_t stx_blocks; uint64_t stx_attributes_mask; struct uv__statx_timestamp stx_atime; struct uv__statx_timestamp stx_btime; struct uv__statx_timestamp stx_ctime; struct uv__statx_timestamp stx_mtime; uint32_t stx_rdev_major; uint32_t stx_rdev_minor; uint32_t stx_dev_major; uint32_t stx_dev_minor; uint64_t unused1[14]; }; ssize_t uv__preadv(int fd, const struct iovec *iov, int iovcnt, int64_t offset); ssize_t uv__pwritev(int fd, const struct iovec *iov, int iovcnt, int64_t offset); int uv__dup3(int oldfd, int newfd, int flags); int uv__statx(int dirfd, const char* path, int flags, unsigned int mask, struct uv__statx* statxbuf); ssize_t uv__getrandom(void* buf, size_t buflen, unsigned flags); #endif /* UV_LINUX_SYSCALL_H_ */ ================================================ FILE: external/libuv/src/unix/loop-watcher.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #define UV_LOOP_WATCHER_DEFINE(name, type) \ int uv_##name##_init(uv_loop_t* loop, uv_##name##_t* handle) { \ uv__handle_init(loop, (uv_handle_t*)handle, UV_##type); \ handle->name##_cb = NULL; \ return 0; \ } \ \ int uv_##name##_start(uv_##name##_t* handle, uv_##name##_cb cb) { \ if (uv__is_active(handle)) return 0; \ if (cb == NULL) return UV_EINVAL; \ QUEUE_INSERT_HEAD(&handle->loop->name##_handles, &handle->queue); \ handle->name##_cb = cb; \ uv__handle_start(handle); \ return 0; \ } \ \ int uv_##name##_stop(uv_##name##_t* handle) { \ if (!uv__is_active(handle)) return 0; \ QUEUE_REMOVE(&handle->queue); \ uv__handle_stop(handle); \ return 0; \ } \ \ void uv__run_##name(uv_loop_t* loop) { \ uv_##name##_t* h; \ QUEUE queue; \ QUEUE* q; \ QUEUE_MOVE(&loop->name##_handles, &queue); \ while (!QUEUE_EMPTY(&queue)) { \ q = QUEUE_HEAD(&queue); \ h = QUEUE_DATA(q, uv_##name##_t, queue); \ QUEUE_REMOVE(q); \ QUEUE_INSERT_TAIL(&loop->name##_handles, q); \ h->name##_cb(h); \ } \ } \ \ void uv__##name##_close(uv_##name##_t* handle) { \ uv_##name##_stop(handle); \ } UV_LOOP_WATCHER_DEFINE(prepare, PREPARE) UV_LOOP_WATCHER_DEFINE(check, CHECK) UV_LOOP_WATCHER_DEFINE(idle, IDLE) ================================================ FILE: external/libuv/src/unix/loop.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "uv/tree.h" #include "internal.h" #include "heap-inl.h" #include #include #include int uv_loop_init(uv_loop_t* loop) { void* saved_data; int err; saved_data = loop->data; memset(loop, 0, sizeof(*loop)); loop->data = saved_data; heap_init((struct heap*) &loop->timer_heap); QUEUE_INIT(&loop->wq); QUEUE_INIT(&loop->idle_handles); QUEUE_INIT(&loop->async_handles); QUEUE_INIT(&loop->check_handles); QUEUE_INIT(&loop->prepare_handles); QUEUE_INIT(&loop->handle_queue); loop->active_handles = 0; loop->active_reqs.count = 0; loop->nfds = 0; loop->watchers = NULL; loop->nwatchers = 0; QUEUE_INIT(&loop->pending_queue); QUEUE_INIT(&loop->watcher_queue); loop->closing_handles = NULL; uv__update_time(loop); loop->async_io_watcher.fd = -1; loop->async_wfd = -1; loop->signal_pipefd[0] = -1; loop->signal_pipefd[1] = -1; loop->backend_fd = -1; loop->emfile_fd = -1; loop->timer_counter = 0; loop->stop_flag = 0; err = uv__platform_loop_init(loop); if (err) return err; uv__signal_global_once_init(); err = uv_signal_init(loop, &loop->child_watcher); if (err) goto fail_signal_init; uv__handle_unref(&loop->child_watcher); loop->child_watcher.flags |= UV_HANDLE_INTERNAL; QUEUE_INIT(&loop->process_handles); err = uv_rwlock_init(&loop->cloexec_lock); if (err) goto fail_rwlock_init; err = uv_mutex_init(&loop->wq_mutex); if (err) goto fail_mutex_init; err = uv_async_init(loop, &loop->wq_async, uv__work_done); if (err) goto fail_async_init; uv__handle_unref(&loop->wq_async); loop->wq_async.flags |= UV_HANDLE_INTERNAL; return 0; fail_async_init: uv_mutex_destroy(&loop->wq_mutex); fail_mutex_init: uv_rwlock_destroy(&loop->cloexec_lock); fail_rwlock_init: uv__signal_loop_cleanup(loop); fail_signal_init: uv__platform_loop_delete(loop); uv__free(loop->watchers); loop->nwatchers = 0; return err; } int uv_loop_fork(uv_loop_t* loop) { int err; unsigned int i; uv__io_t* w; err = uv__io_fork(loop); if (err) return err; err = uv__async_fork(loop); if (err) return err; err = uv__signal_loop_fork(loop); if (err) return err; /* Rearm all the watchers that aren't re-queued by the above. */ for (i = 0; i < loop->nwatchers; i++) { w = loop->watchers[i]; if (w == NULL) continue; if (w->pevents != 0 && QUEUE_EMPTY(&w->watcher_queue)) { w->events = 0; /* Force re-registration in uv__io_poll. */ QUEUE_INSERT_TAIL(&loop->watcher_queue, &w->watcher_queue); } } return 0; } void uv__loop_close(uv_loop_t* loop) { uv__signal_loop_cleanup(loop); uv__platform_loop_delete(loop); uv__async_stop(loop); if (loop->emfile_fd != -1) { uv__close(loop->emfile_fd); loop->emfile_fd = -1; } if (loop->backend_fd != -1) { uv__close(loop->backend_fd); loop->backend_fd = -1; } uv_mutex_lock(&loop->wq_mutex); assert(QUEUE_EMPTY(&loop->wq) && "thread pool work queue not empty!"); assert(!uv__has_active_reqs(loop)); uv_mutex_unlock(&loop->wq_mutex); uv_mutex_destroy(&loop->wq_mutex); /* * Note that all thread pool stuff is finished at this point and * it is safe to just destroy rw lock */ uv_rwlock_destroy(&loop->cloexec_lock); #if 0 assert(QUEUE_EMPTY(&loop->pending_queue)); assert(QUEUE_EMPTY(&loop->watcher_queue)); assert(loop->nfds == 0); #endif uv__free(loop->watchers); loop->watchers = NULL; loop->nwatchers = 0; } int uv__loop_configure(uv_loop_t* loop, uv_loop_option option, va_list ap) { if (option != UV_LOOP_BLOCK_SIGNAL) return UV_ENOSYS; if (va_arg(ap, int) != SIGPROF) return UV_EINVAL; loop->flags |= UV_LOOP_BLOCK_SIGPROF; return 0; } ================================================ FILE: external/libuv/src/unix/netbsd.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include int uv__platform_loop_init(uv_loop_t* loop) { return uv__kqueue_init(loop); } void uv__platform_loop_delete(uv_loop_t* loop) { } void uv_loadavg(double avg[3]) { struct loadavg info; size_t size = sizeof(info); int which[] = {CTL_VM, VM_LOADAVG}; if (sysctl(which, ARRAY_SIZE(which), &info, &size, NULL, 0) == -1) return; avg[0] = (double) info.ldavg[0] / info.fscale; avg[1] = (double) info.ldavg[1] / info.fscale; avg[2] = (double) info.ldavg[2] / info.fscale; } int uv_exepath(char* buffer, size_t* size) { /* Intermediate buffer, retrieving partial path name does not work * As of NetBSD-8(beta), vnode->path translator does not handle files * with longer names than 31 characters. */ char int_buf[PATH_MAX]; size_t int_size; int mib[4]; if (buffer == NULL || size == NULL || *size == 0) return UV_EINVAL; mib[0] = CTL_KERN; mib[1] = KERN_PROC_ARGS; mib[2] = -1; mib[3] = KERN_PROC_PATHNAME; int_size = ARRAY_SIZE(int_buf); if (sysctl(mib, 4, int_buf, &int_size, NULL, 0)) return UV__ERR(errno); /* Copy string from the intermediate buffer to outer one with appropriate * length. */ /* TODO(bnoordhuis) Check uv__strscpy() return value. */ uv__strscpy(buffer, int_buf, *size); /* Set new size. */ *size = strlen(buffer); return 0; } uint64_t uv_get_free_memory(void) { struct uvmexp info; size_t size = sizeof(info); int which[] = {CTL_VM, VM_UVMEXP}; if (sysctl(which, ARRAY_SIZE(which), &info, &size, NULL, 0)) return UV__ERR(errno); return (uint64_t) info.free * sysconf(_SC_PAGESIZE); } uint64_t uv_get_total_memory(void) { #if defined(HW_PHYSMEM64) uint64_t info; int which[] = {CTL_HW, HW_PHYSMEM64}; #else unsigned int info; int which[] = {CTL_HW, HW_PHYSMEM}; #endif size_t size = sizeof(info); if (sysctl(which, ARRAY_SIZE(which), &info, &size, NULL, 0)) return UV__ERR(errno); return (uint64_t) info; } uint64_t uv_get_constrained_memory(void) { return 0; /* Memory constraints are unknown. */ } int uv_resident_set_memory(size_t* rss) { kvm_t *kd = NULL; struct kinfo_proc2 *kinfo = NULL; pid_t pid; int nprocs; int max_size = sizeof(struct kinfo_proc2); int page_size; page_size = getpagesize(); pid = getpid(); kd = kvm_open(NULL, NULL, NULL, KVM_NO_FILES, "kvm_open"); if (kd == NULL) goto error; kinfo = kvm_getproc2(kd, KERN_PROC_PID, pid, max_size, &nprocs); if (kinfo == NULL) goto error; *rss = kinfo->p_vm_rssize * page_size; kvm_close(kd); return 0; error: if (kd) kvm_close(kd); return UV_EPERM; } int uv_uptime(double* uptime) { time_t now; struct timeval info; size_t size = sizeof(info); static int which[] = {CTL_KERN, KERN_BOOTTIME}; if (sysctl(which, ARRAY_SIZE(which), &info, &size, NULL, 0)) return UV__ERR(errno); now = time(NULL); *uptime = (double)(now - info.tv_sec); return 0; } int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { unsigned int ticks = (unsigned int)sysconf(_SC_CLK_TCK); unsigned int multiplier = ((uint64_t)1000L / ticks); unsigned int cur = 0; uv_cpu_info_t* cpu_info; u_int64_t* cp_times; char model[512]; u_int64_t cpuspeed; int numcpus; size_t size; int i; size = sizeof(model); if (sysctlbyname("machdep.cpu_brand", &model, &size, NULL, 0) && sysctlbyname("hw.model", &model, &size, NULL, 0)) { return UV__ERR(errno); } size = sizeof(numcpus); if (sysctlbyname("hw.ncpu", &numcpus, &size, NULL, 0)) return UV__ERR(errno); *count = numcpus; /* Only i386 and amd64 have machdep.tsc_freq */ size = sizeof(cpuspeed); if (sysctlbyname("machdep.tsc_freq", &cpuspeed, &size, NULL, 0)) cpuspeed = 0; size = numcpus * CPUSTATES * sizeof(*cp_times); cp_times = uv__malloc(size); if (cp_times == NULL) return UV_ENOMEM; if (sysctlbyname("kern.cp_time", cp_times, &size, NULL, 0)) return UV__ERR(errno); *cpu_infos = uv__malloc(numcpus * sizeof(**cpu_infos)); if (!(*cpu_infos)) { uv__free(cp_times); uv__free(*cpu_infos); return UV_ENOMEM; } for (i = 0; i < numcpus; i++) { cpu_info = &(*cpu_infos)[i]; cpu_info->cpu_times.user = (uint64_t)(cp_times[CP_USER+cur]) * multiplier; cpu_info->cpu_times.nice = (uint64_t)(cp_times[CP_NICE+cur]) * multiplier; cpu_info->cpu_times.sys = (uint64_t)(cp_times[CP_SYS+cur]) * multiplier; cpu_info->cpu_times.idle = (uint64_t)(cp_times[CP_IDLE+cur]) * multiplier; cpu_info->cpu_times.irq = (uint64_t)(cp_times[CP_INTR+cur]) * multiplier; cpu_info->model = uv__strdup(model); cpu_info->speed = (int)(cpuspeed/(uint64_t) 1e6); cur += CPUSTATES; } uv__free(cp_times); return 0; } int uv__random_sysctl(void* buf, size_t len) { static int name[] = {CTL_KERN, KERN_ARND}; size_t count, req; unsigned char* p; p = buf; while (len) { req = len < 32 ? len : 32; count = req; if (sysctl(name, ARRAY_SIZE(name), p, &count, NULL, 0) == -1) return UV__ERR(errno); if (count != req) return UV_EIO; /* Can't happen. */ p += count; len -= count; } return 0; } ================================================ FILE: external/libuv/src/unix/no-fsevents.c ================================================ /* Copyright libuv project contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) { return UV_ENOSYS; } int uv_fs_event_start(uv_fs_event_t* handle, uv_fs_event_cb cb, const char* filename, unsigned int flags) { return UV_ENOSYS; } int uv_fs_event_stop(uv_fs_event_t* handle) { return UV_ENOSYS; } void uv__fs_event_close(uv_fs_event_t* handle) { UNREACHABLE(); } ================================================ FILE: external/libuv/src/unix/no-proctitle.c ================================================ /* Copyright libuv project contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include char** uv_setup_args(int argc, char** argv) { return argv; } void uv__process_title_cleanup(void) { } int uv_set_process_title(const char* title) { return 0; } int uv_get_process_title(char* buffer, size_t size) { if (buffer == NULL || size == 0) return UV_EINVAL; buffer[0] = '\0'; return 0; } ================================================ FILE: external/libuv/src/unix/openbsd.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include #include #include #include #include #include #include int uv__platform_loop_init(uv_loop_t* loop) { return uv__kqueue_init(loop); } void uv__platform_loop_delete(uv_loop_t* loop) { } void uv_loadavg(double avg[3]) { struct loadavg info; size_t size = sizeof(info); int which[] = {CTL_VM, VM_LOADAVG}; if (sysctl(which, ARRAY_SIZE(which), &info, &size, NULL, 0) < 0) return; avg[0] = (double) info.ldavg[0] / info.fscale; avg[1] = (double) info.ldavg[1] / info.fscale; avg[2] = (double) info.ldavg[2] / info.fscale; } int uv_exepath(char* buffer, size_t* size) { int mib[4]; char **argsbuf = NULL; size_t argsbuf_size = 100U; size_t exepath_size; pid_t mypid; int err; if (buffer == NULL || size == NULL || *size == 0) return UV_EINVAL; mypid = getpid(); for (;;) { err = UV_ENOMEM; argsbuf = uv__reallocf(argsbuf, argsbuf_size); if (argsbuf == NULL) goto out; mib[0] = CTL_KERN; mib[1] = KERN_PROC_ARGS; mib[2] = mypid; mib[3] = KERN_PROC_ARGV; if (sysctl(mib, ARRAY_SIZE(mib), argsbuf, &argsbuf_size, NULL, 0) == 0) { break; } if (errno != ENOMEM) { err = UV__ERR(errno); goto out; } argsbuf_size *= 2U; } if (argsbuf[0] == NULL) { err = UV_EINVAL; /* FIXME(bnoordhuis) More appropriate error. */ goto out; } *size -= 1; exepath_size = strlen(argsbuf[0]); if (*size > exepath_size) *size = exepath_size; memcpy(buffer, argsbuf[0], *size); buffer[*size] = '\0'; err = 0; out: uv__free(argsbuf); return err; } uint64_t uv_get_free_memory(void) { struct uvmexp info; size_t size = sizeof(info); int which[] = {CTL_VM, VM_UVMEXP}; if (sysctl(which, ARRAY_SIZE(which), &info, &size, NULL, 0)) return UV__ERR(errno); return (uint64_t) info.free * sysconf(_SC_PAGESIZE); } uint64_t uv_get_total_memory(void) { uint64_t info; int which[] = {CTL_HW, HW_PHYSMEM64}; size_t size = sizeof(info); if (sysctl(which, ARRAY_SIZE(which), &info, &size, NULL, 0)) return UV__ERR(errno); return (uint64_t) info; } uint64_t uv_get_constrained_memory(void) { return 0; /* Memory constraints are unknown. */ } int uv_resident_set_memory(size_t* rss) { struct kinfo_proc kinfo; size_t page_size = getpagesize(); size_t size = sizeof(struct kinfo_proc); int mib[6]; mib[0] = CTL_KERN; mib[1] = KERN_PROC; mib[2] = KERN_PROC_PID; mib[3] = getpid(); mib[4] = sizeof(struct kinfo_proc); mib[5] = 1; if (sysctl(mib, ARRAY_SIZE(mib), &kinfo, &size, NULL, 0) < 0) return UV__ERR(errno); *rss = kinfo.p_vm_rssize * page_size; return 0; } int uv_uptime(double* uptime) { time_t now; struct timeval info; size_t size = sizeof(info); static int which[] = {CTL_KERN, KERN_BOOTTIME}; if (sysctl(which, ARRAY_SIZE(which), &info, &size, NULL, 0)) return UV__ERR(errno); now = time(NULL); *uptime = (double)(now - info.tv_sec); return 0; } int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { unsigned int ticks = (unsigned int)sysconf(_SC_CLK_TCK), multiplier = ((uint64_t)1000L / ticks), cpuspeed; uint64_t info[CPUSTATES]; char model[512]; int numcpus = 1; int which[] = {CTL_HW,HW_MODEL}; int percpu[] = {CTL_KERN,KERN_CPTIME2,0}; size_t size; int i, j; uv_cpu_info_t* cpu_info; size = sizeof(model); if (sysctl(which, ARRAY_SIZE(which), &model, &size, NULL, 0)) return UV__ERR(errno); which[1] = HW_NCPUONLINE; size = sizeof(numcpus); if (sysctl(which, ARRAY_SIZE(which), &numcpus, &size, NULL, 0)) return UV__ERR(errno); *cpu_infos = uv__malloc(numcpus * sizeof(**cpu_infos)); if (!(*cpu_infos)) return UV_ENOMEM; i = 0; *count = numcpus; which[1] = HW_CPUSPEED; size = sizeof(cpuspeed); if (sysctl(which, ARRAY_SIZE(which), &cpuspeed, &size, NULL, 0)) goto error; size = sizeof(info); for (i = 0; i < numcpus; i++) { percpu[2] = i; if (sysctl(percpu, ARRAY_SIZE(percpu), &info, &size, NULL, 0)) goto error; cpu_info = &(*cpu_infos)[i]; cpu_info->cpu_times.user = (uint64_t)(info[CP_USER]) * multiplier; cpu_info->cpu_times.nice = (uint64_t)(info[CP_NICE]) * multiplier; cpu_info->cpu_times.sys = (uint64_t)(info[CP_SYS]) * multiplier; cpu_info->cpu_times.idle = (uint64_t)(info[CP_IDLE]) * multiplier; cpu_info->cpu_times.irq = (uint64_t)(info[CP_INTR]) * multiplier; cpu_info->model = uv__strdup(model); cpu_info->speed = cpuspeed; } return 0; error: *count = 0; for (j = 0; j < i; j++) uv__free((*cpu_infos)[j].model); uv__free(*cpu_infos); *cpu_infos = NULL; return UV__ERR(errno); } ================================================ FILE: external/libuv/src/unix/os390-syscalls.c ================================================ /* Copyright libuv project contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "os390-syscalls.h" #include #include #include #include #include #define CW_INTRPT 1 #define CW_CONDVAR 32 #pragma linkage(BPX4CTW, OS) #pragma linkage(BPX1CTW, OS) static int number_of_epolls; static QUEUE global_epoll_queue; static uv_mutex_t global_epoll_lock; static uv_once_t once = UV_ONCE_INIT; int scandir(const char* maindir, struct dirent*** namelist, int (*filter)(const struct dirent*), int (*compar)(const struct dirent**, const struct dirent **)) { struct dirent** nl; struct dirent** nl_copy; struct dirent* dirent; unsigned count; size_t allocated; DIR* mdir; nl = NULL; count = 0; allocated = 0; mdir = opendir(maindir); if (!mdir) return -1; while (1) { dirent = readdir(mdir); if (!dirent) break; if (!filter || filter(dirent)) { struct dirent* copy; copy = uv__malloc(sizeof(*copy)); if (!copy) goto error; memcpy(copy, dirent, sizeof(*copy)); nl_copy = uv__realloc(nl, sizeof(*copy) * (count + 1)); if (nl_copy == NULL) { uv__free(copy); goto error; } nl = nl_copy; nl[count++] = copy; } } qsort(nl, count, sizeof(struct dirent *), (int (*)(const void *, const void *)) compar); closedir(mdir); *namelist = nl; return count; error: while (count > 0) { dirent = nl[--count]; uv__free(dirent); } uv__free(nl); closedir(mdir); errno = ENOMEM; return -1; } static unsigned int next_power_of_two(unsigned int val) { val -= 1; val |= val >> 1; val |= val >> 2; val |= val >> 4; val |= val >> 8; val |= val >> 16; val += 1; return val; } static void maybe_resize(uv__os390_epoll* lst, unsigned int len) { unsigned int newsize; unsigned int i; struct pollfd* newlst; struct pollfd event; if (len <= lst->size) return; if (lst->size == 0) event.fd = -1; else { /* Extract the message queue at the end. */ event = lst->items[lst->size - 1]; lst->items[lst->size - 1].fd = -1; } newsize = next_power_of_two(len); newlst = uv__reallocf(lst->items, newsize * sizeof(lst->items[0])); if (newlst == NULL) abort(); for (i = lst->size; i < newsize; ++i) newlst[i].fd = -1; /* Restore the message queue at the end */ newlst[newsize - 1] = event; lst->items = newlst; lst->size = newsize; } static void init_message_queue(uv__os390_epoll* lst) { struct { long int header; char body; } msg; /* initialize message queue */ lst->msg_queue = msgget(IPC_PRIVATE, 0600 | IPC_CREAT); if (lst->msg_queue == -1) abort(); /* On z/OS, the message queue will be affiliated with the process only when a send is performed on it. Once this is done, the system can be queried for all message queues belonging to our process id. */ msg.header = 1; if (msgsnd(lst->msg_queue, &msg, sizeof(msg.body), 0) != 0) abort(); /* Clean up the dummy message sent above */ if (msgrcv(lst->msg_queue, &msg, sizeof(msg.body), 0, 0) != sizeof(msg.body)) abort(); } static void before_fork(void) { uv_mutex_lock(&global_epoll_lock); } static void after_fork(void) { uv_mutex_unlock(&global_epoll_lock); } static void child_fork(void) { QUEUE* q; uv_once_t child_once = UV_ONCE_INIT; /* reset once */ memcpy(&once, &child_once, sizeof(child_once)); /* reset epoll list */ while (!QUEUE_EMPTY(&global_epoll_queue)) { uv__os390_epoll* lst; q = QUEUE_HEAD(&global_epoll_queue); QUEUE_REMOVE(q); lst = QUEUE_DATA(q, uv__os390_epoll, member); uv__free(lst->items); lst->items = NULL; lst->size = 0; } uv_mutex_unlock(&global_epoll_lock); uv_mutex_destroy(&global_epoll_lock); } static void epoll_init(void) { QUEUE_INIT(&global_epoll_queue); if (uv_mutex_init(&global_epoll_lock)) abort(); if (pthread_atfork(&before_fork, &after_fork, &child_fork)) abort(); } uv__os390_epoll* epoll_create1(int flags) { uv__os390_epoll* lst; lst = uv__malloc(sizeof(*lst)); if (lst != NULL) { /* initialize list */ lst->size = 0; lst->items = NULL; init_message_queue(lst); maybe_resize(lst, 1); lst->items[lst->size - 1].fd = lst->msg_queue; lst->items[lst->size - 1].events = POLLIN; lst->items[lst->size - 1].revents = 0; uv_once(&once, epoll_init); uv_mutex_lock(&global_epoll_lock); QUEUE_INSERT_TAIL(&global_epoll_queue, &lst->member); uv_mutex_unlock(&global_epoll_lock); } return lst; } int epoll_ctl(uv__os390_epoll* lst, int op, int fd, struct epoll_event *event) { uv_mutex_lock(&global_epoll_lock); if (op == EPOLL_CTL_DEL) { if (fd >= lst->size || lst->items[fd].fd == -1) { uv_mutex_unlock(&global_epoll_lock); errno = ENOENT; return -1; } lst->items[fd].fd = -1; } else if (op == EPOLL_CTL_ADD) { /* Resizing to 'fd + 1' would expand the list to contain at least * 'fd'. But we need to guarantee that the last index on the list * is reserved for the message queue. So specify 'fd + 2' instead. */ maybe_resize(lst, fd + 2); if (lst->items[fd].fd != -1) { uv_mutex_unlock(&global_epoll_lock); errno = EEXIST; return -1; } lst->items[fd].fd = fd; lst->items[fd].events = event->events; lst->items[fd].revents = 0; } else if (op == EPOLL_CTL_MOD) { if (fd >= lst->size - 1 || lst->items[fd].fd == -1) { uv_mutex_unlock(&global_epoll_lock); errno = ENOENT; return -1; } lst->items[fd].events = event->events; lst->items[fd].revents = 0; } else abort(); uv_mutex_unlock(&global_epoll_lock); return 0; } #define EP_MAX_PFDS (ULONG_MAX / sizeof(struct pollfd)) #define EP_MAX_EVENTS (INT_MAX / sizeof(struct epoll_event)) int epoll_wait(uv__os390_epoll* lst, struct epoll_event* events, int maxevents, int timeout) { nmsgsfds_t size; struct pollfd* pfds; int pollret; int reventcount; int nevents; struct pollfd msg_fd; int i; if (!lst || !lst->items || !events) { errno = EFAULT; return -1; } if (lst->size > EP_MAX_PFDS) { errno = EINVAL; return -1; } if (maxevents <= 0 || maxevents > EP_MAX_EVENTS) { errno = EINVAL; return -1; } if (lst->size > 0) _SET_FDS_MSGS(size, 1, lst->size - 1); else _SET_FDS_MSGS(size, 0, 0); pfds = lst->items; pollret = poll(pfds, size, timeout); if (pollret <= 0) return pollret; assert(lst->size > 0); pollret = _NFDS(pollret) + _NMSGS(pollret); reventcount = 0; nevents = 0; msg_fd = pfds[lst->size - 1]; for (i = 0; i < lst->size && i < maxevents && reventcount < pollret; ++i) { struct epoll_event ev; struct pollfd* pfd; pfd = &pfds[i]; if (pfd->fd == -1 || pfd->revents == 0) continue; ev.fd = pfd->fd; ev.events = pfd->revents; ev.is_msg = 0; if (pfd->revents & POLLIN && pfd->revents & POLLOUT) reventcount += 2; else if (pfd->revents & (POLLIN | POLLOUT)) ++reventcount; pfd->revents = 0; events[nevents++] = ev; } if (msg_fd.revents != 0 && msg_fd.fd != -1) if (i == lst->size) events[nevents - 1].is_msg = 1; return nevents; } int epoll_file_close(int fd) { QUEUE* q; uv_once(&once, epoll_init); uv_mutex_lock(&global_epoll_lock); QUEUE_FOREACH(q, &global_epoll_queue) { uv__os390_epoll* lst; lst = QUEUE_DATA(q, uv__os390_epoll, member); if (fd < lst->size && lst->items != NULL && lst->items[fd].fd != -1) lst->items[fd].fd = -1; } uv_mutex_unlock(&global_epoll_lock); return 0; } void epoll_queue_close(uv__os390_epoll* lst) { /* Remove epoll instance from global queue */ uv_mutex_lock(&global_epoll_lock); QUEUE_REMOVE(&lst->member); uv_mutex_unlock(&global_epoll_lock); /* Free resources */ msgctl(lst->msg_queue, IPC_RMID, NULL); lst->msg_queue = -1; uv__free(lst->items); lst->items = NULL; } int nanosleep(const struct timespec* req, struct timespec* rem) { unsigned nano; unsigned seconds; unsigned events; unsigned secrem; unsigned nanorem; int rv; int err; int rsn; nano = (int)req->tv_nsec; seconds = req->tv_sec; events = CW_CONDVAR | CW_INTRPT; secrem = 0; nanorem = 0; #if defined(_LP64) BPX4CTW(&seconds, &nano, &events, &secrem, &nanorem, &rv, &err, &rsn); #else BPX1CTW(&seconds, &nano, &events, &secrem, &nanorem, &rv, &err, &rsn); #endif /* Don't clobber errno unless BPX1CTW/BPX4CTW errored. * Don't leak EAGAIN, that just means the timeout expired. */ if (rv == -1) if (err == EAGAIN) rv = 0; else errno = err; if (rem != NULL && (rv == 0 || err == EINTR)) { rem->tv_nsec = nanorem; rem->tv_sec = secrem; } return rv; } char* mkdtemp(char* path) { static const char* tempchars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; static const size_t num_chars = 62; static const size_t num_x = 6; char *ep, *cp; unsigned int tries, i; size_t len; uint64_t v; int fd; int retval; int saved_errno; len = strlen(path); ep = path + len; if (len < num_x || strncmp(ep - num_x, "XXXXXX", num_x)) { errno = EINVAL; return NULL; } fd = open("/dev/urandom", O_RDONLY); if (fd == -1) return NULL; tries = TMP_MAX; retval = -1; do { if (read(fd, &v, sizeof(v)) != sizeof(v)) break; cp = ep - num_x; for (i = 0; i < num_x; i++) { *cp++ = tempchars[v % num_chars]; v /= num_chars; } if (mkdir(path, S_IRWXU) == 0) { retval = 0; break; } else if (errno != EEXIST) break; } while (--tries); saved_errno = errno; uv__close(fd); if (tries == 0) { errno = EEXIST; return NULL; } if (retval == -1) { errno = saved_errno; return NULL; } return path; } ssize_t os390_readlink(const char* path, char* buf, size_t len) { ssize_t rlen; ssize_t vlen; ssize_t plen; char* delimiter; char old_delim; char* tmpbuf; char realpathstr[PATH_MAX + 1]; tmpbuf = uv__malloc(len + 1); if (tmpbuf == NULL) { errno = ENOMEM; return -1; } rlen = readlink(path, tmpbuf, len); if (rlen < 0) { uv__free(tmpbuf); return rlen; } if (rlen < 3 || strncmp("/$", tmpbuf, 2) != 0) { /* Straightforward readlink. */ memcpy(buf, tmpbuf, rlen); uv__free(tmpbuf); return rlen; } /* * There is a parmlib variable at the beginning * which needs interpretation. */ tmpbuf[rlen] = '\0'; delimiter = strchr(tmpbuf + 2, '/'); if (delimiter == NULL) /* No slash at the end */ delimiter = strchr(tmpbuf + 2, '\0'); /* Read real path of the variable. */ old_delim = *delimiter; *delimiter = '\0'; if (realpath(tmpbuf, realpathstr) == NULL) { uv__free(tmpbuf); return -1; } /* realpathstr is not guaranteed to end with null byte.*/ realpathstr[PATH_MAX] = '\0'; /* Reset the delimiter and fill up the buffer. */ *delimiter = old_delim; plen = strlen(delimiter); vlen = strlen(realpathstr); rlen = plen + vlen; if (rlen > len) { uv__free(tmpbuf); errno = ENAMETOOLONG; return -1; } memcpy(buf, realpathstr, vlen); memcpy(buf + vlen, delimiter, plen); /* Done using temporary buffer. */ uv__free(tmpbuf); return rlen; } size_t strnlen(const char* str, size_t maxlen) { char* p = memchr(str, 0, maxlen); if (p == NULL) return maxlen; else return p - str; } int sem_init(UV_PLATFORM_SEM_T* semid, int pshared, unsigned int value) { UNREACHABLE(); } int sem_destroy(UV_PLATFORM_SEM_T* semid) { UNREACHABLE(); } int sem_post(UV_PLATFORM_SEM_T* semid) { UNREACHABLE(); } int sem_trywait(UV_PLATFORM_SEM_T* semid) { UNREACHABLE(); } int sem_wait(UV_PLATFORM_SEM_T* semid) { UNREACHABLE(); } ================================================ FILE: external/libuv/src/unix/os390-syscalls.h ================================================ /* Copyright libuv project contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #ifndef UV_OS390_SYSCALL_H_ #define UV_OS390_SYSCALL_H_ #include "uv.h" #include "internal.h" #include #include #include #define EPOLL_CTL_ADD 1 #define EPOLL_CTL_DEL 2 #define EPOLL_CTL_MOD 3 #define MAX_EPOLL_INSTANCES 256 #define MAX_ITEMS_PER_EPOLL 1024 #define UV__O_CLOEXEC 0x80000 struct epoll_event { int events; int fd; int is_msg; }; typedef struct { QUEUE member; struct pollfd* items; unsigned long size; int msg_queue; } uv__os390_epoll; /* epoll api */ uv__os390_epoll* epoll_create1(int flags); int epoll_ctl(uv__os390_epoll* ep, int op, int fd, struct epoll_event *event); int epoll_wait(uv__os390_epoll* ep, struct epoll_event *events, int maxevents, int timeout); int epoll_file_close(int fd); /* utility functions */ int nanosleep(const struct timespec* req, struct timespec* rem); int scandir(const char* maindir, struct dirent*** namelist, int (*filter)(const struct dirent *), int (*compar)(const struct dirent **, const struct dirent **)); char *mkdtemp(char* path); ssize_t os390_readlink(const char* path, char* buf, size_t len); size_t strnlen(const char* str, size_t maxlen); int sem_init(UV_PLATFORM_SEM_T* semid, int pshared, unsigned int value); int sem_destroy(UV_PLATFORM_SEM_T* semid); int sem_post(UV_PLATFORM_SEM_T* semid); int sem_trywait(UV_PLATFORM_SEM_T* semid); int sem_wait(UV_PLATFORM_SEM_T* semid); #endif /* UV_OS390_SYSCALL_H_ */ ================================================ FILE: external/libuv/src/unix/os390.c ================================================ /* Copyright libuv project contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "internal.h" #include #include #include #include #include #include #include #include #if defined(__clang__) #include "csrsic.h" #else #include "//'SYS1.SAMPLIB(CSRSIC)'" #endif #define CVT_PTR 0x10 #define PSA_PTR 0x00 #define CSD_OFFSET 0x294 /* Long-term average CPU service used by this logical partition, in millions of service units per hour. If this value is above the partition's defined capacity, the partition will be capped. It is calculated using the physical CPU adjustment factor (RCTPCPUA) so it may not match other measures of service which are based on the logical CPU adjustment factor. It is available if the hardware supports LPAR cluster. */ #define RCTLACS_OFFSET 0xC4 /* 32-bit count of alive CPUs. This includes both CPs and IFAs */ #define CSD_NUMBER_ONLINE_CPUS 0xD4 /* Address of system resources manager (SRM) control table */ #define CVTOPCTP_OFFSET 0x25C /* Address of the RCT table */ #define RMCTRCT_OFFSET 0xE4 /* Address of the rsm control and enumeration area. */ #define CVTRCEP_OFFSET 0x490 /* Number of frames currently available to system. Excluded are frames backing perm storage, frames offline, and bad frames. */ #define RCEPOOL_OFFSET 0x004 /* Total number of frames currently on all available frame queues. */ #define RCEAFC_OFFSET 0x088 /* CPC model length from the CSRSI Service. */ #define CPCMODEL_LENGTH 16 /* Pointer to the home (current) ASCB. */ #define PSAAOLD 0x224 /* Pointer to rsm address space block extension. */ #define ASCBRSME 0x16C /* NUMBER OF FRAMES CURRENTLY IN USE BY THIS ADDRESS SPACE. It does not include 2G frames. */ #define RAXFMCT 0x2C /* Thread Entry constants */ #define PGTH_CURRENT 1 #define PGTH_LEN 26 #define PGTHAPATH 0x20 #pragma linkage(BPX4GTH, OS) #pragma linkage(BPX1GTH, OS) /* TOD Clock resolution in nanoseconds */ #define TOD_RES 4.096 typedef unsigned data_area_ptr_assign_type; typedef union { struct { #if defined(_LP64) data_area_ptr_assign_type lower; #endif data_area_ptr_assign_type assign; }; char* deref; } data_area_ptr; void uv_loadavg(double avg[3]) { /* TODO: implement the following */ avg[0] = 0; avg[1] = 0; avg[2] = 0; } int uv__platform_loop_init(uv_loop_t* loop) { uv__os390_epoll* ep; ep = epoll_create1(0); loop->ep = ep; if (ep == NULL) return UV__ERR(errno); return 0; } void uv__platform_loop_delete(uv_loop_t* loop) { if (loop->ep != NULL) { epoll_queue_close(loop->ep); loop->ep = NULL; } } uint64_t uv__hrtime(uv_clocktype_t type) { unsigned long long timestamp; __stckf(×tamp); /* Convert to nanoseconds */ return timestamp / TOD_RES; } /* Get the exe path using the thread entry information in the address space. */ static int getexe(const int pid, char* buf, size_t len) { struct { int pid; int thid[2]; char accesspid; char accessthid; char asid[2]; char loginname[8]; char flag; char len; } Input_data; union { struct { char gthb[4]; int pid; int thid[2]; char accesspid; char accessthid[3]; int lenused; int offsetProcess; int offsetConTTY; int offsetPath; int offsetCommand; int offsetFileData; int offsetThread; } Output_data; char buf[2048]; } Output_buf; struct Output_path_type { char gthe[4]; short int len; char path[1024]; }; int Input_length; int Output_length; void* Input_address; void* Output_address; struct Output_path_type* Output_path; int rv; int rc; int rsn; Input_length = PGTH_LEN; Output_length = sizeof(Output_buf); Output_address = &Output_buf; Input_address = &Input_data; memset(&Input_data, 0, sizeof Input_data); Input_data.flag |= PGTHAPATH; Input_data.pid = pid; Input_data.accesspid = PGTH_CURRENT; #ifdef _LP64 BPX4GTH(&Input_length, &Input_address, &Output_length, &Output_address, &rv, &rc, &rsn); #else BPX1GTH(&Input_length, &Input_address, &Output_length, &Output_address, &rv, &rc, &rsn); #endif if (rv == -1) { errno = rc; return -1; } /* Check highest byte to ensure data availability */ assert(((Output_buf.Output_data.offsetPath >>24) & 0xFF) == 'A'); /* Get the offset from the lowest 3 bytes */ Output_path = (struct Output_path_type*) ((char*) (&Output_buf) + (Output_buf.Output_data.offsetPath & 0x00FFFFFF)); if (Output_path->len >= len) { errno = ENOBUFS; return -1; } uv__strscpy(buf, Output_path->path, len); return 0; } /* * We could use a static buffer for the path manipulations that we need outside * of the function, but this function could be called by multiple consumers and * we don't want to potentially create a race condition in the use of snprintf. * There is no direct way of getting the exe path in zOS - either through /procfs * or through some libc APIs. The below approach is to parse the argv[0]'s pattern * and use it in conjunction with PATH environment variable to craft one. */ int uv_exepath(char* buffer, size_t* size) { int res; char args[PATH_MAX]; char abspath[PATH_MAX]; size_t abspath_size; int pid; if (buffer == NULL || size == NULL || *size == 0) return UV_EINVAL; pid = getpid(); res = getexe(pid, args, sizeof(args)); if (res < 0) return UV_EINVAL; /* * Possibilities for args: * i) an absolute path such as: /home/user/myprojects/nodejs/node * ii) a relative path such as: ./node or ../myprojects/nodejs/node * iii) a bare filename such as "node", after exporting PATH variable * to its location. */ /* Case i) and ii) absolute or relative paths */ if (strchr(args, '/') != NULL) { if (realpath(args, abspath) != abspath) return UV__ERR(errno); abspath_size = strlen(abspath); *size -= 1; if (*size > abspath_size) *size = abspath_size; memcpy(buffer, abspath, *size); buffer[*size] = '\0'; return 0; } else { /* Case iii). Search PATH environment variable */ char trypath[PATH_MAX]; char* clonedpath = NULL; char* token = NULL; char* path = getenv("PATH"); if (path == NULL) return UV_EINVAL; clonedpath = uv__strdup(path); if (clonedpath == NULL) return UV_ENOMEM; token = strtok(clonedpath, ":"); while (token != NULL) { snprintf(trypath, sizeof(trypath) - 1, "%s/%s", token, args); if (realpath(trypath, abspath) == abspath) { /* Check the match is executable */ if (access(abspath, X_OK) == 0) { abspath_size = strlen(abspath); *size -= 1; if (*size > abspath_size) *size = abspath_size; memcpy(buffer, abspath, *size); buffer[*size] = '\0'; uv__free(clonedpath); return 0; } } token = strtok(NULL, ":"); } uv__free(clonedpath); /* Out of tokens (path entries), and no match found */ return UV_EINVAL; } } uint64_t uv_get_free_memory(void) { uint64_t freeram; data_area_ptr cvt = {0}; data_area_ptr rcep = {0}; cvt.assign = *(data_area_ptr_assign_type*)(CVT_PTR); rcep.assign = *(data_area_ptr_assign_type*)(cvt.deref + CVTRCEP_OFFSET); freeram = *((uint64_t*)(rcep.deref + RCEAFC_OFFSET)) * 4; return freeram; } uint64_t uv_get_total_memory(void) { uint64_t totalram; data_area_ptr cvt = {0}; data_area_ptr rcep = {0}; cvt.assign = *(data_area_ptr_assign_type*)(CVT_PTR); rcep.assign = *(data_area_ptr_assign_type*)(cvt.deref + CVTRCEP_OFFSET); totalram = *((uint64_t*)(rcep.deref + RCEPOOL_OFFSET)) * 4; return totalram; } uint64_t uv_get_constrained_memory(void) { return 0; /* Memory constraints are unknown. */ } int uv_resident_set_memory(size_t* rss) { char* ascb; char* rax; size_t nframes; ascb = *(char* __ptr32 *)(PSA_PTR + PSAAOLD); rax = *(char* __ptr32 *)(ascb + ASCBRSME); nframes = *(unsigned int*)(rax + RAXFMCT); *rss = nframes * sysconf(_SC_PAGESIZE); return 0; } int uv_uptime(double* uptime) { struct utmpx u ; struct utmpx *v; time64_t t; u.ut_type = BOOT_TIME; v = getutxid(&u); if (v == NULL) return -1; *uptime = difftime64(time64(&t), v->ut_tv.tv_sec); return 0; } int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { uv_cpu_info_t* cpu_info; int idx; siv1v2 info; data_area_ptr cvt = {0}; data_area_ptr csd = {0}; data_area_ptr rmctrct = {0}; data_area_ptr cvtopctp = {0}; int cpu_usage_avg; cvt.assign = *(data_area_ptr_assign_type*)(CVT_PTR); csd.assign = *((data_area_ptr_assign_type *) (cvt.deref + CSD_OFFSET)); cvtopctp.assign = *((data_area_ptr_assign_type *) (cvt.deref + CVTOPCTP_OFFSET)); rmctrct.assign = *((data_area_ptr_assign_type *) (cvtopctp.deref + RMCTRCT_OFFSET)); *count = *((int*) (csd.deref + CSD_NUMBER_ONLINE_CPUS)); cpu_usage_avg = *((unsigned short int*) (rmctrct.deref + RCTLACS_OFFSET)); *cpu_infos = uv__malloc(*count * sizeof(uv_cpu_info_t)); if (!*cpu_infos) return UV_ENOMEM; cpu_info = *cpu_infos; idx = 0; while (idx < *count) { cpu_info->speed = *(int*)(info.siv1v2si22v1.si22v1cpucapability); cpu_info->model = uv__malloc(CPCMODEL_LENGTH + 1); memset(cpu_info->model, '\0', CPCMODEL_LENGTH + 1); memcpy(cpu_info->model, info.siv1v2si11v1.si11v1cpcmodel, CPCMODEL_LENGTH); cpu_info->cpu_times.user = cpu_usage_avg; /* TODO: implement the following */ cpu_info->cpu_times.sys = 0; cpu_info->cpu_times.idle = 0; cpu_info->cpu_times.irq = 0; cpu_info->cpu_times.nice = 0; ++cpu_info; ++idx; } return 0; } static int uv__interface_addresses_v6(uv_interface_address_t** addresses, int* count) { uv_interface_address_t* address; int sockfd; int maxsize; __net_ifconf6header_t ifc; __net_ifconf6entry_t* ifr; __net_ifconf6entry_t* p; __net_ifconf6entry_t flg; *count = 0; /* Assume maximum buffer size allowable */ maxsize = 16384; if (0 > (sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP))) return UV__ERR(errno); ifc.__nif6h_version = 1; ifc.__nif6h_buflen = maxsize; ifc.__nif6h_buffer = uv__calloc(1, maxsize);; if (ioctl(sockfd, SIOCGIFCONF6, &ifc) == -1) { uv__close(sockfd); return UV__ERR(errno); } *count = 0; ifr = (__net_ifconf6entry_t*)(ifc.__nif6h_buffer); while ((char*)ifr < (char*)ifc.__nif6h_buffer + ifc.__nif6h_buflen) { p = ifr; ifr = (__net_ifconf6entry_t*)((char*)ifr + ifc.__nif6h_entrylen); if (!(p->__nif6e_addr.sin6_family == AF_INET6 || p->__nif6e_addr.sin6_family == AF_INET)) continue; if (!(p->__nif6e_flags & _NIF6E_FLAGS_ON_LINK_ACTIVE)) continue; ++(*count); } /* Alloc the return interface structs */ *addresses = uv__malloc(*count * sizeof(uv_interface_address_t)); if (!(*addresses)) { uv__close(sockfd); return UV_ENOMEM; } address = *addresses; ifr = (__net_ifconf6entry_t*)(ifc.__nif6h_buffer); while ((char*)ifr < (char*)ifc.__nif6h_buffer + ifc.__nif6h_buflen) { p = ifr; ifr = (__net_ifconf6entry_t*)((char*)ifr + ifc.__nif6h_entrylen); if (!(p->__nif6e_addr.sin6_family == AF_INET6 || p->__nif6e_addr.sin6_family == AF_INET)) continue; if (!(p->__nif6e_flags & _NIF6E_FLAGS_ON_LINK_ACTIVE)) continue; /* All conditions above must match count loop */ address->name = uv__strdup(p->__nif6e_name); if (p->__nif6e_addr.sin6_family == AF_INET6) address->address.address6 = *((struct sockaddr_in6*) &p->__nif6e_addr); else address->address.address4 = *((struct sockaddr_in*) &p->__nif6e_addr); /* TODO: Retrieve netmask using SIOCGIFNETMASK ioctl */ address->is_internal = flg.__nif6e_flags & _NIF6E_FLAGS_LOOPBACK ? 1 : 0; memset(address->phys_addr, 0, sizeof(address->phys_addr)); address++; } uv__close(sockfd); return 0; } int uv_interface_addresses(uv_interface_address_t** addresses, int* count) { uv_interface_address_t* address; int sockfd; int maxsize; struct ifconf ifc; struct ifreq flg; struct ifreq* ifr; struct ifreq* p; int count_v6; *count = 0; *addresses = NULL; /* get the ipv6 addresses first */ uv_interface_address_t* addresses_v6; uv__interface_addresses_v6(&addresses_v6, &count_v6); /* now get the ipv4 addresses */ /* Assume maximum buffer size allowable */ maxsize = 16384; sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); if (0 > sockfd) return UV__ERR(errno); ifc.ifc_req = uv__calloc(1, maxsize); ifc.ifc_len = maxsize; if (ioctl(sockfd, SIOCGIFCONF, &ifc) == -1) { uv__close(sockfd); return UV__ERR(errno); } #define MAX(a,b) (((a)>(b))?(a):(b)) #define ADDR_SIZE(p) MAX((p).sa_len, sizeof(p)) /* Count all up and running ipv4/ipv6 addresses */ ifr = ifc.ifc_req; while ((char*)ifr < (char*)ifc.ifc_req + ifc.ifc_len) { p = ifr; ifr = (struct ifreq*) ((char*)ifr + sizeof(ifr->ifr_name) + ADDR_SIZE(ifr->ifr_addr)); if (!(p->ifr_addr.sa_family == AF_INET6 || p->ifr_addr.sa_family == AF_INET)) continue; memcpy(flg.ifr_name, p->ifr_name, sizeof(flg.ifr_name)); if (ioctl(sockfd, SIOCGIFFLAGS, &flg) == -1) { uv__close(sockfd); return UV__ERR(errno); } if (!(flg.ifr_flags & IFF_UP && flg.ifr_flags & IFF_RUNNING)) continue; (*count)++; } if (*count == 0) { uv__close(sockfd); return 0; } /* Alloc the return interface structs */ *addresses = uv__malloc((*count + count_v6) * sizeof(uv_interface_address_t)); if (!(*addresses)) { uv__close(sockfd); return UV_ENOMEM; } address = *addresses; /* copy over the ipv6 addresses */ memcpy(address, addresses_v6, count_v6 * sizeof(uv_interface_address_t)); address += count_v6; *count += count_v6; uv__free(addresses_v6); ifr = ifc.ifc_req; while ((char*)ifr < (char*)ifc.ifc_req + ifc.ifc_len) { p = ifr; ifr = (struct ifreq*) ((char*)ifr + sizeof(ifr->ifr_name) + ADDR_SIZE(ifr->ifr_addr)); if (!(p->ifr_addr.sa_family == AF_INET6 || p->ifr_addr.sa_family == AF_INET)) continue; memcpy(flg.ifr_name, p->ifr_name, sizeof(flg.ifr_name)); if (ioctl(sockfd, SIOCGIFFLAGS, &flg) == -1) { uv__close(sockfd); return UV_ENOSYS; } if (!(flg.ifr_flags & IFF_UP && flg.ifr_flags & IFF_RUNNING)) continue; /* All conditions above must match count loop */ address->name = uv__strdup(p->ifr_name); if (p->ifr_addr.sa_family == AF_INET6) { address->address.address6 = *((struct sockaddr_in6*) &p->ifr_addr); } else { address->address.address4 = *((struct sockaddr_in*) &p->ifr_addr); } address->is_internal = flg.ifr_flags & IFF_LOOPBACK ? 1 : 0; memset(address->phys_addr, 0, sizeof(address->phys_addr)); address++; } #undef ADDR_SIZE #undef MAX uv__close(sockfd); return 0; } void uv_free_interface_addresses(uv_interface_address_t* addresses, int count) { int i; for (i = 0; i < count; ++i) uv__free(addresses[i].name); uv__free(addresses); } void uv__platform_invalidate_fd(uv_loop_t* loop, int fd) { struct epoll_event* events; struct epoll_event dummy; uintptr_t i; uintptr_t nfds; assert(loop->watchers != NULL); assert(fd >= 0); events = (struct epoll_event*) loop->watchers[loop->nwatchers]; nfds = (uintptr_t) loop->watchers[loop->nwatchers + 1]; if (events != NULL) /* Invalidate events with same file descriptor */ for (i = 0; i < nfds; i++) if ((int) events[i].fd == fd) events[i].fd = -1; /* Remove the file descriptor from the epoll. */ if (loop->ep != NULL) epoll_ctl(loop->ep, EPOLL_CTL_DEL, fd, &dummy); } int uv__io_check_fd(uv_loop_t* loop, int fd) { struct pollfd p[1]; int rv; p[0].fd = fd; p[0].events = POLLIN; do rv = poll(p, 1, 0); while (rv == -1 && errno == EINTR); if (rv == -1) abort(); if (p[0].revents & POLLNVAL) return -1; return 0; } void uv__fs_event_close(uv_fs_event_t* handle) { uv_fs_event_stop(handle); } int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) { uv__handle_init(loop, (uv_handle_t*)handle, UV_FS_EVENT); return 0; } int uv_fs_event_start(uv_fs_event_t* handle, uv_fs_event_cb cb, const char* filename, unsigned int flags) { uv__os390_epoll* ep; _RFIS reg_struct; char* path; int rc; if (uv__is_active(handle)) return UV_EINVAL; ep = handle->loop->ep; assert(ep->msg_queue != -1); reg_struct.__rfis_cmd = _RFIS_REG; reg_struct.__rfis_qid = ep->msg_queue; reg_struct.__rfis_type = 1; memcpy(reg_struct.__rfis_utok, &handle, sizeof(handle)); path = uv__strdup(filename); if (path == NULL) return UV_ENOMEM; rc = __w_pioctl(path, _IOCC_REGFILEINT, sizeof(reg_struct), ®_struct); if (rc != 0) return UV__ERR(errno); uv__handle_start(handle); handle->path = path; handle->cb = cb; memcpy(handle->rfis_rftok, reg_struct.__rfis_rftok, sizeof(handle->rfis_rftok)); return 0; } int uv_fs_event_stop(uv_fs_event_t* handle) { uv__os390_epoll* ep; _RFIS reg_struct; int rc; if (!uv__is_active(handle)) return 0; ep = handle->loop->ep; assert(ep->msg_queue != -1); reg_struct.__rfis_cmd = _RFIS_UNREG; reg_struct.__rfis_qid = ep->msg_queue; reg_struct.__rfis_type = 1; memcpy(reg_struct.__rfis_rftok, handle->rfis_rftok, sizeof(handle->rfis_rftok)); /* * This call will take "/" as the path argument in case we * don't care to supply the correct path. The system will simply * ignore it. */ rc = __w_pioctl("/", _IOCC_REGFILEINT, sizeof(reg_struct), ®_struct); if (rc != 0 && errno != EALREADY && errno != ENOENT) abort(); uv__handle_stop(handle); return 0; } static int os390_message_queue_handler(uv__os390_epoll* ep) { uv_fs_event_t* handle; int msglen; int events; _RFIM msg; if (ep->msg_queue == -1) return 0; msglen = msgrcv(ep->msg_queue, &msg, sizeof(msg), 0, IPC_NOWAIT); if (msglen == -1 && errno == ENOMSG) return 0; if (msglen == -1) abort(); events = 0; if (msg.__rfim_event == _RFIM_ATTR || msg.__rfim_event == _RFIM_WRITE) events = UV_CHANGE; else if (msg.__rfim_event == _RFIM_RENAME) events = UV_RENAME; else /* Some event that we are not interested in. */ return 0; handle = *(uv_fs_event_t**)(msg.__rfim_utok); handle->cb(handle, uv__basename_r(handle->path), events, 0); return 1; } void uv__io_poll(uv_loop_t* loop, int timeout) { static const int max_safe_timeout = 1789569; struct epoll_event events[1024]; struct epoll_event* pe; struct epoll_event e; uv__os390_epoll* ep; int real_timeout; QUEUE* q; uv__io_t* w; uint64_t base; int count; int nfds; int fd; int op; int i; if (loop->nfds == 0) { assert(QUEUE_EMPTY(&loop->watcher_queue)); return; } while (!QUEUE_EMPTY(&loop->watcher_queue)) { uv_stream_t* stream; q = QUEUE_HEAD(&loop->watcher_queue); QUEUE_REMOVE(q); QUEUE_INIT(q); w = QUEUE_DATA(q, uv__io_t, watcher_queue); assert(w->pevents != 0); assert(w->fd >= 0); stream= container_of(w, uv_stream_t, io_watcher); assert(w->fd < (int) loop->nwatchers); e.events = w->pevents; e.fd = w->fd; if (w->events == 0) op = EPOLL_CTL_ADD; else op = EPOLL_CTL_MOD; /* XXX Future optimization: do EPOLL_CTL_MOD lazily if we stop watching * events, skip the syscall and squelch the events after epoll_wait(). */ if (epoll_ctl(loop->ep, op, w->fd, &e)) { if (errno != EEXIST) abort(); assert(op == EPOLL_CTL_ADD); /* We've reactivated a file descriptor that's been watched before. */ if (epoll_ctl(loop->ep, EPOLL_CTL_MOD, w->fd, &e)) abort(); } w->events = w->pevents; } assert(timeout >= -1); base = loop->time; count = 48; /* Benchmarks suggest this gives the best throughput. */ real_timeout = timeout; int nevents = 0; nfds = 0; for (;;) { if (sizeof(int32_t) == sizeof(long) && timeout >= max_safe_timeout) timeout = max_safe_timeout; nfds = epoll_wait(loop->ep, events, ARRAY_SIZE(events), timeout); /* Update loop->time unconditionally. It's tempting to skip the update when * timeout == 0 (i.e. non-blocking poll) but there is no guarantee that the * operating system didn't reschedule our process while in the syscall. */ base = loop->time; SAVE_ERRNO(uv__update_time(loop)); if (nfds == 0) { assert(timeout != -1); if (timeout > 0) { timeout = real_timeout - timeout; continue; } return; } if (nfds == -1) { if (errno != EINTR) abort(); if (timeout == -1) continue; if (timeout == 0) return; /* Interrupted by a signal. Update timeout and poll again. */ goto update_timeout; } assert(loop->watchers != NULL); loop->watchers[loop->nwatchers] = (void*) events; loop->watchers[loop->nwatchers + 1] = (void*) (uintptr_t) nfds; for (i = 0; i < nfds; i++) { pe = events + i; fd = pe->fd; /* Skip invalidated events, see uv__platform_invalidate_fd */ if (fd == -1) continue; ep = loop->ep; if (pe->is_msg) { os390_message_queue_handler(ep); continue; } assert(fd >= 0); assert((unsigned) fd < loop->nwatchers); w = loop->watchers[fd]; if (w == NULL) { /* File descriptor that we've stopped watching, disarm it. * * Ignore all errors because we may be racing with another thread * when the file descriptor is closed. */ epoll_ctl(loop->ep, EPOLL_CTL_DEL, fd, pe); continue; } /* Give users only events they're interested in. Prevents spurious * callbacks when previous callback invocation in this loop has stopped * the current watcher. Also, filters out events that users has not * requested us to watch. */ pe->events &= w->pevents | POLLERR | POLLHUP; if (pe->events == POLLERR || pe->events == POLLHUP) pe->events |= w->pevents & (POLLIN | POLLOUT); if (pe->events != 0) { w->cb(loop, w, pe->events); nevents++; } } loop->watchers[loop->nwatchers] = NULL; loop->watchers[loop->nwatchers + 1] = NULL; if (nevents != 0) { if (nfds == ARRAY_SIZE(events) && --count != 0) { /* Poll for more events but don't block this time. */ timeout = 0; continue; } return; } if (timeout == 0) return; if (timeout == -1) continue; update_timeout: assert(timeout > 0); real_timeout -= (loop->time - base); if (real_timeout <= 0) return; timeout = real_timeout; } } void uv__set_process_title(const char* title) { /* do nothing */ } int uv__io_fork(uv_loop_t* loop) { /* Nullify the msg queue but don't close it because it is still being used by the parent. */ loop->ep = NULL; uv__platform_loop_delete(loop); return uv__platform_loop_init(loop); } ================================================ FILE: external/libuv/src/unix/pipe.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include int uv_pipe_init(uv_loop_t* loop, uv_pipe_t* handle, int ipc) { uv__stream_init(loop, (uv_stream_t*)handle, UV_NAMED_PIPE); handle->shutdown_req = NULL; handle->connect_req = NULL; handle->pipe_fname = NULL; handle->ipc = ipc; return 0; } int uv_pipe_bind(uv_pipe_t* handle, const char* name) { struct sockaddr_un saddr; const char* pipe_fname; int sockfd; int err; pipe_fname = NULL; /* Already bound? */ if (uv__stream_fd(handle) >= 0) return UV_EINVAL; /* Make a copy of the file name, it outlives this function's scope. */ pipe_fname = uv__strdup(name); if (pipe_fname == NULL) return UV_ENOMEM; /* We've got a copy, don't touch the original any more. */ name = NULL; err = uv__socket(AF_UNIX, SOCK_STREAM, 0); if (err < 0) goto err_socket; sockfd = err; memset(&saddr, 0, sizeof saddr); uv__strscpy(saddr.sun_path, pipe_fname, sizeof(saddr.sun_path)); saddr.sun_family = AF_UNIX; if (bind(sockfd, (struct sockaddr*)&saddr, sizeof saddr)) { err = UV__ERR(errno); /* Convert ENOENT to EACCES for compatibility with Windows. */ if (err == UV_ENOENT) err = UV_EACCES; uv__close(sockfd); goto err_socket; } /* Success. */ handle->flags |= UV_HANDLE_BOUND; handle->pipe_fname = pipe_fname; /* Is a strdup'ed copy. */ handle->io_watcher.fd = sockfd; return 0; err_socket: uv__free((void*)pipe_fname); return err; } int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb) { if (uv__stream_fd(handle) == -1) return UV_EINVAL; if (handle->ipc) return UV_EINVAL; #if defined(__MVS__) || defined(__PASE__) /* On zOS, backlog=0 has undefined behaviour */ /* On IBMi PASE, backlog=0 leads to "Connection refused" error */ if (backlog == 0) backlog = 1; else if (backlog < 0) backlog = SOMAXCONN; #endif if (listen(uv__stream_fd(handle), backlog)) return UV__ERR(errno); handle->connection_cb = cb; handle->io_watcher.cb = uv__server_io; uv__io_start(handle->loop, &handle->io_watcher, POLLIN); return 0; } void uv__pipe_close(uv_pipe_t* handle) { if (handle->pipe_fname) { /* * Unlink the file system entity before closing the file descriptor. * Doing it the other way around introduces a race where our process * unlinks a socket with the same name that's just been created by * another thread or process. */ unlink(handle->pipe_fname); uv__free((void*)handle->pipe_fname); handle->pipe_fname = NULL; } uv__stream_close((uv_stream_t*)handle); } int uv_pipe_open(uv_pipe_t* handle, uv_file fd) { int flags; int mode; int err; flags = 0; if (uv__fd_exists(handle->loop, fd)) return UV_EEXIST; do mode = fcntl(fd, F_GETFL); while (mode == -1 && errno == EINTR); if (mode == -1) return UV__ERR(errno); /* according to docs, must be EBADF */ err = uv__nonblock(fd, 1); if (err) return err; #if defined(__APPLE__) err = uv__stream_try_select((uv_stream_t*) handle, &fd); if (err) return err; #endif /* defined(__APPLE__) */ mode &= O_ACCMODE; if (mode != O_WRONLY) flags |= UV_HANDLE_READABLE; if (mode != O_RDONLY) flags |= UV_HANDLE_WRITABLE; return uv__stream_open((uv_stream_t*)handle, fd, flags); } void uv_pipe_connect(uv_connect_t* req, uv_pipe_t* handle, const char* name, uv_connect_cb cb) { struct sockaddr_un saddr; int new_sock; int err; int r; new_sock = (uv__stream_fd(handle) == -1); if (new_sock) { err = uv__socket(AF_UNIX, SOCK_STREAM, 0); if (err < 0) goto out; handle->io_watcher.fd = err; } memset(&saddr, 0, sizeof saddr); uv__strscpy(saddr.sun_path, name, sizeof(saddr.sun_path)); saddr.sun_family = AF_UNIX; do { r = connect(uv__stream_fd(handle), (struct sockaddr*)&saddr, sizeof saddr); } while (r == -1 && errno == EINTR); if (r == -1 && errno != EINPROGRESS) { err = UV__ERR(errno); #if defined(__CYGWIN__) || defined(__MSYS__) /* EBADF is supposed to mean that the socket fd is bad, but Cygwin reports EBADF instead of ENOTSOCK when the file is not a socket. We do not expect to see a bad fd here (e.g. due to new_sock), so translate the error. */ if (err == UV_EBADF) err = UV_ENOTSOCK; #endif goto out; } err = 0; if (new_sock) { err = uv__stream_open((uv_stream_t*)handle, uv__stream_fd(handle), UV_HANDLE_READABLE | UV_HANDLE_WRITABLE); } if (err == 0) uv__io_start(handle->loop, &handle->io_watcher, POLLOUT); out: handle->delayed_error = err; handle->connect_req = req; uv__req_init(handle->loop, req, UV_CONNECT); req->handle = (uv_stream_t*)handle; req->cb = cb; QUEUE_INIT(&req->queue); /* Force callback to run on next tick in case of error. */ if (err) uv__io_feed(handle->loop, &handle->io_watcher); } static int uv__pipe_getsockpeername(const uv_pipe_t* handle, uv__peersockfunc func, char* buffer, size_t* size) { struct sockaddr_un sa; socklen_t addrlen; int err; addrlen = sizeof(sa); memset(&sa, 0, addrlen); err = uv__getsockpeername((const uv_handle_t*) handle, func, (struct sockaddr*) &sa, (int*) &addrlen); if (err < 0) { *size = 0; return err; } #if defined(__linux__) if (sa.sun_path[0] == 0) /* Linux abstract namespace */ addrlen -= offsetof(struct sockaddr_un, sun_path); else #endif addrlen = strlen(sa.sun_path); if ((size_t)addrlen >= *size) { *size = addrlen + 1; return UV_ENOBUFS; } memcpy(buffer, sa.sun_path, addrlen); *size = addrlen; /* only null-terminate if it's not an abstract socket */ if (buffer[0] != '\0') buffer[addrlen] = '\0'; return 0; } int uv_pipe_getsockname(const uv_pipe_t* handle, char* buffer, size_t* size) { return uv__pipe_getsockpeername(handle, getsockname, buffer, size); } int uv_pipe_getpeername(const uv_pipe_t* handle, char* buffer, size_t* size) { return uv__pipe_getsockpeername(handle, getpeername, buffer, size); } void uv_pipe_pending_instances(uv_pipe_t* handle, int count) { } int uv_pipe_pending_count(uv_pipe_t* handle) { uv__stream_queued_fds_t* queued_fds; if (!handle->ipc) return 0; if (handle->accepted_fd == -1) return 0; if (handle->queued_fds == NULL) return 1; queued_fds = handle->queued_fds; return queued_fds->offset + 1; } uv_handle_type uv_pipe_pending_type(uv_pipe_t* handle) { if (!handle->ipc) return UV_UNKNOWN_HANDLE; if (handle->accepted_fd == -1) return UV_UNKNOWN_HANDLE; else return uv__handle_type(handle->accepted_fd); } int uv_pipe_chmod(uv_pipe_t* handle, int mode) { unsigned desired_mode; struct stat pipe_stat; char* name_buffer; size_t name_len; int r; if (handle == NULL || uv__stream_fd(handle) == -1) return UV_EBADF; if (mode != UV_READABLE && mode != UV_WRITABLE && mode != (UV_WRITABLE | UV_READABLE)) return UV_EINVAL; /* Unfortunately fchmod does not work on all platforms, we will use chmod. */ name_len = 0; r = uv_pipe_getsockname(handle, NULL, &name_len); if (r != UV_ENOBUFS) return r; name_buffer = uv__malloc(name_len); if (name_buffer == NULL) return UV_ENOMEM; r = uv_pipe_getsockname(handle, name_buffer, &name_len); if (r != 0) { uv__free(name_buffer); return r; } /* stat must be used as fstat has a bug on Darwin */ if (stat(name_buffer, &pipe_stat) == -1) { uv__free(name_buffer); return -errno; } desired_mode = 0; if (mode & UV_READABLE) desired_mode |= S_IRUSR | S_IRGRP | S_IROTH; if (mode & UV_WRITABLE) desired_mode |= S_IWUSR | S_IWGRP | S_IWOTH; /* Exit early if pipe already has desired mode. */ if ((pipe_stat.st_mode & desired_mode) == desired_mode) { uv__free(name_buffer); return 0; } pipe_stat.st_mode |= desired_mode; r = chmod(name_buffer, pipe_stat.st_mode); uv__free(name_buffer); return r != -1 ? 0 : UV__ERR(errno); } ================================================ FILE: external/libuv/src/unix/poll.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include static void uv__poll_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) { uv_poll_t* handle; int pevents; handle = container_of(w, uv_poll_t, io_watcher); /* * As documented in the kernel source fs/kernfs/file.c #780 * poll will return POLLERR|POLLPRI in case of sysfs * polling. This does not happen in case of out-of-band * TCP messages. * * The above is the case on (at least) FreeBSD and Linux. * * So to properly determine a POLLPRI or a POLLERR we need * to check for both. */ if ((events & POLLERR) && !(events & UV__POLLPRI)) { uv__io_stop(loop, w, POLLIN | POLLOUT | UV__POLLRDHUP | UV__POLLPRI); uv__handle_stop(handle); handle->poll_cb(handle, UV_EBADF, 0); return; } pevents = 0; if (events & POLLIN) pevents |= UV_READABLE; if (events & UV__POLLPRI) pevents |= UV_PRIORITIZED; if (events & POLLOUT) pevents |= UV_WRITABLE; if (events & UV__POLLRDHUP) pevents |= UV_DISCONNECT; handle->poll_cb(handle, 0, pevents); } int uv_poll_init(uv_loop_t* loop, uv_poll_t* handle, int fd) { int err; if (uv__fd_exists(loop, fd)) return UV_EEXIST; err = uv__io_check_fd(loop, fd); if (err) return err; /* If ioctl(FIONBIO) reports ENOTTY, try fcntl(F_GETFL) + fcntl(F_SETFL). * Workaround for e.g. kqueue fds not supporting ioctls. */ err = uv__nonblock(fd, 1); if (err == UV_ENOTTY) if (uv__nonblock == uv__nonblock_ioctl) err = uv__nonblock_fcntl(fd, 1); if (err) return err; uv__handle_init(loop, (uv_handle_t*) handle, UV_POLL); uv__io_init(&handle->io_watcher, uv__poll_io, fd); handle->poll_cb = NULL; return 0; } int uv_poll_init_socket(uv_loop_t* loop, uv_poll_t* handle, uv_os_sock_t socket) { return uv_poll_init(loop, handle, socket); } static void uv__poll_stop(uv_poll_t* handle) { uv__io_stop(handle->loop, &handle->io_watcher, POLLIN | POLLOUT | UV__POLLRDHUP | UV__POLLPRI); uv__handle_stop(handle); uv__platform_invalidate_fd(handle->loop, handle->io_watcher.fd); } int uv_poll_stop(uv_poll_t* handle) { assert(!uv__is_closing(handle)); uv__poll_stop(handle); return 0; } int uv_poll_start(uv_poll_t* handle, int pevents, uv_poll_cb poll_cb) { int events; assert((pevents & ~(UV_READABLE | UV_WRITABLE | UV_DISCONNECT | UV_PRIORITIZED)) == 0); assert(!uv__is_closing(handle)); uv__poll_stop(handle); if (pevents == 0) return 0; events = 0; if (pevents & UV_READABLE) events |= POLLIN; if (pevents & UV_PRIORITIZED) events |= UV__POLLPRI; if (pevents & UV_WRITABLE) events |= POLLOUT; if (pevents & UV_DISCONNECT) events |= UV__POLLRDHUP; uv__io_start(handle->loop, &handle->io_watcher, events); uv__handle_start(handle); handle->poll_cb = poll_cb; return 0; } void uv__poll_close(uv_poll_t* handle) { uv__poll_stop(handle); } ================================================ FILE: external/libuv/src/unix/posix-hrtime.c ================================================ /* Copyright libuv project contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #undef NANOSEC #define NANOSEC ((uint64_t) 1e9) uint64_t uv__hrtime(uv_clocktype_t type) { struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); return (((uint64_t) ts.tv_sec) * NANOSEC + ts.tv_nsec); } ================================================ FILE: external/libuv/src/unix/posix-poll.c ================================================ /* Copyright libuv project contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" /* POSIX defines poll() as a portable way to wait on file descriptors. * Here we maintain a dynamically sized array of file descriptors and * events to pass as the first argument to poll(). */ #include #include #include #include #include int uv__platform_loop_init(uv_loop_t* loop) { loop->poll_fds = NULL; loop->poll_fds_used = 0; loop->poll_fds_size = 0; loop->poll_fds_iterating = 0; return 0; } void uv__platform_loop_delete(uv_loop_t* loop) { uv__free(loop->poll_fds); loop->poll_fds = NULL; } int uv__io_fork(uv_loop_t* loop) { uv__platform_loop_delete(loop); return uv__platform_loop_init(loop); } /* Allocate or dynamically resize our poll fds array. */ static void uv__pollfds_maybe_resize(uv_loop_t* loop) { size_t i; size_t n; struct pollfd* p; if (loop->poll_fds_used < loop->poll_fds_size) return; n = loop->poll_fds_size ? loop->poll_fds_size * 2 : 64; p = uv__reallocf(loop->poll_fds, n * sizeof(*loop->poll_fds)); if (p == NULL) abort(); loop->poll_fds = p; for (i = loop->poll_fds_size; i < n; i++) { loop->poll_fds[i].fd = -1; loop->poll_fds[i].events = 0; loop->poll_fds[i].revents = 0; } loop->poll_fds_size = n; } /* Primitive swap operation on poll fds array elements. */ static void uv__pollfds_swap(uv_loop_t* loop, size_t l, size_t r) { struct pollfd pfd; pfd = loop->poll_fds[l]; loop->poll_fds[l] = loop->poll_fds[r]; loop->poll_fds[r] = pfd; } /* Add a watcher's fd to our poll fds array with its pending events. */ static void uv__pollfds_add(uv_loop_t* loop, uv__io_t* w) { size_t i; struct pollfd* pe; /* If the fd is already in the set just update its events. */ assert(!loop->poll_fds_iterating); for (i = 0; i < loop->poll_fds_used; ++i) { if (loop->poll_fds[i].fd == w->fd) { loop->poll_fds[i].events = w->pevents; return; } } /* Otherwise, allocate a new slot in the set for the fd. */ uv__pollfds_maybe_resize(loop); pe = &loop->poll_fds[loop->poll_fds_used++]; pe->fd = w->fd; pe->events = w->pevents; } /* Remove a watcher's fd from our poll fds array. */ static void uv__pollfds_del(uv_loop_t* loop, int fd) { size_t i; assert(!loop->poll_fds_iterating); for (i = 0; i < loop->poll_fds_used;) { if (loop->poll_fds[i].fd == fd) { /* swap to last position and remove */ --loop->poll_fds_used; uv__pollfds_swap(loop, i, loop->poll_fds_used); loop->poll_fds[loop->poll_fds_used].fd = -1; loop->poll_fds[loop->poll_fds_used].events = 0; loop->poll_fds[loop->poll_fds_used].revents = 0; /* This method is called with an fd of -1 to purge the invalidated fds, * so we may possibly have multiples to remove. */ if (-1 != fd) return; } else { /* We must only increment the loop counter when the fds do not match. * Otherwise, when we are purging an invalidated fd, the value just * swapped here from the previous end of the array will be skipped. */ ++i; } } } void uv__io_poll(uv_loop_t* loop, int timeout) { sigset_t* pset; sigset_t set; uint64_t time_base; uint64_t time_diff; QUEUE* q; uv__io_t* w; size_t i; unsigned int nevents; int nfds; int have_signals; struct pollfd* pe; int fd; if (loop->nfds == 0) { assert(QUEUE_EMPTY(&loop->watcher_queue)); return; } /* Take queued watchers and add their fds to our poll fds array. */ while (!QUEUE_EMPTY(&loop->watcher_queue)) { q = QUEUE_HEAD(&loop->watcher_queue); QUEUE_REMOVE(q); QUEUE_INIT(q); w = QUEUE_DATA(q, uv__io_t, watcher_queue); assert(w->pevents != 0); assert(w->fd >= 0); assert(w->fd < (int) loop->nwatchers); uv__pollfds_add(loop, w); w->events = w->pevents; } /* Prepare a set of signals to block around poll(), if any. */ pset = NULL; if (loop->flags & UV_LOOP_BLOCK_SIGPROF) { pset = &set; sigemptyset(pset); sigaddset(pset, SIGPROF); } assert(timeout >= -1); time_base = loop->time; /* Loop calls to poll() and processing of results. If we get some * results from poll() but they turn out not to be interesting to * our caller then we need to loop around and poll() again. */ for (;;) { if (pset != NULL) if (pthread_sigmask(SIG_BLOCK, pset, NULL)) abort(); nfds = poll(loop->poll_fds, (nfds_t)loop->poll_fds_used, timeout); if (pset != NULL) if (pthread_sigmask(SIG_UNBLOCK, pset, NULL)) abort(); /* Update loop->time unconditionally. It's tempting to skip the update when * timeout == 0 (i.e. non-blocking poll) but there is no guarantee that the * operating system didn't reschedule our process while in the syscall. */ SAVE_ERRNO(uv__update_time(loop)); if (nfds == 0) { assert(timeout != -1); return; } if (nfds == -1) { if (errno != EINTR) abort(); if (timeout == -1) continue; if (timeout == 0) return; /* Interrupted by a signal. Update timeout and poll again. */ goto update_timeout; } /* Tell uv__platform_invalidate_fd not to manipulate our array * while we are iterating over it. */ loop->poll_fds_iterating = 1; /* Initialize a count of events that we care about. */ nevents = 0; have_signals = 0; /* Loop over the entire poll fds array looking for returned events. */ for (i = 0; i < loop->poll_fds_used; i++) { pe = loop->poll_fds + i; fd = pe->fd; /* Skip invalidated events, see uv__platform_invalidate_fd. */ if (fd == -1) continue; assert(fd >= 0); assert((unsigned) fd < loop->nwatchers); w = loop->watchers[fd]; if (w == NULL) { /* File descriptor that we've stopped watching, ignore. */ uv__platform_invalidate_fd(loop, fd); continue; } /* Filter out events that user has not requested us to watch * (e.g. POLLNVAL). */ pe->revents &= w->pevents | POLLERR | POLLHUP; if (pe->revents != 0) { /* Run signal watchers last. */ if (w == &loop->signal_io_watcher) { have_signals = 1; } else { w->cb(loop, w, pe->revents); } nevents++; } } if (have_signals != 0) loop->signal_io_watcher.cb(loop, &loop->signal_io_watcher, POLLIN); loop->poll_fds_iterating = 0; /* Purge invalidated fds from our poll fds array. */ uv__pollfds_del(loop, -1); if (have_signals != 0) return; /* Event loop should cycle now so don't poll again. */ if (nevents != 0) return; if (timeout == 0) return; if (timeout == -1) continue; update_timeout: assert(timeout > 0); time_diff = loop->time - time_base; if (time_diff >= (uint64_t) timeout) return; timeout -= time_diff; } } /* Remove the given fd from our poll fds array because no one * is interested in its events anymore. */ void uv__platform_invalidate_fd(uv_loop_t* loop, int fd) { size_t i; assert(fd >= 0); if (loop->poll_fds_iterating) { /* uv__io_poll is currently iterating. Just invalidate fd. */ for (i = 0; i < loop->poll_fds_used; i++) if (loop->poll_fds[i].fd == fd) { loop->poll_fds[i].fd = -1; loop->poll_fds[i].events = 0; loop->poll_fds[i].revents = 0; } } else { /* uv__io_poll is not iterating. Delete fd from the set. */ uv__pollfds_del(loop, fd); } } /* Check whether the given fd is supported by poll(). */ int uv__io_check_fd(uv_loop_t* loop, int fd) { struct pollfd p[1]; int rv; p[0].fd = fd; p[0].events = POLLIN; do rv = poll(p, 1, 0); while (rv == -1 && (errno == EINTR || errno == EAGAIN)); if (rv == -1) return UV__ERR(errno); if (p[0].revents & POLLNVAL) return UV_EINVAL; return 0; } ================================================ FILE: external/libuv/src/unix/process.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include #include #include #include #if defined(__APPLE__) && !TARGET_OS_IPHONE # include # define environ (*_NSGetEnviron()) #else extern char **environ; #endif #if defined(__linux__) || defined(__GLIBC__) # include #endif static void uv__chld(uv_signal_t* handle, int signum) { uv_process_t* process; uv_loop_t* loop; int exit_status; int term_signal; int status; pid_t pid; QUEUE pending; QUEUE* q; QUEUE* h; assert(signum == SIGCHLD); QUEUE_INIT(&pending); loop = handle->loop; h = &loop->process_handles; q = QUEUE_HEAD(h); while (q != h) { process = QUEUE_DATA(q, uv_process_t, queue); q = QUEUE_NEXT(q); do pid = waitpid(process->pid, &status, WNOHANG); while (pid == -1 && errno == EINTR); if (pid == 0) continue; if (pid == -1) { if (errno != ECHILD) abort(); continue; } process->status = status; QUEUE_REMOVE(&process->queue); QUEUE_INSERT_TAIL(&pending, &process->queue); } h = &pending; q = QUEUE_HEAD(h); while (q != h) { process = QUEUE_DATA(q, uv_process_t, queue); q = QUEUE_NEXT(q); QUEUE_REMOVE(&process->queue); QUEUE_INIT(&process->queue); uv__handle_stop(process); if (process->exit_cb == NULL) continue; exit_status = 0; if (WIFEXITED(process->status)) exit_status = WEXITSTATUS(process->status); term_signal = 0; if (WIFSIGNALED(process->status)) term_signal = WTERMSIG(process->status); process->exit_cb(process, exit_status, term_signal); } assert(QUEUE_EMPTY(&pending)); } static int uv__make_socketpair(int fds[2]) { #if defined(__FreeBSD__) || defined(__linux__) if (socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, fds)) return UV__ERR(errno); return 0; #else int err; if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds)) return UV__ERR(errno); err = uv__cloexec(fds[0], 1); if (err == 0) err = uv__cloexec(fds[1], 1); if (err != 0) { uv__close(fds[0]); uv__close(fds[1]); return UV__ERR(errno); } return 0; #endif } int uv__make_pipe(int fds[2], int flags) { #if defined(__FreeBSD__) || defined(__linux__) if (pipe2(fds, flags | O_CLOEXEC)) return UV__ERR(errno); return 0; #else if (pipe(fds)) return UV__ERR(errno); if (uv__cloexec(fds[0], 1)) goto fail; if (uv__cloexec(fds[1], 1)) goto fail; if (flags & UV__F_NONBLOCK) { if (uv__nonblock(fds[0], 1)) goto fail; if (uv__nonblock(fds[1], 1)) goto fail; } return 0; fail: uv__close(fds[0]); uv__close(fds[1]); return UV__ERR(errno); #endif } /* * Used for initializing stdio streams like options.stdin_stream. Returns * zero on success. See also the cleanup section in uv_spawn(). */ static int uv__process_init_stdio(uv_stdio_container_t* container, int fds[2]) { int mask; int fd; mask = UV_IGNORE | UV_CREATE_PIPE | UV_INHERIT_FD | UV_INHERIT_STREAM; switch (container->flags & mask) { case UV_IGNORE: return 0; case UV_CREATE_PIPE: assert(container->data.stream != NULL); if (container->data.stream->type != UV_NAMED_PIPE) return UV_EINVAL; else return uv__make_socketpair(fds); case UV_INHERIT_FD: case UV_INHERIT_STREAM: if (container->flags & UV_INHERIT_FD) fd = container->data.fd; else fd = uv__stream_fd(container->data.stream); if (fd == -1) return UV_EINVAL; fds[1] = fd; return 0; default: assert(0 && "Unexpected flags"); return UV_EINVAL; } } static int uv__process_open_stream(uv_stdio_container_t* container, int pipefds[2]) { int flags; int err; if (!(container->flags & UV_CREATE_PIPE) || pipefds[0] < 0) return 0; err = uv__close(pipefds[1]); if (err != 0) abort(); pipefds[1] = -1; uv__nonblock(pipefds[0], 1); flags = 0; if (container->flags & UV_WRITABLE_PIPE) flags |= UV_HANDLE_READABLE; if (container->flags & UV_READABLE_PIPE) flags |= UV_HANDLE_WRITABLE; return uv__stream_open(container->data.stream, pipefds[0], flags); } static void uv__process_close_stream(uv_stdio_container_t* container) { if (!(container->flags & UV_CREATE_PIPE)) return; uv__stream_close(container->data.stream); } static void uv__write_int(int fd, int val) { ssize_t n; do n = write(fd, &val, sizeof(val)); while (n == -1 && errno == EINTR); if (n == -1 && errno == EPIPE) return; /* parent process has quit */ assert(n == sizeof(val)); } #if !(defined(__APPLE__) && (TARGET_OS_TV || TARGET_OS_WATCH)) /* execvp is marked __WATCHOS_PROHIBITED __TVOS_PROHIBITED, so must be * avoided. Since this isn't called on those targets, the function * doesn't even need to be defined for them. */ static void uv__process_child_init(const uv_process_options_t* options, int stdio_count, int (*pipes)[2], int error_fd) { sigset_t set; int close_fd; int use_fd; int err; int fd; int n; if (options->flags & UV_PROCESS_DETACHED) setsid(); /* First duplicate low numbered fds, since it's not safe to duplicate them, * they could get replaced. Example: swapping stdout and stderr; without * this fd 2 (stderr) would be duplicated into fd 1, thus making both * stdout and stderr go to the same fd, which was not the intention. */ for (fd = 0; fd < stdio_count; fd++) { use_fd = pipes[fd][1]; if (use_fd < 0 || use_fd >= fd) continue; pipes[fd][1] = fcntl(use_fd, F_DUPFD, stdio_count); if (pipes[fd][1] == -1) { uv__write_int(error_fd, UV__ERR(errno)); _exit(127); } } for (fd = 0; fd < stdio_count; fd++) { close_fd = pipes[fd][0]; use_fd = pipes[fd][1]; if (use_fd < 0) { if (fd >= 3) continue; else { /* redirect stdin, stdout and stderr to /dev/null even if UV_IGNORE is * set */ use_fd = open("/dev/null", fd == 0 ? O_RDONLY : O_RDWR); close_fd = use_fd; if (use_fd < 0) { uv__write_int(error_fd, UV__ERR(errno)); _exit(127); } } } if (fd == use_fd) uv__cloexec_fcntl(use_fd, 0); else fd = dup2(use_fd, fd); if (fd == -1) { uv__write_int(error_fd, UV__ERR(errno)); _exit(127); } if (fd <= 2) uv__nonblock_fcntl(fd, 0); if (close_fd >= stdio_count) uv__close(close_fd); } for (fd = 0; fd < stdio_count; fd++) { use_fd = pipes[fd][1]; if (use_fd >= stdio_count) uv__close(use_fd); } if (options->cwd != NULL && chdir(options->cwd)) { uv__write_int(error_fd, UV__ERR(errno)); _exit(127); } if (options->flags & (UV_PROCESS_SETUID | UV_PROCESS_SETGID)) { /* When dropping privileges from root, the `setgroups` call will * remove any extraneous groups. If we don't call this, then * even though our uid has dropped, we may still have groups * that enable us to do super-user things. This will fail if we * aren't root, so don't bother checking the return value, this * is just done as an optimistic privilege dropping function. */ SAVE_ERRNO(setgroups(0, NULL)); } if ((options->flags & UV_PROCESS_SETGID) && setgid(options->gid)) { uv__write_int(error_fd, UV__ERR(errno)); _exit(127); } if ((options->flags & UV_PROCESS_SETUID) && setuid(options->uid)) { uv__write_int(error_fd, UV__ERR(errno)); _exit(127); } if (options->env != NULL) { environ = options->env; } /* Reset signal disposition. Use a hard-coded limit because NSIG * is not fixed on Linux: it's either 32, 34 or 64, depending on * whether RT signals are enabled. We are not allowed to touch * RT signal handlers, glibc uses them internally. */ for (n = 1; n < 32; n += 1) { if (n == SIGKILL || n == SIGSTOP) continue; /* Can't be changed. */ #if defined(__HAIKU__) if (n == SIGKILLTHR) continue; /* Can't be changed. */ #endif if (SIG_ERR != signal(n, SIG_DFL)) continue; uv__write_int(error_fd, UV__ERR(errno)); _exit(127); } /* Reset signal mask. */ sigemptyset(&set); err = pthread_sigmask(SIG_SETMASK, &set, NULL); if (err != 0) { uv__write_int(error_fd, UV__ERR(err)); _exit(127); } execvp(options->file, options->args); uv__write_int(error_fd, UV__ERR(errno)); _exit(127); } #endif int uv_spawn(uv_loop_t* loop, uv_process_t* process, const uv_process_options_t* options) { #if defined(__APPLE__) && (TARGET_OS_TV || TARGET_OS_WATCH) /* fork is marked __WATCHOS_PROHIBITED __TVOS_PROHIBITED. */ return UV_ENOSYS; #else int signal_pipe[2] = { -1, -1 }; int pipes_storage[8][2]; int (*pipes)[2]; int stdio_count; ssize_t r; pid_t pid; int err; int exec_errorno; int i; int status; assert(options->file != NULL); assert(!(options->flags & ~(UV_PROCESS_DETACHED | UV_PROCESS_SETGID | UV_PROCESS_SETUID | UV_PROCESS_WINDOWS_HIDE | UV_PROCESS_WINDOWS_HIDE_CONSOLE | UV_PROCESS_WINDOWS_HIDE_GUI | UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS))); uv__handle_init(loop, (uv_handle_t*)process, UV_PROCESS); QUEUE_INIT(&process->queue); stdio_count = options->stdio_count; if (stdio_count < 3) stdio_count = 3; err = UV_ENOMEM; pipes = pipes_storage; if (stdio_count > (int) ARRAY_SIZE(pipes_storage)) pipes = uv__malloc(stdio_count * sizeof(*pipes)); if (pipes == NULL) goto error; for (i = 0; i < stdio_count; i++) { pipes[i][0] = -1; pipes[i][1] = -1; } for (i = 0; i < options->stdio_count; i++) { err = uv__process_init_stdio(options->stdio + i, pipes[i]); if (err) goto error; } /* This pipe is used by the parent to wait until * the child has called `execve()`. We need this * to avoid the following race condition: * * if ((pid = fork()) > 0) { * kill(pid, SIGTERM); * } * else if (pid == 0) { * execve("/bin/cat", argp, envp); * } * * The parent sends a signal immediately after forking. * Since the child may not have called `execve()` yet, * there is no telling what process receives the signal, * our fork or /bin/cat. * * To avoid ambiguity, we create a pipe with both ends * marked close-on-exec. Then, after the call to `fork()`, * the parent polls the read end until it EOFs or errors with EPIPE. */ err = uv__make_pipe(signal_pipe, 0); if (err) goto error; uv_signal_start(&loop->child_watcher, uv__chld, SIGCHLD); /* Acquire write lock to prevent opening new fds in worker threads */ uv_rwlock_wrlock(&loop->cloexec_lock); pid = fork(); if (pid == -1) { err = UV__ERR(errno); uv_rwlock_wrunlock(&loop->cloexec_lock); uv__close(signal_pipe[0]); uv__close(signal_pipe[1]); goto error; } if (pid == 0) { uv__process_child_init(options, stdio_count, pipes, signal_pipe[1]); abort(); } /* Release lock in parent process */ uv_rwlock_wrunlock(&loop->cloexec_lock); uv__close(signal_pipe[1]); process->status = 0; exec_errorno = 0; do r = read(signal_pipe[0], &exec_errorno, sizeof(exec_errorno)); while (r == -1 && errno == EINTR); if (r == 0) ; /* okay, EOF */ else if (r == sizeof(exec_errorno)) { do err = waitpid(pid, &status, 0); /* okay, read errorno */ while (err == -1 && errno == EINTR); assert(err == pid); } else if (r == -1 && errno == EPIPE) { do err = waitpid(pid, &status, 0); /* okay, got EPIPE */ while (err == -1 && errno == EINTR); assert(err == pid); } else abort(); uv__close_nocheckstdio(signal_pipe[0]); for (i = 0; i < options->stdio_count; i++) { err = uv__process_open_stream(options->stdio + i, pipes[i]); if (err == 0) continue; while (i--) uv__process_close_stream(options->stdio + i); goto error; } /* Only activate this handle if exec() happened successfully */ if (exec_errorno == 0) { QUEUE_INSERT_TAIL(&loop->process_handles, &process->queue); uv__handle_start(process); } process->pid = pid; process->exit_cb = options->exit_cb; if (pipes != pipes_storage) uv__free(pipes); return exec_errorno; error: if (pipes != NULL) { for (i = 0; i < stdio_count; i++) { if (i < options->stdio_count) if (options->stdio[i].flags & (UV_INHERIT_FD | UV_INHERIT_STREAM)) continue; if (pipes[i][0] != -1) uv__close_nocheckstdio(pipes[i][0]); if (pipes[i][1] != -1) uv__close_nocheckstdio(pipes[i][1]); } if (pipes != pipes_storage) uv__free(pipes); } return err; #endif } int uv_process_kill(uv_process_t* process, int signum) { return uv_kill(process->pid, signum); } int uv_kill(int pid, int signum) { if (kill(pid, signum)) return UV__ERR(errno); else return 0; } void uv__process_close(uv_process_t* handle) { QUEUE_REMOVE(&handle->queue); uv__handle_stop(handle); if (QUEUE_EMPTY(&handle->loop->process_handles)) uv_signal_stop(&handle->loop->child_watcher); } ================================================ FILE: external/libuv/src/unix/procfs-exepath.c ================================================ /* Copyright libuv project contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include int uv_exepath(char* buffer, size_t* size) { ssize_t n; if (buffer == NULL || size == NULL || *size == 0) return UV_EINVAL; n = *size - 1; if (n > 0) n = readlink("/proc/self/exe", buffer, n); if (n == -1) return UV__ERR(errno); buffer[n] = '\0'; *size = n; return 0; } ================================================ FILE: external/libuv/src/unix/proctitle.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include struct uv__process_title { char* str; size_t len; /* Length of the current process title. */ size_t cap; /* Maximum capacity. Computed once in uv_setup_args(). */ }; extern void uv__set_process_title(const char* title); static uv_mutex_t process_title_mutex; static uv_once_t process_title_mutex_once = UV_ONCE_INIT; static struct uv__process_title process_title; static void* args_mem; static void init_process_title_mutex_once(void) { uv_mutex_init(&process_title_mutex); } char** uv_setup_args(int argc, char** argv) { struct uv__process_title pt; char** new_argv; size_t size; char* s; int i; if (argc <= 0) return argv; pt.str = argv[0]; pt.len = strlen(argv[0]); pt.cap = pt.len + 1; /* Calculate how much memory we need for the argv strings. */ size = pt.cap; for (i = 1; i < argc; i++) size += strlen(argv[i]) + 1; /* Add space for the argv pointers. */ size += (argc + 1) * sizeof(char*); new_argv = uv__malloc(size); if (new_argv == NULL) return argv; /* Copy over the strings and set up the pointer table. */ i = 0; s = (char*) &new_argv[argc + 1]; size = pt.cap; goto loop; for (/* empty */; i < argc; i++) { size = strlen(argv[i]) + 1; loop: memcpy(s, argv[i], size); new_argv[i] = s; s += size; } new_argv[i] = NULL; /* argv is not adjacent on z/os, we use just argv[0] on that platform. */ #ifndef __MVS__ pt.cap = argv[i - 1] + size - argv[0]; #endif args_mem = new_argv; process_title = pt; return new_argv; } int uv_set_process_title(const char* title) { struct uv__process_title* pt; size_t len; pt = &process_title; len = strlen(title); uv_once(&process_title_mutex_once, init_process_title_mutex_once); uv_mutex_lock(&process_title_mutex); if (len >= pt->cap) { len = 0; if (pt->cap > 0) len = pt->cap - 1; } memcpy(pt->str, title, len); memset(pt->str + len, '\0', pt->cap - len); pt->len = len; uv_mutex_unlock(&process_title_mutex); return 0; } int uv_get_process_title(char* buffer, size_t size) { if (buffer == NULL || size == 0) return UV_EINVAL; uv_once(&process_title_mutex_once, init_process_title_mutex_once); uv_mutex_lock(&process_title_mutex); if (size <= process_title.len) { uv_mutex_unlock(&process_title_mutex); return UV_ENOBUFS; } if (process_title.len != 0) memcpy(buffer, process_title.str, process_title.len + 1); buffer[process_title.len] = '\0'; uv_mutex_unlock(&process_title_mutex); return 0; } void uv__process_title_cleanup(void) { uv__free(args_mem); /* Keep valgrind happy. */ args_mem = NULL; } ================================================ FILE: external/libuv/src/unix/pthread-fixes.c ================================================ /* Copyright (c) 2013, Sony Mobile Communications AB * Copyright (c) 2012, Google Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Android versions < 4.1 have a broken pthread_sigmask. */ #include #include #include int uv__pthread_sigmask(int how, const sigset_t* set, sigset_t* oset) { static int workaround; int err; if (workaround) { return sigprocmask(how, set, oset); } else { err = pthread_sigmask(how, set, oset); if (err) { if (err == EINVAL && sigprocmask(how, set, oset) == 0) { workaround = 1; return 0; } else { return -1; } } } return 0; } ================================================ FILE: external/libuv/src/unix/random-devurandom.c ================================================ /* Copyright libuv contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include static uv_once_t once = UV_ONCE_INIT; static int status; int uv__random_readpath(const char* path, void* buf, size_t buflen) { struct stat s; size_t pos; ssize_t n; int fd; fd = uv__open_cloexec(path, O_RDONLY); if (fd < 0) return fd; if (fstat(fd, &s)) { uv__close(fd); return UV__ERR(errno); } if (!S_ISCHR(s.st_mode)) { uv__close(fd); return UV_EIO; } for (pos = 0; pos != buflen; pos += n) { do n = read(fd, (char*) buf + pos, buflen - pos); while (n == -1 && errno == EINTR); if (n == -1) { uv__close(fd); return UV__ERR(errno); } if (n == 0) { uv__close(fd); return UV_EIO; } } uv__close(fd); return 0; } static void uv__random_devurandom_init(void) { char c; /* Linux's random(4) man page suggests applications should read at least * once from /dev/random before switching to /dev/urandom in order to seed * the system RNG. Reads from /dev/random can of course block indefinitely * until entropy is available but that's the point. */ status = uv__random_readpath("/dev/random", &c, 1); } int uv__random_devurandom(void* buf, size_t buflen) { uv_once(&once, uv__random_devurandom_init); if (status != 0) return status; return uv__random_readpath("/dev/urandom", buf, buflen); } ================================================ FILE: external/libuv/src/unix/random-getentropy.c ================================================ /* Copyright libuv contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include typedef int (*uv__getentropy_cb)(void *, size_t); static uv__getentropy_cb uv__getentropy; static uv_once_t once = UV_ONCE_INIT; static void uv__random_getentropy_init(void) { uv__getentropy = (uv__getentropy_cb) dlsym(RTLD_DEFAULT, "getentropy"); } int uv__random_getentropy(void* buf, size_t buflen) { size_t pos; size_t stride; uv_once(&once, uv__random_getentropy_init); if (uv__getentropy == NULL) return UV_ENOSYS; /* getentropy() returns an error for requests > 256 bytes. */ for (pos = 0, stride = 256; pos + stride < buflen; pos += stride) if (uv__getentropy((char *) buf + pos, stride)) return UV__ERR(errno); if (uv__getentropy((char *) buf + pos, buflen - pos)) return UV__ERR(errno); return 0; } ================================================ FILE: external/libuv/src/unix/random-getrandom.c ================================================ /* Copyright libuv contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #ifdef __linux__ #include "linux-syscalls.h" #define uv__random_getrandom_init() 0 #else /* !__linux__ */ #include #include typedef ssize_t (*uv__getrandom_cb)(void *, size_t, unsigned); static uv__getrandom_cb uv__getrandom; static uv_once_t once = UV_ONCE_INIT; static void uv__random_getrandom_init_once(void) { uv__getrandom = (uv__getrandom_cb) dlsym(RTLD_DEFAULT, "getrandom"); } static int uv__random_getrandom_init(void) { uv_once(&once, uv__random_getrandom_init_once); if (uv__getrandom == NULL) return UV_ENOSYS; return 0; } #endif /* !__linux__ */ int uv__random_getrandom(void* buf, size_t buflen) { ssize_t n; size_t pos; int rc; rc = uv__random_getrandom_init(); if (rc != 0) return rc; for (pos = 0; pos != buflen; pos += n) { do { n = buflen - pos; /* Most getrandom() implementations promise that reads <= 256 bytes * will always succeed and won't be interrupted by signals. * It's therefore useful to split it up in smaller reads because * one big read may, in theory, continuously fail with EINTR. */ if (n > 256) n = 256; n = uv__getrandom((char *) buf + pos, n, 0); } while (n == -1 && errno == EINTR); if (n == -1) return UV__ERR(errno); if (n == 0) return UV_EIO; } return 0; } ================================================ FILE: external/libuv/src/unix/random-sysctl-linux.c ================================================ /* Copyright libuv contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include struct uv__sysctl_args { int* name; int nlen; void* oldval; size_t* oldlenp; void* newval; size_t newlen; unsigned long unused[4]; }; int uv__random_sysctl(void* buf, size_t buflen) { static int name[] = {1 /*CTL_KERN*/, 40 /*KERN_RANDOM*/, 6 /*RANDOM_UUID*/}; struct uv__sysctl_args args; char uuid[16]; char* p; char* pe; size_t n; p = buf; pe = p + buflen; while (p < pe) { memset(&args, 0, sizeof(args)); args.name = name; args.nlen = ARRAY_SIZE(name); args.oldval = uuid; args.oldlenp = &n; n = sizeof(uuid); /* Emits a deprecation warning with some kernels but that seems like * an okay trade-off for the fallback of the fallback: this function is * only called when neither getrandom(2) nor /dev/urandom are available. * Fails with ENOSYS on kernels configured without CONFIG_SYSCTL_SYSCALL. * At least arm64 never had a _sysctl system call and therefore doesn't * have a SYS__sysctl define either. */ #ifdef SYS__sysctl if (syscall(SYS__sysctl, &args) == -1) return UV__ERR(errno); #else { (void) &args; return UV_ENOSYS; } #endif if (n != sizeof(uuid)) return UV_EIO; /* Can't happen. */ /* uuid[] is now a type 4 UUID. Bytes 6 and 8 (counting from zero) contain * 4 and 5 bits of entropy, respectively. For ease of use, we skip those * and only use 14 of the 16 bytes. */ uuid[6] = uuid[14]; uuid[8] = uuid[15]; n = pe - p; if (n > 14) n = 14; memcpy(p, uuid, n); p += n; } return 0; } ================================================ FILE: external/libuv/src/unix/signal.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include #ifndef SA_RESTART # define SA_RESTART 0 #endif typedef struct { uv_signal_t* handle; int signum; } uv__signal_msg_t; RB_HEAD(uv__signal_tree_s, uv_signal_s); static int uv__signal_unlock(void); static int uv__signal_start(uv_signal_t* handle, uv_signal_cb signal_cb, int signum, int oneshot); static void uv__signal_event(uv_loop_t* loop, uv__io_t* w, unsigned int events); static int uv__signal_compare(uv_signal_t* w1, uv_signal_t* w2); static void uv__signal_stop(uv_signal_t* handle); static void uv__signal_unregister_handler(int signum); static uv_once_t uv__signal_global_init_guard = UV_ONCE_INIT; static struct uv__signal_tree_s uv__signal_tree = RB_INITIALIZER(uv__signal_tree); static int uv__signal_lock_pipefd[2] = { -1, -1 }; RB_GENERATE_STATIC(uv__signal_tree_s, uv_signal_s, tree_entry, uv__signal_compare) static void uv__signal_global_reinit(void); static void uv__signal_global_init(void) { if (uv__signal_lock_pipefd[0] == -1) /* pthread_atfork can register before and after handlers, one * for each child. This only registers one for the child. That * state is both persistent and cumulative, so if we keep doing * it the handler functions will be called multiple times. Thus * we only want to do it once. */ if (pthread_atfork(NULL, NULL, &uv__signal_global_reinit)) abort(); uv__signal_global_reinit(); } void uv__signal_cleanup(void) { /* We can only use signal-safe functions here. * That includes read/write and close, fortunately. * We do all of this directly here instead of resetting * uv__signal_global_init_guard because * uv__signal_global_once_init is only called from uv_loop_init * and this needs to function in existing loops. */ if (uv__signal_lock_pipefd[0] != -1) { uv__close(uv__signal_lock_pipefd[0]); uv__signal_lock_pipefd[0] = -1; } if (uv__signal_lock_pipefd[1] != -1) { uv__close(uv__signal_lock_pipefd[1]); uv__signal_lock_pipefd[1] = -1; } } static void uv__signal_global_reinit(void) { uv__signal_cleanup(); if (uv__make_pipe(uv__signal_lock_pipefd, 0)) abort(); if (uv__signal_unlock()) abort(); } void uv__signal_global_once_init(void) { uv_once(&uv__signal_global_init_guard, uv__signal_global_init); } static int uv__signal_lock(void) { int r; char data; do { r = read(uv__signal_lock_pipefd[0], &data, sizeof data); } while (r < 0 && errno == EINTR); return (r < 0) ? -1 : 0; } static int uv__signal_unlock(void) { int r; char data = 42; do { r = write(uv__signal_lock_pipefd[1], &data, sizeof data); } while (r < 0 && errno == EINTR); return (r < 0) ? -1 : 0; } static void uv__signal_block_and_lock(sigset_t* saved_sigmask) { sigset_t new_mask; if (sigfillset(&new_mask)) abort(); if (pthread_sigmask(SIG_SETMASK, &new_mask, saved_sigmask)) abort(); if (uv__signal_lock()) abort(); } static void uv__signal_unlock_and_unblock(sigset_t* saved_sigmask) { if (uv__signal_unlock()) abort(); if (pthread_sigmask(SIG_SETMASK, saved_sigmask, NULL)) abort(); } static uv_signal_t* uv__signal_first_handle(int signum) { /* This function must be called with the signal lock held. */ uv_signal_t lookup; uv_signal_t* handle; lookup.signum = signum; lookup.flags = 0; lookup.loop = NULL; handle = RB_NFIND(uv__signal_tree_s, &uv__signal_tree, &lookup); if (handle != NULL && handle->signum == signum) return handle; return NULL; } static void uv__signal_handler(int signum) { uv__signal_msg_t msg; uv_signal_t* handle; int saved_errno; saved_errno = errno; memset(&msg, 0, sizeof msg); if (uv__signal_lock()) { errno = saved_errno; return; } for (handle = uv__signal_first_handle(signum); handle != NULL && handle->signum == signum; handle = RB_NEXT(uv__signal_tree_s, &uv__signal_tree, handle)) { int r; msg.signum = signum; msg.handle = handle; /* write() should be atomic for small data chunks, so the entire message * should be written at once. In theory the pipe could become full, in * which case the user is out of luck. */ do { r = write(handle->loop->signal_pipefd[1], &msg, sizeof msg); } while (r == -1 && errno == EINTR); assert(r == sizeof msg || (r == -1 && (errno == EAGAIN || errno == EWOULDBLOCK))); if (r != -1) handle->caught_signals++; } uv__signal_unlock(); errno = saved_errno; } static int uv__signal_register_handler(int signum, int oneshot) { /* When this function is called, the signal lock must be held. */ struct sigaction sa; /* XXX use a separate signal stack? */ memset(&sa, 0, sizeof(sa)); if (sigfillset(&sa.sa_mask)) abort(); sa.sa_handler = uv__signal_handler; sa.sa_flags = SA_RESTART; if (oneshot) sa.sa_flags |= SA_RESETHAND; /* XXX save old action so we can restore it later on? */ if (sigaction(signum, &sa, NULL)) return UV__ERR(errno); return 0; } static void uv__signal_unregister_handler(int signum) { /* When this function is called, the signal lock must be held. */ struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_handler = SIG_DFL; /* sigaction can only fail with EINVAL or EFAULT; an attempt to deregister a * signal implies that it was successfully registered earlier, so EINVAL * should never happen. */ if (sigaction(signum, &sa, NULL)) abort(); } static int uv__signal_loop_once_init(uv_loop_t* loop) { int err; /* Return if already initialized. */ if (loop->signal_pipefd[0] != -1) return 0; err = uv__make_pipe(loop->signal_pipefd, UV__F_NONBLOCK); if (err) return err; uv__io_init(&loop->signal_io_watcher, uv__signal_event, loop->signal_pipefd[0]); uv__io_start(loop, &loop->signal_io_watcher, POLLIN); return 0; } int uv__signal_loop_fork(uv_loop_t* loop) { uv__io_stop(loop, &loop->signal_io_watcher, POLLIN); uv__close(loop->signal_pipefd[0]); uv__close(loop->signal_pipefd[1]); loop->signal_pipefd[0] = -1; loop->signal_pipefd[1] = -1; return uv__signal_loop_once_init(loop); } void uv__signal_loop_cleanup(uv_loop_t* loop) { QUEUE* q; /* Stop all the signal watchers that are still attached to this loop. This * ensures that the (shared) signal tree doesn't contain any invalid entries * entries, and that signal handlers are removed when appropriate. * It's safe to use QUEUE_FOREACH here because the handles and the handle * queue are not modified by uv__signal_stop(). */ QUEUE_FOREACH(q, &loop->handle_queue) { uv_handle_t* handle = QUEUE_DATA(q, uv_handle_t, handle_queue); if (handle->type == UV_SIGNAL) uv__signal_stop((uv_signal_t*) handle); } if (loop->signal_pipefd[0] != -1) { uv__close(loop->signal_pipefd[0]); loop->signal_pipefd[0] = -1; } if (loop->signal_pipefd[1] != -1) { uv__close(loop->signal_pipefd[1]); loop->signal_pipefd[1] = -1; } } int uv_signal_init(uv_loop_t* loop, uv_signal_t* handle) { int err; err = uv__signal_loop_once_init(loop); if (err) return err; uv__handle_init(loop, (uv_handle_t*) handle, UV_SIGNAL); handle->signum = 0; handle->caught_signals = 0; handle->dispatched_signals = 0; return 0; } void uv__signal_close(uv_signal_t* handle) { uv__signal_stop(handle); } int uv_signal_start(uv_signal_t* handle, uv_signal_cb signal_cb, int signum) { return uv__signal_start(handle, signal_cb, signum, 0); } int uv_signal_start_oneshot(uv_signal_t* handle, uv_signal_cb signal_cb, int signum) { return uv__signal_start(handle, signal_cb, signum, 1); } static int uv__signal_start(uv_signal_t* handle, uv_signal_cb signal_cb, int signum, int oneshot) { sigset_t saved_sigmask; int err; uv_signal_t* first_handle; assert(!uv__is_closing(handle)); /* If the user supplies signum == 0, then return an error already. If the * signum is otherwise invalid then uv__signal_register will find out * eventually. */ if (signum == 0) return UV_EINVAL; /* Short circuit: if the signal watcher is already watching {signum} don't * go through the process of deregistering and registering the handler. * Additionally, this avoids pending signals getting lost in the small * time frame that handle->signum == 0. */ if (signum == handle->signum) { handle->signal_cb = signal_cb; return 0; } /* If the signal handler was already active, stop it first. */ if (handle->signum != 0) { uv__signal_stop(handle); } uv__signal_block_and_lock(&saved_sigmask); /* If at this point there are no active signal watchers for this signum (in * any of the loops), it's time to try and register a handler for it here. * Also in case there's only one-shot handlers and a regular handler comes in. */ first_handle = uv__signal_first_handle(signum); if (first_handle == NULL || (!oneshot && (first_handle->flags & UV_SIGNAL_ONE_SHOT))) { err = uv__signal_register_handler(signum, oneshot); if (err) { /* Registering the signal handler failed. Must be an invalid signal. */ uv__signal_unlock_and_unblock(&saved_sigmask); return err; } } handle->signum = signum; if (oneshot) handle->flags |= UV_SIGNAL_ONE_SHOT; RB_INSERT(uv__signal_tree_s, &uv__signal_tree, handle); uv__signal_unlock_and_unblock(&saved_sigmask); handle->signal_cb = signal_cb; uv__handle_start(handle); return 0; } static void uv__signal_event(uv_loop_t* loop, uv__io_t* w, unsigned int events) { uv__signal_msg_t* msg; uv_signal_t* handle; char buf[sizeof(uv__signal_msg_t) * 32]; size_t bytes, end, i; int r; bytes = 0; end = 0; do { r = read(loop->signal_pipefd[0], buf + bytes, sizeof(buf) - bytes); if (r == -1 && errno == EINTR) continue; if (r == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) { /* If there are bytes in the buffer already (which really is extremely * unlikely if possible at all) we can't exit the function here. We'll * spin until more bytes are read instead. */ if (bytes > 0) continue; /* Otherwise, there was nothing there. */ return; } /* Other errors really should never happen. */ if (r == -1) abort(); bytes += r; /* `end` is rounded down to a multiple of sizeof(uv__signal_msg_t). */ end = (bytes / sizeof(uv__signal_msg_t)) * sizeof(uv__signal_msg_t); for (i = 0; i < end; i += sizeof(uv__signal_msg_t)) { msg = (uv__signal_msg_t*) (buf + i); handle = msg->handle; if (msg->signum == handle->signum) { assert(!(handle->flags & UV_HANDLE_CLOSING)); handle->signal_cb(handle, handle->signum); } handle->dispatched_signals++; if (handle->flags & UV_SIGNAL_ONE_SHOT) uv__signal_stop(handle); } bytes -= end; /* If there are any "partial" messages left, move them to the start of the * the buffer, and spin. This should not happen. */ if (bytes) { memmove(buf, buf + end, bytes); continue; } } while (end == sizeof buf); } static int uv__signal_compare(uv_signal_t* w1, uv_signal_t* w2) { int f1; int f2; /* Compare signums first so all watchers with the same signnum end up * adjacent. */ if (w1->signum < w2->signum) return -1; if (w1->signum > w2->signum) return 1; /* Handlers without UV_SIGNAL_ONE_SHOT set will come first, so if the first * handler returned is a one-shot handler, the rest will be too. */ f1 = w1->flags & UV_SIGNAL_ONE_SHOT; f2 = w2->flags & UV_SIGNAL_ONE_SHOT; if (f1 < f2) return -1; if (f1 > f2) return 1; /* Sort by loop pointer, so we can easily look up the first item after * { .signum = x, .loop = NULL }. */ if (w1->loop < w2->loop) return -1; if (w1->loop > w2->loop) return 1; if (w1 < w2) return -1; if (w1 > w2) return 1; return 0; } int uv_signal_stop(uv_signal_t* handle) { assert(!uv__is_closing(handle)); uv__signal_stop(handle); return 0; } static void uv__signal_stop(uv_signal_t* handle) { uv_signal_t* removed_handle; sigset_t saved_sigmask; uv_signal_t* first_handle; int rem_oneshot; int first_oneshot; int ret; /* If the watcher wasn't started, this is a no-op. */ if (handle->signum == 0) return; uv__signal_block_and_lock(&saved_sigmask); removed_handle = RB_REMOVE(uv__signal_tree_s, &uv__signal_tree, handle); assert(removed_handle == handle); (void) removed_handle; /* Check if there are other active signal watchers observing this signal. If * not, unregister the signal handler. */ first_handle = uv__signal_first_handle(handle->signum); if (first_handle == NULL) { uv__signal_unregister_handler(handle->signum); } else { rem_oneshot = handle->flags & UV_SIGNAL_ONE_SHOT; first_oneshot = first_handle->flags & UV_SIGNAL_ONE_SHOT; if (first_oneshot && !rem_oneshot) { ret = uv__signal_register_handler(handle->signum, 1); assert(ret == 0); (void)ret; } } uv__signal_unlock_and_unblock(&saved_sigmask); handle->signum = 0; uv__handle_stop(handle); } ================================================ FILE: external/libuv/src/unix/spinlock.h ================================================ /* Copyright (c) 2013, Ben Noordhuis * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef UV_SPINLOCK_H_ #define UV_SPINLOCK_H_ #include "internal.h" /* ACCESS_ONCE, UV_UNUSED */ #include "atomic-ops.h" #define UV_SPINLOCK_INITIALIZER { 0 } typedef struct { int lock; } uv_spinlock_t; UV_UNUSED(static void uv_spinlock_init(uv_spinlock_t* spinlock)); UV_UNUSED(static void uv_spinlock_lock(uv_spinlock_t* spinlock)); UV_UNUSED(static void uv_spinlock_unlock(uv_spinlock_t* spinlock)); UV_UNUSED(static int uv_spinlock_trylock(uv_spinlock_t* spinlock)); UV_UNUSED(static void uv_spinlock_init(uv_spinlock_t* spinlock)) { ACCESS_ONCE(int, spinlock->lock) = 0; } UV_UNUSED(static void uv_spinlock_lock(uv_spinlock_t* spinlock)) { while (!uv_spinlock_trylock(spinlock)) cpu_relax(); } UV_UNUSED(static void uv_spinlock_unlock(uv_spinlock_t* spinlock)) { ACCESS_ONCE(int, spinlock->lock) = 0; } UV_UNUSED(static int uv_spinlock_trylock(uv_spinlock_t* spinlock)) { /* TODO(bnoordhuis) Maybe change to a ticket lock to guarantee fair queueing. * Not really critical until we have locks that are (frequently) contended * for by several threads. */ return 0 == cmpxchgi(&spinlock->lock, 0, 1); } #endif /* UV_SPINLOCK_H_ */ ================================================ FILE: external/libuv/src/unix/stream.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include #include #include #include #include #include /* IOV_MAX */ #if defined(__APPLE__) # include # include # include /* Forward declaration */ typedef struct uv__stream_select_s uv__stream_select_t; struct uv__stream_select_s { uv_stream_t* stream; uv_thread_t thread; uv_sem_t close_sem; uv_sem_t async_sem; uv_async_t async; int events; int fake_fd; int int_fd; int fd; fd_set* sread; size_t sread_sz; fd_set* swrite; size_t swrite_sz; }; /* Due to a possible kernel bug at least in OS X 10.10 "Yosemite", * EPROTOTYPE can be returned while trying to write to a socket that is * shutting down. If we retry the write, we should get the expected EPIPE * instead. */ # define RETRY_ON_WRITE_ERROR(errno) (errno == EINTR || errno == EPROTOTYPE) # define IS_TRANSIENT_WRITE_ERROR(errno, send_handle) \ (errno == EAGAIN || errno == EWOULDBLOCK || errno == ENOBUFS || \ (errno == EMSGSIZE && send_handle != NULL)) #else # define RETRY_ON_WRITE_ERROR(errno) (errno == EINTR) # define IS_TRANSIENT_WRITE_ERROR(errno, send_handle) \ (errno == EAGAIN || errno == EWOULDBLOCK || errno == ENOBUFS) #endif /* defined(__APPLE__) */ static void uv__stream_connect(uv_stream_t*); static void uv__write(uv_stream_t* stream); static void uv__read(uv_stream_t* stream); static void uv__stream_io(uv_loop_t* loop, uv__io_t* w, unsigned int events); static void uv__write_callbacks(uv_stream_t* stream); static size_t uv__write_req_size(uv_write_t* req); void uv__stream_init(uv_loop_t* loop, uv_stream_t* stream, uv_handle_type type) { int err; uv__handle_init(loop, (uv_handle_t*)stream, type); stream->read_cb = NULL; stream->alloc_cb = NULL; stream->close_cb = NULL; stream->connection_cb = NULL; stream->connect_req = NULL; stream->shutdown_req = NULL; stream->accepted_fd = -1; stream->queued_fds = NULL; stream->delayed_error = 0; QUEUE_INIT(&stream->write_queue); QUEUE_INIT(&stream->write_completed_queue); stream->write_queue_size = 0; if (loop->emfile_fd == -1) { err = uv__open_cloexec("/dev/null", O_RDONLY); if (err < 0) /* In the rare case that "/dev/null" isn't mounted open "/" * instead. */ err = uv__open_cloexec("/", O_RDONLY); if (err >= 0) loop->emfile_fd = err; } #if defined(__APPLE__) stream->select = NULL; #endif /* defined(__APPLE_) */ uv__io_init(&stream->io_watcher, uv__stream_io, -1); } static void uv__stream_osx_interrupt_select(uv_stream_t* stream) { #if defined(__APPLE__) /* Notify select() thread about state change */ uv__stream_select_t* s; int r; s = stream->select; if (s == NULL) return; /* Interrupt select() loop * NOTE: fake_fd and int_fd are socketpair(), thus writing to one will * emit read event on other side */ do r = write(s->fake_fd, "x", 1); while (r == -1 && errno == EINTR); assert(r == 1); #else /* !defined(__APPLE__) */ /* No-op on any other platform */ #endif /* !defined(__APPLE__) */ } #if defined(__APPLE__) static void uv__stream_osx_select(void* arg) { uv_stream_t* stream; uv__stream_select_t* s; char buf[1024]; int events; int fd; int r; int max_fd; stream = arg; s = stream->select; fd = s->fd; if (fd > s->int_fd) max_fd = fd; else max_fd = s->int_fd; while (1) { /* Terminate on semaphore */ if (uv_sem_trywait(&s->close_sem) == 0) break; /* Watch fd using select(2) */ memset(s->sread, 0, s->sread_sz); memset(s->swrite, 0, s->swrite_sz); if (uv__io_active(&stream->io_watcher, POLLIN)) FD_SET(fd, s->sread); if (uv__io_active(&stream->io_watcher, POLLOUT)) FD_SET(fd, s->swrite); FD_SET(s->int_fd, s->sread); /* Wait indefinitely for fd events */ r = select(max_fd + 1, s->sread, s->swrite, NULL, NULL); if (r == -1) { if (errno == EINTR) continue; /* XXX: Possible?! */ abort(); } /* Ignore timeouts */ if (r == 0) continue; /* Empty socketpair's buffer in case of interruption */ if (FD_ISSET(s->int_fd, s->sread)) while (1) { r = read(s->int_fd, buf, sizeof(buf)); if (r == sizeof(buf)) continue; if (r != -1) break; if (errno == EAGAIN || errno == EWOULDBLOCK) break; if (errno == EINTR) continue; abort(); } /* Handle events */ events = 0; if (FD_ISSET(fd, s->sread)) events |= POLLIN; if (FD_ISSET(fd, s->swrite)) events |= POLLOUT; assert(events != 0 || FD_ISSET(s->int_fd, s->sread)); if (events != 0) { ACCESS_ONCE(int, s->events) = events; uv_async_send(&s->async); uv_sem_wait(&s->async_sem); /* Should be processed at this stage */ assert((s->events == 0) || (stream->flags & UV_HANDLE_CLOSING)); } } } static void uv__stream_osx_select_cb(uv_async_t* handle) { uv__stream_select_t* s; uv_stream_t* stream; int events; s = container_of(handle, uv__stream_select_t, async); stream = s->stream; /* Get and reset stream's events */ events = s->events; ACCESS_ONCE(int, s->events) = 0; assert(events != 0); assert(events == (events & (POLLIN | POLLOUT))); /* Invoke callback on event-loop */ if ((events & POLLIN) && uv__io_active(&stream->io_watcher, POLLIN)) uv__stream_io(stream->loop, &stream->io_watcher, POLLIN); if ((events & POLLOUT) && uv__io_active(&stream->io_watcher, POLLOUT)) uv__stream_io(stream->loop, &stream->io_watcher, POLLOUT); if (stream->flags & UV_HANDLE_CLOSING) return; /* NOTE: It is important to do it here, otherwise `select()` might be called * before the actual `uv__read()`, leading to the blocking syscall */ uv_sem_post(&s->async_sem); } static void uv__stream_osx_cb_close(uv_handle_t* async) { uv__stream_select_t* s; s = container_of(async, uv__stream_select_t, async); uv__free(s); } int uv__stream_try_select(uv_stream_t* stream, int* fd) { /* * kqueue doesn't work with some files from /dev mount on osx. * select(2) in separate thread for those fds */ struct kevent filter[1]; struct kevent events[1]; struct timespec timeout; uv__stream_select_t* s; int fds[2]; int err; int ret; int kq; int old_fd; int max_fd; size_t sread_sz; size_t swrite_sz; kq = kqueue(); if (kq == -1) { perror("(libuv) kqueue()"); return UV__ERR(errno); } EV_SET(&filter[0], *fd, EVFILT_READ, EV_ADD | EV_ENABLE, 0, 0, 0); /* Use small timeout, because we only want to capture EINVALs */ timeout.tv_sec = 0; timeout.tv_nsec = 1; do ret = kevent(kq, filter, 1, events, 1, &timeout); while (ret == -1 && errno == EINTR); uv__close(kq); if (ret == -1) return UV__ERR(errno); if (ret == 0 || (events[0].flags & EV_ERROR) == 0 || events[0].data != EINVAL) return 0; /* At this point we definitely know that this fd won't work with kqueue */ /* * Create fds for io watcher and to interrupt the select() loop. * NOTE: do it ahead of malloc below to allocate enough space for fd_sets */ if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds)) return UV__ERR(errno); max_fd = *fd; if (fds[1] > max_fd) max_fd = fds[1]; sread_sz = ROUND_UP(max_fd + 1, sizeof(uint32_t) * NBBY) / NBBY; swrite_sz = sread_sz; s = uv__malloc(sizeof(*s) + sread_sz + swrite_sz); if (s == NULL) { err = UV_ENOMEM; goto failed_malloc; } s->events = 0; s->fd = *fd; s->sread = (fd_set*) ((char*) s + sizeof(*s)); s->sread_sz = sread_sz; s->swrite = (fd_set*) ((char*) s->sread + sread_sz); s->swrite_sz = swrite_sz; err = uv_async_init(stream->loop, &s->async, uv__stream_osx_select_cb); if (err) goto failed_async_init; s->async.flags |= UV_HANDLE_INTERNAL; uv__handle_unref(&s->async); err = uv_sem_init(&s->close_sem, 0); if (err != 0) goto failed_close_sem_init; err = uv_sem_init(&s->async_sem, 0); if (err != 0) goto failed_async_sem_init; s->fake_fd = fds[0]; s->int_fd = fds[1]; old_fd = *fd; s->stream = stream; stream->select = s; *fd = s->fake_fd; err = uv_thread_create(&s->thread, uv__stream_osx_select, stream); if (err != 0) goto failed_thread_create; return 0; failed_thread_create: s->stream = NULL; stream->select = NULL; *fd = old_fd; uv_sem_destroy(&s->async_sem); failed_async_sem_init: uv_sem_destroy(&s->close_sem); failed_close_sem_init: uv__close(fds[0]); uv__close(fds[1]); uv_close((uv_handle_t*) &s->async, uv__stream_osx_cb_close); return err; failed_async_init: uv__free(s); failed_malloc: uv__close(fds[0]); uv__close(fds[1]); return err; } #endif /* defined(__APPLE__) */ int uv__stream_open(uv_stream_t* stream, int fd, int flags) { #if defined(__APPLE__) int enable; #endif if (!(stream->io_watcher.fd == -1 || stream->io_watcher.fd == fd)) return UV_EBUSY; assert(fd >= 0); stream->flags |= flags; if (stream->type == UV_TCP) { if ((stream->flags & UV_HANDLE_TCP_NODELAY) && uv__tcp_nodelay(fd, 1)) return UV__ERR(errno); /* TODO Use delay the user passed in. */ if ((stream->flags & UV_HANDLE_TCP_KEEPALIVE) && uv__tcp_keepalive(fd, 1, 60)) { return UV__ERR(errno); } } #if defined(__APPLE__) enable = 1; if (setsockopt(fd, SOL_SOCKET, SO_OOBINLINE, &enable, sizeof(enable)) && errno != ENOTSOCK && errno != EINVAL) { return UV__ERR(errno); } #endif stream->io_watcher.fd = fd; return 0; } void uv__stream_flush_write_queue(uv_stream_t* stream, int error) { uv_write_t* req; QUEUE* q; while (!QUEUE_EMPTY(&stream->write_queue)) { q = QUEUE_HEAD(&stream->write_queue); QUEUE_REMOVE(q); req = QUEUE_DATA(q, uv_write_t, queue); req->error = error; QUEUE_INSERT_TAIL(&stream->write_completed_queue, &req->queue); } } void uv__stream_destroy(uv_stream_t* stream) { assert(!uv__io_active(&stream->io_watcher, POLLIN | POLLOUT)); assert(stream->flags & UV_HANDLE_CLOSED); if (stream->connect_req) { uv__req_unregister(stream->loop, stream->connect_req); stream->connect_req->cb(stream->connect_req, UV_ECANCELED); stream->connect_req = NULL; } uv__stream_flush_write_queue(stream, UV_ECANCELED); uv__write_callbacks(stream); if (stream->shutdown_req) { /* The ECANCELED error code is a lie, the shutdown(2) syscall is a * fait accompli at this point. Maybe we should revisit this in v0.11. * A possible reason for leaving it unchanged is that it informs the * callee that the handle has been destroyed. */ uv__req_unregister(stream->loop, stream->shutdown_req); stream->shutdown_req->cb(stream->shutdown_req, UV_ECANCELED); stream->shutdown_req = NULL; } assert(stream->write_queue_size == 0); } /* Implements a best effort approach to mitigating accept() EMFILE errors. * We have a spare file descriptor stashed away that we close to get below * the EMFILE limit. Next, we accept all pending connections and close them * immediately to signal the clients that we're overloaded - and we are, but * we still keep on trucking. * * There is one caveat: it's not reliable in a multi-threaded environment. * The file descriptor limit is per process. Our party trick fails if another * thread opens a file or creates a socket in the time window between us * calling close() and accept(). */ static int uv__emfile_trick(uv_loop_t* loop, int accept_fd) { int err; int emfile_fd; if (loop->emfile_fd == -1) return UV_EMFILE; uv__close(loop->emfile_fd); loop->emfile_fd = -1; do { err = uv__accept(accept_fd); if (err >= 0) uv__close(err); } while (err >= 0 || err == UV_EINTR); emfile_fd = uv__open_cloexec("/", O_RDONLY); if (emfile_fd >= 0) loop->emfile_fd = emfile_fd; return err; } #if defined(UV_HAVE_KQUEUE) # define UV_DEC_BACKLOG(w) w->rcount--; #else # define UV_DEC_BACKLOG(w) /* no-op */ #endif /* defined(UV_HAVE_KQUEUE) */ void uv__server_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) { uv_stream_t* stream; int err; stream = container_of(w, uv_stream_t, io_watcher); assert(events & POLLIN); assert(stream->accepted_fd == -1); assert(!(stream->flags & UV_HANDLE_CLOSING)); uv__io_start(stream->loop, &stream->io_watcher, POLLIN); /* connection_cb can close the server socket while we're * in the loop so check it on each iteration. */ while (uv__stream_fd(stream) != -1) { assert(stream->accepted_fd == -1); #if defined(UV_HAVE_KQUEUE) if (w->rcount <= 0) return; #endif /* defined(UV_HAVE_KQUEUE) */ err = uv__accept(uv__stream_fd(stream)); if (err < 0) { if (err == UV_EAGAIN || err == UV__ERR(EWOULDBLOCK)) return; /* Not an error. */ if (err == UV_ECONNABORTED) continue; /* Ignore. Nothing we can do about that. */ if (err == UV_EMFILE || err == UV_ENFILE) { err = uv__emfile_trick(loop, uv__stream_fd(stream)); if (err == UV_EAGAIN || err == UV__ERR(EWOULDBLOCK)) break; } stream->connection_cb(stream, err); continue; } UV_DEC_BACKLOG(w) stream->accepted_fd = err; stream->connection_cb(stream, 0); if (stream->accepted_fd != -1) { /* The user hasn't yet accepted called uv_accept() */ uv__io_stop(loop, &stream->io_watcher, POLLIN); return; } if (stream->type == UV_TCP && (stream->flags & UV_HANDLE_TCP_SINGLE_ACCEPT)) { /* Give other processes a chance to accept connections. */ struct timespec timeout = { 0, 1 }; nanosleep(&timeout, NULL); } } } #undef UV_DEC_BACKLOG int uv_accept(uv_stream_t* server, uv_stream_t* client) { int err; assert(server->loop == client->loop); if (server->accepted_fd == -1) return UV_EAGAIN; switch (client->type) { case UV_NAMED_PIPE: case UV_TCP: err = uv__stream_open(client, server->accepted_fd, UV_HANDLE_READABLE | UV_HANDLE_WRITABLE); if (err) { /* TODO handle error */ uv__close(server->accepted_fd); goto done; } break; case UV_UDP: err = uv_udp_open((uv_udp_t*) client, server->accepted_fd); if (err) { uv__close(server->accepted_fd); goto done; } break; default: return UV_EINVAL; } client->flags |= UV_HANDLE_BOUND; done: /* Process queued fds */ if (server->queued_fds != NULL) { uv__stream_queued_fds_t* queued_fds; queued_fds = server->queued_fds; /* Read first */ server->accepted_fd = queued_fds->fds[0]; /* All read, free */ assert(queued_fds->offset > 0); if (--queued_fds->offset == 0) { uv__free(queued_fds); server->queued_fds = NULL; } else { /* Shift rest */ memmove(queued_fds->fds, queued_fds->fds + 1, queued_fds->offset * sizeof(*queued_fds->fds)); } } else { server->accepted_fd = -1; if (err == 0) uv__io_start(server->loop, &server->io_watcher, POLLIN); } return err; } int uv_listen(uv_stream_t* stream, int backlog, uv_connection_cb cb) { int err; switch (stream->type) { case UV_TCP: err = uv_tcp_listen((uv_tcp_t*)stream, backlog, cb); break; case UV_NAMED_PIPE: err = uv_pipe_listen((uv_pipe_t*)stream, backlog, cb); break; default: err = UV_EINVAL; } if (err == 0) uv__handle_start(stream); return err; } static void uv__drain(uv_stream_t* stream) { uv_shutdown_t* req; int err; assert(QUEUE_EMPTY(&stream->write_queue)); uv__io_stop(stream->loop, &stream->io_watcher, POLLOUT); uv__stream_osx_interrupt_select(stream); /* Shutdown? */ if ((stream->flags & UV_HANDLE_SHUTTING) && !(stream->flags & UV_HANDLE_CLOSING) && !(stream->flags & UV_HANDLE_SHUT)) { assert(stream->shutdown_req); req = stream->shutdown_req; stream->shutdown_req = NULL; stream->flags &= ~UV_HANDLE_SHUTTING; uv__req_unregister(stream->loop, req); err = 0; if (shutdown(uv__stream_fd(stream), SHUT_WR)) err = UV__ERR(errno); if (err == 0) stream->flags |= UV_HANDLE_SHUT; if (req->cb != NULL) req->cb(req, err); } } static ssize_t uv__writev(int fd, struct iovec* vec, size_t n) { if (n == 1) return write(fd, vec->iov_base, vec->iov_len); else return writev(fd, vec, n); } static size_t uv__write_req_size(uv_write_t* req) { size_t size; assert(req->bufs != NULL); size = uv__count_bufs(req->bufs + req->write_index, req->nbufs - req->write_index); assert(req->handle->write_queue_size >= size); return size; } /* Returns 1 if all write request data has been written, or 0 if there is still * more data to write. * * Note: the return value only says something about the *current* request. * There may still be other write requests sitting in the queue. */ static int uv__write_req_update(uv_stream_t* stream, uv_write_t* req, size_t n) { uv_buf_t* buf; size_t len; assert(n <= stream->write_queue_size); stream->write_queue_size -= n; buf = req->bufs + req->write_index; do { len = n < buf->len ? n : buf->len; buf->base += len; buf->len -= len; buf += (buf->len == 0); /* Advance to next buffer if this one is empty. */ n -= len; } while (n > 0); req->write_index = buf - req->bufs; return req->write_index == req->nbufs; } static void uv__write_req_finish(uv_write_t* req) { uv_stream_t* stream = req->handle; /* Pop the req off tcp->write_queue. */ QUEUE_REMOVE(&req->queue); /* Only free when there was no error. On error, we touch up write_queue_size * right before making the callback. The reason we don't do that right away * is that a write_queue_size > 0 is our only way to signal to the user that * they should stop writing - which they should if we got an error. Something * to revisit in future revisions of the libuv API. */ if (req->error == 0) { if (req->bufs != req->bufsml) uv__free(req->bufs); req->bufs = NULL; } /* Add it to the write_completed_queue where it will have its * callback called in the near future. */ QUEUE_INSERT_TAIL(&stream->write_completed_queue, &req->queue); uv__io_feed(stream->loop, &stream->io_watcher); } static int uv__handle_fd(uv_handle_t* handle) { switch (handle->type) { case UV_NAMED_PIPE: case UV_TCP: return ((uv_stream_t*) handle)->io_watcher.fd; case UV_UDP: return ((uv_udp_t*) handle)->io_watcher.fd; default: return -1; } } static void uv__write(uv_stream_t* stream) { struct iovec* iov; QUEUE* q; uv_write_t* req; int iovmax; int iovcnt; ssize_t n; int err; start: assert(uv__stream_fd(stream) >= 0); if (QUEUE_EMPTY(&stream->write_queue)) return; q = QUEUE_HEAD(&stream->write_queue); req = QUEUE_DATA(q, uv_write_t, queue); assert(req->handle == stream); /* * Cast to iovec. We had to have our own uv_buf_t instead of iovec * because Windows's WSABUF is not an iovec. */ assert(sizeof(uv_buf_t) == sizeof(struct iovec)); iov = (struct iovec*) &(req->bufs[req->write_index]); iovcnt = req->nbufs - req->write_index; iovmax = uv__getiovmax(); /* Limit iov count to avoid EINVALs from writev() */ if (iovcnt > iovmax) iovcnt = iovmax; /* * Now do the actual writev. Note that we've been updating the pointers * inside the iov each time we write. So there is no need to offset it. */ if (req->send_handle) { int fd_to_send; struct msghdr msg; struct cmsghdr *cmsg; union { char data[64]; struct cmsghdr alias; } scratch; if (uv__is_closing(req->send_handle)) { err = UV_EBADF; goto error; } fd_to_send = uv__handle_fd((uv_handle_t*) req->send_handle); memset(&scratch, 0, sizeof(scratch)); assert(fd_to_send >= 0); msg.msg_name = NULL; msg.msg_namelen = 0; msg.msg_iov = iov; msg.msg_iovlen = iovcnt; msg.msg_flags = 0; msg.msg_control = &scratch.alias; msg.msg_controllen = CMSG_SPACE(sizeof(fd_to_send)); cmsg = CMSG_FIRSTHDR(&msg); cmsg->cmsg_level = SOL_SOCKET; cmsg->cmsg_type = SCM_RIGHTS; cmsg->cmsg_len = CMSG_LEN(sizeof(fd_to_send)); /* silence aliasing warning */ { void* pv = CMSG_DATA(cmsg); int* pi = pv; *pi = fd_to_send; } do n = sendmsg(uv__stream_fd(stream), &msg, 0); while (n == -1 && RETRY_ON_WRITE_ERROR(errno)); /* Ensure the handle isn't sent again in case this is a partial write. */ if (n >= 0) req->send_handle = NULL; } else { do n = uv__writev(uv__stream_fd(stream), iov, iovcnt); while (n == -1 && RETRY_ON_WRITE_ERROR(errno)); } if (n == -1 && !IS_TRANSIENT_WRITE_ERROR(errno, req->send_handle)) { err = UV__ERR(errno); goto error; } if (n >= 0 && uv__write_req_update(stream, req, n)) { uv__write_req_finish(req); return; /* TODO(bnoordhuis) Start trying to write the next request. */ } /* If this is a blocking stream, try again. */ if (stream->flags & UV_HANDLE_BLOCKING_WRITES) goto start; /* We're not done. */ uv__io_start(stream->loop, &stream->io_watcher, POLLOUT); /* Notify select() thread about state change */ uv__stream_osx_interrupt_select(stream); return; error: req->error = err; uv__write_req_finish(req); uv__io_stop(stream->loop, &stream->io_watcher, POLLOUT); if (!uv__io_active(&stream->io_watcher, POLLIN)) uv__handle_stop(stream); uv__stream_osx_interrupt_select(stream); } static void uv__write_callbacks(uv_stream_t* stream) { uv_write_t* req; QUEUE* q; QUEUE pq; if (QUEUE_EMPTY(&stream->write_completed_queue)) return; QUEUE_MOVE(&stream->write_completed_queue, &pq); while (!QUEUE_EMPTY(&pq)) { /* Pop a req off write_completed_queue. */ q = QUEUE_HEAD(&pq); req = QUEUE_DATA(q, uv_write_t, queue); QUEUE_REMOVE(q); uv__req_unregister(stream->loop, req); if (req->bufs != NULL) { stream->write_queue_size -= uv__write_req_size(req); if (req->bufs != req->bufsml) uv__free(req->bufs); req->bufs = NULL; } /* NOTE: call callback AFTER freeing the request data. */ if (req->cb) req->cb(req, req->error); } } uv_handle_type uv__handle_type(int fd) { struct sockaddr_storage ss; socklen_t sslen; socklen_t len; int type; memset(&ss, 0, sizeof(ss)); sslen = sizeof(ss); if (getsockname(fd, (struct sockaddr*)&ss, &sslen)) return UV_UNKNOWN_HANDLE; len = sizeof type; if (getsockopt(fd, SOL_SOCKET, SO_TYPE, &type, &len)) return UV_UNKNOWN_HANDLE; if (type == SOCK_STREAM) { #if defined(_AIX) || defined(__DragonFly__) /* on AIX/DragonFly the getsockname call returns an empty sa structure * for sockets of type AF_UNIX. For all other types it will * return a properly filled in structure. */ if (sslen == 0) return UV_NAMED_PIPE; #endif switch (ss.ss_family) { case AF_UNIX: return UV_NAMED_PIPE; case AF_INET: case AF_INET6: return UV_TCP; } } if (type == SOCK_DGRAM && (ss.ss_family == AF_INET || ss.ss_family == AF_INET6)) return UV_UDP; return UV_UNKNOWN_HANDLE; } static void uv__stream_eof(uv_stream_t* stream, const uv_buf_t* buf) { stream->flags |= UV_HANDLE_READ_EOF; stream->flags &= ~UV_HANDLE_READING; uv__io_stop(stream->loop, &stream->io_watcher, POLLIN); if (!uv__io_active(&stream->io_watcher, POLLOUT)) uv__handle_stop(stream); uv__stream_osx_interrupt_select(stream); stream->read_cb(stream, UV_EOF, buf); } static int uv__stream_queue_fd(uv_stream_t* stream, int fd) { uv__stream_queued_fds_t* queued_fds; unsigned int queue_size; queued_fds = stream->queued_fds; if (queued_fds == NULL) { queue_size = 8; queued_fds = uv__malloc((queue_size - 1) * sizeof(*queued_fds->fds) + sizeof(*queued_fds)); if (queued_fds == NULL) return UV_ENOMEM; queued_fds->size = queue_size; queued_fds->offset = 0; stream->queued_fds = queued_fds; /* Grow */ } else if (queued_fds->size == queued_fds->offset) { queue_size = queued_fds->size + 8; queued_fds = uv__realloc(queued_fds, (queue_size - 1) * sizeof(*queued_fds->fds) + sizeof(*queued_fds)); /* * Allocation failure, report back. * NOTE: if it is fatal - sockets will be closed in uv__stream_close */ if (queued_fds == NULL) return UV_ENOMEM; queued_fds->size = queue_size; stream->queued_fds = queued_fds; } /* Put fd in a queue */ queued_fds->fds[queued_fds->offset++] = fd; return 0; } #if defined(__PASE__) /* on IBMi PASE the control message length can not exceed 256. */ # define UV__CMSG_FD_COUNT 60 #else # define UV__CMSG_FD_COUNT 64 #endif #define UV__CMSG_FD_SIZE (UV__CMSG_FD_COUNT * sizeof(int)) static int uv__stream_recv_cmsg(uv_stream_t* stream, struct msghdr* msg) { struct cmsghdr* cmsg; for (cmsg = CMSG_FIRSTHDR(msg); cmsg != NULL; cmsg = CMSG_NXTHDR(msg, cmsg)) { char* start; char* end; int err; void* pv; int* pi; unsigned int i; unsigned int count; if (cmsg->cmsg_type != SCM_RIGHTS) { fprintf(stderr, "ignoring non-SCM_RIGHTS ancillary data: %d\n", cmsg->cmsg_type); continue; } /* silence aliasing warning */ pv = CMSG_DATA(cmsg); pi = pv; /* Count available fds */ start = (char*) cmsg; end = (char*) cmsg + cmsg->cmsg_len; count = 0; while (start + CMSG_LEN(count * sizeof(*pi)) < end) count++; assert(start + CMSG_LEN(count * sizeof(*pi)) == end); for (i = 0; i < count; i++) { /* Already has accepted fd, queue now */ if (stream->accepted_fd != -1) { err = uv__stream_queue_fd(stream, pi[i]); if (err != 0) { /* Close rest */ for (; i < count; i++) uv__close(pi[i]); return err; } } else { stream->accepted_fd = pi[i]; } } } return 0; } #ifdef __clang__ # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wgnu-folding-constant" # pragma clang diagnostic ignored "-Wvla-extension" #endif static void uv__read(uv_stream_t* stream) { uv_buf_t buf; ssize_t nread; struct msghdr msg; char cmsg_space[CMSG_SPACE(UV__CMSG_FD_SIZE)]; int count; int err; int is_ipc; stream->flags &= ~UV_HANDLE_READ_PARTIAL; /* Prevent loop starvation when the data comes in as fast as (or faster than) * we can read it. XXX Need to rearm fd if we switch to edge-triggered I/O. */ count = 32; is_ipc = stream->type == UV_NAMED_PIPE && ((uv_pipe_t*) stream)->ipc; /* XXX: Maybe instead of having UV_HANDLE_READING we just test if * tcp->read_cb is NULL or not? */ while (stream->read_cb && (stream->flags & UV_HANDLE_READING) && (count-- > 0)) { assert(stream->alloc_cb != NULL); buf = uv_buf_init(NULL, 0); stream->alloc_cb((uv_handle_t*)stream, 64 * 1024, &buf); if (buf.base == NULL || buf.len == 0) { /* User indicates it can't or won't handle the read. */ stream->read_cb(stream, UV_ENOBUFS, &buf); return; } assert(buf.base != NULL); assert(uv__stream_fd(stream) >= 0); if (!is_ipc) { do { nread = read(uv__stream_fd(stream), buf.base, buf.len); } while (nread < 0 && errno == EINTR); } else { /* ipc uses recvmsg */ msg.msg_flags = 0; msg.msg_iov = (struct iovec*) &buf; msg.msg_iovlen = 1; msg.msg_name = NULL; msg.msg_namelen = 0; /* Set up to receive a descriptor even if one isn't in the message */ msg.msg_controllen = sizeof(cmsg_space); msg.msg_control = cmsg_space; do { nread = uv__recvmsg(uv__stream_fd(stream), &msg, 0); } while (nread < 0 && errno == EINTR); } if (nread < 0) { /* Error */ if (errno == EAGAIN || errno == EWOULDBLOCK) { /* Wait for the next one. */ if (stream->flags & UV_HANDLE_READING) { uv__io_start(stream->loop, &stream->io_watcher, POLLIN); uv__stream_osx_interrupt_select(stream); } stream->read_cb(stream, 0, &buf); #if defined(__CYGWIN__) || defined(__MSYS__) } else if (errno == ECONNRESET && stream->type == UV_NAMED_PIPE) { uv__stream_eof(stream, &buf); return; #endif } else { /* Error. User should call uv_close(). */ stream->read_cb(stream, UV__ERR(errno), &buf); if (stream->flags & UV_HANDLE_READING) { stream->flags &= ~UV_HANDLE_READING; uv__io_stop(stream->loop, &stream->io_watcher, POLLIN); if (!uv__io_active(&stream->io_watcher, POLLOUT)) uv__handle_stop(stream); uv__stream_osx_interrupt_select(stream); } } return; } else if (nread == 0) { uv__stream_eof(stream, &buf); return; } else { /* Successful read */ ssize_t buflen = buf.len; if (is_ipc) { err = uv__stream_recv_cmsg(stream, &msg); if (err != 0) { stream->read_cb(stream, err, &buf); return; } } #if defined(__MVS__) if (is_ipc && msg.msg_controllen > 0) { uv_buf_t blankbuf; int nread; struct iovec *old; blankbuf.base = 0; blankbuf.len = 0; old = msg.msg_iov; msg.msg_iov = (struct iovec*) &blankbuf; nread = 0; do { nread = uv__recvmsg(uv__stream_fd(stream), &msg, 0); err = uv__stream_recv_cmsg(stream, &msg); if (err != 0) { stream->read_cb(stream, err, &buf); msg.msg_iov = old; return; } } while (nread == 0 && msg.msg_controllen > 0); msg.msg_iov = old; } #endif stream->read_cb(stream, nread, &buf); /* Return if we didn't fill the buffer, there is no more data to read. */ if (nread < buflen) { stream->flags |= UV_HANDLE_READ_PARTIAL; return; } } } } #ifdef __clang__ # pragma clang diagnostic pop #endif #undef UV__CMSG_FD_COUNT #undef UV__CMSG_FD_SIZE int uv_shutdown(uv_shutdown_t* req, uv_stream_t* stream, uv_shutdown_cb cb) { assert(stream->type == UV_TCP || stream->type == UV_TTY || stream->type == UV_NAMED_PIPE); if (!(stream->flags & UV_HANDLE_WRITABLE) || stream->flags & UV_HANDLE_SHUT || stream->flags & UV_HANDLE_SHUTTING || uv__is_closing(stream)) { return UV_ENOTCONN; } assert(uv__stream_fd(stream) >= 0); /* Initialize request */ uv__req_init(stream->loop, req, UV_SHUTDOWN); req->handle = stream; req->cb = cb; stream->shutdown_req = req; stream->flags |= UV_HANDLE_SHUTTING; uv__io_start(stream->loop, &stream->io_watcher, POLLOUT); uv__stream_osx_interrupt_select(stream); return 0; } static void uv__stream_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) { uv_stream_t* stream; stream = container_of(w, uv_stream_t, io_watcher); assert(stream->type == UV_TCP || stream->type == UV_NAMED_PIPE || stream->type == UV_TTY); assert(!(stream->flags & UV_HANDLE_CLOSING)); if (stream->connect_req) { uv__stream_connect(stream); return; } assert(uv__stream_fd(stream) >= 0); /* Ignore POLLHUP here. Even if it's set, there may still be data to read. */ if (events & (POLLIN | POLLERR | POLLHUP)) uv__read(stream); if (uv__stream_fd(stream) == -1) return; /* read_cb closed stream. */ /* Short-circuit iff POLLHUP is set, the user is still interested in read * events and uv__read() reported a partial read but not EOF. If the EOF * flag is set, uv__read() called read_cb with err=UV_EOF and we don't * have to do anything. If the partial read flag is not set, we can't * report the EOF yet because there is still data to read. */ if ((events & POLLHUP) && (stream->flags & UV_HANDLE_READING) && (stream->flags & UV_HANDLE_READ_PARTIAL) && !(stream->flags & UV_HANDLE_READ_EOF)) { uv_buf_t buf = { NULL, 0 }; uv__stream_eof(stream, &buf); } if (uv__stream_fd(stream) == -1) return; /* read_cb closed stream. */ if (events & (POLLOUT | POLLERR | POLLHUP)) { uv__write(stream); uv__write_callbacks(stream); /* Write queue drained. */ if (QUEUE_EMPTY(&stream->write_queue)) uv__drain(stream); } } /** * We get called here from directly following a call to connect(2). * In order to determine if we've errored out or succeeded must call * getsockopt. */ static void uv__stream_connect(uv_stream_t* stream) { int error; uv_connect_t* req = stream->connect_req; socklen_t errorsize = sizeof(int); assert(stream->type == UV_TCP || stream->type == UV_NAMED_PIPE); assert(req); if (stream->delayed_error) { /* To smooth over the differences between unixes errors that * were reported synchronously on the first connect can be delayed * until the next tick--which is now. */ error = stream->delayed_error; stream->delayed_error = 0; } else { /* Normal situation: we need to get the socket error from the kernel. */ assert(uv__stream_fd(stream) >= 0); getsockopt(uv__stream_fd(stream), SOL_SOCKET, SO_ERROR, &error, &errorsize); error = UV__ERR(error); } if (error == UV__ERR(EINPROGRESS)) return; stream->connect_req = NULL; uv__req_unregister(stream->loop, req); if (error < 0 || QUEUE_EMPTY(&stream->write_queue)) { uv__io_stop(stream->loop, &stream->io_watcher, POLLOUT); } if (req->cb) req->cb(req, error); if (uv__stream_fd(stream) == -1) return; if (error < 0) { uv__stream_flush_write_queue(stream, UV_ECANCELED); uv__write_callbacks(stream); } } int uv_write2(uv_write_t* req, uv_stream_t* stream, const uv_buf_t bufs[], unsigned int nbufs, uv_stream_t* send_handle, uv_write_cb cb) { int empty_queue; assert(nbufs > 0); assert((stream->type == UV_TCP || stream->type == UV_NAMED_PIPE || stream->type == UV_TTY) && "uv_write (unix) does not yet support other types of streams"); if (uv__stream_fd(stream) < 0) return UV_EBADF; if (!(stream->flags & UV_HANDLE_WRITABLE)) return UV_EPIPE; if (send_handle) { if (stream->type != UV_NAMED_PIPE || !((uv_pipe_t*)stream)->ipc) return UV_EINVAL; /* XXX We abuse uv_write2() to send over UDP handles to child processes. * Don't call uv__stream_fd() on those handles, it's a macro that on OS X * evaluates to a function that operates on a uv_stream_t with a couple of * OS X specific fields. On other Unices it does (handle)->io_watcher.fd, * which works but only by accident. */ if (uv__handle_fd((uv_handle_t*) send_handle) < 0) return UV_EBADF; #if defined(__CYGWIN__) || defined(__MSYS__) /* Cygwin recvmsg always sets msg_controllen to zero, so we cannot send it. See https://github.com/mirror/newlib-cygwin/blob/86fc4bf0/winsup/cygwin/fhandler_socket.cc#L1736-L1743 */ return UV_ENOSYS; #endif } /* It's legal for write_queue_size > 0 even when the write_queue is empty; * it means there are error-state requests in the write_completed_queue that * will touch up write_queue_size later, see also uv__write_req_finish(). * We could check that write_queue is empty instead but that implies making * a write() syscall when we know that the handle is in error mode. */ empty_queue = (stream->write_queue_size == 0); /* Initialize the req */ uv__req_init(stream->loop, req, UV_WRITE); req->cb = cb; req->handle = stream; req->error = 0; req->send_handle = send_handle; QUEUE_INIT(&req->queue); req->bufs = req->bufsml; if (nbufs > ARRAY_SIZE(req->bufsml)) req->bufs = uv__malloc(nbufs * sizeof(bufs[0])); if (req->bufs == NULL) return UV_ENOMEM; memcpy(req->bufs, bufs, nbufs * sizeof(bufs[0])); req->nbufs = nbufs; req->write_index = 0; stream->write_queue_size += uv__count_bufs(bufs, nbufs); /* Append the request to write_queue. */ QUEUE_INSERT_TAIL(&stream->write_queue, &req->queue); /* If the queue was empty when this function began, we should attempt to * do the write immediately. Otherwise start the write_watcher and wait * for the fd to become writable. */ if (stream->connect_req) { /* Still connecting, do nothing. */ } else if (empty_queue) { uv__write(stream); } else { /* * blocking streams should never have anything in the queue. * if this assert fires then somehow the blocking stream isn't being * sufficiently flushed in uv__write. */ assert(!(stream->flags & UV_HANDLE_BLOCKING_WRITES)); uv__io_start(stream->loop, &stream->io_watcher, POLLOUT); uv__stream_osx_interrupt_select(stream); } return 0; } /* The buffers to be written must remain valid until the callback is called. * This is not required for the uv_buf_t array. */ int uv_write(uv_write_t* req, uv_stream_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb) { return uv_write2(req, handle, bufs, nbufs, NULL, cb); } void uv_try_write_cb(uv_write_t* req, int status) { /* Should not be called */ abort(); } int uv_try_write(uv_stream_t* stream, const uv_buf_t bufs[], unsigned int nbufs) { int r; int has_pollout; size_t written; size_t req_size; uv_write_t req; /* Connecting or already writing some data */ if (stream->connect_req != NULL || stream->write_queue_size != 0) return UV_EAGAIN; has_pollout = uv__io_active(&stream->io_watcher, POLLOUT); r = uv_write(&req, stream, bufs, nbufs, uv_try_write_cb); if (r != 0) return r; /* Remove not written bytes from write queue size */ written = uv__count_bufs(bufs, nbufs); if (req.bufs != NULL) req_size = uv__write_req_size(&req); else req_size = 0; written -= req_size; stream->write_queue_size -= req_size; /* Unqueue request, regardless of immediateness */ QUEUE_REMOVE(&req.queue); uv__req_unregister(stream->loop, &req); if (req.bufs != req.bufsml) uv__free(req.bufs); req.bufs = NULL; /* Do not poll for writable, if we wasn't before calling this */ if (!has_pollout) { uv__io_stop(stream->loop, &stream->io_watcher, POLLOUT); uv__stream_osx_interrupt_select(stream); } if (written == 0 && req_size != 0) return req.error < 0 ? req.error : UV_EAGAIN; else return written; } int uv_read_start(uv_stream_t* stream, uv_alloc_cb alloc_cb, uv_read_cb read_cb) { assert(stream->type == UV_TCP || stream->type == UV_NAMED_PIPE || stream->type == UV_TTY); if (stream->flags & UV_HANDLE_CLOSING) return UV_EINVAL; if (!(stream->flags & UV_HANDLE_READABLE)) return UV_ENOTCONN; /* The UV_HANDLE_READING flag is irrelevant of the state of the tcp - it just * expresses the desired state of the user. */ stream->flags |= UV_HANDLE_READING; /* TODO: try to do the read inline? */ /* TODO: keep track of tcp state. If we've gotten a EOF then we should * not start the IO watcher. */ assert(uv__stream_fd(stream) >= 0); assert(alloc_cb); stream->read_cb = read_cb; stream->alloc_cb = alloc_cb; uv__io_start(stream->loop, &stream->io_watcher, POLLIN); uv__handle_start(stream); uv__stream_osx_interrupt_select(stream); return 0; } int uv_read_stop(uv_stream_t* stream) { if (!(stream->flags & UV_HANDLE_READING)) return 0; stream->flags &= ~UV_HANDLE_READING; uv__io_stop(stream->loop, &stream->io_watcher, POLLIN); if (!uv__io_active(&stream->io_watcher, POLLOUT)) uv__handle_stop(stream); uv__stream_osx_interrupt_select(stream); stream->read_cb = NULL; stream->alloc_cb = NULL; return 0; } int uv_is_readable(const uv_stream_t* stream) { return !!(stream->flags & UV_HANDLE_READABLE); } int uv_is_writable(const uv_stream_t* stream) { return !!(stream->flags & UV_HANDLE_WRITABLE); } #if defined(__APPLE__) int uv___stream_fd(const uv_stream_t* handle) { const uv__stream_select_t* s; assert(handle->type == UV_TCP || handle->type == UV_TTY || handle->type == UV_NAMED_PIPE); s = handle->select; if (s != NULL) return s->fd; return handle->io_watcher.fd; } #endif /* defined(__APPLE__) */ void uv__stream_close(uv_stream_t* handle) { unsigned int i; uv__stream_queued_fds_t* queued_fds; #if defined(__APPLE__) /* Terminate select loop first */ if (handle->select != NULL) { uv__stream_select_t* s; s = handle->select; uv_sem_post(&s->close_sem); uv_sem_post(&s->async_sem); uv__stream_osx_interrupt_select(handle); uv_thread_join(&s->thread); uv_sem_destroy(&s->close_sem); uv_sem_destroy(&s->async_sem); uv__close(s->fake_fd); uv__close(s->int_fd); uv_close((uv_handle_t*) &s->async, uv__stream_osx_cb_close); handle->select = NULL; } #endif /* defined(__APPLE__) */ uv__io_close(handle->loop, &handle->io_watcher); uv_read_stop(handle); uv__handle_stop(handle); handle->flags &= ~(UV_HANDLE_READABLE | UV_HANDLE_WRITABLE); if (handle->io_watcher.fd != -1) { /* Don't close stdio file descriptors. Nothing good comes from it. */ if (handle->io_watcher.fd > STDERR_FILENO) uv__close(handle->io_watcher.fd); handle->io_watcher.fd = -1; } if (handle->accepted_fd != -1) { uv__close(handle->accepted_fd); handle->accepted_fd = -1; } /* Close all queued fds */ if (handle->queued_fds != NULL) { queued_fds = handle->queued_fds; for (i = 0; i < queued_fds->offset; i++) uv__close(queued_fds->fds[i]); uv__free(handle->queued_fds); handle->queued_fds = NULL; } assert(!uv__io_active(&handle->io_watcher, POLLIN | POLLOUT)); } int uv_stream_set_blocking(uv_stream_t* handle, int blocking) { /* Don't need to check the file descriptor, uv__nonblock() * will fail with EBADF if it's not valid. */ return uv__nonblock(uv__stream_fd(handle), !blocking); } ================================================ FILE: external/libuv/src/unix/sunos.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include #ifndef SUNOS_NO_IFADDRS # include #endif #include #include #include #include #include #include #include #include #include #include #include #define PORT_FIRED 0x69 #define PORT_UNUSED 0x0 #define PORT_LOADED 0x99 #define PORT_DELETED -1 #if (!defined(_LP64)) && (_FILE_OFFSET_BITS - 0 == 64) #define PROCFS_FILE_OFFSET_BITS_HACK 1 #undef _FILE_OFFSET_BITS #else #define PROCFS_FILE_OFFSET_BITS_HACK 0 #endif #include #if (PROCFS_FILE_OFFSET_BITS_HACK - 0 == 1) #define _FILE_OFFSET_BITS 64 #endif int uv__platform_loop_init(uv_loop_t* loop) { int err; int fd; loop->fs_fd = -1; loop->backend_fd = -1; fd = port_create(); if (fd == -1) return UV__ERR(errno); err = uv__cloexec(fd, 1); if (err) { uv__close(fd); return err; } loop->backend_fd = fd; return 0; } void uv__platform_loop_delete(uv_loop_t* loop) { if (loop->fs_fd != -1) { uv__close(loop->fs_fd); loop->fs_fd = -1; } if (loop->backend_fd != -1) { uv__close(loop->backend_fd); loop->backend_fd = -1; } } int uv__io_fork(uv_loop_t* loop) { #if defined(PORT_SOURCE_FILE) if (loop->fs_fd != -1) { /* stop the watcher before we blow away its fileno */ uv__io_stop(loop, &loop->fs_event_watcher, POLLIN); } #endif uv__platform_loop_delete(loop); return uv__platform_loop_init(loop); } void uv__platform_invalidate_fd(uv_loop_t* loop, int fd) { struct port_event* events; uintptr_t i; uintptr_t nfds; assert(loop->watchers != NULL); assert(fd >= 0); events = (struct port_event*) loop->watchers[loop->nwatchers]; nfds = (uintptr_t) loop->watchers[loop->nwatchers + 1]; if (events == NULL) return; /* Invalidate events with same file descriptor */ for (i = 0; i < nfds; i++) if ((int) events[i].portev_object == fd) events[i].portev_object = -1; } int uv__io_check_fd(uv_loop_t* loop, int fd) { if (port_associate(loop->backend_fd, PORT_SOURCE_FD, fd, POLLIN, 0)) return UV__ERR(errno); if (port_dissociate(loop->backend_fd, PORT_SOURCE_FD, fd)) { perror("(libuv) port_dissociate()"); abort(); } return 0; } void uv__io_poll(uv_loop_t* loop, int timeout) { struct port_event events[1024]; struct port_event* pe; struct timespec spec; QUEUE* q; uv__io_t* w; sigset_t* pset; sigset_t set; uint64_t base; uint64_t diff; unsigned int nfds; unsigned int i; int saved_errno; int have_signals; int nevents; int count; int err; int fd; if (loop->nfds == 0) { assert(QUEUE_EMPTY(&loop->watcher_queue)); return; } while (!QUEUE_EMPTY(&loop->watcher_queue)) { q = QUEUE_HEAD(&loop->watcher_queue); QUEUE_REMOVE(q); QUEUE_INIT(q); w = QUEUE_DATA(q, uv__io_t, watcher_queue); assert(w->pevents != 0); if (port_associate(loop->backend_fd, PORT_SOURCE_FD, w->fd, w->pevents, 0)) { perror("(libuv) port_associate()"); abort(); } w->events = w->pevents; } pset = NULL; if (loop->flags & UV_LOOP_BLOCK_SIGPROF) { pset = &set; sigemptyset(pset); sigaddset(pset, SIGPROF); } assert(timeout >= -1); base = loop->time; count = 48; /* Benchmarks suggest this gives the best throughput. */ for (;;) { if (timeout != -1) { spec.tv_sec = timeout / 1000; spec.tv_nsec = (timeout % 1000) * 1000000; } /* Work around a kernel bug where nfds is not updated. */ events[0].portev_source = 0; nfds = 1; saved_errno = 0; if (pset != NULL) pthread_sigmask(SIG_BLOCK, pset, NULL); err = port_getn(loop->backend_fd, events, ARRAY_SIZE(events), &nfds, timeout == -1 ? NULL : &spec); if (pset != NULL) pthread_sigmask(SIG_UNBLOCK, pset, NULL); if (err) { /* Work around another kernel bug: port_getn() may return events even * on error. */ if (errno == EINTR || errno == ETIME) { saved_errno = errno; } else { perror("(libuv) port_getn()"); abort(); } } /* Update loop->time unconditionally. It's tempting to skip the update when * timeout == 0 (i.e. non-blocking poll) but there is no guarantee that the * operating system didn't reschedule our process while in the syscall. */ SAVE_ERRNO(uv__update_time(loop)); if (events[0].portev_source == 0) { if (timeout == 0) return; if (timeout == -1) continue; goto update_timeout; } if (nfds == 0) { assert(timeout != -1); return; } have_signals = 0; nevents = 0; assert(loop->watchers != NULL); loop->watchers[loop->nwatchers] = (void*) events; loop->watchers[loop->nwatchers + 1] = (void*) (uintptr_t) nfds; for (i = 0; i < nfds; i++) { pe = events + i; fd = pe->portev_object; /* Skip invalidated events, see uv__platform_invalidate_fd */ if (fd == -1) continue; assert(fd >= 0); assert((unsigned) fd < loop->nwatchers); w = loop->watchers[fd]; /* File descriptor that we've stopped watching, ignore. */ if (w == NULL) continue; /* Run signal watchers last. This also affects child process watchers * because those are implemented in terms of signal watchers. */ if (w == &loop->signal_io_watcher) have_signals = 1; else w->cb(loop, w, pe->portev_events); nevents++; if (w != loop->watchers[fd]) continue; /* Disabled by callback. */ /* Events Ports operates in oneshot mode, rearm timer on next run. */ if (w->pevents != 0 && QUEUE_EMPTY(&w->watcher_queue)) QUEUE_INSERT_TAIL(&loop->watcher_queue, &w->watcher_queue); } if (have_signals != 0) loop->signal_io_watcher.cb(loop, &loop->signal_io_watcher, POLLIN); loop->watchers[loop->nwatchers] = NULL; loop->watchers[loop->nwatchers + 1] = NULL; if (have_signals != 0) return; /* Event loop should cycle now so don't poll again. */ if (nevents != 0) { if (nfds == ARRAY_SIZE(events) && --count != 0) { /* Poll for more events but don't block this time. */ timeout = 0; continue; } return; } if (saved_errno == ETIME) { assert(timeout != -1); return; } if (timeout == 0) return; if (timeout == -1) continue; update_timeout: assert(timeout > 0); diff = loop->time - base; if (diff >= (uint64_t) timeout) return; timeout -= diff; } } uint64_t uv__hrtime(uv_clocktype_t type) { return gethrtime(); } /* * We could use a static buffer for the path manipulations that we need outside * of the function, but this function could be called by multiple consumers and * we don't want to potentially create a race condition in the use of snprintf. */ int uv_exepath(char* buffer, size_t* size) { ssize_t res; char buf[128]; if (buffer == NULL || size == NULL || *size == 0) return UV_EINVAL; snprintf(buf, sizeof(buf), "/proc/%lu/path/a.out", (unsigned long) getpid()); res = *size - 1; if (res > 0) res = readlink(buf, buffer, res); if (res == -1) return UV__ERR(errno); buffer[res] = '\0'; *size = res; return 0; } uint64_t uv_get_free_memory(void) { return (uint64_t) sysconf(_SC_PAGESIZE) * sysconf(_SC_AVPHYS_PAGES); } uint64_t uv_get_total_memory(void) { return (uint64_t) sysconf(_SC_PAGESIZE) * sysconf(_SC_PHYS_PAGES); } uint64_t uv_get_constrained_memory(void) { return 0; /* Memory constraints are unknown. */ } void uv_loadavg(double avg[3]) { (void) getloadavg(avg, 3); } #if defined(PORT_SOURCE_FILE) static int uv__fs_event_rearm(uv_fs_event_t *handle) { if (handle->fd == -1) return UV_EBADF; if (port_associate(handle->loop->fs_fd, PORT_SOURCE_FILE, (uintptr_t) &handle->fo, FILE_ATTRIB | FILE_MODIFIED, handle) == -1) { return UV__ERR(errno); } handle->fd = PORT_LOADED; return 0; } static void uv__fs_event_read(uv_loop_t* loop, uv__io_t* w, unsigned int revents) { uv_fs_event_t *handle = NULL; timespec_t timeout; port_event_t pe; int events; int r; (void) w; (void) revents; do { uint_t n = 1; /* * Note that our use of port_getn() here (and not port_get()) is deliberate: * there is a bug in event ports (Sun bug 6456558) whereby a zeroed timeout * causes port_get() to return success instead of ETIME when there aren't * actually any events (!); by using port_getn() in lieu of port_get(), * we can at least workaround the bug by checking for zero returned events * and treating it as we would ETIME. */ do { memset(&timeout, 0, sizeof timeout); r = port_getn(loop->fs_fd, &pe, 1, &n, &timeout); } while (r == -1 && errno == EINTR); if ((r == -1 && errno == ETIME) || n == 0) break; handle = (uv_fs_event_t*) pe.portev_user; assert((r == 0) && "unexpected port_get() error"); events = 0; if (pe.portev_events & (FILE_ATTRIB | FILE_MODIFIED)) events |= UV_CHANGE; if (pe.portev_events & ~(FILE_ATTRIB | FILE_MODIFIED)) events |= UV_RENAME; assert(events != 0); handle->fd = PORT_FIRED; handle->cb(handle, NULL, events, 0); if (handle->fd != PORT_DELETED) { r = uv__fs_event_rearm(handle); if (r != 0) handle->cb(handle, NULL, 0, r); } } while (handle->fd != PORT_DELETED); } int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) { uv__handle_init(loop, (uv_handle_t*)handle, UV_FS_EVENT); return 0; } int uv_fs_event_start(uv_fs_event_t* handle, uv_fs_event_cb cb, const char* path, unsigned int flags) { int portfd; int first_run; int err; if (uv__is_active(handle)) return UV_EINVAL; first_run = 0; if (handle->loop->fs_fd == -1) { portfd = port_create(); if (portfd == -1) return UV__ERR(errno); handle->loop->fs_fd = portfd; first_run = 1; } uv__handle_start(handle); handle->path = uv__strdup(path); handle->fd = PORT_UNUSED; handle->cb = cb; memset(&handle->fo, 0, sizeof handle->fo); handle->fo.fo_name = handle->path; err = uv__fs_event_rearm(handle); if (err != 0) { uv_fs_event_stop(handle); return err; } if (first_run) { uv__io_init(&handle->loop->fs_event_watcher, uv__fs_event_read, portfd); uv__io_start(handle->loop, &handle->loop->fs_event_watcher, POLLIN); } return 0; } int uv_fs_event_stop(uv_fs_event_t* handle) { if (!uv__is_active(handle)) return 0; if (handle->fd == PORT_FIRED || handle->fd == PORT_LOADED) { port_dissociate(handle->loop->fs_fd, PORT_SOURCE_FILE, (uintptr_t) &handle->fo); } handle->fd = PORT_DELETED; uv__free(handle->path); handle->path = NULL; handle->fo.fo_name = NULL; uv__handle_stop(handle); return 0; } void uv__fs_event_close(uv_fs_event_t* handle) { uv_fs_event_stop(handle); } #else /* !defined(PORT_SOURCE_FILE) */ int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) { return UV_ENOSYS; } int uv_fs_event_start(uv_fs_event_t* handle, uv_fs_event_cb cb, const char* filename, unsigned int flags) { return UV_ENOSYS; } int uv_fs_event_stop(uv_fs_event_t* handle) { return UV_ENOSYS; } void uv__fs_event_close(uv_fs_event_t* handle) { UNREACHABLE(); } #endif /* defined(PORT_SOURCE_FILE) */ int uv_resident_set_memory(size_t* rss) { psinfo_t psinfo; int err; int fd; fd = open("/proc/self/psinfo", O_RDONLY); if (fd == -1) return UV__ERR(errno); /* FIXME(bnoordhuis) Handle EINTR. */ err = UV_EINVAL; if (read(fd, &psinfo, sizeof(psinfo)) == sizeof(psinfo)) { *rss = (size_t)psinfo.pr_rssize * 1024; err = 0; } uv__close(fd); return err; } int uv_uptime(double* uptime) { kstat_ctl_t *kc; kstat_t *ksp; kstat_named_t *knp; long hz = sysconf(_SC_CLK_TCK); kc = kstat_open(); if (kc == NULL) return UV_EPERM; ksp = kstat_lookup(kc, (char*) "unix", 0, (char*) "system_misc"); if (kstat_read(kc, ksp, NULL) == -1) { *uptime = -1; } else { knp = (kstat_named_t*) kstat_data_lookup(ksp, (char*) "clk_intr"); *uptime = knp->value.ul / hz; } kstat_close(kc); return 0; } int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { int lookup_instance; kstat_ctl_t *kc; kstat_t *ksp; kstat_named_t *knp; uv_cpu_info_t* cpu_info; kc = kstat_open(); if (kc == NULL) return UV_EPERM; /* Get count of cpus */ lookup_instance = 0; while ((ksp = kstat_lookup(kc, (char*) "cpu_info", lookup_instance, NULL))) { lookup_instance++; } *cpu_infos = uv__malloc(lookup_instance * sizeof(**cpu_infos)); if (!(*cpu_infos)) { kstat_close(kc); return UV_ENOMEM; } *count = lookup_instance; cpu_info = *cpu_infos; lookup_instance = 0; while ((ksp = kstat_lookup(kc, (char*) "cpu_info", lookup_instance, NULL))) { if (kstat_read(kc, ksp, NULL) == -1) { cpu_info->speed = 0; cpu_info->model = NULL; } else { knp = kstat_data_lookup(ksp, (char*) "clock_MHz"); assert(knp->data_type == KSTAT_DATA_INT32 || knp->data_type == KSTAT_DATA_INT64); cpu_info->speed = (knp->data_type == KSTAT_DATA_INT32) ? knp->value.i32 : knp->value.i64; knp = kstat_data_lookup(ksp, (char*) "brand"); assert(knp->data_type == KSTAT_DATA_STRING); cpu_info->model = uv__strdup(KSTAT_NAMED_STR_PTR(knp)); } lookup_instance++; cpu_info++; } cpu_info = *cpu_infos; lookup_instance = 0; for (;;) { ksp = kstat_lookup(kc, (char*) "cpu", lookup_instance, (char*) "sys"); if (ksp == NULL) break; if (kstat_read(kc, ksp, NULL) == -1) { cpu_info->cpu_times.user = 0; cpu_info->cpu_times.nice = 0; cpu_info->cpu_times.sys = 0; cpu_info->cpu_times.idle = 0; cpu_info->cpu_times.irq = 0; } else { knp = kstat_data_lookup(ksp, (char*) "cpu_ticks_user"); assert(knp->data_type == KSTAT_DATA_UINT64); cpu_info->cpu_times.user = knp->value.ui64; knp = kstat_data_lookup(ksp, (char*) "cpu_ticks_kernel"); assert(knp->data_type == KSTAT_DATA_UINT64); cpu_info->cpu_times.sys = knp->value.ui64; knp = kstat_data_lookup(ksp, (char*) "cpu_ticks_idle"); assert(knp->data_type == KSTAT_DATA_UINT64); cpu_info->cpu_times.idle = knp->value.ui64; knp = kstat_data_lookup(ksp, (char*) "intr"); assert(knp->data_type == KSTAT_DATA_UINT64); cpu_info->cpu_times.irq = knp->value.ui64; cpu_info->cpu_times.nice = 0; } lookup_instance++; cpu_info++; } kstat_close(kc); return 0; } #ifdef SUNOS_NO_IFADDRS int uv_interface_addresses(uv_interface_address_t** addresses, int* count) { *count = 0; *addresses = NULL; return UV_ENOSYS; } #else /* SUNOS_NO_IFADDRS */ /* * Inspired By: * https://blogs.oracle.com/paulie/entry/retrieving_mac_address_in_solaris * http://www.pauliesworld.org/project/getmac.c */ static int uv__set_phys_addr(uv_interface_address_t* address, struct ifaddrs* ent) { struct sockaddr_dl* sa_addr; int sockfd; size_t i; struct arpreq arpreq; /* This appears to only work as root */ sa_addr = (struct sockaddr_dl*)(ent->ifa_addr); memcpy(address->phys_addr, LLADDR(sa_addr), sizeof(address->phys_addr)); for (i = 0; i < sizeof(address->phys_addr); i++) { /* Check that all bytes of phys_addr are zero. */ if (address->phys_addr[i] != 0) return 0; } memset(&arpreq, 0, sizeof(arpreq)); if (address->address.address4.sin_family == AF_INET) { struct sockaddr_in* sin = ((struct sockaddr_in*)&arpreq.arp_pa); sin->sin_addr.s_addr = address->address.address4.sin_addr.s_addr; } else if (address->address.address4.sin_family == AF_INET6) { struct sockaddr_in6* sin = ((struct sockaddr_in6*)&arpreq.arp_pa); memcpy(sin->sin6_addr.s6_addr, address->address.address6.sin6_addr.s6_addr, sizeof(address->address.address6.sin6_addr.s6_addr)); } else { return 0; } sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) return UV__ERR(errno); if (ioctl(sockfd, SIOCGARP, (char*)&arpreq) == -1) { uv__close(sockfd); return UV__ERR(errno); } memcpy(address->phys_addr, arpreq.arp_ha.sa_data, sizeof(address->phys_addr)); uv__close(sockfd); return 0; } static int uv__ifaddr_exclude(struct ifaddrs *ent) { if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING))) return 1; if (ent->ifa_addr == NULL) return 1; if (ent->ifa_addr->sa_family != AF_INET && ent->ifa_addr->sa_family != AF_INET6) return 1; return 0; } int uv_interface_addresses(uv_interface_address_t** addresses, int* count) { uv_interface_address_t* address; struct ifaddrs* addrs; struct ifaddrs* ent; *count = 0; *addresses = NULL; if (getifaddrs(&addrs)) return UV__ERR(errno); /* Count the number of interfaces */ for (ent = addrs; ent != NULL; ent = ent->ifa_next) { if (uv__ifaddr_exclude(ent)) continue; (*count)++; } if (*count == 0) { freeifaddrs(addrs); return 0; } *addresses = uv__malloc(*count * sizeof(**addresses)); if (!(*addresses)) { freeifaddrs(addrs); return UV_ENOMEM; } address = *addresses; for (ent = addrs; ent != NULL; ent = ent->ifa_next) { if (uv__ifaddr_exclude(ent)) continue; address->name = uv__strdup(ent->ifa_name); if (ent->ifa_addr->sa_family == AF_INET6) { address->address.address6 = *((struct sockaddr_in6*) ent->ifa_addr); } else { address->address.address4 = *((struct sockaddr_in*) ent->ifa_addr); } if (ent->ifa_netmask->sa_family == AF_INET6) { address->netmask.netmask6 = *((struct sockaddr_in6*) ent->ifa_netmask); } else { address->netmask.netmask4 = *((struct sockaddr_in*) ent->ifa_netmask); } address->is_internal = !!((ent->ifa_flags & IFF_PRIVATE) || (ent->ifa_flags & IFF_LOOPBACK)); uv__set_phys_addr(address, ent); address++; } freeifaddrs(addrs); return 0; } #endif /* SUNOS_NO_IFADDRS */ void uv_free_interface_addresses(uv_interface_address_t* addresses, int count) { int i; for (i = 0; i < count; i++) { uv__free(addresses[i].name); } uv__free(addresses); } ================================================ FILE: external/libuv/src/unix/sysinfo-loadavg.c ================================================ /* Copyright libuv project contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include void uv_loadavg(double avg[3]) { struct sysinfo info; if (sysinfo(&info) < 0) return; avg[0] = (double) info.loads[0] / 65536.0; avg[1] = (double) info.loads[1] / 65536.0; avg[2] = (double) info.loads[2] / 65536.0; } ================================================ FILE: external/libuv/src/unix/sysinfo-memory.c ================================================ /* Copyright libuv project contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include uint64_t uv_get_free_memory(void) { struct sysinfo info; if (sysinfo(&info) == 0) return (uint64_t) info.freeram * info.mem_unit; return 0; } uint64_t uv_get_total_memory(void) { struct sysinfo info; if (sysinfo(&info) == 0) return (uint64_t) info.totalram * info.mem_unit; return 0; } ================================================ FILE: external/libuv/src/unix/tcp.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include static int new_socket(uv_tcp_t* handle, int domain, unsigned long flags) { struct sockaddr_storage saddr; socklen_t slen; int sockfd; int err; err = uv__socket(domain, SOCK_STREAM, 0); if (err < 0) return err; sockfd = err; err = uv__stream_open((uv_stream_t*) handle, sockfd, flags); if (err) { uv__close(sockfd); return err; } if (flags & UV_HANDLE_BOUND) { /* Bind this new socket to an arbitrary port */ slen = sizeof(saddr); memset(&saddr, 0, sizeof(saddr)); if (getsockname(uv__stream_fd(handle), (struct sockaddr*) &saddr, &slen)) { uv__close(sockfd); return UV__ERR(errno); } if (bind(uv__stream_fd(handle), (struct sockaddr*) &saddr, slen)) { uv__close(sockfd); return UV__ERR(errno); } } return 0; } static int maybe_new_socket(uv_tcp_t* handle, int domain, unsigned long flags) { struct sockaddr_storage saddr; socklen_t slen; if (domain == AF_UNSPEC) { handle->flags |= flags; return 0; } if (uv__stream_fd(handle) != -1) { if (flags & UV_HANDLE_BOUND) { if (handle->flags & UV_HANDLE_BOUND) { /* It is already bound to a port. */ handle->flags |= flags; return 0; } /* Query to see if tcp socket is bound. */ slen = sizeof(saddr); memset(&saddr, 0, sizeof(saddr)); if (getsockname(uv__stream_fd(handle), (struct sockaddr*) &saddr, &slen)) return UV__ERR(errno); if ((saddr.ss_family == AF_INET6 && ((struct sockaddr_in6*) &saddr)->sin6_port != 0) || (saddr.ss_family == AF_INET && ((struct sockaddr_in*) &saddr)->sin_port != 0)) { /* Handle is already bound to a port. */ handle->flags |= flags; return 0; } /* Bind to arbitrary port */ if (bind(uv__stream_fd(handle), (struct sockaddr*) &saddr, slen)) return UV__ERR(errno); } handle->flags |= flags; return 0; } return new_socket(handle, domain, flags); } int uv_tcp_init_ex(uv_loop_t* loop, uv_tcp_t* tcp, unsigned int flags) { int domain; /* Use the lower 8 bits for the domain */ domain = flags & 0xFF; if (domain != AF_INET && domain != AF_INET6 && domain != AF_UNSPEC) return UV_EINVAL; if (flags & ~0xFF) return UV_EINVAL; uv__stream_init(loop, (uv_stream_t*)tcp, UV_TCP); /* If anything fails beyond this point we need to remove the handle from * the handle queue, since it was added by uv__handle_init in uv_stream_init. */ if (domain != AF_UNSPEC) { int err = maybe_new_socket(tcp, domain, 0); if (err) { QUEUE_REMOVE(&tcp->handle_queue); return err; } } return 0; } int uv_tcp_init(uv_loop_t* loop, uv_tcp_t* tcp) { return uv_tcp_init_ex(loop, tcp, AF_UNSPEC); } int uv__tcp_bind(uv_tcp_t* tcp, const struct sockaddr* addr, unsigned int addrlen, unsigned int flags) { int err; int on; /* Cannot set IPv6-only mode on non-IPv6 socket. */ if ((flags & UV_TCP_IPV6ONLY) && addr->sa_family != AF_INET6) return UV_EINVAL; err = maybe_new_socket(tcp, addr->sa_family, 0); if (err) return err; on = 1; if (setsockopt(tcp->io_watcher.fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) return UV__ERR(errno); #ifndef __OpenBSD__ #ifdef IPV6_V6ONLY if (addr->sa_family == AF_INET6) { on = (flags & UV_TCP_IPV6ONLY) != 0; if (setsockopt(tcp->io_watcher.fd, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof on) == -1) { #if defined(__MVS__) if (errno == EOPNOTSUPP) return UV_EINVAL; #endif return UV__ERR(errno); } } #endif #endif errno = 0; if (bind(tcp->io_watcher.fd, addr, addrlen) && errno != EADDRINUSE) { if (errno == EAFNOSUPPORT) /* OSX, other BSDs and SunoS fail with EAFNOSUPPORT when binding a * socket created with AF_INET to an AF_INET6 address or vice versa. */ return UV_EINVAL; return UV__ERR(errno); } tcp->delayed_error = UV__ERR(errno); tcp->flags |= UV_HANDLE_BOUND; if (addr->sa_family == AF_INET6) tcp->flags |= UV_HANDLE_IPV6; return 0; } int uv__tcp_connect(uv_connect_t* req, uv_tcp_t* handle, const struct sockaddr* addr, unsigned int addrlen, uv_connect_cb cb) { int err; int r; assert(handle->type == UV_TCP); if (handle->connect_req != NULL) return UV_EALREADY; /* FIXME(bnoordhuis) UV_EINVAL or maybe UV_EBUSY. */ err = maybe_new_socket(handle, addr->sa_family, UV_HANDLE_READABLE | UV_HANDLE_WRITABLE); if (err) return err; handle->delayed_error = 0; do { errno = 0; r = connect(uv__stream_fd(handle), addr, addrlen); } while (r == -1 && errno == EINTR); /* We not only check the return value, but also check the errno != 0. * Because in rare cases connect() will return -1 but the errno * is 0 (for example, on Android 4.3, OnePlus phone A0001_12_150227) * and actually the tcp three-way handshake is completed. */ if (r == -1 && errno != 0) { if (errno == EINPROGRESS) ; /* not an error */ else if (errno == ECONNREFUSED #if defined(__OpenBSD__) || errno == EINVAL #endif ) /* If we get ECONNREFUSED (Solaris) or EINVAL (OpenBSD) wait until the * next tick to report the error. Solaris and OpenBSD wants to report * immediately -- other unixes want to wait. */ handle->delayed_error = UV__ERR(ECONNREFUSED); else return UV__ERR(errno); } uv__req_init(handle->loop, req, UV_CONNECT); req->cb = cb; req->handle = (uv_stream_t*) handle; QUEUE_INIT(&req->queue); handle->connect_req = req; uv__io_start(handle->loop, &handle->io_watcher, POLLOUT); if (handle->delayed_error) uv__io_feed(handle->loop, &handle->io_watcher); return 0; } int uv_tcp_open(uv_tcp_t* handle, uv_os_sock_t sock) { int err; if (uv__fd_exists(handle->loop, sock)) return UV_EEXIST; err = uv__nonblock(sock, 1); if (err) return err; return uv__stream_open((uv_stream_t*)handle, sock, UV_HANDLE_READABLE | UV_HANDLE_WRITABLE); } int uv_tcp_getsockname(const uv_tcp_t* handle, struct sockaddr* name, int* namelen) { if (handle->delayed_error) return handle->delayed_error; return uv__getsockpeername((const uv_handle_t*) handle, getsockname, name, namelen); } int uv_tcp_getpeername(const uv_tcp_t* handle, struct sockaddr* name, int* namelen) { if (handle->delayed_error) return handle->delayed_error; return uv__getsockpeername((const uv_handle_t*) handle, getpeername, name, namelen); } int uv_tcp_close_reset(uv_tcp_t* handle, uv_close_cb close_cb) { int fd; struct linger l = { 1, 0 }; /* Disallow setting SO_LINGER to zero due to some platform inconsistencies */ if (handle->flags & UV_HANDLE_SHUTTING) return UV_EINVAL; fd = uv__stream_fd(handle); if (0 != setsockopt(fd, SOL_SOCKET, SO_LINGER, &l, sizeof(l))) return UV__ERR(errno); uv_close((uv_handle_t*) handle, close_cb); return 0; } int uv_tcp_listen(uv_tcp_t* tcp, int backlog, uv_connection_cb cb) { static int single_accept = -1; unsigned long flags; int err; if (tcp->delayed_error) return tcp->delayed_error; if (single_accept == -1) { const char* val = getenv("UV_TCP_SINGLE_ACCEPT"); single_accept = (val != NULL && atoi(val) != 0); /* Off by default. */ } if (single_accept) tcp->flags |= UV_HANDLE_TCP_SINGLE_ACCEPT; flags = 0; #if defined(__MVS__) /* on zOS the listen call does not bind automatically if the socket is unbound. Hence the manual binding to an arbitrary port is required to be done manually */ flags |= UV_HANDLE_BOUND; #endif err = maybe_new_socket(tcp, AF_INET, flags); if (err) return err; if (listen(tcp->io_watcher.fd, backlog)) return UV__ERR(errno); tcp->connection_cb = cb; tcp->flags |= UV_HANDLE_BOUND; /* Start listening for connections. */ tcp->io_watcher.cb = uv__server_io; uv__io_start(tcp->loop, &tcp->io_watcher, POLLIN); return 0; } int uv__tcp_nodelay(int fd, int on) { if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on))) return UV__ERR(errno); return 0; } int uv__tcp_keepalive(int fd, int on, unsigned int delay) { if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on))) return UV__ERR(errno); #ifdef TCP_KEEPIDLE if (on) { int intvl = 1; /* 1 second; same as default on Win32 */ int cnt = 10; /* 10 retries; same as hardcoded on Win32 */ if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &delay, sizeof(delay))) return UV__ERR(errno); if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, &intvl, sizeof(intvl))) return UV__ERR(errno); if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT, &cnt, sizeof(cnt))) return UV__ERR(errno); } #endif /* Solaris/SmartOS, if you don't support keep-alive, * then don't advertise it in your system headers... */ /* FIXME(bnoordhuis) That's possibly because sizeof(delay) should be 1. */ #if defined(TCP_KEEPALIVE) && !defined(__sun) if (on && setsockopt(fd, IPPROTO_TCP, TCP_KEEPALIVE, &delay, sizeof(delay))) return UV__ERR(errno); #endif return 0; } int uv_tcp_nodelay(uv_tcp_t* handle, int on) { int err; if (uv__stream_fd(handle) != -1) { err = uv__tcp_nodelay(uv__stream_fd(handle), on); if (err) return err; } if (on) handle->flags |= UV_HANDLE_TCP_NODELAY; else handle->flags &= ~UV_HANDLE_TCP_NODELAY; return 0; } int uv_tcp_keepalive(uv_tcp_t* handle, int on, unsigned int delay) { int err; if (uv__stream_fd(handle) != -1) { err =uv__tcp_keepalive(uv__stream_fd(handle), on, delay); if (err) return err; } if (on) handle->flags |= UV_HANDLE_TCP_KEEPALIVE; else handle->flags &= ~UV_HANDLE_TCP_KEEPALIVE; /* TODO Store delay if uv__stream_fd(handle) == -1 but don't want to enlarge * uv_tcp_t with an int that's almost never used... */ return 0; } int uv_tcp_simultaneous_accepts(uv_tcp_t* handle, int enable) { if (enable) handle->flags &= ~UV_HANDLE_TCP_SINGLE_ACCEPT; else handle->flags |= UV_HANDLE_TCP_SINGLE_ACCEPT; return 0; } void uv__tcp_close(uv_tcp_t* handle) { uv__stream_close((uv_stream_t*)handle); } ================================================ FILE: external/libuv/src/unix/thread.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include /* getrlimit() */ #include /* getpagesize() */ #include #ifdef __MVS__ #include #include #endif #if defined(__GLIBC__) && !defined(__UCLIBC__) #include /* gnu_get_libc_version() */ #endif #undef NANOSEC #define NANOSEC ((uint64_t) 1e9) #if defined(PTHREAD_BARRIER_SERIAL_THREAD) STATIC_ASSERT(sizeof(uv_barrier_t) == sizeof(pthread_barrier_t)); #endif /* Note: guard clauses should match uv_barrier_t's in include/uv/unix.h. */ #if defined(_AIX) || \ defined(__OpenBSD__) || \ !defined(PTHREAD_BARRIER_SERIAL_THREAD) int uv_barrier_init(uv_barrier_t* barrier, unsigned int count) { struct _uv_barrier* b; int rc; if (barrier == NULL || count == 0) return UV_EINVAL; b = uv__malloc(sizeof(*b)); if (b == NULL) return UV_ENOMEM; b->in = 0; b->out = 0; b->threshold = count; rc = uv_mutex_init(&b->mutex); if (rc != 0) goto error2; rc = uv_cond_init(&b->cond); if (rc != 0) goto error; barrier->b = b; return 0; error: uv_mutex_destroy(&b->mutex); error2: uv__free(b); return rc; } int uv_barrier_wait(uv_barrier_t* barrier) { struct _uv_barrier* b; int last; if (barrier == NULL || barrier->b == NULL) return UV_EINVAL; b = barrier->b; uv_mutex_lock(&b->mutex); if (++b->in == b->threshold) { b->in = 0; b->out = b->threshold; uv_cond_signal(&b->cond); } else { do uv_cond_wait(&b->cond, &b->mutex); while (b->in != 0); } last = (--b->out == 0); if (!last) uv_cond_signal(&b->cond); /* Not needed for last thread. */ uv_mutex_unlock(&b->mutex); return last; } void uv_barrier_destroy(uv_barrier_t* barrier) { struct _uv_barrier* b; b = barrier->b; uv_mutex_lock(&b->mutex); assert(b->in == 0); assert(b->out == 0); if (b->in != 0 || b->out != 0) abort(); uv_mutex_unlock(&b->mutex); uv_mutex_destroy(&b->mutex); uv_cond_destroy(&b->cond); uv__free(barrier->b); barrier->b = NULL; } #else int uv_barrier_init(uv_barrier_t* barrier, unsigned int count) { return UV__ERR(pthread_barrier_init(barrier, NULL, count)); } int uv_barrier_wait(uv_barrier_t* barrier) { int rc; rc = pthread_barrier_wait(barrier); if (rc != 0) if (rc != PTHREAD_BARRIER_SERIAL_THREAD) abort(); return rc == PTHREAD_BARRIER_SERIAL_THREAD; } void uv_barrier_destroy(uv_barrier_t* barrier) { if (pthread_barrier_destroy(barrier)) abort(); } #endif /* On MacOS, threads other than the main thread are created with a reduced * stack size by default. Adjust to RLIMIT_STACK aligned to the page size. * * On Linux, threads created by musl have a much smaller stack than threads * created by glibc (80 vs. 2048 or 4096 kB.) Follow glibc for consistency. */ static size_t thread_stack_size(void) { #if defined(__APPLE__) || defined(__linux__) struct rlimit lim; /* getrlimit() can fail on some aarch64 systems due to a glibc bug where * the system call wrapper invokes the wrong system call. Don't treat * that as fatal, just use the default stack size instead. */ if (0 == getrlimit(RLIMIT_STACK, &lim) && lim.rlim_cur != RLIM_INFINITY) { /* pthread_attr_setstacksize() expects page-aligned values. */ lim.rlim_cur -= lim.rlim_cur % (rlim_t) getpagesize(); /* Musl's PTHREAD_STACK_MIN is 2 KB on all architectures, which is * too small to safely receive signals on. * * Musl's PTHREAD_STACK_MIN + MINSIGSTKSZ == 8192 on arm64 (which has * the largest MINSIGSTKSZ of the architectures that musl supports) so * let's use that as a lower bound. * * We use a hardcoded value because PTHREAD_STACK_MIN + MINSIGSTKSZ * is between 28 and 133 KB when compiling against glibc, depending * on the architecture. */ if (lim.rlim_cur >= 8192) if (lim.rlim_cur >= PTHREAD_STACK_MIN) return lim.rlim_cur; } #endif #if !defined(__linux__) return 0; #elif defined(__PPC__) || defined(__ppc__) || defined(__powerpc__) return 4 << 20; /* glibc default. */ #else return 2 << 20; /* glibc default. */ #endif } int uv_thread_create(uv_thread_t *tid, void (*entry)(void *arg), void *arg) { uv_thread_options_t params; params.flags = UV_THREAD_NO_FLAGS; return uv_thread_create_ex(tid, ¶ms, entry, arg); } int uv_thread_create_ex(uv_thread_t* tid, const uv_thread_options_t* params, void (*entry)(void *arg), void *arg) { int err; pthread_attr_t* attr; pthread_attr_t attr_storage; size_t pagesize; size_t stack_size; /* Used to squelch a -Wcast-function-type warning. */ union { void (*in)(void*); void* (*out)(void*); } f; stack_size = params->flags & UV_THREAD_HAS_STACK_SIZE ? params->stack_size : 0; attr = NULL; if (stack_size == 0) { stack_size = thread_stack_size(); } else { pagesize = (size_t)getpagesize(); /* Round up to the nearest page boundary. */ stack_size = (stack_size + pagesize - 1) &~ (pagesize - 1); #ifdef PTHREAD_STACK_MIN if (stack_size < PTHREAD_STACK_MIN) stack_size = PTHREAD_STACK_MIN; #endif } if (stack_size > 0) { attr = &attr_storage; if (pthread_attr_init(attr)) abort(); if (pthread_attr_setstacksize(attr, stack_size)) abort(); } f.in = entry; err = pthread_create(tid, attr, f.out, arg); if (attr != NULL) pthread_attr_destroy(attr); return UV__ERR(err); } uv_thread_t uv_thread_self(void) { return pthread_self(); } int uv_thread_join(uv_thread_t *tid) { return UV__ERR(pthread_join(*tid, NULL)); } int uv_thread_equal(const uv_thread_t* t1, const uv_thread_t* t2) { return pthread_equal(*t1, *t2); } int uv_mutex_init(uv_mutex_t* mutex) { #if defined(NDEBUG) || !defined(PTHREAD_MUTEX_ERRORCHECK) return UV__ERR(pthread_mutex_init(mutex, NULL)); #else pthread_mutexattr_t attr; int err; if (pthread_mutexattr_init(&attr)) abort(); if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK)) abort(); err = pthread_mutex_init(mutex, &attr); if (pthread_mutexattr_destroy(&attr)) abort(); return UV__ERR(err); #endif } int uv_mutex_init_recursive(uv_mutex_t* mutex) { pthread_mutexattr_t attr; int err; if (pthread_mutexattr_init(&attr)) abort(); if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE)) abort(); err = pthread_mutex_init(mutex, &attr); if (pthread_mutexattr_destroy(&attr)) abort(); return UV__ERR(err); } void uv_mutex_destroy(uv_mutex_t* mutex) { if (pthread_mutex_destroy(mutex)) abort(); } void uv_mutex_lock(uv_mutex_t* mutex) { if (pthread_mutex_lock(mutex)) abort(); } int uv_mutex_trylock(uv_mutex_t* mutex) { int err; err = pthread_mutex_trylock(mutex); if (err) { if (err != EBUSY && err != EAGAIN) abort(); return UV_EBUSY; } return 0; } void uv_mutex_unlock(uv_mutex_t* mutex) { if (pthread_mutex_unlock(mutex)) abort(); } int uv_rwlock_init(uv_rwlock_t* rwlock) { return UV__ERR(pthread_rwlock_init(rwlock, NULL)); } void uv_rwlock_destroy(uv_rwlock_t* rwlock) { if (pthread_rwlock_destroy(rwlock)) abort(); } void uv_rwlock_rdlock(uv_rwlock_t* rwlock) { if (pthread_rwlock_rdlock(rwlock)) abort(); } int uv_rwlock_tryrdlock(uv_rwlock_t* rwlock) { int err; err = pthread_rwlock_tryrdlock(rwlock); if (err) { if (err != EBUSY && err != EAGAIN) abort(); return UV_EBUSY; } return 0; } void uv_rwlock_rdunlock(uv_rwlock_t* rwlock) { if (pthread_rwlock_unlock(rwlock)) abort(); } void uv_rwlock_wrlock(uv_rwlock_t* rwlock) { if (pthread_rwlock_wrlock(rwlock)) abort(); } int uv_rwlock_trywrlock(uv_rwlock_t* rwlock) { int err; err = pthread_rwlock_trywrlock(rwlock); if (err) { if (err != EBUSY && err != EAGAIN) abort(); return UV_EBUSY; } return 0; } void uv_rwlock_wrunlock(uv_rwlock_t* rwlock) { if (pthread_rwlock_unlock(rwlock)) abort(); } void uv_once(uv_once_t* guard, void (*callback)(void)) { if (pthread_once(guard, callback)) abort(); } #if defined(__APPLE__) && defined(__MACH__) int uv_sem_init(uv_sem_t* sem, unsigned int value) { kern_return_t err; err = semaphore_create(mach_task_self(), sem, SYNC_POLICY_FIFO, value); if (err == KERN_SUCCESS) return 0; if (err == KERN_INVALID_ARGUMENT) return UV_EINVAL; if (err == KERN_RESOURCE_SHORTAGE) return UV_ENOMEM; abort(); return UV_EINVAL; /* Satisfy the compiler. */ } void uv_sem_destroy(uv_sem_t* sem) { if (semaphore_destroy(mach_task_self(), *sem)) abort(); } void uv_sem_post(uv_sem_t* sem) { if (semaphore_signal(*sem)) abort(); } void uv_sem_wait(uv_sem_t* sem) { int r; do r = semaphore_wait(*sem); while (r == KERN_ABORTED); if (r != KERN_SUCCESS) abort(); } int uv_sem_trywait(uv_sem_t* sem) { mach_timespec_t interval; kern_return_t err; interval.tv_sec = 0; interval.tv_nsec = 0; err = semaphore_timedwait(*sem, interval); if (err == KERN_SUCCESS) return 0; if (err == KERN_OPERATION_TIMED_OUT) return UV_EAGAIN; abort(); return UV_EINVAL; /* Satisfy the compiler. */ } #else /* !(defined(__APPLE__) && defined(__MACH__)) */ #if defined(__GLIBC__) && !defined(__UCLIBC__) /* Hack around https://sourceware.org/bugzilla/show_bug.cgi?id=12674 * by providing a custom implementation for glibc < 2.21 in terms of other * concurrency primitives. * Refs: https://github.com/nodejs/node/issues/19903 */ /* To preserve ABI compatibility, we treat the uv_sem_t as storage for * a pointer to the actual struct we're using underneath. */ static uv_once_t glibc_version_check_once = UV_ONCE_INIT; static int platform_needs_custom_semaphore = 0; static void glibc_version_check(void) { const char* version = gnu_get_libc_version(); platform_needs_custom_semaphore = version[0] == '2' && version[1] == '.' && atoi(version + 2) < 21; } #elif defined(__MVS__) #define platform_needs_custom_semaphore 1 #else /* !defined(__GLIBC__) && !defined(__MVS__) */ #define platform_needs_custom_semaphore 0 #endif typedef struct uv_semaphore_s { uv_mutex_t mutex; uv_cond_t cond; unsigned int value; } uv_semaphore_t; #if (defined(__GLIBC__) && !defined(__UCLIBC__)) || \ platform_needs_custom_semaphore STATIC_ASSERT(sizeof(uv_sem_t) >= sizeof(uv_semaphore_t*)); #endif static int uv__custom_sem_init(uv_sem_t* sem_, unsigned int value) { int err; uv_semaphore_t* sem; sem = uv__malloc(sizeof(*sem)); if (sem == NULL) return UV_ENOMEM; if ((err = uv_mutex_init(&sem->mutex)) != 0) { uv__free(sem); return err; } if ((err = uv_cond_init(&sem->cond)) != 0) { uv_mutex_destroy(&sem->mutex); uv__free(sem); return err; } sem->value = value; *(uv_semaphore_t**)sem_ = sem; return 0; } static void uv__custom_sem_destroy(uv_sem_t* sem_) { uv_semaphore_t* sem; sem = *(uv_semaphore_t**)sem_; uv_cond_destroy(&sem->cond); uv_mutex_destroy(&sem->mutex); uv__free(sem); } static void uv__custom_sem_post(uv_sem_t* sem_) { uv_semaphore_t* sem; sem = *(uv_semaphore_t**)sem_; uv_mutex_lock(&sem->mutex); sem->value++; if (sem->value == 1) uv_cond_signal(&sem->cond); uv_mutex_unlock(&sem->mutex); } static void uv__custom_sem_wait(uv_sem_t* sem_) { uv_semaphore_t* sem; sem = *(uv_semaphore_t**)sem_; uv_mutex_lock(&sem->mutex); while (sem->value == 0) uv_cond_wait(&sem->cond, &sem->mutex); sem->value--; uv_mutex_unlock(&sem->mutex); } static int uv__custom_sem_trywait(uv_sem_t* sem_) { uv_semaphore_t* sem; sem = *(uv_semaphore_t**)sem_; if (uv_mutex_trylock(&sem->mutex) != 0) return UV_EAGAIN; if (sem->value == 0) { uv_mutex_unlock(&sem->mutex); return UV_EAGAIN; } sem->value--; uv_mutex_unlock(&sem->mutex); return 0; } static int uv__sem_init(uv_sem_t* sem, unsigned int value) { if (sem_init(sem, 0, value)) return UV__ERR(errno); return 0; } static void uv__sem_destroy(uv_sem_t* sem) { if (sem_destroy(sem)) abort(); } static void uv__sem_post(uv_sem_t* sem) { if (sem_post(sem)) abort(); } static void uv__sem_wait(uv_sem_t* sem) { int r; do r = sem_wait(sem); while (r == -1 && errno == EINTR); if (r) abort(); } static int uv__sem_trywait(uv_sem_t* sem) { int r; do r = sem_trywait(sem); while (r == -1 && errno == EINTR); if (r) { if (errno == EAGAIN) return UV_EAGAIN; abort(); } return 0; } int uv_sem_init(uv_sem_t* sem, unsigned int value) { #if defined(__GLIBC__) && !defined(__UCLIBC__) uv_once(&glibc_version_check_once, glibc_version_check); #endif if (platform_needs_custom_semaphore) return uv__custom_sem_init(sem, value); else return uv__sem_init(sem, value); } void uv_sem_destroy(uv_sem_t* sem) { if (platform_needs_custom_semaphore) uv__custom_sem_destroy(sem); else uv__sem_destroy(sem); } void uv_sem_post(uv_sem_t* sem) { if (platform_needs_custom_semaphore) uv__custom_sem_post(sem); else uv__sem_post(sem); } void uv_sem_wait(uv_sem_t* sem) { if (platform_needs_custom_semaphore) uv__custom_sem_wait(sem); else uv__sem_wait(sem); } int uv_sem_trywait(uv_sem_t* sem) { if (platform_needs_custom_semaphore) return uv__custom_sem_trywait(sem); else return uv__sem_trywait(sem); } #endif /* defined(__APPLE__) && defined(__MACH__) */ #if defined(__APPLE__) && defined(__MACH__) || defined(__MVS__) int uv_cond_init(uv_cond_t* cond) { return UV__ERR(pthread_cond_init(cond, NULL)); } #else /* !(defined(__APPLE__) && defined(__MACH__)) */ int uv_cond_init(uv_cond_t* cond) { pthread_condattr_t attr; int err; err = pthread_condattr_init(&attr); if (err) return UV__ERR(err); #if !(defined(__ANDROID_API__) && __ANDROID_API__ < 21) err = pthread_condattr_setclock(&attr, CLOCK_MONOTONIC); if (err) goto error2; #endif err = pthread_cond_init(cond, &attr); if (err) goto error2; err = pthread_condattr_destroy(&attr); if (err) goto error; return 0; error: pthread_cond_destroy(cond); error2: pthread_condattr_destroy(&attr); return UV__ERR(err); } #endif /* defined(__APPLE__) && defined(__MACH__) */ void uv_cond_destroy(uv_cond_t* cond) { #if defined(__APPLE__) && defined(__MACH__) /* It has been reported that destroying condition variables that have been * signalled but not waited on can sometimes result in application crashes. * See https://codereview.chromium.org/1323293005. */ pthread_mutex_t mutex; struct timespec ts; int err; if (pthread_mutex_init(&mutex, NULL)) abort(); if (pthread_mutex_lock(&mutex)) abort(); ts.tv_sec = 0; ts.tv_nsec = 1; err = pthread_cond_timedwait_relative_np(cond, &mutex, &ts); if (err != 0 && err != ETIMEDOUT) abort(); if (pthread_mutex_unlock(&mutex)) abort(); if (pthread_mutex_destroy(&mutex)) abort(); #endif /* defined(__APPLE__) && defined(__MACH__) */ if (pthread_cond_destroy(cond)) abort(); } void uv_cond_signal(uv_cond_t* cond) { if (pthread_cond_signal(cond)) abort(); } void uv_cond_broadcast(uv_cond_t* cond) { if (pthread_cond_broadcast(cond)) abort(); } void uv_cond_wait(uv_cond_t* cond, uv_mutex_t* mutex) { if (pthread_cond_wait(cond, mutex)) abort(); } int uv_cond_timedwait(uv_cond_t* cond, uv_mutex_t* mutex, uint64_t timeout) { int r; struct timespec ts; #if defined(__MVS__) struct timeval tv; #endif #if defined(__APPLE__) && defined(__MACH__) ts.tv_sec = timeout / NANOSEC; ts.tv_nsec = timeout % NANOSEC; r = pthread_cond_timedwait_relative_np(cond, mutex, &ts); #else #if defined(__MVS__) if (gettimeofday(&tv, NULL)) abort(); timeout += tv.tv_sec * NANOSEC + tv.tv_usec * 1e3; #else timeout += uv__hrtime(UV_CLOCK_PRECISE); #endif ts.tv_sec = timeout / NANOSEC; ts.tv_nsec = timeout % NANOSEC; #if defined(__ANDROID_API__) && __ANDROID_API__ < 21 /* * The bionic pthread implementation doesn't support CLOCK_MONOTONIC, * but has this alternative function instead. */ r = pthread_cond_timedwait_monotonic_np(cond, mutex, &ts); #else r = pthread_cond_timedwait(cond, mutex, &ts); #endif /* __ANDROID_API__ */ #endif if (r == 0) return 0; if (r == ETIMEDOUT) return UV_ETIMEDOUT; abort(); #ifndef __SUNPRO_C return UV_EINVAL; /* Satisfy the compiler. */ #endif } int uv_key_create(uv_key_t* key) { return UV__ERR(pthread_key_create(key, NULL)); } void uv_key_delete(uv_key_t* key) { if (pthread_key_delete(*key)) abort(); } void* uv_key_get(uv_key_t* key) { return pthread_getspecific(*key); } void uv_key_set(uv_key_t* key, void* value) { if (pthread_setspecific(*key, value)) abort(); } ================================================ FILE: external/libuv/src/unix/tty.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include "spinlock.h" #include #include #include #include #include #include #if defined(__MVS__) && !defined(IMAXBEL) #define IMAXBEL 0 #endif #if defined(__PASE__) /* On IBM i PASE, for better compatibility with running interactive programs in * a 5250 environment, isatty() will return true for the stdin/stdout/stderr * streams created by QSH/QP2TERM. * * For more, see docs on PASE_STDIO_ISATTY in * https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_74/apis/pase_environ.htm * * This behavior causes problems for Node as it expects that if isatty() returns * true that TTY ioctls will be supported by that fd (which is not an * unreasonable expectation) and when they don't it crashes with assertion * errors. * * Here, we create our own version of isatty() that uses ioctl() to identify * whether the fd is *really* a TTY or not. */ static int isreallyatty(int file) { int rc; rc = !ioctl(file, TXISATTY + 0x81, NULL); if (!rc && errno != EBADF) errno = ENOTTY; return rc; } #define isatty(fd) isreallyatty(fd) #endif static int orig_termios_fd = -1; static struct termios orig_termios; static uv_spinlock_t termios_spinlock = UV_SPINLOCK_INITIALIZER; static int uv__tty_is_slave(const int fd) { int result; #if defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) int dummy; result = ioctl(fd, TIOCGPTN, &dummy) != 0; #elif defined(__APPLE__) char dummy[256]; result = ioctl(fd, TIOCPTYGNAME, &dummy) != 0; #elif defined(__NetBSD__) /* * NetBSD as an extension returns with ptsname(3) and ptsname_r(3) the slave * device name for both descriptors, the master one and slave one. * * Implement function to compare major device number with pts devices. * * The major numbers are machine-dependent, on NetBSD/amd64 they are * respectively: * - master tty: ptc - major 6 * - slave tty: pts - major 5 */ struct stat sb; /* Lookup device's major for the pts driver and cache it. */ static devmajor_t pts = NODEVMAJOR; if (pts == NODEVMAJOR) { pts = getdevmajor("pts", S_IFCHR); if (pts == NODEVMAJOR) abort(); } /* Lookup stat structure behind the file descriptor. */ if (fstat(fd, &sb) != 0) abort(); /* Assert character device. */ if (!S_ISCHR(sb.st_mode)) abort(); /* Assert valid major. */ if (major(sb.st_rdev) == NODEVMAJOR) abort(); result = (pts == major(sb.st_rdev)); #else /* Fallback to ptsname */ result = ptsname(fd) == NULL; #endif return result; } int uv_tty_init(uv_loop_t* loop, uv_tty_t* tty, int fd, int unused) { uv_handle_type type; int flags; int newfd; int r; int saved_flags; int mode; char path[256]; (void)unused; /* deprecated parameter is no longer needed */ /* File descriptors that refer to files cannot be monitored with epoll. * That restriction also applies to character devices like /dev/random * (but obviously not /dev/tty.) */ type = uv_guess_handle(fd); if (type == UV_FILE || type == UV_UNKNOWN_HANDLE) return UV_EINVAL; flags = 0; newfd = -1; /* Save the fd flags in case we need to restore them due to an error. */ do saved_flags = fcntl(fd, F_GETFL); while (saved_flags == -1 && errno == EINTR); if (saved_flags == -1) return UV__ERR(errno); mode = saved_flags & O_ACCMODE; /* Reopen the file descriptor when it refers to a tty. This lets us put the * tty in non-blocking mode without affecting other processes that share it * with us. * * Example: `node | cat` - if we put our fd 0 in non-blocking mode, it also * affects fd 1 of `cat` because both file descriptors refer to the same * struct file in the kernel. When we reopen our fd 0, it points to a * different struct file, hence changing its properties doesn't affect * other processes. */ if (type == UV_TTY) { /* Reopening a pty in master mode won't work either because the reopened * pty will be in slave mode (*BSD) or reopening will allocate a new * master/slave pair (Linux). Therefore check if the fd points to a * slave device. */ if (uv__tty_is_slave(fd) && ttyname_r(fd, path, sizeof(path)) == 0) r = uv__open_cloexec(path, mode | O_NOCTTY); else r = -1; if (r < 0) { /* fallback to using blocking writes */ if (mode != O_RDONLY) flags |= UV_HANDLE_BLOCKING_WRITES; goto skip; } newfd = r; r = uv__dup2_cloexec(newfd, fd); if (r < 0 && r != UV_EINVAL) { /* EINVAL means newfd == fd which could conceivably happen if another * thread called close(fd) between our calls to isatty() and open(). * That's a rather unlikely event but let's handle it anyway. */ uv__close(newfd); return r; } fd = newfd; } skip: uv__stream_init(loop, (uv_stream_t*) tty, UV_TTY); /* If anything fails beyond this point we need to remove the handle from * the handle queue, since it was added by uv__handle_init in uv_stream_init. */ if (!(flags & UV_HANDLE_BLOCKING_WRITES)) uv__nonblock(fd, 1); #if defined(__APPLE__) r = uv__stream_try_select((uv_stream_t*) tty, &fd); if (r) { int rc = r; if (newfd != -1) uv__close(newfd); QUEUE_REMOVE(&tty->handle_queue); do r = fcntl(fd, F_SETFL, saved_flags); while (r == -1 && errno == EINTR); return rc; } #endif if (mode != O_WRONLY) flags |= UV_HANDLE_READABLE; if (mode != O_RDONLY) flags |= UV_HANDLE_WRITABLE; uv__stream_open((uv_stream_t*) tty, fd, flags); tty->mode = UV_TTY_MODE_NORMAL; return 0; } static void uv__tty_make_raw(struct termios* tio) { assert(tio != NULL); #if defined __sun || defined __MVS__ /* * This implementation of cfmakeraw for Solaris and derivatives is taken from * http://www.perkin.org.uk/posts/solaris-portability-cfmakeraw.html. */ tio->c_iflag &= ~(IMAXBEL | IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON); tio->c_oflag &= ~OPOST; tio->c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); tio->c_cflag &= ~(CSIZE | PARENB); tio->c_cflag |= CS8; #else cfmakeraw(tio); #endif /* #ifdef __sun */ } int uv_tty_set_mode(uv_tty_t* tty, uv_tty_mode_t mode) { struct termios tmp; int fd; if (tty->mode == (int) mode) return 0; fd = uv__stream_fd(tty); if (tty->mode == UV_TTY_MODE_NORMAL && mode != UV_TTY_MODE_NORMAL) { if (tcgetattr(fd, &tty->orig_termios)) return UV__ERR(errno); /* This is used for uv_tty_reset_mode() */ uv_spinlock_lock(&termios_spinlock); if (orig_termios_fd == -1) { orig_termios = tty->orig_termios; orig_termios_fd = fd; } uv_spinlock_unlock(&termios_spinlock); } tmp = tty->orig_termios; switch (mode) { case UV_TTY_MODE_NORMAL: break; case UV_TTY_MODE_RAW: tmp.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON); tmp.c_oflag |= (ONLCR); tmp.c_cflag |= (CS8); tmp.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG); tmp.c_cc[VMIN] = 1; tmp.c_cc[VTIME] = 0; break; case UV_TTY_MODE_IO: uv__tty_make_raw(&tmp); break; } /* Apply changes after draining */ if (tcsetattr(fd, TCSADRAIN, &tmp)) return UV__ERR(errno); tty->mode = mode; return 0; } int uv_tty_get_winsize(uv_tty_t* tty, int* width, int* height) { struct winsize ws; int err; do err = ioctl(uv__stream_fd(tty), TIOCGWINSZ, &ws); while (err == -1 && errno == EINTR); if (err == -1) return UV__ERR(errno); *width = ws.ws_col; *height = ws.ws_row; return 0; } uv_handle_type uv_guess_handle(uv_file file) { struct sockaddr sa; struct stat s; socklen_t len; int type; if (file < 0) return UV_UNKNOWN_HANDLE; if (isatty(file)) return UV_TTY; if (fstat(file, &s)) return UV_UNKNOWN_HANDLE; if (S_ISREG(s.st_mode)) return UV_FILE; if (S_ISCHR(s.st_mode)) return UV_FILE; /* XXX UV_NAMED_PIPE? */ if (S_ISFIFO(s.st_mode)) return UV_NAMED_PIPE; if (!S_ISSOCK(s.st_mode)) return UV_UNKNOWN_HANDLE; len = sizeof(type); if (getsockopt(file, SOL_SOCKET, SO_TYPE, &type, &len)) return UV_UNKNOWN_HANDLE; len = sizeof(sa); if (getsockname(file, &sa, &len)) return UV_UNKNOWN_HANDLE; if (type == SOCK_DGRAM) if (sa.sa_family == AF_INET || sa.sa_family == AF_INET6) return UV_UDP; if (type == SOCK_STREAM) { #if defined(_AIX) || defined(__DragonFly__) /* on AIX/DragonFly the getsockname call returns an empty sa structure * for sockets of type AF_UNIX. For all other types it will * return a properly filled in structure. */ if (len == 0) return UV_NAMED_PIPE; #endif /* defined(_AIX) || defined(__DragonFly__) */ if (sa.sa_family == AF_INET || sa.sa_family == AF_INET6) return UV_TCP; if (sa.sa_family == AF_UNIX) return UV_NAMED_PIPE; } return UV_UNKNOWN_HANDLE; } /* This function is async signal-safe, meaning that it's safe to call from * inside a signal handler _unless_ execution was inside uv_tty_set_mode()'s * critical section when the signal was raised. */ int uv_tty_reset_mode(void) { int saved_errno; int err; saved_errno = errno; if (!uv_spinlock_trylock(&termios_spinlock)) return UV_EBUSY; /* In uv_tty_set_mode(). */ err = 0; if (orig_termios_fd != -1) if (tcsetattr(orig_termios_fd, TCSANOW, &orig_termios)) err = UV__ERR(errno); uv_spinlock_unlock(&termios_spinlock); errno = saved_errno; return err; } void uv_tty_set_vterm_state(uv_tty_vtermstate_t state) { } int uv_tty_get_vterm_state(uv_tty_vtermstate_t* state) { return UV_ENOTSUP; } ================================================ FILE: external/libuv/src/unix/udp.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #if defined(__MVS__) #include #endif #include #define UV__UDP_DGRAM_MAXSIZE (64 * 1024) #if defined(IPV6_JOIN_GROUP) && !defined(IPV6_ADD_MEMBERSHIP) # define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP #endif #if defined(IPV6_LEAVE_GROUP) && !defined(IPV6_DROP_MEMBERSHIP) # define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP #endif union uv__sockaddr { struct sockaddr_in6 in6; struct sockaddr_in in; struct sockaddr addr; }; static void uv__udp_run_completed(uv_udp_t* handle); static void uv__udp_io(uv_loop_t* loop, uv__io_t* w, unsigned int revents); static void uv__udp_recvmsg(uv_udp_t* handle); static void uv__udp_sendmsg(uv_udp_t* handle); static int uv__udp_maybe_deferred_bind(uv_udp_t* handle, int domain, unsigned int flags); #if HAVE_MMSG #define UV__MMSG_MAXWIDTH 20 static int uv__udp_recvmmsg(uv_udp_t* handle, uv_buf_t* buf); static void uv__udp_sendmmsg(uv_udp_t* handle); static int uv__recvmmsg_avail; static int uv__sendmmsg_avail; static uv_once_t once = UV_ONCE_INIT; static void uv__udp_mmsg_init(void) { int ret; int s; s = uv__socket(AF_INET, SOCK_DGRAM, 0); if (s < 0) return; ret = uv__sendmmsg(s, NULL, 0, 0); if (ret == 0 || errno != ENOSYS) { uv__sendmmsg_avail = 1; uv__recvmmsg_avail = 1; } else { ret = uv__recvmmsg(s, NULL, 0, 0, NULL); if (ret == 0 || errno != ENOSYS) uv__recvmmsg_avail = 1; } uv__close(s); } #endif void uv__udp_close(uv_udp_t* handle) { uv__io_close(handle->loop, &handle->io_watcher); uv__handle_stop(handle); if (handle->io_watcher.fd != -1) { uv__close(handle->io_watcher.fd); handle->io_watcher.fd = -1; } } void uv__udp_finish_close(uv_udp_t* handle) { uv_udp_send_t* req; QUEUE* q; assert(!uv__io_active(&handle->io_watcher, POLLIN | POLLOUT)); assert(handle->io_watcher.fd == -1); while (!QUEUE_EMPTY(&handle->write_queue)) { q = QUEUE_HEAD(&handle->write_queue); QUEUE_REMOVE(q); req = QUEUE_DATA(q, uv_udp_send_t, queue); req->status = UV_ECANCELED; QUEUE_INSERT_TAIL(&handle->write_completed_queue, &req->queue); } uv__udp_run_completed(handle); assert(handle->send_queue_size == 0); assert(handle->send_queue_count == 0); /* Now tear down the handle. */ handle->recv_cb = NULL; handle->alloc_cb = NULL; /* but _do not_ touch close_cb */ } static void uv__udp_run_completed(uv_udp_t* handle) { uv_udp_send_t* req; QUEUE* q; assert(!(handle->flags & UV_HANDLE_UDP_PROCESSING)); handle->flags |= UV_HANDLE_UDP_PROCESSING; while (!QUEUE_EMPTY(&handle->write_completed_queue)) { q = QUEUE_HEAD(&handle->write_completed_queue); QUEUE_REMOVE(q); req = QUEUE_DATA(q, uv_udp_send_t, queue); uv__req_unregister(handle->loop, req); handle->send_queue_size -= uv__count_bufs(req->bufs, req->nbufs); handle->send_queue_count--; if (req->bufs != req->bufsml) uv__free(req->bufs); req->bufs = NULL; if (req->send_cb == NULL) continue; /* req->status >= 0 == bytes written * req->status < 0 == errno */ if (req->status >= 0) req->send_cb(req, 0); else req->send_cb(req, req->status); } if (QUEUE_EMPTY(&handle->write_queue)) { /* Pending queue and completion queue empty, stop watcher. */ uv__io_stop(handle->loop, &handle->io_watcher, POLLOUT); if (!uv__io_active(&handle->io_watcher, POLLIN)) uv__handle_stop(handle); } handle->flags &= ~UV_HANDLE_UDP_PROCESSING; } static void uv__udp_io(uv_loop_t* loop, uv__io_t* w, unsigned int revents) { uv_udp_t* handle; handle = container_of(w, uv_udp_t, io_watcher); assert(handle->type == UV_UDP); if (revents & POLLIN) uv__udp_recvmsg(handle); if (revents & POLLOUT) { uv__udp_sendmsg(handle); uv__udp_run_completed(handle); } } #if HAVE_MMSG static int uv__udp_recvmmsg(uv_udp_t* handle, uv_buf_t* buf) { struct sockaddr_in6 peers[UV__MMSG_MAXWIDTH]; struct iovec iov[UV__MMSG_MAXWIDTH]; struct uv__mmsghdr msgs[UV__MMSG_MAXWIDTH]; ssize_t nread; uv_buf_t chunk_buf; size_t chunks; int flags; size_t k; /* prepare structures for recvmmsg */ chunks = buf->len / UV__UDP_DGRAM_MAXSIZE; if (chunks > ARRAY_SIZE(iov)) chunks = ARRAY_SIZE(iov); for (k = 0; k < chunks; ++k) { iov[k].iov_base = buf->base + k * UV__UDP_DGRAM_MAXSIZE; iov[k].iov_len = UV__UDP_DGRAM_MAXSIZE; msgs[k].msg_hdr.msg_iov = iov + k; msgs[k].msg_hdr.msg_iovlen = 1; msgs[k].msg_hdr.msg_name = peers + k; msgs[k].msg_hdr.msg_namelen = sizeof(peers[0]); msgs[k].msg_hdr.msg_control = NULL; msgs[k].msg_hdr.msg_controllen = 0; msgs[k].msg_hdr.msg_flags = 0; } do nread = uv__recvmmsg(handle->io_watcher.fd, msgs, chunks, 0, NULL); while (nread == -1 && errno == EINTR); if (nread < 1) { if (nread == 0 || errno == EAGAIN || errno == EWOULDBLOCK) handle->recv_cb(handle, 0, buf, NULL, 0); else handle->recv_cb(handle, UV__ERR(errno), buf, NULL, 0); } else { /* pass each chunk to the application */ for (k = 0; k < (size_t) nread && handle->recv_cb != NULL; k++) { flags = UV_UDP_MMSG_CHUNK; if (msgs[k].msg_hdr.msg_flags & MSG_TRUNC) flags |= UV_UDP_PARTIAL; chunk_buf = uv_buf_init(iov[k].iov_base, iov[k].iov_len); handle->recv_cb(handle, msgs[k].msg_len, &chunk_buf, msgs[k].msg_hdr.msg_name, flags); } /* one last callback so the original buffer is freed */ if (handle->recv_cb != NULL) handle->recv_cb(handle, 0, buf, NULL, 0); } return nread; } #endif static void uv__udp_recvmsg(uv_udp_t* handle) { struct sockaddr_storage peer; struct msghdr h; ssize_t nread; uv_buf_t buf; int flags; int count; assert(handle->recv_cb != NULL); assert(handle->alloc_cb != NULL); /* Prevent loop starvation when the data comes in as fast as (or faster than) * we can read it. XXX Need to rearm fd if we switch to edge-triggered I/O. */ count = 32; do { buf = uv_buf_init(NULL, 0); handle->alloc_cb((uv_handle_t*) handle, UV__UDP_DGRAM_MAXSIZE, &buf); if (buf.base == NULL || buf.len == 0) { handle->recv_cb(handle, UV_ENOBUFS, &buf, NULL, 0); return; } assert(buf.base != NULL); #if HAVE_MMSG if (handle->flags & UV_HANDLE_UDP_RECVMMSG) { uv_once(&once, uv__udp_mmsg_init); if (uv__recvmmsg_avail) { nread = uv__udp_recvmmsg(handle, &buf); if (nread > 0) count -= nread; continue; } } #endif memset(&h, 0, sizeof(h)); memset(&peer, 0, sizeof(peer)); h.msg_name = &peer; h.msg_namelen = sizeof(peer); h.msg_iov = (void*) &buf; h.msg_iovlen = 1; do { nread = recvmsg(handle->io_watcher.fd, &h, 0); } while (nread == -1 && errno == EINTR); if (nread == -1) { if (errno == EAGAIN || errno == EWOULDBLOCK) handle->recv_cb(handle, 0, &buf, NULL, 0); else handle->recv_cb(handle, UV__ERR(errno), &buf, NULL, 0); } else { flags = 0; if (h.msg_flags & MSG_TRUNC) flags |= UV_UDP_PARTIAL; handle->recv_cb(handle, nread, &buf, (const struct sockaddr*) &peer, flags); } count--; } /* recv_cb callback may decide to pause or close the handle */ while (nread != -1 && count > 0 && handle->io_watcher.fd != -1 && handle->recv_cb != NULL); } #if HAVE_MMSG static void uv__udp_sendmmsg(uv_udp_t* handle) { uv_udp_send_t* req; struct uv__mmsghdr h[UV__MMSG_MAXWIDTH]; struct uv__mmsghdr *p; QUEUE* q; ssize_t npkts; size_t pkts; size_t i; if (QUEUE_EMPTY(&handle->write_queue)) return; write_queue_drain: for (pkts = 0, q = QUEUE_HEAD(&handle->write_queue); pkts < UV__MMSG_MAXWIDTH && q != &handle->write_queue; ++pkts, q = QUEUE_HEAD(q)) { assert(q != NULL); req = QUEUE_DATA(q, uv_udp_send_t, queue); assert(req != NULL); p = &h[pkts]; memset(p, 0, sizeof(*p)); if (req->addr.ss_family == AF_UNSPEC) { p->msg_hdr.msg_name = NULL; p->msg_hdr.msg_namelen = 0; } else { p->msg_hdr.msg_name = &req->addr; if (req->addr.ss_family == AF_INET6) p->msg_hdr.msg_namelen = sizeof(struct sockaddr_in6); else if (req->addr.ss_family == AF_INET) p->msg_hdr.msg_namelen = sizeof(struct sockaddr_in); else if (req->addr.ss_family == AF_UNIX) p->msg_hdr.msg_namelen = sizeof(struct sockaddr_un); else { assert(0 && "unsupported address family"); abort(); } } h[pkts].msg_hdr.msg_iov = (struct iovec*) req->bufs; h[pkts].msg_hdr.msg_iovlen = req->nbufs; } do npkts = uv__sendmmsg(handle->io_watcher.fd, h, pkts, 0); while (npkts == -1 && errno == EINTR); if (npkts < 1) { if (errno == EAGAIN || errno == EWOULDBLOCK || errno == ENOBUFS) return; for (i = 0, q = QUEUE_HEAD(&handle->write_queue); i < pkts && q != &handle->write_queue; ++i, q = QUEUE_HEAD(q)) { assert(q != NULL); req = QUEUE_DATA(q, uv_udp_send_t, queue); assert(req != NULL); req->status = UV__ERR(errno); QUEUE_REMOVE(&req->queue); QUEUE_INSERT_TAIL(&handle->write_completed_queue, &req->queue); } uv__io_feed(handle->loop, &handle->io_watcher); return; } for (i = 0, q = QUEUE_HEAD(&handle->write_queue); i < pkts && q != &handle->write_queue; ++i, q = QUEUE_HEAD(&handle->write_queue)) { assert(q != NULL); req = QUEUE_DATA(q, uv_udp_send_t, queue); assert(req != NULL); req->status = req->bufs[0].len; /* Sending a datagram is an atomic operation: either all data * is written or nothing is (and EMSGSIZE is raised). That is * why we don't handle partial writes. Just pop the request * off the write queue and onto the completed queue, done. */ QUEUE_REMOVE(&req->queue); QUEUE_INSERT_TAIL(&handle->write_completed_queue, &req->queue); } /* couldn't batch everything, continue sending (jump to avoid stack growth) */ if (!QUEUE_EMPTY(&handle->write_queue)) goto write_queue_drain; uv__io_feed(handle->loop, &handle->io_watcher); return; } #endif static void uv__udp_sendmsg(uv_udp_t* handle) { uv_udp_send_t* req; struct msghdr h; QUEUE* q; ssize_t size; #if HAVE_MMSG uv_once(&once, uv__udp_mmsg_init); if (uv__sendmmsg_avail) { uv__udp_sendmmsg(handle); return; } #endif while (!QUEUE_EMPTY(&handle->write_queue)) { q = QUEUE_HEAD(&handle->write_queue); assert(q != NULL); req = QUEUE_DATA(q, uv_udp_send_t, queue); assert(req != NULL); memset(&h, 0, sizeof h); if (req->addr.ss_family == AF_UNSPEC) { h.msg_name = NULL; h.msg_namelen = 0; } else { h.msg_name = &req->addr; if (req->addr.ss_family == AF_INET6) h.msg_namelen = sizeof(struct sockaddr_in6); else if (req->addr.ss_family == AF_INET) h.msg_namelen = sizeof(struct sockaddr_in); else if (req->addr.ss_family == AF_UNIX) h.msg_namelen = sizeof(struct sockaddr_un); else { assert(0 && "unsupported address family"); abort(); } } h.msg_iov = (struct iovec*) req->bufs; h.msg_iovlen = req->nbufs; do { size = sendmsg(handle->io_watcher.fd, &h, 0); } while (size == -1 && errno == EINTR); if (size == -1) { if (errno == EAGAIN || errno == EWOULDBLOCK || errno == ENOBUFS) break; } req->status = (size == -1 ? UV__ERR(errno) : size); /* Sending a datagram is an atomic operation: either all data * is written or nothing is (and EMSGSIZE is raised). That is * why we don't handle partial writes. Just pop the request * off the write queue and onto the completed queue, done. */ QUEUE_REMOVE(&req->queue); QUEUE_INSERT_TAIL(&handle->write_completed_queue, &req->queue); uv__io_feed(handle->loop, &handle->io_watcher); } } /* On the BSDs, SO_REUSEPORT implies SO_REUSEADDR but with some additional * refinements for programs that use multicast. * * Linux as of 3.9 has a SO_REUSEPORT socket option but with semantics that * are different from the BSDs: it _shares_ the port rather than steal it * from the current listener. While useful, it's not something we can emulate * on other platforms so we don't enable it. * * zOS does not support getsockname with SO_REUSEPORT option when using * AF_UNIX. */ static int uv__set_reuse(int fd) { int yes; yes = 1; #if defined(SO_REUSEPORT) && defined(__MVS__) struct sockaddr_in sockfd; unsigned int sockfd_len = sizeof(sockfd); if (getsockname(fd, (struct sockaddr*) &sockfd, &sockfd_len) == -1) return UV__ERR(errno); if (sockfd.sin_family == AF_UNIX) { if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes))) return UV__ERR(errno); } else { if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &yes, sizeof(yes))) return UV__ERR(errno); } #elif defined(SO_REUSEPORT) && !defined(__linux__) if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &yes, sizeof(yes))) return UV__ERR(errno); #else if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes))) return UV__ERR(errno); #endif return 0; } int uv__udp_bind(uv_udp_t* handle, const struct sockaddr* addr, unsigned int addrlen, unsigned int flags) { int err; int yes; int fd; /* Check for bad flags. */ if (flags & ~(UV_UDP_IPV6ONLY | UV_UDP_REUSEADDR)) return UV_EINVAL; /* Cannot set IPv6-only mode on non-IPv6 socket. */ if ((flags & UV_UDP_IPV6ONLY) && addr->sa_family != AF_INET6) return UV_EINVAL; fd = handle->io_watcher.fd; if (fd == -1) { err = uv__socket(addr->sa_family, SOCK_DGRAM, 0); if (err < 0) return err; fd = err; handle->io_watcher.fd = fd; } if (flags & UV_UDP_REUSEADDR) { err = uv__set_reuse(fd); if (err) return err; } if (flags & UV_UDP_IPV6ONLY) { #ifdef IPV6_V6ONLY yes = 1; if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &yes, sizeof yes) == -1) { err = UV__ERR(errno); return err; } #else err = UV_ENOTSUP; return err; #endif } if (bind(fd, addr, addrlen)) { err = UV__ERR(errno); if (errno == EAFNOSUPPORT) /* OSX, other BSDs and SunoS fail with EAFNOSUPPORT when binding a * socket created with AF_INET to an AF_INET6 address or vice versa. */ err = UV_EINVAL; return err; } if (addr->sa_family == AF_INET6) handle->flags |= UV_HANDLE_IPV6; handle->flags |= UV_HANDLE_BOUND; return 0; } static int uv__udp_maybe_deferred_bind(uv_udp_t* handle, int domain, unsigned int flags) { union uv__sockaddr taddr; socklen_t addrlen; if (handle->io_watcher.fd != -1) return 0; switch (domain) { case AF_INET: { struct sockaddr_in* addr = &taddr.in; memset(addr, 0, sizeof *addr); addr->sin_family = AF_INET; addr->sin_addr.s_addr = INADDR_ANY; addrlen = sizeof *addr; break; } case AF_INET6: { struct sockaddr_in6* addr = &taddr.in6; memset(addr, 0, sizeof *addr); addr->sin6_family = AF_INET6; addr->sin6_addr = in6addr_any; addrlen = sizeof *addr; break; } default: assert(0 && "unsupported address family"); abort(); } return uv__udp_bind(handle, &taddr.addr, addrlen, flags); } int uv__udp_connect(uv_udp_t* handle, const struct sockaddr* addr, unsigned int addrlen) { int err; err = uv__udp_maybe_deferred_bind(handle, addr->sa_family, 0); if (err) return err; do { errno = 0; err = connect(handle->io_watcher.fd, addr, addrlen); } while (err == -1 && errno == EINTR); if (err) return UV__ERR(errno); handle->flags |= UV_HANDLE_UDP_CONNECTED; return 0; } int uv__udp_disconnect(uv_udp_t* handle) { int r; struct sockaddr addr; memset(&addr, 0, sizeof(addr)); addr.sa_family = AF_UNSPEC; do { errno = 0; r = connect(handle->io_watcher.fd, &addr, sizeof(addr)); } while (r == -1 && errno == EINTR); if (r == -1 && errno != EAFNOSUPPORT) return UV__ERR(errno); handle->flags &= ~UV_HANDLE_UDP_CONNECTED; return 0; } int uv__udp_send(uv_udp_send_t* req, uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr, unsigned int addrlen, uv_udp_send_cb send_cb) { int err; int empty_queue; assert(nbufs > 0); if (addr) { err = uv__udp_maybe_deferred_bind(handle, addr->sa_family, 0); if (err) return err; } /* It's legal for send_queue_count > 0 even when the write_queue is empty; * it means there are error-state requests in the write_completed_queue that * will touch up send_queue_size/count later. */ empty_queue = (handle->send_queue_count == 0); uv__req_init(handle->loop, req, UV_UDP_SEND); assert(addrlen <= sizeof(req->addr)); if (addr == NULL) req->addr.ss_family = AF_UNSPEC; else memcpy(&req->addr, addr, addrlen); req->send_cb = send_cb; req->handle = handle; req->nbufs = nbufs; req->bufs = req->bufsml; if (nbufs > ARRAY_SIZE(req->bufsml)) req->bufs = uv__malloc(nbufs * sizeof(bufs[0])); if (req->bufs == NULL) { uv__req_unregister(handle->loop, req); return UV_ENOMEM; } memcpy(req->bufs, bufs, nbufs * sizeof(bufs[0])); handle->send_queue_size += uv__count_bufs(req->bufs, req->nbufs); handle->send_queue_count++; QUEUE_INSERT_TAIL(&handle->write_queue, &req->queue); uv__handle_start(handle); if (empty_queue && !(handle->flags & UV_HANDLE_UDP_PROCESSING)) { uv__udp_sendmsg(handle); /* `uv__udp_sendmsg` may not be able to do non-blocking write straight * away. In such cases the `io_watcher` has to be queued for asynchronous * write. */ if (!QUEUE_EMPTY(&handle->write_queue)) uv__io_start(handle->loop, &handle->io_watcher, POLLOUT); } else { uv__io_start(handle->loop, &handle->io_watcher, POLLOUT); } return 0; } int uv__udp_try_send(uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr, unsigned int addrlen) { int err; struct msghdr h; ssize_t size; assert(nbufs > 0); /* already sending a message */ if (handle->send_queue_count != 0) return UV_EAGAIN; if (addr) { err = uv__udp_maybe_deferred_bind(handle, addr->sa_family, 0); if (err) return err; } else { assert(handle->flags & UV_HANDLE_UDP_CONNECTED); } memset(&h, 0, sizeof h); h.msg_name = (struct sockaddr*) addr; h.msg_namelen = addrlen; h.msg_iov = (struct iovec*) bufs; h.msg_iovlen = nbufs; do { size = sendmsg(handle->io_watcher.fd, &h, 0); } while (size == -1 && errno == EINTR); if (size == -1) { if (errno == EAGAIN || errno == EWOULDBLOCK || errno == ENOBUFS) return UV_EAGAIN; else return UV__ERR(errno); } return size; } static int uv__udp_set_membership4(uv_udp_t* handle, const struct sockaddr_in* multicast_addr, const char* interface_addr, uv_membership membership) { struct ip_mreq mreq; int optname; int err; memset(&mreq, 0, sizeof mreq); if (interface_addr) { err = uv_inet_pton(AF_INET, interface_addr, &mreq.imr_interface.s_addr); if (err) return err; } else { mreq.imr_interface.s_addr = htonl(INADDR_ANY); } mreq.imr_multiaddr.s_addr = multicast_addr->sin_addr.s_addr; switch (membership) { case UV_JOIN_GROUP: optname = IP_ADD_MEMBERSHIP; break; case UV_LEAVE_GROUP: optname = IP_DROP_MEMBERSHIP; break; default: return UV_EINVAL; } if (setsockopt(handle->io_watcher.fd, IPPROTO_IP, optname, &mreq, sizeof(mreq))) { #if defined(__MVS__) if (errno == ENXIO) return UV_ENODEV; #endif return UV__ERR(errno); } return 0; } static int uv__udp_set_membership6(uv_udp_t* handle, const struct sockaddr_in6* multicast_addr, const char* interface_addr, uv_membership membership) { int optname; struct ipv6_mreq mreq; struct sockaddr_in6 addr6; memset(&mreq, 0, sizeof mreq); if (interface_addr) { if (uv_ip6_addr(interface_addr, 0, &addr6)) return UV_EINVAL; mreq.ipv6mr_interface = addr6.sin6_scope_id; } else { mreq.ipv6mr_interface = 0; } mreq.ipv6mr_multiaddr = multicast_addr->sin6_addr; switch (membership) { case UV_JOIN_GROUP: optname = IPV6_ADD_MEMBERSHIP; break; case UV_LEAVE_GROUP: optname = IPV6_DROP_MEMBERSHIP; break; default: return UV_EINVAL; } if (setsockopt(handle->io_watcher.fd, IPPROTO_IPV6, optname, &mreq, sizeof(mreq))) { #if defined(__MVS__) if (errno == ENXIO) return UV_ENODEV; #endif return UV__ERR(errno); } return 0; } #if !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__ANDROID__) static int uv__udp_set_source_membership4(uv_udp_t* handle, const struct sockaddr_in* multicast_addr, const char* interface_addr, const struct sockaddr_in* source_addr, uv_membership membership) { struct ip_mreq_source mreq; int optname; int err; err = uv__udp_maybe_deferred_bind(handle, AF_INET, UV_UDP_REUSEADDR); if (err) return err; memset(&mreq, 0, sizeof(mreq)); if (interface_addr != NULL) { err = uv_inet_pton(AF_INET, interface_addr, &mreq.imr_interface.s_addr); if (err) return err; } else { mreq.imr_interface.s_addr = htonl(INADDR_ANY); } mreq.imr_multiaddr.s_addr = multicast_addr->sin_addr.s_addr; mreq.imr_sourceaddr.s_addr = source_addr->sin_addr.s_addr; if (membership == UV_JOIN_GROUP) optname = IP_ADD_SOURCE_MEMBERSHIP; else if (membership == UV_LEAVE_GROUP) optname = IP_DROP_SOURCE_MEMBERSHIP; else return UV_EINVAL; if (setsockopt(handle->io_watcher.fd, IPPROTO_IP, optname, &mreq, sizeof(mreq))) { return UV__ERR(errno); } return 0; } static int uv__udp_set_source_membership6(uv_udp_t* handle, const struct sockaddr_in6* multicast_addr, const char* interface_addr, const struct sockaddr_in6* source_addr, uv_membership membership) { struct group_source_req mreq; struct sockaddr_in6 addr6; int optname; int err; err = uv__udp_maybe_deferred_bind(handle, AF_INET6, UV_UDP_REUSEADDR); if (err) return err; memset(&mreq, 0, sizeof(mreq)); if (interface_addr != NULL) { err = uv_ip6_addr(interface_addr, 0, &addr6); if (err) return err; mreq.gsr_interface = addr6.sin6_scope_id; } else { mreq.gsr_interface = 0; } STATIC_ASSERT(sizeof(mreq.gsr_group) >= sizeof(*multicast_addr)); STATIC_ASSERT(sizeof(mreq.gsr_source) >= sizeof(*source_addr)); memcpy(&mreq.gsr_group, multicast_addr, sizeof(*multicast_addr)); memcpy(&mreq.gsr_source, source_addr, sizeof(*source_addr)); if (membership == UV_JOIN_GROUP) optname = MCAST_JOIN_SOURCE_GROUP; else if (membership == UV_LEAVE_GROUP) optname = MCAST_LEAVE_SOURCE_GROUP; else return UV_EINVAL; if (setsockopt(handle->io_watcher.fd, IPPROTO_IPV6, optname, &mreq, sizeof(mreq))) { return UV__ERR(errno); } return 0; } #endif int uv__udp_init_ex(uv_loop_t* loop, uv_udp_t* handle, unsigned flags, int domain) { int fd; fd = -1; if (domain != AF_UNSPEC) { fd = uv__socket(domain, SOCK_DGRAM, 0); if (fd < 0) return fd; } uv__handle_init(loop, (uv_handle_t*)handle, UV_UDP); handle->alloc_cb = NULL; handle->recv_cb = NULL; handle->send_queue_size = 0; handle->send_queue_count = 0; uv__io_init(&handle->io_watcher, uv__udp_io, fd); QUEUE_INIT(&handle->write_queue); QUEUE_INIT(&handle->write_completed_queue); return 0; } int uv_udp_open(uv_udp_t* handle, uv_os_sock_t sock) { int err; /* Check for already active socket. */ if (handle->io_watcher.fd != -1) return UV_EBUSY; if (uv__fd_exists(handle->loop, sock)) return UV_EEXIST; err = uv__nonblock(sock, 1); if (err) return err; err = uv__set_reuse(sock); if (err) return err; handle->io_watcher.fd = sock; if (uv__udp_is_connected(handle)) handle->flags |= UV_HANDLE_UDP_CONNECTED; return 0; } int uv_udp_set_membership(uv_udp_t* handle, const char* multicast_addr, const char* interface_addr, uv_membership membership) { int err; struct sockaddr_in addr4; struct sockaddr_in6 addr6; if (uv_ip4_addr(multicast_addr, 0, &addr4) == 0) { err = uv__udp_maybe_deferred_bind(handle, AF_INET, UV_UDP_REUSEADDR); if (err) return err; return uv__udp_set_membership4(handle, &addr4, interface_addr, membership); } else if (uv_ip6_addr(multicast_addr, 0, &addr6) == 0) { err = uv__udp_maybe_deferred_bind(handle, AF_INET6, UV_UDP_REUSEADDR); if (err) return err; return uv__udp_set_membership6(handle, &addr6, interface_addr, membership); } else { return UV_EINVAL; } } int uv_udp_set_source_membership(uv_udp_t* handle, const char* multicast_addr, const char* interface_addr, const char* source_addr, uv_membership membership) { #if !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__ANDROID__) int err; union uv__sockaddr mcast_addr; union uv__sockaddr src_addr; err = uv_ip4_addr(multicast_addr, 0, &mcast_addr.in); if (err) { err = uv_ip6_addr(multicast_addr, 0, &mcast_addr.in6); if (err) return err; err = uv_ip6_addr(source_addr, 0, &src_addr.in6); if (err) return err; return uv__udp_set_source_membership6(handle, &mcast_addr.in6, interface_addr, &src_addr.in6, membership); } err = uv_ip4_addr(source_addr, 0, &src_addr.in); if (err) return err; return uv__udp_set_source_membership4(handle, &mcast_addr.in, interface_addr, &src_addr.in, membership); #else return UV_ENOSYS; #endif } static int uv__setsockopt(uv_udp_t* handle, int option4, int option6, const void* val, socklen_t size) { int r; if (handle->flags & UV_HANDLE_IPV6) r = setsockopt(handle->io_watcher.fd, IPPROTO_IPV6, option6, val, size); else r = setsockopt(handle->io_watcher.fd, IPPROTO_IP, option4, val, size); if (r) return UV__ERR(errno); return 0; } static int uv__setsockopt_maybe_char(uv_udp_t* handle, int option4, int option6, int val) { #if defined(__sun) || defined(_AIX) || defined(__MVS__) char arg = val; #elif defined(__OpenBSD__) unsigned char arg = val; #else int arg = val; #endif if (val < 0 || val > 255) return UV_EINVAL; return uv__setsockopt(handle, option4, option6, &arg, sizeof(arg)); } int uv_udp_set_broadcast(uv_udp_t* handle, int on) { if (setsockopt(handle->io_watcher.fd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on))) { return UV__ERR(errno); } return 0; } int uv_udp_set_ttl(uv_udp_t* handle, int ttl) { if (ttl < 1 || ttl > 255) return UV_EINVAL; #if defined(__MVS__) if (!(handle->flags & UV_HANDLE_IPV6)) return UV_ENOTSUP; /* zOS does not support setting ttl for IPv4 */ #endif /* * On Solaris and derivatives such as SmartOS, the length of socket options * is sizeof(int) for IP_TTL and IPV6_UNICAST_HOPS, * so hardcode the size of these options on this platform, * and use the general uv__setsockopt_maybe_char call on other platforms. */ #if defined(__sun) || defined(_AIX) || defined(__OpenBSD__) || \ defined(__MVS__) return uv__setsockopt(handle, IP_TTL, IPV6_UNICAST_HOPS, &ttl, sizeof(ttl)); #else /* !(defined(__sun) || defined(_AIX) || defined (__OpenBSD__) || defined(__MVS__)) */ return uv__setsockopt_maybe_char(handle, IP_TTL, IPV6_UNICAST_HOPS, ttl); #endif /* defined(__sun) || defined(_AIX) || defined (__OpenBSD__) || defined(__MVS__) */ } int uv_udp_set_multicast_ttl(uv_udp_t* handle, int ttl) { /* * On Solaris and derivatives such as SmartOS, the length of socket options * is sizeof(int) for IPV6_MULTICAST_HOPS and sizeof(char) for * IP_MULTICAST_TTL, so hardcode the size of the option in the IPv6 case, * and use the general uv__setsockopt_maybe_char call otherwise. */ #if defined(__sun) || defined(_AIX) || defined(__OpenBSD__) || \ defined(__MVS__) if (handle->flags & UV_HANDLE_IPV6) return uv__setsockopt(handle, IP_MULTICAST_TTL, IPV6_MULTICAST_HOPS, &ttl, sizeof(ttl)); #endif /* defined(__sun) || defined(_AIX) || defined(__OpenBSD__) || \ defined(__MVS__) */ return uv__setsockopt_maybe_char(handle, IP_MULTICAST_TTL, IPV6_MULTICAST_HOPS, ttl); } int uv_udp_set_multicast_loop(uv_udp_t* handle, int on) { /* * On Solaris and derivatives such as SmartOS, the length of socket options * is sizeof(int) for IPV6_MULTICAST_LOOP and sizeof(char) for * IP_MULTICAST_LOOP, so hardcode the size of the option in the IPv6 case, * and use the general uv__setsockopt_maybe_char call otherwise. */ #if defined(__sun) || defined(_AIX) || defined(__OpenBSD__) || \ defined(__MVS__) if (handle->flags & UV_HANDLE_IPV6) return uv__setsockopt(handle, IP_MULTICAST_LOOP, IPV6_MULTICAST_LOOP, &on, sizeof(on)); #endif /* defined(__sun) || defined(_AIX) ||defined(__OpenBSD__) || defined(__MVS__) */ return uv__setsockopt_maybe_char(handle, IP_MULTICAST_LOOP, IPV6_MULTICAST_LOOP, on); } int uv_udp_set_multicast_interface(uv_udp_t* handle, const char* interface_addr) { struct sockaddr_storage addr_st; struct sockaddr_in* addr4; struct sockaddr_in6* addr6; addr4 = (struct sockaddr_in*) &addr_st; addr6 = (struct sockaddr_in6*) &addr_st; if (!interface_addr) { memset(&addr_st, 0, sizeof addr_st); if (handle->flags & UV_HANDLE_IPV6) { addr_st.ss_family = AF_INET6; addr6->sin6_scope_id = 0; } else { addr_st.ss_family = AF_INET; addr4->sin_addr.s_addr = htonl(INADDR_ANY); } } else if (uv_ip4_addr(interface_addr, 0, addr4) == 0) { /* nothing, address was parsed */ } else if (uv_ip6_addr(interface_addr, 0, addr6) == 0) { /* nothing, address was parsed */ } else { return UV_EINVAL; } if (addr_st.ss_family == AF_INET) { if (setsockopt(handle->io_watcher.fd, IPPROTO_IP, IP_MULTICAST_IF, (void*) &addr4->sin_addr, sizeof(addr4->sin_addr)) == -1) { return UV__ERR(errno); } } else if (addr_st.ss_family == AF_INET6) { if (setsockopt(handle->io_watcher.fd, IPPROTO_IPV6, IPV6_MULTICAST_IF, &addr6->sin6_scope_id, sizeof(addr6->sin6_scope_id)) == -1) { return UV__ERR(errno); } } else { assert(0 && "unexpected address family"); abort(); } return 0; } int uv_udp_getpeername(const uv_udp_t* handle, struct sockaddr* name, int* namelen) { return uv__getsockpeername((const uv_handle_t*) handle, getpeername, name, namelen); } int uv_udp_getsockname(const uv_udp_t* handle, struct sockaddr* name, int* namelen) { return uv__getsockpeername((const uv_handle_t*) handle, getsockname, name, namelen); } int uv__udp_recv_start(uv_udp_t* handle, uv_alloc_cb alloc_cb, uv_udp_recv_cb recv_cb) { int err; if (alloc_cb == NULL || recv_cb == NULL) return UV_EINVAL; if (uv__io_active(&handle->io_watcher, POLLIN)) return UV_EALREADY; /* FIXME(bnoordhuis) Should be UV_EBUSY. */ err = uv__udp_maybe_deferred_bind(handle, AF_INET, 0); if (err) return err; handle->alloc_cb = alloc_cb; handle->recv_cb = recv_cb; uv__io_start(handle->loop, &handle->io_watcher, POLLIN); uv__handle_start(handle); return 0; } int uv__udp_recv_stop(uv_udp_t* handle) { uv__io_stop(handle->loop, &handle->io_watcher, POLLIN); if (!uv__io_active(&handle->io_watcher, POLLOUT)) uv__handle_stop(handle); handle->alloc_cb = NULL; handle->recv_cb = NULL; return 0; } ================================================ FILE: external/libuv/src/uv-common.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "uv-common.h" #include #include #include #include /* NULL */ #include #include /* malloc */ #include /* memset */ #if defined(_WIN32) # include /* malloc */ #else # include /* if_nametoindex */ # include /* AF_UNIX, sockaddr_un */ #endif typedef struct { uv_malloc_func local_malloc; uv_realloc_func local_realloc; uv_calloc_func local_calloc; uv_free_func local_free; } uv__allocator_t; static uv__allocator_t uv__allocator = { malloc, realloc, calloc, free, }; char* uv__strdup(const char* s) { size_t len = strlen(s) + 1; char* m = (char *)uv__malloc(len); if (m == NULL) return NULL; return (char *)memcpy(m, s, len); } char* uv__strndup(const char* s, size_t n) { char* m; size_t len = strlen(s); if (n < len) len = n; m = (char *)uv__malloc(len + 1); if (m == NULL) return NULL; m[len] = '\0'; return (char *)memcpy(m, s, len); } void* uv__malloc(size_t size) { if (size > 0) return uv__allocator.local_malloc(size); return NULL; } void uv__free(void* ptr) { int saved_errno; /* Libuv expects that free() does not clobber errno. The system allocator * honors that assumption but custom allocators may not be so careful. */ saved_errno = errno; uv__allocator.local_free(ptr); errno = saved_errno; } void* uv__calloc(size_t count, size_t size) { return uv__allocator.local_calloc(count, size); } void* uv__realloc(void* ptr, size_t size) { if (size > 0) return uv__allocator.local_realloc(ptr, size); uv__free(ptr); return NULL; } void* uv__reallocf(void* ptr, size_t size) { void* newptr; newptr = uv__realloc(ptr, size); if (newptr == NULL) if (size > 0) uv__free(ptr); return newptr; } int uv_replace_allocator(uv_malloc_func malloc_func, uv_realloc_func realloc_func, uv_calloc_func calloc_func, uv_free_func free_func) { if (malloc_func == NULL || realloc_func == NULL || calloc_func == NULL || free_func == NULL) { return UV_EINVAL; } uv__allocator.local_malloc = malloc_func; uv__allocator.local_realloc = realloc_func; uv__allocator.local_calloc = calloc_func; uv__allocator.local_free = free_func; return 0; } #define XX(uc, lc) case UV_##uc: return sizeof(uv_##lc##_t); size_t uv_handle_size(uv_handle_type type) { switch (type) { UV_HANDLE_TYPE_MAP(XX) default: return -1; } } size_t uv_req_size(uv_req_type type) { switch(type) { UV_REQ_TYPE_MAP(XX) default: return -1; } } #undef XX size_t uv_loop_size(void) { return sizeof(uv_loop_t); } uv_buf_t uv_buf_init(char* base, unsigned int len) { uv_buf_t buf; buf.base = base; buf.len = len; return buf; } static const char* uv__unknown_err_code(int err) { char buf[32]; char* copy; snprintf(buf, sizeof(buf), "Unknown system error %d", err); copy = uv__strdup(buf); return copy != NULL ? copy : "Unknown system error"; } #define UV_ERR_NAME_GEN_R(name, _) \ case UV_## name: \ uv__strscpy(buf, #name, buflen); break; char* uv_err_name_r(int err, char* buf, size_t buflen) { switch (err) { UV_ERRNO_MAP(UV_ERR_NAME_GEN_R) default: snprintf(buf, buflen, "Unknown system error %d", err); } return buf; } #undef UV_ERR_NAME_GEN_R #define UV_ERR_NAME_GEN(name, _) case UV_ ## name: return #name; const char* uv_err_name(int err) { switch (err) { UV_ERRNO_MAP(UV_ERR_NAME_GEN) } return uv__unknown_err_code(err); } #undef UV_ERR_NAME_GEN #define UV_STRERROR_GEN_R(name, msg) \ case UV_ ## name: \ snprintf(buf, buflen, "%s", msg); break; char* uv_strerror_r(int err, char* buf, size_t buflen) { switch (err) { UV_ERRNO_MAP(UV_STRERROR_GEN_R) default: snprintf(buf, buflen, "Unknown system error %d", err); } return buf; } #undef UV_STRERROR_GEN_R #define UV_STRERROR_GEN(name, msg) case UV_ ## name: return msg; const char* uv_strerror(int err) { switch (err) { UV_ERRNO_MAP(UV_STRERROR_GEN) } return uv__unknown_err_code(err); } #undef UV_STRERROR_GEN int uv_ip4_addr(const char* ip, int port, struct sockaddr_in* addr) { memset(addr, 0, sizeof(*addr)); addr->sin_family = AF_INET; addr->sin_port = htons(port); #ifdef SIN6_LEN addr->sin_len = sizeof(*addr); #endif return uv_inet_pton(AF_INET, ip, &(addr->sin_addr.s_addr)); } int uv_ip6_addr(const char* ip, int port, struct sockaddr_in6* addr) { char address_part[40]; size_t address_part_size; const char* zone_index; memset(addr, 0, sizeof(*addr)); addr->sin6_family = AF_INET6; addr->sin6_port = htons(port); #ifdef SIN6_LEN addr->sin6_len = sizeof(*addr); #endif zone_index = strchr(ip, '%'); if (zone_index != NULL) { address_part_size = zone_index - ip; if (address_part_size >= sizeof(address_part)) address_part_size = sizeof(address_part) - 1; memcpy(address_part, ip, address_part_size); address_part[address_part_size] = '\0'; ip = address_part; zone_index++; /* skip '%' */ /* NOTE: unknown interface (id=0) is silently ignored */ #ifdef _WIN32 addr->sin6_scope_id = atoi(zone_index); #else addr->sin6_scope_id = if_nametoindex(zone_index); #endif } return uv_inet_pton(AF_INET6, ip, &addr->sin6_addr); } int uv_ip4_name(const struct sockaddr_in* src, char* dst, size_t size) { return uv_inet_ntop(AF_INET, &src->sin_addr, dst, size); } int uv_ip6_name(const struct sockaddr_in6* src, char* dst, size_t size) { return uv_inet_ntop(AF_INET6, &src->sin6_addr, dst, size); } int uv_tcp_bind(uv_tcp_t* handle, const struct sockaddr* addr, unsigned int flags) { unsigned int addrlen; if (handle->type != UV_TCP) return UV_EINVAL; if (addr->sa_family == AF_INET) addrlen = sizeof(struct sockaddr_in); else if (addr->sa_family == AF_INET6) addrlen = sizeof(struct sockaddr_in6); else return UV_EINVAL; return uv__tcp_bind(handle, addr, addrlen, flags); } int uv_udp_init_ex(uv_loop_t* loop, uv_udp_t* handle, unsigned flags) { unsigned extra_flags; int domain; int rc; /* Use the lower 8 bits for the domain. */ domain = flags & 0xFF; if (domain != AF_INET && domain != AF_INET6 && domain != AF_UNSPEC) return UV_EINVAL; /* Use the higher bits for extra flags. */ extra_flags = flags & ~0xFF; if (extra_flags & ~UV_UDP_RECVMMSG) return UV_EINVAL; rc = uv__udp_init_ex(loop, handle, flags, domain); if (rc == 0) if (extra_flags & UV_UDP_RECVMMSG) handle->flags |= UV_HANDLE_UDP_RECVMMSG; return rc; } int uv_udp_init(uv_loop_t* loop, uv_udp_t* handle) { return uv_udp_init_ex(loop, handle, AF_UNSPEC); } int uv_udp_bind(uv_udp_t* handle, const struct sockaddr* addr, unsigned int flags) { unsigned int addrlen; if (handle->type != UV_UDP) return UV_EINVAL; if (addr->sa_family == AF_INET) addrlen = sizeof(struct sockaddr_in); else if (addr->sa_family == AF_INET6) addrlen = sizeof(struct sockaddr_in6); else return UV_EINVAL; return uv__udp_bind(handle, addr, addrlen, flags); } int uv_tcp_connect(uv_connect_t* req, uv_tcp_t* handle, const struct sockaddr* addr, uv_connect_cb cb) { unsigned int addrlen; if (handle->type != UV_TCP) return UV_EINVAL; if (addr->sa_family == AF_INET) addrlen = sizeof(struct sockaddr_in); else if (addr->sa_family == AF_INET6) addrlen = sizeof(struct sockaddr_in6); else return UV_EINVAL; return uv__tcp_connect(req, handle, addr, addrlen, cb); } int uv_udp_connect(uv_udp_t* handle, const struct sockaddr* addr) { unsigned int addrlen; if (handle->type != UV_UDP) return UV_EINVAL; /* Disconnect the handle */ if (addr == NULL) { if (!(handle->flags & UV_HANDLE_UDP_CONNECTED)) return UV_ENOTCONN; return uv__udp_disconnect(handle); } if (addr->sa_family == AF_INET) addrlen = sizeof(struct sockaddr_in); else if (addr->sa_family == AF_INET6) addrlen = sizeof(struct sockaddr_in6); else return UV_EINVAL; if (handle->flags & UV_HANDLE_UDP_CONNECTED) return UV_EISCONN; return uv__udp_connect(handle, addr, addrlen); } int uv__udp_is_connected(uv_udp_t* handle) { struct sockaddr_storage addr; int addrlen; if (handle->type != UV_UDP) return 0; addrlen = sizeof(addr); if (uv_udp_getpeername(handle, (struct sockaddr*) &addr, &addrlen) != 0) return 0; return addrlen > 0; } int uv__udp_check_before_send(uv_udp_t* handle, const struct sockaddr* addr) { unsigned int addrlen; if (handle->type != UV_UDP) return UV_EINVAL; if (addr != NULL && (handle->flags & UV_HANDLE_UDP_CONNECTED)) return UV_EISCONN; if (addr == NULL && !(handle->flags & UV_HANDLE_UDP_CONNECTED)) return UV_EDESTADDRREQ; if (addr != NULL) { if (addr->sa_family == AF_INET) addrlen = sizeof(struct sockaddr_in); else if (addr->sa_family == AF_INET6) addrlen = sizeof(struct sockaddr_in6); #if defined(AF_UNIX) && !defined(_WIN32) else if (addr->sa_family == AF_UNIX) addrlen = sizeof(struct sockaddr_un); #endif else return UV_EINVAL; } else { addrlen = 0; } return addrlen; } int uv_udp_send(uv_udp_send_t* req, uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr, uv_udp_send_cb send_cb) { int addrlen; addrlen = uv__udp_check_before_send(handle, addr); if (addrlen < 0) return addrlen; return uv__udp_send(req, handle, bufs, nbufs, addr, addrlen, send_cb); } int uv_udp_try_send(uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr) { int addrlen; addrlen = uv__udp_check_before_send(handle, addr); if (addrlen < 0) return addrlen; return uv__udp_try_send(handle, bufs, nbufs, addr, addrlen); } int uv_udp_recv_start(uv_udp_t* handle, uv_alloc_cb alloc_cb, uv_udp_recv_cb recv_cb) { if (handle->type != UV_UDP || alloc_cb == NULL || recv_cb == NULL) return UV_EINVAL; else return uv__udp_recv_start(handle, alloc_cb, recv_cb); } int uv_udp_recv_stop(uv_udp_t* handle) { if (handle->type != UV_UDP) return UV_EINVAL; else return uv__udp_recv_stop(handle); } void uv_walk(uv_loop_t* loop, uv_walk_cb walk_cb, void* arg) { QUEUE queue; QUEUE* q; uv_handle_t* h; QUEUE_MOVE(&loop->handle_queue, &queue); while (!QUEUE_EMPTY(&queue)) { q = QUEUE_HEAD(&queue); h = QUEUE_DATA(q, uv_handle_t, handle_queue); QUEUE_REMOVE(q); QUEUE_INSERT_TAIL(&loop->handle_queue, q); if (h->flags & UV_HANDLE_INTERNAL) continue; walk_cb(h, arg); } } static void uv__print_handles(uv_loop_t* loop, int only_active, FILE* stream) { const char* type; QUEUE* q; uv_handle_t* h; if (loop == NULL) loop = uv_default_loop(); QUEUE_FOREACH(q, &loop->handle_queue) { h = QUEUE_DATA(q, uv_handle_t, handle_queue); if (only_active && !uv__is_active(h)) continue; switch (h->type) { #define X(uc, lc) case UV_##uc: type = #lc; break; UV_HANDLE_TYPE_MAP(X) #undef X default: type = ""; } fprintf(stream, "[%c%c%c] %-8s %p\n", "R-"[!(h->flags & UV_HANDLE_REF)], "A-"[!(h->flags & UV_HANDLE_ACTIVE)], "I-"[!(h->flags & UV_HANDLE_INTERNAL)], type, (void*)h); } } void uv_print_all_handles(uv_loop_t* loop, FILE* stream) { uv__print_handles(loop, 0, stream); } void uv_print_active_handles(uv_loop_t* loop, FILE* stream) { uv__print_handles(loop, 1, stream); } void uv_ref(uv_handle_t* handle) { uv__handle_ref(handle); } void uv_unref(uv_handle_t* handle) { uv__handle_unref(handle); } int uv_has_ref(const uv_handle_t* handle) { return uv__has_ref(handle); } void uv_stop(uv_loop_t* loop) { loop->stop_flag = 1; } uint64_t uv_now(const uv_loop_t* loop) { return loop->time; } size_t uv__count_bufs(const uv_buf_t bufs[], unsigned int nbufs) { unsigned int i; size_t bytes; bytes = 0; for (i = 0; i < nbufs; i++) bytes += (size_t) bufs[i].len; return bytes; } int uv_recv_buffer_size(uv_handle_t* handle, int* value) { return uv__socket_sockopt(handle, SO_RCVBUF, value); } int uv_send_buffer_size(uv_handle_t* handle, int *value) { return uv__socket_sockopt(handle, SO_SNDBUF, value); } int uv_fs_event_getpath(uv_fs_event_t* handle, char* buffer, size_t* size) { size_t required_len; if (!uv__is_active(handle)) { *size = 0; return UV_EINVAL; } required_len = strlen(handle->path); if (required_len >= *size) { *size = required_len + 1; return UV_ENOBUFS; } memcpy(buffer, handle->path, required_len); *size = required_len; buffer[required_len] = '\0'; return 0; } /* The windows implementation does not have the same structure layout as * the unix implementation (nbufs is not directly inside req but is * contained in a nested union/struct) so this function locates it. */ static unsigned int* uv__get_nbufs(uv_fs_t* req) { #ifdef _WIN32 return &req->fs.info.nbufs; #else return &req->nbufs; #endif } /* uv_fs_scandir() uses the system allocator to allocate memory on non-Windows * systems. So, the memory should be released using free(). On Windows, * uv__malloc() is used, so use uv__free() to free memory. */ #ifdef _WIN32 # define uv__fs_scandir_free uv__free #else # define uv__fs_scandir_free free #endif void uv__fs_scandir_cleanup(uv_fs_t* req) { uv__dirent_t** dents; unsigned int* nbufs = uv__get_nbufs(req); dents = (uv__dirent_t **)req->ptr; if (*nbufs > 0 && *nbufs != (unsigned int) req->result) (*nbufs)--; for (; *nbufs < (unsigned int) req->result; (*nbufs)++) uv__fs_scandir_free(dents[*nbufs]); uv__fs_scandir_free(req->ptr); req->ptr = NULL; } int uv_fs_scandir_next(uv_fs_t* req, uv_dirent_t* ent) { uv__dirent_t** dents; uv__dirent_t* dent; unsigned int* nbufs; /* Check to see if req passed */ if (req->result < 0) return req->result; /* Ptr will be null if req was canceled or no files found */ if (!req->ptr) return UV_EOF; nbufs = uv__get_nbufs(req); assert(nbufs); dents = (uv__dirent_t **)req->ptr; /* Free previous entity */ if (*nbufs > 0) uv__fs_scandir_free(dents[*nbufs - 1]); /* End was already reached */ if (*nbufs == (unsigned int) req->result) { uv__fs_scandir_free(dents); req->ptr = NULL; return UV_EOF; } dent = dents[(*nbufs)++]; ent->name = dent->d_name; ent->type = uv__fs_get_dirent_type(dent); return 0; } uv_dirent_type_t uv__fs_get_dirent_type(uv__dirent_t* dent) { uv_dirent_type_t type; #ifdef HAVE_DIRENT_TYPES switch (dent->d_type) { case UV__DT_DIR: type = UV_DIRENT_DIR; break; case UV__DT_FILE: type = UV_DIRENT_FILE; break; case UV__DT_LINK: type = UV_DIRENT_LINK; break; case UV__DT_FIFO: type = UV_DIRENT_FIFO; break; case UV__DT_SOCKET: type = UV_DIRENT_SOCKET; break; case UV__DT_CHAR: type = UV_DIRENT_CHAR; break; case UV__DT_BLOCK: type = UV_DIRENT_BLOCK; break; default: type = UV_DIRENT_UNKNOWN; } #else type = UV_DIRENT_UNKNOWN; #endif return type; } void uv__fs_readdir_cleanup(uv_fs_t* req) { uv_dir_t* dir; uv_dirent_t* dirents; int i; if (req->ptr == NULL) return; dir = (uv_dir_t *)req->ptr; dirents = dir->dirents; req->ptr = NULL; if (dirents == NULL) return; for (i = 0; i < req->result; ++i) { uv__free((char*) dirents[i].name); dirents[i].name = NULL; } } int uv_loop_configure(uv_loop_t* loop, uv_loop_option option, ...) { va_list ap; int err; va_start(ap, option); /* Any platform-agnostic options should be handled here. */ err = uv__loop_configure(loop, option, ap); va_end(ap); return err; } static uv_loop_t default_loop_struct; static uv_loop_t* default_loop_ptr; uv_loop_t* uv_default_loop(void) { if (default_loop_ptr != NULL) return default_loop_ptr; if (uv_loop_init(&default_loop_struct)) return NULL; default_loop_ptr = &default_loop_struct; return default_loop_ptr; } uv_loop_t* uv_loop_new(void) { uv_loop_t* loop; loop = (uv_loop_t *)uv__malloc(sizeof(*loop)); if (loop == NULL) return NULL; if (uv_loop_init(loop)) { uv__free(loop); return NULL; } return loop; } int uv_loop_close(uv_loop_t* loop) { QUEUE* q; uv_handle_t* h; #ifndef NDEBUG void* saved_data; #endif if (uv__has_active_reqs(loop)) return UV_EBUSY; QUEUE_FOREACH(q, &loop->handle_queue) { h = QUEUE_DATA(q, uv_handle_t, handle_queue); if (!(h->flags & UV_HANDLE_INTERNAL)) return UV_EBUSY; } uv__loop_close(loop); #ifndef NDEBUG saved_data = loop->data; memset(loop, -1, sizeof(*loop)); loop->data = saved_data; #endif if (loop == default_loop_ptr) default_loop_ptr = NULL; return 0; } void uv_loop_delete(uv_loop_t* loop) { uv_loop_t* default_loop; int err; default_loop = default_loop_ptr; err = uv_loop_close(loop); (void) err; /* Squelch compiler warnings. */ assert(err == 0); if (loop != default_loop) uv__free(loop); } void uv_os_free_environ(uv_env_item_t* envitems, int count) { int i; for (i = 0; i < count; i++) { uv__free(envitems[i].name); } uv__free(envitems); } void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) { int i; for (i = 0; i < count; i++) uv__free(cpu_infos[i].model); uv__free(cpu_infos); } #ifdef __GNUC__ /* Also covers __clang__ and __INTEL_COMPILER. */ __attribute__((destructor)) #endif void uv_library_shutdown(void) { static int was_shutdown; if (was_shutdown) return; uv__process_title_cleanup(); uv__signal_cleanup(); uv__threadpool_cleanup(); was_shutdown = 1; } ================================================ FILE: external/libuv/src/uv-common.h ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ /* * This file is private to libuv. It provides common functionality to both * Windows and Unix backends. */ #ifndef UV_COMMON_H_ #define UV_COMMON_H_ #include #include #include #if defined(_MSC_VER) && _MSC_VER < 1600 # include "uv/stdint-msvc2008.h" #else # include #endif #include "uv.h" #include "uv/tree.h" #include "queue.h" #include "strscpy.h" #if EDOM > 0 # define UV__ERR(x) (-(x)) #else # define UV__ERR(x) (x) #endif #if !defined(snprintf) && defined(_MSC_VER) && _MSC_VER < 1900 extern int snprintf(char*, size_t, const char*, ...); #endif #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) #define container_of(ptr, type, member) \ ((type *) ((char *) (ptr) - offsetof(type, member))) #define STATIC_ASSERT(expr) \ void uv__static_assert(int static_assert_failed[1 - 2 * !(expr)]) /* Handle flags. Some flags are specific to Windows or UNIX. */ enum { /* Used by all handles. */ UV_HANDLE_CLOSING = 0x00000001, UV_HANDLE_CLOSED = 0x00000002, UV_HANDLE_ACTIVE = 0x00000004, UV_HANDLE_REF = 0x00000008, UV_HANDLE_INTERNAL = 0x00000010, UV_HANDLE_ENDGAME_QUEUED = 0x00000020, /* Used by streams. */ UV_HANDLE_LISTENING = 0x00000040, UV_HANDLE_CONNECTION = 0x00000080, UV_HANDLE_SHUTTING = 0x00000100, UV_HANDLE_SHUT = 0x00000200, UV_HANDLE_READ_PARTIAL = 0x00000400, UV_HANDLE_READ_EOF = 0x00000800, /* Used by streams and UDP handles. */ UV_HANDLE_READING = 0x00001000, UV_HANDLE_BOUND = 0x00002000, UV_HANDLE_READABLE = 0x00004000, UV_HANDLE_WRITABLE = 0x00008000, UV_HANDLE_READ_PENDING = 0x00010000, UV_HANDLE_SYNC_BYPASS_IOCP = 0x00020000, UV_HANDLE_ZERO_READ = 0x00040000, UV_HANDLE_EMULATE_IOCP = 0x00080000, UV_HANDLE_BLOCKING_WRITES = 0x00100000, UV_HANDLE_CANCELLATION_PENDING = 0x00200000, /* Used by uv_tcp_t and uv_udp_t handles */ UV_HANDLE_IPV6 = 0x00400000, /* Only used by uv_tcp_t handles. */ UV_HANDLE_TCP_NODELAY = 0x01000000, UV_HANDLE_TCP_KEEPALIVE = 0x02000000, UV_HANDLE_TCP_SINGLE_ACCEPT = 0x04000000, UV_HANDLE_TCP_ACCEPT_STATE_CHANGING = 0x08000000, UV_HANDLE_TCP_SOCKET_CLOSED = 0x10000000, UV_HANDLE_SHARED_TCP_SOCKET = 0x20000000, /* Only used by uv_udp_t handles. */ UV_HANDLE_UDP_PROCESSING = 0x01000000, UV_HANDLE_UDP_CONNECTED = 0x02000000, UV_HANDLE_UDP_RECVMMSG = 0x04000000, /* Only used by uv_pipe_t handles. */ UV_HANDLE_NON_OVERLAPPED_PIPE = 0x01000000, UV_HANDLE_PIPESERVER = 0x02000000, /* Only used by uv_tty_t handles. */ UV_HANDLE_TTY_READABLE = 0x01000000, UV_HANDLE_TTY_RAW = 0x02000000, UV_HANDLE_TTY_SAVED_POSITION = 0x04000000, UV_HANDLE_TTY_SAVED_ATTRIBUTES = 0x08000000, /* Only used by uv_signal_t handles. */ UV_SIGNAL_ONE_SHOT_DISPATCHED = 0x01000000, UV_SIGNAL_ONE_SHOT = 0x02000000, /* Only used by uv_poll_t handles. */ UV_HANDLE_POLL_SLOW = 0x01000000 }; int uv__loop_configure(uv_loop_t* loop, uv_loop_option option, va_list ap); void uv__loop_close(uv_loop_t* loop); int uv__tcp_bind(uv_tcp_t* tcp, const struct sockaddr* addr, unsigned int addrlen, unsigned int flags); int uv__tcp_connect(uv_connect_t* req, uv_tcp_t* handle, const struct sockaddr* addr, unsigned int addrlen, uv_connect_cb cb); int uv__udp_init_ex(uv_loop_t* loop, uv_udp_t* handle, unsigned flags, int domain); int uv__udp_bind(uv_udp_t* handle, const struct sockaddr* addr, unsigned int addrlen, unsigned int flags); int uv__udp_connect(uv_udp_t* handle, const struct sockaddr* addr, unsigned int addrlen); int uv__udp_disconnect(uv_udp_t* handle); int uv__udp_is_connected(uv_udp_t* handle); int uv__udp_send(uv_udp_send_t* req, uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr, unsigned int addrlen, uv_udp_send_cb send_cb); int uv__udp_try_send(uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr, unsigned int addrlen); int uv__udp_recv_start(uv_udp_t* handle, uv_alloc_cb alloccb, uv_udp_recv_cb recv_cb); int uv__udp_recv_stop(uv_udp_t* handle); void uv__fs_poll_close(uv_fs_poll_t* handle); int uv__getaddrinfo_translate_error(int sys_err); /* EAI_* error. */ enum uv__work_kind { UV__WORK_CPU, UV__WORK_FAST_IO, UV__WORK_SLOW_IO }; void uv__work_submit(uv_loop_t* loop, struct uv__work *w, enum uv__work_kind kind, void (*work)(struct uv__work *w), void (*done)(struct uv__work *w, int status)); void uv__work_done(uv_async_t* handle); size_t uv__count_bufs(const uv_buf_t bufs[], unsigned int nbufs); int uv__socket_sockopt(uv_handle_t* handle, int optname, int* value); void uv__fs_scandir_cleanup(uv_fs_t* req); void uv__fs_readdir_cleanup(uv_fs_t* req); uv_dirent_type_t uv__fs_get_dirent_type(uv__dirent_t* dent); int uv__next_timeout(const uv_loop_t* loop); void uv__run_timers(uv_loop_t* loop); void uv__timer_close(uv_timer_t* handle); void uv__process_title_cleanup(void); void uv__signal_cleanup(void); void uv__threadpool_cleanup(void); #define uv__has_active_reqs(loop) \ ((loop)->active_reqs.count > 0) #define uv__req_register(loop, req) \ do { \ (loop)->active_reqs.count++; \ } \ while (0) #define uv__req_unregister(loop, req) \ do { \ assert(uv__has_active_reqs(loop)); \ (loop)->active_reqs.count--; \ } \ while (0) #define uv__has_active_handles(loop) \ ((loop)->active_handles > 0) #define uv__active_handle_add(h) \ do { \ (h)->loop->active_handles++; \ } \ while (0) #define uv__active_handle_rm(h) \ do { \ (h)->loop->active_handles--; \ } \ while (0) #define uv__is_active(h) \ (((h)->flags & UV_HANDLE_ACTIVE) != 0) #define uv__is_closing(h) \ (((h)->flags & (UV_HANDLE_CLOSING | UV_HANDLE_CLOSED)) != 0) #define uv__handle_start(h) \ do { \ if (((h)->flags & UV_HANDLE_ACTIVE) != 0) break; \ (h)->flags |= UV_HANDLE_ACTIVE; \ if (((h)->flags & UV_HANDLE_REF) != 0) uv__active_handle_add(h); \ } \ while (0) #define uv__handle_stop(h) \ do { \ if (((h)->flags & UV_HANDLE_ACTIVE) == 0) break; \ (h)->flags &= ~UV_HANDLE_ACTIVE; \ if (((h)->flags & UV_HANDLE_REF) != 0) uv__active_handle_rm(h); \ } \ while (0) #define uv__handle_ref(h) \ do { \ if (((h)->flags & UV_HANDLE_REF) != 0) break; \ (h)->flags |= UV_HANDLE_REF; \ if (((h)->flags & UV_HANDLE_CLOSING) != 0) break; \ if (((h)->flags & UV_HANDLE_ACTIVE) != 0) uv__active_handle_add(h); \ } \ while (0) #define uv__handle_unref(h) \ do { \ if (((h)->flags & UV_HANDLE_REF) == 0) break; \ (h)->flags &= ~UV_HANDLE_REF; \ if (((h)->flags & UV_HANDLE_CLOSING) != 0) break; \ if (((h)->flags & UV_HANDLE_ACTIVE) != 0) uv__active_handle_rm(h); \ } \ while (0) #define uv__has_ref(h) \ (((h)->flags & UV_HANDLE_REF) != 0) #if defined(_WIN32) # define uv__handle_platform_init(h) ((h)->u.fd = -1) #else # define uv__handle_platform_init(h) ((h)->next_closing = NULL) #endif #define uv__handle_init(loop_, h, type_) \ do { \ (h)->loop = (loop_); \ (h)->type = (type_); \ (h)->flags = UV_HANDLE_REF; /* Ref the loop when active. */ \ QUEUE_INSERT_TAIL(&(loop_)->handle_queue, &(h)->handle_queue); \ uv__handle_platform_init(h); \ } \ while (0) /* Note: uses an open-coded version of SET_REQ_SUCCESS() because of * a circular dependency between src/uv-common.h and src/win/internal.h. */ #if defined(_WIN32) # define UV_REQ_INIT(req, typ) \ do { \ (req)->type = (typ); \ (req)->u.io.overlapped.Internal = 0; /* SET_REQ_SUCCESS() */ \ } \ while (0) #else # define UV_REQ_INIT(req, typ) \ do { \ (req)->type = (typ); \ } \ while (0) #endif #define uv__req_init(loop, req, typ) \ do { \ UV_REQ_INIT(req, typ); \ uv__req_register(loop, req); \ } \ while (0) /* Allocator prototypes */ void *uv__calloc(size_t count, size_t size); char *uv__strdup(const char* s); char *uv__strndup(const char* s, size_t n); void* uv__malloc(size_t size); void uv__free(void* ptr); void* uv__realloc(void* ptr, size_t size); void* uv__reallocf(void* ptr, size_t size); #endif /* UV_COMMON_H_ */ ================================================ FILE: external/libuv/src/uv-data-getter-setters.c ================================================ #include "uv.h" const char* uv_handle_type_name(uv_handle_type type) { switch (type) { #define XX(uc,lc) case UV_##uc: return #lc; UV_HANDLE_TYPE_MAP(XX) #undef XX case UV_FILE: return "file"; case UV_HANDLE_TYPE_MAX: case UV_UNKNOWN_HANDLE: return NULL; } return NULL; } uv_handle_type uv_handle_get_type(const uv_handle_t* handle) { return handle->type; } void* uv_handle_get_data(const uv_handle_t* handle) { return handle->data; } uv_loop_t* uv_handle_get_loop(const uv_handle_t* handle) { return handle->loop; } void uv_handle_set_data(uv_handle_t* handle, void* data) { handle->data = data; } const char* uv_req_type_name(uv_req_type type) { switch (type) { #define XX(uc,lc) case UV_##uc: return #lc; UV_REQ_TYPE_MAP(XX) #undef XX case UV_REQ_TYPE_MAX: case UV_UNKNOWN_REQ: default: /* UV_REQ_TYPE_PRIVATE */ break; } return NULL; } uv_req_type uv_req_get_type(const uv_req_t* req) { return req->type; } void* uv_req_get_data(const uv_req_t* req) { return req->data; } void uv_req_set_data(uv_req_t* req, void* data) { req->data = data; } size_t uv_stream_get_write_queue_size(const uv_stream_t* stream) { return stream->write_queue_size; } size_t uv_udp_get_send_queue_size(const uv_udp_t* handle) { return handle->send_queue_size; } size_t uv_udp_get_send_queue_count(const uv_udp_t* handle) { return handle->send_queue_count; } uv_pid_t uv_process_get_pid(const uv_process_t* proc) { return proc->pid; } uv_fs_type uv_fs_get_type(const uv_fs_t* req) { return req->fs_type; } ssize_t uv_fs_get_result(const uv_fs_t* req) { return req->result; } void* uv_fs_get_ptr(const uv_fs_t* req) { return req->ptr; } const char* uv_fs_get_path(const uv_fs_t* req) { return req->path; } uv_stat_t* uv_fs_get_statbuf(uv_fs_t* req) { return &req->statbuf; } void* uv_loop_get_data(const uv_loop_t* loop) { return loop->data; } void uv_loop_set_data(uv_loop_t* loop, void* data) { loop->data = data; } ================================================ FILE: external/libuv/src/version.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #define UV_STRINGIFY(v) UV_STRINGIFY_HELPER(v) #define UV_STRINGIFY_HELPER(v) #v #define UV_VERSION_STRING_BASE UV_STRINGIFY(UV_VERSION_MAJOR) "." \ UV_STRINGIFY(UV_VERSION_MINOR) "." \ UV_STRINGIFY(UV_VERSION_PATCH) #if UV_VERSION_IS_RELEASE # define UV_VERSION_STRING UV_VERSION_STRING_BASE #else # define UV_VERSION_STRING UV_VERSION_STRING_BASE "-" UV_VERSION_SUFFIX #endif unsigned int uv_version(void) { return UV_VERSION_HEX; } const char* uv_version_string(void) { return UV_VERSION_STRING; } ================================================ FILE: external/libuv/src/win/async.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include "uv.h" #include "internal.h" #include "atomicops-inl.h" #include "handle-inl.h" #include "req-inl.h" void uv_async_endgame(uv_loop_t* loop, uv_async_t* handle) { if (handle->flags & UV_HANDLE_CLOSING && !handle->async_sent) { assert(!(handle->flags & UV_HANDLE_CLOSED)); uv__handle_close(handle); } } int uv_async_init(uv_loop_t* loop, uv_async_t* handle, uv_async_cb async_cb) { uv_req_t* req; uv__handle_init(loop, (uv_handle_t*) handle, UV_ASYNC); handle->async_sent = 0; handle->async_cb = async_cb; req = &handle->async_req; UV_REQ_INIT(req, UV_WAKEUP); req->data = handle; uv__handle_start(handle); return 0; } void uv_async_close(uv_loop_t* loop, uv_async_t* handle) { if (!((uv_async_t*)handle)->async_sent) { uv_want_endgame(loop, (uv_handle_t*) handle); } uv__handle_closing(handle); } int uv_async_send(uv_async_t* handle) { uv_loop_t* loop = handle->loop; if (handle->type != UV_ASYNC) { /* Can't set errno because that's not thread-safe. */ return -1; } /* The user should make sure never to call uv_async_send to a closing or * closed handle. */ assert(!(handle->flags & UV_HANDLE_CLOSING)); if (!uv__atomic_exchange_set(&handle->async_sent)) { POST_COMPLETION_FOR_REQ(loop, &handle->async_req); } return 0; } void uv_process_async_wakeup_req(uv_loop_t* loop, uv_async_t* handle, uv_req_t* req) { assert(handle->type == UV_ASYNC); assert(req->type == UV_WAKEUP); handle->async_sent = 0; if (handle->flags & UV_HANDLE_CLOSING) { uv_want_endgame(loop, (uv_handle_t*)handle); } else if (handle->async_cb != NULL) { handle->async_cb(handle); } } ================================================ FILE: external/libuv/src/win/atomicops-inl.h ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #ifndef UV_WIN_ATOMICOPS_INL_H_ #define UV_WIN_ATOMICOPS_INL_H_ #include "uv.h" #include "internal.h" /* Atomic set operation on char */ #ifdef _MSC_VER /* MSVC */ /* _InterlockedOr8 is supported by MSVC on x32 and x64. It is slightly less * efficient than InterlockedExchange, but InterlockedExchange8 does not exist, * and interlocked operations on larger targets might require the target to be * aligned. */ #pragma intrinsic(_InterlockedOr8) static char INLINE uv__atomic_exchange_set(char volatile* target) { return _InterlockedOr8(target, 1); } #else /* GCC */ /* Mingw-32 version, hopefully this works for 64-bit gcc as well. */ static inline char uv__atomic_exchange_set(char volatile* target) { const char one = 1; char old_value; __asm__ __volatile__ ("lock xchgb %0, %1\n\t" : "=r"(old_value), "=m"(*target) : "0"(one), "m"(*target) : "memory"); return old_value; } #endif #endif /* UV_WIN_ATOMICOPS_INL_H_ */ ================================================ FILE: external/libuv/src/win/core.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include #include #include #if defined(_MSC_VER) || defined(__MINGW64_VERSION_MAJOR) #include #endif #include "uv.h" #include "internal.h" #include "queue.h" #include "handle-inl.h" #include "heap-inl.h" #include "req-inl.h" /* uv_once initialization guards */ static uv_once_t uv_init_guard_ = UV_ONCE_INIT; #if defined(_DEBUG) && (defined(_MSC_VER) || defined(__MINGW64_VERSION_MAJOR)) /* Our crt debug report handler allows us to temporarily disable asserts * just for the current thread. */ UV_THREAD_LOCAL int uv__crt_assert_enabled = TRUE; static int uv__crt_dbg_report_handler(int report_type, char *message, int *ret_val) { if (uv__crt_assert_enabled || report_type != _CRT_ASSERT) return FALSE; if (ret_val) { /* Set ret_val to 0 to continue with normal execution. * Set ret_val to 1 to trigger a breakpoint. */ if(IsDebuggerPresent()) *ret_val = 1; else *ret_val = 0; } /* Don't call _CrtDbgReport. */ return TRUE; } #else UV_THREAD_LOCAL int uv__crt_assert_enabled = FALSE; #endif #if !defined(__MINGW32__) || __MSVCRT_VERSION__ >= 0x800 static void uv__crt_invalid_parameter_handler(const wchar_t* expression, const wchar_t* function, const wchar_t * file, unsigned int line, uintptr_t reserved) { /* No-op. */ } #endif static uv_loop_t** uv__loops; static int uv__loops_size; static int uv__loops_capacity; #define UV__LOOPS_CHUNK_SIZE 8 static uv_mutex_t uv__loops_lock; static void uv__loops_init(void) { uv_mutex_init(&uv__loops_lock); } static int uv__loops_add(uv_loop_t* loop) { uv_loop_t** new_loops; int new_capacity, i; uv_mutex_lock(&uv__loops_lock); if (uv__loops_size == uv__loops_capacity) { new_capacity = uv__loops_capacity + UV__LOOPS_CHUNK_SIZE; new_loops = (uv_loop_t **)uv__realloc(uv__loops, sizeof(uv_loop_t*) * new_capacity); if (!new_loops) goto failed_loops_realloc; uv__loops = new_loops; for (i = uv__loops_capacity; i < new_capacity; ++i) uv__loops[i] = NULL; uv__loops_capacity = new_capacity; } uv__loops[uv__loops_size] = loop; ++uv__loops_size; uv_mutex_unlock(&uv__loops_lock); return 0; failed_loops_realloc: uv_mutex_unlock(&uv__loops_lock); return ERROR_OUTOFMEMORY; } static void uv__loops_remove(uv_loop_t* loop) { int loop_index; int smaller_capacity; uv_loop_t** new_loops; uv_mutex_lock(&uv__loops_lock); for (loop_index = 0; loop_index < uv__loops_size; ++loop_index) { if (uv__loops[loop_index] == loop) break; } /* If loop was not found, ignore */ if (loop_index == uv__loops_size) goto loop_removed; uv__loops[loop_index] = uv__loops[uv__loops_size - 1]; uv__loops[uv__loops_size - 1] = NULL; --uv__loops_size; if (uv__loops_size == 0) { uv__loops_capacity = 0; uv__free(uv__loops); uv__loops = NULL; goto loop_removed; } /* If we didn't grow to big skip downsizing */ if (uv__loops_capacity < 4 * UV__LOOPS_CHUNK_SIZE) goto loop_removed; /* Downsize only if more than half of buffer is free */ smaller_capacity = uv__loops_capacity / 2; if (uv__loops_size >= smaller_capacity) goto loop_removed; new_loops = (uv_loop_t **)uv__realloc(uv__loops, sizeof(uv_loop_t*) * smaller_capacity); if (!new_loops) goto loop_removed; uv__loops = new_loops; uv__loops_capacity = smaller_capacity; loop_removed: uv_mutex_unlock(&uv__loops_lock); } void uv__wake_all_loops(void) { int i; uv_loop_t* loop; uv_mutex_lock(&uv__loops_lock); for (i = 0; i < uv__loops_size; ++i) { loop = uv__loops[i]; assert(loop); if (loop->iocp != INVALID_HANDLE_VALUE) PostQueuedCompletionStatus(loop->iocp, 0, 0, NULL); } uv_mutex_unlock(&uv__loops_lock); } static void uv_init(void) { /* Tell Windows that we will handle critical errors. */ SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX); /* Tell the CRT to not exit the application when an invalid parameter is * passed. The main issue is that invalid FDs will trigger this behavior. */ #if !defined(__MINGW32__) || __MSVCRT_VERSION__ >= 0x800 _set_invalid_parameter_handler(uv__crt_invalid_parameter_handler); #endif /* We also need to setup our debug report handler because some CRT * functions (eg _get_osfhandle) raise an assert when called with invalid * FDs even though they return the proper error code in the release build. */ #if defined(_DEBUG) && (defined(_MSC_VER) || defined(__MINGW64_VERSION_MAJOR)) _CrtSetReportHook(uv__crt_dbg_report_handler); #endif /* Initialize tracking of all uv loops */ uv__loops_init(); /* Fetch winapi function pointers. This must be done first because other * initialization code might need these function pointers to be loaded. */ uv_winapi_init(); /* Initialize winsock */ uv_winsock_init(); /* Initialize FS */ uv_fs_init(); /* Initialize signal stuff */ uv_signals_init(); /* Initialize console */ uv_console_init(); /* Initialize utilities */ uv__util_init(); /* Initialize system wakeup detection */ uv__init_detect_system_wakeup(); } int uv_loop_init(uv_loop_t* loop) { struct heap* timer_heap; int err; /* Initialize libuv itself first */ uv__once_init(); /* Create an I/O completion port */ loop->iocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 1); if (loop->iocp == NULL) return uv_translate_sys_error(GetLastError()); /* To prevent uninitialized memory access, loop->time must be initialized * to zero before calling uv_update_time for the first time. */ loop->time = 0; uv_update_time(loop); QUEUE_INIT(&loop->wq); QUEUE_INIT(&loop->handle_queue); loop->active_reqs.count = 0; loop->active_handles = 0; loop->pending_reqs_tail = NULL; loop->endgame_handles = NULL; loop->timer_heap = timer_heap = (struct heap *)uv__malloc(sizeof(*timer_heap)); if (timer_heap == NULL) { err = UV_ENOMEM; goto fail_timers_alloc; } heap_init(timer_heap); loop->check_handles = NULL; loop->prepare_handles = NULL; loop->idle_handles = NULL; loop->next_prepare_handle = NULL; loop->next_check_handle = NULL; loop->next_idle_handle = NULL; memset(&loop->poll_peer_sockets, 0, sizeof loop->poll_peer_sockets); loop->active_tcp_streams = 0; loop->active_udp_streams = 0; loop->timer_counter = 0; loop->stop_flag = 0; err = uv_mutex_init(&loop->wq_mutex); if (err) goto fail_mutex_init; err = uv_async_init(loop, &loop->wq_async, uv__work_done); if (err) goto fail_async_init; uv__handle_unref(&loop->wq_async); loop->wq_async.flags |= UV_HANDLE_INTERNAL; err = uv__loops_add(loop); if (err) goto fail_async_init; return 0; fail_async_init: uv_mutex_destroy(&loop->wq_mutex); fail_mutex_init: uv__free(timer_heap); loop->timer_heap = NULL; fail_timers_alloc: CloseHandle(loop->iocp); loop->iocp = INVALID_HANDLE_VALUE; return err; } void uv_update_time(uv_loop_t* loop) { uint64_t new_time = uv__hrtime(1000); assert(new_time >= loop->time); loop->time = new_time; } void uv__once_init(void) { uv_once(&uv_init_guard_, uv_init); } void uv__loop_close(uv_loop_t* loop) { size_t i; uv__loops_remove(loop); /* Close the async handle without needing an extra loop iteration. * We might have a pending message, but we're just going to destroy the IOCP * soon, so we can just discard it now without the usual risk of a getting * another notification from GetQueuedCompletionStatusEx after calling the * close_cb (which we also skip defining). We'll assert later that queue was * actually empty and all reqs handled. */ loop->wq_async.async_sent = 0; loop->wq_async.close_cb = NULL; uv__handle_closing(&loop->wq_async); uv__handle_close(&loop->wq_async); for (i = 0; i < ARRAY_SIZE(loop->poll_peer_sockets); i++) { SOCKET sock = loop->poll_peer_sockets[i]; if (sock != 0 && sock != INVALID_SOCKET) closesocket(sock); } uv_mutex_lock(&loop->wq_mutex); assert(QUEUE_EMPTY(&loop->wq) && "thread pool work queue not empty!"); assert(!uv__has_active_reqs(loop)); uv_mutex_unlock(&loop->wq_mutex); uv_mutex_destroy(&loop->wq_mutex); uv__free(loop->timer_heap); loop->timer_heap = NULL; CloseHandle(loop->iocp); } int uv__loop_configure(uv_loop_t* loop, uv_loop_option option, va_list ap) { return UV_ENOSYS; } int uv_backend_fd(const uv_loop_t* loop) { return -1; } int uv_loop_fork(uv_loop_t* loop) { return UV_ENOSYS; } int uv_backend_timeout(const uv_loop_t* loop) { if (loop->stop_flag != 0) return 0; if (!uv__has_active_handles(loop) && !uv__has_active_reqs(loop)) return 0; if (loop->pending_reqs_tail) return 0; if (loop->endgame_handles) return 0; if (loop->idle_handles) return 0; return uv__next_timeout(loop); } static void uv__poll_wine(uv_loop_t* loop, DWORD timeout) { DWORD bytes; ULONG_PTR key; OVERLAPPED* overlapped; uv_req_t* req; int repeat; uint64_t timeout_time; timeout_time = loop->time + timeout; for (repeat = 0; ; repeat++) { GetQueuedCompletionStatus(loop->iocp, &bytes, &key, &overlapped, timeout); if (overlapped) { /* Package was dequeued */ req = uv_overlapped_to_req(overlapped); uv_insert_pending_req(loop, req); /* Some time might have passed waiting for I/O, * so update the loop time here. */ uv_update_time(loop); } else if (GetLastError() != WAIT_TIMEOUT) { /* Serious error */ uv_fatal_error(GetLastError(), "GetQueuedCompletionStatus"); } else if (timeout > 0) { /* GetQueuedCompletionStatus can occasionally return a little early. * Make sure that the desired timeout target time is reached. */ uv_update_time(loop); if (timeout_time > loop->time) { timeout = (DWORD)(timeout_time - loop->time); /* The first call to GetQueuedCompletionStatus should return very * close to the target time and the second should reach it, but * this is not stated in the documentation. To make sure a busy * loop cannot happen, the timeout is increased exponentially * starting on the third round. */ timeout += repeat ? (1 << (repeat - 1)) : 0; continue; } } break; } } static void uv__poll(uv_loop_t* loop, DWORD timeout) { BOOL success; uv_req_t* req; OVERLAPPED_ENTRY overlappeds[128]; ULONG count; ULONG i; int repeat; uint64_t timeout_time; timeout_time = loop->time + timeout; for (repeat = 0; ; repeat++) { success = pGetQueuedCompletionStatusEx(loop->iocp, overlappeds, ARRAY_SIZE(overlappeds), &count, timeout, FALSE); if (success) { for (i = 0; i < count; i++) { /* Package was dequeued, but see if it is not a empty package * meant only to wake us up. */ if (overlappeds[i].lpOverlapped) { req = uv_overlapped_to_req(overlappeds[i].lpOverlapped); uv_insert_pending_req(loop, req); } } /* Some time might have passed waiting for I/O, * so update the loop time here. */ uv_update_time(loop); } else if (GetLastError() != WAIT_TIMEOUT) { /* Serious error */ uv_fatal_error(GetLastError(), "GetQueuedCompletionStatusEx"); } else if (timeout > 0) { /* GetQueuedCompletionStatus can occasionally return a little early. * Make sure that the desired timeout target time is reached. */ uv_update_time(loop); if (timeout_time > loop->time) { timeout = (DWORD)(timeout_time - loop->time); /* The first call to GetQueuedCompletionStatus should return very * close to the target time and the second should reach it, but * this is not stated in the documentation. To make sure a busy * loop cannot happen, the timeout is increased exponentially * starting on the third round. */ timeout += repeat ? (1 << (repeat - 1)) : 0; continue; } } break; } } static int uv__loop_alive(const uv_loop_t* loop) { return uv__has_active_handles(loop) || uv__has_active_reqs(loop) || loop->endgame_handles != NULL; } int uv_loop_alive(const uv_loop_t* loop) { return uv__loop_alive(loop); } int uv_run(uv_loop_t *loop, uv_run_mode mode) { DWORD timeout; int r; int ran_pending; r = uv__loop_alive(loop); if (!r) uv_update_time(loop); while (r != 0 && loop->stop_flag == 0) { uv_update_time(loop); uv__run_timers(loop); ran_pending = uv_process_reqs(loop); uv_idle_invoke(loop); uv_prepare_invoke(loop); timeout = 0; if ((mode == UV_RUN_ONCE && !ran_pending) || mode == UV_RUN_DEFAULT) timeout = uv_backend_timeout(loop); if (pGetQueuedCompletionStatusEx) uv__poll(loop, timeout); else uv__poll_wine(loop, timeout); uv_check_invoke(loop); uv_process_endgames(loop); if (mode == UV_RUN_ONCE) { /* UV_RUN_ONCE implies forward progress: at least one callback must have * been invoked when it returns. uv__io_poll() can return without doing * I/O (meaning: no callbacks) when its timeout expires - which means we * have pending timers that satisfy the forward progress constraint. * * UV_RUN_NOWAIT makes no guarantees about progress so it's omitted from * the check. */ uv__run_timers(loop); } r = uv__loop_alive(loop); if (mode == UV_RUN_ONCE || mode == UV_RUN_NOWAIT) break; } /* The if statement lets the compiler compile it to a conditional store. * Avoids dirtying a cache line. */ if (loop->stop_flag != 0) loop->stop_flag = 0; return r; } int uv_fileno(const uv_handle_t* handle, uv_os_fd_t* fd) { uv_os_fd_t fd_out; switch (handle->type) { case UV_TCP: fd_out = (uv_os_fd_t)((uv_tcp_t*) handle)->socket; break; case UV_NAMED_PIPE: fd_out = ((uv_pipe_t*) handle)->handle; break; case UV_TTY: fd_out = ((uv_tty_t*) handle)->handle; break; case UV_UDP: fd_out = (uv_os_fd_t)((uv_udp_t*) handle)->socket; break; case UV_POLL: fd_out = (uv_os_fd_t)((uv_poll_t*) handle)->socket; break; default: return UV_EINVAL; } if (uv_is_closing(handle) || fd_out == INVALID_HANDLE_VALUE) return UV_EBADF; *fd = fd_out; return 0; } int uv__socket_sockopt(uv_handle_t* handle, int optname, int* value) { int r; int len; SOCKET socket; if (handle == NULL || value == NULL) return UV_EINVAL; if (handle->type == UV_TCP) socket = ((uv_tcp_t*) handle)->socket; else if (handle->type == UV_UDP) socket = ((uv_udp_t*) handle)->socket; else return UV_ENOTSUP; len = sizeof(*value); if (*value == 0) r = getsockopt(socket, SOL_SOCKET, optname, (char*) value, &len); else r = setsockopt(socket, SOL_SOCKET, optname, (const char*) value, len); if (r == SOCKET_ERROR) return uv_translate_sys_error(WSAGetLastError()); return 0; } int uv_cpumask_size(void) { return (int)(sizeof(DWORD_PTR) * 8); } int uv__getsockpeername(const uv_handle_t* handle, uv__peersockfunc func, struct sockaddr* name, int* namelen, int delayed_error) { int result; uv_os_fd_t fd; result = uv_fileno(handle, &fd); if (result != 0) return result; if (delayed_error) return uv_translate_sys_error(delayed_error); result = func((SOCKET) fd, name, namelen); if (result != 0) return uv_translate_sys_error(WSAGetLastError()); return 0; } ================================================ FILE: external/libuv/src/win/detect-wakeup.c ================================================ #include "uv.h" #include "internal.h" #include "winapi.h" static void uv__register_system_resume_callback(void); void uv__init_detect_system_wakeup(void) { /* Try registering system power event callback. This is the cleanest * method, but it will only work on Win8 and above. */ uv__register_system_resume_callback(); } static ULONG CALLBACK uv__system_resume_callback(PVOID Context, ULONG Type, PVOID Setting) { if (Type == PBT_APMRESUMESUSPEND || Type == PBT_APMRESUMEAUTOMATIC) uv__wake_all_loops(); return 0; } static void uv__register_system_resume_callback(void) { _DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS recipient; _HPOWERNOTIFY registration_handle; if (pPowerRegisterSuspendResumeNotification == NULL) return; recipient.Callback = uv__system_resume_callback; recipient.Context = NULL; (*pPowerRegisterSuspendResumeNotification)(DEVICE_NOTIFY_CALLBACK, &recipient, ®istration_handle); } ================================================ FILE: external/libuv/src/win/dl.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" static int uv__dlerror(uv_lib_t* lib, const char* filename, DWORD errorno); int uv_dlopen(const char* filename, uv_lib_t* lib) { WCHAR filename_w[32768]; lib->handle = NULL; lib->errmsg = NULL; if (!MultiByteToWideChar(CP_UTF8, 0, filename, -1, filename_w, ARRAY_SIZE(filename_w))) { return uv__dlerror(lib, filename, GetLastError()); } lib->handle = LoadLibraryExW(filename_w, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); if (lib->handle == NULL) { return uv__dlerror(lib, filename, GetLastError()); } return 0; } void uv_dlclose(uv_lib_t* lib) { if (lib->errmsg) { LocalFree((void*)lib->errmsg); lib->errmsg = NULL; } if (lib->handle) { /* Ignore errors. No good way to signal them without leaking memory. */ FreeLibrary(lib->handle); lib->handle = NULL; } } int uv_dlsym(uv_lib_t* lib, const char* name, void** ptr) { /* Cast though integer to suppress pedantic warning about forbidden cast. */ *ptr = (void*)(uintptr_t) GetProcAddress(lib->handle, name); return uv__dlerror(lib, "", *ptr ? 0 : GetLastError()); } const char* uv_dlerror(const uv_lib_t* lib) { return lib->errmsg ? lib->errmsg : "no error"; } static void uv__format_fallback_error(uv_lib_t* lib, int errorno){ static const CHAR fallback_error[] = "error: %1!d!"; DWORD_PTR args[1]; args[0] = (DWORD_PTR) errorno; FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY | FORMAT_MESSAGE_ALLOCATE_BUFFER, fallback_error, 0, 0, (LPSTR) &lib->errmsg, 0, (va_list*) args); } static int uv__dlerror(uv_lib_t* lib, const char* filename, DWORD errorno) { DWORD_PTR arg; DWORD res; char* msg; if (lib->errmsg) { LocalFree(lib->errmsg); lib->errmsg = NULL; } if (errorno == 0) return 0; res = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), (LPSTR) &lib->errmsg, 0, NULL); if (!res && (GetLastError() == ERROR_MUI_FILE_NOT_FOUND || GetLastError() == ERROR_RESOURCE_TYPE_NOT_FOUND)) { res = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno, 0, (LPSTR) &lib->errmsg, 0, NULL); } if (res && errorno == ERROR_BAD_EXE_FORMAT && strstr(lib->errmsg, "%1")) { msg = lib->errmsg; lib->errmsg = NULL; arg = (DWORD_PTR) filename; res = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_ARGUMENT_ARRAY | FORMAT_MESSAGE_FROM_STRING, msg, 0, 0, (LPSTR) &lib->errmsg, 0, (va_list*) &arg); LocalFree(msg); } if (!res) uv__format_fallback_error(lib, errorno); return -1; } ================================================ FILE: external/libuv/src/win/error.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include #include #include "uv.h" #include "internal.h" /* * Display an error message and abort the event loop. */ void uv_fatal_error(const int errorno, const char* syscall) { char* buf = NULL; const char* errmsg; FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&buf, 0, NULL); if (buf) { errmsg = buf; } else { errmsg = "Unknown error"; } /* FormatMessage messages include a newline character already, so don't add * another. */ if (syscall) { fprintf(stderr, "%s: (%d) %s", syscall, errorno, errmsg); } else { fprintf(stderr, "(%d) %s", errorno, errmsg); } if (buf) { LocalFree(buf); } DebugBreak(); abort(); } int uv_translate_sys_error(int sys_errno) { if (sys_errno <= 0) { return sys_errno; /* If < 0 then it's already a libuv error. */ } switch (sys_errno) { case ERROR_NOACCESS: return UV_EACCES; case WSAEACCES: return UV_EACCES; case ERROR_ELEVATION_REQUIRED: return UV_EACCES; case ERROR_CANT_ACCESS_FILE: return UV_EACCES; case ERROR_ADDRESS_ALREADY_ASSOCIATED: return UV_EADDRINUSE; case WSAEADDRINUSE: return UV_EADDRINUSE; case WSAEADDRNOTAVAIL: return UV_EADDRNOTAVAIL; case WSAEAFNOSUPPORT: return UV_EAFNOSUPPORT; case WSAEWOULDBLOCK: return UV_EAGAIN; case WSAEALREADY: return UV_EALREADY; case ERROR_INVALID_FLAGS: return UV_EBADF; case ERROR_INVALID_HANDLE: return UV_EBADF; case ERROR_LOCK_VIOLATION: return UV_EBUSY; case ERROR_PIPE_BUSY: return UV_EBUSY; case ERROR_SHARING_VIOLATION: return UV_EBUSY; case ERROR_OPERATION_ABORTED: return UV_ECANCELED; case WSAEINTR: return UV_ECANCELED; case ERROR_NO_UNICODE_TRANSLATION: return UV_ECHARSET; case ERROR_CONNECTION_ABORTED: return UV_ECONNABORTED; case WSAECONNABORTED: return UV_ECONNABORTED; case ERROR_CONNECTION_REFUSED: return UV_ECONNREFUSED; case WSAECONNREFUSED: return UV_ECONNREFUSED; case ERROR_NETNAME_DELETED: return UV_ECONNRESET; case WSAECONNRESET: return UV_ECONNRESET; case ERROR_ALREADY_EXISTS: return UV_EEXIST; case ERROR_FILE_EXISTS: return UV_EEXIST; case ERROR_BUFFER_OVERFLOW: return UV_EFAULT; case WSAEFAULT: return UV_EFAULT; case ERROR_HOST_UNREACHABLE: return UV_EHOSTUNREACH; case WSAEHOSTUNREACH: return UV_EHOSTUNREACH; case ERROR_INSUFFICIENT_BUFFER: return UV_EINVAL; case ERROR_INVALID_DATA: return UV_EINVAL; case ERROR_INVALID_PARAMETER: return UV_EINVAL; case ERROR_SYMLINK_NOT_SUPPORTED: return UV_EINVAL; case WSAEINVAL: return UV_EINVAL; case WSAEPFNOSUPPORT: return UV_EINVAL; case WSAESOCKTNOSUPPORT: return UV_EINVAL; case ERROR_BEGINNING_OF_MEDIA: return UV_EIO; case ERROR_BUS_RESET: return UV_EIO; case ERROR_CRC: return UV_EIO; case ERROR_DEVICE_DOOR_OPEN: return UV_EIO; case ERROR_DEVICE_REQUIRES_CLEANING: return UV_EIO; case ERROR_DISK_CORRUPT: return UV_EIO; case ERROR_EOM_OVERFLOW: return UV_EIO; case ERROR_FILEMARK_DETECTED: return UV_EIO; case ERROR_GEN_FAILURE: return UV_EIO; case ERROR_INVALID_BLOCK_LENGTH: return UV_EIO; case ERROR_IO_DEVICE: return UV_EIO; case ERROR_NO_DATA_DETECTED: return UV_EIO; case ERROR_NO_SIGNAL_SENT: return UV_EIO; case ERROR_OPEN_FAILED: return UV_EIO; case ERROR_SETMARK_DETECTED: return UV_EIO; case ERROR_SIGNAL_REFUSED: return UV_EIO; case WSAEISCONN: return UV_EISCONN; case ERROR_CANT_RESOLVE_FILENAME: return UV_ELOOP; case ERROR_TOO_MANY_OPEN_FILES: return UV_EMFILE; case WSAEMFILE: return UV_EMFILE; case WSAEMSGSIZE: return UV_EMSGSIZE; case ERROR_FILENAME_EXCED_RANGE: return UV_ENAMETOOLONG; case ERROR_NETWORK_UNREACHABLE: return UV_ENETUNREACH; case WSAENETUNREACH: return UV_ENETUNREACH; case WSAENOBUFS: return UV_ENOBUFS; case ERROR_BAD_PATHNAME: return UV_ENOENT; case ERROR_DIRECTORY: return UV_ENOENT; case ERROR_ENVVAR_NOT_FOUND: return UV_ENOENT; case ERROR_FILE_NOT_FOUND: return UV_ENOENT; case ERROR_INVALID_NAME: return UV_ENOENT; case ERROR_INVALID_DRIVE: return UV_ENOENT; case ERROR_INVALID_REPARSE_DATA: return UV_ENOENT; case ERROR_MOD_NOT_FOUND: return UV_ENOENT; case ERROR_PATH_NOT_FOUND: return UV_ENOENT; case WSAHOST_NOT_FOUND: return UV_ENOENT; case WSANO_DATA: return UV_ENOENT; case ERROR_NOT_ENOUGH_MEMORY: return UV_ENOMEM; case ERROR_OUTOFMEMORY: return UV_ENOMEM; case ERROR_CANNOT_MAKE: return UV_ENOSPC; case ERROR_DISK_FULL: return UV_ENOSPC; case ERROR_EA_TABLE_FULL: return UV_ENOSPC; case ERROR_END_OF_MEDIA: return UV_ENOSPC; case ERROR_HANDLE_DISK_FULL: return UV_ENOSPC; case ERROR_NOT_CONNECTED: return UV_ENOTCONN; case WSAENOTCONN: return UV_ENOTCONN; case ERROR_DIR_NOT_EMPTY: return UV_ENOTEMPTY; case WSAENOTSOCK: return UV_ENOTSOCK; case ERROR_NOT_SUPPORTED: return UV_ENOTSUP; case ERROR_BROKEN_PIPE: return UV_EOF; case ERROR_ACCESS_DENIED: return UV_EPERM; case ERROR_PRIVILEGE_NOT_HELD: return UV_EPERM; case ERROR_BAD_PIPE: return UV_EPIPE; case ERROR_NO_DATA: return UV_EPIPE; case ERROR_PIPE_NOT_CONNECTED: return UV_EPIPE; case WSAESHUTDOWN: return UV_EPIPE; case WSAEPROTONOSUPPORT: return UV_EPROTONOSUPPORT; case ERROR_WRITE_PROTECT: return UV_EROFS; case ERROR_SEM_TIMEOUT: return UV_ETIMEDOUT; case WSAETIMEDOUT: return UV_ETIMEDOUT; case ERROR_NOT_SAME_DEVICE: return UV_EXDEV; case ERROR_INVALID_FUNCTION: return UV_EISDIR; case ERROR_META_EXPANSION_TOO_LONG: return UV_E2BIG; default: return UV_UNKNOWN; } } ================================================ FILE: external/libuv/src/win/fs-event.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include #include "uv.h" #include "internal.h" #include "handle-inl.h" #include "req-inl.h" const unsigned int uv_directory_watcher_buffer_size = 4096; static void uv_fs_event_queue_readdirchanges(uv_loop_t* loop, uv_fs_event_t* handle) { assert(handle->dir_handle != INVALID_HANDLE_VALUE); assert(!handle->req_pending); memset(&(handle->req.u.io.overlapped), 0, sizeof(handle->req.u.io.overlapped)); if (!ReadDirectoryChangesW(handle->dir_handle, handle->buffer, uv_directory_watcher_buffer_size, (handle->flags & UV_FS_EVENT_RECURSIVE) ? TRUE : FALSE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_LAST_ACCESS | FILE_NOTIFY_CHANGE_CREATION | FILE_NOTIFY_CHANGE_SECURITY, NULL, &handle->req.u.io.overlapped, NULL)) { /* Make this req pending reporting an error. */ SET_REQ_ERROR(&handle->req, GetLastError()); uv_insert_pending_req(loop, (uv_req_t*)&handle->req); } handle->req_pending = 1; } static void uv_relative_path(const WCHAR* filename, const WCHAR* dir, WCHAR** relpath) { size_t relpathlen; size_t filenamelen = wcslen(filename); size_t dirlen = wcslen(dir); assert(!_wcsnicmp(filename, dir, dirlen)); if (dirlen > 0 && dir[dirlen - 1] == '\\') dirlen--; relpathlen = filenamelen - dirlen - 1; *relpath = (WCHAR *)uv__malloc((relpathlen + 1) * sizeof(WCHAR)); if (!*relpath) uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); wcsncpy(*relpath, filename + dirlen + 1, relpathlen); (*relpath)[relpathlen] = L'\0'; } static int uv_split_path(const WCHAR* filename, WCHAR** dir, WCHAR** file) { size_t len, i; DWORD dir_len; if (filename == NULL) { if (dir != NULL) *dir = NULL; *file = NULL; return 0; } len = wcslen(filename); i = len; while (i > 0 && filename[--i] != '\\' && filename[i] != '/'); if (i == 0) { if (dir) { dir_len = GetCurrentDirectoryW(0, NULL); if (dir_len == 0) { return -1; } *dir = (WCHAR*)uv__malloc(dir_len * sizeof(WCHAR)); if (!*dir) { uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); } if (!GetCurrentDirectoryW(dir_len, *dir)) { uv__free(*dir); *dir = NULL; return -1; } } *file = wcsdup(filename); } else { if (dir) { *dir = (WCHAR*)uv__malloc((i + 2) * sizeof(WCHAR)); if (!*dir) { uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); } wcsncpy(*dir, filename, i + 1); (*dir)[i + 1] = L'\0'; } *file = (WCHAR*)uv__malloc((len - i) * sizeof(WCHAR)); if (!*file) { uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); } wcsncpy(*file, filename + i + 1, len - i - 1); (*file)[len - i - 1] = L'\0'; } return 0; } int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) { uv__handle_init(loop, (uv_handle_t*) handle, UV_FS_EVENT); handle->dir_handle = INVALID_HANDLE_VALUE; handle->buffer = NULL; handle->req_pending = 0; handle->filew = NULL; handle->short_filew = NULL; handle->dirw = NULL; UV_REQ_INIT(&handle->req, UV_FS_EVENT_REQ); handle->req.data = handle; return 0; } int uv_fs_event_start(uv_fs_event_t* handle, uv_fs_event_cb cb, const char* path, unsigned int flags) { int name_size, is_path_dir, size; DWORD attr, last_error; WCHAR* dir = NULL, *dir_to_watch, *pathw = NULL; DWORD short_path_buffer_len; WCHAR *short_path_buffer; WCHAR* short_path, *long_path; short_path = NULL; if (uv__is_active(handle)) return UV_EINVAL; handle->cb = cb; handle->path = uv__strdup(path); if (!handle->path) { uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); } uv__handle_start(handle); /* Convert name to UTF16. */ name_size = MultiByteToWideChar(CP_UTF8, 0, path, -1, NULL, 0) * sizeof(WCHAR); pathw = (WCHAR*)uv__malloc(name_size); if (!pathw) { uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); } if (!MultiByteToWideChar(CP_UTF8, 0, path, -1, pathw, name_size / sizeof(WCHAR))) { return uv_translate_sys_error(GetLastError()); } /* Determine whether path is a file or a directory. */ attr = GetFileAttributesW(pathw); if (attr == INVALID_FILE_ATTRIBUTES) { last_error = GetLastError(); goto error; } is_path_dir = (attr & FILE_ATTRIBUTE_DIRECTORY) ? 1 : 0; if (is_path_dir) { /* path is a directory, so that's the directory that we will watch. */ /* Convert to long path. */ size = GetLongPathNameW(pathw, NULL, 0); if (size) { long_path = (WCHAR*)uv__malloc(size * sizeof(WCHAR)); if (!long_path) { uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); } size = GetLongPathNameW(pathw, long_path, size); if (size) { long_path[size] = '\0'; } else { uv__free(long_path); long_path = NULL; } if (long_path) { uv__free(pathw); pathw = long_path; } } dir_to_watch = pathw; } else { /* * path is a file. So we split path into dir & file parts, and * watch the dir directory. */ /* Convert to short path. */ short_path_buffer = NULL; short_path_buffer_len = GetShortPathNameW(pathw, NULL, 0); if (short_path_buffer_len == 0) { goto short_path_done; } short_path_buffer = (WCHAR *)uv__malloc(short_path_buffer_len * sizeof(WCHAR)); if (short_path_buffer == NULL) { goto short_path_done; } if (GetShortPathNameW(pathw, short_path_buffer, short_path_buffer_len) == 0) { uv__free(short_path_buffer); short_path_buffer = NULL; } short_path_done: short_path = short_path_buffer; if (uv_split_path(pathw, &dir, &handle->filew) != 0) { last_error = GetLastError(); goto error; } if (uv_split_path(short_path, NULL, &handle->short_filew) != 0) { last_error = GetLastError(); goto error; } dir_to_watch = dir; uv__free(pathw); pathw = NULL; } handle->dir_handle = CreateFileW(dir_to_watch, FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_DELETE | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, NULL); if (dir) { uv__free(dir); dir = NULL; } if (handle->dir_handle == INVALID_HANDLE_VALUE) { last_error = GetLastError(); goto error; } if (CreateIoCompletionPort(handle->dir_handle, handle->loop->iocp, (ULONG_PTR)handle, 0) == NULL) { last_error = GetLastError(); goto error; } if (!handle->buffer) { handle->buffer = (char*)uv__malloc(uv_directory_watcher_buffer_size); } if (!handle->buffer) { uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); } memset(&(handle->req.u.io.overlapped), 0, sizeof(handle->req.u.io.overlapped)); if (!ReadDirectoryChangesW(handle->dir_handle, handle->buffer, uv_directory_watcher_buffer_size, (flags & UV_FS_EVENT_RECURSIVE) ? TRUE : FALSE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_LAST_ACCESS | FILE_NOTIFY_CHANGE_CREATION | FILE_NOTIFY_CHANGE_SECURITY, NULL, &handle->req.u.io.overlapped, NULL)) { last_error = GetLastError(); goto error; } assert(is_path_dir ? pathw != NULL : pathw == NULL); handle->dirw = pathw; handle->req_pending = 1; return 0; error: if (handle->path) { uv__free(handle->path); handle->path = NULL; } if (handle->filew) { uv__free(handle->filew); handle->filew = NULL; } if (handle->short_filew) { uv__free(handle->short_filew); handle->short_filew = NULL; } uv__free(pathw); if (handle->dir_handle != INVALID_HANDLE_VALUE) { CloseHandle(handle->dir_handle); handle->dir_handle = INVALID_HANDLE_VALUE; } if (handle->buffer) { uv__free(handle->buffer); handle->buffer = NULL; } if (uv__is_active(handle)) uv__handle_stop(handle); uv__free(short_path); return uv_translate_sys_error(last_error); } int uv_fs_event_stop(uv_fs_event_t* handle) { if (!uv__is_active(handle)) return 0; if (handle->dir_handle != INVALID_HANDLE_VALUE) { CloseHandle(handle->dir_handle); handle->dir_handle = INVALID_HANDLE_VALUE; } uv__handle_stop(handle); if (handle->filew) { uv__free(handle->filew); handle->filew = NULL; } if (handle->short_filew) { uv__free(handle->short_filew); handle->short_filew = NULL; } if (handle->path) { uv__free(handle->path); handle->path = NULL; } if (handle->dirw) { uv__free(handle->dirw); handle->dirw = NULL; } return 0; } static int file_info_cmp(WCHAR* str, WCHAR* file_name, size_t file_name_len) { size_t str_len; if (str == NULL) return -1; str_len = wcslen(str); /* Since we only care about equality, return early if the strings aren't the same length */ if (str_len != (file_name_len / sizeof(WCHAR))) return -1; return _wcsnicmp(str, file_name, str_len); } void uv_process_fs_event_req(uv_loop_t* loop, uv_req_t* req, uv_fs_event_t* handle) { FILE_NOTIFY_INFORMATION* file_info; int err, sizew, size; char* filename = NULL; WCHAR* filenamew = NULL; WCHAR* long_filenamew = NULL; DWORD offset = 0; assert(req->type == UV_FS_EVENT_REQ); assert(handle->req_pending); handle->req_pending = 0; /* Don't report any callbacks if: * - We're closing, just push the handle onto the endgame queue * - We are not active, just ignore the callback */ if (!uv__is_active(handle)) { if (handle->flags & UV_HANDLE_CLOSING) { uv_want_endgame(loop, (uv_handle_t*) handle); } return; } file_info = (FILE_NOTIFY_INFORMATION*)(handle->buffer + offset); if (REQ_SUCCESS(req)) { if (req->u.io.overlapped.InternalHigh > 0) { do { file_info = (FILE_NOTIFY_INFORMATION*)((char*)file_info + offset); assert(!filename); assert(!filenamew); assert(!long_filenamew); /* * Fire the event only if we were asked to watch a directory, * or if the filename filter matches. */ if (handle->dirw || file_info_cmp(handle->filew, file_info->FileName, file_info->FileNameLength) == 0 || file_info_cmp(handle->short_filew, file_info->FileName, file_info->FileNameLength) == 0) { if (handle->dirw) { /* * We attempt to resolve the long form of the file name explicitly. * We only do this for file names that might still exist on disk. * If this fails, we use the name given by ReadDirectoryChangesW. * This may be the long form or the 8.3 short name in some cases. */ if (file_info->Action != FILE_ACTION_REMOVED && file_info->Action != FILE_ACTION_RENAMED_OLD_NAME) { /* Construct a full path to the file. */ size = wcslen(handle->dirw) + file_info->FileNameLength / sizeof(WCHAR) + 2; filenamew = (WCHAR*)uv__malloc(size * sizeof(WCHAR)); if (!filenamew) { uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); } _snwprintf(filenamew, size, L"%s\\%.*s", handle->dirw, file_info->FileNameLength / (DWORD)sizeof(WCHAR), file_info->FileName); filenamew[size - 1] = L'\0'; /* Convert to long name. */ size = GetLongPathNameW(filenamew, NULL, 0); if (size) { long_filenamew = (WCHAR*)uv__malloc(size * sizeof(WCHAR)); if (!long_filenamew) { uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); } size = GetLongPathNameW(filenamew, long_filenamew, size); if (size) { long_filenamew[size] = '\0'; } else { uv__free(long_filenamew); long_filenamew = NULL; } } uv__free(filenamew); if (long_filenamew) { /* Get the file name out of the long path. */ uv_relative_path(long_filenamew, handle->dirw, &filenamew); uv__free(long_filenamew); long_filenamew = filenamew; sizew = -1; } else { /* We couldn't get the long filename, use the one reported. */ filenamew = file_info->FileName; sizew = file_info->FileNameLength / sizeof(WCHAR); } } else { /* * Removed or renamed events cannot be resolved to the long form. * We therefore use the name given by ReadDirectoryChangesW. * This may be the long form or the 8.3 short name in some cases. */ filenamew = file_info->FileName; sizew = file_info->FileNameLength / sizeof(WCHAR); } } else { /* We already have the long name of the file, so just use it. */ filenamew = handle->filew; sizew = -1; } /* Convert the filename to utf8. */ uv__convert_utf16_to_utf8(filenamew, sizew, &filename); switch (file_info->Action) { case FILE_ACTION_ADDED: case FILE_ACTION_REMOVED: case FILE_ACTION_RENAMED_OLD_NAME: case FILE_ACTION_RENAMED_NEW_NAME: handle->cb(handle, filename, UV_RENAME, 0); break; case FILE_ACTION_MODIFIED: handle->cb(handle, filename, UV_CHANGE, 0); break; } uv__free(filename); filename = NULL; uv__free(long_filenamew); long_filenamew = NULL; filenamew = NULL; } offset = file_info->NextEntryOffset; } while (offset && !(handle->flags & UV_HANDLE_CLOSING)); } else { handle->cb(handle, NULL, UV_CHANGE, 0); } } else { err = GET_REQ_ERROR(req); handle->cb(handle, NULL, 0, uv_translate_sys_error(err)); } if (!(handle->flags & UV_HANDLE_CLOSING)) { uv_fs_event_queue_readdirchanges(loop, handle); } else { uv_want_endgame(loop, (uv_handle_t*)handle); } } void uv_fs_event_close(uv_loop_t* loop, uv_fs_event_t* handle) { uv_fs_event_stop(handle); uv__handle_closing(handle); if (!handle->req_pending) { uv_want_endgame(loop, (uv_handle_t*)handle); } } void uv_fs_event_endgame(uv_loop_t* loop, uv_fs_event_t* handle) { if ((handle->flags & UV_HANDLE_CLOSING) && !handle->req_pending) { assert(!(handle->flags & UV_HANDLE_CLOSED)); if (handle->buffer) { uv__free(handle->buffer); handle->buffer = NULL; } uv__handle_close(handle); } } ================================================ FILE: external/libuv/src/win/fs-fd-hash-inl.h ================================================ #ifndef UV_WIN_FS_FD_HASH_INL_H_ #define UV_WIN_FS_FD_HASH_INL_H_ #include "uv.h" #include "internal.h" /* Files are only inserted in uv__fd_hash when the UV_FS_O_FILEMAP flag is * specified. Thus, when uv__fd_hash_get returns true, the file mapping in the * info structure should be used for read/write operations. * * If the file is empty, the mapping field will be set to * INVALID_HANDLE_VALUE. This is not an issue since the file mapping needs to * be created anyway when the file size changes. * * Since file descriptors are sequential integers, the modulo operator is used * as hashing function. For each bucket, a single linked list of arrays is * kept to minimize allocations. A statically allocated memory buffer is kept * for the first array in each bucket. */ #define UV__FD_HASH_SIZE 256 #define UV__FD_HASH_GROUP_SIZE 16 struct uv__fd_info_s { int flags; BOOLEAN is_directory; HANDLE mapping; LARGE_INTEGER size; LARGE_INTEGER current_pos; }; struct uv__fd_hash_entry_s { uv_file fd; struct uv__fd_info_s info; }; struct uv__fd_hash_entry_group_s { struct uv__fd_hash_entry_s entries[UV__FD_HASH_GROUP_SIZE]; struct uv__fd_hash_entry_group_s* next; }; struct uv__fd_hash_bucket_s { size_t size; struct uv__fd_hash_entry_group_s* data; }; static uv_mutex_t uv__fd_hash_mutex; static struct uv__fd_hash_entry_group_s uv__fd_hash_entry_initial[UV__FD_HASH_SIZE * UV__FD_HASH_GROUP_SIZE]; static struct uv__fd_hash_bucket_s uv__fd_hash[UV__FD_HASH_SIZE]; INLINE static void uv__fd_hash_init(void) { int i, err; err = uv_mutex_init(&uv__fd_hash_mutex); if (err) { uv_fatal_error(err, "uv_mutex_init"); } for (i = 0; i < ARRAY_SIZE(uv__fd_hash); ++i) { uv__fd_hash[i].size = 0; uv__fd_hash[i].data = uv__fd_hash_entry_initial + i * UV__FD_HASH_GROUP_SIZE; } } #define FIND_COMMON_VARIABLES \ unsigned i; \ unsigned bucket = fd % ARRAY_SIZE(uv__fd_hash); \ struct uv__fd_hash_entry_s* entry_ptr = NULL; \ struct uv__fd_hash_entry_group_s* group_ptr; \ struct uv__fd_hash_bucket_s* bucket_ptr = &uv__fd_hash[bucket]; #define FIND_IN_GROUP_PTR(group_size) \ do { \ for (i = 0; i < group_size; ++i) { \ if (group_ptr->entries[i].fd == fd) { \ entry_ptr = &group_ptr->entries[i]; \ break; \ } \ } \ } while (0) #define FIND_IN_BUCKET_PTR() \ do { \ size_t first_group_size = bucket_ptr->size % UV__FD_HASH_GROUP_SIZE; \ if (bucket_ptr->size != 0 && first_group_size == 0) \ first_group_size = UV__FD_HASH_GROUP_SIZE; \ group_ptr = bucket_ptr->data; \ FIND_IN_GROUP_PTR(first_group_size); \ for (group_ptr = group_ptr->next; \ group_ptr != NULL && entry_ptr == NULL; \ group_ptr = group_ptr->next) \ FIND_IN_GROUP_PTR(UV__FD_HASH_GROUP_SIZE); \ } while (0) INLINE static int uv__fd_hash_get(int fd, struct uv__fd_info_s* info) { FIND_COMMON_VARIABLES uv_mutex_lock(&uv__fd_hash_mutex); FIND_IN_BUCKET_PTR(); if (entry_ptr != NULL) { *info = entry_ptr->info; } uv_mutex_unlock(&uv__fd_hash_mutex); return entry_ptr != NULL; } INLINE static void uv__fd_hash_add(int fd, struct uv__fd_info_s* info) { FIND_COMMON_VARIABLES uv_mutex_lock(&uv__fd_hash_mutex); FIND_IN_BUCKET_PTR(); if (entry_ptr == NULL) { i = bucket_ptr->size % UV__FD_HASH_GROUP_SIZE; if (bucket_ptr->size != 0 && i == 0) { struct uv__fd_hash_entry_group_s* new_group_ptr = (struct uv__fd_hash_entry_group_s *)uv__malloc(sizeof(*new_group_ptr)); if (new_group_ptr == NULL) { uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); } new_group_ptr->next = bucket_ptr->data; bucket_ptr->data = new_group_ptr; } bucket_ptr->size += 1; entry_ptr = &bucket_ptr->data->entries[i]; entry_ptr->fd = fd; } entry_ptr->info = *info; uv_mutex_unlock(&uv__fd_hash_mutex); } INLINE static int uv__fd_hash_remove(int fd, struct uv__fd_info_s* info) { FIND_COMMON_VARIABLES uv_mutex_lock(&uv__fd_hash_mutex); FIND_IN_BUCKET_PTR(); if (entry_ptr != NULL) { *info = entry_ptr->info; bucket_ptr->size -= 1; i = bucket_ptr->size % UV__FD_HASH_GROUP_SIZE; if (entry_ptr != &bucket_ptr->data->entries[i]) { *entry_ptr = bucket_ptr->data->entries[i]; } if (bucket_ptr->size != 0 && bucket_ptr->size % UV__FD_HASH_GROUP_SIZE == 0) { struct uv__fd_hash_entry_group_s* old_group_ptr = bucket_ptr->data; bucket_ptr->data = old_group_ptr->next; uv__free(old_group_ptr); } } uv_mutex_unlock(&uv__fd_hash_mutex); return entry_ptr != NULL; } #undef FIND_COMMON_VARIABLES #undef FIND_IN_GROUP_PTR #undef FIND_IN_BUCKET_PTR #endif /* UV_WIN_FS_FD_HASH_INL_H_ */ ================================================ FILE: external/libuv/src/win/fs.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include #include #include #include #include #include #include #include "uv.h" #include "internal.h" #include "req-inl.h" #include "handle-inl.h" #include "fs-fd-hash-inl.h" #define UV_FS_FREE_PATHS 0x0002 #define UV_FS_FREE_PTR 0x0008 #define UV_FS_CLEANEDUP 0x0010 #define INIT(subtype) \ do { \ if (req == NULL) \ return UV_EINVAL; \ uv_fs_req_init(loop, req, subtype, cb); \ } \ while (0) #define POST \ do { \ if (cb != NULL) { \ uv__req_register(loop, req); \ uv__work_submit(loop, \ &req->work_req, \ UV__WORK_FAST_IO, \ uv__fs_work, \ uv__fs_done); \ return 0; \ } else { \ uv__fs_work(&req->work_req); \ return req->result; \ } \ } \ while (0) #define SET_REQ_RESULT(req, result_value) \ do { \ req->result = (result_value); \ if (req->result == -1) { \ req->sys_errno_ = _doserrno; \ req->result = uv_translate_sys_error(req->sys_errno_); \ } \ } while (0) #define SET_REQ_WIN32_ERROR(req, sys_errno) \ do { \ req->sys_errno_ = (sys_errno); \ req->result = uv_translate_sys_error(req->sys_errno_); \ } while (0) #define SET_REQ_UV_ERROR(req, uv_errno, sys_errno) \ do { \ req->result = (uv_errno); \ req->sys_errno_ = (sys_errno); \ } while (0) #define VERIFY_FD(fd, req) \ if (fd == -1) { \ req->result = UV_EBADF; \ req->sys_errno_ = ERROR_INVALID_HANDLE; \ return; \ } #define MILLIONu (1000U * 1000U) #define BILLIONu (1000U * 1000U * 1000U) #define FILETIME_TO_UINT(filetime) \ (*((uint64_t*) &(filetime)) - (uint64_t) 116444736 * BILLIONu) #define FILETIME_TO_TIME_T(filetime) \ (FILETIME_TO_UINT(filetime) / (10u * MILLIONu)) #define FILETIME_TO_TIME_NS(filetime, secs) \ ((FILETIME_TO_UINT(filetime) - (secs * (uint64_t) 10 * MILLIONu)) * 100U) #define FILETIME_TO_TIMESPEC(ts, filetime) \ do { \ (ts).tv_sec = (long) FILETIME_TO_TIME_T(filetime); \ (ts).tv_nsec = (long) FILETIME_TO_TIME_NS(filetime, (ts).tv_sec); \ } while(0) #define TIME_T_TO_FILETIME(time, filetime_ptr) \ do { \ uint64_t bigtime = ((uint64_t) ((time) * (uint64_t) 10 * MILLIONu)) + \ (uint64_t) 116444736 * BILLIONu; \ (filetime_ptr)->dwLowDateTime = bigtime & 0xFFFFFFFF; \ (filetime_ptr)->dwHighDateTime = bigtime >> 32; \ } while(0) #define IS_SLASH(c) ((c) == L'\\' || (c) == L'/') #define IS_LETTER(c) (((c) >= L'a' && (c) <= L'z') || \ ((c) >= L'A' && (c) <= L'Z')) #define MIN(a,b) (((a) < (b)) ? (a) : (b)) const WCHAR JUNCTION_PREFIX[] = L"\\??\\"; const WCHAR JUNCTION_PREFIX_LEN = 4; const WCHAR LONG_PATH_PREFIX[] = L"\\\\?\\"; const WCHAR LONG_PATH_PREFIX_LEN = 4; const WCHAR UNC_PATH_PREFIX[] = L"\\\\?\\UNC\\"; const WCHAR UNC_PATH_PREFIX_LEN = 8; static int uv__file_symlink_usermode_flag = SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE; static DWORD uv__allocation_granularity; void uv_fs_init(void) { SYSTEM_INFO system_info; GetSystemInfo(&system_info); uv__allocation_granularity = system_info.dwAllocationGranularity; uv__fd_hash_init(); } INLINE static int fs__capture_path(uv_fs_t* req, const char* path, const char* new_path, const int copy_path) { char* buf; char* pos; ssize_t buf_sz = 0, path_len = 0, pathw_len = 0, new_pathw_len = 0; /* new_path can only be set if path is also set. */ assert(new_path == NULL || path != NULL); if (path != NULL) { pathw_len = MultiByteToWideChar(CP_UTF8, 0, path, -1, NULL, 0); if (pathw_len == 0) { return GetLastError(); } buf_sz += pathw_len * sizeof(WCHAR); } if (path != NULL && copy_path) { path_len = 1 + strlen(path); buf_sz += path_len; } if (new_path != NULL) { new_pathw_len = MultiByteToWideChar(CP_UTF8, 0, new_path, -1, NULL, 0); if (new_pathw_len == 0) { return GetLastError(); } buf_sz += new_pathw_len * sizeof(WCHAR); } if (buf_sz == 0) { req->file.pathw = NULL; req->fs.info.new_pathw = NULL; req->path = NULL; return 0; } buf = (char*) uv__malloc(buf_sz); if (buf == NULL) { return ERROR_OUTOFMEMORY; } pos = buf; if (path != NULL) { DWORD r = MultiByteToWideChar(CP_UTF8, 0, path, -1, (WCHAR*) pos, pathw_len); assert(r == (DWORD) pathw_len); req->file.pathw = (WCHAR*) pos; pos += r * sizeof(WCHAR); } else { req->file.pathw = NULL; } if (new_path != NULL) { DWORD r = MultiByteToWideChar(CP_UTF8, 0, new_path, -1, (WCHAR*) pos, new_pathw_len); assert(r == (DWORD) new_pathw_len); req->fs.info.new_pathw = (WCHAR*) pos; pos += r * sizeof(WCHAR); } else { req->fs.info.new_pathw = NULL; } req->path = path; if (path != NULL && copy_path) { memcpy(pos, path, path_len); assert(path_len == buf_sz - (pos - buf)); req->path = pos; } req->flags |= UV_FS_FREE_PATHS; return 0; } INLINE static void uv_fs_req_init(uv_loop_t* loop, uv_fs_t* req, uv_fs_type fs_type, const uv_fs_cb cb) { uv__once_init(); UV_REQ_INIT(req, UV_FS); req->loop = loop; req->flags = 0; req->fs_type = fs_type; req->sys_errno_ = 0; req->result = 0; req->ptr = NULL; req->path = NULL; req->cb = cb; memset(&req->fs, 0, sizeof(req->fs)); } static int fs__wide_to_utf8(WCHAR* w_source_ptr, DWORD w_source_len, char** target_ptr, uint64_t* target_len_ptr) { int r; int target_len; char* target; target_len = WideCharToMultiByte(CP_UTF8, 0, w_source_ptr, w_source_len, NULL, 0, NULL, NULL); if (target_len == 0) { return -1; } if (target_len_ptr != NULL) { *target_len_ptr = target_len; } if (target_ptr == NULL) { return 0; } target = (char *)uv__malloc(target_len + 1); if (target == NULL) { SetLastError(ERROR_OUTOFMEMORY); return -1; } r = WideCharToMultiByte(CP_UTF8, 0, w_source_ptr, w_source_len, target, target_len, NULL, NULL); assert(r == target_len); target[target_len] = '\0'; *target_ptr = target; return 0; } INLINE static int fs__readlink_handle(HANDLE handle, char** target_ptr, uint64_t* target_len_ptr) { char buffer[MAXIMUM_REPARSE_DATA_BUFFER_SIZE]; REPARSE_DATA_BUFFER* reparse_data = (REPARSE_DATA_BUFFER*) buffer; WCHAR* w_target; DWORD w_target_len; DWORD bytes; size_t i; size_t len; if (!DeviceIoControl(handle, FSCTL_GET_REPARSE_POINT, NULL, 0, buffer, sizeof buffer, &bytes, NULL)) { return -1; } if (reparse_data->ReparseTag == IO_REPARSE_TAG_SYMLINK) { /* Real symlink */ w_target = reparse_data->SymbolicLinkReparseBuffer.PathBuffer + (reparse_data->SymbolicLinkReparseBuffer.SubstituteNameOffset / sizeof(WCHAR)); w_target_len = reparse_data->SymbolicLinkReparseBuffer.SubstituteNameLength / sizeof(WCHAR); /* Real symlinks can contain pretty much everything, but the only thing we * really care about is undoing the implicit conversion to an NT namespaced * path that CreateSymbolicLink will perform on absolute paths. If the path * is win32-namespaced then the user must have explicitly made it so, and * we better just return the unmodified reparse data. */ if (w_target_len >= 4 && w_target[0] == L'\\' && w_target[1] == L'?' && w_target[2] == L'?' && w_target[3] == L'\\') { /* Starts with \??\ */ if (w_target_len >= 6 && ((w_target[4] >= L'A' && w_target[4] <= L'Z') || (w_target[4] >= L'a' && w_target[4] <= L'z')) && w_target[5] == L':' && (w_target_len == 6 || w_target[6] == L'\\')) { /* \??\:\ */ w_target += 4; w_target_len -= 4; } else if (w_target_len >= 8 && (w_target[4] == L'U' || w_target[4] == L'u') && (w_target[5] == L'N' || w_target[5] == L'n') && (w_target[6] == L'C' || w_target[6] == L'c') && w_target[7] == L'\\') { /* \??\UNC\\\ - make sure the final path looks like * \\\\ */ w_target += 6; w_target[0] = L'\\'; w_target_len -= 6; } } } else if (reparse_data->ReparseTag == IO_REPARSE_TAG_MOUNT_POINT) { /* Junction. */ w_target = reparse_data->MountPointReparseBuffer.PathBuffer + (reparse_data->MountPointReparseBuffer.SubstituteNameOffset / sizeof(WCHAR)); w_target_len = reparse_data->MountPointReparseBuffer.SubstituteNameLength / sizeof(WCHAR); /* Only treat junctions that look like \??\:\ as symlink. Junctions * can also be used as mount points, like \??\Volume{}, but that's * confusing for programs since they wouldn't be able to actually * understand such a path when returned by uv_readlink(). UNC paths are * never valid for junctions so we don't care about them. */ if (!(w_target_len >= 6 && w_target[0] == L'\\' && w_target[1] == L'?' && w_target[2] == L'?' && w_target[3] == L'\\' && ((w_target[4] >= L'A' && w_target[4] <= L'Z') || (w_target[4] >= L'a' && w_target[4] <= L'z')) && w_target[5] == L':' && (w_target_len == 6 || w_target[6] == L'\\'))) { SetLastError(ERROR_SYMLINK_NOT_SUPPORTED); return -1; } /* Remove leading \??\ */ w_target += 4; w_target_len -= 4; } else if (reparse_data->ReparseTag == IO_REPARSE_TAG_APPEXECLINK) { /* String #3 in the list has the target filename. */ if (reparse_data->AppExecLinkReparseBuffer.StringCount < 3) { SetLastError(ERROR_SYMLINK_NOT_SUPPORTED); return -1; } w_target = reparse_data->AppExecLinkReparseBuffer.StringList; /* The StringList buffer contains a list of strings separated by "\0", */ /* with "\0\0" terminating the list. Move to the 3rd string in the list: */ for (i = 0; i < 2; ++i) { len = wcslen(w_target); if (len == 0) { SetLastError(ERROR_SYMLINK_NOT_SUPPORTED); return -1; } w_target += len + 1; } w_target_len = wcslen(w_target); if (w_target_len == 0) { SetLastError(ERROR_SYMLINK_NOT_SUPPORTED); return -1; } /* Make sure it is an absolute path. */ if (!(w_target_len >= 3 && ((w_target[0] >= L'a' && w_target[0] <= L'z') || (w_target[0] >= L'A' && w_target[0] <= L'Z')) && w_target[1] == L':' && w_target[2] == L'\\')) { SetLastError(ERROR_SYMLINK_NOT_SUPPORTED); return -1; } } else { /* Reparse tag does not indicate a symlink. */ SetLastError(ERROR_SYMLINK_NOT_SUPPORTED); return -1; } return fs__wide_to_utf8(w_target, w_target_len, target_ptr, target_len_ptr); } void fs__open(uv_fs_t* req) { DWORD access; DWORD share; DWORD disposition; DWORD attributes = 0; HANDLE file; int fd, current_umask; int flags = req->fs.info.file_flags; struct uv__fd_info_s fd_info; /* Adjust flags to be compatible with the memory file mapping. Save the * original flags to emulate the correct behavior. */ if (flags & UV_FS_O_FILEMAP) { fd_info.flags = flags; fd_info.current_pos.QuadPart = 0; if ((flags & (UV_FS_O_RDONLY | UV_FS_O_WRONLY | UV_FS_O_RDWR)) == UV_FS_O_WRONLY) { /* CreateFileMapping always needs read access */ flags = (flags & ~UV_FS_O_WRONLY) | UV_FS_O_RDWR; } if (flags & UV_FS_O_APPEND) { /* Clear the append flag and ensure RDRW mode */ flags &= ~UV_FS_O_APPEND; flags &= ~(UV_FS_O_RDONLY | UV_FS_O_WRONLY | UV_FS_O_RDWR); flags |= UV_FS_O_RDWR; } } /* Obtain the active umask. umask() never fails and returns the previous * umask. */ current_umask = umask(0); umask(current_umask); /* convert flags and mode to CreateFile parameters */ switch (flags & (UV_FS_O_RDONLY | UV_FS_O_WRONLY | UV_FS_O_RDWR)) { case UV_FS_O_RDONLY: access = FILE_GENERIC_READ; break; case UV_FS_O_WRONLY: access = FILE_GENERIC_WRITE; break; case UV_FS_O_RDWR: access = FILE_GENERIC_READ | FILE_GENERIC_WRITE; break; default: goto einval; } if (flags & UV_FS_O_APPEND) { access &= ~FILE_WRITE_DATA; access |= FILE_APPEND_DATA; } /* * Here is where we deviate significantly from what CRT's _open() * does. We indiscriminately use all the sharing modes, to match * UNIX semantics. In particular, this ensures that the file can * be deleted even whilst it's open, fixing issue * https://github.com/nodejs/node-v0.x-archive/issues/1449. * We still support exclusive sharing mode, since it is necessary * for opening raw block devices, otherwise Windows will prevent * any attempt to write past the master boot record. */ if (flags & UV_FS_O_EXLOCK) { share = 0; } else { share = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE; } switch (flags & (UV_FS_O_CREAT | UV_FS_O_EXCL | UV_FS_O_TRUNC)) { case 0: case UV_FS_O_EXCL: disposition = OPEN_EXISTING; break; case UV_FS_O_CREAT: disposition = OPEN_ALWAYS; break; case UV_FS_O_CREAT | UV_FS_O_EXCL: case UV_FS_O_CREAT | UV_FS_O_TRUNC | UV_FS_O_EXCL: disposition = CREATE_NEW; break; case UV_FS_O_TRUNC: case UV_FS_O_TRUNC | UV_FS_O_EXCL: disposition = TRUNCATE_EXISTING; break; case UV_FS_O_CREAT | UV_FS_O_TRUNC: disposition = CREATE_ALWAYS; break; default: goto einval; } attributes |= FILE_ATTRIBUTE_NORMAL; if (flags & UV_FS_O_CREAT) { if (!((req->fs.info.mode & ~current_umask) & _S_IWRITE)) { attributes |= FILE_ATTRIBUTE_READONLY; } } if (flags & UV_FS_O_TEMPORARY ) { attributes |= FILE_FLAG_DELETE_ON_CLOSE | FILE_ATTRIBUTE_TEMPORARY; access |= DELETE; } if (flags & UV_FS_O_SHORT_LIVED) { attributes |= FILE_ATTRIBUTE_TEMPORARY; } switch (flags & (UV_FS_O_SEQUENTIAL | UV_FS_O_RANDOM)) { case 0: break; case UV_FS_O_SEQUENTIAL: attributes |= FILE_FLAG_SEQUENTIAL_SCAN; break; case UV_FS_O_RANDOM: attributes |= FILE_FLAG_RANDOM_ACCESS; break; default: goto einval; } if (flags & UV_FS_O_DIRECT) { /* * FILE_APPEND_DATA and FILE_FLAG_NO_BUFFERING are mutually exclusive. * Windows returns 87, ERROR_INVALID_PARAMETER if these are combined. * * FILE_APPEND_DATA is included in FILE_GENERIC_WRITE: * * FILE_GENERIC_WRITE = STANDARD_RIGHTS_WRITE | * FILE_WRITE_DATA | * FILE_WRITE_ATTRIBUTES | * FILE_WRITE_EA | * FILE_APPEND_DATA | * SYNCHRONIZE * * Note: Appends are also permitted by FILE_WRITE_DATA. * * In order for direct writes and direct appends to succeed, we therefore * exclude FILE_APPEND_DATA if FILE_WRITE_DATA is specified, and otherwise * fail if the user's sole permission is a direct append, since this * particular combination is invalid. */ if (access & FILE_APPEND_DATA) { if (access & FILE_WRITE_DATA) { access &= ~FILE_APPEND_DATA; } else { goto einval; } } attributes |= FILE_FLAG_NO_BUFFERING; } switch (flags & (UV_FS_O_DSYNC | UV_FS_O_SYNC)) { case 0: break; case UV_FS_O_DSYNC: case UV_FS_O_SYNC: attributes |= FILE_FLAG_WRITE_THROUGH; break; default: goto einval; } /* Setting this flag makes it possible to open a directory. */ attributes |= FILE_FLAG_BACKUP_SEMANTICS; file = CreateFileW(req->file.pathw, access, share, NULL, disposition, attributes, NULL); if (file == INVALID_HANDLE_VALUE) { DWORD error = GetLastError(); if (error == ERROR_FILE_EXISTS && (flags & UV_FS_O_CREAT) && !(flags & UV_FS_O_EXCL)) { /* Special case: when ERROR_FILE_EXISTS happens and UV_FS_O_CREAT was * specified, it means the path referred to a directory. */ SET_REQ_UV_ERROR(req, UV_EISDIR, error); } else { SET_REQ_WIN32_ERROR(req, GetLastError()); } return; } fd = _open_osfhandle((intptr_t) file, flags); if (fd < 0) { /* The only known failure mode for _open_osfhandle() is EMFILE, in which * case GetLastError() will return zero. However we'll try to handle other * errors as well, should they ever occur. */ if (errno == EMFILE) SET_REQ_UV_ERROR(req, UV_EMFILE, ERROR_TOO_MANY_OPEN_FILES); else if (GetLastError() != ERROR_SUCCESS) SET_REQ_WIN32_ERROR(req, GetLastError()); else SET_REQ_WIN32_ERROR(req, (DWORD) UV_UNKNOWN); CloseHandle(file); return; } if (flags & UV_FS_O_FILEMAP) { FILE_STANDARD_INFO file_info; if (!GetFileInformationByHandleEx(file, FileStandardInfo, &file_info, sizeof file_info)) { SET_REQ_WIN32_ERROR(req, GetLastError()); CloseHandle(file); return; } fd_info.is_directory = file_info.Directory; if (fd_info.is_directory) { fd_info.size.QuadPart = 0; fd_info.mapping = INVALID_HANDLE_VALUE; } else { if (!GetFileSizeEx(file, &fd_info.size)) { SET_REQ_WIN32_ERROR(req, GetLastError()); CloseHandle(file); return; } if (fd_info.size.QuadPart == 0) { fd_info.mapping = INVALID_HANDLE_VALUE; } else { DWORD flProtect = (fd_info.flags & (UV_FS_O_RDONLY | UV_FS_O_WRONLY | UV_FS_O_RDWR)) == UV_FS_O_RDONLY ? PAGE_READONLY : PAGE_READWRITE; fd_info.mapping = CreateFileMapping(file, NULL, flProtect, fd_info.size.HighPart, fd_info.size.LowPart, NULL); if (fd_info.mapping == NULL) { SET_REQ_WIN32_ERROR(req, GetLastError()); CloseHandle(file); return; } } } uv__fd_hash_add(fd, &fd_info); } SET_REQ_RESULT(req, fd); return; einval: SET_REQ_UV_ERROR(req, UV_EINVAL, ERROR_INVALID_PARAMETER); } void fs__close(uv_fs_t* req) { int fd = req->file.fd; int result; struct uv__fd_info_s fd_info; VERIFY_FD(fd, req); if (uv__fd_hash_remove(fd, &fd_info)) { if (fd_info.mapping != INVALID_HANDLE_VALUE) { CloseHandle(fd_info.mapping); } } if (fd > 2) result = _close(fd); else result = 0; /* _close doesn't set _doserrno on failure, but it does always set errno * to EBADF on failure. */ if (result == -1) { assert(errno == EBADF); SET_REQ_UV_ERROR(req, UV_EBADF, ERROR_INVALID_HANDLE); } else { req->result = 0; } } LONG fs__filemap_ex_filter(LONG excode, PEXCEPTION_POINTERS pep, int* perror) { if (excode != EXCEPTION_IN_PAGE_ERROR) { return EXCEPTION_CONTINUE_SEARCH; } assert(perror != NULL); if (pep != NULL && pep->ExceptionRecord != NULL && pep->ExceptionRecord->NumberParameters >= 3) { NTSTATUS status = (NTSTATUS)pep->ExceptionRecord->ExceptionInformation[3]; *perror = pRtlNtStatusToDosError(status); if (*perror != ERROR_SUCCESS) { return EXCEPTION_EXECUTE_HANDLER; } } *perror = UV_UNKNOWN; return EXCEPTION_EXECUTE_HANDLER; } void fs__read_filemap(uv_fs_t* req, struct uv__fd_info_s* fd_info) { int fd = req->file.fd; /* VERIFY_FD done in fs__read */ int rw_flags = fd_info->flags & (UV_FS_O_RDONLY | UV_FS_O_WRONLY | UV_FS_O_RDWR); size_t read_size, done_read; unsigned int index; LARGE_INTEGER pos, end_pos; size_t view_offset; LARGE_INTEGER view_base; void* view; if (rw_flags == UV_FS_O_WRONLY) { SET_REQ_WIN32_ERROR(req, ERROR_ACCESS_DENIED); return; } if (fd_info->is_directory) { SET_REQ_WIN32_ERROR(req, ERROR_INVALID_FUNCTION); return; } if (req->fs.info.offset == -1) { pos = fd_info->current_pos; } else { pos.QuadPart = req->fs.info.offset; } /* Make sure we wont read past EOF. */ if (pos.QuadPart >= fd_info->size.QuadPart) { SET_REQ_RESULT(req, 0); return; } read_size = 0; for (index = 0; index < req->fs.info.nbufs; ++index) { read_size += req->fs.info.bufs[index].len; } read_size = (size_t) MIN((LONGLONG) read_size, fd_info->size.QuadPart - pos.QuadPart); if (read_size == 0) { SET_REQ_RESULT(req, 0); return; } end_pos.QuadPart = pos.QuadPart + read_size; view_offset = pos.QuadPart % uv__allocation_granularity; view_base.QuadPart = pos.QuadPart - view_offset; view = MapViewOfFile(fd_info->mapping, FILE_MAP_READ, view_base.HighPart, view_base.LowPart, view_offset + read_size); if (view == NULL) { SET_REQ_WIN32_ERROR(req, GetLastError()); return; } done_read = 0; for (index = 0; index < req->fs.info.nbufs && done_read < read_size; ++index) { int err = 0; size_t this_read_size = MIN(req->fs.info.bufs[index].len, read_size - done_read); #ifdef _MSC_VER __try { #endif memcpy(req->fs.info.bufs[index].base, (char*)view + view_offset + done_read, this_read_size); #ifdef _MSC_VER } __except (fs__filemap_ex_filter(GetExceptionCode(), GetExceptionInformation(), &err)) { SET_REQ_WIN32_ERROR(req, err); UnmapViewOfFile(view); return; } #endif done_read += this_read_size; } assert(done_read == read_size); if (!UnmapViewOfFile(view)) { SET_REQ_WIN32_ERROR(req, GetLastError()); return; } if (req->fs.info.offset == -1) { fd_info->current_pos = end_pos; uv__fd_hash_add(fd, fd_info); } SET_REQ_RESULT(req, read_size); return; } void fs__read(uv_fs_t* req) { int fd = req->file.fd; int64_t offset = req->fs.info.offset; HANDLE handle; OVERLAPPED overlapped, *overlapped_ptr; LARGE_INTEGER offset_; DWORD bytes; DWORD error; int result; unsigned int index; LARGE_INTEGER original_position; LARGE_INTEGER zero_offset; int restore_position; struct uv__fd_info_s fd_info; VERIFY_FD(fd, req); if (uv__fd_hash_get(fd, &fd_info)) { fs__read_filemap(req, &fd_info); return; } zero_offset.QuadPart = 0; restore_position = 0; handle = uv__get_osfhandle(fd); if (handle == INVALID_HANDLE_VALUE) { SET_REQ_WIN32_ERROR(req, ERROR_INVALID_HANDLE); return; } if (offset != -1) { memset(&overlapped, 0, sizeof overlapped); overlapped_ptr = &overlapped; if (SetFilePointerEx(handle, zero_offset, &original_position, FILE_CURRENT)) { restore_position = 1; } } else { overlapped_ptr = NULL; } index = 0; bytes = 0; do { DWORD incremental_bytes; if (offset != -1) { offset_.QuadPart = offset + bytes; overlapped.Offset = offset_.LowPart; overlapped.OffsetHigh = offset_.HighPart; } result = ReadFile(handle, req->fs.info.bufs[index].base, req->fs.info.bufs[index].len, &incremental_bytes, overlapped_ptr); bytes += incremental_bytes; ++index; } while (result && index < req->fs.info.nbufs); if (restore_position) SetFilePointerEx(handle, original_position, NULL, FILE_BEGIN); if (result || bytes > 0) { SET_REQ_RESULT(req, bytes); } else { error = GetLastError(); if (error == ERROR_HANDLE_EOF) { SET_REQ_RESULT(req, bytes); } else { SET_REQ_WIN32_ERROR(req, error); } } } void fs__write_filemap(uv_fs_t* req, HANDLE file, struct uv__fd_info_s* fd_info) { int fd = req->file.fd; /* VERIFY_FD done in fs__write */ int force_append = fd_info->flags & UV_FS_O_APPEND; int rw_flags = fd_info->flags & (UV_FS_O_RDONLY | UV_FS_O_WRONLY | UV_FS_O_RDWR); size_t write_size, done_write; unsigned int index; LARGE_INTEGER zero, pos, end_pos; size_t view_offset; LARGE_INTEGER view_base; void* view; FILETIME ft; if (rw_flags == UV_FS_O_RDONLY) { SET_REQ_WIN32_ERROR(req, ERROR_ACCESS_DENIED); return; } if (fd_info->is_directory) { SET_REQ_WIN32_ERROR(req, ERROR_INVALID_FUNCTION); return; } write_size = 0; for (index = 0; index < req->fs.info.nbufs; ++index) { write_size += req->fs.info.bufs[index].len; } if (write_size == 0) { SET_REQ_RESULT(req, 0); return; } zero.QuadPart = 0; if (force_append) { pos = fd_info->size; } else if (req->fs.info.offset == -1) { pos = fd_info->current_pos; } else { pos.QuadPart = req->fs.info.offset; } end_pos.QuadPart = pos.QuadPart + write_size; /* Recreate the mapping to enlarge the file if needed */ if (end_pos.QuadPart > fd_info->size.QuadPart) { if (fd_info->mapping != INVALID_HANDLE_VALUE) { CloseHandle(fd_info->mapping); } fd_info->mapping = CreateFileMapping(file, NULL, PAGE_READWRITE, end_pos.HighPart, end_pos.LowPart, NULL); if (fd_info->mapping == NULL) { SET_REQ_WIN32_ERROR(req, GetLastError()); CloseHandle(file); fd_info->mapping = INVALID_HANDLE_VALUE; fd_info->size.QuadPart = 0; fd_info->current_pos.QuadPart = 0; uv__fd_hash_add(fd, fd_info); return; } fd_info->size = end_pos; uv__fd_hash_add(fd, fd_info); } view_offset = pos.QuadPart % uv__allocation_granularity; view_base.QuadPart = pos.QuadPart - view_offset; view = MapViewOfFile(fd_info->mapping, FILE_MAP_WRITE, view_base.HighPart, view_base.LowPart, view_offset + write_size); if (view == NULL) { SET_REQ_WIN32_ERROR(req, GetLastError()); return; } done_write = 0; for (index = 0; index < req->fs.info.nbufs; ++index) { int err = 0; #ifdef _MSC_VER __try { #endif memcpy((char*)view + view_offset + done_write, req->fs.info.bufs[index].base, req->fs.info.bufs[index].len); #ifdef _MSC_VER } __except (fs__filemap_ex_filter(GetExceptionCode(), GetExceptionInformation(), &err)) { SET_REQ_WIN32_ERROR(req, err); UnmapViewOfFile(view); return; } #endif done_write += req->fs.info.bufs[index].len; } assert(done_write == write_size); if (!FlushViewOfFile(view, 0)) { SET_REQ_WIN32_ERROR(req, GetLastError()); UnmapViewOfFile(view); return; } if (!UnmapViewOfFile(view)) { SET_REQ_WIN32_ERROR(req, GetLastError()); return; } if (req->fs.info.offset == -1) { fd_info->current_pos = end_pos; uv__fd_hash_add(fd, fd_info); } GetSystemTimeAsFileTime(&ft); SetFileTime(file, NULL, NULL, &ft); SET_REQ_RESULT(req, done_write); } void fs__write(uv_fs_t* req) { int fd = req->file.fd; int64_t offset = req->fs.info.offset; HANDLE handle; OVERLAPPED overlapped, *overlapped_ptr; LARGE_INTEGER offset_; DWORD bytes; int result; unsigned int index; LARGE_INTEGER original_position; LARGE_INTEGER zero_offset; int restore_position; struct uv__fd_info_s fd_info; VERIFY_FD(fd, req); zero_offset.QuadPart = 0; restore_position = 0; handle = uv__get_osfhandle(fd); if (handle == INVALID_HANDLE_VALUE) { SET_REQ_WIN32_ERROR(req, ERROR_INVALID_HANDLE); return; } if (uv__fd_hash_get(fd, &fd_info)) { fs__write_filemap(req, handle, &fd_info); return; } if (offset != -1) { memset(&overlapped, 0, sizeof overlapped); overlapped_ptr = &overlapped; if (SetFilePointerEx(handle, zero_offset, &original_position, FILE_CURRENT)) { restore_position = 1; } } else { overlapped_ptr = NULL; } index = 0; bytes = 0; do { DWORD incremental_bytes; if (offset != -1) { offset_.QuadPart = offset + bytes; overlapped.Offset = offset_.LowPart; overlapped.OffsetHigh = offset_.HighPart; } result = WriteFile(handle, req->fs.info.bufs[index].base, req->fs.info.bufs[index].len, &incremental_bytes, overlapped_ptr); bytes += incremental_bytes; ++index; } while (result && index < req->fs.info.nbufs); if (restore_position) SetFilePointerEx(handle, original_position, NULL, FILE_BEGIN); if (result || bytes > 0) { SET_REQ_RESULT(req, bytes); } else { SET_REQ_WIN32_ERROR(req, GetLastError()); } } void fs__rmdir(uv_fs_t* req) { int result = _wrmdir(req->file.pathw); SET_REQ_RESULT(req, result); } void fs__unlink(uv_fs_t* req) { const WCHAR* pathw = req->file.pathw; HANDLE handle; BY_HANDLE_FILE_INFORMATION info; FILE_DISPOSITION_INFORMATION disposition; IO_STATUS_BLOCK iosb; NTSTATUS status; handle = CreateFileW(pathw, FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | DELETE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS, NULL); if (handle == INVALID_HANDLE_VALUE) { SET_REQ_WIN32_ERROR(req, GetLastError()); return; } if (!GetFileInformationByHandle(handle, &info)) { SET_REQ_WIN32_ERROR(req, GetLastError()); CloseHandle(handle); return; } if (info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { /* Do not allow deletion of directories, unless it is a symlink. When the * path refers to a non-symlink directory, report EPERM as mandated by * POSIX.1. */ /* Check if it is a reparse point. If it's not, it's a normal directory. */ if (!(info.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)) { SET_REQ_WIN32_ERROR(req, ERROR_ACCESS_DENIED); CloseHandle(handle); return; } /* Read the reparse point and check if it is a valid symlink. If not, don't * unlink. */ if (fs__readlink_handle(handle, NULL, NULL) < 0) { DWORD error = GetLastError(); if (error == ERROR_SYMLINK_NOT_SUPPORTED) error = ERROR_ACCESS_DENIED; SET_REQ_WIN32_ERROR(req, error); CloseHandle(handle); return; } } if (info.dwFileAttributes & FILE_ATTRIBUTE_READONLY) { /* Remove read-only attribute */ FILE_BASIC_INFORMATION basic = { 0 }; basic.FileAttributes = (info.dwFileAttributes & ~FILE_ATTRIBUTE_READONLY) | FILE_ATTRIBUTE_ARCHIVE; status = pNtSetInformationFile(handle, &iosb, &basic, sizeof basic, FileBasicInformation); if (!NT_SUCCESS(status)) { SET_REQ_WIN32_ERROR(req, pRtlNtStatusToDosError(status)); CloseHandle(handle); return; } } /* Try to set the delete flag. */ disposition.DeleteFile = TRUE; status = pNtSetInformationFile(handle, &iosb, &disposition, sizeof disposition, FileDispositionInformation); if (NT_SUCCESS(status)) { SET_REQ_SUCCESS(req); } else { SET_REQ_WIN32_ERROR(req, pRtlNtStatusToDosError(status)); } CloseHandle(handle); } void fs__mkdir(uv_fs_t* req) { /* TODO: use req->mode. */ req->result = _wmkdir(req->file.pathw); if (req->result == -1) { req->sys_errno_ = _doserrno; req->result = req->sys_errno_ == ERROR_INVALID_NAME ? UV_EINVAL : uv_translate_sys_error(req->sys_errno_); } } typedef int (*uv__fs_mktemp_func)(uv_fs_t* req); /* OpenBSD original: lib/libc/stdio/mktemp.c */ void fs__mktemp(uv_fs_t* req, uv__fs_mktemp_func func) { static const WCHAR *tempchars = L"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; static const size_t num_chars = 62; static const size_t num_x = 6; WCHAR *cp, *ep; unsigned int tries, i; size_t len; uint64_t v; len = wcslen(req->file.pathw); ep = req->file.pathw + len; if (len < num_x || wcsncmp(ep - num_x, L"XXXXXX", num_x)) { SET_REQ_UV_ERROR(req, UV_EINVAL, ERROR_INVALID_PARAMETER); return; } tries = TMP_MAX; do { if (uv__random_rtlgenrandom((void *)&v, sizeof(v)) < 0) { SET_REQ_UV_ERROR(req, UV_EIO, ERROR_IO_DEVICE); break; } cp = ep - num_x; for (i = 0; i < num_x; i++) { *cp++ = tempchars[v % num_chars]; v /= num_chars; } if (func(req)) { if (req->result >= 0) { len = strlen(req->path); wcstombs((char*) req->path + len - num_x, ep - num_x, num_x); } break; } } while (--tries); if (tries == 0) { SET_REQ_RESULT(req, -1); } } static int fs__mkdtemp_func(uv_fs_t* req) { if (_wmkdir(req->file.pathw) == 0) { SET_REQ_RESULT(req, 0); return 1; } else if (errno != EEXIST) { SET_REQ_RESULT(req, -1); return 1; } return 0; } void fs__mkdtemp(uv_fs_t* req) { fs__mktemp(req, fs__mkdtemp_func); } static int fs__mkstemp_func(uv_fs_t* req) { HANDLE file; int fd; file = CreateFileW(req->file.pathw, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); if (file == INVALID_HANDLE_VALUE) { DWORD error; error = GetLastError(); /* If the file exists, the main fs__mktemp() function will retry. If it's another error, we want to stop. */ if (error != ERROR_FILE_EXISTS) { SET_REQ_WIN32_ERROR(req, error); return 1; } return 0; } fd = _open_osfhandle((intptr_t) file, 0); if (fd < 0) { /* The only known failure mode for _open_osfhandle() is EMFILE, in which * case GetLastError() will return zero. However we'll try to handle other * errors as well, should they ever occur. */ if (errno == EMFILE) SET_REQ_UV_ERROR(req, UV_EMFILE, ERROR_TOO_MANY_OPEN_FILES); else if (GetLastError() != ERROR_SUCCESS) SET_REQ_WIN32_ERROR(req, GetLastError()); else SET_REQ_WIN32_ERROR(req, UV_UNKNOWN); CloseHandle(file); return 1; } SET_REQ_RESULT(req, fd); return 1; } void fs__mkstemp(uv_fs_t* req) { fs__mktemp(req, fs__mkstemp_func); } void fs__scandir(uv_fs_t* req) { static const size_t dirents_initial_size = 32; HANDLE dir_handle = INVALID_HANDLE_VALUE; uv__dirent_t** dirents = NULL; size_t dirents_size = 0; size_t dirents_used = 0; IO_STATUS_BLOCK iosb; NTSTATUS status; /* Buffer to hold directory entries returned by NtQueryDirectoryFile. * It's important that this buffer can hold at least one entry, regardless * of the length of the file names present in the enumerated directory. * A file name is at most 256 WCHARs long. * According to MSDN, the buffer must be aligned at an 8-byte boundary. */ #if _MSC_VER __declspec(align(8)) char buffer[8192]; #else __attribute__ ((aligned (8))) char buffer[8192]; #endif STATIC_ASSERT(sizeof buffer >= sizeof(FILE_DIRECTORY_INFORMATION) + 256 * sizeof(WCHAR)); /* Open the directory. */ dir_handle = CreateFileW(req->file.pathw, FILE_LIST_DIRECTORY | SYNCHRONIZE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); if (dir_handle == INVALID_HANDLE_VALUE) goto win32_error; /* Read the first chunk. */ status = pNtQueryDirectoryFile(dir_handle, NULL, NULL, NULL, &iosb, &buffer, sizeof buffer, FileDirectoryInformation, FALSE, NULL, TRUE); /* If the handle is not a directory, we'll get STATUS_INVALID_PARAMETER. * This should be reported back as UV_ENOTDIR. */ if (status == STATUS_INVALID_PARAMETER) goto not_a_directory_error; while (NT_SUCCESS(status)) { char* position = buffer; size_t next_entry_offset = 0; do { FILE_DIRECTORY_INFORMATION* info; uv__dirent_t* dirent; size_t wchar_len; size_t utf8_len; /* Obtain a pointer to the current directory entry. */ position += next_entry_offset; info = (FILE_DIRECTORY_INFORMATION*) position; /* Fetch the offset to the next directory entry. */ next_entry_offset = info->NextEntryOffset; /* Compute the length of the filename in WCHARs. */ wchar_len = info->FileNameLength / sizeof info->FileName[0]; /* Skip over '.' and '..' entries. It has been reported that * the SharePoint driver includes the terminating zero byte in * the filename length. Strip those first. */ while (wchar_len > 0 && info->FileName[wchar_len - 1] == L'\0') wchar_len -= 1; if (wchar_len == 0) continue; if (wchar_len == 1 && info->FileName[0] == L'.') continue; if (wchar_len == 2 && info->FileName[0] == L'.' && info->FileName[1] == L'.') continue; /* Compute the space required to store the filename as UTF-8. */ utf8_len = WideCharToMultiByte( CP_UTF8, 0, &info->FileName[0], wchar_len, NULL, 0, NULL, NULL); if (utf8_len == 0) goto win32_error; /* Resize the dirent array if needed. */ if (dirents_used >= dirents_size) { size_t new_dirents_size = dirents_size == 0 ? dirents_initial_size : dirents_size << 1; uv__dirent_t** new_dirents = (uv__dirent_t **)uv__realloc(dirents, new_dirents_size * sizeof *dirents); if (new_dirents == NULL) goto out_of_memory_error; dirents_size = new_dirents_size; dirents = new_dirents; } /* Allocate space for the uv dirent structure. The dirent structure * includes room for the first character of the filename, but `utf8_len` * doesn't count the NULL terminator at this point. */ dirent = (uv__dirent_t *)uv__malloc(sizeof *dirent + utf8_len); if (dirent == NULL) goto out_of_memory_error; dirents[dirents_used++] = dirent; /* Convert file name to UTF-8. */ if (WideCharToMultiByte(CP_UTF8, 0, &info->FileName[0], wchar_len, &dirent->d_name[0], utf8_len, NULL, NULL) == 0) goto win32_error; /* Add a null terminator to the filename. */ dirent->d_name[utf8_len] = '\0'; /* Fill out the type field. */ if (info->FileAttributes & FILE_ATTRIBUTE_DEVICE) dirent->d_type = UV__DT_CHAR; else if (info->FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) dirent->d_type = UV__DT_LINK; else if (info->FileAttributes & FILE_ATTRIBUTE_DIRECTORY) dirent->d_type = UV__DT_DIR; else dirent->d_type = UV__DT_FILE; } while (next_entry_offset != 0); /* Read the next chunk. */ status = pNtQueryDirectoryFile(dir_handle, NULL, NULL, NULL, &iosb, &buffer, sizeof buffer, FileDirectoryInformation, FALSE, NULL, FALSE); /* After the first pNtQueryDirectoryFile call, the function may return * STATUS_SUCCESS even if the buffer was too small to hold at least one * directory entry. */ if (status == STATUS_SUCCESS && iosb.Information == 0) status = STATUS_BUFFER_OVERFLOW; } if (status != STATUS_NO_MORE_FILES) goto nt_error; CloseHandle(dir_handle); /* Store the result in the request object. */ req->ptr = dirents; if (dirents != NULL) req->flags |= UV_FS_FREE_PTR; SET_REQ_RESULT(req, dirents_used); /* `nbufs` will be used as index by uv_fs_scandir_next. */ req->fs.info.nbufs = 0; return; nt_error: SET_REQ_WIN32_ERROR(req, pRtlNtStatusToDosError(status)); goto cleanup; win32_error: SET_REQ_WIN32_ERROR(req, GetLastError()); goto cleanup; not_a_directory_error: SET_REQ_UV_ERROR(req, UV_ENOTDIR, ERROR_DIRECTORY); goto cleanup; out_of_memory_error: SET_REQ_UV_ERROR(req, UV_ENOMEM, ERROR_OUTOFMEMORY); goto cleanup; cleanup: if (dir_handle != INVALID_HANDLE_VALUE) CloseHandle(dir_handle); while (dirents_used > 0) uv__free(dirents[--dirents_used]); if (dirents != NULL) uv__free(dirents); } void fs__opendir(uv_fs_t* req) { WCHAR* pathw; size_t len; const WCHAR* fmt; WCHAR* find_path; uv_dir_t* dir; pathw = req->file.pathw; dir = NULL; find_path = NULL; /* Figure out whether path is a file or a directory. */ if (!(GetFileAttributesW(pathw) & FILE_ATTRIBUTE_DIRECTORY)) { SET_REQ_UV_ERROR(req, UV_ENOTDIR, ERROR_DIRECTORY); goto error; } dir = (uv_dir_t *)uv__malloc(sizeof(*dir)); if (dir == NULL) { SET_REQ_UV_ERROR(req, UV_ENOMEM, ERROR_OUTOFMEMORY); goto error; } len = wcslen(pathw); if (len == 0) fmt = L"./*"; else if (IS_SLASH(pathw[len - 1])) fmt = L"%s*"; else fmt = L"%s\\*"; find_path = (WCHAR *)uv__malloc(sizeof(WCHAR) * (len + 4)); if (find_path == NULL) { SET_REQ_UV_ERROR(req, UV_ENOMEM, ERROR_OUTOFMEMORY); goto error; } _snwprintf(find_path, len + 3, fmt, pathw); dir->dir_handle = FindFirstFileW(find_path, &dir->find_data); uv__free(find_path); find_path = NULL; if (dir->dir_handle == INVALID_HANDLE_VALUE && GetLastError() != ERROR_FILE_NOT_FOUND) { SET_REQ_WIN32_ERROR(req, GetLastError()); goto error; } dir->need_find_call = FALSE; req->ptr = dir; SET_REQ_RESULT(req, 0); return; error: uv__free(dir); uv__free(find_path); req->ptr = NULL; } void fs__readdir(uv_fs_t* req) { uv_dir_t* dir; uv_dirent_t* dirents; uv__dirent_t dent; unsigned int dirent_idx; PWIN32_FIND_DATAW find_data; unsigned int i; int r; req->flags |= UV_FS_FREE_PTR; dir = (uv_dir_t *)req->ptr; dirents = dir->dirents; memset(dirents, 0, dir->nentries * sizeof(*dir->dirents)); find_data = &dir->find_data; dirent_idx = 0; while (dirent_idx < dir->nentries) { if (dir->need_find_call && FindNextFileW(dir->dir_handle, find_data) == 0) { if (GetLastError() == ERROR_NO_MORE_FILES) break; goto error; } /* Skip "." and ".." entries. */ if (find_data->cFileName[0] == L'.' && (find_data->cFileName[1] == L'\0' || (find_data->cFileName[1] == L'.' && find_data->cFileName[2] == L'\0'))) { dir->need_find_call = TRUE; continue; } r = uv__convert_utf16_to_utf8((const WCHAR*) &find_data->cFileName, -1, (char**) &dirents[dirent_idx].name); if (r != 0) goto error; /* Copy file type. */ if ((find_data->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) dent.d_type = UV__DT_DIR; else if ((find_data->dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0) dent.d_type = UV__DT_LINK; else if ((find_data->dwFileAttributes & FILE_ATTRIBUTE_DEVICE) != 0) dent.d_type = UV__DT_CHAR; else dent.d_type = UV__DT_FILE; dirents[dirent_idx].type = uv__fs_get_dirent_type(&dent); dir->need_find_call = TRUE; ++dirent_idx; } SET_REQ_RESULT(req, dirent_idx); return; error: SET_REQ_WIN32_ERROR(req, GetLastError()); for (i = 0; i < dirent_idx; ++i) { uv__free((char*) dirents[i].name); dirents[i].name = NULL; } } void fs__closedir(uv_fs_t* req) { uv_dir_t* dir; dir = (uv_dir_t *)req->ptr; FindClose(dir->dir_handle); uv__free(req->ptr); SET_REQ_RESULT(req, 0); } INLINE static int fs__stat_handle(HANDLE handle, uv_stat_t* statbuf, int do_lstat) { FILE_ALL_INFORMATION file_info; FILE_FS_VOLUME_INFORMATION volume_info; NTSTATUS nt_status; IO_STATUS_BLOCK io_status; nt_status = pNtQueryInformationFile(handle, &io_status, &file_info, sizeof file_info, FileAllInformation); /* Buffer overflow (a warning status code) is expected here. */ if (NT_ERROR(nt_status)) { SetLastError(pRtlNtStatusToDosError(nt_status)); return -1; } nt_status = pNtQueryVolumeInformationFile(handle, &io_status, &volume_info, sizeof volume_info, FileFsVolumeInformation); /* Buffer overflow (a warning status code) is expected here. */ if (io_status.Status == STATUS_NOT_IMPLEMENTED) { statbuf->st_dev = 0; } else if (NT_ERROR(nt_status)) { SetLastError(pRtlNtStatusToDosError(nt_status)); return -1; } else { statbuf->st_dev = volume_info.VolumeSerialNumber; } /* Todo: st_mode should probably always be 0666 for everyone. We might also * want to report 0777 if the file is a .exe or a directory. * * Currently it's based on whether the 'readonly' attribute is set, which * makes little sense because the semantics are so different: the 'read-only' * flag is just a way for a user to protect against accidental deletion, and * serves no security purpose. Windows uses ACLs for that. * * Also people now use uv_fs_chmod() to take away the writable bit for good * reasons. Windows however just makes the file read-only, which makes it * impossible to delete the file afterwards, since read-only files can't be * deleted. * * IOW it's all just a clusterfuck and we should think of something that * makes slightly more sense. * * And uv_fs_chmod should probably just fail on windows or be a total no-op. * There's nothing sensible it can do anyway. */ statbuf->st_mode = 0; /* * On Windows, FILE_ATTRIBUTE_REPARSE_POINT is a general purpose mechanism * by which filesystem drivers can intercept and alter file system requests. * * The only reparse points we care about are symlinks and mount points, both * of which are treated as POSIX symlinks. Further, we only care when * invoked via lstat, which seeks information about the link instead of its * target. Otherwise, reparse points must be treated as regular files. */ if (do_lstat && (file_info.BasicInformation.FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)) { /* * If reading the link fails, the reparse point is not a symlink and needs * to be treated as a regular file. The higher level lstat function will * detect this failure and retry without do_lstat if appropriate. */ if (fs__readlink_handle(handle, NULL, &statbuf->st_size) != 0) return -1; statbuf->st_mode |= S_IFLNK; } if (statbuf->st_mode == 0) { if (file_info.BasicInformation.FileAttributes & FILE_ATTRIBUTE_DIRECTORY) { statbuf->st_mode |= _S_IFDIR; statbuf->st_size = 0; } else { statbuf->st_mode |= _S_IFREG; statbuf->st_size = file_info.StandardInformation.EndOfFile.QuadPart; } } if (file_info.BasicInformation.FileAttributes & FILE_ATTRIBUTE_READONLY) statbuf->st_mode |= _S_IREAD | (_S_IREAD >> 3) | (_S_IREAD >> 6); else statbuf->st_mode |= (_S_IREAD | _S_IWRITE) | ((_S_IREAD | _S_IWRITE) >> 3) | ((_S_IREAD | _S_IWRITE) >> 6); FILETIME_TO_TIMESPEC(statbuf->st_atim, file_info.BasicInformation.LastAccessTime); FILETIME_TO_TIMESPEC(statbuf->st_ctim, file_info.BasicInformation.ChangeTime); FILETIME_TO_TIMESPEC(statbuf->st_mtim, file_info.BasicInformation.LastWriteTime); FILETIME_TO_TIMESPEC(statbuf->st_birthtim, file_info.BasicInformation.CreationTime); statbuf->st_ino = file_info.InternalInformation.IndexNumber.QuadPart; /* st_blocks contains the on-disk allocation size in 512-byte units. */ statbuf->st_blocks = (uint64_t) file_info.StandardInformation.AllocationSize.QuadPart >> 9; statbuf->st_nlink = file_info.StandardInformation.NumberOfLinks; /* The st_blksize is supposed to be the 'optimal' number of bytes for reading * and writing to the disk. That is, for any definition of 'optimal' - it's * supposed to at least avoid read-update-write behavior when writing to the * disk. * * However nobody knows this and even fewer people actually use this value, * and in order to fill it out we'd have to make another syscall to query the * volume for FILE_FS_SECTOR_SIZE_INFORMATION. * * Therefore we'll just report a sensible value that's quite commonly okay * on modern hardware. * * 4096 is the minimum required to be compatible with newer Advanced Format * drives (which have 4096 bytes per physical sector), and to be backwards * compatible with older drives (which have 512 bytes per physical sector). */ statbuf->st_blksize = 4096; /* Todo: set st_flags to something meaningful. Also provide a wrapper for * chattr(2). */ statbuf->st_flags = 0; /* Windows has nothing sensible to say about these values, so they'll just * remain empty. */ statbuf->st_gid = 0; statbuf->st_uid = 0; statbuf->st_rdev = 0; statbuf->st_gen = 0; return 0; } INLINE static void fs__stat_prepare_path(WCHAR* pathw) { size_t len = wcslen(pathw); /* TODO: ignore namespaced paths. */ if (len > 1 && pathw[len - 2] != L':' && (pathw[len - 1] == L'\\' || pathw[len - 1] == L'/')) { pathw[len - 1] = '\0'; } } INLINE static DWORD fs__stat_impl_from_path(WCHAR* path, int do_lstat, uv_stat_t* statbuf) { HANDLE handle; DWORD flags; DWORD ret; flags = FILE_FLAG_BACKUP_SEMANTICS; if (do_lstat) flags |= FILE_FLAG_OPEN_REPARSE_POINT; handle = CreateFileW(path, FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, flags, NULL); if (handle == INVALID_HANDLE_VALUE) ret = GetLastError(); else if (fs__stat_handle(handle, statbuf, do_lstat) != 0) ret = GetLastError(); else ret = 0; CloseHandle(handle); return ret; } INLINE static void fs__stat_impl(uv_fs_t* req, int do_lstat) { DWORD error; error = fs__stat_impl_from_path(req->file.pathw, do_lstat, &req->statbuf); if (error != 0) { if (do_lstat && (error == ERROR_SYMLINK_NOT_SUPPORTED || error == ERROR_NOT_A_REPARSE_POINT)) { /* We opened a reparse point but it was not a symlink. Try again. */ fs__stat_impl(req, 0); } else { /* Stat failed. */ SET_REQ_WIN32_ERROR(req, error); } return; } req->ptr = &req->statbuf; req->result = 0; } static void fs__stat(uv_fs_t* req) { fs__stat_prepare_path(req->file.pathw); fs__stat_impl(req, 0); } static void fs__lstat(uv_fs_t* req) { fs__stat_prepare_path(req->file.pathw); fs__stat_impl(req, 1); } static void fs__fstat(uv_fs_t* req) { int fd = req->file.fd; HANDLE handle; VERIFY_FD(fd, req); handle = uv__get_osfhandle(fd); if (handle == INVALID_HANDLE_VALUE) { SET_REQ_WIN32_ERROR(req, ERROR_INVALID_HANDLE); return; } if (fs__stat_handle(handle, &req->statbuf, 0) != 0) { SET_REQ_WIN32_ERROR(req, GetLastError()); return; } req->ptr = &req->statbuf; req->result = 0; } static void fs__rename(uv_fs_t* req) { if (!MoveFileExW(req->file.pathw, req->fs.info.new_pathw, MOVEFILE_REPLACE_EXISTING)) { SET_REQ_WIN32_ERROR(req, GetLastError()); return; } SET_REQ_RESULT(req, 0); } INLINE static void fs__sync_impl(uv_fs_t* req) { int fd = req->file.fd; int result; VERIFY_FD(fd, req); result = FlushFileBuffers(uv__get_osfhandle(fd)) ? 0 : -1; if (result == -1) { SET_REQ_WIN32_ERROR(req, GetLastError()); } else { SET_REQ_RESULT(req, result); } } static void fs__fsync(uv_fs_t* req) { fs__sync_impl(req); } static void fs__fdatasync(uv_fs_t* req) { fs__sync_impl(req); } static void fs__ftruncate(uv_fs_t* req) { int fd = req->file.fd; HANDLE handle; struct uv__fd_info_s fd_info = { 0 }; NTSTATUS status; IO_STATUS_BLOCK io_status; FILE_END_OF_FILE_INFORMATION eof_info; VERIFY_FD(fd, req); handle = uv__get_osfhandle(fd); if (uv__fd_hash_get(fd, &fd_info)) { if (fd_info.is_directory) { SET_REQ_WIN32_ERROR(req, ERROR_ACCESS_DENIED); return; } if (fd_info.mapping != INVALID_HANDLE_VALUE) { CloseHandle(fd_info.mapping); } } eof_info.EndOfFile.QuadPart = req->fs.info.offset; status = pNtSetInformationFile(handle, &io_status, &eof_info, sizeof eof_info, FileEndOfFileInformation); if (NT_SUCCESS(status)) { SET_REQ_RESULT(req, 0); } else { SET_REQ_WIN32_ERROR(req, pRtlNtStatusToDosError(status)); if (fd_info.flags) { CloseHandle(handle); fd_info.mapping = INVALID_HANDLE_VALUE; fd_info.size.QuadPart = 0; fd_info.current_pos.QuadPart = 0; uv__fd_hash_add(fd, &fd_info); return; } } if (fd_info.flags) { fd_info.size = eof_info.EndOfFile; if (fd_info.size.QuadPart == 0) { fd_info.mapping = INVALID_HANDLE_VALUE; } else { DWORD flProtect = (fd_info.flags & (UV_FS_O_RDONLY | UV_FS_O_WRONLY | UV_FS_O_RDWR)) == UV_FS_O_RDONLY ? PAGE_READONLY : PAGE_READWRITE; fd_info.mapping = CreateFileMapping(handle, NULL, flProtect, fd_info.size.HighPart, fd_info.size.LowPart, NULL); if (fd_info.mapping == NULL) { SET_REQ_WIN32_ERROR(req, GetLastError()); CloseHandle(handle); fd_info.mapping = INVALID_HANDLE_VALUE; fd_info.size.QuadPart = 0; fd_info.current_pos.QuadPart = 0; uv__fd_hash_add(fd, &fd_info); return; } } uv__fd_hash_add(fd, &fd_info); } } static void fs__copyfile(uv_fs_t* req) { int flags; int overwrite; uv_stat_t statbuf; uv_stat_t new_statbuf; flags = req->fs.info.file_flags; if (flags & UV_FS_COPYFILE_FICLONE_FORCE) { SET_REQ_UV_ERROR(req, UV_ENOSYS, ERROR_NOT_SUPPORTED); return; } overwrite = flags & UV_FS_COPYFILE_EXCL; if (CopyFileW(req->file.pathw, req->fs.info.new_pathw, overwrite) != 0) { SET_REQ_RESULT(req, 0); return; } SET_REQ_WIN32_ERROR(req, GetLastError()); if (req->result != UV_EBUSY) return; /* if error UV_EBUSY check if src and dst file are the same */ if (fs__stat_impl_from_path(req->file.pathw, 0, &statbuf) != 0 || fs__stat_impl_from_path(req->fs.info.new_pathw, 0, &new_statbuf) != 0) { return; } if (statbuf.st_dev == new_statbuf.st_dev && statbuf.st_ino == new_statbuf.st_ino) { SET_REQ_RESULT(req, 0); } } static void fs__sendfile(uv_fs_t* req) { int fd_in = req->file.fd, fd_out = req->fs.info.fd_out; size_t length = req->fs.info.bufsml[0].len; int64_t offset = req->fs.info.offset; const size_t max_buf_size = 65536; size_t buf_size = length < max_buf_size ? length : max_buf_size; int n, result = 0; int64_t result_offset = 0; char* buf = (char*) uv__malloc(buf_size); if (!buf) { uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); } if (offset != -1) { result_offset = _lseeki64(fd_in, offset, SEEK_SET); } if (result_offset == -1) { result = -1; } else { while (length > 0) { n = _read(fd_in, buf, length < buf_size ? length : buf_size); if (n == 0) { break; } else if (n == -1) { result = -1; break; } length -= n; n = _write(fd_out, buf, n); if (n == -1) { result = -1; break; } result += n; } } uv__free(buf); SET_REQ_RESULT(req, result); } static void fs__access(uv_fs_t* req) { DWORD attr = GetFileAttributesW(req->file.pathw); if (attr == INVALID_FILE_ATTRIBUTES) { SET_REQ_WIN32_ERROR(req, GetLastError()); return; } /* * Access is possible if * - write access wasn't requested, * - or the file isn't read-only, * - or it's a directory. * (Directories cannot be read-only on Windows.) */ if (!(req->fs.info.mode & W_OK) || !(attr & FILE_ATTRIBUTE_READONLY) || (attr & FILE_ATTRIBUTE_DIRECTORY)) { SET_REQ_RESULT(req, 0); } else { SET_REQ_WIN32_ERROR(req, UV_EPERM); } } static void fs__chmod(uv_fs_t* req) { int result = _wchmod(req->file.pathw, req->fs.info.mode); SET_REQ_RESULT(req, result); } static void fs__fchmod(uv_fs_t* req) { int fd = req->file.fd; int clear_archive_flag; HANDLE handle; NTSTATUS nt_status; IO_STATUS_BLOCK io_status; FILE_BASIC_INFORMATION file_info; VERIFY_FD(fd, req); handle = ReOpenFile(uv__get_osfhandle(fd), FILE_WRITE_ATTRIBUTES, 0, 0); if (handle == INVALID_HANDLE_VALUE) { SET_REQ_WIN32_ERROR(req, GetLastError()); return; } nt_status = pNtQueryInformationFile(handle, &io_status, &file_info, sizeof file_info, FileBasicInformation); if (!NT_SUCCESS(nt_status)) { SET_REQ_WIN32_ERROR(req, pRtlNtStatusToDosError(nt_status)); goto fchmod_cleanup; } /* Test if the Archive attribute is cleared */ if ((file_info.FileAttributes & FILE_ATTRIBUTE_ARCHIVE) == 0) { /* Set Archive flag, otherwise setting or clearing the read-only flag will not work */ file_info.FileAttributes |= FILE_ATTRIBUTE_ARCHIVE; nt_status = pNtSetInformationFile(handle, &io_status, &file_info, sizeof file_info, FileBasicInformation); if (!NT_SUCCESS(nt_status)) { SET_REQ_WIN32_ERROR(req, pRtlNtStatusToDosError(nt_status)); goto fchmod_cleanup; } /* Remeber to clear the flag later on */ clear_archive_flag = 1; } else { clear_archive_flag = 0; } if (req->fs.info.mode & _S_IWRITE) { file_info.FileAttributes &= ~FILE_ATTRIBUTE_READONLY; } else { file_info.FileAttributes |= FILE_ATTRIBUTE_READONLY; } nt_status = pNtSetInformationFile(handle, &io_status, &file_info, sizeof file_info, FileBasicInformation); if (!NT_SUCCESS(nt_status)) { SET_REQ_WIN32_ERROR(req, pRtlNtStatusToDosError(nt_status)); goto fchmod_cleanup; } if (clear_archive_flag) { file_info.FileAttributes &= ~FILE_ATTRIBUTE_ARCHIVE; if (file_info.FileAttributes == 0) { file_info.FileAttributes = FILE_ATTRIBUTE_NORMAL; } nt_status = pNtSetInformationFile(handle, &io_status, &file_info, sizeof file_info, FileBasicInformation); if (!NT_SUCCESS(nt_status)) { SET_REQ_WIN32_ERROR(req, pRtlNtStatusToDosError(nt_status)); goto fchmod_cleanup; } } SET_REQ_SUCCESS(req); fchmod_cleanup: CloseHandle(handle); } INLINE static int fs__utime_handle(HANDLE handle, double atime, double mtime) { FILETIME filetime_a, filetime_m; TIME_T_TO_FILETIME(atime, &filetime_a); TIME_T_TO_FILETIME(mtime, &filetime_m); if (!SetFileTime(handle, NULL, &filetime_a, &filetime_m)) { return -1; } return 0; } INLINE static DWORD fs__utime_impl_from_path(WCHAR* path, double atime, double mtime, int do_lutime) { HANDLE handle; DWORD flags; DWORD ret; flags = FILE_FLAG_BACKUP_SEMANTICS; if (do_lutime) { flags |= FILE_FLAG_OPEN_REPARSE_POINT; } handle = CreateFileW(path, FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, flags, NULL); if (handle == INVALID_HANDLE_VALUE) { ret = GetLastError(); } else if (fs__utime_handle(handle, atime, mtime) != 0) { ret = GetLastError(); } else { ret = 0; } CloseHandle(handle); return ret; } INLINE static void fs__utime_impl(uv_fs_t* req, int do_lutime) { DWORD error; error = fs__utime_impl_from_path(req->file.pathw, req->fs.time.atime, req->fs.time.mtime, do_lutime); if (error != 0) { if (do_lutime && (error == ERROR_SYMLINK_NOT_SUPPORTED || error == ERROR_NOT_A_REPARSE_POINT)) { /* Opened file is a reparse point but not a symlink. Try again. */ fs__utime_impl(req, 0); } else { /* utime failed. */ SET_REQ_WIN32_ERROR(req, error); } return; } req->result = 0; } static void fs__utime(uv_fs_t* req) { fs__utime_impl(req, /* do_lutime */ 0); } static void fs__futime(uv_fs_t* req) { int fd = req->file.fd; HANDLE handle; VERIFY_FD(fd, req); handle = uv__get_osfhandle(fd); if (handle == INVALID_HANDLE_VALUE) { SET_REQ_WIN32_ERROR(req, ERROR_INVALID_HANDLE); return; } if (fs__utime_handle(handle, req->fs.time.atime, req->fs.time.mtime) != 0) { SET_REQ_WIN32_ERROR(req, GetLastError()); return; } req->result = 0; } static void fs__lutime(uv_fs_t* req) { fs__utime_impl(req, /* do_lutime */ 1); } static void fs__link(uv_fs_t* req) { DWORD r = CreateHardLinkW(req->fs.info.new_pathw, req->file.pathw, NULL); if (r == 0) { SET_REQ_WIN32_ERROR(req, GetLastError()); } else { req->result = 0; } } static void fs__create_junction(uv_fs_t* req, const WCHAR* path, const WCHAR* new_path) { HANDLE handle = INVALID_HANDLE_VALUE; REPARSE_DATA_BUFFER *buffer = NULL; int created = 0; int target_len; int is_absolute, is_long_path; int needed_buf_size, used_buf_size, used_data_size, path_buf_len; int start, len, i; int add_slash; DWORD bytes; WCHAR* path_buf; target_len = wcslen(path); is_long_path = wcsncmp(path, LONG_PATH_PREFIX, LONG_PATH_PREFIX_LEN) == 0; if (is_long_path) { is_absolute = 1; } else { is_absolute = target_len >= 3 && IS_LETTER(path[0]) && path[1] == L':' && IS_SLASH(path[2]); } if (!is_absolute) { /* Not supporting relative paths */ SET_REQ_UV_ERROR(req, UV_EINVAL, ERROR_NOT_SUPPORTED); return; } /* Do a pessimistic calculation of the required buffer size */ needed_buf_size = FIELD_OFFSET(REPARSE_DATA_BUFFER, MountPointReparseBuffer.PathBuffer) + JUNCTION_PREFIX_LEN * sizeof(WCHAR) + 2 * (target_len + 2) * sizeof(WCHAR); /* Allocate the buffer */ buffer = (REPARSE_DATA_BUFFER*)uv__malloc(needed_buf_size); if (!buffer) { uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); } /* Grab a pointer to the part of the buffer where filenames go */ path_buf = (WCHAR*)&(buffer->MountPointReparseBuffer.PathBuffer); path_buf_len = 0; /* Copy the substitute (internal) target path */ start = path_buf_len; wcsncpy((WCHAR*)&path_buf[path_buf_len], JUNCTION_PREFIX, JUNCTION_PREFIX_LEN); path_buf_len += JUNCTION_PREFIX_LEN; add_slash = 0; for (i = is_long_path ? LONG_PATH_PREFIX_LEN : 0; path[i] != L'\0'; i++) { if (IS_SLASH(path[i])) { add_slash = 1; continue; } if (add_slash) { path_buf[path_buf_len++] = L'\\'; add_slash = 0; } path_buf[path_buf_len++] = path[i]; } path_buf[path_buf_len++] = L'\\'; len = path_buf_len - start; /* Set the info about the substitute name */ buffer->MountPointReparseBuffer.SubstituteNameOffset = start * sizeof(WCHAR); buffer->MountPointReparseBuffer.SubstituteNameLength = len * sizeof(WCHAR); /* Insert null terminator */ path_buf[path_buf_len++] = L'\0'; /* Copy the print name of the target path */ start = path_buf_len; add_slash = 0; for (i = is_long_path ? LONG_PATH_PREFIX_LEN : 0; path[i] != L'\0'; i++) { if (IS_SLASH(path[i])) { add_slash = 1; continue; } if (add_slash) { path_buf[path_buf_len++] = L'\\'; add_slash = 0; } path_buf[path_buf_len++] = path[i]; } len = path_buf_len - start; if (len == 2) { path_buf[path_buf_len++] = L'\\'; len++; } /* Set the info about the print name */ buffer->MountPointReparseBuffer.PrintNameOffset = start * sizeof(WCHAR); buffer->MountPointReparseBuffer.PrintNameLength = len * sizeof(WCHAR); /* Insert another null terminator */ path_buf[path_buf_len++] = L'\0'; /* Calculate how much buffer space was actually used */ used_buf_size = FIELD_OFFSET(REPARSE_DATA_BUFFER, MountPointReparseBuffer.PathBuffer) + path_buf_len * sizeof(WCHAR); used_data_size = used_buf_size - FIELD_OFFSET(REPARSE_DATA_BUFFER, MountPointReparseBuffer); /* Put general info in the data buffer */ buffer->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT; buffer->ReparseDataLength = used_data_size; buffer->Reserved = 0; /* Create a new directory */ if (!CreateDirectoryW(new_path, NULL)) { SET_REQ_WIN32_ERROR(req, GetLastError()); goto error; } created = 1; /* Open the directory */ handle = CreateFileW(new_path, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL); if (handle == INVALID_HANDLE_VALUE) { SET_REQ_WIN32_ERROR(req, GetLastError()); goto error; } /* Create the actual reparse point */ if (!DeviceIoControl(handle, FSCTL_SET_REPARSE_POINT, buffer, used_buf_size, NULL, 0, &bytes, NULL)) { SET_REQ_WIN32_ERROR(req, GetLastError()); goto error; } /* Clean up */ CloseHandle(handle); uv__free(buffer); SET_REQ_RESULT(req, 0); return; error: uv__free(buffer); if (handle != INVALID_HANDLE_VALUE) { CloseHandle(handle); } if (created) { RemoveDirectoryW(new_path); } } static void fs__symlink(uv_fs_t* req) { WCHAR* pathw; WCHAR* new_pathw; int flags; int err; pathw = req->file.pathw; new_pathw = req->fs.info.new_pathw; if (req->fs.info.file_flags & UV_FS_SYMLINK_JUNCTION) { fs__create_junction(req, pathw, new_pathw); return; } if (req->fs.info.file_flags & UV_FS_SYMLINK_DIR) flags = SYMBOLIC_LINK_FLAG_DIRECTORY | uv__file_symlink_usermode_flag; else flags = uv__file_symlink_usermode_flag; if (CreateSymbolicLinkW(new_pathw, pathw, flags)) { SET_REQ_RESULT(req, 0); return; } /* Something went wrong. We will test if it is because of user-mode * symlinks. */ err = GetLastError(); if (err == ERROR_INVALID_PARAMETER && flags & SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE) { /* This system does not support user-mode symlinks. We will clear the * unsupported flag and retry. */ uv__file_symlink_usermode_flag = 0; fs__symlink(req); } else { SET_REQ_WIN32_ERROR(req, err); } } static void fs__readlink(uv_fs_t* req) { HANDLE handle; handle = CreateFileW(req->file.pathw, 0, 0, NULL, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS, NULL); if (handle == INVALID_HANDLE_VALUE) { SET_REQ_WIN32_ERROR(req, GetLastError()); return; } if (fs__readlink_handle(handle, (char**) &req->ptr, NULL) != 0) { SET_REQ_WIN32_ERROR(req, GetLastError()); CloseHandle(handle); return; } req->flags |= UV_FS_FREE_PTR; SET_REQ_RESULT(req, 0); CloseHandle(handle); } static ssize_t fs__realpath_handle(HANDLE handle, char** realpath_ptr) { int r; DWORD w_realpath_len; WCHAR* w_realpath_ptr = NULL; WCHAR* w_realpath_buf; w_realpath_len = GetFinalPathNameByHandleW(handle, NULL, 0, VOLUME_NAME_DOS); if (w_realpath_len == 0) { return -1; } w_realpath_buf = (WCHAR *)uv__malloc((w_realpath_len + 1) * sizeof(WCHAR)); if (w_realpath_buf == NULL) { SetLastError(ERROR_OUTOFMEMORY); return -1; } w_realpath_ptr = w_realpath_buf; if (GetFinalPathNameByHandleW( handle, w_realpath_ptr, w_realpath_len, VOLUME_NAME_DOS) == 0) { uv__free(w_realpath_buf); SetLastError(ERROR_INVALID_HANDLE); return -1; } /* convert UNC path to long path */ if (wcsncmp(w_realpath_ptr, UNC_PATH_PREFIX, UNC_PATH_PREFIX_LEN) == 0) { w_realpath_ptr += 6; *w_realpath_ptr = L'\\'; w_realpath_len -= 6; } else if (wcsncmp(w_realpath_ptr, LONG_PATH_PREFIX, LONG_PATH_PREFIX_LEN) == 0) { w_realpath_ptr += 4; w_realpath_len -= 4; } else { uv__free(w_realpath_buf); SetLastError(ERROR_INVALID_HANDLE); return -1; } r = fs__wide_to_utf8(w_realpath_ptr, w_realpath_len, realpath_ptr, NULL); uv__free(w_realpath_buf); return r; } static void fs__realpath(uv_fs_t* req) { HANDLE handle; handle = CreateFileW(req->file.pathw, 0, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS, NULL); if (handle == INVALID_HANDLE_VALUE) { SET_REQ_WIN32_ERROR(req, GetLastError()); return; } if (fs__realpath_handle(handle, (char**) &req->ptr) == -1) { CloseHandle(handle); SET_REQ_WIN32_ERROR(req, GetLastError()); return; } CloseHandle(handle); req->flags |= UV_FS_FREE_PTR; SET_REQ_RESULT(req, 0); } static void fs__chown(uv_fs_t* req) { req->result = 0; } static void fs__fchown(uv_fs_t* req) { req->result = 0; } static void fs__lchown(uv_fs_t* req) { req->result = 0; } static void fs__statfs(uv_fs_t* req) { uv_statfs_t* stat_fs; DWORD sectors_per_cluster; DWORD bytes_per_sector; DWORD free_clusters; DWORD total_clusters; WCHAR* pathw; pathw = req->file.pathw; retry_get_disk_free_space: if (0 == GetDiskFreeSpaceW(pathw, §ors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters)) { DWORD err; WCHAR* fpart; size_t len; DWORD ret; BOOL is_second; err = GetLastError(); is_second = pathw != req->file.pathw; if (err != ERROR_DIRECTORY || is_second) { if (is_second) uv__free(pathw); SET_REQ_WIN32_ERROR(req, err); return; } len = MAX_PATH + 1; pathw = (WCHAR *)uv__malloc(len * sizeof(*pathw)); if (pathw == NULL) { SET_REQ_UV_ERROR(req, UV_ENOMEM, ERROR_OUTOFMEMORY); return; } retry_get_full_path_name: ret = GetFullPathNameW(req->file.pathw, len, pathw, &fpart); if (ret == 0) { uv__free(pathw); SET_REQ_WIN32_ERROR(req, err); return; } else if (ret > len) { len = ret; pathw = (WCHAR *)uv__reallocf(pathw, len * sizeof(*pathw)); if (pathw == NULL) { SET_REQ_UV_ERROR(req, UV_ENOMEM, ERROR_OUTOFMEMORY); return; } goto retry_get_full_path_name; } if (fpart != 0) *fpart = L'\0'; goto retry_get_disk_free_space; } if (pathw != req->file.pathw) { uv__free(pathw); } stat_fs = (uv_statfs_t *)uv__malloc(sizeof(*stat_fs)); if (stat_fs == NULL) { SET_REQ_UV_ERROR(req, UV_ENOMEM, ERROR_OUTOFMEMORY); return; } stat_fs->f_type = 0; stat_fs->f_bsize = bytes_per_sector * sectors_per_cluster; stat_fs->f_blocks = total_clusters; stat_fs->f_bfree = free_clusters; stat_fs->f_bavail = free_clusters; stat_fs->f_files = 0; stat_fs->f_ffree = 0; req->ptr = stat_fs; req->flags |= UV_FS_FREE_PTR; SET_REQ_RESULT(req, 0); } static void uv__fs_work(struct uv__work* w) { uv_fs_t* req; req = container_of(w, uv_fs_t, work_req); assert(req->type == UV_FS); #define XX(uc, lc) case UV_FS_##uc: fs__##lc(req); break; switch (req->fs_type) { XX(OPEN, open) XX(CLOSE, close) XX(READ, read) XX(WRITE, write) XX(COPYFILE, copyfile) XX(SENDFILE, sendfile) XX(STAT, stat) XX(LSTAT, lstat) XX(FSTAT, fstat) XX(FTRUNCATE, ftruncate) XX(UTIME, utime) XX(FUTIME, futime) XX(LUTIME, lutime) XX(ACCESS, access) XX(CHMOD, chmod) XX(FCHMOD, fchmod) XX(FSYNC, fsync) XX(FDATASYNC, fdatasync) XX(UNLINK, unlink) XX(RMDIR, rmdir) XX(MKDIR, mkdir) XX(MKDTEMP, mkdtemp) XX(MKSTEMP, mkstemp) XX(RENAME, rename) XX(SCANDIR, scandir) XX(READDIR, readdir) XX(OPENDIR, opendir) XX(CLOSEDIR, closedir) XX(LINK, link) XX(SYMLINK, symlink) XX(READLINK, readlink) XX(REALPATH, realpath) XX(CHOWN, chown) XX(FCHOWN, fchown) XX(LCHOWN, lchown) XX(STATFS, statfs) default: assert(!"bad uv_fs_type"); } } static void uv__fs_done(struct uv__work* w, int status) { uv_fs_t* req; req = container_of(w, uv_fs_t, work_req); uv__req_unregister(req->loop, req); if (status == UV_ECANCELED) { assert(req->result == 0); req->result = UV_ECANCELED; } req->cb(req); } void uv_fs_req_cleanup(uv_fs_t* req) { if (req == NULL) return; if (req->flags & UV_FS_CLEANEDUP) return; if (req->flags & UV_FS_FREE_PATHS) uv__free(req->file.pathw); if (req->flags & UV_FS_FREE_PTR) { if (req->fs_type == UV_FS_SCANDIR && req->ptr != NULL) uv__fs_scandir_cleanup(req); else if (req->fs_type == UV_FS_READDIR) uv__fs_readdir_cleanup(req); else uv__free(req->ptr); } if (req->fs.info.bufs != req->fs.info.bufsml) uv__free(req->fs.info.bufs); req->path = NULL; req->file.pathw = NULL; req->fs.info.new_pathw = NULL; req->fs.info.bufs = NULL; req->ptr = NULL; req->flags |= UV_FS_CLEANEDUP; } int uv_fs_open(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, int mode, uv_fs_cb cb) { int err; INIT(UV_FS_OPEN); err = fs__capture_path(req, path, NULL, cb != NULL); if (err) { SET_REQ_WIN32_ERROR(req, err); return req->result; } req->fs.info.file_flags = flags; req->fs.info.mode = mode; POST; } int uv_fs_close(uv_loop_t* loop, uv_fs_t* req, uv_file fd, uv_fs_cb cb) { INIT(UV_FS_CLOSE); req->file.fd = fd; POST; } int uv_fs_read(uv_loop_t* loop, uv_fs_t* req, uv_file fd, const uv_buf_t bufs[], unsigned int nbufs, int64_t offset, uv_fs_cb cb) { INIT(UV_FS_READ); if (bufs == NULL || nbufs == 0) { SET_REQ_UV_ERROR(req, UV_EINVAL, ERROR_INVALID_PARAMETER); return UV_EINVAL; } req->file.fd = fd; req->fs.info.nbufs = nbufs; req->fs.info.bufs = req->fs.info.bufsml; if (nbufs > ARRAY_SIZE(req->fs.info.bufsml)) req->fs.info.bufs = (uv_buf_t *)uv__malloc(nbufs * sizeof(*bufs)); if (req->fs.info.bufs == NULL) { SET_REQ_UV_ERROR(req, UV_ENOMEM, ERROR_OUTOFMEMORY); return UV_ENOMEM; } memcpy(req->fs.info.bufs, bufs, nbufs * sizeof(*bufs)); req->fs.info.offset = offset; POST; } int uv_fs_write(uv_loop_t* loop, uv_fs_t* req, uv_file fd, const uv_buf_t bufs[], unsigned int nbufs, int64_t offset, uv_fs_cb cb) { INIT(UV_FS_WRITE); if (bufs == NULL || nbufs == 0) { SET_REQ_UV_ERROR(req, UV_EINVAL, ERROR_INVALID_PARAMETER); return UV_EINVAL; } req->file.fd = fd; req->fs.info.nbufs = nbufs; req->fs.info.bufs = req->fs.info.bufsml; if (nbufs > ARRAY_SIZE(req->fs.info.bufsml)) req->fs.info.bufs = (uv_buf_t *)uv__malloc(nbufs * sizeof(*bufs)); if (req->fs.info.bufs == NULL) { SET_REQ_UV_ERROR(req, UV_ENOMEM, ERROR_OUTOFMEMORY); return UV_ENOMEM; } memcpy(req->fs.info.bufs, bufs, nbufs * sizeof(*bufs)); req->fs.info.offset = offset; POST; } int uv_fs_unlink(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { int err; INIT(UV_FS_UNLINK); err = fs__capture_path(req, path, NULL, cb != NULL); if (err) { SET_REQ_WIN32_ERROR(req, err); return req->result; } POST; } int uv_fs_mkdir(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, uv_fs_cb cb) { int err; INIT(UV_FS_MKDIR); err = fs__capture_path(req, path, NULL, cb != NULL); if (err) { SET_REQ_WIN32_ERROR(req, err); return req->result; } req->fs.info.mode = mode; POST; } int uv_fs_mkdtemp(uv_loop_t* loop, uv_fs_t* req, const char* tpl, uv_fs_cb cb) { int err; INIT(UV_FS_MKDTEMP); err = fs__capture_path(req, tpl, NULL, TRUE); if (err) { SET_REQ_WIN32_ERROR(req, err); return req->result; } POST; } int uv_fs_mkstemp(uv_loop_t* loop, uv_fs_t* req, const char* tpl, uv_fs_cb cb) { int err; INIT(UV_FS_MKSTEMP); err = fs__capture_path(req, tpl, NULL, TRUE); if (err) { SET_REQ_WIN32_ERROR(req, err); return req->result; } POST; } int uv_fs_rmdir(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { int err; INIT(UV_FS_RMDIR); err = fs__capture_path(req, path, NULL, cb != NULL); if (err) { SET_REQ_WIN32_ERROR(req, err); return req->result; } POST; } int uv_fs_scandir(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, uv_fs_cb cb) { int err; INIT(UV_FS_SCANDIR); err = fs__capture_path(req, path, NULL, cb != NULL); if (err) { SET_REQ_WIN32_ERROR(req, err); return req->result; } req->fs.info.file_flags = flags; POST; } int uv_fs_opendir(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { int err; INIT(UV_FS_OPENDIR); err = fs__capture_path(req, path, NULL, cb != NULL); if (err) { SET_REQ_WIN32_ERROR(req, err); return req->result; } POST; } int uv_fs_readdir(uv_loop_t* loop, uv_fs_t* req, uv_dir_t* dir, uv_fs_cb cb) { INIT(UV_FS_READDIR); if (dir == NULL || dir->dirents == NULL || dir->dir_handle == INVALID_HANDLE_VALUE) { SET_REQ_UV_ERROR(req, UV_EINVAL, ERROR_INVALID_PARAMETER); return UV_EINVAL; } req->ptr = dir; POST; } int uv_fs_closedir(uv_loop_t* loop, uv_fs_t* req, uv_dir_t* dir, uv_fs_cb cb) { INIT(UV_FS_CLOSEDIR); if (dir == NULL) { SET_REQ_UV_ERROR(req, UV_EINVAL, ERROR_INVALID_PARAMETER); return UV_EINVAL; } req->ptr = dir; POST; } int uv_fs_link(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, uv_fs_cb cb) { int err; INIT(UV_FS_LINK); err = fs__capture_path(req, path, new_path, cb != NULL); if (err) { SET_REQ_WIN32_ERROR(req, err); return req->result; } POST; } int uv_fs_symlink(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, int flags, uv_fs_cb cb) { int err; INIT(UV_FS_SYMLINK); err = fs__capture_path(req, path, new_path, cb != NULL); if (err) { SET_REQ_WIN32_ERROR(req, err); return req->result; } req->fs.info.file_flags = flags; POST; } int uv_fs_readlink(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { int err; INIT(UV_FS_READLINK); err = fs__capture_path(req, path, NULL, cb != NULL); if (err) { SET_REQ_WIN32_ERROR(req, err); return req->result; } POST; } int uv_fs_realpath(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { int err; INIT(UV_FS_REALPATH); if (!path) { SET_REQ_UV_ERROR(req, UV_EINVAL, ERROR_INVALID_PARAMETER); return UV_EINVAL; } err = fs__capture_path(req, path, NULL, cb != NULL); if (err) { SET_REQ_WIN32_ERROR(req, err); return req->result; } POST; } int uv_fs_chown(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_uid_t uid, uv_gid_t gid, uv_fs_cb cb) { int err; INIT(UV_FS_CHOWN); err = fs__capture_path(req, path, NULL, cb != NULL); if (err) { SET_REQ_WIN32_ERROR(req, err); return req->result; } POST; } int uv_fs_fchown(uv_loop_t* loop, uv_fs_t* req, uv_file fd, uv_uid_t uid, uv_gid_t gid, uv_fs_cb cb) { INIT(UV_FS_FCHOWN); POST; } int uv_fs_lchown(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_uid_t uid, uv_gid_t gid, uv_fs_cb cb) { int err; INIT(UV_FS_LCHOWN); err = fs__capture_path(req, path, NULL, cb != NULL); if (err) { SET_REQ_WIN32_ERROR(req, err); return req->result; } POST; } int uv_fs_stat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { int err; INIT(UV_FS_STAT); err = fs__capture_path(req, path, NULL, cb != NULL); if (err) { SET_REQ_WIN32_ERROR(req, err); return req->result; } POST; } int uv_fs_lstat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { int err; INIT(UV_FS_LSTAT); err = fs__capture_path(req, path, NULL, cb != NULL); if (err) { SET_REQ_WIN32_ERROR(req, err); return req->result; } POST; } int uv_fs_fstat(uv_loop_t* loop, uv_fs_t* req, uv_file fd, uv_fs_cb cb) { INIT(UV_FS_FSTAT); req->file.fd = fd; POST; } int uv_fs_rename(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, uv_fs_cb cb) { int err; INIT(UV_FS_RENAME); err = fs__capture_path(req, path, new_path, cb != NULL); if (err) { SET_REQ_WIN32_ERROR(req, err); return req->result; } POST; } int uv_fs_fsync(uv_loop_t* loop, uv_fs_t* req, uv_file fd, uv_fs_cb cb) { INIT(UV_FS_FSYNC); req->file.fd = fd; POST; } int uv_fs_fdatasync(uv_loop_t* loop, uv_fs_t* req, uv_file fd, uv_fs_cb cb) { INIT(UV_FS_FDATASYNC); req->file.fd = fd; POST; } int uv_fs_ftruncate(uv_loop_t* loop, uv_fs_t* req, uv_file fd, int64_t offset, uv_fs_cb cb) { INIT(UV_FS_FTRUNCATE); req->file.fd = fd; req->fs.info.offset = offset; POST; } int uv_fs_copyfile(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, int flags, uv_fs_cb cb) { int err; INIT(UV_FS_COPYFILE); if (flags & ~(UV_FS_COPYFILE_EXCL | UV_FS_COPYFILE_FICLONE | UV_FS_COPYFILE_FICLONE_FORCE)) { SET_REQ_UV_ERROR(req, UV_EINVAL, ERROR_INVALID_PARAMETER); return UV_EINVAL; } err = fs__capture_path(req, path, new_path, cb != NULL); if (err) { SET_REQ_WIN32_ERROR(req, err); return req->result; } req->fs.info.file_flags = flags; POST; } int uv_fs_sendfile(uv_loop_t* loop, uv_fs_t* req, uv_file fd_out, uv_file fd_in, int64_t in_offset, size_t length, uv_fs_cb cb) { INIT(UV_FS_SENDFILE); req->file.fd = fd_in; req->fs.info.fd_out = fd_out; req->fs.info.offset = in_offset; req->fs.info.bufsml[0].len = length; POST; } int uv_fs_access(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, uv_fs_cb cb) { int err; INIT(UV_FS_ACCESS); err = fs__capture_path(req, path, NULL, cb != NULL); if (err) { SET_REQ_WIN32_ERROR(req, err); return req->result; } req->fs.info.mode = flags; POST; } int uv_fs_chmod(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, uv_fs_cb cb) { int err; INIT(UV_FS_CHMOD); err = fs__capture_path(req, path, NULL, cb != NULL); if (err) { SET_REQ_WIN32_ERROR(req, err); return req->result; } req->fs.info.mode = mode; POST; } int uv_fs_fchmod(uv_loop_t* loop, uv_fs_t* req, uv_file fd, int mode, uv_fs_cb cb) { INIT(UV_FS_FCHMOD); req->file.fd = fd; req->fs.info.mode = mode; POST; } int uv_fs_utime(uv_loop_t* loop, uv_fs_t* req, const char* path, double atime, double mtime, uv_fs_cb cb) { int err; INIT(UV_FS_UTIME); err = fs__capture_path(req, path, NULL, cb != NULL); if (err) { SET_REQ_WIN32_ERROR(req, err); return req->result; } req->fs.time.atime = atime; req->fs.time.mtime = mtime; POST; } int uv_fs_futime(uv_loop_t* loop, uv_fs_t* req, uv_file fd, double atime, double mtime, uv_fs_cb cb) { INIT(UV_FS_FUTIME); req->file.fd = fd; req->fs.time.atime = atime; req->fs.time.mtime = mtime; POST; } int uv_fs_lutime(uv_loop_t* loop, uv_fs_t* req, const char* path, double atime, double mtime, uv_fs_cb cb) { int err; INIT(UV_FS_LUTIME); err = fs__capture_path(req, path, NULL, cb != NULL); if (err) { SET_REQ_WIN32_ERROR(req, err); return req->result; } req->fs.time.atime = atime; req->fs.time.mtime = mtime; POST; } int uv_fs_statfs(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { int err; INIT(UV_FS_STATFS); err = fs__capture_path(req, path, NULL, cb != NULL); if (err) { SET_REQ_WIN32_ERROR(req, err); return req->result; } POST; } int uv_fs_get_system_error(const uv_fs_t* req) { return req->sys_errno_; } ================================================ FILE: external/libuv/src/win/getaddrinfo.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include "uv.h" #include "internal.h" #include "req-inl.h" #include "idna.h" /* EAI_* constants. */ #include /* Needed for ConvertInterfaceIndexToLuid and ConvertInterfaceLuidToNameA */ #include int uv__getaddrinfo_translate_error(int sys_err) { switch (sys_err) { case 0: return 0; case WSATRY_AGAIN: return UV_EAI_AGAIN; case WSAEINVAL: return UV_EAI_BADFLAGS; case WSANO_RECOVERY: return UV_EAI_FAIL; case WSAEAFNOSUPPORT: return UV_EAI_FAMILY; case WSA_NOT_ENOUGH_MEMORY: return UV_EAI_MEMORY; case WSAHOST_NOT_FOUND: return UV_EAI_NONAME; case WSATYPE_NOT_FOUND: return UV_EAI_SERVICE; case WSAESOCKTNOSUPPORT: return UV_EAI_SOCKTYPE; default: return uv_translate_sys_error(sys_err); } } /* * MinGW is missing this */ #if !defined(_MSC_VER) && !defined(__MINGW64_VERSION_MAJOR) typedef struct addrinfoW { int ai_flags; int ai_family; int ai_socktype; int ai_protocol; size_t ai_addrlen; WCHAR* ai_canonname; struct sockaddr* ai_addr; struct addrinfoW* ai_next; } ADDRINFOW, *PADDRINFOW; DECLSPEC_IMPORT int WSAAPI GetAddrInfoW(const WCHAR* node, const WCHAR* service, const ADDRINFOW* hints, PADDRINFOW* result); DECLSPEC_IMPORT void WSAAPI FreeAddrInfoW(PADDRINFOW pAddrInfo); #endif /* Adjust size value to be multiple of 4. Use to keep pointer aligned. * Do we need different versions of this for different architectures? */ #define ALIGNED_SIZE(X) ((((X) + 3) >> 2) << 2) #ifndef NDIS_IF_MAX_STRING_SIZE #define NDIS_IF_MAX_STRING_SIZE IF_MAX_STRING_SIZE #endif static void uv__getaddrinfo_work(struct uv__work* w) { uv_getaddrinfo_t* req; struct addrinfoW* hints; int err; req = container_of(w, uv_getaddrinfo_t, work_req); hints = req->addrinfow; req->addrinfow = NULL; err = GetAddrInfoW(req->node, req->service, hints, &req->addrinfow); req->retcode = uv__getaddrinfo_translate_error(err); } /* * Called from uv_run when complete. Call user specified callback * then free returned addrinfo * Returned addrinfo strings are converted from UTF-16 to UTF-8. * * To minimize allocation we calculate total size required, * and copy all structs and referenced strings into the one block. * Each size calculation is adjusted to avoid unaligned pointers. */ static void uv__getaddrinfo_done(struct uv__work* w, int status) { uv_getaddrinfo_t* req; int addrinfo_len = 0; int name_len = 0; size_t addrinfo_struct_len = ALIGNED_SIZE(sizeof(struct addrinfo)); struct addrinfoW* addrinfow_ptr; struct addrinfo* addrinfo_ptr; char* alloc_ptr = NULL; char* cur_ptr = NULL; req = container_of(w, uv_getaddrinfo_t, work_req); /* release input parameter memory */ uv__free(req->alloc); req->alloc = NULL; if (status == UV_ECANCELED) { assert(req->retcode == 0); req->retcode = UV_EAI_CANCELED; goto complete; } if (req->retcode == 0) { /* Convert addrinfoW to addrinfo. First calculate required length. */ addrinfow_ptr = req->addrinfow; while (addrinfow_ptr != NULL) { addrinfo_len += addrinfo_struct_len + ALIGNED_SIZE(addrinfow_ptr->ai_addrlen); if (addrinfow_ptr->ai_canonname != NULL) { name_len = WideCharToMultiByte(CP_UTF8, 0, addrinfow_ptr->ai_canonname, -1, NULL, 0, NULL, NULL); if (name_len == 0) { req->retcode = uv_translate_sys_error(GetLastError()); goto complete; } addrinfo_len += ALIGNED_SIZE(name_len); } addrinfow_ptr = addrinfow_ptr->ai_next; } /* allocate memory for addrinfo results */ alloc_ptr = (char*)uv__malloc(addrinfo_len); /* do conversions */ if (alloc_ptr != NULL) { cur_ptr = alloc_ptr; addrinfow_ptr = req->addrinfow; while (addrinfow_ptr != NULL) { /* copy addrinfo struct data */ assert(cur_ptr + addrinfo_struct_len <= alloc_ptr + addrinfo_len); addrinfo_ptr = (struct addrinfo*)cur_ptr; addrinfo_ptr->ai_family = addrinfow_ptr->ai_family; addrinfo_ptr->ai_socktype = addrinfow_ptr->ai_socktype; addrinfo_ptr->ai_protocol = addrinfow_ptr->ai_protocol; addrinfo_ptr->ai_flags = addrinfow_ptr->ai_flags; addrinfo_ptr->ai_addrlen = addrinfow_ptr->ai_addrlen; addrinfo_ptr->ai_canonname = NULL; addrinfo_ptr->ai_addr = NULL; addrinfo_ptr->ai_next = NULL; cur_ptr += addrinfo_struct_len; /* copy sockaddr */ if (addrinfo_ptr->ai_addrlen > 0) { assert(cur_ptr + addrinfo_ptr->ai_addrlen <= alloc_ptr + addrinfo_len); memcpy(cur_ptr, addrinfow_ptr->ai_addr, addrinfo_ptr->ai_addrlen); addrinfo_ptr->ai_addr = (struct sockaddr*)cur_ptr; cur_ptr += ALIGNED_SIZE(addrinfo_ptr->ai_addrlen); } /* convert canonical name to UTF-8 */ if (addrinfow_ptr->ai_canonname != NULL) { name_len = WideCharToMultiByte(CP_UTF8, 0, addrinfow_ptr->ai_canonname, -1, NULL, 0, NULL, NULL); assert(name_len > 0); assert(cur_ptr + name_len <= alloc_ptr + addrinfo_len); name_len = WideCharToMultiByte(CP_UTF8, 0, addrinfow_ptr->ai_canonname, -1, cur_ptr, name_len, NULL, NULL); assert(name_len > 0); addrinfo_ptr->ai_canonname = cur_ptr; cur_ptr += ALIGNED_SIZE(name_len); } assert(cur_ptr <= alloc_ptr + addrinfo_len); /* set next ptr */ addrinfow_ptr = addrinfow_ptr->ai_next; if (addrinfow_ptr != NULL) { addrinfo_ptr->ai_next = (struct addrinfo*)cur_ptr; } } req->addrinfo = (struct addrinfo*)alloc_ptr; } else { req->retcode = UV_EAI_MEMORY; } } /* return memory to system */ if (req->addrinfow != NULL) { FreeAddrInfoW(req->addrinfow); req->addrinfow = NULL; } complete: uv__req_unregister(req->loop, req); /* finally do callback with converted result */ if (req->getaddrinfo_cb) req->getaddrinfo_cb(req, req->retcode, req->addrinfo); } void uv_freeaddrinfo(struct addrinfo* ai) { char* alloc_ptr = (char*)ai; /* release copied result memory */ uv__free(alloc_ptr); } /* * Entry point for getaddrinfo * we convert the UTF-8 strings to UNICODE * and save the UNICODE string pointers in the req * We also copy hints so that caller does not need to keep memory until the * callback. * return 0 if a callback will be made * return error code if validation fails * * To minimize allocation we calculate total size required, * and copy all structs and referenced strings into the one block. * Each size calculation is adjusted to avoid unaligned pointers. */ int uv_getaddrinfo(uv_loop_t* loop, uv_getaddrinfo_t* req, uv_getaddrinfo_cb getaddrinfo_cb, const char* node, const char* service, const struct addrinfo* hints) { char hostname_ascii[256]; int nodesize = 0; int servicesize = 0; int hintssize = 0; char* alloc_ptr = NULL; int err; long rc; if (req == NULL || (node == NULL && service == NULL)) { return UV_EINVAL; } UV_REQ_INIT(req, UV_GETADDRINFO); req->getaddrinfo_cb = getaddrinfo_cb; req->addrinfo = NULL; req->loop = loop; req->retcode = 0; /* calculate required memory size for all input values */ if (node != NULL) { rc = uv__idna_toascii(node, node + strlen(node), hostname_ascii, hostname_ascii + sizeof(hostname_ascii)); if (rc < 0) return rc; nodesize = ALIGNED_SIZE(MultiByteToWideChar(CP_UTF8, 0, hostname_ascii, -1, NULL, 0) * sizeof(WCHAR)); if (nodesize == 0) { err = GetLastError(); goto error; } node = hostname_ascii; } if (service != NULL) { servicesize = ALIGNED_SIZE(MultiByteToWideChar(CP_UTF8, 0, service, -1, NULL, 0) * sizeof(WCHAR)); if (servicesize == 0) { err = GetLastError(); goto error; } } if (hints != NULL) { hintssize = ALIGNED_SIZE(sizeof(struct addrinfoW)); } /* allocate memory for inputs, and partition it as needed */ alloc_ptr = (char*)uv__malloc(nodesize + servicesize + hintssize); if (!alloc_ptr) { err = WSAENOBUFS; goto error; } /* save alloc_ptr now so we can free if error */ req->alloc = (void*)alloc_ptr; /* Convert node string to UTF16 into allocated memory and save pointer in the * request. */ if (node != NULL) { req->node = (WCHAR*)alloc_ptr; if (MultiByteToWideChar(CP_UTF8, 0, node, -1, (WCHAR*) alloc_ptr, nodesize / sizeof(WCHAR)) == 0) { err = GetLastError(); goto error; } alloc_ptr += nodesize; } else { req->node = NULL; } /* Convert service string to UTF16 into allocated memory and save pointer in * the req. */ if (service != NULL) { req->service = (WCHAR*)alloc_ptr; if (MultiByteToWideChar(CP_UTF8, 0, service, -1, (WCHAR*) alloc_ptr, servicesize / sizeof(WCHAR)) == 0) { err = GetLastError(); goto error; } alloc_ptr += servicesize; } else { req->service = NULL; } /* copy hints to allocated memory and save pointer in req */ if (hints != NULL) { req->addrinfow = (struct addrinfoW*)alloc_ptr; req->addrinfow->ai_family = hints->ai_family; req->addrinfow->ai_socktype = hints->ai_socktype; req->addrinfow->ai_protocol = hints->ai_protocol; req->addrinfow->ai_flags = hints->ai_flags; req->addrinfow->ai_addrlen = 0; req->addrinfow->ai_canonname = NULL; req->addrinfow->ai_addr = NULL; req->addrinfow->ai_next = NULL; } else { req->addrinfow = NULL; } uv__req_register(loop, req); if (getaddrinfo_cb) { uv__work_submit(loop, &req->work_req, UV__WORK_SLOW_IO, uv__getaddrinfo_work, uv__getaddrinfo_done); return 0; } else { uv__getaddrinfo_work(&req->work_req); uv__getaddrinfo_done(&req->work_req, 0); return req->retcode; } error: if (req != NULL) { uv__free(req->alloc); req->alloc = NULL; } return uv_translate_sys_error(err); } int uv_if_indextoname(unsigned int ifindex, char* buffer, size_t* size) { NET_LUID luid; wchar_t wname[NDIS_IF_MAX_STRING_SIZE + 1]; /* Add one for the NUL. */ DWORD bufsize; int r; if (buffer == NULL || size == NULL || *size == 0) return UV_EINVAL; r = ConvertInterfaceIndexToLuid(ifindex, &luid); if (r != 0) return uv_translate_sys_error(r); r = ConvertInterfaceLuidToNameW(&luid, wname, ARRAY_SIZE(wname)); if (r != 0) return uv_translate_sys_error(r); /* Check how much space we need */ bufsize = WideCharToMultiByte(CP_UTF8, 0, wname, -1, NULL, 0, NULL, NULL); if (bufsize == 0) { return uv_translate_sys_error(GetLastError()); } else if (bufsize > *size) { *size = bufsize; return UV_ENOBUFS; } /* Convert to UTF-8 */ bufsize = WideCharToMultiByte(CP_UTF8, 0, wname, -1, buffer, *size, NULL, NULL); if (bufsize == 0) return uv_translate_sys_error(GetLastError()); *size = bufsize - 1; return 0; } int uv_if_indextoiid(unsigned int ifindex, char* buffer, size_t* size) { int r; if (buffer == NULL || size == NULL || *size == 0) return UV_EINVAL; r = snprintf(buffer, *size, "%d", ifindex); if (r < 0) return uv_translate_sys_error(r); if (r >= (int) *size) { *size = r + 1; return UV_ENOBUFS; } *size = r; return 0; } ================================================ FILE: external/libuv/src/win/getnameinfo.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include "uv.h" #include "internal.h" #include "req-inl.h" #ifndef GetNameInfo int WSAAPI GetNameInfoW( const SOCKADDR *pSockaddr, socklen_t SockaddrLength, PWCHAR pNodeBuffer, DWORD NodeBufferSize, PWCHAR pServiceBuffer, DWORD ServiceBufferSize, INT Flags ); #endif static void uv__getnameinfo_work(struct uv__work* w) { uv_getnameinfo_t* req; WCHAR host[NI_MAXHOST]; WCHAR service[NI_MAXSERV]; int ret; req = container_of(w, uv_getnameinfo_t, work_req); if (GetNameInfoW((struct sockaddr*)&req->storage, sizeof(req->storage), host, ARRAY_SIZE(host), service, ARRAY_SIZE(service), req->flags)) { ret = WSAGetLastError(); req->retcode = uv__getaddrinfo_translate_error(ret); return; } ret = WideCharToMultiByte(CP_UTF8, 0, host, -1, req->host, sizeof(req->host), NULL, NULL); if (ret == 0) { req->retcode = uv_translate_sys_error(GetLastError()); return; } ret = WideCharToMultiByte(CP_UTF8, 0, service, -1, req->service, sizeof(req->service), NULL, NULL); if (ret == 0) { req->retcode = uv_translate_sys_error(GetLastError()); } } /* * Called from uv_run when complete. */ static void uv__getnameinfo_done(struct uv__work* w, int status) { uv_getnameinfo_t* req; char* host; char* service; req = container_of(w, uv_getnameinfo_t, work_req); uv__req_unregister(req->loop, req); host = service = NULL; if (status == UV_ECANCELED) { assert(req->retcode == 0); req->retcode = UV_EAI_CANCELED; } else if (req->retcode == 0) { host = req->host; service = req->service; } if (req->getnameinfo_cb) req->getnameinfo_cb(req, req->retcode, host, service); } /* * Entry point for getnameinfo * return 0 if a callback will be made * return error code if validation fails */ int uv_getnameinfo(uv_loop_t* loop, uv_getnameinfo_t* req, uv_getnameinfo_cb getnameinfo_cb, const struct sockaddr* addr, int flags) { if (req == NULL || addr == NULL) return UV_EINVAL; if (addr->sa_family == AF_INET) { memcpy(&req->storage, addr, sizeof(struct sockaddr_in)); } else if (addr->sa_family == AF_INET6) { memcpy(&req->storage, addr, sizeof(struct sockaddr_in6)); } else { return UV_EINVAL; } UV_REQ_INIT(req, UV_GETNAMEINFO); uv__req_register(loop, req); req->getnameinfo_cb = getnameinfo_cb; req->flags = flags; req->loop = loop; req->retcode = 0; if (getnameinfo_cb) { uv__work_submit(loop, &req->work_req, UV__WORK_SLOW_IO, uv__getnameinfo_work, uv__getnameinfo_done); return 0; } else { uv__getnameinfo_work(&req->work_req); uv__getnameinfo_done(&req->work_req, 0); return req->retcode; } } ================================================ FILE: external/libuv/src/win/handle-inl.h ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #ifndef UV_WIN_HANDLE_INL_H_ #define UV_WIN_HANDLE_INL_H_ #include #include #include "uv.h" #include "internal.h" #define DECREASE_ACTIVE_COUNT(loop, handle) \ do { \ if (--(handle)->activecnt == 0 && \ !((handle)->flags & UV_HANDLE_CLOSING)) { \ uv__handle_stop((handle)); \ } \ assert((handle)->activecnt >= 0); \ } while (0) #define INCREASE_ACTIVE_COUNT(loop, handle) \ do { \ if ((handle)->activecnt++ == 0) { \ uv__handle_start((handle)); \ } \ assert((handle)->activecnt > 0); \ } while (0) #define DECREASE_PENDING_REQ_COUNT(handle) \ do { \ assert(handle->reqs_pending > 0); \ handle->reqs_pending--; \ \ if (handle->flags & UV_HANDLE_CLOSING && \ handle->reqs_pending == 0) { \ uv_want_endgame(loop, (uv_handle_t*)handle); \ } \ } while (0) #define uv__handle_closing(handle) \ do { \ assert(!((handle)->flags & UV_HANDLE_CLOSING)); \ \ if (!(((handle)->flags & UV_HANDLE_ACTIVE) && \ ((handle)->flags & UV_HANDLE_REF))) \ uv__active_handle_add((uv_handle_t*) (handle)); \ \ (handle)->flags |= UV_HANDLE_CLOSING; \ (handle)->flags &= ~UV_HANDLE_ACTIVE; \ } while (0) #define uv__handle_close(handle) \ do { \ QUEUE_REMOVE(&(handle)->handle_queue); \ uv__active_handle_rm((uv_handle_t*) (handle)); \ \ (handle)->flags |= UV_HANDLE_CLOSED; \ \ if ((handle)->close_cb) \ (handle)->close_cb((uv_handle_t*) (handle)); \ } while (0) INLINE static void uv_want_endgame(uv_loop_t* loop, uv_handle_t* handle) { if (!(handle->flags & UV_HANDLE_ENDGAME_QUEUED)) { handle->flags |= UV_HANDLE_ENDGAME_QUEUED; handle->endgame_next = loop->endgame_handles; loop->endgame_handles = handle; } } INLINE static void uv_process_endgames(uv_loop_t* loop) { uv_handle_t* handle; while (loop->endgame_handles) { handle = loop->endgame_handles; loop->endgame_handles = handle->endgame_next; handle->flags &= ~UV_HANDLE_ENDGAME_QUEUED; switch (handle->type) { case UV_TCP: uv_tcp_endgame(loop, (uv_tcp_t*) handle); break; case UV_NAMED_PIPE: uv_pipe_endgame(loop, (uv_pipe_t*) handle); break; case UV_TTY: uv_tty_endgame(loop, (uv_tty_t*) handle); break; case UV_UDP: uv_udp_endgame(loop, (uv_udp_t*) handle); break; case UV_POLL: uv_poll_endgame(loop, (uv_poll_t*) handle); break; case UV_TIMER: uv__timer_close((uv_timer_t*) handle); uv__handle_close(handle); break; case UV_PREPARE: case UV_CHECK: case UV_IDLE: uv_loop_watcher_endgame(loop, handle); break; case UV_ASYNC: uv_async_endgame(loop, (uv_async_t*) handle); break; case UV_SIGNAL: uv_signal_endgame(loop, (uv_signal_t*) handle); break; case UV_PROCESS: uv_process_endgame(loop, (uv_process_t*) handle); break; case UV_FS_EVENT: uv_fs_event_endgame(loop, (uv_fs_event_t*) handle); break; case UV_FS_POLL: uv__fs_poll_endgame(loop, (uv_fs_poll_t*) handle); break; default: assert(0); break; } } } INLINE static HANDLE uv__get_osfhandle(int fd) { /* _get_osfhandle() raises an assert in debug builds if the FD is invalid. * But it also correctly checks the FD and returns INVALID_HANDLE_VALUE for * invalid FDs in release builds (or if you let the assert continue). So this * wrapper function disables asserts when calling _get_osfhandle. */ HANDLE handle; UV_BEGIN_DISABLE_CRT_ASSERT(); handle = (HANDLE) _get_osfhandle(fd); UV_END_DISABLE_CRT_ASSERT(); return handle; } #endif /* UV_WIN_HANDLE_INL_H_ */ ================================================ FILE: external/libuv/src/win/handle.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include "uv.h" #include "internal.h" #include "handle-inl.h" uv_handle_type uv_guess_handle(uv_file file) { HANDLE handle; DWORD mode; if (file < 0) { return UV_UNKNOWN_HANDLE; } handle = uv__get_osfhandle(file); switch (GetFileType(handle)) { case FILE_TYPE_CHAR: if (GetConsoleMode(handle, &mode)) { return UV_TTY; } else { return UV_FILE; } case FILE_TYPE_PIPE: return UV_NAMED_PIPE; case FILE_TYPE_DISK: return UV_FILE; default: return UV_UNKNOWN_HANDLE; } } int uv_is_active(const uv_handle_t* handle) { return (handle->flags & UV_HANDLE_ACTIVE) && !(handle->flags & UV_HANDLE_CLOSING); } void uv_close(uv_handle_t* handle, uv_close_cb cb) { uv_loop_t* loop = handle->loop; if (handle->flags & UV_HANDLE_CLOSING) { assert(0); return; } handle->close_cb = cb; /* Handle-specific close actions */ switch (handle->type) { case UV_TCP: uv_tcp_close(loop, (uv_tcp_t*)handle); return; case UV_NAMED_PIPE: uv_pipe_close(loop, (uv_pipe_t*) handle); return; case UV_TTY: uv_tty_close((uv_tty_t*) handle); return; case UV_UDP: uv_udp_close(loop, (uv_udp_t*) handle); return; case UV_POLL: uv_poll_close(loop, (uv_poll_t*) handle); return; case UV_TIMER: uv_timer_stop((uv_timer_t*)handle); uv__handle_closing(handle); uv_want_endgame(loop, handle); return; case UV_PREPARE: uv_prepare_stop((uv_prepare_t*)handle); uv__handle_closing(handle); uv_want_endgame(loop, handle); return; case UV_CHECK: uv_check_stop((uv_check_t*)handle); uv__handle_closing(handle); uv_want_endgame(loop, handle); return; case UV_IDLE: uv_idle_stop((uv_idle_t*)handle); uv__handle_closing(handle); uv_want_endgame(loop, handle); return; case UV_ASYNC: uv_async_close(loop, (uv_async_t*) handle); return; case UV_SIGNAL: uv_signal_close(loop, (uv_signal_t*) handle); return; case UV_PROCESS: uv_process_close(loop, (uv_process_t*) handle); return; case UV_FS_EVENT: uv_fs_event_close(loop, (uv_fs_event_t*) handle); return; case UV_FS_POLL: uv__fs_poll_close((uv_fs_poll_t*) handle); uv__handle_closing(handle); return; default: /* Not supported */ abort(); } } int uv_is_closing(const uv_handle_t* handle) { return !!(handle->flags & (UV_HANDLE_CLOSING | UV_HANDLE_CLOSED)); } uv_os_fd_t uv_get_osfhandle(int fd) { return uv__get_osfhandle(fd); } int uv_open_osfhandle(uv_os_fd_t os_fd) { return _open_osfhandle((intptr_t) os_fd, 0); } ================================================ FILE: external/libuv/src/win/internal.h ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #ifndef UV_WIN_INTERNAL_H_ #define UV_WIN_INTERNAL_H_ #include "uv.h" #include "../uv-common.h" #include "uv/tree.h" #include "winapi.h" #include "winsock.h" #ifdef _MSC_VER # define INLINE __inline # define UV_THREAD_LOCAL __declspec( thread ) #else # define INLINE inline # define UV_THREAD_LOCAL __thread #endif #ifdef _DEBUG extern UV_THREAD_LOCAL int uv__crt_assert_enabled; #define UV_BEGIN_DISABLE_CRT_ASSERT() \ { \ int uv__saved_crt_assert_enabled = uv__crt_assert_enabled; \ uv__crt_assert_enabled = FALSE; #define UV_END_DISABLE_CRT_ASSERT() \ uv__crt_assert_enabled = uv__saved_crt_assert_enabled; \ } #else #define UV_BEGIN_DISABLE_CRT_ASSERT() #define UV_END_DISABLE_CRT_ASSERT() #endif /* * TCP */ typedef enum { UV__IPC_SOCKET_XFER_NONE = 0, UV__IPC_SOCKET_XFER_TCP_CONNECTION, UV__IPC_SOCKET_XFER_TCP_SERVER } uv__ipc_socket_xfer_type_t; typedef struct { WSAPROTOCOL_INFOW socket_info; uint32_t delayed_error; } uv__ipc_socket_xfer_info_t; int uv_tcp_listen(uv_tcp_t* handle, int backlog, uv_connection_cb cb); int uv_tcp_accept(uv_tcp_t* server, uv_tcp_t* client); int uv_tcp_read_start(uv_tcp_t* handle, uv_alloc_cb alloc_cb, uv_read_cb read_cb); int uv_tcp_write(uv_loop_t* loop, uv_write_t* req, uv_tcp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb); int uv__tcp_try_write(uv_tcp_t* handle, const uv_buf_t bufs[], unsigned int nbufs); void uv_process_tcp_read_req(uv_loop_t* loop, uv_tcp_t* handle, uv_req_t* req); void uv_process_tcp_write_req(uv_loop_t* loop, uv_tcp_t* handle, uv_write_t* req); void uv_process_tcp_accept_req(uv_loop_t* loop, uv_tcp_t* handle, uv_req_t* req); void uv_process_tcp_connect_req(uv_loop_t* loop, uv_tcp_t* handle, uv_connect_t* req); void uv_tcp_close(uv_loop_t* loop, uv_tcp_t* tcp); void uv_tcp_endgame(uv_loop_t* loop, uv_tcp_t* handle); int uv__tcp_xfer_export(uv_tcp_t* handle, int pid, uv__ipc_socket_xfer_type_t* xfer_type, uv__ipc_socket_xfer_info_t* xfer_info); int uv__tcp_xfer_import(uv_tcp_t* tcp, uv__ipc_socket_xfer_type_t xfer_type, uv__ipc_socket_xfer_info_t* xfer_info); /* * UDP */ void uv_process_udp_recv_req(uv_loop_t* loop, uv_udp_t* handle, uv_req_t* req); void uv_process_udp_send_req(uv_loop_t* loop, uv_udp_t* handle, uv_udp_send_t* req); void uv_udp_close(uv_loop_t* loop, uv_udp_t* handle); void uv_udp_endgame(uv_loop_t* loop, uv_udp_t* handle); /* * Pipes */ int uv_stdio_pipe_server(uv_loop_t* loop, uv_pipe_t* handle, DWORD access, char* name, size_t nameSize); int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb); int uv_pipe_accept(uv_pipe_t* server, uv_stream_t* client); int uv_pipe_read_start(uv_pipe_t* handle, uv_alloc_cb alloc_cb, uv_read_cb read_cb); void uv__pipe_read_stop(uv_pipe_t* handle); int uv__pipe_write(uv_loop_t* loop, uv_write_t* req, uv_pipe_t* handle, const uv_buf_t bufs[], size_t nbufs, uv_stream_t* send_handle, uv_write_cb cb); void uv_process_pipe_read_req(uv_loop_t* loop, uv_pipe_t* handle, uv_req_t* req); void uv_process_pipe_write_req(uv_loop_t* loop, uv_pipe_t* handle, uv_write_t* req); void uv_process_pipe_accept_req(uv_loop_t* loop, uv_pipe_t* handle, uv_req_t* raw_req); void uv_process_pipe_connect_req(uv_loop_t* loop, uv_pipe_t* handle, uv_connect_t* req); void uv_process_pipe_shutdown_req(uv_loop_t* loop, uv_pipe_t* handle, uv_shutdown_t* req); void uv_pipe_close(uv_loop_t* loop, uv_pipe_t* handle); void uv_pipe_cleanup(uv_loop_t* loop, uv_pipe_t* handle); void uv_pipe_endgame(uv_loop_t* loop, uv_pipe_t* handle); /* * TTY */ void uv_console_init(void); int uv_tty_read_start(uv_tty_t* handle, uv_alloc_cb alloc_cb, uv_read_cb read_cb); int uv_tty_read_stop(uv_tty_t* handle); int uv_tty_write(uv_loop_t* loop, uv_write_t* req, uv_tty_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb); int uv__tty_try_write(uv_tty_t* handle, const uv_buf_t bufs[], unsigned int nbufs); void uv_tty_close(uv_tty_t* handle); void uv_process_tty_read_req(uv_loop_t* loop, uv_tty_t* handle, uv_req_t* req); void uv_process_tty_write_req(uv_loop_t* loop, uv_tty_t* handle, uv_write_t* req); /* * uv_process_tty_accept_req() is a stub to keep DELEGATE_STREAM_REQ working * TODO: find a way to remove it */ void uv_process_tty_accept_req(uv_loop_t* loop, uv_tty_t* handle, uv_req_t* raw_req); /* * uv_process_tty_connect_req() is a stub to keep DELEGATE_STREAM_REQ working * TODO: find a way to remove it */ void uv_process_tty_connect_req(uv_loop_t* loop, uv_tty_t* handle, uv_connect_t* req); void uv_tty_endgame(uv_loop_t* loop, uv_tty_t* handle); /* * Poll watchers */ void uv_process_poll_req(uv_loop_t* loop, uv_poll_t* handle, uv_req_t* req); int uv_poll_close(uv_loop_t* loop, uv_poll_t* handle); void uv_poll_endgame(uv_loop_t* loop, uv_poll_t* handle); /* * Loop watchers */ void uv_loop_watcher_endgame(uv_loop_t* loop, uv_handle_t* handle); void uv_prepare_invoke(uv_loop_t* loop); void uv_check_invoke(uv_loop_t* loop); void uv_idle_invoke(uv_loop_t* loop); void uv__once_init(void); /* * Async watcher */ void uv_async_close(uv_loop_t* loop, uv_async_t* handle); void uv_async_endgame(uv_loop_t* loop, uv_async_t* handle); void uv_process_async_wakeup_req(uv_loop_t* loop, uv_async_t* handle, uv_req_t* req); /* * Signal watcher */ void uv_signals_init(void); int uv__signal_dispatch(int signum); void uv_signal_close(uv_loop_t* loop, uv_signal_t* handle); void uv_signal_endgame(uv_loop_t* loop, uv_signal_t* handle); void uv_process_signal_req(uv_loop_t* loop, uv_signal_t* handle, uv_req_t* req); /* * Spawn */ void uv_process_proc_exit(uv_loop_t* loop, uv_process_t* handle); void uv_process_close(uv_loop_t* loop, uv_process_t* handle); void uv_process_endgame(uv_loop_t* loop, uv_process_t* handle); /* * Error */ int uv_translate_sys_error(int sys_errno); /* * FS */ void uv_fs_init(void); /* * FS Event */ void uv_process_fs_event_req(uv_loop_t* loop, uv_req_t* req, uv_fs_event_t* handle); void uv_fs_event_close(uv_loop_t* loop, uv_fs_event_t* handle); void uv_fs_event_endgame(uv_loop_t* loop, uv_fs_event_t* handle); /* * Stat poller. */ void uv__fs_poll_endgame(uv_loop_t* loop, uv_fs_poll_t* handle); /* * Utilities. */ void uv__util_init(void); uint64_t uv__hrtime(double scale); __declspec(noreturn) void uv_fatal_error(const int errorno, const char* syscall); int uv__getpwuid_r(uv_passwd_t* pwd); int uv__convert_utf16_to_utf8(const WCHAR* utf16, int utf16len, char** utf8); int uv__convert_utf8_to_utf16(const char* utf8, int utf8len, WCHAR** utf16); typedef int (WINAPI *uv__peersockfunc)(SOCKET, struct sockaddr*, int*); int uv__getsockpeername(const uv_handle_t* handle, uv__peersockfunc func, struct sockaddr* name, int* namelen, int delayed_error); int uv__random_rtlgenrandom(void* buf, size_t buflen); /* * Process stdio handles. */ int uv__stdio_create(uv_loop_t* loop, const uv_process_options_t* options, BYTE** buffer_ptr); void uv__stdio_destroy(BYTE* buffer); void uv__stdio_noinherit(BYTE* buffer); int uv__stdio_verify(BYTE* buffer, WORD size); WORD uv__stdio_size(BYTE* buffer); HANDLE uv__stdio_handle(BYTE* buffer, int fd); /* * Winapi and ntapi utility functions */ void uv_winapi_init(void); /* * Winsock utility functions */ void uv_winsock_init(void); int uv_ntstatus_to_winsock_error(NTSTATUS status); BOOL uv_get_acceptex_function(SOCKET socket, LPFN_ACCEPTEX* target); BOOL uv_get_connectex_function(SOCKET socket, LPFN_CONNECTEX* target); int WSAAPI uv_wsarecv_workaround(SOCKET socket, WSABUF* buffers, DWORD buffer_count, DWORD* bytes, DWORD* flags, WSAOVERLAPPED *overlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine); int WSAAPI uv_wsarecvfrom_workaround(SOCKET socket, WSABUF* buffers, DWORD buffer_count, DWORD* bytes, DWORD* flags, struct sockaddr* addr, int* addr_len, WSAOVERLAPPED *overlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine); int WSAAPI uv_msafd_poll(SOCKET socket, AFD_POLL_INFO* info_in, AFD_POLL_INFO* info_out, OVERLAPPED* overlapped); /* Whether there are any non-IFS LSPs stacked on TCP */ extern int uv_tcp_non_ifs_lsp_ipv4; extern int uv_tcp_non_ifs_lsp_ipv6; /* Ip address used to bind to any port at any interface */ extern struct sockaddr_in uv_addr_ip4_any_; extern struct sockaddr_in6 uv_addr_ip6_any_; /* * Wake all loops with fake message */ void uv__wake_all_loops(void); /* * Init system wake-up detection */ void uv__init_detect_system_wakeup(void); #endif /* UV_WIN_INTERNAL_H_ */ ================================================ FILE: external/libuv/src/win/loop-watcher.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include "uv.h" #include "internal.h" #include "handle-inl.h" void uv_loop_watcher_endgame(uv_loop_t* loop, uv_handle_t* handle) { if (handle->flags & UV_HANDLE_CLOSING) { assert(!(handle->flags & UV_HANDLE_CLOSED)); handle->flags |= UV_HANDLE_CLOSED; uv__handle_close(handle); } } #define UV_LOOP_WATCHER_DEFINE(name, NAME) \ int uv_##name##_init(uv_loop_t* loop, uv_##name##_t* handle) { \ uv__handle_init(loop, (uv_handle_t*) handle, UV_##NAME); \ \ return 0; \ } \ \ \ int uv_##name##_start(uv_##name##_t* handle, uv_##name##_cb cb) { \ uv_loop_t* loop = handle->loop; \ uv_##name##_t* old_head; \ \ assert(handle->type == UV_##NAME); \ \ if (uv__is_active(handle)) \ return 0; \ \ if (cb == NULL) \ return UV_EINVAL; \ \ old_head = loop->name##_handles; \ \ handle->name##_next = old_head; \ handle->name##_prev = NULL; \ \ if (old_head) { \ old_head->name##_prev = handle; \ } \ \ loop->name##_handles = handle; \ \ handle->name##_cb = cb; \ uv__handle_start(handle); \ \ return 0; \ } \ \ \ int uv_##name##_stop(uv_##name##_t* handle) { \ uv_loop_t* loop = handle->loop; \ \ assert(handle->type == UV_##NAME); \ \ if (!uv__is_active(handle)) \ return 0; \ \ /* Update loop head if needed */ \ if (loop->name##_handles == handle) { \ loop->name##_handles = handle->name##_next; \ } \ \ /* Update the iterator-next pointer of needed */ \ if (loop->next_##name##_handle == handle) { \ loop->next_##name##_handle = handle->name##_next; \ } \ \ if (handle->name##_prev) { \ handle->name##_prev->name##_next = handle->name##_next; \ } \ if (handle->name##_next) { \ handle->name##_next->name##_prev = handle->name##_prev; \ } \ \ uv__handle_stop(handle); \ \ return 0; \ } \ \ \ void uv_##name##_invoke(uv_loop_t* loop) { \ uv_##name##_t* handle; \ \ (loop)->next_##name##_handle = (loop)->name##_handles; \ \ while ((loop)->next_##name##_handle != NULL) { \ handle = (loop)->next_##name##_handle; \ (loop)->next_##name##_handle = handle->name##_next; \ \ handle->name##_cb(handle); \ } \ } UV_LOOP_WATCHER_DEFINE(prepare, PREPARE) UV_LOOP_WATCHER_DEFINE(check, CHECK) UV_LOOP_WATCHER_DEFINE(idle, IDLE) ================================================ FILE: external/libuv/src/win/pipe.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include #include #include "handle-inl.h" #include "internal.h" #include "req-inl.h" #include "stream-inl.h" #include "uv-common.h" #include "uv.h" #include #include /* A zero-size buffer for use by uv_pipe_read */ static char uv_zero_[] = ""; /* Null uv_buf_t */ static const uv_buf_t uv_null_buf_ = { 0, NULL }; /* The timeout that the pipe will wait for the remote end to write data when * the local ends wants to shut it down. */ static const int64_t eof_timeout = 50; /* ms */ static const int default_pending_pipe_instances = 4; /* Pipe prefix */ static char pipe_prefix[] = "\\\\?\\pipe"; static const int pipe_prefix_len = sizeof(pipe_prefix) - 1; /* IPC incoming xfer queue item. */ typedef struct { uv__ipc_socket_xfer_type_t xfer_type; uv__ipc_socket_xfer_info_t xfer_info; QUEUE member; } uv__ipc_xfer_queue_item_t; /* IPC frame header flags. */ /* clang-format off */ enum { UV__IPC_FRAME_HAS_DATA = 0x01, UV__IPC_FRAME_HAS_SOCKET_XFER = 0x02, UV__IPC_FRAME_XFER_IS_TCP_CONNECTION = 0x04, /* These are combinations of the flags above. */ UV__IPC_FRAME_XFER_FLAGS = 0x06, UV__IPC_FRAME_VALID_FLAGS = 0x07 }; /* clang-format on */ /* IPC frame header. */ typedef struct { uint32_t flags; uint32_t reserved1; /* Ignored. */ uint32_t data_length; /* Must be zero if there is no data. */ uint32_t reserved2; /* Must be zero. */ } uv__ipc_frame_header_t; /* To implement the IPC protocol correctly, these structures must have exactly * the right size. */ STATIC_ASSERT(sizeof(uv__ipc_frame_header_t) == 16); STATIC_ASSERT(sizeof(uv__ipc_socket_xfer_info_t) == 632); /* Coalesced write request. */ typedef struct { uv_write_t req; /* Internal heap-allocated write request. */ uv_write_t* user_req; /* Pointer to user-specified uv_write_t. */ } uv__coalesced_write_t; static void eof_timer_init(uv_pipe_t* pipe); static void eof_timer_start(uv_pipe_t* pipe); static void eof_timer_stop(uv_pipe_t* pipe); static void eof_timer_cb(uv_timer_t* timer); static void eof_timer_destroy(uv_pipe_t* pipe); static void eof_timer_close_cb(uv_handle_t* handle); static void uv_unique_pipe_name(char* ptr, char* name, size_t size) { snprintf(name, size, "\\\\?\\pipe\\uv\\%p-%lu", ptr, GetCurrentProcessId()); } int uv_pipe_init(uv_loop_t* loop, uv_pipe_t* handle, int ipc) { uv_stream_init(loop, (uv_stream_t*)handle, UV_NAMED_PIPE); handle->reqs_pending = 0; handle->handle = INVALID_HANDLE_VALUE; handle->name = NULL; handle->pipe.conn.ipc_remote_pid = 0; handle->pipe.conn.ipc_data_frame.payload_remaining = 0; QUEUE_INIT(&handle->pipe.conn.ipc_xfer_queue); handle->pipe.conn.ipc_xfer_queue_length = 0; handle->ipc = ipc; handle->pipe.conn.non_overlapped_writes_tail = NULL; return 0; } static void uv_pipe_connection_init(uv_pipe_t* handle) { uv_connection_init((uv_stream_t*) handle); handle->read_req.data = handle; handle->pipe.conn.eof_timer = NULL; assert(!(handle->flags & UV_HANDLE_PIPESERVER)); if (handle->flags & UV_HANDLE_NON_OVERLAPPED_PIPE) { handle->pipe.conn.readfile_thread_handle = NULL; InitializeCriticalSection(&handle->pipe.conn.readfile_thread_lock); } } static HANDLE open_named_pipe(const WCHAR* name, DWORD* duplex_flags) { HANDLE pipeHandle; /* * Assume that we have a duplex pipe first, so attempt to * connect with GENERIC_READ | GENERIC_WRITE. */ pipeHandle = CreateFileW(name, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (pipeHandle != INVALID_HANDLE_VALUE) { *duplex_flags = UV_HANDLE_READABLE | UV_HANDLE_WRITABLE; return pipeHandle; } /* * If the pipe is not duplex CreateFileW fails with * ERROR_ACCESS_DENIED. In that case try to connect * as a read-only or write-only. */ if (GetLastError() == ERROR_ACCESS_DENIED) { pipeHandle = CreateFileW(name, GENERIC_READ | FILE_WRITE_ATTRIBUTES, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (pipeHandle != INVALID_HANDLE_VALUE) { *duplex_flags = UV_HANDLE_READABLE; return pipeHandle; } } if (GetLastError() == ERROR_ACCESS_DENIED) { pipeHandle = CreateFileW(name, GENERIC_WRITE | FILE_READ_ATTRIBUTES, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (pipeHandle != INVALID_HANDLE_VALUE) { *duplex_flags = UV_HANDLE_WRITABLE; return pipeHandle; } } return INVALID_HANDLE_VALUE; } static void close_pipe(uv_pipe_t* pipe) { assert(pipe->u.fd == -1 || pipe->u.fd > 2); if (pipe->u.fd == -1) CloseHandle(pipe->handle); else close(pipe->u.fd); pipe->u.fd = -1; pipe->handle = INVALID_HANDLE_VALUE; } int uv_stdio_pipe_server(uv_loop_t* loop, uv_pipe_t* handle, DWORD access, char* name, size_t nameSize) { HANDLE pipeHandle; int err; char* ptr = (char*)handle; for (;;) { uv_unique_pipe_name(ptr, name, nameSize); pipeHandle = CreateNamedPipeA(name, access | FILE_FLAG_OVERLAPPED | FILE_FLAG_FIRST_PIPE_INSTANCE | WRITE_DAC, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 1, 65536, 65536, 0, NULL); if (pipeHandle != INVALID_HANDLE_VALUE) { /* No name collisions. We're done. */ break; } err = GetLastError(); if (err != ERROR_PIPE_BUSY && err != ERROR_ACCESS_DENIED) { goto error; } /* Pipe name collision. Increment the pointer and try again. */ ptr++; } if (CreateIoCompletionPort(pipeHandle, loop->iocp, (ULONG_PTR)handle, 0) == NULL) { err = GetLastError(); goto error; } uv_pipe_connection_init(handle); handle->handle = pipeHandle; return 0; error: if (pipeHandle != INVALID_HANDLE_VALUE) { CloseHandle(pipeHandle); } return err; } static int uv_set_pipe_handle(uv_loop_t* loop, uv_pipe_t* handle, HANDLE pipeHandle, int fd, DWORD duplex_flags) { NTSTATUS nt_status; IO_STATUS_BLOCK io_status; FILE_MODE_INFORMATION mode_info; DWORD mode = PIPE_READMODE_BYTE | PIPE_WAIT; DWORD current_mode = 0; DWORD err = 0; if (handle->flags & UV_HANDLE_PIPESERVER) return UV_EINVAL; if (handle->handle != INVALID_HANDLE_VALUE) return UV_EBUSY; if (!SetNamedPipeHandleState(pipeHandle, &mode, NULL, NULL)) { err = GetLastError(); if (err == ERROR_ACCESS_DENIED) { /* * SetNamedPipeHandleState can fail if the handle doesn't have either * GENERIC_WRITE or FILE_WRITE_ATTRIBUTES. * But if the handle already has the desired wait and blocking modes * we can continue. */ if (!GetNamedPipeHandleState(pipeHandle, ¤t_mode, NULL, NULL, NULL, NULL, 0)) { return -1; } else if (current_mode & PIPE_NOWAIT) { SetLastError(ERROR_ACCESS_DENIED); return -1; } } else { /* If this returns ERROR_INVALID_PARAMETER we probably opened * something that is not a pipe. */ if (err == ERROR_INVALID_PARAMETER) { SetLastError(WSAENOTSOCK); } return -1; } } /* Check if the pipe was created with FILE_FLAG_OVERLAPPED. */ nt_status = pNtQueryInformationFile(pipeHandle, &io_status, &mode_info, sizeof(mode_info), FileModeInformation); if (nt_status != STATUS_SUCCESS) { return -1; } if (mode_info.Mode & FILE_SYNCHRONOUS_IO_ALERT || mode_info.Mode & FILE_SYNCHRONOUS_IO_NONALERT) { /* Non-overlapped pipe. */ handle->flags |= UV_HANDLE_NON_OVERLAPPED_PIPE; } else { /* Overlapped pipe. Try to associate with IOCP. */ if (CreateIoCompletionPort(pipeHandle, loop->iocp, (ULONG_PTR) handle, 0) == NULL) { handle->flags |= UV_HANDLE_EMULATE_IOCP; } } handle->handle = pipeHandle; handle->u.fd = fd; handle->flags |= duplex_flags; return 0; } static int pipe_alloc_accept(uv_loop_t* loop, uv_pipe_t* handle, uv_pipe_accept_t* req, BOOL firstInstance) { assert(req->pipeHandle == INVALID_HANDLE_VALUE); req->pipeHandle = CreateNamedPipeW(handle->name, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED | WRITE_DAC | (firstInstance ? FILE_FLAG_FIRST_PIPE_INSTANCE : 0), PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, 65536, 65536, 0, NULL); if (req->pipeHandle == INVALID_HANDLE_VALUE) { return 0; } /* Associate it with IOCP so we can get events. */ if (CreateIoCompletionPort(req->pipeHandle, loop->iocp, (ULONG_PTR) handle, 0) == NULL) { uv_fatal_error(GetLastError(), "CreateIoCompletionPort"); } /* Stash a handle in the server object for use from places such as * getsockname and chmod. As we transfer ownership of these to client * objects, we'll allocate new ones here. */ handle->handle = req->pipeHandle; return 1; } static DWORD WINAPI pipe_shutdown_thread_proc(void* parameter) { uv_loop_t* loop; uv_pipe_t* handle; uv_shutdown_t* req; req = (uv_shutdown_t*) parameter; assert(req); handle = (uv_pipe_t*) req->handle; assert(handle); loop = handle->loop; assert(loop); FlushFileBuffers(handle->handle); /* Post completed */ POST_COMPLETION_FOR_REQ(loop, req); return 0; } void uv_pipe_endgame(uv_loop_t* loop, uv_pipe_t* handle) { int err; DWORD result; uv_shutdown_t* req; NTSTATUS nt_status; IO_STATUS_BLOCK io_status; FILE_PIPE_LOCAL_INFORMATION pipe_info; uv__ipc_xfer_queue_item_t* xfer_queue_item; if ((handle->flags & UV_HANDLE_CONNECTION) && handle->stream.conn.shutdown_req != NULL && handle->stream.conn.write_reqs_pending == 0) { req = handle->stream.conn.shutdown_req; /* Clear the shutdown_req field so we don't go here again. */ handle->stream.conn.shutdown_req = NULL; if (handle->flags & UV_HANDLE_CLOSING) { UNREGISTER_HANDLE_REQ(loop, handle, req); /* Already closing. Cancel the shutdown. */ if (req->cb) { req->cb(req, UV_ECANCELED); } DECREASE_PENDING_REQ_COUNT(handle); return; } /* Try to avoid flushing the pipe buffer in the thread pool. */ nt_status = pNtQueryInformationFile(handle->handle, &io_status, &pipe_info, sizeof pipe_info, FilePipeLocalInformation); if (nt_status != STATUS_SUCCESS) { /* Failure */ UNREGISTER_HANDLE_REQ(loop, handle, req); handle->flags |= UV_HANDLE_WRITABLE; /* Questionable */ if (req->cb) { err = pRtlNtStatusToDosError(nt_status); req->cb(req, uv_translate_sys_error(err)); } DECREASE_PENDING_REQ_COUNT(handle); return; } if (pipe_info.OutboundQuota == pipe_info.WriteQuotaAvailable) { /* Short-circuit, no need to call FlushFileBuffers. */ uv_insert_pending_req(loop, (uv_req_t*) req); return; } /* Run FlushFileBuffers in the thread pool. */ result = QueueUserWorkItem(pipe_shutdown_thread_proc, req, WT_EXECUTELONGFUNCTION); if (result) { return; } else { /* Failure. */ UNREGISTER_HANDLE_REQ(loop, handle, req); handle->flags |= UV_HANDLE_WRITABLE; /* Questionable */ if (req->cb) { err = GetLastError(); req->cb(req, uv_translate_sys_error(err)); } DECREASE_PENDING_REQ_COUNT(handle); return; } } if (handle->flags & UV_HANDLE_CLOSING && handle->reqs_pending == 0) { assert(!(handle->flags & UV_HANDLE_CLOSED)); if (handle->flags & UV_HANDLE_CONNECTION) { /* Free pending sockets */ while (!QUEUE_EMPTY(&handle->pipe.conn.ipc_xfer_queue)) { QUEUE* q; SOCKET socket; q = QUEUE_HEAD(&handle->pipe.conn.ipc_xfer_queue); QUEUE_REMOVE(q); xfer_queue_item = QUEUE_DATA(q, uv__ipc_xfer_queue_item_t, member); /* Materialize socket and close it */ socket = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, &xfer_queue_item->xfer_info.socket_info, 0, WSA_FLAG_OVERLAPPED); uv__free(xfer_queue_item); if (socket != INVALID_SOCKET) closesocket(socket); } handle->pipe.conn.ipc_xfer_queue_length = 0; if (handle->flags & UV_HANDLE_EMULATE_IOCP) { if (handle->read_req.wait_handle != INVALID_HANDLE_VALUE) { UnregisterWait(handle->read_req.wait_handle); handle->read_req.wait_handle = INVALID_HANDLE_VALUE; } if (handle->read_req.event_handle != NULL) { CloseHandle(handle->read_req.event_handle); handle->read_req.event_handle = NULL; } } if (handle->flags & UV_HANDLE_NON_OVERLAPPED_PIPE) DeleteCriticalSection(&handle->pipe.conn.readfile_thread_lock); } if (handle->flags & UV_HANDLE_PIPESERVER) { assert(handle->pipe.serv.accept_reqs); uv__free(handle->pipe.serv.accept_reqs); handle->pipe.serv.accept_reqs = NULL; } uv__handle_close(handle); } } void uv_pipe_pending_instances(uv_pipe_t* handle, int count) { if (handle->flags & UV_HANDLE_BOUND) return; handle->pipe.serv.pending_instances = count; handle->flags |= UV_HANDLE_PIPESERVER; } /* Creates a pipe server. */ int uv_pipe_bind(uv_pipe_t* handle, const char* name) { uv_loop_t* loop = handle->loop; int i, err, nameSize; uv_pipe_accept_t* req; if (handle->flags & UV_HANDLE_BOUND) { return UV_EINVAL; } if (!name) { return UV_EINVAL; } if (!(handle->flags & UV_HANDLE_PIPESERVER)) { handle->pipe.serv.pending_instances = default_pending_pipe_instances; } handle->pipe.serv.accept_reqs = (uv_pipe_accept_t*) uv__malloc(sizeof(uv_pipe_accept_t) * handle->pipe.serv.pending_instances); if (!handle->pipe.serv.accept_reqs) { uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); } for (i = 0; i < handle->pipe.serv.pending_instances; i++) { req = &handle->pipe.serv.accept_reqs[i]; UV_REQ_INIT(req, UV_ACCEPT); req->data = handle; req->pipeHandle = INVALID_HANDLE_VALUE; req->next_pending = NULL; } /* Convert name to UTF16. */ nameSize = MultiByteToWideChar(CP_UTF8, 0, name, -1, NULL, 0) * sizeof(WCHAR); handle->name = (WCHAR*)uv__malloc(nameSize); if (!handle->name) { uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); } if (!MultiByteToWideChar(CP_UTF8, 0, name, -1, handle->name, nameSize / sizeof(WCHAR))) { err = GetLastError(); goto error; } /* * Attempt to create the first pipe with FILE_FLAG_FIRST_PIPE_INSTANCE. * If this fails then there's already a pipe server for the given pipe name. */ if (!pipe_alloc_accept(loop, handle, &handle->pipe.serv.accept_reqs[0], TRUE)) { err = GetLastError(); if (err == ERROR_ACCESS_DENIED) { err = WSAEADDRINUSE; /* Translates to UV_EADDRINUSE. */ } else if (err == ERROR_PATH_NOT_FOUND || err == ERROR_INVALID_NAME) { err = WSAEACCES; /* Translates to UV_EACCES. */ } goto error; } handle->pipe.serv.pending_accepts = NULL; handle->flags |= UV_HANDLE_PIPESERVER; handle->flags |= UV_HANDLE_BOUND; return 0; error: if (handle->name) { uv__free(handle->name); handle->name = NULL; } return uv_translate_sys_error(err); } static DWORD WINAPI pipe_connect_thread_proc(void* parameter) { uv_loop_t* loop; uv_pipe_t* handle; uv_connect_t* req; HANDLE pipeHandle = INVALID_HANDLE_VALUE; DWORD duplex_flags; req = (uv_connect_t*) parameter; assert(req); handle = (uv_pipe_t*) req->handle; assert(handle); loop = handle->loop; assert(loop); /* We're here because CreateFile on a pipe returned ERROR_PIPE_BUSY. We wait * for the pipe to become available with WaitNamedPipe. */ while (WaitNamedPipeW(handle->name, 30000)) { /* The pipe is now available, try to connect. */ pipeHandle = open_named_pipe(handle->name, &duplex_flags); if (pipeHandle != INVALID_HANDLE_VALUE) { break; } SwitchToThread(); } if (pipeHandle != INVALID_HANDLE_VALUE && !uv_set_pipe_handle(loop, handle, pipeHandle, -1, duplex_flags)) { SET_REQ_SUCCESS(req); } else { SET_REQ_ERROR(req, GetLastError()); } /* Post completed */ POST_COMPLETION_FOR_REQ(loop, req); return 0; } void uv_pipe_connect(uv_connect_t* req, uv_pipe_t* handle, const char* name, uv_connect_cb cb) { uv_loop_t* loop = handle->loop; int err, nameSize; HANDLE pipeHandle = INVALID_HANDLE_VALUE; DWORD duplex_flags; UV_REQ_INIT(req, UV_CONNECT); req->handle = (uv_stream_t*) handle; req->cb = cb; /* Convert name to UTF16. */ nameSize = MultiByteToWideChar(CP_UTF8, 0, name, -1, NULL, 0) * sizeof(WCHAR); handle->name = (WCHAR*)uv__malloc(nameSize); if (!handle->name) { uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); } if (!MultiByteToWideChar(CP_UTF8, 0, name, -1, handle->name, nameSize / sizeof(WCHAR))) { err = GetLastError(); goto error; } pipeHandle = open_named_pipe(handle->name, &duplex_flags); if (pipeHandle == INVALID_HANDLE_VALUE) { if (GetLastError() == ERROR_PIPE_BUSY) { /* Wait for the server to make a pipe instance available. */ if (!QueueUserWorkItem(&pipe_connect_thread_proc, req, WT_EXECUTELONGFUNCTION)) { err = GetLastError(); goto error; } REGISTER_HANDLE_REQ(loop, handle, req); handle->reqs_pending++; return; } err = GetLastError(); goto error; } assert(pipeHandle != INVALID_HANDLE_VALUE); if (uv_set_pipe_handle(loop, (uv_pipe_t*) req->handle, pipeHandle, -1, duplex_flags)) { err = GetLastError(); goto error; } SET_REQ_SUCCESS(req); uv_insert_pending_req(loop, (uv_req_t*) req); handle->reqs_pending++; REGISTER_HANDLE_REQ(loop, handle, req); return; error: if (handle->name) { uv__free(handle->name); handle->name = NULL; } if (pipeHandle != INVALID_HANDLE_VALUE) { CloseHandle(pipeHandle); } /* Make this req pending reporting an error. */ SET_REQ_ERROR(req, err); uv_insert_pending_req(loop, (uv_req_t*) req); handle->reqs_pending++; REGISTER_HANDLE_REQ(loop, handle, req); return; } void uv__pipe_interrupt_read(uv_pipe_t* handle) { BOOL r; if (!(handle->flags & UV_HANDLE_READ_PENDING)) return; /* No pending reads. */ if (handle->flags & UV_HANDLE_CANCELLATION_PENDING) return; /* Already cancelled. */ if (handle->handle == INVALID_HANDLE_VALUE) return; /* Pipe handle closed. */ if (!(handle->flags & UV_HANDLE_NON_OVERLAPPED_PIPE)) { /* Cancel asynchronous read. */ r = CancelIoEx(handle->handle, &handle->read_req.u.io.overlapped); assert(r || GetLastError() == ERROR_NOT_FOUND); } else { /* Cancel synchronous read (which is happening in the thread pool). */ HANDLE thread; volatile HANDLE* thread_ptr = &handle->pipe.conn.readfile_thread_handle; EnterCriticalSection(&handle->pipe.conn.readfile_thread_lock); thread = *thread_ptr; if (thread == NULL) { /* The thread pool thread has not yet reached the point of blocking, we * can pre-empt it by setting thread_handle to INVALID_HANDLE_VALUE. */ *thread_ptr = INVALID_HANDLE_VALUE; } else { /* Spin until the thread has acknowledged (by setting the thread to * INVALID_HANDLE_VALUE) that it is past the point of blocking. */ while (thread != INVALID_HANDLE_VALUE) { r = CancelSynchronousIo(thread); assert(r || GetLastError() == ERROR_NOT_FOUND); SwitchToThread(); /* Yield thread. */ thread = *thread_ptr; } } LeaveCriticalSection(&handle->pipe.conn.readfile_thread_lock); } /* Set flag to indicate that read has been cancelled. */ handle->flags |= UV_HANDLE_CANCELLATION_PENDING; } void uv__pipe_read_stop(uv_pipe_t* handle) { handle->flags &= ~UV_HANDLE_READING; DECREASE_ACTIVE_COUNT(handle->loop, handle); uv__pipe_interrupt_read(handle); } /* Cleans up uv_pipe_t (server or connection) and all resources associated with * it. */ void uv_pipe_cleanup(uv_loop_t* loop, uv_pipe_t* handle) { int i; HANDLE pipeHandle; uv__pipe_interrupt_read(handle); if (handle->name) { uv__free(handle->name); handle->name = NULL; } if (handle->flags & UV_HANDLE_PIPESERVER) { for (i = 0; i < handle->pipe.serv.pending_instances; i++) { pipeHandle = handle->pipe.serv.accept_reqs[i].pipeHandle; if (pipeHandle != INVALID_HANDLE_VALUE) { CloseHandle(pipeHandle); handle->pipe.serv.accept_reqs[i].pipeHandle = INVALID_HANDLE_VALUE; } } handle->handle = INVALID_HANDLE_VALUE; } if (handle->flags & UV_HANDLE_CONNECTION) { handle->flags &= ~UV_HANDLE_WRITABLE; eof_timer_destroy(handle); } if ((handle->flags & UV_HANDLE_CONNECTION) && handle->handle != INVALID_HANDLE_VALUE) close_pipe(handle); } void uv_pipe_close(uv_loop_t* loop, uv_pipe_t* handle) { if (handle->flags & UV_HANDLE_READING) { handle->flags &= ~UV_HANDLE_READING; DECREASE_ACTIVE_COUNT(loop, handle); } if (handle->flags & UV_HANDLE_LISTENING) { handle->flags &= ~UV_HANDLE_LISTENING; DECREASE_ACTIVE_COUNT(loop, handle); } uv_pipe_cleanup(loop, handle); if (handle->reqs_pending == 0) { uv_want_endgame(loop, (uv_handle_t*) handle); } handle->flags &= ~(UV_HANDLE_READABLE | UV_HANDLE_WRITABLE); uv__handle_closing(handle); } static void uv_pipe_queue_accept(uv_loop_t* loop, uv_pipe_t* handle, uv_pipe_accept_t* req, BOOL firstInstance) { assert(handle->flags & UV_HANDLE_LISTENING); if (!firstInstance && !pipe_alloc_accept(loop, handle, req, FALSE)) { SET_REQ_ERROR(req, GetLastError()); uv_insert_pending_req(loop, (uv_req_t*) req); handle->reqs_pending++; return; } assert(req->pipeHandle != INVALID_HANDLE_VALUE); /* Prepare the overlapped structure. */ memset(&(req->u.io.overlapped), 0, sizeof(req->u.io.overlapped)); if (!ConnectNamedPipe(req->pipeHandle, &req->u.io.overlapped) && GetLastError() != ERROR_IO_PENDING) { if (GetLastError() == ERROR_PIPE_CONNECTED) { SET_REQ_SUCCESS(req); } else { CloseHandle(req->pipeHandle); req->pipeHandle = INVALID_HANDLE_VALUE; /* Make this req pending reporting an error. */ SET_REQ_ERROR(req, GetLastError()); } uv_insert_pending_req(loop, (uv_req_t*) req); handle->reqs_pending++; return; } /* Wait for completion via IOCP */ handle->reqs_pending++; } int uv_pipe_accept(uv_pipe_t* server, uv_stream_t* client) { uv_loop_t* loop = server->loop; uv_pipe_t* pipe_client; uv_pipe_accept_t* req; QUEUE* q; uv__ipc_xfer_queue_item_t* item; int err; if (server->ipc) { if (QUEUE_EMPTY(&server->pipe.conn.ipc_xfer_queue)) { /* No valid pending sockets. */ return WSAEWOULDBLOCK; } q = QUEUE_HEAD(&server->pipe.conn.ipc_xfer_queue); QUEUE_REMOVE(q); server->pipe.conn.ipc_xfer_queue_length--; item = QUEUE_DATA(q, uv__ipc_xfer_queue_item_t, member); err = uv__tcp_xfer_import( (uv_tcp_t*) client, item->xfer_type, &item->xfer_info); if (err != 0) return err; uv__free(item); } else { pipe_client = (uv_pipe_t*) client; /* Find a connection instance that has been connected, but not yet * accepted. */ req = server->pipe.serv.pending_accepts; if (!req) { /* No valid connections found, so we error out. */ return WSAEWOULDBLOCK; } /* Initialize the client handle and copy the pipeHandle to the client */ uv_pipe_connection_init(pipe_client); pipe_client->handle = req->pipeHandle; pipe_client->flags |= UV_HANDLE_READABLE | UV_HANDLE_WRITABLE; /* Prepare the req to pick up a new connection */ server->pipe.serv.pending_accepts = req->next_pending; req->next_pending = NULL; req->pipeHandle = INVALID_HANDLE_VALUE; server->handle = INVALID_HANDLE_VALUE; if (!(server->flags & UV_HANDLE_CLOSING)) { uv_pipe_queue_accept(loop, server, req, FALSE); } } return 0; } /* Starts listening for connections for the given pipe. */ int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb) { uv_loop_t* loop = handle->loop; int i; if (handle->flags & UV_HANDLE_LISTENING) { handle->stream.serv.connection_cb = cb; } if (!(handle->flags & UV_HANDLE_BOUND)) { return WSAEINVAL; } if (handle->flags & UV_HANDLE_READING) { return WSAEISCONN; } if (!(handle->flags & UV_HANDLE_PIPESERVER)) { return ERROR_NOT_SUPPORTED; } if (handle->ipc) { return WSAEINVAL; } handle->flags |= UV_HANDLE_LISTENING; INCREASE_ACTIVE_COUNT(loop, handle); handle->stream.serv.connection_cb = cb; /* First pipe handle should have already been created in uv_pipe_bind */ assert(handle->pipe.serv.accept_reqs[0].pipeHandle != INVALID_HANDLE_VALUE); for (i = 0; i < handle->pipe.serv.pending_instances; i++) { uv_pipe_queue_accept(loop, handle, &handle->pipe.serv.accept_reqs[i], i == 0); } return 0; } static DWORD WINAPI uv_pipe_zero_readfile_thread_proc(void* arg) { uv_read_t* req = (uv_read_t*) arg; uv_pipe_t* handle = (uv_pipe_t*) req->data; uv_loop_t* loop = handle->loop; volatile HANDLE* thread_ptr = &handle->pipe.conn.readfile_thread_handle; CRITICAL_SECTION* lock = &handle->pipe.conn.readfile_thread_lock; HANDLE thread; DWORD bytes; DWORD err; assert(req->type == UV_READ); assert(handle->type == UV_NAMED_PIPE); err = 0; /* Create a handle to the current thread. */ if (!DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(), &thread, 0, FALSE, DUPLICATE_SAME_ACCESS)) { err = GetLastError(); goto out1; } /* The lock needs to be held when thread handle is modified. */ EnterCriticalSection(lock); if (*thread_ptr == INVALID_HANDLE_VALUE) { /* uv__pipe_interrupt_read() cancelled reading before we got here. */ err = ERROR_OPERATION_ABORTED; } else { /* Let main thread know which worker thread is doing the blocking read. */ assert(*thread_ptr == NULL); *thread_ptr = thread; } LeaveCriticalSection(lock); if (err) goto out2; /* Block the thread until data is available on the pipe, or the read is * cancelled. */ if (!ReadFile(handle->handle, &uv_zero_, 0, &bytes, NULL)) err = GetLastError(); /* Let the main thread know the worker is past the point of blocking. */ assert(thread == *thread_ptr); *thread_ptr = INVALID_HANDLE_VALUE; /* Briefly acquire the mutex. Since the main thread holds the lock while it * is spinning trying to cancel this thread's I/O, we will block here until * it stops doing that. */ EnterCriticalSection(lock); LeaveCriticalSection(lock); out2: /* Close the handle to the current thread. */ CloseHandle(thread); out1: /* Set request status and post a completion record to the IOCP. */ if (err) SET_REQ_ERROR(req, err); else SET_REQ_SUCCESS(req); POST_COMPLETION_FOR_REQ(loop, req); return 0; } static DWORD WINAPI uv_pipe_writefile_thread_proc(void* parameter) { int result; DWORD bytes; uv_write_t* req = (uv_write_t*) parameter; uv_pipe_t* handle = (uv_pipe_t*) req->handle; uv_loop_t* loop = handle->loop; assert(req != NULL); assert(req->type == UV_WRITE); assert(handle->type == UV_NAMED_PIPE); assert(req->write_buffer.base); result = WriteFile(handle->handle, req->write_buffer.base, req->write_buffer.len, &bytes, NULL); if (!result) { SET_REQ_ERROR(req, GetLastError()); } POST_COMPLETION_FOR_REQ(loop, req); return 0; } static void CALLBACK post_completion_read_wait(void* context, BOOLEAN timed_out) { uv_read_t* req; uv_tcp_t* handle; req = (uv_read_t*) context; assert(req != NULL); handle = (uv_tcp_t*)req->data; assert(handle != NULL); assert(!timed_out); if (!PostQueuedCompletionStatus(handle->loop->iocp, req->u.io.overlapped.InternalHigh, 0, &req->u.io.overlapped)) { uv_fatal_error(GetLastError(), "PostQueuedCompletionStatus"); } } static void CALLBACK post_completion_write_wait(void* context, BOOLEAN timed_out) { uv_write_t* req; uv_tcp_t* handle; req = (uv_write_t*) context; assert(req != NULL); handle = (uv_tcp_t*)req->handle; assert(handle != NULL); assert(!timed_out); if (!PostQueuedCompletionStatus(handle->loop->iocp, req->u.io.overlapped.InternalHigh, 0, &req->u.io.overlapped)) { uv_fatal_error(GetLastError(), "PostQueuedCompletionStatus"); } } static void uv_pipe_queue_read(uv_loop_t* loop, uv_pipe_t* handle) { uv_read_t* req; int result; assert(handle->flags & UV_HANDLE_READING); assert(!(handle->flags & UV_HANDLE_READ_PENDING)); assert(handle->handle != INVALID_HANDLE_VALUE); req = &handle->read_req; if (handle->flags & UV_HANDLE_NON_OVERLAPPED_PIPE) { handle->pipe.conn.readfile_thread_handle = NULL; /* Reset cancellation. */ if (!QueueUserWorkItem(&uv_pipe_zero_readfile_thread_proc, req, WT_EXECUTELONGFUNCTION)) { /* Make this req pending reporting an error. */ SET_REQ_ERROR(req, GetLastError()); goto error; } } else { memset(&req->u.io.overlapped, 0, sizeof(req->u.io.overlapped)); if (handle->flags & UV_HANDLE_EMULATE_IOCP) { assert(req->event_handle != NULL); req->u.io.overlapped.hEvent = (HANDLE) ((uintptr_t) req->event_handle | 1); } /* Do 0-read */ result = ReadFile(handle->handle, &uv_zero_, 0, NULL, &req->u.io.overlapped); if (!result && GetLastError() != ERROR_IO_PENDING) { /* Make this req pending reporting an error. */ SET_REQ_ERROR(req, GetLastError()); goto error; } if (handle->flags & UV_HANDLE_EMULATE_IOCP) { if (req->wait_handle == INVALID_HANDLE_VALUE) { if (!RegisterWaitForSingleObject(&req->wait_handle, req->event_handle, post_completion_read_wait, (void*) req, INFINITE, WT_EXECUTEINWAITTHREAD)) { SET_REQ_ERROR(req, GetLastError()); goto error; } } } } /* Start the eof timer if there is one */ eof_timer_start(handle); handle->flags |= UV_HANDLE_READ_PENDING; handle->reqs_pending++; return; error: uv_insert_pending_req(loop, (uv_req_t*)req); handle->flags |= UV_HANDLE_READ_PENDING; handle->reqs_pending++; } int uv_pipe_read_start(uv_pipe_t* handle, uv_alloc_cb alloc_cb, uv_read_cb read_cb) { uv_loop_t* loop = handle->loop; handle->flags |= UV_HANDLE_READING; INCREASE_ACTIVE_COUNT(loop, handle); handle->read_cb = read_cb; handle->alloc_cb = alloc_cb; /* If reading was stopped and then started again, there could still be a read * request pending. */ if (!(handle->flags & UV_HANDLE_READ_PENDING)) { if (handle->flags & UV_HANDLE_EMULATE_IOCP && handle->read_req.event_handle == NULL) { handle->read_req.event_handle = CreateEvent(NULL, 0, 0, NULL); if (handle->read_req.event_handle == NULL) { uv_fatal_error(GetLastError(), "CreateEvent"); } } uv_pipe_queue_read(loop, handle); } return 0; } static void uv_insert_non_overlapped_write_req(uv_pipe_t* handle, uv_write_t* req) { req->next_req = NULL; if (handle->pipe.conn.non_overlapped_writes_tail) { req->next_req = handle->pipe.conn.non_overlapped_writes_tail->next_req; handle->pipe.conn.non_overlapped_writes_tail->next_req = (uv_req_t*)req; handle->pipe.conn.non_overlapped_writes_tail = req; } else { req->next_req = (uv_req_t*)req; handle->pipe.conn.non_overlapped_writes_tail = req; } } static uv_write_t* uv_remove_non_overlapped_write_req(uv_pipe_t* handle) { uv_write_t* req; if (handle->pipe.conn.non_overlapped_writes_tail) { req = (uv_write_t*)handle->pipe.conn.non_overlapped_writes_tail->next_req; if (req == handle->pipe.conn.non_overlapped_writes_tail) { handle->pipe.conn.non_overlapped_writes_tail = NULL; } else { handle->pipe.conn.non_overlapped_writes_tail->next_req = req->next_req; } return req; } else { /* queue empty */ return NULL; } } static void uv_queue_non_overlapped_write(uv_pipe_t* handle) { uv_write_t* req = uv_remove_non_overlapped_write_req(handle); if (req) { if (!QueueUserWorkItem(&uv_pipe_writefile_thread_proc, req, WT_EXECUTELONGFUNCTION)) { uv_fatal_error(GetLastError(), "QueueUserWorkItem"); } } } static int uv__build_coalesced_write_req(uv_write_t* user_req, const uv_buf_t bufs[], size_t nbufs, uv_write_t** req_out, uv_buf_t* write_buf_out) { /* Pack into a single heap-allocated buffer: * (a) a uv_write_t structure where libuv stores the actual state. * (b) a pointer to the original uv_write_t. * (c) data from all `bufs` entries. */ char* heap_buffer; size_t heap_buffer_length, heap_buffer_offset; uv__coalesced_write_t* coalesced_write_req; /* (a) + (b) */ char* data_start; /* (c) */ size_t data_length; unsigned int i; /* Compute combined size of all combined buffers from `bufs`. */ data_length = 0; for (i = 0; i < nbufs; i++) data_length += bufs[i].len; /* The total combined size of data buffers should not exceed UINT32_MAX, * because WriteFile() won't accept buffers larger than that. */ if (data_length > UINT32_MAX) return WSAENOBUFS; /* Maps to UV_ENOBUFS. */ /* Compute heap buffer size. */ heap_buffer_length = sizeof *coalesced_write_req + /* (a) + (b) */ data_length; /* (c) */ /* Allocate buffer. */ heap_buffer = (char *)uv__malloc(heap_buffer_length); if (heap_buffer == NULL) return ERROR_NOT_ENOUGH_MEMORY; /* Maps to UV_ENOMEM. */ /* Copy uv_write_t information to the buffer. */ coalesced_write_req = (uv__coalesced_write_t*) heap_buffer; coalesced_write_req->req = *user_req; /* copy (a) */ coalesced_write_req->req.coalesced = 1; coalesced_write_req->user_req = user_req; /* copy (b) */ heap_buffer_offset = sizeof *coalesced_write_req; /* offset (a) + (b) */ /* Copy data buffers to the heap buffer. */ data_start = &heap_buffer[heap_buffer_offset]; for (i = 0; i < nbufs; i++) { memcpy(&heap_buffer[heap_buffer_offset], bufs[i].base, bufs[i].len); /* copy (c) */ heap_buffer_offset += bufs[i].len; /* offset (c) */ } assert(heap_buffer_offset == heap_buffer_length); /* Set out arguments and return. */ *req_out = &coalesced_write_req->req; *write_buf_out = uv_buf_init(data_start, (unsigned int) data_length); return 0; } static int uv__pipe_write_data(uv_loop_t* loop, uv_write_t* req, uv_pipe_t* handle, const uv_buf_t bufs[], size_t nbufs, uv_write_cb cb, int copy_always) { int err; int result; uv_buf_t write_buf; assert(handle->handle != INVALID_HANDLE_VALUE); UV_REQ_INIT(req, UV_WRITE); req->handle = (uv_stream_t*) handle; req->send_handle = NULL; req->cb = cb; /* Private fields. */ req->coalesced = 0; req->event_handle = NULL; req->wait_handle = INVALID_HANDLE_VALUE; /* Prepare the overlapped structure. */ memset(&req->u.io.overlapped, 0, sizeof(req->u.io.overlapped)); if (handle->flags & (UV_HANDLE_EMULATE_IOCP | UV_HANDLE_BLOCKING_WRITES)) { req->event_handle = CreateEvent(NULL, 0, 0, NULL); if (req->event_handle == NULL) { uv_fatal_error(GetLastError(), "CreateEvent"); } req->u.io.overlapped.hEvent = (HANDLE) ((uintptr_t) req->event_handle | 1); } req->write_buffer = uv_null_buf_; if (nbufs == 0) { /* Write empty buffer. */ write_buf = uv_null_buf_; } else if (nbufs == 1 && !copy_always) { /* Write directly from bufs[0]. */ write_buf = bufs[0]; } else { /* Coalesce all `bufs` into one big buffer. This also creates a new * write-request structure that replaces the old one. */ err = uv__build_coalesced_write_req(req, bufs, nbufs, &req, &write_buf); if (err != 0) return err; } if ((handle->flags & (UV_HANDLE_BLOCKING_WRITES | UV_HANDLE_NON_OVERLAPPED_PIPE)) == (UV_HANDLE_BLOCKING_WRITES | UV_HANDLE_NON_OVERLAPPED_PIPE)) { DWORD bytes; result = WriteFile(handle->handle, write_buf.base, write_buf.len, &bytes, NULL); if (!result) { err = GetLastError(); return err; } else { /* Request completed immediately. */ req->u.io.queued_bytes = 0; } REGISTER_HANDLE_REQ(loop, handle, req); handle->reqs_pending++; handle->stream.conn.write_reqs_pending++; POST_COMPLETION_FOR_REQ(loop, req); return 0; } else if (handle->flags & UV_HANDLE_NON_OVERLAPPED_PIPE) { req->write_buffer = write_buf; uv_insert_non_overlapped_write_req(handle, req); if (handle->stream.conn.write_reqs_pending == 0) { uv_queue_non_overlapped_write(handle); } /* Request queued by the kernel. */ req->u.io.queued_bytes = write_buf.len; handle->write_queue_size += req->u.io.queued_bytes; } else if (handle->flags & UV_HANDLE_BLOCKING_WRITES) { /* Using overlapped IO, but wait for completion before returning */ result = WriteFile(handle->handle, write_buf.base, write_buf.len, NULL, &req->u.io.overlapped); if (!result && GetLastError() != ERROR_IO_PENDING) { err = GetLastError(); CloseHandle(req->event_handle); req->event_handle = NULL; return err; } if (result) { /* Request completed immediately. */ req->u.io.queued_bytes = 0; } else { /* Request queued by the kernel. */ req->u.io.queued_bytes = write_buf.len; handle->write_queue_size += req->u.io.queued_bytes; if (WaitForSingleObject(req->event_handle, INFINITE) != WAIT_OBJECT_0) { err = GetLastError(); CloseHandle(req->event_handle); req->event_handle = NULL; return err; } } CloseHandle(req->event_handle); req->event_handle = NULL; REGISTER_HANDLE_REQ(loop, handle, req); handle->reqs_pending++; handle->stream.conn.write_reqs_pending++; return 0; } else { result = WriteFile(handle->handle, write_buf.base, write_buf.len, NULL, &req->u.io.overlapped); if (!result && GetLastError() != ERROR_IO_PENDING) { return GetLastError(); } if (result) { /* Request completed immediately. */ req->u.io.queued_bytes = 0; } else { /* Request queued by the kernel. */ req->u.io.queued_bytes = write_buf.len; handle->write_queue_size += req->u.io.queued_bytes; } if (handle->flags & UV_HANDLE_EMULATE_IOCP) { if (!RegisterWaitForSingleObject(&req->wait_handle, req->event_handle, post_completion_write_wait, (void*) req, INFINITE, WT_EXECUTEINWAITTHREAD)) { return GetLastError(); } } } REGISTER_HANDLE_REQ(loop, handle, req); handle->reqs_pending++; handle->stream.conn.write_reqs_pending++; return 0; } static DWORD uv__pipe_get_ipc_remote_pid(uv_pipe_t* handle) { DWORD* pid = &handle->pipe.conn.ipc_remote_pid; /* If the both ends of the IPC pipe are owned by the same process, * the remote end pid may not yet be set. If so, do it here. * TODO: this is weird; it'd probably better to use a handshake. */ if (*pid == 0) *pid = GetCurrentProcessId(); return *pid; } int uv__pipe_write_ipc(uv_loop_t* loop, uv_write_t* req, uv_pipe_t* handle, const uv_buf_t data_bufs[], size_t data_buf_count, uv_stream_t* send_handle, uv_write_cb cb) { uv_buf_t stack_bufs[6]; uv_buf_t* bufs; size_t buf_count, buf_index; uv__ipc_frame_header_t frame_header; uv__ipc_socket_xfer_type_t xfer_type = UV__IPC_SOCKET_XFER_NONE; uv__ipc_socket_xfer_info_t xfer_info; uint64_t data_length; size_t i; int err; /* Compute the combined size of data buffers. */ data_length = 0; for (i = 0; i < data_buf_count; i++) data_length += data_bufs[i].len; if (data_length > UINT32_MAX) return WSAENOBUFS; /* Maps to UV_ENOBUFS. */ /* Prepare the frame's socket xfer payload. */ if (send_handle != NULL) { uv_tcp_t* send_tcp_handle = (uv_tcp_t*) send_handle; /* Verify that `send_handle` it is indeed a tcp handle. */ if (send_tcp_handle->type != UV_TCP) return ERROR_NOT_SUPPORTED; /* Export the tcp handle. */ err = uv__tcp_xfer_export(send_tcp_handle, uv__pipe_get_ipc_remote_pid(handle), &xfer_type, &xfer_info); if (err != 0) return err; } /* Compute the number of uv_buf_t's required. */ buf_count = 1 + data_buf_count; /* Frame header and data buffers. */ if (send_handle != NULL) buf_count += 1; /* One extra for the socket xfer information. */ /* Use the on-stack buffer array if it is big enough; otherwise allocate * space for it on the heap. */ if (buf_count < ARRAY_SIZE(stack_bufs)) { /* Use on-stack buffer array. */ bufs = stack_bufs; } else { /* Use heap-allocated buffer array. */ bufs = (uv_buf_t *)uv__calloc(buf_count, sizeof(uv_buf_t)); if (bufs == NULL) return ERROR_NOT_ENOUGH_MEMORY; /* Maps to UV_ENOMEM. */ } buf_index = 0; /* Initialize frame header and add it to the buffers list. */ memset(&frame_header, 0, sizeof frame_header); bufs[buf_index++] = uv_buf_init((char*) &frame_header, sizeof frame_header); if (send_handle != NULL) { /* Add frame header flags. */ switch (xfer_type) { case UV__IPC_SOCKET_XFER_TCP_CONNECTION: frame_header.flags |= UV__IPC_FRAME_HAS_SOCKET_XFER | UV__IPC_FRAME_XFER_IS_TCP_CONNECTION; break; case UV__IPC_SOCKET_XFER_TCP_SERVER: frame_header.flags |= UV__IPC_FRAME_HAS_SOCKET_XFER; break; default: assert(0); /* Unreachable. */ } /* Add xfer info buffer. */ bufs[buf_index++] = uv_buf_init((char*) &xfer_info, sizeof xfer_info); } if (data_length > 0) { /* Update frame header. */ frame_header.flags |= UV__IPC_FRAME_HAS_DATA; frame_header.data_length = (uint32_t) data_length; /* Add data buffers to buffers list. */ for (i = 0; i < data_buf_count; i++) bufs[buf_index++] = data_bufs[i]; } /* Write buffers. We set the `always_copy` flag, so it is not a problem that * some of the written data lives on the stack. */ err = uv__pipe_write_data(loop, req, handle, bufs, buf_count, cb, 1); /* If we had to heap-allocate the bufs array, free it now. */ if (bufs != stack_bufs) { uv__free(bufs); } return err; } int uv__pipe_write(uv_loop_t* loop, uv_write_t* req, uv_pipe_t* handle, const uv_buf_t bufs[], size_t nbufs, uv_stream_t* send_handle, uv_write_cb cb) { if (handle->ipc) { /* IPC pipe write: use framing protocol. */ return uv__pipe_write_ipc(loop, req, handle, bufs, nbufs, send_handle, cb); } else { /* Non-IPC pipe write: put data on the wire directly. */ assert(send_handle == NULL); return uv__pipe_write_data(loop, req, handle, bufs, nbufs, cb, 0); } } static void uv_pipe_read_eof(uv_loop_t* loop, uv_pipe_t* handle, uv_buf_t buf) { /* If there is an eof timer running, we don't need it any more, so discard * it. */ eof_timer_destroy(handle); handle->flags &= ~UV_HANDLE_READABLE; uv_read_stop((uv_stream_t*) handle); handle->read_cb((uv_stream_t*) handle, UV_EOF, &buf); } static void uv_pipe_read_error(uv_loop_t* loop, uv_pipe_t* handle, int error, uv_buf_t buf) { /* If there is an eof timer running, we don't need it any more, so discard * it. */ eof_timer_destroy(handle); uv_read_stop((uv_stream_t*) handle); handle->read_cb((uv_stream_t*)handle, uv_translate_sys_error(error), &buf); } static void uv_pipe_read_error_or_eof(uv_loop_t* loop, uv_pipe_t* handle, int error, uv_buf_t buf) { if (error == ERROR_BROKEN_PIPE) { uv_pipe_read_eof(loop, handle, buf); } else { uv_pipe_read_error(loop, handle, error, buf); } } static void uv__pipe_queue_ipc_xfer_info( uv_pipe_t* handle, uv__ipc_socket_xfer_type_t xfer_type, uv__ipc_socket_xfer_info_t* xfer_info) { uv__ipc_xfer_queue_item_t* item; item = (uv__ipc_xfer_queue_item_t*) uv__malloc(sizeof(*item)); if (item == NULL) uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); item->xfer_type = xfer_type; item->xfer_info = *xfer_info; QUEUE_INSERT_TAIL(&handle->pipe.conn.ipc_xfer_queue, &item->member); handle->pipe.conn.ipc_xfer_queue_length++; } /* Read an exact number of bytes from a pipe. If an error or end-of-file is * encountered before the requested number of bytes are read, an error is * returned. */ static int uv__pipe_read_exactly(HANDLE h, void* buffer, DWORD count) { DWORD bytes_read, bytes_read_now; bytes_read = 0; while (bytes_read < count) { if (!ReadFile(h, (char*) buffer + bytes_read, count - bytes_read, &bytes_read_now, NULL)) { return GetLastError(); } bytes_read += bytes_read_now; } assert(bytes_read == count); return 0; } static DWORD uv__pipe_read_data(uv_loop_t* loop, uv_pipe_t* handle, DWORD suggested_bytes, DWORD max_bytes) { DWORD bytes_read; uv_buf_t buf; /* Ask the user for a buffer to read data into. */ buf = uv_buf_init(NULL, 0); handle->alloc_cb((uv_handle_t*) handle, suggested_bytes, &buf); if (buf.base == NULL || buf.len == 0) { handle->read_cb((uv_stream_t*) handle, UV_ENOBUFS, &buf); return 0; /* Break out of read loop. */ } /* Ensure we read at most the smaller of: * (a) the length of the user-allocated buffer. * (b) the maximum data length as specified by the `max_bytes` argument. */ if (max_bytes > buf.len) max_bytes = buf.len; /* Read into the user buffer. */ if (!ReadFile(handle->handle, buf.base, max_bytes, &bytes_read, NULL)) { uv_pipe_read_error_or_eof(loop, handle, GetLastError(), buf); return 0; /* Break out of read loop. */ } /* Call the read callback. */ handle->read_cb((uv_stream_t*) handle, bytes_read, &buf); return bytes_read; } static DWORD uv__pipe_read_ipc(uv_loop_t* loop, uv_pipe_t* handle) { uint32_t* data_remaining = &handle->pipe.conn.ipc_data_frame.payload_remaining; int err; if (*data_remaining > 0) { /* Read frame data payload. */ DWORD bytes_read = uv__pipe_read_data(loop, handle, *data_remaining, *data_remaining); *data_remaining -= bytes_read; return bytes_read; } else { /* Start of a new IPC frame. */ uv__ipc_frame_header_t frame_header; uint32_t xfer_flags; uv__ipc_socket_xfer_type_t xfer_type; uv__ipc_socket_xfer_info_t xfer_info; /* Read the IPC frame header. */ err = uv__pipe_read_exactly( handle->handle, &frame_header, sizeof frame_header); if (err) goto error; /* Validate that flags are valid. */ if ((frame_header.flags & ~UV__IPC_FRAME_VALID_FLAGS) != 0) goto invalid; /* Validate that reserved2 is zero. */ if (frame_header.reserved2 != 0) goto invalid; /* Parse xfer flags. */ xfer_flags = frame_header.flags & UV__IPC_FRAME_XFER_FLAGS; if (xfer_flags & UV__IPC_FRAME_HAS_SOCKET_XFER) { /* Socket coming -- determine the type. */ xfer_type = xfer_flags & UV__IPC_FRAME_XFER_IS_TCP_CONNECTION ? UV__IPC_SOCKET_XFER_TCP_CONNECTION : UV__IPC_SOCKET_XFER_TCP_SERVER; } else if (xfer_flags == 0) { /* No socket. */ xfer_type = UV__IPC_SOCKET_XFER_NONE; } else { /* Invalid flags. */ goto invalid; } /* Parse data frame information. */ if (frame_header.flags & UV__IPC_FRAME_HAS_DATA) { *data_remaining = frame_header.data_length; } else if (frame_header.data_length != 0) { /* Data length greater than zero but data flag not set -- invalid. */ goto invalid; } /* If no socket xfer info follows, return here. Data will be read in a * subsequent invocation of uv__pipe_read_ipc(). */ if (xfer_type == UV__IPC_SOCKET_XFER_NONE) return sizeof frame_header; /* Number of bytes read. */ /* Read transferred socket information. */ err = uv__pipe_read_exactly(handle->handle, &xfer_info, sizeof xfer_info); if (err) goto error; /* Store the pending socket info. */ uv__pipe_queue_ipc_xfer_info(handle, xfer_type, &xfer_info); /* Return number of bytes read. */ return sizeof frame_header + sizeof xfer_info; } invalid: /* Invalid frame. */ err = WSAECONNABORTED; /* Maps to UV_ECONNABORTED. */ error: uv_pipe_read_error_or_eof(loop, handle, err, uv_null_buf_); return 0; /* Break out of read loop. */ } void uv_process_pipe_read_req(uv_loop_t* loop, uv_pipe_t* handle, uv_req_t* req) { assert(handle->type == UV_NAMED_PIPE); handle->flags &= ~(UV_HANDLE_READ_PENDING | UV_HANDLE_CANCELLATION_PENDING); DECREASE_PENDING_REQ_COUNT(handle); eof_timer_stop(handle); /* At this point, we're done with bookkeeping. If the user has stopped * reading the pipe in the meantime, there is nothing left to do, since there * is no callback that we can call. */ if (!(handle->flags & UV_HANDLE_READING)) return; if (!REQ_SUCCESS(req)) { /* An error occurred doing the zero-read. */ DWORD err = GET_REQ_ERROR(req); /* If the read was cancelled by uv__pipe_interrupt_read(), the request may * indicate an ERROR_OPERATION_ABORTED error. This error isn't relevant to * the user; we'll start a new zero-read at the end of this function. */ if (err != ERROR_OPERATION_ABORTED) uv_pipe_read_error_or_eof(loop, handle, err, uv_null_buf_); } else { /* The zero-read completed without error, indicating there is data * available in the kernel buffer. */ DWORD avail; /* Get the number of bytes available. */ avail = 0; if (!PeekNamedPipe(handle->handle, NULL, 0, NULL, &avail, NULL)) uv_pipe_read_error_or_eof(loop, handle, GetLastError(), uv_null_buf_); /* Read until we've either read all the bytes available, or the 'reading' * flag is cleared. */ while (avail > 0 && handle->flags & UV_HANDLE_READING) { /* Depending on the type of pipe, read either IPC frames or raw data. */ DWORD bytes_read = handle->ipc ? uv__pipe_read_ipc(loop, handle) : uv__pipe_read_data(loop, handle, avail, (DWORD) -1); /* If no bytes were read, treat this as an indication that an error * occurred, and break out of the read loop. */ if (bytes_read == 0) break; /* It is possible that more bytes were read than we thought were * available. To prevent `avail` from underflowing, break out of the loop * if this is the case. */ if (bytes_read > avail) break; /* Recompute the number of bytes available. */ avail -= bytes_read; } } /* Start another zero-read request if necessary. */ if ((handle->flags & UV_HANDLE_READING) && !(handle->flags & UV_HANDLE_READ_PENDING)) { uv_pipe_queue_read(loop, handle); } } void uv_process_pipe_write_req(uv_loop_t* loop, uv_pipe_t* handle, uv_write_t* req) { int err; assert(handle->type == UV_NAMED_PIPE); assert(handle->write_queue_size >= req->u.io.queued_bytes); handle->write_queue_size -= req->u.io.queued_bytes; UNREGISTER_HANDLE_REQ(loop, handle, req); if (handle->flags & UV_HANDLE_EMULATE_IOCP) { if (req->wait_handle != INVALID_HANDLE_VALUE) { UnregisterWait(req->wait_handle); req->wait_handle = INVALID_HANDLE_VALUE; } if (req->event_handle) { CloseHandle(req->event_handle); req->event_handle = NULL; } } err = GET_REQ_ERROR(req); /* If this was a coalesced write, extract pointer to the user_provided * uv_write_t structure so we can pass the expected pointer to the callback, * then free the heap-allocated write req. */ if (req->coalesced) { uv__coalesced_write_t* coalesced_write = container_of(req, uv__coalesced_write_t, req); req = coalesced_write->user_req; uv__free(coalesced_write); } if (req->cb) { req->cb(req, uv_translate_sys_error(err)); } handle->stream.conn.write_reqs_pending--; if (handle->flags & UV_HANDLE_NON_OVERLAPPED_PIPE && handle->pipe.conn.non_overlapped_writes_tail) { assert(handle->stream.conn.write_reqs_pending > 0); uv_queue_non_overlapped_write(handle); } if (handle->stream.conn.shutdown_req != NULL && handle->stream.conn.write_reqs_pending == 0) { uv_want_endgame(loop, (uv_handle_t*)handle); } DECREASE_PENDING_REQ_COUNT(handle); } void uv_process_pipe_accept_req(uv_loop_t* loop, uv_pipe_t* handle, uv_req_t* raw_req) { uv_pipe_accept_t* req = (uv_pipe_accept_t*) raw_req; assert(handle->type == UV_NAMED_PIPE); if (handle->flags & UV_HANDLE_CLOSING) { /* The req->pipeHandle should be freed already in uv_pipe_cleanup(). */ assert(req->pipeHandle == INVALID_HANDLE_VALUE); DECREASE_PENDING_REQ_COUNT(handle); return; } if (REQ_SUCCESS(req)) { assert(req->pipeHandle != INVALID_HANDLE_VALUE); req->next_pending = handle->pipe.serv.pending_accepts; handle->pipe.serv.pending_accepts = req; if (handle->stream.serv.connection_cb) { handle->stream.serv.connection_cb((uv_stream_t*)handle, 0); } } else { if (req->pipeHandle != INVALID_HANDLE_VALUE) { CloseHandle(req->pipeHandle); req->pipeHandle = INVALID_HANDLE_VALUE; } if (!(handle->flags & UV_HANDLE_CLOSING)) { uv_pipe_queue_accept(loop, handle, req, FALSE); } } DECREASE_PENDING_REQ_COUNT(handle); } void uv_process_pipe_connect_req(uv_loop_t* loop, uv_pipe_t* handle, uv_connect_t* req) { int err; assert(handle->type == UV_NAMED_PIPE); UNREGISTER_HANDLE_REQ(loop, handle, req); if (req->cb) { err = 0; if (REQ_SUCCESS(req)) { uv_pipe_connection_init(handle); } else { err = GET_REQ_ERROR(req); } req->cb(req, uv_translate_sys_error(err)); } DECREASE_PENDING_REQ_COUNT(handle); } void uv_process_pipe_shutdown_req(uv_loop_t* loop, uv_pipe_t* handle, uv_shutdown_t* req) { assert(handle->type == UV_NAMED_PIPE); UNREGISTER_HANDLE_REQ(loop, handle, req); if (handle->flags & UV_HANDLE_READABLE) { /* Initialize and optionally start the eof timer. Only do this if the pipe * is readable and we haven't seen EOF come in ourselves. */ eof_timer_init(handle); /* If reading start the timer right now. Otherwise uv_pipe_queue_read will * start it. */ if (handle->flags & UV_HANDLE_READ_PENDING) { eof_timer_start(handle); } } else { /* This pipe is not readable. We can just close it to let the other end * know that we're done writing. */ close_pipe(handle); } if (req->cb) { req->cb(req, 0); } DECREASE_PENDING_REQ_COUNT(handle); } static void eof_timer_init(uv_pipe_t* pipe) { int r; assert(pipe->pipe.conn.eof_timer == NULL); assert(pipe->flags & UV_HANDLE_CONNECTION); pipe->pipe.conn.eof_timer = (uv_timer_t*) uv__malloc(sizeof *pipe->pipe.conn.eof_timer); r = uv_timer_init(pipe->loop, pipe->pipe.conn.eof_timer); assert(r == 0); /* timers can't fail */ pipe->pipe.conn.eof_timer->data = pipe; uv_unref((uv_handle_t*) pipe->pipe.conn.eof_timer); } static void eof_timer_start(uv_pipe_t* pipe) { assert(pipe->flags & UV_HANDLE_CONNECTION); if (pipe->pipe.conn.eof_timer != NULL) { uv_timer_start(pipe->pipe.conn.eof_timer, eof_timer_cb, eof_timeout, 0); } } static void eof_timer_stop(uv_pipe_t* pipe) { assert(pipe->flags & UV_HANDLE_CONNECTION); if (pipe->pipe.conn.eof_timer != NULL) { uv_timer_stop(pipe->pipe.conn.eof_timer); } } static void eof_timer_cb(uv_timer_t* timer) { uv_pipe_t* pipe = (uv_pipe_t*) timer->data; uv_loop_t* loop = timer->loop; assert(pipe->type == UV_NAMED_PIPE); /* This should always be true, since we start the timer only in * uv_pipe_queue_read after successfully calling ReadFile, or in * uv_process_pipe_shutdown_req if a read is pending, and we always * immediately stop the timer in uv_process_pipe_read_req. */ assert(pipe->flags & UV_HANDLE_READ_PENDING); /* If there are many packets coming off the iocp then the timer callback may * be called before the read request is coming off the queue. Therefore we * check here if the read request has completed but will be processed later. */ if ((pipe->flags & UV_HANDLE_READ_PENDING) && HasOverlappedIoCompleted(&pipe->read_req.u.io.overlapped)) { return; } /* Force both ends off the pipe. */ close_pipe(pipe); /* Stop reading, so the pending read that is going to fail will not be * reported to the user. */ uv_read_stop((uv_stream_t*) pipe); /* Report the eof and update flags. This will get reported even if the user * stopped reading in the meantime. TODO: is that okay? */ uv_pipe_read_eof(loop, pipe, uv_null_buf_); } static void eof_timer_destroy(uv_pipe_t* pipe) { assert(pipe->flags & UV_HANDLE_CONNECTION); if (pipe->pipe.conn.eof_timer) { uv_close((uv_handle_t*) pipe->pipe.conn.eof_timer, eof_timer_close_cb); pipe->pipe.conn.eof_timer = NULL; } } static void eof_timer_close_cb(uv_handle_t* handle) { assert(handle->type == UV_TIMER); uv__free(handle); } int uv_pipe_open(uv_pipe_t* pipe, uv_file file) { HANDLE os_handle = uv__get_osfhandle(file); NTSTATUS nt_status; IO_STATUS_BLOCK io_status; FILE_ACCESS_INFORMATION access; DWORD duplex_flags = 0; if (os_handle == INVALID_HANDLE_VALUE) return UV_EBADF; uv__once_init(); /* In order to avoid closing a stdio file descriptor 0-2, duplicate the * underlying OS handle and forget about the original fd. * We could also opt to use the original OS handle and just never close it, * but then there would be no reliable way to cancel pending read operations * upon close. */ if (file <= 2) { if (!DuplicateHandle(INVALID_HANDLE_VALUE, os_handle, INVALID_HANDLE_VALUE, &os_handle, 0, FALSE, DUPLICATE_SAME_ACCESS)) return uv_translate_sys_error(GetLastError()); file = -1; } /* Determine what kind of permissions we have on this handle. * Cygwin opens the pipe in message mode, but we can support it, * just query the access flags and set the stream flags accordingly. */ nt_status = pNtQueryInformationFile(os_handle, &io_status, &access, sizeof(access), FileAccessInformation); if (nt_status != STATUS_SUCCESS) return UV_EINVAL; if (pipe->ipc) { if (!(access.AccessFlags & FILE_WRITE_DATA) || !(access.AccessFlags & FILE_READ_DATA)) { return UV_EINVAL; } } if (access.AccessFlags & FILE_WRITE_DATA) duplex_flags |= UV_HANDLE_WRITABLE; if (access.AccessFlags & FILE_READ_DATA) duplex_flags |= UV_HANDLE_READABLE; if (os_handle == INVALID_HANDLE_VALUE || uv_set_pipe_handle(pipe->loop, pipe, os_handle, file, duplex_flags) == -1) { return UV_EINVAL; } uv_pipe_connection_init(pipe); if (pipe->ipc) { assert(!(pipe->flags & UV_HANDLE_NON_OVERLAPPED_PIPE)); pipe->pipe.conn.ipc_remote_pid = uv_os_getppid(); assert(pipe->pipe.conn.ipc_remote_pid != (DWORD) -1); } return 0; } static int uv__pipe_getname(const uv_pipe_t* handle, char* buffer, size_t* size) { NTSTATUS nt_status; IO_STATUS_BLOCK io_status; FILE_NAME_INFORMATION tmp_name_info; FILE_NAME_INFORMATION* name_info; WCHAR* name_buf; unsigned int addrlen; unsigned int name_size; unsigned int name_len; int err; uv__once_init(); name_info = NULL; if (handle->handle == INVALID_HANDLE_VALUE) { *size = 0; return UV_EINVAL; } /* NtQueryInformationFile will block if another thread is performing a * blocking operation on the queried handle. If the pipe handle is * synchronous, there may be a worker thread currently calling ReadFile() on * the pipe handle, which could cause a deadlock. To avoid this, interrupt * the read. */ if (handle->flags & UV_HANDLE_CONNECTION && handle->flags & UV_HANDLE_NON_OVERLAPPED_PIPE) { uv__pipe_interrupt_read((uv_pipe_t*) handle); /* cast away const warning */ } nt_status = pNtQueryInformationFile(handle->handle, &io_status, &tmp_name_info, sizeof tmp_name_info, FileNameInformation); if (nt_status == STATUS_BUFFER_OVERFLOW) { name_size = sizeof(*name_info) + tmp_name_info.FileNameLength; name_info = (FILE_NAME_INFORMATION *)uv__malloc(name_size); if (!name_info) { *size = 0; err = UV_ENOMEM; goto cleanup; } nt_status = pNtQueryInformationFile(handle->handle, &io_status, name_info, name_size, FileNameInformation); } if (nt_status != STATUS_SUCCESS) { *size = 0; err = uv_translate_sys_error(pRtlNtStatusToDosError(nt_status)); goto error; } if (!name_info) { /* the struct on stack was used */ name_buf = tmp_name_info.FileName; name_len = tmp_name_info.FileNameLength; } else { name_buf = name_info->FileName; name_len = name_info->FileNameLength; } if (name_len == 0) { *size = 0; err = 0; goto error; } name_len /= sizeof(WCHAR); /* check how much space we need */ addrlen = WideCharToMultiByte(CP_UTF8, 0, name_buf, name_len, NULL, 0, NULL, NULL); if (!addrlen) { *size = 0; err = uv_translate_sys_error(GetLastError()); goto error; } else if (pipe_prefix_len + addrlen >= *size) { /* "\\\\.\\pipe" + name */ *size = pipe_prefix_len + addrlen + 1; err = UV_ENOBUFS; goto error; } memcpy(buffer, pipe_prefix, pipe_prefix_len); addrlen = WideCharToMultiByte(CP_UTF8, 0, name_buf, name_len, buffer+pipe_prefix_len, *size-pipe_prefix_len, NULL, NULL); if (!addrlen) { *size = 0; err = uv_translate_sys_error(GetLastError()); goto error; } addrlen += pipe_prefix_len; *size = addrlen; buffer[addrlen] = '\0'; err = 0; error: uv__free(name_info); cleanup: return err; } int uv_pipe_pending_count(uv_pipe_t* handle) { if (!handle->ipc) return 0; return handle->pipe.conn.ipc_xfer_queue_length; } int uv_pipe_getsockname(const uv_pipe_t* handle, char* buffer, size_t* size) { if (handle->flags & UV_HANDLE_BOUND) return uv__pipe_getname(handle, buffer, size); if (handle->flags & UV_HANDLE_CONNECTION || handle->handle != INVALID_HANDLE_VALUE) { *size = 0; return 0; } return UV_EBADF; } int uv_pipe_getpeername(const uv_pipe_t* handle, char* buffer, size_t* size) { /* emulate unix behaviour */ if (handle->flags & UV_HANDLE_BOUND) return UV_ENOTCONN; if (handle->handle != INVALID_HANDLE_VALUE) return uv__pipe_getname(handle, buffer, size); return UV_EBADF; } uv_handle_type uv_pipe_pending_type(uv_pipe_t* handle) { if (!handle->ipc) return UV_UNKNOWN_HANDLE; if (handle->pipe.conn.ipc_xfer_queue_length == 0) return UV_UNKNOWN_HANDLE; else return UV_TCP; } int uv_pipe_chmod(uv_pipe_t* handle, int mode) { SID_IDENTIFIER_AUTHORITY sid_world = { SECURITY_WORLD_SID_AUTHORITY }; PACL old_dacl, new_dacl; PSECURITY_DESCRIPTOR sd; EXPLICIT_ACCESS ea; PSID everyone; int error; if (handle == NULL || handle->handle == INVALID_HANDLE_VALUE) return UV_EBADF; if (mode != UV_READABLE && mode != UV_WRITABLE && mode != (UV_WRITABLE | UV_READABLE)) return UV_EINVAL; if (!AllocateAndInitializeSid(&sid_world, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &everyone)) { error = GetLastError(); goto done; } if (GetSecurityInfo(handle->handle, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &old_dacl, NULL, &sd)) { error = GetLastError(); goto clean_sid; } memset(&ea, 0, sizeof(EXPLICIT_ACCESS)); if (mode & UV_READABLE) ea.grfAccessPermissions |= GENERIC_READ | FILE_WRITE_ATTRIBUTES; if (mode & UV_WRITABLE) ea.grfAccessPermissions |= GENERIC_WRITE | FILE_READ_ATTRIBUTES; ea.grfAccessPermissions |= SYNCHRONIZE; ea.grfAccessMode = SET_ACCESS; ea.grfInheritance = NO_INHERITANCE; ea.Trustee.TrusteeForm = TRUSTEE_IS_SID; ea.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP; ea.Trustee.ptstrName = (LPTSTR)everyone; if (SetEntriesInAcl(1, &ea, old_dacl, &new_dacl)) { error = GetLastError(); goto clean_sd; } if (SetSecurityInfo(handle->handle, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, new_dacl, NULL)) { error = GetLastError(); goto clean_dacl; } error = 0; clean_dacl: LocalFree((HLOCAL) new_dacl); clean_sd: LocalFree((HLOCAL) sd); clean_sid: FreeSid(everyone); done: return uv_translate_sys_error(error); } ================================================ FILE: external/libuv/src/win/poll.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include "uv.h" #include "internal.h" #include "handle-inl.h" #include "req-inl.h" static const GUID uv_msafd_provider_ids[UV_MSAFD_PROVIDER_COUNT] = { {0xe70f1aa0, 0xab8b, 0x11cf, {0x8c, 0xa3, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}}, {0xf9eab0c0, 0x26d4, 0x11d0, {0xbb, 0xbf, 0x00, 0xaa, 0x00, 0x6c, 0x34, 0xe4}}, {0x9fc48064, 0x7298, 0x43e4, {0xb7, 0xbd, 0x18, 0x1f, 0x20, 0x89, 0x79, 0x2a}} }; typedef struct uv_single_fd_set_s { unsigned int fd_count; SOCKET fd_array[1]; } uv_single_fd_set_t; static OVERLAPPED overlapped_dummy_; static uv_once_t overlapped_dummy_init_guard_ = UV_ONCE_INIT; static AFD_POLL_INFO afd_poll_info_dummy_; static void uv__init_overlapped_dummy(void) { HANDLE event; event = CreateEvent(NULL, TRUE, TRUE, NULL); if (event == NULL) uv_fatal_error(GetLastError(), "CreateEvent"); memset(&overlapped_dummy_, 0, sizeof overlapped_dummy_); overlapped_dummy_.hEvent = (HANDLE) ((uintptr_t) event | 1); } static OVERLAPPED* uv__get_overlapped_dummy(void) { uv_once(&overlapped_dummy_init_guard_, uv__init_overlapped_dummy); return &overlapped_dummy_; } static AFD_POLL_INFO* uv__get_afd_poll_info_dummy(void) { return &afd_poll_info_dummy_; } static void uv__fast_poll_submit_poll_req(uv_loop_t* loop, uv_poll_t* handle) { uv_req_t* req; AFD_POLL_INFO* afd_poll_info; int result; /* Find a yet unsubmitted req to submit. */ if (handle->submitted_events_1 == 0) { req = &handle->poll_req_1; afd_poll_info = &handle->afd_poll_info_1; handle->submitted_events_1 = handle->events; handle->mask_events_1 = 0; handle->mask_events_2 = handle->events; } else if (handle->submitted_events_2 == 0) { req = &handle->poll_req_2; afd_poll_info = &handle->afd_poll_info_2; handle->submitted_events_2 = handle->events; handle->mask_events_1 = handle->events; handle->mask_events_2 = 0; } else { /* Just wait until there's an unsubmitted req. This will happen almost * immediately as one of the 2 outstanding requests is about to return. * When this happens, uv__fast_poll_process_poll_req will be called, and * the pending events, if needed, will be processed in a subsequent * request. */ return; } /* Setting Exclusive to TRUE makes the other poll request return if there is * any. */ afd_poll_info->Exclusive = TRUE; afd_poll_info->NumberOfHandles = 1; afd_poll_info->Timeout.QuadPart = INT64_MAX; afd_poll_info->Handles[0].Handle = (HANDLE) handle->socket; afd_poll_info->Handles[0].Status = 0; afd_poll_info->Handles[0].Events = 0; if (handle->events & UV_READABLE) { afd_poll_info->Handles[0].Events |= AFD_POLL_RECEIVE | AFD_POLL_DISCONNECT | AFD_POLL_ACCEPT | AFD_POLL_ABORT; } else { if (handle->events & UV_DISCONNECT) { afd_poll_info->Handles[0].Events |= AFD_POLL_DISCONNECT; } } if (handle->events & UV_WRITABLE) { afd_poll_info->Handles[0].Events |= AFD_POLL_SEND | AFD_POLL_CONNECT_FAIL; } memset(&req->u.io.overlapped, 0, sizeof req->u.io.overlapped); result = uv_msafd_poll((SOCKET) handle->peer_socket, afd_poll_info, afd_poll_info, &req->u.io.overlapped); if (result != 0 && WSAGetLastError() != WSA_IO_PENDING) { /* Queue this req, reporting an error. */ SET_REQ_ERROR(req, WSAGetLastError()); uv_insert_pending_req(loop, req); } } static void uv__fast_poll_process_poll_req(uv_loop_t* loop, uv_poll_t* handle, uv_req_t* req) { unsigned char mask_events; AFD_POLL_INFO* afd_poll_info; if (req == &handle->poll_req_1) { afd_poll_info = &handle->afd_poll_info_1; handle->submitted_events_1 = 0; mask_events = handle->mask_events_1; } else if (req == &handle->poll_req_2) { afd_poll_info = &handle->afd_poll_info_2; handle->submitted_events_2 = 0; mask_events = handle->mask_events_2; } else { assert(0); return; } /* Report an error unless the select was just interrupted. */ if (!REQ_SUCCESS(req)) { DWORD error = GET_REQ_SOCK_ERROR(req); if (error != WSAEINTR && handle->events != 0) { handle->events = 0; /* Stop the watcher */ handle->poll_cb(handle, uv_translate_sys_error(error), 0); } } else if (afd_poll_info->NumberOfHandles >= 1) { unsigned char events = 0; if ((afd_poll_info->Handles[0].Events & (AFD_POLL_RECEIVE | AFD_POLL_DISCONNECT | AFD_POLL_ACCEPT | AFD_POLL_ABORT)) != 0) { events |= UV_READABLE; if ((afd_poll_info->Handles[0].Events & AFD_POLL_DISCONNECT) != 0) { events |= UV_DISCONNECT; } } if ((afd_poll_info->Handles[0].Events & (AFD_POLL_SEND | AFD_POLL_CONNECT_FAIL)) != 0) { events |= UV_WRITABLE; } events &= handle->events & ~mask_events; if (afd_poll_info->Handles[0].Events & AFD_POLL_LOCAL_CLOSE) { /* Stop polling. */ handle->events = 0; if (uv__is_active(handle)) uv__handle_stop(handle); } if (events != 0) { handle->poll_cb(handle, 0, events); } } if ((handle->events & ~(handle->submitted_events_1 | handle->submitted_events_2)) != 0) { uv__fast_poll_submit_poll_req(loop, handle); } else if ((handle->flags & UV_HANDLE_CLOSING) && handle->submitted_events_1 == 0 && handle->submitted_events_2 == 0) { uv_want_endgame(loop, (uv_handle_t*) handle); } } static SOCKET uv__fast_poll_create_peer_socket(HANDLE iocp, WSAPROTOCOL_INFOW* protocol_info) { SOCKET sock = 0; sock = WSASocketW(protocol_info->iAddressFamily, protocol_info->iSocketType, protocol_info->iProtocol, protocol_info, 0, WSA_FLAG_OVERLAPPED); if (sock == INVALID_SOCKET) { return INVALID_SOCKET; } if (!SetHandleInformation((HANDLE) sock, HANDLE_FLAG_INHERIT, 0)) { goto error; }; if (CreateIoCompletionPort((HANDLE) sock, iocp, (ULONG_PTR) sock, 0) == NULL) { goto error; } return sock; error: closesocket(sock); return INVALID_SOCKET; } static SOCKET uv__fast_poll_get_peer_socket(uv_loop_t* loop, WSAPROTOCOL_INFOW* protocol_info) { int index, i; SOCKET peer_socket; index = -1; for (i = 0; (size_t) i < ARRAY_SIZE(uv_msafd_provider_ids); i++) { if (memcmp((void*) &protocol_info->ProviderId, (void*) &uv_msafd_provider_ids[i], sizeof protocol_info->ProviderId) == 0) { index = i; } } /* Check if the protocol uses an msafd socket. */ if (index < 0) { return INVALID_SOCKET; } /* If we didn't (try) to create a peer socket yet, try to make one. Don't try * again if the peer socket creation failed earlier for the same protocol. */ peer_socket = loop->poll_peer_sockets[index]; if (peer_socket == 0) { peer_socket = uv__fast_poll_create_peer_socket(loop->iocp, protocol_info); loop->poll_peer_sockets[index] = peer_socket; } return peer_socket; } static DWORD WINAPI uv__slow_poll_thread_proc(void* arg) { uv_req_t* req = (uv_req_t*) arg; uv_poll_t* handle = (uv_poll_t*) req->data; unsigned char reported_events; int r; uv_single_fd_set_t rfds, wfds, efds; struct timeval timeout; assert(handle->type == UV_POLL); assert(req->type == UV_POLL_REQ); if (handle->events & UV_READABLE) { rfds.fd_count = 1; rfds.fd_array[0] = handle->socket; } else { rfds.fd_count = 0; } if (handle->events & UV_WRITABLE) { wfds.fd_count = 1; wfds.fd_array[0] = handle->socket; efds.fd_count = 1; efds.fd_array[0] = handle->socket; } else { wfds.fd_count = 0; efds.fd_count = 0; } /* Make the select() time out after 3 minutes. If select() hangs because the * user closed the socket, we will at least not hang indefinitely. */ timeout.tv_sec = 3 * 60; timeout.tv_usec = 0; r = select(1, (fd_set*) &rfds, (fd_set*) &wfds, (fd_set*) &efds, &timeout); if (r == SOCKET_ERROR) { /* Queue this req, reporting an error. */ SET_REQ_ERROR(&handle->poll_req_1, WSAGetLastError()); POST_COMPLETION_FOR_REQ(handle->loop, req); return 0; } reported_events = 0; if (r > 0) { if (rfds.fd_count > 0) { assert(rfds.fd_count == 1); assert(rfds.fd_array[0] == handle->socket); reported_events |= UV_READABLE; } if (wfds.fd_count > 0) { assert(wfds.fd_count == 1); assert(wfds.fd_array[0] == handle->socket); reported_events |= UV_WRITABLE; } else if (efds.fd_count > 0) { assert(efds.fd_count == 1); assert(efds.fd_array[0] == handle->socket); reported_events |= UV_WRITABLE; } } SET_REQ_SUCCESS(req); req->u.io.overlapped.InternalHigh = (DWORD) reported_events; POST_COMPLETION_FOR_REQ(handle->loop, req); return 0; } static void uv__slow_poll_submit_poll_req(uv_loop_t* loop, uv_poll_t* handle) { uv_req_t* req; /* Find a yet unsubmitted req to submit. */ if (handle->submitted_events_1 == 0) { req = &handle->poll_req_1; handle->submitted_events_1 = handle->events; handle->mask_events_1 = 0; handle->mask_events_2 = handle->events; } else if (handle->submitted_events_2 == 0) { req = &handle->poll_req_2; handle->submitted_events_2 = handle->events; handle->mask_events_1 = handle->events; handle->mask_events_2 = 0; } else { assert(0); return; } if (!QueueUserWorkItem(uv__slow_poll_thread_proc, (void*) req, WT_EXECUTELONGFUNCTION)) { /* Make this req pending, reporting an error. */ SET_REQ_ERROR(req, GetLastError()); uv_insert_pending_req(loop, req); } } static void uv__slow_poll_process_poll_req(uv_loop_t* loop, uv_poll_t* handle, uv_req_t* req) { unsigned char mask_events; int err; if (req == &handle->poll_req_1) { handle->submitted_events_1 = 0; mask_events = handle->mask_events_1; } else if (req == &handle->poll_req_2) { handle->submitted_events_2 = 0; mask_events = handle->mask_events_2; } else { assert(0); return; } if (!REQ_SUCCESS(req)) { /* Error. */ if (handle->events != 0) { err = GET_REQ_ERROR(req); handle->events = 0; /* Stop the watcher */ handle->poll_cb(handle, uv_translate_sys_error(err), 0); } } else { /* Got some events. */ int events = req->u.io.overlapped.InternalHigh & handle->events & ~mask_events; if (events != 0) { handle->poll_cb(handle, 0, events); } } if ((handle->events & ~(handle->submitted_events_1 | handle->submitted_events_2)) != 0) { uv__slow_poll_submit_poll_req(loop, handle); } else if ((handle->flags & UV_HANDLE_CLOSING) && handle->submitted_events_1 == 0 && handle->submitted_events_2 == 0) { uv_want_endgame(loop, (uv_handle_t*) handle); } } int uv_poll_init(uv_loop_t* loop, uv_poll_t* handle, int fd) { return uv_poll_init_socket(loop, handle, (SOCKET) uv__get_osfhandle(fd)); } int uv_poll_init_socket(uv_loop_t* loop, uv_poll_t* handle, uv_os_sock_t socket) { WSAPROTOCOL_INFOW protocol_info; int len; SOCKET peer_socket, base_socket; DWORD bytes; DWORD yes = 1; /* Set the socket to nonblocking mode */ if (ioctlsocket(socket, FIONBIO, &yes) == SOCKET_ERROR) return uv_translate_sys_error(WSAGetLastError()); /* Try to obtain a base handle for the socket. This increases this chances that * we find an AFD handle and are able to use the fast poll mechanism. This will * always fail on windows XP/2k3, since they don't support the. SIO_BASE_HANDLE * ioctl. */ #ifndef NDEBUG base_socket = INVALID_SOCKET; #endif if (WSAIoctl(socket, SIO_BASE_HANDLE, NULL, 0, &base_socket, sizeof base_socket, &bytes, NULL, NULL) == 0) { assert(base_socket != 0 && base_socket != INVALID_SOCKET); socket = base_socket; } uv__handle_init(loop, (uv_handle_t*) handle, UV_POLL); handle->socket = socket; handle->events = 0; /* Obtain protocol information about the socket. */ len = sizeof protocol_info; if (getsockopt(socket, SOL_SOCKET, SO_PROTOCOL_INFOW, (char*) &protocol_info, &len) != 0) { return uv_translate_sys_error(WSAGetLastError()); } /* Get the peer socket that is needed to enable fast poll. If the returned * value is NULL, the protocol is not implemented by MSAFD and we'll have to * use slow mode. */ peer_socket = uv__fast_poll_get_peer_socket(loop, &protocol_info); if (peer_socket != INVALID_SOCKET) { /* Initialize fast poll specific fields. */ handle->peer_socket = peer_socket; } else { /* Initialize slow poll specific fields. */ handle->flags |= UV_HANDLE_POLL_SLOW; } /* Initialize 2 poll reqs. */ handle->submitted_events_1 = 0; UV_REQ_INIT(&handle->poll_req_1, UV_POLL_REQ); handle->poll_req_1.data = handle; handle->submitted_events_2 = 0; UV_REQ_INIT(&handle->poll_req_2, UV_POLL_REQ); handle->poll_req_2.data = handle; return 0; } static int uv__poll_set(uv_poll_t* handle, int events, uv_poll_cb cb) { int submitted_events; assert(handle->type == UV_POLL); assert(!(handle->flags & UV_HANDLE_CLOSING)); assert((events & ~(UV_READABLE | UV_WRITABLE | UV_DISCONNECT)) == 0); handle->events = events; handle->poll_cb = cb; if (handle->events == 0) { uv__handle_stop(handle); return 0; } uv__handle_start(handle); submitted_events = handle->submitted_events_1 | handle->submitted_events_2; if (handle->events & ~submitted_events) { if (handle->flags & UV_HANDLE_POLL_SLOW) { uv__slow_poll_submit_poll_req(handle->loop, handle); } else { uv__fast_poll_submit_poll_req(handle->loop, handle); } } return 0; } int uv_poll_start(uv_poll_t* handle, int events, uv_poll_cb cb) { return uv__poll_set(handle, events, cb); } int uv_poll_stop(uv_poll_t* handle) { return uv__poll_set(handle, 0, handle->poll_cb); } void uv_process_poll_req(uv_loop_t* loop, uv_poll_t* handle, uv_req_t* req) { if (!(handle->flags & UV_HANDLE_POLL_SLOW)) { uv__fast_poll_process_poll_req(loop, handle, req); } else { uv__slow_poll_process_poll_req(loop, handle, req); } } int uv_poll_close(uv_loop_t* loop, uv_poll_t* handle) { AFD_POLL_INFO afd_poll_info; DWORD error; int result; handle->events = 0; uv__handle_closing(handle); if (handle->submitted_events_1 == 0 && handle->submitted_events_2 == 0) { uv_want_endgame(loop, (uv_handle_t*) handle); return 0; } if (handle->flags & UV_HANDLE_POLL_SLOW) return 0; /* Cancel outstanding poll requests by executing another, unique poll * request that forces the outstanding ones to return. */ afd_poll_info.Exclusive = TRUE; afd_poll_info.NumberOfHandles = 1; afd_poll_info.Timeout.QuadPart = INT64_MAX; afd_poll_info.Handles[0].Handle = (HANDLE) handle->socket; afd_poll_info.Handles[0].Status = 0; afd_poll_info.Handles[0].Events = AFD_POLL_ALL; result = uv_msafd_poll(handle->socket, &afd_poll_info, uv__get_afd_poll_info_dummy(), uv__get_overlapped_dummy()); if (result == SOCKET_ERROR) { error = WSAGetLastError(); if (error != WSA_IO_PENDING) return uv_translate_sys_error(error); } return 0; } void uv_poll_endgame(uv_loop_t* loop, uv_poll_t* handle) { assert(handle->flags & UV_HANDLE_CLOSING); assert(!(handle->flags & UV_HANDLE_CLOSED)); assert(handle->submitted_events_1 == 0); assert(handle->submitted_events_2 == 0); uv__handle_close(handle); } ================================================ FILE: external/libuv/src/win/process-stdio.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include #include "uv.h" #include "internal.h" #include "handle-inl.h" /* * The `child_stdio_buffer` buffer has the following layout: * int number_of_fds * unsigned char crt_flags[number_of_fds] * HANDLE os_handle[number_of_fds] */ #define CHILD_STDIO_SIZE(count) \ (sizeof(int) + \ sizeof(unsigned char) * (count) + \ sizeof(uintptr_t) * (count)) #define CHILD_STDIO_COUNT(buffer) \ *((unsigned int*) (buffer)) #define CHILD_STDIO_CRT_FLAGS(buffer, fd) \ *((unsigned char*) (buffer) + sizeof(int) + fd) #define CHILD_STDIO_HANDLE(buffer, fd) \ *((HANDLE*) ((unsigned char*) (buffer) + \ sizeof(int) + \ sizeof(unsigned char) * \ CHILD_STDIO_COUNT((buffer)) + \ sizeof(HANDLE) * (fd))) /* CRT file descriptor mode flags */ #define FOPEN 0x01 #define FEOFLAG 0x02 #define FCRLF 0x04 #define FPIPE 0x08 #define FNOINHERIT 0x10 #define FAPPEND 0x20 #define FDEV 0x40 #define FTEXT 0x80 /* * Clear the HANDLE_FLAG_INHERIT flag from all HANDLEs that were inherited * the parent process. Don't check for errors - the stdio handles may not be * valid, or may be closed already. There is no guarantee that this function * does a perfect job. */ void uv_disable_stdio_inheritance(void) { HANDLE handle; STARTUPINFOW si; /* Make the windows stdio handles non-inheritable. */ handle = GetStdHandle(STD_INPUT_HANDLE); if (handle != NULL && handle != INVALID_HANDLE_VALUE) SetHandleInformation(handle, HANDLE_FLAG_INHERIT, 0); handle = GetStdHandle(STD_OUTPUT_HANDLE); if (handle != NULL && handle != INVALID_HANDLE_VALUE) SetHandleInformation(handle, HANDLE_FLAG_INHERIT, 0); handle = GetStdHandle(STD_ERROR_HANDLE); if (handle != NULL && handle != INVALID_HANDLE_VALUE) SetHandleInformation(handle, HANDLE_FLAG_INHERIT, 0); /* Make inherited CRT FDs non-inheritable. */ GetStartupInfoW(&si); if (uv__stdio_verify(si.lpReserved2, si.cbReserved2)) uv__stdio_noinherit(si.lpReserved2); } static int uv__create_stdio_pipe_pair(uv_loop_t* loop, uv_pipe_t* server_pipe, HANDLE* child_pipe_ptr, unsigned int flags) { char pipe_name[64]; SECURITY_ATTRIBUTES sa; DWORD server_access = 0; DWORD client_access = 0; HANDLE child_pipe = INVALID_HANDLE_VALUE; int err; int overlap; if (flags & UV_READABLE_PIPE) { /* The server needs inbound access too, otherwise CreateNamedPipe() won't * give us the FILE_READ_ATTRIBUTES permission. We need that to probe the * state of the write buffer when we're trying to shutdown the pipe. */ server_access |= PIPE_ACCESS_OUTBOUND | PIPE_ACCESS_INBOUND; client_access |= GENERIC_READ | FILE_WRITE_ATTRIBUTES; } if (flags & UV_WRITABLE_PIPE) { server_access |= PIPE_ACCESS_INBOUND; client_access |= GENERIC_WRITE | FILE_READ_ATTRIBUTES; } /* Create server pipe handle. */ err = uv_stdio_pipe_server(loop, server_pipe, server_access, pipe_name, sizeof(pipe_name)); if (err) goto error; /* Create child pipe handle. */ sa.nLength = sizeof sa; sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; overlap = server_pipe->ipc || (flags & UV_OVERLAPPED_PIPE); child_pipe = CreateFileA(pipe_name, client_access, 0, &sa, OPEN_EXISTING, overlap ? FILE_FLAG_OVERLAPPED : 0, NULL); if (child_pipe == INVALID_HANDLE_VALUE) { err = GetLastError(); goto error; } #ifndef NDEBUG /* Validate that the pipe was opened in the right mode. */ { DWORD mode; BOOL r = GetNamedPipeHandleState(child_pipe, &mode, NULL, NULL, NULL, NULL, 0); assert(r == TRUE); assert(mode == (PIPE_READMODE_BYTE | PIPE_WAIT)); } #endif /* Do a blocking ConnectNamedPipe. This should not block because we have both * ends of the pipe created. */ if (!ConnectNamedPipe(server_pipe->handle, NULL)) { if (GetLastError() != ERROR_PIPE_CONNECTED) { err = GetLastError(); goto error; } } /* The server end is now readable and/or writable. */ if (flags & UV_READABLE_PIPE) server_pipe->flags |= UV_HANDLE_WRITABLE; if (flags & UV_WRITABLE_PIPE) server_pipe->flags |= UV_HANDLE_READABLE; *child_pipe_ptr = child_pipe; return 0; error: if (server_pipe->handle != INVALID_HANDLE_VALUE) { uv_pipe_cleanup(loop, server_pipe); } if (child_pipe != INVALID_HANDLE_VALUE) { CloseHandle(child_pipe); } return err; } static int uv__duplicate_handle(uv_loop_t* loop, HANDLE handle, HANDLE* dup) { HANDLE current_process; /* _get_osfhandle will sometimes return -2 in case of an error. This seems to * happen when fd <= 2 and the process' corresponding stdio handle is set to * NULL. Unfortunately DuplicateHandle will happily duplicate (HANDLE) -2, so * this situation goes unnoticed until someone tries to use the duplicate. * Therefore we filter out known-invalid handles here. */ if (handle == INVALID_HANDLE_VALUE || handle == NULL || handle == (HANDLE) -2) { *dup = INVALID_HANDLE_VALUE; return ERROR_INVALID_HANDLE; } current_process = GetCurrentProcess(); if (!DuplicateHandle(current_process, handle, current_process, dup, 0, TRUE, DUPLICATE_SAME_ACCESS)) { *dup = INVALID_HANDLE_VALUE; return GetLastError(); } return 0; } static int uv__duplicate_fd(uv_loop_t* loop, int fd, HANDLE* dup) { HANDLE handle; if (fd == -1) { *dup = INVALID_HANDLE_VALUE; return ERROR_INVALID_HANDLE; } handle = uv__get_osfhandle(fd); return uv__duplicate_handle(loop, handle, dup); } int uv__create_nul_handle(HANDLE* handle_ptr, DWORD access) { HANDLE handle; SECURITY_ATTRIBUTES sa; sa.nLength = sizeof sa; sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; handle = CreateFileW(L"NUL", access, FILE_SHARE_READ | FILE_SHARE_WRITE, &sa, OPEN_EXISTING, 0, NULL); if (handle == INVALID_HANDLE_VALUE) { return GetLastError(); } *handle_ptr = handle; return 0; } int uv__stdio_create(uv_loop_t* loop, const uv_process_options_t* options, BYTE** buffer_ptr) { BYTE* buffer; int count, i; int err; count = options->stdio_count; if (count < 0 || count > 255) { /* Only support FDs 0-255 */ return ERROR_NOT_SUPPORTED; } else if (count < 3) { /* There should always be at least 3 stdio handles. */ count = 3; } /* Allocate the child stdio buffer */ buffer = (BYTE*) uv__malloc(CHILD_STDIO_SIZE(count)); if (buffer == NULL) { return ERROR_OUTOFMEMORY; } /* Prepopulate the buffer with INVALID_HANDLE_VALUE handles so we can clean * up on failure. */ CHILD_STDIO_COUNT(buffer) = count; for (i = 0; i < count; i++) { CHILD_STDIO_CRT_FLAGS(buffer, i) = 0; CHILD_STDIO_HANDLE(buffer, i) = INVALID_HANDLE_VALUE; } for (i = 0; i < count; i++) { uv_stdio_container_t fdopt; if (i < options->stdio_count) { fdopt = options->stdio[i]; } else { fdopt.flags = UV_IGNORE; } switch (fdopt.flags & (UV_IGNORE | UV_CREATE_PIPE | UV_INHERIT_FD | UV_INHERIT_STREAM)) { case UV_IGNORE: /* Starting a process with no stdin/stout/stderr can confuse it. So no * matter what the user specified, we make sure the first three FDs are * always open in their typical modes, e. g. stdin be readable and * stdout/err should be writable. For FDs > 2, don't do anything - all * handles in the stdio buffer are initialized with. * INVALID_HANDLE_VALUE, which should be okay. */ if (i <= 2) { DWORD access = (i == 0) ? FILE_GENERIC_READ : FILE_GENERIC_WRITE | FILE_READ_ATTRIBUTES; err = uv__create_nul_handle(&CHILD_STDIO_HANDLE(buffer, i), access); if (err) goto error; CHILD_STDIO_CRT_FLAGS(buffer, i) = FOPEN | FDEV; } break; case UV_CREATE_PIPE: { /* Create a pair of two connected pipe ends; one end is turned into an * uv_pipe_t for use by the parent. The other one is given to the * child. */ uv_pipe_t* parent_pipe = (uv_pipe_t*) fdopt.data.stream; HANDLE child_pipe = INVALID_HANDLE_VALUE; /* Create a new, connected pipe pair. stdio[i]. stream should point to * an uninitialized, but not connected pipe handle. */ assert(fdopt.data.stream->type == UV_NAMED_PIPE); assert(!(fdopt.data.stream->flags & UV_HANDLE_CONNECTION)); assert(!(fdopt.data.stream->flags & UV_HANDLE_PIPESERVER)); err = uv__create_stdio_pipe_pair(loop, parent_pipe, &child_pipe, fdopt.flags); if (err) goto error; CHILD_STDIO_HANDLE(buffer, i) = child_pipe; CHILD_STDIO_CRT_FLAGS(buffer, i) = FOPEN | FPIPE; break; } case UV_INHERIT_FD: { /* Inherit a raw FD. */ HANDLE child_handle; /* Make an inheritable duplicate of the handle. */ err = uv__duplicate_fd(loop, fdopt.data.fd, &child_handle); if (err) { /* If fdopt. data. fd is not valid and fd <= 2, then ignore the * error. */ if (fdopt.data.fd <= 2 && err == ERROR_INVALID_HANDLE) { CHILD_STDIO_CRT_FLAGS(buffer, i) = 0; CHILD_STDIO_HANDLE(buffer, i) = INVALID_HANDLE_VALUE; break; } goto error; } /* Figure out what the type is. */ switch (GetFileType(child_handle)) { case FILE_TYPE_DISK: CHILD_STDIO_CRT_FLAGS(buffer, i) = FOPEN; break; case FILE_TYPE_PIPE: CHILD_STDIO_CRT_FLAGS(buffer, i) = FOPEN | FPIPE; break; case FILE_TYPE_CHAR: case FILE_TYPE_REMOTE: CHILD_STDIO_CRT_FLAGS(buffer, i) = FOPEN | FDEV; break; case FILE_TYPE_UNKNOWN: if (GetLastError() != 0) { err = GetLastError(); CloseHandle(child_handle); goto error; } CHILD_STDIO_CRT_FLAGS(buffer, i) = FOPEN | FDEV; break; default: assert(0); return -1; } CHILD_STDIO_HANDLE(buffer, i) = child_handle; break; } case UV_INHERIT_STREAM: { /* Use an existing stream as the stdio handle for the child. */ HANDLE stream_handle, child_handle; unsigned char crt_flags; uv_stream_t* stream = fdopt.data.stream; /* Leech the handle out of the stream. */ if (stream->type == UV_TTY) { stream_handle = ((uv_tty_t*) stream)->handle; crt_flags = FOPEN | FDEV; } else if (stream->type == UV_NAMED_PIPE && stream->flags & UV_HANDLE_CONNECTION) { stream_handle = ((uv_pipe_t*) stream)->handle; crt_flags = FOPEN | FPIPE; } else { stream_handle = INVALID_HANDLE_VALUE; crt_flags = 0; } if (stream_handle == NULL || stream_handle == INVALID_HANDLE_VALUE) { /* The handle is already closed, or not yet created, or the stream * type is not supported. */ err = ERROR_NOT_SUPPORTED; goto error; } /* Make an inheritable copy of the handle. */ err = uv__duplicate_handle(loop, stream_handle, &child_handle); if (err) goto error; CHILD_STDIO_HANDLE(buffer, i) = child_handle; CHILD_STDIO_CRT_FLAGS(buffer, i) = crt_flags; break; } default: assert(0); return -1; } } *buffer_ptr = buffer; return 0; error: uv__stdio_destroy(buffer); return err; } void uv__stdio_destroy(BYTE* buffer) { int i, count; count = CHILD_STDIO_COUNT(buffer); for (i = 0; i < count; i++) { HANDLE handle = CHILD_STDIO_HANDLE(buffer, i); if (handle != INVALID_HANDLE_VALUE) { CloseHandle(handle); } } uv__free(buffer); } void uv__stdio_noinherit(BYTE* buffer) { int i, count; count = CHILD_STDIO_COUNT(buffer); for (i = 0; i < count; i++) { HANDLE handle = CHILD_STDIO_HANDLE(buffer, i); if (handle != INVALID_HANDLE_VALUE) { SetHandleInformation(handle, HANDLE_FLAG_INHERIT, 0); } } } int uv__stdio_verify(BYTE* buffer, WORD size) { unsigned int count; /* Check the buffer pointer. */ if (buffer == NULL) return 0; /* Verify that the buffer is at least big enough to hold the count. */ if (size < CHILD_STDIO_SIZE(0)) return 0; /* Verify if the count is within range. */ count = CHILD_STDIO_COUNT(buffer); if (count > 256) return 0; /* Verify that the buffer size is big enough to hold info for N FDs. */ if (size < CHILD_STDIO_SIZE(count)) return 0; return 1; } WORD uv__stdio_size(BYTE* buffer) { return (WORD) CHILD_STDIO_SIZE(CHILD_STDIO_COUNT((buffer))); } HANDLE uv__stdio_handle(BYTE* buffer, int fd) { return CHILD_STDIO_HANDLE(buffer, fd); } ================================================ FILE: external/libuv/src/win/process.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include #include #include #include #include /* alloca */ #include "uv.h" #include "internal.h" #include "handle-inl.h" #include "req-inl.h" #define SIGKILL 9 typedef struct env_var { const WCHAR* const wide; const WCHAR* const wide_eq; const size_t len; /* including null or '=' */ } env_var_t; #define E_V(str) { L##str, L##str L"=", sizeof(str) } static const env_var_t required_vars[] = { /* keep me sorted */ E_V("HOMEDRIVE"), E_V("HOMEPATH"), E_V("LOGONSERVER"), E_V("PATH"), E_V("SYSTEMDRIVE"), E_V("SYSTEMROOT"), E_V("TEMP"), E_V("USERDOMAIN"), E_V("USERNAME"), E_V("USERPROFILE"), E_V("WINDIR"), }; static HANDLE uv_global_job_handle_; static uv_once_t uv_global_job_handle_init_guard_ = UV_ONCE_INIT; static void uv__init_global_job_handle(void) { /* Create a job object and set it up to kill all contained processes when * it's closed. Since this handle is made non-inheritable and we're not * giving it to anyone, we're the only process holding a reference to it. * That means that if this process exits it is closed and all the processes * it contains are killed. All processes created with uv_spawn that are not * spawned with the UV_PROCESS_DETACHED flag are assigned to this job. * * We're setting the JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK flag so only the * processes that we explicitly add are affected, and *their* subprocesses * are not. This ensures that our child processes are not limited in their * ability to use job control on Windows versions that don't deal with * nested jobs (prior to Windows 8 / Server 2012). It also lets our child * processes created detached processes without explicitly breaking away * from job control (which uv_spawn doesn't, either). */ SECURITY_ATTRIBUTES attr; JOBOBJECT_EXTENDED_LIMIT_INFORMATION info; memset(&attr, 0, sizeof attr); attr.bInheritHandle = FALSE; memset(&info, 0, sizeof info); info.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_BREAKAWAY_OK | JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK | JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION | JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE; uv_global_job_handle_ = CreateJobObjectW(&attr, NULL); if (uv_global_job_handle_ == NULL) uv_fatal_error(GetLastError(), "CreateJobObjectW"); if (!SetInformationJobObject(uv_global_job_handle_, JobObjectExtendedLimitInformation, &info, sizeof info)) uv_fatal_error(GetLastError(), "SetInformationJobObject"); } static int uv_utf8_to_utf16_alloc(const char* s, WCHAR** ws_ptr) { int ws_len, r; WCHAR* ws; ws_len = MultiByteToWideChar(CP_UTF8, 0, s, -1, NULL, 0); if (ws_len <= 0) { return GetLastError(); } ws = (WCHAR*) uv__malloc(ws_len * sizeof(WCHAR)); if (ws == NULL) { return ERROR_OUTOFMEMORY; } r = MultiByteToWideChar(CP_UTF8, 0, s, -1, ws, ws_len); assert(r == ws_len); *ws_ptr = ws; return 0; } static void uv_process_init(uv_loop_t* loop, uv_process_t* handle) { uv__handle_init(loop, (uv_handle_t*) handle, UV_PROCESS); handle->exit_cb = NULL; handle->pid = 0; handle->exit_signal = 0; handle->wait_handle = INVALID_HANDLE_VALUE; handle->process_handle = INVALID_HANDLE_VALUE; handle->child_stdio_buffer = NULL; handle->exit_cb_pending = 0; UV_REQ_INIT(&handle->exit_req, UV_PROCESS_EXIT); handle->exit_req.data = handle; } /* * Path search functions */ /* * Helper function for search_path */ static WCHAR* search_path_join_test(const WCHAR* dir, size_t dir_len, const WCHAR* name, size_t name_len, const WCHAR* ext, size_t ext_len, const WCHAR* cwd, size_t cwd_len) { WCHAR *result, *result_pos; DWORD attrs; if (dir_len > 2 && dir[0] == L'\\' && dir[1] == L'\\') { /* It's a UNC path so ignore cwd */ cwd_len = 0; } else if (dir_len >= 1 && (dir[0] == L'/' || dir[0] == L'\\')) { /* It's a full path without drive letter, use cwd's drive letter only */ cwd_len = 2; } else if (dir_len >= 2 && dir[1] == L':' && (dir_len < 3 || (dir[2] != L'/' && dir[2] != L'\\'))) { /* It's a relative path with drive letter (ext.g. D:../some/file) * Replace drive letter in dir by full cwd if it points to the same drive, * otherwise use the dir only. */ if (cwd_len < 2 || _wcsnicmp(cwd, dir, 2) != 0) { cwd_len = 0; } else { dir += 2; dir_len -= 2; } } else if (dir_len > 2 && dir[1] == L':') { /* It's an absolute path with drive letter * Don't use the cwd at all */ cwd_len = 0; } /* Allocate buffer for output */ result = result_pos = (WCHAR*)uv__malloc(sizeof(WCHAR) * (cwd_len + 1 + dir_len + 1 + name_len + 1 + ext_len + 1)); /* Copy cwd */ wcsncpy(result_pos, cwd, cwd_len); result_pos += cwd_len; /* Add a path separator if cwd didn't end with one */ if (cwd_len && wcsrchr(L"\\/:", result_pos[-1]) == NULL) { result_pos[0] = L'\\'; result_pos++; } /* Copy dir */ wcsncpy(result_pos, dir, dir_len); result_pos += dir_len; /* Add a separator if the dir didn't end with one */ if (dir_len && wcsrchr(L"\\/:", result_pos[-1]) == NULL) { result_pos[0] = L'\\'; result_pos++; } /* Copy filename */ wcsncpy(result_pos, name, name_len); result_pos += name_len; if (ext_len) { /* Add a dot if the filename didn't end with one */ if (name_len && result_pos[-1] != '.') { result_pos[0] = L'.'; result_pos++; } /* Copy extension */ wcsncpy(result_pos, ext, ext_len); result_pos += ext_len; } /* Null terminator */ result_pos[0] = L'\0'; attrs = GetFileAttributesW(result); if (attrs != INVALID_FILE_ATTRIBUTES && !(attrs & FILE_ATTRIBUTE_DIRECTORY)) { return result; } uv__free(result); return NULL; } /* * Helper function for search_path */ static WCHAR* path_search_walk_ext(const WCHAR *dir, size_t dir_len, const WCHAR *name, size_t name_len, WCHAR *cwd, size_t cwd_len, int name_has_ext) { WCHAR* result; /* If the name itself has a nonempty extension, try this extension first */ if (name_has_ext) { result = search_path_join_test(dir, dir_len, name, name_len, L"", 0, cwd, cwd_len); if (result != NULL) { return result; } } /* Try .com extension */ result = search_path_join_test(dir, dir_len, name, name_len, L"com", 3, cwd, cwd_len); if (result != NULL) { return result; } /* Try .exe extension */ result = search_path_join_test(dir, dir_len, name, name_len, L"exe", 3, cwd, cwd_len); if (result != NULL) { return result; } return NULL; } /* * search_path searches the system path for an executable filename - * the windows API doesn't provide this as a standalone function nor as an * option to CreateProcess. * * It tries to return an absolute filename. * * Furthermore, it tries to follow the semantics that cmd.exe, with this * exception that PATHEXT environment variable isn't used. Since CreateProcess * can start only .com and .exe files, only those extensions are tried. This * behavior equals that of msvcrt's spawn functions. * * - Do not search the path if the filename already contains a path (either * relative or absolute). * * - If there's really only a filename, check the current directory for file, * then search all path directories. * * - If filename specified has *any* extension, search for the file with the * specified extension first. * * - If the literal filename is not found in a directory, try *appending* * (not replacing) .com first and then .exe. * * - The path variable may contain relative paths; relative paths are relative * to the cwd. * * - Directories in path may or may not end with a trailing backslash. * * - CMD does not trim leading/trailing whitespace from path/pathex entries * nor from the environment variables as a whole. * * - When cmd.exe cannot read a directory, it will just skip it and go on * searching. However, unlike posix-y systems, it will happily try to run a * file that is not readable/executable; if the spawn fails it will not * continue searching. * * UNC path support: we are dealing with UNC paths in both the path and the * filename. This is a deviation from what cmd.exe does (it does not let you * start a program by specifying an UNC path on the command line) but this is * really a pointless restriction. * */ static WCHAR* search_path(const WCHAR *file, WCHAR *cwd, const WCHAR *path) { int file_has_dir; WCHAR* result = NULL; WCHAR *file_name_start; WCHAR *dot; const WCHAR *dir_start, *dir_end, *dir_path; size_t dir_len; int name_has_ext; size_t file_len = wcslen(file); size_t cwd_len = wcslen(cwd); /* If the caller supplies an empty filename, * we're not gonna return c:\windows\.exe -- GFY! */ if (file_len == 0 || (file_len == 1 && file[0] == L'.')) { return NULL; } /* Find the start of the filename so we can split the directory from the * name. */ for (file_name_start = (WCHAR*)file + file_len; file_name_start > file && file_name_start[-1] != L'\\' && file_name_start[-1] != L'/' && file_name_start[-1] != L':'; file_name_start--); file_has_dir = file_name_start != file; /* Check if the filename includes an extension */ dot = wcschr(file_name_start, L'.'); name_has_ext = (dot != NULL && dot[1] != L'\0'); if (file_has_dir) { /* The file has a path inside, don't use path */ result = path_search_walk_ext( file, file_name_start - file, file_name_start, file_len - (file_name_start - file), cwd, cwd_len, name_has_ext); } else { dir_end = path; /* The file is really only a name; look in cwd first, then scan path */ result = path_search_walk_ext(L"", 0, file, file_len, cwd, cwd_len, name_has_ext); while (result == NULL) { if (*dir_end == L'\0') { break; } /* Skip the separator that dir_end now points to */ if (dir_end != path || *path == L';') { dir_end++; } /* Next slice starts just after where the previous one ended */ dir_start = dir_end; /* If path is quoted, find quote end */ if (*dir_start == L'"' || *dir_start == L'\'') { dir_end = wcschr(dir_start + 1, *dir_start); if (dir_end == NULL) { dir_end = wcschr(dir_start, L'\0'); } } /* Slice until the next ; or \0 is found */ dir_end = wcschr(dir_end, L';'); if (dir_end == NULL) { dir_end = wcschr(dir_start, L'\0'); } /* If the slice is zero-length, don't bother */ if (dir_end - dir_start == 0) { continue; } dir_path = dir_start; dir_len = dir_end - dir_start; /* Adjust if the path is quoted. */ if (dir_path[0] == '"' || dir_path[0] == '\'') { ++dir_path; --dir_len; } if (dir_path[dir_len - 1] == '"' || dir_path[dir_len - 1] == '\'') { --dir_len; } result = path_search_walk_ext(dir_path, dir_len, file, file_len, cwd, cwd_len, name_has_ext); } } return result; } /* * Quotes command line arguments * Returns a pointer to the end (next char to be written) of the buffer */ WCHAR* quote_cmd_arg(const WCHAR *source, WCHAR *target) { size_t len = wcslen(source); size_t i; int quote_hit; WCHAR* start; if (len == 0) { /* Need double quotation for empty argument */ *(target++) = L'"'; *(target++) = L'"'; return target; } if (NULL == wcspbrk(source, L" \t\"")) { /* No quotation needed */ wcsncpy(target, source, len); target += len; return target; } if (NULL == wcspbrk(source, L"\"\\")) { /* * No embedded double quotes or backlashes, so I can just wrap * quote marks around the whole thing. */ *(target++) = L'"'; wcsncpy(target, source, len); target += len; *(target++) = L'"'; return target; } /* * Expected input/output: * input : hello"world * output: "hello\"world" * input : hello""world * output: "hello\"\"world" * input : hello\world * output: hello\world * input : hello\\world * output: hello\\world * input : hello\"world * output: "hello\\\"world" * input : hello\\"world * output: "hello\\\\\"world" * input : hello world\ * output: "hello world\\" */ *(target++) = L'"'; start = target; quote_hit = 1; for (i = len; i > 0; --i) { *(target++) = source[i - 1]; if (quote_hit && source[i - 1] == L'\\') { *(target++) = L'\\'; } else if(source[i - 1] == L'"') { quote_hit = 1; *(target++) = L'\\'; } else { quote_hit = 0; } } target[0] = L'\0'; wcsrev(start); *(target++) = L'"'; return target; } int make_program_args(char** args, int verbatim_arguments, WCHAR** dst_ptr) { char** arg; WCHAR* dst = NULL; WCHAR* temp_buffer = NULL; size_t dst_len = 0; size_t temp_buffer_len = 0; WCHAR* pos; int arg_count = 0; int err = 0; /* Count the required size. */ for (arg = args; *arg; arg++) { DWORD arg_len; arg_len = MultiByteToWideChar(CP_UTF8, 0, *arg, -1, NULL, 0); if (arg_len == 0) { return GetLastError(); } dst_len += arg_len; if (arg_len > temp_buffer_len) temp_buffer_len = arg_len; arg_count++; } /* Adjust for potential quotes. Also assume the worst-case scenario that * every character needs escaping, so we need twice as much space. */ dst_len = dst_len * 2 + arg_count * 2; /* Allocate buffer for the final command line. */ dst = (WCHAR*) uv__malloc(dst_len * sizeof(WCHAR)); if (dst == NULL) { err = ERROR_OUTOFMEMORY; goto error; } /* Allocate temporary working buffer. */ temp_buffer = (WCHAR*) uv__malloc(temp_buffer_len * sizeof(WCHAR)); if (temp_buffer == NULL) { err = ERROR_OUTOFMEMORY; goto error; } pos = dst; for (arg = args; *arg; arg++) { DWORD arg_len; /* Convert argument to wide char. */ arg_len = MultiByteToWideChar(CP_UTF8, 0, *arg, -1, temp_buffer, (int) (dst + dst_len - pos)); if (arg_len == 0) { err = GetLastError(); goto error; } if (verbatim_arguments) { /* Copy verbatim. */ wcscpy(pos, temp_buffer); pos += arg_len - 1; } else { /* Quote/escape, if needed. */ pos = quote_cmd_arg(temp_buffer, pos); } *pos++ = *(arg + 1) ? L' ' : L'\0'; } uv__free(temp_buffer); *dst_ptr = dst; return 0; error: uv__free(dst); uv__free(temp_buffer); return err; } int env_strncmp(const wchar_t* a, int na, const wchar_t* b) { wchar_t* a_eq; wchar_t* b_eq; wchar_t* A; wchar_t* B; int nb; int r; if (na < 0) { a_eq = wcschr(a, L'='); assert(a_eq); na = (int)(long)(a_eq - a); } else { na--; } b_eq = wcschr(b, L'='); assert(b_eq); nb = b_eq - b; A = (wchar_t *)alloca((na+1) * sizeof(wchar_t)); B = (wchar_t *)alloca((nb+1) * sizeof(wchar_t)); r = LCMapStringW(LOCALE_INVARIANT, LCMAP_UPPERCASE, a, na, A, na); assert(r==na); A[na] = L'\0'; r = LCMapStringW(LOCALE_INVARIANT, LCMAP_UPPERCASE, b, nb, B, nb); assert(r==nb); B[nb] = L'\0'; while (1) { wchar_t AA = *A++; wchar_t BB = *B++; if (AA < BB) { return -1; } else if (AA > BB) { return 1; } else if (!AA && !BB) { return 0; } } } static int qsort_wcscmp(const void *a, const void *b) { wchar_t* astr = *(wchar_t* const*)a; wchar_t* bstr = *(wchar_t* const*)b; return env_strncmp(astr, -1, bstr); } /* * The way windows takes environment variables is different than what C does; * Windows wants a contiguous block of null-terminated strings, terminated * with an additional null. * * Windows has a few "essential" environment variables. winsock will fail * to initialize if SYSTEMROOT is not defined; some APIs make reference to * TEMP. SYSTEMDRIVE is probably also important. We therefore ensure that * these get defined if the input environment block does not contain any * values for them. * * Also add variables known to Cygwin to be required for correct * subprocess operation in many cases: * https://github.com/Alexpux/Cygwin/blob/b266b04fbbd3a595f02ea149e4306d3ab9b1fe3d/winsup/cygwin/environ.cc#L955 * */ int make_program_env(char* env_block[], WCHAR** dst_ptr) { WCHAR* dst; WCHAR* ptr; char** env; size_t env_len = 0; int len; size_t i; DWORD var_size; size_t env_block_count = 1; /* 1 for null-terminator */ WCHAR* dst_copy; WCHAR** ptr_copy; WCHAR** env_copy; DWORD required_vars_value_len[ARRAY_SIZE(required_vars)]; /* first pass: determine size in UTF-16 */ for (env = env_block; *env; env++) { int len; if (strchr(*env, '=')) { len = MultiByteToWideChar(CP_UTF8, 0, *env, -1, NULL, 0); if (len <= 0) { return GetLastError(); } env_len += len; env_block_count++; } } /* second pass: copy to UTF-16 environment block */ dst_copy = (WCHAR*)uv__malloc(env_len * sizeof(WCHAR)); if (dst_copy == NULL && env_len > 0) { return ERROR_OUTOFMEMORY; } env_copy = (WCHAR **)alloca(env_block_count * sizeof(WCHAR*)); ptr = dst_copy; ptr_copy = env_copy; for (env = env_block; *env; env++) { if (strchr(*env, '=')) { len = MultiByteToWideChar(CP_UTF8, 0, *env, -1, ptr, (int) (env_len - (ptr - dst_copy))); if (len <= 0) { DWORD err = GetLastError(); uv__free(dst_copy); return err; } *ptr_copy++ = ptr; ptr += len; } } *ptr_copy = NULL; assert(env_len == 0 || env_len == (size_t) (ptr - dst_copy)); /* sort our (UTF-16) copy */ qsort(env_copy, env_block_count-1, sizeof(wchar_t*), qsort_wcscmp); /* third pass: check for required variables */ for (ptr_copy = env_copy, i = 0; i < ARRAY_SIZE(required_vars); ) { int cmp; if (!*ptr_copy) { cmp = -1; } else { cmp = env_strncmp(required_vars[i].wide_eq, required_vars[i].len, *ptr_copy); } if (cmp < 0) { /* missing required var */ var_size = GetEnvironmentVariableW(required_vars[i].wide, NULL, 0); required_vars_value_len[i] = var_size; if (var_size != 0) { env_len += required_vars[i].len; env_len += var_size; } i++; } else { ptr_copy++; if (cmp == 0) i++; } } /* final pass: copy, in sort order, and inserting required variables */ dst = (WCHAR *)uv__malloc((1+env_len) * sizeof(WCHAR)); if (!dst) { uv__free(dst_copy); return ERROR_OUTOFMEMORY; } for (ptr = dst, ptr_copy = env_copy, i = 0; *ptr_copy || i < ARRAY_SIZE(required_vars); ptr += len) { int cmp; if (i >= ARRAY_SIZE(required_vars)) { cmp = 1; } else if (!*ptr_copy) { cmp = -1; } else { cmp = env_strncmp(required_vars[i].wide_eq, required_vars[i].len, *ptr_copy); } if (cmp < 0) { /* missing required var */ len = required_vars_value_len[i]; if (len) { wcscpy(ptr, required_vars[i].wide_eq); ptr += required_vars[i].len; var_size = GetEnvironmentVariableW(required_vars[i].wide, ptr, (int) (env_len - (ptr - dst))); if (var_size != (DWORD) (len - 1)) { /* TODO: handle race condition? */ uv_fatal_error(GetLastError(), "GetEnvironmentVariableW"); } } i++; } else { /* copy var from env_block */ len = wcslen(*ptr_copy) + 1; wmemcpy(ptr, *ptr_copy, len); ptr_copy++; if (cmp == 0) i++; } } /* Terminate with an extra NULL. */ assert(env_len == (size_t) (ptr - dst)); *ptr = L'\0'; uv__free(dst_copy); *dst_ptr = dst; return 0; } /* * Attempt to find the value of the PATH environment variable in the child's * preprocessed environment. * * If found, a pointer into `env` is returned. If not found, NULL is returned. */ static WCHAR* find_path(WCHAR *env) { for (; env != NULL && *env != 0; env += wcslen(env) + 1) { if ((env[0] == L'P' || env[0] == L'p') && (env[1] == L'A' || env[1] == L'a') && (env[2] == L'T' || env[2] == L't') && (env[3] == L'H' || env[3] == L'h') && (env[4] == L'=')) { return &env[5]; } } return NULL; } /* * Called on Windows thread-pool thread to indicate that * a child process has exited. */ static void CALLBACK exit_wait_callback(void* data, BOOLEAN didTimeout) { uv_process_t* process = (uv_process_t*) data; uv_loop_t* loop = process->loop; assert(didTimeout == FALSE); assert(process); assert(!process->exit_cb_pending); process->exit_cb_pending = 1; /* Post completed */ POST_COMPLETION_FOR_REQ(loop, &process->exit_req); } /* Called on main thread after a child process has exited. */ void uv_process_proc_exit(uv_loop_t* loop, uv_process_t* handle) { int64_t exit_code; DWORD status; assert(handle->exit_cb_pending); handle->exit_cb_pending = 0; /* If we're closing, don't call the exit callback. Just schedule a close * callback now. */ if (handle->flags & UV_HANDLE_CLOSING) { uv_want_endgame(loop, (uv_handle_t*) handle); return; } /* Unregister from process notification. */ if (handle->wait_handle != INVALID_HANDLE_VALUE) { UnregisterWait(handle->wait_handle); handle->wait_handle = INVALID_HANDLE_VALUE; } /* Set the handle to inactive: no callbacks will be made after the exit * callback. */ uv__handle_stop(handle); if (GetExitCodeProcess(handle->process_handle, &status)) { exit_code = status; } else { /* Unable to obtain the exit code. This should never happen. */ exit_code = uv_translate_sys_error(GetLastError()); } /* Fire the exit callback. */ if (handle->exit_cb) { handle->exit_cb(handle, exit_code, handle->exit_signal); } } void uv_process_close(uv_loop_t* loop, uv_process_t* handle) { uv__handle_closing(handle); if (handle->wait_handle != INVALID_HANDLE_VALUE) { /* This blocks until either the wait was cancelled, or the callback has * completed. */ BOOL r = UnregisterWaitEx(handle->wait_handle, INVALID_HANDLE_VALUE); if (!r) { /* This should never happen, and if it happens, we can't recover... */ uv_fatal_error(GetLastError(), "UnregisterWaitEx"); } handle->wait_handle = INVALID_HANDLE_VALUE; } if (!handle->exit_cb_pending) { uv_want_endgame(loop, (uv_handle_t*)handle); } } void uv_process_endgame(uv_loop_t* loop, uv_process_t* handle) { assert(!handle->exit_cb_pending); assert(handle->flags & UV_HANDLE_CLOSING); assert(!(handle->flags & UV_HANDLE_CLOSED)); /* Clean-up the process handle. */ CloseHandle(handle->process_handle); uv__handle_close(handle); } int uv_spawn(uv_loop_t* loop, uv_process_t* process, const uv_process_options_t* options) { int i; int err = 0; WCHAR* path = NULL, *alloc_path = NULL; BOOL result; WCHAR* application_path = NULL, *application = NULL, *arguments = NULL, *env = NULL, *cwd = NULL; STARTUPINFOW startup; PROCESS_INFORMATION info; DWORD process_flags; uv_process_init(loop, process); process->exit_cb = options->exit_cb; if (options->flags & (UV_PROCESS_SETGID | UV_PROCESS_SETUID)) { return UV_ENOTSUP; } if (options->file == NULL || options->args == NULL) { return UV_EINVAL; } assert(options->file != NULL); assert(!(options->flags & ~(UV_PROCESS_DETACHED | UV_PROCESS_SETGID | UV_PROCESS_SETUID | UV_PROCESS_WINDOWS_HIDE | UV_PROCESS_WINDOWS_HIDE_CONSOLE | UV_PROCESS_WINDOWS_HIDE_GUI | UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS))); err = uv_utf8_to_utf16_alloc(options->file, &application); if (err) goto done; err = make_program_args( options->args, options->flags & UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS, &arguments); if (err) goto done; if (options->env) { err = make_program_env(options->env, &env); if (err) goto done; } if (options->cwd) { /* Explicit cwd */ err = uv_utf8_to_utf16_alloc(options->cwd, &cwd); if (err) goto done; } else { /* Inherit cwd */ DWORD cwd_len, r; cwd_len = GetCurrentDirectoryW(0, NULL); if (!cwd_len) { err = GetLastError(); goto done; } cwd = (WCHAR*) uv__malloc(cwd_len * sizeof(WCHAR)); if (cwd == NULL) { err = ERROR_OUTOFMEMORY; goto done; } r = GetCurrentDirectoryW(cwd_len, cwd); if (r == 0 || r >= cwd_len) { err = GetLastError(); goto done; } } /* Get PATH environment variable. */ path = find_path(env); if (path == NULL) { DWORD path_len, r; path_len = GetEnvironmentVariableW(L"PATH", NULL, 0); if (path_len == 0) { err = GetLastError(); goto done; } alloc_path = (WCHAR*) uv__malloc(path_len * sizeof(WCHAR)); if (alloc_path == NULL) { err = ERROR_OUTOFMEMORY; goto done; } path = alloc_path; r = GetEnvironmentVariableW(L"PATH", path, path_len); if (r == 0 || r >= path_len) { err = GetLastError(); goto done; } } err = uv__stdio_create(loop, options, &process->child_stdio_buffer); if (err) goto done; application_path = search_path(application, cwd, path); if (application_path == NULL) { /* Not found. */ err = ERROR_FILE_NOT_FOUND; goto done; } startup.cb = sizeof(startup); startup.lpReserved = NULL; startup.lpDesktop = NULL; startup.lpTitle = NULL; startup.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; startup.cbReserved2 = uv__stdio_size(process->child_stdio_buffer); startup.lpReserved2 = (BYTE*) process->child_stdio_buffer; startup.hStdInput = uv__stdio_handle(process->child_stdio_buffer, 0); startup.hStdOutput = uv__stdio_handle(process->child_stdio_buffer, 1); startup.hStdError = uv__stdio_handle(process->child_stdio_buffer, 2); process_flags = CREATE_UNICODE_ENVIRONMENT; if ((options->flags & UV_PROCESS_WINDOWS_HIDE_CONSOLE) || (options->flags & UV_PROCESS_WINDOWS_HIDE)) { /* Avoid creating console window if stdio is not inherited. */ for (i = 0; i < options->stdio_count; i++) { if (options->stdio[i].flags & UV_INHERIT_FD) break; if (i == options->stdio_count - 1) process_flags |= CREATE_NO_WINDOW; } } if ((options->flags & UV_PROCESS_WINDOWS_HIDE_GUI) || (options->flags & UV_PROCESS_WINDOWS_HIDE)) { /* Use SW_HIDE to avoid any potential process window. */ startup.wShowWindow = SW_HIDE; } else { startup.wShowWindow = SW_SHOWDEFAULT; } if (options->flags & UV_PROCESS_DETACHED) { /* Note that we're not setting the CREATE_BREAKAWAY_FROM_JOB flag. That * means that libuv might not let you create a fully daemonized process * when run under job control. However the type of job control that libuv * itself creates doesn't trickle down to subprocesses so they can still * daemonize. * * A reason to not do this is that CREATE_BREAKAWAY_FROM_JOB makes the * CreateProcess call fail if we're under job control that doesn't allow * breakaway. */ process_flags |= DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP; } if (!CreateProcessW(application_path, arguments, NULL, NULL, 1, process_flags, env, cwd, &startup, &info)) { /* CreateProcessW failed. */ err = GetLastError(); goto done; } /* Spawn succeeded. Beyond this point, failure is reported asynchronously. */ process->process_handle = info.hProcess; process->pid = info.dwProcessId; /* If the process isn't spawned as detached, assign to the global job object * so windows will kill it when the parent process dies. */ if (!(options->flags & UV_PROCESS_DETACHED)) { uv_once(&uv_global_job_handle_init_guard_, uv__init_global_job_handle); if (!AssignProcessToJobObject(uv_global_job_handle_, info.hProcess)) { /* AssignProcessToJobObject might fail if this process is under job * control and the job doesn't have the * JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK flag set, on a Windows version * that doesn't support nested jobs. * * When that happens we just swallow the error and continue without * establishing a kill-child-on-parent-exit relationship, otherwise * there would be no way for libuv applications run under job control * to spawn processes at all. */ DWORD err = GetLastError(); if (err != ERROR_ACCESS_DENIED) uv_fatal_error(err, "AssignProcessToJobObject"); } } /* Set IPC pid to all IPC pipes. */ for (i = 0; i < options->stdio_count; i++) { const uv_stdio_container_t* fdopt = &options->stdio[i]; if (fdopt->flags & UV_CREATE_PIPE && fdopt->data.stream->type == UV_NAMED_PIPE && ((uv_pipe_t*) fdopt->data.stream)->ipc) { ((uv_pipe_t*) fdopt->data.stream)->pipe.conn.ipc_remote_pid = info.dwProcessId; } } /* Setup notifications for when the child process exits. */ result = RegisterWaitForSingleObject(&process->wait_handle, process->process_handle, exit_wait_callback, (void*)process, INFINITE, WT_EXECUTEINWAITTHREAD | WT_EXECUTEONLYONCE); if (!result) { uv_fatal_error(GetLastError(), "RegisterWaitForSingleObject"); } CloseHandle(info.hThread); assert(!err); /* Make the handle active. It will remain active until the exit callback is * made or the handle is closed, whichever happens first. */ uv__handle_start(process); /* Cleanup, whether we succeeded or failed. */ done: uv__free(application); uv__free(application_path); uv__free(arguments); uv__free(cwd); uv__free(env); uv__free(alloc_path); if (process->child_stdio_buffer != NULL) { /* Clean up child stdio handles. */ uv__stdio_destroy(process->child_stdio_buffer); process->child_stdio_buffer = NULL; } return uv_translate_sys_error(err); } static int uv__kill(HANDLE process_handle, int signum) { if (signum < 0 || signum >= NSIG) { return UV_EINVAL; } switch (signum) { case SIGTERM: case SIGKILL: case SIGINT: { /* Unconditionally terminate the process. On Windows, killed processes * normally return 1. */ DWORD status; int err; if (TerminateProcess(process_handle, 1)) return 0; /* If the process already exited before TerminateProcess was called,. * TerminateProcess will fail with ERROR_ACCESS_DENIED. */ err = GetLastError(); if (err == ERROR_ACCESS_DENIED && GetExitCodeProcess(process_handle, &status) && status != STILL_ACTIVE) { return UV_ESRCH; } return uv_translate_sys_error(err); } case 0: { /* Health check: is the process still alive? */ DWORD status; if (!GetExitCodeProcess(process_handle, &status)) return uv_translate_sys_error(GetLastError()); if (status != STILL_ACTIVE) return UV_ESRCH; return 0; } default: /* Unsupported signal. */ return UV_ENOSYS; } } int uv_process_kill(uv_process_t* process, int signum) { int err; if (process->process_handle == INVALID_HANDLE_VALUE) { return UV_EINVAL; } err = uv__kill(process->process_handle, signum); if (err) { return err; /* err is already translated. */ } process->exit_signal = signum; return 0; } int uv_kill(int pid, int signum) { int err; HANDLE process_handle; if (pid == 0) { process_handle = GetCurrentProcess(); } else { process_handle = OpenProcess(PROCESS_TERMINATE | PROCESS_QUERY_INFORMATION, FALSE, pid); } if (process_handle == NULL) { err = GetLastError(); if (err == ERROR_INVALID_PARAMETER) { return UV_ESRCH; } else { return uv_translate_sys_error(err); } } err = uv__kill(process_handle, signum); CloseHandle(process_handle); return err; /* err is already translated. */ } ================================================ FILE: external/libuv/src/win/req-inl.h ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #ifndef UV_WIN_REQ_INL_H_ #define UV_WIN_REQ_INL_H_ #include #include "uv.h" #include "internal.h" #define SET_REQ_STATUS(req, status) \ (req)->u.io.overlapped.Internal = (ULONG_PTR) (status) #define SET_REQ_ERROR(req, error) \ SET_REQ_STATUS((req), NTSTATUS_FROM_WIN32((error))) /* Note: used open-coded in UV_REQ_INIT() because of a circular dependency * between src/uv-common.h and src/win/internal.h. */ #define SET_REQ_SUCCESS(req) \ SET_REQ_STATUS((req), STATUS_SUCCESS) #define GET_REQ_STATUS(req) \ ((NTSTATUS) (req)->u.io.overlapped.Internal) #define REQ_SUCCESS(req) \ (NT_SUCCESS(GET_REQ_STATUS((req)))) #define GET_REQ_ERROR(req) \ (pRtlNtStatusToDosError(GET_REQ_STATUS((req)))) #define GET_REQ_SOCK_ERROR(req) \ (uv_ntstatus_to_winsock_error(GET_REQ_STATUS((req)))) #define REGISTER_HANDLE_REQ(loop, handle, req) \ do { \ INCREASE_ACTIVE_COUNT((loop), (handle)); \ uv__req_register((loop), (req)); \ } while (0) #define UNREGISTER_HANDLE_REQ(loop, handle, req) \ do { \ DECREASE_ACTIVE_COUNT((loop), (handle)); \ uv__req_unregister((loop), (req)); \ } while (0) #define UV_SUCCEEDED_WITHOUT_IOCP(result) \ ((result) && (handle->flags & UV_HANDLE_SYNC_BYPASS_IOCP)) #define UV_SUCCEEDED_WITH_IOCP(result) \ ((result) || (GetLastError() == ERROR_IO_PENDING)) #define POST_COMPLETION_FOR_REQ(loop, req) \ if (!PostQueuedCompletionStatus((loop)->iocp, \ 0, \ 0, \ &((req)->u.io.overlapped))) { \ uv_fatal_error(GetLastError(), "PostQueuedCompletionStatus"); \ } INLINE static uv_req_t* uv_overlapped_to_req(OVERLAPPED* overlapped) { return CONTAINING_RECORD(overlapped, uv_req_t, u.io.overlapped); } INLINE static void uv_insert_pending_req(uv_loop_t* loop, uv_req_t* req) { req->next_req = NULL; if (loop->pending_reqs_tail) { #ifdef _DEBUG /* Ensure the request is not already in the queue, or the queue * will get corrupted. */ uv_req_t* current = loop->pending_reqs_tail; do { assert(req != current); current = current->next_req; } while(current != loop->pending_reqs_tail); #endif req->next_req = loop->pending_reqs_tail->next_req; loop->pending_reqs_tail->next_req = req; loop->pending_reqs_tail = req; } else { req->next_req = req; loop->pending_reqs_tail = req; } } #define DELEGATE_STREAM_REQ(loop, req, method, handle_at) \ do { \ switch (((uv_handle_t*) (req)->handle_at)->type) { \ case UV_TCP: \ uv_process_tcp_##method##_req(loop, \ (uv_tcp_t*) ((req)->handle_at), \ req); \ break; \ \ case UV_NAMED_PIPE: \ uv_process_pipe_##method##_req(loop, \ (uv_pipe_t*) ((req)->handle_at), \ req); \ break; \ \ case UV_TTY: \ uv_process_tty_##method##_req(loop, \ (uv_tty_t*) ((req)->handle_at), \ req); \ break; \ \ default: \ assert(0); \ } \ } while (0) INLINE static int uv_process_reqs(uv_loop_t* loop) { uv_req_t* req; uv_req_t* first; uv_req_t* next; if (loop->pending_reqs_tail == NULL) return 0; first = loop->pending_reqs_tail->next_req; next = first; loop->pending_reqs_tail = NULL; while (next != NULL) { req = next; next = req->next_req != first ? req->next_req : NULL; switch (req->type) { case UV_READ: DELEGATE_STREAM_REQ(loop, req, read, data); break; case UV_WRITE: DELEGATE_STREAM_REQ(loop, (uv_write_t*) req, write, handle); break; case UV_ACCEPT: DELEGATE_STREAM_REQ(loop, req, accept, data); break; case UV_CONNECT: DELEGATE_STREAM_REQ(loop, (uv_connect_t*) req, connect, handle); break; case UV_SHUTDOWN: /* Tcp shutdown requests don't come here. */ assert(((uv_shutdown_t*) req)->handle->type == UV_NAMED_PIPE); uv_process_pipe_shutdown_req( loop, (uv_pipe_t*) ((uv_shutdown_t*) req)->handle, (uv_shutdown_t*) req); break; case UV_UDP_RECV: uv_process_udp_recv_req(loop, (uv_udp_t*) req->data, req); break; case UV_UDP_SEND: uv_process_udp_send_req(loop, ((uv_udp_send_t*) req)->handle, (uv_udp_send_t*) req); break; case UV_WAKEUP: uv_process_async_wakeup_req(loop, (uv_async_t*) req->data, req); break; case UV_SIGNAL_REQ: uv_process_signal_req(loop, (uv_signal_t*) req->data, req); break; case UV_POLL_REQ: uv_process_poll_req(loop, (uv_poll_t*) req->data, req); break; case UV_PROCESS_EXIT: uv_process_proc_exit(loop, (uv_process_t*) req->data); break; case UV_FS_EVENT_REQ: uv_process_fs_event_req(loop, req, (uv_fs_event_t*) req->data); break; default: assert(0); } } return 1; } #endif /* UV_WIN_REQ_INL_H_ */ ================================================ FILE: external/libuv/src/win/signal.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include "uv.h" #include "internal.h" #include "handle-inl.h" #include "req-inl.h" RB_HEAD(uv_signal_tree_s, uv_signal_s); static struct uv_signal_tree_s uv__signal_tree = RB_INITIALIZER(uv__signal_tree); static CRITICAL_SECTION uv__signal_lock; static BOOL WINAPI uv__signal_control_handler(DWORD type); int uv__signal_start(uv_signal_t* handle, uv_signal_cb signal_cb, int signum, int oneshot); void uv_signals_init(void) { InitializeCriticalSection(&uv__signal_lock); if (!SetConsoleCtrlHandler(uv__signal_control_handler, TRUE)) abort(); } void uv__signal_cleanup(void) { /* TODO(bnoordhuis) Undo effects of uv_signal_init()? */ } static int uv__signal_compare(uv_signal_t* w1, uv_signal_t* w2) { /* Compare signums first so all watchers with the same signnum end up * adjacent. */ if (w1->signum < w2->signum) return -1; if (w1->signum > w2->signum) return 1; /* Sort by loop pointer, so we can easily look up the first item after * { .signum = x, .loop = NULL }. */ if ((uintptr_t) w1->loop < (uintptr_t) w2->loop) return -1; if ((uintptr_t) w1->loop > (uintptr_t) w2->loop) return 1; if ((uintptr_t) w1 < (uintptr_t) w2) return -1; if ((uintptr_t) w1 > (uintptr_t) w2) return 1; return 0; } RB_GENERATE_STATIC(uv_signal_tree_s, uv_signal_s, tree_entry, uv__signal_compare) /* * Dispatches signal {signum} to all active uv_signal_t watchers in all loops. * Returns 1 if the signal was dispatched to any watcher, or 0 if there were * no active signal watchers observing this signal. */ int uv__signal_dispatch(int signum) { uv_signal_t lookup; uv_signal_t* handle; int dispatched; dispatched = 0; EnterCriticalSection(&uv__signal_lock); lookup.signum = signum; lookup.loop = NULL; for (handle = RB_NFIND(uv_signal_tree_s, &uv__signal_tree, &lookup); handle != NULL && handle->signum == signum; handle = RB_NEXT(uv_signal_tree_s, &uv__signal_tree, handle)) { unsigned long previous = InterlockedExchange( (volatile LONG*) &handle->pending_signum, signum); if (handle->flags & UV_SIGNAL_ONE_SHOT_DISPATCHED) continue; if (!previous) { POST_COMPLETION_FOR_REQ(handle->loop, &handle->signal_req); } dispatched = 1; if (handle->flags & UV_SIGNAL_ONE_SHOT) handle->flags |= UV_SIGNAL_ONE_SHOT_DISPATCHED; } LeaveCriticalSection(&uv__signal_lock); return dispatched; } static BOOL WINAPI uv__signal_control_handler(DWORD type) { switch (type) { case CTRL_C_EVENT: return uv__signal_dispatch(SIGINT); case CTRL_BREAK_EVENT: return uv__signal_dispatch(SIGBREAK); case CTRL_CLOSE_EVENT: if (uv__signal_dispatch(SIGHUP)) { /* Windows will terminate the process after the control handler * returns. After that it will just terminate our process. Therefore * block the signal handler so the main loop has some time to pick up * the signal and do something for a few seconds. */ Sleep(INFINITE); return TRUE; } return FALSE; case CTRL_LOGOFF_EVENT: case CTRL_SHUTDOWN_EVENT: /* These signals are only sent to services. Services have their own * notification mechanism, so there's no point in handling these. */ default: /* We don't handle these. */ return FALSE; } } int uv_signal_init(uv_loop_t* loop, uv_signal_t* handle) { uv__handle_init(loop, (uv_handle_t*) handle, UV_SIGNAL); handle->pending_signum = 0; handle->signum = 0; handle->signal_cb = NULL; UV_REQ_INIT(&handle->signal_req, UV_SIGNAL_REQ); handle->signal_req.data = handle; return 0; } int uv_signal_stop(uv_signal_t* handle) { uv_signal_t* removed_handle; /* If the watcher wasn't started, this is a no-op. */ if (handle->signum == 0) return 0; EnterCriticalSection(&uv__signal_lock); removed_handle = RB_REMOVE(uv_signal_tree_s, &uv__signal_tree, handle); assert(removed_handle == handle); LeaveCriticalSection(&uv__signal_lock); handle->signum = 0; uv__handle_stop(handle); return 0; } int uv_signal_start(uv_signal_t* handle, uv_signal_cb signal_cb, int signum) { return uv__signal_start(handle, signal_cb, signum, 0); } int uv_signal_start_oneshot(uv_signal_t* handle, uv_signal_cb signal_cb, int signum) { return uv__signal_start(handle, signal_cb, signum, 1); } int uv__signal_start(uv_signal_t* handle, uv_signal_cb signal_cb, int signum, int oneshot) { /* Test for invalid signal values. */ if (signum <= 0 || signum >= NSIG) return UV_EINVAL; /* Short circuit: if the signal watcher is already watching {signum} don't go * through the process of deregistering and registering the handler. * Additionally, this avoids pending signals getting lost in the (small) time * frame that handle->signum == 0. */ if (signum == handle->signum) { handle->signal_cb = signal_cb; return 0; } /* If the signal handler was already active, stop it first. */ if (handle->signum != 0) { int r = uv_signal_stop(handle); /* uv_signal_stop is infallible. */ assert(r == 0); } EnterCriticalSection(&uv__signal_lock); handle->signum = signum; if (oneshot) handle->flags |= UV_SIGNAL_ONE_SHOT; RB_INSERT(uv_signal_tree_s, &uv__signal_tree, handle); LeaveCriticalSection(&uv__signal_lock); handle->signal_cb = signal_cb; uv__handle_start(handle); return 0; } void uv_process_signal_req(uv_loop_t* loop, uv_signal_t* handle, uv_req_t* req) { long dispatched_signum; assert(handle->type == UV_SIGNAL); assert(req->type == UV_SIGNAL_REQ); dispatched_signum = InterlockedExchange( (volatile LONG*) &handle->pending_signum, 0); assert(dispatched_signum != 0); /* Check if the pending signal equals the signum that we are watching for. * These can get out of sync when the handler is stopped and restarted while * the signal_req is pending. */ if (dispatched_signum == handle->signum) handle->signal_cb(handle, dispatched_signum); if (handle->flags & UV_SIGNAL_ONE_SHOT) uv_signal_stop(handle); if (handle->flags & UV_HANDLE_CLOSING) { /* When it is closing, it must be stopped at this point. */ assert(handle->signum == 0); uv_want_endgame(loop, (uv_handle_t*) handle); } } void uv_signal_close(uv_loop_t* loop, uv_signal_t* handle) { uv_signal_stop(handle); uv__handle_closing(handle); if (handle->pending_signum == 0) { uv_want_endgame(loop, (uv_handle_t*) handle); } } void uv_signal_endgame(uv_loop_t* loop, uv_signal_t* handle) { assert(handle->flags & UV_HANDLE_CLOSING); assert(!(handle->flags & UV_HANDLE_CLOSED)); assert(handle->signum == 0); assert(handle->pending_signum == 0); handle->flags |= UV_HANDLE_CLOSED; uv__handle_close(handle); } ================================================ FILE: external/libuv/src/win/snprintf.c ================================================ /* Copyright the libuv project contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #if defined(_MSC_VER) && _MSC_VER < 1900 #include #include /* Emulate snprintf() on MSVC<2015, _snprintf() doesn't zero-terminate the buffer * on overflow... */ int snprintf(char* buf, size_t len, const char* fmt, ...) { int n; va_list ap; va_start(ap, fmt); n = _vscprintf(fmt, ap); vsnprintf_s(buf, len, _TRUNCATE, fmt, ap); va_end(ap); return n; } #endif ================================================ FILE: external/libuv/src/win/stream-inl.h ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #ifndef UV_WIN_STREAM_INL_H_ #define UV_WIN_STREAM_INL_H_ #include #include "uv.h" #include "internal.h" #include "handle-inl.h" #include "req-inl.h" INLINE static void uv_stream_init(uv_loop_t* loop, uv_stream_t* handle, uv_handle_type type) { uv__handle_init(loop, (uv_handle_t*) handle, type); handle->write_queue_size = 0; handle->activecnt = 0; handle->stream.conn.shutdown_req = NULL; handle->stream.conn.write_reqs_pending = 0; UV_REQ_INIT(&handle->read_req, UV_READ); handle->read_req.event_handle = NULL; handle->read_req.wait_handle = INVALID_HANDLE_VALUE; handle->read_req.data = handle; } INLINE static void uv_connection_init(uv_stream_t* handle) { handle->flags |= UV_HANDLE_CONNECTION; } #endif /* UV_WIN_STREAM_INL_H_ */ ================================================ FILE: external/libuv/src/win/stream.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include "uv.h" #include "internal.h" #include "handle-inl.h" #include "req-inl.h" int uv_listen(uv_stream_t* stream, int backlog, uv_connection_cb cb) { int err; err = ERROR_INVALID_PARAMETER; switch (stream->type) { case UV_TCP: err = uv_tcp_listen((uv_tcp_t*)stream, backlog, cb); break; case UV_NAMED_PIPE: err = uv_pipe_listen((uv_pipe_t*)stream, backlog, cb); break; default: assert(0); } return uv_translate_sys_error(err); } int uv_accept(uv_stream_t* server, uv_stream_t* client) { int err; err = ERROR_INVALID_PARAMETER; switch (server->type) { case UV_TCP: err = uv_tcp_accept((uv_tcp_t*)server, (uv_tcp_t*)client); break; case UV_NAMED_PIPE: err = uv_pipe_accept((uv_pipe_t*)server, client); break; default: assert(0); } return uv_translate_sys_error(err); } int uv_read_start(uv_stream_t* handle, uv_alloc_cb alloc_cb, uv_read_cb read_cb) { int err; if (handle->flags & UV_HANDLE_READING) { return UV_EALREADY; } if (!(handle->flags & UV_HANDLE_READABLE)) { return UV_ENOTCONN; } err = ERROR_INVALID_PARAMETER; switch (handle->type) { case UV_TCP: err = uv_tcp_read_start((uv_tcp_t*)handle, alloc_cb, read_cb); break; case UV_NAMED_PIPE: err = uv_pipe_read_start((uv_pipe_t*)handle, alloc_cb, read_cb); break; case UV_TTY: err = uv_tty_read_start((uv_tty_t*) handle, alloc_cb, read_cb); break; default: assert(0); } return uv_translate_sys_error(err); } int uv_read_stop(uv_stream_t* handle) { int err; if (!(handle->flags & UV_HANDLE_READING)) return 0; err = 0; if (handle->type == UV_TTY) { err = uv_tty_read_stop((uv_tty_t*) handle); } else if (handle->type == UV_NAMED_PIPE) { uv__pipe_read_stop((uv_pipe_t*) handle); } else { handle->flags &= ~UV_HANDLE_READING; DECREASE_ACTIVE_COUNT(handle->loop, handle); } return uv_translate_sys_error(err); } int uv_write(uv_write_t* req, uv_stream_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb) { uv_loop_t* loop = handle->loop; int err; if (!(handle->flags & UV_HANDLE_WRITABLE)) { return UV_EPIPE; } err = ERROR_INVALID_PARAMETER; switch (handle->type) { case UV_TCP: err = uv_tcp_write(loop, req, (uv_tcp_t*) handle, bufs, nbufs, cb); break; case UV_NAMED_PIPE: err = uv__pipe_write( loop, req, (uv_pipe_t*) handle, bufs, nbufs, NULL, cb); break; case UV_TTY: err = uv_tty_write(loop, req, (uv_tty_t*) handle, bufs, nbufs, cb); break; default: assert(0); } return uv_translate_sys_error(err); } int uv_write2(uv_write_t* req, uv_stream_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_stream_t* send_handle, uv_write_cb cb) { uv_loop_t* loop = handle->loop; int err; if (send_handle == NULL) { return uv_write(req, handle, bufs, nbufs, cb); } if (handle->type != UV_NAMED_PIPE || !((uv_pipe_t*) handle)->ipc) { return UV_EINVAL; } else if (!(handle->flags & UV_HANDLE_WRITABLE)) { return UV_EPIPE; } err = uv__pipe_write( loop, req, (uv_pipe_t*) handle, bufs, nbufs, send_handle, cb); return uv_translate_sys_error(err); } int uv_try_write(uv_stream_t* stream, const uv_buf_t bufs[], unsigned int nbufs) { if (stream->flags & UV_HANDLE_CLOSING) return UV_EBADF; if (!(stream->flags & UV_HANDLE_WRITABLE)) return UV_EPIPE; switch (stream->type) { case UV_TCP: return uv__tcp_try_write((uv_tcp_t*) stream, bufs, nbufs); case UV_TTY: return uv__tty_try_write((uv_tty_t*) stream, bufs, nbufs); case UV_NAMED_PIPE: return UV_EAGAIN; default: assert(0); return UV_ENOSYS; } } int uv_shutdown(uv_shutdown_t* req, uv_stream_t* handle, uv_shutdown_cb cb) { uv_loop_t* loop = handle->loop; if (!(handle->flags & UV_HANDLE_WRITABLE) || handle->flags & UV_HANDLE_SHUTTING || uv__is_closing(handle)) { return UV_ENOTCONN; } UV_REQ_INIT(req, UV_SHUTDOWN); req->handle = handle; req->cb = cb; handle->flags &= ~UV_HANDLE_WRITABLE; handle->flags |= UV_HANDLE_SHUTTING; handle->stream.conn.shutdown_req = req; handle->reqs_pending++; REGISTER_HANDLE_REQ(loop, handle, req); uv_want_endgame(loop, (uv_handle_t*)handle); return 0; } int uv_is_readable(const uv_stream_t* handle) { return !!(handle->flags & UV_HANDLE_READABLE); } int uv_is_writable(const uv_stream_t* handle) { return !!(handle->flags & UV_HANDLE_WRITABLE); } int uv_stream_set_blocking(uv_stream_t* handle, int blocking) { if (handle->type != UV_NAMED_PIPE) return UV_EINVAL; if (blocking != 0) handle->flags |= UV_HANDLE_BLOCKING_WRITES; else handle->flags &= ~UV_HANDLE_BLOCKING_WRITES; return 0; } ================================================ FILE: external/libuv/src/win/tcp.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include "uv.h" #include "internal.h" #include "handle-inl.h" #include "stream-inl.h" #include "req-inl.h" /* * Threshold of active tcp streams for which to preallocate tcp read buffers. * (Due to node slab allocator performing poorly under this pattern, * the optimization is temporarily disabled (threshold=0). This will be * revisited once node allocator is improved.) */ const unsigned int uv_active_tcp_streams_threshold = 0; /* * Number of simultaneous pending AcceptEx calls. */ const unsigned int uv_simultaneous_server_accepts = 32; /* A zero-size buffer for use by uv_tcp_read */ static char uv_zero_[] = ""; static int uv__tcp_nodelay(uv_tcp_t* handle, SOCKET socket, int enable) { if (setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, (const char*)&enable, sizeof enable) == -1) { return WSAGetLastError(); } return 0; } static int uv__tcp_keepalive(uv_tcp_t* handle, SOCKET socket, int enable, unsigned int delay) { if (setsockopt(socket, SOL_SOCKET, SO_KEEPALIVE, (const char*)&enable, sizeof enable) == -1) { return WSAGetLastError(); } if (enable && setsockopt(socket, IPPROTO_TCP, TCP_KEEPALIVE, (const char*)&delay, sizeof delay) == -1) { return WSAGetLastError(); } return 0; } static int uv_tcp_set_socket(uv_loop_t* loop, uv_tcp_t* handle, SOCKET socket, int family, int imported) { DWORD yes = 1; int non_ifs_lsp; int err; if (handle->socket != INVALID_SOCKET) return UV_EBUSY; /* Set the socket to nonblocking mode */ if (ioctlsocket(socket, FIONBIO, &yes) == SOCKET_ERROR) { return WSAGetLastError(); } /* Make the socket non-inheritable */ if (!SetHandleInformation((HANDLE) socket, HANDLE_FLAG_INHERIT, 0)) return GetLastError(); /* Associate it with the I/O completion port. Use uv_handle_t pointer as * completion key. */ if (CreateIoCompletionPort((HANDLE)socket, loop->iocp, (ULONG_PTR)socket, 0) == NULL) { if (imported) { handle->flags |= UV_HANDLE_EMULATE_IOCP; } else { return GetLastError(); } } if (family == AF_INET6) { non_ifs_lsp = uv_tcp_non_ifs_lsp_ipv6; } else { non_ifs_lsp = uv_tcp_non_ifs_lsp_ipv4; } if (!(handle->flags & UV_HANDLE_EMULATE_IOCP) && !non_ifs_lsp) { UCHAR sfcnm_flags = FILE_SKIP_SET_EVENT_ON_HANDLE | FILE_SKIP_COMPLETION_PORT_ON_SUCCESS; if (!SetFileCompletionNotificationModes((HANDLE) socket, sfcnm_flags)) return GetLastError(); handle->flags |= UV_HANDLE_SYNC_BYPASS_IOCP; } if (handle->flags & UV_HANDLE_TCP_NODELAY) { err = uv__tcp_nodelay(handle, socket, 1); if (err) return err; } /* TODO: Use stored delay. */ if (handle->flags & UV_HANDLE_TCP_KEEPALIVE) { err = uv__tcp_keepalive(handle, socket, 1, 60); if (err) return err; } handle->socket = socket; if (family == AF_INET6) { handle->flags |= UV_HANDLE_IPV6; } else { assert(!(handle->flags & UV_HANDLE_IPV6)); } return 0; } int uv_tcp_init_ex(uv_loop_t* loop, uv_tcp_t* handle, unsigned int flags) { int domain; /* Use the lower 8 bits for the domain */ domain = flags & 0xFF; if (domain != AF_INET && domain != AF_INET6 && domain != AF_UNSPEC) return UV_EINVAL; if (flags & ~0xFF) return UV_EINVAL; uv_stream_init(loop, (uv_stream_t*) handle, UV_TCP); handle->tcp.serv.accept_reqs = NULL; handle->tcp.serv.pending_accepts = NULL; handle->socket = INVALID_SOCKET; handle->reqs_pending = 0; handle->tcp.serv.func_acceptex = NULL; handle->tcp.conn.func_connectex = NULL; handle->tcp.serv.processed_accepts = 0; handle->delayed_error = 0; /* If anything fails beyond this point we need to remove the handle from * the handle queue, since it was added by uv__handle_init in uv_stream_init. */ if (domain != AF_UNSPEC) { SOCKET sock; DWORD err; sock = socket(domain, SOCK_STREAM, 0); if (sock == INVALID_SOCKET) { err = WSAGetLastError(); QUEUE_REMOVE(&handle->handle_queue); return uv_translate_sys_error(err); } err = uv_tcp_set_socket(handle->loop, handle, sock, domain, 0); if (err) { closesocket(sock); QUEUE_REMOVE(&handle->handle_queue); return uv_translate_sys_error(err); } } return 0; } int uv_tcp_init(uv_loop_t* loop, uv_tcp_t* handle) { return uv_tcp_init_ex(loop, handle, AF_UNSPEC); } void uv_tcp_endgame(uv_loop_t* loop, uv_tcp_t* handle) { int err; unsigned int i; uv_tcp_accept_t* req; if (handle->flags & UV_HANDLE_CONNECTION && handle->stream.conn.shutdown_req != NULL && handle->stream.conn.write_reqs_pending == 0) { UNREGISTER_HANDLE_REQ(loop, handle, handle->stream.conn.shutdown_req); err = 0; if (handle->flags & UV_HANDLE_CLOSING) { err = ERROR_OPERATION_ABORTED; } else if (shutdown(handle->socket, SD_SEND) == SOCKET_ERROR) { err = WSAGetLastError(); } if (handle->stream.conn.shutdown_req->cb) { handle->stream.conn.shutdown_req->cb(handle->stream.conn.shutdown_req, uv_translate_sys_error(err)); } handle->stream.conn.shutdown_req = NULL; DECREASE_PENDING_REQ_COUNT(handle); return; } if (handle->flags & UV_HANDLE_CLOSING && handle->reqs_pending == 0) { assert(!(handle->flags & UV_HANDLE_CLOSED)); if (!(handle->flags & UV_HANDLE_TCP_SOCKET_CLOSED)) { closesocket(handle->socket); handle->socket = INVALID_SOCKET; handle->flags |= UV_HANDLE_TCP_SOCKET_CLOSED; } if (!(handle->flags & UV_HANDLE_CONNECTION) && handle->tcp.serv.accept_reqs) { if (handle->flags & UV_HANDLE_EMULATE_IOCP) { for (i = 0; i < uv_simultaneous_server_accepts; i++) { req = &handle->tcp.serv.accept_reqs[i]; if (req->wait_handle != INVALID_HANDLE_VALUE) { UnregisterWait(req->wait_handle); req->wait_handle = INVALID_HANDLE_VALUE; } if (req->event_handle != NULL) { CloseHandle(req->event_handle); req->event_handle = NULL; } } } uv__free(handle->tcp.serv.accept_reqs); handle->tcp.serv.accept_reqs = NULL; } if (handle->flags & UV_HANDLE_CONNECTION && handle->flags & UV_HANDLE_EMULATE_IOCP) { if (handle->read_req.wait_handle != INVALID_HANDLE_VALUE) { UnregisterWait(handle->read_req.wait_handle); handle->read_req.wait_handle = INVALID_HANDLE_VALUE; } if (handle->read_req.event_handle != NULL) { CloseHandle(handle->read_req.event_handle); handle->read_req.event_handle = NULL; } } uv__handle_close(handle); loop->active_tcp_streams--; } } /* Unlike on Unix, here we don't set SO_REUSEADDR, because it doesn't just * allow binding to addresses that are in use by sockets in TIME_WAIT, it * effectively allows 'stealing' a port which is in use by another application. * * SO_EXCLUSIVEADDRUSE is also not good here because it does check all sockets, * regardless of state, so we'd get an error even if the port is in use by a * socket in TIME_WAIT state. * * See issue #1360. * */ static int uv_tcp_try_bind(uv_tcp_t* handle, const struct sockaddr* addr, unsigned int addrlen, unsigned int flags) { DWORD err; int r; if (handle->socket == INVALID_SOCKET) { SOCKET sock; /* Cannot set IPv6-only mode on non-IPv6 socket. */ if ((flags & UV_TCP_IPV6ONLY) && addr->sa_family != AF_INET6) return ERROR_INVALID_PARAMETER; sock = socket(addr->sa_family, SOCK_STREAM, 0); if (sock == INVALID_SOCKET) { return WSAGetLastError(); } err = uv_tcp_set_socket(handle->loop, handle, sock, addr->sa_family, 0); if (err) { closesocket(sock); return err; } } #ifdef IPV6_V6ONLY if (addr->sa_family == AF_INET6) { int on; on = (flags & UV_TCP_IPV6ONLY) != 0; /* TODO: how to handle errors? This may fail if there is no ipv4 stack * available, or when run on XP/2003 which have no support for dualstack * sockets. For now we're silently ignoring the error. */ setsockopt(handle->socket, IPPROTO_IPV6, IPV6_V6ONLY, (const char*)&on, sizeof on); } #endif r = bind(handle->socket, addr, addrlen); if (r == SOCKET_ERROR) { err = WSAGetLastError(); if (err == WSAEADDRINUSE) { /* Some errors are not to be reported until connect() or listen() */ handle->delayed_error = err; } else { return err; } } handle->flags |= UV_HANDLE_BOUND; return 0; } static void CALLBACK post_completion(void* context, BOOLEAN timed_out) { uv_req_t* req; uv_tcp_t* handle; req = (uv_req_t*) context; assert(req != NULL); handle = (uv_tcp_t*)req->data; assert(handle != NULL); assert(!timed_out); if (!PostQueuedCompletionStatus(handle->loop->iocp, req->u.io.overlapped.InternalHigh, 0, &req->u.io.overlapped)) { uv_fatal_error(GetLastError(), "PostQueuedCompletionStatus"); } } static void CALLBACK post_write_completion(void* context, BOOLEAN timed_out) { uv_write_t* req; uv_tcp_t* handle; req = (uv_write_t*) context; assert(req != NULL); handle = (uv_tcp_t*)req->handle; assert(handle != NULL); assert(!timed_out); if (!PostQueuedCompletionStatus(handle->loop->iocp, req->u.io.overlapped.InternalHigh, 0, &req->u.io.overlapped)) { uv_fatal_error(GetLastError(), "PostQueuedCompletionStatus"); } } static void uv_tcp_queue_accept(uv_tcp_t* handle, uv_tcp_accept_t* req) { uv_loop_t* loop = handle->loop; BOOL success; DWORD bytes; SOCKET accept_socket; short family; assert(handle->flags & UV_HANDLE_LISTENING); assert(req->accept_socket == INVALID_SOCKET); /* choose family and extension function */ if (handle->flags & UV_HANDLE_IPV6) { family = AF_INET6; } else { family = AF_INET; } /* Open a socket for the accepted connection. */ accept_socket = socket(family, SOCK_STREAM, 0); if (accept_socket == INVALID_SOCKET) { SET_REQ_ERROR(req, WSAGetLastError()); uv_insert_pending_req(loop, (uv_req_t*)req); handle->reqs_pending++; return; } /* Make the socket non-inheritable */ if (!SetHandleInformation((HANDLE) accept_socket, HANDLE_FLAG_INHERIT, 0)) { SET_REQ_ERROR(req, GetLastError()); uv_insert_pending_req(loop, (uv_req_t*)req); handle->reqs_pending++; closesocket(accept_socket); return; } /* Prepare the overlapped structure. */ memset(&(req->u.io.overlapped), 0, sizeof(req->u.io.overlapped)); if (handle->flags & UV_HANDLE_EMULATE_IOCP) { assert(req->event_handle != NULL); req->u.io.overlapped.hEvent = (HANDLE) ((ULONG_PTR) req->event_handle | 1); } success = handle->tcp.serv.func_acceptex(handle->socket, accept_socket, (void*)req->accept_buffer, 0, sizeof(struct sockaddr_storage), sizeof(struct sockaddr_storage), &bytes, &req->u.io.overlapped); if (UV_SUCCEEDED_WITHOUT_IOCP(success)) { /* Process the req without IOCP. */ req->accept_socket = accept_socket; handle->reqs_pending++; uv_insert_pending_req(loop, (uv_req_t*)req); } else if (UV_SUCCEEDED_WITH_IOCP(success)) { /* The req will be processed with IOCP. */ req->accept_socket = accept_socket; handle->reqs_pending++; if (handle->flags & UV_HANDLE_EMULATE_IOCP && req->wait_handle == INVALID_HANDLE_VALUE && !RegisterWaitForSingleObject(&req->wait_handle, req->event_handle, post_completion, (void*) req, INFINITE, WT_EXECUTEINWAITTHREAD)) { SET_REQ_ERROR(req, GetLastError()); uv_insert_pending_req(loop, (uv_req_t*)req); } } else { /* Make this req pending reporting an error. */ SET_REQ_ERROR(req, WSAGetLastError()); uv_insert_pending_req(loop, (uv_req_t*)req); handle->reqs_pending++; /* Destroy the preallocated client socket. */ closesocket(accept_socket); /* Destroy the event handle */ if (handle->flags & UV_HANDLE_EMULATE_IOCP) { CloseHandle(req->event_handle); req->event_handle = NULL; } } } static void uv_tcp_queue_read(uv_loop_t* loop, uv_tcp_t* handle) { uv_read_t* req; uv_buf_t buf; int result; DWORD bytes, flags; assert(handle->flags & UV_HANDLE_READING); assert(!(handle->flags & UV_HANDLE_READ_PENDING)); req = &handle->read_req; memset(&req->u.io.overlapped, 0, sizeof(req->u.io.overlapped)); /* * Preallocate a read buffer if the number of active streams is below * the threshold. */ if (loop->active_tcp_streams < uv_active_tcp_streams_threshold) { handle->flags &= ~UV_HANDLE_ZERO_READ; handle->tcp.conn.read_buffer = uv_buf_init(NULL, 0); handle->alloc_cb((uv_handle_t*) handle, 65536, &handle->tcp.conn.read_buffer); if (handle->tcp.conn.read_buffer.base == NULL || handle->tcp.conn.read_buffer.len == 0) { handle->read_cb((uv_stream_t*) handle, UV_ENOBUFS, &handle->tcp.conn.read_buffer); return; } assert(handle->tcp.conn.read_buffer.base != NULL); buf = handle->tcp.conn.read_buffer; } else { handle->flags |= UV_HANDLE_ZERO_READ; buf.base = (char*) &uv_zero_; buf.len = 0; } /* Prepare the overlapped structure. */ memset(&(req->u.io.overlapped), 0, sizeof(req->u.io.overlapped)); if (handle->flags & UV_HANDLE_EMULATE_IOCP) { assert(req->event_handle != NULL); req->u.io.overlapped.hEvent = (HANDLE) ((ULONG_PTR) req->event_handle | 1); } flags = 0; result = WSARecv(handle->socket, (WSABUF*)&buf, 1, &bytes, &flags, &req->u.io.overlapped, NULL); if (UV_SUCCEEDED_WITHOUT_IOCP(result == 0)) { /* Process the req without IOCP. */ handle->flags |= UV_HANDLE_READ_PENDING; req->u.io.overlapped.InternalHigh = bytes; handle->reqs_pending++; uv_insert_pending_req(loop, (uv_req_t*)req); } else if (UV_SUCCEEDED_WITH_IOCP(result == 0)) { /* The req will be processed with IOCP. */ handle->flags |= UV_HANDLE_READ_PENDING; handle->reqs_pending++; if (handle->flags & UV_HANDLE_EMULATE_IOCP && req->wait_handle == INVALID_HANDLE_VALUE && !RegisterWaitForSingleObject(&req->wait_handle, req->event_handle, post_completion, (void*) req, INFINITE, WT_EXECUTEINWAITTHREAD)) { SET_REQ_ERROR(req, GetLastError()); uv_insert_pending_req(loop, (uv_req_t*)req); } } else { /* Make this req pending reporting an error. */ SET_REQ_ERROR(req, WSAGetLastError()); uv_insert_pending_req(loop, (uv_req_t*)req); handle->reqs_pending++; } } int uv_tcp_close_reset(uv_tcp_t* handle, uv_close_cb close_cb) { struct linger l = { 1, 0 }; /* Disallow setting SO_LINGER to zero due to some platform inconsistencies */ if (handle->flags & UV_HANDLE_SHUTTING) return UV_EINVAL; if (0 != setsockopt(handle->socket, SOL_SOCKET, SO_LINGER, (const char*)&l, sizeof(l))) return uv_translate_sys_error(WSAGetLastError()); uv_close((uv_handle_t*) handle, close_cb); return 0; } int uv_tcp_listen(uv_tcp_t* handle, int backlog, uv_connection_cb cb) { unsigned int i, simultaneous_accepts; uv_tcp_accept_t* req; int err; assert(backlog > 0); if (handle->flags & UV_HANDLE_LISTENING) { handle->stream.serv.connection_cb = cb; } if (handle->flags & UV_HANDLE_READING) { return WSAEISCONN; } if (handle->delayed_error) { return handle->delayed_error; } if (!(handle->flags & UV_HANDLE_BOUND)) { err = uv_tcp_try_bind(handle, (const struct sockaddr*) &uv_addr_ip4_any_, sizeof(uv_addr_ip4_any_), 0); if (err) return err; if (handle->delayed_error) return handle->delayed_error; } if (!handle->tcp.serv.func_acceptex) { if (!uv_get_acceptex_function(handle->socket, &handle->tcp.serv.func_acceptex)) { return WSAEAFNOSUPPORT; } } if (!(handle->flags & UV_HANDLE_SHARED_TCP_SOCKET) && listen(handle->socket, backlog) == SOCKET_ERROR) { return WSAGetLastError(); } handle->flags |= UV_HANDLE_LISTENING; handle->stream.serv.connection_cb = cb; INCREASE_ACTIVE_COUNT(loop, handle); simultaneous_accepts = handle->flags & UV_HANDLE_TCP_SINGLE_ACCEPT ? 1 : uv_simultaneous_server_accepts; if (handle->tcp.serv.accept_reqs == NULL) { handle->tcp.serv.accept_reqs = (uv_tcp_accept_t *)uv__malloc(uv_simultaneous_server_accepts * sizeof(uv_tcp_accept_t)); if (!handle->tcp.serv.accept_reqs) { uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); } for (i = 0; i < simultaneous_accepts; i++) { req = &handle->tcp.serv.accept_reqs[i]; UV_REQ_INIT(req, UV_ACCEPT); req->accept_socket = INVALID_SOCKET; req->data = handle; req->wait_handle = INVALID_HANDLE_VALUE; if (handle->flags & UV_HANDLE_EMULATE_IOCP) { req->event_handle = CreateEvent(NULL, 0, 0, NULL); if (req->event_handle == NULL) { uv_fatal_error(GetLastError(), "CreateEvent"); } } else { req->event_handle = NULL; } uv_tcp_queue_accept(handle, req); } /* Initialize other unused requests too, because uv_tcp_endgame doesn't * know how many requests were initialized, so it will try to clean up * {uv_simultaneous_server_accepts} requests. */ for (i = simultaneous_accepts; i < uv_simultaneous_server_accepts; i++) { req = &handle->tcp.serv.accept_reqs[i]; UV_REQ_INIT(req, UV_ACCEPT); req->accept_socket = INVALID_SOCKET; req->data = handle; req->wait_handle = INVALID_HANDLE_VALUE; req->event_handle = NULL; } } return 0; } int uv_tcp_accept(uv_tcp_t* server, uv_tcp_t* client) { uv_loop_t* loop = server->loop; int err = 0; int family; uv_tcp_accept_t* req = server->tcp.serv.pending_accepts; if (!req) { /* No valid connections found, so we error out. */ return WSAEWOULDBLOCK; } if (req->accept_socket == INVALID_SOCKET) { return WSAENOTCONN; } if (server->flags & UV_HANDLE_IPV6) { family = AF_INET6; } else { family = AF_INET; } err = uv_tcp_set_socket(client->loop, client, req->accept_socket, family, 0); if (err) { closesocket(req->accept_socket); } else { uv_connection_init((uv_stream_t*) client); /* AcceptEx() implicitly binds the accepted socket. */ client->flags |= UV_HANDLE_BOUND | UV_HANDLE_READABLE | UV_HANDLE_WRITABLE; } /* Prepare the req to pick up a new connection */ server->tcp.serv.pending_accepts = req->next_pending; req->next_pending = NULL; req->accept_socket = INVALID_SOCKET; if (!(server->flags & UV_HANDLE_CLOSING)) { /* Check if we're in a middle of changing the number of pending accepts. */ if (!(server->flags & UV_HANDLE_TCP_ACCEPT_STATE_CHANGING)) { uv_tcp_queue_accept(server, req); } else { /* We better be switching to a single pending accept. */ assert(server->flags & UV_HANDLE_TCP_SINGLE_ACCEPT); server->tcp.serv.processed_accepts++; if (server->tcp.serv.processed_accepts >= uv_simultaneous_server_accepts) { server->tcp.serv.processed_accepts = 0; /* * All previously queued accept requests are now processed. * We now switch to queueing just a single accept. */ uv_tcp_queue_accept(server, &server->tcp.serv.accept_reqs[0]); server->flags &= ~UV_HANDLE_TCP_ACCEPT_STATE_CHANGING; server->flags |= UV_HANDLE_TCP_SINGLE_ACCEPT; } } } loop->active_tcp_streams++; return err; } int uv_tcp_read_start(uv_tcp_t* handle, uv_alloc_cb alloc_cb, uv_read_cb read_cb) { uv_loop_t* loop = handle->loop; handle->flags |= UV_HANDLE_READING; handle->read_cb = read_cb; handle->alloc_cb = alloc_cb; INCREASE_ACTIVE_COUNT(loop, handle); /* If reading was stopped and then started again, there could still be a read * request pending. */ if (!(handle->flags & UV_HANDLE_READ_PENDING)) { if (handle->flags & UV_HANDLE_EMULATE_IOCP && handle->read_req.event_handle == NULL) { handle->read_req.event_handle = CreateEvent(NULL, 0, 0, NULL); if (handle->read_req.event_handle == NULL) { uv_fatal_error(GetLastError(), "CreateEvent"); } } uv_tcp_queue_read(loop, handle); } return 0; } static int uv_tcp_try_connect(uv_connect_t* req, uv_tcp_t* handle, const struct sockaddr* addr, unsigned int addrlen, uv_connect_cb cb) { uv_loop_t* loop = handle->loop; const struct sockaddr* bind_addr; struct sockaddr_storage converted; BOOL success; DWORD bytes; int err; err = uv__convert_to_localhost_if_unspecified(addr, &converted); if (err) return err; if (handle->delayed_error) { return handle->delayed_error; } if (!(handle->flags & UV_HANDLE_BOUND)) { if (addrlen == sizeof(uv_addr_ip4_any_)) { bind_addr = (const struct sockaddr*) &uv_addr_ip4_any_; } else if (addrlen == sizeof(uv_addr_ip6_any_)) { bind_addr = (const struct sockaddr*) &uv_addr_ip6_any_; } else { abort(); } err = uv_tcp_try_bind(handle, bind_addr, addrlen, 0); if (err) return err; if (handle->delayed_error) return handle->delayed_error; } if (!handle->tcp.conn.func_connectex) { if (!uv_get_connectex_function(handle->socket, &handle->tcp.conn.func_connectex)) { return WSAEAFNOSUPPORT; } } UV_REQ_INIT(req, UV_CONNECT); req->handle = (uv_stream_t*) handle; req->cb = cb; memset(&req->u.io.overlapped, 0, sizeof(req->u.io.overlapped)); success = handle->tcp.conn.func_connectex(handle->socket, (const struct sockaddr*) &converted, addrlen, NULL, 0, &bytes, &req->u.io.overlapped); if (UV_SUCCEEDED_WITHOUT_IOCP(success)) { /* Process the req without IOCP. */ handle->reqs_pending++; REGISTER_HANDLE_REQ(loop, handle, req); uv_insert_pending_req(loop, (uv_req_t*)req); } else if (UV_SUCCEEDED_WITH_IOCP(success)) { /* The req will be processed with IOCP. */ handle->reqs_pending++; REGISTER_HANDLE_REQ(loop, handle, req); } else { return WSAGetLastError(); } return 0; } int uv_tcp_getsockname(const uv_tcp_t* handle, struct sockaddr* name, int* namelen) { return uv__getsockpeername((const uv_handle_t*) handle, getsockname, name, namelen, handle->delayed_error); } int uv_tcp_getpeername(const uv_tcp_t* handle, struct sockaddr* name, int* namelen) { return uv__getsockpeername((const uv_handle_t*) handle, getpeername, name, namelen, handle->delayed_error); } int uv_tcp_write(uv_loop_t* loop, uv_write_t* req, uv_tcp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb) { int result; DWORD bytes; UV_REQ_INIT(req, UV_WRITE); req->handle = (uv_stream_t*) handle; req->cb = cb; /* Prepare the overlapped structure. */ memset(&(req->u.io.overlapped), 0, sizeof(req->u.io.overlapped)); if (handle->flags & UV_HANDLE_EMULATE_IOCP) { req->event_handle = CreateEvent(NULL, 0, 0, NULL); if (req->event_handle == NULL) { uv_fatal_error(GetLastError(), "CreateEvent"); } req->u.io.overlapped.hEvent = (HANDLE) ((ULONG_PTR) req->event_handle | 1); req->wait_handle = INVALID_HANDLE_VALUE; } result = WSASend(handle->socket, (WSABUF*) bufs, nbufs, &bytes, 0, &req->u.io.overlapped, NULL); if (UV_SUCCEEDED_WITHOUT_IOCP(result == 0)) { /* Request completed immediately. */ req->u.io.queued_bytes = 0; handle->reqs_pending++; handle->stream.conn.write_reqs_pending++; REGISTER_HANDLE_REQ(loop, handle, req); uv_insert_pending_req(loop, (uv_req_t*) req); } else if (UV_SUCCEEDED_WITH_IOCP(result == 0)) { /* Request queued by the kernel. */ req->u.io.queued_bytes = uv__count_bufs(bufs, nbufs); handle->reqs_pending++; handle->stream.conn.write_reqs_pending++; REGISTER_HANDLE_REQ(loop, handle, req); handle->write_queue_size += req->u.io.queued_bytes; if (handle->flags & UV_HANDLE_EMULATE_IOCP && !RegisterWaitForSingleObject(&req->wait_handle, req->event_handle, post_write_completion, (void*) req, INFINITE, WT_EXECUTEINWAITTHREAD | WT_EXECUTEONLYONCE)) { SET_REQ_ERROR(req, GetLastError()); uv_insert_pending_req(loop, (uv_req_t*)req); } } else { /* Send failed due to an error, report it later */ req->u.io.queued_bytes = 0; handle->reqs_pending++; handle->stream.conn.write_reqs_pending++; REGISTER_HANDLE_REQ(loop, handle, req); SET_REQ_ERROR(req, WSAGetLastError()); uv_insert_pending_req(loop, (uv_req_t*) req); } return 0; } int uv__tcp_try_write(uv_tcp_t* handle, const uv_buf_t bufs[], unsigned int nbufs) { int result; DWORD bytes; if (handle->stream.conn.write_reqs_pending > 0) return UV_EAGAIN; result = WSASend(handle->socket, (WSABUF*) bufs, nbufs, &bytes, 0, NULL, NULL); if (result == SOCKET_ERROR) return uv_translate_sys_error(WSAGetLastError()); else return bytes; } void uv_process_tcp_read_req(uv_loop_t* loop, uv_tcp_t* handle, uv_req_t* req) { DWORD bytes, flags, err; uv_buf_t buf; int count; assert(handle->type == UV_TCP); handle->flags &= ~UV_HANDLE_READ_PENDING; if (!REQ_SUCCESS(req)) { /* An error occurred doing the read. */ if ((handle->flags & UV_HANDLE_READING) || !(handle->flags & UV_HANDLE_ZERO_READ)) { handle->flags &= ~UV_HANDLE_READING; DECREASE_ACTIVE_COUNT(loop, handle); buf = (handle->flags & UV_HANDLE_ZERO_READ) ? uv_buf_init(NULL, 0) : handle->tcp.conn.read_buffer; err = GET_REQ_SOCK_ERROR(req); if (err == WSAECONNABORTED) { /* Turn WSAECONNABORTED into UV_ECONNRESET to be consistent with Unix. */ err = WSAECONNRESET; } handle->read_cb((uv_stream_t*)handle, uv_translate_sys_error(err), &buf); } } else { if (!(handle->flags & UV_HANDLE_ZERO_READ)) { /* The read was done with a non-zero buffer length. */ if (req->u.io.overlapped.InternalHigh > 0) { /* Successful read */ handle->read_cb((uv_stream_t*)handle, req->u.io.overlapped.InternalHigh, &handle->tcp.conn.read_buffer); /* Read again only if bytes == buf.len */ if (req->u.io.overlapped.InternalHigh < handle->tcp.conn.read_buffer.len) { goto done; } } else { /* Connection closed */ if (handle->flags & UV_HANDLE_READING) { handle->flags &= ~UV_HANDLE_READING; DECREASE_ACTIVE_COUNT(loop, handle); } handle->flags &= ~UV_HANDLE_READABLE; buf.base = 0; buf.len = 0; handle->read_cb((uv_stream_t*)handle, UV_EOF, &handle->tcp.conn.read_buffer); goto done; } } /* Do nonblocking reads until the buffer is empty */ count = 32; while ((handle->flags & UV_HANDLE_READING) && (count-- > 0)) { buf = uv_buf_init(NULL, 0); handle->alloc_cb((uv_handle_t*) handle, 65536, &buf); if (buf.base == NULL || buf.len == 0) { handle->read_cb((uv_stream_t*) handle, UV_ENOBUFS, &buf); break; } assert(buf.base != NULL); flags = 0; if (WSARecv(handle->socket, (WSABUF*)&buf, 1, &bytes, &flags, NULL, NULL) != SOCKET_ERROR) { if (bytes > 0) { /* Successful read */ handle->read_cb((uv_stream_t*)handle, bytes, &buf); /* Read again only if bytes == buf.len */ if (bytes < buf.len) { break; } } else { /* Connection closed */ handle->flags &= ~(UV_HANDLE_READING | UV_HANDLE_READABLE); DECREASE_ACTIVE_COUNT(loop, handle); handle->read_cb((uv_stream_t*)handle, UV_EOF, &buf); break; } } else { err = WSAGetLastError(); if (err == WSAEWOULDBLOCK) { /* Read buffer was completely empty, report a 0-byte read. */ handle->read_cb((uv_stream_t*)handle, 0, &buf); } else { /* Ouch! serious error. */ handle->flags &= ~UV_HANDLE_READING; DECREASE_ACTIVE_COUNT(loop, handle); if (err == WSAECONNABORTED) { /* Turn WSAECONNABORTED into UV_ECONNRESET to be consistent with * Unix. */ err = WSAECONNRESET; } handle->read_cb((uv_stream_t*)handle, uv_translate_sys_error(err), &buf); } break; } } done: /* Post another read if still reading and not closing. */ if ((handle->flags & UV_HANDLE_READING) && !(handle->flags & UV_HANDLE_READ_PENDING)) { uv_tcp_queue_read(loop, handle); } } DECREASE_PENDING_REQ_COUNT(handle); } void uv_process_tcp_write_req(uv_loop_t* loop, uv_tcp_t* handle, uv_write_t* req) { int err; assert(handle->type == UV_TCP); assert(handle->write_queue_size >= req->u.io.queued_bytes); handle->write_queue_size -= req->u.io.queued_bytes; UNREGISTER_HANDLE_REQ(loop, handle, req); if (handle->flags & UV_HANDLE_EMULATE_IOCP) { if (req->wait_handle != INVALID_HANDLE_VALUE) { UnregisterWait(req->wait_handle); req->wait_handle = INVALID_HANDLE_VALUE; } if (req->event_handle != NULL) { CloseHandle(req->event_handle); req->event_handle = NULL; } } if (req->cb) { err = uv_translate_sys_error(GET_REQ_SOCK_ERROR(req)); if (err == UV_ECONNABORTED) { /* use UV_ECANCELED for consistency with Unix */ err = UV_ECANCELED; } req->cb(req, err); } handle->stream.conn.write_reqs_pending--; if (handle->stream.conn.shutdown_req != NULL && handle->stream.conn.write_reqs_pending == 0) { uv_want_endgame(loop, (uv_handle_t*)handle); } DECREASE_PENDING_REQ_COUNT(handle); } void uv_process_tcp_accept_req(uv_loop_t* loop, uv_tcp_t* handle, uv_req_t* raw_req) { uv_tcp_accept_t* req = (uv_tcp_accept_t*) raw_req; int err; assert(handle->type == UV_TCP); /* If handle->accepted_socket is not a valid socket, then uv_queue_accept * must have failed. This is a serious error. We stop accepting connections * and report this error to the connection callback. */ if (req->accept_socket == INVALID_SOCKET) { if (handle->flags & UV_HANDLE_LISTENING) { handle->flags &= ~UV_HANDLE_LISTENING; DECREASE_ACTIVE_COUNT(loop, handle); if (handle->stream.serv.connection_cb) { err = GET_REQ_SOCK_ERROR(req); handle->stream.serv.connection_cb((uv_stream_t*)handle, uv_translate_sys_error(err)); } } } else if (REQ_SUCCESS(req) && setsockopt(req->accept_socket, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, (char*)&handle->socket, sizeof(handle->socket)) == 0) { req->next_pending = handle->tcp.serv.pending_accepts; handle->tcp.serv.pending_accepts = req; /* Accept and SO_UPDATE_ACCEPT_CONTEXT were successful. */ if (handle->stream.serv.connection_cb) { handle->stream.serv.connection_cb((uv_stream_t*)handle, 0); } } else { /* Error related to accepted socket is ignored because the server socket * may still be healthy. If the server socket is broken uv_queue_accept * will detect it. */ closesocket(req->accept_socket); req->accept_socket = INVALID_SOCKET; if (handle->flags & UV_HANDLE_LISTENING) { uv_tcp_queue_accept(handle, req); } } DECREASE_PENDING_REQ_COUNT(handle); } void uv_process_tcp_connect_req(uv_loop_t* loop, uv_tcp_t* handle, uv_connect_t* req) { int err; assert(handle->type == UV_TCP); UNREGISTER_HANDLE_REQ(loop, handle, req); err = 0; if (REQ_SUCCESS(req)) { if (handle->flags & UV_HANDLE_CLOSING) { /* use UV_ECANCELED for consistency with Unix */ err = ERROR_OPERATION_ABORTED; } else if (setsockopt(handle->socket, SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT, NULL, 0) == 0) { uv_connection_init((uv_stream_t*)handle); handle->flags |= UV_HANDLE_READABLE | UV_HANDLE_WRITABLE; loop->active_tcp_streams++; } else { err = WSAGetLastError(); } } else { err = GET_REQ_SOCK_ERROR(req); } req->cb(req, uv_translate_sys_error(err)); DECREASE_PENDING_REQ_COUNT(handle); } int uv__tcp_xfer_export(uv_tcp_t* handle, int target_pid, uv__ipc_socket_xfer_type_t* xfer_type, uv__ipc_socket_xfer_info_t* xfer_info) { if (handle->flags & UV_HANDLE_CONNECTION) { *xfer_type = UV__IPC_SOCKET_XFER_TCP_CONNECTION; } else { *xfer_type = UV__IPC_SOCKET_XFER_TCP_SERVER; /* We're about to share the socket with another process. Because this is a * listening socket, we assume that the other process will be accepting * connections on it. Thus, before sharing the socket with another process, * we call listen here in the parent process. */ if (!(handle->flags & UV_HANDLE_LISTENING)) { if (!(handle->flags & UV_HANDLE_BOUND)) { return ERROR_NOT_SUPPORTED; } if (handle->delayed_error == 0 && listen(handle->socket, SOMAXCONN) == SOCKET_ERROR) { handle->delayed_error = WSAGetLastError(); } } } if (WSADuplicateSocketW(handle->socket, target_pid, &xfer_info->socket_info)) return WSAGetLastError(); xfer_info->delayed_error = handle->delayed_error; /* Mark the local copy of the handle as 'shared' so we behave in a way that's * friendly to the process(es) that we share the socket with. */ handle->flags |= UV_HANDLE_SHARED_TCP_SOCKET; return 0; } int uv__tcp_xfer_import(uv_tcp_t* tcp, uv__ipc_socket_xfer_type_t xfer_type, uv__ipc_socket_xfer_info_t* xfer_info) { int err; SOCKET socket; assert(xfer_type == UV__IPC_SOCKET_XFER_TCP_SERVER || xfer_type == UV__IPC_SOCKET_XFER_TCP_CONNECTION); socket = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, &xfer_info->socket_info, 0, WSA_FLAG_OVERLAPPED); if (socket == INVALID_SOCKET) { return WSAGetLastError(); } err = uv_tcp_set_socket( tcp->loop, tcp, socket, xfer_info->socket_info.iAddressFamily, 1); if (err) { closesocket(socket); return err; } tcp->delayed_error = xfer_info->delayed_error; tcp->flags |= UV_HANDLE_BOUND | UV_HANDLE_SHARED_TCP_SOCKET; if (xfer_type == UV__IPC_SOCKET_XFER_TCP_CONNECTION) { uv_connection_init((uv_stream_t*)tcp); tcp->flags |= UV_HANDLE_READABLE | UV_HANDLE_WRITABLE; } tcp->loop->active_tcp_streams++; return 0; } int uv_tcp_nodelay(uv_tcp_t* handle, int enable) { int err; if (handle->socket != INVALID_SOCKET) { err = uv__tcp_nodelay(handle, handle->socket, enable); if (err) return err; } if (enable) { handle->flags |= UV_HANDLE_TCP_NODELAY; } else { handle->flags &= ~UV_HANDLE_TCP_NODELAY; } return 0; } int uv_tcp_keepalive(uv_tcp_t* handle, int enable, unsigned int delay) { int err; if (handle->socket != INVALID_SOCKET) { err = uv__tcp_keepalive(handle, handle->socket, enable, delay); if (err) return err; } if (enable) { handle->flags |= UV_HANDLE_TCP_KEEPALIVE; } else { handle->flags &= ~UV_HANDLE_TCP_KEEPALIVE; } /* TODO: Store delay if handle->socket isn't created yet. */ return 0; } int uv_tcp_simultaneous_accepts(uv_tcp_t* handle, int enable) { if (handle->flags & UV_HANDLE_CONNECTION) { return UV_EINVAL; } /* Check if we're already in the desired mode. */ if ((enable && !(handle->flags & UV_HANDLE_TCP_SINGLE_ACCEPT)) || (!enable && handle->flags & UV_HANDLE_TCP_SINGLE_ACCEPT)) { return 0; } /* Don't allow switching from single pending accept to many. */ if (enable) { return UV_ENOTSUP; } /* Check if we're in a middle of changing the number of pending accepts. */ if (handle->flags & UV_HANDLE_TCP_ACCEPT_STATE_CHANGING) { return 0; } handle->flags |= UV_HANDLE_TCP_SINGLE_ACCEPT; /* Flip the changing flag if we have already queued multiple accepts. */ if (handle->flags & UV_HANDLE_LISTENING) { handle->flags |= UV_HANDLE_TCP_ACCEPT_STATE_CHANGING; } return 0; } static int uv_tcp_try_cancel_io(uv_tcp_t* tcp) { SOCKET socket = tcp->socket; int non_ifs_lsp; /* Check if we have any non-IFS LSPs stacked on top of TCP */ non_ifs_lsp = (tcp->flags & UV_HANDLE_IPV6) ? uv_tcp_non_ifs_lsp_ipv6 : uv_tcp_non_ifs_lsp_ipv4; /* If there are non-ifs LSPs then try to obtain a base handle for the socket. * This will always fail on Windows XP/3k. */ if (non_ifs_lsp) { DWORD bytes; if (WSAIoctl(socket, SIO_BASE_HANDLE, NULL, 0, &socket, sizeof socket, &bytes, NULL, NULL) != 0) { /* Failed. We can't do CancelIo. */ return -1; } } assert(socket != 0 && socket != INVALID_SOCKET); if (!CancelIo((HANDLE) socket)) { return GetLastError(); } /* It worked. */ return 0; } void uv_tcp_close(uv_loop_t* loop, uv_tcp_t* tcp) { int close_socket = 1; if (tcp->flags & UV_HANDLE_READ_PENDING) { /* In order for winsock to do a graceful close there must not be any any * pending reads, or the socket must be shut down for writing */ if (!(tcp->flags & UV_HANDLE_SHARED_TCP_SOCKET)) { /* Just do shutdown on non-shared sockets, which ensures graceful close. */ shutdown(tcp->socket, SD_SEND); } else if (uv_tcp_try_cancel_io(tcp) == 0) { /* In case of a shared socket, we try to cancel all outstanding I/O,. If * that works, don't close the socket yet - wait for the read req to * return and close the socket in uv_tcp_endgame. */ close_socket = 0; } else { /* When cancelling isn't possible - which could happen when an LSP is * present on an old Windows version, we will have to close the socket * with a read pending. That is not nice because trailing sent bytes may * not make it to the other side. */ } } else if ((tcp->flags & UV_HANDLE_SHARED_TCP_SOCKET) && tcp->tcp.serv.accept_reqs != NULL) { /* Under normal circumstances closesocket() will ensure that all pending * accept reqs are canceled. However, when the socket is shared the * presence of another reference to the socket in another process will keep * the accept reqs going, so we have to ensure that these are canceled. */ if (uv_tcp_try_cancel_io(tcp) != 0) { /* When cancellation is not possible, there is another option: we can * close the incoming sockets, which will also cancel the accept * operations. However this is not cool because we might inadvertently * close a socket that just accepted a new connection, which will cause * the connection to be aborted. */ unsigned int i; for (i = 0; i < uv_simultaneous_server_accepts; i++) { uv_tcp_accept_t* req = &tcp->tcp.serv.accept_reqs[i]; if (req->accept_socket != INVALID_SOCKET && !HasOverlappedIoCompleted(&req->u.io.overlapped)) { closesocket(req->accept_socket); req->accept_socket = INVALID_SOCKET; } } } } if (tcp->flags & UV_HANDLE_READING) { tcp->flags &= ~UV_HANDLE_READING; DECREASE_ACTIVE_COUNT(loop, tcp); } if (tcp->flags & UV_HANDLE_LISTENING) { tcp->flags &= ~UV_HANDLE_LISTENING; DECREASE_ACTIVE_COUNT(loop, tcp); } if (close_socket) { closesocket(tcp->socket); tcp->socket = INVALID_SOCKET; tcp->flags |= UV_HANDLE_TCP_SOCKET_CLOSED; } tcp->flags &= ~(UV_HANDLE_READABLE | UV_HANDLE_WRITABLE); uv__handle_closing(tcp); if (tcp->reqs_pending == 0) { uv_want_endgame(tcp->loop, (uv_handle_t*)tcp); } } int uv_tcp_open(uv_tcp_t* handle, uv_os_sock_t sock) { WSAPROTOCOL_INFOW protocol_info; int opt_len; int err; struct sockaddr_storage saddr; int saddr_len; /* Detect the address family of the socket. */ opt_len = (int) sizeof protocol_info; if (getsockopt(sock, SOL_SOCKET, SO_PROTOCOL_INFOW, (char*) &protocol_info, &opt_len) == SOCKET_ERROR) { return uv_translate_sys_error(GetLastError()); } err = uv_tcp_set_socket(handle->loop, handle, sock, protocol_info.iAddressFamily, 1); if (err) { return uv_translate_sys_error(err); } /* Support already active socket. */ saddr_len = sizeof(saddr); if (!uv_tcp_getsockname(handle, (struct sockaddr*) &saddr, &saddr_len)) { /* Socket is already bound. */ handle->flags |= UV_HANDLE_BOUND; saddr_len = sizeof(saddr); if (!uv_tcp_getpeername(handle, (struct sockaddr*) &saddr, &saddr_len)) { /* Socket is already connected. */ uv_connection_init((uv_stream_t*) handle); handle->flags |= UV_HANDLE_READABLE | UV_HANDLE_WRITABLE; } } return 0; } /* This function is an egress point, i.e. it returns libuv errors rather than * system errors. */ int uv__tcp_bind(uv_tcp_t* handle, const struct sockaddr* addr, unsigned int addrlen, unsigned int flags) { int err; err = uv_tcp_try_bind(handle, addr, addrlen, flags); if (err) return uv_translate_sys_error(err); return 0; } /* This function is an egress point, i.e. it returns libuv errors rather than * system errors. */ int uv__tcp_connect(uv_connect_t* req, uv_tcp_t* handle, const struct sockaddr* addr, unsigned int addrlen, uv_connect_cb cb) { int err; err = uv_tcp_try_connect(req, handle, addr, addrlen, cb); if (err) return uv_translate_sys_error(err); return 0; } ================================================ FILE: external/libuv/src/win/thread.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #if defined(__MINGW64_VERSION_MAJOR) /* MemoryBarrier expands to __mm_mfence in some cases (x86+sse2), which may * require this header in some versions of mingw64. */ #include #endif #include "uv.h" #include "internal.h" static void uv__once_inner(uv_once_t* guard, void (*callback)(void)) { DWORD result; HANDLE existing_event, created_event; created_event = CreateEvent(NULL, 1, 0, NULL); if (created_event == 0) { /* Could fail in a low-memory situation? */ uv_fatal_error(GetLastError(), "CreateEvent"); } existing_event = InterlockedCompareExchangePointer(&guard->event, created_event, NULL); if (existing_event == NULL) { /* We won the race */ callback(); result = SetEvent(created_event); assert(result); guard->ran = 1; } else { /* We lost the race. Destroy the event we created and wait for the existing * one to become signaled. */ CloseHandle(created_event); result = WaitForSingleObject(existing_event, INFINITE); assert(result == WAIT_OBJECT_0); } } void uv_once(uv_once_t* guard, void (*callback)(void)) { /* Fast case - avoid WaitForSingleObject. */ if (guard->ran) { return; } uv__once_inner(guard, callback); } /* Verify that uv_thread_t can be stored in a TLS slot. */ STATIC_ASSERT(sizeof(uv_thread_t) <= sizeof(void*)); static uv_key_t uv__current_thread_key; static uv_once_t uv__current_thread_init_guard = UV_ONCE_INIT; static void uv__init_current_thread_key(void) { if (uv_key_create(&uv__current_thread_key)) abort(); } struct thread_ctx { void (*entry)(void* arg); void* arg; uv_thread_t self; }; static UINT __stdcall uv__thread_start(void* arg) { struct thread_ctx *ctx_p; struct thread_ctx ctx; ctx_p = (struct thread_ctx *)arg; ctx = *ctx_p; uv__free(ctx_p); uv_once(&uv__current_thread_init_guard, uv__init_current_thread_key); uv_key_set(&uv__current_thread_key, (void*) ctx.self); ctx.entry(ctx.arg); return 0; } int uv_thread_create(uv_thread_t *tid, void (*entry)(void *arg), void *arg) { uv_thread_options_t params; params.flags = UV_THREAD_NO_FLAGS; return uv_thread_create_ex(tid, ¶ms, entry, arg); } int uv_thread_create_ex(uv_thread_t* tid, const uv_thread_options_t* params, void (*entry)(void *arg), void *arg) { struct thread_ctx* ctx; int err; HANDLE thread; SYSTEM_INFO sysinfo; size_t stack_size; size_t pagesize; stack_size = params->flags & UV_THREAD_HAS_STACK_SIZE ? params->stack_size : 0; if (stack_size != 0) { GetNativeSystemInfo(&sysinfo); pagesize = (size_t)sysinfo.dwPageSize; /* Round up to the nearest page boundary. */ stack_size = (stack_size + pagesize - 1) &~ (pagesize - 1); if ((unsigned)stack_size != stack_size) return UV_EINVAL; } ctx = (struct thread_ctx *)uv__malloc(sizeof(*ctx)); if (ctx == NULL) return UV_ENOMEM; ctx->entry = entry; ctx->arg = arg; /* Create the thread in suspended state so we have a chance to pass * its own creation handle to it */ thread = (HANDLE) _beginthreadex(NULL, (unsigned)stack_size, uv__thread_start, ctx, CREATE_SUSPENDED, NULL); if (thread == NULL) { err = errno; uv__free(ctx); } else { err = 0; *tid = thread; ctx->self = thread; ResumeThread(thread); } switch (err) { case 0: return 0; case EACCES: return UV_EACCES; case EAGAIN: return UV_EAGAIN; case EINVAL: return UV_EINVAL; } return UV_EIO; } uv_thread_t uv_thread_self(void) { uv_once(&uv__current_thread_init_guard, uv__init_current_thread_key); return (uv_thread_t) uv_key_get(&uv__current_thread_key); } int uv_thread_join(uv_thread_t *tid) { if (WaitForSingleObject(*tid, INFINITE)) return uv_translate_sys_error(GetLastError()); else { CloseHandle(*tid); *tid = 0; MemoryBarrier(); /* For feature parity with pthread_join(). */ return 0; } } int uv_thread_equal(const uv_thread_t* t1, const uv_thread_t* t2) { return *t1 == *t2; } int uv_mutex_init(uv_mutex_t* mutex) { InitializeCriticalSection(mutex); return 0; } int uv_mutex_init_recursive(uv_mutex_t* mutex) { return uv_mutex_init(mutex); } void uv_mutex_destroy(uv_mutex_t* mutex) { DeleteCriticalSection(mutex); } void uv_mutex_lock(uv_mutex_t* mutex) { EnterCriticalSection(mutex); } int uv_mutex_trylock(uv_mutex_t* mutex) { if (TryEnterCriticalSection(mutex)) return 0; else return UV_EBUSY; } void uv_mutex_unlock(uv_mutex_t* mutex) { LeaveCriticalSection(mutex); } int uv_rwlock_init(uv_rwlock_t* rwlock) { /* Initialize the semaphore that acts as the write lock. */ HANDLE handle = CreateSemaphoreW(NULL, 1, 1, NULL); if (handle == NULL) return uv_translate_sys_error(GetLastError()); rwlock->state_.write_semaphore_ = handle; /* Initialize the critical section protecting the reader count. */ InitializeCriticalSection(&rwlock->state_.num_readers_lock_); /* Initialize the reader count. */ rwlock->state_.num_readers_ = 0; return 0; } void uv_rwlock_destroy(uv_rwlock_t* rwlock) { DeleteCriticalSection(&rwlock->state_.num_readers_lock_); CloseHandle(rwlock->state_.write_semaphore_); } void uv_rwlock_rdlock(uv_rwlock_t* rwlock) { /* Acquire the lock that protects the reader count. */ EnterCriticalSection(&rwlock->state_.num_readers_lock_); /* Increase the reader count, and lock for write if this is the first * reader. */ if (++rwlock->state_.num_readers_ == 1) { DWORD r = WaitForSingleObject(rwlock->state_.write_semaphore_, INFINITE); if (r != WAIT_OBJECT_0) uv_fatal_error(GetLastError(), "WaitForSingleObject"); } /* Release the lock that protects the reader count. */ LeaveCriticalSection(&rwlock->state_.num_readers_lock_); } int uv_rwlock_tryrdlock(uv_rwlock_t* rwlock) { int err; if (!TryEnterCriticalSection(&rwlock->state_.num_readers_lock_)) return UV_EBUSY; err = 0; if (rwlock->state_.num_readers_ == 0) { /* Currently there are no other readers, which means that the write lock * needs to be acquired. */ DWORD r = WaitForSingleObject(rwlock->state_.write_semaphore_, 0); if (r == WAIT_OBJECT_0) rwlock->state_.num_readers_++; else if (r == WAIT_TIMEOUT) err = UV_EBUSY; else if (r == WAIT_FAILED) uv_fatal_error(GetLastError(), "WaitForSingleObject"); } else { /* The write lock has already been acquired because there are other * active readers. */ rwlock->state_.num_readers_++; } LeaveCriticalSection(&rwlock->state_.num_readers_lock_); return err; } void uv_rwlock_rdunlock(uv_rwlock_t* rwlock) { EnterCriticalSection(&rwlock->state_.num_readers_lock_); if (--rwlock->state_.num_readers_ == 0) { if (!ReleaseSemaphore(rwlock->state_.write_semaphore_, 1, NULL)) uv_fatal_error(GetLastError(), "ReleaseSemaphore"); } LeaveCriticalSection(&rwlock->state_.num_readers_lock_); } void uv_rwlock_wrlock(uv_rwlock_t* rwlock) { DWORD r = WaitForSingleObject(rwlock->state_.write_semaphore_, INFINITE); if (r != WAIT_OBJECT_0) uv_fatal_error(GetLastError(), "WaitForSingleObject"); } int uv_rwlock_trywrlock(uv_rwlock_t* rwlock) { DWORD r = WaitForSingleObject(rwlock->state_.write_semaphore_, 0); if (r == WAIT_OBJECT_0) return 0; else if (r == WAIT_TIMEOUT) return UV_EBUSY; else uv_fatal_error(GetLastError(), "WaitForSingleObject"); } void uv_rwlock_wrunlock(uv_rwlock_t* rwlock) { if (!ReleaseSemaphore(rwlock->state_.write_semaphore_, 1, NULL)) uv_fatal_error(GetLastError(), "ReleaseSemaphore"); } int uv_sem_init(uv_sem_t* sem, unsigned int value) { *sem = CreateSemaphore(NULL, value, INT_MAX, NULL); if (*sem == NULL) return uv_translate_sys_error(GetLastError()); else return 0; } void uv_sem_destroy(uv_sem_t* sem) { if (!CloseHandle(*sem)) abort(); } void uv_sem_post(uv_sem_t* sem) { if (!ReleaseSemaphore(*sem, 1, NULL)) abort(); } void uv_sem_wait(uv_sem_t* sem) { if (WaitForSingleObject(*sem, INFINITE) != WAIT_OBJECT_0) abort(); } int uv_sem_trywait(uv_sem_t* sem) { DWORD r = WaitForSingleObject(*sem, 0); if (r == WAIT_OBJECT_0) return 0; if (r == WAIT_TIMEOUT) return UV_EAGAIN; abort(); return -1; /* Satisfy the compiler. */ } int uv_cond_init(uv_cond_t* cond) { InitializeConditionVariable(&cond->cond_var); return 0; } void uv_cond_destroy(uv_cond_t* cond) { /* nothing to do */ (void) &cond; } void uv_cond_signal(uv_cond_t* cond) { WakeConditionVariable(&cond->cond_var); } void uv_cond_broadcast(uv_cond_t* cond) { WakeAllConditionVariable(&cond->cond_var); } void uv_cond_wait(uv_cond_t* cond, uv_mutex_t* mutex) { if (!SleepConditionVariableCS(&cond->cond_var, mutex, INFINITE)) abort(); } int uv_cond_timedwait(uv_cond_t* cond, uv_mutex_t* mutex, uint64_t timeout) { if (SleepConditionVariableCS(&cond->cond_var, mutex, (DWORD)(timeout / 1e6))) return 0; if (GetLastError() != ERROR_TIMEOUT) abort(); return UV_ETIMEDOUT; } int uv_barrier_init(uv_barrier_t* barrier, unsigned int count) { int err; barrier->n = count; barrier->count = 0; err = uv_mutex_init(&barrier->mutex); if (err) return err; err = uv_sem_init(&barrier->turnstile1, 0); if (err) goto error2; err = uv_sem_init(&barrier->turnstile2, 1); if (err) goto error; return 0; error: uv_sem_destroy(&barrier->turnstile1); error2: uv_mutex_destroy(&barrier->mutex); return err; } void uv_barrier_destroy(uv_barrier_t* barrier) { uv_sem_destroy(&barrier->turnstile2); uv_sem_destroy(&barrier->turnstile1); uv_mutex_destroy(&barrier->mutex); } int uv_barrier_wait(uv_barrier_t* barrier) { int serial_thread; uv_mutex_lock(&barrier->mutex); if (++barrier->count == barrier->n) { uv_sem_wait(&barrier->turnstile2); uv_sem_post(&barrier->turnstile1); } uv_mutex_unlock(&barrier->mutex); uv_sem_wait(&barrier->turnstile1); uv_sem_post(&barrier->turnstile1); uv_mutex_lock(&barrier->mutex); serial_thread = (--barrier->count == 0); if (serial_thread) { uv_sem_wait(&barrier->turnstile1); uv_sem_post(&barrier->turnstile2); } uv_mutex_unlock(&barrier->mutex); uv_sem_wait(&barrier->turnstile2); uv_sem_post(&barrier->turnstile2); return serial_thread; } int uv_key_create(uv_key_t* key) { key->tls_index = TlsAlloc(); if (key->tls_index == TLS_OUT_OF_INDEXES) return UV_ENOMEM; return 0; } void uv_key_delete(uv_key_t* key) { if (TlsFree(key->tls_index) == FALSE) abort(); key->tls_index = TLS_OUT_OF_INDEXES; } void* uv_key_get(uv_key_t* key) { void* value; value = TlsGetValue(key->tls_index); if (value == NULL) if (GetLastError() != ERROR_SUCCESS) abort(); return value; } void uv_key_set(uv_key_t* key, void* value) { if (TlsSetValue(key->tls_index, value) == FALSE) abort(); } ================================================ FILE: external/libuv/src/win/tty.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include #if defined(_MSC_VER) && _MSC_VER < 1600 # include "uv/stdint-msvc2008.h" #else # include #endif #ifndef COMMON_LVB_REVERSE_VIDEO # define COMMON_LVB_REVERSE_VIDEO 0x4000 #endif #include "uv.h" #include "internal.h" #include "handle-inl.h" #include "stream-inl.h" #include "req-inl.h" #ifndef InterlockedOr # define InterlockedOr _InterlockedOr #endif #define UNICODE_REPLACEMENT_CHARACTER (0xfffd) #define ANSI_NORMAL 0x0000 #define ANSI_ESCAPE_SEEN 0x0002 #define ANSI_CSI 0x0004 #define ANSI_ST_CONTROL 0x0008 #define ANSI_IGNORE 0x0010 #define ANSI_IN_ARG 0x0020 #define ANSI_IN_STRING 0x0040 #define ANSI_BACKSLASH_SEEN 0x0080 #define ANSI_EXTENSION 0x0100 #define ANSI_DECSCUSR 0x0200 #define MAX_INPUT_BUFFER_LENGTH 8192 #define MAX_CONSOLE_CHAR 8192 #ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING #define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 #endif #define CURSOR_SIZE_SMALL 25 #define CURSOR_SIZE_LARGE 100 static void uv_tty_capture_initial_style( CONSOLE_SCREEN_BUFFER_INFO* screen_buffer_info, CONSOLE_CURSOR_INFO* cursor_info); static void uv_tty_update_virtual_window(CONSOLE_SCREEN_BUFFER_INFO* info); static int uv__cancel_read_console(uv_tty_t* handle); /* Null uv_buf_t */ static const uv_buf_t uv_null_buf_ = { 0, NULL }; enum uv__read_console_status_e { NOT_STARTED, IN_PROGRESS, TRAP_REQUESTED, COMPLETED }; static volatile LONG uv__read_console_status = NOT_STARTED; static volatile LONG uv__restore_screen_state; static CONSOLE_SCREEN_BUFFER_INFO uv__saved_screen_state; /* * The console virtual window. * * Normally cursor movement in windows is relative to the console screen buffer, * e.g. the application is allowed to overwrite the 'history'. This is very * inconvenient, it makes absolute cursor movement pretty useless. There is * also the concept of 'client rect' which is defined by the actual size of * the console window and the scroll position of the screen buffer, but it's * very volatile because it changes when the user scrolls. * * To make cursor movement behave sensibly we define a virtual window to which * cursor movement is confined. The virtual window is always as wide as the * console screen buffer, but it's height is defined by the size of the * console window. The top of the virtual window aligns with the position * of the caret when the first stdout/err handle is created, unless that would * mean that it would extend beyond the bottom of the screen buffer - in that * that case it's located as far down as possible. * * When the user writes a long text or many newlines, such that the output * reaches beyond the bottom of the virtual window, the virtual window is * shifted downwards, but not resized. * * Since all tty i/o happens on the same console, this window is shared * between all stdout/stderr handles. */ static int uv_tty_virtual_offset = -1; static int uv_tty_virtual_height = -1; static int uv_tty_virtual_width = -1; /* The console window size * We keep this separate from uv_tty_virtual_*. We use those values to only * handle signalling SIGWINCH */ static HANDLE uv__tty_console_handle = INVALID_HANDLE_VALUE; static int uv__tty_console_height = -1; static int uv__tty_console_width = -1; static HANDLE uv__tty_console_resized = INVALID_HANDLE_VALUE; static uv_mutex_t uv__tty_console_resize_mutex; static DWORD WINAPI uv__tty_console_resize_message_loop_thread(void* param); static void CALLBACK uv__tty_console_resize_event(HWINEVENTHOOK hWinEventHook, DWORD event, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime); static DWORD WINAPI uv__tty_console_resize_watcher_thread(void* param); static void uv__tty_console_signal_resize(void); /* We use a semaphore rather than a mutex or critical section because in some cases (uv__cancel_read_console) we need take the lock in the main thread and release it in another thread. Using a semaphore ensures that in such scenario the main thread will still block when trying to acquire the lock. */ static uv_sem_t uv_tty_output_lock; static WORD uv_tty_default_text_attributes = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; static char uv_tty_default_fg_color = 7; static char uv_tty_default_bg_color = 0; static char uv_tty_default_fg_bright = 0; static char uv_tty_default_bg_bright = 0; static char uv_tty_default_inverse = 0; static CONSOLE_CURSOR_INFO uv_tty_default_cursor_info; /* Determine whether or not ANSI support is enabled. */ static BOOL uv__need_check_vterm_state = TRUE; static uv_tty_vtermstate_t uv__vterm_state = UV_TTY_UNSUPPORTED; static void uv__determine_vterm_state(HANDLE handle); void uv_console_init(void) { if (uv_sem_init(&uv_tty_output_lock, 1)) abort(); uv__tty_console_handle = CreateFileW(L"CONOUT$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0); if (uv__tty_console_handle != INVALID_HANDLE_VALUE) { CONSOLE_SCREEN_BUFFER_INFO sb_info; QueueUserWorkItem(uv__tty_console_resize_message_loop_thread, NULL, WT_EXECUTELONGFUNCTION); uv_mutex_init(&uv__tty_console_resize_mutex); if (GetConsoleScreenBufferInfo(uv__tty_console_handle, &sb_info)) { uv__tty_console_width = sb_info.dwSize.X; uv__tty_console_height = sb_info.srWindow.Bottom - sb_info.srWindow.Top + 1; } } } int uv_tty_init(uv_loop_t* loop, uv_tty_t* tty, uv_file fd, int unused) { BOOL readable; DWORD NumberOfEvents; HANDLE handle; CONSOLE_SCREEN_BUFFER_INFO screen_buffer_info; CONSOLE_CURSOR_INFO cursor_info; (void)unused; uv__once_init(); handle = (HANDLE) uv__get_osfhandle(fd); if (handle == INVALID_HANDLE_VALUE) return UV_EBADF; if (fd <= 2) { /* In order to avoid closing a stdio file descriptor 0-2, duplicate the * underlying OS handle and forget about the original fd. * We could also opt to use the original OS handle and just never close it, * but then there would be no reliable way to cancel pending read operations * upon close. */ if (!DuplicateHandle(INVALID_HANDLE_VALUE, handle, INVALID_HANDLE_VALUE, &handle, 0, FALSE, DUPLICATE_SAME_ACCESS)) return uv_translate_sys_error(GetLastError()); fd = -1; } readable = GetNumberOfConsoleInputEvents(handle, &NumberOfEvents); if (!readable) { /* Obtain the screen buffer info with the output handle. */ if (!GetConsoleScreenBufferInfo(handle, &screen_buffer_info)) { return uv_translate_sys_error(GetLastError()); } /* Obtain the cursor info with the output handle. */ if (!GetConsoleCursorInfo(handle, &cursor_info)) { return uv_translate_sys_error(GetLastError()); } /* Obtain the tty_output_lock because the virtual window state is shared * between all uv_tty_t handles. */ uv_sem_wait(&uv_tty_output_lock); if (uv__need_check_vterm_state) uv__determine_vterm_state(handle); /* Remember the original console text attributes and cursor info. */ uv_tty_capture_initial_style(&screen_buffer_info, &cursor_info); uv_tty_update_virtual_window(&screen_buffer_info); uv_sem_post(&uv_tty_output_lock); } uv_stream_init(loop, (uv_stream_t*) tty, UV_TTY); uv_connection_init((uv_stream_t*) tty); tty->handle = handle; tty->u.fd = fd; tty->reqs_pending = 0; tty->flags |= UV_HANDLE_BOUND; if (readable) { /* Initialize TTY input specific fields. */ tty->flags |= UV_HANDLE_TTY_READABLE | UV_HANDLE_READABLE; /* TODO: remove me in v2.x. */ tty->tty.rd.unused_ = NULL; tty->tty.rd.read_line_buffer = uv_null_buf_; tty->tty.rd.read_raw_wait = NULL; /* Init keycode-to-vt100 mapper state. */ tty->tty.rd.last_key_len = 0; tty->tty.rd.last_key_offset = 0; tty->tty.rd.last_utf16_high_surrogate = 0; memset(&tty->tty.rd.last_input_record, 0, sizeof tty->tty.rd.last_input_record); } else { /* TTY output specific fields. */ tty->flags |= UV_HANDLE_WRITABLE; /* Init utf8-to-utf16 conversion state. */ tty->tty.wr.utf8_bytes_left = 0; tty->tty.wr.utf8_codepoint = 0; /* Initialize eol conversion state */ tty->tty.wr.previous_eol = 0; /* Init ANSI parser state. */ tty->tty.wr.ansi_parser_state = ANSI_NORMAL; } return 0; } /* Set the default console text attributes based on how the console was * configured when libuv started. */ static void uv_tty_capture_initial_style( CONSOLE_SCREEN_BUFFER_INFO* screen_buffer_info, CONSOLE_CURSOR_INFO* cursor_info) { static int style_captured = 0; /* Only do this once. Assumption: Caller has acquired uv_tty_output_lock. */ if (style_captured) return; /* Save raw win32 attributes. */ uv_tty_default_text_attributes = screen_buffer_info->wAttributes; /* Convert black text on black background to use white text. */ if (uv_tty_default_text_attributes == 0) uv_tty_default_text_attributes = 7; /* Convert Win32 attributes to ANSI colors. */ uv_tty_default_fg_color = 0; uv_tty_default_bg_color = 0; uv_tty_default_fg_bright = 0; uv_tty_default_bg_bright = 0; uv_tty_default_inverse = 0; if (uv_tty_default_text_attributes & FOREGROUND_RED) uv_tty_default_fg_color |= 1; if (uv_tty_default_text_attributes & FOREGROUND_GREEN) uv_tty_default_fg_color |= 2; if (uv_tty_default_text_attributes & FOREGROUND_BLUE) uv_tty_default_fg_color |= 4; if (uv_tty_default_text_attributes & BACKGROUND_RED) uv_tty_default_bg_color |= 1; if (uv_tty_default_text_attributes & BACKGROUND_GREEN) uv_tty_default_bg_color |= 2; if (uv_tty_default_text_attributes & BACKGROUND_BLUE) uv_tty_default_bg_color |= 4; if (uv_tty_default_text_attributes & FOREGROUND_INTENSITY) uv_tty_default_fg_bright = 1; if (uv_tty_default_text_attributes & BACKGROUND_INTENSITY) uv_tty_default_bg_bright = 1; if (uv_tty_default_text_attributes & COMMON_LVB_REVERSE_VIDEO) uv_tty_default_inverse = 1; /* Save the cursor size and the cursor state. */ uv_tty_default_cursor_info = *cursor_info; style_captured = 1; } int uv_tty_set_mode(uv_tty_t* tty, uv_tty_mode_t mode) { DWORD flags; unsigned char was_reading; uv_alloc_cb alloc_cb; uv_read_cb read_cb; int err; if (!(tty->flags & UV_HANDLE_TTY_READABLE)) { return UV_EINVAL; } if (!!mode == !!(tty->flags & UV_HANDLE_TTY_RAW)) { return 0; } switch (mode) { case UV_TTY_MODE_NORMAL: flags = ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT; break; case UV_TTY_MODE_RAW: flags = ENABLE_WINDOW_INPUT; break; case UV_TTY_MODE_IO: return UV_ENOTSUP; default: return UV_EINVAL; } /* If currently reading, stop, and restart reading. */ if (tty->flags & UV_HANDLE_READING) { was_reading = 1; alloc_cb = tty->alloc_cb; read_cb = tty->read_cb; err = uv_tty_read_stop(tty); if (err) { return uv_translate_sys_error(err); } } else { was_reading = 0; alloc_cb = NULL; read_cb = NULL; } uv_sem_wait(&uv_tty_output_lock); if (!SetConsoleMode(tty->handle, flags)) { err = uv_translate_sys_error(GetLastError()); uv_sem_post(&uv_tty_output_lock); return err; } uv_sem_post(&uv_tty_output_lock); /* Update flag. */ tty->flags &= ~UV_HANDLE_TTY_RAW; tty->flags |= mode ? UV_HANDLE_TTY_RAW : 0; /* If we just stopped reading, restart. */ if (was_reading) { err = uv_tty_read_start(tty, alloc_cb, read_cb); if (err) { return uv_translate_sys_error(err); } } return 0; } int uv_tty_get_winsize(uv_tty_t* tty, int* width, int* height) { CONSOLE_SCREEN_BUFFER_INFO info; if (!GetConsoleScreenBufferInfo(tty->handle, &info)) { return uv_translate_sys_error(GetLastError()); } uv_sem_wait(&uv_tty_output_lock); uv_tty_update_virtual_window(&info); uv_sem_post(&uv_tty_output_lock); *width = uv_tty_virtual_width; *height = uv_tty_virtual_height; return 0; } static void CALLBACK uv_tty_post_raw_read(void* data, BOOLEAN didTimeout) { uv_loop_t* loop; uv_tty_t* handle; uv_req_t* req; assert(data); assert(!didTimeout); req = (uv_req_t*) data; handle = (uv_tty_t*) req->data; loop = handle->loop; UnregisterWait(handle->tty.rd.read_raw_wait); handle->tty.rd.read_raw_wait = NULL; SET_REQ_SUCCESS(req); POST_COMPLETION_FOR_REQ(loop, req); } static void uv_tty_queue_read_raw(uv_loop_t* loop, uv_tty_t* handle) { uv_read_t* req; BOOL r; assert(handle->flags & UV_HANDLE_READING); assert(!(handle->flags & UV_HANDLE_READ_PENDING)); assert(handle->handle && handle->handle != INVALID_HANDLE_VALUE); handle->tty.rd.read_line_buffer = uv_null_buf_; req = &handle->read_req; memset(&req->u.io.overlapped, 0, sizeof(req->u.io.overlapped)); r = RegisterWaitForSingleObject(&handle->tty.rd.read_raw_wait, handle->handle, uv_tty_post_raw_read, (void*) req, INFINITE, WT_EXECUTEINWAITTHREAD | WT_EXECUTEONLYONCE); if (!r) { handle->tty.rd.read_raw_wait = NULL; SET_REQ_ERROR(req, GetLastError()); uv_insert_pending_req(loop, (uv_req_t*)req); } handle->flags |= UV_HANDLE_READ_PENDING; handle->reqs_pending++; } static DWORD CALLBACK uv_tty_line_read_thread(void* data) { uv_loop_t* loop; uv_tty_t* handle; uv_req_t* req; DWORD bytes, read_bytes; WCHAR utf16[MAX_INPUT_BUFFER_LENGTH / 3]; DWORD chars, read_chars; LONG status; COORD pos; BOOL read_console_success; assert(data); req = (uv_req_t*) data; handle = (uv_tty_t*) req->data; loop = handle->loop; assert(handle->tty.rd.read_line_buffer.base != NULL); assert(handle->tty.rd.read_line_buffer.len > 0); /* ReadConsole can't handle big buffers. */ if (handle->tty.rd.read_line_buffer.len < MAX_INPUT_BUFFER_LENGTH) { bytes = handle->tty.rd.read_line_buffer.len; } else { bytes = MAX_INPUT_BUFFER_LENGTH; } /* At last, unicode! One utf-16 codeunit never takes more than 3 utf-8 * codeunits to encode. */ chars = bytes / 3; status = InterlockedExchange(&uv__read_console_status, IN_PROGRESS); if (status == TRAP_REQUESTED) { SET_REQ_SUCCESS(req); req->u.io.overlapped.InternalHigh = 0; POST_COMPLETION_FOR_REQ(loop, req); return 0; } read_console_success = ReadConsoleW(handle->handle, (void*) utf16, chars, &read_chars, NULL); if (read_console_success) { read_bytes = WideCharToMultiByte(CP_UTF8, 0, utf16, read_chars, handle->tty.rd.read_line_buffer.base, bytes, NULL, NULL); SET_REQ_SUCCESS(req); req->u.io.overlapped.InternalHigh = read_bytes; } else { SET_REQ_ERROR(req, GetLastError()); } status = InterlockedExchange(&uv__read_console_status, COMPLETED); if (status == TRAP_REQUESTED) { /* If we canceled the read by sending a VK_RETURN event, restore the screen state to undo the visual effect of the VK_RETURN */ if (read_console_success && InterlockedOr(&uv__restore_screen_state, 0)) { HANDLE active_screen_buffer; active_screen_buffer = CreateFileA("conout$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (active_screen_buffer != INVALID_HANDLE_VALUE) { pos = uv__saved_screen_state.dwCursorPosition; /* If the cursor was at the bottom line of the screen buffer, the VK_RETURN would have caused the buffer contents to scroll up by one line. The right position to reset the cursor to is therefore one line higher */ if (pos.Y == uv__saved_screen_state.dwSize.Y - 1) pos.Y--; SetConsoleCursorPosition(active_screen_buffer, pos); CloseHandle(active_screen_buffer); } } uv_sem_post(&uv_tty_output_lock); } POST_COMPLETION_FOR_REQ(loop, req); return 0; } static void uv_tty_queue_read_line(uv_loop_t* loop, uv_tty_t* handle) { uv_read_t* req; BOOL r; assert(handle->flags & UV_HANDLE_READING); assert(!(handle->flags & UV_HANDLE_READ_PENDING)); assert(handle->handle && handle->handle != INVALID_HANDLE_VALUE); req = &handle->read_req; memset(&req->u.io.overlapped, 0, sizeof(req->u.io.overlapped)); handle->tty.rd.read_line_buffer = uv_buf_init(NULL, 0); handle->alloc_cb((uv_handle_t*) handle, 8192, &handle->tty.rd.read_line_buffer); if (handle->tty.rd.read_line_buffer.base == NULL || handle->tty.rd.read_line_buffer.len == 0) { handle->read_cb((uv_stream_t*) handle, UV_ENOBUFS, &handle->tty.rd.read_line_buffer); return; } assert(handle->tty.rd.read_line_buffer.base != NULL); /* Reset flags No locking is required since there cannot be a line read in progress. We are also relying on the memory barrier provided by QueueUserWorkItem*/ uv__restore_screen_state = FALSE; uv__read_console_status = NOT_STARTED; r = QueueUserWorkItem(uv_tty_line_read_thread, (void*) req, WT_EXECUTELONGFUNCTION); if (!r) { SET_REQ_ERROR(req, GetLastError()); uv_insert_pending_req(loop, (uv_req_t*)req); } handle->flags |= UV_HANDLE_READ_PENDING; handle->reqs_pending++; } static void uv_tty_queue_read(uv_loop_t* loop, uv_tty_t* handle) { if (handle->flags & UV_HANDLE_TTY_RAW) { uv_tty_queue_read_raw(loop, handle); } else { uv_tty_queue_read_line(loop, handle); } } static const char* get_vt100_fn_key(DWORD code, char shift, char ctrl, size_t* len) { #define VK_CASE(vk, normal_str, shift_str, ctrl_str, shift_ctrl_str) \ case (vk): \ if (shift && ctrl) { \ *len = sizeof shift_ctrl_str; \ return "\033" shift_ctrl_str; \ } else if (shift) { \ *len = sizeof shift_str ; \ return "\033" shift_str; \ } else if (ctrl) { \ *len = sizeof ctrl_str; \ return "\033" ctrl_str; \ } else { \ *len = sizeof normal_str; \ return "\033" normal_str; \ } switch (code) { /* These mappings are the same as Cygwin's. Unmodified and alt-modified * keypad keys comply with linux console, modifiers comply with xterm * modifier usage. F1. f12 and shift-f1. f10 comply with linux console, f6. * f12 with and without modifiers comply with rxvt. */ VK_CASE(VK_INSERT, "[2~", "[2;2~", "[2;5~", "[2;6~") VK_CASE(VK_END, "[4~", "[4;2~", "[4;5~", "[4;6~") VK_CASE(VK_DOWN, "[B", "[1;2B", "[1;5B", "[1;6B") VK_CASE(VK_NEXT, "[6~", "[6;2~", "[6;5~", "[6;6~") VK_CASE(VK_LEFT, "[D", "[1;2D", "[1;5D", "[1;6D") VK_CASE(VK_CLEAR, "[G", "[1;2G", "[1;5G", "[1;6G") VK_CASE(VK_RIGHT, "[C", "[1;2C", "[1;5C", "[1;6C") VK_CASE(VK_UP, "[A", "[1;2A", "[1;5A", "[1;6A") VK_CASE(VK_HOME, "[1~", "[1;2~", "[1;5~", "[1;6~") VK_CASE(VK_PRIOR, "[5~", "[5;2~", "[5;5~", "[5;6~") VK_CASE(VK_DELETE, "[3~", "[3;2~", "[3;5~", "[3;6~") VK_CASE(VK_NUMPAD0, "[2~", "[2;2~", "[2;5~", "[2;6~") VK_CASE(VK_NUMPAD1, "[4~", "[4;2~", "[4;5~", "[4;6~") VK_CASE(VK_NUMPAD2, "[B", "[1;2B", "[1;5B", "[1;6B") VK_CASE(VK_NUMPAD3, "[6~", "[6;2~", "[6;5~", "[6;6~") VK_CASE(VK_NUMPAD4, "[D", "[1;2D", "[1;5D", "[1;6D") VK_CASE(VK_NUMPAD5, "[G", "[1;2G", "[1;5G", "[1;6G") VK_CASE(VK_NUMPAD6, "[C", "[1;2C", "[1;5C", "[1;6C") VK_CASE(VK_NUMPAD7, "[A", "[1;2A", "[1;5A", "[1;6A") VK_CASE(VK_NUMPAD8, "[1~", "[1;2~", "[1;5~", "[1;6~") VK_CASE(VK_NUMPAD9, "[5~", "[5;2~", "[5;5~", "[5;6~") VK_CASE(VK_DECIMAL, "[3~", "[3;2~", "[3;5~", "[3;6~") VK_CASE(VK_F1, "[[A", "[23~", "[11^", "[23^" ) VK_CASE(VK_F2, "[[B", "[24~", "[12^", "[24^" ) VK_CASE(VK_F3, "[[C", "[25~", "[13^", "[25^" ) VK_CASE(VK_F4, "[[D", "[26~", "[14^", "[26^" ) VK_CASE(VK_F5, "[[E", "[28~", "[15^", "[28^" ) VK_CASE(VK_F6, "[17~", "[29~", "[17^", "[29^" ) VK_CASE(VK_F7, "[18~", "[31~", "[18^", "[31^" ) VK_CASE(VK_F8, "[19~", "[32~", "[19^", "[32^" ) VK_CASE(VK_F9, "[20~", "[33~", "[20^", "[33^" ) VK_CASE(VK_F10, "[21~", "[34~", "[21^", "[34^" ) VK_CASE(VK_F11, "[23~", "[23$", "[23^", "[23@" ) VK_CASE(VK_F12, "[24~", "[24$", "[24^", "[24@" ) default: *len = 0; return NULL; } #undef VK_CASE } void uv_process_tty_read_raw_req(uv_loop_t* loop, uv_tty_t* handle, uv_req_t* req) { /* Shortcut for handle->tty.rd.last_input_record.Event.KeyEvent. */ #define KEV handle->tty.rd.last_input_record.Event.KeyEvent DWORD records_left, records_read; uv_buf_t buf; off_t buf_used; assert(handle->type == UV_TTY); assert(handle->flags & UV_HANDLE_TTY_READABLE); handle->flags &= ~UV_HANDLE_READ_PENDING; if (!(handle->flags & UV_HANDLE_READING) || !(handle->flags & UV_HANDLE_TTY_RAW)) { goto out; } if (!REQ_SUCCESS(req)) { /* An error occurred while waiting for the event. */ if ((handle->flags & UV_HANDLE_READING)) { handle->flags &= ~UV_HANDLE_READING; handle->read_cb((uv_stream_t*)handle, uv_translate_sys_error(GET_REQ_ERROR(req)), &uv_null_buf_); } goto out; } /* Fetch the number of events */ if (!GetNumberOfConsoleInputEvents(handle->handle, &records_left)) { handle->flags &= ~UV_HANDLE_READING; DECREASE_ACTIVE_COUNT(loop, handle); handle->read_cb((uv_stream_t*)handle, uv_translate_sys_error(GetLastError()), &uv_null_buf_); goto out; } /* Windows sends a lot of events that we're not interested in, so buf will be * allocated on demand, when there's actually something to emit. */ buf = uv_null_buf_; buf_used = 0; while ((records_left > 0 || handle->tty.rd.last_key_len > 0) && (handle->flags & UV_HANDLE_READING)) { if (handle->tty.rd.last_key_len == 0) { /* Read the next input record */ if (!ReadConsoleInputW(handle->handle, &handle->tty.rd.last_input_record, 1, &records_read)) { handle->flags &= ~UV_HANDLE_READING; DECREASE_ACTIVE_COUNT(loop, handle); handle->read_cb((uv_stream_t*) handle, uv_translate_sys_error(GetLastError()), &buf); goto out; } records_left--; /* We might be not subscribed to EVENT_CONSOLE_LAYOUT or we might be * running under some TTY emulator that does not send those events. */ if (handle->tty.rd.last_input_record.EventType == WINDOW_BUFFER_SIZE_EVENT) { uv__tty_console_signal_resize(); } /* Ignore other events that are not key events. */ if (handle->tty.rd.last_input_record.EventType != KEY_EVENT) { continue; } /* Ignore keyup events, unless the left alt key was held and a valid * unicode character was emitted. */ if (!KEV.bKeyDown && (KEV.wVirtualKeyCode != VK_MENU || KEV.uChar.UnicodeChar == 0)) { continue; } /* Ignore keypresses to numpad number keys if the left alt is held * because the user is composing a character, or windows simulating this. */ if ((KEV.dwControlKeyState & LEFT_ALT_PRESSED) && !(KEV.dwControlKeyState & ENHANCED_KEY) && (KEV.wVirtualKeyCode == VK_INSERT || KEV.wVirtualKeyCode == VK_END || KEV.wVirtualKeyCode == VK_DOWN || KEV.wVirtualKeyCode == VK_NEXT || KEV.wVirtualKeyCode == VK_LEFT || KEV.wVirtualKeyCode == VK_CLEAR || KEV.wVirtualKeyCode == VK_RIGHT || KEV.wVirtualKeyCode == VK_HOME || KEV.wVirtualKeyCode == VK_UP || KEV.wVirtualKeyCode == VK_PRIOR || KEV.wVirtualKeyCode == VK_NUMPAD0 || KEV.wVirtualKeyCode == VK_NUMPAD1 || KEV.wVirtualKeyCode == VK_NUMPAD2 || KEV.wVirtualKeyCode == VK_NUMPAD3 || KEV.wVirtualKeyCode == VK_NUMPAD4 || KEV.wVirtualKeyCode == VK_NUMPAD5 || KEV.wVirtualKeyCode == VK_NUMPAD6 || KEV.wVirtualKeyCode == VK_NUMPAD7 || KEV.wVirtualKeyCode == VK_NUMPAD8 || KEV.wVirtualKeyCode == VK_NUMPAD9)) { continue; } if (KEV.uChar.UnicodeChar != 0) { int prefix_len, char_len; /* Character key pressed */ if (KEV.uChar.UnicodeChar >= 0xD800 && KEV.uChar.UnicodeChar < 0xDC00) { /* UTF-16 high surrogate */ handle->tty.rd.last_utf16_high_surrogate = KEV.uChar.UnicodeChar; continue; } /* Prefix with \u033 if alt was held, but alt was not used as part a * compose sequence. */ if ((KEV.dwControlKeyState & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED)) && !(KEV.dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) && KEV.bKeyDown) { handle->tty.rd.last_key[0] = '\033'; prefix_len = 1; } else { prefix_len = 0; } if (KEV.uChar.UnicodeChar >= 0xDC00 && KEV.uChar.UnicodeChar < 0xE000) { /* UTF-16 surrogate pair */ WCHAR utf16_buffer[2]; utf16_buffer[0] = handle->tty.rd.last_utf16_high_surrogate; utf16_buffer[1] = KEV.uChar.UnicodeChar; char_len = WideCharToMultiByte(CP_UTF8, 0, utf16_buffer, 2, &handle->tty.rd.last_key[prefix_len], sizeof handle->tty.rd.last_key, NULL, NULL); } else { /* Single UTF-16 character */ char_len = WideCharToMultiByte(CP_UTF8, 0, &KEV.uChar.UnicodeChar, 1, &handle->tty.rd.last_key[prefix_len], sizeof handle->tty.rd.last_key, NULL, NULL); } /* Whatever happened, the last character wasn't a high surrogate. */ handle->tty.rd.last_utf16_high_surrogate = 0; /* If the utf16 character(s) couldn't be converted something must be * wrong. */ if (!char_len) { handle->flags &= ~UV_HANDLE_READING; DECREASE_ACTIVE_COUNT(loop, handle); handle->read_cb((uv_stream_t*) handle, uv_translate_sys_error(GetLastError()), &buf); goto out; } handle->tty.rd.last_key_len = (unsigned char) (prefix_len + char_len); handle->tty.rd.last_key_offset = 0; continue; } else { /* Function key pressed */ const char* vt100; size_t prefix_len, vt100_len; vt100 = get_vt100_fn_key(KEV.wVirtualKeyCode, !!(KEV.dwControlKeyState & SHIFT_PRESSED), !!(KEV.dwControlKeyState & ( LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)), &vt100_len); /* If we were unable to map to a vt100 sequence, just ignore. */ if (!vt100) { continue; } /* Prefix with \x033 when the alt key was held. */ if (KEV.dwControlKeyState & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED)) { handle->tty.rd.last_key[0] = '\033'; prefix_len = 1; } else { prefix_len = 0; } /* Copy the vt100 sequence to the handle buffer. */ assert(prefix_len + vt100_len < sizeof handle->tty.rd.last_key); memcpy(&handle->tty.rd.last_key[prefix_len], vt100, vt100_len); handle->tty.rd.last_key_len = (unsigned char) (prefix_len + vt100_len); handle->tty.rd.last_key_offset = 0; continue; } } else { /* Copy any bytes left from the last keypress to the user buffer. */ if (handle->tty.rd.last_key_offset < handle->tty.rd.last_key_len) { /* Allocate a buffer if needed */ if (buf_used == 0) { buf = uv_buf_init(NULL, 0); handle->alloc_cb((uv_handle_t*) handle, 1024, &buf); if (buf.base == NULL || buf.len == 0) { handle->read_cb((uv_stream_t*) handle, UV_ENOBUFS, &buf); goto out; } assert(buf.base != NULL); } buf.base[buf_used++] = handle->tty.rd.last_key[handle->tty.rd.last_key_offset++]; /* If the buffer is full, emit it */ if ((size_t) buf_used == buf.len) { handle->read_cb((uv_stream_t*) handle, buf_used, &buf); buf = uv_null_buf_; buf_used = 0; } continue; } /* Apply dwRepeat from the last input record. */ if (--KEV.wRepeatCount > 0) { handle->tty.rd.last_key_offset = 0; continue; } handle->tty.rd.last_key_len = 0; continue; } } /* Send the buffer back to the user */ if (buf_used > 0) { handle->read_cb((uv_stream_t*) handle, buf_used, &buf); } out: /* Wait for more input events. */ if ((handle->flags & UV_HANDLE_READING) && !(handle->flags & UV_HANDLE_READ_PENDING)) { uv_tty_queue_read(loop, handle); } DECREASE_PENDING_REQ_COUNT(handle); #undef KEV } void uv_process_tty_read_line_req(uv_loop_t* loop, uv_tty_t* handle, uv_req_t* req) { uv_buf_t buf; assert(handle->type == UV_TTY); assert(handle->flags & UV_HANDLE_TTY_READABLE); buf = handle->tty.rd.read_line_buffer; handle->flags &= ~UV_HANDLE_READ_PENDING; handle->tty.rd.read_line_buffer = uv_null_buf_; if (!REQ_SUCCESS(req)) { /* Read was not successful */ if (handle->flags & UV_HANDLE_READING) { /* Real error */ handle->flags &= ~UV_HANDLE_READING; DECREASE_ACTIVE_COUNT(loop, handle); handle->read_cb((uv_stream_t*) handle, uv_translate_sys_error(GET_REQ_ERROR(req)), &buf); } } else { if (!(handle->flags & UV_HANDLE_CANCELLATION_PENDING) && req->u.io.overlapped.InternalHigh != 0) { /* Read successful. TODO: read unicode, convert to utf-8 */ DWORD bytes = req->u.io.overlapped.InternalHigh; handle->read_cb((uv_stream_t*) handle, bytes, &buf); } handle->flags &= ~UV_HANDLE_CANCELLATION_PENDING; } /* Wait for more input events. */ if ((handle->flags & UV_HANDLE_READING) && !(handle->flags & UV_HANDLE_READ_PENDING)) { uv_tty_queue_read(loop, handle); } DECREASE_PENDING_REQ_COUNT(handle); } void uv_process_tty_read_req(uv_loop_t* loop, uv_tty_t* handle, uv_req_t* req) { assert(handle->type == UV_TTY); assert(handle->flags & UV_HANDLE_TTY_READABLE); /* If the read_line_buffer member is zero, it must have been an raw read. * Otherwise it was a line-buffered read. FIXME: This is quite obscure. Use a * flag or something. */ if (handle->tty.rd.read_line_buffer.len == 0) { uv_process_tty_read_raw_req(loop, handle, req); } else { uv_process_tty_read_line_req(loop, handle, req); } } int uv_tty_read_start(uv_tty_t* handle, uv_alloc_cb alloc_cb, uv_read_cb read_cb) { uv_loop_t* loop = handle->loop; if (!(handle->flags & UV_HANDLE_TTY_READABLE)) { return ERROR_INVALID_PARAMETER; } handle->flags |= UV_HANDLE_READING; INCREASE_ACTIVE_COUNT(loop, handle); handle->read_cb = read_cb; handle->alloc_cb = alloc_cb; /* If reading was stopped and then started again, there could still be a read * request pending. */ if (handle->flags & UV_HANDLE_READ_PENDING) { return 0; } /* Maybe the user stopped reading half-way while processing key events. * Short-circuit if this could be the case. */ if (handle->tty.rd.last_key_len > 0) { SET_REQ_SUCCESS(&handle->read_req); uv_insert_pending_req(handle->loop, (uv_req_t*) &handle->read_req); /* Make sure no attempt is made to insert it again until it's handled. */ handle->flags |= UV_HANDLE_READ_PENDING; handle->reqs_pending++; return 0; } uv_tty_queue_read(loop, handle); return 0; } int uv_tty_read_stop(uv_tty_t* handle) { INPUT_RECORD record; DWORD written, err; handle->flags &= ~UV_HANDLE_READING; DECREASE_ACTIVE_COUNT(handle->loop, handle); if (!(handle->flags & UV_HANDLE_READ_PENDING)) return 0; if (handle->flags & UV_HANDLE_TTY_RAW) { /* Cancel raw read. Write some bullshit event to force the console wait to * return. */ memset(&record, 0, sizeof record); record.EventType = FOCUS_EVENT; if (!WriteConsoleInputW(handle->handle, &record, 1, &written)) { return GetLastError(); } } else if (!(handle->flags & UV_HANDLE_CANCELLATION_PENDING)) { /* Cancel line-buffered read if not already pending */ err = uv__cancel_read_console(handle); if (err) return err; handle->flags |= UV_HANDLE_CANCELLATION_PENDING; } return 0; } static int uv__cancel_read_console(uv_tty_t* handle) { HANDLE active_screen_buffer = INVALID_HANDLE_VALUE; INPUT_RECORD record; DWORD written; DWORD err = 0; LONG status; assert(!(handle->flags & UV_HANDLE_CANCELLATION_PENDING)); /* Hold the output lock during the cancellation, to ensure that further writes don't interfere with the screen state. It will be the ReadConsole thread's responsibility to release the lock. */ uv_sem_wait(&uv_tty_output_lock); status = InterlockedExchange(&uv__read_console_status, TRAP_REQUESTED); if (status != IN_PROGRESS) { /* Either we have managed to set a trap for the other thread before ReadConsole is called, or ReadConsole has returned because the user has pressed ENTER. In either case, there is nothing else to do. */ uv_sem_post(&uv_tty_output_lock); return 0; } /* Save screen state before sending the VK_RETURN event */ active_screen_buffer = CreateFileA("conout$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (active_screen_buffer != INVALID_HANDLE_VALUE && GetConsoleScreenBufferInfo(active_screen_buffer, &uv__saved_screen_state)) { InterlockedOr(&uv__restore_screen_state, 1); } /* Write enter key event to force the console wait to return. */ record.EventType = KEY_EVENT; record.Event.KeyEvent.bKeyDown = TRUE; record.Event.KeyEvent.wRepeatCount = 1; record.Event.KeyEvent.wVirtualKeyCode = VK_RETURN; record.Event.KeyEvent.wVirtualScanCode = MapVirtualKeyW(VK_RETURN, MAPVK_VK_TO_VSC); record.Event.KeyEvent.uChar.UnicodeChar = L'\r'; record.Event.KeyEvent.dwControlKeyState = 0; if (!WriteConsoleInputW(handle->handle, &record, 1, &written)) err = GetLastError(); if (active_screen_buffer != INVALID_HANDLE_VALUE) CloseHandle(active_screen_buffer); return err; } static void uv_tty_update_virtual_window(CONSOLE_SCREEN_BUFFER_INFO* info) { uv_tty_virtual_width = info->dwSize.X; uv_tty_virtual_height = info->srWindow.Bottom - info->srWindow.Top + 1; /* Recompute virtual window offset row. */ if (uv_tty_virtual_offset == -1) { uv_tty_virtual_offset = info->dwCursorPosition.Y; } else if (uv_tty_virtual_offset < info->dwCursorPosition.Y - uv_tty_virtual_height + 1) { /* If suddenly find the cursor outside of the virtual window, it must have * somehow scrolled. Update the virtual window offset. */ uv_tty_virtual_offset = info->dwCursorPosition.Y - uv_tty_virtual_height + 1; } if (uv_tty_virtual_offset + uv_tty_virtual_height > info->dwSize.Y) { uv_tty_virtual_offset = info->dwSize.Y - uv_tty_virtual_height; } if (uv_tty_virtual_offset < 0) { uv_tty_virtual_offset = 0; } } static COORD uv_tty_make_real_coord(uv_tty_t* handle, CONSOLE_SCREEN_BUFFER_INFO* info, int x, unsigned char x_relative, int y, unsigned char y_relative) { COORD result; uv_tty_update_virtual_window(info); /* Adjust y position */ if (y_relative) { y = info->dwCursorPosition.Y + y; } else { y = uv_tty_virtual_offset + y; } /* Clip y to virtual client rectangle */ if (y < uv_tty_virtual_offset) { y = uv_tty_virtual_offset; } else if (y >= uv_tty_virtual_offset + uv_tty_virtual_height) { y = uv_tty_virtual_offset + uv_tty_virtual_height - 1; } /* Adjust x */ if (x_relative) { x = info->dwCursorPosition.X + x; } /* Clip x */ if (x < 0) { x = 0; } else if (x >= uv_tty_virtual_width) { x = uv_tty_virtual_width - 1; } result.X = (unsigned short) x; result.Y = (unsigned short) y; return result; } static int uv_tty_emit_text(uv_tty_t* handle, WCHAR buffer[], DWORD length, DWORD* error) { DWORD written; if (*error != ERROR_SUCCESS) { return -1; } if (!WriteConsoleW(handle->handle, (void*) buffer, length, &written, NULL)) { *error = GetLastError(); return -1; } return 0; } static int uv_tty_move_caret(uv_tty_t* handle, int x, unsigned char x_relative, int y, unsigned char y_relative, DWORD* error) { CONSOLE_SCREEN_BUFFER_INFO info; COORD pos; if (*error != ERROR_SUCCESS) { return -1; } retry: if (!GetConsoleScreenBufferInfo(handle->handle, &info)) { *error = GetLastError(); } pos = uv_tty_make_real_coord(handle, &info, x, x_relative, y, y_relative); if (!SetConsoleCursorPosition(handle->handle, pos)) { if (GetLastError() == ERROR_INVALID_PARAMETER) { /* The console may be resized - retry */ goto retry; } else { *error = GetLastError(); return -1; } } return 0; } static int uv_tty_reset(uv_tty_t* handle, DWORD* error) { const COORD origin = {0, 0}; const WORD char_attrs = uv_tty_default_text_attributes; CONSOLE_SCREEN_BUFFER_INFO screen_buffer_info; DWORD count, written; if (*error != ERROR_SUCCESS) { return -1; } /* Reset original text attributes. */ if (!SetConsoleTextAttribute(handle->handle, char_attrs)) { *error = GetLastError(); return -1; } /* Move the cursor position to (0, 0). */ if (!SetConsoleCursorPosition(handle->handle, origin)) { *error = GetLastError(); return -1; } /* Clear the screen buffer. */ retry: if (!GetConsoleScreenBufferInfo(handle->handle, &screen_buffer_info)) { *error = GetLastError(); return -1; } count = screen_buffer_info.dwSize.X * screen_buffer_info.dwSize.Y; if (!(FillConsoleOutputCharacterW(handle->handle, L'\x20', count, origin, &written) && FillConsoleOutputAttribute(handle->handle, char_attrs, written, origin, &written))) { if (GetLastError() == ERROR_INVALID_PARAMETER) { /* The console may be resized - retry */ goto retry; } else { *error = GetLastError(); return -1; } } /* Move the virtual window up to the top. */ uv_tty_virtual_offset = 0; uv_tty_update_virtual_window(&screen_buffer_info); /* Reset the cursor size and the cursor state. */ if (!SetConsoleCursorInfo(handle->handle, &uv_tty_default_cursor_info)) { *error = GetLastError(); return -1; } return 0; } static int uv_tty_clear(uv_tty_t* handle, int dir, char entire_screen, DWORD* error) { CONSOLE_SCREEN_BUFFER_INFO info; COORD start, end; DWORD count, written; int x1, x2, y1, y2; int x1r, x2r, y1r, y2r; if (*error != ERROR_SUCCESS) { return -1; } if (dir == 0) { /* Clear from current position */ x1 = 0; x1r = 1; } else { /* Clear from column 0 */ x1 = 0; x1r = 0; } if (dir == 1) { /* Clear to current position */ x2 = 0; x2r = 1; } else { /* Clear to end of row. We pretend the console is 65536 characters wide, * uv_tty_make_real_coord will clip it to the actual console width. */ x2 = 0xffff; x2r = 0; } if (!entire_screen) { /* Stay on our own row */ y1 = y2 = 0; y1r = y2r = 1; } else { /* Apply columns direction to row */ y1 = x1; y1r = x1r; y2 = x2; y2r = x2r; } retry: if (!GetConsoleScreenBufferInfo(handle->handle, &info)) { *error = GetLastError(); return -1; } start = uv_tty_make_real_coord(handle, &info, x1, x1r, y1, y1r); end = uv_tty_make_real_coord(handle, &info, x2, x2r, y2, y2r); count = (end.Y * info.dwSize.X + end.X) - (start.Y * info.dwSize.X + start.X) + 1; if (!(FillConsoleOutputCharacterW(handle->handle, L'\x20', count, start, &written) && FillConsoleOutputAttribute(handle->handle, info.wAttributes, written, start, &written))) { if (GetLastError() == ERROR_INVALID_PARAMETER) { /* The console may be resized - retry */ goto retry; } else { *error = GetLastError(); return -1; } } return 0; } #define FLIP_FGBG \ do { \ WORD fg = info.wAttributes & 0xF; \ WORD bg = info.wAttributes & 0xF0; \ info.wAttributes &= 0xFF00; \ info.wAttributes |= fg << 4; \ info.wAttributes |= bg >> 4; \ } while (0) static int uv_tty_set_style(uv_tty_t* handle, DWORD* error) { unsigned short argc = handle->tty.wr.ansi_csi_argc; unsigned short* argv = handle->tty.wr.ansi_csi_argv; int i; CONSOLE_SCREEN_BUFFER_INFO info; char fg_color = -1, bg_color = -1; char fg_bright = -1, bg_bright = -1; char inverse = -1; if (argc == 0) { /* Reset mode */ fg_color = uv_tty_default_fg_color; bg_color = uv_tty_default_bg_color; fg_bright = uv_tty_default_fg_bright; bg_bright = uv_tty_default_bg_bright; inverse = uv_tty_default_inverse; } for (i = 0; i < argc; i++) { short arg = argv[i]; if (arg == 0) { /* Reset mode */ fg_color = uv_tty_default_fg_color; bg_color = uv_tty_default_bg_color; fg_bright = uv_tty_default_fg_bright; bg_bright = uv_tty_default_bg_bright; inverse = uv_tty_default_inverse; } else if (arg == 1) { /* Foreground bright on */ fg_bright = 1; } else if (arg == 2) { /* Both bright off */ fg_bright = 0; bg_bright = 0; } else if (arg == 5) { /* Background bright on */ bg_bright = 1; } else if (arg == 7) { /* Inverse: on */ inverse = 1; } else if (arg == 21 || arg == 22) { /* Foreground bright off */ fg_bright = 0; } else if (arg == 25) { /* Background bright off */ bg_bright = 0; } else if (arg == 27) { /* Inverse: off */ inverse = 0; } else if (arg >= 30 && arg <= 37) { /* Set foreground color */ fg_color = arg - 30; } else if (arg == 39) { /* Default text color */ fg_color = uv_tty_default_fg_color; fg_bright = uv_tty_default_fg_bright; } else if (arg >= 40 && arg <= 47) { /* Set background color */ bg_color = arg - 40; } else if (arg == 49) { /* Default background color */ bg_color = uv_tty_default_bg_color; bg_bright = uv_tty_default_bg_bright; } else if (arg >= 90 && arg <= 97) { /* Set bold foreground color */ fg_bright = 1; fg_color = arg - 90; } else if (arg >= 100 && arg <= 107) { /* Set bold background color */ bg_bright = 1; bg_color = arg - 100; } } if (fg_color == -1 && bg_color == -1 && fg_bright == -1 && bg_bright == -1 && inverse == -1) { /* Nothing changed */ return 0; } if (!GetConsoleScreenBufferInfo(handle->handle, &info)) { *error = GetLastError(); return -1; } if ((info.wAttributes & COMMON_LVB_REVERSE_VIDEO) > 0) { FLIP_FGBG; } if (fg_color != -1) { info.wAttributes &= ~(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); if (fg_color & 1) info.wAttributes |= FOREGROUND_RED; if (fg_color & 2) info.wAttributes |= FOREGROUND_GREEN; if (fg_color & 4) info.wAttributes |= FOREGROUND_BLUE; } if (fg_bright != -1) { if (fg_bright) { info.wAttributes |= FOREGROUND_INTENSITY; } else { info.wAttributes &= ~FOREGROUND_INTENSITY; } } if (bg_color != -1) { info.wAttributes &= ~(BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE); if (bg_color & 1) info.wAttributes |= BACKGROUND_RED; if (bg_color & 2) info.wAttributes |= BACKGROUND_GREEN; if (bg_color & 4) info.wAttributes |= BACKGROUND_BLUE; } if (bg_bright != -1) { if (bg_bright) { info.wAttributes |= BACKGROUND_INTENSITY; } else { info.wAttributes &= ~BACKGROUND_INTENSITY; } } if (inverse != -1) { if (inverse) { info.wAttributes |= COMMON_LVB_REVERSE_VIDEO; } else { info.wAttributes &= ~COMMON_LVB_REVERSE_VIDEO; } } if ((info.wAttributes & COMMON_LVB_REVERSE_VIDEO) > 0) { FLIP_FGBG; } if (!SetConsoleTextAttribute(handle->handle, info.wAttributes)) { *error = GetLastError(); return -1; } return 0; } static int uv_tty_save_state(uv_tty_t* handle, unsigned char save_attributes, DWORD* error) { CONSOLE_SCREEN_BUFFER_INFO info; if (*error != ERROR_SUCCESS) { return -1; } if (!GetConsoleScreenBufferInfo(handle->handle, &info)) { *error = GetLastError(); return -1; } uv_tty_update_virtual_window(&info); handle->tty.wr.saved_position.X = info.dwCursorPosition.X; handle->tty.wr.saved_position.Y = info.dwCursorPosition.Y - uv_tty_virtual_offset; handle->flags |= UV_HANDLE_TTY_SAVED_POSITION; if (save_attributes) { handle->tty.wr.saved_attributes = info.wAttributes & (FOREGROUND_INTENSITY | BACKGROUND_INTENSITY); handle->flags |= UV_HANDLE_TTY_SAVED_ATTRIBUTES; } return 0; } static int uv_tty_restore_state(uv_tty_t* handle, unsigned char restore_attributes, DWORD* error) { CONSOLE_SCREEN_BUFFER_INFO info; WORD new_attributes; if (*error != ERROR_SUCCESS) { return -1; } if (handle->flags & UV_HANDLE_TTY_SAVED_POSITION) { if (uv_tty_move_caret(handle, handle->tty.wr.saved_position.X, 0, handle->tty.wr.saved_position.Y, 0, error) != 0) { return -1; } } if (restore_attributes && (handle->flags & UV_HANDLE_TTY_SAVED_ATTRIBUTES)) { if (!GetConsoleScreenBufferInfo(handle->handle, &info)) { *error = GetLastError(); return -1; } new_attributes = info.wAttributes; new_attributes &= ~(FOREGROUND_INTENSITY | BACKGROUND_INTENSITY); new_attributes |= handle->tty.wr.saved_attributes; if (!SetConsoleTextAttribute(handle->handle, new_attributes)) { *error = GetLastError(); return -1; } } return 0; } static int uv_tty_set_cursor_visibility(uv_tty_t* handle, BOOL visible, DWORD* error) { CONSOLE_CURSOR_INFO cursor_info; if (!GetConsoleCursorInfo(handle->handle, &cursor_info)) { *error = GetLastError(); return -1; } cursor_info.bVisible = visible; if (!SetConsoleCursorInfo(handle->handle, &cursor_info)) { *error = GetLastError(); return -1; } return 0; } static int uv_tty_set_cursor_shape(uv_tty_t* handle, int style, DWORD* error) { CONSOLE_CURSOR_INFO cursor_info; if (!GetConsoleCursorInfo(handle->handle, &cursor_info)) { *error = GetLastError(); return -1; } if (style == 0) { cursor_info.dwSize = uv_tty_default_cursor_info.dwSize; } else if (style <= 2) { cursor_info.dwSize = CURSOR_SIZE_LARGE; } else { cursor_info.dwSize = CURSOR_SIZE_SMALL; } if (!SetConsoleCursorInfo(handle->handle, &cursor_info)) { *error = GetLastError(); return -1; } return 0; } static int uv_tty_write_bufs(uv_tty_t* handle, const uv_buf_t bufs[], unsigned int nbufs, DWORD* error) { /* We can only write 8k characters at a time. Windows can't handle much more * characters in a single console write anyway. */ WCHAR utf16_buf[MAX_CONSOLE_CHAR]; DWORD utf16_buf_used = 0; unsigned int i; #define FLUSH_TEXT() \ do { \ if (utf16_buf_used > 0) { \ uv_tty_emit_text(handle, utf16_buf, utf16_buf_used, error); \ utf16_buf_used = 0; \ } \ } while (0) #define ENSURE_BUFFER_SPACE(wchars_needed) \ if (wchars_needed > ARRAY_SIZE(utf16_buf) - utf16_buf_used) { \ FLUSH_TEXT(); \ } /* Cache for fast access */ unsigned char utf8_bytes_left = handle->tty.wr.utf8_bytes_left; unsigned int utf8_codepoint = handle->tty.wr.utf8_codepoint; unsigned char previous_eol = handle->tty.wr.previous_eol; unsigned short ansi_parser_state = handle->tty.wr.ansi_parser_state; /* Store the error here. If we encounter an error, stop trying to do i/o but * keep parsing the buffer so we leave the parser in a consistent state. */ *error = ERROR_SUCCESS; uv_sem_wait(&uv_tty_output_lock); for (i = 0; i < nbufs; i++) { uv_buf_t buf = bufs[i]; unsigned int j; for (j = 0; j < buf.len; j++) { unsigned char c = buf.base[j]; /* Run the character through the utf8 decoder We happily accept non * shortest form encodings and invalid code points - there's no real harm * that can be done. */ if (utf8_bytes_left == 0) { /* Read utf-8 start byte */ DWORD first_zero_bit; unsigned char not_c = ~c; #ifdef _MSC_VER /* msvc */ if (_BitScanReverse(&first_zero_bit, not_c)) { #else /* assume gcc */ if (c != 0) { first_zero_bit = (sizeof(int) * 8) - 1 - __builtin_clz(not_c); #endif if (first_zero_bit == 7) { /* Ascii - pass right through */ utf8_codepoint = (unsigned int) c; } else if (first_zero_bit <= 5) { /* Multibyte sequence */ utf8_codepoint = (0xff >> (8 - first_zero_bit)) & c; utf8_bytes_left = (char) (6 - first_zero_bit); } else { /* Invalid continuation */ utf8_codepoint = UNICODE_REPLACEMENT_CHARACTER; } } else { /* 0xff -- invalid */ utf8_codepoint = UNICODE_REPLACEMENT_CHARACTER; } } else if ((c & 0xc0) == 0x80) { /* Valid continuation of utf-8 multibyte sequence */ utf8_bytes_left--; utf8_codepoint <<= 6; utf8_codepoint |= ((unsigned int) c & 0x3f); } else { /* Start byte where continuation was expected. */ utf8_bytes_left = 0; utf8_codepoint = UNICODE_REPLACEMENT_CHARACTER; /* Patch buf offset so this character will be parsed again as a start * byte. */ j--; } /* Maybe we need to parse more bytes to find a character. */ if (utf8_bytes_left != 0) { continue; } /* Parse vt100/ansi escape codes */ if (uv__vterm_state == UV_TTY_SUPPORTED) { /* Pass through escape codes if conhost supports them. */ } else if (ansi_parser_state == ANSI_NORMAL) { switch (utf8_codepoint) { case '\033': ansi_parser_state = ANSI_ESCAPE_SEEN; continue; case 0233: ansi_parser_state = ANSI_CSI; handle->tty.wr.ansi_csi_argc = 0; continue; } } else if (ansi_parser_state == ANSI_ESCAPE_SEEN) { switch (utf8_codepoint) { case '[': ansi_parser_state = ANSI_CSI; handle->tty.wr.ansi_csi_argc = 0; continue; case '^': case '_': case 'P': case ']': /* Not supported, but we'll have to parse until we see a stop code, * e. g. ESC \ or BEL. */ ansi_parser_state = ANSI_ST_CONTROL; continue; case '\033': /* Ignore double escape. */ continue; case 'c': /* Full console reset. */ FLUSH_TEXT(); uv_tty_reset(handle, error); ansi_parser_state = ANSI_NORMAL; continue; case '7': /* Save the cursor position and text attributes. */ FLUSH_TEXT(); uv_tty_save_state(handle, 1, error); ansi_parser_state = ANSI_NORMAL; continue; case '8': /* Restore the cursor position and text attributes */ FLUSH_TEXT(); uv_tty_restore_state(handle, 1, error); ansi_parser_state = ANSI_NORMAL; continue; default: if (utf8_codepoint >= '@' && utf8_codepoint <= '_') { /* Single-char control. */ ansi_parser_state = ANSI_NORMAL; continue; } else { /* Invalid - proceed as normal, */ ansi_parser_state = ANSI_NORMAL; } } } else if (ansi_parser_state == ANSI_IGNORE) { /* We're ignoring this command. Stop only on command character. */ if (utf8_codepoint >= '@' && utf8_codepoint <= '~') { ansi_parser_state = ANSI_NORMAL; } continue; } else if (ansi_parser_state == ANSI_DECSCUSR) { /* So far we've the sequence `ESC [ arg space`, and we're waiting for * the final command byte. */ if (utf8_codepoint >= '@' && utf8_codepoint <= '~') { /* Command byte */ if (utf8_codepoint == 'q') { /* Change the cursor shape */ int style = handle->tty.wr.ansi_csi_argc ? handle->tty.wr.ansi_csi_argv[0] : 1; if (style >= 0 && style <= 6) { FLUSH_TEXT(); uv_tty_set_cursor_shape(handle, style, error); } } /* Sequence ended - go back to normal state. */ ansi_parser_state = ANSI_NORMAL; continue; } /* Unexpected character, but sequence hasn't ended yet. Ignore the rest * of the sequence. */ ansi_parser_state = ANSI_IGNORE; } else if (ansi_parser_state & ANSI_CSI) { /* So far we've seen `ESC [`, and we may or may not have already parsed * some of the arguments that follow. */ if (utf8_codepoint >= '0' && utf8_codepoint <= '9') { /* Parse a numerical argument. */ if (!(ansi_parser_state & ANSI_IN_ARG)) { /* We were not currently parsing a number, add a new one. */ /* Check for that there are too many arguments. */ if (handle->tty.wr.ansi_csi_argc >= ARRAY_SIZE(handle->tty.wr.ansi_csi_argv)) { ansi_parser_state = ANSI_IGNORE; continue; } ansi_parser_state |= ANSI_IN_ARG; handle->tty.wr.ansi_csi_argc++; handle->tty.wr.ansi_csi_argv[handle->tty.wr.ansi_csi_argc - 1] = (unsigned short) utf8_codepoint - '0'; continue; } else { /* We were already parsing a number. Parse next digit. */ uint32_t value = 10 * handle->tty.wr.ansi_csi_argv[handle->tty.wr.ansi_csi_argc - 1]; /* Check for overflow. */ if (value > UINT16_MAX) { ansi_parser_state = ANSI_IGNORE; continue; } handle->tty.wr.ansi_csi_argv[handle->tty.wr.ansi_csi_argc - 1] = (unsigned short) value + (utf8_codepoint - '0'); continue; } } else if (utf8_codepoint == ';') { /* Denotes the end of an argument. */ if (ansi_parser_state & ANSI_IN_ARG) { ansi_parser_state &= ~ANSI_IN_ARG; continue; } else { /* If ANSI_IN_ARG is not set, add another argument and default * it to 0. */ /* Check for too many arguments */ if (handle->tty.wr.ansi_csi_argc >= ARRAY_SIZE(handle->tty.wr.ansi_csi_argv)) { ansi_parser_state = ANSI_IGNORE; continue; } handle->tty.wr.ansi_csi_argc++; handle->tty.wr.ansi_csi_argv[handle->tty.wr.ansi_csi_argc - 1] = 0; continue; } } else if (utf8_codepoint == '?' && !(ansi_parser_state & ANSI_IN_ARG) && !(ansi_parser_state & ANSI_EXTENSION) && handle->tty.wr.ansi_csi_argc == 0) { /* Pass through '?' if it is the first character after CSI */ /* This is an extension character from the VT100 codeset */ /* that is supported and used by most ANSI terminals today. */ ansi_parser_state |= ANSI_EXTENSION; continue; } else if (utf8_codepoint == ' ' && !(ansi_parser_state & ANSI_EXTENSION)) { /* We expect a command byte to follow after this space. The only * command that we current support is 'set cursor style'. */ ansi_parser_state = ANSI_DECSCUSR; continue; } else if (utf8_codepoint >= '@' && utf8_codepoint <= '~') { /* Command byte */ if (ansi_parser_state & ANSI_EXTENSION) { /* Sequence is `ESC [ ? args command`. */ switch (utf8_codepoint) { case 'l': /* Hide the cursor */ if (handle->tty.wr.ansi_csi_argc == 1 && handle->tty.wr.ansi_csi_argv[0] == 25) { FLUSH_TEXT(); uv_tty_set_cursor_visibility(handle, 0, error); } break; case 'h': /* Show the cursor */ if (handle->tty.wr.ansi_csi_argc == 1 && handle->tty.wr.ansi_csi_argv[0] == 25) { FLUSH_TEXT(); uv_tty_set_cursor_visibility(handle, 1, error); } break; } } else { /* Sequence is `ESC [ args command`. */ int x, y, d; switch (utf8_codepoint) { case 'A': /* cursor up */ FLUSH_TEXT(); y = -(handle->tty.wr.ansi_csi_argc ? handle->tty.wr.ansi_csi_argv[0] : 1); uv_tty_move_caret(handle, 0, 1, y, 1, error); break; case 'B': /* cursor down */ FLUSH_TEXT(); y = handle->tty.wr.ansi_csi_argc ? handle->tty.wr.ansi_csi_argv[0] : 1; uv_tty_move_caret(handle, 0, 1, y, 1, error); break; case 'C': /* cursor forward */ FLUSH_TEXT(); x = handle->tty.wr.ansi_csi_argc ? handle->tty.wr.ansi_csi_argv[0] : 1; uv_tty_move_caret(handle, x, 1, 0, 1, error); break; case 'D': /* cursor back */ FLUSH_TEXT(); x = -(handle->tty.wr.ansi_csi_argc ? handle->tty.wr.ansi_csi_argv[0] : 1); uv_tty_move_caret(handle, x, 1, 0, 1, error); break; case 'E': /* cursor next line */ FLUSH_TEXT(); y = handle->tty.wr.ansi_csi_argc ? handle->tty.wr.ansi_csi_argv[0] : 1; uv_tty_move_caret(handle, 0, 0, y, 1, error); break; case 'F': /* cursor previous line */ FLUSH_TEXT(); y = -(handle->tty.wr.ansi_csi_argc ? handle->tty.wr.ansi_csi_argv[0] : 1); uv_tty_move_caret(handle, 0, 0, y, 1, error); break; case 'G': /* cursor horizontal move absolute */ FLUSH_TEXT(); x = (handle->tty.wr.ansi_csi_argc >= 1 && handle->tty.wr.ansi_csi_argv[0]) ? handle->tty.wr.ansi_csi_argv[0] - 1 : 0; uv_tty_move_caret(handle, x, 0, 0, 1, error); break; case 'H': case 'f': /* cursor move absolute */ FLUSH_TEXT(); y = (handle->tty.wr.ansi_csi_argc >= 1 && handle->tty.wr.ansi_csi_argv[0]) ? handle->tty.wr.ansi_csi_argv[0] - 1 : 0; x = (handle->tty.wr.ansi_csi_argc >= 2 && handle->tty.wr.ansi_csi_argv[1]) ? handle->tty.wr.ansi_csi_argv[1] - 1 : 0; uv_tty_move_caret(handle, x, 0, y, 0, error); break; case 'J': /* Erase screen */ FLUSH_TEXT(); d = handle->tty.wr.ansi_csi_argc ? handle->tty.wr.ansi_csi_argv[0] : 0; if (d >= 0 && d <= 2) { uv_tty_clear(handle, d, 1, error); } break; case 'K': /* Erase line */ FLUSH_TEXT(); d = handle->tty.wr.ansi_csi_argc ? handle->tty.wr.ansi_csi_argv[0] : 0; if (d >= 0 && d <= 2) { uv_tty_clear(handle, d, 0, error); } break; case 'm': /* Set style */ FLUSH_TEXT(); uv_tty_set_style(handle, error); break; case 's': /* Save the cursor position. */ FLUSH_TEXT(); uv_tty_save_state(handle, 0, error); break; case 'u': /* Restore the cursor position */ FLUSH_TEXT(); uv_tty_restore_state(handle, 0, error); break; } } /* Sequence ended - go back to normal state. */ ansi_parser_state = ANSI_NORMAL; continue; } else { /* We don't support commands that use private mode characters or * intermediaries. Ignore the rest of the sequence. */ ansi_parser_state = ANSI_IGNORE; continue; } } else if (ansi_parser_state & ANSI_ST_CONTROL) { /* Unsupported control code. * Ignore everything until we see `BEL` or `ESC \`. */ if (ansi_parser_state & ANSI_IN_STRING) { if (!(ansi_parser_state & ANSI_BACKSLASH_SEEN)) { if (utf8_codepoint == '"') { ansi_parser_state &= ~ANSI_IN_STRING; } else if (utf8_codepoint == '\\') { ansi_parser_state |= ANSI_BACKSLASH_SEEN; } } else { ansi_parser_state &= ~ANSI_BACKSLASH_SEEN; } } else { if (utf8_codepoint == '\007' || (utf8_codepoint == '\\' && (ansi_parser_state & ANSI_ESCAPE_SEEN))) { /* End of sequence */ ansi_parser_state = ANSI_NORMAL; } else if (utf8_codepoint == '\033') { /* Escape character */ ansi_parser_state |= ANSI_ESCAPE_SEEN; } else if (utf8_codepoint == '"') { /* String starting */ ansi_parser_state |= ANSI_IN_STRING; ansi_parser_state &= ~ANSI_ESCAPE_SEEN; ansi_parser_state &= ~ANSI_BACKSLASH_SEEN; } else { ansi_parser_state &= ~ANSI_ESCAPE_SEEN; } } continue; } else { /* Inconsistent state */ abort(); } /* We wouldn't mind emitting utf-16 surrogate pairs. Too bad, the windows * console doesn't really support UTF-16, so just emit the replacement * character. */ if (utf8_codepoint > 0xffff) { utf8_codepoint = UNICODE_REPLACEMENT_CHARACTER; } if (utf8_codepoint == 0x0a || utf8_codepoint == 0x0d) { /* EOL conversion - emit \r\n when we see \n. */ if (utf8_codepoint == 0x0a && previous_eol != 0x0d) { /* \n was not preceded by \r; print \r\n. */ ENSURE_BUFFER_SPACE(2); utf16_buf[utf16_buf_used++] = L'\r'; utf16_buf[utf16_buf_used++] = L'\n'; } else if (utf8_codepoint == 0x0d && previous_eol == 0x0a) { /* \n was followed by \r; do not print the \r, since the source was * either \r\n\r (so the second \r is redundant) or was \n\r (so the * \n was processed by the last case and an \r automatically * inserted). */ } else { /* \r without \n; print \r as-is. */ ENSURE_BUFFER_SPACE(1); utf16_buf[utf16_buf_used++] = (WCHAR) utf8_codepoint; } previous_eol = (char) utf8_codepoint; } else if (utf8_codepoint <= 0xffff) { /* Encode character into utf-16 buffer. */ ENSURE_BUFFER_SPACE(1); utf16_buf[utf16_buf_used++] = (WCHAR) utf8_codepoint; previous_eol = 0; } } } /* Flush remaining characters */ FLUSH_TEXT(); /* Copy cached values back to struct. */ handle->tty.wr.utf8_bytes_left = utf8_bytes_left; handle->tty.wr.utf8_codepoint = utf8_codepoint; handle->tty.wr.previous_eol = previous_eol; handle->tty.wr.ansi_parser_state = ansi_parser_state; uv_sem_post(&uv_tty_output_lock); if (*error == STATUS_SUCCESS) { return 0; } else { return -1; } #undef FLUSH_TEXT } int uv_tty_write(uv_loop_t* loop, uv_write_t* req, uv_tty_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb) { DWORD error; UV_REQ_INIT(req, UV_WRITE); req->handle = (uv_stream_t*) handle; req->cb = cb; handle->reqs_pending++; handle->stream.conn.write_reqs_pending++; REGISTER_HANDLE_REQ(loop, handle, req); req->u.io.queued_bytes = 0; if (!uv_tty_write_bufs(handle, bufs, nbufs, &error)) { SET_REQ_SUCCESS(req); } else { SET_REQ_ERROR(req, error); } uv_insert_pending_req(loop, (uv_req_t*) req); return 0; } int uv__tty_try_write(uv_tty_t* handle, const uv_buf_t bufs[], unsigned int nbufs) { DWORD error; if (handle->stream.conn.write_reqs_pending > 0) return UV_EAGAIN; if (uv_tty_write_bufs(handle, bufs, nbufs, &error)) return uv_translate_sys_error(error); return uv__count_bufs(bufs, nbufs); } void uv_process_tty_write_req(uv_loop_t* loop, uv_tty_t* handle, uv_write_t* req) { int err; handle->write_queue_size -= req->u.io.queued_bytes; UNREGISTER_HANDLE_REQ(loop, handle, req); if (req->cb) { err = GET_REQ_ERROR(req); req->cb(req, uv_translate_sys_error(err)); } handle->stream.conn.write_reqs_pending--; if (handle->stream.conn.shutdown_req != NULL && handle->stream.conn.write_reqs_pending == 0) { uv_want_endgame(loop, (uv_handle_t*)handle); } DECREASE_PENDING_REQ_COUNT(handle); } void uv_tty_close(uv_tty_t* handle) { assert(handle->u.fd == -1 || handle->u.fd > 2); if (handle->flags & UV_HANDLE_READING) uv_tty_read_stop(handle); if (handle->u.fd == -1) CloseHandle(handle->handle); else close(handle->u.fd); handle->u.fd = -1; handle->handle = INVALID_HANDLE_VALUE; handle->flags &= ~(UV_HANDLE_READABLE | UV_HANDLE_WRITABLE); uv__handle_closing(handle); if (handle->reqs_pending == 0) { uv_want_endgame(handle->loop, (uv_handle_t*) handle); } } void uv_tty_endgame(uv_loop_t* loop, uv_tty_t* handle) { if (!(handle->flags & UV_HANDLE_TTY_READABLE) && handle->stream.conn.shutdown_req != NULL && handle->stream.conn.write_reqs_pending == 0) { UNREGISTER_HANDLE_REQ(loop, handle, handle->stream.conn.shutdown_req); /* TTY shutdown is really just a no-op */ if (handle->stream.conn.shutdown_req->cb) { if (handle->flags & UV_HANDLE_CLOSING) { handle->stream.conn.shutdown_req->cb(handle->stream.conn.shutdown_req, UV_ECANCELED); } else { handle->stream.conn.shutdown_req->cb(handle->stream.conn.shutdown_req, 0); } } handle->stream.conn.shutdown_req = NULL; DECREASE_PENDING_REQ_COUNT(handle); return; } if (handle->flags & UV_HANDLE_CLOSING && handle->reqs_pending == 0) { /* The wait handle used for raw reading should be unregistered when the * wait callback runs. */ assert(!(handle->flags & UV_HANDLE_TTY_READABLE) || handle->tty.rd.read_raw_wait == NULL); assert(!(handle->flags & UV_HANDLE_CLOSED)); uv__handle_close(handle); } } /* * uv_process_tty_accept_req() is a stub to keep DELEGATE_STREAM_REQ working * TODO: find a way to remove it */ void uv_process_tty_accept_req(uv_loop_t* loop, uv_tty_t* handle, uv_req_t* raw_req) { abort(); } /* * uv_process_tty_connect_req() is a stub to keep DELEGATE_STREAM_REQ working * TODO: find a way to remove it */ void uv_process_tty_connect_req(uv_loop_t* loop, uv_tty_t* handle, uv_connect_t* req) { abort(); } int uv_tty_reset_mode(void) { /* Not necessary to do anything. */ return 0; } /* Determine whether or not this version of windows supports * proper ANSI color codes. Should be supported as of windows * 10 version 1511, build number 10.0.10586. */ static void uv__determine_vterm_state(HANDLE handle) { DWORD dwMode = 0; uv__need_check_vterm_state = FALSE; if (!GetConsoleMode(handle, &dwMode)) { return; } dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; if (!SetConsoleMode(handle, dwMode)) { return; } uv__vterm_state = UV_TTY_SUPPORTED; } static DWORD WINAPI uv__tty_console_resize_message_loop_thread(void* param) { NTSTATUS status; ULONG_PTR conhost_pid; MSG msg; if (pSetWinEventHook == NULL || pNtQueryInformationProcess == NULL) return 0; status = pNtQueryInformationProcess(GetCurrentProcess(), ProcessConsoleHostProcess, &conhost_pid, sizeof(conhost_pid), NULL); if (!NT_SUCCESS(status)) { /* We couldn't retrieve our console host process, probably because this * is a 32-bit process running on 64-bit Windows. Fall back to receiving * console events from the input stream only. */ return 0; } /* Ensure the PID is a multiple of 4, which is required by SetWinEventHook */ conhost_pid &= ~(ULONG_PTR)0x3; uv__tty_console_resized = CreateEvent(NULL, TRUE, FALSE, NULL); if (uv__tty_console_resized == NULL) return 0; if (QueueUserWorkItem(uv__tty_console_resize_watcher_thread, NULL, WT_EXECUTELONGFUNCTION) == 0) return 0; if (!pSetWinEventHook(EVENT_CONSOLE_LAYOUT, EVENT_CONSOLE_LAYOUT, NULL, uv__tty_console_resize_event, (DWORD)conhost_pid, 0, WINEVENT_OUTOFCONTEXT)) return 0; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } static void CALLBACK uv__tty_console_resize_event(HWINEVENTHOOK hWinEventHook, DWORD event, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime) { SetEvent(uv__tty_console_resized); } static DWORD WINAPI uv__tty_console_resize_watcher_thread(void* param) { for (;;) { /* Make sure to not overwhelm the system with resize events */ Sleep(33); WaitForSingleObject(uv__tty_console_resized, INFINITE); uv__tty_console_signal_resize(); ResetEvent(uv__tty_console_resized); } } static void uv__tty_console_signal_resize(void) { CONSOLE_SCREEN_BUFFER_INFO sb_info; int width, height; if (!GetConsoleScreenBufferInfo(uv__tty_console_handle, &sb_info)) return; width = sb_info.dwSize.X; height = sb_info.srWindow.Bottom - sb_info.srWindow.Top + 1; uv_mutex_lock(&uv__tty_console_resize_mutex); assert(uv__tty_console_width != -1 && uv__tty_console_height != -1); if (width != uv__tty_console_width || height != uv__tty_console_height) { uv__tty_console_width = width; uv__tty_console_height = height; uv_mutex_unlock(&uv__tty_console_resize_mutex); uv__signal_dispatch(SIGWINCH); } else { uv_mutex_unlock(&uv__tty_console_resize_mutex); } } void uv_tty_set_vterm_state(uv_tty_vtermstate_t state) { uv_sem_wait(&uv_tty_output_lock); uv__need_check_vterm_state = FALSE; uv__vterm_state = state; uv_sem_post(&uv_tty_output_lock); } int uv_tty_get_vterm_state(uv_tty_vtermstate_t* state) { uv_sem_wait(&uv_tty_output_lock); *state = uv__vterm_state; uv_sem_post(&uv_tty_output_lock); return 0; } ================================================ FILE: external/libuv/src/win/udp.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include "uv.h" #include "internal.h" #include "handle-inl.h" #include "stream-inl.h" #include "req-inl.h" /* * Threshold of active udp streams for which to preallocate udp read buffers. */ const unsigned int uv_active_udp_streams_threshold = 0; /* A zero-size buffer for use by uv_udp_read */ static char uv_zero_[] = ""; int uv_udp_getpeername(const uv_udp_t* handle, struct sockaddr* name, int* namelen) { return uv__getsockpeername((const uv_handle_t*) handle, getpeername, name, namelen, 0); } int uv_udp_getsockname(const uv_udp_t* handle, struct sockaddr* name, int* namelen) { return uv__getsockpeername((const uv_handle_t*) handle, getsockname, name, namelen, 0); } static int uv_udp_set_socket(uv_loop_t* loop, uv_udp_t* handle, SOCKET socket, int family) { DWORD yes = 1; WSAPROTOCOL_INFOW info; int opt_len; if (handle->socket != INVALID_SOCKET) return UV_EBUSY; /* Set the socket to nonblocking mode */ if (ioctlsocket(socket, FIONBIO, &yes) == SOCKET_ERROR) { return WSAGetLastError(); } /* Make the socket non-inheritable */ if (!SetHandleInformation((HANDLE)socket, HANDLE_FLAG_INHERIT, 0)) { return GetLastError(); } /* Associate it with the I/O completion port. Use uv_handle_t pointer as * completion key. */ if (CreateIoCompletionPort((HANDLE)socket, loop->iocp, (ULONG_PTR)socket, 0) == NULL) { return GetLastError(); } /* All known Windows that support SetFileCompletionNotificationModes have a * bug that makes it impossible to use this function in conjunction with * datagram sockets. We can work around that but only if the user is using * the default UDP driver (AFD) and has no other. LSPs stacked on top. Here * we check whether that is the case. */ opt_len = (int) sizeof info; if (getsockopt( socket, SOL_SOCKET, SO_PROTOCOL_INFOW, (char*) &info, &opt_len) == SOCKET_ERROR) { return GetLastError(); } if (info.ProtocolChain.ChainLen == 1) { if (SetFileCompletionNotificationModes( (HANDLE) socket, FILE_SKIP_SET_EVENT_ON_HANDLE | FILE_SKIP_COMPLETION_PORT_ON_SUCCESS)) { handle->flags |= UV_HANDLE_SYNC_BYPASS_IOCP; handle->func_wsarecv = uv_wsarecv_workaround; handle->func_wsarecvfrom = uv_wsarecvfrom_workaround; } else if (GetLastError() != ERROR_INVALID_FUNCTION) { return GetLastError(); } } handle->socket = socket; if (family == AF_INET6) { handle->flags |= UV_HANDLE_IPV6; } else { assert(!(handle->flags & UV_HANDLE_IPV6)); } return 0; } int uv__udp_init_ex(uv_loop_t* loop, uv_udp_t* handle, unsigned flags, int domain) { uv__handle_init(loop, (uv_handle_t*) handle, UV_UDP); handle->socket = INVALID_SOCKET; handle->reqs_pending = 0; handle->activecnt = 0; handle->func_wsarecv = WSARecv; handle->func_wsarecvfrom = WSARecvFrom; handle->send_queue_size = 0; handle->send_queue_count = 0; UV_REQ_INIT(&handle->recv_req, UV_UDP_RECV); handle->recv_req.data = handle; /* If anything fails beyond this point we need to remove the handle from * the handle queue, since it was added by uv__handle_init. */ if (domain != AF_UNSPEC) { SOCKET sock; DWORD err; sock = socket(domain, SOCK_DGRAM, 0); if (sock == INVALID_SOCKET) { err = WSAGetLastError(); QUEUE_REMOVE(&handle->handle_queue); return uv_translate_sys_error(err); } err = uv_udp_set_socket(handle->loop, handle, sock, domain); if (err) { closesocket(sock); QUEUE_REMOVE(&handle->handle_queue); return uv_translate_sys_error(err); } } return 0; } void uv_udp_close(uv_loop_t* loop, uv_udp_t* handle) { uv_udp_recv_stop(handle); closesocket(handle->socket); handle->socket = INVALID_SOCKET; uv__handle_closing(handle); if (handle->reqs_pending == 0) { uv_want_endgame(loop, (uv_handle_t*) handle); } } void uv_udp_endgame(uv_loop_t* loop, uv_udp_t* handle) { if (handle->flags & UV_HANDLE_CLOSING && handle->reqs_pending == 0) { assert(!(handle->flags & UV_HANDLE_CLOSED)); uv__handle_close(handle); } } static int uv_udp_maybe_bind(uv_udp_t* handle, const struct sockaddr* addr, unsigned int addrlen, unsigned int flags) { int r; int err; DWORD no = 0; if (handle->flags & UV_HANDLE_BOUND) return 0; if ((flags & UV_UDP_IPV6ONLY) && addr->sa_family != AF_INET6) { /* UV_UDP_IPV6ONLY is supported only for IPV6 sockets */ return ERROR_INVALID_PARAMETER; } if (handle->socket == INVALID_SOCKET) { SOCKET sock = socket(addr->sa_family, SOCK_DGRAM, 0); if (sock == INVALID_SOCKET) { return WSAGetLastError(); } err = uv_udp_set_socket(handle->loop, handle, sock, addr->sa_family); if (err) { closesocket(sock); return err; } } if (flags & UV_UDP_REUSEADDR) { DWORD yes = 1; /* Set SO_REUSEADDR on the socket. */ if (setsockopt(handle->socket, SOL_SOCKET, SO_REUSEADDR, (char*) &yes, sizeof yes) == SOCKET_ERROR) { err = WSAGetLastError(); return err; } } if (addr->sa_family == AF_INET6) handle->flags |= UV_HANDLE_IPV6; if (addr->sa_family == AF_INET6 && !(flags & UV_UDP_IPV6ONLY)) { /* On windows IPV6ONLY is on by default. If the user doesn't specify it * libuv turns it off. */ /* TODO: how to handle errors? This may fail if there is no ipv4 stack * available, or when run on XP/2003 which have no support for dualstack * sockets. For now we're silently ignoring the error. */ setsockopt(handle->socket, IPPROTO_IPV6, IPV6_V6ONLY, (char*) &no, sizeof no); } r = bind(handle->socket, addr, addrlen); if (r == SOCKET_ERROR) { return WSAGetLastError(); } handle->flags |= UV_HANDLE_BOUND; return 0; } static void uv_udp_queue_recv(uv_loop_t* loop, uv_udp_t* handle) { uv_req_t* req; uv_buf_t buf; DWORD bytes, flags; int result; assert(handle->flags & UV_HANDLE_READING); assert(!(handle->flags & UV_HANDLE_READ_PENDING)); req = &handle->recv_req; memset(&req->u.io.overlapped, 0, sizeof(req->u.io.overlapped)); /* * Preallocate a read buffer if the number of active streams is below * the threshold. */ if (loop->active_udp_streams < uv_active_udp_streams_threshold) { handle->flags &= ~UV_HANDLE_ZERO_READ; handle->recv_buffer = uv_buf_init(NULL, 0); handle->alloc_cb((uv_handle_t*) handle, 65536, &handle->recv_buffer); if (handle->recv_buffer.base == NULL || handle->recv_buffer.len == 0) { handle->recv_cb(handle, UV_ENOBUFS, &handle->recv_buffer, NULL, 0); return; } assert(handle->recv_buffer.base != NULL); buf = handle->recv_buffer; memset(&handle->recv_from, 0, sizeof handle->recv_from); handle->recv_from_len = sizeof handle->recv_from; flags = 0; result = handle->func_wsarecvfrom(handle->socket, (WSABUF*) &buf, 1, &bytes, &flags, (struct sockaddr*) &handle->recv_from, &handle->recv_from_len, &req->u.io.overlapped, NULL); if (UV_SUCCEEDED_WITHOUT_IOCP(result == 0)) { /* Process the req without IOCP. */ handle->flags |= UV_HANDLE_READ_PENDING; req->u.io.overlapped.InternalHigh = bytes; handle->reqs_pending++; uv_insert_pending_req(loop, req); } else if (UV_SUCCEEDED_WITH_IOCP(result == 0)) { /* The req will be processed with IOCP. */ handle->flags |= UV_HANDLE_READ_PENDING; handle->reqs_pending++; } else { /* Make this req pending reporting an error. */ SET_REQ_ERROR(req, WSAGetLastError()); uv_insert_pending_req(loop, req); handle->reqs_pending++; } } else { handle->flags |= UV_HANDLE_ZERO_READ; buf.base = (char*) uv_zero_; buf.len = 0; flags = MSG_PEEK; result = handle->func_wsarecv(handle->socket, (WSABUF*) &buf, 1, &bytes, &flags, &req->u.io.overlapped, NULL); if (UV_SUCCEEDED_WITHOUT_IOCP(result == 0)) { /* Process the req without IOCP. */ handle->flags |= UV_HANDLE_READ_PENDING; req->u.io.overlapped.InternalHigh = bytes; handle->reqs_pending++; uv_insert_pending_req(loop, req); } else if (UV_SUCCEEDED_WITH_IOCP(result == 0)) { /* The req will be processed with IOCP. */ handle->flags |= UV_HANDLE_READ_PENDING; handle->reqs_pending++; } else { /* Make this req pending reporting an error. */ SET_REQ_ERROR(req, WSAGetLastError()); uv_insert_pending_req(loop, req); handle->reqs_pending++; } } } int uv__udp_recv_start(uv_udp_t* handle, uv_alloc_cb alloc_cb, uv_udp_recv_cb recv_cb) { uv_loop_t* loop = handle->loop; int err; if (handle->flags & UV_HANDLE_READING) { return UV_EALREADY; } err = uv_udp_maybe_bind(handle, (const struct sockaddr*) &uv_addr_ip4_any_, sizeof(uv_addr_ip4_any_), 0); if (err) return uv_translate_sys_error(err); handle->flags |= UV_HANDLE_READING; INCREASE_ACTIVE_COUNT(loop, handle); loop->active_udp_streams++; handle->recv_cb = recv_cb; handle->alloc_cb = alloc_cb; /* If reading was stopped and then started again, there could still be a recv * request pending. */ if (!(handle->flags & UV_HANDLE_READ_PENDING)) uv_udp_queue_recv(loop, handle); return 0; } int uv__udp_recv_stop(uv_udp_t* handle) { if (handle->flags & UV_HANDLE_READING) { handle->flags &= ~UV_HANDLE_READING; handle->loop->active_udp_streams--; DECREASE_ACTIVE_COUNT(loop, handle); } return 0; } static int uv__send(uv_udp_send_t* req, uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr, unsigned int addrlen, uv_udp_send_cb cb) { uv_loop_t* loop = handle->loop; DWORD result, bytes; UV_REQ_INIT(req, UV_UDP_SEND); req->handle = handle; req->cb = cb; memset(&req->u.io.overlapped, 0, sizeof(req->u.io.overlapped)); result = WSASendTo(handle->socket, (WSABUF*)bufs, nbufs, &bytes, 0, addr, addrlen, &req->u.io.overlapped, NULL); if (UV_SUCCEEDED_WITHOUT_IOCP(result == 0)) { /* Request completed immediately. */ req->u.io.queued_bytes = 0; handle->reqs_pending++; handle->send_queue_size += req->u.io.queued_bytes; handle->send_queue_count++; REGISTER_HANDLE_REQ(loop, handle, req); uv_insert_pending_req(loop, (uv_req_t*)req); } else if (UV_SUCCEEDED_WITH_IOCP(result == 0)) { /* Request queued by the kernel. */ req->u.io.queued_bytes = uv__count_bufs(bufs, nbufs); handle->reqs_pending++; handle->send_queue_size += req->u.io.queued_bytes; handle->send_queue_count++; REGISTER_HANDLE_REQ(loop, handle, req); } else { /* Send failed due to an error. */ return WSAGetLastError(); } return 0; } void uv_process_udp_recv_req(uv_loop_t* loop, uv_udp_t* handle, uv_req_t* req) { uv_buf_t buf; int partial; assert(handle->type == UV_UDP); handle->flags &= ~UV_HANDLE_READ_PENDING; if (!REQ_SUCCESS(req)) { DWORD err = GET_REQ_SOCK_ERROR(req); if (err == WSAEMSGSIZE) { /* Not a real error, it just indicates that the received packet was * bigger than the receive buffer. */ } else if (err == WSAECONNRESET || err == WSAENETRESET) { /* A previous sendto operation failed; ignore this error. If zero-reading * we need to call WSARecv/WSARecvFrom _without_ the. MSG_PEEK flag to * clear out the error queue. For nonzero reads, immediately queue a new * receive. */ if (!(handle->flags & UV_HANDLE_ZERO_READ)) { goto done; } } else { /* A real error occurred. Report the error to the user only if we're * currently reading. */ if (handle->flags & UV_HANDLE_READING) { uv_udp_recv_stop(handle); buf = (handle->flags & UV_HANDLE_ZERO_READ) ? uv_buf_init(NULL, 0) : handle->recv_buffer; handle->recv_cb(handle, uv_translate_sys_error(err), &buf, NULL, 0); } goto done; } } if (!(handle->flags & UV_HANDLE_ZERO_READ)) { /* Successful read */ partial = !REQ_SUCCESS(req); handle->recv_cb(handle, req->u.io.overlapped.InternalHigh, &handle->recv_buffer, (const struct sockaddr*) &handle->recv_from, partial ? UV_UDP_PARTIAL : 0); } else if (handle->flags & UV_HANDLE_READING) { DWORD bytes, err, flags; struct sockaddr_storage from; int from_len; /* Do a nonblocking receive. * TODO: try to read multiple datagrams at once. FIONREAD maybe? */ buf = uv_buf_init(NULL, 0); handle->alloc_cb((uv_handle_t*) handle, 65536, &buf); if (buf.base == NULL || buf.len == 0) { handle->recv_cb(handle, UV_ENOBUFS, &buf, NULL, 0); goto done; } assert(buf.base != NULL); memset(&from, 0, sizeof from); from_len = sizeof from; flags = 0; if (WSARecvFrom(handle->socket, (WSABUF*)&buf, 1, &bytes, &flags, (struct sockaddr*) &from, &from_len, NULL, NULL) != SOCKET_ERROR) { /* Message received */ handle->recv_cb(handle, bytes, &buf, (const struct sockaddr*) &from, 0); } else { err = WSAGetLastError(); if (err == WSAEMSGSIZE) { /* Message truncated */ handle->recv_cb(handle, bytes, &buf, (const struct sockaddr*) &from, UV_UDP_PARTIAL); } else if (err == WSAEWOULDBLOCK) { /* Kernel buffer empty */ handle->recv_cb(handle, 0, &buf, NULL, 0); } else if (err == WSAECONNRESET || err == WSAENETRESET) { /* WSAECONNRESET/WSANETRESET is ignored because this just indicates * that a previous sendto operation failed. */ handle->recv_cb(handle, 0, &buf, NULL, 0); } else { /* Any other error that we want to report back to the user. */ uv_udp_recv_stop(handle); handle->recv_cb(handle, uv_translate_sys_error(err), &buf, NULL, 0); } } } done: /* Post another read if still reading and not closing. */ if ((handle->flags & UV_HANDLE_READING) && !(handle->flags & UV_HANDLE_READ_PENDING)) { uv_udp_queue_recv(loop, handle); } DECREASE_PENDING_REQ_COUNT(handle); } void uv_process_udp_send_req(uv_loop_t* loop, uv_udp_t* handle, uv_udp_send_t* req) { int err; assert(handle->type == UV_UDP); assert(handle->send_queue_size >= req->u.io.queued_bytes); assert(handle->send_queue_count >= 1); handle->send_queue_size -= req->u.io.queued_bytes; handle->send_queue_count--; UNREGISTER_HANDLE_REQ(loop, handle, req); if (req->cb) { err = 0; if (!REQ_SUCCESS(req)) { err = GET_REQ_SOCK_ERROR(req); } req->cb(req, uv_translate_sys_error(err)); } DECREASE_PENDING_REQ_COUNT(handle); } static int uv__udp_set_membership4(uv_udp_t* handle, const struct sockaddr_in* multicast_addr, const char* interface_addr, uv_membership membership) { int err; int optname; struct ip_mreq mreq; if (handle->flags & UV_HANDLE_IPV6) return UV_EINVAL; /* If the socket is unbound, bind to inaddr_any. */ err = uv_udp_maybe_bind(handle, (const struct sockaddr*) &uv_addr_ip4_any_, sizeof(uv_addr_ip4_any_), UV_UDP_REUSEADDR); if (err) return uv_translate_sys_error(err); memset(&mreq, 0, sizeof mreq); if (interface_addr) { err = uv_inet_pton(AF_INET, interface_addr, &mreq.imr_interface.s_addr); if (err) return err; } else { mreq.imr_interface.s_addr = htonl(INADDR_ANY); } mreq.imr_multiaddr.s_addr = multicast_addr->sin_addr.s_addr; switch (membership) { case UV_JOIN_GROUP: optname = IP_ADD_MEMBERSHIP; break; case UV_LEAVE_GROUP: optname = IP_DROP_MEMBERSHIP; break; default: return UV_EINVAL; } if (setsockopt(handle->socket, IPPROTO_IP, optname, (char*) &mreq, sizeof mreq) == SOCKET_ERROR) { return uv_translate_sys_error(WSAGetLastError()); } return 0; } int uv__udp_set_membership6(uv_udp_t* handle, const struct sockaddr_in6* multicast_addr, const char* interface_addr, uv_membership membership) { int optname; int err; struct ipv6_mreq mreq; struct sockaddr_in6 addr6; if ((handle->flags & UV_HANDLE_BOUND) && !(handle->flags & UV_HANDLE_IPV6)) return UV_EINVAL; err = uv_udp_maybe_bind(handle, (const struct sockaddr*) &uv_addr_ip6_any_, sizeof(uv_addr_ip6_any_), UV_UDP_REUSEADDR); if (err) return uv_translate_sys_error(err); memset(&mreq, 0, sizeof(mreq)); if (interface_addr) { if (uv_ip6_addr(interface_addr, 0, &addr6)) return UV_EINVAL; mreq.ipv6mr_interface = addr6.sin6_scope_id; } else { mreq.ipv6mr_interface = 0; } mreq.ipv6mr_multiaddr = multicast_addr->sin6_addr; switch (membership) { case UV_JOIN_GROUP: optname = IPV6_ADD_MEMBERSHIP; break; case UV_LEAVE_GROUP: optname = IPV6_DROP_MEMBERSHIP; break; default: return UV_EINVAL; } if (setsockopt(handle->socket, IPPROTO_IPV6, optname, (char*) &mreq, sizeof mreq) == SOCKET_ERROR) { return uv_translate_sys_error(WSAGetLastError()); } return 0; } static int uv__udp_set_source_membership4(uv_udp_t* handle, const struct sockaddr_in* multicast_addr, const char* interface_addr, const struct sockaddr_in* source_addr, uv_membership membership) { struct ip_mreq_source mreq; int optname; int err; if (handle->flags & UV_HANDLE_IPV6) return UV_EINVAL; /* If the socket is unbound, bind to inaddr_any. */ err = uv_udp_maybe_bind(handle, (const struct sockaddr*) &uv_addr_ip4_any_, sizeof(uv_addr_ip4_any_), UV_UDP_REUSEADDR); if (err) return uv_translate_sys_error(err); memset(&mreq, 0, sizeof(mreq)); if (interface_addr != NULL) { err = uv_inet_pton(AF_INET, interface_addr, &mreq.imr_interface.s_addr); if (err) return err; } else { mreq.imr_interface.s_addr = htonl(INADDR_ANY); } mreq.imr_multiaddr.s_addr = multicast_addr->sin_addr.s_addr; mreq.imr_sourceaddr.s_addr = source_addr->sin_addr.s_addr; if (membership == UV_JOIN_GROUP) optname = IP_ADD_SOURCE_MEMBERSHIP; else if (membership == UV_LEAVE_GROUP) optname = IP_DROP_SOURCE_MEMBERSHIP; else return UV_EINVAL; if (setsockopt(handle->socket, IPPROTO_IP, optname, (char*) &mreq, sizeof(mreq)) == SOCKET_ERROR) { return uv_translate_sys_error(WSAGetLastError()); } return 0; } int uv__udp_set_source_membership6(uv_udp_t* handle, const struct sockaddr_in6* multicast_addr, const char* interface_addr, const struct sockaddr_in6* source_addr, uv_membership membership) { struct group_source_req mreq; struct sockaddr_in6 addr6; int optname; int err; if ((handle->flags & UV_HANDLE_BOUND) && !(handle->flags & UV_HANDLE_IPV6)) return UV_EINVAL; err = uv_udp_maybe_bind(handle, (const struct sockaddr*) &uv_addr_ip6_any_, sizeof(uv_addr_ip6_any_), UV_UDP_REUSEADDR); if (err) return uv_translate_sys_error(err); memset(&mreq, 0, sizeof(mreq)); if (interface_addr != NULL) { err = uv_ip6_addr(interface_addr, 0, &addr6); if (err) return err; mreq.gsr_interface = addr6.sin6_scope_id; } else { mreq.gsr_interface = 0; } STATIC_ASSERT(sizeof(mreq.gsr_group) >= sizeof(*multicast_addr)); STATIC_ASSERT(sizeof(mreq.gsr_source) >= sizeof(*source_addr)); memcpy(&mreq.gsr_group, multicast_addr, sizeof(*multicast_addr)); memcpy(&mreq.gsr_source, source_addr, sizeof(*source_addr)); if (membership == UV_JOIN_GROUP) optname = MCAST_JOIN_SOURCE_GROUP; else if (membership == UV_LEAVE_GROUP) optname = MCAST_LEAVE_SOURCE_GROUP; else return UV_EINVAL; if (setsockopt(handle->socket, IPPROTO_IPV6, optname, (char*) &mreq, sizeof(mreq)) == SOCKET_ERROR) { return uv_translate_sys_error(WSAGetLastError()); } return 0; } int uv_udp_set_membership(uv_udp_t* handle, const char* multicast_addr, const char* interface_addr, uv_membership membership) { struct sockaddr_in addr4; struct sockaddr_in6 addr6; if (uv_ip4_addr(multicast_addr, 0, &addr4) == 0) return uv__udp_set_membership4(handle, &addr4, interface_addr, membership); else if (uv_ip6_addr(multicast_addr, 0, &addr6) == 0) return uv__udp_set_membership6(handle, &addr6, interface_addr, membership); else return UV_EINVAL; } int uv_udp_set_source_membership(uv_udp_t* handle, const char* multicast_addr, const char* interface_addr, const char* source_addr, uv_membership membership) { int err; struct sockaddr_storage mcast_addr; struct sockaddr_in* mcast_addr4; struct sockaddr_in6* mcast_addr6; struct sockaddr_storage src_addr; struct sockaddr_in* src_addr4; struct sockaddr_in6* src_addr6; mcast_addr4 = (struct sockaddr_in*)&mcast_addr; mcast_addr6 = (struct sockaddr_in6*)&mcast_addr; src_addr4 = (struct sockaddr_in*)&src_addr; src_addr6 = (struct sockaddr_in6*)&src_addr; err = uv_ip4_addr(multicast_addr, 0, mcast_addr4); if (err) { err = uv_ip6_addr(multicast_addr, 0, mcast_addr6); if (err) return err; err = uv_ip6_addr(source_addr, 0, src_addr6); if (err) return err; return uv__udp_set_source_membership6(handle, mcast_addr6, interface_addr, src_addr6, membership); } err = uv_ip4_addr(source_addr, 0, src_addr4); if (err) return err; return uv__udp_set_source_membership4(handle, mcast_addr4, interface_addr, src_addr4, membership); } int uv_udp_set_multicast_interface(uv_udp_t* handle, const char* interface_addr) { struct sockaddr_storage addr_st; struct sockaddr_in* addr4; struct sockaddr_in6* addr6; addr4 = (struct sockaddr_in*) &addr_st; addr6 = (struct sockaddr_in6*) &addr_st; if (!interface_addr) { memset(&addr_st, 0, sizeof addr_st); if (handle->flags & UV_HANDLE_IPV6) { addr_st.ss_family = AF_INET6; addr6->sin6_scope_id = 0; } else { addr_st.ss_family = AF_INET; addr4->sin_addr.s_addr = htonl(INADDR_ANY); } } else if (uv_ip4_addr(interface_addr, 0, addr4) == 0) { /* nothing, address was parsed */ } else if (uv_ip6_addr(interface_addr, 0, addr6) == 0) { /* nothing, address was parsed */ } else { return UV_EINVAL; } if (handle->socket == INVALID_SOCKET) return UV_EBADF; if (addr_st.ss_family == AF_INET) { if (setsockopt(handle->socket, IPPROTO_IP, IP_MULTICAST_IF, (char*) &addr4->sin_addr, sizeof(addr4->sin_addr)) == SOCKET_ERROR) { return uv_translate_sys_error(WSAGetLastError()); } } else if (addr_st.ss_family == AF_INET6) { if (setsockopt(handle->socket, IPPROTO_IPV6, IPV6_MULTICAST_IF, (char*) &addr6->sin6_scope_id, sizeof(addr6->sin6_scope_id)) == SOCKET_ERROR) { return uv_translate_sys_error(WSAGetLastError()); } } else { assert(0 && "unexpected address family"); abort(); } return 0; } int uv_udp_set_broadcast(uv_udp_t* handle, int value) { BOOL optval = (BOOL) value; if (handle->socket == INVALID_SOCKET) return UV_EBADF; if (setsockopt(handle->socket, SOL_SOCKET, SO_BROADCAST, (char*) &optval, sizeof optval)) { return uv_translate_sys_error(WSAGetLastError()); } return 0; } int uv__udp_is_bound(uv_udp_t* handle) { struct sockaddr_storage addr; int addrlen; addrlen = sizeof(addr); if (uv_udp_getsockname(handle, (struct sockaddr*) &addr, &addrlen) != 0) return 0; return addrlen > 0; } int uv_udp_open(uv_udp_t* handle, uv_os_sock_t sock) { WSAPROTOCOL_INFOW protocol_info; int opt_len; int err; /* Detect the address family of the socket. */ opt_len = (int) sizeof protocol_info; if (getsockopt(sock, SOL_SOCKET, SO_PROTOCOL_INFOW, (char*) &protocol_info, &opt_len) == SOCKET_ERROR) { return uv_translate_sys_error(GetLastError()); } err = uv_udp_set_socket(handle->loop, handle, sock, protocol_info.iAddressFamily); if (err) return uv_translate_sys_error(err); if (uv__udp_is_bound(handle)) handle->flags |= UV_HANDLE_BOUND; if (uv__udp_is_connected(handle)) handle->flags |= UV_HANDLE_UDP_CONNECTED; return 0; } #define SOCKOPT_SETTER(name, option4, option6, validate) \ int uv_udp_set_##name(uv_udp_t* handle, int value) { \ DWORD optval = (DWORD) value; \ \ if (!(validate(value))) { \ return UV_EINVAL; \ } \ \ if (handle->socket == INVALID_SOCKET) \ return UV_EBADF; \ \ if (!(handle->flags & UV_HANDLE_IPV6)) { \ /* Set IPv4 socket option */ \ if (setsockopt(handle->socket, \ IPPROTO_IP, \ option4, \ (char*) &optval, \ sizeof optval)) { \ return uv_translate_sys_error(WSAGetLastError()); \ } \ } else { \ /* Set IPv6 socket option */ \ if (setsockopt(handle->socket, \ IPPROTO_IPV6, \ option6, \ (char*) &optval, \ sizeof optval)) { \ return uv_translate_sys_error(WSAGetLastError()); \ } \ } \ return 0; \ } #define VALIDATE_TTL(value) ((value) >= 1 && (value) <= 255) #define VALIDATE_MULTICAST_TTL(value) ((value) >= -1 && (value) <= 255) #define VALIDATE_MULTICAST_LOOP(value) (1) SOCKOPT_SETTER(ttl, IP_TTL, IPV6_HOPLIMIT, VALIDATE_TTL) SOCKOPT_SETTER(multicast_ttl, IP_MULTICAST_TTL, IPV6_MULTICAST_HOPS, VALIDATE_MULTICAST_TTL) SOCKOPT_SETTER(multicast_loop, IP_MULTICAST_LOOP, IPV6_MULTICAST_LOOP, VALIDATE_MULTICAST_LOOP) #undef SOCKOPT_SETTER #undef VALIDATE_TTL #undef VALIDATE_MULTICAST_TTL #undef VALIDATE_MULTICAST_LOOP /* This function is an egress point, i.e. it returns libuv errors rather than * system errors. */ int uv__udp_bind(uv_udp_t* handle, const struct sockaddr* addr, unsigned int addrlen, unsigned int flags) { int err; err = uv_udp_maybe_bind(handle, addr, addrlen, flags); if (err) return uv_translate_sys_error(err); return 0; } int uv__udp_connect(uv_udp_t* handle, const struct sockaddr* addr, unsigned int addrlen) { const struct sockaddr* bind_addr; int err; if (!(handle->flags & UV_HANDLE_BOUND)) { if (addrlen == sizeof(uv_addr_ip4_any_)) bind_addr = (const struct sockaddr*) &uv_addr_ip4_any_; else if (addrlen == sizeof(uv_addr_ip6_any_)) bind_addr = (const struct sockaddr*) &uv_addr_ip6_any_; else return UV_EINVAL; err = uv_udp_maybe_bind(handle, bind_addr, addrlen, 0); if (err) return uv_translate_sys_error(err); } err = connect(handle->socket, addr, addrlen); if (err) return uv_translate_sys_error(err); handle->flags |= UV_HANDLE_UDP_CONNECTED; return 0; } int uv__udp_disconnect(uv_udp_t* handle) { int err; struct sockaddr addr; memset(&addr, 0, sizeof(addr)); err = connect(handle->socket, &addr, sizeof(addr)); if (err) return uv_translate_sys_error(err); handle->flags &= ~UV_HANDLE_UDP_CONNECTED; return 0; } /* This function is an egress point, i.e. it returns libuv errors rather than * system errors. */ int uv__udp_send(uv_udp_send_t* req, uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr, unsigned int addrlen, uv_udp_send_cb send_cb) { const struct sockaddr* bind_addr; int err; if (!(handle->flags & UV_HANDLE_BOUND)) { if (addrlen == sizeof(uv_addr_ip4_any_)) bind_addr = (const struct sockaddr*) &uv_addr_ip4_any_; else if (addrlen == sizeof(uv_addr_ip6_any_)) bind_addr = (const struct sockaddr*) &uv_addr_ip6_any_; else return UV_EINVAL; err = uv_udp_maybe_bind(handle, bind_addr, addrlen, 0); if (err) return uv_translate_sys_error(err); } err = uv__send(req, handle, bufs, nbufs, addr, addrlen, send_cb); if (err) return uv_translate_sys_error(err); return 0; } int uv__udp_try_send(uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr, unsigned int addrlen) { DWORD bytes; const struct sockaddr* bind_addr; struct sockaddr_storage converted; int err; assert(nbufs > 0); if (addr != NULL) { err = uv__convert_to_localhost_if_unspecified(addr, &converted); if (err) return err; } /* Already sending a message.*/ if (handle->send_queue_count != 0) return UV_EAGAIN; if (!(handle->flags & UV_HANDLE_BOUND)) { if (addrlen == sizeof(uv_addr_ip4_any_)) bind_addr = (const struct sockaddr*) &uv_addr_ip4_any_; else if (addrlen == sizeof(uv_addr_ip6_any_)) bind_addr = (const struct sockaddr*) &uv_addr_ip6_any_; else return UV_EINVAL; err = uv_udp_maybe_bind(handle, bind_addr, addrlen, 0); if (err) return uv_translate_sys_error(err); } err = WSASendTo(handle->socket, (WSABUF*)bufs, nbufs, &bytes, 0, (const struct sockaddr*) &converted, addrlen, NULL, NULL); if (err) return uv_translate_sys_error(WSAGetLastError()); return bytes; } ================================================ FILE: external/libuv/src/win/util.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include #include #include #include #include "uv.h" #include "internal.h" #include #include #include #include #include #include #include #include /* * Max title length; the only thing MSDN tells us about the maximum length * of the console title is that it is smaller than 64K. However in practice * it is much smaller, and there is no way to figure out what the exact length * of the title is or can be, at least not on XP. To make it even more * annoying, GetConsoleTitle fails when the buffer to be read into is bigger * than the actual maximum length. So we make a conservative guess here; * just don't put the novel you're writing in the title, unless the plot * survives truncation. */ #define MAX_TITLE_LENGTH 8192 /* The number of nanoseconds in one second. */ #define UV__NANOSEC 1000000000 /* Max user name length, from iphlpapi.h */ #ifndef UNLEN # define UNLEN 256 #endif /* RtlGenRandom() */ #define SystemFunction036 NTAPI SystemFunction036 #include #undef SystemFunction036 /* Cached copy of the process title, plus a mutex guarding it. */ static char *process_title; static CRITICAL_SECTION process_title_lock; /* Interval (in seconds) of the high-resolution clock. */ static double hrtime_interval_ = 0; /* * One-time initialization code for functionality defined in util.c. */ void uv__util_init(void) { LARGE_INTEGER perf_frequency; /* Initialize process title access mutex. */ InitializeCriticalSection(&process_title_lock); /* Retrieve high-resolution timer frequency * and precompute its reciprocal. */ if (QueryPerformanceFrequency(&perf_frequency)) { hrtime_interval_ = 1.0 / perf_frequency.QuadPart; } else { hrtime_interval_= 0; } } int uv_exepath(char* buffer, size_t* size_ptr) { int utf8_len, utf16_buffer_len, utf16_len; WCHAR* utf16_buffer; int err; if (buffer == NULL || size_ptr == NULL || *size_ptr == 0) { return UV_EINVAL; } if (*size_ptr > 32768) { /* Windows paths can never be longer than this. */ utf16_buffer_len = 32768; } else { utf16_buffer_len = (int) *size_ptr; } utf16_buffer = (WCHAR*) uv__malloc(sizeof(WCHAR) * utf16_buffer_len); if (!utf16_buffer) { return UV_ENOMEM; } /* Get the path as UTF-16. */ utf16_len = GetModuleFileNameW(NULL, utf16_buffer, utf16_buffer_len); if (utf16_len <= 0) { err = GetLastError(); goto error; } /* utf16_len contains the length, *not* including the terminating null. */ utf16_buffer[utf16_len] = L'\0'; /* Convert to UTF-8 */ utf8_len = WideCharToMultiByte(CP_UTF8, 0, utf16_buffer, -1, buffer, (int) *size_ptr, NULL, NULL); if (utf8_len == 0) { err = GetLastError(); goto error; } uv__free(utf16_buffer); /* utf8_len *does* include the terminating null at this point, but the * returned size shouldn't. */ *size_ptr = utf8_len - 1; return 0; error: uv__free(utf16_buffer); return uv_translate_sys_error(err); } int uv_cwd(char* buffer, size_t* size) { DWORD utf16_len; WCHAR *utf16_buffer; int r; if (buffer == NULL || size == NULL) { return UV_EINVAL; } utf16_len = GetCurrentDirectoryW(0, NULL); if (utf16_len == 0) { return uv_translate_sys_error(GetLastError()); } utf16_buffer = (WCHAR *)uv__malloc(utf16_len * sizeof(WCHAR)); if (utf16_buffer == NULL) { return UV_ENOMEM; } utf16_len = GetCurrentDirectoryW(utf16_len, utf16_buffer); if (utf16_len == 0) { uv__free(utf16_buffer); return uv_translate_sys_error(GetLastError()); } /* utf16_len contains the length, *not* including the terminating null. */ utf16_buffer[utf16_len] = L'\0'; /* The returned directory should not have a trailing slash, unless it points * at a drive root, like c:\. Remove it if needed. */ if (utf16_buffer[utf16_len - 1] == L'\\' && !(utf16_len == 3 && utf16_buffer[1] == L':')) { utf16_len--; utf16_buffer[utf16_len] = L'\0'; } /* Check how much space we need */ r = WideCharToMultiByte(CP_UTF8, 0, utf16_buffer, -1, NULL, 0, NULL, NULL); if (r == 0) { uv__free(utf16_buffer); return uv_translate_sys_error(GetLastError()); } else if (r > (int) *size) { uv__free(utf16_buffer); *size = r; return UV_ENOBUFS; } /* Convert to UTF-8 */ r = WideCharToMultiByte(CP_UTF8, 0, utf16_buffer, -1, buffer, *size > INT_MAX ? INT_MAX : (int) *size, NULL, NULL); uv__free(utf16_buffer); if (r == 0) { return uv_translate_sys_error(GetLastError()); } *size = r - 1; return 0; } int uv_chdir(const char* dir) { WCHAR *utf16_buffer; size_t utf16_len, new_utf16_len; WCHAR drive_letter, env_var[4]; if (dir == NULL) { return UV_EINVAL; } utf16_len = MultiByteToWideChar(CP_UTF8, 0, dir, -1, NULL, 0); if (utf16_len == 0) { return uv_translate_sys_error(GetLastError()); } utf16_buffer = (WCHAR *)uv__malloc(utf16_len * sizeof(WCHAR)); if (utf16_buffer == NULL) { return UV_ENOMEM; } if (MultiByteToWideChar(CP_UTF8, 0, dir, -1, utf16_buffer, utf16_len) == 0) { uv__free(utf16_buffer); return uv_translate_sys_error(GetLastError()); } if (!SetCurrentDirectoryW(utf16_buffer)) { uv__free(utf16_buffer); return uv_translate_sys_error(GetLastError()); } /* Windows stores the drive-local path in an "hidden" environment variable, * which has the form "=C:=C:\Windows". SetCurrentDirectory does not update * this, so we'll have to do it. */ new_utf16_len = GetCurrentDirectoryW(utf16_len, utf16_buffer); if (new_utf16_len > utf16_len ) { uv__free(utf16_buffer); utf16_buffer = (WCHAR *)uv__malloc(new_utf16_len * sizeof(WCHAR)); if (utf16_buffer == NULL) { /* When updating the environment variable fails, return UV_OK anyway. * We did successfully change current working directory, only updating * hidden env variable failed. */ return 0; } new_utf16_len = GetCurrentDirectoryW(new_utf16_len, utf16_buffer); } if (utf16_len == 0) { uv__free(utf16_buffer); return 0; } /* The returned directory should not have a trailing slash, unless it points * at a drive root, like c:\. Remove it if needed. */ if (utf16_buffer[utf16_len - 1] == L'\\' && !(utf16_len == 3 && utf16_buffer[1] == L':')) { utf16_len--; utf16_buffer[utf16_len] = L'\0'; } if (utf16_len < 2 || utf16_buffer[1] != L':') { /* Doesn't look like a drive letter could be there - probably an UNC path. * TODO: Need to handle win32 namespaces like \\?\C:\ ? */ drive_letter = 0; } else if (utf16_buffer[0] >= L'A' && utf16_buffer[0] <= L'Z') { drive_letter = utf16_buffer[0]; } else if (utf16_buffer[0] >= L'a' && utf16_buffer[0] <= L'z') { /* Convert to uppercase. */ drive_letter = utf16_buffer[0] - L'a' + L'A'; } else { /* Not valid. */ drive_letter = 0; } if (drive_letter != 0) { /* Construct the environment variable name and set it. */ env_var[0] = L'='; env_var[1] = drive_letter; env_var[2] = L':'; env_var[3] = L'\0'; SetEnvironmentVariableW(env_var, utf16_buffer); } uv__free(utf16_buffer); return 0; } void uv_loadavg(double avg[3]) { /* Can't be implemented */ avg[0] = avg[1] = avg[2] = 0; } uint64_t uv_get_free_memory(void) { MEMORYSTATUSEX memory_status; memory_status.dwLength = sizeof(memory_status); if (!GlobalMemoryStatusEx(&memory_status)) { return -1; } return (uint64_t)memory_status.ullAvailPhys; } uint64_t uv_get_total_memory(void) { MEMORYSTATUSEX memory_status; memory_status.dwLength = sizeof(memory_status); if (!GlobalMemoryStatusEx(&memory_status)) { return -1; } return (uint64_t)memory_status.ullTotalPhys; } uint64_t uv_get_constrained_memory(void) { return 0; /* Memory constraints are unknown. */ } uv_pid_t uv_os_getpid(void) { return GetCurrentProcessId(); } uv_pid_t uv_os_getppid(void) { int parent_pid = -1; HANDLE handle; PROCESSENTRY32 pe; DWORD current_pid = GetCurrentProcessId(); pe.dwSize = sizeof(PROCESSENTRY32); handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (Process32First(handle, &pe)) { do { if (pe.th32ProcessID == current_pid) { parent_pid = pe.th32ParentProcessID; break; } } while( Process32Next(handle, &pe)); } CloseHandle(handle); return parent_pid; } char** uv_setup_args(int argc, char** argv) { return argv; } void uv__process_title_cleanup(void) { } int uv_set_process_title(const char* title) { int err; int length; WCHAR* title_w = NULL; uv__once_init(); /* Find out how big the buffer for the wide-char title must be */ length = MultiByteToWideChar(CP_UTF8, 0, title, -1, NULL, 0); if (!length) { err = GetLastError(); goto done; } /* Convert to wide-char string */ title_w = (WCHAR*)uv__malloc(sizeof(WCHAR) * length); if (!title_w) { uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); } length = MultiByteToWideChar(CP_UTF8, 0, title, -1, title_w, length); if (!length) { err = GetLastError(); goto done; } /* If the title must be truncated insert a \0 terminator there */ if (length > MAX_TITLE_LENGTH) { title_w[MAX_TITLE_LENGTH - 1] = L'\0'; } if (!SetConsoleTitleW(title_w)) { err = GetLastError(); goto done; } EnterCriticalSection(&process_title_lock); uv__free(process_title); process_title = uv__strdup(title); LeaveCriticalSection(&process_title_lock); err = 0; done: uv__free(title_w); return uv_translate_sys_error(err); } static int uv__get_process_title(void) { WCHAR title_w[MAX_TITLE_LENGTH]; if (!GetConsoleTitleW(title_w, sizeof(title_w) / sizeof(WCHAR))) { return -1; } if (uv__convert_utf16_to_utf8(title_w, -1, &process_title) != 0) return -1; return 0; } int uv_get_process_title(char* buffer, size_t size) { size_t len; if (buffer == NULL || size == 0) return UV_EINVAL; uv__once_init(); EnterCriticalSection(&process_title_lock); /* * If the process_title was never read before nor explicitly set, * we must query it with getConsoleTitleW */ if (!process_title && uv__get_process_title() == -1) { LeaveCriticalSection(&process_title_lock); return uv_translate_sys_error(GetLastError()); } assert(process_title); len = strlen(process_title) + 1; if (size < len) { LeaveCriticalSection(&process_title_lock); return UV_ENOBUFS; } memcpy(buffer, process_title, len); LeaveCriticalSection(&process_title_lock); return 0; } uint64_t uv_hrtime(void) { uv__once_init(); return uv__hrtime(UV__NANOSEC); } uint64_t uv__hrtime(double scale) { LARGE_INTEGER counter; /* If the performance interval is zero, there's no support. */ if (hrtime_interval_ == 0) { return 0; } if (!QueryPerformanceCounter(&counter)) { return 0; } /* Because we have no guarantee about the order of magnitude of the * performance counter interval, integer math could cause this computation * to overflow. Therefore we resort to floating point math. */ return (uint64_t) ((double) counter.QuadPart * hrtime_interval_ * scale); } int uv_resident_set_memory(size_t* rss) { HANDLE current_process; PROCESS_MEMORY_COUNTERS pmc; current_process = GetCurrentProcess(); if (!GetProcessMemoryInfo(current_process, &pmc, sizeof(pmc))) { return uv_translate_sys_error(GetLastError()); } *rss = pmc.WorkingSetSize; return 0; } int uv_uptime(double* uptime) { BYTE stack_buffer[4096]; BYTE* malloced_buffer = NULL; BYTE* buffer = (BYTE*) stack_buffer; size_t buffer_size = sizeof(stack_buffer); DWORD data_size; PERF_DATA_BLOCK* data_block; PERF_OBJECT_TYPE* object_type; PERF_COUNTER_DEFINITION* counter_definition; DWORD i; for (;;) { LONG result; data_size = (DWORD) buffer_size; result = RegQueryValueExW(HKEY_PERFORMANCE_DATA, L"2", NULL, NULL, buffer, &data_size); if (result == ERROR_SUCCESS) { break; } else if (result != ERROR_MORE_DATA) { *uptime = 0; return uv_translate_sys_error(result); } buffer_size *= 2; /* Don't let the buffer grow infinitely. */ if (buffer_size > 1 << 20) { goto internalError; } uv__free(malloced_buffer); buffer = malloced_buffer = (BYTE*) uv__malloc(buffer_size); if (malloced_buffer == NULL) { *uptime = 0; return UV_ENOMEM; } } if (data_size < sizeof(*data_block)) goto internalError; data_block = (PERF_DATA_BLOCK*) buffer; if (wmemcmp(data_block->Signature, L"PERF", 4) != 0) goto internalError; if (data_size < data_block->HeaderLength + sizeof(*object_type)) goto internalError; object_type = (PERF_OBJECT_TYPE*) (buffer + data_block->HeaderLength); if (object_type->NumInstances != PERF_NO_INSTANCES) goto internalError; counter_definition = (PERF_COUNTER_DEFINITION*) (buffer + data_block->HeaderLength + object_type->HeaderLength); for (i = 0; i < object_type->NumCounters; i++) { if ((BYTE*) counter_definition + sizeof(*counter_definition) > buffer + data_size) { break; } if (counter_definition->CounterNameTitleIndex == 674 && counter_definition->CounterSize == sizeof(uint64_t)) { if (counter_definition->CounterOffset + sizeof(uint64_t) > data_size || !(counter_definition->CounterType & PERF_OBJECT_TIMER)) { goto internalError; } else { BYTE* address = (BYTE*) object_type + object_type->DefinitionLength + counter_definition->CounterOffset; uint64_t value = *((uint64_t*) address); *uptime = floor((double) (object_type->PerfTime.QuadPart - value) / (double) object_type->PerfFreq.QuadPart); uv__free(malloced_buffer); return 0; } } counter_definition = (PERF_COUNTER_DEFINITION*) ((BYTE*) counter_definition + counter_definition->ByteLength); } /* If we get here, the uptime value was not found. */ uv__free(malloced_buffer); *uptime = 0; return UV_ENOSYS; internalError: uv__free(malloced_buffer); *uptime = 0; return UV_EIO; } int uv_cpu_info(uv_cpu_info_t** cpu_infos_ptr, int* cpu_count_ptr) { uv_cpu_info_t* cpu_infos; SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION* sppi; DWORD sppi_size; SYSTEM_INFO system_info; DWORD cpu_count, i; NTSTATUS status; ULONG result_size; int err; uv_cpu_info_t* cpu_info; cpu_infos = NULL; cpu_count = 0; sppi = NULL; uv__once_init(); GetSystemInfo(&system_info); cpu_count = system_info.dwNumberOfProcessors; cpu_infos = (uv_cpu_info_t *)uv__calloc(cpu_count, sizeof *cpu_infos); if (cpu_infos == NULL) { err = ERROR_OUTOFMEMORY; goto error; } sppi_size = cpu_count * sizeof(*sppi); sppi = (SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION *)uv__malloc(sppi_size); if (sppi == NULL) { err = ERROR_OUTOFMEMORY; goto error; } status = pNtQuerySystemInformation(SystemProcessorPerformanceInformation, sppi, sppi_size, &result_size); if (!NT_SUCCESS(status)) { err = pRtlNtStatusToDosError(status); goto error; } assert(result_size == sppi_size); for (i = 0; i < cpu_count; i++) { WCHAR key_name[128]; HKEY processor_key; DWORD cpu_speed; DWORD cpu_speed_size = sizeof(cpu_speed); WCHAR cpu_brand[256]; DWORD cpu_brand_size = sizeof(cpu_brand); size_t len; len = _snwprintf(key_name, ARRAY_SIZE(key_name), L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\%d", i); assert(len > 0 && len < ARRAY_SIZE(key_name)); err = RegOpenKeyExW(HKEY_LOCAL_MACHINE, key_name, 0, KEY_QUERY_VALUE, &processor_key); if (err != ERROR_SUCCESS) { goto error; } err = RegQueryValueExW(processor_key, L"~MHz", NULL, NULL, (BYTE*)&cpu_speed, &cpu_speed_size); if (err != ERROR_SUCCESS) { RegCloseKey(processor_key); goto error; } err = RegQueryValueExW(processor_key, L"ProcessorNameString", NULL, NULL, (BYTE*)&cpu_brand, &cpu_brand_size); RegCloseKey(processor_key); if (err != ERROR_SUCCESS) goto error; cpu_info = &cpu_infos[i]; cpu_info->speed = cpu_speed; cpu_info->cpu_times.user = sppi[i].UserTime.QuadPart / 10000; cpu_info->cpu_times.sys = (sppi[i].KernelTime.QuadPart - sppi[i].IdleTime.QuadPart) / 10000; cpu_info->cpu_times.idle = sppi[i].IdleTime.QuadPart / 10000; cpu_info->cpu_times.irq = sppi[i].InterruptTime.QuadPart / 10000; cpu_info->cpu_times.nice = 0; uv__convert_utf16_to_utf8(cpu_brand, cpu_brand_size / sizeof(WCHAR), &(cpu_info->model)); } uv__free(sppi); *cpu_count_ptr = cpu_count; *cpu_infos_ptr = cpu_infos; return 0; error: if (cpu_infos != NULL) { /* This is safe because the cpu_infos array is zeroed on allocation. */ for (i = 0; i < cpu_count; i++) uv__free(cpu_infos[i].model); } uv__free(cpu_infos); uv__free(sppi); return uv_translate_sys_error(err); } static int is_windows_version_or_greater(DWORD os_major, DWORD os_minor, WORD service_pack_major, WORD service_pack_minor) { OSVERSIONINFOEX osvi; DWORDLONG condition_mask = 0; int op = VER_GREATER_EQUAL; /* Initialize the OSVERSIONINFOEX structure. */ ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); osvi.dwMajorVersion = os_major; osvi.dwMinorVersion = os_minor; osvi.wServicePackMajor = service_pack_major; osvi.wServicePackMinor = service_pack_minor; /* Initialize the condition mask. */ VER_SET_CONDITION(condition_mask, VER_MAJORVERSION, op); VER_SET_CONDITION(condition_mask, VER_MINORVERSION, op); VER_SET_CONDITION(condition_mask, VER_SERVICEPACKMAJOR, op); VER_SET_CONDITION(condition_mask, VER_SERVICEPACKMINOR, op); /* Perform the test. */ return (int) VerifyVersionInfo( &osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, condition_mask); } static int address_prefix_match(int family, struct sockaddr* address, struct sockaddr* prefix_address, int prefix_len) { uint8_t* address_data; uint8_t* prefix_address_data; int i; assert(address->sa_family == family); assert(prefix_address->sa_family == family); if (family == AF_INET6) { address_data = (uint8_t*) &(((struct sockaddr_in6 *) address)->sin6_addr); prefix_address_data = (uint8_t*) &(((struct sockaddr_in6 *) prefix_address)->sin6_addr); } else { address_data = (uint8_t*) &(((struct sockaddr_in *) address)->sin_addr); prefix_address_data = (uint8_t*) &(((struct sockaddr_in *) prefix_address)->sin_addr); } for (i = 0; i < prefix_len >> 3; i++) { if (address_data[i] != prefix_address_data[i]) return 0; } if (prefix_len % 8) return prefix_address_data[i] == (address_data[i] & (0xff << (8 - prefix_len % 8))); return 1; } int uv_interface_addresses(uv_interface_address_t** addresses_ptr, int* count_ptr) { IP_ADAPTER_ADDRESSES* win_address_buf; ULONG win_address_buf_size; IP_ADAPTER_ADDRESSES* adapter; uv_interface_address_t* uv_address_buf; char* name_buf; size_t uv_address_buf_size; uv_interface_address_t* uv_address; int count; int is_vista_or_greater; ULONG flags; *addresses_ptr = NULL; *count_ptr = 0; is_vista_or_greater = is_windows_version_or_greater(6, 0, 0, 0); if (is_vista_or_greater) { flags = GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER; } else { /* We need at least XP SP1. */ if (!is_windows_version_or_greater(5, 1, 1, 0)) return UV_ENOTSUP; flags = GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_INCLUDE_PREFIX; } /* Fetch the size of the adapters reported by windows, and then get the list * itself. */ win_address_buf_size = 0; win_address_buf = NULL; for (;;) { ULONG r; /* If win_address_buf is 0, then GetAdaptersAddresses will fail with. * ERROR_BUFFER_OVERFLOW, and the required buffer size will be stored in * win_address_buf_size. */ r = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, win_address_buf, &win_address_buf_size); if (r == ERROR_SUCCESS) break; uv__free(win_address_buf); switch (r) { case ERROR_BUFFER_OVERFLOW: /* This happens when win_address_buf is NULL or too small to hold all * adapters. */ win_address_buf = (IP_ADAPTER_ADDRESSES *)uv__malloc(win_address_buf_size); if (win_address_buf == NULL) return UV_ENOMEM; continue; case ERROR_NO_DATA: { /* No adapters were found. */ uv_address_buf = (uv_interface_address_t *)uv__malloc(1); if (uv_address_buf == NULL) return UV_ENOMEM; *count_ptr = 0; *addresses_ptr = uv_address_buf; return 0; } case ERROR_ADDRESS_NOT_ASSOCIATED: return UV_EAGAIN; case ERROR_INVALID_PARAMETER: /* MSDN says: * "This error is returned for any of the following conditions: the * SizePointer parameter is NULL, the Address parameter is not * AF_INET, AF_INET6, or AF_UNSPEC, or the address information for * the parameters requested is greater than ULONG_MAX." * Since the first two conditions are not met, it must be that the * adapter data is too big. */ return UV_ENOBUFS; default: /* Other (unspecified) errors can happen, but we don't have any special * meaning for them. */ assert(r != ERROR_SUCCESS); return uv_translate_sys_error(r); } } /* Count the number of enabled interfaces and compute how much space is * needed to store their info. */ count = 0; uv_address_buf_size = 0; for (adapter = win_address_buf; adapter != NULL; adapter = adapter->Next) { IP_ADAPTER_UNICAST_ADDRESS* unicast_address; int name_size; /* Interfaces that are not 'up' should not be reported. Also skip * interfaces that have no associated unicast address, as to avoid * allocating space for the name for this interface. */ if (adapter->OperStatus != IfOperStatusUp || adapter->FirstUnicastAddress == NULL) continue; /* Compute the size of the interface name. */ name_size = WideCharToMultiByte(CP_UTF8, 0, adapter->FriendlyName, -1, NULL, 0, NULL, FALSE); if (name_size <= 0) { uv__free(win_address_buf); return uv_translate_sys_error(GetLastError()); } uv_address_buf_size += name_size; /* Count the number of addresses associated with this interface, and * compute the size. */ for (unicast_address = (IP_ADAPTER_UNICAST_ADDRESS*) adapter->FirstUnicastAddress; unicast_address != NULL; unicast_address = unicast_address->Next) { count++; uv_address_buf_size += sizeof(uv_interface_address_t); } } /* Allocate space to store interface data plus adapter names. */ uv_address_buf = (uv_interface_address_t *)uv__malloc(uv_address_buf_size); if (uv_address_buf == NULL) { uv__free(win_address_buf); return UV_ENOMEM; } /* Compute the start of the uv_interface_address_t array, and the place in * the buffer where the interface names will be stored. */ uv_address = uv_address_buf; name_buf = (char*) (uv_address_buf + count); /* Fill out the output buffer. */ for (adapter = win_address_buf; adapter != NULL; adapter = adapter->Next) { IP_ADAPTER_UNICAST_ADDRESS* unicast_address; int name_size; size_t max_name_size; if (adapter->OperStatus != IfOperStatusUp || adapter->FirstUnicastAddress == NULL) continue; /* Convert the interface name to UTF8. */ max_name_size = (char*) uv_address_buf + uv_address_buf_size - name_buf; if (max_name_size > (size_t) INT_MAX) max_name_size = INT_MAX; name_size = WideCharToMultiByte(CP_UTF8, 0, adapter->FriendlyName, -1, name_buf, (int) max_name_size, NULL, FALSE); if (name_size <= 0) { uv__free(win_address_buf); uv__free(uv_address_buf); return uv_translate_sys_error(GetLastError()); } /* Add an uv_interface_address_t element for every unicast address. */ for (unicast_address = (IP_ADAPTER_UNICAST_ADDRESS*) adapter->FirstUnicastAddress; unicast_address != NULL; unicast_address = unicast_address->Next) { struct sockaddr* sa; ULONG prefix_len; sa = unicast_address->Address.lpSockaddr; /* XP has no OnLinkPrefixLength field. */ if (is_vista_or_greater) { prefix_len = ((IP_ADAPTER_UNICAST_ADDRESS_LH*) unicast_address)->OnLinkPrefixLength; } else { /* Prior to Windows Vista the FirstPrefix pointed to the list with * single prefix for each IP address assigned to the adapter. * Order of FirstPrefix does not match order of FirstUnicastAddress, * so we need to find corresponding prefix. */ IP_ADAPTER_PREFIX* prefix; prefix_len = 0; for (prefix = adapter->FirstPrefix; prefix; prefix = prefix->Next) { /* We want the longest matching prefix. */ if (prefix->Address.lpSockaddr->sa_family != sa->sa_family || prefix->PrefixLength <= prefix_len) continue; if (address_prefix_match(sa->sa_family, sa, prefix->Address.lpSockaddr, prefix->PrefixLength)) { prefix_len = prefix->PrefixLength; } } /* If there is no matching prefix information, return a single-host * subnet mask (e.g. 255.255.255.255 for IPv4). */ if (!prefix_len) prefix_len = (sa->sa_family == AF_INET6) ? 128 : 32; } memset(uv_address, 0, sizeof *uv_address); uv_address->name = name_buf; if (adapter->PhysicalAddressLength == sizeof(uv_address->phys_addr)) { memcpy(uv_address->phys_addr, adapter->PhysicalAddress, sizeof(uv_address->phys_addr)); } uv_address->is_internal = (adapter->IfType == IF_TYPE_SOFTWARE_LOOPBACK); if (sa->sa_family == AF_INET6) { uv_address->address.address6 = *((struct sockaddr_in6 *) sa); uv_address->netmask.netmask6.sin6_family = AF_INET6; memset(uv_address->netmask.netmask6.sin6_addr.s6_addr, 0xff, prefix_len >> 3); /* This check ensures that we don't write past the size of the data. */ if (prefix_len % 8) { uv_address->netmask.netmask6.sin6_addr.s6_addr[prefix_len >> 3] = 0xff << (8 - prefix_len % 8); } } else { uv_address->address.address4 = *((struct sockaddr_in *) sa); uv_address->netmask.netmask4.sin_family = AF_INET; uv_address->netmask.netmask4.sin_addr.s_addr = (prefix_len > 0) ? htonl(0xffffffff << (32 - prefix_len)) : 0; } uv_address++; } name_buf += name_size; } uv__free(win_address_buf); *addresses_ptr = uv_address_buf; *count_ptr = count; return 0; } void uv_free_interface_addresses(uv_interface_address_t* addresses, int count) { uv__free(addresses); } int uv_getrusage(uv_rusage_t *uv_rusage) { FILETIME createTime, exitTime, kernelTime, userTime; SYSTEMTIME kernelSystemTime, userSystemTime; PROCESS_MEMORY_COUNTERS memCounters; IO_COUNTERS ioCounters; int ret; ret = GetProcessTimes(GetCurrentProcess(), &createTime, &exitTime, &kernelTime, &userTime); if (ret == 0) { return uv_translate_sys_error(GetLastError()); } ret = FileTimeToSystemTime(&kernelTime, &kernelSystemTime); if (ret == 0) { return uv_translate_sys_error(GetLastError()); } ret = FileTimeToSystemTime(&userTime, &userSystemTime); if (ret == 0) { return uv_translate_sys_error(GetLastError()); } ret = GetProcessMemoryInfo(GetCurrentProcess(), &memCounters, sizeof(memCounters)); if (ret == 0) { return uv_translate_sys_error(GetLastError()); } ret = GetProcessIoCounters(GetCurrentProcess(), &ioCounters); if (ret == 0) { return uv_translate_sys_error(GetLastError()); } memset(uv_rusage, 0, sizeof(*uv_rusage)); uv_rusage->ru_utime.tv_sec = userSystemTime.wHour * 3600 + userSystemTime.wMinute * 60 + userSystemTime.wSecond; uv_rusage->ru_utime.tv_usec = userSystemTime.wMilliseconds * 1000; uv_rusage->ru_stime.tv_sec = kernelSystemTime.wHour * 3600 + kernelSystemTime.wMinute * 60 + kernelSystemTime.wSecond; uv_rusage->ru_stime.tv_usec = kernelSystemTime.wMilliseconds * 1000; uv_rusage->ru_majflt = (uint64_t) memCounters.PageFaultCount; uv_rusage->ru_maxrss = (uint64_t) memCounters.PeakWorkingSetSize / 1024; uv_rusage->ru_oublock = (uint64_t) ioCounters.WriteOperationCount; uv_rusage->ru_inblock = (uint64_t) ioCounters.ReadOperationCount; return 0; } int uv_os_homedir(char* buffer, size_t* size) { uv_passwd_t pwd; size_t len; int r; /* Check if the USERPROFILE environment variable is set first. The task of performing input validation on buffer and size is taken care of by uv_os_getenv(). */ r = uv_os_getenv("USERPROFILE", buffer, size); /* Don't return an error if USERPROFILE was not found. */ if (r != UV_ENOENT) return r; /* USERPROFILE is not set, so call uv__getpwuid_r() */ r = uv__getpwuid_r(&pwd); if (r != 0) { return r; } len = strlen(pwd.homedir); if (len >= *size) { *size = len + 1; uv_os_free_passwd(&pwd); return UV_ENOBUFS; } memcpy(buffer, pwd.homedir, len + 1); *size = len; uv_os_free_passwd(&pwd); return 0; } int uv_os_tmpdir(char* buffer, size_t* size) { wchar_t *path; DWORD bufsize; size_t len; if (buffer == NULL || size == NULL || *size == 0) return UV_EINVAL; len = 0; len = GetTempPathW(0, NULL); if (len == 0) { return uv_translate_sys_error(GetLastError()); } /* Include space for terminating null char. */ len += 1; path = (wchar_t *)uv__malloc(len * sizeof(wchar_t)); if (path == NULL) { return UV_ENOMEM; } len = GetTempPathW(len, path); if (len == 0) { uv__free(path); return uv_translate_sys_error(GetLastError()); } /* The returned directory should not have a trailing slash, unless it points * at a drive root, like c:\. Remove it if needed. */ if (path[len - 1] == L'\\' && !(len == 3 && path[1] == L':')) { len--; path[len] = L'\0'; } /* Check how much space we need */ bufsize = WideCharToMultiByte(CP_UTF8, 0, path, -1, NULL, 0, NULL, NULL); if (bufsize == 0) { uv__free(path); return uv_translate_sys_error(GetLastError()); } else if (bufsize > *size) { uv__free(path); *size = bufsize; return UV_ENOBUFS; } /* Convert to UTF-8 */ bufsize = WideCharToMultiByte(CP_UTF8, 0, path, -1, buffer, *size, NULL, NULL); uv__free(path); if (bufsize == 0) return uv_translate_sys_error(GetLastError()); *size = bufsize - 1; return 0; } void uv_os_free_passwd(uv_passwd_t* pwd) { if (pwd == NULL) return; uv__free(pwd->username); uv__free(pwd->homedir); pwd->username = NULL; pwd->homedir = NULL; } /* * Converts a UTF-16 string into a UTF-8 one. The resulting string is * null-terminated. * * If utf16 is null terminated, utf16len can be set to -1, otherwise it must * be specified. */ int uv__convert_utf16_to_utf8(const WCHAR* utf16, int utf16len, char** utf8) { DWORD bufsize; if (utf16 == NULL) return UV_EINVAL; /* Check how much space we need */ bufsize = WideCharToMultiByte(CP_UTF8, 0, utf16, utf16len, NULL, 0, NULL, NULL); if (bufsize == 0) return uv_translate_sys_error(GetLastError()); /* Allocate the destination buffer adding an extra byte for the terminating * NULL. If utf16len is not -1 WideCharToMultiByte will not add it, so * we do it ourselves always, just in case. */ *utf8 = (char *)uv__malloc(bufsize + 1); if (*utf8 == NULL) return UV_ENOMEM; /* Convert to UTF-8 */ bufsize = WideCharToMultiByte(CP_UTF8, 0, utf16, utf16len, *utf8, bufsize, NULL, NULL); if (bufsize == 0) { uv__free(*utf8); *utf8 = NULL; return uv_translate_sys_error(GetLastError()); } (*utf8)[bufsize] = '\0'; return 0; } /* * Converts a UTF-8 string into a UTF-16 one. The resulting string is * null-terminated. * * If utf8 is null terminated, utf8len can be set to -1, otherwise it must * be specified. */ int uv__convert_utf8_to_utf16(const char* utf8, int utf8len, WCHAR** utf16) { int bufsize; if (utf8 == NULL) return UV_EINVAL; /* Check how much space we need */ bufsize = MultiByteToWideChar(CP_UTF8, 0, utf8, utf8len, NULL, 0); if (bufsize == 0) return uv_translate_sys_error(GetLastError()); /* Allocate the destination buffer adding an extra byte for the terminating * NULL. If utf8len is not -1 MultiByteToWideChar will not add it, so * we do it ourselves always, just in case. */ *utf16 = (WCHAR *)uv__malloc(sizeof(WCHAR) * (bufsize + 1)); if (*utf16 == NULL) return UV_ENOMEM; /* Convert to UTF-16 */ bufsize = MultiByteToWideChar(CP_UTF8, 0, utf8, utf8len, *utf16, bufsize); if (bufsize == 0) { uv__free(*utf16); *utf16 = NULL; return uv_translate_sys_error(GetLastError()); } (*utf16)[bufsize] = L'\0'; return 0; } int uv__getpwuid_r(uv_passwd_t* pwd) { HANDLE token; wchar_t username[UNLEN + 1]; wchar_t *path; DWORD bufsize; int r; if (pwd == NULL) return UV_EINVAL; /* Get the home directory using GetUserProfileDirectoryW() */ if (OpenProcessToken(GetCurrentProcess(), TOKEN_READ, &token) == 0) return uv_translate_sys_error(GetLastError()); bufsize = 0; GetUserProfileDirectoryW(token, NULL, &bufsize); if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { r = GetLastError(); CloseHandle(token); return uv_translate_sys_error(r); } path = (wchar_t *)uv__malloc(bufsize * sizeof(wchar_t)); if (path == NULL) { CloseHandle(token); return UV_ENOMEM; } if (!GetUserProfileDirectoryW(token, path, &bufsize)) { r = GetLastError(); CloseHandle(token); uv__free(path); return uv_translate_sys_error(r); } CloseHandle(token); /* Get the username using GetUserNameW() */ bufsize = ARRAY_SIZE(username); if (!GetUserNameW(username, &bufsize)) { r = GetLastError(); uv__free(path); /* This should not be possible */ if (r == ERROR_INSUFFICIENT_BUFFER) return UV_ENOMEM; return uv_translate_sys_error(r); } pwd->homedir = NULL; r = uv__convert_utf16_to_utf8(path, -1, &pwd->homedir); uv__free(path); if (r != 0) return r; pwd->username = NULL; r = uv__convert_utf16_to_utf8(username, -1, &pwd->username); if (r != 0) { uv__free(pwd->homedir); return r; } pwd->shell = NULL; pwd->uid = -1; pwd->gid = -1; return 0; } int uv_os_get_passwd(uv_passwd_t* pwd) { return uv__getpwuid_r(pwd); } int uv_os_environ(uv_env_item_t** envitems, int* count) { wchar_t* env; wchar_t* penv; int i, cnt; uv_env_item_t* envitem; *envitems = NULL; *count = 0; env = GetEnvironmentStringsW(); if (env == NULL) return 0; for (penv = env, i = 0; *penv != L'\0'; penv += wcslen(penv) + 1, i++); *envitems = (uv_env_item_t *)uv__calloc(i, sizeof(**envitems)); if (*envitems == NULL) { FreeEnvironmentStringsW(env); return UV_ENOMEM; } penv = env; cnt = 0; while (*penv != L'\0' && cnt < i) { char* buf; char* ptr; if (uv__convert_utf16_to_utf8(penv, -1, &buf) != 0) goto fail; /* Using buf + 1 here because we know that `buf` has length at least 1, * and some special environment variables on Windows start with a = sign. */ ptr = strchr(buf + 1, '='); if (ptr == NULL) { uv__free(buf); goto do_continue; } *ptr = '\0'; envitem = &(*envitems)[cnt]; envitem->name = buf; envitem->value = ptr + 1; cnt++; do_continue: penv += wcslen(penv) + 1; } FreeEnvironmentStringsW(env); *count = cnt; return 0; fail: FreeEnvironmentStringsW(env); for (i = 0; i < cnt; i++) { envitem = &(*envitems)[cnt]; uv__free(envitem->name); } uv__free(*envitems); *envitems = NULL; *count = 0; return UV_ENOMEM; } int uv_os_getenv(const char* name, char* buffer, size_t* size) { wchar_t fastvar[512]; wchar_t* var; DWORD varlen; wchar_t* name_w; DWORD bufsize; size_t len; int r; if (name == NULL || buffer == NULL || size == NULL || *size == 0) return UV_EINVAL; r = uv__convert_utf8_to_utf16(name, -1, &name_w); if (r != 0) return r; var = fastvar; varlen = ARRAY_SIZE(fastvar); for (;;) { SetLastError(ERROR_SUCCESS); len = GetEnvironmentVariableW(name_w, var, varlen); if (len < varlen) break; /* Try repeatedly because we might have been preempted by another thread * modifying the environment variable just as we're trying to read it. */ if (var != fastvar) uv__free(var); varlen = 1 + len; var = (wchar_t *)uv__malloc(varlen * sizeof(*var)); if (var == NULL) { r = UV_ENOMEM; goto fail; } } uv__free(name_w); name_w = NULL; if (len == 0) { r = GetLastError(); if (r != ERROR_SUCCESS) { r = uv_translate_sys_error(r); goto fail; } } /* Check how much space we need */ bufsize = WideCharToMultiByte(CP_UTF8, 0, var, -1, NULL, 0, NULL, NULL); if (bufsize == 0) { r = uv_translate_sys_error(GetLastError()); goto fail; } else if (bufsize > *size) { *size = bufsize; r = UV_ENOBUFS; goto fail; } /* Convert to UTF-8 */ bufsize = WideCharToMultiByte(CP_UTF8, 0, var, -1, buffer, *size, NULL, NULL); if (bufsize == 0) { r = uv_translate_sys_error(GetLastError()); goto fail; } *size = bufsize - 1; r = 0; fail: if (name_w != NULL) uv__free(name_w); if (var != fastvar) uv__free(var); return r; } int uv_os_setenv(const char* name, const char* value) { wchar_t* name_w; wchar_t* value_w; int r; if (name == NULL || value == NULL) return UV_EINVAL; r = uv__convert_utf8_to_utf16(name, -1, &name_w); if (r != 0) return r; r = uv__convert_utf8_to_utf16(value, -1, &value_w); if (r != 0) { uv__free(name_w); return r; } r = SetEnvironmentVariableW(name_w, value_w); uv__free(name_w); uv__free(value_w); if (r == 0) return uv_translate_sys_error(GetLastError()); return 0; } int uv_os_unsetenv(const char* name) { wchar_t* name_w; int r; if (name == NULL) return UV_EINVAL; r = uv__convert_utf8_to_utf16(name, -1, &name_w); if (r != 0) return r; r = SetEnvironmentVariableW(name_w, NULL); uv__free(name_w); if (r == 0) return uv_translate_sys_error(GetLastError()); return 0; } int uv_os_gethostname(char* buffer, size_t* size) { char buf[UV_MAXHOSTNAMESIZE]; size_t len; if (buffer == NULL || size == NULL || *size == 0) return UV_EINVAL; uv__once_init(); /* Initialize winsock */ if (gethostname(buf, sizeof(buf)) != 0) return uv_translate_sys_error(WSAGetLastError()); buf[sizeof(buf) - 1] = '\0'; /* Null terminate, just to be safe. */ len = strlen(buf); if (len >= *size) { *size = len + 1; return UV_ENOBUFS; } memcpy(buffer, buf, len + 1); *size = len; return 0; } static int uv__get_handle(uv_pid_t pid, int access, HANDLE* handle) { int r; if (pid == 0) *handle = GetCurrentProcess(); else *handle = OpenProcess(access, FALSE, pid); if (*handle == NULL) { r = GetLastError(); if (r == ERROR_INVALID_PARAMETER) return UV_ESRCH; else return uv_translate_sys_error(r); } return 0; } int uv_os_getpriority(uv_pid_t pid, int* priority) { HANDLE handle; int r; if (priority == NULL) return UV_EINVAL; r = uv__get_handle(pid, PROCESS_QUERY_LIMITED_INFORMATION, &handle); if (r != 0) return r; r = GetPriorityClass(handle); if (r == 0) { r = uv_translate_sys_error(GetLastError()); } else { /* Map Windows priority classes to Unix nice values. */ if (r == REALTIME_PRIORITY_CLASS) *priority = UV_PRIORITY_HIGHEST; else if (r == HIGH_PRIORITY_CLASS) *priority = UV_PRIORITY_HIGH; else if (r == ABOVE_NORMAL_PRIORITY_CLASS) *priority = UV_PRIORITY_ABOVE_NORMAL; else if (r == NORMAL_PRIORITY_CLASS) *priority = UV_PRIORITY_NORMAL; else if (r == BELOW_NORMAL_PRIORITY_CLASS) *priority = UV_PRIORITY_BELOW_NORMAL; else /* IDLE_PRIORITY_CLASS */ *priority = UV_PRIORITY_LOW; r = 0; } CloseHandle(handle); return r; } int uv_os_setpriority(uv_pid_t pid, int priority) { HANDLE handle; int priority_class; int r; /* Map Unix nice values to Windows priority classes. */ if (priority < UV_PRIORITY_HIGHEST || priority > UV_PRIORITY_LOW) return UV_EINVAL; else if (priority < UV_PRIORITY_HIGH) priority_class = REALTIME_PRIORITY_CLASS; else if (priority < UV_PRIORITY_ABOVE_NORMAL) priority_class = HIGH_PRIORITY_CLASS; else if (priority < UV_PRIORITY_NORMAL) priority_class = ABOVE_NORMAL_PRIORITY_CLASS; else if (priority < UV_PRIORITY_BELOW_NORMAL) priority_class = NORMAL_PRIORITY_CLASS; else if (priority < UV_PRIORITY_LOW) priority_class = BELOW_NORMAL_PRIORITY_CLASS; else priority_class = IDLE_PRIORITY_CLASS; r = uv__get_handle(pid, PROCESS_SET_INFORMATION, &handle); if (r != 0) return r; if (SetPriorityClass(handle, priority_class) == 0) r = uv_translate_sys_error(GetLastError()); CloseHandle(handle); return r; } int uv_os_uname(uv_utsname_t* buffer) { /* Implementation loosely based on https://github.com/gagern/gnulib/blob/master/lib/uname.c */ OSVERSIONINFOW os_info; SYSTEM_INFO system_info; HKEY registry_key; WCHAR product_name_w[256]; DWORD product_name_w_size; int version_size; int processor_level; int r; if (buffer == NULL) return UV_EINVAL; uv__once_init(); os_info.dwOSVersionInfoSize = sizeof(os_info); os_info.szCSDVersion[0] = L'\0'; /* Try calling RtlGetVersion(), and fall back to the deprecated GetVersionEx() if RtlGetVersion() is not available. */ if (pRtlGetVersion) { pRtlGetVersion(&os_info); } else { /* Silence GetVersionEx() deprecation warning. */ #pragma warning(suppress : 4996) if (GetVersionExW(&os_info) == 0) { r = uv_translate_sys_error(GetLastError()); goto error; } } /* Populate the version field. */ version_size = 0; r = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_QUERY_VALUE, ®istry_key); if (r == ERROR_SUCCESS) { product_name_w_size = sizeof(product_name_w); r = RegGetValueW(registry_key, NULL, L"ProductName", RRF_RT_REG_SZ, NULL, (PVOID) product_name_w, &product_name_w_size); RegCloseKey(registry_key); if (r == ERROR_SUCCESS) { version_size = WideCharToMultiByte(CP_UTF8, 0, product_name_w, -1, buffer->version, sizeof(buffer->version), NULL, NULL); if (version_size == 0) { r = uv_translate_sys_error(GetLastError()); goto error; } } } /* Append service pack information to the version if present. */ if (os_info.szCSDVersion[0] != L'\0') { if (version_size > 0) buffer->version[version_size - 1] = ' '; if (WideCharToMultiByte(CP_UTF8, 0, os_info.szCSDVersion, -1, buffer->version + version_size, sizeof(buffer->version) - version_size, NULL, NULL) == 0) { r = uv_translate_sys_error(GetLastError()); goto error; } } /* Populate the sysname field. */ #ifdef __MINGW32__ r = snprintf(buffer->sysname, sizeof(buffer->sysname), "MINGW32_NT-%u.%u", (unsigned int) os_info.dwMajorVersion, (unsigned int) os_info.dwMinorVersion); assert(r < sizeof(buffer->sysname)); #else uv__strscpy(buffer->sysname, "Windows_NT", sizeof(buffer->sysname)); #endif /* Populate the release field. */ r = snprintf(buffer->release, sizeof(buffer->release), "%d.%d.%d", (unsigned int) os_info.dwMajorVersion, (unsigned int) os_info.dwMinorVersion, (unsigned int) os_info.dwBuildNumber); assert(r < sizeof(buffer->release)); /* Populate the machine field. */ GetSystemInfo(&system_info); switch (system_info.wProcessorArchitecture) { case PROCESSOR_ARCHITECTURE_AMD64: uv__strscpy(buffer->machine, "x86_64", sizeof(buffer->machine)); break; case PROCESSOR_ARCHITECTURE_IA64: uv__strscpy(buffer->machine, "ia64", sizeof(buffer->machine)); break; case PROCESSOR_ARCHITECTURE_INTEL: uv__strscpy(buffer->machine, "i386", sizeof(buffer->machine)); if (system_info.wProcessorLevel > 3) { processor_level = system_info.wProcessorLevel < 6 ? system_info.wProcessorLevel : 6; buffer->machine[1] = '0' + processor_level; } break; case PROCESSOR_ARCHITECTURE_IA32_ON_WIN64: uv__strscpy(buffer->machine, "i686", sizeof(buffer->machine)); break; case PROCESSOR_ARCHITECTURE_MIPS: uv__strscpy(buffer->machine, "mips", sizeof(buffer->machine)); break; case PROCESSOR_ARCHITECTURE_ALPHA: case PROCESSOR_ARCHITECTURE_ALPHA64: uv__strscpy(buffer->machine, "alpha", sizeof(buffer->machine)); break; case PROCESSOR_ARCHITECTURE_PPC: uv__strscpy(buffer->machine, "powerpc", sizeof(buffer->machine)); break; case PROCESSOR_ARCHITECTURE_SHX: uv__strscpy(buffer->machine, "sh", sizeof(buffer->machine)); break; case PROCESSOR_ARCHITECTURE_ARM: uv__strscpy(buffer->machine, "arm", sizeof(buffer->machine)); break; default: uv__strscpy(buffer->machine, "unknown", sizeof(buffer->machine)); break; } return 0; error: buffer->sysname[0] = '\0'; buffer->release[0] = '\0'; buffer->version[0] = '\0'; buffer->machine[0] = '\0'; return r; } int uv_gettimeofday(uv_timeval64_t* tv) { /* Based on https://doxygen.postgresql.org/gettimeofday_8c_source.html */ const uint64_t epoch = (uint64_t) 116444736000000000ULL; FILETIME file_time; ULARGE_INTEGER ularge; if (tv == NULL) return UV_EINVAL; GetSystemTimeAsFileTime(&file_time); ularge.LowPart = file_time.dwLowDateTime; ularge.HighPart = file_time.dwHighDateTime; tv->tv_sec = (int64_t) ((ularge.QuadPart - epoch) / 10000000L); tv->tv_usec = (int32_t) (((ularge.QuadPart - epoch) % 10000000L) / 10); return 0; } int uv__random_rtlgenrandom(void* buf, size_t buflen) { if (buflen == 0) return 0; if (RtlGenRandom(buf, buflen) == FALSE) return UV_EIO; return 0; } void uv_sleep(unsigned int msec) { Sleep(msec); } ================================================ FILE: external/libuv/src/win/winapi.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include "uv.h" #include "internal.h" /* Ntdll function pointers */ sRtlGetVersion pRtlGetVersion; sRtlNtStatusToDosError pRtlNtStatusToDosError; sNtDeviceIoControlFile pNtDeviceIoControlFile; sNtQueryInformationFile pNtQueryInformationFile; sNtSetInformationFile pNtSetInformationFile; sNtQueryVolumeInformationFile pNtQueryVolumeInformationFile; sNtQueryDirectoryFile pNtQueryDirectoryFile; sNtQuerySystemInformation pNtQuerySystemInformation; sNtQueryInformationProcess pNtQueryInformationProcess; /* Kernel32 function pointers */ sGetQueuedCompletionStatusEx pGetQueuedCompletionStatusEx; /* Powrprof.dll function pointer */ sPowerRegisterSuspendResumeNotification pPowerRegisterSuspendResumeNotification; /* User32.dll function pointer */ sSetWinEventHook pSetWinEventHook; void uv_winapi_init(void) { HMODULE ntdll_module; HMODULE powrprof_module; HMODULE user32_module; HMODULE kernel32_module; ntdll_module = GetModuleHandleA("ntdll.dll"); if (ntdll_module == NULL) { uv_fatal_error(GetLastError(), "GetModuleHandleA"); } pRtlGetVersion = (sRtlGetVersion) GetProcAddress(ntdll_module, "RtlGetVersion"); pRtlNtStatusToDosError = (sRtlNtStatusToDosError) GetProcAddress( ntdll_module, "RtlNtStatusToDosError"); if (pRtlNtStatusToDosError == NULL) { uv_fatal_error(GetLastError(), "GetProcAddress"); } pNtDeviceIoControlFile = (sNtDeviceIoControlFile) GetProcAddress( ntdll_module, "NtDeviceIoControlFile"); if (pNtDeviceIoControlFile == NULL) { uv_fatal_error(GetLastError(), "GetProcAddress"); } pNtQueryInformationFile = (sNtQueryInformationFile) GetProcAddress( ntdll_module, "NtQueryInformationFile"); if (pNtQueryInformationFile == NULL) { uv_fatal_error(GetLastError(), "GetProcAddress"); } pNtSetInformationFile = (sNtSetInformationFile) GetProcAddress( ntdll_module, "NtSetInformationFile"); if (pNtSetInformationFile == NULL) { uv_fatal_error(GetLastError(), "GetProcAddress"); } pNtQueryVolumeInformationFile = (sNtQueryVolumeInformationFile) GetProcAddress(ntdll_module, "NtQueryVolumeInformationFile"); if (pNtQueryVolumeInformationFile == NULL) { uv_fatal_error(GetLastError(), "GetProcAddress"); } pNtQueryDirectoryFile = (sNtQueryDirectoryFile) GetProcAddress(ntdll_module, "NtQueryDirectoryFile"); if (pNtQueryVolumeInformationFile == NULL) { uv_fatal_error(GetLastError(), "GetProcAddress"); } pNtQuerySystemInformation = (sNtQuerySystemInformation) GetProcAddress( ntdll_module, "NtQuerySystemInformation"); if (pNtQuerySystemInformation == NULL) { uv_fatal_error(GetLastError(), "GetProcAddress"); } pNtQueryInformationProcess = (sNtQueryInformationProcess) GetProcAddress( ntdll_module, "NtQueryInformationProcess"); if (pNtQueryInformationProcess == NULL) { uv_fatal_error(GetLastError(), "GetProcAddress"); } kernel32_module = GetModuleHandleA("kernel32.dll"); if (kernel32_module == NULL) { uv_fatal_error(GetLastError(), "GetModuleHandleA"); } pGetQueuedCompletionStatusEx = (sGetQueuedCompletionStatusEx) GetProcAddress( kernel32_module, "GetQueuedCompletionStatusEx"); powrprof_module = LoadLibraryA("powrprof.dll"); if (powrprof_module != NULL) { pPowerRegisterSuspendResumeNotification = (sPowerRegisterSuspendResumeNotification) GetProcAddress(powrprof_module, "PowerRegisterSuspendResumeNotification"); } user32_module = LoadLibraryA("user32.dll"); if (user32_module != NULL) { pSetWinEventHook = (sSetWinEventHook) GetProcAddress(user32_module, "SetWinEventHook"); } } ================================================ FILE: external/libuv/src/win/winapi.h ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #ifndef UV_WIN_WINAPI_H_ #define UV_WIN_WINAPI_H_ #include /* * Ntdll headers */ #ifndef STATUS_SEVERITY_SUCCESS # define STATUS_SEVERITY_SUCCESS 0x0 #endif #ifndef STATUS_SEVERITY_INFORMATIONAL # define STATUS_SEVERITY_INFORMATIONAL 0x1 #endif #ifndef STATUS_SEVERITY_WARNING # define STATUS_SEVERITY_WARNING 0x2 #endif #ifndef STATUS_SEVERITY_ERROR # define STATUS_SEVERITY_ERROR 0x3 #endif #ifndef FACILITY_NTWIN32 # define FACILITY_NTWIN32 0x7 #endif #ifndef NT_SUCCESS # define NT_SUCCESS(status) (((NTSTATUS) (status)) >= 0) #endif #ifndef NT_INFORMATION # define NT_INFORMATION(status) ((((ULONG) (status)) >> 30) == 1) #endif #ifndef NT_WARNING # define NT_WARNING(status) ((((ULONG) (status)) >> 30) == 2) #endif #ifndef NT_ERROR # define NT_ERROR(status) ((((ULONG) (status)) >> 30) == 3) #endif #ifndef STATUS_SUCCESS # define STATUS_SUCCESS ((NTSTATUS) 0x00000000L) #endif #ifndef STATUS_WAIT_0 # define STATUS_WAIT_0 ((NTSTATUS) 0x00000000L) #endif #ifndef STATUS_WAIT_1 # define STATUS_WAIT_1 ((NTSTATUS) 0x00000001L) #endif #ifndef STATUS_WAIT_2 # define STATUS_WAIT_2 ((NTSTATUS) 0x00000002L) #endif #ifndef STATUS_WAIT_3 # define STATUS_WAIT_3 ((NTSTATUS) 0x00000003L) #endif #ifndef STATUS_WAIT_63 # define STATUS_WAIT_63 ((NTSTATUS) 0x0000003FL) #endif #ifndef STATUS_ABANDONED # define STATUS_ABANDONED ((NTSTATUS) 0x00000080L) #endif #ifndef STATUS_ABANDONED_WAIT_0 # define STATUS_ABANDONED_WAIT_0 ((NTSTATUS) 0x00000080L) #endif #ifndef STATUS_ABANDONED_WAIT_63 # define STATUS_ABANDONED_WAIT_63 ((NTSTATUS) 0x000000BFL) #endif #ifndef STATUS_USER_APC # define STATUS_USER_APC ((NTSTATUS) 0x000000C0L) #endif #ifndef STATUS_KERNEL_APC # define STATUS_KERNEL_APC ((NTSTATUS) 0x00000100L) #endif #ifndef STATUS_ALERTED # define STATUS_ALERTED ((NTSTATUS) 0x00000101L) #endif #ifndef STATUS_TIMEOUT # define STATUS_TIMEOUT ((NTSTATUS) 0x00000102L) #endif #ifndef STATUS_PENDING # define STATUS_PENDING ((NTSTATUS) 0x00000103L) #endif #ifndef STATUS_REPARSE # define STATUS_REPARSE ((NTSTATUS) 0x00000104L) #endif #ifndef STATUS_MORE_ENTRIES # define STATUS_MORE_ENTRIES ((NTSTATUS) 0x00000105L) #endif #ifndef STATUS_NOT_ALL_ASSIGNED # define STATUS_NOT_ALL_ASSIGNED ((NTSTATUS) 0x00000106L) #endif #ifndef STATUS_SOME_NOT_MAPPED # define STATUS_SOME_NOT_MAPPED ((NTSTATUS) 0x00000107L) #endif #ifndef STATUS_OPLOCK_BREAK_IN_PROGRESS # define STATUS_OPLOCK_BREAK_IN_PROGRESS ((NTSTATUS) 0x00000108L) #endif #ifndef STATUS_VOLUME_MOUNTED # define STATUS_VOLUME_MOUNTED ((NTSTATUS) 0x00000109L) #endif #ifndef STATUS_RXACT_COMMITTED # define STATUS_RXACT_COMMITTED ((NTSTATUS) 0x0000010AL) #endif #ifndef STATUS_NOTIFY_CLEANUP # define STATUS_NOTIFY_CLEANUP ((NTSTATUS) 0x0000010BL) #endif #ifndef STATUS_NOTIFY_ENUM_DIR # define STATUS_NOTIFY_ENUM_DIR ((NTSTATUS) 0x0000010CL) #endif #ifndef STATUS_NO_QUOTAS_FOR_ACCOUNT # define STATUS_NO_QUOTAS_FOR_ACCOUNT ((NTSTATUS) 0x0000010DL) #endif #ifndef STATUS_PRIMARY_TRANSPORT_CONNECT_FAILED # define STATUS_PRIMARY_TRANSPORT_CONNECT_FAILED ((NTSTATUS) 0x0000010EL) #endif #ifndef STATUS_PAGE_FAULT_TRANSITION # define STATUS_PAGE_FAULT_TRANSITION ((NTSTATUS) 0x00000110L) #endif #ifndef STATUS_PAGE_FAULT_DEMAND_ZERO # define STATUS_PAGE_FAULT_DEMAND_ZERO ((NTSTATUS) 0x00000111L) #endif #ifndef STATUS_PAGE_FAULT_COPY_ON_WRITE # define STATUS_PAGE_FAULT_COPY_ON_WRITE ((NTSTATUS) 0x00000112L) #endif #ifndef STATUS_PAGE_FAULT_GUARD_PAGE # define STATUS_PAGE_FAULT_GUARD_PAGE ((NTSTATUS) 0x00000113L) #endif #ifndef STATUS_PAGE_FAULT_PAGING_FILE # define STATUS_PAGE_FAULT_PAGING_FILE ((NTSTATUS) 0x00000114L) #endif #ifndef STATUS_CACHE_PAGE_LOCKED # define STATUS_CACHE_PAGE_LOCKED ((NTSTATUS) 0x00000115L) #endif #ifndef STATUS_CRASH_DUMP # define STATUS_CRASH_DUMP ((NTSTATUS) 0x00000116L) #endif #ifndef STATUS_BUFFER_ALL_ZEROS # define STATUS_BUFFER_ALL_ZEROS ((NTSTATUS) 0x00000117L) #endif #ifndef STATUS_REPARSE_OBJECT # define STATUS_REPARSE_OBJECT ((NTSTATUS) 0x00000118L) #endif #ifndef STATUS_RESOURCE_REQUIREMENTS_CHANGED # define STATUS_RESOURCE_REQUIREMENTS_CHANGED ((NTSTATUS) 0x00000119L) #endif #ifndef STATUS_TRANSLATION_COMPLETE # define STATUS_TRANSLATION_COMPLETE ((NTSTATUS) 0x00000120L) #endif #ifndef STATUS_DS_MEMBERSHIP_EVALUATED_LOCALLY # define STATUS_DS_MEMBERSHIP_EVALUATED_LOCALLY ((NTSTATUS) 0x00000121L) #endif #ifndef STATUS_NOTHING_TO_TERMINATE # define STATUS_NOTHING_TO_TERMINATE ((NTSTATUS) 0x00000122L) #endif #ifndef STATUS_PROCESS_NOT_IN_JOB # define STATUS_PROCESS_NOT_IN_JOB ((NTSTATUS) 0x00000123L) #endif #ifndef STATUS_PROCESS_IN_JOB # define STATUS_PROCESS_IN_JOB ((NTSTATUS) 0x00000124L) #endif #ifndef STATUS_VOLSNAP_HIBERNATE_READY # define STATUS_VOLSNAP_HIBERNATE_READY ((NTSTATUS) 0x00000125L) #endif #ifndef STATUS_FSFILTER_OP_COMPLETED_SUCCESSFULLY # define STATUS_FSFILTER_OP_COMPLETED_SUCCESSFULLY ((NTSTATUS) 0x00000126L) #endif #ifndef STATUS_INTERRUPT_VECTOR_ALREADY_CONNECTED # define STATUS_INTERRUPT_VECTOR_ALREADY_CONNECTED ((NTSTATUS) 0x00000127L) #endif #ifndef STATUS_INTERRUPT_STILL_CONNECTED # define STATUS_INTERRUPT_STILL_CONNECTED ((NTSTATUS) 0x00000128L) #endif #ifndef STATUS_PROCESS_CLONED # define STATUS_PROCESS_CLONED ((NTSTATUS) 0x00000129L) #endif #ifndef STATUS_FILE_LOCKED_WITH_ONLY_READERS # define STATUS_FILE_LOCKED_WITH_ONLY_READERS ((NTSTATUS) 0x0000012AL) #endif #ifndef STATUS_FILE_LOCKED_WITH_WRITERS # define STATUS_FILE_LOCKED_WITH_WRITERS ((NTSTATUS) 0x0000012BL) #endif #ifndef STATUS_RESOURCEMANAGER_READ_ONLY # define STATUS_RESOURCEMANAGER_READ_ONLY ((NTSTATUS) 0x00000202L) #endif #ifndef STATUS_RING_PREVIOUSLY_EMPTY # define STATUS_RING_PREVIOUSLY_EMPTY ((NTSTATUS) 0x00000210L) #endif #ifndef STATUS_RING_PREVIOUSLY_FULL # define STATUS_RING_PREVIOUSLY_FULL ((NTSTATUS) 0x00000211L) #endif #ifndef STATUS_RING_PREVIOUSLY_ABOVE_QUOTA # define STATUS_RING_PREVIOUSLY_ABOVE_QUOTA ((NTSTATUS) 0x00000212L) #endif #ifndef STATUS_RING_NEWLY_EMPTY # define STATUS_RING_NEWLY_EMPTY ((NTSTATUS) 0x00000213L) #endif #ifndef STATUS_RING_SIGNAL_OPPOSITE_ENDPOINT # define STATUS_RING_SIGNAL_OPPOSITE_ENDPOINT ((NTSTATUS) 0x00000214L) #endif #ifndef STATUS_OPLOCK_SWITCHED_TO_NEW_HANDLE # define STATUS_OPLOCK_SWITCHED_TO_NEW_HANDLE ((NTSTATUS) 0x00000215L) #endif #ifndef STATUS_OPLOCK_HANDLE_CLOSED # define STATUS_OPLOCK_HANDLE_CLOSED ((NTSTATUS) 0x00000216L) #endif #ifndef STATUS_WAIT_FOR_OPLOCK # define STATUS_WAIT_FOR_OPLOCK ((NTSTATUS) 0x00000367L) #endif #ifndef STATUS_OBJECT_NAME_EXISTS # define STATUS_OBJECT_NAME_EXISTS ((NTSTATUS) 0x40000000L) #endif #ifndef STATUS_THREAD_WAS_SUSPENDED # define STATUS_THREAD_WAS_SUSPENDED ((NTSTATUS) 0x40000001L) #endif #ifndef STATUS_WORKING_SET_LIMIT_RANGE # define STATUS_WORKING_SET_LIMIT_RANGE ((NTSTATUS) 0x40000002L) #endif #ifndef STATUS_IMAGE_NOT_AT_BASE # define STATUS_IMAGE_NOT_AT_BASE ((NTSTATUS) 0x40000003L) #endif #ifndef STATUS_RXACT_STATE_CREATED # define STATUS_RXACT_STATE_CREATED ((NTSTATUS) 0x40000004L) #endif #ifndef STATUS_SEGMENT_NOTIFICATION # define STATUS_SEGMENT_NOTIFICATION ((NTSTATUS) 0x40000005L) #endif #ifndef STATUS_LOCAL_USER_SESSION_KEY # define STATUS_LOCAL_USER_SESSION_KEY ((NTSTATUS) 0x40000006L) #endif #ifndef STATUS_BAD_CURRENT_DIRECTORY # define STATUS_BAD_CURRENT_DIRECTORY ((NTSTATUS) 0x40000007L) #endif #ifndef STATUS_SERIAL_MORE_WRITES # define STATUS_SERIAL_MORE_WRITES ((NTSTATUS) 0x40000008L) #endif #ifndef STATUS_REGISTRY_RECOVERED # define STATUS_REGISTRY_RECOVERED ((NTSTATUS) 0x40000009L) #endif #ifndef STATUS_FT_READ_RECOVERY_FROM_BACKUP # define STATUS_FT_READ_RECOVERY_FROM_BACKUP ((NTSTATUS) 0x4000000AL) #endif #ifndef STATUS_FT_WRITE_RECOVERY # define STATUS_FT_WRITE_RECOVERY ((NTSTATUS) 0x4000000BL) #endif #ifndef STATUS_SERIAL_COUNTER_TIMEOUT # define STATUS_SERIAL_COUNTER_TIMEOUT ((NTSTATUS) 0x4000000CL) #endif #ifndef STATUS_NULL_LM_PASSWORD # define STATUS_NULL_LM_PASSWORD ((NTSTATUS) 0x4000000DL) #endif #ifndef STATUS_IMAGE_MACHINE_TYPE_MISMATCH # define STATUS_IMAGE_MACHINE_TYPE_MISMATCH ((NTSTATUS) 0x4000000EL) #endif #ifndef STATUS_RECEIVE_PARTIAL # define STATUS_RECEIVE_PARTIAL ((NTSTATUS) 0x4000000FL) #endif #ifndef STATUS_RECEIVE_EXPEDITED # define STATUS_RECEIVE_EXPEDITED ((NTSTATUS) 0x40000010L) #endif #ifndef STATUS_RECEIVE_PARTIAL_EXPEDITED # define STATUS_RECEIVE_PARTIAL_EXPEDITED ((NTSTATUS) 0x40000011L) #endif #ifndef STATUS_EVENT_DONE # define STATUS_EVENT_DONE ((NTSTATUS) 0x40000012L) #endif #ifndef STATUS_EVENT_PENDING # define STATUS_EVENT_PENDING ((NTSTATUS) 0x40000013L) #endif #ifndef STATUS_CHECKING_FILE_SYSTEM # define STATUS_CHECKING_FILE_SYSTEM ((NTSTATUS) 0x40000014L) #endif #ifndef STATUS_FATAL_APP_EXIT # define STATUS_FATAL_APP_EXIT ((NTSTATUS) 0x40000015L) #endif #ifndef STATUS_PREDEFINED_HANDLE # define STATUS_PREDEFINED_HANDLE ((NTSTATUS) 0x40000016L) #endif #ifndef STATUS_WAS_UNLOCKED # define STATUS_WAS_UNLOCKED ((NTSTATUS) 0x40000017L) #endif #ifndef STATUS_SERVICE_NOTIFICATION # define STATUS_SERVICE_NOTIFICATION ((NTSTATUS) 0x40000018L) #endif #ifndef STATUS_WAS_LOCKED # define STATUS_WAS_LOCKED ((NTSTATUS) 0x40000019L) #endif #ifndef STATUS_LOG_HARD_ERROR # define STATUS_LOG_HARD_ERROR ((NTSTATUS) 0x4000001AL) #endif #ifndef STATUS_ALREADY_WIN32 # define STATUS_ALREADY_WIN32 ((NTSTATUS) 0x4000001BL) #endif #ifndef STATUS_WX86_UNSIMULATE # define STATUS_WX86_UNSIMULATE ((NTSTATUS) 0x4000001CL) #endif #ifndef STATUS_WX86_CONTINUE # define STATUS_WX86_CONTINUE ((NTSTATUS) 0x4000001DL) #endif #ifndef STATUS_WX86_SINGLE_STEP # define STATUS_WX86_SINGLE_STEP ((NTSTATUS) 0x4000001EL) #endif #ifndef STATUS_WX86_BREAKPOINT # define STATUS_WX86_BREAKPOINT ((NTSTATUS) 0x4000001FL) #endif #ifndef STATUS_WX86_EXCEPTION_CONTINUE # define STATUS_WX86_EXCEPTION_CONTINUE ((NTSTATUS) 0x40000020L) #endif #ifndef STATUS_WX86_EXCEPTION_LASTCHANCE # define STATUS_WX86_EXCEPTION_LASTCHANCE ((NTSTATUS) 0x40000021L) #endif #ifndef STATUS_WX86_EXCEPTION_CHAIN # define STATUS_WX86_EXCEPTION_CHAIN ((NTSTATUS) 0x40000022L) #endif #ifndef STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE # define STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE ((NTSTATUS) 0x40000023L) #endif #ifndef STATUS_NO_YIELD_PERFORMED # define STATUS_NO_YIELD_PERFORMED ((NTSTATUS) 0x40000024L) #endif #ifndef STATUS_TIMER_RESUME_IGNORED # define STATUS_TIMER_RESUME_IGNORED ((NTSTATUS) 0x40000025L) #endif #ifndef STATUS_ARBITRATION_UNHANDLED # define STATUS_ARBITRATION_UNHANDLED ((NTSTATUS) 0x40000026L) #endif #ifndef STATUS_CARDBUS_NOT_SUPPORTED # define STATUS_CARDBUS_NOT_SUPPORTED ((NTSTATUS) 0x40000027L) #endif #ifndef STATUS_WX86_CREATEWX86TIB # define STATUS_WX86_CREATEWX86TIB ((NTSTATUS) 0x40000028L) #endif #ifndef STATUS_MP_PROCESSOR_MISMATCH # define STATUS_MP_PROCESSOR_MISMATCH ((NTSTATUS) 0x40000029L) #endif #ifndef STATUS_HIBERNATED # define STATUS_HIBERNATED ((NTSTATUS) 0x4000002AL) #endif #ifndef STATUS_RESUME_HIBERNATION # define STATUS_RESUME_HIBERNATION ((NTSTATUS) 0x4000002BL) #endif #ifndef STATUS_FIRMWARE_UPDATED # define STATUS_FIRMWARE_UPDATED ((NTSTATUS) 0x4000002CL) #endif #ifndef STATUS_DRIVERS_LEAKING_LOCKED_PAGES # define STATUS_DRIVERS_LEAKING_LOCKED_PAGES ((NTSTATUS) 0x4000002DL) #endif #ifndef STATUS_MESSAGE_RETRIEVED # define STATUS_MESSAGE_RETRIEVED ((NTSTATUS) 0x4000002EL) #endif #ifndef STATUS_SYSTEM_POWERSTATE_TRANSITION # define STATUS_SYSTEM_POWERSTATE_TRANSITION ((NTSTATUS) 0x4000002FL) #endif #ifndef STATUS_ALPC_CHECK_COMPLETION_LIST # define STATUS_ALPC_CHECK_COMPLETION_LIST ((NTSTATUS) 0x40000030L) #endif #ifndef STATUS_SYSTEM_POWERSTATE_COMPLEX_TRANSITION # define STATUS_SYSTEM_POWERSTATE_COMPLEX_TRANSITION ((NTSTATUS) 0x40000031L) #endif #ifndef STATUS_ACCESS_AUDIT_BY_POLICY # define STATUS_ACCESS_AUDIT_BY_POLICY ((NTSTATUS) 0x40000032L) #endif #ifndef STATUS_ABANDON_HIBERFILE # define STATUS_ABANDON_HIBERFILE ((NTSTATUS) 0x40000033L) #endif #ifndef STATUS_BIZRULES_NOT_ENABLED # define STATUS_BIZRULES_NOT_ENABLED ((NTSTATUS) 0x40000034L) #endif #ifndef STATUS_GUARD_PAGE_VIOLATION # define STATUS_GUARD_PAGE_VIOLATION ((NTSTATUS) 0x80000001L) #endif #ifndef STATUS_DATATYPE_MISALIGNMENT # define STATUS_DATATYPE_MISALIGNMENT ((NTSTATUS) 0x80000002L) #endif #ifndef STATUS_BREAKPOINT # define STATUS_BREAKPOINT ((NTSTATUS) 0x80000003L) #endif #ifndef STATUS_SINGLE_STEP # define STATUS_SINGLE_STEP ((NTSTATUS) 0x80000004L) #endif #ifndef STATUS_BUFFER_OVERFLOW # define STATUS_BUFFER_OVERFLOW ((NTSTATUS) 0x80000005L) #endif #ifndef STATUS_NO_MORE_FILES # define STATUS_NO_MORE_FILES ((NTSTATUS) 0x80000006L) #endif #ifndef STATUS_WAKE_SYSTEM_DEBUGGER # define STATUS_WAKE_SYSTEM_DEBUGGER ((NTSTATUS) 0x80000007L) #endif #ifndef STATUS_HANDLES_CLOSED # define STATUS_HANDLES_CLOSED ((NTSTATUS) 0x8000000AL) #endif #ifndef STATUS_NO_INHERITANCE # define STATUS_NO_INHERITANCE ((NTSTATUS) 0x8000000BL) #endif #ifndef STATUS_GUID_SUBSTITUTION_MADE # define STATUS_GUID_SUBSTITUTION_MADE ((NTSTATUS) 0x8000000CL) #endif #ifndef STATUS_PARTIAL_COPY # define STATUS_PARTIAL_COPY ((NTSTATUS) 0x8000000DL) #endif #ifndef STATUS_DEVICE_PAPER_EMPTY # define STATUS_DEVICE_PAPER_EMPTY ((NTSTATUS) 0x8000000EL) #endif #ifndef STATUS_DEVICE_POWERED_OFF # define STATUS_DEVICE_POWERED_OFF ((NTSTATUS) 0x8000000FL) #endif #ifndef STATUS_DEVICE_OFF_LINE # define STATUS_DEVICE_OFF_LINE ((NTSTATUS) 0x80000010L) #endif #ifndef STATUS_DEVICE_BUSY # define STATUS_DEVICE_BUSY ((NTSTATUS) 0x80000011L) #endif #ifndef STATUS_NO_MORE_EAS # define STATUS_NO_MORE_EAS ((NTSTATUS) 0x80000012L) #endif #ifndef STATUS_INVALID_EA_NAME # define STATUS_INVALID_EA_NAME ((NTSTATUS) 0x80000013L) #endif #ifndef STATUS_EA_LIST_INCONSISTENT # define STATUS_EA_LIST_INCONSISTENT ((NTSTATUS) 0x80000014L) #endif #ifndef STATUS_INVALID_EA_FLAG # define STATUS_INVALID_EA_FLAG ((NTSTATUS) 0x80000015L) #endif #ifndef STATUS_VERIFY_REQUIRED # define STATUS_VERIFY_REQUIRED ((NTSTATUS) 0x80000016L) #endif #ifndef STATUS_EXTRANEOUS_INFORMATION # define STATUS_EXTRANEOUS_INFORMATION ((NTSTATUS) 0x80000017L) #endif #ifndef STATUS_RXACT_COMMIT_NECESSARY # define STATUS_RXACT_COMMIT_NECESSARY ((NTSTATUS) 0x80000018L) #endif #ifndef STATUS_NO_MORE_ENTRIES # define STATUS_NO_MORE_ENTRIES ((NTSTATUS) 0x8000001AL) #endif #ifndef STATUS_FILEMARK_DETECTED # define STATUS_FILEMARK_DETECTED ((NTSTATUS) 0x8000001BL) #endif #ifndef STATUS_MEDIA_CHANGED # define STATUS_MEDIA_CHANGED ((NTSTATUS) 0x8000001CL) #endif #ifndef STATUS_BUS_RESET # define STATUS_BUS_RESET ((NTSTATUS) 0x8000001DL) #endif #ifndef STATUS_END_OF_MEDIA # define STATUS_END_OF_MEDIA ((NTSTATUS) 0x8000001EL) #endif #ifndef STATUS_BEGINNING_OF_MEDIA # define STATUS_BEGINNING_OF_MEDIA ((NTSTATUS) 0x8000001FL) #endif #ifndef STATUS_MEDIA_CHECK # define STATUS_MEDIA_CHECK ((NTSTATUS) 0x80000020L) #endif #ifndef STATUS_SETMARK_DETECTED # define STATUS_SETMARK_DETECTED ((NTSTATUS) 0x80000021L) #endif #ifndef STATUS_NO_DATA_DETECTED # define STATUS_NO_DATA_DETECTED ((NTSTATUS) 0x80000022L) #endif #ifndef STATUS_REDIRECTOR_HAS_OPEN_HANDLES # define STATUS_REDIRECTOR_HAS_OPEN_HANDLES ((NTSTATUS) 0x80000023L) #endif #ifndef STATUS_SERVER_HAS_OPEN_HANDLES # define STATUS_SERVER_HAS_OPEN_HANDLES ((NTSTATUS) 0x80000024L) #endif #ifndef STATUS_ALREADY_DISCONNECTED # define STATUS_ALREADY_DISCONNECTED ((NTSTATUS) 0x80000025L) #endif #ifndef STATUS_LONGJUMP # define STATUS_LONGJUMP ((NTSTATUS) 0x80000026L) #endif #ifndef STATUS_CLEANER_CARTRIDGE_INSTALLED # define STATUS_CLEANER_CARTRIDGE_INSTALLED ((NTSTATUS) 0x80000027L) #endif #ifndef STATUS_PLUGPLAY_QUERY_VETOED # define STATUS_PLUGPLAY_QUERY_VETOED ((NTSTATUS) 0x80000028L) #endif #ifndef STATUS_UNWIND_CONSOLIDATE # define STATUS_UNWIND_CONSOLIDATE ((NTSTATUS) 0x80000029L) #endif #ifndef STATUS_REGISTRY_HIVE_RECOVERED # define STATUS_REGISTRY_HIVE_RECOVERED ((NTSTATUS) 0x8000002AL) #endif #ifndef STATUS_DLL_MIGHT_BE_INSECURE # define STATUS_DLL_MIGHT_BE_INSECURE ((NTSTATUS) 0x8000002BL) #endif #ifndef STATUS_DLL_MIGHT_BE_INCOMPATIBLE # define STATUS_DLL_MIGHT_BE_INCOMPATIBLE ((NTSTATUS) 0x8000002CL) #endif #ifndef STATUS_STOPPED_ON_SYMLINK # define STATUS_STOPPED_ON_SYMLINK ((NTSTATUS) 0x8000002DL) #endif #ifndef STATUS_CANNOT_GRANT_REQUESTED_OPLOCK # define STATUS_CANNOT_GRANT_REQUESTED_OPLOCK ((NTSTATUS) 0x8000002EL) #endif #ifndef STATUS_NO_ACE_CONDITION # define STATUS_NO_ACE_CONDITION ((NTSTATUS) 0x8000002FL) #endif #ifndef STATUS_UNSUCCESSFUL # define STATUS_UNSUCCESSFUL ((NTSTATUS) 0xC0000001L) #endif #ifndef STATUS_NOT_IMPLEMENTED # define STATUS_NOT_IMPLEMENTED ((NTSTATUS) 0xC0000002L) #endif #ifndef STATUS_INVALID_INFO_CLASS # define STATUS_INVALID_INFO_CLASS ((NTSTATUS) 0xC0000003L) #endif #ifndef STATUS_INFO_LENGTH_MISMATCH # define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS) 0xC0000004L) #endif #ifndef STATUS_ACCESS_VIOLATION # define STATUS_ACCESS_VIOLATION ((NTSTATUS) 0xC0000005L) #endif #ifndef STATUS_IN_PAGE_ERROR # define STATUS_IN_PAGE_ERROR ((NTSTATUS) 0xC0000006L) #endif #ifndef STATUS_PAGEFILE_QUOTA # define STATUS_PAGEFILE_QUOTA ((NTSTATUS) 0xC0000007L) #endif #ifndef STATUS_INVALID_HANDLE # define STATUS_INVALID_HANDLE ((NTSTATUS) 0xC0000008L) #endif #ifndef STATUS_BAD_INITIAL_STACK # define STATUS_BAD_INITIAL_STACK ((NTSTATUS) 0xC0000009L) #endif #ifndef STATUS_BAD_INITIAL_PC # define STATUS_BAD_INITIAL_PC ((NTSTATUS) 0xC000000AL) #endif #ifndef STATUS_INVALID_CID # define STATUS_INVALID_CID ((NTSTATUS) 0xC000000BL) #endif #ifndef STATUS_TIMER_NOT_CANCELED # define STATUS_TIMER_NOT_CANCELED ((NTSTATUS) 0xC000000CL) #endif #ifndef STATUS_INVALID_PARAMETER # define STATUS_INVALID_PARAMETER ((NTSTATUS) 0xC000000DL) #endif #ifndef STATUS_NO_SUCH_DEVICE # define STATUS_NO_SUCH_DEVICE ((NTSTATUS) 0xC000000EL) #endif #ifndef STATUS_NO_SUCH_FILE # define STATUS_NO_SUCH_FILE ((NTSTATUS) 0xC000000FL) #endif #ifndef STATUS_INVALID_DEVICE_REQUEST # define STATUS_INVALID_DEVICE_REQUEST ((NTSTATUS) 0xC0000010L) #endif #ifndef STATUS_END_OF_FILE # define STATUS_END_OF_FILE ((NTSTATUS) 0xC0000011L) #endif #ifndef STATUS_WRONG_VOLUME # define STATUS_WRONG_VOLUME ((NTSTATUS) 0xC0000012L) #endif #ifndef STATUS_NO_MEDIA_IN_DEVICE # define STATUS_NO_MEDIA_IN_DEVICE ((NTSTATUS) 0xC0000013L) #endif #ifndef STATUS_UNRECOGNIZED_MEDIA # define STATUS_UNRECOGNIZED_MEDIA ((NTSTATUS) 0xC0000014L) #endif #ifndef STATUS_NONEXISTENT_SECTOR # define STATUS_NONEXISTENT_SECTOR ((NTSTATUS) 0xC0000015L) #endif #ifndef STATUS_MORE_PROCESSING_REQUIRED # define STATUS_MORE_PROCESSING_REQUIRED ((NTSTATUS) 0xC0000016L) #endif #ifndef STATUS_NO_MEMORY # define STATUS_NO_MEMORY ((NTSTATUS) 0xC0000017L) #endif #ifndef STATUS_CONFLICTING_ADDRESSES # define STATUS_CONFLICTING_ADDRESSES ((NTSTATUS) 0xC0000018L) #endif #ifndef STATUS_NOT_MAPPED_VIEW # define STATUS_NOT_MAPPED_VIEW ((NTSTATUS) 0xC0000019L) #endif #ifndef STATUS_UNABLE_TO_FREE_VM # define STATUS_UNABLE_TO_FREE_VM ((NTSTATUS) 0xC000001AL) #endif #ifndef STATUS_UNABLE_TO_DELETE_SECTION # define STATUS_UNABLE_TO_DELETE_SECTION ((NTSTATUS) 0xC000001BL) #endif #ifndef STATUS_INVALID_SYSTEM_SERVICE # define STATUS_INVALID_SYSTEM_SERVICE ((NTSTATUS) 0xC000001CL) #endif #ifndef STATUS_ILLEGAL_INSTRUCTION # define STATUS_ILLEGAL_INSTRUCTION ((NTSTATUS) 0xC000001DL) #endif #ifndef STATUS_INVALID_LOCK_SEQUENCE # define STATUS_INVALID_LOCK_SEQUENCE ((NTSTATUS) 0xC000001EL) #endif #ifndef STATUS_INVALID_VIEW_SIZE # define STATUS_INVALID_VIEW_SIZE ((NTSTATUS) 0xC000001FL) #endif #ifndef STATUS_INVALID_FILE_FOR_SECTION # define STATUS_INVALID_FILE_FOR_SECTION ((NTSTATUS) 0xC0000020L) #endif #ifndef STATUS_ALREADY_COMMITTED # define STATUS_ALREADY_COMMITTED ((NTSTATUS) 0xC0000021L) #endif #ifndef STATUS_ACCESS_DENIED # define STATUS_ACCESS_DENIED ((NTSTATUS) 0xC0000022L) #endif #ifndef STATUS_BUFFER_TOO_SMALL # define STATUS_BUFFER_TOO_SMALL ((NTSTATUS) 0xC0000023L) #endif #ifndef STATUS_OBJECT_TYPE_MISMATCH # define STATUS_OBJECT_TYPE_MISMATCH ((NTSTATUS) 0xC0000024L) #endif #ifndef STATUS_NONCONTINUABLE_EXCEPTION # define STATUS_NONCONTINUABLE_EXCEPTION ((NTSTATUS) 0xC0000025L) #endif #ifndef STATUS_INVALID_DISPOSITION # define STATUS_INVALID_DISPOSITION ((NTSTATUS) 0xC0000026L) #endif #ifndef STATUS_UNWIND # define STATUS_UNWIND ((NTSTATUS) 0xC0000027L) #endif #ifndef STATUS_BAD_STACK # define STATUS_BAD_STACK ((NTSTATUS) 0xC0000028L) #endif #ifndef STATUS_INVALID_UNWIND_TARGET # define STATUS_INVALID_UNWIND_TARGET ((NTSTATUS) 0xC0000029L) #endif #ifndef STATUS_NOT_LOCKED # define STATUS_NOT_LOCKED ((NTSTATUS) 0xC000002AL) #endif #ifndef STATUS_PARITY_ERROR # define STATUS_PARITY_ERROR ((NTSTATUS) 0xC000002BL) #endif #ifndef STATUS_UNABLE_TO_DECOMMIT_VM # define STATUS_UNABLE_TO_DECOMMIT_VM ((NTSTATUS) 0xC000002CL) #endif #ifndef STATUS_NOT_COMMITTED # define STATUS_NOT_COMMITTED ((NTSTATUS) 0xC000002DL) #endif #ifndef STATUS_INVALID_PORT_ATTRIBUTES # define STATUS_INVALID_PORT_ATTRIBUTES ((NTSTATUS) 0xC000002EL) #endif #ifndef STATUS_PORT_MESSAGE_TOO_LONG # define STATUS_PORT_MESSAGE_TOO_LONG ((NTSTATUS) 0xC000002FL) #endif #ifndef STATUS_INVALID_PARAMETER_MIX # define STATUS_INVALID_PARAMETER_MIX ((NTSTATUS) 0xC0000030L) #endif #ifndef STATUS_INVALID_QUOTA_LOWER # define STATUS_INVALID_QUOTA_LOWER ((NTSTATUS) 0xC0000031L) #endif #ifndef STATUS_DISK_CORRUPT_ERROR # define STATUS_DISK_CORRUPT_ERROR ((NTSTATUS) 0xC0000032L) #endif #ifndef STATUS_OBJECT_NAME_INVALID # define STATUS_OBJECT_NAME_INVALID ((NTSTATUS) 0xC0000033L) #endif #ifndef STATUS_OBJECT_NAME_NOT_FOUND # define STATUS_OBJECT_NAME_NOT_FOUND ((NTSTATUS) 0xC0000034L) #endif #ifndef STATUS_OBJECT_NAME_COLLISION # define STATUS_OBJECT_NAME_COLLISION ((NTSTATUS) 0xC0000035L) #endif #ifndef STATUS_PORT_DISCONNECTED # define STATUS_PORT_DISCONNECTED ((NTSTATUS) 0xC0000037L) #endif #ifndef STATUS_DEVICE_ALREADY_ATTACHED # define STATUS_DEVICE_ALREADY_ATTACHED ((NTSTATUS) 0xC0000038L) #endif #ifndef STATUS_OBJECT_PATH_INVALID # define STATUS_OBJECT_PATH_INVALID ((NTSTATUS) 0xC0000039L) #endif #ifndef STATUS_OBJECT_PATH_NOT_FOUND # define STATUS_OBJECT_PATH_NOT_FOUND ((NTSTATUS) 0xC000003AL) #endif #ifndef STATUS_OBJECT_PATH_SYNTAX_BAD # define STATUS_OBJECT_PATH_SYNTAX_BAD ((NTSTATUS) 0xC000003BL) #endif #ifndef STATUS_DATA_OVERRUN # define STATUS_DATA_OVERRUN ((NTSTATUS) 0xC000003CL) #endif #ifndef STATUS_DATA_LATE_ERROR # define STATUS_DATA_LATE_ERROR ((NTSTATUS) 0xC000003DL) #endif #ifndef STATUS_DATA_ERROR # define STATUS_DATA_ERROR ((NTSTATUS) 0xC000003EL) #endif #ifndef STATUS_CRC_ERROR # define STATUS_CRC_ERROR ((NTSTATUS) 0xC000003FL) #endif #ifndef STATUS_SECTION_TOO_BIG # define STATUS_SECTION_TOO_BIG ((NTSTATUS) 0xC0000040L) #endif #ifndef STATUS_PORT_CONNECTION_REFUSED # define STATUS_PORT_CONNECTION_REFUSED ((NTSTATUS) 0xC0000041L) #endif #ifndef STATUS_INVALID_PORT_HANDLE # define STATUS_INVALID_PORT_HANDLE ((NTSTATUS) 0xC0000042L) #endif #ifndef STATUS_SHARING_VIOLATION # define STATUS_SHARING_VIOLATION ((NTSTATUS) 0xC0000043L) #endif #ifndef STATUS_QUOTA_EXCEEDED # define STATUS_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000044L) #endif #ifndef STATUS_INVALID_PAGE_PROTECTION # define STATUS_INVALID_PAGE_PROTECTION ((NTSTATUS) 0xC0000045L) #endif #ifndef STATUS_MUTANT_NOT_OWNED # define STATUS_MUTANT_NOT_OWNED ((NTSTATUS) 0xC0000046L) #endif #ifndef STATUS_SEMAPHORE_LIMIT_EXCEEDED # define STATUS_SEMAPHORE_LIMIT_EXCEEDED ((NTSTATUS) 0xC0000047L) #endif #ifndef STATUS_PORT_ALREADY_SET # define STATUS_PORT_ALREADY_SET ((NTSTATUS) 0xC0000048L) #endif #ifndef STATUS_SECTION_NOT_IMAGE # define STATUS_SECTION_NOT_IMAGE ((NTSTATUS) 0xC0000049L) #endif #ifndef STATUS_SUSPEND_COUNT_EXCEEDED # define STATUS_SUSPEND_COUNT_EXCEEDED ((NTSTATUS) 0xC000004AL) #endif #ifndef STATUS_THREAD_IS_TERMINATING # define STATUS_THREAD_IS_TERMINATING ((NTSTATUS) 0xC000004BL) #endif #ifndef STATUS_BAD_WORKING_SET_LIMIT # define STATUS_BAD_WORKING_SET_LIMIT ((NTSTATUS) 0xC000004CL) #endif #ifndef STATUS_INCOMPATIBLE_FILE_MAP # define STATUS_INCOMPATIBLE_FILE_MAP ((NTSTATUS) 0xC000004DL) #endif #ifndef STATUS_SECTION_PROTECTION # define STATUS_SECTION_PROTECTION ((NTSTATUS) 0xC000004EL) #endif #ifndef STATUS_EAS_NOT_SUPPORTED # define STATUS_EAS_NOT_SUPPORTED ((NTSTATUS) 0xC000004FL) #endif #ifndef STATUS_EA_TOO_LARGE # define STATUS_EA_TOO_LARGE ((NTSTATUS) 0xC0000050L) #endif #ifndef STATUS_NONEXISTENT_EA_ENTRY # define STATUS_NONEXISTENT_EA_ENTRY ((NTSTATUS) 0xC0000051L) #endif #ifndef STATUS_NO_EAS_ON_FILE # define STATUS_NO_EAS_ON_FILE ((NTSTATUS) 0xC0000052L) #endif #ifndef STATUS_EA_CORRUPT_ERROR # define STATUS_EA_CORRUPT_ERROR ((NTSTATUS) 0xC0000053L) #endif #ifndef STATUS_FILE_LOCK_CONFLICT # define STATUS_FILE_LOCK_CONFLICT ((NTSTATUS) 0xC0000054L) #endif #ifndef STATUS_LOCK_NOT_GRANTED # define STATUS_LOCK_NOT_GRANTED ((NTSTATUS) 0xC0000055L) #endif #ifndef STATUS_DELETE_PENDING # define STATUS_DELETE_PENDING ((NTSTATUS) 0xC0000056L) #endif #ifndef STATUS_CTL_FILE_NOT_SUPPORTED # define STATUS_CTL_FILE_NOT_SUPPORTED ((NTSTATUS) 0xC0000057L) #endif #ifndef STATUS_UNKNOWN_REVISION # define STATUS_UNKNOWN_REVISION ((NTSTATUS) 0xC0000058L) #endif #ifndef STATUS_REVISION_MISMATCH # define STATUS_REVISION_MISMATCH ((NTSTATUS) 0xC0000059L) #endif #ifndef STATUS_INVALID_OWNER # define STATUS_INVALID_OWNER ((NTSTATUS) 0xC000005AL) #endif #ifndef STATUS_INVALID_PRIMARY_GROUP # define STATUS_INVALID_PRIMARY_GROUP ((NTSTATUS) 0xC000005BL) #endif #ifndef STATUS_NO_IMPERSONATION_TOKEN # define STATUS_NO_IMPERSONATION_TOKEN ((NTSTATUS) 0xC000005CL) #endif #ifndef STATUS_CANT_DISABLE_MANDATORY # define STATUS_CANT_DISABLE_MANDATORY ((NTSTATUS) 0xC000005DL) #endif #ifndef STATUS_NO_LOGON_SERVERS # define STATUS_NO_LOGON_SERVERS ((NTSTATUS) 0xC000005EL) #endif #ifndef STATUS_NO_SUCH_LOGON_SESSION # define STATUS_NO_SUCH_LOGON_SESSION ((NTSTATUS) 0xC000005FL) #endif #ifndef STATUS_NO_SUCH_PRIVILEGE # define STATUS_NO_SUCH_PRIVILEGE ((NTSTATUS) 0xC0000060L) #endif #ifndef STATUS_PRIVILEGE_NOT_HELD # define STATUS_PRIVILEGE_NOT_HELD ((NTSTATUS) 0xC0000061L) #endif #ifndef STATUS_INVALID_ACCOUNT_NAME # define STATUS_INVALID_ACCOUNT_NAME ((NTSTATUS) 0xC0000062L) #endif #ifndef STATUS_USER_EXISTS # define STATUS_USER_EXISTS ((NTSTATUS) 0xC0000063L) #endif #ifndef STATUS_NO_SUCH_USER # define STATUS_NO_SUCH_USER ((NTSTATUS) 0xC0000064L) #endif #ifndef STATUS_GROUP_EXISTS # define STATUS_GROUP_EXISTS ((NTSTATUS) 0xC0000065L) #endif #ifndef STATUS_NO_SUCH_GROUP # define STATUS_NO_SUCH_GROUP ((NTSTATUS) 0xC0000066L) #endif #ifndef STATUS_MEMBER_IN_GROUP # define STATUS_MEMBER_IN_GROUP ((NTSTATUS) 0xC0000067L) #endif #ifndef STATUS_MEMBER_NOT_IN_GROUP # define STATUS_MEMBER_NOT_IN_GROUP ((NTSTATUS) 0xC0000068L) #endif #ifndef STATUS_LAST_ADMIN # define STATUS_LAST_ADMIN ((NTSTATUS) 0xC0000069L) #endif #ifndef STATUS_WRONG_PASSWORD # define STATUS_WRONG_PASSWORD ((NTSTATUS) 0xC000006AL) #endif #ifndef STATUS_ILL_FORMED_PASSWORD # define STATUS_ILL_FORMED_PASSWORD ((NTSTATUS) 0xC000006BL) #endif #ifndef STATUS_PASSWORD_RESTRICTION # define STATUS_PASSWORD_RESTRICTION ((NTSTATUS) 0xC000006CL) #endif #ifndef STATUS_LOGON_FAILURE # define STATUS_LOGON_FAILURE ((NTSTATUS) 0xC000006DL) #endif #ifndef STATUS_ACCOUNT_RESTRICTION # define STATUS_ACCOUNT_RESTRICTION ((NTSTATUS) 0xC000006EL) #endif #ifndef STATUS_INVALID_LOGON_HOURS # define STATUS_INVALID_LOGON_HOURS ((NTSTATUS) 0xC000006FL) #endif #ifndef STATUS_INVALID_WORKSTATION # define STATUS_INVALID_WORKSTATION ((NTSTATUS) 0xC0000070L) #endif #ifndef STATUS_PASSWORD_EXPIRED # define STATUS_PASSWORD_EXPIRED ((NTSTATUS) 0xC0000071L) #endif #ifndef STATUS_ACCOUNT_DISABLED # define STATUS_ACCOUNT_DISABLED ((NTSTATUS) 0xC0000072L) #endif #ifndef STATUS_NONE_MAPPED # define STATUS_NONE_MAPPED ((NTSTATUS) 0xC0000073L) #endif #ifndef STATUS_TOO_MANY_LUIDS_REQUESTED # define STATUS_TOO_MANY_LUIDS_REQUESTED ((NTSTATUS) 0xC0000074L) #endif #ifndef STATUS_LUIDS_EXHAUSTED # define STATUS_LUIDS_EXHAUSTED ((NTSTATUS) 0xC0000075L) #endif #ifndef STATUS_INVALID_SUB_AUTHORITY # define STATUS_INVALID_SUB_AUTHORITY ((NTSTATUS) 0xC0000076L) #endif #ifndef STATUS_INVALID_ACL # define STATUS_INVALID_ACL ((NTSTATUS) 0xC0000077L) #endif #ifndef STATUS_INVALID_SID # define STATUS_INVALID_SID ((NTSTATUS) 0xC0000078L) #endif #ifndef STATUS_INVALID_SECURITY_DESCR # define STATUS_INVALID_SECURITY_DESCR ((NTSTATUS) 0xC0000079L) #endif #ifndef STATUS_PROCEDURE_NOT_FOUND # define STATUS_PROCEDURE_NOT_FOUND ((NTSTATUS) 0xC000007AL) #endif #ifndef STATUS_INVALID_IMAGE_FORMAT # define STATUS_INVALID_IMAGE_FORMAT ((NTSTATUS) 0xC000007BL) #endif #ifndef STATUS_NO_TOKEN # define STATUS_NO_TOKEN ((NTSTATUS) 0xC000007CL) #endif #ifndef STATUS_BAD_INHERITANCE_ACL # define STATUS_BAD_INHERITANCE_ACL ((NTSTATUS) 0xC000007DL) #endif #ifndef STATUS_RANGE_NOT_LOCKED # define STATUS_RANGE_NOT_LOCKED ((NTSTATUS) 0xC000007EL) #endif #ifndef STATUS_DISK_FULL # define STATUS_DISK_FULL ((NTSTATUS) 0xC000007FL) #endif #ifndef STATUS_SERVER_DISABLED # define STATUS_SERVER_DISABLED ((NTSTATUS) 0xC0000080L) #endif #ifndef STATUS_SERVER_NOT_DISABLED # define STATUS_SERVER_NOT_DISABLED ((NTSTATUS) 0xC0000081L) #endif #ifndef STATUS_TOO_MANY_GUIDS_REQUESTED # define STATUS_TOO_MANY_GUIDS_REQUESTED ((NTSTATUS) 0xC0000082L) #endif #ifndef STATUS_GUIDS_EXHAUSTED # define STATUS_GUIDS_EXHAUSTED ((NTSTATUS) 0xC0000083L) #endif #ifndef STATUS_INVALID_ID_AUTHORITY # define STATUS_INVALID_ID_AUTHORITY ((NTSTATUS) 0xC0000084L) #endif #ifndef STATUS_AGENTS_EXHAUSTED # define STATUS_AGENTS_EXHAUSTED ((NTSTATUS) 0xC0000085L) #endif #ifndef STATUS_INVALID_VOLUME_LABEL # define STATUS_INVALID_VOLUME_LABEL ((NTSTATUS) 0xC0000086L) #endif #ifndef STATUS_SECTION_NOT_EXTENDED # define STATUS_SECTION_NOT_EXTENDED ((NTSTATUS) 0xC0000087L) #endif #ifndef STATUS_NOT_MAPPED_DATA # define STATUS_NOT_MAPPED_DATA ((NTSTATUS) 0xC0000088L) #endif #ifndef STATUS_RESOURCE_DATA_NOT_FOUND # define STATUS_RESOURCE_DATA_NOT_FOUND ((NTSTATUS) 0xC0000089L) #endif #ifndef STATUS_RESOURCE_TYPE_NOT_FOUND # define STATUS_RESOURCE_TYPE_NOT_FOUND ((NTSTATUS) 0xC000008AL) #endif #ifndef STATUS_RESOURCE_NAME_NOT_FOUND # define STATUS_RESOURCE_NAME_NOT_FOUND ((NTSTATUS) 0xC000008BL) #endif #ifndef STATUS_ARRAY_BOUNDS_EXCEEDED # define STATUS_ARRAY_BOUNDS_EXCEEDED ((NTSTATUS) 0xC000008CL) #endif #ifndef STATUS_FLOAT_DENORMAL_OPERAND # define STATUS_FLOAT_DENORMAL_OPERAND ((NTSTATUS) 0xC000008DL) #endif #ifndef STATUS_FLOAT_DIVIDE_BY_ZERO # define STATUS_FLOAT_DIVIDE_BY_ZERO ((NTSTATUS) 0xC000008EL) #endif #ifndef STATUS_FLOAT_INEXACT_RESULT # define STATUS_FLOAT_INEXACT_RESULT ((NTSTATUS) 0xC000008FL) #endif #ifndef STATUS_FLOAT_INVALID_OPERATION # define STATUS_FLOAT_INVALID_OPERATION ((NTSTATUS) 0xC0000090L) #endif #ifndef STATUS_FLOAT_OVERFLOW # define STATUS_FLOAT_OVERFLOW ((NTSTATUS) 0xC0000091L) #endif #ifndef STATUS_FLOAT_STACK_CHECK # define STATUS_FLOAT_STACK_CHECK ((NTSTATUS) 0xC0000092L) #endif #ifndef STATUS_FLOAT_UNDERFLOW # define STATUS_FLOAT_UNDERFLOW ((NTSTATUS) 0xC0000093L) #endif #ifndef STATUS_INTEGER_DIVIDE_BY_ZERO # define STATUS_INTEGER_DIVIDE_BY_ZERO ((NTSTATUS) 0xC0000094L) #endif #ifndef STATUS_INTEGER_OVERFLOW # define STATUS_INTEGER_OVERFLOW ((NTSTATUS) 0xC0000095L) #endif #ifndef STATUS_PRIVILEGED_INSTRUCTION # define STATUS_PRIVILEGED_INSTRUCTION ((NTSTATUS) 0xC0000096L) #endif #ifndef STATUS_TOO_MANY_PAGING_FILES # define STATUS_TOO_MANY_PAGING_FILES ((NTSTATUS) 0xC0000097L) #endif #ifndef STATUS_FILE_INVALID # define STATUS_FILE_INVALID ((NTSTATUS) 0xC0000098L) #endif #ifndef STATUS_ALLOTTED_SPACE_EXCEEDED # define STATUS_ALLOTTED_SPACE_EXCEEDED ((NTSTATUS) 0xC0000099L) #endif #ifndef STATUS_INSUFFICIENT_RESOURCES # define STATUS_INSUFFICIENT_RESOURCES ((NTSTATUS) 0xC000009AL) #endif #ifndef STATUS_DFS_EXIT_PATH_FOUND # define STATUS_DFS_EXIT_PATH_FOUND ((NTSTATUS) 0xC000009BL) #endif #ifndef STATUS_DEVICE_DATA_ERROR # define STATUS_DEVICE_DATA_ERROR ((NTSTATUS) 0xC000009CL) #endif #ifndef STATUS_DEVICE_NOT_CONNECTED # define STATUS_DEVICE_NOT_CONNECTED ((NTSTATUS) 0xC000009DL) #endif #ifndef STATUS_DEVICE_POWER_FAILURE # define STATUS_DEVICE_POWER_FAILURE ((NTSTATUS) 0xC000009EL) #endif #ifndef STATUS_FREE_VM_NOT_AT_BASE # define STATUS_FREE_VM_NOT_AT_BASE ((NTSTATUS) 0xC000009FL) #endif #ifndef STATUS_MEMORY_NOT_ALLOCATED # define STATUS_MEMORY_NOT_ALLOCATED ((NTSTATUS) 0xC00000A0L) #endif #ifndef STATUS_WORKING_SET_QUOTA # define STATUS_WORKING_SET_QUOTA ((NTSTATUS) 0xC00000A1L) #endif #ifndef STATUS_MEDIA_WRITE_PROTECTED # define STATUS_MEDIA_WRITE_PROTECTED ((NTSTATUS) 0xC00000A2L) #endif #ifndef STATUS_DEVICE_NOT_READY # define STATUS_DEVICE_NOT_READY ((NTSTATUS) 0xC00000A3L) #endif #ifndef STATUS_INVALID_GROUP_ATTRIBUTES # define STATUS_INVALID_GROUP_ATTRIBUTES ((NTSTATUS) 0xC00000A4L) #endif #ifndef STATUS_BAD_IMPERSONATION_LEVEL # define STATUS_BAD_IMPERSONATION_LEVEL ((NTSTATUS) 0xC00000A5L) #endif #ifndef STATUS_CANT_OPEN_ANONYMOUS # define STATUS_CANT_OPEN_ANONYMOUS ((NTSTATUS) 0xC00000A6L) #endif #ifndef STATUS_BAD_VALIDATION_CLASS # define STATUS_BAD_VALIDATION_CLASS ((NTSTATUS) 0xC00000A7L) #endif #ifndef STATUS_BAD_TOKEN_TYPE # define STATUS_BAD_TOKEN_TYPE ((NTSTATUS) 0xC00000A8L) #endif #ifndef STATUS_BAD_MASTER_BOOT_RECORD # define STATUS_BAD_MASTER_BOOT_RECORD ((NTSTATUS) 0xC00000A9L) #endif #ifndef STATUS_INSTRUCTION_MISALIGNMENT # define STATUS_INSTRUCTION_MISALIGNMENT ((NTSTATUS) 0xC00000AAL) #endif #ifndef STATUS_INSTANCE_NOT_AVAILABLE # define STATUS_INSTANCE_NOT_AVAILABLE ((NTSTATUS) 0xC00000ABL) #endif #ifndef STATUS_PIPE_NOT_AVAILABLE # define STATUS_PIPE_NOT_AVAILABLE ((NTSTATUS) 0xC00000ACL) #endif #ifndef STATUS_INVALID_PIPE_STATE # define STATUS_INVALID_PIPE_STATE ((NTSTATUS) 0xC00000ADL) #endif #ifndef STATUS_PIPE_BUSY # define STATUS_PIPE_BUSY ((NTSTATUS) 0xC00000AEL) #endif #ifndef STATUS_ILLEGAL_FUNCTION # define STATUS_ILLEGAL_FUNCTION ((NTSTATUS) 0xC00000AFL) #endif #ifndef STATUS_PIPE_DISCONNECTED # define STATUS_PIPE_DISCONNECTED ((NTSTATUS) 0xC00000B0L) #endif #ifndef STATUS_PIPE_CLOSING # define STATUS_PIPE_CLOSING ((NTSTATUS) 0xC00000B1L) #endif #ifndef STATUS_PIPE_CONNECTED # define STATUS_PIPE_CONNECTED ((NTSTATUS) 0xC00000B2L) #endif #ifndef STATUS_PIPE_LISTENING # define STATUS_PIPE_LISTENING ((NTSTATUS) 0xC00000B3L) #endif #ifndef STATUS_INVALID_READ_MODE # define STATUS_INVALID_READ_MODE ((NTSTATUS) 0xC00000B4L) #endif #ifndef STATUS_IO_TIMEOUT # define STATUS_IO_TIMEOUT ((NTSTATUS) 0xC00000B5L) #endif #ifndef STATUS_FILE_FORCED_CLOSED # define STATUS_FILE_FORCED_CLOSED ((NTSTATUS) 0xC00000B6L) #endif #ifndef STATUS_PROFILING_NOT_STARTED # define STATUS_PROFILING_NOT_STARTED ((NTSTATUS) 0xC00000B7L) #endif #ifndef STATUS_PROFILING_NOT_STOPPED # define STATUS_PROFILING_NOT_STOPPED ((NTSTATUS) 0xC00000B8L) #endif #ifndef STATUS_COULD_NOT_INTERPRET # define STATUS_COULD_NOT_INTERPRET ((NTSTATUS) 0xC00000B9L) #endif #ifndef STATUS_FILE_IS_A_DIRECTORY # define STATUS_FILE_IS_A_DIRECTORY ((NTSTATUS) 0xC00000BAL) #endif #ifndef STATUS_NOT_SUPPORTED # define STATUS_NOT_SUPPORTED ((NTSTATUS) 0xC00000BBL) #endif #ifndef STATUS_REMOTE_NOT_LISTENING # define STATUS_REMOTE_NOT_LISTENING ((NTSTATUS) 0xC00000BCL) #endif #ifndef STATUS_DUPLICATE_NAME # define STATUS_DUPLICATE_NAME ((NTSTATUS) 0xC00000BDL) #endif #ifndef STATUS_BAD_NETWORK_PATH # define STATUS_BAD_NETWORK_PATH ((NTSTATUS) 0xC00000BEL) #endif #ifndef STATUS_NETWORK_BUSY # define STATUS_NETWORK_BUSY ((NTSTATUS) 0xC00000BFL) #endif #ifndef STATUS_DEVICE_DOES_NOT_EXIST # define STATUS_DEVICE_DOES_NOT_EXIST ((NTSTATUS) 0xC00000C0L) #endif #ifndef STATUS_TOO_MANY_COMMANDS # define STATUS_TOO_MANY_COMMANDS ((NTSTATUS) 0xC00000C1L) #endif #ifndef STATUS_ADAPTER_HARDWARE_ERROR # define STATUS_ADAPTER_HARDWARE_ERROR ((NTSTATUS) 0xC00000C2L) #endif #ifndef STATUS_INVALID_NETWORK_RESPONSE # define STATUS_INVALID_NETWORK_RESPONSE ((NTSTATUS) 0xC00000C3L) #endif #ifndef STATUS_UNEXPECTED_NETWORK_ERROR # define STATUS_UNEXPECTED_NETWORK_ERROR ((NTSTATUS) 0xC00000C4L) #endif #ifndef STATUS_BAD_REMOTE_ADAPTER # define STATUS_BAD_REMOTE_ADAPTER ((NTSTATUS) 0xC00000C5L) #endif #ifndef STATUS_PRINT_QUEUE_FULL # define STATUS_PRINT_QUEUE_FULL ((NTSTATUS) 0xC00000C6L) #endif #ifndef STATUS_NO_SPOOL_SPACE # define STATUS_NO_SPOOL_SPACE ((NTSTATUS) 0xC00000C7L) #endif #ifndef STATUS_PRINT_CANCELLED # define STATUS_PRINT_CANCELLED ((NTSTATUS) 0xC00000C8L) #endif #ifndef STATUS_NETWORK_NAME_DELETED # define STATUS_NETWORK_NAME_DELETED ((NTSTATUS) 0xC00000C9L) #endif #ifndef STATUS_NETWORK_ACCESS_DENIED # define STATUS_NETWORK_ACCESS_DENIED ((NTSTATUS) 0xC00000CAL) #endif #ifndef STATUS_BAD_DEVICE_TYPE # define STATUS_BAD_DEVICE_TYPE ((NTSTATUS) 0xC00000CBL) #endif #ifndef STATUS_BAD_NETWORK_NAME # define STATUS_BAD_NETWORK_NAME ((NTSTATUS) 0xC00000CCL) #endif #ifndef STATUS_TOO_MANY_NAMES # define STATUS_TOO_MANY_NAMES ((NTSTATUS) 0xC00000CDL) #endif #ifndef STATUS_TOO_MANY_SESSIONS # define STATUS_TOO_MANY_SESSIONS ((NTSTATUS) 0xC00000CEL) #endif #ifndef STATUS_SHARING_PAUSED # define STATUS_SHARING_PAUSED ((NTSTATUS) 0xC00000CFL) #endif #ifndef STATUS_REQUEST_NOT_ACCEPTED # define STATUS_REQUEST_NOT_ACCEPTED ((NTSTATUS) 0xC00000D0L) #endif #ifndef STATUS_REDIRECTOR_PAUSED # define STATUS_REDIRECTOR_PAUSED ((NTSTATUS) 0xC00000D1L) #endif #ifndef STATUS_NET_WRITE_FAULT # define STATUS_NET_WRITE_FAULT ((NTSTATUS) 0xC00000D2L) #endif #ifndef STATUS_PROFILING_AT_LIMIT # define STATUS_PROFILING_AT_LIMIT ((NTSTATUS) 0xC00000D3L) #endif #ifndef STATUS_NOT_SAME_DEVICE # define STATUS_NOT_SAME_DEVICE ((NTSTATUS) 0xC00000D4L) #endif #ifndef STATUS_FILE_RENAMED # define STATUS_FILE_RENAMED ((NTSTATUS) 0xC00000D5L) #endif #ifndef STATUS_VIRTUAL_CIRCUIT_CLOSED # define STATUS_VIRTUAL_CIRCUIT_CLOSED ((NTSTATUS) 0xC00000D6L) #endif #ifndef STATUS_NO_SECURITY_ON_OBJECT # define STATUS_NO_SECURITY_ON_OBJECT ((NTSTATUS) 0xC00000D7L) #endif #ifndef STATUS_CANT_WAIT # define STATUS_CANT_WAIT ((NTSTATUS) 0xC00000D8L) #endif #ifndef STATUS_PIPE_EMPTY # define STATUS_PIPE_EMPTY ((NTSTATUS) 0xC00000D9L) #endif #ifndef STATUS_CANT_ACCESS_DOMAIN_INFO # define STATUS_CANT_ACCESS_DOMAIN_INFO ((NTSTATUS) 0xC00000DAL) #endif #ifndef STATUS_CANT_TERMINATE_SELF # define STATUS_CANT_TERMINATE_SELF ((NTSTATUS) 0xC00000DBL) #endif #ifndef STATUS_INVALID_SERVER_STATE # define STATUS_INVALID_SERVER_STATE ((NTSTATUS) 0xC00000DCL) #endif #ifndef STATUS_INVALID_DOMAIN_STATE # define STATUS_INVALID_DOMAIN_STATE ((NTSTATUS) 0xC00000DDL) #endif #ifndef STATUS_INVALID_DOMAIN_ROLE # define STATUS_INVALID_DOMAIN_ROLE ((NTSTATUS) 0xC00000DEL) #endif #ifndef STATUS_NO_SUCH_DOMAIN # define STATUS_NO_SUCH_DOMAIN ((NTSTATUS) 0xC00000DFL) #endif #ifndef STATUS_DOMAIN_EXISTS # define STATUS_DOMAIN_EXISTS ((NTSTATUS) 0xC00000E0L) #endif #ifndef STATUS_DOMAIN_LIMIT_EXCEEDED # define STATUS_DOMAIN_LIMIT_EXCEEDED ((NTSTATUS) 0xC00000E1L) #endif #ifndef STATUS_OPLOCK_NOT_GRANTED # define STATUS_OPLOCK_NOT_GRANTED ((NTSTATUS) 0xC00000E2L) #endif #ifndef STATUS_INVALID_OPLOCK_PROTOCOL # define STATUS_INVALID_OPLOCK_PROTOCOL ((NTSTATUS) 0xC00000E3L) #endif #ifndef STATUS_INTERNAL_DB_CORRUPTION # define STATUS_INTERNAL_DB_CORRUPTION ((NTSTATUS) 0xC00000E4L) #endif #ifndef STATUS_INTERNAL_ERROR # define STATUS_INTERNAL_ERROR ((NTSTATUS) 0xC00000E5L) #endif #ifndef STATUS_GENERIC_NOT_MAPPED # define STATUS_GENERIC_NOT_MAPPED ((NTSTATUS) 0xC00000E6L) #endif #ifndef STATUS_BAD_DESCRIPTOR_FORMAT # define STATUS_BAD_DESCRIPTOR_FORMAT ((NTSTATUS) 0xC00000E7L) #endif #ifndef STATUS_INVALID_USER_BUFFER # define STATUS_INVALID_USER_BUFFER ((NTSTATUS) 0xC00000E8L) #endif #ifndef STATUS_UNEXPECTED_IO_ERROR # define STATUS_UNEXPECTED_IO_ERROR ((NTSTATUS) 0xC00000E9L) #endif #ifndef STATUS_UNEXPECTED_MM_CREATE_ERR # define STATUS_UNEXPECTED_MM_CREATE_ERR ((NTSTATUS) 0xC00000EAL) #endif #ifndef STATUS_UNEXPECTED_MM_MAP_ERROR # define STATUS_UNEXPECTED_MM_MAP_ERROR ((NTSTATUS) 0xC00000EBL) #endif #ifndef STATUS_UNEXPECTED_MM_EXTEND_ERR # define STATUS_UNEXPECTED_MM_EXTEND_ERR ((NTSTATUS) 0xC00000ECL) #endif #ifndef STATUS_NOT_LOGON_PROCESS # define STATUS_NOT_LOGON_PROCESS ((NTSTATUS) 0xC00000EDL) #endif #ifndef STATUS_LOGON_SESSION_EXISTS # define STATUS_LOGON_SESSION_EXISTS ((NTSTATUS) 0xC00000EEL) #endif #ifndef STATUS_INVALID_PARAMETER_1 # define STATUS_INVALID_PARAMETER_1 ((NTSTATUS) 0xC00000EFL) #endif #ifndef STATUS_INVALID_PARAMETER_2 # define STATUS_INVALID_PARAMETER_2 ((NTSTATUS) 0xC00000F0L) #endif #ifndef STATUS_INVALID_PARAMETER_3 # define STATUS_INVALID_PARAMETER_3 ((NTSTATUS) 0xC00000F1L) #endif #ifndef STATUS_INVALID_PARAMETER_4 # define STATUS_INVALID_PARAMETER_4 ((NTSTATUS) 0xC00000F2L) #endif #ifndef STATUS_INVALID_PARAMETER_5 # define STATUS_INVALID_PARAMETER_5 ((NTSTATUS) 0xC00000F3L) #endif #ifndef STATUS_INVALID_PARAMETER_6 # define STATUS_INVALID_PARAMETER_6 ((NTSTATUS) 0xC00000F4L) #endif #ifndef STATUS_INVALID_PARAMETER_7 # define STATUS_INVALID_PARAMETER_7 ((NTSTATUS) 0xC00000F5L) #endif #ifndef STATUS_INVALID_PARAMETER_8 # define STATUS_INVALID_PARAMETER_8 ((NTSTATUS) 0xC00000F6L) #endif #ifndef STATUS_INVALID_PARAMETER_9 # define STATUS_INVALID_PARAMETER_9 ((NTSTATUS) 0xC00000F7L) #endif #ifndef STATUS_INVALID_PARAMETER_10 # define STATUS_INVALID_PARAMETER_10 ((NTSTATUS) 0xC00000F8L) #endif #ifndef STATUS_INVALID_PARAMETER_11 # define STATUS_INVALID_PARAMETER_11 ((NTSTATUS) 0xC00000F9L) #endif #ifndef STATUS_INVALID_PARAMETER_12 # define STATUS_INVALID_PARAMETER_12 ((NTSTATUS) 0xC00000FAL) #endif #ifndef STATUS_REDIRECTOR_NOT_STARTED # define STATUS_REDIRECTOR_NOT_STARTED ((NTSTATUS) 0xC00000FBL) #endif #ifndef STATUS_REDIRECTOR_STARTED # define STATUS_REDIRECTOR_STARTED ((NTSTATUS) 0xC00000FCL) #endif #ifndef STATUS_STACK_OVERFLOW # define STATUS_STACK_OVERFLOW ((NTSTATUS) 0xC00000FDL) #endif #ifndef STATUS_NO_SUCH_PACKAGE # define STATUS_NO_SUCH_PACKAGE ((NTSTATUS) 0xC00000FEL) #endif #ifndef STATUS_BAD_FUNCTION_TABLE # define STATUS_BAD_FUNCTION_TABLE ((NTSTATUS) 0xC00000FFL) #endif #ifndef STATUS_VARIABLE_NOT_FOUND # define STATUS_VARIABLE_NOT_FOUND ((NTSTATUS) 0xC0000100L) #endif #ifndef STATUS_DIRECTORY_NOT_EMPTY # define STATUS_DIRECTORY_NOT_EMPTY ((NTSTATUS) 0xC0000101L) #endif #ifndef STATUS_FILE_CORRUPT_ERROR # define STATUS_FILE_CORRUPT_ERROR ((NTSTATUS) 0xC0000102L) #endif #ifndef STATUS_NOT_A_DIRECTORY # define STATUS_NOT_A_DIRECTORY ((NTSTATUS) 0xC0000103L) #endif #ifndef STATUS_BAD_LOGON_SESSION_STATE # define STATUS_BAD_LOGON_SESSION_STATE ((NTSTATUS) 0xC0000104L) #endif #ifndef STATUS_LOGON_SESSION_COLLISION # define STATUS_LOGON_SESSION_COLLISION ((NTSTATUS) 0xC0000105L) #endif #ifndef STATUS_NAME_TOO_LONG # define STATUS_NAME_TOO_LONG ((NTSTATUS) 0xC0000106L) #endif #ifndef STATUS_FILES_OPEN # define STATUS_FILES_OPEN ((NTSTATUS) 0xC0000107L) #endif #ifndef STATUS_CONNECTION_IN_USE # define STATUS_CONNECTION_IN_USE ((NTSTATUS) 0xC0000108L) #endif #ifndef STATUS_MESSAGE_NOT_FOUND # define STATUS_MESSAGE_NOT_FOUND ((NTSTATUS) 0xC0000109L) #endif #ifndef STATUS_PROCESS_IS_TERMINATING # define STATUS_PROCESS_IS_TERMINATING ((NTSTATUS) 0xC000010AL) #endif #ifndef STATUS_INVALID_LOGON_TYPE # define STATUS_INVALID_LOGON_TYPE ((NTSTATUS) 0xC000010BL) #endif #ifndef STATUS_NO_GUID_TRANSLATION # define STATUS_NO_GUID_TRANSLATION ((NTSTATUS) 0xC000010CL) #endif #ifndef STATUS_CANNOT_IMPERSONATE # define STATUS_CANNOT_IMPERSONATE ((NTSTATUS) 0xC000010DL) #endif #ifndef STATUS_IMAGE_ALREADY_LOADED # define STATUS_IMAGE_ALREADY_LOADED ((NTSTATUS) 0xC000010EL) #endif #ifndef STATUS_ABIOS_NOT_PRESENT # define STATUS_ABIOS_NOT_PRESENT ((NTSTATUS) 0xC000010FL) #endif #ifndef STATUS_ABIOS_LID_NOT_EXIST # define STATUS_ABIOS_LID_NOT_EXIST ((NTSTATUS) 0xC0000110L) #endif #ifndef STATUS_ABIOS_LID_ALREADY_OWNED # define STATUS_ABIOS_LID_ALREADY_OWNED ((NTSTATUS) 0xC0000111L) #endif #ifndef STATUS_ABIOS_NOT_LID_OWNER # define STATUS_ABIOS_NOT_LID_OWNER ((NTSTATUS) 0xC0000112L) #endif #ifndef STATUS_ABIOS_INVALID_COMMAND # define STATUS_ABIOS_INVALID_COMMAND ((NTSTATUS) 0xC0000113L) #endif #ifndef STATUS_ABIOS_INVALID_LID # define STATUS_ABIOS_INVALID_LID ((NTSTATUS) 0xC0000114L) #endif #ifndef STATUS_ABIOS_SELECTOR_NOT_AVAILABLE # define STATUS_ABIOS_SELECTOR_NOT_AVAILABLE ((NTSTATUS) 0xC0000115L) #endif #ifndef STATUS_ABIOS_INVALID_SELECTOR # define STATUS_ABIOS_INVALID_SELECTOR ((NTSTATUS) 0xC0000116L) #endif #ifndef STATUS_NO_LDT # define STATUS_NO_LDT ((NTSTATUS) 0xC0000117L) #endif #ifndef STATUS_INVALID_LDT_SIZE # define STATUS_INVALID_LDT_SIZE ((NTSTATUS) 0xC0000118L) #endif #ifndef STATUS_INVALID_LDT_OFFSET # define STATUS_INVALID_LDT_OFFSET ((NTSTATUS) 0xC0000119L) #endif #ifndef STATUS_INVALID_LDT_DESCRIPTOR # define STATUS_INVALID_LDT_DESCRIPTOR ((NTSTATUS) 0xC000011AL) #endif #ifndef STATUS_INVALID_IMAGE_NE_FORMAT # define STATUS_INVALID_IMAGE_NE_FORMAT ((NTSTATUS) 0xC000011BL) #endif #ifndef STATUS_RXACT_INVALID_STATE # define STATUS_RXACT_INVALID_STATE ((NTSTATUS) 0xC000011CL) #endif #ifndef STATUS_RXACT_COMMIT_FAILURE # define STATUS_RXACT_COMMIT_FAILURE ((NTSTATUS) 0xC000011DL) #endif #ifndef STATUS_MAPPED_FILE_SIZE_ZERO # define STATUS_MAPPED_FILE_SIZE_ZERO ((NTSTATUS) 0xC000011EL) #endif #ifndef STATUS_TOO_MANY_OPENED_FILES # define STATUS_TOO_MANY_OPENED_FILES ((NTSTATUS) 0xC000011FL) #endif #ifndef STATUS_CANCELLED # define STATUS_CANCELLED ((NTSTATUS) 0xC0000120L) #endif #ifndef STATUS_CANNOT_DELETE # define STATUS_CANNOT_DELETE ((NTSTATUS) 0xC0000121L) #endif #ifndef STATUS_INVALID_COMPUTER_NAME # define STATUS_INVALID_COMPUTER_NAME ((NTSTATUS) 0xC0000122L) #endif #ifndef STATUS_FILE_DELETED # define STATUS_FILE_DELETED ((NTSTATUS) 0xC0000123L) #endif #ifndef STATUS_SPECIAL_ACCOUNT # define STATUS_SPECIAL_ACCOUNT ((NTSTATUS) 0xC0000124L) #endif #ifndef STATUS_SPECIAL_GROUP # define STATUS_SPECIAL_GROUP ((NTSTATUS) 0xC0000125L) #endif #ifndef STATUS_SPECIAL_USER # define STATUS_SPECIAL_USER ((NTSTATUS) 0xC0000126L) #endif #ifndef STATUS_MEMBERS_PRIMARY_GROUP # define STATUS_MEMBERS_PRIMARY_GROUP ((NTSTATUS) 0xC0000127L) #endif #ifndef STATUS_FILE_CLOSED # define STATUS_FILE_CLOSED ((NTSTATUS) 0xC0000128L) #endif #ifndef STATUS_TOO_MANY_THREADS # define STATUS_TOO_MANY_THREADS ((NTSTATUS) 0xC0000129L) #endif #ifndef STATUS_THREAD_NOT_IN_PROCESS # define STATUS_THREAD_NOT_IN_PROCESS ((NTSTATUS) 0xC000012AL) #endif #ifndef STATUS_TOKEN_ALREADY_IN_USE # define STATUS_TOKEN_ALREADY_IN_USE ((NTSTATUS) 0xC000012BL) #endif #ifndef STATUS_PAGEFILE_QUOTA_EXCEEDED # define STATUS_PAGEFILE_QUOTA_EXCEEDED ((NTSTATUS) 0xC000012CL) #endif #ifndef STATUS_COMMITMENT_LIMIT # define STATUS_COMMITMENT_LIMIT ((NTSTATUS) 0xC000012DL) #endif #ifndef STATUS_INVALID_IMAGE_LE_FORMAT # define STATUS_INVALID_IMAGE_LE_FORMAT ((NTSTATUS) 0xC000012EL) #endif #ifndef STATUS_INVALID_IMAGE_NOT_MZ # define STATUS_INVALID_IMAGE_NOT_MZ ((NTSTATUS) 0xC000012FL) #endif #ifndef STATUS_INVALID_IMAGE_PROTECT # define STATUS_INVALID_IMAGE_PROTECT ((NTSTATUS) 0xC0000130L) #endif #ifndef STATUS_INVALID_IMAGE_WIN_16 # define STATUS_INVALID_IMAGE_WIN_16 ((NTSTATUS) 0xC0000131L) #endif #ifndef STATUS_LOGON_SERVER_CONFLICT # define STATUS_LOGON_SERVER_CONFLICT ((NTSTATUS) 0xC0000132L) #endif #ifndef STATUS_TIME_DIFFERENCE_AT_DC # define STATUS_TIME_DIFFERENCE_AT_DC ((NTSTATUS) 0xC0000133L) #endif #ifndef STATUS_SYNCHRONIZATION_REQUIRED # define STATUS_SYNCHRONIZATION_REQUIRED ((NTSTATUS) 0xC0000134L) #endif #ifndef STATUS_DLL_NOT_FOUND # define STATUS_DLL_NOT_FOUND ((NTSTATUS) 0xC0000135L) #endif #ifndef STATUS_OPEN_FAILED # define STATUS_OPEN_FAILED ((NTSTATUS) 0xC0000136L) #endif #ifndef STATUS_IO_PRIVILEGE_FAILED # define STATUS_IO_PRIVILEGE_FAILED ((NTSTATUS) 0xC0000137L) #endif #ifndef STATUS_ORDINAL_NOT_FOUND # define STATUS_ORDINAL_NOT_FOUND ((NTSTATUS) 0xC0000138L) #endif #ifndef STATUS_ENTRYPOINT_NOT_FOUND # define STATUS_ENTRYPOINT_NOT_FOUND ((NTSTATUS) 0xC0000139L) #endif #ifndef STATUS_CONTROL_C_EXIT # define STATUS_CONTROL_C_EXIT ((NTSTATUS) 0xC000013AL) #endif #ifndef STATUS_LOCAL_DISCONNECT # define STATUS_LOCAL_DISCONNECT ((NTSTATUS) 0xC000013BL) #endif #ifndef STATUS_REMOTE_DISCONNECT # define STATUS_REMOTE_DISCONNECT ((NTSTATUS) 0xC000013CL) #endif #ifndef STATUS_REMOTE_RESOURCES # define STATUS_REMOTE_RESOURCES ((NTSTATUS) 0xC000013DL) #endif #ifndef STATUS_LINK_FAILED # define STATUS_LINK_FAILED ((NTSTATUS) 0xC000013EL) #endif #ifndef STATUS_LINK_TIMEOUT # define STATUS_LINK_TIMEOUT ((NTSTATUS) 0xC000013FL) #endif #ifndef STATUS_INVALID_CONNECTION # define STATUS_INVALID_CONNECTION ((NTSTATUS) 0xC0000140L) #endif #ifndef STATUS_INVALID_ADDRESS # define STATUS_INVALID_ADDRESS ((NTSTATUS) 0xC0000141L) #endif #ifndef STATUS_DLL_INIT_FAILED # define STATUS_DLL_INIT_FAILED ((NTSTATUS) 0xC0000142L) #endif #ifndef STATUS_MISSING_SYSTEMFILE # define STATUS_MISSING_SYSTEMFILE ((NTSTATUS) 0xC0000143L) #endif #ifndef STATUS_UNHANDLED_EXCEPTION # define STATUS_UNHANDLED_EXCEPTION ((NTSTATUS) 0xC0000144L) #endif #ifndef STATUS_APP_INIT_FAILURE # define STATUS_APP_INIT_FAILURE ((NTSTATUS) 0xC0000145L) #endif #ifndef STATUS_PAGEFILE_CREATE_FAILED # define STATUS_PAGEFILE_CREATE_FAILED ((NTSTATUS) 0xC0000146L) #endif #ifndef STATUS_NO_PAGEFILE # define STATUS_NO_PAGEFILE ((NTSTATUS) 0xC0000147L) #endif #ifndef STATUS_INVALID_LEVEL # define STATUS_INVALID_LEVEL ((NTSTATUS) 0xC0000148L) #endif #ifndef STATUS_WRONG_PASSWORD_CORE # define STATUS_WRONG_PASSWORD_CORE ((NTSTATUS) 0xC0000149L) #endif #ifndef STATUS_ILLEGAL_FLOAT_CONTEXT # define STATUS_ILLEGAL_FLOAT_CONTEXT ((NTSTATUS) 0xC000014AL) #endif #ifndef STATUS_PIPE_BROKEN # define STATUS_PIPE_BROKEN ((NTSTATUS) 0xC000014BL) #endif #ifndef STATUS_REGISTRY_CORRUPT # define STATUS_REGISTRY_CORRUPT ((NTSTATUS) 0xC000014CL) #endif #ifndef STATUS_REGISTRY_IO_FAILED # define STATUS_REGISTRY_IO_FAILED ((NTSTATUS) 0xC000014DL) #endif #ifndef STATUS_NO_EVENT_PAIR # define STATUS_NO_EVENT_PAIR ((NTSTATUS) 0xC000014EL) #endif #ifndef STATUS_UNRECOGNIZED_VOLUME # define STATUS_UNRECOGNIZED_VOLUME ((NTSTATUS) 0xC000014FL) #endif #ifndef STATUS_SERIAL_NO_DEVICE_INITED # define STATUS_SERIAL_NO_DEVICE_INITED ((NTSTATUS) 0xC0000150L) #endif #ifndef STATUS_NO_SUCH_ALIAS # define STATUS_NO_SUCH_ALIAS ((NTSTATUS) 0xC0000151L) #endif #ifndef STATUS_MEMBER_NOT_IN_ALIAS # define STATUS_MEMBER_NOT_IN_ALIAS ((NTSTATUS) 0xC0000152L) #endif #ifndef STATUS_MEMBER_IN_ALIAS # define STATUS_MEMBER_IN_ALIAS ((NTSTATUS) 0xC0000153L) #endif #ifndef STATUS_ALIAS_EXISTS # define STATUS_ALIAS_EXISTS ((NTSTATUS) 0xC0000154L) #endif #ifndef STATUS_LOGON_NOT_GRANTED # define STATUS_LOGON_NOT_GRANTED ((NTSTATUS) 0xC0000155L) #endif #ifndef STATUS_TOO_MANY_SECRETS # define STATUS_TOO_MANY_SECRETS ((NTSTATUS) 0xC0000156L) #endif #ifndef STATUS_SECRET_TOO_LONG # define STATUS_SECRET_TOO_LONG ((NTSTATUS) 0xC0000157L) #endif #ifndef STATUS_INTERNAL_DB_ERROR # define STATUS_INTERNAL_DB_ERROR ((NTSTATUS) 0xC0000158L) #endif #ifndef STATUS_FULLSCREEN_MODE # define STATUS_FULLSCREEN_MODE ((NTSTATUS) 0xC0000159L) #endif #ifndef STATUS_TOO_MANY_CONTEXT_IDS # define STATUS_TOO_MANY_CONTEXT_IDS ((NTSTATUS) 0xC000015AL) #endif #ifndef STATUS_LOGON_TYPE_NOT_GRANTED # define STATUS_LOGON_TYPE_NOT_GRANTED ((NTSTATUS) 0xC000015BL) #endif #ifndef STATUS_NOT_REGISTRY_FILE # define STATUS_NOT_REGISTRY_FILE ((NTSTATUS) 0xC000015CL) #endif #ifndef STATUS_NT_CROSS_ENCRYPTION_REQUIRED # define STATUS_NT_CROSS_ENCRYPTION_REQUIRED ((NTSTATUS) 0xC000015DL) #endif #ifndef STATUS_DOMAIN_CTRLR_CONFIG_ERROR # define STATUS_DOMAIN_CTRLR_CONFIG_ERROR ((NTSTATUS) 0xC000015EL) #endif #ifndef STATUS_FT_MISSING_MEMBER # define STATUS_FT_MISSING_MEMBER ((NTSTATUS) 0xC000015FL) #endif #ifndef STATUS_ILL_FORMED_SERVICE_ENTRY # define STATUS_ILL_FORMED_SERVICE_ENTRY ((NTSTATUS) 0xC0000160L) #endif #ifndef STATUS_ILLEGAL_CHARACTER # define STATUS_ILLEGAL_CHARACTER ((NTSTATUS) 0xC0000161L) #endif #ifndef STATUS_UNMAPPABLE_CHARACTER # define STATUS_UNMAPPABLE_CHARACTER ((NTSTATUS) 0xC0000162L) #endif #ifndef STATUS_UNDEFINED_CHARACTER # define STATUS_UNDEFINED_CHARACTER ((NTSTATUS) 0xC0000163L) #endif #ifndef STATUS_FLOPPY_VOLUME # define STATUS_FLOPPY_VOLUME ((NTSTATUS) 0xC0000164L) #endif #ifndef STATUS_FLOPPY_ID_MARK_NOT_FOUND # define STATUS_FLOPPY_ID_MARK_NOT_FOUND ((NTSTATUS) 0xC0000165L) #endif #ifndef STATUS_FLOPPY_WRONG_CYLINDER # define STATUS_FLOPPY_WRONG_CYLINDER ((NTSTATUS) 0xC0000166L) #endif #ifndef STATUS_FLOPPY_UNKNOWN_ERROR # define STATUS_FLOPPY_UNKNOWN_ERROR ((NTSTATUS) 0xC0000167L) #endif #ifndef STATUS_FLOPPY_BAD_REGISTERS # define STATUS_FLOPPY_BAD_REGISTERS ((NTSTATUS) 0xC0000168L) #endif #ifndef STATUS_DISK_RECALIBRATE_FAILED # define STATUS_DISK_RECALIBRATE_FAILED ((NTSTATUS) 0xC0000169L) #endif #ifndef STATUS_DISK_OPERATION_FAILED # define STATUS_DISK_OPERATION_FAILED ((NTSTATUS) 0xC000016AL) #endif #ifndef STATUS_DISK_RESET_FAILED # define STATUS_DISK_RESET_FAILED ((NTSTATUS) 0xC000016BL) #endif #ifndef STATUS_SHARED_IRQ_BUSY # define STATUS_SHARED_IRQ_BUSY ((NTSTATUS) 0xC000016CL) #endif #ifndef STATUS_FT_ORPHANING # define STATUS_FT_ORPHANING ((NTSTATUS) 0xC000016DL) #endif #ifndef STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT # define STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT ((NTSTATUS) 0xC000016EL) #endif #ifndef STATUS_PARTITION_FAILURE # define STATUS_PARTITION_FAILURE ((NTSTATUS) 0xC0000172L) #endif #ifndef STATUS_INVALID_BLOCK_LENGTH # define STATUS_INVALID_BLOCK_LENGTH ((NTSTATUS) 0xC0000173L) #endif #ifndef STATUS_DEVICE_NOT_PARTITIONED # define STATUS_DEVICE_NOT_PARTITIONED ((NTSTATUS) 0xC0000174L) #endif #ifndef STATUS_UNABLE_TO_LOCK_MEDIA # define STATUS_UNABLE_TO_LOCK_MEDIA ((NTSTATUS) 0xC0000175L) #endif #ifndef STATUS_UNABLE_TO_UNLOAD_MEDIA # define STATUS_UNABLE_TO_UNLOAD_MEDIA ((NTSTATUS) 0xC0000176L) #endif #ifndef STATUS_EOM_OVERFLOW # define STATUS_EOM_OVERFLOW ((NTSTATUS) 0xC0000177L) #endif #ifndef STATUS_NO_MEDIA # define STATUS_NO_MEDIA ((NTSTATUS) 0xC0000178L) #endif #ifndef STATUS_NO_SUCH_MEMBER # define STATUS_NO_SUCH_MEMBER ((NTSTATUS) 0xC000017AL) #endif #ifndef STATUS_INVALID_MEMBER # define STATUS_INVALID_MEMBER ((NTSTATUS) 0xC000017BL) #endif #ifndef STATUS_KEY_DELETED # define STATUS_KEY_DELETED ((NTSTATUS) 0xC000017CL) #endif #ifndef STATUS_NO_LOG_SPACE # define STATUS_NO_LOG_SPACE ((NTSTATUS) 0xC000017DL) #endif #ifndef STATUS_TOO_MANY_SIDS # define STATUS_TOO_MANY_SIDS ((NTSTATUS) 0xC000017EL) #endif #ifndef STATUS_LM_CROSS_ENCRYPTION_REQUIRED # define STATUS_LM_CROSS_ENCRYPTION_REQUIRED ((NTSTATUS) 0xC000017FL) #endif #ifndef STATUS_KEY_HAS_CHILDREN # define STATUS_KEY_HAS_CHILDREN ((NTSTATUS) 0xC0000180L) #endif #ifndef STATUS_CHILD_MUST_BE_VOLATILE # define STATUS_CHILD_MUST_BE_VOLATILE ((NTSTATUS) 0xC0000181L) #endif #ifndef STATUS_DEVICE_CONFIGURATION_ERROR # define STATUS_DEVICE_CONFIGURATION_ERROR ((NTSTATUS) 0xC0000182L) #endif #ifndef STATUS_DRIVER_INTERNAL_ERROR # define STATUS_DRIVER_INTERNAL_ERROR ((NTSTATUS) 0xC0000183L) #endif #ifndef STATUS_INVALID_DEVICE_STATE # define STATUS_INVALID_DEVICE_STATE ((NTSTATUS) 0xC0000184L) #endif #ifndef STATUS_IO_DEVICE_ERROR # define STATUS_IO_DEVICE_ERROR ((NTSTATUS) 0xC0000185L) #endif #ifndef STATUS_DEVICE_PROTOCOL_ERROR # define STATUS_DEVICE_PROTOCOL_ERROR ((NTSTATUS) 0xC0000186L) #endif #ifndef STATUS_BACKUP_CONTROLLER # define STATUS_BACKUP_CONTROLLER ((NTSTATUS) 0xC0000187L) #endif #ifndef STATUS_LOG_FILE_FULL # define STATUS_LOG_FILE_FULL ((NTSTATUS) 0xC0000188L) #endif #ifndef STATUS_TOO_LATE # define STATUS_TOO_LATE ((NTSTATUS) 0xC0000189L) #endif #ifndef STATUS_NO_TRUST_LSA_SECRET # define STATUS_NO_TRUST_LSA_SECRET ((NTSTATUS) 0xC000018AL) #endif #ifndef STATUS_NO_TRUST_SAM_ACCOUNT # define STATUS_NO_TRUST_SAM_ACCOUNT ((NTSTATUS) 0xC000018BL) #endif #ifndef STATUS_TRUSTED_DOMAIN_FAILURE # define STATUS_TRUSTED_DOMAIN_FAILURE ((NTSTATUS) 0xC000018CL) #endif #ifndef STATUS_TRUSTED_RELATIONSHIP_FAILURE # define STATUS_TRUSTED_RELATIONSHIP_FAILURE ((NTSTATUS) 0xC000018DL) #endif #ifndef STATUS_EVENTLOG_FILE_CORRUPT # define STATUS_EVENTLOG_FILE_CORRUPT ((NTSTATUS) 0xC000018EL) #endif #ifndef STATUS_EVENTLOG_CANT_START # define STATUS_EVENTLOG_CANT_START ((NTSTATUS) 0xC000018FL) #endif #ifndef STATUS_TRUST_FAILURE # define STATUS_TRUST_FAILURE ((NTSTATUS) 0xC0000190L) #endif #ifndef STATUS_MUTANT_LIMIT_EXCEEDED # define STATUS_MUTANT_LIMIT_EXCEEDED ((NTSTATUS) 0xC0000191L) #endif #ifndef STATUS_NETLOGON_NOT_STARTED # define STATUS_NETLOGON_NOT_STARTED ((NTSTATUS) 0xC0000192L) #endif #ifndef STATUS_ACCOUNT_EXPIRED # define STATUS_ACCOUNT_EXPIRED ((NTSTATUS) 0xC0000193L) #endif #ifndef STATUS_POSSIBLE_DEADLOCK # define STATUS_POSSIBLE_DEADLOCK ((NTSTATUS) 0xC0000194L) #endif #ifndef STATUS_NETWORK_CREDENTIAL_CONFLICT # define STATUS_NETWORK_CREDENTIAL_CONFLICT ((NTSTATUS) 0xC0000195L) #endif #ifndef STATUS_REMOTE_SESSION_LIMIT # define STATUS_REMOTE_SESSION_LIMIT ((NTSTATUS) 0xC0000196L) #endif #ifndef STATUS_EVENTLOG_FILE_CHANGED # define STATUS_EVENTLOG_FILE_CHANGED ((NTSTATUS) 0xC0000197L) #endif #ifndef STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT # define STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT ((NTSTATUS) 0xC0000198L) #endif #ifndef STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT # define STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT ((NTSTATUS) 0xC0000199L) #endif #ifndef STATUS_NOLOGON_SERVER_TRUST_ACCOUNT # define STATUS_NOLOGON_SERVER_TRUST_ACCOUNT ((NTSTATUS) 0xC000019AL) #endif #ifndef STATUS_DOMAIN_TRUST_INCONSISTENT # define STATUS_DOMAIN_TRUST_INCONSISTENT ((NTSTATUS) 0xC000019BL) #endif #ifndef STATUS_FS_DRIVER_REQUIRED # define STATUS_FS_DRIVER_REQUIRED ((NTSTATUS) 0xC000019CL) #endif #ifndef STATUS_IMAGE_ALREADY_LOADED_AS_DLL # define STATUS_IMAGE_ALREADY_LOADED_AS_DLL ((NTSTATUS) 0xC000019DL) #endif #ifndef STATUS_INCOMPATIBLE_WITH_GLOBAL_SHORT_NAME_REGISTRY_SETTING # define STATUS_INCOMPATIBLE_WITH_GLOBAL_SHORT_NAME_REGISTRY_SETTING ((NTSTATUS) 0xC000019EL) #endif #ifndef STATUS_SHORT_NAMES_NOT_ENABLED_ON_VOLUME # define STATUS_SHORT_NAMES_NOT_ENABLED_ON_VOLUME ((NTSTATUS) 0xC000019FL) #endif #ifndef STATUS_SECURITY_STREAM_IS_INCONSISTENT # define STATUS_SECURITY_STREAM_IS_INCONSISTENT ((NTSTATUS) 0xC00001A0L) #endif #ifndef STATUS_INVALID_LOCK_RANGE # define STATUS_INVALID_LOCK_RANGE ((NTSTATUS) 0xC00001A1L) #endif #ifndef STATUS_INVALID_ACE_CONDITION # define STATUS_INVALID_ACE_CONDITION ((NTSTATUS) 0xC00001A2L) #endif #ifndef STATUS_IMAGE_SUBSYSTEM_NOT_PRESENT # define STATUS_IMAGE_SUBSYSTEM_NOT_PRESENT ((NTSTATUS) 0xC00001A3L) #endif #ifndef STATUS_NOTIFICATION_GUID_ALREADY_DEFINED # define STATUS_NOTIFICATION_GUID_ALREADY_DEFINED ((NTSTATUS) 0xC00001A4L) #endif #ifndef STATUS_NETWORK_OPEN_RESTRICTION # define STATUS_NETWORK_OPEN_RESTRICTION ((NTSTATUS) 0xC0000201L) #endif #ifndef STATUS_NO_USER_SESSION_KEY # define STATUS_NO_USER_SESSION_KEY ((NTSTATUS) 0xC0000202L) #endif #ifndef STATUS_USER_SESSION_DELETED # define STATUS_USER_SESSION_DELETED ((NTSTATUS) 0xC0000203L) #endif #ifndef STATUS_RESOURCE_LANG_NOT_FOUND # define STATUS_RESOURCE_LANG_NOT_FOUND ((NTSTATUS) 0xC0000204L) #endif #ifndef STATUS_INSUFF_SERVER_RESOURCES # define STATUS_INSUFF_SERVER_RESOURCES ((NTSTATUS) 0xC0000205L) #endif #ifndef STATUS_INVALID_BUFFER_SIZE # define STATUS_INVALID_BUFFER_SIZE ((NTSTATUS) 0xC0000206L) #endif #ifndef STATUS_INVALID_ADDRESS_COMPONENT # define STATUS_INVALID_ADDRESS_COMPONENT ((NTSTATUS) 0xC0000207L) #endif #ifndef STATUS_INVALID_ADDRESS_WILDCARD # define STATUS_INVALID_ADDRESS_WILDCARD ((NTSTATUS) 0xC0000208L) #endif #ifndef STATUS_TOO_MANY_ADDRESSES # define STATUS_TOO_MANY_ADDRESSES ((NTSTATUS) 0xC0000209L) #endif #ifndef STATUS_ADDRESS_ALREADY_EXISTS # define STATUS_ADDRESS_ALREADY_EXISTS ((NTSTATUS) 0xC000020AL) #endif #ifndef STATUS_ADDRESS_CLOSED # define STATUS_ADDRESS_CLOSED ((NTSTATUS) 0xC000020BL) #endif #ifndef STATUS_CONNECTION_DISCONNECTED # define STATUS_CONNECTION_DISCONNECTED ((NTSTATUS) 0xC000020CL) #endif #ifndef STATUS_CONNECTION_RESET # define STATUS_CONNECTION_RESET ((NTSTATUS) 0xC000020DL) #endif #ifndef STATUS_TOO_MANY_NODES # define STATUS_TOO_MANY_NODES ((NTSTATUS) 0xC000020EL) #endif #ifndef STATUS_TRANSACTION_ABORTED # define STATUS_TRANSACTION_ABORTED ((NTSTATUS) 0xC000020FL) #endif #ifndef STATUS_TRANSACTION_TIMED_OUT # define STATUS_TRANSACTION_TIMED_OUT ((NTSTATUS) 0xC0000210L) #endif #ifndef STATUS_TRANSACTION_NO_RELEASE # define STATUS_TRANSACTION_NO_RELEASE ((NTSTATUS) 0xC0000211L) #endif #ifndef STATUS_TRANSACTION_NO_MATCH # define STATUS_TRANSACTION_NO_MATCH ((NTSTATUS) 0xC0000212L) #endif #ifndef STATUS_TRANSACTION_RESPONDED # define STATUS_TRANSACTION_RESPONDED ((NTSTATUS) 0xC0000213L) #endif #ifndef STATUS_TRANSACTION_INVALID_ID # define STATUS_TRANSACTION_INVALID_ID ((NTSTATUS) 0xC0000214L) #endif #ifndef STATUS_TRANSACTION_INVALID_TYPE # define STATUS_TRANSACTION_INVALID_TYPE ((NTSTATUS) 0xC0000215L) #endif #ifndef STATUS_NOT_SERVER_SESSION # define STATUS_NOT_SERVER_SESSION ((NTSTATUS) 0xC0000216L) #endif #ifndef STATUS_NOT_CLIENT_SESSION # define STATUS_NOT_CLIENT_SESSION ((NTSTATUS) 0xC0000217L) #endif #ifndef STATUS_CANNOT_LOAD_REGISTRY_FILE # define STATUS_CANNOT_LOAD_REGISTRY_FILE ((NTSTATUS) 0xC0000218L) #endif #ifndef STATUS_DEBUG_ATTACH_FAILED # define STATUS_DEBUG_ATTACH_FAILED ((NTSTATUS) 0xC0000219L) #endif #ifndef STATUS_SYSTEM_PROCESS_TERMINATED # define STATUS_SYSTEM_PROCESS_TERMINATED ((NTSTATUS) 0xC000021AL) #endif #ifndef STATUS_DATA_NOT_ACCEPTED # define STATUS_DATA_NOT_ACCEPTED ((NTSTATUS) 0xC000021BL) #endif #ifndef STATUS_NO_BROWSER_SERVERS_FOUND # define STATUS_NO_BROWSER_SERVERS_FOUND ((NTSTATUS) 0xC000021CL) #endif #ifndef STATUS_VDM_HARD_ERROR # define STATUS_VDM_HARD_ERROR ((NTSTATUS) 0xC000021DL) #endif #ifndef STATUS_DRIVER_CANCEL_TIMEOUT # define STATUS_DRIVER_CANCEL_TIMEOUT ((NTSTATUS) 0xC000021EL) #endif #ifndef STATUS_REPLY_MESSAGE_MISMATCH # define STATUS_REPLY_MESSAGE_MISMATCH ((NTSTATUS) 0xC000021FL) #endif #ifndef STATUS_MAPPED_ALIGNMENT # define STATUS_MAPPED_ALIGNMENT ((NTSTATUS) 0xC0000220L) #endif #ifndef STATUS_IMAGE_CHECKSUM_MISMATCH # define STATUS_IMAGE_CHECKSUM_MISMATCH ((NTSTATUS) 0xC0000221L) #endif #ifndef STATUS_LOST_WRITEBEHIND_DATA # define STATUS_LOST_WRITEBEHIND_DATA ((NTSTATUS) 0xC0000222L) #endif #ifndef STATUS_CLIENT_SERVER_PARAMETERS_INVALID # define STATUS_CLIENT_SERVER_PARAMETERS_INVALID ((NTSTATUS) 0xC0000223L) #endif #ifndef STATUS_PASSWORD_MUST_CHANGE # define STATUS_PASSWORD_MUST_CHANGE ((NTSTATUS) 0xC0000224L) #endif #ifndef STATUS_NOT_FOUND # define STATUS_NOT_FOUND ((NTSTATUS) 0xC0000225L) #endif #ifndef STATUS_NOT_TINY_STREAM # define STATUS_NOT_TINY_STREAM ((NTSTATUS) 0xC0000226L) #endif #ifndef STATUS_RECOVERY_FAILURE # define STATUS_RECOVERY_FAILURE ((NTSTATUS) 0xC0000227L) #endif #ifndef STATUS_STACK_OVERFLOW_READ # define STATUS_STACK_OVERFLOW_READ ((NTSTATUS) 0xC0000228L) #endif #ifndef STATUS_FAIL_CHECK # define STATUS_FAIL_CHECK ((NTSTATUS) 0xC0000229L) #endif #ifndef STATUS_DUPLICATE_OBJECTID # define STATUS_DUPLICATE_OBJECTID ((NTSTATUS) 0xC000022AL) #endif #ifndef STATUS_OBJECTID_EXISTS # define STATUS_OBJECTID_EXISTS ((NTSTATUS) 0xC000022BL) #endif #ifndef STATUS_CONVERT_TO_LARGE # define STATUS_CONVERT_TO_LARGE ((NTSTATUS) 0xC000022CL) #endif #ifndef STATUS_RETRY # define STATUS_RETRY ((NTSTATUS) 0xC000022DL) #endif #ifndef STATUS_FOUND_OUT_OF_SCOPE # define STATUS_FOUND_OUT_OF_SCOPE ((NTSTATUS) 0xC000022EL) #endif #ifndef STATUS_ALLOCATE_BUCKET # define STATUS_ALLOCATE_BUCKET ((NTSTATUS) 0xC000022FL) #endif #ifndef STATUS_PROPSET_NOT_FOUND # define STATUS_PROPSET_NOT_FOUND ((NTSTATUS) 0xC0000230L) #endif #ifndef STATUS_MARSHALL_OVERFLOW # define STATUS_MARSHALL_OVERFLOW ((NTSTATUS) 0xC0000231L) #endif #ifndef STATUS_INVALID_VARIANT # define STATUS_INVALID_VARIANT ((NTSTATUS) 0xC0000232L) #endif #ifndef STATUS_DOMAIN_CONTROLLER_NOT_FOUND # define STATUS_DOMAIN_CONTROLLER_NOT_FOUND ((NTSTATUS) 0xC0000233L) #endif #ifndef STATUS_ACCOUNT_LOCKED_OUT # define STATUS_ACCOUNT_LOCKED_OUT ((NTSTATUS) 0xC0000234L) #endif #ifndef STATUS_HANDLE_NOT_CLOSABLE # define STATUS_HANDLE_NOT_CLOSABLE ((NTSTATUS) 0xC0000235L) #endif #ifndef STATUS_CONNECTION_REFUSED # define STATUS_CONNECTION_REFUSED ((NTSTATUS) 0xC0000236L) #endif #ifndef STATUS_GRACEFUL_DISCONNECT # define STATUS_GRACEFUL_DISCONNECT ((NTSTATUS) 0xC0000237L) #endif #ifndef STATUS_ADDRESS_ALREADY_ASSOCIATED # define STATUS_ADDRESS_ALREADY_ASSOCIATED ((NTSTATUS) 0xC0000238L) #endif #ifndef STATUS_ADDRESS_NOT_ASSOCIATED # define STATUS_ADDRESS_NOT_ASSOCIATED ((NTSTATUS) 0xC0000239L) #endif #ifndef STATUS_CONNECTION_INVALID # define STATUS_CONNECTION_INVALID ((NTSTATUS) 0xC000023AL) #endif #ifndef STATUS_CONNECTION_ACTIVE # define STATUS_CONNECTION_ACTIVE ((NTSTATUS) 0xC000023BL) #endif #ifndef STATUS_NETWORK_UNREACHABLE # define STATUS_NETWORK_UNREACHABLE ((NTSTATUS) 0xC000023CL) #endif #ifndef STATUS_HOST_UNREACHABLE # define STATUS_HOST_UNREACHABLE ((NTSTATUS) 0xC000023DL) #endif #ifndef STATUS_PROTOCOL_UNREACHABLE # define STATUS_PROTOCOL_UNREACHABLE ((NTSTATUS) 0xC000023EL) #endif #ifndef STATUS_PORT_UNREACHABLE # define STATUS_PORT_UNREACHABLE ((NTSTATUS) 0xC000023FL) #endif #ifndef STATUS_REQUEST_ABORTED # define STATUS_REQUEST_ABORTED ((NTSTATUS) 0xC0000240L) #endif #ifndef STATUS_CONNECTION_ABORTED # define STATUS_CONNECTION_ABORTED ((NTSTATUS) 0xC0000241L) #endif #ifndef STATUS_BAD_COMPRESSION_BUFFER # define STATUS_BAD_COMPRESSION_BUFFER ((NTSTATUS) 0xC0000242L) #endif #ifndef STATUS_USER_MAPPED_FILE # define STATUS_USER_MAPPED_FILE ((NTSTATUS) 0xC0000243L) #endif #ifndef STATUS_AUDIT_FAILED # define STATUS_AUDIT_FAILED ((NTSTATUS) 0xC0000244L) #endif #ifndef STATUS_TIMER_RESOLUTION_NOT_SET # define STATUS_TIMER_RESOLUTION_NOT_SET ((NTSTATUS) 0xC0000245L) #endif #ifndef STATUS_CONNECTION_COUNT_LIMIT # define STATUS_CONNECTION_COUNT_LIMIT ((NTSTATUS) 0xC0000246L) #endif #ifndef STATUS_LOGIN_TIME_RESTRICTION # define STATUS_LOGIN_TIME_RESTRICTION ((NTSTATUS) 0xC0000247L) #endif #ifndef STATUS_LOGIN_WKSTA_RESTRICTION # define STATUS_LOGIN_WKSTA_RESTRICTION ((NTSTATUS) 0xC0000248L) #endif #ifndef STATUS_IMAGE_MP_UP_MISMATCH # define STATUS_IMAGE_MP_UP_MISMATCH ((NTSTATUS) 0xC0000249L) #endif #ifndef STATUS_INSUFFICIENT_LOGON_INFO # define STATUS_INSUFFICIENT_LOGON_INFO ((NTSTATUS) 0xC0000250L) #endif #ifndef STATUS_BAD_DLL_ENTRYPOINT # define STATUS_BAD_DLL_ENTRYPOINT ((NTSTATUS) 0xC0000251L) #endif #ifndef STATUS_BAD_SERVICE_ENTRYPOINT # define STATUS_BAD_SERVICE_ENTRYPOINT ((NTSTATUS) 0xC0000252L) #endif #ifndef STATUS_LPC_REPLY_LOST # define STATUS_LPC_REPLY_LOST ((NTSTATUS) 0xC0000253L) #endif #ifndef STATUS_IP_ADDRESS_CONFLICT1 # define STATUS_IP_ADDRESS_CONFLICT1 ((NTSTATUS) 0xC0000254L) #endif #ifndef STATUS_IP_ADDRESS_CONFLICT2 # define STATUS_IP_ADDRESS_CONFLICT2 ((NTSTATUS) 0xC0000255L) #endif #ifndef STATUS_REGISTRY_QUOTA_LIMIT # define STATUS_REGISTRY_QUOTA_LIMIT ((NTSTATUS) 0xC0000256L) #endif #ifndef STATUS_PATH_NOT_COVERED # define STATUS_PATH_NOT_COVERED ((NTSTATUS) 0xC0000257L) #endif #ifndef STATUS_NO_CALLBACK_ACTIVE # define STATUS_NO_CALLBACK_ACTIVE ((NTSTATUS) 0xC0000258L) #endif #ifndef STATUS_LICENSE_QUOTA_EXCEEDED # define STATUS_LICENSE_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000259L) #endif #ifndef STATUS_PWD_TOO_SHORT # define STATUS_PWD_TOO_SHORT ((NTSTATUS) 0xC000025AL) #endif #ifndef STATUS_PWD_TOO_RECENT # define STATUS_PWD_TOO_RECENT ((NTSTATUS) 0xC000025BL) #endif #ifndef STATUS_PWD_HISTORY_CONFLICT # define STATUS_PWD_HISTORY_CONFLICT ((NTSTATUS) 0xC000025CL) #endif #ifndef STATUS_PLUGPLAY_NO_DEVICE # define STATUS_PLUGPLAY_NO_DEVICE ((NTSTATUS) 0xC000025EL) #endif #ifndef STATUS_UNSUPPORTED_COMPRESSION # define STATUS_UNSUPPORTED_COMPRESSION ((NTSTATUS) 0xC000025FL) #endif #ifndef STATUS_INVALID_HW_PROFILE # define STATUS_INVALID_HW_PROFILE ((NTSTATUS) 0xC0000260L) #endif #ifndef STATUS_INVALID_PLUGPLAY_DEVICE_PATH # define STATUS_INVALID_PLUGPLAY_DEVICE_PATH ((NTSTATUS) 0xC0000261L) #endif #ifndef STATUS_DRIVER_ORDINAL_NOT_FOUND # define STATUS_DRIVER_ORDINAL_NOT_FOUND ((NTSTATUS) 0xC0000262L) #endif #ifndef STATUS_DRIVER_ENTRYPOINT_NOT_FOUND # define STATUS_DRIVER_ENTRYPOINT_NOT_FOUND ((NTSTATUS) 0xC0000263L) #endif #ifndef STATUS_RESOURCE_NOT_OWNED # define STATUS_RESOURCE_NOT_OWNED ((NTSTATUS) 0xC0000264L) #endif #ifndef STATUS_TOO_MANY_LINKS # define STATUS_TOO_MANY_LINKS ((NTSTATUS) 0xC0000265L) #endif #ifndef STATUS_QUOTA_LIST_INCONSISTENT # define STATUS_QUOTA_LIST_INCONSISTENT ((NTSTATUS) 0xC0000266L) #endif #ifndef STATUS_FILE_IS_OFFLINE # define STATUS_FILE_IS_OFFLINE ((NTSTATUS) 0xC0000267L) #endif #ifndef STATUS_EVALUATION_EXPIRATION # define STATUS_EVALUATION_EXPIRATION ((NTSTATUS) 0xC0000268L) #endif #ifndef STATUS_ILLEGAL_DLL_RELOCATION # define STATUS_ILLEGAL_DLL_RELOCATION ((NTSTATUS) 0xC0000269L) #endif #ifndef STATUS_LICENSE_VIOLATION # define STATUS_LICENSE_VIOLATION ((NTSTATUS) 0xC000026AL) #endif #ifndef STATUS_DLL_INIT_FAILED_LOGOFF # define STATUS_DLL_INIT_FAILED_LOGOFF ((NTSTATUS) 0xC000026BL) #endif #ifndef STATUS_DRIVER_UNABLE_TO_LOAD # define STATUS_DRIVER_UNABLE_TO_LOAD ((NTSTATUS) 0xC000026CL) #endif #ifndef STATUS_DFS_UNAVAILABLE # define STATUS_DFS_UNAVAILABLE ((NTSTATUS) 0xC000026DL) #endif #ifndef STATUS_VOLUME_DISMOUNTED # define STATUS_VOLUME_DISMOUNTED ((NTSTATUS) 0xC000026EL) #endif #ifndef STATUS_WX86_INTERNAL_ERROR # define STATUS_WX86_INTERNAL_ERROR ((NTSTATUS) 0xC000026FL) #endif #ifndef STATUS_WX86_FLOAT_STACK_CHECK # define STATUS_WX86_FLOAT_STACK_CHECK ((NTSTATUS) 0xC0000270L) #endif #ifndef STATUS_VALIDATE_CONTINUE # define STATUS_VALIDATE_CONTINUE ((NTSTATUS) 0xC0000271L) #endif #ifndef STATUS_NO_MATCH # define STATUS_NO_MATCH ((NTSTATUS) 0xC0000272L) #endif #ifndef STATUS_NO_MORE_MATCHES # define STATUS_NO_MORE_MATCHES ((NTSTATUS) 0xC0000273L) #endif #ifndef STATUS_NOT_A_REPARSE_POINT # define STATUS_NOT_A_REPARSE_POINT ((NTSTATUS) 0xC0000275L) #endif #ifndef STATUS_IO_REPARSE_TAG_INVALID # define STATUS_IO_REPARSE_TAG_INVALID ((NTSTATUS) 0xC0000276L) #endif #ifndef STATUS_IO_REPARSE_TAG_MISMATCH # define STATUS_IO_REPARSE_TAG_MISMATCH ((NTSTATUS) 0xC0000277L) #endif #ifndef STATUS_IO_REPARSE_DATA_INVALID # define STATUS_IO_REPARSE_DATA_INVALID ((NTSTATUS) 0xC0000278L) #endif #ifndef STATUS_IO_REPARSE_TAG_NOT_HANDLED # define STATUS_IO_REPARSE_TAG_NOT_HANDLED ((NTSTATUS) 0xC0000279L) #endif #ifndef STATUS_REPARSE_POINT_NOT_RESOLVED # define STATUS_REPARSE_POINT_NOT_RESOLVED ((NTSTATUS) 0xC0000280L) #endif #ifndef STATUS_DIRECTORY_IS_A_REPARSE_POINT # define STATUS_DIRECTORY_IS_A_REPARSE_POINT ((NTSTATUS) 0xC0000281L) #endif #ifndef STATUS_RANGE_LIST_CONFLICT # define STATUS_RANGE_LIST_CONFLICT ((NTSTATUS) 0xC0000282L) #endif #ifndef STATUS_SOURCE_ELEMENT_EMPTY # define STATUS_SOURCE_ELEMENT_EMPTY ((NTSTATUS) 0xC0000283L) #endif #ifndef STATUS_DESTINATION_ELEMENT_FULL # define STATUS_DESTINATION_ELEMENT_FULL ((NTSTATUS) 0xC0000284L) #endif #ifndef STATUS_ILLEGAL_ELEMENT_ADDRESS # define STATUS_ILLEGAL_ELEMENT_ADDRESS ((NTSTATUS) 0xC0000285L) #endif #ifndef STATUS_MAGAZINE_NOT_PRESENT # define STATUS_MAGAZINE_NOT_PRESENT ((NTSTATUS) 0xC0000286L) #endif #ifndef STATUS_REINITIALIZATION_NEEDED # define STATUS_REINITIALIZATION_NEEDED ((NTSTATUS) 0xC0000287L) #endif #ifndef STATUS_DEVICE_REQUIRES_CLEANING # define STATUS_DEVICE_REQUIRES_CLEANING ((NTSTATUS) 0x80000288L) #endif #ifndef STATUS_DEVICE_DOOR_OPEN # define STATUS_DEVICE_DOOR_OPEN ((NTSTATUS) 0x80000289L) #endif #ifndef STATUS_ENCRYPTION_FAILED # define STATUS_ENCRYPTION_FAILED ((NTSTATUS) 0xC000028AL) #endif #ifndef STATUS_DECRYPTION_FAILED # define STATUS_DECRYPTION_FAILED ((NTSTATUS) 0xC000028BL) #endif #ifndef STATUS_RANGE_NOT_FOUND # define STATUS_RANGE_NOT_FOUND ((NTSTATUS) 0xC000028CL) #endif #ifndef STATUS_NO_RECOVERY_POLICY # define STATUS_NO_RECOVERY_POLICY ((NTSTATUS) 0xC000028DL) #endif #ifndef STATUS_NO_EFS # define STATUS_NO_EFS ((NTSTATUS) 0xC000028EL) #endif #ifndef STATUS_WRONG_EFS # define STATUS_WRONG_EFS ((NTSTATUS) 0xC000028FL) #endif #ifndef STATUS_NO_USER_KEYS # define STATUS_NO_USER_KEYS ((NTSTATUS) 0xC0000290L) #endif #ifndef STATUS_FILE_NOT_ENCRYPTED # define STATUS_FILE_NOT_ENCRYPTED ((NTSTATUS) 0xC0000291L) #endif #ifndef STATUS_NOT_EXPORT_FORMAT # define STATUS_NOT_EXPORT_FORMAT ((NTSTATUS) 0xC0000292L) #endif #ifndef STATUS_FILE_ENCRYPTED # define STATUS_FILE_ENCRYPTED ((NTSTATUS) 0xC0000293L) #endif #ifndef STATUS_WAKE_SYSTEM # define STATUS_WAKE_SYSTEM ((NTSTATUS) 0x40000294L) #endif #ifndef STATUS_WMI_GUID_NOT_FOUND # define STATUS_WMI_GUID_NOT_FOUND ((NTSTATUS) 0xC0000295L) #endif #ifndef STATUS_WMI_INSTANCE_NOT_FOUND # define STATUS_WMI_INSTANCE_NOT_FOUND ((NTSTATUS) 0xC0000296L) #endif #ifndef STATUS_WMI_ITEMID_NOT_FOUND # define STATUS_WMI_ITEMID_NOT_FOUND ((NTSTATUS) 0xC0000297L) #endif #ifndef STATUS_WMI_TRY_AGAIN # define STATUS_WMI_TRY_AGAIN ((NTSTATUS) 0xC0000298L) #endif #ifndef STATUS_SHARED_POLICY # define STATUS_SHARED_POLICY ((NTSTATUS) 0xC0000299L) #endif #ifndef STATUS_POLICY_OBJECT_NOT_FOUND # define STATUS_POLICY_OBJECT_NOT_FOUND ((NTSTATUS) 0xC000029AL) #endif #ifndef STATUS_POLICY_ONLY_IN_DS # define STATUS_POLICY_ONLY_IN_DS ((NTSTATUS) 0xC000029BL) #endif #ifndef STATUS_VOLUME_NOT_UPGRADED # define STATUS_VOLUME_NOT_UPGRADED ((NTSTATUS) 0xC000029CL) #endif #ifndef STATUS_REMOTE_STORAGE_NOT_ACTIVE # define STATUS_REMOTE_STORAGE_NOT_ACTIVE ((NTSTATUS) 0xC000029DL) #endif #ifndef STATUS_REMOTE_STORAGE_MEDIA_ERROR # define STATUS_REMOTE_STORAGE_MEDIA_ERROR ((NTSTATUS) 0xC000029EL) #endif #ifndef STATUS_NO_TRACKING_SERVICE # define STATUS_NO_TRACKING_SERVICE ((NTSTATUS) 0xC000029FL) #endif #ifndef STATUS_SERVER_SID_MISMATCH # define STATUS_SERVER_SID_MISMATCH ((NTSTATUS) 0xC00002A0L) #endif #ifndef STATUS_DS_NO_ATTRIBUTE_OR_VALUE # define STATUS_DS_NO_ATTRIBUTE_OR_VALUE ((NTSTATUS) 0xC00002A1L) #endif #ifndef STATUS_DS_INVALID_ATTRIBUTE_SYNTAX # define STATUS_DS_INVALID_ATTRIBUTE_SYNTAX ((NTSTATUS) 0xC00002A2L) #endif #ifndef STATUS_DS_ATTRIBUTE_TYPE_UNDEFINED # define STATUS_DS_ATTRIBUTE_TYPE_UNDEFINED ((NTSTATUS) 0xC00002A3L) #endif #ifndef STATUS_DS_ATTRIBUTE_OR_VALUE_EXISTS # define STATUS_DS_ATTRIBUTE_OR_VALUE_EXISTS ((NTSTATUS) 0xC00002A4L) #endif #ifndef STATUS_DS_BUSY # define STATUS_DS_BUSY ((NTSTATUS) 0xC00002A5L) #endif #ifndef STATUS_DS_UNAVAILABLE # define STATUS_DS_UNAVAILABLE ((NTSTATUS) 0xC00002A6L) #endif #ifndef STATUS_DS_NO_RIDS_ALLOCATED # define STATUS_DS_NO_RIDS_ALLOCATED ((NTSTATUS) 0xC00002A7L) #endif #ifndef STATUS_DS_NO_MORE_RIDS # define STATUS_DS_NO_MORE_RIDS ((NTSTATUS) 0xC00002A8L) #endif #ifndef STATUS_DS_INCORRECT_ROLE_OWNER # define STATUS_DS_INCORRECT_ROLE_OWNER ((NTSTATUS) 0xC00002A9L) #endif #ifndef STATUS_DS_RIDMGR_INIT_ERROR # define STATUS_DS_RIDMGR_INIT_ERROR ((NTSTATUS) 0xC00002AAL) #endif #ifndef STATUS_DS_OBJ_CLASS_VIOLATION # define STATUS_DS_OBJ_CLASS_VIOLATION ((NTSTATUS) 0xC00002ABL) #endif #ifndef STATUS_DS_CANT_ON_NON_LEAF # define STATUS_DS_CANT_ON_NON_LEAF ((NTSTATUS) 0xC00002ACL) #endif #ifndef STATUS_DS_CANT_ON_RDN # define STATUS_DS_CANT_ON_RDN ((NTSTATUS) 0xC00002ADL) #endif #ifndef STATUS_DS_CANT_MOD_OBJ_CLASS # define STATUS_DS_CANT_MOD_OBJ_CLASS ((NTSTATUS) 0xC00002AEL) #endif #ifndef STATUS_DS_CROSS_DOM_MOVE_FAILED # define STATUS_DS_CROSS_DOM_MOVE_FAILED ((NTSTATUS) 0xC00002AFL) #endif #ifndef STATUS_DS_GC_NOT_AVAILABLE # define STATUS_DS_GC_NOT_AVAILABLE ((NTSTATUS) 0xC00002B0L) #endif #ifndef STATUS_DIRECTORY_SERVICE_REQUIRED # define STATUS_DIRECTORY_SERVICE_REQUIRED ((NTSTATUS) 0xC00002B1L) #endif #ifndef STATUS_REPARSE_ATTRIBUTE_CONFLICT # define STATUS_REPARSE_ATTRIBUTE_CONFLICT ((NTSTATUS) 0xC00002B2L) #endif #ifndef STATUS_CANT_ENABLE_DENY_ONLY # define STATUS_CANT_ENABLE_DENY_ONLY ((NTSTATUS) 0xC00002B3L) #endif #ifndef STATUS_FLOAT_MULTIPLE_FAULTS # define STATUS_FLOAT_MULTIPLE_FAULTS ((NTSTATUS) 0xC00002B4L) #endif #ifndef STATUS_FLOAT_MULTIPLE_TRAPS # define STATUS_FLOAT_MULTIPLE_TRAPS ((NTSTATUS) 0xC00002B5L) #endif #ifndef STATUS_DEVICE_REMOVED # define STATUS_DEVICE_REMOVED ((NTSTATUS) 0xC00002B6L) #endif #ifndef STATUS_JOURNAL_DELETE_IN_PROGRESS # define STATUS_JOURNAL_DELETE_IN_PROGRESS ((NTSTATUS) 0xC00002B7L) #endif #ifndef STATUS_JOURNAL_NOT_ACTIVE # define STATUS_JOURNAL_NOT_ACTIVE ((NTSTATUS) 0xC00002B8L) #endif #ifndef STATUS_NOINTERFACE # define STATUS_NOINTERFACE ((NTSTATUS) 0xC00002B9L) #endif #ifndef STATUS_DS_ADMIN_LIMIT_EXCEEDED # define STATUS_DS_ADMIN_LIMIT_EXCEEDED ((NTSTATUS) 0xC00002C1L) #endif #ifndef STATUS_DRIVER_FAILED_SLEEP # define STATUS_DRIVER_FAILED_SLEEP ((NTSTATUS) 0xC00002C2L) #endif #ifndef STATUS_MUTUAL_AUTHENTICATION_FAILED # define STATUS_MUTUAL_AUTHENTICATION_FAILED ((NTSTATUS) 0xC00002C3L) #endif #ifndef STATUS_CORRUPT_SYSTEM_FILE # define STATUS_CORRUPT_SYSTEM_FILE ((NTSTATUS) 0xC00002C4L) #endif #ifndef STATUS_DATATYPE_MISALIGNMENT_ERROR # define STATUS_DATATYPE_MISALIGNMENT_ERROR ((NTSTATUS) 0xC00002C5L) #endif #ifndef STATUS_WMI_READ_ONLY # define STATUS_WMI_READ_ONLY ((NTSTATUS) 0xC00002C6L) #endif #ifndef STATUS_WMI_SET_FAILURE # define STATUS_WMI_SET_FAILURE ((NTSTATUS) 0xC00002C7L) #endif #ifndef STATUS_COMMITMENT_MINIMUM # define STATUS_COMMITMENT_MINIMUM ((NTSTATUS) 0xC00002C8L) #endif #ifndef STATUS_REG_NAT_CONSUMPTION # define STATUS_REG_NAT_CONSUMPTION ((NTSTATUS) 0xC00002C9L) #endif #ifndef STATUS_TRANSPORT_FULL # define STATUS_TRANSPORT_FULL ((NTSTATUS) 0xC00002CAL) #endif #ifndef STATUS_DS_SAM_INIT_FAILURE # define STATUS_DS_SAM_INIT_FAILURE ((NTSTATUS) 0xC00002CBL) #endif #ifndef STATUS_ONLY_IF_CONNECTED # define STATUS_ONLY_IF_CONNECTED ((NTSTATUS) 0xC00002CCL) #endif #ifndef STATUS_DS_SENSITIVE_GROUP_VIOLATION # define STATUS_DS_SENSITIVE_GROUP_VIOLATION ((NTSTATUS) 0xC00002CDL) #endif #ifndef STATUS_PNP_RESTART_ENUMERATION # define STATUS_PNP_RESTART_ENUMERATION ((NTSTATUS) 0xC00002CEL) #endif #ifndef STATUS_JOURNAL_ENTRY_DELETED # define STATUS_JOURNAL_ENTRY_DELETED ((NTSTATUS) 0xC00002CFL) #endif #ifndef STATUS_DS_CANT_MOD_PRIMARYGROUPID # define STATUS_DS_CANT_MOD_PRIMARYGROUPID ((NTSTATUS) 0xC00002D0L) #endif #ifndef STATUS_SYSTEM_IMAGE_BAD_SIGNATURE # define STATUS_SYSTEM_IMAGE_BAD_SIGNATURE ((NTSTATUS) 0xC00002D1L) #endif #ifndef STATUS_PNP_REBOOT_REQUIRED # define STATUS_PNP_REBOOT_REQUIRED ((NTSTATUS) 0xC00002D2L) #endif #ifndef STATUS_POWER_STATE_INVALID # define STATUS_POWER_STATE_INVALID ((NTSTATUS) 0xC00002D3L) #endif #ifndef STATUS_DS_INVALID_GROUP_TYPE # define STATUS_DS_INVALID_GROUP_TYPE ((NTSTATUS) 0xC00002D4L) #endif #ifndef STATUS_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN # define STATUS_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN ((NTSTATUS) 0xC00002D5L) #endif #ifndef STATUS_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN # define STATUS_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN ((NTSTATUS) 0xC00002D6L) #endif #ifndef STATUS_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER # define STATUS_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER ((NTSTATUS) 0xC00002D7L) #endif #ifndef STATUS_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER # define STATUS_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER ((NTSTATUS) 0xC00002D8L) #endif #ifndef STATUS_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER # define STATUS_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER ((NTSTATUS) 0xC00002D9L) #endif #ifndef STATUS_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER # define STATUS_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER ((NTSTATUS) 0xC00002DAL) #endif #ifndef STATUS_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER # define STATUS_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER ((NTSTATUS) 0xC00002DBL) #endif #ifndef STATUS_DS_HAVE_PRIMARY_MEMBERS # define STATUS_DS_HAVE_PRIMARY_MEMBERS ((NTSTATUS) 0xC00002DCL) #endif #ifndef STATUS_WMI_NOT_SUPPORTED # define STATUS_WMI_NOT_SUPPORTED ((NTSTATUS) 0xC00002DDL) #endif #ifndef STATUS_INSUFFICIENT_POWER # define STATUS_INSUFFICIENT_POWER ((NTSTATUS) 0xC00002DEL) #endif #ifndef STATUS_SAM_NEED_BOOTKEY_PASSWORD # define STATUS_SAM_NEED_BOOTKEY_PASSWORD ((NTSTATUS) 0xC00002DFL) #endif #ifndef STATUS_SAM_NEED_BOOTKEY_FLOPPY # define STATUS_SAM_NEED_BOOTKEY_FLOPPY ((NTSTATUS) 0xC00002E0L) #endif #ifndef STATUS_DS_CANT_START # define STATUS_DS_CANT_START ((NTSTATUS) 0xC00002E1L) #endif #ifndef STATUS_DS_INIT_FAILURE # define STATUS_DS_INIT_FAILURE ((NTSTATUS) 0xC00002E2L) #endif #ifndef STATUS_SAM_INIT_FAILURE # define STATUS_SAM_INIT_FAILURE ((NTSTATUS) 0xC00002E3L) #endif #ifndef STATUS_DS_GC_REQUIRED # define STATUS_DS_GC_REQUIRED ((NTSTATUS) 0xC00002E4L) #endif #ifndef STATUS_DS_LOCAL_MEMBER_OF_LOCAL_ONLY # define STATUS_DS_LOCAL_MEMBER_OF_LOCAL_ONLY ((NTSTATUS) 0xC00002E5L) #endif #ifndef STATUS_DS_NO_FPO_IN_UNIVERSAL_GROUPS # define STATUS_DS_NO_FPO_IN_UNIVERSAL_GROUPS ((NTSTATUS) 0xC00002E6L) #endif #ifndef STATUS_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED # define STATUS_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED ((NTSTATUS) 0xC00002E7L) #endif #ifndef STATUS_MULTIPLE_FAULT_VIOLATION # define STATUS_MULTIPLE_FAULT_VIOLATION ((NTSTATUS) 0xC00002E8L) #endif #ifndef STATUS_CURRENT_DOMAIN_NOT_ALLOWED # define STATUS_CURRENT_DOMAIN_NOT_ALLOWED ((NTSTATUS) 0xC00002E9L) #endif #ifndef STATUS_CANNOT_MAKE # define STATUS_CANNOT_MAKE ((NTSTATUS) 0xC00002EAL) #endif #ifndef STATUS_SYSTEM_SHUTDOWN # define STATUS_SYSTEM_SHUTDOWN ((NTSTATUS) 0xC00002EBL) #endif #ifndef STATUS_DS_INIT_FAILURE_CONSOLE # define STATUS_DS_INIT_FAILURE_CONSOLE ((NTSTATUS) 0xC00002ECL) #endif #ifndef STATUS_DS_SAM_INIT_FAILURE_CONSOLE # define STATUS_DS_SAM_INIT_FAILURE_CONSOLE ((NTSTATUS) 0xC00002EDL) #endif #ifndef STATUS_UNFINISHED_CONTEXT_DELETED # define STATUS_UNFINISHED_CONTEXT_DELETED ((NTSTATUS) 0xC00002EEL) #endif #ifndef STATUS_NO_TGT_REPLY # define STATUS_NO_TGT_REPLY ((NTSTATUS) 0xC00002EFL) #endif #ifndef STATUS_OBJECTID_NOT_FOUND # define STATUS_OBJECTID_NOT_FOUND ((NTSTATUS) 0xC00002F0L) #endif #ifndef STATUS_NO_IP_ADDRESSES # define STATUS_NO_IP_ADDRESSES ((NTSTATUS) 0xC00002F1L) #endif #ifndef STATUS_WRONG_CREDENTIAL_HANDLE # define STATUS_WRONG_CREDENTIAL_HANDLE ((NTSTATUS) 0xC00002F2L) #endif #ifndef STATUS_CRYPTO_SYSTEM_INVALID # define STATUS_CRYPTO_SYSTEM_INVALID ((NTSTATUS) 0xC00002F3L) #endif #ifndef STATUS_MAX_REFERRALS_EXCEEDED # define STATUS_MAX_REFERRALS_EXCEEDED ((NTSTATUS) 0xC00002F4L) #endif #ifndef STATUS_MUST_BE_KDC # define STATUS_MUST_BE_KDC ((NTSTATUS) 0xC00002F5L) #endif #ifndef STATUS_STRONG_CRYPTO_NOT_SUPPORTED # define STATUS_STRONG_CRYPTO_NOT_SUPPORTED ((NTSTATUS) 0xC00002F6L) #endif #ifndef STATUS_TOO_MANY_PRINCIPALS # define STATUS_TOO_MANY_PRINCIPALS ((NTSTATUS) 0xC00002F7L) #endif #ifndef STATUS_NO_PA_DATA # define STATUS_NO_PA_DATA ((NTSTATUS) 0xC00002F8L) #endif #ifndef STATUS_PKINIT_NAME_MISMATCH # define STATUS_PKINIT_NAME_MISMATCH ((NTSTATUS) 0xC00002F9L) #endif #ifndef STATUS_SMARTCARD_LOGON_REQUIRED # define STATUS_SMARTCARD_LOGON_REQUIRED ((NTSTATUS) 0xC00002FAL) #endif #ifndef STATUS_KDC_INVALID_REQUEST # define STATUS_KDC_INVALID_REQUEST ((NTSTATUS) 0xC00002FBL) #endif #ifndef STATUS_KDC_UNABLE_TO_REFER # define STATUS_KDC_UNABLE_TO_REFER ((NTSTATUS) 0xC00002FCL) #endif #ifndef STATUS_KDC_UNKNOWN_ETYPE # define STATUS_KDC_UNKNOWN_ETYPE ((NTSTATUS) 0xC00002FDL) #endif #ifndef STATUS_SHUTDOWN_IN_PROGRESS # define STATUS_SHUTDOWN_IN_PROGRESS ((NTSTATUS) 0xC00002FEL) #endif #ifndef STATUS_SERVER_SHUTDOWN_IN_PROGRESS # define STATUS_SERVER_SHUTDOWN_IN_PROGRESS ((NTSTATUS) 0xC00002FFL) #endif #ifndef STATUS_NOT_SUPPORTED_ON_SBS # define STATUS_NOT_SUPPORTED_ON_SBS ((NTSTATUS) 0xC0000300L) #endif #ifndef STATUS_WMI_GUID_DISCONNECTED # define STATUS_WMI_GUID_DISCONNECTED ((NTSTATUS) 0xC0000301L) #endif #ifndef STATUS_WMI_ALREADY_DISABLED # define STATUS_WMI_ALREADY_DISABLED ((NTSTATUS) 0xC0000302L) #endif #ifndef STATUS_WMI_ALREADY_ENABLED # define STATUS_WMI_ALREADY_ENABLED ((NTSTATUS) 0xC0000303L) #endif #ifndef STATUS_MFT_TOO_FRAGMENTED # define STATUS_MFT_TOO_FRAGMENTED ((NTSTATUS) 0xC0000304L) #endif #ifndef STATUS_COPY_PROTECTION_FAILURE # define STATUS_COPY_PROTECTION_FAILURE ((NTSTATUS) 0xC0000305L) #endif #ifndef STATUS_CSS_AUTHENTICATION_FAILURE # define STATUS_CSS_AUTHENTICATION_FAILURE ((NTSTATUS) 0xC0000306L) #endif #ifndef STATUS_CSS_KEY_NOT_PRESENT # define STATUS_CSS_KEY_NOT_PRESENT ((NTSTATUS) 0xC0000307L) #endif #ifndef STATUS_CSS_KEY_NOT_ESTABLISHED # define STATUS_CSS_KEY_NOT_ESTABLISHED ((NTSTATUS) 0xC0000308L) #endif #ifndef STATUS_CSS_SCRAMBLED_SECTOR # define STATUS_CSS_SCRAMBLED_SECTOR ((NTSTATUS) 0xC0000309L) #endif #ifndef STATUS_CSS_REGION_MISMATCH # define STATUS_CSS_REGION_MISMATCH ((NTSTATUS) 0xC000030AL) #endif #ifndef STATUS_CSS_RESETS_EXHAUSTED # define STATUS_CSS_RESETS_EXHAUSTED ((NTSTATUS) 0xC000030BL) #endif #ifndef STATUS_PKINIT_FAILURE # define STATUS_PKINIT_FAILURE ((NTSTATUS) 0xC0000320L) #endif #ifndef STATUS_SMARTCARD_SUBSYSTEM_FAILURE # define STATUS_SMARTCARD_SUBSYSTEM_FAILURE ((NTSTATUS) 0xC0000321L) #endif #ifndef STATUS_NO_KERB_KEY # define STATUS_NO_KERB_KEY ((NTSTATUS) 0xC0000322L) #endif #ifndef STATUS_HOST_DOWN # define STATUS_HOST_DOWN ((NTSTATUS) 0xC0000350L) #endif #ifndef STATUS_UNSUPPORTED_PREAUTH # define STATUS_UNSUPPORTED_PREAUTH ((NTSTATUS) 0xC0000351L) #endif #ifndef STATUS_EFS_ALG_BLOB_TOO_BIG # define STATUS_EFS_ALG_BLOB_TOO_BIG ((NTSTATUS) 0xC0000352L) #endif #ifndef STATUS_PORT_NOT_SET # define STATUS_PORT_NOT_SET ((NTSTATUS) 0xC0000353L) #endif #ifndef STATUS_DEBUGGER_INACTIVE # define STATUS_DEBUGGER_INACTIVE ((NTSTATUS) 0xC0000354L) #endif #ifndef STATUS_DS_VERSION_CHECK_FAILURE # define STATUS_DS_VERSION_CHECK_FAILURE ((NTSTATUS) 0xC0000355L) #endif #ifndef STATUS_AUDITING_DISABLED # define STATUS_AUDITING_DISABLED ((NTSTATUS) 0xC0000356L) #endif #ifndef STATUS_PRENT4_MACHINE_ACCOUNT # define STATUS_PRENT4_MACHINE_ACCOUNT ((NTSTATUS) 0xC0000357L) #endif #ifndef STATUS_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER # define STATUS_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER ((NTSTATUS) 0xC0000358L) #endif #ifndef STATUS_INVALID_IMAGE_WIN_32 # define STATUS_INVALID_IMAGE_WIN_32 ((NTSTATUS) 0xC0000359L) #endif #ifndef STATUS_INVALID_IMAGE_WIN_64 # define STATUS_INVALID_IMAGE_WIN_64 ((NTSTATUS) 0xC000035AL) #endif #ifndef STATUS_BAD_BINDINGS # define STATUS_BAD_BINDINGS ((NTSTATUS) 0xC000035BL) #endif #ifndef STATUS_NETWORK_SESSION_EXPIRED # define STATUS_NETWORK_SESSION_EXPIRED ((NTSTATUS) 0xC000035CL) #endif #ifndef STATUS_APPHELP_BLOCK # define STATUS_APPHELP_BLOCK ((NTSTATUS) 0xC000035DL) #endif #ifndef STATUS_ALL_SIDS_FILTERED # define STATUS_ALL_SIDS_FILTERED ((NTSTATUS) 0xC000035EL) #endif #ifndef STATUS_NOT_SAFE_MODE_DRIVER # define STATUS_NOT_SAFE_MODE_DRIVER ((NTSTATUS) 0xC000035FL) #endif #ifndef STATUS_ACCESS_DISABLED_BY_POLICY_DEFAULT # define STATUS_ACCESS_DISABLED_BY_POLICY_DEFAULT ((NTSTATUS) 0xC0000361L) #endif #ifndef STATUS_ACCESS_DISABLED_BY_POLICY_PATH # define STATUS_ACCESS_DISABLED_BY_POLICY_PATH ((NTSTATUS) 0xC0000362L) #endif #ifndef STATUS_ACCESS_DISABLED_BY_POLICY_PUBLISHER # define STATUS_ACCESS_DISABLED_BY_POLICY_PUBLISHER ((NTSTATUS) 0xC0000363L) #endif #ifndef STATUS_ACCESS_DISABLED_BY_POLICY_OTHER # define STATUS_ACCESS_DISABLED_BY_POLICY_OTHER ((NTSTATUS) 0xC0000364L) #endif #ifndef STATUS_FAILED_DRIVER_ENTRY # define STATUS_FAILED_DRIVER_ENTRY ((NTSTATUS) 0xC0000365L) #endif #ifndef STATUS_DEVICE_ENUMERATION_ERROR # define STATUS_DEVICE_ENUMERATION_ERROR ((NTSTATUS) 0xC0000366L) #endif #ifndef STATUS_MOUNT_POINT_NOT_RESOLVED # define STATUS_MOUNT_POINT_NOT_RESOLVED ((NTSTATUS) 0xC0000368L) #endif #ifndef STATUS_INVALID_DEVICE_OBJECT_PARAMETER # define STATUS_INVALID_DEVICE_OBJECT_PARAMETER ((NTSTATUS) 0xC0000369L) #endif #ifndef STATUS_MCA_OCCURED # define STATUS_MCA_OCCURED ((NTSTATUS) 0xC000036AL) #endif #ifndef STATUS_DRIVER_BLOCKED_CRITICAL # define STATUS_DRIVER_BLOCKED_CRITICAL ((NTSTATUS) 0xC000036BL) #endif #ifndef STATUS_DRIVER_BLOCKED # define STATUS_DRIVER_BLOCKED ((NTSTATUS) 0xC000036CL) #endif #ifndef STATUS_DRIVER_DATABASE_ERROR # define STATUS_DRIVER_DATABASE_ERROR ((NTSTATUS) 0xC000036DL) #endif #ifndef STATUS_SYSTEM_HIVE_TOO_LARGE # define STATUS_SYSTEM_HIVE_TOO_LARGE ((NTSTATUS) 0xC000036EL) #endif #ifndef STATUS_INVALID_IMPORT_OF_NON_DLL # define STATUS_INVALID_IMPORT_OF_NON_DLL ((NTSTATUS) 0xC000036FL) #endif #ifndef STATUS_DS_SHUTTING_DOWN # define STATUS_DS_SHUTTING_DOWN ((NTSTATUS) 0x40000370L) #endif #ifndef STATUS_NO_SECRETS # define STATUS_NO_SECRETS ((NTSTATUS) 0xC0000371L) #endif #ifndef STATUS_ACCESS_DISABLED_NO_SAFER_UI_BY_POLICY # define STATUS_ACCESS_DISABLED_NO_SAFER_UI_BY_POLICY ((NTSTATUS) 0xC0000372L) #endif #ifndef STATUS_FAILED_STACK_SWITCH # define STATUS_FAILED_STACK_SWITCH ((NTSTATUS) 0xC0000373L) #endif #ifndef STATUS_HEAP_CORRUPTION # define STATUS_HEAP_CORRUPTION ((NTSTATUS) 0xC0000374L) #endif #ifndef STATUS_SMARTCARD_WRONG_PIN # define STATUS_SMARTCARD_WRONG_PIN ((NTSTATUS) 0xC0000380L) #endif #ifndef STATUS_SMARTCARD_CARD_BLOCKED # define STATUS_SMARTCARD_CARD_BLOCKED ((NTSTATUS) 0xC0000381L) #endif #ifndef STATUS_SMARTCARD_CARD_NOT_AUTHENTICATED # define STATUS_SMARTCARD_CARD_NOT_AUTHENTICATED ((NTSTATUS) 0xC0000382L) #endif #ifndef STATUS_SMARTCARD_NO_CARD # define STATUS_SMARTCARD_NO_CARD ((NTSTATUS) 0xC0000383L) #endif #ifndef STATUS_SMARTCARD_NO_KEY_CONTAINER # define STATUS_SMARTCARD_NO_KEY_CONTAINER ((NTSTATUS) 0xC0000384L) #endif #ifndef STATUS_SMARTCARD_NO_CERTIFICATE # define STATUS_SMARTCARD_NO_CERTIFICATE ((NTSTATUS) 0xC0000385L) #endif #ifndef STATUS_SMARTCARD_NO_KEYSET # define STATUS_SMARTCARD_NO_KEYSET ((NTSTATUS) 0xC0000386L) #endif #ifndef STATUS_SMARTCARD_IO_ERROR # define STATUS_SMARTCARD_IO_ERROR ((NTSTATUS) 0xC0000387L) #endif #ifndef STATUS_DOWNGRADE_DETECTED # define STATUS_DOWNGRADE_DETECTED ((NTSTATUS) 0xC0000388L) #endif #ifndef STATUS_SMARTCARD_CERT_REVOKED # define STATUS_SMARTCARD_CERT_REVOKED ((NTSTATUS) 0xC0000389L) #endif #ifndef STATUS_ISSUING_CA_UNTRUSTED # define STATUS_ISSUING_CA_UNTRUSTED ((NTSTATUS) 0xC000038AL) #endif #ifndef STATUS_REVOCATION_OFFLINE_C # define STATUS_REVOCATION_OFFLINE_C ((NTSTATUS) 0xC000038BL) #endif #ifndef STATUS_PKINIT_CLIENT_FAILURE # define STATUS_PKINIT_CLIENT_FAILURE ((NTSTATUS) 0xC000038CL) #endif #ifndef STATUS_SMARTCARD_CERT_EXPIRED # define STATUS_SMARTCARD_CERT_EXPIRED ((NTSTATUS) 0xC000038DL) #endif #ifndef STATUS_DRIVER_FAILED_PRIOR_UNLOAD # define STATUS_DRIVER_FAILED_PRIOR_UNLOAD ((NTSTATUS) 0xC000038EL) #endif #ifndef STATUS_SMARTCARD_SILENT_CONTEXT # define STATUS_SMARTCARD_SILENT_CONTEXT ((NTSTATUS) 0xC000038FL) #endif #ifndef STATUS_PER_USER_TRUST_QUOTA_EXCEEDED # define STATUS_PER_USER_TRUST_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000401L) #endif #ifndef STATUS_ALL_USER_TRUST_QUOTA_EXCEEDED # define STATUS_ALL_USER_TRUST_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000402L) #endif #ifndef STATUS_USER_DELETE_TRUST_QUOTA_EXCEEDED # define STATUS_USER_DELETE_TRUST_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000403L) #endif #ifndef STATUS_DS_NAME_NOT_UNIQUE # define STATUS_DS_NAME_NOT_UNIQUE ((NTSTATUS) 0xC0000404L) #endif #ifndef STATUS_DS_DUPLICATE_ID_FOUND # define STATUS_DS_DUPLICATE_ID_FOUND ((NTSTATUS) 0xC0000405L) #endif #ifndef STATUS_DS_GROUP_CONVERSION_ERROR # define STATUS_DS_GROUP_CONVERSION_ERROR ((NTSTATUS) 0xC0000406L) #endif #ifndef STATUS_VOLSNAP_PREPARE_HIBERNATE # define STATUS_VOLSNAP_PREPARE_HIBERNATE ((NTSTATUS) 0xC0000407L) #endif #ifndef STATUS_USER2USER_REQUIRED # define STATUS_USER2USER_REQUIRED ((NTSTATUS) 0xC0000408L) #endif #ifndef STATUS_STACK_BUFFER_OVERRUN # define STATUS_STACK_BUFFER_OVERRUN ((NTSTATUS) 0xC0000409L) #endif #ifndef STATUS_NO_S4U_PROT_SUPPORT # define STATUS_NO_S4U_PROT_SUPPORT ((NTSTATUS) 0xC000040AL) #endif #ifndef STATUS_CROSSREALM_DELEGATION_FAILURE # define STATUS_CROSSREALM_DELEGATION_FAILURE ((NTSTATUS) 0xC000040BL) #endif #ifndef STATUS_REVOCATION_OFFLINE_KDC # define STATUS_REVOCATION_OFFLINE_KDC ((NTSTATUS) 0xC000040CL) #endif #ifndef STATUS_ISSUING_CA_UNTRUSTED_KDC # define STATUS_ISSUING_CA_UNTRUSTED_KDC ((NTSTATUS) 0xC000040DL) #endif #ifndef STATUS_KDC_CERT_EXPIRED # define STATUS_KDC_CERT_EXPIRED ((NTSTATUS) 0xC000040EL) #endif #ifndef STATUS_KDC_CERT_REVOKED # define STATUS_KDC_CERT_REVOKED ((NTSTATUS) 0xC000040FL) #endif #ifndef STATUS_PARAMETER_QUOTA_EXCEEDED # define STATUS_PARAMETER_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000410L) #endif #ifndef STATUS_HIBERNATION_FAILURE # define STATUS_HIBERNATION_FAILURE ((NTSTATUS) 0xC0000411L) #endif #ifndef STATUS_DELAY_LOAD_FAILED # define STATUS_DELAY_LOAD_FAILED ((NTSTATUS) 0xC0000412L) #endif #ifndef STATUS_AUTHENTICATION_FIREWALL_FAILED # define STATUS_AUTHENTICATION_FIREWALL_FAILED ((NTSTATUS) 0xC0000413L) #endif #ifndef STATUS_VDM_DISALLOWED # define STATUS_VDM_DISALLOWED ((NTSTATUS) 0xC0000414L) #endif #ifndef STATUS_HUNG_DISPLAY_DRIVER_THREAD # define STATUS_HUNG_DISPLAY_DRIVER_THREAD ((NTSTATUS) 0xC0000415L) #endif #ifndef STATUS_INSUFFICIENT_RESOURCE_FOR_SPECIFIED_SHARED_SECTION_SIZE # define STATUS_INSUFFICIENT_RESOURCE_FOR_SPECIFIED_SHARED_SECTION_SIZE ((NTSTATUS) 0xC0000416L) #endif #ifndef STATUS_INVALID_CRUNTIME_PARAMETER # define STATUS_INVALID_CRUNTIME_PARAMETER ((NTSTATUS) 0xC0000417L) #endif #ifndef STATUS_NTLM_BLOCKED # define STATUS_NTLM_BLOCKED ((NTSTATUS) 0xC0000418L) #endif #ifndef STATUS_DS_SRC_SID_EXISTS_IN_FOREST # define STATUS_DS_SRC_SID_EXISTS_IN_FOREST ((NTSTATUS) 0xC0000419L) #endif #ifndef STATUS_DS_DOMAIN_NAME_EXISTS_IN_FOREST # define STATUS_DS_DOMAIN_NAME_EXISTS_IN_FOREST ((NTSTATUS) 0xC000041AL) #endif #ifndef STATUS_DS_FLAT_NAME_EXISTS_IN_FOREST # define STATUS_DS_FLAT_NAME_EXISTS_IN_FOREST ((NTSTATUS) 0xC000041BL) #endif #ifndef STATUS_INVALID_USER_PRINCIPAL_NAME # define STATUS_INVALID_USER_PRINCIPAL_NAME ((NTSTATUS) 0xC000041CL) #endif #ifndef STATUS_FATAL_USER_CALLBACK_EXCEPTION # define STATUS_FATAL_USER_CALLBACK_EXCEPTION ((NTSTATUS) 0xC000041DL) #endif #ifndef STATUS_ASSERTION_FAILURE # define STATUS_ASSERTION_FAILURE ((NTSTATUS) 0xC0000420L) #endif #ifndef STATUS_VERIFIER_STOP # define STATUS_VERIFIER_STOP ((NTSTATUS) 0xC0000421L) #endif #ifndef STATUS_CALLBACK_POP_STACK # define STATUS_CALLBACK_POP_STACK ((NTSTATUS) 0xC0000423L) #endif #ifndef STATUS_INCOMPATIBLE_DRIVER_BLOCKED # define STATUS_INCOMPATIBLE_DRIVER_BLOCKED ((NTSTATUS) 0xC0000424L) #endif #ifndef STATUS_HIVE_UNLOADED # define STATUS_HIVE_UNLOADED ((NTSTATUS) 0xC0000425L) #endif #ifndef STATUS_COMPRESSION_DISABLED # define STATUS_COMPRESSION_DISABLED ((NTSTATUS) 0xC0000426L) #endif #ifndef STATUS_FILE_SYSTEM_LIMITATION # define STATUS_FILE_SYSTEM_LIMITATION ((NTSTATUS) 0xC0000427L) #endif #ifndef STATUS_INVALID_IMAGE_HASH # define STATUS_INVALID_IMAGE_HASH ((NTSTATUS) 0xC0000428L) #endif #ifndef STATUS_NOT_CAPABLE # define STATUS_NOT_CAPABLE ((NTSTATUS) 0xC0000429L) #endif #ifndef STATUS_REQUEST_OUT_OF_SEQUENCE # define STATUS_REQUEST_OUT_OF_SEQUENCE ((NTSTATUS) 0xC000042AL) #endif #ifndef STATUS_IMPLEMENTATION_LIMIT # define STATUS_IMPLEMENTATION_LIMIT ((NTSTATUS) 0xC000042BL) #endif #ifndef STATUS_ELEVATION_REQUIRED # define STATUS_ELEVATION_REQUIRED ((NTSTATUS) 0xC000042CL) #endif #ifndef STATUS_NO_SECURITY_CONTEXT # define STATUS_NO_SECURITY_CONTEXT ((NTSTATUS) 0xC000042DL) #endif #ifndef STATUS_PKU2U_CERT_FAILURE # define STATUS_PKU2U_CERT_FAILURE ((NTSTATUS) 0xC000042FL) #endif #ifndef STATUS_BEYOND_VDL # define STATUS_BEYOND_VDL ((NTSTATUS) 0xC0000432L) #endif #ifndef STATUS_ENCOUNTERED_WRITE_IN_PROGRESS # define STATUS_ENCOUNTERED_WRITE_IN_PROGRESS ((NTSTATUS) 0xC0000433L) #endif #ifndef STATUS_PTE_CHANGED # define STATUS_PTE_CHANGED ((NTSTATUS) 0xC0000434L) #endif #ifndef STATUS_PURGE_FAILED # define STATUS_PURGE_FAILED ((NTSTATUS) 0xC0000435L) #endif #ifndef STATUS_CRED_REQUIRES_CONFIRMATION # define STATUS_CRED_REQUIRES_CONFIRMATION ((NTSTATUS) 0xC0000440L) #endif #ifndef STATUS_CS_ENCRYPTION_INVALID_SERVER_RESPONSE # define STATUS_CS_ENCRYPTION_INVALID_SERVER_RESPONSE ((NTSTATUS) 0xC0000441L) #endif #ifndef STATUS_CS_ENCRYPTION_UNSUPPORTED_SERVER # define STATUS_CS_ENCRYPTION_UNSUPPORTED_SERVER ((NTSTATUS) 0xC0000442L) #endif #ifndef STATUS_CS_ENCRYPTION_EXISTING_ENCRYPTED_FILE # define STATUS_CS_ENCRYPTION_EXISTING_ENCRYPTED_FILE ((NTSTATUS) 0xC0000443L) #endif #ifndef STATUS_CS_ENCRYPTION_NEW_ENCRYPTED_FILE # define STATUS_CS_ENCRYPTION_NEW_ENCRYPTED_FILE ((NTSTATUS) 0xC0000444L) #endif #ifndef STATUS_CS_ENCRYPTION_FILE_NOT_CSE # define STATUS_CS_ENCRYPTION_FILE_NOT_CSE ((NTSTATUS) 0xC0000445L) #endif #ifndef STATUS_INVALID_LABEL # define STATUS_INVALID_LABEL ((NTSTATUS) 0xC0000446L) #endif #ifndef STATUS_DRIVER_PROCESS_TERMINATED # define STATUS_DRIVER_PROCESS_TERMINATED ((NTSTATUS) 0xC0000450L) #endif #ifndef STATUS_AMBIGUOUS_SYSTEM_DEVICE # define STATUS_AMBIGUOUS_SYSTEM_DEVICE ((NTSTATUS) 0xC0000451L) #endif #ifndef STATUS_SYSTEM_DEVICE_NOT_FOUND # define STATUS_SYSTEM_DEVICE_NOT_FOUND ((NTSTATUS) 0xC0000452L) #endif #ifndef STATUS_RESTART_BOOT_APPLICATION # define STATUS_RESTART_BOOT_APPLICATION ((NTSTATUS) 0xC0000453L) #endif #ifndef STATUS_INSUFFICIENT_NVRAM_RESOURCES # define STATUS_INSUFFICIENT_NVRAM_RESOURCES ((NTSTATUS) 0xC0000454L) #endif #ifndef STATUS_INVALID_TASK_NAME # define STATUS_INVALID_TASK_NAME ((NTSTATUS) 0xC0000500L) #endif #ifndef STATUS_INVALID_TASK_INDEX # define STATUS_INVALID_TASK_INDEX ((NTSTATUS) 0xC0000501L) #endif #ifndef STATUS_THREAD_ALREADY_IN_TASK # define STATUS_THREAD_ALREADY_IN_TASK ((NTSTATUS) 0xC0000502L) #endif #ifndef STATUS_CALLBACK_BYPASS # define STATUS_CALLBACK_BYPASS ((NTSTATUS) 0xC0000503L) #endif #ifndef STATUS_FAIL_FAST_EXCEPTION # define STATUS_FAIL_FAST_EXCEPTION ((NTSTATUS) 0xC0000602L) #endif #ifndef STATUS_IMAGE_CERT_REVOKED # define STATUS_IMAGE_CERT_REVOKED ((NTSTATUS) 0xC0000603L) #endif #ifndef STATUS_PORT_CLOSED # define STATUS_PORT_CLOSED ((NTSTATUS) 0xC0000700L) #endif #ifndef STATUS_MESSAGE_LOST # define STATUS_MESSAGE_LOST ((NTSTATUS) 0xC0000701L) #endif #ifndef STATUS_INVALID_MESSAGE # define STATUS_INVALID_MESSAGE ((NTSTATUS) 0xC0000702L) #endif #ifndef STATUS_REQUEST_CANCELED # define STATUS_REQUEST_CANCELED ((NTSTATUS) 0xC0000703L) #endif #ifndef STATUS_RECURSIVE_DISPATCH # define STATUS_RECURSIVE_DISPATCH ((NTSTATUS) 0xC0000704L) #endif #ifndef STATUS_LPC_RECEIVE_BUFFER_EXPECTED # define STATUS_LPC_RECEIVE_BUFFER_EXPECTED ((NTSTATUS) 0xC0000705L) #endif #ifndef STATUS_LPC_INVALID_CONNECTION_USAGE # define STATUS_LPC_INVALID_CONNECTION_USAGE ((NTSTATUS) 0xC0000706L) #endif #ifndef STATUS_LPC_REQUESTS_NOT_ALLOWED # define STATUS_LPC_REQUESTS_NOT_ALLOWED ((NTSTATUS) 0xC0000707L) #endif #ifndef STATUS_RESOURCE_IN_USE # define STATUS_RESOURCE_IN_USE ((NTSTATUS) 0xC0000708L) #endif #ifndef STATUS_HARDWARE_MEMORY_ERROR # define STATUS_HARDWARE_MEMORY_ERROR ((NTSTATUS) 0xC0000709L) #endif #ifndef STATUS_THREADPOOL_HANDLE_EXCEPTION # define STATUS_THREADPOOL_HANDLE_EXCEPTION ((NTSTATUS) 0xC000070AL) #endif #ifndef STATUS_THREADPOOL_SET_EVENT_ON_COMPLETION_FAILED # define STATUS_THREADPOOL_SET_EVENT_ON_COMPLETION_FAILED ((NTSTATUS) 0xC000070BL) #endif #ifndef STATUS_THREADPOOL_RELEASE_SEMAPHORE_ON_COMPLETION_FAILED # define STATUS_THREADPOOL_RELEASE_SEMAPHORE_ON_COMPLETION_FAILED ((NTSTATUS) 0xC000070CL) #endif #ifndef STATUS_THREADPOOL_RELEASE_MUTEX_ON_COMPLETION_FAILED # define STATUS_THREADPOOL_RELEASE_MUTEX_ON_COMPLETION_FAILED ((NTSTATUS) 0xC000070DL) #endif #ifndef STATUS_THREADPOOL_FREE_LIBRARY_ON_COMPLETION_FAILED # define STATUS_THREADPOOL_FREE_LIBRARY_ON_COMPLETION_FAILED ((NTSTATUS) 0xC000070EL) #endif #ifndef STATUS_THREADPOOL_RELEASED_DURING_OPERATION # define STATUS_THREADPOOL_RELEASED_DURING_OPERATION ((NTSTATUS) 0xC000070FL) #endif #ifndef STATUS_CALLBACK_RETURNED_WHILE_IMPERSONATING # define STATUS_CALLBACK_RETURNED_WHILE_IMPERSONATING ((NTSTATUS) 0xC0000710L) #endif #ifndef STATUS_APC_RETURNED_WHILE_IMPERSONATING # define STATUS_APC_RETURNED_WHILE_IMPERSONATING ((NTSTATUS) 0xC0000711L) #endif #ifndef STATUS_PROCESS_IS_PROTECTED # define STATUS_PROCESS_IS_PROTECTED ((NTSTATUS) 0xC0000712L) #endif #ifndef STATUS_MCA_EXCEPTION # define STATUS_MCA_EXCEPTION ((NTSTATUS) 0xC0000713L) #endif #ifndef STATUS_CERTIFICATE_MAPPING_NOT_UNIQUE # define STATUS_CERTIFICATE_MAPPING_NOT_UNIQUE ((NTSTATUS) 0xC0000714L) #endif #ifndef STATUS_SYMLINK_CLASS_DISABLED # define STATUS_SYMLINK_CLASS_DISABLED ((NTSTATUS) 0xC0000715L) #endif #ifndef STATUS_INVALID_IDN_NORMALIZATION # define STATUS_INVALID_IDN_NORMALIZATION ((NTSTATUS) 0xC0000716L) #endif #ifndef STATUS_NO_UNICODE_TRANSLATION # define STATUS_NO_UNICODE_TRANSLATION ((NTSTATUS) 0xC0000717L) #endif #ifndef STATUS_ALREADY_REGISTERED # define STATUS_ALREADY_REGISTERED ((NTSTATUS) 0xC0000718L) #endif #ifndef STATUS_CONTEXT_MISMATCH # define STATUS_CONTEXT_MISMATCH ((NTSTATUS) 0xC0000719L) #endif #ifndef STATUS_PORT_ALREADY_HAS_COMPLETION_LIST # define STATUS_PORT_ALREADY_HAS_COMPLETION_LIST ((NTSTATUS) 0xC000071AL) #endif #ifndef STATUS_CALLBACK_RETURNED_THREAD_PRIORITY # define STATUS_CALLBACK_RETURNED_THREAD_PRIORITY ((NTSTATUS) 0xC000071BL) #endif #ifndef STATUS_INVALID_THREAD # define STATUS_INVALID_THREAD ((NTSTATUS) 0xC000071CL) #endif #ifndef STATUS_CALLBACK_RETURNED_TRANSACTION # define STATUS_CALLBACK_RETURNED_TRANSACTION ((NTSTATUS) 0xC000071DL) #endif #ifndef STATUS_CALLBACK_RETURNED_LDR_LOCK # define STATUS_CALLBACK_RETURNED_LDR_LOCK ((NTSTATUS) 0xC000071EL) #endif #ifndef STATUS_CALLBACK_RETURNED_LANG # define STATUS_CALLBACK_RETURNED_LANG ((NTSTATUS) 0xC000071FL) #endif #ifndef STATUS_CALLBACK_RETURNED_PRI_BACK # define STATUS_CALLBACK_RETURNED_PRI_BACK ((NTSTATUS) 0xC0000720L) #endif #ifndef STATUS_CALLBACK_RETURNED_THREAD_AFFINITY # define STATUS_CALLBACK_RETURNED_THREAD_AFFINITY ((NTSTATUS) 0xC0000721L) #endif #ifndef STATUS_DISK_REPAIR_DISABLED # define STATUS_DISK_REPAIR_DISABLED ((NTSTATUS) 0xC0000800L) #endif #ifndef STATUS_DS_DOMAIN_RENAME_IN_PROGRESS # define STATUS_DS_DOMAIN_RENAME_IN_PROGRESS ((NTSTATUS) 0xC0000801L) #endif #ifndef STATUS_DISK_QUOTA_EXCEEDED # define STATUS_DISK_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000802L) #endif #ifndef STATUS_DATA_LOST_REPAIR # define STATUS_DATA_LOST_REPAIR ((NTSTATUS) 0x80000803L) #endif #ifndef STATUS_CONTENT_BLOCKED # define STATUS_CONTENT_BLOCKED ((NTSTATUS) 0xC0000804L) #endif #ifndef STATUS_BAD_CLUSTERS # define STATUS_BAD_CLUSTERS ((NTSTATUS) 0xC0000805L) #endif #ifndef STATUS_VOLUME_DIRTY # define STATUS_VOLUME_DIRTY ((NTSTATUS) 0xC0000806L) #endif #ifndef STATUS_FILE_CHECKED_OUT # define STATUS_FILE_CHECKED_OUT ((NTSTATUS) 0xC0000901L) #endif #ifndef STATUS_CHECKOUT_REQUIRED # define STATUS_CHECKOUT_REQUIRED ((NTSTATUS) 0xC0000902L) #endif #ifndef STATUS_BAD_FILE_TYPE # define STATUS_BAD_FILE_TYPE ((NTSTATUS) 0xC0000903L) #endif #ifndef STATUS_FILE_TOO_LARGE # define STATUS_FILE_TOO_LARGE ((NTSTATUS) 0xC0000904L) #endif #ifndef STATUS_FORMS_AUTH_REQUIRED # define STATUS_FORMS_AUTH_REQUIRED ((NTSTATUS) 0xC0000905L) #endif #ifndef STATUS_VIRUS_INFECTED # define STATUS_VIRUS_INFECTED ((NTSTATUS) 0xC0000906L) #endif #ifndef STATUS_VIRUS_DELETED # define STATUS_VIRUS_DELETED ((NTSTATUS) 0xC0000907L) #endif #ifndef STATUS_BAD_MCFG_TABLE # define STATUS_BAD_MCFG_TABLE ((NTSTATUS) 0xC0000908L) #endif #ifndef STATUS_CANNOT_BREAK_OPLOCK # define STATUS_CANNOT_BREAK_OPLOCK ((NTSTATUS) 0xC0000909L) #endif #ifndef STATUS_WOW_ASSERTION # define STATUS_WOW_ASSERTION ((NTSTATUS) 0xC0009898L) #endif #ifndef STATUS_INVALID_SIGNATURE # define STATUS_INVALID_SIGNATURE ((NTSTATUS) 0xC000A000L) #endif #ifndef STATUS_HMAC_NOT_SUPPORTED # define STATUS_HMAC_NOT_SUPPORTED ((NTSTATUS) 0xC000A001L) #endif #ifndef STATUS_AUTH_TAG_MISMATCH # define STATUS_AUTH_TAG_MISMATCH ((NTSTATUS) 0xC000A002L) #endif #ifndef STATUS_IPSEC_QUEUE_OVERFLOW # define STATUS_IPSEC_QUEUE_OVERFLOW ((NTSTATUS) 0xC000A010L) #endif #ifndef STATUS_ND_QUEUE_OVERFLOW # define STATUS_ND_QUEUE_OVERFLOW ((NTSTATUS) 0xC000A011L) #endif #ifndef STATUS_HOPLIMIT_EXCEEDED # define STATUS_HOPLIMIT_EXCEEDED ((NTSTATUS) 0xC000A012L) #endif #ifndef STATUS_PROTOCOL_NOT_SUPPORTED # define STATUS_PROTOCOL_NOT_SUPPORTED ((NTSTATUS) 0xC000A013L) #endif #ifndef STATUS_FASTPATH_REJECTED # define STATUS_FASTPATH_REJECTED ((NTSTATUS) 0xC000A014L) #endif #ifndef STATUS_LOST_WRITEBEHIND_DATA_NETWORK_DISCONNECTED # define STATUS_LOST_WRITEBEHIND_DATA_NETWORK_DISCONNECTED ((NTSTATUS) 0xC000A080L) #endif #ifndef STATUS_LOST_WRITEBEHIND_DATA_NETWORK_SERVER_ERROR # define STATUS_LOST_WRITEBEHIND_DATA_NETWORK_SERVER_ERROR ((NTSTATUS) 0xC000A081L) #endif #ifndef STATUS_LOST_WRITEBEHIND_DATA_LOCAL_DISK_ERROR # define STATUS_LOST_WRITEBEHIND_DATA_LOCAL_DISK_ERROR ((NTSTATUS) 0xC000A082L) #endif #ifndef STATUS_XML_PARSE_ERROR # define STATUS_XML_PARSE_ERROR ((NTSTATUS) 0xC000A083L) #endif #ifndef STATUS_XMLDSIG_ERROR # define STATUS_XMLDSIG_ERROR ((NTSTATUS) 0xC000A084L) #endif #ifndef STATUS_WRONG_COMPARTMENT # define STATUS_WRONG_COMPARTMENT ((NTSTATUS) 0xC000A085L) #endif #ifndef STATUS_AUTHIP_FAILURE # define STATUS_AUTHIP_FAILURE ((NTSTATUS) 0xC000A086L) #endif #ifndef STATUS_DS_OID_MAPPED_GROUP_CANT_HAVE_MEMBERS # define STATUS_DS_OID_MAPPED_GROUP_CANT_HAVE_MEMBERS ((NTSTATUS) 0xC000A087L) #endif #ifndef STATUS_DS_OID_NOT_FOUND # define STATUS_DS_OID_NOT_FOUND ((NTSTATUS) 0xC000A088L) #endif #ifndef STATUS_HASH_NOT_SUPPORTED # define STATUS_HASH_NOT_SUPPORTED ((NTSTATUS) 0xC000A100L) #endif #ifndef STATUS_HASH_NOT_PRESENT # define STATUS_HASH_NOT_PRESENT ((NTSTATUS) 0xC000A101L) #endif /* This is not the NTSTATUS_FROM_WIN32 that the DDK provides, because the DDK * got it wrong! */ #ifdef NTSTATUS_FROM_WIN32 # undef NTSTATUS_FROM_WIN32 #endif #define NTSTATUS_FROM_WIN32(error) ((NTSTATUS) (error) <= 0 ? \ ((NTSTATUS) (error)) : ((NTSTATUS) (((error) & 0x0000FFFF) | \ (FACILITY_NTWIN32 << 16) | ERROR_SEVERITY_WARNING))) #ifndef JOB_OBJECT_LIMIT_PROCESS_MEMORY # define JOB_OBJECT_LIMIT_PROCESS_MEMORY 0x00000100 #endif #ifndef JOB_OBJECT_LIMIT_JOB_MEMORY # define JOB_OBJECT_LIMIT_JOB_MEMORY 0x00000200 #endif #ifndef JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION # define JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION 0x00000400 #endif #ifndef JOB_OBJECT_LIMIT_BREAKAWAY_OK # define JOB_OBJECT_LIMIT_BREAKAWAY_OK 0x00000800 #endif #ifndef JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK # define JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK 0x00001000 #endif #ifndef JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE # define JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 0x00002000 #endif #ifndef SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE # define SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE 0x00000002 #endif /* from winternl.h */ #if !defined(__UNICODE_STRING_DEFINED) && defined(__MINGW32__) #define __UNICODE_STRING_DEFINED #endif typedef struct _UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR Buffer; } UNICODE_STRING, *PUNICODE_STRING; typedef const UNICODE_STRING *PCUNICODE_STRING; /* from ntifs.h */ #ifndef DEVICE_TYPE # define DEVICE_TYPE DWORD #endif /* MinGW already has a definition for REPARSE_DATA_BUFFER, but mingw-w64 does * not. */ #if defined(_MSC_VER) || defined(__MINGW64_VERSION_MAJOR) typedef struct _REPARSE_DATA_BUFFER { ULONG ReparseTag; USHORT ReparseDataLength; USHORT Reserved; union { struct { USHORT SubstituteNameOffset; USHORT SubstituteNameLength; USHORT PrintNameOffset; USHORT PrintNameLength; ULONG Flags; WCHAR PathBuffer[1]; } SymbolicLinkReparseBuffer; struct { USHORT SubstituteNameOffset; USHORT SubstituteNameLength; USHORT PrintNameOffset; USHORT PrintNameLength; WCHAR PathBuffer[1]; } MountPointReparseBuffer; struct { UCHAR DataBuffer[1]; } GenericReparseBuffer; struct { ULONG StringCount; WCHAR StringList[1]; } AppExecLinkReparseBuffer; }; } REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER; #endif typedef struct _IO_STATUS_BLOCK { union { NTSTATUS Status; PVOID Pointer; }; ULONG_PTR Information; } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; typedef enum _FILE_INFORMATION_CLASS { FileDirectoryInformation = 1, FileFullDirectoryInformation, FileBothDirectoryInformation, FileBasicInformation, FileStandardInformation, FileInternalInformation, FileEaInformation, FileAccessInformation, FileNameInformation, FileRenameInformation, FileLinkInformation, FileNamesInformation, FileDispositionInformation, FilePositionInformation, FileFullEaInformation, FileModeInformation, FileAlignmentInformation, FileAllInformation, FileAllocationInformation, FileEndOfFileInformation, FileAlternateNameInformation, FileStreamInformation, FilePipeInformation, FilePipeLocalInformation, FilePipeRemoteInformation, FileMailslotQueryInformation, FileMailslotSetInformation, FileCompressionInformation, FileObjectIdInformation, FileCompletionInformation, FileMoveClusterInformation, FileQuotaInformation, FileReparsePointInformation, FileNetworkOpenInformation, FileAttributeTagInformation, FileTrackingInformation, FileIdBothDirectoryInformation, FileIdFullDirectoryInformation, FileValidDataLengthInformation, FileShortNameInformation, FileIoCompletionNotificationInformation, FileIoStatusBlockRangeInformation, FileIoPriorityHintInformation, FileSfioReserveInformation, FileSfioVolumeInformation, FileHardLinkInformation, FileProcessIdsUsingFileInformation, FileNormalizedNameInformation, FileNetworkPhysicalNameInformation, FileIdGlobalTxDirectoryInformation, FileIsRemoteDeviceInformation, FileAttributeCacheInformation, FileNumaNodeInformation, FileStandardLinkInformation, FileRemoteProtocolInformation, FileMaximumInformation } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS; typedef struct _FILE_DIRECTORY_INFORMATION { ULONG NextEntryOffset; ULONG FileIndex; LARGE_INTEGER CreationTime; LARGE_INTEGER LastAccessTime; LARGE_INTEGER LastWriteTime; LARGE_INTEGER ChangeTime; LARGE_INTEGER EndOfFile; LARGE_INTEGER AllocationSize; ULONG FileAttributes; ULONG FileNameLength; WCHAR FileName[1]; } FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION; typedef struct _FILE_BOTH_DIR_INFORMATION { ULONG NextEntryOffset; ULONG FileIndex; LARGE_INTEGER CreationTime; LARGE_INTEGER LastAccessTime; LARGE_INTEGER LastWriteTime; LARGE_INTEGER ChangeTime; LARGE_INTEGER EndOfFile; LARGE_INTEGER AllocationSize; ULONG FileAttributes; ULONG FileNameLength; ULONG EaSize; CCHAR ShortNameLength; WCHAR ShortName[12]; WCHAR FileName[1]; } FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION; typedef struct _FILE_BASIC_INFORMATION { LARGE_INTEGER CreationTime; LARGE_INTEGER LastAccessTime; LARGE_INTEGER LastWriteTime; LARGE_INTEGER ChangeTime; DWORD FileAttributes; } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION; typedef struct _FILE_STANDARD_INFORMATION { LARGE_INTEGER AllocationSize; LARGE_INTEGER EndOfFile; ULONG NumberOfLinks; BOOLEAN DeletePending; BOOLEAN Directory; } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION; typedef struct _FILE_INTERNAL_INFORMATION { LARGE_INTEGER IndexNumber; } FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION; typedef struct _FILE_EA_INFORMATION { ULONG EaSize; } FILE_EA_INFORMATION, *PFILE_EA_INFORMATION; typedef struct _FILE_ACCESS_INFORMATION { ACCESS_MASK AccessFlags; } FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION; typedef struct _FILE_POSITION_INFORMATION { LARGE_INTEGER CurrentByteOffset; } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION; typedef struct _FILE_MODE_INFORMATION { ULONG Mode; } FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION; typedef struct _FILE_ALIGNMENT_INFORMATION { ULONG AlignmentRequirement; } FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION; typedef struct _FILE_NAME_INFORMATION { ULONG FileNameLength; WCHAR FileName[1]; } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION; typedef struct _FILE_END_OF_FILE_INFORMATION { LARGE_INTEGER EndOfFile; } FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION; typedef struct _FILE_ALL_INFORMATION { FILE_BASIC_INFORMATION BasicInformation; FILE_STANDARD_INFORMATION StandardInformation; FILE_INTERNAL_INFORMATION InternalInformation; FILE_EA_INFORMATION EaInformation; FILE_ACCESS_INFORMATION AccessInformation; FILE_POSITION_INFORMATION PositionInformation; FILE_MODE_INFORMATION ModeInformation; FILE_ALIGNMENT_INFORMATION AlignmentInformation; FILE_NAME_INFORMATION NameInformation; } FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION; typedef struct _FILE_DISPOSITION_INFORMATION { BOOLEAN DeleteFile; } FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION; typedef struct _FILE_PIPE_LOCAL_INFORMATION { ULONG NamedPipeType; ULONG NamedPipeConfiguration; ULONG MaximumInstances; ULONG CurrentInstances; ULONG InboundQuota; ULONG ReadDataAvailable; ULONG OutboundQuota; ULONG WriteQuotaAvailable; ULONG NamedPipeState; ULONG NamedPipeEnd; } FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION; #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020 typedef enum _FS_INFORMATION_CLASS { FileFsVolumeInformation = 1, FileFsLabelInformation = 2, FileFsSizeInformation = 3, FileFsDeviceInformation = 4, FileFsAttributeInformation = 5, FileFsControlInformation = 6, FileFsFullSizeInformation = 7, FileFsObjectIdInformation = 8, FileFsDriverPathInformation = 9, FileFsVolumeFlagsInformation = 10, FileFsSectorSizeInformation = 11 } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS; typedef struct _FILE_FS_VOLUME_INFORMATION { LARGE_INTEGER VolumeCreationTime; ULONG VolumeSerialNumber; ULONG VolumeLabelLength; BOOLEAN SupportsObjects; WCHAR VolumeLabel[1]; } FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION; typedef struct _FILE_FS_LABEL_INFORMATION { ULONG VolumeLabelLength; WCHAR VolumeLabel[1]; } FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION; typedef struct _FILE_FS_SIZE_INFORMATION { LARGE_INTEGER TotalAllocationUnits; LARGE_INTEGER AvailableAllocationUnits; ULONG SectorsPerAllocationUnit; ULONG BytesPerSector; } FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION; typedef struct _FILE_FS_DEVICE_INFORMATION { DEVICE_TYPE DeviceType; ULONG Characteristics; } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION; typedef struct _FILE_FS_ATTRIBUTE_INFORMATION { ULONG FileSystemAttributes; LONG MaximumComponentNameLength; ULONG FileSystemNameLength; WCHAR FileSystemName[1]; } FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION; typedef struct _FILE_FS_CONTROL_INFORMATION { LARGE_INTEGER FreeSpaceStartFiltering; LARGE_INTEGER FreeSpaceThreshold; LARGE_INTEGER FreeSpaceStopFiltering; LARGE_INTEGER DefaultQuotaThreshold; LARGE_INTEGER DefaultQuotaLimit; ULONG FileSystemControlFlags; } FILE_FS_CONTROL_INFORMATION, *PFILE_FS_CONTROL_INFORMATION; typedef struct _FILE_FS_FULL_SIZE_INFORMATION { LARGE_INTEGER TotalAllocationUnits; LARGE_INTEGER CallerAvailableAllocationUnits; LARGE_INTEGER ActualAvailableAllocationUnits; ULONG SectorsPerAllocationUnit; ULONG BytesPerSector; } FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION; typedef struct _FILE_FS_OBJECTID_INFORMATION { UCHAR ObjectId[16]; UCHAR ExtendedInfo[48]; } FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION; typedef struct _FILE_FS_DRIVER_PATH_INFORMATION { BOOLEAN DriverInPath; ULONG DriverNameLength; WCHAR DriverName[1]; } FILE_FS_DRIVER_PATH_INFORMATION, *PFILE_FS_DRIVER_PATH_INFORMATION; typedef struct _FILE_FS_VOLUME_FLAGS_INFORMATION { ULONG Flags; } FILE_FS_VOLUME_FLAGS_INFORMATION, *PFILE_FS_VOLUME_FLAGS_INFORMATION; typedef struct _FILE_FS_SECTOR_SIZE_INFORMATION { ULONG LogicalBytesPerSector; ULONG PhysicalBytesPerSectorForAtomicity; ULONG PhysicalBytesPerSectorForPerformance; ULONG FileSystemEffectivePhysicalBytesPerSectorForAtomicity; ULONG Flags; ULONG ByteOffsetForSectorAlignment; ULONG ByteOffsetForPartitionAlignment; } FILE_FS_SECTOR_SIZE_INFORMATION, *PFILE_FS_SECTOR_SIZE_INFORMATION; typedef struct _SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION { LARGE_INTEGER IdleTime; LARGE_INTEGER KernelTime; LARGE_INTEGER UserTime; LARGE_INTEGER DpcTime; LARGE_INTEGER InterruptTime; ULONG InterruptCount; } SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION, *PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION; #ifndef SystemProcessorPerformanceInformation # define SystemProcessorPerformanceInformation 8 #endif #ifndef ProcessConsoleHostProcess # define ProcessConsoleHostProcess 49 #endif #ifndef FILE_DEVICE_FILE_SYSTEM # define FILE_DEVICE_FILE_SYSTEM 0x00000009 #endif #ifndef FILE_DEVICE_NETWORK # define FILE_DEVICE_NETWORK 0x00000012 #endif #ifndef METHOD_BUFFERED # define METHOD_BUFFERED 0 #endif #ifndef METHOD_IN_DIRECT # define METHOD_IN_DIRECT 1 #endif #ifndef METHOD_OUT_DIRECT # define METHOD_OUT_DIRECT 2 #endif #ifndef METHOD_NEITHER #define METHOD_NEITHER 3 #endif #ifndef METHOD_DIRECT_TO_HARDWARE # define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT #endif #ifndef METHOD_DIRECT_FROM_HARDWARE # define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT #endif #ifndef FILE_ANY_ACCESS # define FILE_ANY_ACCESS 0 #endif #ifndef FILE_SPECIAL_ACCESS # define FILE_SPECIAL_ACCESS (FILE_ANY_ACCESS) #endif #ifndef FILE_READ_ACCESS # define FILE_READ_ACCESS 0x0001 #endif #ifndef FILE_WRITE_ACCESS # define FILE_WRITE_ACCESS 0x0002 #endif #ifndef CTL_CODE # define CTL_CODE(device_type, function, method, access) \ (((device_type) << 16) | ((access) << 14) | ((function) << 2) | (method)) #endif #ifndef FSCTL_SET_REPARSE_POINT # define FSCTL_SET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, \ 41, \ METHOD_BUFFERED, \ FILE_SPECIAL_ACCESS) #endif #ifndef FSCTL_GET_REPARSE_POINT # define FSCTL_GET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, \ 42, \ METHOD_BUFFERED, \ FILE_ANY_ACCESS) #endif #ifndef FSCTL_DELETE_REPARSE_POINT # define FSCTL_DELETE_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, \ 43, \ METHOD_BUFFERED, \ FILE_SPECIAL_ACCESS) #endif #ifndef IO_REPARSE_TAG_SYMLINK # define IO_REPARSE_TAG_SYMLINK (0xA000000CL) #endif #ifndef IO_REPARSE_TAG_APPEXECLINK # define IO_REPARSE_TAG_APPEXECLINK (0x8000001BL) #endif typedef VOID (NTAPI *PIO_APC_ROUTINE) (PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, ULONG Reserved); typedef NTSTATUS (NTAPI *sRtlGetVersion) (PRTL_OSVERSIONINFOW lpVersionInformation); typedef ULONG (NTAPI *sRtlNtStatusToDosError) (NTSTATUS Status); typedef NTSTATUS (NTAPI *sNtDeviceIoControlFile) (HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, ULONG IoControlCode, PVOID InputBuffer, ULONG InputBufferLength, PVOID OutputBuffer, ULONG OutputBufferLength); typedef NTSTATUS (NTAPI *sNtQueryInformationFile) (HANDLE FileHandle, PIO_STATUS_BLOCK IoStatusBlock, PVOID FileInformation, ULONG Length, FILE_INFORMATION_CLASS FileInformationClass); typedef NTSTATUS (NTAPI *sNtSetInformationFile) (HANDLE FileHandle, PIO_STATUS_BLOCK IoStatusBlock, PVOID FileInformation, ULONG Length, FILE_INFORMATION_CLASS FileInformationClass); typedef NTSTATUS (NTAPI *sNtQueryVolumeInformationFile) (HANDLE FileHandle, PIO_STATUS_BLOCK IoStatusBlock, PVOID FsInformation, ULONG Length, FS_INFORMATION_CLASS FsInformationClass); typedef NTSTATUS (NTAPI *sNtQuerySystemInformation) (UINT SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength); typedef NTSTATUS (NTAPI *sNtQueryDirectoryFile) (HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, PVOID FileInformation, ULONG Length, FILE_INFORMATION_CLASS FileInformationClass, BOOLEAN ReturnSingleEntry, PUNICODE_STRING FileName, BOOLEAN RestartScan ); typedef NTSTATUS (NTAPI *sNtQueryInformationProcess) (HANDLE ProcessHandle, UINT ProcessInformationClass, PVOID ProcessInformation, ULONG Length, PULONG ReturnLength); /* * Kernel32 headers */ #ifndef FILE_SKIP_COMPLETION_PORT_ON_SUCCESS # define FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 0x1 #endif #ifndef FILE_SKIP_SET_EVENT_ON_HANDLE # define FILE_SKIP_SET_EVENT_ON_HANDLE 0x2 #endif #ifndef SYMBOLIC_LINK_FLAG_DIRECTORY # define SYMBOLIC_LINK_FLAG_DIRECTORY 0x1 #endif #if defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR) typedef struct _OVERLAPPED_ENTRY { ULONG_PTR lpCompletionKey; LPOVERLAPPED lpOverlapped; ULONG_PTR Internal; DWORD dwNumberOfBytesTransferred; } OVERLAPPED_ENTRY, *LPOVERLAPPED_ENTRY; #endif /* from wincon.h */ #ifndef ENABLE_INSERT_MODE # define ENABLE_INSERT_MODE 0x20 #endif #ifndef ENABLE_QUICK_EDIT_MODE # define ENABLE_QUICK_EDIT_MODE 0x40 #endif #ifndef ENABLE_EXTENDED_FLAGS # define ENABLE_EXTENDED_FLAGS 0x80 #endif /* from winerror.h */ #ifndef ERROR_ELEVATION_REQUIRED # define ERROR_ELEVATION_REQUIRED 740 #endif #ifndef ERROR_SYMLINK_NOT_SUPPORTED # define ERROR_SYMLINK_NOT_SUPPORTED 1464 #endif #ifndef ERROR_MUI_FILE_NOT_FOUND # define ERROR_MUI_FILE_NOT_FOUND 15100 #endif #ifndef ERROR_MUI_INVALID_FILE # define ERROR_MUI_INVALID_FILE 15101 #endif #ifndef ERROR_MUI_INVALID_RC_CONFIG # define ERROR_MUI_INVALID_RC_CONFIG 15102 #endif #ifndef ERROR_MUI_INVALID_LOCALE_NAME # define ERROR_MUI_INVALID_LOCALE_NAME 15103 #endif #ifndef ERROR_MUI_INVALID_ULTIMATEFALLBACK_NAME # define ERROR_MUI_INVALID_ULTIMATEFALLBACK_NAME 15104 #endif #ifndef ERROR_MUI_FILE_NOT_LOADED # define ERROR_MUI_FILE_NOT_LOADED 15105 #endif typedef BOOL (WINAPI *sGetQueuedCompletionStatusEx) (HANDLE CompletionPort, LPOVERLAPPED_ENTRY lpCompletionPortEntries, ULONG ulCount, PULONG ulNumEntriesRemoved, DWORD dwMilliseconds, BOOL fAlertable); /* from powerbase.h */ #ifndef DEVICE_NOTIFY_CALLBACK # define DEVICE_NOTIFY_CALLBACK 2 #endif #ifndef PBT_APMRESUMEAUTOMATIC # define PBT_APMRESUMEAUTOMATIC 18 #endif #ifndef PBT_APMRESUMESUSPEND # define PBT_APMRESUMESUSPEND 7 #endif typedef ULONG CALLBACK _DEVICE_NOTIFY_CALLBACK_ROUTINE( PVOID Context, ULONG Type, PVOID Setting ); typedef _DEVICE_NOTIFY_CALLBACK_ROUTINE* _PDEVICE_NOTIFY_CALLBACK_ROUTINE; typedef struct _DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS { _PDEVICE_NOTIFY_CALLBACK_ROUTINE Callback; PVOID Context; } _DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS, *_PDEVICE_NOTIFY_SUBSCRIBE_PARAMETERS; typedef PVOID _HPOWERNOTIFY; typedef _HPOWERNOTIFY *_PHPOWERNOTIFY; typedef DWORD (WINAPI *sPowerRegisterSuspendResumeNotification) (DWORD Flags, HANDLE Recipient, _PHPOWERNOTIFY RegistrationHandle); /* from Winuser.h */ typedef VOID (CALLBACK* WINEVENTPROC) (HWINEVENTHOOK hWinEventHook, DWORD event, HWND hwnd, LONG idObject, LONG idChild, DWORD idEventThread, DWORD dwmsEventTime); typedef HWINEVENTHOOK (WINAPI *sSetWinEventHook) (UINT eventMin, UINT eventMax, HMODULE hmodWinEventProc, WINEVENTPROC lpfnWinEventProc, DWORD idProcess, DWORD idThread, UINT dwflags); /* Ntdll function pointers */ extern sRtlGetVersion pRtlGetVersion; extern sRtlNtStatusToDosError pRtlNtStatusToDosError; extern sNtDeviceIoControlFile pNtDeviceIoControlFile; extern sNtQueryInformationFile pNtQueryInformationFile; extern sNtSetInformationFile pNtSetInformationFile; extern sNtQueryVolumeInformationFile pNtQueryVolumeInformationFile; extern sNtQueryDirectoryFile pNtQueryDirectoryFile; extern sNtQuerySystemInformation pNtQuerySystemInformation; extern sNtQueryInformationProcess pNtQueryInformationProcess; /* Kernel32 function pointers */ extern sGetQueuedCompletionStatusEx pGetQueuedCompletionStatusEx; /* Powrprof.dll function pointer */ extern sPowerRegisterSuspendResumeNotification pPowerRegisterSuspendResumeNotification; /* User32.dll function pointer */ extern sSetWinEventHook pSetWinEventHook; #endif /* UV_WIN_WINAPI_H_ */ ================================================ FILE: external/libuv/src/win/winsock.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include "uv.h" #include "internal.h" /* Whether there are any non-IFS LSPs stacked on TCP */ int uv_tcp_non_ifs_lsp_ipv4; int uv_tcp_non_ifs_lsp_ipv6; /* Ip address used to bind to any port at any interface */ struct sockaddr_in uv_addr_ip4_any_; struct sockaddr_in6 uv_addr_ip6_any_; /* * Retrieves the pointer to a winsock extension function. */ static BOOL uv_get_extension_function(SOCKET socket, GUID guid, void **target) { int result; DWORD bytes; result = WSAIoctl(socket, SIO_GET_EXTENSION_FUNCTION_POINTER, &guid, sizeof(guid), (void*)target, sizeof(*target), &bytes, NULL, NULL); if (result == SOCKET_ERROR) { *target = NULL; return FALSE; } else { return TRUE; } } BOOL uv_get_acceptex_function(SOCKET socket, LPFN_ACCEPTEX* target) { const GUID wsaid_acceptex = WSAID_ACCEPTEX; return uv_get_extension_function(socket, wsaid_acceptex, (void**)target); } BOOL uv_get_connectex_function(SOCKET socket, LPFN_CONNECTEX* target) { const GUID wsaid_connectex = WSAID_CONNECTEX; return uv_get_extension_function(socket, wsaid_connectex, (void**)target); } void uv_winsock_init(void) { WSADATA wsa_data; int errorno; SOCKET dummy; WSAPROTOCOL_INFOW protocol_info; int opt_len; /* Set implicit binding address used by connectEx */ if (uv_ip4_addr("0.0.0.0", 0, &uv_addr_ip4_any_)) { abort(); } if (uv_ip6_addr("::", 0, &uv_addr_ip6_any_)) { abort(); } /* Skip initialization in safe mode without network support */ if (1 == GetSystemMetrics(SM_CLEANBOOT)) return; /* Initialize winsock */ errorno = WSAStartup(MAKEWORD(2, 2), &wsa_data); if (errorno != 0) { uv_fatal_error(errorno, "WSAStartup"); } /* Try to detect non-IFS LSPs */ uv_tcp_non_ifs_lsp_ipv4 = 1; dummy = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); if (dummy != INVALID_SOCKET) { opt_len = (int) sizeof protocol_info; if (getsockopt(dummy, SOL_SOCKET, SO_PROTOCOL_INFOW, (char*) &protocol_info, &opt_len) == 0) { if (protocol_info.dwServiceFlags1 & XP1_IFS_HANDLES) uv_tcp_non_ifs_lsp_ipv4 = 0; } closesocket(dummy); } /* Try to detect IPV6 support and non-IFS LSPs */ uv_tcp_non_ifs_lsp_ipv6 = 1; dummy = socket(AF_INET6, SOCK_STREAM, IPPROTO_IP); if (dummy != INVALID_SOCKET) { opt_len = (int) sizeof protocol_info; if (getsockopt(dummy, SOL_SOCKET, SO_PROTOCOL_INFOW, (char*) &protocol_info, &opt_len) == 0) { if (protocol_info.dwServiceFlags1 & XP1_IFS_HANDLES) uv_tcp_non_ifs_lsp_ipv6 = 0; } closesocket(dummy); } } int uv_ntstatus_to_winsock_error(NTSTATUS status) { switch (status) { case STATUS_SUCCESS: return ERROR_SUCCESS; case STATUS_PENDING: return ERROR_IO_PENDING; case STATUS_INVALID_HANDLE: case STATUS_OBJECT_TYPE_MISMATCH: return WSAENOTSOCK; case STATUS_INSUFFICIENT_RESOURCES: case STATUS_PAGEFILE_QUOTA: case STATUS_COMMITMENT_LIMIT: case STATUS_WORKING_SET_QUOTA: case STATUS_NO_MEMORY: case STATUS_QUOTA_EXCEEDED: case STATUS_TOO_MANY_PAGING_FILES: case STATUS_REMOTE_RESOURCES: return WSAENOBUFS; case STATUS_TOO_MANY_ADDRESSES: case STATUS_SHARING_VIOLATION: case STATUS_ADDRESS_ALREADY_EXISTS: return WSAEADDRINUSE; case STATUS_LINK_TIMEOUT: case STATUS_IO_TIMEOUT: case STATUS_TIMEOUT: return WSAETIMEDOUT; case STATUS_GRACEFUL_DISCONNECT: return WSAEDISCON; case STATUS_REMOTE_DISCONNECT: case STATUS_CONNECTION_RESET: case STATUS_LINK_FAILED: case STATUS_CONNECTION_DISCONNECTED: case STATUS_PORT_UNREACHABLE: case STATUS_HOPLIMIT_EXCEEDED: return WSAECONNRESET; case STATUS_LOCAL_DISCONNECT: case STATUS_TRANSACTION_ABORTED: case STATUS_CONNECTION_ABORTED: return WSAECONNABORTED; case STATUS_BAD_NETWORK_PATH: case STATUS_NETWORK_UNREACHABLE: case STATUS_PROTOCOL_UNREACHABLE: return WSAENETUNREACH; case STATUS_HOST_UNREACHABLE: return WSAEHOSTUNREACH; case STATUS_CANCELLED: case STATUS_REQUEST_ABORTED: return WSAEINTR; case STATUS_BUFFER_OVERFLOW: case STATUS_INVALID_BUFFER_SIZE: return WSAEMSGSIZE; case STATUS_BUFFER_TOO_SMALL: case STATUS_ACCESS_VIOLATION: return WSAEFAULT; case STATUS_DEVICE_NOT_READY: case STATUS_REQUEST_NOT_ACCEPTED: return WSAEWOULDBLOCK; case STATUS_INVALID_NETWORK_RESPONSE: case STATUS_NETWORK_BUSY: case STATUS_NO_SUCH_DEVICE: case STATUS_NO_SUCH_FILE: case STATUS_OBJECT_PATH_NOT_FOUND: case STATUS_OBJECT_NAME_NOT_FOUND: case STATUS_UNEXPECTED_NETWORK_ERROR: return WSAENETDOWN; case STATUS_INVALID_CONNECTION: return WSAENOTCONN; case STATUS_REMOTE_NOT_LISTENING: case STATUS_CONNECTION_REFUSED: return WSAECONNREFUSED; case STATUS_PIPE_DISCONNECTED: return WSAESHUTDOWN; case STATUS_CONFLICTING_ADDRESSES: case STATUS_INVALID_ADDRESS: case STATUS_INVALID_ADDRESS_COMPONENT: return WSAEADDRNOTAVAIL; case STATUS_NOT_SUPPORTED: case STATUS_NOT_IMPLEMENTED: return WSAEOPNOTSUPP; case STATUS_ACCESS_DENIED: return WSAEACCES; default: if ((status & (FACILITY_NTWIN32 << 16)) == (FACILITY_NTWIN32 << 16) && (status & (ERROR_SEVERITY_ERROR | ERROR_SEVERITY_WARNING))) { /* It's a windows error that has been previously mapped to an ntstatus * code. */ return (DWORD) (status & 0xffff); } else { /* The default fallback for unmappable ntstatus codes. */ return WSAEINVAL; } } } /* * This function provides a workaround for a bug in the winsock implementation * of WSARecv. The problem is that when SetFileCompletionNotificationModes is * used to avoid IOCP notifications of completed reads, WSARecv does not * reliably indicate whether we can expect a completion package to be posted * when the receive buffer is smaller than the received datagram. * * However it is desirable to use SetFileCompletionNotificationModes because * it yields a massive performance increase. * * This function provides a workaround for that bug, but it only works for the * specific case that we need it for. E.g. it assumes that the "avoid iocp" * bit has been set, and supports only overlapped operation. It also requires * the user to use the default msafd driver, doesn't work when other LSPs are * stacked on top of it. */ int WSAAPI uv_wsarecv_workaround(SOCKET socket, WSABUF* buffers, DWORD buffer_count, DWORD* bytes, DWORD* flags, WSAOVERLAPPED *overlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine) { NTSTATUS status; void* apc_context; IO_STATUS_BLOCK* iosb = (IO_STATUS_BLOCK*) &overlapped->Internal; AFD_RECV_INFO info; DWORD error; if (overlapped == NULL || completion_routine != NULL) { WSASetLastError(WSAEINVAL); return SOCKET_ERROR; } info.BufferArray = buffers; info.BufferCount = buffer_count; info.AfdFlags = AFD_OVERLAPPED; info.TdiFlags = TDI_RECEIVE_NORMAL; if (*flags & MSG_PEEK) { info.TdiFlags |= TDI_RECEIVE_PEEK; } if (*flags & MSG_PARTIAL) { info.TdiFlags |= TDI_RECEIVE_PARTIAL; } if (!((intptr_t) overlapped->hEvent & 1)) { apc_context = (void*) overlapped; } else { apc_context = NULL; } iosb->Status = STATUS_PENDING; iosb->Pointer = 0; status = pNtDeviceIoControlFile((HANDLE) socket, overlapped->hEvent, NULL, apc_context, iosb, IOCTL_AFD_RECEIVE, &info, sizeof(info), NULL, 0); *flags = 0; *bytes = (DWORD) iosb->Information; switch (status) { case STATUS_SUCCESS: error = ERROR_SUCCESS; break; case STATUS_PENDING: error = WSA_IO_PENDING; break; case STATUS_BUFFER_OVERFLOW: error = WSAEMSGSIZE; break; case STATUS_RECEIVE_EXPEDITED: error = ERROR_SUCCESS; *flags = MSG_OOB; break; case STATUS_RECEIVE_PARTIAL_EXPEDITED: error = ERROR_SUCCESS; *flags = MSG_PARTIAL | MSG_OOB; break; case STATUS_RECEIVE_PARTIAL: error = ERROR_SUCCESS; *flags = MSG_PARTIAL; break; default: error = uv_ntstatus_to_winsock_error(status); break; } WSASetLastError(error); if (error == ERROR_SUCCESS) { return 0; } else { return SOCKET_ERROR; } } /* See description of uv_wsarecv_workaround. */ int WSAAPI uv_wsarecvfrom_workaround(SOCKET socket, WSABUF* buffers, DWORD buffer_count, DWORD* bytes, DWORD* flags, struct sockaddr* addr, int* addr_len, WSAOVERLAPPED *overlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine) { NTSTATUS status; void* apc_context; IO_STATUS_BLOCK* iosb = (IO_STATUS_BLOCK*) &overlapped->Internal; AFD_RECV_DATAGRAM_INFO info; DWORD error; if (overlapped == NULL || addr == NULL || addr_len == NULL || completion_routine != NULL) { WSASetLastError(WSAEINVAL); return SOCKET_ERROR; } info.BufferArray = buffers; info.BufferCount = buffer_count; info.AfdFlags = AFD_OVERLAPPED; info.TdiFlags = TDI_RECEIVE_NORMAL; info.Address = addr; info.AddressLength = addr_len; if (*flags & MSG_PEEK) { info.TdiFlags |= TDI_RECEIVE_PEEK; } if (*flags & MSG_PARTIAL) { info.TdiFlags |= TDI_RECEIVE_PARTIAL; } if (!((intptr_t) overlapped->hEvent & 1)) { apc_context = (void*) overlapped; } else { apc_context = NULL; } iosb->Status = STATUS_PENDING; iosb->Pointer = 0; status = pNtDeviceIoControlFile((HANDLE) socket, overlapped->hEvent, NULL, apc_context, iosb, IOCTL_AFD_RECEIVE_DATAGRAM, &info, sizeof(info), NULL, 0); *flags = 0; *bytes = (DWORD) iosb->Information; switch (status) { case STATUS_SUCCESS: error = ERROR_SUCCESS; break; case STATUS_PENDING: error = WSA_IO_PENDING; break; case STATUS_BUFFER_OVERFLOW: error = WSAEMSGSIZE; break; case STATUS_RECEIVE_EXPEDITED: error = ERROR_SUCCESS; *flags = MSG_OOB; break; case STATUS_RECEIVE_PARTIAL_EXPEDITED: error = ERROR_SUCCESS; *flags = MSG_PARTIAL | MSG_OOB; break; case STATUS_RECEIVE_PARTIAL: error = ERROR_SUCCESS; *flags = MSG_PARTIAL; break; default: error = uv_ntstatus_to_winsock_error(status); break; } WSASetLastError(error); if (error == ERROR_SUCCESS) { return 0; } else { return SOCKET_ERROR; } } int WSAAPI uv_msafd_poll(SOCKET socket, AFD_POLL_INFO* info_in, AFD_POLL_INFO* info_out, OVERLAPPED* overlapped) { IO_STATUS_BLOCK iosb; IO_STATUS_BLOCK* iosb_ptr; HANDLE event = NULL; void* apc_context; NTSTATUS status; DWORD error; if (overlapped != NULL) { /* Overlapped operation. */ iosb_ptr = (IO_STATUS_BLOCK*) &overlapped->Internal; event = overlapped->hEvent; /* Do not report iocp completion if hEvent is tagged. */ if ((uintptr_t) event & 1) { event = (HANDLE)((uintptr_t) event & ~(uintptr_t) 1); apc_context = NULL; } else { apc_context = overlapped; } } else { /* Blocking operation. */ iosb_ptr = &iosb; event = CreateEvent(NULL, FALSE, FALSE, NULL); if (event == NULL) { return SOCKET_ERROR; } apc_context = NULL; } iosb_ptr->Status = STATUS_PENDING; status = pNtDeviceIoControlFile((HANDLE) socket, event, NULL, apc_context, iosb_ptr, IOCTL_AFD_POLL, info_in, sizeof *info_in, info_out, sizeof *info_out); if (overlapped == NULL) { /* If this is a blocking operation, wait for the event to become signaled, * and then grab the real status from the io status block. */ if (status == STATUS_PENDING) { DWORD r = WaitForSingleObject(event, INFINITE); if (r == WAIT_FAILED) { DWORD saved_error = GetLastError(); CloseHandle(event); WSASetLastError(saved_error); return SOCKET_ERROR; } status = iosb.Status; } CloseHandle(event); } switch (status) { case STATUS_SUCCESS: error = ERROR_SUCCESS; break; case STATUS_PENDING: error = WSA_IO_PENDING; break; default: error = uv_ntstatus_to_winsock_error(status); break; } WSASetLastError(error); if (error == ERROR_SUCCESS) { return 0; } else { return SOCKET_ERROR; } } int uv__convert_to_localhost_if_unspecified(const struct sockaddr* addr, struct sockaddr_storage* storage) { struct sockaddr_in* dest4; struct sockaddr_in6* dest6; if (addr == NULL) return UV_EINVAL; switch (addr->sa_family) { case AF_INET: dest4 = (struct sockaddr_in*) storage; memcpy(dest4, addr, sizeof(*dest4)); if (dest4->sin_addr.s_addr == 0) dest4->sin_addr.s_addr = htonl(INADDR_LOOPBACK); return 0; case AF_INET6: dest6 = (struct sockaddr_in6*) storage; memcpy(dest6, addr, sizeof(*dest6)); if (memcmp(&dest6->sin6_addr, &uv_addr_ip6_any_.sin6_addr, sizeof(uv_addr_ip6_any_.sin6_addr)) == 0) { struct in6_addr init_sin6_addr = IN6ADDR_LOOPBACK_INIT; dest6->sin6_addr = init_sin6_addr; } return 0; default: return UV_EINVAL; } } ================================================ FILE: external/libuv/src/win/winsock.h ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #ifndef UV_WIN_WINSOCK_H_ #define UV_WIN_WINSOCK_H_ #include #include #include #include #include #include "winapi.h" /* * MinGW is missing these too */ #ifndef SO_UPDATE_CONNECT_CONTEXT # define SO_UPDATE_CONNECT_CONTEXT 0x7010 #endif #ifndef TCP_KEEPALIVE # define TCP_KEEPALIVE 3 #endif #ifndef IPV6_V6ONLY # define IPV6_V6ONLY 27 #endif #ifndef IPV6_HOPLIMIT # define IPV6_HOPLIMIT 21 #endif #ifndef SIO_BASE_HANDLE # define SIO_BASE_HANDLE 0x48000022 #endif #ifndef MCAST_JOIN_SOURCE_GROUP # define MCAST_JOIN_SOURCE_GROUP 45 #endif #ifndef MCAST_LEAVE_SOURCE_GROUP # define MCAST_LEAVE_SOURCE_GROUP 46 #endif /* * TDI defines that are only in the DDK. * We only need receive flags so far. */ #ifndef TDI_RECEIVE_NORMAL #define TDI_RECEIVE_BROADCAST 0x00000004 #define TDI_RECEIVE_MULTICAST 0x00000008 #define TDI_RECEIVE_PARTIAL 0x00000010 #define TDI_RECEIVE_NORMAL 0x00000020 #define TDI_RECEIVE_EXPEDITED 0x00000040 #define TDI_RECEIVE_PEEK 0x00000080 #define TDI_RECEIVE_NO_RESPONSE_EXP 0x00000100 #define TDI_RECEIVE_COPY_LOOKAHEAD 0x00000200 #define TDI_RECEIVE_ENTIRE_MESSAGE 0x00000400 #define TDI_RECEIVE_AT_DISPATCH_LEVEL 0x00000800 #define TDI_RECEIVE_CONTROL_INFO 0x00001000 #define TDI_RECEIVE_FORCE_INDICATION 0x00002000 #define TDI_RECEIVE_NO_PUSH 0x00004000 #endif /* * The "Auxiliary Function Driver" is the windows kernel-mode driver that does * TCP, UDP etc. Winsock is just a layer that dispatches requests to it. * Having these definitions allows us to bypass winsock and make an AFD kernel * call directly, avoiding a bug in winsock's recvfrom implementation. */ #define AFD_NO_FAST_IO 0x00000001 #define AFD_OVERLAPPED 0x00000002 #define AFD_IMMEDIATE 0x00000004 #define AFD_POLL_RECEIVE_BIT 0 #define AFD_POLL_RECEIVE (1 << AFD_POLL_RECEIVE_BIT) #define AFD_POLL_RECEIVE_EXPEDITED_BIT 1 #define AFD_POLL_RECEIVE_EXPEDITED (1 << AFD_POLL_RECEIVE_EXPEDITED_BIT) #define AFD_POLL_SEND_BIT 2 #define AFD_POLL_SEND (1 << AFD_POLL_SEND_BIT) #define AFD_POLL_DISCONNECT_BIT 3 #define AFD_POLL_DISCONNECT (1 << AFD_POLL_DISCONNECT_BIT) #define AFD_POLL_ABORT_BIT 4 #define AFD_POLL_ABORT (1 << AFD_POLL_ABORT_BIT) #define AFD_POLL_LOCAL_CLOSE_BIT 5 #define AFD_POLL_LOCAL_CLOSE (1 << AFD_POLL_LOCAL_CLOSE_BIT) #define AFD_POLL_CONNECT_BIT 6 #define AFD_POLL_CONNECT (1 << AFD_POLL_CONNECT_BIT) #define AFD_POLL_ACCEPT_BIT 7 #define AFD_POLL_ACCEPT (1 << AFD_POLL_ACCEPT_BIT) #define AFD_POLL_CONNECT_FAIL_BIT 8 #define AFD_POLL_CONNECT_FAIL (1 << AFD_POLL_CONNECT_FAIL_BIT) #define AFD_POLL_QOS_BIT 9 #define AFD_POLL_QOS (1 << AFD_POLL_QOS_BIT) #define AFD_POLL_GROUP_QOS_BIT 10 #define AFD_POLL_GROUP_QOS (1 << AFD_POLL_GROUP_QOS_BIT) #define AFD_NUM_POLL_EVENTS 11 #define AFD_POLL_ALL ((1 << AFD_NUM_POLL_EVENTS) - 1) typedef struct _AFD_RECV_DATAGRAM_INFO { LPWSABUF BufferArray; ULONG BufferCount; ULONG AfdFlags; ULONG TdiFlags; struct sockaddr* Address; int* AddressLength; } AFD_RECV_DATAGRAM_INFO, *PAFD_RECV_DATAGRAM_INFO; typedef struct _AFD_RECV_INFO { LPWSABUF BufferArray; ULONG BufferCount; ULONG AfdFlags; ULONG TdiFlags; } AFD_RECV_INFO, *PAFD_RECV_INFO; #define _AFD_CONTROL_CODE(operation, method) \ ((FSCTL_AFD_BASE) << 12 | (operation << 2) | method) #define FSCTL_AFD_BASE FILE_DEVICE_NETWORK #define AFD_RECEIVE 5 #define AFD_RECEIVE_DATAGRAM 6 #define AFD_POLL 9 #define IOCTL_AFD_RECEIVE \ _AFD_CONTROL_CODE(AFD_RECEIVE, METHOD_NEITHER) #define IOCTL_AFD_RECEIVE_DATAGRAM \ _AFD_CONTROL_CODE(AFD_RECEIVE_DATAGRAM, METHOD_NEITHER) #define IOCTL_AFD_POLL \ _AFD_CONTROL_CODE(AFD_POLL, METHOD_BUFFERED) #if defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR) typedef struct _IP_ADAPTER_UNICAST_ADDRESS_XP { /* FIXME: __C89_NAMELESS was removed */ /* __C89_NAMELESS */ union { ULONGLONG Alignment; /* __C89_NAMELESS */ struct { ULONG Length; DWORD Flags; }; }; struct _IP_ADAPTER_UNICAST_ADDRESS_XP *Next; SOCKET_ADDRESS Address; IP_PREFIX_ORIGIN PrefixOrigin; IP_SUFFIX_ORIGIN SuffixOrigin; IP_DAD_STATE DadState; ULONG ValidLifetime; ULONG PreferredLifetime; ULONG LeaseLifetime; } IP_ADAPTER_UNICAST_ADDRESS_XP,*PIP_ADAPTER_UNICAST_ADDRESS_XP; typedef struct _IP_ADAPTER_UNICAST_ADDRESS_LH { union { ULONGLONG Alignment; struct { ULONG Length; DWORD Flags; }; }; struct _IP_ADAPTER_UNICAST_ADDRESS_LH *Next; SOCKET_ADDRESS Address; IP_PREFIX_ORIGIN PrefixOrigin; IP_SUFFIX_ORIGIN SuffixOrigin; IP_DAD_STATE DadState; ULONG ValidLifetime; ULONG PreferredLifetime; ULONG LeaseLifetime; UINT8 OnLinkPrefixLength; } IP_ADAPTER_UNICAST_ADDRESS_LH,*PIP_ADAPTER_UNICAST_ADDRESS_LH; #endif int uv__convert_to_localhost_if_unspecified(const struct sockaddr* addr, struct sockaddr_storage* storage); #endif /* UV_WIN_WINSOCK_H_ */ ================================================ FILE: lib/check/isAssignment.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isAssignment(_token) { if(ASSIGNMENT_OPERATOR.indexOf(_token) < 0) { return {error: false, check: false}; } return {error: false, check: true, type: "ASSIGNMENT"}; } module.exports = isAssignment; ================================================ FILE: lib/check/isBoolean.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isBoolean(_token) { if(BOOLEAN_KEYWORD.indexOf(_token) < 0) { return {error: false, check: false}; } return {error: false, check: true, type: "BOOLEAN"}; } module.exports = isBoolean; ================================================ FILE: lib/check/isDelimiter.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isDelimiter(_token) { if(DELIMITER.indexOf(_token) < 0) { return {error: false, check: false}; } return {error: false, check: true, type: _token}; } module.exports = isDelimiter; ================================================ FILE: lib/check/isIncrement.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isIncrement(_token) { if(INCREMENT_TOKENS.indexOf(_token) < 0) { return {error: false, check: false}; } return {error: false, check: true, type: "INCREMENT"}; } module.exports = isIncrement; ================================================ FILE: lib/check/isInitOperator.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isInitOperator(_token) { if(INIT_OPERATOR.indexOf(_token) < 0) { return {error: false, check: false}; } return {error: false, check: true, type: _token}; } module.exports = isInitOperator; ================================================ FILE: lib/check/isKeyword.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isKeyword(_token) { if(KEYWORD.indexOf(_token) < 0) { return {error: false, check: false}; } return {error: false, check: true, type: _token.toUpperCase()}; } module.exports = isKeyword; ================================================ FILE: lib/check/isNative.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isNative(_token) { if(_token.length < 4) { return {error: false, check: false}; } if(_token.slice(0,2) == "{{" || _token.slice(-2) == "}}") { return {error: false, check: true, type: "NATIVE"}; } return {error: false, check: false}; } module.exports = isNative; ================================================ FILE: lib/check/isNumber.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isNumber(_token) { var _point = 0; if(NUMBERS.indexOf(_token[0]) > -1 && _token[0] != ".") { for(var v = 0; v < _token.length; v++) { if(NUMBERS.indexOf(_token[v]) < 0) { return {error: true, message: "Bad number", check: false}; } if(_token[v] == ".") { _point++; } if(_point > 1) { return {error: true, message: "Unexpected '.'", check: false}; } } return {error: false, check: true, type: "NUMBER"}; } return {error: false, check: false}; } module.exports = isNumber; ================================================ FILE: lib/check/isObjectOperator.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isObjectOperator(_token) { if(OBJECT_OPERATOR.indexOf(_token) < 0) { return {error: false, check: false}; } return {error: false, check: true, type: _token}; } module.exports = isObjectOperator; ================================================ FILE: lib/check/isOperator.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isOperator(_token) { if(ALL_TOKEN_LOGIC.indexOf(_token) < 0) { return {error: false, check: false}; } return {error: false, check: true, type: "OPERATOR"}; } module.exports = isOperator; ================================================ FILE: lib/check/isRegExp.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var regFlags = "igmsuy"; function isRegExp(_token) { if(_token.length < 2) { return {error: false, check: false}; } if( _token.length > 2 && _token[ 0 ] == "/" && _token[ _token.length - 2 ] == "/" && regFlags.indexOf(_token[ _token.length - 1 ]) > -1 != "/") { return {error: false, check: true, type: "REGEXP"}; } if(_token[0] != "/" || _token[ _token.length - 1 ] != "/") { return {error: false, check: false}; } return {error: false, check: true, type: "REGEXP"}; } module.exports = isRegExp; ================================================ FILE: lib/check/isSemi.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isSemi(_token) { if(_token != ";") { return {error: false, check: false}; } return {error: false, check: true, type: "SEMI"}; } module.exports = isSemi; ================================================ FILE: lib/check/isString.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isString(_token) { if(_token.length < 2) { return {error: false, check: false}; } if(_token[0] != "\"" || _token[ _token.length - 1 ] != "\"") { return {error: false, check: false}; } return {error: false, check: true, type: "STRING"}; } module.exports = isString; ================================================ FILE: lib/check/isUnary.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isUnary(_token) { if(UNARY_TOKENS.indexOf(_token) < 0) { return {error: false, check: false}; } return {error: false, check: true, type: "UNARY"}; } module.exports = isUnary; ================================================ FILE: lib/check/isVariable.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isVariable(_token) { if(!_token || !_token.length) { return {error: false, check: false}; } if(FIRST_VAR_CHAR.indexOf(_token[0]) < 0) { return {error: false, check: false}; } if(_token == "true" || _token == "false") { return {error: false, check: false}; } for(var v = 0; v < _token.length; v++) { if(FULL_VAR_CHAR.indexOf(_token[v]) < 0) { return {error: true, message: "Bad token in variable name", check: false}; } } return {error: false, check: true, type: "VARIABLE"}; } module.exports = isVariable; ================================================ FILE: lib/env.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ global.genRequire = require("./require.js"); global.KEYWORD = ["var", "new", "this", "case", "default", "true", "false", "break", "function", "switch", "for", "do", "while", "in", "if", "else", "null", "Infinity", "NaN", "return", "include", "try", "catch"]; global.RESERVED = ["var", "new", "this", "case", "default", "Prototype", "break", "function", "switch", "for", "do", "while", "in", "if", "else", "null", "true", "false", "argc", "argv", "main", "Object", "Array", "Infinity", "NaN", "include", "try", "catch", "arguments", "return", "address_of", "length_of", "size_of", "type_of", "typeof", "__NERD_Multi_Line_Quote", "require", "exit"]; global.ASSIGNMENT_OPERATOR = ["=", "+=", "-=", "/=", "*="]; global.OBJECT_OPERATOR = [":"]; global.ITERATOR = ["in"]; global.INIT_OPERATOR = ["[]", "{}"]; global.CONDITIONAL_TOKENS = ["==", "<", ">", "<<", ">>", "<=", ">=", "!="]; global.OPERATOR_TOKENS = ["+", "-", "*", "/"]; global.UNARY_TOKENS = ["!"]; global.INCREMENT_TOKENS = ["++", "--"]; global.CONDITIONAL_LOGIC = ["&&", "||"]; global.BOOLEAN_KEYWORD = ["true", "false"]; global.PARENTHESIS_LOGIC = ["(", ")"]; global.DELIMITER = ["(", ")", "{", "}", "[", "]", ",", "."]; global.ALL_TOKEN_LOGIC = global.CONDITIONAL_TOKENS.concat(global.OPERATOR_TOKENS, global.CONDITIONAL_LOGIC); global.NUMBERS = ["0","1","2","3","4","5","6","7","8","9", "."]; global.FIRST_VAR_CHAR = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_"; global.FULL_VAR_CHAR = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789"; global.VALUES = ["NUMBER", "VARIABLE", "STRING", "BOOLEAN", "NULL"]; global.createEnv = function(_path, _file) { var envObject = { REGISTER: [ ["global", "__dirname", "FixedArray", "Array", "Object", "__NERD_THIS", "Prototype"], [], ], FLOW: [], AST: [], LOGICAL_FLOW: [{DO:false, IF:false, FUNCTION:false, MAIN:true, TRY: false}], MAP: [], IN_OBJECT: false, IN_STRING: false, IN_BLOCK_QUOTE: false, IN_NATIVE: false, CURRENT_OBJECT: "", IN_DO: false, IN_IF: false, TOKENS: [], TOKENSMAP: [], SWITCH_MAP: [], POSITION: 0, LINE: 0, CURSOR: 0, FOR: 0, SWITCH: 0, IN_CASE: false, PATH: _path, FILE: _file, flowObject: 0, flowBracket: 0, flowParenthesis: 0, flowAccessor: 0, LAMBDA: {}, }; envObject.REGISTER[0] = envObject.REGISTER[0].concat(global.COMPILER.ENV.stdlib); return envObject; } global.generateCode = function(_env) { var code = ""; for(var i = 0; i < _env.FLOW.length; i++) { if(_env.AST[i] && _env.AST[i][0] && _env.AST[i][0] == "NATIVE") { code += _env.FLOW[i][0].slice( 2, _env.FLOW[i][0].length - 2); } else { code += _env.FLOW[i].join(" "); code += "\n"; } } return code; } global.parseAST = function(_env) { for(var i = 0; i < _env.FLOW.length; i) { i = global.verifyFlow(_env.AST[i], _env.FLOW[i], i, _env.FLOW, _env); } } global.error = function(_msg) { console.error(_msg); process.exit(1); } global.nextScope = function(_env) { _env.REGISTER.push([]); _env.LOGICAL_FLOW.push({"DO":false, "IF": false, "FUNCTION":false, MAIN: false, TRY: false}); } global.popScope = function(_env) { _env.REGISTER.pop(); _env.LOGICAL_FLOW.pop(); } global.getLogical = function(_env) { return _env.LOGICAL_FLOW[_env.LOGICAL_FLOW.length - 1]; } global.addLogical = function(_type, _env) { _env.LOGICAL_FLOW[_env.LOGICAL_FLOW.length - 1][_type] = true; } global.removeLogical = function(_type, _env) { _env.LOGICAL_FLOW[_env.LOGICAL_FLOW.length - 1][_type] = false; } global.checkVarExists = function(_name, _env, _flow) { //for(var i = 0; i < _env.REGISTER.length; i++) //{ if(_env.REGISTER[_env.REGISTER.length - 1].indexOf(_name) > -1) { return { error: true, message: `Variable ${_name} already defined` }; } //} return { error: false }; } global.addVar = function(_name, _env) { if(_env.REGISTER[_env.REGISTER.length - 1].indexOf(_name) < 0) { _env.REGISTER[_env.REGISTER.length - 1].push(_name); } } global.varExists = function(_name, _env) { for(var i = 0; i < _env.REGISTER.length; i++) { if(_env.REGISTER[i].indexOf(_name) > -1) { return true; } } return false; } ================================================ FILE: lib/include.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var _SEARCH = new RegExp(/['"]!_ffi_include *(.*)['"]/); var _SEARCHCINC = new RegExp(/#include *\"(.*)\"/g); function genInclude(from, src, full) { console.log(from, src, full); if(CLI.cli["--profile"] && CLI.cli["--profile"].argument == "use") { return src; } var _match = src.match(_SEARCH); while(_match) { var _var = "#include \"" + path.resolve(path.join(COMPILER.TMP_FOLDER, _match[1]) + "\""); COMPILER.FFI.push(_var); copyRecursiveSync(path.resolve(path.join(from, _match[1])), path.join(COMPILER.TMP_FOLDER, _match[1])); var _include = fs.readFileSync(path.resolve(path.join(COMPILER.TMP_FOLDER, _match[1]))).toString(); _include = genMetaFunction(_include); _include = genInclude(path.dirname(path.resolve(path.join(from, _match[1]))), _include, path.dirname(path.resolve(path.join(COMPILER.TMP_FOLDER, _match[1])))); fs.writeFileSync(path.resolve(path.join(COMPILER.TMP_FOLDER, _match[1])), _include); src = src.replace(/['"]!_ffi_include *(.*)['"]/, ""); _match = src.match(_SEARCH); } var _cmatch = src.match(_SEARCHCINC); if(_cmatch) { for(var i = 0; i < _cmatch.length; i++) { var _getPath = new RegExp(/#include *\"(.*)\"/g); var _cfile = _getPath.exec(_cmatch[i]); if(_cfile[1]) { var _incFile = path.resolve(path.join(from, _cfile[1])); if(fs.existsSync(_incFile)) { copyRecursiveSync(_incFile, path.join(full, _cfile[1])); var _include = fs.readFileSync(path.resolve(path.join(full, _cfile[1]))).toString(); _include = genMetaFunction(_include); _include = genInclude(path.dirname(path.resolve(path.join(full, _cfile[1]))), _include, path.dirname(path.resolve(path.join(full, _cfile[1])))); fs.writeFileSync(path.resolve(path.join(full, _cfile[1])), _include); _cmatch = src.match(_SEARCHCINC); } } } } return src; } module.exports = genInclude; ================================================ FILE: lib/package.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var _SEARCH = new RegExp(/['"]!_package *(.*)['"]/); function genPackage(from, src) { var _match = src.match(_SEARCH); while(_match) { var _target = _match[1].replace(/{__ARCH__}/g, os.arch()); copyRecursiveSync(path.resolve(path.join(from, _target)), path.join(COMPILER.TMP_FOLDER, _target)); COMPILER.PACK.push(path.join(COMPILER.TMP_FOLDER, _target)); src = src.replace(/['"]!_package *(.*)['"]/, ""); _match = src.match(_SEARCH); } return src; } module.exports = genPackage; ================================================ FILE: lib/parser.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ //var _env.flowBracket = 0; //var _env.flowObject = 0; //var _env.flowParenthesis = 0; //var _env.flowAccessor = 0; var isNumber = require("./check/isNumber.js"); var isVariable = require("./check/isVariable.js"); var isString = require("./check/isString.js"); var isOperator = require("./check/isOperator.js"); var isUnary = require("./check/isUnary.js"); var isInitOperator = require("./check/isInitOperator.js"); var isObjectOperator = require("./check/isObjectOperator.js"); var isKeyword = require("./check/isKeyword.js"); var isDelimiter = require("./check/isDelimiter.js"); var isIncrement = require("./check/isIncrement.js"); var isAssignment = require("./check/isAssignment.js"); var isSemi = require("./check/isSemi.js"); var isNative = require("./check/isNative.js"); var isRegExp = require("./check/isRegExp.js"); var CHECKERS = [ isSemi, isRegExp, isNumber, isAssignment, isKeyword, isVariable, isString, isDelimiter, isIncrement, isObjectOperator, isOperator, isUnary, isInitOperator, isNative, ]; var RegExpFlags = "igmsuy"; function incToken(_env) { _env.POSITION++; if(!_env.TOKENS[_env.POSITION]) { _env.TOKENS[_env.POSITION] = []; } if(!_env.TOKENSMAP[_env.POSITION]) { _env.TOKENSMAP[_env.POSITION] = []; } } function decToken(_env) { _env.POSITION--; } function addToken(_code, _env) { if(_code == "\n") return; if(_code.length > 0) { if(!_env.TOKENS[_env.POSITION]) { _env.TOKENS[_env.POSITION] = []; } if(!_env.TOKENSMAP[_env.POSITION]) { _env.TOKENSMAP[_env.POSITION] = []; } _env.TOKENS[_env.POSITION].push(_code); _env.TOKENSMAP[_env.POSITION].push( {line: _env.LINE, position: _env.CURSOR} ); } } var noReduceParenthesis = ["INCLUDE", "FUNCTION", "ACCESSOR", "]", ")", "VARIABLE", "CALL", "IF", "WHILE", "FOR"]; var reduceParenthesis = function(_ast) { for(var i = 0; i < _ast.length; i++) { if(_ast[i-1] && _ast[i-1] == "IF" && _ast[i] == "(" && _ast[i+1] && _ast[i+1] == "(") { if(_ast[i+3] && _ast[i+3] == ")") { _ast = _ast.slice(0,2).concat([_ast[i+2]]).concat(_ast.slice(5)); reduceParenthesis(_ast); } } else if( (!_ast[i-1] || (_ast[i-1] && noReduceParenthesis.indexOf(_ast[i-1]) < 0) ) && _ast[i] == "(" && _ast[i+2] && _ast[i+2] == ")" ) { _ast = _ast.slice(0,i).concat([_ast[i+1]]).concat(_ast.slice(i+3)); reduceParenthesis(_ast); } } return _ast; } function verifyToken(_token, i, j, map, _env) { var check = {check: false, error: false}; for(var k = 0; k < CHECKERS.length; k++) { check = CHECKERS[k](_token); if(check.error) { error(`[!] ${check.message}: ${_token} line:${map[i][j].line + 1} position:${map[i][j].position}${os.EOL}=> ${array_of_code[map[i][j].line]}`); } else if(check.check) { return check.type; } } if(!check.check) { error(`[!] Unknown token: ${_token} line:${map[i][j].line + 1} position:${map[i][j].position}${os.EOL}=> ${array_of_code[map[i][j].line]}`); } } var GRAMMAR = { "(": [ ["(", "VARIABLE", ","], ["(", "CALL", ","], ], BOOLEAN: [ ["TRUE"], ["FALSE"], ], LITERAL: [ ["NUMBER"], ["STRING"], ["BOOLEAN"], ], OBJECT: [ ["{", "LIST", "}"], ["{", "ASSIGNMENT", "}"], ["{", "LIST", ",", "}"], ["{", "ASSIGNMENT", ",", "}"], ], OBJECT_LIST: [ ["ASSIGNMENT", ",", "ASSIGNMENT"], ["ASSIGNMENT", ",", "OBJECT_LIST"], ["OBJECT_LIST", ",", "ASSIGNMENT"], ["OBJECT_LIST", ",", "OBJECT_LIST"], ], ARRAY: [ ["[", "LIST", "]"], ["[", "LIST", ",", "]"], ["[", "{", "OBJECT_LIST", "}", "]"], ], ACCESSOR: [ ["[", "LITERAL", "]"], ["[", "VARIABLE", "]"], ["[", "EXPRESSION", "]"], ], BREAK: [ ["SEMI", "BREAK"], ], LAMBDA: [ ["FUNCTION", "(", ")", "{", "}"], ["FUNCTION", "(", "LIST", ")", "{", "}"], ], OPERATOR: [ ["OPERATOR", "OPERATOR"] ], VARIABLE: [ ["VAR", "VARIABLE"], ["VARIABLE", ".", "VARIABLE"], ["VARIABLE", "ACCESSOR"], ["CALL", ".", "VARIABLE"], ["VARIABLE", ".", "CALL"], ["UNARY", "VARIABLE"], ["[", "]"], ["THIS"], ["VARIABLE", "INCREMENT"], ["CALL", "ACCESSOR"], ["REGEXP"], ], CALL: [ ["VARIABLE", "(", "CALL", ")"], ["VARIABLE", "(", "VARIABLE", ")"], ["VARIABLE", "(", "LIST", ")"], ["VARIABLE", "(", "EXPRESSION", ")"], ["VARIABLE", "(", "VARIABLE", ")"], ["VARIABLE", "(", "LITERAL", ")"], ["VARIABLE", "(", "OPERATOR", "LITERAL", ")"], ["VARIABLE", "(", "OBJECT", ")"], ["VARIABLE", "(", "{", "OBJECT_LIST", "}", ")"], ["VARIABLE", "(", "ARRAY", ")"], ["VARIABLE", "(", ")"], ["VARIABLE", "(", "ACCESSOR", ")"], ["CALL", ".", "CALL"], ["VARIABLE", ".", "CALL"], ["UNARY", "CALL"], ["NEW", "CALL"], ], ASSIGNMENT: [ ["VARIABLE", ":", "LITERAL"], ["VARIABLE", ":", "VARIABLE"], ["VARIABLE", ":", "EXPRESSION"], ["VARIABLE", ":", "CALL"], ["VARIABLE", ":", "LAMBDA"], ["VARIABLE", ":", "ARRAY"], ["VARIABLE", ":", "OBJECT"], ["VARIABLE", ":", "{", "}"], ["VARIABLE", ":", "{", "ASSIGNMENT", "}"], ["VARIABLE", ":", "{", "ASSIGNMENT", ",", "}"], ["VARIABLE", ":", "LIST"], ["LITERAL", ":", "LITERAL"], ["LITERAL", ":", "EXPRESSION"], ["LITERAL", ":", "CALL"], ["LITERAL", ":", "VARIABLE"], ["LITERAL", ":", "{", "}"], ], LIST: [ ["LIST", ",", "{", "OBJECT_LIST", "}"], ["{", "OBJECT_LIST", "}", ",", "LIST}"], ["{", "OBJECT_LIST", "}", ",", "{", "OBJECT_LIST", "}"], ], } var LIST_GEN = [ "LITERAL", "ARRAY", "VARIABLE", "CALL", "LIST", "OBJECT" ] var VAR_OPERATOR_GEN = [ "VARIABLE", "LITERAL", "CALL", ] for(var i = 0; i < LIST_GEN.length; i++) { for(var j = 0; j < LIST_GEN.length; j++) { GRAMMAR.LIST.push([LIST_GEN[i], ",", LIST_GEN[j]]); } } for(var i = 0; i < VAR_OPERATOR_GEN.length; i++) { for(var j = 0; j < VAR_OPERATOR_GEN.length; j++) { GRAMMAR.VARIABLE.push([VAR_OPERATOR_GEN[i], "OPERATOR", VAR_OPERATOR_GEN[j]]); } } var VALIDATION = { VARIABLE: [ ["VARIABLE", "SEMI"], ["VARIABLE", "ASSIGNMENT", "LITERAL", "SEMI"], ["VARIABLE", "ASSIGNMENT", "VARIABLE", "SEMI"], ["VARIABLE", "ASSIGNMENT", "ACCESSOR", "SEMI"], ["VARIABLE", "ASSIGNMENT", "OBJECT", "SEMI"], ["VARIABLE", "ASSIGNMENT", "ARRAY", "SEMI"], ["VARIABLE", "ASSIGNMENT", "EXPRESSION", "SEMI"], ["VARIABLE", "ASSIGNMENT", "CALL", "SEMI"], ["VARIABLE", "ASSIGNMENT", "[", "LITERAL", "]", "SEMI"], ["VARIABLE", "ASSIGNMENT", "[", "LIST", "]", "SEMI"], ["VARIABLE", "ASSIGNMENT", "FUNCTION", "(", "LIST", ")", "{"], ["VARIABLE", "ASSIGNMENT", "FUNCTION", "(", "LITERAL", ")", "{"], ["VARIABLE", "ASSIGNMENT", "FUNCTION", "(", "VARIABLE", ")", "{"], ["VARIABLE", "ASSIGNMENT", "FUNCTION", "(", "ARRAY", ")", "{"], ["VARIABLE", "ASSIGNMENT", "FUNCTION", "(", "OBJECT", ")", "{"], ["VARIABLE", "ASSIGNMENT", "FUNCTION", "(", ")", "{"], ["VARIABLE", "ASSIGNMENT", "{", "OBJECT_LIST", "}", "SEMI"], ["VARIABLE", "ASSIGNMENT", "{", "OBJECT_LIST", ",", "}", "SEMI"], ["VARIABLE", "ASSIGNMENT", "{", "}", "SEMI"], ], ASSIGNMENT: [ ["ASSIGNMENT", "SEMI"], ["ASSIGNMENT", "{"], ], EXPRESSION: [ ["EXPRESSION", "SEMI"], ], WHILE: [ [ "WHILE", "(", "LITERAL", ")", "{" ], [ "WHILE", "(", "VARIABLE", ")", "{" ], [ "WHILE", "(", "EXPRESSION", ")", "{" ], [ "WHILE", "(", "LITERAL", ")", "SEMI" ], [ "WHILE", "(", "VARIABLE", ")", "SEMI" ], [ "WHILE", "(", "EXPRESSION", ")", "SEMI" ], ], SWITCH: [ ["SWITCH", "(", "VARIABLE", ")", "{"], ["SWITCH", "(", "EXPRESSION", ")", "{"], ["SWITCH", "(", "LITERAL", ")", "{"], ["SWITCH", "(", "CALL", ")", "{"], ], CASE: [ ["CASE", "LITERAL", ":"], ["CASE", "VARIABLE", ":"], ["CASE", "EXPRESSION", ":"], ["CASE", "CALL", ":"], ], DEFAULT: [ ["DEFAULT", ":"], ], DO: [ [ "DO", "{" ], ], IF: [ [ "IF", "(", "LITERAL", ")", "{" ], [ "IF", "(", "VARIABLE", ")", "{" ], [ "IF", "(", "EXPRESSION", ")", "{" ], [ "IF", "(", "CALL", ")", "{" ], [ "IF", "(", "LITERAL", ")", "ASSIGNMENT", "SEMI" ], [ "IF", "(", "VARIABLE", ")", "ASSIGNMENT", "SEMI" ], [ "IF", "(", "VARIABLE", ")", "VARIABLE", "SEMI" ], [ "IF", "(", "VARIABLE", ")", "RETURN", "SEMI" ], [ "IF", "(", "EXPRESSION", ")", "ASSIGNMENT", "SEMI" ], [ "IF", "(", "CALL", ")", "ASSIGNMENT", "SEMI" ], [ "IF", "(", "CALL", ")", "CALL", "SEMI" ], [ "IF", "(", "VARIABLE", ")", "CALL", "SEMI" ], [ "IF", "(", "EXPRESSION", ")", "CALL", "SEMI" ], [ "IF", "(", "EXPRESSION", ")", "RETURN", "SEMI" ], [ "IF", "(", "VARIABLE", ")", "VARIABLE", "ASSIGNMENT", "LITERAL", "SEMI" ], [ "IF", "(", "VARIABLE", ")", "VARIABLE", "ASSIGNMENT", "VARIABLE", "SEMI" ], [ "IF", "(", "VARIABLE", ")", "VARIABLE", "ASSIGNMENT", "CALL", "SEMI" ], [ "IF", "(", "EXPRESSION", ")", "VARIABLE", "ASSIGNMENT", "STRING", "SEMI" ], [ "IF", "(", "EXPRESSION", ")", "VARIABLE", "ASSIGNMENT", "VARIABLE", "SEMI" ], [ "IF", "(", "EXPRESSION", ")", "VARIABLE", "ASSIGNMENT", "CALL", "SEMI" ], [ "IF", "(", "EXPRESSION", ")", "VARIABLE", "ASSIGNMENT", "EXPRESSION", "SEMI" ], ], ELSE: [ [ "ELSE", "IF", "(", "LITERAL", ")", "{" ], [ "ELSE", "IF", "(", "VARIABLE", ")", "{" ], [ "ELSE", "IF", "(", "EXPRESSION", ")", "{" ], [ "ELSE", "IF", "(", "CALL", ")", "{" ], [ "ELSE", "IF", "(", "LITERAL", ")", "ASSIGNMENT", "SEMI" ], [ "ELSE", "IF", "(", "VARIABLE", ")", "ASSIGNMENT", "SEMI" ], [ "ELSE", "IF", "(", "EXPRESSION", ")", "ASSIGNMENT", "SEMI" ], [ "ELSE", "IF", "(", "EXPRESSION", ")", "VARIABLE", "EXPRESSION", "SEMI" ], [ "ELSE", "IF", "(", "CALL", ")", "ASSIGNMENT", "SEMI" ], [ "ELSE", "IF", "(", "CALL", ")", "CALL", "SEMI" ], [ "ELSE", "IF", "(", "VARIABLE", ")", "CALL", "SEMI" ], [ "ELSE", "IF", "(", "VARIABLE", ")", "VARIABLE", "ASSIGNMENT", "LITERAL", "SEMI" ], [ "ELSE", "IF", "(", "VARIABLE", ")", "VARIABLE", "ASSIGNMENT", "VARIABLE", "SEMI" ], [ "ELSE", "IF", "(", "EXPRESSION", ")", "VARIABLE", "ASSIGNMENT", "VARIABLE", "SEMI" ], [ "ELSE", "IF", "(", "EXPRESSION", ")", "VARIABLE", "ASSIGNMENT", "LITERAL", "SEMI" ], [ "ELSE", "{" ], [ "ELSE", "TRY", "{" ], [ "ELSE", "VARIABLE", "SEMI" ], [ "ELSE", "ASSIGNMENT", "SEMI" ], [ "ELSE", "CALL", "SEMI" ], [ "ELSE", "VARIABLE", "ASSIGNMENT", "VARIABLE", "SEMI" ], [ "ELSE", "VARIABLE", "ASSIGNMENT", "CALL", "SEMI" ], [ "ELSE", "VARIABLE", "EXPRESSION", "SEMI" ], ], FOR: [ ["FOR", "(", "VARIABLE", "ASSIGNMENT", "LITERAL", "SEMI", "VARIABLE", "SEMI", "VARIABLE", ")", "{"], ["FOR", "(", "VARIABLE", "ASSIGNMENT", "LITERAL", "SEMI", "CALL", "SEMI", "VARIABLE", ")", "{"], ["FOR", "(", "VARIABLE", "ASSIGNMENT", "VARIABLE", "SEMI", "VARIABLE", "SEMI", "VARIABLE", ")", "{"], ["FOR", "(", "VARIABLE", "ASSIGNMENT", "VARIABLE", "SEMI", "CALL", "SEMI", "VARIABLE", ")", "{"], ["FOR", "(", "VARIABLE", "ASSIGNMENT", "LITERAL", "SEMI", "VARIABLE", "SEMI", "EXPRESSION", ")", "{"], ["FOR", "(", "VARIABLE", "ASSIGNMENT", "VARIABLE", "SEMI", "VARIABLE", "SEMI", "EXPRESSION", ")", "{"], ["FOR", "(", "VARIABLE", "ASSIGNMENT", "LITERAL", "SEMI", "EXPRESSION", "SEMI", "VARIABLE", ")", "{"], ["FOR", "(", "VARIABLE", "ASSIGNMENT", "VARIABLE", "SEMI", "EXPRESSION", "SEMI", "VARIABLE", ")", "{"], ["FOR", "(", "VARIABLE", "ASSIGNMENT", "LITERAL", "SEMI", "EXPRESSION", "SEMI", "EXPRESSION", ")", "{"], ["FOR", "(", "VARIABLE", "ASSIGNMENT", "VARIABLE", "SEMI", "EXPRESSION", "SEMI", "EXPRESSION", ")", "{"], ["FOR", "(", "VARIABLE", "SEMI", "EXPRESSION", "SEMI", "EXPRESSION", ")", "{"], ["FOR", "(", "VARIABLE", "IN", "VARIABLE", ")", "{"], ], FUNCTION: [ ["FUNCTION", "CALL", "{"], ], CALL: [ ["CALL", "SEMI"], ], INCLUDE: [ ["INCLUDE", "(", "LITERAL", ")", "SEMI"], ], DEFINE: [ ["DEFINE", "(", "STRING", ")", "SEMI"], ], RETURN: [ ["RETURN", "LITERAL", "SEMI"], ["RETURN", "SEMI"], ["RETURN", "VARIABLE", "SEMI"], ["RETURN", "EXPRESSION", "SEMI"], ["RETURN", "CALL", "SEMI"], ["RETURN", "OBJECT", "SEMI"], ["RETURN", "OBJECT", ",", "SEMI"], ["RETURN", "{", "ASSIGNMENT", ",", "}", "SEMI"], ["RETURN", "{", "ASSIGNMENT", "}", "SEMI"], ["RETURN", "{", "OBJECT_LIST", ",", "}", "SEMI"], ["RETURN", "{", "OBJECT_LIST","}", "SEMI"], ], TRY: [ ["TRY", "{"], ], CATCH: [ ["CATCH", "(", "VARIABLE", ")", "{"], ], "NATIVE": [ ["NATIVE"], ], "{": [ ["{"], ], "}": [ ["}"], ["}", "SEMI"], ], BREAK: [ ["BREAK"], ["BREAK", "SEMI"], ], SEMI: [ ["SEMI"], ] } function checkExpression(_ast, _flow, _arr) { var _startAst = 0; var _endAst = 0; var _match = false; var _newAst = []; for(var g = 0; g < Object.keys(_arr).length; g++) { var _grammarName = Object.keys(_arr)[g]; var _grammar = _arr[_grammarName]; for(var t = 0; t < _grammar.length; t++) { for(var i = 0; i < _ast.length ; i++) { _startAst = 0; _endAst = 0; _match = false; if(_ast[i] == _grammar[t][0]) { _match = true; _startAst = i; _endAst = i; for(var m = 0; m < _grammar[t].length; m++) { if(!_ast[i + m]) { _match = false; break } else if( _ast[i + m] == _grammar[t][m]) { _endAst++; } else { _match = false; break; } } if(_match) { _newAst = _ast.slice(0, _startAst); _newAst.push( _grammarName ); _newAst = _newAst.concat( _ast.slice( _endAst )); _ast = _newAst; _ast = reduceParenthesis(_ast); return checkExpression(_ast, _flow, _arr); } } } } } return _ast; } function checkSyntax(_ast, _flow, _scope, _env) { if(_ast.length < 1) { return; } if(VALIDATION[_ast[0]]) { var _check = VALIDATION[_ast[0]]; var _good = true; for(var c = 0; c < _check.length; c++) { _good = true; for(var t = 0; t < _ast.length; t++) { if(!_check[c][t] || _ast[t] != _check[c][t]) { _good = false; break; } } if(_good) { break; } } if(!_good) { var _debug = "\n"; if(global.DEBUG) { _debug += _ast.join(" "); } error(`[!] Unexpected token: line: ${_scope[0].line + 1} in ${_env.FILE}\n${_flow.join(" ")}${_debug}`); } } else { var _debug = "\n"; if(global.DEBUG) { _debug += _ast.join(" "); } error(`[!] Unexpected token: line: ${_scope[0].line + 1} position: 0 in ${_env.FILE}\n${_flow.join(" ")}${_debug}`); } } function addFlow(_env) { if(_env.TOKENS.length > 0 && _env.TOKENS[0]) { var _ast = []; for(var i = 0; i < _env.TOKENS.length; i++) { _ast[i] = []; for(var j = 0; j < _env.TOKENS[i].length; j++) { _ast[i][j] = verifyToken(_env.TOKENS[i][j], i, j, _env.TOKENSMAP, _env); } _ast[i] = checkExpression(_ast[i], _env.TOKENS[i], GRAMMAR); //_ast[i] = checkExpression(_ast[i], _env.TOKENS[i], ASSIGN); //_ast[i] = checkExpression(_ast[i], _env.TOKENS[i], SECOND); checkSyntax(_ast[i], _env.TOKENS[i], _env.TOKENSMAP[i], _env); } _env.FLOW = _env.FLOW.concat(_env.TOKENS); _env.MAP = _env.MAP.concat(_env.TOKENSMAP); _env.AST = _env.AST.concat(_ast); } _env.TOKENS = []; _env.TOKENSMAP = []; _env.POSITION = 0; } function findNextLine(_code, _from, _env) { for(var i = _from; i < _code.length; i++) { if(_code[i] == "\r" && _code[i+1] && _code[i+1] == "\n") { _env.LINE++; _env.CURSOR = 0; return i+2; } else if(_code[i] == "\n") { _env.LINE++; _env.CURSOR = 0; return i+1; } } // ERROR return _code.length - 1; } function findEndComment(_code, _from, _env) { for(var i = _from; i < _code.length; i++) { if(_code[i] == "\n") { _env.LINE++; _env.CURSOR = 0; } else if(_code[i] == "\r" && _code[i + 1] && _code[i + 1] == "\n") { _env.LINE++; _env.CURSOR = 0; i++; } else if(_code[i] == "*" && _code[i+1] && _code[i+1] == "/") { return i+2; } _env.CURSOR++; } // ERROR return _code.length - 1; } function setFor(_current, _env) { if(_current == "for" && _env.FOR == 0) { _env.FOR = 2; } } function setSwitch(_current, _env) { if(_current == "switch") { _env.SWITCH ++; } } function setCase(_current, _env) { if(_current == "case") { if(_env.SWITCH > 0) { _env.IN_CASE = true; } else { error(`'case' keyworkds require to be in a switch statement`); } } } function unsetCase(_current, _env) { if(_current == "break") { if(_env.IN_CASE == true) { _env.IN_CASE = false; } } } function parseCode(_code, _from, _env) { var _current = ""; _env.POSITION = 0; for(var i = _from; i < _code.length; i++) { var _tokens = _env.TOKENS[_env.TOKENS.length - 1]; var _before; if(_tokens && _tokens[_tokens.length - 1]) { _before = _tokens[_tokens.length - 1]; } switch(_code[i]) { case " ": if(!_env.IN_STRING && !_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE) { setFor(_current, _env); setSwitch(_current, _env); addToken(_current, _env); _current = ""; } else { _current += _code[i]; } break; case "\t": if(!_env.IN_STRING && !_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE) { setFor(_current, _env); setSwitch(_current, _env); addToken(_current, _env); _current = ""; } else if(_env.IN_STRING || _env.IN_NATIVE) { _current += _code[i]; } else if(_env.IN_BLOCK_QUOTE) { _current += "\\t"; } break; case "\n": if(!_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE) { _env.LINE++; _env.CURSOR = 0; addToken(_current, _env); _current = ""; } else if(_env.IN_NATIVE) { _current += _code[i]; } else { _current += "\\n"; } break; case "\r": if(!_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE) { _env.LINE++; _env.CURSOR = 0; if(_code[i+1] && _code[i+1] == "\n") { addToken(_current, _env); _current = ""; i++ break; } } else if(_env.IN_NATIVE) { _current += _code[i]; } else { _current += "\\r"; } break; case "\\": if(_env.IN_BLOCK_QUOTE) { _current += "\\\\"; } _current += "\\"; break; case "\"": if(_env.IN_STRING && !_env.IN_NATIVE) { _env.IN_STRING = false; } else if(!_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE) { _env.IN_STRING = true; } if(_env.IN_BLOCK_QUOTE) { _current += "\\\""; } else { _current += _code[i]; } break; case "`": if(_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE) { _env.IN_BLOCK_QUOTE = false; addToken(_current + "\"", _env); _current = ""; } else if(!_env.IN_STRING && !_env.IN_NATIVE) { _env.IN_BLOCK_QUOTE = true; addToken(_current, _env); _current = "\""; for(var q = i+1; q < _code.length; q++) { if(_code[q] == "`") { break; } if(_code[q] == "$" && _code[q+1] == "{") { for(var end = q; end < _code.length; end++) { if(_code[end] == "}") { _code[q] = "\""; _code[q+1] = "+"; _code = _code.slice(0, q) + "` + " + _code.slice(q+2, end) + " + `" + _code.slice(end+1); break; } } } } } else _current += _code[i]; break; case "/": if(!_env.IN_STRING && !_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE) { if(_code[i+1]) { if(_code[i + 1] && _code[i + 1] == "=") { // /= addToken(_code[i] + _code[i + 1], _env); i++; } else if(_code[i+1] == "/") { addToken(_current, _env); addFlow(_env); _current = ""; parseCode(_code, findNextLine(_code, i, _env), _env); return; } else if(_code[i+1] == "*") { addToken(_current, _env); addFlow(_env); _current = ""; i = parseCode(_code, findEndComment(_code, i, _env), _env); return; } else { var _isRegExp = false; var _regExp = _code[i]; for(r = i + 1; r < _code.length; r++) { if(_code[r] == "\n" || _code[r] == ";") { break; } else if(_code[r] == "/") { _regExp += _code[r]; isRegExp = true; if(_code[r + 1] && RegExpFlags.indexOf(_code[r + 1]) > -1) { _regExp += _code[r + 1]; r++; } i = r; break; } else { _regExp += _code[r]; } } addToken(_current, _env); if(isRegExp) { addToken("new", _env); addToken("RegExp", _env); addToken("(", _env); addToken(`"${_regExp.slice(1, -1)}"`, _env); addToken(")", _env); } else { addToken(_code[i], _env); } _current = ""; } } } else { _current += _code[i]; } break; case "0": case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": _current += _code[i]; break; case "{": case "}": if(!_env.IN_STRING && !_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE) { if(_code[i] == "{" && _code[i + 1] && _code[i + 1] == _code[i]) { _env.IN_NATIVE = true; addToken(_current, _env); _current = "{{"; i++; } else if(_code[i] == "{" && _code[i + 1] && _code[i + 1] != "}" && _code[i - 1] && (_code[i - 1] == "=" || _code[i - 1] == "," || _code[i - 1] == "return")) { // obj _env.flowObject++; _current += "{"; } else if(_code[i] == "{" && _code[i + 1] && _code[i + 1] != "}" && (_before == "=" || _before == "," || _before == "return" || _before == "(")) { // obj _env.flowObject++; _current += "{"; addToken(_current, _env), _current = ""; } else if(_code[i] == "{" && _before && _before == ")") { // function() = {}; or catch(e){} addToken(_current, _env); if(_code[i+1] == "}") { addToken("{", _env); if(_env.flowObject < 1) { incToken(_env); } addToken("}", _env); addFlow(_env); i++; } else { addToken(_code[i], _env); if(_env.flowObject < 1) { incToken(_env); } _env.flowBracket++; } _current = ""; } else if(_code[i] == "{" && _code[i + 1] && _code[i + 1] == "}" && _env.flowObject < 1) { // obj addToken(_current, _env); addToken("{", _env); addToken("}", _env); i++; _current = ""; } else { if(_code[i] == "{") { if(_env.flowObject < 1) { addToken(_current, _env); addToken(_code[i], _env); incToken(_env); _env.flowBracket++; _current+= ""; } else { addToken(_current, _env); addToken("{", _env); _env.flowObject++; //_current += _code[i]; _current = ""; } } else { if(_env.flowObject > 0 || _env.flowAccessor > 0 ) { //_current += _code[i]; addToken(_current, _env); addToken("}", _env); //addFlow(_env); _env.flowObject--; _current = ""; } else { if(_env.SWITCH > 0) { _env.SWITCH--; } //_current += "}"; addToken(_current, _env); addToken("}", _env); addFlow(_env); //incToken(_env); _env.flowBracket--; _current = ""; } } } } else if(_env.IN_NATIVE && _code[i] == "}" && _code[i + 1] && _code[i + 1] == _code[i]) { _env.IN_NATIVE = false; _current += "}}"; addToken(_current, _env); addFlow(_env); _current = ""; i++; } else { _current += _code[i]; } break; case "[": case "]": case "(": case ")": if(!_env.IN_STRING && !_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE) { if(_code[i] == "(") { setFor(_current, _env); setSwitch(_current, _env); _env.flowParenthesis++; } else if(_code[i] == ")") { _env.flowParenthesis--; } else if(_code[i] == "[") { _env.flowAccessor++; } else if(_code[i] == "]") { _env.flowAccessor--; } addToken(_current, _env); addToken(_code[i], _env); _current = ""; } else { _current += _code[i]; } break; case ";": if(!_env.IN_STRING && !_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE) { addToken(_current, _env); addToken(";", _env); _current = ""; if(_env.FOR == 0) { addFlow(_env); } else { _env.FOR--; } } else { _current += _code[i]; } break; case ":": if(!_env.IN_STRING && !_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE && _env.SWITCH == 0) { addToken(_current, _env); addToken(":", _env); _current = ""; } else if(!_env.IN_STRING && !_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE && _env.SWITCH > 0) { addToken(_current, _env); addToken(":", _env); _current = ""; addFlow(_env); } else { _current += _code[i]; } break; case ",": if(!_env.IN_STRING && !_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE) { addToken(_current, _env); addToken(",", _env); _current = ""; } else { _current += _code[i]; } break; case "!": case "+": case "-": if(!_env.IN_STRING && !_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE) { addToken(_current, _env); if(_code[i + 1] && _code[i + 1] == _code[i]) { addToken(_code[i] + _code[i + 1], _env); i++; } else if(_code[i + 1] && _code[i + 1] == "=") { // += -= addToken(_code[i] + _code[i + 1], _env); i++; } else { addToken(_code[i], _env); } _current = ""; } else { _current += _code[i]; } break; case "*": case ".": if(!_env.IN_STRING && !_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE) { var _number = isNumber(_current); if(_number.check) { _current += _code[i]; } else { addToken(_current, _env); addToken(_code[i], _env); _current = ""; } } else { _current += _code[i]; } break; default: _current += _code[i]; var _currentScope = []; if(_env.TOKENS.length > 0) { _currentScope = _env.TOKENS[_env.TOKENS.length - 1]; } var _lastToken; if(_currentScope.length > 0) { _currentScope = _currentScope[_currentScope.length - 1]; } if(_current == "in" && _code[i+1] == " ") { _env.FOR = 0; } if(!_env.IN_STRING && !_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE && _current == "function" && (_currentScope == ":" || _currentScope == "," || _currentScope == "[")) { var _functionID = "__NERD_LAMBDA_FUNC_" + Math.random().toString(36).slice(2, 12); var _bracketState = 0; var _end = -1; //addVar(_functionID, _env); for(var b = i; b < _code.length; b++) { if(_code[b] == "{") { _bracketState++; } else if(_code[b] == "}") { _bracketState--; if(_bracketState == 0) { _end = b+1; break; } } } var bodyLambda = "var " + _functionID + " = " + _code.substring(i-8, _end); _current = ""; _code = _code.substring(0, i+1) + _functionID + _code.substring(_end); var _tmpEnv = createEnv(); _tmpEnv.REGISTER = _tmpEnv.REGISTER.concat(_env.REGISTER); parseCode(bodyLambda, 0, _tmpEnv); _env.LAMBDA[_functionID] = { code: bodyLambda, env: _tmpEnv }; } break; } _env.CURSOR++; } addFlow(_env); if(_current.length > 0 && i == _code.length) { error("[!] untermined instruction"); } if(_env.flowBracket < 0) { error("[!] Missing opening bracket {"); } else if(_env.flowBracket > 0) { error("[!] Missing closing bracket }"); } if(_env.flowObject < 0) { error("[!] Missing opening bracket {"); } else if(_env.flowObject > 0) { error("[!] Missing closing bracket }"); } if(_env.flowParenthesis < 0) { error("[!] Missing opening parenthesis ("); } else if(_env.flowParenthesis > 0) { error("[!] Missing closing parenthesis )"); } if(_env.flowAccessor < 0) { error("[!] Missing opening accessor ["); } else if(_env.flowAccessor > 0) { error("[!] Missing closing accessor ]"); } if(_env.IN_NATIVE) { error("[!] Missing closing native block }} ]"); } if(_env.IN_STRING) { error("[!] Missing closing string \" }} ]"); } if(_env.IN_BLOCK_QUOTE) { error("[!] Missing closing block quote ` }} ]"); } } module.exports = parseCode; ================================================ FILE: lib/require.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var fs = require("fs"); var CACHE = {}; var showModuleComment = function(_obj, _name) { if(Array.isArray(_obj)) { for(var l = 0; l < _obj.length; l++ ) { console.log("[*] " + _name + ": " + _obj[l]); } } else if(typeof(_obj) == "string") { console.log("[*] " + _name + ": " + _obj); } else if(typeof(_obj) == "object") { var _platform; if(_obj[global.PLATFORM]) { _platform = global.PLATFORM; } else if(_obj["default"]) { _platform = "default"; } if(_obj[_platform] && typeof(_obj[_platform]) == "object") { var currentCompiler = global.COMPILER.COMPILER.split(" ")[0]; var _compiler; if(_obj[_platform][currentCompiler]) { _compiler = currentCompiler; } else if(_obj[_platform]["default"]) { _compiler = "default"; } if(_obj[_platform][_compiler]) { showModuleComment(_obj[_platform][_compiler], _name); } } else if(_obj[_platform]) { showModuleComment(_obj[_platform], _name); } } } var addModuleLib = function(_lib, modSource) { if(Array.isArray(_lib)) { for(var l = 0; l < _lib.length; l++ ) { global.COMPILER.LIBS += _lib[l].replace(/{__MODULE__}/g, global.path.resolve(modSource)).replace(/{__ARCH__}/g, global.os.arch()).replace(/{__EXTERN__}/g, global.extern) + " "; } } else if(typeof(_lib) == "string") { global.COMPILER.LIBS += _lib.replace(/{__MODULE__}/g, modSource).replace(/{__ARCH__}/g, global.os.arch()).replace(/{__EXTERN__}/g, global.extern) + " "; } else if(typeof(_lib) == "object") { var _platform; if(_lib[global.PLATFORM]) { _platform = global.PLATFORM; } else if(_lib["default"]) { _platform = "default"; } if(_lib[_platform] && Array.isArray(_lib[_platform])) { addModuleLib(_lib[_platform], modSource); } if(_lib[_platform] && typeof(_lib[_platform]) == "object") { var currentCompiler = global.COMPILER.COMPILER.split(" ")[0]; var _compiler; if(_lib[_platform][currentCompiler]) { _compiler = currentCompiler; } else if(_lib[_platform]["default"]) { _compiler = "default"; } if(_lib[_platform][_compiler]) { addModuleLib(_lib[_platform][_compiler], modSource); } } else if(_lib[_platform]) { addModuleLib(_lib[_platform], modSource); } } } var genRequire = function(from, addSource, _env, _name) { var modSource = ""; var fileSource; if(global.COMPILER.DIR.length > 0) { from = global.COMPILER.DIR[global.COMPILER.DIR.length - 1]; } if(addSource.indexOf(from) > -1) { modSource = addSource; } else { modSource = global.path.join(from + addSource); } global.COMPILER.DIR.push(__dirname + "/"); var trySource = [modSource, modSource + "/" + "index.ng", from + "nerd_modules/" + addSource + "/index.ng", global.NERD_PATH + "/nerd_modules/" + addSource + "/index.ng", modSource + ".ng", modSource, ]; var newSrc = ""; for(var i = 0; i < trySource.length; i++) { try { modSource = global.path.dirname(trySource[i]) + "/"; newSrc = fs.readFileSync(trySource[i]).toString(); if(global.CLI.cli["--env"] && global.CLI.cli["--env"].argument == "js" && addSource != "Module") { newSrc = `var module = require("Module");` + newSrc; } if(CACHE[addSource]) { global.COMPILER.DIR.pop(); return {add: false, module: CACHE[addSource], code: ""}; } fileSource = trySource[i]; var pkgpath = global.path.join(modSource, "package.json"); var pkgObject; if(fs.existsSync(pkgpath)) { var pkg = fs.readFileSync(pkgpath); try { pkg = JSON.parse(pkg); pkgObject = pkg; if(pkg.nerd) { if(pkg.nerd.message) { showModuleComment(pkg.nerd.message, pkg.name); } if(pkg.nerd.env) { if(pkg.nerd.env.indexOf(global.COMPILER.ENV.name) < 0) { console.error("Nerd:\n\n[!] module " + addSource + " doesn't support env : " + global.COMPILER.ENV.name + " only these : " + pkg.nerd.env); process.exit(1); } } if(pkg.nerd.target) { if(!global.COMPILER.TARGET) { console.error("Nerd:\n\n[!] module " + addSource + " require one of these targets : " + pkg.nerd.target + ". None specified"); process.exit(1); } else if(pkg.nerd.target.indexOf(global.COMPILER.TARGET) < 0) { console.error("Nerd:\n\n[!] module " + addSource + " require one of these targets : " + pkg.nerd.target + ". " + global.COMPILER.TARGET + " specified"); process.exit(1); } } /* if(pkg.nerd.expose) { COMPILER.EXPOSE = COMPILER.EXPOSE.concat(pkg.nerd.expose); COMPILER.GLOBAL = COMPILER.GLOBAL.concat(pkg.nerd.expose); } */ if(pkg.nerd.lib) { addModuleLib(pkg.nerd.lib, modSource); } } } catch(e) { console.log("Nerd:\n[!] " + e + " -> " + pkgpath.split("/").splice(-3).join("/")); } } break; } catch (e) {} } var ext = "nd"; if(fileSource && fileSource.split) { var _Ext = fileSource.split("."); if(_Ext.length > 1) ext = _Ext[_Ext.length - 1]; var _newEnv = global.createEnv(modSource); global.parseCode(newSrc, 0, _newEnv); global.parseAST(_newEnv); var _generated = global.generateCode(_newEnv); var reqFN = "__MODULE_" + Math.random().toString(36).substr(2, 10); global.addVar(reqFN, _env); //CACHE[addSource] = reqFN + "(" + _name + ")"; CACHE[addSource] = reqFN + "(__NERD_THIS)"; newSrc = "NerdCore::Global::var " + reqFN + " = NerdCore::VAR(NerdCore::Enum::Type::Function, new NerdCore::Type::function_t([&](NerdCore::VAR& __NERD_THIS, NerdCore::VAR* __NERD_VARARGS, int __NERD_VARLENGTH, void* __NERD_PTR = nullptr) mutable{\n"; newSrc += _generated; if(global.CLI.cli["--env"] && global.CLI.cli["--env"].argument == "js") { newSrc += `return module["exports"];`; } newSrc += "return NerdCore::Global::null;\n}));"; global.COMPILER.REQUIRE += newSrc + ";"; global.COMPILER.DIR.pop(); //return {add: true, module: reqFN + "(" + _name + ")", code: newSrc} return {add: true, module: reqFN + "(__NERD_THIS)", code: newSrc}; } else { global.error("[!] module unknown: " + addSource); } } module.exports = genRequire; ================================================ FILE: lib/verify.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var isVariable = require("./check/isVariable.js"); var isNumber = require("./check/isNumber.js"); var isString = require("./check/isString.js"); var isBoolean = require("./check/isBoolean.js"); function verifyExpression(_exp, _inst, _env) { for(var i = 0; i < _env.FLOW[_inst].length; i++) { if(_env.FLOW[_inst][i] == "new") { _env.FLOW[_inst][i] = ""; _env.FLOW[_inst][i+1] = "((NerdCore::Class::Function*)" + _env.FLOW[_inst][i+1] + ".data.ptr)->New" } } for(var z = 0; z < _exp.length; z++) { if(RESERVED.indexOf(_exp[z]) < 0 && BOOLEAN_KEYWORD.indexOf(_exp[z]) < 0 && isVariable(_exp[z]).check) { if( (!_exp[ z - 1] || _exp[ z - 1] != ".") && (!_exp[ z + 1] || _exp[ z + 1] != ":" ) && !varExists(_exp[z], _env)) { if(_env.MAP[_inst][z]) { error(`[!] Unknown variable: ${_exp[z]} line:${_env.MAP[_inst][z].line + 1} position:${_env.MAP[_inst][z].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][z].line]}`); } else { error(`[!] Unknown variable: ${_exp[z]}`); } } } if(_exp[z] == "__NERD_Multi_Line_Quote") { _env.FLOW[_inst][z + 2] = _exp[z + 2].slice(1, _exp[z + 2].length - 1) } } } function checkLogicalState(_token, _next, _env, _ast) { var _logicalState = getLogical(_env); if(_logicalState.DO) { if(_token == "}") { if(_next != "WHILE") { return { error: true, message: "Unexpected token, waiting for while"}; } } else if(_token == "WHILE") { return { error: false }; } else { return { error: true, message: "Unexpected token, waiting for while"}; } } if(_logicalState.TRY) { if(_token == "}") { if(_next != "CATCH") { return { error: true, message: "Unexpected token, waiting for catch"}; } } else if(_token == "CATCH") { return { error: false }; } else { return { error: true, message: "Unexpected token, waiting for catch"}; } } if(_logicalState.FUNCTION) { if(_token == "}") { if(_ast && _ast[1] && (_ast[1] == "SEMI" || _ast[1] == ";")) { //good } else if(_next && (_next == "SEMI" || _next == ";")) { // good } else { //return { error: true, message: "Unexpected token, waiting for ';' after "}; } } } return { error: false }; } function getFunctionThis(_flow, param, _env, _inst) { var _end = -1; for(var i = 0; i < _flow.length; i++) { if(_flow[i] == "[" || _flow[i] == "\"" || isVariable(_flow[i], _env).check) { _end = i; } else if(_flow[i] == "(") { break; } } return _end; } function getFunctionArgs(_flow, param, _env, _inst, _call) { var _return = {}; var _this = getFunctionThis(_flow, param, _env, _inst); _return["this"] = "__NERD_THIS"; if(_this > -1) { if(_this == 0) { _return["this"] = _flow[0]; } else { _return["this"] = _flow.slice(0, _this).join(" "); } } var _parenthesis = 0; _return["args"] = []; for(var i = 0; i < _flow.length; i++) { if(_flow[i] == "(") _parenthesis++; else if(_flow[i] == ")") _parenthesis--; else if(_parenthesis > 0) { if(_flow[i][0] == '\"') { _return["args"].push(_flow[i]); } else if(_flow[i] == "new" && _flow[i+1]) { var _end = 0; var _argP = 0; for(var j = i; j < _flow.length; j++) { if(_flow[j] == "(") { _argP++; } else if(_flow[j] == ")") { _argP--; if(_argP == 0) { _end = j + 1; break; } } } _new = "__NERD_FUNCTION(" + _flow[i+1] + ")->New" + _flow.slice(i + 2, _end).join(" "); _env.FLOW[_inst] = _flow.slice(0, i).concat(_new, ..._flow.slice(_end)); } else if(param && isVariable(_flow[i]) && varExists(_flow[i], _env)) { _return["args"].push(_flow[i]); } else if(param ) { _return["args"].push(_flow[i]); } else if(!param) { _return["args"].push(_flow[i]); } } else if(_parenthesis < 0) { break; } } return _return; } function _forgeArray(_var, _flow, _start, _inst, _env, _nested) { if(!_nested) { _env.FLOW[_inst][_start - 1] = "new NerdCore::Class::Array()"; _env.FLOW[_inst] = _env.FLOW[_inst].slice(0, _start); _env.FLOW[_inst].push(";"); } if(_flow[_start] != "]" ) { var a = 0; for(var i = _start; i < _flow.length - 1; i+=2) { if(_flow[i] == "[" && _flow[i + 1] == "]") { _env.FLOW[_inst].push(_var + "[" + a + "]"); _env.FLOW[_inst].push("="); _env.FLOW[_inst].push("new NerdCore::Class::Array()"); _env.FLOW[_inst].push(";"); } else if(_flow[i] == "{") { var _end = -1; var _objBracket = 0; for(var k = i; k < _flow.length; k++) { if(_flow[k] == "{") { _objBracket++; } else if(_flow[k] == "}") { _objBracket--; if(_objBracket == 0) { _end = k; break; } } } _env.FLOW[_inst].push(_var + "[" + a + "]"); _env.FLOW[_inst].push("="); _env.FLOW[_inst] = _env.FLOW[_inst].concat(_flow.slice(i, _end)); forgeObject(_flow, i+6, _inst, _env); i = _end; // we jump to the end of this object } else if(_flow[i] == "[") { _env.FLOW[_inst].push(_var + "[" + a + "]"); _env.FLOW[_inst].push("="); _env.FLOW[_inst].push("new NerdCore::Class::Array()"); _env.FLOW[_inst].push(";"); forgeArray( _var + "[" + a + "]", _flow, i+1, _inst, _env, true); var _endArrayIndex = -1; var _indArr = 1; for(var z = i+1; z < _flow.length; z++) { if(_flow[z] == "[") { _indArr++; } else if(_flow[z] == "]") { _indArr--; if(_indArr == 0) { _endArrayIndex = z; break; } } } if(_endArrayIndex > -1) { i += _endArrayIndex; } } else if(_flow[i] != "]" && _flow[i] != ",") { if(_env.LAMBDA[_flow[i]]) { var _l = _env.LAMBDA[_flow[i]]; _l.env.REGISTER = _l.env.REGISTER.concat(_env.REGISTER); for(var k = 0; k < _l.env.FLOW.length; k) { k = verifyFlow(_l.env.AST[k], _l.env.FLOW[k], k, _l.env.FLOW, _l.env); } for(var j = 0; j < _l.env.FLOW.length; j++) { _env.FLOW[_inst].push( _l.env.FLOW[j].join(" ") ); } } else if(isVariable(_flow[i]).check) { if(!varExists(_flow[i], _env)) { error(`[!] Variable or token undefined: ${_flow[i]} line:${_env.MAP[_inst][i].line + 1} position:${_env.MAP[_inst][i].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][i].line]}`); } } _env.FLOW[_inst].push(_var + "[" + a + "]"); _env.FLOW[_inst].push("="); _env.FLOW[_inst].push(_flow[i]); _env.FLOW[_inst].push(";"); } a++; } } } function _forgeObject(_var, _flow, _start, _inst, _env) { if(typeof _var != "object") { _var = [_var]; } //var newFlow = _env.FLOW[_inst].slice(0, _start - 1); //newFlow.push("((NerdCore::Class::Function*)Object.data.ptr)->New()"); //newFlow.push(";"); for(var f = _start; f < _env.FLOW[_inst].length; f+=4) { if(_env.FLOW[_inst][f+1] && _env.FLOW[_inst][f+1] == ":" /*&& (_env.FLOW[_inst][f+2] != "}" && _env.FLOW[_inst][f+2] != "," )*/ ) { _env.FLOW[_inst][f] = _env.FLOW[_inst][f+1] = ","; if(_env.FLOW[_inst][f + 2] && isVariable(_env.FLOW[_inst][f + 2]).check) { if(_env.LAMBDA[_env.FLOW[_inst][f + 2]]) { var _l = _env.LAMBDA[_env.FLOW[_inst][f + 2]]; _l.env.REGISTER = _l.env.REGISTER.concat(_env.REGISTER); for(var i = 0; i < _l.env.FLOW.length; i) { i = verifyFlow(_l.env.AST[i], _l.env.FLOW[i], i, _l.env.FLOW, _l.env); } for(var j = 0; j < _l.env.FLOW.length; j++) { newFlow.push( _l.env.FLOW[j].join(" ") ); } } else if(!varExists(_env.FLOW[_inst][f + 2], _env)) { error(`[!] Variable or token undefined: ${_env.FLOW[_inst][f + 2]} line:${_env.MAP[_inst][f+2].line + 1} position:${_env.MAP[_inst][f+2].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][f+2].line]}`); } } if(_env.FLOW[_inst][f + 2] && _env.FLOW[_inst][f + 2] == "{") { if(isVariable(_env.FLOW[_inst][f]).check) { _var.push("[\"" + _env.FLOW[_inst][f] + "\"]"); newFlow.push(_var.join("") + " = new NerdCore::Class::Object();"); } else { _var.push("[" + _env.FLOW[_inst][f] + "]"); newFlow.push(_var.join("") + " = new NerdCore::Class::Object();"); } if(_env.FLOW[_inst][f + 3] != ",") { f--; } } else if(_env.FLOW[_inst][f + 2] && _env.FLOW[_inst][f + 2] == "[") { if(isVariable(_env.FLOW[_inst][f]).check) { _var.push("[\"" + _env.FLOW[_inst][f] + "\"]"); newFlow.push(_var.join("") + " = new NerdCore::Class::Array();"); } else { _var.push("[" + _env.FLOW[_inst][f] + "]"); newFlow.push(_var.join("") + " = new NerdCore::Class::Array();"); } var _endArray = -1; var _count = 0; for(var indArray = f+2; indArray < _env.FLOW[_inst].length - 1; indArray++) { if(_env.FLOW[_inst][indArray] == "[") { _count++; } else if(_env.FLOW[_inst][indArray] == "]") { _count--; if(_count == 0) { _endArray = indArray; break; } } } if(_endArray > -1) { var _virtualFlow = _env.FLOW[_inst].slice(f+2, _endArray + 1 ); var _newFlowArray = {LAMBDA: _env.LAMBDA, FLOW:[[]]}; forgeArray(_var.join(""), _virtualFlow, 1, 0, _newFlowArray, true) newFlow.push(_newFlowArray.FLOW[0].join("")); } while(_env.FLOW[_inst][f + 3] != "," && f < _env.FLOW[_inst].length) { f++; } _var.pop(); } else { if(isVariable(_env.FLOW[_inst][f]).check) { newFlow.push(_var.join("") + "[\"" + _env.FLOW[_inst][f] + "\"] = " + _env.FLOW[_inst][f + 2]); var _bracket = f + 3; var _closing = -1; while(_env.FLOW[_inst][_bracket] == "[") { newFlow.push("["); _closing = _bracket + 1; while(_env.FLOW[_inst][_closing] != "]" && _closing < _env.FLOW[_inst].length) { _closing++; } if(_closing != _bracket + 1) { verifyExpression(_env.FLOW[_inst].slice(_bracket+1, _closing), _inst, _env); newFlow.push(_env.FLOW[_inst].slice(_bracket+1, _closing).join(" ")); } newFlow.push("]"); _bracket ++; } newFlow.push(";"); } else newFlow.push(_var.join("") + "[" + _env.FLOW[_inst][f] + "] = " + _env.FLOW[_inst][f + 2] + ";"); } } else { if(_env.FLOW[_inst][f] == "}" || _env.FLOW[_inst][f] == ",") { if(_env.FLOW[_inst][f] == "}") { _var.pop(); } f-=3; } } } _env.FLOW[_inst] = newFlow; } function forgeArray(_flow, _start, _inst, _env) { if(_flow[_start] == "[" && _flow[_start + 1] == "]") { _flow[_start] = "new NerdCore::Class::Array("; _flow[_start + 1] = ")"; return; } var _brack = 0; for(var i = _start; i < _flow.length; i++) { if(_flow[i] == "[") { _brack++; _flow[i] = "new NerdCore::Class::Array({"; } else if(_flow[i] == "]") { _brack--; _flow[i] = "})"; } if(_brack == 0) { return i; } else if(_brack == 1) { if(_flow[i] == "{") { i = forgeObject(_flow, i, _inst, _env); _flow[i] = "})"; } else if(_flow[i] == "[") { if(_flow[i + 1] == "]") { _flow[i] = "new NerdCore::Class::Array("; _flow[i + 1] = ")"; i++; } else { i = forgeArray(_flow, i, _inst, _env); _flow[i] = ")"; } } else if(_env.LAMBDA[_flow[i]]) { var _l = _env.LAMBDA[_flow[i]]; _l.env.REGISTER = _l.env.REGISTER.concat(_env.REGISTER); for(var k = 0; k < _l.env.FLOW.length; k) { k = verifyFlow(_l.env.AST[k], _l.env.FLOW[k], k, _l.env.FLOW, _l.env); } var _lambdaBody = ""; if(_l.env.FLOW[_l.env.FLOW.length-1][0] == "}") { _l.env.FLOW[_l.env.FLOW.length-1] = ["return NerdCore::Global::null;", "}", ")", ";"]; } for(var jj = 0; jj < _l.env.FLOW.length; jj++) { _lambdaBody += _l.env.FLOW[jj].join(" "); } _flow[0] = _lambdaBody + _flow[0]; } } } } function forgeObject(_flow, _start, _inst, _env) { if(_flow[_start] == "{" && _flow[_start + 1] == "}") { _flow[_start] = "new NerdCore::Class::Object("; _flow[_start + 1] = ")"; return; } var _brack = 0; if(_flow[_start + 2] == ":") { for(var i = _start; i < _flow.length; i++) { if(_flow[i] == "{") { _brack++; _flow[i] = "new NerdCore::Class::Object({"; } else if(_flow[i] == "}") { _brack--; } if(_brack == 0) { if(_flow[i] == "}") { _flow[i] = "})"; } return i; } else if(_brack == 1) { if(_flow[i] == ":") { _flow[i] = ","; if(_flow[i - 1][0] != "\"") { _flow[i - 1] = "\"" + _flow[i - 1] + "\""; } _flow[i - 1] = "{" + _flow[i - 1]; // if nested object if(_flow[i + 1] == "{") { if(_flow[i + 2] == "}") { _flow[i + 1] = "new NerdCore::Class::Object("; _flow[i + 2] = ")}"; i += 2; } else { i = forgeObject(_flow, i+1, _inst, _env); _flow[i] = "})"; } } else { if(_env.LAMBDA[_flow[i + 1]]) { var _l = _env.LAMBDA[_flow[i + 1]]; _l.env.REGISTER = _l.env.REGISTER.concat(_env.REGISTER); _flow[i + 1] = "var(" + _flow[i + 1] + ")"; for(var k = 0; k < _l.env.FLOW.length; k) { k = verifyFlow(_l.env.AST[k], _l.env.FLOW[k], k, _l.env.FLOW, _l.env); } var _lambdaBody = ""; if(_l.env.FLOW[_l.env.FLOW.length-1][0] == "}") { _l.env.FLOW[_l.env.FLOW.length-1] = ["return NerdCore::Global::null;", "}", ")", ";"]; } for(var jj = 0; jj < _l.env.FLOW.length; jj++) { _lambdaBody += _l.env.FLOW[jj].join(" "); } _flow[0] = _lambdaBody + _flow[0]; } else if(_flow[i + 1] && isVariable(_flow[i + 1]).check && !varExists(_flow[i + 1], _env).error) { if(_flow[i + 2] == "[") { var _acc = 0; i++; while(++i && i < _flow.length) { if(_flow[i] == "[") { _acc++; } else if(_flow[i] == "]") { _acc--; } if(_acc == 0) { break; } } } } else if(_flow[i + 1] == "[") { if(_flow[i + 2] == "]") { _flow[i + 1] = "new NerdCore::Class::Array("; _flow[i + 2] = ")}"; i += 2; continue; } else { i = forgeArray(_flow, i+1, _inst, _env); _flow[i] = ")}"; } } if(_flow[i + 1] != "}") { _flow[i + 1] = _flow[i + 1] + "}"; if(_flow[i] != ",") { _flow[i + 1] += ","; } } } } } } } } var _NO_THIS = ["if", "else", "while", "for", "while", "typeof", "type_of", "size_of", "length_of", "catch"]; var _NO_CALL = ["require", "function"]; var checkCalls = function(_eq, _flow, _inst, _env) { var _callTree = []; var _current = 0; var _lastThis; for(var i = 0; i < _flow.length; i++) { var _start = -1; var _end = -1; var _par = 0; if(_flow[i] == "(") { _par++; _start = i - 1; var _end = -1; for(var j = i+1; j < _flow.length; j++) { if(_flow[j] == "(") { _par++; } if(_flow[j] == ")") { _par--; } if(_par == 0) { _end = j; break; } } if(_end != -1) { var _var = i-1; while(--_var > -1) { if(_flow[_var] == "]" || _flow[_var] == "[" || _flow[_var][0] == "\"" || isVariable(_flow[_var], _env).check) { // nothing to do } else { break; } } _var++; if(_NO_CALL.indexOf(_flow[_var]) < 0) { // FORGE LAMBDAS for(var a = 0; a < _env.FLOW[_inst].length; a++) { if(isVariable(_env.FLOW[_inst][a]).check) { if(_env.LAMBDA[_env.FLOW[_inst][a]]) { var _l = _env.LAMBDA[_env.FLOW[_inst][a]]; _l.env.REGISTER = _l.env.REGISTER.concat(_env.REGISTER); for(var k = 0; k < _l.env.FLOW.length; k) { k = verifyFlow(_l.env.AST[k], _l.env.FLOW[k], k, _l.env.FLOW, _l.env); } var _lambdaBody = ""; if(_l.env.FLOW[_l.env.FLOW.length-1][0] == "}") { _l.env.FLOW[_l.env.FLOW.length-1] = ["return NerdCore::Global::null;", "}", ")", ";"]; } for(var jj = 0; jj < _l.env.FLOW.length; jj++) { _lambdaBody += _l.env.FLOW[jj].join(" "); } _env.FLOW[_inst-1].push(_lambdaBody); } } } var _args = getFunctionArgs(_flow.slice(_var, _end + 1), true, _env, _inst, true); if(_args.this == "[") { if(_lastThis) { _args.this = _lastThis; } else { _args.this == "__NERD_THIS"; } } else { _lastThis = _args.this; } // forge arrays for(var a = 0; a < _env.FLOW[_inst].length; a++) { if(_env.FLOW[_inst][a] == "[" && _env.FLOW[_inst][a-1] && (_env.FLOW[_inst][a-1] == "(" || _env.FLOW[_inst][a-1] == ",")) { var _brack = 1; for(var b = a+1; b < _env.FLOW[_inst].length; b++) { if(_env.FLOW[_inst][b] == "[") { _brack++; } else if(_env.FLOW[_inst][b] == "]") { _brack--; } if(_brack == 0) { a = forgeArray(_env.FLOW[_inst], a, _inst, _env) break; } } } } if(_NO_THIS.indexOf(_args.this) < 0) { _flow[i] = _flow[i] + _args.this; if(_args.args.length > 0) { _flow[i] += "," } } for(var a = 0; a < _args.args.length; a+=2) { if(RESERVED.indexOf(_args.args[a]) < 0 && isVariable(_args.args[a]).check && !varExists(_args.args[a], _env)) { error(`[!] Unknown variable or token: ${_args.args[a]} line:${_env.MAP[_inst][_eq + a].line + 1} position:${_env.MAP[_inst][_eq + a].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][_eq + a].line]}`); } } } } } } return _inst + 1; } function verifyFlow(_ast, _flow, _inst, _scope, _env, _main) { if(_ast.length < 1) { return _inst + 1; } for(var z = 0; z < _flow.length; z++) { if(_flow[z] == ".") { _scope[_inst] = _scope[_inst].slice(0, z-1); _scope[_inst].push(_flow[z-1]); for(var v = z; v < _flow.length; v++) { if(_flow[v] == ".") { _scope[_inst].push("["); _scope[_inst].push("\"" + _flow[v+1] + "\""); _scope[_inst].push("]"); v++; } else { _scope[_inst].push(_flow[v]); } } break; } } _flow = _scope[_inst]; for(var i = 0; i < _flow.length; i++) { if(_flow[i] == "this") { _flow[i] = "__NERD_THIS"; } } var _next; if(_scope[_inst+1] && _scope[_inst+1][0]) { _next = _scope[_inst+1][0]; } var _logicalError = checkLogicalState(_ast[0], _next, _env, _ast); if(_logicalError.error) { error(`[!] ${_logicalError.message}: ${_flow[0]} line:${_env.MAP[_inst][0].line + 1} position:${_env.MAP[_inst][0].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][0].line]}`); } switch(_flow[0]) { case "var": if(RESERVED.indexOf(_flow[1]) > -1) { error(`[!] ${_flow[1]} is a reserved keyword: ${_flow[1]} line:${_env.MAP[_inst][1].line + 1} position:${_env.MAP[_inst][1].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][1].line]}`); } if(_flow[2] != "=") { addVar(_flow[1], _env); return _inst + 1; } else if(_flow[2] == "=") { var _existsVar = checkVarExists(_flow[1], _env, _flow); if(_existsVar.error) { error(`[!] ${_existsVar.message}: line:${_env.MAP[_inst][1].line + 1} position:${_env.MAP[_inst][1].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][1].line]}`); } if(_flow[3] == "function") { var _newFlow = [_flow[0], _flow[1], _flow[2], "__NERD_Create_Var_Scoped_Copy_Anon_With_Ref", "(" + _flow[1] + ",{"]; var _args = getFunctionArgs(_flow, false, _env, _inst); addVar(_flow[1], _env, 1, _inst); nextScope(_env); addLogical("FUNCTION", _env); _scope[_inst] = _newFlow; var item = 0; for(var a = 0; a < _args.args.length; a+=2) { addVar(_args.args[a], _env, 5, _inst); _scope[_inst] = _scope[_inst].concat(["var", _args.args[a], ";", "if", "(", "__NERD_VARLENGTH", ">", item,")", _args.args[a], "=", `__NERD_VARARGS[${item}];`]); item++; } //verifyExpression(_flow.slice(6), _inst, _env); return _inst + 1; } else if(_flow[3] == "[" ) { addVar(_flow[1], _env); forgeArray(_flow, 3, _inst, _env); return _inst + 1; } else if(_flow[3] == "{}") { addVar(_flow[1], _env); forgeObject(_flow, 3, _inst, _env); return _inst + 1; } else if(_flow[3] == "{") { addVar(_flow[1], _env); forgeObject(_flow, 3, _inst, _env); return _inst + 1; } else if(_flow[3] == "exit") { error(`[!] Invalid use of exit: line:${_env.MAP[_inst][eq].line + 1} position:${_env.MAP[_inst][eq].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][eq].line]}`); } else if(_flow[3] == "require") { addVar(_flow[1], _env); verifyExpression(_flow.slice(3), _inst, _env); var _args = getFunctionArgs(_flow, true, _env, _inst); if(_args.args.length != 1) { error(`[!] Invalid number of parameter, only one required: ${_flow[3]} line:${_env.MAP[_inst][3].line + 1} position:${_env.MAP[_inst][3].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][3].line]}`); } var _required = genRequire(COMPILER.PATH, _args.args[0].slice(1, _args.args[0].length - 1), _env, _flow[1]); if(_required.add) { COMPILER.DECL += _required.code; } _scope[_inst] = _flow.slice(0, 3); _scope[_inst].push(_required.module); _scope[_inst].push(";"); } else { addVar(_flow[1], _env); verifyExpression(_flow.slice(3), _inst, _env); if(_flow[3] != "arguments" && _flow[3] != "Array") { checkCalls(3, _flow, _inst, _env); } } return _inst + 1; } break; nextScope(_env); break; case "}": if(getLogical(_env).FUNCTION) { _scope[_inst] = ["return NerdCore::Global::null;"].concat(_flow).concat([")", ";"]); removeLogical("FUNCTION", _env); } if(_scope[_inst - 1] && (_scope[_inst - 1][0] == "case" || _scope[_inst - 1][0] == "default")) { _scope[_inst - 1].push("break;"); _env.SWITCH_MAP.pop(); } popScope(_env); break; case "exit": verifyExpression(_flow.slice(1), _inst, _env); var _args = getFunctionArgs(_flow, true, _env, _inst); if(_args.args.length < 1) { error(`[!] Invalid number of parameter, only one required: ${_flow[3]} line:${_env.MAP[_inst][3].line + 1} position:${_env.MAP[_inst][3].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][3].line]}`); } break; case "require": var _args = getFunctionArgs(_flow, true, _env, _inst); if(_args.args.length < 1) { error(`[!] Missing file parameter: ${_flow[3]} line:${_env.MAP[_inst][3].line + 1} position:${_env.MAP[_inst][3].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][3].line]}`); } verifyExpression(_flow.slice(1), _inst, _env); var _required = genRequire(COMPILER.PATH, _args.args[0].slice(1, _args.args[0].length - 1), _env, _flow[0]); if(_required.add) { COMPILER.DECL += _required.code; } _scope[_inst] = []; _scope[_inst].push(_required.module); _scope[_inst].push(";"); break; /* case "function": var _hoisting = []; var _bracketState = 0; var _end = -1; for(var s = _inst; s < _scope.length; s++) { for(var b = i; b < _scope[s].length; b++) { if(_scope[s][b] == "{") { _bracketState++; } else if(_scope[s][b] == "}") { _bracketState--; if(_bracketState == 0) { _end = s+1; break; } } } if(s > -1) { break; } } _hoisting = _hoisting.concat(_scope.slice(0, _inst), _scope.slice(_end)); var _newScope = [].concat(_scope.slice(0, _inst), _scope.slice(_end)); _env.FLOW = _env.FLOW.slice(0, _inst).concat(_env.FLOW.slice(_end)); _env.AST = _env.AST.slice(0, _inst).concat(_env.AST.slice(_end)); return _inst; break; */ case "define": _scope[_inst] = []; if(_flow[2] == "__NERD_Multi_Line_Quote") { COMPILER.DECL += "\n" + _flow[4].slice(1, _flow[4].length -1) + "\n"; } else COMPILER.DECL += "\n" + _flow[2].slice(1, _flow[2].length - 1) + "\n"; return _inst + 1; break; case "include": _scope[_inst] = [""]; if(_flow[2][1] == "<") { COMPILER.INCLUDE += "#include " + _flow[2].slice(1, _flow[2].length - 1) + "\n"; } else { var _toInclude = _flow[2].slice(1, _flow[2].length - 1); var _pathToInclude = path.resolve(path.join( _env.PATH, _toInclude)); if(fs.existsSync(_pathToInclude)) { COMPILER.INCLUDE += "#include \"" + _pathToInclude + "\"\n" } else COMPILER.INCLUDE += "#include " + _flow[2] + "\n"; } return _inst + 1; break; case "for": if(_flow[2] == "auto") { break; }; nextScope(_env); var _for = _flow.slice(2); if(_flow[4] == "in") { addVar(_flow[3], _env); var _functionID = "__NERD_IT_FUNC_" + Math.random().toString(36).slice(2, 12); var _iterator = _for.slice(3, 4); verifyExpression(_iterator, _inst, _env); _scope[_inst] = [ "var", _functionID, "=", "function", "(", _for[1], ")", "{", ]; var _nextScope = [ "{{if(" + _iterator[0] + ".type == NerdCore::Enum::Type::Object){ for(auto __NERD_ITERATOR = ((NerdCore::Class::Object*)" + _iterator[0] + ".data.ptr)->object.begin(); __NERD_ITERATOR != ((NerdCore::Class::Object*)" + _iterator[0] + ".data.ptr)->object.end(); ++__NERD_ITERATOR) {if(__NERD_ITERATOR->first.compare(\"__proto__\") != 0) {var " + _for[1] + " = __NERD_ITERATOR->first;" + _functionID + "(null," + _for[1] + ");}}}else if(" + _iterator[0] + ".type == NerdCore::Enum::Type::Array){for(std::size_t __NERD_ITERATOR = 0; __NERD_ITERATOR < ((NerdCore::Class::Array*)" + _iterator[0] + ".data.ptr)->value.size(); __NERD_ITERATOR++) {" + _functionID + "(null,__NERD_ITERATOR);}}else if(" + _iterator[0] + ".type == NerdCore::Enum::Type::String){for(std::size_t __NERD_ITERATOR = 0; __NERD_ITERATOR < ((NerdCore::Class::String*)" + _iterator[0] + ".data.ptr)->value.length(); __NERD_ITERATOR++) {var " + _for[1] + " = __NERD_ITERATOR;" + _functionID + "(null," + _for[1] + ");}}}}", ]; var sIndex = 1; var endOfScope = 0; for(var f = _inst+1; f < _scope.length; f++) { endOfScope = f; if(_scope[f][_scope[f].length - 1] == "}") { sIndex--; } if(sIndex == 0) { break; } } _env.FLOW.splice(endOfScope+1, 0, _nextScope); _env.AST.splice(endOfScope+1, 0, ["NATIVE"]); return _inst; } var _firstComa = _for.indexOf(";"); var _init = _for.slice(0, _firstComa); _for = _for.slice(_firstComa + 1); var _secondComa = _for.indexOf(";"); var _loop = _for.slice(0, _secondComa); var _it = _for.slice(_secondComa + 1, _for.length - 2); if(_init[0] == "var") { addVar(_init[1], _env); } else { verifyExpression(_init, _inst, _env); } verifyExpression(_loop, _inst, _env); verifyExpression(_it, _inst, _env); return _inst + 1; break; case "if": verifyExpression(_flow.slice(2, _flow.length - 2), _inst, _env); checkCalls(2, _flow, _inst, _env); addLogical("IF", _env); nextScope(_env); return _inst + 1; break; case "else": if(!getLogical(_env).IF) { error(`[!] Use if before else/else if: ${_flow[0]} line:${_env.MAP[_inst][0].line + 1} position:${_env.MAP[_inst][0].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][0].line]}`); } if(_flow[1] && _flow[1] == "if") { verifyExpression(_flow.slice(2, _flow.length - 2), _inst, _env); checkCalls(3, _flow, _inst, _env); nextScope(_env); } else { nextScope(_env); } return _inst + 1; break; case "do": addLogical("DO", _env); nextScope(_env); return _inst + 1; break; case "while": verifyExpression(_flow.slice(2, _flow.length - 2), _inst, _env); if(getLogical(_env).DO) { removeLogical("DO", _env); } else { nextScope(_env); } return _inst + 1; break; case ";": break; case "try": addLogical("TRY", _env); nextScope(_env); return _inst + 1; break; case "catch": addVar(_scope[_inst][2], _env); _scope[_inst][2] = "var " + _scope[_inst][2]; if(getLogical(_env).TRY) { removeLogical("TRY", _env); } else { error(`[!] Missing try statement before catch: ${_flow[0]} line:${_env.MAP[_inst][0].line + 1} position:${_env.MAP[_inst][0].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][0].line]}`); } nextScope(_env); return _inst + 1; break; case "return": if(_flow[1] == "{") { //var _returnVar = "__NERD_RETURN_" + _env.MAP[_inst][0].line; //_env.FLOW[_inst] = ["var", _returnVar, "="].concat(_env.FLOW[_inst].slice(1)); forgeObject(_flow, 1, _inst, _env); //_env.FLOW[_inst].push("return"); //_env.FLOW[_inst].push(" "); //_env.FLOW[_inst].push(_returnVar); //_env.FLOW[_inst].push(";"); } else if(_flow[1] == ";") { _flow[1] = "null;"; } else { verifyExpression(_flow.slice(1), _inst, _env); if(_ast[1] != "VARIABLE" && _ast[1] != "EXPRESSION") { _flow[1] = "var(" + _flow[1] + ")"; } } return _inst + 1; break; case "switch": nextScope(_env); var _current = _flow[2]; if(isString(_current).check || isBoolean(_current).check || isNumber(_current).check) { _current = "var(" + _current + ")"; } _env.SWITCH_MAP.push(_current); _scope[_inst] = ["if", "(", "false", ")", "{"]; // switch hack, case will be else if //_scope[_inst] = ["var", "__NERD_TEST", "=", _flow[2], ";"]; break; case "case": if(_env.SWITCH_MAP.length < 1) { error("[!] case without switch"); } if(_scope[_inst-1] && (!_scope[_inst-1][0] || (_scope[_inst-1][0] && (_scope[_inst-1][0] != "case")))) { _scope[_inst-1].push("}"); } var _current = _flow[1]; if(isString(_current).check || isBoolean(_current).check || isNumber(_current).check) { _current = "var(" + _current + ")"; } _scope[_inst] = ["else", "if", "(", _current, "==", _env.SWITCH_MAP[_env.SWITCH_MAP.length - 1]]; while(_scope[_inst+1] && _scope[_inst+1][0] && _scope[_inst+1][0] == "case") { _scope[_inst].push(" || "); if(isString(_scope[_inst+1][1]).check || isBoolean(_scope[_inst+1][1]).check || isNumber(_scope[_inst+1][1]).check) { _scope[_inst].push("var"); _scope[_inst].push("("); _scope[_inst].push(_scope[_inst+1][1]); _scope[_inst].push(")"); } else { _scope[_inst].push(_scope[_inst+1][1]); } _scope[_inst].push("=="); _scope[_inst].push(_env.SWITCH_MAP[_env.SWITCH_MAP.length - 1]); _scope[_inst+1] = []; _inst++; } _scope[_inst].push(")"); _scope[_inst].push("{"); break; case "default": if(_scope[_inst-1] && (!_scope[_inst-1][0] || (_scope[_inst-1][0] && (_scope[_inst-1][0] != "case")))) { _scope[_inst-1].push("}"); } _scope[_inst] = ["else", "{"]; break; case "break": _scope[_inst] = []; break; case "true": case "false": case "new": break; case "this": _flow[0] = "__NERD_THIS"; break; default: if(varExists(_flow[0], _env)) { /* if(!CLI.cli["--env"] || CLI.cli["--env"].argument != "js") { if(_flow[0][0] == "_" && _flow[1] && _flow[1] == "=") { error(`[!] Cannot reassign value to constant: ${_flow[0]} line:${_env.MAP[_inst][0].line + 1} position:${_env.MAP[_inst][0].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][0].line]}`); } } */ if(_flow[1]) { for(var i = 0; i < _flow.length - 1; i++) { if(_flow[i] == "require") { verifyExpression(_flow.slice(i), _inst, _env); var _args = getFunctionArgs(_flow, true, _env, _inst); if(_args.args.length != 1) { error(`[!] Invalid number of parameter, only one required: ${_flow[3]} line:${_env.MAP[_inst][3].line + 1} position:${_env.MAP[_inst][3].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][3].line]}`); } var _required = genRequire(COMPILER.PATH, _args.args[0].slice(1, _args.args[0].length - 1), _env); if(_required.add) { COMPILER.DECL += _required.code; } _scope[_inst] = _flow.slice(0, i); _scope[_inst].push(_required.module); _scope[_inst].push(";"); break; } } var _eq = -1; while(_eq < _flow.length) { for(var e = _eq; e < _flow.length; e++) { if(_flow[e] == "=") { _eq = e; break; } } var _left = _flow.slice(0, _eq).join(" "); if(_flow[_eq] == "=") { if(_flow[_eq + 1] == "{") { forgeObject(_flow, _eq + 1, _inst, _env); } else if(_flow[_eq + 1] == "[") { forgeArray( _flow, _eq + 1, _inst, _env) } else if(_flow[_eq + 1] == "[]") { forgeArray( _flow, _eq + 1, _inst, _env); } else if(_flow[_eq + 1] == "function") { var _newFlow = _flow.slice(0, _eq + 1).concat(["__NERD_Create_Var_Scoped_Copy_Anon", "({"]); var _args = getFunctionArgs(_flow, false, _env, _inst); nextScope(_env); addLogical("FUNCTION", _env); _scope[_inst] = _newFlow; var item = 0; for(var a = 0; a < _args.args.length; a+=2) { addVar(_args.args[a], _env, 4, _inst); _scope[_inst] = _scope[_inst].concat(["var", _args.args[a], ";", "if", "(", "__NERD_VARLENGTH", ">", item,")", _args.args[a], "=", `__NERD_VARARGS[${item}];`]); item++; } verifyExpression(_flow.slice(_eq + 1), _inst, _env); } break; //return _inst + 1; } _eq++; } if(_eq == _flow.length) { _eq = 0; } else { _eq++; } checkCalls(_eq, _flow, _inst, _env); } } else if(_ast[0] == "NATIVE") { // nothing to do } else { error(`[!] Unknown variable or token: ${_flow[0]} line:${_env.MAP[_inst][0].line + 1} position:${_env.MAP[_inst][0].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][0].line]}`); } break; } verifyExpression(_flow, _inst, _env); return _inst+1; } module.exports = verifyFlow; ================================================ FILE: nerd.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ global.fs = require("fs"); global.os = require("os"); global.path = require("path"); global.process = require("process"); global.child_process = require("child_process"); global.execSync = global.child_process.execSync; global.PACKAGE = JSON.parse(global.fs.readFileSync(global.path.join(__dirname, "package.json"))); global.VERSION = global.PACKAGE.version; global.extern = global.path.join(__dirname, "external"); var parseCLI = require("./base/cli/cliParser.js"); var getExt = require("./base/util/getExt.js"); var getTips = require("./base/util/getTips.js"); var Flash = require("./base/util/flash.js"); global.copyRecursiveSync = require("./base/util/copyRecursive.js"); global.copyDirSync = require("./base/util/copyDirSync.js"); var CURRENT = global.process.cwd(); var TARGET = require("./base/compiler/target.js"); global.PLATFORM = os.platform(); global.ARCH = os.arch(); global.COMPILER = {}; global.NERD_PATH = __dirname; var DEFAULT_COMPILER = "native"; global.CLI = parseCLI(process.argv); if(global.CLI.error) { console.log(global.CLI.msg); return 1; } require("./lib/env.js"); global.parseCode = require("./lib/parser.js"); global.verifyFlow = require("./lib/verify.js"); global.CONFIGPATH = global.os.homedir() + path.sep + ".nerd"; global.CONFIGFILE = global.CONFIGPATH + "/" + "nerd.json"; global.CONFIG = {}; var ACTION = "build"; if(global.CLI.cli["--help"] || global.CLI.cli["-h"]) ACTION = "help"; else if(global.CLI.cli["--example"] || global.CLI.cli["--examples"]) ACTION = "example"; else if(global.CLI.cli["--version"] || global.CLI.cli["-v"]) ACTION = "version"; else if(global.CLI.cli["--project"]) ACTION = "showproject"; else if(global.CLI.cli["--clean"] || global.CLI.cli["--purge"]) ACTION = "clean"; else if(global.CLI.cli["--setauthor"] || global.CLI.cli["--setid"] || global.CLI.cli["--setkey"] || global.CLI.cli["--sethash"] || global.CLI.cli["--setsdk"] || global.CLI.cli["--setndk"] || global.CLI.cli["--setwin_inc_ucrt"] || global.CLI.cli["--setwin_lib_ucrt"] || global.CLI.cli["--setwin_lib_um"] || global.CLI.cli["--setapi"] || global.CLI.cli["--setport"] || global.CLI.cli["--setxcode"]) ACTION = "setconfig"; else if(global.CLI.cli["--config"]) ACTION = "showconfig"; else if(global.CLI.cli["--reinit"]) ACTION = "reinitconfig"; var getExampleFiles = function(dir, list) { if(!list) { list = []; } var files = fs.readdirSync(dir); for (var i in files) { var name = dir + path.sep + files[i]; if (fs.statSync(name).isDirectory()) { getExampleFiles(name, list); } else { list.push(name); } } return list; } var copyExample = function() { var folder = ["c"]; var list = getExampleFiles(path.join(__dirname, "example")); for(var l in list) { var name = list[l].split(path.sep); if(name[name.length - 2] && folder.indexOf(name[name.length - 2]) > -1) { try { fs.mkdirSync(name[name.length - 2]); }catch(e){} name = name[name.length - 2] + "/" + name[name.length - 1]; } else name = name[name.length - 1]; var content = fs.readFileSync(list[l]); fs.writeFileSync(name, content); console.log("[+] Copy of " + name + " done"); } } var Init = function() { if(!fs.existsSync(CONFIGPATH)) fs.mkdirSync(CONFIGPATH); try { var writeConfig = false; var config = ""; config = fs.readFileSync(CONFIGFILE); config = JSON.parse(config); if(!config.version) { config.version = VERSION; config.port = 443; fs.writeFileSync(CONFIGFILE, JSON.stringify(config)); } } catch (e) { writeConfig = true; } if(!config || writeConfig) { var defaultConfig = { author: os.userInfo().username, id: "", key:"", hash:"SHA256", api:"api.nerdlang.com", port:443, version: VERSION, sdk: "", ndk: "", win_inc_ucrt: "", win_lib_ucrt: "", win_lib_um: "", xcode: "/Applications/Xcode.app"}; fs.writeFileSync(CONFIGFILE, JSON.stringify(defaultConfig)); } } var readConfig = function() { try { var tmp = fs.readFileSync(CONFIGFILE); CONFIG = JSON.parse(tmp); } catch (e) { Init(); readConfig(); } } var showConfig = function(str) { console.log(); if(str) console.log(str); else console.log("[*] Current config :"); console.log("author : " + CONFIG.author); console.log("id : " + CONFIG.id); console.log("key : " + CONFIG.key); console.log("hash : " + CONFIG.hash); console.log("api : " + CONFIG.api); console.log("port : " + CONFIG.port); console.log("version : " + VERSION); console.log("Android SDK : " + CONFIG.sdk); console.log("Android NDK : " + CONFIG.ndk); console.log("Windows Include UCRT : " + CONFIG.win_inc_ucrt); console.log("Android Lib UCRT : " + CONFIG.win_lib_ucrt); console.log("Android Lib UM : " + CONFIG.win_lib_um); console.log("iOS xCode : " + CONFIG.xcode); console.log(); } var setConfig = function() { try { if(global.CLI.cli["--setauthor"]) CONFIG.author = global.CLI.cli["--setauthor"].argument; if(global.CLI.cli["--setid"]) CONFIG.id = global.CLI.cli["--setid"].argument; if(global.CLI.cli["--setkey"]) CONFIG.key = global.CLI.cli["--setkey"].argument; if(global.CLI.cli["--setapi"]) CONFIG.api = global.CLI.cli["--setapi"].argument; if(global.CLI.cli["--setport"]) CONFIG.port = parseInt(global.CLI.cli["--setport"].argument); //if(global.CLI.cli["--setsdk"]) CONFIG.sdk = global.CLI.cli["--setsdk"].argument.replace(/\\/g, "\\\\").replace(/:/g, "\\\:"); // for android //if(global.CLI.cli["--setndk"]) CONFIG.ndk = global.CLI.cli["--setndk"].argument.replace(/\\/g, "\\\\").replace(/:/g, "\\\:"); // for android if(global.CLI.cli["--setwin_ucrt"]) CONFIG.win_ucrt = global.CLI.cli["--setwin_ucrt"].argument; if(global.CLI.cli["--setwin_inc_ucrt"]) CONFIG.win_inc_ucrt = global.CLI.cli["--setwin_inc_ucrt"].argument; if(global.CLI.cli["--setwin_lib_ucrt"]) CONFIG.win_lib_ucrt = global.CLI.cli["--setwin_lib_ucrt"].argument; if(global.CLI.cli["--setwin_lib_um"]) CONFIG.win_lib_um = global.CLI.cli["--setwin_lib_um"].argument; if(global.CLI.cli["--setxcode"]) CONFIG.xcode = global.CLI.cli["--setxcode"].argument; /* if(isNaN(CONFIG.port)) { console.dir("[!] This port is not valid : '" + global.CLI.cli["--setport"].argument +"', please specify a number."); return; } */ if(global.CLI.cli["--sethash"]) { var hash = global.CLI.cli["--sethash"].argument.toUpperCase(); if(validHash.indexOf(hash) < 0) { console.dir("[!] Hash is not valid and won't be saved. Valid hash are : MD5, SHA256 ans SHA512"); } else { CONFIG.hash = hash; } } fs.writeFileSync(CONFIGFILE, JSON.stringify(CONFIG)); } catch (e) { console.log(e); } } var reinitConfig = function() { try { var defaultConfig = { author: os.userInfo().username, id: "", key:"", hash:"SHA256", api:"api.nerdlang.com", "port":443, sdk: "", ndk: "", win_inc_ucrt: "", win_lib_ucrt: "", win_lib_um: "", xcode: "/Applications/Xcode.app"}; fs.writeFileSync(CONFIGFILE, JSON.stringify(defaultConfig)); readConfig(); showConfig("[*] Config reinitialized :"); } catch (e) { console.log(e); } } var showProject = function() { var project = "project.json"; if(global.CLI.stack && global.CLI.stack.length > 0) { project = global.CLI.stack[global.CLI.stack.length - 1]; } try { var pConf = fs.readFileSync(project); var jConf = JSON.parse(pConf); printProject(jConf); } catch (e) { console.dir("[!] Error : " + e.message); } } var Clean = function(purge) { var project = "project.json"; if(global.CLI.stack && global.CLI.stack.length > 0) { project = global.CLI.stack[global.CLI.stack.length - 1]; } try { var pConf = fs.readFileSync(project); var jConf = JSON.parse(pConf); if(jConf.main) { if( (global.CLI.cli["--purge"] || purge) && jConf.out) { var outFile = jConf.out; if(jConf.out[0] != path.sep) { outFile = path.join(path.dirname(project), jConf.out); } try{fs.unlinkSync(outFile);}catch(e){} } } try { fs.unlinkSync(project); }catch(e){} } catch (e) { console.dir("[!] Error : " + e.message); } } var printProject = function(obj) { console.log(); console.log("[*] Project configuration :\n"); console.log("Main file : " + obj.main); console.log("Output : " + obj.out); console.log("Target : " + obj.target); console.log("Preset : " + obj.preset); console.log(); } var Build = function(prepare) { global.DEBUG = false; if(global.CLI.cli["--debug"]) { global.DEBUG = true; } if(global.CLI.cli["--build"]) DEFAULT_COMPILER = global.CLI.cli["--build"].argument; else if(global.CLI.cli["-b"]) DEFAULT_COMPILER = global.CLI.cli["-b"].argument; COMPILER = require(path.join(__dirname, "compiler", DEFAULT_COMPILER, "compiler.js")); if(global.CLI.cli["--compiler"] && global.CLI.cli["--compiler"].argument) COMPILER.COMPILER = global.CLI.cli["--compiler"].argument; else if(global.CLI.cli["-c"] && global.CLI.cli["-c"].argument) COMPILER.COMPILER = global.CLI.cli["-c"].argument; var preset; if(global.CLI.cli["--preset"] && global.CLI.cli["--preset"].argument) preset = global.CLI.cli["--preset"].argument; var env; if(global.CLI.cli["--env"] && global.CLI.cli["--env"].argument) env = global.CLI.cli["--env"].argument; if(!preset) preset = "speed"; COMPILER.preset = preset; if(!env) env = "std"; var target; if(global.CLI.cli["--target"] && global.CLI.cli["--target"].argument) target = global.CLI.cli["--target"].argument; COMPILER.TARGET = target; var spec; if(global.CLI.cli["--spec"] && global.CLI.cli["--spec"].argument) spec = global.CLI.cli["--spec"].argument; COMPILER.SPEC = spec; var _tmp; if(global.CLI.cli["--tmp"] && global.CLI.cli["--tmp"].argument) _tmp = path.resolve(global.CLI.cli["--tmp"].argument); else { var _current = process.cwd(); var _npath = path.join(_current, ".nerd"); _tmp = path.join(_npath, Math.random().toString(36).substr(2, 5)); } COMPILER.TMP_FOLDER = _tmp; if(!global.CLI.stack || global.CLI.stack.length < 1) { console.error("[!] Missing file to compile or project.json path, 'nerd --help' if you need help"); return; } else { var QUIET = false; var _in = global.CLI.stack[0]; var main; COMPILER.IN = _in; fs.readFile(_in, function(err, fileData) { if(err) { console.error("[!] Error : " + err.message); return; } else { Check(_in); var ext = "ng"; var _Ext = _in.split("."); if(_Ext.length > 1) ext = _Ext[_Ext.length - 1]; /*** CREATE COMPIL ENV ***/ var _current = process.cwd(); var _npath = path.join(_current, ".nerd"); try { fs.mkdirSync(_npath); } catch(e){}; if(COMPILER.ENV.init) COMPILER.ENV.init(COMPILER.TMP_FOLDER); else try { fs.mkdirSync(COMPILER.TMP_FOLDER); } catch(e){}; /*** PREPARE SRC ***/ var _libOut = COMPILER.TMP_FOLDER; if(COMPILER.ENV.prepare) { var _tmpLibOut = COMPILER.ENV.prepare(COMPILER.TMP_FOLDER); if(_tmpLibOut) _libOut = _tmpLibOut; } COMPILER.Prepare(_libOut); var fProject = false; var prjectConf = {}; if(path.basename(_in) == "project.json") { try { projectConf = JSON.parse(fileData); fProject = true; single = false; } catch (e) { console.error("[!] Error with project.json : " + e.message); return; } } /*** GET FILES NAME ***/ var _binoutput = ""; if(fProject) { _binoutput = projectConf.out; } else _binoutput = path.basename(_in).slice(0, path.basename(_in).length - path.extname(_in).length); if(global.CLI.cli["-o"]) { _binoutput = global.CLI.cli["-o"].argument; } else if(global.CLI.cli["--out"]) { _binoutput = global.CLI.cli["--out"].argument; } _binoutput = path.join(process.cwd(), _binoutput); var _cout = path.join(COMPILER.TMP_FOLDER, path.basename(_in).slice(0, path.basename(_in).length - path.extname(_in).length) + ".cpp"); _binoutput = COMPILER.Out(_binoutput); var projTo = ""; var tmp = _in.split("/"); projTo = _binoutput; main = _in.split(path.sep); main = main[main.length - 1]; var tips = ""; if(!QUIET) console.log("[*] Generating source file"); var _code = fs.readFileSync(path.resolve(_in)).toString(); global.array_of_code = _code.split(os.EOL); _code = COMPILER.Parse(_code, _in); if(COMPILER.ENV.write) { COMPILER.ENV.write(COMPILER.MAIN, _cout); } else { if((!global.CLI.cli["--profile"]) || global.CLI.cli["--profile"].argument != "use") { fs.writeFileSync(_cout, COMPILER.MAIN); } } if(global.CLI.cli["--generate"]) { if(!QUIET) console.log("[*] Source generated in " + path.dirname(_cout)); process.exit(0); } if(!QUIET) console.log("[*] Compiling with preset: " + COMPILER.preset); try { COMPILER.Compile(COMPILER.TMP_FOLDER, _cout); } catch(e) { console.log(e); console.log("[!] Compilation error"); process.exit(1); } if(COMPILER.ENV.post) COMPILER.ENV.post(); try { fs.chmodSync(_binoutput, "755"); } catch(e){} if(COMPILER.Package) COMPILER.Package(); process.chdir(NERD_PATH); if(!global.CLI.cli["--conserve"]) { var _current = process.cwd(); process.chdir(_current); fs.rmSync(COMPILER.TMP_FOLDER, {recursive: true}); } var verb = false; if(global.CLI.cli["--verbose"]) verb = true; var bin; try { bin = fs.statSync(_binoutput); } catch(e){} if(COMPILER.ENV.clean && typeof(COMPILER.ENV.clean) == "function") { COMPILER.ENV.clean(); } if(verb && bin) { console.log("[+] Compilation done\n"); console.log("[*] Informations :\n"); var size = "Size : "; if(bin.size < 1000) size += bin.size + " o"; else if(bin.size < 1000000) size += (bin.size / 1000) + " ko"; else size += (bin.size / 1000000) + " mo"; console.log(size); console.log("Main file : " + main); console.log("Output : " + projTo); console.log("Preset : " + preset); } if(global.CLI.cli["--tips"] && tips && tips.length > 0) console.log("\n" + tips + "\n"); if(global.CLI.cli["--flash"]) Flash(projTo, global.CLI.cli["--flash"].argument, target, verb); if(global.CLI.cli["--run"]) { console.log(); console.log("[*] Executing " + _binoutput); if(!COMPILER.ENV.run) { var _binexec = child_process.spawnSync(_binoutput, [], { detached: false, stdio: [process.stdin, process.stdout, process.stderr], cwd: process.cwd(), env: process.env }); if(_binexec.error) { console.log(_binexec.error); } } else COMPILER.ENV.run(); } if(!global.CLI.cli["--prepare"]) { var _current = path.dirname(path.resolve(process.argv[1])); var _native = path.join(_current, "core", "nativejs"); var _to = path.resolve(projTo); var _fullPathCompile = path.resolve(main); } else { var pObj = { main: main, out:projTo, target:target, preset:preset }; printProject(pObj); } } }); } } var showVersion = function() { console.log("Nerd v" + VERSION); } var Check = function(file) { if(file.split(".").pop() != "js") return; if(global.CLI.cli["--check"]) process.exit(); } var Help = function() { showVersion(); console.log("\n[*] Compile :\nnerd [--env std|node|arduino|wasm|android] [--target the-target] [--run] [--reg 1000] [--preset speed|size] [-o output] [--tips] [--flash device] source.js|project.json\n"); console.log("[*] Show project :\nnerd [--project] [project.json]\n"); console.log("[*] Clean project :\nnerd [--clean] [--purge] [path_to_project.json]\n"); console.log("[*] Copy example files :\nnerd --example\n"); console.log("[*] Nerd version :\nnerd --version\n"); } switch(ACTION) { case "version": showVersion(); break; case "help": Help(); break; case "example": copyExample(); break; case "showproject": showProject(); break; case "setconfig": setConfig(); break; case "showconfig": showConfig(); break; case "reinitconfig": reinitConfig(); break; case "build": Build(); break; case "clean": Clean(); break; default: Help(); break; } ================================================ FILE: nerd_modules/JSON/index.ng ================================================ /* * This file is part of NectarJS * Copyright (c) 2017 - 2020 Adrien THIERRY * http://nectarjs.com - https://seraum.com/ * * sources : https://github.com/nectarjs/nectarjs * * NectarJS is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * NectarJS is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with NectarJS. If not, see . * */ include("./lib/json.h"); var _JSON = {}; _JSON.stringify = function(_obj) { {{ return __NERD_Object_Stringify(_obj); }} }; _JSON.parse = function(__json) { {{ if(!__json) return null; size_t tokcount = 32; int r; int j = 0; var __RESULT; const char* JSON_STRING = ((NerdCore::Class::String*)__json.data.ptr)->value.c_str(); jsmn_parser p; jsmntok_t *tok = (jsmntok_t*)malloc(sizeof(*tok) * tokcount); jsmn_init(&p); bool _again = true; while(_again) { r = jsmn_parse(&p, JSON_STRING, strlen(JSON_STRING), tok, tokcount); if (r < 0) { if (r == (int)JSMN_ERROR_NOMEM) { tokcount = tokcount * 2; tok = (jsmntok_t *)realloc_it(tok, sizeof(*tok) * tokcount); } else { printf("Failed to parse JSON: %d\n", r); return __RESULT; } } else { dump(JSON_STRING, tok, p.toknext, 0, __RESULT); _again = false; } } free(tok); return __RESULT; }} }; return _JSON; ================================================ FILE: nerd_modules/JSON/lib/jsmn.h ================================================ /* * MIT License * * Copyright (c) 2010 Serge Zaitsev * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifndef JSMN_H #define JSMN_H #include #ifdef __cplusplus extern "C" { #endif #ifdef JSMN_STATIC #define JSMN_API static #else #define JSMN_API extern #endif /** * JSON type identifier. Basic types are: * o Object * o Array * o String * o Other primitive: number, boolean (true/false) or null */ typedef enum { JSMN_UNDEFINED = 0, JSMN_OBJECT = 1 << 0, JSMN_ARRAY = 1 << 1, JSMN_STRING = 1 << 2, JSMN_PRIMITIVE = 1 << 3 } jsmntype_t; enum jsmnerr { /* Not enough tokens were provided */ JSMN_ERROR_NOMEM = -1, /* Invalid character inside JSON string */ JSMN_ERROR_INVAL = -2, /* The string is not a full JSON packet, more bytes expected */ JSMN_ERROR_PART = -3 }; /** * JSON token description. * type type (object, array, string etc.) * start start position in JSON data string * end end position in JSON data string */ typedef struct jsmntok { jsmntype_t type; int start; int end; int size; #ifdef JSMN_PARENT_LINKS int parent; #endif } jsmntok_t; /** * JSON parser. Contains an array of token blocks available. Also stores * the string being parsed now and current position in that string. */ typedef struct jsmn_parser { unsigned int pos; /* offset in the JSON string */ unsigned int toknext; /* next token to allocate */ int toksuper; /* superior token node, e.g. parent object or array */ } jsmn_parser; /** * Create JSON parser over an array of tokens */ JSMN_API void jsmn_init(jsmn_parser *parser); /** * Run JSON parser. It parses a JSON data string into and array of tokens, each * describing * a single JSON object. */ JSMN_API int jsmn_parse(jsmn_parser *parser, const char *js, const size_t len, jsmntok_t *tokens, const unsigned int num_tokens); #ifndef JSMN_HEADER /** * Allocates a fresh unused token from the token pool. */ static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser, jsmntok_t *tokens, const size_t num_tokens) { jsmntok_t *tok; if (parser->toknext >= num_tokens) { return NULL; } tok = &tokens[parser->toknext++]; tok->start = tok->end = -1; tok->size = 0; #ifdef JSMN_PARENT_LINKS tok->parent = -1; #endif return tok; } /** * Fills token type and boundaries. */ static void jsmn_fill_token(jsmntok_t *token, const jsmntype_t type, const int start, const int end) { token->type = type; token->start = start; token->end = end; token->size = 0; } /** * Fills next available token with JSON primitive. */ static int jsmn_parse_primitive(jsmn_parser *parser, const char *js, const size_t len, jsmntok_t *tokens, const size_t num_tokens) { jsmntok_t *token; int start; start = parser->pos; for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { switch (js[parser->pos]) { #ifndef JSMN_STRICT /* In strict mode primitive must be followed by "," or "}" or "]" */ case ':': #endif case '\t': case '\r': case '\n': case ' ': case ',': case ']': case '}': goto found; default: /* to quiet a warning from gcc*/ break; } if (js[parser->pos] < 32 || js[parser->pos] >= 127) { parser->pos = start; return JSMN_ERROR_INVAL; } } #ifdef JSMN_STRICT /* In strict mode primitive must be followed by a comma/object/array */ parser->pos = start; return JSMN_ERROR_PART; #endif found: if (tokens == NULL) { parser->pos--; return 0; } token = jsmn_alloc_token(parser, tokens, num_tokens); if (token == NULL) { parser->pos = start; return JSMN_ERROR_NOMEM; } jsmn_fill_token(token, JSMN_PRIMITIVE, start, parser->pos); #ifdef JSMN_PARENT_LINKS token->parent = parser->toksuper; #endif parser->pos--; return 0; } /** * Fills next token with JSON string. */ static int jsmn_parse_string(jsmn_parser *parser, const char *js, const size_t len, jsmntok_t *tokens, const size_t num_tokens) { jsmntok_t *token; int start = parser->pos; /* Skip starting quote */ parser->pos++; for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { char c = js[parser->pos]; /* Quote: end of string */ if (c == '\"') { if (tokens == NULL) { return 0; } token = jsmn_alloc_token(parser, tokens, num_tokens); if (token == NULL) { parser->pos = start; return JSMN_ERROR_NOMEM; } jsmn_fill_token(token, JSMN_STRING, start + 1, parser->pos); #ifdef JSMN_PARENT_LINKS token->parent = parser->toksuper; #endif return 0; } /* Backslash: Quoted symbol expected */ if (c == '\\' && parser->pos + 1 < len) { int i; parser->pos++; switch (js[parser->pos]) { /* Allowed escaped symbols */ case '\"': case '/': case '\\': case 'b': case 'f': case 'r': case 'n': case 't': break; /* Allows escaped symbol \uXXXX */ case 'u': parser->pos++; for (i = 0; i < 4 && parser->pos < len && js[parser->pos] != '\0'; i++) { /* If it isn't a hex character we have an error */ if (!((js[parser->pos] >= 48 && js[parser->pos] <= 57) || /* 0-9 */ (js[parser->pos] >= 65 && js[parser->pos] <= 70) || /* A-F */ (js[parser->pos] >= 97 && js[parser->pos] <= 102))) { /* a-f */ parser->pos = start; return JSMN_ERROR_INVAL; } parser->pos++; } parser->pos--; break; /* Unexpected symbol */ default: parser->pos = start; return JSMN_ERROR_INVAL; } } } parser->pos = start; return JSMN_ERROR_PART; } /** * Parse JSON string and fill tokens. */ JSMN_API int jsmn_parse(jsmn_parser *parser, const char *js, const size_t len, jsmntok_t *tokens, const unsigned int num_tokens) { int r; int i; jsmntok_t *token; int count = parser->toknext; for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { char c; jsmntype_t type; c = js[parser->pos]; switch (c) { case '{': case '[': count++; if (tokens == NULL) { break; } token = jsmn_alloc_token(parser, tokens, num_tokens); if (token == NULL) { return JSMN_ERROR_NOMEM; } if (parser->toksuper != -1) { jsmntok_t *t = &tokens[parser->toksuper]; #ifdef JSMN_STRICT /* In strict mode an object or array can't become a key */ if (t->type == JSMN_OBJECT) { return JSMN_ERROR_INVAL; } #endif t->size++; #ifdef JSMN_PARENT_LINKS token->parent = parser->toksuper; #endif } token->type = (c == '{' ? JSMN_OBJECT : JSMN_ARRAY); token->start = parser->pos; parser->toksuper = parser->toknext - 1; break; case '}': case ']': if (tokens == NULL) { break; } type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY); #ifdef JSMN_PARENT_LINKS if (parser->toknext < 1) { return JSMN_ERROR_INVAL; } token = &tokens[parser->toknext - 1]; for (;;) { if (token->start != -1 && token->end == -1) { if (token->type != type) { return JSMN_ERROR_INVAL; } token->end = parser->pos + 1; parser->toksuper = token->parent; break; } if (token->parent == -1) { if (token->type != type || parser->toksuper == -1) { return JSMN_ERROR_INVAL; } break; } token = &tokens[token->parent]; } #else for (i = parser->toknext - 1; i >= 0; i--) { token = &tokens[i]; if (token->start != -1 && token->end == -1) { if (token->type != type) { return JSMN_ERROR_INVAL; } parser->toksuper = -1; token->end = parser->pos + 1; break; } } /* Error if unmatched closing bracket */ if (i == -1) { return JSMN_ERROR_INVAL; } for (; i >= 0; i--) { token = &tokens[i]; if (token->start != -1 && token->end == -1) { parser->toksuper = i; break; } } #endif break; case '\"': r = jsmn_parse_string(parser, js, len, tokens, num_tokens); if (r < 0) { return r; } count++; if (parser->toksuper != -1 && tokens != NULL) { tokens[parser->toksuper].size++; } break; case '\t': case '\r': case '\n': case ' ': break; case ':': parser->toksuper = parser->toknext - 1; break; case ',': if (tokens != NULL && parser->toksuper != -1 && tokens[parser->toksuper].type != JSMN_ARRAY && tokens[parser->toksuper].type != JSMN_OBJECT) { #ifdef JSMN_PARENT_LINKS parser->toksuper = tokens[parser->toksuper].parent; #else for (i = parser->toknext - 1; i >= 0; i--) { if (tokens[i].type == JSMN_ARRAY || tokens[i].type == JSMN_OBJECT) { if (tokens[i].start != -1 && tokens[i].end == -1) { parser->toksuper = i; break; } } } #endif } break; #ifdef JSMN_STRICT /* In strict mode primitives are: numbers and booleans */ case '-': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 't': case 'f': case 'n': /* And they must not be keys of the object */ if (tokens != NULL && parser->toksuper != -1) { const jsmntok_t *t = &tokens[parser->toksuper]; if (t->type == JSMN_OBJECT || (t->type == JSMN_STRING && t->size != 0)) { return JSMN_ERROR_INVAL; } } #else /* In non-strict mode every unquoted value is a primitive */ default: #endif r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens); if (r < 0) { return r; } count++; if (parser->toksuper != -1 && tokens != NULL) { tokens[parser->toksuper].size++; } break; #ifdef JSMN_STRICT /* Unexpected char in strict mode */ default: return JSMN_ERROR_INVAL; #endif } } if (tokens != NULL) { for (i = parser->toknext - 1; i >= 0; i--) { /* Unmatched opened object or array */ if (tokens[i].start != -1 && tokens[i].end == -1) { return JSMN_ERROR_PART; } } } return count; } /** * Creates a new parser based over a given buffer with an array of tokens * available. */ JSMN_API void jsmn_init(jsmn_parser *parser) { parser->pos = 0; parser->toknext = 0; parser->toksuper = -1; } #endif /* JSMN_HEADER */ #ifdef __cplusplus } #endif #endif /* JSMN_H */ ================================================ FILE: nerd_modules/JSON/lib/json.h ================================================ /* * This file is part of NectarJS * Copyright (c) 2017 - 2020 Adrien THIERRY * http://nectarjs.com - https://seraum.com/ * * sources : https://github.com/nectarjs/nectarjs * * NectarJS is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * NectarJS is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with NectarJS. If not, see . * */ #define JSMN_STRICT #ifndef __Nectar_ARDUINO #define JSMN_PARENT_LINK #endif #include "jsmn.h" NerdCore::VAR to_int(char const *s) { bool _float = false; if(strchr(s, '.')) { return NerdCore::VAR(std::stod(s)); } else { return NerdCore::VAR(std::stoi(s)); } } static inline void *realloc_it(void *ptrmem, size_t size) { void *p = std::realloc(ptrmem, size); if (!p) { std::free(ptrmem); std::fprintf(stderr, "realloc(): errno=%d\n", errno); } return p; } char* substr(const char* arr, int begin, int len) { char* res = new char[len]; for (int i = 0; i < len - 1; i++) res[i] = *(arr + begin + i); res[len - 1] = 0; return res; } int dump(const char *js, jsmntok_t *t, size_t count, int indent, var& _res) { int i, j, k; jsmntok_t *key; if (count == 0) { return 0; } if (t->type == JSMN_PRIMITIVE) { std::string _s = substr(js, t->start, t->end - t->start); if(_s[0] == 't') _res = true; else if(_s[0] == 'f') _res = false; else if(_s[0] == 'n') _res = var(); else _res = to_int(_s.c_str()); return 1; } else if (t->type == JSMN_STRING) { _res = substr(js, t->start, t->end - t->start + 1); return 1; } else if (t->type == JSMN_OBJECT) { j = 0; _res = new NerdCore::Class::Object(); for (i = 0; i < t->size; i++) { key = t + 1 + j; var _key; j += dump(js, key, count - j, indent + 1, _key); var _value; if (key->size > 0) { j += dump(js, t + 1 + j, count - j, indent + 1, _value); } _res[_key] = _value; //__NERD_Object_Set(_key, _value, _res); } return j+1; } else if (t->type == JSMN_ARRAY) { j = 0; _res = new NerdCore::Class::Array(); std::vector _arr; for (i = 0; i < t->size; i++) { var _value; j += dump(js, t + 1 + j, count - j, indent + 1, _value); _res[i] = _value; //__NERD_Object_Set(i, _value, _res); } return j+1; } return 0; } ================================================ FILE: nerd_modules/JSON/package.json ================================================ { "name": "JSON", "description": "NectarJS base JSON module", "main": "index.js", "bugs": { "url": "https://github.com/NectarJS/nectarjs/issues" }, "directories": { "root": ".", "lib": "lib" }, "homepage": "https://github.com/NectarJS/nectarjs#readme", "keywords": [ "nectarjs", "JSON", "javascript" ], "license": "GPL-3.0-or-later", "licenses": [ { "type": "GPL", "url": "https://github.com/nectarjs/nectarjs/blob/master/LICENSE" } ], "repository": { "type": "git", "url": "git+ssh://git@github.com/NectarJS/nectarjs.git" }, "version": "0.0.2", "nerd": { "env": ["std", "js", "android", "ios", "node", "arduino", "wasm"] } } ================================================ FILE: nerd_modules/Module/index.ng ================================================ // NodeJS modules compatibility var module = function() { }; return module; ================================================ FILE: nerd_modules/RegExp/index.ng ================================================ /* Copyright (c) 2022 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ include(""); var regexp = function(_regExp, flag) { this.source = _regExp; this.flag = flag; }; regexp.prototype.test = function(_string) { {{ if( std::regex_match ( (std::string)_string, std::regex((std::string)__NERD_THIS["source"], std::regex::ECMAScript) ) ) { return true; } else { return false; } }} }; regexp.prototype.exec = function(_string) { {{ var _res = new NerdCore::Class::Array(); std::string s = (std::string)_string; std::smatch m; while(std::regex_search ( s, m, std::regex((std::string)__NERD_THIS["source"], std::regex::ECMAScript) )) { int i = 0; for(auto x:m) { _res[i] = (std::string)x; i++; } s = m.suffix().str(); } return _res; }} }; regexp.prototype.match = regexp.prototype.exec; return regexp; ================================================ FILE: nerd_modules/String/index.ng ================================================ var String = function(value) { if(!value) { value = ""; } return value; }; String.prototype.replace = function(_search, _replace) { {{ size_t start_pos = ((NerdCore::Class::String*)(__NERD_THIS.data.ptr))->value.find((std::string)_search); if (start_pos == std::string::npos) { return NerdCore::VAR(((NerdCore::Class::String*)(__NERD_THIS.data.ptr))->value); } std::string _new = ((NerdCore::Class::String*)(__NERD_THIS.data.ptr))->value; return NerdCore::VAR(_new.replace(start_pos, ((std::string)_search).length(), (std::string)_replace)); }} } String.prototype.toString = function() { return this; } return String; ================================================ FILE: nerd_modules/arduino/index.ng ================================================ var high; var low; var input; var output; var led_builtin; {{ high = HIGH; low = LOW; input = INPUT; output = OUTPUT; led_builtin = LED_BUILTIN; }} var nerdDelay = function(_value) { {{ delay((int)_value); }} }; var nerdPinMode = function(_pin, _mode) { {{ pinMode((int)_pin, (int)_mode); }} }; var nerdDigitalWrite = function( _pin, _mode) { {{ digitalWrite((int)_pin, (int)_mode); }} }; var nerdMillis = function( ) { {{ return var((double)millis()); }} }; var nerdSec = function( ) { {{ return var((int)(millis()/1000)); }} }; var arduino = { delay: nerdDelay, pinMode: nerdPinMode, digitalWrite: nerdDigitalWrite, high: high, low: low, input: input, output: output, led_builtin: led_builtin, millis: nerdMillis, seconds: nerdSec, }; return arduino; ================================================ FILE: nerd_modules/arduino-lcd/index.ng ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ include("lib/LiquidCrystal.h"); var _lcd = function(rs, en, d4, d5, d6, d7) { var object = {}; {{ LiquidCrystal* lcdNative = new LiquidCrystal((int)rs, (int)en, (int)d4, (int)d5, (int)d6, (int)d7); }} object.begin = function(col, row) { {{ lcdNative->begin((int)col, (int)row); }} }; object.print = function(text) { {{ lcdNative->print(((std::string)text).c_str()); }} }; object.setCursor = function(col, row) { {{ lcdNative->setCursor((int)col, (int)row); }} }; object.clear = function() { {{ lcdNative->clear(); }} }; return object; }; return _lcd; ================================================ FILE: nerd_modules/arduino-lcd/lib/LiquidCrystal.cpp ================================================ #include "LiquidCrystal.h" #include #include #include #include "Arduino.h" // When the display powers up, it is configured as follows: // // 1. Display clear // 2. Function set: // DL = 1; 8-bit interface data // N = 0; 1-line display // F = 0; 5x8 dot character font // 3. Display on/off control: // D = 0; Display off // C = 0; Cursor off // B = 0; Blinking off // 4. Entry mode set: // I/D = 1; Increment by 1 // S = 0; No shift // // Note, however, that resetting the Arduino doesn't reset the LCD, so we // can't assume that it's in that state when a sketch starts (and the // LiquidCrystal constructor is called). LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7) { init(0, rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7); } LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7) { init(0, rs, 255, enable, d0, d1, d2, d3, d4, d5, d6, d7); } LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3) { init(1, rs, rw, enable, d0, d1, d2, d3, 0, 0, 0, 0); } LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3) { init(1, rs, 255, enable, d0, d1, d2, d3, 0, 0, 0, 0); } void LiquidCrystal::init(uint8_t fourbitmode, uint8_t rs, uint8_t rw, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7) { _rs_pin = rs; _rw_pin = rw; _enable_pin = enable; _data_pins[0] = d0; _data_pins[1] = d1; _data_pins[2] = d2; _data_pins[3] = d3; _data_pins[4] = d4; _data_pins[5] = d5; _data_pins[6] = d6; _data_pins[7] = d7; if (fourbitmode) _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS; else _displayfunction = LCD_8BITMODE | LCD_1LINE | LCD_5x8DOTS; begin(16, 1); } void LiquidCrystal::begin(uint8_t cols, uint8_t lines, uint8_t dotsize) { if (lines > 1) { _displayfunction |= LCD_2LINE; } _numlines = lines; setRowOffsets(0x00, 0x40, 0x00 + cols, 0x40 + cols); // for some 1 line displays you can select a 10 pixel high font if ((dotsize != LCD_5x8DOTS) && (lines == 1)) { _displayfunction |= LCD_5x10DOTS; } pinMode(_rs_pin, OUTPUT); // we can save 1 pin by not using RW. Indicate by passing 255 instead of pin# if (_rw_pin != 255) { pinMode(_rw_pin, OUTPUT); } pinMode(_enable_pin, OUTPUT); // Do these once, instead of every time a character is drawn for speed reasons. for (int i=0; i<((_displayfunction & LCD_8BITMODE) ? 8 : 4); ++i) { pinMode(_data_pins[i], OUTPUT); } // SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION! // according to datasheet, we need at least 40 ms after power rises above 2.7 V // before sending commands. Arduino can turn on way before 4.5 V so we'll wait 50 delayMicroseconds(50000); // Now we pull both RS and R/W low to begin commands digitalWrite(_rs_pin, LOW); digitalWrite(_enable_pin, LOW); if (_rw_pin != 255) { digitalWrite(_rw_pin, LOW); } //put the LCD into 4 bit or 8 bit mode if (! (_displayfunction & LCD_8BITMODE)) { // this is according to the Hitachi HD44780 datasheet // figure 24, pg 46 // we start in 8bit mode, try to set 4 bit mode write4bits(0x03); delayMicroseconds(4500); // wait min 4.1ms // second try write4bits(0x03); delayMicroseconds(4500); // wait min 4.1ms // third go! write4bits(0x03); delayMicroseconds(150); // finally, set to 4-bit interface write4bits(0x02); } else { // this is according to the Hitachi HD44780 datasheet // page 45 figure 23 // Send function set command sequence command(LCD_FUNCTIONSET | _displayfunction); delayMicroseconds(4500); // wait more than 4.1 ms // second try command(LCD_FUNCTIONSET | _displayfunction); delayMicroseconds(150); // third go command(LCD_FUNCTIONSET | _displayfunction); } // finally, set # lines, font size, etc. command(LCD_FUNCTIONSET | _displayfunction); // turn the display on with no cursor or blinking default _displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF; display(); // clear it off clear(); // Initialize to default text direction (for romance languages) _displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT; // set the entry mode command(LCD_ENTRYMODESET | _displaymode); } void LiquidCrystal::setRowOffsets(int row0, int row1, int row2, int row3) { _row_offsets[0] = row0; _row_offsets[1] = row1; _row_offsets[2] = row2; _row_offsets[3] = row3; } /********** high level commands, for the user! */ void LiquidCrystal::clear() { command(LCD_CLEARDISPLAY); // clear display, set cursor position to zero delayMicroseconds(2000); // this command takes a long time! } void LiquidCrystal::home() { command(LCD_RETURNHOME); // set cursor position to zero delayMicroseconds(2000); // this command takes a long time! } void LiquidCrystal::setCursor(uint8_t col, uint8_t row) { const size_t max_lines = sizeof(_row_offsets) / sizeof(*_row_offsets); if ( row >= max_lines ) { row = max_lines - 1; // we count rows starting w/ 0 } if ( row >= _numlines ) { row = _numlines - 1; // we count rows starting w/ 0 } command(LCD_SETDDRAMADDR | (col + _row_offsets[row])); } // Turn the display on/off (quickly) void LiquidCrystal::noDisplay() { _displaycontrol &= ~LCD_DISPLAYON; command(LCD_DISPLAYCONTROL | _displaycontrol); } void LiquidCrystal::display() { _displaycontrol |= LCD_DISPLAYON; command(LCD_DISPLAYCONTROL | _displaycontrol); } // Turns the underline cursor on/off void LiquidCrystal::noCursor() { _displaycontrol &= ~LCD_CURSORON; command(LCD_DISPLAYCONTROL | _displaycontrol); } void LiquidCrystal::cursor() { _displaycontrol |= LCD_CURSORON; command(LCD_DISPLAYCONTROL | _displaycontrol); } // Turn on and off the blinking cursor void LiquidCrystal::noBlink() { _displaycontrol &= ~LCD_BLINKON; command(LCD_DISPLAYCONTROL | _displaycontrol); } void LiquidCrystal::blink() { _displaycontrol |= LCD_BLINKON; command(LCD_DISPLAYCONTROL | _displaycontrol); } // These commands scroll the display without changing the RAM void LiquidCrystal::scrollDisplayLeft(void) { command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVELEFT); } void LiquidCrystal::scrollDisplayRight(void) { command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVERIGHT); } // This is for text that flows Left to Right void LiquidCrystal::leftToRight(void) { _displaymode |= LCD_ENTRYLEFT; command(LCD_ENTRYMODESET | _displaymode); } // This is for text that flows Right to Left void LiquidCrystal::rightToLeft(void) { _displaymode &= ~LCD_ENTRYLEFT; command(LCD_ENTRYMODESET | _displaymode); } // This will 'right justify' text from the cursor void LiquidCrystal::autoscroll(void) { _displaymode |= LCD_ENTRYSHIFTINCREMENT; command(LCD_ENTRYMODESET | _displaymode); } // This will 'left justify' text from the cursor void LiquidCrystal::noAutoscroll(void) { _displaymode &= ~LCD_ENTRYSHIFTINCREMENT; command(LCD_ENTRYMODESET | _displaymode); } // Allows us to fill the first 8 CGRAM locations // with custom characters void LiquidCrystal::createChar(uint8_t location, uint8_t charmap[]) { location &= 0x7; // we only have 8 locations 0-7 command(LCD_SETCGRAMADDR | (location << 3)); for (int i=0; i<8; i++) { write(charmap[i]); } } /*********** mid level commands, for sending data/cmds */ inline void LiquidCrystal::command(uint8_t value) { send(value, LOW); } inline size_t LiquidCrystal::write(uint8_t value) { send(value, HIGH); return 1; // assume success } /************ low level data pushing commands **********/ // write either command or data, with automatic 4/8-bit selection void LiquidCrystal::send(uint8_t value, uint8_t mode) { digitalWrite(_rs_pin, mode); // if there is a RW pin indicated, set it low to Write if (_rw_pin != 255) { digitalWrite(_rw_pin, LOW); } if (_displayfunction & LCD_8BITMODE) { write8bits(value); } else { write4bits(value>>4); write4bits(value); } } void LiquidCrystal::pulseEnable(void) { digitalWrite(_enable_pin, LOW); delayMicroseconds(1); digitalWrite(_enable_pin, HIGH); delayMicroseconds(1); // enable pulse must be >450 ns digitalWrite(_enable_pin, LOW); delayMicroseconds(100); // commands need >37 us to settle } void LiquidCrystal::write4bits(uint8_t value) { for (int i = 0; i < 4; i++) { digitalWrite(_data_pins[i], (value >> i) & 0x01); } pulseEnable(); } void LiquidCrystal::write8bits(uint8_t value) { for (int i = 0; i < 8; i++) { digitalWrite(_data_pins[i], (value >> i) & 0x01); } pulseEnable(); } ================================================ FILE: nerd_modules/arduino-lcd/lib/LiquidCrystal.h ================================================ #ifndef LiquidCrystal_h #define LiquidCrystal_h #include #include "Print.h" // commands #define LCD_CLEARDISPLAY 0x01 #define LCD_RETURNHOME 0x02 #define LCD_ENTRYMODESET 0x04 #define LCD_DISPLAYCONTROL 0x08 #define LCD_CURSORSHIFT 0x10 #define LCD_FUNCTIONSET 0x20 #define LCD_SETCGRAMADDR 0x40 #define LCD_SETDDRAMADDR 0x80 // flags for display entry mode #define LCD_ENTRYRIGHT 0x00 #define LCD_ENTRYLEFT 0x02 #define LCD_ENTRYSHIFTINCREMENT 0x01 #define LCD_ENTRYSHIFTDECREMENT 0x00 // flags for display on/off control #define LCD_DISPLAYON 0x04 #define LCD_DISPLAYOFF 0x00 #define LCD_CURSORON 0x02 #define LCD_CURSOROFF 0x00 #define LCD_BLINKON 0x01 #define LCD_BLINKOFF 0x00 // flags for display/cursor shift #define LCD_DISPLAYMOVE 0x08 #define LCD_CURSORMOVE 0x00 #define LCD_MOVERIGHT 0x04 #define LCD_MOVELEFT 0x00 // flags for function set #define LCD_8BITMODE 0x10 #define LCD_4BITMODE 0x00 #define LCD_2LINE 0x08 #define LCD_1LINE 0x00 #define LCD_5x10DOTS 0x04 #define LCD_5x8DOTS 0x00 class LiquidCrystal : public Print { public: LiquidCrystal(uint8_t rs, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7); LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7); LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3); LiquidCrystal(uint8_t rs, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3); void init(uint8_t fourbitmode, uint8_t rs, uint8_t rw, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7); void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS); void clear(); void home(); void noDisplay(); void display(); void noBlink(); void blink(); void noCursor(); void cursor(); void scrollDisplayLeft(); void scrollDisplayRight(); void leftToRight(); void rightToLeft(); void autoscroll(); void noAutoscroll(); void setRowOffsets(int row1, int row2, int row3, int row4); void createChar(uint8_t, uint8_t[]); void setCursor(uint8_t, uint8_t); virtual size_t write(uint8_t); void command(uint8_t); using Print::write; private: void send(uint8_t, uint8_t); void write4bits(uint8_t); void write8bits(uint8_t); void pulseEnable(); uint8_t _rs_pin; // LOW: command. HIGH: character. uint8_t _rw_pin; // LOW: write to LCD. HIGH: read from LCD. uint8_t _enable_pin; // activated by a HIGH pulse. uint8_t _data_pins[8]; uint8_t _displayfunction; uint8_t _displaycontrol; uint8_t _displaymode; uint8_t _initialized; uint8_t _numlines; uint8_t _row_offsets[4]; }; #endif ================================================ FILE: nerd_modules/arduino-lcd/package.json ================================================ { "name": "arduino-lcd", "description": "NerdLang Arduino LCD module", "main": "index.ng", "bugs": { "url": "https://github.com/NerdLang/Nerd/issues" }, "directories": { "root": ".", "lib": "lib" }, "homepage": "https://github.com/NerdLang/Nerd#readme", "keywords": [ "nerd", "nerdlang", "arduino", "lcd" ], "license": "MIT", "licenses": [ { "type": "MIT", "url": "https://github.com/NerdLang/Nerd/blob/master/LICENSE" } ], "repository": { "type": "git", "url": "git+ssh://git@github.com/NerdLang/Nerd.git" }, "version": "0.0.1", "nerd": { "env": ["arduino"], "read_only": [], "lib": ["{__MODULE__}/lib/LiquidCrystal.cpp","{__EXTERN__}/arduino/avr/cores/arduino/Print.cpp"] } } ================================================ FILE: nerd_modules/child_process/index.ng ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var child_process = {}; child_process.exec = function(_cmd) { {{ FILE *fp; const int pSize = 64; int bSize = pSize; int now = 0; char* buffer = (char*)malloc(pSize * sizeof(char)); buffer[0] = 0; char pChar[pSize]; fp = popen(((std::string)_cmd).c_str(), "r"); if (fp == NULL) { printf("Failed to run command\n" ); return var(); } while (fgets(pChar, sizeof(pChar), fp) != NULL) { now += strlen(pChar); if(now > bSize) { bSize += (now) * 1.5; buffer = (char*)realloc(buffer, bSize); } strcat(buffer, pChar); } pclose(fp); var _return = buffer; free(buffer); return _return; }} }; child_process.execSync = child_process.exec; return child_process; ================================================ FILE: nerd_modules/child_process/package.json ================================================ { "name": "child_process", "description": "Nerd base child process module", "main": "index.nf", "bugs": { "url": "https://github.com/Nerdlang/Nerd/issues" }, "directories": { "root": "." }, "homepage": "https://github.com/Nerdlang/Nerd#readme", "keywords": [ "nerdlang", "nerd", "child_process", "exec", "spawn" ], "license": "MIT", "licenses": [ { "type": "MIT", "url": "https://github.com/nerdlang/nerd/blob/master/LICENSE" } ], "repository": { "type": "git", "url": "git+ssh://git@github.com/Nerdlang/Nerd.git" }, "version": "0.0.1", "nectar": { "env": ["std", "wasm"] } } ================================================ FILE: nerd_modules/console/index.ng ================================================ /* Copyright (c) 2022 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var console = {}; console.log = function() { var _args = arguments(); for(var i = 0; i < length_of(_args); i++) { if(i > 0) { {{ std::cout << " "; }} } {{ std::cout << _args[i]; }} } {{ std::cout << std::endl; }} }; console.error = function() { var _args = arguments(); for(var i = 0; i < length_of(_args); i++) { if(i > 0) { {{ std::cerr << " "; }} } {{ std::cerr << _args[i]; }} } {{ std::cerr << std::endl; }} }; console.write = function() { var _args = arguments(); for(var i = 0; i < length_of(_args); i++) { if(i > 0) { {{ std::cout << " "; }} } {{ std::cout << _args[i]; }} } }; return console; ================================================ FILE: nerd_modules/date/index.ng ================================================ include(""); var date = {}; date.now = function() { {{ return NerdCore::VAR(std::chrono::duration_cast( std::chrono::system_clock::now().time_since_epoch() ).count()); }} }; return date; ================================================ FILE: nerd_modules/error/index.ng ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var error = {}; error.throw = function(_obj) { {{ throw(_obj); }} }; return error; ================================================ FILE: nerd_modules/fs/index.ng ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ include(""); include(""); include(""); include(""); var fs = {}; fs.readFile = function(_name) { {{ std::ifstream _ifs((std::string)_name); std::string str((std::istreambuf_iterator(_ifs)), std::istreambuf_iterator()); return str; }} }; fs.readFileSync = fs.readFile; fs.writeFile = function(_name, _content) { {{ std::ofstream _file((std::string)_name); if(_file.is_open()) { _file << _content; _file.close(); return true; } else { return false; } }} }; fs.writeFileSync = fs.writeFile; fs.appendFile = function(_name, _content) { {{ std::ofstream _file; _file.open((std::string)_name, std::ofstream::out | std::ofstream::app); if(_file.is_open()) { _file << _content; _file.close(); return true; } else { return false; } }} }; fs.appendFileSync = fs.appendFile; fs.unlink = function(_name) { {{ unlink(_name); }} return true; }; fs.unlinkSync = fs.unlink; fs.rmdir = function(_name) { {{ rmdir(_name); }} return true; }; fs.rmdirSync = fs.rmdir; fs.remove = function(_name) { {{ remove(_name); }} return true; }; fs.removeSync = fs.remove; fs.rename = function(_old, _new) { {{ rename(_old, _new); }} return true; }; fs.renameSync = fs.rename; fs.mkdir = function(_path) { {{ #ifndef __linux__ mkdir(_path); #else // TODO #endif }} return true; }; fs.mkdirSync = fs.mkdir; fs.readdir = function(_path) { var _list = []; {{ int i = 0; DIR *dir; struct dirent *diread; std::string str; if ((dir = opendir(_path)) != nullptr) { while ((diread = readdir(dir)) != nullptr) { str = diread->d_name; _list[i] = str; i++; } closedir (dir); } else { throw(var("Cannont open dir: " + _path)); } }} return _list; }; fs.readdirSync = fs.readdir; return fs; ================================================ FILE: nerd_modules/fs/package.json ================================================ { "name": "fs", "description": "Nerd Standard FS module", "main": "index.ng", "bugs": { "url": "https://github.com/Nerdlang/Nerd/issues" }, "directories": { "root": "." }, "homepage": "https://github.com/Nerdlang/Nerd#readme", "keywords": [ "nerd", "nerdlang", "fs", "filesystem" ], "license": "MIT", "licenses": [ { "type": "MIT", "url": "https://github.com/nerdlang/nerd/blob/master/LICENSE" } ], "repository": { "type": "git", "url": "git+ssh://git@github.com/Nerd/nectarjs.git" }, "version": "0.0.1", "nerd": { "env": ["std", "wasm", "js"] } } ================================================ FILE: nerd_modules/http/httpStruct.h ================================================ var __LAZY_RES_STATUS = __NERD_Create_Var_Unscoped_Anon( { var arg; if(__NERD_VARLENGTH > 0) { arg = __NERD_VARARGS[0]; } ((uWS::HttpResponse*)__NERD_OBJECT(__NERD_THIS)->bind)->writeStatus((std::string)arg); return NerdCore::Global::null; }); var __LAZY_RES_HEADER = __NERD_Create_Var_Unscoped_Anon( { var arg1; var arg2; if(__NERD_VARLENGTH > 0) { arg1 = __NERD_VARARGS[0]; } if(__NERD_VARLENGTH > 1) { arg2 = __NERD_VARARGS[1]; } ((uWS::HttpResponse*)__NERD_OBJECT(__NERD_THIS)->bind)->writeHeader((std::string)arg1, (std::string)arg2); return NerdCore::Global::null; }); var __LAZY_RES_WRITE = __NERD_Create_Var_Unscoped_Anon( { var arg; if(__NERD_VARLENGTH > 0) { arg = __NERD_VARARGS[0]; } ((uWS::HttpResponse*)__NERD_OBJECT(__NERD_THIS)->bind)->write((std::string)arg); return NerdCore::Global::null; }); var __LAZY_RES_END = __NERD_Create_Var_Unscoped_Anon( { var arg; if(__NERD_VARLENGTH > 0) { arg = __NERD_VARARGS[0]; } ((uWS::HttpResponse*)__NERD_OBJECT(__NERD_THIS)->bind)->end((std::string)arg); return NerdCore::Global::null; }); var __LAZY_REQ_METHOD = __NERD_Create_Var_Unscoped_Anon( { return ((uWS::HttpRequest*)__NERD_OBJECT(__NERD_THIS)->bind)->getMethod(); }); var __LAZY_REQ_HEADER = __NERD_Create_Var_Unscoped_Anon( { var arg; if(__NERD_VARLENGTH > 0) { arg = __NERD_VARARGS[0]; } return ((uWS::HttpRequest*)__NERD_OBJECT(__NERD_THIS)->bind)->getHeader((std::string)arg); }); var __LAZY_REQ_URL = __NERD_Create_Var_Unscoped_Anon( { return ((uWS::HttpRequest*)__NERD_OBJECT(__NERD_THIS)->bind)->getUrl(); }); struct __Nerd_HttpStruct { var resStatus =__LAZY_RES_STATUS; var resHeader = __LAZY_RES_HEADER; var resWrite = __LAZY_RES_WRITE; var resEnd = __LAZY_RES_END; var reqMethod = __LAZY_REQ_METHOD; var reqHeader = __LAZY_REQ_HEADER; var reqUrl = __LAZY_REQ_URL; } ; ================================================ FILE: nerd_modules/http/httplib/uSockets/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: nerd_modules/http/httplib/uSockets/bsd.c ================================================ /* * Authored by Alex Hultman, 2018-2021. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* Todo: this file should lie in networking/bsd.c */ #include "libusockets.h" #include "internal/internal.h" #include #ifndef _WIN32 //#define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #endif LIBUS_SOCKET_DESCRIPTOR apple_no_sigpipe(LIBUS_SOCKET_DESCRIPTOR fd) { #ifdef __APPLE__ if (fd != LIBUS_SOCKET_ERROR) { int no_sigpipe = 1; setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, &no_sigpipe, sizeof(int)); } #endif return fd; } LIBUS_SOCKET_DESCRIPTOR bsd_set_nonblocking(LIBUS_SOCKET_DESCRIPTOR fd) { #ifdef _WIN32 /* Libuv will set windows sockets as non-blocking */ #else fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK); #endif return fd; } void bsd_socket_nodelay(LIBUS_SOCKET_DESCRIPTOR fd, int enabled) { setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (void *) &enabled, sizeof(enabled)); } void bsd_socket_flush(LIBUS_SOCKET_DESCRIPTOR fd) { // Linux TCP_CORK has the same underlying corking mechanism as with MSG_MORE #ifdef TCP_CORK int enabled = 0; setsockopt(fd, IPPROTO_TCP, TCP_CORK, &enabled, sizeof(int)); #endif } LIBUS_SOCKET_DESCRIPTOR bsd_create_socket(int domain, int type, int protocol) { // returns INVALID_SOCKET on error int flags = 0; #if defined(SOCK_CLOEXEC) && defined(SOCK_NONBLOCK) flags = SOCK_CLOEXEC | SOCK_NONBLOCK; #endif LIBUS_SOCKET_DESCRIPTOR created_fd = socket(domain, type | flags, protocol); return bsd_set_nonblocking(apple_no_sigpipe(created_fd)); } void bsd_close_socket(LIBUS_SOCKET_DESCRIPTOR fd) { #ifdef _WIN32 closesocket(fd); #else close(fd); #endif } void bsd_shutdown_socket(LIBUS_SOCKET_DESCRIPTOR fd) { #ifdef _WIN32 shutdown(fd, SD_SEND); #else shutdown(fd, SHUT_WR); #endif } void bsd_shutdown_socket_read(LIBUS_SOCKET_DESCRIPTOR fd) { #ifdef _WIN32 shutdown(fd, SD_RECEIVE); #else shutdown(fd, SHUT_RD); #endif } void internal_finalize_bsd_addr(struct bsd_addr_t *addr) { // parse, so to speak, the address if (addr->mem.ss_family == AF_INET6) { addr->ip = (char *) &((struct sockaddr_in6 *) addr)->sin6_addr; addr->ip_length = sizeof(struct in6_addr); addr->port = ntohs(((struct sockaddr_in6 *) addr)->sin6_port); } else if (addr->mem.ss_family == AF_INET) { addr->ip = (char *) &((struct sockaddr_in *) addr)->sin_addr; addr->ip_length = sizeof(struct in_addr); addr->port = ntohs(((struct sockaddr_in *) addr)->sin_port); } else { addr->ip_length = 0; addr->port = -1; } } int bsd_local_addr(LIBUS_SOCKET_DESCRIPTOR fd, struct bsd_addr_t *addr) { addr->len = sizeof(addr->mem); if (getsockname(fd, (struct sockaddr *) &addr->mem, &addr->len)) { return -1; } internal_finalize_bsd_addr(addr); return 0; } int bsd_remote_addr(LIBUS_SOCKET_DESCRIPTOR fd, struct bsd_addr_t *addr) { addr->len = sizeof(addr->mem); if (getpeername(fd, (struct sockaddr *) &addr->mem, &addr->len)) { return -1; } internal_finalize_bsd_addr(addr); return 0; } char *bsd_addr_get_ip(struct bsd_addr_t *addr) { return addr->ip; } int bsd_addr_get_ip_length(struct bsd_addr_t *addr) { return addr->ip_length; } int bsd_addr_get_port(struct bsd_addr_t *addr) { return addr->port; } // called by dispatch_ready_poll LIBUS_SOCKET_DESCRIPTOR bsd_accept_socket(LIBUS_SOCKET_DESCRIPTOR fd, struct bsd_addr_t *addr) { LIBUS_SOCKET_DESCRIPTOR accepted_fd; addr->len = sizeof(addr->mem); #if defined(SOCK_CLOEXEC) && defined(SOCK_NONBLOCK) // Linux, FreeBSD accepted_fd = accept4(fd, (struct sockaddr *) addr, &addr->len, SOCK_CLOEXEC | SOCK_NONBLOCK); #else // Windows, OS X accepted_fd = accept(fd, (struct sockaddr *) addr, &addr->len); #endif /* We cannot rely on addr since it is not initialized if failed */ if (accepted_fd == LIBUS_SOCKET_ERROR) { return LIBUS_SOCKET_ERROR; } internal_finalize_bsd_addr(addr); return bsd_set_nonblocking(apple_no_sigpipe(accepted_fd)); } int bsd_recv(LIBUS_SOCKET_DESCRIPTOR fd, void *buf, int length, int flags) { return recv(fd, buf, length, flags); } int bsd_send(LIBUS_SOCKET_DESCRIPTOR fd, const char *buf, int length, int msg_more) { // MSG_MORE (Linux), MSG_PARTIAL (Windows), TCP_NOPUSH (BSD) #ifndef MSG_NOSIGNAL #define MSG_NOSIGNAL 0 #endif #ifdef MSG_MORE // for Linux we do not want signals return send(fd, buf, length, (msg_more * MSG_MORE) | MSG_NOSIGNAL); #else // use TCP_NOPUSH return send(fd, buf, length, MSG_NOSIGNAL); #endif } int bsd_would_block() { #ifdef _WIN32 return WSAGetLastError() == WSAEWOULDBLOCK; #else return errno == EWOULDBLOCK;// || errno == EAGAIN; #endif } // return LIBUS_SOCKET_ERROR or the fd that represents listen socket // listen both on ipv6 and ipv4 LIBUS_SOCKET_DESCRIPTOR bsd_create_listen_socket(const char *host, int port, int options) { struct addrinfo hints, *result; memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_flags = AI_PASSIVE; hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; char port_string[16]; snprintf(port_string, 16, "%d", port); if (getaddrinfo(host, port_string, &hints, &result)) { return LIBUS_SOCKET_ERROR; } LIBUS_SOCKET_DESCRIPTOR listenFd = LIBUS_SOCKET_ERROR; struct addrinfo *listenAddr; for (struct addrinfo *a = result; a && listenFd == LIBUS_SOCKET_ERROR; a = a->ai_next) { if (a->ai_family == AF_INET6) { listenFd = bsd_create_socket(a->ai_family, a->ai_socktype, a->ai_protocol); listenAddr = a; } } for (struct addrinfo *a = result; a && listenFd == LIBUS_SOCKET_ERROR; a = a->ai_next) { if (a->ai_family == AF_INET) { listenFd = bsd_create_socket(a->ai_family, a->ai_socktype, a->ai_protocol); listenAddr = a; } } if (listenFd == LIBUS_SOCKET_ERROR) { freeaddrinfo(result); return LIBUS_SOCKET_ERROR; } if (port != 0) { /* Otherwise, always enable SO_REUSEPORT and SO_REUSEADDR _unless_ options specify otherwise */ #if /*defined(__linux) &&*/ defined(SO_REUSEPORT) if (!(options & LIBUS_LISTEN_EXCLUSIVE_PORT)) { int optval = 1; setsockopt(listenFd, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval)); } #endif int enabled = 1; setsockopt(listenFd, SOL_SOCKET, SO_REUSEADDR, (SETSOCKOPT_PTR_TYPE) &enabled, sizeof(enabled)); } #ifdef IPV6_V6ONLY int disabled = 0; setsockopt(listenFd, IPPROTO_IPV6, IPV6_V6ONLY, (SETSOCKOPT_PTR_TYPE) &disabled, sizeof(disabled)); #endif if (bind(listenFd, listenAddr->ai_addr, (socklen_t) listenAddr->ai_addrlen) || listen(listenFd, 512)) { bsd_close_socket(listenFd); freeaddrinfo(result); return LIBUS_SOCKET_ERROR; } freeaddrinfo(result); return listenFd; } LIBUS_SOCKET_DESCRIPTOR bsd_create_connect_socket(const char *host, int port, const char *source_host, int options) { struct addrinfo hints, *result; memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; char port_string[16]; snprintf(port_string, 16, "%d", port); if (getaddrinfo(host, port_string, &hints, &result) != 0) { return LIBUS_SOCKET_ERROR; } LIBUS_SOCKET_DESCRIPTOR fd = bsd_create_socket(result->ai_family, result->ai_socktype, result->ai_protocol); if (fd == LIBUS_SOCKET_ERROR) { freeaddrinfo(result); return LIBUS_SOCKET_ERROR; } if (source_host) { struct addrinfo *interface_result; if (!getaddrinfo(source_host, NULL, NULL, &interface_result)) { int ret = bind(fd, interface_result->ai_addr, (socklen_t) interface_result->ai_addrlen); freeaddrinfo(interface_result); if (ret == LIBUS_SOCKET_ERROR) { return LIBUS_SOCKET_ERROR; } } } connect(fd, result->ai_addr, (socklen_t) result->ai_addrlen); freeaddrinfo(result); return fd; } ================================================ FILE: nerd_modules/http/httplib/uSockets/context.c ================================================ /* * Authored by Alex Hultman, 2018-2019. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "libusockets.h" #include "internal/internal.h" #include #include int default_ignore_data_handler(struct us_socket_t *s) { return 0; } /* Shared with SSL */ unsigned short us_socket_context_timestamp(int ssl, struct us_socket_context_t *context) { return context->timestamp; } void us_listen_socket_close(int ssl, struct us_listen_socket_t *ls) { /* us_listen_socket_t extends us_socket_t so we close in similar ways */ if (!us_socket_is_closed(0, &ls->s)) { us_internal_socket_context_unlink(ls->s.context, &ls->s); us_poll_stop((struct us_poll_t *) &ls->s, ls->s.context->loop); bsd_close_socket(us_poll_fd((struct us_poll_t *) &ls->s)); /* Link this socket to the close-list and let it be deleted after this iteration */ ls->s.next = ls->s.context->loop->data.closed_head; ls->s.context->loop->data.closed_head = &ls->s; /* Any socket with prev = context is marked as closed */ ls->s.prev = (struct us_socket_t *) ls->s.context; } /* We cannot immediately free a listen socket as we can be inside an accept loop */ } void us_internal_socket_context_unlink(struct us_socket_context_t *context, struct us_socket_t *s) { /* We have to properly update the iterator used to sweep sockets for timeouts */ if (s == context->iterator) { context->iterator = s->next; } if (s->prev == s->next) { context->head = 0; } else { if (s->prev) { s->prev->next = s->next; } else { context->head = s->next; } if (s->next) { s->next->prev = s->prev; } } } /* We always add in the top, so we don't modify any s.next */ void us_internal_socket_context_link(struct us_socket_context_t *context, struct us_socket_t *s) { s->context = context; s->timeout = 0; s->next = context->head; s->prev = 0; if (context->head) { context->head->prev = s; } context->head = s; } struct us_loop_t *us_socket_context_loop(int ssl, struct us_socket_context_t *context) { return context->loop; } /* Not shared with SSL */ /* Add SNI context */ void us_socket_context_add_server_name(int ssl, struct us_socket_context_t *context, const char *hostname_pattern, struct us_socket_context_options_t options) { #ifndef LIBUS_NO_SSL if (ssl) { us_internal_ssl_socket_context_add_server_name((struct us_internal_ssl_socket_context_t *) context, hostname_pattern, options); } #endif } /* Remove SNI context */ void us_socket_context_remove_server_name(int ssl, struct us_socket_context_t *context, const char *hostname_pattern) { #ifndef LIBUS_NO_SSL if (ssl) { us_internal_ssl_socket_context_remove_server_name((struct us_internal_ssl_socket_context_t *) context, hostname_pattern); } #endif } /* I don't like this one - maybe rename it to on_missing_server_name? */ /* Called when SNI matching fails - not if a match could be made. * You may modify the context by adding/removing names in this callback. * If the correct name is added immediately in the callback, it will be used */ void us_socket_context_on_server_name(int ssl, struct us_socket_context_t *context, void (*cb)(struct us_socket_context_t *, const char *hostname)) { #ifndef LIBUS_NO_SSL if (ssl) { us_internal_ssl_socket_context_on_server_name((struct us_internal_ssl_socket_context_t *) context, (void (*)(struct us_internal_ssl_socket_context_t *, const char *hostname)) cb); } #endif } /* Todo: get native context from SNI pattern */ void *us_socket_context_get_native_handle(int ssl, struct us_socket_context_t *context) { #ifndef LIBUS_NO_SSL if (ssl) { return us_internal_ssl_socket_context_get_native_handle((struct us_internal_ssl_socket_context_t *) context); } #endif /* There is no native handle for a non-SSL socket context */ return 0; } /* Options is currently only applicable for SSL - this will change with time (prefer_low_memory is one example) */ struct us_socket_context_t *us_create_socket_context(int ssl, struct us_loop_t *loop, int context_ext_size, struct us_socket_context_options_t options) { #ifndef LIBUS_NO_SSL if (ssl) { /* This function will call us, again, with SSL = false and a bigger ext_size */ return (struct us_socket_context_t *) us_internal_create_ssl_socket_context(loop, context_ext_size, options); } #endif /* This path is taken once either way - always BEFORE whatever SSL may do LATER. * context_ext_size will however be modified larger in case of SSL, to hold SSL extensions */ struct us_socket_context_t *context = malloc(sizeof(struct us_socket_context_t) + context_ext_size); context->loop = loop; context->head = 0; context->iterator = 0; context->next = 0; context->ignore_data = default_ignore_data_handler; /* Begin at 0 */ context->timestamp = 0; us_internal_loop_link(loop, context); /* If we are called from within SSL code, SSL code will make further changes to us */ return context; } void us_socket_context_free(int ssl, struct us_socket_context_t *context) { #ifndef LIBUS_NO_SSL if (ssl) { /* This function will call us again with SSL=false */ us_internal_ssl_socket_context_free((struct us_internal_ssl_socket_context_t *) context); return; } #endif /* This path is taken once either way - always AFTER whatever SSL may do BEFORE. * This is the opposite order compared to when creating the context - SSL code is cleaning up before non-SSL */ us_internal_loop_unlink(context->loop, context); free(context); } struct us_listen_socket_t *us_socket_context_listen(int ssl, struct us_socket_context_t *context, const char *host, int port, int options, int socket_ext_size) { #ifndef LIBUS_NO_SSL if (ssl) { return us_internal_ssl_socket_context_listen((struct us_internal_ssl_socket_context_t *) context, host, port, options, socket_ext_size); } #endif LIBUS_SOCKET_DESCRIPTOR listen_socket_fd = bsd_create_listen_socket(host, port, options); if (listen_socket_fd == LIBUS_SOCKET_ERROR) { return 0; } struct us_poll_t *p = us_create_poll(context->loop, 0, sizeof(struct us_listen_socket_t)); us_poll_init(p, listen_socket_fd, POLL_TYPE_SEMI_SOCKET); us_poll_start(p, context->loop, LIBUS_SOCKET_READABLE); struct us_listen_socket_t *ls = (struct us_listen_socket_t *) p; ls->s.context = context; ls->s.timeout = 0; ls->s.next = 0; us_internal_socket_context_link(context, &ls->s); ls->socket_ext_size = socket_ext_size; return ls; } struct us_socket_t *us_socket_context_connect(int ssl, struct us_socket_context_t *context, const char *host, int port, const char *source_host, int options, int socket_ext_size) { #ifndef LIBUS_NO_SSL if (ssl) { return (struct us_socket_t *) us_internal_ssl_socket_context_connect((struct us_internal_ssl_socket_context_t *) context, host, port, source_host, options, socket_ext_size); } #endif LIBUS_SOCKET_DESCRIPTOR connect_socket_fd = bsd_create_connect_socket(host, port, source_host, options); if (connect_socket_fd == LIBUS_SOCKET_ERROR) { return 0; } /* Connect sockets are semi-sockets just like listen sockets */ struct us_poll_t *p = us_create_poll(context->loop, 0, sizeof(struct us_socket_t) + socket_ext_size); us_poll_init(p, connect_socket_fd, POLL_TYPE_SEMI_SOCKET); us_poll_start(p, context->loop, LIBUS_SOCKET_WRITABLE); struct us_socket_t *connect_socket = (struct us_socket_t *) p; /* Link it into context so that timeout fires properly */ connect_socket->context = context; us_internal_socket_context_link(context, connect_socket); return connect_socket; } struct us_socket_context_t *us_create_child_socket_context(int ssl, struct us_socket_context_t *context, int context_ext_size) { #ifndef LIBUS_NO_SSL if (ssl) { return (struct us_socket_context_t *) us_internal_create_child_ssl_socket_context((struct us_internal_ssl_socket_context_t *) context, context_ext_size); } #endif /* For TCP we simply create a new context as nothing is shared */ struct us_socket_context_options_t options = {0}; return us_create_socket_context(ssl, context->loop, context_ext_size, options); } /* Note: This will set timeout to 0 */ struct us_socket_t *us_socket_context_adopt_socket(int ssl, struct us_socket_context_t *context, struct us_socket_t *s, int ext_size) { #ifndef LIBUS_NO_SSL if (ssl) { return (struct us_socket_t *) us_internal_ssl_socket_context_adopt_socket((struct us_internal_ssl_socket_context_t *) context, (struct us_internal_ssl_socket_t *) s, ext_size); } #endif /* Cannot adopt a closed socket */ if (us_socket_is_closed(ssl, s)) { return s; } /* This properly updates the iterator if in on_timeout */ us_internal_socket_context_unlink(s->context, s); struct us_socket_t *new_s = (struct us_socket_t *) us_poll_resize(&s->p, s->context->loop, sizeof(struct us_socket_t) + ext_size); us_internal_socket_context_link(context, new_s); return new_s; } void us_socket_context_on_open(int ssl, struct us_socket_context_t *context, struct us_socket_t *(*on_open)(struct us_socket_t *s, int is_client, char *ip, int ip_length)) { #ifndef LIBUS_NO_SSL if (ssl) { us_internal_ssl_socket_context_on_open((struct us_internal_ssl_socket_context_t *) context, (struct us_internal_ssl_socket_t * (*)(struct us_internal_ssl_socket_t *, int, char *, int)) on_open); return; } #endif context->on_open = on_open; } void us_socket_context_on_close(int ssl, struct us_socket_context_t *context, struct us_socket_t *(*on_close)(struct us_socket_t *s, int code, void *reason)) { #ifndef LIBUS_NO_SSL if (ssl) { us_internal_ssl_socket_context_on_close((struct us_internal_ssl_socket_context_t *) context, (struct us_internal_ssl_socket_t * (*)(struct us_internal_ssl_socket_t *, int code, void *reason)) on_close); return; } #endif context->on_close = on_close; } void us_socket_context_on_data(int ssl, struct us_socket_context_t *context, struct us_socket_t *(*on_data)(struct us_socket_t *s, char *data, int length)) { #ifndef LIBUS_NO_SSL if (ssl) { us_internal_ssl_socket_context_on_data((struct us_internal_ssl_socket_context_t *) context, (struct us_internal_ssl_socket_t * (*)(struct us_internal_ssl_socket_t *, char *, int)) on_data); return; } #endif context->on_data = on_data; } void us_socket_context_on_writable(int ssl, struct us_socket_context_t *context, struct us_socket_t *(*on_writable)(struct us_socket_t *s)) { #ifndef LIBUS_NO_SSL if (ssl) { us_internal_ssl_socket_context_on_writable((struct us_internal_ssl_socket_context_t *) context, (struct us_internal_ssl_socket_t * (*)(struct us_internal_ssl_socket_t *)) on_writable); return; } #endif context->on_writable = on_writable; } void us_socket_context_on_timeout(int ssl, struct us_socket_context_t *context, struct us_socket_t *(*on_timeout)(struct us_socket_t *)) { #ifndef LIBUS_NO_SSL if (ssl) { us_internal_ssl_socket_context_on_timeout((struct us_internal_ssl_socket_context_t *) context, (struct us_internal_ssl_socket_t * (*)(struct us_internal_ssl_socket_t *)) on_timeout); return; } #endif context->on_socket_timeout = on_timeout; } void us_socket_context_on_end(int ssl, struct us_socket_context_t *context, struct us_socket_t *(*on_end)(struct us_socket_t *)) { #ifndef LIBUS_NO_SSL if (ssl) { us_internal_ssl_socket_context_on_end((struct us_internal_ssl_socket_context_t *) context, (struct us_internal_ssl_socket_t * (*)(struct us_internal_ssl_socket_t *)) on_end); return; } #endif context->on_end = on_end; } void us_socket_context_on_connect_error(int ssl, struct us_socket_context_t *context, struct us_socket_t *(*on_connect_error)(struct us_socket_t *s, int code)) { #ifndef LIBUS_NO_SSL if (ssl) { us_internal_ssl_socket_context_on_connect_error((struct us_internal_ssl_socket_context_t *) context, (struct us_internal_ssl_socket_t * (*)(struct us_internal_ssl_socket_t *, int)) on_connect_error); return; } #endif context->on_connect_error = on_connect_error; } void *us_socket_context_ext(int ssl, struct us_socket_context_t *context) { #ifndef LIBUS_NO_SSL if (ssl) { return us_internal_ssl_socket_context_ext((struct us_internal_ssl_socket_context_t *) context); } #endif return context + 1; } ================================================ FILE: nerd_modules/http/httplib/uSockets/crypto/openssl.c ================================================ /* * Authored by Alex Hultman, 2018-2019. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifdef LIBUS_USE_OPENSSL /* These are in sni_tree.cpp */ void *sni_new(); void sni_free(void *sni, void(*cb)(void *)); int sni_add(void *sni, const char *hostname, void *user); void *sni_remove(void *sni, const char *hostname); void *sni_find(void *sni, const char *hostname); #include "libusockets.h" #include "internal/internal.h" #include /* This module contains the entire OpenSSL implementation * of the SSL socket and socket context interfaces. */ #include #include #include /* We do not want to block the loop with tons and tons of CPU-intensive work. * Spread it out during many loop iterations, prioritizing already open connections, * they are far easier on CPU */ static const int MAX_HANDSHAKES_PER_LOOP_ITERATION = 5; struct loop_ssl_data { char *ssl_read_input, *ssl_read_output; unsigned int ssl_read_input_length; unsigned int ssl_read_input_offset; struct us_socket_t *ssl_socket; int last_write_was_msg_more; int msg_more; // these are used to throttle SSL handshakes per loop iteration long long last_iteration_nr; int handshake_budget; BIO *shared_rbio; BIO *shared_wbio; BIO_METHOD *shared_biom; }; struct us_internal_ssl_socket_context_t { struct us_socket_context_t sc; // this thing can be shared with other socket contexts via socket transfer! // maybe instead of holding once you hold many, a vector or set // when a socket that belongs to another socket context transfers to a new socket context SSL_CTX *ssl_context; int is_parent; /* These decorate the base implementation */ struct us_internal_ssl_socket_t *(*on_open)(struct us_internal_ssl_socket_t *, int is_client, char *ip, int ip_length); struct us_internal_ssl_socket_t *(*on_data)(struct us_internal_ssl_socket_t *, char *data, int length); struct us_internal_ssl_socket_t *(*on_writable)(struct us_internal_ssl_socket_t *); struct us_internal_ssl_socket_t *(*on_close)(struct us_internal_ssl_socket_t *, int code, void *reason); /* Called for missing SNI hostnames, if not NULL */ void (*on_server_name)(struct us_internal_ssl_socket_context_t *, const char *hostname); /* Pointer to sni tree, created when the context is created and freed likewise when freed */ void *sni; }; // same here, should or shouldn't it contain s? struct us_internal_ssl_socket_t { struct us_socket_t s; SSL *ssl; int ssl_write_wants_read; // we use this for now int ssl_read_wants_write; }; int passphrase_cb(char *buf, int size, int rwflag, void *u) { const char *passphrase = (const char *) u; size_t passphrase_length = strlen(passphrase); memcpy(buf, passphrase, passphrase_length); // put null at end? no? return (int) passphrase_length; } int BIO_s_custom_create(BIO *bio) { BIO_set_init(bio, 1); return 1; } long BIO_s_custom_ctrl(BIO *bio, int cmd, long num, void *user) { switch(cmd) { case BIO_CTRL_FLUSH: return 1; default: return 0; } } int BIO_s_custom_write(BIO *bio, const char *data, int length) { struct loop_ssl_data *loop_ssl_data = (struct loop_ssl_data *) BIO_get_data(bio); //printf("BIO_s_custom_write\n"); loop_ssl_data->last_write_was_msg_more = loop_ssl_data->msg_more || length == 16413; int written = us_socket_write(0, loop_ssl_data->ssl_socket, data, length, loop_ssl_data->last_write_was_msg_more); if (!written) { BIO_set_flags(bio, BIO_FLAGS_SHOULD_RETRY | BIO_FLAGS_WRITE); return -1; } //printf("BIO_s_custom_write returns: %d\n", ret); return written; } int BIO_s_custom_read(BIO *bio, char *dst, int length) { struct loop_ssl_data *loop_ssl_data = (struct loop_ssl_data *) BIO_get_data(bio); //printf("BIO_s_custom_read\n"); if (!loop_ssl_data->ssl_read_input_length) { BIO_set_flags(bio, BIO_FLAGS_SHOULD_RETRY | BIO_FLAGS_READ); return -1; } if ((unsigned int) length > loop_ssl_data->ssl_read_input_length) { length = loop_ssl_data->ssl_read_input_length; } memcpy(dst, loop_ssl_data->ssl_read_input + loop_ssl_data->ssl_read_input_offset, length); loop_ssl_data->ssl_read_input_offset += length; loop_ssl_data->ssl_read_input_length -= length; return length; } struct us_internal_ssl_socket_t *ssl_on_open(struct us_internal_ssl_socket_t *s, int is_client, char *ip, int ip_length) { struct us_internal_ssl_socket_context_t *context = (struct us_internal_ssl_socket_context_t *) us_socket_context(0, &s->s); struct us_loop_t *loop = us_socket_context_loop(0, &context->sc); struct loop_ssl_data *loop_ssl_data = (struct loop_ssl_data *) loop->data.ssl_data; s->ssl = SSL_new(context->ssl_context); s->ssl_write_wants_read = 0; s->ssl_read_wants_write = 0; SSL_set_bio(s->ssl, loop_ssl_data->shared_rbio, loop_ssl_data->shared_wbio); BIO_up_ref(loop_ssl_data->shared_rbio); BIO_up_ref(loop_ssl_data->shared_wbio); if (is_client) { SSL_set_connect_state(s->ssl); } else { SSL_set_accept_state(s->ssl); } return (struct us_internal_ssl_socket_t *) context->on_open(s, is_client, ip, ip_length); } /* This one is a helper; it is entirely shared with non-SSL so can be removed */ struct us_internal_ssl_socket_t *us_internal_ssl_socket_close(struct us_internal_ssl_socket_t *s, int code, void *reason) { return (struct us_internal_ssl_socket_t *) us_socket_close(0, (struct us_socket_t *) s, code, reason); } struct us_internal_ssl_socket_t *ssl_on_close(struct us_internal_ssl_socket_t *s, int code, void *reason) { struct us_internal_ssl_socket_context_t *context = (struct us_internal_ssl_socket_context_t *) us_socket_context(0, &s->s); SSL_free(s->ssl); return context->on_close(s, code, reason); } struct us_internal_ssl_socket_t *ssl_on_end(struct us_internal_ssl_socket_t *s) { // struct us_internal_ssl_socket_context_t *context = (struct us_internal_ssl_socket_context_t *) us_socket_context(0, &s->s); // whatever state we are in, a TCP FIN is always an answered shutdown /* Todo: this should report CLEANLY SHUTDOWN as reason */ return us_internal_ssl_socket_close(s, 0, NULL); } // this whole function needs a complete clean-up struct us_internal_ssl_socket_t *ssl_on_data(struct us_internal_ssl_socket_t *s, void *data, int length) { // note: this context can change when we adopt the socket! struct us_internal_ssl_socket_context_t *context = (struct us_internal_ssl_socket_context_t *) us_socket_context(0, &s->s); struct us_loop_t *loop = us_socket_context_loop(0, &context->sc); struct loop_ssl_data *loop_ssl_data = (struct loop_ssl_data *) loop->data.ssl_data; // note: if we put data here we should never really clear it (not in write either, it still should be available for SSL_write to read from!) loop_ssl_data->ssl_read_input = data; loop_ssl_data->ssl_read_input_length = length; loop_ssl_data->ssl_read_input_offset = 0; loop_ssl_data->ssl_socket = &s->s; loop_ssl_data->msg_more = 0; if (us_internal_ssl_socket_is_shut_down(s)) { int ret; if ((ret = SSL_shutdown(s->ssl)) == 1) { // two phase shutdown is complete here //printf("Two step SSL shutdown complete\n"); /* Todo: this should also report some kind of clean shutdown */ return us_internal_ssl_socket_close(s, 0, NULL); } else if (ret < 0) { int err = SSL_get_error(s->ssl, ret); if (err == SSL_ERROR_SSL || err == SSL_ERROR_SYSCALL) { // we need to clear the error queue in case these added to the thread local queue ERR_clear_error(); } } // no further processing of data when in shutdown state return s; } // bug checking: this loop needs a lot of attention and clean-ups and check-ups int read = 0; restart: while (1) { int just_read = SSL_read(s->ssl, loop_ssl_data->ssl_read_output + LIBUS_RECV_BUFFER_PADDING + read, LIBUS_RECV_BUFFER_LENGTH - read); if (just_read <= 0) { int err = SSL_get_error(s->ssl, just_read); // as far as I know these are the only errors we want to handle if (err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE) { // clear per thread error queue if it may contain something if (err == SSL_ERROR_SSL || err == SSL_ERROR_SYSCALL) { ERR_clear_error(); } // terminate connection here return us_internal_ssl_socket_close(s, 0, NULL); } else { // emit the data we have and exit if (err == SSL_ERROR_WANT_WRITE) { // here we need to trigger writable event next ssl_read! s->ssl_read_wants_write = 1; } // assume we emptied the input buffer fully or error here as well! if (loop_ssl_data->ssl_read_input_length) { return us_internal_ssl_socket_close(s, 0, NULL); } // cannot emit zero length to app if (!read) { break; } context = (struct us_internal_ssl_socket_context_t *) us_socket_context(0, &s->s); s = context->on_data(s, loop_ssl_data->ssl_read_output + LIBUS_RECV_BUFFER_PADDING, read); if (us_socket_is_closed(0, &s->s)) { return s; } break; } } read += just_read; // at this point we might be full and need to emit the data to application and start over if (read == LIBUS_RECV_BUFFER_LENGTH) { context = (struct us_internal_ssl_socket_context_t *) us_socket_context(0, &s->s); // emit data and restart s = context->on_data(s, loop_ssl_data->ssl_read_output + LIBUS_RECV_BUFFER_PADDING, read); if (us_socket_is_closed(0, &s->s)) { return s; } read = 0; goto restart; } } // trigger writable if we failed last write with want read if (s->ssl_write_wants_read) { s->ssl_write_wants_read = 0; // make sure to update context before we call (context can change if the user adopts the socket!) context = (struct us_internal_ssl_socket_context_t *) us_socket_context(0, &s->s); s = (struct us_internal_ssl_socket_t *) context->sc.on_writable(&s->s); // cast here! // if we are closed here, then exit if (us_socket_is_closed(0, &s->s)) { return s; } } // check this then? if (SSL_get_shutdown(s->ssl) & SSL_RECEIVED_SHUTDOWN) { //printf("SSL_RECEIVED_SHUTDOWN\n"); //exit(-2); // not correct anyways! s = us_internal_ssl_socket_close(s, 0, NULL); //us_ } return s; } struct us_internal_ssl_socket_t *ssl_on_writable(struct us_internal_ssl_socket_t *s) { struct us_internal_ssl_socket_context_t *context = (struct us_internal_ssl_socket_context_t *) us_socket_context(0, &s->s); // todo: cork here so that we efficiently output both from reading and from writing? if (s->ssl_read_wants_write) { s->ssl_read_wants_write = 0; // make sure to update context before we call (context can change if the user adopts the socket!) context = (struct us_internal_ssl_socket_context_t *) us_socket_context(0, &s->s); // if this one fails to write data, it sets ssl_read_wants_write again s = (struct us_internal_ssl_socket_t *) context->sc.on_data(&s->s, 0, 0); // cast here! } // should this one come before we have read? should it come always? spurious on_writable is okay s = context->on_writable(s); return s; } /* Lazily inits loop ssl data first time */ void us_internal_init_loop_ssl_data(struct us_loop_t *loop) { if (!loop->data.ssl_data) { struct loop_ssl_data *loop_ssl_data = malloc(sizeof(struct loop_ssl_data)); loop_ssl_data->ssl_read_output = malloc(LIBUS_RECV_BUFFER_LENGTH + LIBUS_RECV_BUFFER_PADDING * 2); OPENSSL_init_ssl(0, NULL); loop_ssl_data->shared_biom = BIO_meth_new(BIO_TYPE_MEM, "µS BIO"); BIO_meth_set_create(loop_ssl_data->shared_biom, BIO_s_custom_create); BIO_meth_set_write(loop_ssl_data->shared_biom, BIO_s_custom_write); BIO_meth_set_read(loop_ssl_data->shared_biom, BIO_s_custom_read); BIO_meth_set_ctrl(loop_ssl_data->shared_biom, BIO_s_custom_ctrl); loop_ssl_data->shared_rbio = BIO_new(loop_ssl_data->shared_biom); loop_ssl_data->shared_wbio = BIO_new(loop_ssl_data->shared_biom); BIO_set_data(loop_ssl_data->shared_rbio, loop_ssl_data); BIO_set_data(loop_ssl_data->shared_wbio, loop_ssl_data); // reset handshake budget (doesn't matter what loop nr we start on) loop_ssl_data->last_iteration_nr = 0; loop_ssl_data->handshake_budget = MAX_HANDSHAKES_PER_LOOP_ITERATION; loop->data.ssl_data = loop_ssl_data; } } /* Called by loop free, clears any loop ssl data */ void us_internal_free_loop_ssl_data(struct us_loop_t *loop) { struct loop_ssl_data *loop_ssl_data = (struct loop_ssl_data *) loop->data.ssl_data; if (loop_ssl_data) { free(loop_ssl_data->ssl_read_output); BIO_free(loop_ssl_data->shared_rbio); BIO_free(loop_ssl_data->shared_wbio); BIO_meth_free(loop_ssl_data->shared_biom); free(loop_ssl_data); } } // we ignore reading data for ssl sockets that are // in init state, if our so called budget for doing // so won't allow it. here we actually use // the kernel buffering to our advantage int ssl_ignore_data(struct us_internal_ssl_socket_t *s) { // fast path just checks for init if (!SSL_in_init(s->ssl)) { return 0; } // this path is run for all ssl sockets that are in init and just got data event from polling struct us_loop_t *loop = s->s.context->loop; struct loop_ssl_data *loop_ssl_data = loop->data.ssl_data; // reset handshake budget if new iteration if (loop_ssl_data->last_iteration_nr != us_loop_iteration_number(loop)) { loop_ssl_data->last_iteration_nr = us_loop_iteration_number(loop); loop_ssl_data->handshake_budget = MAX_HANDSHAKES_PER_LOOP_ITERATION; } if (loop_ssl_data->handshake_budget) { loop_ssl_data->handshake_budget--; return 0; } // ignore this data event return 1; } /* Per-context functions */ void *us_internal_ssl_socket_context_get_native_handle(struct us_internal_ssl_socket_context_t *context) { return context->ssl_context; } struct us_internal_ssl_socket_context_t *us_internal_create_child_ssl_socket_context(struct us_internal_ssl_socket_context_t *context, int context_ext_size) { /* Create a new non-SSL context */ struct us_socket_context_options_t options = {0}; struct us_internal_ssl_socket_context_t *child_context = (struct us_internal_ssl_socket_context_t *) us_create_socket_context(0, context->sc.loop, sizeof(struct us_internal_ssl_socket_context_t) + context_ext_size, options); /* The only thing we share is SSL_CTX */ child_context->ssl_context = context->ssl_context; child_context->is_parent = 0; return child_context; } /* Common function for creating a context from options. * We must NOT free a SSL_CTX with only SSL_CTX_free! Also free any password */ void free_ssl_context(SSL_CTX *ssl_context) { if (!ssl_context) { return; } /* If we have set a password string, free it here */ void *password = SSL_CTX_get_default_passwd_cb_userdata(ssl_context); /* OpenSSL returns NULL if we have no set password */ free(password); SSL_CTX_free(ssl_context); } /* This function should take any options and return SSL_CTX - which has to be free'd with * our destructor function - free_ssl_context() */ SSL_CTX *create_ssl_context_from_options(struct us_socket_context_options_t options) { /* Create the context */ SSL_CTX *ssl_context = SSL_CTX_new(TLS_method()); /* Default options we rely on - changing these will break our logic */ SSL_CTX_set_read_ahead(ssl_context, 1); SSL_CTX_set_mode(ssl_context, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER); /* Anything below TLS 1.2 is disabled */ SSL_CTX_set_min_proto_version(ssl_context, TLS1_2_VERSION); /* The following are helpers. You may easily implement whatever you want by using the native handle directly */ /* Important option for lowering memory usage, but lowers performance slightly */ if (options.ssl_prefer_low_memory_usage) { SSL_CTX_set_mode(ssl_context, SSL_MODE_RELEASE_BUFFERS); } if (options.passphrase) { /* When freeing the CTX we need to check SSL_CTX_get_default_passwd_cb_userdata and * free it if set */ SSL_CTX_set_default_passwd_cb_userdata(ssl_context, (void *) strdup(options.passphrase)); SSL_CTX_set_default_passwd_cb(ssl_context, passphrase_cb); } /* This one most probably do not need the cert_file_name string to be kept alive */ if (options.cert_file_name) { if (SSL_CTX_use_certificate_chain_file(ssl_context, options.cert_file_name) != 1) { free_ssl_context(ssl_context); return NULL; } } /* Same as above - we can discard this string afterwards I suppose */ if (options.key_file_name) { if (SSL_CTX_use_PrivateKey_file(ssl_context, options.key_file_name, SSL_FILETYPE_PEM) != 1) { free_ssl_context(ssl_context); return NULL; } } if (options.ca_file_name) { STACK_OF(X509_NAME) *ca_list; ca_list = SSL_load_client_CA_file(options.ca_file_name); if(ca_list == NULL) { free_ssl_context(ssl_context); return NULL; } SSL_CTX_set_client_CA_list(ssl_context, ca_list); if (SSL_CTX_load_verify_locations(ssl_context, options.ca_file_name, NULL) != 1) { free_ssl_context(ssl_context); return NULL; } SSL_CTX_set_verify(ssl_context, SSL_VERIFY_PEER, NULL); } if (options.dh_params_file_name) { /* Set up ephemeral DH parameters. */ DH *dh_2048 = NULL; FILE *paramfile; paramfile = fopen(options.dh_params_file_name, "r"); if (paramfile) { dh_2048 = PEM_read_DHparams(paramfile, NULL, NULL, NULL); fclose(paramfile); } else { free_ssl_context(ssl_context); return NULL; } if (dh_2048 == NULL) { free_ssl_context(ssl_context); return NULL; } const long set_tmp_dh = SSL_CTX_set_tmp_dh(ssl_context, dh_2048); DH_free(dh_2048); if (set_tmp_dh != 1) { free_ssl_context(ssl_context); return NULL; } /* OWASP Cipher String 'A+' (https://www.owasp.org/index.php/TLS_Cipher_String_Cheat_Sheet) */ if (SSL_CTX_set_cipher_list(ssl_context, "DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256") != 1) { free_ssl_context(ssl_context); return NULL; } } /* This must be free'd with free_ssl_context, not SSL_CTX_free */ return ssl_context; } /* Todo: return error on failure? */ void us_internal_ssl_socket_context_add_server_name(struct us_internal_ssl_socket_context_t *context, const char *hostname_pattern, struct us_socket_context_options_t options) { /* Try and construct an SSL_CTX from options */ SSL_CTX *ssl_context = create_ssl_context_from_options(options); /* We do not want to hold any nullptr's in our SNI tree */ if (ssl_context) { if (sni_add(context->sni, hostname_pattern, ssl_context)) { /* If we already had that name, ignore */ free_ssl_context(ssl_context); } } } void us_internal_ssl_socket_context_on_server_name(struct us_internal_ssl_socket_context_t *context, void (*cb)(struct us_internal_ssl_socket_context_t *, const char *hostname)) { context->on_server_name = cb; } void us_internal_ssl_socket_context_remove_server_name(struct us_internal_ssl_socket_context_t *context, const char *hostname_pattern) { /* The same thing must happen for sni_free, that's why we have a callback */ SSL_CTX *sni_node_ssl_context = (SSL_CTX *) sni_remove(context->sni, hostname_pattern); free_ssl_context(sni_node_ssl_context); } /* Returns NULL or SSL_CTX. May call missing server name callback */ SSL_CTX *resolve_context(struct us_internal_ssl_socket_context_t *context, const char *hostname) { /* Try once first */ void *user = sni_find(context->sni, hostname); if (!user) { /* Emit missing hostname then try again */ if (!context->on_server_name) { /* We have no callback registered, so fail */ return NULL; } context->on_server_name(context, hostname); /* Last try */ user = sni_find(context->sni, hostname); } return user; } // arg is context int sni_cb(SSL *ssl, int *al, void *arg) { if (ssl) { const char *hostname = SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name); if (hostname && hostname[0]) { /* Try and resolve (match) required hostname with what we have registered */ SSL_CTX *resolved_ssl_context = resolve_context((struct us_internal_ssl_socket_context_t *) arg, hostname); if (resolved_ssl_context) { //printf("Did find matching SNI context for hostname: <%s>!\n", hostname); SSL_set_SSL_CTX(ssl, resolved_ssl_context); } else { /* Call a blocking callback notifying of missing context */ } } return SSL_TLSEXT_ERR_OK; } /* Can we even come here ever? */ return SSL_TLSEXT_ERR_NOACK; } struct us_internal_ssl_socket_context_t *us_internal_create_ssl_socket_context(struct us_loop_t *loop, int context_ext_size, struct us_socket_context_options_t options) { /* If we haven't initialized the loop data yet, do so . * This is needed because loop data holds shared OpenSSL data and * the function is also responsible for initializing OpenSSL */ us_internal_init_loop_ssl_data(loop); /* First of all we try and create the SSL context from options */ SSL_CTX *ssl_context = create_ssl_context_from_options(options); if (!ssl_context) { /* We simply fail early if we cannot even create the OpenSSL context */ return NULL; } /* Otherwise ee continue by creating a non-SSL context, but with larger ext to hold our SSL stuff */ struct us_internal_ssl_socket_context_t *context = (struct us_internal_ssl_socket_context_t *) us_create_socket_context(0, loop, sizeof(struct us_internal_ssl_socket_context_t) + context_ext_size, options); /* I guess this is the only optional callback */ context->on_server_name = NULL; /* Then we extend its SSL parts */ context->ssl_context = ssl_context;//create_ssl_context_from_options(options); context->is_parent = 1; /* We, as parent context, may ignore data */ context->sc.ignore_data = (int (*)(struct us_socket_t *)) ssl_ignore_data; /* Parent contexts may use SNI */ SSL_CTX_set_tlsext_servername_callback(context->ssl_context, sni_cb); SSL_CTX_set_tlsext_servername_arg(context->ssl_context, context); /* Also create the SNI tree */ context->sni = sni_new(); return context; } /* Our destructor for hostnames, used below */ void sni_hostname_destructor(void *user) { /* Some nodes hold null, so this one must ignore this case */ free_ssl_context((SSL_CTX *) user); } void us_internal_ssl_socket_context_free(struct us_internal_ssl_socket_context_t *context) { /* If we are parent then we need to free our OpenSSL context */ if (context->is_parent) { free_ssl_context(context->ssl_context); /* Here we need to register a temporary callback for all still-existing hostnames * and their contexts. Only parents have an SNI tree */ sni_free(context->sni, sni_hostname_destructor); } us_socket_context_free(0, &context->sc); } struct us_listen_socket_t *us_internal_ssl_socket_context_listen(struct us_internal_ssl_socket_context_t *context, const char *host, int port, int options, int socket_ext_size) { return us_socket_context_listen(0, &context->sc, host, port, options, sizeof(struct us_internal_ssl_socket_t) - sizeof(struct us_socket_t) + socket_ext_size); } struct us_internal_ssl_socket_t *us_internal_ssl_socket_context_connect(struct us_internal_ssl_socket_context_t *context, const char *host, int port, const char *source_host, int options, int socket_ext_size) { return (struct us_internal_ssl_socket_t *) us_socket_context_connect(0, &context->sc, host, port, source_host, options, sizeof(struct us_internal_ssl_socket_t) - sizeof(struct us_socket_t) + socket_ext_size); } void us_internal_ssl_socket_context_on_open(struct us_internal_ssl_socket_context_t *context, struct us_internal_ssl_socket_t *(*on_open)(struct us_internal_ssl_socket_t *s, int is_client, char *ip, int ip_length)) { us_socket_context_on_open(0, &context->sc, (struct us_socket_t *(*)(struct us_socket_t *, int, char *, int)) ssl_on_open); context->on_open = on_open; } void us_internal_ssl_socket_context_on_close(struct us_internal_ssl_socket_context_t *context, struct us_internal_ssl_socket_t *(*on_close)(struct us_internal_ssl_socket_t *s, int code, void *reason)) { us_socket_context_on_close(0, (struct us_socket_context_t *) context, (struct us_socket_t *(*)(struct us_socket_t *, int, void *)) ssl_on_close); context->on_close = on_close; } void us_internal_ssl_socket_context_on_data(struct us_internal_ssl_socket_context_t *context, struct us_internal_ssl_socket_t *(*on_data)(struct us_internal_ssl_socket_t *s, char *data, int length)) { us_socket_context_on_data(0, (struct us_socket_context_t *) context, (struct us_socket_t *(*)(struct us_socket_t *, char *, int)) ssl_on_data); context->on_data = on_data; } void us_internal_ssl_socket_context_on_writable(struct us_internal_ssl_socket_context_t *context, struct us_internal_ssl_socket_t *(*on_writable)(struct us_internal_ssl_socket_t *s)) { us_socket_context_on_writable(0, (struct us_socket_context_t *) context, (struct us_socket_t *(*)(struct us_socket_t *)) ssl_on_writable); context->on_writable = on_writable; } void us_internal_ssl_socket_context_on_timeout(struct us_internal_ssl_socket_context_t *context, struct us_internal_ssl_socket_t *(*on_timeout)(struct us_internal_ssl_socket_t *s)) { us_socket_context_on_timeout(0, (struct us_socket_context_t *) context, (struct us_socket_t *(*)(struct us_socket_t *)) on_timeout); } /* We do not really listen to passed FIN-handler, we entirely override it with our handler since SSL doesn't really have support for half-closed sockets */ void us_internal_ssl_socket_context_on_end(struct us_internal_ssl_socket_context_t *context, struct us_internal_ssl_socket_t *(*on_end)(struct us_internal_ssl_socket_t *)) { us_socket_context_on_end(0, (struct us_socket_context_t *) context, (struct us_socket_t *(*)(struct us_socket_t *)) ssl_on_end); } void us_internal_ssl_socket_context_on_connect_error(struct us_internal_ssl_socket_context_t *context, struct us_internal_ssl_socket_t *(*on_connect_error)(struct us_internal_ssl_socket_t *, int code)) { us_socket_context_on_connect_error(0, (struct us_socket_context_t *) context, (struct us_socket_t *(*)(struct us_socket_t *, int)) on_connect_error); } void *us_internal_ssl_socket_context_ext(struct us_internal_ssl_socket_context_t *context) { return context + 1; } /* Per socket functions */ void *us_internal_ssl_socket_get_native_handle(struct us_internal_ssl_socket_t *s) { return s->ssl; } int us_internal_ssl_socket_write(struct us_internal_ssl_socket_t *s, const char *data, int length, int msg_more) { if (us_socket_is_closed(0, &s->s) || us_internal_ssl_socket_is_shut_down(s)) { return 0; } struct us_internal_ssl_socket_context_t *context = (struct us_internal_ssl_socket_context_t *) us_socket_context(0, &s->s); struct us_loop_t *loop = us_socket_context_loop(0, &context->sc); struct loop_ssl_data *loop_ssl_data = (struct loop_ssl_data *) loop->data.ssl_data; // it makes literally no sense to touch this here! it should start at 0 and ONLY be set and reset by the on_data function! // the way is is now, triggering a write from a read will essentially delete all input data! // what we need to do is to check if this ever is non-zero and print a warning loop_ssl_data->ssl_read_input_length = 0; loop_ssl_data->ssl_socket = &s->s; loop_ssl_data->msg_more = msg_more; loop_ssl_data->last_write_was_msg_more = 0; //printf("Calling SSL_write\n"); int written = SSL_write(s->ssl, data, length); //printf("Returning from SSL_write\n"); loop_ssl_data->msg_more = 0; if (loop_ssl_data->last_write_was_msg_more && !msg_more) { us_socket_flush(0, &s->s); } if (written > 0) { return written; } else { int err = SSL_get_error(s->ssl, written); if (err == SSL_ERROR_WANT_READ) { // here we need to trigger writable event next ssl_read! s->ssl_write_wants_read = 1; } else if (err == SSL_ERROR_SSL || err == SSL_ERROR_SYSCALL) { // these two errors may add to the error queue, which is per thread and must be cleared ERR_clear_error(); // all errors here except for want write are critical and should not happen } return 0; } } void *us_internal_ssl_socket_ext(struct us_internal_ssl_socket_t *s) { return s + 1; } int us_internal_ssl_socket_is_shut_down(struct us_internal_ssl_socket_t *s) { return us_socket_is_shut_down(0, &s->s) || SSL_get_shutdown(s->ssl) & SSL_SENT_SHUTDOWN; } void us_internal_ssl_socket_shutdown(struct us_internal_ssl_socket_t *s) { if (!us_socket_is_closed(0, &s->s) && !us_internal_ssl_socket_is_shut_down(s)) { struct us_internal_ssl_socket_context_t *context = (struct us_internal_ssl_socket_context_t *) us_socket_context(0, &s->s); struct us_loop_t *loop = us_socket_context_loop(0, &context->sc); struct loop_ssl_data *loop_ssl_data = (struct loop_ssl_data *) loop->data.ssl_data; // also makes no sense to touch this here! // however the idea is that if THIS socket is not the same as ssl_socket then this data is not for me // but this is not correct as it is currently anyways, any data available should be properly reset loop_ssl_data->ssl_read_input_length = 0; // essentially we need two of these: one for CURRENT CALL and one for CURRENT SOCKET WITH DATA // if those match in the BIO function then you may read, if not then you may not read // we need ssl_read_socket to be set in on_data and checked in the BIO loop_ssl_data->ssl_socket = &s->s; loop_ssl_data->msg_more = 0; // sets SSL_SENT_SHUTDOWN no matter what (not actually true if error!) int ret = SSL_shutdown(s->ssl); if (ret == 0) { ret = SSL_shutdown(s->ssl); } if (ret < 0) { int err = SSL_get_error(s->ssl, ret); if (err == SSL_ERROR_SSL || err == SSL_ERROR_SYSCALL) { // clear ERR_clear_error(); } // we get here if we are shutting down while still in init us_socket_shutdown(0, &s->s); } } } struct us_internal_ssl_socket_t *us_internal_ssl_socket_context_adopt_socket(struct us_internal_ssl_socket_context_t *context, struct us_internal_ssl_socket_t *s, int ext_size) { // todo: this is completely untested return (struct us_internal_ssl_socket_t *) us_socket_context_adopt_socket(0, &context->sc, &s->s, sizeof(struct us_internal_ssl_socket_t) - sizeof(struct us_socket_t) + ext_size); } #endif ================================================ FILE: nerd_modules/http/httplib/uSockets/crypto/sni_tree.cpp ================================================ /* * Authored by Alex Hultman, 2018-2020. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* This Server Name Indication hostname tree is written in C++ but could be ported to C. * Overall it looks like crap, but has no memory allocations in fast path and is O(log n). */ #ifndef SNI_TREE_H #define SNI_TREE_H #ifndef LIBUS_NO_SSL #include #include #include #include #include #include /* We only handle a maximum of 10 labels per hostname */ #define MAX_LABELS 10 /* This cannot be shared */ thread_local void (*sni_free_cb)(void *); struct sni_node { /* Empty nodes must always hold null */ void *user = nullptr; std::map> children; ~sni_node() { for (auto &p : children) { /* The data of our string_views are managed by malloc */ free((void *) p.first.data()); /* Call destructor passed to sni_free only if we hold data. * This is important since sni_remove does not have sni_free_cb set */ if (p.second.get()->user) { sni_free_cb(p.second.get()->user); } } } }; // this can only delete ONE single node, but may cull "empty nodes with null as data" void *removeUser(struct sni_node *root, unsigned int label, std::string_view *labels, unsigned int numLabels) { /* If we are in the bottom (past bottom by one), there is nothing to remove */ if (label == numLabels) { void *user = root->user; /* Mark us for culling on the way up */ root->user = nullptr; return user; } /* Is this label a child of root? */ auto it = root->children.find(labels[label]); if (it == root->children.end()) { /* We cannot continue */ return nullptr; } void *removedUser = removeUser(it->second.get(), label + 1, labels, numLabels); /* On the way back up, we may cull empty nodes with no children. * This ends up being where we remove all nodes */ if (it->second.get()->children.empty() && it->second.get()->user == nullptr) { /* The data of our string_views are managed by malloc */ free((void *) it->first.data()); /* This can only happen with user set to null, otherwise we use sni_free_cb which is unset by sni_remove */ root->children.erase(it); } return removedUser; } void *getUser(struct sni_node *root, unsigned int label, std::string_view *labels, unsigned int numLabels) { /* Do we have labels to match? Otherwise, return where we stand */ if (label == numLabels) { return root->user; } /* Try and match by our label */ auto it = root->children.find(labels[label]); if (it != root->children.end()) { void *user = getUser(it->second.get(), label + 1, labels, numLabels); if (user) { return user; } } /* Try and match by wildcard */ it = root->children.find("*"); if (it == root->children.end()) { /* Matching has failed for both label and wildcard */ return nullptr; } /* We matched by wildcard */ return getUser(it->second.get(), label + 1, labels, numLabels); } extern "C" { void *sni_new() { return new sni_node; } void sni_free(void *sni, void (*cb)(void *)) { /* We want to run this callback for every remaining name */ sni_free_cb = cb; delete (sni_node *) sni; } /* Returns non-null if this name already exists */ int sni_add(void *sni, const char *hostname, void *user) { struct sni_node *root = (struct sni_node *) sni; /* Traverse all labels in hostname */ for (std::string_view view(hostname, strlen(hostname)), label; view.length(); view.remove_prefix(std::min(view.length(), label.length() + 1))) { /* Label is the token separated by dot */ label = view.substr(0, view.find('.', 0)); auto it = root->children.find(label); if (it == root->children.end()) { /* Duplicate this label for our kept string_view of it */ void *labelString = malloc(label.length()); memcpy(labelString, label.data(), label.length()); it = root->children.emplace(std::string_view((char *) labelString, label.length()), std::make_unique()).first; } root = it->second.get(); } /* We must never add multiple contexts for the same name, as that would overwrite and leak */ if (root->user) { return 1; } root->user = user; return 0; } /* Removes the exact match. Wildcards are treated as the verbatim asterisk char, not as an actual wildcard */ void *sni_remove(void *sni, const char *hostname) { struct sni_node *root = (struct sni_node *) sni; /* I guess 10 labels is an okay limit */ std::string_view labels[10]; unsigned int numLabels = 0; /* We traverse all labels first of all */ for (std::string_view view(hostname, strlen(hostname)), label; view.length(); view.remove_prefix(std::min(view.length(), label.length() + 1))) { /* Label is the token separated by dot */ label = view.substr(0, view.find('.', 0)); /* Anything longer than 10 labels is forbidden */ if (numLabels == 10) { return nullptr; } labels[numLabels++] = label; } return removeUser(root, 0, labels, numLabels); } void *sni_find(void *sni, const char *hostname) { struct sni_node *root = (struct sni_node *) sni; /* I guess 10 labels is an okay limit */ std::string_view labels[10]; unsigned int numLabels = 0; /* We traverse all labels first of all */ for (std::string_view view(hostname, strlen(hostname)), label; view.length(); view.remove_prefix(std::min(view.length(), label.length() + 1))) { /* Label is the token separated by dot */ label = view.substr(0, view.find('.', 0)); /* Anything longer than 10 labels is forbidden */ if (numLabels == 10) { return nullptr; } labels[numLabels++] = label; } return getUser(root, 0, labels, numLabels); } } #endif #endif ================================================ FILE: nerd_modules/http/httplib/uSockets/crypto/wolfssl.c ================================================ /* * Authored by Alex Hultman, 2018-2019. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifdef LIBUS_USE_WOLFSSL #include "libusockets.h" #include "internal/internal.h" /* This module contains the entire WolfSSL implementation * of the SSL socket and socket context interfaces. */ #include // shared somewhat #define OPENSSL_init_ssl(a, b) wolfSSL_Init() #define SSL_in_init(x) (!wolfSSL_is_init_finished(x)) /* We do not want to block the loop with tons and tons of CPU-intensive work. * Spread it out during many loop iterations, prioritizing already open connections, * they are far easier on CPU */ static const int MAX_HANDSHAKES_PER_LOOP_ITERATION = 5; struct loop_ssl_data { char *ssl_read_input, *ssl_read_output; unsigned int ssl_read_input_length; unsigned int ssl_read_input_offset; struct us_socket_t *ssl_socket; int last_write_was_msg_more; int msg_more; // these are used to throttle SSL handshakes per loop iteration long long last_iteration_nr; int handshake_budget; }; struct us_internal_ssl_socket_context_t { struct us_socket_context_t sc; // this thing can be shared with other socket contexts via socket transfer! // maybe instead of holding once you hold many, a vector or set // when a socket that belongs to another socket context transfers to a new socket context WOLFSSL_CTX *ssl_context; int is_parent; // här måste det vara! struct us_internal_ssl_socket_t *(*on_open)(struct us_internal_ssl_socket_t *, int is_client, char *ip, int ip_length); struct us_internal_ssl_socket_t *(*on_data)(struct us_internal_ssl_socket_t *, char *data, int length); struct us_internal_ssl_socket_t *(*on_close)(struct us_internal_ssl_socket_t *); }; // same here, should or shouldn't it contain s? struct us_internal_ssl_socket_t { struct us_socket_t s; WOLFSSL *ssl; int ssl_write_wants_read; // we use this for now }; int passphrase_cb(char *buf, int size, int rwflag, void *u) { const char *passphrase = (const char *) u; int passphrase_length = strlen(passphrase); memcpy(buf, passphrase, passphrase_length); // put null at end? no? return passphrase_length; } // should not be static!!! struct loop_ssl_data *loop_ssl_data; struct us_internal_ssl_socket_t *ssl_on_open(struct us_internal_ssl_socket_t *s, int is_client, char *ip, int ip_length) { struct us_internal_ssl_socket_context_t *context = (struct us_internal_ssl_socket_context_t *) us_socket_context(0, &s->s); struct us_loop_t *loop = us_socket_context_loop(0, &context->sc); loop_ssl_data = (struct loop_ssl_data *) loop->data.ssl_data; s->ssl = wolfSSL_new(context->ssl_context); s->ssl_write_wants_read = 0; // set loop_ssl_data to context if (is_client) { wolfSSL_set_connect_state(s->ssl); } else { wolfSSL_set_accept_state(s->ssl); } return (struct us_internal_ssl_socket_t *) context->on_open(s, is_client, ip, ip_length); } struct us_internal_ssl_socket_t *ssl_on_close(struct us_internal_ssl_socket_t *s) { struct us_internal_ssl_socket_context_t *context = (struct us_internal_ssl_socket_context_t *) us_socket_context(0, &s->s); wolfSSL_free(s->ssl); return context->on_close(s); } struct us_internal_ssl_socket_t *ssl_on_end(struct us_internal_ssl_socket_t *s) { //struct us_internal_ssl_socket_context_t *context = (struct us_internal_ssl_socket_context_t *) us_socket_context(0, &s->s); // whatever state we are in, a TCP FIN is always an answered shutdown return us_internal_ssl_socket_close(s); } // this whole function needs a complete clean-up struct us_internal_ssl_socket_t *ssl_on_data(struct us_internal_ssl_socket_t *s, void *data, int length) { // note: this context can change when we adopt the socket! struct us_internal_ssl_socket_context_t *context = (struct us_internal_ssl_socket_context_t *) us_socket_context(0, &s->s); struct us_loop_t *loop = us_socket_context_loop(0, &context->sc); struct loop_ssl_data *loop_ssl_data = (struct loop_ssl_data *) loop->data.ssl_data; // note: if we put data here we should never really clear it (not in write either, it still should be available for SSL_write to read from!) loop_ssl_data->ssl_read_input = data; loop_ssl_data->ssl_read_input_length = length; loop_ssl_data->ssl_read_input_offset = 0; loop_ssl_data->ssl_socket = &s->s; loop_ssl_data->msg_more = 0; if (us_internal_ssl_socket_is_shut_down(s)) { int ret; if ((ret = wolfSSL_shutdown(s->ssl)) == 1) { // two phase shutdown is complete here //printf("Two step SSL shutdown complete\n"); return us_internal_ssl_socket_close(s); } else if (ret < 0) { int err = wolfSSL_get_error(s->ssl, ret); if (err == SSL_ERROR_SSL || err == SSL_ERROR_SYSCALL) { // we need to clear the error queue in case these added to the thread local queue wolfSSL_ERR_clear_error(); } } // no further processing of data when in shutdown state return s; } // bug checking: this loop needs a lot of attention and clean-ups and check-ups int read = 0; restart: while (1) { int just_read = wolfSSL_read(s->ssl, loop_ssl_data->ssl_read_output + LIBUS_RECV_BUFFER_PADDING + read, LIBUS_RECV_BUFFER_LENGTH - read); if (just_read <= 0) { int err = wolfSSL_get_error(s->ssl, just_read); // as far as I know these are the only errors we want to handle if (err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE) { // clear per thread error queue if it may contain something if (err == SSL_ERROR_SSL || err == SSL_ERROR_SYSCALL) { wolfSSL_ERR_clear_error(); } // terminate connection here return us_internal_ssl_socket_close(s); } else { // emit the data we have and exit // assume we emptied the input buffer fully or error here as well! if (loop_ssl_data->ssl_read_input_length) { return us_internal_ssl_socket_close(s); } // cannot emit zero length to app if (!read) { break; } s = context->on_data(s, loop_ssl_data->ssl_read_output + LIBUS_RECV_BUFFER_PADDING, read); if (us_socket_is_closed(0, &s->s)) { return s; } break; } } read += just_read; // at this point we might be full and need to emit the data to application and start over if (read == LIBUS_RECV_BUFFER_LENGTH) { // emit data and restart s = context->on_data(s, loop_ssl_data->ssl_read_output + LIBUS_RECV_BUFFER_PADDING, read); if (us_socket_is_closed(0, &s->s)) { return s; } read = 0; goto restart; } } // trigger writable if we failed last write with want read if (s->ssl_write_wants_read) { s->ssl_write_wants_read = 0; // make sure to update context before we call (context can change if the user adopts the socket!) context = (struct us_internal_ssl_socket_context_t *) us_socket_context(0, &s->s); s = (struct us_internal_ssl_socket_t *) context->sc.on_writable(&s->s); // cast here! // if we are closed here, then exit if (us_socket_is_closed(0, &s->s)) { return s; } } // check this then? if (wolfSSL_get_shutdown(s->ssl) & SSL_RECEIVED_SHUTDOWN) { //printf("SSL_RECEIVED_SHUTDOWN\n"); //exit(-2); // not correct anyways! s = us_internal_ssl_socket_close(s); //us_ } return s; } /* Lazily inits loop ssl data first time */ void us_internal_init_loop_ssl_data(struct us_loop_t *loop) { if (!loop->data.ssl_data) { struct loop_ssl_data *loop_ssl_data = malloc(sizeof(struct loop_ssl_data)); loop_ssl_data->ssl_read_output = malloc(LIBUS_RECV_BUFFER_LENGTH + LIBUS_RECV_BUFFER_PADDING * 2); OPENSSL_init_ssl(0, NULL); // reset handshake budget (doesn't matter what loop nr we start on) loop_ssl_data->last_iteration_nr = 0; loop_ssl_data->handshake_budget = MAX_HANDSHAKES_PER_LOOP_ITERATION; loop->data.ssl_data = loop_ssl_data; } } /* Called by loop free, clears any loop ssl data */ void us_internal_free_loop_ssl_data(struct us_loop_t *loop) { struct loop_ssl_data *loop_ssl_data = (struct loop_ssl_data *) loop->data.ssl_data; if (loop_ssl_data) { free(loop_ssl_data->ssl_read_output); free(loop_ssl_data); } } // we ignore reading data for ssl sockets that are // in init state, if our so called budget for doing // so won't allow it. here we actually use // the kernel buffering to our advantage int ssl_ignore_data(struct us_internal_ssl_socket_t *s) { // fast path just checks for init if (!SSL_in_init(s->ssl)) { return 0; } // this path is run for all ssl sockets that are in init and just got data event from polling struct us_loop_t *loop = s->s.context->loop; struct loop_ssl_data *loop_ssl_data = loop->data.ssl_data; // reset handshake budget if new iteration if (loop_ssl_data->last_iteration_nr != us_loop_iteration_number(loop)) { loop_ssl_data->last_iteration_nr = us_loop_iteration_number(loop); loop_ssl_data->handshake_budget = MAX_HANDSHAKES_PER_LOOP_ITERATION; } if (loop_ssl_data->handshake_budget) { loop_ssl_data->handshake_budget--; return 0; } // ignore this data event return 1; } /* Per-context functions */ struct us_internal_ssl_socket_context_t *us_internal_create_child_ssl_socket_context(struct us_internal_ssl_socket_context_t *context, int context_ext_size) { struct us_socket_context_options_t options = {0}; struct us_internal_ssl_socket_context_t *child_context = (struct us_internal_ssl_socket_context_t *) us_create_socket_context(0, context->sc.loop, sizeof(struct us_internal_ssl_socket_context_t) + context_ext_size, options); // I think this is the only thing being shared child_context->ssl_context = context->ssl_context; child_context->is_parent = 0; return child_context; } int UserReceive(WOLFSSL *ssl, char *dst, int length, void *ctx) { //struct loop_ssl_data *loop_ssl_data = (struct loop_ssl_data *) BIO_get_data(bio); if (!loop_ssl_data->ssl_read_input_length) { return WOLFSSL_CBIO_ERR_WANT_READ; } if ((unsigned int) length > loop_ssl_data->ssl_read_input_length) { length = loop_ssl_data->ssl_read_input_length; } memcpy(dst, loop_ssl_data->ssl_read_input + loop_ssl_data->ssl_read_input_offset, length); loop_ssl_data->ssl_read_input_offset += length; loop_ssl_data->ssl_read_input_length -= length; //printf("returnerar längd läst i user receive: %d\n", length); return length; } int UserSend(WOLFSSL *ssl, char *src, int length, void *ctx) { //printf("UserSend\n"); loop_ssl_data->last_write_was_msg_more = loop_ssl_data->msg_more || length == 16413; int written = us_socket_write(0, loop_ssl_data->ssl_socket, src, length, loop_ssl_data->last_write_was_msg_more); if (!written) { return WOLFSSL_CBIO_ERR_WANT_WRITE; } return written; } struct us_internal_ssl_socket_context_t *us_internal_create_ssl_socket_context(struct us_loop_t *loop, int context_ext_size, struct us_socket_context_options_t options) { us_internal_init_loop_ssl_data(loop); struct us_socket_context_options_t no_options = {0}; struct us_internal_ssl_socket_context_t *context = (struct us_internal_ssl_socket_context_t *) us_create_socket_context(0, loop, sizeof(struct us_internal_ssl_socket_context_t) + context_ext_size, no_options); context->ssl_context = wolfSSL_CTX_new(wolfTLSv1_2_server_method()); context->is_parent = 1; // only parent ssl contexts may need to ignore data context->sc.ignore_data = (int (*)(struct us_socket_t *)) ssl_ignore_data; wolfSSL_CTX_SetIORecv(context->ssl_context, UserReceive); wolfSSL_CTX_SetIOSend(context->ssl_context, UserSend); // options wolfSSL_CTX_set_read_ahead(context->ssl_context, 1); wolfSSL_CTX_set_mode(context->ssl_context, WOLFSSL_MODE_ACCEPT_MOVING_WRITE_BUFFER); // this lowers performance a bit in benchmarks if (options.ssl_prefer_low_memory_usage) { //SSL_CTX_set_mode(context->ssl_context, SSL_MODE_RELEASE_BUFFERS); } // these are going to be extended if (options.passphrase) { wolfSSL_CTX_set_default_passwd_cb_userdata(context->ssl_context, (void *) options.passphrase); wolfSSL_CTX_set_default_passwd_cb(context->ssl_context, passphrase_cb); } if (options.cert_file_name) { if (wolfSSL_CTX_use_certificate_chain_file(context->ssl_context, options.cert_file_name) != 1) { return 0; } } if (options.key_file_name) { if (wolfSSL_CTX_use_PrivateKey_file(context->ssl_context, options.key_file_name, SSL_FILETYPE_PEM) != 1) { return 0; } } if (options.ca_file_name) { WOLFSSL_STACK *ca_list; ca_list = wolfSSL_load_client_CA_file(options.ca_file_name); if(ca_list == NULL) { return 0; } wolfSSL_CTX_set_client_CA_list(context->ssl_context, ca_list); if (wolfSSL_CTX_load_verify_locations(context->ssl_context, options.ca_file_name, NULL) != 1) { return 0; } wolfSSL_CTX_set_verify(context->ssl_context, SSL_VERIFY_PEER, NULL); } // saknar DH här return context; } void us_internal_ssl_socket_context_free(struct us_internal_ssl_socket_context_t *context) { if (context->is_parent) { wolfSSL_CTX_free(context->ssl_context); } us_socket_context_free(0, &context->sc); } struct us_listen_socket_t *us_internal_ssl_socket_context_listen(struct us_internal_ssl_socket_context_t *context, const char *host, int port, int options, int socket_ext_size) { return us_socket_context_listen(0, &context->sc, host, port, options, sizeof(struct us_internal_ssl_socket_t) - sizeof(struct us_socket_t) + socket_ext_size); } struct us_internal_ssl_socket_t *us_internal_ssl_socket_context_connect(struct us_internal_ssl_socket_context_t *context, const char *host, int port, const char *source_host, int options, int socket_ext_size) { return (struct us_internal_ssl_socket_t *) us_socket_context_connect(0, &context->sc, host, port, source_host, options, sizeof(struct us_internal_ssl_socket_t) - sizeof(struct us_socket_t) + socket_ext_size); } void us_internal_ssl_socket_context_on_open(struct us_internal_ssl_socket_context_t *context, struct us_internal_ssl_socket_t *(*on_open)(struct us_internal_ssl_socket_t *s, int is_client, char *ip, int ip_length)) { us_socket_context_on_open(0, &context->sc, (struct us_socket_t *(*)(struct us_socket_t *, int, char *, int)) ssl_on_open); context->on_open = on_open; } void us_internal_ssl_socket_context_on_close(struct us_internal_ssl_socket_context_t *context, struct us_internal_ssl_socket_t *(*on_close)(struct us_internal_ssl_socket_t *s)) { us_socket_context_on_close(0, (struct us_socket_context_t *) context, (struct us_socket_t *(*)(struct us_socket_t *)) ssl_on_close); context->on_close = on_close; } void us_internal_ssl_socket_context_on_data(struct us_internal_ssl_socket_context_t *context, struct us_internal_ssl_socket_t *(*on_data)(struct us_internal_ssl_socket_t *s, char *data, int length)) { us_socket_context_on_data(0, (struct us_socket_context_t *) context, (struct us_socket_t *(*)(struct us_socket_t *, char *, int)) ssl_on_data); context->on_data = on_data; } void us_internal_ssl_socket_context_on_writable(struct us_internal_ssl_socket_context_t *context, struct us_internal_ssl_socket_t *(*on_writable)(struct us_internal_ssl_socket_t *s)) { us_socket_context_on_writable(0, (struct us_socket_context_t *) context, (struct us_socket_t *(*)(struct us_socket_t *)) on_writable); } void us_internal_ssl_socket_context_on_timeout(struct us_internal_ssl_socket_context_t *context, struct us_internal_ssl_socket_t *(*on_timeout)(struct us_internal_ssl_socket_t *s)) { us_socket_context_on_timeout(0, (struct us_socket_context_t *) context, (struct us_socket_t *(*)(struct us_socket_t *)) on_timeout); } void us_internal_ssl_socket_context_on_end(struct us_internal_ssl_socket_context_t *context, struct us_internal_ssl_socket_t *(*on_end)(struct us_internal_ssl_socket_t *)) { us_socket_context_on_end(0, (struct us_socket_context_t *) context, (struct us_socket_t *(*)(struct us_socket_t *)) ssl_on_end); } void *us_internal_ssl_socket_context_ext(struct us_internal_ssl_socket_context_t *context) { return context + 1; } /* Per socket functions */ int us_internal_ssl_socket_write(struct us_internal_ssl_socket_t *s, const char *data, int length, int msg_more) { if (us_socket_is_closed(0, &s->s) || us_internal_ssl_socket_is_shut_down(s)) { return 0; } struct us_internal_ssl_socket_context_t *context = (struct us_internal_ssl_socket_context_t *) us_socket_context(0, &s->s); struct us_loop_t *loop = us_socket_context_loop(0, &context->sc); struct loop_ssl_data *loop_ssl_data = (struct loop_ssl_data *) loop->data.ssl_data; // it makes literally no sense to touch this here! it should start at 0 and ONLY be set and reset by the on_data function! // the way is is now, triggering a write from a read will essentially delete all input data! // what we need to do is to check if this ever is non-zero and print a warning loop_ssl_data->ssl_read_input_length = 0; loop_ssl_data->ssl_socket = &s->s; loop_ssl_data->msg_more = msg_more; loop_ssl_data->last_write_was_msg_more = 0; //printf("Calling SSL_write\n"); int written = wolfSSL_write(s->ssl, data, length); //printf("Returning from SSL_write\n"); loop_ssl_data->msg_more = 0; if (loop_ssl_data->last_write_was_msg_more && !msg_more) { us_socket_flush(0, &s->s); } if (written > 0) { return written; } else { int err = wolfSSL_get_error(s->ssl, written); if (err == SSL_ERROR_WANT_READ) { // here we need to trigger writable event next ssl_read! s->ssl_write_wants_read = 1; } else if (err == SSL_ERROR_SSL || err == SSL_ERROR_SYSCALL) { // these two errors may add to the error queue, which is per thread and must be cleared wolfSSL_ERR_clear_error(); // all errors here except for want write are critical and should not happen } return 0; } } void *us_internal_ssl_socket_ext(struct us_internal_ssl_socket_t *s) { return s + 1; } int us_internal_ssl_socket_is_shut_down(struct us_internal_ssl_socket_t *s) { return us_socket_is_shut_down(0, &s->s) || wolfSSL_get_shutdown(s->ssl) & SSL_SENT_SHUTDOWN; } void us_internal_ssl_socket_shutdown(struct us_internal_ssl_socket_t *s) { if (!us_socket_is_closed(0, &s->s) && !us_internal_ssl_socket_is_shut_down(s)) { struct us_internal_ssl_socket_context_t *context = (struct us_internal_ssl_socket_context_t *) us_socket_context(0, &s->s); struct us_loop_t *loop = us_socket_context_loop(0, &context->sc); struct loop_ssl_data *loop_ssl_data = (struct loop_ssl_data *) loop->data.ssl_data; // also makes no sense to touch this here! // however the idea is that if THIS socket is not the same as ssl_socket then this data is not for me // but this is not correct as it is currently anyways, any data available should be properly reset loop_ssl_data->ssl_read_input_length = 0; // essentially we need two of these: one for CURRENT CALL and one for CURRENT SOCKET WITH DATA // if those match in the BIO function then you may read, if not then you may not read // we need ssl_read_socket to be set in on_data and checked in the BIO loop_ssl_data->ssl_socket = &s->s; loop_ssl_data->msg_more = 0; // sets SSL_SENT_SHUTDOWN no matter what (not actually true if error!) int ret = wolfSSL_shutdown(s->ssl); if (ret == 0) { ret = wolfSSL_shutdown(s->ssl); } if (ret < 0) { int err = wolfSSL_get_error(s->ssl, ret); if (err == SSL_ERROR_SSL || err == SSL_ERROR_SYSCALL) { // clear wolfSSL_ERR_clear_error(); } // we get here if we are shutting down while still in init us_socket_shutdown(0, &s->s); } } } struct us_internal_ssl_socket_t *us_internal_ssl_socket_close(struct us_internal_ssl_socket_t *s) { return (struct us_internal_ssl_socket_t *) us_socket_close(0, (struct us_socket_t *) s); } struct us_internal_ssl_socket_t *us_internal_ssl_socket_context_adopt_socket(struct us_internal_ssl_socket_context_t *context, struct us_internal_ssl_socket_t *s, int ext_size) { // todo: this is completely untested return (struct us_internal_ssl_socket_t *) us_socket_context_adopt_socket(0, &context->sc, &s->s, sizeof(struct us_internal_ssl_socket_t) - sizeof(struct us_socket_t) + ext_size); } #endif ================================================ FILE: nerd_modules/http/httplib/uSockets/eventing/epoll_kqueue.c ================================================ /* * Authored by Alex Hultman, 2018-2019. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "libusockets.h" #include "internal/internal.h" #include #if defined(LIBUS_USE_EPOLL) || defined(LIBUS_USE_KQUEUE) /* Cannot include this one on Windows */ #include #ifdef LIBUS_USE_EPOLL #define GET_READY_POLL(loop, index) (struct us_poll_t *) loop->ready_polls[index].data.ptr #define SET_READY_POLL(loop, index, poll) loop->ready_polls[index].data.ptr = poll #else #define GET_READY_POLL(loop, index) (struct us_poll_t *) loop->ready_polls[index].udata #define SET_READY_POLL(loop, index, poll) loop->ready_polls[index].udata = poll #endif /* Loop */ void us_loop_free(struct us_loop_t *loop) { us_internal_loop_data_free(loop); close(loop->fd); free(loop); } /* Poll */ struct us_poll_t *us_create_poll(struct us_loop_t *loop, int fallthrough, unsigned int ext_size) { if (!fallthrough) { loop->num_polls++; } return malloc(sizeof(struct us_poll_t) + ext_size); } /* Todo: this one should be us_internal_poll_free */ void us_poll_free(struct us_poll_t *p, struct us_loop_t *loop) { loop->num_polls--; free(p); } void *us_poll_ext(struct us_poll_t *p) { return p + 1; } /* Todo: why have us_poll_create AND us_poll_init!? libuv legacy! */ void us_poll_init(struct us_poll_t *p, LIBUS_SOCKET_DESCRIPTOR fd, int poll_type) { p->state.fd = fd; p->state.poll_type = poll_type; } int us_poll_events(struct us_poll_t *p) { return ((p->state.poll_type & POLL_TYPE_POLLING_IN) ? LIBUS_SOCKET_READABLE : 0) | ((p->state.poll_type & POLL_TYPE_POLLING_OUT) ? LIBUS_SOCKET_WRITABLE : 0); } LIBUS_SOCKET_DESCRIPTOR us_poll_fd(struct us_poll_t *p) { return p->state.fd; } /* Returns any of listen socket, socket, shut down socket or callback */ int us_internal_poll_type(struct us_poll_t *p) { return p->state.poll_type & 3; } /* Bug: doesn't really SET, rather read and change, so needs to be inited first! */ void us_internal_poll_set_type(struct us_poll_t *p, int poll_type) { p->state.poll_type = poll_type | (p->state.poll_type & 12); } /* Timer */ void *us_timer_ext(struct us_timer_t *timer) { return ((struct us_internal_callback_t *) timer) + 1; } struct us_loop_t *us_timer_loop(struct us_timer_t *t) { struct us_internal_callback_t *internal_cb = (struct us_internal_callback_t *) t; return internal_cb->loop; } /* Loop */ struct us_loop_t *us_create_loop(void *hint, void (*wakeup_cb)(struct us_loop_t *loop), void (*pre_cb)(struct us_loop_t *loop), void (*post_cb)(struct us_loop_t *loop), unsigned int ext_size) { struct us_loop_t *loop = (struct us_loop_t *) malloc(sizeof(struct us_loop_t) + ext_size); loop->num_polls = 0; /* These could be accessed if we close a poll before starting the loop */ loop->num_ready_polls = 0; loop->current_ready_poll = 0; #ifdef LIBUS_USE_EPOLL loop->fd = epoll_create1(EPOLL_CLOEXEC); #else loop->fd = kqueue(); #endif us_internal_loop_data_init(loop, wakeup_cb, pre_cb, post_cb); return loop; } void us_loop_run(struct us_loop_t *loop) { us_loop_integrate(loop); /* While we have non-fallthrough polls we shouldn't fall through */ while (loop->num_polls) { /* Emit pre callback */ us_internal_loop_pre(loop); /* Fetch ready polls */ #ifdef LIBUS_USE_EPOLL loop->num_ready_polls = epoll_wait(loop->fd, loop->ready_polls, 1024, -1); #else loop->num_ready_polls = kevent(loop->fd, NULL, 0, loop->ready_polls, 1024, NULL); #endif /* Iterate ready polls, dispatching them by type */ for (loop->current_ready_poll = 0; loop->current_ready_poll < loop->num_ready_polls; loop->current_ready_poll++) { struct us_poll_t *poll = GET_READY_POLL(loop, loop->current_ready_poll); /* Any ready poll marked with nullptr will be ignored */ if (poll) { #ifdef LIBUS_USE_EPOLL int events = loop->ready_polls[loop->current_ready_poll].events; int error = loop->ready_polls[loop->current_ready_poll].events & (EPOLLERR | EPOLLHUP); #else /* EVFILT_READ, EVFILT_TIME, EVFILT_USER are all mapped to LIBUS_SOCKET_READABLE */ int events = LIBUS_SOCKET_READABLE; if (loop->ready_polls[loop->current_ready_poll].filter == EVFILT_WRITE) { events = LIBUS_SOCKET_WRITABLE; } int error = loop->ready_polls[loop->current_ready_poll].flags & (EV_ERROR | EV_EOF); #endif /* Always filter all polls by what they actually poll for (callback polls always poll for readable) */ events &= us_poll_events(poll); if (events || error) { us_internal_dispatch_ready_poll(poll, error, events); } } } /* Emit post callback */ us_internal_loop_post(loop); } } void us_internal_loop_update_pending_ready_polls(struct us_loop_t *loop, struct us_poll_t *old_poll, struct us_poll_t *new_poll, int old_events, int new_events) { #ifdef LIBUS_USE_EPOLL /* Epoll only has one ready poll per poll */ int num_entries_possibly_remaining = 1; #else /* Ready polls may contain same poll twice under kqueue, as one poll may hold two filters */ int num_entries_possibly_remaining = 2;//((old_events & LIBUS_SOCKET_READABLE) ? 1 : 0) + ((old_events & LIBUS_SOCKET_WRITABLE) ? 1 : 0); #endif /* Todo: for kqueue if we track things in us_change_poll it is possible to have a fast path with no seeking in cases of: * current poll being us AND we only poll for one thing */ for (int i = loop->current_ready_poll; i < loop->num_ready_polls && num_entries_possibly_remaining; i++) { if (GET_READY_POLL(loop, i) == old_poll) { // if new events does not contain the ready events of this poll then remove (no we filter that out later on) SET_READY_POLL(loop, i, new_poll); num_entries_possibly_remaining--; } } } /* Poll */ #ifdef LIBUS_USE_KQUEUE /* Helper function for setting or updating EVFILT_READ and EVFILT_WRITE */ int kqueue_change(int kqfd, int fd, int old_events, int new_events, void *user_data) { struct kevent change_list[2]; int change_length = 0; /* Do they differ in readable? */ if ((new_events & LIBUS_SOCKET_READABLE) != (old_events & LIBUS_SOCKET_READABLE)) { EV_SET(&change_list[change_length++], fd, EVFILT_READ, (new_events & LIBUS_SOCKET_READABLE) ? EV_ADD : EV_DELETE, 0, 0, user_data); } /* Do they differ in writable? */ if ((new_events & LIBUS_SOCKET_WRITABLE) != (old_events & LIBUS_SOCKET_WRITABLE)) { EV_SET(&change_list[change_length++], fd, EVFILT_WRITE, (new_events & LIBUS_SOCKET_WRITABLE) ? EV_ADD : EV_DELETE, 0, 0, user_data); } int ret = kevent(kqfd, change_list, change_length, NULL, 0, NULL); // ret should be 0 in most cases (not guaranteed when removing async) return ret; } #endif struct us_poll_t *us_poll_resize(struct us_poll_t *p, struct us_loop_t *loop, unsigned int ext_size) { int events = us_poll_events(p); struct us_poll_t *new_p = realloc(p, sizeof(struct us_poll_t) + ext_size); if (p != new_p && events) { #ifdef LIBUS_USE_EPOLL /* Hack: forcefully update poll by stripping away already set events */ new_p->state.poll_type = us_internal_poll_type(new_p); us_poll_change(new_p, loop, events); #else /* Forcefully update poll by resetting them with new_p as user data */ kqueue_change(loop->fd, new_p->state.fd, 0, events, new_p); #endif /* This is needed for epoll also (us_change_poll doesn't update the old poll) */ us_internal_loop_update_pending_ready_polls(loop, p, new_p, events, events); } return new_p; } void us_poll_start(struct us_poll_t *p, struct us_loop_t *loop, int events) { p->state.poll_type = us_internal_poll_type(p) | ((events & LIBUS_SOCKET_READABLE) ? POLL_TYPE_POLLING_IN : 0) | ((events & LIBUS_SOCKET_WRITABLE) ? POLL_TYPE_POLLING_OUT : 0); #ifdef LIBUS_USE_EPOLL struct epoll_event event; event.events = events; event.data.ptr = p; epoll_ctl(loop->fd, EPOLL_CTL_ADD, p->state.fd, &event); #else kqueue_change(loop->fd, p->state.fd, 0, events, p); #endif } void us_poll_change(struct us_poll_t *p, struct us_loop_t *loop, int events) { int old_events = us_poll_events(p); if (old_events != events) { p->state.poll_type = us_internal_poll_type(p) | ((events & LIBUS_SOCKET_READABLE) ? POLL_TYPE_POLLING_IN : 0) | ((events & LIBUS_SOCKET_WRITABLE) ? POLL_TYPE_POLLING_OUT : 0); #ifdef LIBUS_USE_EPOLL struct epoll_event event; event.events = events; event.data.ptr = p; epoll_ctl(loop->fd, EPOLL_CTL_MOD, p->state.fd, &event); #else kqueue_change(loop->fd, p->state.fd, old_events, events, p); #endif /* Set all removed events to null-polls in pending ready poll list */ //us_internal_loop_update_pending_ready_polls(loop, p, p, old_events, events); } } void us_poll_stop(struct us_poll_t *p, struct us_loop_t *loop) { int old_events = us_poll_events(p); int new_events = 0; #ifdef LIBUS_USE_EPOLL struct epoll_event event; epoll_ctl(loop->fd, EPOLL_CTL_DEL, p->state.fd, &event); #else if (old_events) { kqueue_change(loop->fd, p->state.fd, old_events, new_events, NULL); } #endif /* Disable any instance of us in the pending ready poll list */ us_internal_loop_update_pending_ready_polls(loop, p, 0, old_events, new_events); } unsigned int us_internal_accept_poll_event(struct us_poll_t *p) { #ifdef LIBUS_USE_EPOLL int fd = us_poll_fd(p); uint64_t buf; int read_length = read(fd, &buf, 8); (void)read_length; return buf; #else /* Kqueue has no underlying FD for timers or user events */ return 0; #endif } /* Timer */ #ifdef LIBUS_USE_EPOLL struct us_timer_t *us_create_timer(struct us_loop_t *loop, int fallthrough, unsigned int ext_size) { struct us_poll_t *p = us_create_poll(loop, fallthrough, sizeof(struct us_internal_callback_t) + ext_size); us_poll_init(p, timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK | TFD_CLOEXEC), POLL_TYPE_CALLBACK); struct us_internal_callback_t *cb = (struct us_internal_callback_t *) p; cb->loop = loop; cb->cb_expects_the_loop = 0; return (struct us_timer_t *) cb; } #else struct us_timer_t *us_create_timer(struct us_loop_t *loop, int fallthrough, unsigned int ext_size) { struct us_internal_callback_t *cb = malloc(sizeof(struct us_internal_callback_t) + ext_size); cb->loop = loop; cb->cb_expects_the_loop = 0; /* Bug: us_internal_poll_set_type does not SET the type, it only CHANGES it */ cb->p.state.poll_type = POLL_TYPE_POLLING_IN; us_internal_poll_set_type((struct us_poll_t *) cb, POLL_TYPE_CALLBACK); if (!fallthrough) { loop->num_polls++; } return (struct us_timer_t *) cb; } #endif #ifdef LIBUS_USE_EPOLL void us_timer_close(struct us_timer_t *timer) { struct us_internal_callback_t *cb = (struct us_internal_callback_t *) timer; us_poll_stop(&cb->p, cb->loop); close(us_poll_fd(&cb->p)); /* (regular) sockets are the only polls which are not freed immediately */ us_poll_free((struct us_poll_t *) timer, cb->loop); } void us_timer_set(struct us_timer_t *t, void (*cb)(struct us_timer_t *t), int ms, int repeat_ms) { struct us_internal_callback_t *internal_cb = (struct us_internal_callback_t *) t; internal_cb->cb = (void (*)(struct us_internal_callback_t *)) cb; struct itimerspec timer_spec = { {repeat_ms / 1000, (long) (repeat_ms % 1000) * (long) 1000000}, {ms / 1000, (long) (ms % 1000) * (long) 1000000} }; timerfd_settime(us_poll_fd((struct us_poll_t *) t), 0, &timer_spec, NULL); us_poll_start((struct us_poll_t *) t, internal_cb->loop, LIBUS_SOCKET_READABLE); } #else void us_timer_close(struct us_timer_t *timer) { struct us_internal_callback_t *internal_cb = (struct us_internal_callback_t *) timer; struct kevent event; EV_SET(&event, (uintptr_t) internal_cb, EVFILT_TIMER, EV_DELETE, 0, 0, internal_cb); kevent(internal_cb->loop->fd, &event, 1, NULL, 0, NULL); /* (regular) sockets are the only polls which are not freed immediately */ us_poll_free((struct us_poll_t *) timer, internal_cb->loop); } void us_timer_set(struct us_timer_t *t, void (*cb)(struct us_timer_t *t), int ms, int repeat_ms) { struct us_internal_callback_t *internal_cb = (struct us_internal_callback_t *) t; internal_cb->cb = (void (*)(struct us_internal_callback_t *)) cb; /* Bug: repeat_ms must be the same as ms, or 0 */ struct kevent event; EV_SET(&event, (uintptr_t) internal_cb, EVFILT_TIMER, EV_ADD | (repeat_ms ? 0 : EV_ONESHOT), 0, ms, internal_cb); kevent(internal_cb->loop->fd, &event, 1, NULL, 0, NULL); } #endif /* Async (internal helper for loop's wakeup feature) */ #ifdef LIBUS_USE_EPOLL struct us_internal_async *us_internal_create_async(struct us_loop_t *loop, int fallthrough, unsigned int ext_size) { struct us_poll_t *p = us_create_poll(loop, fallthrough, sizeof(struct us_internal_callback_t) + ext_size); us_poll_init(p, eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC), POLL_TYPE_CALLBACK); struct us_internal_callback_t *cb = (struct us_internal_callback_t *) p; cb->loop = loop; cb->cb_expects_the_loop = 1; return (struct us_internal_async *) cb; } // identical code as for timer, make it shared for "callback types" void us_internal_async_close(struct us_internal_async *a) { struct us_internal_callback_t *cb = (struct us_internal_callback_t *) a; us_poll_stop(&cb->p, cb->loop); close(us_poll_fd(&cb->p)); /* (regular) sockets are the only polls which are not freed immediately */ us_poll_free((struct us_poll_t *) a, cb->loop); } void us_internal_async_set(struct us_internal_async *a, void (*cb)(struct us_internal_async *)) { struct us_internal_callback_t *internal_cb = (struct us_internal_callback_t *) a; internal_cb->cb = (void (*)(struct us_internal_callback_t *)) cb; us_poll_start((struct us_poll_t *) a, internal_cb->loop, LIBUS_SOCKET_READABLE); } void us_internal_async_wakeup(struct us_internal_async *a) { uint64_t one = 1; int written = write(us_poll_fd((struct us_poll_t *) a), &one, 8); (void)written; } #else struct us_internal_async *us_internal_create_async(struct us_loop_t *loop, int fallthrough, unsigned int ext_size) { struct us_internal_callback_t *cb = malloc(sizeof(struct us_internal_callback_t) + ext_size); cb->loop = loop; cb->cb_expects_the_loop = 1; /* Bug: us_internal_poll_set_type does not SET the type, it only CHANGES it */ cb->p.state.poll_type = POLL_TYPE_POLLING_IN; us_internal_poll_set_type((struct us_poll_t *) cb, POLL_TYPE_CALLBACK); if (!fallthrough) { loop->num_polls++; } return (struct us_internal_async *) cb; } // identical code as for timer, make it shared for "callback types" void us_internal_async_close(struct us_internal_async *a) { struct us_internal_callback_t *internal_cb = (struct us_internal_callback_t *) a; /* Note: This will fail most of the time as there probably is no pending trigger */ struct kevent event; EV_SET(&event, (uintptr_t) internal_cb, EVFILT_USER, EV_DELETE, 0, 0, internal_cb); kevent(internal_cb->loop->fd, &event, 1, NULL, 0, NULL); /* (regular) sockets are the only polls which are not freed immediately */ us_poll_free((struct us_poll_t *) a, internal_cb->loop); } void us_internal_async_set(struct us_internal_async *a, void (*cb)(struct us_internal_async *)) { struct us_internal_callback_t *internal_cb = (struct us_internal_callback_t *) a; internal_cb->cb = (void (*)(struct us_internal_callback_t *)) cb; } void us_internal_async_wakeup(struct us_internal_async *a) { struct us_internal_callback_t *internal_cb = (struct us_internal_callback_t *) a; /* In kqueue you really only need to add a triggered oneshot event */ struct kevent event; EV_SET(&event, (uintptr_t) internal_cb, EVFILT_USER, EV_ADD | EV_ONESHOT, NOTE_TRIGGER, 0, internal_cb); kevent(internal_cb->loop->fd, &event, 1, NULL, 0, NULL); } #endif #endif ================================================ FILE: nerd_modules/http/httplib/uSockets/eventing/gcd.c ================================================ /* * Authored by Alex Hultman, 2018-2019. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "libusockets.h" #include "internal/internal.h" #include #ifdef LIBUS_USE_GCD /* Loops */ struct us_loop_t *us_create_loop(void *hint, void (*wakeup_cb)(struct us_loop_t *loop), void (*pre_cb)(struct us_loop_t *loop), void (*post_cb)(struct us_loop_t *loop), unsigned int ext_size) { struct us_loop_t *loop = (struct us_loop_t *) malloc(sizeof(struct us_loop_t) + ext_size); // init the queue from hint us_internal_loop_data_init(loop, wakeup_cb, pre_cb, post_cb); // why not call integrate here? instead of in run return loop; } void us_loop_free(struct us_loop_t *loop) { us_internal_loop_data_free(loop); // free queue if different from main free(loop); } /* We don't actually need to include CoreFoundation as we only need one single function, * It will be up to the user to link to CoreFoundation, however that should be automatic in most use cases */ extern void CFRunLoopRun(); void us_loop_run(struct us_loop_t *loop) { us_loop_integrate(loop); /* We are absolutely not compatible with dispatch_main, * However every real application should run with CoreFoundation, * Foundation or Cocoa as the main loop, driving dispatch anyways */ CFRunLoopRun(); /* I guess "fallthrough" polls should be added to another run mode than the default one to fall through */ } void gcd_read_handler(void *p) { us_internal_dispatch_ready_poll((struct us_poll_t *) p, 0, LIBUS_SOCKET_READABLE); } void gcd_write_handler(void *p) { us_internal_dispatch_ready_poll((struct us_poll_t *) p, 0, LIBUS_SOCKET_WRITABLE); } /* Polls */ void us_poll_init(struct us_poll_t *p, LIBUS_SOCKET_DESCRIPTOR fd, int poll_type) { p->poll_type = poll_type; p->fd = fd; /* I guess these are already activated? */ p->gcd_read = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, p->fd, 0, dispatch_get_main_queue()); dispatch_set_context(p->gcd_read, p); dispatch_source_set_event_handler_f(p->gcd_read, gcd_read_handler); dispatch_source_set_cancel_handler_f(p->gcd_read, gcd_read_handler); p->gcd_write = dispatch_source_create(DISPATCH_SOURCE_TYPE_WRITE, p->fd, 0, dispatch_get_main_queue()); dispatch_set_context(p->gcd_write, p); dispatch_source_set_event_handler_f(p->gcd_write, gcd_write_handler); dispatch_source_set_cancel_handler_f(p->gcd_write, gcd_write_handler); } void us_poll_free(struct us_poll_t *p, struct us_loop_t *loop) { /* It is program error to release suspended filters */ us_poll_change(p, loop, LIBUS_SOCKET_READABLE | LIBUS_SOCKET_WRITABLE); dispatch_release(p->gcd_read); dispatch_release(p->gcd_write); free(p); } void us_poll_start(struct us_poll_t *p, struct us_loop_t *loop, int events) { p->events = events; if (events & LIBUS_SOCKET_READABLE) { dispatch_resume(p->gcd_read); } if (events & LIBUS_SOCKET_WRITABLE) { dispatch_resume(p->gcd_write); } } void us_poll_change(struct us_poll_t *p, struct us_loop_t *loop, int events) { int old_events = p->events; if ((old_events & LIBUS_SOCKET_READABLE) != (events & LIBUS_SOCKET_READABLE)) { if (old_events & LIBUS_SOCKET_READABLE) { dispatch_suspend(p->gcd_read); } else { dispatch_resume(p->gcd_read); } } if ((old_events & LIBUS_SOCKET_WRITABLE) != (events & LIBUS_SOCKET_WRITABLE)) { if (old_events & LIBUS_SOCKET_WRITABLE) { dispatch_suspend(p->gcd_write); } else { dispatch_resume(p->gcd_write); } } p->events = events; } void us_poll_stop(struct us_poll_t *p, struct us_loop_t *loop) { if (p->events & LIBUS_SOCKET_READABLE) { dispatch_suspend(p->gcd_read); } if (p->events & LIBUS_SOCKET_WRITABLE) { dispatch_suspend(p->gcd_write); } p->events = 0; } int us_poll_events(struct us_poll_t *p) { return p->events; } void *us_poll_ext(struct us_poll_t *p) { return p + 1; } unsigned int us_internal_accept_poll_event(struct us_poll_t *p) { //printf("us_internal_accept_poll_event\n"); return 0; } int us_internal_poll_type(struct us_poll_t *p) { return p->poll_type & 3; } void us_internal_poll_set_type(struct us_poll_t *p, int poll_type) { p->poll_type = poll_type; } LIBUS_SOCKET_DESCRIPTOR us_poll_fd(struct us_poll_t *p) { return p->fd; } struct us_poll_t *us_create_poll(struct us_loop_t *loop, int fallthrough, unsigned int ext_size) { struct us_poll_t *poll = (struct us_poll_t *) malloc(sizeof(struct us_poll_t) + ext_size); return poll; } struct us_poll_t *us_poll_resize(struct us_poll_t *p, struct us_loop_t *loop, unsigned int ext_size) { int events = us_poll_events(p); struct us_poll_t *new_p = realloc(p, sizeof(struct us_poll_t) + ext_size + 1024); if (p != new_p) { /* It is a program error to release suspended filters */ us_poll_change(new_p, loop, LIBUS_SOCKET_READABLE | LIBUS_SOCKET_WRITABLE); dispatch_release(new_p->gcd_read); dispatch_release(new_p->gcd_write); /* Create and start new filters */ us_poll_init(new_p, us_poll_fd(new_p), us_internal_poll_type(new_p)); us_poll_start(new_p, loop, events); } return new_p; } /* Timers */ void gcd_timer_handler(void *t) { struct us_internal_callback_t *internal_cb = (struct us_internal_callback_t *) t; internal_cb->cb(t); } struct us_timer_t *us_create_timer(struct us_loop_t *loop, int fallthrough, unsigned int ext_size) { struct us_internal_callback_t *cb = malloc(sizeof(struct us_internal_callback_t) + sizeof(dispatch_source_t) + ext_size); cb->loop = loop; cb->cb_expects_the_loop = 0; dispatch_source_t *gcd_timer = (dispatch_source_t *) (cb + 1); *gcd_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue()); dispatch_source_set_event_handler_f(*gcd_timer, gcd_timer_handler); dispatch_set_context(*gcd_timer, cb); if (fallthrough) { //uv_unref((uv_handle_t *) uv_timer); } return (struct us_timer_t *) cb; } void *us_timer_ext(struct us_timer_t *timer) { struct us_internal_callback_t *cb = (struct us_internal_callback_t *) timer; return (cb + 1); } void us_timer_close(struct us_timer_t *t) { } void us_timer_set(struct us_timer_t *t, void (*cb)(struct us_timer_t *t), int ms, int repeat_ms) { struct us_internal_callback_t *internal_cb = (struct us_internal_callback_t *) t; internal_cb->cb = (void(*)(struct us_internal_callback_t *)) cb; dispatch_source_t *gcd_timer = (dispatch_source_t *) (internal_cb + 1); uint64_t nanos = (uint64_t)ms * 1000000; dispatch_source_set_timer(*gcd_timer, 0, nanos, 0); dispatch_activate(*gcd_timer); } struct us_loop_t *us_timer_loop(struct us_timer_t *t) { struct us_internal_callback_t *internal_cb = (struct us_internal_callback_t *) t; return internal_cb->loop; } /* Asyncs */ void async_handler(void *c) { struct us_internal_callback_t *internal_cb = (struct us_internal_callback_t *) c; internal_cb->cb((struct us_internal_callback_t *) internal_cb->loop); } struct us_internal_async *us_internal_create_async(struct us_loop_t *loop, int fallthrough, unsigned int ext_size) { struct us_internal_callback_t *cb = malloc(sizeof(struct us_internal_callback_t) + ext_size); cb->loop = loop; cb->cb_expects_the_loop = 1; if (fallthrough) { //uv_unref((uv_handle_t *) uv_timer); } return (struct us_internal_async *) cb; } void us_internal_async_close(struct us_internal_async *a) { // cancel? free? } void us_internal_async_set(struct us_internal_async *a, void (*cb)(struct us_internal_async *)) { struct us_internal_callback_t *internal_cb = (struct us_internal_callback_t *) a; internal_cb->cb = (void (*)(struct us_internal_callback_t *)) cb; } void us_internal_async_wakeup(struct us_internal_async *a) { // will probably need to track in-flight work item and cancel in close dispatch_async_f(dispatch_get_main_queue(), a, async_handler); } #endif ================================================ FILE: nerd_modules/http/httplib/uSockets/eventing/libuv.c ================================================ /* * Authored by Alex Hultman, 2018-2021. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "libusockets.h" #include "internal/internal.h" #include #ifdef LIBUS_USE_LIBUV /* uv_poll_t->data always (except for most times after calling us_poll_stop) points to the us_poll_t */ static void poll_cb(uv_poll_t *p, int status, int events) { us_internal_dispatch_ready_poll((struct us_poll_t *) p->data, status < 0, events); } static void prepare_cb(uv_prepare_t *p) { struct us_loop_t *loop = p->data; us_internal_loop_pre(loop); } /* Note: libuv timers execute AFTER the post callback */ static void check_cb(uv_check_t *p) { struct us_loop_t *loop = p->data; us_internal_loop_post(loop); } /* Not used for polls, since polls need two frees */ static void close_cb_free(uv_handle_t *h) { free(h->data); } /* This one is different for polls, since we need two frees here */ static void close_cb_free_poll(uv_handle_t *h) { /* It is only in case we called us_poll_stop then quickly us_poll_free that we enter this. * Most of the time, actual freeing is done by us_poll_free. */ if (h->data) { free(h->data); free(h); } } static void timer_cb(uv_timer_t *t) { struct us_internal_callback_t *cb = t->data; cb->cb(cb); } static void async_cb(uv_async_t *a) { struct us_internal_callback_t *cb = a->data; // internal asyncs give their loop, not themselves cb->cb((struct us_internal_callback_t *) cb->loop); } // poll void us_poll_init(struct us_poll_t *p, LIBUS_SOCKET_DESCRIPTOR fd, int poll_type) { p->poll_type = poll_type; p->fd = fd; } void us_poll_free(struct us_poll_t *p, struct us_loop_t *loop) { /* The idea here is like so; in us_poll_stop we call uv_close after setting data of uv-poll to 0. * This means that in close_cb_free we call free on 0 with does nothing, since us_poll_stop should * not really free the poll. HOWEVER, if we then call us_poll_free while still closing the uv-poll, * we simply change back the data to point to our structure so that we actually do free it like we should. */ if (uv_is_closing((uv_handle_t *) p->uv_p)) { p->uv_p->data = p; } else { free(p->uv_p); free(p); } } void us_poll_start(struct us_poll_t *p, struct us_loop_t *loop, int events) { p->poll_type = us_internal_poll_type(p) | ((events & LIBUS_SOCKET_READABLE) ? POLL_TYPE_POLLING_IN : 0) | ((events & LIBUS_SOCKET_WRITABLE) ? POLL_TYPE_POLLING_OUT : 0); uv_poll_init_socket(loop->uv_loop, p->uv_p, p->fd); uv_poll_start(p->uv_p, events, poll_cb); } void us_poll_change(struct us_poll_t *p, struct us_loop_t *loop, int events) { if (us_poll_events(p) != events) { p->poll_type = us_internal_poll_type(p) | ((events & LIBUS_SOCKET_READABLE) ? POLL_TYPE_POLLING_IN : 0) | ((events & LIBUS_SOCKET_WRITABLE) ? POLL_TYPE_POLLING_OUT : 0); uv_poll_start(p->uv_p, events, poll_cb); } } void us_poll_stop(struct us_poll_t *p, struct us_loop_t *loop) { uv_poll_stop(p->uv_p); /* We normally only want to close the poll here, not free it. But if we stop it, then quickly "free" it with * us_poll_free, we postpone the actual freeing to close_cb_free_poll whenever it triggers. * That's why we set data to null here, so that us_poll_free can reset it if needed */ p->uv_p->data = 0; uv_close((uv_handle_t *) p->uv_p, close_cb_free_poll); } int us_poll_events(struct us_poll_t *p) { return ((p->poll_type & POLL_TYPE_POLLING_IN) ? LIBUS_SOCKET_READABLE : 0) | ((p->poll_type & POLL_TYPE_POLLING_OUT) ? LIBUS_SOCKET_WRITABLE : 0); } unsigned int us_internal_accept_poll_event(struct us_poll_t *p) { return 0; } int us_internal_poll_type(struct us_poll_t *p) { return p->poll_type & 3; } void us_internal_poll_set_type(struct us_poll_t *p, int poll_type) { p->poll_type = poll_type | (p->poll_type & 12); } LIBUS_SOCKET_DESCRIPTOR us_poll_fd(struct us_poll_t *p) { return p->fd; } struct us_loop_t *us_create_loop(void *hint, void (*wakeup_cb)(struct us_loop_t *loop), void (*pre_cb)(struct us_loop_t *loop), void (*post_cb)(struct us_loop_t *loop), unsigned int ext_size) { struct us_loop_t *loop = (struct us_loop_t *) malloc(sizeof(struct us_loop_t) + ext_size); loop->uv_loop = hint ? hint : uv_loop_new(); loop->is_default = hint != 0; loop->uv_pre = malloc(sizeof(uv_prepare_t)); uv_prepare_init(loop->uv_loop, loop->uv_pre); uv_prepare_start(loop->uv_pre, prepare_cb); uv_unref((uv_handle_t *) loop->uv_pre); loop->uv_pre->data = loop; loop->uv_check = malloc(sizeof(uv_check_t)); uv_check_init(loop->uv_loop, loop->uv_check); uv_unref((uv_handle_t *) loop->uv_check); uv_check_start(loop->uv_check, check_cb); loop->uv_check->data = loop; // here we create two unreffed handles - timer and async us_internal_loop_data_init(loop, wakeup_cb, pre_cb, post_cb); // if we do not own this loop, we need to integrate and set up timer if (hint) { us_loop_integrate(loop); } return loop; } // based on if this was default loop or not void us_loop_free(struct us_loop_t *loop) { // ref and close down prepare and check uv_ref((uv_handle_t *) loop->uv_pre); uv_prepare_stop(loop->uv_pre); loop->uv_pre->data = loop->uv_pre; uv_close((uv_handle_t *) loop->uv_pre, close_cb_free); uv_ref((uv_handle_t *) loop->uv_check); uv_check_stop(loop->uv_check); loop->uv_check->data = loop->uv_check; uv_close((uv_handle_t *) loop->uv_check, close_cb_free); us_internal_loop_data_free(loop); // we need to run the loop one last round to call all close callbacks // we cannot do this if we do not own the loop, default if (!loop->is_default) { uv_run(loop->uv_loop, UV_RUN_NOWAIT); uv_loop_delete(loop->uv_loop); } // now we can free our part free(loop); } void us_loop_run(struct us_loop_t *loop) { us_loop_integrate(loop); uv_run(loop->uv_loop, UV_RUN_DEFAULT); } struct us_poll_t *us_create_poll(struct us_loop_t *loop, int fallthrough, unsigned int ext_size) { struct us_poll_t *p = (struct us_poll_t *) malloc(sizeof(struct us_poll_t) + ext_size); p->uv_p = malloc(sizeof(uv_poll_t)); p->uv_p->data = p; return p; } /* If we update our block position we have to updarte the uv_poll data to point to us */ struct us_poll_t *us_poll_resize(struct us_poll_t *p, struct us_loop_t *loop, unsigned int ext_size) { struct us_poll_t *new_p = realloc(p, sizeof(struct us_poll_t) + ext_size); new_p->uv_p->data = new_p; return new_p; } // timer struct us_timer_t *us_create_timer(struct us_loop_t *loop, int fallthrough, unsigned int ext_size) { struct us_internal_callback_t *cb = malloc(sizeof(struct us_internal_callback_t) + sizeof(uv_timer_t) + ext_size); cb->loop = loop; cb->cb_expects_the_loop = 0; uv_timer_t *uv_timer = (uv_timer_t *) (cb + 1); uv_timer_init(loop->uv_loop, uv_timer); uv_timer->data = cb; if (fallthrough) { uv_unref((uv_handle_t *) uv_timer); } return (struct us_timer_t *) cb; } void *us_timer_ext(struct us_timer_t *timer) { return ((char *) timer) + sizeof(struct us_internal_callback_t) + sizeof(uv_timer_t); } void us_timer_close(struct us_timer_t *t) { struct us_internal_callback_t *cb = (struct us_internal_callback_t *) t; uv_timer_t *uv_timer = (uv_timer_t *) (cb + 1); // always ref the timer before closing it uv_ref((uv_handle_t *) uv_timer); uv_timer_stop(uv_timer); uv_timer->data = cb; uv_close((uv_handle_t *) uv_timer, close_cb_free); } void us_timer_set(struct us_timer_t *t, void (*cb)(struct us_timer_t *t), int ms, int repeat_ms) { struct us_internal_callback_t *internal_cb = (struct us_internal_callback_t *) t; internal_cb->cb = (void(*)(struct us_internal_callback_t *)) cb; uv_timer_t *uv_timer = (uv_timer_t *) (internal_cb + 1); if (!ms) { uv_timer_stop(uv_timer); } else { uv_timer_start(uv_timer, timer_cb, ms, repeat_ms); } } struct us_loop_t *us_timer_loop(struct us_timer_t *t) { struct us_internal_callback_t *internal_cb = (struct us_internal_callback_t *) t; return internal_cb->loop; } // async (internal only) struct us_internal_async *us_internal_create_async(struct us_loop_t *loop, int fallthrough, unsigned int ext_size) { struct us_internal_callback_t *cb = malloc(sizeof(struct us_internal_callback_t) + sizeof(uv_async_t) + ext_size); cb->loop = loop; return (struct us_internal_async *) cb; } void us_internal_async_close(struct us_internal_async *a) { struct us_internal_callback_t *cb = (struct us_internal_callback_t *) a; uv_async_t *uv_async = (uv_async_t *) (cb + 1); // always ref the async before closing it uv_ref((uv_handle_t *) uv_async); uv_async->data = cb; uv_close((uv_handle_t *) uv_async, close_cb_free); } void us_internal_async_set(struct us_internal_async *a, void (*cb)(struct us_internal_async *)) { struct us_internal_callback_t *internal_cb = (struct us_internal_callback_t *) a; internal_cb->cb = (void (*)(struct us_internal_callback_t *)) cb; uv_async_t *uv_async = (uv_async_t *) (internal_cb + 1); uv_async_init(internal_cb->loop->uv_loop, uv_async, async_cb); uv_unref((uv_handle_t *) uv_async); uv_async->data = internal_cb; } void us_internal_async_wakeup(struct us_internal_async *a) { struct us_internal_callback_t *internal_cb = (struct us_internal_callback_t *) a; uv_async_t *uv_async = (uv_async_t *) (internal_cb + 1); uv_async_send(uv_async); } #endif ================================================ FILE: nerd_modules/http/httplib/uSockets/internal/eventing/epoll_kqueue.h ================================================ /* * Authored by Alex Hultman, 2018-2019. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef EPOLL_KQUEUE_H #define EPOLL_KQUEUE_H #include "internal/loop_data.h" #ifdef LIBUS_USE_EPOLL #include #include #include #define LIBUS_SOCKET_READABLE EPOLLIN #define LIBUS_SOCKET_WRITABLE EPOLLOUT #else #include /* Kqueue's EVFILT_ is NOT a bitfield, you cannot OR together them. * We therefore have our own bitfield we then translate in every call */ #define LIBUS_SOCKET_READABLE 1 #define LIBUS_SOCKET_WRITABLE 2 #endif struct us_loop_t { alignas(LIBUS_EXT_ALIGNMENT) struct us_internal_loop_data_t data; /* Number of non-fallthrough polls in the loop */ int num_polls; /* Number of ready polls this iteration */ int num_ready_polls; /* Current index in list of ready polls */ int current_ready_poll; /* Loop's own file descriptor */ int fd; /* The list of ready polls */ #ifdef LIBUS_USE_EPOLL struct epoll_event ready_polls[1024]; #else struct kevent ready_polls[1024]; #endif }; struct us_poll_t { alignas(LIBUS_EXT_ALIGNMENT) struct { signed int fd : 28; // we could have this unsigned if we wanted to, -1 should never be used unsigned int poll_type : 4; } state; }; #endif // EPOLL_KQUEUE_H ================================================ FILE: nerd_modules/http/httplib/uSockets/internal/eventing/gcd.h ================================================ /* * Authored by Alex Hultman, 2018-2019. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef GCD_H #define GCD_H #include "internal/loop_data.h" #include #define LIBUS_SOCKET_READABLE 1 #define LIBUS_SOCKET_WRITABLE 2 struct us_loop_t { alignas(LIBUS_EXT_ALIGNMENT) struct us_internal_loop_data_t data; dispatch_queue_t gcd_queue; }; struct us_poll_t { int events; dispatch_source_t gcd_read, gcd_write; LIBUS_SOCKET_DESCRIPTOR fd; unsigned char poll_type; }; #endif // GCD_H ================================================ FILE: nerd_modules/http/httplib/uSockets/internal/eventing/libuv.h ================================================ /* * Authored by Alex Hultman, 2018-2019. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef LIBUV_H #define LIBUV_H #include "internal/loop_data.h" #include #define LIBUS_SOCKET_READABLE UV_READABLE #define LIBUS_SOCKET_WRITABLE UV_WRITABLE struct us_loop_t { alignas(LIBUS_EXT_ALIGNMENT) struct us_internal_loop_data_t data; uv_loop_t *uv_loop; int is_default; uv_prepare_t *uv_pre; uv_check_t *uv_check; }; // it is no longer valid to cast a pointer to us_poll_t to a pointer of uv_poll_t struct us_poll_t { /* We need to hold a pointer to this uv_poll_t since we need to be able to resize our block */ uv_poll_t *uv_p; LIBUS_SOCKET_DESCRIPTOR fd; unsigned char poll_type; }; #endif // LIBUV_H ================================================ FILE: nerd_modules/http/httplib/uSockets/internal/internal.h ================================================ /* * Authored by Alex Hultman, 2018-2019. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef INTERNAL_H #define INTERNAL_H #if defined(_MSC_VER) #define alignas(x) __declspec(align(x)) #else #include #endif /* We only have one networking implementation so far */ #include "internal/networking/bsd.h" /* We have many different eventing implementations */ #if defined(LIBUS_USE_EPOLL) || defined(LIBUS_USE_KQUEUE) #include "internal/eventing/epoll_kqueue.h" #endif #ifdef LIBUS_USE_LIBUV #include "internal/eventing/libuv.h" #endif #ifdef LIBUS_USE_GCD #include "internal/eventing/gcd.h" #endif /* Poll type and what it polls for */ enum { /* Two first bits */ POLL_TYPE_SOCKET = 0, POLL_TYPE_SOCKET_SHUT_DOWN = 1, POLL_TYPE_SEMI_SOCKET = 2, POLL_TYPE_CALLBACK = 3, /* Two last bits */ POLL_TYPE_POLLING_OUT = 4, POLL_TYPE_POLLING_IN = 8 }; /* Loop related */ void us_internal_dispatch_ready_poll(struct us_poll_t *p, int error, int events); void us_internal_timer_sweep(struct us_loop_t *loop); void us_internal_free_closed_sockets(struct us_loop_t *loop); void us_internal_loop_link(struct us_loop_t *loop, struct us_socket_context_t *context); void us_internal_loop_unlink(struct us_loop_t *loop, struct us_socket_context_t *context); void us_internal_loop_data_init(struct us_loop_t *loop, void (*wakeup_cb)(struct us_loop_t *loop), void (*pre_cb)(struct us_loop_t *loop), void (*post_cb)(struct us_loop_t *loop)); void us_internal_loop_data_free(struct us_loop_t *loop); void us_internal_loop_pre(struct us_loop_t *loop); void us_internal_loop_post(struct us_loop_t *loop); /* Asyncs (old) */ struct us_internal_async *us_internal_create_async(struct us_loop_t *loop, int fallthrough, unsigned int ext_size); void us_internal_async_close(struct us_internal_async *a); void us_internal_async_set(struct us_internal_async *a, void (*cb)(struct us_internal_async *)); void us_internal_async_wakeup(struct us_internal_async *a); /* Eventing related */ unsigned int us_internal_accept_poll_event(struct us_poll_t *p); int us_internal_poll_type(struct us_poll_t *p); void us_internal_poll_set_type(struct us_poll_t *p, int poll_type); /* SSL loop data */ void us_internal_init_loop_ssl_data(struct us_loop_t *loop); void us_internal_free_loop_ssl_data(struct us_loop_t *loop); /* Socket context related */ void us_internal_socket_context_link(struct us_socket_context_t *context, struct us_socket_t *s); void us_internal_socket_context_unlink(struct us_socket_context_t *context, struct us_socket_t *s); /* Sockets are polls */ struct us_socket_t { alignas(LIBUS_EXT_ALIGNMENT) struct us_poll_t p; struct us_socket_context_t *context; struct us_socket_t *prev, *next; unsigned short timeout; }; /* Internal callback types are polls just like sockets */ struct us_internal_callback_t { alignas(LIBUS_EXT_ALIGNMENT) struct us_poll_t p; struct us_loop_t *loop; int cb_expects_the_loop; void (*cb)(struct us_internal_callback_t *cb); }; /* Listen sockets are sockets */ struct us_listen_socket_t { alignas(LIBUS_EXT_ALIGNMENT) struct us_socket_t s; unsigned int socket_ext_size; }; struct us_socket_context_t { alignas(LIBUS_EXT_ALIGNMENT) struct us_loop_t *loop; unsigned short timestamp; struct us_socket_t *head; struct us_socket_t *iterator; struct us_socket_context_t *prev, *next; struct us_socket_t *(*on_open)(struct us_socket_t *, int is_client, char *ip, int ip_length); struct us_socket_t *(*on_data)(struct us_socket_t *, char *data, int length); struct us_socket_t *(*on_writable)(struct us_socket_t *); struct us_socket_t *(*on_close)(struct us_socket_t *, int code, void *reason); //void (*on_timeout)(struct us_socket_context *); struct us_socket_t *(*on_socket_timeout)(struct us_socket_t *); struct us_socket_t *(*on_end)(struct us_socket_t *); struct us_socket_t *(*on_connect_error)(struct us_socket_t *, int code); int (*ignore_data)(struct us_socket_t *); }; /* Internal SSL interface */ #ifndef LIBUS_NO_SSL struct us_internal_ssl_socket_context_t; struct us_internal_ssl_socket_t; /* SNI functions */ void us_internal_ssl_socket_context_add_server_name(struct us_internal_ssl_socket_context_t *context, const char *hostname_pattern, struct us_socket_context_options_t options); void us_internal_ssl_socket_context_remove_server_name(struct us_internal_ssl_socket_context_t *context, const char *hostname_pattern); void us_internal_ssl_socket_context_on_server_name(struct us_internal_ssl_socket_context_t *context, void (*cb)(struct us_internal_ssl_socket_context_t *, const char *)); void *us_internal_ssl_socket_get_native_handle(struct us_internal_ssl_socket_t *s); void *us_internal_ssl_socket_context_get_native_handle(struct us_internal_ssl_socket_context_t *context); struct us_internal_ssl_socket_context_t *us_internal_create_ssl_socket_context(struct us_loop_t *loop, int context_ext_size, struct us_socket_context_options_t options); void us_internal_ssl_socket_context_free(struct us_internal_ssl_socket_context_t *context); void us_internal_ssl_socket_context_on_open(struct us_internal_ssl_socket_context_t *context, struct us_internal_ssl_socket_t *(*on_open)(struct us_internal_ssl_socket_t *s, int is_client, char *ip, int ip_length)); void us_internal_ssl_socket_context_on_close(struct us_internal_ssl_socket_context_t *context, struct us_internal_ssl_socket_t *(*on_close)(struct us_internal_ssl_socket_t *s, int code, void *reason)); void us_internal_ssl_socket_context_on_data(struct us_internal_ssl_socket_context_t *context, struct us_internal_ssl_socket_t *(*on_data)(struct us_internal_ssl_socket_t *s, char *data, int length)); void us_internal_ssl_socket_context_on_writable(struct us_internal_ssl_socket_context_t *context, struct us_internal_ssl_socket_t *(*on_writable)(struct us_internal_ssl_socket_t *s)); void us_internal_ssl_socket_context_on_timeout(struct us_internal_ssl_socket_context_t *context, struct us_internal_ssl_socket_t *(*on_timeout)(struct us_internal_ssl_socket_t *s)); void us_internal_ssl_socket_context_on_end(struct us_internal_ssl_socket_context_t *context, struct us_internal_ssl_socket_t *(*on_end)(struct us_internal_ssl_socket_t *s)); void us_internal_ssl_socket_context_on_connect_error(struct us_internal_ssl_socket_context_t *context, struct us_internal_ssl_socket_t *(*on_connect_error)(struct us_internal_ssl_socket_t *s, int code)); struct us_listen_socket_t *us_internal_ssl_socket_context_listen(struct us_internal_ssl_socket_context_t *context, const char *host, int port, int options, int socket_ext_size); struct us_internal_ssl_socket_t *us_internal_ssl_socket_context_connect(struct us_internal_ssl_socket_context_t *context, const char *host, int port, const char *source_host, int options, int socket_ext_size); int us_internal_ssl_socket_write(struct us_internal_ssl_socket_t *s, const char *data, int length, int msg_more); void us_internal_ssl_socket_timeout(struct us_internal_ssl_socket_t *s, unsigned int seconds); void *us_internal_ssl_socket_context_ext(struct us_internal_ssl_socket_context_t *s); struct us_internal_ssl_socket_context_t *us_internal_ssl_socket_get_context(struct us_internal_ssl_socket_t *s); void *us_internal_ssl_socket_ext(struct us_internal_ssl_socket_t *s); int us_internal_ssl_socket_is_shut_down(struct us_internal_ssl_socket_t *s); void us_internal_ssl_socket_shutdown(struct us_internal_ssl_socket_t *s); struct us_internal_ssl_socket_t *us_internal_ssl_socket_context_adopt_socket(struct us_internal_ssl_socket_context_t *context, struct us_internal_ssl_socket_t *s, int ext_size); struct us_internal_ssl_socket_context_t *us_internal_create_child_ssl_socket_context(struct us_internal_ssl_socket_context_t *context, int context_ext_size); struct us_loop_t *us_internal_ssl_socket_context_loop(struct us_internal_ssl_socket_context_t *context); #endif #endif // INTERNAL_H ================================================ FILE: nerd_modules/http/httplib/uSockets/internal/loop_data.h ================================================ /* * Authored by Alex Hultman, 2018-2019. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef LOOP_DATA_H #define LOOP_DATA_H struct us_internal_loop_data_t { struct us_timer_t *sweep_timer; struct us_internal_async *wakeup_async; int last_write_failed; struct us_socket_context_t *head; struct us_socket_context_t *iterator; char *recv_buf; void *ssl_data; void (*pre_cb)(struct us_loop_t *); void (*post_cb)(struct us_loop_t *); struct us_socket_t *closed_head; /* We do not care if this flips or not, it doesn't matter */ long long iteration_nr; }; #endif // LOOP_DATA_H ================================================ FILE: nerd_modules/http/httplib/uSockets/internal/networking/bsd.h ================================================ /* * Authored by Alex Hultman, 2018-2019. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef BSD_H #define BSD_H // top-most wrapper of bsd-like syscalls // holds everything you need from the bsd/winsock interfaces, only included by internal libusockets.h // here everything about the syscalls are inline-wrapped and included #ifdef _WIN32 #ifndef NOMINMAX #define NOMINMAX #endif #include #include #pragma comment(lib, "ws2_32.lib") #define SETSOCKOPT_PTR_TYPE const char * #define LIBUS_SOCKET_ERROR INVALID_SOCKET #else #define _GNU_SOURCE /* For socklen_t */ #include #define SETSOCKOPT_PTR_TYPE int * #define LIBUS_SOCKET_ERROR -1 #endif struct bsd_addr_t { struct sockaddr_storage mem; socklen_t len; char *ip; int ip_length; int port; }; LIBUS_SOCKET_DESCRIPTOR apple_no_sigpipe(LIBUS_SOCKET_DESCRIPTOR fd); LIBUS_SOCKET_DESCRIPTOR bsd_set_nonblocking(LIBUS_SOCKET_DESCRIPTOR fd); void bsd_socket_nodelay(LIBUS_SOCKET_DESCRIPTOR fd, int enabled); void bsd_socket_flush(LIBUS_SOCKET_DESCRIPTOR fd); LIBUS_SOCKET_DESCRIPTOR bsd_create_socket(int domain, int type, int protocol); void bsd_close_socket(LIBUS_SOCKET_DESCRIPTOR fd); void bsd_shutdown_socket(LIBUS_SOCKET_DESCRIPTOR fd); void bsd_shutdown_socket_read(LIBUS_SOCKET_DESCRIPTOR fd); void internal_finalize_bsd_addr(struct bsd_addr_t *addr); int bsd_local_addr(LIBUS_SOCKET_DESCRIPTOR fd, struct bsd_addr_t *addr); int bsd_remote_addr(LIBUS_SOCKET_DESCRIPTOR fd, struct bsd_addr_t *addr); char *bsd_addr_get_ip(struct bsd_addr_t *addr); int bsd_addr_get_ip_length(struct bsd_addr_t *addr); int bsd_addr_get_port(struct bsd_addr_t *addr); // called by dispatch_ready_poll LIBUS_SOCKET_DESCRIPTOR bsd_accept_socket(LIBUS_SOCKET_DESCRIPTOR fd, struct bsd_addr_t *addr); int bsd_recv(LIBUS_SOCKET_DESCRIPTOR fd, void *buf, int length, int flags); int bsd_send(LIBUS_SOCKET_DESCRIPTOR fd, const char *buf, int length, int msg_more); int bsd_would_block(); // return LIBUS_SOCKET_ERROR or the fd that represents listen socket // listen both on ipv6 and ipv4 LIBUS_SOCKET_DESCRIPTOR bsd_create_listen_socket(const char *host, int port, int options); LIBUS_SOCKET_DESCRIPTOR bsd_create_connect_socket(const char *host, int port, const char *source_host, int options); #endif // BSD_H ================================================ FILE: nerd_modules/http/httplib/uSockets/libusockets.h ================================================ /* * Authored by Alex Hultman, 2018-2019. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef LIBUSOCKETS_H #define LIBUSOCKETS_H /* 512kb shared receive buffer */ #define LIBUS_RECV_BUFFER_LENGTH 524288 /* A timeout granularity of 4 seconds means give or take 4 seconds from set timeout */ #define LIBUS_TIMEOUT_GRANULARITY 4 /* 32 byte padding of receive buffer ends */ #define LIBUS_RECV_BUFFER_PADDING 32 /* Guaranteed alignment of extension memory */ #define LIBUS_EXT_ALIGNMENT 16 /* Define what a socket descriptor is based on platform */ #ifdef _WIN32 #ifndef NOMINMAX #define NOMINMAX #endif #include #define LIBUS_SOCKET_DESCRIPTOR SOCKET #define WIN32_EXPORT __declspec(dllexport) #else #define LIBUS_SOCKET_DESCRIPTOR int #define WIN32_EXPORT #endif #ifdef __cplusplus extern "C" { #endif enum { /* No meaning, default listen option */ LIBUS_LISTEN_DEFAULT, /* We exclusively own this port, do not share it */ LIBUS_LISTEN_EXCLUSIVE_PORT }; /* Library types publicly available */ struct us_socket_t; struct us_timer_t; struct us_socket_context_t; struct us_loop_t; struct us_poll_t; /* Public interfaces for timers */ /* Create a new high precision, low performance timer. May fail and return null */ WIN32_EXPORT struct us_timer_t *us_create_timer(struct us_loop_t *loop, int fallthrough, unsigned int ext_size); /* Returns user data extension for this timer */ WIN32_EXPORT void *us_timer_ext(struct us_timer_t *timer); /* */ WIN32_EXPORT void us_timer_close(struct us_timer_t *timer); /* Arm a timer with a delay from now and eventually a repeat delay. * Specify 0 as repeat delay to disable repeating. Specify both 0 to disarm. */ WIN32_EXPORT void us_timer_set(struct us_timer_t *timer, void (*cb)(struct us_timer_t *t), int ms, int repeat_ms); /* Returns the loop for this timer */ WIN32_EXPORT struct us_loop_t *us_timer_loop(struct us_timer_t *t); /* Public interfaces for contexts */ struct us_socket_context_options_t { const char *key_file_name; const char *cert_file_name; const char *passphrase; const char *dh_params_file_name; const char *ca_file_name; int ssl_prefer_low_memory_usage; /* Todo: rename to prefer_low_memory_usage and apply for TCP as well */ }; /* Return 15-bit timestamp for this context */ WIN32_EXPORT unsigned short us_socket_context_timestamp(int ssl, struct us_socket_context_t *context); /* Adds SNI domain and cert in asn1 format */ WIN32_EXPORT void us_socket_context_add_server_name(int ssl, struct us_socket_context_t *context, const char *hostname_pattern, struct us_socket_context_options_t options); WIN32_EXPORT void us_socket_context_remove_server_name(int ssl, struct us_socket_context_t *context, const char *hostname_pattern); WIN32_EXPORT void us_socket_context_on_server_name(int ssl, struct us_socket_context_t *context, void (*cb)(struct us_socket_context_t *, const char *hostname)); /* Returns the underlying SSL native handle, such as SSL_CTX or nullptr */ WIN32_EXPORT void *us_socket_context_get_native_handle(int ssl, struct us_socket_context_t *context); /* A socket context holds shared callbacks and user data extension for associated sockets */ WIN32_EXPORT struct us_socket_context_t *us_create_socket_context(int ssl, struct us_loop_t *loop, int ext_size, struct us_socket_context_options_t options); /* Delete resources allocated at creation time. */ WIN32_EXPORT void us_socket_context_free(int ssl, struct us_socket_context_t *context); /* Setters of various async callbacks */ WIN32_EXPORT void us_socket_context_on_open(int ssl, struct us_socket_context_t *context, struct us_socket_t *(*on_open)(struct us_socket_t *s, int is_client, char *ip, int ip_length)); WIN32_EXPORT void us_socket_context_on_close(int ssl, struct us_socket_context_t *context, struct us_socket_t *(*on_close)(struct us_socket_t *s, int code, void *reason)); WIN32_EXPORT void us_socket_context_on_data(int ssl, struct us_socket_context_t *context, struct us_socket_t *(*on_data)(struct us_socket_t *s, char *data, int length)); WIN32_EXPORT void us_socket_context_on_writable(int ssl, struct us_socket_context_t *context, struct us_socket_t *(*on_writable)(struct us_socket_t *s)); WIN32_EXPORT void us_socket_context_on_timeout(int ssl, struct us_socket_context_t *context, struct us_socket_t *(*on_timeout)(struct us_socket_t *s)); /* This one is only used for when a connecting socket fails in a late stage. */ WIN32_EXPORT void us_socket_context_on_connect_error(int ssl, struct us_socket_context_t *context, struct us_socket_t *(*on_connect_error)(struct us_socket_t *s, int code)); /* Emitted when a socket has been half-closed */ WIN32_EXPORT void us_socket_context_on_end(int ssl, struct us_socket_context_t *context, struct us_socket_t *(*on_end)(struct us_socket_t *s)); /* Returns user data extension for this socket context */ WIN32_EXPORT void *us_socket_context_ext(int ssl, struct us_socket_context_t *context); /* Listen for connections. Acts as the main driving cog in a server. Will call set async callbacks. */ WIN32_EXPORT struct us_listen_socket_t *us_socket_context_listen(int ssl, struct us_socket_context_t *context, const char *host, int port, int options, int socket_ext_size); /* listen_socket.c/.h */ WIN32_EXPORT void us_listen_socket_close(int ssl, struct us_listen_socket_t *ls); /* Land in on_open or on_connection_error or return null or return socket */ WIN32_EXPORT struct us_socket_t *us_socket_context_connect(int ssl, struct us_socket_context_t *context, const char *host, int port, const char *source_host, int options, int socket_ext_size); /* Is this socket established? Can be used to check if a connecting socket has fired the on_open event yet. * Can also be used to determine if a socket is a listen_socket or not, but you probably know that already. */ WIN32_EXPORT int us_socket_is_established(int ssl, struct us_socket_t *s); /* Cancel a connecting socket. Can be used together with us_socket_timeout to limit connection times. * Entirely destroys the socket - this function works like us_socket_close but does not trigger on_close event since * you never got the on_open event first. */ WIN32_EXPORT struct us_socket_t *us_socket_close_connecting(int ssl, struct us_socket_t *s); /* Returns the loop for this socket context. */ WIN32_EXPORT struct us_loop_t *us_socket_context_loop(int ssl, struct us_socket_context_t *context); /* Invalidates passed socket, returning a new resized socket which belongs to a different socket context. * Used mainly for "socket upgrades" such as when transitioning from HTTP to WebSocket. */ WIN32_EXPORT struct us_socket_t *us_socket_context_adopt_socket(int ssl, struct us_socket_context_t *context, struct us_socket_t *s, int ext_size); /* Create a child socket context which acts much like its own socket context with its own callbacks yet still relies on the * parent socket context for some shared resources. Child socket contexts should be used together with socket adoptions and nothing else. */ WIN32_EXPORT struct us_socket_context_t *us_create_child_socket_context(int ssl, struct us_socket_context_t *context, int context_ext_size); /* Public interfaces for loops */ /* Returns a new event loop with user data extension */ WIN32_EXPORT struct us_loop_t *us_create_loop(void *hint, void (*wakeup_cb)(struct us_loop_t *loop), void (*pre_cb)(struct us_loop_t *loop), void (*post_cb)(struct us_loop_t *loop), unsigned int ext_size); /* Frees the loop immediately */ WIN32_EXPORT void us_loop_free(struct us_loop_t *loop); /* Returns the loop user data extension */ WIN32_EXPORT void *us_loop_ext(struct us_loop_t *loop); /* Blocks the calling thread and drives the event loop until no more non-fallthrough polls are scheduled */ WIN32_EXPORT void us_loop_run(struct us_loop_t *loop); /* Signals the loop from any thread to wake up and execute its wakeup handler from the loop's own running thread. * This is the only fully thread-safe function and serves as the basis for thread safety */ WIN32_EXPORT void us_wakeup_loop(struct us_loop_t *loop); /* Hook up timers in existing loop */ WIN32_EXPORT void us_loop_integrate(struct us_loop_t *loop); /* Returns the loop iteration number */ WIN32_EXPORT long long us_loop_iteration_number(struct us_loop_t *loop); /* Public interfaces for polls */ /* A fallthrough poll does not keep the loop running, it falls through */ WIN32_EXPORT struct us_poll_t *us_create_poll(struct us_loop_t *loop, int fallthrough, unsigned int ext_size); /* After stopping a poll you must manually free the memory */ WIN32_EXPORT void us_poll_free(struct us_poll_t *p, struct us_loop_t *loop); /* Associate this poll with a socket descriptor and poll type */ WIN32_EXPORT void us_poll_init(struct us_poll_t *p, LIBUS_SOCKET_DESCRIPTOR fd, int poll_type); /* Start, change and stop polling for events */ WIN32_EXPORT void us_poll_start(struct us_poll_t *p, struct us_loop_t *loop, int events); WIN32_EXPORT void us_poll_change(struct us_poll_t *p, struct us_loop_t *loop, int events); WIN32_EXPORT void us_poll_stop(struct us_poll_t *p, struct us_loop_t *loop); /* Return what events we are polling for */ WIN32_EXPORT int us_poll_events(struct us_poll_t *p); /* Returns the user data extension of this poll */ WIN32_EXPORT void *us_poll_ext(struct us_poll_t *p); /* Get associated socket descriptor from a poll */ WIN32_EXPORT LIBUS_SOCKET_DESCRIPTOR us_poll_fd(struct us_poll_t *p); /* Resize an active poll */ WIN32_EXPORT struct us_poll_t *us_poll_resize(struct us_poll_t *p, struct us_loop_t *loop, unsigned int ext_size); /* Public interfaces for sockets */ /* Returns the underlying native handle for a socket, such as SSL or file descriptor. * In the case of file descriptor, the value of pointer is fd. */ WIN32_EXPORT void *us_socket_get_native_handle(int ssl, struct us_socket_t *s); /* Write up to length bytes of data. Returns actual bytes written. * Will call the on_writable callback of active socket context on failure to write everything off in one go. * Set hint msg_more if you have more immediate data to write. */ WIN32_EXPORT int us_socket_write(int ssl, struct us_socket_t *s, const char *data, int length, int msg_more); /* Set a low precision, high performance timer on a socket. A socket can only have one single active timer * at any given point in time. Will remove any such pre set timer */ WIN32_EXPORT void us_socket_timeout(int ssl, struct us_socket_t *s, unsigned int seconds); /* Return the user data extension of this socket */ WIN32_EXPORT void *us_socket_ext(int ssl, struct us_socket_t *s); /* Return the socket context of this socket */ WIN32_EXPORT struct us_socket_context_t *us_socket_context(int ssl, struct us_socket_t *s); /* Withdraw any msg_more status and flush any pending data */ WIN32_EXPORT void us_socket_flush(int ssl, struct us_socket_t *s); /* Shuts down the connection by sending FIN and/or close_notify */ WIN32_EXPORT void us_socket_shutdown(int ssl, struct us_socket_t *s); /* Shuts down the connection in terms of read, meaning next event loop * iteration will catch the socket being closed. Can be used to defer closing * to next event loop iteration. */ WIN32_EXPORT void us_socket_shutdown_read(int ssl, struct us_socket_t *s); /* Returns whether the socket has been shut down or not */ WIN32_EXPORT int us_socket_is_shut_down(int ssl, struct us_socket_t *s); /* Returns whether this socket has been closed. Only valid if memory has not yet been released. */ WIN32_EXPORT int us_socket_is_closed(int ssl, struct us_socket_t *s); /* Immediately closes the socket */ WIN32_EXPORT struct us_socket_t *us_socket_close(int ssl, struct us_socket_t *s, int code, void *reason); /* Returns local port or -1 on failure. */ WIN32_EXPORT int us_socket_local_port(int ssl, struct us_socket_t *s); /* Copy remote (IP) address of socket, or fail with zero length. */ WIN32_EXPORT void us_socket_remote_address(int ssl, struct us_socket_t *s, char *buf, int *length); #ifdef __cplusplus } #endif /* Decide what eventing system to use by default */ #if !defined(LIBUS_USE_EPOLL) && !defined(LIBUS_USE_LIBUV) && !defined(LIBUS_USE_GCD) && !defined(LIBUS_USE_KQUEUE) #if defined(_WIN32) #define LIBUS_USE_LIBUV #elif defined(__APPLE__) || defined(__FreeBSD__) #define LIBUS_USE_KQUEUE #else #define LIBUS_USE_EPOLL #endif #endif #endif // LIBUSOCKETS_H ================================================ FILE: nerd_modules/http/httplib/uSockets/loop.c ================================================ /* * Authored by Alex Hultman, 2018-2021. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "libusockets.h" #include "internal/internal.h" #include /* The loop has 2 fallthrough polls */ void us_internal_loop_data_init(struct us_loop_t *loop, void (*wakeup_cb)(struct us_loop_t *loop), void (*pre_cb)(struct us_loop_t *loop), void (*post_cb)(struct us_loop_t *loop)) { loop->data.sweep_timer = us_create_timer(loop, 1, 0); loop->data.recv_buf = malloc(LIBUS_RECV_BUFFER_LENGTH + LIBUS_RECV_BUFFER_PADDING * 2); loop->data.ssl_data = 0; loop->data.head = 0; loop->data.iterator = 0; loop->data.closed_head = 0; loop->data.pre_cb = pre_cb; loop->data.post_cb = post_cb; loop->data.iteration_nr = 0; loop->data.wakeup_async = us_internal_create_async(loop, 1, 0); us_internal_async_set(loop->data.wakeup_async, (void (*)(struct us_internal_async *)) wakeup_cb); } void us_internal_loop_data_free(struct us_loop_t *loop) { #ifndef LIBUS_NO_SSL us_internal_free_loop_ssl_data(loop); #endif free(loop->data.recv_buf); us_timer_close(loop->data.sweep_timer); us_internal_async_close(loop->data.wakeup_async); } void us_wakeup_loop(struct us_loop_t *loop) { us_internal_async_wakeup(loop->data.wakeup_async); } void us_internal_loop_link(struct us_loop_t *loop, struct us_socket_context_t *context) { /* Insert this context as the head of loop */ context->next = loop->data.head; context->prev = 0; if (loop->data.head) { loop->data.head->prev = context; } loop->data.head = context; } /* Unlink is called before free */ void us_internal_loop_unlink(struct us_loop_t *loop, struct us_socket_context_t *context) { if (loop->data.head == context) { loop->data.head = context->next; if (loop->data.head) { loop->data.head->prev = 0; } } else { context->prev->next = context->next; if (context->next) { context->next->prev = context->prev; } } } /* This functions should never run recursively */ void us_internal_timer_sweep(struct us_loop_t *loop) { struct us_internal_loop_data_t *loop_data = &loop->data; /* For all socket contexts in this loop */ for (loop_data->iterator = loop_data->head; loop_data->iterator; loop_data->iterator = loop_data->iterator->next) { struct us_socket_context_t *context = loop_data->iterator; /* Update this context's 15-bit timestamp */ context->timestamp = (context->timestamp + 1) & 0x7fff; /* Update our 16-bit full timestamp (the needle in the haystack) */ unsigned short needle = 0x8000 | context->timestamp; /* Begin at head */ struct us_socket_t *s = context->head; while (s) { /* Seek until end or timeout found (tightest loop) */ while (1) { /* We only read from 1 random cache line here */ if (needle == s->timeout) { break; } /* Did we reach the end without a find? */ if ((s = s->next) == 0) { goto next_context; } } /* Here we have a timeout to emit (slow path) */ s->timeout = 0; context->iterator = s; context->on_socket_timeout(s); /* Check for unlink / link (if the event handler did not modify the chain, we step 1) */ if (s == context->iterator) { s = s->next; } else { /* The iterator was changed by event handler */ s = context->iterator; } } /* We always store a 0 to context->iterator here since we are no longer iterating this context */ next_context: context->iterator = 0; } } /* Note: Properly takes the linked list and timeout sweep into account */ void us_internal_free_closed_sockets(struct us_loop_t *loop) { /* Free all closed sockets (maybe it is better to reverse order?) */ if (loop->data.closed_head) { for (struct us_socket_t *s = loop->data.closed_head; s; ) { struct us_socket_t *next = s->next; us_poll_free((struct us_poll_t *) s, loop); s = next; } loop->data.closed_head = 0; } } void sweep_timer_cb(struct us_internal_callback_t *cb) { us_internal_timer_sweep(cb->loop); } long long us_loop_iteration_number(struct us_loop_t *loop) { return loop->data.iteration_nr; } /* These may have somewhat different meaning depending on the underlying event library */ void us_internal_loop_pre(struct us_loop_t *loop) { loop->data.iteration_nr++; loop->data.pre_cb(loop); } void us_internal_loop_post(struct us_loop_t *loop) { us_internal_free_closed_sockets(loop); loop->data.post_cb(loop); } void us_internal_dispatch_ready_poll(struct us_poll_t *p, int error, int events) { switch (us_internal_poll_type(p)) { case POLL_TYPE_CALLBACK: { /* Let's just do this to clear the CodeQL alert */ #ifndef LIBUS_USE_LIBUV us_internal_accept_poll_event(p); #endif struct us_internal_callback_t *cb = (struct us_internal_callback_t *) p; cb->cb(cb->cb_expects_the_loop ? (struct us_internal_callback_t *) cb->loop : (struct us_internal_callback_t *) &cb->p); } break; case POLL_TYPE_SEMI_SOCKET: { /* Both connect and listen sockets are semi-sockets * but they poll for different events */ if (us_poll_events(p) == LIBUS_SOCKET_WRITABLE) { struct us_socket_t *s = (struct us_socket_t *) p; /* It is perfectly possible to come here with an error */ if (error) { /* Emit error, close without emitting on_close */ s->context->on_connect_error(s, 0); us_socket_close_connecting(0, s); } else { /* All sockets poll for readable */ us_poll_change(p, s->context->loop, LIBUS_SOCKET_READABLE); /* We always use nodelay */ bsd_socket_nodelay(us_poll_fd(p), 1); /* We are now a proper socket */ us_internal_poll_set_type(p, POLL_TYPE_SOCKET); /* If we used a connection timeout we have to reset it here */ us_socket_timeout(0, s, 0); s->context->on_open(s, 1, 0, 0); } } else { struct us_listen_socket_t *listen_socket = (struct us_listen_socket_t *) p; struct bsd_addr_t addr; LIBUS_SOCKET_DESCRIPTOR client_fd = bsd_accept_socket(us_poll_fd(p), &addr); if (client_fd == LIBUS_SOCKET_ERROR) { /* Todo: start timer here */ } else { /* Todo: stop timer if any */ do { struct us_poll_t *accepted_p = us_create_poll(us_socket_context(0, &listen_socket->s)->loop, 0, sizeof(struct us_socket_t) - sizeof(struct us_poll_t) + listen_socket->socket_ext_size); us_poll_init(accepted_p, client_fd, POLL_TYPE_SOCKET); us_poll_start(accepted_p, listen_socket->s.context->loop, LIBUS_SOCKET_READABLE); struct us_socket_t *s = (struct us_socket_t *) accepted_p; s->context = listen_socket->s.context; /* We always use nodelay */ bsd_socket_nodelay(client_fd, 1); us_internal_socket_context_link(listen_socket->s.context, s); listen_socket->s.context->on_open(s, 0, bsd_addr_get_ip(&addr), bsd_addr_get_ip_length(&addr)); /* Exit accept loop if listen socket was closed in on_open handler */ if (us_socket_is_closed(0, &listen_socket->s)) { break; } } while ((client_fd = bsd_accept_socket(us_poll_fd(p), &addr)) != LIBUS_SOCKET_ERROR); } } } break; case POLL_TYPE_SOCKET_SHUT_DOWN: case POLL_TYPE_SOCKET: { /* We should only use s, no p after this point */ struct us_socket_t *s = (struct us_socket_t *) p; /* Such as epollerr epollhup */ if (error) { /* Todo: decide what code we give here */ s = us_socket_close(0, s, 0, NULL); return; } if (events & LIBUS_SOCKET_WRITABLE) { /* Note: if we failed a write as a socket of one loop then adopted * to another loop, this will be wrong. Absurd case though */ s->context->loop->data.last_write_failed = 0; s = s->context->on_writable(s); if (us_socket_is_closed(0, s)) { return; } /* If we have no failed write or if we shut down, then stop polling for more writable */ if (!s->context->loop->data.last_write_failed || us_socket_is_shut_down(0, s)) { us_poll_change(&s->p, us_socket_context(0, s)->loop, us_poll_events(&s->p) & LIBUS_SOCKET_READABLE); } } if (events & LIBUS_SOCKET_READABLE) { /* Contexts may ignore data and postpone it to next iteration, for balancing purposes such as * when SSL handshakes take too long to finish and we only want a few of them per iteration */ if (s->context->ignore_data(s)) { break; } int length = bsd_recv(us_poll_fd(&s->p), s->context->loop->data.recv_buf + LIBUS_RECV_BUFFER_PADDING, LIBUS_RECV_BUFFER_LENGTH, 0); if (length > 0) { s = s->context->on_data(s, s->context->loop->data.recv_buf + LIBUS_RECV_BUFFER_PADDING, length); } else if (!length) { if (us_socket_is_shut_down(0, s)) { /* We got FIN back after sending it */ /* Todo: We should give "CLEAN SHUTDOWN" as reason here */ s = us_socket_close(0, s, 0, NULL); } else { /* We got FIN, so stop polling for readable */ us_poll_change(&s->p, us_socket_context(0, s)->loop, us_poll_events(&s->p) & LIBUS_SOCKET_WRITABLE); s = s->context->on_end(s); } } else if (length == LIBUS_SOCKET_ERROR && !bsd_would_block()) { /* Todo: decide also here what kind of reason we should give */ s = us_socket_close(0, s, 0, NULL); } } } break; } } /* Integration only requires the timer to be set up */ void us_loop_integrate(struct us_loop_t *loop) { us_timer_set(loop->data.sweep_timer, (void (*)(struct us_timer_t *)) sweep_timer_cb, LIBUS_TIMEOUT_GRANULARITY * 1000, LIBUS_TIMEOUT_GRANULARITY * 1000); } void *us_loop_ext(struct us_loop_t *loop) { return loop + 1; } ================================================ FILE: nerd_modules/http/httplib/uSockets/socket.c ================================================ /* * Authored by Alex Hultman, 2018-2021. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "libusockets.h" #include "internal/internal.h" #include #include /* Shared with SSL */ int us_socket_local_port(int ssl, struct us_socket_t *s) { struct bsd_addr_t addr; if (bsd_local_addr(us_poll_fd(&s->p), &addr)) { return -1; } else { return bsd_addr_get_port(&addr); } } void us_socket_shutdown_read(int ssl, struct us_socket_t *s) { /* This syscall is idempotent so no extra check is needed */ bsd_shutdown_socket_read(us_poll_fd((struct us_poll_t *) s)); } void us_socket_remote_address(int ssl, struct us_socket_t *s, char *buf, int *length) { struct bsd_addr_t addr; if (bsd_remote_addr(us_poll_fd(&s->p), &addr) || *length < bsd_addr_get_ip_length(&addr)) { *length = 0; } else { *length = bsd_addr_get_ip_length(&addr); memcpy(buf, bsd_addr_get_ip(&addr), *length); } } struct us_socket_context_t *us_socket_context(int ssl, struct us_socket_t *s) { return s->context; } void us_socket_timeout(int ssl, struct us_socket_t *s, unsigned int seconds) { if (seconds) { s->timeout = 0x8000 | (s->context->timestamp + (seconds >> 2)); } else { s->timeout = 0; } } void us_socket_flush(int ssl, struct us_socket_t *s) { if (!us_socket_is_shut_down(0, s)) { bsd_socket_flush(us_poll_fd((struct us_poll_t *) s)); } } int us_socket_is_closed(int ssl, struct us_socket_t *s) { return s->prev == (struct us_socket_t *) s->context; } int us_socket_is_established(int ssl, struct us_socket_t *s) { /* Everything that is not POLL_TYPE_SEMI_SOCKET is established */ return us_internal_poll_type((struct us_poll_t *) s) != POLL_TYPE_SEMI_SOCKET; } /* Exactly the same as us_socket_close but does not emit on_close event */ struct us_socket_t *us_socket_close_connecting(int ssl, struct us_socket_t *s) { if (!us_socket_is_closed(0, s)) { us_internal_socket_context_unlink(s->context, s); us_poll_stop((struct us_poll_t *) s, s->context->loop); bsd_close_socket(us_poll_fd((struct us_poll_t *) s)); /* Link this socket to the close-list and let it be deleted after this iteration */ s->next = s->context->loop->data.closed_head; s->context->loop->data.closed_head = s; /* Any socket with prev = context is marked as closed */ s->prev = (struct us_socket_t *) s->context; //return s->context->on_close(s, code, reason); } return s; } /* Same as above but emits on_close */ struct us_socket_t *us_socket_close(int ssl, struct us_socket_t *s, int code, void *reason) { if (!us_socket_is_closed(0, s)) { us_internal_socket_context_unlink(s->context, s); us_poll_stop((struct us_poll_t *) s, s->context->loop); bsd_close_socket(us_poll_fd((struct us_poll_t *) s)); /* Link this socket to the close-list and let it be deleted after this iteration */ s->next = s->context->loop->data.closed_head; s->context->loop->data.closed_head = s; /* Any socket with prev = context is marked as closed */ s->prev = (struct us_socket_t *) s->context; return s->context->on_close(s, code, reason); } return s; } /* Not shared with SSL */ void *us_socket_get_native_handle(int ssl, struct us_socket_t *s) { #ifndef LIBUS_NO_SSL if (ssl) { return us_internal_ssl_socket_get_native_handle((struct us_internal_ssl_socket_t *) s); } #endif return (void *) (uintptr_t) us_poll_fd((struct us_poll_t *) s); } int us_socket_write(int ssl, struct us_socket_t *s, const char *data, int length, int msg_more) { #ifndef LIBUS_NO_SSL if (ssl) { return us_internal_ssl_socket_write((struct us_internal_ssl_socket_t *) s, data, length, msg_more); } #endif if (us_socket_is_closed(ssl, s) || us_socket_is_shut_down(ssl, s)) { return 0; } int written = bsd_send(us_poll_fd(&s->p), data, length, msg_more); if (written != length) { s->context->loop->data.last_write_failed = 1; us_poll_change(&s->p, s->context->loop, LIBUS_SOCKET_READABLE | LIBUS_SOCKET_WRITABLE); } return written < 0 ? 0 : written; } void *us_socket_ext(int ssl, struct us_socket_t *s) { #ifndef LIBUS_NO_SSL if (ssl) { return us_internal_ssl_socket_ext((struct us_internal_ssl_socket_t *) s); } #endif return s + 1; } int us_socket_is_shut_down(int ssl, struct us_socket_t *s) { #ifndef LIBUS_NO_SSL if (ssl) { return us_internal_ssl_socket_is_shut_down((struct us_internal_ssl_socket_t *) s); } #endif return us_internal_poll_type(&s->p) == POLL_TYPE_SOCKET_SHUT_DOWN; } void us_socket_shutdown(int ssl, struct us_socket_t *s) { #ifndef LIBUS_NO_SSL if (ssl) { us_internal_ssl_socket_shutdown((struct us_internal_ssl_socket_t *) s); return; } #endif /* Todo: should we emit on_close if calling shutdown on an already half-closed socket? * We need more states in that case, we need to track RECEIVED_FIN * so far, the app has to track this and call close as needed */ if (!us_socket_is_closed(ssl, s) && !us_socket_is_shut_down(ssl, s)) { us_internal_poll_set_type(&s->p, POLL_TYPE_SOCKET_SHUT_DOWN); us_poll_change(&s->p, s->context->loop, us_poll_events(&s->p) & LIBUS_SOCKET_READABLE); bsd_shutdown_socket(us_poll_fd((struct us_poll_t *) s)); } } ================================================ FILE: nerd_modules/http/httplib/uWS/App.h ================================================ /* * Authored by Alex Hultman, 2018-2020. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UWS_APP_H #define UWS_APP_H /* An app is a convenience wrapper of some of the most used fuctionalities and allows a * builder-pattern kind of init. Apps operate on the implicit thread local Loop */ #include "HttpContext.h" #include "HttpResponse.h" #include "WebSocketContext.h" #include "WebSocket.h" #include "PerMessageDeflate.h" namespace uWS { /* This one matches us_socket_context_options_t but has default values */ struct SocketContextOptions { const char *key_file_name = nullptr; const char *cert_file_name = nullptr; const char *passphrase = nullptr; const char *dh_params_file_name = nullptr; const char *ca_file_name = nullptr; int ssl_prefer_low_memory_usage = 0; /* Conversion operator used internally */ operator struct us_socket_context_options_t() const { struct us_socket_context_options_t socket_context_options; memcpy(&socket_context_options, this, sizeof(SocketContextOptions)); return socket_context_options; } }; static_assert(sizeof(struct us_socket_context_options_t) == sizeof(SocketContextOptions), "Mismatching uSockets/uWebSockets ABI"); template struct TemplatedApp { private: /* The app always owns at least one http context, but creates websocket contexts on demand */ HttpContext *httpContext; std::vector *> webSocketContexts; public: /* Server name */ TemplatedApp &&addServerName(std::string hostname_pattern, SocketContextOptions options = {}) { us_socket_context_add_server_name(SSL, (struct us_socket_context_t *) httpContext, hostname_pattern.c_str(), options); return std::move(*this); } TemplatedApp &&removeServerName(std::string hostname_pattern) { us_socket_context_remove_server_name(SSL, (struct us_socket_context_t *) httpContext, hostname_pattern.c_str()); return std::move(*this); } TemplatedApp &&missingServerName(MoveOnlyFunction handler) { if (!constructorFailed()) { httpContext->getSocketContextData()->missingServerNameHandler = std::move(handler); us_socket_context_on_server_name(SSL, (struct us_socket_context_t *) httpContext, [](struct us_socket_context_t *context, const char *hostname) { /* This is the only requirements of being friends with HttpContextData */ HttpContext *httpContext = (HttpContext *) context; httpContext->getSocketContextData()->missingServerNameHandler(hostname); }); } return std::move(*this); } /* Returns the SSL_CTX of this app, or nullptr. */ void *getNativeHandle() { return us_socket_context_get_native_handle(SSL, (struct us_socket_context_t *) httpContext); } /* Attaches a "filter" function to track socket connections/disconnections */ void filter(MoveOnlyFunction *, int)> &&filterHandler) { httpContext->filter(std::move(filterHandler)); } /* Publishes a message to all websocket contexts - conceptually as if publishing to the one single * TopicTree of this app (technically there are many TopicTrees, however the concept is that one * app has one conceptual Topic tree) */ void publish(std::string_view topic, std::string_view message, OpCode opCode, bool compress = false) { for (auto *webSocketContext : webSocketContexts) { webSocketContext->getExt()->publish(topic, message, opCode, compress); } } /* Returns number of subscribers for this topic, or 0 for failure. * This function should probably be optimized a lot in future releases, * it could be O(1) with a hash map of fullnames and their counts. */ unsigned int numSubscribers(std::string_view topic) { unsigned int subscribers = 0; for (auto *webSocketContext : webSocketContexts) { auto *webSocketContextData = webSocketContext->getExt(); Topic *t = webSocketContextData->topicTree.lookupTopic(topic); if (t) { subscribers += t->subs.size(); } } return subscribers; } ~TemplatedApp() { /* Let's just put everything here */ if (httpContext) { httpContext->free(); for (auto *webSocketContext : webSocketContexts) { webSocketContext->free(); } } } /* Disallow copying, only move */ TemplatedApp(const TemplatedApp &other) = delete; TemplatedApp(TemplatedApp &&other) { /* Move HttpContext */ httpContext = other.httpContext; other.httpContext = nullptr; /* Move webSocketContexts */ webSocketContexts = std::move(other.webSocketContexts); } TemplatedApp(SocketContextOptions options = {}) { httpContext = HttpContext::create(Loop::get(), options); } bool constructorFailed() { return !httpContext; } template struct WebSocketBehavior { /* Disabled compression by default - probably a bad default */ CompressOptions compression = DISABLED; /* Maximum message size we can receive */ unsigned int maxPayloadLength = 16 * 1024; /* 2 minutes timeout is good */ unsigned short idleTimeout = 120; /* 64kb backpressure is probably good */ unsigned int maxBackpressure = 64 * 1024; bool closeOnBackpressureLimit = false; /* This one depends on kernel timeouts and is a bad default */ bool resetIdleTimeoutOnSend = false; /* A good default, esp. for newcomers */ bool sendPingsAutomatically = true; /* Maximum socket lifetime in seconds before forced closure (defaults to disabled) */ unsigned short maxLifetime = 0; MoveOnlyFunction *, HttpRequest *, struct us_socket_context_t *)> upgrade = nullptr; MoveOnlyFunction *)> open = nullptr; MoveOnlyFunction *, std::string_view, OpCode)> message = nullptr; MoveOnlyFunction *)> drain = nullptr; MoveOnlyFunction *, std::string_view)> ping = nullptr; MoveOnlyFunction *, std::string_view)> pong = nullptr; MoveOnlyFunction *, int, std::string_view)> close = nullptr; }; template TemplatedApp &&ws(std::string pattern, WebSocketBehavior &&behavior) { /* Don't compile if alignment rules cannot be satisfied */ static_assert(alignof(UserData) <= LIBUS_EXT_ALIGNMENT, "µWebSockets cannot satisfy UserData alignment requirements. You need to recompile µSockets with LIBUS_EXT_ALIGNMENT adjusted accordingly."); if (!httpContext) { return std::move(*this); } /* Terminate on misleading idleTimeout values */ if (behavior.idleTimeout && behavior.idleTimeout < 8) { std::cerr << "Error: idleTimeout must be either 0 or greater than 8!" << std::endl; std::terminate(); } if (behavior.idleTimeout % 4) { std::cerr << "Warning: idleTimeout should be a multiple of 4!" << std::endl; } /* Every route has its own websocket context with its own behavior and user data type */ auto *webSocketContext = WebSocketContext::create(Loop::get(), (us_socket_context_t *) httpContext); /* Add all other WebSocketContextData to this new WebSocketContextData */ for (WebSocketContext *adjacentWebSocketContext : webSocketContexts) { webSocketContext->getExt()->adjacentWebSocketContextDatas.push_back(adjacentWebSocketContext->getExt()); } /* Add this WebSocketContextData to all other WebSocketContextData */ for (WebSocketContext *adjacentWebSocketContext : webSocketContexts) { adjacentWebSocketContext->getExt()->adjacentWebSocketContextDatas.push_back((WebSocketContextData *) webSocketContext->getExt()); } /* We need to clear this later on */ webSocketContexts.push_back((WebSocketContext *) webSocketContext); /* Quick fix to disable any compression if set */ #ifdef UWS_NO_ZLIB behavior.compression = DISABLED; #endif /* If we are the first one to use compression, initialize it */ if (behavior.compression) { LoopData *loopData = (LoopData *) us_loop_ext(us_socket_context_loop(SSL, webSocketContext->getSocketContext())); /* Initialize loop's deflate inflate streams */ if (!loopData->zlibContext) { loopData->zlibContext = new ZlibContext; loopData->inflationStream = new InflationStream; loopData->deflationStream = new DeflationStream(CompressOptions::DEDICATED_COMPRESSOR); } } /* Copy all handlers */ webSocketContext->getExt()->openHandler = std::move(behavior.open); webSocketContext->getExt()->messageHandler = std::move(behavior.message); webSocketContext->getExt()->drainHandler = std::move(behavior.drain); webSocketContext->getExt()->closeHandler = std::move([closeHandler = std::move(behavior.close)](WebSocket *ws, int code, std::string_view message) mutable { if (closeHandler) { closeHandler(ws, code, message); } /* Destruct user data after returning from close handler */ ((UserData *) ws->getUserData())->~UserData(); }); webSocketContext->getExt()->pingHandler = std::move(behavior.ping); webSocketContext->getExt()->pongHandler = std::move(behavior.pong); /* Copy settings */ webSocketContext->getExt()->maxPayloadLength = behavior.maxPayloadLength; webSocketContext->getExt()->maxBackpressure = behavior.maxBackpressure; webSocketContext->getExt()->closeOnBackpressureLimit = behavior.closeOnBackpressureLimit; webSocketContext->getExt()->resetIdleTimeoutOnSend = behavior.resetIdleTimeoutOnSend; webSocketContext->getExt()->sendPingsAutomatically = behavior.sendPingsAutomatically; webSocketContext->getExt()->compression = behavior.compression; /* Calculate idleTimeoutCompnents */ webSocketContext->getExt()->calculateIdleTimeoutCompnents(behavior.idleTimeout); httpContext->onHttp("get", pattern, [webSocketContext, behavior = std::move(behavior)](auto *res, auto *req) mutable { /* If we have this header set, it's a websocket */ std::string_view secWebSocketKey = req->getHeader("sec-websocket-key"); if (secWebSocketKey.length() == 24) { /* Emit upgrade handler */ if (behavior.upgrade) { behavior.upgrade(res, req, (struct us_socket_context_t *) webSocketContext); } else { /* Default handler upgrades to WebSocket */ std::string_view secWebSocketProtocol = req->getHeader("sec-websocket-protocol"); std::string_view secWebSocketExtensions = req->getHeader("sec-websocket-extensions"); res->template upgrade({}, secWebSocketKey, secWebSocketProtocol, secWebSocketExtensions, (struct us_socket_context_t *) webSocketContext); } /* We are going to get uncorked by the Http get return */ /* We do not need to check for any close or shutdown here as we immediately return from get handler */ } else { /* Tell the router that we did not handle this request */ req->setYield(true); } }, true); return std::move(*this); } TemplatedApp &&get(std::string pattern, MoveOnlyFunction *, HttpRequest *)> &&handler) { if (httpContext) { httpContext->onHttp("get", pattern, std::move(handler)); } return std::move(*this); } TemplatedApp &&post(std::string pattern, MoveOnlyFunction *, HttpRequest *)> &&handler) { if (httpContext) { httpContext->onHttp("post", pattern, std::move(handler)); } return std::move(*this); } TemplatedApp &&options(std::string pattern, MoveOnlyFunction *, HttpRequest *)> &&handler) { if (httpContext) { httpContext->onHttp("options", pattern, std::move(handler)); } return std::move(*this); } TemplatedApp &&del(std::string pattern, MoveOnlyFunction *, HttpRequest *)> &&handler) { if (httpContext) { httpContext->onHttp("delete", pattern, std::move(handler)); } return std::move(*this); } TemplatedApp &&patch(std::string pattern, MoveOnlyFunction *, HttpRequest *)> &&handler) { if (httpContext) { httpContext->onHttp("patch", pattern, std::move(handler)); } return std::move(*this); } TemplatedApp &&put(std::string pattern, MoveOnlyFunction *, HttpRequest *)> &&handler) { if (httpContext) { httpContext->onHttp("put", pattern, std::move(handler)); } return std::move(*this); } TemplatedApp &&head(std::string pattern, MoveOnlyFunction *, HttpRequest *)> &&handler) { if (httpContext) { httpContext->onHttp("head", pattern, std::move(handler)); } return std::move(*this); } TemplatedApp &&connect(std::string pattern, MoveOnlyFunction *, HttpRequest *)> &&handler) { if (httpContext) { httpContext->onHttp("connect", pattern, std::move(handler)); } return std::move(*this); } TemplatedApp &&trace(std::string pattern, MoveOnlyFunction *, HttpRequest *)> &&handler) { if (httpContext) { httpContext->onHttp("trace", pattern, std::move(handler)); } return std::move(*this); } /* This one catches any method */ TemplatedApp &&any(std::string pattern, MoveOnlyFunction *, HttpRequest *)> &&handler) { if (httpContext) { httpContext->onHttp("*", pattern, std::move(handler)); } return std::move(*this); } /* Host, port, callback */ TemplatedApp &&listen(std::string host, int port, MoveOnlyFunction &&handler) { if (!host.length()) { return listen(port, std::move(handler)); } handler(httpContext ? httpContext->listen(host.c_str(), port, 0) : nullptr); return std::move(*this); } /* Host, port, options, callback */ TemplatedApp &&listen(std::string host, int port, int options, MoveOnlyFunction &&handler) { if (!host.length()) { return listen(port, options, std::move(handler)); } handler(httpContext ? httpContext->listen(host.c_str(), port, options) : nullptr); return std::move(*this); } /* Port, callback */ TemplatedApp &&listen(int port, MoveOnlyFunction &&handler) { handler(httpContext ? httpContext->listen(nullptr, port, 0) : nullptr); return std::move(*this); } /* Port, options, callback */ TemplatedApp &&listen(int port, int options, MoveOnlyFunction &&handler) { handler(httpContext ? httpContext->listen(nullptr, port, options) : nullptr); return std::move(*this); } TemplatedApp &&run() { uWS::run(); return std::move(*this); } }; typedef TemplatedApp App; typedef TemplatedApp SSLApp; } #endif // UWS_APP_H ================================================ FILE: nerd_modules/http/httplib/uWS/AsyncSocket.h ================================================ /* * Authored by Alex Hultman, 2018-2020. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UWS_ASYNCSOCKET_H #define UWS_ASYNCSOCKET_H /* This class implements async socket memory management strategies */ /* NOTE: Many unsigned/signed conversion warnings could be solved by moving from int length * to unsigned length for everything to/from uSockets - this would however remove the opportunity * to signal error with -1 (which is how the entire UNIX syscalling is built). */ #include "LoopData.h" #include "AsyncSocketData.h" namespace uWS { template struct WebSocketContext; template struct AsyncSocket { template friend struct HttpContext; template friend struct WebSocketContext; template friend struct WebSocketContextData; friend struct TopicTree; protected: /* Returns SSL pointer or FD as pointer */ void *getNativeHandle() { return us_socket_get_native_handle(SSL, (us_socket_t *) this); } /* Get loop data for socket */ LoopData *getLoopData() { return (LoopData *) us_loop_ext(us_socket_context_loop(SSL, us_socket_context(SSL, (us_socket_t *) this))); } /* Get socket extension */ AsyncSocketData *getAsyncSocketData() { return (AsyncSocketData *) us_socket_ext(SSL, (us_socket_t *) this); } /* Socket timeout */ void timeout(unsigned int seconds) { us_socket_timeout(SSL, (us_socket_t *) this, seconds); } /* Shutdown socket without any automatic drainage */ void shutdown() { us_socket_shutdown(SSL, (us_socket_t *) this); } /* Immediately close socket */ us_socket_t *close() { return us_socket_close(SSL, (us_socket_t *) this, 0, nullptr); } /* Cork this socket. Only one socket may ever be corked per-loop at any given time */ void cork() { /* What if another socket is corked? */ getLoopData()->corkedSocket = this; } /* Returns wheter we are corked or not */ bool isCorked() { return getLoopData()->corkedSocket == this; } /* Returns whether we could cork (it is free) */ bool canCork() { return getLoopData()->corkedSocket == nullptr; } /* Returns a suitable buffer for temporary assemblation of send data */ std::pair getSendBuffer(size_t size) { /* If we are corked and we have room, return the cork buffer itself */ LoopData *loopData = getLoopData(); if (loopData->corkedSocket == this && loopData->corkOffset + size < LoopData::CORK_BUFFER_SIZE) { char *sendBuffer = loopData->corkBuffer + loopData->corkOffset; loopData->corkOffset += (unsigned int) size; return {sendBuffer, false}; } else { /* Slow path for now, we want to always be corked if possible */ return {(char *) malloc(size), true}; } } /* Returns the user space backpressure. */ unsigned int getBufferedAmount() { return (unsigned int) getAsyncSocketData()->buffer.size(); } /* Returns the text representation of an IPv4 or IPv6 address */ std::string_view addressAsText(std::string_view binary) { static thread_local char buf[64]; int ipLength = 0; if (!binary.length()) { return {}; } unsigned char *b = (unsigned char *) binary.data(); if (binary.length() == 4) { ipLength = sprintf(buf, "%u.%u.%u.%u", b[0], b[1], b[2], b[3]); } else { ipLength = sprintf(buf, "%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x", b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8], b[9], b[10], b[11], b[12], b[13], b[14], b[15]); } return {buf, (unsigned int) ipLength}; } /* Returns the remote IP address or empty string on failure */ std::string_view getRemoteAddress() { static thread_local char buf[16]; int ipLength = 16; us_socket_remote_address(SSL, (us_socket_t *) this, buf, &ipLength); return std::string_view(buf, (unsigned int) ipLength); } /* Returns the text representation of IP */ std::string_view getRemoteAddressAsText() { return addressAsText(getRemoteAddress()); } /* Write in three levels of prioritization: cork-buffer, syscall, socket-buffer. Always drain if possible. * Returns pair of bytes written (anywhere) and wheter or not this call resulted in the polling for * writable (or we are in a state that implies polling for writable). */ std::pair write(const char *src, int length, bool optionally = false, int nextLength = 0) { /* Fake success if closed, simple fix to allow uncork of closed socket to succeed */ if (us_socket_is_closed(SSL, (us_socket_t *) this)) { return {length, false}; } LoopData *loopData = getLoopData(); AsyncSocketData *asyncSocketData = getAsyncSocketData(); /* We are limited if we have a per-socket buffer */ if (asyncSocketData->buffer.length()) { /* Write off as much as we can */ int written = us_socket_write(SSL, (us_socket_t *) this, asyncSocketData->buffer.data(), (int) asyncSocketData->buffer.length(), /*nextLength != 0 | */length); /* On failure return, otherwise continue down the function */ if ((unsigned int) written < asyncSocketData->buffer.length()) { /* Update buffering (todo: we can do better here if we keep track of what happens to this guy later on) */ asyncSocketData->buffer = asyncSocketData->buffer.substr((size_t) written); if (optionally) { /* Thankfully we can exit early here */ return {0, true}; } else { /* This path is horrible and points towards erroneous usage */ asyncSocketData->buffer.append(src, (unsigned int) length); return {length, true}; } } /* At this point we simply have no buffer and can continue as normal */ asyncSocketData->buffer.clear(); } if (length) { if (loopData->corkedSocket == this) { /* We are corked */ if (LoopData::CORK_BUFFER_SIZE - loopData->corkOffset >= (unsigned int) length) { /* If the entire chunk fits in cork buffer */ memcpy(loopData->corkBuffer + loopData->corkOffset, src, (unsigned int) length); loopData->corkOffset += (unsigned int) length; /* Fall through to default return */ } else { /* Strategy differences between SSL and non-SSL regarding syscall minimizing */ if constexpr (SSL) { /* Cork up as much as we can */ unsigned int stripped = LoopData::CORK_BUFFER_SIZE - loopData->corkOffset; memcpy(loopData->corkBuffer + loopData->corkOffset, src, stripped); loopData->corkOffset = LoopData::CORK_BUFFER_SIZE; auto [written, failed] = uncork(src + stripped, length - (int) stripped, optionally); return {written + (int) stripped, failed}; } /* For non-SSL we take the penalty of two syscalls */ return uncork(src, length, optionally); } } else { /* We are not corked */ int written = us_socket_write(SSL, (us_socket_t *) this, src, length, nextLength != 0); /* Did we fail? */ if (written < length) { /* If the write was optional then just bail out */ if (optionally) { return {written, true}; } /* Fall back to worst possible case (should be very rare for HTTP) */ /* At least we can reserve room for next chunk if we know it up front */ if (nextLength) { asyncSocketData->buffer.reserve(asyncSocketData->buffer.length() + (size_t) (length - written + nextLength)); } /* Buffer this chunk */ asyncSocketData->buffer.append(src + written, (size_t) (length - written)); /* Return the failure */ return {length, true}; } /* Fall through to default return */ } } /* Default fall through return */ return {length, false}; } /* Uncork this socket and flush or buffer any corked and/or passed data. It is essential to remember doing this. */ /* It does NOT count bytes written from cork buffer (they are already accounted for in the write call responsible for its corking)! */ std::pair uncork(const char *src = nullptr, int length = 0, bool optionally = false) { LoopData *loopData = getLoopData(); if (loopData->corkedSocket == this) { loopData->corkedSocket = nullptr; if (loopData->corkOffset) { /* Corked data is already accounted for via its write call */ auto [written, failed] = write(loopData->corkBuffer, (int) loopData->corkOffset, false, length); loopData->corkOffset = 0; if (failed) { /* We do not need to care for buffering here, write does that */ return {0, true}; } } /* We should only return with new writes, not things written to cork already */ return write(src, length, optionally, 0); } else { /* We are not even corked! */ return {0, false}; } } }; } #endif // UWS_ASYNCSOCKET_H ================================================ FILE: nerd_modules/http/httplib/uWS/AsyncSocketData.h ================================================ /* * Authored by Alex Hultman, 2018-2019. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UWS_ASYNCSOCKETDATA_H #define UWS_ASYNCSOCKETDATA_H #include namespace uWS { /* Depending on how we want AsyncSocket to function, this will need to change */ template struct AsyncSocketData { /* This will do for now */ std::string buffer; /* Allow move constructing us */ AsyncSocketData(std::string &&backpressure) : buffer(std::move(backpressure)) { } /* Or emppty */ AsyncSocketData() = default; }; } #endif // UWS_ASYNCSOCKETDATA_H ================================================ FILE: nerd_modules/http/httplib/uWS/BloomFilter.h ================================================ /* * Authored by Alex Hultman, 2018-2019. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UWS_BLOOMFILTER_H #define UWS_BLOOMFILTER_H /* This filter has a decently low amount of false positives for the * standard and non-standard common request headers */ #include #include namespace uWS { struct BloomFilter { private: std::bitset<512> filter; unsigned int hash1(std::string_view key) { return ((size_t)key[key.length() - 1] - (key.length() << 3)) & 511; } unsigned int hash2(std::string_view key) { return (((size_t)key[0] + (key.length() << 4)) & 511); } unsigned int hash3(std::string_view key) { return ((unsigned int)key[key.length() - 2] - 97 - (key.length() << 5)) & 511; } public: bool mightHave(std::string_view key) { return filter.test(hash1(key)) && filter.test(hash2(key)) && (key.length() < 2 || filter.test(hash3(key))); } void add(std::string_view key) { filter.set(hash1(key)); filter.set(hash2(key)); if (key.length() >= 2) { filter.set(hash3(key)); } } void reset() { filter.reset(); } }; } #endif // UWS_BLOOMFILTER_H ================================================ FILE: nerd_modules/http/httplib/uWS/HttpContext.h ================================================ /* * Authored by Alex Hultman, 2018-2020. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UWS_HTTPCONTEXT_H #define UWS_HTTPCONTEXT_H /* This class defines the main behavior of HTTP and emits various events */ #include "Loop.h" #include "HttpContextData.h" #include "HttpResponseData.h" #include "AsyncSocket.h" #include "WebSocketData.h" #include #include #include "MoveOnlyFunction.h" namespace uWS { template struct HttpResponse; template struct HttpContext { template friend struct TemplatedApp; template friend struct HttpResponse; private: HttpContext() = delete; /* Maximum delay allowed until an HTTP connection is terminated due to outstanding request or rejected data (slow loris protection) */ static const int HTTP_IDLE_TIMEOUT_S = 10; us_socket_context_t *getSocketContext() { return (us_socket_context_t *) this; } static us_socket_context_t *getSocketContext(us_socket_t *s) { return (us_socket_context_t *) us_socket_context(SSL, s); } HttpContextData *getSocketContextData() { return (HttpContextData *) us_socket_context_ext(SSL, getSocketContext()); } static HttpContextData *getSocketContextDataS(us_socket_t *s) { return (HttpContextData *) us_socket_context_ext(SSL, getSocketContext(s)); } /* Init the HttpContext by registering libusockets event handlers */ HttpContext *init() { /* Handle socket connections */ us_socket_context_on_open(SSL, getSocketContext(), [](us_socket_t *s, int /*is_client*/, char */*ip*/, int /*ip_length*/) { /* Any connected socket should timeout until it has a request */ us_socket_timeout(SSL, s, HTTP_IDLE_TIMEOUT_S); /* Init socket ext */ new (us_socket_ext(SSL, s)) HttpResponseData; /* Call filter */ HttpContextData *httpContextData = getSocketContextDataS(s); for (auto &f : httpContextData->filterHandlers) { f((HttpResponse *) s, 1); } return s; }); /* Handle socket disconnections */ us_socket_context_on_close(SSL, getSocketContext(), [](us_socket_t *s, int /*code*/, void */*reason*/) { /* Get socket ext */ HttpResponseData *httpResponseData = (HttpResponseData *) us_socket_ext(SSL, s); /* Call filter */ HttpContextData *httpContextData = getSocketContextDataS(s); for (auto &f : httpContextData->filterHandlers) { f((HttpResponse *) s, -1); } /* Signal broken HTTP request only if we have a pending request */ if (httpResponseData->onAborted) { httpResponseData->onAborted(); } /* Destruct socket ext */ httpResponseData->~HttpResponseData(); return s; }); /* Handle HTTP data streams */ us_socket_context_on_data(SSL, getSocketContext(), [](us_socket_t *s, char *data, int length) { // total overhead is about 210k down to 180k // ~210k req/sec is the original perf with write in data // ~200k req/sec is with cork and formatting // ~190k req/sec is with http parsing // ~180k - 190k req/sec is with varying routing HttpContextData *httpContextData = getSocketContextDataS(s); /* Do not accept any data while in shutdown state */ if (us_socket_is_shut_down(SSL, (us_socket_t *) s)) { return s; } HttpResponseData *httpResponseData = (HttpResponseData *) us_socket_ext(SSL, s); /* Cork this socket */ ((AsyncSocket *) s)->cork(); /* Mark that we are inside the parser now */ httpContextData->isParsingHttp = true; // clients need to know the cursor after http parse, not servers! // how far did we read then? we need to know to continue with websocket parsing data? or? void *proxyParser = nullptr; #ifdef UWS_WITH_PROXY proxyParser = &httpResponseData->proxyParser; #endif /* The return value is entirely up to us to interpret. The HttpParser only care for whether the returned value is DIFFERENT or not from passed user */ void *returnedSocket = httpResponseData->consumePostPadded(data, (unsigned int) length, s, proxyParser, [httpContextData](void *s, HttpRequest *httpRequest) -> void * { /* For every request we reset the timeout and hang until user makes action */ /* Warning: if we are in shutdown state, resetting the timer is a security issue! */ us_socket_timeout(SSL, (us_socket_t *) s, 0); /* Reset httpResponse */ HttpResponseData *httpResponseData = (HttpResponseData *) us_socket_ext(SSL, (us_socket_t *) s); httpResponseData->offset = 0; /* Are we not ready for another request yet? Terminate the connection. */ if (httpResponseData->state & HttpResponseData::HTTP_RESPONSE_PENDING) { us_socket_close(SSL, (us_socket_t *) s, 0, nullptr); return nullptr; } /* Mark pending request and emit it */ httpResponseData->state = HttpResponseData::HTTP_RESPONSE_PENDING; /* Mark this response as connectionClose if ancient or connection: close */ if (httpRequest->isAncient() || httpRequest->getHeader("connection").length() == 5) { httpResponseData->state |= HttpResponseData::HTTP_CONNECTION_CLOSE; } /* Route the method and URL */ httpContextData->router.getUserData() = {(HttpResponse *) s, httpRequest}; if (!httpContextData->router.route(httpRequest->getMethod(), httpRequest->getUrl())) { /* We have to force close this socket as we have no handler for it */ us_socket_close(SSL, (us_socket_t *) s, 0, nullptr); return nullptr; } /* First of all we need to check if this socket was deleted due to upgrade */ if (httpContextData->upgradedWebSocket) { /* We differ between closed and upgraded below */ return nullptr; } /* Was the socket closed? */ if (us_socket_is_closed(SSL, (struct us_socket_t *) s)) { return nullptr; } /* We absolutely have to terminate parsing if shutdown */ if (us_socket_is_shut_down(SSL, (us_socket_t *) s)) { return nullptr; } /* Returning from a request handler without responding or attaching an onAborted handler is ill-use */ if (!((HttpResponse *) s)->hasResponded() && !httpResponseData->onAborted) { /* Throw exception here? */ std::cerr << "Error: Returning from a request handler without responding or attaching an abort handler is forbidden!" << std::endl; std::terminate(); } /* If we have not responded and we have a data handler, we need to timeout to enfore client sending the data */ if (!((HttpResponse *) s)->hasResponded() && httpResponseData->inStream) { us_socket_timeout(SSL, (us_socket_t *) s, HTTP_IDLE_TIMEOUT_S); } /* Continue parsing */ return s; }, [httpResponseData](void *user, std::string_view data, bool fin) -> void * { /* We always get an empty chunk even if there is no data */ if (httpResponseData->inStream) { /* Todo: can this handle timeout for non-post as well? */ if (fin) { /* If we just got the last chunk (or empty chunk), disable timeout */ us_socket_timeout(SSL, (struct us_socket_t *) user, 0); } else { /* We still have some more data coming in later, so reset timeout */ us_socket_timeout(SSL, (struct us_socket_t *) user, HTTP_IDLE_TIMEOUT_S); } /* We might respond in the handler, so do not change timeout after this */ httpResponseData->inStream(data, fin); /* Was the socket closed? */ if (us_socket_is_closed(SSL, (struct us_socket_t *) user)) { return nullptr; } /* We absolutely have to terminate parsing if shutdown */ if (us_socket_is_shut_down(SSL, (us_socket_t *) user)) { return nullptr; } /* If we were given the last data chunk, reset data handler to ensure following * requests on the same socket won't trigger any previously registered behavior */ if (fin) { httpResponseData->inStream = nullptr; } } return user; }, [](void *user) { /* Close any socket on HTTP errors */ us_socket_close(SSL, (us_socket_t *) user, 0, nullptr); return nullptr; }); /* Mark that we are no longer parsing Http */ httpContextData->isParsingHttp = false; /* We need to uncork in all cases, except for nullptr (closed socket, or upgraded socket) */ if (returnedSocket != nullptr) { /* Timeout on uncork failure */ auto [written, failed] = ((AsyncSocket *) returnedSocket)->uncork(); if (failed) { /* All Http sockets timeout by this, and this behavior match the one in HttpResponse::cork */ /* Warning: both HTTP_IDLE_TIMEOUT_S and HTTP_TIMEOUT_S are 10 seconds and both are used the same */ ((AsyncSocket *) s)->timeout(HTTP_IDLE_TIMEOUT_S); } /* We need to check if we should close this socket here now */ if (httpResponseData->state & HttpResponseData::HTTP_CONNECTION_CLOSE) { if ((httpResponseData->state & HttpResponseData::HTTP_RESPONSE_PENDING) == 0) { if (((AsyncSocket *) s)->getBufferedAmount() == 0) { ((AsyncSocket *) s)->shutdown(); /* We need to force close after sending FIN since we want to hinder * clients from keeping to send their huge data */ ((AsyncSocket *) s)->close(); } } } return (us_socket_t *) returnedSocket; } /* If we upgraded, check here (differ between nullptr close and nullptr upgrade) */ if (httpContextData->upgradedWebSocket) { /* This path is only for upgraded websockets */ AsyncSocket *asyncSocket = (AsyncSocket *) httpContextData->upgradedWebSocket; /* Uncork here as well (note: what if we failed to uncork and we then pub/sub before we even upgraded?) */ auto [written, failed] = asyncSocket->uncork(); /* If we succeeded in uncorking, check if we have sent WebSocket FIN */ if (!failed) { WebSocketData *webSocketData = (WebSocketData *) asyncSocket->getAsyncSocketData(); if (webSocketData->isShuttingDown) { /* In that case, also send TCP FIN (this is similar to what we have in ws drain handler) */ asyncSocket->shutdown(); } } /* Reset upgradedWebSocket before we return */ httpContextData->upgradedWebSocket = nullptr; /* Return the new upgraded websocket */ return (us_socket_t *) asyncSocket; } /* It is okay to uncork a closed socket and we need to */ ((AsyncSocket *) s)->uncork(); /* We cannot return nullptr to the underlying stack in any case */ return s; }); /* Handle HTTP write out (note: SSL_read may trigger this spuriously, the app need to handle spurious calls) */ us_socket_context_on_writable(SSL, getSocketContext(), [](us_socket_t *s) { AsyncSocket *asyncSocket = (AsyncSocket *) s; HttpResponseData *httpResponseData = (HttpResponseData *) asyncSocket->getAsyncSocketData(); /* Ask the developer to write data and return success (true) or failure (false), OR skip sending anything and return success (true). */ if (httpResponseData->onWritable) { /* We are now writable, so hang timeout again, the user does not have to do anything so we should hang until end or tryEnd rearms timeout */ us_socket_timeout(SSL, s, 0); /* We expect the developer to return whether or not write was successful (true). * If write was never called, the developer should still return true so that we may drain. */ bool success = httpResponseData->onWritable(httpResponseData->offset); /* The developer indicated that their onWritable failed. */ if (!success) { /* Skip testing if we can drain anything since that might perform an extra syscall */ return s; } /* We don't want to fall through since we don't want to mess with timeout. * It makes little sense to drain any backpressure when the user has registered onWritable. */ return s; } /* Drain any socket buffer, this might empty our backpressure and thus finish the request */ /*auto [written, failed] = */asyncSocket->write(nullptr, 0, true, 0); /* Should we close this connection after a response - and is this response really done? */ if (httpResponseData->state & HttpResponseData::HTTP_CONNECTION_CLOSE) { if ((httpResponseData->state & HttpResponseData::HTTP_RESPONSE_PENDING) == 0) { if (asyncSocket->getBufferedAmount() == 0) { asyncSocket->shutdown(); /* We need to force close after sending FIN since we want to hinder * clients from keeping to send their huge data */ asyncSocket->close(); } } } /* Expect another writable event, or another request within the timeout */ asyncSocket->timeout(HTTP_IDLE_TIMEOUT_S); return s; }); /* Handle FIN, HTTP does not support half-closed sockets, so simply close */ us_socket_context_on_end(SSL, getSocketContext(), [](us_socket_t *s) { /* We do not care for half closed sockets */ AsyncSocket *asyncSocket = (AsyncSocket *) s; return asyncSocket->close(); }); /* Handle socket timeouts, simply close them so to not confuse client with FIN */ us_socket_context_on_timeout(SSL, getSocketContext(), [](us_socket_t *s) { /* Force close rather than gracefully shutdown and risk confusing the client with a complete download */ AsyncSocket *asyncSocket = (AsyncSocket *) s; return asyncSocket->close(); }); return this; } public: /* Construct a new HttpContext using specified loop */ static HttpContext *create(Loop *loop, us_socket_context_options_t options = {}) { HttpContext *httpContext; httpContext = (HttpContext *) us_create_socket_context(SSL, (us_loop_t *) loop, sizeof(HttpContextData), options); if (!httpContext) { return nullptr; } /* Init socket context data */ new ((HttpContextData *) us_socket_context_ext(SSL, (us_socket_context_t *) httpContext)) HttpContextData(); return httpContext->init(); } /* Destruct the HttpContext, it does not follow RAII */ void free() { /* Destruct socket context data */ HttpContextData *httpContextData = getSocketContextData(); httpContextData->~HttpContextData(); /* Free the socket context in whole */ us_socket_context_free(SSL, getSocketContext()); } void filter(MoveOnlyFunction *, int)> &&filterHandler) { getSocketContextData()->filterHandlers.emplace_back(std::move(filterHandler)); } /* Register an HTTP route handler acording to URL pattern */ void onHttp(std::string method, std::string pattern, MoveOnlyFunction *, HttpRequest *)> &&handler, bool upgrade = false) { HttpContextData *httpContextData = getSocketContextData(); /* Todo: This is ugly, fix */ std::vector methods; if (method == "*") { methods = httpContextData->router.methods; } else { methods = {method}; } httpContextData->router.add(methods, pattern, [handler = std::move(handler)](auto *r) mutable { auto user = r->getUserData(); user.httpRequest->setYield(false); user.httpRequest->setParameters(r->getParameters()); /* Middleware? Automatically respond to expectations */ std::string_view expect = user.httpRequest->getHeader("expect"); if (expect.length() && expect == "100-continue") { user.httpResponse->writeContinue(); } handler(user.httpResponse, user.httpRequest); /* If any handler yielded, the router will keep looking for a suitable handler. */ if (user.httpRequest->getYield()) { return false; } return true; }, method == "*" ? httpContextData->router.LOW_PRIORITY : (upgrade ? httpContextData->router.HIGH_PRIORITY : httpContextData->router.MEDIUM_PRIORITY)); } /* Listen to port using this HttpContext */ us_listen_socket_t *listen(const char *host, int port, int options) { return us_socket_context_listen(SSL, getSocketContext(), host, port, options, sizeof(HttpResponseData)); } }; } #endif // UWS_HTTPCONTEXT_H ================================================ FILE: nerd_modules/http/httplib/uWS/HttpContextData.h ================================================ /* * Authored by Alex Hultman, 2018-2020. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UWS_HTTPCONTEXTDATA_H #define UWS_HTTPCONTEXTDATA_H #include "HttpRouter.h" #include #include "MoveOnlyFunction.h" namespace uWS { template struct HttpResponse; struct HttpRequest; template struct alignas(16) HttpContextData { template friend struct HttpContext; template friend struct HttpResponse; template friend struct TemplatedApp; private: std::vector *, int)>> filterHandlers; MoveOnlyFunction missingServerNameHandler; struct RouterData { HttpResponse *httpResponse; HttpRequest *httpRequest; }; HttpRouter router; void *upgradedWebSocket = nullptr; bool isParsingHttp = false; }; } #endif // UWS_HTTPCONTEXTDATA_H ================================================ FILE: nerd_modules/http/httplib/uWS/HttpParser.h ================================================ /* * Authored by Alex Hultman, 2018-2020. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UWS_HTTPPARSER_H #define UWS_HTTPPARSER_H // todo: HttpParser is in need of a few clean-ups and refactorings /* The HTTP parser is an independent module subject to unit testing / fuzz testing */ #include #include #include #include "MoveOnlyFunction.h" #include "BloomFilter.h" #include "ProxyParser.h" #include "QueryParser.h" namespace uWS { /* We require at least this much post padding */ static const unsigned int MINIMUM_HTTP_POST_PADDING = 32; struct HttpRequest { friend struct HttpParser; private: const static int MAX_HEADERS = 50; struct Header { std::string_view key, value; } headers[MAX_HEADERS]; bool ancientHttp; unsigned int querySeparator; bool didYield; BloomFilter bf; std::pair currentParameters; public: bool isAncient() { return ancientHttp; } bool getYield() { return didYield; } /* Iteration over headers (key, value) */ struct HeaderIterator { Header *ptr; bool operator!=(const HeaderIterator &other) const { /* Comparison with end is a special case */ if (ptr != other.ptr) { return other.ptr || ptr->key.length(); } return false; } HeaderIterator &operator++() { ptr++; return *this; } std::pair operator*() const { return {ptr->key, ptr->value}; } }; HeaderIterator begin() { return {headers + 1}; } HeaderIterator end() { return {nullptr}; } /* If you do not want to handle this route */ void setYield(bool yield) { didYield = yield; } std::string_view getHeader(std::string_view lowerCasedHeader) { if (bf.mightHave(lowerCasedHeader)) { for (Header *h = headers; (++h)->key.length(); ) { if (h->key.length() == lowerCasedHeader.length() && !strncmp(h->key.data(), lowerCasedHeader.data(), lowerCasedHeader.length())) { return h->value; } } } return std::string_view(nullptr, 0); } std::string_view getUrl() { return std::string_view(headers->value.data(), querySeparator); } std::string_view getMethod() { return std::string_view(headers->key.data(), headers->key.length()); } /* Returns the raw querystring as a whole, still encoded */ std::string_view getQuery() { if (querySeparator < headers->value.length()) { /* Strip the initial ? */ return std::string_view(headers->value.data() + querySeparator + 1, headers->value.length() - querySeparator - 1); } else { return std::string_view(nullptr, 0); } } /* Finds and decodes the URI component. */ std::string_view getQuery(std::string_view key) { /* Raw querystring including initial '?' sign */ std::string_view queryString = std::string_view(headers->value.data() + querySeparator, headers->value.length() - querySeparator); return getDecodedQueryValue(key, queryString); } void setParameters(std::pair parameters) { currentParameters = parameters; } std::string_view getParameter(unsigned short index) { if (currentParameters.first < (int) index) { return {}; } else { return currentParameters.second[index]; } } }; struct HttpParser { private: std::string fallback; unsigned int remainingStreamingBytes = 0; const size_t MAX_FALLBACK_SIZE = 1024 * 4; static unsigned int toUnsignedInteger(std::string_view str) { unsigned int unsignedIntegerValue = 0; for (char c : str) { unsignedIntegerValue = unsignedIntegerValue * 10u + ((unsigned int) c - (unsigned int) '0'); } return unsignedIntegerValue; } static unsigned int getHeaders(char *postPaddedBuffer, char *end, struct HttpRequest::Header *headers, void *reserved) { char *preliminaryKey, *preliminaryValue, *start = postPaddedBuffer; #ifdef UWS_WITH_PROXY /* ProxyParser is passed as reserved parameter */ ProxyParser *pp = (ProxyParser *) reserved; /* Parse PROXY protocol */ auto [done, offset] = pp->parse({start, (size_t) (end - postPaddedBuffer)}); if (!done) { /* We do not reset the ProxyParser (on filure) since it is tied to this * connection, which is really only supposed to ever get one PROXY frame * anyways. We do however allow multiple PROXY frames to be sent (overwrites former). */ return 0; } else { /* We have consumed this data so skip it */ start += offset; } #else /* This one is unused */ (void) reserved; #endif /* It is critical for fallback buffering logic that we only return with success * if we managed to parse a complete HTTP request (minus data). Returning success * for PROXY means we can end up succeeding, yet leaving bytes in the fallback buffer * which is then removed, and our counters to flip due to overflow and we end up with a crash */ for (unsigned int i = 0; i < HttpRequest::MAX_HEADERS; i++) { for (preliminaryKey = postPaddedBuffer; (*postPaddedBuffer != ':') & (*postPaddedBuffer > 32); *(postPaddedBuffer++) |= 32); if (*postPaddedBuffer == '\r') { if ((postPaddedBuffer != end) & (postPaddedBuffer[1] == '\n') & (i > 0)) { headers->key = std::string_view(nullptr, 0); return (unsigned int) ((postPaddedBuffer + 2) - start); } else { return 0; } } else { headers->key = std::string_view(preliminaryKey, (size_t) (postPaddedBuffer - preliminaryKey)); for (postPaddedBuffer++; (*postPaddedBuffer == ':' || *postPaddedBuffer < 33) && *postPaddedBuffer != '\r'; postPaddedBuffer++); preliminaryValue = postPaddedBuffer; postPaddedBuffer = (char *) memchr(postPaddedBuffer, '\r', (size_t) (end - postPaddedBuffer)); if (postPaddedBuffer && postPaddedBuffer[1] == '\n') { headers->value = std::string_view(preliminaryValue, (size_t) (postPaddedBuffer - preliminaryValue)); postPaddedBuffer += 2; headers++; } else { return 0; } } } return 0; } // the only caller of getHeaders template std::pair fenceAndConsumePostPadded(char *data, unsigned int length, void *user, void *reserved, HttpRequest *req, MoveOnlyFunction &requestHandler, MoveOnlyFunction &dataHandler) { /* How much data we CONSUMED (to throw away) */ unsigned int consumedTotal = 0; /* Fence one byte past end of our buffer (buffer has post padded margins) */ data[length] = '\r'; for (unsigned int consumed; length && (consumed = getHeaders(data, data + length, req->headers, reserved)); ) { data += consumed; length -= consumed; consumedTotal += consumed; /* Store HTTP version (ancient 1.0 or 1.1) */ req->ancientHttp = req->headers->value.length() && (req->headers->value[req->headers->value.length() - 1] == '0'); /* Strip away tail of first "header value" aka URL */ req->headers->value = std::string_view(req->headers->value.data(), (size_t) std::max(0, (int) req->headers->value.length() - 9)); /* Add all headers to bloom filter */ req->bf.reset(); for (HttpRequest::Header *h = req->headers; (++h)->key.length(); ) { req->bf.add(h->key); } /* Parse query */ const char *querySeparatorPtr = (const char *) memchr(req->headers->value.data(), '?', req->headers->value.length()); req->querySeparator = (unsigned int) ((querySeparatorPtr ? querySeparatorPtr : req->headers->value.data() + req->headers->value.length()) - req->headers->value.data()); /* If returned socket is not what we put in we need * to break here as we either have upgraded to * WebSockets or otherwise closed the socket. */ void *returnedUser = requestHandler(user, req); if (returnedUser != user) { /* We are upgraded to WebSocket or otherwise broken */ return {consumedTotal, returnedUser}; } // todo: do not check this for GET (get should not have a body) // todo: also support reading chunked streams std::string_view contentLengthString = req->getHeader("content-length"); if (contentLengthString.length()) { remainingStreamingBytes = toUnsignedInteger(contentLengthString); if (!CONSUME_MINIMALLY) { unsigned int emittable = std::min(remainingStreamingBytes, length); dataHandler(user, std::string_view(data, emittable), emittable == remainingStreamingBytes); remainingStreamingBytes -= emittable; data += emittable; length -= emittable; consumedTotal += emittable; } } else { /* Still emit an empty data chunk to signal no data */ dataHandler(user, {}, true); } if (CONSUME_MINIMALLY) { break; } } return {consumedTotal, user}; } public: void *consumePostPadded(char *data, unsigned int length, void *user, void *reserved, MoveOnlyFunction &&requestHandler, MoveOnlyFunction &&dataHandler, MoveOnlyFunction &&errorHandler) { /* This resets BloomFilter by construction, but later we also reset it again. * Optimize this to skip resetting twice (req could be made global) */ HttpRequest req; if (remainingStreamingBytes) { // this is exactly the same as below! // todo: refactor this if (remainingStreamingBytes >= length) { void *returnedUser = dataHandler(user, std::string_view(data, length), remainingStreamingBytes == length); remainingStreamingBytes -= length; return returnedUser; } else { void *returnedUser = dataHandler(user, std::string_view(data, remainingStreamingBytes), true); data += remainingStreamingBytes; length -= remainingStreamingBytes; remainingStreamingBytes = 0; if (returnedUser != user) { return returnedUser; } } } else if (fallback.length()) { unsigned int had = (unsigned int) fallback.length(); size_t maxCopyDistance = std::min(MAX_FALLBACK_SIZE - fallback.length(), (size_t) length); /* We don't want fallback to be short string optimized, since we want to move it */ fallback.reserve(fallback.length() + maxCopyDistance + std::max(MINIMUM_HTTP_POST_PADDING, sizeof(std::string))); fallback.append(data, maxCopyDistance); // break here on break std::pair consumed = fenceAndConsumePostPadded(fallback.data(), (unsigned int) fallback.length(), user, reserved, &req, requestHandler, dataHandler); if (consumed.second != user) { return consumed.second; } if (consumed.first) { /* This logic assumes that we consumed everything in fallback buffer. * This is critically important, as we will get an integer overflow in case * of "had" being larger than what we consumed, and that we would drop data */ fallback.clear(); data += consumed.first - had; length -= consumed.first - had; if (remainingStreamingBytes) { // this is exactly the same as above! if (remainingStreamingBytes >= (unsigned int) length) { void *returnedUser = dataHandler(user, std::string_view(data, length), remainingStreamingBytes == (unsigned int) length); remainingStreamingBytes -= length; return returnedUser; } else { void *returnedUser = dataHandler(user, std::string_view(data, remainingStreamingBytes), true); data += remainingStreamingBytes; length -= remainingStreamingBytes; remainingStreamingBytes = 0; if (returnedUser != user) { return returnedUser; } } } } else { if (fallback.length() == MAX_FALLBACK_SIZE) { // note: you don't really need error handler, just return something strange! // we could have it return a constant pointer to denote error! return errorHandler(user); } return user; } } std::pair consumed = fenceAndConsumePostPadded(data, length, user, reserved, &req, requestHandler, dataHandler); if (consumed.second != user) { return consumed.second; } data += consumed.first; length -= consumed.first; if (length) { if (length < MAX_FALLBACK_SIZE) { fallback.append(data, length); } else { return errorHandler(user); } } // added for now return user; } }; } #endif // UWS_HTTPPARSER_H ================================================ FILE: nerd_modules/http/httplib/uWS/HttpResponse.h ================================================ /* * Authored by Alex Hultman, 2018-2020. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UWS_HTTPRESPONSE_H #define UWS_HTTPRESPONSE_H /* An HttpResponse is the channel on which you send back a response */ #include "AsyncSocket.h" #include "HttpResponseData.h" #include "HttpContextData.h" #include "Utilities.h" #include "WebSocketExtensions.h" #include "WebSocketHandshake.h" #include "WebSocket.h" #include "WebSocketContextData.h" #include "MoveOnlyFunction.h" /* todo: tryWrite is missing currently, only send smaller segments with write */ namespace uWS { /* Some pre-defined status constants to use with writeStatus */ static const char *HTTP_200_OK = "200 OK"; /* The general timeout for HTTP sockets */ static const int HTTP_TIMEOUT_S = 10; template struct HttpResponse : public AsyncSocket { /* Solely used for getHttpResponseData() */ template friend struct TemplatedApp; typedef AsyncSocket Super; private: HttpResponseData *getHttpResponseData() { return (HttpResponseData *) Super::getAsyncSocketData(); } /* Write an unsigned 32-bit integer in hex */ void writeUnsignedHex(unsigned int value) { char buf[10]; int length = utils::u32toaHex(value, buf); /* For now we do this copy */ Super::write(buf, length); } /* Write an unsigned 64-bit integer */ void writeUnsigned64(uint64_t value) { char buf[20]; int length = utils::u64toa(value, buf); /* For now we do this copy */ Super::write(buf, length); } /* When we are done with a response we mark it like so */ void markDone(HttpResponseData *httpResponseData) { httpResponseData->onAborted = nullptr; /* Also remove onWritable so that we do not emit when draining behind the scenes. */ httpResponseData->onWritable = nullptr; /* We are done with this request */ httpResponseData->state &= ~HttpResponseData::HTTP_RESPONSE_PENDING; } /* Returns true on success, indicating that it might be feasible to write more data. * Will start timeout if stream reaches totalSize or write failure. */ bool internalEnd(std::string_view data, uintmax_t totalSize, bool optional, bool allowContentLength = true, bool closeConnection = false) { /* Write status if not already done */ writeStatus(HTTP_200_OK); /* If no total size given then assume this chunk is everything */ if (!totalSize) { totalSize = data.length(); } HttpResponseData *httpResponseData = getHttpResponseData(); /* In some cases, such as when refusing huge data we want to close the connection when drained */ if (closeConnection) { /* HTTP 1.1 must send this back unless the client already sent it to us. * It is a connection close when either of the two parties say so but the * one party must tell the other one so. * * This check also serves to limit writing the header only once. */ if ((httpResponseData->state & HttpResponseData::HTTP_CONNECTION_CLOSE) == 0) { writeHeader("Connection", "close"); } httpResponseData->state |= HttpResponseData::HTTP_CONNECTION_CLOSE; } if (httpResponseData->state & HttpResponseData::HTTP_WRITE_CALLED) { /* We do not have tryWrite-like functionalities, so ignore optional in this path */ /* Do not allow sending 0 chunk here */ if (data.length()) { Super::write("\r\n", 2); writeUnsignedHex((unsigned int) data.length()); Super::write("\r\n", 2); /* Ignoring optional for now */ Super::write(data.data(), (int) data.length()); } /* Terminating 0 chunk */ Super::write("\r\n0\r\n\r\n", 7); markDone(httpResponseData); /* tryEnd can never fail when in chunked mode, since we do not have tryWrite (yet), only write */ Super::timeout(HTTP_TIMEOUT_S); return true; } else { /* Write content-length on first call */ if (!(httpResponseData->state & HttpResponseData::HTTP_END_CALLED)) { /* WebSocket upgrades does not allow content-length */ if (allowContentLength) { /* Even zero is a valid content-length */ Super::write("Content-Length: ", 16); writeUnsigned64(totalSize); Super::write("\r\n\r\n", 4); } else { Super::write("\r\n", 2); } /* Mark end called */ httpResponseData->state |= HttpResponseData::HTTP_END_CALLED; } /* Even if we supply no new data to write, its failed boolean is useful to know * if it failed to drain any prior failed header writes */ /* Write as much as possible without causing backpressure */ size_t written = 0; bool failed = false; while (written < data.length() && !failed) { /* uSockets only deals with int sizes, so pass chunks of max signed int size */ auto writtenFailed = Super::write(data.data() + written, (int) std::min(data.length() - written, INT_MAX), optional); written += (size_t) writtenFailed.first; failed = writtenFailed.second; } httpResponseData->offset += written; /* Success is when we wrote the entire thing without any failures */ bool success = written == data.length() && !failed; /* If we are now at the end, start a timeout. Also start a timeout if we failed. */ if (!success || httpResponseData->offset == totalSize) { Super::timeout(HTTP_TIMEOUT_S); } /* Remove onAborted function if we reach the end */ if (httpResponseData->offset == totalSize) { markDone(httpResponseData); } return success; } } public: /* If we have proxy support; returns the proxed source address as reported by the proxy. */ #ifdef UWS_WITH_PROXY std::string_view getProxiedRemoteAddress() { return getHttpResponseData()->proxyParser.getSourceAddress(); } std::string_view getProxiedRemoteAddressAsText() { return Super::addressAsText(getProxiedRemoteAddress()); } #endif /* Manually upgrade to WebSocket. Typically called in upgrade handler. Immediately calls open handler. * NOTE: Will invalidate 'this' as socket might change location in memory. Throw away aftert use. */ template void upgrade(UserData &&userData, std::string_view secWebSocketKey, std::string_view secWebSocketProtocol, std::string_view secWebSocketExtensions, struct us_socket_context_t *webSocketContext) { /* Extract needed parameters from WebSocketContextData */ WebSocketContextData *webSocketContextData = (WebSocketContextData *) us_socket_context_ext(SSL, webSocketContext); /* Note: OpenSSL can be used here to speed this up somewhat */ char secWebSocketAccept[29] = {}; WebSocketHandshake::generate(secWebSocketKey.data(), secWebSocketAccept); writeStatus("101 Switching Protocols") ->writeHeader("Upgrade", "websocket") ->writeHeader("Connection", "Upgrade") ->writeHeader("Sec-WebSocket-Accept", secWebSocketAccept); /* Select first subprotocol if present */ if (secWebSocketProtocol.length()) { writeHeader("Sec-WebSocket-Protocol", secWebSocketProtocol.substr(0, secWebSocketProtocol.find(','))); } /* Negotiate compression */ bool perMessageDeflate = false; CompressOptions compressOptions = CompressOptions::DISABLED; if (secWebSocketExtensions.length() && webSocketContextData->compression != DISABLED) { /* We always want shared inflation */ int wantedInflationWindow = 0; /* Map from selected compressor */ int wantedCompressionWindow = (webSocketContextData->compression & 0xFF00) >> 8; auto [negCompression, negCompressionWindow, negInflationWindow, negResponse] = negotiateCompression(true, wantedCompressionWindow, wantedInflationWindow, secWebSocketExtensions); if (negCompression) { perMessageDeflate = true; /* Map from windowBits to compressor */ if (negCompressionWindow == 0) { compressOptions = CompressOptions::SHARED_COMPRESSOR; } else { compressOptions = (CompressOptions) ((uint32_t) (negCompressionWindow << 8) | (uint32_t) (negCompressionWindow - 7)); /* If we are dedicated and have the 3kb then correct any 4kb to 3kb, * (they both share the windowBits = 9) */ if (webSocketContextData->compression == DEDICATED_COMPRESSOR_3KB) { compressOptions = DEDICATED_COMPRESSOR_3KB; } } writeHeader("Sec-WebSocket-Extensions", negResponse); } } internalEnd({nullptr, 0}, 0, false, false); /* Grab the httpContext from res */ HttpContext *httpContext = (HttpContext *) us_socket_context(SSL, (struct us_socket_t *) this); /* Move any backpressure out of HttpResponse */ std::string backpressure(std::move(((AsyncSocketData *) getHttpResponseData())->buffer)); /* Destroy HttpResponseData */ getHttpResponseData()->~HttpResponseData(); /* Before we adopt and potentially change socket, check if we are corked */ bool wasCorked = Super::isCorked(); /* Adopting a socket invalidates it, do not rely on it directly to carry any data */ WebSocket *webSocket = (WebSocket *) us_socket_context_adopt_socket(SSL, (us_socket_context_t *) webSocketContext, (us_socket_t *) this, sizeof(WebSocketData) + sizeof(UserData)); /* For whatever reason we were corked, update cork to the new socket */ if (wasCorked) { webSocket->AsyncSocket::cork(); } /* Initialize websocket with any moved backpressure intact */ webSocket->init(perMessageDeflate, compressOptions, std::move(backpressure)); /* We should only mark this if inside the parser; if upgrading "async" we cannot set this */ HttpContextData *httpContextData = httpContext->getSocketContextData(); if (httpContextData->isParsingHttp) { /* We need to tell the Http parser that we changed socket */ httpContextData->upgradedWebSocket = webSocket; } /* Arm idleTimeout */ us_socket_timeout(SSL, (us_socket_t *) webSocket, webSocketContextData->idleTimeoutComponents.first); /* Move construct the UserData right before calling open handler */ new (webSocket->getUserData()) UserData(std::move(userData)); /* Emit open event and start the timeout */ if (webSocketContextData->openHandler) { webSocketContextData->openHandler(webSocket); } } /* Immediately terminate this Http response */ using Super::close; /* See AsyncSocket */ using Super::getRemoteAddress; using Super::getRemoteAddressAsText; using Super::getNativeHandle; /* Note: Headers are not checked in regards to timeout. * We only check when you actively push data or end the request */ /* Write 100 Continue, can be done any amount of times */ HttpResponse *writeContinue() { Super::write("HTTP/1.1 100 Continue\r\n\r\n", 25); return this; } /* Write the HTTP status */ HttpResponse *writeStatus(std::string_view status) { HttpResponseData *httpResponseData = getHttpResponseData(); /* Do not allow writing more than one status */ if (httpResponseData->state & HttpResponseData::HTTP_STATUS_CALLED) { return this; } /* Update status */ httpResponseData->state |= HttpResponseData::HTTP_STATUS_CALLED; Super::write("HTTP/1.1 ", 9); Super::write(status.data(), (int) status.length()); Super::write("\r\n", 2); return this; } /* Write an HTTP header with string value */ HttpResponse *writeHeader(std::string_view key, std::string_view value) { writeStatus(HTTP_200_OK); Super::write(key.data(), (int) key.length()); Super::write(": ", 2); Super::write(value.data(), (int) value.length()); Super::write("\r\n", 2); return this; } /* Write an HTTP header with unsigned int value */ HttpResponse *writeHeader(std::string_view key, uint64_t value) { writeStatus(HTTP_200_OK); Super::write(key.data(), (int) key.length()); Super::write(": ", 2); writeUnsigned64(value); Super::write("\r\n", 2); return this; } /* End the response with an optional data chunk. Always starts a timeout. */ void end(std::string_view data = {}, bool closeConnection = false) { internalEnd(data, data.length(), false, true, closeConnection); } /* Try and end the response. Returns [true, true] on success. * Starts a timeout in some cases. Returns [ok, hasResponded] */ std::pair tryEnd(std::string_view data, uintmax_t totalSize = 0) { return {internalEnd(data, totalSize, true), hasResponded()}; } /* Write parts of the response in chunking fashion. Starts timeout if failed. */ bool write(std::string_view data) { writeStatus(HTTP_200_OK); /* Do not allow sending 0 chunks, they mark end of response */ if (!data.length()) { /* If you called us, then according to you it was fine to call us so it's fine to still call us */ return true; } HttpResponseData *httpResponseData = getHttpResponseData(); if (!(httpResponseData->state & HttpResponseData::HTTP_WRITE_CALLED)) { writeHeader("Transfer-Encoding", "chunked"); httpResponseData->state |= HttpResponseData::HTTP_WRITE_CALLED; } Super::write("\r\n", 2); writeUnsignedHex((unsigned int) data.length()); Super::write("\r\n", 2); auto [written, failed] = Super::write(data.data(), (int) data.length()); if (failed) { Super::timeout(HTTP_TIMEOUT_S); } /* If we did not fail the write, accept more */ return !failed; } /* Get the current byte write offset for this Http response */ uintmax_t getWriteOffset() { HttpResponseData *httpResponseData = getHttpResponseData(); return httpResponseData->offset; } /* Checking if we have fully responded and are ready for another request */ bool hasResponded() { HttpResponseData *httpResponseData = getHttpResponseData(); return !(httpResponseData->state & HttpResponseData::HTTP_RESPONSE_PENDING); } /* Corks the response if possible. Leaves already corked socket be. */ HttpResponse *cork(MoveOnlyFunction &&handler) { if (!Super::isCorked() && Super::canCork()) { Super::cork(); handler(); /* Timeout on uncork failure, since most writes will succeed while corked */ auto [written, failed] = Super::uncork(); if (failed) { /* For now we only have one single timeout so let's use it */ /* This behavior should equal the behavior in HttpContext when uncorking fails */ Super::timeout(HTTP_TIMEOUT_S); } } else { /* We are already corked, or can't cork so let's just call the handler */ handler(); } return this; } /* Attach handler for writable HTTP response */ HttpResponse *onWritable(MoveOnlyFunction &&handler) { HttpResponseData *httpResponseData = getHttpResponseData(); httpResponseData->onWritable = std::move(handler); return this; } /* Attach handler for aborted HTTP request */ HttpResponse *onAborted(MoveOnlyFunction &&handler) { HttpResponseData *httpResponseData = getHttpResponseData(); httpResponseData->onAborted = std::move(handler); return this; } /* Attach a read handler for data sent. Will be called with FIN set true if last segment. */ void onData(MoveOnlyFunction &&handler) { HttpResponseData *data = getHttpResponseData(); data->inStream = std::move(handler); } }; } #endif // UWS_HTTPRESPONSE_H ================================================ FILE: nerd_modules/http/httplib/uWS/HttpResponseData.h ================================================ /* * Authored by Alex Hultman, 2018-2020. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UWS_HTTPRESPONSEDATA_H #define UWS_HTTPRESPONSEDATA_H /* This data belongs to the HttpResponse */ #include "HttpParser.h" #include "AsyncSocketData.h" #include "ProxyParser.h" #include "MoveOnlyFunction.h" namespace uWS { template struct HttpResponseData : AsyncSocketData, HttpParser { template friend struct HttpResponse; template friend struct HttpContext; private: /* Bits of status */ enum { HTTP_STATUS_CALLED = 1, // used HTTP_WRITE_CALLED = 2, // used HTTP_END_CALLED = 4, // used HTTP_RESPONSE_PENDING = 8, // used HTTP_CONNECTION_CLOSE = 16 // used }; /* Per socket event handlers */ MoveOnlyFunction onWritable; MoveOnlyFunction onAborted; MoveOnlyFunction inStream; // onData /* Outgoing offset */ uintmax_t offset = 0; /* Current state (content-length sent, status sent, write called, etc */ int state = 0; #ifdef UWS_WITH_PROXY ProxyParser proxyParser; #endif }; } #endif // UWS_HTTPRESPONSEDATA_H ================================================ FILE: nerd_modules/http/httplib/uWS/HttpRouter.h ================================================ /* * Authored by Alex Hultman, 2018-2020. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UWS_HTTPROUTER_HPP #define UWS_HTTPROUTER_HPP #include #include #include #include #include #include #include #include #include "MoveOnlyFunction.h" namespace uWS { template struct HttpRouter { /* These are public for now */ std::vector methods = {"get", "post", "head", "put", "delete", "connect", "options", "trace", "patch"}; static const uint32_t HIGH_PRIORITY = 0xd0000000, MEDIUM_PRIORITY = 0xe0000000, LOW_PRIORITY = 0xf0000000; private: USERDATA userData; static const unsigned int MAX_URL_SEGMENTS = 100; /* Handler ids are 32-bit */ static const uint32_t HANDLER_MASK = 0x0fffffff; /* Methods and their respective priority */ std::map priority; /* List of handlers */ std::vector> handlers; /* Current URL cache */ std::string_view currentUrl; std::string_view urlSegmentVector[MAX_URL_SEGMENTS]; int urlSegmentTop; /* The matching tree */ struct Node { std::string name; std::vector> children; std::vector handlers; bool isHighPriority; Node(std::string name) : name(name) {} } root = {"rootNode"}; /* Advance from parent to child, adding child if necessary */ Node *getNode(Node *parent, std::string child, bool isHighPriority) { for (std::unique_ptr &node : parent->children) { if (node->name == child && node->isHighPriority == isHighPriority) { return node.get(); } } /* Insert sorted, but keep order if parent is root (we sort methods by priority elsewhere) */ std::unique_ptr newNode(new Node(child)); newNode->isHighPriority = isHighPriority; return parent->children.emplace(std::upper_bound(parent->children.begin(), parent->children.end(), newNode, [parent, this](auto &a, auto &b) { if (a->isHighPriority != b->isHighPriority) { return a->isHighPriority; } return b->name.length() && (parent != &root) && (b->name < a->name); }), std::move(newNode))->get(); } /* Basically a pre-allocated stack */ struct RouteParameters { friend struct HttpRouter; private: std::string_view params[MAX_URL_SEGMENTS]; int paramsTop; void reset() { paramsTop = -1; } void push(std::string_view param) { /* We check these bounds indirectly via the urlSegments limit */ params[++paramsTop] = param; } void pop() { /* Same here, we cannot pop outside */ paramsTop--; } } routeParameters; /* Set URL for router. Will reset any URL cache */ inline void setUrl(std::string_view url) { /* Todo: URL may also start with "http://domain/" or "*", not only "/" */ /* We expect to stand on a slash */ currentUrl = url; urlSegmentTop = -1; } /* Lazily parse or read from cache */ inline std::pair getUrlSegment(int urlSegment) { if (urlSegment > urlSegmentTop) { /* Signal as STOP when we have no more URL or stack space */ if (!currentUrl.length() || urlSegment > 99) { return {{}, true}; } /* We always stand on a slash here, so step over it */ currentUrl.remove_prefix(1); auto segmentLength = currentUrl.find('/'); if (segmentLength == std::string::npos) { segmentLength = currentUrl.length(); /* Push to url segment vector */ urlSegmentVector[urlSegment] = currentUrl.substr(0, segmentLength); urlSegmentTop++; /* Update currentUrl */ currentUrl = currentUrl.substr(segmentLength); } else { /* Push to url segment vector */ urlSegmentVector[urlSegment] = currentUrl.substr(0, segmentLength); urlSegmentTop++; /* Update currentUrl */ currentUrl = currentUrl.substr(segmentLength); } } /* In any case we return it */ return {urlSegmentVector[urlSegment], false}; } /* Executes as many handlers it can */ bool executeHandlers(Node *parent, int urlSegment, USERDATA &userData) { auto [segment, isStop] = getUrlSegment(urlSegment); /* If we are on STOP, return where we may stand */ if (isStop) { /* We have reached accross the entire URL with no stoppage, execute */ for (uint32_t handler : parent->handlers) { if (handlers[handler & HANDLER_MASK](this)) { return true; } } /* We reached the end, so go back */ return false; } for (auto &p : parent->children) { if (p->name.length() && p->name[0] == '*') { /* Wildcard match (can be seen as a shortcut) */ for (uint32_t handler : p->handlers) { if (handlers[handler & HANDLER_MASK](this)) { return true; } } } else if (p->name.length() && p->name[0] == ':' && segment.length()) { /* Parameter match */ routeParameters.push(segment); if (executeHandlers(p.get(), urlSegment + 1, userData)) { return true; } routeParameters.pop(); } else if (p->name == segment) { /* Static match */ if (executeHandlers(p.get(), urlSegment + 1, userData)) { return true; } } } return false; } public: HttpRouter() { int p = 0; for (std::string &method : methods) { priority[method] = p++; } } std::pair getParameters() { return {routeParameters.paramsTop, routeParameters.params}; } USERDATA &getUserData() { return userData; } /* Fast path */ bool route(std::string_view method, std::string_view url) { /* Reset url parsing cache */ setUrl(url); routeParameters.reset(); /* Begin by finding the method node */ for (auto &p : root.children) { if (p->name == method) { /* Then route the url */ return executeHandlers(p.get(), 0, userData); } } /* We did not find any handler for this method and url */ return false; } /* Adds the corresponding entires in matching tree and handler list */ void add(std::vector methods, std::string pattern, MoveOnlyFunction &&handler, uint32_t priority = MEDIUM_PRIORITY) { for (std::string method : methods) { /* Lookup method */ Node *node = getNode(&root, method, false); /* Iterate over all segments */ setUrl(pattern); for (int i = 0; !getUrlSegment(i).second; i++) { node = getNode(node, std::string(getUrlSegment(i).first), priority == HIGH_PRIORITY); } /* Insert handler in order sorted by priority (most significant 1 byte) */ node->handlers.insert(std::upper_bound(node->handlers.begin(), node->handlers.end(), (uint32_t) (priority | handlers.size())), (uint32_t) (priority | handlers.size())); } /* Alloate this handler */ handlers.emplace_back(std::move(handler)); } }; } #endif // UWS_HTTPROUTER_HPP ================================================ FILE: nerd_modules/http/httplib/uWS/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: nerd_modules/http/httplib/uWS/Loop.h ================================================ /* * Authored by Alex Hultman, 2018-2020. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UWS_LOOP_H #define UWS_LOOP_H /* The loop is lazily created per-thread and run with run() */ #include "LoopData.h" #include namespace uWS { struct Loop { private: static void wakeupCb(us_loop_t *loop) { LoopData *loopData = (LoopData *) us_loop_ext(loop); /* Swap current deferQueue */ loopData->deferMutex.lock(); int oldDeferQueue = loopData->currentDeferQueue; loopData->currentDeferQueue = (loopData->currentDeferQueue + 1) % 2; loopData->deferMutex.unlock(); /* Drain the queue */ for (auto &x : loopData->deferQueues[oldDeferQueue]) { x(); } loopData->deferQueues[oldDeferQueue].clear(); } static void preCb(us_loop_t *loop) { LoopData *loopData = (LoopData *) us_loop_ext(loop); for (auto &p : loopData->preHandlers) { p.second((Loop *) loop); } } static void postCb(us_loop_t *loop) { LoopData *loopData = (LoopData *) us_loop_ext(loop); for (auto &p : loopData->postHandlers) { p.second((Loop *) loop); } } Loop() = delete; ~Loop() = default; Loop *init() { new (us_loop_ext((us_loop_t *) this)) LoopData; return this; } static Loop *create(void *hint) { return ((Loop *) us_create_loop(hint, wakeupCb, preCb, postCb, sizeof(LoopData)))->init(); } /* What to do with loops created with existingNativeLoop? */ struct LoopCleaner { ~LoopCleaner() { if(loop && cleanMe) { loop->free(); } } Loop *loop = nullptr; bool cleanMe = false; }; static LoopCleaner &getLazyLoop() { static thread_local LoopCleaner lazyLoop; return lazyLoop; } public: /* Lazily initializes a per-thread loop and returns it. * Will automatically free all initialized loops at exit. */ static Loop *get(void *existingNativeLoop = nullptr) { if (!getLazyLoop().loop) { /* If we are given a native loop pointer we pass that to uSockets and let it deal with it */ if (existingNativeLoop) { /* Todo: here we want to pass the pointer, not a boolean */ getLazyLoop().loop = create(existingNativeLoop); /* We cannot register automatic free here, must be manually done */ } else { getLazyLoop().loop = create(nullptr); getLazyLoop().cleanMe = true; } } return getLazyLoop().loop; } /* Freeing the default loop should be done once */ void free() { LoopData *loopData = (LoopData *) us_loop_ext((us_loop_t *) this); loopData->~LoopData(); /* uSockets will track whether this loop is owned by us or a borrowed alien loop */ us_loop_free((us_loop_t *) this); /* Reset lazyLoop */ getLazyLoop().loop = nullptr; } void addPostHandler(void *key, MoveOnlyFunction &&handler) { LoopData *loopData = (LoopData *) us_loop_ext((us_loop_t *) this); loopData->postHandlers.emplace(key, std::move(handler)); } /* Bug: what if you remove a handler while iterating them? */ void removePostHandler(void *key) { LoopData *loopData = (LoopData *) us_loop_ext((us_loop_t *) this); loopData->postHandlers.erase(key); } void addPreHandler(void *key, MoveOnlyFunction &&handler) { LoopData *loopData = (LoopData *) us_loop_ext((us_loop_t *) this); loopData->preHandlers.emplace(key, std::move(handler)); } /* Bug: what if you remove a handler while iterating them? */ void removePreHandler(void *key) { LoopData *loopData = (LoopData *) us_loop_ext((us_loop_t *) this); loopData->preHandlers.erase(key); } /* Defer this callback on Loop's thread of execution */ void defer(MoveOnlyFunction &&cb) { LoopData *loopData = (LoopData *) us_loop_ext((us_loop_t *) this); //if (std::thread::get_id() == ) // todo: add fast path for same thread id loopData->deferMutex.lock(); loopData->deferQueues[loopData->currentDeferQueue].emplace_back(std::move(cb)); loopData->deferMutex.unlock(); us_wakeup_loop((us_loop_t *) this); } /* Actively block and run this loop */ void run() { us_loop_run((us_loop_t *) this); } /* Passively integrate with the underlying default loop */ /* Used to seamlessly integrate with third parties such as Node.js */ void integrate() { us_loop_integrate((us_loop_t *) this); } /* Dynamically change this */ void setSilent(bool silent) { ((LoopData *) us_loop_ext((us_loop_t *) this))->noMark = silent; } }; /* Can be called from any thread to run the thread local loop */ inline void run() { Loop::get()->run(); } } #endif // UWS_LOOP_H ================================================ FILE: nerd_modules/http/httplib/uWS/LoopData.h ================================================ /* * Authored by Alex Hultman, 2018-2020. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UWS_LOOPDATA_H #define UWS_LOOPDATA_H #include #include #include #include #include #include "PerMessageDeflate.h" #include "MoveOnlyFunction.h" namespace uWS { struct Loop; struct alignas(16) LoopData { friend struct Loop; private: std::mutex deferMutex; int currentDeferQueue = 0; std::vector> deferQueues[2]; /* Map from void ptr to handler */ std::map> postHandlers, preHandlers; public: ~LoopData() { /* If we have had App.ws called with compression we need to clear this */ if (zlibContext) { delete zlibContext; delete inflationStream; delete deflationStream; } delete [] corkBuffer; } /* Be silent */ bool noMark = false; /* Good 16k for SSL perf. */ static const unsigned int CORK_BUFFER_SIZE = 16 * 1024; /* Cork data */ char *corkBuffer = new char[CORK_BUFFER_SIZE]; unsigned int corkOffset = 0; void *corkedSocket = nullptr; /* Per message deflate data */ ZlibContext *zlibContext = nullptr; InflationStream *inflationStream = nullptr; DeflationStream *deflationStream = nullptr; }; } #endif // UWS_LOOPDATA_H ================================================ FILE: nerd_modules/http/httplib/uWS/MessageParser.h ================================================ /* * Authored by Alex Hultman, 2018-2020. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* Implements the common parser (RFC 822) used in both HTTP and Multipart parsing */ #ifndef UWS_MESSAGE_PARSER_H #define UWS_MESSAGE_PARSER_H #include #include #include /* For now we have this one here */ #define MAX_HEADERS 10 namespace uWS { // should be templated on whether it needs at lest one header (http), or not (multipart) static inline unsigned int getHeaders(char *postPaddedBuffer, char *end, std::pair *headers) { char *preliminaryKey, *preliminaryValue, *start = postPaddedBuffer; for (unsigned int i = 0; i < MAX_HEADERS; i++) { for (preliminaryKey = postPaddedBuffer; (*postPaddedBuffer != ':') & (*postPaddedBuffer > 32); *(postPaddedBuffer++) |= 32); if (*postPaddedBuffer == '\r') { if ((postPaddedBuffer != end) & (postPaddedBuffer[1] == '\n') /* & (i > 0) */) { // multipart does not require any headers like http does headers->first = std::string_view(nullptr, 0); return (unsigned int) ((postPaddedBuffer + 2) - start); } else { return 0; } } else { headers->first = std::string_view(preliminaryKey, (size_t) (postPaddedBuffer - preliminaryKey)); for (postPaddedBuffer++; (*postPaddedBuffer == ':' || *postPaddedBuffer < 33) && *postPaddedBuffer != '\r'; postPaddedBuffer++); preliminaryValue = postPaddedBuffer; postPaddedBuffer = (char *) memchr(postPaddedBuffer, '\r', end - postPaddedBuffer); if (postPaddedBuffer && postPaddedBuffer[1] == '\n') { headers->second = std::string_view(preliminaryValue, (size_t) (postPaddedBuffer - preliminaryValue)); postPaddedBuffer += 2; headers++; } else { return 0; } } } return 0; } } #endif ================================================ FILE: nerd_modules/http/httplib/uWS/MoveOnlyFunction.h ================================================ /* MIT License Copyright (c) 2020 Oleg Fatkhiev Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* Sources fetched from https://github.com/ofats/any_invocable on 2021-02-19. */ #ifndef _ANY_INVOKABLE_H_ #define _ANY_INVOKABLE_H_ #include #include #include // clang-format off /* namespace std { template class any_invocable; // never defined template class any_invocable { public: using result_type = R; // SECTION.3, construct/copy/destroy any_invocable() noexcept; any_invocable(nullptr_t) noexcept; any_invocable(any_invocable&&) noexcept; template any_invocable(F&&); template explicit any_invocable(in_place_type_t, Args&&...); template explicit any_invocable(in_place_type_t, initializer_list, Args&&...); any_invocable& operator=(any_invocable&&) noexcept; any_invocable& operator=(nullptr_t) noexcept; template any_invocable& operator=(F&&); template any_invocable& operator=(reference_wrapper) noexcept; ~any_invocable(); // SECTION.4, any_invocable modifiers void swap(any_invocable&) noexcept; // SECTION.5, any_invocable capacity explicit operator bool() const noexcept; // SECTION.6, any_invocable invocation R operator()(ArgTypes...) cv ref noexcept(noex); // SECTION.7, null pointer comparisons friend bool operator==(const any_invocable&, nullptr_t) noexcept; // SECTION.8, specialized algorithms friend void swap(any_invocable&, any_invocable&) noexcept; }; } */ // clang-format on namespace ofats { namespace any_detail { using buffer = std::aligned_storage_t; template inline constexpr bool is_small_object_v = sizeof(T) <= sizeof(buffer) && alignof(buffer) % alignof(T) == 0 && std::is_nothrow_move_constructible_v; union storage { void* ptr_ = nullptr; buffer buf_; }; enum class action { destroy, move }; template struct handler_traits { template struct handler_base { static void handle(action act, storage* current, storage* other = nullptr) { switch (act) { case (action::destroy): Derived::destroy(*current); break; case (action::move): Derived::move(*current, *other); break; } } }; template struct small_handler : handler_base> { template static void create(storage& s, Args&&... args) { new (static_cast(&s.buf_)) T(std::forward(args)...); } static void destroy(storage& s) noexcept { T& value = *static_cast(static_cast(&s.buf_)); value.~T(); } static void move(storage& dst, storage& src) noexcept { create(dst, std::move(*static_cast(static_cast(&src.buf_)))); destroy(src); } static R call(storage& s, ArgTypes... args) { return std::invoke(*static_cast(static_cast(&s.buf_)), std::forward(args)...); } }; template struct large_handler : handler_base> { template static void create(storage& s, Args&&... args) { s.ptr_ = new T(std::forward(args)...); } static void destroy(storage& s) noexcept { delete static_cast(s.ptr_); } static void move(storage& dst, storage& src) noexcept { dst.ptr_ = src.ptr_; } static R call(storage& s, ArgTypes... args) { return std::invoke(*static_cast(s.ptr_), std::forward(args)...); } }; template using handler = std::conditional_t, small_handler, large_handler>; }; template struct is_in_place_type : std::false_type {}; template struct is_in_place_type> : std::true_type {}; template inline constexpr auto is_in_place_type_v = is_in_place_type::value; template class any_invocable_impl { template using handler = typename any_detail::handler_traits::template handler; using storage = any_detail::storage; using action = any_detail::action; using handle_func = void (*)(any_detail::action, any_detail::storage*, any_detail::storage*); using call_func = R (*)(any_detail::storage&, ArgTypes...); public: using result_type = R; any_invocable_impl() noexcept = default; any_invocable_impl(std::nullptr_t) noexcept {} any_invocable_impl(any_invocable_impl&& rhs) noexcept { if (rhs.handle_) { handle_ = rhs.handle_; handle_(action::move, &storage_, &rhs.storage_); call_ = rhs.call_; rhs.handle_ = nullptr; } } any_invocable_impl& operator=(any_invocable_impl&& rhs) noexcept { any_invocable_impl{std::move(rhs)}.swap(*this); return *this; } any_invocable_impl& operator=(std::nullptr_t) noexcept { destroy(); return *this; } ~any_invocable_impl() { destroy(); } void swap(any_invocable_impl& rhs) noexcept { if (handle_) { if (rhs.handle_) { storage tmp; handle_(action::move, &tmp, &storage_); rhs.handle_(action::move, &storage_, &rhs.storage_); handle_(action::move, &rhs.storage_, &tmp); std::swap(handle_, rhs.handle_); std::swap(call_, rhs.call_); } else { rhs.swap(*this); } } else if (rhs.handle_) { rhs.handle_(action::move, &storage_, &rhs.storage_); handle_ = rhs.handle_; call_ = rhs.call_; rhs.handle_ = nullptr; } } explicit operator bool() const noexcept { return handle_ != nullptr; } protected: template void create(Args&&... args) { using hdl = handler; hdl::create(storage_, std::forward(args)...); handle_ = &hdl::handle; call_ = &hdl::call; } void destroy() noexcept { if (handle_) { handle_(action::destroy, &storage_, nullptr); handle_ = nullptr; } } R call(ArgTypes... args) noexcept(is_noexcept) { return call_(storage_, std::forward(args)...); } friend bool operator==(const any_invocable_impl& f, std::nullptr_t) noexcept { return !f; } friend bool operator==(std::nullptr_t, const any_invocable_impl& f) noexcept { return !f; } friend bool operator!=(const any_invocable_impl& f, std::nullptr_t) noexcept { return static_cast(f); } friend bool operator!=(std::nullptr_t, const any_invocable_impl& f) noexcept { return static_cast(f); } friend void swap(any_invocable_impl& lhs, any_invocable_impl& rhs) noexcept { lhs.swap(rhs); } private: storage storage_; handle_func handle_ = nullptr; call_func call_; }; template using remove_cvref_t = std::remove_cv_t>; template using can_convert = std::conjunction< std::negation, AI>>, std::negation>>, std::is_invocable_r, std::bool_constant<(!noex || std::is_nothrow_invocable_r_v)>, std::is_constructible, F>>; } // namespace any_detail template class any_invocable; #define __OFATS_ANY_INVOCABLE(cv, ref, noex, inv_quals) \ template \ class any_invocable \ : public any_detail::any_invocable_impl { \ using base_type = any_detail::any_invocable_impl; \ \ public: \ using base_type::base_type; \ \ template < \ class F, \ class = std::enable_if_t::value>> \ any_invocable(F&& f) { \ base_type::template create>(std::forward(f)); \ } \ \ template , \ class = std::enable_if_t< \ std::is_move_constructible_v && \ std::is_constructible_v && \ std::is_invocable_r_v && \ (!noex || std::is_nothrow_invocable_r_v)>> \ explicit any_invocable(std::in_place_type_t, Args&&... args) { \ base_type::template create(std::forward(args)...); \ } \ \ template < \ class T, class U, class... Args, class VT = std::decay_t, \ class = std::enable_if_t< \ std::is_move_constructible_v && \ std::is_constructible_v&, Args...> && \ std::is_invocable_r_v && \ (!noex || \ std::is_nothrow_invocable_r_v)>> \ explicit any_invocable(std::in_place_type_t, \ std::initializer_list il, Args&&... args) { \ base_type::template create(il, std::forward(args)...); \ } \ \ template > \ std::enable_if_t && \ std::is_move_constructible_v, \ any_invocable&> \ operator=(F&& f) { \ any_invocable{std::forward(f)}.swap(*this); \ return *this; \ } \ template \ any_invocable& operator=(std::reference_wrapper f) { \ any_invocable{f}.swap(*this); \ return *this; \ } \ \ R operator()(ArgTypes... args) cv ref noexcept(noex) { \ return base_type::call(std::forward(args)...); \ } \ }; // cv -> {`empty`, const} // ref -> {`empty`, &, &&} // noex -> {true, false} // inv_quals -> (is_empty(ref) ? & : ref) __OFATS_ANY_INVOCABLE(, , false, &) // 000 __OFATS_ANY_INVOCABLE(, , true, &) // 001 __OFATS_ANY_INVOCABLE(, &, false, &) // 010 __OFATS_ANY_INVOCABLE(, &, true, &) // 011 __OFATS_ANY_INVOCABLE(, &&, false, &&) // 020 __OFATS_ANY_INVOCABLE(, &&, true, &&) // 021 __OFATS_ANY_INVOCABLE(const, , false, const&) // 100 __OFATS_ANY_INVOCABLE(const, , true, const&) // 101 __OFATS_ANY_INVOCABLE(const, &, false, const&) // 110 __OFATS_ANY_INVOCABLE(const, &, true, const&) // 111 __OFATS_ANY_INVOCABLE(const, &&, false, const&&) // 120 __OFATS_ANY_INVOCABLE(const, &&, true, const&&) // 121 #undef __OFATS_ANY_INVOCABLE } // namespace ofats /* We, uWebSockets define our own type */ namespace uWS { template using MoveOnlyFunction = ofats::any_invocable; } #endif // _ANY_INVOKABLE_H_ ================================================ FILE: nerd_modules/http/httplib/uWS/Multipart.h ================================================ /* * Authored by Alex Hultman, 2018-2020. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* Implements the multipart protocol. Builds atop parts of our common http parser (not yet refactored that way). */ /* https://www.w3.org/Protocols/rfc1341/7_2_Multipart.html */ #ifndef UWS_MULTIPART_H #define UWS_MULTIPART_H #include "MessageParser.h" #include #include #include #include #include namespace uWS { /* This one could possibly be shared with ExtensionsParser to some degree */ struct ParameterParser { /* Takes the line, commonly given as content-disposition header in the multipart */ ParameterParser(std::string_view line) { remainingLine = line; } /* Returns next key/value where value can simply be empty. * If key (first) is empty then we are at the end */ std::pair getKeyValue() { auto key = getToken(); auto op = getToken(); if (!op.length()) { return {key, ""}; } if (op[0] != ';') { auto value = getToken(); /* Strip ; or if at end, nothing */ getToken(); return {key, value}; } return {key, ""}; } private: std::string_view remainingLine; /* Consumes a token from the line. Will "unquote" strings */ std::string_view getToken() { /* Strip whitespace */ while (remainingLine.length() && isspace(remainingLine[0])) { remainingLine.remove_prefix(1); } if (!remainingLine.length()) { /* All we had was space */ return {}; } else { /* Are we at an operator? */ if (remainingLine[0] == ';' || remainingLine[0] == '=') { auto op = remainingLine.substr(0, 1); remainingLine.remove_prefix(1); return op; } else { /* Are we at a quoted string? */ if (remainingLine[0] == '\"') { /* Remove first quote and start counting */ remainingLine.remove_prefix(1); auto quote = remainingLine; int quoteLength = 0; /* Read anything until other double quote appears */ while (remainingLine.length() && remainingLine[0] != '\"') { remainingLine.remove_prefix(1); quoteLength++; } /* We can't remove_prefix if we have nothing to remove */ if (!remainingLine.length()) { return {}; } remainingLine.remove_prefix(1); return quote.substr(0, quoteLength); } else { /* Read anything until ; = space or end */ std::string_view token = remainingLine; int tokenLength = 0; while (remainingLine.length() && remainingLine[0] != ';' && remainingLine[0] != '=' && !isspace(remainingLine[0])) { remainingLine.remove_prefix(1); tokenLength++; } return token.substr(0, tokenLength); } } } /* Nothing */ return ""; } }; struct MultipartParser { /* 2 chars of hyphen + 1 - 70 chars of boundary */ char prependedBoundaryBuffer[72]; std::string_view prependedBoundary; std::string_view remainingBody; bool first = true; /* I think it is more than sane to limit this to 10 per part */ //static const int MAX_HEADERS = 10; /* Construct the parser based on contentType (reads boundary) */ MultipartParser(std::string_view contentType) { /* We expect the form "multipart/something;somethingboundary=something" */ if (contentType.length() < 10 || contentType.substr(0, 10) != "multipart/") { return; } /* For now we simply guess boundary will lie between = and end. This is not entirely * standards compliant as boundary may be expressed with or without " and spaces */ auto equalToken = contentType.find('=', 10); if (equalToken != std::string_view::npos) { /* Boundary must be less than or equal to 70 chars yet 1 char or longer */ std::string_view boundary = contentType.substr(equalToken + 1); if (!boundary.length() || boundary.length() > 70) { /* Invalid size */ return; } /* Prepend it with two hyphens */ prependedBoundaryBuffer[0] = prependedBoundaryBuffer[1] = '-'; memcpy(&prependedBoundaryBuffer[2], boundary.data(), boundary.length()); prependedBoundary = {prependedBoundaryBuffer, boundary.length() + 2}; } } /* Is this even a valid multipart request? */ bool isValid() { return prependedBoundary.length() != 0; } /* Set the body once, before getting any parts */ void setBody(std::string_view body) { remainingBody = body; } /* Parse out the next part's data, filling the headers. Returns nullopt on end or error. */ std::optional getNextPart(std::pair *headers) { /* The remaining two hyphens should be shorter than the boundary */ if (remainingBody.length() < prependedBoundary.length()) { /* We are done now */ return std::nullopt; } if (first) { auto nextBoundary = remainingBody.find(prependedBoundary); if (nextBoundary == std::string_view::npos) { /* Cannot parse */ return std::nullopt; } /* Toss away boundary and anything before it */ remainingBody.remove_prefix(nextBoundary + prependedBoundary.length()); first = false; } auto nextEndBoundary = remainingBody.find(prependedBoundary); if (nextEndBoundary == std::string_view::npos) { /* Cannot parse (or simply done) */ return std::nullopt; } std::string_view part = remainingBody.substr(0, nextEndBoundary); remainingBody.remove_prefix(nextEndBoundary + prependedBoundary.length()); /* Also strip rn before and rn after the part */ if (part.length() < 4) { /* Cannot strip */ return std::nullopt; } part.remove_prefix(2); part.remove_suffix(2); /* We are allowed to post pad like this because we know the boundary is at least 2 bytes */ /* This makes parsing a second pass invalid, so you can only iterate over parts once */ memset((char *) part.data() + part.length(), '\r', 1); /* For this to be a valid part, we need to consume at least 4 bytes (\r\n\r\n) */ int consumed = getHeaders((char *) part.data(), (char *) part.data() + part.length(), headers); if (!consumed) { /* This is an invalid part */ return std::nullopt; } /* Strip away the headers from the part body data */ part.remove_prefix(consumed); /* Now pass whatever is remaining of the part */ return part; } }; } #endif ================================================ FILE: nerd_modules/http/httplib/uWS/PerMessageDeflate.h ================================================ /* * Authored by Alex Hultman, 2018-2021. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* This standalone module implements deflate / inflate streams */ #ifndef UWS_PERMESSAGEDEFLATE_H #define UWS_PERMESSAGEDEFLATE_H /* We always define these options no matter if ZLIB is enabled or not */ namespace uWS { /* Compressor mode is HIGH8(windowBits), LOW8(memLevel) */ enum CompressOptions : uint32_t { DISABLED = 0, SHARED_COMPRESSOR = 1, DEDICATED_COMPRESSOR_3KB = 9 << 8 | 1, DEDICATED_COMPRESSOR_4KB = 9 << 8 | 2, DEDICATED_COMPRESSOR_8KB = 10 << 8 | 3, DEDICATED_COMPRESSOR_16KB = 11 << 8 | 4, DEDICATED_COMPRESSOR_32KB = 12 << 8 | 5, DEDICATED_COMPRESSOR_64KB = 13 << 8 | 6, DEDICATED_COMPRESSOR_128KB = 14 << 8 | 7, DEDICATED_COMPRESSOR_256KB = 15 << 8 | 8, /* Same as 256kb */ DEDICATED_COMPRESSOR = 15 << 8 | 8 }; } #if !defined(UWS_NO_ZLIB) && !defined(UWS_MOCK_ZLIB) #include #endif #include #include #ifdef UWS_USE_LIBDEFLATE #include "libdeflate.h" #include #endif namespace uWS { /* Do not compile this module if we don't want it */ #if defined(UWS_NO_ZLIB) || defined(UWS_MOCK_ZLIB) struct ZlibContext {}; struct InflationStream { std::optional inflate(ZlibContext *zlibContext, std::string_view compressed, size_t maxPayloadLength) { return compressed.substr(0, std::min(maxPayloadLength, compressed.length())); } }; struct DeflationStream { std::string_view deflate(ZlibContext *zlibContext, std::string_view raw, bool reset) { return raw; } DeflationStream(int compressOptions) { } }; #else #define LARGE_BUFFER_SIZE 1024 * 16 // todo: fix this struct ZlibContext { /* Any returned data is valid until next same-class call. * We need to have two classes to allow inflation followed * by many deflations without modifying the inflation */ std::string dynamicDeflationBuffer; std::string dynamicInflationBuffer; char *deflationBuffer; char *inflationBuffer; #ifdef UWS_USE_LIBDEFLATE libdeflate_decompressor *decompressor; libdeflate_compressor *compressor; #endif ZlibContext() { deflationBuffer = (char *) malloc(LARGE_BUFFER_SIZE); inflationBuffer = (char *) malloc(LARGE_BUFFER_SIZE); #ifdef UWS_USE_LIBDEFLATE decompressor = libdeflate_alloc_decompressor(); compressor = libdeflate_alloc_compressor(6); #endif } ~ZlibContext() { free(deflationBuffer); free(inflationBuffer); #ifdef UWS_USE_LIBDEFLATE libdeflate_free_decompressor(decompressor); libdeflate_free_compressor(compressor); #endif } }; struct DeflationStream { z_stream deflationStream = {}; DeflationStream(CompressOptions compressOptions) { /* Sliding inflator should be about 44kb by default, less than compressor */ /* Memory usage is given by 2 ^ (windowBits + 2) + 2 ^ (memLevel + 9) */ int windowBits = -(int) ((compressOptions & 0xFF00) >> 8), memLevel = compressOptions & 0x00FF; //printf("windowBits: %d, memLevel: %d\n", windowBits, memLevel); deflateInit2(&deflationStream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, windowBits, memLevel, Z_DEFAULT_STRATEGY); } /* Deflate and optionally reset. You must not deflate an empty string. */ std::string_view deflate(ZlibContext *zlibContext, std::string_view raw, bool reset) { #ifdef UWS_USE_LIBDEFLATE /* Run a fast path in case of shared_compressor */ if (reset) { size_t written = 0; static unsigned char buf[1024 + 1]; written = libdeflate_deflate_compress(zlibContext->compressor, raw.data(), raw.length(), buf, 1024); if (written) { memcpy(&buf[written], "\x00", 1); return std::string_view((char *) buf, written + 1); } } #endif /* Odd place to clear this one, fix */ zlibContext->dynamicDeflationBuffer.clear(); deflationStream.next_in = (Bytef *) raw.data(); deflationStream.avail_in = (unsigned int) raw.length(); /* This buffer size has to be at least 6 bytes for Z_SYNC_FLUSH to work */ const int DEFLATE_OUTPUT_CHUNK = LARGE_BUFFER_SIZE; int err; do { deflationStream.next_out = (Bytef *) zlibContext->deflationBuffer; deflationStream.avail_out = DEFLATE_OUTPUT_CHUNK; err = ::deflate(&deflationStream, Z_SYNC_FLUSH); if (Z_OK == err && deflationStream.avail_out == 0) { zlibContext->dynamicDeflationBuffer.append(zlibContext->deflationBuffer, DEFLATE_OUTPUT_CHUNK - deflationStream.avail_out); continue; } else { break; } } while (true); /* This must not change avail_out */ if (reset) { deflateReset(&deflationStream); } if (zlibContext->dynamicDeflationBuffer.length()) { zlibContext->dynamicDeflationBuffer.append(zlibContext->deflationBuffer, DEFLATE_OUTPUT_CHUNK - deflationStream.avail_out); return std::string_view((char *) zlibContext->dynamicDeflationBuffer.data(), zlibContext->dynamicDeflationBuffer.length() - 4); } /* Note: We will get an interger overflow resulting in heap buffer overflow if Z_BUF_ERROR is returned * from passing 0 as avail_in. Therefore we must not deflate an empty string */ return { zlibContext->deflationBuffer, DEFLATE_OUTPUT_CHUNK - deflationStream.avail_out - 4 }; } ~DeflationStream() { deflateEnd(&deflationStream); } }; struct InflationStream { z_stream inflationStream = {}; InflationStream() { inflateInit2(&inflationStream, -15); } ~InflationStream() { inflateEnd(&inflationStream); } /* Zero length inflates are possible and valid */ std::optional inflate(ZlibContext *zlibContext, std::string_view compressed, size_t maxPayloadLength) { #ifdef UWS_USE_LIBDEFLATE /* Try fast path first */ size_t written = 0; static char buf[1024]; /* We have to pad 9 bytes and restore those bytes when done since 9 is more than 6 of next WebSocket message */ char tmp[9]; memcpy(tmp, (char *) compressed.data() + compressed.length(), 9); memcpy((char *) compressed.data() + compressed.length(), "\x00\x00\xff\xff\x01\x00\x00\xff\xff", 9); libdeflate_result res = libdeflate_deflate_decompress(zlibContext->decompressor, compressed.data(), compressed.length() + 9, buf, 1024, &written); memcpy((char *) compressed.data() + compressed.length(), tmp, 9); if (res == 0) { /* Fast path wins */ return std::string_view(buf, written); } #endif /* We clear this one here, could be done better */ zlibContext->dynamicInflationBuffer.clear(); inflationStream.next_in = (Bytef *) compressed.data(); inflationStream.avail_in = (unsigned int) compressed.length(); int err; do { inflationStream.next_out = (Bytef *) zlibContext->inflationBuffer; inflationStream.avail_out = LARGE_BUFFER_SIZE; err = ::inflate(&inflationStream, Z_SYNC_FLUSH); if (err == Z_OK && inflationStream.avail_out) { break; } zlibContext->dynamicInflationBuffer.append(zlibContext->inflationBuffer, LARGE_BUFFER_SIZE - inflationStream.avail_out); } while (inflationStream.avail_out == 0 && zlibContext->dynamicInflationBuffer.length() <= maxPayloadLength); inflateReset(&inflationStream); if ((err != Z_BUF_ERROR && err != Z_OK) || zlibContext->dynamicInflationBuffer.length() > maxPayloadLength) { return std::nullopt; } if (zlibContext->dynamicInflationBuffer.length()) { zlibContext->dynamicInflationBuffer.append(zlibContext->inflationBuffer, LARGE_BUFFER_SIZE - inflationStream.avail_out); /* Let's be strict about the max size */ if (zlibContext->dynamicInflationBuffer.length() > maxPayloadLength) { return std::nullopt; } return std::string_view(zlibContext->dynamicInflationBuffer.data(), zlibContext->dynamicInflationBuffer.length()); } /* Let's be strict about the max size */ if ((LARGE_BUFFER_SIZE - inflationStream.avail_out) > maxPayloadLength) { return std::nullopt; } return std::string_view(zlibContext->inflationBuffer, LARGE_BUFFER_SIZE - inflationStream.avail_out); } }; #endif } #endif // UWS_PERMESSAGEDEFLATE_H ================================================ FILE: nerd_modules/http/httplib/uWS/ProxyParser.h ================================================ /* * Authored by Alex Hultman, 2018-2020. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* This module implements The PROXY Protocol v2 */ #ifndef UWS_PROXY_PARSER_H #define UWS_PROXY_PARSER_H #ifdef UWS_WITH_PROXY namespace uWS { struct proxy_hdr_v2 { uint8_t sig[12]; /* hex 0D 0A 0D 0A 00 0D 0A 51 55 49 54 0A */ uint8_t ver_cmd; /* protocol version and command */ uint8_t fam; /* protocol family and address */ uint16_t len; /* number of following bytes part of the header */ }; union proxy_addr { struct { /* for TCP/UDP over IPv4, len = 12 */ uint32_t src_addr; uint32_t dst_addr; uint16_t src_port; uint16_t dst_port; } ipv4_addr; struct { /* for TCP/UDP over IPv6, len = 36 */ uint8_t src_addr[16]; uint8_t dst_addr[16]; uint16_t src_port; uint16_t dst_port; } ipv6_addr; }; /* Byte swap for little-endian systems */ /* Todo: This functions should be shared with the one in WebSocketProtocol.h! */ template T _cond_byte_swap(T value) { uint32_t endian_test = 1; if (*((char *)&endian_test)) { union { T i; uint8_t b[sizeof(T)]; } src = { value }, dst; for (unsigned int i = 0; i < sizeof(value); i++) { dst.b[i] = src.b[sizeof(value) - 1 - i]; } return dst.i; } return value; } struct ProxyParser { private: union proxy_addr addr; /* Default family of 0 signals no proxy address */ uint8_t family = 0; public: /* Returns 4 or 16 bytes source address */ std::string_view getSourceAddress() { // UNSPEC family and protocol if (family == 0) { return {}; } if ((family & 0xf0) >> 4 == 1) { /* Family 1 is INET4 */ return {(char *) &addr.ipv4_addr.src_addr, 4}; } else { /* Family 2 is INET6 */ return {(char *) &addr.ipv6_addr.src_addr, 16}; } } /* Returns [done, consumed] where done = false on failure */ std::pair parse(std::string_view data) { /* We require at least four bytes to determine protocol */ if (data.length() < 4) { return {false, 0}; } /* HTTP can never start with "\r\n\r\n", but PROXY always does */ if (memcmp(data.data(), "\r\n\r\n", 4)) { /* This is HTTP, so be done */ return {true, 0}; } /* We assume we are parsing PROXY V2 here */ /* We require 16 bytes here */ if (data.length() < 16) { return {false, 0}; } /* Header is 16 bytes */ struct proxy_hdr_v2 header; memcpy(&header, data.data(), 16); if (memcmp(header.sig, "\x0D\x0A\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A", 12)) { /* This is not PROXY protocol at all */ return {false, 0}; } /* We only support version 2 */ if ((header.ver_cmd & 0xf0) >> 4 != 2) { return {false, 0}; } //printf("Version: %d\n", (header.ver_cmd & 0xf0) >> 4); //printf("Command: %d\n", (header.ver_cmd & 0x0f)); /* We get length in network byte order (todo: share this function with the rest) */ uint16_t hostLength = _cond_byte_swap(header.len); /* We must have all the data available */ if (data.length() < 16u + hostLength) { return {false, 0}; } /* Payload cannot be more than sizeof proxy_addr */ if (sizeof(proxy_addr) < hostLength) { return {false, 0}; } //printf("Family: %d\n", (header.fam & 0xf0) >> 4); //printf("Transport: %d\n", (header.fam & 0x0f)); /* We have 0 family by default, and UNSPEC is 0 as well */ family = header.fam; /* Copy payload */ memcpy(&addr, data.data() + 16, hostLength); /* We consumed everything */ return {true, 16 + hostLength}; } }; } #endif #endif // UWS_PROXY_PARSER_H ================================================ FILE: nerd_modules/http/httplib/uWS/QueryParser.h ================================================ /* * Authored by Alex Hultman, 2018-2020. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* This module implements URI query parsing and retrieval of value given key */ #ifndef UWS_QUERYPARSER_H #define UWS_QUERYPARSER_H #include namespace uWS { /* Takes raw query including initial '?' sign. Will inplace decode, so input will mutate */ static inline std::string_view getDecodedQueryValue(std::string_view key, std::string_view rawQuery) { /* Can't have a value without a key */ if (!key.length()) { return {}; } /* Start with the whole querystring including initial '?' */ std::string_view queryString = rawQuery; /* List of key, value could be cached for repeated fetches similar to how headers are, todo! */ while (queryString.length()) { /* Find boundaries of this statement */ std::string_view statement = queryString.substr(1, queryString.find('&', 1) - 1); /* Only bother if first char of key match (early exit) */ if (statement.length() && statement[0] == key[0]) { /* Equal sign must be present and not in the end of statement */ auto equality = statement.find('='); if (equality != std::string_view::npos && equality != statement.length() - 1) { std::string_view statementKey = statement.substr(0, equality); std::string_view statementValue = statement.substr(equality + 1); /* String comparison */ if (key == statementKey) { /* Decode value inplace, put null at end if before length of original */ char *in = (char *) statementValue.data(); /* Write offset */ unsigned int out = 0; /* Walk over all chars until end or null char, decoding in place */ for (unsigned int i = 0; i < statementValue.length() && in[i]; i++) { /* Only bother with '%' */ if (in[i] == '%') { /* Do we have enough data for two bytes hex? */ if (i + 2 >= statementValue.length()) { return {}; } /* Two bytes hex */ int hex1 = in[i + 1] - '0'; if (hex1 > 9) { hex1 &= 223; hex1 -= 7; } int hex2 = in[i + 2] - '0'; if (hex2 > 9) { hex2 &= 223; hex2 -= 7; } *((unsigned char *) &in[out]) = (unsigned char) (hex1 * 16 + hex2); i += 2; } else { /* Is this even a rule? */ if (in[i] == '+') { in[out] = ' '; } else { in[out] = in[i]; } } /* We always only write one char */ out++; } /* If decoded string is shorter than original, put null char to stop next read */ if (out < statementValue.length()) { in[out] = 0; } return statementValue.substr(0, out); } } else { /* This querystring is invalid, cannot parse it */ return {}; } } queryString.remove_prefix(statement.length() + 1); } /* Nothing found */ return {}; } } #endif ================================================ FILE: nerd_modules/http/httplib/uWS/TopicTree.h ================================================ /* * Authored by Alex Hultman, 2018-2021. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UWS_TOPICTREE_H #define UWS_TOPICTREE_H #include #include #include #include #include #include #include #include #include /* We use std::function here, not MoveOnlyFunction */ #include namespace uWS { /* A Subscriber is an extension of a socket */ struct Subscriber { std::list subscriptions; void *user; Subscriber(void *user) : user(user) {} }; struct Topic { /* Memory for our name */ char *name; size_t length; /* Our parent or nullptr */ Topic *parent = nullptr; /* Next triggered Topic */ bool triggered = false; /* Exact string matches */ std::map children; /* Wildcard child */ Topic *wildcardChild = nullptr; /* Terminating wildcard child */ Topic *terminatingWildcardChild = nullptr; /* What we published, {inflated, deflated} */ std::map> messages; std::set subs; /* Locked or not, used only when iterating over a Subscriber's topics */ bool locked = false; /* Full name is used when iterating topcis */ std::string fullName; }; struct Hole { std::pair lengths; unsigned int messageId; }; struct Intersection { std::pair dataChannels; std::vector holes; void forSubscriber(std::vector &senderForMessages, std::function, bool)> cb) { /* How far we already emitted of the two dataChannels */ std::pair emitted = {}; /* Holes are global to the entire topic tree, so we are not guaranteed to find * holes in this intersection - they are sorted, though */ unsigned int examinedHoles = 0; /* This is a slow path of sorts, most subscribers will be observers, not active senders */ for (unsigned int id : senderForMessages) { std::pair toEmit = {}; std::pair toIgnore = {}; /* This linear search is most probably very small - it could be made log2 if every hole * knows about its previous accumulated length, which is easy to set up. However this * log2 search will most likely never be a warranted perf. gain */ for (; examinedHoles < holes.size(); examinedHoles++) { if (holes[examinedHoles].messageId == id) { toIgnore.first += holes[examinedHoles].lengths.first; toIgnore.second += holes[examinedHoles].lengths.second; examinedHoles++; break; } /* We are not the sender of this message so we should emit it in this segment */ toEmit.first += holes[examinedHoles].lengths.first; toEmit.second += holes[examinedHoles].lengths.second; } /* Emit this segment */ if (toEmit.first || toEmit.second) { std::pair cutDataChannels = { std::string_view(dataChannels.first.data() + emitted.first, toEmit.first), std::string_view(dataChannels.second.data() + emitted.second, toEmit.second), }; /* We only need to test the first data channel for "FIN" */ cb(cutDataChannels, emitted.first + toEmit.first + toIgnore.first == dataChannels.first.length()); } emitted.first += toEmit.first + toIgnore.first; emitted.second += toEmit.second + toIgnore.second; } if (emitted.first == dataChannels.first.length() && emitted.second == dataChannels.second.length()) { return; } std::pair cutDataChannels = { std::string_view(dataChannels.first.data() + emitted.first, dataChannels.first.length() - emitted.first), std::string_view(dataChannels.second.data() + emitted.second, dataChannels.second.length() - emitted.second), }; cb(cutDataChannels, true); } }; struct TopicTree { /* Returns Topic, or nullptr. Topic can be root if empty string given. */ Topic *lookupTopic(std::string_view topic) { /* Lookup exact Topic ptr from string */ Topic *iterator = root; for (size_t start = 0, stop = 0; stop != std::string::npos; start = stop + 1) { stop = topic.find('/', start); std::string_view segment = topic.substr(start, stop - start); std::map::iterator it = iterator->children.find(segment); if (it == iterator->children.end()) { /* This topic does not even exist */ return nullptr; } iterator = it->second; } return iterator; } private: std::function cb; Topic *root = new Topic; /* Global messageId for deduplication of overlapping topics and ordering between topics */ unsigned int messageId = 0; /* Sender holes */ std::map> senderHoles; /* The triggered topics */ Topic *triggeredTopics[64]; int numTriggeredTopics = 0; Subscriber *min = (Subscriber *) UINTPTR_MAX; /* Cull or trim unused Topic nodes from leaf to root */ void trimTree(Topic *topic) { while (!topic->subs.size() && !topic->children.size() && !topic->terminatingWildcardChild && !topic->wildcardChild) { Topic *parent = topic->parent; if (topic->length == 1) { if (topic->name[0] == '#') { parent->terminatingWildcardChild = nullptr; } else if (topic->name[0] == '+') { parent->wildcardChild = nullptr; } } /* Erase us from our parents set (wildcards also live here) */ parent->children.erase(std::string_view(topic->name, topic->length)); /* If this node is triggered, make sure to remove it from the triggered list */ if (topic->triggered) { Topic *tmp[64]; int length = 0; for (int i = 0; i < numTriggeredTopics; i++) { if (triggeredTopics[i] != topic) { tmp[length++] = triggeredTopics[i]; } } for (int i = 0; i < length; i++) { triggeredTopics[i] = tmp[i]; } numTriggeredTopics = length; } /* Free various memory for the node */ delete [] topic->name; delete topic; if (parent == root) { break; } topic = parent; } } /* Publishes to all matching topics and wildcards. Returns whether at least one topic was a match. */ bool publish(Topic *iterator, size_t start, size_t stop, std::string_view topic, std::pair message) { /* Whether we matched with at least one topic */ bool didMatch = false; /* Iterate over all segments in given topic */ for (; stop != std::string::npos; start = stop + 1) { stop = topic.find('/', start); std::string_view segment = topic.substr(start, stop - start); /* It is very important to disallow wildcards when publishing. * We will not catch EVERY misuse this lazy way, but enough to hinder * explosive recursion. * Terminating wildcards MAY still get triggered along the way, if for * instace the error is found late while iterating the topic segments. */ if (segment.length() == 1) { if (segment[0] == '+' || segment[0] == '#') { /* "Fail" here, but not necessarily for the entire publish */ return didMatch; } } /* Do we have a terminating wildcard child? */ if (iterator->terminatingWildcardChild) { iterator->terminatingWildcardChild->messages[messageId] = message; /* Add this topic to triggered */ if (!iterator->terminatingWildcardChild->triggered) { /* If we already have 64 triggered topics make sure to drain it here */ if (numTriggeredTopics == 64) { drain(); } triggeredTopics[numTriggeredTopics++] = iterator->terminatingWildcardChild; iterator->terminatingWildcardChild->triggered = true; } didMatch = true; } /* Do we have a wildcard child? */ if (iterator->wildcardChild) { didMatch |= publish(iterator->wildcardChild, stop + 1, stop, topic, message); } std::map::iterator it = iterator->children.find(segment); if (it == iterator->children.end()) { /* Stop trying to match by exact string */ return didMatch; } iterator = it->second; } /* If we went all the way we matched exactly */ iterator->messages[messageId] = message; /* Add this topic to triggered */ if (!iterator->triggered) { /* If we already have 64 triggered topics make sure to drain it here */ if (numTriggeredTopics == 64) { drain(); } triggeredTopics[numTriggeredTopics++] = iterator; iterator->triggered = true; } /* We obviously matches exactly here */ return true; } public: TopicTree(std::function cb) { this->cb = cb; } ~TopicTree() { delete root; } /* This is part of the fast path, so should be optimal */ std::vector &getSenderFor(Subscriber *s) { static thread_local std::vector emptyVector; auto it = senderHoles.find(s); if (it != senderHoles.end()) { return it->second; } return emptyVector; } /* Returns number of subscribers after the call and whether or not we were successful in subscribing */ std::pair subscribe(std::string_view topic, Subscriber *subscriber, bool nonStrict = false) { /* Start iterating from the root */ Topic *iterator = root; /* Traverse the topic, inserting a node for every new segment separated by / */ for (size_t start = 0, stop = 0; stop != std::string::npos; start = stop + 1) { stop = topic.find('/', start); std::string_view segment = topic.substr(start, stop - start); auto lb = iterator->children.lower_bound(segment); if (lb != iterator->children.end() && !(iterator->children.key_comp()(segment, lb->first))) { iterator = lb->second; } else { /* Allocate and insert new node */ Topic *newTopic = new Topic; newTopic->parent = iterator; newTopic->name = new char[segment.length()]; newTopic->length = segment.length(); newTopic->terminatingWildcardChild = nullptr; newTopic->wildcardChild = nullptr; memcpy(newTopic->name, segment.data(), segment.length()); /* Set fullname as parent's name plus our name */ newTopic->fullName.reserve(newTopic->parent->fullName.length() + 1 + segment.length()); /* Only append parent's name if parent is not root */ if (newTopic->parent != root) { newTopic->fullName.append(newTopic->parent->fullName); newTopic->fullName.append("/"); } newTopic->fullName.append(segment); /* For simplicity we do insert wildcards with text */ iterator->children.insert(lb, {std::string_view(newTopic->name, segment.length()), newTopic}); /* Store fast lookup to wildcards */ if (segment.length() == 1) { /* If this segment is '+' it is a wildcard */ if (segment[0] == '+') { iterator->wildcardChild = newTopic; } /* If this segment is '#' it is a terminating wildcard */ if (segment[0] == '#') { iterator->terminatingWildcardChild = newTopic; } } iterator = newTopic; } } /* If this topic is triggered, drain the tree before we join */ if (iterator->triggered) { if (!nonStrict) { drain(); } } /* Add socket to Topic's Set */ auto [it, inserted] = iterator->subs.insert(subscriber); /* Add Topic to list of subscriptions only if we weren't already subscribed */ if (inserted) { subscriber->subscriptions.push_back(iterator); return {(unsigned int) iterator->subs.size(), true}; } return {(unsigned int) iterator->subs.size(), false}; } bool publish(std::string_view topic, std::pair message, Subscriber *sender = nullptr) { /* Add a hole for the sender if one */ if (sender) { senderHoles[sender].push_back(messageId); } auto ret = publish(root, 0, 0, topic, message); /* MessageIDs are reset on drain - this should be fine since messages itself are cleared on drain */ messageId++; return ret; } /* Returns a pair of numSubscribers after operation, and whether we were subscribed prior */ std::pair unsubscribe(std::string_view topic, Subscriber *subscriber, bool nonStrict = false) { /* Subscribers are likely to have very few subscriptions (20 or fewer) */ if (subscriber) { /* Lookup exact Topic ptr from string */ Topic *iterator = root; for (size_t start = 0, stop = 0; stop != std::string::npos; start = stop + 1) { stop = topic.find('/', start); std::string_view segment = topic.substr(start, stop - start); std::map::iterator it = iterator->children.find(segment); if (it == iterator->children.end()) { /* This topic does not even exist */ return {0, false}; } iterator = it->second; } /* Is this topic locked? If so, we cannot unsubscribe from it */ if (iterator->locked) { return {iterator->subs.size(), false}; } /* Try and remove this topic from our list */ for (auto it = subscriber->subscriptions.begin(); it != subscriber->subscriptions.end(); it++) { if (*it == iterator) { /* If this topic is triggered, drain the tree before we leave */ if (iterator->triggered) { if (!nonStrict) { drain(); } } /* Remove topic ptr from our list */ subscriber->subscriptions.erase(it); /* Remove us from Topic's subs */ iterator->subs.erase(subscriber); unsigned int numSubscribers = (unsigned int) iterator->subs.size(); trimTree(iterator); return {numSubscribers, true}; } } } return {0, false}; } /* Can be called with nullptr, ignore it then */ void unsubscribeAll(Subscriber *subscriber, bool mayFlush = true) { if (subscriber) { for (Topic *topic : subscriber->subscriptions) { /* We do not want to flush when closing a socket, it makes no sense to do so */ /* If this topic is triggered, drain the tree before we leave */ if (mayFlush && topic->triggered) { /* Never mind nonStrict here (yet?) */ drain(); } /* Remove us from the topic's set */ topic->subs.erase(subscriber); trimTree(topic); } subscriber->subscriptions.clear(); } } /* Drain the tree by emitting what to send with every Subscriber */ /* Better name would be commit() and making it public so that one can commit and shutdown, etc */ void drain() { /* Do nothing if nothing to send */ if (!numTriggeredTopics) { return; } /* bug fix: Filter triggered topics without subscribers */ int numFilteredTriggeredTopics = 0; for (int i = 0; i < numTriggeredTopics; i++) { if (triggeredTopics[i]->subs.size()) { triggeredTopics[numFilteredTriggeredTopics++] = triggeredTopics[i]; } else { /* If we no longer have any subscribers, yet still keep this Topic alive (parent), * make sure to clear its potential messages. */ triggeredTopics[i]->messages.clear(); triggeredTopics[i]->triggered = false; } } numTriggeredTopics = numFilteredTriggeredTopics; if (!numTriggeredTopics) { senderHoles.clear(); messageId = 0; return; } /* bug fix: update min, as the one tracked via subscribe gets invalid as you unsubscribe */ min = (Subscriber *)UINTPTR_MAX; for (int i = 0; i < numTriggeredTopics; i++) { if ((triggeredTopics[i]->subs.size()) && (min > *triggeredTopics[i]->subs.begin())) { min = *triggeredTopics[i]->subs.begin(); } } /* Check if we really have any sockets still */ if (min != (Subscriber *)UINTPTR_MAX) { /* Up to 64 triggered Topics per batch */ std::map intersectionCache; /* Loop over these here */ std::set::iterator it[64]; std::set::iterator end[64]; for (int i = 0; i < numTriggeredTopics; i++) { it[i] = triggeredTopics[i]->subs.begin(); end[i] = triggeredTopics[i]->subs.end(); } /* Empty all sets from unique subscribers */ for (int nonEmpty = numTriggeredTopics; nonEmpty; ) { Subscriber *nextMin = (Subscriber *)UINTPTR_MAX; /* The message sets relevant for this intersection */ std::map> *perSubscriberIntersectingTopicMessages[64]; int numPerSubscriberIntersectingTopicMessages = 0; uint64_t intersection = 0; for (int i = 0; i < numTriggeredTopics; i++) { if ((it[i] != end[i]) && (*it[i] == min)) { /* Mark this intersection */ intersection |= ((uint64_t)1 << i); perSubscriberIntersectingTopicMessages[numPerSubscriberIntersectingTopicMessages++] = &triggeredTopics[i]->messages; it[i]++; if (it[i] == end[i]) { nonEmpty--; } else { if (nextMin > *it[i]) { nextMin = *it[i]; } } } else { /* We need to lower nextMin to us, in the case of min being the last in a set */ if ((it[i] != end[i]) && (nextMin > *it[i])) { nextMin = *it[i]; } } } /* Generate cache for intersection */ if (intersectionCache[intersection].dataChannels.first.length() == 0) { /* Build the union in order without duplicates */ std::map> complete; for (int i = 0; i < numPerSubscriberIntersectingTopicMessages; i++) { complete.insert(perSubscriberIntersectingTopicMessages[i]->begin(), perSubscriberIntersectingTopicMessages[i]->end()); } /* Create the linear cache, {inflated, deflated} */ Intersection res; for (auto &p : complete) { res.dataChannels.first.append(p.second.first); res.dataChannels.second.append(p.second.second); /* Appends {id, length, length} * We could possibly append byte offset also, * if we want to use log2 search later. */ Hole h; h.lengths.first = p.second.first.length(); h.lengths.second = p.second.second.length(); h.messageId = p.first; res.holes.push_back(h); } cb(min, intersectionCache[intersection] = std::move(res)); } else { cb(min, intersectionCache[intersection]); } min = nextMin; } } /* Clear messages of triggered Topics */ for (int i = 0; i < numTriggeredTopics; i++) { triggeredTopics[i]->messages.clear(); triggeredTopics[i]->triggered = false; } numTriggeredTopics = 0; senderHoles.clear(); messageId = 0; } }; } #endif ================================================ FILE: nerd_modules/http/httplib/uWS/Utilities.h ================================================ /* * Authored by Alex Hultman, 2018-2020. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UWS_UTILITIES_H #define UWS_UTILITIES_H /* Various common utilities */ #include namespace uWS { namespace utils { inline int u32toaHex(uint32_t value, char *dst) { char palette[] = "0123456789abcdef"; char temp[10]; char *p = temp; do { *p++ = palette[value % 16]; value /= 16; } while (value > 0); int ret = (int) (p - temp); do { *dst++ = *--p; } while (p != temp); return ret; } inline int u64toa(uint64_t value, char *dst) { char temp[20]; char *p = temp; do { *p++ = (char) ((value % 10) + '0'); value /= 10; } while (value > 0); int ret = (int) (p - temp); do { *dst++ = *--p; } while (p != temp); return ret; } } } #endif // UWS_UTILITIES_H ================================================ FILE: nerd_modules/http/httplib/uWS/WebSocket.h ================================================ /* * Authored by Alex Hultman, 2018-2021. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UWS_WEBSOCKET_H #define UWS_WEBSOCKET_H #include "WebSocketData.h" #include "WebSocketProtocol.h" #include "AsyncSocket.h" #include "WebSocketContextData.h" #include namespace uWS { template struct WebSocket : AsyncSocket { template friend struct TemplatedApp; template friend struct HttpResponse; private: typedef AsyncSocket Super; void *init(bool perMessageDeflate, CompressOptions compressOptions, std::string &&backpressure) { new (us_socket_ext(SSL, (us_socket_t *) this)) WebSocketData(perMessageDeflate, compressOptions, std::move(backpressure)); return this; } public: /* Returns pointer to the per socket user data */ USERDATA *getUserData() { WebSocketData *webSocketData = (WebSocketData *) us_socket_ext(SSL, (us_socket_t *) this); /* We just have it overallocated by sizeof type */ return (USERDATA *) (webSocketData + 1); } /* See AsyncSocket */ using Super::getBufferedAmount; using Super::getRemoteAddress; using Super::getRemoteAddressAsText; using Super::getNativeHandle; /* Simple, immediate close of the socket. Emits close event */ using Super::close; enum SendStatus : int { BACKPRESSURE, SUCCESS, DROPPED }; /* Send or buffer a WebSocket frame, compressed or not. Returns BACKPRESSURE on increased user space backpressure, * DROPPED on dropped message (due to backpressure) or SUCCCESS if you are free to send even more now. */ SendStatus send(std::string_view message, OpCode opCode = OpCode::BINARY, bool compress = false) { WebSocketContextData *webSocketContextData = (WebSocketContextData *) us_socket_context_ext(SSL, (us_socket_context_t *) us_socket_context(SSL, (us_socket_t *) this) ); /* Skip sending and report success if we are over the limit of maxBackpressure */ if (webSocketContextData->maxBackpressure && webSocketContextData->maxBackpressure < getBufferedAmount()) { /* Also defer a close if we should */ if (webSocketContextData->closeOnBackpressureLimit) { us_socket_shutdown_read(SSL, (us_socket_t *) this); } return DROPPED; } /* Transform the message to compressed domain if requested */ if (compress) { WebSocketData *webSocketData = (WebSocketData *) Super::getAsyncSocketData(); /* Check and correct the compress hint. It is never valid to compress 0 bytes */ if (message.length() && opCode < 3 && webSocketData->compressionStatus == WebSocketData::ENABLED) { LoopData *loopData = Super::getLoopData(); /* Compress using either shared or dedicated deflationStream */ if (webSocketData->deflationStream) { message = webSocketData->deflationStream->deflate(loopData->zlibContext, message, false); } else { message = loopData->deflationStream->deflate(loopData->zlibContext, message, true); } } else { compress = false; } } /* Check to see if we can cork for the user */ bool automaticallyCorked = false; if (!Super::isCorked() && Super::canCork()) { automaticallyCorked = true; Super::cork(); } /* Get size, alloate size, write if needed */ size_t messageFrameSize = protocol::messageFrameSize(message.length()); auto [sendBuffer, requiresWrite] = Super::getSendBuffer(messageFrameSize); protocol::formatMessage(sendBuffer, message.data(), message.length(), opCode, message.length(), compress); /* This is the slow path, when we couldn't cork for the user */ if (requiresWrite) { auto[written, failed] = Super::write(sendBuffer, (int) messageFrameSize); /* For now, we are slow here */ free(sendBuffer); if (failed) { /* Return false for failure, skipping to reset the timeout below */ return BACKPRESSURE; } } /* Uncork here if we automatically corked for the user */ if (automaticallyCorked) { auto [written, failed] = Super::uncork(); if (failed) { return BACKPRESSURE; } } /* Every successful send resets the timeout */ if (webSocketContextData->resetIdleTimeoutOnSend) { Super::timeout(webSocketContextData->idleTimeoutComponents.first); WebSocketData *webSocketData = (WebSocketData *) Super::getAsyncSocketData(); webSocketData->hasTimedOut = false; } /* Return success */ return SUCCESS; } /* Send websocket close frame, emit close event, send FIN if successful. * Will not append a close reason if code is 0 or 1005. */ void end(int code = 0, std::string_view message = {}) { /* Check if we already called this one */ WebSocketData *webSocketData = (WebSocketData *) us_socket_ext(SSL, (us_socket_t *) this); if (webSocketData->isShuttingDown) { return; } /* We postpone any FIN sending to either drainage or uncorking */ webSocketData->isShuttingDown = true; /* Format and send the close frame */ static const int MAX_CLOSE_PAYLOAD = 123; size_t length = std::min(MAX_CLOSE_PAYLOAD, message.length()); char closePayload[MAX_CLOSE_PAYLOAD + 2]; size_t closePayloadLength = protocol::formatClosePayload(closePayload, (uint16_t) code, message.data(), length); bool ok = send(std::string_view(closePayload, closePayloadLength), OpCode::CLOSE); /* FIN if we are ok and not corked */ if (!this->isCorked()) { if (ok) { /* If we are not corked, and we just sent off everything, we need to FIN right here. * In all other cases, we need to fin either if uncork was successful, or when drainage is complete. */ this->shutdown(); } } /* Emit close event */ WebSocketContextData *webSocketContextData = (WebSocketContextData *) us_socket_context_ext(SSL, (us_socket_context_t *) us_socket_context(SSL, (us_socket_t *) this) ); if (webSocketContextData->closeHandler) { webSocketContextData->closeHandler(this, code, message); } /* Make sure to unsubscribe from any pub/sub node at exit */ webSocketContextData->topicTree.unsubscribeAll(webSocketData->subscriber, false); delete webSocketData->subscriber; webSocketData->subscriber = nullptr; } /* Corks the response if possible. Leaves already corked socket be. */ void cork(MoveOnlyFunction &&handler) { if (!Super::isCorked() && Super::canCork()) { Super::cork(); handler(); /* There is no timeout when failing to uncork for WebSockets, * as that is handled by idleTimeout */ auto [written, failed] = Super::uncork(); } else { /* We are already corked, or can't cork so let's just call the handler */ handler(); } } /* Subscribe to a topic according to MQTT rules and syntax. Returns success */ /*std::pair*/ bool subscribe(std::string_view topic, bool nonStrict = false) { WebSocketContextData *webSocketContextData = (WebSocketContextData *) us_socket_context_ext(SSL, (us_socket_context_t *) us_socket_context(SSL, (us_socket_t *) this) ); /* Make us a subscriber if we aren't yet */ WebSocketData *webSocketData = (WebSocketData *) us_socket_ext(SSL, (us_socket_t *) this); if (!webSocketData->subscriber) { webSocketData->subscriber = new Subscriber(this); } /* Cannot return numSubscribers as this is only for this particular websocket context */ return webSocketContextData->topicTree.subscribe(topic, webSocketData->subscriber, nonStrict).second; } /* Unsubscribe from a topic, returns true if we were subscribed. */ /*std::pair*/ bool unsubscribe(std::string_view topic, bool nonStrict = false) { WebSocketContextData *webSocketContextData = (WebSocketContextData *) us_socket_context_ext(SSL, (us_socket_context_t *) us_socket_context(SSL, (us_socket_t *) this) ); WebSocketData *webSocketData = (WebSocketData *) us_socket_ext(SSL, (us_socket_t *) this); /* Cannot return numSubscribers as this is only for this particular websocket context */ return webSocketContextData->topicTree.unsubscribe(topic, webSocketData->subscriber, nonStrict).second; } /* Returns whether this socket is subscribed to the specified topic */ bool isSubscribed(std::string_view topic) { WebSocketContextData *webSocketContextData = (WebSocketContextData *) us_socket_context_ext(SSL, (us_socket_context_t *) us_socket_context(SSL, (us_socket_t *) this) ); WebSocketData *webSocketData = (WebSocketData *) us_socket_ext(SSL, (us_socket_t *) this); if (!webSocketData->subscriber) { return false; } Topic *t = webSocketContextData->topicTree.lookupTopic(topic); if (t) { return t->subs.find(webSocketData->subscriber) != t->subs.end(); } return false; } /* Iterates all topics of this WebSocket. Every topic is represented by its full name. * Can be called in close handler. It is possible to modify the subscription list while * inside the callback ONLY IF not modifying the topic passed to the callback. * Topic names are valid only for the duration of the callback. */ void iterateTopics(MoveOnlyFunction cb) { WebSocketData *webSocketData = (WebSocketData *) us_socket_ext(SSL, (us_socket_t *) this); if (webSocketData->subscriber) { for (Topic *t : webSocketData->subscriber->subscriptions) { /* Lock this topic so that nobody may unsubscribe from it during this callback */ t->locked = true; cb(t->fullName/*, (unsigned int) t->subs.size()*/); t->locked = false; } } } /* Publish a message to a topic according to MQTT rules and syntax. Returns success. * We, the WebSocket, must be subscribed to the topic itself and if so - no message will be sent to ourselves. * Use App::publish for an unconditional publish that simply publishes to whomever might be subscribed. */ bool publish(std::string_view topic, std::string_view message, OpCode opCode = OpCode::TEXT, bool compress = false) { WebSocketContextData *webSocketContextData = (WebSocketContextData *) us_socket_context_ext(SSL, (us_socket_context_t *) us_socket_context(SSL, (us_socket_t *) this) ); /* We cannot be a subscriber of this topic if we are not a subscriber of anything */ WebSocketData *webSocketData = (WebSocketData *) us_socket_ext(SSL, (us_socket_t *) this); if (!webSocketData->subscriber) { /* Failure, but still do return the number of subscribers */ return false; } /* Publish as sender, does not receive its own messages even if subscribed to relevant topics */ bool success = webSocketContextData->publish(topic, message, opCode, compress, webSocketData->subscriber); /* Loop over all websocket contexts for this App */ if (success) { /* Success is really only determined by the first publish. We must be subscribed to the topic. */ for (auto *adjacentWebSocketContextData : webSocketContextData->adjacentWebSocketContextDatas) { adjacentWebSocketContextData->publish(topic, message, opCode, compress); } } return success; } }; } #endif // UWS_WEBSOCKET_H ================================================ FILE: nerd_modules/http/httplib/uWS/WebSocketContext.h ================================================ /* * Authored by Alex Hultman, 2018-2020. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UWS_WEBSOCKETCONTEXT_H #define UWS_WEBSOCKETCONTEXT_H #include "WebSocketContextData.h" #include "WebSocketProtocol.h" #include "WebSocketData.h" #include "WebSocket.h" namespace uWS { template struct WebSocketContext { template friend struct TemplatedApp; template friend struct WebSocketProtocol; private: WebSocketContext() = delete; us_socket_context_t *getSocketContext() { return (us_socket_context_t *) this; } WebSocketContextData *getExt() { return (WebSocketContextData *) us_socket_context_ext(SSL, (us_socket_context_t *) this); } /* If we have negotiated compression, set this frame compressed */ static bool setCompressed(WebSocketState */*wState*/, void *s) { WebSocketData *webSocketData = (WebSocketData *) us_socket_ext(SSL, (us_socket_t *) s); if (webSocketData->compressionStatus == WebSocketData::CompressionStatus::ENABLED) { webSocketData->compressionStatus = WebSocketData::CompressionStatus::COMPRESSED_FRAME; return true; } else { return false; } } static void forceClose(WebSocketState */*wState*/, void *s, std::string_view reason = {}) { us_socket_close(SSL, (us_socket_t *) s, (int) reason.length(), (void *) reason.data()); } /* Returns true on breakage */ static bool handleFragment(char *data, size_t length, unsigned int remainingBytes, int opCode, bool fin, WebSocketState *webSocketState, void *s) { /* WebSocketData and WebSocketContextData */ WebSocketContextData *webSocketContextData = (WebSocketContextData *) us_socket_context_ext(SSL, us_socket_context(SSL, (us_socket_t *) s)); WebSocketData *webSocketData = (WebSocketData *) us_socket_ext(SSL, (us_socket_t *) s); /* Is this a non-control frame? */ if (opCode < 3) { /* Did we get everything in one go? */ if (!remainingBytes && fin && !webSocketData->fragmentBuffer.length()) { /* Handle compressed frame */ if (webSocketData->compressionStatus == WebSocketData::CompressionStatus::COMPRESSED_FRAME) { webSocketData->compressionStatus = WebSocketData::CompressionStatus::ENABLED; LoopData *loopData = (LoopData *) us_loop_ext(us_socket_context_loop(SSL, us_socket_context(SSL, (us_socket_t *) s))); auto inflatedFrame = loopData->inflationStream->inflate(loopData->zlibContext, {data, length}, webSocketContextData->maxPayloadLength); if (!inflatedFrame.has_value()) { forceClose(webSocketState, s, ERR_TOO_BIG_MESSAGE_INFLATION); return true; } else { data = (char *) inflatedFrame->data(); length = inflatedFrame->length(); } } /* Check text messages for Utf-8 validity */ if (opCode == 1 && !protocol::isValidUtf8((unsigned char *) data, length)) { forceClose(webSocketState, s, ERR_INVALID_TEXT); return true; } /* Emit message event & break if we are closed or shut down when returning */ if (webSocketContextData->messageHandler) { webSocketContextData->messageHandler((WebSocket *) s, std::string_view(data, length), (OpCode) opCode); if (us_socket_is_closed(SSL, (us_socket_t *) s) || webSocketData->isShuttingDown) { return true; } } } else { /* Allocate fragment buffer up front first time */ if (!webSocketData->fragmentBuffer.length()) { webSocketData->fragmentBuffer.reserve(length + remainingBytes); } /* Fragments forming a big message are not caught until appending them */ if (refusePayloadLength(length + webSocketData->fragmentBuffer.length(), webSocketState, s)) { forceClose(webSocketState, s, ERR_TOO_BIG_MESSAGE); return true; } webSocketData->fragmentBuffer.append(data, length); /* Are we done now? */ // todo: what if we don't have any remaining bytes yet we are not fin? forceclose! if (!remainingBytes && fin) { /* Handle compression */ if (webSocketData->compressionStatus == WebSocketData::CompressionStatus::COMPRESSED_FRAME) { webSocketData->compressionStatus = WebSocketData::CompressionStatus::ENABLED; /* 9 bytes of padding for libdeflate */ webSocketData->fragmentBuffer.append("123456789"); LoopData *loopData = (LoopData *) us_loop_ext( us_socket_context_loop(SSL, us_socket_context(SSL, (us_socket_t *) s) ) ); auto inflatedFrame = loopData->inflationStream->inflate(loopData->zlibContext, {webSocketData->fragmentBuffer.data(), webSocketData->fragmentBuffer.length() - 9}, webSocketContextData->maxPayloadLength); if (!inflatedFrame.has_value()) { forceClose(webSocketState, s, ERR_TOO_BIG_MESSAGE_INFLATION); return true; } else { data = (char *) inflatedFrame->data(); length = inflatedFrame->length(); } } else { // reset length and data ptrs length = webSocketData->fragmentBuffer.length(); data = webSocketData->fragmentBuffer.data(); } /* Check text messages for Utf-8 validity */ if (opCode == 1 && !protocol::isValidUtf8((unsigned char *) data, length)) { forceClose(webSocketState, s, ERR_INVALID_TEXT); return true; } /* Emit message and check for shutdown or close */ if (webSocketContextData->messageHandler) { webSocketContextData->messageHandler((WebSocket *) s, std::string_view(data, length), (OpCode) opCode); if (us_socket_is_closed(SSL, (us_socket_t *) s) || webSocketData->isShuttingDown) { return true; } } /* If we shutdown or closed, this will be taken care of elsewhere */ webSocketData->fragmentBuffer.clear(); } } } else { /* Control frames need the websocket to send pings, pongs and close */ WebSocket *webSocket = (WebSocket *) s; if (!remainingBytes && fin && !webSocketData->controlTipLength) { if (opCode == CLOSE) { auto closeFrame = protocol::parseClosePayload(data, length); webSocket->end(closeFrame.code, std::string_view(closeFrame.message, closeFrame.length)); return true; } else { if (opCode == PING) { webSocket->send(std::string_view(data, length), (OpCode) OpCode::PONG); if (webSocketContextData->pingHandler) { webSocketContextData->pingHandler(webSocket, {data, length}); if (us_socket_is_closed(SSL, (us_socket_t *) s) || webSocketData->isShuttingDown) { return true; } } } else if (opCode == PONG) { if (webSocketContextData->pongHandler) { webSocketContextData->pongHandler(webSocket, {data, length}); if (us_socket_is_closed(SSL, (us_socket_t *) s) || webSocketData->isShuttingDown) { return true; } } } } } else { /* Here we never mind any size optimizations as we are in the worst possible path */ webSocketData->fragmentBuffer.append(data, length); webSocketData->controlTipLength += (unsigned int) length; if (!remainingBytes && fin) { char *controlBuffer = (char *) webSocketData->fragmentBuffer.data() + webSocketData->fragmentBuffer.length() - webSocketData->controlTipLength; if (opCode == CLOSE) { protocol::CloseFrame closeFrame = protocol::parseClosePayload(controlBuffer, webSocketData->controlTipLength); webSocket->end(closeFrame.code, std::string_view(closeFrame.message, closeFrame.length)); return true; } else { if (opCode == PING) { webSocket->send(std::string_view(controlBuffer, webSocketData->controlTipLength), (OpCode) OpCode::PONG); if (webSocketContextData->pingHandler) { webSocketContextData->pingHandler(webSocket, std::string_view(controlBuffer, webSocketData->controlTipLength)); if (us_socket_is_closed(SSL, (us_socket_t *) s) || webSocketData->isShuttingDown) { return true; } } } else if (opCode == PONG) { if (webSocketContextData->pongHandler) { webSocketContextData->pongHandler(webSocket, std::string_view(controlBuffer, webSocketData->controlTipLength)); if (us_socket_is_closed(SSL, (us_socket_t *) s) || webSocketData->isShuttingDown) { return true; } } } } /* Same here, we do not care for any particular smart allocation scheme */ webSocketData->fragmentBuffer.resize(webSocketData->fragmentBuffer.length() - webSocketData->controlTipLength); webSocketData->controlTipLength = 0; } } } return false; } static bool refusePayloadLength(uint64_t length, WebSocketState */*wState*/, void *s) { auto *webSocketContextData = (WebSocketContextData *) us_socket_context_ext(SSL, us_socket_context(SSL, (us_socket_t *) s)); /* Return true for refuse, false for accept */ return webSocketContextData->maxPayloadLength < length; } WebSocketContext *init() { /* Adopting a socket does not trigger open event. * We arreive as WebSocket with timeout set and * any backpressure from HTTP state kept. */ /* Handle socket disconnections */ us_socket_context_on_close(SSL, getSocketContext(), [](auto *s, int code, void *reason) { /* For whatever reason, if we already have emitted close event, do not emit it again */ WebSocketData *webSocketData = (WebSocketData *) (us_socket_ext(SSL, s)); if (!webSocketData->isShuttingDown) { /* Emit close event */ auto *webSocketContextData = (WebSocketContextData *) us_socket_context_ext(SSL, us_socket_context(SSL, (us_socket_t *) s)); if (webSocketContextData->closeHandler) { webSocketContextData->closeHandler((WebSocket *) s, 1006, {(char *) reason, (size_t) code}); } /* Make sure to unsubscribe from any pub/sub node at exit */ webSocketContextData->topicTree.unsubscribeAll(webSocketData->subscriber, false); delete webSocketData->subscriber; webSocketData->subscriber = nullptr; } /* Destruct in-placed data struct */ webSocketData->~WebSocketData(); return s; }); /* Handle WebSocket data streams */ us_socket_context_on_data(SSL, getSocketContext(), [](auto *s, char *data, int length) { /* We need the websocket data */ WebSocketData *webSocketData = (WebSocketData *) (us_socket_ext(SSL, s)); /* When in websocket shutdown mode, we do not care for ANY message, whether responding close frame or not. * We only care for the TCP FIN really, not emitting any message after closing is key */ if (webSocketData->isShuttingDown) { return s; } auto *webSocketContextData = (WebSocketContextData *) us_socket_context_ext(SSL, us_socket_context(SSL, (us_socket_t *) s)); auto *asyncSocket = (AsyncSocket *) s; /* Every time we get data and not in shutdown state we simply reset the timeout */ asyncSocket->timeout(webSocketContextData->idleTimeoutComponents.first); webSocketData->hasTimedOut = false; /* We always cork on data */ asyncSocket->cork(); /* This parser has virtually no overhead */ WebSocketProtocol>::consume(data, (unsigned int) length, (WebSocketState *) webSocketData, s); /* Uncorking a closed socekt is fine, in fact it is needed */ asyncSocket->uncork(); /* If uncorking was successful and we are in shutdown state then send TCP FIN */ if (asyncSocket->getBufferedAmount() == 0) { /* We can now be in shutdown state */ if (webSocketData->isShuttingDown) { /* Shutting down a closed socket is handled by uSockets and just fine */ asyncSocket->shutdown(); } } return s; }); /* Handle HTTP write out (note: SSL_read may trigger this spuriously, the app need to handle spurious calls) */ us_socket_context_on_writable(SSL, getSocketContext(), [](auto *s) { /* NOTE: Are we called here corked? If so, the below write code is broken, since * we will have 0 as getBufferedAmount due to writing to cork buffer, then sending TCP FIN before * we actually uncorked and sent off things */ /* It makes sense to check for us_is_shut_down here and return if so, to avoid shutting down twice */ if (us_socket_is_shut_down(SSL, (us_socket_t *) s)) { return s; } AsyncSocket *asyncSocket = (AsyncSocket *) s; WebSocketData *webSocketData = (WebSocketData *)(us_socket_ext(SSL, s)); /* We store old backpressure since it is unclear whether write drained anything, * however, in case of coming here with 0 backpressure we still need to emit drain event */ unsigned int backpressure = asyncSocket->getBufferedAmount(); /* Drain as much as possible */ asyncSocket->write(nullptr, 0); /* Behavior: if we actively drain backpressure, always reset timeout (even if we are in shutdown) */ /* Also reset timeout if we came here with 0 backpressure */ if (!backpressure || backpressure > asyncSocket->getBufferedAmount()) { auto *webSocketContextData = (WebSocketContextData *) us_socket_context_ext(SSL, us_socket_context(SSL, (us_socket_t *) s)); asyncSocket->timeout(webSocketContextData->idleTimeoutComponents.first); webSocketData->hasTimedOut = false; } /* Are we in (WebSocket) shutdown mode? */ if (webSocketData->isShuttingDown) { /* Check if we just now drained completely */ if (asyncSocket->getBufferedAmount() == 0) { /* Now perform the actual TCP/TLS shutdown which was postponed due to backpressure */ asyncSocket->shutdown(); } } else if (!backpressure || backpressure > asyncSocket->getBufferedAmount()) { /* Only call drain if we actually drained backpressure or if we came here with 0 backpressure */ auto *webSocketContextData = (WebSocketContextData *) us_socket_context_ext(SSL, us_socket_context(SSL, (us_socket_t *) s)); if (webSocketContextData->drainHandler) { webSocketContextData->drainHandler((WebSocket *) s); } /* No need to check for closed here as we leave the handler immediately*/ } return s; }); /* Handle FIN, HTTP does not support half-closed sockets, so simply close */ us_socket_context_on_end(SSL, getSocketContext(), [](auto *s) { /* If we get a fin, we just close I guess */ us_socket_close(SSL, (us_socket_t *) s, 0, nullptr); return s; }); /* Handle socket timeouts, simply close them so to not confuse client with FIN */ us_socket_context_on_timeout(SSL, getSocketContext(), [](auto *s) { auto *webSocketData = (WebSocketData *)(us_socket_ext(SSL, s)); auto *webSocketContextData = (WebSocketContextData *) us_socket_context_ext(SSL, us_socket_context(SSL, (us_socket_t *) s)); if (webSocketContextData->sendPingsAutomatically && !webSocketData->hasTimedOut) { webSocketData->hasTimedOut = true; us_socket_timeout(SSL, s, webSocketContextData->idleTimeoutComponents.second); /* Send ping without being corked */ ((AsyncSocket *) s)->write("\x89\x00", 2); return s; } /* Timeout is very simple; we just close it */ /* Warning: we happen to know forceClose will not use first parameter so pass nullptr here */ forceClose(nullptr, s, ERR_WEBSOCKET_TIMEOUT); return s; }); return this; } void free() { WebSocketContextData *webSocketContextData = (WebSocketContextData *) us_socket_context_ext(SSL, (us_socket_context_t *) this); webSocketContextData->~WebSocketContextData(); us_socket_context_free(SSL, (us_socket_context_t *) this); } public: /* WebSocket contexts are always child contexts to a HTTP context so no SSL options are needed as they are inherited */ static WebSocketContext *create(Loop */*loop*/, us_socket_context_t *parentSocketContext) { WebSocketContext *webSocketContext = (WebSocketContext *) us_create_child_socket_context(SSL, parentSocketContext, sizeof(WebSocketContextData)); if (!webSocketContext) { return nullptr; } /* Init socket context data */ new ((WebSocketContextData *) us_socket_context_ext(SSL, (us_socket_context_t *)webSocketContext)) WebSocketContextData; return webSocketContext->init(); } }; } #endif // UWS_WEBSOCKETCONTEXT_H ================================================ FILE: nerd_modules/http/httplib/uWS/WebSocketContextData.h ================================================ /* * Authored by Alex Hultman, 2018-2020. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UWS_WEBSOCKETCONTEXTDATA_H #define UWS_WEBSOCKETCONTEXTDATA_H #include "MoveOnlyFunction.h" #include #include #include "WebSocketProtocol.h" #include "TopicTree.h" #include "WebSocketData.h" namespace uWS { template struct WebSocket; /* todo: this looks identical to WebSocketBehavior, why not just std::move that entire thing in? */ template struct WebSocketContextData { private: /* Used for prepending unframed messages when using dedicated compressors */ struct MessageMetadata { unsigned int length; OpCode opCode; bool compress; /* Undefined init of all members */ MessageMetadata() {} MessageMetadata(unsigned int length, OpCode opCode, bool compress) : length(length), opCode(opCode), compress(compress) {} }; public: /* All WebSocketContextData holds a list to all other WebSocketContextData in this app. * We cannot type it USERDATA since different WebSocketContextData can have different USERDATA. */ std::vector *> adjacentWebSocketContextDatas; /* The callbacks for this context */ MoveOnlyFunction *)> openHandler = nullptr; MoveOnlyFunction *, std::string_view, OpCode)> messageHandler = nullptr; MoveOnlyFunction *)> drainHandler = nullptr; MoveOnlyFunction *, int, std::string_view)> closeHandler = nullptr; /* Todo: these should take message also; breaking change for v0.18 */ MoveOnlyFunction *, std::string_view)> pingHandler = nullptr; MoveOnlyFunction *, std::string_view)> pongHandler = nullptr; /* Settings for this context */ size_t maxPayloadLength = 0; /* We do need these for async upgrade */ CompressOptions compression; /* There needs to be a maxBackpressure which will force close everything over that limit */ size_t maxBackpressure = 0; bool closeOnBackpressureLimit; bool resetIdleTimeoutOnSend; bool sendPingsAutomatically; /* These are calculated on creation */ std::pair idleTimeoutComponents; /* Each websocket context has a topic tree for pub/sub */ TopicTree topicTree; /* This is run once on start-up */ void calculateIdleTimeoutCompnents(unsigned short idleTimeout) { unsigned short margin = 4; /* 4, 8 or 16 seconds margin based on idleTimeout */ while ((int) idleTimeout - margin * 2 >= margin * 2 && margin < 16) { margin = (unsigned short) (margin << 1); } /* We should have no margin if not using sendPingsAutomatically */ if (!sendPingsAutomatically) { margin = 0; } idleTimeoutComponents = { idleTimeout - margin, margin }; } ~WebSocketContextData() { /* We must unregister any loop post handler here */ Loop::get()->removePostHandler(this); Loop::get()->removePreHandler(this); } WebSocketContextData() : topicTree([this](Subscriber *s, Intersection &intersection) -> int { /* We could potentially be called here even if we have nothing to send, since we can * be the sender of every single message in this intersection. Also "fin" of a segment is not * guaranteed to be set, in case remaining segments are all from us. * Essentially, we cannot make strict assumptions here. Also, we can even come here corked, * since publish can call drain! */ /* We rely on writing to regular asyncSockets */ auto *asyncSocket = (AsyncSocket *) s->user; /* If we are corked, do not uncork - otherwise if we cork in here, uncork before leaving */ bool wasCorked = asyncSocket->isCorked(); /* Do we even have room for potential data? */ if (!maxBackpressure || asyncSocket->getBufferedAmount() < maxBackpressure) { /* Roll over all our segments */ intersection.forSubscriber(topicTree.getSenderFor(s), [asyncSocket, this](std::pair data, bool fin) { /* We have a segment that is not marked as last ("fin"). * Cork if not already so (purely for performance reasons). Does not touch "wasCorked". */ if (!fin && !asyncSocket->isCorked() && asyncSocket->canCork()) { asyncSocket->cork(); } /* Pick uncompressed data track */ std::string_view selectedData = data.first; /* Are we using compression? Fine, pick the compressed data track */ WebSocketData *webSocketData = (WebSocketData *) asyncSocket->getAsyncSocketData(); if (webSocketData->compressionStatus != WebSocketData::CompressionStatus::DISABLED) { /* This is used for both shared and dedicated paths */ selectedData = data.second; /* However, dedicated compression has its own path */ if (compression != SHARED_COMPRESSOR) { WebSocket *ws = (WebSocket *) asyncSocket; /* For performance reasons we always cork when in dedicated mode. * Is this really the best? We already kind of cork things in Zlib? * Right, formatting needs a cork buffer, right. Never mind. */ if (!ws->isCorked() && ws->canCork()) { asyncSocket->cork(); } while (selectedData.length()) { /* Interpret the data like so, because this is how we shoved it in */ MessageMetadata mm; memcpy((char *) &mm, selectedData.data(), sizeof(MessageMetadata)); std::string_view unframedMessage(selectedData.data() + sizeof(MessageMetadata), mm.length); /* Skip this message if our backpressure is too high */ if (maxBackpressure && ws->getBufferedAmount() > maxBackpressure) { break; } /* Here we perform the actual compression and framing */ ws->send(unframedMessage, mm.opCode, mm.compress); /* Advance until empty */ selectedData.remove_prefix(sizeof(MessageMetadata) + mm.length); } /* Continue to next segment without executing below path */ return; } } /* Common path for SHARED and DISABLED. It is an invalid assumption that we always are * uncorked here, however the following (invalid) assumption is not critically wrong either way */ /* Note: this assumes we are not corked, as corking will swallow things and fail later on */ auto [written, failed] = asyncSocket->write(selectedData.data(), (int) selectedData.length()); /* If we want strict check for success, we can ignore this check if corked and repeat below * when uncorking - however this is too strict as we really care about PROGRESS rather than * ENTIRE SUCCESS - we need minor API changes to support correct checks */ if (!failed) { if (this->resetIdleTimeoutOnSend) { auto *webSocketData = (WebSocketData *) us_socket_ext(SSL, (us_socket_t *) asyncSocket); webSocketData->hasTimedOut = false; asyncSocket->timeout(this->idleTimeoutComponents.first); } } }); } /* We are done sending, for whatever reasons we ended up corked while not starting with "wasCorked", * we here need to uncork to restore the state we were called in */ if (!wasCorked && asyncSocket->isCorked()) { /* Regarding timeout for writes; */ auto [written, failed] = asyncSocket->uncork(); /* Again, this check should be more like DID WE PROGRESS rather than DID WE SUCCEED ENTIRELY */ if (!failed) { if (this->resetIdleTimeoutOnSend) { auto *webSocketData = (WebSocketData *) us_socket_ext(SSL, (us_socket_t *) asyncSocket); webSocketData->hasTimedOut = false; asyncSocket->timeout(this->idleTimeoutComponents.first); } } } /* Defer a close if we now have (or already had) too much backpressure, or simply skip */ if (maxBackpressure && closeOnBackpressureLimit && asyncSocket->getBufferedAmount() > maxBackpressure) { /* We must not immediately close the socket, as that could result in stack overflow, * iterator invalidation and other TopicTree::drain bugs. We may shutdown the reading side of the socket, * causing next iteration to error-close the socket from that context instead, if we want to */ us_socket_shutdown_read(SSL, (us_socket_t *) asyncSocket); } /* Reserved, unused */ return 0; }) { /* We empty for both pre and post just to make sure */ Loop::get()->addPostHandler(this, [this](Loop */*loop*/) { /* Commit pub/sub batches every loop iteration */ topicTree.drain(); }); Loop::get()->addPreHandler(this, [this](Loop */*loop*/) { /* Commit pub/sub batches every loop iteration */ topicTree.drain(); }); } /* Helper for topictree publish, common path from app and ws */ bool publish(std::string_view topic, std::string_view message, OpCode opCode, bool compress, Subscriber *sender = nullptr) { bool didMatch = false; /* We frame the message right here and only pass raw bytes to the pub/subber */ char *dst = (char *) malloc(protocol::messageFrameSize(message.size())); size_t dst_length = protocol::formatMessage(dst, message.data(), message.length(), opCode, message.length(), false); /* If compression is disabled */ if (compression == DISABLED) { /* Leave second field empty as nobody will ever read it */ didMatch |= topicTree.publish(topic, {std::string_view(dst, dst_length), {}}, sender); } else { /* DEDICATED_COMPRESSOR always takes the same path as must always have MessageMetadata as head */ if (compress || compression != SHARED_COMPRESSOR) { /* Shared compression mode publishes compressed, framed data */ if (compression == SHARED_COMPRESSOR) { /* Loop data holds shared compressor */ LoopData *loopData = (LoopData *) us_loop_ext((us_loop_t *) Loop::get()); /* Compress it */ std::string_view compressedMessage = loopData->deflationStream->deflate(loopData->zlibContext, message, true); /* Frame it */ char *dst_compressed = (char *) malloc(protocol::messageFrameSize(compressedMessage.size())); size_t dst_compressed_length = protocol::formatMessage(dst_compressed, compressedMessage.data(), compressedMessage.length(), opCode, compressedMessage.length(), true); /* Always publish the shortest one in any case */ didMatch |= topicTree.publish(topic, {std::string_view(dst, dst_length), dst_compressed_length >= dst_length ? std::string_view(dst, dst_length) : std::string_view(dst_compressed, dst_compressed_length)}, sender); /* We don't care for allocation here */ ::free(dst_compressed); } else { /* Dedicated compression mode publishes metadata + unframed uncompressed data */ char *dst_compressed = (char *) malloc(message.length() + sizeof(MessageMetadata)); MessageMetadata mm( (unsigned int) message.length(), opCode, compress ); memcpy(dst_compressed, (char *) &mm, sizeof(MessageMetadata)); memcpy(dst_compressed + sizeof(MessageMetadata), message.data(), message.length()); /* Interpretation of compressed data depends on what compressor we use */ didMatch |= topicTree.publish(topic, { std::string_view(dst, dst_length), std::string_view(dst_compressed, message.length() + sizeof(MessageMetadata)) }, sender); ::free(dst_compressed); } } else { /* If not compressing, put same message on both tracks (only valid for SHARED_COMPRESSOR). * DEDICATED_COMPRESSOR_xKB must never end up here as we don't put a proper head here. */ didMatch |= topicTree.publish(topic, {std::string_view(dst, dst_length), std::string_view(dst, dst_length)}, sender); } } ::free(dst); return didMatch; } }; } #endif // UWS_WEBSOCKETCONTEXTDATA_H ================================================ FILE: nerd_modules/http/httplib/uWS/WebSocketData.h ================================================ /* * Authored by Alex Hultman, 2018-2020. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UWS_WEBSOCKETDATA_H #define UWS_WEBSOCKETDATA_H #include "WebSocketProtocol.h" #include "AsyncSocketData.h" #include "PerMessageDeflate.h" #include "TopicTree.h" #include namespace uWS { struct WebSocketData : AsyncSocketData, WebSocketState { /* This guy has a lot of friends - why? */ template friend struct WebSocketContext; template friend struct WebSocketContextData; template friend struct WebSocket; template friend struct HttpContext; private: std::string fragmentBuffer; unsigned int controlTipLength = 0; bool isShuttingDown = 0; bool hasTimedOut = false; enum CompressionStatus : char { DISABLED, ENABLED, COMPRESSED_FRAME } compressionStatus; /* We might have a dedicated compressor */ DeflationStream *deflationStream = nullptr; /* We could be a subscriber */ Subscriber *subscriber = nullptr; public: WebSocketData(bool perMessageDeflate, CompressOptions compressOptions, std::string &&backpressure) : AsyncSocketData(std::move(backpressure)), WebSocketState() { compressionStatus = perMessageDeflate ? ENABLED : DISABLED; /* Initialize the dedicated sliding window */ if (perMessageDeflate && (compressOptions != CompressOptions::SHARED_COMPRESSOR)) { deflationStream = new DeflationStream(compressOptions); } } ~WebSocketData() { if (deflationStream) { delete deflationStream; } if (subscriber) { delete subscriber; } } }; } #endif // UWS_WEBSOCKETDATA_H ================================================ FILE: nerd_modules/http/httplib/uWS/WebSocketExtensions.h ================================================ /* * Authored by Alex Hultman, 2018-2021. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UWS_WEBSOCKETEXTENSIONS_H #define UWS_WEBSOCKETEXTENSIONS_H /* There is a new, huge bug scenario that needs to be fixed: * pub/sub does not support being in DEDICATED_COMPRESSOR-mode while having * some clients downgraded to SHARED_COMPRESSOR - we cannot allow the client to * demand a downgrade to SHARED_COMPRESSOR (yet) until we fix that scenario in pub/sub */ // #define UWS_ALLOW_SHARED_AND_DEDICATED_COMPRESSOR_MIX /* We forbid negotiating 8 windowBits since Zlib has a bug with this */ // #define UWS_ALLOW_8_WINDOW_BITS #include #include #include #include #include namespace uWS { enum ExtensionTokens { /* Standard permessage-deflate tokens */ TOK_PERMESSAGE_DEFLATE = 1838, TOK_SERVER_NO_CONTEXT_TAKEOVER = 2807, TOK_CLIENT_NO_CONTEXT_TAKEOVER = 2783, TOK_SERVER_MAX_WINDOW_BITS = 2372, TOK_CLIENT_MAX_WINDOW_BITS = 2348, /* Non-standard alias for Safari */ TOK_X_WEBKIT_DEFLATE_FRAME = 2149, TOK_NO_CONTEXT_TAKEOVER = 2049, TOK_MAX_WINDOW_BITS = 1614 }; struct ExtensionsParser { private: int *lastInteger = nullptr; public: /* Standard */ bool perMessageDeflate = false; bool serverNoContextTakeover = false; bool clientNoContextTakeover = false; int serverMaxWindowBits = 0; int clientMaxWindowBits = 0; /* Non-standard Safari */ bool xWebKitDeflateFrame = false; bool noContextTakeover = false; int maxWindowBits = 0; int getToken(const char *&in, const char *stop) { while (in != stop && !isalnum(*in)) { in++; } /* Don't care more than this for now */ static_assert(SHRT_MIN > INT_MIN, "Integer overflow fix is invalid for this platform, report this as a bug!"); int hashedToken = 0; while (in != stop && (isalnum(*in) || *in == '-' || *in == '_')) { if (isdigit(*in)) { /* This check is a quick and incorrect fix for integer overflow * in oss-fuzz but we don't care as it doesn't matter either way */ if (hashedToken > SHRT_MIN && hashedToken < SHRT_MAX) { hashedToken = hashedToken * 10 - (*in - '0'); } } else { hashedToken += *in; } in++; } return hashedToken; } ExtensionsParser(const char *data, size_t length) { const char *stop = data + length; int token = 1; /* Ignore anything before permessage-deflate or x-webkit-deflate-frame */ for (; token && token != TOK_PERMESSAGE_DEFLATE && token != TOK_X_WEBKIT_DEFLATE_FRAME; token = getToken(data, stop)); /* What protocol are we going to use? */ perMessageDeflate = (token == TOK_PERMESSAGE_DEFLATE); xWebKitDeflateFrame = (token == TOK_X_WEBKIT_DEFLATE_FRAME); while ((token = getToken(data, stop))) { switch (token) { case TOK_X_WEBKIT_DEFLATE_FRAME: /* Duplicates not allowed/supported */ return; case TOK_NO_CONTEXT_TAKEOVER: noContextTakeover = true; break; case TOK_MAX_WINDOW_BITS: maxWindowBits = 1; lastInteger = &maxWindowBits; break; case TOK_PERMESSAGE_DEFLATE: /* Duplicates not allowed/supported */ return; case TOK_SERVER_NO_CONTEXT_TAKEOVER: serverNoContextTakeover = true; break; case TOK_CLIENT_NO_CONTEXT_TAKEOVER: clientNoContextTakeover = true; break; case TOK_SERVER_MAX_WINDOW_BITS: serverMaxWindowBits = 1; lastInteger = &serverMaxWindowBits; break; case TOK_CLIENT_MAX_WINDOW_BITS: clientMaxWindowBits = 1; lastInteger = &clientMaxWindowBits; break; default: if (token < 0 && lastInteger) { *lastInteger = -token; } break; } } } }; /* Takes what we (the server) wants, returns what we got */ static inline std::tuple negotiateCompression(bool wantCompression, int wantedCompressionWindow, int wantedInflationWindow, std::string_view offer) { /* If we don't want compression then we are done here */ if (!wantCompression) { return {false, 0, 0, ""}; } ExtensionsParser ep(offer.data(), offer.length()); static thread_local std::string response; response = ""; int compressionWindow = wantedCompressionWindow; int inflationWindow = wantedInflationWindow; bool compression = false; if (ep.xWebKitDeflateFrame) { /* We now have compression */ compression = true; response = "x-webkit-deflate-frame"; /* If the other peer has DEMANDED us no sliding window, * we cannot compress with anything other than shared compressor */ if (ep.noContextTakeover) { /* We must fail here right now (fix pub/sub) */ #ifndef UWS_ALLOW_SHARED_AND_DEDICATED_COMPRESSOR_MIX if (wantedCompressionWindow != 0) { return {false, 0, 0, ""}; } #endif compressionWindow = 0; } /* If the other peer has DEMANDED us to use a limited sliding window, * we have to limit out compression sliding window */ if (ep.maxWindowBits && ep.maxWindowBits < compressionWindow) { compressionWindow = ep.maxWindowBits; #ifndef UWS_ALLOW_8_WINDOW_BITS /* We cannot really deny this, so we have to disable compression in this case */ if (compressionWindow == 8) { return {false, 0, 0, ""}; } #endif } /* We decide our own inflation sliding window (and their compression sliding window) */ if (wantedInflationWindow < 15) { if (!wantedInflationWindow) { response += "; no_context_takeover"; } else { response += "; max_window_bits=" + std::to_string(wantedInflationWindow); } } } else if (ep.perMessageDeflate) { /* We now have compression */ compression = true; response = "permessage-deflate"; if (ep.clientNoContextTakeover) { inflationWindow = 0; } else if (ep.clientMaxWindowBits && ep.clientMaxWindowBits != 1) { inflationWindow = std::min(ep.clientMaxWindowBits, inflationWindow); } /* Whatever we have now, write */ if (inflationWindow < 15) { if (!inflationWindow || !ep.clientMaxWindowBits) { response += "; client_no_context_takeover"; inflationWindow = 0; } else { response += "; client_max_window_bits=" + std::to_string(inflationWindow); } } /* This block basically lets the client lower it */ if (ep.serverNoContextTakeover) { /* This is an important (temporary) fix since we haven't allowed * these two modes to mix, and pub/sub will not handle this case (yet) */ #ifdef UWS_ALLOW_SHARED_AND_DEDICATED_COMPRESSOR_MIX compressionWindow = 0; #endif } else if (ep.serverMaxWindowBits) { compressionWindow = std::min(ep.serverMaxWindowBits, compressionWindow); #ifndef UWS_ALLOW_8_WINDOW_BITS /* Zlib cannot do windowBits=8, memLevel=1 so we raise it up to 9 minimum */ if (compressionWindow == 8) { compressionWindow = 9; } #endif } /* Whatever we have now, write */ if (compressionWindow < 15) { if (!compressionWindow) { response += "; server_no_context_takeover"; } else { response += "; server_max_window_bits=" + std::to_string(compressionWindow); } } } /* A final sanity check (this check does not actually catch too high values!) */ if ((compressionWindow && compressionWindow < 8) || compressionWindow > 15 || (inflationWindow && inflationWindow < 8) || inflationWindow > 15) { return {false, 0, 0, ""}; } return {compression, compressionWindow, inflationWindow, response}; } } #endif // UWS_WEBSOCKETEXTENSIONS_H ================================================ FILE: nerd_modules/http/httplib/uWS/WebSocketHandshake.h ================================================ /* * Authored by Alex Hultman, 2018-2020. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UWS_WEBSOCKETHANDSHAKE_H #define UWS_WEBSOCKETHANDSHAKE_H #include #include namespace uWS { struct WebSocketHandshake { template struct static_for { void operator()(uint32_t *a, uint32_t *b) { static_for()(a, b); T::template f(a, b); } }; template struct static_for<0, T> { void operator()(uint32_t */*a*/, uint32_t */*hash*/) {} }; static inline uint32_t rol(uint32_t value, size_t bits) {return (value << bits) | (value >> (32 - bits));} static inline uint32_t blk(uint32_t b[16], size_t i) { return rol(b[(i + 13) & 15] ^ b[(i + 8) & 15] ^ b[(i + 2) & 15] ^ b[i], 1); } struct Sha1Loop1 { template static inline void f(uint32_t *a, uint32_t *b) { a[i % 5] += ((a[(3 + i) % 5] & (a[(2 + i) % 5] ^ a[(1 + i) % 5])) ^ a[(1 + i) % 5]) + b[i] + 0x5a827999 + rol(a[(4 + i) % 5], 5); a[(3 + i) % 5] = rol(a[(3 + i) % 5], 30); } }; struct Sha1Loop2 { template static inline void f(uint32_t *a, uint32_t *b) { b[i] = blk(b, i); a[(1 + i) % 5] += ((a[(4 + i) % 5] & (a[(3 + i) % 5] ^ a[(2 + i) % 5])) ^ a[(2 + i) % 5]) + b[i] + 0x5a827999 + rol(a[(5 + i) % 5], 5); a[(4 + i) % 5] = rol(a[(4 + i) % 5], 30); } }; struct Sha1Loop3 { template static inline void f(uint32_t *a, uint32_t *b) { b[(i + 4) % 16] = blk(b, (i + 4) % 16); a[i % 5] += (a[(3 + i) % 5] ^ a[(2 + i) % 5] ^ a[(1 + i) % 5]) + b[(i + 4) % 16] + 0x6ed9eba1 + rol(a[(4 + i) % 5], 5); a[(3 + i) % 5] = rol(a[(3 + i) % 5], 30); } }; struct Sha1Loop4 { template static inline void f(uint32_t *a, uint32_t *b) { b[(i + 8) % 16] = blk(b, (i + 8) % 16); a[i % 5] += (((a[(3 + i) % 5] | a[(2 + i) % 5]) & a[(1 + i) % 5]) | (a[(3 + i) % 5] & a[(2 + i) % 5])) + b[(i + 8) % 16] + 0x8f1bbcdc + rol(a[(4 + i) % 5], 5); a[(3 + i) % 5] = rol(a[(3 + i) % 5], 30); } }; struct Sha1Loop5 { template static inline void f(uint32_t *a, uint32_t *b) { b[(i + 12) % 16] = blk(b, (i + 12) % 16); a[i % 5] += (a[(3 + i) % 5] ^ a[(2 + i) % 5] ^ a[(1 + i) % 5]) + b[(i + 12) % 16] + 0xca62c1d6 + rol(a[(4 + i) % 5], 5); a[(3 + i) % 5] = rol(a[(3 + i) % 5], 30); } }; struct Sha1Loop6 { template static inline void f(uint32_t *a, uint32_t *b) { b[i] += a[4 - i]; } }; static inline void sha1(uint32_t hash[5], uint32_t b[16]) { uint32_t a[5] = {hash[4], hash[3], hash[2], hash[1], hash[0]}; static_for<16, Sha1Loop1>()(a, b); static_for<4, Sha1Loop2>()(a, b); static_for<20, Sha1Loop3>()(a, b); static_for<20, Sha1Loop4>()(a, b); static_for<20, Sha1Loop5>()(a, b); static_for<5, Sha1Loop6>()(a, hash); } static inline void base64(unsigned char *src, char *dst) { const char *b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; for (int i = 0; i < 18; i += 3) { *dst++ = b64[(src[i] >> 2) & 63]; *dst++ = b64[((src[i] & 3) << 4) | ((src[i + 1] & 240) >> 4)]; *dst++ = b64[((src[i + 1] & 15) << 2) | ((src[i + 2] & 192) >> 6)]; *dst++ = b64[src[i + 2] & 63]; } *dst++ = b64[(src[18] >> 2) & 63]; *dst++ = b64[((src[18] & 3) << 4) | ((src[19] & 240) >> 4)]; *dst++ = b64[((src[19] & 15) << 2)]; *dst++ = '='; } public: static inline void generate(const char input[24], char output[28]) { uint32_t b_output[5] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 }; uint32_t b_input[16] = { 0, 0, 0, 0, 0, 0, 0x32353845, 0x41464135, 0x2d453931, 0x342d3437, 0x44412d39, 0x3543412d, 0x43354142, 0x30444338, 0x35423131, 0x80000000 }; for (int i = 0; i < 6; i++) { b_input[i] = (uint32_t) ((input[4 * i + 3] & 0xff) | (input[4 * i + 2] & 0xff) << 8 | (input[4 * i + 1] & 0xff) << 16 | (input[4 * i + 0] & 0xff) << 24); } sha1(b_output, b_input); uint32_t last_b[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 480}; sha1(b_output, last_b); for (int i = 0; i < 5; i++) { uint32_t tmp = b_output[i]; char *bytes = (char *) &b_output[i]; bytes[3] = (char) (tmp & 0xff); bytes[2] = (char) ((tmp >> 8) & 0xff); bytes[1] = (char) ((tmp >> 16) & 0xff); bytes[0] = (char) ((tmp >> 24) & 0xff); } base64((unsigned char *) b_output, output); } }; } #endif // UWS_WEBSOCKETHANDSHAKE_H ================================================ FILE: nerd_modules/http/httplib/uWS/WebSocketProtocol.h ================================================ /* * Authored by Alex Hultman, 2018-2020. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UWS_WEBSOCKETPROTOCOL_H #define UWS_WEBSOCKETPROTOCOL_H #include #include #include #include namespace uWS { /* We should not overcomplicate these */ const std::string_view ERR_TOO_BIG_MESSAGE("Received too big message"); const std::string_view ERR_WEBSOCKET_TIMEOUT("WebSocket timed out from inactivity"); const std::string_view ERR_INVALID_TEXT("Received invalid UTF-8"); const std::string_view ERR_TOO_BIG_MESSAGE_INFLATION("Received too big message, or other inflation error"); const std::string_view ERR_INVALID_CLOSE_PAYLOAD("Received invalid close payload"); enum OpCode : unsigned char { TEXT = 1, BINARY = 2, CLOSE = 8, PING = 9, PONG = 10 }; enum { CLIENT, SERVER }; // 24 bytes perfectly template struct WebSocketState { public: static const unsigned int SHORT_MESSAGE_HEADER = isServer ? 6 : 2; static const unsigned int MEDIUM_MESSAGE_HEADER = isServer ? 8 : 4; static const unsigned int LONG_MESSAGE_HEADER = isServer ? 14 : 10; // 16 bytes struct State { unsigned int wantsHead : 1; unsigned int spillLength : 4; signed int opStack : 2; // -1, 0, 1 unsigned int lastFin : 1; // 15 bytes unsigned char spill[LONG_MESSAGE_HEADER - 1]; OpCode opCode[2]; State() { wantsHead = true; spillLength = 0; opStack = -1; lastFin = true; } } state; // 8 bytes unsigned int remainingBytes = 0; char mask[isServer ? 4 : 1]; }; namespace protocol { template T bit_cast(char *c) { T val; memcpy(&val, c, sizeof(T)); return val; } /* Byte swap for little-endian systems */ template T cond_byte_swap(T value) { uint32_t endian_test = 1; if (*((char *)&endian_test)) { union { T i; uint8_t b[sizeof(T)]; } src = { value }, dst; for (unsigned int i = 0; i < sizeof(value); i++) { dst.b[i] = src.b[sizeof(value) - 1 - i]; } return dst.i; } return value; } // Based on utf8_check.c by Markus Kuhn, 2005 // https://www.cl.cam.ac.uk/~mgk25/ucs/utf8_check.c // Optimized for predominantly 7-bit content by Alex Hultman, 2016 // Licensed as Zlib, like the rest of this project static bool isValidUtf8(unsigned char *s, size_t length) { for (unsigned char *e = s + length; s != e; ) { if (s + 4 <= e) { uint32_t tmp; memcpy(&tmp, s, 4); if ((tmp & 0x80808080) == 0) { s += 4; continue; } } while (!(*s & 0x80)) { if (++s == e) { return true; } } if ((s[0] & 0x60) == 0x40) { if (s + 1 >= e || (s[1] & 0xc0) != 0x80 || (s[0] & 0xfe) == 0xc0) { return false; } s += 2; } else if ((s[0] & 0xf0) == 0xe0) { if (s + 2 >= e || (s[1] & 0xc0) != 0x80 || (s[2] & 0xc0) != 0x80 || (s[0] == 0xe0 && (s[1] & 0xe0) == 0x80) || (s[0] == 0xed && (s[1] & 0xe0) == 0xa0)) { return false; } s += 3; } else if ((s[0] & 0xf8) == 0xf0) { if (s + 3 >= e || (s[1] & 0xc0) != 0x80 || (s[2] & 0xc0) != 0x80 || (s[3] & 0xc0) != 0x80 || (s[0] == 0xf0 && (s[1] & 0xf0) == 0x80) || (s[0] == 0xf4 && s[1] > 0x8f) || s[0] > 0xf4) { return false; } s += 4; } else { return false; } } return true; } struct CloseFrame { uint16_t code; char *message; size_t length; }; static inline CloseFrame parseClosePayload(char *src, size_t length) { /* If we get no code or message, default to reporting 1005 no status code present */ CloseFrame cf = {1005, nullptr, 0}; if (length >= 2) { memcpy(&cf.code, src, 2); cf = {cond_byte_swap(cf.code), src + 2, length - 2}; if (cf.code < 1000 || cf.code > 4999 || (cf.code > 1011 && cf.code < 4000) || (cf.code >= 1004 && cf.code <= 1006) || !isValidUtf8((unsigned char *) cf.message, cf.length)) { /* Even though we got a WebSocket close frame, it in itself is abnormal */ return {1006, nullptr, 0}; } } return cf; } static inline size_t formatClosePayload(char *dst, uint16_t code, const char *message, size_t length) { /* We could have more strict checks here, but never append code 0 or 1005 or 1006 */ if (code && code != 1005 && code != 1006) { code = cond_byte_swap(code); memcpy(dst, &code, 2); /* It is invalid to pass nullptr to memcpy, even though length is 0 */ if (message) { memcpy(dst + 2, message, length); } return length + 2; } return 0; } static inline size_t messageFrameSize(size_t messageSize) { if (messageSize < 126) { return 2 + messageSize; } else if (messageSize <= UINT16_MAX) { return 4 + messageSize; } return 10 + messageSize; } enum { SND_CONTINUATION = 1, SND_NO_FIN = 2, SND_COMPRESSED = 64 }; template static inline size_t formatMessage(char *dst, const char *src, size_t length, OpCode opCode, size_t reportedLength, bool compressed) { size_t messageLength; size_t headerLength; if (reportedLength < 126) { headerLength = 2; dst[1] = (char) reportedLength; } else if (reportedLength <= UINT16_MAX) { headerLength = 4; dst[1] = 126; uint16_t tmp = cond_byte_swap((uint16_t) reportedLength); memcpy(&dst[2], &tmp, sizeof(uint16_t)); } else { headerLength = 10; dst[1] = 127; uint64_t tmp = cond_byte_swap((uint64_t) reportedLength); memcpy(&dst[2], &tmp, sizeof(uint64_t)); } int flags = 0; dst[0] = (char) ((flags & SND_NO_FIN ? 0 : 128) | (compressed ? SND_COMPRESSED : 0)); if (!(flags & SND_CONTINUATION)) { dst[0] |= (char) opCode; } char mask[4]; if (!isServer) { dst[1] |= 0x80; uint32_t random = (uint32_t) rand(); memcpy(mask, &random, 4); memcpy(dst + headerLength, &random, 4); headerLength += 4; } messageLength = headerLength + length; memcpy(dst + headerLength, src, length); if (!isServer) { // overwrites up to 3 bytes outside of the given buffer! //WebSocketProtocol::unmaskInplace(dst + headerLength, dst + headerLength + length, mask); // this is not optimal char *start = dst + headerLength; char *stop = start + length; int i = 0; while (start != stop) { (*start++) ^= mask[i++ % 4]; } } return messageLength; } } // essentially this is only a parser template struct WIN32_EXPORT WebSocketProtocol { public: static const unsigned int SHORT_MESSAGE_HEADER = isServer ? 6 : 2; static const unsigned int MEDIUM_MESSAGE_HEADER = isServer ? 8 : 4; static const unsigned int LONG_MESSAGE_HEADER = isServer ? 14 : 10; protected: static inline bool isFin(char *frame) {return *((unsigned char *) frame) & 128;} static inline unsigned char getOpCode(char *frame) {return *((unsigned char *) frame) & 15;} static inline unsigned char payloadLength(char *frame) {return ((unsigned char *) frame)[1] & 127;} static inline bool rsv23(char *frame) {return *((unsigned char *) frame) & 48;} static inline bool rsv1(char *frame) {return *((unsigned char *) frame) & 64;} static inline void unmaskImprecise(char *dst, char *src, char *mask, unsigned int length) { for (unsigned int n = (length >> 2) + 1; n; n--) { *(dst++) = *(src++) ^ mask[0]; *(dst++) = *(src++) ^ mask[1]; *(dst++) = *(src++) ^ mask[2]; *(dst++) = *(src++) ^ mask[3]; } } static inline void unmaskImpreciseCopyMask(char *dst, char *src, char *maskPtr, unsigned int length) { char mask[4] = {maskPtr[0], maskPtr[1], maskPtr[2], maskPtr[3]}; unmaskImprecise(dst, src, mask, length); } static inline void rotateMask(unsigned int offset, char *mask) { char originalMask[4] = {mask[0], mask[1], mask[2], mask[3]}; mask[(0 + offset) % 4] = originalMask[0]; mask[(1 + offset) % 4] = originalMask[1]; mask[(2 + offset) % 4] = originalMask[2]; mask[(3 + offset) % 4] = originalMask[3]; } static inline void unmaskInplace(char *data, char *stop, char *mask) { while (data < stop) { *(data++) ^= mask[0]; *(data++) ^= mask[1]; *(data++) ^= mask[2]; *(data++) ^= mask[3]; } } template static inline bool consumeMessage(T payLength, char *&src, unsigned int &length, WebSocketState *wState, void *user) { if (getOpCode(src)) { if (wState->state.opStack == 1 || (!wState->state.lastFin && getOpCode(src) < 2)) { Impl::forceClose(wState, user); return true; } wState->state.opCode[++wState->state.opStack] = (OpCode) getOpCode(src); } else if (wState->state.opStack == -1) { Impl::forceClose(wState, user); return true; } wState->state.lastFin = isFin(src); if (Impl::refusePayloadLength(payLength, wState, user)) { Impl::forceClose(wState, user, ERR_TOO_BIG_MESSAGE); return true; } if (payLength + MESSAGE_HEADER <= length) { if (isServer) { unmaskImpreciseCopyMask(src + MESSAGE_HEADER - 4, src + MESSAGE_HEADER, src + MESSAGE_HEADER - 4, (unsigned int) payLength); if (Impl::handleFragment(src + MESSAGE_HEADER - 4, payLength, 0, wState->state.opCode[wState->state.opStack], isFin(src), wState, user)) { return true; } } else { if (Impl::handleFragment(src + MESSAGE_HEADER, payLength, 0, wState->state.opCode[wState->state.opStack], isFin(src), wState, user)) { return true; } } if (isFin(src)) { wState->state.opStack--; } src += payLength + MESSAGE_HEADER; length -= (unsigned int) (payLength + MESSAGE_HEADER); wState->state.spillLength = 0; return false; } else { wState->state.spillLength = 0; wState->state.wantsHead = false; wState->remainingBytes = (unsigned int) (payLength - length + MESSAGE_HEADER); bool fin = isFin(src); if (isServer) { memcpy(wState->mask, src + MESSAGE_HEADER - 4, 4); unmaskImprecise(src, src + MESSAGE_HEADER, wState->mask, length - MESSAGE_HEADER); rotateMask(4 - (length - MESSAGE_HEADER) % 4, wState->mask); } else { src += MESSAGE_HEADER; } Impl::handleFragment(src, length - MESSAGE_HEADER, wState->remainingBytes, wState->state.opCode[wState->state.opStack], fin, wState, user); return true; } } static inline bool consumeContinuation(char *&src, unsigned int &length, WebSocketState *wState, void *user) { if (wState->remainingBytes <= length) { if (isServer) { unsigned int n = wState->remainingBytes >> 2; unmaskInplace(src, src + n * 4, wState->mask); for (unsigned int i = 0, s = wState->remainingBytes % 4; i < s; i++) { src[n * 4 + i] ^= wState->mask[i]; } } if (Impl::handleFragment(src, wState->remainingBytes, 0, wState->state.opCode[wState->state.opStack], wState->state.lastFin, wState, user)) { return false; } if (wState->state.lastFin) { wState->state.opStack--; } src += wState->remainingBytes; length -= wState->remainingBytes; wState->state.wantsHead = true; return true; } else { if (isServer) { unmaskInplace(src, src + ((length >> 2) + 1) * 4, wState->mask); } wState->remainingBytes -= length; if (Impl::handleFragment(src, length, wState->remainingBytes, wState->state.opCode[wState->state.opStack], wState->state.lastFin, wState, user)) { return false; } if (isServer && length % 4) { rotateMask(4 - (length % 4), wState->mask); } return false; } } public: WebSocketProtocol() { } static inline void consume(char *src, unsigned int length, WebSocketState *wState, void *user) { if (wState->state.spillLength) { src -= wState->state.spillLength; length += wState->state.spillLength; memcpy(src, wState->state.spill, wState->state.spillLength); } if (wState->state.wantsHead) { parseNext: while (length >= SHORT_MESSAGE_HEADER) { // invalid reserved bits / invalid opcodes / invalid control frames / set compressed frame if ((rsv1(src) && !Impl::setCompressed(wState, user)) || rsv23(src) || (getOpCode(src) > 2 && getOpCode(src) < 8) || getOpCode(src) > 10 || (getOpCode(src) > 2 && (!isFin(src) || payloadLength(src) > 125))) { Impl::forceClose(wState, user); return; } if (payloadLength(src) < 126) { if (consumeMessage(payloadLength(src), src, length, wState, user)) { return; } } else if (payloadLength(src) == 126) { if (length < MEDIUM_MESSAGE_HEADER) { break; } else if(consumeMessage(protocol::cond_byte_swap(protocol::bit_cast(src + 2)), src, length, wState, user)) { return; } } else if (length < LONG_MESSAGE_HEADER) { break; } else if (consumeMessage(protocol::cond_byte_swap(protocol::bit_cast(src + 2)), src, length, wState, user)) { return; } } if (length) { memcpy(wState->state.spill, src, length); wState->state.spillLength = length & 0xf; } } else if (consumeContinuation(src, length, wState, user)) { goto parseNext; } } static const int CONSUME_POST_PADDING = 4; static const int CONSUME_PRE_PADDING = LONG_MESSAGE_HEADER - 1; }; } #endif // UWS_WEBSOCKETPROTOCOL_H ================================================ FILE: nerd_modules/http/index.ng ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ include(""); include ("httpStruct.h"); var http = {}; var console = require("console"); var _protoRes = function() {}; {{ _protoRes["prototype"]["setStatus"] = __LAZY_RES_STATUS; _protoRes["prototype"]["setHeader"] = __LAZY_RES_HEADER; _protoRes["prototype"]["write"] = __LAZY_RES_WRITE; _protoRes["prototype"]["end"] = __LAZY_RES_END; }} var _protoReq = function() {}; {{ _protoReq["prototype"]["getMethod"] = __LAZY_REQ_METHOD; _protoReq["prototype"]["getHeader"] = __LAZY_REQ_HEADER; _protoReq["prototype"]["getUrl"] = __LAZY_REQ_URL; }} http.createServer = function(_cb) { var app = {}; {{ __NERD_OBJECT(app)->bind = new uWS::App(); }} app.listen = function(_port, _listenCB) { {{ ((uWS::App*)__NERD_OBJECT(app)->bind)->listen((int)_port, [=](auto *listenSocket) { if (listenSocket) { if(_listenCB) { _listenCB(__NERD_THIS); } __Nerd_HttpStruct httpStruct; auto uwsCB = [_cb, _protoRes, _protoReq](auto *resUWS, auto *reqUWS) { var _res = __NERD_NEW(_protoRes)(); __NERD_OBJECT(_res)->bind = resUWS; var _req = __NERD_NEW(_protoReq)(); __NERD_OBJECT(_req)->bind = reqUWS; resUWS->onData([=](auto chunk, bool isLast) { if(_req["onData"]) { _req["onData"](_req, chunk, isLast); } }); resUWS->onAborted([=]() { if(_req["onAborted"]) { _req["onAborded"](_req); } else { resUWS->tryEnd(""); } }); _cb(null, _req, _res); }; ((uWS::App*)__NERD_OBJECT(app)->bind)->any("/*", uwsCB); ((uWS::App*)__NERD_OBJECT(app)->bind)->run(); } else { std::cout << "NO SOCKET" << std::endl; } }); }} }; return app; }; return http; ================================================ FILE: nerd_modules/http/package.json ================================================ { "name": "http", "description": "Nerd http module", "main": "index.ng", "bugs": { "url": "https://github.com/Nerdlang/Nerd/issues" }, "directories": { "root": "." }, "homepage": "https://github.com/Nerdlang/Nerd/#readme", "keywords": [ "nerd", "nerdlang", "http", "web" ], "license": "MIT", "licenses": [ { "type": "MIT", "url": "https://github.com/Nerdlang/Nerd/blob/master/LICENSE" } ], "repository": { "type": "git", "url": "git+ssh://git@github.com/Nerd/nerd.git" }, "version": "0.0.1", "nerd": { "env": ["std"], "read_only": [], "lib": { "win32": [ "-D_WIN32_WINNT=0x0600", "-Wno-narrowing", "-D_GNU_SOURCE", "-I{__EXTERN__}/libuv/include/", "-I{__EXTERN__}/libuv/src/", "-D_CRT_SECURE_NO_DEPRECATE", "-D_CRT_NONSTDC_NO_DEPRECATE", "{__EXTERN__}/libuv/src/*.h", "{__EXTERN__}/libuv/src/*.c", "{__EXTERN__}/libuv/src/win/*.h", "{__EXTERN__}/libuv/src/win/*.c", "-I {__MODULE__}/httplib/uWS/", "-I {__MODULE__}/httplib/uSockets/", "{__MODULE__}/httplib/uSockets/*.c", "{__MODULE__}/httplib/uSockets/crypto/*.c", "{__MODULE__}/httplib/uSockets/eventing/*.c", "-DLIBUS_NO_SSL", "-DUWS_NO_ZLIB", "-fpermissive", "-w", "-lm", "-ladvapi32", "-liphlpapi", "-lpsapi", "-lshell32", "-luser32 ", "-luserenv", "-lwsock32", "-lws2_32" ] } } } ================================================ FILE: nerd_modules/math/index.ng ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var math = { "E": 2.71828182845904523536, "LN2": 0.693147180559945309417, "LN10": 2.30258509299404568402, "LOG2E": 1.44269504088896340736, "LOG10E": 0.434294481903251827651, "PI": 3.14159265358979323846, "PIx2": 1.57079632679489661923, "PIx4": 0.785398163397448309616, "1/PI": 0.318309886183790671538, "2/PI": 0.636619772367581343076, "2/SQRTP1": 1.12837916709551257390, "SQRT1/2": 0.707106781186547524401, "SQRT2": 1.41421356237309504880, }; /*** PROPERTIES ***/ /*** END PROPERTIES ***/ /*** METHODS ***/ math.abs = function (x) { {{ return std::abs((double)(x)); }} }; math.acos = function (x) { {{ std::acos((double)(x)); }} }; math.acosh = function (x) { {{ std::acosh((double)(x)); }} }; math.asin = function (x) { {{ std::asin((double)(x)); }} }; math.asinh = function (x) { {{ std::asinh((double)(x)); }} }; math.atan = function (x) { {{ std::atan((double)(x)); }} }; math.atanh = function (x) { {{ std::atanh((double)(x)); }} }; math.atan2 = function (x, y) { {{ std::atan2((double)(x), (double)(y)); }} }; math.cbrt = function (x) { {{ std::cbrt((double)(x)); }} }; math.ceil = function (x) { {{ std::ceil((double)(x)); }} }; math.clz32 = function (x) { {{ int n = (int)(x); return NerdCore::Global::var(n > 0 ? (int)(31 - std::log2(n >> 0)) : 32); }} }; math.cos = function (x) { {{ return std::cos((double)(x)); }} }; math.cosh = function (x) { {{ return std::cosh((double)(x)); }} }; math.exp = function (x) { {{ return std::exp((double)(x)); }} }; math.expm1 = function (x) { {{ return std::expm1((double)(x)); }} }; math.floor = function (x) { {{ return std::floor((double)(x)); }} }; math.fround = function (x) { {{ return (double)(x); }} }; math.hypot = function () { {{ double max = 0; double s = 0; for (int i = 0; i < __NERD_VARLENGTH; i++) { double x = std::abs((double)(__NERD_VARARGS[i])); if (x > max) { s *= (max / x) * (max / x); max = x; } s += (x == 0 && max == 0) ? 0 : (x / max) * (x / max); } return NerdCore::Global::var(max == INFINITY ? INFINITY : max * std::sqrt(s)); }} }; math.imul = function (x, y) { {{ return x * y; }} }; math.log = function (x) { {{ return std::log((double)(x)); }} }; math.log1p = function (x) { {{ return std::log1p((double)(x)); }} }; math.log10 = function (x) { {{ return std::log10((double)(x)); }} }; math.log2 = function (x) { {{ return std::log2((double)(x)); }} }; math.max = function () { {{ double max = -INFINITY; for (int i = 0; i < __NERD_VARLENGTH; i++) { double n = (double)(__NERD_VARARGS[i]); if (n > max) { max = n; } } return max; }} }; math.min = function () { {{ double min = INFINITY; for (int i = 0; i < __NERD_VARLENGTH; i++) { double n = (double)(__NERD_VARARGS[i]); if (n < min) { min = n; } } return min; }} }; math.pow = function (x, y) { {{ return std::pow((double)x, (double)y); }} }; math.random = function () { {{ return (double)(std::rand()) / (double)(RAND_MAX); }} }; math.round = function (x, y) { {{ return std::round((double)x); }} }; math.sign = function (x, y) { {{ double n = (double)(x); if (n == 0) { return 0; } else { return n > 0 ? 1 : -1; }; }} }; math.sin = function (x, y) { {{ return std::sin((double)x); }} }; math.sinh = function (x, y) { {{ return std::sinh((double)x); }} }; math.sqrt = function (x, y) { {{ return std::sqrt((double)x); }} }; math.tan = function (x, y) { {{ return std::tan((double)x); }} }; math.tanh = function (x, y) { {{ return std::tanh((double)x); }} }; math.trunc = function (x, y) { {{ return std::trunc((double)x); }} }; /*** END METHODS ***/ return math; ================================================ FILE: nerd_modules/object/index.ng ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var object = {}; object.keys = function(_obj) { {{ return __NERD_Object_Keys(_obj); }} }; object.clone = function(obj) { var result = {}; if(type_of(result) == "array") { result = []; } for (var i in obj) { if (typeof(obj[i]) == "object") { result[i] = object.clone(obj[i]); } else { result[i] = obj[i]; } } return result; }; return object; ================================================ FILE: nerd_modules/os/index.ng ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var os = {}; os.arch = function() { {{ #if defined(__x86_64__) || defined(_M_X64) return "x86_64"; #elif defined(i386) || defined(__i386__) || defined(__i386) || defined(_M_IX86) return "x86_32"; #elif defined(__ARM_ARCH_2__) return "arm2"; #elif defined(__ARM_ARCH_3__) || defined(__ARM_ARCH_3M__) return "arm3"; #elif defined(__ARM_ARCH_4T__) || defined(__TARGET_ARM_4T) return "arm4t"; #elif defined(__ARM_ARCH_5_) || defined(__ARM_ARCH_5E_) return "arm5" #elif defined(__ARM_ARCH_6T2_) || defined(__ARM_ARCH_6T2_) return "arm6t2"; #elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) return "arm6"; #elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) return "arm7"; #elif defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) return "arm7a"; #elif defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) return "arm7r"; #elif defined(__ARM_ARCH_7M__) return "arm7m"; #elif defined(__ARM_ARCH_7S__) return "arm7s"; #elif defined(__aarch64__) || defined(_M_ARM64) return "arm64"; #elif defined(mips) || defined(__mips__) || defined(__mips) return "mips"; #elif defined(__sh__) return "superh"; #elif defined(__powerpc) || defined(__powerpc__) || defined(__powerpc64__) || defined(__POWERPC__) || defined(__ppc__) || defined(__PPC__) || defined(_ARCH_PPC) return "powerpc"; #elif defined(__PPC64__) || defined(__ppc64__) || defined(_ARCH_PPC64) return "powerpc64"; #elif defined(__sparc__) || defined(__sparc) return "sparc"; #elif defined(__m68k__) return "m68k"; #else return "unknown"; #endif }} }; os.version = function() { {{ #ifdef _WIN32 return "windows"; #elif _WIN64 return "windows"; #elif __APPLE__ || __MACH__ return "Mac OSX"; #elif __linux__ return "linux"; #elif __FreeBSD__ return "freebsd"; #elif __unix || __unix__ return "unix"; #else return "other"; #endif }} }; os.platform = function() { {{ #ifdef _WIN32 return "win32"; #elif _WIN64 return "win32"; #elif __APPLE__ || __MACH__ return "darwin"; #elif __linux__ return "linux"; #elif __FreeBSD__ return "freebsd"; #elif __unix || __unix__ return "unix"; #else return "other"; #endif }} }; return os; ================================================ FILE: nerd_modules/path/index.ng ================================================ var path = {}; {{ #ifdef _WIN32 var SEP = "\\"; #elif _WIN64 var SEP = "\\"; #else var SEP = "/"; #endif }} path.join = function() { var joined = ""; var fnArgs = arguments(); for(var i = 0; i < length_of(fnArgs); i++) { var j = i - 1; if(i > 0 && length_of(fnArgs[j]) > 0) { {{ joined += SEP; }} } joined += fnArgs[i]; } return joined; }; return path; ================================================ FILE: nerd_modules/process/index.ng ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var process = { cwd: function() { return __dirname; }, argv: __NERD_ARGS, }; return process; ================================================ FILE: nerd_modules/querystring/index.ng ================================================ /* */ ================================================ FILE: nerd_modules/thread/index.ng ================================================ // WIP {{ using __NERD_UNORDERED = std::unordered_map; auto __Nerd_THREADED_CALL = [](NerdCore::VAR _fn) { try { _fn(); } catch(NerdCore::VAR e) { std::cout << e << std::endl; } }; }} var thread = function() { var _self = {}; _self.mutex = {}; _self.list = {}; {{ __NERD_OBJECT(_self["mutex"])->bind = new __NERD_UNORDERED(); __NERD_OBJECT(_self["list"])->bind = new std::vector(); }} _self.run = function(_cb) { {{ if(_cb.type == NerdCore::Enum::Type::Function) { ((std::vector*)__NERD_OBJECT(_self["list"])->bind)->emplace_back(std::thread(__Nerd_THREADED_CALL, _cb)); } }} }; _self.lock = function(_key) { {{ if(!_key) _key = "default"; std::lock_guard guard((*(((__NERD_UNORDERED*)__NERD_OBJECT(_self["mutex"])->bind)))[(std::string)_key]); }} }; _self.waitForAll = function() { {{ for(auto& _thread: *((std::vector*)__NERD_OBJECT(_self["list"])->bind)) { _thread.join(); } }} }; return _self; }; return thread; ================================================ FILE: nerd_modules/wasm/index.ng ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ include("lib/wasm.hpp"); include(""); include(""); var wasm = {}; wasm.run = function(_script) { {{ emscripten_run_script(((std::string)_script).c_str()); }} }; wasm.bind = function(_name, _obj) { {{ __NERD_WASM_INTERNAL_BIND[_name] = _obj; }} }; return wasm; ================================================ FILE: nerd_modules/wasm/lib/wasm.hpp ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include #include NerdCore::Type::object_t __NERD_WASM_INTERNAL_BIND; std::string __NERD_EM_BIND(std::string _name, std::string _data) { return __NERD_WASM_INTERNAL_BIND[(std::string)_name](_data); } EMSCRIPTEN_BINDINGS(nerd_module) { emscripten::function("call", &__NERD_EM_BIND); } ================================================ FILE: nerd_modules/wasm/package.json ================================================ { "name": "wasm", "description": "Nerd base wasm module", "main": "index.ng", "bugs": { "url": "https://github.com/Nerdlang/Nerd/issues" }, "directories": { "root": ".", "lib": "lib" }, "homepage": "https://github.com/Nerdlang/Nerd#readme", "keywords": [ "nerdlang", "nerd", "wasm", "webassembly", "asmjs" ], "license": "MIT", "licenses": [ { "type": "MIT", "url": "https://github.com/Nerdlang/Nerd/blob/master/LICENSE" } ], "repository": { "type": "git", "url": "git+ssh://git@github.com/Nerdlang/Nerd.git" }, "version": "0.0.1", "nerd": { "env": ["wasm"], "lib": ["--bind"] } } ================================================ FILE: package.json ================================================ { "name": "nerd", "version": "0.0.16", "description": "Nerd. JS native compiler.", "main": "nerd", "bin": { "nerd": "./nerd.js" }, "scripts": {}, "repository": { "type": "git", "url": "git+https://github.com/nerdlang/nerd.git" }, "keywords": [ "nerd", "nerdlang", "nerd-lang", "compilation", "crossplatform", "simple", "speed", "io", "iot", "socket", "android", "linux", "windows", "arduino", "raspberry", "stm32", "nucleo", "http", "https", "bytecode", "wasm", "arm", "arm64", "msbuild", "cl", "webserver", "webview" ], "author": "Adrien THIERRY ", "license": "MIT", "licenses": [ { "type": "MIT", "url": "https://github.com/nerdlang/nerd/blob/master/LICENSE" } ], "bugs": { "url": "https://github.com/nerdlang/nerd/issues" }, "homepage": "https://nerdlang.org", "dependencies": { } } ================================================ FILE: self/base/cli/cliParser.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var parseCLI = function(args) { var result = {error: false, msg: "", cli:{}, stack: [], useless: []}; var useless = [0, 1]; var withArgs = ["--target", "--spec", "--env", "--stack", "-o", "--preset", "--flash", "--compiler", "-c", "--build", "-b", "--option", "--register", "-r", "--setauthor", "--setid", "--setkey", "--setapi", "--setport", "--sethash", "--setsdk", "--setndk", "--setwin_inc_ucrt", "--setwin_lib_ucrt", "--setwin_lib_um", "--setxcode"]; var noArgs = ["--install_external", "--debug", "--conserve", "--generate", "--config", "--reinit", "--example", "--examples" , "--prepare", "--project", "--run", "--clean", "--purge", "--check", "--no-check", "--verbose", "-v", "--tips", "--version", "--help", "-h", "--release", "--no-object-hashmap"]; for(var i = 0; i < args.length; i++) { if( useless.indexOf(i) > -1 ) { result.useless.push(args[i]); } else if( withArgs.indexOf(args[i]) > -1) { if(args[i+1]) { result.cli[args[i]] = { state: true, argument: args[i+1], }; i++; } else { result.error = true; result.msg = "[!] Missing argument for " + args[i]; break; } } else if(noArgs.indexOf(args[i]) > -1) { result.cli[args[i]] = { state: true, }; } else if(args[i].length > 0 && args[i][0] == "-") { if(withArgs.indexOf(args[i]) < 0 && noArgs.indexOf(args[i]) < 0) { result.error = true; result.msg = "[!] Unknown parameter : " + args[i]; break; } } else result.stack.push(args[i]); } return result; } module.exports = parseCLI; ================================================ FILE: self/base/compiler/target.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var target = ["win-x86-32", "win-x86-64", "linux-x86-32", "linux-x86-64", "linux-arm32v7", "arduino-uno", "arduino-mega1280", "arduino-mega2560", "wasm", "wast", "asm-js", "mac-osx", "nucleo-l152re", "nucleo-l432kc" ]; module.exports = target; ================================================ FILE: self/base/util/copyDirSync.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var fs = require("fs"); var path = require("path"); var copyDirSync = function( source, target ) { var targetFile = target; if ( fs.existsSync( target ) ) { if ( fs.lstatSync( target ).isDirectory() ) { targetFile = path.join( target, path.basename( source ) ); } } fs.copyFileSync(source, targetFile); } var copyFolderRecursiveSync = function( source, target, _root ) { var files = []; var targetFolder = path.join( target, path.basename( source ) ); if(_root) targetFolder = target; if ( !fs.existsSync( targetFolder ) ) { fs.mkdirSync( targetFolder ); } if ( fs.lstatSync( source ).isDirectory() ) { files = fs.readdirSync( source ); for(var i = 0; i < files.length; i++) { var curSource = path.join( source, files[i] ); if ( fs.lstatSync( curSource ).isDirectory() ) { copyFolderRecursiveSync( curSource, targetFolder ); } else { copyDirSync( curSource, targetFolder ); } } } } module.exports = copyFolderRecursiveSync; ================================================ FILE: self/base/util/copyRecursive.js ================================================ var fs = require("fs"); var path = require("path"); var copyRecursiveSync = function(src, dest) { if(!fs.existsSync(src)) { console.log("[!] Warning: " + src + " doesn't exist"); return; } if(fs.lstatSync( src ).isDirectory()) { var _newDest = path.dirname(dest); global.copyDirSync(src, _newDest, true); } else { var _path = []; var _newDest = path.dirname(dest); _path.push(_newDest); while(path.dirname(_newDest) != _newDest) { _newDest = path.dirname(_newDest); if(_newDest.indexOf(global.NERD_PATH) == 0) { _path.push(_newDest); } } for(var i = _path.length; i > -1; i--) { try { fs.mkdirSync(_path[i]); } catch(e){} } fs.copyFileSync(src, dest); } }; module.exports = copyRecursiveSync; ================================================ FILE: self/base/util/flash.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var fs = require("fs"); var path = require("path"); var execFlashArduino = function(from, to, model, driver, bauds, verb) { var spawn = require("child_process").spawn; var _flash = spawn("avrdude", ["-p", model, "-c", driver, "-P", to, "-b", bauds, "-F", "-U", "flash:w:"+from]); _flash.stdout.on("data", function(data) { if(verb) process.stdout.write(data.toString()); }); _flash.stderr.on("data", function(data) { if(verb) process.stdout.write(data.toString()); }); _flash.on("error", function(err) { console.log("[!] Error :"); console.log(err); }); _flash.on("close", function(code) { console.log("[+] Flashed"); }); } var execFlashSTM32 = function(from, to) { try { fs.writeFileSync(path.join(to, from), fs.readFileSync(from)); console.log("[+ Flashed]"); } catch(e) { console.log("[!] Your file is compiled, but an error occured while flashing, please try again."); } } var Flash = function(from, to, target, verb) { switch(target) { case "uno": execFlashArduino(from, to, "ATMEGA328P", "arduino", "19200", verb); break; case "mega1280": execFlashArduino(from, to, "m1280", "arduino", "57600", verb); break; case "mega2560": execFlashArduino(from, to, "m2560", "wiring", "115200", verb); break; case "nucleo-l152re": case "nucleo-l432kc": execFlashSTM32(from, to); break; default: console.log("Nothing to do for target : " + target); break; } } module.exports = Flash; ================================================ FILE: self/base/util/getExt.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var getExt = function(target) { switch(target) { case "wasm": return ".wasm"; break; case "asm-js": return ".asm.js"; break; case "wast": return ".wast"; break; case "win-x86-32": case "win-x86-64": return "-" + target + ".exe"; break; case "nucleo-l432kc": case "nucleo-l152re": case "mac-osx": case "linux-x86-32": case "linux-x86-64": case "linux-arm32v7": return "-" + target + ".bin"; break; case "arduino-uno": return "-" + target + ".hex"; break; case "arduino-mega1280": return "-" + target + ".hex"; break; case "arduino-mega2560": return "-" + target + ".hex"; break; default: return ".bin"; break; } } module.exports = getExt; ================================================ FILE: self/base/util/getTips.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var getTips = function(target, file) { switch(target) { case "wasm": return ""; break; case "asm-js": return "[*] Tips : run this file with node : 'node " + file + "', or embed it in a .html page with "; break; case "wast": return ""; break; case "win-x86-32": case "win-x86-64": return "[*] Tips : on Linux, you can run this .exe with Wine : 'wine " + file + "'"; break; case "linux-x86-32": case "linux-x86-64": case "linux-arm32v7": return "[*] Tips : on Linux, don't forget to : 'chmod +x " + file + "'."; break; case "arduino-uno": return "[*] Tips : avrdude -p ATMEGA328P -c arduino -P [COMPORT] -b 19200 -F -U flash:w:" + file; break; case "arduino-mega1280": return "[*] Tips : avrdude -p m1280 -c arduino -P [COMPORT] -b 57600 -F -U flash:w:" + file; break; case "arduino-mega2560": return "[*] Tips : avrdude -p m2560 -c wiring -P [COMPORT] -b 115200 -F -U flash:w:" + file; break; case "nucleo-l152re": case "nucleo-l432kc": return "[*] Connect your nucleo on your computer, and symple copy/paste " + file + " on the nucleo drive"; default: return ""; break; } } module.exports = getTips; ================================================ FILE: self/base/util/rmdir.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var fs = require("fs"); var rmdir = function(dir, callback) { fs.readdir(dir, function(err, list) { if(err) { try { fs.unlink(dir, function(err) { callback(err); }); } catch(e){} } else { var i = 0; var j = list.length; var cb = function(){ fs.rmdir(dir, function(err){if(callback && typeof(callback) == "function") callback(err);});}; recursiveRm(dir, i, j, list, cb); return; } }); var recursiveRm = function(from, i, j, list, cb) { var nextFile = function() { i++; if(i < j) { recursiveRm(from, i, j, list, cb); } else { if(cb && typeof(cb) == "function") cb(); } } var filename = ""; try { filename = path.join(from, list[i]); } catch(e) { nextFile(); return; } fs.stat(filename, function(err, stat) { if(err) { nextFile(); } else if(stat.isDirectory()) { if(filename) { rmdir(filename, nextFile); } else { nextFile(); } } else { fs.unlink(filename, nextFile); } }); } }; module.exports = rmdir; ================================================ FILE: self/compiler/native/compiler.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ global.ENV = loadEnv(); function loadEnv() { var _res = {}; var _folder = path.join(__dirname, "/env/"); var _list = fs.readdirSync(_folder); for(var _el in _list) { var _name = _list[_el].substring(0, _list[_el].length-3); var _e = require(path.join(_folder, _list[_el])); _res[_name] = _e; } return _res; } function Compiler() { var _handler = this; this.MAIN_PATH = __dirname; this.TARGET = "standard"; this.SPEC; this.EXPOSE = ""; this.STD = ""; this.GEN = ""; this.PATH = ""; this.LIBS = ""; this.STATE = ""; this.PACK = []; this.DIR = []; if(CLI.stack[0]) this.PATH = path.dirname(CLI.stack[0]) + path.sep; this.ENV = ENV["std"]; if(CLI.cli["--env"]) { var _env = CLI.cli["--env"].argument; if(ENV[_env]) { this.ENV = ENV[_env]; } else { console.log("[!] ENV: " + _env + " does not exist, please select one of [" + Object.keys(ENV).toString() + "]"); process.exit(1); } } this.COMPILER = this.ENV.compiler; this.PRESET = "none"; this.MAIN = fs.readFileSync(path.join(__dirname, "squel", this.ENV.main)).toString(); this.IN = ""; this.OUT = ""; this.TMP_FOLDER = ""; this.OPTION = ""; this.INIT = ""; this.DECL = ""; this.REQUIRE = ""; this.INCLUDE = ""; this.INFO = { FUNCTION: [], CACHE: {}, VALUE: [], CALL: {}, SCOPE: {}, HOISTING: [], }; if(this.ENV.stdlib) { for(var _s in this.ENV.stdlib) { if(typeof this.ENV.stdlib[_s] == "string") { this.DECL += "var " + this.ENV.stdlib[_s] + ";"; this.STD += this.ENV.stdlib[_s] + " = require(\"" + this.ENV.stdlib[_s] + "\");"; } else if(typeof this.ENV.stdlib[_s] == "object") { this.DECL += "var " + this.ENV.stdlib[_s].bind + ";"; this.STD += this.ENV.stdlib[_s].bind + " = require(\"" + this.ENV.stdlib[_s].module + "\");"; } } } this.CODE = ""; this.FOOTER = ""; /*** METHODS ***/ this.Parse = function(code, _file) { var _env = createEnv(_handler.PATH, _file); code = this.STD + code; parseCode(code, 0, _env); parseAST(_env); var _generated = generateCode(_env); _handler.MAIN = _handler.MAIN.replace("{CODE}", _generated); _handler.MAIN = _handler.MAIN.replace("{INIT}", COMPILER.INIT); _handler.MAIN = _handler.MAIN.replace("{DECL}", COMPILER.DECL); _handler.MAIN = _handler.MAIN.replace("{INCLUDE}", COMPILER.INCLUDE); _handler.MAIN = _handler.MAIN.replace("{{__PLATFORM__}}", os.platform()); } this.Prepare = function(_folder) { if((!CLI.cli["--profile"]) || CLI.cli["--profile"].argument != "use") { copyDirSync(path.join(__dirname, "nerdcore"), _folder, false); } }; this.Out = function(_name) { if(os.platform() == "win32" && path.extname(_name) != ".exe") _handler.OUT = _name + ".exe"; else _handler.OUT = _name; if(COMPILER.ENV.out && typeof COMPILER.ENV.out == "function") { _handler.OUT = COMPILER.ENV.out(_name); } return _handler.OUT; } this.CLI = function(compiler, out, _in, option) { return this.ENV.cli(compiler, this.preset, out, _in, option, this.TARGET, this.SPEC); } this.Compile = function(_folder, _file) { fs.writeFileSync(_file, _handler.MAIN); process.chdir(_folder); var _exec = _handler.CLI(_handler.COMPILER, _handler.OUT, _file, _handler.OPTION); execSync(_exec); } this.Package = function() { if(this.PACK && this.PACK.length) { for(var i = 0; i < this.PACK.length; i++) { copyRecursiveSync(this.PACK[i], this.OUT); } } } /*** END METHODS ***/ } module.exports = new Compiler(); ================================================ FILE: self/compiler/native/env/arduino.js ================================================ var OPTIONS = { "mega": { preset: "-DF_CPU=16000000UL -mmcu=atmega2560", variant: "mega"}, "mega2560": { preset: "-DF_CPU=16000000UL -mmcu=atmega2560", variant: "mega"}, "mega1280": { preset: "-DF_CPU=16000000UL -mmcu=atmega1280", variant: "mega"}, "mega328p": { preset: "-DF_CPU=16000000UL -mmcu=atmega328p", variant: "standard"}, "uno": { preset: "-DF_CPU=16000000UL -mmcu=atmega328p", variant: "standard"}, "nano": { preset: "-DF_CPU=16000000UL -mmcu=atmega328p", variant: "standard"}, "nano2": { preset: "-DF_CPU=16000000UL -mmcu=atmega168", variant: "standard"}, "nano3": { preset: "-DF_CPU=16000000UL -mmcu=atmega328p", variant: "standard"} } function getOptions() { var OPT = { elf: false, cli: false, }; if(CLI.cli["--option"] && CLI.cli["--option"].argument) { var _args = CLI.cli["--option"].argument.split(","); for(var i = 0; i < _args.length; i++) { OPT[_args[i]] = true; } } return OPT; } var ARDUINO = { name: "arduino", main: "arduino.cpp", cli: function(compiler, preset, out, _in, option, target, spec) { var OPT = getOptions(); var _cliOption = ""; if(CLI.cli["--option"]) _cliOption = CLI.cli["--option"].argument; if(!target || !OPTIONS[target]) { console.log("[!] No target or bad target selected, switching to 'uno'"); target = "uno"; } var _cli = `${compiler} ${OPTIONS[target].preset} -D__NERD__OBJECT_VECTOR -DARDUINO_ARCH_AVR -w -Os -fno-exceptions -fno-rtti -fno-stack-protector -fomit-frame-pointer -ffunction-sections -fdata-sections -Wl,--gc-sections \ -I ${extern}/arduino/avr -I ${extern}/arduino/avr/variants/${OPTIONS[target].variant}/ -I ${extern}/arduino/avr/cores/arduino -I ${extern}/arduino/stlarduino ${extern}/arduino/stlarduino/ios.cpp ${extern}/arduino/avr/cores/arduino/abi.cpp ${extern}/arduino/stlarduino/new*.cpp ${extern}/arduino/stlarduino/char_traits.cpp ${extern}/arduino/stlarduino/del*.cpp ${extern}/arduino/stlarduino/stdexcept.cpp ${extern}/arduino/stlarduino/func_exception.cpp ${extern}/arduino/stlarduino/ostream_helpers.cpp -fno-threadsafe-statics -lm ${COMPILER.LIBS} -o ${out} ${_in} ${_cliOption}`; if(!OPT.elf) _cli += `&& avr-objcopy -O ihex -R .eeprom ${out}`; if(OPT.cli) console.log("[*]" + _cli); return _cli; }, compiler: "avr-g++ -std=c++17", stdlib:[], out: function(_name) { var OPT = getOptions(); if(OPT.elf) _name += ".elf"; else _name += ".hex"; return _name; }, } module.exports = ARDUINO; ================================================ FILE: self/compiler/native/env/js.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var _debug = " -g "; var JS = { name: "js", main: "js.cpp", compiler: "g++", stdlib: ["console", "JSON", "Module"], cli: function(compiler, preset, out, _in, option) { var _cachePath = path.join(process.cwd(), "..", "cached_" + COMPILER.ENV.name + "_" + os.platform + "_" + VERSION); var _precompiled = path.join(_cachePath, "nerd.o"); var _stack = 0; if(CLI.cli["--stack"]) { try { _stack = parseInt(CLI.cli["--stack"].argument); } catch(e) { console.log("[!] Error: --stack flags required a number, received -> " + CLI.cli["--stack"].argument); process.exit(1); } } if(!fs.existsSync(_precompiled)) { var _args = " -flto -Ofast "; if(preset == "debug") { console.log("Building core with debug"); _args = _debug; } console.log(`[+] Creating Nerd binary lib for ${COMPILER.ENV.name + "_" + os.platform + "_" + VERSION}`); console.log(`${compiler} -std=c++17 ${_args} -c nerdcore/src/nerd.cpp -o "${_precompiled}"`); try { fs.mkdirSync(_cachePath); } catch(e){}; execSync(`${compiler} -std=c++17 ${_args} -c nerdcore/src/nerd.cpp -o "${_precompiled}"`); console.log("[+] Compiling with precompiled Nerd lib"); } if(compiler == "cl" || compiler.indexOf("cl ") == 0) { console.log("[!] cl is not supported, please use g++, clang++, em++ or avr-g++"); process.exit(1); } var _hashmap = ""; if(CLI.cli['--no-object-hashmap']) _hashmap = "-D__NERD__OBJECT_VECTOR"; if(_stack) _stack = "-Wl,--stack," + _stack; else _stack = ""; var _sysVNetLibs = ""; if(os.platform() == "sunos") _sysVNetLibs = "-lsocket -lnsl"; var _cliOption = ""; if(CLI.cli["--option"]) _cliOption = CLI.cli["--option"].argument; if(CLI.cli["--profile"]) { if(!CLI.cli["--conserve"]) CLI.cli["--conserve"] = true; if(CLI.cli["--profile"].argument == "gen") { _cliOption += " -fprofile-generate"; console.log("[*] Profiling data will be stored in: " + COMPILER.TMP_FOLDER); } else if(CLI.cli["--profile"].argument == "use") { _cliOption += " -fprofile-use"; console.log("[*] Using profile data from: " + COMPILER.TMP_FOLDER); } else { console.log("[!] Please use --profile with gen or use"); } } var _files = `"${_precompiled}" "${_in}"`; if(os.platform == "win32") _files = `"${_in}" "${_precompiled}"`; if(preset == "none") { return `${compiler} ${_stack} -std=c++17 ${_files} -g -s ${COMPILER.LIBS} -pthread -o "${out}" ${_sysVNetLibs} ${_cliOption}`; } else if(preset == "debug") { console.log(`${compiler} ${_stack} -std=c++17 ${_files} ${_debug} -s ${COMPILER.LIBS} -pthread -o "${out}" ${_sysVNetLibs} ${_cliOption}`); return `${compiler} ${_stack} -std=c++17 ${_files} ${_debug} -s ${COMPILER.LIBS} -pthread -o "${out}" ${_sysVNetLibs} ${_cliOption}`; } else if(preset == "size") { return `${compiler} ${_stack} -std=c++17 ${_files} -pthread -Os -fno-rtti -fno-stack-protector -fomit-frame-pointer -s ${COMPILER.LIBS} -o "${out}" ${_sysVNetLibs} ${_cliOption}`; } else { var _opt = "-O"; if(os.platform() == "darwin" || compiler.indexOf("clang") > -1) _opt += "3"; else _opt += "fast"; _opt += " -flto"; return `${compiler} ${_stack} -std=c++17 ${_files} ${_opt} -pthread -s ${COMPILER.LIBS} -o "${out}" ${_sysVNetLibs} ${_cliOption}`; } }, write: function(_content, _in) { if(CLI.cli["--profile"] && CLI.cli["--profile"].argument == "use") { return; } fs.writeFileSync(_in, _content); } } module.exports = JS; ================================================ FILE: self/compiler/native/env/std.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var _debug = " -g "; var STD = { name: "std", main: "std.cpp", compiler: "g++", stdlib: [], cli: function(compiler, preset, out, _in, option) { var _cachePath = path.join(process.cwd(), "..", "cached_" + COMPILER.ENV.name + "_" + os.platform + "_" + VERSION); var _precompiled = path.join(_cachePath, "nerd.o"); var _stack = 0; if(CLI.cli["--stack"]) { try { _stack = parseInt(CLI.cli["--stack"].argument); } catch(e) { console.log("[!] Error: --stack flags required a number, received -> " + CLI.cli["--stack"].argument); process.exit(1); } } if(!fs.existsSync(_precompiled)) { var _args = " -flto -Ofast "; if(preset == "debug") { console.log("Building core with debug"); _args = _debug; } console.log(`[+] Creating Nerd binary lib for ${COMPILER.ENV.name + "_" + os.platform + "_" + VERSION}`); console.log(`${compiler} -std=c++17 ${_args} -c nerdcore/src/nerd.cpp -o "${_precompiled}"`); try { fs.mkdirSync(_cachePath); } catch(e){}; execSync(`${compiler} -std=c++17 ${_args} -c nerdcore/src/nerd.cpp -o "${_precompiled}"`); console.log("[+] Compiling with precompiled Nerd lib"); } if(compiler == "cl" || compiler.indexOf("cl ") == 0) { console.log("[!] cl is not supported, please use g++, clang++, em++ or avr-g++"); process.exit(1); } var _hashmap = ""; if(CLI.cli['--no-object-hashmap']) _hashmap = "-D__NERD__OBJECT_VECTOR"; if(_stack) _stack = "-Wl,--stack," + _stack; else _stack = ""; var _sysVNetLibs = ""; if(os.platform() == "sunos") _sysVNetLibs = "-lsocket -lnsl"; var _cliOption = ""; if(CLI.cli["--option"]) _cliOption = CLI.cli["--option"].argument; if(CLI.cli["--profile"]) { if(!CLI.cli["--conserve"]) CLI.cli["--conserve"] = true; if(CLI.cli["--profile"].argument == "gen") { _cliOption += " -fprofile-generate"; console.log("[*] Profiling data will be stored in: " + COMPILER.TMP_FOLDER); } else if(CLI.cli["--profile"].argument == "use") { _cliOption += " -fprofile-use"; console.log("[*] Using profile data from: " + COMPILER.TMP_FOLDER); } else { console.log("[!] Please use --profile with gen or use"); } } var _files = `"${_precompiled}" "${_in}"`; if(os.platform == "win32") _files = `"${_in}" "${_precompiled}"`; if(preset == "none") { return `${compiler} ${_stack} -std=c++17 ${_files} -g -s ${COMPILER.LIBS} -pthread -o "${out}" ${_sysVNetLibs} ${_cliOption}`; } else if(preset == "debug") { console.log(`${compiler} ${_stack} -std=c++17 ${_files} ${_debug} -s ${COMPILER.LIBS} -pthread -o "${out}" ${_sysVNetLibs} ${_cliOption}`); return `${compiler} ${_stack} -std=c++17 ${_files} ${_debug} -s ${COMPILER.LIBS} -pthread -o "${out}" ${_sysVNetLibs} ${_cliOption}`; } else if(preset == "size") { return `${compiler} ${_stack} -std=c++17 ${_files} -pthread -Os -fno-rtti -fno-stack-protector -fomit-frame-pointer -s ${COMPILER.LIBS} -o "${out}" ${_sysVNetLibs} ${_cliOption}`; } else { var _opt = "-O"; if(os.platform() == "darwin" || compiler.indexOf("clang") > -1) _opt += "3"; else _opt += "fast"; _opt += " -flto"; return `${compiler} ${_stack} -std=c++17 ${_files} ${_opt} -pthread -s ${COMPILER.LIBS} -o "${out}" ${_sysVNetLibs} ${_cliOption}`; } }, write: function(_content, _in) { if(CLI.cli["--profile"] && CLI.cli["--profile"].argument == "use") { return; } fs.writeFileSync(_in, _content); } } module.exports = STD; ================================================ FILE: self/compiler/native/env/wasm.js ================================================ var WASM = { name: "wasm", main: "wasm.cpp", compiler: "em++", out: function(_name) { if(CLI.cli["--target"]) { if(CLI.cli["--target"].argument == "js") return _name + ".asm.js"; else if(CLI.cli["--target"].argument == "wasm") return _name + ".wasm"; else if(CLI.cli["--target"].argument == "html") return _name + ".html"; else { console.log("[!] Invalid target, expected js, wasm, html"); process.exit(1); } } return _name + ".wasm"; }, cli: function(compiler, preset, out, _in, option) { /* var _cachePath = path.join(process.cwd(), "..", "cached_" + COMPILER.ENV.name + "_" + VERSION); var _precompiled = path.join(_cachePath, "nerd.o"); if(!fs.existsSync(_precompiled)) { console.log(`[+] Creating Nerd binary lib for ${COMPILER.ENV.name + "_" + VERSION}`); try { fs.mkdirSync(_cachePath); } catch(e){}; execSync(`${compiler} -std=c++17 -c nerd.cpp -O3 -o "${_precompiled}"`); console.log("[+] Compiling with precompiled Nerd lib"); } */ var _cliOption = ""; if(CLI.cli["--option"]) _cliOption = CLI.cli["--option"].argument; if(preset == "none") { return `${compiler} nerdcore/src/nerd.cpp -D__NJS_REGISTER_SIZE=${COMPILER.REGISTER} ${_in} -O1 -w -s TOTAL_MEMORY=33554432 ${COMPILER.LIBS} -o ${out} ${_cliOption}`; } else if(preset == "size") { return `${compiler} nerdcore/src/nerd.cpp -D__NJS_REGISTER_SIZE=${COMPILER.REGISTER} ${_in} -Os -fno-rtti -fno-stack-protector -fomit-frame-pointer -w -s TOTAL_MEMORY=33554432 ${COMPILER.LIBS} -o ${out} ${_cliOption}`; } else { return `${compiler} nerdcore/src/nerd.cpp -D__NJS_REGISTER_SIZE=${COMPILER.REGISTER} ${_in} -O3 -w -s TOTAL_MEMORY=33554432 ${COMPILER.LIBS} -o ${out} ${_cliOption}`; } } } module.exports = WASM; ================================================ FILE: self/compiler/native/nerdcore/src/class/_meta.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include namespace NerdCore::Class { #ifdef __NERD_ENV_ARDUINO typedef uint16_t count_t; #else typedef int count_t; #endif class InvalidTypeException : public std::exception { }; #ifdef __NERD_ENV_ARDUINO const int SMI_MAX = 32767; const int SMI_MIN = -32768; #else const int SMI_MAX = 1073741823; const int SMI_MIN = -1073741824; #endif } // namespace NerdCore::Class ================================================ FILE: self/compiler/native/nerdcore/src/class/array.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "array_header.h" #include #include namespace NerdCore::Class { // Constructors Array::Array() { } Array::Array(NerdCore::Type::vector_t vec) { value = vec; } Array::Array(std::initializer_list l) : value(l){} // Methods inline void Array::Delete() noexcept { if (--counter == 0) { delete this; } } double Array::Size() { return value.size(); } inline void Array::jsDelete(NerdCore::VAR _key) noexcept { if(_key.type == NerdCore::Enum::Type::String) { // TODO: if string is a number, convert to number and erase } else if(_key.type == NerdCore::Enum::Type::Number) { value[(double)_key] = NerdCore::Global::null; } } inline void* Array::Copy() noexcept { counter++; return this; } // Native cast Array::operator bool() const noexcept { return true; } Array::operator double() const noexcept { if (value.size() == 1) { return (double)value[0]; } else { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } } Array::operator int() const noexcept { if (value.size() == 1) { return (int)value[0]; } else { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } } Array::operator long long() const noexcept { if (value.size() == 1) { return (long long)value[0]; } else { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } } Array::operator std::string() const noexcept { auto l = value.size(); if (l == 0) return ""; std::stringstream stream; stream << (std::string)value[0]; for (auto i = 1; i < l; i++) { stream << "," << (std::string)value[i]; } return stream.str(); } // Main operators NerdCore::VAR const Array::operator[](NerdCore::VAR key) const { if (key.type == NerdCore::Enum::Type::Number) { auto i = (int)key; if (i >= 0 && i <= value.size()) { return value.at(i); } } return NerdCore::Global::null; } NerdCore::VAR const Array::operator[](int key) const { if (key >= 0 && key <= value.size()) { return value.at(key); } return NerdCore::Global::null; } #ifndef __NERD__OBJECT_VECTOR NerdCore::VAR &Array::operator[](NerdCore::VAR key) { if (key.type == NerdCore::Enum::Type::Number) { auto i = (int)key; if (i < 0) { return NerdCore::Global::null; } else { if (i >= value.size()) { value.resize(i + 1); } } return value[i]; } return NerdCore::Global::null; } #else NerdCore::VAR &Array::operator[](NerdCore::VAR key) { if (key.type == NerdCore::Enum::Type::Number) { auto i = (int)key; if (i < 0) { return NerdCore::Global::null; } else { if (i >= value.size()) { value.resize(i + 1); } } return value[i]; } return NerdCore::Global::null; } #endif NerdCore::VAR &Array::operator[](int key) { if (key < 0) { return NerdCore::Global::null; } else { if (key >= value.size()) { value.resize(key + 1); } } return value[key]; } NerdCore::VAR &Array::operator[](double key) { if (key < 0) { return NerdCore::Global::null; } else { if (key >= value.size()) { value.resize(key + 1); } } return value[key]; } #ifndef __NERD__OBJECT_VECTOR NerdCore::VAR &Array::operator[](const char* key) { return NerdCore::Global::null; } #else NerdCore::VAR &Array::operator[](const char* key) { return NerdCore::Global::null; } #endif // Comparation operators Array Array::operator!() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } // Numeric operators Array Array::operator+() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator-() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator++(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator--(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator+(const Array &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator+=(const Array &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator-(const Array &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator-=(const Array &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator*(const Array &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator*=(const Array &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } // TODO: "**" and "**=" operators Array Array::operator/(const Array &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator/=(const Array &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator%(const Array &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator%=(const Array &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator&(const Array &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator|(const Array &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator^(const Array &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator~() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator>>(const Array &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator<<(const Array &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator&=(const Array &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator|=(const Array &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator^=(const Array &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator>>=(const Array &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } Array Array::operator<<=(const Array &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Array(); } // TODO: ">>>" and ">>>=" operators } // namespace NerdCore::Class ================================================ FILE: self/compiler/native/nerdcore/src/class/array_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "_meta.h" namespace NerdCore::Class { class Array : public virtual Base { public: // Constructors Array(); Array(NerdCore::Type::vector_t vec); template Array(Args ... args) { NerdCore::Type::vector_t _vec = {args...}; value = _vec; } Array(std::initializer_list l); // Properties count_t counter = 0; NerdCore::Type::vector_t value; // Methods double Size(); inline void Delete() noexcept; inline void jsDelete(const NerdCore::VAR _key) noexcept; inline void* Copy() noexcept; // Native cast explicit operator bool() const noexcept; explicit operator double() const noexcept; explicit operator int() const noexcept; explicit operator long long() const noexcept; explicit operator std::string() const noexcept; // Main operators NerdCore::VAR const operator[](NerdCore::VAR key) const; NerdCore::VAR const operator[](int key) const; NerdCore::VAR &operator[](NerdCore::VAR key); NerdCore::VAR &operator[](int key); NerdCore::VAR &operator[](double key); NerdCore::VAR &operator[](const char* key); // Comparation operators Array operator!() const; template bool operator==(const t &_v1) const { return false; } // === emulated with __NERD_EQUAL_VALUE_AND_TYPE // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE template bool operator!=(const t &_v1) const { return true; } template bool operator<(const t &_v1) const { return (*this)[0] < _v1;} template bool operator<=(const t &_v1) const { return (*this)[0] <= _v1; } template bool operator>(const t &_v1) const { return (*this)[0] > _v1; } template bool operator>=(const t &_v1) const { return (*this)[0] >= _v1; } // Numeric operators Array operator+() const; Array operator-() const; Array operator++(const int _v1); Array operator--(const int _v1); Array operator+(const Array &_v1) const; Array operator+=(const Array &_v1); Array operator-(const Array &_v1) const; Array operator-=(const Array &_v1); Array operator*(const Array &_v1) const; Array operator*=(const Array &_v1); // TODO: "**" and "**=" operators Array operator/(const Array &_v1) const; Array operator/=(const Array &_v1); Array operator%(const Array &_v1) const; Array operator%=(const Array &_v1); Array operator&(const Array &_v1) const; Array operator|(const Array &_v1) const; Array operator^(const Array &_v1) const; Array operator~() const; Array operator>>(const Array &_v1) const; Array operator<<(const Array &_v1) const; Array operator&=(const Array &_v1); Array operator|=(const Array &_v1); Array operator^=(const Array &_v1); Array operator>>=(const Array &_v1); Array operator<<=(const Array &_v1); // TODO: ">>>" and ">>>=" operators NerdCore::VAR __iterator(NerdCore::VAR* args, int _length) const; NerdCore::VAR __unscopables(NerdCore::VAR* args, int _length) const; NerdCore::VAR concat(NerdCore::VAR* args, int _length) const; NerdCore::VAR copyWithin(NerdCore::VAR* args, int _length); NerdCore::VAR entries(NerdCore::VAR* args, int _length) const; NerdCore::VAR every(NerdCore::VAR* args, int _length) const; NerdCore::VAR fill(NerdCore::VAR* args, int _length) const; NerdCore::VAR filter(NerdCore::VAR* args, int _length) const; NerdCore::VAR find(NerdCore::VAR* args, int _length) const; NerdCore::VAR findIndex(NerdCore::VAR* args, int _length) const; NerdCore::VAR flat(NerdCore::VAR* args, int _length) const; NerdCore::VAR flatMap(NerdCore::VAR* args, int _length) const; NerdCore::VAR forEach(NerdCore::VAR* args, int _length) const; NerdCore::VAR includes(NerdCore::VAR* args, int _length) const; NerdCore::VAR indexOf(NerdCore::VAR* args, int _length) const; NerdCore::VAR join(NerdCore::VAR* args, int _length) const; NerdCore::VAR keys(NerdCore::VAR* args, int _length) const; NerdCore::VAR lastIndexOf(NerdCore::VAR* args, int _length) const; NerdCore::VAR map(NerdCore::VAR* args, int _length) const; NerdCore::VAR pop(NerdCore::VAR* args, int _length); NerdCore::VAR push(NerdCore::VAR* args, int _length); NerdCore::VAR reduce(NerdCore::VAR* args, int _length) const; NerdCore::VAR reduceRight(NerdCore::VAR* args, int _length) const; NerdCore::VAR reverse(NerdCore::VAR* args, int _length); NerdCore::VAR shift(NerdCore::VAR* args, int _length); NerdCore::VAR slice(NerdCore::VAR* args, int _length) const; NerdCore::VAR some(NerdCore::VAR* args, int _length) const; NerdCore::VAR sort(NerdCore::VAR* args, int _length) const; NerdCore::VAR splice(NerdCore::VAR* args, int _length); NerdCore::VAR toLocaleString(NerdCore::VAR* args, int _length) const; NerdCore::VAR toString(NerdCore::VAR* args, int _length) const; NerdCore::VAR unshift(NerdCore::VAR* args, int _length); NerdCore::VAR values(NerdCore::VAR* args, int _length) const; }; } // namespace NerdCore::Class ================================================ FILE: self/compiler/native/nerdcore/src/class/base_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "_meta.h" namespace NerdCore::Class { class Base { public: #ifdef __NERD_ENV_ESP32 virtual ~Base() { } #endif virtual void Delete() noexcept{}; virtual void* Copy() noexcept{ return nullptr; }; virtual explicit operator bool() const noexcept{ return true;}; virtual explicit operator std::string() const noexcept{ return "";}; virtual explicit operator int() const noexcept {return 0;}; virtual explicit operator double() const noexcept {return 0.0;}; virtual explicit operator long long() const noexcept {return 0;}; virtual NerdCore::VAR &operator[](NerdCore::VAR key){ return NerdCore::Global::null; }; virtual NerdCore::VAR &operator[](int key){ return NerdCore::Global::null; }; virtual NerdCore::VAR &operator[](double key){ return NerdCore::Global::null; }; virtual NerdCore::VAR &operator[](const char* key){ return NerdCore::Global::null; }; }; } ================================================ FILE: self/compiler/native/nerdcore/src/class/fixed_array.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "array_header.h" #include #include namespace NerdCore::Class { // Constructors FixedArray::FixedArray() { length = 8; value = new NerdCore::VAR[8]; } FixedArray::FixedArray(NerdCore::VAR _length) { length = _length; value = new NerdCore::VAR[(int)_length]; } FixedArray::FixedArray(int _length) { length = _length; value = new NerdCore::VAR[_length]; } FixedArray::FixedArray(NerdCore::VAR* _var, int _length) { length = _length; value = new NerdCore::VAR[_length]; for(int i = 0; i < _length; i++) { value[i] = _var[i]; } } // Methods inline void FixedArray::Delete() noexcept { if (--counter == 0) { delete[] value; delete this; } } inline void* FixedArray::Copy() noexcept { counter++; return this; } // Native cast FixedArray::operator bool() const noexcept { return true; } FixedArray::operator double() const noexcept { if ((int)length == 1) { return (double)value[0]; } else { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } } FixedArray::operator int() const noexcept { if ((int)length == 1) { return (int)value[0]; } else { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } } FixedArray::operator long long() const noexcept { if ((int)length == 1) { return (long long)value[0]; } else { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } } FixedArray::operator std::string() const noexcept { auto l = (int)length; std::stringstream stream; stream << (std::string)value[0]; for (auto i = 1; i < l; i++) { stream << "," << (std::string)value[i]; } return stream.str(); } // Main operators NerdCore::VAR const FixedArray::operator[](NerdCore::VAR key) const { if (key.type == NerdCore::Enum::Type::Number) { auto i = (int)key; if (i >= 0 && i <= (int)length) { return value[i]; } } return NerdCore::Global::null; } NerdCore::VAR const FixedArray::operator[](int key) const { if (key >= 0 && key <= (int)length) { return value[key]; } return NerdCore::Global::null; } NerdCore::VAR &FixedArray::operator[](NerdCore::VAR key) { if (key.type == NerdCore::Enum::Type::Number) { auto i = (int)key; if (i < 0) { return NerdCore::Global::null; } else { if (i >= (int)length) { return NerdCore::Global::null; } } return value[i]; } return NerdCore::Global::null; } NerdCore::VAR &FixedArray::operator[](int key) { if (key < 0) { return NerdCore::Global::null; } else { if (key >= (int)length) { return NerdCore::Global::null; } } return value[key]; } NerdCore::VAR &FixedArray::operator[](double key) { if (key < 0) { return NerdCore::Global::null; } else { if (key >= (int)length) { return NerdCore::Global::null; } } return value[(int)key]; } NerdCore::VAR &FixedArray::operator[](const char* key) { return NerdCore::Global::null; } // Comparation operators FixedArray FixedArray::operator!() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } // Numeric operators FixedArray FixedArray::operator+() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator-() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator++(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator--(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator+(const FixedArray &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator+=(const FixedArray &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator-(const FixedArray &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator-=(const FixedArray &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator*(const FixedArray &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator*=(const FixedArray &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } // TODO: "**" and "**=" operators FixedArray FixedArray::operator/(const FixedArray &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator/=(const FixedArray &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator%(const FixedArray &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator%=(const FixedArray &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator&(const FixedArray &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator|(const FixedArray &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator^(const FixedArray &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator~() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator>>(const FixedArray &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator<<(const FixedArray &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator&=(const FixedArray &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator|=(const FixedArray &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator^=(const FixedArray &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator>>=(const FixedArray &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } FixedArray FixedArray::operator<<=(const FixedArray &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return FixedArray(); } // TODO: ">>>" and ">>>=" operators } // namespace NerdCore::Class ================================================ FILE: self/compiler/native/nerdcore/src/class/fixed_array_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "_meta.h" namespace NerdCore::Class { class FixedArray : public virtual Base { public: // Constructors FixedArray(); FixedArray(NerdCore::VAR length); FixedArray(int length); FixedArray(NerdCore::VAR* value, int length); // Properties count_t counter = 0; NerdCore::VAR length; NerdCore::VAR* value; // Methods inline void Delete() noexcept; inline void* Copy() noexcept; // Native cast explicit operator bool() const noexcept; explicit operator double() const noexcept; explicit operator int() const noexcept; explicit operator long long() const noexcept; explicit operator std::string() const noexcept; // Main operators NerdCore::VAR const operator[](NerdCore::VAR key) const; NerdCore::VAR const operator[](int key) const; NerdCore::VAR &operator[](NerdCore::VAR key); NerdCore::VAR &operator[](int key); NerdCore::VAR &operator[](double key); NerdCore::VAR &operator[](const char* key); // Comparation operators FixedArray operator!() const; template bool operator==(const t &_v1) const { return false; } // === emulated with __NERD_EQUAL_VALUE_AND_TYPE // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE template bool operator!=(const t &_v1) const { return true; } template bool operator<(const t &_v1) const { return (*this)[0] < _v1;} template bool operator<=(const t &_v1) const { return (*this)[0] <= _v1; } template bool operator>(const t &_v1) const { return (*this)[0] > _v1; } template bool operator>=(const t &_v1) const { return (*this)[0] >= _v1; } // Numeric operators FixedArray operator+() const; FixedArray operator-() const; FixedArray operator++(const int _v1); FixedArray operator--(const int _v1); FixedArray operator+(const FixedArray &_v1) const; FixedArray operator+=(const FixedArray &_v1); FixedArray operator-(const FixedArray &_v1) const; FixedArray operator-=(const FixedArray &_v1); FixedArray operator*(const FixedArray &_v1) const; FixedArray operator*=(const FixedArray &_v1); // TODO: "**" and "**=" operators FixedArray operator/(const FixedArray &_v1) const; FixedArray operator/=(const FixedArray &_v1); FixedArray operator%(const FixedArray &_v1) const; FixedArray operator%=(const FixedArray &_v1); FixedArray operator&(const FixedArray &_v1) const; FixedArray operator|(const FixedArray &_v1) const; FixedArray operator^(const FixedArray &_v1) const; FixedArray operator~() const; FixedArray operator>>(const FixedArray &_v1) const; FixedArray operator<<(const FixedArray &_v1) const; FixedArray operator&=(const FixedArray &_v1); FixedArray operator|=(const FixedArray &_v1); FixedArray operator^=(const FixedArray &_v1); FixedArray operator>>=(const FixedArray &_v1); FixedArray operator<<=(const FixedArray &_v1); // TODO: ">>>" and ">>>=" operators }; } // namespace NerdCore::Class ================================================ FILE: self/compiler/native/nerdcore/src/class/function.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "function_header.h" #include #include namespace NerdCore::Class { // Constructors Function::Function() { (*this)["prototype"] = new NerdCore::Class::Object(); } Function::Function(void *val) { counter++; value = (NerdCore::Type::function_t*)val; if((*this)["prototype"].type == NerdCore::Enum::Type::Null) { (*this)["prototype"] = new NerdCore::Class::Object(); } } Function::Function(void *val, NerdCore::VAR __this) { counter++; (*this)["this"] = __this; value = (NerdCore::Type::function_t*)val; if((*this)["prototype"].type == NerdCore::Enum::Type::Null) { (*this)["prototype"] = new NerdCore::Class::Object(); } } // Methods inline void Function::Delete() noexcept { if (--counter == 0) { delete (NerdCore::Type::function_t*)value; delete this; } } inline void Function::jsDelete(const std::string _key) noexcept { } inline void* Function::Copy() noexcept { counter++; return this; } // Main operators NerdCore::VAR const Function::operator[](NerdCore::VAR key) const { return NerdCore::Global::null; } #ifndef __NERD__OBJECT_VECTOR NerdCore::VAR &Function::operator[](NerdCore::VAR key) { /* if(hasLazy && LazyRTM.count(key) && !object.count(key)) { object[key] = LazyRTM[key]; } */ return object[key]; } #else NerdCore::VAR &Function::operator[](NerdCore::VAR key) { std::string _str = ((std::string)key); NerdCore::Type::StringView _sview = _str; if (key.type == NerdCore::Enum::Type::Number) { auto i = (int)key; if (i < 0) { return NerdCore::Global::null; } else { if (i >= object.size()) { object.reserve(i + 1); object.resize(i + 1); } } return object[i].second; } for (auto & search : object) { if (_sview.compare(search.first) == 0) { return search.second; } } object.push_back(NerdCore::Type::pair_t(_str, NerdCore::Global::null)); return object[object.size() - 1].second; } #endif #ifndef __NERD__OBJECT_VECTOR NerdCore::VAR &Function::operator[](int key) { std::string _str = std::to_string(key); NerdCore::Type::StringView _sview = _str; return object[_str]; } #else NerdCore::VAR &Function::operator[](int key) { std::string _str = std::to_string(key); NerdCore::Type::StringView _sview = _str; for (auto & search : object) { if (_sview.compare(search.first) == 0) { return search.second; } } object.push_back(NerdCore::Type::pair_t(_str, NerdCore::Global::null)); return object[object.size() - 1].second; } #endif #ifndef __NERD__OBJECT_VECTOR NerdCore::VAR &Function::operator[](double key) { std::string _str = std::to_string(key); NerdCore::Type::StringView _sview = _str; return object[_str]; } #else NerdCore::VAR &Function::operator[](double key) { std::string _str = std::to_string(key); NerdCore::Type::StringView _sview = _str; for (auto & search : object) { if (_sview.compare(search.first) == 0) { return search.second; } } object.push_back(NerdCore::Type::pair_t(_str, NerdCore::Global::null)); return object[object.size() - 1].second; } #endif #ifndef __NERD__OBJECT_VECTOR NerdCore::VAR &Function::operator[](const char* key) { /* if(hasLazy && LazyRTM.count(key) && !object.count(key)) { object[key] = LazyRTM[key]; } */ return object[key]; } #else NerdCore::VAR &Function::operator[](const char* key) { std::string _str = key; NerdCore::Type::StringView _sview = _str; for (auto & search : object) { if (_sview.compare(search.first) == 0) { return search.second; } } object.push_back(NerdCore::Type::pair_t(_str, NerdCore::Global::null)); return object[object.size() - 1].second; } #endif // Comparation operators NerdCore::VAR Function::operator!() const { return __NERD_Boolean_FALSE; } bool Function::operator==(const Function &_v1) const { return false; } // === emulated with __NERD_EQUAL_VALUE_AND_TYPE // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE bool Function::operator!=(const Function &_v1) const { return true; } bool Function::operator<(const Function &_v1) const { return false; } bool Function::operator<=(const Function &_v1) const { return true; } bool Function::operator>(const Function &_v1) const { return false; } bool Function::operator>=(const Function &_v1) const { return true; } // Numeric operators Function Function::operator+() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator-() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator++(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator--(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator+(const Function &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator+=(const Function &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator-(const Function &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator-=(const Function &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator*(const Function &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator*=(const Function &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } // TODO: "**" and "**=" operators Function Function::operator/(const Function &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator/=(const Function &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator%(const Function &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator%=(const Function &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator&(const Function &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator|(const Function &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator^(const Function &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator~() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator>>(const Function &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator<<(const Function &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator&=(const Function &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator|=(const Function &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator^=(const Function &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator>>=(const Function &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } Function Function::operator<<=(const Function &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Function(); } // TODO: ">>>" and ">>>=" operators } // namespace NerdCore::Class ================================================ FILE: self/compiler/native/nerdcore/src/class/function_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "_meta.h" namespace NerdCore::Class { class Function : public virtual Base { public: // Constructors Function(); Function(void* val); Function(void* val, NerdCore::VAR __this); // Properties count_t counter = 0; NerdCore::Type::function_t* value = nullptr; NerdCore::Type::object_t object; NerdCore::VAR This; //void* bind = nullptr; // Methods inline void Delete() noexcept; inline void jsDelete(std::string _key) noexcept; inline void* Copy() noexcept; inline NerdCore::VAR Call(NerdCore::VAR __NERD_THIS, NerdCore::VAR* _args, int i) { #ifndef __NERD__OBJECT_VECTOR if(__NERD_THIS.type == NerdCore::Enum::Type::Null) { return std::invoke((*static_cast(value)), This, _args, i); } else { return std::invoke((*static_cast(value)), __NERD_THIS, _args, i); } #else return (*static_cast(value))(__NERD_THIS, _args, i); #endif } template NerdCore::VAR operator()(NerdCore::VAR __NERD_THIS, Args... args) { NerdCore::VAR _args[] = {args...}; int i = sizeof...(args); #ifndef __NERD__OBJECT_VECTOR if(__NERD_THIS.type == NerdCore::Enum::Type::Null) { return std::invoke((*static_cast(value)), This, _args, i); } else { return std::invoke((*static_cast(value)), __NERD_THIS, _args, i); } #else return (*static_cast(value))(__NERD_THIS, _args, i); #endif } template NerdCore::VAR New(Args... args) { NerdCore::VAR _args[] = {args...}; int i = sizeof...(args); NerdCore::VAR _this = new NerdCore::Class::Object(); //__NERD_Object_Clone((*this)["this"]); //if(_this.type == NerdCore::Enum::Type::Null) _this = new NerdCore::Class::Object(); //((NerdCore::Class::Object*)_this.data.ptr)->bind = bind; NerdCore::VAR _return = this->Call(_this, _args, i); if(_return.type == NerdCore::Enum::Type::Object) { _this = _return; } _this["__proto__"] = object["prototype"]; return _this; } // Main operators NerdCore::VAR const operator[](NerdCore::VAR key) const; NerdCore::VAR &operator[](NerdCore::VAR key); NerdCore::VAR &operator[](int key); NerdCore::VAR &operator[](double key); NerdCore::VAR &operator[](const char* key); // Comparation operators NerdCore::VAR operator!() const; bool operator==(const Function &_v1) const; // === emulated with __NERD_EQUAL_VALUE_AND_TYPE // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE bool operator!=(const Function &_v1) const; bool operator<(const Function &_v1) const; bool operator<=(const Function &_v1) const; bool operator>(const Function &_v1) const; bool operator>=(const Function &_v1) const; // Numeric operators Function operator+() const; Function operator-() const; Function operator++(const int _v1); Function operator--(const int _v1); Function operator+(const Function &_v1) const; Function operator+=(const Function &_v1); Function operator-(const Function &_v1) const; Function operator-=(const Function &_v1); Function operator*(const Function &_v1) const; Function operator*=(const Function &_v1); // TODO: "**" and "**=" operators Function operator/(const Function &_v1) const; Function operator/=(const Function &_v1); Function operator%(const Function &_v1) const; Function operator%=(const Function &_v1); Function operator&(const Function &_v1) const; Function operator|(const Function &_v1) const; Function operator^(const Function &_v1) const; Function operator~() const; Function operator>>(const Function &_v1) const; Function operator<<(const Function &_v1) const; Function operator&=(const Function &_v1); Function operator|=(const Function &_v1); Function operator^=(const Function &_v1); Function operator>>=(const Function &_v1); Function operator<<=(const Function &_v1); // TODO: ">>>" and ">>>=" operators }; } // namespace NerdCore::Class ================================================ FILE: self/compiler/native/nerdcore/src/class/native.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "native_header.h" #include #include namespace NerdCore::Class { // Constructors Native::Native() {} Native::Native(void *val) { value = val; } // Methods inline void Native::Delete() noexcept { if (--counter < 1) { if((*this)["__NERD_On_Destroy"]) (*this)["__NERD_On_Destroy"](NerdCore::Global::null); delete this; } } inline void* Native::Copy() noexcept { counter++; return this; } // Native cast Native::operator bool() const noexcept { return true; } Native::operator double() const noexcept { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } Native::operator int() const noexcept { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } Native::operator long long() const noexcept { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } Native::operator std::string() const noexcept { return "[native code]"; } // Main operators NerdCore::VAR const Native::operator[](NerdCore::VAR key) const { return NerdCore::Global::null; } NerdCore::VAR &Native::operator[](NerdCore::VAR key) { return NerdCore::Global::null; } NerdCore::VAR &Native::operator[](int key) { return NerdCore::Global::null; } NerdCore::VAR &Native::operator[](double key) { return NerdCore::Global::null; } NerdCore::VAR &Native::operator[](const char* key) { return NerdCore::Global::null; } // Comparation operators Native Native::operator!() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } bool Native::operator==(const Native &_v1) const { return false; } // === emulated with __NERD_EQUAL_VALUE_AND_TYPE // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE bool Native::operator!=(const Native &_v1) const { return true; } bool Native::operator<(const Native &_v1) const { return false; } bool Native::operator<=(const Native &_v1) const { return true; } bool Native::operator>(const Native &_v1) const { return false; } bool Native::operator>=(const Native &_v1) const { return true; } // Numeric operators Native Native::operator+() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator-() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator++(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator--(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator+(const Native &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator+=(const Native &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator-(const Native &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator-=(const Native &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator*(const Native &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator*=(const Native &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } // TODO: "**" and "**=" operators Native Native::operator/(const Native &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator/=(const Native &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator%(const Native &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator%=(const Native &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator&(const Native &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator|(const Native &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator^(const Native &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator~() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator>>(const Native &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator<<(const Native &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator&=(const Native &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator|=(const Native &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator^=(const Native &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator>>=(const Native &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } Native Native::operator<<=(const Native &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Native(); } // TODO: ">>>" and ">>>=" operators } // namespace NerdCore::Class ================================================ FILE: self/compiler/native/nerdcore/src/class/native_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "_meta.h" namespace NerdCore::Class { class Native : public virtual Base { public: // Constructors Native(); Native(void* val); // Properties count_t counter = 1; int length = 0; void* value = nullptr; // Methods inline void Delete() noexcept; inline void* Copy() noexcept; // Native cast explicit operator bool() const noexcept; explicit operator double() const noexcept; explicit operator int() const noexcept; explicit operator long long() const noexcept; explicit operator std::string() const noexcept; // Main operators NerdCore::VAR const operator[](NerdCore::VAR key) const; NerdCore::VAR &operator[](NerdCore::VAR key); NerdCore::VAR &operator[](int key); NerdCore::VAR &operator[](double key); NerdCore::VAR &operator[](const char* key); // Comparation operators Native operator!() const; bool operator==(const Native &_v1) const; // === emulated with __NERD_EQUAL_VALUE_AND_TYPE // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE bool operator!=(const Native &_v1) const; bool operator<(const Native &_v1) const; bool operator<=(const Native &_v1) const; bool operator>(const Native &_v1) const; bool operator>=(const Native &_v1) const; // Numeric operators Native operator+() const; Native operator-() const; Native operator++(const int _v1); Native operator--(const int _v1); Native operator+(const Native &_v1) const; Native operator+=(const Native &_v1); Native operator-(const Native &_v1) const; Native operator-=(const Native &_v1); Native operator*(const Native &_v1) const; Native operator*=(const Native &_v1); // TODO: "**" and "**=" operators Native operator/(const Native &_v1) const; Native operator/=(const Native &_v1); Native operator%(const Native &_v1) const; Native operator%=(const Native &_v1); Native operator&(const Native &_v1) const; Native operator|(const Native &_v1) const; Native operator^(const Native &_v1) const; Native operator~() const; Native operator>>(const Native &_v1) const; Native operator<<(const Native &_v1) const; Native operator&=(const Native &_v1); Native operator|=(const Native &_v1); Native operator^=(const Native &_v1); Native operator>>=(const Native &_v1); Native operator<<=(const Native &_v1); // TODO: ">>>" and ">>>=" operators }; } // namespace NerdCore::Class ================================================ FILE: self/compiler/native/nerdcore/src/class/native_tpl_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "_meta.h" namespace NerdCore::Class { template class NativeTPL : public virtual Base { private: inline void internalDelete() { if(is_ptr) { delete value; } } public: // Constructors bool is_ptr = true; int length = 0; std::string type; NativeTPL(T val) { is_ptr = true; value = val; type = "undef"; } NativeTPL(T val, const char str[]) { is_ptr = true; type = str; value = val; } NativeTPL(T val, bool isPtr) { is_ptr = isPtr; value = val; type = "undef"; } NativeTPL(T val, const char str[], bool isPtr) { is_ptr = isPtr; value = val; type = str; } // Properties count_t counter = 1; T value; NerdCore::Type::object_t object; // Methods inline void Delete() noexcept { if (--counter == 0) { internalDelete(); delete this; } } inline void* Copy() noexcept { counter++; return this; } template const inline T operator()(Cast& c) const { static_assert(std::is_same::value, "Casting must be same as NativeType"); return value; } inline T operator()() const { return value; } operator bool() const noexcept { return true; } operator double() const noexcept { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } operator int() const noexcept { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } operator long long() const noexcept { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } operator std::string() const noexcept { return std::string("[native ") + type + std::string("]"); } // Main operators NerdCore::VAR const operator[](NerdCore::VAR key) const { return NerdCore::Global::null; } NerdCore::VAR &operator[](NerdCore::VAR key) { return NerdCore::Global::null; } NerdCore::VAR &operator[](int key) { return NerdCore::Global::null; } NerdCore::VAR &operator[](double key) { return NerdCore::Global::null; } NerdCore::VAR &operator[](const char* key) { return NerdCore::Global::null; } // Comparation operators NativeTPL operator!() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } bool operator==(const NativeTPL &_v1) const { return false; } // === emulated with __NERD_EQUAL_VALUE_AND_TYPE // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE bool operator!=(const NativeTPL &_v1) const { return true; } bool operator<(const NativeTPL &_v1) const { return false; } bool operator<=(const NativeTPL &_v1) const { return true; } bool operator>(const NativeTPL &_v1) const { return false; } bool operator>=(const NativeTPL &_v1) const { return true; } // Numeric operators NativeTPL operator+() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator-() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator++(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator--(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator+(const NativeTPL &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator+=(const NativeTPL &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator-(const NativeTPL &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator-=(const NativeTPL &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator*(const NativeTPL &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator*=(const NativeTPL &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } // TODO: "**" and "**=" operators NativeTPL operator/(const NativeTPL &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator/=(const NativeTPL &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator%(const NativeTPL &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator%=(const NativeTPL &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator&(const NativeTPL &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator|(const NativeTPL &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator^(const NativeTPL &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator~() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator>>(const NativeTPL &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator<<(const NativeTPL &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator&=(const NativeTPL &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator|=(const NativeTPL &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator^=(const NativeTPL &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator>>=(const NativeTPL &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } NativeTPL operator<<=(const NativeTPL &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NativeTPL(); } // TODO: ">>>" and ">>>=" operators }; } // namespace NerdCore::Class ================================================ FILE: self/compiler/native/nerdcore/src/class/number.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ namespace NerdCore::Class::NUMBER { } ================================================ FILE: self/compiler/native/nerdcore/src/class/number_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ namespace NerdCore::Class::NUMBER { } ================================================ FILE: self/compiler/native/nerdcore/src/class/object.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "object_header.h" #include namespace NerdCore::Class { NerdCore::VAR __proxy; // Constructors Object::Object() { } /* Object::Object(const char* _key, NerdCore::VAR _value) { object[_key] = _value; } */ /* Object::Object(NerdCore::VAR _obj) { object = ((NerdCore::Class::Object*)_obj.data.ptr)->object; } */ // Methods double Object::Size() { return object.size(); } inline void Object::Delete() noexcept { if (--counter == 0) { delete this; } } inline void Object::jsDelete(const std::string _key) noexcept { #ifndef __NERD__OBJECT_VECTOR object.erase(_key); #else for (NerdCore::Type::object_t::iterator it = object.begin() ; it != object.end(); ++it) { if (_key.compare(it->first) == 0) { object.erase(it); return; } } #endif } inline void* Object::Copy() noexcept { counter++; return this; } // Native cast Object::operator bool() const noexcept { return true; } Object::operator double() const noexcept { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } Object::operator int() const noexcept { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } Object::operator long long() const noexcept { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } Object::operator std::string() const noexcept { return "[object Object]"; } // Main operators NerdCore::VAR const Object::operator[](NerdCore::VAR key) const { return NerdCore::Global::null; } NerdCore::VAR &Object::GetSet(std::string key) { #ifndef __NERD__OBJECT_VECTOR // if current object[key] is null, we look for the prototypal chain if(object[key].type == NerdCore::Enum::Type::Null) { NerdCore::VAR __proto = object["__proto__"]; while(__proto.type != NerdCore::Enum::Type::Null) { if(__proto[key].type != NerdCore::Enum::Type::Null) { object[key] = __proto[key]; break; } __proto = __proto["__proto__"]; } } /* if(object[key].type == NerdCore::Enum::Type::Function) { (__NERD_FUNCTION(object[key]))->object["this"] = NerdCore::VAR(this); __NERD_FUNCTION(object[key])->bind = bind; } */ return object[key]; #else for (auto & search : object) { if (key.compare(search.first) == 0) { return search.second; } } object.push_back(NerdCore::Type::pair_t(key, NerdCore::Global::null)); return object[object.size() - 1].second; #endif } NerdCore::VAR &Object::operator[](NerdCore::VAR key) { return Object::GetSet(key); } NerdCore::VAR &Object::operator[](int key) { std::string _str = std::to_string(key); return Object::GetSet(_str); } NerdCore::VAR &Object::operator[](double key) { std::string _str = std::to_string(key); return Object::GetSet(_str); } NerdCore::VAR &Object::operator[](const char* key) { return Object::GetSet(key); } // Comparation operators Object Object::operator!() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } bool Object::operator==(const Object &_v1) const { return false; } // === emulated with __NERD_EQUAL_VALUE_AND_TYPE // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE bool Object::operator!=(const Object &_v1) const { return true; } bool Object::operator<(const Object &_v1) const { return false; } bool Object::operator<=(const Object &_v1) const { return true; } bool Object::operator>(const Object &_v1) const { return false; } bool Object::operator>=(const Object &_v1) const { return true; } // Numeric operators Object Object::operator+() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator-() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator++(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator--(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator+(const Object &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator+=(const Object &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator-(const Object &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator-=(const Object &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator*(const Object &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator*=(const Object &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } // TODO: "**" and "**=" operators Object Object::operator/(const Object &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator/=(const Object &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator%(const Object &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator%=(const Object &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator&(const Object &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator|(const Object &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator^(const Object &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator~() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator>>(const Object &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator<<(const Object &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator&=(const Object &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator|=(const Object &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator^=(const Object &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator>>=(const Object &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } Object Object::operator<<=(const Object &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return Object(); } // TODO: ">>>" and ">>>=" operators } // namespace NerdCore::Class ================================================ FILE: self/compiler/native/nerdcore/src/class/object_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "_meta.h" namespace NerdCore::Class { class Object : public virtual Base { public: // Constructors Object(); //Object(NerdCore::VAR _obj); // Properties count_t counter = 0; bool deleted = false; //bool hasLazy = false; NerdCore::Type::object_t object; void* bind = nullptr; // Methods double Size(); inline void Delete() noexcept; inline void jsDelete(const std::string _key) noexcept; inline void* Copy() noexcept; // Native cast explicit operator bool() const noexcept; explicit operator double() const noexcept; explicit operator int() const noexcept; explicit operator long long() const noexcept; explicit operator std::string() const noexcept; // Main operators inline NerdCore::VAR& GetSet(std::string key); NerdCore::VAR const operator[](NerdCore::VAR key) const; NerdCore::VAR &operator[](NerdCore::VAR key); NerdCore::VAR &operator[](int key); NerdCore::VAR &operator[](double key); NerdCore::VAR &operator[](const char* key); // Comparation operators Object operator!() const; bool operator==(const Object &_v1) const; // === emulated with __NERD_EQUAL_VALUE_AND_TYPE // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE bool operator!=(const Object &_v1) const; bool operator<(const Object &_v1) const; bool operator<=(const Object &_v1) const; bool operator>(const Object &_v1) const; bool operator>=(const Object &_v1) const; // Numeric operators Object operator+() const; Object operator-() const; Object operator++(const int _v1); Object operator--(const int _v1); Object operator+(const Object &_v1) const; Object operator+=(const Object &_v1); Object operator-(const Object &_v1) const; Object operator-=(const Object &_v1); Object operator*(const Object &_v1) const; Object operator*=(const Object &_v1); // TODO: "**" and "**=" operators Object operator/(const Object &_v1) const; Object operator/=(const Object &_v1); Object operator%(const Object &_v1) const; Object operator%=(const Object &_v1); Object operator&(const Object &_v1) const; Object operator|(const Object &_v1) const; Object operator^(const Object &_v1) const; Object operator~() const; Object operator>>(const Object &_v1) const; Object operator<<(const Object &_v1) const; Object operator&=(const Object &_v1); Object operator|=(const Object &_v1); Object operator^=(const Object &_v1); Object operator>>=(const Object &_v1); Object operator<<=(const Object &_v1); // TODO: ">>>" and ">>>=" operators }; } // namespace NerdCore::Class ================================================ FILE: self/compiler/native/nerdcore/src/class/string.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "string_header.h" #include #include namespace NerdCore::Class { // Constructors String::String() { object["__proto__"] = NerdCore::Global::String["prototype"]; } String::String(std::string val) { object["__proto__"] = NerdCore::Global::String["prototype"]; value = val; } String::String(const char* val) { object["__proto__"] = NerdCore::Global::String["prototype"]; value = val; } // Methods inline void String::Delete() noexcept { if(--counter == 0) { delete this; } } inline void* String::Copy() noexcept { return new String(value); } // Native cast String::operator bool() const noexcept { return value.size() > 0; } String::operator double() const noexcept { std::string::size_type end; double res; #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) try { res = std::stod(value, &end); }catch(...){} #else res = std::stod(value, &end); #endif #ifdef __NERD_ENV_ARDUINO return 0; #else return end == value.size() ? res : std::numeric_limits::quiet_NaN(); #endif } String::operator int() const noexcept { std::string::size_type end; int res; #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) try { res = std::stoi(value, &end, 10); }catch(...){} #else res = std::stoi(value, &end, 10); #endif #ifdef __NERD_ENV_ARDUINO return 0; #else return end == value.size() ? res : std::numeric_limits::quiet_NaN(); #endif } String::operator long long() const noexcept { std::string::size_type end; long long res; #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) try { res = std::stoll(value, &end, 10); }catch(...){} #else res = std::stoll(value, &end, 10); #endif #ifdef __NERD_ENV_ARDUINO return 0; #else return end == value.size() ? res : std::numeric_limits::quiet_NaN(); #endif } String::operator std::string() const noexcept { return value; } // Main operators NerdCore::VAR const String::operator[](NerdCore::VAR key) const { return NerdCore::Global::null; } static NerdCore::Global::var _char = ""; NerdCore::VAR &String::GetSet(NerdCore::VAR keyVar) { if(keyVar.type == NerdCore::Enum::Type::Number) { int key = (int)keyVar; if(key > value.size() - 1) { return NerdCore::Global::null; } else { _char = std::string(1, value[key]); return _char; } } else if(keyVar.type == NerdCore::Enum::Type::String) { std::string key = ((NerdCore::Class::String*)(keyVar.data.ptr))->value; #ifndef __NERD__OBJECT_VECTOR // if current object[key] is null, we look for the prototypal chain if(object[key].type == NerdCore::Enum::Type::Null) { NerdCore::VAR __proto = object["__proto__"]; while(__proto.type != NerdCore::Enum::Type::Null) { if(__proto[key].type != NerdCore::Enum::Type::Null) { object[key] = __proto[key]; break; } __proto = __proto["__proto__"]; } } /* if(object[key].type == NerdCore::Enum::Type::Function) { value.copy((char*)__NERD_FUNCTION(object[key])->bind, value.length()); } */ return object[key]; #else for (auto & search : object) { if (key.compare(search.first) == 0) { return search.second; } } object.push_back(NerdCore::Type::pair_t(key, NerdCore::Global::null)); return object[object.size() - 1].second; #endif } else { return NerdCore::Global::null; } } NerdCore::VAR &String::operator[](NerdCore::VAR key) { return String::GetSet(key); } NerdCore::VAR &String::operator[](int key) { return String::GetSet(key); } NerdCore::VAR &String::operator[](double key) { return String::GetSet(key); } NerdCore::VAR &String::operator[](const char* key) { #ifndef __NERD__OBJECT_VECTOR // if current object[key] is null, we look for the prototypal chain if(object[key].type == NerdCore::Enum::Type::Null) { NerdCore::VAR __proto = object["__proto__"]; while(__proto.type != NerdCore::Enum::Type::Null) { if(__proto[key].type != NerdCore::Enum::Type::Null) { object[key] = __proto[key]; break; } __proto = __proto["__proto__"]; } } /* if(object[key].type == NerdCore::Enum::Type::Function) { //__NERD_FUNCTION(object[key])->bind = value.data(); //value.copy((char*)__NERD_FUNCTION(object[key])->bind, value.length()); } */ return object[key]; #else for (auto & search : object) { if (key.compare(search.first) == 0) { return search.second; } } object.push_back(NerdCore::Type::pair_t(key, NerdCore::Global::null)); return object[object.size() - 1].second; #endif } // Comparation operators String String::operator!() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } bool String::operator==(const String &_v1) const { return value.compare(_v1.value) == 0; } // === emulated with __NERD_EQUAL_VALUE_AND_TYPE // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE bool String::operator!=(const String &_v1) const { return value.compare(_v1.value) != 0; } bool String::operator<(const String &_v1) const { return value.at(0) < _v1.value.at(0); } bool String::operator<=(const String &_v1) const { return value.at(0) <= _v1.value.at(0); } bool String::operator>(const String &_v1) const { return value.at(0) > _v1.value.at(0); } bool String::operator>=(const String &_v1) const { return value.at(0) >= _v1.value.at(0); } // Numeric operators String String::operator+() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator-() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator++(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator--(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator+(const String &_v1) const { return value + _v1.value; } String String::operator+=(const String &_v1) { value += _v1.value; return *this; } String String::operator-(const String &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator-=(const String &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator*(const String &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator*=(const String &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } // TODO: "**" and "**=" operators String String::operator/(const String &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator/=(const String &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator%(const String &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator%=(const String &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator&(const String &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator|(const String &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator^(const String &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator~() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator>>(const String &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator<<(const String &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator&=(const String &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator|=(const String &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator^=(const String &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator>>=(const String &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } String String::operator<<=(const String &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return String(); } // TODO: ">>>" and ">>>=" operators /*** STRING METHODS ***/ NerdCore::VAR String::toString(NerdCore::VAR* _args, int _length) const { return value; } NerdCore::VAR String::split(NerdCore::VAR* _args, int _length) const { NerdCore::VAR _needle; if (_length > 0) _needle = _args[0]; else return NerdCore::VAR(this->value); NerdCore::VAR _arr = new NerdCore::Class::Array(); char *_v = (char *)malloc(strlen(this->value.c_str()) + 1); strcpy(_v, this->value.c_str()); char *delim = (char *)malloc(strlen(((std::string)_needle).c_str()) + 1); strcpy(delim, ((std::string)_needle).c_str()); char *ptr = strtok(_v, delim); int i = 0; char *_new; while (ptr != NULL) { _new = (char *)malloc(strlen(ptr) + 1); strcpy(_new, ptr); __NERD_Object_Set(i, _new, _arr); free(_new); ptr = strtok(NULL, delim); i++; } free(delim); return _arr; } NerdCore::VAR String::indexOf(NerdCore::VAR* _args, int _length) const { NerdCore::VAR _needle; if (_length > 0) _needle = _args[0]; else return NerdCore::VAR(-1); std::string::size_type loc = this->value.find((std::string)_needle, 0); if (loc != std::string::npos) { return NerdCore::VAR((int)loc); } return NerdCore::VAR(-1); } NerdCore::VAR String::lastIndexOf(NerdCore::VAR* _args, int _length) const { NerdCore::VAR _needle; if (_length > 0) _needle = _args[0]; else return NerdCore::VAR(-1); std::string::size_type loc = this->value.find_last_of((std::string)_needle, 0); if (loc != std::string::npos) { return NerdCore::VAR((int)loc); } return NerdCore::VAR(-1); } NerdCore::VAR String::search(NerdCore::VAR* _args, int _length) const { NerdCore::VAR _needle; if (_length > 0) _needle = _args[0]; else return NerdCore::VAR(-1); std::string::size_type loc = this->value.find((std::string)_needle, 0); if (loc != std::string::npos) { return NerdCore::VAR((int)loc); } return NerdCore::VAR(-1); } NerdCore::VAR String::slice(NerdCore::VAR* _args, int _length) const { NerdCore::VAR _start; NerdCore::VAR _end; if (_length > 0) _start = _args[0]; else return NerdCore::VAR(this->value); if (_length > 1) _end = _args[1]; if (_end.type == NerdCore::Enum::Type::Null) return NerdCore::VAR(this->value.substr((int)_start, std::string::npos)); int _endIndex = (int)_end - (int)_start; return NerdCore::VAR(this->value.substr((int)_start, _endIndex)); } NerdCore::VAR String::substr(NerdCore::VAR* _args, int _length) const { NerdCore::VAR _start; NerdCore::VAR _end; if (_length > 0) _start = _args[0]; else return NerdCore::VAR(this->value); if (_length > 1) _end = _args[1]; if (_end.type == NerdCore::Enum::Type::Null) return NerdCore::VAR(this->value.substr((int)_start, std::string::npos)); return NerdCore::VAR(this->value.substr((int)_start, (int)_end)); } NerdCore::VAR String::replace(NerdCore::VAR* _args, int _length) const { NerdCore::VAR _search; NerdCore::VAR _replace; if (_length > 0) _search = _args[0]; else return NerdCore::VAR(this->value); if (_length > 1) _replace = _args[1]; size_t start_pos = this->value.find((std::string)_search); if (start_pos == std::string::npos) { return NerdCore::VAR(value); } std::string _new = value; return NerdCore::VAR(_new.replace(start_pos, ((std::string)_search).length(), (std::string)_replace)); } /* END STRING METHODS */ } // namespace NerdCore::Class ================================================ FILE: self/compiler/native/nerdcore/src/class/string_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "_meta.h" namespace NerdCore::Class { class String : public virtual Base { public: // Constructors String(); String(std::string val); String(const char* val); // Properties std::string value; NerdCore::Type::object_t object; void* bind = nullptr; count_t counter = 1; // Methods inline void Delete() noexcept; inline void* Copy() noexcept; // Native cast explicit operator bool() const noexcept; explicit operator double() const noexcept; explicit operator int() const noexcept; explicit operator long long() const noexcept; explicit operator std::string() const noexcept; // Main operators inline NerdCore::VAR& GetSet(NerdCore::VAR keyVar); NerdCore::VAR const operator[](NerdCore::VAR key) const; NerdCore::VAR &operator[](NerdCore::VAR key); NerdCore::VAR &operator[](int key); NerdCore::VAR &operator[](double key); NerdCore::VAR &operator[](const char* key); // Comparation operators template NerdCore::VAR operator() (Args... args) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::Global::null; } String operator!() const; bool operator==(const String &_v1) const; // === emulated with __NERD_EQUAL_VALUE_AND_TYPE // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE bool operator!=(const String &_v1) const; bool operator<(const String &_v1) const; bool operator<=(const String &_v1) const; bool operator>(const String &_v1) const; bool operator>=(const String &_v1) const; // Numeric operators String operator+() const; String operator-() const; String operator++(const int _v1); String operator--(const int _v1); String operator+(const String &_v1) const; String operator+=(const String &_v1); String operator-(const String &_v1) const; String operator-=(const String &_v1); String operator*(const String &_v1) const; String operator*=(const String &_v1); // TODO: "**" and "**=" operators String operator/(const String &_v1) const; String operator/=(const String &_v1); String operator%(const String &_v1) const; String operator%=(const String &_v1); String operator&(const String &_v1) const; String operator|(const String &_v1) const; String operator^(const String &_v1) const; String operator~() const; String operator>>(const String &_v1) const; String operator<<(const String &_v1) const; String operator&=(const String &_v1); String operator|=(const String &_v1); String operator^=(const String &_v1); String operator>>=(const String &_v1); String operator<<=(const String &_v1); // TODO: ">>>" and ">>>=" operators /*** STRING METHODS ***/ NerdCore::VAR toString(NerdCore::VAR* _args, int _length) const; NerdCore::VAR split(NerdCore::VAR* _args, int _length) const; NerdCore::VAR indexOf(NerdCore::VAR* _args, int _length) const; NerdCore::VAR lastIndexOf(NerdCore::VAR* _args, int _length) const; NerdCore::VAR search(NerdCore::VAR* _args, int _length) const; NerdCore::VAR slice(NerdCore::VAR* _args, int _length) const; NerdCore::VAR substr(NerdCore::VAR* _args, int _length) const; NerdCore::VAR replace(NerdCore::VAR* _args, int _length) const; /* END STRING METHODS */ }; } // namespace NerdCore::Class ================================================ FILE: self/compiler/native/nerdcore/src/class/struct.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "struct_header.h" #include #include namespace NerdCore::Class { // Constructors Struct::Struct() {} Struct::Struct(void *val) { value = val; } Struct::Struct(void *val, void* fn) { value = val; Clean = (NerdCore::Type::clean_struct*)fn; } // Methods inline void Struct::Delete() noexcept { if (--counter == 0) { (*static_cast(Clean))(value); delete Clean; delete this; } } inline void* Struct::Copy() noexcept { counter++; return this; } // Native cast Struct::operator bool() const noexcept { return true; } Struct::operator double() const noexcept { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } Struct::operator int() const noexcept { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } Struct::operator long long() const noexcept { #ifdef __NERD_ENV_ARDUINO return 0; #else return std::numeric_limits::quiet_NaN(); #endif } Struct::operator std::string() const noexcept { return "[native struct]"; } // Main operators NerdCore::VAR const Struct::operator[](NerdCore::VAR key) const { return NerdCore::Global::null; } NerdCore::VAR &Struct::operator[](NerdCore::VAR key) { #ifndef __NERD__OBJECT_VECTOR return object[(std::string)key]; #else for (auto & search : object) { if (((std::string)key).compare(search.first) == 0) { return search.second; } } object.push_back(NerdCore::Type::pair_t((std::string)key, NerdCore::VAR())); return object[object.size() - 1].second; #endif } NerdCore::VAR &Struct::operator[](int key) { #ifndef __NERD__OBJECT_VECTOR return object[std::to_string(key)]; #else std::string _str = std::to_string(key); for (auto & search : object) { if (_str.compare(search.first) == 0) { return search.second; } } object.push_back(NerdCore::Type::pair_t(_str, NerdCore::VAR())); return object[object.size() - 1].second; #endif } NerdCore::VAR &Struct::operator[](double key) { #ifndef __NERD__OBJECT_VECTOR return object[std::to_string(key)]; #else std::string _str = std::to_string(key); for (auto & search : object) { if (_str.compare(search.first) == 0) { return search.second; } } object.push_back(NerdCore::Type::pair_t(_str, NerdCore::VAR())); return object[object.size() - 1].second; #endif } NerdCore::VAR &Struct::operator[](const char* key) { std::string str = key; #ifndef __NERD__OBJECT_VECTOR return object[str]; #else for (auto & search : object) { if (str.compare(search.first) == 0) { return search.second; } } object.push_back(NerdCore::Type::pair_t(str, NerdCore::VAR())); return object[object.size() - 1].second; #endif } // Comparation operators NerdCore::VAR Struct::operator!() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } bool Struct::operator==(const NerdCore::VAR &_v1) const { return false; } // === emulated with __NERD_EQUAL_VALUE_AND_TYPE // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE bool Struct::operator!=(const NerdCore::VAR &_v1) const { return true; } bool Struct::operator<(const NerdCore::VAR &_v1) const { return false; } bool Struct::operator<=(const NerdCore::VAR &_v1) const { return true; } bool Struct::operator>(const NerdCore::VAR &_v1) const { return false; } bool Struct::operator>=(const NerdCore::VAR &_v1) const { return true; } // Numeric operators NerdCore::VAR Struct::operator+() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator-() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator++(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator--(const int _v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator+(const NerdCore::VAR &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator+=(const NerdCore::VAR &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator-(const NerdCore::VAR &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator-=(const NerdCore::VAR &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator*(const NerdCore::VAR &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator*=(const NerdCore::VAR &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } // TODO: "**" and "**=" operators NerdCore::VAR Struct::operator/(const NerdCore::VAR &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator/=(const NerdCore::VAR &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator%(const NerdCore::VAR &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator%=(const NerdCore::VAR &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator&(const NerdCore::VAR &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator|(const NerdCore::VAR &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator^(const NerdCore::VAR &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator~() const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator>>(const NerdCore::VAR &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator<<(const NerdCore::VAR &_v1) const { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator&=(const NerdCore::VAR &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator|=(const NerdCore::VAR &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator^=(const NerdCore::VAR &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator>>=(const NerdCore::VAR &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } NerdCore::VAR Struct::operator<<=(const NerdCore::VAR &_v1) { #if !defined(__NERD_ENV_ARDUINO) && !defined(__NERD_ENV_ESP32) throw InvalidTypeException(); #endif return NerdCore::VAR(); } // TODO: ">>>" and ">>>=" operators } // namespace NerdCore::Class ================================================ FILE: self/compiler/native/nerdcore/src/class/struct_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "_meta.h" namespace NerdCore::Class { class Struct : public virtual Base { public: // Constructors Struct(); Struct(void* val); Struct(void* val, void* fn); // Properties count_t counter = 1; void* value = nullptr; NerdCore::Type::object_t object; NerdCore::Type::clean_struct* Clean; // Methods inline void Delete() noexcept; inline void StructDelete() noexcept; inline void* Copy() noexcept; // Struct cast explicit operator bool() const noexcept; explicit operator double() const noexcept; explicit operator int() const noexcept; explicit operator long long() const noexcept; explicit operator std::string() const noexcept; // Main operators NerdCore::VAR const operator[](NerdCore::VAR key) const; NerdCore::VAR &operator[](NerdCore::VAR key); NerdCore::VAR &operator[](int key); NerdCore::VAR &operator[](double key); NerdCore::VAR &operator[](const char* key); template NerdCore::VAR operator()(Args... args) const { auto _args = NerdCore::Type::vector_t{(NerdCore::VAR)args...}; return (*static_cast *>(value))(_args); } // Comparation operators NerdCore::VAR operator!() const; bool operator==(const NerdCore::VAR &_v1) const; // === emulated with __NERD_EQUAL_VALUE_AND_TYPE // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE bool operator!=(const NerdCore::VAR &_v1) const; bool operator<(const NerdCore::VAR &_v1) const; bool operator<=(const NerdCore::VAR &_v1) const; bool operator>(const NerdCore::VAR &_v1) const; bool operator>=(const NerdCore::VAR &_v1) const; // Numeric operators NerdCore::VAR operator+() const; NerdCore::VAR operator-() const; NerdCore::VAR operator++(const int _v1); NerdCore::VAR operator--(const int _v1); NerdCore::VAR operator+(const NerdCore::VAR &_v1) const; NerdCore::VAR operator+=(const NerdCore::VAR &_v1); NerdCore::VAR operator-(const NerdCore::VAR &_v1) const; NerdCore::VAR operator-=(const NerdCore::VAR &_v1); NerdCore::VAR operator*(const NerdCore::VAR &_v1) const; NerdCore::VAR operator*=(const NerdCore::VAR &_v1); // TODO: "**" and "**=" operators NerdCore::VAR operator/(const NerdCore::VAR &_v1) const; NerdCore::VAR operator/=(const NerdCore::VAR &_v1); NerdCore::VAR operator%(const NerdCore::VAR &_v1) const; NerdCore::VAR operator%=(const NerdCore::VAR &_v1); NerdCore::VAR operator&(const NerdCore::VAR &_v1) const; NerdCore::VAR operator|(const NerdCore::VAR &_v1) const; NerdCore::VAR operator^(const NerdCore::VAR &_v1) const; NerdCore::VAR operator~() const; NerdCore::VAR operator>>(const NerdCore::VAR &_v1) const; NerdCore::VAR operator<<(const NerdCore::VAR &_v1) const; NerdCore::VAR operator&=(const NerdCore::VAR &_v1); NerdCore::VAR operator|=(const NerdCore::VAR &_v1); NerdCore::VAR operator^=(const NerdCore::VAR &_v1); NerdCore::VAR operator>>=(const NerdCore::VAR &_v1); NerdCore::VAR operator<<=(const NerdCore::VAR &_v1); // TODO: ">>>" and ">>>=" operators }; } // namespace NerdCore::Class ================================================ FILE: self/compiler/native/nerdcore/src/classes.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "./class/array.h" #include "./class/function.h" #include "./class/native.h" #include "./class/struct.h" #include "./class/fixed_array.h" #include "./class/object.h" #include "./class/string.h" ================================================ FILE: self/compiler/native/nerdcore/src/classes_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #define __INC_Nerd_CLASSES_HEADER #include "./class/base_header.h" #include "./class/array_header.h" #include "./class/object_header.h" #include "./class/function_header.h" #include "./class/native_header.h" //#include "./class/native_tpl_header.h" #include "./class/struct_header.h" #include "./class/fixed_array_header.h" #include "./class/string_header.h" ================================================ FILE: self/compiler/native/nerdcore/src/enum.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ namespace NerdCore::Enum { enum Type { Null, Boolean, Number, String, Native, NativeTPL, Struct, FixedArray, Array, Object, Function, }; } ================================================ FILE: self/compiler/native/nerdcore/src/functions.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ NerdCore::VAR getArguments(int argc, char** argv) { NerdCore::VAR __NJS_ARGS = new NerdCore::Class::Array(); for( int i = 0; i < argc; i++) { __NJS_ARGS[i] = argv[i]; } return __NJS_ARGS; } ================================================ FILE: self/compiler/native/nerdcore/src/functions_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ NerdCore::VAR __NERD_Log_Console(NerdCore::VAR _var); NerdCore::VAR __NERD_Object_Keys(NerdCore::VAR _var); NerdCore::VAR __NERD_Object_Stringify(NerdCore::VAR _var); NerdCore::VAR __NERD_Object_Stringify(NerdCore::VAR _var, bool _bracket); NerdCore::VAR __NERD_Object_Clone(NerdCore::VAR& _var); NerdCore::VAR __NERD_Object_Set(std::string _index, NerdCore::VAR _value, NerdCore::Type::object_t *_obj); std::string __NERD_DOUBLE_TO_STRING(double _var); /*** String MANIPULATION ***/ #ifdef __NERD_ENV_ARDUINO namespace std { template string to_string(m _var) { std::stringstream output; output << _var; return output.str(); } int isnan(double __x) { return ::isnan(__x); } inline int isfinite(double __x) { return ::isfinite(__x); } inline int signbit(double __x) { return ::signbit(__x); } inline double stod(std::string _str, std::string::size_type* sz) { *sz = _str.length(); return String(_str.c_str()).toFloat(); } inline int stoi(std::string _str, std::string::size_type* sz, int _base) { *sz = _str.length(); return String(_str.c_str()).toInt(); } inline long long stoll(std::string _str, std::string::size_type* sz, int _base) { *sz = _str.length(); return atol(_str.c_str()); } } template m remainder(m _dividend, n _divisor) { m quotient = (int)_dividend / (int)_divisor; m remainder = (int)_dividend % (int)_divisor; return remainder; } #endif template std::string __NERD_Concat_To_Str(m _left, n _right) { std::stringstream output; output << _left << _right; return output.str(); } /* END String MANIPULATION */ /*** Number MANIPULATION ***/ template int __NERD_Str_To_Int(m _left) { int out; std::stringstream output; output << _left; output >> out; return out; } template double __NERD_Str_To_Double(m _left) { double out; std::stringstream output; output << _left; output >> out; return out; } /* END Number MANIPULATION */ NerdCore::VAR getArguments(int argc, char** argv); ================================================ FILE: self/compiler/native/nerdcore/src/macro.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*** HELPERS ***/ #define __NERD_GET_String(_var) _var.get().s->value #define __NERD_Create_Boolean(_value) NerdCore::VAR(NerdCore::Enum::Type::Boolean, _value) #define __NERD_Create_Number(_value) NerdCore::VAR(_value) #define __NERD_Create_Function(_value) NerdCore::VAR(NerdCore::Enum::Type::Function, _value) #define __NERD_Create_Undefined() NerdCore::VAR() #define __NERD_Create_String(_value) NerdCore::VAR(_value) #define __NERD_Create_Infinity() NerdCore::VAR(std::numeric_limits::infinity) #define __NERD_Create_Null() NerdCore::VAR(NerdCore::Enum::Type::Null, 0) #define __NERD_Create_Struct(_value) NerdCore::VAR(new _value(), new NerdCore::Type::clean_struct([](void* _ptr){ delete (_value*)_ptr;})) #define __NERD_Create_FixedArray(_length) NerdCore::VAR(new NerdCore::Class::FixedArray(_length)) #define __NERD_Create_Lambda(name) NerdCore::Type::function_t* name = new NerdCore::Type::function_t([](NerdCore::VAR& __NERD_THIS, NerdCore::VAR* __NERD_VARARGS, int __NERD_VARLENGTH) #define __NERD_Create_Ptr_Scoped_Anon(__CONTENT__) new NerdCore::Type::function_t([&](NerdCore::VAR& __NERD_THIS, NerdCore::VAR* __NERD_VARARGS, int __NERD_VARLENGTH) mutable -> NerdCore::Global::var { __CONTENT__ }) #define __NERD_Create_Ptr_Scoped_Copy_Anon(__CONTENT__) new NerdCore::Type::function_t([=](NerdCore::VAR& __NERD_THIS, NerdCore::VAR* __NERD_VARARGS, int __NERD_VARLENGTH) mutable -> NerdCore::Global::var { __CONTENT__ }) #define __NERD_Create_Ptr_Scoped_Copy_Anon_With_Ref(__FN__, __CONTENT__) new NerdCore::Type::function_t([=, &__FN__](NerdCore::VAR& __NERD_THIS, NerdCore::VAR* __NERD_VARARGS, int __NERD_VARLENGTH) mutable -> NerdCore::Global::var { __CONTENT__ }) #define __NERD_Create_Ptr_Unscoped_With_Copy(__FN__, __CONTENT__) new NerdCore::Type::function_t([__FN__](NerdCore::VAR& __NERD_THIS, NerdCore::VAR* __NERD_VARARGS, int __NERD_VARLENGTH) mutable -> NerdCore::Global::var { __CONTENT__ }) #define __NERD_Create_Ptr_Unscoped_Anon(__CONTENT__) new NerdCore::Type::function_t([](NerdCore::VAR& __NERD_THIS, NerdCore::VAR* __NERD_VARARGS, int __NERD_VARLENGTH) -> NerdCore::Global::var{ __CONTENT__ }) #define __NERD_Create_Var_Scoped_Anon(__CONTENT__) NerdCore::VAR(NerdCore::Enum::Type::Function, __NERD_Create_Ptr_Scoped_Anon(__CONTENT__)) #define __NERD_Create_Var_Unscoped_Anon(__CONTENT__) NerdCore::VAR(NerdCore::Enum::Type::Function, __NERD_Create_Ptr_Unscoped_Anon(__CONTENT__)) #define __NERD_Create_Var_Scoped_Copy_Anon(__CONTENT__) NerdCore::VAR(NerdCore::Enum::Type::Function, __NERD_Create_Ptr_Scoped_Copy_Anon(__CONTENT__)) #define __NERD_Create_Var_Unscoped_With_Copy(__FN__, __CONTENT__) NerdCore::VAR(NerdCore::Enum::Type::Function, __NERD_Create_Ptr_Unscoped_With_Copy(__FN__, __CONTENT__)) #define __NERD_Create_Var_Scoped_Copy_Anon_With_Ref(__FN__, __CONTENT__) NerdCore::VAR(NerdCore::Enum::Type::Function, __NERD_Create_Ptr_Scoped_Copy_Anon_With_Ref(__FN__, __CONTENT__)) #define __NERD_Init_Int(_name, _value) int _name = _value #define __NERD_Init_Double(_name, _value) double _name = _value #define __NERD_Init_String(_name, _value) std::string _name = _value #define __NERD_EXCEPTION_PARAMETER NerdCore::VAR &e #define finally ; #define __NERD_Throw_Error(_err) NerdCore::VAR(NerdCore::VAR(_err) + NerdCore::VAR(", line: ") + std::to_string(__LINE__) + NerdCore::VAR(", file: ") + NerdCore::VAR(__FILE__)) #define __NERD_Boolean_TRUE __NERD_Create_Boolean(true) #define __NERD_Boolean_FALSE __NERD_Create_Boolean(false) #define __NERD_FAST_INT double #define __NERD_CreateMethodToClass(_name, _fn) __NERD_Object_Set(_name, __NERD_Create_Var_Scoped_Anon( return _fn(NerdCore::VAR& __NERD_THIS, __NERD_VARARGS, __NERD_VARLENGTH); ), &object); #define __NERD_NEW(_fn) ((NerdCore::Class::Function*)_fn.data.ptr)->New #define __NERD_Access_Struct(_exp, _name) (*(_name*)((NerdCore::Class::Struct*)_exp.data.ptr)->value) #define arguments() new NerdCore::Class::FixedArray(__NERD_VARARGS, __NERD_VARLENGTH); //#define __NERD_Native_Ptr(_var, _type) ((_type)((NerdCore::Class::NativeTPL<_type>*)_var.data.ptr)->value) #define __NERD_OBJECT(_var) ((NerdCore::Class::Object*)_var.data.ptr) #define __NERD_FUNCTION(_var) ((NerdCore::Class::Function*)_var.data.ptr) #define __NERD_BIND(_var, _function, _bind) _var = _function;((NerdCore::Class::Function*)_var.data.ptr)->bind = _bind; #define Prototype() __NERD_Create_Var_Scoped_Copy_Anon( return __NERD_THIS; ) ================================================ FILE: self/compiler/native/nerdcore/src/native/double.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ NerdCore::VAR operator+(double _i, NerdCore::VAR _v) { if(_v.type == NerdCore::Enum::Type::String) return __NERD_DOUBLE_TO_STRING(_i) + (std::string)_v; else return _i + (double)_v; } void operator+=(double& _i, NerdCore::VAR _v) { _i += (double)_v; } double operator-(double _i, NerdCore::VAR _v) { if(_v.type == NerdCore::Enum::Type::String) return std::numeric_limits::quiet_NaN(); return _i - (double)_v; } void operator-=(double& _i, NerdCore::VAR _v) { _i -= (double)_v; } double operator*(double _i, NerdCore::VAR _v) { if(_v.type == NerdCore::Enum::Type::String) return std::numeric_limits::quiet_NaN(); return _i * (double)_v; } void operator*=(double& _i, NerdCore::VAR _v) { _i *= (double)_v; } double operator/(double _i, NerdCore::VAR _v) { if(_v.type == NerdCore::Enum::Type::String) return std::numeric_limits::quiet_NaN(); return _i / (double)_v; } void operator/=(double& _i, NerdCore::VAR _v) { _i /= _v; } double operator%(double _i, NerdCore::VAR _v) { return (int)_i % (int)_v; } void operator%=(double& _i, NerdCore::VAR _v) { _i %= _v; } double operator==(double _i, NerdCore::VAR _v) { return _i == (double)_v; } double operator!=(double _i, NerdCore::VAR _v) { return _i != (double)_v; } double operator>(double _i, NerdCore::VAR _v) { return _i > (double)_v; } double operator>=(double _i, NerdCore::VAR _v) { return _i >= (double)_v; } double operator<(double _i, NerdCore::VAR _v) { return _i < (double)_v; } double operator<=(double _i, NerdCore::VAR _v) { return _i <= (double)_v; } ================================================ FILE: self/compiler/native/nerdcore/src/native/double_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ NerdCore::VAR operator+(double _i, NerdCore::VAR _v); void operator+=(double& _i, NerdCore::VAR _v); double operator-(double _i, NerdCore::VAR _v); void operator-=(double& _i, NerdCore::VAR _v); double operator*(double _i, NerdCore::VAR _v); void operator*=(double& _i, NerdCore::VAR _v); double operator/(double _i, NerdCore::VAR _v); void operator/=(double& _i, NerdCore::VAR _v); double operator%(double _i, NerdCore::VAR _v); void operator%=(double& _i, NerdCore::VAR _v); double operator==(double _i, NerdCore::VAR _v); double operator!=(double _i, NerdCore::VAR _v); double operator>(double _i, NerdCore::VAR _v); double operator>=(double _i, NerdCore::VAR _v); double operator<(double _i, NerdCore::VAR _v); double operator<=(double _i, NerdCore::VAR _v); ================================================ FILE: self/compiler/native/nerdcore/src/native/int.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ NerdCore::VAR operator+(int _i, NerdCore::VAR _v) { if(_v.type == NerdCore::Enum::Type::String) return __NERD_DOUBLE_TO_STRING(_i) + (std::string)_v; else return _i + (double)_v; } void operator+=(int& _i, NerdCore::VAR _v) { _i += (double)_v; } double operator-(int _i, NerdCore::VAR _v) { return _i - (double)_v; } void operator-=(int& _i, NerdCore::VAR _v) { _i -= (double)_v; } double operator*(int _i, NerdCore::VAR _v) { return _i * (double)_v; } void operator*=(int& _i, NerdCore::VAR _v) { _i *= _v; } double operator/(int _i, NerdCore::VAR _v) { return _i / (double)_v; } void operator/=(int& _i, NerdCore::VAR _v) { _i /= _v; } double operator%(int _i, NerdCore::VAR _v) { return (int)_i % (int)_v; } void operator%=(int& _i, NerdCore::VAR _v) { _i %= _v; } double operator==(int _i, NerdCore::VAR _v) { return _i == (double)_v; } double operator!=(int _i, NerdCore::VAR _v) { return _i != (double)_v; } double operator>(int _i, NerdCore::VAR _v) { return _i > (double)_v; } double operator>=(int _i, NerdCore::VAR _v) { return _i >= (double)_v; } double operator<(int _i, NerdCore::VAR _v) { return _i < (double)_v; } double operator<=(int _i, NerdCore::VAR _v) { return _i <= (double)_v; } ================================================ FILE: self/compiler/native/nerdcore/src/native/int_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ NerdCore::VAR operator+(int _i, NerdCore::VAR _v); void operator+=(int& _i, NerdCore::VAR _v); double operator-(int _i, NerdCore::VAR _v); void operator-=(int& _i, NerdCore::VAR _v); double operator*(int _i, NerdCore::VAR _v); void operator*=(int& _i, NerdCore::VAR _v); double operator/(int _i, NerdCore::VAR _v); void operator/=(int& _i, NerdCore::VAR _v); double operator%(int _i, NerdCore::VAR _v); void operator%=(int& _i, NerdCore::VAR _v); double operator==(int _i, NerdCore::VAR _v); double operator!=(int _i, NerdCore::VAR _v); double operator>(int _i, NerdCore::VAR _v); double operator>=(int _i, NerdCore::VAR _v); double operator<(int _i, NerdCore::VAR _v); double operator<=(int _i, NerdCore::VAR _v); ================================================ FILE: self/compiler/native/nerdcore/src/native.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "native/int.h" #include "native/double.h" ================================================ FILE: self/compiler/native/nerdcore/src/native_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "native/int_header.h" #include "native/double_header.h" ================================================ FILE: self/compiler/native/nerdcore/src/nerd.cpp ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "nerd.hpp" #include "functions.h" #include "native.h" #include "values.h" #include "class/number.h" #include "var.h" #include "objmgmt.h" #include "classes.h" #include "operator.h" #include "stdfn.h" ================================================ FILE: self/compiler/native/nerdcore/src/nerd.hpp ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #define _USE_MATH_DEFINES #include #include #include #include #include #include #include #include #include #include #include #define _USE_MATH_DEFINES #include #include #include #ifdef __NERD_ENV_ARDUINO #include #include #include #include #include #include #include #undef max #undef min #include #else #include #include #include #include #include #include #endif #include "enum.h" #include "macro.h" namespace NerdCore { struct VAR; namespace Class { class Base; class Undefined; class Boolean; class String; class Array; class Object; class Function; class Native; class Struct; class FixedArray; //template //class NativeTPL; } } // namespace NerdCore #include "type_header.h" #include "var_header.h" #include "values_header.h" #include "functions_header.h" #include "classes_header.h" #include "native_header.h" #include "class/number_header.h" #include "objmgmt_header.h" #include "operator_header.h" #include "stdfn_header.h" ================================================ FILE: self/compiler/native/nerdcore/src/objmgmt.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ NerdCore::VAR __NERD_delete(NerdCore::VAR _left, NerdCore::VAR _right) { if(_left.type == NerdCore::Enum::Type::Object) { ((NerdCore::Class::Object*)_left.data.ptr)->jsDelete(_right); return __NERD_Boolean_TRUE; } else if(_left.type == NerdCore::Enum::Type::Array) { ((NerdCore::Class::Array*)_left.data.ptr)->jsDelete(_right); return __NERD_Boolean_TRUE; } else if(_left.type == NerdCore::Enum::Type::Function) { ((NerdCore::Class::Function*)_left.data.ptr)->jsDelete(_right); return __NERD_Boolean_TRUE; } return __NERD_Boolean_FALSE; } /*** ***/ #ifndef __NERD__OBJECT_VECTOR NerdCore::VAR __NERD_Object_Set(std::string _index, NerdCore::VAR _value, NerdCore::Type::object_t *_obj) { if (_value.type == NerdCore::Enum::Type::String) { (*_obj)[_index] = new NerdCore::Class::String((std::string)_value); } else { (*_obj)[_index].data.ptr = _value.data.ptr; } return NerdCore::Global::null; } #else NerdCore::VAR __NERD_Object_Set(std::string _index, NerdCore::VAR _value, NerdCore::Type::object_t *_obj) { int _j = (*_obj).size(); for (int _i = 0; _i < _j; _i++) { if (_index.compare((*_obj)[_i].first) == 0) { if (_value.type == NerdCore::Enum::Type::String) { (*_obj)[_i].second = new NerdCore::Class::String((std::string)_value); } else { (*_obj)[_i].second.data.ptr = _value.data.ptr; } return NerdCore::Global::null; } } (*_obj).push_back(NerdCore::Type::pair_t(_index, _value)); return NerdCore::Global::null; } #endif /**/ NerdCore::VAR __NERD_Object_Set(NerdCore::VAR _index, NerdCore::VAR _value, NerdCore::VAR _array) { if (_array.type == NerdCore::Enum::Type::Array && _index.type == NerdCore::Enum::Type::Number) { if (((NerdCore::Class::Array*)_array.data.ptr)->value.size() <= (int)_index.data.number) { ((NerdCore::Class::Array*)_array.data.ptr)->value.resize( (int)_index.data.number + 1); } ((NerdCore::Class::Array*)_array.data.ptr)->value.at( (int)_index.data.number ) = _value; return NerdCore::Global::null; } else if (_array.type == NerdCore::Enum::Type::Object || _array.type == NerdCore::Enum::Type::String || _array.type == NerdCore::Enum::Type::Function || _array.type == NerdCore::Enum::Type::Array || _array.type == NerdCore::Enum::Type::Native) { NerdCore::Type::object_t *_obj; if (_array.type == NerdCore::Enum::Type::Object) _obj = &((NerdCore::Class::Object*)_array.data.ptr)->object; else return NerdCore::Global::null; return __NERD_Object_Set((std::string)_index, _value, _obj); } return NerdCore::Global::null; } /* typeof */ const std::string _array[] = {"null", "boolean", "number", "string", "native", "native", "struct", "fixed_array", "array", "object", "function" }; std::string type_of(NerdCore::Global::var _var) { return _array[_var.type]; } std::string typeof(NerdCore::Global::var _var) { return _array[_var.type]; } ================================================ FILE: self/compiler/native/nerdcore/src/objmgmt_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ NerdCore::VAR __NERD_delete(NerdCore::VAR _left, NerdCore::VAR _right); NerdCore::VAR __NERD_Object_Set(std::string _index, NerdCore::VAR _value, NerdCore::Type::object_t *_obj); NerdCore::VAR __NERD_Object_Set(NerdCore::VAR _index, NerdCore::VAR _value, NerdCore::VAR _array); std::string type_of(NerdCore::Global::var _var); std::string typeof(NerdCore::Global::var _var); /* inline NerdCore::Global::var Object() { return NerdCore::VAR((NerdCore::Class::Object *)new NerdCore::Class::Object()); } */ /* inline NerdCore::Global::var Object(NerdCore::Type::object_t _obj) { return new NerdCore::Class::Object(_obj); } */ inline NerdCore::Global::var Array() { return new NerdCore::Class::Array(); } inline NerdCore::Global::var FixedArray() { return new NerdCore::Class::FixedArray(); } inline NerdCore::Global::var FixedArray(NerdCore::Global::var _length) { return new NerdCore::Class::FixedArray(_length); } inline NerdCore::Global::var FixedArray(int _length) { return new NerdCore::Class::FixedArray(_length); } ================================================ FILE: self/compiler/native/nerdcore/src/operator.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ NerdCore::VAR operator+ (const char* _left, const NerdCore::VAR &_right) { return NerdCore::VAR(_left) + _right; } NerdCore::VAR operator+ (std::string _left, const NerdCore::VAR &_right) { return NerdCore::VAR(_left) + _right; } NerdCore::VAR operator* (const char* _left, const NerdCore::VAR &_right) { return NerdCore::Global::NaN; } NerdCore::VAR operator* (std::string _left, const NerdCore::VAR &_right) { return NerdCore::Global::NaN; } NerdCore::VAR operator- (const char* _left, const NerdCore::VAR &_right) { return NerdCore::Global::NaN; } NerdCore::VAR operator- (std::string _left, const NerdCore::VAR &_right) { return NerdCore::Global::NaN; } NerdCore::VAR operator/ (const char* _left, const NerdCore::VAR &_right) { return NerdCore::Global::NaN; } NerdCore::VAR operator/ (std::string _left, const NerdCore::VAR &_right) { return NerdCore::Global::NaN; } /*** operator== ***/ NerdCore::VAR operator== (NerdCore::VAR _left, int right) { return (double)_left == right; } NerdCore::VAR operator== (NerdCore::VAR _left, double right) { return (double)_left == right; } NerdCore::VAR operator== (NerdCore::VAR _left, std::string right) { return (std::string)_left == right; } NerdCore::VAR operator== (NerdCore::VAR _left, const char* right) { return (std::string)_left == std::string(right); } /* end operator== */ /*** operator!= ***/ NerdCore::VAR operator!= (NerdCore::VAR _left, int right) { return (double)_left != right; } NerdCore::VAR operator!= (NerdCore::VAR _left, double right) { return (double)_left != right; } NerdCore::VAR operator!= (NerdCore::VAR _left, std::string right) { return (std::string)_left != right; } NerdCore::VAR operator!= (NerdCore::VAR _left, const char* right) { return (std::string)_left != std::string(right); } /* end operator!= */ /*** operator| ***/ NerdCore::VAR operator| (NerdCore::VAR _left, int right) { return (int)_left | right; } NerdCore::VAR operator| (NerdCore::VAR _left, double right) { return (int)_left | (int)right; } NerdCore::VAR operator| (NerdCore::VAR _left, std::string right) { return (double)_left; } NerdCore::VAR operator| (NerdCore::VAR _left, const char* right) { return (double)_left; } /* end operator| */ /*** operator^ ***/ NerdCore::VAR operator^ (NerdCore::VAR _left, int right) { return (int)_left ^ right; } NerdCore::VAR operator^ (NerdCore::VAR _left, double right) { return (int)_left ^ (int)right; } NerdCore::VAR operator^ (NerdCore::VAR _left, std::string right) { return (double)_left; } NerdCore::VAR operator^ (NerdCore::VAR _left, const char* right) { return (double)_left; } /* end operator^ */ /*** operator& ***/ NerdCore::VAR operator& (NerdCore::VAR _left, int right) { return (int)_left & right; } NerdCore::VAR operator& (NerdCore::VAR _left, double right) { return (int)_left & (int)right; } NerdCore::VAR operator& (NerdCore::VAR _left, std::string right) { return (double)_left; } NerdCore::VAR operator& (NerdCore::VAR _left, const char* right) { return (double)_left; } /* end operator& */ /*** operator< ** inline NerdCore::VAR operator< (NerdCore::VAR _left, int right) { return _left.data.number < right; } inline NerdCore::VAR operator< (NerdCore::VAR _left, double right) { return _left.data.number < right; } */ NerdCore::VAR operator< (NerdCore::VAR _left, std::string right) { return (std::string)_left < right; } NerdCore::VAR operator< (NerdCore::VAR _left, const char* right) { return (std::string)_left < std::string(right); } /* end operator< */ /*** operator<< ***/ NerdCore::VAR operator<< (NerdCore::VAR _left, int right) { return (int)_left << right; } NerdCore::VAR operator<< (NerdCore::VAR _left, double right) { return (int)_left << (int)right; } NerdCore::VAR operator<< (NerdCore::VAR _left, std::string right) { return (std::string)_left << right; } NerdCore::VAR operator<< (NerdCore::VAR _left, const char* right) { return (std::string)_left << std::string(right); } /* end operator<< */ /*** operator>= ***/ NerdCore::VAR operator<= (NerdCore::VAR _left, std::string right) { return (std::string)_left <= right; } NerdCore::VAR operator<= (NerdCore::VAR _left, const char* right) { return (std::string)_left < std::string(right); } /* end operator<= */ /*** operator> ***/ NerdCore::VAR operator> (NerdCore::VAR _left, std::string right) { return (std::string)_left > right; } NerdCore::VAR operator> (NerdCore::VAR _left, const char* right) { return (std::string)_left > std::string(right); } /* end operator> */ /*** operator>> ***/ NerdCore::VAR operator>> (NerdCore::VAR _left, int right) { return (int)_left >> right; } NerdCore::VAR operator>> (NerdCore::VAR _left, double right) { return (int)_left >> (int)right; } NerdCore::VAR operator>> (NerdCore::VAR _left, std::string right) { return (std::string)_left >> right; } NerdCore::VAR operator>> (NerdCore::VAR _left, const char* right) { return (std::string)_left >> std::string(right); } /* end operator>> */ /*** operator>= ***/ NerdCore::VAR operator>= (NerdCore::VAR _left, std::string right) { return (std::string)_left >= right; } NerdCore::VAR operator>= (NerdCore::VAR _left, const char* right) { return (std::string)_left > std::string(right); } /* end operator>= */ NerdCore::VAR __NERD_Boolean_Result(NerdCore::VAR _v) { if (_v.type == NerdCore::Enum::Type::Number) return _v.data.number; else if (_v.type == NerdCore::Enum::Type::Boolean) return _v.data.number; else if (_v.type == NerdCore::Enum::Type::String) { if (strlen(((NerdCore::Class::String*)_v.data.ptr)->value.c_str()) > 0) return true; else return false; } else if (_v.type == NerdCore::Enum::Type::Array) return true; else return false; } std::string __NERD_DOUBLE_TO_STRING(double _var) { std::ostringstream strout ; strout << std::fixed << std::setprecision(14) << _var; std::string str = strout.str() ; size_t end = str.find_last_not_of( '0' ) + 1 ; str = str.erase( end ) ; end = str.find_last_not_of( '.' ) + 1 ; str = str.erase( end ) ; int exp = str.length(); if(exp > 21) { std::string first = str.substr(0, 1); std::string second = str.substr(1, 15); str = first + "." + second + "e+" + std::to_string(exp-1); } return str; } std::ostream &operator<<(std::ostream &os, const NerdCore::VAR &_v) { switch (_v.type) { case NerdCore::Enum::Type::Boolean: if(_v.data.number) os << "true"; else os << "false"; break; case NerdCore::Enum::Type::Number: os << std::setprecision(14) << _v.data.number; break; case NerdCore::Enum::Type::String: os << (std::string)(*(NerdCore::Class::String*)_v.data.ptr); break; case NerdCore::Enum::Type::Object: os << __NERD_Object_Stringify(_v); break; case NerdCore::Enum::Type::FixedArray: os << __NERD_Object_Stringify(_v); break; case NerdCore::Enum::Type::Array: os << __NERD_Object_Stringify(_v); break; case NerdCore::Enum::Type::Struct: os << (std::string)(*(NerdCore::Class::Struct*)_v.data.ptr); break; case NerdCore::Enum::Type::Native: os << (std::string)(*(NerdCore::Class::Native*)_v.data.ptr); break; case NerdCore::Enum::Type::Function: os << (std::string)(*(NerdCore::Class::Function*)_v.data.ptr); break; case NerdCore::Enum::Type::Null: os << "null"; break; default: os << "null"; break; } return os; } NerdCore::VAR parseInt(NerdCore::VAR _str) { if (_str.type == NerdCore::Enum::Type::String) { #ifdef __NERD_ENV_ARDUINO return NerdCore::Global::null; #else return __NERD_Create_Number((double)(*(NerdCore::Class::String*)_str.data.ptr)); #endif } else return NerdCore::Global::null; } NerdCore::VAR __NERD_Log_Console(NerdCore::VAR _var) { #ifdef __NERD_ENV_ARDUINO #else std::cout << _var; std::cout << std::endl; #endif return NerdCore::Global::null; } NerdCore::VAR __NERD_Log_Console(NerdCore::VAR* _var, int _length) { #ifdef __NERD_ENV_ARDUINO #else bool first = false; for(int i = 0; i < _length; i++) { if(first) std::cout << " "; std::cout << _var[i]; if(!first) first = true; } std::cout << std::endl; #endif return NerdCore::Global::null; } NerdCore::VAR __NERD_Object_Keys(NerdCore::VAR _var) { NerdCore::VAR _res = new NerdCore::Class::Array(); if (_var.type != NerdCore::Enum::Type::Object && _var.type != NerdCore::Enum::Type::Array) { return _res; } if(_var.type == NerdCore::Enum::Type::Array) { NerdCore::Type::vector_t *_arr = &((NerdCore::Class::Array*)_var.data.ptr)->value; int _j = (*_arr).size(); for (int _i = 0; _i < _j; _i++) { _res[_i] = std::to_string(_i); } } else { NerdCore::Type::object_t *_obj; if(_var.type == NerdCore::Enum::Type::Object) _obj = &((NerdCore::Class::Object*)_var.data.ptr)->object; #ifndef __NERD__OBJECT_VECTOR int _k = 0; for (auto _el: *_obj) { _res[_k] = _el.first; _k++; } #else int _j = (*_obj).size(); for (int _k = 0; _k < _j; _k++) { _res[_k] = (*_obj)[_k].first; } #endif } return _res; } NerdCore::VAR __NERD_Object_Stringify(NerdCore::VAR _var) { return __NERD_Object_Stringify(_var, true); } NerdCore::VAR __NERD_Object_Stringify(NerdCore::VAR _var, bool _bracket) { NerdCore::Enum::Type _t = _var.type; if (_t == NerdCore::Enum::Type::Number) { return "\e[33m" + _var + "\e[0m"; } else if (_t == NerdCore::Enum::Type::String) { return "\e[32m'" + ((NerdCore::Class::String*)_var.data.ptr)->value + "'\e[0m"; } else if (_t == NerdCore::Enum::Type::Function) { return "'" + (std::string)(*(NerdCore::Class::Function*)_var.data.ptr) + "'"; } else if (_t == NerdCore::Enum::Type::FixedArray) { NerdCore::VAR _res = ""; NerdCore::VAR *_arr = ((NerdCore::Class::FixedArray*)_var.data.ptr)->value; if(_bracket) _res += " [ "; int j = ((NerdCore::Class::FixedArray*)_var.data.ptr)->length; int k = 0; int l = 0; for (int i = 0; i < j; i++) { if (l > 0) _res += ", "; if(k > 0) { if(k == 1) _res += "\e[90m<1 empty item>\e[0m, "; else _res += "\e[90m<" + std::to_string(k) + " empty items>\e[0m, "; k = 0; } _res += __NERD_Object_Stringify((*_arr)[i], _bracket); l++; } if(k > 0) { if (l > 0) _res += ", "; if(k == 1) _res += "\e[90m<1 empty item>\e[0m"; else _res += "\e[90m<" + std::to_string(k) + " empty items>\e[0m"; l++; } if(_bracket) _res += " ] "; return _res; } else if (_t == NerdCore::Enum::Type::Array) { NerdCore::VAR _res = NerdCore::Global::var(""); NerdCore::Type::vector_t *_arr = &((NerdCore::Class::Array*)_var.data.ptr)->value; if(_bracket) _res += " [ "; int j = (*_arr).size(); int k = 0; int l = 0; for (int i = 0; i < j; i++) { if (l > 0) _res += ", "; if(k > 0) { if(k == 1) _res += "\e[90m<1 empty item>\e[0m, "; else _res += "\e[90m<" + std::to_string(k) + " empty items>\e[0m, "; k = 0; } NerdCore::Global::var test = _res += __NERD_Object_Stringify((*_arr)[i], _bracket); l++; } if(k > 0) { if (l > 0) _res += ", "; if(k == 1) _res += "\e[90m<1 empty item>\e[0m"; else _res += "\e[90m<" + std::to_string(k) + " empty items>\e[0m"; l++; } if(_bracket) _res += " ] "; return _res; } else if (_t == NerdCore::Enum::Type::Object) { NerdCore::VAR _res = ""; NerdCore::Type::object_t *_obj = &((NerdCore::Class::Object*)_var.data.ptr)->object; _res = "{"; #ifndef __NERD__OBJECT_VECTOR int _i = 0; int _comma = 0; for (auto _el: *_obj) { if(_el.second.type != NerdCore::Enum::Type::Null && _el.first != "__proto__" && _el.first != "prototype") { if (_comma > 0) _res += ", "; _res += NerdCore::VAR("\"") + _el.first + "\""; _res += ":"; _res += __NERD_Object_Stringify(_el.second); _comma++; } _i++; } #else int j = (*_obj).size(); for (int _i = 0; _i < j; _i++) { if (_i > 0) _res += ", "; _res += NerdCore::VAR("\"") + (*_obj)[_i].first + "\""; _res += ":"; _res += __NERD_Object_Stringify((*_obj)[_i].second); } #endif _res += "}"; return _res; } else return ""; } NerdCore::VAR __NERD_Object_Clone(NerdCore::VAR& _var) { NerdCore::Enum::Type _t = _var.type; switch(_t) { case NerdCore::Enum::Type::Null: case NerdCore::Enum::Type::Number: case NerdCore::Enum::Type::String: case NerdCore::Enum::Type::Function: return _var; case NerdCore::Enum::Type::Array: { NerdCore::VAR _res = new NerdCore::Class::Array(); std::vector *_arr = &((NerdCore::Class::Array*)_var.data.ptr)->value; int j = (*_arr).size(); for (int i = 0; i < j; i++) { _res[i] = __NERD_Object_Clone((*_arr)[i]); } return _res; } case NerdCore::Enum::Type::Object: { const NerdCore::VAR _res = new NerdCore::Class::Object(); NerdCore::Type::object_t *_obj = &((NerdCore::Class::Object*)_var.data.ptr)->object; #ifndef __NERD__OBJECT_VECTOR for (auto _el: *_obj) { _res[_el.first] = __NERD_Object_Clone(_el.second); } #else int j = (*_obj).size(); for (int _i = 0; _i < j; _i++) { _res[(*_obj)[_i].first] = __NERD_Object_Clone((*_obj)[_i].second); } #endif return _res; } default: return NerdCore::Global::null; } } void __NERD_Object_Construct(NerdCore::VAR _this, NerdCore::VAR _prototype) { if(_this.type == NerdCore::Enum::Type::Object && _prototype.type == NerdCore::Enum::Type::Object) { NerdCore::Type::object_t *_obj = &((NerdCore::Class::Object*)_prototype.data.ptr)->object; #ifndef __NERD__OBJECT_VECTOR for (auto _el: *_obj) { NerdCore::VAR _tmp = _this[_el.first]; if(_tmp.type == NerdCore::Enum::Type::Null) { _this[_el.first] = _el.second; } } #else int j = (*_obj).size(); for (int _i = 0; _i < j; _i++) { NerdCore::VAR _tmp = _this[(*_obj)[_i].first]; if(_tmp.type == NerdCore::Enum::Type::Null) { _this[(*_obj)[_i].first] = (*_obj)[_i].second; } } #endif } } NerdCore::VAR __NERD_CREATE_Function(void *_fn) { return NerdCore::VAR(NerdCore::Enum::Type::Function, _fn); } NerdCore::VAR __NERD_Create_Native(void *_native) { return NerdCore::VAR(NerdCore::Enum::Type::Null, _native); } void *__NERD_Get_Native(NerdCore::VAR _native) { return ((NerdCore::Class::Function*)_native.data.ptr); } __NERD_Create_Lambda(__IMPL_EVAL) { __NERD_Log_Console("eval not implemented, return NerdCore::Global::null"); return NerdCore::VAR(); }); NerdCore::VAR eval = __NERD_Create_Function(__IMPL_EVAL); std::function *__NERD_IS_NAN = new std::function([](NerdCore::Type::vector_t _Nerd_VARARGS) { NerdCore::VAR _test; if (_Nerd_VARARGS.size() > 0) _test = _Nerd_VARARGS[0]; else return __NERD_Create_Boolean(0); if (_test.type == NerdCore::Enum::Type::Number) { return __NERD_Create_Boolean(1); } return __NERD_Create_Boolean(0); }); NerdCore::VAR isNaN = NerdCore::VAR(NerdCore::Enum::Type::Function, __NERD_IS_NAN); NerdCore::VAR __NERD_EQUAL_VALUE_AND_TYPE(NerdCore::VAR _left, NerdCore::VAR _right) { if (_left.type == _right.type && (NerdCore::VAR)_left == (NerdCore::VAR)_right) { return __NERD_Create_Boolean(1); } return __NERD_Create_Boolean(0); } NerdCore::VAR __NERD_NOT_EQUAL_VALUE_AND_TYPE(NerdCore::VAR _left, NerdCore::VAR _right) { if (_left.type != _right.type || (bool)(_left != _right)) { return __NERD_Create_Boolean(1); } return __NERD_Create_Boolean(0); } NerdCore::VAR operator+ (NerdCore::VAR _left, int right) { if (_left.type == NerdCore::Enum::Type::String) return (std::string)_left + __NERD_DOUBLE_TO_STRING(right); else return (double)_left + right; } NerdCore::VAR operator+ (NerdCore::VAR _left, double right) { if (_left.type == NerdCore::Enum::Type::String) return (std::string)_left + __NERD_DOUBLE_TO_STRING(right); else return (double)_left + right; } NerdCore::VAR operator+ (NerdCore::VAR _left, const char* right) { return (std::string)_left + std::string(right); } void operator+= (NerdCore::VAR& _left, std::string right) { std::string _str = (std::string)_left; _str += right; _left = _str; } void operator+= (NerdCore::VAR& _left, const char* right) { std::string _str = (std::string)_left; _str += right; _left = _str; } void operator+= (NerdCore::VAR& _left, int right) { if(_left.type == NerdCore::Enum::Type::Number) _left.data.number += right; else { std::string _str = (std::string)_left; _str += right; _left = _str; } } void operator+= (NerdCore::VAR& _left, double right) { if(_left.type == NerdCore::Enum::Type::Number) _left.data.number += right; else { std::string _str = (std::string)_left; _str += right; _left.data.ptr = new NerdCore::Class::String(_str); _left.type = NerdCore::Enum::Type::String; } } NerdCore::VAR operator|| (NerdCore::VAR _left, int right) { if(_left.type != NerdCore::Enum::Type::Null) return _left; else return right; } NerdCore::VAR operator|| (NerdCore::VAR _left, double right) { if(_left.type != NerdCore::Enum::Type::Null) return _left; else return right; } NerdCore::VAR operator|| (NerdCore::VAR _left, std::string right) { if(_left.type != NerdCore::Enum::Type::Null) return _left; else return right; } NerdCore::VAR operator|| (NerdCore::VAR _left, const char* right) { if(_left.type != NerdCore::Enum::Type::Null) return _left; else return right; } /*** op* ***/ NerdCore::VAR operator* (NerdCore::VAR _left, int right) { return (double)_left * right; } NerdCore::VAR operator* (NerdCore::VAR _left, double right) { return (double)_left * right; } NerdCore::VAR operator* (NerdCore::VAR _left, std::string right) { return (double)_left * (double)(NerdCore::VAR(right)); } NerdCore::VAR operator* (NerdCore::VAR _left, const char* right) { return (double)_left * (double)(NerdCore::VAR(right)); } /* end op* */ /*** op- ***/ NerdCore::VAR operator- (NerdCore::VAR _left, int right) { return (double)_left - right; } NerdCore::VAR operator- (NerdCore::VAR _left, double right) { return (double)_left - right; } NerdCore::VAR operator- (NerdCore::VAR _left, std::string right) { return (double)_left - (double)(NerdCore::VAR(right)); } NerdCore::VAR operator- (NerdCore::VAR _left, const char* right) { return (double)_left - (double)(NerdCore::VAR(right)); } /* end op- */ /*** op/ ***/ NerdCore::VAR operator/ (NerdCore::VAR _left, int right) { return (double)_left / right; } NerdCore::VAR operator/ (NerdCore::VAR _left, double right) { return (double)_left / right; } NerdCore::VAR operator/ (NerdCore::VAR _left, std::string right) { return (double)_left / (double)(NerdCore::VAR(right)); } NerdCore::VAR operator/ (NerdCore::VAR _left, const char* right) { return (double)_left / (double)(NerdCore::VAR(right)); } /* end op/ */ /*** op% ***/ NerdCore::VAR operator% (NerdCore::VAR _left, int right) { return (int)_left % right; } NerdCore::VAR operator% (NerdCore::VAR _left, double right) { return (int)_left % (int)right; } NerdCore::VAR operator% (NerdCore::VAR _left, std::string right) { return (int)_left % (int)(NerdCore::VAR(right)); } NerdCore::VAR operator% (NerdCore::VAR _left, const char* right) { return (int)_left % (int)(NerdCore::VAR(right)); } /* end op% */ ================================================ FILE: self/compiler/native/nerdcore/src/operator_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifdef __NERD_ENV_ARDUINO bool operator==(std::string_view sw, const char* c) { return sw == std::string_view(c); } bool operator!=(std::string_view sw, const char* c) { return sw != std::string_view(c); } #else constexpr bool operator==(std::string_view sw, const char* c) { return sw == std::string_view(c); } constexpr bool operator!=(std::string_view sw, const char* c) { return sw != std::string_view(c); } #endif NerdCore::VAR __NERD_Boolean_Result(NerdCore::VAR _v); std::string __NERD_DOUBLE_TO_STRING(double _var); std::ostream &operator<<(std::ostream &os, const NerdCore::VAR &_v); NerdCore::VAR parseInt(NerdCore::VAR _str); NerdCore::VAR __NERD_Log_Console(NerdCore::VAR _var); NerdCore::VAR __NERD_Log_Console(NerdCore::VAR* _var, int _length); NerdCore::VAR __NERD_Object_Keys(NerdCore::VAR _var); NerdCore::VAR __NERD_Object_Stringify(NerdCore::VAR _var); NerdCore::VAR __NERD_Object_Stringify(NerdCore::VAR _var, bool _bracket); NerdCore::VAR __NERD_Object_Clone(NerdCore::VAR& _var); void __NERD_Object_Construct(NerdCore::VAR _this, NerdCore::VAR _prototype); NerdCore::VAR __NERD_CREATE_Function(void *_fn); NerdCore::VAR __NERD_Create_Native(void *_native); void *__NERD_Get_Native(NerdCore::VAR _native); /*** REDIFINING STD OPERATORS ***/ NerdCore::VAR operator+ (const char* _left, const NerdCore::VAR &_right); NerdCore::VAR operator+ (std::string _left, const NerdCore::VAR &_right); NerdCore::VAR operator- (const char* _left, const NerdCore::VAR &_right); NerdCore::VAR operator- (std::string _left, const NerdCore::VAR &_right); NerdCore::VAR operator* (const char* _left, const NerdCore::VAR &_right); NerdCore::VAR operator* (std::string _left, const NerdCore::VAR &_right); NerdCore::VAR operator/ (const char* _left, const NerdCore::VAR &_right); NerdCore::VAR operator/ (std::string _left, const NerdCore::VAR &_right); inline bool operator< (NerdCore::VAR _left, const int right) noexcept { return _left.data.number < right; } inline bool operator< (NerdCore::VAR _left, const long long int right) noexcept { return _left.data.number < right; } inline bool operator< (NerdCore::VAR _left, const double right) noexcept { return _left.data.number < right; } NerdCore::VAR operator< (NerdCore::VAR _left, std::string right); NerdCore::VAR operator< (NerdCore::VAR _left, const char* right); inline bool operator<= (NerdCore::VAR _left, const int right) noexcept { return _left.data.number <= right; } inline bool operator<= (NerdCore::VAR _left, const long long int right) noexcept { return _left.data.number <= right; } inline bool operator<= (NerdCore::VAR _left, const double right) noexcept { return _left.data.number <= right; } NerdCore::VAR operator<= (NerdCore::VAR _left, std::string right); NerdCore::VAR operator<= (NerdCore::VAR _left, const char* right); inline bool operator> (NerdCore::VAR _left, const int right) noexcept { return _left.data.number > right; } inline bool operator> (NerdCore::VAR _left, const long long int right) noexcept { return _left.data.number > right; } inline bool operator> (NerdCore::VAR _left, const double right) noexcept { return _left.data.number > right; } NerdCore::VAR operator> (NerdCore::VAR _left, std::string right); NerdCore::VAR operator> (NerdCore::VAR _left, const char* right); inline const bool operator>= (NerdCore::VAR _left, const int right) noexcept { return _left.data.number >= right; } inline bool operator>= (NerdCore::VAR _left, const long long int right) noexcept { return _left.data.number >= right; } inline bool operator>= (NerdCore::VAR _left, const double right) noexcept { return _left.data.number >= right; } NerdCore::VAR operator>= (NerdCore::VAR _left, std::string right); NerdCore::VAR operator>= (NerdCore::VAR _left, const char* right); /*** END REDIFINING STD OPERATORS ***/ extern NerdCore::VAR eval; extern std::function *__NERD_IS_NAN; extern NerdCore::VAR isNaN; NerdCore::VAR __NERD_EQUAL_VALUE_AND_TYPE(NerdCore::VAR _left, NerdCore::VAR _right); NerdCore::VAR __NERD_NOT_EQUAL_VALUE_AND_TYPE(NerdCore::VAR _left, NerdCore::VAR _right); NerdCore::VAR operator+ (NerdCore::VAR _left, int right); NerdCore::VAR operator+ (NerdCore::VAR _left, double right); void operator+= (NerdCore::VAR& _left, std::string right); void operator+= (NerdCore::VAR& _left, const char* right); void operator+= (NerdCore::VAR& _left, int right); void operator+= (NerdCore::VAR& _left, double right); NerdCore::VAR operator* (NerdCore::VAR _left, int right); NerdCore::VAR operator* (NerdCore::VAR _left, double right); NerdCore::VAR operator* (NerdCore::VAR _left, std::string right); NerdCore::VAR operator* (NerdCore::VAR _left, const char* right); NerdCore::VAR operator- (NerdCore::VAR _left, int right); NerdCore::VAR operator- (NerdCore::VAR _left, double right); NerdCore::VAR operator- (NerdCore::VAR _left, std::string right); NerdCore::VAR operator- (NerdCore::VAR _left, const char* right); NerdCore::VAR operator/ (NerdCore::VAR _left, int right); NerdCore::VAR operator/ (NerdCore::VAR _left, double right); NerdCore::VAR operator/ (NerdCore::VAR _left, std::string right); NerdCore::VAR operator/ (NerdCore::VAR _left, const char* right); NerdCore::VAR operator% (NerdCore::VAR _left, int right); NerdCore::VAR operator% (NerdCore::VAR _left, double right); NerdCore::VAR operator% (NerdCore::VAR _left, std::string right); NerdCore::VAR operator% (NerdCore::VAR _left, const char* right); NerdCore::VAR operator|| (NerdCore::VAR _left, int right); NerdCore::VAR operator|| (NerdCore::VAR _left, double right); NerdCore::VAR operator|| (NerdCore::VAR _left, std::string right); NerdCore::VAR operator|| (NerdCore::VAR _left, const char* right); NerdCore::VAR operator== (NerdCore::VAR _left, int right); NerdCore::VAR operator== (NerdCore::VAR _left, double right); NerdCore::VAR operator== (NerdCore::VAR _left, std::string right); NerdCore::VAR operator== (NerdCore::VAR _left, const char* right); NerdCore::VAR operator!= (NerdCore::VAR _left, int right); NerdCore::VAR operator!= (NerdCore::VAR _left, double right); NerdCore::VAR operator!= (NerdCore::VAR _left, std::string right); NerdCore::VAR operator!= (NerdCore::VAR _left, const char* right); NerdCore::VAR operator| (NerdCore::VAR _left, int right); NerdCore::VAR operator| (NerdCore::VAR _left, double right); NerdCore::VAR operator| (NerdCore::VAR _left, std::string right); NerdCore::VAR operator| (NerdCore::VAR _left, const char* right); NerdCore::VAR operator^ (NerdCore::VAR _left, int right); NerdCore::VAR operator^ (NerdCore::VAR _left, double right); NerdCore::VAR operator^ (NerdCore::VAR _left, std::string right); NerdCore::VAR operator^ (NerdCore::VAR _left, const char* right); NerdCore::VAR operator& (NerdCore::VAR _left, int right); NerdCore::VAR operator& (NerdCore::VAR _left, double right); NerdCore::VAR operator& (NerdCore::VAR _left, std::string right); NerdCore::VAR operator& (NerdCore::VAR _left, const char* right); NerdCore::VAR operator<< (NerdCore::VAR _left, int right); NerdCore::VAR operator<< (NerdCore::VAR _left, double right); NerdCore::VAR operator<< (NerdCore::VAR _left, std::string right); NerdCore::VAR operator<< (NerdCore::VAR _left, const char* right); NerdCore::VAR operator>> (NerdCore::VAR _left, int right); NerdCore::VAR operator>> (NerdCore::VAR _left, double right); NerdCore::VAR operator>> (NerdCore::VAR _left, std::string right); NerdCore::VAR operator>> (NerdCore::VAR _left, const char* right); ================================================ FILE: self/compiler/native/nerdcore/src/stdfn.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ namespace NerdCore::Functions { NerdCore::VAR println() { #ifndef __NERD_ENV_ARDUINO std::cout << std::endl; #endif return NerdCore::Global::null; } NerdCore::VAR println(NerdCore::VAR _var) { #ifndef __NERD_ENV_ARDUINO std::cout << _var << std::endl; #endif return NerdCore::Global::null; } NerdCore::VAR print() { return NerdCore::Global::null; } NerdCore::VAR print(NerdCore::VAR _var) { #ifndef __NERD_ENV_ARDUINO std::cout << _var; #endif return NerdCore::Global::null; } } // no namespace NerdCore::VAR length_of(NerdCore::VAR _var) { switch( _var.type) { case NerdCore::Enum::Type::Null: return 0; break; case NerdCore::Enum::Type::Boolean: return 1; break; case NerdCore::Enum::Type::Number: return 1; break; case NerdCore::Enum::Type::String: return (double)((std::string)_var).size(); break; case NerdCore::Enum::Type::Array: return (double)((NerdCore::Class::Array*)_var.data.ptr)->Size(); break; case NerdCore::Enum::Type::FixedArray: return (double)((NerdCore::Class::FixedArray*)_var.data.ptr)->length; break; case NerdCore::Enum::Type::Object: return (double)((NerdCore::Class::Object*)_var.data.ptr)->Size(); break; case NerdCore::Enum::Type::Native: return (double)((NerdCore::Class::Native*)_var.data.ptr)->length; break; default: return 0; break; } return 0; } NerdCore::VAR size_of(NerdCore::VAR _var) { return (double)sizeof(_var); } ================================================ FILE: self/compiler/native/nerdcore/src/stdfn_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ namespace NerdCore::Functions { NerdCore::VAR println(); NerdCore::VAR println(NerdCore::VAR _var); NerdCore::VAR print(); NerdCore::VAR print(NerdCore::VAR _var); } // no namespace NerdCore::VAR length_of(NerdCore::VAR _var); NerdCore::VAR size_of(NerdCore::VAR _var); ================================================ FILE: self/compiler/native/nerdcore/src/tsl/robin_growth_policy.h ================================================ /** * MIT License * * Copyright (c) 2017 Thibaut Goetghebuer-Planchon * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifndef TSL_ROBIN_GROWTH_POLICY_H #define TSL_ROBIN_GROWTH_POLICY_H #include #include #include #include #include #include #include #include #include #include #ifdef TSL_DEBUG #define tsl_rh_assert(expr) assert(expr) #else #define tsl_rh_assert(expr) (static_cast(0)) #endif /** * If exceptions are enabled, throw the exception passed in parameter, otherwise * call std::terminate. */ #if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || \ (defined(_MSC_VER) && defined(_CPPUNWIND))) && \ !defined(TSL_NO_EXCEPTIONS) #define TSL_RH_THROW_OR_TERMINATE(ex, msg) throw ex(msg) #else #define TSL_RH_NO_EXCEPTIONS #ifdef TSL_DEBUG #include #define TSL_RH_THROW_OR_TERMINATE(ex, msg) \ do { \ std::cerr << msg << std::endl; \ std::terminate(); \ } while (0) #else #define TSL_RH_THROW_OR_TERMINATE(ex, msg) std::terminate() #endif #endif #if defined(__GNUC__) || defined(__clang__) #define TSL_RH_LIKELY(exp) (__builtin_expect(!!(exp), true)) #else #define TSL_RH_LIKELY(exp) (exp) #endif #define TSL_RH_UNUSED(x) static_cast(x) namespace tsl { namespace rh { /** * Grow the hash table by a factor of GrowthFactor keeping the bucket count to a * power of two. It allows the table to use a mask operation instead of a modulo * operation to map a hash to a bucket. * * GrowthFactor must be a power of two >= 2. */ template class power_of_two_growth_policy { public: /** * Called on the hash table creation and on rehash. The number of buckets for * the table is passed in parameter. This number is a minimum, the policy may * update this value with a higher value if needed (but not lower). * * If 0 is given, min_bucket_count_in_out must still be 0 after the policy * creation and bucket_for_hash must always return 0 in this case. */ explicit power_of_two_growth_policy(std::size_t& min_bucket_count_in_out) { if (min_bucket_count_in_out > max_bucket_count()) { TSL_RH_THROW_OR_TERMINATE(std::length_error, "The hash table exceeds its maximum size."); } if (min_bucket_count_in_out > 0) { min_bucket_count_in_out = round_up_to_power_of_two(min_bucket_count_in_out); m_mask = min_bucket_count_in_out - 1; } else { m_mask = 0; } } /** * Return the bucket [0, bucket_count()) to which the hash belongs. * If bucket_count() is 0, it must always return 0. */ std::size_t bucket_for_hash(std::size_t hash) const noexcept { return hash & m_mask; } /** * Return the number of buckets that should be used on next growth. */ std::size_t next_bucket_count() const { if ((m_mask + 1) > max_bucket_count() / GrowthFactor) { TSL_RH_THROW_OR_TERMINATE(std::length_error, "The hash table exceeds its maximum size."); } return (m_mask + 1) * GrowthFactor; } /** * Return the maximum number of buckets supported by the policy. */ std::size_t max_bucket_count() const { // Largest power of two. return (std::numeric_limits::max() / 2) + 1; } /** * Reset the growth policy as if it was created with a bucket count of 0. * After a clear, the policy must always return 0 when bucket_for_hash is * called. */ void clear() noexcept { m_mask = 0; } private: static std::size_t round_up_to_power_of_two(std::size_t value) { if (is_power_of_two(value)) { return value; } if (value == 0) { return 1; } --value; for (std::size_t i = 1; i < sizeof(std::size_t) * CHAR_BIT; i *= 2) { value |= value >> i; } return value + 1; } static constexpr bool is_power_of_two(std::size_t value) { return value != 0 && (value & (value - 1)) == 0; } protected: static_assert(is_power_of_two(GrowthFactor) && GrowthFactor >= 2, "GrowthFactor must be a power of two >= 2."); std::size_t m_mask; }; /** * Grow the hash table by GrowthFactor::num / GrowthFactor::den and use a modulo * to map a hash to a bucket. Slower but it can be useful if you want a slower * growth. */ template > class mod_growth_policy { public: explicit mod_growth_policy(std::size_t& min_bucket_count_in_out) { if (min_bucket_count_in_out > max_bucket_count()) { TSL_RH_THROW_OR_TERMINATE(std::length_error, "The hash table exceeds its maximum size."); } if (min_bucket_count_in_out > 0) { m_mod = min_bucket_count_in_out; } else { m_mod = 1; } } std::size_t bucket_for_hash(std::size_t hash) const noexcept { return hash % m_mod; } std::size_t next_bucket_count() const { if (m_mod == max_bucket_count()) { TSL_RH_THROW_OR_TERMINATE(std::length_error, "The hash table exceeds its maximum size."); } const double next_bucket_count = std::ceil(double(m_mod) * REHASH_SIZE_MULTIPLICATION_FACTOR); if (!std::isnormal(next_bucket_count)) { TSL_RH_THROW_OR_TERMINATE(std::length_error, "The hash table exceeds its maximum size."); } if (next_bucket_count > double(max_bucket_count())) { return max_bucket_count(); } else { return std::size_t(next_bucket_count); } } std::size_t max_bucket_count() const { return MAX_BUCKET_COUNT; } void clear() noexcept { m_mod = 1; } private: static constexpr double REHASH_SIZE_MULTIPLICATION_FACTOR = 1.0 * GrowthFactor::num / GrowthFactor::den; static const std::size_t MAX_BUCKET_COUNT = std::size_t(double(std::numeric_limits::max() / REHASH_SIZE_MULTIPLICATION_FACTOR)); static_assert(REHASH_SIZE_MULTIPLICATION_FACTOR >= 1.1, "Growth factor should be >= 1.1."); std::size_t m_mod; }; namespace detail { #if SIZE_MAX >= ULLONG_MAX #define TSL_RH_NB_PRIMES 51 #elif SIZE_MAX >= ULONG_MAX #define TSL_RH_NB_PRIMES 40 #else #define TSL_RH_NB_PRIMES 23 #endif static constexpr const std::array PRIMES = {{ 1u, 5u, 17u, 29u, 37u, 53u, 67u, 79u, 97u, 131u, 193u, 257u, 389u, 521u, 769u, 1031u, 1543u, 2053u, 3079u, 6151u, 12289u, 24593u, 49157u, #if SIZE_MAX >= ULONG_MAX 98317ul, 196613ul, 393241ul, 786433ul, 1572869ul, 3145739ul, 6291469ul, 12582917ul, 25165843ul, 50331653ul, 100663319ul, 201326611ul, 402653189ul, 805306457ul, 1610612741ul, 3221225473ul, 4294967291ul, #endif #if SIZE_MAX >= ULLONG_MAX 6442450939ull, 12884901893ull, 25769803751ull, 51539607551ull, 103079215111ull, 206158430209ull, 412316860441ull, 824633720831ull, 1649267441651ull, 3298534883309ull, 6597069766657ull, #endif }}; template static constexpr std::size_t mod(std::size_t hash) { return hash % PRIMES[IPrime]; } // MOD_PRIME[iprime](hash) returns hash % PRIMES[iprime]. This table allows for // faster modulo as the compiler can optimize the modulo code better with a // constant known at the compilation. static constexpr const std::array MOD_PRIME = {{ &mod<0>, &mod<1>, &mod<2>, &mod<3>, &mod<4>, &mod<5>, &mod<6>, &mod<7>, &mod<8>, &mod<9>, &mod<10>, &mod<11>, &mod<12>, &mod<13>, &mod<14>, &mod<15>, &mod<16>, &mod<17>, &mod<18>, &mod<19>, &mod<20>, &mod<21>, &mod<22>, #if SIZE_MAX >= ULONG_MAX &mod<23>, &mod<24>, &mod<25>, &mod<26>, &mod<27>, &mod<28>, &mod<29>, &mod<30>, &mod<31>, &mod<32>, &mod<33>, &mod<34>, &mod<35>, &mod<36>, &mod<37>, &mod<38>, &mod<39>, #endif #if SIZE_MAX >= ULLONG_MAX &mod<40>, &mod<41>, &mod<42>, &mod<43>, &mod<44>, &mod<45>, &mod<46>, &mod<47>, &mod<48>, &mod<49>, &mod<50>, #endif }}; } // namespace detail /** * Grow the hash table by using prime numbers as bucket count. Slower than * tsl::rh::power_of_two_growth_policy in general but will probably distribute * the values around better in the buckets with a poor hash function. * * To allow the compiler to optimize the modulo operation, a lookup table is * used with constant primes numbers. * * With a switch the code would look like: * \code * switch(iprime) { // iprime is the current prime of the hash table * case 0: hash % 5ul; * break; * case 1: hash % 17ul; * break; * case 2: hash % 29ul; * break; * ... * } * \endcode * * Due to the constant variable in the modulo the compiler is able to optimize * the operation by a series of multiplications, substractions and shifts. * * The 'hash % 5' could become something like 'hash - (hash * 0xCCCCCCCD) >> 34) * * 5' in a 64 bits environment. */ class prime_growth_policy { public: explicit prime_growth_policy(std::size_t& min_bucket_count_in_out) { auto it_prime = std::lower_bound( detail::PRIMES.begin(), detail::PRIMES.end(), min_bucket_count_in_out); if (it_prime == detail::PRIMES.end()) { TSL_RH_THROW_OR_TERMINATE(std::length_error, "The hash table exceeds its maximum size."); } m_iprime = static_cast( std::distance(detail::PRIMES.begin(), it_prime)); if (min_bucket_count_in_out > 0) { min_bucket_count_in_out = *it_prime; } else { min_bucket_count_in_out = 0; } } std::size_t bucket_for_hash(std::size_t hash) const noexcept { return detail::MOD_PRIME[m_iprime](hash); } std::size_t next_bucket_count() const { if (m_iprime + 1 >= detail::PRIMES.size()) { TSL_RH_THROW_OR_TERMINATE(std::length_error, "The hash table exceeds its maximum size."); } return detail::PRIMES[m_iprime + 1]; } std::size_t max_bucket_count() const { return detail::PRIMES.back(); } void clear() noexcept { m_iprime = 0; } private: unsigned int m_iprime; static_assert(std::numeric_limits::max() >= detail::PRIMES.size(), "The type of m_iprime is not big enough."); }; } // namespace rh } // namespace tsl #endif ================================================ FILE: self/compiler/native/nerdcore/src/tsl/robin_hash.h ================================================ /** * MIT License * * Copyright (c) 2017 Thibaut Goetghebuer-Planchon * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifndef TSL_ROBIN_HASH_H #define TSL_ROBIN_HASH_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "robin_growth_policy.h" namespace tsl { namespace detail_robin_hash { template struct make_void { using type = void; }; template struct has_is_transparent : std::false_type {}; template struct has_is_transparent::type> : std::true_type {}; template struct is_power_of_two_policy : std::false_type {}; template struct is_power_of_two_policy> : std::true_type {}; // Only available in C++17, we need to be compatible with C++11 template const T& clamp(const T& v, const T& lo, const T& hi) { return std::min(hi, std::max(lo, v)); } template static T numeric_cast(U value, const char* error_message = "numeric_cast() failed.") { T ret = static_cast(value); if (static_cast(ret) != value) { TSL_RH_THROW_OR_TERMINATE(std::runtime_error, error_message); } const bool is_same_signedness = (std::is_unsigned::value && std::is_unsigned::value) || (std::is_signed::value && std::is_signed::value); if (!is_same_signedness && (ret < T{}) != (value < U{})) { TSL_RH_THROW_OR_TERMINATE(std::runtime_error, error_message); } return ret; } template static T deserialize_value(Deserializer& deserializer) { // MSVC < 2017 is not conformant, circumvent the problem by removing the // template keyword #if defined(_MSC_VER) && _MSC_VER < 1910 return deserializer.Deserializer::operator()(); #else return deserializer.Deserializer::template operator()(); #endif } /** * Fixed size type used to represent size_type values on serialization. Need to * be big enough to represent a std::size_t on 32 and 64 bits platforms, and * must be the same size on both platforms. */ using slz_size_type = std::uint64_t; static_assert(std::numeric_limits::max() >= std::numeric_limits::max(), "slz_size_type must be >= std::size_t"); using truncated_hash_type = std::uint32_t; /** * Helper class that stores a truncated hash if StoreHash is true and nothing * otherwise. */ template class bucket_entry_hash { public: bool bucket_hash_equal(std::size_t /*hash*/) const noexcept { return true; } truncated_hash_type truncated_hash() const noexcept { return 0; } protected: void set_hash(truncated_hash_type /*hash*/) noexcept {} }; template <> class bucket_entry_hash { public: bool bucket_hash_equal(std::size_t hash) const noexcept { return m_hash == truncated_hash_type(hash); } truncated_hash_type truncated_hash() const noexcept { return m_hash; } protected: void set_hash(truncated_hash_type hash) noexcept { m_hash = truncated_hash_type(hash); } private: truncated_hash_type m_hash; }; /** * Each bucket entry has: * - A value of type `ValueType`. * - An integer to store how far the value of the bucket, if any, is from its * ideal bucket (ex: if the current bucket 5 has the value 'foo' and * `hash('foo') % nb_buckets` == 3, `dist_from_ideal_bucket()` will return 2 as * the current value of the bucket is two buckets away from its ideal bucket) If * there is no value in the bucket (i.e. `empty()` is true) * `dist_from_ideal_bucket()` will be < 0. * - A marker which tells us if the bucket is the last bucket of the bucket * array (useful for the iterator of the hash table). * - If `StoreHash` is true, 32 bits of the hash of the value, if any, are also * stored in the bucket. If the size of the hash is more than 32 bits, it is * truncated. We don't store the full hash as storing the hash is a potential * opportunity to use the unused space due to the alignment of the bucket_entry * structure. We can thus potentially store the hash without any extra space * (which would not be possible with 64 bits of the hash). */ template class bucket_entry : public bucket_entry_hash { using bucket_hash = bucket_entry_hash; public: using value_type = ValueType; using distance_type = std::int16_t; bucket_entry() noexcept : bucket_hash(), m_dist_from_ideal_bucket(EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET), m_last_bucket(false) { tsl_rh_assert(empty()); } bucket_entry(bool last_bucket) noexcept : bucket_hash(), m_dist_from_ideal_bucket(EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET), m_last_bucket(last_bucket) { tsl_rh_assert(empty()); } bucket_entry(const bucket_entry& other) noexcept( std::is_nothrow_copy_constructible::value) : bucket_hash(other), m_dist_from_ideal_bucket(EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET), m_last_bucket(other.m_last_bucket) { if (!other.empty()) { ::new (static_cast(std::addressof(m_value))) value_type(other.value()); m_dist_from_ideal_bucket = other.m_dist_from_ideal_bucket; } tsl_rh_assert(empty() == other.empty()); } /** * Never really used, but still necessary as we must call resize on an empty * `std::vector`. and we need to support move-only types. See * robin_hash constructor for details. */ bucket_entry(bucket_entry&& other) noexcept( std::is_nothrow_move_constructible::value) : bucket_hash(std::move(other)), m_dist_from_ideal_bucket(EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET), m_last_bucket(other.m_last_bucket) { if (!other.empty()) { ::new (static_cast(std::addressof(m_value))) value_type(std::move(other.value())); m_dist_from_ideal_bucket = other.m_dist_from_ideal_bucket; } tsl_rh_assert(empty() == other.empty()); } bucket_entry& operator=(const bucket_entry& other) noexcept( std::is_nothrow_copy_constructible::value) { if (this != &other) { clear(); bucket_hash::operator=(other); if (!other.empty()) { ::new (static_cast(std::addressof(m_value))) value_type(other.value()); } m_dist_from_ideal_bucket = other.m_dist_from_ideal_bucket; m_last_bucket = other.m_last_bucket; } return *this; } bucket_entry& operator=(bucket_entry&&) = delete; ~bucket_entry() noexcept { clear(); } void clear() noexcept { if (!empty()) { destroy_value(); m_dist_from_ideal_bucket = EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET; } } bool empty() const noexcept { return m_dist_from_ideal_bucket == EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET; } value_type& value() noexcept { tsl_rh_assert(!empty()); #if defined(__cplusplus) && __cplusplus >= 201703L return *std::launder( reinterpret_cast(std::addressof(m_value))); #else return *reinterpret_cast(std::addressof(m_value)); #endif } const value_type& value() const noexcept { tsl_rh_assert(!empty()); #if defined(__cplusplus) && __cplusplus >= 201703L return *std::launder( reinterpret_cast(std::addressof(m_value))); #else return *reinterpret_cast(std::addressof(m_value)); #endif } distance_type dist_from_ideal_bucket() const noexcept { return m_dist_from_ideal_bucket; } bool last_bucket() const noexcept { return m_last_bucket; } void set_as_last_bucket() noexcept { m_last_bucket = true; } template void set_value_of_empty_bucket(distance_type dist_from_ideal_bucket, truncated_hash_type hash, Args&&... value_type_args) { tsl_rh_assert(dist_from_ideal_bucket >= 0); tsl_rh_assert(empty()); ::new (static_cast(std::addressof(m_value))) value_type(std::forward(value_type_args)...); this->set_hash(hash); m_dist_from_ideal_bucket = dist_from_ideal_bucket; tsl_rh_assert(!empty()); } void swap_with_value_in_bucket(distance_type& dist_from_ideal_bucket, truncated_hash_type& hash, value_type& value) { tsl_rh_assert(!empty()); tsl_rh_assert(dist_from_ideal_bucket > m_dist_from_ideal_bucket); using std::swap; swap(value, this->value()); swap(dist_from_ideal_bucket, m_dist_from_ideal_bucket); if (StoreHash) { const truncated_hash_type tmp_hash = this->truncated_hash(); this->set_hash(hash); hash = tmp_hash; } else { // Avoid warning of unused variable if StoreHash is false TSL_RH_UNUSED(hash); } } static truncated_hash_type truncate_hash(std::size_t hash) noexcept { return truncated_hash_type(hash); } private: void destroy_value() noexcept { tsl_rh_assert(!empty()); value().~value_type(); } public: static const distance_type EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET = -1; static const distance_type DIST_FROM_IDEAL_BUCKET_LIMIT = 4096; static_assert(DIST_FROM_IDEAL_BUCKET_LIMIT <= std::numeric_limits::max() - 1, "DIST_FROM_IDEAL_BUCKET_LIMIT must be <= " "std::numeric_limits::max() - 1."); private: using storage = typename std::aligned_storage::type; distance_type m_dist_from_ideal_bucket; bool m_last_bucket; storage m_value; }; /** * Internal common class used by `robin_map` and `robin_set`. * * ValueType is what will be stored by `robin_hash` (usually `std::pair` * for map and `Key` for set). * * `KeySelect` should be a `FunctionObject` which takes a `ValueType` in * parameter and returns a reference to the key. * * `ValueSelect` should be a `FunctionObject` which takes a `ValueType` in * parameter and returns a reference to the value. `ValueSelect` should be void * if there is no value (in a set for example). * * The strong exception guarantee only holds if the expression * `std::is_nothrow_swappable::value && * std::is_nothrow_move_constructible::value` is true. * * Behaviour is undefined if the destructor of `ValueType` throws. */ template class robin_hash : private Hash, private KeyEqual, private GrowthPolicy { private: template using has_mapped_type = typename std::integral_constant::value>; static_assert( noexcept(std::declval().bucket_for_hash(std::size_t(0))), "GrowthPolicy::bucket_for_hash must be noexcept."); static_assert(noexcept(std::declval().clear()), "GrowthPolicy::clear must be noexcept."); public: template class robin_iterator; using key_type = typename KeySelect::key_type; using value_type = ValueType; using size_type = std::size_t; using difference_type = std::ptrdiff_t; using hasher = Hash; using key_equal = KeyEqual; using allocator_type = Allocator; using reference = value_type&; using const_reference = const value_type&; using pointer = value_type*; using const_pointer = const value_type*; using iterator = robin_iterator; using const_iterator = robin_iterator; private: /** * Either store the hash because we are asked by the `StoreHash` template * parameter or store the hash because it doesn't cost us anything in size and * can be used to speed up rehash. */ static constexpr bool STORE_HASH = StoreHash || ((sizeof(tsl::detail_robin_hash::bucket_entry) == sizeof(tsl::detail_robin_hash::bucket_entry)) && (sizeof(std::size_t) == sizeof(truncated_hash_type) || is_power_of_two_policy::value) && // Don't store the hash for primitive types with default hash. (!std::is_arithmetic::value || !std::is_same>::value)); /** * Only use the stored hash on lookup if we are explicitly asked. We are not * sure how slow the KeyEqual operation is. An extra comparison may slow * things down with a fast KeyEqual. */ static constexpr bool USE_STORED_HASH_ON_LOOKUP = StoreHash; /** * We can only use the hash on rehash if the size of the hash type is the same * as the stored one or if we use a power of two modulo. In the case of the * power of two modulo, we just mask the least significant bytes, we just have * to check that the truncated_hash_type didn't truncated more bytes. */ static bool USE_STORED_HASH_ON_REHASH(size_type bucket_count) { if (STORE_HASH && sizeof(std::size_t) == sizeof(truncated_hash_type)) { TSL_RH_UNUSED(bucket_count); return true; } else if (STORE_HASH && is_power_of_two_policy::value) { return bucket_count == 0 || (bucket_count - 1) <= std::numeric_limits::max(); } else { TSL_RH_UNUSED(bucket_count); return false; } } using bucket_entry = tsl::detail_robin_hash::bucket_entry; using distance_type = typename bucket_entry::distance_type; using buckets_allocator = typename std::allocator_traits< allocator_type>::template rebind_alloc; using buckets_container_type = std::vector; public: /** * The 'operator*()' and 'operator->()' methods return a const reference and * const pointer respectively to the stored value type. * * In case of a map, to get a mutable reference to the value associated to a * key (the '.second' in the stored pair), you have to call 'value()'. * * The main reason for this is that if we returned a `std::pair&` * instead of a `const std::pair&`, the user may modify the key which * will put the map in a undefined state. */ template class robin_iterator { friend class robin_hash; private: using bucket_entry_ptr = typename std::conditional::type; robin_iterator(bucket_entry_ptr bucket) noexcept : m_bucket(bucket) {} public: using iterator_category = std::forward_iterator_tag; using value_type = const typename robin_hash::value_type; using difference_type = std::ptrdiff_t; using reference = value_type&; using pointer = value_type*; robin_iterator() noexcept {} // Copy constructor from iterator to const_iterator. template ::type* = nullptr> robin_iterator(const robin_iterator& other) noexcept : m_bucket(other.m_bucket) {} robin_iterator(const robin_iterator& other) = default; robin_iterator(robin_iterator&& other) = default; robin_iterator& operator=(const robin_iterator& other) = default; robin_iterator& operator=(robin_iterator&& other) = default; const typename robin_hash::key_type& key() const { return KeySelect()(m_bucket->value()); } template ::value && IsConst>::type* = nullptr> const typename U::value_type& value() const { return U()(m_bucket->value()); } template ::value && !IsConst>::type* = nullptr> typename U::value_type& value() const { return U()(m_bucket->value()); } reference operator*() const { return m_bucket->value(); } pointer operator->() const { return std::addressof(m_bucket->value()); } robin_iterator& operator++() { while (true) { if (m_bucket->last_bucket()) { ++m_bucket; return *this; } ++m_bucket; if (!m_bucket->empty()) { return *this; } } } robin_iterator operator++(int) { robin_iterator tmp(*this); ++*this; return tmp; } friend bool operator==(const robin_iterator& lhs, const robin_iterator& rhs) { return lhs.m_bucket == rhs.m_bucket; } friend bool operator!=(const robin_iterator& lhs, const robin_iterator& rhs) { return !(lhs == rhs); } private: bucket_entry_ptr m_bucket; }; public: #if defined(__cplusplus) && __cplusplus >= 201402L robin_hash(size_type bucket_count, const Hash& hash, const KeyEqual& equal, const Allocator& alloc, float min_load_factor = DEFAULT_MIN_LOAD_FACTOR, float max_load_factor = DEFAULT_MAX_LOAD_FACTOR) : Hash(hash), KeyEqual(equal), GrowthPolicy(bucket_count), m_buckets_data(bucket_count, alloc), m_buckets(m_buckets_data.empty() ? static_empty_bucket_ptr() : m_buckets_data.data()), m_bucket_count(bucket_count), m_nb_elements(0), m_grow_on_next_insert(false), m_try_shrink_on_next_insert(false) { if (bucket_count > max_bucket_count()) { TSL_RH_THROW_OR_TERMINATE(std::length_error, "The map exceeds its maximum bucket count."); } if (m_bucket_count > 0) { tsl_rh_assert(!m_buckets_data.empty()); m_buckets_data.back().set_as_last_bucket(); } this->min_load_factor(min_load_factor); this->max_load_factor(max_load_factor); } #else /** * C++11 doesn't support the creation of a std::vector with a custom allocator * and 'count' default-inserted elements. The needed contructor `explicit * vector(size_type count, const Allocator& alloc = Allocator());` is only * available in C++14 and later. We thus must resize after using the * `vector(const Allocator& alloc)` constructor. * * We can't use `vector(size_type count, const T& value, const Allocator& * alloc)` as it requires the value T to be copyable. */ robin_hash(size_type bucket_count, const Hash& hash, const KeyEqual& equal, const Allocator& alloc, float min_load_factor = DEFAULT_MIN_LOAD_FACTOR, float max_load_factor = DEFAULT_MAX_LOAD_FACTOR) : Hash(hash), KeyEqual(equal), GrowthPolicy(bucket_count), m_buckets_data(alloc), m_buckets(static_empty_bucket_ptr()), m_bucket_count(bucket_count), m_nb_elements(0), m_grow_on_next_insert(false), m_try_shrink_on_next_insert(false) { if (bucket_count > max_bucket_count()) { TSL_RH_THROW_OR_TERMINATE(std::length_error, "The map exceeds its maximum bucket count."); } if (m_bucket_count > 0) { m_buckets_data.resize(m_bucket_count); m_buckets = m_buckets_data.data(); tsl_rh_assert(!m_buckets_data.empty()); m_buckets_data.back().set_as_last_bucket(); } this->min_load_factor(min_load_factor); this->max_load_factor(max_load_factor); } #endif robin_hash(const robin_hash& other) : Hash(other), KeyEqual(other), GrowthPolicy(other), m_buckets_data(other.m_buckets_data), m_buckets(m_buckets_data.empty() ? static_empty_bucket_ptr() : m_buckets_data.data()), m_bucket_count(other.m_bucket_count), m_nb_elements(other.m_nb_elements), m_load_threshold(other.m_load_threshold), m_min_load_factor(other.m_min_load_factor), m_max_load_factor(other.m_max_load_factor), m_grow_on_next_insert(other.m_grow_on_next_insert), m_try_shrink_on_next_insert(other.m_try_shrink_on_next_insert) {} robin_hash(robin_hash&& other) noexcept( std::is_nothrow_move_constructible< Hash>::value&& std::is_nothrow_move_constructible::value&& std::is_nothrow_move_constructible::value&& std::is_nothrow_move_constructible::value) : Hash(std::move(static_cast(other))), KeyEqual(std::move(static_cast(other))), GrowthPolicy(std::move(static_cast(other))), m_buckets_data(std::move(other.m_buckets_data)), m_buckets(m_buckets_data.empty() ? static_empty_bucket_ptr() : m_buckets_data.data()), m_bucket_count(other.m_bucket_count), m_nb_elements(other.m_nb_elements), m_load_threshold(other.m_load_threshold), m_min_load_factor(other.m_min_load_factor), m_max_load_factor(other.m_max_load_factor), m_grow_on_next_insert(other.m_grow_on_next_insert), m_try_shrink_on_next_insert(other.m_try_shrink_on_next_insert) { other.clear_and_shrink(); } robin_hash& operator=(const robin_hash& other) { if (&other != this) { Hash::operator=(other); KeyEqual::operator=(other); GrowthPolicy::operator=(other); m_buckets_data = other.m_buckets_data; m_buckets = m_buckets_data.empty() ? static_empty_bucket_ptr() : m_buckets_data.data(); m_bucket_count = other.m_bucket_count; m_nb_elements = other.m_nb_elements; m_load_threshold = other.m_load_threshold; m_min_load_factor = other.m_min_load_factor; m_max_load_factor = other.m_max_load_factor; m_grow_on_next_insert = other.m_grow_on_next_insert; m_try_shrink_on_next_insert = other.m_try_shrink_on_next_insert; } return *this; } robin_hash& operator=(robin_hash&& other) { other.swap(*this); other.clear_and_shrink(); return *this; } allocator_type get_allocator() const { return m_buckets_data.get_allocator(); } /* * Iterators */ iterator begin() noexcept { std::size_t i = 0; while (i < m_bucket_count && m_buckets[i].empty()) { i++; } return iterator(m_buckets + i); } const_iterator begin() const noexcept { return cbegin(); } const_iterator cbegin() const noexcept { std::size_t i = 0; while (i < m_bucket_count && m_buckets[i].empty()) { i++; } return const_iterator(m_buckets + i); } iterator end() noexcept { return iterator(m_buckets + m_bucket_count); } const_iterator end() const noexcept { return cend(); } const_iterator cend() const noexcept { return const_iterator(m_buckets + m_bucket_count); } /* * Capacity */ bool empty() const noexcept { return m_nb_elements == 0; } size_type size() const noexcept { return m_nb_elements; } size_type max_size() const noexcept { return m_buckets_data.max_size(); } /* * Modifiers */ void clear() noexcept { if (m_min_load_factor > 0.0f) { clear_and_shrink(); } else { for (auto& bucket : m_buckets_data) { bucket.clear(); } m_nb_elements = 0; m_grow_on_next_insert = false; } } template std::pair insert(P&& value) { return insert_impl(KeySelect()(value), std::forward

(value)); } template iterator insert_hint(const_iterator hint, P&& value) { if (hint != cend() && compare_keys(KeySelect()(*hint), KeySelect()(value))) { return mutable_iterator(hint); } return insert(std::forward

(value)).first; } template void insert(InputIt first, InputIt last) { if (std::is_base_of< std::forward_iterator_tag, typename std::iterator_traits::iterator_category>::value) { const auto nb_elements_insert = std::distance(first, last); const size_type nb_free_buckets = m_load_threshold - size(); tsl_rh_assert(m_load_threshold >= size()); if (nb_elements_insert > 0 && nb_free_buckets < size_type(nb_elements_insert)) { reserve(size() + size_type(nb_elements_insert)); } } for (; first != last; ++first) { insert(*first); } } template std::pair insert_or_assign(K&& key, M&& obj) { auto it = try_emplace(std::forward(key), std::forward(obj)); if (!it.second) { it.first.value() = std::forward(obj); } return it; } template iterator insert_or_assign(const_iterator hint, K&& key, M&& obj) { if (hint != cend() && compare_keys(KeySelect()(*hint), key)) { auto it = mutable_iterator(hint); it.value() = std::forward(obj); return it; } return insert_or_assign(std::forward(key), std::forward(obj)).first; } template std::pair emplace(Args&&... args) { return insert(value_type(std::forward(args)...)); } template iterator emplace_hint(const_iterator hint, Args&&... args) { return insert_hint(hint, value_type(std::forward(args)...)); } template std::pair try_emplace(K&& key, Args&&... args) { return insert_impl(key, std::piecewise_construct, std::forward_as_tuple(std::forward(key)), std::forward_as_tuple(std::forward(args)...)); } template iterator try_emplace_hint(const_iterator hint, K&& key, Args&&... args) { if (hint != cend() && compare_keys(KeySelect()(*hint), key)) { return mutable_iterator(hint); } return try_emplace(std::forward(key), std::forward(args)...).first; } /** * Here to avoid `template size_type erase(const K& key)` being used * when we use an `iterator` instead of a `const_iterator`. */ iterator erase(iterator pos) { erase_from_bucket(pos); /** * Erase bucket used a backward shift after clearing the bucket. * Check if there is a new value in the bucket, if not get the next * non-empty. */ if (pos.m_bucket->empty()) { ++pos; } m_try_shrink_on_next_insert = true; return pos; } iterator erase(const_iterator pos) { return erase(mutable_iterator(pos)); } iterator erase(const_iterator first, const_iterator last) { if (first == last) { return mutable_iterator(first); } auto first_mutable = mutable_iterator(first); auto last_mutable = mutable_iterator(last); for (auto it = first_mutable.m_bucket; it != last_mutable.m_bucket; ++it) { if (!it->empty()) { it->clear(); m_nb_elements--; } } if (last_mutable == end()) { m_try_shrink_on_next_insert = true; return end(); } /* * Backward shift on the values which come after the deleted values. * We try to move the values closer to their ideal bucket. */ std::size_t icloser_bucket = static_cast(first_mutable.m_bucket - m_buckets); std::size_t ito_move_closer_value = static_cast(last_mutable.m_bucket - m_buckets); tsl_rh_assert(ito_move_closer_value > icloser_bucket); const std::size_t ireturn_bucket = ito_move_closer_value - std::min( ito_move_closer_value - icloser_bucket, std::size_t( m_buckets[ito_move_closer_value].dist_from_ideal_bucket())); while (ito_move_closer_value < m_bucket_count && m_buckets[ito_move_closer_value].dist_from_ideal_bucket() > 0) { icloser_bucket = ito_move_closer_value - std::min( ito_move_closer_value - icloser_bucket, std::size_t( m_buckets[ito_move_closer_value].dist_from_ideal_bucket())); tsl_rh_assert(m_buckets[icloser_bucket].empty()); const distance_type new_distance = distance_type( m_buckets[ito_move_closer_value].dist_from_ideal_bucket() - (ito_move_closer_value - icloser_bucket)); m_buckets[icloser_bucket].set_value_of_empty_bucket( new_distance, m_buckets[ito_move_closer_value].truncated_hash(), std::move(m_buckets[ito_move_closer_value].value())); m_buckets[ito_move_closer_value].clear(); ++icloser_bucket; ++ito_move_closer_value; } m_try_shrink_on_next_insert = true; return iterator(m_buckets + ireturn_bucket); } template size_type erase(const K& key) { return erase(key, hash_key(key)); } template size_type erase(const K& key, std::size_t hash) { auto it = find(key, hash); if (it != end()) { erase_from_bucket(it); m_try_shrink_on_next_insert = true; return 1; } else { return 0; } } void swap(robin_hash& other) { using std::swap; swap(static_cast(*this), static_cast(other)); swap(static_cast(*this), static_cast(other)); swap(static_cast(*this), static_cast(other)); swap(m_buckets_data, other.m_buckets_data); swap(m_buckets, other.m_buckets); swap(m_bucket_count, other.m_bucket_count); swap(m_nb_elements, other.m_nb_elements); swap(m_load_threshold, other.m_load_threshold); swap(m_min_load_factor, other.m_min_load_factor); swap(m_max_load_factor, other.m_max_load_factor); swap(m_grow_on_next_insert, other.m_grow_on_next_insert); swap(m_try_shrink_on_next_insert, other.m_try_shrink_on_next_insert); } /* * Lookup */ template ::value>::type* = nullptr> typename U::value_type& at(const K& key) { return at(key, hash_key(key)); } template ::value>::type* = nullptr> typename U::value_type& at(const K& key, std::size_t hash) { return const_cast( static_cast(this)->at(key, hash)); } template ::value>::type* = nullptr> const typename U::value_type& at(const K& key) const { return at(key, hash_key(key)); } template ::value>::type* = nullptr> const typename U::value_type& at(const K& key, std::size_t hash) const { auto it = find(key, hash); if (it != cend()) { return it.value(); } else { TSL_RH_THROW_OR_TERMINATE(std::out_of_range, "Couldn't find key."); } } template ::value>::type* = nullptr> typename U::value_type& operator[](K&& key) { return try_emplace(std::forward(key)).first.value(); } template size_type count(const K& key) const { return count(key, hash_key(key)); } template size_type count(const K& key, std::size_t hash) const { if (find(key, hash) != cend()) { return 1; } else { return 0; } } template iterator find(const K& key) { return find_impl(key, hash_key(key)); } template iterator find(const K& key, std::size_t hash) { return find_impl(key, hash); } template const_iterator find(const K& key) const { return find_impl(key, hash_key(key)); } template const_iterator find(const K& key, std::size_t hash) const { return find_impl(key, hash); } template bool contains(const K& key) const { return contains(key, hash_key(key)); } template bool contains(const K& key, std::size_t hash) const { return count(key, hash) != 0; } template std::pair equal_range(const K& key) { return equal_range(key, hash_key(key)); } template std::pair equal_range(const K& key, std::size_t hash) { iterator it = find(key, hash); return std::make_pair(it, (it == end()) ? it : std::next(it)); } template std::pair equal_range(const K& key) const { return equal_range(key, hash_key(key)); } template std::pair equal_range( const K& key, std::size_t hash) const { const_iterator it = find(key, hash); return std::make_pair(it, (it == cend()) ? it : std::next(it)); } /* * Bucket interface */ size_type bucket_count() const { return m_bucket_count; } size_type max_bucket_count() const { return std::min(GrowthPolicy::max_bucket_count(), m_buckets_data.max_size()); } /* * Hash policy */ float load_factor() const { if (bucket_count() == 0) { return 0; } return float(m_nb_elements) / float(bucket_count()); } float min_load_factor() const { return m_min_load_factor; } float max_load_factor() const { return m_max_load_factor; } void min_load_factor(float ml) { m_min_load_factor = clamp(ml, float(MINIMUM_MIN_LOAD_FACTOR), float(MAXIMUM_MIN_LOAD_FACTOR)); } void max_load_factor(float ml) { m_max_load_factor = clamp(ml, float(MINIMUM_MAX_LOAD_FACTOR), float(MAXIMUM_MAX_LOAD_FACTOR)); m_load_threshold = size_type(float(bucket_count()) * m_max_load_factor); tsl_rh_assert(bucket_count() == 0 || m_load_threshold < bucket_count()); } void rehash(size_type count_) { count_ = std::max(count_, size_type(std::ceil(float(size()) / max_load_factor()))); rehash_impl(count_); } void reserve(size_type count_) { rehash(size_type(std::ceil(float(count_) / max_load_factor()))); } /* * Observers */ hasher hash_function() const { return static_cast(*this); } key_equal key_eq() const { return static_cast(*this); } /* * Other */ iterator mutable_iterator(const_iterator pos) { return iterator(const_cast(pos.m_bucket)); } template void serialize(Serializer& serializer) const { serialize_impl(serializer); } template void deserialize(Deserializer& deserializer, bool hash_compatible) { deserialize_impl(deserializer, hash_compatible); } private: template std::size_t hash_key(const K& key) const { return Hash::operator()(key); } template bool compare_keys(const K1& key1, const K2& key2) const { return KeyEqual::operator()(key1, key2); } std::size_t bucket_for_hash(std::size_t hash) const { const std::size_t bucket = GrowthPolicy::bucket_for_hash(hash); tsl_rh_assert(bucket < m_bucket_count || (bucket == 0 && m_bucket_count == 0)); return bucket; } template ::value>::type* = nullptr> std::size_t next_bucket(std::size_t index) const noexcept { tsl_rh_assert(index < bucket_count()); return (index + 1) & this->m_mask; } template ::value>::type* = nullptr> std::size_t next_bucket(std::size_t index) const noexcept { tsl_rh_assert(index < bucket_count()); index++; return (index != bucket_count()) ? index : 0; } template iterator find_impl(const K& key, std::size_t hash) { return mutable_iterator( static_cast(this)->find(key, hash)); } template const_iterator find_impl(const K& key, std::size_t hash) const { std::size_t ibucket = bucket_for_hash(hash); distance_type dist_from_ideal_bucket = 0; while (dist_from_ideal_bucket <= m_buckets[ibucket].dist_from_ideal_bucket()) { if (TSL_RH_LIKELY( (!USE_STORED_HASH_ON_LOOKUP || m_buckets[ibucket].bucket_hash_equal(hash)) && compare_keys(KeySelect()(m_buckets[ibucket].value()), key))) { return const_iterator(m_buckets + ibucket); } ibucket = next_bucket(ibucket); dist_from_ideal_bucket++; } return cend(); } void erase_from_bucket(iterator pos) { pos.m_bucket->clear(); m_nb_elements--; /** * Backward shift, swap the empty bucket, previous_ibucket, with the values * on its right, ibucket, until we cross another empty bucket or if the * other bucket has a distance_from_ideal_bucket == 0. * * We try to move the values closer to their ideal bucket. */ std::size_t previous_ibucket = static_cast(pos.m_bucket - m_buckets); std::size_t ibucket = next_bucket(previous_ibucket); while (m_buckets[ibucket].dist_from_ideal_bucket() > 0) { tsl_rh_assert(m_buckets[previous_ibucket].empty()); const distance_type new_distance = distance_type(m_buckets[ibucket].dist_from_ideal_bucket() - 1); m_buckets[previous_ibucket].set_value_of_empty_bucket( new_distance, m_buckets[ibucket].truncated_hash(), std::move(m_buckets[ibucket].value())); m_buckets[ibucket].clear(); previous_ibucket = ibucket; ibucket = next_bucket(ibucket); } } template std::pair insert_impl(const K& key, Args&&... value_type_args) { const std::size_t hash = hash_key(key); std::size_t ibucket = bucket_for_hash(hash); distance_type dist_from_ideal_bucket = 0; while (dist_from_ideal_bucket <= m_buckets[ibucket].dist_from_ideal_bucket()) { if ((!USE_STORED_HASH_ON_LOOKUP || m_buckets[ibucket].bucket_hash_equal(hash)) && compare_keys(KeySelect()(m_buckets[ibucket].value()), key)) { return std::make_pair(iterator(m_buckets + ibucket), false); } ibucket = next_bucket(ibucket); dist_from_ideal_bucket++; } if (rehash_on_extreme_load()) { ibucket = bucket_for_hash(hash); dist_from_ideal_bucket = 0; while (dist_from_ideal_bucket <= m_buckets[ibucket].dist_from_ideal_bucket()) { ibucket = next_bucket(ibucket); dist_from_ideal_bucket++; } } if (m_buckets[ibucket].empty()) { m_buckets[ibucket].set_value_of_empty_bucket( dist_from_ideal_bucket, bucket_entry::truncate_hash(hash), std::forward(value_type_args)...); } else { insert_value(ibucket, dist_from_ideal_bucket, bucket_entry::truncate_hash(hash), std::forward(value_type_args)...); } m_nb_elements++; /* * The value will be inserted in ibucket in any case, either because it was * empty or by stealing the bucket (robin hood). */ return std::make_pair(iterator(m_buckets + ibucket), true); } template void insert_value(std::size_t ibucket, distance_type dist_from_ideal_bucket, truncated_hash_type hash, Args&&... value_type_args) { value_type value(std::forward(value_type_args)...); insert_value_impl(ibucket, dist_from_ideal_bucket, hash, value); } void insert_value(std::size_t ibucket, distance_type dist_from_ideal_bucket, truncated_hash_type hash, value_type&& value) { insert_value_impl(ibucket, dist_from_ideal_bucket, hash, value); } /* * We don't use `value_type&& value` as last argument due to a bug in MSVC * when `value_type` is a pointer, The compiler is not able to see the * difference between `std::string*` and `std::string*&&` resulting in a * compilation error. * * The `value` will be in a moved state at the end of the function. */ void insert_value_impl(std::size_t ibucket, distance_type dist_from_ideal_bucket, truncated_hash_type hash, value_type& value) { tsl_rh_assert(dist_from_ideal_bucket > m_buckets[ibucket].dist_from_ideal_bucket()); m_buckets[ibucket].swap_with_value_in_bucket(dist_from_ideal_bucket, hash, value); ibucket = next_bucket(ibucket); dist_from_ideal_bucket++; while (!m_buckets[ibucket].empty()) { if (dist_from_ideal_bucket > m_buckets[ibucket].dist_from_ideal_bucket()) { if (dist_from_ideal_bucket >= bucket_entry::DIST_FROM_IDEAL_BUCKET_LIMIT) { /** * The number of probes is really high, rehash the map on the next * insert. Difficult to do now as rehash may throw an exception. */ m_grow_on_next_insert = true; } m_buckets[ibucket].swap_with_value_in_bucket(dist_from_ideal_bucket, hash, value); } ibucket = next_bucket(ibucket); dist_from_ideal_bucket++; } m_buckets[ibucket].set_value_of_empty_bucket(dist_from_ideal_bucket, hash, std::move(value)); } void rehash_impl(size_type count_) { robin_hash new_table(count_, static_cast(*this), static_cast(*this), get_allocator(), m_min_load_factor, m_max_load_factor); tsl_rh_assert(size() <= new_table.m_load_threshold); const bool use_stored_hash = USE_STORED_HASH_ON_REHASH(new_table.bucket_count()); for (auto& bucket : m_buckets_data) { if (bucket.empty()) { continue; } const std::size_t hash = use_stored_hash ? bucket.truncated_hash() : new_table.hash_key(KeySelect()(bucket.value())); new_table.insert_value_on_rehash(new_table.bucket_for_hash(hash), 0, bucket_entry::truncate_hash(hash), std::move(bucket.value())); } new_table.m_nb_elements = m_nb_elements; new_table.swap(*this); } void clear_and_shrink() noexcept { GrowthPolicy::clear(); m_buckets_data.clear(); m_buckets = static_empty_bucket_ptr(); m_bucket_count = 0; m_nb_elements = 0; m_load_threshold = 0; m_grow_on_next_insert = false; m_try_shrink_on_next_insert = false; } void insert_value_on_rehash(std::size_t ibucket, distance_type dist_from_ideal_bucket, truncated_hash_type hash, value_type&& value) { while (true) { if (dist_from_ideal_bucket > m_buckets[ibucket].dist_from_ideal_bucket()) { if (m_buckets[ibucket].empty()) { m_buckets[ibucket].set_value_of_empty_bucket(dist_from_ideal_bucket, hash, std::move(value)); return; } else { m_buckets[ibucket].swap_with_value_in_bucket(dist_from_ideal_bucket, hash, value); } } dist_from_ideal_bucket++; ibucket = next_bucket(ibucket); } } /** * Grow the table if m_grow_on_next_insert is true or we reached the * max_load_factor. Shrink the table if m_try_shrink_on_next_insert is true * (an erase occurred) and we're below the min_load_factor. * * Return true if the table has been rehashed. */ bool rehash_on_extreme_load() { if (m_grow_on_next_insert || size() >= m_load_threshold) { rehash_impl(GrowthPolicy::next_bucket_count()); m_grow_on_next_insert = false; return true; } if (m_try_shrink_on_next_insert) { m_try_shrink_on_next_insert = false; if (m_min_load_factor != 0.0f && load_factor() < m_min_load_factor) { reserve(size() + 1); return true; } } return false; } template void serialize_impl(Serializer& serializer) const { const slz_size_type version = SERIALIZATION_PROTOCOL_VERSION; serializer(version); // Indicate if the truncated hash of each bucket is stored. Use a // std::int16_t instead of a bool to avoid the need for the serializer to // support an extra 'bool' type. const std::int16_t hash_stored_for_bucket = static_cast(STORE_HASH); serializer(hash_stored_for_bucket); const slz_size_type nb_elements = m_nb_elements; serializer(nb_elements); const slz_size_type bucket_count = m_buckets_data.size(); serializer(bucket_count); const float min_load_factor = m_min_load_factor; serializer(min_load_factor); const float max_load_factor = m_max_load_factor; serializer(max_load_factor); for (const bucket_entry& bucket : m_buckets_data) { if (bucket.empty()) { const std::int16_t empty_bucket = bucket_entry::EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET; serializer(empty_bucket); } else { const std::int16_t dist_from_ideal_bucket = bucket.dist_from_ideal_bucket(); serializer(dist_from_ideal_bucket); if (STORE_HASH) { const std::uint32_t truncated_hash = bucket.truncated_hash(); serializer(truncated_hash); } serializer(bucket.value()); } } } template void deserialize_impl(Deserializer& deserializer, bool hash_compatible) { tsl_rh_assert(m_buckets_data.empty()); // Current hash table must be empty const slz_size_type version = deserialize_value(deserializer); // For now we only have one version of the serialization protocol. // If it doesn't match there is a problem with the file. if (version != SERIALIZATION_PROTOCOL_VERSION) { TSL_RH_THROW_OR_TERMINATE(std::runtime_error, "Can't deserialize the ordered_map/set. " "The protocol version header is invalid."); } const bool hash_stored_for_bucket = deserialize_value(deserializer) ? true : false; if (hash_compatible && STORE_HASH != hash_stored_for_bucket) { TSL_RH_THROW_OR_TERMINATE( std::runtime_error, "Can't deserialize a map with a different StoreHash " "than the one used during the serialization when " "hash compatibility is used"); } const slz_size_type nb_elements = deserialize_value(deserializer); const slz_size_type bucket_count_ds = deserialize_value(deserializer); const float min_load_factor = deserialize_value(deserializer); const float max_load_factor = deserialize_value(deserializer); if (min_load_factor < MINIMUM_MIN_LOAD_FACTOR || min_load_factor > MAXIMUM_MIN_LOAD_FACTOR) { TSL_RH_THROW_OR_TERMINATE( std::runtime_error, "Invalid min_load_factor. Check that the serializer " "and deserializer support floats correctly as they " "can be converted implicitly to ints."); } if (max_load_factor < MINIMUM_MAX_LOAD_FACTOR || max_load_factor > MAXIMUM_MAX_LOAD_FACTOR) { TSL_RH_THROW_OR_TERMINATE( std::runtime_error, "Invalid max_load_factor. Check that the serializer " "and deserializer support floats correctly as they " "can be converted implicitly to ints."); } this->min_load_factor(min_load_factor); this->max_load_factor(max_load_factor); if (bucket_count_ds == 0) { tsl_rh_assert(nb_elements == 0); return; } if (!hash_compatible) { reserve(numeric_cast(nb_elements, "Deserialized nb_elements is too big.")); for (slz_size_type ibucket = 0; ibucket < bucket_count_ds; ibucket++) { const distance_type dist_from_ideal_bucket = deserialize_value(deserializer); if (dist_from_ideal_bucket != bucket_entry::EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET) { if (hash_stored_for_bucket) { TSL_RH_UNUSED(deserialize_value(deserializer)); } insert(deserialize_value(deserializer)); } } tsl_rh_assert(nb_elements == size()); } else { m_bucket_count = numeric_cast( bucket_count_ds, "Deserialized bucket_count is too big."); GrowthPolicy::operator=(GrowthPolicy(m_bucket_count)); // GrowthPolicy should not modify the bucket count we got from // deserialization if (m_bucket_count != bucket_count_ds) { TSL_RH_THROW_OR_TERMINATE(std::runtime_error, "The GrowthPolicy is not the same even " "though hash_compatible is true."); } m_nb_elements = numeric_cast( nb_elements, "Deserialized nb_elements is too big."); m_buckets_data.resize(m_bucket_count); m_buckets = m_buckets_data.data(); for (bucket_entry& bucket : m_buckets_data) { const distance_type dist_from_ideal_bucket = deserialize_value(deserializer); if (dist_from_ideal_bucket != bucket_entry::EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET) { truncated_hash_type truncated_hash = 0; if (hash_stored_for_bucket) { tsl_rh_assert(hash_stored_for_bucket); truncated_hash = deserialize_value(deserializer); } bucket.set_value_of_empty_bucket( dist_from_ideal_bucket, truncated_hash, deserialize_value(deserializer)); } } if (!m_buckets_data.empty()) { m_buckets_data.back().set_as_last_bucket(); } } } public: static const size_type DEFAULT_INIT_BUCKETS_SIZE = 0; static constexpr float DEFAULT_MAX_LOAD_FACTOR = 0.5f; static constexpr float MINIMUM_MAX_LOAD_FACTOR = 0.2f; static constexpr float MAXIMUM_MAX_LOAD_FACTOR = 0.95f; static constexpr float DEFAULT_MIN_LOAD_FACTOR = 0.0f; static constexpr float MINIMUM_MIN_LOAD_FACTOR = 0.0f; static constexpr float MAXIMUM_MIN_LOAD_FACTOR = 0.15f; static_assert(MINIMUM_MAX_LOAD_FACTOR < MAXIMUM_MAX_LOAD_FACTOR, "MINIMUM_MAX_LOAD_FACTOR should be < MAXIMUM_MAX_LOAD_FACTOR"); static_assert(MINIMUM_MIN_LOAD_FACTOR < MAXIMUM_MIN_LOAD_FACTOR, "MINIMUM_MIN_LOAD_FACTOR should be < MAXIMUM_MIN_LOAD_FACTOR"); static_assert(MAXIMUM_MIN_LOAD_FACTOR < MINIMUM_MAX_LOAD_FACTOR, "MAXIMUM_MIN_LOAD_FACTOR should be < MINIMUM_MAX_LOAD_FACTOR"); private: /** * Protocol version currenlty used for serialization. */ static const slz_size_type SERIALIZATION_PROTOCOL_VERSION = 1; /** * Return an always valid pointer to an static empty bucket_entry with * last_bucket() == true. */ bucket_entry* static_empty_bucket_ptr() noexcept { static bucket_entry empty_bucket(true); tsl_rh_assert(empty_bucket.empty()); return &empty_bucket; } private: buckets_container_type m_buckets_data; /** * Points to m_buckets_data.data() if !m_buckets_data.empty() otherwise points * to static_empty_bucket_ptr. This variable is useful to avoid the cost of * checking if m_buckets_data is empty when trying to find an element. * * TODO Remove m_buckets_data and only use a pointer instead of a * pointer+vector to save some space in the robin_hash object. Manage the * Allocator manually. */ bucket_entry* m_buckets; /** * Used a lot in find, avoid the call to m_buckets_data.size() which is a bit * slower. */ size_type m_bucket_count; size_type m_nb_elements; size_type m_load_threshold; float m_min_load_factor; float m_max_load_factor; bool m_grow_on_next_insert; /** * We can't shrink down the map on erase operations as the erase methods need * to return the next iterator. Shrinking the map would invalidate all the * iterators and we could not return the next iterator in a meaningful way, On * erase, we thus just indicate on erase that we should try to shrink the hash * table on the next insert if we go below the min_load_factor. */ bool m_try_shrink_on_next_insert; }; } // namespace detail_robin_hash } // namespace tsl #endif ================================================ FILE: self/compiler/native/nerdcore/src/tsl/robin_map.h ================================================ /** * MIT License * * Copyright (c) 2017 Thibaut Goetghebuer-Planchon * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifndef TSL_ROBIN_MAP_H #define TSL_ROBIN_MAP_H #include #include #include #include #include #include #include "robin_hash.h" namespace tsl { /** * Implementation of a hash map using open-addressing and the robin hood hashing * algorithm with backward shift deletion. * * For operations modifying the hash map (insert, erase, rehash, ...), the * strong exception guarantee is only guaranteed when the expression * `std::is_nothrow_swappable>::value && * std::is_nothrow_move_constructible>::value` is true, * otherwise if an exception is thrown during the swap or the move, the hash map * may end up in a undefined state. Per the standard a `Key` or `T` with a * noexcept copy constructor and no move constructor also satisfies the * `std::is_nothrow_move_constructible>::value` criterion (and * will thus guarantee the strong exception for the map). * * When `StoreHash` is true, 32 bits of the hash are stored alongside the * values. It can improve the performance during lookups if the `KeyEqual` * function takes time (if it engenders a cache-miss for example) as we then * compare the stored hashes before comparing the keys. When * `tsl::rh::power_of_two_growth_policy` is used as `GrowthPolicy`, it may also * speed-up the rehash process as we can avoid to recalculate the hash. When it * is detected that storing the hash will not incur any memory penalty due to * alignment (i.e. `sizeof(tsl::detail_robin_hash::bucket_entry) == sizeof(tsl::detail_robin_hash::bucket_entry)`) * and `tsl::rh::power_of_two_growth_policy` is used, the hash will be stored * even if `StoreHash` is false so that we can speed-up the rehash (but it will * not be used on lookups unless `StoreHash` is true). * * `GrowthPolicy` defines how the map grows and consequently how a hash value is * mapped to a bucket. By default the map uses * `tsl::rh::power_of_two_growth_policy`. This policy keeps the number of * buckets to a power of two and uses a mask to map the hash to a bucket instead * of the slow modulo. Other growth policies are available and you may define * your own growth policy, check `tsl::rh::power_of_two_growth_policy` for the * interface. * * `std::pair` must be swappable. * * `Key` and `T` must be copy and/or move constructible. * * If the destructor of `Key` or `T` throws an exception, the behaviour of the * class is undefined. * * Iterators invalidation: * - clear, operator=, reserve, rehash: always invalidate the iterators. * - insert, emplace, emplace_hint, operator[]: if there is an effective * insert, invalidate the iterators. * - erase: always invalidate the iterators. */ template , class KeyEqual = std::equal_to, class Allocator = std::allocator>, bool StoreHash = false, class GrowthPolicy = tsl::rh::power_of_two_growth_policy<2>> class robin_map { private: template using has_is_transparent = tsl::detail_robin_hash::has_is_transparent; class KeySelect { public: using key_type = Key; const key_type& operator()( const std::pair& key_value) const noexcept { return key_value.first; } key_type& operator()(std::pair& key_value) noexcept { return key_value.first; } }; class ValueSelect { public: using value_type = T; const value_type& operator()( const std::pair& key_value) const noexcept { return key_value.second; } value_type& operator()(std::pair& key_value) noexcept { return key_value.second; } }; using ht = detail_robin_hash::robin_hash, KeySelect, ValueSelect, Hash, KeyEqual, Allocator, StoreHash, GrowthPolicy>; public: using key_type = typename ht::key_type; using mapped_type = T; using value_type = typename ht::value_type; using size_type = typename ht::size_type; using difference_type = typename ht::difference_type; using hasher = typename ht::hasher; using key_equal = typename ht::key_equal; using allocator_type = typename ht::allocator_type; using reference = typename ht::reference; using const_reference = typename ht::const_reference; using pointer = typename ht::pointer; using const_pointer = typename ht::const_pointer; using iterator = typename ht::iterator; using const_iterator = typename ht::const_iterator; public: /* * Constructors */ robin_map() : robin_map(ht::DEFAULT_INIT_BUCKETS_SIZE) {} explicit robin_map(size_type bucket_count, const Hash& hash = Hash(), const KeyEqual& equal = KeyEqual(), const Allocator& alloc = Allocator()) : m_ht(bucket_count, hash, equal, alloc) {} robin_map(size_type bucket_count, const Allocator& alloc) : robin_map(bucket_count, Hash(), KeyEqual(), alloc) {} robin_map(size_type bucket_count, const Hash& hash, const Allocator& alloc) : robin_map(bucket_count, hash, KeyEqual(), alloc) {} explicit robin_map(const Allocator& alloc) : robin_map(ht::DEFAULT_INIT_BUCKETS_SIZE, alloc) {} template robin_map(InputIt first, InputIt last, size_type bucket_count = ht::DEFAULT_INIT_BUCKETS_SIZE, const Hash& hash = Hash(), const KeyEqual& equal = KeyEqual(), const Allocator& alloc = Allocator()) : robin_map(bucket_count, hash, equal, alloc) { insert(first, last); } template robin_map(InputIt first, InputIt last, size_type bucket_count, const Allocator& alloc) : robin_map(first, last, bucket_count, Hash(), KeyEqual(), alloc) {} template robin_map(InputIt first, InputIt last, size_type bucket_count, const Hash& hash, const Allocator& alloc) : robin_map(first, last, bucket_count, hash, KeyEqual(), alloc) {} robin_map(std::initializer_list init, size_type bucket_count = ht::DEFAULT_INIT_BUCKETS_SIZE, const Hash& hash = Hash(), const KeyEqual& equal = KeyEqual(), const Allocator& alloc = Allocator()) : robin_map(init.begin(), init.end(), bucket_count, hash, equal, alloc) {} robin_map(std::initializer_list init, size_type bucket_count, const Allocator& alloc) : robin_map(init.begin(), init.end(), bucket_count, Hash(), KeyEqual(), alloc) {} robin_map(std::initializer_list init, size_type bucket_count, const Hash& hash, const Allocator& alloc) : robin_map(init.begin(), init.end(), bucket_count, hash, KeyEqual(), alloc) {} robin_map& operator=(std::initializer_list ilist) { m_ht.clear(); m_ht.reserve(ilist.size()); m_ht.insert(ilist.begin(), ilist.end()); return *this; } allocator_type get_allocator() const { return m_ht.get_allocator(); } /* * Iterators */ iterator begin() noexcept { return m_ht.begin(); } const_iterator begin() const noexcept { return m_ht.begin(); } const_iterator cbegin() const noexcept { return m_ht.cbegin(); } iterator end() noexcept { return m_ht.end(); } const_iterator end() const noexcept { return m_ht.end(); } const_iterator cend() const noexcept { return m_ht.cend(); } /* * Capacity */ bool empty() const noexcept { return m_ht.empty(); } size_type size() const noexcept { return m_ht.size(); } size_type max_size() const noexcept { return m_ht.max_size(); } /* * Modifiers */ void clear() noexcept { m_ht.clear(); } std::pair insert(const value_type& value) { return m_ht.insert(value); } template ::value>::type* = nullptr> std::pair insert(P&& value) { return m_ht.emplace(std::forward

(value)); } std::pair insert(value_type&& value) { return m_ht.insert(std::move(value)); } iterator insert(const_iterator hint, const value_type& value) { return m_ht.insert_hint(hint, value); } template ::value>::type* = nullptr> iterator insert(const_iterator hint, P&& value) { return m_ht.emplace_hint(hint, std::forward

(value)); } iterator insert(const_iterator hint, value_type&& value) { return m_ht.insert_hint(hint, std::move(value)); } template void insert(InputIt first, InputIt last) { m_ht.insert(first, last); } void insert(std::initializer_list ilist) { m_ht.insert(ilist.begin(), ilist.end()); } template std::pair insert_or_assign(const key_type& k, M&& obj) { return m_ht.insert_or_assign(k, std::forward(obj)); } template std::pair insert_or_assign(key_type&& k, M&& obj) { return m_ht.insert_or_assign(std::move(k), std::forward(obj)); } template iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj) { return m_ht.insert_or_assign(hint, k, std::forward(obj)); } template iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj) { return m_ht.insert_or_assign(hint, std::move(k), std::forward(obj)); } /** * Due to the way elements are stored, emplace will need to move or copy the * key-value once. The method is equivalent to * insert(value_type(std::forward(args)...)); * * Mainly here for compatibility with the std::unordered_map interface. */ template std::pair emplace(Args&&... args) { return m_ht.emplace(std::forward(args)...); } /** * Due to the way elements are stored, emplace_hint will need to move or copy * the key-value once. The method is equivalent to insert(hint, * value_type(std::forward(args)...)); * * Mainly here for compatibility with the std::unordered_map interface. */ template iterator emplace_hint(const_iterator hint, Args&&... args) { return m_ht.emplace_hint(hint, std::forward(args)...); } template std::pair try_emplace(const key_type& k, Args&&... args) { return m_ht.try_emplace(k, std::forward(args)...); } template std::pair try_emplace(key_type&& k, Args&&... args) { return m_ht.try_emplace(std::move(k), std::forward(args)...); } template iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args) { return m_ht.try_emplace_hint(hint, k, std::forward(args)...); } template iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args) { return m_ht.try_emplace_hint(hint, std::move(k), std::forward(args)...); } iterator erase(iterator pos) { return m_ht.erase(pos); } iterator erase(const_iterator pos) { return m_ht.erase(pos); } iterator erase(const_iterator first, const_iterator last) { return m_ht.erase(first, last); } size_type erase(const key_type& key) { return m_ht.erase(key); } /** * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup to the value if you already have the hash. */ size_type erase(const key_type& key, std::size_t precalculated_hash) { return m_ht.erase(key, precalculated_hash); } /** * This overload only participates in the overload resolution if the typedef * KeyEqual::is_transparent exists. If so, K must be hashable and comparable * to Key. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> size_type erase(const K& key) { return m_ht.erase(key); } /** * @copydoc erase(const K& key) * * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup to the value if you already have the hash. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> size_type erase(const K& key, std::size_t precalculated_hash) { return m_ht.erase(key, precalculated_hash); } void swap(robin_map& other) { other.m_ht.swap(m_ht); } /* * Lookup */ T& at(const Key& key) { return m_ht.at(key); } /** * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ T& at(const Key& key, std::size_t precalculated_hash) { return m_ht.at(key, precalculated_hash); } const T& at(const Key& key) const { return m_ht.at(key); } /** * @copydoc at(const Key& key, std::size_t precalculated_hash) */ const T& at(const Key& key, std::size_t precalculated_hash) const { return m_ht.at(key, precalculated_hash); } /** * This overload only participates in the overload resolution if the typedef * KeyEqual::is_transparent exists. If so, K must be hashable and comparable * to Key. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> T& at(const K& key) { return m_ht.at(key); } /** * @copydoc at(const K& key) * * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> T& at(const K& key, std::size_t precalculated_hash) { return m_ht.at(key, precalculated_hash); } /** * @copydoc at(const K& key) */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> const T& at(const K& key) const { return m_ht.at(key); } /** * @copydoc at(const K& key, std::size_t precalculated_hash) */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> const T& at(const K& key, std::size_t precalculated_hash) const { return m_ht.at(key, precalculated_hash); } T& operator[](const Key& key) { return m_ht[key]; } T& operator[](Key&& key) { return m_ht[std::move(key)]; } size_type count(const Key& key) const { return m_ht.count(key); } /** * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ size_type count(const Key& key, std::size_t precalculated_hash) const { return m_ht.count(key, precalculated_hash); } /** * This overload only participates in the overload resolution if the typedef * KeyEqual::is_transparent exists. If so, K must be hashable and comparable * to Key. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> size_type count(const K& key) const { return m_ht.count(key); } /** * @copydoc count(const K& key) const * * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> size_type count(const K& key, std::size_t precalculated_hash) const { return m_ht.count(key, precalculated_hash); } iterator find(const Key& key) { return m_ht.find(key); } /** * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ iterator find(const Key& key, std::size_t precalculated_hash) { return m_ht.find(key, precalculated_hash); } const_iterator find(const Key& key) const { return m_ht.find(key); } /** * @copydoc find(const Key& key, std::size_t precalculated_hash) */ const_iterator find(const Key& key, std::size_t precalculated_hash) const { return m_ht.find(key, precalculated_hash); } /** * This overload only participates in the overload resolution if the typedef * KeyEqual::is_transparent exists. If so, K must be hashable and comparable * to Key. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> iterator find(const K& key) { return m_ht.find(key); } /** * @copydoc find(const K& key) * * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> iterator find(const K& key, std::size_t precalculated_hash) { return m_ht.find(key, precalculated_hash); } /** * @copydoc find(const K& key) */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> const_iterator find(const K& key) const { return m_ht.find(key); } /** * @copydoc find(const K& key) * * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> const_iterator find(const K& key, std::size_t precalculated_hash) const { return m_ht.find(key, precalculated_hash); } bool contains(const Key& key) const { return m_ht.contains(key); } /** * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ bool contains(const Key& key, std::size_t precalculated_hash) const { return m_ht.contains(key, precalculated_hash); } /** * This overload only participates in the overload resolution if the typedef * KeyEqual::is_transparent exists. If so, K must be hashable and comparable * to Key. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> bool contains(const K& key) const { return m_ht.contains(key); } /** * @copydoc contains(const K& key) const * * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> bool contains(const K& key, std::size_t precalculated_hash) const { return m_ht.contains(key, precalculated_hash); } std::pair equal_range(const Key& key) { return m_ht.equal_range(key); } /** * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ std::pair equal_range(const Key& key, std::size_t precalculated_hash) { return m_ht.equal_range(key, precalculated_hash); } std::pair equal_range(const Key& key) const { return m_ht.equal_range(key); } /** * @copydoc equal_range(const Key& key, std::size_t precalculated_hash) */ std::pair equal_range( const Key& key, std::size_t precalculated_hash) const { return m_ht.equal_range(key, precalculated_hash); } /** * This overload only participates in the overload resolution if the typedef * KeyEqual::is_transparent exists. If so, K must be hashable and comparable * to Key. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> std::pair equal_range(const K& key) { return m_ht.equal_range(key); } /** * @copydoc equal_range(const K& key) * * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> std::pair equal_range(const K& key, std::size_t precalculated_hash) { return m_ht.equal_range(key, precalculated_hash); } /** * @copydoc equal_range(const K& key) */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> std::pair equal_range(const K& key) const { return m_ht.equal_range(key); } /** * @copydoc equal_range(const K& key, std::size_t precalculated_hash) */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> std::pair equal_range( const K& key, std::size_t precalculated_hash) const { return m_ht.equal_range(key, precalculated_hash); } /* * Bucket interface */ size_type bucket_count() const { return m_ht.bucket_count(); } size_type max_bucket_count() const { return m_ht.max_bucket_count(); } /* * Hash policy */ float load_factor() const { return m_ht.load_factor(); } float min_load_factor() const { return m_ht.min_load_factor(); } float max_load_factor() const { return m_ht.max_load_factor(); } /** * Set the `min_load_factor` to `ml`. When the `load_factor` of the map goes * below `min_load_factor` after some erase operations, the map will be * shrunk when an insertion occurs. The erase method itself never shrinks * the map. * * The default value of `min_load_factor` is 0.0f, the map never shrinks by * default. */ void min_load_factor(float ml) { m_ht.min_load_factor(ml); } void max_load_factor(float ml) { m_ht.max_load_factor(ml); } void rehash(size_type count_) { m_ht.rehash(count_); } void reserve(size_type count_) { m_ht.reserve(count_); } /* * Observers */ hasher hash_function() const { return m_ht.hash_function(); } key_equal key_eq() const { return m_ht.key_eq(); } /* * Other */ /** * Convert a const_iterator to an iterator. */ iterator mutable_iterator(const_iterator pos) { return m_ht.mutable_iterator(pos); } /** * Serialize the map through the `serializer` parameter. * * The `serializer` parameter must be a function object that supports the * following call: * - `template void operator()(const U& value);` where the types * `std::int16_t`, `std::uint32_t`, `std::uint64_t`, `float` and * `std::pair` must be supported for U. * * The implementation leaves binary compatibility (endianness, IEEE 754 for * floats, ...) of the types it serializes in the hands of the `Serializer` * function object if compatibility is required. */ template void serialize(Serializer& serializer) const { m_ht.serialize(serializer); } /** * Deserialize a previously serialized map through the `deserializer` * parameter. * * The `deserializer` parameter must be a function object that supports the * following call: * - `template U operator()();` where the types `std::int16_t`, * `std::uint32_t`, `std::uint64_t`, `float` and `std::pair` must be * supported for U. * * If the deserialized hash map type is hash compatible with the serialized * map, the deserialization process can be sped up by setting * `hash_compatible` to true. To be hash compatible, the Hash, KeyEqual and * GrowthPolicy must behave the same way than the ones used on the serialized * map and the StoreHash must have the same value. The `std::size_t` must also * be of the same size as the one on the platform used to serialize the map. * If these criteria are not met, the behaviour is undefined with * `hash_compatible` sets to true. * * The behaviour is undefined if the type `Key` and `T` of the `robin_map` are * not the same as the types used during serialization. * * The implementation leaves binary compatibility (endianness, IEEE 754 for * floats, size of int, ...) of the types it deserializes in the hands of the * `Deserializer` function object if compatibility is required. */ template static robin_map deserialize(Deserializer& deserializer, bool hash_compatible = false) { robin_map map(0); map.m_ht.deserialize(deserializer, hash_compatible); return map; } friend bool operator==(const robin_map& lhs, const robin_map& rhs) { if (lhs.size() != rhs.size()) { return false; } for (const auto& element_lhs : lhs) { const auto it_element_rhs = rhs.find(element_lhs.first); if (it_element_rhs == rhs.cend() || element_lhs.second != it_element_rhs->second) { return false; } } return true; } friend bool operator!=(const robin_map& lhs, const robin_map& rhs) { return !operator==(lhs, rhs); } friend void swap(robin_map& lhs, robin_map& rhs) { lhs.swap(rhs); } private: ht m_ht; }; /** * Same as `tsl::robin_map`. */ template , class KeyEqual = std::equal_to, class Allocator = std::allocator>, bool StoreHash = false> using robin_pg_map = robin_map; } // end namespace tsl #endif ================================================ FILE: self/compiler/native/nerdcore/src/tsl/robin_set.h ================================================ /** * MIT License * * Copyright (c) 2017 Thibaut Goetghebuer-Planchon * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifndef TSL_ROBIN_SET_H #define TSL_ROBIN_SET_H #include #include #include #include #include #include #include "robin_hash.h" namespace tsl { /** * Implementation of a hash set using open-addressing and the robin hood hashing * algorithm with backward shift deletion. * * For operations modifying the hash set (insert, erase, rehash, ...), the * strong exception guarantee is only guaranteed when the expression * `std::is_nothrow_swappable::value && * std::is_nothrow_move_constructible::value` is true, otherwise if an * exception is thrown during the swap or the move, the hash set may end up in a * undefined state. Per the standard a `Key` with a noexcept copy constructor * and no move constructor also satisfies the * `std::is_nothrow_move_constructible::value` criterion (and will thus * guarantee the strong exception for the set). * * When `StoreHash` is true, 32 bits of the hash are stored alongside the * values. It can improve the performance during lookups if the `KeyEqual` * function takes time (or engenders a cache-miss for example) as we then * compare the stored hashes before comparing the keys. When * `tsl::rh::power_of_two_growth_policy` is used as `GrowthPolicy`, it may also * speed-up the rehash process as we can avoid to recalculate the hash. When it * is detected that storing the hash will not incur any memory penalty due to * alignment (i.e. `sizeof(tsl::detail_robin_hash::bucket_entry) == sizeof(tsl::detail_robin_hash::bucket_entry)`) * and `tsl::rh::power_of_two_growth_policy` is used, the hash will be stored * even if `StoreHash` is false so that we can speed-up the rehash (but it will * not be used on lookups unless `StoreHash` is true). * * `GrowthPolicy` defines how the set grows and consequently how a hash value is * mapped to a bucket. By default the set uses * `tsl::rh::power_of_two_growth_policy`. This policy keeps the number of * buckets to a power of two and uses a mask to set the hash to a bucket instead * of the slow modulo. Other growth policies are available and you may define * your own growth policy, check `tsl::rh::power_of_two_growth_policy` for the * interface. * * `Key` must be swappable. * * `Key` must be copy and/or move constructible. * * If the destructor of `Key` throws an exception, the behaviour of the class is * undefined. * * Iterators invalidation: * - clear, operator=, reserve, rehash: always invalidate the iterators. * - insert, emplace, emplace_hint, operator[]: if there is an effective * insert, invalidate the iterators. * - erase: always invalidate the iterators. */ template , class KeyEqual = std::equal_to, class Allocator = std::allocator, bool StoreHash = false, class GrowthPolicy = tsl::rh::power_of_two_growth_policy<2>> class robin_set { private: template using has_is_transparent = tsl::detail_robin_hash::has_is_transparent; class KeySelect { public: using key_type = Key; const key_type& operator()(const Key& key) const noexcept { return key; } key_type& operator()(Key& key) noexcept { return key; } }; using ht = detail_robin_hash::robin_hash; public: using key_type = typename ht::key_type; using value_type = typename ht::value_type; using size_type = typename ht::size_type; using difference_type = typename ht::difference_type; using hasher = typename ht::hasher; using key_equal = typename ht::key_equal; using allocator_type = typename ht::allocator_type; using reference = typename ht::reference; using const_reference = typename ht::const_reference; using pointer = typename ht::pointer; using const_pointer = typename ht::const_pointer; using iterator = typename ht::iterator; using const_iterator = typename ht::const_iterator; /* * Constructors */ robin_set() : robin_set(ht::DEFAULT_INIT_BUCKETS_SIZE) {} explicit robin_set(size_type bucket_count, const Hash& hash = Hash(), const KeyEqual& equal = KeyEqual(), const Allocator& alloc = Allocator()) : m_ht(bucket_count, hash, equal, alloc) {} robin_set(size_type bucket_count, const Allocator& alloc) : robin_set(bucket_count, Hash(), KeyEqual(), alloc) {} robin_set(size_type bucket_count, const Hash& hash, const Allocator& alloc) : robin_set(bucket_count, hash, KeyEqual(), alloc) {} explicit robin_set(const Allocator& alloc) : robin_set(ht::DEFAULT_INIT_BUCKETS_SIZE, alloc) {} template robin_set(InputIt first, InputIt last, size_type bucket_count = ht::DEFAULT_INIT_BUCKETS_SIZE, const Hash& hash = Hash(), const KeyEqual& equal = KeyEqual(), const Allocator& alloc = Allocator()) : robin_set(bucket_count, hash, equal, alloc) { insert(first, last); } template robin_set(InputIt first, InputIt last, size_type bucket_count, const Allocator& alloc) : robin_set(first, last, bucket_count, Hash(), KeyEqual(), alloc) {} template robin_set(InputIt first, InputIt last, size_type bucket_count, const Hash& hash, const Allocator& alloc) : robin_set(first, last, bucket_count, hash, KeyEqual(), alloc) {} robin_set(std::initializer_list init, size_type bucket_count = ht::DEFAULT_INIT_BUCKETS_SIZE, const Hash& hash = Hash(), const KeyEqual& equal = KeyEqual(), const Allocator& alloc = Allocator()) : robin_set(init.begin(), init.end(), bucket_count, hash, equal, alloc) {} robin_set(std::initializer_list init, size_type bucket_count, const Allocator& alloc) : robin_set(init.begin(), init.end(), bucket_count, Hash(), KeyEqual(), alloc) {} robin_set(std::initializer_list init, size_type bucket_count, const Hash& hash, const Allocator& alloc) : robin_set(init.begin(), init.end(), bucket_count, hash, KeyEqual(), alloc) {} robin_set& operator=(std::initializer_list ilist) { m_ht.clear(); m_ht.reserve(ilist.size()); m_ht.insert(ilist.begin(), ilist.end()); return *this; } allocator_type get_allocator() const { return m_ht.get_allocator(); } /* * Iterators */ iterator begin() noexcept { return m_ht.begin(); } const_iterator begin() const noexcept { return m_ht.begin(); } const_iterator cbegin() const noexcept { return m_ht.cbegin(); } iterator end() noexcept { return m_ht.end(); } const_iterator end() const noexcept { return m_ht.end(); } const_iterator cend() const noexcept { return m_ht.cend(); } /* * Capacity */ bool empty() const noexcept { return m_ht.empty(); } size_type size() const noexcept { return m_ht.size(); } size_type max_size() const noexcept { return m_ht.max_size(); } /* * Modifiers */ void clear() noexcept { m_ht.clear(); } std::pair insert(const value_type& value) { return m_ht.insert(value); } std::pair insert(value_type&& value) { return m_ht.insert(std::move(value)); } iterator insert(const_iterator hint, const value_type& value) { return m_ht.insert_hint(hint, value); } iterator insert(const_iterator hint, value_type&& value) { return m_ht.insert_hint(hint, std::move(value)); } template void insert(InputIt first, InputIt last) { m_ht.insert(first, last); } void insert(std::initializer_list ilist) { m_ht.insert(ilist.begin(), ilist.end()); } /** * Due to the way elements are stored, emplace will need to move or copy the * key-value once. The method is equivalent to * insert(value_type(std::forward(args)...)); * * Mainly here for compatibility with the std::unordered_map interface. */ template std::pair emplace(Args&&... args) { return m_ht.emplace(std::forward(args)...); } /** * Due to the way elements are stored, emplace_hint will need to move or copy * the key-value once. The method is equivalent to insert(hint, * value_type(std::forward(args)...)); * * Mainly here for compatibility with the std::unordered_map interface. */ template iterator emplace_hint(const_iterator hint, Args&&... args) { return m_ht.emplace_hint(hint, std::forward(args)...); } iterator erase(iterator pos) { return m_ht.erase(pos); } iterator erase(const_iterator pos) { return m_ht.erase(pos); } iterator erase(const_iterator first, const_iterator last) { return m_ht.erase(first, last); } size_type erase(const key_type& key) { return m_ht.erase(key); } /** * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup to the value if you already have the hash. */ size_type erase(const key_type& key, std::size_t precalculated_hash) { return m_ht.erase(key, precalculated_hash); } /** * This overload only participates in the overload resolution if the typedef * KeyEqual::is_transparent exists. If so, K must be hashable and comparable * to Key. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> size_type erase(const K& key) { return m_ht.erase(key); } /** * @copydoc erase(const K& key) * * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup to the value if you already have the hash. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> size_type erase(const K& key, std::size_t precalculated_hash) { return m_ht.erase(key, precalculated_hash); } void swap(robin_set& other) { other.m_ht.swap(m_ht); } /* * Lookup */ size_type count(const Key& key) const { return m_ht.count(key); } /** * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ size_type count(const Key& key, std::size_t precalculated_hash) const { return m_ht.count(key, precalculated_hash); } /** * This overload only participates in the overload resolution if the typedef * KeyEqual::is_transparent exists. If so, K must be hashable and comparable * to Key. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> size_type count(const K& key) const { return m_ht.count(key); } /** * @copydoc count(const K& key) const * * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> size_type count(const K& key, std::size_t precalculated_hash) const { return m_ht.count(key, precalculated_hash); } iterator find(const Key& key) { return m_ht.find(key); } /** * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ iterator find(const Key& key, std::size_t precalculated_hash) { return m_ht.find(key, precalculated_hash); } const_iterator find(const Key& key) const { return m_ht.find(key); } /** * @copydoc find(const Key& key, std::size_t precalculated_hash) */ const_iterator find(const Key& key, std::size_t precalculated_hash) const { return m_ht.find(key, precalculated_hash); } /** * This overload only participates in the overload resolution if the typedef * KeyEqual::is_transparent exists. If so, K must be hashable and comparable * to Key. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> iterator find(const K& key) { return m_ht.find(key); } /** * @copydoc find(const K& key) * * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> iterator find(const K& key, std::size_t precalculated_hash) { return m_ht.find(key, precalculated_hash); } /** * @copydoc find(const K& key) */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> const_iterator find(const K& key) const { return m_ht.find(key); } /** * @copydoc find(const K& key) * * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> const_iterator find(const K& key, std::size_t precalculated_hash) const { return m_ht.find(key, precalculated_hash); } bool contains(const Key& key) const { return m_ht.contains(key); } /** * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ bool contains(const Key& key, std::size_t precalculated_hash) const { return m_ht.contains(key, precalculated_hash); } /** * This overload only participates in the overload resolution if the typedef * KeyEqual::is_transparent exists. If so, K must be hashable and comparable * to Key. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> bool contains(const K& key) const { return m_ht.contains(key); } /** * @copydoc contains(const K& key) const * * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> bool contains(const K& key, std::size_t precalculated_hash) const { return m_ht.contains(key, precalculated_hash); } std::pair equal_range(const Key& key) { return m_ht.equal_range(key); } /** * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ std::pair equal_range(const Key& key, std::size_t precalculated_hash) { return m_ht.equal_range(key, precalculated_hash); } std::pair equal_range(const Key& key) const { return m_ht.equal_range(key); } /** * @copydoc equal_range(const Key& key, std::size_t precalculated_hash) */ std::pair equal_range( const Key& key, std::size_t precalculated_hash) const { return m_ht.equal_range(key, precalculated_hash); } /** * This overload only participates in the overload resolution if the typedef * KeyEqual::is_transparent exists. If so, K must be hashable and comparable * to Key. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> std::pair equal_range(const K& key) { return m_ht.equal_range(key); } /** * @copydoc equal_range(const K& key) * * Use the hash value 'precalculated_hash' instead of hashing the key. The * hash value should be the same as hash_function()(key). Useful to speed-up * the lookup if you already have the hash. */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> std::pair equal_range(const K& key, std::size_t precalculated_hash) { return m_ht.equal_range(key, precalculated_hash); } /** * @copydoc equal_range(const K& key) */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> std::pair equal_range(const K& key) const { return m_ht.equal_range(key); } /** * @copydoc equal_range(const K& key, std::size_t precalculated_hash) */ template < class K, class KE = KeyEqual, typename std::enable_if::value>::type* = nullptr> std::pair equal_range( const K& key, std::size_t precalculated_hash) const { return m_ht.equal_range(key, precalculated_hash); } /* * Bucket interface */ size_type bucket_count() const { return m_ht.bucket_count(); } size_type max_bucket_count() const { return m_ht.max_bucket_count(); } /* * Hash policy */ float load_factor() const { return m_ht.load_factor(); } float min_load_factor() const { return m_ht.min_load_factor(); } float max_load_factor() const { return m_ht.max_load_factor(); } /** * Set the `min_load_factor` to `ml`. When the `load_factor` of the set goes * below `min_load_factor` after some erase operations, the set will be * shrunk when an insertion occurs. The erase method itself never shrinks * the set. * * The default value of `min_load_factor` is 0.0f, the set never shrinks by * default. */ void min_load_factor(float ml) { m_ht.min_load_factor(ml); } void max_load_factor(float ml) { m_ht.max_load_factor(ml); } void rehash(size_type count_) { m_ht.rehash(count_); } void reserve(size_type count_) { m_ht.reserve(count_); } /* * Observers */ hasher hash_function() const { return m_ht.hash_function(); } key_equal key_eq() const { return m_ht.key_eq(); } /* * Other */ /** * Convert a const_iterator to an iterator. */ iterator mutable_iterator(const_iterator pos) { return m_ht.mutable_iterator(pos); } friend bool operator==(const robin_set& lhs, const robin_set& rhs) { if (lhs.size() != rhs.size()) { return false; } for (const auto& element_lhs : lhs) { const auto it_element_rhs = rhs.find(element_lhs); if (it_element_rhs == rhs.cend()) { return false; } } return true; } /** * Serialize the set through the `serializer` parameter. * * The `serializer` parameter must be a function object that supports the * following call: * - `template void operator()(const U& value);` where the types * `std::int16_t`, `std::uint32_t`, `std::uint64_t`, `float` and `Key` must be * supported for U. * * The implementation leaves binary compatibility (endianness, IEEE 754 for * floats, ...) of the types it serializes in the hands of the `Serializer` * function object if compatibility is required. */ template void serialize(Serializer& serializer) const { m_ht.serialize(serializer); } /** * Deserialize a previously serialized set through the `deserializer` * parameter. * * The `deserializer` parameter must be a function object that supports the * following call: * - `template U operator()();` where the types `std::int16_t`, * `std::uint32_t`, `std::uint64_t`, `float` and `Key` must be supported for * U. * * If the deserialized hash set type is hash compatible with the serialized * set, the deserialization process can be sped up by setting * `hash_compatible` to true. To be hash compatible, the Hash, KeyEqual and * GrowthPolicy must behave the same way than the ones used on the serialized * set and the StoreHash must have the same value. The `std::size_t` must also * be of the same size as the one on the platform used to serialize the set. * If these criteria are not met, the behaviour is undefined with * `hash_compatible` sets to true. * * The behaviour is undefined if the type `Key` of the `robin_set` is not the * same as the type used during serialization. * * The implementation leaves binary compatibility (endianness, IEEE 754 for * floats, size of int, ...) of the types it deserializes in the hands of the * `Deserializer` function object if compatibility is required. */ template static robin_set deserialize(Deserializer& deserializer, bool hash_compatible = false) { robin_set set(0); set.m_ht.deserialize(deserializer, hash_compatible); return set; } friend bool operator!=(const robin_set& lhs, const robin_set& rhs) { return !operator==(lhs, rhs); } friend void swap(robin_set& lhs, robin_set& rhs) { lhs.swap(rhs); } private: ht m_ht; }; /** * Same as `tsl::robin_set`. */ template , class KeyEqual = std::equal_to, class Allocator = std::allocator, bool StoreHash = false> using robin_pg_set = robin_set; } // end namespace tsl #endif ================================================ FILE: self/compiler/native/nerdcore/src/type_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __NERD__OBJECT_VECTOR #include "tsl/robin_map.h" #endif namespace NerdCore { namespace Type { typedef std::vector vector_t; typedef std::vector vector_p; typedef std::pair pair_t; #ifndef __NERD__OBJECT_VECTOR typedef tsl::robin_map object_t; #else typedef std::vector object_t; #endif typedef std::function function_t; typedef std::function clean_struct; #ifdef __NERD_ENV_ARDUINO typedef std::string StringView; #else typedef std::string_view StringView; #endif } } ================================================ FILE: self/compiler/native/nerdcore/src/values.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ namespace NerdCore::Global { using var = NerdCore::VAR; NerdCore::VAR null = __NERD_Create_Null(); NerdCore::VAR undefined = __NERD_Create_Null(); NerdCore::VAR Infinity = std::numeric_limits::infinity(); NerdCore::VAR NaN = std::numeric_limits::quiet_NaN(); NerdCore::VAR String = __NERD_Create_Var_Unscoped_Anon( return null; ); NerdCore::VAR Object = __NERD_Create_Var_Unscoped_Anon( return null; ); NerdCore::VAR Function = __NERD_Create_Var_Unscoped_Anon( return null; ); NerdCore::VAR global = new NerdCore::Class::Object(); NerdCore::VAR __NERD_THIS = global; } ================================================ FILE: self/compiler/native/nerdcore/src/values_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ namespace NerdCore::Global { using var = NerdCore::VAR; using let = NerdCore::VAR; extern NerdCore::VAR null; extern NerdCore::VAR undefined; extern NerdCore::VAR Infinity; extern NerdCore::VAR NaN; extern NerdCore::VAR global; extern NerdCore::VAR __NERD_THIS; //extern NerdCore::VAR String; extern NerdCore::VAR String; extern NerdCore::VAR Object; } ================================================ FILE: self/compiler/native/nerdcore/src/var.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ namespace NerdCore { VAR::VAR() { type = NerdCore::Enum::Type::Null; data.number = 0; } VAR::~VAR() { if(type > NerdCore::Enum::Type::Number) { ((NerdCore::Class::Base*)data.ptr)->Delete(); } } /*** COPY ***/ VAR::VAR(VAR const &_v) { type = _v.type; if(type < NerdCore::Enum::Type::String) { data.number = _v.data.number; } else data.ptr = ((NerdCore::Class::Base*)_v.data.ptr)->Copy(); } /* END COPY */ /*** MOVE ***/ VAR::VAR(VAR const &&_v) { type = _v.type; if(type < NerdCore::Enum::Type::String) { data.number = _v.data.number; } else data.ptr = ((NerdCore::Class::Base*)_v.data.ptr)->Copy(); } /* END MOVE */ /*** CONSTRUCTOR ***/ VAR::VAR(NerdCore::Enum::Type _type, int _value) { this->type = _type; data.number = _value; } VAR::VAR(NerdCore::Enum::Type _type, double _value) { this->type = _type; data.number = _value; } VAR::VAR(int _value) { this->type = NerdCore::Enum::Type::Number; data.number = _value; } VAR::VAR(double _value) { this->type = NerdCore::Enum::Type::Number; data.number = _value; } VAR::VAR(unsigned long _value) { this->type = NerdCore::Enum::Type::Number; data.number = _value; } VAR::VAR(long long _value) { this->type = NerdCore::Enum::Type::Number; data.number = _value; } VAR::VAR(long long unsigned int _value) { this->type = NerdCore::Enum::Type::Number; data.number = _value; } VAR::VAR(char *_value) { type = NerdCore::Enum::Type::String; data.ptr = new NerdCore::Class::String(_value); } VAR::VAR(const std::string _value) { type = NerdCore::Enum::Type::String; data.ptr = new NerdCore::Class::String(_value); } VAR::VAR(const char *_value) { type = NerdCore::Enum::Type::String; data.ptr = new NerdCore::Class::String(_value); } VAR::VAR(std::string_view _value) { type = NerdCore::Enum::Type::String; data.ptr = new NerdCore::Class::String({_value.data(), _value.size()}); } VAR::VAR(NerdCore::Class::FixedArray *_value) { type = NerdCore::Enum::Type::FixedArray; _value->counter++; data.ptr = _value; } VAR::VAR(NerdCore::Class::Array *_value) { type = NerdCore::Enum::Type::Array; _value->counter++; data.ptr = _value; } VAR::VAR(std::initializer_list l) { type = NerdCore::Enum::Type::Array; NerdCore::Class::Array* _arr = new NerdCore::Class::Array(l); _arr->counter++; data.ptr = _arr; } VAR::VAR(const NerdCore::Class::Array *_value) { type = NerdCore::Enum::Type::Array; data.ptr = (NerdCore::Class::Array *)_value; ((NerdCore::Class::Array*)data.ptr)->counter++; } VAR::VAR(bool _value) { type = NerdCore::Enum::Type::Boolean; data.number =_value; } VAR::VAR(NerdCore::Class::Function *_value) { type = NerdCore::Enum::Type::Function; _value->counter++; data.ptr = _value; } VAR::VAR(NerdCore::Class::Object *_value) { type = NerdCore::Enum::Type::Object; _value->counter++; data.ptr = _value; } VAR::VAR(NerdCore::Class::String *_value) { type = NerdCore::Enum::Type::String; data.ptr = new NerdCore::Class::String(_value->value); } VAR::VAR(NerdCore::Class::Native *_value) { type = NerdCore::Enum::Type::Native; _value->counter++; data.ptr = _value; } VAR::VAR(void *_value, void* fn) { type = NerdCore::Enum::Type::Struct; data.ptr = new NerdCore::Class::Struct(_value, (NerdCore::Type::clean_struct*)fn); } VAR::VAR(NerdCore::Enum::Type _type, void *_value) { type = _type; data.ptr = new NerdCore::Class::Function(_value); } /* END CALL OVERLOAD */ VAR & VAR::operator[] (VAR _index) { if(type < NerdCore::Enum::Type::String) return NerdCore::Global::null; return (*(NerdCore::Class::Base*)data.ptr)[_index]; } VAR & VAR::operator[] (VAR _index) const { if(type < NerdCore::Enum::Type::String) return NerdCore::Global::null; return (*(NerdCore::Class::Base*)data.ptr)[_index]; } VAR & VAR::operator[] (int _index) const { if(type < NerdCore::Enum::Type::String) return NerdCore::Global::null; return (*(NerdCore::Class::Base*)data.ptr)[_index]; } VAR & VAR::operator[] (int _index) { if(type < NerdCore::Enum::Type::String) return NerdCore::Global::null; return (*(NerdCore::Class::Base*)data.ptr)[_index]; } VAR & VAR::operator[] (double _index) { if(type < NerdCore::Enum::Type::String) return NerdCore::Global::null; return (*(NerdCore::Class::Base*)data.ptr)[_index]; } VAR & VAR::operator[] (const char* _index) { if(type < NerdCore::Enum::Type::String) return NerdCore::Global::null; return (*(NerdCore::Class::Base*)data.ptr)[_index]; } /* END ACCESS OVERLOAD */ /*** END CONSTRUCTOR ***/ /*** OPERATOR ***/ void VAR::operator=(const VAR &_v) { if(this == &_v) { return; } if(type > NerdCore::Enum::Type::Number) { ((NerdCore::Class::Base*)data.ptr)->Delete(); } type = _v.type; if(type < NerdCore::Enum::Type::String) { data.number = (double)_v; } else { data.ptr = ((NerdCore::Class::Base*)_v.data.ptr)->Copy(); } } /// Unary VAR::operators VAR VAR::operator+() { if(type < NerdCore::Enum::Type::String) return data.number; return (double)*this; } VAR VAR::operator-() { if(type < NerdCore::Enum::Type::String) return -data.number; return -(double)*this; } VAR VAR::operator!() { if(type < NerdCore::Enum::Type::String) return !data.number; return !(bool)*this; }; /// Logical VAR::operators VAR VAR::operator&&(const VAR &_v1) const { return (bool)*this && (bool)_v1; } VAR VAR::operator||(const VAR &_v1) const { return (bool)*this || (bool)_v1; } /// Arithmetic VAR::operators VAR VAR::operator+(const VAR &_v1) { if (type < NerdCore::Enum::Type::String) { return data.number + _v1; } else if (type == NerdCore::Enum::Type::String || type == NerdCore::Enum::Type::Array || type == NerdCore::Enum::Type::Object || _v1.type == NerdCore::Enum::Type::String) { if(_v1.type == NerdCore::Enum::Type::Null) return ((std::string)*this) + "null"; else return __NERD_Concat_To_Str((std::string)*this, (std::string)_v1); } else { return NerdCore::Global::NaN; } } VAR VAR::operator+(const char _v1[]) { return __NERD_Concat_To_Str((std::string)*this, _v1); } VAR& VAR::operator+=(const VAR &_v1) { if(type < NerdCore::Enum::Type::String) { data.number += _v1; } else if(type == NerdCore::Enum::Type::String) { ((NerdCore::Class::String*)data.ptr)->value += (std::string)_v1; } else { std::string _s = (std::string)*this; type = NerdCore::Enum::Type::String; data.ptr = new NerdCore::Class::String(""); ((NerdCore::Class::String*)data.ptr)->value += _s + (std::string)_v1; } return *this; } VAR VAR::operator-(const VAR &_v1) { if (type < NerdCore::Enum::Type::String ) return data.number - _v1; else return NerdCore::Global::NaN; } VAR& VAR::operator-=(const VAR &_v1) { if(type < NerdCore::Enum::Type::String) data.number -= _v1; else { return NerdCore::Global::NaN; } return *this; } VAR VAR::operator*(const VAR &_v1) { if(type < NerdCore::Enum::Type::String) return data.number * _v1; return NerdCore::Global::NaN; } VAR& VAR::operator*=(const VAR &_v1) { if(type < NerdCore::Enum::Type::String) data.number *= _v1; return *this; } VAR VAR::operator/(const VAR &_v1) { if (type < NerdCore::Enum::Type::String) return data.number / _v1; return NerdCore::Global::NaN; } VAR& VAR::operator/=(const VAR &_v1) { if(type < NerdCore::Enum::Type::String) data.number /= _v1; return *this; } VAR VAR::operator%(const VAR &_v1) { if (type < NerdCore::Enum::Type::String && _v1.type < NerdCore::Enum::Type::String) { int _left = (int)_v1; if(_left == 0) return NerdCore::Global::NaN; return (int)data.number % _left; } else { double _left = (double)_v1; if(_left == 0) return NerdCore::Global::NaN; return remainder((double)*this, _left); } } VAR& VAR::operator%=(const VAR &_v1) { if (type < NerdCore::Enum::Type::String) { int _left = (int)data.number; _left %= (int)_v1; if(_left == 0) data.number = std::numeric_limits::quiet_NaN(); data.number = _left; } else { return NerdCore::Global::NaN; } return *this; } // TODO: "**" and "**=" VAR::operators // var++ /* inline VAR& VAR::operator++(const int _v1) { if (type < NerdCore::Enum::Type::String) { data.number++; } return *this; } // ++var VAR& VAR::operator++() { if (type < NerdCore::Enum::Type::String) { ++data.number; } return *this; } // var-- VAR& VAR::operator--(const int _v1) { if (type < NerdCore::Enum::Type::String) { data.number--; } return *this; } // --var VAR& VAR::operator--() { if (type < NerdCore::Enum::Type::String) { --data.number; } return *this; } */ /// Comparison VAR::operators VAR VAR::operator==(const VAR &_v1) const { if (type == _v1.type) { switch (type) { case NerdCore::Enum::Type::Number: return (bool)(data.number == _v1); case NerdCore::Enum::Type::Boolean: return __NERD_Create_Boolean((bool)data.number == (bool)_v1); case NerdCore::Enum::Type::String: return __NERD_Create_Boolean((((NerdCore::Class::String*)data.ptr)->value).compare((std::string)_v1) == 0); case NerdCore::Enum::Type::Null: case NerdCore::Enum::Type::Array: case NerdCore::Enum::Type::Native: case NerdCore::Enum::Type::Function: case NerdCore::Enum::Type::Object: default: return _v1.data.ptr == this->data.ptr; } } else { if (type == NerdCore::Enum::Type::String || _v1.type == NerdCore::Enum::Type::String) { return __NERD_Create_Boolean((std::string) * this == (std::string)_v1); } else return __NERD_Create_Boolean((double)*this == (double)_v1); } } // === emulated with __NERD_EQUAL_VALUE_AND_TYPE VAR VAR::operator!=(const VAR &_v1) { return !(*this == _v1); } // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE VAR VAR::operator<(const VAR &_v1) { return data.number < (double)_v1; } VAR VAR::operator<=(const VAR &_v1) { return (int)*this <= (int)_v1; } VAR VAR::operator>(const VAR &_v1) { return (int)*this > (int)_v1; } VAR VAR::operator>=(const VAR &_v1) { return (int)*this >= (int)_v1; } /// Bitwise VAR::operators VAR VAR::operator&(const VAR &_v1) { return (int)*this & (int)_v1; } VAR& VAR::operator&=(const VAR &_v1) { type = NerdCore::Enum::Type::Number; data.number = (int)*this & (int)_v1; return *this; } VAR VAR::operator|(const VAR &_v1) { return (int)*this | (int)_v1; } VAR VAR::operator|=(const VAR &_v1) { if (type < NerdCore::Enum::Type::String) { data.number = (int)data.number | (int)_v1; } else { return NerdCore::Global::NaN; } return *this; } VAR VAR::operator^(const VAR &_v1) { return (int)*this ^ (int)_v1; } VAR VAR::operator^=(const VAR &_v1) { if (type < NerdCore::Enum::Type::String) { data.number = (int)data.number ^ (int)_v1; } else { return NerdCore::Global::NaN; } return *this; } VAR VAR::operator~() { return ~(int)*this; } VAR VAR::operator>>(const VAR &_v1) { return (int)*this >> (int)_v1; } VAR VAR::operator>>=(const VAR &_v1) { if (type < NerdCore::Enum::Type::String) { data.number = (int)data.number >> (int)_v1; } else { return NerdCore::Global::NaN; } return *this; } VAR VAR::operator<<(const VAR &_v1) { return (int)*this << (int)_v1; } VAR VAR::operator<<=(const VAR &_v1) { if (type < NerdCore::Enum::Type::String) { data.number = (int)data.number << (int)_v1; } else { return NerdCore::Global::NaN; } return *this; } VAR::operator int() const { if(type < NerdCore::Enum::Type::String) return data.number; return (int)(*(NerdCore::Class::Base*)data.ptr); } VAR::operator int() { if(type < NerdCore::Enum::Type::String) return data.number; return (int)(*(NerdCore::Class::Base*)data.ptr); } VAR::operator double() const { if(type < NerdCore::Enum::Type::String) return data.number; return (double)(*(NerdCore::Class::Base*)data.ptr); } VAR::operator double() { if(type < NerdCore::Enum::Type::String) return data.number; return (double)(*(NerdCore::Class::Base*)data.ptr); } VAR::operator bool() const { if(type == NerdCore::Enum::Type::Null) return false; else if(type == NerdCore::Enum::Type::Boolean || type == NerdCore::Enum::Type::Number) return data.number; else return (bool)(*(NerdCore::Class::Base*)data.ptr); } VAR::operator bool() { if(type == NerdCore::Enum::Type::Null) return false; else if(type == NerdCore::Enum::Type::Boolean || type == NerdCore::Enum::Type::Number) return data.number; else return (bool)(*(NerdCore::Class::Base*)data.ptr); } VAR::operator const char*() const { if(type == NerdCore::Enum::Type::String) { return ((NerdCore::Class::String*)this->data.ptr)->value.c_str(); } else { throw(NerdCore::VAR("Char* conversion error: variable is not a string")); } } VAR::operator std::string() const { if(type < NerdCore::Enum::Type::String) return __NERD_DOUBLE_TO_STRING(data.number); return (std::string)(*(NerdCore::Class::Base*)data.ptr); } VAR::operator std::string() { if(type < NerdCore::Enum::Type::String) return __NERD_DOUBLE_TO_STRING(data.number); return (std::string)(*(NerdCore::Class::Base*)data.ptr); } VAR::operator long long() { if(type < NerdCore::Enum::Type::String) return data.number; return (long long)((double)*this); } VAR::operator long long() const { if(type < NerdCore::Enum::Type::String) return data.number; return (long long)((double)*this); } VAR::operator std::string_view() const { if(type == NerdCore::Enum::Type::String) { return std::string_view(((NerdCore::Class::String*)this->data.ptr)->value.c_str()); } else { throw(NerdCore::VAR("string_view conversion error: variable is not a string")); } } } // namespace NerdCore ================================================ FILE: self/compiler/native/nerdcore/src/var_header.h ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ namespace NerdCore { union Data { void* ptr; double number; }; struct VAR { NerdCore::Enum::Type type; Data data; VAR(); ~VAR(); /**/ VAR(VAR const &_v); VAR(VAR const &&_v); /**/ /*** CONSTRUCTOR ***/ VAR(NerdCore::Enum::Type _type, int _value); VAR(NerdCore::Enum::Type _type, double _value); VAR(int _value); VAR(double _value); VAR(long long _value); VAR(unsigned long _value); VAR(long long unsigned int _value); VAR(char *_value); VAR(std::string _value); VAR(const char *_value); VAR(std::string_view _value); VAR(NerdCore::Class::FixedArray *_value); VAR(NerdCore::Class::Array *_value); VAR(std::initializer_list l); VAR(const NerdCore::Class::Array *_value); VAR(bool _value); VAR(NerdCore::Class::Function *_value); VAR(NerdCore::Class::Object *_value); VAR(NerdCore::Class::String *_value); VAR(NerdCore::Class::Native *_value); VAR(NerdCore::Class::Undefined *_value); VAR(void *_value, void* fn); VAR(NerdCore::Enum::Type _type, void *_value); VAR(NerdCore::Enum::Type _type, void *_value, VAR _this); VAR(std::function &_value); /* template VAR(NerdCore::Class::NativeTPL* _value) { this->type = NerdCore::Enum::Type::NativeTPL; data.ptr = _value; }; template T toNative (T _type) { if(type == NerdCore::Enum::Type::NativeTPL) { return (*(NerdCore::Class::NativeTPL*)data.ptr)(_type); } else { #ifndef __NERD_NO_EXCEPT throw VAR("TypeError: Object is not a Native object"); #endif exit(1); } } template T toNative () { if(type == NerdCore::Enum::Type::NativeTPL) { return (*(NerdCore::Class::NativeTPL*)data.ptr)(); } else { #ifndef __NERD_NO_EXCEPT throw VAR("TypeError: Object is not a Native object"); #endif exit(1); } } template T Ptr () { if(type == NerdCore::Enum::Type::NativeTPL) { return (NerdCore::Class::NativeTPL*)data.ptr; } else { #ifndef __NERD_NO_EXCEPT throw VAR("TypeError: Object is not a Native object"); #endif exit(1); } } */ template VAR operator() (NerdCore::VAR __NERD_THIS, Args... args) const { if (type != NerdCore::Enum::Type::Function) { #ifndef __NERD_NO_EXCEPT throw VAR("TypeError: object is not a function"); #endif exit(1); } else return (*(NerdCore::Class::Function*)data.ptr)(__NERD_THIS, (VAR)(args)...); } /* END CALL OVERLOAD */ VAR & operator[] (VAR _index); VAR & operator[] (VAR _index) const; VAR & operator[] (int _index) const; VAR & operator[] (int _index); VAR & operator[] (double _index); VAR & operator[] (const char* _index); /* END ACCESS OVERLOAD */ /*** END CONSTRUCTOR ***/ /*** OPERATOR ***/ void operator=(const VAR &_v); /// Unary operators VAR operator+(); VAR operator-(); VAR operator!(); /// Logical operators VAR operator&&(const VAR &_v1) const; VAR operator||(const VAR &_v1) const; /// Arithmetic operators VAR operator+(const VAR &_v1); VAR operator+(const char _v1[]); VAR& operator+=(const VAR &_v1); VAR operator-(const VAR &_v1); VAR& operator-=(const VAR &_v1); VAR operator*(const VAR &_v1); VAR& operator*=(const VAR &_v1); VAR operator/(const VAR &_v1); VAR& operator/=(const VAR &_v1); VAR operator%(const VAR &_v1); VAR& operator%=(const VAR &_v1); // TODO: "**" and "**=" operators // var++ inline VAR& operator++(const int _v1) noexcept { if (type < NerdCore::Enum::Type::String) { data.number++; } return *this; } // ++var inline VAR& operator++() { if (type < NerdCore::Enum::Type::String) { ++data.number; } return *this; } // var-- inline VAR& operator--(const int _v1) { if (type < NerdCore::Enum::Type::String) { data.number--; } return *this; } // --var inline VAR& operator--() { if (type < NerdCore::Enum::Type::String) { --data.number; } return *this; } /// Comparison operators VAR operator==(const VAR &_v1) const; // === emulated with __NERD_EQUAL_VALUE_AND_TYPE VAR operator!=(const VAR &_v1); // !== emulated with __NERD_NOT_EQUAL_VALUE_AND_TYPE VAR operator<(long long int &_v1); VAR operator<(int &_v1); VAR operator<(double &_v1); VAR operator<(const VAR &_v1); VAR operator<=(const VAR &_v1); VAR operator>(const VAR &_v1); VAR operator>=(const VAR &_v1); /// Bitwise operators VAR operator&(const VAR &_v1); VAR& operator&=(const VAR &_v1); VAR operator|(const VAR &_v1); VAR operator|=(const VAR &_v1); VAR operator^(const VAR &_v1); VAR operator^=(const VAR &_v1); VAR operator~(); VAR operator>>(const VAR &_v1); VAR operator>>=(const VAR &_v1); VAR operator<<(const VAR &_v1); VAR operator<<=(const VAR &_v1); explicit operator int() const; operator int(); explicit operator double() const; operator double(); explicit operator bool() const; operator bool(); explicit operator std::string() const; operator std::string(); operator const char*() const; operator long long(); explicit operator long long() const; operator std::string_view() const; }; } // namespace NerdCore ================================================ FILE: self/compiler/native/nerdcore/test/array.cpp ================================================ #include "../src/nerd.hpp" using namespace NerdCore; using namespace NerdCore::Global; using namespace NerdCore::Class; using namespace NerdCore::Functions; int main(int argc, char** argv) { var arr = new Array(); println(arr); var initArr = new Array(0, "one", 2, "three"); println(initArr); var initArr2 = {"zero", 1, "two", 3}; println(initArr2); return 0; } ================================================ FILE: self/compiler/native/nerdcore/test/cast.cpp ================================================ #include "../src/nerd.hpp" using namespace NerdCore; using namespace NerdCore::Global; using namespace NerdCore::Class; using namespace NerdCore::Functions; int main() { try { var _str = "string"; std::cout << "_str: " << _str << std::endl; var _nbr = 123; std::cout << "_nbr: " << _nbr << std::endl; const char* c = _str; std::cout << "char: " << c << std::endl; std::string s = _str; std::cout << "string: " << s << std::endl; std::string_view sv = _str; std::cout << "string_view: " << sv << std::endl; int i = _nbr; std::cout << "int: " << i << std::endl; double d = _nbr; std::cout << "double: " << d << std::endl; long long ll = _nbr; std::cout << "long long: " << ll << std::endl; bool b = _nbr; std::cout << "bool: " << b << std::endl; } catch(var& error) { println(error); } return 0; } ================================================ FILE: self/compiler/native/nerdcore/test/native.cpp ================================================ #include "../src/nerd.hpp" using namespace NerdCore; using namespace NerdCore::Global; using namespace NerdCore::Class; using namespace NerdCore::Functions; struct s { int i = 10; int j; }; s* typeStruct = new s(); int main(int argc, char** argv) { try { #if __cplusplus > 202002L auto __fn = []() {std::cout << "Hello" << std::endl;}; var _struct = new NativeTPL(new s({3,4})); std::cout << _struct.toNative(typeStruct)->i << std::endl; var _fn = new NativeTPL(__fn); _fn.toNative(__fn)(); #else var _struct = new NativeTPL(new s({3,4})); std::cout << _struct.toNative(typeStruct)->i << std::endl; #endif } catch(var e) { println(e); } return 0; } ================================================ FILE: self/compiler/native/nerdcore/test/object.cpp ================================================ #include "../src/nerd.hpp" using namespace NerdCore; using namespace NerdCore::Global; using namespace NerdCore::Class; using namespace NerdCore::Functions; int main(int argc, char** argv) { var args = getArguments(argc, argv); println(args); var o = new Object(); o["int"] = 1; o["string"] = "str"; println(o); var init = new Object( { {"one", 1}, // number {"two", "2"}, // string {"three", {1,2,3}}, // array {"four", new Object("key", "value")}, // sub object with only one key {"five", new Object({"key", 1})}, // another way with non string value {"six", new Object({ {"key", 2} })}, // another way with non string value }); println(init); return 0; } ================================================ FILE: self/compiler/native/nerdcore/test/operators.cpp ================================================ #include "../src/nerd.hpp" using namespace NerdCore; using namespace NerdCore::Global; using namespace NerdCore::Class; using namespace NerdCore::Functions; int main() { try { var a = 1; println(a + a); println(a + 1); println(a + "1"); println(1 + a); println("1" + a); println(a - a); println(a - 1); println(a - "1"); println(1 - a); println("1" - a); println(a * a); println(a * 1); println(a * "1"); println(1 * a); println("1" * a); println(a / a); println(a / 1); println(a / "1"); println(1 / a); println("1" / a); println(a == a); println(a == 1); println(a == "1"); println(a != a); println(a != 1); println(a != "1"); println(a > a); println(a > 1); println(a > "1"); println(a < a); println(a < 1); println(a < "1"); println(a >= a); println(a >= 1); println(a >= "1"); println(a <= a); println(a <= 1); println(a <= "1"); println(a | a); println(a | 1); println(a | "1"); println(a & a); println(a & 1); println(a & "1"); println(a ^ a); println(a ^ 1); println(a ^ "1"); } catch(var& error) { println(error); } return 0; } ================================================ FILE: self/compiler/native/squel/arduino.cpp ================================================ #define _USE_MATH_DEFINES #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define __NERD_ENV_ARDUINO #define __NERD_NO_EXCEPT #include "nerdcore/src/nerd.cpp" using namespace NerdCore::Global; using namespace NerdCore::Functions; #define __NERD_Create_Object() new NerdCore::Class::Object() #define __NERD_Create_Array(_arr) new NerdCore::Class::Array(_arr) #define __NERD_InitVar() NerdCore::VAR() var __NERD_ENV = "arduino"; var __NERD_PLATFORM = "{{__PLATFORM__}}"; // Declared weak in Arduino.h to allow user redefinitions. int atexit(void (* /*func*/ )()) { return 0; } // Weak empty variant initialization function. // May be redefined by variant files. void initVariant() __attribute__((weak)); void initVariant() { } void setupUSB() __attribute__((weak)); void setupUSB() { } {INCLUDE} int main(int argc, char* argv[]) { {DECL} init(); initVariant(); #if defined(USBCON) USBDevice.attach(); #endif {INIT} { {CODE} } return 0; } ================================================ FILE: self/compiler/native/squel/js.cpp ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include #include #include #include #include #include #include "nerdcore/src/nerd.hpp" using namespace NerdCore::Global; var __NJS_ENV = "std"; var __NJS_PLATFORM = "{{__PLATFORM__}}"; NerdCore::Global::var __NERD_ARGS = new NerdCore::Class::Array(); NerdCore::Global::var _ = new NerdCore::Class::Object(); NerdCore::Global::var __dirname; {INCLUDE} std::string ToFixed(double number, size_t digits) { char format[10]; char str[64]; sprintf_s(format, "%%0.%zdf", digits); return std::string(str, sprintf_s(str, format, number)); } int main(int __NERD_VARLENGTH, char* __Nerd_Argv[]) { //NerdCore::VAR Object = __NERD_Create_Var_Scoped_Copy_Anon( return __NERD_THIS; ); //NerdCore::VAR String = __NERD_Create_Var_Scoped_Copy_Anon( return __NERD_THIS; ); {DECL} Object["prototype"] = new NerdCore::Class::Object(); Object["prototype"]["valueOf"] = __NERD_Create_Var_Scoped_Copy_Anon({ return __NERD_THIS; }); Object["prototype"]["toString"] = __NERD_Create_Var_Scoped_Copy_Anon({ return __NERD_THIS; }); String["prototype"] = new NerdCore::Class::Object(); String["prototype"]["__proto__"] = Object["prototype"]; String["prototype"]["valueOf"] = __NERD_Create_Var_Scoped_Copy_Anon({ return ((char*)__NERD_PTR); }); String["prototype"]["toString"] = __NERD_Create_Var_Scoped_Copy_Anon({ return ((char*)__NERD_PTR); }); std::string argv_str(__Nerd_Argv[0]); #ifdef _WIN32 std::string __NERD_DIRNAME = argv_str.substr(0, argv_str.find_last_of("\\")); #elif _WIN64 std::string __NERD_DIRNAME = argv_str.substr(0, argv_str.find_last_of("\\")); #else std::string __NERD_DIRNAME = argv_str.substr(0, argv_str.find_last_of("/")); #endif if(__NERD_DIRNAME.size() == argv_str.size()) { __dirname = ""; } else { __dirname = __NERD_DIRNAME; } NerdCore::VAR __NERD_VARARGS[__NERD_VARLENGTH]; for( int i = 0; i < __NERD_VARLENGTH; i++) { __NERD_ARGS[i] = __Nerd_Argv[i]; __NERD_VARARGS[i] = __Nerd_Argv[i]; } try { {INIT} #ifdef __NERD_INIT_RAND_SEED srand (time(NULL)); #endif { {CODE} } } catch(NerdCore::VAR __NERD_Global_Exception) { __NERD_Log_Console(__NERD_Global_Exception); exit(1); } return 0; } ================================================ FILE: self/compiler/native/squel/std.cpp ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include #include #include #include #include #include #include "nerdcore/src/nerd.hpp" using namespace NerdCore::Global; var __NJS_ENV = "std"; var __NJS_PLATFORM = "{{__PLATFORM__}}"; NerdCore::Global::var __NERD_ARGS = new NerdCore::Class::Array(); NerdCore::Global::var _ = new NerdCore::Class::Object(); NerdCore::Global::var __dirname; {INCLUDE} int main(int __NERD_VARLENGTH, char* __Nerd_Argv[]) { {DECL} Object["prototype"] = new NerdCore::Class::Object(); Object["prototype"]["valueOf"] = __NERD_Create_Var_Scoped_Copy_Anon({ return __NERD_THIS; }); Object["prototype"]["toString"] = __NERD_Create_Var_Scoped_Copy_Anon({ return __NERD_THIS; }); String["prototype"] = new NerdCore::Class::Object(); String["prototype"]["__proto__"] = Object["prototype"]; String["prototype"]["valueOf"] = __NERD_Create_Var_Scoped_Copy_Anon({ return ((char*)__NERD_OBJECT(__NERD_THIS)->bind); }); String["prototype"]["toString"] = __NERD_Create_Var_Scoped_Copy_Anon({ return ((char*)__NERD_OBJECT(__NERD_THIS)->bind); }); std::string argv_str(__Nerd_Argv[0]); #ifdef _WIN32 std::string __NERD_DIRNAME = argv_str.substr(0, argv_str.find_last_of("\\")); #elif _WIN64 __NERD_DIRNAME = argv_str.substr(0, argv_str.find_last_of("\\")); #else __NERD_DIRNAME = argv_str.substr(0, argv_str.find_last_of("/")); #endif if(__NERD_DIRNAME.size() == argv_str.size()) { __dirname = ""; } else { __dirname = __NERD_DIRNAME; } NerdCore::VAR __NERD_VARARGS[__NERD_VARLENGTH]; for( int i = 0; i < __NERD_VARLENGTH; i++) { __NERD_ARGS[i] = __Nerd_Argv[i]; __NERD_VARARGS[i] = __Nerd_Argv[i]; } try { {INIT} #ifdef __NERD_INIT_RAND_SEED srand (time(NULL)); #endif { {CODE} } } catch(NerdCore::VAR __NERD_Global_Exception) { __NERD_Log_Console(__NERD_Global_Exception); exit(1); } return 0; } ================================================ FILE: self/compiler/native/squel/wasm.cpp ================================================ #define __NERD_ENV_WASM #include "nerdcore/src/nerd.hpp" using namespace NerdCore::Global; using namespace NerdCore::Functions; var __NERD_ENV = "wasm"; var __NERD_PLATFORM = "{{__PLATFORM__}}"; NerdCore::Global::var __NERD_ARGS = new NerdCore::Class::Array(); {INCLUDE} int main(int __NERD_VARLENGTH, char* __Nerd_Argv[]) { {DECL} NerdCore::VAR __NERD_VARARGS[__NERD_VARLENGTH]; for( int i = 0; i < __NERD_VARLENGTH; i++) { __NERD_ARGS[i] = __Nerd_Argv[i]; __NERD_VARARGS[i] = __Nerd_Argv[i]; } try { {INIT} #ifdef __NERD_INIT_RAND_SEED srand (time(NULL)); #endif { {CODE} } } catch(NerdCore::VAR __NERD_Global_Exception) { __NERD_Log_Console(__NERD_Global_Exception); exit(1); } return 0; } ================================================ FILE: self/compiler/self/base/cli/cliParser.ng ================================================ var parseCLI = function(args) { var result = { error: false, msg: "", cli: {}, stack: [], useless: [] }; var useless = [0, 1]; var withArgs = ["--target", "--spec", "--env", "--stack", "-o", "--preset", "--flash", "--compiler", "-c", "--build", "-b", "--option", "--register", "-r", "--setauthor", "--setid", "--setkey", "--setapi", "--setport", "--sethash", "--setsdk", "--setndk", "--setwin_inc_ucrt", "--setwin_lib_ucrt", "--setwin_lib_um", "--setxcode"]; var noArgs = ["--install_external", "--debug", "--conserve", "--generate", "--config", "--reinit", "--example", "--examples" , "--prepare", "--project", "--run", "--clean", "--purge", "--check", "--no-check", "--verbose", "-v", "--tips", "--version", "--help", "-h", "--release", "--no-object-hashmap"]; for(var i = 0; i < args.length; i++) { if( useless.indexOf(i) > -1 ) { result.useless.push(args[i]); } else if( withArgs.indexOf(args[i]) > -1) { if(args[i+1]) { result.cli[args[i]] = { state: true, argument: args[i+1], }; i++; } else { result.error = true; result.msg = "[!] Missing argument for " + args[i]; break; } } else if(noArgs.indexOf(args[i]) > -1) { result.cli[args[i]] = { state: true, }; } else if(args[i].length > 0 && args[i][0] == "-") { if(withArgs.indexOf(args[i]) < 0 && noArgs.indexOf(args[i]) < 0) { result.error = true; result.msg = "[!] Unknown parameter : " + args[i]; break; } } else result.stack.push(args[i]); } return result; }; return parseCLI; ================================================ FILE: self/compiler/self/base/compiler/target.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var target = ["win-x86-32", "win-x86-64", "linux-x86-32", "linux-x86-64", "linux-arm32v7", "arduino-uno", "arduino-mega1280", "arduino-mega2560", "wasm", "wast", "asm-js", "mac-osx", "nucleo-l152re", "nucleo-l432kc" ]; module.exports = target; ================================================ FILE: self/compiler/self/base/util/copyDirSync.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function copyDirSync( source, target ) { var targetFile = target; if ( fs.existsSync( target ) ) { if ( fs.lstatSync( target ).isDirectory() ) { targetFile = path.join( target, path.basename( source ) ); } } fs.copyFileSync(source, targetFile); } function copyFolderRecursiveSync( source, target, _root ) { var files = []; var targetFolder = path.join( target, path.basename( source ) ); if(_root) targetFolder = target; if ( !fs.existsSync( targetFolder ) ) { fs.mkdirSync( targetFolder ); } if ( fs.lstatSync( source ).isDirectory() ) { files = fs.readdirSync( source ); files.forEach( function ( file ) { var curSource = path.join( source, file ); if ( fs.lstatSync( curSource ).isDirectory() ) { copyFolderRecursiveSync( curSource, targetFolder ); } else { copyDirSync( curSource, targetFolder ); } } ); } } module.exports = copyFolderRecursiveSync; ================================================ FILE: self/compiler/self/base/util/copyRecursive.js ================================================ var copyRecursiveSync = function(src, dest) { if(!fs.existsSync(src)) { console.log("[!] Warning: " + src + " doesn't exist"); return; } if(fs.lstatSync( src ).isDirectory()) { var _newDest = path.dirname(dest); copyDirSync(src, _newDest, true); } else { var _path = []; var _newDest = path.dirname(dest); _path.push(_newDest); while(path.dirname(_newDest) != _newDest) { _newDest = path.dirname(_newDest); if(_newDest.indexOf(NERD_PATH) == 0) { _path.push(_newDest); } } for(var i = _path.length; i > -1; i--) { try { fs.mkdirSync(_path[i]); } catch(e){} } fs.copyFileSync(src, dest); } }; module.exports = copyRecursiveSync; ================================================ FILE: self/compiler/self/base/util/flash.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module.exports = Flash; var fs = require("fs"); var path = require("path"); function Flash(from, to, target, verb) { switch(target) { case "uno": execFlashArduino(from, to, "ATMEGA328P", "arduino", "19200", verb) break; case "mega1280": execFlashArduino(from, to, "m1280", "arduino", "57600", verb) break; case "mega2560": execFlashArduino(from, to, "m2560", "wiring", "115200", verb) break; case "nucleo-l152re": case "nucleo-l432kc": execFlashSTM32(from, to); break; default: console.log("Nothing to do for target : " + target); break; } } function execFlashArduino(from, to, model, driver, bauds, verb) { var spawn = require('child_process').spawn; var _flash = spawn('avrdude', ['-p', model, "-c", driver, "-P", to, "-b", bauds, "-F", "-U", "flash:w:"+from]); _flash.stdout.on('data', function(data) { if(verb) process.stdout.write(data.toString()); }); _flash.stderr.on('data', function(data) { if(verb) process.stdout.write(data.toString()); }); _flash.on('error', function(err) { console.log("[!] Error :"); console.log(err) }); _flash.on('close', function(code) { console.log("[+] Flashed") }); } function execFlashSTM32(from, to) { try { fs.writeFileSync(path.join(to, from), fs.readFileSync(from)); console.log("[+ Flashed]"); } catch(e) { console.log("[!] Your file is compiled, but an error occured while flashing, please try again.") } } ================================================ FILE: self/compiler/self/base/util/getExt.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module.exports = getExt; function getExt(target) { switch(target) { case "wasm": return ".wasm"; break; case "asm-js": return ".asm.js"; break; case "wast": return ".wast"; break; case "win-x86-32": case "win-x86-64": return "-" + target + ".exe"; break; case "nucleo-l432kc": case "nucleo-l152re": case "mac-osx": case "linux-x86-32": case "linux-x86-64": case "linux-arm32v7": return "-" + target + ".bin"; break; case "arduino-uno": return "-" + target + ".hex"; break; case "arduino-mega1280": return "-" + target + ".hex"; break; case "arduino-mega2560": return "-" + target + ".hex"; break; default: return ".bin"; break; } } ================================================ FILE: self/compiler/self/base/util/getTips.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module.exports = getTips; function getTips(target, file) { switch(target) { case "wasm": return ""; break; case "asm-js": return "[*] Tips : run this file with node : 'node " + file + "', or embed it in a .html page with " break; case "wast": return ""; break; case "win-x86-32": case "win-x86-64": return "[*] Tips : on Linux, you can run this .exe with Wine : 'wine " + file + "'" break; case "linux-x86-32": case "linux-x86-64": case "linux-arm32v7": return "[*] Tips : on Linux, don't forget to : 'chmod +x " + file + "'." break; case "arduino-uno": return "[*] Tips : avrdude -p ATMEGA328P -c arduino -P [COMPORT] -b 19200 -F -U flash:w:" + file; break; case "arduino-mega1280": return "[*] Tips : avrdude -p m1280 -c arduino -P [COMPORT] -b 57600 -F -U flash:w:" + file; break; case "arduino-mega2560": return "[*] Tips : avrdude -p m2560 -c wiring -P [COMPORT] -b 115200 -F -U flash:w:" + file; break; case "nucleo-l152re": case "nucleo-l432kc": return "[*] Connect your nucleo on your computer, and symple copy/paste " + file + " on the nucleo drive" default: return ""; break; } } ================================================ FILE: self/compiler/self/base/util/httpUtils.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var http = require("http"); var https = require("https"); module.exports.httpUtil = new httpUtil(http); module.exports.httpsUtil = new httpUtil(https); /** * httpUtil Catalog of standard http call * @class httpUtil * @name httpUtil * @memberof WF * */ function httpUtil(httpHandler) { /** * Send a http request. * @memberof httpUtil * @example wf.httpUtil.httpReq(opt, cbError, cbOk, "utf-8"); * */ this.httpReq = function(opt, cbError, cbOk, encoding) { var data = ""; if(opt.data) data = opt.data; if(!encoding) encoding = "utf8"; opt.path = encodeURI(opt.path); var request = httpHandler.request(opt); request.on("error", function(err) { cbError(err); }); request.on("response", function(response) { var data = ""; response.on("data", function(chunk) { data += chunk.toString(encoding); }); response.on("end", function() { cbOk(data); }); }); request.end(data); return; }; /** * Send a http request and redirect output in a pipe, then call a callback when finished. * @memberof httpUtil * @example wf.httpUtil.httpReqPipe(opt, cbError, cbPipe, cbOk); * */ this.httpReqPipe = function(opt, cbError,cbPipe, cbOk) { var data = ""; if(opt.data) data = opt.data; opt.path = encodeURI(opt.path); var request = httpHandler.request(opt); request.on("error", function(err) { cbError(err); }); request.on("response", function(response) { if(cbPipe) cbPipe(response); response.on("end", function() { if(cbOk) cbOk(); }); }); request.end(data); return; }; } ================================================ FILE: self/compiler/self/base/util/rmdir.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var rmdir = function(dir, callback) { fs.readdir(dir, function(err, list) { if(err) { try { fs.unlink(dir, function(err) { callback(err); }); } catch(e){} } else { var i = 0; var j = list.length; var cb = function(){ fs.rmdir(dir, function(err){if(callback && typeof(callback) == "function") callback(err);});}; recursiveRm(dir, i, j, list, cb); return; } }); function recursiveRm(from, i, j, list, cb) { function nextFile() { i++; if(i < j) { recursiveRm(from, i, j, list, cb); } else { if(cb && typeof cb == "function") cb(); } } var filename = ""; try { filename = path.join(from, list[i]); } catch(e) { nextFile(); return; } fs.stat(filename, function(err, stat) { if(err) { nextFile(); } else if(stat.isDirectory()) { if(filename) { rmdir(filename, nextFile); } else { nextFile(); } } else { fs.unlink(filename, nextFile); } }); } }; module.exports = rmdir; ================================================ FILE: self/compiler/self/nerd.ng ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ _.VERSION = "0.1.1"; _.fs = require("fs"); _.console = require("console"); _.os = require("os"); _.path = require("path"); _.process = require("process"); _.querystring = require("querystring"); _.child_process = require("child_process"); _.execSync = _.child_process.execSync; _.JSON = require("JSON"); _.extern = _.path.join(__dirname, "external"); _.console.log(_.extern); //var _parseCLI = require("./base/cli/cliParser.ng"); ================================================ FILE: self/lib/check/isAssignment.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isAssignment(_token) { if(ASSIGNMENT_OPERATOR.indexOf(_token) < 0) { return {error: false, check: false}; } return {error: false, check: true, type: "ASSIGNMENT"}; } module.exports = isAssignment; ================================================ FILE: self/lib/check/isBoolean.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isBoolean(_token) { if(BOOLEAN_KEYWORD.indexOf(_token) < 0) { return {error: false, check: false}; } return {error: false, check: true, type: "BOOLEAN"}; } module.exports = isBoolean; ================================================ FILE: self/lib/check/isDelimiter.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isDelimiter(_token) { if(DELIMITER.indexOf(_token) < 0) { return {error: false, check: false}; } return {error: false, check: true, type: _token}; } module.exports = isDelimiter; ================================================ FILE: self/lib/check/isIncrement.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isIncrement(_token) { if(INCREMENT_TOKENS.indexOf(_token) < 0) { return {error: false, check: false}; } return {error: false, check: true, type: "INCREMENT"}; } module.exports = isIncrement; ================================================ FILE: self/lib/check/isInitOperator.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isInitOperator(_token) { if(INIT_OPERATOR.indexOf(_token) < 0) { return {error: false, check: false}; } return {error: false, check: true, type: _token}; } module.exports = isInitOperator; ================================================ FILE: self/lib/check/isKeyword.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isKeyword(_token) { if(KEYWORD.indexOf(_token) < 0) { return {error: false, check: false}; } return {error: false, check: true, type: _token.toUpperCase()}; } module.exports = isKeyword; ================================================ FILE: self/lib/check/isNative.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isNative(_token) { if(_token.length < 4) { return {error: false, check: false}; } if(_token.slice(0,2) == "{{" || _token.slice(-2) == "}}") { return {error: false, check: true, type: "NATIVE"}; } return {error: false, check: false}; } module.exports = isNative; ================================================ FILE: self/lib/check/isNumber.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isNumber(_token) { var _point = 0; if(NUMBERS.indexOf(_token[0]) > -1 && _token[0] != ".") { for(var v = 0; v < _token.length; v++) { if(NUMBERS.indexOf(_token[v]) < 0) { return {error: true, message: "Bad number", check: false}; } if(_token[v] == ".") { _point++; } if(_point > 1) { return {error: true, message: "Unexpected '.'", check: false}; } } return {error: false, check: true, type: "NUMBER"}; } return {error: false, check: false}; } module.exports = isNumber; ================================================ FILE: self/lib/check/isObjectOperator.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isObjectOperator(_token) { if(OBJECT_OPERATOR.indexOf(_token) < 0) { return {error: false, check: false}; } return {error: false, check: true, type: _token}; } module.exports = isObjectOperator; ================================================ FILE: self/lib/check/isOperator.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isOperator(_token) { if(ALL_TOKEN_LOGIC.indexOf(_token) < 0) { return {error: false, check: false}; } return {error: false, check: true, type: "OPERATOR"}; } module.exports = isOperator; ================================================ FILE: self/lib/check/isSemi.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isSemi(_token) { if(_token != ";") { return {error: false, check: false}; } return {error: false, check: true, type: "SEMI"}; } module.exports = isSemi; ================================================ FILE: self/lib/check/isString.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isString(_token) { if(_token.length < 2) { return {error: false, check: false}; } if(_token[0] != "\"" || _token[ _token.length - 1 ] != "\"") { return {error: false, check: false}; } return {error: false, check: true, type: "STRING"}; } module.exports = isString; ================================================ FILE: self/lib/check/isUnary.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isUnary(_token) { if(UNARY_TOKENS.indexOf(_token) < 0) { return {error: false, check: false}; } return {error: false, check: true, type: "UNARY"}; } module.exports = isUnary; ================================================ FILE: self/lib/check/isVariable.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function isVariable(_token) { if(FIRST_VAR_CHAR.indexOf(_token[0]) < 0) { return {error: false, check: false}; } if(_token == "true" || _token == "false") { return {error: false, check: false}; } for(var v = 0; v < _token.length; v++) { if(FULL_VAR_CHAR.indexOf(_token[v]) < 0) { return {error: true, message: "Bad token in variable name", check: false}; } } return {error: false, check: true, type: "VARIABLE"}; } module.exports = isVariable; ================================================ FILE: self/lib/env.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ global.genRequire = require("./require.js"); global.KEYWORD = ["var", "new", "this", "case", "default", "true", "false", "break", "function", "switch", "for", "do", "while", "in", "if", "else", "null", "Infinity", "NaN", "return", "include", "try", "catch"]; global.RESERVED = ["var", "new", "this", "case", "default", "Prototype", "break", "function", "switch", "for", "do", "while", "in", "if", "else", "null", "true", "false", "argc", "argv", "main", "Object", "Array", "Infinity", "NaN", "include", "try", "catch", "arguments", "return", "address_of", "length_of", "size_of", "type_of", "typeof", "__NERD_Multi_Line_Quote", "require", "exit"]; global.ASSIGNMENT_OPERATOR = ["=", "+=", "-=", "/=", "*="]; global.OBJECT_OPERATOR = [":"]; global.ITERATOR = ["in"]; global.INIT_OPERATOR = ["[]", "{}"]; global.CONDITIONAL_TOKENS = ["==", "<", ">", "<<", ">>", "<=", ">=", "!="]; global.OPERATOR_TOKENS = ["+", "-", "*", "/"]; global.UNARY_TOKENS = ["!"]; global.INCREMENT_TOKENS = ["++", "--"]; global.CONDITIONAL_LOGIC = ["&&", "||"]; global.BOOLEAN_KEYWORD = ["true", "false"]; global.PARENTHESIS_LOGIC = ["(", ")"]; global.DELIMITER = ["(", ")", "{", "}", "[", "]", ",", "."]; global.ALL_TOKEN_LOGIC = CONDITIONAL_TOKENS.concat(OPERATOR_TOKENS, CONDITIONAL_LOGIC); global.NUMBERS = ["0","1","2","3","4","5","6","7","8","9", "."]; global.FIRST_VAR_CHAR = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_"; global.FULL_VAR_CHAR = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789"; global.VALUES = ["NUMBER", "VARIABLE", "STRING", "BOOLEAN", "NULL"]; global.createEnv = function(_path, _file) { var envObject = { REGISTER: [ ["global", "__dirname", "FixedArray", "Array", "Object", "__NERD_THIS", "Prototype"], [], ], FLOW: [], AST: [], LOGICAL_FLOW: [{DO:false, IF:false, FUNCTION:false, MAIN:true, TRY: false}], MAP: [], IN_OBJECT: false, IN_STRING: false, IN_BLOCK_QUOTE: false, IN_NATIVE: false, CURRENT_OBJECT: "", IN_DO: false, IN_IF: false, TOKENS: [], TOKENSMAP: [], SWITCH_MAP: [], POSITION: 0, LINE: 0, CURSOR: 0, FOR: 0, SWITCH: 0, IN_CASE: false, PATH: _path, FILE: _file, flowObject: 0, flowBracket: 0, flowParenthesis: 0, flowAccessor: 0, LAMBDA: {}, }; envObject.REGISTER[0] = envObject.REGISTER[0].concat(COMPILER.ENV.stdlib); return envObject; } global.generateCode = function(_env) { var code = ""; for(var i = 0; i < _env.FLOW.length; i++) { if(_env.AST[i] && _env.AST[i][0] && _env.AST[i][0] == "NATIVE") { code += _env.FLOW[i][0].slice( 2, _env.FLOW[i][0].length - 2); } else { code += _env.FLOW[i].join(" "); code += "\n"; } } return code; } global.parseAST = function(_env) { for(var i = 0; i < _env.FLOW.length; i) { i = verifyFlow(_env.AST[i], _env.FLOW[i], i, _env.FLOW, _env); } } global.error = function(_msg) { console.error(_msg); process.exit(1); } global.nextScope = function(_env) { _env.REGISTER.push([]); _env.LOGICAL_FLOW.push({"DO":false, "IF": false, "FUNCTION":false, MAIN: false, TRY: false}); } global.popScope = function(_env) { _env.REGISTER.pop(); _env.LOGICAL_FLOW.pop(); } global.getLogical = function(_env) { return _env.LOGICAL_FLOW[_env.LOGICAL_FLOW.length - 1]; } global.addLogical = function(_type, _env) { _env.LOGICAL_FLOW[_env.LOGICAL_FLOW.length - 1][_type] = true; } global.removeLogical = function(_type, _env) { _env.LOGICAL_FLOW[_env.LOGICAL_FLOW.length - 1][_type] = false; } global.checkVarExists = function(_name, _env, _flow) { //for(var i = 0; i < _env.REGISTER.length; i++) //{ if(_env.REGISTER[_env.REGISTER.length - 1].indexOf(_name) > -1) { return { error: true, message: `Variable ${_name} already defined` }; } //} return { error: false }; } global.addVar = function(_name, _env) { if(_env.REGISTER[_env.REGISTER.length - 1].indexOf(_name) < 0) { _env.REGISTER[_env.REGISTER.length - 1].push(_name); } } global.varExists = function(_name, _env) { for(var i = 0; i < _env.REGISTER.length; i++) { if(_env.REGISTER[i].indexOf(_name) > -1) { return true; } } return false; } ================================================ FILE: self/lib/include.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var _SEARCH = new RegExp(/['"]!_ffi_include *(.*)['"]/); var _SEARCHCINC = new RegExp(/#include *\"(.*)\"/g); function genInclude(from, src, full) { console.log(from, src, full); if(CLI.cli["--profile"] && CLI.cli["--profile"].argument == "use") { return src; } var _match = src.match(_SEARCH); while(_match) { var _var = "#include \"" + path.resolve(path.join(COMPILER.TMP_FOLDER, _match[1]) + "\""); COMPILER.FFI.push(_var); copyRecursiveSync(path.resolve(path.join(from, _match[1])), path.join(COMPILER.TMP_FOLDER, _match[1])); var _include = fs.readFileSync(path.resolve(path.join(COMPILER.TMP_FOLDER, _match[1]))).toString(); _include = genMetaFunction(_include); _include = genInclude(path.dirname(path.resolve(path.join(from, _match[1]))), _include, path.dirname(path.resolve(path.join(COMPILER.TMP_FOLDER, _match[1])))); fs.writeFileSync(path.resolve(path.join(COMPILER.TMP_FOLDER, _match[1])), _include); src = src.replace(/['"]!_ffi_include *(.*)['"]/, ""); _match = src.match(_SEARCH); } var _cmatch = src.match(_SEARCHCINC); if(_cmatch) { for(var i = 0; i < _cmatch.length; i++) { var _getPath = new RegExp(/#include *\"(.*)\"/g); var _cfile = _getPath.exec(_cmatch[i]); if(_cfile[1]) { var _incFile = path.resolve(path.join(from, _cfile[1])); if(fs.existsSync(_incFile)) { copyRecursiveSync(_incFile, path.join(full, _cfile[1])); var _include = fs.readFileSync(path.resolve(path.join(full, _cfile[1]))).toString(); _include = genMetaFunction(_include); _include = genInclude(path.dirname(path.resolve(path.join(full, _cfile[1]))), _include, path.dirname(path.resolve(path.join(full, _cfile[1])))); fs.writeFileSync(path.resolve(path.join(full, _cfile[1])), _include); _cmatch = src.match(_SEARCHCINC); } } } } return src; } module.exports = genInclude; ================================================ FILE: self/lib/package.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var _SEARCH = new RegExp(/['"]!_package *(.*)['"]/); function genPackage(from, src) { var _match = src.match(_SEARCH); while(_match) { var _target = _match[1].replace(/{__ARCH__}/g, os.arch()); copyRecursiveSync(path.resolve(path.join(from, _target)), path.join(COMPILER.TMP_FOLDER, _target)); COMPILER.PACK.push(path.join(COMPILER.TMP_FOLDER, _target)); src = src.replace(/['"]!_package *(.*)['"]/, ""); _match = src.match(_SEARCH); } return src; } module.exports = genPackage; ================================================ FILE: self/lib/parser.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ //var _env.flowBracket = 0; //var _env.flowObject = 0; //var _env.flowParenthesis = 0; //var _env.flowAccessor = 0; var isNumber = require("./check/isNumber.js"); var isVariable = require("./check/isVariable.js"); var isString = require("./check/isString.js"); var isOperator = require("./check/isOperator.js"); var isUnary = require("./check/isUnary.js"); var isInitOperator = require("./check/isInitOperator.js"); var isObjectOperator = require("./check/isObjectOperator.js"); var isKeyword = require("./check/isKeyword.js"); var isDelimiter = require("./check/isDelimiter.js"); var isIncrement = require("./check/isIncrement.js"); var isAssignment = require("./check/isAssignment.js"); var isSemi = require("./check/isSemi.js"); var isNative = require("./check/isNative.js"); var CHECKERS = [ isSemi, isNumber, isAssignment, isKeyword, isVariable, isString, isDelimiter, isIncrement, isObjectOperator, isOperator, isUnary, isInitOperator, isNative, ]; function incToken(_env) { _env.POSITION++; if(!_env.TOKENS[_env.POSITION]) { _env.TOKENS[_env.POSITION] = []; } if(!_env.TOKENSMAP[_env.POSITION]) { _env.TOKENSMAP[_env.POSITION] = []; } } function decToken(_env) { _env.POSITION--; } function addToken(_code, _env) { if(_code == "\n") return; if(_code.length > 0) { if(!_env.TOKENS[_env.POSITION]) { _env.TOKENS[_env.POSITION] = []; } if(!_env.TOKENSMAP[_env.POSITION]) { _env.TOKENSMAP[_env.POSITION] = []; } _env.TOKENS[_env.POSITION].push(_code); _env.TOKENSMAP[_env.POSITION].push( {line: _env.LINE, position: _env.CURSOR} ); } } var noReduceParenthesis = ["INCLUDE", "FUNCTION", "ACCESSOR", "]", ")", "VARIABLE", "CALL", "IF", "WHILE", "FOR"]; var reduceParenthesis = function(_ast) { for(var i = 0; i < _ast.length; i++) { if(_ast[i-1] && _ast[i-1] == "IF" &&_ast[i] == "(" && _ast[i+1] && _ast[i+1] == "(") { if(_ast[i+3] && _ast[i+3] == ")") { _ast = _ast.slice(0,2).concat([_ast[i+2]]).concat(_ast.slice(5)); reduceParenthesis(_ast); } } else if( (!_ast[i-1] || (_ast[i-1] && noReduceParenthesis.indexOf(_ast[i-1]) < 0) ) && _ast[i] == "(" && _ast[i+2] && _ast[i+2] == ")" ) { _ast = _ast.slice(0,i).concat([_ast[i+1]]).concat(_ast.slice(i+3)); reduceParenthesis(_ast); } } return _ast; } function verifyToken(_token, i, j, map, _env) { var check = {check: false, error: false}; for(var k = 0; k < CHECKERS.length; k++) { check = CHECKERS[k](_token); if(check.error) { error(`[!] ${check.message}: ${_token} line:${map[i][j].line + 1} position:${map[i][j].position}${os.EOL}=> ${array_of_code[map[i][j].line]}`); } else if(check.check) { return check.type; } } if(!check.check) { console.trace(); error(`[!] Unknown token: ${_token} line:${map[i][j].line + 1} position:${map[i][j].position}${os.EOL}=> ${array_of_code[map[i][j].line]}`); } } var GRAMMAR = { "(": [ ["(", "VARIABLE", ","], ["(", "CALL", ","], ], BOOLEAN: [ ["TRUE"], ["FALSE"], ], LITERAL: [ ["NUMBER"], ["STRING"], ["BOOLEAN"], ], OBJECT: [ ["{", "LIST", "}"], ["{", "ASSIGNMENT", "}"], ["{", "LIST", ",", "}"], ["{", "ASSIGNMENT", ",", "}"], ], OBJECT_LIST: [ ["ASSIGNMENT", ",", "ASSIGNMENT"], ["ASSIGNMENT", ",", "OBJECT_LIST"], ["OBJECT_LIST", ",", "ASSIGNMENT"], ["OBJECT_LIST", ",", "OBJECT_LIST"], ], ARRAY: [ ["[", "LIST", "]"], ["[", "LIST", ",", "]"], ["[", "{", "OBJECT_LIST", "}", "]"], ], ACCESSOR: [ ["[", "LITERAL", "]"], ["[", "VARIABLE", "]"], ["[", "EXPRESSION", "]"], ], BREAK: [ ["SEMI", "BREAK"], ], LAMBDA: [ ["FUNCTION", "(", ")", "{", "}"], ["FUNCTION", "(", "LIST", ")", "{", "}"], ], OPERATOR: [ ["OPERATOR", "OPERATOR"] ], VARIABLE: [ ["VAR", "VARIABLE"], ["VARIABLE", ".", "VARIABLE"], ["VARIABLE", "ACCESSOR"], ["CALL", ".", "VARIABLE"], ["VARIABLE", ".", "CALL"], ["UNARY", "VARIABLE"], ["[", "]"], ["THIS"], ["VARIABLE", "INCREMENT"], ["CALL", "ACCESSOR"], ], CALL: [ ["VARIABLE", "(", "CALL", ")"], ["VARIABLE", "(", "VARIABLE", ")"], ["VARIABLE", "(", "LIST", ")"], ["VARIABLE", "(", "EXPRESSION", ")"], ["VARIABLE", "(", "VARIABLE", ")"], ["VARIABLE", "(", "LITERAL", ")"], ["VARIABLE", "(", "OBJECT", ")"], ["VARIABLE", "(", "{", "OBJECT_LIST", "}", ")"], ["VARIABLE", "(", "ARRAY", ")"], ["VARIABLE", "(", ")"], ["CALL", ".", "CALL"], ["VARIABLE", ".", "CALL"], ["UNARY", "CALL"], ["NEW", "CALL"], ], ASSIGNMENT: [ ["VARIABLE", ":", "LITERAL"], ["VARIABLE", ":", "VARIABLE"], ["VARIABLE", ":", "EXPRESSION"], ["VARIABLE", ":", "CALL"], ["VARIABLE", ":", "LAMBDA"], ["VARIABLE", ":", "ARRAY"], ["VARIABLE", ":", "OBJECT"], ["VARIABLE", ":", "{", "}"], ["VARIABLE", ":", "{", "ASSIGNMENT", "}"], ["VARIABLE", ":", "{", "ASSIGNMENT", ",", "}"], ["VARIABLE", ":", "LIST"], ["LITERAL", ":", "LITERAL"], ["LITERAL", ":", "EXPRESSION"], ["LITERAL", ":", "CALL"], ], LIST: [ ["LIST", ",", "{", "OBJECT_LIST", "}"], ["{", "OBJECT_LIST", "}", ",", "LIST}"], ["{", "OBJECT_LIST", "}", ",", "{", "OBJECT_LIST", "}"], ], } var LIST_GEN = [ "LITERAL", "ARRAY", "VARIABLE", "CALL", "LIST", ] var VAR_OPERATOR_GEN = [ "VARIABLE", "LITERAL", "CALL", ] for(var i = 0; i < LIST_GEN.length; i++) { for(var j = 0; j < LIST_GEN.length; j++) { GRAMMAR.LIST.push([LIST_GEN[i], ",", LIST_GEN[j]]); } } for(var i = 0; i < VAR_OPERATOR_GEN.length; i++) { for(var j = 0; j < VAR_OPERATOR_GEN.length; j++) { GRAMMAR.VARIABLE.push([VAR_OPERATOR_GEN[i], "OPERATOR", VAR_OPERATOR_GEN[j]]); } } var VALIDATION = { VARIABLE: [ ["VARIABLE", "SEMI"], ["VARIABLE", "ASSIGNMENT", "LITERAL", "SEMI"], ["VARIABLE", "ASSIGNMENT", "VARIABLE", "SEMI"], ["VARIABLE", "ASSIGNMENT", "ACCESSOR", "SEMI"], ["VARIABLE", "ASSIGNMENT", "OBJECT", "SEMI"], ["VARIABLE", "ASSIGNMENT", "ARRAY", "SEMI"], ["VARIABLE", "ASSIGNMENT", "EXPRESSION", "SEMI"], ["VARIABLE", "ASSIGNMENT", "CALL", "SEMI"], ["VARIABLE", "ASSIGNMENT", "[", "LITERAL", "]", "SEMI"], ["VARIABLE", "ASSIGNMENT", "[", "LIST", "]", "SEMI"], ["VARIABLE", "ASSIGNMENT", "FUNCTION", "(", "LIST", ")", "{"], ["VARIABLE", "ASSIGNMENT", "FUNCTION", "(", "LITERAL", ")", "{"], ["VARIABLE", "ASSIGNMENT", "FUNCTION", "(", "VARIABLE", ")", "{"], ["VARIABLE", "ASSIGNMENT", "FUNCTION", "(", "ARRAY", ")", "{"], ["VARIABLE", "ASSIGNMENT", "FUNCTION", "(", "OBJECT", ")", "{"], ["VARIABLE", "ASSIGNMENT", "FUNCTION", "(", ")", "{"], ["VARIABLE", "ASSIGNMENT", "{", "OBJECT_LIST", "}", "SEMI"], ["VARIABLE", "ASSIGNMENT", "{", "OBJECT_LIST", ",", "}", "SEMI"], ["VARIABLE", "ASSIGNMENT", "{", "}", "SEMI"], ], ASSIGNMENT: [ ["ASSIGNMENT", "SEMI"], ["ASSIGNMENT", "{"], ], EXPRESSION: [ ["EXPRESSION", "SEMI"], ], WHILE: [ [ "WHILE", "(", "LITERAL", ")", "{" ], [ "WHILE", "(", "VARIABLE", ")", "{" ], [ "WHILE", "(", "EXPRESSION", ")", "{" ], [ "WHILE", "(", "LITERAL", ")", "SEMI" ], [ "WHILE", "(", "VARIABLE", ")", "SEMI" ], [ "WHILE", "(", "EXPRESSION", ")", "SEMI" ], ], SWITCH: [ ["SWITCH", "(", "VARIABLE", ")", "{"], ["SWITCH", "(", "EXPRESSION", ")", "{"], ["SWITCH", "(", "LITERAL", ")", "{"], ["SWITCH", "(", "CALL", ")", "{"], ], CASE: [ ["CASE", "LITERAL", ":"], ["CASE", "VARIABLE", ":"], ["CASE", "EXPRESSION", ":"], ["CASE", "CALL", ":"], ], DEFAULT: [ ["DEFAULT", ":"], ], DO: [ [ "DO", "{" ], ], IF: [ [ "IF", "(", "LITERAL", ")", "{" ], [ "IF", "(", "VARIABLE", ")", "{" ], [ "IF", "(", "EXPRESSION", ")", "{" ], [ "IF", "(", "CALL", ")", "{" ], [ "IF", "(", "LITERAL", ")", "ASSIGNMENT", "SEMI" ], [ "IF", "(", "VARIABLE", ")", "ASSIGNMENT", "SEMI" ], [ "IF", "(", "VARIABLE", ")", "VARIABLE", "SEMI" ], [ "IF", "(", "VARIABLE", ")", "RETURN", "SEMI" ], [ "IF", "(", "EXPRESSION", ")", "ASSIGNMENT", "SEMI" ], [ "IF", "(", "CALL", ")", "ASSIGNMENT", "SEMI" ], [ "IF", "(", "CALL", ")", "CALL", "SEMI" ], [ "IF", "(", "VARIABLE", ")", "CALL", "SEMI" ], [ "IF", "(", "EXPRESSION", ")", "CALL", "SEMI" ], [ "IF", "(", "EXPRESSION", ")", "RETURN", "SEMI" ], [ "IF", "(", "VARIABLE", ")", "VARIABLE", "ASSIGNMENT", "LITERAL", "SEMI" ], [ "IF", "(", "VARIABLE", ")", "VARIABLE", "ASSIGNMENT", "VARIABLE", "SEMI" ], [ "IF", "(", "VARIABLE", ")", "VARIABLE", "ASSIGNMENT", "CALL", "SEMI" ], [ "IF", "(", "EXPRESSION", ")", "VARIABLE", "ASSIGNMENT", "STRING", "SEMI" ], [ "IF", "(", "EXPRESSION", ")", "VARIABLE", "ASSIGNMENT", "VARIABLE", "SEMI" ], [ "IF", "(", "EXPRESSION", ")", "VARIABLE", "ASSIGNMENT", "CALL", "SEMI" ], [ "IF", "(", "EXPRESSION", ")", "VARIABLE", "ASSIGNMENT", "EXPRESSION", "SEMI" ], ], ELSE: [ [ "ELSE", "IF", "(", "LITERAL", ")", "{" ], [ "ELSE", "IF", "(", "VARIABLE", ")", "{" ], [ "ELSE", "IF", "(", "EXPRESSION", ")", "{" ], [ "ELSE", "IF", "(", "CALL", ")", "{" ], [ "ELSE", "IF", "(", "LITERAL", ")", "ASSIGNMENT", "SEMI" ], [ "ELSE", "IF", "(", "VARIABLE", ")", "ASSIGNMENT", "SEMI" ], [ "ELSE", "IF", "(", "EXPRESSION", ")", "ASSIGNMENT", "SEMI" ], [ "ELSE", "IF", "(", "EXPRESSION", ")", "VARIABLE", "EXPRESSION", "SEMI" ], [ "ELSE", "IF", "(", "CALL", ")", "ASSIGNMENT", "SEMI" ], [ "ELSE", "IF", "(", "CALL", ")", "CALL", "SEMI" ], [ "ELSE", "IF", "(", "VARIABLE", ")", "CALL", "SEMI" ], [ "ELSE", "IF", "(", "VARIABLE", ")", "VARIABLE", "ASSIGNMENT", "LITERAL", "SEMI" ], [ "ELSE", "IF", "(", "VARIABLE", ")", "VARIABLE", "ASSIGNMENT", "VARIABLE", "SEMI" ], [ "ELSE", "IF", "(", "EXPRESSION", ")", "VARIABLE", "ASSIGNMENT", "VARIABLE", "SEMI" ], [ "ELSE", "IF", "(", "EXPRESSION", ")", "VARIABLE", "ASSIGNMENT", "LITERAL", "SEMI" ], [ "ELSE", "{" ], [ "ELSE", "TRY", "{" ], [ "ELSE", "VARIABLE", "SEMI" ], [ "ELSE", "ASSIGNMENT", "SEMI" ], [ "ELSE", "CALL", "SEMI" ], [ "ELSE", "VARIABLE", "ASSIGNMENT", "VARIABLE", "SEMI" ], [ "ELSE", "VARIABLE", "ASSIGNMENT", "CALL", "SEMI" ], [ "ELSE", "VARIABLE", "EXPRESSION", "SEMI" ], ], FOR: [ ["FOR", "(", "VARIABLE", "ASSIGNMENT", "LITERAL", "SEMI", "VARIABLE", "SEMI", "VARIABLE", ")", "{"], ["FOR", "(", "VARIABLE", "ASSIGNMENT", "LITERAL", "SEMI", "CALL", "SEMI", "VARIABLE", ")", "{"], ["FOR", "(", "VARIABLE", "ASSIGNMENT", "VARIABLE", "SEMI", "VARIABLE", "SEMI", "VARIABLE", ")", "{"], ["FOR", "(", "VARIABLE", "ASSIGNMENT", "VARIABLE", "SEMI", "CALL", "SEMI", "VARIABLE", ")", "{"], ["FOR", "(", "VARIABLE", "ASSIGNMENT", "LITERAL", "SEMI", "VARIABLE", "SEMI", "EXPRESSION", ")", "{"], ["FOR", "(", "VARIABLE", "ASSIGNMENT", "VARIABLE", "SEMI", "VARIABLE", "SEMI", "EXPRESSION", ")", "{"], ["FOR", "(", "VARIABLE", "ASSIGNMENT", "LITERAL", "SEMI", "EXPRESSION", "SEMI", "VARIABLE", ")", "{"], ["FOR", "(", "VARIABLE", "ASSIGNMENT", "VARIABLE", "SEMI", "EXPRESSION", "SEMI", "VARIABLE", ")", "{"], ["FOR", "(", "VARIABLE", "ASSIGNMENT", "LITERAL", "SEMI", "EXPRESSION", "SEMI", "EXPRESSION", ")", "{"], ["FOR", "(", "VARIABLE", "ASSIGNMENT", "VARIABLE", "SEMI", "EXPRESSION", "SEMI", "EXPRESSION", ")", "{"], ["FOR", "(", "VARIABLE", "SEMI", "EXPRESSION", "SEMI", "EXPRESSION", ")", "{"], ["FOR", "(", "VARIABLE", "IN", "VARIABLE", ")", "{"], ], FUNCTION: [ ["FUNCTION", "CALL", "{"], ], CALL: [ ["CALL", "SEMI"], ], INCLUDE: [ ["INCLUDE", "(", "LITERAL", ")", "SEMI"], ], DEFINE: [ ["DEFINE", "(", "STRING", ")", "SEMI"], ], RETURN: [ ["RETURN", "LITERAL", "SEMI"], ["RETURN", "SEMI"], ["RETURN", "VARIABLE", "SEMI"], ["RETURN", "EXPRESSION", "SEMI"], ["RETURN", "CALL", "SEMI"], ["RETURN", "OBJECT", "SEMI"], ["RETURN", "OBJECT", ",", "SEMI"], ["RETURN", "{", "ASSIGNMENT", ",", "}", "SEMI"], ["RETURN", "{", "ASSIGNMENT", "}", "SEMI"], ["RETURN", "{", "OBJECT_LIST", ",", "}", "SEMI"], ["RETURN", "{", "OBJECT_LIST","}", "SEMI"], ], TRY: [ ["TRY", "{"], ], CATCH: [ ["CATCH", "(", "VARIABLE", ")", "{"], ], "NATIVE": [ ["NATIVE"], ], "{": [ ["{"], ], "}": [ ["}"], ["}", "SEMI"], ], BREAK: [ ["BREAK"], ["BREAK", "SEMI"], ], SEMI: [ ["SEMI"], ] } function checkExpression(_ast, _flow, _arr) { var _startAst = 0; var _endAst = 0; var _match = false; var _newAst = []; for(var g = 0; g < Object.keys(_arr).length; g++) { var _grammarName = Object.keys(_arr)[g]; var _grammar = _arr[_grammarName]; for(var t = 0; t < _grammar.length; t++) { for(var i = 0; i < _ast.length ; i++) { _startAst = 0; _endAst = 0; _match = false; if(_ast[i] == _grammar[t][0]) { _match = true; _startAst = i; _endAst = i; for(var m = 0; m < _grammar[t].length; m++) { if(!_ast[i + m]) { _match = false; break } else if( _ast[i + m] == _grammar[t][m]) { _endAst++; } else { _match = false; break; } } if(_match) { _newAst = _ast.slice(0, _startAst); _newAst.push( _grammarName ); _newAst = _newAst.concat( _ast.slice( _endAst )); _ast = _newAst; _ast = reduceParenthesis(_ast); return checkExpression(_ast, _flow, _arr); } } } } } return _ast; } function checkSyntax(_ast, _flow, _scope, _env) { if(_ast.length < 1) { return; } if(VALIDATION[_ast[0]]) { var _check = VALIDATION[_ast[0]]; var _good = true; for(var c = 0; c < _check.length; c++) { _good = true; for(var t = 0; t < _ast.length; t++) { if(!_check[c][t] || _ast[t] != _check[c][t]) { _good = false; break; } } if(_good) { break; } } if(!_good) { var _debug = "\n"; if(global.DEBUG) { _debug += _ast.join(" "); } error(`[!] Unexpected token: line: ${_scope[0].line + 1} in ${_env.FILE}\n${_flow.join(" ")}${_debug}`); } } else { var _debug = "\n"; if(global.DEBUG) { _debug += _ast.join(" "); } error(`[!] Unexpected token: line: ${_scope[0].line + 1} position: 0 in ${_env.FILE}\n${_flow.join(" ")}${_debug}`); } } function addFlow(_env) { if(_env.TOKENS.length > 0 && _env.TOKENS[0]) { var _ast = []; for(var i = 0; i < _env.TOKENS.length; i++) { _ast[i] = []; for(var j = 0; j < _env.TOKENS[i].length; j++) { _ast[i][j] = verifyToken(_env.TOKENS[i][j], i, j, _env.TOKENSMAP, _env); } _ast[i] = checkExpression(_ast[i], _env.TOKENS[i], GRAMMAR); //_ast[i] = checkExpression(_ast[i], _env.TOKENS[i], ASSIGN); //_ast[i] = checkExpression(_ast[i], _env.TOKENS[i], SECOND); checkSyntax(_ast[i], _env.TOKENS[i], _env.TOKENSMAP[i], _env); } _env.FLOW = _env.FLOW.concat(_env.TOKENS); _env.MAP = _env.MAP.concat(_env.TOKENSMAP); _env.AST = _env.AST.concat(_ast); } _env.TOKENS = []; _env.TOKENSMAP = []; _env.POSITION = 0; } function findNextLine(_code, _from, _env) { for(var i = _from; i < _code.length; i++) { if(_code[i] == "\r" && _code[i+1] && _code[i+1] == "\n") { _env.LINE++; _env.CURSOR = 0; return i+2; } else if(_code[i] == "\n") { _env.LINE++; _env.CURSOR = 0; return i+1; } } // ERROR return _code.length - 1; } function findEndComment(_code, _from, _env) { for(var i = _from; i < _code.length; i++) { if(_code[i] == "\n") { _env.LINE++; _env.CURSOR = 0; } else if(_code[i] == "\r" && _code[i + 1] && _code[i + 1] == "\n") { _env.LINE++; _env.CURSOR = 0; i++; } else if(_code[i] == "*" && _code[i+1] && _code[i+1] == "/") { return i+2; } _env.CURSOR++; } // ERROR return _code.length - 1; } function setFor(_current, _env) { if(_current == "for" && _env.FOR == 0) { _env.FOR = 2; } } function setSwitch(_current, _env) { if(_current == "switch") { _env.SWITCH ++; } } function setCase(_current, _env) { if(_current == "case") { if(_env.SWITCH > 0) { _env.IN_CASE = true; } else { error(`'case' keyworkds require to be in a switch statement`); } } } function unsetCase(_current, _env) { if(_current == "break") { if(_env.IN_CASE == true) { _env.IN_CASE = false; } } } function parseCode(_code, _from, _env) { var _current = ""; _env.POSITION = 0; for(var i = _from; i < _code.length; i++) { var _tokens = _env.TOKENS[_env.TOKENS.length - 1]; var _before; if(_tokens && _tokens[_tokens.length - 1]) { _before = _tokens[_tokens.length - 1]; } switch(_code[i]) { case " ": if(!_env.IN_STRING && !_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE) { setFor(_current, _env); setSwitch(_current, _env); addToken(_current, _env); _current = ""; } else { _current += _code[i]; } break; case "\t": if(!_env.IN_STRING && !_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE) { setFor(_current, _env); setSwitch(_current, _env); addToken(_current, _env); _current = ""; } else if(_env.IN_STRING || _env.IN_NATIVE) { _current += _code[i]; } else if(_env.IN_BLOCK_QUOTE) { _current += "\\t"; } break; case "\n": if(!_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE) { _env.LINE++; _env.CURSOR = 0; addToken(_current, _env); _current = ""; } else if(_env.IN_NATIVE) { _current += _code[i]; } else { _current += "\\n"; } break; case "\r": if(!_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE) { _env.LINE++; _env.CURSOR = 0; if(_code[i+1] && _code[i+1] == "\n") { addToken(_current, _env); _current = ""; i++ break; } } else if(_env.IN_NATIVE) { _current += _code[i]; } else { _current += "\\r"; } break; case "\\": if(_env.IN_BLOCK_QUOTE) { _current += "\\\\"; } _current += "\\"; break; case "\"": if(_env.IN_STRING && !_env.IN_NATIVE) { _env.IN_STRING = false; } else if(!_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE) { _env.IN_STRING = true; } if(_env.IN_BLOCK_QUOTE) { _current += "\\\""; } else { _current += _code[i]; } break; case "`": if(_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE) { _env.IN_BLOCK_QUOTE = false; addToken(_current + "\"", _env); _current = ""; } else if(!_env.IN_STRING && !_env.IN_NATIVE) { _env.IN_BLOCK_QUOTE = true; addToken(_current, _env); _current = "\""; for(var q = i+1; q < _code.length; q++) { if(_code[q] == "`") { break; } if(_code[q] == "$" && _code[q+1] == "{") { for(var end = q; end < _code.length; end++) { if(_code[end] == "}") { _code[q] = "\""; _code[q+1] = "+"; _code = _code.slice(0, q) + "` + " + _code.slice(q+2, end) + " + `" + _code.slice(end+1); break; } } } } } else _current += _code[i]; break; case "/": if(!_env.IN_STRING && !_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE) { if(_code[i+1]) { if(_code[i + 1] && _code[i + 1] == "=") { // /= addToken(_code[i] + _code[i + 1], _env); i++; } else if(_code[i+1] == "/") { addToken(_current, _env); addFlow(_env); _current = ""; parseCode(_code, findNextLine(_code, i, _env), _env); return; } else if(_code[i+1] == "*") { addToken(_current, _env); addFlow(_env); _current = ""; i = parseCode(_code, findEndComment(_code, i, _env), _env); return; } else { addToken(_current, _env); addToken(_code[i], _env); _current = ""; } } } else { _current += _code[i]; } break; case "0": case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": _current += _code[i]; break; case "{": case "}": if(!_env.IN_STRING && !_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE) { if(_code[i] == "{" && _code[i + 1] && _code[i + 1] == _code[i]) { _env.IN_NATIVE = true; addToken(_current, _env); _current = "{{"; i++; } else if(_code[i] == "{" && _code[i + 1] && _code[i + 1] != "}" && _code[i - 1] && (_code[i - 1] == "=" || _code[i - 1] == "," || _code[i - 1] == "return")) { // obj _env.flowObject++; _current += "{"; } else if(_code[i] == "{" && _code[i + 1] && _code[i + 1] != "}" && (_before == "=" || _before == "," || _before == "return" || _before == "(")) { // obj _env.flowObject++; _current += "{"; addToken(_current, _env), _current = ""; } else if(_code[i] == "{" && _before && _before == ")") { // function() = {}; or catch(e){} addToken(_current, _env); if(_code[i+1] == "}") { addToken("{", _env); if(_env.flowObject < 1) { incToken(_env); } addToken("}", _env); addFlow(_env); i++; } else { addToken(_code[i], _env); if(_env.flowObject < 1) { incToken(_env); } _env.flowBracket++; } _current = ""; } else if(_code[i] == "{" && _code[i + 1] && _code[i + 1] == "}" && _env.flowObject < 1) { // obj addToken(_current, _env); addToken("{", _env); addToken("}", _env); i++; _current = ""; } else { if(_code[i] == "{") { if(_env.flowObject < 1) { addToken(_current, _env); addToken(_code[i], _env); incToken(_env); _env.flowBracket++; _current+= ""; } else { addToken(_current, _env); addToken("{", _env); _env.flowObject++; //_current += _code[i]; _current = ""; } } else { if(_env.flowObject > 0 || _env.flowAccessor > 0 ) { //_current += _code[i]; addToken(_current, _env); addToken("}", _env); //addFlow(_env); _env.flowObject--; _current = ""; } else { if(_env.SWITCH > 0) { _env.SWITCH--; } //_current += "}"; addToken(_current, _env); addToken("}", _env); addFlow(_env); //incToken(_env); _env.flowBracket--; _current = ""; } } } } else if(_env.IN_NATIVE && _code[i] == "}" && _code[i + 1] && _code[i + 1] == _code[i]) { _env.IN_NATIVE = false; _current += "}}"; addToken(_current, _env); addFlow(_env); _current = ""; i++; } else { _current += _code[i]; } break; case "[": case "]": case "(": case ")": if(!_env.IN_STRING && !_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE) { if(_code[i] == "(") { setFor(_current, _env); setSwitch(_current, _env); _env.flowParenthesis++; } else if(_code[i] == ")") { _env.flowParenthesis--; } else if(_code[i] == "[") { _env.flowAccessor++; } else if(_code[i] == "]") { _env.flowAccessor--; } addToken(_current, _env); addToken(_code[i], _env); _current = ""; } else { _current += _code[i]; } break; case ";": if(!_env.IN_STRING && !_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE) { addToken(_current, _env); addToken(";", _env); _current = ""; if(_env.FOR == 0) { addFlow(_env); } else { _env.FOR--; } } else { _current += _code[i]; } break; case ":": if(!_env.IN_STRING && !_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE && _env.SWITCH == 0) { addToken(_current, _env); addToken(":", _env); _current = ""; } else if(!_env.IN_STRING && !_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE && _env.SWITCH > 0) { addToken(_current, _env); addToken(":", _env); _current = ""; addFlow(_env); } else { _current += _code[i]; } break; case ",": if(!_env.IN_STRING && !_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE) { addToken(_current, _env); addToken(",", _env); _current = ""; } else { _current += _code[i]; } break; case "!": case "+": case "-": if(!_env.IN_STRING && !_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE) { addToken(_current, _env); if(_code[i + 1] && _code[i + 1] == _code[i]) { addToken(_code[i] + _code[i + 1], _env); i++; } else if(_code[i + 1] && _code[i + 1] == "=") { // += -= addToken(_code[i] + _code[i + 1], _env); i++; } else { addToken(_code[i], _env); } _current = ""; } else { _current += _code[i]; } break; case "*": case ".": if(!_env.IN_STRING && !_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE) { var _number = isNumber(_current); if(_number.check) { _current += _code[i]; } else { addToken(_current, _env); addToken(_code[i], _env); _current = ""; } } else { _current += _code[i]; } break; default: _current += _code[i]; var _currentScope = []; if(_env.TOKENS.length > 0) { _currentScope = _env.TOKENS[_env.TOKENS.length - 1]; } var _lastToken; if(_currentScope.length > 0) { _currentScope = _currentScope[_currentScope.length - 1]; } if(_current == "in" && _code[i+1] == " ") { _env.FOR = 0; } if(!_env.IN_STRING && !_env.IN_BLOCK_QUOTE && !_env.IN_NATIVE && _current == "function" && (_currentScope == ":" || _currentScope == "," || _currentScope == "[")) { var _functionID = "__NERD_LAMBDA_FUNC_" + Math.random().toString(36).slice(2, 12); var _bracketState = 0; var _end = -1; for(var b = i; b < _code.length; b++) { if(_code[b] == "{") { _bracketState++; } else if(_code[b] == "}") { _bracketState--; if(_bracketState == 0) { _end = b+1; break; } } } var bodyLambda = "var " + _functionID + " = " + _code.substring(i-8, _end); _current = ""; _code = _code.substring(0, i+1) + _functionID + _code.substring(_end); var _tmpEnv = createEnv(); _tmpEnv.REGISTER = _tmpEnv.REGISTER.concat(_env.REGISTER); var _tmpFn = parseCode(bodyLambda, 0, _tmpEnv); _env.LAMBDA[_functionID] = { code: bodyLambda, env: _tmpEnv }; } break; } _env.CURSOR++; } addFlow(_env); if(_current.length > 0 && i == _code.length) { error("[!] untermined instruction"); } if(_env.flowBracket < 0) { error("[!] Missing opening bracket {"); } else if(_env.flowBracket > 0) { error("[!] Missing closing bracket }"); } if(_env.flowObject < 0) { error("[!] Missing opening bracket {"); } else if(_env.flowObject > 0) { error("[!] Missing closing bracket }"); } if(_env.flowParenthesis < 0) { error("[!] Missing opening parenthesis ("); } else if(_env.flowParenthesis > 0) { error("[!] Missing closing parenthesis )"); } if(_env.flowAccessor < 0) { error("[!] Missing opening accessor ["); } else if(_env.flowAccessor > 0) { error("[!] Missing closing accessor ]"); } if(_env.IN_NATIVE) { error("[!] Missing closing native block }} ]"); } if(_env.IN_STRING) { error("[!] Missing closing string \" }} ]"); } if(_env.IN_BLOCK_QUOTE) { error("[!] Missing closing block quote ` }} ]"); } } module.exports = parseCode; ================================================ FILE: self/lib/require.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module.exports = genRequire; var fs = require("fs"); var CACHE = {}; function showModuleComment(_obj, _name) { if(Array.isArray(_obj)) { for(var l = 0; l < _obj.length; l++ ) { console.log("[*] " + _name + ": " + _obj[l]); } } else if(typeof(_obj) == "string") { console.log("[*] " + _name + ": " + _obj); } else if(typeof(_obj) == "object") { var _platform; if(_obj[PLATFORM]) _platform = PLATFORM; else if(_obj["default"]) _platform = "default"; if(_obj[_platform] && typeof(_obj[_platform]) == "object") { var currentCompiler = COMPILER.COMPILER.split(" ")[0]; var _compiler; if(_obj[_platform][currentCompiler]) _compiler = currentCompiler; else if(_obj[_platform]["default"]) _compiler = "default"; if(_obj[_platform][_compiler]) showModuleComment(_obj[_platform][_compiler], _name); } else if(_obj[_platform]) showModuleComment(_obj[_platform], _name); } } function addModuleLib(_lib, modSource) { if(Array.isArray(_lib)) { for(var l = 0; l < _lib.length; l++ ) { COMPILER.LIBS += _lib[l].replace(/{__MODULE__}/g, path.resolve(modSource)).replace(/{__ARCH__}/g, os.arch()).replace(/{__EXTERN__}/g, extern) + " "; } } else if(typeof(_lib) == "string") { COMPILER.LIBS += _lib.replace(/{__MODULE__}/g, modSource).replace(/{__ARCH__}/g, os.arch()).replace(/{__EXTERN__}/g, extern) + " "; } else if(typeof(_lib) == "object") { var _platform; if(_lib[PLATFORM]) _platform = PLATFORM; else if(_lib["default"]) _platform = "default"; if(_lib[_platform] && Array.isArray(_lib[_platform])) { addModuleLib(_lib[_platform], modSource); } if(_lib[_platform] && typeof(_lib[_platform]) == "object") { var currentCompiler = COMPILER.COMPILER.split(" ")[0]; var _compiler; if(_lib[_platform][currentCompiler]) _compiler = currentCompiler; else if(_lib[_platform]["default"]) _compiler = "default"; if(_lib[_platform][_compiler]) addModuleLib(_lib[_platform][_compiler], modSource); } else if(_lib[_platform]) addModuleLib(_lib[_platform], modSource); } } function genRequire(from, addSource, _env, _name) { var modSource = ""; var fileSource; if(COMPILER.DIR.length > 0) { from = COMPILER.DIR[COMPILER.DIR.length - 1]; } if(addSource.indexOf(from) > -1) { modSource = addSource; } else { modSource = path.join(from + addSource); } COMPILER.DIR.push(__dirname + "/"); var trySource = [modSource, modSource + "/" + "index.ng", from + "nerd_modules/" + addSource + "/index.ng", NERD_PATH + "/nerd_modules/" + addSource + "/index.ng", modSource + ".ng", modSource, ]; var newSrc = ""; for(var i = 0; i < trySource.length; i++) { try { modSource = path.dirname(trySource[i]) + "/"; newSrc = fs.readFileSync(trySource[i]).toString(); if(CLI.cli["--env"] && CLI.cli["--env"].argument == "js" && addSource != "Module") { newSrc = `var module = require("Module");` + newSrc; } if(CACHE[addSource]) { COMPILER.DIR.pop(); return {add: false, module: CACHE[addSource], code: ""} } fileSource = trySource[i]; var pkgPath = path.join(modSource, "package.json"); var pkgObject; if(fs.existsSync(pkgPath)) { var pkg = fs.readFileSync(pkgPath); try { pkg = JSON.parse(pkg); pkgObject = pkg; if(pkg.nerd) { if(pkg.nerd.message) { showModuleComment(pkg.nerd.message, pkg.name); } if(pkg.nerd.env) { if(pkg.nerd.env.indexOf(COMPILER.ENV.name) < 0) { console.error("Nerd:\n\n[!] module " + addSource + " doesn't support env : " + COMPILER.ENV.name + " only these : " + pkg.nerd.env); process.exit(1); } } if(pkg.nerd.target) { if(!COMPILER.TARGET) { console.error("Nerd:\n\n[!] module " + addSource + " require one of these targets : " + pkg.nerd.target + ". None specified"); process.exit(1); } else if(pkg.nerd.target.indexOf(COMPILER.TARGET) < 0) { console.error("Nerd:\n\n[!] module " + addSource + " require one of these targets : " + pkg.nerd.target + ". " + COMPILER.TARGET + " specified"); process.exit(1); } } /* if(pkg.nerd.expose) { COMPILER.EXPOSE = COMPILER.EXPOSE.concat(pkg.nerd.expose); COMPILER.GLOBAL = COMPILER.GLOBAL.concat(pkg.nerd.expose); } */ if(pkg.nerd.lib) { addModuleLib(pkg.nerd.lib, modSource); } } } catch(e) { console.log("Nerd:\n[!] " + e + " -> " + pkgPath.split("/").splice(-3).join("/")) } } break; } catch (e) {} } var ext = "nd"; if(fileSource && fileSource.split) { var _Ext = fileSource.split("."); if(_Ext.length > 1) ext = _Ext[_Ext.length - 1]; var _newEnv = createEnv(modSource); parseCode(newSrc, 0, _newEnv); parseAST(_newEnv); var _generated = generateCode(_newEnv); var reqFN = "__MODULE_" + Math.random().toString(36).substr(2, 10); addVar(reqFN, _env); //CACHE[addSource] = reqFN + "(" + _name + ")"; CACHE[addSource] = reqFN + "(__NERD_THIS)"; newSrc = "NerdCore::Global::var " + reqFN + " = NerdCore::VAR(NerdCore::Enum::Type::Function, new NerdCore::Type::function_t([&](NerdCore::VAR& __NERD_THIS, NerdCore::VAR* __NERD_VARARGS, int __NERD_VARLENGTH, void* __NERD_PTR = nullptr) mutable{\n"; newSrc += _generated; newSrc += "return NerdCore::Global::null;\n}));"; COMPILER.REQUIRE += newSrc + ";" COMPILER.DIR.pop(); //return {add: true, module: reqFN + "(" + _name + ")", code: newSrc} return {add: true, module: reqFN + "(__NERD_THIS)", code: newSrc} } else { error("[!] module unknown: " + addSource); } } ================================================ FILE: self/lib/verify.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var isVariable = require("./check/isVariable.js"); var isNumber = require("./check/isNumber.js"); var isString = require("./check/isString.js"); var isBoolean = require("./check/isBoolean.js"); function verifyExpression(_exp, _inst, _env) { for(var i = 0; i < _env.FLOW[_inst].length; i++) { if(_env.FLOW[_inst][i] == "new") { _env.FLOW[_inst][i] = ""; _env.FLOW[_inst][i+1] = "((NerdCore::Class::Function*)" + _env.FLOW[_inst][i+1] + ".data.ptr)->New" } } for(var z = 0; z < _exp.length; z++) { if(RESERVED.indexOf(_exp[z]) < 0 && BOOLEAN_KEYWORD.indexOf(_exp[z]) < 0 && isVariable(_exp[z]).check) { if( (!_exp[ z - 1] || _exp[ z - 1] != ".") && !varExists(_exp[z], _env)) { error(`[!] Unknown variable: ${_exp[z]} line:${_env.MAP[_inst][z].line + 1} position:${_env.MAP[_inst][z].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][z].line]}`); } } if(_exp[z] == "__NERD_Multi_Line_Quote") { _env.FLOW[_inst][z + 2] = _exp[z + 2].slice(1, _exp[z + 2].length - 1) } } } function checkLogicalState(_token, _next, _env, _ast) { var _logicalState = getLogical(_env); if(_logicalState.DO) { if(_token == "}") { if(_next != "WHILE") { return { error: true, message: "Unexpected token, waiting for while"}; } } else if(_token == "WHILE") { return { error: false }; } else { return { error: true, message: "Unexpected token, waiting for while"}; } } if(_logicalState.TRY) { if(_token == "}") { if(_next != "CATCH") { return { error: true, message: "Unexpected token, waiting for catch"}; } } else if(_token == "CATCH") { return { error: false }; } else { return { error: true, message: "Unexpected token, waiting for catch"}; } } if(_logicalState.FUNCTION) { if(_token == "}") { if(_ast && _ast[1] && (_ast[1] == "SEMI" || _ast[1] == ";")) { //good } else if(_next && (_next == "SEMI" || _next == ";")) { // good } else { //return { error: true, message: "Unexpected token, waiting for ';' after "}; } } } return { error: false }; } function getFunctionThis(_flow, param, _env, _inst) { var _end = -1; for(var i = 0; i < _flow.length; i++) { if(_flow[i] == "[") { _end = i; } else if(_flow[i] == "(") { break; } } return _end; } function getFunctionArgs(_flow, param, _env, _inst, _call) { var _return = {}; var _this = getFunctionThis(_flow, param, _env, _inst); _return["this"] = "__NERD_THIS"; if(_this > 0) { _return["this"] = _flow.slice(0, _this).join(" "); } var _parenthesis = 0; _return["args"] = []; for(var i = 0; i < _flow.length; i++) { if(_flow[i] == "(") _parenthesis++; else if(_flow[i] == ")") _parenthesis--; else if(_parenthesis > 0) { if(_flow[i][0] == '\"') { _return["args"].push(_flow[i]); } else if(_flow[i] == "new" && _flow[i+1]) { var _end = 0; var _argP = 0; for(var j = i; j < _flow.length; j++) { if(_flow[j] == "(") { _argP++; } else if(_flow[j] == ")") { _argP--; if(_argP == 0) { _end = j + 1; break; } } } _new = "__NERD_FUNCTION(" + _flow[i+1] + ")->New" + _flow.slice(i + 2, _end).join(" "); _env.FLOW[_inst] = _flow.slice(0, i).concat(_new, ..._flow.slice(_end)); } else if(param && varExists(_flow[i], _env)) { _return["args"].push(_flow[i]); } else if(!param) { _return["args"].push(_flow[i]); } } else if(_parenthesis < 0) { break; } } return _return; } function forgeArray(_var, _flow, _start, _inst, _env, _nested) { if(!_nested) { _env.FLOW[_inst][_start - 1] = "new NerdCore::Class::Array()"; _env.FLOW[_inst] = _env.FLOW[_inst].slice(0, _start); _env.FLOW[_inst].push(";"); } if(_flow[_start] != "]" ) { var a = 0; for(var i = _start; i < _flow.length - 1; i+=2) { if(_flow[i] == "[" && _flow[i + 1] == "]") { _env.FLOW[_inst].push(_var + "[" + a + "]"); _env.FLOW[_inst].push("="); _env.FLOW[_inst].push("new NerdCore::Class::Array()"); _env.FLOW[_inst].push(";"); } else if(_flow[i] == "{") { var _end = -1; var _objBracket = 0; for(var k = i; k < _flow.length; k++) { if(_flow[k] == "{") { _objBracket++; } else if(_flow[k] == "}") { _objBracket--; if(_objBracket == 0) { _end = k; break; } } } _env.FLOW[_inst].push(_var + "[" + a + "]"); _env.FLOW[_inst].push("="); _env.FLOW[_inst] = _env.FLOW[_inst].concat(_flow.slice(i, _end)); forgeObject(_var + "[" + a + "]", _flow, i+6, _inst, _env); i = _end; // we jump to the end of this object } else if(_flow[i] == "[") { _env.FLOW[_inst].push(_var + "[" + a + "]"); _env.FLOW[_inst].push("="); _env.FLOW[_inst].push("new NerdCore::Class::Array()"); _env.FLOW[_inst].push(";"); forgeArray( _var + "[" + a + "]", _flow, i+1, _inst, _env, true) var _endArrayIndex = -1; var _indArr = 1; for(var z = i+1; z < _flow.length; z++) { if(_flow[z] == "[") { _indArr++; } else if(_flow[z] == "]") { _indArr--; if(_indArr == 0) { _endArrayIndex = z; break; } } } if(_endArrayIndex > -1) { i += _endArrayIndex; } } else if(_flow[i] != "]" && _flow[i] != ",") { if(_env.LAMBDA[_flow[i]]) { var _l = _env.LAMBDA[_flow[i]]; for(var k = 0; k < _l.env.FLOW.length; k) { k = verifyFlow(_l.env.AST[k], _l.env.FLOW[k], k, _l.env.FLOW, _l.env); } for(var j = 0; j < _l.env.FLOW.length; j++) { _env.FLOW[_inst].push( _l.env.FLOW[j].join(" ") ); } } else if(isVariable(_flow[i]).check) { if(!varExists(_flow[i], _env)) { error(`[!] Variable or token undefined: ${_flow[i]} line:${_env.MAP[_inst][i].line + 1} position:${_env.MAP[_inst][i].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][i].line]}`); } } _env.FLOW[_inst].push(_var + "[" + a + "]"); _env.FLOW[_inst].push("="); _env.FLOW[_inst].push(_flow[i]); _env.FLOW[_inst].push(";"); } a++; } } } function forgeObject(_var, _flow, _start, _inst, _env) { if(typeof _var != "object") { _var = [_var]; } var newFlow = _env.FLOW[_inst].slice(0, _start - 1); newFlow.push("((NerdCore::Class::Function*)Object.data.ptr)->New()"); newFlow.push(";"); for(var f = _start; f < _env.FLOW[_inst].length; f+=4) { if(_env.FLOW[_inst][f+1] && _env.FLOW[_inst][f+1] == ":" /*&& (_env.FLOW[_inst][f+2] != "}" && _env.FLOW[_inst][f+2] != "," )*/ ) { if(_env.FLOW[_inst][f + 2] && isVariable(_env.FLOW[_inst][f + 2]).check) { if(_env.LAMBDA[_env.FLOW[_inst][f + 2]]) { var _l = _env.LAMBDA[_env.FLOW[_inst][f + 2]]; for(var i = 0; i < _l.env.FLOW.length; i) { i = verifyFlow(_l.env.AST[i], _l.env.FLOW[i], i, _l.env.FLOW, _l.env); } for(var j = 0; j < _l.env.FLOW.length; j++) { newFlow.push( _l.env.FLOW[j].join(" ") ); } } else if(!varExists(_env.FLOW[_inst][f + 2], _env)) { error(`[!] Variable or token undefined: ${_env.FLOW[_inst][f + 2]} line:${_env.MAP[_inst][f+2].line + 1} position:${_env.MAP[_inst][f+2].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][f+2].line]}`); } } // OK if(_env.FLOW[_inst][f + 2] && _env.FLOW[_inst][f + 2] == "{") { if(isVariable(_env.FLOW[_inst][f]).check) { _var.push("[\"" + _env.FLOW[_inst][f] + "\"]"); newFlow.push(_var.join("") + " = new NerdCore::Class::Object();"); } else { _var.push("[" + _env.FLOW[_inst][f] + "]"); newFlow.push(_var.join("") + " = new NerdCore::Class::Object();"); } if(_env.FLOW[_inst][f + 3] != ",") { f--; } } else if(_env.FLOW[_inst][f + 2] && _env.FLOW[_inst][f + 2] == "[") { if(isVariable(_env.FLOW[_inst][f]).check) { _var.push("[\"" + _env.FLOW[_inst][f] + "\"]"); newFlow.push(_var.join("") + " = new NerdCore::Class::Array();"); } else { _var.push("[" + _env.FLOW[_inst][f] + "]"); newFlow.push(_var.join("") + " = new NerdCore::Class::Array();"); } var _endArray = -1; var _count = 0; for(var indArray = f+2; indArray < _env.FLOW[_inst].length - 1; indArray++) { if(_env.FLOW[_inst][indArray] == "[") { _count++; } else if(_env.FLOW[_inst][indArray] == "]") { _count--; if(_count == 0) { _endArray = indArray; break; } } } if(_endArray > -1) { var _virtualFlow = _env.FLOW[_inst].slice(f+2, _endArray + 1 ); var _newFlowArray = {LAMBDA: _env.LAMBDA, FLOW:[[]]}; forgeArray(_var.join(""), _virtualFlow, 1, 0, _newFlowArray, true) newFlow.push(_newFlowArray.FLOW[0].join("")); } if(_env.FLOW[_inst][f + 3] != ",") { f--; } } else { if(isVariable(_env.FLOW[_inst][f]).check) { newFlow.push(_var.join("") + "[\"" + _env.FLOW[_inst][f] + "\"] = " + _env.FLOW[_inst][f + 2] + ";"); } else newFlow.push(_var.join("") + "[" + _env.FLOW[_inst][f] + "] = " + _env.FLOW[_inst][f + 2] + ";"); } } else { if(_env.FLOW[_inst][f] == "}" || _env.FLOW[_inst][f] == ",") { if(_env.FLOW[_inst][f] == "}") { _var.pop(); } f-=3; } } } _env.FLOW[_inst] = newFlow; } var checkCalls = function(_eq, _flow, _inst, _env) { var _par = -1; while(_par < _flow.length) { if(_flow[_par] == "(") { var _finished = false; var _par = _eq; while(!_finished) { var _args = getFunctionArgs(_flow.slice(_par), true, _env, _inst, true); while(_par < _flow.length) { if(_flow[_par] == "(") { break; } else if(_par == _flow.length - 1) { _finished = true; } _par++; } if(_flow[_par]) { _flow[_par] = _flow[_par] + _args["this"]; if(_args.args.length > 0) { _flow[_par] += ","; } while(_flow[_par] != "(" && _par.length < _flow.length - 1) { _par++; } _par++; for(var a = 0; a < _args.args.length; a+=2) { if(isVariable(_args.args[a]).check && !varExists(_args.args[a], _env)) { error(`[!] Unknown variable or token: ${_args.args[a]} line:${_env.MAP[_inst][_eq + a].line + 1} position:${_env.MAP[_inst][_eq + a].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][_eq + a].line]}`); } } } else { _finished = true; } while(_flow[_par] == ")" || _flow[_par] == ",") { _par++; } while( (_flow[_par] == ")" || _flow[_par] == "," || _flow[_par+1] == "," || _flow[_par+1] == ")") && _par < _flow.length) { if(_flow[_par] == ")" || _flow[_par] == ",") { _par++; } else { _par += 2; } } } return _inst + 1; } /* else if(_flow[_eq] == "=") { if(_flow[_eq + 1] == "{") { forgeObject( _left, _flow, _eq + 2, _inst, _env); } else if(_flow[_eq + 1] == "[") { forgeArray( _left, _flow, _eq + 2, _inst, _env) } else if(_flow[_eq + 1] == "[]") { forgeArray( _left, _flow, _eq + 2, _inst, _env); } else if(_flow[_eq + 1] == "function") { var _newFlow = _flow.slice(0, _eq + 1).concat(["__NERD_Create_Var_Scoped_Copy_Anon", "({"]); var _args = getFunctionArgs(_flow, false, _env, _inst); nextScope(_env); addLogical("FUNCTION", _env); _scope[_inst] = _newFlow; var item = 0; for(var a = 0; a < _args.args.length; a+=2) { addVar(_args.args[a], _env, 4, _inst); _scope[_inst] = _scope[_inst].concat(["var", _args.args[a], ";", "if", "(", "__NERD_VARLENGTH", ">", item,")", _args.args[a], "=", `__NERD_VARARGS[${item}];`]); item++; } verifyExpression(_flow.slice(_eq + 1), _inst, _env); } //return _inst + 1; } /* else if(_flow[_eq] == "exit") { error(`[!] Invalid use of exit: ${_flow[eq]} line:${_env.MAP[_inst][eq].line + 1} position:${_env.MAP[_inst][eq].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][eq].line]}`); } */ /* else if(_flow[_eq] == "require") { var _args = getFunctionArgs(_flow, true, _env); if(_args.length < 1) { error(`[!] Missing file parameter: ${_flow[eq]} line:${_env.MAP[_inst][eq].line + 1} position:${_env.MAP[_inst][eq].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][eq].line]}`); } verifyExpression(_flow.slice(_eq), _inst, _env); var _required = genRequire(COMPILER.PATH, _args[0].slice(1, _args[0].length - 1), _env); if(_required.add) { COMPILER.DECL += _required.code; } _scope[_inst] = []; _scope[_inst].push(_required.module); _scope[_inst].push(";"); } */ _par++; } } function verifyFlow(_ast, _flow, _inst, _scope, _env, _main) { if(_ast.length < 1) { return _inst + 1; } for(var z = 0; z < _flow.length; z++) { if(_flow[z] == ".") { _scope[_inst] = _scope[_inst].slice(0, z-1); _scope[_inst].push(_flow[z-1]); for(var v = z; v < _flow.length; v++) { if(_flow[v] == ".") { _scope[_inst].push("["); _scope[_inst].push("\"" + _flow[v+1] + "\""); _scope[_inst].push("]"); v++; } else { _scope[_inst].push(_flow[v]); } } break; } } _flow = _scope[_inst]; for(var i = 0; i < _flow.length; i++) { if(_flow[i] == "this") { _flow[i] = "__NERD_THIS"; } } var _next; if(_scope[_inst+1] && _scope[_inst+1][0]) { _next = _scope[_inst+1][0]; } var _logicalError = checkLogicalState(_ast[0], _next, _env, _ast); if(_logicalError.error) { error(`[!] ${_logicalError.message}: ${_flow[0]} line:${_env.MAP[_inst][0].line + 1} position:${_env.MAP[_inst][0].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][0].line]}`); } switch(_flow[0]) { case "var": if(RESERVED.indexOf(_flow[1]) > -1) { error(`[!] ${_flow[1]} is a reserved keyword: ${_flow[1]} line:${_env.MAP[_inst][1].line + 1} position:${_env.MAP[_inst][1].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][1].line]}`); } if(_flow[2] != "=") { addVar(_flow[1], _env); return _inst + 1; } else if(_flow[2] == "=") { var _existsVar = checkVarExists(_flow[1], _env, _flow); if(_existsVar.error) { error(`[!] ${_existsVar.message}: line:${_env.MAP[_inst][1].line + 1} position:${_env.MAP[_inst][1].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][1].line]}`); } if(_flow[3] == "function") { var _newFlow = [_flow[0], _flow[1], _flow[2], "__NERD_Create_Var_Scoped_Copy_Anon_With_Ref", "(" + _flow[1] + ",{"]; var _args = getFunctionArgs(_flow, false, _env, _inst); addVar(_flow[1], _env, 1, _inst); nextScope(_env); addLogical("FUNCTION", _env); _scope[_inst] = _newFlow; var item = 0; for(var a = 0; a < _args.args.length; a+=2) { addVar(_args.args[a], _env, 5, _inst); _scope[_inst] = _scope[_inst].concat(["var", _args.args[a], ";", "if", "(", "__NERD_VARLENGTH", ">", item,")", _args.args[a], "=", `__NERD_VARARGS[${item}];`]); item++; } //verifyExpression(_flow.slice(6), _inst, _env); return _inst + 1; } else if(_flow[3] == "[" ) { addVar(_flow[1], _env); forgeArray(_flow[1], _flow, 4, _inst, _env); return _inst + 1; } else if(_flow[3] == "{}") { addVar(_flow[1], _env); forgeObject(_flow[1], _flow, 4, _inst, _env); return _inst + 1; } else if(_flow[3] == "{") { addVar(_flow[1], _env); forgeObject(_flow[1], _flow, 4, _inst, _env); return _inst + 1; } else if(_flow[3] == "exit") { error(`[!] Invalid use of exit: line:${_env.MAP[_inst][eq].line + 1} position:${_env.MAP[_inst][eq].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][eq].line]}`); } else if(_flow[3] == "require") { addVar(_flow[1], _env); verifyExpression(_flow.slice(3), _inst, _env); var _args = getFunctionArgs(_flow, true, _env, _inst); if(_args.args.length != 1) { error(`[!] Invalid number of parameter, only one required: ${_flow[3]} line:${_env.MAP[_inst][3].line + 1} position:${_env.MAP[_inst][3].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][3].line]}`); } var _required = genRequire(COMPILER.PATH, _args.args[0].slice(1, _args.args[0].length - 1), _env, _flow[1]); if(_required.add) { COMPILER.DECL += _required.code; } _scope[_inst] = _flow.slice(0, 3); _scope[_inst].push(_required.module); _scope[_inst].push(";"); } else { addVar(_flow[1], _env); verifyExpression(_flow.slice(3), _inst, _env); if(_flow[3] != "arguments") { checkCalls(3, _flow, _inst, _env); } } return _inst + 1; } break; nextScope(_env); break; case "}": if(getLogical(_env).FUNCTION) { _scope[_inst] = ["return NerdCore::Global::null;"].concat(_flow).concat([")", ";"]); removeLogical("FUNCTION", _env); } if(_scope[_inst - 1] && (_scope[_inst - 1][0] == "case" || _scope[_inst - 1][0] == "default")) { _scope[_inst - 1].push("break;"); _env.SWITCH_MAP.pop(); } popScope(_env); break; case "exit": verifyExpression(_flow.slice(1), _inst, _env); var _args = getFunctionArgs(_flow, true, _env, _inst); if(_args.args.length < 1) { error(`[!] Invalid number of parameter, only one required: ${_flow[3]} line:${_env.MAP[_inst][3].line + 1} position:${_env.MAP[_inst][3].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][3].line]}`); } break; case "require": var _args = getFunctionArgs(_flow, true, _env, _inst); if(_args.args.length < 1) { error(`[!] Missing file parameter: ${_flow[3]} line:${_env.MAP[_inst][3].line + 1} position:${_env.MAP[_inst][3].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][3].line]}`); } verifyExpression(_flow.slice(1), _inst, _env); var _required = genRequire(COMPILER.PATH, _args.args[0].slice(1, _args.args[0].length - 1), _env, _flow[0]); if(_required.add) { COMPILER.DECL += _required.code; } _scope[_inst] = []; _scope[_inst].push(_required.module); _scope[_inst].push(";"); break; /* case "function": var _hoisting = []; var _bracketState = 0; var _end = -1; for(var s = _inst; s < _scope.length; s++) { for(var b = i; b < _scope[s].length; b++) { if(_scope[s][b] == "{") { _bracketState++; } else if(_scope[s][b] == "}") { _bracketState--; if(_bracketState == 0) { _end = s+1; break; } } } if(s > -1) { break; } } _hoisting = _hoisting.concat(_scope.slice(0, _inst), _scope.slice(_end)); var _newScope = [].concat(_scope.slice(0, _inst), _scope.slice(_end)); _env.FLOW = _env.FLOW.slice(0, _inst).concat(_env.FLOW.slice(_end)); _env.AST = _env.AST.slice(0, _inst).concat(_env.AST.slice(_end)); return _inst; break; */ case "define": _scope[_inst] = []; if(_flow[2] == "__NERD_Multi_Line_Quote") { COMPILER.DECL += "\n" + _flow[4].slice(1, _flow[4].length -1) + "\n"; } else COMPILER.DECL += "\n" + _flow[2].slice(1, _flow[2].length - 1) + "\n"; return _inst + 1; break; case "include": _scope[_inst] = [""]; if(_flow[2][1] == "<") { COMPILER.INCLUDE += "#include " + _flow[2].slice(1, _flow[2].length - 1) + "\n"; } else { var _toInclude = _flow[2].slice(1, _flow[2].length - 1); var _pathToInclude = path.resolve(path.join( _env.PATH, _toInclude)); if(fs.existsSync(_pathToInclude)) { COMPILER.INCLUDE += "#include \"" + _pathToInclude + "\"\n" } else COMPILER.INCLUDE += "#include " + _flow[2] + "\n"; } return _inst + 1; break; case "for": if(_flow[2] == "auto") { break; }; nextScope(_env); var _for = _flow.slice(2); if(_flow[4] == "in") { addVar(_flow[3], _env); var _functionID = "__NERD_IT_FUNC_" + Math.random().toString(36).slice(2, 12); var _iterator = _for.slice(3, 4); verifyExpression(_iterator, _inst, _env); _scope[_inst] = [ "var", _functionID, "=", "function", "(", _for[1], ")", "{", ]; var _nextScope = [ "{{if(" + _iterator[0] + ".type == NerdCore::Enum::Type::Object){ for(auto __NERD_ITERATOR = ((NerdCore::Class::Object*)" + _iterator[0] + ".data.ptr)->object.begin(); __NERD_ITERATOR != ((NerdCore::Class::Object*)" + _iterator[0] + ".data.ptr)->object.end(); ++__NERD_ITERATOR) {if(__NERD_ITERATOR->first.compare(\"__proto__\") != 0) {var " + _for[1] + " = __NERD_ITERATOR->first;" + _functionID + "(null," + _for[1] + ");}}}else if(" + _iterator[0] + ".type == NerdCore::Enum::Type::Array){for(std::size_t __NERD_ITERATOR = 0; __NERD_ITERATOR < ((NerdCore::Class::Array*)" + _iterator[0] + ".data.ptr)->value.size(); __NERD_ITERATOR++) {" + _functionID + "(null,__NERD_ITERATOR);}}else if(" + _iterator[0] + ".type == NerdCore::Enum::Type::String){for(std::size_t __NERD_ITERATOR = 0; __NERD_ITERATOR < ((NerdCore::Class::String*)" + _iterator[0] + ".data.ptr)->value.length(); __NERD_ITERATOR++) {var " + _for[1] + " = __NERD_ITERATOR;" + _functionID + "(null," + _for[1] + ");}}}}", ]; var sIndex = 1; var endOfScope = 0; for(var f = _inst+1; f < _scope.length; f++) { endOfScope = f; if(_scope[f][_scope[f].length - 1] == "}") { sIndex--; } if(sIndex == 0) { break; } } _env.FLOW.splice(endOfScope+1, 0, _nextScope); _env.AST.splice(endOfScope+1, 0, ["NATIVE"]); return _inst; } var _firstComa = _for.indexOf(";"); var _init = _for.slice(0, _firstComa); _for = _for.slice(_firstComa + 1); var _secondComa = _for.indexOf(";"); var _loop = _for.slice(0, _secondComa); var _it = _for.slice(_secondComa + 1, _for.length - 2); if(_init[0] == "var") { addVar(_init[1], _env); } else { verifyExpression(_init, _inst, _env); } verifyExpression(_loop, _inst, _env); verifyExpression(_it, _inst, _env); return _inst + 1; break; case "if": verifyExpression(_flow.slice(2, _flow.length - 2), _inst, _env); addLogical("IF", _env); nextScope(_env); return _inst + 1; break; case "else": if(!getLogical(_env).IF) { error(`[!] Use if before else/else if: ${_flow[0]} line:${_env.MAP[_inst][0].line + 1} position:${_env.MAP[_inst][0].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][0].line]}`); } if(_flow[1] && _flow[1] == "if") { verifyExpression(_flow.slice(3, _flow.length - 2), _inst, _env); nextScope(_env); } else { nextScope(_env); } return _inst + 1; break; case "do": addLogical("DO", _env); nextScope(_env); return _inst + 1; break; case "while": verifyExpression(_flow.slice(2, _flow.length - 2), _inst, _env); if(getLogical(_env).DO) { removeLogical("DO", _env); } else { nextScope(_env); } return _inst + 1; break; case ";": break; case "try": addLogical("TRY", _env); nextScope(_env); return _inst + 1; break; case "catch": _scope[_inst][2] = "var " + _scope[_inst][2]; if(getLogical(_env).TRY) { removeLogical("TRY", _env); } else { error(`[!] Missing try statement before catch: ${_flow[0]} line:${_env.MAP[_inst][0].line + 1} position:${_env.MAP[_inst][0].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][0].line]}`); } nextScope(_env); return _inst + 1; break; case "return": if(_flow[1] == "{") { var _returnVar = "__NERD_RETURN_" + _env.MAP[_inst][0].line; _env.FLOW[_inst] = ["var", _returnVar, "="].concat(_env.FLOW[_inst].slice(1)); forgeObject(_returnVar, _flow, 4, _inst, _env); _env.FLOW[_inst].push("return"); _env.FLOW[_inst].push(" "); _env.FLOW[_inst].push(_returnVar); _env.FLOW[_inst].push(";"); } else if(_flow[1] == ";") { _flow[1] = "null;"; } else { verifyExpression(_flow.slice(1), _inst, _env); if(_ast[1] != "VARIABLE" && _ast[1] != "EXPRESSION") { _flow[1] = "var(" + _flow[1] + ")"; } } return _inst + 1; break; case "switch": nextScope(_env); var _current = _flow[2]; if(isString(_current).check || isBoolean(_current).check || isNumber(_current).check) { _current = "var(" + _current + ")"; } _env.SWITCH_MAP.push(_current); _scope[_inst] = ["if", "(", "false", ")", "{"]; //_scope[_inst] = ["var", "__NERD_TEST", "=", _flow[2], ";"]; break; case "case": if(_env.SWITCH_MAP.length < 1) { error("[!] case without switch"); } if(_scope[_inst-1] && (!_scope[_inst-1][0] || (_scope[_inst-1][0] && (_scope[_inst-1][0] != "case")))) { _scope[_inst-1].push("}"); } var _current = _flow[1]; if(isString(_current).check || isBoolean(_current).check || isNumber(_current).check) { _current = "var(" + _current + ")"; } _scope[_inst] = ["else", "if", "(", _current, "==", _env.SWITCH_MAP[_env.SWITCH_MAP.length - 1]]; while(_scope[_inst+1] && _scope[_inst+1][0] && _scope[_inst+1][0] == "case") { _scope[_inst].push(" || "); if(isString(_scope[_inst+1][0]).check || isBoolean(_scope[_inst+1][0]).check || isNumber(_scope[_inst+1][0]).check) { _scope[_inst].push("var"); _scope[_inst].push("("); _scope[_inst].push(_scope[_inst+1][1]); _scope[_inst].push(")"); } else { _scope[_inst].push(_scope[_inst+1][1]); } _scope[_inst].push("=="); _scope[_inst].push(_env.SWITCH_MAP[_env.SWITCH_MAP.length - 1]); _scope[_inst+1] = []; _inst++; } _scope[_inst].push(")"); _scope[_inst].push("{"); break; case "default": if(_scope[_inst-1] && (!_scope[_inst-1][0] || (_scope[_inst-1][0] && (_scope[_inst-1][0] != "case")))) { _scope[_inst-1].push("}"); } _scope[_inst] = ["else", "{"]; break; case "break": _scope[_inst] = []; break; case "true": case "false": case "new": break; case "this": _flow[0] = "__NERD_THIS"; break; default: if(varExists(_flow[0], _env)) { /* if(!CLI.cli["--env"] || CLI.cli["--env"].argument != "js") { if(_flow[0][0] == "_" && _flow[1] && _flow[1] == "=") { error(`[!] Cannot reassign value to constant: ${_flow[0]} line:${_env.MAP[_inst][0].line + 1} position:${_env.MAP[_inst][0].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][0].line]}`); } } */ if(_flow[1]) { for(var i = 0; i < _flow.length - 1; i++) { if(_flow[i] == "require") { verifyExpression(_flow.slice(i), _inst, _env); var _args = getFunctionArgs(_flow, true, _env, _inst); if(_args.args.length != 1) { error(`[!] Invalid number of parameter, only one required: ${_flow[3]} line:${_env.MAP[_inst][3].line + 1} position:${_env.MAP[_inst][3].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][3].line]}`); } var _required = genRequire(COMPILER.PATH, _args.args[0].slice(1, _args.args[0].length - 1), _env); if(_required.add) { COMPILER.DECL += _required.code; } _scope[_inst] = _flow.slice(0, i); _scope[_inst].push(_required.module); _scope[_inst].push(";"); break; } } var _eq = -1; while(_eq < _flow.length) { for(var e = _eq; e < _flow.length; e++) { if(_flow[e] == "=") { _eq = e; break; } } var _left = _flow.slice(0, _eq).join(" "); if(_flow[_eq] == "=") { if(_flow[_eq + 1] == "{") { forgeObject( _left, _flow, _eq + 2, _inst, _env); } else if(_flow[_eq + 1] == "[") { forgeArray( _left, _flow, _eq + 2, _inst, _env) } else if(_flow[_eq + 1] == "[]") { forgeArray( _left, _flow, _eq + 2, _inst, _env); } else if(_flow[_eq + 1] == "function") { var _newFlow = _flow.slice(0, _eq + 1).concat(["__NERD_Create_Var_Scoped_Copy_Anon", "({"]); var _args = getFunctionArgs(_flow, false, _env, _inst); nextScope(_env); addLogical("FUNCTION", _env); _scope[_inst] = _newFlow; var item = 0; for(var a = 0; a < _args.args.length; a+=2) { addVar(_args.args[a], _env, 4, _inst); _scope[_inst] = _scope[_inst].concat(["var", _args.args[a], ";", "if", "(", "__NERD_VARLENGTH", ">", item,")", _args.args[a], "=", `__NERD_VARARGS[${item}];`]); item++; } verifyExpression(_flow.slice(_eq + 1), _inst, _env); } break; //return _inst + 1; } _eq++; } if(_eq == _flow.length) { _eq = 0; } else { _eq++; } checkCalls(_eq, _flow, _inst, _env); } } else if(_ast[0] == "NATIVE") { // nothing to do } else { error(`[!] Unknown variable or token: ${_flow[0]} line:${_env.MAP[_inst][0].line + 1} position:${_env.MAP[_inst][0].position}${os.EOL}=> ${array_of_code[_env.MAP[_inst][0].line]}`); } break; } verifyExpression(_flow, _inst, _env); return _inst+1; } module.exports = verifyFlow; ================================================ FILE: self/nerd.js ================================================ /* Copyright (c) 2021 NerdLang - Adrien THIERRY and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ global.fs = require("fs"); global.os = require("os"); global.path = require("path"); global.process = require("process"); global.child_process = require("child_process"); global.execSync = global.child_process.execSync; global.PACKAGE = JSON.parse(global.fs.readFileSync(global.path.join(__dirname, "package.json"))); global.VERSION = global.PACKAGE.version; global.extern = global.path.join(__dirname, "external"); /* var parseCLI = require("./base/cli/cliParser.js"); var getExt = require("./base/util/getExt.js"); var getTips = require("./base/util/getTips.js"); var Flash = require("./base/util/flash.js"); global.rmdir = require("./base/util/rmdir.js"); global.copyRecursiveSync = require("./base/util/copyRecursive.js"); global.copyDirSync = require("./base/util/copyDirSync.js"); var CURRENT = global.process.cwd(); var TARGET = require("./base/compiler/target.js"); global.PLATFORM = os.platform(); global.ARCH = os.arch(); global.COMPILER = {}; global.NERD_PATH = __dirname; var DEFAULT_COMPILER = "native"; global.CLI = parseCLI(process.argv); if(global.CLI.error) { console.log(global.CLI.msg); return 1; } require("./lib/env.js"); global.parseCode = require("./lib/parser.js"); global.verifyFlow = require("./lib/verify.js"); global.CONFIGPATH = os.homedir() + path.sep + ".nerd"; global.CONFIGFILE = CONFIGPATH + "/" + "nerd.json"; global.CONFIG = {}; var ACTION = "build"; if(global.CLI.cli["--help"] || global.CLI.cli["-h"]) ACTION = "help"; else if(global.CLI.cli["--example"] || global.CLI.cli["--examples"]) ACTION = "example"; else if(global.CLI.cli["--version"] || global.CLI.cli["-v"]) ACTION = "version"; else if(global.CLI.cli["--project"]) ACTION = "showproject"; else if(global.CLI.cli["--clean"] || global.CLI.cli["--purge"]) ACTION = "clean"; else if(global.CLI.cli["--setauthor"] || global.CLI.cli["--setid"] || global.CLI.cli["--setkey"] || global.CLI.cli["--sethash"] || global.CLI.cli["--setsdk"] || global.CLI.cli["--setndk"] || global.CLI.cli["--setwin_inc_ucrt"] || global.CLI.cli["--setwin_lib_ucrt"] || global.CLI.cli["--setwin_lib_um"] || global.CLI.cli["--setapi"] || global.CLI.cli["--setport"] || global.CLI.cli["--setxcode"]) ACTION = "setconfig"; else if(global.CLI.cli["--config"]) ACTION = "showconfig"; else if(global.CLI.cli["--reinit"]) ACTION = "reinitconfig"; var getExampleFiles = function(dir, list) { if(!list) { list = []; } var files = fs.readdirSync(dir); for (var i in files) { var name = dir + path.sep + files[i]; if (fs.statSync(name).isDirectory()) { getExampleFiles(name, list); } else { list.push(name); } } return list; } var copyExample = function() { var folder = ["c"]; var list = getExampleFiles(path.join(__dirname, "example")); for(var l in list) { var name = list[l].split(path.sep); if(name[name.length - 2] && folder.indexOf(name[name.length - 2]) > -1) { try { fs.mkdirSync(name[name.length - 2]); }catch(e){} name = name[name.length - 2] + "/" + name[name.length - 1]; } else name = name[name.length - 1]; var content = fs.readFileSync(list[l]); fs.writeFileSync(name, content); console.log("[+] Copy of " + name + " done"); } } var Init = function() { if(!fs.existsSync(CONFIGPATH)) fs.mkdirSync(CONFIGPATH); try { var writeConfig = false; var config = ""; config = fs.readFileSync(CONFIGFILE); config = JSON.parse(config); if(!config.version) { config.version = VERSION; config.port = 443; fs.writeFileSync(CONFIGFILE, JSON.stringify(config)); } } catch (e) { writeConfig = true; } if(!config || writeConfig) { var defaultConfig = { author: os.userInfo().username, id: "", key:"", hash:"SHA256", api:"api.nerdlang.com", port:443, version: VERSION, sdk: "", ndk: "", win_inc_ucrt: "", win_lib_ucrt: "", win_lib_um: "", xcode: "/Applications/Xcode.app"}; fs.writeFileSync(CONFIGFILE, JSON.stringify(defaultConfig)); } } var readConfig = function() { try { var tmp = fs.readFileSync(CONFIGFILE); CONFIG = JSON.parse(tmp); } catch (e) { Init(); readConfig(); } } var showConfig = function(str) { console.log(); if(str) console.log(str); else console.log("[*] Current config :"); console.log("author : " + CONFIG.author); console.log("id : " + CONFIG.id); console.log("key : " + CONFIG.key); console.log("hash : " + CONFIG.hash); console.log("api : " + CONFIG.api); console.log("port : " + CONFIG.port); console.log("version : " + VERSION); console.log("Android SDK : " + CONFIG.sdk); console.log("Android NDK : " + CONFIG.ndk); console.log("Windows Include UCRT : " + CONFIG.win_inc_ucrt); console.log("Android Lib UCRT : " + CONFIG.win_lib_ucrt); console.log("Android Lib UM : " + CONFIG.win_lib_um); console.log("iOS xCode : " + CONFIG.xcode); console.log(); } var setConfig = function() { try { if(global.CLI.cli["--setauthor"]) CONFIG.author = global.CLI.cli["--setauthor"].argument; if(global.CLI.cli["--setid"]) CONFIG.id = global.CLI.cli["--setid"].argument; if(global.CLI.cli["--setkey"]) CONFIG.key = global.CLI.cli["--setkey"].argument; if(global.CLI.cli["--setapi"]) CONFIG.api = global.CLI.cli["--setapi"].argument; if(global.CLI.cli["--setport"]) CONFIG.port = parseInt(global.CLI.cli["--setport"].argument); //if(global.CLI.cli["--setsdk"]) CONFIG.sdk = global.CLI.cli["--setsdk"].argument.replace(/\\/g, "\\\\").replace(/:/g, "\\\:"); // for android //if(global.CLI.cli["--setndk"]) CONFIG.ndk = global.CLI.cli["--setndk"].argument.replace(/\\/g, "\\\\").replace(/:/g, "\\\:"); // for android if(global.CLI.cli["--setwin_ucrt"]) CONFIG.win_ucrt = global.CLI.cli["--setwin_ucrt"].argument; if(global.CLI.cli["--setwin_inc_ucrt"]) CONFIG.win_inc_ucrt = global.CLI.cli["--setwin_inc_ucrt"].argument; if(global.CLI.cli["--setwin_lib_ucrt"]) CONFIG.win_lib_ucrt = global.CLI.cli["--setwin_lib_ucrt"].argument; if(global.CLI.cli["--setwin_lib_um"]) CONFIG.win_lib_um = global.CLI.cli["--setwin_lib_um"].argument; if(global.CLI.cli["--setxcode"]) CONFIG.xcode = global.CLI.cli["--setxcode"].argument; if(global.CLI.cli["--sethash"]) { var hash = global.CLI.cli["--sethash"].argument.toUpperCase(); if(validHash.indexOf(hash) < 0) { console.dir("[!] Hash is not valid and won't be saved. Valid hash are : MD5, SHA256 ans SHA512"); } else { CONFIG.hash = hash; } } fs.writeFileSync(CONFIGFILE, JSON.stringify(CONFIG)); } catch (e) { console.log(e); } } var reinitConfig = function() { try { var defaultConfig = { author: os.userInfo().username, id: "", key:"", hash:"SHA256", api:"api.nerdlang.com", "port":443, sdk: "", ndk: "", win_inc_ucrt: "", win_lib_ucrt: "", win_lib_um: "", xcode: "/Applications/Xcode.app"}; fs.writeFileSync(CONFIGFILE, JSON.stringify(defaultConfig)); readConfig(); showConfig("[*] Config reinitialized :"); } catch (e) { console.log(e); } } var showProject = function() { var project = "project.json"; if(global.CLI.stack && global.CLI.stack.length > 0) { project = global.CLI.stack[global.CLI.stack.length - 1]; } try { var pConf = fs.readFileSync(project); var jConf = JSON.parse(pConf); printProject(jConf); } catch (e) { console.dir("[!] Error : " + e.message); } } var Clean = function(purge) { var project = "project.json"; if(global.CLI.stack && global.CLI.stack.length > 0) { project = global.CLI.stack[global.CLI.stack.length - 1]; } try { var pConf = fs.readFileSync(project); var jConf = JSON.parse(pConf); if(jConf.main) { if( (global.CLI.cli["--purge"] || purge) && jConf.out) { var outFile = jConf.out; if(jConf.out[0] != path.sep) { outFile = path.join(path.dirname(project), jConf.out); } try{fs.unlinkSync(outFile);}catch(e){} } } try { fs.unlinkSync(project); }catch(e){} } catch (e) { console.dir("[!] Error : " + e.message); } } var printProject = function(obj) { console.log(); console.log("[*] Project configuration :\n"); console.log("Main file : " + obj.main); console.log("Output : " + obj.out); console.log("Target : " + obj.target); console.log("Preset : " + obj.preset); console.log(); } var Build = function(prepare) { global.DEBUG = false; if(global.CLI.cli["--debug"]) { global.DEBUG = true; } if(global.CLI.cli["--build"]) DEFAULT_COMPILER = global.CLI.cli["--build"].argument; else if(global.CLI.cli["-b"]) DEFAULT_COMPILER = global.CLI.cli["-b"].argument; COMPILER = require(path.join(__dirname, "compiler", DEFAULT_COMPILER, "compiler.js")); if(global.CLI.cli["--compiler"] && global.CLI.cli["--compiler"].argument) COMPILER.COMPILER = global.CLI.cli["--compiler"].argument; else if(global.CLI.cli["-c"] && global.CLI.cli["-c"].argument) COMPILER.COMPILER = global.CLI.cli["-c"].argument; var preset; if(global.CLI.cli["--preset"] && global.CLI.cli["--preset"].argument) preset = global.CLI.cli["--preset"].argument; var env; if(global.CLI.cli["--env"] && global.CLI.cli["--env"].argument) env = global.CLI.cli["--env"].argument; if(!preset) preset = "speed"; COMPILER.preset = preset; if(!env) env = "std"; var target; if(global.CLI.cli["--target"] && global.CLI.cli["--target"].argument) target = global.CLI.cli["--target"].argument; COMPILER.TARGET = target; var spec; if(global.CLI.cli["--spec"] && global.CLI.cli["--spec"].argument) spec = global.CLI.cli["--spec"].argument; COMPILER.SPEC = spec; var _tmp; if(global.CLI.cli["--tmp"] && global.CLI.cli["--tmp"].argument) _tmp = path.resolve(global.CLI.cli["--tmp"].argument); else { var _current = process.cwd(); var _npath = path.join(_current, ".nerd"); _tmp = path.join(_npath, Math.random().toString(36).substr(2, 5)); } COMPILER.TMP_FOLDER = _tmp; if(!global.CLI.stack || global.CLI.stack.length < 1) { console.error("[!] Missing file to compile or project.json path, 'nerd --help' if you need help"); return; } else { var QUIET = false; var _in = global.CLI.stack[0]; var main; COMPILER.IN = _in; fs.readFile(_in, function(err, fileData) { if(err) { console.error("[!] Error : " + err.message); return; } else { Check(_in); var ext = "ng"; var _Ext = _in.split("."); if(_Ext.length > 1) ext = _Ext[_Ext.length - 1]; var _current = process.cwd(); var _npath = path.join(_current, ".nerd"); try { fs.mkdirSync(_npath); } catch(e){}; if(COMPILER.ENV.init) COMPILER.ENV.init(COMPILER.TMP_FOLDER); else try { fs.mkdirSync(COMPILER.TMP_FOLDER); } catch(e){}; var _libOut = COMPILER.TMP_FOLDER; if(COMPILER.ENV.prepare) { var _tmpLibOut = COMPILER.ENV.prepare(COMPILER.TMP_FOLDER); if(_tmpLibOut) _libOut = _tmpLibOut; } COMPILER.Prepare(_libOut); var fProject = false; var prjectConf = {}; if(path.basename(_in) == "project.json") { try { projectConf = JSON.parse(fileData); fProject = true; single = false; } catch (e) { console.error("[!] Error with project.json : " + e.message); return; } } var _binoutput = ""; if(fProject) { _binoutput = projectConf.out; } else _binoutput = path.basename(_in).slice(0, path.basename(_in).length - path.extname(_in).length); if(global.CLI.cli["-o"]) { _binoutput = global.CLI.cli["-o"].argument; } else if(global.CLI.cli["--out"]) { _binoutput = global.CLI.cli["--out"].argument; } _binoutput = path.join(process.cwd(), _binoutput); var _cout = path.join(COMPILER.TMP_FOLDER, path.basename(_in).slice(0, path.basename(_in).length - path.extname(_in).length) + ".cpp"); _binoutput = COMPILER.Out(_binoutput); var projTo = ""; var tmp = _in.split("/"); projTo = _binoutput; main = _in.split(path.sep); main = main[main.length - 1]; var tips = ""; if(!QUIET) console.log("[*] Generating source file"); var _code = fs.readFileSync(path.resolve(_in)).toString(); global.array_of_code = _code.split(os.EOL); _code = COMPILER.Parse(_code, _in); if(COMPILER.ENV.write) { COMPILER.ENV.write(COMPILER.MAIN, _cout); } else { if((!global.CLI.cli["--profile"]) || global.CLI.cli["--profile"].argument != "use") { fs.writeFileSync(_cout, COMPILER.MAIN); } } if(global.CLI.cli["--generate"]) { if(!QUIET) console.log("[*] Source generated in " + path.dirname(_cout)); process.exit(0); } if(!QUIET) console.log("[*] Compiling with preset: " + COMPILER.preset); try { COMPILER.Compile(COMPILER.TMP_FOLDER, _cout); } catch(e) { console.log(e); console.log("[!] Compilation error"); process.exit(1); } if(COMPILER.ENV.post) COMPILER.ENV.post(); try { fs.chmodSync(_binoutput, "755"); } catch(e){} if(COMPILER.Package) COMPILER.Package(); process.chdir(NERD_PATH); if(!global.CLI.cli["--conserve"]) { var _current = process.cwd(); process.chdir(_current); rmdir(COMPILER.TMP_FOLDER, function() {}); } var verb = false; if(global.CLI.cli["--verbose"]) verb = true; var bin; try { bin = fs.statSync(_binoutput); } catch(e){} if(COMPILER.ENV.clean && typeof(COMPILER.ENV.clean) == "function") { COMPILER.ENV.clean(); } if(verb && bin) { console.log("[+] Compilation done\n"); console.log("[*] Informations :\n"); var size = "Size : "; if(bin.size < 1000) size += bin.size + " o"; else if(bin.size < 1000000) size += (bin.size / 1000) + " ko"; else size += (bin.size / 1000000) + " mo"; console.log(size); console.log("Main file : " + main); console.log("Output : " + projTo); console.log("Preset : " + preset); } if(global.CLI.cli["--tips"] && tips && tips.length > 0) console.log("\n" + tips + "\n"); if(global.CLI.cli["--flash"]) Flash(projTo, global.CLI.cli["--flash"].argument, target, verb); if(global.CLI.cli["--run"]) { console.log(); console.log("[*] Executing " + _binoutput); if(!COMPILER.ENV.run) { var _binexec = child_process.spawnSync(_binoutput, [], { detached: false, stdio: [process.stdin, process.stdout, process.stderr], cwd: process.cwd(), env: process.env }); if(_binexec.error) { console.log(_binexec.error); } } else COMPILER.ENV.run(); } if(!global.CLI.cli["--prepare"]) { var _current = path.dirname(path.resolve(process.argv[1])); var _native = path.join(_current, "core", "nativejs"); var _to = path.resolve(projTo); var _fullPathCompile = path.resolve(main); } else { var pObj = { main: main, out:projTo, target:target, preset:preset }; printProject(pObj); } } }); } } var showVersion = function() { console.log("Nerd v" + VERSION); } var Check = function(file) { if(file.split(".").pop() != "js") return; if(global.CLI.cli["--check"]) process.exit(); } var Help = function() { showVersion(); console.log("\n[*] Compile :\nnerd [--env std|node|arduino|wasm|android] [--target the-target] [--run] [--reg 1000] [--preset speed|size] [-o output] [--tips] [--flash device] source.js|project.json\n"); console.log("[*] Show project :\nnerd [--project] [project.json]\n"); console.log("[*] Clean project :\nnerd [--clean] [--purge] [path_to_project.json]\n"); console.log("[*] Copy example files :\nnerd --example\n"); console.log("[*] Nerd version :\nnerd --version\n"); } switch(ACTION) { case "version": showVersion(); break; case "help": Help(); break; case "example": copyExample(); break; case "showproject": showProject(); break; case "setconfig": setConfig(); break; case "showconfig": showConfig(); break; case "reinitconfig": reinitConfig(); break; case "build": Build(); break; case "clean": Clean(); break; default: Help(); break; } */ ================================================ FILE: self/package.json ================================================ { "name": "nerdlang", "version": "0.0.16", "description": "NerdLang. Simple yet efficient.", "main": "nerd", "bin": { "nerd": "./nerd.js" }, "scripts": {}, "repository": { "type": "git", "url": "git+https://github.com/nerdlang/nerd.git" }, "keywords": [ "nerd", "nerdlang", "nerd-lang", "compilation", "crossplatform", "simple", "speed", "io", "iot", "socket", "android", "linux", "windows", "arduino", "raspberry", "stm32", "nucleo", "http", "https", "bytecode", "wasm", "arm", "arm64", "msbuild", "cl", "webserver", "webview" ], "author": "Adrien THIERRY (https://seraum.com)", "license": "MIT", "licenses": [ { "type": "MIT", "url": "https://github.com/nerdlang/nerd/blob/master/LICENSE" } ], "bugs": { "url": "https://github.com/nerdlang/nerd/issues" }, "homepage": "https://nerdlang.org", "dependencies": { } } ================================================ FILE: test/accessor.ng ================================================ var a = "abcdef"; var b = [0,1,2,3]; var c = { "zero": 0, "one": 1, }; var fn = function(_arg) { return _arg; }; fn(a[0]); fn(b[0]); fn(c["zero"]); ================================================ FILE: test/builtin.ng ================================================ var str = "abcdef"; var args = arguments(); var obj = { "1":1, "2":2, "3":3, } var length = length_of(str); var size = size_of(str); var sizeOfObj = size_of(obj); var lengthOfObj = length_of(obj); {{ std::cout << "length of('abcdef'): " << length << std::endl; std::cout << "size of('abcdef'): " << size << std::endl; std::cout << std::endl; std::cout << "lengthof(obj): " << lengthOfObj << std::endl; std::cout << "sizeof(obj): " << sizeOfObj << std::endl; }} ================================================ FILE: test/comments.ng ================================================ /* multiline comment */ // one line comment var a = "ok"; var fn = function() { /* Multiline comment */ // One line comment }; fn(); ================================================ FILE: test/conditionals.ng ================================================ var a = 0; if(a == 0) { } else if(a == 1) { } else { } ================================================ FILE: test/function.ng ================================================ var fn = function(_arg, a2, a3, a4) { var args = arguments(); for(var i = 0; i < length_of(args); i++) { {{ std::cout << args[i] << std::endl; }} } return { a: _arg, }; }; fn(); fn("a", "b", "c", "d", "e"); ================================================ FILE: test/loop.ng ================================================ for(var i = 0; i < 10; i++) { var a = i + 1; } var a = 3; while(a) { a--; } do { a++; }while(a < 3); ================================================ FILE: test/native.ng ================================================ var _cli = arguments(); for(var i = 0; i < length_of(_cli); i++) { {{ std::cout << i << " : " << _cli[i] << " - " << &_cli[i] << std::endl; }} } ================================================ FILE: test/var.ng ================================================ var a = 0; var b = 1.1; var c = "Hello"; var d = true; var e = false; var f = 1 < 1; var g = null; var h = function(){}; var i = function(arg, brg, crg) { return arg + 1; }; var j = []; var k = {}; var l = { a: "a", b: "b", } var m = [0,1,2,3,4]; m = [[]]; a = 1; b = 0; c = {}; d = []; e = { hello: "world" }; f = ["0", 1, "2"]; g = function(_arg) { return _arg++; }; a = g(1);